diff --git a/trunk/.gitignore b/trunk/.gitignore
new file mode 100644
index 0000000..a6d056f
--- /dev/null
+++ b/trunk/.gitignore
@@ -0,0 +1,7 @@
+*.class
+.DS_Store
+bin/
+target/
+*~
+.*sw?
+\#*
\ No newline at end of file
diff --git a/trunk/CHANGES.txt b/trunk/CHANGES.txt
new file mode 100644
index 0000000..991a087
--- /dev/null
+++ b/trunk/CHANGES.txt
@@ -0,0 +1,369 @@
+Apache ODF Toolkit Change Log
+=============================
+
+======= Release 0.6.1 =======
+
+The most notable changes in ODF Toolkit 0.6.1 incubating over previous release:
+* Make release 0.6 available in Maven repositories
+
+Release wiki page: https://cwiki.apache.org/confluence/display/ODFTOOLKIT/0.6.1-incubating
+
+Versions of major components
+----------------------------
+
+* Xerces 2.9.1 (http://xerces.apache.org/mirrors.cgi)
+* Apache Jena 2.9.4 (http://jena.apache.org/download/index.html)
+* Apache Commons Validator 1.4.0 (http://commons.apache.org/proper/commons-validator//download_validator.cgi)
+
+For a full dependecy list run mvn dependency:tree from the top level in the source module or see the release wiki page.
+
+Upgrading from 0.6-incubating
+-----------------------------
+
+The behaviour of CellSelection#replaceWith(String) has changed. If you are relying on the old behaviour use CellSelection#advancedReplaceWith(String) instead (see ODFTOOLKIT-362).
+
+Detailed Change List
+--------------------
+
+New Features
+------------
+
+* ODFTOOLKIT-358 Add method to set date time value on Cell (Florian Hopf)
+
+Optimizations
+-------------
+
+Bug Fixes
+---------
+
+* ODFTOOLKIT-355 NullPointerException when removing rows from a new Spreadsheet table (Florian Hopf)
+* ODFTOOLKIT-362 TextSelection.replaceWith() ends in an infinite loop (Florian Hopf)
+* ODFTOOLKIT-363 Table#appendRow() method creates a row without any cell (Florian Hopf)
+* ODFTOOLKIT-379 NullPointerException in Paragraph.getTextContent() (Florian Hopf, Patch by Marc Schreiber)
+
+Other
+-----
+
+* ODFTOOLKIT-365 Improve Release Process to easily publish releases with maven (Florian Hopf)
+
+The following people have contributed to ODF Toolkit 0.6.1 incubating by submitting or commenting on the issues resolved in this release, 
+or contributed via reported bugs/comments on the mailing list:
+
+Nick Burch (mentor)
+Yegor Kozlov (mentor)
+Dali Liu (committer)
+Devin Han (committer)
+Donald Harbison (committer)
+Florian Hopf (committer)
+Oliver Rau (committer)
+Rob Weir (committer)
+Svante Schubert (committer)
+Alain Fagot Béarez 
+Alexandr Klimov
+Andy Jefferson
+Anders Sjostrom
+Ashok Hariharan
+Charitha Madusanka
+Dani Prieto 
+Dave Fisher
+Dennis E. Hamilton 
+Gavin McDonald
+Graham Weatherup
+Ian Cunningham
+Jeremias Maerki
+Johnny Haugen Sorgard
+Jörg Büsse
+Kejia Ye
+Lars Moller 
+Pavel Jisl
+Philip Helger
+Peter Junge
+Marc Schreiber
+Mathias Silbermann 
+Michael Stahl
+Michan Jaskurzyński
+Nick de Graeve
+Noah Tilton
+Romain Benefice
+Steele, Raymond
+Stefan Renz
+Steffen Börsig
+Sherzod Muratov
+Svante Schubert
+Tao Lin
+Torsten Krah 
+Vicente Villegas Larios
+
+======= Release 0.6 incubating =======
+
+The most notable changes in ODF Toolkit 0.6 incubating over previous release:
+* Added document encryption support
+* Added metadata support
+* Support for OpenDocument-v1.2
+* Additional APIs for Simple API
+
+Release wiki page: https://cwiki.apache.org/confluence/display/ODFTOOLKIT/0.6-incubating
+
+Versions of major components
+----------------------------
+
+* Xerces 2.9.1 (http://xerces.apache.org/mirrors.cgi)
+* Apache Jena 2.9.4 (http://jena.apache.org/download/index.html)
+* Apache Clerezza 0.1-incubating (http://incubator.apache.org/clerezza/downloads/)
+* Apache Commons Validator 1.4.0 (http://commons.apache.org/proper/commons-validator//download_validator.cgi)
+
+For a full dependecy list run mvn dependency:tree from the top level in the source module or see the release wiki page.
+
+Upgrading from 0.5-incubating
+-----------------------------
+
+There are no known API changes.
+
+Detailed Change List
+--------------------
+
+New Features
+------------
+
+* ODFTOOLKIT-319 Document encryption support (Devin Han, Rob Weir, DaLi Liu)
+* ODFTOOLKIT-50 Add ODF 1.2 RDF metadata support (Tao Lin, Svante Schubert, DaLi Liu)
+* ODFTOOLKIT-346 New API to create protected section in TextDocument to protect contents (DaLi Liu, Patch by Kejia Ye)
+* ODFTOOLKIT-340 New API to insert form controls into document (DaLi Liu, Patch by Kejia Ye)
+* ODFTOOLKIT-339 new methods in TextDocument to suport insert a document into an open document (DaLi Liu)
+* ODFTOOLKIT-330 Improve the method TextSelection.replaceWith(String). new param types support (DaLi Liu)
+* ODFTOOLKIT-334 New API to support table autoformat (DaLi Liu, Patch by Kejia Ye)
+* ODFTOOLKIT-336 New APIs to set page style when inserting page break in TextDocument (DaLi Liu, Patch by Kejia Ye)
+* ODFTOOLKIT-329 New Simple API to generate a table of content in text document (Rob Weir, Patch by DaLi Liu)
+* ODFTOOLKIT-305 Update ODF 1.2 schema to OpenDocument-v1.2 final version (Devin Han)
+* ODFTOOLKIT-307 Update ODF Validator to support ODF 1.2 final version (Devin Han)
+* ODFTOOLKIT-306 Update Taglets to support ODF 1.2 final version. (Devin Han)
+* ODFTOOLKIT-199 Supply signature and manifest features to code generator plugin (Devin Han)
+
+Optimizations
+-------------
+
+Bug Fixes
+---------
+
+* ODFTOOLKIT-324 Simple ODF is throwing an exception on alien elements (Florian Hopf)
+* ODFTOOLKIT-325 Spreadsheet : Call to cell.getTimeValue on cell marked as valueType TIME but no value set gives NPE (Florian Hopf)
+* ODFTOOLKIT-338 The Value of VariableField always is "" when try to get a VariableField instance by TextDocument.getVariableFieldByName(String) (DaLi Liu)
+* ODFTOOLKIT-326 NPE when setting default background in TextCellProperties (Rob Weir, Patch by Florian Hopf)
+* ODFTOOLKIT-341 newImage() generates java.lang.NullPointerException when using an svg image (Rob Weir, Patch by Anders Sjöström)
+* ODFTOOLKIT-327 java.lang.NullPointerException at org.odftoolkit.odfdom.pkg.OdfPackage.logValidationError(OdfPackage.java:2028) (Rob Weir, Patch by Florian Hopf)
+* ODFTOOLKIT-331 AbstractListContainer.getListIterator() doesn't include all lists (Rob Weir, Patch by Nick de Graeve)
+* ODFTOOLKIT-302 getNamespaceURI() implementation in ODFDOM is not aware of duplicate namespace prefixes (Svante Schubert, Patch by Ashok Hariharan)
+* ODFTOOLKIT-311 TextExtractor uses wrong new line character (Oliver Rau)
+
+Other
+-----
+
+* ODFTOOLKIT-342 MetaDocumentStatisticTest sometimes fails (Florian Hopf)
+* ODFTOOLKIT-318 Build of validator with Maven 3.0.4 (Svante Schubert)
+* Correct the link for Simple API Cookbook (Rob Weir, patch by noahktilton)
+* ODFTOOLKIT-190 Improvement of XPath Tests (Svante Schubert)
+* ODFTOOLKIT-299 Build with JDK 7 as well as Earlier versions (Svante Schubert, Patch by Dennis E. Hamilton)
+* ODFTOOLKIT-312 Better exception handling for OdfPackage (Svante Schubert, Patch by Jeremias Maerki)
+
+
+The following people have contributed to ODF Toolkit 0.6 incubating by submitting or commenting on the issues resolved in this release, 
+or contributed via reported bugs/comments on the mailing list:
+
+Nick Burch (mentor)
+Yegor Kozlov (mentor)
+Dali Liu (committer)
+Devin Han (committer)
+Donald Harbison (committer)
+Florian Hopf (committer)
+Oliver Rau (committer)
+Rob Weir (committer)
+Svante Schubert (committer)
+Andy Jefferson
+Anders Sjostrom
+Ashok Hariharan
+Charitha Madusanka
+Dani Prieto 
+Dave Fisher
+Dennis E. Hamilton 
+Gavin McDonald
+Graham Weatherup
+Ian Cunningham
+Jeremias Maerki
+Johnny Haugen Sorgard
+Kejia Ye
+Lars Moller 
+Pavel Jisl
+Philip Helger
+Peter Junge
+Marc Schreiber
+Mathias Silbermann 
+Michael Stahl
+Michan Jaskurzyński
+Nick de Graeve
+Noah Tilton
+Romain Benefice
+Steele, Raymond
+Stefan Renz
+Sherzod Muratov
+Svante Schubert
+Tao Lin
+Torsten Krah 
+Vicente Villegas Larios
+
+======= Release 0.5 incubating =======
+
+The most notable changes in ODF Toolkit 0.5 incubating over previous releases in ODF Toolkit Union are:
+ * All of the sub-projects release with an all in one package.
+ * Mark ODFDOM DOC API's as "deprecated", will be replaced by Simple API in future.
+ * Some bugs fixed.
+
+New Features
+------------
+
+* ODFTOOLKIT-287 PraragraphProperties should contain methods for margins and text indention.[Developer:Oliver Rau,Devin;Reviewer:Devin]
+
+Optimizations
+-------------
+
+* ODFTOOLKIT-289 Clean up unnecessary log messages.[Developer:Devin]
+
+Bug Fixes
+---------
+
+* ODFTOOLKIT-104 Create new spreadsheet, save it, load it, add a sheet, save it, then load it causes failure. (Devin Han)
+* ODFTOOLKIT-133 NullPointerException sometimes happened when parsing a centain kind of XML under IBM JDK. (Devin Han, Patch by kelvin)
+* ODFTOOLKIT-288 No null check for lastNode in setTextContent of Span class.[Developer:Oliver Rau,Devin;Reviewer:Devin]
+* ODFTOOLKIT-295 Exit condition of Length.parseUnit in ODFDOM is wrong.[Developer:Oliver Rau;Reviewer:Devin]
+
+Other
+-----
+
+* ODFTOOLKIT-290 Consolidate build of ODFToolkit sub-projects.[Developer:Yegor Kozlov,Devin;Reviewer:Devin]
+* ODFTOOLKIT-291 Adapt Simple API to the newest ODFDOM trunk.[Developer:Devin]
+* ODFTOOLKIT-292 Mark ODFDOM DOC API's as "deprecated".[Developer:Devin]
+* ODFTOOLKIT-293 Submit Apache Licence info automatically added code to SVN.[Developer:Devin]
+* ODFTOOLKIT-297 Test: testGetLanguage(org.odftoolkit.simple.meta.OfficeMetaTest) failed when the platform language is not 'Chinese'. [Developer:Devin]
+* ODFTOOLKIT-298 XLST-Runner and Validator aren't compatible with Java 5. [Developer:Robert Weir,Devin]
+ 
+
+ODF Toolkit relies on the current set of major dependencies (generated using mvn dependency:tree from the top-level odf toolkit src dir):
+
+org.apache.odftoolkit:taglets:jar:0.8.8-incubating
+org.apache.odftoolkit:schema2template:jar:0.8.8-incubating
++- org.apache.velocity:velocity:jar:1.6.4:compile
+|  +- commons-collections:commons-collections:jar:3.2.1:compile
+|  +- commons-lang:commons-lang:jar:2.4:compile
+|  \- oro:oro:jar:2.0.8:compile
++- net.java.dev.msv:msv-core:jar:2009.1:compile
+|  +- com.sun.msv.datatype.xsd:xsdlib:jar:2009.1:compile
+|  +- net.java.dev.msv:msv-testharness:jar:2009.1:compile
+|  |  \- org.apache.ant:ant:jar:1.7.1:compile
+|  |     \- org.apache.ant:ant-launcher:jar:1.7.1:compile
+|  +- xml-resolver:xml-resolver:jar:1.2:compile
+|  +- xerces:xercesImpl:jar:2.9.1:compile
+|  |  \- xml-apis:xml-apis:jar:1.3.04:compile
+|  +- isorelax:isorelax:jar:20030108:compile
+|  \- relaxngDatatype:relaxngDatatype:jar:20020414:compile
+\- junit:junit:jar:4.5:test
+org.apache.odftoolkit:schema2template-maven-plugin:maven-plugin:0.8.8-incubating
++- org.apache.odftoolkit:schema2template:jar:0.8.8-incubating:compile
+|  +- org.apache.velocity:velocity:jar:1.6.4:compile
+|  |  +- commons-collections:commons-collections:jar:3.2.1:compile
+|  |  +- commons-lang:commons-lang:jar:2.4:compile
+|  |  \- oro:oro:jar:2.0.8:compile
+|  \- net.java.dev.msv:msv-core:jar:2009.1:compile
+|     +- com.sun.msv.datatype.xsd:xsdlib:jar:2009.1:compile
+|     +- net.java.dev.msv:msv-testharness:jar:2009.1:compile
+|     |  \- org.apache.ant:ant:jar:1.7.1:compile
+|     |     \- org.apache.ant:ant-launcher:jar:1.7.1:compile
+|     +- xml-resolver:xml-resolver:jar:1.2:compile
+|     +- xerces:xercesImpl:jar:2.9.1:compile
+|     |  \- xml-apis:xml-apis:jar:1.3.04:compile
+|     +- isorelax:isorelax:jar:20030108:compile
+|     \- relaxngDatatype:relaxngDatatype:jar:20020414:compile
++- junit:junit:jar:4.5:test
++- org.apache.maven:maven-plugin-api:jar:2.0.7:provided
++- org.apache.maven:maven-project:jar:2.0.7:provided
+|  +- org.apache.maven:maven-settings:jar:2.0.7:provided
+|  +- org.apache.maven:maven-profile:jar:2.0.7:provided
+|  +- org.apache.maven:maven-model:jar:2.0.7:provided
+|  +- org.apache.maven:maven-artifact-manager:jar:2.0.7:provided
+|  |  +- org.apache.maven:maven-repository-metadata:jar:2.0.7:provided
+|  |  \- org.apache.maven.wagon:wagon-provider-api:jar:1.0-beta-2:provided
+|  +- org.apache.maven:maven-plugin-registry:jar:2.0.7:provided
+|  +- org.codehaus.plexus:plexus-utils:jar:1.4.1:provided
+|  \- org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:provided
+|     \- classworlds:classworlds:jar:1.1-alpha-2:provided
+\- org.apache.maven:maven-artifact:jar:2.0.7:provided
+org.apache.odftoolkit:odfdom-java:jar:0.8.8-incubating
++- org.apache.odftoolkit:taglets:jar:0.8.8-incubating:compile
++- xerces:xercesImpl:jar:2.9.1:compile
+|  \- xml-apis:xml-apis:jar:1.3.04:compile
+\- junit:junit:jar:4.8.1:test
+org.apache.odftoolkit:xslt-runner:jar:1.2.1-incubating
+\- org.apache.odftoolkit:odfdom-java:jar:0.8.8-incubating:compile
+   +- org.apache.odftoolkit:taglets:jar:0.8.8-incubating:compile
+   \- xerces:xercesImpl:jar:2.9.1:compile
+      \- xml-apis:xml-apis:jar:1.3.04:compile
+org.apache.odftoolkit:xslt-runner-task:jar:1.2.1-incubating
++- org.apache.odftoolkit:xslt-runner:jar:1.2.1-incubating:compile
+|  \- org.apache.odftoolkit:odfdom-java:jar:0.8.8-incubating:compile
+|     +- org.apache.odftoolkit:taglets:jar:0.8.8-incubating:compile
+|     \- xerces:xercesImpl:jar:2.9.1:compile
+|        \- xml-apis:xml-apis:jar:1.3.04:compile
+\- org.apache.ant:ant:jar:1.8.2:compile
+   \- org.apache.ant:ant-launcher:jar:1.8.2:compile
+org.apache.odftoolkit:odfvalidator:war:1.1.5-incubating
++- org.apache.odftoolkit:odfdom-java:jar:0.8.8-incubating:compile
+|  \- org.apache.odftoolkit:taglets:jar:0.8.8-incubating:compile
++- commons-fileupload:commons-fileupload:jar:1.2.2:compile
++- net.java.dev.msv:msv-core:jar:2011.1:compile
+|  +- com.sun.msv.datatype.xsd:xsdlib:jar:2010.1:compile
+|  +- isorelax:isorelax:jar:20030108:compile
+|  \- relaxngDatatype:relaxngDatatype:jar:20020414:compile
++- org.iso_relax.verifier.jaxp.validation:isorelax-jaxp-bridge:jar:1.0:compile
++- xerces:xercesImpl:jar:2.9.1:compile
+|  \- xml-apis:xml-apis:jar:1.3.04:compile
+\- junit:junit:jar:4.8.1:test
+org.apache.odftoolkit:simple-odf:jar:0.7-incubating
++- org.apache.odftoolkit:odfdom-java:jar:0.8.8-incubating:compile
+|  \- org.apache.odftoolkit:taglets:jar:0.8.8-incubating:compile
++- xerces:xercesImpl:jar:2.9.1:compile
+|  \- xml-apis:xml-apis:jar:1.3.04:compile
+\- junit:junit:jar:4.8.1:test
+org.apache.odftoolkit:odftoolkit:pom:0.5-incubating
+
+The following people have contributed to ODF Toolkit 0.5 incubating by submitting or commenting on the issues resolved in this release, 
+or contributed via reported bugs/comments on the mailing list:
+
+Sam Ruby (mentor)
+Nick Burch (mentor)
+Yegor Kozlov (mentor)
+Rob Weir (committer)
+Devin Han (committer)
+Svante Schubert (committer)
+Daisy Guo (committer)
+Donald Harbison (committer)
+Andy Brown (committer)
+Dave Fisher (committer)
+Juergen Schmidt (committer)
+Oliver Rau (committer)
+Dennis E. Hamilton
+Jeremias Maerki
+Wilson Barbosa
+Ansgar Konermann
+Grzegorz Kaczor
+Watte Babbu
+Ashok Hariharan
+Henrique Lobo Weissmann
+Ian Lynch
+Michael McCandless
+Michael Stahl
+Patrick Durusau
+Pedro F. Giffuni
+Drew Jensen
+Kevin Skelton
+Neelima
+Ram Kane
+
+See http://s.apache.org/odfC for more details on these contributions.
diff --git a/trunk/DISCLAIMER.txt b/trunk/DISCLAIMER.txt
new file mode 100644
index 0000000..a2a9f75
--- /dev/null
+++ b/trunk/DISCLAIMER.txt
@@ -0,0 +1 @@
+Apache ODF Toolkit is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
diff --git a/trunk/HEADER.txt b/trunk/HEADER.txt
new file mode 100644
index 0000000..fe09460
--- /dev/null
+++ b/trunk/HEADER.txt
@@ -0,0 +1,16 @@
+/*
+ * Licensed to the Apache 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.
+ */
\ No newline at end of file
diff --git a/trunk/KEYS b/trunk/KEYS
new file mode 100644
index 0000000..d503ed9
--- /dev/null
+++ b/trunk/KEYS
@@ -0,0 +1,253 @@
+This file contains the PGP keys of various developers.
+Please don't use them for email unless you have to. Their main purpose is code signing.
+
+Users:
+    pgp < KEYS
+    gpg --import KEYS
+
+Developers: 
+    pgp -kxa <your name>   # and append to KEYS (this file)
+    (pgpk -ll <your name> && pgpk -xa <your name>) >> KEYS
+    (gpg --list-sigs <your name> && gpg --armor --export <your name>) >> KEYS
+
+----
+
+pub   2048R/56185A70 2011-10-26
+uid                  Devin Han (Devin Han works at Apache ODF Toolkit) <devinhan@apache.org>
+sub   2048R/6D6BE53E 2011-10-26
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.11 (MingW32)
+
+mQENBE6ndOQBCAClgcmg2rAtuWjfMZ2lItoljoV6fM7jx8Svv5I19lQwjrUMXXzK
+yD/Wlo7GKwBa2e6THzekguvIUDnDJZ+VuxuNbShZg1qiihO2eTpiqkh7wOF069Yn
+ZNjmIZG7s2jpGiKpFEX+7q+cQHuyvbv6eu/CTUsqbBEDFpOkqDL9hvJO9Z9m+MXN
+X2kSwx9vXVuJgWEIi7afAbPXYJoxo5yw7jgfX0sq3iGYhfe7otX4YvSvLnETH26B
+tIBDqossKx6b0LTg7032yFo0mN6QvhIBl7+ie7lMVDNjVZAgpXKCY/wj7wqcvcS7
+M6ML9VIQqfsGbz1b6zzWKjFR08EydwXMptghABEBAAG0R0RldmluIEhhbiAoRGV2
+aW4gSGFuIHdvcmtzIGF0IEFwYWNoZSBPREYgVG9vbGtpdCkgPGRldmluaGFuQGFw
+YWNoZS5vcmc+iQE4BBMBAgAiBQJOp3TkAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIe
+AQIXgAAKCRBRtKVqVhhacM0VB/4lz5kwETfR53Ov6xrvnbtd8hoLYRR2VhpyoVIl
+eZS3ltZjYlC/HjBEPX6ly7sAr/5WZKveOJchQlE10gmzZh6gmM4JOt9Uay5ftQ/O
+3sAD6jWYa6X0teTbkj5kVVj3Qxhsj5bu0AUlUuMI2DMokfM2FVqz8WtX8w7/k7VY
+gKb1rzKBnFQXmJx3URM8QfvtNqwnnyLF6E2ZhmSQyng4N5gcYG3zBZNwpBUsQN02
+1QKNqTLkZ7E8f0XPJQu/6XFwxOahhGB5maWoPatSLUHGVsjRopakuzVDgxn/wNjM
+uzUxRhZ0zWWz5a0kBqHLYpaSYL6ZELg36hWkyD2oJyM8Cv8NuQENBE6ndOQBCADj
+KYBQLHIGt7ujGbkTwS0V7VMaLp4t6flsXhzbpWoEZYqBWNner3tU/zgfu+xh6hmB
+YQeItg1ON/0EF3ERw9CUoSMXIWXRfCXUFRLt6tEMYgoRtjH+Fkvndp8aQMS47Olk
+3eUhSOaa5ccetowTepqIRY0iVFI024Rrufd3RnEFuZdC1f5vynfo+2aLEk2e/BC4
+DT/d+LCgOTBqpktUEX9KZ3ptJ0nu+7w4yPgUDkaRQ6NKKfCdiJfqoGdrf6ZY3bF1
+OmJbP9cPz5r8V1QoT9Hj4ETRHgnJk0O++O40saXZBDE6Uui8AwWi04NI5Y5jPOcT
+BNF42wCMj77KIXH3E4dNABEBAAGJAR8EGAECAAkFAk6ndOQCGwwACgkQUbSlalYY
+WnCDfwgAnt8kM6d1u5gupGM9AhDAKz17DIqD2cqYnsYNB3yFtFcGBp68cSII98DS
+ahvKB7J+AHd4XLSqVQkj8aOaaufNmje4xvQy4WuvhzqnFOxXhqnDQ3fwZhfurZ89
+ux7/x8ndj6BZ6H85WrG3NAsf9Rvz1CLc6yDith53A5AAkd/dE1fZ7XBiFQ0IX5Fu
+UHbGzYOAIkd99Bo1KravSWb6NgLhxS0ebS9l0An8fcaIGTAU2g9WNB9p5Vot4We7
+nRlEHcTeF2eu5nAD2yqVrhCvSnT6qS5xgdavuBn26uv2lWwq+EZfEZvAkQ5vSTTS
+nOLKnHz0oVxS7VOAlBr7hq/U5YqV0Q==
+=Xu22
+-----END PGP PUBLIC KEY BLOCK-----
+-----
+pub   4096R/61C60298 2013-01-09
+uid                  Dali Liu (Dali Liu works at Apache ODF Toolkit) <liudali@apache.org>
+sub   4096R/1F3D394B 2013-01-09
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.11 (GNU/Linux)
+
+mQINBFDtNfYBEADVmk3sMMY+staeLxhhxQWTeuIbI4X1r7zAvAz1+3L+5VqAoJoB
+gRFQZSBeB+tTR8kXi5DfQDRgZ8FLgnXUJTV+0pzrOY6USi9NW/joIqDE6jjAfU9J
+rAWq0AzAs38H+Klc6PrzJyfHuuQk8yqiryV1xN1smWB4z/ghWmdkUf6liZFmr6tO
+S1HO+9nJxkkfTSxmXbpoVe4gWkEsBs5vsWIoX2q3oNaI1pHRDCpWBn2YRgLVx5wW
+TyTyRWgEY3bADya8xJKWlh0GS7N9uB2RbH8Vax8z2KdNM9EuDaoNO4FboT4fRkxM
+dbSDaOfXanvlahDUBMeQFZ0F6U7AMiB1GpLTr3FbniETc5aWakLj3iV31q8inlZM
+QwUNEiAl0xfq1jP9BtO6GGbLEHAq4wCcYgSvSxQoXTqAoXLzrP5kDnDD4AFZWmvr
+iltTAy1Mlnr8QPnie+Mb3A3VNv+6AWhKIZs23xm28m7h+sKsAFSiUp12n9+wZwZZ
+V/WOSOi78klbIoyVxW9/RJ9e82hC7fNDZ55EaaCWu9Yg65iCG8I8noJJ5p1HBYmN
+oRprS/8EaJr4EaHhoI0ezf6oy0IURJp8PyUcqBHm3ocNHAgQ7lF8fDAiEYWsxoo5
+R4Yi9Nll2MB7h9DipewbQiO7bMOdxz+jp6m73fN/rpNlFmj7MgqOK5E9pQARAQAB
+tEREYWxpIExpdSAoRGFsaSBMaXUgd29ya3MgYXQgQXBhY2hlIE9ERiBUb29sa2l0
+KSA8bGl1ZGFsaUBhcGFjaGUub3JnPokCOAQTAQIAIgUCUO019gIbAwYLCQgHAwIG
+FQgCCQoLBBYCAwECHgECF4AACgkQNCUlNmHGApg95hAAo50rG3EtZkeRWNqsgejB
+/nIamYYFmN9XL91bhRHo0cdF2Bn68v8RvzrnWd6fXkhGKFqc0/LO1Hajvrn5AN4f
+tN9ZidcpIdKHDwVrmFhuH6FcOiZaEe/J/vZMCsVVG+t5zO9wnTFJ5eDibJabIt1f
+2YjuEHErEilhsFZq5Ag6pUz/JXo58sunVrvenb8+MQ+GgsXfTAkOyG/2y00d5+CX
+ct4IbL6ZGUJ8zFKEiPu3gtIWkW/KhngZBjCM5DsFG1Mgzj5KGNADltdY4gD2/uw8
+6YnCR93s25berUp0cSTiVzjF9deIv+OhQtUZY5je1PnsFAN2BfMmqTh3/AMZALCy
+eRLSrgRiJOXUhuKh/P4vSZr5oBMU/CFtJBLQzPY5qhmju4YkzjQuICNTAaQdNkFx
+bb91JcBg6NpPeXA5pkQ3Z+2ihuXW+9mpSAFpmyz7ScDthsiZ+wJjhl6B8/lOy5cx
+RLKjZm0QmZIMVOB/Pkw5Pb0q/lqKSYS2HIh2cj+cX6Jaxp+DwIzR2qM4JHfgMkGN
+1Kfdqgl+4HHX1M1lsAtAap5mkgtzTmK/bNKLvtzRYUfeMCTkmc1Pq7rck/cTgQQI
+NIS1S85S5Xzqtfi2Cm/1588t8ATcUCBZNlEFSlmUpzAMcfd5LAPbF3aFbEjvV/3b
+yf3Yr6Ak8s3k5MUoibJ9OvG5Ag0EUO019gEQALiavM4wBoSq7TpaPkfqdFhSYBl5
+tlkhcFNNQQJgCny0aHvrLKUbTc8j+MqRBvphMH1ZrQebG8AXK1RUeXohvrKMWTb2
+9jgz/w7X8uIW3oXkBjADdhN/r+hC6OlhlQxaSp4er7v3mG7tevDvqxIIk20oa5CR
+EQTjWz+0YA+ygffdqfK6YbOrBUWEs9O8kArdJtnBKoXPOvdH6Q1vkgODyxc8DGDw
+v2izn7qtwXk8+dV606H6rs3N0ucCfLxQjYzC95wokttb6xspDEW3s+uezdQ5A3fF
+yh4KzP0afJwMw2j74UMPyKtyrta/3JyCCEZyqtcsB6ui+9ycs2GanTmwJ+R/kzj9
+q0T4xF1DiUY8IJcZERRl9BwWD6tV/0uB3v66yeOOz/tJwL1V1FJJ3ChxZJJ3nK6c
+hE5YNdZGloXIqkes/sEjnex2jQ1h80CFXk5+ExIotp4Cxb8XGGPKavII5AGLUMaE
+jfCLf358hMqYjG0oCJrnx54TYaGGIS14VE39tR4h8V/qb3Lhd7VV/NaE4xg+wQKS
+hNpzyPqRwrpF9RHErIaxeK1Sw0cnuVo3uWzVTy/dm3pmGqJ3hXYEVf5KpOrtzUdb
+v87LiFCI3ja8PCnhweogJ5rwwAnnA+yK7OZiXw/SqAYr5E4xIk5OMkvUMcMJkZ6h
+PNUqotZgXjivvEHVABEBAAGJAh8EGAECAAkFAlDtNfYCGwwACgkQNCUlNmHGAphs
+FBAAlUsUHFhQDJM13RlO2rTVaHrHRuPABnTtRVpf1WnUZqI0eeVefAnE2NdEcaew
+A8DFaaz4Sc2tx+hybQnR7gFokxFB3/p/46WCiXYw85tTuIwTliAkyHxNVdk466F8
+teWORhRd8d4OZpNpxugv/aU4zXy3i3GbyrXsyYOAlnC9tsD/NwED+7nYhOtW+yvZ
+DzzTltLxegEg3ryUbj5KUvTCJF2t52LVeQbVeAZzfKPBwNyzVHeKkP/D+f/UkBFn
+S77U/uw30TfW6t5SenbJ/D4ZABMeBbrtzACoiTNCb+T1u+wf3k2C1UzdWNoJrb96
+ke7svAqgZxD/pIe12l8jC61Gox2tp79h7Jf0h7iMkxu7/x2ZNEDISVCvQsciiPcZ
+v3xG236FGuBH+D6FzpJhchohgBBws4LC/2tCNkIwJLcSW0FEKwQQymlgBaUhIDHV
+CmPW0PABZ5jQ11kuGhWjBfP61NweH2PR3c5MTH5zQGf5bycOLaOwu/AkprPVNEKy
+5nfwW9u7cIM2kOvY/gdN0km3i2DMMJlWmak1jcrsvMzU9f8by4mgjyheXZuXnvkv
+bOeWU0IkpxeK6LzZhpCzXhCFLaYp5C/GkY5vL8syNzj47c3y71Yi0gqT4OXXjR6D
+8+8qgyWiZ+49h1fnCHmprZqpi8FlhfWeXk14ir/N9Bzpxus=
+=BBUL
+-----END PGP PUBLIC KEY BLOCK-----
+pub   4096R/7CE61658 2013-04-26
+uid                  Florian Hopf (CODE SIGNING KEY) <fhopf@apache.org>
+sig 3        7CE61658 2013-04-26  Florian Hopf (CODE SIGNING KEY) <fhopf@apache.org>
+sub   4096R/A4E33889 2013-04-26
+sig          7CE61658 2013-04-26  Florian Hopf (CODE SIGNING KEY) <fhopf@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.11 (GNU/Linux)
+
+mQINBFF6WXUBEAC4YxtxxpyffTO0QBEhArLjgx4/45CvJY9xRXJVm4KIe5L9G0B6
+T4faQQdHU/VMinwHp+bMJx76btCoDmRIN8u8FaYWG9SAtMCEMvex1KSz0bW0S2Rw
+udL30lsl7oZvBABy1P+cLqxu4W15FvPdWHzCOvuMiu2q+areUja7zxj41k5OUvIg
+EGuu8HNAzA/oE2inYFDWoq+tigtI67HgzqYwdTHj0UuKjQRk2oQvjsOXhi+pE2Hu
+76+EKcqR1++TOmzhlXeZpe6uuK6L7FFLuceANYOOQS5DXDZ1DYe2GkP0NYMtgnG0
+aTSPLQ6tgxGsv8PNgb4ZJZ2SC3qROXMmb9Wmu0UjF+O6/pp37BqiC4f1Q7PZLqYT
+FU0VDr8kJwtqEIYYVXoG+4bRESrjcNVFZrz9Ov7AqrO20QOH3PW4/IisUVQBY0+4
+DqBJUGkTXtc4V1c1da1dtqcbLwM31fnoaypccAOvpohjgYtCXWf0Ezhq7cFpzLpU
+zjQskofivX8+cltZzMox69YDi0wrOVYonGpesZOHwzTKSuKgXc+PAlUQVjiHej4x
+rJgdy34cuQUkwOqpCqTmocDc+slIdj3526k2TNOH5IfDTsQT6yjGFkHugT3IvcmD
+/KnPVZeGUOf/QeDeJO51ZW5FpBNfWIeziSBInTUdGc3uIFVAbmI1LrF05QARAQAB
+tDJGbG9yaWFuIEhvcGYgKENPREUgU0lHTklORyBLRVkpIDxmaG9wZkBhcGFjaGUu
+b3JnPokCNwQTAQoAIQUCUXpZdQIbAwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAK
+CRAKqg7ZfOYWWNo5EACFo4Fjesj6QVenJp9VYXreWy2D1DqQx/GIHUvPS6cuhwkk
+WkloH4BoMbHobs93NLhGyJljuS5AN8QbZx7nBts8WONERDAgl0vog+q3bjAq3nN9
+dz3cPqaAmTYBxjfeMyaQU/czAtVAv4FsF0G1goXVZIZ1b1Fr1nieoK1MMo7BCfeX
+0ajml3D0QKjhqfjeb/smnCUOlFw5RwnLoUOUbHsp0RiBFGcubO4fJ4j57UO7GsYP
+RJaL3ZrczXhaw6clmQQzyVA+9dsurzTHO3sbGp9grKL+W/0HL7aKUMpAyWBnX5dX
+MIttZnUJvWRIVjPm6OYeBcNFrcms3c1zBzoYwdLJa5DMMPsz9pvo4qlKfUZUUG8W
+/PkX+GWw0E1YSHnwkYH7IZBhWJ3wFPOWPoBjFDFYAUuCnPPtLbUSqMi/A6twlZsM
+LbFis+clbs6u9Akm3n64Cmbq9vkm0xxf2uhgmQtOgF0YLEtYqyVtD1B90YlZgTTs
+7mmLrqw5LuvSUL3Op5CIGiiSFhllA/FbPZPBB88h5qIfPMg2UncSqxcIuZUHEkNB
+35b7u9i2iKQDgL3ex+qEK9mZ7gtJaV8pqJXPocOXG7i9UsIkpK/5qVwCNzuE+RrX
+4XkQBA5tWzPqCKGb0N+thQ2Y2qPXC1lUIfhRlsxsF53wiCrXTP9T1t9hW1nevLkC
+DQRRell1ARAAwAQF9jmnjK4mNv/4qYb/DgjhnuXrRAHQmp541LfBD9AjC5TsAYLN
+K941wchYhXGxK9VUFGfhpr4BpAEMqoaFUcBmUAda4vayP/2/eufQXt69da4/RWg9
+YwG0yXFg2HOQYUYeGq3MzS3aQGu5aFLlpJjJlD12joz8YWLky1SGSK0BgKoNSkAP
+2PzTJjFsuhyPE/MJrmgb7Ra9cvmPOXGoL8aUQENn3d+lSaBBcr4hR+zAOIfpEnXI
+W4vS5ajXzbUNcv9UKJXjRnoTk7nUDwy0dkYlb1kKD7VX6GZTKkhSLrQe9Ircwg4C
+YqzT446Qv8oLsL/GGZ4N20O8iA7HMXnVGgl4QLou3JY+zROXJ9Mymz6SR6RVDt0S
+4/cOZ55NdixD0BMcKQvV0wlob1yOQYC0gUmbwTBX4Vm0kTdgvOPYWQRex30mO7Uc
+dXusV0fqx86q/k5MXVCIZOvHZFbn6Fy+yNrKhWz+iv4rxqX7C7TTD0sKchNWwlqF
+R3/OTLUxpKHwskyfHBXUXaeINCtYV1p4oWcPsCXpEcQH7sHggAM3CBWgXl2pNPST
+SAxhnEK3wqX9K3kVdWVNn2qag94ybXR6n0b7OI2LN86dk4iHaIv3/PUYE01f2+1q
+aIY2pi8iBCoYSceFcMJKpS1fdWm1nzqlR/BccSXwOF/J/j6ZlrwAwhsAEQEAAYkC
+HwQYAQoACQUCUXpZdQIbDAAKCRAKqg7ZfOYWWAJMEACguc9wyDbznGxPd1HJr8c/
+k96BwJ3VKJmJZN+9rFzzKwqiuwQyM8nrITt2AwMHJGoFi+fkog9tdvboKSQBHMzG
++QF8JEt+T2upO+sZnq+tmpchSpYwCv0rpP+mQMAn6H6gLvqcrOcniCP2xauJ4Aoi
+DCaCTwUOFCH4U247M18BNISft5DdWBF1KLAdOc4tFxM8a45SRuTqqAubMy3Dt+Cn
+TXdnLbFgDe67weDCccPtnMf51UYXo7PvmOjgFY8jozMHG+I7JS79PBhvoefrHL8p
+16lBfzBMmtf0mNqAVVXqvc+zx2dt8/ooPfrf26EBJSyJ+A0KZqV8t8C6sW+Q2Yt/
+IgBstMne4ABICA2V4g96NPJBjjeXscl0jZ5eZ0qoFpPKvIZbPAS2z7yARo7F4pez
+BBBqOnalo6jyNr88KuQgt2UnS5Z3qEXiXBukvwXcRlFMMEhKzR5WZSP2pneRV8QT
+bh5VBQrmrXB+CTzhYOld5R3FYoFjCYg+yrvGFOm/tdCngu7Zqk59NqmagAolFpfo
+Tpb7bw5jMBlJnSG+i/UaZ6kjLTWz0/tnA9z+rt7zojmyzsT16nIRiCwfQDqRX807
+vayaLE3EtC7N9has+/M9UJnSvWNbBdhNuRkV9rLKLfhhS1iile4eD0BxSgZAK6/v
+u/y8F4jLrKlUHxYMAY1o3g==
+=0jFr
+-----END PGP PUBLIC KEY BLOCK-----
+pub   4096R/47CCBCC7 2011-10-21
+uid                  Robert Cameron Weir (CODE SIGNING KEY) <robweir@apache.org>
+sig 3        47CCBCC7 2011-10-22  Robert Cameron Weir (CODE SIGNING KEY) <robweir@apache.org>
+uid                  Robert Cameron Weir (PERSONAL) <rob@robweir.com>
+sig 3        47CCBCC7 2011-10-22  Robert Cameron Weir (CODE SIGNING KEY) <robweir@apache.org>
+uid                  Robert Cameron Weir (IBM) <robert_weir@us.ibm.com>
+sig 3        47CCBCC7 2011-10-22  Robert Cameron Weir (CODE SIGNING KEY) <robweir@apache.org>
+sub   4096R/58EA4420 2011-10-21
+sig          47CCBCC7 2011-10-21  Robert Cameron Weir (CODE SIGNING KEY) <robweir@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.11 (GNU/Linux)
+
+mQINBE6hXCsBEACzijPo2pI+pL1jfFAPSm/kSlKVvdvayTdH481pIaPqFuEoJu5V
+s4ELI2Im3LOpaTPDvtVAdEmRQsFCbo7rff/oQgFvjrHnh4TrrUBDESOqg14pBcix
+kXq5l5hMZXCNvX7e6Wg41p7dSia7LqA4qgXiVBVa8pU5XMCNDBJa4dKyD+E+K0q/
+U+0EjCNw1TWGhrsH1px9uAO4jxhyHB02oO50y/mxxrpFfONNpK0r1NN5XN4ji2k/
+39AMZQ/PNk1jTRtUMuiC2N5bYiLHa3lQswGXE2ALf97h7cQ4ORhxzSYQi1XD1eak
+f78OOFalMy/MHblJNLJG/skLzS9sQoPt0f64kIV8/YCYr6HxnLqUDH9LQrkVvLW+
+CCp47na9yZhx89BigfsYIMJ6XmPIXhpN5lCtN/SfJy76ehsMFJFe4Fqt+3YhJF6L
+rkx6Jlu8nBzYGG/gO4AdH0U9V8Iq2SbgUBDT/vA8MjflLUxGxceFSVScP9RskK9G
+bQljZ/TNizwrUxhDZGVleQp6Bmm100vkYPhiieCFaX8XWnAJ3xa/ViP5hZ62QUNQ
+Ih4cQBhnnYOa5LpOnv0IG/SGXqOFk2Z9YxkmMyr6LW4CxxEbZIprzhLeL0OoVHx9
+UASgQdaywZ1yX74/GUqkCZvUrAqXJzWVutHLg24GjXvGX0h2xwpWWG5oZQARAQAB
+tDtSb2JlcnQgQ2FtZXJvbiBXZWlyIChDT0RFIFNJR05JTkcgS0VZKSA8cm9id2Vp
+ckBhcGFjaGUub3JnPokCOgQTAQoAJAIbAwULCQgHAwUVCgkICwUWAgMBAAIeAQIX
+gAUCTqM+NQIZAQAKCRBhQKGHR8y8x3l0D/oDafFqFD1V1yw3Yy1wcKhUDEmaDb4j
+Jig0EPiL8FBl517zgcw30Gf8u6alThgB4pHfQYbhGE+c7yQxOZ6dS0sPMQGwyj6x
+HnsKF+NmRLjyWSXdGvYj0lLMcmFb9RFG7Lyc1uEIlKRiqo6aXMpECR6pFzZ/s4vj
+qypTqH52et4stwbszMB+0oV8s9wDC+ln6MRf8JrP2ZsqL5DBdTHOaF5fkr1XgE2s
+gBJtltuNounNH1zaEkmAOD4ZrWYEXgoB93fFK3Eio4XWCFmSAlimkjvHS/95Fwok
+yTAGqtNpioTOm8SCsx9Piim3QzB/V8ojYw4PDcl+oHffBmurd9KFSzDc9/+SPOmI
+f6y8CT8t5tsE4yHq6fALa8lFMMCF9iku78+iyjlMfmQee2M/iSqJUfxhUJ2rgBzj
+xwfdGKgU1gJDa1ZuXQSdjYATx5obR9KLvnOrQR4NVWRwiMnjmnwp5gqVEVIiKYFL
+P32+dYlvRpZuoEe6+SOnc3AGHCGRMny6xPkcMO/qQe2EUpTegQaMCfv4vErrawCn
+EEmUsXijeJRJAvigXzzVfQvNfjihaiYCpii9yPLlB4o7gG3hDiY+nmjlYWON/zJo
++S21736hKrChehkA92bevmCCNxCSsBbLQZEClyp4qWM0Hj1ytViYkwPUwMB6klzC
+OVaDS/12r4yLXLQwUm9iZXJ0IENhbWVyb24gV2VpciAoUEVSU09OQUwpIDxyb2JA
+cm9id2Vpci5jb20+iQI3BBMBCgAhBQJOoz52AhsDBQsJCAcDBRUKCQgLBRYCAwEA
+Ah4BAheAAAoJEGFAoYdHzLzH69IP/13bLQ5kwG+Cilu54GbCSHHA+b4VbDOMomRt
+rIhBFBfRfHH8zfUnofxV0uBoqqA7Jn6oxHOwuVCAgxKBuaNd+IlmOGKSNGEuiw1b
+eYQjF9qhoLQNwV63h+pmj20pt07VFGK1Dh/cP5c6xK0CDE4Gxsq9wM0/hFjEfn5v
+7W7pE9eO6ou9eV6Vx1vmyZQ1GHTEQjvBCUxuQKmTgAdyAgkrBbqmVS5/wDqBdk+t
+x+QTLFl15dWoLZ8FmtyJnHRAaVG59jLYPkIHKAI5nFsHnn+1W5DGk6Ip48P3Homb
+zhfxMS25R06Iyxc6x6HUTD007b64/5ZdLmVAMRd5L78/7w1rXr6/pcKArGtR+pWa
+8/+nwWj4qP+Fe8A1xZ9x5NwUWB9bgmyZ49eDetqPChtyXfhpV/0sOQXOAndMD74q
+PpBIE6J4gafwmjannzn02xlI1U1VKMN3lbwcMGokDwMrt2tC4y7rWgmOt0ifBfaw
+3fFRrd0fEAV62NHfZCQlq+4WCjwpaW97bj4EGGiZQxp17j5YtPpEVfsRmxsls6mT
+ten/j1q2m4aJevGyjt+N2ncoDumbOnNmU/fBCqYGQGfnr9laagPHaepmzPLYKfda
+NhXNGozNMYG8HE9LOOcpmIxWDKbSFxtsYVxRihIFHe0l2FSu7EpGNGd7fQykXZs5
+R8jI5CCWtDJSb2JlcnQgQ2FtZXJvbiBXZWlyIChJQk0pIDxyb2JlcnRfd2VpckB1
+cy5pYm0uY29tPokCNwQTAQoAIQUCTqM+igIbAwULCQgHAwUVCgkICwUWAgMBAAIe
+AQIXgAAKCRBhQKGHR8y8xwVQEACV7ugw0AQim6hn16bS2OouEpCw06vRZL6Ze/tb
+mdWEOoiB/jXDbZVgbpHDDZ1bJPvVko0ygrNndGwHOQuE2RqTy8URRhLNG5+Vtvw5
+yIZaD+tiHzsW100KaeTt0ugsC1UbOH2UFbc9ChuVJVn6usHHbcLwq2Vx93hiZYk0
+d5/QQfy+rCiKNtJNZPGFjcpMy5ai1oSiM0D3UEcuWijSv6/4gJT/KqkN1JPGWats
+xljfgcEqQNMdkOXUPXFiUEN2Ezot2njnztK8ijhaOBN3OU7h/5/lADX2OfDUA5gb
+w7FLLeVldkyTG3TcVbnlyZ3FOCskHjR2Y8ExwSDw8BZU4jZo3uRu56ruDVo50pQI
+MBVqVOJpBoX+XR9apBxWuy9mQqpivj8rvnarYiAGmewalazBpvVFxTTtPTJ9b4qe
+UH4tqwq3zwCDv9/qlGh7XAnpaLrfy+L2vR+GRPOXFYRAsUhUbaqk1iDqVW8a13lR
+KTBbzjY1tF6kmfd0KampEMSYiQvzKUQp0Aeac6sesvY9y1ojlAXil0PpB15KFaTh
+UXHeP/Q5UdFSPmJZaIakGcxmlHgGJvD70sxp6A8pliZTcCtAtATaVS59vZF4/wdD
+NRZXflwreifJ4vCb/6hv96ToxwRk//ncqQ5muAweIkwoIJW/G8C376I+12Bhw1Fx
+y2Dl47kCDQROoVwrARAAr1TaQZHbHu4ecuvjnZGXBrHgfxUdUZVyF4s2q5jPFHJQ
+jH1F9OHEf7a2Mpk5LYG26EBSD/3iEMk0fzJOudMgHlibo5rnwByymDX0ra1qrKsP
+NGy8STvG8385qYQHSFuUr/SHHjEFcGMVpwMp1An5gRqmk1mH4PtSRRpWV9xAiAXd
+/Y3sw9r9ZG5JLnaPpgXyFiPriV1gWfH4hJZojD5o7DY8Qo6KedhlLf/SYLQqxNjb
+BC/vLm8ppcr3MteEkNwITUmjgGQfAX6UsaTarKzwexeR40Dz0Lm66acFOG5H+QkA
+tABKZMGqCbjZlzfMu+RpMKDxkjNmvs6jbiKXOrC26WipCL3GOaTPm7BDpOulsQG8
+XbM2/JPs5rWJFk/H76W9eMlArgrhRufpafL0S9walwO2NfM1UqKG0U/nbrc2CvSY
+0GowSWV1hLbOJAv4Spz1EmMa7tLe+wXbpKpVqeBoCO7jI9FoijYUx2vhFYlsZdir
+eu3Cg1QRn2xgh6ir10PczYLuD+AD8CUmngovKtJhN5ZSZR/7iaITLKa95jSGguHx
+mTCiV4vdx29xBzGi4Zwb8kBLmL+RRwek2x0ta2jmaih3nJA6KxGoC+n7DkSBeXhW
+8M/Tpt3IxRkhq/wVp644L77ycCMCTpxfnaf48fZEFe3gI13wevcwGPB/qtDaOM0A
+EQEAAYkCHwQYAQoACQUCTqFcKwIbDAAKCRBhQKGHR8y8x7NHD/0cXor4ihPJrakE
+yjVng6Tyy/mpE6+67mhgmFtrIhLZlKm9Cc96Q8Nlu9p7YoguG3M4fqRb0sj26Lkq
+ku3ejFTrHqB8bhwAk52pCTvM027N1w5eQJ2/vdV/K/gOMY5aEW79X1YxldBK508S
+BArizRU6qDEXO/H7kL4siPMJ6Pumaj7SXgLKfIerx+mIHaHa4VA+fgJKmNo2BeII
+BuIOMIZJcS9xVCCowAa7rjL7h6OGupneexyyYhCQN4RFgksrtRsdiqg0crM9/+Pw
+GuEaTRNAOaGZqTWdK/et3W76t4EbZBOJgcvh8Z3QbYEOxGuGIW7eAC/I6PggK181
++NBqZB10coWN9zM6luuftSq4VstPo1P0S+lXyYCHfPY6EgAR/37O0L9bwOkPi6MU
+Natemg681IjnvquYw5LnwML8NHtxaFKAif3uM2qZhEcIyhMDLSaghVG7oFHwwfh+
+ahc/0Nj80KJ/+S+f5fiWDtaAh3zuVuobI3k0k7cZ59Acaiv/PGBTrVEYsBKjAZTU
+IYOz1UKe2FPfM/rdsutK7saZZVBogWNiWaT15Qqoc+h2ekYu2wKBWzUYF/xu0wRw
+dmkJVoTHF0OJg9a1x61Lfv18vaFvPlnLW0dR7yquKfPYC8vO/0o/WofcYaUaTCyP
+V3mlggls+6agPtRXV7B3uhWANwEyHg==
+=LQOy
+-----END PGP PUBLIC KEY BLOCK-----
+
diff --git a/trunk/LICENSE b/trunk/LICENSE
new file mode 100644
index 0000000..938550b
--- /dev/null
+++ b/trunk/LICENSE
@@ -0,0 +1,366 @@
+                                
+                                Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+
+
+====================================================================================================
+
+APACHE ODF TOOLKIT DEPENDENCIES: 
+
+The Apache ODF Toolkit ODF Validator component includes several third party jars or schemas with 
+separate copyright notices and license terms. Your use of the source code or bin of ODF Validator 
+is subject to the terms and conditions of the following licenses. 
+
+I. Open Document Format(ODF) schemas
+
+        Open Document Format for Office Applications (OpenDocument) Version 1.2
+        Committee Specification Public Review Draft (CSPRD) 03, 19 January 2011
+    Relax-NG Schema
+
+        Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
+
+    All capitalized terms in the following text have the meanings assigned to them
+    in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
+    full Policy may be found at the OASIS website.
+
+    This document and translations of it may be copied and furnished to others, and
+    derivative works that comment on or otherwise explain it or assist in its
+    implementation may be prepared, copied, published, and distributed, in whole or
+    in part, without restriction of any kind, provided that the above copyright
+    notice and this section are included on all such copies and derivative works.
+    However, this document itself may not be modified in any way, including by
+    removing the copyright notice or references to OASIS, except as needed for the
+    purpose of developing any document or deliverable produced by an OASIS
+    Technical Committee (in which case the rules applicable to copyrights, as set
+    forth in the OASIS IPR Policy, must be followed) or as required to translate it
+    into languages other than English.
+
+    The limited permissions granted above are perpetual and will not be revoked by
+    OASIS or its successors or assigns.
+
+    This document and the information contained herein is provided on an "AS IS"
+    basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+    LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
+    INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
+    FITNESS FOR A PARTICULAR PURPOSE. 
+    
+    
+    
+II. MathML Schemas
+
+    W3C Software Notice and License
+
+    This work (and included software, documentation such as READMEs, or other 
+    related items) is being provided by the copyright holders under the following license.
+    License
+
+    By obtaining, using and/or copying this work, you (the licensee) agree that 
+    you have read, understood, and will comply with the following terms and conditions.
+
+    Permission to copy, modify, and distribute this software and its documentation, 
+    with or without modification, for any purpose and without fee or royalty is hereby 
+    granted, provided that you include the following on ALL copies of the software and 
+    documentation or portions thereof, including modifications:
+
+        The full text of this NOTICE in a location viewable to users of the redistributed 
+        or derivative work.
+        Any pre-existing intellectual property disclaimers, notices, or terms and conditions. 
+        If none exist, the W3C Software Short Notice should be included (hypertext is 
+        preferred, text is permitted) within the body of any redistributed or derivative code.
+        Notice of any changes or modifications to the files, including the date changes were 
+        made. (We recommend you provide URIs to the location from which the code is derived.)
+
+    Disclaimers
+
+    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO 
+    REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, 
+    WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF 
+    THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, 
+    TRADEMARKS OR OTHER RIGHTS.
+
+    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL 
+    DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+    The name and trademarks of copyright holders may NOT be used in advertising or publicity 
+    pertaining to the software without specific, written prior permission. Title to copyright 
+    in this software and any associated documentation will at all times remain with copyright 
+    holders.
+    Notes
+
+    This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+    This formulation of W3C's notice and license became active on December 31 2002. This version 
+    removes the copyright ownership notice such that this license can be used with materials other 
+    than those owned by the W3C, reflects that ERCIM is now a host of the W3C, includes references 
+    to this specific dated version of the license, and removes the ambiguous grant of "use". 
+    Otherwise, this version is the same as the previous version and is written so as to preserve 
+    the Free Software Foundation's assessment of GPL compatibility and OSI's certification under 
+    the Open Source Definition.
+    
+    
+
+III. Oracle Multi-Schema XML Validator (MSV)   
+     (msv-core-2011.1.jar, xsdlib-2010.1.jar, relaxngDatatype-20020414.jar, xml-apis-1.3.04.jar)
+
+    BSD license
+    
+    Copyright (c) 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
+
+    Redistribution and  use in  source and binary  forms, with  or without
+    modification, are permitted provided that the following conditions are
+    met:
+
+    - Redistributions  of  source code  must  retain  the above  copyright
+      notice, this list of conditions and the following disclaimer.
+
+    - Redistribution  in binary  form must  reproduct the  above copyright
+      notice, this list of conditions  and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    Neither  the  name   of  Sun  Microsystems,  Inc.  or   the  names  of
+    contributors may be  used to endorse or promote  products derived from
+    this software without specific prior written permission.
+
+    This software is provided "AS IS," without a warranty of any kind. ALL
+    EXPRESS  OR   IMPLIED  CONDITIONS,  REPRESENTATIONS   AND  WARRANTIES,
+    INCLUDING  ANY  IMPLIED WARRANTY  OF  MERCHANTABILITY,  FITNESS FOR  A
+    PARTICULAR PURPOSE  OR NON-INFRINGEMENT, ARE HEREBY  EXCLUDED. SUN AND
+    ITS  LICENSORS SHALL  NOT BE  LIABLE  FOR ANY  DAMAGES OR  LIABILITIES
+    SUFFERED BY LICENSEE  AS A RESULT OF OR  RELATING TO USE, MODIFICATION
+    OR DISTRIBUTION OF  THE SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
+    SUN OR ITS  LICENSORS BE LIABLE FOR ANY LOST  REVENUE, PROFIT OR DATA,
+    OR  FOR  DIRECT,   INDIRECT,  SPECIAL,  CONSEQUENTIAL,  INCIDENTAL  OR
+    PUNITIVE  DAMAGES, HOWEVER  CAUSED  AND REGARDLESS  OF  THE THEORY  OF
+    LIABILITY, ARISING  OUT OF  THE USE OF  OR INABILITY TO  USE SOFTWARE,
+    EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+      
+      
+      
+IV. ISO RELAX JARV API to JAXP 1.3 validation API bridge  
+    (isorelax-jaxp-bridge-1.0.jar, isorelax-20030108.jar))
+
+    The MIT License (MIT)
+
+    Copyright (c) 2006 Kohsuke Kawaguchi
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
+    copy of this software and associated documentation files (the "Software"), 
+    to deal in the Software without restriction, including without limitation 
+    the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+    and/or sell copies of the Software, and to permit persons to whom the 
+    Software is furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included 
+    in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+    DEALINGS IN THE SOFTWARE. 
+====================================================================================================
+
+
diff --git a/trunk/NOTICE b/trunk/NOTICE
new file mode 100644
index 0000000..7f161f6
--- /dev/null
+++ b/trunk/NOTICE
@@ -0,0 +1,28 @@
+Apache ODF Toolkit
+
+Copyright 2011-2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions copyright IBM, 2009-2011. All rights reserved.
+Portions copyright Oracle, 2008-2011. All rights reserved.
+
+This product contains Open Document Format(ODF) Schema documents. 
+Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
+
+This product contains MathML XML Schema documents. Copyright (c) 1998-2003
+World Wide Web Consortium (Massachusetts Institute of Technology, European
+Research Consortium for Informatics and Mathematics, Keio University)
+
+This product contains Oracle Multi-Schema XML Validator (MSV).
+under BSD license. Copyright (c) 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
+
+This product contains ISO RELAX JARV API to JAXP 1.3 validation API bridge
+(http://java.net/projects/isorelax-jaxp-bridge). under MIT License (MIT)
+Copyright (c) 2006 Kohsuke Kawaguchi
+
+
+
+
+    
diff --git a/trunk/README.txt b/trunk/README.txt
new file mode 100644
index 0000000..9581bef
--- /dev/null
+++ b/trunk/README.txt
@@ -0,0 +1,143 @@
+====================================================================================
+
+                            Apache ODF Toolkit  
+            <http://incubator.apache.org/odftoolkit/index.html>
+        
+====================================================================================
+
+The Apache ODF Toolkit (incubating) is a set of Java modules that allow programmatic 
+creation, scanning and manipulation of Open Document Format (ISO/IEC 26300 == ODF) 
+documents. Unlike other approaches which rely on runtime manipulation of heavy-weight 
+editors via an automation interface, the ODF Toolkit is lightweight and ideal for 
+server use.
+It's an incubator project of the Apache Software Foundation <http://www.apache.org/>.
+
+The ODF Toolkit consists of four subcomponents:
+
+1. ODFDOM (odfdom-java-*.jar) 
+    This is an Open Document Format (ODF) framework. Its purpose is to provide 
+    an easy, common way to create, access and manipulate ODF files, without 
+    requiring detailed knowledge of the ODF specification. It is designed to 
+    provide the ODF developer community with an easy, lightweight programming API 
+    portable to any object-oriented language.
+    
+2. Simple API (simple-odf-*.jar)
+    The Simple Java API for ODF is an easy-to-use, high-level Java API 
+    for creating, modifying and extracting data from ODF 1.2 documents.
+    It is written in pure Java and does not require that you install any
+    document editor on your system. The Simple Java API for ODF is a high
+    level abstraction of the lower-level ODFDOM API
+
+3. ODF Validator (odfvalidator-*.war)
+    This is a tool that validates Open Document Format (ODF) files and checks them
+    for conformance according to the ODF Standard. ODF Validator is available as an 
+    online service and as a command line tool. This page primarily describes the 
+    command line tool. Please visit web page:
+       http://incubator.apache.org/odftoolkit/conformance/ODFValidator.html
+    for details regarding the online tool.
+
+4. ODF XSLT Runner(xslt-runner-*.jar, xslt-runner-task-*.jar)
+    ODF XSLT Runner is a small Java application that allows you to apply XSLT 
+    stylesheets to XML streams included in ODF packages without extracting them 
+    from the package. It can be used from the command line. A driver to use it 
+    within an Ant build file, ODF XSLT Runner Task, is also available.
+
+
+Getting Started
+===============
+
+The ODF Toolkit is based on Java 5 and uses the Maven 2 <http://maven.apache.org/>
+build system. To build ODF Toolkit, use the following command in this directory:
+
+    mvn clean install
+
+The simplest way to use these modules are just put the jars files in your classpath
+directly. If you are not using maven you can see the versions of the major components for
+your release in CHANGES.txt.
+
+Documentation
+=============
+
+The Home Page for the ODF Toolkit:
+    http://incubator.apache.org/odftoolkit/index.html
+    
+ODFDOM Getting Start Guide:    
+    http://incubator.apache.org/odftoolkit/odfdom/index.html   
+     
+Simple API Getting Start Guide:    
+    http://incubator.apache.org/odftoolkit/simple/gettingstartguide.html    
+       
+Simple API Cookbook:
+    http://incubator.apache.org/odftoolkit/simple/document/cookbook/index.html
+    
+Simple API Demos:
+    http://incubator.apache.org/odftoolkit/simple/demo/index.html
+    
+Simple API Online JavaDoc:
+    http://incubator.apache.org/odftoolkit/simple/document/javadoc/index.html
+    
+ODF Validator Getting Start Guide:   
+    http://incubator.apache.org/odftoolkit/conformance/ODFValidator.html
+    
+ODF XSLT Runner Getting Start Guide:   
+    http://incubator.apache.org/odftoolkit/xsltrunner/ODFXSLTRunner.html     
+    
+    
+License (see also LICENSE.txt)
+==============================
+
+Collective work: Copyright 2011-2014 The Apache Software Foundation.
+
+Licensed to the Apache 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.
+
+Apache ODF Toolkit includes a number of subcomponents with separate copyright
+notices and license terms. Your use of these subcomponents is subject to
+the terms and conditions of the licenses listed in the LICENSE.txt file.
+    
+    
+Mailing Lists
+=============
+
+Discussion about ODF Toolkit takes place on the following mailing lists:
+
+Development Mailing List
+    Subscribe: odf-dev-subscribe@incubator.apache.org
+    Post (after subscription): odf-dev@incubator.apache.org
+    Unsubscribe: odf-dev-unsubscribe@incubator.apache.org
+    Archives
+    (1) Markmail - http://markmail.org/search/+list:org.apache.incubator.odf-dev/
+    (2) Apache - http://mail-archives.apache.org/mod_mbox/incubator-odf-dev/
+
+Users Mailing List
+    Subscribe: odf-users-subscribe@incubator.apache.org
+    Post (after subscription): odf-users@incubator.apache.org
+    Unsubscribe: odf-users-unsubscribe@incubator.apache.org
+    Archives: http://mail-archives.apache.org/mod_mbox/incubator-odf-users/
+
+Notification on all code changes are sent to the following mailing list:
+
+    odf-commits@incubator.apache.org
+
+The mailing lists are open to anyone and publicly archived.
+
+
+Issue Tracker
+=============
+
+If you encounter errors in ODF Toolkit or want to suggest an improvement or
+a new feature, please visit the ODF Toolkit issue tracker at
+https://issues.apache.org/jira/browse/ODFTOOLKIT. There you can also find the
+latest information on known issues and recent bug fixes and enhancements.    
diff --git a/trunk/assemble/bin.xml b/trunk/assemble/bin.xml
new file mode 100644
index 0000000..d425ea6
--- /dev/null
+++ b/trunk/assemble/bin.xml
@@ -0,0 +1,31 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>bin</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}/target/${project.version}-bin/</directory>
+      <outputDirectory>/</outputDirectory>
+    </fileSet>
+  </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/trunk/assemble/doc.xml b/trunk/assemble/doc.xml
new file mode 100644
index 0000000..515ac01
--- /dev/null
+++ b/trunk/assemble/doc.xml
@@ -0,0 +1,32 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>doc</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}/target/${project.version}-docs</directory>
+      <outputDirectory>/</outputDirectory>
+      <useDefaultExcludes>true</useDefaultExcludes>
+    </fileSet>
+  </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/trunk/assemble/src.xml b/trunk/assemble/src.xml
new file mode 100644
index 0000000..d561eba
--- /dev/null
+++ b/trunk/assemble/src.xml
@@ -0,0 +1,36 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>src</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}</directory>
+      <outputDirectory>/</outputDirectory>
+      <excludes>
+        <exclude>**/target/**</exclude>
+        <exclude>**/.*/**</exclude>
+        <exclude>legal/**</exclude>
+      </excludes>
+    </fileSet>
+  </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/trunk/generator/LICENSE.txt b/trunk/generator/LICENSE.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/trunk/generator/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/trunk/generator/README.txt b/trunk/generator/README.txt
new file mode 100644
index 0000000..bb47da1
--- /dev/null
+++ b/trunk/generator/README.txt
@@ -0,0 +1,57 @@
+*************************************************************
+* Schema2template Java Library                              *
+*                                                           *
+*************************************************************
+
+
+About Schema2template
+----------------------
+
+The schema2template library reads arbitrary XML schemata and 
+provides functionality to map their XML model to arbitrary user 
+templates.
+
+The library is build upon two powerful open source tools:
+
+1) Oracle's Multi Schema Validator (MSV)
+Used to read arbitrary XML schema and map them to an internal RelaxNG 
+model.
+
+2) Apache's Velocity Template Engine
+Used as template framework, e.g. to provide scripting within templates.
+
+Within schema2template three common use cases covers with default templates 
+as examples. 
+For a given XML schema (e.g. RelaxNG, DTD, W3C schema) the following can be 
+created:
+
+a) a XML node reference for the given format as HTML file
+
+b) Java sources for a typed DOM tree of the format
+
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
+
+Installation
+-------------
+
+Just put the file odfdom.jar in your classpath. You will
+need Apache Velocity Engine and Sun's Multi Schema Validator (MSV) as well. Get it from
+   http://velocity.apache.org/
+   http://java.net/downloads/msv/releases/
+
+
+Documentation
+--------------
+
+Javadoc can be downloaded from the project's download area:
+   http://
+
+For online documentation please start by reading the project's
+Wiki page
+   http://
diff --git a/trunk/generator/pom.xml b/trunk/generator/pom.xml
new file mode 100644
index 0000000..05d3d25
--- /dev/null
+++ b/trunk/generator/pom.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>odftoolkit</artifactId>
+    <version>0.6.1-incubating</version>
+  </parent>
+
+    <!-- The Basics -->
+    <artifactId>schema2template-pom</artifactId>
+    <version>0.8.10-incubating</version>
+    <packaging>pom</packaging>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <!-- Build Settings -->
+    <build>
+        <defaultGoal>install</defaultGoal>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>2.0.2</version>
+                    <configuration>
+                        <source>1.5</source>
+                        <target>1.5</target>
+                        <meminitial>512m</meminitial>
+                        <maxmem>1024m</maxmem>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.0-beta-9</version>
+                    <configuration>
+                        <!-- Workaround for http://jira.codehaus.org/browse/MGPG-9 -->
+                        <mavenExecutorId>forked-path</mavenExecutorId>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.1.2</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <doctitle>Schema2template</doctitle>
+                    <minmemory>512m</minmemory>
+                    <maxmemory>1024m</maxmemory>
+                    <splitindex>true</splitindex>
+                    <windowtitle>Schema2template v${project.version} - http://incubator.apache.org/odftoolkit/</windowtitle>
+                    <links>
+                        <link>http://download.oracle.com/javase/6/docs/api/</link>
+                    </links>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <attach>true</attach>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+  <!-- Multimodule build -->
+    <modules>
+        <module>schema2template</module>
+        <module>schema2template-maven-plugin</module>
+    </modules>
+    
+    <!-- More Project Information -->
+    <name>XML Schema to Template Mapping Tool: Parent POM</name>
+    <description>Parent project for XML Schema to Template Mapping Tool</description>
+    <url>http://incubator.apache.org/odftoolkit/odfdom/index.html</url>
+    <inceptionYear>2010</inceptionYear>
+    <licenses>
+        <license>
+            <name>Apache 2</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+    </licenses>
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/generator</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/generator</developerConnection>
+        <url>http://svn.apache.org/viewvc/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/generator</url>
+    </scm>
+
+    <profiles>
+    <!-- Profile for deploying to the Sonatype repository, which
+         requires GPG signatures
+         see
+         https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
+         https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven
+         https://issues.sonatype.org/browse/OSSRH-960
+         -->
+        <profile>
+            <id>release</id>
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>                    
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.1</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>            
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+            <!-- <distributionManagement>
+                <site>
+                    <id>odfdom</id>
+                    <name>ODFDOM Java Toolkit Project</name>
+                    <url>dav:https://odftoolkit.org/website/odfdom/${project.version}/codegeneration/schema2template-pom</url>
+                </site>
+            </distributionManagement> -->        
+        </profile>
+    </profiles>
+</project>
diff --git a/trunk/generator/schema2template-maven-plugin/README.txt b/trunk/generator/schema2template-maven-plugin/README.txt
new file mode 100644
index 0000000..c78d7c4
--- /dev/null
+++ b/trunk/generator/schema2template-maven-plugin/README.txt
@@ -0,0 +1 @@
+This is the Maven plugin used by ODFDOM
diff --git a/trunk/generator/schema2template-maven-plugin/pom.xml b/trunk/generator/schema2template-maven-plugin/pom.xml
new file mode 100644
index 0000000..50713ed
--- /dev/null
+++ b/trunk/generator/schema2template-maven-plugin/pom.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>schema2template-pom</artifactId>
+    <version>0.8.10-incubating</version>
+  </parent>
+  
+    <!-- The Basics -->
+    <artifactId>schema2template-maven-plugin</artifactId>
+    <version>0.8.10-incubating</version>
+    <packaging>maven-plugin</packaging>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>schema2template</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <scope>provided</scope>
+            <version>2.0.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+            <scope>provided</scope>
+            <version>2.0.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-artifact</artifactId>
+            <scope>provided</scope>
+            <version>2.0.7</version>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <!-- Build Settings -->
+    <build>
+        <defaultGoal>install</defaultGoal>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <goalPrefix>schema2template</goalPrefix>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <!-- <distributionManagement>
+        <site>
+            <id>odfdom</id>
+            <name>ODFDOM Java Toolkit Project</name>
+            <url>dav:https://odftoolkit.org/website/odfdom/${project.version}/codegeneration/schema2template-maven-plugin</url>
+        </site>
+    </distributionManagement> -->
+
+    <!-- More Project Information -->
+    <name>XML Schema to Template Mapping Tool: Maven2 Plugin</name>
+    <description>Maven Plugin for XML Schema to Template Mapping Tool</description>
+    <url>http://incubator.apache.org/odftoolkit/</url>
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+</project>
diff --git a/trunk/generator/schema2template-maven-plugin/src/main/java/org/odftoolkit/odfdom/schema2template_maven_plugin/CodegenMojo.java b/trunk/generator/schema2template-maven-plugin/src/main/java/org/odftoolkit/odfdom/schema2template_maven_plugin/CodegenMojo.java
new file mode 100644
index 0000000..4228a7e
--- /dev/null
+++ b/trunk/generator/schema2template-maven-plugin/src/main/java/org/odftoolkit/odfdom/schema2template_maven_plugin/CodegenMojo.java
@@ -0,0 +1,155 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2009 Benson I. Margulies. All rights reserved.
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved. 
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.schema2template_maven_plugin;
+
+import java.io.File;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.project.MavenProject;
+import schema2template.example.odf.OdfHelper;
+
+/**
+ * Generate Java code for ODFDOM.
+ * @goal codegen
+ * @phase generate-sources
+ * @description ODFDOM Code Generator
+ * @requiresDependencyResolution compile
+ */
+public class CodegenMojo extends AbstractMojo {
+
+	/**
+	 * @parameter
+	 * @required
+	 */
+	File domResourceRoot;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	String odf12SchemaFile;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	String odf11SchemaFile;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	File pkgResourceRoot;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	String signatureSchemaFile;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	String manifestSchemaFile;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	File targetRoot;
+	
+	/**
+	 * @parameter
+	 * @required
+	 */
+	String configFile;
+	
+	/**
+	 * @parameter expression="${project}"
+	 * @required
+	 */
+	MavenProject project;
+
+	/* (non-Javadoc)
+	 * @see org.apache.maven.plugin.Mojo#execute()
+	 * @goal codegen
+	 */
+	public void execute() throws MojoExecutionException, MojoFailureException {
+		try {
+			getLog().info("Schema2template code generation.");
+			if (configFile == null) {
+				getLog().error("Please set configure file patch.");
+				throw new MojoFailureException("Please set configure file patch.");
+			}
+			if (odf12SchemaFile == null) {
+				getLog().error("Please set odf1.2 schema file patch.");
+				throw new MojoFailureException("Please set schema file patch.");
+			}
+			if (odf11SchemaFile == null) {
+				getLog().error("Please set odf1.1 schema file patch.");
+				throw new MojoFailureException("Please set schema file patch.");
+			}
+			if (signatureSchemaFile == null) {
+				getLog().error("Please set odf1.2 document signature schema file patch.");
+				throw new MojoFailureException("Please set schema file patch.");
+			}
+			if (manifestSchemaFile == null) {
+				getLog().error("Please set odf1.2 manifest schema file patch.");
+				throw new MojoFailureException("Please set schema file patch.");
+			}
+			String targetRootPath = targetRoot.getAbsolutePath();
+			if (targetRootPath == null) {
+				getLog().error("Please set generation code root patch.");
+				throw new MojoFailureException("Please set generation code root patch.");
+			}
+			String domResourceRootPath = domResourceRoot.getAbsolutePath();
+			if (domResourceRootPath == null) {
+				getLog().error("Please set dom templates root patch.");
+				throw new MojoFailureException("Please set templates root patch.");
+			}
+			String pkgResourceRootPath = pkgResourceRoot.getAbsolutePath();
+			if (pkgResourceRootPath == null) {
+				getLog().error("Please set pkg templates root patch.");
+				throw new MojoFailureException("Please set templates root patch.");
+			}
+			getLog().debug("Generation Code Files Root Directory " + targetRootPath);
+			getLog().debug("Config File " + configFile);
+			getLog().debug("Dom Template Files Directory " + domResourceRootPath);
+			getLog().debug("ODF1.2 Schema File " + odf12SchemaFile);
+			getLog().debug("ODF1.1 Schema File " + odf11SchemaFile);
+			getLog().debug("Pkg Template Files Directory " + pkgResourceRootPath);
+			getLog().debug("ODF1.2 Signature Schema File " + signatureSchemaFile);
+			getLog().debug("ODF1.2 Manifest Schema File " + manifestSchemaFile);
+			OdfHelper codeGen = new OdfHelper(domResourceRootPath, odf12SchemaFile, odf11SchemaFile, pkgResourceRootPath, signatureSchemaFile, manifestSchemaFile, targetRootPath, configFile);
+			codeGen.start();
+		} catch (Exception ex) {
+			getLog().error("Failed to parse template.");
+			getLog().error(ex);
+			String msg = "Failed to execute ODF schema2template example";
+			throw new MojoFailureException(ex, msg, msg);
+		}
+
+	}
+}
diff --git a/trunk/generator/schema2template/README.txt b/trunk/generator/schema2template/README.txt
new file mode 100644
index 0000000..a132e55
--- /dev/null
+++ b/trunk/generator/schema2template/README.txt
@@ -0,0 +1 @@
+This project is used by ODFDOM to generated dom layer elements and attributes .
diff --git a/trunk/generator/schema2template/pom.xml b/trunk/generator/schema2template/pom.xml
new file mode 100644
index 0000000..dca36dc
--- /dev/null
+++ b/trunk/generator/schema2template/pom.xml
@@ -0,0 +1,266 @@
+<?xml version="1.0"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>schema2template-pom</artifactId>
+    <version>0.8.10-incubating</version>
+  </parent>
+  
+	<!-- The Basics -->
+	<artifactId>schema2template</artifactId>
+	<version>0.8.10-incubating</version>
+	<packaging>jar</packaging>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.velocity</groupId>
+			<artifactId>velocity</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>net.java.dev.msv</groupId>
+			<artifactId>msv-core</artifactId>
+            <version>2009.1</version>
+		</dependency>
+        <dependency>
+            <groupId>xml-apis</groupId>
+            <artifactId>xml-apis</artifactId>
+        </dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	
+	<!-- Build Settings -->
+	<build>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-webdav-jackrabbit</artifactId>
+				<version>1.0-beta-7</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.3.1</version>
+				<configuration>
+					<archive>
+						<index>true</index>
+						<manifest>
+							<mainClass>schema2template.example.odf.OdfHelper</mainClass>
+						</manifest>
+						<manifestEntries>
+							<version>${project.version}</version>
+						</manifestEntries>
+						<manifestSections>
+							<manifestSection>
+								<name>schema2template</name>
+								<manifestEntries>
+									<Application-Name>schema2template</Application-Name>
+									<Application-Version>${project.version}</Application-Version>
+									<Application-Website>http://incubator.apache.org/odftoolkit/</Application-Website>
+									<Built-By>${user.name}</Built-By>
+									<Built-Date>${build.timestamp}</Built-Date>
+								</manifestEntries>
+							</manifestSection>
+						</manifestSections>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<!-- Explizit version required for fix on systemPropertyVariables -->
+				<version>2.6</version>
+				<configuration>
+					<systemPropertyVariables>
+						<odfdom.version>${project.version}</odfdom.version>
+						<odfdom.timestamp>${build.timestamp}</odfdom.timestamp>
+					</systemPropertyVariables>
+					<excludes>
+						<exclude>**/integrationtest/**</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.0.2</version>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+					<showDeprecation>true</showDeprecation>
+				</configuration>
+			</plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>src/test/resources/examples/odf/*.ref</exclude>
+						<exclude>src/main/resources/examples/odf/odfdom-python/OdfTextDocument.odt</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+      			<groupId>org.codehaus.mojo</groupId>
+      			<artifactId>wagon-maven-plugin</artifactId>
+      			<version>1.0-beta-3</version>
+      			<executions>
+        			<execution>
+          				<id>download-odf-schema-v1.2</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+            				<fromFile>os/OpenDocument-v1.2-os-schema.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+        			<execution>
+          				<id>download-odf-manifest-schema-v1.2</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+            				<fromFile>os/OpenDocument-v1.2-os-manifest-schema.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+        			<execution>
+          				<id>download-odf-dsig-schema-v1.2</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+            				<fromFile>os/OpenDocument-v1.2-os-dsig-schema.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+        			<execution>
+          				<id>download-odf-schema-v1.1</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://docs.oasis-open.org/office/v1.1</url>
+            				<fromFile>OS/OpenDocument-schema-v1.1.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+        			<execution>
+          				<id>download-odf-strict-schema-v1.1</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://docs.oasis-open.org/office/v1.1</url>
+            				<fromFile>OS/OpenDocument-strict-schema-v1.1.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+        			<execution>
+          				<id>download-odf-schema-v1.0</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://www.oasis-open.org/committees/download.php/12571</url>
+            				<fromFile>OpenDocument-schema-v1.0-os.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+        			<execution>
+          				<id>download-odf-strict-schema-v1.0</id>
+          				<phase>process-resources</phase>
+          				<goals>
+            				<goal>download-single</goal>
+          				</goals>
+          				<configuration>
+            				<url>dav:http://www.oasis-open.org/committees/download.php/12569</url>
+            				<fromFile>OpenDocument-strict-schema-v1.0-os.rng</fromFile>
+            				<toDir>${project.build.directory}/odf-schemas</toDir>
+          				</configuration>
+        			</execution>
+      			</executions>
+    		</plugin>
+		</plugins>
+	</build>
+	<!-- <distributionManagement>
+		<site>
+			<id>odfdom</id>
+			<name>ODFDOM Java Toolkit Project</name>
+			<url>dav:https://odftoolkit.org/website/odfdom/${project.version}/codegeneration/schema2template</url>
+		</site>
+	</distributionManagement> -->
+	<reporting>
+		<plugins>
+			<plugin>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<doctitle>Schema2template</doctitle>
+					<minmemory>512m</minmemory>
+					<maxmemory>1024m</maxmemory>
+					<links>
+						<link>http://download.oracle.com/javase/6/docs/api/</link>
+					</links>
+					<splitindex>true</splitindex>
+					<windowtitle>Schema2template v${project.version} - http://incubator.apache.org/odftoolkit/</windowtitle>
+				</configuration>
+			</plugin>
+
+			<!-- Code Coverage Testing generated by Cobertura -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>cobertura-maven-plugin</artifactId>
+				<version>2.4</version>
+				<configuration>
+					<instrumentation>
+						<excludes>
+							<exclude>org/odftoolkit/**/*Test.class</exclude>
+						</excludes>
+					</instrumentation>
+				</configuration>
+			</plugin>
+		</plugins>
+	</reporting>
+
+	<!-- More Project Information -->
+	<name>XML Schema to Template Mapping Tool: Library</name>
+	<description>XML Schema to Template Mapping Tool: Library</description>
+	<organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+</project>
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/OutputFileListEntry.java b/trunk/generator/schema2template/src/main/java/schema2template/OutputFileListEntry.java
new file mode 100644
index 0000000..b769b1b
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/OutputFileListEntry.java
@@ -0,0 +1,107 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Belongs to FileListHandler. Represents one single entry in ouput filelist.
+ *
+ * @author Hans-Peter Schaal
+ */
+public class OutputFileListEntry {
+
+    /**
+     * Type of filelist entry (file or path)
+     */
+    public enum EntryType {
+        FILE, PATH;
+    }
+
+    private EntryType mType;
+    private Map<String, String> mAttributes;
+    private int mLinenumber;
+
+    /**
+     * @param type Use FilelistEntry.EntryType.[FILE|PATH]
+     */
+    public OutputFileListEntry(EntryType type) {
+        this(type, -1);
+    }
+
+    /**
+     * @param type Use FilelistEntry.EntryType.[FILE|PATH]
+     * @param lineNumber number in filelist.xml for logging / error output.
+     */
+    public OutputFileListEntry(EntryType type, int lineNumber) {
+        mType = type;
+        mAttributes = new HashMap<String, String>();
+        mLinenumber = lineNumber;
+    }
+
+    /**
+     * @return the entry type
+     */
+    public EntryType getType() {
+        return mType;
+    }
+
+    /**
+     * @return line number in filelist.xml for logging / error output.
+     */
+    public int getLineNumber() {
+        return mLinenumber;
+    }
+
+    /**
+     * @param key Attribute Key
+     * @return Attribute Value
+     */
+    public String getAttribute(String key) {
+        return mAttributes.get(key);
+    }
+
+    /**
+     * @return Attributes as map
+     */
+    public Map<String, String> getAttributes() {
+        return mAttributes;
+    }
+
+    /**
+     * @param key Attribute Key
+     * @param value Attribute Value. If null, delete the key.
+     */
+    public void setAttribute(String key, String value) {
+        if (key == null) {
+            return;
+        }
+        if (value == null) {
+            mAttributes.remove(key);
+        }
+        else {
+            mAttributes.put(key, value);
+        }
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/OutputFileListHandler.java b/trunk/generator/schema2template/src/main/java/schema2template/OutputFileListHandler.java
new file mode 100644
index 0000000..a20baae
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/OutputFileListHandler.java
@@ -0,0 +1,112 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * If a template should be used multiple times (e.g. for every element of the schema),
+ * For every file we create a line will be created.
+ * This class parses this list of the output files to be created.</code>
+ *
+ */
+public class OutputFileListHandler extends DefaultHandler {
+
+    List<OutputFileListEntry> mFilelist;
+    boolean mOpenFlTag = false;
+    boolean mOpenFileTag = false;
+    boolean mOpenPathTag = false;
+    Locator mLocator;
+
+    OutputFileListHandler(List<OutputFileListEntry> fl) {
+        mFilelist = fl;
+    }
+
+	/** With the DocumentLocator line numbers will be received during errors */
+    @Override
+    public void setDocumentLocator(Locator locator) {
+        mLocator = locator;
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+        if (qName.equals("filelist") && !mOpenFlTag) {
+            mOpenFlTag = true;
+            return;
+        }
+        if (qName.equals("file") && mOpenFlTag && !mOpenFileTag && !mOpenPathTag) {
+            mOpenFileTag = true;
+            OutputFileListEntry entry = new OutputFileListEntry(OutputFileListEntry.EntryType.FILE, mLocator.getLineNumber());
+            String mandatoryPath = attributes.getValue("path");
+            if (mandatoryPath == null) throw new SAXException("Mandatory attribute path is missing for file element in line " + mLocator.getLineNumber() + ".");
+            entry.setAttribute("path", mandatoryPath);
+            entry.setAttribute("context", attributes.getValue("context"));
+            entry.setAttribute("param", attributes.getValue("param"));
+            entry.setAttribute("template", attributes.getValue("template"));
+            mFilelist.add(entry);
+            return;
+        }
+        if (qName.equals("path") && mOpenFlTag && !mOpenFileTag && !mOpenPathTag) {
+            mOpenPathTag = true;
+            OutputFileListEntry entry = new OutputFileListEntry(OutputFileListEntry.EntryType.PATH, mLocator.getLineNumber());
+            String mandatoryPath = attributes.getValue("path");
+            if (mandatoryPath == null) throw new SAXException("Mandatory attribute path is missing for path element in line " + mLocator.getLineNumber() + ".");
+            entry.setAttribute("path", mandatoryPath);
+            entry.setAttribute("path", mandatoryPath);
+            mFilelist.add(entry);
+            return;
+        }
+        throw new SAXException("Malformed filelist");
+    }
+
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        if (qName.equals("filelist") && mOpenFlTag && !mOpenFileTag && !mOpenPathTag) {
+            mOpenFlTag = false;
+            return;
+        }
+        if (qName.equals("file") && mOpenFlTag && mOpenFileTag && !mOpenPathTag) {
+            mOpenFileTag = false;
+            return;
+        }
+        if (qName.equals("path") && mOpenFlTag && mOpenPathTag && !mOpenFileTag) {
+            mOpenPathTag = false;
+            return;
+        }
+        throw new SAXException("Malformed filelist");
+    }
+
+    public static List<OutputFileListEntry> readFileListFile(File flf) throws Exception {
+        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
+        List<OutputFileListEntry> retval = new ArrayList<OutputFileListEntry>();
+        parser.parse(flf, new OutputFileListHandler(retval));
+        return retval;
+    }
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfConfigFileHandler.java b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfConfigFileHandler.java
new file mode 100644
index 0000000..a337e1f
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfConfigFileHandler.java
@@ -0,0 +1,222 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Often Process the custom configuration data .xml
+ * Liest nur die config.xml
+ * Soll man die Konfiguration in einer behalten, oder aufsplitten!
+ * Java speczifische + anderes aufteilen
+ * Handler für existierende config.xml
+ */
+class OdfConfigFileHandler extends DefaultHandler {
+
+    private boolean inConfig = false;
+    private boolean inElements = false;
+    private boolean inElement = false;
+    private boolean inDatatypes = false;
+    private boolean inData = false;
+    private boolean inAttributes = false;
+    private boolean inAttribute = false;
+    private Locator mLocator;
+    private Map<String, String> mElementBaseNames;
+    private Map<String, List<String>> mElementStyleFamilies;
+    private Set<String> mProcessedElements;
+    private Map<String, String[]> mDatatypeValueConversion; // Datatype -> {value-type, conversion-classname}
+    private Map<String, OdfModel.AttributeDefaults> mAttributeDefaultMap;     // Attributename -> {elementname or null, defaultvalue}
+    private Set<String> mProcessedDatatypes;
+
+    public OdfConfigFileHandler(Map<String, String> elementBaseNames, Map<String, OdfModel.AttributeDefaults> attributeDefaultMap,
+            Map<String, List<String>> elementStyleFamilies, Map<String, String[]> datatypeValueConversion) {
+        mElementBaseNames = elementBaseNames;
+        mAttributeDefaultMap = attributeDefaultMap;
+        mDatatypeValueConversion = datatypeValueConversion;
+        mElementStyleFamilies = elementStyleFamilies;
+        mProcessedElements = new HashSet<String>();
+        mProcessedDatatypes = new HashSet<String>();
+    }
+
+    private void createElementConfig(Attributes attrs) throws SAXException {
+        String name = attrs.getValue("name");
+        if (name == null) {
+            throw new SAXException("Invalid element line " + mLocator.getLineNumber());
+        }
+        if (mProcessedElements.contains(name)) {
+            throw new SAXException("Multiple definition of element in line " + mLocator.getLineNumber());
+        }
+        mProcessedElements.add(name);
+        String base = attrs.getValue("base");
+        if (base != null && base.length() > 0) {
+            mElementBaseNames.put(name, base);
+        }
+        String commaSeparatedStyleFamilies = attrs.getValue("family");
+        if (commaSeparatedStyleFamilies != null) {
+            StringTokenizer tok = new StringTokenizer(commaSeparatedStyleFamilies, ",");
+            List<String> families = new ArrayList<String>();
+            while (tok.hasMoreElements()) {
+                String family = tok.nextToken();
+                if (family.length() > 0) {
+                    families.add(family);
+                }
+            }
+            if (families.size() > 0) {
+                mElementStyleFamilies.put(name, families);
+            }
+        }
+    }
+
+    private void createDatatypeConfig(Attributes attrs) throws SAXException {
+        String name = attrs.getValue("name");
+        if (name == null) {
+            throw new SAXException("Invalid datatype line " + mLocator.getLineNumber());
+        }
+        if (mProcessedDatatypes.contains(name)) {
+            throw new SAXException("Multiple definition of datatype in line " + mLocator.getLineNumber());
+        }
+        mProcessedDatatypes.add(name);
+        String[] tuple = new String[2];
+        tuple[0] = attrs.getValue("value-type");
+        tuple[1] = attrs.getValue("conversion-type");
+        mDatatypeValueConversion.put(name, tuple);
+    }
+
+    private void createAttributeConfig(Attributes attrs) throws SAXException {
+        String name = attrs.getValue("name");
+        if (name == null) {
+            throw new SAXException("Invalid attribute line " + mLocator.getLineNumber());
+        }
+
+        String elementname = attrs.getValue("element");
+        String defaultvalue = attrs.getValue("defaultValue");
+        OdfModel.AttributeDefaults defaults = mAttributeDefaultMap.get(name);
+        if (defaults == null) {
+            defaults = new OdfModel.AttributeDefaults();
+            mAttributeDefaultMap.put(name, defaults);
+        }
+        defaults.addDefault(elementname, defaultvalue);
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+        if (qName.equals("config") && !inConfig) {
+            inConfig = true;
+            return;
+        }
+        if (qName.equals("elements") && inConfig && !inElements) {
+            inElements = true;
+            return;
+        }
+        if (qName.equals("element") && inElements && !inElement) {
+            inElement = true;
+            createElementConfig(attributes);
+            return;
+        }
+        if (qName.equals("attributes") && inConfig && !inAttributes) {
+            inAttributes = true;
+            return;
+        }
+        if (qName.equals("attribute") && inAttributes && !inAttribute) {
+            inAttribute = true;
+            createAttributeConfig(attributes);
+            return;
+        }
+        if (qName.equals("data-types") && inConfig && !inDatatypes) {
+            inDatatypes = true;
+            return;
+        }
+        if (qName.equals("data") && inDatatypes && !inData) {
+            inData = true;
+            createDatatypeConfig(attributes);
+            return;
+        }
+
+        throw new SAXException("Malformed config.xml in line " + mLocator.getLineNumber());
+    }
+
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        if (qName.equals("config") && inConfig) {
+            inConfig = false;
+            return;
+        }
+        if (qName.equals("elements") && inElements) {
+            inElements = false;
+            return;
+        }
+        if (qName.equals("element") && inElement) {
+            inElement = false;
+            return;
+        }
+        if (qName.equals("attributes") && inAttributes) {
+            inAttributes = false;
+            return;
+        }
+        if (qName.equals("attribute") && inAttribute) {
+            inAttribute = false;
+            return;
+        }
+        if (qName.equals("data-types") && inDatatypes) {
+            inDatatypes = false;
+            return;
+        }
+        if (qName.equals("data") && inData) {
+            inData = false;
+            return;
+        }
+
+        throw new SAXException("Malformed config.xml in line " + mLocator.getLineNumber());
+    }
+
+    @Override
+    public void setDocumentLocator(Locator locator) {
+        mLocator = locator;
+    }
+
+    /**
+     * Read config.xml. Input Convention: Input empty Maps, Maps will be filled.
+     *
+     * @param cf Config file
+     */
+    public static void readConfigFile(File cf, Map<String, String> elementBaseNames, 
+            Map<String, OdfModel.AttributeDefaults> attributeDefaults, Map<String, List<String>> elementStyleFamilies,
+            Map<String, String[]> datatypeValueConversion) throws Exception {
+
+        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
+        parser.parse(cf, new OdfConfigFileHandler(elementBaseNames, attributeDefaults, elementStyleFamilies, datatypeValueConversion));
+
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java
new file mode 100644
index 0000000..ea0accd
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java
@@ -0,0 +1,361 @@
+/**
+ * **********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ***********************************************************************
+ */
+package schema2template.example.odf;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.List;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+
+import schema2template.OutputFileListEntry;
+import schema2template.OutputFileListHandler;
+import schema2template.model.XMLModel;
+
+import com.sun.msv.grammar.Expression;
+import com.sun.msv.reader.trex.ng.RELAXNGReader;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Three ODF examples in one:
+ *  1) Create an ODF Reference in HTMLl
+ *  2) Create Source Code
+ *  3) Create simple ODF Python source
+ *
+ */
+public class OdfHelper {
+
+	private static final Logger LOG = Logger.getLogger(OdfHelper.class.getName());
+	public static final Boolean DEBUG = Boolean.FALSE;
+	/** Expresses the amount of elements in ODF 1.1. There are some issues in the schema that have to be fixed before the full number can be returned by MSV:
+	Reference table-table-template is never used, therefore several elements are not taking into account::
+	"table:body"
+	"table:even-columns"
+	"table:even-rows"
+	"table:first-column"
+	"table:first-row"
+	"table:last-column"
+	"table:last-row"
+	"table:odd-columns"
+	"table:odd-rows"
+	"table:table-template"
+	NOTE: Ignoring the '*' there can be 525 elements parsed, but with fixed schema it should be 535. */
+	public static final int ODF11_ELEMENT_NUMBER = 525; //ToDo: 535 - by search/Replace using RNGSchema and tools, prior exchange <name> to element or attribute declaration
+	public static final int ODF12_ELEMENT_NUMBER = 598;
+	/** Expresses the amount of attributes in ODF 1.1. There are some issues in the schema that have to be fixed before the full number can be returned by MSV:
+	Following references are never used, therefore its attribute is not taking into account::
+	draw-glue-points-attlist	with "draw:escape-direction"
+	office-process-content		with "office:process-content" (DEPRECATED in ODF1.2 only on foreign elements)
+
+	Following attributes are member of the not referenced element "table:table-template":
+	"text:first-row-end-column"
+	"text:first-row-start-column"
+	"text:last-row-end-column"
+	"text:last-row-start-column"
+	"text:paragraph-style-name"
+
+	NOTE: Ignoring the '*' there can be 1162 elements parsed, but with fixed schema it should be 1169. */
+	public static final int ODF11_ATTRIBUTE_NUMBER = 1162; //ToDo: 1169 - by search/Replace using RNGSchema and tools, prior exchange <name> to element or attribute declaration
+	public static final int ODF12_ATTRIBUTE_NUMBER = 1300; //in RNG 1301 as there is one deprecated attribute on foreign elements not referenced (ie. @office:process-content)
+	private static String odfDomResourceDir;
+	private static String odfPkgResourceDir;
+	private static String odfPythonResourceDir;
+	private static String odfReferenceResourceDir;
+	private static String outputRoot;
+	public static final String INPUT_ROOT = "target" + File.separator + "odf-schemas";
+	public static final String TEST_REFERENCE_DIR = "target" + File.separator + "test-classes" + File.separator
+			+ "examples" + File.separator + "odf";
+	public static final String TEST_INPUT_ROOT = "target" + File.separator + "classes" + File.separator
+			+ "examples" + File.separator + "odf";
+	public static final String ODF10_RNG_FILE_NAME = "OpenDocument-strict-schema-v1.0-os.rng";
+	public static final String ODF11_RNG_FILE_NAME = "OpenDocument-strict-schema-v1.1.rng";
+	public static final String ODF12_RNG_FILE_NAME = "OpenDocument-v1.2-os-schema.rng";
+	public static final String ODF12_SIGNATURE_RNG_FILE_NAME = "OpenDocument-v1.2-os-dsig-schema.rng";
+	public static final String ODF12_MANIFEST_RNG_FILE_NAME = "OpenDocument-v1.2-os-manifest-schema.rng";
+	static String odf12RngFile;
+	static String odf12SignatureRngFile;
+	static String odf12ManifestRngFile;
+	static String odf11RngFile;
+	static String odf10RngFile;
+	private static String mConfigFile;
+	private static final String REFERENCE_OUTPUT_FILES_TEMPLATE = "dom-output-files.vm";
+	private static final String REFERENCE_OUTPUT_FILES = "target" + File.separator + "reference-output-files.xml";
+	private static final String PYTHON_OUTPUT_FILES_TEMPLATE = "dom-output-files.vm";
+	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 XMLModel mOdf12SignatureSchemaModel;
+	private static XMLModel mOdf12ManifestSchemaModel;
+	private static XMLModel mOdf12SchemaModel;
+	private static XMLModel mOdf11SchemaModel;
+	private static OdfModel mOdfModel;
+	private static SourceCodeModel mJavaModel;
+	private static Expression mOdf12SignatureRoot;
+	private static Expression mOdf12ManifestRoot;
+	private static Expression mOdf12Root;
+	private static Expression mOdf11Root;
+
+	public OdfHelper(String domResourceRoot, String odf12SchemaFile, String odf11SchemaFile, String pkgResourceRoot, String odf12SignatureSchemaFile, String odf12ManifestSchemaFile, String targetRoot, String configFile) {
+		odfDomResourceDir = domResourceRoot;
+		odf12RngFile = odf12SchemaFile;
+		odf11RngFile = odf11SchemaFile;
+		odfPkgResourceDir = pkgResourceRoot;
+		odf12SignatureRngFile = odf12SignatureSchemaFile;
+		odf12ManifestRngFile = odf12ManifestSchemaFile;
+		outputRoot = targetRoot;
+		mConfigFile = configFile;
+	}
+
+	static {
+		odfDomResourceDir = TEST_INPUT_ROOT + File.separator + "odfdom-java" + File.separator + "dom";
+		odfPkgResourceDir = TEST_INPUT_ROOT + File.separator + "odfdom-java" + File.separator + "pkg";
+		odfPythonResourceDir = TEST_INPUT_ROOT + File.separator + "odfdom-python";
+		odfReferenceResourceDir = TEST_INPUT_ROOT + File.separator + "odf-reference";
+		odf12SignatureRngFile = INPUT_ROOT + File.separator + ODF12_SIGNATURE_RNG_FILE_NAME;
+		odf12ManifestRngFile = INPUT_ROOT + File.separator + ODF12_MANIFEST_RNG_FILE_NAME;
+		odf12RngFile = INPUT_ROOT + File.separator + ODF12_RNG_FILE_NAME;
+		odf11RngFile = INPUT_ROOT + File.separator + ODF11_RNG_FILE_NAME;
+		odf10RngFile = INPUT_ROOT + File.separator + ODF10_RNG_FILE_NAME;
+		outputRoot = "target";
+		mConfigFile = TEST_INPUT_ROOT + File.separator + "config.xml";
+	}
+
+	public void start() throws Exception {
+		LOG.info("Starting code generation:");
+		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);
+	}
+
+	public static void main(String[] args) throws Exception {
+		LOG.info("Starting code generation:");
+		initialize();
+
+		// ODF 1.2 HTML Reference (yet without BNF nor images)
+		fillTemplates(odfReferenceResourceDir, mOdf12Root, REFERENCE_OUTPUT_FILES_TEMPLATE, REFERENCE_OUTPUT_FILES);
+		// 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);
+
+		// 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);
+	}
+
+	private static void initialize() throws Exception {
+		LOG.info("Starting initilization..");
+		// calling MSV to parse the ODF 1.2 DSIG RelaxNG, returning a tree
+		mOdf12SignatureRoot = loadSchema(new File(odf12SignatureRngFile));
+		// calling MSV to parse the ODF 1.2 Manifest RelaxNG, returning a tree
+		mOdf12ManifestRoot = loadSchema(new File(odf12ManifestRngFile));
+		// calling MSV to parse the ODF 1.2 RelaxNG, returning a tree
+		mOdf12Root = loadSchema(new File(odf12RngFile));
+		// calling MSV to parse the ODF 1.1 RelaxNG, returning a tree
+		mOdf11Root = loadSchema(new File(odf11RngFile));
+
+		// Read config.xml 2DO WHAT IS ODFDOM GENERATOR CONFIG FILE
+		// Manual added Java specific info - Base class for inheritance
+		Map<String, String> elementToBaseNameMap = new HashMap<String, String>();
+		// Manual added ODF specific info - style family mapping
+		Map<String, List<String>> elementStyleFamiliesMap = new HashMap<String, List<String>>();
+		// 2DO - still existent? -- Manual added Java specific info - mapping ODF datatype to Java datatype  -> {odfValueType, javaConversionClassName}
+		Map<String, String[]> datatypeValueAndConversionMap = new HashMap<String, String[]>();
+		Map<String, OdfModel.AttributeDefaults> attributeDefaultMap = new HashMap<String, OdfModel.AttributeDefaults>();
+		OdfConfigFileHandler.readConfigFile(new File(mConfigFile), elementToBaseNameMap, attributeDefaultMap, elementStyleFamiliesMap, datatypeValueAndConversionMap);
+
+		mOdf12SignatureSchemaModel = new XMLModel(mOdf12SignatureRoot);
+		mOdf12ManifestSchemaModel = new XMLModel(mOdf12ManifestRoot);
+		mOdf12SchemaModel = new XMLModel(mOdf12Root);
+		mOdf11SchemaModel = new XMLModel(mOdf11Root);
+		mOdfModel = new OdfModel(elementStyleFamiliesMap, attributeDefaultMap);
+		// Needed for the base classes - common attributes are being moved into the base classes
+		mJavaModel = new SourceCodeModel(mOdf12SchemaModel, mOdf12SignatureSchemaModel, mOdf12ManifestSchemaModel, mOdfModel, elementToBaseNameMap, datatypeValueAndConversionMap);
+		LOG.info("Finished initilization..");
+	}
+
+	private static void fillTemplates(String sourceDir, Expression root, String outputRuleTemplate, String outputRuleFile) throws Exception {
+		// intialising template engine (ie. Velocity)
+		Properties props = new Properties();
+		props.setProperty("file.resource.loader.path", sourceDir);
+		VelocityEngine ve = new VelocityEngine(props);
+		ve.init();
+
+		// Create output-files.xml
+		createOutputFileList(ve, outputRuleTemplate, outputRuleFile);
+		LOG.info("output-files.xml created done.");
+
+		// Process output-files.xml, create output files
+		LOG.fine("Processing output files... ");
+		processFileList(ve, root, outputRuleFile);
+		LOG.fine("DONE.\n");
+	}
+
+	/**
+	 * Load and parse the ODF 1.0 Schema.
+	 *
+	 * @return MSV Expression Tree of ODF 1.0 RelaxNG schema (more specific: The
+	 * tree's MSV root expression)
+	 * @throws Exception
+	 */
+	public static Expression loadSchemaODF10() throws Exception {
+		return loadSchema(new File(odf10RngFile));
+	}
+
+	/**
+	 * Load and parse the ODF 1.1 Schema.
+	 *
+	 * @return MSV Expression Tree of ODF 1.1 RelaxNG schema (more specific: The
+	 * tree's MSV root expression)
+	 * @throws Exception
+	 */
+	public static Expression loadSchemaODF11() throws Exception {
+		return loadSchema(new File(odf11RngFile));
+	}
+
+	/**
+	 * Load and parse the ODF 1.2 Schema.
+	 *
+	 * @return MSV Expression Tree of ODF 1.2 RelaxNG schema (more specific: The
+	 * tree's MSV root expression)
+	 * @throws Exception
+	 */
+	public static Expression loadSchemaODF12() throws Exception {
+		return loadSchema(new File(odf12RngFile));
+	}
+
+	/**
+	 * Load and parse a Schema from File.
+	 *
+	 * @param rngFile
+	 * @return MSV Expression Tree (more specific: The tree's MSV root
+	 * expression)
+	 * @throws Exception
+	 */
+	public static Expression loadSchema(File rngFile) throws Exception {
+		SAXParserFactory factory = SAXParserFactory.newInstance();
+		factory.setNamespaceAware(true);
+		// 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();
+
+
+		if (root == null) {
+			throw new Exception("Schema could not be parsed.");
+		}
+		return root;
+	}
+
+	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);
+		context.put("context", contextStr);
+		context.put("param", param);
+		return context;
+	}
+
+	private static void createOutputFileList(VelocityEngine ve, String template, String output) throws Exception {
+		VelocityContext context = getContext(null, null);
+		File parentPatch = new File(output).getParentFile();
+		if (!parentPatch.exists()) {
+			parentPatch.mkdirs();
+		}
+		FileWriter listout = new FileWriter(new File(output));
+		String encoding = "utf-8";
+		ve.mergeTemplate(template, encoding, context, listout);
+		listout.close();
+	}
+
+	private static String generateFilename(String rawName) {
+		String retFilePath = null;
+		StringTokenizer toktok = new StringTokenizer(rawName.replaceAll(":", "_"), "/");
+		if (toktok.hasMoreTokens()) {
+			File retfile = null;
+			retfile = new File(toktok.nextToken());
+			while (toktok.hasMoreTokens()) {
+				retfile = new File(retfile, toktok.nextToken());
+			}
+			retFilePath = retfile.getPath();
+		}
+		return retFilePath;
+	}
+
+	private static void ensureParentFolders(File newFile) {
+		File parent = newFile.getParentFile();
+		if (parent != null && !parent.exists()) {
+			try {
+				parent.mkdirs();
+			} catch (Exception e) {
+				LOG.log(Level.WARNING, "Could not create parent directory {0}", parent.getAbsolutePath());
+			}
+		}
+	}
+
+	public static void processFileList(VelocityEngine ve, Expression root, String outputRuleFile) throws Exception {
+		File outputFiles = new File(outputRuleFile);
+		List<OutputFileListEntry> fl = OutputFileListHandler.readFileListFile(outputFiles);
+
+		for (OutputFileListEntry f : fl) {
+			switch (f.getType()) {
+				case PATH:
+					break;
+				case FILE:
+					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");
+					}
+
+					File out = new File(outputRoot + File.separator + generateFilename(f.getAttribute("path"))).getCanonicalFile();
+					ensureParentFolders(out);
+					FileWriter fileout = new FileWriter(out);
+					String encoding = "utf-8";
+
+					ve.mergeTemplate(f.getAttribute("template"), encoding, context, fileout);
+					fileout.close();
+					break;
+			}
+		}
+	}
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfModel.java b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfModel.java
new file mode 100644
index 0000000..6020083
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/OdfModel.java
@@ -0,0 +1,160 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import schema2template.model.QNamed;
+import schema2template.model.QNameValue;
+
+/**
+ * Model for ODF specific enhancements.
+ * For example, these might be style families used for ODF elements or attribute default values.
+ */
+public class OdfModel {
+
+    /**
+     * This inner class is not meant for use in templates.
+     */
+    static class AttributeDefaults {
+        private Map<String, String> elementDefault = new HashMap<String, String>();
+
+        public void addDefault(String defaultvalue) {
+            addDefault(null, defaultvalue);
+        }
+
+        public void addDefault(String elementname, String defaultvalue) {
+            elementDefault.put(elementname, defaultvalue);
+        }
+
+        public String getDefault() {
+            return getDefault(null);
+        }
+
+        public String getDefault(String elementname) {
+            String retval = elementDefault.get(elementname);
+            // Fallback: Look for global default
+            if (retval == null && elementname != null) {
+                retval = elementDefault.get(null);
+            }
+            return retval;
+        }
+        
+        public Set<String> getDefaults() {
+        	Set<String> defaults=new HashSet<String>();
+        	for(String elementname : elementDefault.keySet()){
+        		String retval = elementDefault.get(elementname);
+        		if(retval!=null){
+        			defaults.add(retval);
+        		}
+        	}
+            return defaults;
+        }
+    }
+
+    Map<String, List<String>> mNameToFamiliesMap;
+    Map<String, AttributeDefaults> mNameToDefaultsMap;
+
+    public OdfModel(Map<String, List<String>> nameToFamiliesMap, Map<String, AttributeDefaults> attributeDefaults) {
+        mNameToFamiliesMap = nameToFamiliesMap;
+        mNameToDefaultsMap = attributeDefaults;
+    }
+
+    /**
+     * Determine whether an ELEMENT is stylable (a.k.a. has at least one
+     * defined style family). Note: All Definitions sharing the same name share
+     * the same style families.
+     *
+     * @param element Element
+     * @return whether there are style families defined for this Definition
+     */
+    public boolean isStylable(QNamed element) {
+        return mNameToFamiliesMap.containsKey(element.getQName());
+    }
+
+    /**
+     * Get defined style families for this ELEMENT Definition. Note: All Definitions sharing
+     * the same name share the same style families.
+     * 
+     * @param element Element
+     * @return list of style family names
+     */
+    public List<QNamed> getStyleFamilies(QNamed element) {
+        List<QNamed> retval = new ArrayList<QNamed>();
+        for (String family : mNameToFamiliesMap.get(element.getQName())) {
+            retval.add(new QNameValue(family)); 
+        }
+        return retval;
+    }
+
+    /**
+     * Get all defined style family names
+     *
+     * @return SortedSet of Style Family Names
+     */
+    public SortedSet<QNamed> getStyleFamilies() {
+        Iterator<List<String>> iter = mNameToFamiliesMap.values().iterator();
+        List<QNamed> families = new ArrayList<QNamed>();
+        while (iter.hasNext()) {
+            for (String family : iter.next()) {
+                families.add(new QNameValue(family));
+            }
+        }
+        return new TreeSet<QNamed>(families);
+    }
+
+    /**
+     * Get default value of ODF attribute, depending on the ODF element which contains this attribute.
+     *
+     * @param attribute Attribute
+     * @param parentelement Parent element
+     * @return Default value for attribute of parent
+     */
+    public String getDefaultAttributeValue(QNamed attribute, QNamed parentelement) {
+        AttributeDefaults defaults = mNameToDefaultsMap.get(attribute.getQName());
+        if (defaults == null) {
+            return null;
+        }
+        return defaults.getDefault(parentelement.getQName());
+    }
+    
+    /**
+     * Get default values of ODF attribute.
+     *
+     * @param attribute Attribute
+     * @return Default values for attribute
+     */
+    public Set<String> getDefaultAttributeValues(QNamed attribute) {
+        AttributeDefaults defaults = mNameToDefaultsMap.get(attribute.getQName());
+        if (defaults == null) {
+            return null;
+        }
+        return defaults.getDefaults();
+    }
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/example/odf/PathPrinter.java b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/PathPrinter.java
new file mode 100644
index 0000000..f12c109
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/PathPrinter.java
@@ -0,0 +1,199 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import com.sun.msv.grammar.Expression;
+import com.sun.msv.grammar.NameClassAndExpression;
+import com.sun.msv.reader.trex.ng.RELAXNGReader;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.xml.parsers.SAXParserFactory;
+import schema2template.model.PuzzlePiece;
+import schema2template.model.PuzzlePieceSet;
+import schema2template.model.MSVExpressionInformation;
+import schema2template.model.MSVExpressionType;
+import schema2template.model.MSVExpressionVisitorType;
+import schema2template.model.MSVNameClassVisitorList;
+
+/**
+ * ODF example class to print the MSV expressions in between a PuzzlePiece parent element
+ * and a direct PuzzlePiece child element.
+ *
+ * <p>Example of a direct child: table:table -&gt; table:table-row<br />
+ * Example of a non-direct child: table:table -&gt; table:table-cell</p>
+ *
+ * <p>Directly change the string constants EXAMPLE_PARENT and EXAMPLE_CHILD in
+ * the source code to set parent and child element.</p>
+ */
+public class PathPrinter {
+
+    // CHANGE THIS...
+    public final static String EXAMPLE_PARENT = "table:table";
+    public final static String EXAMPLE_CHILD = "table:table-row";
+    PuzzlePiece mParent;
+    MSVExpressionInformation mInfo;
+    public final static String ODF_RESOURCE_DIR = "target" + File.separator + "classes"
+	+ File.separator + "examples" + File.separator + "odf";
+
+    PathPrinter(PuzzlePiece parent) {
+        mParent = parent;
+        mInfo = new MSVExpressionInformation(parent.getExpression());
+    }
+
+    /**
+     * Map Name to PuzzlePiece(s).
+     */
+    static Map<String, SortedSet<PuzzlePiece>> createDefinitionMap(Set<PuzzlePiece> definitions) {
+        Map<String, SortedSet<PuzzlePiece>> retval = new HashMap<String, SortedSet<PuzzlePiece>>();
+        Iterator<PuzzlePiece> iter = definitions.iterator();
+        while (iter.hasNext()) {
+            PuzzlePiece def = iter.next();
+            SortedSet<PuzzlePiece> multiples = retval.get(def.getQName());
+            if (multiples == null) {
+                multiples = new TreeSet<PuzzlePiece>();
+                retval.put(def.getQName(), multiples);
+            }
+            multiples.add(def);
+        }
+        return retval;
+    }
+
+    List<String> printPathsToChild(PuzzlePiece child) {
+        MSVExpressionVisitorType typeVisitor = new MSVExpressionVisitorType();
+        List<List<Expression>> paths = null;
+        if (child != null) {
+            paths = mInfo.getPathsContaining(child.getExpression());
+        } else {
+            paths = mInfo.getPathsContaining(mParent.getExpression());
+        }
+        if (paths == null) {
+            return null;
+        }
+        MSVNameClassVisitorList nameVisitor = new MSVNameClassVisitorList();
+
+        List<String> retval = new ArrayList<String>(paths.size());
+        for (List<Expression> path : paths) {
+            boolean first = true;
+            String wayString = "";
+            for (Expression step : path) {
+                MSVExpressionType type = (MSVExpressionType) step.visit(typeVisitor);
+                if (type == MSVExpressionType.REF) {
+                    continue;
+                }
+                String name = type.toString();
+                String qname = "";
+				// NameClassAndExpression is an MSV class for abstract named expressions (ie. attributes and elements)
+                if (step instanceof NameClassAndExpression) {
+                    List<String> names = (List<String>) ((NameClassAndExpression) step).getNameClass().visit(nameVisitor);
+                    if (names != null) {
+                        boolean firstQ = true;
+                        for (String singleQ : names) {
+                            if (firstQ) {
+                                firstQ = false;
+                                qname = singleQ;
+                            } else {
+                                qname += "," + singleQ;
+                            }
+                        }
+                    }
+                }
+                if (first) {
+                    first = false;
+                    wayString = name + " " + qname;
+                } else {
+                    if (step instanceof NameClassAndExpression) {
+                        name = name + " " + qname;
+                    }
+                    wayString = wayString.concat(" -> " + name);
+                }
+            }
+            retval.add(wayString);
+        }
+        return retval;
+    }
+
+    private static Expression parseOdfSchema(File rngFile) throws Exception {
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+        factory.setNamespaceAware(true);
+
+        Expression root = RELAXNGReader.parse(
+                rngFile.getAbsolutePath(),
+                factory,
+                new com.sun.msv.reader.util.IgnoreController()).getTopLevel();
+
+        if (root == null) {
+            throw new Exception("Schema could not be parsed.");
+        }
+        return root;
+    }
+
+    public static void main(String[] args) throws Exception {
+        Expression root = parseOdfSchema(new File(ODF_RESOURCE_DIR + File.separator + OdfHelper.ODF12_RNG_FILE_NAME));
+        PuzzlePieceSet elements = new PuzzlePieceSet();
+        PuzzlePieceSet attributes = new PuzzlePieceSet();
+        PuzzlePiece.extractPuzzlePieces(root, elements, attributes);
+        Map<String, SortedSet<PuzzlePiece>> nameToDefinition = createDefinitionMap(new TreeSet<PuzzlePiece>(elements));
+
+        System.out.println("Print all paths from parent element (e.g. \"text:p\") to direct child element (e.g. \"text:span\")");
+
+        SortedSet<PuzzlePiece> pieces = nameToDefinition.get(EXAMPLE_PARENT);
+
+        if (pieces == null) {
+            System.out.println("No parent element found by the given name: " + EXAMPLE_PARENT);
+        }
+
+        PuzzlePiece parent = pieces.first();
+
+        pieces = nameToDefinition.get(EXAMPLE_CHILD);
+
+        if (pieces == null) {
+            System.out.println("No child element found by the given name: " + EXAMPLE_CHILD);
+        }
+
+        PuzzlePiece child = pieces.first();
+
+        if (pieces.size() > 1) {
+            System.out.println("There were more than one element by this name. Dropped all instances but one.");
+        }
+
+        System.out.println();
+        System.out.println("PATHS from " + parent.getQName() + " to " + child.getQName() + ": ");
+        System.out.println("---------------------------------------------------------");
+
+        List<String> paths = new PathPrinter(parent).printPathsToChild(child);
+
+        if (paths == null) {
+            System.out.println("No Path found.");
+        } else {
+            for (String s : paths) {
+                System.out.println(s);
+            }
+        }
+    }
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/example/odf/SourceCodeBaseClass.java b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/SourceCodeBaseClass.java
new file mode 100644
index 0000000..da31323
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/SourceCodeBaseClass.java
@@ -0,0 +1,122 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import java.util.SortedSet;
+import java.util.TreeSet;
+import schema2template.model.PuzzlePiece;
+import schema2template.model.PuzzlePieceSet;
+import schema2template.model.QNamed;
+import schema2template.model.XMLModel;
+
+/**
+ * Encapsulates the name of the java base class
+ *
+ * <p>Convention: Unique key is the name of the baseclass. So name is used for compareTo(o), equals(o) and hashCode().</p>
+ */
+public class SourceCodeBaseClass implements Comparable<SourceCodeBaseClass>, QNamed {
+
+    private SortedSet<PuzzlePiece> mSubelements;
+    private String mBasename;
+    private OdfModel mOdfmodel;
+
+    protected SourceCodeBaseClass(OdfModel odfmodel, String basename, SortedSet<PuzzlePiece> subelements) {
+        mSubelements = subelements;
+        mBasename = basename;
+        mOdfmodel = odfmodel;
+    }
+
+    public int compareTo(SourceCodeBaseClass o) {
+        return mBasename.compareTo(o.mBasename);
+    }
+
+    public boolean equals(Object o) {
+        return (o instanceof SourceCodeBaseClass && ((SourceCodeBaseClass) o).mBasename.equals(mBasename));
+    }
+
+    public int hashCode() {
+        return mBasename.hashCode();
+    }
+
+    public String getLocalName() {
+        return XMLModel.extractLocalname(mBasename);
+    }
+
+    public String getQName() {
+        return mBasename;
+    }
+
+    public String getNamespace() {
+        return XMLModel.extractNamespace(mBasename);
+    }
+
+    public String toString() {
+        return getQName();
+    }
+
+    /**
+     * Returns the element Definitions which are subclassing this JavaBaseClass
+     *
+     * @return subclasses
+     */
+    public PuzzlePieceSet getElements() {
+        return new PuzzlePieceSet(mSubelements);
+    }
+
+    /**
+     * Returns the attribute Definitions which are shared by all subclasses of this JavaBaseClass
+     *
+     * @return attributes
+     */
+    public PuzzlePieceSet getBaseAttributes() {
+        SortedSet<PuzzlePiece> attributes = new TreeSet<PuzzlePiece>(mSubelements.last().getAttributes());
+        for (PuzzlePiece subelement : mSubelements.headSet(mSubelements.last())) {
+            attributes.retainAll(subelement.getAttributes());
+        }
+        return new PuzzlePieceSet(attributes);
+    }
+
+    /**
+     * Determines whether all subclasses of this JavaBaseClass are stylable or not stylable.
+     *
+     * @return whether all subclasses are stylable (true) or none (false).
+     * @throws RuntimeException if some subclasses are stylable and some are not
+     */
+    public boolean isStylable() {
+        boolean notStylable = false;
+        boolean stylable = false;
+        for (PuzzlePiece def : getElements()) {
+            if (mOdfmodel.isStylable(def)) {
+                stylable = true;
+            } else {
+                notStylable = true;
+            }
+        }
+        if (stylable && !notStylable) {
+            return true;
+        }
+        if (notStylable && !stylable) {
+            return false;
+        }
+        throw new RuntimeException("Base Class " + getQName() + " used for stylable AND not stylable elements. This is not possible.");
+    }
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/example/odf/SourceCodeModel.java b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/SourceCodeModel.java
new file mode 100644
index 0000000..d5461a3
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/example/odf/SourceCodeModel.java
@@ -0,0 +1,226 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import schema2template.model.PuzzleComponent;
+import schema2template.model.PuzzlePiece;
+import schema2template.model.QNamed;
+import schema2template.model.QNamedPuzzleComponent;
+import schema2template.model.XMLModel;
+
+/**
+ * Model for Java specific enhancements like common base classes for elements and Java valuetypes for
+ * valuetypes used in schema.
+ */
+public class SourceCodeModel {
+    
+	 Map<String, SourceCodeBaseClass> mElementBaseMap;
+	    SortedSet<SourceCodeBaseClass> mBaseclasses;
+	    Map<String, SourceCodeBaseClass> mBasenameToBaseclass;
+	    Map<String, String[]> mDatatypeValueAndConversionMap;  // datatype -> {value-type, conversion-classname}
+
+	    /**
+	     * Construct SourceCodeModel. Not meant for template usage.
+	     *
+	     * @param model the XMLModel
+	     * @param signatureModel the signature XMLModel
+	     * @param manifestModel the manifest XMLModel
+	     * @param odfmodel the OdfModel
+	     * @param elementnameBasenameMap the mapping from element names to source code base class names
+	     * @param datatypeValueAndConversionMap the mapping from schema datatype to {source code types, name of conversion class}
+	     */
+	    public SourceCodeModel(XMLModel model, XMLModel signatureModel, XMLModel manifestModel, OdfModel odfmodel, Map<String, String> elementnameBasenameMap, Map<String, String[]> datatypeValueAndConversionMap) {
+	        mDatatypeValueAndConversionMap = datatypeValueAndConversionMap;
+
+	        // Intermediate Step -> get all basenames
+	        SortedSet<String> basenames = new TreeSet<String>(elementnameBasenameMap.values());
+
+	        // Intermediate Step -> get all subelement Definitions for each basename
+	        Map<String, SortedSet<PuzzlePiece>> basenameElementsMap = new HashMap<String, SortedSet<PuzzlePiece>>(basenames.size());
+	        for (String elementname : elementnameBasenameMap.keySet()) {
+	            String basename = elementnameBasenameMap.get(elementname);
+	            SortedSet<PuzzlePiece> elements = basenameElementsMap.get(basename);
+	            if (elements == null) {
+	                elements = new TreeSet<PuzzlePiece>();
+	                basenameElementsMap.put(basename, elements);
+	            }
+	            QNamedPuzzleComponent subelement = model.getElement(elementname);
+	            if (subelement != null) {
+	                if (subelement instanceof Collection) {
+	                    elements.addAll((Collection) subelement);
+	                }
+	                else {
+	                    elements.add((PuzzlePiece) subelement);
+	                }
+	            }
+	            else {
+	                System.err.println("Warning: Baseclass definition for unknown element " + elementname);
+	            }
+	        }
+
+	        // Generate all baseclasses (additional intermediate step: register them)
+	        mBasenameToBaseclass = new HashMap<String, SourceCodeBaseClass>(basenames.size());
+	        mBaseclasses = new TreeSet<SourceCodeBaseClass>();
+	        for (String basename : basenames) {
+	            SourceCodeBaseClass javabaseclass = new SourceCodeBaseClass(odfmodel, basename, basenameElementsMap.get(basename));
+	            mBaseclasses.add(javabaseclass);
+	            mBasenameToBaseclass.put(basename, javabaseclass);
+	        }
+
+	        // Generate a map from element tag name to baseclasses
+	        mElementBaseMap = new HashMap<String, SourceCodeBaseClass>(elementnameBasenameMap.size());
+	        for (String elementname : elementnameBasenameMap.keySet()) {
+	            String basename = elementnameBasenameMap.get(elementname);
+	            SourceCodeBaseClass baseclass = mBasenameToBaseclass.get(basename);
+	            mElementBaseMap.put(elementname, baseclass);
+	        }
+	    }
+
+	    /**
+	     * Use in templates: Get baseclass of one element
+	     *
+	     * @param subelement element
+	     * @return baseclass
+	     */
+	    public SourceCodeBaseClass getBaseclassOf(QNamed subelement) {
+	        return mElementBaseMap.get(subelement.getQName());
+	    }
+
+	    /**
+	     * Use in templates: Get all baseclasses
+	     * @return all baseclasses
+	     */
+	    public SortedSet<SourceCodeBaseClass> getBaseclasses() {
+	        return mBaseclasses;
+	    }
+
+	    /**
+	     * Use in templates: Get baseclass by name
+	     * @param basename name of baseclass
+	     * @return baseclass object
+	     */
+	    public SourceCodeBaseClass getBaseclass(String basename) {
+	        return mBasenameToBaseclass.get(basename);
+	    }
+
+	    /**
+	     * Use in templates: Get baseclass by name
+	     *
+	     * @param base name of baseclass
+	     * @return baseclass object
+	     */
+	    public SourceCodeBaseClass getBaseclass(QNamed base) {
+	        return getBaseclass(base.getQName());
+	    }
+
+	    /**
+	     * Use in templates: Get Source code value type for datatype used in schema
+	     *
+	     * @param datatype
+	     * @return source code value type
+	     */
+	    public String getValuetype(QNamed datatype) {
+	        String datatypename = datatype.getQName();
+	        String[] tuple = mDatatypeValueAndConversionMap.get(datatypename);
+	        if (tuple == null) {
+	            return "";
+	        }
+	        String retval = tuple[0];
+	        return (retval == null) ? "" : retval;
+	    }
+
+	    /**
+	     * Use in templates: Get source code value types for datatypes used in schema
+	     *
+	     * @param datatypes Schema datatypes
+	     * @return the corresponding source code datatypes
+	     */
+	    public SortedSet<String> getValuetypes(PuzzleComponent datatypes) {
+	        SortedSet<String> retval = new TreeSet<String>();
+	        for (PuzzlePiece datatype : datatypes.getCollection()) {
+	            String datatypename = datatype.getQName();
+	            String[] tuple = mDatatypeValueAndConversionMap.get(datatypename);
+	            if (tuple != null) {
+	                String valuetype = tuple[0];
+	                if (valuetype != null) {
+	                    retval.add(valuetype);
+	                }
+	            }
+	        }
+	        return retval;
+	    }
+
+	    /**
+	     * Use in templates: Translate Java object to simple Java datatype
+	     *
+	     * @param objectType like "Boolean"
+	     * @return simpleType like "boolean"
+	     */
+	    public String getPrimitiveType(String objectType) {
+	        if (objectType.equals("Boolean")) {
+	            return "boolean";
+	        }
+	        if (objectType.equals("Integer")) {
+	            return "int";
+	        }
+	        if (objectType.equals("Double")) {
+	            return "double";
+	        }
+	        return null;
+	    }
+
+	    /**
+	     * Use in templates: Get Java conversion class for datatype used in schema.
+	     *
+	     * @param datatype Source code datatype
+	     * @return name of source code conversion class for this datatype
+	     */
+	    public String getConversiontype(QNamed datatype) {
+	        String datatypename = datatype.getQName();
+	        String[] tuple = mDatatypeValueAndConversionMap.get(datatypename);
+	        if (tuple == null) {
+	            return "";
+	        }
+	        String retval = tuple[1];
+	        return (retval == null) ? "" : retval;
+	    }
+	    
+	    /**
+	     * Use in templates: Get Java conversion class for datatype used in schema.
+	     *
+	     * @param datatypename Source code datatypename
+	     * @return name of source code conversion class for this datatype
+	     */
+	    public String getConversiontype(String datatypename) {
+	        String[] tuple = mDatatypeValueAndConversionMap.get(datatypename);
+	        if (tuple == null) {
+	            return "";
+	        }
+	        String retval = tuple[1];
+	        return (retval == null) ? "" : retval;
+	    }
+}
\ No newline at end of file
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionInformation.java b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionInformation.java
new file mode 100644
index 0000000..6959b8c
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionInformation.java
@@ -0,0 +1,382 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import com.sun.msv.grammar.AttributeExp;
+import com.sun.msv.grammar.ChoiceExp;
+import com.sun.msv.grammar.ElementExp;
+import com.sun.msv.grammar.Expression;
+import com.sun.msv.grammar.NameClassAndExpression;
+import com.sun.msv.grammar.OneOrMoreExp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Gather information from one MSV expression like:
+ * <ul>
+ * <li>which attributes are mandatory<li>
+ * <li>which child elements are singletons</li>
+ * <li>can it have text content</li>
+ * </ul>
+ */
+public class MSVExpressionInformation {
+/*
+ * For each Named Expression (i.e. of Type Element or Attribute) we build a path
+ *    thisNamedExpression -> Expression subEx -> Expression subsubEx -> ... -> childNamedExpression
+ * All Expressions (thisNamedExpression, childNamedExpression and all in between) can be members of
+ * multiple paths. Therefore we create a Map Expression->List<path>.
+ *
+ * If we query this Map for thisNamedExpression, we get all paths. If we query this Map for
+ * childNamedExpression, we get all paths from this to the child. To display groups containing
+ * one child, we have to query the group Expression to get all other elements of this group.
+ */
+
+    private static final MSVExpressionVisitorChildren childVisitor = new MSVExpressionVisitorChildren();
+    private static final MSVExpressionVisitorType typeVisitor = new MSVExpressionVisitorType();
+    private Map<Expression, List<List<Expression>>> mContainedInPaths;
+    private Expression mExpression;
+    private boolean mCanHaveText = false;
+    // map child to its isSingleton property
+    private Set<Expression> mSingletonChildren = new HashSet<Expression>();
+    private Set<Expression> mMultipleChildren = new HashSet<Expression>();
+
+    public MSVExpressionInformation(Expression exp) {
+        mExpression = exp;
+        mContainedInPaths = new HashMap<Expression, List<List<Expression>>>();
+
+        // Builds paths to child elements and child attributes
+        List<List<Expression>> paths = new ArrayList<List<Expression>>();
+        List<Expression> start = new ArrayList<Expression>(1);
+        start.add(exp);
+        paths.add(start);
+        buildPaths(childVisitor, paths);
+
+        // Test whether an element can have text content
+        for (List<Expression> path : paths) {
+            if (((MSVExpressionType) path.get(path.size() - 1).visit(typeVisitor)) == MSVExpressionType.STRING) {
+                mCanHaveText = true;
+                break;
+            }
+        }
+
+        List<List<Expression>> pathsToChildren = getPathsToClass(paths, NameClassAndExpression.class);
+
+        for (List<Expression> path : pathsToChildren) {
+            for (Expression step : path) {
+                List<List<Expression>> pathsToStep = mContainedInPaths.get(step);
+                if (pathsToStep == null) {
+                    pathsToStep = new ArrayList<List<Expression>>(1);
+                    pathsToStep.add(path);
+                    mContainedInPaths.put(step, pathsToStep);
+                } else {
+                    if (!pathsToStep.contains(path)) {
+                        pathsToStep.add(path);
+                    }
+                }
+            }
+        }
+
+        registerChildrenMaxCardinalities(getPathsToClass(paths, ElementExp.class));
+    }
+
+    /*
+     * Helper method: for one parent element, set property isSingleton for all parent->child relationships
+     *
+     * @param waysToChildren
+     */
+    private void registerChildrenMaxCardinalities(List<List<Expression>> waysToChildren) {
+        Map<Expression, Boolean> multiples = new HashMap<Expression, Boolean>();        // Cardinality (the opposite of isSingleton): true=N, false=1
+        Map<Expression, List<Expression>> paths = new HashMap<Expression, List<Expression>>();
+
+        for (List<Expression> way : waysToChildren) {
+            Expression childexp = way.get(way.size()-1);
+
+            Boolean newCardinality = new Boolean(false);                        // Cardinality (the opposite of isSingleton): true=N, false=1
+            for (Expression step : way) {
+                if (step instanceof OneOrMoreExp) {
+                    newCardinality = new Boolean(true);
+                    break;
+                }
+            }
+
+            // is this a multiple of an already existing parent -> ... -> child path? (i.e. parent1==parent2 && child1==child2)
+            if (multiples.containsKey(childexp)) {
+
+                // so we have a parent -> ... -> child multiple. Read the max cardinality of the existing path.
+                Boolean existingCardinality = multiples.get(childexp);
+
+                // so we have a parent -> ... -> child multiple. Is there a common CHOICE element on both paths?
+                boolean commonChoice = false;
+
+                // find common CHOICE element in both paths BEFORE a ONEOREMORE. Example for pattern match:
+                //     <CHOICE>X,<ONEOREMORE>X</ONEOREMORE></CHOICE> -> one has 1, one has N
+                //     <CHOICE>X,<SEQUENCE>A,X,B</SEQUENCE></CHOICE> -> both have 1
+                // This restriction is needed because MSV does some optimization. (Example for no pattern match):
+                //     <CHOICE>empty, X</CHOICE><ONEOREMORE><CHOICE>empty, X</CHOICE></ONEOREMORE>
+                // MSV detects that this is two times the same choice and creates just one ChoiceExpression.
+                // But this is not what we understand as a common CHOICE -> It's a common element definition
+                // <OPTIONAL>X</OPTIONAL> == <CHOICE>empty, X</CHOICE>
+                Set<ChoiceExp> choices = new HashSet<ChoiceExp>();
+                for (Expression oldStep : paths.get(childexp)) {
+                    if (oldStep instanceof ChoiceExp) {
+                        choices.add((ChoiceExp) oldStep);
+                    }
+                    if (oldStep instanceof OneOrMoreExp) {
+                        break;
+                    }
+                }
+                for (Expression step : way) {
+                    if (step instanceof ChoiceExp) {
+                        if (choices.contains((ChoiceExp) step)) {
+                            commonChoice = true;
+                            break;
+                        }
+                    }
+                    if (step instanceof OneOrMoreExp) {
+                        break;
+                    }
+                }
+
+                // Valid case: Both have N
+                if (existingCardinality && newCardinality) {
+                    // Do nothing
+                }
+
+                // One has 1, the other N
+                if (!existingCardinality.equals(newCardinality)) {
+                    // A case which we cannot handle. You have a choice between a definition which allows only 1 occurence and another which allows N occurences
+                    if (commonChoice) {
+                        System.err.println("We have a CHOICE between one definition with N and one with 1 -> What does that mean? WE CANNOT HANDLE THIS)");
+                        System.exit(1);
+                    }
+                    // Valid case: One has 1, the other N, they don't share a common CHOICE -> Set N as the both defs are not exclusive (1 occurence + N occurences)
+                    else {
+                        multiples.put(childexp, new Boolean(true));
+                    }
+                }
+
+                if (!existingCardinality && !newCardinality) {
+                    // Valid case: Both have 1 and share a common CHOICE element
+                    if (commonChoice) {
+                        // Do nothing
+                    }
+                    // A case which we cannot handle. Both have 1:1 but do not share a common CHOICE element: 1:2 ??? ... 1:3 ???
+                    else {
+                        System.err.println("Already defined as 1, but two times without common choice. What does that mean? WE CANNOT HANDLE THIS!!!");
+                        System.exit(1);
+                    }
+                }
+            } else {
+                multiples.put(childexp, newCardinality);
+                paths.put(childexp, way);
+            }
+            setParentChildSingleton(childexp, !newCardinality);
+        }
+    }
+
+    /*
+     * Register whether is a child element is a singleton or not
+     *
+     * @param parent
+     * @param child
+     * @param singleton (true=singleton, false=can have multiple occurence)
+     */
+    private void setParentChildSingleton(Expression child, boolean singleton) {
+        if (singleton) {
+            mSingletonChildren.add(child);
+        }
+        else {
+            mMultipleChildren.add(child);
+        }
+    }
+
+    /**
+     * Returns all singleton child elements
+     *
+     * @return All child elements which can only occur one time
+     */
+    public Set<Expression> getSingletons() {
+        return mSingletonChildren;
+    }
+
+    /**
+     * Returns all child elements which are no singletons
+     *
+     * @return All child elements which can only occur one time
+     */
+    public Set<Expression> getMultiples() {
+        return mMultipleChildren;
+    }
+
+    /* Helper method. Build all paths from parent to children. One path is like
+     *      ElementExp parent -> [all Expressions but ElementExp or AttributeExp]* -> ElementExp child
+     *      ElementExp parent -> [all Expressions but ElementExp or AttributeExp]* -> AttributeExp child
+     * Since we use recursion we cannot make sure a path ends with an ElementExp or AttributeExp.
+     */
+    private static void buildPaths(MSVExpressionVisitorChildren visitor, List<List<Expression>> paths) {
+        List<Expression> waytoresearch = paths.get(paths.size() - 1);
+        Expression endpoint = waytoresearch.get(waytoresearch.size() - 1);
+        List<Expression> children = (List<Expression>) endpoint.visit(visitor);
+
+        if (children.size() == 1) {
+            Expression child = children.get(0);
+            waytoresearch.add(child);
+            if (!(child instanceof ElementExp) && !(child instanceof AttributeExp)) {
+                buildPaths(visitor, paths);
+            }
+        } else if (children.size() > 1) {
+            paths.remove(paths.size() - 1);
+            for (Expression child : children) {
+                List<Expression> newway = new ArrayList<Expression>();
+                newway.addAll(waytoresearch);
+                newway.add(child);
+                paths.add(newway);
+                if (!(child instanceof ElementExp) && !(child instanceof AttributeExp)) {
+                    buildPaths(visitor, paths);
+                }
+            }
+        }
+    }
+
+    private static List<List<Expression>> getPathsToClass(List<List<Expression>> paths, Class clazz) {
+        List<List<Expression>> remainingPaths = new ArrayList<List<Expression>>();
+        for (List<Expression> path : paths) {
+            if (clazz.isInstance(path.get(path.size() - 1))) {
+                remainingPaths.add(path);
+            }
+        }
+        return remainingPaths;
+    }
+
+    /**
+     * Gets all paths leading from this.getExpression() to exp (but not necessarily ending in exp).
+     * A path always starts with this.getExpression() and ends in
+     * someChildDefinition.getExpression().
+     *
+     * @param exp The MSV Expression. If you use this.getExpression() you get
+     * all paths starting from this.getExpression().
+     * If you use someChildDefinition.getExpression() you get all paths from
+     * this.getExpression() to the Expression of the Child Definition.
+     *
+     * @return A List of paths containing exp or null if there are no such paths
+     */
+    public List<List<Expression>> getPathsContaining(Expression exp) {
+        return mContainedInPaths.get(exp);
+    }
+
+    /**
+     * Can the MSV expression have text content?
+     *
+     * @return true if the node defined by this can have text content
+     */
+    public boolean canHaveText() {
+        return mCanHaveText;
+    }
+
+    /**
+     * Determines whether an Element or Attribute child is mandatory.
+     *
+     * <p>If there are multiples of child (other equally named expressions)
+     * providing only one of those Expressions will determine whether exactly
+     * this expression is mandatory. In most cases this will return false,
+     * and in most cases this is not what you want to know.
+     * Therefore you can provide a Collection of (equally named) child expressions.
+     * </p>
+     *
+     * @return whether child is mandatory
+     */
+    public boolean isMandatory(Collection<Expression> equallyNamedChildren) {
+
+        if (equallyNamedChildren == null || equallyNamedChildren.size() == 0) {
+            throw new RuntimeException("ExpressionInformation: Cannot determine isMandatory for a null or empty children list.");
+        }
+
+        Set<List<Expression>> twins = new HashSet<List<Expression>>();
+
+        for (Expression exp : equallyNamedChildren) {
+            if (!(exp instanceof NameClassAndExpression)) {
+                throw new RuntimeException("ExpressionInformation: Cannot determine isMandatory for Expression other than ELEMENT and ATTRIBUTE");
+            }
+            // Twins == Same parent (first element in path), same child (last element in path)
+            // Contract: For all paths containing an Element or Attribute child this child is always the last Expression of the path
+            twins.addAll(getPathsContaining(exp));
+        }
+
+        /*
+         * We assume the subnode is mandatory until proven otherwise. The prove is done by examining CHOICE elements.
+         *
+         * A CHOICE splits a path in exactly _two_ parts:
+         * If the CHOICE is only contained in the current path, the other part does not lead to the subnode. Therefore the subnode is optional.
+         * A CHOICE which is shared by two twins (see above) means that CHILD can still be assumed as mandatory.
+         *
+         * However there's a MSV implementation detail:
+         * All twins share the parent element and are identically before some CHOICE splits two of them. Once two paths are split, by logic
+         * they cannot share a CHOICE any more. At least you would think so... However MSV does some optimization to merge two
+         * identical CHOICES, even if they are in different places. In the following example the two inner CHOICE elements have the same MSV instance:
+         *      <CHOICE><CHOICE>A,B</CHOICE><CHOICE>A,B</CHOICE></CHOICE>
+         * So both twins do not really share such a CHOICE. You have to look for another path which _really_ shares this choice or - if you find none -
+         * set CHILD to optional.
+         */
+
+        HashSet<Expression> visitedChoices = new HashSet<Expression>();
+
+        for (List<Expression> path : twins) {
+            for (int s=0; s<path.size(); s++) {
+                Expression step = path.get(s);
+                if (step instanceof ChoiceExp && !visitedChoices.contains(step)) {
+                    visitedChoices.add(step);
+
+                    // If other twin paths share the same choice...
+                    List<List<Expression>> choiceInPaths = new ArrayList<List<Expression>>(mContainedInPaths.get(step));
+                    choiceInPaths.retainAll(twins);
+
+                    // small Performance gain: A CHOICE contained only in one path makes CHILD always optional
+                    if (choiceInPaths.size() <= 1) {
+                        return false;
+                    }
+
+                    // we need to find two paths to CHILD ('path' and another one from the twins) _really_ (s.a.) sharing this choice. Otherwise child is optional.
+                    int sharingPaths = 0;
+
+                    for (List<Expression> otherPath : choiceInPaths) {
+                        if (otherPath.size() > s && path.subList(0, s+1).equals(otherPath.subList(0, s+1))) {
+                            sharingPaths++;
+                            if (sharingPaths==2) {
+                                break;
+                            }
+                        }
+                    }
+                    if (sharingPaths < 2) {
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionIterator.java b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionIterator.java
new file mode 100644
index 0000000..6748f6e
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionIterator.java
@@ -0,0 +1,265 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import static schema2template.example.odf.OdfHelper.DEBUG;
+import com.sun.msv.grammar.DataExp;
+import com.sun.msv.grammar.ElementExp;
+import com.sun.msv.grammar.Expression;
+import com.sun.msv.grammar.NameClassAndExpression;
+import com.sun.msv.grammar.ReferenceExp;
+import com.sun.msv.grammar.ValueExp;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+import java.util.logging.Logger;
+
+/**
+ * Iterates through the MSV expression tree.
+ *
+ * Traversing the MSV Tree structure by 
+ *	1) First trying to get the child (going as deep as possible)
+ *  2) Second if no child is available, trying to get the next sibling
+ *  3) If no sibling available, get a sibling of the parent (going back to step 1)
+ * 
+ * <p>Also has the ability to limit iteration to given subclasses and to limit subtree
+ * to the next element expressions below. </p>
+ */
+public final class MSVExpressionIterator implements Iterator<Expression> {
+
+	private static final Logger LOG = Logger.getLogger(MSVExpressionIterator.class.getName());
+	private Expression mCurrentExpression; // the expression that will be received by next()
+	public int mCurrentExpressionDepth;   // Level of current expression starting with 0 
+	private MSVExpressionVisitorChildren mVisitor;
+	// list of already visited expressions to avoid endless recursion
+	// The stack assists the iteration to go back up (usually done in by recursion)
+	// The stack contains the next expression, parent, grandparent, ...
+	private Stack<UniqueAncestor> mAncestorsAndCurrent;
+	// to prevent enless loops, known Element expression will be remembered and not again reentered
+	// Situation: Element a contains Element b contains Element a, will stop after the second a not continuing with b
+	private HashSet<Expression> mKnownElementExpressions;
+
+	// The vertical tree position is remembered by the stack, the vertical position will be remembered by a sibling index
+	private class UniqueAncestor {
+
+		public UniqueAncestor(Expression exp, int siblingIndex) {
+			mExp = exp;
+			mSiblingIndex = siblingIndex;
+		}
+		private Expression mExp;
+		private int mSiblingIndex;
+	}
+	// limit browsing to subclasses of Expression
+	private Class mDesiredExpression;
+	// if false, only return direct children of root. Don't return root as first element or grand children
+	private boolean mOnlyChildren;
+	private int mCurrentDepth = 0;
+	public static final boolean ALL_SUBTREE = true;
+	public static final boolean DIRECT_CHILDREN_ONLY = true;
+
+	public int getDepth() {
+		return mCurrentDepth;
+	}
+
+	/**
+	 * Iterate through the expression tree
+	 *
+	 * @param root Expression root
+	 */
+	public MSVExpressionIterator(Expression root) {
+		this(root, Expression.class, false);
+	}
+
+	/**
+	 *  Iterate through the expression tree, but only return objects of desiredExpression
+	 *
+	 * @param root Expression root
+	 * @param desiredExpression Limit returned expressions to subclasses of desiredExpression
+	 */
+	public MSVExpressionIterator(Expression root, Class desiredExpression) {
+		this(root, desiredExpression, false);
+	}
+
+	/**
+	 * Iterate..., but only return objects of desiredExpression and (if not onlyChildren)
+	 * don't go to children of ElementExp elements (this does not concern root node!).
+	 *
+	 * <p>Example: Root is table:table. If you choose onlyChildren=false and to limit
+	 * desiredExpression=ElementExp.class, then you will get all direct element children of table:table,
+	 * like table:table-row. But you won't get the children of table:table-row.
+	 * </p>
+	 *
+	 * @param root Expression root
+	 * @param desiredExpression Limit returned expressions to subclasses of desiredExpression
+	 * @param onlyChildren if only children should be returned
+	 */
+	public MSVExpressionIterator(Expression root, Class desiredExpression, boolean onlyChildren) {
+		// initialize members
+		mCurrentExpression = root;
+		mDesiredExpression = desiredExpression;
+		mOnlyChildren = onlyChildren;
+
+		// create helpers
+		mVisitor = new MSVExpressionVisitorChildren();
+		mKnownElementExpressions = new HashSet<Expression>();
+
+		// Initialize status
+		mAncestorsAndCurrent = new Stack<UniqueAncestor>();
+		mAncestorsAndCurrent.push(new UniqueAncestor(root, 0));
+
+		// make sure that there is at least one desired expression - for hasNext()
+		while (!mDesiredExpression.isInstance(mCurrentExpression) && mCurrentExpression != null) {
+			mCurrentExpression = getNextExpression();
+		}
+		
+		// Ignore root, if only children are desired
+		if (mOnlyChildren && root == mCurrentExpression) {
+			mCurrentExpression = getNextExpression();
+		}
+	}
+
+	public static String dumpMSVExpressionTree(Expression rootExpression) throws Exception {
+		MSVExpressionIterator iterator = new MSVExpressionIterator(rootExpression);
+		StringBuilder builder = new StringBuilder();
+		while (iterator.hasNext()) {
+			Expression expr = iterator.next();
+			builder.append(dumpMSVExpression(expr, iterator.getDepth())).append("\n");
+		}
+		return builder.toString();
+	}
+
+	private static String dumpMSVExpression(Expression expr, int depth) {
+		String returnValue = null;
+		MSVExpressionVisitorType typeVisitor = new MSVExpressionVisitorType();
+		MSVNameClassVisitorList nameVisitor = new MSVNameClassVisitorList();
+		MSVExpressionType type = (MSVExpressionType) expr.visit(typeVisitor);
+		returnValue = (depth + ": " + type.toString());
+
+		// AttributeExp, ElementExp
+		if (expr instanceof NameClassAndExpression) {
+			List<String> names = (List<String>) ((NameClassAndExpression) expr).getNameClass().visit(nameVisitor);
+			for (String name : names) {
+				returnValue += (" \"" + name + "\",");
+				if(DEBUG) System.out.println(returnValue);
+			}
+		} else if (expr instanceof ReferenceExp) {
+			returnValue += (" '" + ((ReferenceExp) expr).name + "',");
+			if(DEBUG) System.out.println(returnValue);
+		} else if (type == MSVExpressionType.VALUE) {
+			returnValue += (" '" + ((ValueExp) expr).value.toString() + "',");
+			if(DEBUG) System.out.println(returnValue);
+		} else if (type == MSVExpressionType.DATA) {
+			returnValue += (" '" + ((DataExp) expr).getName().localName + "',");
+			if(DEBUG) System.out.println(returnValue);
+		} else {
+			if(DEBUG) System.out.println(returnValue);
+		}
+		return returnValue;
+	}
+
+	public boolean hasNext() {
+		return (mCurrentExpression != null) ? true : false;
+	}
+
+	/** Iterating the Tree like the following	 
+	If there are (unvisited) children -> go down
+	If there are no (unvisited) children, but unvistsiblings -> go up and right
+	 */
+	private Expression getNextExpression() {
+		Expression nextExpression = null;
+		// the current expression might be null if the desired type of expression was never found in the tree
+		if (mCurrentExpression != null) {
+			// if all tree is desired, or root, or if it is not element expression
+			if (!mOnlyChildren || mAncestorsAndCurrent.size() == 1 || !(mAncestorsAndCurrent.peek().mExp instanceof ElementExp)) {
+				List<Expression> children = (List<Expression>) mCurrentExpression.visit(mVisitor);
+				// see if we can go DOWN the tree
+				if (children.size() > 0) {
+					Expression nextExpCandidate = children.get(0);
+					// DO NOT expand elements which occur more than one time in the ancestors hierarchy (i.e.
+					// since we compute the last element: Do not expand it, if it also occurs before)
+					if (isNoKnownElement(nextExpCandidate)) {
+						// GO DOWN - Proceed with first child
+						nextExpression = nextExpCandidate;
+						mAncestorsAndCurrent.push(new UniqueAncestor(nextExpression, 0));
+					}
+				}
+			}
+
+			// if you could not get depper, but you can go up
+			// if there was no first child for the next expression and still some parent not being the root
+			while (nextExpression == null && mAncestorsAndCurrent.size() > 1) {
+				// go one up the stack
+				UniqueAncestor uniqueAncestor = mAncestorsAndCurrent.pop();
+				// get the new parent
+				Expression parent = mAncestorsAndCurrent.peek().mExp;
+				// to get the siblings
+				List<Expression> siblings = (List<Expression>) parent.visit(mVisitor);
+				// get the unvisted sibling index
+				final int nextSiblingIndex = uniqueAncestor.mSiblingIndex + 1;
+				if (nextSiblingIndex < siblings.size()) {
+					Expression nextExpCandidate = siblings.get(nextSiblingIndex);
+					// DO NOT expand elements which occur more than one time in the ancestors hierarchy (i.e.
+					// since we compute the last element: Do not expand it, if it also occurs before)
+					if (isNoKnownElement(nextExpCandidate)) {
+						// GO RIGHT - Add next sibling to the stack
+						nextExpression = nextExpCandidate;
+						mAncestorsAndCurrent.push(new UniqueAncestor(nextExpression, nextSiblingIndex));
+					}
+				}
+			}
+		}
+		return nextExpression;
+	}
+
+	private boolean isNoKnownElement(Expression exp) {
+		boolean isNew = false;
+		if (!(exp instanceof ElementExp) || !mKnownElementExpressions.contains(exp)) {
+			mKnownElementExpressions.add(exp);
+			isNew = true;
+		} else {
+//			LOG.info("Found known element expression:" + dumpMSVExpression(exp, this.getDepth()));
+		}
+		return isNew;
+	}
+
+	public Expression next() {
+		if (mCurrentExpression == null) {
+			return null;
+		}
+		Expression retVal = mCurrentExpression;
+		mCurrentDepth = mAncestorsAndCurrent.size() - 1;
+		mCurrentExpression = getNextExpression();
+		
+		// as there is always a desired expression, make sure the next one is adequate
+		while (!mDesiredExpression.isInstance(mCurrentExpression) && mCurrentExpression != null) {
+			mCurrentExpression = getNextExpression();
+		}
+		return retVal;
+	}
+
+	// Unsupported
+	public void remove() {
+		throw new UnsupportedOperationException("Not supported.");
+
+	}
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionType.java b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionType.java
new file mode 100644
index 0000000..8f23af5
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionType.java
@@ -0,0 +1,30 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+/**
+ * Enum for the type of the MSV expression
+ */
+public enum MSVExpressionType {
+
+    STRING, ATTRIBUTE, CHOICE, CONCUR, DATA, ELEMENT, EPSILON, INTERLEAVE, LIST, MIXED, NULLSET, ONEOREMORE, OTHER, REF, SEQUENCE, VALUE
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionVisitorChildren.java b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionVisitorChildren.java
new file mode 100644
index 0000000..33eada6
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionVisitorChildren.java
@@ -0,0 +1,132 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import com.sun.msv.grammar.AttributeExp;
+import com.sun.msv.grammar.ChoiceExp;
+import com.sun.msv.grammar.ConcurExp;
+import com.sun.msv.grammar.DataExp;
+import com.sun.msv.grammar.ElementExp;
+import com.sun.msv.grammar.Expression;
+import com.sun.msv.grammar.ExpressionVisitor;
+import com.sun.msv.grammar.InterleaveExp;
+import com.sun.msv.grammar.ListExp;
+import com.sun.msv.grammar.MixedExp;
+import com.sun.msv.grammar.OneOrMoreExp;
+import com.sun.msv.grammar.OtherExp;
+import com.sun.msv.grammar.ReferenceExp;
+import com.sun.msv.grammar.SequenceExp;
+import com.sun.msv.grammar.ValueExp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This visitor visits an Expression and returns a list of child expressions
+ *
+ * <p>Usage example:
+ * <em>(List&lt;Expression&gt;) myExpression.visit(myMSVExpressionVisitorChildren)</em></p>
+ *
+ * <p>Please note that you do not use any method of this class directly!</p>
+ */
+public class MSVExpressionVisitorChildren implements ExpressionVisitor {
+
+    private static final List<Expression> empty = Collections.EMPTY_LIST;
+
+    public List<Expression> onAnyString() {
+        return empty;
+    }
+
+    public List<Expression> onAttribute(AttributeExp exp) {
+        return child(exp.exp);
+    }
+
+    public List<Expression> onChoice(ChoiceExp exp) {
+        return children(exp.children());
+    }
+
+    public List<Expression> onConcur(ConcurExp exp) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<Expression> onData(DataExp exp) {
+        return empty;
+    }
+
+    public List<Expression> onElement(ElementExp exp) {
+        return child(exp.getContentModel());
+    }
+
+    public List<Expression> onEpsilon() {
+        return empty;
+    }
+
+    public List<Expression> onInterleave(InterleaveExp exp) {
+        return children(exp.children());
+    }
+
+    public List<Expression> onList(ListExp exp) {
+        return child(exp.exp);
+    }
+
+    public List<Expression> onMixed(MixedExp exp) {
+        return child(exp.exp);
+    }
+
+    public List<Expression> onNullSet() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<Expression> onOneOrMore(OneOrMoreExp exp) {
+        return child(exp.exp);
+    }
+
+    public List<Expression> onOther(OtherExp exp) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<Expression> onRef(ReferenceExp exp) {
+        return child(exp.exp);
+    }
+
+    public List<Expression> onSequence(SequenceExp exp) {
+        return children(exp.children());
+    }
+
+    public List<Expression> onValue(ValueExp exp) {
+        return empty;
+    }
+
+    private List<Expression> children(Iterator<Expression> i) {
+        ArrayList<Expression> list = new ArrayList<Expression>();
+        while (i.hasNext()) {
+            list.add(i.next());
+        }
+        return list;
+    }
+
+    private List<Expression> child(Expression e) {
+        return Collections.singletonList(e);
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionVisitorType.java b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionVisitorType.java
new file mode 100644
index 0000000..dbb87bf
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVExpressionVisitorType.java
@@ -0,0 +1,113 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import com.sun.msv.grammar.AttributeExp;
+import com.sun.msv.grammar.ChoiceExp;
+import com.sun.msv.grammar.ConcurExp;
+import com.sun.msv.grammar.DataExp;
+import com.sun.msv.grammar.ElementExp;
+import com.sun.msv.grammar.ExpressionVisitor;
+import com.sun.msv.grammar.InterleaveExp;
+import com.sun.msv.grammar.ListExp;
+import com.sun.msv.grammar.MixedExp;
+import com.sun.msv.grammar.OneOrMoreExp;
+import com.sun.msv.grammar.OtherExp;
+import com.sun.msv.grammar.ReferenceExp;
+import com.sun.msv.grammar.SequenceExp;
+import com.sun.msv.grammar.ValueExp;
+
+/**
+ * Get type of expression
+ *
+ * <p>Usage example:
+ * <em>(MSVExpressionType) myExpression.visit(myMSVExpressionVisitorType)</em></p>
+ *
+ * <p>Please note that you do not use any method of this class directly!</p>
+ */
+public class MSVExpressionVisitorType implements ExpressionVisitor {
+
+    public MSVExpressionType onAnyString() {
+        return MSVExpressionType.STRING;
+    }
+
+    public MSVExpressionType onAttribute(AttributeExp arg0) {
+        return MSVExpressionType.ATTRIBUTE;
+    }
+
+    public MSVExpressionType onChoice(ChoiceExp arg0) {
+        return MSVExpressionType.CHOICE;
+    }
+
+    public MSVExpressionType onConcur(ConcurExp arg0) {
+        return MSVExpressionType.CONCUR;
+    }
+
+    public MSVExpressionType onData(DataExp arg0) {
+        return MSVExpressionType.DATA;
+    }
+
+    public MSVExpressionType onElement(ElementExp arg0) {
+        return MSVExpressionType.ELEMENT;
+    }
+
+    public MSVExpressionType onEpsilon() {
+        return MSVExpressionType.EPSILON;
+    }
+
+    public MSVExpressionType onInterleave(InterleaveExp arg0) {
+        return MSVExpressionType.INTERLEAVE;
+    }
+
+    public MSVExpressionType onList(ListExp arg0) {
+        return MSVExpressionType.LIST;
+    }
+
+    public MSVExpressionType onMixed(MixedExp arg0) {
+        return MSVExpressionType.MIXED;
+    }
+
+    public MSVExpressionType onNullSet() {
+        return MSVExpressionType.NULLSET;
+    }
+
+    public MSVExpressionType onOneOrMore(OneOrMoreExp arg0) {
+        return MSVExpressionType.ONEOREMORE;
+    }
+
+    public MSVExpressionType onOther(OtherExp arg0) {
+        return MSVExpressionType.OTHER;
+    }
+
+    public MSVExpressionType onRef(ReferenceExp arg0) {
+        return MSVExpressionType.REF;
+    }
+
+    public MSVExpressionType onSequence(SequenceExp arg0) {
+        return MSVExpressionType.SEQUENCE;
+    }
+
+    public MSVExpressionType onValue(ValueExp arg0) {
+        return MSVExpressionType.VALUE;
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/MSVNameClassVisitorList.java b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVNameClassVisitorList.java
new file mode 100644
index 0000000..4f67b0e
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/MSVNameClassVisitorList.java
@@ -0,0 +1,100 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import com.sun.msv.grammar.AnyNameClass;
+import com.sun.msv.grammar.ChoiceNameClass;
+import com.sun.msv.grammar.DifferenceNameClass;
+import com.sun.msv.grammar.NameClassVisitor;
+import com.sun.msv.grammar.NamespaceNameClass;
+import com.sun.msv.grammar.NotNameClass;
+import com.sun.msv.grammar.SimpleNameClass;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Returns the Name(s) of an Expression (or more precisely: of its Nameclass) in a List of Strings.
+ * A list instead of a single name is necessary as there might be multiple names for a single element definition.
+ * For instance in ODF 1.2:
+ * <code>
+		<element>
+			<choice>
+				<name>text:reference-ref</name>
+				<name>text:bookmark-ref</name>
+			</choice>
+ </code>
+
+ *
+ * <p>Convention: "*" will be returned as the wildcard for "any name"</p>
+ *
+ * <p>Usage example:
+ * <em>(List&lt;String&gt;) myExpression.nameclass.visit(myMSVNameClassVisitorList)</em></p>
+ *
+ * <p>Please note that you do not use any method of this class directly!</p>
+ */
+public class MSVNameClassVisitorList implements NameClassVisitor {
+
+    private static NamespaceDictionary nsdict = NamespaceDictionary.getStandardDictionary();
+
+    public List<String> onAnyName(AnyNameClass arg0) {
+        return single("*");
+    }
+
+    public List<String> onChoice(ChoiceNameClass arg0) {
+        List<String> retval = new ArrayList<String>();
+        retval.addAll((List<String>) arg0.nc1.visit(this));
+        retval.addAll((List<String>) arg0.nc2.visit(this));
+        return retval;
+    }
+
+    public List<String> onDifference(DifferenceNameClass arg0) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<String> onNot(NotNameClass arg0) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<String> onNsName(NamespaceNameClass arg0) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public List<String> onSimple(SimpleNameClass arg0) {
+        return single(simplify(arg0.namespaceURI, arg0.localName));
+    }
+
+    // singleton list
+    private List<String> single(String s) {
+        return Collections.singletonList(s);
+    }
+
+    // (a.name.space.uri, localname) -> ns:localname
+    private String simplify(String nsuri, String localname) {
+        String shortns = nsdict.getLocalNamespace(nsuri);
+        if (shortns == null || shortns.length() == 0) {
+            return localname;
+        }
+        return shortns + ":" + localname;
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java b/trunk/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java
new file mode 100644
index 0000000..ca3f877
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java
@@ -0,0 +1,117 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Translation NS URI &lt;-&gt; NS Localname
+ */
+public class NamespaceDictionary {
+
+    private Map<String,String> uri2local;
+    private Map<String,String> local2uri;
+
+    /**
+     * Construct a new empty dictionary
+     */
+    public NamespaceDictionary() {
+        uri2local = new HashMap<String, String>();
+        local2uri = new HashMap<String, String>();
+    }
+
+    /**
+     * Register a new translation
+     *
+     * @param nsLocal short namespace
+     * @param nsUri namespace URI
+     */
+    public void put(String nsLocal, String nsUri) {
+        uri2local.put(nsUri, nsLocal);
+        local2uri.put(nsLocal, nsUri);
+    }
+
+    /**
+     * Translate local namespace to URI
+     *
+     * @param nsLocal short namespace
+     * @return namespace URI
+     */
+    public String getNamespaceURI(String nsLocal) {
+        return local2uri.get(nsLocal);
+    }
+
+    /**
+     * Translate URI to local namespace
+     *
+     * @param nsUri namespace URI
+     * @return short namespace
+     */
+    public String getLocalNamespace(String nsUri) {
+        return uri2local.get(nsUri);
+    }
+
+    /**
+     * Construct an example dictionary as needed by the OpenDocument schema file
+     *
+     * @return namespace Dictionary
+     */
+    public static NamespaceDictionary getStandardDictionary() {
+        NamespaceDictionary dict = new NamespaceDictionary();
+//todo Exchange the static list with a dynamic approach!!
+	dict.put("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0");
+	dict.put("style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0");
+	dict.put("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0");
+	dict.put("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0");
+	dict.put("draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0");
+	dict.put("fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0");
+	dict.put("xlink", "http://www.w3.org/1999/xlink");
+	dict.put("dc", "http://purl.org/dc/elements/1.1/");
+	dict.put("meta", "urn:oasis:names:tc:opendocument:xmlns:meta:1.0");
+	dict.put("number", "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0");
+	dict.put("svg", "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0");
+	dict.put("chart", "urn:oasis:names:tc:opendocument:xmlns:chart:1.0");
+	dict.put("dr3d", "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0");
+	dict.put("math", "http://www.w3.org/1998/Math/MathML");
+	dict.put("form", "urn:oasis:names:tc:opendocument:xmlns:form:1.0");
+	dict.put("script", "urn:oasis:names:tc:opendocument:xmlns:script:1.0");
+	dict.put("dom", "http://www.w3.org/2001/xml-events");
+	dict.put("xforms", "http://www.w3.org/2002/xforms");
+	dict.put("xsd", "http://www.w3.org/2001/XMLSchema");
+	dict.put("xsi", "http://www.w3.org/2001/XMLSchema-instance");
+	dict.put("of", "urn:oasis:names:tc:opendocument:xmlns:of:1.2");
+	dict.put("rdfa", "http://docs.oasis-open.org/opendocument/meta/rdfa#");
+	dict.put("field", "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0");
+	dict.put("config","urn:oasis:names:tc:opendocument:xmlns:config:1.0");
+	dict.put("presentation","urn:oasis:names:tc:opendocument:xmlns:presentation:1.0");
+	dict.put("db","urn:oasis:names:tc:opendocument:xmlns:database:1.0");
+	dict.put("anim","urn:oasis:names:tc:opendocument:xmlns:animation:1.0");
+	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");
+
+        return dict;
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzleComponent.java b/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzleComponent.java
new file mode 100644
index 0000000..3f73571
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzleComponent.java
@@ -0,0 +1,109 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import java.util.Collection;
+
+/**
+ * <p>The first purpose of this interface is to provide a kind of "piece of a puzzle"
+ * representing the key definitions of a schema and their relationship:</p>
+ * <ul>
+ * <li>Element PuzzlePiece</li>
+ * <li>Attribute PuzzlePiece</li>
+ * <li>Attribute Value PuzzlePiece</li>
+ * <li>Attribute Datatype PuzzlePiece</li>
+ * </ul>
+ * <p>The second purpose of this interface is to hide the differences between one
+ * definition and a Collection of definitions. By this you will be able
+ * to use single definitions and collections of definitions as method
+ * parameters. The method getCollection() is a helper method for this.</p>
+ */
+public interface PuzzleComponent {
+
+    /**
+     * ELEMENT PuzzlePiece only: Get all child element Definitions
+     *
+     * @return The child Definitions of this PuzzleComponent
+     */
+    public PuzzlePieceSet getChildElements();
+
+    /**
+     *  ELEMENT PuzzlePiece only: Get all attribute Definitions
+     *
+     * @return The attribute Definitions of this PuzzleComponent
+     */
+    public PuzzlePieceSet getAttributes();
+
+    /**
+     *  ATTRIBUTE PuzzlePiece only: Get all datatype Definitions
+     *
+     * @return The datatype Definitions of this PuzzleComponent
+     */
+    public PuzzlePieceSet getDatatypes();
+
+    /**
+     *  ATTRIBUTE PuzzlePiece only: Get all value Definitions
+     *
+     * @return The constant value Definitions of this PuzzleComponent
+     */
+    public PuzzlePieceSet getValues();
+
+    /**
+     *  Get all parent Definitions
+     *
+     * @return The parent Definitions of this PuzzleComponent
+     */
+    public PuzzlePieceSet getParents();
+
+    /**
+     * Get type of PuzzlePiece [ELEMENT, ATTRIBUTE, VALUE, DATA]
+     *
+     * @return The type of this PuzzleComponent
+     */
+    public MSVExpressionType getType();
+
+    /**
+     * Determines whether this PuzzleComponent allows a text node as child.
+     *
+     * @return True if a text node is allowed, false otherwise
+     */
+    public boolean canHaveText();
+
+    /**
+     * Determines whether the child PuzzlePiece(s) is/are singleton(s)
+     *
+     * Convention: If child is a collection this method returns false if one child element is no singleton.
+     * If this is a collection this method returns false if child is no singleton for one element of this.
+     *
+     * @param child PuzzleComponent child
+     * @return True if child is defined as Singleton, falso otherwise.
+     */
+    public boolean isSingleton(PuzzleComponent child);
+
+    /**
+     * Method to treat NamedDefined as a Collection of PuzzlePiece
+     *
+     * @return Collection of PuzzlePiece objects
+     */
+    public Collection<PuzzlePiece> getCollection();
+    
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzlePiece.java b/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzlePiece.java
new file mode 100644
index 0000000..fd7a9ba
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzlePiece.java
@@ -0,0 +1,594 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import com.sun.msv.grammar.AttributeExp;
+import com.sun.msv.grammar.DataExp;
+import com.sun.msv.grammar.ElementExp;
+import com.sun.msv.grammar.Expression;
+import com.sun.msv.grammar.NameClassAndExpression;
+import com.sun.msv.grammar.ValueExp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * One of the following RelaxNG definitions of an Element, Attribute, Value or Datatype.
+ *
+ * <p>Each PuzzlePiece encapsulates one MSV Expression. Two PuzzlePiece can share
+ * the same MSV Expression (RelaxNG pattern:
+ * &lt;element&gt;&lt;choice&gt;&lt;name&gt;aName&lt;/name&gt;&lt;name&gt;anotherName&lt;/name&gt;&lt;/choice&gt;&lt;/element&gt;)
+ * </p>
+ * <p>Conventions: <ul>
+ * <li>hashCode uses the hashCode from the encapsulated Expressions. So two Definitions (rarely) can
+ * have the same hashCode. Equals uses Name _and_ hashCode.</li>
+ * <li>Sorting is done by ns:local tag names as first key and hashCode as second key.</li>
+ * <li>All returned PuzzlePieceSet objects are immutable to protect them against
+ * naive usage in velocity templates</li></ul></p>
+ */
+public class PuzzlePiece implements Comparable<PuzzlePiece>, QNamedPuzzleComponent {
+
+	private static MSVExpressionVisitorType TYPE_VISITOR = new MSVExpressionVisitorType();
+	private static MSVNameClassVisitorList NAME_VISITOR = new MSVNameClassVisitorList();
+	private Expression mExpression;
+	// all multiples of this tagname (contains only this if there are no multiples)
+	private PuzzlePieceSet mMultiples = new PuzzlePieceSet();
+	// definitions of elements which can have this as children
+	private PuzzlePieceSet mParents = new PuzzlePieceSet();
+	// DEFINITION CONTENT
+	// ns:local tagname
+	private String mName;
+
+	/* Properties for PuzzlePiece of Type.ELEMENT */
+	private PuzzlePieceSet mChildElements = new PuzzlePieceSet();
+	private HashSet<String> mMandatoryChildElementNames = new HashSet<String>();
+	private PuzzlePieceSet mAttributes = new PuzzlePieceSet();
+	private HashSet<String> mMandatoryChildAttributeNames = new HashSet<String>();
+	private boolean mCanHaveText = false;
+	private Set<Expression> mSingletonChildExpressions;
+	private Set<Expression> mMultipleChildExpressions;
+
+	/* Properties for PuzzlePiece of Type.ATTRIBUTE */
+	// Values like "left", "centered", "right"
+	private PuzzlePieceSet mValues = new PuzzlePieceSet();
+	// generic Data Types like "string", "countryCode", ...
+	private PuzzlePieceSet mDatatypes = new PuzzlePieceSet();
+
+	private PuzzlePiece(Expression exp, String name) {
+		mExpression = exp;
+		mName = name;
+	}
+
+	private PuzzlePiece(Expression exp) {
+		mExpression = exp;
+		MSVExpressionType type = (MSVExpressionType) exp.visit(TYPE_VISITOR);
+		if (type == MSVExpressionType.ATTRIBUTE || type == MSVExpressionType.ELEMENT) {
+			List<String> names = (List<String>) ((NameClassAndExpression) exp).getNameClass().visit(NAME_VISITOR);
+			if (names == null || names.size() != 1) {
+				throw new RuntimeException("Definition: ELEMENT or ATTRIBUTE expression exp with none or more than one name is only allowed in this(exp, name)");
+			}
+			mName = names.get(0);
+		}
+		if (type == MSVExpressionType.VALUE) {
+			mName = ((ValueExp) exp).value.toString();
+		}
+		if (type == MSVExpressionType.DATA) {
+			mName = ((DataExp) exp).getName().localName;
+		}
+	}
+
+	/**
+	 * Uses the name and the wrapped MSV Expression to test for equality.
+	 *
+	 * @param b Another object
+	 * @return Whether both objects equal
+	 */
+	public boolean equals(Object b) {
+		if (b instanceof PuzzlePiece) {
+			PuzzlePiece d = (PuzzlePiece) b;
+			if (d.mName.equals(mName) && d.mExpression.equals(mExpression)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Uses the wrapped MSV Expression for the hashCode. MSV Expressions are numbered consecutively by a distinct Hash Code.
+	 */
+	public int hashCode() {
+		return mExpression.hashCode();
+	}
+
+	/**
+	 * Uses the ns:local name of the wrapped MSV Expression as first key and the hashCode as second key.
+	 * If o1.equals(o2) this method will return 0 (since both must share the same Expression and name).
+	 *
+	 * @param o Other Object
+	 * @return Comparison
+	 */
+	public int compareTo(PuzzlePiece o) {
+		int retval = mName.compareTo(o.mName);
+		if (retval != 0) {
+			return retval;
+		}
+		return hashCode() - o.hashCode();
+	}
+
+	/*
+	 * Return whether the content of this and of another PuzzlePiece are equal.
+	 *
+	 * Content is everything that's inside a RelaxNG definition block. So child
+	 * elements, attributes, data types, name, definition type are all content.
+	 * Parent elements or multiples are no content information as they're
+	 * outside the RelaxNG definition block.
+	 *
+	 * This method is useful for reduction of Multiples with identical
+	 * definition content.
+	 *
+	 * No recursive checking: E.g. the child element DefinitionSets have to be really
+	 * equal to let this.contentEquals(other) be true. So PuzzlePiece reduction
+	 * has to be bottom up (VALUES, DATATYPES -> ATTRIBUTES -> ELEMENTS) and reduction
+	 * of ELEMENT definitions is not really possible (how to go bottom up in
+	 * ELEMENT tree?)
+	 */
+	protected boolean contentEquals(PuzzlePiece other) {
+		if (!mName.equals(other.mName)) {
+			return false;
+		}
+		if (!getType().equals(other.getType())) {
+			return false;
+		}
+		if (mCanHaveText != other.mCanHaveText) {
+			return false;
+		}
+		if (!mChildElements.equals(other.mChildElements)) {
+			return false;
+		}
+		if (!mAttributes.equals(other.mAttributes)) {
+			return false;
+		}
+		if (!mMandatoryChildElementNames.equals(other.mMandatoryChildElementNames)) {
+			return false;
+		}
+		if (!mMandatoryChildAttributeNames.equals(other.mMandatoryChildAttributeNames)) {
+			return false;
+		}
+		if (!mValues.equals(other.mValues)) {
+			return false;
+		}
+		if (!mDatatypes.equals(other.mDatatypes)) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Gets the ns:local tag name of this PuzzlePiece
+	 *
+	 * @return The tag name
+	 */
+	public String getQName() {
+		return mName;
+	}
+
+	public String getLocalName() {
+		return XMLModel.extractLocalname(mName);
+	}
+
+	public String getNamespace() {
+		return XMLModel.extractNamespace(mName);
+	}
+
+	/**
+	 * <p>Returns String representation (convenient method for getQName())</p>
+	 *
+	 * <p>Template Usage: Just use $aDefinition as you would use a string variable.</p>
+	 */
+	public String toString() {
+		return getQName();
+	}
+
+	/**
+	 * Gets the type of this (ELEMENT, ATTRIBUTE, DATA, VALUE)
+	 *
+	 * @return The ExpressionType of this PuzzlePiece
+	 */
+	public MSVExpressionType getType() {
+		return (MSVExpressionType) mExpression.visit(TYPE_VISITOR);
+	}
+
+	/**
+	 * Gets the wrapped Expression
+	 *
+	 * @return The Expression wrapped by this.
+	 */
+	public Expression getExpression() {
+		return mExpression;
+	}
+
+	/**
+	 * Determines whether this Element can have a text node as child
+	 */
+	public boolean canHaveText() {
+		return mCanHaveText;
+	}
+
+	public boolean isSingleton(PuzzleComponent child) {
+		for (PuzzlePiece element : child.getCollection()) {
+			if (mMultipleChildExpressions.contains(element.getExpression())) {
+				return false;
+			}
+			if (!mSingletonChildExpressions.contains(element.getExpression())) {
+				throw new RuntimeException("Definition.isSingleton: Unknown child element.");
+			}
+		}
+		return true;
+	}
+
+	public Collection<PuzzlePiece> getCollection() {
+		return Collections.singletonList(this);
+	}
+
+	/**
+	 * Gets the List of Definitions which share the same tag name, but are defined multiple times in the schema.
+	 * The list is type specific, i.e. an ATTRIBUTE can never be a multiple of an ELEMENT.
+	 *
+	 * @return The list of Definitions which share the same tag name.
+	 */
+	public PuzzlePieceSet withMultiples() {
+		return mMultiples;
+	}
+
+	/**
+	 * Gets the index of 'this' in the List of Definitions returned by withMultiples()
+	 *
+	 * @return Index of this PuzzlePiece object in the PuzzlePieceSet returned by withMultiples()
+	 */
+	public int getMultipleNumber() {
+		int retval = 0;
+		Iterator<PuzzlePiece> iter = mMultiples.iterator();
+		while (iter.hasNext()) {
+			if (iter.next().equals(this)) {
+				return retval;
+			}
+			retval++;
+		}
+		throw new RuntimeException("aDefinition.getMultipleNumber: Internal error");
+	}
+
+	/**
+	 * Gets the Parents which can contain this PuzzlePiece as a child
+	 *
+	 * @return The parent Definitions
+	 */
+	public PuzzlePieceSet getParents() {
+		return mParents;
+	}
+
+	/**
+	 * Gets the child elements of this PuzzlePiece. Please note that only Definitions of type ELEMENT can have child elements.
+	 *
+	 * @return The child Definitions of type ELEMENT
+	 */
+	public PuzzlePieceSet getChildElements() {
+		return mChildElements;
+	}
+
+	public boolean isMandatory(QNamedPuzzleComponent child) {
+		switch (child.getType()) {
+			case ATTRIBUTE:
+				if (mMandatoryChildAttributeNames.contains(child.getQName())) {
+					return true;
+				}
+				break;
+			case ELEMENT:
+				if (mMandatoryChildElementNames.contains(child.getQName())) {
+					return true;
+				}
+				break;
+		}
+		return false;
+	}
+
+	/**
+	 * Gets the Attributes of this PuzzlePiece. Please note that only Definitions of type ELEMENT can have attributes.
+	 *
+	 * @return The child Definitions of type ATTRIBUTE
+	 */
+	public PuzzlePieceSet getAttributes() {
+		return mAttributes;
+	}
+
+	/**
+	 * Gets the defined constant values. Please note that only Definitions of type ATTRIBUTE can have values.
+	 *
+	 * @return The constant values
+	 */
+	public PuzzlePieceSet getValues() {
+		return mValues;
+	}
+
+	/**
+	 * Gets the defined datatypes. Please note that only Definitions of type ATTRIBUTE can have datatypes.
+	 *
+	 * @return The datatypes
+	 */
+	public PuzzlePieceSet getDatatypes() {
+		return mDatatypes;
+	}
+
+
+	/*
+	 * ---------------------------------------------------------------------------
+	 *  PuzzlePiece Factory
+	 * ---------------------------------------------------------------------------
+	 */
+	/**
+	 * Creates all PuzzlePiece objects from MSV root tree.
+	 *
+	 * The PuzzlePiece objects are all made immutable to protect them
+	 * against changes by naive template usage. Note that the Sets of all elements/attributes
+	 * can only be made immutable by the caller after this method run.
+	 *
+	 * @param root MSV root Expression
+	 * @param newElementSet empty Set. Will be filled with Definitions of Type.ELEMENT
+	 * @param newAttributeSet empty Set. Will be filled with Definitions of Type.ATTRIBUTE
+	 */
+	public static void extractPuzzlePieces(Expression root, PuzzlePieceSet newElementSet, PuzzlePieceSet newAttributeSet) {
+		// e.g. the newElementSet is the set to iterate later in the template
+		extractTypedPuzzlePieces(root, newElementSet, ElementExp.class);
+		extractTypedPuzzlePieces(root, newAttributeSet, AttributeExp.class);
+		configureProperties(newElementSet, newAttributeSet);
+		reduceDatatypes(newAttributeSet);
+		reduceValues(newAttributeSet);
+		reduceAttributes(newElementSet, newAttributeSet);
+		makePuzzlePiecesImmutable(newElementSet);
+		makePuzzlePiecesImmutable(newAttributeSet);
+	}
+
+	// Extracts all Definitions of Type [ATTRIBUTE, ELEMENT] from MSV tree.
+	private static <T extends Expression> void extractTypedPuzzlePieces(Expression root, PuzzlePieceSet setToBeFilled, Class<T> superclass) {
+		MSVExpressionIterator iter = new MSVExpressionIterator(root, superclass);
+		HashMap<String, List<PuzzlePiece>> multipleMap = new HashMap<String, List<PuzzlePiece>>();
+
+		while (iter.hasNext()) {
+			Expression exp = iter.next();
+
+			// If there is more than one name for this expression, create more than one PuzzlePiece
+			List<String> names = (List<String>) ((NameClassAndExpression) exp).getNameClass().visit(NAME_VISITOR);
+
+			for (String name : names) {
+				if (name.length() == 0) {
+					throw new RuntimeException("Unnamed ELEMENT or ATTRIBUTE expression.");
+				}
+				// Create and store new definition
+				PuzzlePiece newDefinition = new PuzzlePiece(exp, name);
+
+				setToBeFilled.add(newDefinition);
+
+				// Check for multiples
+				List<PuzzlePiece> multiples = multipleMap.get(name);
+				if (multiples != null) {
+					multiples.add(newDefinition);
+				} else {
+					multiples = new ArrayList<PuzzlePiece>(1);
+					multiples.add(newDefinition);
+					multipleMap.put(name, multiples);
+				}
+			}
+
+		}
+
+		// Fills multiple information
+		Iterator<PuzzlePiece> defIter = setToBeFilled.iterator();
+		while (defIter.hasNext()) {
+			PuzzlePiece def = defIter.next();
+			def.mMultiples = new PuzzlePieceSet(multipleMap.get(def.getQName()));
+		}
+	}
+
+	// Builds Map Expression->List<PuzzlePiece>
+	private static Map<Expression, List<PuzzlePiece>> buildReverseMap(PuzzlePieceSet defs) {
+		Map<Expression, List<PuzzlePiece>> retval = new HashMap<Expression, List<PuzzlePiece>>();
+		Iterator<PuzzlePiece> iter = defs.iterator();
+		while (iter.hasNext()) {
+			PuzzlePiece def = iter.next();
+			List<PuzzlePiece> list = retval.get(def.getExpression());
+			if (list == null) {
+				list = new ArrayList<PuzzlePiece>();
+				retval.put(def.getExpression(), list);
+			}
+			list.add(def);
+		}
+		return retval;
+	}
+
+	// Builds Map Name->List<Expression>
+	private static Map<String, List<Expression>> buildNameExpressionsMap(PuzzlePieceSet defs) {
+		Map<String, List<Expression>> retval = new HashMap<String, List<Expression>>();
+		Iterator<PuzzlePiece> iter = defs.iterator();
+		while (iter.hasNext()) {
+			PuzzlePiece def = iter.next();
+			List<Expression> list = retval.get(def.getQName());
+			if (list == null) {
+				list = new ArrayList<Expression>();
+				retval.put(def.getQName(), list);
+			}
+			list.add(def.getExpression());
+		}
+		return retval;
+	}
+
+	// Unite Value Definitions with equal content. Has to be last step (after Value Definitions have been assigned to Attributes)
+	private static void reduceValues(PuzzlePieceSet attributes) {
+		PuzzlePieceSet values = new PuzzlePieceSet();
+		for (PuzzlePiece attr : attributes) {
+			values.addAll(attr.getValues());
+		}
+		Map<PuzzlePiece, PuzzlePiece> lostToSurvived = values.uniteDefinitionsWithEqualContent();
+		for (PuzzlePiece attr : attributes) {
+			PuzzlePieceSet attributeValues = attr.getValues();
+			PuzzlePieceSet immutable = new PuzzlePieceSet(attributeValues);
+			for (PuzzlePiece value : immutable) {
+				if (lostToSurvived.containsKey(value)) {
+					// Replace lost with survived
+					attributeValues.remove(value);
+					attributeValues.add(lostToSurvived.get(value));
+				}
+			}
+		}
+	}
+
+	// Unite Datatype Definitions with equal content. Has to be last step (after Datatype Definitions have been assigned to Attributes).
+	// Has to be even after reduceValues and reduceDatatypes, otherwise some attributes do not seem to have equal content
+	private static void reduceDatatypes(PuzzlePieceSet attributes) {
+		PuzzlePieceSet datatypes = new PuzzlePieceSet();
+		for (PuzzlePiece attr : attributes) {
+			datatypes.addAll(attr.getDatatypes());
+		}
+		Map<PuzzlePiece, PuzzlePiece> lostToSurvived = datatypes.uniteDefinitionsWithEqualContent();
+		for (PuzzlePiece attr : attributes) {
+			PuzzlePieceSet attributeDatatypes = attr.getValues();
+			PuzzlePieceSet immutable = new PuzzlePieceSet(attributeDatatypes);
+			for (PuzzlePiece datatype : immutable) {
+				if (lostToSurvived.containsKey(datatype)) {
+					// Replace lost with survived
+					attributeDatatypes.remove(datatype);
+					attributeDatatypes.add(lostToSurvived.get(datatype));
+				}
+			}
+		}
+	}
+
+	// Unite Attribute Definitions with equal content. Has to be last step (after Attribute Definitions have been assigned to Elements)
+	private static void reduceAttributes(PuzzlePieceSet elements, PuzzlePieceSet attributes) {
+		Map<PuzzlePiece, PuzzlePiece> lostToSurvived = attributes.uniteDefinitionsWithEqualContent();
+		for (PuzzlePiece el : elements) {
+			PuzzlePieceSet elementAttributes = el.getAttributes();
+			PuzzlePieceSet immutable = new PuzzlePieceSet(elementAttributes);
+			for (PuzzlePiece attribute : immutable) {
+				if (lostToSurvived.containsKey(attribute)) {
+					// Replace lost with survived
+					elementAttributes.remove(attribute);
+					elementAttributes.add(lostToSurvived.get(attribute));
+				}
+			}
+		}
+	}
+
+	// Sets Children, Attributes and Parents.
+	private static void configureProperties(PuzzlePieceSet elements, PuzzlePieceSet attributes) {
+		Map<Expression, List<PuzzlePiece>> reverseElementMap = buildReverseMap(elements);
+		Map<Expression, List<PuzzlePiece>> reverseAttributeMap = buildReverseMap(attributes);
+
+		// Handle Element Definitions
+		Iterator<PuzzlePiece> iter = elements.iterator();
+		while (iter.hasNext()) {
+			PuzzlePiece def = iter.next();
+			MSVExpressionIterator childFinder = new MSVExpressionIterator(def.getExpression(), NameClassAndExpression.class, MSVExpressionIterator.DIRECT_CHILDREN_ONLY);
+			while (childFinder.hasNext()) {
+				Expression child_exp = childFinder.next();
+				//2DO: IS CHILDEXPR BEREITS VORGEKOMMEN
+				// OR UNIQUE NEXT
+				List<PuzzlePiece> child_defs = null;
+				PuzzlePieceSet whereToAdd = null;
+				if (child_exp instanceof ElementExp) {
+					child_defs = reverseElementMap.get(child_exp);
+					whereToAdd = def.mChildElements;
+				} else if (child_exp instanceof AttributeExp) {
+					child_defs = reverseAttributeMap.get(child_exp);
+					whereToAdd = def.mAttributes;
+				}
+				if (child_defs != null) {
+					whereToAdd.addAll(child_defs);
+					for (PuzzlePiece child_def : child_defs) {
+						child_def.mParents.add(def);
+					}
+				}
+			}
+			MSVExpressionInformation elementInfo = new MSVExpressionInformation(def.getExpression());
+			def.mCanHaveText = elementInfo.canHaveText();
+
+			Map<String, List<Expression>> atnameToDefs = buildNameExpressionsMap(def.mAttributes);
+			for (String name : atnameToDefs.keySet()) {
+				if (elementInfo.isMandatory(atnameToDefs.get(name))) {
+					def.mMandatoryChildAttributeNames.add(name);
+				}
+			}
+
+			Map<String, List<Expression>> elnameToDefs = buildNameExpressionsMap(def.mChildElements);
+			for (String name : elnameToDefs.keySet()) {
+				if (elementInfo.isMandatory(elnameToDefs.get(name))) {
+					def.mMandatoryChildElementNames.add(name);
+				}
+			}
+
+			def.mSingletonChildExpressions = elementInfo.getSingletons();
+			def.mMultipleChildExpressions = elementInfo.getMultiples();
+
+		}
+
+		// Handle Attribute Definitions
+		Iterator<PuzzlePiece> aiter = attributes.iterator();
+		while (aiter.hasNext()) {
+			PuzzlePiece def = aiter.next();
+
+			MSVExpressionIterator datatypeFinder = new MSVExpressionIterator(def.getExpression(), DataExp.class, MSVExpressionIterator.DIRECT_CHILDREN_ONLY);
+			while (datatypeFinder.hasNext()) {
+				DataExp data_exp = (DataExp) datatypeFinder.next();
+				def.mDatatypes.add(new PuzzlePiece(data_exp));
+			}
+
+			MSVExpressionIterator valueFinder = new MSVExpressionIterator(def.getExpression(), ValueExp.class, MSVExpressionIterator.DIRECT_CHILDREN_ONLY);
+			while (valueFinder.hasNext()) {
+				ValueExp value_exp = (ValueExp) valueFinder.next();
+				if (value_exp.getName().localName.equals("token")) {
+					def.mValues.add(new PuzzlePiece(value_exp));
+				}
+			}
+
+		}
+
+	}
+
+	// Makes all Definitions unmodifiable
+	private static void makePuzzlePiecesImmutable(PuzzlePieceSet defs) {
+		Iterator<PuzzlePiece> iter = defs.iterator();
+		while (iter.hasNext()) {
+			PuzzlePiece def = iter.next();
+			def.mAttributes.makeImmutable();
+			def.mChildElements.makeImmutable();
+			def.mMultiples.makeImmutable();
+			def.mParents.makeImmutable();
+			def.mValues.makeImmutable();
+			def.mDatatypes.makeImmutable();
+		}
+		defs.makeImmutable();
+	}
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java b/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java
new file mode 100644
index 0000000..5e45505
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java
@@ -0,0 +1,435 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+
+/**
+ * Collection Class for RelaxNG definitions of an Element, Attribute, Value or Datatype.
+ *
+ * <p>Conventions: <ul><li>PuzzlePiece sorting is done by ns:local tag names as first key and hashCode as second key (see class PuzzlePiece).</li>
+ * <li>Since it is a Collection, PuzzlePieceSet is not meant to be used in a Collection. So equals(o) and hashCode() are not overwritten</li>
+ * <li>All returned PuzzlePieceSet objects are immutable to protect them against
+ * naive usage in velocity templates</li></ul></p>
+ */
+public class PuzzlePieceSet implements QNamedPuzzleComponent, Collection<PuzzlePiece> {
+
+    private boolean mImmutable = false;
+    private SortedSet<PuzzlePiece> mDefinitions;
+
+    public PuzzlePieceSet() {
+        mDefinitions = new TreeSet<PuzzlePiece>();
+    }
+
+    public PuzzlePieceSet(Collection<PuzzlePiece> c) {
+        mDefinitions = new TreeSet<PuzzlePiece>(c);
+    }
+
+    private void assertNotImmutable() {
+        if (mImmutable) {
+            throw new RuntimeException("Attempt to change an immutable DefinitionSet.");
+        }
+    }
+
+    private void assertNotEmpty(String plannedAction) {
+        if (this.size()==0) {
+            throw new RuntimeException("Attempt to " + plannedAction + " of empty DefinitionSet ");
+        }
+    }
+    
+    private void assertMultiples(String plannedAction) {
+        assertNotEmpty(plannedAction);
+        PuzzlePiece first = first();
+        MSVExpressionType type = first.getType();
+        String name = first.getQName();
+        for (PuzzlePiece def : this) {
+            if (!type.equals(def.getType())) {
+                throw new RuntimeException("Attempt to " + plannedAction + " of DefinitionSet consisting of different types of Definition objetcs.");
+            }
+            String defname = def.getQName();
+            if ((name == null && defname != null) || !name.equals(defname)) {
+                throw new RuntimeException("Attempt to " + plannedAction + " of DefinitionSet consisting of differently named Definition objetcs.");
+            }
+        }
+    }
+
+    public boolean equals(Object o) {
+        return (o instanceof PuzzlePieceSet && ((PuzzlePieceSet) o).mDefinitions.equals(mDefinitions)) ? true : false;
+    }
+
+    public int hashCode() {
+        return mDefinitions.hashCode();
+    }
+    
+    private PuzzlePiece first() {
+        return this.iterator().next();
+    }
+
+    /* Unite Definitions with equal content
+     *
+     * Returns a Map of the lost Definitions to their survived counterparts
+     */
+    Map<PuzzlePiece, PuzzlePiece> uniteDefinitionsWithEqualContent() {
+        Map<PuzzlePiece, PuzzlePiece> retval = new HashMap<PuzzlePiece, PuzzlePiece>();
+        SortedSet<PuzzlePiece> immutableSet = new TreeSet<PuzzlePiece>(this.mDefinitions);
+        for (PuzzlePiece def1 : immutableSet) {
+            if (!this.mDefinitions.contains(def1)) {
+                // if def1 is already removed, we shouldn't process it
+                continue;
+            }
+            for (PuzzlePiece def2 : immutableSet.tailSet(def1)) {
+                if (def1 == def2) {
+                    // Don't compare def1 to def1
+                    continue;
+                }
+                if (!this.mDefinitions.contains(def2)) {
+                    //if def2 is already removed, we shouldn't process it
+                    continue;
+                }
+                if (!def1.getQName().equals(def2.getQName())) {
+                    break;
+                }
+                // Now test for content equality
+                if (def1.contentEquals(def2)) {
+                    // remove from map
+                    this.remove(def2);
+                    // map lost to survived counterpart
+                    retval.put(def2, def1);
+                    // mix parent information
+                    def1.getParents().addAll(def2.getParents());
+                }
+            }
+        }
+        // Remove deleted multiples in a separate step since in the first step the needed
+        // information wasn't present (note that Multiples are no synonym for Definitions with equal content!)
+        for (PuzzlePiece def : this.mDefinitions) {
+            PuzzlePieceSet immutableDups = new PuzzlePieceSet(def.withMultiples());
+            for (PuzzlePiece multiple : immutableDups) {
+                if (multiple != def) {
+                    if (!this.mDefinitions.contains(multiple)) {
+                        def.withMultiples().remove(multiple);
+                    }
+                }
+            }
+        }
+        return retval;
+    }
+    
+    /**
+     * Make PuzzlePieceSet immutable. Cannot be undone.
+     *
+     * Template Usage: Not for use in templates as all PuzzlePieceSet already have been made immutable.
+     */
+    public void makeImmutable() {
+        mImmutable = true;
+    }
+
+    /**
+     * <p>Returns new PuzzlePieceSet containing the elements of this PuzzlePieceSet, but restricted to one
+     * PuzzlePiece per Name.</p>
+     *
+     * <p>Template Usage: #foreach ($element in $elements.withoutMultiples())</p>
+     *
+     * @return new PuzzlePieceSet
+     */
+    public PuzzlePieceSet withoutMultiples() {
+        Map<String, PuzzlePiece> uniqueMap = new HashMap<String, PuzzlePiece>();
+        for (PuzzlePiece def : this) {
+            uniqueMap.put(def.getQName(), def);
+        }
+        return new PuzzlePieceSet(uniqueMap.values());
+    }
+
+    /**
+     * <p>Returns new PuzzlePieceSet containing the elements of this PuzzlePieceSet, but without
+     * the elements of the parameter removeAll</p>
+     *
+     * <p>Template Usage: #set ($non_base_attributes = $element.getAttributes().without($baseclass.getAttributes())</p>
+     *
+     * @param removeAll QNamedPuzzleComponent which (or which elements) should be removed from the new PuzzlePieceSet
+     * @return new PuzzlePieceSet
+     */
+    public PuzzlePieceSet without(QNamedPuzzleComponent removeAll) {
+        PuzzlePieceSet retval = new PuzzlePieceSet(this);
+        retval.removeAll(removeAll.getCollection());
+        return retval;
+    }
+
+    /**
+     * Returns new PuzzlePieceSet containing the elements of this PuzzlePieceSet, but only those
+     * which have at least one element from the QNamedPuzzleComponent parameter as one of their parent Definitions.
+     *
+     * <p>Template Usage: Imagine we have one attribute name and we're not interested in the differences
+     * between Definitions sharing the same name. We're now printing the
+     * resulting allowed attribute values for each parent element name: </p>
+     * <code><br />
+     * #set ( $oneOrMoreAttributes = $model.getAttribute($atttributename) )<br />
+     * ## we want to write information about only _one_ parent per Name...<br />
+     * #foreach ($parent in $oneOrMoreAttributes.getParents().withoutMultiples())<br/>
+     * - Allowed Values for Parent Element $parent :<br />
+     * ## but we want the attribute values displayed which are allowed in _all_ parents with the same Name...<br />
+     * #foreach ($value in $oneOrMoreAttributes.byParent($parent.withMultiples()).getValues())<br />
+     *    -- "$value" <br />
+     * #end<br />
+     * #end
+     * </code><br />
+     *
+     * @param parents
+     * @return new PuzzlePieceSet
+     */
+    public PuzzlePieceSet byParent(QNamedPuzzleComponent parents) {
+        PuzzlePieceSet retval = new PuzzlePieceSet();
+        for (PuzzlePiece def : this) {
+            PuzzlePieceSet defparents = def.getParents();
+            for (PuzzlePiece parent : parents.getCollection()) {
+                if (defparents.contains(parent)) {
+                    retval.add(def);
+                    break;
+                }
+            }
+        }
+        return retval;
+    }
+
+    /**
+     * Check whether this List contains an Element by this Name
+     *
+     * @param aDefinitionName
+     * @return True if an element by this name exists
+     */
+    public boolean containsName(String aDefinitionName) {
+        for (PuzzlePiece def : this) {
+            if (def.getQName().equals(aDefinitionName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check whether this List contains an Element by this Name
+     *
+     * @param aNamed
+     * @return True if an element by this name exists
+     */
+    public boolean containsName(QNamed aNamed) {
+        return containsName(aNamed.getQName());
+    }
+
+/*
+ * -----------------------------------------------------
+ *  Interface QNamed
+ * -----------------------------------------------------
+ */
+
+
+    /**
+     * Gets the ns:local tag name of the Definitions - provided that this PuzzlePieceSet
+     * is not empty and all Definitions share the same tag name. Throws Exception otherwise.
+     *
+     * @return The tag name
+     */
+    public String getQName() {
+        assertMultiples("get name");
+        return first().getQName();
+    }
+
+    /**
+     * Gets the type of the Definitions - provided that this PuzzlePieceSet
+     * is not empty and all Definitions have the same type and name. Throws Exception otherwise.
+     */
+    public MSVExpressionType getType() {
+        assertMultiples("get type");
+        return first().getType();
+    }
+
+    /**
+     * Determines whether the Definitions can have text - provided that this PuzzlePieceSet
+     * is not empty and all Definitions have the same type and name. Throws Exception otherwise.
+     */
+    public boolean canHaveText() {
+        assertMultiples("determine text availability");
+        for (PuzzlePiece def : this) {
+            if (def.canHaveText()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean isSingleton(PuzzleComponent child) {
+        for (PuzzlePiece def : this) {
+            if (!def.isSingleton(child)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public String getLocalName() {
+        return XMLModel.extractLocalname(getQName());
+    }
+
+    public String getNamespace() {
+        return XMLModel.extractNamespace(getQName());
+    }
+
+    /**
+     * <p>Returns String representation (convenient method for getQName())</p>
+     *
+     * <p>Template Usage: Just use $aDefinitionSet as you would use a string variable</p>
+     */
+    public String toString() {
+        return getQName();
+    }
+
+/*
+ * -----------------------------------------------------
+ *  Interface Collection<PuzzlePiece>
+ * -----------------------------------------------------
+ */
+
+    public boolean add(PuzzlePiece e) {
+        assertNotImmutable();
+        return mDefinitions.add(e);
+    }
+
+    public boolean addAll(Collection<? extends PuzzlePiece> c) {
+        assertNotImmutable();
+        return mDefinitions.addAll(c);
+    }
+
+    public void clear() {
+        assertNotImmutable();
+        mDefinitions.clear();
+    }
+
+    public boolean contains(Object o) {
+        return (o instanceof PuzzlePiece) ? mDefinitions.contains((PuzzlePiece) o) : false;
+    }
+
+    public boolean containsAll(Collection<?> c) {
+        return mDefinitions.containsAll(c);
+    }
+
+    public boolean isEmpty() {
+        return mDefinitions.isEmpty();
+    }
+
+    public Iterator<PuzzlePiece> iterator() {
+        return mDefinitions.iterator();
+    }
+
+    public boolean remove(Object o) {
+        assertNotImmutable();
+        return (o instanceof PuzzlePiece) ? mDefinitions.remove((PuzzlePiece) o) : false;
+    }
+
+    public boolean removeAll(Collection<?> c) {
+        assertNotImmutable();
+        return mDefinitions.removeAll(c);
+    }
+
+    public boolean retainAll(Collection<?> c) {
+        assertNotImmutable();
+        return mDefinitions.retainAll(c);
+    }
+
+    public int size() {
+        return mDefinitions.size();
+    }
+
+    public Object[] toArray() {
+        return mDefinitions.toArray();
+    }
+
+    public <T> T[] toArray(T[] a) {
+        return mDefinitions.toArray(a);
+    }
+
+/*
+ * -----------------------------------------------------
+ *  Interface QNamedPuzzleComponent
+ * -----------------------------------------------------
+ */
+
+    public PuzzlePieceSet getChildElements() {
+        PuzzlePieceSet retval = new PuzzlePieceSet();
+        for (PuzzlePiece def : this) {
+            retval.addAll(def.getChildElements());
+        }
+        return retval;
+    }
+
+    public boolean isMandatory(QNamedPuzzleComponent child) {
+        for (PuzzlePiece def : this) {
+            if (def.isMandatory(child)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public Collection<PuzzlePiece> getCollection() {
+        return mDefinitions;
+    }
+
+    public PuzzlePieceSet getAttributes() {
+        PuzzlePieceSet retval = new PuzzlePieceSet();
+        for (PuzzlePiece def : this) {
+            retval.addAll(def.getAttributes());
+        }
+        return retval;
+    }
+
+    public PuzzlePieceSet getDatatypes() {
+        PuzzlePieceSet retval = new PuzzlePieceSet();
+        for (PuzzlePiece def : this) {
+            retval.addAll(def.getDatatypes());
+        }
+        return retval;
+    }
+
+    public PuzzlePieceSet getParents() {
+        PuzzlePieceSet retval = new PuzzlePieceSet();
+        for (PuzzlePiece def : this) {
+            retval.addAll(def.getParents());
+        }
+        return retval;
+    }
+
+
+    public PuzzlePieceSet getValues() {
+        PuzzlePieceSet retval = new PuzzlePieceSet();
+        for (PuzzlePiece def : this) {
+            retval.addAll(def.getValues());
+        }
+        return retval;
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/QNameValue.java b/trunk/generator/schema2template/src/main/java/schema2template/model/QNameValue.java
new file mode 100644
index 0000000..6564391
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/QNameValue.java
@@ -0,0 +1,68 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+/**
+ * <p>Domain specific models (Odf, Java, ...) often return 'ns:localname' Strings.
+ * The purpose of this class is to encapsulate these Strings so in templates they
+ * can be treated like other QNamed objects.</p>
+ * <p>Contract: These objects are distincted only by the encapsulated String. So
+ * they use this String for equals(o), hashCode() and compareTo(o).</p>
+ */
+public class QNameValue implements QNamed, Comparable<QNameValue> {
+
+    private String mName;
+
+    /**
+     * Constructor to create a String wrapper
+     *
+     * @param name the String to wrap
+     */
+    public QNameValue(String name) {
+        mName = name;
+    }
+
+    public boolean equals(Object o) {
+        return (o instanceof QNameValue) ? ((QNameValue) o).mName.equals(mName) : false;
+    }
+
+    public int hashCode() {
+        return mName.hashCode();
+    }
+
+    public String getLocalName() {
+        return XMLModel.extractLocalname(mName);
+    }
+
+    public String getQName() {
+        return mName;
+    }
+
+    public String getNamespace() {
+        return XMLModel.extractNamespace(mName);
+    }
+
+    public int compareTo(QNameValue o) {
+        return this.mName.compareTo(o.mName);
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/QNamed.java b/trunk/generator/schema2template/src/main/java/schema2template/model/QNamed.java
new file mode 100644
index 0000000..279880a
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/QNamed.java
@@ -0,0 +1,56 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+/**
+ * Unambiguously named (ns:localname) object.
+ *
+ * <p>Contract: Every object implementing hasQName should overwrite the toString() method and
+ * return the QName.</p>
+ * <p>Warning: Using this interface does not imply any information about
+ * the equals() or hashCode() methods. So for using objects with qualified names in a
+ * Collection, you need information from the implementing class.</p>
+ */
+public interface QNamed {
+
+    /**
+     * Get the QName (i.e. namespace:localname )
+     *
+     * @return full name
+     */
+    public String getQName();
+
+    /**
+     * Get only namespace
+     *
+     * @return namespace
+     */
+    public String getNamespace();
+
+    /**
+     * Get only localname
+     *
+     * @return localname
+     */
+    public String getLocalName();
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/QNamedPuzzleComponent.java b/trunk/generator/schema2template/src/main/java/schema2template/model/QNamedPuzzleComponent.java
new file mode 100644
index 0000000..8795b06
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/QNamedPuzzleComponent.java
@@ -0,0 +1,61 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+/**
+ * By using this interface you declare that:
+ * <ul>
+ * <li>you don't care if a QNamedPuzzleComponent is a Collection of Jigsaw pieces
+ * or one single Jigsaw piece.</li>
+ * <li>you expect one single name. If the QNamedPuzzleComponent is a Collection of definitions,
+ * all definitions have to be equally named. Calling getQName(), toString(), getLocalName() or
+ * getNamespace() on a Collection of differently named definitions will throw a
+ * RuntimeException.
+ * For example: 
+ * A multiple definition of an attribute is frequently used in an XML schema.
+ * 
+ *
+ * </li>
+ * </ul>
+ */
+public interface QNamedPuzzleComponent extends QNamed, PuzzleComponent {
+
+    /**
+     * ELEMENT Definition only: Determine solely by child type and name
+     * whether child is mandatory.
+     * 
+     * <p>Here's why we're not using the child Definition object(s) for this:
+     * An element often has a mandatory attribute, but two (or more) different content definitions
+     * for this attribute. This is done by defining this attribute twice and creating a 
+     * CHOICE between both Definitions. If you'd ask whether one of these definitions is mandatory,
+     * you'd always get false as answer as you have the choice between the two definitions.
+     * Mostly this is not the answer you're looking for.</p>
+     *
+     * <p>Contract: If 'this' is a Collection, mandatory means mandatory for one member of 'this'.</p>
+     *
+     * @param child The child Definition(s) of type ELEMENT or ATTRIBUTE
+     * @return true if child is a defined child of this and if it's mandatory. False otherwise.
+     *
+     */
+    public boolean isMandatory(QNamedPuzzleComponent child);
+
+}
diff --git a/trunk/generator/schema2template/src/main/java/schema2template/model/XMLModel.java b/trunk/generator/schema2template/src/main/java/schema2template/model/XMLModel.java
new file mode 100644
index 0000000..c283eba
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/java/schema2template/model/XMLModel.java
@@ -0,0 +1,397 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.model;
+
+import com.sun.msv.grammar.Expression;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+/**
+ * The most important model, the first access to the XML Schema information.
+ * 
+ * Provides all XML attribute and XML element definitions from the schema.
+ * All further information can be accessed from those definitions
+ * (e.g. dependencies, constant values, data types, etc.).
+ */
+public class XMLModel {
+
+    PuzzlePieceSet mElements = new PuzzlePieceSet();
+    PuzzlePieceSet mAttributes = new PuzzlePieceSet();
+    Map<String, PuzzlePiece> mNameElementMap;
+    Map<String, PuzzlePiece> mNameAttributeMap;
+
+    /**
+     * Constructs new model by the MSV root expression
+     *
+     * @param root MSV root Expression
+     */
+    public XMLModel(Expression root) {
+        PuzzlePiece.extractPuzzlePieces(root, mElements, mAttributes);
+        mElements.makeImmutable();
+        mAttributes.makeImmutable();
+        mNameElementMap = createMap(mElements);
+        mNameAttributeMap = createMap(mAttributes);
+    }
+
+    // Create Map Name->PuzzlePiece. Ignore the fact that there may be more than one PuzzlePiece per Name
+    private static Map<String, PuzzlePiece> createMap(Collection<PuzzlePiece> definitions) {
+        Map<String, PuzzlePiece> retval = new HashMap<String, PuzzlePiece>();
+        Iterator<PuzzlePiece> iter = definitions.iterator();
+        while (iter.hasNext()) {
+            PuzzlePiece def = iter.next();
+            retval.put(def.getQName(), def);
+        }
+        return retval;
+    }
+
+    /**
+     * Get all elements, sorted by ns:local name.
+     *
+     * @return Unmodifiable SortedSet of elements
+     */
+    public PuzzlePieceSet getElements() {
+        return mElements;
+    }
+
+    /**
+     * Get all attributes, sorted by ns:local name.
+     * 
+     * @return Unmodifiable SortedSet of attributes
+     */
+    public PuzzlePieceSet getAttributes() {
+        return mAttributes;
+    }
+
+    /**
+     * Get element(s) by tag name. If there are multiple elements sharing the same
+     * tag name, a PuzzlePieceSet is returned. If not, a single PuzzlePiece is returned.
+     *
+     * @param name
+     * @return Element PuzzlePiece(s)
+     */
+    public QNamedPuzzleComponent getElement(String name) {
+        PuzzlePiece element = mNameElementMap.get(name);
+        if (element == null) {
+            return null;
+        }
+        return element.withMultiples();
+    }
+
+    /**
+     * Get element by tag name and hash code. The hash code distincts
+     * Elements sharing the same tag name. 
+     *
+     * @param name
+     * @param hashCode
+     * @return Element PuzzlePiece
+     */
+    public PuzzlePiece getElement(String name, int hashCode) {
+        PuzzlePiece element = mNameElementMap.get(name);
+        if (element == null) {
+            return null;
+        }
+        for (PuzzlePiece def : element.withMultiples()) {
+            if (def.hashCode() == hashCode) {
+                return def;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Get attribute by tag name. If there are multiple attributes sharing the same
+     * tag name, a PuzzlePieceSet is returned. If not, a single PuzzlePiece is returned.
+     *
+     * @param name
+     * @return Attribute PuzzlePiece(s)
+     */
+    public QNamedPuzzleComponent getAttribute(String name) {
+        PuzzlePiece attribute = mNameAttributeMap.get(name);
+        if (attribute == null) {
+            return null;
+        }
+        return attribute.withMultiples();
+    }
+
+    /**
+     * Get attribute by tag name and hash code. The hash code distincts
+     * Attributes sharing the same tag name. 
+     *
+     * @param name
+     * @param hashCode
+     * @return Attribute PuzzlePiece
+     */
+    public PuzzlePiece getAttribute(String name, int hashCode) {
+        PuzzlePiece attribute = mNameAttributeMap.get(name);
+        if (attribute == null) {
+            return null;
+        }
+        for (PuzzlePiece def : attribute.withMultiples()) {
+            if (def.hashCode() == hashCode) {
+                return def;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Convert a-few:words into AFewWords in CamelCase spelling
+     *
+     * @param raw input String
+     * @return filtered output String
+     */
+    public static String camelCase(String raw) {
+       StringTokenizer tok = new StringTokenizer(raw, "-:/ _.,");
+       String retval = "";
+       while (tok.hasMoreElements()) {
+           String word = tok.nextToken();
+           if (! word.equals("")) {
+               retval += word.substring(0, 1).toUpperCase() + word.substring(1);
+           }
+       }
+       return retval;
+    }
+
+    /**
+     * Convert a-few:words into AFewWords in CamelCase spelling
+     *
+     * @param def input
+     * @return filtered output String
+     */
+    public static String camelCase(QNamed def) {
+        return camelCase(def.getQName());
+    }
+
+    /**
+     * Convert a-few:words into aFewWords in spelling for java method names
+     *
+     * @param raw input String
+     * @return filtered output String
+     */
+    public static String javaCase(String raw) {
+        String retval = camelCase(raw);
+        if (retval.length() > 0) {
+            retval = retval.substring(0,1).toLowerCase().concat(retval.substring(1));
+        }
+        return retval;
+    }
+
+    /**
+     * Convert a-few:words into aFewWords in spelling for java method names
+     *
+     * @param def input
+     * @return filtered output String
+     */
+    public static String javaCase(QNamed def) {
+        return javaCase(def.getQName());
+    }
+
+    /**
+     * Convert a-few:words into A_FEW_WORDS in spelling used for Java constants
+     *
+     * @param raw input String
+     * @return filtered output String
+     */
+    public static String constantCase(String raw) {
+       StringTokenizer tok = new StringTokenizer(raw, "-:/ _.,");
+       String retval = "";
+       String separator = "";
+       while (tok.hasMoreElements()) {
+           String word = tok.nextToken();
+           if (! word.equals("")) {
+               retval += separator + word.toUpperCase();
+               separator = "_";
+           }
+       }
+       return retval;
+    }
+
+    /**
+     * Convert a-few:words into A_FEW_WORDS in spelling used for Java constants
+     *
+     * @param def input
+     * @return filtered output String
+     */
+    public static String constantCase(QNamed def) {
+        return constantCase(def.getQName());
+    }
+
+    /**
+     * Assist method for camel-case adaptions or namespace extraction.
+	 * Maybe not used anymore: Get first word out of a String containing delimiters like "-:/ _.,"
+     *
+	 *
+     * @param raw input String
+     * @return filtered output String
+     */
+    public static String firstWord(String raw) {
+       StringTokenizer tok = new StringTokenizer(raw, "-:/ _.,");
+       if (tok.hasMoreElements()) {
+           return tok.nextToken();
+       }
+       return null;
+    }
+
+    /**
+     * Maybe not used anymore: Get first word out of a QNamed object containing delimiters like "-:/ _.,"
+     *
+     * @param def input
+     * @return first word
+     */
+    public static String firstWord(QNamed def) {
+        return firstWord(def.getQName());
+    }
+
+    /**
+     * Maybe not used anymore: Get last word out of a String containing delimiters like "-:/ _.,"
+     *
+     * @param raw input
+     * @return last word
+     */
+    public static String lastWord(String raw) {
+       StringTokenizer tok = new StringTokenizer(raw, "-:/ _.,");
+       String retval = null;
+       while (tok.hasMoreElements()) {
+           retval = tok.nextToken();
+       }
+       return retval;
+    }
+
+    /**
+     * Maybe not used anymore: Get last word out of a String containing delimiters like "-:/ _.,"
+     *
+     * @param def input
+     * @return last word
+     */
+    public static String lastWord(QNamed def) {
+        return lastWord(def.getQName());
+    }
+
+    /**
+     * (Java) member variable may not start with a number, so escape it
+     * @param in raw input
+     * @return filtered output, starting with a literal
+     */
+    public static String escapeKeyword(QNamed in) {
+        return escapeKeyword(in.getQName());
+    }
+
+    /**
+     * (Java) Keyword may not start with a number, so escape it
+     *
+     * @param in raw input
+     * @return filtered output, starting with a literal
+     */
+    public static String escapeKeyword(String in) {
+        if (in == null || in.length() == 0) {
+            return in;
+        }
+        String out = in;
+        // Do not start with number
+        if (out.substring(0,1).matches("^\\p{Digit}")) {
+            out = "_" + out;
+        }
+        return out;
+    }
+
+    /**
+     * Escape the quotation marks of String literals
+     * 
+     * @param in raw input
+     * @return filtered output, with escaped quotation marks
+     */
+    public static String escapeLiteral(QNamed in) {
+        return escapeLiteral(in.getQName());
+    }
+
+    /**
+     * Escape the quotation marks of String literals
+     *
+     * @param in raw input
+     * @return filtered output, with escaped quotation marks
+     */
+    public static String escapeLiteral(String in) {
+        if (in == null || in.length() == 0) {
+            return in;
+        }
+        String out = in;
+        // Escape '"'
+        out = out.replaceAll("\"", "\\\\\"");
+        return out;
+    }
+
+    /**
+     * Extract namespace ns from ns:local name
+     *
+     * @param name in form ns:local
+     * @return ns part from ns:local name
+     */
+    public static String extractNamespace(String name) {
+        int pos = name.lastIndexOf(":");
+        if (pos > 0 && pos < name.length() - 1) {
+            return name.substring(0, pos);
+        }
+        else {
+            return null;
+        }
+    }
+
+    /**
+     * Extract namespace ns from ns:local name
+     *
+     * @param def QNamed object
+     * @return ns part from ns:local name
+     */
+    public static String extractNamespace(QNamed def) {
+        return extractNamespace(def.getQName());
+    }
+
+    /**
+     * Extract localname local from ns:local name
+     *
+     * @param name in form ns:local
+     * @return local part from ns:local name
+     */
+    public static String extractLocalname(String name) {
+        int pos = name.lastIndexOf(":");
+        if (pos > 0 && pos < name.length() - 1) {
+            return name.substring(pos + 1);
+        }
+        else {
+            return null;
+        }
+    }
+
+    /**
+     * Extract localname local from ns:local name
+     *
+     * @param def QNamed object
+     * @return local part from ns:local name
+     */
+    public static String extractLocalname(QNamed def) {
+        return extractLocalname(def.getQName());
+    }
+
+}
diff --git a/trunk/generator/schema2template/src/main/javadoc/overview.html b/trunk/generator/schema2template/src/main/javadoc/overview.html
new file mode 100644
index 0000000..53b2acb
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/javadoc/overview.html
@@ -0,0 +1,291 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!--
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+<!--
+Reference this overview.html
+by specifying it in an ant task, like:
+<javadoc
+  ...
+  overview="${path-to-overview.html}/overview.html"
+/>
+-->
+<html>
+<head>
+    <title>Schema2Template Overview</title>
+</head>
+<body> 
+<p>The schema2template project's objective is to provide an API for easily filling user templates from arbitrary XML schematas.</p>
+            
+<h2>Introduction</h2>
+
+<p>This project allows you to process a RelaxNG schema file and to convert the definitions to any text based format you like. E.g.
+you can produce one source code file for each element defined in schema file. Or maybe you want to produce one single text or HTML
+based overview of the schema.</p>
+
+<p>Since this project is based on the Sun Multi Schema Validator, it should be able to process multiple schema formats. However up to now it has only been
+tested with RelaxNG.</p>
+
+<p>Several examples are delivered together with this project:</p>
+<ol>
+<li>Read the OpenDocument Schema and produce a Java based DOM API</li>
+<li>Read the OpenDocument Schema and produce an HTML overview of all ODF elements and attributes</li>
+<li>Read the OpenDocument Schema and produce one single Python file which represents the element hierarchy</li>
+</ol>
+
+<p>A non-trivial topic is the concept of multiple definitions for a single element or attribute, which is possible in RelaxNG. 
+The easiest way would be to unite these definitions (we call them Multiples) to one common definition. However this way important information would be lost.
+E.g. one element may have the attribute foo whith possible value <em>left</em>. This attribute may also be possible in another element, but then with 
+possible values <em>left</em> and <em>right</em>. That's why we decided to keep the distinction, even if it may make it harder to understand the API of this project. 
+We might enhance this concept in the future, e.g. to exactly determine which of the multiple definitions holds for the current element in an ODF element tree.
+</p>
+
+<h2>Velocity Help</h2>
+
+Go to the "Engine" section of the the Velocity <a href="http://velocity.apache.org/">project site</a> to find the Velocity User Guide.
+
+The velocity template structure and commands are explained there.
+
+<h2>Schema2Template file structure</h2>
+
+<p>We use a 2-step procedure: First we generate a list of files we'd like to create. While we could write this list manually, the generation of this
+list frees us from having to write an entry for each schema element or attribute.
+
+The template to generate this list is called output-files.vm, the list itself (i.e. the result of running output-files.vm) is called output-files.xml.</p>
+
+<p>Here's an example output-files.xml:</p>
+
+<pre>
+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;filelist&gt;
+    &lt;file path=&quot;OdfHtmlSpecification.html&quot; template=&quot;odf-reference-template.vm&quot; /&gt;
+    &lt;file path=&quot;element/anim/AnimAnimateElement.java&quot; 
+    	     context=&quot;anim:animate&quot; 
+	     template=&quot;java-odfdom-element-template.vm&quot; /&gt;
+    ...
+&lt;/filelist&gt;
+</pre>
+
+<p>In the second step we parse output-files.xml. For every "file" entry we run the given Velocity "template", fill its context with the optional "context"
+property and write the output to the given "path". 
+The "context" property (and as seen later - the optional "param" property as well) is used in templates which process only one element or attribute - 
+to provide them with the name of this element or attribute. 
+In the above example the template for the generation of a Java class is such a template, while the template to produce the whole 
+OdfHtmlSpecification.html is a template whith a global context, i.e. it processes the whole Schema.</p>
+
+<h2>Schema2Template specific template help</h2>
+
+<p>In velocity templates, you have context objects, provided by the Java Velocity Runner Class. These are Java objects and you can call any method 
+of these objects like you would do in Java. In Schema2Template we provide the following context objects (see JavaDoc of the given Classes):</p>
+
+<a name="contextObjects" />
+
+<ul>
+<li>SchemaModel model: Provides the elements and attributes defined in the schema.</li>
+<li>OdfModel odfmodel: Provides additional information from the Odf Specification, like attribute standard values or element style families.</li>
+<li>SourceCodeModel javamodel: Provides additional information for generation of Source Code, like common base classes for elements.</li>
+<li>String context: The (optional) name of the current element. You can use model to get the element or attribute described by this name</li>
+<li>String param: A freely usable (optional) argument. An example usage is to provide a number to distinguish between elements (or attributes) sharing the same name.</li>
+</ul>
+
+<p>It should be noted that the context of output-files.vm behaves like the context of all templates which are started from there. Of course in the
+context of output-files.vm the optional context Objects "context" and "param" are null.</p>
+
+<h3>PuzzlePiece Class</h3>
+
+<p>The PuzzlePiece class provides some sort of "piece of a puzzle", containing the definition of an Odf element, attribute, datatype or
+constant attribute value. This class contains methods for quiering the relationship between definitions, e.g. to get all child elements,
+attributes, parent elements, datatypes, values, etc... PuzzlePieces are
+sorted by their name (which has the form "ns:localname").</p>
+
+<p>Some of these return parameters are collections. For these there is the class PuzzlePieceSet, which is a SortedSet of PuzzlePieces. PuzzlePiece
+and PuzzlePieceSet both implement the interface QNamedPuzzleComponent, and therefore have many methods in common (you can query all child elements
+for a PuzzlePiece as well as for a whole PuzzlePieceSet. And you can get the name for a PuzzlePiece as well as for a whole PuzzlePieceSet - provided all PuzzlePieces
+are equally named, ...)</p>
+
+<p>Before we come to the point on how to use PuzzlePieces and how to get them, there's one more important thing to know: </p>
+
+<h3>Multiples and Multiple Number</h3>
+
+<p>One element (form:list-value) and many attributes (chart-symbol-type, text:outline-level, etc...) are defined multiple times in Odf Schema. 
+Each definition is represented by a PuzzlePiece object. Those PuzzlePieces sharing the same name are called Multiples.
+Each Multiple may differ in parent elements, child elements and attributes.
+From a PuzzlePiece you can get all PuzzlePieces sharing the same name as the PuzzlePiece
+by its method withMultiples(). If there are no other PuzzlePieces you get at least a singleton PuzzlePieceSet containing only this PuzzlePiece.</p>
+
+<h3>How to get QNamedPuzzleComponent (PuzzlePiece and PuzzlePieceSets)</h3>
+
+<p>If you do not want to distinguish between elements (or attributes) sharing the same name you can use in templates processing only one element:<br />
+$model.getElement($context) or $model.getAttribute($context). By this you get a PuzzlePieceSet of PuzzlePieces sharing the same name. Since both
+classes share most methods, you can go on with your template like you'd use one single PuzzlePiece.</p>
+
+<p>If you want to distinguish between elements (or attributes) sharing the same name you can use in templates processing only one element:<br />
+$model.getElement($context, $param) or $model.getAttribute($context, $param), provided that context contains the name of the PuzzlePiece and param
+contains the multiple number to distinguish between these PuzzlePieces. In other words you have to fill both properties in output-files.vm with the needed values.
+You get the name of a PuzzlePiece by ${aDefinition.getQName()} or directly by $aDefinition and the multiple number by ${aDefinition.getMultipleNumber()}.<br />
+<em>It should be noted that this is a very rare use case (e.g. if you want to produce one file per PuzzlePiece and not - as usual - per PuzzlePiece name).</em>
+</p> 
+
+<p>If you loop over a Set of PuzzlePieces, this Set will contain Multiples. If you want to distinguish between these elements/attributes, there's nothing special to do.
+But if you do not want to distinguish between elements/attributes sharing the same name, you have two steps to do: <br />
+First, you have to create a new PuzzlePieceSet without
+these Multiples by myPuzzlePiece.withoutMultiples(). Now you have a reduced Set of PuzzlePieces, where only one random PuzzlePiece per name remains. <br />
+If you'd process only the random remaining PuzzlePiece for a name, and you're processing more than just the PuzzlePiece name, you might miss some information
+contained in the removed multiples. Even more, since you distinguish only between names, there might be some information contained in 
+Multiples which weren't even in the list before. (like an attribute Multiple
+which wasn't in the $element.getAttributes() list as it's only defined for another element). So to get all
+Multiples (not only those which were contained in the Set) of a PuzzlePiece, you use myPizzlePiece.withMultiples() for each
+PuzzlePiece of the reduced PuzzlePieceSet your're looping over.</p>
+
+<h3>How to use QNamedPuzzleComponent (PuzzlePieces and PuzzlePieceSets)</h3>
+
+<p>Mostly you might want to use a PuzzlePiece by inserting it directly into the template, like "this element is called $element", or
+like "the namespace of this element is ${element.getNamespace()}". It doesn't matter if $element is a PuzzlePiece as returned by model.getElement($context, $param),
+or a PuzzlePieceSet of equally named PuzzlePieces as returned by model.getElement($context).</p>
+
+<p>The model provides a few additional functions for String formatting like model.camelCase($element) for text:p -&gt; TextP or model.javaCase($element) 
+for text:p -&gt; textP.</p>
+
+<p>Another usage of QNamedPuzzleComponents is to get other QNamedPuzzleComponents, e.g. by $element.getParents(), $attribute.getDatatypes(), $attribute.getValues(),
+$element.getChildElements(), $element.getAttributes().</p>
+
+<p>To restrict a PuzzlePieceSet only to the PuzzlePieces which have a common parent, there is $elements.byParent($equallyNamedParents). With this method
+you can implement very distinct validation method in attribute classes. See the byParent-example below.</p>
+
+<h3>How to read the Javadoc for Template Usage</h3>
+
+<p>Basically you could use every public method from the <a href="#contextObjects">context objects</a> in a Velocity template. But
+this is not in our intention. There are quite a few public methods which are only to be used internally, e.g. to extract
+our model from the Schema file.</p>
+
+<p>To see the list of template-ready methods, you might want to look at the TemplateAPICoverageTest and the
+OdfTemplateAPICoverageTest from the source code bundle.</p>
+
+<p>To give an example you will see that the PuzzleComponent method "canHaveText" is meant for template usage. On the other hand
+you wont find neither method compareTo nor extractPuzzlePieces from class PuzzlePiece there, so those methods are not
+meant to be used in templates. Only the methods covered by the two mentioned tests are protected against internal
+refactoring (especially against renaming).</p>
+
+<h3>Examples</h3>
+
+<h4>Here's an example template to generate a ODF reference of attribute / elements. Here the PuzzlePieces are distinguished:</h4>
+<pre>
+#foreach( $element in ${model.getElements()} )
+#if (${element.withMultiples().size()} == 1)
+#set ($duptext = "")
+#set ($hasdup = false)
+#else
+#set ($duptext = "[${element.getMultipleNumber()}]")
+#set ($hasdup = true)
+#end
+&lt;h3&gt;${element}${duptext} Element&lt;/h3&gt;
+#if ( $hasdup )
+&lt;p&gt;There are more than one PuzzlePieces by this name.&lt;/p&gt;
+#end
+#end
+</pre>
+
+<h4>Here's an example output-files.vm which only produces one entry per name (processing just the element name so the Multiples can safely be removed):</h4>
+
+<pre>
+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;filelist&gt;
+    &lt;file path=&quot;OdfHtmlSpecification.html&quot; template=&quot;odf-reference-template.vm&quot; /&gt;
+##
+#foreach ( $element in ${model.getElements().withoutMultiples()} )
+##
+#set($classname = &quot;${model.camelCase($element)}Element&quot; )
+    &lt;file path=&quot;element/${element.getNamespace()}/${classname}.java&quot; 
+             context=&quot;$element&quot; 
+	     template=&quot;java-odfdom-element-template.vm&quot; /&gt;
+##
+#end
+&lt;/filelist&gt;
+</pre>
+
+<h4>Here's an example template to generate a Java class for an element name (by looking at all element Multiples at once).</h4> 
+
+<p>To keep it short only the part where the Getter-Methods for all attribute names (by looking at all attribute multiples at once) are generated is shown:</p>
+<pre>
+## This will return a PuzzlePieceSet containing all element PuzzlePieces with name $context
+#set($element = ${model.getElement($context)})
+...
+##
+## Step 1: Iterate over all attributes with one random attribute PuzzlePiece per attribute name
+#foreach ( $singleattr in ${element.getAttributes().withoutMultiples()} )
+##
+## Step 2: Get all attribute definitions for one attribute name. 
+## Not needed if we're just processing the attribute name
+#set($attribute = ${singleattr.withMultiples()}
+##
+#set($aClassname = &quot;${model.camelCase($attribute)}Attribute&quot; )
+	/**
+	 * Gets the value of the &lt;code&gt;$aClassname&lt;/code&gt; attribute, 
+	 * see {&#64;odf.attribute ${attribute}}
+	 *
+	 * @return - the &lt;code&gt;String&lt;/code&gt; attribute value
+	 */
+	public String get${aClassname}() {
+	   ...
+	}
+#end
+...
+</pre>
+
+<h4>Example for the byParent method: Input value validation in attribute template</h4>
+
+<p>Implementation detail: one attribute and one parent class implemented per name -
+thus ignoring PuzzlePiece multiples at Java class level.
+However differences between attribute PuzzlePieces are respected by using a different validation:</p>
+
+<pre>
+  ## This will return a PuzzlePieceSet containing all attribute PuzzlePieces with name $context
+  #set($attribute = ${model.getAttribute($context)})
+  ...
+  public void setValue(String value) {
+  	boolean valid = false;
+  ##
+  ## Iterate over parent names and get all Multiples for each name
+  #foreach ($singleparent in ${attribute.getParents().withoutMultiples()})
+  #set ($parent = $singleparent.withMultiples())
+  	if (getParent() instanceof ${model.camelCase($parent)}Element) {
+  ##
+  ## Allow only datatypes from attribute definitions reachable from $parent
+  ## Thus here we're respecting the different definitions for the current attribute
+  #foreach ($datatype in ${attribute.byParent($parent).getDatatypes()})
+    		valid = valid || validate(${datatype}.class, value);
+  #end
+	}
+  #end
+  	if (!valid) {
+		throw new IllegalArgumentException(
+			"Invalid Value for attribute $attribute and parent "
+			+ getParent().ELEMENT_NAME);
+	}
+	mValue = value;
+  }
+</pre>
+
+</body>
+</html>
diff --git a/trunk/generator/schema2template/src/main/javadoc/schema2template/example/odf/package.html b/trunk/generator/schema2template/src/main/javadoc/schema2template/example/odf/package.html
new file mode 100644
index 0000000..17b2afa
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/javadoc/schema2template/example/odf/package.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        Examples for the generation of source and reference for the OpenDocument XML format. 
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/generator/schema2template/src/main/javadoc/schema2template/example/package.html b/trunk/generator/schema2template/src/main/javadoc/schema2template/example/package.html
new file mode 100644
index 0000000..ec4a728
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/javadoc/schema2template/example/package.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        Example classes to show possibilites of schema2template.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/generator/schema2template/src/main/javadoc/schema2template/model/package.html b/trunk/generator/schema2template/src/main/javadoc/schema2template/model/package.html
new file mode 100644
index 0000000..34ddacc
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/javadoc/schema2template/model/package.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        Provide the XML model information parsed from a given XML schema.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/generator/schema2template/src/main/javadoc/schema2template/package.html b/trunk/generator/schema2template/src/main/javadoc/schema2template/package.html
new file mode 100644
index 0000000..9a4b888
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/javadoc/schema2template/package.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        Classes to trigger the process of filling a template by a schema.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/generator/schema2template/src/main/resources/documentation/WorkInProgress-RelaxNGPatterns.odt b/trunk/generator/schema2template/src/main/resources/documentation/WorkInProgress-RelaxNGPatterns.odt
new file mode 100644
index 0000000..a837973
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/documentation/WorkInProgress-RelaxNGPatterns.odt
Binary files differ
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/config.xml b/trunk/generator/schema2template/src/main/resources/examples/odf/config.xml
new file mode 100644
index 0000000..b472c32
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/config.xml
@@ -0,0 +1,680 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<config>
+    <elements>
+        <element name="chart:axis" family="chart:chart"/>
+        <element name="chart:chart" family="chart:chart"/>
+        <element name="chart:data-point" family="chart:chart"/>
+        <element name="chart:error-indicator" family="chart:chart"/>
+        <element name="chart:floor" family="chart:chart"/>
+        <element name="chart:footer" family="chart:chart"/>
+        <element name="chart:grid" family="chart:chart"/>
+        <element name="chart:legend" family="chart:chart"/>
+        <element name="chart:mean-value" family="chart:chart"/>
+        <element name="chart:plot-area" family="chart:chart"/>
+        <element name="chart:regression-curve" family="chart:chart"/>
+        <element name="chart:series" family="chart:chart"/>
+        <element name="chart:stock-gain-marker" family="chart:chart"/>
+        <element name="chart:stock-loss-marker" family="chart:chart"/>
+        <element name="chart:stock-range-line" family="chart:chart"/>
+        <element name="chart:subtitle" family="chart:chart"/>
+        <element name="chart:title" family="chart:chart"/>
+        <element name="chart:wall" family="chart:chart"/>
+        <element name="draw:page" family="draw:drawing-page"/>
+        <element name="presentation:notes" family="draw:drawing-page"/>
+        <element name="dr3d:cube" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:extrude" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:rotate" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:scene" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:sphere" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:a" rename="draw:hyperlink"/>
+        <element name="draw:caption" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:circle" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:connector" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:control" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:custom-shape" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:ellipse" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:frame" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:g" rename="draw:group" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:line" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:measure" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:page-thumbnail" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:path" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:polygon" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:polyline" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:rect" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:regular-polygon" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="office:annotation" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="text:alphabetical-index-entry-template" family="text:paragraph"/>
+        <element name="text:bibliography-entry-template" family="text:paragraph"/>
+        <element name="text:h" rename="text:heading" base="text:paragraph" family="text:paragraph"/>
+        <element name="text:illustration-index-entry-template" family="text:paragraph"/>
+        <element name="text:index-source-style" family="text:paragraph"/>
+        <element name="text:index-title-template" family="text:paragraph"/>
+        <element name="text:object-index-entry-template" family="text:paragraph"/>
+        <element name="text:p" rename="text:paragraph" base="text:paragraph" family="text:paragraph"/>
+        <element name="text:table-index-entry-template" family="text:paragraph"/>
+        <element name="text:table-of-content-entry-template" family="text:paragraph"/>
+        <element name="text:user-index-entry-template" family="text:paragraph"/>
+        <element name="text:ruby" family="text:ruby"/>
+        <element name="text:ruby-text" family="text:ruby"/>
+        <element name="text:alphabetical-index" family="text:section"/>
+        <element name="text:bibliography" family="text:section"/>
+        <element name="text:illustration-index" family="text:section"/>
+        <element name="text:index-title" family="text:section"/>
+        <element name="text:object-index" family="text:section"/>
+        <element name="text:section" family="text:section"/>
+        <element name="text:s" rename="text:space"/>
+        <element name="text:table-index" family="text:section"/>
+        <element name="text:table-of-content" family="text:section"/>
+        <element name="text:user-index" family="text:section"/>
+        <element name="table:table" family="table:table"/>
+        <element name="table:covered-table-cell" base="table:table-cell" family="table:table-cell"/>
+        <element name="table:table-cell" base="table:table-cell" family="table:table-cell"/>
+        <element name="table:table-column" family="table:table-column"/>
+        <element name="table:table-row" family="table:table-row"/>
+        <element name="text:a" rename="text:hyperlink" family="text:text"/>
+        <element name="text:index-entry-bibliography" family="text:text"/>
+        <element name="text:index-entry-chapter" family="text:text"/>
+        <element name="text:index-entry-link-end" family="text:text"/>
+        <element name="text:index-entry-link-start" family="text:text"/>
+        <element name="text:index-entry-page-number" family="text:text"/>
+        <element name="text:index-entry-span" family="text:text"/>
+        <element name="text:index-entry-tab-stop" family="text:text"/>
+        <element name="text:index-entry-text" family="text:text"/>
+        <element name="text:span" family="text:text"/>
+        <element name="style:handout-master" family="draw:drawing-page"/>
+        <element name="style:master-page" family="draw:drawing-page"/>
+        <element name="table:body" family="table:table-cell"/>
+        <element name="table:even-columns" family="table:table-cell"/>
+        <element name="table:even-rows" family="table:table-cell"/>
+        <element name="table:first-column" family="table:table-cell"/>
+        <element name="table:first-row" family="table:table-cell"/>
+        <element name="table:last-column" family="table:table-cell"/>
+        <element name="table:last-row" family="table:table-cell"/>
+        <element name="table:odd-columns" family="table:table-cell"/>
+        <element name="table:odd-rows" family="table:table-cell"/>
+        <element name="style:drop-cap" family="text:text"/>
+        <element name="text:linenumbering-configuration" family="text:text"/>
+
+		<!-- does not exist as element only as baseclass -->
+        <element name="text:list-level-style" base="style"/>
+        <element name="text:list-level-style-number" base="text:list-level-style"/>
+        <element name="text:list-level-style-bullet" base="text:list-level-style"/>
+        <element name="text:list-level-style-image" base="text:list-level-style"/>
+
+        <element name="text:numbered-paragraph" family="text:list"/>
+        <element name="office:styles" base="container"/>
+        <element name="office:automatic-styles" base="container"/>
+        <element name="office:master-styles" base="container"/>
+        <!--element name="office:presentation" base="container"/-->
+
+        <element name="style:style" base="style"/>
+        <element name="style:default-style" base="style"/>
+        <element name="style:page-layout" base="style"/>
+        <element name="text:outline-level-style" base="style"/>
+        <element name="text:list-style" base="style"/>
+
+        <element name="style:chart-properties" base="styleproperties"/>
+        <element name="style:drawing-page-properties" base="styleproperties"/>
+        <element name="style:graphic-properties" base="styleproperties"/>
+        <element name="style:list-level-properties" base="styleproperties"/>
+        <element name="style:paragraph-properties" base="styleproperties"/>
+        <element name="style:ruby-properties" base="styleproperties"/>
+        <element name="style:section-properties" base="styleproperties"/>
+        <element name="style:page-layout-properties" base="styleproperties"/>
+        <element name="style:header-footer-properties" base="styleproperties"/>
+        <element name="style:text-properties" base="styleproperties"/>
+        <element name="style:table-properties" base="styleproperties"/>
+        <element name="style:table-column-properties" base="styleproperties"/>
+        <element name="style:table-row-properties" base="styleproperties"/>
+        <element name="style:table-cell-properties" base="styleproperties"/>
+    </elements>
+    <data-types>
+        <data name="anyURI" value-type="java.net.URI" conversion-type="org.odftoolkit.odfdom.type.AnyURI"/>
+        <data name="boolean" value-type="Boolean" conversion-type="Boolean"/>
+        <data name="base64Binary" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Base64Binary"/>
+        <data name="cellAddress" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CellAddress"/>
+        <data name="cellRangeAddress" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CellRangeAddress"/>
+        <data name="cellRangeAddressList" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CellRangeAddressList"/>
+        <data name="clipShape" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ClipShape"/>
+        <data name="color" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Color"/>
+        <data name="coordinate" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Coordinate"/>
+        <data name="countryCode" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CountryCode"/>
+        <data name="CURIE" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CURIE"/>
+        <data name="CURIEs" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CURIEs"/>
+        <data name="date" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.Date"/>
+        <data name="dateOrDateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.DateOrDateTime"/>
+        <data name="dateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.DateTime"/>
+        <data name="distance" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Distance"/>
+        <data name="duration" value-type="javax.xml.datatype.Duration" conversion-type="org.odftoolkit.odfdom.type.DurationType"/>
+        <data name="double" value-type="Double" conversion-type="Double"/>
+        <!--data name="extrusionOrigin" value-type="String" conversion-type="org.odftoolkit.odfdom.attribute.ExtrusionOrigin"/-->
+        <data name="formula" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Formula"/>
+        <data name="ID" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ID"/>
+        <data name="IDREF" value-type="String" conversion-type="org.odftoolkit.odfdom.type.IDREF"/>
+        <data name="IDREFS" value-type="String" conversion-type="org.odftoolkit.odfdom.type.IDREFS"/>
+        <data name="integer" value-type="Integer" conversion-type="Integer"/>
+        <data name="language" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Language"/>
+        <data name="languageCode" value-type="String" conversion-type="org.odftoolkit.odfdom.type.LanguageCode"/>
+        <data name="length" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Length"/>
+        <data name="namespacedToken" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NamespacedToken"/>
+        <data name="NCName" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NCName"/>
+        <data name="nonNegativeDecimal" value-type="Double" conversion-type="org.odftoolkit.odfdom.type.NonNegativeDecimal"/>
+        <data name="nonNegativeInteger" value-type="Integer" conversion-type="org.odftoolkit.odfdom.type.NonNegativeInteger"/>
+        <data name="nonNegativeLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NonNegativeLength"/>
+        <data name="nonNegativePixelLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NonNegativePixelLength"/>
+        <data name="percent" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Percent"/>
+        <data name="point3D" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Point3D"/>
+        <data name="points" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Points"/>
+        <data name="positiveInteger" value-type="Integer" conversion-type="org.odftoolkit.odfdom.type.PositiveInteger"/>
+        <data name="positiveLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.PositiveLength"/>
+        <!--data name="presentation-classes" value-type="String" conversion-type="org.odftoolkit.odfdom.attribute.PresentationClasses"/-->
+        <data name="relativeLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.RelativeLength"/>
+        <data name="SafeCURIE" value-type="String" conversion-type="org.odftoolkit.odfdom.type.SafeCURIE"/>
+        <data name="scriptCode" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ScriptCode"/>
+        <data name="signedZeroToHundredPercent" value-type="String" conversion-type="org.odftoolkit.odfdom.type.SignedZeroToHundredPercent"/>
+        <data name="string" value-type="String" conversion-type="String"/>
+        <data name="styleName" value-type="String" conversion-type="org.odftoolkit.odfdom.type.StyleName"/>
+        <data name="styleNameRef" value-type="String" conversion-type="org.odftoolkit.odfdom.type.StyleNameRef"/>
+        <data name="styleNameRefs" value-type="String" conversion-type="org.odftoolkit.odfdom.type.StyleNameRefs"/>
+        <data name="targetFrameName" value-type="String" conversion-type="org.odftoolkit.odfdom.type.TargetFrameName"/>
+        <!--data name="targetFrameName" value-type="enum" conversion-type="office:target-frame-name"/-->
+        <data name="textEncoding" value-type="String" conversion-type="org.odftoolkit.odfdom.type.TextEncoding"/>
+        <data name="time" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.Time"/>
+        <data name="timeOrDateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.TimeOrDateTime"/>
+        <data name="URIorSafeCURIE" value-type="String" conversion-type="org.odftoolkit.odfdom.type.URIorSafeCURIE"/>
+        <data name="valueType" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ValueType"/>
+        <data name="vector3D" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Vector3D"/>
+        <data name="zeroToHundredPercent" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ZeroToHundredPercent"/>
+        <data name="zeroToOneDecimal" value-type="Double" conversion-type="org.odftoolkit.odfdom.type.ZeroToOneDecimal"/>
+        <!--data name="rowOrCol" value-type="enum" conversion-type="table:row-or-column"/-->
+        <data name="stylefamily" value-type="org.odftoolkit.odfdom.dom.style.OdfStyleFamily" conversion-type="org.odftoolkit.odfdom.dom.style.OdfStyleFamily"/>
+        
+        
+    </data-types>
+   <attributes>
+      <attribute name="anim:color-interpolation" defaultValue="rgb"/>
+      <attribute name="anim:color-interpolation-direction" defaultValue="clockwise"/>
+      <attribute name="chart:automatic-content" defaultValue="true"/>
+      <attribute name="chart:class" defaultValue="major" element="chart:grid"/>
+      <attribute name="chart:data-source-has-labels" defaultValue="none"/>
+      <attribute name="chart:display-equation" defaultValue="true"/>
+      <attribute name="chart:display-r-square" defaultValue="false"/>
+      <attribute name="db:append-table-alias-name" defaultValue="true"/>
+      <attribute name="db:apply-command" defaultValue="false"/>
+      <attribute name="db:boolean-comparison-mode" defaultValue="equal-integer"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:decimal" defaultValue="."/>
+      <attribute name="db:delete-rule" defaultValue="no-action"/>
+      <attribute name="db:enable-sql92-check" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:encoding" defaultValue="utf-8"/>
+      <attribute name="db:escape-processing" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:field" defaultValue=";"/>
+      <attribute name="db:ignore-driver-privileges" defaultValue="true"/>
+      <attribute name="db:is-first-row-header-line" defaultValue="true"/>
+      <attribute name="db:is-password-required" defaultValue="false"/>
+      <attribute name="db:is-table-name-length-limited" defaultValue="true"/>
+      <attribute name="db:parameter-name-substitution" defaultValue="true"/>
+      <attribute name="db:show-deleted" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:string" defaultValue="."/>
+      <attribute name="db:suppress-version-columns" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:thousand" defaultValue=","/>
+      <attribute name="db:update-rule" defaultValue="no-action"/>
+      <attribute name="db:use-catalog" defaultValue="false"/>
+      <attribute name="db:visible" defaultValue="true"/>
+      <attribute name="dr3d:projection" defaultValue="parallel" element="draw:enhanced-geometry"/>
+      <attribute name="dr3d:shade-mode" defaultValue="flat" element="draw:enhanced-geometry"/>
+      <attribute name="draw:concentric-gradient-fill-allowed" defaultValue="false"/>
+      <attribute name="draw:display" defaultValue="always"/>
+      <attribute name="draw:extrusion" defaultValue="false"/>
+      <attribute name="draw:extrusion-allowed" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-brightness" defaultValue="33%"/>
+      <attribute name="draw:extrusion-color" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-depth" defaultValue="36pt 0"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-diffusion" defaultValue="0%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-first-light-direction" defaultValue="(5 0 1)"/>
+      <attribute name="draw:extrusion-first-light-harsh" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-first-light-level" defaultValue="66%"/>
+      <attribute name="draw:extrusion-light-face" defaultValue="true"/>
+      <attribute name="draw:extrusion-metal" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-number-of-line-segments" defaultValue="30"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-origin" defaultValue="0.5 -0.5"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-rotation-angle" defaultValue="0 0"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-second-light-direction" defaultValue="(-5 0 1)"/>
+      <attribute name="draw:extrusion-second-light-harsh" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-second-light-level" defaultValue="66%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-shininess" defaultValue="50%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-skew" defaultValue="50 45"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-specularity" defaultValue="0%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-viewpoint" defaultValue="3.5cm -3.5cm 25cm"/>
+      <attribute name="draw:glue-point-type" defaultValue="none"/>
+      <attribute name="draw:handle-mirror-horizontal" defaultValue="false"/>
+      <attribute name="draw:handle-mirror-vertical" defaultValue="false"/>
+      <attribute name="draw:handle-switched" defaultValue="false"/>
+      <attribute name="draw:kind" defaultValue="full"/>
+      <attribute name="draw:mirror-horizontal" defaultValue="false"/>
+      <attribute name="draw:mirror-vertical" defaultValue="false"/>
+      <attribute name="draw:may-script" defaultValue="false"/>
+      <attribute name="draw:protected" defaultValue="false"/>
+      <attribute name="draw:text-path" defaultValue="false"/>
+      <attribute name="draw:text-path-allowed" defaultValue="false"/>
+      <attribute name="draw:text-path-mode" defaultValue="normal"/>
+      <attribute name="draw:text-path-same-letter-heights" defaultValue="false"/>
+      <attribute name="draw:text-path-scale" defaultValue="path"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:text-rotate-angle" defaultValue="0"/>
+      <attribute name="draw:type" defaultValue="standard" element="draw:connector"/>
+      <attribute name="draw:type" defaultValue="non-primitive" element="draw:enhanced-geometry"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:end-indent" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:space-after" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:space-before" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:start-indent" defaultValue="0cm"/>
+      <attribute name="form:allow-deletes" defaultValue="true"/>
+      <attribute name="form:allow-inserts" defaultValue="true"/>
+      <attribute name="form:allow-updates" defaultValue="true"/>
+      <attribute name="form:apply-design-mode" defaultValue="true"/>
+      <attribute name="form:apply-filter" defaultValue="false"/>
+      <attribute name="form:automatic-focus" defaultValue="false"/>
+      <attribute name="form:button-type" defaultValue="push"/>
+      <attribute name="form:command-type" defaultValue="command"/>
+      <attribute name="form:convert-empty-to-null" defaultValue="false"/>
+      <attribute name="form:current-selected" defaultValue="false"/>
+      <attribute name="form:default-button" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:delay-for-repeat" defaultValue="PT0.050S"/>
+      <attribute name="form:disabled" defaultValue="false"/>
+      <attribute name="form:dropdown" defaultValue="false"/>
+      <attribute name="form:echo-char" defaultValue="*"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:enctype" defaultValue="application/x-www-form-urlencoded"/>
+      <attribute name="form:escape-processing" defaultValue="true"/>
+      <attribute name="form:ignore-result" defaultValue="false"/>
+      <attribute name="form:image-align" defaultValue="center"/>
+      <attribute name="form:image-position" defaultValue="center"/>
+      <attribute name="form:is-tristate" defaultValue="false"/>
+      <attribute name="form:method" defaultValue="get"/>
+      <attribute name="form:multi-line" defaultValue="false"/>
+      <attribute name="form:multiple" defaultValue="false"/>
+      <attribute name="form:printable" defaultValue="true"/>
+      <attribute name="form:readonly" defaultValue="false"/>
+      <attribute name="form:selected" defaultValue="false"/>
+      <attribute name="form:spin-button" defaultValue="false"/>
+      <attribute name="form:state" defaultValue="unchecked"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:step-size" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:tab-index" defaultValue="0"/>
+      <attribute name="form:tab-stop" defaultValue="true"/>
+      <attribute name="form:toggle" defaultValue="false"/>
+      <attribute name="form:validation" defaultValue="false"/>
+      <attribute name="number:automatic-order" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="number:decimal-places" defaultValue="0" element="number:seconds"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="number:display-factor" defaultValue="1"/>
+      <attribute name="number:format-source" defaultValue="fixed"/>
+      <attribute name="number:grouping" defaultValue="false"/>
+      <attribute name="number:textual" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="number:transliteration-format" defaultValue="1"/>
+      <attribute name="number:transliteration-style" defaultValue="short"/>
+      <attribute name="number:truncate-on-overflow" defaultValue="true"/>
+      <attribute name="office:automatic-update" defaultValue="true"/>
+      <attribute name="office:conversion-mode" defaultValue="into-default-style-data-style"/>
+      <attribute name="office:server-map" defaultValue="false"/>
+      <attribute name="office:target-frame" defaultValue="_blank"/>
+      <attribute name="presentation:animations" defaultValue="enabled"/>
+      <attribute name="presentation:direction" defaultValue="none"/>
+      <attribute name="presentation:endless" defaultValue="false"/>
+      <attribute name="presentation:effect" defaultValue="none"/>
+      <attribute name="presentation:force-manual" defaultValue="false"/>
+      <attribute name="presentation:full-screen" defaultValue="true"/>
+      <attribute name="presentation:mouse-as-pen" defaultValue="false"/>
+      <attribute name="presentation:mouse-visible" defaultValue="true"/>
+      <attribute name="presentation:node-type" defaultValue="default"/>
+      <attribute name="presentation:preset-class" defaultValue="custom"/>
+      <attribute name="presentation:show-end-of-presentation-slide" defaultValue="true"/>
+      <attribute name="presentation:show-logo" defaultValue="false"/>
+      <attribute name="presentation:speed" defaultValue="medium"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="presentation:start-scale" defaultValue="100%"/>
+      <attribute name="presentation:start-with-navigator" defaultValue="false"/>
+      <attribute name="presentation:stay-on-top" defaultValue="false"/>
+      <attribute name="presentation:transition-on-click" defaultValue="enabled"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="smil:accelerate" defaultValue="0.0"/>
+      <attribute name="smil:autoReverse" defaultValue="false"/>
+      <attribute name="smil:calcMode" defaultValue="discrete" element="anim:animate"/>
+      <attribute name="smil:calcMode" defaultValue="discrete" element="anim:animateColor"/>
+      <attribute name="smil:calcMode" defaultValue="paced" element="anim:animateMotion"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="smil:decelerate" defaultValue="0.0"/>
+      <attribute name="smil:direction" defaultValue="forward" element="anim:transitionFilter"/>
+      <attribute name="smil:fadeColor" defaultValue="#000000"/>
+      <attribute name="smil:mode" defaultValue="in"/>
+      <attribute name="smil:restart" defaultValue="default"/>
+      <attribute name="smil:restartDefault" defaultValue="inherit"/>
+      <attribute name="style:adjustment" defaultValue="left"/>
+      <attribute name="style:auto-update" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:color" defaultValue="#000000" element="style:column-sep"/>
+      <attribute name="style:display" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:distance" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:height" defaultValue="100%"/>
+      <attribute name="style:leader-text" defaultValue=" "/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:length" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:lines" defaultValue="1"/>
+      <attribute name="style:page-usage" defaultValue="all"/>
+      <attribute name="style:position" defaultValue="center" element="style:background-image"/>
+      <attribute name="style:repeat" defaultValue="repeat" element="style:background-image"/>
+      <attribute name="style:style" defaultValue="solid"/>
+      <attribute name="style:type" defaultValue="left" element="style:tab-stop"/>
+      <attribute name="style:vertical-align" defaultValue="top" element="style:column-sep"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:cx" defaultValue="50%" element="svg:radialGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:cy" defaultValue="50%" element="svg:radialGradient"/>
+      <attribute name="svg:gradientUnits" defaultValue="objectBoundingBox"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:r" defaultValue="50%" element="svg:radialGradient"/>
+      <attribute name="svg:spreadMethod" defaultValue="pad"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:x1" defaultValue="0%" element="svg:linearGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:x2" defaultValue="100%" element="svg:linearGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:y1" defaultValue="0%" element="svg:linearGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:y2" defaultValue="100%" element="svg:linearGradient"/>
+      <attribute name="table:acceptance-state" defaultValue="pending"/>
+      <attribute name="table:allow-empty-cell" defaultValue="true"/>
+      <attribute name="table:automatic-find-labels" defaultValue="true"/>
+      <attribute name="table:bind-styles-to-content" defaultValue="true"/>
+      <attribute name="table:case-sensitive" defaultValue="true"
+                 element="table:calculation-settings"/>
+      <attribute name="table:case-sensitive" defaultValue="false"
+                 element="table:filter-condition"/>
+      <attribute name="table:case-sensitive" defaultValue="false" element="table:sort"/>
+      <attribute name="table:case-sensitive" defaultValue="false" element="table:subtotal-rules"/>
+      <attribute name="table:condition-source" defaultValue="self"/>
+      <attribute name="table:contains-error" defaultValue="false"/>
+      <attribute name="table:contains-header" defaultValue="true"/>
+      <attribute name="table:copy-back" defaultValue="true"/>
+      <attribute name="table:copy-formulas" defaultValue="true"/>
+      <attribute name="table:copy-styles" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:count" defaultValue="1"/>
+      <attribute name="table:data-type" defaultValue="text" element="table:filter-condition"/>
+      <attribute name="table:data-type" defaultValue="automatic" element="table:sort-by"/>
+      <attribute name="table:data-type" defaultValue="automatic" element="table:sort-groups"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:date-value" defaultValue="1899-12-30"/>
+      <attribute name="table:display" defaultValue="true" element="table:table-column-group"/>
+      <attribute name="table:display" defaultValue="true" element="table:table-row-group"/>
+      <attribute name="table:display" defaultValue="false" element="table:error-message"/>
+      <attribute name="table:display" defaultValue="false" element="table:help-message"/>
+      <attribute name="table:display-border" defaultValue="true"/>
+      <attribute name="table:display-duplicates" defaultValue="true"/>
+      <attribute name="table:display-filter-buttons" defaultValue="false"/>
+      <attribute name="table:display-list" defaultValue="unsorted"/>
+      <attribute name="table:drill-down-on-double-click" defaultValue="true"/>
+      <attribute name="table:embedded-number-behavior" defaultValue="alpha-numeric"/>
+      <attribute name="table:execute" defaultValue="true"/>
+      <attribute name="table:grand-total" defaultValue="both"/>
+      <attribute name="table:has-persistent-data" defaultValue="true"/>
+      <attribute name="table:identify-categories" defaultValue="false"/>
+      <attribute name="table:ignore-empty-rows" defaultValue="false"/>
+      <attribute name="table:is-data-layout-field" defaultValue="false"/>
+      <attribute name="table:is-selection" defaultValue="false"/>
+      <attribute name="table:is-sub-table" defaultValue="false"/>
+      <attribute name="table:link-to-source-data" defaultValue="false"/>
+      <attribute name="table:matrix-covered" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:maximum-difference" defaultValue="0.001"/>
+      <attribute name="table:message-type" defaultValue="stop"/>
+      <attribute name="table:mode" defaultValue="copy-all"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:null-year" defaultValue="1930"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-repeated" defaultValue="1"
+                 element="table:covered-table-cell"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-repeated" defaultValue="1"
+                 element="table:table-cell"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-repeated" defaultValue="1"
+                 element="table:table-column"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-spanned" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-rows-repeated" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-rows-spanned" defaultValue="1"/>
+      <attribute name="table:on-update-keep-size" defaultValue="true"/>
+      <attribute name="table:on-update-keep-styles" defaultValue="false"/>
+      <attribute name="table:order" defaultValue="ascending" element="table:sort-by"/>
+      <attribute name="table:order" defaultValue="ascending" element="table:sort-groups"/>
+      <attribute name="table:orientation" defaultValue="row" element="table:database-range"/>
+      <attribute name="table:page-breaks-on-group-change" defaultValue="false"/>
+      <attribute name="table:parse-sql-statement" defaultValue="false"/>
+      <attribute name="table:precision-as-shown" defaultValue="false"/>
+      <attribute name="table:print" defaultValue="true"/>
+      <attribute name="table:protect" defaultValue="false"/>
+      <attribute name="table:protected" defaultValue="false" element="table:covered-table-cell"/>
+      <attribute name="table:protected" defaultValue="false" element="table:table"/>
+      <attribute name="table:protected" defaultValue="false" element="table:table-cell"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:protection-key-digest-algorithm"
+                 defaultValue="http://www.w3.org/2000/09/xmldsig#sha1"/>
+      <attribute name="table:range-usable-as" defaultValue="none"/>
+      <attribute name="table:search-criteria-must-apply-to-whole-cell" defaultValue="true"/>
+      <attribute name="table:show-filter-button" defaultValue="true"/>
+      <attribute name="table:status" defaultValue="disable"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:steps" defaultValue="100"/>
+      <attribute name="table:structure-protected" defaultValue="false"/>
+      <attribute name="table:track-changes" defaultValue="false"/>
+      <attribute name="table:use-banding-columns-styles" defaultValue="false"/>
+      <attribute name="table:use-banding-rows-styles" defaultValue="false"/>
+      <attribute name="table:use-first-column-styles" defaultValue="false"/>
+      <attribute name="table:use-first-row-styles" defaultValue="false"/>
+      <attribute name="table:use-last-column-styles" defaultValue="false"/>
+      <attribute name="table:use-last-row-styles" defaultValue="false"/>
+      <attribute name="table:use-labels" defaultValue="none"/>
+      <attribute name="table:use-regular-expressions" defaultValue="true"/>
+      <attribute name="table:use-wildcards" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:used-hierarchy" defaultValue="-1"/>
+      <attribute name="table:value-type" defaultValue="date"/>
+      <attribute name="table:visibility" defaultValue="visible"/>
+      <attribute name="text:alphabetical-separators" defaultValue="false"/>
+      <attribute name="text:capitalize-entries" defaultValue="false"/>
+      <attribute name="text:combine-entries" defaultValue="true"/>
+      <attribute name="text:combine-entries-with-dash" defaultValue="false"/>
+      <attribute name="text:combine-entries-with-pp" defaultValue="true"/>
+      <attribute name="text:comma-separated" defaultValue="false"/>
+      <attribute name="text:consecutive-numbering" defaultValue="false"/>
+      <attribute name="text:copy-outline-levels" defaultValue="false"/>
+      <attribute name="text:count-empty-lines" defaultValue="true"/>
+      <attribute name="text:count-in-text-boxes" defaultValue="false"/>
+      <attribute name="text:display" defaultValue="number" element="text:index-entry-chapter"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:display-levels" defaultValue="1"/>
+      <attribute name="text:global" defaultValue="false"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:alphabetical-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:illustration-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:object-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:table-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:user-index-source"/>
+      <attribute name="text:ignore-case" defaultValue="false"/>
+      <attribute name="text:is-list-header" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:level" defaultValue="1" element="text:numbered-paragraph"/>
+      <attribute name="text:main-entry" defaultValue="false"/>
+      <attribute name="text:number-lines" defaultValue="true"
+                 element="text:linenumbering-configuration"/>
+      <attribute name="text:number-position" defaultValue="left"/>
+      <attribute name="text:numbered-entries" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:protection-key-digest-algorithm"
+                 defaultValue="http://www.w3.org/2000/09/xmldsig#sha1"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:alphabetical-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:illustration-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:object-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:table-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:user-index-source"/>
+      <attribute name="text:restart-numbering" defaultValue="false"/>
+      <attribute name="text:restart-on-page" defaultValue="false"/>
+      <attribute name="text:sort-ascending" defaultValue="true"/>
+      <attribute name="text:sort-by-position" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:start-value" defaultValue="1" element="text:list-level-style-number"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:start-value" defaultValue="1" element="text:notes-configuration"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:start-value" defaultValue="1" element="text:outline-level-style"/>
+      <attribute name="text:track-changes" defaultValue="true"/>
+      <attribute name="text:use-caption" defaultValue="true"/>
+      <attribute name="text:use-chart-objects" defaultValue="false"/>
+      <attribute name="text:use-draw-objects" defaultValue="false"/>
+      <attribute name="text:use-floating-frames" defaultValue="false"/>
+      <attribute name="text:use-graphics" defaultValue="false"/>
+      <attribute name="text:use-index-marks" defaultValue="false"
+                 element="text:user-index-source"/>
+      <attribute name="text:use-index-source-styles" defaultValue="false"
+                 element="text:user-index-source"/>
+      <attribute name="text:use-keys-as-entries" defaultValue="false"/>
+      <attribute name="text:use-math-objects" defaultValue="false"/>
+      <attribute name="text:use-objects" defaultValue="false"/>
+      <attribute name="text:use-other-objects" defaultValue="false"/>
+      <attribute name="text:use-outline-level" defaultValue="true"/>
+      <attribute name="text:use-soft-page-breaks" defaultValue="false"/>
+      <attribute name="text:use-spreadsheet-objects" defaultValue="false"/>
+      <attribute name="text:use-tables" defaultValue="false"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="db:connection-resource"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="draw:a"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="form:form"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="meta:template"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest"
+                 element="presentation:event-listener"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="presentation:sound"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="script:event-listener"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="svg:definition-src"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="svg:font-face-uri"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="table:cell-range-source"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="table:table-source"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="text:a"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:applet"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:fill-image"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:floating-frame"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:image"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:object"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:object-ole"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:plugin"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="meta:auto-reload"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="style:background-image"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad"
+                 element="text:list-level-style-image"/>
+      <attribute name="xlink:show" defaultValue="replace" element="meta:auto-reload"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:applet"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:fill-image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:floating-frame"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:object"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:object-ole"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:plugin"/>
+      <attribute name="xlink:show" defaultValue="embed" element="presentation:event-listener"/>
+      <attribute name="xlink:show" defaultValue="embed" element="style:background-image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="text:list-level-style-image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="text:section-source"/>
+      <attribute name="xlink:show" defaultValue="none" element="db:connection-resource"/>
+      <attribute name="xlink:type" defaultValue="simple" element="db:connection-resource"/>
+      <attribute name="xlink:type" defaultValue="simple" element="db:file-based-database"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:a"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:applet"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:area-circle"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:area-polygon"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:area-rectangle"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:fill-image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:floating-frame"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:object"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:object-ole"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:plugin"/>
+      <attribute name="xlink:type" defaultValue="simple" element="form:form"/>
+      <attribute name="xlink:type" defaultValue="simple" element="meta:auto-reload"/>
+      <attribute name="xlink:type" defaultValue="simple" element="meta:template"/>
+      <attribute name="xlink:type" defaultValue="simple" element="presentation:event-listener"/>
+      <attribute name="xlink:type" defaultValue="simple" element="presentation:sound"/>
+      <attribute name="xlink:type" defaultValue="simple" element="script:event-listener"/>
+      <attribute name="xlink:type" defaultValue="simple" element="style:background-image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="svg:definition-src"/>
+      <attribute name="xlink:type" defaultValue="simple" element="svg:font-face-uri"/>
+      <attribute name="xlink:type" defaultValue="simple" element="table:cell-range-source"/>
+      <attribute name="xlink:type" defaultValue="simple" element="table:table-source"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:a"/>
+      <attribute name="xlink:type" defaultValue="simple"
+                 element="text:alphabetical-index-auto-mark-file"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:list-level-style-image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:script"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:section-source"/>
+   </attributes>
+</config>
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odf-reference/dom-output-files.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odf-reference/dom-output-files.vm
new file mode 100644
index 0000000..e31e908
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odf-reference/dom-output-files.vm
@@ -0,0 +1,29 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?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>
+    <file path="OdfReference.html" template="odf-reference-template.vm" />
+</filelist>
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odf-reference/odf-reference-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odf-reference/odf-reference-template.vm
new file mode 100644
index 0000000..7fd1f1c
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odf-reference/odf-reference-template.vm
@@ -0,0 +1,201 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+
+## Template to create the Java class representing an ODF element.
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+<html>
+<head>
+<style type="text/css">
+<!--
+.left { width: 30%; }
+.right { width: 100%; }
+td { text-indent:0em; }
+.unbreakable { white-space:nowrap; }
+.mandatory { color:navy; font-weight:bold; }
+-->
+</style>
+</head>
+<body>
+<h2>ODF 1.2 XML Reference</h2>
+
+<p>This is a list of elements defined in ODF-Spec together with allowed parent and child elements and allowed attributes.</p>
+
+<p>Please note that "allowed" has the meaning of "may be allowed" as there might be a condition (like a special attribute value) 
+for an element to have a special child element.</p>
+
+<p>left displayed in bold blue letters describe a mandatory relationship. All other relationships are optional.</p>
+
+<p>The asterisk (*) symbol marks child elements which can occur multiple times.</p>
+
+<p>Here's a shortcut to the content <a href="#element_office:document_0">toplevel</a> element.</p>
+
+#foreach( $element in ${model.getElements()} )
+#set ($oldelement = "")
+#set ($oldelement = ${oldmodel.getElement($element.getQName())} )
+#if ($element != "*")
+##
+#if (${element.withMultiples().size()} == 1)
+#set ($dup = "")
+#else
+#set ($dup = "[${element.getMultipleNumber()}]")
+#end
+<h3><a name="element_${element}_${element.getMultipleNumber()}">${element}${dup} Element</a>#if (${oldelement} == "")&nbsp;(new in Odf 1.2) #end</h3>
+#if ( ${element.withMultiples().size()} > 1 )
+<p>There are more than one Definitions by this name.</p>
+#end
+#if (${element.canHaveText()})
+<p>This element can have a text node child.</p>
+#end
+<table border="1" width="100%">
+<tr>
+<td class="left">Parent Elements</td>
+<td class="right">
+#foreach ($parent in ${element.getParents()})
+#if ($parent == "*")
+[any org.w3c.dom.Element]&nbsp;
+#else
+#if (${parent.withMultiples().size()} == 1)
+#set ($dup = "")
+#else
+#set ($dup = "[${parent.getMultipleNumber()}]")
+#end
+	<a href="#element_${parent}_${parent.getMultipleNumber()}" class="unbreakable">${parent}${dup}</a>&nbsp;
+#end
+#end
+&nbsp;</td>
+</tr>
+<tr>
+<td class="left">Child Elements</td>
+<td class="right">
+#foreach($child in ${element.getChildElements()})
+#if ($child == "*")
+[any org.w3c.dom.Element]&nbsp;
+#else
+#if (${child.withMultiples().size()} == 1)
+#set ($dup = "")
+#else
+#set ($dup = "[${child.getMultipleNumber()}]")
+#end
+##
+#if (${element.isMandatory($child)})
+#set ($mandatory = "mandatory")
+#else
+#set ($mandatory = "")
+#end
+##
+#if (${element.isSingleton($child)})
+#set ($multiple = "")
+#else
+#set ($multiple = "*")
+#end
+##
+	<a href="#element_${child}_${child.getMultipleNumber()}" class="unbreakable ${mandatory}">${child}${dup}</a>${multiple}&nbsp;
+#end
+#end
+&nbsp;</td>
+</tr>
+<tr>
+<td class="left">Attributes</td>
+<td class="right">
+#foreach( $attribute in ${element.getAttributes()} )
+#if ($attribute == "*")
+[any org.w3c.dom.Attribute]&nbsp;
+#else
+#if (${attribute.withMultiples().size()} == 1)
+#set ($dup = "")
+#else
+#set ($dup = "[${attribute.getMultipleNumber()}]")
+#end
+##
+#if (${element.isMandatory($attribute)})
+#set ($mandatory = "mandatory")
+#else
+#set ($mandatory = "")
+#end
+##
+	<a href="#attribute_${attribute}_${attribute.getMultipleNumber()}" class="unbreakable ${mandatory}">${attribute}${dup}</a>&nbsp;
+#end
+#end
+&nbsp;</td>
+</tr>
+</table>
+<br />
+#end
+#end
+##
+##
+#foreach( $attribute in ${model.getAttributes()} )
+#set ($oldattribute = "")
+#set ($oldattribute = ${oldmodel.getAttribute($attribute.getQName())} )
+#if ($attribute != "*")
+##
+#if (${attribute.withMultiples().size()} == 1)
+#set ($dup = "")
+#else
+#set ($dup = "[${attribute.getMultipleNumber()}]")
+#end
+<h3><a name="attribute_${attribute}_${attribute.getMultipleNumber()}">${attribute}${dup} Attribute</a>#if (${oldattribute} == "")&nbsp;(new in Odf 1.2) #end</h3>
+#if ( ${attribute.withMultiples().size()} > 1 )
+<p>There are more than one Definitions by this name.</p>
+#end
+<table border="1" width="100%">
+<tr>
+<td class="left">Parent Elements</td>
+<td class="right">
+#foreach ($parent in ${attribute.getParents()})
+#if ($parent == "*")
+[any org.w3c.dom.Element]&nbsp;
+#else
+#if (${parent.withMultiples().size()} == 1)
+#set ($dup = "")
+#else
+#set ($dup = "[${parent.getMultipleNumber()}]")
+#end
+	<a href="#element_${parent}_${parent.getMultipleNumber()}" class="unbreakable">${parent}${dup}</a>&nbsp;
+#end
+#end
+&nbsp;</td>
+</tr>
+<tr>
+<td class="left">Datatypes</td>
+<td class="right">
+#foreach ($datatype in ${attribute.getDatatypes()})
+	<span style="unbreakable">${datatype}</a>&nbsp;
+#end
+&nbsp;</td>
+</tr>
+<tr>
+<td class="left">Values</td>
+<td class="right">
+#foreach ($value in ${attribute.getValues()})
+	<span style="unbreakable">"${value}"</a>&nbsp;
+#end
+&nbsp;</td>
+</tr>
+</table>
+<br />
+#end
+#end
+</body>
+</html>
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/copyright.txt b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/copyright.txt
new file mode 100644
index 0000000..1b1fc5d
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/copyright.txt
@@ -0,0 +1,22 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/dom-output-files.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/dom-output-files.vm
new file mode 100644
index 0000000..d27c54e
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/dom-output-files.vm
@@ -0,0 +1,75 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?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>
+	<file path="org/odftoolkit/odfdom/dom/style/OdfStyleFamily.java" template="java-odfdom-stylefamily.vm" />
+	<file path="org/odftoolkit/odfdom/dom/style/props/OdfStylePropertiesSet.java" template="java-odfdom-styleset.vm" />
+####<file path="org/odftoolkit/odfdom/dom/DefaultElementVisitor.java" template="java-odfdom-element-visitor.vm" />
+####<file path="org/odftoolkit/odfdom/dom/DefaultAttributeVisitor.java" template="java-odfdom-attribute-visitor.vm" />
+##
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+##
+#set($classname = "${model.camelCase($element)}Element")
+	<file path="org/odftoolkit/odfdom/dom/element/${model.extractNamespace($element)}/${classname}.java" context="$element" template="java-odfdom-element-template.vm" />
+##
+#end
+#end
+##
+#foreach ($base in $javamodel.getBaseclasses())
+##
+#if ($base != "container" && $base != "style" && $base != "styleproperties")
+#set($classname = "${model.camelCase($base)}ElementBase")
+	<file path="org/odftoolkit/odfdom/dom/element/${model.extractNamespace($base)}/${classname}.java" context="$base" template="java-odfdom-elementbase-template.vm" />
+#end
+##
+#end
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+##
+#set($classname = "${model.camelCase($attribute)}Attribute")
+	<file path="org/odftoolkit/odfdom/dom/attribute/${model.extractNamespace($attribute)}/${classname}.java" context="$attribute" template="java-odfdom-attribute-template.vm" />
+#end
+#end
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+##
+#set($classname = "${model.camelCase($attribute)}Attribute")
+	<file path="org/odftoolkit/odfdom/dom/attribute/${model.extractNamespace($attribute)}/${classname}.java" context="$attribute" template="java-odfdom-attribute-template.vm" />
+#end
+#end
+##
+#foreach ($styleelement in ${model.getElements().withoutMultiples()})
+#if ($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+#set ($properties=${styleelement.withMultiples().getAttributes()})
+#if ($properties.size()>0)
+	<file path="org/odftoolkit/odfdom/dom/style/props/Odf${model.camelCase(${styleelement.getLocalName()})}.java" context="$styleelement" template="java-odfdom-styleproperties.vm" />
+#end
+#end
+#end
+</filelist>
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-attribute-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-attribute-template.vm
new file mode 100644
index 0000000..bd8c3d0
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-attribute-template.vm
@@ -0,0 +1,386 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+
+## 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 = $model.getAttribute($context))
+#set($NS = $attribute.getNamespace())
+#set($localname = ${model.extractLocalname($attribute)})
+#set($classname = "${model.camelCase($attribute)}Attribute")
+#set ($valueobject = "String")
+##
+#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
+#if ($datatypes.size() > 0)
+#set ($hasdatatype = true)
+#else
+#set ($hasdatatype = false)
+#end
+##
+##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
+#set($values = ${attribute.getValues().withoutMultiples()})
+#if ($values.size() > 0)
+#if ($values.size() ==2 && $hasdatatype == false)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueobject = "Boolean")
+#end
+#end
+#set ($enum = true)
+#if ($valueobject == "Boolean")
+#set ($enum = false)
+#end
+#else
+#set ($enum = false)
+#end
+##
+## Check whether the attribute has default value.
+##
+#set ($hasDefaultValue = false)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
+#set ($hasDefaultValue = true)
+#end
+#end
+##
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($hasDefaultValue and $defaultValueSet.size() == 1)
+#foreach ($value in $defaultValueSet)
+#set ($uniqueDefaultValue = $value)
+#end
+#end
+##
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.${NS};
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+#if ($hasDefaultValue)
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+#if ($hasDefaultValue and $defaultValueSet.size()>1)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
+import org.odftoolkit.odfdom.dom.element.${parent.getNamespace()}.${model.camelCase($parent)}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(OdfDocumentNamespace.${NS.toUpperCase()}, "$localname");
+#if ($hasDefaultValue)
+#if ($defaultValueSet.size()>1)
+#foreach ($defaultValue in $defaultValueSet)
+#set ($constant = $model.constantCase($defaultValue))
+#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}= "$defaultValue";
+#else
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}=	Value.${model.escapeKeyword($constant)}.toString();
+#end
+#end
+#else
+#if ($uniqueDefaultValue=="&#34;")
+	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
+#else
+	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
+#end
+#end
+#end
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute ${attribute}}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute ${attribute}}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+##
+#if ($enum)
+
+	/**
+	 * The value set of {@odf.attribute ${attribute}}.
+	 */
+	public enum Value {
+#set ($separator="		")
+#foreach($value in $values)
+#if (${value.toString().length()} == 1)
+#set ($constant = $value)
+#else
+#set ($constant = $model.constantCase($value))
+#end${separator}${model.escapeKeyword($constant)}("${model.escapeLiteral($value)}")#set ($separator=", ")
+#end ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+#end
+##
+## Handle Non-String-Attributes
+#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
+#if ($valueobject != "Boolean")
+#foreach ($valuetype in $valuetypes)
+#set ($valueobject = $valuetype)
+#end
+#end
+#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
+#set ($valueobject = "String")
+#end
+#if ($valueobject != "String")
+#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
+##
+
+	/**
+	 * @param value The <code>${simplevalue}</code> value of the attribute.
+	 */
+	public void set${model.camelCase($simplevalue)}Value(${simplevalue} value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>${simplevalue}</code> value of the attribute
+	 */
+	public ${simplevalue} ${simplevalue}Value() {
+		String val = super.getValue();
+		try {
+			return ${valueobject}.parse${model.camelCase($simplevalue)}(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+#end
+##
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+#else
+## enum and no datatype
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+#end
+#else
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+#end
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+#else
+## enum and no datatype
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of ${attribute} is not valid");
+		}
+#end
+#else
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of ${attribute} is not valid");
+		}
+#end
+	}
+
+#if ($hasDefaultValue)
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+#if ($defaultValueSet.size()>1)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
+			if (parentElement instanceof ${model.camelCase($parent)}Element) {
+				defaultValue = "${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $parent))}";
+			}
+#end
+#end
+#else
+			defaultValue = "${model.escapeLiteral($uniqueDefaultValue)}";
+#end
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+#else
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+#end
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+#if ($hasdatatype and $datatypes.size() > 0)
+#set ($datatype="")
+#foreach($value in $datatypes)
+#set ($datatype=$value)
+#end
+#if ($datatype == "ID")
+		return true;
+#else
+		return false;
+#end
+#else
+		return false;
+#end
+	}
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-attribute-visitor.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-attribute-visitor.vm
new file mode 100644
index 0000000..36d8cc6
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-attribute-visitor.vm
@@ -0,0 +1,57 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+
+package org.odftoolkit.odfdom.dom;
+
+import org.odftoolkit.odfdom.dom.attribute.text.TextCAttribute;
+import org.odftoolkit.odfdom.pkg.AttributeVisitor;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+#set ($NS = ${attribute.getNamespace()})
+#set($classname = "${model.camelCase($attribute)}Attribute")
+import org.odftoolkit.odfdom.dom.attribute.${NS}.${classname};
+#end
+#end
+##
+public abstract class DefaultAttributeVisitor implements AttributeVisitor {
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.pkg.AttributeVisitor\#visit(org.odftoolkit.odfdom.pkg.OdfAttribute)
+	 */
+	@Override
+	abstract public void visit(OdfAttribute attribute);
+
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+#set ($NS = ${attribute.getNamespace()})
+#set ($classname = "${model.camelCase($attribute)}Attribute")
+	/**
+	 * A method to visit "${attribute.getQName()}" attribute
+	 * @param attr - an instance of $classname
+	 */
+	public void visit($classname attr) {
+		visit((OdfAttribute) attr);
+	}
+#end
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-element-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-element-template.vm
new file mode 100644
index 0000000..77d70de
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-element-template.vm
@@ -0,0 +1,461 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+
+## Template to create the Java class representing an ODF element
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+#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
+#set ($children = ${element.getChildElements().withoutMultiples()})
+#set ($attributes = ${element.getAttributes().withoutMultiples()})
+##
+## Determine whether element is stylable. Set base class OdfElement, OdfStylableElement, or...
+#if ($odfmodel.isStylable($element))
+#set ($stylable = true)
+#set ($baseclassname = "OdfStylableElement")
+#set ($elementStyleFamily=${odfmodel.getStyleFamilies($element)})
+#set ($useOdfStyleableShapeElement = false)
+#foreach($f in $elementStyleFamily)
+#if (${f.getQName()}=="draw:graphic" || ${f.getQName()}=="presentation:presentation")
+#set ($useOdfStyleableShapeElement = true)
+#end
+#end
+#if ($useOdfStyleableShapeElement)
+#set ($baseclassname = "OdfStyleableShapeElement")
+#end
+#set ($baseHasMandatoryAttr = false)
+#set ($firstfamily = ${model.camelCase($model.extractLocalname($odfmodel.getStyleFamilies($element).get(0)))})
+#else
+#set ($stylable = false)
+#set ($baseclassname = "OdfElement")
+#set ($baseHasMandatoryAttr = false)
+#end
+##
+## ...or configured base class
+#if (${javamodel.getBaseclassOf($element)})
+#set ($base = ${javamodel.getBaseclassOf($element)})
+## Configured manually generated base class?
+#if ($base == "container")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfContainerElementBase")
+#set ($baseimport = "org.odftoolkit.odfdom.pkg.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+#if ($base == "style")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfStyleBase")
+#set ($baseimport = "org.odftoolkit.odfdom.dom.element.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+#if ($base == "styleproperties")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfStylePropertiesBase")
+#set ($baseimport = "org.odftoolkit.odfdom.dom.element.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+## Configured automatic generated base class. If so, remove all attributes defined in base class
+#if (!$_specialbase)
+#set ($baseclassname = "${model.camelCase($base)}ElementBase")
+#if ($base.getNamespace() != $NS)
+#set ($baseimport = "org.odftoolkit.odfdom.dom.element.${base.getNamespace()}.$baseclassname")
+#end
+#set ($attributes = $attributes.without($base.getBaseAttributes()))
+#set ($baseElement = ${model.getElement($base.getQName())})
+#set ($bAttributes = ${baseElement.getAttributes().withoutMultiples()})
+#foreach ($bAttribute in $bAttributes)
+#if (${baseElement.isMandatory($bAttribute)})
+#set ($baseHasMandatoryAttr = true)
+#end
+#end
+#end
+#end
+##
+## Test if this element has mandatory (non optional) attributes
+#set ($hasMandatoryAttr = false)
+#foreach ($attribute in $attributes)
+#if (${element.isMandatory($attribute)})
+#set ($hasMandatoryAttr = true)
+#set ($mandatoryAttr = $attribute)
+#end
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.${NS};
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+#if ($stylable)
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+#else
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+#if ($base == "styleproperties")
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+#foreach ($child in $children)
+#if ($child == "*")
+#set ($anychild = true)
+#else
+#set ($childNS = ${child.getNamespace()})
+#set ($childClassname = "${model.camelCase($child)}Element")
+#if ($childNS != $NS)
+import org.odftoolkit.odfdom.dom.element.${childNS}.$childClassname;
+#end
+#end
+#end
+##
+#foreach ($child in $attributes)
+#if ($child == "*")
+#set ($anyattribute = true)
+#else
+#set ($childNS = ${child.getNamespace()})
+#set ($childClassname = "${model.camelCase($child)}Attribute")
+import org.odftoolkit.odfdom.dom.attribute.${childNS}.$childClassname;
+#end
+#end
+##
+## If there is a base class which is not in the current package
+#if ($baseimport)
+import ${baseimport};
+#end
+
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * DOM implementation of OpenDocument element  {@odf.element ${context}}.
+ *
+#if ($anychild)
+ * This class can have any org.w3c.dom.Element child element.
+#end
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public class $classname extends $baseclassname {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.${NS.toUpperCase()}, "${element.getLocalName()}");
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDoc) {
+#if (($stylable && ($useOdfStyleableShapeElement == false)))
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.${firstfamily}, OdfName.newName(OdfDocumentNamespace.${NS.toUpperCase()}, "style-name"));
+#else
+		super(ownerDoc, ELEMENT_NAME);
+#end
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+## ---------------------------------------------------
+##  Only for base = styleproperties
+## ---------------------------------------------------
+#if ($base == "styleproperties")
+#foreach ($attribute in $attributes)
+#if ($attribute != "*")
+#set($propertyName = ${attribute.getLocalName()})
+#if (${element.getLocalName()}=="graphic-properties" && $propertyName =="shadow")
+#set($propertyName = ${attribute.getQName()})
+#end
+
+	public final static OdfStyleProperty ${model.camelCase($propertyName)} =
+		OdfStyleProperty.get(OdfStylePropertiesSet.${model.camelCase($element.getLocalName())}, OdfName.newName(OdfDocumentNamespace.${model.firstWord($attribute).toUpperCase()}, "${attribute.getLocalName()}"));
+#end
+#end
+#end
+##
+## ---------------------------------------------------
+##  Add init method if this element or the base
+##  element has mandatory attributes
+##  TODO: NO caller use this method.
+## ---------------------------------------------------
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in $attributes)
+#set($attri = ${model.getAttribute($attr.getQName())})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+## use attri get all of the values.
+#set($values = ${attri.getValues().withoutMultiples()})
+#if ($values.size() ==2 && $dataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${model.camelCase($attribute)}Attribute")
+#set ($aParam = "${model.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+#if (${element.isMandatory($attribute)})
+	 * Attribute is mandatory.
+	 *
+#end
+	 * @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(OdfDocumentNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
+#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $model.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Methods for child element creation
+## ---------------------------------------------------
+##
+#foreach($ch in $children)
+#if ($ch != "*")
+#set ($child = ${ch.withMultiples()})
+#set ($cClassname = "${model.camelCase($child)}Element")
+#set ($cVar = ${model.javaCase($child)})
+#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
+##set has parameter flag
+#set ($hasParams = false)
+#foreach ($ch_attribute in $ch_attributes)
+#if (${child.isMandatory($ch_attribute)})
+#set ($hasParams = true)
+#end
+#end
+#if ($hasParams)
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+#set ($seperateFlag="")
+#set ($params="")
+#foreach ($ch_attr in $ch_attributes)
+#if (${child.isMandatory($ch_attr)})
+#set($ch_attri = ${model.getAttribute($ch_attr.getQName())})
+#set ($ch_ValueObject = "String")
+#set ($ch_SimpleValue = "")
+#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
+#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
+#foreach ($ch_ValueType in $ch_ValueTypes)
+#set ($ch_ValueObject = $ch_ValueType)
+#end
+## use ch_attri get all of the values.
+#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
+#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($ch_Value in $ch_Values)
+#if ($ch_Value==true)
+#set ($trueFlag = true)
+#end
+#if ($ch_Value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($ch_Hasdatatype = true)
+#set ($ch_ValueObject = "Boolean")
+#end
+#end
+#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
+#set ($ch_ValueObject = "String")
+#end
+#if ($ch_ValueObject != "String")
+#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
+#end
+#if ($ch_attr != "*")
+#set ($attribute = ${ch_attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${model.camelCase($attribute)}Attribute")
+#set ($aParam = "${model.javaCase($attribute)}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}")
+#else
+#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
+#end
+#set ($seperateFlag=", ")
+#end
+#end
+#end
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	 public $cClassname new${cClassname}($params) {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+#foreach ($ch_attr in $ch_attributes)
+#if ($ch_attr != "*" && ${child.isMandatory($ch_attr)})
+#set ($aClassname = "${model.camelCase($ch_attr)}Attribute")
+#set ($aParam = "${model.javaCase($ch_attr)}Value")
+		${cVar}.set$aClassname($aParam);
+#end
+#end
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#else
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	public $cClassname new${cClassname}() {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#end
+#end
+#end
+##
+## -----------------------------------------------------
+##  New: newTextNode
+## -----------------------------------------------------
+##
+#if ($element.canHaveText())
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	 }
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-element-visitor.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-element-visitor.vm
new file mode 100644
index 0000000..b306af1
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-element-visitor.vm
@@ -0,0 +1,59 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+
+package org.odftoolkit.odfdom.dom;
+
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+##
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+#set ($NS = ${element.getNamespace()})
+#set ($classname = "${model.camelCase($element)}Element")
+import org.odftoolkit.odfdom.dom.element.${NS}.${classname};
+#end
+#end
+##
+
+/**
+ * A default visitor for DOM layer elements.
+ * <p> It implements the interface of DomVisitor in package layer.</p>
+ * <p> It provides element process method for some special elements. </p>
+ *
+ */
+public abstract class DefaultElementVisitor implements ElementVisitor {
+
+	@Override
+	abstract public void visit(OdfElement element);
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+#set ($NS = ${element.getNamespace()})
+#set ($classname = "${model.camelCase($element)}Element")
+	/**
+	 * A method to visit "${element.getQName()}" elements
+	 * @param ele - an instance of $classname
+	 */
+	public void visit($classname ele) {
+		visit((OdfElement) ele);
+	}
+#end
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-elementbase-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-elementbase-template.vm
new file mode 100644
index 0000000..7ebd0f5
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-elementbase-template.vm
@@ -0,0 +1,207 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+
+## Template to create the Java class representing an ODF element.
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+#set ($base = $javamodel.getBaseclass($context))
+#set ($baseElement = ${model.getElement($base.getQName())})
+#set($classname = "${model.camelCase($base)}ElementBase")
+##
+## Set Superclass
+#if (${base.isStylable()})
+#set ($stylable = true)
+#set ($superclass = "OdfStylableElement")
+#if ($baseElement)
+#set ($elementStyleFamily=${odfmodel.getStyleFamilies($baseElement)})
+#set ($useOdfStyleableShapeElement = false)
+#foreach($f in $elementStyleFamily)
+#if (${f.getQName()}=="draw:graphic" || ${f.getQName()}=="presentation:presentation")
+#set ($useOdfStyleableShapeElement = true)
+#end
+#end
+#end
+#else
+#set ($superclass = 'OdfElement')
+#end
+#if ($context== "text:list-level-style")
+#set ($superclass = 'OdfStyleBase')
+#end
+
+#if ($useOdfStyleableShapeElement || $classname=="DrawShapeElementBase")
+#set ($superclass = "OdfStyleableShapeElement")
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.${base.getNamespace()};
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+#foreach ($attribute in ${base.getBaseAttributes().withoutMultiples()})
+#if ($attribute == "*")
+#set ($anyattribute = true)
+#else
+import org.odftoolkit.odfdom.dom.attribute.${attribute.getNamespace()}.${model.camelCase($attribute)}Attribute;
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * DOM implementation of OpenDocument base element
+ *
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public abstract class $classname extends $superclass {
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+#if (${base.isStylable()}&& ($useOdfStyleableShapeElement == false) || $classname=="TextParagraphElementBase")
+	public $classname(OdfFileDom ownerDoc, OdfName elementName, OdfStyleFamily styleFamily, OdfName styleAttrName) {
+		super(ownerDoc, elementName, styleFamily, styleAttrName);
+	}
+#else
+	public $classname(OdfFileDom ownerDoc, OdfName elementName) {
+		super(ownerDoc, elementName);
+	}
+#end
+
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in ${base.getBaseAttributes().withoutMultiples()})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attr.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+#set($values = ${attr.getValues().withoutMultiples()})
+#if ($values.size() ==2)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${model.camelCase($attribute)}Attribute")
+#set ($aParam = "${model.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @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(OdfDocumentNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attr, $base))
+#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attr, $base))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attr))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $model.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-stylefamily.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-stylefamily.vm
new file mode 100644
index 0000000..d3368d1
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-stylefamily.vm
@@ -0,0 +1,121 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+
+## Template to create the list of artefacts which are to be generated
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.style;
+
+import java.util.Arrays;
+import java.util.Collections;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Map;
+import java.util.HashMap;
+##
+#foreach ($styleelement in ${model.getElements().withoutMultiples()})
+#if ($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+import org.odftoolkit.odfdom.dom.element.style.${model.camelCase($styleelement)}Element;
+#end
+#end
+
+public class OdfStyleFamily implements Comparable<OdfStyleFamily> {
+
+	private Set<OdfStyleProperty> m_properties = new TreeSet<OdfStyleProperty>();
+	private static Map<String, OdfStyleFamily> m_familyByName = new HashMap<String, OdfStyleFamily>();
+
+	public static OdfStyleFamily getByName(String name) {
+		return m_familyByName.get(name);
+	}
+
+	private OdfStyleFamily(String name, OdfStyleProperty[] props) {
+		m_name = name;
+		m_properties.addAll(Arrays.asList(props));
+		m_familyByName.put(name, this);
+	}
+
+	private OdfStyleFamily(String name) {
+		m_name = name;
+		m_familyByName.put(name, this);
+	}
+		
+	public String getName() {
+		return m_name;
+	}
+
+	public int compareTo(OdfStyleFamily o) {
+		return m_name.compareTo(o.toString());
+	}
+
+	public static OdfStyleFamily valueOf(String name) {
+		OdfStyleFamily family = getByName(name);
+		if (family == null) {
+			family = new OdfStyleFamily(name);
+		} 
+		return family;
+	}
+
+	public static String toString(OdfStyleFamily family) {
+		if (family != null) {
+			return family.toString();
+		}
+		else {
+			return new String();
+		}
+	}
+
+	@Override
+	public String toString() {
+		return m_name;
+	}
+
+	public Set<OdfStyleProperty> getProperties() {
+		return Collections.unmodifiableSet(m_properties);
+	}
+
+#foreach ($family in ${odfmodel.getStyleFamilies()})
+	public final static OdfStyleFamily ${model.camelCase($model.extractLocalname($family))} = new OdfStyleFamily("${model.extractLocalname($family)}",
+			new OdfStyleProperty[]{
+#foreach ($styleelement in ${model.getElements().withoutMultiples()})
+#if ($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+#foreach ($property in ${styleelement.withMultiples().getAttributes()})
+#set($propertyName = ${property.getLocalName()})
+#if (${styleelement.getLocalName()}=="graphic-properties" && $propertyName =="shadow")
+#set($propertyName = ${property.getQName()})
+#end
+	${model.camelCase($styleelement)}Element.${model.camelCase($propertyName)},
+#end
+#end
+#end
+	});
+
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-styleproperties.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-styleproperties.vm
new file mode 100644
index 0000000..0064201
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-styleproperties.vm
@@ -0,0 +1,41 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+
+#include('copyright.txt')
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+#set ($element = ${model.getElement($context)})
+#set ($classname = "Odf${model.camelCase($element.getLocalName())}")
+public interface $classname {
+#foreach ($property in ${element.getAttributes().withoutMultiples()})
+#set($propertyName = ${property.getLocalName()})
+#if (${element.getLocalName()}=="graphic-properties" && $propertyName =="shadow")
+#set($propertyName = ${property.getQName()})
+#end
+	public final static OdfStyleProperty ${model.camelCase($propertyName)} =
+		OdfStyleProperty.get(OdfStylePropertiesSet.${model.camelCase($element.getLocalName())}, OdfName.newName(OdfDocumentNamespace.${property.getNamespace().toUpperCase()}, "${property.getLocalName()}"));
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-styleset.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-styleset.vm
new file mode 100644
index 0000000..330f9be
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/dom/java-odfdom-styleset.vm
@@ -0,0 +1,38 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+
+## Template	to create the list of artefacts	which are to be	generated
+##
+## Documentation of	template development can be	found in local file
+## TemplateHelp.html.
+##
+##
+#include('copyright.txt')
+// !!! GENERATED SOURCE	CODE !!!
+package	org.odftoolkit.odfdom.dom.style.props;
+public enum	OdfStylePropertiesSet {
+#foreach ($styleelement	in ${model.getElements().withoutMultiples()})
+#if	($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+	// style-${styleelement.getLocalName()}-attlist
+	${model.camelCase($styleelement.getLocalName())},
+#end
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/copyright.txt b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/copyright.txt
new file mode 100644
index 0000000..b4a06cd
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/copyright.txt
@@ -0,0 +1,24 @@
+/************************************************************************
+ *
+ * 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.
+ * 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.
+ *
+ ************************************************************************/
+
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm
new file mode 100644
index 0000000..4c4a92f
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm
@@ -0,0 +1,379 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the list of signature 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
+## 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 ($valueobject = "String")
+##
+#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
+#if ($datatypes.size() > 0)
+#set ($hasdatatype = true)
+#else
+#set ($hasdatatype = false)
+#end
+##
+##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
+#set($values = ${attribute.getValues().withoutMultiples()})
+#if ($values.size() > 0)
+#if ($values.size() ==2 && $hasdatatype == false)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueobject = "Boolean")
+#end
+#end
+#set ($enum = true)
+#if ($valueobject == "Boolean")
+#set ($enum = false)
+#end
+#else
+#set ($enum = false)
+#end
+##
+## Check whether the attribute has default value.
+##
+#set ($hasDefaultValue = false)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
+#set ($hasDefaultValue = true)
+#end
+#end
+##
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($hasDefaultValue and $defaultValueSet.size() == 1)
+#foreach ($value in $defaultValueSet)
+#set ($uniqueDefaultValue = $value)
+#end
+#end
+##
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+#if ($hasDefaultValue)
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * 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}");
+#if ($hasDefaultValue)
+#if ($defaultValueSet.size()>1)
+#foreach ($defaultValue in $defaultValueSet)
+#set ($constant = $signaturemodel.constantCase($defaultValue))
+#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
+	public static final String DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)}= "$defaultValue";
+#else
+	public static final String DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)}=	Value.${signaturemodel.escapeKeyword($constant)}.toString();
+#end
+#end
+#else
+#if ($uniqueDefaultValue=="&#34;")
+	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
+#else
+	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
+#end
+#end
+#end
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute ${attribute}}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute ${attribute}}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+##
+#if ($enum)
+
+	/**
+	 * The value set of {@odf.attribute ${attribute}}.
+	 */
+	public enum Value {
+#set ($separator="		")
+#foreach($value in $values)
+#if (${value.toString().length()} == 1)
+#set ($constant = $value)
+#else
+#set ($constant = $signaturemodel.constantCase($value))
+#end${separator}${signaturemodel.escapeKeyword($constant)}("${signaturemodel.escapeLiteral($value)}")#set ($separator=", ")
+#end ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+#end
+##
+## Handle Non-String-Attributes
+#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
+#if ($valueobject != "Boolean")
+#foreach ($valuetype in $valuetypes)
+#set ($valueobject = $valuetype)
+#end
+#end
+#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
+#set ($valueobject = "String")
+#end
+#if ($valueobject != "String")
+#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
+##
+
+	/**
+	 * @param value The <code>${simplevalue}</code> value of the attribute.
+	 */
+	public void set${signaturemodel.camelCase($simplevalue)}Value(${simplevalue} value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>${simplevalue}</code> value of the attribute
+	 */
+	public ${simplevalue} ${simplevalue}Value() {
+		String val = super.getValue();
+		try {
+			return ${valueobject}.parse${signaturemodel.camelCase($simplevalue)}(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+#end
+##
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+#else
+## enum and no datatype
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+#end
+#else
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+#end
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+#else
+## enum and no datatype
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of ${attribute} is not valid");
+		}
+#end
+#else
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of ${attribute} is not valid");
+		}
+#end
+	}
+
+#if ($hasDefaultValue)
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+#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))}";
+			}
+#end
+#end
+#else
+			defaultValue = "${signaturemodel.escapeLiteral($uniqueDefaultValue)}";
+#end
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+#else
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+#end
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+#if ($hasdatatype and $datatypes.size() > 0)
+#set ($datatype="")
+#foreach($value in $datatypes)
+#set ($datatype=$value)
+#end
+#if ($datatype == "ID")
+		return true;
+#else
+		return false;
+#end
+#else
+		return false;
+#end
+	}
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm
new file mode 100644
index 0000000..0ebb09a
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm
@@ -0,0 +1,370 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the Java class representing an ODF signature element
+##
+## 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 ($classname = "${model.camelCase($element)}Element")
+##
+## Set child element and child attributes
+#set ($children = ${element.getChildElements().withoutMultiples()})
+#set ($attributes = ${element.getAttributes().withoutMultiples()})
+##
+## Set base class OdfElement
+#set ($baseclassname = "OdfElement")
+#set ($baseHasMandatoryAttr = false)
+##
+## ...or configured base class
+#if (${javamodel.getBaseclassOf($element)})
+#set ($base = ${javamodel.getBaseclassOf($element)})
+#end
+## Configured manually generated base class?
+#if ($base == "container")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfContainerElementBase")
+#set ($baseimport = "org.odftoolkit.odfdom.pkg.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+##
+## Test if this element has mandatory (non optional) attributes
+#set ($hasMandatoryAttr = false)
+#foreach ($attribute in $attributes)
+#if (${element.isMandatory($attribute)})
+#set ($hasMandatoryAttr = true)
+#set ($mandatoryAttr = $attribute)
+#end
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+##
+## If there is a base class which is not in the current package
+#if ($baseimport)
+import ${baseimport};
+#end
+
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * Data signature implementation of OpenDocument element  {@odf.element ${context}}.
+ *
+#if ($anychild)
+ * This class can have any org.w3c.dom.Element child element.
+#end
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public class $classname extends $baseclassname {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName("${NS}", "${PREFIX}:${element}");
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+##
+## ---------------------------------------------------
+##  Add init method if this element or the base
+##  element has mandatory attributes
+##  TODO: NO caller use this method.
+## ---------------------------------------------------
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in $attributes)
+#set($attri = ${signaturemodel.getAttribute($attr.getQName())})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+## use attri get all of the values.
+#set($values = ${attri.getValues().withoutMultiples()})
+#if ($values.size() ==2 && $dataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${signaturemodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${signaturemodel.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+#if (${element.isMandatory($attribute)})
+	 * Attribute is mandatory.
+	 *
+#end
+	 * @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);
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
+#set ($defaultValue = ${signaturemodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $signaturemodel.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${signaturemodel.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Methods for child element creation
+## ---------------------------------------------------
+##
+#foreach($ch in $children)
+#if ($ch != "*")
+#set ($child = ${ch.withMultiples()})
+#set ($cClassname = "${signaturemodel.camelCase($child)}Element")
+#set ($cVar = ${signaturemodel.javaCase($child)})
+#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
+##set has parameter flag
+#set ($hasParams = false)
+#foreach ($ch_attribute in $ch_attributes)
+#if (${child.isMandatory($ch_attribute)})
+#set ($hasParams = true)
+#end
+#end
+#if ($hasParams)
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+#set ($seperateFlag="")
+#set ($params="")
+#foreach ($ch_attr in $ch_attributes)
+#if (${child.isMandatory($ch_attr)})
+#set($ch_attri = ${signaturemodel.getAttribute($ch_attr.getQName())})
+#set ($ch_ValueObject = "String")
+#set ($ch_SimpleValue = "")
+#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
+#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
+#foreach ($ch_ValueType in $ch_ValueTypes)
+#set ($ch_ValueObject = $ch_ValueType)
+#end
+## use ch_attri get all of the values.
+#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
+#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($ch_Value in $ch_Values)
+#if ($ch_Value==true)
+#set ($trueFlag = true)
+#end
+#if ($ch_Value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($ch_Hasdatatype = true)
+#set ($ch_ValueObject = "Boolean")
+#end
+#end
+#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
+#set ($ch_ValueObject = "String")
+#end
+#if ($ch_ValueObject != "String")
+#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
+#end
+#if ($ch_attr != "*")
+#set ($attribute = ${ch_attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${signaturemodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${signaturemodel.javaCase($attribute)}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}")
+#else
+#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
+#end
+#set ($seperateFlag=", ")
+#end
+#end
+#end
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	 public $cClassname new${cClassname}($params) {
+		$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")
+		${cVar}.set$aClassname($aParam);
+#end
+#end
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#else
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	public $cClassname new${cClassname}() {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#end
+#end
+#end
+##
+## -----------------------------------------------------
+##  New: newTextNode
+## -----------------------------------------------------
+##
+#if ($element.canHaveText())
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	 }
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm
new file mode 100644
index 0000000..7f025f5
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm
@@ -0,0 +1,385 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the list of manifest 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 ($valueobject = "String")
+##
+#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
+#if ($datatypes.size() > 0)
+#set ($hasdatatype = true)
+#else
+#set ($hasdatatype = false)
+#end
+##
+##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
+#set($values = ${attribute.getValues().withoutMultiples()})
+#if ($values.size() > 0)
+#if ($values.size() ==2 && $hasdatatype == false)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueobject = "Boolean")
+#end
+#end
+#set ($enum = true)
+#if ($valueobject == "Boolean")
+#set ($enum = false)
+#end
+#else
+#set ($enum = false)
+#end
+##
+## Check whether the attribute has default value.
+##
+#set ($hasDefaultValue = false)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
+#set ($hasDefaultValue = true)
+#end
+#end
+##
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($hasDefaultValue and $defaultValueSet.size() == 1)
+#foreach ($value in $defaultValueSet)
+#set ($uniqueDefaultValue = $value)
+#end
+#end
+##
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+#if ($hasDefaultValue)
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+#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;
+#end
+#end
+#end
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute ${attribute.getQName()}}.
+ *
+ */
+public class $classname extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("${NS}", "manifest:${attribute}");
+#if ($hasDefaultValue)
+#if ($defaultValueSet.size()>1)
+#foreach ($defaultValue in $defaultValueSet)
+#set ($constant = $manifestmodel.constantCase($defaultValue))
+#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
+	public static final String DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)}= "$defaultValue";
+#else
+	public static final String DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)}=	Value.${manifestmodel.escapeKeyword($constant)}.toString();
+#end
+#end
+#else
+#if ($uniqueDefaultValue=="&#34;")
+	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
+#else
+	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
+#end
+#end
+#end
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute ${attribute}}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute ${attribute}}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+##
+#if ($enum)
+
+	/**
+	 * The value set of {@odf.attribute ${attribute}}.
+	 */
+	public enum Value {
+#set ($separator="		")
+#foreach($value in $values)
+#if (${value.toString().length()} == 1)
+#set ($constant = $value)
+#else
+#set ($constant = $manifestmodel.constantCase($value))
+#end${separator}${manifestmodel.escapeKeyword($constant)}("${manifestmodel.escapeLiteral($value)}")#set ($separator=", ")
+#end ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+#end
+##
+## Handle Non-String-Attributes
+#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
+#if ($valueobject != "Boolean")
+#foreach ($valuetype in $valuetypes)
+#set ($valueobject = $valuetype)
+#end
+#end
+#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
+#set ($valueobject = "String")
+#end
+#if ($valueobject != "String")
+#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
+##
+
+	/**
+	 * @param value The <code>${simplevalue}</code> value of the attribute.
+	 */
+	public void set${manifestmodel.camelCase($simplevalue)}Value(${simplevalue} value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>${simplevalue}</code> value of the attribute
+	 */
+	public ${simplevalue} ${simplevalue}Value() {
+		String val = super.getValue();
+		try {
+			return ${valueobject}.parse${manifestmodel.camelCase($simplevalue)}(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+#end
+##
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+#else
+## enum and no datatype
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+#end
+#else
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+#end
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+#else
+## enum and no datatype
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of ${attribute} is not valid");
+		}
+#end
+#else
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of ${attribute} is not valid");
+		}
+#end
+	}
+
+#if ($hasDefaultValue)
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+#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))}";
+			}
+#end
+#end
+#else
+			defaultValue = "${manifestmodel.escapeLiteral($uniqueDefaultValue)}";
+#end
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+#else
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+#end
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+#if ($hasdatatype and $datatypes.size() > 0)
+#set ($datatype="")
+#foreach($value in $datatypes)
+#set ($datatype=$value)
+#end
+#if ($datatype == "ID")
+		return true;
+#else
+		return false;
+#end
+#else
+		return false;
+#end
+	}
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm
new file mode 100644
index 0000000..714aa99
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm
@@ -0,0 +1,344 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the Java class representing an ODF manifest element
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+#set ($element = ${manifestmodel.getElement($context)})
+#set ($oldelement = ${oldmodel.getElement($context)})
+###set ($NS = ${element.getNamespace()})
+#set ($classname = "${manifestmodel.camelCase($element)}Element")
+##
+## Set child element and child attributes
+#set ($children = ${element.getChildElements().withoutMultiples()})
+#set ($attributes = ${element.getAttributes().withoutMultiples()})
+##
+#set ($baseclassname = "OdfElement")
+#set ($baseHasMandatoryAttr = false)
+##
+## Test if this element has mandatory (non optional) attributes
+#set ($hasMandatoryAttr = false)
+#foreach ($attribute in $attributes)
+#if (${element.isMandatory($attribute)})
+#set ($hasMandatoryAttr = true)
+#set ($mandatoryAttr = $attribute)
+#end
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * Manifest implementation of OpenDocument element  {@odf.element ${context}}.
+ *
+#if ($anychild)
+ * This class can have any org.w3c.dom.Element child element.
+#end
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public class $classname extends $baseclassname {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:${element}");
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+##
+## ---------------------------------------------------
+##  Add init method if this element or the base
+##  element has mandatory attributes
+##  TODO: NO caller use this method.
+## ---------------------------------------------------
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in $attributes)
+#set($attri = ${manifestmodel.getAttribute($attr.getQName())})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+## use attri get all of the values.
+#set($values = ${attri.getValues().withoutMultiples()})
+#if ($values.size() ==2 && $dataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${manifestmodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+#if (${element.isMandatory($attribute)})
+	 * Attribute is mandatory.
+	 *
+#end
+	 * @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);
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
+#set ($defaultValue = ${manifestmodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $manifestmodel.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${manifestmodel.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Methods for child element creation
+## ---------------------------------------------------
+##
+#foreach($ch in $children)
+#if ($ch != "*")
+#set ($child = ${ch.withMultiples()})
+#set ($cClassname = "${manifestmodel.camelCase($child)}Element")
+#set ($cVar = ${manifestmodel.javaCase($child)})
+#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
+##set has parameter flag
+#set ($hasParams = false)
+#foreach ($ch_attribute in $ch_attributes)
+#if (${child.isMandatory($ch_attribute)})
+#set ($hasParams = true)
+#end
+#end
+#if ($hasParams)
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+#set ($seperateFlag="")
+#set ($params="")
+#foreach ($ch_attr in $ch_attributes)
+#if (${child.isMandatory($ch_attr)})
+#set($ch_attri = ${manifestmodel.getAttribute($ch_attr.getQName())})
+#set ($ch_ValueObject = "String")
+#set ($ch_SimpleValue = "")
+#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
+#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
+#foreach ($ch_ValueType in $ch_ValueTypes)
+#set ($ch_ValueObject = $ch_ValueType)
+#end
+## use ch_attri get all of the values.
+#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
+#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($ch_Value in $ch_Values)
+#if ($ch_Value==true)
+#set ($trueFlag = true)
+#end
+#if ($ch_Value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($ch_Hasdatatype = true)
+#set ($ch_ValueObject = "Boolean")
+#end
+#end
+#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
+#set ($ch_ValueObject = "String")
+#end
+#if ($ch_ValueObject != "String")
+#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
+#end
+#if ($ch_attr != "*")
+#set ($attribute = ${ch_attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${manifestmodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${manifestmodel.javaCase($attribute)}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}")
+#else
+#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
+#end
+#set ($seperateFlag=", ")
+#end
+#end
+#end
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	 public $cClassname new${cClassname}($params) {
+		$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")
+		${cVar}.set$aClassname($aParam);
+#end
+#end
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#else
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	public $cClassname new${cClassname}() {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#end
+#end
+#end
+##
+## -----------------------------------------------------
+##  New: newTextNode
+## -----------------------------------------------------
+##
+#if ($element.canHaveText())
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	 }
+#end
+}
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm
new file mode 100644
index 0000000..f5e3f81
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm
@@ -0,0 +1,62 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?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>
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/OdfTextDocument.odt b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/OdfTextDocument.odt
new file mode 100644
index 0000000..71becc8
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/OdfTextDocument.odt
Binary files differ
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/dom-output-files.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/dom-output-files.vm
new file mode 100644
index 0000000..0c0562e
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/dom-output-files.vm
@@ -0,0 +1,29 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?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>
+    <file path="hierarchy.py" template="pythontest.vm" />
+</filelist>
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/odfdocument.py b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/odfdocument.py
new file mode 100644
index 0000000..5ccf8fd
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/odfdocument.py
@@ -0,0 +1,93 @@
+# /usr/bin/python
+
+########################################################################
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+#
+# Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Use is subject to license terms.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy
+# of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+# obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+########################################################################/
+
+from datetime import datetime
+from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
+from hierarchy import CHILD_ELEMENTS, CHILD_ATTRIBUTES
+from xml.dom import minidom
+
+class OdfDocument:
+
+    # Constructor. Param: File-like input object or path to input file
+    def __init__(self, path_or_file):
+        self.mZip = ZipFile(path_or_file, 'r')
+        self.mContentDom = None
+        self.mStylesDom = None
+
+    # Get DOM of content.xml
+    def get_content_dom(self):
+        if not self.mContentDom:
+            contentString = self.mZip.read("content.xml")
+            self.mContentDom = minidom.parseString(contentString)
+        return self.mContentDom
+
+    # Get document type depended content root (e.g. office:text node for .odt)
+    def get_content_root(self):
+        self.get_content_dom()
+        document_content = self.mContentDom.firstChild
+        if document_content:
+            office_body = None
+            for child in document_content.childNodes:
+                if child.nodeName == "office:body":
+                    office_body = child
+                    break
+            if office_body:
+                return office_body.firstChild
+
+    # Get DOM of styles.xml
+    def get_styles_dom(self):
+        if not self.mStylesDom:
+            stylesString = self.mZip.read("styles.xml")
+            self.mStylesDom = minidom.parseString(stylesString)
+        return self.mStylesDom
+
+    # Save Document. The input file must not be overwritten.
+    def save(self, path_or_file):
+        outZip = ZipFile(path_or_file, 'w')
+        today = datetime.today()
+        self.get_content_dom()
+        self.get_styles_dom()
+        for filename in self.mZip.namelist():
+            transmit = ""
+            info = ZipInfo(filename, (today.year, today.month, today.day, today.hour, today.minute, today.second))
+            if filename == "content.xml":
+                transmit = self.mContentDom.toxml().encode( 'utf-8')
+            elif filename == "styles.xml":
+                transmit = self.mStylesDom.toxml().encode( 'utf-8')
+            else:
+                transmit = self.mZip.read(filename)
+            if filename == "mimetype":
+                info.compress_type = ZIP_STORED
+            else:
+                info.compress_type = ZIP_DEFLATED
+            outZip.writestr(info, transmit)
+        outZip.close()
+
+    # This method should be in Node itself
+    def allowed_child_elements(self, odf_node):
+        return CHILD_ELEMENTS[odf_node.nodeName]
+        
+    # This method should be in Node itself
+    def allowed_attributes(self, odf_node):
+        return CHILD_ATTRIBUTES[odf_node.nodeName]
\ No newline at end of file
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/pythontest.vm b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/pythontest.vm
new file mode 100644
index 0000000..b949f34
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/pythontest.vm
@@ -0,0 +1,76 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+
+## Context:
+##
+## - All SortedSets are copies, so in-place ops like remove, add, etc. are allowed
+## - Do not use $set2 = $set1 if you want to change only one of these. 
+##   Use $set2 = util.copySet($set1) instead.
+##
+## String odfName: Name of current ODF element (at the time of template initialization)
+## SortedSet<String> odfElementNames: Names of all ODF elements
+## SortedSet<String> odfElementBaseNames: Names of all ODF base elements
+## SortedSet<String> odfAttributeNames: Names of all ODF attributes
+## NamespaceDictionars nsdict: Utility to translate between NamespaceURI and local Namespace:
+##    String nsdict.getLocalNamespace(String NamespaceURI)
+##    String nsdict.getNamespaceURI(String LocalNamespace)
+## Expressions util: Utility to get and transform Expression names:
+##               String util.extractLocalname(String name)
+##               String util.extractNamespace(String name)
+##               String util.getQName(Expression exp)
+##               String util.camelCase(String raw): some-text-fragment -> SomeTextFragment
+##               String util.javaCase(String raw): some-text-fragment -> someTextFragment
+##    SortedSet<String> util.emptySet()
+##    SortedSet<String> util.copySet(Set<String> original)
+## ExpressionViewByName nameView: Access to ODF element and attribute name hierarchy:
+##    SortedSet<String> nameView.getElementChildNames(String parentelementname)
+##    SortedSet<String> nameView.getElementParentNames(String elementchildname)
+##    SortedSet<String> nameView.getAttributeChildNames(String parentelementname)
+##    SortedSet<String> nameView.getAttributeParentNames(String attributechildname)
+##               String nameView.getElementRename(String elementname)
+##               String nameView.getElementBaseName(String elementname)
+##               String nameView.getElementsByBaseName(String basename)
+##    SortedSet<String> nameView.getElementStyleFamilies(String elementname)
+##
+# /usr/bin/python
+
+CHILD_ELEMENTS = {
+#foreach( $name in $odfElementNames )
+	'$name' : ( \
+#set($sortedChildren = ${nameView.getElementChildNames($name)})
+#foreach($childname in $sortedChildren)
+		'$childname', \
+#end
+),
+#end
+}
+
+CHILD_ATTRIBUTES = {
+#foreach( $name in $odfElementNames )
+	'$name' : ( \
+#set($sortedAttributes = ${nameView.getAttributeChildNames($name)})
+#foreach( $attrname in $sortedAttributes)
+		'$attrname', \
+#end
+),
+#end
+}
+
diff --git a/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/test_main.py b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/test_main.py
new file mode 100644
index 0000000..ce3c008
--- /dev/null
+++ b/trunk/generator/schema2template/src/main/resources/examples/odf/odfdom-python/test_main.py
@@ -0,0 +1,42 @@
+########################################################################
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+#
+# Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Use is subject to license terms.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy
+# of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+# obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+########################################################################/
+
+import sys
+import os.path
+from odfdocument import OdfDocument
+
+if __name__ == "__main__":
+    mProjectBase = sys.path[0]
+    textTemplate = os.path.join(mProjectBase, "OdfTextDocument.odt")
+    odt = OdfDocument(textTemplate)
+    dom = odt.get_content_dom()
+    office_text = odt.get_content_root()
+
+    if "text:p" in odt.allowed_child_elements(office_text):
+        new_p = dom.createElement("text:p")
+        office_text.appendChild(new_p)
+        new_p.appendChild(dom.createTextNode("Text in a new paragraph."))
+
+    outputPath = os.path.join(mProjectBase, "Output.odt")
+    odt.save(outputPath)
+
+    print "Saved output in file %s" % (outputPath)
\ No newline at end of file
diff --git a/trunk/generator/schema2template/src/test/java/schema2template/TemplateAPICoverageTest.java b/trunk/generator/schema2template/src/test/java/schema2template/TemplateAPICoverageTest.java
new file mode 100644
index 0000000..d74dc11
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/java/schema2template/TemplateAPICoverageTest.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template;
+
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import org.junit.Test;
+import schema2template.model.PuzzleComponent;
+import schema2template.model.PuzzlePiece;
+import schema2template.model.PuzzlePieceSet;
+import schema2template.model.QNameValue;
+import schema2template.model.QNamed;
+import schema2template.model.QNamedPuzzleComponent;
+import schema2template.model.XMLModel;
+import static org.junit.Assert.*;
+
+/** Regression test to make sure that API used by templates still exists */
+public class TemplateAPICoverageTest {
+
+
+    public TemplateAPICoverageTest() {
+    }
+
+    // Method name and number of input parameters
+    public static class MethodWithParameterCount {
+        public String methodName;
+        public int parameters;
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof MethodWithParameterCount) {
+                MethodWithParameterCount om = ((MethodWithParameterCount) o);
+                if (om.methodName.equals(methodName) && om.parameters == parameters) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return methodName.hashCode();
+        }
+    }
+
+
+    // Method-HashSet enhanced by convenient search functionality
+    public static class MethodSet extends HashSet<MethodWithParameterCount> {
+
+        public boolean contains(String methodName, int parameters) {
+            MethodWithParameterCount mwpc = new MethodWithParameterCount();
+            mwpc.methodName = methodName;
+            mwpc.parameters = parameters;
+            return contains(mwpc);
+        }
+
+    }
+
+
+    // get all Methods of a given class
+    public static MethodSet getMethods(Class clazz) {
+        MethodSet retval = new MethodSet();
+        Method[] methods = clazz.getMethods();
+        for (Method method : methods) {
+            MethodWithParameterCount mwpc = new MethodWithParameterCount();
+            mwpc.methodName = method.getName();
+            mwpc.parameters = method.getParameterTypes().length;
+            retval.add(mwpc);
+        }
+        return retval;
+    }
+
+
+    /**
+     * Test coverage: Test existance of methods made for template usage.
+     * If you rename a method, this test will fail to show that all templates
+     * using this method have to be adapted.
+     *
+     * The input parameter count of each method will be tested for additional safety.
+     */
+    @Test
+    public void testCoverage() {
+        MethodSet methods;
+        
+        methods = getMethods(PuzzleComponent.class);
+        assertTrue(methods.contains("canHaveText", 0));
+        assertTrue(methods.contains("getAttributes", 0));
+        assertTrue(methods.contains("getChildElements", 0));
+        assertTrue(methods.contains("getCollection", 0));
+        assertTrue(methods.contains("getDatatypes", 0));
+        assertTrue(methods.contains("getParents", 0));
+        assertTrue(methods.contains("getType", 0));
+        assertTrue(methods.contains("getValues", 0));
+        assertTrue(methods.contains("isSingleton", 1));
+
+        methods = getMethods(QNamed.class);
+        assertTrue(methods.contains("getLocalName",0));
+        assertTrue(methods.contains("getNamespace",0));
+        assertTrue(methods.contains("getQName",0));
+
+        methods = getMethods(XMLModel.class);
+        assertTrue(methods.contains("camelCase",1));
+        assertTrue(methods.contains("constantCase",1));
+        assertTrue(methods.contains("escapeKeyword",1));
+        assertTrue(methods.contains("escapeLiteral",1));
+        assertTrue(methods.contains("extractLocalname",1));
+        assertTrue(methods.contains("extractNamespace",1));
+        assertTrue(methods.contains("firstWord",1));
+        assertTrue(methods.contains("getAttribute",1));
+        assertTrue(methods.contains("getAttribute",2));
+        assertTrue(methods.contains("getAttributes",0));
+        assertTrue(methods.contains("getElement",1));
+        assertTrue(methods.contains("getElement",2));
+        assertTrue(methods.contains("getElements",0));
+        assertTrue(methods.contains("javaCase",1));
+        assertTrue(methods.contains("lastWord",1));
+
+        // Test inheritance -> so there's no need to test inherited methods
+        assertTrue(QNamed.class.isAssignableFrom(PuzzlePiece.class));
+        assertTrue(QNamed.class.isAssignableFrom(PuzzlePieceSet.class));
+        assertTrue(QNamed.class.isAssignableFrom(QNameValue.class));
+        assertTrue(QNamed.class.isAssignableFrom(QNamedPuzzleComponent.class));
+        assertTrue(PuzzleComponent.class.isAssignableFrom(QNamedPuzzleComponent.class));
+        assertTrue(QNamedPuzzleComponent.class.isAssignableFrom(PuzzlePiece.class));
+        assertTrue(QNamedPuzzleComponent.class.isAssignableFrom(PuzzlePieceSet.class));
+    }
+}
\ No newline at end of file
diff --git a/trunk/generator/schema2template/src/test/java/schema2template/example/ExampleGenerationTest.java b/trunk/generator/schema2template/src/test/java/schema2template/example/ExampleGenerationTest.java
new file mode 100644
index 0000000..a026f05
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/java/schema2template/example/ExampleGenerationTest.java
@@ -0,0 +1,46 @@
+/**
+ * **********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ***********************************************************************
+ */
+package schema2template.example;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.Test;
+import org.junit.Assert;
+import schema2template.example.odf.OdfHelper;
+
+public class ExampleGenerationTest {
+
+	/**
+	 * Test: It should be able to generate all examples without a failure.
+	 */
+	@Test
+	public void testAllExampleGenerations() {
+		try {
+			OdfHelper.main(null);
+		} catch (Exception ex) {
+			Logger.getLogger(ExampleGenerationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail(ex.toString());
+		}
+	}
+}
diff --git a/trunk/generator/schema2template/src/test/java/schema2template/example/odf/OdfTemplateAPICoverageTest.java b/trunk/generator/schema2template/src/test/java/schema2template/example/odf/OdfTemplateAPICoverageTest.java
new file mode 100644
index 0000000..db61a7d
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/java/schema2template/example/odf/OdfTemplateAPICoverageTest.java
@@ -0,0 +1,69 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import org.junit.Test;
+import schema2template.TemplateAPICoverageTest;
+import schema2template.TemplateAPICoverageTest.MethodSet;
+import schema2template.model.QNamed;
+import static org.junit.Assert.*;
+
+public class OdfTemplateAPICoverageTest {
+
+    public OdfTemplateAPICoverageTest() {
+    }
+
+    /**
+     * Test coverage: Test existense of methods made for template usage.
+     * If you rename a method, this test will fail to show that all templates
+     * using this method have to be adapted.
+     *
+     * The input parameter count of each method will be tested for additional safety.
+     */
+    @Test
+    public void testOdfCoverage() {
+        MethodSet methods;
+        
+        methods = TemplateAPICoverageTest.getMethods(OdfModel.class);
+        assertTrue(methods.contains("getDefaultAttributeValue", 2));
+        assertTrue(methods.contains("getStyleFamilies", 0));
+        assertTrue(methods.contains("getStyleFamilies", 1));
+        assertTrue(methods.contains("isStylable", 1));
+
+        methods = TemplateAPICoverageTest.getMethods(SourceCodeModel.class);
+        assertTrue(methods.contains("getBaseclass",1));
+        assertTrue(methods.contains("getBaseclasses",0));
+        assertTrue(methods.contains("getBaseclassOf",1));
+        assertTrue(methods.contains("getConversiontype",1));
+        assertTrue(methods.contains("getPrimitiveType",1));
+        assertTrue(methods.contains("getValuetype",1));
+        assertTrue(methods.contains("getValuetypes",1));
+
+        methods = TemplateAPICoverageTest.getMethods(SourceCodeBaseClass.class);
+        assertTrue(methods.contains("isStylable",0));
+        assertTrue(methods.contains("getBaseAttributes",0));
+        assertTrue(methods.contains("getElements",0));
+
+        // Test inheritance -> so there's no need to test inherited methods
+        assertTrue(QNamed.class.isAssignableFrom(SourceCodeBaseClass.class));
+    }
+}
\ No newline at end of file
diff --git a/trunk/generator/schema2template/src/test/java/schema2template/example/odf/PuzzlePieceTest.java b/trunk/generator/schema2template/src/test/java/schema2template/example/odf/PuzzlePieceTest.java
new file mode 100644
index 0000000..91deaeb
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/java/schema2template/example/odf/PuzzlePieceTest.java
@@ -0,0 +1,221 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package schema2template.example.odf;
+
+import com.sun.msv.grammar.Expression;
+import java.io.BufferedReader;
+import static schema2template.example.odf.OdfHelper.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.Test;
+import schema2template.model.PuzzlePiece;
+import schema2template.model.PuzzlePieceSet;
+import org.junit.Assert;
+import org.junit.Ignore;
+import schema2template.model.MSVExpressionIterator;
+
+public class PuzzlePieceTest {
+
+	private static final Logger LOG = Logger.getLogger(PuzzlePieceTest.class.getName());
+	private static final String OUTPUT_DUMP_ODF10 = "target" + File.separator + "odf10-msvtree.dump";
+	private static final String OUTPUT_DUMP_ODF11 = "target" + File.separator + "odf11-msvtree.dump";
+	private static final String OUTPUT_DUMP_ODF12 = "target" + File.separator + "odf12-msvtree.dump";
+	private static final String OUTPUT_REF_ODF10 = TEST_REFERENCE_DIR + File.separator + "odf10-msvtree.ref";
+	private static final String OUTPUT_REF_ODF11 = TEST_REFERENCE_DIR + File.separator + "odf11-msvtree.ref";
+	private static final String OUTPUT_REF_ODF12 = TEST_REFERENCE_DIR + File.separator + "odf12-msvtree.ref";
+	private static final int ODF12_ELEMENT_DUPLICATES = 7;
+	private static final int ODF12_ATTRIBUTE_DUPLICATES = 134;
+
+
+
+	/**
+	 * Test: Use the MSV
+	 *
+	 * <p>This test uses the ODF example, but it's meant to test the general ability to correctly
+	 * extract PuzzlePieces out of a XML schema</p>
+	 */
+	@Test
+	public void testMSVExpressionTree() {
+		try {
+			Expression odf10Root = OdfHelper.loadSchemaODF10();
+			String odf10Dump = MSVExpressionIterator.dumpMSVExpressionTree(odf10Root);
+			LOG.info("Writing MSV RelaxNG tree into file: " + OUTPUT_DUMP_ODF10);
+			PrintWriter out0 = new PrintWriter(new FileWriter(OUTPUT_DUMP_ODF10));
+			out0.print(odf10Dump);
+			out0.close();
+
+			Expression odf11Root = OdfHelper.loadSchemaODF11();
+			String odf11Dump = MSVExpressionIterator.dumpMSVExpressionTree(odf11Root);
+			LOG.info("Writing MSV RelaxNG tree into file: " + OUTPUT_DUMP_ODF11);
+			PrintWriter out1 = new PrintWriter(new FileWriter(OUTPUT_DUMP_ODF11));
+			out1.print(odf11Dump);
+			out1.close();
+
+			Expression odf12Root = OdfHelper.loadSchemaODF12();
+			String odf12Dump = MSVExpressionIterator.dumpMSVExpressionTree(odf12Root);
+			LOG.info("Writing MSV RelaxNG tree into file: " + OUTPUT_DUMP_ODF12);
+			PrintWriter out2 = new PrintWriter(new FileWriter(OUTPUT_DUMP_ODF12));
+			out2.print(odf12Dump);
+			out2.close();
+
+			String odf10Ref = readFileAsString(OUTPUT_REF_ODF10);
+			if(!odf10Ref.equals(odf10Dump)){
+				String errorMsg = "There is a difference between the expected outcome of the parsed ODF 1.0 tree.\n"
+					+ "Please compare the output:\n\t'" + OUTPUT_DUMP_ODF10 + "'\nwith the reference\n\t'" + odf10RngFile;
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+
+			String odf11Ref = readFileAsString(OUTPUT_REF_ODF11);
+			if(!odf11Ref.equals(odf11Dump)){
+				String errorMsg = "There is a difference between the expected outcome of the parsed ODF 1.1 tree.\n"
+					+ "Please compare the output:\n\t'" + OUTPUT_DUMP_ODF11 + "'\nwith the reference\n\t'" + odf11RngFile;
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+
+			String odf12Ref = readFileAsString(OUTPUT_REF_ODF12);
+			if(!odf12Ref.equals(odf12Dump)){
+				String errorMsg = "There is a difference between the expected outcome of the parsed ODF 1.2 tree.\n"
+					+ "Please compare the output:\n\t'" + OUTPUT_DUMP_ODF12 + "'\nwith the reference\n\t'" + odf12RngFile;
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(PuzzlePieceTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail(ex.toString());
+		}
+	}
+
+	/**
+	 * Reading a file into a string
+     * @param filePath  path of the file to be opened.
+     */
+    private String readFileAsString(String filePath) throws java.io.IOException {
+        StringBuilder fileData = new StringBuilder(2000);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
+        char[] buf = new char[1024];
+        int numRead = 0;
+        while ((numRead = reader.read(buf)) != -1) {
+            String readData = String.valueOf(buf, 0, numRead);
+            fileData.append(readData);
+            buf = new char[1024];
+        }
+        reader.close();
+        return fileData.toString();
+    }
+
+	/**
+	 * Test: Create PuzzlePiece elements and attributes with ODF Spec 1.1 (old version, won't be changed, so
+	 * it's a good base for a test).
+	 *
+	 * <p>This test uses the ODF example, but it's meant to test the general ability to correctly
+	 * extract PuzzlePieces out of a XML schema</p>
+	 */
+	@Test
+	public void testExtractPuzzlePieces() {
+		try {
+			PuzzlePieceSet allElements_ODF11 = new PuzzlePieceSet();
+			PuzzlePieceSet allAttributes_ODF11 = new PuzzlePieceSet();
+			PuzzlePiece.extractPuzzlePieces(OdfHelper.loadSchemaODF11(), allElements_ODF11, allAttributes_ODF11);
+			// There is a difference of one wildcard "*" representing anyElement/anyAttribute
+			checkFoundNumber(allElements_ODF11.withoutMultiples(), ODF11_ELEMENT_NUMBER + 1, "element");
+			checkFoundNumber(allAttributes_ODF11.withoutMultiples(), ODF11_ATTRIBUTE_NUMBER + 1, "attribute");
+
+			PuzzlePieceSet allElements_ODF12 = new PuzzlePieceSet();
+			PuzzlePieceSet allAttributes_ODF12 = new PuzzlePieceSet();
+			PuzzlePiece.extractPuzzlePieces(OdfHelper.loadSchemaODF12(), allElements_ODF12, allAttributes_ODF12);
+			// There is a difference of one wildcard "*" representing anyElement/anyAttribute
+			checkFoundNumber(allElements_ODF12.withoutMultiples(), ODF12_ELEMENT_NUMBER + 1, "element");
+			checkFoundNumber(allAttributes_ODF12.withoutMultiples(), ODF12_ATTRIBUTE_NUMBER + 1, "attribute");
+		} catch (Exception ex) {
+			Logger.getLogger(PuzzlePieceTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail(ex.toString());
+		}
+	}
+
+	/**
+	 * Test: Create PuzzlePiece elements and attributes with ODF Spec 1.1 (old version, won't be changed, so
+	 * it's a good base for a test).
+	 *
+	 * <p>This test uses the ODF example, but it's meant to test the general ability to correctly
+	 * extract PuzzlePieces out of a XML schema</p>
+	 */
+	@Test
+	@Ignore
+	public void testExtractPuzzlePiecesWithDuplicates() {
+		try {
+			PuzzlePieceSet allElements_ODF12 = new PuzzlePieceSet();
+			PuzzlePieceSet allAttributes_ODF12 = new PuzzlePieceSet();
+			PuzzlePiece.extractPuzzlePieces(OdfHelper.loadSchemaODF12(), allElements_ODF12, allAttributes_ODF12);
+			// There is a difference of one wildcard "*" representing anyElement/anyAttribute
+
+			int foundElementDuplicates = allElements_ODF12.size() - (ODF12_ELEMENT_NUMBER + 1);
+			int foundAttributeDuplicates = allAttributes_ODF12.size() - (ODF12_ATTRIBUTE_NUMBER + 1);
+
+			if(ODF12_ELEMENT_DUPLICATES != foundElementDuplicates){
+				String errorMsg = "There is a difference between the expected outcome of duplicates for ODF 1.2 elements.\n"
+					+ "Expected: '" + ODF12_ELEMENT_DUPLICATES + "'\tfound:'" + foundElementDuplicates;
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+			if(ODF12_ATTRIBUTE_DUPLICATES != foundAttributeDuplicates){
+				String errorMsg = "There is a difference between the expected outcome of duplicates for ODF 1.2 elements.\n"
+					+ "Expected: '" + ODF12_ATTRIBUTE_DUPLICATES + "'\tfound:'" + foundAttributeDuplicates;
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(PuzzlePieceTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail(ex.toString());
+		}
+	}
+
+	/** Routine to compare the expected number of either attributes or elements with the found amount */
+	private void checkFoundNumber(PuzzlePieceSet puzzlePieceSet, int expectedAmount, String nodeName) {
+		if (expectedAmount == puzzlePieceSet.size()) {
+			LOG.log(Level.INFO, "The expected amount of {0}s could be found", nodeName);
+			if (DEBUG) {
+				int i = 0;
+				for (PuzzlePiece piece : puzzlePieceSet) {
+					LOG.info(piece.getQName() + " was " + nodeName + " #" + ++i);
+				}
+				LOG.info("++++++++++++");
+			}
+		} else {
+			String errorMsg = "Instead of " + expectedAmount
+					+ " there were " + puzzlePieceSet.size() + " " + nodeName + "s found";
+			LOG.severe(errorMsg);
+			int i = 0;
+			for (PuzzlePiece piece : puzzlePieceSet) {
+				LOG.severe(piece.getQName() + " was " + nodeName + " #" + ++i);
+			}
+			LOG.info("********************");
+			Assert.fail(errorMsg);
+		}
+	}	
+}
diff --git a/trunk/generator/schema2template/src/test/resources/examples/odf/odf10-msvtree.ref b/trunk/generator/schema2template/src/test/resources/examples/odf/odf10-msvtree.ref
new file mode 100644
index 0000000..a67aa3e
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/resources/examples/odf/odf10-msvtree.ref
@@ -0,0 +1,23483 @@
+0: CHOICE
+1: REF 'office-document',
+2: ELEMENT "office:document",
+3: SEQUENCE
+4: REF 'office-document-attrs',
+5: ATTRIBUTE "office:mimetype",
+6: REF 'string',
+7: DATA 'string',
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-meta',
+5: CHOICE
+6: ELEMENT "office:meta",
+7: REF 'office-meta-content',
+8: REF 'office-meta-content-strict',
+9: CHOICE
+10: ONEOREMORE
+11: REF 'office-meta-data',
+12: CHOICE
+13: ELEMENT "meta:generator",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "dc:title",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "dc:description",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "dc:subject",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "meta:keyword",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "meta:initial-creator",
+14: REF 'string',
+15: DATA 'string',
+13: REF 'dc-creator',
+14: ELEMENT "dc:creator",
+15: REF 'string',
+16: DATA 'string',
+13: ELEMENT "meta:printed-by",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "meta:creation-date",
+14: REF 'dateTime',
+15: DATA 'dateTime',
+13: REF 'dc-date',
+14: ELEMENT "dc:date",
+15: REF 'dateTime',
+16: DATA 'dateTime',
+13: ELEMENT "meta:print-date",
+14: REF 'dateTime',
+15: DATA 'dateTime',
+13: ELEMENT "meta:template",
+14: SEQUENCE
+15: ATTRIBUTE "xlink:href",
+16: REF 'anyURI',
+17: DATA 'anyURI',
+15: CHOICE
+16: ATTRIBUTE "xlink:type",
+17: VALUE 'simple',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:actuate",
+17: VALUE 'onRequest',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:title",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:date",
+17: REF 'dateTime',
+18: DATA 'dateTime',
+16: EPSILON
+13: ELEMENT "meta:auto-reload",
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "xlink:type",
+17: VALUE 'simple',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:show",
+17: VALUE 'replace',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:actuate",
+17: VALUE 'onLoad',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:href",
+17: REF 'anyURI',
+18: DATA 'anyURI',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:delay",
+17: REF 'duration',
+18: DATA 'duration',
+16: EPSILON
+13: ELEMENT "meta:hyperlink-behaviour",
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "office:target-frame-name",
+17: REF 'targetFrameName',
+18: CHOICE
+19: VALUE '_self',
+19: VALUE '_blank',
+19: VALUE '_parent',
+19: VALUE '_top',
+19: REF 'string',
+20: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:show",
+17: CHOICE
+18: VALUE 'new',
+18: VALUE 'replace',
+16: EPSILON
+13: ELEMENT "dc:language",
+14: REF 'language',
+15: DATA 'token',
+13: ELEMENT "meta:editing-cycles",
+14: REF 'nonNegativeInteger',
+15: DATA 'nonNegativeInteger',
+13: ELEMENT "meta:editing-duration",
+14: REF 'duration',
+15: DATA 'duration',
+13: ELEMENT "meta:document-statistic",
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "meta:page-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:table-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:draw-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:image-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:ole-object-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:paragraph-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:word-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:character-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "frame-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "sentence-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "syllable-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "non-whitespace-character-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:row-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:cell-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:object-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+13: ELEMENT "meta:user-defined",
+14: SEQUENCE
+15: ATTRIBUTE "meta:name",
+16: REF 'string',
+17: DATA 'string',
+15: CHOICE
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'float',
+17: REF 'double',
+18: DATA 'double',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'date',
+17: REF 'dateOrDateTime',
+18: CHOICE
+19: DATA 'date',
+19: DATA 'dateTime',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'time',
+17: REF 'duration',
+18: DATA 'duration',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'boolean',
+17: REF 'boolean',
+18: CHOICE
+19: VALUE 'true',
+19: VALUE 'false',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'string',
+17: REF 'string',
+18: DATA 'string',
+16: STRING
+10: EPSILON
+6: EPSILON
+4: REF 'office-settings',
+5: CHOICE
+6: ELEMENT "office:settings",
+7: ONEOREMORE
+8: REF 'config-config-item-set',
+9: ELEMENT "config:config-item-set",
+10: SEQUENCE
+11: REF 'config-config-item-set-attlist',
+12: ATTRIBUTE "config:name",
+13: REF 'string',
+14: DATA 'string',
+11: REF 'config-items',
+12: ONEOREMORE
+13: CHOICE
+14: REF 'config-config-item',
+15: ELEMENT "config:config-item",
+16: SEQUENCE
+17: REF 'config-config-item-attlist',
+18: INTERLEAVE
+19: ATTRIBUTE "config:name",
+20: REF 'string',
+21: DATA 'string',
+19: ATTRIBUTE "config:type",
+20: CHOICE
+21: VALUE 'boolean',
+21: VALUE 'short',
+21: VALUE 'int',
+21: VALUE 'long',
+21: VALUE 'double',
+21: VALUE 'string',
+21: VALUE 'datetime',
+21: VALUE 'base64Binary',
+17: STRING
+14: REF 'config-config-item-set',
+14: REF 'config-config-item-map-named',
+15: ELEMENT "config:config-item-map-named",
+16: SEQUENCE
+17: REF 'config-config-item-map-named-attlist',
+18: ATTRIBUTE "config:name",
+19: REF 'string',
+20: DATA 'string',
+17: ONEOREMORE
+18: REF 'config-config-item-map-entry',
+19: ELEMENT "config:config-item-map-entry",
+20: SEQUENCE
+21: REF 'config-config-item-map-entry-attlist',
+22: CHOICE
+23: ATTRIBUTE "config:name",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'config-items',
+22: ONEOREMORE
+23: CHOICE
+24: REF 'config-config-item',
+24: REF 'config-config-item-set',
+24: REF 'config-config-item-map-named',
+24: REF 'config-config-item-map-indexed',
+25: ELEMENT "config:config-item-map-indexed",
+26: SEQUENCE
+27: REF 'config-config-item-map-indexed-attlist',
+28: ATTRIBUTE "config:name",
+29: REF 'string',
+30: DATA 'string',
+27: ONEOREMORE
+28: REF 'config-config-item-map-entry',
+14: REF 'config-config-item-map-indexed',
+6: EPSILON
+4: REF 'office-scripts',
+5: CHOICE
+6: ELEMENT "office:scripts",
+7: SEQUENCE
+8: CHOICE
+9: ONEOREMORE
+10: REF 'office-script',
+11: ELEMENT "office:script",
+12: SEQUENCE
+13: REF 'office-script-attlist',
+14: ATTRIBUTE "script:language",
+15: REF 'string',
+16: DATA 'string',
+13: MIXED
+14: REF 'anyElements',
+15: CHOICE
+16: ONEOREMORE
+17: ELEMENT "*",
+18: MIXED
+19: REF 'anyAttListOrElements',
+20: SEQUENCE
+21: CHOICE
+22: ONEOREMORE
+23: ATTRIBUTE "*",
+24: STRING
+22: EPSILON
+21: REF 'anyElements',
+22: CHOICE
+23: ONEOREMORE
+23: EPSILON
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'office-event-listeners',
+10: ELEMENT "office:event-listeners",
+11: CHOICE
+12: ONEOREMORE
+13: CHOICE
+14: REF 'script-event-listener',
+15: ELEMENT "script:event-listener",
+16: REF 'script-event-listener-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "script:event-name",
+19: REF 'string',
+20: DATA 'string',
+18: ATTRIBUTE "script:language",
+19: REF 'string',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "script:macro-name",
+20: REF 'string',
+21: DATA 'string',
+19: SEQUENCE
+20: ATTRIBUTE "xlink:href",
+21: REF 'anyURI',
+22: DATA 'anyURI',
+20: CHOICE
+21: ATTRIBUTE "xlink:type",
+22: VALUE 'simple',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:actuate",
+22: VALUE 'onRequest',
+21: EPSILON
+14: REF 'presentation-event-listener',
+15: ELEMENT "presentation:event-listener",
+16: SEQUENCE
+17: REF 'presentation-event-listener-attlist',
+18: INTERLEAVE
+19: ATTRIBUTE "script:event-name",
+20: REF 'string',
+21: DATA 'string',
+19: ATTRIBUTE "presentation:action",
+20: CHOICE
+21: VALUE 'none',
+21: VALUE 'previous-page',
+21: VALUE 'next-page',
+21: VALUE 'first-page',
+21: VALUE 'last-page',
+21: VALUE 'hide',
+21: VALUE 'stop',
+21: VALUE 'execute',
+21: VALUE 'show',
+21: VALUE 'verb',
+21: VALUE 'fade-out',
+21: VALUE 'sound',
+19: CHOICE
+20: ATTRIBUTE "presentation:effect",
+21: REF 'presentationEffects',
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'fade',
+23: VALUE 'move',
+23: VALUE 'stripes',
+23: VALUE 'open',
+23: VALUE 'close',
+23: VALUE 'dissolve',
+23: VALUE 'wavyline',
+23: VALUE 'random',
+23: VALUE 'lines',
+23: VALUE 'laser',
+23: VALUE 'appear',
+23: VALUE 'hide',
+23: VALUE 'move-short',
+23: VALUE 'checkerboard',
+23: VALUE 'rotate',
+23: VALUE 'stretch',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:direction",
+21: REF 'presentationEffectDirections',
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'from-left',
+23: VALUE 'from-top',
+23: VALUE 'from-right',
+23: VALUE 'from-bottom',
+23: VALUE 'from-center',
+23: VALUE 'from-upper-left',
+23: VALUE 'from-upper-right',
+23: VALUE 'from-lower-left',
+23: VALUE 'from-lower-right',
+23: VALUE 'to-left',
+23: VALUE 'to-top',
+23: VALUE 'to-right',
+23: VALUE 'to-bottom',
+23: VALUE 'to-upper-left',
+23: VALUE 'to-upper-right',
+23: VALUE 'to-lower-right',
+23: VALUE 'to-lower-left',
+23: VALUE 'path',
+23: VALUE 'spiral-inward-left',
+23: VALUE 'spiral-inward-right',
+23: VALUE 'spiral-outward-left',
+23: VALUE 'spiral-outward-right',
+23: VALUE 'vertical',
+23: VALUE 'horizontal',
+23: VALUE 'to-center',
+23: VALUE 'clockwise',
+23: VALUE 'counter-clockwise',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:speed",
+21: REF 'presentationSpeeds',
+22: CHOICE
+23: VALUE 'slow',
+23: VALUE 'medium',
+23: VALUE 'fast',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:start-scale",
+21: REF 'percent',
+22: DATA 'string',
+20: EPSILON
+19: SEQUENCE
+20: CHOICE
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyURI',
+23: DATA 'anyURI',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:type",
+22: VALUE 'simple',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:show",
+22: VALUE 'embed',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:actuate",
+22: VALUE 'onRequest',
+21: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:verb",
+21: REF 'nonNegativeInteger',
+22: DATA 'nonNegativeInteger',
+20: EPSILON
+17: CHOICE
+18: REF 'presentation-sound',
+19: ELEMENT "presentation:sound",
+20: SEQUENCE
+21: REF 'presentation-sound-attlist',
+22: CHOICE
+23: ATTRIBUTE "presentation:play-full",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyURI',
+23: DATA 'anyURI',
+21: CHOICE
+22: ATTRIBUTE "xlink:type",
+23: VALUE 'simple',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "xlink:actuate",
+23: VALUE 'onRequest',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "xlink:show",
+23: CHOICE
+24: VALUE 'new',
+24: VALUE 'replace',
+22: EPSILON
+18: EPSILON
+12: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-font-face-decls',
+5: CHOICE
+6: ELEMENT "office:font-face-decls",
+7: CHOICE
+8: ONEOREMORE
+9: REF 'style-font-face',
+10: ELEMENT "style:font-face",
+11: SEQUENCE
+12: REF 'style-font-face-attlist',
+13: INTERLEAVE
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "svg:font-family",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-style",
+17: REF 'fontStyle',
+18: CHOICE
+19: VALUE 'normal',
+19: VALUE 'italic',
+19: VALUE 'oblique',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-variant",
+17: REF 'fontVariant',
+18: CHOICE
+19: VALUE 'normal',
+19: VALUE 'small-caps',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-weight",
+17: REF 'fontWeight',
+18: CHOICE
+19: VALUE 'normal',
+19: VALUE 'bold',
+19: VALUE '100',
+19: VALUE '200',
+19: VALUE '300',
+19: VALUE '400',
+19: VALUE '500',
+19: VALUE '600',
+19: VALUE '700',
+19: VALUE '800',
+19: VALUE '900',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-stretch",
+17: CHOICE
+18: VALUE 'normal',
+18: VALUE 'ultra-condensed',
+18: VALUE 'extra-condensed',
+18: VALUE 'condensed',
+18: VALUE 'semi-condensed',
+18: VALUE 'semi-expanded',
+18: VALUE 'expanded',
+18: VALUE 'extra-expanded',
+18: VALUE 'ultra-expanded',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-size",
+17: REF 'positiveLength',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:unicode-range",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:units-per-em",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:panose-1",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:stemv",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:stemh",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:slope",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:cap-height",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:x-height",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:accent-height",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:ascent",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:descent",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:widths",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:bbox",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:ideographic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:alphabetic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:mathematical",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:hanging",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-ideographic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-alphabetic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-mathematical",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-hanging",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:underline-position",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:underline-thickness",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:strikethrough-position",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:strikethrough-thickness",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:overline-position",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:overline-thickness",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+14: ATTRIBUTE "style:name",
+15: REF 'string',
+16: DATA 'string',
+14: CHOICE
+15: ATTRIBUTE "style:font-adornments",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-family-generic",
+16: REF 'fontFamilyGeneric',
+17: CHOICE
+18: VALUE 'roman',
+18: VALUE 'swiss',
+18: VALUE 'modern',
+18: VALUE 'decorative',
+18: VALUE 'script',
+18: VALUE 'system',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-pitch",
+16: REF 'fontPitch',
+17: CHOICE
+18: VALUE 'fixed',
+18: VALUE 'variable',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-charset",
+16: REF 'textEncoding',
+17: DATA 'string',
+15: EPSILON
+12: CHOICE
+13: REF 'svg-font-face-src',
+14: ELEMENT "svg:font-face-src",
+15: ONEOREMORE
+16: CHOICE
+17: REF 'svg-font-face-uri',
+18: ELEMENT "svg:font-face-uri",
+19: SEQUENCE
+20: REF 'common-svg-font-face-xlink-attlist',
+21: SEQUENCE
+22: ATTRIBUTE "xlink:href",
+23: REF 'anyURI',
+24: DATA 'anyURI',
+22: CHOICE
+23: ATTRIBUTE "xlink:type",
+24: VALUE 'simple',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "xlink:actuate",
+24: VALUE 'onRequest',
+23: EPSILON
+20: CHOICE
+21: ONEOREMORE
+22: REF 'svg-font-face-format',
+23: ELEMENT "svg:font-face-format",
+24: CHOICE
+25: ATTRIBUTE "svg:string",
+26: STRING
+25: EPSILON
+21: EPSILON
+17: REF 'svg-font-face-name',
+18: ELEMENT "svg:font-face-name",
+19: CHOICE
+20: ATTRIBUTE "name",
+21: STRING
+20: EPSILON
+13: EPSILON
+12: CHOICE
+13: REF 'svg-definition-src',
+14: ELEMENT "svg:definition-src",
+15: REF 'common-svg-font-face-xlink-attlist',
+16: SEQUENCE
+17: ATTRIBUTE "xlink:href",
+18: REF 'anyURI',
+19: DATA 'anyURI',
+17: CHOICE
+18: ATTRIBUTE "xlink:type",
+19: VALUE 'simple',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "xlink:actuate",
+19: VALUE 'onRequest',
+18: EPSILON
+13: EPSILON
+8: EPSILON
+6: EPSILON
+4: REF 'office-styles',
+5: CHOICE
+6: ELEMENT "office:styles",
+7: INTERLEAVE
+8: REF 'styles',
+9: INTERLEAVE
+10: CHOICE
+11: ONEOREMORE
+12: REF 'style-style',
+13: ELEMENT "style:style",
+14: SEQUENCE
+15: REF 'style-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:parent-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:next-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:list-style-name",
+19: CHOICE
+20: REF 'styleName',
+21: DATA 'NCName',
+20: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:master-page-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:auto-update",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:data-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:class",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:default-outline-level",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: EPSILON
+15: REF 'style-style-content',
+16: CHOICE
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'text',
+18: CHOICE
+19: REF 'style-text-properties',
+20: ELEMENT "style:text-properties",
+21: REF 'style-text-properties-content',
+22: REF 'style-text-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-text-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "fo:font-variant",
+28: REF 'fontVariant',
+29: CHOICE
+30: VALUE 'normal',
+30: VALUE 'small-caps',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-transform",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'lowercase',
+29: VALUE 'uppercase',
+29: VALUE 'capitalize',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:use-window-font-color",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-outline",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-type",
+28: REF 'lineType',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'single',
+30: VALUE 'double',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-style",
+28: REF 'lineStyle',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'solid',
+30: VALUE 'dotted',
+30: VALUE 'dash',
+30: VALUE 'long-dash',
+30: VALUE 'dot-dash',
+30: VALUE 'dot-dot-dash',
+30: VALUE 'wave',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-width",
+28: REF 'lineWidth',
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'normal',
+30: VALUE 'bold',
+30: VALUE 'thin',
+30: VALUE 'dash',
+30: VALUE 'medium',
+30: VALUE 'thick',
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+30: REF 'percent',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-color",
+28: CHOICE
+29: VALUE 'font-color',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-text",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-text-style",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-position",
+28: LIST
+29: SEQUENCE
+30: CHOICE
+31: REF 'percent',
+32: DATA 'string',
+31: VALUE 'super',
+31: VALUE 'sub',
+30: CHOICE
+31: REF 'percent',
+32: DATA 'string',
+31: EPSILON
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-name",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-name-asian",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-name-complex",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-family",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-asian",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-complex",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-family-generic",
+29: REF 'fontFamilyGeneric',
+30: CHOICE
+31: VALUE 'roman',
+31: VALUE 'swiss',
+31: VALUE 'modern',
+31: VALUE 'decorative',
+31: VALUE 'script',
+31: VALUE 'system',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-generic-asian",
+29: REF 'fontFamilyGeneric',
+30: CHOICE
+31: VALUE 'roman',
+31: VALUE 'swiss',
+31: VALUE 'modern',
+31: VALUE 'decorative',
+31: VALUE 'script',
+31: VALUE 'system',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-generic-complex",
+29: REF 'fontFamilyGeneric',
+30: CHOICE
+31: VALUE 'roman',
+31: VALUE 'swiss',
+31: VALUE 'modern',
+31: VALUE 'decorative',
+31: VALUE 'script',
+31: VALUE 'system',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-style-name",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-name-asian",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-name-complex",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-pitch",
+29: REF 'fontPitch',
+30: CHOICE
+31: VALUE 'fixed',
+31: VALUE 'variable',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-pitch-asian",
+29: REF 'fontPitch',
+30: CHOICE
+31: VALUE 'fixed',
+31: VALUE 'variable',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-pitch-complex",
+29: REF 'fontPitch',
+30: CHOICE
+31: VALUE 'fixed',
+31: VALUE 'variable',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:font-charset",
+28: REF 'textEncoding',
+29: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-size",
+29: CHOICE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-asian",
+29: CHOICE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-complex",
+29: CHOICE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-size-rel",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-rel-asian",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-rel-complex",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:script-type",
+28: CHOICE
+29: VALUE 'latin',
+29: VALUE 'asian',
+29: VALUE 'complex',
+29: VALUE 'ignore',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:letter-spacing",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: VALUE 'normal',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:language",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:language-asian",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:language-complex",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:country",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:country-asian",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:country-complex",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-style",
+29: REF 'fontStyle',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'italic',
+31: VALUE 'oblique',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-asian",
+29: REF 'fontStyle',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'italic',
+31: VALUE 'oblique',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-complex",
+29: REF 'fontStyle',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'italic',
+31: VALUE 'oblique',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:font-relief",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'embossed',
+29: VALUE 'engraved',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-shadow",
+28: REF 'shadowType',
+29: CHOICE
+30: VALUE 'none',
+30: REF 'string',
+31: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-type",
+28: REF 'lineType',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'single',
+30: VALUE 'double',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-style",
+28: REF 'lineStyle',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'solid',
+30: VALUE 'dotted',
+30: VALUE 'dash',
+30: VALUE 'long-dash',
+30: VALUE 'dot-dash',
+30: VALUE 'dot-dot-dash',
+30: VALUE 'wave',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-width",
+28: REF 'lineWidth',
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'normal',
+30: VALUE 'bold',
+30: VALUE 'thin',
+30: VALUE 'dash',
+30: VALUE 'medium',
+30: VALUE 'thick',
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+30: REF 'percent',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-color",
+28: CHOICE
+29: VALUE 'font-color',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-weight",
+29: REF 'fontWeight',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'bold',
+31: VALUE '100',
+31: VALUE '200',
+31: VALUE '300',
+31: VALUE '400',
+31: VALUE '500',
+31: VALUE '600',
+31: VALUE '700',
+31: VALUE '800',
+31: VALUE '900',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-weight-asian",
+29: REF 'fontWeight',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'bold',
+31: VALUE '100',
+31: VALUE '200',
+31: VALUE '300',
+31: VALUE '400',
+31: VALUE '500',
+31: VALUE '600',
+31: VALUE '700',
+31: VALUE '800',
+31: VALUE '900',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-weight-complex",
+29: REF 'fontWeight',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'bold',
+31: VALUE '100',
+31: VALUE '200',
+31: VALUE '300',
+31: VALUE '400',
+31: VALUE '500',
+31: VALUE '600',
+31: VALUE '700',
+31: VALUE '800',
+31: VALUE '900',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-mode",
+28: REF 'lineMode',
+29: CHOICE
+30: VALUE 'continuous',
+30: VALUE 'skip-white-space',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-mode",
+28: REF 'lineMode',
+29: CHOICE
+30: VALUE 'continuous',
+30: VALUE 'skip-white-space',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:letter-kerning",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-blinking",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-combine",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'letters',
+29: VALUE 'lines',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:text-combine-start-char",
+29: REF 'character',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:text-combine-end-char",
+29: REF 'character',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-emphasize",
+28: CHOICE
+29: VALUE 'none',
+29: LIST
+30: SEQUENCE
+31: CHOICE
+32: VALUE 'none',
+32: VALUE 'accent',
+32: VALUE 'dot',
+32: VALUE 'circle',
+32: VALUE 'disc',
+31: CHOICE
+32: VALUE 'above',
+32: VALUE 'below',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-scale",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-rotation-angle",
+28: REF 'integer',
+29: DATA 'integer',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-rotation-scale",
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'line-height',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenate",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-remain-char-count",
+28: REF 'positiveInteger',
+29: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-push-char-count",
+28: REF 'positiveInteger',
+29: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:display",
+28: VALUE 'true',
+27: ATTRIBUTE "text:display",
+28: VALUE 'none',
+27: SEQUENCE
+28: ATTRIBUTE "text:display",
+29: VALUE 'condition',
+28: ATTRIBUTE "text:condition",
+29: VALUE 'none',
+27: EPSILON
+24: REF 'style-text-properties-elements',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'paragraph',
+18: CHOICE
+19: REF 'style-paragraph-properties',
+20: ELEMENT "style:paragraph-properties",
+21: REF 'style-paragraph-properties-content',
+22: REF 'style-paragraph-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-paragraph-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "fo:line-height",
+28: CHOICE
+29: VALUE 'normal',
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-height-at-least",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-spacing",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:font-independent-line-spacing",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-text-align',
+27: CHOICE
+28: ATTRIBUTE "fo:text-align",
+29: CHOICE
+30: VALUE 'start',
+30: VALUE 'end',
+30: VALUE 'left',
+30: VALUE 'right',
+30: VALUE 'center',
+30: VALUE 'justify',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-align-last",
+28: CHOICE
+29: VALUE 'start',
+29: VALUE 'center',
+29: VALUE 'justify',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:justify-single-word",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:keep-together",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'always',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:widows",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:orphans",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:tab-stop-distance",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-keep",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'page',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-ladder-count",
+28: CHOICE
+29: VALUE 'no-limit',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:register-true",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-indent",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:auto-text-indent",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-vertical-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-top",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-bottom",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-margin-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:margin",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-border-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:border",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-top",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-bottom",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-left",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-right",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-border-line-width-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-top",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-bottom",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-left",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-right",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+26: REF 'common-padding-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:padding",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-top",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-bottom",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-left",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-right",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-keep-with-next-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:keep-with-next",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'always',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:number-lines",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:line-number",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-autospace",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'ideograph-alpha',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:punctuation-wrap",
+28: CHOICE
+29: VALUE 'simple',
+29: VALUE 'hanging',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-break",
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'strict',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:vertical-align",
+28: CHOICE
+29: VALUE 'top',
+29: VALUE 'middle',
+29: VALUE 'bottom',
+29: VALUE 'auto',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode-automatic",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:snap-to-layout-grid",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-page-number-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:page-number",
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:background-transparency",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+24: REF 'style-paragraph-properties-elements',
+25: INTERLEAVE
+26: REF 'style-tab-stops',
+27: CHOICE
+28: ELEMENT "style:tab-stops",
+29: CHOICE
+30: ONEOREMORE
+31: REF 'style-tab-stop',
+32: ELEMENT "style:tab-stop",
+33: REF 'style-tab-stop-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "style:position",
+36: REF 'nonNegativeLength',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "style:type",
+37: CHOICE
+38: VALUE 'left',
+38: VALUE 'center',
+38: VALUE 'right',
+36: EPSILON
+36: SEQUENCE
+37: ATTRIBUTE "style:type",
+38: VALUE 'char',
+37: REF 'style-tab-stop-char-attlist',
+38: ATTRIBUTE "style:char",
+39: REF 'character',
+40: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "style:leader-type",
+37: REF 'lineType',
+38: CHOICE
+39: VALUE 'none',
+39: VALUE 'single',
+39: VALUE 'double',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-style",
+37: REF 'lineStyle',
+38: CHOICE
+39: VALUE 'none',
+39: VALUE 'solid',
+39: VALUE 'dotted',
+39: VALUE 'dash',
+39: VALUE 'long-dash',
+39: VALUE 'dot-dash',
+39: VALUE 'dot-dot-dash',
+39: VALUE 'wave',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-width",
+37: REF 'lineWidth',
+38: CHOICE
+39: VALUE 'auto',
+39: VALUE 'normal',
+39: VALUE 'bold',
+39: VALUE 'thin',
+39: VALUE 'dash',
+39: VALUE 'medium',
+39: VALUE 'thick',
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+39: REF 'percent',
+40: DATA 'string',
+39: REF 'positiveLength',
+40: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-color",
+37: CHOICE
+38: VALUE 'font-color',
+38: REF 'color',
+39: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-text",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-text-style",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+30: EPSILON
+28: EPSILON
+26: REF 'style-drop-cap',
+27: CHOICE
+28: ELEMENT "style:drop-cap",
+29: REF 'style-drop-cap-attlist',
+30: INTERLEAVE
+31: CHOICE
+32: ATTRIBUTE "style:length",
+33: CHOICE
+34: VALUE 'word',
+34: REF 'positiveInteger',
+35: DATA 'positiveInteger',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:lines",
+33: REF 'positiveInteger',
+34: DATA 'positiveInteger',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:distance",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+28: EPSILON
+26: REF 'style-background-image',
+27: CHOICE
+28: ELEMENT "style:background-image",
+29: SEQUENCE
+30: REF 'style-background-image-attlist',
+31: INTERLEAVE
+32: CHOICE
+33: ATTRIBUTE "style:repeat",
+34: CHOICE
+35: VALUE 'no-repeat',
+35: VALUE 'repeat',
+35: VALUE 'stretch',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "style:position",
+34: CHOICE
+35: VALUE 'left',
+35: VALUE 'center',
+35: VALUE 'right',
+35: VALUE 'top',
+35: VALUE 'bottom',
+35: LIST
+36: SEQUENCE
+37: REF 'horiBackPos',
+38: CHOICE
+39: VALUE 'left',
+39: VALUE 'center',
+39: VALUE 'right',
+37: REF 'vertBackPos',
+38: CHOICE
+39: VALUE 'top',
+39: VALUE 'center',
+39: VALUE 'bottom',
+35: LIST
+36: SEQUENCE
+37: REF 'vertBackPos',
+38: CHOICE
+39: VALUE 'top',
+39: VALUE 'center',
+39: VALUE 'bottom',
+37: REF 'horiBackPos',
+38: CHOICE
+39: VALUE 'left',
+39: VALUE 'center',
+39: VALUE 'right',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "style:filter-name",
+34: REF 'string',
+35: DATA 'string',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "draw:opacity",
+34: REF 'percent',
+35: DATA 'string',
+33: EPSILON
+30: CHOICE
+31: REF 'common-draw-data-attlist',
+32: SEQUENCE
+33: ATTRIBUTE "xlink:href",
+34: REF 'anyURI',
+35: DATA 'anyURI',
+33: CHOICE
+34: ATTRIBUTE "xlink:type",
+35: VALUE 'simple',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "xlink:show",
+35: VALUE 'embed',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "xlink:actuate",
+35: VALUE 'onLoad',
+34: EPSILON
+31: REF 'office-binary-data',
+32: ELEMENT "office:binary-data",
+33: REF 'base64Binary',
+34: DATA 'base64Binary',
+31: EPSILON
+28: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'section',
+18: CHOICE
+19: REF 'style-section-properties',
+20: ELEMENT "style:section-properties",
+21: REF 'style-section-properties-content',
+22: REF 'style-section-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-section-properties-attlist',
+25: INTERLEAVE
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:protect",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:dont-balance-text-columns",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+24: REF 'style-section-properties-elements',
+25: INTERLEAVE
+26: REF 'style-background-image',
+27: CHOICE
+26: REF 'style-columns',
+27: CHOICE
+28: ELEMENT "style:columns",
+29: SEQUENCE
+30: REF 'style-columns-attlist',
+31: INTERLEAVE
+32: ATTRIBUTE "fo:column-count",
+33: REF 'positiveInteger',
+34: DATA 'positiveInteger',
+32: CHOICE
+33: ATTRIBUTE "fo:column-gap",
+34: REF 'length',
+35: DATA 'string',
+33: EPSILON
+30: CHOICE
+31: REF 'style-column-sep',
+32: ELEMENT "style:column-sep",
+33: REF 'style-column-sep-attlist',
+34: INTERLEAVE
+35: CHOICE
+36: ATTRIBUTE "style:style",
+37: CHOICE
+38: VALUE 'none',
+38: VALUE 'solid',
+38: VALUE 'dotted',
+38: VALUE 'dashed',
+38: VALUE 'dot-dashed',
+36: EPSILON
+35: ATTRIBUTE "style:width",
+36: REF 'length',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "style:height",
+37: REF 'percent',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:vertical-align",
+37: CHOICE
+38: VALUE 'top',
+38: VALUE 'middle',
+38: VALUE 'bottom',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:color",
+37: REF 'color',
+38: DATA 'string',
+36: EPSILON
+31: EPSILON
+30: CHOICE
+31: ONEOREMORE
+32: REF 'style-column',
+33: ELEMENT "style:column",
+34: REF 'style-column-attlist',
+35: INTERLEAVE
+36: ATTRIBUTE "style:rel-width",
+37: REF 'relativeLength',
+38: DATA 'string',
+36: CHOICE
+37: ATTRIBUTE "fo:start-indent",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "fo:end-indent",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "fo:space-before",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "fo:space-after",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+31: EPSILON
+28: EPSILON
+26: CHOICE
+27: ONEOREMORE
+28: REF 'text-notes-configuration',
+29: ELEMENT "text:notes-configuration",
+30: REF 'text-notes-configuration-content',
+31: INTERLEAVE
+32: REF 'text-note-class',
+33: ATTRIBUTE "text:note-class",
+34: CHOICE
+35: VALUE 'footnote',
+35: VALUE 'endnote',
+32: CHOICE
+33: ATTRIBUTE "text:citation-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:citation-body-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:default-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:master-page-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:start-value",
+34: REF 'nonNegativeInteger',
+35: DATA 'nonNegativeInteger',
+33: EPSILON
+32: SEQUENCE
+33: REF 'common-num-format-prefix-suffix-attlist',
+34: SEQUENCE
+35: CHOICE
+36: ATTRIBUTE "style:num-prefix",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:num-suffix",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: CHOICE
+34: REF 'common-num-format-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:num-format",
+37: CHOICE
+38: VALUE '1',
+38: VALUE 'i',
+38: VALUE 'I',
+38: REF 'string',
+39: DATA 'string',
+38: EPSILON
+36: SEQUENCE
+37: ATTRIBUTE "style:num-format",
+38: CHOICE
+39: VALUE 'a',
+39: VALUE 'A',
+37: REF 'style-num-letter-sync-attlist',
+38: CHOICE
+39: ATTRIBUTE "style:num-letter-sync",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+36: EPSILON
+34: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:start-numbering-at",
+34: CHOICE
+35: VALUE 'document',
+35: VALUE 'chapter',
+35: VALUE 'page',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:footnotes-position",
+34: CHOICE
+35: VALUE 'text',
+35: VALUE 'page',
+35: VALUE 'section',
+35: VALUE 'document',
+33: EPSILON
+32: CHOICE
+33: ELEMENT "text:note-continuation-notice-forward",
+34: STRING
+33: EPSILON
+32: CHOICE
+33: ELEMENT "text:note-continuation-notice-backward",
+34: STRING
+33: EPSILON
+27: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'ruby',
+18: CHOICE
+19: REF 'style-ruby-properties',
+20: ELEMENT "style:ruby-properties",
+21: REF 'style-ruby-properties-content',
+22: REF 'style-ruby-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-ruby-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "style:ruby-position",
+28: CHOICE
+29: VALUE 'above',
+29: VALUE 'below',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:ruby-align",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+29: VALUE 'distribute-letter',
+29: VALUE 'distribute-space',
+27: EPSILON
+24: REF 'style-ruby-properties-elements',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table',
+18: CHOICE
+19: REF 'style-table-properties',
+20: ELEMENT "style:table-properties",
+21: REF 'style-table-properties-content',
+22: REF 'style-table-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-properties-attlist',
+25: INTERLEAVE
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:width",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:rel-width",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:align",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+29: VALUE 'margins',
+27: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-vertical-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-top",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-bottom",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-margin-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:margin",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-page-number-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:page-number",
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+28: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-keep-with-next-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:keep-with-next",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'always',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:may-break-between-rows",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:border-model",
+28: CHOICE
+29: VALUE 'collapsing',
+29: VALUE 'separating',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:display",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+24: REF 'style-table-properties-elements',
+25: REF 'style-background-image',
+26: CHOICE
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-column',
+18: CHOICE
+19: REF 'style-table-column-properties',
+20: ELEMENT "style:table-column-properties",
+21: REF 'style-table-column-properties-content',
+22: REF 'style-table-column-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-column-properties-attlist',
+25: INTERLEAVE
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:column-width",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:rel-column-width",
+29: REF 'relativeLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:use-optimal-column-width",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+24: REF 'style-table-column-properties-elements',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-row',
+18: CHOICE
+19: REF 'style-table-row-properties',
+20: ELEMENT "style:table-row-properties",
+21: REF 'style-table-row-properties-content',
+22: REF 'style-table-row-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-row-properties-attlist',
+25: INTERLEAVE
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:row-height",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:min-row-height",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:use-optimal-row-height",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:keep-together",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'always',
+27: EPSILON
+24: REF 'style-table-row-properties-elements',
+25: REF 'style-background-image',
+26: CHOICE
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-cell',
+18: CHOICE
+19: REF 'style-table-cell-properties',
+20: ELEMENT "style:table-cell-properties",
+21: REF 'style-table-cell-properties-content',
+22: REF 'style-table-cell-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-cell-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "style:vertical-align",
+28: CHOICE
+29: VALUE 'top',
+29: VALUE 'middle',
+29: VALUE 'bottom',
+29: VALUE 'automatic',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-align-source",
+28: CHOICE
+29: VALUE 'fix',
+29: VALUE 'value-type',
+27: EPSILON
+26: REF 'common-style-direction-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:direction",
+29: CHOICE
+30: VALUE 'ltr',
+30: VALUE 'ttb',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:glyph-orientation-vertical",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE '0',
+27: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-border-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:border",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-top",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-bottom",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-left",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-right",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-tl-br",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-tl-br-widths",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-bl-tr",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-bl-tr-widths",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+26: REF 'common-border-line-width-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-top",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-bottom",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-left",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-right",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+26: REF 'common-padding-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:padding",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-top",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-bottom",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-left",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-right",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:wrap-option",
+28: CHOICE
+29: VALUE 'no-wrap',
+29: VALUE 'wrap',
+27: EPSILON
+26: REF 'common-rotation-angle-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:rotation-angle",
+29: REF 'nonNegativeInteger',
+30: DATA 'nonNegativeInteger',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:rotation-align",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'bottom',
+29: VALUE 'top',
+29: VALUE 'center',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:cell-protect",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'hidden-and-protected',
+29: LIST
+30: ONEOREMORE
+31: CHOICE
+32: VALUE 'protected',
+32: VALUE 'formula-hidden',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:print-content",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:decimal-places",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:repeat-content",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:shrink-to-fit",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+24: REF 'style-table-cell-properties-elements',
+25: REF 'style-background-image',
+26: CHOICE
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: CHOICE
+20: VALUE 'graphic',
+20: VALUE 'presentation',
+18: CHOICE
+19: REF 'style-graphic-properties',
+20: ELEMENT "style:graphic-properties",
+21: REF 'style-graphic-properties-content',
+22: REF 'style-graphic-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-graphic-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "draw:stroke",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'dash',
+29: VALUE 'solid',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:stroke-dash",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:stroke-dash-names",
+28: REF 'styleNameRefs',
+29: LIST
+30: CHOICE
+31: ONEOREMORE
+32: DATA 'NCName',
+31: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:stroke-width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:stroke-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-start",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-end",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-start-width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-end-width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-start-center",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-end-center",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:stroke-opacity",
+28: CHOICE
+29: DATA 'double',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:stroke-linejoin",
+28: CHOICE
+29: VALUE 'miter',
+29: VALUE 'round',
+29: VALUE 'bevel',
+29: VALUE 'middle',
+29: VALUE 'none',
+29: VALUE 'inherit',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:symbol-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'scroll',
+29: VALUE 'alternate',
+29: VALUE 'slide',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-direction",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'right',
+29: VALUE 'up',
+29: VALUE 'down',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-start-inside",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-stop-inside",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-repeat",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-delay",
+28: REF 'duration',
+29: DATA 'duration',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-steps",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:auto-grow-width",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:auto-grow-height",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fit-to-size",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fit-to-contour",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:textarea-vertical-align",
+28: CHOICE
+29: VALUE 'top',
+29: VALUE 'middle',
+29: VALUE 'bottom',
+29: VALUE 'justify',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:textarea-horizontal-align",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+29: VALUE 'justify',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:wrap-option",
+28: CHOICE
+29: VALUE 'no-wrap',
+29: VALUE 'wrap',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:color-mode",
+28: CHOICE
+29: VALUE 'greyscale',
+29: VALUE 'mono',
+29: VALUE 'watermark',
+29: VALUE 'standard',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:color-inversion",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:luminance",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:contrast",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:gamma",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:red",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:green",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:blue",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:image-opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:shadow",
+28: CHOICE
+29: VALUE 'visible',
+29: VALUE 'hidden',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:shadow-offset-x",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:shadow-offset-y",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:shadow-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:shadow-opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:start-line-spacing-horizontal",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:start-line-spacing-vertical",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:end-line-spacing-horizontal",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:end-line-spacing-vertical",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:line-distance",
+28: REF 'distance',
+29: REF 'length',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:guide-overhang",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:guide-distance",
+28: REF 'distance',
+29: REF 'length',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:start-guide",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:end-guide",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:placing",
+28: CHOICE
+29: VALUE 'below',
+29: VALUE 'above',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:parallel",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:measure-align",
+29: CHOICE
+30: VALUE 'automatic',
+30: VALUE 'left-outside',
+30: VALUE 'inside',
+30: VALUE 'right-outside',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:measure-vertical-align",
+29: CHOICE
+30: VALUE 'automatic',
+30: VALUE 'above',
+30: VALUE 'below',
+30: VALUE 'center',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:unit",
+28: CHOICE
+29: VALUE 'automatic',
+29: VALUE 'mm',
+29: VALUE 'cm',
+29: VALUE 'm',
+29: VALUE 'km',
+29: VALUE 'pt',
+29: VALUE 'pc',
+29: VALUE 'inch',
+29: VALUE 'ft',
+29: VALUE 'mi',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:show-unit",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:decimal-places",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-type",
+28: CHOICE
+29: VALUE 'straight-line',
+29: VALUE 'angled-line',
+29: VALUE 'angled-connector-line',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-angle-type",
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'free',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-angle",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-gap",
+28: REF 'distance',
+29: REF 'length',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-escape-direction",
+28: CHOICE
+29: VALUE 'horizontal',
+29: VALUE 'vertical',
+29: VALUE 'auto',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-escape",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-line-length",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-fit-line-length",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:horizontal-segments",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:vertical-segments",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:edge-rounding",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:edge-rounding-mode",
+28: CHOICE
+29: VALUE 'correct',
+29: VALUE 'attractive',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:back-scale",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:depth",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:backface-culling",
+28: CHOICE
+29: VALUE 'enabled',
+29: VALUE 'disabled',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:end-angle",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:close-front",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:close-back",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:lighting-mode",
+28: CHOICE
+29: VALUE 'standard',
+29: VALUE 'double-sided',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:normals-kind",
+28: CHOICE
+29: VALUE 'object',
+29: VALUE 'flat',
+29: VALUE 'sphere',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:normals-direction",
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'inverse',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "dr3d:texture-generation-mode-x",
+29: CHOICE
+30: VALUE 'object',
+30: VALUE 'parallel',
+30: VALUE 'sphere',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:texture-generation-mode-y",
+29: CHOICE
+30: VALUE 'object',
+30: VALUE 'parallel',
+30: VALUE 'sphere',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:texture-kind",
+28: CHOICE
+29: VALUE 'luminance',
+29: VALUE 'intesity',
+29: VALUE 'color',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:texture-filter",
+28: CHOICE
+29: VALUE 'enabled',
+29: VALUE 'disabled',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:texture-mode",
+28: CHOICE
+29: VALUE 'replace',
+29: VALUE 'modulate',
+29: VALUE 'blend',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "dr3d:ambient-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:emissive-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:specular-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:diffuse-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:shininess",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:shadow",
+28: CHOICE
+29: VALUE 'visible',
+29: VALUE 'hidden',
+27: EPSILON
+26: SEQUENCE
+27: REF 'common-draw-rel-size-attlist',
+28: SEQUENCE
+29: REF 'common-draw-size-attlist',
+30: SEQUENCE
+31: CHOICE
+32: ATTRIBUTE "svg:width",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "svg:height",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+29: CHOICE
+30: ATTRIBUTE "style:rel-width",
+31: CHOICE
+32: REF 'percent',
+33: DATA 'string',
+32: VALUE 'scale',
+32: VALUE 'scale-min',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "style:rel-height",
+31: CHOICE
+32: REF 'percent',
+33: DATA 'string',
+32: VALUE 'scale',
+32: VALUE 'scale-min',
+30: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:min-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:min-height",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:max-height",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:max-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-vertical-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-top",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-bottom",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-margin-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:margin",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:print-content",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:protect",
+28: CHOICE
+29: VALUE 'none',
+29: LIST
+30: ONEOREMORE
+31: CHOICE
+32: VALUE 'content',
+32: VALUE 'position',
+32: VALUE 'size',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:horizontal-pos",
+29: CHOICE
+30: VALUE 'left',
+30: VALUE 'center',
+30: VALUE 'right',
+30: VALUE 'from-left',
+30: VALUE 'inside',
+30: VALUE 'outside',
+30: VALUE 'from-inside',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "svg:x",
+29: REF 'coordinate',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:horizontal-rel",
+28: CHOICE
+29: VALUE 'page',
+29: VALUE 'page-content',
+29: VALUE 'page-start-margin',
+29: VALUE 'page-end-margin',
+29: VALUE 'frame',
+29: VALUE 'frame-content',
+29: VALUE 'frame-start-margin',
+29: VALUE 'frame-end-margin',
+29: VALUE 'paragraph',
+29: VALUE 'paragraph-content',
+29: VALUE 'paragraph-start-margin',
+29: VALUE 'paragraph-end-margin',
+29: VALUE 'char',
+27: EPSILON
+26: REF 'common-vertical-pos-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:vertical-pos",
+30: CHOICE
+31: VALUE 'top',
+31: VALUE 'middle',
+31: VALUE 'bottom',
+31: VALUE 'from-top',
+31: VALUE 'below',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "svg:y",
+30: REF 'coordinate',
+31: REF 'length',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-vertical-rel-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:vertical-rel",
+29: CHOICE
+30: VALUE 'page',
+30: VALUE 'page-content',
+30: VALUE 'frame',
+30: VALUE 'frame-content',
+30: VALUE 'paragraph',
+30: VALUE 'paragraph-content',
+30: VALUE 'char',
+30: VALUE 'line',
+30: VALUE 'baseline',
+30: VALUE 'text',
+28: EPSILON
+26: REF 'common-text-anchor-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "text:anchor-type",
+30: CHOICE
+31: VALUE 'page',
+31: VALUE 'frame',
+31: VALUE 'paragraph',
+31: VALUE 'char',
+31: VALUE 'as-char',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "text:anchor-page-number",
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+29: EPSILON
+26: REF 'common-border-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:border",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-top",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-bottom",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-left",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-right",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-border-line-width-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-top",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-bottom",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-left",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-right",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+26: REF 'common-padding-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:padding",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-top",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-bottom",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-left",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-right",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:editable",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'left',
+29: VALUE 'right',
+29: VALUE 'parallel',
+29: VALUE 'dynamic',
+29: VALUE 'run-through',
+29: VALUE 'biggest',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap-dynamic-treshold",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:number-wrapped-paragraphs",
+28: CHOICE
+29: VALUE 'no-limit',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap-contour",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap-contour-mode",
+28: CHOICE
+29: VALUE 'full',
+29: VALUE 'outside',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:run-through",
+28: CHOICE
+29: VALUE 'foreground',
+29: VALUE 'background',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:flow-with-text",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:overflow-behavior",
+28: CHOICE
+29: VALUE 'clip',
+29: VALUE 'auto-create-new-frame',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:mirror",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'vertical',
+29: REF 'horizontal-mirror',
+30: CHOICE
+31: VALUE 'horizontal',
+31: VALUE 'horizontal-on-odd',
+31: VALUE 'horizontal-on-even',
+29: LIST
+30: SEQUENCE
+31: VALUE 'vertical',
+31: REF 'horizontal-mirror',
+32: CHOICE
+33: VALUE 'horizontal',
+33: VALUE 'horizontal-on-odd',
+33: VALUE 'horizontal-on-even',
+29: LIST
+30: SEQUENCE
+31: REF 'horizontal-mirror',
+32: CHOICE
+33: VALUE 'horizontal',
+33: VALUE 'horizontal-on-odd',
+33: VALUE 'horizontal-on-even',
+31: VALUE 'vertical',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:clip",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:wrap-influence-on-position",
+28: CHOICE
+29: VALUE 'iterative',
+29: VALUE 'once-concurrent',
+29: VALUE 'once-successive',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:frame-display-scrollbar",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:frame-display-border",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:frame-margin-horizontal",
+29: REF 'nonNegativePixelLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:frame-margin-vertical",
+29: REF 'nonNegativePixelLength',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-left",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-top",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-width",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-height",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:ole-draw-aspect",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+24: REF 'style-graphic-fill-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "draw:fill",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'bitmap',
+29: VALUE 'gradient',
+29: VALUE 'hatch',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:secondary-fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-gradient-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:gradient-step-count",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-solid",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-image-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:repeat",
+28: CHOICE
+29: VALUE 'no-repeat',
+29: VALUE 'repeat',
+29: VALUE 'stretch',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-height",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-x",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-y",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point",
+29: CHOICE
+30: VALUE 'top-left',
+30: VALUE 'top',
+30: VALUE 'top-right',
+30: VALUE 'left',
+30: VALUE 'center',
+30: VALUE 'right',
+30: VALUE 'bottom-left',
+30: VALUE 'bottom',
+30: VALUE 'bottom-right',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:tile-repeat-offset",
+28: STRING
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:fill-rule",
+28: CHOICE
+29: VALUE 'nonzero',
+29: VALUE 'evenodd',
+27: EPSILON
+24: REF 'style-graphic-properties-elements',
+25: INTERLEAVE
+26: CHOICE
+27: REF 'text-list-style',
+28: ELEMENT "text:list-style",
+29: SEQUENCE
+30: REF 'text-list-style-attr',
+31: INTERLEAVE
+32: ATTRIBUTE "style:name",
+33: REF 'styleName',
+34: DATA 'NCName',
+32: CHOICE
+33: ATTRIBUTE "style:display-name",
+34: REF 'string',
+35: DATA 'string',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:consecutive-numbering",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+30: CHOICE
+31: ONEOREMORE
+32: REF 'text-list-style-content',
+33: CHOICE
+34: ELEMENT "text:list-level-style-number",
+35: SEQUENCE
+36: REF 'text-list-level-style-attr',
+37: ATTRIBUTE "text:level",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+36: REF 'text-list-level-style-number-attr',
+37: INTERLEAVE
+38: CHOICE
+39: ATTRIBUTE "text:style-name",
+40: REF 'styleNameRef',
+41: CHOICE
+42: DATA 'NCName',
+42: EPSILON
+39: EPSILON
+38: SEQUENCE
+39: REF 'common-num-format-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:num-format",
+42: CHOICE
+43: VALUE '1',
+43: VALUE 'i',
+43: VALUE 'I',
+43: REF 'string',
+44: DATA 'string',
+43: EPSILON
+41: SEQUENCE
+42: ATTRIBUTE "style:num-format",
+43: CHOICE
+44: VALUE 'a',
+44: VALUE 'A',
+42: REF 'style-num-letter-sync-attlist',
+43: CHOICE
+44: ATTRIBUTE "style:num-letter-sync",
+45: REF 'boolean',
+46: CHOICE
+47: VALUE 'true',
+47: VALUE 'false',
+44: EPSILON
+41: EPSILON
+39: REF 'common-num-format-prefix-suffix-attlist',
+40: SEQUENCE
+41: CHOICE
+42: ATTRIBUTE "style:num-prefix",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+41: CHOICE
+42: ATTRIBUTE "style:num-suffix",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:display-levels",
+40: REF 'positiveInteger',
+41: DATA 'positiveInteger',
+39: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:start-value",
+40: REF 'positiveInteger',
+41: DATA 'positiveInteger',
+39: EPSILON
+36: CHOICE
+37: REF 'style-list-level-properties',
+38: ELEMENT "style:list-level-properties",
+39: REF 'style-list-level-properties-content',
+40: REF 'style-list-level-properties-content-strict',
+41: SEQUENCE
+42: REF 'style-list-level-properties-attlist',
+43: INTERLEAVE
+44: REF 'common-text-align',
+45: CHOICE
+46: ATTRIBUTE "fo:text-align",
+47: CHOICE
+48: VALUE 'start',
+48: VALUE 'end',
+48: VALUE 'left',
+48: VALUE 'right',
+48: VALUE 'center',
+48: VALUE 'justify',
+46: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:space-before",
+46: REF 'nonNegativeLength',
+47: DATA 'string',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:min-label-width",
+46: REF 'nonNegativeLength',
+47: DATA 'string',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:min-label-distance",
+46: REF 'nonNegativeLength',
+47: DATA 'string',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "style:font-name",
+46: REF 'string',
+47: DATA 'string',
+45: EPSILON
+44: SEQUENCE
+45: CHOICE
+46: ATTRIBUTE "fo:width",
+47: REF 'positiveLength',
+48: DATA 'string',
+46: EPSILON
+45: CHOICE
+46: ATTRIBUTE "fo:height",
+47: REF 'positiveLength',
+48: DATA 'string',
+46: EPSILON
+44: SEQUENCE
+45: REF 'common-vertical-rel-attlist',
+46: CHOICE
+47: ATTRIBUTE "style:vertical-rel",
+48: CHOICE
+49: VALUE 'page',
+49: VALUE 'page-content',
+49: VALUE 'frame',
+49: VALUE 'frame-content',
+49: VALUE 'paragraph',
+49: VALUE 'paragraph-content',
+49: VALUE 'char',
+49: VALUE 'line',
+49: VALUE 'baseline',
+49: VALUE 'text',
+47: EPSILON
+45: REF 'common-vertical-pos-attlist',
+46: SEQUENCE
+47: CHOICE
+48: ATTRIBUTE "style:vertical-pos",
+49: CHOICE
+50: VALUE 'top',
+50: VALUE 'middle',
+50: VALUE 'bottom',
+50: VALUE 'from-top',
+50: VALUE 'below',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "svg:y",
+49: REF 'coordinate',
+50: REF 'length',
+51: DATA 'string',
+48: EPSILON
+42: REF 'style-list-level-properties-elements',
+43: EPSILON
+37: EPSILON
+36: CHOICE
+37: REF 'style-text-properties',
+37: EPSILON
+34: ELEMENT "text:list-level-style-bullet",
+35: SEQUENCE
+36: REF 'text-list-level-style-attr',
+37: ATTRIBUTE "text:level",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+36: REF 'text-list-level-style-bullet-attr',
+37: INTERLEAVE
+38: CHOICE
+39: ATTRIBUTE "text:style-name",
+40: REF 'styleNameRef',
+41: CHOICE
+42: DATA 'NCName',
+42: EPSILON
+39: EPSILON
+38: ATTRIBUTE "text:bullet-char",
+39: REF 'character',
+40: DATA 'string',
+38: REF 'common-num-format-prefix-suffix-attlist',
+39: SEQUENCE
+40: CHOICE
+41: ATTRIBUTE "style:num-prefix",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "style:num-suffix",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:bullet-relative-size",
+40: REF 'percent',
+41: DATA 'string',
+39: EPSILON
+36: CHOICE
+37: REF 'style-list-level-properties',
+37: EPSILON
+36: CHOICE
+37: REF 'style-text-properties',
+37: EPSILON
+34: ELEMENT "text:list-level-style-image",
+35: SEQUENCE
+36: REF 'text-list-level-style-attr',
+37: ATTRIBUTE "text:level",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+36: REF 'text-list-level-style-image-attr',
+37: CHOICE
+38: REF 'common-draw-data-attlist',
+39: SEQUENCE
+40: ATTRIBUTE "xlink:href",
+41: REF 'anyURI',
+42: DATA 'anyURI',
+40: CHOICE
+41: ATTRIBUTE "xlink:type",
+42: VALUE 'simple',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "xlink:show",
+42: VALUE 'embed',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "xlink:actuate",
+42: VALUE 'onLoad',
+41: EPSILON
+38: REF 'office-binary-data',
+36: CHOICE
+37: REF 'style-list-level-properties',
+37: EPSILON
+31: EPSILON
+27: EPSILON
+26: REF 'style-background-image',
+27: CHOICE
+26: REF 'style-columns',
+27: CHOICE
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'drawing-page',
+18: CHOICE
+19: REF 'style-drawing-page-properties',
+20: ELEMENT "style:drawing-page-properties",
+21: REF 'style-drawing-page-properties-content',
+22: REF 'style-drawing-page-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-graphic-fill-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "draw:fill",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'bitmap',
+29: VALUE 'gradient',
+29: VALUE 'hatch',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:secondary-fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-gradient-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:gradient-step-count",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-solid",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-image-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:repeat",
+28: CHOICE
+29: VALUE 'no-repeat',
+29: VALUE 'repeat',
+29: VALUE 'stretch',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-height",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-x",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-y",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point",
+29: CHOICE
+30: VALUE 'top-left',
+30: VALUE 'top',
+30: VALUE 'top-right',
+30: VALUE 'left',
+30: VALUE 'center',
+30: VALUE 'right',
+30: VALUE 'bottom-left',
+30: VALUE 'bottom',
+30: VALUE 'bottom-right',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:tile-repeat-offset",
+28: STRING
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:fill-rule",
+28: CHOICE
+29: VALUE 'nonzero',
+29: VALUE 'evenodd',
+27: EPSILON
+24: REF 'style-drawing-page-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "presentation:transition-type",
+28: CHOICE
+29: VALUE 'manual',
+29: VALUE 'automatic',
+29: VALUE 'semi-automatic',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:transition-style",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'fade-from-left',
+29: VALUE 'fade-from-top',
+29: VALUE 'fade-from-right',
+29: VALUE 'fade-from-bottom',
+29: VALUE 'fade-from-upperleft',
+29: VALUE 'fade-from-upperright',
+29: VALUE 'fade-from-lowerleft',
+29: VALUE 'fade-from-lowerright',
+29: VALUE 'move-from-left',
+29: VALUE 'move-from-top',
+29: VALUE 'move-from-right',
+29: VALUE 'move-from-bottom',
+29: VALUE 'move-from-upperleft',
+29: VALUE 'move-from-upperright',
+29: VALUE 'move-from-lowerleft',
+29: VALUE 'move-from-lowerright',
+29: VALUE 'uncover-to-left',
+29: VALUE 'uncover-to-top',
+29: VALUE 'uncover-to-right',
+29: VALUE 'uncover-to-bottom',
+29: VALUE 'uncover-to-upperleft',
+29: VALUE 'uncover-to-upperright',
+29: VALUE 'uncover-to-lowerleft',
+29: VALUE 'uncover-to-lowerright',
+29: VALUE 'fade-to-center',
+29: VALUE 'fade-from-center',
+29: VALUE 'vertical-stripes',
+29: VALUE 'horizontal-stripes',
+29: VALUE 'clockwise',
+29: VALUE 'counterclockwise',
+29: VALUE 'open-vertical',
+29: VALUE 'open-horizontal',
+29: VALUE 'close-vertical',
+29: VALUE 'close-horizontal',
+29: VALUE 'wavyline-from-left',
+29: VALUE 'wavyline-from-top',
+29: VALUE 'wavyline-from-right',
+29: VALUE 'wavyline-from-bottom',
+29: VALUE 'spiralin-left',
+29: VALUE 'spiralin-right',
+29: VALUE 'spiralout-left',
+29: VALUE 'spiralout-right',
+29: VALUE 'roll-from-top',
+29: VALUE 'roll-from-left',
+29: VALUE 'roll-from-right',
+29: VALUE 'roll-from-bottom',
+29: VALUE 'stretch-from-left',
+29: VALUE 'stretch-from-top',
+29: VALUE 'stretch-from-right',
+29: VALUE 'stretch-from-bottom',
+29: VALUE 'vertical-lines',
+29: VALUE 'horizontal-lines',
+29: VALUE 'dissolve',
+29: VALUE 'random',
+29: VALUE 'vertical-checkerboard',
+29: VALUE 'horizontal-checkerboard',
+29: VALUE 'interlocking-horizontal-left',
+29: VALUE 'interlocking-horizontal-right',
+29: VALUE 'interlocking-vertical-top',
+29: VALUE 'interlocking-vertical-bottom',
+29: VALUE 'fly-away',
+29: VALUE 'open',
+29: VALUE 'close',
+29: VALUE 'melt',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:transition-speed",
+28: REF 'presentationSpeeds',
+29: CHOICE
+30: VALUE 'slow',
+30: VALUE 'medium',
+30: VALUE 'fast',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:type",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:subtype",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:direction",
+28: CHOICE
+29: VALUE 'forward',
+29: VALUE 'reverse',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:fadeColor",
+28: CHOICE
+29: VALUE 'forward',
+29: VALUE 'reverse',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:duration",
+28: REF 'duration',
+29: DATA 'duration',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:visibility",
+28: CHOICE
+29: VALUE 'visible',
+29: VALUE 'hidden',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:background-size",
+28: CHOICE
+29: VALUE 'full',
+29: VALUE 'border',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:background-objects-visible",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:background-visible",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-header",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-footer",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-page-number",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-date-time",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+24: REF 'style-drawing-page-properties-elements',
+25: CHOICE
+26: REF 'presentation-sound',
+26: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'chart',
+18: CHOICE
+19: REF 'style-chart-properties',
+20: ELEMENT "style:chart-properties",
+21: REF 'style-chart-properties-content',
+22: REF 'style-properties-content',
+23: REF 'anyAttListOrElements',
+24: SEQUENCE
+25: CHOICE
+26: ONEOREMORE
+27: ATTRIBUTE "*",
+28: STRING
+26: EPSILON
+25: REF 'anyElements',
+26: CHOICE
+27: ONEOREMORE
+27: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'style-graphic-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+18: ELEMENT "style:map",
+19: REF 'style-map-attlist',
+20: INTERLEAVE
+21: ATTRIBUTE "style:condition",
+22: REF 'string',
+23: DATA 'string',
+21: ATTRIBUTE "style:apply-style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:base-cell-address",
+23: REF 'cellAddress',
+24: DATA 'string',
+22: EPSILON
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'text-list-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-number-style',
+13: ELEMENT "number:number-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+17: ELEMENT "number:text",
+18: STRING
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'any-number',
+18: CHOICE
+19: REF 'number-number',
+20: ELEMENT "number:number",
+21: SEQUENCE
+22: REF 'number-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:decimal-replacement",
+26: STRING
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:display-factor",
+26: REF 'double',
+27: DATA 'double',
+25: EPSILON
+22: REF 'common-decimal-places-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'number-embedded-text',
+25: ELEMENT "number:embedded-text",
+26: SEQUENCE
+27: REF 'number-embedded-text-attlist',
+28: ATTRIBUTE "number:position",
+29: REF 'integer',
+30: DATA 'integer',
+27: STRING
+23: EPSILON
+19: REF 'number-scientific-number',
+20: ELEMENT "number:scientific-number",
+21: SEQUENCE
+22: REF 'number-scientific-number-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:min-exponent-digits",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-decimal-places-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+19: REF 'number-fraction',
+20: ELEMENT "number:fraction",
+21: SEQUENCE
+22: REF 'number-fraction-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-numerator-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:min-denominator-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:denominator-value",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-currency-style',
+13: ELEMENT "number:currency-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-auto-reorder-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:automatic-order",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'number-and-text',
+18: SEQUENCE
+19: REF 'number-number',
+19: CHOICE
+20: REF 'number-text',
+20: EPSILON
+17: CHOICE
+18: REF 'currency-symbol-and-text',
+19: SEQUENCE
+20: REF 'number-currency-symbol',
+21: ELEMENT "number:currency-symbol",
+22: SEQUENCE
+23: REF 'number-currency-symbol-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "number:language",
+27: REF 'languageCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "number:country",
+27: REF 'countryCode',
+28: DATA 'token',
+26: EPSILON
+23: STRING
+20: CHOICE
+21: REF 'number-text',
+21: EPSILON
+18: EPSILON
+16: SEQUENCE
+17: REF 'currency-symbol-and-text',
+18: SEQUENCE
+19: REF 'number-currency-symbol',
+19: CHOICE
+20: REF 'number-text',
+20: EPSILON
+17: CHOICE
+18: REF 'number-and-text',
+19: SEQUENCE
+20: REF 'number-number',
+20: CHOICE
+21: REF 'number-text',
+21: EPSILON
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-percentage-style',
+13: ELEMENT "number:percentage-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: REF 'number-and-text',
+17: SEQUENCE
+18: REF 'number-number',
+18: CHOICE
+19: REF 'number-text',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-date-style',
+13: ELEMENT "number:date-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-auto-reorder-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:automatic-order",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: REF 'common-format-source-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:format-source",
+18: CHOICE
+19: VALUE 'fixed',
+19: VALUE 'language',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: ONEOREMORE
+16: SEQUENCE
+17: REF 'any-date',
+18: CHOICE
+19: REF 'number-day',
+20: ELEMENT "number:day",
+21: SEQUENCE
+22: REF 'number-day-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-month',
+20: ELEMENT "number:month",
+21: SEQUENCE
+22: REF 'number-month-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:textual",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:possessive-form",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:style",
+26: CHOICE
+27: VALUE 'short',
+27: VALUE 'long',
+25: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-year',
+20: ELEMENT "number:year",
+21: SEQUENCE
+22: REF 'number-year-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-era',
+20: ELEMENT "number:era",
+21: SEQUENCE
+22: REF 'number-era-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-day-of-week',
+20: ELEMENT "number:day-of-week",
+21: SEQUENCE
+22: REF 'number-day-of-week-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-week-of-year',
+20: ELEMENT "number:week-of-year",
+21: REF 'common-calendar-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:calendar",
+24: CHOICE
+25: VALUE 'gregorian',
+25: VALUE 'gengou',
+25: VALUE 'ROC',
+25: VALUE 'hanja_yoil',
+25: VALUE 'hanja',
+25: VALUE 'hijri',
+25: VALUE 'jewish',
+25: VALUE 'buddhist',
+25: REF 'string',
+26: DATA 'string',
+23: EPSILON
+19: REF 'number-quarter',
+20: ELEMENT "number:quarter",
+21: SEQUENCE
+22: REF 'number-quarter-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-hours',
+20: ELEMENT "number:hours",
+21: REF 'number-hours-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:style",
+24: CHOICE
+25: VALUE 'short',
+25: VALUE 'long',
+23: EPSILON
+19: REF 'number-am-pm',
+20: ELEMENT "number:am-pm",
+21: EPSILON
+19: REF 'number-minutes',
+20: ELEMENT "number:minutes",
+21: REF 'number-minutes-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:style",
+24: CHOICE
+25: VALUE 'short',
+25: VALUE 'long',
+23: EPSILON
+19: REF 'number-seconds',
+20: ELEMENT "number:seconds",
+21: REF 'number-seconds-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-time-style',
+13: ELEMENT "number:time-style",
+14: SEQUENCE
+15: REF 'number-time-style-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:truncate-on-overflow",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-format-source-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:format-source",
+18: CHOICE
+19: VALUE 'fixed',
+19: VALUE 'language',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: ONEOREMORE
+16: SEQUENCE
+17: REF 'any-time',
+18: CHOICE
+19: REF 'number-hours',
+19: REF 'number-am-pm',
+19: REF 'number-minutes',
+19: REF 'number-seconds',
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-boolean-style',
+13: ELEMENT "number:boolean-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'number-boolean',
+18: ELEMENT "number:boolean",
+19: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-text-style',
+13: ELEMENT "number:text-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: SEQUENCE
+18: REF 'number-text-content',
+19: ELEMENT "number:text-content",
+20: EPSILON
+18: CHOICE
+19: REF 'number-text',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-default-style',
+11: ELEMENT "style:default-style",
+12: REF 'style-style-content',
+13: CHOICE
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'text',
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'paragraph',
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'section',
+15: CHOICE
+16: REF 'style-section-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'ruby',
+15: CHOICE
+16: REF 'style-ruby-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table',
+15: CHOICE
+16: REF 'style-table-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-column',
+15: CHOICE
+16: REF 'style-table-column-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-row',
+15: CHOICE
+16: REF 'style-table-row-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-cell',
+15: CHOICE
+16: REF 'style-table-cell-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: CHOICE
+17: VALUE 'graphic',
+17: VALUE 'presentation',
+15: CHOICE
+16: REF 'style-graphic-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'drawing-page',
+15: CHOICE
+16: REF 'style-drawing-page-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'chart',
+15: CHOICE
+16: REF 'style-chart-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-graphic-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'text-outline-style',
+10: ELEMENT "text:outline-style",
+11: ONEOREMORE
+12: REF 'text-outline-level-style',
+13: ELEMENT "text:outline-level-style",
+14: SEQUENCE
+15: REF 'text-outline-level-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "text:level",
+18: REF 'positiveInteger',
+19: DATA 'positiveInteger',
+17: CHOICE
+18: ATTRIBUTE "text:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: SEQUENCE
+18: REF 'common-num-format-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:num-format",
+21: CHOICE
+22: VALUE '1',
+22: VALUE 'i',
+22: VALUE 'I',
+22: REF 'string',
+23: DATA 'string',
+22: EPSILON
+20: SEQUENCE
+21: ATTRIBUTE "style:num-format",
+22: CHOICE
+23: VALUE 'a',
+23: VALUE 'A',
+21: REF 'style-num-letter-sync-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:num-letter-sync",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+20: EPSILON
+18: REF 'common-num-format-prefix-suffix-attlist',
+19: SEQUENCE
+20: CHOICE
+21: ATTRIBUTE "style:num-prefix",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:num-suffix",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+17: CHOICE
+18: ATTRIBUTE "text:display-levels",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "text:start-value",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: EPSILON
+15: CHOICE
+16: REF 'style-list-level-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'text-notes-configuration',
+9: EPSILON
+8: CHOICE
+9: REF 'text-bibliography-configuration',
+10: ELEMENT "text:bibliography-configuration",
+11: SEQUENCE
+12: REF 'text-bibliography-configuration-attlist',
+13: INTERLEAVE
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "text:prefix",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "text:suffix",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:numbered-entries",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "text:sort-by-position",
+17: REF 'boolean',
+18: CHOICE
+19: VALUE 'true',
+19: VALUE 'false',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "fo:language",
+17: REF 'languageCode',
+18: DATA 'token',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "fo:country",
+17: REF 'countryCode',
+18: DATA 'token',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "text:sort-algorithm",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+12: CHOICE
+13: ONEOREMORE
+14: REF 'text-sort-key',
+15: ELEMENT "text:sort-key",
+16: REF 'text-sort-key-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "text:key",
+19: CHOICE
+20: VALUE 'address',
+20: VALUE 'annote',
+20: VALUE 'author',
+20: VALUE 'bibliography-type',
+20: VALUE 'booktitle',
+20: VALUE 'chapter',
+20: VALUE 'custom1',
+20: VALUE 'custom2',
+20: VALUE 'custom3',
+20: VALUE 'custom4',
+20: VALUE 'custom5',
+20: VALUE 'edition',
+20: VALUE 'editor',
+20: VALUE 'howpublished',
+20: VALUE 'identifier',
+20: VALUE 'institution',
+20: VALUE 'isbn',
+20: VALUE 'issn',
+20: VALUE 'journal',
+20: VALUE 'month',
+20: VALUE 'note',
+20: VALUE 'number',
+20: VALUE 'organizations',
+20: VALUE 'pages',
+20: VALUE 'publisher',
+20: VALUE 'report-type',
+20: VALUE 'school',
+20: VALUE 'series',
+20: VALUE 'title',
+20: VALUE 'url',
+20: VALUE 'volume',
+20: VALUE 'year',
+18: CHOICE
+19: ATTRIBUTE "text:sort-ascending",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'text-linenumbering-configuration',
+10: ELEMENT "text:linenumbering-configuration",
+11: SEQUENCE
+12: REF 'text-linenumbering-configuration-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "text:number-lines",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: REF 'common-num-format-attlist',
+16: CHOICE
+17: ATTRIBUTE "style:num-format",
+18: CHOICE
+19: VALUE '1',
+19: VALUE 'i',
+19: VALUE 'I',
+19: REF 'string',
+20: DATA 'string',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:num-format",
+19: CHOICE
+20: VALUE 'a',
+20: VALUE 'A',
+18: REF 'style-num-letter-sync-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:num-letter-sync",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+17: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:style-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:increment",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:number-position",
+16: CHOICE
+17: VALUE 'left',
+17: VALUE 'rigth',
+17: VALUE 'inner',
+17: VALUE 'outer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:offset",
+16: REF 'nonNegativeLength',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:count-empty-lines",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:count-in-text-boxes",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:restart-on-page",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+12: CHOICE
+13: REF 'text-linenumbering-separator',
+14: ELEMENT "text:linenumbering-separator",
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "text:increment",
+18: REF 'nonNegativeInteger',
+19: DATA 'nonNegativeInteger',
+17: EPSILON
+16: STRING
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-gradient',
+11: ELEMENT "draw:gradient",
+12: SEQUENCE
+13: REF 'common-draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:name",
+17: REF 'styleName',
+18: DATA 'NCName',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "draw:style",
+16: REF 'gradient-style',
+17: CHOICE
+18: VALUE 'linear',
+18: VALUE 'axial',
+18: VALUE 'radial',
+18: VALUE 'ellipsoid',
+18: VALUE 'square',
+18: VALUE 'rectangular',
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:cx",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:cy",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:angle",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:border",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+13: REF 'draw-gradient-attlist',
+14: INTERLEAVE
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:start-color",
+18: REF 'color',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:end-color",
+18: REF 'color',
+19: DATA 'string',
+17: EPSILON
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:start-intensity",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:end-intensity",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'svg-linearGradient',
+11: ELEMENT "svg:linearGradient",
+12: SEQUENCE
+13: REF 'common-svg-gradient-attlist',
+14: INTERLEAVE
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "svg:gradientUnits",
+18: VALUE 'objectBoundingBox',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:gradientTransform",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:spreadMethod",
+18: CHOICE
+19: VALUE 'pad',
+19: VALUE 'reflect',
+19: VALUE 'repeat',
+17: EPSILON
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:x1",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:y1",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:x2",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:y2",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'svg-stop',
+16: ELEMENT "svg:stop",
+17: SEQUENCE
+18: ATTRIBUTE "svg:offset",
+19: CHOICE
+20: REF 'double',
+21: DATA 'double',
+20: REF 'percent',
+21: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "svg:stop-color",
+20: REF 'color',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "svg:stop-opacity",
+20: REF 'double',
+21: DATA 'double',
+19: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'svg-radialGradient',
+11: ELEMENT "svg:radialGradient",
+12: SEQUENCE
+13: REF 'common-svg-gradient-attlist',
+14: INTERLEAVE
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "svg:gradientUnits",
+18: VALUE 'objectBoundingBox',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:gradientTransform",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:spreadMethod",
+18: CHOICE
+19: VALUE 'pad',
+19: VALUE 'reflect',
+19: VALUE 'repeat',
+17: EPSILON
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:cx",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:cy",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:r",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:fx",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:fy",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'svg-stop',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-hatch',
+11: ELEMENT "draw:hatch",
+12: REF 'draw-hatch-attlist',
+13: INTERLEAVE
+14: ATTRIBUTE "draw:name",
+15: REF 'styleName',
+16: DATA 'NCName',
+14: CHOICE
+15: ATTRIBUTE "draw:display-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: ATTRIBUTE "draw:style",
+15: CHOICE
+16: VALUE 'single',
+16: VALUE 'double',
+16: VALUE 'triple',
+14: CHOICE
+15: ATTRIBUTE "draw:color",
+16: REF 'color',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:distance",
+16: REF 'length',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:rotation",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-fill-image',
+11: ELEMENT "draw:fill-image",
+12: SEQUENCE
+13: REF 'draw-fill-image-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "svg:width",
+18: REF 'length',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:height",
+18: REF 'length',
+19: DATA 'string',
+17: EPSILON
+13: ATTRIBUTE "xlink:href",
+14: REF 'anyURI',
+15: DATA 'anyURI',
+13: CHOICE
+14: ATTRIBUTE "xlink:type",
+15: VALUE 'simple',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "xlink:show",
+15: VALUE 'embed',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "xlink:actuate",
+15: VALUE 'onLoad',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-marker',
+11: ELEMENT "draw:marker",
+12: SEQUENCE
+13: REF 'draw-marker-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: REF 'common-draw-viewbox-attlist',
+14: ATTRIBUTE "svg:viewBox",
+15: LIST
+16: SEQUENCE
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+13: REF 'common-draw-path-data-attlist',
+14: ATTRIBUTE "svg:d",
+15: REF 'pathData',
+16: DATA 'string',
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-stroke-dash',
+11: ELEMENT "draw:stroke-dash",
+12: REF 'draw-stroke-dash-attlist',
+13: INTERLEAVE
+14: ATTRIBUTE "draw:name",
+15: REF 'styleName',
+16: DATA 'NCName',
+14: CHOICE
+15: ATTRIBUTE "draw:display-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:style",
+16: CHOICE
+17: VALUE 'rect',
+17: VALUE 'round',
+15: EPSILON
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "draw:dots1",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:dots1-length",
+17: REF 'length',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:dots2",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:dots2-length",
+17: REF 'length',
+18: DATA 'string',
+16: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:distance",
+16: REF 'length',
+17: DATA 'string',
+15: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-opacity',
+11: ELEMENT "draw:opacity",
+12: SEQUENCE
+13: REF 'common-draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:name",
+17: REF 'styleName',
+18: DATA 'NCName',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "draw:style",
+16: REF 'gradient-style',
+17: CHOICE
+18: VALUE 'linear',
+18: VALUE 'axial',
+18: VALUE 'radial',
+18: VALUE 'ellipsoid',
+18: VALUE 'square',
+18: VALUE 'rectangular',
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:cx",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:cy",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:angle",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:border",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+13: REF 'draw-opacity-attlist',
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "draw:start",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:end",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-presentation-page-layout',
+11: ELEMENT "style:presentation-page-layout",
+12: SEQUENCE
+13: ATTRIBUTE "style:name",
+14: REF 'styleName',
+15: DATA 'NCName',
+13: CHOICE
+14: ATTRIBUTE "style:display-name",
+15: REF 'string',
+16: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'presentation-placeholder',
+16: ELEMENT "presentation:placeholder",
+17: SEQUENCE
+18: ATTRIBUTE "presentation:object",
+19: REF 'presentation-classes',
+20: CHOICE
+21: VALUE 'title',
+21: VALUE 'outline',
+21: VALUE 'subtitle',
+21: VALUE 'text',
+21: VALUE 'graphic',
+21: VALUE 'object',
+21: VALUE 'chart',
+21: VALUE 'table',
+21: VALUE 'orgchart',
+21: VALUE 'page',
+21: VALUE 'notes',
+21: VALUE 'handout',
+21: VALUE 'header',
+21: VALUE 'footer',
+21: VALUE 'date-time',
+21: VALUE 'page-number',
+18: ATTRIBUTE "svg:x",
+19: CHOICE
+20: REF 'coordinate',
+21: REF 'length',
+22: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:y",
+19: CHOICE
+20: REF 'coordinate',
+21: REF 'length',
+22: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:width",
+19: CHOICE
+20: REF 'length',
+21: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:height",
+19: CHOICE
+20: REF 'length',
+21: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+14: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-automatic-styles',
+5: CHOICE
+6: ELEMENT "office:automatic-styles",
+7: INTERLEAVE
+8: REF 'styles',
+9: INTERLEAVE
+10: CHOICE
+11: ONEOREMORE
+12: REF 'style-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'text-list-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-number-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-currency-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-percentage-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-date-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-time-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-boolean-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-text-style',
+11: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-page-layout',
+11: ELEMENT "style:page-layout",
+12: SEQUENCE
+13: REF 'style-page-layout-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "style:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "style:page-usage",
+17: CHOICE
+18: VALUE 'all',
+18: VALUE 'left',
+18: VALUE 'right',
+18: VALUE 'mirrored',
+16: EPSILON
+13: CHOICE
+14: REF 'style-page-layout-properties',
+15: ELEMENT "style:page-layout-properties",
+16: REF 'style-page-layout-properties-content',
+17: REF 'style-page-layout-properties-content-strict',
+18: SEQUENCE
+19: REF 'style-page-layout-properties-attlist',
+20: INTERLEAVE
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "fo:page-width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:page-height",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'common-num-format-attlist',
+24: CHOICE
+25: ATTRIBUTE "style:num-format",
+26: CHOICE
+27: VALUE '1',
+27: VALUE 'i',
+27: VALUE 'I',
+27: REF 'string',
+28: DATA 'string',
+27: EPSILON
+25: SEQUENCE
+26: ATTRIBUTE "style:num-format",
+27: CHOICE
+28: VALUE 'a',
+28: VALUE 'A',
+26: REF 'style-num-letter-sync-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:num-letter-sync",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: EPSILON
+23: EPSILON
+22: REF 'common-num-format-prefix-suffix-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "style:num-prefix",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "style:num-suffix",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:paper-tray-name",
+23: CHOICE
+24: VALUE 'default',
+24: REF 'string',
+25: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:print-orientation",
+23: CHOICE
+24: VALUE 'portrait',
+24: VALUE 'landscape',
+22: EPSILON
+21: SEQUENCE
+22: REF 'common-horizontal-margin-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "fo:margin-left",
+26: CHOICE
+27: REF 'length',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "fo:margin-right",
+26: CHOICE
+27: REF 'length',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+22: REF 'common-vertical-margin-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "fo:margin-top",
+26: CHOICE
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "fo:margin-bottom",
+26: CHOICE
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+22: REF 'common-margin-attlist',
+23: CHOICE
+24: ATTRIBUTE "fo:margin",
+25: CHOICE
+26: REF 'nonNegativeLength',
+27: DATA 'string',
+26: REF 'percent',
+27: DATA 'string',
+24: EPSILON
+21: REF 'common-border-attlist',
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "fo:border",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-top",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-bottom",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-left",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-right",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-border-line-width-attlist',
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-top",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-bottom",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-left",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-right",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+21: REF 'common-padding-attlist',
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "fo:padding",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-top",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-bottom",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-left",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-right",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-shadow-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:shadow",
+24: REF 'shadowType',
+25: CHOICE
+26: VALUE 'none',
+26: REF 'string',
+27: DATA 'string',
+23: EPSILON
+21: REF 'common-background-color-attlist',
+22: CHOICE
+23: ATTRIBUTE "fo:background-color",
+24: CHOICE
+25: VALUE 'transparent',
+25: REF 'color',
+26: DATA 'string',
+23: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:register-truth-ref-style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:print",
+23: LIST
+24: CHOICE
+25: ONEOREMORE
+26: CHOICE
+27: VALUE 'headers',
+27: VALUE 'grid',
+27: VALUE 'annotations',
+27: VALUE 'objects',
+27: VALUE 'charts',
+27: VALUE 'drawings',
+27: VALUE 'formulas',
+27: VALUE 'zero-values',
+25: EPSILON
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:print-page-order",
+23: CHOICE
+24: VALUE 'ttb',
+24: VALUE 'ltr',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:first-page-number",
+23: CHOICE
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+24: VALUE 'continue',
+22: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "style:scale-to",
+24: REF 'percent',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:scale-to-pages",
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+23: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:table-centering",
+23: CHOICE
+24: VALUE 'horizontal',
+24: VALUE 'vertical',
+24: VALUE 'both',
+24: VALUE 'none',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:footnote-max-height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: REF 'common-writing-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:writing-mode",
+24: CHOICE
+25: VALUE 'lr-tb',
+25: VALUE 'rl-tb',
+25: VALUE 'tb-rl',
+25: VALUE 'tb-lr',
+25: VALUE 'lr',
+25: VALUE 'rl',
+25: VALUE 'tb',
+25: VALUE 'page',
+23: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-mode",
+23: CHOICE
+24: VALUE 'none',
+24: VALUE 'line',
+24: VALUE 'both',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-base-height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-ruby-height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-lines",
+23: REF 'positiveInteger',
+24: DATA 'positiveInteger',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-color",
+23: REF 'color',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-ruby-below",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-print",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-display",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+19: REF 'style-page-layout-properties-elements',
+20: INTERLEAVE
+21: REF 'style-background-image',
+22: CHOICE
+21: REF 'style-columns',
+22: CHOICE
+21: REF 'style-footnote-sep',
+22: CHOICE
+23: ELEMENT "style:footnote-sep",
+24: REF 'style-footnote-sep-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "style:width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:rel-width",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-style",
+28: REF 'lineStyle',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'solid',
+30: VALUE 'dotted',
+30: VALUE 'dash',
+30: VALUE 'long-dash',
+30: VALUE 'dot-dash',
+30: VALUE 'dot-dot-dash',
+30: VALUE 'wave',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:adjustment",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:distance-before-sep",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:distance-after-sep",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+23: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'style-header-style',
+15: ELEMENT "style:header-style",
+16: CHOICE
+17: REF 'style-header-footer-properties',
+18: ELEMENT "style:header-footer-properties",
+19: REF 'style-header-footer-properties-content',
+20: REF 'style-header-footer-properties-content-strict',
+21: SEQUENCE
+22: REF 'style-header-footer-properties-attlist',
+23: INTERLEAVE
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "svg:height",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:min-height",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+24: SEQUENCE
+25: REF 'common-horizontal-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-left",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-right",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-vertical-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-top",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-bottom",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-margin-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:margin",
+28: CHOICE
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+24: REF 'common-border-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "fo:border",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-top",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-bottom",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-left",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-right",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+24: REF 'common-border-line-width-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-top",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-bottom",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-left",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-right",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+24: REF 'common-padding-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "fo:padding",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-top",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-bottom",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-left",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-right",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+24: REF 'common-background-color-attlist',
+25: CHOICE
+26: ATTRIBUTE "fo:background-color",
+27: CHOICE
+28: VALUE 'transparent',
+28: REF 'color',
+29: DATA 'string',
+26: EPSILON
+24: REF 'common-shadow-attlist',
+25: CHOICE
+26: ATTRIBUTE "style:shadow",
+27: REF 'shadowType',
+28: CHOICE
+29: VALUE 'none',
+29: REF 'string',
+30: DATA 'string',
+26: EPSILON
+22: REF 'style-header-footer-properties-elements',
+23: REF 'style-background-image',
+24: CHOICE
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'style-footer-style',
+15: ELEMENT "style:footer-style",
+16: CHOICE
+17: REF 'style-header-footer-properties',
+17: EPSILON
+14: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-master-styles',
+5: CHOICE
+6: ELEMENT "office:master-styles",
+7: INTERLEAVE
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-master-page',
+11: ELEMENT "style:master-page",
+12: SEQUENCE
+13: REF 'style-master-page-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "style:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "style:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "style:page-layout-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:style-name",
+17: REF 'styleNameRef',
+18: CHOICE
+19: DATA 'NCName',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "style:next-style-name",
+17: REF 'styleNameRef',
+18: CHOICE
+19: DATA 'NCName',
+19: EPSILON
+16: EPSILON
+13: CHOICE
+14: SEQUENCE
+15: REF 'style-header',
+16: ELEMENT "style:header",
+17: SEQUENCE
+18: REF 'common-style-header-footer-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:display",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+18: REF 'header-footer-content',
+19: CHOICE
+20: SEQUENCE
+21: REF 'text-decls',
+22: SEQUENCE
+23: CHOICE
+24: ELEMENT "text:variable-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-variable-decl',
+28: ELEMENT "text:variable-decl",
+29: SEQUENCE
+30: REF 'common-field-name-attlist',
+31: ATTRIBUTE "text:name",
+32: REF 'variableName',
+33: DATA 'string',
+30: REF 'common-value-type-attlist',
+31: ATTRIBUTE "office:value-type",
+32: REF 'valueType',
+33: CHOICE
+34: VALUE 'float',
+34: VALUE 'time',
+34: VALUE 'date',
+34: VALUE 'percentage',
+34: VALUE 'currency',
+34: VALUE 'boolean',
+34: VALUE 'string',
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:sequence-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-sequence-decl',
+28: ELEMENT "text:sequence-decl",
+29: REF 'text-sequence-decl-attlist',
+30: INTERLEAVE
+31: REF 'common-field-name-attlist',
+32: ATTRIBUTE "text:name",
+33: REF 'variableName',
+34: DATA 'string',
+31: ATTRIBUTE "text:display-outline-level",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+31: CHOICE
+32: ATTRIBUTE "text:separation-character",
+33: REF 'character',
+34: DATA 'string',
+32: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:user-field-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-user-field-decl',
+28: ELEMENT "text:user-field-decl",
+29: SEQUENCE
+30: REF 'common-field-name-attlist',
+31: ATTRIBUTE "text:name",
+32: REF 'variableName',
+33: DATA 'string',
+30: CHOICE
+31: REF 'common-field-formula-attlist',
+32: CHOICE
+33: ATTRIBUTE "text:formula",
+34: REF 'formula',
+35: DATA 'string',
+33: EPSILON
+31: EPSILON
+30: REF 'common-value-and-type-attlist',
+31: CHOICE
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'float',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'percentage',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'currency',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+33: CHOICE
+34: ATTRIBUTE "office:currency",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'date',
+33: ATTRIBUTE "office:date-value",
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'time',
+33: ATTRIBUTE "office:time-value",
+34: REF 'duration',
+35: DATA 'duration',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'boolean',
+33: ATTRIBUTE "office:boolean-value",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'string',
+33: CHOICE
+34: ATTRIBUTE "office:string-value",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:dde-connection-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-dde-connection-decl',
+28: ELEMENT "text:dde-connection-decl",
+29: SEQUENCE
+30: REF 'text-dde-connection-decl-attlist',
+31: ATTRIBUTE "office:name",
+32: REF 'string',
+33: DATA 'string',
+30: REF 'common-dde-connection-decl-attlist',
+31: INTERLEAVE
+32: ATTRIBUTE "office:dde-application",
+33: REF 'string',
+34: DATA 'string',
+32: ATTRIBUTE "office:dde-topic",
+33: REF 'string',
+34: DATA 'string',
+32: ATTRIBUTE "office:dde-item",
+33: REF 'string',
+34: DATA 'string',
+32: CHOICE
+33: ATTRIBUTE "office:automatic-update",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: REF 'text-alphabetical-index-auto-mark-file',
+25: ELEMENT "text:alphabetical-index-auto-mark-file",
+26: SEQUENCE
+27: ATTRIBUTE "xlink:href",
+28: REF 'anyURI',
+29: DATA 'anyURI',
+27: CHOICE
+28: ATTRIBUTE "xlink:type",
+29: VALUE 'simple',
+28: EPSILON
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'text-h',
+25: ELEMENT "text:h",
+26: SEQUENCE
+27: REF 'heading-attrs',
+28: INTERLEAVE
+29: ATTRIBUTE "text:outline-level",
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+29: CHOICE
+30: ATTRIBUTE "text:restart-numbering",
+31: REF 'boolean',
+32: CHOICE
+33: VALUE 'true',
+33: VALUE 'false',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "text:start-value",
+31: REF 'nonNegativeInteger',
+32: DATA 'nonNegativeInteger',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "text:is-list-header",
+31: REF 'boolean',
+32: CHOICE
+33: VALUE 'true',
+33: VALUE 'false',
+30: EPSILON
+27: REF 'paragraph-attrs',
+28: INTERLEAVE
+29: SEQUENCE
+30: CHOICE
+31: ATTRIBUTE "text:style-name",
+32: REF 'styleNameRef',
+33: CHOICE
+34: DATA 'NCName',
+34: EPSILON
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "text:class-names",
+32: REF 'styleNameRefs',
+33: LIST
+34: CHOICE
+35: ONEOREMORE
+36: DATA 'NCName',
+35: EPSILON
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "text:cond-style-name",
+32: REF 'styleNameRef',
+33: CHOICE
+34: DATA 'NCName',
+34: EPSILON
+31: EPSILON
+29: CHOICE
+30: REF 'text-id',
+31: ATTRIBUTE "text:id",
+32: REF 'string',
+33: DATA 'string',
+30: EPSILON
+27: CHOICE
+28: REF 'text-number',
+29: ELEMENT "text:number",
+30: REF 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ONEOREMORE
+29: REF 'paragraph-content',
+30: CHOICE
+31: STRING
+31: ELEMENT "text:s",
+32: CHOICE
+33: ATTRIBUTE "text:c",
+34: REF 'nonNegativeInteger',
+35: DATA 'nonNegativeInteger',
+33: EPSILON
+31: ELEMENT "text:tab",
+32: REF 'text-tab-attr',
+33: CHOICE
+34: ATTRIBUTE "text:tab-ref",
+35: REF 'nonNegativeInteger',
+36: DATA 'nonNegativeInteger',
+34: EPSILON
+31: ELEMENT "text:line-break",
+32: EPSILON
+31: ELEMENT "text:span",
+32: SEQUENCE
+33: CHOICE
+34: ATTRIBUTE "text:style-name",
+35: REF 'styleNameRef',
+36: CHOICE
+37: DATA 'NCName',
+37: EPSILON
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "text:class-names",
+35: REF 'styleNameRefs',
+36: LIST
+37: CHOICE
+38: ONEOREMORE
+39: DATA 'NCName',
+38: EPSILON
+34: EPSILON
+33: CHOICE
+34: ONEOREMORE
+35: REF 'paragraph-content',
+36: CHOICE
+37: STRING
+34: EPSILON
+31: ELEMENT "text:a",
+32: SEQUENCE
+33: REF 'text-a-attlist',
+34: INTERLEAVE
+35: CHOICE
+36: ATTRIBUTE "office:name",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+35: SEQUENCE
+36: ATTRIBUTE "xlink:href",
+37: REF 'anyURI',
+38: DATA 'anyURI',
+36: CHOICE
+37: ATTRIBUTE "xlink:type",
+38: VALUE 'simple',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "xlink:actuate",
+38: VALUE 'onRequest',
+37: EPSILON
+35: SEQUENCE
+36: CHOICE
+37: ATTRIBUTE "office:target-frame-name",
+38: REF 'targetFrameName',
+39: CHOICE
+40: VALUE '_self',
+40: VALUE '_blank',
+40: VALUE '_parent',
+40: VALUE '_top',
+40: REF 'string',
+41: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "xlink:show",
+38: CHOICE
+39: VALUE 'new',
+39: VALUE 'replace',
+37: EPSILON
+35: SEQUENCE
+36: CHOICE
+37: ATTRIBUTE "text:style-name",
+38: REF 'styleNameRef',
+39: CHOICE
+40: DATA 'NCName',
+40: EPSILON
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:visited-style-name",
+38: REF 'styleNameRef',
+39: CHOICE
+40: DATA 'NCName',
+40: EPSILON
+37: EPSILON
+33: CHOICE
+34: REF 'office-event-listeners',
+34: EPSILON
+33: CHOICE
+34: ONEOREMORE
+35: REF 'paragraph-content',
+36: CHOICE
+37: STRING
+34: EPSILON
+31: ELEMENT "text:bookmark",
+32: ATTRIBUTE "text:name",
+33: REF 'string',
+34: DATA 'string',
+31: ELEMENT "text:bookmark-start",
+32: ATTRIBUTE "text:name",
+33: REF 'string',
+34: DATA 'string',
+31: ELEMENT "text:bookmark-end",
+32: ATTRIBUTE "text:name",
+33: REF 'string',
+34: DATA 'string',
+31: ELEMENT "text:reference-mark",
+32: ATTRIBUTE "text:name",
+33: REF 'string',
+34: DATA 'string',
+31: ELEMENT "text:reference-mark-start",
+32: ATTRIBUTE "text:name",
+33: REF 'string',
+34: DATA 'string',
+31: ELEMENT "text:reference-mark-end",
+32: ATTRIBUTE "text:name",
+33: REF 'string',
+34: DATA 'string',
+31: ELEMENT "text:note",
+32: SEQUENCE
+33: REF 'text-note-class',
+34: ATTRIBUTE "text:note-class",
+35: CHOICE
+36: VALUE 'footnote',
+36: VALUE 'endnote',
+33: CHOICE
+34: ATTRIBUTE "text:id",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+33: ELEMENT "text:note-citation",
+34: SEQUENCE
+35: CHOICE
+36: ATTRIBUTE "text:label",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+35: STRING
+33: ELEMENT "text:note-body",
+34: CHOICE
+35: ONEOREMORE
+36: REF 'text-content',
+37: CHOICE
+38: REF 'text-h',
+38: REF 'text-p',
+39: ELEMENT "text:p",
+40: SEQUENCE
+41: REF 'paragraph-attrs',
+42: INTERLEAVE
+43: SEQUENCE
+44: CHOICE
+45: ATTRIBUTE "text:style-name",
+46: REF 'styleNameRef',
+47: CHOICE
+48: DATA 'NCName',
+48: EPSILON
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:class-names",
+46: REF 'styleNameRefs',
+47: LIST
+48: CHOICE
+49: ONEOREMORE
+50: DATA 'NCName',
+49: EPSILON
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:cond-style-name",
+46: REF 'styleNameRef',
+47: CHOICE
+48: DATA 'NCName',
+48: EPSILON
+45: EPSILON
+43: CHOICE
+44: REF 'text-id',
+45: ATTRIBUTE "text:id",
+46: REF 'string',
+47: DATA 'string',
+44: EPSILON
+41: CHOICE
+42: ONEOREMORE
+43: REF 'paragraph-content',
+44: CHOICE
+45: STRING
+42: EPSILON
+38: REF 'text-list',
+39: ELEMENT "text:list",
+40: SEQUENCE
+41: REF 'text-list-attr',
+42: INTERLEAVE
+43: CHOICE
+44: ATTRIBUTE "text:style-name",
+45: REF 'styleNameRef',
+46: CHOICE
+47: DATA 'NCName',
+47: EPSILON
+44: EPSILON
+43: CHOICE
+44: ATTRIBUTE "text:continue-numbering",
+45: REF 'boolean',
+46: CHOICE
+47: VALUE 'true',
+47: VALUE 'false',
+44: EPSILON
+41: CHOICE
+42: REF 'text-list-header',
+43: ELEMENT "text:list-header",
+44: REF 'text-list-item-content',
+45: SEQUENCE
+46: CHOICE
+47: REF 'text-number',
+47: EPSILON
+46: CHOICE
+47: ONEOREMORE
+48: CHOICE
+49: REF 'text-p',
+49: REF 'text-h',
+49: REF 'text-list',
+47: EPSILON
+42: EPSILON
+41: CHOICE
+42: ONEOREMORE
+43: REF 'text-list-item',
+44: ELEMENT "text:list-item",
+45: SEQUENCE
+46: REF 'text-list-item-attr',
+47: CHOICE
+48: ATTRIBUTE "text:start-value",
+49: REF 'nonNegativeInteger',
+50: DATA 'nonNegativeInteger',
+48: EPSILON
+46: REF 'text-list-item-content',
+47: SEQUENCE
+48: CHOICE
+49: REF 'text-number',
+49: EPSILON
+48: CHOICE
+49: ONEOREMORE
+50: CHOICE
+51: REF 'text-p',
+51: REF 'text-h',
+51: REF 'text-list',
+49: EPSILON
+42: EPSILON
+38: REF 'text-numbered-paragraph',
+39: ELEMENT "text:numbered-paragraph",
+40: SEQUENCE
+41: REF 'text-numbered-paragraph-attr',
+42: INTERLEAVE
+43: CHOICE
+44: ATTRIBUTE "text:level",
+45: REF 'positiveInteger',
+46: DATA 'positiveInteger',
+44: EPSILON
+43: REF 'text-list-attr',
+44: INTERLEAVE
+45: CHOICE
+46: ATTRIBUTE "text:style-name",
+47: REF 'styleNameRef',
+48: CHOICE
+49: DATA 'NCName',
+49: EPSILON
+46: EPSILON
+45: CHOICE
+46: ATTRIBUTE "text:continue-numbering",
+47: REF 'boolean',
+48: CHOICE
+49: VALUE 'true',
+49: VALUE 'false',
+46: EPSILON
+43: REF 'text-list-item-attr',
+44: CHOICE
+45: ATTRIBUTE "text:start-value",
+46: REF 'nonNegativeInteger',
+47: DATA 'nonNegativeInteger',
+45: EPSILON
+41: CHOICE
+42: REF 'text-number',
+42: EPSILON
+41: CHOICE
+42: REF 'text-p',
+42: REF 'text-h',
+38: REF 'table-table',
+39: ELEMENT "table:table",
+40: SEQUENCE
+41: REF 'table-table-attlist',
+42: INTERLEAVE
+43: CHOICE
+44: ATTRIBUTE "table:name",
+45: REF 'string',
+46: DATA 'string',
+44: EPSILON
+43: CHOICE
+44: ATTRIBUTE "table:style-name",
+45: REF 'styleNameRef',
+46: CHOICE
+47: DATA 'NCName',
+47: EPSILON
+44: EPSILON
+43: SEQUENCE
+44: CHOICE
+45: ATTRIBUTE "table:protected",
+46: REF 'boolean',
+47: CHOICE
+48: VALUE 'true',
+48: VALUE 'false',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "table:protection-key",
+46: STRING
+45: EPSILON
+43: CHOICE
+44: ATTRIBUTE "table:print",
+45: REF 'boolean',
+46: CHOICE
+47: VALUE 'true',
+47: VALUE 'false',
+44: EPSILON
+43: CHOICE
+44: ATTRIBUTE "table:print-ranges",
+45: REF 'cellRangeAddressList',
+46: DATA 'string',
+44: EPSILON
+43: CHOICE
+44: ATTRIBUTE "table:is-sub-table",
+45: REF 'boolean',
+46: CHOICE
+47: VALUE 'true',
+47: VALUE 'false',
+44: EPSILON
+41: CHOICE
+42: REF 'table-table-source',
+43: ELEMENT "table:table-source",
+44: SEQUENCE
+45: REF 'table-table-source-attlist',
+46: INTERLEAVE
+47: CHOICE
+48: ATTRIBUTE "table:mode",
+49: CHOICE
+50: VALUE 'copy-all',
+50: VALUE 'copy-results-only',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "table:table-name",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+45: REF 'table-linked-source-attlist',
+46: INTERLEAVE
+47: SEQUENCE
+48: CHOICE
+49: ATTRIBUTE "xlink:type",
+50: VALUE 'simple',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "xlink:actuate",
+50: VALUE 'onRequest',
+49: EPSILON
+48: ATTRIBUTE "xlink:href",
+49: REF 'anyURI',
+50: DATA 'anyURI',
+47: CHOICE
+48: ATTRIBUTE "table:filter-name",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "table:filter-options",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "table:refresh-delay",
+49: REF 'duration',
+50: DATA 'duration',
+48: EPSILON
+42: EPSILON
+41: CHOICE
+42: REF 'office-dde-source',
+43: ELEMENT "office:dde-source",
+44: SEQUENCE
+45: REF 'office-dde-source-attlist',
+46: INTERLEAVE
+47: CHOICE
+48: ATTRIBUTE "office:name",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "office:conversion-mode",
+49: CHOICE
+50: VALUE 'into-default-style-data-style',
+50: VALUE 'into-english-number',
+50: VALUE 'keep-text',
+48: EPSILON
+45: REF 'common-dde-connection-decl-attlist',
+46: INTERLEAVE
+47: ATTRIBUTE "office:dde-application",
+48: REF 'string',
+49: DATA 'string',
+47: ATTRIBUTE "office:dde-topic",
+48: REF 'string',
+49: DATA 'string',
+47: ATTRIBUTE "office:dde-item",
+48: REF 'string',
+49: DATA 'string',
+47: CHOICE
+48: ATTRIBUTE "office:automatic-update",
+49: REF 'boolean',
+50: CHOICE
+51: VALUE 'true',
+51: VALUE 'false',
+48: EPSILON
+42: EPSILON
+41: CHOICE
+42: REF 'table-scenario',
+43: ELEMENT "table:scenario",
+44: REF 'table-scenario-attlist',
+45: INTERLEAVE
+46: ATTRIBUTE "table:scenario-ranges",
+47: REF 'cellRangeAddressList',
+48: DATA 'string',
+46: ATTRIBUTE "table:is-active",
+47: REF 'boolean',
+48: CHOICE
+49: VALUE 'true',
+49: VALUE 'false',
+46: CHOICE
+47: ATTRIBUTE "table:display-border",
+48: REF 'boolean',
+49: CHOICE
+50: VALUE 'true',
+50: VALUE 'false',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "table:border-color",
+48: REF 'color',
+49: DATA 'string',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "table:copy-back",
+48: REF 'boolean',
+49: CHOICE
+50: VALUE 'true',
+50: VALUE 'false',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "table:copy-styles",
+48: REF 'boolean',
+49: CHOICE
+50: VALUE 'true',
+50: VALUE 'false',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "table:copy-formulas",
+48: REF 'boolean',
+49: CHOICE
+50: VALUE 'true',
+50: VALUE 'false',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "table:comment",
+48: REF 'string',
+49: DATA 'string',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "table:protected",
+48: REF 'boolean',
+49: CHOICE
+50: VALUE 'true',
+50: VALUE 'false',
+47: EPSILON
+42: EPSILON
+41: CHOICE
+42: REF 'office-forms',
+43: CHOICE
+44: ELEMENT "office:forms",
+45: SEQUENCE
+46: REF 'office-forms-attlist',
+47: INTERLEAVE
+48: CHOICE
+49: ATTRIBUTE "form:automatic-focus",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "form:apply-design-mode",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+46: CHOICE
+47: ONEOREMORE
+48: CHOICE
+49: REF 'form-form',
+50: ELEMENT "form:form",
+51: SEQUENCE
+52: REF 'common-form-control-attlist',
+53: INTERLEAVE
+54: CHOICE
+55: ATTRIBUTE "form:name",
+56: REF 'string',
+57: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:control-implementation",
+56: REF 'namespacedToken',
+57: DATA 'string',
+55: EPSILON
+52: REF 'form-form-attlist',
+53: INTERLEAVE
+54: CHOICE
+55: SEQUENCE
+56: ATTRIBUTE "xlink:href",
+57: REF 'anyURI',
+58: DATA 'anyURI',
+56: CHOICE
+57: ATTRIBUTE "xlink:type",
+58: VALUE 'simple',
+57: EPSILON
+56: CHOICE
+57: ATTRIBUTE "xlink:actuate",
+58: VALUE 'onRequest',
+57: EPSILON
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "office:target-frame",
+56: REF 'targetFrameName',
+57: CHOICE
+58: VALUE '_self',
+58: VALUE '_blank',
+58: VALUE '_parent',
+58: VALUE '_top',
+58: REF 'string',
+59: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:method",
+56: CHOICE
+57: VALUE 'get',
+57: VALUE 'post',
+57: REF 'string',
+58: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:enctype",
+56: REF 'string',
+57: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:allow-deletes",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:allow-inserts",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:allow-updates",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:apply-filter",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:command-type",
+56: CHOICE
+57: VALUE 'table',
+57: VALUE 'query',
+57: VALUE 'command',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:command",
+56: STRING
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:datasource",
+56: CHOICE
+57: REF 'anyURI',
+58: DATA 'anyURI',
+57: REF 'string',
+58: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:master-fields",
+56: REF 'string',
+57: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:detail-fields",
+56: REF 'string',
+57: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:escape-processing",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:filter",
+56: REF 'string',
+57: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:ignore-result",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:navigation-mode",
+56: REF 'navigation',
+57: CHOICE
+58: VALUE 'none',
+58: VALUE 'current',
+58: VALUE 'parent',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:order",
+56: REF 'string',
+57: DATA 'string',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "form:tab-cycle",
+56: REF 'tab-cycles',
+57: CHOICE
+58: VALUE 'records',
+58: VALUE 'current',
+58: VALUE 'page',
+55: EPSILON
+52: CHOICE
+53: REF 'form-properties',
+54: ELEMENT "form:properties",
+55: ONEOREMORE
+56: REF 'form-property',
+57: CHOICE
+58: ELEMENT "form:property",
+59: SEQUENCE
+60: REF 'form-property-name',
+61: ATTRIBUTE "form:property-name",
+62: REF 'string',
+63: DATA 'string',
+60: REF 'form-property-value-and-type-attlist',
+61: CHOICE
+62: REF 'common-value-and-type-attlist',
+63: CHOICE
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'float',
+65: ATTRIBUTE "office:value",
+66: REF 'double',
+67: DATA 'double',
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'percentage',
+65: ATTRIBUTE "office:value",
+66: REF 'double',
+67: DATA 'double',
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'currency',
+65: ATTRIBUTE "office:value",
+66: REF 'double',
+67: DATA 'double',
+65: CHOICE
+66: ATTRIBUTE "office:currency",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'date',
+65: ATTRIBUTE "office:date-value",
+66: REF 'dateOrDateTime',
+67: CHOICE
+68: DATA 'date',
+68: DATA 'dateTime',
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'time',
+65: ATTRIBUTE "office:time-value",
+66: REF 'duration',
+67: DATA 'duration',
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'boolean',
+65: ATTRIBUTE "office:boolean-value",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+64: SEQUENCE
+65: ATTRIBUTE "office:value-type",
+66: VALUE 'string',
+65: CHOICE
+66: ATTRIBUTE "office:string-value",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+62: ATTRIBUTE "office:value-type",
+63: VALUE 'void',
+58: ELEMENT "form:list-property",
+59: SEQUENCE
+60: REF 'form-property-name',
+61: ATTRIBUTE "form:property-name",
+62: REF 'string',
+63: DATA 'string',
+60: REF 'form-property-type-and-value-list',
+61: CHOICE
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'float',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: ATTRIBUTE "office:value",
+67: REF 'double',
+68: DATA 'double',
+64: EPSILON
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'percentage',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: ATTRIBUTE "office:value",
+67: REF 'double',
+68: DATA 'double',
+64: EPSILON
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'currency',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: SEQUENCE
+67: ATTRIBUTE "office:value",
+68: REF 'double',
+69: DATA 'double',
+67: CHOICE
+68: ATTRIBUTE "office:currency",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: EPSILON
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'date',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: ATTRIBUTE "office:date-value",
+67: REF 'dateOrDateTime',
+68: CHOICE
+69: DATA 'date',
+69: DATA 'dateTime',
+64: EPSILON
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'time',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: ATTRIBUTE "office:time-value",
+67: REF 'duration',
+68: DATA 'duration',
+64: EPSILON
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'boolean',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: ATTRIBUTE "office:boolean-value",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+64: EPSILON
+62: SEQUENCE
+63: ATTRIBUTE "office:value-type",
+64: VALUE 'string',
+63: CHOICE
+64: ONEOREMORE
+65: ELEMENT "form:list-value",
+66: ATTRIBUTE "office:string-value",
+67: REF 'string',
+68: DATA 'string',
+64: EPSILON
+62: ATTRIBUTE "office:value-type",
+63: VALUE 'void',
+53: EPSILON
+52: CHOICE
+53: REF 'office-event-listeners',
+53: EPSILON
+52: CHOICE
+53: ONEOREMORE
+54: CHOICE
+55: REF 'controls',
+56: CHOICE
+57: REF 'column-controls',
+58: CHOICE
+59: ELEMENT "form:text",
+60: SEQUENCE
+61: REF 'form-text-attlist',
+62: SEQUENCE
+63: REF 'form-control-attlist',
+64: SEQUENCE
+65: REF 'common-form-control-attlist',
+66: INTERLEAVE
+67: CHOICE
+68: ATTRIBUTE "form:name",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "form:control-implementation",
+69: REF 'namespacedToken',
+70: DATA 'string',
+68: EPSILON
+65: REF 'common-control-id-attlist',
+66: ATTRIBUTE "form:id",
+67: REF 'ID',
+68: DATA 'ID',
+65: REF 'xforms-bind-attlist',
+66: CHOICE
+67: ATTRIBUTE "xforms:bind",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+63: REF 'common-current-value-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:current-value",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: REF 'common-disabled-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:disabled",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-maxlength-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:max-length",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+63: REF 'common-printable-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:printable",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-readonly-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:readonly",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-tab-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:tab-index",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:tab-stop",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+63: REF 'common-title-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:title",
+66: STRING
+65: EPSILON
+63: REF 'common-value-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:value",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: REF 'common-convert-empty-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:convert-empty-to-null",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-data-field-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:data-field",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+59: ELEMENT "form:textarea",
+60: SEQUENCE
+61: REF 'form-textarea-attlist',
+62: SEQUENCE
+63: REF 'form-control-attlist',
+64: SEQUENCE
+65: REF 'common-form-control-attlist',
+66: INTERLEAVE
+67: CHOICE
+68: ATTRIBUTE "form:name",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "form:control-implementation",
+69: REF 'namespacedToken',
+70: DATA 'string',
+68: EPSILON
+65: REF 'common-control-id-attlist',
+66: ATTRIBUTE "form:id",
+67: REF 'ID',
+68: DATA 'ID',
+65: REF 'xforms-bind-attlist',
+66: CHOICE
+67: ATTRIBUTE "xforms:bind",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+63: REF 'common-current-value-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:current-value",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: REF 'common-disabled-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:disabled",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-maxlength-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:max-length",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+63: REF 'common-printable-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:printable",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-readonly-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:readonly",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-tab-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:tab-index",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:tab-stop",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+63: REF 'common-title-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:title",
+66: STRING
+65: EPSILON
+63: REF 'common-value-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:value",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: REF 'common-convert-empty-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:convert-empty-to-null",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-data-field-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:data-field",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+61: CHOICE
+62: ONEOREMORE
+63: REF 'text-p',
+62: EPSILON
+59: ELEMENT "form:formatted-text",
+60: SEQUENCE
+61: REF 'form-formatted-text-attlist',
+62: INTERLEAVE
+63: SEQUENCE
+64: REF 'form-control-attlist',
+65: SEQUENCE
+66: REF 'common-form-control-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:control-implementation",
+70: REF 'namespacedToken',
+71: DATA 'string',
+69: EPSILON
+66: REF 'common-control-id-attlist',
+67: ATTRIBUTE "form:id",
+68: REF 'ID',
+69: DATA 'ID',
+66: REF 'xforms-bind-attlist',
+67: CHOICE
+68: ATTRIBUTE "xforms:bind",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-current-value-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:current-value",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-disabled-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:disabled",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-maxlength-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:max-length",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+64: REF 'common-printable-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:printable",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-readonly-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:readonly",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-tab-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:tab-index",
+68: REF 'nonNegativeInteger',
+69: DATA 'nonNegativeInteger',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:tab-stop",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+64: REF 'common-title-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:title",
+67: STRING
+66: EPSILON
+64: REF 'common-value-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:value",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-convert-empty-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:convert-empty-to-null",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-data-field-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:data-field",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:max-value",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:min-value",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:validation",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+59: ELEMENT "form:number",
+60: SEQUENCE
+61: REF 'form-number-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:value",
+65: REF 'double',
+66: DATA 'double',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:current-value",
+65: REF 'double',
+66: DATA 'double',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:min-value",
+65: REF 'double',
+66: DATA 'double',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:max-value",
+65: REF 'double',
+66: DATA 'double',
+64: EPSILON
+61: REF 'common-numeric-control-attlist',
+62: SEQUENCE
+63: REF 'form-control-attlist',
+64: SEQUENCE
+65: REF 'common-form-control-attlist',
+66: INTERLEAVE
+67: CHOICE
+68: ATTRIBUTE "form:name",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "form:control-implementation",
+69: REF 'namespacedToken',
+70: DATA 'string',
+68: EPSILON
+65: REF 'common-control-id-attlist',
+66: ATTRIBUTE "form:id",
+67: REF 'ID',
+68: DATA 'ID',
+65: REF 'xforms-bind-attlist',
+66: CHOICE
+67: ATTRIBUTE "xforms:bind",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+63: REF 'common-disabled-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:disabled",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-maxlength-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:max-length",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+63: REF 'common-printable-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:printable",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-readonly-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:readonly",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-tab-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:tab-index",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:tab-stop",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+63: REF 'common-title-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:title",
+66: STRING
+65: EPSILON
+63: REF 'common-convert-empty-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:convert-empty-to-null",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-data-field-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:data-field",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+59: ELEMENT "form:date",
+60: SEQUENCE
+61: REF 'form-date-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:value",
+65: REF 'date',
+66: DATA 'date',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:current-value",
+65: REF 'date',
+66: DATA 'date',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:min-value",
+65: REF 'date',
+66: DATA 'date',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:max-value",
+65: REF 'date',
+66: DATA 'date',
+64: EPSILON
+61: REF 'common-numeric-control-attlist',
+62: SEQUENCE
+63: REF 'form-control-attlist',
+64: SEQUENCE
+65: REF 'common-form-control-attlist',
+66: INTERLEAVE
+67: CHOICE
+68: ATTRIBUTE "form:name",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "form:control-implementation",
+69: REF 'namespacedToken',
+70: DATA 'string',
+68: EPSILON
+65: REF 'common-control-id-attlist',
+66: ATTRIBUTE "form:id",
+67: REF 'ID',
+68: DATA 'ID',
+65: REF 'xforms-bind-attlist',
+66: CHOICE
+67: ATTRIBUTE "xforms:bind",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+63: REF 'common-disabled-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:disabled",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-maxlength-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:max-length",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+63: REF 'common-printable-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:printable",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-readonly-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:readonly",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-tab-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:tab-index",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:tab-stop",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+63: REF 'common-title-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:title",
+66: STRING
+65: EPSILON
+63: REF 'common-convert-empty-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:convert-empty-to-null",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+63: REF 'common-data-field-attlist',
+64: CHOICE
+65: ATTRIBUTE "form:data-field",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+59: ELEMENT "form:combobox",
+60: SEQUENCE
+61: REF 'form-combobox-attlist',
+62: INTERLEAVE
+63: SEQUENCE
+64: REF 'form-control-attlist',
+65: SEQUENCE
+66: REF 'common-form-control-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:control-implementation",
+70: REF 'namespacedToken',
+71: DATA 'string',
+69: EPSILON
+66: REF 'common-control-id-attlist',
+67: ATTRIBUTE "form:id",
+68: REF 'ID',
+69: DATA 'ID',
+66: REF 'xforms-bind-attlist',
+67: CHOICE
+68: ATTRIBUTE "xforms:bind",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-current-value-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:current-value",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-disabled-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:disabled",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'dropdown',
+65: CHOICE
+66: ATTRIBUTE "form:dropdown",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-maxlength-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:max-length",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+64: REF 'common-printable-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:printable",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-readonly-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:readonly",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'size',
+65: CHOICE
+66: ATTRIBUTE "form:size",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+64: REF 'common-tab-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:tab-index",
+68: REF 'nonNegativeInteger',
+69: DATA 'nonNegativeInteger',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:tab-stop",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+64: REF 'common-title-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:title",
+67: STRING
+66: EPSILON
+64: REF 'common-value-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:value",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-convert-empty-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:convert-empty-to-null",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-data-field-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:data-field",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'list-source',
+65: CHOICE
+66: ATTRIBUTE "form:list-source",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'list-source-type',
+65: CHOICE
+66: ATTRIBUTE "form:list-source-type",
+67: CHOICE
+68: VALUE 'table',
+68: VALUE 'query',
+68: VALUE 'sql',
+68: VALUE 'sql-pass-through',
+68: VALUE 'value-list',
+68: VALUE 'table-fields',
+66: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:auto-complete",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+61: CHOICE
+62: ONEOREMORE
+63: REF 'form-item',
+64: ELEMENT "form:item",
+65: SEQUENCE
+66: REF 'form-item-attlist',
+67: REF 'label',
+68: CHOICE
+69: ATTRIBUTE "form:label",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+66: STRING
+62: EPSILON
+59: ELEMENT "form:listbox",
+60: SEQUENCE
+61: REF 'form-listbox-attlist',
+62: INTERLEAVE
+63: SEQUENCE
+64: REF 'form-control-attlist',
+65: SEQUENCE
+66: REF 'common-form-control-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:control-implementation",
+70: REF 'namespacedToken',
+71: DATA 'string',
+69: EPSILON
+66: REF 'common-control-id-attlist',
+67: ATTRIBUTE "form:id",
+68: REF 'ID',
+69: DATA 'ID',
+66: REF 'xforms-bind-attlist',
+67: CHOICE
+68: ATTRIBUTE "xforms:bind",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-disabled-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:disabled",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'dropdown',
+65: CHOICE
+66: ATTRIBUTE "form:dropdown",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-printable-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:printable",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'size',
+65: CHOICE
+66: ATTRIBUTE "form:size",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+64: REF 'common-tab-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:tab-index",
+68: REF 'nonNegativeInteger',
+69: DATA 'nonNegativeInteger',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:tab-stop",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+64: REF 'common-title-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:title",
+67: STRING
+66: EPSILON
+64: REF 'bound-column',
+65: CHOICE
+66: ATTRIBUTE "form:bound-column",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-data-field-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:data-field",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'list-source',
+65: CHOICE
+66: ATTRIBUTE "form:list-source",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'list-source-type',
+65: CHOICE
+66: ATTRIBUTE "form:list-source-type",
+67: CHOICE
+68: VALUE 'table',
+68: VALUE 'query',
+68: VALUE 'sql',
+68: VALUE 'sql-pass-through',
+68: VALUE 'value-list',
+68: VALUE 'table-fields',
+66: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:multiple",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:xforms-list-source",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+61: CHOICE
+62: ONEOREMORE
+63: REF 'form-option',
+64: ELEMENT "form:option",
+65: SEQUENCE
+66: REF 'form-option-attlist',
+67: SEQUENCE
+68: REF 'current-selected',
+69: CHOICE
+70: ATTRIBUTE "form:current-selected",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'selected',
+69: CHOICE
+70: ATTRIBUTE "form:selected",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'label',
+69: CHOICE
+70: ATTRIBUTE "form:label",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: STRING
+62: EPSILON
+59: ELEMENT "form:checkbox",
+60: SEQUENCE
+61: REF 'form-checkbox-attlist',
+62: INTERLEAVE
+63: SEQUENCE
+64: REF 'form-control-attlist',
+65: SEQUENCE
+66: REF 'common-form-control-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:control-implementation",
+70: REF 'namespacedToken',
+71: DATA 'string',
+69: EPSILON
+66: REF 'common-control-id-attlist',
+67: ATTRIBUTE "form:id",
+68: REF 'ID',
+69: DATA 'ID',
+66: REF 'xforms-bind-attlist',
+67: CHOICE
+68: ATTRIBUTE "xforms:bind",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-disabled-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:disabled",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'label',
+65: CHOICE
+66: ATTRIBUTE "form:label",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-printable-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:printable",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+64: REF 'common-tab-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:tab-index",
+68: REF 'nonNegativeInteger',
+69: DATA 'nonNegativeInteger',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:tab-stop",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+64: REF 'common-title-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:title",
+67: STRING
+66: EPSILON
+64: REF 'common-value-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:value",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-data-field-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:data-field",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-form-visual-effect-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:visual-effect",
+67: CHOICE
+68: VALUE 'flat',
+68: VALUE '3d',
+66: EPSILON
+64: REF 'common-form-relative-image-position-attlist',
+65: CHOICE
+66: ATTRIBUTE "form:image-position",
+67: VALUE 'center',
+66: EPSILON
+66: SEQUENCE
+67: ATTRIBUTE "form:image-position",
+68: CHOICE
+69: VALUE 'start',
+69: VALUE 'end',
+69: VALUE 'top',
+69: VALUE 'bottom',
+67: CHOICE
+68: ATTRIBUTE "form:image-align",
+69: CHOICE
+70: VALUE 'start',
+70: VALUE 'center',
+70: VALUE 'end',
+68: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:current-state",
+65: REF 'states',
+66: CHOICE
+67: VALUE 'unchecked',
+67: VALUE 'checked',
+67: VALUE 'unknown',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:is-tristate",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:state",
+65: REF 'states',
+66: CHOICE
+67: VALUE 'unchecked',
+67: VALUE 'checked',
+67: VALUE 'unknown',
+64: EPSILON
+61: REF 'common-form-control-content',
+62: SEQUENCE
+63: CHOICE
+64: REF 'form-properties',
+64: EPSILON
+63: CHOICE
+64: REF 'office-event-listeners',
+64: EPSILON
+57: ELEMENT "form:password",
+58: SEQUENCE
+59: REF 'form-password-attlist',
+60: INTERLEAVE
+61: SEQUENCE
+62: REF 'form-control-attlist',
+63: SEQUENCE
+64: REF 'common-form-control-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:name",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:control-implementation",
+68: REF 'namespacedToken',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-control-id-attlist',
+65: ATTRIBUTE "form:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: REF 'xforms-bind-attlist',
+65: CHOICE
+66: ATTRIBUTE "xforms:bind",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+62: REF 'common-disabled-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:disabled",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'common-maxlength-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:max-length",
+65: REF 'nonNegativeInteger',
+66: DATA 'nonNegativeInteger',
+64: EPSILON
+62: REF 'common-printable-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:printable",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'common-tab-attlist',
+63: INTERLEAVE
+64: CHOICE
+65: ATTRIBUTE "form:tab-index",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "form:tab-stop",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+62: REF 'common-title-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:title",
+65: STRING
+64: EPSILON
+62: REF 'common-value-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:value",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+62: REF 'common-convert-empty-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:convert-empty-to-null",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:echo-char",
+63: REF 'character',
+64: DATA 'string',
+62: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:file",
+58: SEQUENCE
+59: REF 'form-file-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-current-value-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:current-value",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-maxlength-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:max-length",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-readonly-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:readonly",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-tab-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:tab-index",
+65: REF 'nonNegativeInteger',
+66: DATA 'nonNegativeInteger',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:tab-stop",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+61: REF 'common-value-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:value",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:time",
+58: SEQUENCE
+59: REF 'form-time-attlist',
+60: INTERLEAVE
+61: CHOICE
+62: ATTRIBUTE "form:value",
+63: REF 'time',
+64: DATA 'time',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:current-value",
+63: REF 'time',
+64: DATA 'time',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:min-value",
+63: REF 'time',
+64: DATA 'time',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:max-value",
+63: REF 'time',
+64: DATA 'time',
+62: EPSILON
+59: REF 'common-numeric-control-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-maxlength-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:max-length",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-readonly-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:readonly",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-tab-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:tab-index",
+65: REF 'nonNegativeInteger',
+66: DATA 'nonNegativeInteger',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:tab-stop",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+61: REF 'common-convert-empty-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:convert-empty-to-null",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-data-field-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:data-field",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:fixed-text",
+58: SEQUENCE
+59: REF 'form-fixed-text-attlist',
+60: INTERLEAVE
+61: SEQUENCE
+62: REF 'form-control-attlist',
+63: SEQUENCE
+64: REF 'common-form-control-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:name",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:control-implementation",
+68: REF 'namespacedToken',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-control-id-attlist',
+65: ATTRIBUTE "form:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: REF 'xforms-bind-attlist',
+65: CHOICE
+66: ATTRIBUTE "xforms:bind",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+62: REF 'for',
+63: CHOICE
+64: ATTRIBUTE "form:for",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+62: REF 'common-disabled-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:disabled",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'label',
+63: CHOICE
+64: ATTRIBUTE "form:label",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+62: REF 'common-printable-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:printable",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'common-title-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:title",
+65: STRING
+64: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:multi-line",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+62: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:button",
+58: SEQUENCE
+59: REF 'form-button-attlist',
+60: INTERLEAVE
+61: SEQUENCE
+62: REF 'form-control-attlist',
+63: SEQUENCE
+64: REF 'common-form-control-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:name",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:control-implementation",
+68: REF 'namespacedToken',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-control-id-attlist',
+65: ATTRIBUTE "form:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: REF 'xforms-bind-attlist',
+65: CHOICE
+66: ATTRIBUTE "xforms:bind",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+62: REF 'button-type',
+63: CHOICE
+64: ATTRIBUTE "form:button-type",
+65: REF 'types',
+66: CHOICE
+67: VALUE 'submit',
+67: VALUE 'reset',
+67: VALUE 'push',
+67: VALUE 'url',
+64: EPSILON
+62: REF 'common-disabled-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:disabled",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'label',
+63: CHOICE
+64: ATTRIBUTE "form:label",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+62: REF 'image-data',
+63: CHOICE
+64: ATTRIBUTE "form:image-data",
+65: REF 'anyURI',
+66: DATA 'anyURI',
+64: EPSILON
+62: REF 'common-printable-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:printable",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'common-tab-attlist',
+63: INTERLEAVE
+64: CHOICE
+65: ATTRIBUTE "form:tab-index",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "form:tab-stop",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+62: REF 'target-frame',
+63: CHOICE
+64: ATTRIBUTE "office:target-frame",
+65: REF 'targetFrameName',
+66: CHOICE
+67: VALUE '_self',
+67: VALUE '_blank',
+67: VALUE '_parent',
+67: VALUE '_top',
+67: REF 'string',
+68: DATA 'string',
+64: EPSILON
+62: REF 'target-location',
+63: CHOICE
+64: ATTRIBUTE "xlink:href",
+65: REF 'anyURI',
+66: DATA 'anyURI',
+64: EPSILON
+62: REF 'common-title-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:title",
+65: STRING
+64: EPSILON
+62: REF 'common-value-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:value",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+62: REF 'common-form-relative-image-position-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:image-position",
+65: VALUE 'center',
+64: EPSILON
+64: SEQUENCE
+65: ATTRIBUTE "form:image-position",
+66: CHOICE
+67: VALUE 'start',
+67: VALUE 'end',
+67: VALUE 'top',
+67: VALUE 'bottom',
+65: CHOICE
+66: ATTRIBUTE "form:image-align",
+67: CHOICE
+68: VALUE 'start',
+68: VALUE 'center',
+68: VALUE 'end',
+66: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:default-button",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:toggle",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:focus-on-click",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:xforms-submission",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:image",
+58: SEQUENCE
+59: REF 'form-image-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'button-type',
+62: CHOICE
+63: ATTRIBUTE "form:button-type",
+64: REF 'types',
+65: CHOICE
+66: VALUE 'submit',
+66: VALUE 'reset',
+66: VALUE 'push',
+66: VALUE 'url',
+63: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'image-data',
+62: CHOICE
+63: ATTRIBUTE "form:image-data",
+64: REF 'anyURI',
+65: DATA 'anyURI',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-tab-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:tab-index",
+65: REF 'nonNegativeInteger',
+66: DATA 'nonNegativeInteger',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:tab-stop",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'target-frame',
+62: CHOICE
+63: ATTRIBUTE "office:target-frame",
+64: REF 'targetFrameName',
+65: CHOICE
+66: VALUE '_self',
+66: VALUE '_blank',
+66: VALUE '_parent',
+66: VALUE '_top',
+66: REF 'string',
+67: DATA 'string',
+63: EPSILON
+61: REF 'target-location',
+62: CHOICE
+63: ATTRIBUTE "xlink:href",
+64: REF 'anyURI',
+65: DATA 'anyURI',
+63: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+61: REF 'common-value-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:value",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:radio",
+58: SEQUENCE
+59: REF 'form-radio-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'current-selected',
+62: CHOICE
+63: ATTRIBUTE "form:current-selected",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'label',
+62: CHOICE
+63: ATTRIBUTE "form:label",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'selected',
+62: CHOICE
+63: ATTRIBUTE "form:selected",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-tab-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:tab-index",
+65: REF 'nonNegativeInteger',
+66: DATA 'nonNegativeInteger',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:tab-stop",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+61: REF 'common-value-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:value",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-data-field-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:data-field",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-form-visual-effect-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:visual-effect",
+64: CHOICE
+65: VALUE 'flat',
+65: VALUE '3d',
+63: EPSILON
+61: REF 'common-form-relative-image-position-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:image-position",
+64: VALUE 'center',
+63: EPSILON
+63: SEQUENCE
+64: ATTRIBUTE "form:image-position",
+65: CHOICE
+66: VALUE 'start',
+66: VALUE 'end',
+66: VALUE 'top',
+66: VALUE 'bottom',
+64: CHOICE
+65: ATTRIBUTE "form:image-align",
+66: CHOICE
+67: VALUE 'start',
+67: VALUE 'center',
+67: VALUE 'end',
+65: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:frame",
+58: SEQUENCE
+59: REF 'form-frame-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'for',
+62: CHOICE
+63: ATTRIBUTE "form:for",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'label',
+62: CHOICE
+63: ATTRIBUTE "form:label",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:image-frame",
+58: SEQUENCE
+59: REF 'form-image-frame-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'image-data',
+62: CHOICE
+63: ATTRIBUTE "form:image-data",
+64: REF 'anyURI',
+65: DATA 'anyURI',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-readonly-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:readonly",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+61: REF 'common-data-field-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:data-field",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:hidden",
+58: SEQUENCE
+59: REF 'form-hidden-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-value-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:value",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:grid",
+58: SEQUENCE
+59: REF 'form-grid-attlist',
+60: SEQUENCE
+61: REF 'form-control-attlist',
+62: SEQUENCE
+63: REF 'common-form-control-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "form:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "form:control-implementation",
+67: REF 'namespacedToken',
+68: DATA 'string',
+66: EPSILON
+63: REF 'common-control-id-attlist',
+64: ATTRIBUTE "form:id",
+65: REF 'ID',
+66: DATA 'ID',
+63: REF 'xforms-bind-attlist',
+64: CHOICE
+65: ATTRIBUTE "xforms:bind",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+61: REF 'common-disabled-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:disabled",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-printable-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:printable",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'common-tab-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "form:tab-index",
+65: REF 'nonNegativeInteger',
+66: DATA 'nonNegativeInteger',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "form:tab-stop",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+61: REF 'common-title-attlist',
+62: CHOICE
+63: ATTRIBUTE "form:title",
+64: STRING
+63: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+59: CHOICE
+60: ONEOREMORE
+61: REF 'form-column',
+62: ELEMENT "form:column",
+63: SEQUENCE
+64: REF 'form-column-attlist',
+65: SEQUENCE
+66: REF 'common-form-control-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:control-implementation",
+70: REF 'namespacedToken',
+71: DATA 'string',
+69: EPSILON
+66: REF 'label',
+67: CHOICE
+68: ATTRIBUTE "form:label",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'text-style-name',
+67: CHOICE
+68: ATTRIBUTE "form:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: ONEOREMORE
+65: REF 'column-controls',
+66: CHOICE
+60: EPSILON
+57: ELEMENT "form:value-range",
+58: SEQUENCE
+59: REF 'form-value-range-attlist',
+60: INTERLEAVE
+61: SEQUENCE
+62: REF 'form-control-attlist',
+63: SEQUENCE
+64: REF 'common-form-control-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "form:name",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:control-implementation",
+68: REF 'namespacedToken',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-control-id-attlist',
+65: ATTRIBUTE "form:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: REF 'xforms-bind-attlist',
+65: CHOICE
+66: ATTRIBUTE "xforms:bind",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+62: REF 'common-disabled-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:disabled",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'common-printable-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:printable",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+62: REF 'common-tab-attlist',
+63: INTERLEAVE
+64: CHOICE
+65: ATTRIBUTE "form:tab-index",
+66: REF 'nonNegativeInteger',
+67: DATA 'nonNegativeInteger',
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "form:tab-stop",
+66: REF 'boolean',
+67: CHOICE
+68: VALUE 'true',
+68: VALUE 'false',
+65: EPSILON
+62: REF 'common-title-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:title",
+65: STRING
+64: EPSILON
+62: REF 'common-value-attlist',
+63: CHOICE
+64: ATTRIBUTE "form:value",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:max-value",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:min-value",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:step-size",
+63: REF 'positiveInteger',
+64: DATA 'positiveInteger',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:page-step-size",
+63: REF 'positiveInteger',
+64: DATA 'positiveInteger',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:delay-for-repeat",
+63: REF 'duration',
+64: DATA 'duration',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "form:orientation",
+63: CHOICE
+64: VALUE 'horizontal',
+64: VALUE 'vertical',
+62: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+57: ELEMENT "form:generic-control",
+58: SEQUENCE
+59: REF 'form-generic-control-attlist',
+60: REF 'form-control-attlist',
+61: SEQUENCE
+62: REF 'common-form-control-attlist',
+63: INTERLEAVE
+64: CHOICE
+65: ATTRIBUTE "form:name",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "form:control-implementation",
+66: REF 'namespacedToken',
+67: DATA 'string',
+65: EPSILON
+62: REF 'common-control-id-attlist',
+63: ATTRIBUTE "form:id",
+64: REF 'ID',
+65: DATA 'ID',
+62: REF 'xforms-bind-attlist',
+63: CHOICE
+64: ATTRIBUTE "xforms:bind",
+65: REF 'string',
+66: DATA 'string',
+64: EPSILON
+59: REF 'common-form-control-content',
+60: SEQUENCE
+61: CHOICE
+62: REF 'form-properties',
+62: EPSILON
+61: CHOICE
+62: REF 'office-event-listeners',
+62: EPSILON
+55: REF 'form-form',
+53: EPSILON
+52: CHOICE
+53: REF 'form-connection-resource',
+54: ELEMENT "form:connection-resource",
+55: ATTRIBUTE "xlink:href",
+56: REF 'anyURI',
+57: DATA 'anyURI',
+53: EPSILON
+49: REF 'xforms-model',
+50: ELEMENT "xforms:model",
+51: REF 'anyAttListOrElements',
+52: SEQUENCE
+53: CHOICE
+54: ONEOREMORE
+55: ATTRIBUTE "*",
+56: STRING
+54: EPSILON
+53: REF 'anyElements',
+54: CHOICE
+55: ONEOREMORE
+55: EPSILON
+47: EPSILON
+44: EPSILON
+42: EPSILON
+41: CHOICE
+42: REF 'table-shapes',
+43: ELEMENT "table:shapes",
+44: ONEOREMORE
+45: REF 'shape',
+46: CHOICE
+47: REF 'draw-rect',
+48: ELEMENT "draw:rect",
+49: SEQUENCE
+50: REF 'draw-rect-attlist',
+51: CHOICE
+52: ATTRIBUTE "draw:corner-radius",
+53: REF 'nonNegativeLength',
+54: DATA 'string',
+52: EPSILON
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+53: ELEMENT "draw:glue-point",
+54: REF 'draw-glue-point-attlist',
+55: INTERLEAVE
+56: ATTRIBUTE "draw:id",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: SEQUENCE
+57: ATTRIBUTE "svg:x",
+58: CHOICE
+59: REF 'distance',
+60: REF 'length',
+61: DATA 'string',
+59: REF 'percent',
+60: DATA 'string',
+57: ATTRIBUTE "svg:y",
+58: CHOICE
+59: REF 'distance',
+60: REF 'length',
+61: DATA 'string',
+59: REF 'percent',
+60: DATA 'string',
+56: ATTRIBUTE "draw:align",
+57: CHOICE
+58: VALUE 'top-left',
+58: VALUE 'top',
+58: VALUE 'top-right',
+58: VALUE 'left',
+58: VALUE 'center',
+58: VALUE 'right',
+58: VALUE 'bottom-left',
+58: VALUE 'bottom-right',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-line',
+48: ELEMENT "draw:line",
+49: SEQUENCE
+50: REF 'draw-line-attlist',
+51: INTERLEAVE
+52: SEQUENCE
+53: ATTRIBUTE "svg:x1",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: ATTRIBUTE "svg:y1",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+52: SEQUENCE
+53: ATTRIBUTE "svg:x2",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: ATTRIBUTE "svg:y2",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-polyline',
+48: ELEMENT "draw:polyline",
+49: SEQUENCE
+50: REF 'common-draw-points-attlist',
+51: ATTRIBUTE "draw:points",
+52: REF 'points',
+53: DATA 'string',
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-viewbox-attlist',
+51: ATTRIBUTE "svg:viewBox",
+52: LIST
+53: SEQUENCE
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-polygon',
+48: ELEMENT "draw:polygon",
+49: SEQUENCE
+50: REF 'common-draw-points-attlist',
+51: ATTRIBUTE "draw:points",
+52: REF 'points',
+53: DATA 'string',
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-viewbox-attlist',
+51: ATTRIBUTE "svg:viewBox",
+52: LIST
+53: SEQUENCE
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-regular-polygon',
+48: ELEMENT "draw:regular-polygon",
+49: SEQUENCE
+50: REF 'draw-regular-polygon-attlist',
+51: INTERLEAVE
+52: CHOICE
+53: ATTRIBUTE "draw:concave",
+54: VALUE 'false',
+53: SEQUENCE
+54: ATTRIBUTE "draw:concave",
+55: VALUE 'true',
+54: REF 'draw-regular-polygon-sharpness-attlist',
+55: ATTRIBUTE "draw:sharpness",
+56: REF 'percent',
+57: DATA 'string',
+52: ATTRIBUTE "draw:corners",
+53: REF 'positiveInteger',
+54: DATA 'positiveInteger',
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-path',
+48: ELEMENT "draw:path",
+49: SEQUENCE
+50: REF 'common-draw-path-data-attlist',
+51: ATTRIBUTE "svg:d",
+52: REF 'pathData',
+53: DATA 'string',
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-viewbox-attlist',
+51: ATTRIBUTE "svg:viewBox",
+52: LIST
+53: SEQUENCE
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+54: REF 'integer',
+55: DATA 'integer',
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-circle',
+48: ELEMENT "draw:circle",
+49: SEQUENCE
+50: REF 'draw-circle-attlist',
+51: CHOICE
+52: ATTRIBUTE "svg:r",
+53: REF 'length',
+54: DATA 'string',
+52: EPSILON
+50: REF 'common-draw-circle-ellipse-attlist',
+51: INTERLEAVE
+52: CHOICE
+53: SEQUENCE
+54: ATTRIBUTE "svg:cx",
+55: REF 'coordinate',
+56: REF 'length',
+57: DATA 'string',
+54: ATTRIBUTE "svg:cy",
+55: REF 'coordinate',
+56: REF 'length',
+57: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "draw:kind",
+54: CHOICE
+55: VALUE 'full',
+55: VALUE 'section',
+55: VALUE 'cut',
+55: VALUE 'arc',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "draw:start-angle",
+54: REF 'double',
+55: DATA 'double',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "draw:end-angle",
+54: REF 'double',
+55: DATA 'double',
+53: EPSILON
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-ellipse',
+48: ELEMENT "draw:ellipse",
+49: SEQUENCE
+50: REF 'common-draw-circle-ellipse-attlist',
+51: INTERLEAVE
+52: CHOICE
+53: SEQUENCE
+54: ATTRIBUTE "svg:cx",
+55: REF 'coordinate',
+56: REF 'length',
+57: DATA 'string',
+54: ATTRIBUTE "svg:cy",
+55: REF 'coordinate',
+56: REF 'length',
+57: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "draw:kind",
+54: CHOICE
+55: VALUE 'full',
+55: VALUE 'section',
+55: VALUE 'cut',
+55: VALUE 'arc',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "draw:start-angle",
+54: REF 'double',
+55: DATA 'double',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "draw:end-angle",
+54: REF 'double',
+55: DATA 'double',
+53: EPSILON
+50: REF 'draw-ellipse-attlist',
+51: CHOICE
+52: SEQUENCE
+53: ATTRIBUTE "svg:rx",
+54: REF 'length',
+55: DATA 'string',
+53: ATTRIBUTE "svg:ry",
+54: REF 'length',
+55: DATA 'string',
+52: EPSILON
+50: REF 'common-draw-position-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:x",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:y",
+54: REF 'coordinate',
+55: REF 'length',
+56: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-size-attlist',
+51: SEQUENCE
+52: CHOICE
+53: ATTRIBUTE "svg:width",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "svg:height",
+54: REF 'length',
+55: DATA 'string',
+53: EPSILON
+50: REF 'common-draw-shape-with-text-and-styles-attlist',
+51: SEQUENCE
+52: REF 'common-draw-shape-with-styles-attlist',
+53: SEQUENCE
+54: REF 'common-draw-z-index-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:z-index",
+57: REF 'nonNegativeInteger',
+58: DATA 'nonNegativeInteger',
+56: EPSILON
+54: REF 'common-draw-id-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:id",
+57: REF 'ID',
+58: DATA 'ID',
+56: EPSILON
+54: REF 'common-draw-layer-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:layer",
+57: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-style-name-attlist',
+55: CHOICE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "draw:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "draw:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "presentation:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "presentation:class-names",
+59: REF 'styleNameRefs',
+60: LIST
+61: CHOICE
+62: ONEOREMORE
+63: DATA 'NCName',
+62: EPSILON
+58: EPSILON
+54: REF 'common-draw-transform-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:transform",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-draw-name-attlist',
+55: CHOICE
+56: ATTRIBUTE "draw:name",
+57: REF 'string',
+58: DATA 'string',
+56: EPSILON
+54: REF 'common-text-spreadsheet-shape-attlist',
+55: INTERLEAVE
+56: SEQUENCE
+57: CHOICE
+58: ATTRIBUTE "table:end-cell-address",
+59: REF 'cellAddress',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-x",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:end-y",
+59: REF 'coordinate',
+60: REF 'length',
+61: DATA 'string',
+58: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:table-background",
+58: REF 'boolean',
+59: CHOICE
+60: VALUE 'true',
+60: VALUE 'false',
+57: EPSILON
+56: REF 'common-text-anchor-attlist',
+57: INTERLEAVE
+58: CHOICE
+59: ATTRIBUTE "text:anchor-type",
+60: CHOICE
+61: VALUE 'page',
+61: VALUE 'frame',
+61: VALUE 'paragraph',
+61: VALUE 'char',
+61: VALUE 'as-char',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:anchor-page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+52: REF 'common-draw-text-style-name-attlist',
+53: CHOICE
+54: ATTRIBUTE "draw:text-style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: REF 'draw-text',
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'text-p',
+54: REF 'text-list',
+52: EPSILON
+47: REF 'draw-g',
+48: ELEMENT "draw:g",
+49: SEQUENCE
+50: REF 'draw-g-attlist',
+51: CHOICE
+52: ATTRIBUTE "svg:y",
+53: REF 'coordinate',
+54: REF 'length',
+55: DATA 'string',
+52: EPSILON
+50: REF 'common-draw-z-index-attlist',
+51: CHOICE
+52: ATTRIBUTE "draw:z-index",
+53: REF 'nonNegativeInteger',
+54: DATA 'nonNegativeInteger',
+52: EPSILON
+50: REF 'common-draw-name-attlist',
+51: CHOICE
+52: ATTRIBUTE "draw:name",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+50: REF 'common-draw-id-attlist',
+51: CHOICE
+52: ATTRIBUTE "draw:id",
+53: REF 'ID',
+54: DATA 'ID',
+52: EPSILON
+50: REF 'common-draw-style-name-attlist',
+51: CHOICE
+52: SEQUENCE
+53: CHOICE
+54: ATTRIBUTE "draw:style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "draw:class-names",
+55: REF 'styleNameRefs',
+56: LIST
+57: CHOICE
+58: ONEOREMORE
+59: DATA 'NCName',
+58: EPSILON
+54: EPSILON
+52: SEQUENCE
+53: CHOICE
+54: ATTRIBUTE "presentation:style-name",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "presentation:class-names",
+55: REF 'styleNameRefs',
+56: LIST
+57: CHOICE
+58: ONEOREMORE
+59: DATA 'NCName',
+58: EPSILON
+54: EPSILON
+50: REF 'common-text-spreadsheet-shape-attlist',
+51: INTERLEAVE
+52: SEQUENCE
+53: CHOICE
+54: ATTRIBUTE "table:end-cell-address",
+55: REF 'cellAddress',
+56: DATA 'string',
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "table:end-x",
+55: REF 'coordinate',
+56: REF 'length',
+57: DATA 'string',
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "table:end-y",
+55: REF 'coordinate',
+56: REF 'length',
+57: DATA 'string',
+54: EPSILON
+52: CHOICE
+53: ATTRIBUTE "table:table-background",
+54: REF 'boolean',
+55: CHOICE
+56: VALUE 'true',
+56: VALUE 'false',
+53: EPSILON
+52: REF 'common-text-anchor-attlist',
+53: INTERLEAVE
+54: CHOICE
+55: ATTRIBUTE "text:anchor-type",
+56: CHOICE
+57: VALUE 'page',
+57: VALUE 'frame',
+57: VALUE 'paragraph',
+57: VALUE 'char',
+57: VALUE 'as-char',
+55: EPSILON
+54: CHOICE
+55: ATTRIBUTE "text:anchor-page-number",
+56: REF 'positiveInteger',
+57: DATA 'positiveInteger',
+55: EPSILON
+50: CHOICE
+51: REF 'office-event-listeners',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'draw-glue-point',
+51: EPSILON
+50: CHOICE
+51: ONEOREMORE
+52: REF 'shape',
+53: CHOICE
+54: REF 'draw-rect',
+54: REF 'draw-line',
+54: REF 'draw-polyline',
+54: REF 'draw-polygon',
+54: REF 'draw-regular-polygon',
+54: REF 'draw-path',
+54: REF 'draw-circle',
+54: REF 'draw-ellipse',
+54: REF 'draw-g',
+54: REF 'draw-page-thumbnail',
+55: ELEMENT "draw:page-thumbnail",
+56: SEQUENCE
+57: REF 'draw-page-thumbnail-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:page-number",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+59: EPSILON
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-size-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:width",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:height",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+57: REF 'presentation-shape-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "presentation:class",
+61: REF 'presentation-classes',
+62: CHOICE
+63: VALUE 'title',
+63: VALUE 'outline',
+63: VALUE 'subtitle',
+63: VALUE 'text',
+63: VALUE 'graphic',
+63: VALUE 'object',
+63: VALUE 'chart',
+63: VALUE 'table',
+63: VALUE 'orgchart',
+63: VALUE 'page',
+63: VALUE 'notes',
+63: VALUE 'handout',
+63: VALUE 'header',
+63: VALUE 'footer',
+63: VALUE 'date-time',
+63: VALUE 'page-number',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "presentation:placeholder",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "presentation:user-transformed",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+57: REF 'common-draw-shape-with-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-z-index-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:z-index",
+62: REF 'nonNegativeInteger',
+63: DATA 'nonNegativeInteger',
+61: EPSILON
+59: REF 'common-draw-id-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:id",
+62: REF 'ID',
+63: DATA 'ID',
+61: EPSILON
+59: REF 'common-draw-layer-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:layer",
+62: DATA 'string',
+61: EPSILON
+59: REF 'common-draw-style-name-attlist',
+60: CHOICE
+61: SEQUENCE
+62: CHOICE
+63: ATTRIBUTE "draw:style-name",
+64: REF 'styleNameRef',
+65: CHOICE
+66: DATA 'NCName',
+66: EPSILON
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "draw:class-names",
+64: REF 'styleNameRefs',
+65: LIST
+66: CHOICE
+67: ONEOREMORE
+68: DATA 'NCName',
+67: EPSILON
+63: EPSILON
+61: SEQUENCE
+62: CHOICE
+63: ATTRIBUTE "presentation:style-name",
+64: REF 'styleNameRef',
+65: CHOICE
+66: DATA 'NCName',
+66: EPSILON
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "presentation:class-names",
+64: REF 'styleNameRefs',
+65: LIST
+66: CHOICE
+67: ONEOREMORE
+68: DATA 'NCName',
+67: EPSILON
+63: EPSILON
+59: REF 'common-draw-transform-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:transform",
+62: REF 'string',
+63: DATA 'string',
+61: EPSILON
+59: REF 'common-draw-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:name",
+62: REF 'string',
+63: DATA 'string',
+61: EPSILON
+59: REF 'common-text-spreadsheet-shape-attlist',
+60: INTERLEAVE
+61: SEQUENCE
+62: CHOICE
+63: ATTRIBUTE "table:end-cell-address",
+64: REF 'cellAddress',
+65: DATA 'string',
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "table:end-x",
+64: REF 'coordinate',
+65: REF 'length',
+66: DATA 'string',
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "table:end-y",
+64: REF 'coordinate',
+65: REF 'length',
+66: DATA 'string',
+63: EPSILON
+61: CHOICE
+62: ATTRIBUTE "table:table-background",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+62: EPSILON
+61: REF 'common-text-anchor-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "text:anchor-type",
+65: CHOICE
+66: VALUE 'page',
+66: VALUE 'frame',
+66: VALUE 'paragraph',
+66: VALUE 'char',
+66: VALUE 'as-char',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "text:anchor-page-number",
+65: REF 'positiveInteger',
+66: DATA 'positiveInteger',
+64: EPSILON
+54: REF 'draw-frame',
+55: ELEMENT "draw:frame",
+56: SEQUENCE
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:id",
+64: REF 'ID',
+65: DATA 'ID',
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "table:end-cell-address",
+66: REF 'cellAddress',
+67: DATA 'string',
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "table:end-x",
+66: REF 'coordinate',
+67: REF 'length',
+68: DATA 'string',
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "table:end-y",
+66: REF 'coordinate',
+67: REF 'length',
+68: DATA 'string',
+65: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-rel-size-attlist',
+58: SEQUENCE
+59: REF 'common-draw-size-attlist',
+60: SEQUENCE
+61: CHOICE
+62: ATTRIBUTE "svg:width",
+63: REF 'length',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "svg:height",
+63: REF 'length',
+64: DATA 'string',
+62: EPSILON
+59: CHOICE
+60: ATTRIBUTE "style:rel-width",
+61: CHOICE
+62: REF 'percent',
+63: DATA 'string',
+62: VALUE 'scale',
+62: VALUE 'scale-min',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "style:rel-height",
+61: CHOICE
+62: REF 'percent',
+63: DATA 'string',
+62: VALUE 'scale',
+62: VALUE 'scale-min',
+60: EPSILON
+57: REF 'presentation-shape-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "presentation:class",
+61: REF 'presentation-classes',
+62: CHOICE
+63: VALUE 'title',
+63: VALUE 'outline',
+63: VALUE 'subtitle',
+63: VALUE 'text',
+63: VALUE 'graphic',
+63: VALUE 'object',
+63: VALUE 'chart',
+63: VALUE 'table',
+63: VALUE 'orgchart',
+63: VALUE 'page',
+63: VALUE 'notes',
+63: VALUE 'handout',
+63: VALUE 'header',
+63: VALUE 'footer',
+63: VALUE 'date-time',
+63: VALUE 'page-number',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "presentation:placeholder",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "presentation:user-transformed",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+57: REF 'draw-frame-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:copy-of",
+60: REF 'string',
+61: DATA 'string',
+59: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: CHOICE
+60: REF 'draw-text-box',
+61: ELEMENT "draw:text-box",
+62: SEQUENCE
+63: REF 'draw-text-box-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "draw:chain-next-name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "draw:corner-radius",
+67: REF 'nonNegativeLength',
+68: DATA 'string',
+66: EPSILON
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "fo:min-height",
+68: CHOICE
+69: REF 'length',
+70: DATA 'string',
+69: REF 'percent',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "fo:min-width",
+68: CHOICE
+69: REF 'length',
+70: DATA 'string',
+69: REF 'percent',
+70: DATA 'string',
+67: EPSILON
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "fo:max-height",
+68: CHOICE
+69: REF 'length',
+70: DATA 'string',
+69: REF 'percent',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "fo:max-width",
+68: CHOICE
+69: REF 'length',
+70: DATA 'string',
+69: REF 'percent',
+70: DATA 'string',
+67: EPSILON
+63: CHOICE
+64: ONEOREMORE
+65: REF 'text-content',
+66: CHOICE
+67: REF 'text-h',
+67: REF 'text-p',
+67: REF 'text-list',
+67: REF 'text-numbered-paragraph',
+67: REF 'table-table',
+67: REF 'draw-a',
+68: ELEMENT "draw:a",
+69: SEQUENCE
+70: REF 'draw-a-attlist',
+71: INTERLEAVE
+72: SEQUENCE
+73: ATTRIBUTE "xlink:href",
+74: REF 'anyURI',
+75: DATA 'anyURI',
+73: CHOICE
+74: ATTRIBUTE "xlink:type",
+75: VALUE 'simple',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "xlink:actuate",
+75: VALUE 'onRequest',
+74: EPSILON
+72: SEQUENCE
+73: CHOICE
+74: ATTRIBUTE "office:target-frame-name",
+75: REF 'targetFrameName',
+76: CHOICE
+77: VALUE '_self',
+77: VALUE '_blank',
+77: VALUE '_parent',
+77: VALUE '_top',
+77: REF 'string',
+78: DATA 'string',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "xlink:show",
+75: CHOICE
+76: VALUE 'new',
+76: VALUE 'replace',
+74: EPSILON
+72: CHOICE
+73: ATTRIBUTE "office:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "office:server-map",
+74: REF 'boolean',
+75: CHOICE
+76: VALUE 'true',
+76: VALUE 'false',
+73: EPSILON
+70: REF 'draw-frame',
+67: REF 'text-section',
+68: ELEMENT "text:section",
+69: SEQUENCE
+70: REF 'text-section-attr',
+71: INTERLEAVE
+72: REF 'sectionAttr',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "text:style-name",
+76: REF 'styleNameRef',
+77: CHOICE
+78: DATA 'NCName',
+78: EPSILON
+75: EPSILON
+74: ATTRIBUTE "text:name",
+75: REF 'string',
+76: DATA 'string',
+74: CHOICE
+75: ATTRIBUTE "text:protected",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "text:protection-key",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:display",
+74: CHOICE
+75: VALUE 'true',
+75: VALUE 'none',
+73: SEQUENCE
+74: ATTRIBUTE "text:display",
+75: VALUE 'condition',
+74: ATTRIBUTE "text:condition",
+75: REF 'string',
+76: DATA 'string',
+73: EPSILON
+70: CHOICE
+71: REF 'text-section-source',
+72: ELEMENT "text:section-source",
+73: REF 'text-section-source-attr',
+74: INTERLEAVE
+75: CHOICE
+76: SEQUENCE
+77: ATTRIBUTE "xlink:href",
+78: REF 'anyURI',
+79: DATA 'anyURI',
+77: CHOICE
+78: ATTRIBUTE "xlink:type",
+79: VALUE 'simple',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "xlink:show",
+79: VALUE 'embed',
+78: EPSILON
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "text:section-name",
+77: REF 'string',
+78: DATA 'string',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "text:filter-name",
+77: REF 'string',
+78: DATA 'string',
+76: EPSILON
+71: REF 'text-section-source-dde',
+72: REF 'office-dde-source',
+71: EPSILON
+70: CHOICE
+71: ONEOREMORE
+72: REF 'text-content',
+73: CHOICE
+74: REF 'text-h',
+74: REF 'text-p',
+74: REF 'text-list',
+74: REF 'text-numbered-paragraph',
+74: REF 'table-table',
+74: REF 'draw-a',
+74: REF 'text-section',
+74: REF 'text-table-of-content',
+75: ELEMENT "text:table-of-content",
+76: SEQUENCE
+77: REF 'sectionAttr',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "text:style-name",
+81: REF 'styleNameRef',
+82: CHOICE
+83: DATA 'NCName',
+83: EPSILON
+80: EPSILON
+79: ATTRIBUTE "text:name",
+80: REF 'string',
+81: DATA 'string',
+79: CHOICE
+80: ATTRIBUTE "text:protected",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "text:protection-key",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+77: REF 'text-table-of-content-source',
+78: ELEMENT "text:table-of-content-source",
+79: SEQUENCE
+80: REF 'text-table-of-content-source-attlist',
+81: INTERLEAVE
+82: CHOICE
+83: ATTRIBUTE "text:outline-level",
+84: REF 'positiveInteger',
+85: DATA 'positiveInteger',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "text:use-outline-level",
+84: REF 'boolean',
+85: CHOICE
+86: VALUE 'true',
+86: VALUE 'false',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "text:use-index-marks",
+84: REF 'boolean',
+85: CHOICE
+86: VALUE 'true',
+86: VALUE 'false',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "text:use-index-source-styles",
+84: REF 'boolean',
+85: CHOICE
+86: VALUE 'true',
+86: VALUE 'false',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "text:index-scope",
+84: CHOICE
+85: VALUE 'document',
+85: VALUE 'chapter',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "text:relative-tab-stop-position",
+84: REF 'boolean',
+85: CHOICE
+86: VALUE 'true',
+86: VALUE 'false',
+83: EPSILON
+80: CHOICE
+81: REF 'text-index-title-template',
+82: ELEMENT "text:index-title-template",
+83: SEQUENCE
+84: CHOICE
+85: ATTRIBUTE "text:style-name",
+86: REF 'styleNameRef',
+87: CHOICE
+88: DATA 'NCName',
+88: EPSILON
+85: EPSILON
+84: STRING
+81: EPSILON
+80: CHOICE
+81: ONEOREMORE
+82: REF 'text-table-of-content-entry-template',
+83: ELEMENT "text:table-of-content-entry-template",
+84: SEQUENCE
+85: REF 'text-table-of-content-entry-template-attlist',
+86: INTERLEAVE
+87: ATTRIBUTE "text:outline-level",
+88: REF 'positiveInteger',
+89: DATA 'positiveInteger',
+87: ATTRIBUTE "text:style-name",
+88: REF 'styleNameRef',
+89: CHOICE
+90: DATA 'NCName',
+90: EPSILON
+85: CHOICE
+86: ONEOREMORE
+87: REF 'text-table-of-content-children',
+88: CHOICE
+89: REF 'text-index-entry-chapter',
+90: ELEMENT "text:index-entry-chapter",
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "text:style-name",
+94: REF 'styleNameRef',
+95: CHOICE
+96: DATA 'NCName',
+96: EPSILON
+93: EPSILON
+92: REF 'text-index-entry-chapter-attrs',
+93: CHOICE
+94: ATTRIBUTE "text:display",
+95: CHOICE
+96: VALUE 'name',
+96: VALUE 'number',
+96: VALUE 'number-and-name',
+94: EPSILON
+89: REF 'text-index-entry-page-number',
+90: ELEMENT "text:index-entry-page-number",
+91: CHOICE
+92: ATTRIBUTE "text:style-name",
+93: REF 'styleNameRef',
+94: CHOICE
+95: DATA 'NCName',
+95: EPSILON
+92: EPSILON
+89: REF 'text-index-entry-text',
+90: ELEMENT "text:index-entry-text",
+91: CHOICE
+92: ATTRIBUTE "text:style-name",
+93: REF 'styleNameRef',
+94: CHOICE
+95: DATA 'NCName',
+95: EPSILON
+92: EPSILON
+89: REF 'text-index-entry-span',
+90: ELEMENT "text:index-entry-span",
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "text:style-name",
+94: REF 'styleNameRef',
+95: CHOICE
+96: DATA 'NCName',
+96: EPSILON
+93: EPSILON
+92: STRING
+89: REF 'text-index-entry-tab-stop',
+90: ELEMENT "text:index-entry-tab-stop",
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "text:style-name",
+94: REF 'styleNameRef',
+95: CHOICE
+96: DATA 'NCName',
+96: EPSILON
+93: EPSILON
+92: REF 'text-index-entry-tab-stop-attrs',
+93: INTERLEAVE
+94: CHOICE
+95: ATTRIBUTE "style:leader-char",
+96: REF 'character',
+97: DATA 'string',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "style:type",
+96: VALUE 'right',
+95: SEQUENCE
+96: ATTRIBUTE "style:type",
+97: VALUE 'left',
+96: ATTRIBUTE "style:position",
+97: REF 'length',
+98: DATA 'string',
+89: REF 'text-index-entry-link-start',
+90: ELEMENT "text:index-entry-link-start",
+91: CHOICE
+92: ATTRIBUTE "text:style-name",
+93: REF 'styleNameRef',
+94: CHOICE
+95: DATA 'NCName',
+95: EPSILON
+92: EPSILON
+89: REF 'text-index-entry-link-end',
+90: ELEMENT "text:index-entry-link-end",
+91: CHOICE
+92: ATTRIBUTE "text:style-name",
+93: REF 'styleNameRef',
+94: CHOICE
+95: DATA 'NCName',
+95: EPSILON
+92: EPSILON
+86: EPSILON
+81: EPSILON
+80: CHOICE
+81: ONEOREMORE
+82: REF 'text-index-source-styles',
+83: ELEMENT "text:index-source-styles",
+84: SEQUENCE
+85: ATTRIBUTE "text:outline-level",
+86: REF 'positiveInteger',
+87: DATA 'positiveInteger',
+85: CHOICE
+86: ONEOREMORE
+87: REF 'text-index-source-style',
+88: ELEMENT "text:index-source-style",
+89: ATTRIBUTE "text:style-name",
+90: REF 'styleName',
+91: DATA 'NCName',
+86: EPSILON
+81: EPSILON
+77: REF 'text-index-body',
+78: ELEMENT "text:index-body",
+79: CHOICE
+80: ONEOREMORE
+81: REF 'index-content-main',
+82: CHOICE
+83: REF 'text-content',
+84: CHOICE
+85: REF 'text-h',
+85: REF 'text-p',
+85: REF 'text-list',
+85: REF 'text-numbered-paragraph',
+85: REF 'table-table',
+85: REF 'draw-a',
+85: REF 'text-section',
+85: REF 'text-table-of-content',
+85: REF 'text-illustration-index',
+86: ELEMENT "text:illustration-index",
+87: SEQUENCE
+88: REF 'sectionAttr',
+89: INTERLEAVE
+90: CHOICE
+91: ATTRIBUTE "text:style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+90: ATTRIBUTE "text:name",
+91: REF 'string',
+92: DATA 'string',
+90: CHOICE
+91: ATTRIBUTE "text:protected",
+92: REF 'boolean',
+93: CHOICE
+94: VALUE 'true',
+94: VALUE 'false',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "text:protection-key",
+92: REF 'string',
+93: DATA 'string',
+91: EPSILON
+88: REF 'text-illustration-index-source',
+89: ELEMENT "text:illustration-index-source",
+90: SEQUENCE
+91: REF 'text-illustration-index-source-attrs',
+92: INTERLEAVE
+93: REF 'text-index-scope-attr',
+94: CHOICE
+95: ATTRIBUTE "text:index-scope",
+96: CHOICE
+97: VALUE 'document',
+97: VALUE 'chapter',
+95: EPSILON
+93: REF 'text-relative-tab-stop-position-attr',
+94: CHOICE
+95: ATTRIBUTE "text:relative-tab-stop-position",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-caption",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:caption-sequence-name",
+95: REF 'string',
+96: DATA 'string',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:caption-sequence-format",
+95: CHOICE
+96: VALUE 'text',
+96: VALUE 'category-and-value',
+96: VALUE 'caption',
+94: EPSILON
+91: CHOICE
+92: REF 'text-index-title-template',
+92: EPSILON
+91: CHOICE
+92: REF 'text-illustration-index-entry-template',
+93: ELEMENT "text:illustration-index-entry-template",
+94: REF 'text-illustration-index-entry-content',
+95: SEQUENCE
+96: REF 'text-illustration-index-entry-template-attrs',
+97: ATTRIBUTE "text:style-name",
+98: REF 'styleNameRef',
+99: CHOICE
+100: DATA 'NCName',
+100: EPSILON
+96: CHOICE
+97: ONEOREMORE
+98: CHOICE
+99: REF 'text-index-entry-page-number',
+99: REF 'text-index-entry-text',
+99: REF 'text-index-entry-span',
+99: REF 'text-index-entry-tab-stop',
+97: EPSILON
+92: EPSILON
+88: REF 'text-index-body',
+85: REF 'text-table-index',
+86: ELEMENT "text:table-index",
+87: SEQUENCE
+88: REF 'sectionAttr',
+89: INTERLEAVE
+90: CHOICE
+91: ATTRIBUTE "text:style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+90: ATTRIBUTE "text:name",
+91: REF 'string',
+92: DATA 'string',
+90: CHOICE
+91: ATTRIBUTE "text:protected",
+92: REF 'boolean',
+93: CHOICE
+94: VALUE 'true',
+94: VALUE 'false',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "text:protection-key",
+92: REF 'string',
+93: DATA 'string',
+91: EPSILON
+88: REF 'text-table-index-source',
+89: ELEMENT "text:table-index-source",
+90: SEQUENCE
+91: REF 'text-illustration-index-source-attrs',
+92: INTERLEAVE
+93: REF 'text-index-scope-attr',
+94: CHOICE
+95: ATTRIBUTE "text:index-scope",
+96: CHOICE
+97: VALUE 'document',
+97: VALUE 'chapter',
+95: EPSILON
+93: REF 'text-relative-tab-stop-position-attr',
+94: CHOICE
+95: ATTRIBUTE "text:relative-tab-stop-position",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-caption",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:caption-sequence-name",
+95: REF 'string',
+96: DATA 'string',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:caption-sequence-format",
+95: CHOICE
+96: VALUE 'text',
+96: VALUE 'category-and-value',
+96: VALUE 'caption',
+94: EPSILON
+91: CHOICE
+92: REF 'text-index-title-template',
+92: EPSILON
+91: CHOICE
+92: REF 'text-table-index-entry-template',
+93: ELEMENT "text:table-index-entry-template",
+94: REF 'text-illustration-index-entry-content',
+95: SEQUENCE
+96: REF 'text-illustration-index-entry-template-attrs',
+97: ATTRIBUTE "text:style-name",
+98: REF 'styleNameRef',
+99: CHOICE
+100: DATA 'NCName',
+100: EPSILON
+96: CHOICE
+97: ONEOREMORE
+98: CHOICE
+99: REF 'text-index-entry-page-number',
+99: REF 'text-index-entry-text',
+99: REF 'text-index-entry-span',
+99: REF 'text-index-entry-tab-stop',
+97: EPSILON
+92: EPSILON
+88: REF 'text-index-body',
+85: REF 'text-object-index',
+86: ELEMENT "text:object-index",
+87: SEQUENCE
+88: REF 'sectionAttr',
+89: INTERLEAVE
+90: CHOICE
+91: ATTRIBUTE "text:style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+90: ATTRIBUTE "text:name",
+91: REF 'string',
+92: DATA 'string',
+90: CHOICE
+91: ATTRIBUTE "text:protected",
+92: REF 'boolean',
+93: CHOICE
+94: VALUE 'true',
+94: VALUE 'false',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "text:protection-key",
+92: REF 'string',
+93: DATA 'string',
+91: EPSILON
+88: REF 'text-object-index-source',
+89: ELEMENT "text:object-index-source",
+90: SEQUENCE
+91: REF 'text-object-index-source-attrs',
+92: INTERLEAVE
+93: REF 'text-index-scope-attr',
+94: CHOICE
+95: ATTRIBUTE "text:index-scope",
+96: CHOICE
+97: VALUE 'document',
+97: VALUE 'chapter',
+95: EPSILON
+93: REF 'text-relative-tab-stop-position-attr',
+94: CHOICE
+95: ATTRIBUTE "text:relative-tab-stop-position",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-spreadsheet-objects",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-math-objects",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-draw-objects",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-chart-objects",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-other-objects",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+91: CHOICE
+92: REF 'text-index-title-template',
+92: EPSILON
+91: CHOICE
+92: REF 'text-object-index-entry-template',
+93: ELEMENT "text:object-index-entry-template",
+94: REF 'text-illustration-index-entry-content',
+95: SEQUENCE
+96: REF 'text-illustration-index-entry-template-attrs',
+97: ATTRIBUTE "text:style-name",
+98: REF 'styleNameRef',
+99: CHOICE
+100: DATA 'NCName',
+100: EPSILON
+96: CHOICE
+97: ONEOREMORE
+98: CHOICE
+99: REF 'text-index-entry-page-number',
+99: REF 'text-index-entry-text',
+99: REF 'text-index-entry-span',
+99: REF 'text-index-entry-tab-stop',
+97: EPSILON
+92: EPSILON
+88: REF 'text-index-body',
+85: REF 'text-user-index',
+86: ELEMENT "text:user-index",
+87: SEQUENCE
+88: REF 'sectionAttr',
+89: INTERLEAVE
+90: CHOICE
+91: ATTRIBUTE "text:style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+90: ATTRIBUTE "text:name",
+91: REF 'string',
+92: DATA 'string',
+90: CHOICE
+91: ATTRIBUTE "text:protected",
+92: REF 'boolean',
+93: CHOICE
+94: VALUE 'true',
+94: VALUE 'false',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "text:protection-key",
+92: REF 'string',
+93: DATA 'string',
+91: EPSILON
+88: REF 'text-user-index-source',
+89: ELEMENT "text:user-index-source",
+90: SEQUENCE
+91: REF 'text-user-index-source-attr',
+92: INTERLEAVE
+93: SEQUENCE
+94: REF 'text-index-scope-attr',
+95: CHOICE
+96: ATTRIBUTE "text:index-scope",
+97: CHOICE
+98: VALUE 'document',
+98: VALUE 'chapter',
+96: EPSILON
+94: REF 'text-relative-tab-stop-position-attr',
+95: CHOICE
+96: ATTRIBUTE "text:relative-tab-stop-position",
+97: REF 'boolean',
+98: CHOICE
+99: VALUE 'true',
+99: VALUE 'false',
+96: EPSILON
+94: ATTRIBUTE "text:index-name",
+95: REF 'string',
+96: DATA 'string',
+93: SEQUENCE
+94: CHOICE
+95: ATTRIBUTE "text:use-index-marks",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:use-graphics",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:use-tables",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:use-floating-frames",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:use-objects",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:copy-outline-levels",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+91: CHOICE
+92: REF 'text-index-title-template',
+92: EPSILON
+91: CHOICE
+92: ONEOREMORE
+93: REF 'text-user-index-entry-template',
+94: ELEMENT "text:user-index-entry-template",
+95: SEQUENCE
+96: REF 'text-user-index-entry-template-attrs',
+97: INTERLEAVE
+98: ATTRIBUTE "text:outline-level",
+99: REF 'positiveInteger',
+100: DATA 'positiveInteger',
+98: ATTRIBUTE "text:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+96: CHOICE
+97: ONEOREMORE
+98: CHOICE
+99: REF 'text-index-entry-chapter',
+99: REF 'text-index-entry-page-number',
+99: REF 'text-index-entry-text',
+99: REF 'text-index-entry-span',
+99: REF 'text-index-entry-tab-stop',
+97: EPSILON
+92: EPSILON
+91: CHOICE
+92: ONEOREMORE
+93: REF 'text-index-source-styles',
+92: EPSILON
+88: REF 'text-index-body',
+85: REF 'text-alphabetical-index',
+86: ELEMENT "text:alphabetical-index",
+87: SEQUENCE
+88: REF 'sectionAttr',
+89: INTERLEAVE
+90: CHOICE
+91: ATTRIBUTE "text:style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+90: ATTRIBUTE "text:name",
+91: REF 'string',
+92: DATA 'string',
+90: CHOICE
+91: ATTRIBUTE "text:protected",
+92: REF 'boolean',
+93: CHOICE
+94: VALUE 'true',
+94: VALUE 'false',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "text:protection-key",
+92: REF 'string',
+93: DATA 'string',
+91: EPSILON
+88: REF 'text-alphabetical-index-source',
+89: ELEMENT "text:alphabetical-index-source",
+90: SEQUENCE
+91: REF 'text-alphabetical-index-source-attrs',
+92: INTERLEAVE
+93: SEQUENCE
+94: REF 'text-index-scope-attr',
+95: CHOICE
+96: ATTRIBUTE "text:index-scope",
+97: CHOICE
+98: VALUE 'document',
+98: VALUE 'chapter',
+96: EPSILON
+94: REF 'text-relative-tab-stop-position-attr',
+95: CHOICE
+96: ATTRIBUTE "text:relative-tab-stop-position",
+97: REF 'boolean',
+98: CHOICE
+99: VALUE 'true',
+99: VALUE 'false',
+96: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:ignore-case",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:main-entry-style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:alphabetical-separators",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: SEQUENCE
+94: CHOICE
+95: ATTRIBUTE "text:combine-entries",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:combine-entries-with-dash",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:combine-entries-with-pp",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:use-keys-as-entries",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:capitalize-entries",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:comma-separated",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "fo:language",
+95: REF 'languageCode',
+96: DATA 'token',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "fo:country",
+95: REF 'countryCode',
+96: DATA 'token',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:sort-algorithm",
+95: REF 'string',
+96: DATA 'string',
+94: EPSILON
+91: CHOICE
+92: REF 'text-index-title-template',
+92: EPSILON
+91: CHOICE
+92: ONEOREMORE
+93: REF 'text-alphabetical-index-entry-template',
+94: ELEMENT "text:alphabetical-index-entry-template",
+95: SEQUENCE
+96: REF 'text-alphabetical-index-entry-template-attrs',
+97: INTERLEAVE
+98: ATTRIBUTE "text:outline-level",
+99: CHOICE
+100: VALUE '1',
+100: VALUE '2',
+100: VALUE '3',
+100: VALUE 'separator',
+98: ATTRIBUTE "text:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+96: CHOICE
+97: ONEOREMORE
+98: CHOICE
+99: REF 'text-index-entry-chapter',
+99: REF 'text-index-entry-page-number',
+99: REF 'text-index-entry-text',
+99: REF 'text-index-entry-span',
+99: REF 'text-index-entry-tab-stop',
+97: EPSILON
+92: EPSILON
+88: REF 'text-index-body',
+85: REF 'text-bibliography',
+86: ELEMENT "text:bibliography",
+87: SEQUENCE
+88: REF 'sectionAttr',
+89: INTERLEAVE
+90: CHOICE
+91: ATTRIBUTE "text:style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+90: ATTRIBUTE "text:name",
+91: REF 'string',
+92: DATA 'string',
+90: CHOICE
+91: ATTRIBUTE "text:protected",
+92: REF 'boolean',
+93: CHOICE
+94: VALUE 'true',
+94: VALUE 'false',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "text:protection-key",
+92: REF 'string',
+93: DATA 'string',
+91: EPSILON
+88: REF 'text-bibliography-source',
+89: ELEMENT "text:bibliography-source",
+90: SEQUENCE
+91: CHOICE
+92: REF 'text-index-title-template',
+92: EPSILON
+91: CHOICE
+92: ONEOREMORE
+93: REF 'text-bibliography-entry-template',
+94: ELEMENT "text:bibliography-entry-template",
+95: SEQUENCE
+96: REF 'text-bibliography-entry-template-attrs',
+97: INTERLEAVE
+98: ATTRIBUTE "text:bibliography-type",
+99: REF 'text-bibliography-types',
+100: CHOICE
+101: VALUE 'article',
+101: VALUE 'book',
+101: VALUE 'booklet',
+101: VALUE 'conference',
+101: VALUE 'custom1',
+101: VALUE 'custom2',
+101: VALUE 'custom3',
+101: VALUE 'custom4',
+101: VALUE 'custom5',
+101: VALUE 'email',
+101: VALUE 'inbook',
+101: VALUE 'incollection',
+101: VALUE 'inproceedings',
+101: VALUE 'journal',
+101: VALUE 'manual',
+101: VALUE 'mastersthesis',
+101: VALUE 'misc',
+101: VALUE 'phdthesis',
+101: VALUE 'proceedings',
+101: VALUE 'techreport',
+101: VALUE 'unpublished',
+101: VALUE 'www',
+98: ATTRIBUTE "text:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+96: CHOICE
+97: ONEOREMORE
+98: CHOICE
+99: REF 'text-index-entry-span',
+99: REF 'text-index-entry-tab-stop',
+99: REF 'text-index-entry-bibliography',
+100: ELEMENT "text:index-entry-bibliography",
+101: REF 'text-index-entry-bibliography-attrs',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "text:style-name",
+105: REF 'styleNameRef',
+106: CHOICE
+107: DATA 'NCName',
+107: EPSILON
+104: EPSILON
+103: ATTRIBUTE "text:bibliography-data-field",
+104: CHOICE
+105: VALUE 'address',
+105: VALUE 'annote',
+105: VALUE 'author',
+105: VALUE 'bibliography-type',
+105: VALUE 'booktitle',
+105: VALUE 'chapter',
+105: VALUE 'custom1',
+105: VALUE 'custom2',
+105: VALUE 'custom3',
+105: VALUE 'custom4',
+105: VALUE 'custom5',
+105: VALUE 'edition',
+105: VALUE 'editor',
+105: VALUE 'howpublished',
+105: VALUE 'identifier',
+105: VALUE 'institution',
+105: VALUE 'isbn',
+105: VALUE 'issn',
+105: VALUE 'journal',
+105: VALUE 'month',
+105: VALUE 'note',
+105: VALUE 'number',
+105: VALUE 'organizations',
+105: VALUE 'pages',
+105: VALUE 'publisher',
+105: VALUE 'report-type',
+105: VALUE 'school',
+105: VALUE 'series',
+105: VALUE 'title',
+105: VALUE 'url',
+105: VALUE 'volume',
+105: VALUE 'year',
+97: EPSILON
+92: EPSILON
+88: REF 'text-index-body',
+85: REF 'shape',
+86: CHOICE
+87: REF 'draw-rect',
+87: REF 'draw-line',
+87: REF 'draw-polyline',
+87: REF 'draw-polygon',
+87: REF 'draw-regular-polygon',
+87: REF 'draw-path',
+87: REF 'draw-circle',
+87: REF 'draw-ellipse',
+87: REF 'draw-g',
+87: REF 'draw-page-thumbnail',
+87: REF 'draw-frame',
+87: REF 'draw-measure',
+88: ELEMENT "draw:measure",
+89: SEQUENCE
+90: REF 'draw-measure-attlist',
+91: INTERLEAVE
+92: SEQUENCE
+93: ATTRIBUTE "svg:x1",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: ATTRIBUTE "svg:y1",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+92: SEQUENCE
+93: ATTRIBUTE "svg:x2",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: ATTRIBUTE "svg:y2",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+90: REF 'common-draw-shape-with-text-and-styles-attlist',
+91: SEQUENCE
+92: REF 'common-draw-shape-with-styles-attlist',
+93: SEQUENCE
+94: REF 'common-draw-z-index-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:z-index",
+97: REF 'nonNegativeInteger',
+98: DATA 'nonNegativeInteger',
+96: EPSILON
+94: REF 'common-draw-id-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:id",
+97: REF 'ID',
+98: DATA 'ID',
+96: EPSILON
+94: REF 'common-draw-layer-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:layer",
+97: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-style-name-attlist',
+95: CHOICE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "presentation:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "presentation:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+94: REF 'common-draw-transform-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:transform",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:name",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-text-spreadsheet-shape-attlist',
+95: INTERLEAVE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "table:end-cell-address",
+99: REF 'cellAddress',
+100: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-x",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-y",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "table:table-background",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: REF 'common-text-anchor-attlist',
+97: INTERLEAVE
+98: CHOICE
+99: ATTRIBUTE "text:anchor-type",
+100: CHOICE
+101: VALUE 'page',
+101: VALUE 'frame',
+101: VALUE 'paragraph',
+101: VALUE 'char',
+101: VALUE 'as-char',
+99: EPSILON
+98: CHOICE
+99: ATTRIBUTE "text:anchor-page-number",
+100: REF 'positiveInteger',
+101: DATA 'positiveInteger',
+99: EPSILON
+92: REF 'common-draw-text-style-name-attlist',
+93: CHOICE
+94: ATTRIBUTE "draw:text-style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+90: CHOICE
+91: REF 'office-event-listeners',
+91: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'draw-glue-point',
+91: EPSILON
+90: REF 'draw-text',
+91: CHOICE
+92: ONEOREMORE
+93: CHOICE
+94: REF 'text-p',
+94: REF 'text-list',
+92: EPSILON
+87: REF 'draw-caption',
+88: ELEMENT "draw:caption",
+89: SEQUENCE
+90: REF 'draw-caption-attlist',
+91: INTERLEAVE
+92: CHOICE
+93: SEQUENCE
+94: ATTRIBUTE "draw:caption-point-x",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+94: ATTRIBUTE "draw:caption-point-y",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:corner-radius",
+94: REF 'nonNegativeLength',
+95: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-position-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:x",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:y",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-size-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:width",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:height",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-shape-with-text-and-styles-attlist',
+91: SEQUENCE
+92: REF 'common-draw-shape-with-styles-attlist',
+93: SEQUENCE
+94: REF 'common-draw-z-index-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:z-index",
+97: REF 'nonNegativeInteger',
+98: DATA 'nonNegativeInteger',
+96: EPSILON
+94: REF 'common-draw-id-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:id",
+97: REF 'ID',
+98: DATA 'ID',
+96: EPSILON
+94: REF 'common-draw-layer-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:layer",
+97: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-style-name-attlist',
+95: CHOICE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "presentation:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "presentation:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+94: REF 'common-draw-transform-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:transform",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:name",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-text-spreadsheet-shape-attlist',
+95: INTERLEAVE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "table:end-cell-address",
+99: REF 'cellAddress',
+100: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-x",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-y",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "table:table-background",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: REF 'common-text-anchor-attlist',
+97: INTERLEAVE
+98: CHOICE
+99: ATTRIBUTE "text:anchor-type",
+100: CHOICE
+101: VALUE 'page',
+101: VALUE 'frame',
+101: VALUE 'paragraph',
+101: VALUE 'char',
+101: VALUE 'as-char',
+99: EPSILON
+98: CHOICE
+99: ATTRIBUTE "text:anchor-page-number",
+100: REF 'positiveInteger',
+101: DATA 'positiveInteger',
+99: EPSILON
+92: REF 'common-draw-text-style-name-attlist',
+93: CHOICE
+94: ATTRIBUTE "draw:text-style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+90: CHOICE
+91: REF 'office-event-listeners',
+91: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'draw-glue-point',
+91: EPSILON
+90: REF 'draw-text',
+91: CHOICE
+92: ONEOREMORE
+93: CHOICE
+94: REF 'text-p',
+94: REF 'text-list',
+92: EPSILON
+87: REF 'draw-connector',
+88: ELEMENT "draw:connector",
+89: SEQUENCE
+90: REF 'draw-connector-attlist',
+91: INTERLEAVE
+92: CHOICE
+93: ATTRIBUTE "draw:type",
+94: CHOICE
+95: VALUE 'standard',
+95: VALUE 'lines',
+95: VALUE 'line',
+95: VALUE 'curve',
+93: EPSILON
+92: CHOICE
+93: SEQUENCE
+94: ATTRIBUTE "svg:x1",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+94: ATTRIBUTE "svg:y1",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:start-shape",
+94: REF 'IDREF',
+95: DATA 'IDREF',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:start-glue-point",
+94: REF 'nonNegativeInteger',
+95: DATA 'nonNegativeInteger',
+93: EPSILON
+92: CHOICE
+93: SEQUENCE
+94: ATTRIBUTE "svg:x2",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+94: ATTRIBUTE "svg:y2",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:end-shape",
+94: REF 'IDREF',
+95: DATA 'IDREF',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:end-glue-point",
+94: REF 'nonNegativeInteger',
+95: DATA 'nonNegativeInteger',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:line-skew",
+94: LIST
+95: SEQUENCE
+96: REF 'length',
+97: DATA 'string',
+96: CHOICE
+97: SEQUENCE
+98: REF 'length',
+99: DATA 'string',
+98: CHOICE
+99: REF 'length',
+100: DATA 'string',
+99: EPSILON
+97: EPSILON
+93: EPSILON
+90: REF 'common-draw-shape-with-text-and-styles-attlist',
+91: SEQUENCE
+92: REF 'common-draw-shape-with-styles-attlist',
+93: SEQUENCE
+94: REF 'common-draw-z-index-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:z-index",
+97: REF 'nonNegativeInteger',
+98: DATA 'nonNegativeInteger',
+96: EPSILON
+94: REF 'common-draw-id-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:id",
+97: REF 'ID',
+98: DATA 'ID',
+96: EPSILON
+94: REF 'common-draw-layer-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:layer",
+97: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-style-name-attlist',
+95: CHOICE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "presentation:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "presentation:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+94: REF 'common-draw-transform-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:transform",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:name",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-text-spreadsheet-shape-attlist',
+95: INTERLEAVE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "table:end-cell-address",
+99: REF 'cellAddress',
+100: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-x",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-y",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "table:table-background",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: REF 'common-text-anchor-attlist',
+97: INTERLEAVE
+98: CHOICE
+99: ATTRIBUTE "text:anchor-type",
+100: CHOICE
+101: VALUE 'page',
+101: VALUE 'frame',
+101: VALUE 'paragraph',
+101: VALUE 'char',
+101: VALUE 'as-char',
+99: EPSILON
+98: CHOICE
+99: ATTRIBUTE "text:anchor-page-number",
+100: REF 'positiveInteger',
+101: DATA 'positiveInteger',
+99: EPSILON
+92: REF 'common-draw-text-style-name-attlist',
+93: CHOICE
+94: ATTRIBUTE "draw:text-style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+90: CHOICE
+91: REF 'office-event-listeners',
+91: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'draw-glue-point',
+91: EPSILON
+90: REF 'draw-text',
+91: CHOICE
+92: ONEOREMORE
+93: CHOICE
+94: REF 'text-p',
+94: REF 'text-list',
+92: EPSILON
+87: REF 'draw-control',
+88: ELEMENT "draw:control",
+89: SEQUENCE
+90: REF 'draw-control-attlist',
+91: ATTRIBUTE "draw:control",
+92: REF 'IDREF',
+93: DATA 'IDREF',
+90: REF 'common-draw-position-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:x",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:y",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-size-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:width",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:height",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-shape-with-text-and-styles-attlist',
+91: SEQUENCE
+92: REF 'common-draw-shape-with-styles-attlist',
+93: SEQUENCE
+94: REF 'common-draw-z-index-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:z-index",
+97: REF 'nonNegativeInteger',
+98: DATA 'nonNegativeInteger',
+96: EPSILON
+94: REF 'common-draw-id-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:id",
+97: REF 'ID',
+98: DATA 'ID',
+96: EPSILON
+94: REF 'common-draw-layer-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:layer",
+97: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-style-name-attlist',
+95: CHOICE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "presentation:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "presentation:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+94: REF 'common-draw-transform-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:transform",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:name",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-text-spreadsheet-shape-attlist',
+95: INTERLEAVE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "table:end-cell-address",
+99: REF 'cellAddress',
+100: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-x",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-y",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "table:table-background",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: REF 'common-text-anchor-attlist',
+97: INTERLEAVE
+98: CHOICE
+99: ATTRIBUTE "text:anchor-type",
+100: CHOICE
+101: VALUE 'page',
+101: VALUE 'frame',
+101: VALUE 'paragraph',
+101: VALUE 'char',
+101: VALUE 'as-char',
+99: EPSILON
+98: CHOICE
+99: ATTRIBUTE "text:anchor-page-number",
+100: REF 'positiveInteger',
+101: DATA 'positiveInteger',
+99: EPSILON
+92: REF 'common-draw-text-style-name-attlist',
+93: CHOICE
+94: ATTRIBUTE "draw:text-style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'draw-glue-point',
+91: EPSILON
+87: REF 'dr3d-scene',
+88: ELEMENT "dr3d:scene",
+89: SEQUENCE
+90: REF 'dr3d-scene-attlist',
+91: INTERLEAVE
+92: SEQUENCE
+93: CHOICE
+94: ATTRIBUTE "dr3d:vrp",
+95: REF 'vector3D',
+96: DATA 'string',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "dr3d:vpn",
+95: REF 'vector3D',
+96: DATA 'string',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "dr3d:vup",
+95: REF 'vector3D',
+96: DATA 'string',
+94: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:projection",
+94: CHOICE
+95: VALUE 'parallel',
+95: VALUE 'perspective',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:distance",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:focal-length",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:shadow-slant",
+94: REF 'nonNegativeInteger',
+95: DATA 'nonNegativeInteger',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:shade-mode",
+94: CHOICE
+95: VALUE 'flat',
+95: VALUE 'phong',
+95: VALUE 'gouraud',
+95: VALUE 'draft',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:ambient-color",
+94: REF 'color',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "dr3d:lighting-mode",
+94: REF 'boolean',
+95: CHOICE
+96: VALUE 'true',
+96: VALUE 'false',
+93: EPSILON
+90: REF 'common-draw-position-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:x",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:y",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-size-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:width",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:height",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-style-name-attlist',
+91: CHOICE
+92: SEQUENCE
+93: CHOICE
+94: ATTRIBUTE "draw:style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "draw:class-names",
+95: REF 'styleNameRefs',
+96: LIST
+97: CHOICE
+98: ONEOREMORE
+99: DATA 'NCName',
+98: EPSILON
+94: EPSILON
+92: SEQUENCE
+93: CHOICE
+94: ATTRIBUTE "presentation:style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "presentation:class-names",
+95: REF 'styleNameRefs',
+96: LIST
+97: CHOICE
+98: ONEOREMORE
+99: DATA 'NCName',
+98: EPSILON
+94: EPSILON
+90: REF 'common-draw-z-index-attlist',
+91: CHOICE
+92: ATTRIBUTE "draw:z-index",
+93: REF 'nonNegativeInteger',
+94: DATA 'nonNegativeInteger',
+92: EPSILON
+90: REF 'common-draw-id-attlist',
+91: CHOICE
+92: ATTRIBUTE "draw:id",
+93: REF 'ID',
+94: DATA 'ID',
+92: EPSILON
+90: REF 'common-draw-layer-name-attlist',
+91: CHOICE
+92: ATTRIBUTE "draw:layer",
+93: DATA 'string',
+92: EPSILON
+90: REF 'common-text-spreadsheet-shape-attlist',
+91: INTERLEAVE
+92: SEQUENCE
+93: CHOICE
+94: ATTRIBUTE "table:end-cell-address",
+95: REF 'cellAddress',
+96: DATA 'string',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "table:end-x",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "table:end-y",
+95: REF 'coordinate',
+96: REF 'length',
+97: DATA 'string',
+94: EPSILON
+92: CHOICE
+93: ATTRIBUTE "table:table-background",
+94: REF 'boolean',
+95: CHOICE
+96: VALUE 'true',
+96: VALUE 'false',
+93: EPSILON
+92: REF 'common-text-anchor-attlist',
+93: INTERLEAVE
+94: CHOICE
+95: ATTRIBUTE "text:anchor-type",
+96: CHOICE
+97: VALUE 'page',
+97: VALUE 'frame',
+97: VALUE 'paragraph',
+97: VALUE 'char',
+97: VALUE 'as-char',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "text:anchor-page-number",
+96: REF 'positiveInteger',
+97: DATA 'positiveInteger',
+95: EPSILON
+90: REF 'common-dr3d-transform-attlist',
+91: CHOICE
+92: ATTRIBUTE "dr3d:transform",
+93: STRING
+92: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'dr3d-light',
+93: ELEMENT "dr3d:light",
+94: REF 'dr3d-light-attlist',
+95: INTERLEAVE
+96: CHOICE
+97: ATTRIBUTE "dr3d:diffuse-color",
+98: REF 'color',
+99: DATA 'string',
+97: EPSILON
+96: ATTRIBUTE "dr3d:direction",
+97: REF 'vector3D',
+98: DATA 'string',
+96: CHOICE
+97: ATTRIBUTE "dr3d:enabled",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "dr3d:specular",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+91: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'shapes3d',
+93: CHOICE
+94: REF 'dr3d-scene',
+94: REF 'dr3d-extrude',
+95: ELEMENT "dr3d:extrude",
+96: SEQUENCE
+97: REF 'common-draw-path-data-attlist',
+98: ATTRIBUTE "svg:d",
+99: REF 'pathData',
+100: DATA 'string',
+97: REF 'common-draw-viewbox-attlist',
+98: ATTRIBUTE "svg:viewBox",
+99: LIST
+100: SEQUENCE
+101: REF 'integer',
+102: DATA 'integer',
+101: REF 'integer',
+102: DATA 'integer',
+101: REF 'integer',
+102: DATA 'integer',
+101: REF 'integer',
+102: DATA 'integer',
+97: REF 'common-draw-id-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:id",
+100: REF 'ID',
+101: DATA 'ID',
+99: EPSILON
+97: REF 'common-draw-z-index-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:z-index",
+100: REF 'nonNegativeInteger',
+101: DATA 'nonNegativeInteger',
+99: EPSILON
+97: REF 'common-draw-layer-name-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:layer",
+100: DATA 'string',
+99: EPSILON
+97: REF 'common-draw-style-name-attlist',
+98: CHOICE
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "draw:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "presentation:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "presentation:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+97: REF 'common-dr3d-transform-attlist',
+98: CHOICE
+99: ATTRIBUTE "dr3d:transform",
+100: STRING
+99: EPSILON
+94: REF 'dr3d-sphere',
+95: ELEMENT "dr3d:sphere",
+96: SEQUENCE
+97: REF 'dr3d-sphere-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "dr3d:center",
+101: REF 'vector3D',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "dr3d:size",
+101: REF 'vector3D',
+102: DATA 'string',
+100: EPSILON
+97: REF 'common-draw-z-index-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:z-index",
+100: REF 'nonNegativeInteger',
+101: DATA 'nonNegativeInteger',
+99: EPSILON
+97: REF 'common-draw-id-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:id",
+100: REF 'ID',
+101: DATA 'ID',
+99: EPSILON
+97: REF 'common-draw-layer-name-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:layer",
+100: DATA 'string',
+99: EPSILON
+97: REF 'common-draw-style-name-attlist',
+98: CHOICE
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "draw:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "presentation:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "presentation:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+97: REF 'common-dr3d-transform-attlist',
+98: CHOICE
+99: ATTRIBUTE "dr3d:transform",
+100: STRING
+99: EPSILON
+94: REF 'dr3d-rotate',
+95: ELEMENT "dr3d:rotate",
+96: SEQUENCE
+97: REF 'common-draw-viewbox-attlist',
+98: ATTRIBUTE "svg:viewBox",
+99: LIST
+100: SEQUENCE
+101: REF 'integer',
+102: DATA 'integer',
+101: REF 'integer',
+102: DATA 'integer',
+101: REF 'integer',
+102: DATA 'integer',
+101: REF 'integer',
+102: DATA 'integer',
+97: REF 'common-draw-path-data-attlist',
+98: ATTRIBUTE "svg:d",
+99: REF 'pathData',
+100: DATA 'string',
+97: REF 'common-draw-z-index-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:z-index",
+100: REF 'nonNegativeInteger',
+101: DATA 'nonNegativeInteger',
+99: EPSILON
+97: REF 'common-draw-id-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:id",
+100: REF 'ID',
+101: DATA 'ID',
+99: EPSILON
+97: REF 'common-draw-layer-name-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:layer",
+100: DATA 'string',
+99: EPSILON
+97: REF 'common-draw-style-name-attlist',
+98: CHOICE
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "draw:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "presentation:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "presentation:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+97: REF 'common-dr3d-transform-attlist',
+98: CHOICE
+99: ATTRIBUTE "dr3d:transform",
+100: STRING
+99: EPSILON
+94: REF 'dr3d-cube',
+95: ELEMENT "dr3d:cube",
+96: SEQUENCE
+97: REF 'dr3d-cube-attlist',
+98: SEQUENCE
+99: CHOICE
+100: ATTRIBUTE "dr3d:min-edge",
+101: REF 'vector3D',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "dr3d:max-edge",
+101: REF 'vector3D',
+102: DATA 'string',
+100: EPSILON
+97: REF 'common-draw-z-index-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:z-index",
+100: REF 'nonNegativeInteger',
+101: DATA 'nonNegativeInteger',
+99: EPSILON
+97: REF 'common-draw-id-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:id",
+100: REF 'ID',
+101: DATA 'ID',
+99: EPSILON
+97: REF 'common-draw-layer-name-attlist',
+98: CHOICE
+99: ATTRIBUTE "draw:layer",
+100: DATA 'string',
+99: EPSILON
+97: REF 'common-draw-style-name-attlist',
+98: CHOICE
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "draw:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+99: SEQUENCE
+100: CHOICE
+101: ATTRIBUTE "presentation:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "presentation:class-names",
+102: REF 'styleNameRefs',
+103: LIST
+104: CHOICE
+105: ONEOREMORE
+106: DATA 'NCName',
+105: EPSILON
+101: EPSILON
+97: REF 'common-dr3d-transform-attlist',
+98: CHOICE
+99: ATTRIBUTE "dr3d:transform",
+100: STRING
+99: EPSILON
+91: EPSILON
+87: REF 'draw-custom-shape',
+88: ELEMENT "draw:custom-shape",
+89: SEQUENCE
+90: REF 'draw-custom-shape-attlist',
+91: INTERLEAVE
+92: CHOICE
+93: ATTRIBUTE "draw:engine",
+94: REF 'namespacedToken',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "draw:data",
+94: REF 'string',
+95: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-position-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:x",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:y",
+94: REF 'coordinate',
+95: REF 'length',
+96: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-size-attlist',
+91: SEQUENCE
+92: CHOICE
+93: ATTRIBUTE "svg:width",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+92: CHOICE
+93: ATTRIBUTE "svg:height",
+94: REF 'length',
+95: DATA 'string',
+93: EPSILON
+90: REF 'common-draw-shape-with-text-and-styles-attlist',
+91: SEQUENCE
+92: REF 'common-draw-shape-with-styles-attlist',
+93: SEQUENCE
+94: REF 'common-draw-z-index-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:z-index",
+97: REF 'nonNegativeInteger',
+98: DATA 'nonNegativeInteger',
+96: EPSILON
+94: REF 'common-draw-id-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:id",
+97: REF 'ID',
+98: DATA 'ID',
+96: EPSILON
+94: REF 'common-draw-layer-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:layer",
+97: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-style-name-attlist',
+95: CHOICE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "presentation:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "presentation:class-names",
+99: REF 'styleNameRefs',
+100: LIST
+101: CHOICE
+102: ONEOREMORE
+103: DATA 'NCName',
+102: EPSILON
+98: EPSILON
+94: REF 'common-draw-transform-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:transform",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-draw-name-attlist',
+95: CHOICE
+96: ATTRIBUTE "draw:name",
+97: REF 'string',
+98: DATA 'string',
+96: EPSILON
+94: REF 'common-text-spreadsheet-shape-attlist',
+95: INTERLEAVE
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "table:end-cell-address",
+99: REF 'cellAddress',
+100: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-x",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "table:end-y",
+99: REF 'coordinate',
+100: REF 'length',
+101: DATA 'string',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "table:table-background",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: REF 'common-text-anchor-attlist',
+97: INTERLEAVE
+98: CHOICE
+99: ATTRIBUTE "text:anchor-type",
+100: CHOICE
+101: VALUE 'page',
+101: VALUE 'frame',
+101: VALUE 'paragraph',
+101: VALUE 'char',
+101: VALUE 'as-char',
+99: EPSILON
+98: CHOICE
+99: ATTRIBUTE "text:anchor-page-number",
+100: REF 'positiveInteger',
+101: DATA 'positiveInteger',
+99: EPSILON
+92: REF 'common-draw-text-style-name-attlist',
+93: CHOICE
+94: ATTRIBUTE "draw:text-style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+90: CHOICE
+91: REF 'office-event-listeners',
+91: EPSILON
+90: CHOICE
+91: ONEOREMORE
+92: REF 'draw-glue-point',
+91: EPSILON
+90: REF 'draw-text',
+91: CHOICE
+92: ONEOREMORE
+93: CHOICE
+94: REF 'text-p',
+94: REF 'text-list',
+92: EPSILON
+90: CHOICE
+91: REF 'draw-enhanced-geometry',
+92: ELEMENT "draw:enhanced-geometry",
+93: SEQUENCE
+94: REF 'draw-enhanced-geometry-attlist',
+95: INTERLEAVE
+96: CHOICE
+97: ATTRIBUTE "draw:type",
+98: REF 'custom-shape-type',
+99: CHOICE
+100: VALUE 'non-primitive',
+100: REF 'string',
+101: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "svg:viewBox",
+98: LIST
+99: SEQUENCE
+100: REF 'integer',
+101: DATA 'integer',
+100: REF 'integer',
+101: DATA 'integer',
+100: REF 'integer',
+101: DATA 'integer',
+100: REF 'integer',
+101: DATA 'integer',
+97: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:mirror-vertical",
+99: REF 'boolean',
+100: CHOICE
+101: VALUE 'true',
+101: VALUE 'false',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:mirror-horizontal",
+99: REF 'boolean',
+100: CHOICE
+101: VALUE 'true',
+101: VALUE 'false',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-rotate-angle",
+98: REF 'double',
+99: DATA 'double',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-allowed",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-path-allowed",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:concentric-gradient-fill-allowed",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-brightness",
+98: REF 'percent',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-depth",
+98: LIST
+99: SEQUENCE
+100: REF 'length',
+101: DATA 'string',
+100: REF 'double',
+101: DATA 'double',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-diffusion",
+98: REF 'percent',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-number-of-line-segments",
+98: REF 'integer',
+99: DATA 'integer',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-light-face",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-first-light-harsh",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-second-light-harsh",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-first-light-level",
+98: REF 'percent',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-second-light-level",
+98: REF 'percent',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-first-light-direction",
+98: REF 'vector3D',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-second-light-direction",
+98: REF 'vector3D',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-metal",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "dr3d:shade-mode",
+98: CHOICE
+99: VALUE 'flat',
+99: VALUE 'phong',
+99: VALUE 'gouraud',
+99: VALUE 'draft',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-rotation-angle",
+98: LIST
+99: SEQUENCE
+100: REF 'double',
+101: DATA 'double',
+100: REF 'double',
+101: DATA 'double',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-rotation-center",
+98: REF 'vector3D',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-shininess",
+98: REF 'percent',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-skew",
+98: LIST
+99: SEQUENCE
+100: REF 'double',
+101: DATA 'double',
+100: REF 'double',
+101: DATA 'double',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-specularity",
+98: REF 'percent',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "dr3d:projection",
+98: CHOICE
+99: VALUE 'parallel',
+99: VALUE 'perspective',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-viewpoint",
+98: REF 'point3D',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-origin",
+98: LIST
+99: SEQUENCE
+100: REF 'double',
+101: DATA 'double',
+100: REF 'double',
+101: DATA 'double',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:extrusion-color",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:enhanced-path",
+98: REF 'string',
+99: DATA 'string',
+97: EPSILON
+96: SEQUENCE
+97: CHOICE
+98: ATTRIBUTE "draw:path-stretchpoint-x",
+99: REF 'double',
+100: DATA 'double',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "draw:path-stretchpoint-y",
+99: REF 'double',
+100: DATA 'double',
+98: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-areas",
+98: REF 'string',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:glue-points",
+98: REF 'string',
+99: DATA 'string',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:glue-point-type",
+98: CHOICE
+99: VALUE 'none',
+99: VALUE 'segments',
+99: VALUE 'rectangle',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:glue-point-leaving-directions",
+98: STRING
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-path",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-path-mode",
+98: CHOICE
+99: VALUE 'normal',
+99: VALUE 'path',
+99: VALUE 'shape',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-path-scale",
+98: CHOICE
+99: VALUE 'path',
+99: VALUE 'shape',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:text-path-same-letter-heights",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "draw:modifiers",
+98: REF 'string',
+99: DATA 'string',
+97: EPSILON
+94: CHOICE
+95: ONEOREMORE
+96: REF 'draw-equation',
+97: ELEMENT "draw:equation",
+98: REF 'draw-equation-attlist',
+99: INTERLEAVE
+100: CHOICE
+101: ATTRIBUTE "draw:name",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:formula",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+95: EPSILON
+94: CHOICE
+95: ONEOREMORE
+96: REF 'draw-handle',
+97: ELEMENT "draw:handle",
+98: REF 'draw-handle-attlist',
+99: INTERLEAVE
+100: CHOICE
+101: ATTRIBUTE "draw:handle-mirror-vertical",
+102: REF 'boolean',
+103: CHOICE
+104: VALUE 'true',
+104: VALUE 'false',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-mirror-horizontal",
+102: REF 'boolean',
+103: CHOICE
+104: VALUE 'true',
+104: VALUE 'false',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-switched",
+102: REF 'boolean',
+103: CHOICE
+104: VALUE 'true',
+104: VALUE 'false',
+101: EPSILON
+100: ATTRIBUTE "draw:handle-position",
+101: REF 'string',
+102: DATA 'string',
+100: CHOICE
+101: ATTRIBUTE "draw:handle-range-x-minimum",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-range-x-maximum",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-range-y-minimum",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-range-y-maximum",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-polar",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-radius-range-minimum",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+100: CHOICE
+101: ATTRIBUTE "draw:handle-radius-range-maximum",
+102: REF 'string',
+103: DATA 'string',
+101: EPSILON
+95: EPSILON
+91: EPSILON
+85: REF 'change-marks',
+86: CHOICE
+87: ELEMENT "text:change",
+88: REF 'change-mark-attr',
+89: ATTRIBUTE "text:change-id",
+90: REF 'IDREF',
+91: DATA 'IDREF',
+87: ELEMENT "text:change-start",
+88: REF 'change-mark-attr',
+89: ATTRIBUTE "text:change-id",
+90: REF 'IDREF',
+91: DATA 'IDREF',
+87: ELEMENT "text:change-end",
+88: REF 'change-mark-attr',
+89: ATTRIBUTE "text:change-id",
+90: REF 'IDREF',
+91: DATA 'IDREF',
+83: REF 'text-index-title',
+84: ELEMENT "text:index-title",
+85: SEQUENCE
+86: REF 'sectionAttr',
+87: INTERLEAVE
+88: CHOICE
+89: ATTRIBUTE "text:style-name",
+90: REF 'styleNameRef',
+91: CHOICE
+92: DATA 'NCName',
+92: EPSILON
+89: EPSILON
+88: ATTRIBUTE "text:name",
+89: REF 'string',
+90: DATA 'string',
+88: CHOICE
+89: ATTRIBUTE "text:protected",
+90: REF 'boolean',
+91: CHOICE
+92: VALUE 'true',
+92: VALUE 'false',
+89: EPSILON
+88: CHOICE
+89: ATTRIBUTE "text:protection-key",
+90: REF 'string',
+91: DATA 'string',
+89: EPSILON
+86: CHOICE
+87: ONEOREMORE
+88: REF 'index-content-main',
+89: CHOICE
+90: REF 'text-content',
+91: CHOICE
+92: REF 'text-h',
+92: REF 'text-p',
+92: REF 'text-list',
+92: REF 'text-numbered-paragraph',
+92: REF 'table-table',
+92: REF 'draw-a',
+92: REF 'text-section',
+92: REF 'text-table-of-content',
+92: REF 'text-illustration-index',
+92: REF 'text-table-index',
+92: REF 'text-object-index',
+92: REF 'text-user-index',
+92: REF 'text-alphabetical-index',
+92: REF 'text-bibliography',
+92: REF 'shape',
+93: CHOICE
+94: REF 'draw-rect',
+94: REF 'draw-line',
+94: REF 'draw-polyline',
+94: REF 'draw-polygon',
+94: REF 'draw-regular-polygon',
+94: REF 'draw-path',
+94: REF 'draw-circle',
+94: REF 'draw-ellipse',
+94: REF 'draw-g',
+94: REF 'draw-page-thumbnail',
+94: REF 'draw-frame',
+94: REF 'draw-measure',
+94: REF 'draw-caption',
+94: REF 'draw-connector',
+94: REF 'draw-control',
+94: REF 'dr3d-scene',
+94: REF 'draw-custom-shape',
+92: REF 'change-marks',
+93: CHOICE
+90: REF 'text-index-title',
+87: EPSILON
+80: EPSILON
+74: REF 'text-illustration-index',
+74: REF 'text-table-index',
+74: REF 'text-object-index',
+74: REF 'text-user-index',
+74: REF 'text-alphabetical-index',
+74: REF 'text-bibliography',
+74: REF 'shape',
+75: CHOICE
+76: REF 'draw-rect',
+76: REF 'draw-line',
+76: REF 'draw-polyline',
+76: REF 'draw-polygon',
+76: REF 'draw-regular-polygon',
+76: REF 'draw-path',
+76: REF 'draw-circle',
+76: REF 'draw-ellipse',
+76: REF 'draw-g',
+76: REF 'draw-page-thumbnail',
+76: REF 'draw-frame',
+76: REF 'draw-measure',
+76: REF 'draw-caption',
+76: REF 'draw-connector',
+76: REF 'draw-control',
+76: REF 'dr3d-scene',
+76: REF 'draw-custom-shape',
+74: REF 'change-marks',
+75: CHOICE
+71: EPSILON
+67: REF 'text-table-of-content',
+67: REF 'text-illustration-index',
+67: REF 'text-table-index',
+67: REF 'text-object-index',
+67: REF 'text-user-index',
+67: REF 'text-alphabetical-index',
+67: REF 'text-bibliography',
+67: REF 'shape',
+68: CHOICE
+69: REF 'draw-rect',
+69: REF 'draw-line',
+69: REF 'draw-polyline',
+69: REF 'draw-polygon',
+69: REF 'draw-regular-polygon',
+69: REF 'draw-path',
+69: REF 'draw-circle',
+69: REF 'draw-ellipse',
+69: REF 'draw-g',
+69: REF 'draw-page-thumbnail',
+69: REF 'draw-frame',
+69: REF 'draw-measure',
+69: REF 'draw-caption',
+69: REF 'draw-connector',
+69: REF 'draw-control',
+69: REF 'dr3d-scene',
+69: REF 'draw-custom-shape',
+67: REF 'change-marks',
+68: CHOICE
+64: EPSILON
+60: REF 'draw-image',
+61: ELEMENT "draw:image",
+62: SEQUENCE
+63: REF 'draw-image-attlist',
+64: CHOICE
+65: ATTRIBUTE "draw:filter-name",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: CHOICE
+64: REF 'common-draw-data-attlist',
+65: SEQUENCE
+66: ATTRIBUTE "xlink:href",
+67: REF 'anyURI',
+68: DATA 'anyURI',
+66: CHOICE
+67: ATTRIBUTE "xlink:type",
+68: VALUE 'simple',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:show",
+68: VALUE 'embed',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:actuate",
+68: VALUE 'onLoad',
+67: EPSILON
+64: REF 'office-binary-data',
+63: REF 'draw-text',
+64: CHOICE
+65: ONEOREMORE
+66: CHOICE
+67: REF 'text-p',
+67: REF 'text-list',
+65: EPSILON
+60: REF 'draw-object',
+61: ELEMENT "draw:object",
+62: SEQUENCE
+63: REF 'draw-object-attlist',
+64: CHOICE
+65: ATTRIBUTE "draw:notify-on-update-of-ranges",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: CHOICE
+64: REF 'common-draw-data-attlist',
+65: SEQUENCE
+66: ATTRIBUTE "xlink:href",
+67: REF 'anyURI',
+68: DATA 'anyURI',
+66: CHOICE
+67: ATTRIBUTE "xlink:type",
+68: VALUE 'simple',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:show",
+68: VALUE 'embed',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:actuate",
+68: VALUE 'onLoad',
+67: EPSILON
+64: REF 'office-document',
+64: REF 'math-math',
+65: ELEMENT "math:math",
+66: REF 'mathMarkup',
+67: ONEOREMORE
+68: CHOICE
+69: ATTRIBUTE "*",
+70: STRING
+69: STRING
+69: ELEMENT "*",
+70: REF 'mathMarkup',
+71: ONEOREMORE
+72: CHOICE
+73: ATTRIBUTE "*",
+74: STRING
+73: STRING
+60: REF 'draw-object-ole',
+61: ELEMENT "draw:object-ole",
+62: SEQUENCE
+63: REF 'draw-object-ole-attlist',
+64: CHOICE
+65: ATTRIBUTE "draw:class-id",
+66: STRING
+65: EPSILON
+63: CHOICE
+64: REF 'common-draw-data-attlist',
+65: SEQUENCE
+66: ATTRIBUTE "xlink:href",
+67: REF 'anyURI',
+68: DATA 'anyURI',
+66: CHOICE
+67: ATTRIBUTE "xlink:type",
+68: VALUE 'simple',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:show",
+68: VALUE 'embed',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:actuate",
+68: VALUE 'onLoad',
+67: EPSILON
+64: REF 'office-binary-data',
+60: REF 'draw-applet',
+61: ELEMENT "draw:applet",
+62: SEQUENCE
+63: REF 'draw-applet-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "draw:code",
+67: STRING
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "draw:object",
+67: STRING
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "draw:archive",
+67: STRING
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "draw:may-script",
+67: REF 'boolean',
+68: CHOICE
+69: VALUE 'true',
+69: VALUE 'false',
+66: EPSILON
+63: CHOICE
+64: REF 'common-draw-data-attlist',
+65: SEQUENCE
+66: ATTRIBUTE "xlink:href",
+67: REF 'anyURI',
+68: DATA 'anyURI',
+66: CHOICE
+67: ATTRIBUTE "xlink:type",
+68: VALUE 'simple',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:show",
+68: VALUE 'embed',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "xlink:actuate",
+68: VALUE 'onLoad',
+67: EPSILON
+64: EPSILON
+63: CHOICE
+64: ONEOREMORE
+65: REF 'draw-param',
+66: ELEMENT "draw:param",
+67: REF 'draw-param-attlist',
+68: INTERLEAVE
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: STRING
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "draw:value",
+71: STRING
+70: EPSILON
+64: EPSILON
+60: REF 'draw-floating-frame',
+61: ELEMENT "draw:floating-frame",
+62: SEQUENCE
+63: REF 'draw-floating-frame-attlist',
+64: CHOICE
+65: ATTRIBUTE "draw:frame-name",
+66: REF 'string',
+67: DATA 'string',
+65: EPSILON
+63: REF 'common-draw-data-attlist',
+64: SEQUENCE
+65: ATTRIBUTE "xlink:href",
+66: REF 'anyURI',
+67: DATA 'anyURI',
+65: CHOICE
+66: ATTRIBUTE "xlink:type",
+67: VALUE 'simple',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "xlink:show",
+67: VALUE 'embed',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "xlink:actuate",
+67: VALUE 'onLoad',
+66: EPSILON
+60: REF 'draw-plugin',
+61: ELEMENT "draw:plugin",
+62: SEQUENCE
+63: REF 'draw-plugin-attlist',
+64: CHOICE
+65: ATTRIBUTE "draw:mime-type",
+66: STRING
+65: EPSILON
+63: REF 'common-draw-data-attlist',
+64: SEQUENCE
+65: ATTRIBUTE "xlink:href",
+66: REF 'anyURI',
+67: DATA 'anyURI',
+65: CHOICE
+66: ATTRIBUTE "xlink:type",
+67: VALUE 'simple',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "xlink:show",
+67: VALUE 'embed',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "xlink:actuate",
+67: VALUE 'onLoad',
+66: EPSILON
+63: CHOICE
+64: ONEOREMORE
+65: REF 'draw-param',
+64: EPSILON
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: CHOICE
+58: REF 'draw-image-map',
+59: ELEMENT "draw:image-map",
+60: CHOICE
+61: ONEOREMORE
+62: CHOICE
+63: REF 'draw-area-rectangle',
+64: ELEMENT "draw:area-rectangle",
+65: SEQUENCE
+66: REF 'common-draw-area-attlist',
+67: INTERLEAVE
+68: SEQUENCE
+69: CHOICE
+70: ATTRIBUTE "xlink:href",
+71: REF 'anyURI',
+72: DATA 'anyURI',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "xlink:type",
+71: VALUE 'simple',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "office:target-frame-name",
+71: REF 'targetFrameName',
+72: CHOICE
+73: VALUE '_self',
+73: VALUE '_blank',
+73: VALUE '_parent',
+73: VALUE '_top',
+73: REF 'string',
+74: DATA 'string',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "xlink:show",
+71: CHOICE
+72: VALUE 'new',
+72: VALUE 'replace',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "office:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "draw:nohref",
+70: VALUE 'nohref',
+69: EPSILON
+66: ATTRIBUTE "svg:x",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: ATTRIBUTE "svg:y",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: ATTRIBUTE "svg:width",
+67: REF 'length',
+68: DATA 'string',
+66: ATTRIBUTE "svg:height",
+67: REF 'length',
+68: DATA 'string',
+66: CHOICE
+67: REF 'svg-desc',
+68: ELEMENT "svg:desc",
+69: STRING
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+63: REF 'draw-area-circle',
+64: ELEMENT "draw:area-circle",
+65: SEQUENCE
+66: REF 'common-draw-area-attlist',
+67: INTERLEAVE
+68: SEQUENCE
+69: CHOICE
+70: ATTRIBUTE "xlink:href",
+71: REF 'anyURI',
+72: DATA 'anyURI',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "xlink:type",
+71: VALUE 'simple',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "office:target-frame-name",
+71: REF 'targetFrameName',
+72: CHOICE
+73: VALUE '_self',
+73: VALUE '_blank',
+73: VALUE '_parent',
+73: VALUE '_top',
+73: REF 'string',
+74: DATA 'string',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "xlink:show",
+71: CHOICE
+72: VALUE 'new',
+72: VALUE 'replace',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "office:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "draw:nohref",
+70: VALUE 'nohref',
+69: EPSILON
+66: ATTRIBUTE "svg:cx",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: ATTRIBUTE "svg:cy",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: ATTRIBUTE "svg:r",
+67: REF 'length',
+68: DATA 'string',
+66: CHOICE
+67: REF 'svg-desc',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+63: REF 'draw-area-polygon',
+64: ELEMENT "draw:area-polygon",
+65: SEQUENCE
+66: REF 'common-draw-area-attlist',
+67: INTERLEAVE
+68: SEQUENCE
+69: CHOICE
+70: ATTRIBUTE "xlink:href",
+71: REF 'anyURI',
+72: DATA 'anyURI',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "xlink:type",
+71: VALUE 'simple',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "office:target-frame-name",
+71: REF 'targetFrameName',
+72: CHOICE
+73: VALUE '_self',
+73: VALUE '_blank',
+73: VALUE '_parent',
+73: VALUE '_top',
+73: REF 'string',
+74: DATA 'string',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "xlink:show",
+71: CHOICE
+72: VALUE 'new',
+72: VALUE 'replace',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "office:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "draw:nohref",
+70: VALUE 'nohref',
+69: EPSILON
+66: ATTRIBUTE "svg:x",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: ATTRIBUTE "svg:y",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: ATTRIBUTE "svg:width",
+67: REF 'length',
+68: DATA 'string',
+66: ATTRIBUTE "svg:height",
+67: REF 'length',
+68: DATA 'string',
+66: REF 'common-draw-viewbox-attlist',
+67: ATTRIBUTE "svg:viewBox",
+68: LIST
+69: SEQUENCE
+70: REF 'integer',
+71: DATA 'integer',
+70: REF 'integer',
+71: DATA 'integer',
+70: REF 'integer',
+71: DATA 'integer',
+70: REF 'integer',
+71: DATA 'integer',
+66: REF 'common-draw-points-attlist',
+67: ATTRIBUTE "draw:points",
+68: REF 'points',
+69: DATA 'string',
+66: CHOICE
+67: REF 'svg-desc',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'draw-contour-polygon',
+59: ELEMENT "draw:contour-polygon",
+60: SEQUENCE
+61: REF 'common-contour-attlist',
+62: ATTRIBUTE "draw:recreate-on-edit",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+61: REF 'common-draw-size-attlist',
+62: SEQUENCE
+63: CHOICE
+64: ATTRIBUTE "svg:width",
+65: REF 'length',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "svg:height",
+65: REF 'length',
+66: DATA 'string',
+64: EPSILON
+61: REF 'common-draw-viewbox-attlist',
+62: ATTRIBUTE "svg:viewBox",
+63: LIST
+64: SEQUENCE
+65: REF 'integer',
+66: DATA 'integer',
+65: REF 'integer',
+66: DATA 'integer',
+65: REF 'integer',
+66: DATA 'integer',
+65: REF 'integer',
+66: DATA 'integer',
+61: REF 'common-draw-points-attlist',
+62: ATTRIBUTE "draw:points",
+63: REF 'points',
+64: DATA 'string',
+58: REF 'draw-contour-path',
+59: ELEMENT "draw:contour-path",
+60: SEQUENCE
+61: REF 'common-contour-attlist',
+62: ATTRIBUTE "draw:recreate-on-edit",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+61: REF 'common-draw-size-attlist',
+62: SEQUENCE
+63: CHOICE
+64: ATTRIBUTE "svg:width",
+65: REF 'length',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "svg:height",
+65: REF 'length',
+66: DATA 'string',
+64: EPSILON
+61: REF 'common-draw-viewbox-attlist',
+62: ATTRIBUTE "svg:viewBox",
+63: LIST
+64: SEQUENCE
+65: REF 'integer',
+66: DATA 'integer',
+65: REF 'integer',
+66: DATA 'integer',
+65: REF 'integer',
+66: DATA 'integer',
+65: REF 'integer',
+66: DATA 'integer',
+61: REF 'common-draw-path-data-attlist',
+62: ATTRIBUTE "svg:d",
+63: REF 'pathData',
+64: DATA 'string',
+58: EPSILON
+54: REF 'draw-measure',
+54: REF 'draw-caption',
+54: REF 'draw-connector',
+54: REF 'draw-control',
+54: REF 'dr3d-scene',
+54: REF 'draw-custom-shape',
+51: EPSILON
+47: REF 'draw-page-thumbnail',
+47: REF 'draw-frame',
+47: REF 'draw-measure',
+47: REF 'draw-caption',
+47: REF 'draw-connector',
+47: REF 'draw-control',
+47: REF 'dr3d-scene',
+47: REF 'draw-custom-shape',
+42: EPSILON
+41: REF 'table-columns-and-groups',
+42: ONEOREMORE
+43: CHOICE
+44: REF 'table-table-column-group',
+45: ELEMENT "table:table-column-group",
+46: SEQUENCE
+47: REF 'table-table-column-group-attlist',
+48: CHOICE
+49: ATTRIBUTE "table:display",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: REF 'table-columns-and-groups',
+48: ONEOREMORE
+49: CHOICE
+50: REF 'table-table-column-group',
+50: REF 'table-columns-no-group',
+51: CHOICE
+52: SEQUENCE
+53: REF 'table-columns',
+54: CHOICE
+55: REF 'table-table-columns',
+56: ELEMENT "table:table-columns",
+57: ONEOREMORE
+58: REF 'table-table-column',
+59: ELEMENT "table:table-column",
+60: REF 'table-table-column-attlist',
+61: INTERLEAVE
+62: CHOICE
+63: ATTRIBUTE "table:number-columns-repeated",
+64: REF 'positiveInteger',
+65: DATA 'positiveInteger',
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "table:style-name",
+64: REF 'styleNameRef',
+65: CHOICE
+66: DATA 'NCName',
+66: EPSILON
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "table:visibility",
+64: REF 'table-visibility-value',
+65: CHOICE
+66: VALUE 'visible',
+66: VALUE 'collapse',
+66: VALUE 'filter',
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "table:default-cell-style-name",
+64: REF 'styleNameRef',
+65: CHOICE
+66: DATA 'NCName',
+66: EPSILON
+63: EPSILON
+55: ONEOREMORE
+56: REF 'table-table-column',
+53: CHOICE
+54: SEQUENCE
+55: REF 'table-table-header-columns',
+56: ELEMENT "table:table-header-columns",
+57: ONEOREMORE
+58: REF 'table-table-column',
+55: CHOICE
+56: REF 'table-columns',
+57: CHOICE
+58: REF 'table-table-columns',
+58: ONEOREMORE
+59: REF 'table-table-column',
+56: EPSILON
+54: EPSILON
+52: SEQUENCE
+53: REF 'table-table-header-columns',
+53: CHOICE
+54: REF 'table-columns',
+55: CHOICE
+56: REF 'table-table-columns',
+56: ONEOREMORE
+57: REF 'table-table-column',
+54: EPSILON
+44: REF 'table-columns-no-group',
+45: CHOICE
+46: SEQUENCE
+47: REF 'table-columns',
+48: CHOICE
+49: REF 'table-table-columns',
+49: ONEOREMORE
+50: REF 'table-table-column',
+47: CHOICE
+48: SEQUENCE
+49: REF 'table-table-header-columns',
+49: CHOICE
+50: REF 'table-columns',
+51: CHOICE
+52: REF 'table-table-columns',
+52: ONEOREMORE
+53: REF 'table-table-column',
+50: EPSILON
+48: EPSILON
+46: SEQUENCE
+47: REF 'table-table-header-columns',
+47: CHOICE
+48: REF 'table-columns',
+49: CHOICE
+50: REF 'table-table-columns',
+50: ONEOREMORE
+51: REF 'table-table-column',
+48: EPSILON
+41: REF 'table-rows-and-groups',
+42: ONEOREMORE
+43: CHOICE
+44: REF 'table-table-row-group',
+45: ELEMENT "table:table-row-group",
+46: SEQUENCE
+47: REF 'table-table-row-group-attlist',
+48: CHOICE
+49: ATTRIBUTE "table:display",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: REF 'table-rows-and-groups',
+48: ONEOREMORE
+49: CHOICE
+50: REF 'table-table-row-group',
+50: REF 'table-rows-no-group',
+51: CHOICE
+52: SEQUENCE
+53: REF 'table-rows',
+54: CHOICE
+55: REF 'table-table-rows',
+56: ELEMENT "table:table-rows",
+57: ONEOREMORE
+58: REF 'table-table-row',
+59: ELEMENT "table:table-row",
+60: SEQUENCE
+61: REF 'table-table-row-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:number-rows-repeated",
+65: REF 'positiveInteger',
+66: DATA 'positiveInteger',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:style-name",
+65: REF 'styleNameRef',
+66: CHOICE
+67: DATA 'NCName',
+67: EPSILON
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:default-cell-style-name",
+65: REF 'styleNameRef',
+66: CHOICE
+67: DATA 'NCName',
+67: EPSILON
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:visibility",
+65: REF 'table-visibility-value',
+66: CHOICE
+67: VALUE 'visible',
+67: VALUE 'collapse',
+67: VALUE 'filter',
+64: EPSILON
+61: ONEOREMORE
+62: CHOICE
+63: REF 'table-table-cell',
+64: ELEMENT "table:table-cell",
+65: SEQUENCE
+66: REF 'table-table-cell-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "table:number-columns-repeated",
+70: REF 'positiveInteger',
+71: DATA 'positiveInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:style-name",
+70: REF 'styleNameRef',
+71: CHOICE
+72: DATA 'NCName',
+72: EPSILON
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:content-validation-name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:formula",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: REF 'common-value-and-type-attlist',
+70: CHOICE
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'float',
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'percentage',
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'currency',
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+72: CHOICE
+73: ATTRIBUTE "office:currency",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'date',
+72: ATTRIBUTE "office:date-value",
+73: REF 'dateOrDateTime',
+74: CHOICE
+75: DATA 'date',
+75: DATA 'dateTime',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'time',
+72: ATTRIBUTE "office:time-value",
+73: REF 'duration',
+74: DATA 'duration',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'boolean',
+72: ATTRIBUTE "office:boolean-value",
+73: REF 'boolean',
+74: CHOICE
+75: VALUE 'true',
+75: VALUE 'false',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'string',
+72: CHOICE
+73: ATTRIBUTE "office:string-value",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:protect",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'table-table-cell-attlist-extra',
+67: INTERLEAVE
+68: SEQUENCE
+69: CHOICE
+70: ATTRIBUTE "table:number-columns-spanned",
+71: REF 'positiveInteger',
+72: DATA 'positiveInteger',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "table:number-rows-spanned",
+71: REF 'positiveInteger',
+72: DATA 'positiveInteger',
+70: EPSILON
+68: SEQUENCE
+69: CHOICE
+70: ATTRIBUTE "table:number-matrix-columns-spanned",
+71: REF 'positiveInteger',
+72: DATA 'positiveInteger',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "table:number-matrix-rows-spanned",
+71: REF 'positiveInteger',
+72: DATA 'positiveInteger',
+70: EPSILON
+66: REF 'table-table-cell-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'table-cell-range-source',
+70: ELEMENT "table:cell-range-source",
+71: SEQUENCE
+72: REF 'table-table-cell-range-source-attlist',
+73: INTERLEAVE
+74: ATTRIBUTE "table:name",
+75: REF 'string',
+76: DATA 'string',
+74: SEQUENCE
+75: ATTRIBUTE "table:last-column-spanned",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: ATTRIBUTE "table:last-row-spanned",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+72: REF 'table-linked-source-attlist',
+73: INTERLEAVE
+74: SEQUENCE
+75: CHOICE
+76: ATTRIBUTE "xlink:type",
+77: VALUE 'simple',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "xlink:actuate",
+77: VALUE 'onRequest',
+76: EPSILON
+75: ATTRIBUTE "xlink:href",
+76: REF 'anyURI',
+77: DATA 'anyURI',
+74: CHOICE
+75: ATTRIBUTE "table:filter-name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:filter-options",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:refresh-delay",
+76: REF 'duration',
+77: DATA 'duration',
+75: EPSILON
+69: EPSILON
+68: CHOICE
+69: REF 'office-annotation',
+70: ELEMENT "office:annotation",
+71: SEQUENCE
+72: REF 'office-annotation-attlist',
+73: CHOICE
+74: ATTRIBUTE "office:display",
+75: REF 'boolean',
+76: CHOICE
+77: VALUE 'true',
+77: VALUE 'false',
+74: EPSILON
+72: REF 'draw-caption-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: SEQUENCE
+76: ATTRIBUTE "draw:caption-point-x",
+77: REF 'coordinate',
+78: REF 'length',
+79: DATA 'string',
+76: ATTRIBUTE "draw:caption-point-y",
+77: REF 'coordinate',
+78: REF 'length',
+79: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "draw:corner-radius",
+76: REF 'nonNegativeLength',
+77: DATA 'string',
+75: EPSILON
+72: REF 'common-draw-position-attlist',
+73: SEQUENCE
+74: CHOICE
+75: ATTRIBUTE "svg:x",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "svg:y",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: EPSILON
+72: REF 'common-draw-size-attlist',
+73: SEQUENCE
+74: CHOICE
+75: ATTRIBUTE "svg:width",
+76: REF 'length',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "svg:height",
+76: REF 'length',
+77: DATA 'string',
+75: EPSILON
+72: REF 'common-draw-shape-with-text-and-styles-attlist',
+73: SEQUENCE
+74: REF 'common-draw-shape-with-styles-attlist',
+75: SEQUENCE
+76: REF 'common-draw-z-index-attlist',
+77: CHOICE
+78: ATTRIBUTE "draw:z-index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+76: REF 'common-draw-id-attlist',
+77: CHOICE
+78: ATTRIBUTE "draw:id",
+79: REF 'ID',
+80: DATA 'ID',
+78: EPSILON
+76: REF 'common-draw-layer-name-attlist',
+77: CHOICE
+78: ATTRIBUTE "draw:layer",
+79: DATA 'string',
+78: EPSILON
+76: REF 'common-draw-style-name-attlist',
+77: CHOICE
+78: SEQUENCE
+79: CHOICE
+80: ATTRIBUTE "draw:style-name",
+81: REF 'styleNameRef',
+82: CHOICE
+83: DATA 'NCName',
+83: EPSILON
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "draw:class-names",
+81: REF 'styleNameRefs',
+82: LIST
+83: CHOICE
+84: ONEOREMORE
+85: DATA 'NCName',
+84: EPSILON
+80: EPSILON
+78: SEQUENCE
+79: CHOICE
+80: ATTRIBUTE "presentation:style-name",
+81: REF 'styleNameRef',
+82: CHOICE
+83: DATA 'NCName',
+83: EPSILON
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "presentation:class-names",
+81: REF 'styleNameRefs',
+82: LIST
+83: CHOICE
+84: ONEOREMORE
+85: DATA 'NCName',
+84: EPSILON
+80: EPSILON
+76: REF 'common-draw-transform-attlist',
+77: CHOICE
+78: ATTRIBUTE "draw:transform",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'common-draw-name-attlist',
+77: CHOICE
+78: ATTRIBUTE "draw:name",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'common-text-spreadsheet-shape-attlist',
+77: INTERLEAVE
+78: SEQUENCE
+79: CHOICE
+80: ATTRIBUTE "table:end-cell-address",
+81: REF 'cellAddress',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "table:end-x",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "table:end-y",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: EPSILON
+78: CHOICE
+79: ATTRIBUTE "table:table-background",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+78: REF 'common-text-anchor-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "text:anchor-type",
+82: CHOICE
+83: VALUE 'page',
+83: VALUE 'frame',
+83: VALUE 'paragraph',
+83: VALUE 'char',
+83: VALUE 'as-char',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "text:anchor-page-number",
+82: REF 'positiveInteger',
+83: DATA 'positiveInteger',
+81: EPSILON
+74: REF 'common-draw-text-style-name-attlist',
+75: CHOICE
+76: ATTRIBUTE "draw:text-style-name",
+77: REF 'styleNameRef',
+78: CHOICE
+79: DATA 'NCName',
+79: EPSILON
+76: EPSILON
+72: CHOICE
+73: REF 'dc-creator',
+73: EPSILON
+72: CHOICE
+73: REF 'dc-date',
+73: EPSILON
+72: CHOICE
+73: REF 'meta-date-string',
+74: ELEMENT "meta:date-string",
+75: REF 'string',
+76: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ONEOREMORE
+74: CHOICE
+75: REF 'text-p',
+75: REF 'text-list',
+73: EPSILON
+69: EPSILON
+68: CHOICE
+69: REF 'table-detective',
+70: ELEMENT "table:detective",
+71: SEQUENCE
+72: CHOICE
+73: ONEOREMORE
+74: REF 'table-highlighted-range',
+75: ELEMENT "table:highlighted-range",
+76: CHOICE
+77: REF 'table-highlighted-range-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "table:cell-range-address",
+81: REF 'cellRangeAddress',
+82: DATA 'string',
+80: EPSILON
+79: ATTRIBUTE "table:direction",
+80: CHOICE
+81: VALUE 'from-another-table',
+81: VALUE 'to-another-table',
+81: VALUE 'from-same-table',
+79: CHOICE
+80: ATTRIBUTE "table:contains-error",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+77: REF 'table-highlighted-range-attlist-invalid',
+78: ATTRIBUTE "table:marked-invalid",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+73: EPSILON
+72: CHOICE
+73: ONEOREMORE
+74: REF 'table-operation',
+75: ELEMENT "table:operation",
+76: REF 'table-operation-attlist',
+77: INTERLEAVE
+78: ATTRIBUTE "table:name",
+79: CHOICE
+80: VALUE 'trace-dependents',
+80: VALUE 'remove-dependents',
+80: VALUE 'trace-precedents',
+80: VALUE 'remove-precedents',
+80: VALUE 'trace-errors',
+78: ATTRIBUTE "table:index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+73: EPSILON
+69: EPSILON
+68: CHOICE
+69: ONEOREMORE
+70: REF 'text-content',
+71: CHOICE
+72: REF 'text-h',
+72: REF 'text-p',
+72: REF 'text-list',
+72: REF 'text-numbered-paragraph',
+72: REF 'table-table',
+72: REF 'draw-a',
+72: REF 'text-section',
+72: REF 'text-table-of-content',
+72: REF 'text-illustration-index',
+72: REF 'text-table-index',
+72: REF 'text-object-index',
+72: REF 'text-user-index',
+72: REF 'text-alphabetical-index',
+72: REF 'text-bibliography',
+72: REF 'shape',
+73: CHOICE
+74: REF 'draw-rect',
+74: REF 'draw-line',
+74: REF 'draw-polyline',
+74: REF 'draw-polygon',
+74: REF 'draw-regular-polygon',
+74: REF 'draw-path',
+74: REF 'draw-circle',
+74: REF 'draw-ellipse',
+74: REF 'draw-g',
+74: REF 'draw-page-thumbnail',
+74: REF 'draw-frame',
+74: REF 'draw-measure',
+74: REF 'draw-caption',
+74: REF 'draw-connector',
+74: REF 'draw-control',
+74: REF 'dr3d-scene',
+74: REF 'draw-custom-shape',
+72: REF 'change-marks',
+73: CHOICE
+69: EPSILON
+63: REF 'table-covered-table-cell',
+64: ELEMENT "table:covered-table-cell",
+65: SEQUENCE
+66: REF 'table-table-cell-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "table:number-columns-repeated",
+70: REF 'positiveInteger',
+71: DATA 'positiveInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:style-name",
+70: REF 'styleNameRef',
+71: CHOICE
+72: DATA 'NCName',
+72: EPSILON
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:content-validation-name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:formula",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: REF 'common-value-and-type-attlist',
+70: CHOICE
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'float',
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'percentage',
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'currency',
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+72: CHOICE
+73: ATTRIBUTE "office:currency",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'date',
+72: ATTRIBUTE "office:date-value",
+73: REF 'dateOrDateTime',
+74: CHOICE
+75: DATA 'date',
+75: DATA 'dateTime',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'time',
+72: ATTRIBUTE "office:time-value",
+73: REF 'duration',
+74: DATA 'duration',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'boolean',
+72: ATTRIBUTE "office:boolean-value",
+73: REF 'boolean',
+74: CHOICE
+75: VALUE 'true',
+75: VALUE 'false',
+71: SEQUENCE
+72: ATTRIBUTE "office:value-type",
+73: VALUE 'string',
+72: CHOICE
+73: ATTRIBUTE "office:string-value",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "table:protect",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'table-table-cell-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'table-cell-range-source',
+69: EPSILON
+68: CHOICE
+69: REF 'office-annotation',
+69: EPSILON
+68: CHOICE
+69: REF 'table-detective',
+69: EPSILON
+68: CHOICE
+69: ONEOREMORE
+70: REF 'text-content',
+71: CHOICE
+72: REF 'text-h',
+72: REF 'text-p',
+72: REF 'text-list',
+72: REF 'text-numbered-paragraph',
+72: REF 'table-table',
+72: REF 'draw-a',
+72: REF 'text-section',
+72: REF 'text-table-of-content',
+72: REF 'text-illustration-index',
+72: REF 'text-table-index',
+72: REF 'text-object-index',
+72: REF 'text-user-index',
+72: REF 'text-alphabetical-index',
+72: REF 'text-bibliography',
+72: REF 'shape',
+73: CHOICE
+74: REF 'draw-rect',
+74: REF 'draw-line',
+74: REF 'draw-polyline',
+74: REF 'draw-polygon',
+74: REF 'draw-regular-polygon',
+74: REF 'draw-path',
+74: REF 'draw-circle',
+74: REF 'draw-ellipse',
+74: REF 'draw-g',
+74: REF 'draw-page-thumbnail',
+74: REF 'draw-frame',
+74: REF 'draw-measure',
+74: REF 'draw-caption',
+74: REF 'draw-connector',
+74: REF 'draw-control',
+74: REF 'dr3d-scene',
+74: REF 'draw-custom-shape',
+72: REF 'change-marks',
+73: CHOICE
+69: EPSILON
+55: ONEOREMORE
+56: REF 'table-table-row',
+53: CHOICE
+54: SEQUENCE
+55: REF 'table-table-header-rows',
+56: ELEMENT "table:table-header-rows",
+57: ONEOREMORE
+58: REF 'table-table-row',
+55: CHOICE
+56: REF 'table-rows',
+57: CHOICE
+58: REF 'table-table-rows',
+58: ONEOREMORE
+59: REF 'table-table-row',
+56: EPSILON
+54: EPSILON
+52: SEQUENCE
+53: REF 'table-table-header-rows',
+53: CHOICE
+54: REF 'table-rows',
+55: CHOICE
+56: REF 'table-table-rows',
+56: ONEOREMORE
+57: REF 'table-table-row',
+54: EPSILON
+44: REF 'table-rows-no-group',
+45: CHOICE
+46: SEQUENCE
+47: REF 'table-rows',
+48: CHOICE
+49: REF 'table-table-rows',
+49: ONEOREMORE
+50: REF 'table-table-row',
+47: CHOICE
+48: SEQUENCE
+49: REF 'table-table-header-rows',
+49: CHOICE
+50: REF 'table-rows',
+51: CHOICE
+52: REF 'table-table-rows',
+52: ONEOREMORE
+53: REF 'table-table-row',
+50: EPSILON
+48: EPSILON
+46: SEQUENCE
+47: REF 'table-table-header-rows',
+47: CHOICE
+48: REF 'table-rows',
+49: CHOICE
+50: REF 'table-table-rows',
+50: ONEOREMORE
+51: REF 'table-table-row',
+48: EPSILON
+38: REF 'draw-a',
+38: REF 'text-section',
+38: REF 'text-table-of-content',
+38: REF 'text-illustration-index',
+38: REF 'text-table-index',
+38: REF 'text-object-index',
+38: REF 'text-user-index',
+38: REF 'text-alphabetical-index',
+38: REF 'text-bibliography',
+38: REF 'shape',
+39: CHOICE
+40: REF 'draw-rect',
+40: REF 'draw-line',
+40: REF 'draw-polyline',
+40: REF 'draw-polygon',
+40: REF 'draw-regular-polygon',
+40: REF 'draw-path',
+40: REF 'draw-circle',
+40: REF 'draw-ellipse',
+40: REF 'draw-g',
+40: REF 'draw-page-thumbnail',
+40: REF 'draw-frame',
+40: REF 'draw-measure',
+40: REF 'draw-caption',
+40: REF 'draw-connector',
+40: REF 'draw-control',
+40: REF 'dr3d-scene',
+40: REF 'draw-custom-shape',
+38: REF 'change-marks',
+39: CHOICE
+35: EPSILON
+31: ELEMENT "text:ruby",
+32: SEQUENCE
+33: CHOICE
+34: ATTRIBUTE "text:style-name",
+35: REF 'styleNameRef',
+36: CHOICE
+37: DATA 'NCName',
+37: EPSILON
+34: EPSILON
+33: ELEMENT "text:ruby-base",
+34: REF 'paragraph-content',
+35: CHOICE
+36: STRING
+33: ELEMENT "text:ruby-text",
+34: SEQUENCE
+35: CHOICE
+36: ATTRIBUTE "text:style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+35: STRING
+31: REF 'office-annotation',
+31: REF 'change-marks',
+32: CHOICE
+31: REF 'shape',
+32: CHOICE
+33: REF 'draw-rect',
+33: REF 'draw-line',
+33: REF 'draw-polyline',
+33: REF 'draw-polygon',
+33: REF 'draw-regular-polygon',
+33: REF 'draw-path',
+33: REF 'draw-circle',
+33: REF 'draw-ellipse',
+33: REF 'draw-g',
+33: REF 'draw-page-thumbnail',
+33: REF 'draw-frame',
+33: REF 'draw-measure',
+33: REF 'draw-caption',
+33: REF 'draw-connector',
+33: REF 'draw-control',
+33: REF 'dr3d-scene',
+33: REF 'draw-custom-shape',
+31: REF 'draw-a',
+31: ELEMENT "text:date",
+32: SEQUENCE
+33: REF 'text-date-attlist',
+34: INTERLEAVE
+35: REF 'common-field-fixed-attlist',
+36: CHOICE
+37: ATTRIBUTE "text:fixed",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+35: REF 'common-field-data-style-name-attlist',
+36: CHOICE
+37: ATTRIBUTE "style:data-style-name",
+38: REF 'styleNameRef',
+39: CHOICE
+40: DATA 'NCName',
+40: EPSILON
+37: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:date-value",
+37: REF 'dateOrDateTime',
+38: CHOICE
+39: DATA 'date',
+39: DATA 'dateTime',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:date-adjust",
+37: REF 'duration',
+38: DATA 'duration',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:time",
+32: SEQUENCE
+33: REF 'text-time-attlist',
+34: INTERLEAVE
+35: REF 'common-field-fixed-attlist',
+36: CHOICE
+37: ATTRIBUTE "text:fixed",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+35: REF 'common-field-data-style-name-attlist',
+36: CHOICE
+37: ATTRIBUTE "style:data-style-name",
+38: REF 'styleNameRef',
+39: CHOICE
+40: DATA 'NCName',
+40: EPSILON
+37: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:time-value",
+37: REF 'timeOrDateTime',
+38: CHOICE
+39: DATA 'time',
+39: DATA 'dateTime',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:time-adjust",
+37: REF 'duration',
+38: DATA 'duration',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:page-number",
+32: SEQUENCE
+33: REF 'text-page-number-attlist',
+34: INTERLEAVE
+35: REF 'common-field-num-format-attlist',
+36: CHOICE
+37: REF 'common-num-format-attlist',
+38: CHOICE
+39: ATTRIBUTE "style:num-format",
+40: CHOICE
+41: VALUE '1',
+41: VALUE 'i',
+41: VALUE 'I',
+41: REF 'string',
+42: DATA 'string',
+41: EPSILON
+39: SEQUENCE
+40: ATTRIBUTE "style:num-format",
+41: CHOICE
+42: VALUE 'a',
+42: VALUE 'A',
+40: REF 'style-num-letter-sync-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:num-letter-sync",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+42: EPSILON
+39: EPSILON
+37: EPSILON
+35: REF 'common-field-fixed-attlist',
+36: CHOICE
+37: ATTRIBUTE "text:fixed",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:page-adjust",
+37: REF 'integer',
+38: DATA 'integer',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:select-page",
+37: CHOICE
+38: VALUE 'previous',
+38: VALUE 'current',
+38: VALUE 'next',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:page-continuation",
+32: SEQUENCE
+33: REF 'text-page-continuation-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "text:select-page",
+36: CHOICE
+37: VALUE 'previous',
+37: VALUE 'next',
+35: CHOICE
+36: ATTRIBUTE "text:string-value",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:sender-firstname",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-lastname",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-initials",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-title",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-position",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-email",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-phone-private",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-fax",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-company",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-phone-work",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-street",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-city",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-postal-code",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-country",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sender-state-or-province",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:author-name",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:author-initials",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:chapter",
+32: SEQUENCE
+33: REF 'text-chapter-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "text:display",
+36: CHOICE
+37: VALUE 'name',
+37: VALUE 'number',
+37: VALUE 'number-and-name',
+37: VALUE 'plain-number-and-name',
+37: VALUE 'plain-number',
+35: ATTRIBUTE "text:outline-level",
+36: REF 'nonNegativeInteger',
+37: DATA 'nonNegativeInteger',
+33: STRING
+31: ELEMENT "text:file-name",
+32: SEQUENCE
+33: REF 'text-file-name-attlist',
+34: INTERLEAVE
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'full',
+38: VALUE 'path',
+38: VALUE 'name',
+38: VALUE 'name-and-extension',
+36: EPSILON
+35: REF 'common-field-fixed-attlist',
+36: CHOICE
+37: ATTRIBUTE "text:fixed",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+33: STRING
+31: ELEMENT "text:template-name",
+32: SEQUENCE
+33: REF 'text-template-name-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:display",
+36: CHOICE
+37: VALUE 'full',
+37: VALUE 'path',
+37: VALUE 'name',
+37: VALUE 'name-and-extension',
+37: VALUE 'area',
+37: VALUE 'title',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:sheet-name",
+32: STRING
+31: ELEMENT "text:variable-set",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-name-attlist',
+35: ATTRIBUTE "text:name",
+36: REF 'variableName',
+37: DATA 'string',
+34: REF 'common-field-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:formula",
+37: REF 'formula',
+38: DATA 'string',
+36: EPSILON
+34: REF 'common-value-and-type-attlist',
+35: CHOICE
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'float',
+37: ATTRIBUTE "office:value",
+38: REF 'double',
+39: DATA 'double',
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'percentage',
+37: ATTRIBUTE "office:value",
+38: REF 'double',
+39: DATA 'double',
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'currency',
+37: ATTRIBUTE "office:value",
+38: REF 'double',
+39: DATA 'double',
+37: CHOICE
+38: ATTRIBUTE "office:currency",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'date',
+37: ATTRIBUTE "office:date-value",
+38: REF 'dateOrDateTime',
+39: CHOICE
+40: DATA 'date',
+40: DATA 'dateTime',
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'time',
+37: ATTRIBUTE "office:time-value",
+38: REF 'duration',
+39: DATA 'duration',
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'boolean',
+37: ATTRIBUTE "office:boolean-value",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+36: SEQUENCE
+37: ATTRIBUTE "office:value-type",
+38: VALUE 'string',
+37: CHOICE
+38: ATTRIBUTE "office:string-value",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+34: REF 'common-field-display-value-none-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'value',
+38: VALUE 'none',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:variable-get",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-name-attlist',
+35: ATTRIBUTE "text:name",
+36: REF 'variableName',
+37: DATA 'string',
+34: REF 'common-field-display-value-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'value',
+38: VALUE 'formula',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:variable-input",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-name-attlist',
+35: ATTRIBUTE "text:name",
+36: REF 'variableName',
+37: DATA 'string',
+34: REF 'common-field-description-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:description",
+37: STRING
+36: EPSILON
+34: REF 'common-value-type-attlist',
+35: ATTRIBUTE "office:value-type",
+36: REF 'valueType',
+37: CHOICE
+38: VALUE 'float',
+38: VALUE 'time',
+38: VALUE 'date',
+38: VALUE 'percentage',
+38: VALUE 'currency',
+38: VALUE 'boolean',
+38: VALUE 'string',
+34: REF 'common-field-display-value-none-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'value',
+38: VALUE 'none',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:user-field-get",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-name-attlist',
+35: ATTRIBUTE "text:name",
+36: REF 'variableName',
+37: DATA 'string',
+34: REF 'common-field-display-value-formula-none-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'value',
+38: VALUE 'formula',
+38: VALUE 'none',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:user-field-input",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-name-attlist',
+35: ATTRIBUTE "text:name",
+36: REF 'variableName',
+37: DATA 'string',
+34: REF 'common-field-description-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:description",
+37: STRING
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:sequence",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-name-attlist',
+35: ATTRIBUTE "text:name",
+36: REF 'variableName',
+37: DATA 'string',
+34: REF 'common-field-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:formula",
+37: REF 'formula',
+38: DATA 'string',
+36: EPSILON
+34: REF 'common-field-num-format-attlist',
+35: CHOICE
+36: REF 'common-num-format-attlist',
+37: CHOICE
+38: ATTRIBUTE "style:num-format",
+39: CHOICE
+40: VALUE '1',
+40: VALUE 'i',
+40: VALUE 'I',
+40: REF 'string',
+41: DATA 'string',
+40: EPSILON
+38: SEQUENCE
+39: ATTRIBUTE "style:num-format",
+40: CHOICE
+41: VALUE 'a',
+41: VALUE 'A',
+39: REF 'style-num-letter-sync-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:num-letter-sync",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+38: EPSILON
+36: EPSILON
+34: REF 'text-sequence-ref-name',
+35: CHOICE
+36: ATTRIBUTE "text:ref-name",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:expression",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:formula",
+37: REF 'formula',
+38: DATA 'string',
+36: EPSILON
+34: CHOICE
+35: REF 'common-value-and-type-attlist',
+36: CHOICE
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'float',
+38: ATTRIBUTE "office:value",
+39: REF 'double',
+40: DATA 'double',
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'percentage',
+38: ATTRIBUTE "office:value",
+39: REF 'double',
+40: DATA 'double',
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'currency',
+38: ATTRIBUTE "office:value",
+39: REF 'double',
+40: DATA 'double',
+38: CHOICE
+39: ATTRIBUTE "office:currency",
+40: REF 'string',
+41: DATA 'string',
+39: EPSILON
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'date',
+38: ATTRIBUTE "office:date-value",
+39: REF 'dateOrDateTime',
+40: CHOICE
+41: DATA 'date',
+41: DATA 'dateTime',
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'time',
+38: ATTRIBUTE "office:time-value",
+39: REF 'duration',
+40: DATA 'duration',
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'boolean',
+38: ATTRIBUTE "office:boolean-value",
+39: REF 'boolean',
+40: CHOICE
+41: VALUE 'true',
+41: VALUE 'false',
+37: SEQUENCE
+38: ATTRIBUTE "office:value-type",
+39: VALUE 'string',
+38: CHOICE
+39: ATTRIBUTE "office:string-value",
+40: REF 'string',
+41: DATA 'string',
+39: EPSILON
+35: EPSILON
+34: REF 'common-field-display-value-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'value',
+38: VALUE 'formula',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:text-input",
+32: SEQUENCE
+33: REF 'common-field-description-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:description",
+36: STRING
+35: EPSILON
+33: STRING
+31: ELEMENT "text:initial-creator",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:creation-date",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:date-value",
+36: REF 'dateOrDateTime',
+37: CHOICE
+38: DATA 'date',
+38: DATA 'dateTime',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:creation-time",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:time-value",
+36: REF 'timeOrDateTime',
+37: CHOICE
+38: DATA 'time',
+38: DATA 'dateTime',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:description",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:user-defined",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: ATTRIBUTE "text:name",
+35: REF 'string',
+36: DATA 'string',
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "office:value",
+36: REF 'double',
+37: DATA 'double',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "office:date-value",
+36: REF 'dateOrDateTime',
+37: CHOICE
+38: DATA 'date',
+38: DATA 'dateTime',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "office:time-value",
+36: REF 'duration',
+37: DATA 'duration',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "office:boolean-value",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "office:string-value",
+36: REF 'string',
+37: DATA 'string',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:print-time",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:time-value",
+36: REF 'time',
+37: DATA 'time',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:print-date",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:date-value",
+36: REF 'date',
+37: DATA 'date',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:printed-by",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:title",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:subject",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:keywords",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:editing-cycles",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:editing-duration",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:duration",
+36: REF 'duration',
+37: DATA 'duration',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:modification-time",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:time-value",
+36: REF 'time',
+37: DATA 'time',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:modification-date",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-fixed-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:fixed",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:date-value",
+36: REF 'date',
+37: DATA 'date',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:creator",
+32: SEQUENCE
+33: REF 'common-field-fixed-attlist',
+34: CHOICE
+35: ATTRIBUTE "text:fixed",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:page-count", "text:paragraph-count", "text:word-count", "text:character-count", "text:table-count", "text:image-count", "text:object-count",
+32: SEQUENCE
+33: REF 'common-field-num-format-attlist',
+34: CHOICE
+35: REF 'common-num-format-attlist',
+36: CHOICE
+37: ATTRIBUTE "style:num-format",
+38: CHOICE
+39: VALUE '1',
+39: VALUE 'i',
+39: VALUE 'I',
+39: REF 'string',
+40: DATA 'string',
+39: EPSILON
+37: SEQUENCE
+38: ATTRIBUTE "style:num-format",
+39: CHOICE
+40: VALUE 'a',
+40: VALUE 'A',
+38: REF 'style-num-letter-sync-attlist',
+39: CHOICE
+40: ATTRIBUTE "style:num-letter-sync",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+37: EPSILON
+35: EPSILON
+33: STRING
+31: ELEMENT "text:database-display",
+32: SEQUENCE
+33: REF 'text-database-display-attlist',
+34: INTERLEAVE
+35: REF 'common-field-database-table',
+36: SEQUENCE
+37: REF 'common-field-database-table-attlist',
+38: INTERLEAVE
+39: ATTRIBUTE "text:table-name",
+40: REF 'string',
+41: DATA 'string',
+39: CHOICE
+40: ATTRIBUTE "text:table-type",
+41: CHOICE
+42: VALUE 'table',
+42: VALUE 'query',
+42: VALUE 'command',
+40: EPSILON
+37: REF 'common-field-database-name',
+38: CHOICE
+39: ATTRIBUTE "text:database-name",
+40: REF 'string',
+41: DATA 'string',
+39: EPSILON
+39: REF 'form-connection-resource',
+35: REF 'common-field-data-style-name-attlist',
+36: CHOICE
+37: ATTRIBUTE "style:data-style-name",
+38: REF 'styleNameRef',
+39: CHOICE
+40: DATA 'NCName',
+40: EPSILON
+37: EPSILON
+35: ATTRIBUTE "text:column-name",
+36: REF 'string',
+37: DATA 'string',
+33: STRING
+31: ELEMENT "text:database-next",
+32: REF 'text-database-next-attlist',
+33: INTERLEAVE
+34: REF 'common-field-database-table',
+35: SEQUENCE
+36: REF 'common-field-database-table-attlist',
+37: INTERLEAVE
+38: ATTRIBUTE "text:table-name",
+39: REF 'string',
+40: DATA 'string',
+38: CHOICE
+39: ATTRIBUTE "text:table-type",
+40: CHOICE
+41: VALUE 'table',
+41: VALUE 'query',
+41: VALUE 'command',
+39: EPSILON
+36: REF 'common-field-database-name',
+37: CHOICE
+38: ATTRIBUTE "text:database-name",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+38: REF 'form-connection-resource',
+34: CHOICE
+35: ATTRIBUTE "text:condition",
+36: REF 'formula',
+37: DATA 'string',
+35: EPSILON
+31: ELEMENT "text:database-row-select",
+32: REF 'text-database-row-select-attlist',
+33: INTERLEAVE
+34: REF 'common-field-database-table',
+35: SEQUENCE
+36: REF 'common-field-database-table-attlist',
+37: INTERLEAVE
+38: ATTRIBUTE "text:table-name",
+39: REF 'string',
+40: DATA 'string',
+38: CHOICE
+39: ATTRIBUTE "text:table-type",
+40: CHOICE
+41: VALUE 'table',
+41: VALUE 'query',
+41: VALUE 'command',
+39: EPSILON
+36: REF 'common-field-database-name',
+37: CHOICE
+38: ATTRIBUTE "text:database-name",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+38: REF 'form-connection-resource',
+34: CHOICE
+35: ATTRIBUTE "text:condition",
+36: REF 'formula',
+37: DATA 'string',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:row-number",
+36: REF 'nonNegativeInteger',
+37: DATA 'nonNegativeInteger',
+35: EPSILON
+31: ELEMENT "text:database-row-number",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-database-table',
+35: SEQUENCE
+36: REF 'common-field-database-table-attlist',
+37: INTERLEAVE
+38: ATTRIBUTE "text:table-name",
+39: REF 'string',
+40: DATA 'string',
+38: CHOICE
+39: ATTRIBUTE "text:table-type",
+40: CHOICE
+41: VALUE 'table',
+41: VALUE 'query',
+41: VALUE 'command',
+39: EPSILON
+36: REF 'common-field-database-name',
+37: CHOICE
+38: ATTRIBUTE "text:database-name",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+38: REF 'form-connection-resource',
+34: REF 'common-field-num-format-attlist',
+35: CHOICE
+36: REF 'common-num-format-attlist',
+37: CHOICE
+38: ATTRIBUTE "style:num-format",
+39: CHOICE
+40: VALUE '1',
+40: VALUE 'i',
+40: VALUE 'I',
+40: REF 'string',
+41: DATA 'string',
+40: EPSILON
+38: SEQUENCE
+39: ATTRIBUTE "style:num-format",
+40: CHOICE
+41: VALUE 'a',
+41: VALUE 'A',
+39: REF 'style-num-letter-sync-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:num-letter-sync",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+38: EPSILON
+36: EPSILON
+34: CHOICE
+35: ATTRIBUTE "text:value",
+36: REF 'nonNegativeInteger',
+37: DATA 'nonNegativeInteger',
+35: EPSILON
+33: STRING
+31: ELEMENT "text:database-name",
+32: SEQUENCE
+33: REF 'common-field-database-table',
+34: SEQUENCE
+35: REF 'common-field-database-table-attlist',
+36: INTERLEAVE
+37: ATTRIBUTE "text:table-name",
+38: REF 'string',
+39: DATA 'string',
+37: CHOICE
+38: ATTRIBUTE "text:table-type",
+39: CHOICE
+40: VALUE 'table',
+40: VALUE 'query',
+40: VALUE 'command',
+38: EPSILON
+35: REF 'common-field-database-name',
+36: CHOICE
+37: ATTRIBUTE "text:database-name",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+37: REF 'form-connection-resource',
+33: STRING
+31: ELEMENT "text:page-variable-set",
+32: SEQUENCE
+33: REF 'text-set-page-variable-attlist',
+34: INTERLEAVE
+35: CHOICE
+36: ATTRIBUTE "text:active",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:page-adjust",
+37: REF 'integer',
+38: DATA 'integer',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:page-variable-get",
+32: SEQUENCE
+33: REF 'text-get-page-variable-attlist',
+34: REF 'common-field-num-format-attlist',
+35: CHOICE
+36: REF 'common-num-format-attlist',
+37: CHOICE
+38: ATTRIBUTE "style:num-format",
+39: CHOICE
+40: VALUE '1',
+40: VALUE 'i',
+40: VALUE 'I',
+40: REF 'string',
+41: DATA 'string',
+40: EPSILON
+38: SEQUENCE
+39: ATTRIBUTE "style:num-format",
+40: CHOICE
+41: VALUE 'a',
+41: VALUE 'A',
+39: REF 'style-num-letter-sync-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:num-letter-sync",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+38: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:placeholder",
+32: SEQUENCE
+33: REF 'text-placeholder-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "text:placeholder-type",
+36: CHOICE
+37: VALUE 'text',
+37: VALUE 'table',
+37: VALUE 'text-box',
+37: VALUE 'image',
+37: VALUE 'object',
+35: REF 'common-field-description-attlist',
+36: CHOICE
+37: ATTRIBUTE "text:description",
+38: STRING
+37: EPSILON
+33: STRING
+31: ELEMENT "text:conditional-text",
+32: SEQUENCE
+33: REF 'text-conditional-text-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "text:condition",
+36: REF 'formula',
+37: DATA 'string',
+35: ATTRIBUTE "text:string-value-if-true",
+36: REF 'string',
+37: DATA 'string',
+35: ATTRIBUTE "text:string-value-if-false",
+36: REF 'string',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "text:current-value",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:hidden-text",
+32: SEQUENCE
+33: REF 'text-hidden-text-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "text:condition",
+36: REF 'formula',
+37: DATA 'string',
+35: ATTRIBUTE "text:string-value",
+36: REF 'string',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "text:is-hidden",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:reference-ref", "text:bookmark-ref",
+32: INTERLEAVE
+33: REF 'text-common-ref-content',
+34: INTERLEAVE
+35: STRING
+35: CHOICE
+36: ATTRIBUTE "text:ref-name",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: REF 'text-ref-content',
+34: CHOICE
+35: ATTRIBUTE "text:reference-format",
+36: CHOICE
+37: VALUE 'page',
+37: VALUE 'chapter',
+37: VALUE 'direction',
+37: VALUE 'text',
+35: EPSILON
+31: ELEMENT "text:note-ref",
+32: INTERLEAVE
+33: REF 'text-common-ref-content',
+34: INTERLEAVE
+35: STRING
+35: CHOICE
+36: ATTRIBUTE "text:ref-name",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: REF 'text-note-ref-content',
+34: REF 'text-note-class',
+35: ATTRIBUTE "text:note-class",
+36: CHOICE
+37: VALUE 'footnote',
+37: VALUE 'endnote',
+33: REF 'text-ref-content',
+34: CHOICE
+35: ATTRIBUTE "text:reference-format",
+36: CHOICE
+37: VALUE 'page',
+37: VALUE 'chapter',
+37: VALUE 'direction',
+37: VALUE 'text',
+35: EPSILON
+31: ELEMENT "text:sequence-ref",
+32: INTERLEAVE
+33: REF 'text-common-ref-content',
+34: INTERLEAVE
+35: STRING
+35: CHOICE
+36: ATTRIBUTE "text:ref-name",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: REF 'text-sequence-ref-content',
+34: CHOICE
+35: ATTRIBUTE "text:reference-format",
+36: CHOICE
+37: VALUE 'page',
+37: VALUE 'chapter',
+37: VALUE 'direction',
+37: VALUE 'text',
+37: VALUE 'category-and-value',
+37: VALUE 'caption',
+37: VALUE 'value',
+35: EPSILON
+31: ELEMENT "text:script",
+32: INTERLEAVE
+33: CHOICE
+34: SEQUENCE
+35: ATTRIBUTE "xlink:href",
+36: REF 'anyURI',
+37: DATA 'anyURI',
+35: CHOICE
+36: ATTRIBUTE "xlink:type",
+37: VALUE 'simple',
+36: EPSILON
+34: STRING
+33: CHOICE
+34: ATTRIBUTE "script:language",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+31: ELEMENT "text:execute-macro",
+32: SEQUENCE
+33: CHOICE
+34: ATTRIBUTE "text:name",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+33: CHOICE
+34: REF 'office-event-listeners',
+34: EPSILON
+33: STRING
+31: ELEMENT "text:hidden-paragraph",
+32: SEQUENCE
+33: REF 'text-hidden-paragraph-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "text:condition",
+36: REF 'formula',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "text:is-hidden",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+33: STRING
+31: ELEMENT "text:dde-connection",
+32: SEQUENCE
+33: ATTRIBUTE "text:connection-name",
+34: REF 'string',
+35: DATA 'string',
+33: STRING
+31: ELEMENT "text:measure",
+32: SEQUENCE
+33: ATTRIBUTE "text:kind",
+34: CHOICE
+35: VALUE 'value',
+35: VALUE 'unit',
+35: VALUE 'gap',
+33: STRING
+31: ELEMENT "text:table-formula",
+32: SEQUENCE
+33: INTERLEAVE
+34: REF 'common-field-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:formula",
+37: REF 'formula',
+38: DATA 'string',
+36: EPSILON
+34: REF 'common-field-display-value-formula-attlist',
+35: CHOICE
+36: ATTRIBUTE "text:display",
+37: CHOICE
+38: VALUE 'value',
+38: VALUE 'formula',
+36: EPSILON
+34: REF 'common-field-data-style-name-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:data-style-name",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+33: STRING
+31: ELEMENT "text:toc-mark-start",
+32: REF 'text-toc-mark-start-attrs',
+33: SEQUENCE
+34: REF 'text-id',
+35: ATTRIBUTE "text:id",
+36: REF 'string',
+37: DATA 'string',
+34: REF 'text-outline-level',
+35: CHOICE
+36: ATTRIBUTE "text:outline-level",
+37: REF 'positiveInteger',
+38: DATA 'positiveInteger',
+36: EPSILON
+31: ELEMENT "text:toc-mark-end",
+32: REF 'text-id',
+33: ATTRIBUTE "text:id",
+34: REF 'string',
+35: DATA 'string',
+31: ELEMENT "text:toc-mark",
+32: SEQUENCE
+33: ATTRIBUTE "text:string-value",
+34: REF 'string',
+35: DATA 'string',
+33: REF 'text-outline-level',
+34: CHOICE
+35: ATTRIBUTE "text:outline-level",
+36: REF 'positiveInteger',
+37: DATA 'positiveInteger',
+35: EPSILON
+31: ELEMENT "text:user-index-mark-start",
+32: SEQUENCE
+33: REF 'text-id',
+34: ATTRIBUTE "text:id",
+35: REF 'string',
+36: DATA 'string',
+33: REF 'text-outline-level',
+34: CHOICE
+35: ATTRIBUTE "text:outline-level",
+36: REF 'positiveInteger',
+37: DATA 'positiveInteger',
+35: EPSILON
+33: REF 'text-index-name',
+34: ATTRIBUTE "text:index-name",
+35: REF 'string',
+36: DATA 'string',
+31: ELEMENT "text:user-index-mark-end",
+32: SEQUENCE
+33: REF 'text-id',
+34: ATTRIBUTE "text:id",
+35: REF 'string',
+36: DATA 'string',
+33: REF 'text-outline-level',
+34: CHOICE
+35: ATTRIBUTE "text:outline-level",
+36: REF 'positiveInteger',
+37: DATA 'positiveInteger',
+35: EPSILON
+31: ELEMENT "text:user-index-mark",
+32: SEQUENCE
+33: ATTRIBUTE "text:string-value",
+34: REF 'string',
+35: DATA 'string',
+33: REF 'text-outline-level',
+34: CHOICE
+35: ATTRIBUTE "text:outline-level",
+36: REF 'positiveInteger',
+37: DATA 'positiveInteger',
+35: EPSILON
+33: REF 'text-index-name',
+34: ATTRIBUTE "text:index-name",
+35: REF 'string',
+36: DATA 'string',
+31: ELEMENT "text:alphabetical-index-mark-start",
+32: SEQUENCE
+33: REF 'text-id',
+34: ATTRIBUTE "text:id",
+35: REF 'string',
+36: DATA 'string',
+33: REF 'text-alphabetical-index-mark-attrs',
+34: INTERLEAVE
+35: SEQUENCE
+36: CHOICE
+37: ATTRIBUTE "text:key1",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:key2",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+35: SEQUENCE
+36: CHOICE
+37: ATTRIBUTE "text:string-value-phonetic",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:key1-phonetic",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:key2-phonetic",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:main-entry",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+31: ELEMENT "text:alphabetical-index-mark-end",
+32: REF 'text-id',
+33: ATTRIBUTE "text:id",
+34: REF 'string',
+35: DATA 'string',
+31: ELEMENT "text:alphabetical-index-mark",
+32: SEQUENCE
+33: ATTRIBUTE "text:string-value",
+34: REF 'string',
+35: DATA 'string',
+33: REF 'text-alphabetical-index-mark-attrs',
+34: INTERLEAVE
+35: SEQUENCE
+36: CHOICE
+37: ATTRIBUTE "text:key1",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:key2",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+35: SEQUENCE
+36: CHOICE
+37: ATTRIBUTE "text:string-value-phonetic",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:key1-phonetic",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "text:key2-phonetic",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+35: CHOICE
+36: ATTRIBUTE "text:main-entry",
+37: REF 'boolean',
+38: CHOICE
+39: VALUE 'true',
+39: VALUE 'false',
+36: EPSILON
+31: ELEMENT "text:bibliography-mark",
+32: SEQUENCE
+33: ATTRIBUTE "text:bibliography-type",
+34: REF 'text-bibliography-types',
+35: CHOICE
+36: VALUE 'article',
+36: VALUE 'book',
+36: VALUE 'booklet',
+36: VALUE 'conference',
+36: VALUE 'custom1',
+36: VALUE 'custom2',
+36: VALUE 'custom3',
+36: VALUE 'custom4',
+36: VALUE 'custom5',
+36: VALUE 'email',
+36: VALUE 'inbook',
+36: VALUE 'incollection',
+36: VALUE 'inproceedings',
+36: VALUE 'journal',
+36: VALUE 'manual',
+36: VALUE 'mastersthesis',
+36: VALUE 'misc',
+36: VALUE 'phdthesis',
+36: VALUE 'proceedings',
+36: VALUE 'techreport',
+36: VALUE 'unpublished',
+36: VALUE 'www',
+33: CHOICE
+34: ONEOREMORE
+35: ATTRIBUTE "text:identifier", "text:address", "text:annote", "text:author", "text:booktitle", "text:chapter", "text:edition", "text:editor", "text:howpublished", "text:institution", "text:journal", "text:month", "text:note", "text:number", "text:organizations", "text:pages", "text:publisher", "text:school", "text:series", "text:title", "text:report-type", "text:volume", "text:year", "text:url", "text:custom1", "text:custom2", "text:custom3", "text:custom4", "text:custom5", "text:isbn", "text:issn",
+36: REF 'string',
+37: DATA 'string',
+34: EPSILON
+33: STRING
+31: ELEMENT "presentation:header",
+32: EPSILON
+31: ELEMENT "presentation:footer",
+32: EPSILON
+31: ELEMENT "presentation:date-time",
+32: EPSILON
+28: EPSILON
+24: REF 'text-p',
+24: REF 'text-list',
+24: REF 'table-table',
+24: REF 'text-section',
+24: REF 'text-table-of-content',
+24: REF 'text-illustration-index',
+24: REF 'text-table-index',
+24: REF 'text-object-index',
+24: REF 'text-user-index',
+24: REF 'text-alphabetical-index',
+24: REF 'text-bibliography',
+24: REF 'text-index-title',
+24: REF 'change-marks',
+25: CHOICE
+22: EPSILON
+20: SEQUENCE
+21: CHOICE
+22: REF 'style-region-left',
+23: ELEMENT "style:region-left",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-center',
+23: ELEMENT "style:region-center",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-right',
+23: ELEMENT "style:region-right",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+15: CHOICE
+16: REF 'style-header-left',
+17: ELEMENT "style:header-left",
+18: SEQUENCE
+19: REF 'common-style-header-footer-attlist',
+20: CHOICE
+21: ATTRIBUTE "style:display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+19: REF 'header-footer-content',
+20: CHOICE
+21: SEQUENCE
+22: REF 'text-decls',
+23: SEQUENCE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+25: REF 'text-alphabetical-index-auto-mark-file',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: CHOICE
+25: REF 'text-h',
+25: REF 'text-p',
+25: REF 'text-list',
+25: REF 'table-table',
+25: REF 'text-section',
+25: REF 'text-table-of-content',
+25: REF 'text-illustration-index',
+25: REF 'text-table-index',
+25: REF 'text-object-index',
+25: REF 'text-user-index',
+25: REF 'text-alphabetical-index',
+25: REF 'text-bibliography',
+25: REF 'text-index-title',
+25: REF 'change-marks',
+26: CHOICE
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'style-region-left',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-center',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-right',
+23: EPSILON
+16: EPSILON
+14: EPSILON
+13: CHOICE
+14: SEQUENCE
+15: REF 'style-footer',
+16: ELEMENT "style:footer",
+17: SEQUENCE
+18: REF 'common-style-header-footer-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:display",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+18: REF 'header-footer-content',
+19: CHOICE
+20: SEQUENCE
+21: REF 'text-decls',
+22: SEQUENCE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+24: REF 'text-alphabetical-index-auto-mark-file',
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'text-h',
+24: REF 'text-p',
+24: REF 'text-list',
+24: REF 'table-table',
+24: REF 'text-section',
+24: REF 'text-table-of-content',
+24: REF 'text-illustration-index',
+24: REF 'text-table-index',
+24: REF 'text-object-index',
+24: REF 'text-user-index',
+24: REF 'text-alphabetical-index',
+24: REF 'text-bibliography',
+24: REF 'text-index-title',
+24: REF 'change-marks',
+25: CHOICE
+22: EPSILON
+20: SEQUENCE
+21: CHOICE
+22: REF 'style-region-left',
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-center',
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-right',
+22: EPSILON
+15: CHOICE
+16: REF 'style-footer-left',
+17: ELEMENT "style:footer-left",
+18: SEQUENCE
+19: REF 'common-style-header-footer-attlist',
+20: CHOICE
+21: ATTRIBUTE "style:display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+19: REF 'header-footer-content',
+20: CHOICE
+21: SEQUENCE
+22: REF 'text-decls',
+23: SEQUENCE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+25: REF 'text-alphabetical-index-auto-mark-file',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: CHOICE
+25: REF 'text-h',
+25: REF 'text-p',
+25: REF 'text-list',
+25: REF 'table-table',
+25: REF 'text-section',
+25: REF 'text-table-of-content',
+25: REF 'text-illustration-index',
+25: REF 'text-table-index',
+25: REF 'text-object-index',
+25: REF 'text-user-index',
+25: REF 'text-alphabetical-index',
+25: REF 'text-bibliography',
+25: REF 'text-index-title',
+25: REF 'change-marks',
+26: CHOICE
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'style-region-left',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-center',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-right',
+23: EPSILON
+16: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'office-forms',
+15: CHOICE
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'style-style',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'shape',
+16: CHOICE
+17: REF 'draw-rect',
+17: REF 'draw-line',
+17: REF 'draw-polyline',
+17: REF 'draw-polygon',
+17: REF 'draw-regular-polygon',
+17: REF 'draw-path',
+17: REF 'draw-circle',
+17: REF 'draw-ellipse',
+17: REF 'draw-g',
+17: REF 'draw-page-thumbnail',
+17: REF 'draw-frame',
+17: REF 'draw-measure',
+17: REF 'draw-caption',
+17: REF 'draw-connector',
+17: REF 'draw-control',
+17: REF 'dr3d-scene',
+17: REF 'draw-custom-shape',
+14: EPSILON
+13: CHOICE
+14: REF 'presentation-notes',
+15: ELEMENT "presentation:notes",
+16: SEQUENCE
+17: REF 'common-presentation-header-footer-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: ATTRIBUTE "presentation:use-header-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:use-footer-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:use-date-time-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+17: REF 'presentation-notes-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: ATTRIBUTE "style:page-layout-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "draw:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'shape',
+20: CHOICE
+21: REF 'draw-rect',
+21: REF 'draw-line',
+21: REF 'draw-polyline',
+21: REF 'draw-polygon',
+21: REF 'draw-regular-polygon',
+21: REF 'draw-path',
+21: REF 'draw-circle',
+21: REF 'draw-ellipse',
+21: REF 'draw-g',
+21: REF 'draw-page-thumbnail',
+21: REF 'draw-frame',
+21: REF 'draw-measure',
+21: REF 'draw-caption',
+21: REF 'draw-connector',
+21: REF 'draw-control',
+21: REF 'dr3d-scene',
+21: REF 'draw-custom-shape',
+18: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'style-handout-master',
+10: ELEMENT "style:handout-master",
+11: SEQUENCE
+12: REF 'common-presentation-header-footer-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "presentation:use-header-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "presentation:use-footer-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "presentation:use-date-time-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+12: REF 'style-handout-master-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "presentation:presentation-page-layout-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+14: ATTRIBUTE "style:page-layout-name",
+15: REF 'styleNameRef',
+16: CHOICE
+17: DATA 'NCName',
+17: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:style-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+12: CHOICE
+13: ONEOREMORE
+14: REF 'shape',
+15: CHOICE
+16: REF 'draw-rect',
+16: REF 'draw-line',
+16: REF 'draw-polyline',
+16: REF 'draw-polygon',
+16: REF 'draw-regular-polygon',
+16: REF 'draw-path',
+16: REF 'draw-circle',
+16: REF 'draw-ellipse',
+16: REF 'draw-g',
+16: REF 'draw-page-thumbnail',
+16: REF 'draw-frame',
+16: REF 'draw-measure',
+16: REF 'draw-caption',
+16: REF 'draw-connector',
+16: REF 'draw-control',
+16: REF 'dr3d-scene',
+16: REF 'draw-custom-shape',
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'draw-layer-set',
+10: ELEMENT "draw:layer-set",
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-layer',
+14: ELEMENT "draw:layer",
+15: REF 'draw-layer-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "draw:name",
+18: REF 'string',
+19: DATA 'string',
+17: CHOICE
+18: ATTRIBUTE "draw:protected",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "draw:display",
+19: CHOICE
+20: VALUE 'always',
+20: VALUE 'screen',
+20: VALUE 'printer',
+20: VALUE 'none',
+18: EPSILON
+12: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-body',
+5: ELEMENT "office:body",
+6: REF 'office-body-content',
+7: CHOICE
+8: ELEMENT "office:text",
+9: SEQUENCE
+10: REF 'office-text-attlist',
+11: CHOICE
+12: ATTRIBUTE "text:global",
+13: REF 'boolean',
+14: CHOICE
+15: VALUE 'true',
+15: VALUE 'false',
+12: EPSILON
+10: REF 'office-text-content-prelude',
+11: SEQUENCE
+12: REF 'office-forms',
+13: CHOICE
+12: REF 'text-tracked-changes',
+13: CHOICE
+14: ELEMENT "text:tracked-changes",
+15: SEQUENCE
+16: REF 'text-tracked-changes-attr',
+17: CHOICE
+18: ATTRIBUTE "text:track-changes",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'text-changed-region',
+19: ELEMENT "text:changed-region",
+20: SEQUENCE
+21: REF 'text-changed-region-attr',
+22: ATTRIBUTE "text:id",
+23: REF 'ID',
+24: DATA 'ID',
+21: REF 'text-changed-region-content',
+22: CHOICE
+23: ELEMENT "text:insertion",
+24: REF 'office-change-info',
+25: ELEMENT "office:change-info",
+26: SEQUENCE
+27: REF 'dc-creator',
+27: REF 'dc-date',
+27: CHOICE
+28: ONEOREMORE
+29: REF 'text-p',
+28: EPSILON
+23: ELEMENT "text:deletion",
+24: SEQUENCE
+25: REF 'office-change-info',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-content',
+28: CHOICE
+29: REF 'text-h',
+29: REF 'text-p',
+29: REF 'text-list',
+29: REF 'text-numbered-paragraph',
+29: REF 'table-table',
+29: REF 'draw-a',
+29: REF 'text-section',
+29: REF 'text-table-of-content',
+29: REF 'text-illustration-index',
+29: REF 'text-table-index',
+29: REF 'text-object-index',
+29: REF 'text-user-index',
+29: REF 'text-alphabetical-index',
+29: REF 'text-bibliography',
+29: REF 'shape',
+30: CHOICE
+31: REF 'draw-rect',
+31: REF 'draw-line',
+31: REF 'draw-polyline',
+31: REF 'draw-polygon',
+31: REF 'draw-regular-polygon',
+31: REF 'draw-path',
+31: REF 'draw-circle',
+31: REF 'draw-ellipse',
+31: REF 'draw-g',
+31: REF 'draw-page-thumbnail',
+31: REF 'draw-frame',
+31: REF 'draw-measure',
+31: REF 'draw-caption',
+31: REF 'draw-connector',
+31: REF 'draw-control',
+31: REF 'dr3d-scene',
+31: REF 'draw-custom-shape',
+29: REF 'change-marks',
+30: CHOICE
+26: EPSILON
+23: ELEMENT "text:format-change",
+24: REF 'office-change-info',
+17: EPSILON
+14: EPSILON
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+16: ELEMENT "table:calculation-settings",
+17: SEQUENCE
+18: REF 'table-calculation-setting-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:case-sensitive",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:precision-as-shown",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:search-criteria-must-apply-to-whole-cell",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:automatic-find-labels",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:use-regular-expressions",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:null-year",
+22: REF 'positiveInteger',
+23: DATA 'positiveInteger',
+21: EPSILON
+18: CHOICE
+19: REF 'table-null-date',
+20: ELEMENT "table:null-date",
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "table:value-type",
+24: REF 'valueType',
+25: CHOICE
+26: VALUE 'float',
+26: VALUE 'time',
+26: VALUE 'date',
+26: VALUE 'percentage',
+26: VALUE 'currency',
+26: VALUE 'boolean',
+26: VALUE 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:date-value-type",
+24: REF 'date',
+25: DATA 'date',
+23: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'table-iteration',
+20: ELEMENT "table:iteration",
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "table:status",
+24: CHOICE
+25: VALUE 'enable',
+25: VALUE 'disable',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:steps",
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:maximum-difference",
+24: REF 'double',
+25: DATA 'double',
+23: EPSILON
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+16: ELEMENT "table:content-validations",
+17: ONEOREMORE
+18: REF 'table-content-validation',
+19: ELEMENT "table:content-validation",
+20: SEQUENCE
+21: REF 'table-validation-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:condition",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:allow-empty-cell",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:display-list",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'unsorted',
+26: VALUE 'sort-ascending',
+24: EPSILON
+21: CHOICE
+22: REF 'table-help-message',
+23: ELEMENT "table:help-message",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:title",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'table-error-message',
+23: ELEMENT "table:error-message",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:title",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:message-type",
+27: CHOICE
+28: VALUE 'stop',
+28: VALUE 'warning',
+28: VALUE 'information',
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: SEQUENCE
+23: REF 'table-error-macro',
+24: ELEMENT "table:error-macro",
+25: CHOICE
+26: ATTRIBUTE "table:execute",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: CHOICE
+24: REF 'office-event-listeners',
+24: EPSILON
+22: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+16: ELEMENT "table:label-ranges",
+17: CHOICE
+18: ONEOREMORE
+19: REF 'table-label-range',
+20: ELEMENT "table:label-range",
+21: REF 'table-label-range-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:label-cell-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: ATTRIBUTE "table:data-cell-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: ATTRIBUTE "table:orientation",
+24: CHOICE
+25: VALUE 'column',
+25: VALUE 'row',
+18: EPSILON
+15: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'office-text-content-main',
+13: CHOICE
+14: ONEOREMORE
+15: REF 'text-content',
+16: CHOICE
+17: REF 'text-h',
+17: REF 'text-p',
+17: REF 'text-list',
+17: REF 'text-numbered-paragraph',
+17: REF 'table-table',
+17: REF 'draw-a',
+17: REF 'text-section',
+17: REF 'text-table-of-content',
+17: REF 'text-illustration-index',
+17: REF 'text-table-index',
+17: REF 'text-object-index',
+17: REF 'text-user-index',
+17: REF 'text-alphabetical-index',
+17: REF 'text-bibliography',
+17: REF 'shape',
+18: CHOICE
+19: REF 'draw-rect',
+19: REF 'draw-line',
+19: REF 'draw-polyline',
+19: REF 'draw-polygon',
+19: REF 'draw-regular-polygon',
+19: REF 'draw-path',
+19: REF 'draw-circle',
+19: REF 'draw-ellipse',
+19: REF 'draw-g',
+19: REF 'draw-page-thumbnail',
+19: REF 'draw-frame',
+19: REF 'draw-measure',
+19: REF 'draw-caption',
+19: REF 'draw-connector',
+19: REF 'draw-control',
+19: REF 'dr3d-scene',
+19: REF 'draw-custom-shape',
+17: REF 'change-marks',
+18: CHOICE
+14: EPSILON
+14: SEQUENCE
+15: REF 'text-page-sequence',
+16: ELEMENT "text:page-sequence",
+17: ONEOREMORE
+18: REF 'text-page',
+19: ELEMENT "text:page",
+20: REF 'text-page-attlist',
+21: ATTRIBUTE "text:master-page-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: CHOICE
+18: REF 'draw-a',
+18: REF 'shape',
+19: CHOICE
+20: REF 'draw-rect',
+20: REF 'draw-line',
+20: REF 'draw-polyline',
+20: REF 'draw-polygon',
+20: REF 'draw-regular-polygon',
+20: REF 'draw-path',
+20: REF 'draw-circle',
+20: REF 'draw-ellipse',
+20: REF 'draw-g',
+20: REF 'draw-page-thumbnail',
+20: REF 'draw-frame',
+20: REF 'draw-measure',
+20: REF 'draw-caption',
+20: REF 'draw-connector',
+20: REF 'draw-control',
+20: REF 'dr3d-scene',
+20: REF 'draw-custom-shape',
+16: EPSILON
+11: EPSILON
+10: REF 'office-text-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+15: ELEMENT "table:named-expressions",
+16: CHOICE
+17: ONEOREMORE
+18: CHOICE
+19: REF 'table-named-range',
+20: ELEMENT "table:named-range",
+21: REF 'table-named-range-attlist',
+22: SEQUENCE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: ATTRIBUTE "table:cell-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:range-usable-as",
+25: CHOICE
+26: VALUE 'none',
+26: LIST
+27: ONEOREMORE
+28: CHOICE
+29: VALUE 'print-range',
+29: VALUE 'filter',
+29: VALUE 'repeat-row',
+29: VALUE 'repeat-column',
+24: EPSILON
+19: REF 'table-named-expression',
+20: ELEMENT "table:named-expression",
+21: REF 'table-named-expression-attlist',
+22: SEQUENCE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: ATTRIBUTE "table:expression",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+15: ELEMENT "table:database-ranges",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'table-database-range',
+19: ELEMENT "table:database-range",
+20: SEQUENCE
+21: REF 'table-database-range-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "table:name",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:is-selection",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:on-update-keep-styles",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:on-update-keep-size",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:has-persistent-data",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:orientation",
+25: CHOICE
+26: VALUE 'column',
+26: VALUE 'row',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:contains-header",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:display-filter-buttons",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: ATTRIBUTE "table:target-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:refresh-delay",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: CHOICE
+22: REF 'table-database-source-sql',
+23: ELEMENT "table:database-source-sql",
+24: REF 'table-database-source-sql-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:sql-statement",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "table:parse-sql-statement",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+22: REF 'table-database-source-table',
+23: ELEMENT "table:database-source-query",
+24: REF 'table-database-source-query-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:query-name",
+27: REF 'string',
+28: DATA 'string',
+22: REF 'table-database-source-query',
+23: ELEMENT "table:database-source-table",
+24: REF 'table-database-source-table-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:database-table-name",
+27: REF 'string',
+28: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: REF 'table-filter',
+23: ELEMENT "table:filter",
+24: SEQUENCE
+25: REF 'table-filter-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:target-range-address",
+29: REF 'cellRangeAddress',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:condition-source",
+29: CHOICE
+30: VALUE 'self',
+30: VALUE 'cell-range',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:condition-source-range-address",
+29: REF 'cellRangeAddress',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:display-duplicates",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: CHOICE
+26: REF 'table-filter-condition',
+27: ELEMENT "table:filter-condition",
+28: REF 'table-filter-condition-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-number",
+31: REF 'nonNegativeInteger',
+32: DATA 'nonNegativeInteger',
+30: ATTRIBUTE "table:value",
+31: REF 'string',
+32: DATA 'string',
+30: ATTRIBUTE "table:operator",
+31: REF 'string',
+32: DATA 'string',
+30: CHOICE
+31: ATTRIBUTE "table:case-sensitive",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+31: EPSILON
+26: REF 'table-filter-and',
+27: ELEMENT "table:filter-and",
+28: ONEOREMORE
+29: CHOICE
+30: REF 'table-filter-or',
+31: ELEMENT "table:filter-or",
+32: ONEOREMORE
+33: CHOICE
+34: REF 'table-filter-and',
+34: REF 'table-filter-condition',
+30: REF 'table-filter-condition',
+26: REF 'table-filter-or',
+22: EPSILON
+21: CHOICE
+22: REF 'table-sort',
+23: ELEMENT "table:sort",
+24: SEQUENCE
+25: REF 'table-sort-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:bind-styles-to-content",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:target-range-address",
+29: REF 'cellRangeAddress',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:case-sensitive",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:language",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:country",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:algorithm",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: ONEOREMORE
+26: REF 'table-sort-by',
+27: ELEMENT "table:sort-by",
+28: REF 'table-sort-by-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-number",
+31: REF 'nonNegativeInteger',
+32: DATA 'nonNegativeInteger',
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+33: VALUE 'automatic',
+33: REF 'string',
+34: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:order",
+32: CHOICE
+33: VALUE 'ascending',
+33: VALUE 'descending',
+31: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'table-subtotal-rules',
+23: ELEMENT "table:subtotal-rules",
+24: SEQUENCE
+25: REF 'table-subtotal-rules-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:bind-styles-to-content",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:case-sensitive",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:page-breaks-on-group-change",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: CHOICE
+26: REF 'table-sort-groups',
+27: ELEMENT "table:sort-groups",
+28: REF 'table-sort-groups-attlist',
+29: INTERLEAVE
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+33: VALUE 'automatic',
+33: REF 'string',
+34: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:order",
+32: CHOICE
+33: VALUE 'ascending',
+33: VALUE 'descending',
+31: EPSILON
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'table-subtotal-rule',
+28: ELEMENT "table:subtotal-rule",
+29: SEQUENCE
+30: REF 'table-subtotal-rule-attlist',
+31: ATTRIBUTE "table:group-by-field-number",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+30: CHOICE
+31: ONEOREMORE
+32: REF 'table-subtotal-field',
+33: ELEMENT "table:subtotal-field",
+34: REF 'table-subtotal-field-attlist',
+35: INTERLEAVE
+36: ATTRIBUTE "table:field-number",
+37: REF 'nonNegativeInteger',
+38: DATA 'nonNegativeInteger',
+36: ATTRIBUTE "table:function",
+37: CHOICE
+38: VALUE 'auto',
+38: VALUE 'average',
+38: VALUE 'count',
+38: VALUE 'countnums',
+38: VALUE 'max',
+38: VALUE 'min',
+38: VALUE 'product',
+38: VALUE 'stdev',
+38: VALUE 'stdevp',
+38: VALUE 'sum',
+38: VALUE 'var',
+38: VALUE 'varp',
+38: REF 'string',
+39: DATA 'string',
+31: EPSILON
+26: EPSILON
+22: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+15: ELEMENT "table:data-pilot-tables",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'table-data-pilot-table',
+19: ELEMENT "table:data-pilot-table",
+20: SEQUENCE
+21: REF 'table-data-pilot-table-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:application-data",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:grand-total",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'both',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:ignore-empty-rows",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:identify-categories",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: ATTRIBUTE "table:target-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:buttons",
+25: REF 'cellRangeAddressList',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:show-filter-button",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:drill-down-on-double-click",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: CHOICE
+22: REF 'table-database-source-sql',
+22: REF 'table-database-source-table',
+22: REF 'table-database-source-query',
+22: REF 'table-source-service',
+23: ELEMENT "table:source-service",
+24: REF 'table-source-service-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:source-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:object-name",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "table:user-name",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:password",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+22: REF 'table-source-cell-range',
+23: ELEMENT "table:source-cell-range",
+24: SEQUENCE
+25: REF 'table-source-cell-range-attlist',
+26: ATTRIBUTE "table:cell-range-address",
+27: REF 'cellRangeAddress',
+28: DATA 'string',
+25: CHOICE
+26: REF 'table-filter',
+26: EPSILON
+22: EPSILON
+21: ONEOREMORE
+22: REF 'table-data-pilot-field',
+23: ELEMENT "table:data-pilot-field",
+24: SEQUENCE
+25: REF 'table-data-pilot-field-attlist',
+26: INTERLEAVE
+27: ATTRIBUTE "table:source-field-name",
+28: REF 'string',
+29: DATA 'string',
+27: CHOICE
+28: ATTRIBUTE "table:orientation",
+29: CHOICE
+30: VALUE 'row',
+30: VALUE 'column',
+30: VALUE 'data',
+30: VALUE 'hidden',
+28: SEQUENCE
+29: ATTRIBUTE "table:orientation",
+30: VALUE 'page',
+29: ATTRIBUTE "table:selected-page",
+30: REF 'string',
+31: DATA 'string',
+27: CHOICE
+28: ATTRIBUTE "table:is-data-layout-field",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:function",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'average',
+30: VALUE 'count',
+30: VALUE 'countnums',
+30: VALUE 'max',
+30: VALUE 'min',
+30: VALUE 'product',
+30: VALUE 'stdev',
+30: VALUE 'stdevp',
+30: VALUE 'sum',
+30: VALUE 'var',
+30: VALUE 'varp',
+30: REF 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:used-hierarchy",
+29: REF 'integer',
+30: DATA 'integer',
+28: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-level',
+27: ELEMENT "table:data-pilot-level",
+28: SEQUENCE
+29: REF 'table-data-pilot-level-attlist',
+30: CHOICE
+31: ATTRIBUTE "table:show-empty",
+32: REF 'boolean',
+33: CHOICE
+34: VALUE 'true',
+34: VALUE 'false',
+31: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-subtotals',
+31: ELEMENT "table:data-pilot-subtotals",
+32: CHOICE
+33: ONEOREMORE
+34: REF 'table-data-pilot-subtotal',
+35: ELEMENT "table:data-pilot-subtotal",
+36: REF 'table-data-pilot-subtotal-attlist',
+37: ATTRIBUTE "table:function",
+38: CHOICE
+39: VALUE 'auto',
+39: VALUE 'average',
+39: VALUE 'count',
+39: VALUE 'countnums',
+39: VALUE 'max',
+39: VALUE 'min',
+39: VALUE 'product',
+39: VALUE 'stdev',
+39: VALUE 'stdevp',
+39: VALUE 'sum',
+39: VALUE 'var',
+39: VALUE 'varp',
+39: REF 'string',
+40: DATA 'string',
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-members',
+31: ELEMENT "table:data-pilot-members",
+32: CHOICE
+33: ONEOREMORE
+34: REF 'table-data-pilot-member',
+35: ELEMENT "table:data-pilot-member",
+36: REF 'table-data-pilot-member-attlist',
+37: INTERLEAVE
+38: ATTRIBUTE "table:name",
+39: REF 'string',
+40: DATA 'string',
+38: CHOICE
+39: ATTRIBUTE "table:display",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+38: CHOICE
+39: ATTRIBUTE "table:show-details",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-display-info',
+31: ELEMENT "table:data-pilot-display-info",
+32: REF 'table-data-pilot-display-info-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "table:enabled",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: ATTRIBUTE "table:data-field",
+35: REF 'string',
+36: DATA 'string',
+34: ATTRIBUTE "table:member-count",
+35: REF 'nonNegativeInteger',
+36: DATA 'nonNegativeInteger',
+34: ATTRIBUTE "table:display-member-mode",
+35: CHOICE
+36: VALUE 'from-top',
+36: VALUE 'from-bottom',
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-sort-info',
+31: ELEMENT "table:data-pilot-sort-info",
+32: REF 'table-data-pilot-sort-info-attlist',
+33: INTERLEAVE
+34: CHOICE
+35: SEQUENCE
+36: ATTRIBUTE "table:sort-mode",
+37: VALUE 'data',
+36: ATTRIBUTE "table:data-field",
+37: REF 'string',
+38: DATA 'string',
+35: ATTRIBUTE "table:sort-mode",
+36: CHOICE
+37: VALUE 'none',
+37: VALUE 'manual',
+37: VALUE 'name',
+34: ATTRIBUTE "table:order",
+35: CHOICE
+36: VALUE 'ascending',
+36: VALUE 'descending',
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-layout-info',
+31: ELEMENT "table:data-pilot-layout-info",
+32: REF 'table-data-pilot-layout-info-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "table:layout-mode",
+35: CHOICE
+36: VALUE 'tabular-layout',
+36: VALUE 'outline-subtotals-top',
+36: VALUE 'outline-subtotals-bottom',
+34: ATTRIBUTE "table:add-empty-lines",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+30: EPSILON
+26: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-field-reference',
+27: ELEMENT "table:data-pilot-field-reference",
+28: REF 'table-data-pilot-field-reference-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-name",
+31: REF 'string',
+32: DATA 'string',
+30: CHOICE
+31: SEQUENCE
+32: ATTRIBUTE "table:member-type",
+33: VALUE 'named',
+32: ATTRIBUTE "table:member-name",
+33: REF 'string',
+34: DATA 'string',
+31: ATTRIBUTE "table:member-type",
+32: CHOICE
+33: VALUE 'previous',
+33: VALUE 'next',
+30: ATTRIBUTE "table:type",
+31: CHOICE
+32: VALUE 'none',
+32: VALUE 'member-difference',
+32: VALUE 'member-percentage',
+32: VALUE 'member-percentage-difference',
+32: VALUE 'running-total',
+32: VALUE 'row-percentage',
+32: VALUE 'column-percentage',
+32: VALUE 'total-percentage',
+32: VALUE 'index',
+26: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-groups',
+27: ELEMENT "table:data-pilot-groups",
+28: SEQUENCE
+29: REF 'table-data-pilot-groups-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:source-field-name",
+32: REF 'string',
+33: DATA 'string',
+31: CHOICE
+32: ATTRIBUTE "table:date-start",
+33: CHOICE
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+34: VALUE 'auto',
+32: ATTRIBUTE "table:start",
+33: CHOICE
+34: REF 'double',
+35: DATA 'double',
+34: VALUE 'auto',
+31: CHOICE
+32: ATTRIBUTE "table:date-end",
+33: CHOICE
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+34: VALUE 'auto',
+32: ATTRIBUTE "table:end",
+33: CHOICE
+34: REF 'double',
+35: DATA 'double',
+34: VALUE 'auto',
+31: ATTRIBUTE "table:step",
+32: REF 'double',
+33: DATA 'double',
+31: ATTRIBUTE "table:grouped-by",
+32: CHOICE
+33: VALUE 'seconds',
+33: VALUE 'minutes',
+33: VALUE 'hours',
+33: VALUE 'days',
+33: VALUE 'months',
+33: VALUE 'quarters',
+33: VALUE 'years',
+29: ONEOREMORE
+30: REF 'table-data-pilot-group',
+31: ELEMENT "table:data-pilot-group",
+32: SEQUENCE
+33: REF 'table-data-pilot-group-attlist',
+34: ATTRIBUTE "table:name",
+35: REF 'string',
+36: DATA 'string',
+33: ONEOREMORE
+34: REF 'table-data-pilot-group-member',
+35: ELEMENT "table:data-pilot-group-member",
+36: REF 'table-data-pilot-group-member-attlist',
+37: ATTRIBUTE "table:name",
+38: REF 'string',
+39: DATA 'string',
+26: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+15: ELEMENT "table:consolidation",
+16: REF 'table-consolidation-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "table:function",
+19: CHOICE
+20: VALUE 'auto',
+20: VALUE 'average',
+20: VALUE 'count',
+20: VALUE 'countnums',
+20: VALUE 'max',
+20: VALUE 'min',
+20: VALUE 'product',
+20: VALUE 'stdev',
+20: VALUE 'stdevp',
+20: VALUE 'sum',
+20: VALUE 'var',
+20: VALUE 'varp',
+20: REF 'string',
+21: DATA 'string',
+18: ATTRIBUTE "table:source-cell-range-addresses",
+19: REF 'cellRangeAddressList',
+20: DATA 'string',
+18: ATTRIBUTE "table:target-cell-address",
+19: REF 'cellAddress',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "table:use-labels",
+20: CHOICE
+21: VALUE 'none',
+21: VALUE 'row',
+21: VALUE 'column',
+21: VALUE 'both',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:link-to-source-data",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+15: ELEMENT "table:dde-links",
+16: ONEOREMORE
+17: REF 'table-dde-link',
+18: ELEMENT "table:dde-link",
+19: SEQUENCE
+20: REF 'office-dde-source',
+20: REF 'table-table',
+14: EPSILON
+8: ELEMENT "office:drawing",
+9: SEQUENCE
+10: REF 'office-drawing-attlist',
+11: EPSILON
+10: REF 'office-drawing-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-drawing-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-page',
+14: ELEMENT "draw:page",
+15: SEQUENCE
+16: REF 'common-presentation-header-footer-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "presentation:use-header-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:use-footer-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:use-date-time-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+16: REF 'draw-page-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "draw:name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: ATTRIBUTE "draw:master-page-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:presentation-page-layout-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:id",
+20: REF 'ID',
+21: DATA 'ID',
+19: EPSILON
+16: CHOICE
+17: REF 'office-forms',
+18: CHOICE
+17: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'shape',
+19: CHOICE
+20: REF 'draw-rect',
+20: REF 'draw-line',
+20: REF 'draw-polyline',
+20: REF 'draw-polygon',
+20: REF 'draw-regular-polygon',
+20: REF 'draw-path',
+20: REF 'draw-circle',
+20: REF 'draw-ellipse',
+20: REF 'draw-g',
+20: REF 'draw-page-thumbnail',
+20: REF 'draw-frame',
+20: REF 'draw-measure',
+20: REF 'draw-caption',
+20: REF 'draw-connector',
+20: REF 'draw-control',
+20: REF 'dr3d-scene',
+20: REF 'draw-custom-shape',
+17: EPSILON
+16: CHOICE
+17: REF 'presentation-animations',
+18: ELEMENT "presentation:animations",
+19: CHOICE
+20: ONEOREMORE
+21: CHOICE
+22: REF 'presentation-animation-elements',
+23: CHOICE
+24: REF 'presentation-show-shape',
+25: ELEMENT "presentation:show-shape",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-show-text',
+25: ELEMENT "presentation:show-text",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-hide-shape',
+25: ELEMENT "presentation:hide-shape",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-hide-text',
+25: ELEMENT "presentation:hide-text",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-dim',
+25: ELEMENT "presentation:dim",
+26: SEQUENCE
+27: REF 'presentation-dim-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: ATTRIBUTE "draw:color",
+30: REF 'color',
+31: DATA 'string',
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-play',
+25: ELEMENT "presentation:play",
+26: REF 'presentation-play-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "draw:shape-id",
+29: REF 'IDREF',
+30: DATA 'IDREF',
+28: CHOICE
+29: ATTRIBUTE "presentation:speed",
+30: REF 'presentationSpeeds',
+31: CHOICE
+32: VALUE 'slow',
+32: VALUE 'medium',
+32: VALUE 'fast',
+29: EPSILON
+22: REF 'presentation-animation-group',
+23: ELEMENT "presentation:animation-group",
+24: CHOICE
+25: ONEOREMORE
+26: REF 'presentation-animation-elements',
+27: CHOICE
+28: REF 'presentation-show-shape',
+28: REF 'presentation-show-text',
+28: REF 'presentation-hide-shape',
+28: REF 'presentation-hide-text',
+28: REF 'presentation-dim',
+28: REF 'presentation-play',
+25: EPSILON
+20: EPSILON
+17: REF 'animation-element',
+18: CHOICE
+19: ELEMENT "anim:animate",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-anim-spline-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:calcMode",
+24: CHOICE
+25: VALUE 'discrete',
+25: VALUE 'linear',
+25: VALUE 'paced',
+25: VALUE 'spline',
+23: EPSILON
+21: REF 'common-spline-anim-value-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:keyTimes",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:keySplines",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-repeat-timing-attlist',
+22: CHOICE
+23: SEQUENCE
+24: ATTRIBUTE "smil:repeatDur",
+25: REF 'string',
+26: DATA 'string',
+24: ATTRIBUTE "smil:repeatCount",
+25: REF 'nonNegativeInteger',
+26: DATA 'nonNegativeInteger',
+23: EPSILON
+21: REF 'common-fill-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:fill",
+24: CHOICE
+25: VALUE 'remove',
+25: VALUE 'freeze',
+25: VALUE 'hold',
+25: VALUE 'auto',
+25: VALUE 'default',
+25: VALUE 'transition',
+23: EPSILON
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+19: ELEMENT "anim:set",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-set-values-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:to",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-fill-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:fill",
+24: CHOICE
+25: VALUE 'remove',
+25: VALUE 'freeze',
+25: VALUE 'hold',
+25: VALUE 'auto',
+25: VALUE 'default',
+25: VALUE 'transition',
+23: EPSILON
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+19: ELEMENT "anim:animateMotion",
+20: SEQUENCE
+21: REF 'anim-animate-motion-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "svg:path",
+25: REF 'pathData',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "svg:origin",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:calcMode",
+25: CHOICE
+26: VALUE 'discrete',
+26: VALUE 'linear',
+26: VALUE 'paced',
+26: VALUE 'spline',
+24: EPSILON
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-fill-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:fill",
+24: CHOICE
+25: VALUE 'remove',
+25: VALUE 'freeze',
+25: VALUE 'hold',
+25: VALUE 'auto',
+25: VALUE 'default',
+25: VALUE 'transition',
+23: EPSILON
+21: REF 'common-spline-anim-value-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:keyTimes",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:keySplines",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+19: ELEMENT "anim:animateColor",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-anim-spline-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:calcMode",
+24: CHOICE
+25: VALUE 'discrete',
+25: VALUE 'linear',
+25: VALUE 'paced',
+25: VALUE 'spline',
+23: EPSILON
+21: REF 'common-spline-anim-value-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:keyTimes",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:keySplines",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'anim-animate-color-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "anim:color-interpolation",
+25: CHOICE
+26: VALUE 'rgb',
+26: VALUE 'hsl',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:color-interpolation-direction",
+25: CHOICE
+26: VALUE 'clockwise',
+26: VALUE 'counter-clockwise',
+24: EPSILON
+21: REF 'common-fill-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:fill",
+24: CHOICE
+25: VALUE 'remove',
+25: VALUE 'freeze',
+25: VALUE 'hold',
+25: VALUE 'auto',
+25: VALUE 'default',
+25: VALUE 'transition',
+23: EPSILON
+19: ELEMENT "anim:animateTransform",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'anim-animate-transform-attlist',
+22: ATTRIBUTE "svg:type",
+23: CHOICE
+24: VALUE 'translate',
+24: VALUE 'scale',
+24: VALUE 'rotate',
+24: VALUE 'skewX',
+24: VALUE 'skewY',
+21: REF 'common-fill-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:fill",
+24: CHOICE
+25: VALUE 'remove',
+25: VALUE 'freeze',
+25: VALUE 'hold',
+25: VALUE 'auto',
+25: VALUE 'default',
+25: VALUE 'transition',
+23: EPSILON
+19: ELEMENT "anim:transitionFilter",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-anim-spline-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:calcMode",
+24: CHOICE
+25: VALUE 'discrete',
+25: VALUE 'linear',
+25: VALUE 'paced',
+25: VALUE 'spline',
+23: EPSILON
+21: REF 'anim-transition-filter-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "smil:type",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "smil:subtype",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:direction",
+25: CHOICE
+26: VALUE 'forward',
+26: VALUE 'reverse',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:fadeColor",
+25: CHOICE
+26: VALUE 'forward',
+26: VALUE 'reverse',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:mode",
+25: CHOICE
+26: VALUE 'in',
+26: VALUE 'out',
+24: EPSILON
+21: REF 'common-fill-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:fill",
+24: CHOICE
+25: VALUE 'remove',
+25: VALUE 'freeze',
+25: VALUE 'hold',
+25: VALUE 'auto',
+25: VALUE 'default',
+25: VALUE 'transition',
+23: EPSILON
+19: ELEMENT "anim:par",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: CHOICE
+27: SEQUENCE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: ATTRIBUTE "smil:repeatCount",
+29: REF 'nonNegativeInteger',
+30: DATA 'nonNegativeInteger',
+27: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-endsync-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:endsync",
+24: CHOICE
+25: VALUE 'first',
+25: VALUE 'last',
+25: VALUE 'all',
+25: VALUE 'media',
+23: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: REF 'animation-element',
+24: CHOICE
+22: EPSILON
+19: ELEMENT "anim:seq",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'common-endsync-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:endsync",
+24: CHOICE
+25: VALUE 'first',
+25: VALUE 'last',
+25: VALUE 'all',
+25: VALUE 'media',
+23: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: CHOICE
+27: SEQUENCE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: ATTRIBUTE "smil:repeatCount",
+29: REF 'nonNegativeInteger',
+30: DATA 'nonNegativeInteger',
+27: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+19: ELEMENT "anim:iterate",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'anin-iterate-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:iterate-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:iterate-interval",
+25: REF 'duration',
+26: DATA 'duration',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: CHOICE
+27: SEQUENCE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: ATTRIBUTE "smil:repeatCount",
+29: REF 'nonNegativeInteger',
+30: DATA 'nonNegativeInteger',
+27: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-endsync-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:endsync",
+24: CHOICE
+25: VALUE 'first',
+25: VALUE 'last',
+25: VALUE 'all',
+25: VALUE 'media',
+23: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: REF 'animation-element',
+24: CHOICE
+22: EPSILON
+19: ELEMENT "anim:audio",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'anim-audio-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "xlink:href",
+25: REF 'anyURI',
+26: DATA 'anyURI',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:audio-level",
+25: REF 'double',
+26: DATA 'double',
+24: EPSILON
+21: REF 'common-basic-timing-attlist',
+22: SEQUENCE
+23: REF 'common-begin-end-timing-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:begin",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:end",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+23: REF 'common-dur-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:dur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+23: REF 'common-repeat-timing-attlist',
+24: CHOICE
+25: SEQUENCE
+26: ATTRIBUTE "smil:repeatDur",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "smil:repeatCount",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+25: EPSILON
+19: ELEMENT "anim:command",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'anim-command-attlist',
+22: ATTRIBUTE "anim:command",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-begin-end-timing-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:begin",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:end",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: ELEMENT "anim:param",
+24: SEQUENCE
+25: ATTRIBUTE "anim:name",
+26: STRING
+25: ATTRIBUTE "anim:value",
+26: STRING
+22: EPSILON
+17: EPSILON
+16: CHOICE
+17: REF 'presentation-notes',
+17: EPSILON
+12: EPSILON
+10: REF 'office-drawing-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:presentation",
+9: SEQUENCE
+10: REF 'office-presentation-attlist',
+11: EPSILON
+10: REF 'office-presentation-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+12: REF 'presentation-decls',
+13: CHOICE
+14: ONEOREMORE
+15: REF 'presentation-decl',
+16: CHOICE
+17: ELEMENT "presentation:header-decl",
+18: SEQUENCE
+19: REF 'presentation-header-decl-attlist',
+20: ATTRIBUTE "presentation:name",
+21: REF 'string',
+22: DATA 'string',
+19: STRING
+17: ELEMENT "presentation:footer-decl",
+18: SEQUENCE
+19: REF 'presentation-footer-decl-attlist',
+20: ATTRIBUTE "presentation:name",
+21: REF 'string',
+22: DATA 'string',
+19: STRING
+17: ELEMENT "presentation:date-time-decl",
+18: SEQUENCE
+19: REF 'presentation-date-time-decl-attlist',
+20: INTERLEAVE
+21: ATTRIBUTE "presentation:name",
+22: REF 'string',
+23: DATA 'string',
+21: ATTRIBUTE "presentation:source",
+22: CHOICE
+23: VALUE 'fixed',
+23: VALUE 'current-date',
+21: CHOICE
+22: ATTRIBUTE "style:data-style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+19: STRING
+14: EPSILON
+10: REF 'office-presentation-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-page',
+12: EPSILON
+10: REF 'office-presentation-content-epilogue',
+11: SEQUENCE
+12: REF 'presentation-settings',
+13: CHOICE
+14: ELEMENT "presentation:settings",
+15: SEQUENCE
+16: REF 'presentation-settings-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "presentation:start-page",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:full-screen",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:endless",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:pause",
+20: REF 'duration',
+21: DATA 'duration',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show-logo",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:force-manual",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:mouse-visible",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:mouse-as-pen",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:start-with-navigator",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:animations",
+20: CHOICE
+21: VALUE 'enabled',
+21: VALUE 'disabled',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:transition-on-click",
+20: CHOICE
+21: VALUE 'enabled',
+21: VALUE 'disabled',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:stay-on-top",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'presentation-show',
+19: ELEMENT "presentation:show",
+20: REF 'presentation-show-attlist',
+21: INTERLEAVE
+22: ATTRIBUTE "presentation:name",
+23: REF 'string',
+24: DATA 'string',
+22: ATTRIBUTE "presentation:pages",
+23: STRING
+17: EPSILON
+14: EPSILON
+12: REF 'table-functions',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-named-expressions',
+15: EPSILON
+14: CHOICE
+15: REF 'table-database-ranges',
+15: EPSILON
+14: CHOICE
+15: REF 'table-data-pilot-tables',
+15: EPSILON
+14: CHOICE
+15: REF 'table-consolidation',
+15: EPSILON
+14: CHOICE
+15: REF 'table-dde-links',
+15: EPSILON
+8: ELEMENT "office:spreadsheet",
+9: SEQUENCE
+10: REF 'office-spreadsheet-attlist',
+11: SEQUENCE
+12: CHOICE
+13: ATTRIBUTE "table:structure-protected",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+12: CHOICE
+13: ATTRIBUTE "table:protection-key",
+14: REF 'string',
+15: DATA 'string',
+13: EPSILON
+10: REF 'office-spreadsheet-content-prelude',
+11: SEQUENCE
+12: CHOICE
+13: REF 'table-tracked-changes',
+14: ELEMENT "table:tracked-changes",
+15: SEQUENCE
+16: REF 'table-tracked-changes-attlist',
+17: CHOICE
+18: ATTRIBUTE "table:track-changes",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: CHOICE
+19: REF 'table-cell-content-change',
+20: ELEMENT "table:cell-content-change",
+21: SEQUENCE
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'table-cell-address',
+23: ELEMENT "table:cell-address",
+24: REF 'common-table-cell-address-attlist',
+25: SEQUENCE
+26: ATTRIBUTE "table:column",
+27: REF 'integer',
+28: DATA 'integer',
+26: ATTRIBUTE "table:row",
+27: REF 'integer',
+28: DATA 'integer',
+26: ATTRIBUTE "table:table",
+27: REF 'integer',
+28: DATA 'integer',
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+24: ELEMENT "table:dependencies",
+25: ONEOREMORE
+26: REF 'table-dependency',
+27: ELEMENT "table:dependency",
+28: ATTRIBUTE "table:id",
+29: REF 'string',
+30: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+24: ELEMENT "table:deletions",
+25: ONEOREMORE
+26: CHOICE
+27: REF 'table-cell-content-deletion',
+28: ELEMENT "table:cell-content-deletion",
+29: SEQUENCE
+30: CHOICE
+31: ATTRIBUTE "table:id",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: REF 'table-cell-address',
+31: EPSILON
+30: CHOICE
+31: REF 'table-change-track-table-cell',
+32: ELEMENT "table:change-track-table-cell",
+33: SEQUENCE
+34: REF 'table-change-track-table-cell-attlist',
+35: INTERLEAVE
+36: CHOICE
+37: ATTRIBUTE "table:cell-address",
+38: REF 'cellAddress',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "table:matrix-covered",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+36: SEQUENCE
+37: CHOICE
+38: ATTRIBUTE "table:formula",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+37: CHOICE
+38: ATTRIBUTE "table:number-matrix-columns-spanned",
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+38: EPSILON
+37: CHOICE
+38: ATTRIBUTE "table:number-matrix-rows-spanned",
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+38: EPSILON
+37: CHOICE
+38: REF 'common-value-and-type-attlist',
+39: CHOICE
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'float',
+41: ATTRIBUTE "office:value",
+42: REF 'double',
+43: DATA 'double',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'percentage',
+41: ATTRIBUTE "office:value",
+42: REF 'double',
+43: DATA 'double',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'currency',
+41: ATTRIBUTE "office:value",
+42: REF 'double',
+43: DATA 'double',
+41: CHOICE
+42: ATTRIBUTE "office:currency",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'date',
+41: ATTRIBUTE "office:date-value",
+42: REF 'dateOrDateTime',
+43: CHOICE
+44: DATA 'date',
+44: DATA 'dateTime',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'time',
+41: ATTRIBUTE "office:time-value",
+42: REF 'duration',
+43: DATA 'duration',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'boolean',
+41: ATTRIBUTE "office:boolean-value",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'string',
+41: CHOICE
+42: ATTRIBUTE "office:string-value",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+38: EPSILON
+34: CHOICE
+35: ONEOREMORE
+36: REF 'text-p',
+35: EPSILON
+31: EPSILON
+27: REF 'table-change-deletion',
+28: ELEMENT "table:change-deletion",
+29: CHOICE
+30: ATTRIBUTE "table:id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+23: EPSILON
+22: REF 'table-previous',
+23: ELEMENT "table:previous",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:id",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: REF 'table-change-track-table-cell',
+19: REF 'table-insertion',
+20: ELEMENT "table:insertion",
+21: SEQUENCE
+22: REF 'table-insertion-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:type",
+25: CHOICE
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'table',
+24: ATTRIBUTE "table:position",
+25: REF 'integer',
+26: DATA 'integer',
+24: CHOICE
+25: ATTRIBUTE "table:count",
+26: REF 'positiveInteger',
+27: DATA 'positiveInteger',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:table",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+19: REF 'table-deletion',
+20: ELEMENT "table:deletion",
+21: SEQUENCE
+22: REF 'table-deletion-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:type",
+25: CHOICE
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'table',
+24: ATTRIBUTE "table:position",
+25: REF 'integer',
+26: DATA 'integer',
+24: CHOICE
+25: ATTRIBUTE "table:table",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:multi-deletion-spanned",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+22: CHOICE
+23: REF 'table-cut-offs',
+24: ELEMENT "table:cut-offs",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'table-movement-cut-off',
+28: ELEMENT "table:movement-cut-off",
+29: REF 'table-movement-cut-off-attlist',
+30: CHOICE
+31: ATTRIBUTE "table:position",
+32: REF 'integer',
+33: DATA 'integer',
+31: SEQUENCE
+32: ATTRIBUTE "table:start-position",
+33: REF 'integer',
+34: DATA 'integer',
+32: ATTRIBUTE "table:end-position",
+33: REF 'integer',
+34: DATA 'integer',
+26: SEQUENCE
+27: REF 'table-insertion-cut-off',
+28: ELEMENT "table:insertion-cut-off",
+29: REF 'table-insertion-cut-off-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:id",
+32: REF 'string',
+33: DATA 'string',
+31: ATTRIBUTE "table:position",
+32: REF 'integer',
+33: DATA 'integer',
+27: CHOICE
+28: ONEOREMORE
+29: REF 'table-movement-cut-off',
+28: EPSILON
+23: EPSILON
+19: REF 'table-movement',
+20: ELEMENT "table:movement",
+21: SEQUENCE
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'table-source-range-address',
+23: ELEMENT "table:source-range-address",
+24: REF 'common-table-range-attlist',
+25: CHOICE
+26: REF 'common-table-cell-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:table",
+29: REF 'integer',
+30: DATA 'integer',
+26: REF 'common-table-cell-range-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:start-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-table",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-table",
+29: REF 'integer',
+30: DATA 'integer',
+22: REF 'table-target-range-address',
+23: ELEMENT "table:target-range-address",
+24: REF 'common-table-range-attlist',
+25: CHOICE
+26: REF 'common-table-cell-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:table",
+29: REF 'integer',
+30: DATA 'integer',
+26: REF 'common-table-cell-range-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:start-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-table",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-table",
+29: REF 'integer',
+30: DATA 'integer',
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+17: EPSILON
+13: EPSILON
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-spreadsheet-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'table-table',
+12: EPSILON
+10: REF 'office-spreadsheet-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:chart",
+9: SEQUENCE
+10: REF 'office-chart-attlist',
+11: EPSILON
+10: REF 'office-chart-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-chart-content-main',
+11: REF 'chart-chart',
+12: ELEMENT "chart:chart",
+13: SEQUENCE
+14: REF 'chart-chart-attlist',
+15: INTERLEAVE
+16: ATTRIBUTE "chart:class",
+17: REF 'namespacedToken',
+18: DATA 'string',
+16: REF 'common-draw-size-attlist',
+17: SEQUENCE
+18: CHOICE
+19: ATTRIBUTE "svg:width",
+20: REF 'length',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "svg:height",
+20: REF 'length',
+21: DATA 'string',
+19: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:column-mapping",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:row-mapping",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:style-name",
+18: REF 'styleNameRef',
+19: CHOICE
+20: DATA 'NCName',
+20: EPSILON
+17: EPSILON
+14: CHOICE
+15: REF 'chart-title',
+16: ELEMENT "chart:title",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellAddress',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-subtitle',
+16: ELEMENT "chart:subtitle",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellAddress',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-footer',
+16: ELEMENT "chart:footer",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellAddress',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-legend',
+16: ELEMENT "chart:legend",
+17: REF 'chart-legend-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: SEQUENCE
+21: ATTRIBUTE "chart:legend-position",
+22: CHOICE
+23: VALUE 'start',
+23: VALUE 'end',
+23: VALUE 'top',
+23: VALUE 'bottom',
+21: CHOICE
+22: ATTRIBUTE "chart:legend-align",
+23: CHOICE
+24: VALUE 'start',
+24: VALUE 'center',
+24: VALUE 'end',
+22: EPSILON
+20: ATTRIBUTE "chart:legend-position",
+21: CHOICE
+22: VALUE 'top-start',
+22: VALUE 'bottom-start',
+22: VALUE 'top-end',
+22: VALUE 'bottom-end',
+20: EPSILON
+19: REF 'common-draw-position-attlist',
+20: SEQUENCE
+21: CHOICE
+22: ATTRIBUTE "svg:x",
+23: REF 'coordinate',
+24: REF 'length',
+25: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "svg:y",
+23: REF 'coordinate',
+24: REF 'length',
+25: DATA 'string',
+22: EPSILON
+19: CHOICE
+20: ATTRIBUTE "style:legend-expansion",
+21: CHOICE
+22: VALUE 'wide',
+22: VALUE 'high',
+22: VALUE 'balanced',
+20: SEQUENCE
+21: ATTRIBUTE "style:legend-expansion",
+22: VALUE 'custom',
+21: ATTRIBUTE "style:legend-expansion-aspect-ratio",
+22: REF 'double',
+23: DATA 'double',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+15: EPSILON
+14: REF 'chart-plot-area',
+15: ELEMENT "chart:plot-area",
+16: SEQUENCE
+17: REF 'chart-plot-area-attlist',
+18: INTERLEAVE
+19: SEQUENCE
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: REF 'common-draw-size-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:height",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "table:cell-range-address",
+21: REF 'cellRangeAddress',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:data-source-has-labels",
+21: CHOICE
+22: VALUE 'none',
+22: VALUE 'row',
+22: VALUE 'column',
+22: VALUE 'both',
+20: EPSILON
+19: SEQUENCE
+20: REF 'dr3d-scene-attlist',
+21: INTERLEAVE
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "dr3d:vrp",
+25: REF 'vector3D',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "dr3d:vpn",
+25: REF 'vector3D',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "dr3d:vup",
+25: REF 'vector3D',
+26: DATA 'string',
+24: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:projection",
+24: CHOICE
+25: VALUE 'parallel',
+25: VALUE 'perspective',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:distance",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:focal-length",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:shadow-slant",
+24: REF 'nonNegativeInteger',
+25: DATA 'nonNegativeInteger',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:shade-mode",
+24: CHOICE
+25: VALUE 'flat',
+25: VALUE 'phong',
+25: VALUE 'gouraud',
+25: VALUE 'draft',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:ambient-color",
+24: REF 'color',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:lighting-mode",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+20: REF 'common-dr3d-transform-attlist',
+21: CHOICE
+22: ATTRIBUTE "dr3d:transform",
+23: STRING
+22: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'dr3d-light',
+18: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'chart-axis',
+20: ELEMENT "chart:axis",
+21: SEQUENCE
+22: REF 'chart-axis-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "chart:dimension",
+25: CHOICE
+26: VALUE 'x',
+26: VALUE 'y',
+26: VALUE 'z',
+24: CHOICE
+25: ATTRIBUTE "chart:name",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:style-name",
+26: REF 'styleNameRef',
+27: CHOICE
+28: DATA 'NCName',
+28: EPSILON
+25: EPSILON
+22: CHOICE
+23: REF 'chart-title',
+23: EPSILON
+22: CHOICE
+23: REF 'chart-categories',
+24: ELEMENT "chart:categories",
+25: CHOICE
+26: ATTRIBUTE "table:cell-range-address",
+27: REF 'cellRangeAddress',
+28: DATA 'string',
+26: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-grid',
+25: ELEMENT "chart:grid",
+26: REF 'chart-grid-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "chart:class",
+30: CHOICE
+31: VALUE 'major',
+31: VALUE 'minor',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'chart-series',
+20: ELEMENT "chart:series",
+21: SEQUENCE
+22: REF 'chart-series-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "chart:values-cell-range-address",
+26: REF 'cellRangeAddress',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:label-cell-address",
+26: REF 'cellAddress',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:class",
+26: REF 'namespacedToken',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:attached-axis",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:style-name",
+26: REF 'styleNameRef',
+27: CHOICE
+28: DATA 'NCName',
+28: EPSILON
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-domain',
+25: ELEMENT "chart:domain",
+26: CHOICE
+27: ATTRIBUTE "table:cell-range-address",
+28: REF 'cellRangeAddress',
+29: DATA 'string',
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-mean-value',
+24: ELEMENT "chart:mean-value",
+25: REF 'chart-mean-value-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-regression-curve',
+24: ELEMENT "chart:regression-curve",
+25: REF 'chart-regression-curve-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-error-indicator',
+24: ELEMENT "chart:error-indicator",
+25: REF 'chart-error-indicator-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-data-point',
+25: ELEMENT "chart:data-point",
+26: REF 'chart-data-point-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "chart:repeated",
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-gain-marker',
+19: ELEMENT "chart:stock-gain-marker",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-loss-marker',
+19: ELEMENT "chart:stock-loss-marker",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-range-line',
+19: ELEMENT "chart:stock-range-line",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-wall',
+19: ELEMENT "chart:wall",
+20: REF 'chart-wall-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "chart:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-floor',
+19: ELEMENT "chart:floor",
+20: REF 'chart-floor-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "chart:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+18: EPSILON
+14: CHOICE
+15: REF 'table-table',
+15: EPSILON
+10: REF 'office-chart-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:image",
+9: SEQUENCE
+10: REF 'office-image-attlist',
+11: EPSILON
+10: REF 'office-image-content-prelude',
+11: EPSILON
+10: REF 'office-image-content-main',
+11: REF 'draw-frame',
+10: REF 'office-image-content-epilogue',
+11: EPSILON
+1: REF 'office-document-content',
+2: ELEMENT "office:document-content",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-scripts',
+5: CHOICE
+4: REF 'office-font-face-decls',
+5: CHOICE
+4: REF 'office-automatic-styles',
+5: CHOICE
+4: REF 'office-body',
+1: REF 'office-document-styles',
+2: ELEMENT "office:document-styles",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-font-face-decls',
+5: CHOICE
+4: REF 'office-styles',
+5: CHOICE
+4: REF 'office-automatic-styles',
+5: CHOICE
+4: REF 'office-master-styles',
+5: CHOICE
+1: REF 'office-document-meta',
+2: ELEMENT "office:document-meta",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-meta',
+5: CHOICE
+1: REF 'office-document-settings',
+2: ELEMENT "office:document-settings",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-settings',
+5: CHOICE
diff --git a/trunk/generator/schema2template/src/test/resources/examples/odf/odf11-msvtree.ref b/trunk/generator/schema2template/src/test/resources/examples/odf/odf11-msvtree.ref
new file mode 100644
index 0000000..15a1725
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/resources/examples/odf/odf11-msvtree.ref
@@ -0,0 +1,24704 @@
+0: CHOICE
+1: REF 'office-document',
+2: ELEMENT "office:document",
+3: SEQUENCE
+4: REF 'office-document-attrs',
+5: ATTRIBUTE "office:mimetype",
+6: REF 'string',
+7: DATA 'string',
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-meta',
+5: CHOICE
+6: ELEMENT "office:meta",
+7: REF 'office-meta-content',
+8: REF 'office-meta-content-strict',
+9: CHOICE
+10: ONEOREMORE
+11: REF 'office-meta-data',
+12: CHOICE
+13: ELEMENT "meta:generator",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "dc:title",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "dc:description",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "dc:subject",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "meta:keyword",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "meta:initial-creator",
+14: REF 'string',
+15: DATA 'string',
+13: REF 'dc-creator',
+14: ELEMENT "dc:creator",
+15: REF 'string',
+16: DATA 'string',
+13: ELEMENT "meta:printed-by",
+14: REF 'string',
+15: DATA 'string',
+13: ELEMENT "meta:creation-date",
+14: REF 'dateTime',
+15: DATA 'dateTime',
+13: REF 'dc-date',
+14: ELEMENT "dc:date",
+15: REF 'dateTime',
+16: DATA 'dateTime',
+13: ELEMENT "meta:print-date",
+14: REF 'dateTime',
+15: DATA 'dateTime',
+13: ELEMENT "meta:template",
+14: SEQUENCE
+15: ATTRIBUTE "xlink:href",
+16: REF 'anyURI',
+17: DATA 'anyURI',
+15: CHOICE
+16: ATTRIBUTE "xlink:type",
+17: VALUE 'simple',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:actuate",
+17: VALUE 'onRequest',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:title",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:date",
+17: REF 'dateTime',
+18: DATA 'dateTime',
+16: EPSILON
+13: ELEMENT "meta:auto-reload",
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "xlink:type",
+17: VALUE 'simple',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:show",
+17: VALUE 'replace',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:actuate",
+17: VALUE 'onLoad',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:href",
+17: REF 'anyURI',
+18: DATA 'anyURI',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:delay",
+17: REF 'duration',
+18: DATA 'duration',
+16: EPSILON
+13: ELEMENT "meta:hyperlink-behaviour",
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "office:target-frame-name",
+17: REF 'targetFrameName',
+18: CHOICE
+19: VALUE '_self',
+19: VALUE '_blank',
+19: VALUE '_parent',
+19: VALUE '_top',
+19: REF 'string',
+20: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "xlink:show",
+17: CHOICE
+18: VALUE 'new',
+18: VALUE 'replace',
+16: EPSILON
+13: ELEMENT "dc:language",
+14: REF 'language',
+15: DATA 'language',
+13: ELEMENT "meta:editing-cycles",
+14: REF 'nonNegativeInteger',
+15: DATA 'nonNegativeInteger',
+13: ELEMENT "meta:editing-duration",
+14: REF 'duration',
+15: DATA 'duration',
+13: ELEMENT "meta:document-statistic",
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "meta:page-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:table-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:draw-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:image-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:ole-object-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:object-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:paragraph-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:word-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:character-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "frame-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "sentence-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "syllable-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "non-whitespace-character-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:row-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "meta:cell-count",
+17: REF 'nonNegativeInteger',
+18: DATA 'nonNegativeInteger',
+16: EPSILON
+13: ELEMENT "meta:user-defined",
+14: SEQUENCE
+15: ATTRIBUTE "meta:name",
+16: REF 'string',
+17: DATA 'string',
+15: CHOICE
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'float',
+17: REF 'double',
+18: DATA 'double',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'date',
+17: REF 'dateOrDateTime',
+18: CHOICE
+19: DATA 'date',
+19: DATA 'dateTime',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'time',
+17: REF 'duration',
+18: DATA 'duration',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'boolean',
+17: REF 'boolean',
+18: CHOICE
+19: VALUE 'true',
+19: VALUE 'false',
+16: SEQUENCE
+17: ATTRIBUTE "meta:value-type",
+18: VALUE 'string',
+17: REF 'string',
+18: DATA 'string',
+16: STRING
+10: EPSILON
+6: EPSILON
+4: REF 'office-settings',
+5: CHOICE
+6: ELEMENT "office:settings",
+7: ONEOREMORE
+8: REF 'config-config-item-set',
+9: ELEMENT "config:config-item-set",
+10: SEQUENCE
+11: REF 'config-config-item-set-attlist',
+12: ATTRIBUTE "config:name",
+13: REF 'string',
+14: DATA 'string',
+11: REF 'config-items',
+12: ONEOREMORE
+13: CHOICE
+14: REF 'config-config-item',
+15: ELEMENT "config:config-item",
+16: SEQUENCE
+17: REF 'config-config-item-attlist',
+18: INTERLEAVE
+19: ATTRIBUTE "config:name",
+20: REF 'string',
+21: DATA 'string',
+19: ATTRIBUTE "config:type",
+20: CHOICE
+21: VALUE 'boolean',
+21: VALUE 'short',
+21: VALUE 'int',
+21: VALUE 'long',
+21: VALUE 'double',
+21: VALUE 'string',
+21: VALUE 'datetime',
+21: VALUE 'base64Binary',
+17: STRING
+14: REF 'config-config-item-set',
+14: REF 'config-config-item-map-named',
+15: ELEMENT "config:config-item-map-named",
+16: SEQUENCE
+17: REF 'config-config-item-map-named-attlist',
+18: ATTRIBUTE "config:name",
+19: REF 'string',
+20: DATA 'string',
+17: ONEOREMORE
+18: REF 'config-config-item-map-entry',
+19: ELEMENT "config:config-item-map-entry",
+20: SEQUENCE
+21: REF 'config-config-item-map-entry-attlist',
+22: CHOICE
+23: ATTRIBUTE "config:name",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'config-items',
+22: ONEOREMORE
+23: CHOICE
+24: REF 'config-config-item',
+24: REF 'config-config-item-set',
+24: REF 'config-config-item-map-named',
+24: REF 'config-config-item-map-indexed',
+25: ELEMENT "config:config-item-map-indexed",
+26: SEQUENCE
+27: REF 'config-config-item-map-indexed-attlist',
+28: ATTRIBUTE "config:name",
+29: REF 'string',
+30: DATA 'string',
+27: ONEOREMORE
+28: REF 'config-config-item-map-entry',
+14: REF 'config-config-item-map-indexed',
+6: EPSILON
+4: REF 'office-scripts',
+5: CHOICE
+6: ELEMENT "office:scripts",
+7: SEQUENCE
+8: CHOICE
+9: ONEOREMORE
+10: REF 'office-script',
+11: ELEMENT "office:script",
+12: SEQUENCE
+13: REF 'office-script-attlist',
+14: ATTRIBUTE "script:language",
+15: REF 'string',
+16: DATA 'string',
+13: MIXED
+14: REF 'anyElements',
+15: CHOICE
+16: ONEOREMORE
+17: ELEMENT "*",
+18: MIXED
+19: REF 'anyAttListOrElements',
+20: SEQUENCE
+21: CHOICE
+22: ONEOREMORE
+23: ATTRIBUTE "*",
+24: STRING
+22: EPSILON
+21: REF 'anyElements',
+22: CHOICE
+23: ONEOREMORE
+23: EPSILON
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'office-event-listeners',
+10: ELEMENT "office:event-listeners",
+11: CHOICE
+12: ONEOREMORE
+13: CHOICE
+14: REF 'script-event-listener',
+15: ELEMENT "script:event-listener",
+16: REF 'script-event-listener-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "script:event-name",
+19: REF 'string',
+20: DATA 'string',
+18: ATTRIBUTE "script:language",
+19: REF 'string',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "script:macro-name",
+20: REF 'string',
+21: DATA 'string',
+19: SEQUENCE
+20: ATTRIBUTE "xlink:href",
+21: REF 'anyURI',
+22: DATA 'anyURI',
+20: CHOICE
+21: ATTRIBUTE "xlink:type",
+22: VALUE 'simple',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:actuate",
+22: VALUE 'onRequest',
+21: EPSILON
+14: REF 'presentation-event-listener',
+15: ELEMENT "presentation:event-listener",
+16: SEQUENCE
+17: REF 'presentation-event-listener-attlist',
+18: INTERLEAVE
+19: ATTRIBUTE "script:event-name",
+20: REF 'string',
+21: DATA 'string',
+19: ATTRIBUTE "presentation:action",
+20: CHOICE
+21: VALUE 'none',
+21: VALUE 'previous-page',
+21: VALUE 'next-page',
+21: VALUE 'first-page',
+21: VALUE 'last-page',
+21: VALUE 'hide',
+21: VALUE 'stop',
+21: VALUE 'execute',
+21: VALUE 'show',
+21: VALUE 'verb',
+21: VALUE 'fade-out',
+21: VALUE 'sound',
+19: CHOICE
+20: ATTRIBUTE "presentation:effect",
+21: REF 'presentationEffects',
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'fade',
+23: VALUE 'move',
+23: VALUE 'stripes',
+23: VALUE 'open',
+23: VALUE 'close',
+23: VALUE 'dissolve',
+23: VALUE 'wavyline',
+23: VALUE 'random',
+23: VALUE 'lines',
+23: VALUE 'laser',
+23: VALUE 'appear',
+23: VALUE 'hide',
+23: VALUE 'move-short',
+23: VALUE 'checkerboard',
+23: VALUE 'rotate',
+23: VALUE 'stretch',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:direction",
+21: REF 'presentationEffectDirections',
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'from-left',
+23: VALUE 'from-top',
+23: VALUE 'from-right',
+23: VALUE 'from-bottom',
+23: VALUE 'from-center',
+23: VALUE 'from-upper-left',
+23: VALUE 'from-upper-right',
+23: VALUE 'from-lower-left',
+23: VALUE 'from-lower-right',
+23: VALUE 'to-left',
+23: VALUE 'to-top',
+23: VALUE 'to-right',
+23: VALUE 'to-bottom',
+23: VALUE 'to-upper-left',
+23: VALUE 'to-upper-right',
+23: VALUE 'to-lower-right',
+23: VALUE 'to-lower-left',
+23: VALUE 'path',
+23: VALUE 'spiral-inward-left',
+23: VALUE 'spiral-inward-right',
+23: VALUE 'spiral-outward-left',
+23: VALUE 'spiral-outward-right',
+23: VALUE 'vertical',
+23: VALUE 'horizontal',
+23: VALUE 'to-center',
+23: VALUE 'clockwise',
+23: VALUE 'counter-clockwise',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:speed",
+21: REF 'presentationSpeeds',
+22: CHOICE
+23: VALUE 'slow',
+23: VALUE 'medium',
+23: VALUE 'fast',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:start-scale",
+21: REF 'percent',
+22: DATA 'string',
+20: EPSILON
+19: SEQUENCE
+20: CHOICE
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyURI',
+23: DATA 'anyURI',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:type",
+22: VALUE 'simple',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:show",
+22: VALUE 'embed',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "xlink:actuate",
+22: VALUE 'onRequest',
+21: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:verb",
+21: REF 'nonNegativeInteger',
+22: DATA 'nonNegativeInteger',
+20: EPSILON
+17: CHOICE
+18: REF 'presentation-sound',
+19: ELEMENT "presentation:sound",
+20: SEQUENCE
+21: REF 'presentation-sound-attlist',
+22: CHOICE
+23: ATTRIBUTE "presentation:play-full",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyURI',
+23: DATA 'anyURI',
+21: CHOICE
+22: ATTRIBUTE "xlink:type",
+23: VALUE 'simple',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "xlink:actuate",
+23: VALUE 'onRequest',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "xlink:show",
+23: CHOICE
+24: VALUE 'new',
+24: VALUE 'replace',
+22: EPSILON
+18: EPSILON
+12: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-font-face-decls',
+5: CHOICE
+6: ELEMENT "office:font-face-decls",
+7: CHOICE
+8: ONEOREMORE
+9: REF 'style-font-face',
+10: ELEMENT "style:font-face",
+11: SEQUENCE
+12: REF 'style-font-face-attlist',
+13: INTERLEAVE
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "svg:font-family",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-style",
+17: REF 'fontStyle',
+18: CHOICE
+19: VALUE 'normal',
+19: VALUE 'italic',
+19: VALUE 'oblique',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-variant",
+17: REF 'fontVariant',
+18: CHOICE
+19: VALUE 'normal',
+19: VALUE 'small-caps',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-weight",
+17: REF 'fontWeight',
+18: CHOICE
+19: VALUE 'normal',
+19: VALUE 'bold',
+19: VALUE '100',
+19: VALUE '200',
+19: VALUE '300',
+19: VALUE '400',
+19: VALUE '500',
+19: VALUE '600',
+19: VALUE '700',
+19: VALUE '800',
+19: VALUE '900',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-stretch",
+17: CHOICE
+18: VALUE 'normal',
+18: VALUE 'ultra-condensed',
+18: VALUE 'extra-condensed',
+18: VALUE 'condensed',
+18: VALUE 'semi-condensed',
+18: VALUE 'semi-expanded',
+18: VALUE 'expanded',
+18: VALUE 'extra-expanded',
+18: VALUE 'ultra-expanded',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:font-size",
+17: REF 'positiveLength',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:unicode-range",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:units-per-em",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:panose-1",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:stemv",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:stemh",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:slope",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:cap-height",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:x-height",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:accent-height",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:ascent",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:descent",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:widths",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:bbox",
+17: STRING
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:ideographic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:alphabetic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:mathematical",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:hanging",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-ideographic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-alphabetic",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-mathematical",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:v-hanging",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:underline-position",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:underline-thickness",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:strikethrough-position",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:strikethrough-thickness",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:overline-position",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:overline-thickness",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+14: ATTRIBUTE "style:name",
+15: REF 'string',
+16: DATA 'string',
+14: CHOICE
+15: ATTRIBUTE "style:font-adornments",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-family-generic",
+16: REF 'fontFamilyGeneric',
+17: CHOICE
+18: VALUE 'roman',
+18: VALUE 'swiss',
+18: VALUE 'modern',
+18: VALUE 'decorative',
+18: VALUE 'script',
+18: VALUE 'system',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-pitch",
+16: REF 'fontPitch',
+17: CHOICE
+18: VALUE 'fixed',
+18: VALUE 'variable',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-charset",
+16: REF 'textEncoding',
+17: DATA 'string',
+15: EPSILON
+12: CHOICE
+13: REF 'svg-font-face-src',
+14: ELEMENT "svg:font-face-src",
+15: ONEOREMORE
+16: CHOICE
+17: REF 'svg-font-face-uri',
+18: ELEMENT "svg:font-face-uri",
+19: SEQUENCE
+20: REF 'common-svg-font-face-xlink-attlist',
+21: SEQUENCE
+22: ATTRIBUTE "xlink:href",
+23: REF 'anyURI',
+24: DATA 'anyURI',
+22: CHOICE
+23: ATTRIBUTE "xlink:type",
+24: VALUE 'simple',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "xlink:actuate",
+24: VALUE 'onRequest',
+23: EPSILON
+20: CHOICE
+21: ONEOREMORE
+22: REF 'svg-font-face-format',
+23: ELEMENT "svg:font-face-format",
+24: CHOICE
+25: ATTRIBUTE "svg:string",
+26: STRING
+25: EPSILON
+21: EPSILON
+17: REF 'svg-font-face-name',
+18: ELEMENT "svg:font-face-name",
+19: CHOICE
+20: ATTRIBUTE "svg:name",
+21: STRING
+20: EPSILON
+13: EPSILON
+12: CHOICE
+13: REF 'svg-definition-src',
+14: ELEMENT "svg:definition-src",
+15: REF 'common-svg-font-face-xlink-attlist',
+16: SEQUENCE
+17: ATTRIBUTE "xlink:href",
+18: REF 'anyURI',
+19: DATA 'anyURI',
+17: CHOICE
+18: ATTRIBUTE "xlink:type",
+19: VALUE 'simple',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "xlink:actuate",
+19: VALUE 'onRequest',
+18: EPSILON
+13: EPSILON
+8: EPSILON
+6: EPSILON
+4: REF 'office-styles',
+5: CHOICE
+6: ELEMENT "office:styles",
+7: INTERLEAVE
+8: REF 'styles',
+9: INTERLEAVE
+10: CHOICE
+11: ONEOREMORE
+12: REF 'style-style',
+13: ELEMENT "style:style",
+14: SEQUENCE
+15: REF 'style-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:parent-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:next-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:list-style-name",
+19: CHOICE
+20: REF 'styleName',
+21: DATA 'NCName',
+20: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:master-page-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:auto-update",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:data-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:class",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:default-outline-level",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: EPSILON
+15: REF 'style-style-content',
+16: CHOICE
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'text',
+18: CHOICE
+19: REF 'style-text-properties',
+20: ELEMENT "style:text-properties",
+21: REF 'style-text-properties-content',
+22: REF 'style-text-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-text-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "fo:font-variant",
+28: REF 'fontVariant',
+29: CHOICE
+30: VALUE 'normal',
+30: VALUE 'small-caps',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-transform",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'lowercase',
+29: VALUE 'uppercase',
+29: VALUE 'capitalize',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:use-window-font-color",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-outline",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-type",
+28: REF 'lineType',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'single',
+30: VALUE 'double',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-style",
+28: REF 'lineStyle',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'solid',
+30: VALUE 'dotted',
+30: VALUE 'dash',
+30: VALUE 'long-dash',
+30: VALUE 'dot-dash',
+30: VALUE 'dot-dot-dash',
+30: VALUE 'wave',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-width",
+28: REF 'lineWidth',
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'normal',
+30: VALUE 'bold',
+30: VALUE 'thin',
+30: VALUE 'dash',
+30: VALUE 'medium',
+30: VALUE 'thick',
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+30: REF 'percent',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-color",
+28: CHOICE
+29: VALUE 'font-color',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-text",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-text-style",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-position",
+28: LIST
+29: SEQUENCE
+30: CHOICE
+31: REF 'percent',
+32: DATA 'string',
+31: VALUE 'super',
+31: VALUE 'sub',
+30: CHOICE
+31: REF 'percent',
+32: DATA 'string',
+31: EPSILON
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-name",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-name-asian",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-name-complex",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-family",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-asian",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-complex",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-family-generic",
+29: REF 'fontFamilyGeneric',
+30: CHOICE
+31: VALUE 'roman',
+31: VALUE 'swiss',
+31: VALUE 'modern',
+31: VALUE 'decorative',
+31: VALUE 'script',
+31: VALUE 'system',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-generic-asian",
+29: REF 'fontFamilyGeneric',
+30: CHOICE
+31: VALUE 'roman',
+31: VALUE 'swiss',
+31: VALUE 'modern',
+31: VALUE 'decorative',
+31: VALUE 'script',
+31: VALUE 'system',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-family-generic-complex",
+29: REF 'fontFamilyGeneric',
+30: CHOICE
+31: VALUE 'roman',
+31: VALUE 'swiss',
+31: VALUE 'modern',
+31: VALUE 'decorative',
+31: VALUE 'script',
+31: VALUE 'system',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-style-name",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-name-asian",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-name-complex",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-pitch",
+29: REF 'fontPitch',
+30: CHOICE
+31: VALUE 'fixed',
+31: VALUE 'variable',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-pitch-asian",
+29: REF 'fontPitch',
+30: CHOICE
+31: VALUE 'fixed',
+31: VALUE 'variable',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-pitch-complex",
+29: REF 'fontPitch',
+30: CHOICE
+31: VALUE 'fixed',
+31: VALUE 'variable',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-charset",
+29: REF 'textEncoding',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-charset-asian",
+29: REF 'textEncoding',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-charset-complex",
+29: REF 'textEncoding',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-size",
+29: CHOICE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-asian",
+29: CHOICE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-complex",
+29: CHOICE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:font-size-rel",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-rel-asian",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-size-rel-complex",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:script-type",
+28: CHOICE
+29: VALUE 'latin',
+29: VALUE 'asian',
+29: VALUE 'complex',
+29: VALUE 'ignore',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:letter-spacing",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: VALUE 'normal',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:language",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:language-asian",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:language-complex",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:country",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:country-asian",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:country-complex",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-style",
+29: REF 'fontStyle',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'italic',
+31: VALUE 'oblique',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-asian",
+29: REF 'fontStyle',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'italic',
+31: VALUE 'oblique',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-style-complex",
+29: REF 'fontStyle',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'italic',
+31: VALUE 'oblique',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:font-relief",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'embossed',
+29: VALUE 'engraved',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-shadow",
+28: REF 'shadowType',
+29: CHOICE
+30: VALUE 'none',
+30: REF 'string',
+31: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-type",
+28: REF 'lineType',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'single',
+30: VALUE 'double',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-style",
+28: REF 'lineStyle',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'solid',
+30: VALUE 'dotted',
+30: VALUE 'dash',
+30: VALUE 'long-dash',
+30: VALUE 'dot-dash',
+30: VALUE 'dot-dot-dash',
+30: VALUE 'wave',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-width",
+28: REF 'lineWidth',
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'normal',
+30: VALUE 'bold',
+30: VALUE 'thin',
+30: VALUE 'dash',
+30: VALUE 'medium',
+30: VALUE 'thick',
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+30: REF 'percent',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-color",
+28: CHOICE
+29: VALUE 'font-color',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:font-weight",
+29: REF 'fontWeight',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'bold',
+31: VALUE '100',
+31: VALUE '200',
+31: VALUE '300',
+31: VALUE '400',
+31: VALUE '500',
+31: VALUE '600',
+31: VALUE '700',
+31: VALUE '800',
+31: VALUE '900',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-weight-asian",
+29: REF 'fontWeight',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'bold',
+31: VALUE '100',
+31: VALUE '200',
+31: VALUE '300',
+31: VALUE '400',
+31: VALUE '500',
+31: VALUE '600',
+31: VALUE '700',
+31: VALUE '800',
+31: VALUE '900',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:font-weight-complex",
+29: REF 'fontWeight',
+30: CHOICE
+31: VALUE 'normal',
+31: VALUE 'bold',
+31: VALUE '100',
+31: VALUE '200',
+31: VALUE '300',
+31: VALUE '400',
+31: VALUE '500',
+31: VALUE '600',
+31: VALUE '700',
+31: VALUE '800',
+31: VALUE '900',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-underline-mode",
+28: REF 'lineMode',
+29: CHOICE
+30: VALUE 'continuous',
+30: VALUE 'skip-white-space',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-line-through-mode",
+28: REF 'lineMode',
+29: CHOICE
+30: VALUE 'continuous',
+30: VALUE 'skip-white-space',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:letter-kerning",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-blinking",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-combine",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'letters',
+29: VALUE 'lines',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:text-combine-start-char",
+29: REF 'character',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:text-combine-end-char",
+29: REF 'character',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-emphasize",
+28: CHOICE
+29: VALUE 'none',
+29: LIST
+30: SEQUENCE
+31: CHOICE
+32: VALUE 'none',
+32: VALUE 'accent',
+32: VALUE 'dot',
+32: VALUE 'circle',
+32: VALUE 'disc',
+31: CHOICE
+32: VALUE 'above',
+32: VALUE 'below',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-scale",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-rotation-angle",
+28: REF 'integer',
+29: DATA 'integer',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-rotation-scale",
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'line-height',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenate",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-remain-char-count",
+28: REF 'positiveInteger',
+29: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-push-char-count",
+28: REF 'positiveInteger',
+29: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:display",
+28: VALUE 'true',
+27: ATTRIBUTE "text:display",
+28: VALUE 'none',
+27: SEQUENCE
+28: ATTRIBUTE "text:display",
+29: VALUE 'condition',
+28: ATTRIBUTE "text:condition",
+29: VALUE 'none',
+27: EPSILON
+24: REF 'style-text-properties-elements',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'paragraph',
+18: CHOICE
+19: REF 'style-paragraph-properties',
+20: ELEMENT "style:paragraph-properties",
+21: REF 'style-paragraph-properties-content',
+22: REF 'style-paragraph-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-paragraph-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "fo:line-height",
+28: CHOICE
+29: VALUE 'normal',
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-height-at-least",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-spacing",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:font-independent-line-spacing",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-text-align',
+27: CHOICE
+28: ATTRIBUTE "fo:text-align",
+29: CHOICE
+30: VALUE 'start',
+30: VALUE 'end',
+30: VALUE 'left',
+30: VALUE 'right',
+30: VALUE 'center',
+30: VALUE 'justify',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-align-last",
+28: CHOICE
+29: VALUE 'start',
+29: VALUE 'center',
+29: VALUE 'justify',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:justify-single-word",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:keep-together",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'always',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:widows",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:orphans",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:tab-stop-distance",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-keep",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'page',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:hyphenation-ladder-count",
+28: CHOICE
+29: VALUE 'no-limit',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:register-true",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:text-indent",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:auto-text-indent",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-vertical-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-top",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-bottom",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-margin-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:margin",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-border-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:border",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-top",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-bottom",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-left",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-right",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-border-line-width-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-top",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-bottom",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-left",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-right",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+26: REF 'common-padding-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:padding",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-top",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-bottom",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-left",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-right",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-keep-with-next-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:keep-with-next",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'always',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:number-lines",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:line-number",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-autospace",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'ideograph-alpha',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:punctuation-wrap",
+28: CHOICE
+29: VALUE 'simple',
+29: VALUE 'hanging',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-break",
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'strict',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:vertical-align",
+28: CHOICE
+29: VALUE 'top',
+29: VALUE 'middle',
+29: VALUE 'bottom',
+29: VALUE 'auto',
+29: VALUE 'baseline',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode-automatic",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:snap-to-layout-grid",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-page-number-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:page-number",
+29: CHOICE
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+30: VALUE 'auto',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:background-transparency",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+24: REF 'style-paragraph-properties-elements',
+25: INTERLEAVE
+26: REF 'style-tab-stops',
+27: CHOICE
+28: ELEMENT "style:tab-stops",
+29: CHOICE
+30: ONEOREMORE
+31: REF 'style-tab-stop',
+32: ELEMENT "style:tab-stop",
+33: REF 'style-tab-stop-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "style:position",
+36: REF 'nonNegativeLength',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "style:type",
+37: CHOICE
+38: VALUE 'left',
+38: VALUE 'center',
+38: VALUE 'right',
+36: EPSILON
+36: SEQUENCE
+37: ATTRIBUTE "style:type",
+38: VALUE 'char',
+37: REF 'style-tab-stop-char-attlist',
+38: ATTRIBUTE "style:char",
+39: REF 'character',
+40: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "style:leader-type",
+37: REF 'lineType',
+38: CHOICE
+39: VALUE 'none',
+39: VALUE 'single',
+39: VALUE 'double',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-style",
+37: REF 'lineStyle',
+38: CHOICE
+39: VALUE 'none',
+39: VALUE 'solid',
+39: VALUE 'dotted',
+39: VALUE 'dash',
+39: VALUE 'long-dash',
+39: VALUE 'dot-dash',
+39: VALUE 'dot-dot-dash',
+39: VALUE 'wave',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-width",
+37: REF 'lineWidth',
+38: CHOICE
+39: VALUE 'auto',
+39: VALUE 'normal',
+39: VALUE 'bold',
+39: VALUE 'thin',
+39: VALUE 'dash',
+39: VALUE 'medium',
+39: VALUE 'thick',
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+39: REF 'percent',
+40: DATA 'string',
+39: REF 'positiveLength',
+40: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-color",
+37: CHOICE
+38: VALUE 'font-color',
+38: REF 'color',
+39: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-text",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:leader-text-style",
+37: REF 'styleNameRef',
+38: CHOICE
+39: DATA 'NCName',
+39: EPSILON
+36: EPSILON
+30: EPSILON
+28: EPSILON
+26: REF 'style-drop-cap',
+27: CHOICE
+28: ELEMENT "style:drop-cap",
+29: REF 'style-drop-cap-attlist',
+30: INTERLEAVE
+31: CHOICE
+32: ATTRIBUTE "style:length",
+33: CHOICE
+34: VALUE 'word',
+34: REF 'positiveInteger',
+35: DATA 'positiveInteger',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:lines",
+33: REF 'positiveInteger',
+34: DATA 'positiveInteger',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:distance",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+28: EPSILON
+26: REF 'style-background-image',
+27: CHOICE
+28: ELEMENT "style:background-image",
+29: SEQUENCE
+30: REF 'style-background-image-attlist',
+31: INTERLEAVE
+32: CHOICE
+33: ATTRIBUTE "style:repeat",
+34: CHOICE
+35: VALUE 'no-repeat',
+35: VALUE 'repeat',
+35: VALUE 'stretch',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "style:position",
+34: CHOICE
+35: VALUE 'left',
+35: VALUE 'center',
+35: VALUE 'right',
+35: VALUE 'top',
+35: VALUE 'bottom',
+35: LIST
+36: SEQUENCE
+37: REF 'horiBackPos',
+38: CHOICE
+39: VALUE 'left',
+39: VALUE 'center',
+39: VALUE 'right',
+37: REF 'vertBackPos',
+38: CHOICE
+39: VALUE 'top',
+39: VALUE 'center',
+39: VALUE 'bottom',
+35: LIST
+36: SEQUENCE
+37: REF 'vertBackPos',
+38: CHOICE
+39: VALUE 'top',
+39: VALUE 'center',
+39: VALUE 'bottom',
+37: REF 'horiBackPos',
+38: CHOICE
+39: VALUE 'left',
+39: VALUE 'center',
+39: VALUE 'right',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "style:filter-name",
+34: REF 'string',
+35: DATA 'string',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "draw:opacity",
+34: REF 'percent',
+35: DATA 'string',
+33: EPSILON
+30: CHOICE
+31: REF 'common-draw-data-attlist',
+32: SEQUENCE
+33: ATTRIBUTE "xlink:href",
+34: REF 'anyURI',
+35: DATA 'anyURI',
+33: CHOICE
+34: ATTRIBUTE "xlink:type",
+35: VALUE 'simple',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "xlink:show",
+35: VALUE 'embed',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "xlink:actuate",
+35: VALUE 'onLoad',
+34: EPSILON
+31: REF 'office-binary-data',
+32: ELEMENT "office:binary-data",
+33: REF 'base64Binary',
+34: DATA 'base64Binary',
+31: EPSILON
+28: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'section',
+18: CHOICE
+19: REF 'style-section-properties',
+20: ELEMENT "style:section-properties",
+21: REF 'style-section-properties-content',
+22: REF 'style-section-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-section-properties-attlist',
+25: INTERLEAVE
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:protect",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:dont-balance-text-columns",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+24: REF 'style-section-properties-elements',
+25: INTERLEAVE
+26: REF 'style-background-image',
+27: CHOICE
+26: REF 'style-columns',
+27: CHOICE
+28: ELEMENT "style:columns",
+29: SEQUENCE
+30: REF 'style-columns-attlist',
+31: INTERLEAVE
+32: ATTRIBUTE "fo:column-count",
+33: REF 'positiveInteger',
+34: DATA 'positiveInteger',
+32: CHOICE
+33: ATTRIBUTE "fo:column-gap",
+34: REF 'length',
+35: DATA 'string',
+33: EPSILON
+30: CHOICE
+31: REF 'style-column-sep',
+32: ELEMENT "style:column-sep",
+33: REF 'style-column-sep-attlist',
+34: INTERLEAVE
+35: CHOICE
+36: ATTRIBUTE "style:style",
+37: CHOICE
+38: VALUE 'none',
+38: VALUE 'solid',
+38: VALUE 'dotted',
+38: VALUE 'dashed',
+38: VALUE 'dot-dashed',
+36: EPSILON
+35: ATTRIBUTE "style:width",
+36: REF 'length',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "style:height",
+37: REF 'percent',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:vertical-align",
+37: CHOICE
+38: VALUE 'top',
+38: VALUE 'middle',
+38: VALUE 'bottom',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:color",
+37: REF 'color',
+38: DATA 'string',
+36: EPSILON
+31: EPSILON
+30: CHOICE
+31: ONEOREMORE
+32: REF 'style-column',
+33: ELEMENT "style:column",
+34: REF 'style-column-attlist',
+35: INTERLEAVE
+36: ATTRIBUTE "style:rel-width",
+37: REF 'relativeLength',
+38: DATA 'string',
+36: CHOICE
+37: ATTRIBUTE "fo:start-indent",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "fo:end-indent",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "fo:space-before",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "fo:space-after",
+38: REF 'length',
+39: DATA 'string',
+37: EPSILON
+31: EPSILON
+28: EPSILON
+26: CHOICE
+27: ONEOREMORE
+28: REF 'text-notes-configuration',
+29: ELEMENT "text:notes-configuration",
+30: REF 'text-notes-configuration-content',
+31: INTERLEAVE
+32: REF 'text-note-class',
+33: ATTRIBUTE "text:note-class",
+34: CHOICE
+35: VALUE 'footnote',
+35: VALUE 'endnote',
+32: CHOICE
+33: ATTRIBUTE "text:citation-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:citation-body-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:default-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:master-page-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:start-value",
+34: REF 'nonNegativeInteger',
+35: DATA 'nonNegativeInteger',
+33: EPSILON
+32: SEQUENCE
+33: REF 'common-num-format-prefix-suffix-attlist',
+34: SEQUENCE
+35: CHOICE
+36: ATTRIBUTE "style:num-prefix",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "style:num-suffix",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+33: CHOICE
+34: REF 'common-num-format-attlist',
+35: CHOICE
+36: ATTRIBUTE "style:num-format",
+37: CHOICE
+38: VALUE '1',
+38: VALUE 'i',
+38: VALUE 'I',
+38: REF 'string',
+39: DATA 'string',
+38: EPSILON
+36: SEQUENCE
+37: ATTRIBUTE "style:num-format",
+38: CHOICE
+39: VALUE 'a',
+39: VALUE 'A',
+37: REF 'style-num-letter-sync-attlist',
+38: CHOICE
+39: ATTRIBUTE "style:num-letter-sync",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+36: EPSILON
+34: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:start-numbering-at",
+34: CHOICE
+35: VALUE 'document',
+35: VALUE 'chapter',
+35: VALUE 'page',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:footnotes-position",
+34: CHOICE
+35: VALUE 'text',
+35: VALUE 'page',
+35: VALUE 'section',
+35: VALUE 'document',
+33: EPSILON
+32: CHOICE
+33: ELEMENT "text:note-continuation-notice-forward",
+34: STRING
+33: EPSILON
+32: CHOICE
+33: ELEMENT "text:note-continuation-notice-backward",
+34: STRING
+33: EPSILON
+27: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'ruby',
+18: CHOICE
+19: REF 'style-ruby-properties',
+20: ELEMENT "style:ruby-properties",
+21: REF 'style-ruby-properties-content',
+22: REF 'style-ruby-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-ruby-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "style:ruby-position",
+28: CHOICE
+29: VALUE 'above',
+29: VALUE 'below',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:ruby-align",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+29: VALUE 'distribute-letter',
+29: VALUE 'distribute-space',
+27: EPSILON
+24: REF 'style-ruby-properties-elements',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table',
+18: CHOICE
+19: REF 'style-table-properties',
+20: ELEMENT "style:table-properties",
+21: REF 'style-table-properties-content',
+22: REF 'style-table-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-properties-attlist',
+25: INTERLEAVE
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:width",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:rel-width",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:align",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+29: VALUE 'margins',
+27: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-vertical-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-top",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-bottom",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-margin-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:margin",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-page-number-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:page-number",
+29: CHOICE
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+30: VALUE 'auto',
+28: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-keep-with-next-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:keep-with-next",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'always',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:may-break-between-rows",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:border-model",
+28: CHOICE
+29: VALUE 'collapsing',
+29: VALUE 'separating',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:display",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+24: REF 'style-table-properties-elements',
+25: REF 'style-background-image',
+26: CHOICE
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-column',
+18: CHOICE
+19: REF 'style-table-column-properties',
+20: ELEMENT "style:table-column-properties",
+21: REF 'style-table-column-properties-content',
+22: REF 'style-table-column-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-column-properties-attlist',
+25: INTERLEAVE
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:column-width",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:rel-column-width",
+29: REF 'relativeLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:use-optimal-column-width",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+24: REF 'style-table-column-properties-elements',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-row',
+18: CHOICE
+19: REF 'style-table-row-properties',
+20: ELEMENT "style:table-row-properties",
+21: REF 'style-table-row-properties-content',
+22: REF 'style-table-row-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-row-properties-attlist',
+25: INTERLEAVE
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:row-height",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:min-row-height",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:use-optimal-row-height",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-break-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:break-before",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:break-after",
+30: CHOICE
+31: VALUE 'auto',
+31: VALUE 'column',
+31: VALUE 'page',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:keep-together",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'always',
+27: EPSILON
+24: REF 'style-table-row-properties-elements',
+25: REF 'style-background-image',
+26: CHOICE
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-cell',
+18: CHOICE
+19: REF 'style-table-cell-properties',
+20: ELEMENT "style:table-cell-properties",
+21: REF 'style-table-cell-properties-content',
+22: REF 'style-table-cell-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-table-cell-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "style:vertical-align",
+28: CHOICE
+29: VALUE 'top',
+29: VALUE 'middle',
+29: VALUE 'bottom',
+29: VALUE 'automatic',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:text-align-source",
+28: CHOICE
+29: VALUE 'fix',
+29: VALUE 'value-type',
+27: EPSILON
+26: REF 'common-style-direction-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:direction",
+29: CHOICE
+30: VALUE 'ltr',
+30: VALUE 'ttb',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:glyph-orientation-vertical",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE '0',
+27: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-border-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:border",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-top",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-bottom",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-left",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-right",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-tl-br",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-tl-br-widths",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-bl-tr",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:diagonal-bl-tr-widths",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+26: REF 'common-border-line-width-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-top",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-bottom",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-left",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-right",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+26: REF 'common-padding-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:padding",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-top",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-bottom",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-left",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-right",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:wrap-option",
+28: CHOICE
+29: VALUE 'no-wrap',
+29: VALUE 'wrap',
+27: EPSILON
+26: REF 'common-rotation-angle-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:rotation-angle",
+29: REF 'nonNegativeInteger',
+30: DATA 'nonNegativeInteger',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:rotation-align",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'bottom',
+29: VALUE 'top',
+29: VALUE 'center',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:cell-protect",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'hidden-and-protected',
+29: LIST
+30: ONEOREMORE
+31: CHOICE
+32: VALUE 'protected',
+32: VALUE 'formula-hidden',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:print-content",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:decimal-places",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:repeat-content",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:shrink-to-fit",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+24: REF 'style-table-cell-properties-elements',
+25: REF 'style-background-image',
+26: CHOICE
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: CHOICE
+20: VALUE 'graphic',
+20: VALUE 'presentation',
+18: CHOICE
+19: REF 'style-graphic-properties',
+20: ELEMENT "style:graphic-properties",
+21: REF 'style-graphic-properties-content',
+22: REF 'style-graphic-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-graphic-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "draw:stroke",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'dash',
+29: VALUE 'solid',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:stroke-dash",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:stroke-dash-names",
+28: REF 'styleNameRefs',
+29: LIST
+30: CHOICE
+31: ONEOREMORE
+32: DATA 'NCName',
+31: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:stroke-width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:stroke-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-start",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-end",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-start-width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-end-width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-start-center",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:marker-end-center",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:stroke-opacity",
+28: CHOICE
+29: DATA 'double',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:stroke-linejoin",
+28: CHOICE
+29: VALUE 'miter',
+29: VALUE 'round',
+29: VALUE 'bevel',
+29: VALUE 'middle',
+29: VALUE 'none',
+29: VALUE 'inherit',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:symbol-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'scroll',
+29: VALUE 'alternate',
+29: VALUE 'slide',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-direction",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'right',
+29: VALUE 'up',
+29: VALUE 'down',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-start-inside",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-stop-inside",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-repeat",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-delay",
+28: REF 'duration',
+29: DATA 'duration',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "text:animation-steps",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:auto-grow-width",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:auto-grow-height",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fit-to-size",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fit-to-contour",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:textarea-vertical-align",
+28: CHOICE
+29: VALUE 'top',
+29: VALUE 'middle',
+29: VALUE 'bottom',
+29: VALUE 'justify',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:textarea-horizontal-align",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+29: VALUE 'justify',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:wrap-option",
+28: CHOICE
+29: VALUE 'no-wrap',
+29: VALUE 'wrap',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:color-mode",
+28: CHOICE
+29: VALUE 'greyscale',
+29: VALUE 'mono',
+29: VALUE 'watermark',
+29: VALUE 'standard',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:color-inversion",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:luminance",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:contrast",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:gamma",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:red",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:green",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:blue",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:image-opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:shadow",
+28: CHOICE
+29: VALUE 'visible',
+29: VALUE 'hidden',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:shadow-offset-x",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:shadow-offset-y",
+29: REF 'length',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:shadow-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:shadow-opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:start-line-spacing-horizontal",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:start-line-spacing-vertical",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:end-line-spacing-horizontal",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:end-line-spacing-vertical",
+29: REF 'distance',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:line-distance",
+28: REF 'distance',
+29: REF 'length',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:guide-overhang",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:guide-distance",
+28: REF 'distance',
+29: REF 'length',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:start-guide",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:end-guide",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:placing",
+28: CHOICE
+29: VALUE 'below',
+29: VALUE 'above',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:parallel",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:measure-align",
+29: CHOICE
+30: VALUE 'automatic',
+30: VALUE 'left-outside',
+30: VALUE 'inside',
+30: VALUE 'right-outside',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:measure-vertical-align",
+29: CHOICE
+30: VALUE 'automatic',
+30: VALUE 'above',
+30: VALUE 'below',
+30: VALUE 'center',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:unit",
+28: CHOICE
+29: VALUE 'automatic',
+29: VALUE 'mm',
+29: VALUE 'cm',
+29: VALUE 'm',
+29: VALUE 'km',
+29: VALUE 'pt',
+29: VALUE 'pc',
+29: VALUE 'inch',
+29: VALUE 'ft',
+29: VALUE 'mi',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:show-unit",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:decimal-places",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-type",
+28: CHOICE
+29: VALUE 'straight-line',
+29: VALUE 'angled-line',
+29: VALUE 'angled-connector-line',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-angle-type",
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'free',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-angle",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-gap",
+28: REF 'distance',
+29: REF 'length',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-escape-direction",
+28: CHOICE
+29: VALUE 'horizontal',
+29: VALUE 'vertical',
+29: VALUE 'auto',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-escape",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-line-length",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:caption-fit-line-length",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:horizontal-segments",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:vertical-segments",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:edge-rounding",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:edge-rounding-mode",
+28: CHOICE
+29: VALUE 'correct',
+29: VALUE 'attractive',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:back-scale",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:depth",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:backface-culling",
+28: CHOICE
+29: VALUE 'enabled',
+29: VALUE 'disabled',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:end-angle",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:close-front",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:close-back",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:lighting-mode",
+28: CHOICE
+29: VALUE 'standard',
+29: VALUE 'double-sided',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:normals-kind",
+28: CHOICE
+29: VALUE 'object',
+29: VALUE 'flat',
+29: VALUE 'sphere',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:normals-direction",
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'inverse',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "dr3d:texture-generation-mode-x",
+29: CHOICE
+30: VALUE 'object',
+30: VALUE 'parallel',
+30: VALUE 'sphere',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:texture-generation-mode-y",
+29: CHOICE
+30: VALUE 'object',
+30: VALUE 'parallel',
+30: VALUE 'sphere',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:texture-kind",
+28: CHOICE
+29: VALUE 'luminance',
+29: VALUE 'intensity',
+29: VALUE 'color',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:texture-filter",
+28: CHOICE
+29: VALUE 'enabled',
+29: VALUE 'disabled',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:texture-mode",
+28: CHOICE
+29: VALUE 'replace',
+29: VALUE 'modulate',
+29: VALUE 'blend',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "dr3d:ambient-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:emissive-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:specular-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "dr3d:diffuse-color",
+29: REF 'color',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:shininess",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "dr3d:shadow",
+28: CHOICE
+29: VALUE 'visible',
+29: VALUE 'hidden',
+27: EPSILON
+26: SEQUENCE
+27: REF 'common-draw-rel-size-attlist',
+28: SEQUENCE
+29: REF 'common-draw-size-attlist',
+30: SEQUENCE
+31: CHOICE
+32: ATTRIBUTE "svg:width",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "svg:height",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+29: CHOICE
+30: ATTRIBUTE "style:rel-width",
+31: CHOICE
+32: REF 'percent',
+33: DATA 'string',
+32: VALUE 'scale',
+32: VALUE 'scale-min',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "style:rel-height",
+31: CHOICE
+32: REF 'percent',
+33: DATA 'string',
+32: VALUE 'scale',
+32: VALUE 'scale-min',
+30: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:min-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:min-height",
+28: CHOICE
+29: REF 'length',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:max-height",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:max-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: REF 'common-horizontal-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-left",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-right",
+30: CHOICE
+31: REF 'length',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-vertical-margin-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:margin-top",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:margin-bottom",
+30: CHOICE
+31: REF 'nonNegativeLength',
+32: DATA 'string',
+31: REF 'percent',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-margin-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:margin",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:print-content",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:protect",
+28: CHOICE
+29: VALUE 'none',
+29: LIST
+30: ONEOREMORE
+31: CHOICE
+32: VALUE 'content',
+32: VALUE 'position',
+32: VALUE 'size',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:horizontal-pos",
+29: CHOICE
+30: VALUE 'left',
+30: VALUE 'center',
+30: VALUE 'right',
+30: VALUE 'from-left',
+30: VALUE 'inside',
+30: VALUE 'outside',
+30: VALUE 'from-inside',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "svg:x",
+29: REF 'coordinate',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:horizontal-rel",
+28: CHOICE
+29: VALUE 'page',
+29: VALUE 'page-content',
+29: VALUE 'page-start-margin',
+29: VALUE 'page-end-margin',
+29: VALUE 'frame',
+29: VALUE 'frame-content',
+29: VALUE 'frame-start-margin',
+29: VALUE 'frame-end-margin',
+29: VALUE 'paragraph',
+29: VALUE 'paragraph-content',
+29: VALUE 'paragraph-start-margin',
+29: VALUE 'paragraph-end-margin',
+29: VALUE 'char',
+27: EPSILON
+26: REF 'common-vertical-pos-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:vertical-pos",
+30: CHOICE
+31: VALUE 'top',
+31: VALUE 'middle',
+31: VALUE 'bottom',
+31: VALUE 'from-top',
+31: VALUE 'below',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "svg:y",
+30: REF 'coordinate',
+31: REF 'length',
+32: DATA 'string',
+29: EPSILON
+26: REF 'common-vertical-rel-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:vertical-rel",
+29: CHOICE
+30: VALUE 'page',
+30: VALUE 'page-content',
+30: VALUE 'frame',
+30: VALUE 'frame-content',
+30: VALUE 'paragraph',
+30: VALUE 'paragraph-content',
+30: VALUE 'char',
+30: VALUE 'line',
+30: VALUE 'baseline',
+30: VALUE 'text',
+28: EPSILON
+26: REF 'common-text-anchor-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "text:anchor-type",
+30: CHOICE
+31: VALUE 'page',
+31: VALUE 'frame',
+31: VALUE 'paragraph',
+31: VALUE 'char',
+31: VALUE 'as-char',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "text:anchor-page-number",
+30: REF 'positiveInteger',
+31: DATA 'positiveInteger',
+29: EPSILON
+26: REF 'common-border-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:border",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-top",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-bottom",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-left",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:border-right",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-border-line-width-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-top",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-bottom",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-left",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "style:border-line-width-right",
+30: REF 'borderWidths',
+31: LIST
+32: SEQUENCE
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+33: REF 'positiveLength',
+34: DATA 'string',
+29: EPSILON
+26: REF 'common-padding-attlist',
+27: SEQUENCE
+28: CHOICE
+29: ATTRIBUTE "fo:padding",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-top",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-bottom",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-left",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "fo:padding-right",
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+29: EPSILON
+26: REF 'common-shadow-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:shadow",
+29: REF 'shadowType',
+30: CHOICE
+31: VALUE 'none',
+31: REF 'string',
+32: DATA 'string',
+28: EPSILON
+26: REF 'common-background-color-attlist',
+27: CHOICE
+28: ATTRIBUTE "fo:background-color",
+29: CHOICE
+30: VALUE 'transparent',
+30: REF 'color',
+31: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:editable",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'left',
+29: VALUE 'right',
+29: VALUE 'parallel',
+29: VALUE 'dynamic',
+29: VALUE 'run-through',
+29: VALUE 'biggest',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap-dynamic-threshold",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:number-wrapped-paragraphs",
+28: CHOICE
+29: VALUE 'no-limit',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap-contour",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:wrap-contour-mode",
+28: CHOICE
+29: VALUE 'full',
+29: VALUE 'outside',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:run-through",
+28: CHOICE
+29: VALUE 'foreground',
+29: VALUE 'background',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:flow-with-text",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:overflow-behavior",
+28: CHOICE
+29: VALUE 'clip',
+29: VALUE 'auto-create-new-frame',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:mirror",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'vertical',
+29: REF 'horizontal-mirror',
+30: CHOICE
+31: VALUE 'horizontal',
+31: VALUE 'horizontal-on-odd',
+31: VALUE 'horizontal-on-even',
+29: LIST
+30: SEQUENCE
+31: VALUE 'vertical',
+31: REF 'horizontal-mirror',
+32: CHOICE
+33: VALUE 'horizontal',
+33: VALUE 'horizontal-on-odd',
+33: VALUE 'horizontal-on-even',
+29: LIST
+30: SEQUENCE
+31: REF 'horizontal-mirror',
+32: CHOICE
+33: VALUE 'horizontal',
+33: VALUE 'horizontal-on-odd',
+33: VALUE 'horizontal-on-even',
+31: VALUE 'vertical',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:clip",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:wrap-influence-on-position",
+28: CHOICE
+29: VALUE 'iterative',
+29: VALUE 'once-concurrent',
+29: VALUE 'once-successive',
+27: EPSILON
+26: REF 'common-writing-mode-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:writing-mode",
+29: CHOICE
+30: VALUE 'lr-tb',
+30: VALUE 'rl-tb',
+30: VALUE 'tb-rl',
+30: VALUE 'tb-lr',
+30: VALUE 'lr',
+30: VALUE 'rl',
+30: VALUE 'tb',
+30: VALUE 'page',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:frame-display-scrollbar",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:frame-display-border",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:frame-margin-horizontal",
+29: REF 'nonNegativePixelLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:frame-margin-vertical",
+29: REF 'nonNegativePixelLength',
+30: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-left",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-top",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-width",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:visible-area-height",
+29: REF 'positiveLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:ole-draw-aspect",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+24: REF 'style-graphic-fill-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "draw:fill",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'bitmap',
+29: VALUE 'gradient',
+29: VALUE 'hatch',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:secondary-fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-gradient-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:gradient-step-count",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-solid",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-image-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:repeat",
+28: CHOICE
+29: VALUE 'no-repeat',
+29: VALUE 'repeat',
+29: VALUE 'stretch',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-height",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-x",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-y",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point",
+29: CHOICE
+30: VALUE 'top-left',
+30: VALUE 'top',
+30: VALUE 'top-right',
+30: VALUE 'left',
+30: VALUE 'center',
+30: VALUE 'right',
+30: VALUE 'bottom-left',
+30: VALUE 'bottom',
+30: VALUE 'bottom-right',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:tile-repeat-offset",
+28: STRING
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:fill-rule",
+28: CHOICE
+29: VALUE 'nonzero',
+29: VALUE 'evenodd',
+27: EPSILON
+24: REF 'style-graphic-properties-elements',
+25: INTERLEAVE
+26: CHOICE
+27: REF 'text-list-style',
+28: ELEMENT "text:list-style",
+29: SEQUENCE
+30: REF 'text-list-style-attr',
+31: INTERLEAVE
+32: ATTRIBUTE "style:name",
+33: REF 'styleName',
+34: DATA 'NCName',
+32: CHOICE
+33: ATTRIBUTE "style:display-name",
+34: REF 'string',
+35: DATA 'string',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:consecutive-numbering",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+30: CHOICE
+31: ONEOREMORE
+32: REF 'text-list-style-content',
+33: CHOICE
+34: ELEMENT "text:list-level-style-number",
+35: SEQUENCE
+36: REF 'text-list-level-style-attr',
+37: ATTRIBUTE "text:level",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+36: REF 'text-list-level-style-number-attr',
+37: INTERLEAVE
+38: CHOICE
+39: ATTRIBUTE "text:style-name",
+40: REF 'styleNameRef',
+41: CHOICE
+42: DATA 'NCName',
+42: EPSILON
+39: EPSILON
+38: SEQUENCE
+39: REF 'common-num-format-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:num-format",
+42: CHOICE
+43: VALUE '1',
+43: VALUE 'i',
+43: VALUE 'I',
+43: REF 'string',
+44: DATA 'string',
+43: EPSILON
+41: SEQUENCE
+42: ATTRIBUTE "style:num-format",
+43: CHOICE
+44: VALUE 'a',
+44: VALUE 'A',
+42: REF 'style-num-letter-sync-attlist',
+43: CHOICE
+44: ATTRIBUTE "style:num-letter-sync",
+45: REF 'boolean',
+46: CHOICE
+47: VALUE 'true',
+47: VALUE 'false',
+44: EPSILON
+41: EPSILON
+39: REF 'common-num-format-prefix-suffix-attlist',
+40: SEQUENCE
+41: CHOICE
+42: ATTRIBUTE "style:num-prefix",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+41: CHOICE
+42: ATTRIBUTE "style:num-suffix",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:display-levels",
+40: REF 'positiveInteger',
+41: DATA 'positiveInteger',
+39: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:start-value",
+40: REF 'positiveInteger',
+41: DATA 'positiveInteger',
+39: EPSILON
+36: CHOICE
+37: REF 'style-list-level-properties',
+38: ELEMENT "style:list-level-properties",
+39: REF 'style-list-level-properties-content',
+40: REF 'style-list-level-properties-content-strict',
+41: SEQUENCE
+42: REF 'style-list-level-properties-attlist',
+43: INTERLEAVE
+44: REF 'common-text-align',
+45: CHOICE
+46: ATTRIBUTE "fo:text-align",
+47: CHOICE
+48: VALUE 'start',
+48: VALUE 'end',
+48: VALUE 'left',
+48: VALUE 'right',
+48: VALUE 'center',
+48: VALUE 'justify',
+46: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:space-before",
+46: REF 'nonNegativeLength',
+47: DATA 'string',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:min-label-width",
+46: REF 'nonNegativeLength',
+47: DATA 'string',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:min-label-distance",
+46: REF 'nonNegativeLength',
+47: DATA 'string',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "style:font-name",
+46: REF 'string',
+47: DATA 'string',
+45: EPSILON
+44: SEQUENCE
+45: CHOICE
+46: ATTRIBUTE "fo:width",
+47: REF 'positiveLength',
+48: DATA 'string',
+46: EPSILON
+45: CHOICE
+46: ATTRIBUTE "fo:height",
+47: REF 'positiveLength',
+48: DATA 'string',
+46: EPSILON
+44: SEQUENCE
+45: REF 'common-vertical-rel-attlist',
+46: CHOICE
+47: ATTRIBUTE "style:vertical-rel",
+48: CHOICE
+49: VALUE 'page',
+49: VALUE 'page-content',
+49: VALUE 'frame',
+49: VALUE 'frame-content',
+49: VALUE 'paragraph',
+49: VALUE 'paragraph-content',
+49: VALUE 'char',
+49: VALUE 'line',
+49: VALUE 'baseline',
+49: VALUE 'text',
+47: EPSILON
+45: REF 'common-vertical-pos-attlist',
+46: SEQUENCE
+47: CHOICE
+48: ATTRIBUTE "style:vertical-pos",
+49: CHOICE
+50: VALUE 'top',
+50: VALUE 'middle',
+50: VALUE 'bottom',
+50: VALUE 'from-top',
+50: VALUE 'below',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "svg:y",
+49: REF 'coordinate',
+50: REF 'length',
+51: DATA 'string',
+48: EPSILON
+42: REF 'style-list-level-properties-elements',
+43: EPSILON
+37: EPSILON
+36: CHOICE
+37: REF 'style-text-properties',
+37: EPSILON
+34: ELEMENT "text:list-level-style-bullet",
+35: SEQUENCE
+36: REF 'text-list-level-style-attr',
+37: ATTRIBUTE "text:level",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+36: REF 'text-list-level-style-bullet-attr',
+37: INTERLEAVE
+38: CHOICE
+39: ATTRIBUTE "text:style-name",
+40: REF 'styleNameRef',
+41: CHOICE
+42: DATA 'NCName',
+42: EPSILON
+39: EPSILON
+38: ATTRIBUTE "text:bullet-char",
+39: REF 'character',
+40: DATA 'string',
+38: REF 'common-num-format-prefix-suffix-attlist',
+39: SEQUENCE
+40: CHOICE
+41: ATTRIBUTE "style:num-prefix",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "style:num-suffix",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:bullet-relative-size",
+40: REF 'percent',
+41: DATA 'string',
+39: EPSILON
+36: CHOICE
+37: REF 'style-list-level-properties',
+37: EPSILON
+36: CHOICE
+37: REF 'style-text-properties',
+37: EPSILON
+34: ELEMENT "text:list-level-style-image",
+35: SEQUENCE
+36: REF 'text-list-level-style-attr',
+37: ATTRIBUTE "text:level",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+36: REF 'text-list-level-style-image-attr',
+37: CHOICE
+38: REF 'common-draw-data-attlist',
+39: SEQUENCE
+40: ATTRIBUTE "xlink:href",
+41: REF 'anyURI',
+42: DATA 'anyURI',
+40: CHOICE
+41: ATTRIBUTE "xlink:type",
+42: VALUE 'simple',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "xlink:show",
+42: VALUE 'embed',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "xlink:actuate",
+42: VALUE 'onLoad',
+41: EPSILON
+38: REF 'office-binary-data',
+36: CHOICE
+37: REF 'style-list-level-properties',
+37: EPSILON
+31: EPSILON
+27: EPSILON
+26: REF 'style-background-image',
+27: CHOICE
+26: REF 'style-columns',
+27: CHOICE
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'drawing-page',
+18: CHOICE
+19: REF 'style-drawing-page-properties',
+20: ELEMENT "style:drawing-page-properties",
+21: REF 'style-drawing-page-properties-content',
+22: REF 'style-drawing-page-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-graphic-fill-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "draw:fill",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'bitmap',
+29: VALUE 'gradient',
+29: VALUE 'hatch',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:secondary-fill-color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-gradient-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:gradient-step-count",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-hatch-solid",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:fill-image-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:repeat",
+28: CHOICE
+29: VALUE 'no-repeat',
+29: VALUE 'repeat',
+29: VALUE 'stretch',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-width",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-height",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-x",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point-y",
+29: REF 'percent',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "draw:fill-image-ref-point",
+29: CHOICE
+30: VALUE 'top-left',
+30: VALUE 'top',
+30: VALUE 'top-right',
+30: VALUE 'left',
+30: VALUE 'center',
+30: VALUE 'right',
+30: VALUE 'bottom-left',
+30: VALUE 'bottom',
+30: VALUE 'bottom-right',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:tile-repeat-offset",
+28: STRING
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:opacity-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "svg:fill-rule",
+28: CHOICE
+29: VALUE 'nonzero',
+29: VALUE 'evenodd',
+27: EPSILON
+24: REF 'style-drawing-page-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "presentation:transition-type",
+28: CHOICE
+29: VALUE 'manual',
+29: VALUE 'automatic',
+29: VALUE 'semi-automatic',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:transition-style",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'fade-from-left',
+29: VALUE 'fade-from-top',
+29: VALUE 'fade-from-right',
+29: VALUE 'fade-from-bottom',
+29: VALUE 'fade-from-upperleft',
+29: VALUE 'fade-from-upperright',
+29: VALUE 'fade-from-lowerleft',
+29: VALUE 'fade-from-lowerright',
+29: VALUE 'move-from-left',
+29: VALUE 'move-from-top',
+29: VALUE 'move-from-right',
+29: VALUE 'move-from-bottom',
+29: VALUE 'move-from-upperleft',
+29: VALUE 'move-from-upperright',
+29: VALUE 'move-from-lowerleft',
+29: VALUE 'move-from-lowerright',
+29: VALUE 'uncover-to-left',
+29: VALUE 'uncover-to-top',
+29: VALUE 'uncover-to-right',
+29: VALUE 'uncover-to-bottom',
+29: VALUE 'uncover-to-upperleft',
+29: VALUE 'uncover-to-upperright',
+29: VALUE 'uncover-to-lowerleft',
+29: VALUE 'uncover-to-lowerright',
+29: VALUE 'fade-to-center',
+29: VALUE 'fade-from-center',
+29: VALUE 'vertical-stripes',
+29: VALUE 'horizontal-stripes',
+29: VALUE 'clockwise',
+29: VALUE 'counterclockwise',
+29: VALUE 'open-vertical',
+29: VALUE 'open-horizontal',
+29: VALUE 'close-vertical',
+29: VALUE 'close-horizontal',
+29: VALUE 'wavyline-from-left',
+29: VALUE 'wavyline-from-top',
+29: VALUE 'wavyline-from-right',
+29: VALUE 'wavyline-from-bottom',
+29: VALUE 'spiralin-left',
+29: VALUE 'spiralin-right',
+29: VALUE 'spiralout-left',
+29: VALUE 'spiralout-right',
+29: VALUE 'roll-from-top',
+29: VALUE 'roll-from-left',
+29: VALUE 'roll-from-right',
+29: VALUE 'roll-from-bottom',
+29: VALUE 'stretch-from-left',
+29: VALUE 'stretch-from-top',
+29: VALUE 'stretch-from-right',
+29: VALUE 'stretch-from-bottom',
+29: VALUE 'vertical-lines',
+29: VALUE 'horizontal-lines',
+29: VALUE 'dissolve',
+29: VALUE 'random',
+29: VALUE 'vertical-checkerboard',
+29: VALUE 'horizontal-checkerboard',
+29: VALUE 'interlocking-horizontal-left',
+29: VALUE 'interlocking-horizontal-right',
+29: VALUE 'interlocking-vertical-top',
+29: VALUE 'interlocking-vertical-bottom',
+29: VALUE 'fly-away',
+29: VALUE 'open',
+29: VALUE 'close',
+29: VALUE 'melt',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:transition-speed",
+28: REF 'presentationSpeeds',
+29: CHOICE
+30: VALUE 'slow',
+30: VALUE 'medium',
+30: VALUE 'fast',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:type",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:subtype",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:direction",
+28: CHOICE
+29: VALUE 'forward',
+29: VALUE 'reverse',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "smil:fadeColor",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:duration",
+28: REF 'duration',
+29: DATA 'duration',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:visibility",
+28: CHOICE
+29: VALUE 'visible',
+29: VALUE 'hidden',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "draw:background-size",
+28: CHOICE
+29: VALUE 'full',
+29: VALUE 'border',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:background-objects-visible",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:background-visible",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-header",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-footer",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-page-number",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "presentation:display-date-time",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+24: REF 'style-drawing-page-properties-elements',
+25: CHOICE
+26: REF 'presentation-sound',
+26: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'chart',
+18: CHOICE
+19: REF 'style-chart-properties',
+20: ELEMENT "style:chart-properties",
+21: REF 'style-chart-properties-content',
+22: REF 'style-chart-properties-content-strict',
+23: SEQUENCE
+24: REF 'style-chart-properties-attlist',
+25: INTERLEAVE
+26: CHOICE
+27: ATTRIBUTE "chart:scale-text",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:three-dimensional",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:deep",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:symbol-type",
+28: VALUE 'none',
+27: ATTRIBUTE "chart:symbol-type",
+28: VALUE 'automatic',
+27: SEQUENCE
+28: ATTRIBUTE "chart:symbol-type",
+29: VALUE 'named-symbol',
+28: ATTRIBUTE "chart:symbol-name",
+29: CHOICE
+30: VALUE 'square',
+30: VALUE 'diamond',
+30: VALUE 'arrow-down',
+30: VALUE 'arrow-up',
+30: VALUE 'arrow-right',
+30: VALUE 'arrow-left',
+30: VALUE 'bow-tie',
+30: VALUE 'hourglass',
+30: VALUE 'circle',
+30: VALUE 'star',
+30: VALUE 'x',
+30: VALUE 'plus',
+30: VALUE 'asterisk',
+30: VALUE 'horizontal-bar',
+30: VALUE 'vertical-bar',
+27: SEQUENCE
+28: ATTRIBUTE "chart:symbol-type",
+29: VALUE 'image',
+28: ELEMENT "chart:symbol-image",
+29: ATTRIBUTE "xlink:href",
+30: REF 'anyURI',
+31: DATA 'anyURI',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:symbol-width",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:symbol-height",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:vertical",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:connect-bars",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:gap-width",
+29: REF 'integer',
+30: DATA 'integer',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:overlap",
+29: REF 'integer',
+30: DATA 'integer',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:japanese-candle-stick",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:interpolation",
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'cubic-spline',
+30: VALUE 'b-spline',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:spline-order",
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:spline-resolution",
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:pie-offset",
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:lines",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:solid-type",
+28: CHOICE
+29: VALUE 'cuboid',
+29: VALUE 'cylinder',
+29: VALUE 'cone',
+29: VALUE 'pyramid',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:stacked",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:percentage",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:link-data-style-to-source",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:visible",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:logarithmic",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:maximum",
+29: REF 'double',
+30: DATA 'double',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:minimum",
+29: REF 'double',
+30: DATA 'double',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:origin",
+29: REF 'double',
+30: DATA 'double',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:interval-major",
+29: REF 'double',
+30: DATA 'double',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:interval-minor-divisor",
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:tick-marks-major-inner",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:tick-marks-major-outer",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:tick-marks-minor-inner",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:tick-marks-minor-outer",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:display-label",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:text-overlap",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "text:line-break",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:label-arrangement",
+29: CHOICE
+30: VALUE 'side-by-side',
+30: VALUE 'stagger-even',
+30: VALUE 'stagger-odd',
+28: EPSILON
+26: REF 'common-style-direction-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:direction",
+29: CHOICE
+30: VALUE 'ltr',
+30: VALUE 'ttb',
+28: EPSILON
+26: REF 'common-rotation-angle-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:rotation-angle",
+29: REF 'nonNegativeInteger',
+30: DATA 'nonNegativeInteger',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:data-label-number",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'value',
+29: VALUE 'percentage',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:data-label-text",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:data-label-symbol",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:mean-value",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:error-category",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'variance',
+29: VALUE 'standard-deviation',
+29: VALUE 'percentage',
+29: VALUE 'error-margin',
+29: VALUE 'constant',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:error-percentage",
+28: REF 'double',
+29: DATA 'double',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:error-margin",
+28: REF 'double',
+29: DATA 'double',
+27: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:error-lower-limit",
+29: REF 'double',
+30: DATA 'double',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:error-upper-limit",
+29: REF 'double',
+30: DATA 'double',
+28: EPSILON
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "chart:error-upper-indicator",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "chart:error-lower-indicator",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:series-source",
+28: CHOICE
+29: VALUE 'columns',
+29: VALUE 'rows',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "chart:regression-type",
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'linear',
+29: VALUE 'logarithmic',
+29: VALUE 'exponential',
+29: VALUE 'power',
+27: EPSILON
+24: REF 'style-chart-properties-elements',
+25: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'style-graphic-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+18: ELEMENT "style:map",
+19: REF 'style-map-attlist',
+20: INTERLEAVE
+21: ATTRIBUTE "style:condition",
+22: REF 'string',
+23: DATA 'string',
+21: ATTRIBUTE "style:apply-style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:base-cell-address",
+23: REF 'cellAddress',
+24: DATA 'string',
+22: EPSILON
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'text-list-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-number-style',
+13: ELEMENT "number:number-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+17: ELEMENT "number:text",
+18: STRING
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'any-number',
+18: CHOICE
+19: REF 'number-number',
+20: ELEMENT "number:number",
+21: SEQUENCE
+22: REF 'number-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:decimal-replacement",
+26: STRING
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:display-factor",
+26: REF 'double',
+27: DATA 'double',
+25: EPSILON
+22: REF 'common-decimal-places-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'number-embedded-text',
+25: ELEMENT "number:embedded-text",
+26: SEQUENCE
+27: REF 'number-embedded-text-attlist',
+28: ATTRIBUTE "number:position",
+29: REF 'integer',
+30: DATA 'integer',
+27: STRING
+23: EPSILON
+19: REF 'number-scientific-number',
+20: ELEMENT "number:scientific-number",
+21: SEQUENCE
+22: REF 'number-scientific-number-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:min-exponent-digits",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-decimal-places-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+19: REF 'number-fraction',
+20: ELEMENT "number:fraction",
+21: SEQUENCE
+22: REF 'number-fraction-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-numerator-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:min-denominator-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:denominator-value",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-currency-style',
+13: ELEMENT "number:currency-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-auto-reorder-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:automatic-order",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'number-and-text',
+18: SEQUENCE
+19: REF 'number-number',
+19: CHOICE
+20: REF 'number-text',
+20: EPSILON
+17: CHOICE
+18: REF 'currency-symbol-and-text',
+19: SEQUENCE
+20: REF 'number-currency-symbol',
+21: ELEMENT "number:currency-symbol",
+22: SEQUENCE
+23: REF 'number-currency-symbol-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "number:language",
+27: REF 'languageCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "number:country",
+27: REF 'countryCode',
+28: DATA 'token',
+26: EPSILON
+23: STRING
+20: CHOICE
+21: REF 'number-text',
+21: EPSILON
+18: EPSILON
+16: SEQUENCE
+17: REF 'currency-symbol-and-text',
+18: SEQUENCE
+19: REF 'number-currency-symbol',
+19: CHOICE
+20: REF 'number-text',
+20: EPSILON
+17: CHOICE
+18: REF 'number-and-text',
+19: SEQUENCE
+20: REF 'number-number',
+20: CHOICE
+21: REF 'number-text',
+21: EPSILON
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-percentage-style',
+13: ELEMENT "number:percentage-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: REF 'number-and-text',
+17: SEQUENCE
+18: REF 'number-number',
+18: CHOICE
+19: REF 'number-text',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-date-style',
+13: ELEMENT "number:date-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-auto-reorder-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:automatic-order",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: REF 'common-format-source-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:format-source",
+18: CHOICE
+19: VALUE 'fixed',
+19: VALUE 'language',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: ONEOREMORE
+16: SEQUENCE
+17: REF 'any-date',
+18: CHOICE
+19: REF 'number-day',
+20: ELEMENT "number:day",
+21: SEQUENCE
+22: REF 'number-day-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-month',
+20: ELEMENT "number:month",
+21: SEQUENCE
+22: REF 'number-month-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:textual",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:possessive-form",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:style",
+26: CHOICE
+27: VALUE 'short',
+27: VALUE 'long',
+25: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-year',
+20: ELEMENT "number:year",
+21: SEQUENCE
+22: REF 'number-year-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-era',
+20: ELEMENT "number:era",
+21: SEQUENCE
+22: REF 'number-era-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-day-of-week',
+20: ELEMENT "number:day-of-week",
+21: SEQUENCE
+22: REF 'number-day-of-week-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-week-of-year',
+20: ELEMENT "number:week-of-year",
+21: REF 'common-calendar-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:calendar",
+24: CHOICE
+25: VALUE 'gregorian',
+25: VALUE 'gengou',
+25: VALUE 'ROC',
+25: VALUE 'hanja_yoil',
+25: VALUE 'hanja',
+25: VALUE 'hijri',
+25: VALUE 'jewish',
+25: VALUE 'buddhist',
+25: REF 'string',
+26: DATA 'string',
+23: EPSILON
+19: REF 'number-quarter',
+20: ELEMENT "number:quarter",
+21: SEQUENCE
+22: REF 'number-quarter-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-hours',
+20: ELEMENT "number:hours",
+21: REF 'number-hours-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:style",
+24: CHOICE
+25: VALUE 'short',
+25: VALUE 'long',
+23: EPSILON
+19: REF 'number-am-pm',
+20: ELEMENT "number:am-pm",
+21: EPSILON
+19: REF 'number-minutes',
+20: ELEMENT "number:minutes",
+21: REF 'number-minutes-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:style",
+24: CHOICE
+25: VALUE 'short',
+25: VALUE 'long',
+23: EPSILON
+19: REF 'number-seconds',
+20: ELEMENT "number:seconds",
+21: REF 'number-seconds-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-time-style',
+13: ELEMENT "number:time-style",
+14: SEQUENCE
+15: REF 'number-time-style-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:truncate-on-overflow",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-format-source-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:format-source",
+18: CHOICE
+19: VALUE 'fixed',
+19: VALUE 'language',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: ONEOREMORE
+16: SEQUENCE
+17: REF 'any-time',
+18: CHOICE
+19: REF 'number-hours',
+19: REF 'number-am-pm',
+19: REF 'number-minutes',
+19: REF 'number-seconds',
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-boolean-style',
+13: ELEMENT "number:boolean-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'number-boolean',
+18: ELEMENT "number:boolean",
+19: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-text-style',
+13: ELEMENT "number:text-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: STRING
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: SEQUENCE
+18: REF 'number-text-content',
+19: ELEMENT "number:text-content",
+20: EPSILON
+18: CHOICE
+19: REF 'number-text',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-default-style',
+11: ELEMENT "style:default-style",
+12: REF 'style-style-content',
+13: CHOICE
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'text',
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'paragraph',
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'section',
+15: CHOICE
+16: REF 'style-section-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'ruby',
+15: CHOICE
+16: REF 'style-ruby-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table',
+15: CHOICE
+16: REF 'style-table-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-column',
+15: CHOICE
+16: REF 'style-table-column-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-row',
+15: CHOICE
+16: REF 'style-table-row-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-cell',
+15: CHOICE
+16: REF 'style-table-cell-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: CHOICE
+17: VALUE 'graphic',
+17: VALUE 'presentation',
+15: CHOICE
+16: REF 'style-graphic-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'drawing-page',
+15: CHOICE
+16: REF 'style-drawing-page-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'chart',
+15: CHOICE
+16: REF 'style-chart-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-graphic-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'text-outline-style',
+10: ELEMENT "text:outline-style",
+11: ONEOREMORE
+12: REF 'text-outline-level-style',
+13: ELEMENT "text:outline-level-style",
+14: SEQUENCE
+15: REF 'text-outline-level-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "text:level",
+18: REF 'positiveInteger',
+19: DATA 'positiveInteger',
+17: CHOICE
+18: ATTRIBUTE "text:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: SEQUENCE
+18: REF 'common-num-format-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:num-format",
+21: CHOICE
+22: VALUE '1',
+22: VALUE 'i',
+22: VALUE 'I',
+22: REF 'string',
+23: DATA 'string',
+22: EPSILON
+20: SEQUENCE
+21: ATTRIBUTE "style:num-format",
+22: CHOICE
+23: VALUE 'a',
+23: VALUE 'A',
+21: REF 'style-num-letter-sync-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:num-letter-sync",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+20: EPSILON
+18: REF 'common-num-format-prefix-suffix-attlist',
+19: SEQUENCE
+20: CHOICE
+21: ATTRIBUTE "style:num-prefix",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:num-suffix",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+17: CHOICE
+18: ATTRIBUTE "text:display-levels",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "text:start-value",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: EPSILON
+15: CHOICE
+16: REF 'style-list-level-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'text-notes-configuration',
+9: EPSILON
+8: CHOICE
+9: REF 'text-bibliography-configuration',
+10: ELEMENT "text:bibliography-configuration",
+11: SEQUENCE
+12: REF 'text-bibliography-configuration-attlist',
+13: INTERLEAVE
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "text:prefix",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "text:suffix",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:numbered-entries",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "text:sort-by-position",
+17: REF 'boolean',
+18: CHOICE
+19: VALUE 'true',
+19: VALUE 'false',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "fo:language",
+17: REF 'languageCode',
+18: DATA 'token',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "fo:country",
+17: REF 'countryCode',
+18: DATA 'token',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "text:sort-algorithm",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+12: CHOICE
+13: ONEOREMORE
+14: REF 'text-sort-key',
+15: ELEMENT "text:sort-key",
+16: REF 'text-sort-key-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "text:key",
+19: CHOICE
+20: VALUE 'address',
+20: VALUE 'annote',
+20: VALUE 'author',
+20: VALUE 'bibliography-type',
+20: VALUE 'booktitle',
+20: VALUE 'chapter',
+20: VALUE 'custom1',
+20: VALUE 'custom2',
+20: VALUE 'custom3',
+20: VALUE 'custom4',
+20: VALUE 'custom5',
+20: VALUE 'edition',
+20: VALUE 'editor',
+20: VALUE 'howpublished',
+20: VALUE 'identifier',
+20: VALUE 'institution',
+20: VALUE 'isbn',
+20: VALUE 'issn',
+20: VALUE 'journal',
+20: VALUE 'month',
+20: VALUE 'note',
+20: VALUE 'number',
+20: VALUE 'organizations',
+20: VALUE 'pages',
+20: VALUE 'publisher',
+20: VALUE 'report-type',
+20: VALUE 'school',
+20: VALUE 'series',
+20: VALUE 'title',
+20: VALUE 'url',
+20: VALUE 'volume',
+20: VALUE 'year',
+18: CHOICE
+19: ATTRIBUTE "text:sort-ascending",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'text-linenumbering-configuration',
+10: ELEMENT "text:linenumbering-configuration",
+11: SEQUENCE
+12: REF 'text-linenumbering-configuration-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "text:number-lines",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: REF 'common-num-format-attlist',
+16: CHOICE
+17: ATTRIBUTE "style:num-format",
+18: CHOICE
+19: VALUE '1',
+19: VALUE 'i',
+19: VALUE 'I',
+19: REF 'string',
+20: DATA 'string',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:num-format",
+19: CHOICE
+20: VALUE 'a',
+20: VALUE 'A',
+18: REF 'style-num-letter-sync-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:num-letter-sync",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+17: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:style-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:increment",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:number-position",
+16: CHOICE
+17: VALUE 'left',
+17: VALUE 'right',
+17: VALUE 'inner',
+17: VALUE 'outer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:offset",
+16: REF 'nonNegativeLength',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:count-empty-lines",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:count-in-text-boxes",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:restart-on-page",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+12: CHOICE
+13: REF 'text-linenumbering-separator',
+14: ELEMENT "text:linenumbering-separator",
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "text:increment",
+18: REF 'nonNegativeInteger',
+19: DATA 'nonNegativeInteger',
+17: EPSILON
+16: STRING
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-gradient',
+11: ELEMENT "draw:gradient",
+12: SEQUENCE
+13: REF 'common-draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:name",
+17: REF 'styleName',
+18: DATA 'NCName',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "draw:style",
+16: REF 'gradient-style',
+17: CHOICE
+18: VALUE 'linear',
+18: VALUE 'axial',
+18: VALUE 'radial',
+18: VALUE 'ellipsoid',
+18: VALUE 'square',
+18: VALUE 'rectangular',
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:cx",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:cy",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:angle",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:border",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+13: REF 'draw-gradient-attlist',
+14: INTERLEAVE
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:start-color",
+18: REF 'color',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:end-color",
+18: REF 'color',
+19: DATA 'string',
+17: EPSILON
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:start-intensity",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:end-intensity",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'svg-linearGradient',
+11: ELEMENT "svg:linearGradient",
+12: SEQUENCE
+13: REF 'common-svg-gradient-attlist',
+14: INTERLEAVE
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "svg:gradientUnits",
+18: VALUE 'objectBoundingBox',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:gradientTransform",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:spreadMethod",
+18: CHOICE
+19: VALUE 'pad',
+19: VALUE 'reflect',
+19: VALUE 'repeat',
+17: EPSILON
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:x1",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:y1",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:x2",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:y2",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'svg-stop',
+16: ELEMENT "svg:stop",
+17: SEQUENCE
+18: ATTRIBUTE "svg:offset",
+19: CHOICE
+20: REF 'double',
+21: DATA 'double',
+20: REF 'percent',
+21: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "svg:stop-color",
+20: REF 'color',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "svg:stop-opacity",
+20: REF 'double',
+21: DATA 'double',
+19: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'svg-radialGradient',
+11: ELEMENT "svg:radialGradient",
+12: SEQUENCE
+13: REF 'common-svg-gradient-attlist',
+14: INTERLEAVE
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "svg:gradientUnits",
+18: VALUE 'objectBoundingBox',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:gradientTransform",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:spreadMethod",
+18: CHOICE
+19: VALUE 'pad',
+19: VALUE 'reflect',
+19: VALUE 'repeat',
+17: EPSILON
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:cx",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:cy",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:r",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:fx",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:fy",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'svg-stop',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-hatch',
+11: ELEMENT "draw:hatch",
+12: REF 'draw-hatch-attlist',
+13: INTERLEAVE
+14: ATTRIBUTE "draw:name",
+15: REF 'styleName',
+16: DATA 'NCName',
+14: CHOICE
+15: ATTRIBUTE "draw:display-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: ATTRIBUTE "draw:style",
+15: CHOICE
+16: VALUE 'single',
+16: VALUE 'double',
+16: VALUE 'triple',
+14: CHOICE
+15: ATTRIBUTE "draw:color",
+16: REF 'color',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:distance",
+16: REF 'length',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:rotation",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-fill-image',
+11: ELEMENT "draw:fill-image",
+12: SEQUENCE
+13: REF 'draw-fill-image-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "svg:width",
+18: REF 'length',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "svg:height",
+18: REF 'length',
+19: DATA 'string',
+17: EPSILON
+13: ATTRIBUTE "xlink:href",
+14: REF 'anyURI',
+15: DATA 'anyURI',
+13: CHOICE
+14: ATTRIBUTE "xlink:type",
+15: VALUE 'simple',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "xlink:show",
+15: VALUE 'embed',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "xlink:actuate",
+15: VALUE 'onLoad',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-marker',
+11: ELEMENT "draw:marker",
+12: SEQUENCE
+13: REF 'draw-marker-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: REF 'common-draw-viewbox-attlist',
+14: ATTRIBUTE "svg:viewBox",
+15: LIST
+16: SEQUENCE
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+13: REF 'common-draw-path-data-attlist',
+14: ATTRIBUTE "svg:d",
+15: REF 'pathData',
+16: DATA 'string',
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-stroke-dash',
+11: ELEMENT "draw:stroke-dash",
+12: REF 'draw-stroke-dash-attlist',
+13: INTERLEAVE
+14: ATTRIBUTE "draw:name",
+15: REF 'styleName',
+16: DATA 'NCName',
+14: CHOICE
+15: ATTRIBUTE "draw:display-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:style",
+16: CHOICE
+17: VALUE 'rect',
+17: VALUE 'round',
+15: EPSILON
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "draw:dots1",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:dots1-length",
+17: REF 'length',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:dots2",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:dots2-length",
+17: REF 'length',
+18: DATA 'string',
+16: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:distance",
+16: REF 'length',
+17: DATA 'string',
+15: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-opacity',
+11: ELEMENT "draw:opacity",
+12: SEQUENCE
+13: REF 'common-draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:name",
+17: REF 'styleName',
+18: DATA 'NCName',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "draw:style",
+16: REF 'gradient-style',
+17: CHOICE
+18: VALUE 'linear',
+18: VALUE 'axial',
+18: VALUE 'radial',
+18: VALUE 'ellipsoid',
+18: VALUE 'square',
+18: VALUE 'rectangular',
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "draw:cx",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "draw:cy",
+18: REF 'percent',
+19: DATA 'string',
+17: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:angle",
+17: REF 'integer',
+18: DATA 'integer',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:border",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+13: REF 'draw-opacity-attlist',
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "draw:start",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:end",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-presentation-page-layout',
+11: ELEMENT "style:presentation-page-layout",
+12: SEQUENCE
+13: ATTRIBUTE "style:name",
+14: REF 'styleName',
+15: DATA 'NCName',
+13: CHOICE
+14: ATTRIBUTE "style:display-name",
+15: REF 'string',
+16: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'presentation-placeholder',
+16: ELEMENT "presentation:placeholder",
+17: SEQUENCE
+18: ATTRIBUTE "presentation:object",
+19: REF 'presentation-classes',
+20: CHOICE
+21: VALUE 'title',
+21: VALUE 'outline',
+21: VALUE 'subtitle',
+21: VALUE 'text',
+21: VALUE 'graphic',
+21: VALUE 'object',
+21: VALUE 'chart',
+21: VALUE 'table',
+21: VALUE 'orgchart',
+21: VALUE 'page',
+21: VALUE 'notes',
+21: VALUE 'handout',
+21: VALUE 'header',
+21: VALUE 'footer',
+21: VALUE 'date-time',
+21: VALUE 'page-number',
+18: ATTRIBUTE "svg:x",
+19: CHOICE
+20: REF 'coordinate',
+21: REF 'length',
+22: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:y",
+19: CHOICE
+20: REF 'coordinate',
+21: REF 'length',
+22: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:width",
+19: CHOICE
+20: REF 'length',
+21: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:height",
+19: CHOICE
+20: REF 'length',
+21: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+14: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-automatic-styles',
+5: CHOICE
+6: ELEMENT "office:automatic-styles",
+7: INTERLEAVE
+8: REF 'styles',
+9: INTERLEAVE
+10: CHOICE
+11: ONEOREMORE
+12: REF 'style-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'text-list-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-number-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-currency-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-percentage-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-date-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-time-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-boolean-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-text-style',
+11: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-page-layout',
+11: ELEMENT "style:page-layout",
+12: SEQUENCE
+13: REF 'style-page-layout-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "style:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "style:page-usage",
+17: CHOICE
+18: VALUE 'all',
+18: VALUE 'left',
+18: VALUE 'right',
+18: VALUE 'mirrored',
+16: EPSILON
+13: CHOICE
+14: REF 'style-page-layout-properties',
+15: ELEMENT "style:page-layout-properties",
+16: REF 'style-page-layout-properties-content',
+17: REF 'style-page-layout-properties-content-strict',
+18: SEQUENCE
+19: REF 'style-page-layout-properties-attlist',
+20: INTERLEAVE
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "fo:page-width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:page-height",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'common-num-format-attlist',
+24: CHOICE
+25: ATTRIBUTE "style:num-format",
+26: CHOICE
+27: VALUE '1',
+27: VALUE 'i',
+27: VALUE 'I',
+27: REF 'string',
+28: DATA 'string',
+27: EPSILON
+25: SEQUENCE
+26: ATTRIBUTE "style:num-format",
+27: CHOICE
+28: VALUE 'a',
+28: VALUE 'A',
+26: REF 'style-num-letter-sync-attlist',
+27: CHOICE
+28: ATTRIBUTE "style:num-letter-sync",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: EPSILON
+23: EPSILON
+22: REF 'common-num-format-prefix-suffix-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "style:num-prefix",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "style:num-suffix",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:paper-tray-name",
+23: CHOICE
+24: VALUE 'default',
+24: REF 'string',
+25: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:print-orientation",
+23: CHOICE
+24: VALUE 'portrait',
+24: VALUE 'landscape',
+22: EPSILON
+21: SEQUENCE
+22: REF 'common-horizontal-margin-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "fo:margin-left",
+26: CHOICE
+27: REF 'length',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "fo:margin-right",
+26: CHOICE
+27: REF 'length',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+22: REF 'common-vertical-margin-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "fo:margin-top",
+26: CHOICE
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "fo:margin-bottom",
+26: CHOICE
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+22: REF 'common-margin-attlist',
+23: CHOICE
+24: ATTRIBUTE "fo:margin",
+25: CHOICE
+26: REF 'nonNegativeLength',
+27: DATA 'string',
+26: REF 'percent',
+27: DATA 'string',
+24: EPSILON
+21: REF 'common-border-attlist',
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "fo:border",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-top",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-bottom",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-left",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:border-right",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-border-line-width-attlist',
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-top",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-bottom",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-left",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:border-line-width-right",
+25: REF 'borderWidths',
+26: LIST
+27: SEQUENCE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'positiveLength',
+29: DATA 'string',
+24: EPSILON
+21: REF 'common-padding-attlist',
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "fo:padding",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-top",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-bottom",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-left",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:padding-right",
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-shadow-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:shadow",
+24: REF 'shadowType',
+25: CHOICE
+26: VALUE 'none',
+26: REF 'string',
+27: DATA 'string',
+23: EPSILON
+21: REF 'common-background-color-attlist',
+22: CHOICE
+23: ATTRIBUTE "fo:background-color",
+24: CHOICE
+25: VALUE 'transparent',
+25: REF 'color',
+26: DATA 'string',
+23: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:register-truth-ref-style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:print",
+23: LIST
+24: CHOICE
+25: ONEOREMORE
+26: CHOICE
+27: VALUE 'headers',
+27: VALUE 'grid',
+27: VALUE 'annotations',
+27: VALUE 'objects',
+27: VALUE 'charts',
+27: VALUE 'drawings',
+27: VALUE 'formulas',
+27: VALUE 'zero-values',
+25: EPSILON
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:print-page-order",
+23: CHOICE
+24: VALUE 'ttb',
+24: VALUE 'ltr',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:first-page-number",
+23: CHOICE
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+24: VALUE 'continue',
+22: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "style:scale-to",
+24: REF 'percent',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:scale-to-pages",
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+23: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:table-centering",
+23: CHOICE
+24: VALUE 'horizontal',
+24: VALUE 'vertical',
+24: VALUE 'both',
+24: VALUE 'none',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:footnote-max-height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: REF 'common-writing-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:writing-mode",
+24: CHOICE
+25: VALUE 'lr-tb',
+25: VALUE 'rl-tb',
+25: VALUE 'tb-rl',
+25: VALUE 'tb-lr',
+25: VALUE 'lr',
+25: VALUE 'rl',
+25: VALUE 'tb',
+25: VALUE 'page',
+23: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-mode",
+23: CHOICE
+24: VALUE 'none',
+24: VALUE 'line',
+24: VALUE 'both',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-base-height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-ruby-height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-lines",
+23: REF 'positiveInteger',
+24: DATA 'positiveInteger',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-color",
+23: REF 'color',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-ruby-below",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-print",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:layout-grid-display",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+19: REF 'style-page-layout-properties-elements',
+20: INTERLEAVE
+21: REF 'style-background-image',
+22: CHOICE
+21: REF 'style-columns',
+22: CHOICE
+21: REF 'style-footnote-sep',
+22: CHOICE
+23: ELEMENT "style:footnote-sep",
+24: REF 'style-footnote-sep-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "style:width",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:rel-width",
+28: REF 'percent',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:color",
+28: REF 'color',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:line-style",
+28: REF 'lineStyle',
+29: CHOICE
+30: VALUE 'none',
+30: VALUE 'solid',
+30: VALUE 'dotted',
+30: VALUE 'dash',
+30: VALUE 'long-dash',
+30: VALUE 'dot-dash',
+30: VALUE 'dot-dot-dash',
+30: VALUE 'wave',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:adjustment",
+28: CHOICE
+29: VALUE 'left',
+29: VALUE 'center',
+29: VALUE 'right',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:distance-before-sep",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:distance-after-sep",
+28: REF 'length',
+29: DATA 'string',
+27: EPSILON
+23: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'style-header-style',
+15: ELEMENT "style:header-style",
+16: CHOICE
+17: REF 'style-header-footer-properties',
+18: ELEMENT "style:header-footer-properties",
+19: REF 'style-header-footer-properties-content',
+20: REF 'style-header-footer-properties-content-strict',
+21: SEQUENCE
+22: REF 'style-header-footer-properties-attlist',
+23: INTERLEAVE
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "svg:height",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:min-height",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+24: SEQUENCE
+25: REF 'common-horizontal-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-left",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-right",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-vertical-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-top",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-bottom",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-margin-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:margin",
+28: CHOICE
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+24: REF 'common-border-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "fo:border",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-top",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-bottom",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-left",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:border-right",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+24: REF 'common-border-line-width-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-top",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-bottom",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-left",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "style:border-line-width-right",
+28: REF 'borderWidths',
+29: LIST
+30: SEQUENCE
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+31: REF 'positiveLength',
+32: DATA 'string',
+27: EPSILON
+24: REF 'common-padding-attlist',
+25: SEQUENCE
+26: CHOICE
+27: ATTRIBUTE "fo:padding",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-top",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-bottom",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-left",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "fo:padding-right",
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+27: EPSILON
+24: REF 'common-background-color-attlist',
+25: CHOICE
+26: ATTRIBUTE "fo:background-color",
+27: CHOICE
+28: VALUE 'transparent',
+28: REF 'color',
+29: DATA 'string',
+26: EPSILON
+24: REF 'common-shadow-attlist',
+25: CHOICE
+26: ATTRIBUTE "style:shadow",
+27: REF 'shadowType',
+28: CHOICE
+29: VALUE 'none',
+29: REF 'string',
+30: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "style:dynamic-spacing",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+22: REF 'style-header-footer-properties-elements',
+23: REF 'style-background-image',
+24: CHOICE
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'style-footer-style',
+15: ELEMENT "style:footer-style",
+16: CHOICE
+17: REF 'style-header-footer-properties',
+17: EPSILON
+14: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-master-styles',
+5: CHOICE
+6: ELEMENT "office:master-styles",
+7: INTERLEAVE
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-master-page',
+11: ELEMENT "style:master-page",
+12: SEQUENCE
+13: REF 'style-master-page-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "style:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "style:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "style:page-layout-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:style-name",
+17: REF 'styleNameRef',
+18: CHOICE
+19: DATA 'NCName',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "style:next-style-name",
+17: REF 'styleNameRef',
+18: CHOICE
+19: DATA 'NCName',
+19: EPSILON
+16: EPSILON
+13: CHOICE
+14: SEQUENCE
+15: REF 'style-header',
+16: ELEMENT "style:header",
+17: SEQUENCE
+18: REF 'common-style-header-footer-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:display",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+18: REF 'header-footer-content',
+19: CHOICE
+20: SEQUENCE
+21: REF 'text-tracked-changes',
+22: CHOICE
+23: ELEMENT "text:tracked-changes",
+24: SEQUENCE
+25: REF 'text-tracked-changes-attr',
+26: CHOICE
+27: ATTRIBUTE "text:track-changes",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-changed-region',
+28: ELEMENT "text:changed-region",
+29: SEQUENCE
+30: REF 'text-changed-region-attr',
+31: ATTRIBUTE "text:id",
+32: REF 'ID',
+33: DATA 'ID',
+30: REF 'text-changed-region-content',
+31: CHOICE
+32: ELEMENT "text:insertion",
+33: REF 'office-change-info',
+34: ELEMENT "office:change-info",
+35: SEQUENCE
+36: REF 'dc-creator',
+36: REF 'dc-date',
+36: CHOICE
+37: ONEOREMORE
+38: REF 'text-p',
+39: ELEMENT "text:p",
+40: SEQUENCE
+41: REF 'paragraph-attrs',
+42: INTERLEAVE
+43: SEQUENCE
+44: CHOICE
+45: ATTRIBUTE "text:style-name",
+46: REF 'styleNameRef',
+47: CHOICE
+48: DATA 'NCName',
+48: EPSILON
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:class-names",
+46: REF 'styleNameRefs',
+47: LIST
+48: CHOICE
+49: ONEOREMORE
+50: DATA 'NCName',
+49: EPSILON
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "text:cond-style-name",
+46: REF 'styleNameRef',
+47: CHOICE
+48: DATA 'NCName',
+48: EPSILON
+45: EPSILON
+43: CHOICE
+44: REF 'text-id',
+45: ATTRIBUTE "text:id",
+46: REF 'string',
+47: DATA 'string',
+44: EPSILON
+41: CHOICE
+42: ONEOREMORE
+43: REF 'paragraph-content',
+44: CHOICE
+45: STRING
+45: ELEMENT "text:s",
+46: CHOICE
+47: ATTRIBUTE "text:c",
+48: REF 'nonNegativeInteger',
+49: DATA 'nonNegativeInteger',
+47: EPSILON
+45: ELEMENT "text:tab",
+46: REF 'text-tab-attr',
+47: CHOICE
+48: ATTRIBUTE "text:tab-ref",
+49: REF 'nonNegativeInteger',
+50: DATA 'nonNegativeInteger',
+48: EPSILON
+45: ELEMENT "text:line-break",
+46: EPSILON
+45: REF 'text-soft-page-break',
+46: ELEMENT "text:soft-page-break",
+47: EPSILON
+45: ELEMENT "text:span",
+46: SEQUENCE
+47: CHOICE
+48: ATTRIBUTE "text:style-name",
+49: REF 'styleNameRef',
+50: CHOICE
+51: DATA 'NCName',
+51: EPSILON
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "text:class-names",
+49: REF 'styleNameRefs',
+50: LIST
+51: CHOICE
+52: ONEOREMORE
+53: DATA 'NCName',
+52: EPSILON
+48: EPSILON
+47: CHOICE
+48: ONEOREMORE
+49: REF 'paragraph-content',
+50: CHOICE
+51: STRING
+48: EPSILON
+45: ELEMENT "text:a",
+46: SEQUENCE
+47: REF 'text-a-attlist',
+48: INTERLEAVE
+49: CHOICE
+50: ATTRIBUTE "office:name",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+49: CHOICE
+50: ATTRIBUTE "office:title",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+49: SEQUENCE
+50: ATTRIBUTE "xlink:href",
+51: REF 'anyURI',
+52: DATA 'anyURI',
+50: CHOICE
+51: ATTRIBUTE "xlink:type",
+52: VALUE 'simple',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "xlink:actuate",
+52: VALUE 'onRequest',
+51: EPSILON
+49: SEQUENCE
+50: CHOICE
+51: ATTRIBUTE "office:target-frame-name",
+52: REF 'targetFrameName',
+53: CHOICE
+54: VALUE '_self',
+54: VALUE '_blank',
+54: VALUE '_parent',
+54: VALUE '_top',
+54: REF 'string',
+55: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "xlink:show",
+52: CHOICE
+53: VALUE 'new',
+53: VALUE 'replace',
+51: EPSILON
+49: SEQUENCE
+50: CHOICE
+51: ATTRIBUTE "text:style-name",
+52: REF 'styleNameRef',
+53: CHOICE
+54: DATA 'NCName',
+54: EPSILON
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:visited-style-name",
+52: REF 'styleNameRef',
+53: CHOICE
+54: DATA 'NCName',
+54: EPSILON
+51: EPSILON
+47: CHOICE
+48: REF 'office-event-listeners',
+48: EPSILON
+47: CHOICE
+48: ONEOREMORE
+49: REF 'paragraph-content',
+50: CHOICE
+51: STRING
+48: EPSILON
+45: ELEMENT "text:bookmark",
+46: ATTRIBUTE "text:name",
+47: REF 'string',
+48: DATA 'string',
+45: ELEMENT "text:bookmark-start",
+46: ATTRIBUTE "text:name",
+47: REF 'string',
+48: DATA 'string',
+45: ELEMENT "text:bookmark-end",
+46: ATTRIBUTE "text:name",
+47: REF 'string',
+48: DATA 'string',
+45: ELEMENT "text:reference-mark",
+46: ATTRIBUTE "text:name",
+47: REF 'string',
+48: DATA 'string',
+45: ELEMENT "text:reference-mark-start",
+46: ATTRIBUTE "text:name",
+47: REF 'string',
+48: DATA 'string',
+45: ELEMENT "text:reference-mark-end",
+46: ATTRIBUTE "text:name",
+47: REF 'string',
+48: DATA 'string',
+45: ELEMENT "text:note",
+46: SEQUENCE
+47: REF 'text-note-class',
+48: ATTRIBUTE "text:note-class",
+49: CHOICE
+50: VALUE 'footnote',
+50: VALUE 'endnote',
+47: CHOICE
+48: ATTRIBUTE "text:id",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: ELEMENT "text:note-citation",
+48: SEQUENCE
+49: CHOICE
+50: ATTRIBUTE "text:label",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+49: STRING
+47: ELEMENT "text:note-body",
+48: CHOICE
+49: ONEOREMORE
+50: REF 'text-content',
+51: CHOICE
+52: REF 'text-h',
+53: ELEMENT "text:h",
+54: SEQUENCE
+55: REF 'heading-attrs',
+56: INTERLEAVE
+57: ATTRIBUTE "text:outline-level",
+58: REF 'positiveInteger',
+59: DATA 'positiveInteger',
+57: CHOICE
+58: ATTRIBUTE "text:restart-numbering",
+59: REF 'boolean',
+60: CHOICE
+61: VALUE 'true',
+61: VALUE 'false',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "text:start-value",
+59: REF 'nonNegativeInteger',
+60: DATA 'nonNegativeInteger',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "text:is-list-header",
+59: REF 'boolean',
+60: CHOICE
+61: VALUE 'true',
+61: VALUE 'false',
+58: EPSILON
+55: REF 'paragraph-attrs',
+56: INTERLEAVE
+57: SEQUENCE
+58: CHOICE
+59: ATTRIBUTE "text:style-name",
+60: REF 'styleNameRef',
+61: CHOICE
+62: DATA 'NCName',
+62: EPSILON
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:class-names",
+60: REF 'styleNameRefs',
+61: LIST
+62: CHOICE
+63: ONEOREMORE
+64: DATA 'NCName',
+63: EPSILON
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "text:cond-style-name",
+60: REF 'styleNameRef',
+61: CHOICE
+62: DATA 'NCName',
+62: EPSILON
+59: EPSILON
+57: CHOICE
+58: REF 'text-id',
+59: ATTRIBUTE "text:id",
+60: REF 'string',
+61: DATA 'string',
+58: EPSILON
+55: CHOICE
+56: REF 'text-number',
+57: ELEMENT "text:number",
+58: REF 'string',
+59: DATA 'string',
+56: EPSILON
+55: CHOICE
+56: ONEOREMORE
+57: REF 'paragraph-content',
+58: CHOICE
+59: STRING
+56: EPSILON
+52: REF 'text-p',
+52: REF 'text-list',
+53: ELEMENT "text:list",
+54: SEQUENCE
+55: REF 'text-list-attr',
+56: INTERLEAVE
+57: CHOICE
+58: ATTRIBUTE "text:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "text:continue-numbering",
+59: REF 'boolean',
+60: CHOICE
+61: VALUE 'true',
+61: VALUE 'false',
+58: EPSILON
+55: CHOICE
+56: REF 'text-list-header',
+57: ELEMENT "text:list-header",
+58: REF 'text-list-item-content',
+59: SEQUENCE
+60: CHOICE
+61: REF 'text-number',
+61: EPSILON
+60: CHOICE
+61: ONEOREMORE
+62: CHOICE
+63: REF 'text-p',
+63: REF 'text-h',
+63: REF 'text-list',
+63: REF 'text-soft-page-break',
+61: EPSILON
+56: EPSILON
+55: CHOICE
+56: ONEOREMORE
+57: REF 'text-list-item',
+58: ELEMENT "text:list-item",
+59: SEQUENCE
+60: REF 'text-list-item-attr',
+61: CHOICE
+62: ATTRIBUTE "text:start-value",
+63: REF 'nonNegativeInteger',
+64: DATA 'nonNegativeInteger',
+62: EPSILON
+60: REF 'text-list-item-content',
+61: SEQUENCE
+62: CHOICE
+63: REF 'text-number',
+63: EPSILON
+62: CHOICE
+63: ONEOREMORE
+64: CHOICE
+65: REF 'text-p',
+65: REF 'text-h',
+65: REF 'text-list',
+65: REF 'text-soft-page-break',
+63: EPSILON
+56: EPSILON
+52: REF 'text-numbered-paragraph',
+53: ELEMENT "text:numbered-paragraph",
+54: SEQUENCE
+55: REF 'text-numbered-paragraph-attr',
+56: INTERLEAVE
+57: CHOICE
+58: ATTRIBUTE "text:level",
+59: REF 'positiveInteger',
+60: DATA 'positiveInteger',
+58: EPSILON
+57: REF 'text-list-attr',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "text:style-name",
+61: REF 'styleNameRef',
+62: CHOICE
+63: DATA 'NCName',
+63: EPSILON
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "text:continue-numbering",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+57: REF 'text-list-item-attr',
+58: CHOICE
+59: ATTRIBUTE "text:start-value",
+60: REF 'nonNegativeInteger',
+61: DATA 'nonNegativeInteger',
+59: EPSILON
+55: CHOICE
+56: REF 'text-number',
+56: EPSILON
+55: CHOICE
+56: REF 'text-p',
+56: REF 'text-h',
+52: REF 'table-table',
+53: ELEMENT "table:table",
+54: SEQUENCE
+55: REF 'table-table-attlist',
+56: INTERLEAVE
+57: CHOICE
+58: ATTRIBUTE "table:name",
+59: REF 'string',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:style-name",
+59: REF 'styleNameRef',
+60: CHOICE
+61: DATA 'NCName',
+61: EPSILON
+58: EPSILON
+57: SEQUENCE
+58: CHOICE
+59: ATTRIBUTE "table:protected",
+60: REF 'boolean',
+61: CHOICE
+62: VALUE 'true',
+62: VALUE 'false',
+59: EPSILON
+58: CHOICE
+59: ATTRIBUTE "table:protection-key",
+60: STRING
+59: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:print",
+59: REF 'boolean',
+60: CHOICE
+61: VALUE 'true',
+61: VALUE 'false',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:print-ranges",
+59: REF 'cellRangeAddressList',
+60: DATA 'string',
+58: EPSILON
+57: CHOICE
+58: ATTRIBUTE "table:is-sub-table",
+59: REF 'boolean',
+60: CHOICE
+61: VALUE 'true',
+61: VALUE 'false',
+58: EPSILON
+55: CHOICE
+56: REF 'table-table-source',
+57: ELEMENT "table:table-source",
+58: SEQUENCE
+59: REF 'table-table-source-attlist',
+60: INTERLEAVE
+61: CHOICE
+62: ATTRIBUTE "table:mode",
+63: CHOICE
+64: VALUE 'copy-all',
+64: VALUE 'copy-results-only',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "table:table-name",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+59: REF 'table-linked-source-attlist',
+60: INTERLEAVE
+61: SEQUENCE
+62: CHOICE
+63: ATTRIBUTE "xlink:type",
+64: VALUE 'simple',
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "xlink:actuate",
+64: VALUE 'onRequest',
+63: EPSILON
+62: ATTRIBUTE "xlink:href",
+63: REF 'anyURI',
+64: DATA 'anyURI',
+61: CHOICE
+62: ATTRIBUTE "table:filter-name",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "table:filter-options",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "table:refresh-delay",
+63: REF 'duration',
+64: DATA 'duration',
+62: EPSILON
+56: EPSILON
+55: CHOICE
+56: REF 'office-dde-source',
+57: ELEMENT "office:dde-source",
+58: SEQUENCE
+59: REF 'office-dde-source-attlist',
+60: INTERLEAVE
+61: CHOICE
+62: ATTRIBUTE "office:name",
+63: REF 'string',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "office:conversion-mode",
+63: CHOICE
+64: VALUE 'into-default-style-data-style',
+64: VALUE 'into-english-number',
+64: VALUE 'keep-text',
+62: EPSILON
+59: REF 'common-dde-connection-decl-attlist',
+60: INTERLEAVE
+61: ATTRIBUTE "office:dde-application",
+62: REF 'string',
+63: DATA 'string',
+61: ATTRIBUTE "office:dde-topic",
+62: REF 'string',
+63: DATA 'string',
+61: ATTRIBUTE "office:dde-item",
+62: REF 'string',
+63: DATA 'string',
+61: CHOICE
+62: ATTRIBUTE "office:automatic-update",
+63: REF 'boolean',
+64: CHOICE
+65: VALUE 'true',
+65: VALUE 'false',
+62: EPSILON
+56: EPSILON
+55: CHOICE
+56: REF 'table-scenario',
+57: ELEMENT "table:scenario",
+58: REF 'table-scenario-attlist',
+59: INTERLEAVE
+60: ATTRIBUTE "table:scenario-ranges",
+61: REF 'cellRangeAddressList',
+62: DATA 'string',
+60: ATTRIBUTE "table:is-active",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: CHOICE
+61: ATTRIBUTE "table:display-border",
+62: REF 'boolean',
+63: CHOICE
+64: VALUE 'true',
+64: VALUE 'false',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "table:border-color",
+62: REF 'color',
+63: DATA 'string',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "table:copy-back",
+62: REF 'boolean',
+63: CHOICE
+64: VALUE 'true',
+64: VALUE 'false',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "table:copy-styles",
+62: REF 'boolean',
+63: CHOICE
+64: VALUE 'true',
+64: VALUE 'false',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "table:copy-formulas",
+62: REF 'boolean',
+63: CHOICE
+64: VALUE 'true',
+64: VALUE 'false',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "table:comment",
+62: REF 'string',
+63: DATA 'string',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "table:protected",
+62: REF 'boolean',
+63: CHOICE
+64: VALUE 'true',
+64: VALUE 'false',
+61: EPSILON
+56: EPSILON
+55: CHOICE
+56: REF 'office-forms',
+57: CHOICE
+58: ELEMENT "office:forms",
+59: SEQUENCE
+60: REF 'office-forms-attlist',
+61: INTERLEAVE
+62: CHOICE
+63: ATTRIBUTE "form:automatic-focus",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+62: CHOICE
+63: ATTRIBUTE "form:apply-design-mode",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+60: CHOICE
+61: ONEOREMORE
+62: CHOICE
+63: REF 'form-form',
+64: ELEMENT "form:form",
+65: SEQUENCE
+66: REF 'common-form-control-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:name",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:control-implementation",
+70: REF 'namespacedToken',
+71: DATA 'string',
+69: EPSILON
+66: REF 'form-form-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: SEQUENCE
+70: ATTRIBUTE "xlink:href",
+71: REF 'anyURI',
+72: DATA 'anyURI',
+70: CHOICE
+71: ATTRIBUTE "xlink:type",
+72: VALUE 'simple',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "xlink:actuate",
+72: VALUE 'onRequest',
+71: EPSILON
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "office:target-frame",
+70: REF 'targetFrameName',
+71: CHOICE
+72: VALUE '_self',
+72: VALUE '_blank',
+72: VALUE '_parent',
+72: VALUE '_top',
+72: REF 'string',
+73: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:method",
+70: CHOICE
+71: VALUE 'get',
+71: VALUE 'post',
+71: REF 'string',
+72: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:enctype",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:allow-deletes",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:allow-inserts",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:allow-updates",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:apply-filter",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:command-type",
+70: CHOICE
+71: VALUE 'table',
+71: VALUE 'query',
+71: VALUE 'command',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:command",
+70: STRING
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:datasource",
+70: CHOICE
+71: REF 'anyURI',
+72: DATA 'anyURI',
+71: REF 'string',
+72: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:master-fields",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:detail-fields",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:escape-processing",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:filter",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:ignore-result",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:navigation-mode",
+70: REF 'navigation',
+71: CHOICE
+72: VALUE 'none',
+72: VALUE 'current',
+72: VALUE 'parent',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:order",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-cycle",
+70: REF 'tab-cycles',
+71: CHOICE
+72: VALUE 'records',
+72: VALUE 'current',
+72: VALUE 'page',
+69: EPSILON
+66: CHOICE
+67: REF 'form-properties',
+68: ELEMENT "form:properties",
+69: ONEOREMORE
+70: REF 'form-property',
+71: CHOICE
+72: ELEMENT "form:property",
+73: SEQUENCE
+74: REF 'form-property-name',
+75: ATTRIBUTE "form:property-name",
+76: REF 'string',
+77: DATA 'string',
+74: REF 'form-property-value-and-type-attlist',
+75: CHOICE
+76: REF 'common-value-and-type-attlist',
+77: CHOICE
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'float',
+79: ATTRIBUTE "office:value",
+80: REF 'double',
+81: DATA 'double',
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'percentage',
+79: ATTRIBUTE "office:value",
+80: REF 'double',
+81: DATA 'double',
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'currency',
+79: ATTRIBUTE "office:value",
+80: REF 'double',
+81: DATA 'double',
+79: CHOICE
+80: ATTRIBUTE "office:currency",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'date',
+79: ATTRIBUTE "office:date-value",
+80: REF 'dateOrDateTime',
+81: CHOICE
+82: DATA 'date',
+82: DATA 'dateTime',
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'time',
+79: ATTRIBUTE "office:time-value",
+80: REF 'duration',
+81: DATA 'duration',
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'boolean',
+79: ATTRIBUTE "office:boolean-value",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+78: SEQUENCE
+79: ATTRIBUTE "office:value-type",
+80: VALUE 'string',
+79: CHOICE
+80: ATTRIBUTE "office:string-value",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+76: ATTRIBUTE "office:value-type",
+77: VALUE 'void',
+72: ELEMENT "form:list-property",
+73: SEQUENCE
+74: REF 'form-property-name',
+75: ATTRIBUTE "form:property-name",
+76: REF 'string',
+77: DATA 'string',
+74: REF 'form-property-type-and-value-list',
+75: CHOICE
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'float',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: ATTRIBUTE "office:value",
+81: REF 'double',
+82: DATA 'double',
+78: EPSILON
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'percentage',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: ATTRIBUTE "office:value",
+81: REF 'double',
+82: DATA 'double',
+78: EPSILON
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'currency',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: SEQUENCE
+81: ATTRIBUTE "office:value",
+82: REF 'double',
+83: DATA 'double',
+81: CHOICE
+82: ATTRIBUTE "office:currency",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+78: EPSILON
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'date',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: ATTRIBUTE "office:date-value",
+81: REF 'dateOrDateTime',
+82: CHOICE
+83: DATA 'date',
+83: DATA 'dateTime',
+78: EPSILON
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'time',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: ATTRIBUTE "office:time-value",
+81: REF 'duration',
+82: DATA 'duration',
+78: EPSILON
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'boolean',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: ATTRIBUTE "office:boolean-value",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+78: EPSILON
+76: SEQUENCE
+77: ATTRIBUTE "office:value-type",
+78: VALUE 'string',
+77: CHOICE
+78: ONEOREMORE
+79: ELEMENT "form:list-value",
+80: ATTRIBUTE "office:string-value",
+81: REF 'string',
+82: DATA 'string',
+78: EPSILON
+76: ATTRIBUTE "office:value-type",
+77: VALUE 'void',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+66: CHOICE
+67: ONEOREMORE
+68: CHOICE
+69: REF 'controls',
+70: CHOICE
+71: REF 'column-controls',
+72: CHOICE
+73: ELEMENT "form:text",
+74: SEQUENCE
+75: REF 'form-text-attlist',
+76: SEQUENCE
+77: REF 'form-control-attlist',
+78: SEQUENCE
+79: REF 'common-form-control-attlist',
+80: INTERLEAVE
+81: CHOICE
+82: ATTRIBUTE "form:name",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+81: CHOICE
+82: ATTRIBUTE "form:control-implementation",
+83: REF 'namespacedToken',
+84: DATA 'string',
+82: EPSILON
+79: REF 'common-control-id-attlist',
+80: ATTRIBUTE "form:id",
+81: REF 'ID',
+82: DATA 'ID',
+79: REF 'xforms-bind-attlist',
+80: CHOICE
+81: ATTRIBUTE "xforms:bind",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+77: REF 'common-current-value-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:current-value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: REF 'common-disabled-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:disabled",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-maxlength-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:max-length",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+77: REF 'common-printable-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:printable",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-readonly-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:readonly",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-tab-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:tab-index",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:tab-stop",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+77: REF 'common-title-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:title",
+80: STRING
+79: EPSILON
+77: REF 'common-value-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: REF 'common-convert-empty-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:convert-empty-to-null",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-data-field-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:data-field",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+73: ELEMENT "form:textarea",
+74: SEQUENCE
+75: REF 'form-textarea-attlist',
+76: SEQUENCE
+77: REF 'form-control-attlist',
+78: SEQUENCE
+79: REF 'common-form-control-attlist',
+80: INTERLEAVE
+81: CHOICE
+82: ATTRIBUTE "form:name",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+81: CHOICE
+82: ATTRIBUTE "form:control-implementation",
+83: REF 'namespacedToken',
+84: DATA 'string',
+82: EPSILON
+79: REF 'common-control-id-attlist',
+80: ATTRIBUTE "form:id",
+81: REF 'ID',
+82: DATA 'ID',
+79: REF 'xforms-bind-attlist',
+80: CHOICE
+81: ATTRIBUTE "xforms:bind",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+77: REF 'common-current-value-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:current-value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: REF 'common-disabled-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:disabled",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-maxlength-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:max-length",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+77: REF 'common-printable-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:printable",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-readonly-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:readonly",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-tab-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:tab-index",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:tab-stop",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+77: REF 'common-title-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:title",
+80: STRING
+79: EPSILON
+77: REF 'common-value-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: REF 'common-convert-empty-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:convert-empty-to-null",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-data-field-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:data-field",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+75: CHOICE
+76: ONEOREMORE
+77: REF 'text-p',
+76: EPSILON
+73: ELEMENT "form:formatted-text",
+74: SEQUENCE
+75: REF 'form-formatted-text-attlist',
+76: INTERLEAVE
+77: SEQUENCE
+78: REF 'form-control-attlist',
+79: SEQUENCE
+80: REF 'common-form-control-attlist',
+81: INTERLEAVE
+82: CHOICE
+83: ATTRIBUTE "form:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "form:control-implementation",
+84: REF 'namespacedToken',
+85: DATA 'string',
+83: EPSILON
+80: REF 'common-control-id-attlist',
+81: ATTRIBUTE "form:id",
+82: REF 'ID',
+83: DATA 'ID',
+80: REF 'xforms-bind-attlist',
+81: CHOICE
+82: ATTRIBUTE "xforms:bind",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+78: REF 'common-current-value-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:current-value",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-disabled-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:disabled",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-maxlength-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:max-length",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+78: REF 'common-printable-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:printable",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-readonly-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:readonly",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-tab-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:tab-index",
+82: REF 'nonNegativeInteger',
+83: DATA 'nonNegativeInteger',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:tab-stop",
+82: REF 'boolean',
+83: CHOICE
+84: VALUE 'true',
+84: VALUE 'false',
+81: EPSILON
+78: REF 'common-title-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:title",
+81: STRING
+80: EPSILON
+78: REF 'common-value-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:value",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-convert-empty-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:convert-empty-to-null",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-data-field-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:data-field",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:max-value",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:min-value",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:validation",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+73: ELEMENT "form:number",
+74: SEQUENCE
+75: REF 'form-number-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:value",
+79: REF 'double',
+80: DATA 'double',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:current-value",
+79: REF 'double',
+80: DATA 'double',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:min-value",
+79: REF 'double',
+80: DATA 'double',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:max-value",
+79: REF 'double',
+80: DATA 'double',
+78: EPSILON
+75: REF 'common-numeric-control-attlist',
+76: SEQUENCE
+77: REF 'form-control-attlist',
+78: SEQUENCE
+79: REF 'common-form-control-attlist',
+80: INTERLEAVE
+81: CHOICE
+82: ATTRIBUTE "form:name",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+81: CHOICE
+82: ATTRIBUTE "form:control-implementation",
+83: REF 'namespacedToken',
+84: DATA 'string',
+82: EPSILON
+79: REF 'common-control-id-attlist',
+80: ATTRIBUTE "form:id",
+81: REF 'ID',
+82: DATA 'ID',
+79: REF 'xforms-bind-attlist',
+80: CHOICE
+81: ATTRIBUTE "xforms:bind",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+77: REF 'common-disabled-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:disabled",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-maxlength-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:max-length",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+77: REF 'common-printable-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:printable",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-readonly-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:readonly",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-tab-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:tab-index",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:tab-stop",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+77: REF 'common-title-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:title",
+80: STRING
+79: EPSILON
+77: REF 'common-convert-empty-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:convert-empty-to-null",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-data-field-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:data-field",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+73: ELEMENT "form:date",
+74: SEQUENCE
+75: REF 'form-date-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:value",
+79: REF 'date',
+80: DATA 'date',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:current-value",
+79: REF 'date',
+80: DATA 'date',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:min-value",
+79: REF 'date',
+80: DATA 'date',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:max-value",
+79: REF 'date',
+80: DATA 'date',
+78: EPSILON
+75: REF 'common-numeric-control-attlist',
+76: SEQUENCE
+77: REF 'form-control-attlist',
+78: SEQUENCE
+79: REF 'common-form-control-attlist',
+80: INTERLEAVE
+81: CHOICE
+82: ATTRIBUTE "form:name",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+81: CHOICE
+82: ATTRIBUTE "form:control-implementation",
+83: REF 'namespacedToken',
+84: DATA 'string',
+82: EPSILON
+79: REF 'common-control-id-attlist',
+80: ATTRIBUTE "form:id",
+81: REF 'ID',
+82: DATA 'ID',
+79: REF 'xforms-bind-attlist',
+80: CHOICE
+81: ATTRIBUTE "xforms:bind",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+77: REF 'common-disabled-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:disabled",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-maxlength-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:max-length",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+77: REF 'common-printable-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:printable",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-readonly-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:readonly",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-tab-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:tab-index",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:tab-stop",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+77: REF 'common-title-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:title",
+80: STRING
+79: EPSILON
+77: REF 'common-convert-empty-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:convert-empty-to-null",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+77: REF 'common-data-field-attlist',
+78: CHOICE
+79: ATTRIBUTE "form:data-field",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+73: ELEMENT "form:combobox",
+74: SEQUENCE
+75: REF 'form-combobox-attlist',
+76: INTERLEAVE
+77: SEQUENCE
+78: REF 'form-control-attlist',
+79: SEQUENCE
+80: REF 'common-form-control-attlist',
+81: INTERLEAVE
+82: CHOICE
+83: ATTRIBUTE "form:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "form:control-implementation",
+84: REF 'namespacedToken',
+85: DATA 'string',
+83: EPSILON
+80: REF 'common-control-id-attlist',
+81: ATTRIBUTE "form:id",
+82: REF 'ID',
+83: DATA 'ID',
+80: REF 'xforms-bind-attlist',
+81: CHOICE
+82: ATTRIBUTE "xforms:bind",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+78: REF 'common-current-value-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:current-value",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-disabled-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:disabled",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'dropdown',
+79: CHOICE
+80: ATTRIBUTE "form:dropdown",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-maxlength-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:max-length",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+78: REF 'common-printable-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:printable",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-readonly-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:readonly",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'size',
+79: CHOICE
+80: ATTRIBUTE "form:size",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+78: REF 'common-tab-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:tab-index",
+82: REF 'nonNegativeInteger',
+83: DATA 'nonNegativeInteger',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:tab-stop",
+82: REF 'boolean',
+83: CHOICE
+84: VALUE 'true',
+84: VALUE 'false',
+81: EPSILON
+78: REF 'common-title-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:title",
+81: STRING
+80: EPSILON
+78: REF 'common-value-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:value",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-convert-empty-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:convert-empty-to-null",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-data-field-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:data-field",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'list-source',
+79: CHOICE
+80: ATTRIBUTE "form:list-source",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'list-source-type',
+79: CHOICE
+80: ATTRIBUTE "form:list-source-type",
+81: CHOICE
+82: VALUE 'table',
+82: VALUE 'query',
+82: VALUE 'sql',
+82: VALUE 'sql-pass-through',
+82: VALUE 'value-list',
+82: VALUE 'table-fields',
+80: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:auto-complete",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+75: CHOICE
+76: ONEOREMORE
+77: REF 'form-item',
+78: ELEMENT "form:item",
+79: SEQUENCE
+80: REF 'form-item-attlist',
+81: REF 'label',
+82: CHOICE
+83: ATTRIBUTE "form:label",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+80: STRING
+76: EPSILON
+73: ELEMENT "form:listbox",
+74: SEQUENCE
+75: REF 'form-listbox-attlist',
+76: INTERLEAVE
+77: SEQUENCE
+78: REF 'form-control-attlist',
+79: SEQUENCE
+80: REF 'common-form-control-attlist',
+81: INTERLEAVE
+82: CHOICE
+83: ATTRIBUTE "form:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "form:control-implementation",
+84: REF 'namespacedToken',
+85: DATA 'string',
+83: EPSILON
+80: REF 'common-control-id-attlist',
+81: ATTRIBUTE "form:id",
+82: REF 'ID',
+83: DATA 'ID',
+80: REF 'xforms-bind-attlist',
+81: CHOICE
+82: ATTRIBUTE "xforms:bind",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+78: REF 'common-disabled-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:disabled",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'dropdown',
+79: CHOICE
+80: ATTRIBUTE "form:dropdown",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-printable-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:printable",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'size',
+79: CHOICE
+80: ATTRIBUTE "form:size",
+81: REF 'nonNegativeInteger',
+82: DATA 'nonNegativeInteger',
+80: EPSILON
+78: REF 'common-tab-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:tab-index",
+82: REF 'nonNegativeInteger',
+83: DATA 'nonNegativeInteger',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:tab-stop",
+82: REF 'boolean',
+83: CHOICE
+84: VALUE 'true',
+84: VALUE 'false',
+81: EPSILON
+78: REF 'common-title-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:title",
+81: STRING
+80: EPSILON
+78: REF 'bound-column',
+79: CHOICE
+80: ATTRIBUTE "form:bound-column",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-data-field-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:data-field",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'list-source',
+79: CHOICE
+80: ATTRIBUTE "form:list-source",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'list-source-type',
+79: CHOICE
+80: ATTRIBUTE "form:list-source-type",
+81: CHOICE
+82: VALUE 'table',
+82: VALUE 'query',
+82: VALUE 'sql',
+82: VALUE 'sql-pass-through',
+82: VALUE 'value-list',
+82: VALUE 'table-fields',
+80: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:multiple",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:xforms-list-source",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+75: CHOICE
+76: ONEOREMORE
+77: REF 'form-option',
+78: ELEMENT "form:option",
+79: SEQUENCE
+80: REF 'form-option-attlist',
+81: SEQUENCE
+82: REF 'current-selected',
+83: CHOICE
+84: ATTRIBUTE "form:current-selected",
+85: REF 'boolean',
+86: CHOICE
+87: VALUE 'true',
+87: VALUE 'false',
+84: EPSILON
+82: REF 'selected',
+83: CHOICE
+84: ATTRIBUTE "form:selected",
+85: REF 'boolean',
+86: CHOICE
+87: VALUE 'true',
+87: VALUE 'false',
+84: EPSILON
+82: REF 'label',
+83: CHOICE
+84: ATTRIBUTE "form:label",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+82: REF 'common-value-attlist',
+83: CHOICE
+84: ATTRIBUTE "form:value",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+80: STRING
+76: EPSILON
+73: ELEMENT "form:checkbox",
+74: SEQUENCE
+75: REF 'form-checkbox-attlist',
+76: INTERLEAVE
+77: SEQUENCE
+78: REF 'form-control-attlist',
+79: SEQUENCE
+80: REF 'common-form-control-attlist',
+81: INTERLEAVE
+82: CHOICE
+83: ATTRIBUTE "form:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "form:control-implementation",
+84: REF 'namespacedToken',
+85: DATA 'string',
+83: EPSILON
+80: REF 'common-control-id-attlist',
+81: ATTRIBUTE "form:id",
+82: REF 'ID',
+83: DATA 'ID',
+80: REF 'xforms-bind-attlist',
+81: CHOICE
+82: ATTRIBUTE "xforms:bind",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+78: REF 'common-disabled-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:disabled",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'label',
+79: CHOICE
+80: ATTRIBUTE "form:label",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-printable-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:printable",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+78: REF 'common-tab-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:tab-index",
+82: REF 'nonNegativeInteger',
+83: DATA 'nonNegativeInteger',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:tab-stop",
+82: REF 'boolean',
+83: CHOICE
+84: VALUE 'true',
+84: VALUE 'false',
+81: EPSILON
+78: REF 'common-title-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:title",
+81: STRING
+80: EPSILON
+78: REF 'common-value-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:value",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-data-field-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:data-field",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+78: REF 'common-form-visual-effect-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:visual-effect",
+81: CHOICE
+82: VALUE 'flat',
+82: VALUE '3d',
+80: EPSILON
+78: REF 'common-form-relative-image-position-attlist',
+79: CHOICE
+80: ATTRIBUTE "form:image-position",
+81: VALUE 'center',
+80: EPSILON
+80: SEQUENCE
+81: ATTRIBUTE "form:image-position",
+82: CHOICE
+83: VALUE 'start',
+83: VALUE 'end',
+83: VALUE 'top',
+83: VALUE 'bottom',
+81: CHOICE
+82: ATTRIBUTE "form:image-align",
+83: CHOICE
+84: VALUE 'start',
+84: VALUE 'center',
+84: VALUE 'end',
+82: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:current-state",
+79: REF 'states',
+80: CHOICE
+81: VALUE 'unchecked',
+81: VALUE 'checked',
+81: VALUE 'unknown',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:is-tristate",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:state",
+79: REF 'states',
+80: CHOICE
+81: VALUE 'unchecked',
+81: VALUE 'checked',
+81: VALUE 'unknown',
+78: EPSILON
+75: REF 'common-form-control-content',
+76: SEQUENCE
+77: CHOICE
+78: REF 'form-properties',
+78: EPSILON
+77: CHOICE
+78: REF 'office-event-listeners',
+78: EPSILON
+71: ELEMENT "form:password",
+72: SEQUENCE
+73: REF 'form-password-attlist',
+74: INTERLEAVE
+75: SEQUENCE
+76: REF 'form-control-attlist',
+77: SEQUENCE
+78: REF 'common-form-control-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:name",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:control-implementation",
+82: REF 'namespacedToken',
+83: DATA 'string',
+81: EPSILON
+78: REF 'common-control-id-attlist',
+79: ATTRIBUTE "form:id",
+80: REF 'ID',
+81: DATA 'ID',
+78: REF 'xforms-bind-attlist',
+79: CHOICE
+80: ATTRIBUTE "xforms:bind",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+76: REF 'common-disabled-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:disabled",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'common-maxlength-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:max-length",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+76: REF 'common-printable-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:printable",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'common-tab-attlist',
+77: INTERLEAVE
+78: CHOICE
+79: ATTRIBUTE "form:tab-index",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "form:tab-stop",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+76: REF 'common-title-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:title",
+79: STRING
+78: EPSILON
+76: REF 'common-value-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:value",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'common-convert-empty-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:convert-empty-to-null",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:echo-char",
+77: REF 'character',
+78: DATA 'string',
+76: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:file",
+72: SEQUENCE
+73: REF 'form-file-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-current-value-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:current-value",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-maxlength-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:max-length",
+78: REF 'nonNegativeInteger',
+79: DATA 'nonNegativeInteger',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-readonly-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:readonly",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-tab-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:tab-index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:tab-stop",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+75: REF 'common-value-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:value",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:time",
+72: SEQUENCE
+73: REF 'form-time-attlist',
+74: INTERLEAVE
+75: CHOICE
+76: ATTRIBUTE "form:value",
+77: REF 'time',
+78: DATA 'time',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:current-value",
+77: REF 'time',
+78: DATA 'time',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:min-value",
+77: REF 'time',
+78: DATA 'time',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:max-value",
+77: REF 'time',
+78: DATA 'time',
+76: EPSILON
+73: REF 'common-numeric-control-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-maxlength-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:max-length",
+78: REF 'nonNegativeInteger',
+79: DATA 'nonNegativeInteger',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-readonly-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:readonly",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-tab-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:tab-index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:tab-stop",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+75: REF 'common-convert-empty-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:convert-empty-to-null",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-data-field-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:data-field",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:fixed-text",
+72: SEQUENCE
+73: REF 'form-fixed-text-attlist',
+74: INTERLEAVE
+75: SEQUENCE
+76: REF 'form-control-attlist',
+77: SEQUENCE
+78: REF 'common-form-control-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:name",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:control-implementation",
+82: REF 'namespacedToken',
+83: DATA 'string',
+81: EPSILON
+78: REF 'common-control-id-attlist',
+79: ATTRIBUTE "form:id",
+80: REF 'ID',
+81: DATA 'ID',
+78: REF 'xforms-bind-attlist',
+79: CHOICE
+80: ATTRIBUTE "xforms:bind",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+76: REF 'for',
+77: CHOICE
+78: ATTRIBUTE "form:for",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'common-disabled-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:disabled",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'label',
+77: CHOICE
+78: ATTRIBUTE "form:label",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'common-printable-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:printable",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'common-title-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:title",
+79: STRING
+78: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:multi-line",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+76: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:button",
+72: SEQUENCE
+73: REF 'form-button-attlist',
+74: INTERLEAVE
+75: SEQUENCE
+76: REF 'form-control-attlist',
+77: SEQUENCE
+78: REF 'common-form-control-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:name",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:control-implementation",
+82: REF 'namespacedToken',
+83: DATA 'string',
+81: EPSILON
+78: REF 'common-control-id-attlist',
+79: ATTRIBUTE "form:id",
+80: REF 'ID',
+81: DATA 'ID',
+78: REF 'xforms-bind-attlist',
+79: CHOICE
+80: ATTRIBUTE "xforms:bind",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+76: REF 'button-type',
+77: CHOICE
+78: ATTRIBUTE "form:button-type",
+79: REF 'types',
+80: CHOICE
+81: VALUE 'submit',
+81: VALUE 'reset',
+81: VALUE 'push',
+81: VALUE 'url',
+78: EPSILON
+76: REF 'common-disabled-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:disabled",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'label',
+77: CHOICE
+78: ATTRIBUTE "form:label",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'image-data',
+77: CHOICE
+78: ATTRIBUTE "form:image-data",
+79: REF 'anyURI',
+80: DATA 'anyURI',
+78: EPSILON
+76: REF 'common-printable-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:printable",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'common-tab-attlist',
+77: INTERLEAVE
+78: CHOICE
+79: ATTRIBUTE "form:tab-index",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "form:tab-stop",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+76: REF 'target-frame',
+77: CHOICE
+78: ATTRIBUTE "office:target-frame",
+79: REF 'targetFrameName',
+80: CHOICE
+81: VALUE '_self',
+81: VALUE '_blank',
+81: VALUE '_parent',
+81: VALUE '_top',
+81: REF 'string',
+82: DATA 'string',
+78: EPSILON
+76: REF 'target-location',
+77: CHOICE
+78: ATTRIBUTE "xlink:href",
+79: REF 'anyURI',
+80: DATA 'anyURI',
+78: EPSILON
+76: REF 'common-title-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:title",
+79: STRING
+78: EPSILON
+76: REF 'common-value-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:value",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+76: REF 'common-form-relative-image-position-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:image-position",
+79: VALUE 'center',
+78: EPSILON
+78: SEQUENCE
+79: ATTRIBUTE "form:image-position",
+80: CHOICE
+81: VALUE 'start',
+81: VALUE 'end',
+81: VALUE 'top',
+81: VALUE 'bottom',
+79: CHOICE
+80: ATTRIBUTE "form:image-align",
+81: CHOICE
+82: VALUE 'start',
+82: VALUE 'center',
+82: VALUE 'end',
+80: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:default-button",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:toggle",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:focus-on-click",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:xforms-submission",
+77: REF 'string',
+78: DATA 'string',
+76: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:image",
+72: SEQUENCE
+73: REF 'form-image-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'button-type',
+76: CHOICE
+77: ATTRIBUTE "form:button-type",
+78: REF 'types',
+79: CHOICE
+80: VALUE 'submit',
+80: VALUE 'reset',
+80: VALUE 'push',
+80: VALUE 'url',
+77: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'image-data',
+76: CHOICE
+77: ATTRIBUTE "form:image-data",
+78: REF 'anyURI',
+79: DATA 'anyURI',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-tab-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:tab-index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:tab-stop",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'target-frame',
+76: CHOICE
+77: ATTRIBUTE "office:target-frame",
+78: REF 'targetFrameName',
+79: CHOICE
+80: VALUE '_self',
+80: VALUE '_blank',
+80: VALUE '_parent',
+80: VALUE '_top',
+80: REF 'string',
+81: DATA 'string',
+77: EPSILON
+75: REF 'target-location',
+76: CHOICE
+77: ATTRIBUTE "xlink:href",
+78: REF 'anyURI',
+79: DATA 'anyURI',
+77: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+75: REF 'common-value-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:value",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:radio",
+72: SEQUENCE
+73: REF 'form-radio-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'current-selected',
+76: CHOICE
+77: ATTRIBUTE "form:current-selected",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'label',
+76: CHOICE
+77: ATTRIBUTE "form:label",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'selected',
+76: CHOICE
+77: ATTRIBUTE "form:selected",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-tab-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:tab-index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:tab-stop",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+75: REF 'common-value-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:value",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-data-field-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:data-field",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-form-visual-effect-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:visual-effect",
+78: CHOICE
+79: VALUE 'flat',
+79: VALUE '3d',
+77: EPSILON
+75: REF 'common-form-relative-image-position-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:image-position",
+78: VALUE 'center',
+77: EPSILON
+77: SEQUENCE
+78: ATTRIBUTE "form:image-position",
+79: CHOICE
+80: VALUE 'start',
+80: VALUE 'end',
+80: VALUE 'top',
+80: VALUE 'bottom',
+78: CHOICE
+79: ATTRIBUTE "form:image-align",
+80: CHOICE
+81: VALUE 'start',
+81: VALUE 'center',
+81: VALUE 'end',
+79: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:frame",
+72: SEQUENCE
+73: REF 'form-frame-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'for',
+76: CHOICE
+77: ATTRIBUTE "form:for",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'label',
+76: CHOICE
+77: ATTRIBUTE "form:label",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:image-frame",
+72: SEQUENCE
+73: REF 'form-image-frame-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'image-data',
+76: CHOICE
+77: ATTRIBUTE "form:image-data",
+78: REF 'anyURI',
+79: DATA 'anyURI',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-readonly-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:readonly",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+75: REF 'common-data-field-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:data-field",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:hidden",
+72: SEQUENCE
+73: REF 'form-hidden-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-value-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:value",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:grid",
+72: SEQUENCE
+73: REF 'form-grid-attlist',
+74: SEQUENCE
+75: REF 'form-control-attlist',
+76: SEQUENCE
+77: REF 'common-form-control-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "form:name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "form:control-implementation",
+81: REF 'namespacedToken',
+82: DATA 'string',
+80: EPSILON
+77: REF 'common-control-id-attlist',
+78: ATTRIBUTE "form:id",
+79: REF 'ID',
+80: DATA 'ID',
+77: REF 'xforms-bind-attlist',
+78: CHOICE
+79: ATTRIBUTE "xforms:bind",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: REF 'common-disabled-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:disabled",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-printable-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:printable",
+78: REF 'boolean',
+79: CHOICE
+80: VALUE 'true',
+80: VALUE 'false',
+77: EPSILON
+75: REF 'common-tab-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "form:tab-index",
+79: REF 'nonNegativeInteger',
+80: DATA 'nonNegativeInteger',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "form:tab-stop",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+75: REF 'common-title-attlist',
+76: CHOICE
+77: ATTRIBUTE "form:title",
+78: STRING
+77: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+73: CHOICE
+74: ONEOREMORE
+75: REF 'form-column',
+76: ELEMENT "form:column",
+77: SEQUENCE
+78: REF 'form-column-attlist',
+79: SEQUENCE
+80: REF 'common-form-control-attlist',
+81: INTERLEAVE
+82: CHOICE
+83: ATTRIBUTE "form:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "form:control-implementation",
+84: REF 'namespacedToken',
+85: DATA 'string',
+83: EPSILON
+80: REF 'label',
+81: CHOICE
+82: ATTRIBUTE "form:label",
+83: REF 'string',
+84: DATA 'string',
+82: EPSILON
+80: REF 'text-style-name',
+81: CHOICE
+82: ATTRIBUTE "form:text-style-name",
+83: REF 'styleNameRef',
+84: CHOICE
+85: DATA 'NCName',
+85: EPSILON
+82: EPSILON
+78: ONEOREMORE
+79: REF 'column-controls',
+80: CHOICE
+74: EPSILON
+71: ELEMENT "form:value-range",
+72: SEQUENCE
+73: REF 'form-value-range-attlist',
+74: INTERLEAVE
+75: SEQUENCE
+76: REF 'form-control-attlist',
+77: SEQUENCE
+78: REF 'common-form-control-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "form:name",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "form:control-implementation",
+82: REF 'namespacedToken',
+83: DATA 'string',
+81: EPSILON
+78: REF 'common-control-id-attlist',
+79: ATTRIBUTE "form:id",
+80: REF 'ID',
+81: DATA 'ID',
+78: REF 'xforms-bind-attlist',
+79: CHOICE
+80: ATTRIBUTE "xforms:bind",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+76: REF 'common-disabled-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:disabled",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'common-printable-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:printable",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+76: REF 'common-tab-attlist',
+77: INTERLEAVE
+78: CHOICE
+79: ATTRIBUTE "form:tab-index",
+80: REF 'nonNegativeInteger',
+81: DATA 'nonNegativeInteger',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "form:tab-stop",
+80: REF 'boolean',
+81: CHOICE
+82: VALUE 'true',
+82: VALUE 'false',
+79: EPSILON
+76: REF 'common-title-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:title",
+79: STRING
+78: EPSILON
+76: REF 'common-value-attlist',
+77: CHOICE
+78: ATTRIBUTE "form:value",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:max-value",
+77: REF 'string',
+78: DATA 'string',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:min-value",
+77: REF 'string',
+78: DATA 'string',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:step-size",
+77: REF 'positiveInteger',
+78: DATA 'positiveInteger',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:page-step-size",
+77: REF 'positiveInteger',
+78: DATA 'positiveInteger',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:delay-for-repeat",
+77: REF 'duration',
+78: DATA 'duration',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "form:orientation",
+77: CHOICE
+78: VALUE 'horizontal',
+78: VALUE 'vertical',
+76: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+71: ELEMENT "form:generic-control",
+72: SEQUENCE
+73: REF 'form-generic-control-attlist',
+74: REF 'form-control-attlist',
+75: SEQUENCE
+76: REF 'common-form-control-attlist',
+77: INTERLEAVE
+78: CHOICE
+79: ATTRIBUTE "form:name",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "form:control-implementation",
+80: REF 'namespacedToken',
+81: DATA 'string',
+79: EPSILON
+76: REF 'common-control-id-attlist',
+77: ATTRIBUTE "form:id",
+78: REF 'ID',
+79: DATA 'ID',
+76: REF 'xforms-bind-attlist',
+77: CHOICE
+78: ATTRIBUTE "xforms:bind",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+73: REF 'common-form-control-content',
+74: SEQUENCE
+75: CHOICE
+76: REF 'form-properties',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+69: REF 'form-form',
+67: EPSILON
+66: CHOICE
+67: REF 'form-connection-resource',
+68: ELEMENT "form:connection-resource",
+69: ATTRIBUTE "xlink:href",
+70: REF 'anyURI',
+71: DATA 'anyURI',
+67: EPSILON
+63: REF 'xforms-model',
+64: ELEMENT "xforms:model",
+65: REF 'anyAttListOrElements',
+66: SEQUENCE
+67: CHOICE
+68: ONEOREMORE
+69: ATTRIBUTE "*",
+70: STRING
+68: EPSILON
+67: REF 'anyElements',
+68: CHOICE
+69: ONEOREMORE
+69: EPSILON
+61: EPSILON
+58: EPSILON
+56: EPSILON
+55: CHOICE
+56: REF 'table-shapes',
+57: ELEMENT "table:shapes",
+58: ONEOREMORE
+59: REF 'shape',
+60: CHOICE
+61: REF 'draw-rect',
+62: ELEMENT "draw:rect",
+63: SEQUENCE
+64: REF 'draw-rect-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:corner-radius",
+67: REF 'nonNegativeLength',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+66: ELEMENT "svg:title",
+67: STRING
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+66: ELEMENT "svg:desc",
+67: STRING
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+67: ELEMENT "draw:glue-point",
+68: REF 'draw-glue-point-attlist',
+69: INTERLEAVE
+70: ATTRIBUTE "draw:id",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: SEQUENCE
+71: ATTRIBUTE "svg:x",
+72: CHOICE
+73: REF 'distance',
+74: REF 'length',
+75: DATA 'string',
+73: REF 'percent',
+74: DATA 'string',
+71: ATTRIBUTE "svg:y",
+72: CHOICE
+73: REF 'distance',
+74: REF 'length',
+75: DATA 'string',
+73: REF 'percent',
+74: DATA 'string',
+70: CHOICE
+71: ATTRIBUTE "draw:align",
+72: CHOICE
+73: VALUE 'top-left',
+73: VALUE 'top',
+73: VALUE 'top-right',
+73: VALUE 'left',
+73: VALUE 'center',
+73: VALUE 'right',
+73: VALUE 'bottom-left',
+73: VALUE 'bottom-right',
+71: EPSILON
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-line',
+62: ELEMENT "draw:line",
+63: SEQUENCE
+64: REF 'draw-line-attlist',
+65: INTERLEAVE
+66: SEQUENCE
+67: ATTRIBUTE "svg:x1",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: ATTRIBUTE "svg:y1",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+66: SEQUENCE
+67: ATTRIBUTE "svg:x2",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: ATTRIBUTE "svg:y2",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-polyline',
+62: ELEMENT "draw:polyline",
+63: SEQUENCE
+64: REF 'common-draw-points-attlist',
+65: ATTRIBUTE "draw:points",
+66: REF 'points',
+67: DATA 'string',
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-viewbox-attlist',
+65: ATTRIBUTE "svg:viewBox",
+66: LIST
+67: SEQUENCE
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-polygon',
+62: ELEMENT "draw:polygon",
+63: SEQUENCE
+64: REF 'common-draw-points-attlist',
+65: ATTRIBUTE "draw:points",
+66: REF 'points',
+67: DATA 'string',
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-viewbox-attlist',
+65: ATTRIBUTE "svg:viewBox",
+66: LIST
+67: SEQUENCE
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-regular-polygon',
+62: ELEMENT "draw:regular-polygon",
+63: SEQUENCE
+64: REF 'draw-regular-polygon-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: ATTRIBUTE "draw:concave",
+68: VALUE 'false',
+67: SEQUENCE
+68: ATTRIBUTE "draw:concave",
+69: VALUE 'true',
+68: REF 'draw-regular-polygon-sharpness-attlist',
+69: ATTRIBUTE "draw:sharpness",
+70: REF 'percent',
+71: DATA 'string',
+66: ATTRIBUTE "draw:corners",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-path',
+62: ELEMENT "draw:path",
+63: SEQUENCE
+64: REF 'common-draw-path-data-attlist',
+65: ATTRIBUTE "svg:d",
+66: REF 'pathData',
+67: DATA 'string',
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-viewbox-attlist',
+65: ATTRIBUTE "svg:viewBox",
+66: LIST
+67: SEQUENCE
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+68: REF 'integer',
+69: DATA 'integer',
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-circle',
+62: ELEMENT "draw:circle",
+63: SEQUENCE
+64: REF 'draw-circle-attlist',
+65: CHOICE
+66: ATTRIBUTE "svg:r",
+67: REF 'length',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-draw-circle-ellipse-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: SEQUENCE
+68: ATTRIBUTE "svg:cx",
+69: REF 'coordinate',
+70: REF 'length',
+71: DATA 'string',
+68: ATTRIBUTE "svg:cy",
+69: REF 'coordinate',
+70: REF 'length',
+71: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "draw:kind",
+68: CHOICE
+69: VALUE 'full',
+69: VALUE 'section',
+69: VALUE 'cut',
+69: VALUE 'arc',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "draw:start-angle",
+68: REF 'double',
+69: DATA 'double',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "draw:end-angle",
+68: REF 'double',
+69: DATA 'double',
+67: EPSILON
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-ellipse',
+62: ELEMENT "draw:ellipse",
+63: SEQUENCE
+64: REF 'common-draw-circle-ellipse-attlist',
+65: INTERLEAVE
+66: CHOICE
+67: SEQUENCE
+68: ATTRIBUTE "svg:cx",
+69: REF 'coordinate',
+70: REF 'length',
+71: DATA 'string',
+68: ATTRIBUTE "svg:cy",
+69: REF 'coordinate',
+70: REF 'length',
+71: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "draw:kind",
+68: CHOICE
+69: VALUE 'full',
+69: VALUE 'section',
+69: VALUE 'cut',
+69: VALUE 'arc',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "draw:start-angle",
+68: REF 'double',
+69: DATA 'double',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "draw:end-angle",
+68: REF 'double',
+69: DATA 'double',
+67: EPSILON
+64: REF 'draw-ellipse-attlist',
+65: CHOICE
+66: SEQUENCE
+67: ATTRIBUTE "svg:rx",
+68: REF 'length',
+69: DATA 'string',
+67: ATTRIBUTE "svg:ry",
+68: REF 'length',
+69: DATA 'string',
+66: EPSILON
+64: REF 'common-draw-position-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:x",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:y",
+68: REF 'coordinate',
+69: REF 'length',
+70: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-size-attlist',
+65: SEQUENCE
+66: CHOICE
+67: ATTRIBUTE "svg:width",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "svg:height",
+68: REF 'length',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-draw-shape-with-text-and-styles-attlist',
+65: SEQUENCE
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:id",
+71: REF 'ID',
+72: DATA 'ID',
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "table:end-cell-address",
+73: REF 'cellAddress',
+74: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-x",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "table:end-y",
+73: REF 'coordinate',
+74: REF 'length',
+75: DATA 'string',
+72: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-text-style-name-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:text-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: REF 'draw-text',
+65: CHOICE
+66: ONEOREMORE
+67: CHOICE
+68: REF 'text-p',
+68: REF 'text-list',
+66: EPSILON
+61: REF 'draw-g',
+62: ELEMENT "draw:g",
+63: SEQUENCE
+64: REF 'draw-g-attlist',
+65: CHOICE
+66: ATTRIBUTE "svg:y",
+67: REF 'coordinate',
+68: REF 'length',
+69: DATA 'string',
+66: EPSILON
+64: REF 'common-draw-z-index-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:z-index",
+67: REF 'nonNegativeInteger',
+68: DATA 'nonNegativeInteger',
+66: EPSILON
+64: REF 'common-draw-name-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:name",
+67: REF 'string',
+68: DATA 'string',
+66: EPSILON
+64: REF 'common-draw-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:id",
+67: REF 'ID',
+68: DATA 'ID',
+66: EPSILON
+64: REF 'common-draw-style-name-attlist',
+65: CHOICE
+66: SEQUENCE
+67: CHOICE
+68: ATTRIBUTE "draw:style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "draw:class-names",
+69: REF 'styleNameRefs',
+70: LIST
+71: CHOICE
+72: ONEOREMORE
+73: DATA 'NCName',
+72: EPSILON
+68: EPSILON
+66: SEQUENCE
+67: CHOICE
+68: ATTRIBUTE "presentation:style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "presentation:class-names",
+69: REF 'styleNameRefs',
+70: LIST
+71: CHOICE
+72: ONEOREMORE
+73: DATA 'NCName',
+72: EPSILON
+68: EPSILON
+64: REF 'common-text-spreadsheet-shape-attlist',
+65: INTERLEAVE
+66: SEQUENCE
+67: CHOICE
+68: ATTRIBUTE "table:end-cell-address",
+69: REF 'cellAddress',
+70: DATA 'string',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "table:end-x",
+69: REF 'coordinate',
+70: REF 'length',
+71: DATA 'string',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "table:end-y",
+69: REF 'coordinate',
+70: REF 'length',
+71: DATA 'string',
+68: EPSILON
+66: CHOICE
+67: ATTRIBUTE "table:table-background",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+66: REF 'common-text-anchor-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "text:anchor-type",
+70: CHOICE
+71: VALUE 'page',
+71: VALUE 'frame',
+71: VALUE 'paragraph',
+71: VALUE 'char',
+71: VALUE 'as-char',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "text:anchor-page-number",
+70: REF 'positiveInteger',
+71: DATA 'positiveInteger',
+69: EPSILON
+64: REF 'common-draw-caption-id-attlist',
+65: CHOICE
+66: ATTRIBUTE "draw:caption-id",
+67: REF 'IDREF',
+68: DATA 'IDREF',
+66: EPSILON
+64: CHOICE
+65: REF 'svg-title',
+65: EPSILON
+64: CHOICE
+65: REF 'svg-desc',
+65: EPSILON
+64: CHOICE
+65: REF 'office-event-listeners',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'draw-glue-point',
+65: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'shape',
+67: CHOICE
+68: REF 'draw-rect',
+68: REF 'draw-line',
+68: REF 'draw-polyline',
+68: REF 'draw-polygon',
+68: REF 'draw-regular-polygon',
+68: REF 'draw-path',
+68: REF 'draw-circle',
+68: REF 'draw-ellipse',
+68: REF 'draw-g',
+68: REF 'draw-page-thumbnail',
+69: ELEMENT "draw:page-thumbnail",
+70: SEQUENCE
+71: REF 'draw-page-thumbnail-attlist',
+72: CHOICE
+73: ATTRIBUTE "draw:page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+71: REF 'common-draw-position-attlist',
+72: SEQUENCE
+73: CHOICE
+74: ATTRIBUTE "svg:x",
+75: REF 'coordinate',
+76: REF 'length',
+77: DATA 'string',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "svg:y",
+75: REF 'coordinate',
+76: REF 'length',
+77: DATA 'string',
+74: EPSILON
+71: REF 'common-draw-size-attlist',
+72: SEQUENCE
+73: CHOICE
+74: ATTRIBUTE "svg:width",
+75: REF 'length',
+76: DATA 'string',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "svg:height",
+75: REF 'length',
+76: DATA 'string',
+74: EPSILON
+71: REF 'presentation-shape-attlist',
+72: INTERLEAVE
+73: CHOICE
+74: ATTRIBUTE "presentation:class",
+75: REF 'presentation-classes',
+76: CHOICE
+77: VALUE 'title',
+77: VALUE 'outline',
+77: VALUE 'subtitle',
+77: VALUE 'text',
+77: VALUE 'graphic',
+77: VALUE 'object',
+77: VALUE 'chart',
+77: VALUE 'table',
+77: VALUE 'orgchart',
+77: VALUE 'page',
+77: VALUE 'notes',
+77: VALUE 'handout',
+77: VALUE 'header',
+77: VALUE 'footer',
+77: VALUE 'date-time',
+77: VALUE 'page-number',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "presentation:placeholder",
+75: REF 'boolean',
+76: CHOICE
+77: VALUE 'true',
+77: VALUE 'false',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "presentation:user-transformed",
+75: REF 'boolean',
+76: CHOICE
+77: VALUE 'true',
+77: VALUE 'false',
+74: EPSILON
+71: REF 'common-draw-shape-with-styles-attlist',
+72: SEQUENCE
+73: REF 'common-draw-z-index-attlist',
+74: CHOICE
+75: ATTRIBUTE "draw:z-index",
+76: REF 'nonNegativeInteger',
+77: DATA 'nonNegativeInteger',
+75: EPSILON
+73: REF 'common-draw-id-attlist',
+74: CHOICE
+75: ATTRIBUTE "draw:id",
+76: REF 'ID',
+77: DATA 'ID',
+75: EPSILON
+73: REF 'common-draw-layer-name-attlist',
+74: CHOICE
+75: ATTRIBUTE "draw:layer",
+76: DATA 'string',
+75: EPSILON
+73: REF 'common-draw-style-name-attlist',
+74: CHOICE
+75: SEQUENCE
+76: CHOICE
+77: ATTRIBUTE "draw:style-name",
+78: REF 'styleNameRef',
+79: CHOICE
+80: DATA 'NCName',
+80: EPSILON
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "draw:class-names",
+78: REF 'styleNameRefs',
+79: LIST
+80: CHOICE
+81: ONEOREMORE
+82: DATA 'NCName',
+81: EPSILON
+77: EPSILON
+75: SEQUENCE
+76: CHOICE
+77: ATTRIBUTE "presentation:style-name",
+78: REF 'styleNameRef',
+79: CHOICE
+80: DATA 'NCName',
+80: EPSILON
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "presentation:class-names",
+78: REF 'styleNameRefs',
+79: LIST
+80: CHOICE
+81: ONEOREMORE
+82: DATA 'NCName',
+81: EPSILON
+77: EPSILON
+73: REF 'common-draw-transform-attlist',
+74: CHOICE
+75: ATTRIBUTE "draw:transform",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+73: REF 'common-draw-name-attlist',
+74: CHOICE
+75: ATTRIBUTE "draw:name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+73: REF 'common-text-spreadsheet-shape-attlist',
+74: INTERLEAVE
+75: SEQUENCE
+76: CHOICE
+77: ATTRIBUTE "table:end-cell-address",
+78: REF 'cellAddress',
+79: DATA 'string',
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "table:end-x",
+78: REF 'coordinate',
+79: REF 'length',
+80: DATA 'string',
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "table:end-y",
+78: REF 'coordinate',
+79: REF 'length',
+80: DATA 'string',
+77: EPSILON
+75: CHOICE
+76: ATTRIBUTE "table:table-background",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+76: EPSILON
+75: REF 'common-text-anchor-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: ATTRIBUTE "text:anchor-type",
+79: CHOICE
+80: VALUE 'page',
+80: VALUE 'frame',
+80: VALUE 'paragraph',
+80: VALUE 'char',
+80: VALUE 'as-char',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "text:anchor-page-number",
+79: REF 'positiveInteger',
+80: DATA 'positiveInteger',
+78: EPSILON
+71: REF 'common-draw-caption-id-attlist',
+72: CHOICE
+73: ATTRIBUTE "draw:caption-id",
+74: REF 'IDREF',
+75: DATA 'IDREF',
+73: EPSILON
+71: CHOICE
+72: REF 'svg-title',
+72: EPSILON
+71: CHOICE
+72: REF 'svg-desc',
+72: EPSILON
+68: REF 'draw-frame',
+69: ELEMENT "draw:frame",
+70: SEQUENCE
+71: REF 'common-draw-shape-with-text-and-styles-attlist',
+72: SEQUENCE
+73: REF 'common-draw-shape-with-styles-attlist',
+74: SEQUENCE
+75: REF 'common-draw-z-index-attlist',
+76: CHOICE
+77: ATTRIBUTE "draw:z-index",
+78: REF 'nonNegativeInteger',
+79: DATA 'nonNegativeInteger',
+77: EPSILON
+75: REF 'common-draw-id-attlist',
+76: CHOICE
+77: ATTRIBUTE "draw:id",
+78: REF 'ID',
+79: DATA 'ID',
+77: EPSILON
+75: REF 'common-draw-layer-name-attlist',
+76: CHOICE
+77: ATTRIBUTE "draw:layer",
+78: DATA 'string',
+77: EPSILON
+75: REF 'common-draw-style-name-attlist',
+76: CHOICE
+77: SEQUENCE
+78: CHOICE
+79: ATTRIBUTE "draw:style-name",
+80: REF 'styleNameRef',
+81: CHOICE
+82: DATA 'NCName',
+82: EPSILON
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "draw:class-names",
+80: REF 'styleNameRefs',
+81: LIST
+82: CHOICE
+83: ONEOREMORE
+84: DATA 'NCName',
+83: EPSILON
+79: EPSILON
+77: SEQUENCE
+78: CHOICE
+79: ATTRIBUTE "presentation:style-name",
+80: REF 'styleNameRef',
+81: CHOICE
+82: DATA 'NCName',
+82: EPSILON
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "presentation:class-names",
+80: REF 'styleNameRefs',
+81: LIST
+82: CHOICE
+83: ONEOREMORE
+84: DATA 'NCName',
+83: EPSILON
+79: EPSILON
+75: REF 'common-draw-transform-attlist',
+76: CHOICE
+77: ATTRIBUTE "draw:transform",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-draw-name-attlist',
+76: CHOICE
+77: ATTRIBUTE "draw:name",
+78: REF 'string',
+79: DATA 'string',
+77: EPSILON
+75: REF 'common-text-spreadsheet-shape-attlist',
+76: INTERLEAVE
+77: SEQUENCE
+78: CHOICE
+79: ATTRIBUTE "table:end-cell-address",
+80: REF 'cellAddress',
+81: DATA 'string',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "table:end-x",
+80: REF 'coordinate',
+81: REF 'length',
+82: DATA 'string',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "table:end-y",
+80: REF 'coordinate',
+81: REF 'length',
+82: DATA 'string',
+79: EPSILON
+77: CHOICE
+78: ATTRIBUTE "table:table-background",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+78: EPSILON
+77: REF 'common-text-anchor-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "text:anchor-type",
+81: CHOICE
+82: VALUE 'page',
+82: VALUE 'frame',
+82: VALUE 'paragraph',
+82: VALUE 'char',
+82: VALUE 'as-char',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "text:anchor-page-number",
+81: REF 'positiveInteger',
+82: DATA 'positiveInteger',
+80: EPSILON
+73: REF 'common-draw-text-style-name-attlist',
+74: CHOICE
+75: ATTRIBUTE "draw:text-style-name",
+76: REF 'styleNameRef',
+77: CHOICE
+78: DATA 'NCName',
+78: EPSILON
+75: EPSILON
+71: REF 'common-draw-position-attlist',
+72: SEQUENCE
+73: CHOICE
+74: ATTRIBUTE "svg:x",
+75: REF 'coordinate',
+76: REF 'length',
+77: DATA 'string',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "svg:y",
+75: REF 'coordinate',
+76: REF 'length',
+77: DATA 'string',
+74: EPSILON
+71: REF 'common-draw-rel-size-attlist',
+72: SEQUENCE
+73: REF 'common-draw-size-attlist',
+74: SEQUENCE
+75: CHOICE
+76: ATTRIBUTE "svg:width",
+77: REF 'length',
+78: DATA 'string',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "svg:height",
+77: REF 'length',
+78: DATA 'string',
+76: EPSILON
+73: CHOICE
+74: ATTRIBUTE "style:rel-width",
+75: CHOICE
+76: REF 'percent',
+77: DATA 'string',
+76: VALUE 'scale',
+76: VALUE 'scale-min',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "style:rel-height",
+75: CHOICE
+76: REF 'percent',
+77: DATA 'string',
+76: VALUE 'scale',
+76: VALUE 'scale-min',
+74: EPSILON
+71: REF 'common-draw-caption-id-attlist',
+72: CHOICE
+73: ATTRIBUTE "draw:caption-id",
+74: REF 'IDREF',
+75: DATA 'IDREF',
+73: EPSILON
+71: REF 'presentation-shape-attlist',
+72: INTERLEAVE
+73: CHOICE
+74: ATTRIBUTE "presentation:class",
+75: REF 'presentation-classes',
+76: CHOICE
+77: VALUE 'title',
+77: VALUE 'outline',
+77: VALUE 'subtitle',
+77: VALUE 'text',
+77: VALUE 'graphic',
+77: VALUE 'object',
+77: VALUE 'chart',
+77: VALUE 'table',
+77: VALUE 'orgchart',
+77: VALUE 'page',
+77: VALUE 'notes',
+77: VALUE 'handout',
+77: VALUE 'header',
+77: VALUE 'footer',
+77: VALUE 'date-time',
+77: VALUE 'page-number',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "presentation:placeholder",
+75: REF 'boolean',
+76: CHOICE
+77: VALUE 'true',
+77: VALUE 'false',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "presentation:user-transformed",
+75: REF 'boolean',
+76: CHOICE
+77: VALUE 'true',
+77: VALUE 'false',
+74: EPSILON
+71: REF 'draw-frame-attlist',
+72: CHOICE
+73: ATTRIBUTE "draw:copy-of",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+71: CHOICE
+72: ONEOREMORE
+73: CHOICE
+74: REF 'draw-text-box',
+75: ELEMENT "draw:text-box",
+76: SEQUENCE
+77: REF 'draw-text-box-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "draw:chain-next-name",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "draw:corner-radius",
+81: REF 'nonNegativeLength',
+82: DATA 'string',
+80: EPSILON
+79: SEQUENCE
+80: CHOICE
+81: ATTRIBUTE "fo:min-height",
+82: CHOICE
+83: REF 'length',
+84: DATA 'string',
+83: REF 'percent',
+84: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "fo:min-width",
+82: CHOICE
+83: REF 'length',
+84: DATA 'string',
+83: REF 'percent',
+84: DATA 'string',
+81: EPSILON
+79: SEQUENCE
+80: CHOICE
+81: ATTRIBUTE "fo:max-height",
+82: CHOICE
+83: REF 'length',
+84: DATA 'string',
+83: REF 'percent',
+84: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "fo:max-width",
+82: CHOICE
+83: REF 'length',
+84: DATA 'string',
+83: REF 'percent',
+84: DATA 'string',
+81: EPSILON
+79: CHOICE
+80: REF 'text-id',
+81: ATTRIBUTE "text:id",
+82: REF 'string',
+83: DATA 'string',
+80: EPSILON
+77: CHOICE
+78: ONEOREMORE
+79: REF 'text-content',
+80: CHOICE
+81: REF 'text-h',
+81: REF 'text-p',
+81: REF 'text-list',
+81: REF 'text-numbered-paragraph',
+81: REF 'table-table',
+81: REF 'draw-a',
+82: ELEMENT "draw:a",
+83: SEQUENCE
+84: REF 'draw-a-attlist',
+85: INTERLEAVE
+86: SEQUENCE
+87: ATTRIBUTE "xlink:href",
+88: REF 'anyURI',
+89: DATA 'anyURI',
+87: CHOICE
+88: ATTRIBUTE "xlink:type",
+89: VALUE 'simple',
+88: EPSILON
+87: CHOICE
+88: ATTRIBUTE "xlink:actuate",
+89: VALUE 'onRequest',
+88: EPSILON
+86: SEQUENCE
+87: CHOICE
+88: ATTRIBUTE "office:target-frame-name",
+89: REF 'targetFrameName',
+90: CHOICE
+91: VALUE '_self',
+91: VALUE '_blank',
+91: VALUE '_parent',
+91: VALUE '_top',
+91: REF 'string',
+92: DATA 'string',
+88: EPSILON
+87: CHOICE
+88: ATTRIBUTE "xlink:show",
+89: CHOICE
+90: VALUE 'new',
+90: VALUE 'replace',
+88: EPSILON
+86: CHOICE
+87: ATTRIBUTE "office:name",
+88: REF 'string',
+89: DATA 'string',
+87: EPSILON
+86: CHOICE
+87: ATTRIBUTE "office:title",
+88: REF 'string',
+89: DATA 'string',
+87: EPSILON
+86: CHOICE
+87: ATTRIBUTE "office:server-map",
+88: REF 'boolean',
+89: CHOICE
+90: VALUE 'true',
+90: VALUE 'false',
+87: EPSILON
+84: REF 'draw-frame',
+81: REF 'text-section',
+82: ELEMENT "text:section",
+83: SEQUENCE
+84: REF 'text-section-attr',
+85: INTERLEAVE
+86: REF 'sectionAttr',
+87: INTERLEAVE
+88: CHOICE
+89: ATTRIBUTE "text:style-name",
+90: REF 'styleNameRef',
+91: CHOICE
+92: DATA 'NCName',
+92: EPSILON
+89: EPSILON
+88: ATTRIBUTE "text:name",
+89: REF 'string',
+90: DATA 'string',
+88: CHOICE
+89: ATTRIBUTE "text:protected",
+90: REF 'boolean',
+91: CHOICE
+92: VALUE 'true',
+92: VALUE 'false',
+89: EPSILON
+88: CHOICE
+89: ATTRIBUTE "text:protection-key",
+90: REF 'string',
+91: DATA 'string',
+89: EPSILON
+86: CHOICE
+87: ATTRIBUTE "text:display",
+88: CHOICE
+89: VALUE 'true',
+89: VALUE 'none',
+87: SEQUENCE
+88: ATTRIBUTE "text:display",
+89: VALUE 'condition',
+88: ATTRIBUTE "text:condition",
+89: REF 'string',
+90: DATA 'string',
+87: EPSILON
+84: CHOICE
+85: REF 'text-section-source',
+86: ELEMENT "text:section-source",
+87: REF 'text-section-source-attr',
+88: INTERLEAVE
+89: CHOICE
+90: SEQUENCE
+91: ATTRIBUTE "xlink:href",
+92: REF 'anyURI',
+93: DATA 'anyURI',
+91: CHOICE
+92: ATTRIBUTE "xlink:type",
+93: VALUE 'simple',
+92: EPSILON
+91: CHOICE
+92: ATTRIBUTE "xlink:show",
+93: VALUE 'embed',
+92: EPSILON
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "text:section-name",
+91: REF 'string',
+92: DATA 'string',
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "text:filter-name",
+91: REF 'string',
+92: DATA 'string',
+90: EPSILON
+85: REF 'text-section-source-dde',
+86: REF 'office-dde-source',
+85: EPSILON
+84: CHOICE
+85: ONEOREMORE
+86: REF 'text-content',
+87: CHOICE
+88: REF 'text-h',
+88: REF 'text-p',
+88: REF 'text-list',
+88: REF 'text-numbered-paragraph',
+88: REF 'table-table',
+88: REF 'draw-a',
+88: REF 'text-section',
+88: REF 'text-soft-page-break',
+88: REF 'text-table-of-content',
+89: ELEMENT "text:table-of-content",
+90: SEQUENCE
+91: REF 'sectionAttr',
+92: INTERLEAVE
+93: CHOICE
+94: ATTRIBUTE "text:style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+93: ATTRIBUTE "text:name",
+94: REF 'string',
+95: DATA 'string',
+93: CHOICE
+94: ATTRIBUTE "text:protected",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: CHOICE
+94: ATTRIBUTE "text:protection-key",
+95: REF 'string',
+96: DATA 'string',
+94: EPSILON
+91: REF 'text-table-of-content-source',
+92: ELEMENT "text:table-of-content-source",
+93: SEQUENCE
+94: REF 'text-table-of-content-source-attlist',
+95: INTERLEAVE
+96: CHOICE
+97: ATTRIBUTE "text:outline-level",
+98: REF 'positiveInteger',
+99: DATA 'positiveInteger',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "text:use-outline-level",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "text:use-index-marks",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "text:use-index-source-styles",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "text:index-scope",
+98: CHOICE
+99: VALUE 'document',
+99: VALUE 'chapter',
+97: EPSILON
+96: CHOICE
+97: ATTRIBUTE "text:relative-tab-stop-position",
+98: REF 'boolean',
+99: CHOICE
+100: VALUE 'true',
+100: VALUE 'false',
+97: EPSILON
+94: CHOICE
+95: REF 'text-index-title-template',
+96: ELEMENT "text:index-title-template",
+97: SEQUENCE
+98: CHOICE
+99: ATTRIBUTE "text:style-name",
+100: REF 'styleNameRef',
+101: CHOICE
+102: DATA 'NCName',
+102: EPSILON
+99: EPSILON
+98: STRING
+95: EPSILON
+94: CHOICE
+95: ONEOREMORE
+96: REF 'text-table-of-content-entry-template',
+97: ELEMENT "text:table-of-content-entry-template",
+98: SEQUENCE
+99: REF 'text-table-of-content-entry-template-attlist',
+100: INTERLEAVE
+101: ATTRIBUTE "text:outline-level",
+102: REF 'positiveInteger',
+103: DATA 'positiveInteger',
+101: ATTRIBUTE "text:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+99: CHOICE
+100: ONEOREMORE
+101: REF 'text-table-of-content-children',
+102: CHOICE
+103: REF 'text-index-entry-chapter',
+104: ELEMENT "text:index-entry-chapter",
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "text:style-name",
+108: REF 'styleNameRef',
+109: CHOICE
+110: DATA 'NCName',
+110: EPSILON
+107: EPSILON
+106: REF 'text-index-entry-chapter-attrs',
+107: CHOICE
+108: ATTRIBUTE "text:display",
+109: CHOICE
+110: VALUE 'name',
+110: VALUE 'number',
+110: VALUE 'number-and-name',
+108: EPSILON
+103: REF 'text-index-entry-page-number',
+104: ELEMENT "text:index-entry-page-number",
+105: CHOICE
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+106: EPSILON
+103: REF 'text-index-entry-text',
+104: ELEMENT "text:index-entry-text",
+105: CHOICE
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+106: EPSILON
+103: REF 'text-index-entry-span',
+104: ELEMENT "text:index-entry-span",
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "text:style-name",
+108: REF 'styleNameRef',
+109: CHOICE
+110: DATA 'NCName',
+110: EPSILON
+107: EPSILON
+106: STRING
+103: REF 'text-index-entry-tab-stop',
+104: ELEMENT "text:index-entry-tab-stop",
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "text:style-name",
+108: REF 'styleNameRef',
+109: CHOICE
+110: DATA 'NCName',
+110: EPSILON
+107: EPSILON
+106: REF 'text-index-entry-tab-stop-attrs',
+107: INTERLEAVE
+108: CHOICE
+109: ATTRIBUTE "style:leader-char",
+110: REF 'character',
+111: DATA 'string',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "style:type",
+110: VALUE 'right',
+109: SEQUENCE
+110: ATTRIBUTE "style:type",
+111: VALUE 'left',
+110: ATTRIBUTE "style:position",
+111: REF 'length',
+112: DATA 'string',
+103: REF 'text-index-entry-link-start',
+104: ELEMENT "text:index-entry-link-start",
+105: CHOICE
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+106: EPSILON
+103: REF 'text-index-entry-link-end',
+104: ELEMENT "text:index-entry-link-end",
+105: CHOICE
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+106: EPSILON
+100: EPSILON
+95: EPSILON
+94: CHOICE
+95: ONEOREMORE
+96: REF 'text-index-source-styles',
+97: ELEMENT "text:index-source-styles",
+98: SEQUENCE
+99: ATTRIBUTE "text:outline-level",
+100: REF 'positiveInteger',
+101: DATA 'positiveInteger',
+99: CHOICE
+100: ONEOREMORE
+101: REF 'text-index-source-style',
+102: ELEMENT "text:index-source-style",
+103: ATTRIBUTE "text:style-name",
+104: REF 'styleName',
+105: DATA 'NCName',
+100: EPSILON
+95: EPSILON
+91: REF 'text-index-body',
+92: ELEMENT "text:index-body",
+93: CHOICE
+94: ONEOREMORE
+95: REF 'index-content-main',
+96: CHOICE
+97: REF 'text-content',
+98: CHOICE
+99: REF 'text-h',
+99: REF 'text-p',
+99: REF 'text-list',
+99: REF 'text-numbered-paragraph',
+99: REF 'table-table',
+99: REF 'draw-a',
+99: REF 'text-section',
+99: REF 'text-soft-page-break',
+99: REF 'text-table-of-content',
+99: REF 'text-illustration-index',
+100: ELEMENT "text:illustration-index",
+101: SEQUENCE
+102: REF 'sectionAttr',
+103: INTERLEAVE
+104: CHOICE
+105: ATTRIBUTE "text:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: ATTRIBUTE "text:name",
+105: REF 'string',
+106: DATA 'string',
+104: CHOICE
+105: ATTRIBUTE "text:protected",
+106: REF 'boolean',
+107: CHOICE
+108: VALUE 'true',
+108: VALUE 'false',
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "text:protection-key",
+106: REF 'string',
+107: DATA 'string',
+105: EPSILON
+102: REF 'text-illustration-index-source',
+103: ELEMENT "text:illustration-index-source",
+104: SEQUENCE
+105: REF 'text-illustration-index-source-attrs',
+106: INTERLEAVE
+107: REF 'text-index-scope-attr',
+108: CHOICE
+109: ATTRIBUTE "text:index-scope",
+110: CHOICE
+111: VALUE 'document',
+111: VALUE 'chapter',
+109: EPSILON
+107: REF 'text-relative-tab-stop-position-attr',
+108: CHOICE
+109: ATTRIBUTE "text:relative-tab-stop-position",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-caption",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:caption-sequence-name",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:caption-sequence-format",
+109: CHOICE
+110: VALUE 'text',
+110: VALUE 'category-and-value',
+110: VALUE 'caption',
+108: EPSILON
+105: CHOICE
+106: REF 'text-index-title-template',
+106: EPSILON
+105: CHOICE
+106: REF 'text-illustration-index-entry-template',
+107: ELEMENT "text:illustration-index-entry-template",
+108: REF 'text-illustration-index-entry-content',
+109: SEQUENCE
+110: REF 'text-illustration-index-entry-template-attrs',
+111: ATTRIBUTE "text:style-name",
+112: REF 'styleNameRef',
+113: CHOICE
+114: DATA 'NCName',
+114: EPSILON
+110: CHOICE
+111: ONEOREMORE
+112: CHOICE
+113: REF 'text-index-entry-page-number',
+113: REF 'text-index-entry-text',
+113: REF 'text-index-entry-span',
+113: REF 'text-index-entry-tab-stop',
+111: EPSILON
+106: EPSILON
+102: REF 'text-index-body',
+99: REF 'text-table-index',
+100: ELEMENT "text:table-index",
+101: SEQUENCE
+102: REF 'sectionAttr',
+103: INTERLEAVE
+104: CHOICE
+105: ATTRIBUTE "text:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: ATTRIBUTE "text:name",
+105: REF 'string',
+106: DATA 'string',
+104: CHOICE
+105: ATTRIBUTE "text:protected",
+106: REF 'boolean',
+107: CHOICE
+108: VALUE 'true',
+108: VALUE 'false',
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "text:protection-key",
+106: REF 'string',
+107: DATA 'string',
+105: EPSILON
+102: REF 'text-table-index-source',
+103: ELEMENT "text:table-index-source",
+104: SEQUENCE
+105: REF 'text-illustration-index-source-attrs',
+106: INTERLEAVE
+107: REF 'text-index-scope-attr',
+108: CHOICE
+109: ATTRIBUTE "text:index-scope",
+110: CHOICE
+111: VALUE 'document',
+111: VALUE 'chapter',
+109: EPSILON
+107: REF 'text-relative-tab-stop-position-attr',
+108: CHOICE
+109: ATTRIBUTE "text:relative-tab-stop-position",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-caption",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:caption-sequence-name",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:caption-sequence-format",
+109: CHOICE
+110: VALUE 'text',
+110: VALUE 'category-and-value',
+110: VALUE 'caption',
+108: EPSILON
+105: CHOICE
+106: REF 'text-index-title-template',
+106: EPSILON
+105: CHOICE
+106: REF 'text-table-index-entry-template',
+107: ELEMENT "text:table-index-entry-template",
+108: REF 'text-illustration-index-entry-content',
+109: SEQUENCE
+110: REF 'text-illustration-index-entry-template-attrs',
+111: ATTRIBUTE "text:style-name",
+112: REF 'styleNameRef',
+113: CHOICE
+114: DATA 'NCName',
+114: EPSILON
+110: CHOICE
+111: ONEOREMORE
+112: CHOICE
+113: REF 'text-index-entry-page-number',
+113: REF 'text-index-entry-text',
+113: REF 'text-index-entry-span',
+113: REF 'text-index-entry-tab-stop',
+111: EPSILON
+106: EPSILON
+102: REF 'text-index-body',
+99: REF 'text-object-index',
+100: ELEMENT "text:object-index",
+101: SEQUENCE
+102: REF 'sectionAttr',
+103: INTERLEAVE
+104: CHOICE
+105: ATTRIBUTE "text:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: ATTRIBUTE "text:name",
+105: REF 'string',
+106: DATA 'string',
+104: CHOICE
+105: ATTRIBUTE "text:protected",
+106: REF 'boolean',
+107: CHOICE
+108: VALUE 'true',
+108: VALUE 'false',
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "text:protection-key",
+106: REF 'string',
+107: DATA 'string',
+105: EPSILON
+102: REF 'text-object-index-source',
+103: ELEMENT "text:object-index-source",
+104: SEQUENCE
+105: REF 'text-object-index-source-attrs',
+106: INTERLEAVE
+107: REF 'text-index-scope-attr',
+108: CHOICE
+109: ATTRIBUTE "text:index-scope",
+110: CHOICE
+111: VALUE 'document',
+111: VALUE 'chapter',
+109: EPSILON
+107: REF 'text-relative-tab-stop-position-attr',
+108: CHOICE
+109: ATTRIBUTE "text:relative-tab-stop-position",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-spreadsheet-objects",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-math-objects",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-draw-objects",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-chart-objects",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-other-objects",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+105: CHOICE
+106: REF 'text-index-title-template',
+106: EPSILON
+105: CHOICE
+106: REF 'text-object-index-entry-template',
+107: ELEMENT "text:object-index-entry-template",
+108: REF 'text-illustration-index-entry-content',
+109: SEQUENCE
+110: REF 'text-illustration-index-entry-template-attrs',
+111: ATTRIBUTE "text:style-name",
+112: REF 'styleNameRef',
+113: CHOICE
+114: DATA 'NCName',
+114: EPSILON
+110: CHOICE
+111: ONEOREMORE
+112: CHOICE
+113: REF 'text-index-entry-page-number',
+113: REF 'text-index-entry-text',
+113: REF 'text-index-entry-span',
+113: REF 'text-index-entry-tab-stop',
+111: EPSILON
+106: EPSILON
+102: REF 'text-index-body',
+99: REF 'text-user-index',
+100: ELEMENT "text:user-index",
+101: SEQUENCE
+102: REF 'sectionAttr',
+103: INTERLEAVE
+104: CHOICE
+105: ATTRIBUTE "text:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: ATTRIBUTE "text:name",
+105: REF 'string',
+106: DATA 'string',
+104: CHOICE
+105: ATTRIBUTE "text:protected",
+106: REF 'boolean',
+107: CHOICE
+108: VALUE 'true',
+108: VALUE 'false',
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "text:protection-key",
+106: REF 'string',
+107: DATA 'string',
+105: EPSILON
+102: REF 'text-user-index-source',
+103: ELEMENT "text:user-index-source",
+104: SEQUENCE
+105: REF 'text-user-index-source-attr',
+106: INTERLEAVE
+107: SEQUENCE
+108: REF 'text-index-scope-attr',
+109: CHOICE
+110: ATTRIBUTE "text:index-scope",
+111: CHOICE
+112: VALUE 'document',
+112: VALUE 'chapter',
+110: EPSILON
+108: REF 'text-relative-tab-stop-position-attr',
+109: CHOICE
+110: ATTRIBUTE "text:relative-tab-stop-position",
+111: REF 'boolean',
+112: CHOICE
+113: VALUE 'true',
+113: VALUE 'false',
+110: EPSILON
+108: ATTRIBUTE "text:index-name",
+109: REF 'string',
+110: DATA 'string',
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "text:use-index-marks",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:use-graphics",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:use-tables",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:use-floating-frames",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:use-objects",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:copy-outline-levels",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+105: CHOICE
+106: REF 'text-index-title-template',
+106: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: REF 'text-user-index-entry-template',
+108: ELEMENT "text:user-index-entry-template",
+109: SEQUENCE
+110: REF 'text-user-index-entry-template-attrs',
+111: INTERLEAVE
+112: ATTRIBUTE "text:outline-level",
+113: REF 'positiveInteger',
+114: DATA 'positiveInteger',
+112: ATTRIBUTE "text:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+110: CHOICE
+111: ONEOREMORE
+112: CHOICE
+113: REF 'text-index-entry-chapter',
+113: REF 'text-index-entry-page-number',
+113: REF 'text-index-entry-text',
+113: REF 'text-index-entry-span',
+113: REF 'text-index-entry-tab-stop',
+111: EPSILON
+106: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: REF 'text-index-source-styles',
+106: EPSILON
+102: REF 'text-index-body',
+99: REF 'text-alphabetical-index',
+100: ELEMENT "text:alphabetical-index",
+101: SEQUENCE
+102: REF 'sectionAttr',
+103: INTERLEAVE
+104: CHOICE
+105: ATTRIBUTE "text:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: ATTRIBUTE "text:name",
+105: REF 'string',
+106: DATA 'string',
+104: CHOICE
+105: ATTRIBUTE "text:protected",
+106: REF 'boolean',
+107: CHOICE
+108: VALUE 'true',
+108: VALUE 'false',
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "text:protection-key",
+106: REF 'string',
+107: DATA 'string',
+105: EPSILON
+102: REF 'text-alphabetical-index-source',
+103: ELEMENT "text:alphabetical-index-source",
+104: SEQUENCE
+105: REF 'text-alphabetical-index-source-attrs',
+106: INTERLEAVE
+107: SEQUENCE
+108: REF 'text-index-scope-attr',
+109: CHOICE
+110: ATTRIBUTE "text:index-scope",
+111: CHOICE
+112: VALUE 'document',
+112: VALUE 'chapter',
+110: EPSILON
+108: REF 'text-relative-tab-stop-position-attr',
+109: CHOICE
+110: ATTRIBUTE "text:relative-tab-stop-position",
+111: REF 'boolean',
+112: CHOICE
+113: VALUE 'true',
+113: VALUE 'false',
+110: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:ignore-case",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:main-entry-style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:alphabetical-separators",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "text:combine-entries",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:combine-entries-with-dash",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:combine-entries-with-pp",
+110: REF 'boolean',
+111: CHOICE
+112: VALUE 'true',
+112: VALUE 'false',
+109: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:use-keys-as-entries",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:capitalize-entries",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:comma-separated",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "fo:language",
+109: REF 'languageCode',
+110: DATA 'token',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "fo:country",
+109: REF 'countryCode',
+110: DATA 'token',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "text:sort-algorithm",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+105: CHOICE
+106: REF 'text-index-title-template',
+106: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: REF 'text-alphabetical-index-entry-template',
+108: ELEMENT "text:alphabetical-index-entry-template",
+109: SEQUENCE
+110: REF 'text-alphabetical-index-entry-template-attrs',
+111: INTERLEAVE
+112: ATTRIBUTE "text:outline-level",
+113: CHOICE
+114: VALUE '1',
+114: VALUE '2',
+114: VALUE '3',
+114: VALUE 'separator',
+112: ATTRIBUTE "text:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+110: CHOICE
+111: ONEOREMORE
+112: CHOICE
+113: REF 'text-index-entry-chapter',
+113: REF 'text-index-entry-page-number',
+113: REF 'text-index-entry-text',
+113: REF 'text-index-entry-span',
+113: REF 'text-index-entry-tab-stop',
+111: EPSILON
+106: EPSILON
+102: REF 'text-index-body',
+99: REF 'text-bibliography',
+100: ELEMENT "text:bibliography",
+101: SEQUENCE
+102: REF 'sectionAttr',
+103: INTERLEAVE
+104: CHOICE
+105: ATTRIBUTE "text:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: ATTRIBUTE "text:name",
+105: REF 'string',
+106: DATA 'string',
+104: CHOICE
+105: ATTRIBUTE "text:protected",
+106: REF 'boolean',
+107: CHOICE
+108: VALUE 'true',
+108: VALUE 'false',
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "text:protection-key",
+106: REF 'string',
+107: DATA 'string',
+105: EPSILON
+102: REF 'text-bibliography-source',
+103: ELEMENT "text:bibliography-source",
+104: SEQUENCE
+105: CHOICE
+106: REF 'text-index-title-template',
+106: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: REF 'text-bibliography-entry-template',
+108: ELEMENT "text:bibliography-entry-template",
+109: SEQUENCE
+110: REF 'text-bibliography-entry-template-attrs',
+111: INTERLEAVE
+112: ATTRIBUTE "text:bibliography-type",
+113: REF 'text-bibliography-types',
+114: CHOICE
+115: VALUE 'article',
+115: VALUE 'book',
+115: VALUE 'booklet',
+115: VALUE 'conference',
+115: VALUE 'custom1',
+115: VALUE 'custom2',
+115: VALUE 'custom3',
+115: VALUE 'custom4',
+115: VALUE 'custom5',
+115: VALUE 'email',
+115: VALUE 'inbook',
+115: VALUE 'incollection',
+115: VALUE 'inproceedings',
+115: VALUE 'journal',
+115: VALUE 'manual',
+115: VALUE 'mastersthesis',
+115: VALUE 'misc',
+115: VALUE 'phdthesis',
+115: VALUE 'proceedings',
+115: VALUE 'techreport',
+115: VALUE 'unpublished',
+115: VALUE 'www',
+112: ATTRIBUTE "text:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+110: CHOICE
+111: ONEOREMORE
+112: CHOICE
+113: REF 'text-index-entry-span',
+113: REF 'text-index-entry-tab-stop',
+113: REF 'text-index-entry-bibliography',
+114: ELEMENT "text:index-entry-bibliography",
+115: REF 'text-index-entry-bibliography-attrs',
+116: INTERLEAVE
+117: CHOICE
+118: ATTRIBUTE "text:style-name",
+119: REF 'styleNameRef',
+120: CHOICE
+121: DATA 'NCName',
+121: EPSILON
+118: EPSILON
+117: ATTRIBUTE "text:bibliography-data-field",
+118: CHOICE
+119: VALUE 'address',
+119: VALUE 'annote',
+119: VALUE 'author',
+119: VALUE 'bibliography-type',
+119: VALUE 'booktitle',
+119: VALUE 'chapter',
+119: VALUE 'custom1',
+119: VALUE 'custom2',
+119: VALUE 'custom3',
+119: VALUE 'custom4',
+119: VALUE 'custom5',
+119: VALUE 'edition',
+119: VALUE 'editor',
+119: VALUE 'howpublished',
+119: VALUE 'identifier',
+119: VALUE 'institution',
+119: VALUE 'isbn',
+119: VALUE 'issn',
+119: VALUE 'journal',
+119: VALUE 'month',
+119: VALUE 'note',
+119: VALUE 'number',
+119: VALUE 'organizations',
+119: VALUE 'pages',
+119: VALUE 'publisher',
+119: VALUE 'report-type',
+119: VALUE 'school',
+119: VALUE 'series',
+119: VALUE 'title',
+119: VALUE 'url',
+119: VALUE 'volume',
+119: VALUE 'year',
+111: EPSILON
+106: EPSILON
+102: REF 'text-index-body',
+99: REF 'shape',
+100: CHOICE
+101: REF 'draw-rect',
+101: REF 'draw-line',
+101: REF 'draw-polyline',
+101: REF 'draw-polygon',
+101: REF 'draw-regular-polygon',
+101: REF 'draw-path',
+101: REF 'draw-circle',
+101: REF 'draw-ellipse',
+101: REF 'draw-g',
+101: REF 'draw-page-thumbnail',
+101: REF 'draw-frame',
+101: REF 'draw-measure',
+102: ELEMENT "draw:measure",
+103: SEQUENCE
+104: REF 'draw-measure-attlist',
+105: INTERLEAVE
+106: SEQUENCE
+107: ATTRIBUTE "svg:x1",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: ATTRIBUTE "svg:y1",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+106: SEQUENCE
+107: ATTRIBUTE "svg:x2",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: ATTRIBUTE "svg:y2",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+104: REF 'common-draw-shape-with-text-and-styles-attlist',
+105: SEQUENCE
+106: REF 'common-draw-shape-with-styles-attlist',
+107: SEQUENCE
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:id",
+111: REF 'ID',
+112: DATA 'ID',
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-draw-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:name",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-text-spreadsheet-shape-attlist',
+109: INTERLEAVE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "table:end-cell-address",
+113: REF 'cellAddress',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-x",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-y",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "table:table-background",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: REF 'common-text-anchor-attlist',
+111: INTERLEAVE
+112: CHOICE
+113: ATTRIBUTE "text:anchor-type",
+114: CHOICE
+115: VALUE 'page',
+115: VALUE 'frame',
+115: VALUE 'paragraph',
+115: VALUE 'char',
+115: VALUE 'as-char',
+113: EPSILON
+112: CHOICE
+113: ATTRIBUTE "text:anchor-page-number",
+114: REF 'positiveInteger',
+115: DATA 'positiveInteger',
+113: EPSILON
+106: REF 'common-draw-text-style-name-attlist',
+107: CHOICE
+108: ATTRIBUTE "draw:text-style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+104: REF 'common-draw-caption-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:caption-id",
+107: REF 'IDREF',
+108: DATA 'IDREF',
+106: EPSILON
+104: CHOICE
+105: REF 'svg-title',
+105: EPSILON
+104: CHOICE
+105: REF 'svg-desc',
+105: EPSILON
+104: CHOICE
+105: REF 'office-event-listeners',
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'draw-glue-point',
+105: EPSILON
+104: REF 'draw-text',
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-p',
+108: REF 'text-list',
+106: EPSILON
+101: REF 'draw-caption',
+102: ELEMENT "draw:caption",
+103: SEQUENCE
+104: REF 'draw-caption-attlist',
+105: INTERLEAVE
+106: CHOICE
+107: SEQUENCE
+108: ATTRIBUTE "draw:caption-point-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: ATTRIBUTE "draw:caption-point-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:corner-radius",
+108: REF 'nonNegativeLength',
+109: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-position-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:x",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:y",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-size-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:width",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:height",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-shape-with-text-and-styles-attlist',
+105: SEQUENCE
+106: REF 'common-draw-shape-with-styles-attlist',
+107: SEQUENCE
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:id",
+111: REF 'ID',
+112: DATA 'ID',
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-draw-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:name",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-text-spreadsheet-shape-attlist',
+109: INTERLEAVE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "table:end-cell-address",
+113: REF 'cellAddress',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-x",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-y",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "table:table-background",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: REF 'common-text-anchor-attlist',
+111: INTERLEAVE
+112: CHOICE
+113: ATTRIBUTE "text:anchor-type",
+114: CHOICE
+115: VALUE 'page',
+115: VALUE 'frame',
+115: VALUE 'paragraph',
+115: VALUE 'char',
+115: VALUE 'as-char',
+113: EPSILON
+112: CHOICE
+113: ATTRIBUTE "text:anchor-page-number",
+114: REF 'positiveInteger',
+115: DATA 'positiveInteger',
+113: EPSILON
+106: REF 'common-draw-text-style-name-attlist',
+107: CHOICE
+108: ATTRIBUTE "draw:text-style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+104: REF 'common-draw-caption-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:caption-id",
+107: REF 'IDREF',
+108: DATA 'IDREF',
+106: EPSILON
+104: CHOICE
+105: REF 'svg-title',
+105: EPSILON
+104: CHOICE
+105: REF 'svg-desc',
+105: EPSILON
+104: CHOICE
+105: REF 'office-event-listeners',
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'draw-glue-point',
+105: EPSILON
+104: REF 'draw-text',
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-p',
+108: REF 'text-list',
+106: EPSILON
+101: REF 'draw-connector',
+102: ELEMENT "draw:connector",
+103: SEQUENCE
+104: REF 'draw-connector-attlist',
+105: INTERLEAVE
+106: CHOICE
+107: ATTRIBUTE "draw:type",
+108: CHOICE
+109: VALUE 'standard',
+109: VALUE 'lines',
+109: VALUE 'line',
+109: VALUE 'curve',
+107: EPSILON
+106: CHOICE
+107: SEQUENCE
+108: ATTRIBUTE "svg:x1",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: ATTRIBUTE "svg:y1",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:start-shape",
+108: REF 'IDREF',
+109: DATA 'IDREF',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:start-glue-point",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+106: CHOICE
+107: SEQUENCE
+108: ATTRIBUTE "svg:x2",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: ATTRIBUTE "svg:y2",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:end-shape",
+108: REF 'IDREF',
+109: DATA 'IDREF',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:end-glue-point",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:line-skew",
+108: LIST
+109: SEQUENCE
+110: REF 'length',
+111: DATA 'string',
+110: CHOICE
+111: SEQUENCE
+112: REF 'length',
+113: DATA 'string',
+112: CHOICE
+113: REF 'length',
+114: DATA 'string',
+113: EPSILON
+111: EPSILON
+107: EPSILON
+104: REF 'common-draw-shape-with-text-and-styles-attlist',
+105: SEQUENCE
+106: REF 'common-draw-shape-with-styles-attlist',
+107: SEQUENCE
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:id",
+111: REF 'ID',
+112: DATA 'ID',
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-draw-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:name",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-text-spreadsheet-shape-attlist',
+109: INTERLEAVE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "table:end-cell-address",
+113: REF 'cellAddress',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-x",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-y",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "table:table-background",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: REF 'common-text-anchor-attlist',
+111: INTERLEAVE
+112: CHOICE
+113: ATTRIBUTE "text:anchor-type",
+114: CHOICE
+115: VALUE 'page',
+115: VALUE 'frame',
+115: VALUE 'paragraph',
+115: VALUE 'char',
+115: VALUE 'as-char',
+113: EPSILON
+112: CHOICE
+113: ATTRIBUTE "text:anchor-page-number",
+114: REF 'positiveInteger',
+115: DATA 'positiveInteger',
+113: EPSILON
+106: REF 'common-draw-text-style-name-attlist',
+107: CHOICE
+108: ATTRIBUTE "draw:text-style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+104: REF 'common-draw-caption-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:caption-id",
+107: REF 'IDREF',
+108: DATA 'IDREF',
+106: EPSILON
+104: CHOICE
+105: REF 'svg-title',
+105: EPSILON
+104: CHOICE
+105: REF 'svg-desc',
+105: EPSILON
+104: CHOICE
+105: REF 'office-event-listeners',
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'draw-glue-point',
+105: EPSILON
+104: REF 'draw-text',
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-p',
+108: REF 'text-list',
+106: EPSILON
+101: REF 'draw-control',
+102: ELEMENT "draw:control",
+103: SEQUENCE
+104: REF 'draw-control-attlist',
+105: ATTRIBUTE "draw:control",
+106: REF 'IDREF',
+107: DATA 'IDREF',
+104: REF 'common-draw-position-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:x",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:y",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-size-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:width",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:height",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-shape-with-text-and-styles-attlist',
+105: SEQUENCE
+106: REF 'common-draw-shape-with-styles-attlist',
+107: SEQUENCE
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:id",
+111: REF 'ID',
+112: DATA 'ID',
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-draw-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:name",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-text-spreadsheet-shape-attlist',
+109: INTERLEAVE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "table:end-cell-address",
+113: REF 'cellAddress',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-x",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-y",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "table:table-background",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: REF 'common-text-anchor-attlist',
+111: INTERLEAVE
+112: CHOICE
+113: ATTRIBUTE "text:anchor-type",
+114: CHOICE
+115: VALUE 'page',
+115: VALUE 'frame',
+115: VALUE 'paragraph',
+115: VALUE 'char',
+115: VALUE 'as-char',
+113: EPSILON
+112: CHOICE
+113: ATTRIBUTE "text:anchor-page-number",
+114: REF 'positiveInteger',
+115: DATA 'positiveInteger',
+113: EPSILON
+106: REF 'common-draw-text-style-name-attlist',
+107: CHOICE
+108: ATTRIBUTE "draw:text-style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+104: REF 'common-draw-caption-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:caption-id",
+107: REF 'IDREF',
+108: DATA 'IDREF',
+106: EPSILON
+104: CHOICE
+105: REF 'svg-title',
+105: EPSILON
+104: CHOICE
+105: REF 'svg-desc',
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'draw-glue-point',
+105: EPSILON
+101: REF 'dr3d-scene',
+102: ELEMENT "dr3d:scene",
+103: SEQUENCE
+104: REF 'dr3d-scene-attlist',
+105: INTERLEAVE
+106: SEQUENCE
+107: CHOICE
+108: ATTRIBUTE "dr3d:vrp",
+109: REF 'vector3D',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "dr3d:vpn",
+109: REF 'vector3D',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "dr3d:vup",
+109: REF 'vector3D',
+110: DATA 'string',
+108: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:projection",
+108: CHOICE
+109: VALUE 'parallel',
+109: VALUE 'perspective',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:distance",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:focal-length",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:shadow-slant",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:shade-mode",
+108: CHOICE
+109: VALUE 'flat',
+109: VALUE 'phong',
+109: VALUE 'gouraud',
+109: VALUE 'draft',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:ambient-color",
+108: REF 'color',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "dr3d:lighting-mode",
+108: REF 'boolean',
+109: CHOICE
+110: VALUE 'true',
+110: VALUE 'false',
+107: EPSILON
+104: REF 'common-draw-position-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:x",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:y",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-size-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:width",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:height",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-style-name-attlist',
+105: CHOICE
+106: SEQUENCE
+107: CHOICE
+108: ATTRIBUTE "draw:style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:class-names",
+109: REF 'styleNameRefs',
+110: LIST
+111: CHOICE
+112: ONEOREMORE
+113: DATA 'NCName',
+112: EPSILON
+108: EPSILON
+106: SEQUENCE
+107: CHOICE
+108: ATTRIBUTE "presentation:style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "presentation:class-names",
+109: REF 'styleNameRefs',
+110: LIST
+111: CHOICE
+112: ONEOREMORE
+113: DATA 'NCName',
+112: EPSILON
+108: EPSILON
+104: REF 'common-draw-z-index-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:z-index",
+107: REF 'nonNegativeInteger',
+108: DATA 'nonNegativeInteger',
+106: EPSILON
+104: REF 'common-draw-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:id",
+107: REF 'ID',
+108: DATA 'ID',
+106: EPSILON
+104: REF 'common-draw-layer-name-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:layer",
+107: DATA 'string',
+106: EPSILON
+104: REF 'common-text-spreadsheet-shape-attlist',
+105: INTERLEAVE
+106: SEQUENCE
+107: CHOICE
+108: ATTRIBUTE "table:end-cell-address",
+109: REF 'cellAddress',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+106: CHOICE
+107: ATTRIBUTE "table:table-background",
+108: REF 'boolean',
+109: CHOICE
+110: VALUE 'true',
+110: VALUE 'false',
+107: EPSILON
+106: REF 'common-text-anchor-attlist',
+107: INTERLEAVE
+108: CHOICE
+109: ATTRIBUTE "text:anchor-type",
+110: CHOICE
+111: VALUE 'page',
+111: VALUE 'frame',
+111: VALUE 'paragraph',
+111: VALUE 'char',
+111: VALUE 'as-char',
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "text:anchor-page-number",
+110: REF 'positiveInteger',
+111: DATA 'positiveInteger',
+109: EPSILON
+104: REF 'common-dr3d-transform-attlist',
+105: CHOICE
+106: ATTRIBUTE "dr3d:transform",
+107: STRING
+106: EPSILON
+104: REF 'common-draw-caption-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:caption-id",
+107: REF 'IDREF',
+108: DATA 'IDREF',
+106: EPSILON
+104: CHOICE
+105: REF 'svg-title',
+105: EPSILON
+104: CHOICE
+105: REF 'svg-desc',
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'dr3d-light',
+107: ELEMENT "dr3d:light",
+108: REF 'dr3d-light-attlist',
+109: INTERLEAVE
+110: CHOICE
+111: ATTRIBUTE "dr3d:diffuse-color",
+112: REF 'color',
+113: DATA 'string',
+111: EPSILON
+110: ATTRIBUTE "dr3d:direction",
+111: REF 'vector3D',
+112: DATA 'string',
+110: CHOICE
+111: ATTRIBUTE "dr3d:enabled",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "dr3d:specular",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'shapes3d',
+107: CHOICE
+108: REF 'dr3d-scene',
+108: REF 'dr3d-extrude',
+109: ELEMENT "dr3d:extrude",
+110: SEQUENCE
+111: REF 'common-draw-path-data-attlist',
+112: ATTRIBUTE "svg:d",
+113: REF 'pathData',
+114: DATA 'string',
+111: REF 'common-draw-viewbox-attlist',
+112: ATTRIBUTE "svg:viewBox",
+113: LIST
+114: SEQUENCE
+115: REF 'integer',
+116: DATA 'integer',
+115: REF 'integer',
+116: DATA 'integer',
+115: REF 'integer',
+116: DATA 'integer',
+115: REF 'integer',
+116: DATA 'integer',
+111: REF 'common-draw-id-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:id",
+114: REF 'ID',
+115: DATA 'ID',
+113: EPSILON
+111: REF 'common-draw-z-index-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:z-index",
+114: REF 'nonNegativeInteger',
+115: DATA 'nonNegativeInteger',
+113: EPSILON
+111: REF 'common-draw-layer-name-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:layer",
+114: DATA 'string',
+113: EPSILON
+111: REF 'common-draw-style-name-attlist',
+112: CHOICE
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "draw:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "presentation:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "presentation:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+111: REF 'common-dr3d-transform-attlist',
+112: CHOICE
+113: ATTRIBUTE "dr3d:transform",
+114: STRING
+113: EPSILON
+108: REF 'dr3d-sphere',
+109: ELEMENT "dr3d:sphere",
+110: SEQUENCE
+111: REF 'dr3d-sphere-attlist',
+112: INTERLEAVE
+113: CHOICE
+114: ATTRIBUTE "dr3d:center",
+115: REF 'vector3D',
+116: DATA 'string',
+114: EPSILON
+113: CHOICE
+114: ATTRIBUTE "dr3d:size",
+115: REF 'vector3D',
+116: DATA 'string',
+114: EPSILON
+111: REF 'common-draw-z-index-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:z-index",
+114: REF 'nonNegativeInteger',
+115: DATA 'nonNegativeInteger',
+113: EPSILON
+111: REF 'common-draw-id-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:id",
+114: REF 'ID',
+115: DATA 'ID',
+113: EPSILON
+111: REF 'common-draw-layer-name-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:layer",
+114: DATA 'string',
+113: EPSILON
+111: REF 'common-draw-style-name-attlist',
+112: CHOICE
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "draw:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "presentation:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "presentation:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+111: REF 'common-dr3d-transform-attlist',
+112: CHOICE
+113: ATTRIBUTE "dr3d:transform",
+114: STRING
+113: EPSILON
+108: REF 'dr3d-rotate',
+109: ELEMENT "dr3d:rotate",
+110: SEQUENCE
+111: REF 'common-draw-viewbox-attlist',
+112: ATTRIBUTE "svg:viewBox",
+113: LIST
+114: SEQUENCE
+115: REF 'integer',
+116: DATA 'integer',
+115: REF 'integer',
+116: DATA 'integer',
+115: REF 'integer',
+116: DATA 'integer',
+115: REF 'integer',
+116: DATA 'integer',
+111: REF 'common-draw-path-data-attlist',
+112: ATTRIBUTE "svg:d",
+113: REF 'pathData',
+114: DATA 'string',
+111: REF 'common-draw-z-index-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:z-index",
+114: REF 'nonNegativeInteger',
+115: DATA 'nonNegativeInteger',
+113: EPSILON
+111: REF 'common-draw-id-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:id",
+114: REF 'ID',
+115: DATA 'ID',
+113: EPSILON
+111: REF 'common-draw-layer-name-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:layer",
+114: DATA 'string',
+113: EPSILON
+111: REF 'common-draw-style-name-attlist',
+112: CHOICE
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "draw:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "presentation:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "presentation:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+111: REF 'common-dr3d-transform-attlist',
+112: CHOICE
+113: ATTRIBUTE "dr3d:transform",
+114: STRING
+113: EPSILON
+108: REF 'dr3d-cube',
+109: ELEMENT "dr3d:cube",
+110: SEQUENCE
+111: REF 'dr3d-cube-attlist',
+112: SEQUENCE
+113: CHOICE
+114: ATTRIBUTE "dr3d:min-edge",
+115: REF 'vector3D',
+116: DATA 'string',
+114: EPSILON
+113: CHOICE
+114: ATTRIBUTE "dr3d:max-edge",
+115: REF 'vector3D',
+116: DATA 'string',
+114: EPSILON
+111: REF 'common-draw-z-index-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:z-index",
+114: REF 'nonNegativeInteger',
+115: DATA 'nonNegativeInteger',
+113: EPSILON
+111: REF 'common-draw-id-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:id",
+114: REF 'ID',
+115: DATA 'ID',
+113: EPSILON
+111: REF 'common-draw-layer-name-attlist',
+112: CHOICE
+113: ATTRIBUTE "draw:layer",
+114: DATA 'string',
+113: EPSILON
+111: REF 'common-draw-style-name-attlist',
+112: CHOICE
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "draw:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+113: SEQUENCE
+114: CHOICE
+115: ATTRIBUTE "presentation:style-name",
+116: REF 'styleNameRef',
+117: CHOICE
+118: DATA 'NCName',
+118: EPSILON
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "presentation:class-names",
+116: REF 'styleNameRefs',
+117: LIST
+118: CHOICE
+119: ONEOREMORE
+120: DATA 'NCName',
+119: EPSILON
+115: EPSILON
+111: REF 'common-dr3d-transform-attlist',
+112: CHOICE
+113: ATTRIBUTE "dr3d:transform",
+114: STRING
+113: EPSILON
+105: EPSILON
+101: REF 'draw-custom-shape',
+102: ELEMENT "draw:custom-shape",
+103: SEQUENCE
+104: REF 'draw-custom-shape-attlist',
+105: INTERLEAVE
+106: CHOICE
+107: ATTRIBUTE "draw:engine",
+108: REF 'namespacedToken',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "draw:data",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-position-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:x",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:y",
+108: REF 'coordinate',
+109: REF 'length',
+110: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-size-attlist',
+105: SEQUENCE
+106: CHOICE
+107: ATTRIBUTE "svg:width",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+106: CHOICE
+107: ATTRIBUTE "svg:height",
+108: REF 'length',
+109: DATA 'string',
+107: EPSILON
+104: REF 'common-draw-shape-with-text-and-styles-attlist',
+105: SEQUENCE
+106: REF 'common-draw-shape-with-styles-attlist',
+107: SEQUENCE
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:id",
+111: REF 'ID',
+112: DATA 'ID',
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-draw-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:name",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-text-spreadsheet-shape-attlist',
+109: INTERLEAVE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "table:end-cell-address",
+113: REF 'cellAddress',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-x",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "table:end-y",
+113: REF 'coordinate',
+114: REF 'length',
+115: DATA 'string',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "table:table-background",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: REF 'common-text-anchor-attlist',
+111: INTERLEAVE
+112: CHOICE
+113: ATTRIBUTE "text:anchor-type",
+114: CHOICE
+115: VALUE 'page',
+115: VALUE 'frame',
+115: VALUE 'paragraph',
+115: VALUE 'char',
+115: VALUE 'as-char',
+113: EPSILON
+112: CHOICE
+113: ATTRIBUTE "text:anchor-page-number",
+114: REF 'positiveInteger',
+115: DATA 'positiveInteger',
+113: EPSILON
+106: REF 'common-draw-text-style-name-attlist',
+107: CHOICE
+108: ATTRIBUTE "draw:text-style-name",
+109: REF 'styleNameRef',
+110: CHOICE
+111: DATA 'NCName',
+111: EPSILON
+108: EPSILON
+104: REF 'common-draw-caption-id-attlist',
+105: CHOICE
+106: ATTRIBUTE "draw:caption-id",
+107: REF 'IDREF',
+108: DATA 'IDREF',
+106: EPSILON
+104: CHOICE
+105: REF 'svg-title',
+105: EPSILON
+104: CHOICE
+105: REF 'svg-desc',
+105: EPSILON
+104: CHOICE
+105: REF 'office-event-listeners',
+105: EPSILON
+104: CHOICE
+105: ONEOREMORE
+106: REF 'draw-glue-point',
+105: EPSILON
+104: REF 'draw-text',
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-p',
+108: REF 'text-list',
+106: EPSILON
+104: CHOICE
+105: REF 'draw-enhanced-geometry',
+106: ELEMENT "draw:enhanced-geometry",
+107: SEQUENCE
+108: REF 'draw-enhanced-geometry-attlist',
+109: INTERLEAVE
+110: CHOICE
+111: ATTRIBUTE "draw:type",
+112: REF 'custom-shape-type',
+113: CHOICE
+114: VALUE 'non-primitive',
+114: REF 'string',
+115: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "svg:viewBox",
+112: LIST
+113: SEQUENCE
+114: REF 'integer',
+115: DATA 'integer',
+114: REF 'integer',
+115: DATA 'integer',
+114: REF 'integer',
+115: DATA 'integer',
+114: REF 'integer',
+115: DATA 'integer',
+111: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:mirror-vertical",
+113: REF 'boolean',
+114: CHOICE
+115: VALUE 'true',
+115: VALUE 'false',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:mirror-horizontal",
+113: REF 'boolean',
+114: CHOICE
+115: VALUE 'true',
+115: VALUE 'false',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-rotate-angle",
+112: REF 'double',
+113: DATA 'double',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-allowed",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-path-allowed",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:concentric-gradient-fill-allowed",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-brightness",
+112: REF 'percent',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-depth",
+112: LIST
+113: SEQUENCE
+114: REF 'length',
+115: DATA 'string',
+114: REF 'double',
+115: DATA 'double',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-diffusion",
+112: REF 'percent',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-number-of-line-segments",
+112: REF 'integer',
+113: DATA 'integer',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-light-face",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-first-light-harsh",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-second-light-harsh",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-first-light-level",
+112: REF 'percent',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-second-light-level",
+112: REF 'percent',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-first-light-direction",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-second-light-direction",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-metal",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "dr3d:shade-mode",
+112: CHOICE
+113: VALUE 'flat',
+113: VALUE 'phong',
+113: VALUE 'gouraud',
+113: VALUE 'draft',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-rotation-angle",
+112: LIST
+113: SEQUENCE
+114: REF 'double',
+115: DATA 'double',
+114: REF 'double',
+115: DATA 'double',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-rotation-center",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-shininess",
+112: REF 'percent',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-skew",
+112: LIST
+113: SEQUENCE
+114: REF 'double',
+115: DATA 'double',
+114: REF 'double',
+115: DATA 'double',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-specularity",
+112: REF 'percent',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "dr3d:projection",
+112: CHOICE
+113: VALUE 'parallel',
+113: VALUE 'perspective',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-viewpoint",
+112: REF 'point3D',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-origin",
+112: LIST
+113: SEQUENCE
+114: REF 'double',
+115: DATA 'double',
+114: REF 'double',
+115: DATA 'double',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:extrusion-color",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:enhanced-path",
+112: REF 'string',
+113: DATA 'string',
+111: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:path-stretchpoint-x",
+113: REF 'double',
+114: DATA 'double',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:path-stretchpoint-y",
+113: REF 'double',
+114: DATA 'double',
+112: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-areas",
+112: REF 'string',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:glue-points",
+112: REF 'string',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:glue-point-type",
+112: CHOICE
+113: VALUE 'none',
+113: VALUE 'segments',
+113: VALUE 'rectangle',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:glue-point-leaving-directions",
+112: STRING
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-path",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-path-mode",
+112: CHOICE
+113: VALUE 'normal',
+113: VALUE 'path',
+113: VALUE 'shape',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-path-scale",
+112: CHOICE
+113: VALUE 'path',
+113: VALUE 'shape',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:text-path-same-letter-heights",
+112: REF 'boolean',
+113: CHOICE
+114: VALUE 'true',
+114: VALUE 'false',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "draw:modifiers",
+112: REF 'string',
+113: DATA 'string',
+111: EPSILON
+108: CHOICE
+109: ONEOREMORE
+110: REF 'draw-equation',
+111: ELEMENT "draw:equation",
+112: REF 'draw-equation-attlist',
+113: INTERLEAVE
+114: CHOICE
+115: ATTRIBUTE "draw:name",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:formula",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+109: EPSILON
+108: CHOICE
+109: ONEOREMORE
+110: REF 'draw-handle',
+111: ELEMENT "draw:handle",
+112: REF 'draw-handle-attlist',
+113: INTERLEAVE
+114: CHOICE
+115: ATTRIBUTE "draw:handle-mirror-vertical",
+116: REF 'boolean',
+117: CHOICE
+118: VALUE 'true',
+118: VALUE 'false',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-mirror-horizontal",
+116: REF 'boolean',
+117: CHOICE
+118: VALUE 'true',
+118: VALUE 'false',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-switched",
+116: REF 'boolean',
+117: CHOICE
+118: VALUE 'true',
+118: VALUE 'false',
+115: EPSILON
+114: ATTRIBUTE "draw:handle-position",
+115: REF 'string',
+116: DATA 'string',
+114: CHOICE
+115: ATTRIBUTE "draw:handle-range-x-minimum",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-range-x-maximum",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-range-y-minimum",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-range-y-maximum",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-polar",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-radius-range-minimum",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+114: CHOICE
+115: ATTRIBUTE "draw:handle-radius-range-maximum",
+116: REF 'string',
+117: DATA 'string',
+115: EPSILON
+109: EPSILON
+105: EPSILON
+99: REF 'change-marks',
+100: CHOICE
+101: ELEMENT "text:change",
+102: REF 'change-mark-attr',
+103: ATTRIBUTE "text:change-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+101: ELEMENT "text:change-start",
+102: REF 'change-mark-attr',
+103: ATTRIBUTE "text:change-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+101: ELEMENT "text:change-end",
+102: REF 'change-mark-attr',
+103: ATTRIBUTE "text:change-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+97: REF 'text-index-title',
+98: ELEMENT "text:index-title",
+99: SEQUENCE
+100: REF 'sectionAttr',
+101: INTERLEAVE
+102: CHOICE
+103: ATTRIBUTE "text:style-name",
+104: REF 'styleNameRef',
+105: CHOICE
+106: DATA 'NCName',
+106: EPSILON
+103: EPSILON
+102: ATTRIBUTE "text:name",
+103: REF 'string',
+104: DATA 'string',
+102: CHOICE
+103: ATTRIBUTE "text:protected",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:protection-key",
+104: REF 'string',
+105: DATA 'string',
+103: EPSILON
+100: CHOICE
+101: ONEOREMORE
+102: REF 'index-content-main',
+103: CHOICE
+104: REF 'text-content',
+105: CHOICE
+106: REF 'text-h',
+106: REF 'text-p',
+106: REF 'text-list',
+106: REF 'text-numbered-paragraph',
+106: REF 'table-table',
+106: REF 'draw-a',
+106: REF 'text-section',
+106: REF 'text-soft-page-break',
+106: REF 'text-table-of-content',
+106: REF 'text-illustration-index',
+106: REF 'text-table-index',
+106: REF 'text-object-index',
+106: REF 'text-user-index',
+106: REF 'text-alphabetical-index',
+106: REF 'text-bibliography',
+106: REF 'shape',
+107: CHOICE
+108: REF 'draw-rect',
+108: REF 'draw-line',
+108: REF 'draw-polyline',
+108: REF 'draw-polygon',
+108: REF 'draw-regular-polygon',
+108: REF 'draw-path',
+108: REF 'draw-circle',
+108: REF 'draw-ellipse',
+108: REF 'draw-g',
+108: REF 'draw-page-thumbnail',
+108: REF 'draw-frame',
+108: REF 'draw-measure',
+108: REF 'draw-caption',
+108: REF 'draw-connector',
+108: REF 'draw-control',
+108: REF 'dr3d-scene',
+108: REF 'draw-custom-shape',
+106: REF 'change-marks',
+107: CHOICE
+104: REF 'text-index-title',
+101: EPSILON
+94: EPSILON
+88: REF 'text-illustration-index',
+88: REF 'text-table-index',
+88: REF 'text-object-index',
+88: REF 'text-user-index',
+88: REF 'text-alphabetical-index',
+88: REF 'text-bibliography',
+88: REF 'shape',
+89: CHOICE
+90: REF 'draw-rect',
+90: REF 'draw-line',
+90: REF 'draw-polyline',
+90: REF 'draw-polygon',
+90: REF 'draw-regular-polygon',
+90: REF 'draw-path',
+90: REF 'draw-circle',
+90: REF 'draw-ellipse',
+90: REF 'draw-g',
+90: REF 'draw-page-thumbnail',
+90: REF 'draw-frame',
+90: REF 'draw-measure',
+90: REF 'draw-caption',
+90: REF 'draw-connector',
+90: REF 'draw-control',
+90: REF 'dr3d-scene',
+90: REF 'draw-custom-shape',
+88: REF 'change-marks',
+89: CHOICE
+85: EPSILON
+81: REF 'text-soft-page-break',
+81: REF 'text-table-of-content',
+81: REF 'text-illustration-index',
+81: REF 'text-table-index',
+81: REF 'text-object-index',
+81: REF 'text-user-index',
+81: REF 'text-alphabetical-index',
+81: REF 'text-bibliography',
+81: REF 'shape',
+82: CHOICE
+83: REF 'draw-rect',
+83: REF 'draw-line',
+83: REF 'draw-polyline',
+83: REF 'draw-polygon',
+83: REF 'draw-regular-polygon',
+83: REF 'draw-path',
+83: REF 'draw-circle',
+83: REF 'draw-ellipse',
+83: REF 'draw-g',
+83: REF 'draw-page-thumbnail',
+83: REF 'draw-frame',
+83: REF 'draw-measure',
+83: REF 'draw-caption',
+83: REF 'draw-connector',
+83: REF 'draw-control',
+83: REF 'dr3d-scene',
+83: REF 'draw-custom-shape',
+81: REF 'change-marks',
+82: CHOICE
+78: EPSILON
+74: REF 'draw-image',
+75: ELEMENT "draw:image",
+76: SEQUENCE
+77: REF 'draw-image-attlist',
+78: CHOICE
+79: ATTRIBUTE "draw:filter-name",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: CHOICE
+78: REF 'common-draw-data-attlist',
+79: SEQUENCE
+80: ATTRIBUTE "xlink:href",
+81: REF 'anyURI',
+82: DATA 'anyURI',
+80: CHOICE
+81: ATTRIBUTE "xlink:type",
+82: VALUE 'simple',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:show",
+82: VALUE 'embed',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:actuate",
+82: VALUE 'onLoad',
+81: EPSILON
+78: REF 'office-binary-data',
+77: REF 'draw-text',
+78: CHOICE
+79: ONEOREMORE
+80: CHOICE
+81: REF 'text-p',
+81: REF 'text-list',
+79: EPSILON
+74: REF 'draw-object',
+75: ELEMENT "draw:object",
+76: SEQUENCE
+77: REF 'draw-object-attlist',
+78: CHOICE
+79: ATTRIBUTE "draw:notify-on-update-of-ranges",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: CHOICE
+78: REF 'common-draw-data-attlist',
+79: SEQUENCE
+80: ATTRIBUTE "xlink:href",
+81: REF 'anyURI',
+82: DATA 'anyURI',
+80: CHOICE
+81: ATTRIBUTE "xlink:type",
+82: VALUE 'simple',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:show",
+82: VALUE 'embed',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:actuate",
+82: VALUE 'onLoad',
+81: EPSILON
+78: REF 'office-document',
+78: REF 'math-math',
+79: ELEMENT "math:math",
+80: REF 'mathMarkup',
+81: ONEOREMORE
+82: CHOICE
+83: ATTRIBUTE "*",
+84: STRING
+83: STRING
+83: ELEMENT "*",
+84: REF 'mathMarkup',
+85: ONEOREMORE
+86: CHOICE
+87: ATTRIBUTE "*",
+88: STRING
+87: STRING
+74: REF 'draw-object-ole',
+75: ELEMENT "draw:object-ole",
+76: SEQUENCE
+77: REF 'draw-object-ole-attlist',
+78: CHOICE
+79: ATTRIBUTE "draw:class-id",
+80: STRING
+79: EPSILON
+77: CHOICE
+78: REF 'common-draw-data-attlist',
+79: SEQUENCE
+80: ATTRIBUTE "xlink:href",
+81: REF 'anyURI',
+82: DATA 'anyURI',
+80: CHOICE
+81: ATTRIBUTE "xlink:type",
+82: VALUE 'simple',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:show",
+82: VALUE 'embed',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:actuate",
+82: VALUE 'onLoad',
+81: EPSILON
+78: REF 'office-binary-data',
+74: REF 'draw-applet',
+75: ELEMENT "draw:applet",
+76: SEQUENCE
+77: REF 'draw-applet-attlist',
+78: INTERLEAVE
+79: CHOICE
+80: ATTRIBUTE "draw:code",
+81: STRING
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "draw:object",
+81: STRING
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "draw:archive",
+81: STRING
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "draw:may-script",
+81: REF 'boolean',
+82: CHOICE
+83: VALUE 'true',
+83: VALUE 'false',
+80: EPSILON
+77: CHOICE
+78: REF 'common-draw-data-attlist',
+79: SEQUENCE
+80: ATTRIBUTE "xlink:href",
+81: REF 'anyURI',
+82: DATA 'anyURI',
+80: CHOICE
+81: ATTRIBUTE "xlink:type",
+82: VALUE 'simple',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:show",
+82: VALUE 'embed',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "xlink:actuate",
+82: VALUE 'onLoad',
+81: EPSILON
+78: EPSILON
+77: CHOICE
+78: ONEOREMORE
+79: REF 'draw-param',
+80: ELEMENT "draw:param",
+81: REF 'draw-param-attlist',
+82: INTERLEAVE
+83: CHOICE
+84: ATTRIBUTE "draw:name",
+85: STRING
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "draw:value",
+85: STRING
+84: EPSILON
+78: EPSILON
+74: REF 'draw-floating-frame',
+75: ELEMENT "draw:floating-frame",
+76: SEQUENCE
+77: REF 'draw-floating-frame-attlist',
+78: CHOICE
+79: ATTRIBUTE "draw:frame-name",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: REF 'common-draw-data-attlist',
+78: SEQUENCE
+79: ATTRIBUTE "xlink:href",
+80: REF 'anyURI',
+81: DATA 'anyURI',
+79: CHOICE
+80: ATTRIBUTE "xlink:type",
+81: VALUE 'simple',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:show",
+81: VALUE 'embed',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:actuate",
+81: VALUE 'onLoad',
+80: EPSILON
+74: REF 'draw-plugin',
+75: ELEMENT "draw:plugin",
+76: SEQUENCE
+77: REF 'draw-plugin-attlist',
+78: CHOICE
+79: ATTRIBUTE "draw:mime-type",
+80: STRING
+79: EPSILON
+77: REF 'common-draw-data-attlist',
+78: SEQUENCE
+79: ATTRIBUTE "xlink:href",
+80: REF 'anyURI',
+81: DATA 'anyURI',
+79: CHOICE
+80: ATTRIBUTE "xlink:type",
+81: VALUE 'simple',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:show",
+81: VALUE 'embed',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:actuate",
+81: VALUE 'onLoad',
+80: EPSILON
+77: CHOICE
+78: ONEOREMORE
+79: REF 'draw-param',
+78: EPSILON
+72: EPSILON
+71: CHOICE
+72: REF 'office-event-listeners',
+72: EPSILON
+71: CHOICE
+72: ONEOREMORE
+73: REF 'draw-glue-point',
+72: EPSILON
+71: CHOICE
+72: REF 'draw-image-map',
+73: ELEMENT "draw:image-map",
+74: CHOICE
+75: ONEOREMORE
+76: CHOICE
+77: REF 'draw-area-rectangle',
+78: ELEMENT "draw:area-rectangle",
+79: SEQUENCE
+80: REF 'common-draw-area-attlist',
+81: INTERLEAVE
+82: SEQUENCE
+83: CHOICE
+84: ATTRIBUTE "xlink:href",
+85: REF 'anyURI',
+86: DATA 'anyURI',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "xlink:type",
+85: VALUE 'simple',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "office:target-frame-name",
+85: REF 'targetFrameName',
+86: CHOICE
+87: VALUE '_self',
+87: VALUE '_blank',
+87: VALUE '_parent',
+87: VALUE '_top',
+87: REF 'string',
+88: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "xlink:show",
+85: CHOICE
+86: VALUE 'new',
+86: VALUE 'replace',
+84: EPSILON
+82: CHOICE
+83: ATTRIBUTE "office:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "draw:nohref",
+84: VALUE 'nohref',
+83: EPSILON
+80: ATTRIBUTE "svg:x",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: ATTRIBUTE "svg:y",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: ATTRIBUTE "svg:width",
+81: REF 'length',
+82: DATA 'string',
+80: ATTRIBUTE "svg:height",
+81: REF 'length',
+82: DATA 'string',
+80: CHOICE
+81: REF 'svg-title',
+81: EPSILON
+80: CHOICE
+81: REF 'svg-desc',
+81: EPSILON
+80: CHOICE
+81: REF 'office-event-listeners',
+81: EPSILON
+77: REF 'draw-area-circle',
+78: ELEMENT "draw:area-circle",
+79: SEQUENCE
+80: REF 'common-draw-area-attlist',
+81: INTERLEAVE
+82: SEQUENCE
+83: CHOICE
+84: ATTRIBUTE "xlink:href",
+85: REF 'anyURI',
+86: DATA 'anyURI',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "xlink:type",
+85: VALUE 'simple',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "office:target-frame-name",
+85: REF 'targetFrameName',
+86: CHOICE
+87: VALUE '_self',
+87: VALUE '_blank',
+87: VALUE '_parent',
+87: VALUE '_top',
+87: REF 'string',
+88: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "xlink:show",
+85: CHOICE
+86: VALUE 'new',
+86: VALUE 'replace',
+84: EPSILON
+82: CHOICE
+83: ATTRIBUTE "office:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "draw:nohref",
+84: VALUE 'nohref',
+83: EPSILON
+80: ATTRIBUTE "svg:cx",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: ATTRIBUTE "svg:cy",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: ATTRIBUTE "svg:r",
+81: REF 'length',
+82: DATA 'string',
+80: CHOICE
+81: REF 'svg-title',
+81: EPSILON
+80: CHOICE
+81: REF 'svg-desc',
+81: EPSILON
+80: CHOICE
+81: REF 'office-event-listeners',
+81: EPSILON
+77: REF 'draw-area-polygon',
+78: ELEMENT "draw:area-polygon",
+79: SEQUENCE
+80: REF 'common-draw-area-attlist',
+81: INTERLEAVE
+82: SEQUENCE
+83: CHOICE
+84: ATTRIBUTE "xlink:href",
+85: REF 'anyURI',
+86: DATA 'anyURI',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "xlink:type",
+85: VALUE 'simple',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "office:target-frame-name",
+85: REF 'targetFrameName',
+86: CHOICE
+87: VALUE '_self',
+87: VALUE '_blank',
+87: VALUE '_parent',
+87: VALUE '_top',
+87: REF 'string',
+88: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "xlink:show",
+85: CHOICE
+86: VALUE 'new',
+86: VALUE 'replace',
+84: EPSILON
+82: CHOICE
+83: ATTRIBUTE "office:name",
+84: REF 'string',
+85: DATA 'string',
+83: EPSILON
+82: CHOICE
+83: ATTRIBUTE "draw:nohref",
+84: VALUE 'nohref',
+83: EPSILON
+80: ATTRIBUTE "svg:x",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: ATTRIBUTE "svg:y",
+81: REF 'coordinate',
+82: REF 'length',
+83: DATA 'string',
+80: ATTRIBUTE "svg:width",
+81: REF 'length',
+82: DATA 'string',
+80: ATTRIBUTE "svg:height",
+81: REF 'length',
+82: DATA 'string',
+80: REF 'common-draw-viewbox-attlist',
+81: ATTRIBUTE "svg:viewBox",
+82: LIST
+83: SEQUENCE
+84: REF 'integer',
+85: DATA 'integer',
+84: REF 'integer',
+85: DATA 'integer',
+84: REF 'integer',
+85: DATA 'integer',
+84: REF 'integer',
+85: DATA 'integer',
+80: REF 'common-draw-points-attlist',
+81: ATTRIBUTE "draw:points",
+82: REF 'points',
+83: DATA 'string',
+80: CHOICE
+81: REF 'svg-title',
+81: EPSILON
+80: CHOICE
+81: REF 'svg-desc',
+81: EPSILON
+80: CHOICE
+81: REF 'office-event-listeners',
+81: EPSILON
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: REF 'svg-title',
+72: EPSILON
+71: CHOICE
+72: REF 'svg-desc',
+72: EPSILON
+71: CHOICE
+72: REF 'draw-contour-polygon',
+73: ELEMENT "draw:contour-polygon",
+74: SEQUENCE
+75: REF 'common-contour-attlist',
+76: ATTRIBUTE "draw:recreate-on-edit",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+75: REF 'common-draw-size-attlist',
+76: SEQUENCE
+77: CHOICE
+78: ATTRIBUTE "svg:width",
+79: REF 'length',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "svg:height",
+79: REF 'length',
+80: DATA 'string',
+78: EPSILON
+75: REF 'common-draw-viewbox-attlist',
+76: ATTRIBUTE "svg:viewBox",
+77: LIST
+78: SEQUENCE
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+75: REF 'common-draw-points-attlist',
+76: ATTRIBUTE "draw:points",
+77: REF 'points',
+78: DATA 'string',
+72: REF 'draw-contour-path',
+73: ELEMENT "draw:contour-path",
+74: SEQUENCE
+75: REF 'common-contour-attlist',
+76: ATTRIBUTE "draw:recreate-on-edit",
+77: REF 'boolean',
+78: CHOICE
+79: VALUE 'true',
+79: VALUE 'false',
+75: REF 'common-draw-size-attlist',
+76: SEQUENCE
+77: CHOICE
+78: ATTRIBUTE "svg:width",
+79: REF 'length',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "svg:height",
+79: REF 'length',
+80: DATA 'string',
+78: EPSILON
+75: REF 'common-draw-viewbox-attlist',
+76: ATTRIBUTE "svg:viewBox",
+77: LIST
+78: SEQUENCE
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+75: REF 'common-draw-path-data-attlist',
+76: ATTRIBUTE "svg:d",
+77: REF 'pathData',
+78: DATA 'string',
+72: EPSILON
+68: REF 'draw-measure',
+68: REF 'draw-caption',
+68: REF 'draw-connector',
+68: REF 'draw-control',
+68: REF 'dr3d-scene',
+68: REF 'draw-custom-shape',
+65: EPSILON
+61: REF 'draw-page-thumbnail',
+61: REF 'draw-frame',
+61: REF 'draw-measure',
+61: REF 'draw-caption',
+61: REF 'draw-connector',
+61: REF 'draw-control',
+61: REF 'dr3d-scene',
+61: REF 'draw-custom-shape',
+56: EPSILON
+55: REF 'table-columns-and-groups',
+56: ONEOREMORE
+57: CHOICE
+58: REF 'table-table-column-group',
+59: ELEMENT "table:table-column-group",
+60: SEQUENCE
+61: REF 'table-table-column-group-attlist',
+62: CHOICE
+63: ATTRIBUTE "table:display",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'table-columns-and-groups',
+62: ONEOREMORE
+63: CHOICE
+64: REF 'table-table-column-group',
+64: REF 'table-columns-no-group',
+65: CHOICE
+66: SEQUENCE
+67: REF 'table-columns',
+68: CHOICE
+69: REF 'table-table-columns',
+70: ELEMENT "table:table-columns",
+71: ONEOREMORE
+72: REF 'table-table-column',
+73: ELEMENT "table:table-column",
+74: REF 'table-table-column-attlist',
+75: INTERLEAVE
+76: CHOICE
+77: ATTRIBUTE "table:number-columns-repeated",
+78: REF 'positiveInteger',
+79: DATA 'positiveInteger',
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "table:style-name",
+78: REF 'styleNameRef',
+79: CHOICE
+80: DATA 'NCName',
+80: EPSILON
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "table:visibility",
+78: REF 'table-visibility-value',
+79: CHOICE
+80: VALUE 'visible',
+80: VALUE 'collapse',
+80: VALUE 'filter',
+77: EPSILON
+76: CHOICE
+77: ATTRIBUTE "table:default-cell-style-name",
+78: REF 'styleNameRef',
+79: CHOICE
+80: DATA 'NCName',
+80: EPSILON
+77: EPSILON
+69: ONEOREMORE
+70: REF 'table-table-column',
+67: CHOICE
+68: SEQUENCE
+69: REF 'table-table-header-columns',
+70: ELEMENT "table:table-header-columns",
+71: ONEOREMORE
+72: REF 'table-table-column',
+69: CHOICE
+70: REF 'table-columns',
+71: CHOICE
+72: REF 'table-table-columns',
+72: ONEOREMORE
+73: REF 'table-table-column',
+70: EPSILON
+68: EPSILON
+66: SEQUENCE
+67: REF 'table-table-header-columns',
+67: CHOICE
+68: REF 'table-columns',
+69: CHOICE
+70: REF 'table-table-columns',
+70: ONEOREMORE
+71: REF 'table-table-column',
+68: EPSILON
+58: REF 'table-columns-no-group',
+59: CHOICE
+60: SEQUENCE
+61: REF 'table-columns',
+62: CHOICE
+63: REF 'table-table-columns',
+63: ONEOREMORE
+64: REF 'table-table-column',
+61: CHOICE
+62: SEQUENCE
+63: REF 'table-table-header-columns',
+63: CHOICE
+64: REF 'table-columns',
+65: CHOICE
+66: REF 'table-table-columns',
+66: ONEOREMORE
+67: REF 'table-table-column',
+64: EPSILON
+62: EPSILON
+60: SEQUENCE
+61: REF 'table-table-header-columns',
+61: CHOICE
+62: REF 'table-columns',
+63: CHOICE
+64: REF 'table-table-columns',
+64: ONEOREMORE
+65: REF 'table-table-column',
+62: EPSILON
+55: REF 'table-rows-and-groups',
+56: ONEOREMORE
+57: CHOICE
+58: REF 'table-table-row-group',
+59: ELEMENT "table:table-row-group",
+60: SEQUENCE
+61: REF 'table-table-row-group-attlist',
+62: CHOICE
+63: ATTRIBUTE "table:display",
+64: REF 'boolean',
+65: CHOICE
+66: VALUE 'true',
+66: VALUE 'false',
+63: EPSILON
+61: REF 'table-rows-and-groups',
+62: ONEOREMORE
+63: CHOICE
+64: REF 'table-table-row-group',
+64: REF 'table-rows-no-group',
+65: CHOICE
+66: SEQUENCE
+67: REF 'table-rows',
+68: CHOICE
+69: REF 'table-table-rows',
+70: ELEMENT "table:table-rows",
+71: ONEOREMORE
+72: SEQUENCE
+73: CHOICE
+74: REF 'text-soft-page-break',
+74: EPSILON
+73: REF 'table-table-row',
+74: ELEMENT "table:table-row",
+75: SEQUENCE
+76: REF 'table-table-row-attlist',
+77: INTERLEAVE
+78: CHOICE
+79: ATTRIBUTE "table:number-rows-repeated",
+80: REF 'positiveInteger',
+81: DATA 'positiveInteger',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "table:style-name",
+80: REF 'styleNameRef',
+81: CHOICE
+82: DATA 'NCName',
+82: EPSILON
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "table:default-cell-style-name",
+80: REF 'styleNameRef',
+81: CHOICE
+82: DATA 'NCName',
+82: EPSILON
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "table:visibility",
+80: REF 'table-visibility-value',
+81: CHOICE
+82: VALUE 'visible',
+82: VALUE 'collapse',
+82: VALUE 'filter',
+79: EPSILON
+76: ONEOREMORE
+77: CHOICE
+78: REF 'table-table-cell',
+79: ELEMENT "table:table-cell",
+80: SEQUENCE
+81: REF 'table-table-cell-attlist',
+82: INTERLEAVE
+83: CHOICE
+84: ATTRIBUTE "table:number-columns-repeated",
+85: REF 'positiveInteger',
+86: DATA 'positiveInteger',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:style-name",
+85: REF 'styleNameRef',
+86: CHOICE
+87: DATA 'NCName',
+87: EPSILON
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:content-validation-name",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:formula",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: REF 'common-value-and-type-attlist',
+85: CHOICE
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'float',
+87: ATTRIBUTE "office:value",
+88: REF 'double',
+89: DATA 'double',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'percentage',
+87: ATTRIBUTE "office:value",
+88: REF 'double',
+89: DATA 'double',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'currency',
+87: ATTRIBUTE "office:value",
+88: REF 'double',
+89: DATA 'double',
+87: CHOICE
+88: ATTRIBUTE "office:currency",
+89: REF 'string',
+90: DATA 'string',
+88: EPSILON
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'date',
+87: ATTRIBUTE "office:date-value",
+88: REF 'dateOrDateTime',
+89: CHOICE
+90: DATA 'date',
+90: DATA 'dateTime',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'time',
+87: ATTRIBUTE "office:time-value",
+88: REF 'duration',
+89: DATA 'duration',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'boolean',
+87: ATTRIBUTE "office:boolean-value",
+88: REF 'boolean',
+89: CHOICE
+90: VALUE 'true',
+90: VALUE 'false',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'string',
+87: CHOICE
+88: ATTRIBUTE "office:string-value",
+89: REF 'string',
+90: DATA 'string',
+88: EPSILON
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:protect",
+85: REF 'boolean',
+86: CHOICE
+87: VALUE 'true',
+87: VALUE 'false',
+84: EPSILON
+81: REF 'table-table-cell-attlist-extra',
+82: INTERLEAVE
+83: SEQUENCE
+84: CHOICE
+85: ATTRIBUTE "table:number-columns-spanned",
+86: REF 'positiveInteger',
+87: DATA 'positiveInteger',
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "table:number-rows-spanned",
+86: REF 'positiveInteger',
+87: DATA 'positiveInteger',
+85: EPSILON
+83: SEQUENCE
+84: CHOICE
+85: ATTRIBUTE "table:number-matrix-columns-spanned",
+86: REF 'positiveInteger',
+87: DATA 'positiveInteger',
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "table:number-matrix-rows-spanned",
+86: REF 'positiveInteger',
+87: DATA 'positiveInteger',
+85: EPSILON
+81: REF 'table-table-cell-content',
+82: SEQUENCE
+83: CHOICE
+84: REF 'table-cell-range-source',
+85: ELEMENT "table:cell-range-source",
+86: SEQUENCE
+87: REF 'table-table-cell-range-source-attlist',
+88: INTERLEAVE
+89: ATTRIBUTE "table:name",
+90: REF 'string',
+91: DATA 'string',
+89: SEQUENCE
+90: ATTRIBUTE "table:last-column-spanned",
+91: REF 'positiveInteger',
+92: DATA 'positiveInteger',
+90: ATTRIBUTE "table:last-row-spanned",
+91: REF 'positiveInteger',
+92: DATA 'positiveInteger',
+87: REF 'table-linked-source-attlist',
+88: INTERLEAVE
+89: SEQUENCE
+90: CHOICE
+91: ATTRIBUTE "xlink:type",
+92: VALUE 'simple',
+91: EPSILON
+90: CHOICE
+91: ATTRIBUTE "xlink:actuate",
+92: VALUE 'onRequest',
+91: EPSILON
+90: ATTRIBUTE "xlink:href",
+91: REF 'anyURI',
+92: DATA 'anyURI',
+89: CHOICE
+90: ATTRIBUTE "table:filter-name",
+91: REF 'string',
+92: DATA 'string',
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "table:filter-options",
+91: REF 'string',
+92: DATA 'string',
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "table:refresh-delay",
+91: REF 'duration',
+92: DATA 'duration',
+90: EPSILON
+84: EPSILON
+83: CHOICE
+84: REF 'office-annotation',
+85: ELEMENT "office:annotation",
+86: SEQUENCE
+87: REF 'office-annotation-attlist',
+88: CHOICE
+89: ATTRIBUTE "office:display",
+90: REF 'boolean',
+91: CHOICE
+92: VALUE 'true',
+92: VALUE 'false',
+89: EPSILON
+87: REF 'draw-caption-attlist',
+88: INTERLEAVE
+89: CHOICE
+90: SEQUENCE
+91: ATTRIBUTE "draw:caption-point-x",
+92: REF 'coordinate',
+93: REF 'length',
+94: DATA 'string',
+91: ATTRIBUTE "draw:caption-point-y",
+92: REF 'coordinate',
+93: REF 'length',
+94: DATA 'string',
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "draw:corner-radius",
+91: REF 'nonNegativeLength',
+92: DATA 'string',
+90: EPSILON
+87: REF 'common-draw-position-attlist',
+88: SEQUENCE
+89: CHOICE
+90: ATTRIBUTE "svg:x",
+91: REF 'coordinate',
+92: REF 'length',
+93: DATA 'string',
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "svg:y",
+91: REF 'coordinate',
+92: REF 'length',
+93: DATA 'string',
+90: EPSILON
+87: REF 'common-draw-size-attlist',
+88: SEQUENCE
+89: CHOICE
+90: ATTRIBUTE "svg:width",
+91: REF 'length',
+92: DATA 'string',
+90: EPSILON
+89: CHOICE
+90: ATTRIBUTE "svg:height",
+91: REF 'length',
+92: DATA 'string',
+90: EPSILON
+87: REF 'common-draw-shape-with-text-and-styles-attlist',
+88: SEQUENCE
+89: REF 'common-draw-shape-with-styles-attlist',
+90: SEQUENCE
+91: REF 'common-draw-z-index-attlist',
+92: CHOICE
+93: ATTRIBUTE "draw:z-index",
+94: REF 'nonNegativeInteger',
+95: DATA 'nonNegativeInteger',
+93: EPSILON
+91: REF 'common-draw-id-attlist',
+92: CHOICE
+93: ATTRIBUTE "draw:id",
+94: REF 'ID',
+95: DATA 'ID',
+93: EPSILON
+91: REF 'common-draw-layer-name-attlist',
+92: CHOICE
+93: ATTRIBUTE "draw:layer",
+94: DATA 'string',
+93: EPSILON
+91: REF 'common-draw-style-name-attlist',
+92: CHOICE
+93: SEQUENCE
+94: CHOICE
+95: ATTRIBUTE "draw:style-name",
+96: REF 'styleNameRef',
+97: CHOICE
+98: DATA 'NCName',
+98: EPSILON
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "draw:class-names",
+96: REF 'styleNameRefs',
+97: LIST
+98: CHOICE
+99: ONEOREMORE
+100: DATA 'NCName',
+99: EPSILON
+95: EPSILON
+93: SEQUENCE
+94: CHOICE
+95: ATTRIBUTE "presentation:style-name",
+96: REF 'styleNameRef',
+97: CHOICE
+98: DATA 'NCName',
+98: EPSILON
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "presentation:class-names",
+96: REF 'styleNameRefs',
+97: LIST
+98: CHOICE
+99: ONEOREMORE
+100: DATA 'NCName',
+99: EPSILON
+95: EPSILON
+91: REF 'common-draw-transform-attlist',
+92: CHOICE
+93: ATTRIBUTE "draw:transform",
+94: REF 'string',
+95: DATA 'string',
+93: EPSILON
+91: REF 'common-draw-name-attlist',
+92: CHOICE
+93: ATTRIBUTE "draw:name",
+94: REF 'string',
+95: DATA 'string',
+93: EPSILON
+91: REF 'common-text-spreadsheet-shape-attlist',
+92: INTERLEAVE
+93: SEQUENCE
+94: CHOICE
+95: ATTRIBUTE "table:end-cell-address",
+96: REF 'cellAddress',
+97: DATA 'string',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "table:end-x",
+96: REF 'coordinate',
+97: REF 'length',
+98: DATA 'string',
+95: EPSILON
+94: CHOICE
+95: ATTRIBUTE "table:end-y",
+96: REF 'coordinate',
+97: REF 'length',
+98: DATA 'string',
+95: EPSILON
+93: CHOICE
+94: ATTRIBUTE "table:table-background",
+95: REF 'boolean',
+96: CHOICE
+97: VALUE 'true',
+97: VALUE 'false',
+94: EPSILON
+93: REF 'common-text-anchor-attlist',
+94: INTERLEAVE
+95: CHOICE
+96: ATTRIBUTE "text:anchor-type",
+97: CHOICE
+98: VALUE 'page',
+98: VALUE 'frame',
+98: VALUE 'paragraph',
+98: VALUE 'char',
+98: VALUE 'as-char',
+96: EPSILON
+95: CHOICE
+96: ATTRIBUTE "text:anchor-page-number",
+97: REF 'positiveInteger',
+98: DATA 'positiveInteger',
+96: EPSILON
+89: REF 'common-draw-text-style-name-attlist',
+90: CHOICE
+91: ATTRIBUTE "draw:text-style-name",
+92: REF 'styleNameRef',
+93: CHOICE
+94: DATA 'NCName',
+94: EPSILON
+91: EPSILON
+87: CHOICE
+88: REF 'dc-creator',
+88: EPSILON
+87: CHOICE
+88: REF 'dc-date',
+88: EPSILON
+87: CHOICE
+88: REF 'meta-date-string',
+89: ELEMENT "meta:date-string",
+90: REF 'string',
+91: DATA 'string',
+88: EPSILON
+87: CHOICE
+88: ONEOREMORE
+89: CHOICE
+90: REF 'text-p',
+90: REF 'text-list',
+88: EPSILON
+84: EPSILON
+83: CHOICE
+84: REF 'table-detective',
+85: ELEMENT "table:detective",
+86: SEQUENCE
+87: CHOICE
+88: ONEOREMORE
+89: REF 'table-highlighted-range',
+90: ELEMENT "table:highlighted-range",
+91: CHOICE
+92: REF 'table-highlighted-range-attlist',
+93: INTERLEAVE
+94: CHOICE
+95: ATTRIBUTE "table:cell-range-address",
+96: REF 'cellRangeAddress',
+97: DATA 'string',
+95: EPSILON
+94: ATTRIBUTE "table:direction",
+95: CHOICE
+96: VALUE 'from-another-table',
+96: VALUE 'to-another-table',
+96: VALUE 'from-same-table',
+94: CHOICE
+95: ATTRIBUTE "table:contains-error",
+96: REF 'boolean',
+97: CHOICE
+98: VALUE 'true',
+98: VALUE 'false',
+95: EPSILON
+92: REF 'table-highlighted-range-attlist-invalid',
+93: ATTRIBUTE "table:marked-invalid",
+94: REF 'boolean',
+95: CHOICE
+96: VALUE 'true',
+96: VALUE 'false',
+88: EPSILON
+87: CHOICE
+88: ONEOREMORE
+89: REF 'table-operation',
+90: ELEMENT "table:operation",
+91: REF 'table-operation-attlist',
+92: INTERLEAVE
+93: ATTRIBUTE "table:name",
+94: CHOICE
+95: VALUE 'trace-dependents',
+95: VALUE 'remove-dependents',
+95: VALUE 'trace-precedents',
+95: VALUE 'remove-precedents',
+95: VALUE 'trace-errors',
+93: ATTRIBUTE "table:index",
+94: REF 'nonNegativeInteger',
+95: DATA 'nonNegativeInteger',
+88: EPSILON
+84: EPSILON
+83: CHOICE
+84: ONEOREMORE
+85: REF 'text-content',
+86: CHOICE
+87: REF 'text-h',
+87: REF 'text-p',
+87: REF 'text-list',
+87: REF 'text-numbered-paragraph',
+87: REF 'table-table',
+87: REF 'draw-a',
+87: REF 'text-section',
+87: REF 'text-soft-page-break',
+87: REF 'text-table-of-content',
+87: REF 'text-illustration-index',
+87: REF 'text-table-index',
+87: REF 'text-object-index',
+87: REF 'text-user-index',
+87: REF 'text-alphabetical-index',
+87: REF 'text-bibliography',
+87: REF 'shape',
+88: CHOICE
+89: REF 'draw-rect',
+89: REF 'draw-line',
+89: REF 'draw-polyline',
+89: REF 'draw-polygon',
+89: REF 'draw-regular-polygon',
+89: REF 'draw-path',
+89: REF 'draw-circle',
+89: REF 'draw-ellipse',
+89: REF 'draw-g',
+89: REF 'draw-page-thumbnail',
+89: REF 'draw-frame',
+89: REF 'draw-measure',
+89: REF 'draw-caption',
+89: REF 'draw-connector',
+89: REF 'draw-control',
+89: REF 'dr3d-scene',
+89: REF 'draw-custom-shape',
+87: REF 'change-marks',
+88: CHOICE
+84: EPSILON
+78: REF 'table-covered-table-cell',
+79: ELEMENT "table:covered-table-cell",
+80: SEQUENCE
+81: REF 'table-table-cell-attlist',
+82: INTERLEAVE
+83: CHOICE
+84: ATTRIBUTE "table:number-columns-repeated",
+85: REF 'positiveInteger',
+86: DATA 'positiveInteger',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:style-name",
+85: REF 'styleNameRef',
+86: CHOICE
+87: DATA 'NCName',
+87: EPSILON
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:content-validation-name",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:formula",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: REF 'common-value-and-type-attlist',
+85: CHOICE
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'float',
+87: ATTRIBUTE "office:value",
+88: REF 'double',
+89: DATA 'double',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'percentage',
+87: ATTRIBUTE "office:value",
+88: REF 'double',
+89: DATA 'double',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'currency',
+87: ATTRIBUTE "office:value",
+88: REF 'double',
+89: DATA 'double',
+87: CHOICE
+88: ATTRIBUTE "office:currency",
+89: REF 'string',
+90: DATA 'string',
+88: EPSILON
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'date',
+87: ATTRIBUTE "office:date-value",
+88: REF 'dateOrDateTime',
+89: CHOICE
+90: DATA 'date',
+90: DATA 'dateTime',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'time',
+87: ATTRIBUTE "office:time-value",
+88: REF 'duration',
+89: DATA 'duration',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'boolean',
+87: ATTRIBUTE "office:boolean-value",
+88: REF 'boolean',
+89: CHOICE
+90: VALUE 'true',
+90: VALUE 'false',
+86: SEQUENCE
+87: ATTRIBUTE "office:value-type",
+88: VALUE 'string',
+87: CHOICE
+88: ATTRIBUTE "office:string-value",
+89: REF 'string',
+90: DATA 'string',
+88: EPSILON
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "table:protect",
+85: REF 'boolean',
+86: CHOICE
+87: VALUE 'true',
+87: VALUE 'false',
+84: EPSILON
+81: REF 'table-table-cell-content',
+82: SEQUENCE
+83: CHOICE
+84: REF 'table-cell-range-source',
+84: EPSILON
+83: CHOICE
+84: REF 'office-annotation',
+84: EPSILON
+83: CHOICE
+84: REF 'table-detective',
+84: EPSILON
+83: CHOICE
+84: ONEOREMORE
+85: REF 'text-content',
+86: CHOICE
+87: REF 'text-h',
+87: REF 'text-p',
+87: REF 'text-list',
+87: REF 'text-numbered-paragraph',
+87: REF 'table-table',
+87: REF 'draw-a',
+87: REF 'text-section',
+87: REF 'text-soft-page-break',
+87: REF 'text-table-of-content',
+87: REF 'text-illustration-index',
+87: REF 'text-table-index',
+87: REF 'text-object-index',
+87: REF 'text-user-index',
+87: REF 'text-alphabetical-index',
+87: REF 'text-bibliography',
+87: REF 'shape',
+88: CHOICE
+89: REF 'draw-rect',
+89: REF 'draw-line',
+89: REF 'draw-polyline',
+89: REF 'draw-polygon',
+89: REF 'draw-regular-polygon',
+89: REF 'draw-path',
+89: REF 'draw-circle',
+89: REF 'draw-ellipse',
+89: REF 'draw-g',
+89: REF 'draw-page-thumbnail',
+89: REF 'draw-frame',
+89: REF 'draw-measure',
+89: REF 'draw-caption',
+89: REF 'draw-connector',
+89: REF 'draw-control',
+89: REF 'dr3d-scene',
+89: REF 'draw-custom-shape',
+87: REF 'change-marks',
+88: CHOICE
+84: EPSILON
+69: ONEOREMORE
+70: SEQUENCE
+71: CHOICE
+72: REF 'text-soft-page-break',
+72: EPSILON
+71: REF 'table-table-row',
+67: CHOICE
+68: SEQUENCE
+69: REF 'table-table-header-rows',
+70: ELEMENT "table:table-header-rows",
+71: ONEOREMORE
+72: SEQUENCE
+73: CHOICE
+74: REF 'text-soft-page-break',
+74: EPSILON
+73: REF 'table-table-row',
+69: CHOICE
+70: REF 'table-rows',
+71: CHOICE
+72: REF 'table-table-rows',
+72: ONEOREMORE
+73: SEQUENCE
+74: CHOICE
+75: REF 'text-soft-page-break',
+75: EPSILON
+74: REF 'table-table-row',
+70: EPSILON
+68: EPSILON
+66: SEQUENCE
+67: REF 'table-table-header-rows',
+67: CHOICE
+68: REF 'table-rows',
+69: CHOICE
+70: REF 'table-table-rows',
+70: ONEOREMORE
+71: SEQUENCE
+72: CHOICE
+73: REF 'text-soft-page-break',
+73: EPSILON
+72: REF 'table-table-row',
+68: EPSILON
+58: REF 'table-rows-no-group',
+59: CHOICE
+60: SEQUENCE
+61: REF 'table-rows',
+62: CHOICE
+63: REF 'table-table-rows',
+63: ONEOREMORE
+64: SEQUENCE
+65: CHOICE
+66: REF 'text-soft-page-break',
+66: EPSILON
+65: REF 'table-table-row',
+61: CHOICE
+62: SEQUENCE
+63: REF 'table-table-header-rows',
+63: CHOICE
+64: REF 'table-rows',
+65: CHOICE
+66: REF 'table-table-rows',
+66: ONEOREMORE
+67: SEQUENCE
+68: CHOICE
+69: REF 'text-soft-page-break',
+69: EPSILON
+68: REF 'table-table-row',
+64: EPSILON
+62: EPSILON
+60: SEQUENCE
+61: REF 'table-table-header-rows',
+61: CHOICE
+62: REF 'table-rows',
+63: CHOICE
+64: REF 'table-table-rows',
+64: ONEOREMORE
+65: SEQUENCE
+66: CHOICE
+67: REF 'text-soft-page-break',
+67: EPSILON
+66: REF 'table-table-row',
+62: EPSILON
+52: REF 'draw-a',
+52: REF 'text-section',
+52: REF 'text-soft-page-break',
+52: REF 'text-table-of-content',
+52: REF 'text-illustration-index',
+52: REF 'text-table-index',
+52: REF 'text-object-index',
+52: REF 'text-user-index',
+52: REF 'text-alphabetical-index',
+52: REF 'text-bibliography',
+52: REF 'shape',
+53: CHOICE
+54: REF 'draw-rect',
+54: REF 'draw-line',
+54: REF 'draw-polyline',
+54: REF 'draw-polygon',
+54: REF 'draw-regular-polygon',
+54: REF 'draw-path',
+54: REF 'draw-circle',
+54: REF 'draw-ellipse',
+54: REF 'draw-g',
+54: REF 'draw-page-thumbnail',
+54: REF 'draw-frame',
+54: REF 'draw-measure',
+54: REF 'draw-caption',
+54: REF 'draw-connector',
+54: REF 'draw-control',
+54: REF 'dr3d-scene',
+54: REF 'draw-custom-shape',
+52: REF 'change-marks',
+53: CHOICE
+49: EPSILON
+45: ELEMENT "text:ruby",
+46: SEQUENCE
+47: CHOICE
+48: ATTRIBUTE "text:style-name",
+49: REF 'styleNameRef',
+50: CHOICE
+51: DATA 'NCName',
+51: EPSILON
+48: EPSILON
+47: ELEMENT "text:ruby-base",
+48: REF 'paragraph-content',
+49: CHOICE
+50: STRING
+47: ELEMENT "text:ruby-text",
+48: SEQUENCE
+49: CHOICE
+50: ATTRIBUTE "text:style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+49: STRING
+45: REF 'office-annotation',
+45: REF 'change-marks',
+46: CHOICE
+45: REF 'shape',
+46: CHOICE
+47: REF 'draw-rect',
+47: REF 'draw-line',
+47: REF 'draw-polyline',
+47: REF 'draw-polygon',
+47: REF 'draw-regular-polygon',
+47: REF 'draw-path',
+47: REF 'draw-circle',
+47: REF 'draw-ellipse',
+47: REF 'draw-g',
+47: REF 'draw-page-thumbnail',
+47: REF 'draw-frame',
+47: REF 'draw-measure',
+47: REF 'draw-caption',
+47: REF 'draw-connector',
+47: REF 'draw-control',
+47: REF 'dr3d-scene',
+47: REF 'draw-custom-shape',
+45: REF 'draw-a',
+45: ELEMENT "text:date",
+46: SEQUENCE
+47: REF 'text-date-attlist',
+48: INTERLEAVE
+49: REF 'common-field-fixed-attlist',
+50: CHOICE
+51: ATTRIBUTE "text:fixed",
+52: REF 'boolean',
+53: CHOICE
+54: VALUE 'true',
+54: VALUE 'false',
+51: EPSILON
+49: REF 'common-field-data-style-name-attlist',
+50: CHOICE
+51: ATTRIBUTE "style:data-style-name",
+52: REF 'styleNameRef',
+53: CHOICE
+54: DATA 'NCName',
+54: EPSILON
+51: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:date-value",
+51: REF 'dateOrDateTime',
+52: CHOICE
+53: DATA 'date',
+53: DATA 'dateTime',
+50: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:date-adjust",
+51: REF 'duration',
+52: DATA 'duration',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:time",
+46: SEQUENCE
+47: REF 'text-time-attlist',
+48: INTERLEAVE
+49: REF 'common-field-fixed-attlist',
+50: CHOICE
+51: ATTRIBUTE "text:fixed",
+52: REF 'boolean',
+53: CHOICE
+54: VALUE 'true',
+54: VALUE 'false',
+51: EPSILON
+49: REF 'common-field-data-style-name-attlist',
+50: CHOICE
+51: ATTRIBUTE "style:data-style-name",
+52: REF 'styleNameRef',
+53: CHOICE
+54: DATA 'NCName',
+54: EPSILON
+51: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:time-value",
+51: REF 'timeOrDateTime',
+52: CHOICE
+53: DATA 'time',
+53: DATA 'dateTime',
+50: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:time-adjust",
+51: REF 'duration',
+52: DATA 'duration',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:page-number",
+46: SEQUENCE
+47: REF 'text-page-number-attlist',
+48: INTERLEAVE
+49: REF 'common-field-num-format-attlist',
+50: CHOICE
+51: REF 'common-num-format-attlist',
+52: CHOICE
+53: ATTRIBUTE "style:num-format",
+54: CHOICE
+55: VALUE '1',
+55: VALUE 'i',
+55: VALUE 'I',
+55: REF 'string',
+56: DATA 'string',
+55: EPSILON
+53: SEQUENCE
+54: ATTRIBUTE "style:num-format",
+55: CHOICE
+56: VALUE 'a',
+56: VALUE 'A',
+54: REF 'style-num-letter-sync-attlist',
+55: CHOICE
+56: ATTRIBUTE "style:num-letter-sync",
+57: REF 'boolean',
+58: CHOICE
+59: VALUE 'true',
+59: VALUE 'false',
+56: EPSILON
+53: EPSILON
+51: EPSILON
+49: REF 'common-field-fixed-attlist',
+50: CHOICE
+51: ATTRIBUTE "text:fixed",
+52: REF 'boolean',
+53: CHOICE
+54: VALUE 'true',
+54: VALUE 'false',
+51: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:page-adjust",
+51: REF 'integer',
+52: DATA 'integer',
+50: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:select-page",
+51: CHOICE
+52: VALUE 'previous',
+52: VALUE 'current',
+52: VALUE 'next',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:page-continuation",
+46: SEQUENCE
+47: REF 'text-page-continuation-attlist',
+48: INTERLEAVE
+49: ATTRIBUTE "text:select-page",
+50: CHOICE
+51: VALUE 'previous',
+51: VALUE 'next',
+49: CHOICE
+50: ATTRIBUTE "text:string-value",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:sender-firstname",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-lastname",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-initials",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-title",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-position",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-email",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-phone-private",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-fax",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-company",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-phone-work",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-street",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-city",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-postal-code",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-country",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sender-state-or-province",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:author-name",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:author-initials",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:chapter",
+46: SEQUENCE
+47: REF 'text-chapter-attlist',
+48: INTERLEAVE
+49: ATTRIBUTE "text:display",
+50: CHOICE
+51: VALUE 'name',
+51: VALUE 'number',
+51: VALUE 'number-and-name',
+51: VALUE 'plain-number-and-name',
+51: VALUE 'plain-number',
+49: ATTRIBUTE "text:outline-level",
+50: REF 'nonNegativeInteger',
+51: DATA 'nonNegativeInteger',
+47: STRING
+45: ELEMENT "text:file-name",
+46: SEQUENCE
+47: REF 'text-file-name-attlist',
+48: INTERLEAVE
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'full',
+52: VALUE 'path',
+52: VALUE 'name',
+52: VALUE 'name-and-extension',
+50: EPSILON
+49: REF 'common-field-fixed-attlist',
+50: CHOICE
+51: ATTRIBUTE "text:fixed",
+52: REF 'boolean',
+53: CHOICE
+54: VALUE 'true',
+54: VALUE 'false',
+51: EPSILON
+47: STRING
+45: ELEMENT "text:template-name",
+46: SEQUENCE
+47: REF 'text-template-name-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:display",
+50: CHOICE
+51: VALUE 'full',
+51: VALUE 'path',
+51: VALUE 'name',
+51: VALUE 'name-and-extension',
+51: VALUE 'area',
+51: VALUE 'title',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:sheet-name",
+46: STRING
+45: ELEMENT "text:variable-set",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-name-attlist',
+49: ATTRIBUTE "text:name",
+50: REF 'variableName',
+51: DATA 'string',
+48: REF 'common-field-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:formula",
+51: REF 'formula',
+52: DATA 'string',
+50: EPSILON
+48: REF 'common-value-and-type-attlist',
+49: CHOICE
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'float',
+51: ATTRIBUTE "office:value",
+52: REF 'double',
+53: DATA 'double',
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'percentage',
+51: ATTRIBUTE "office:value",
+52: REF 'double',
+53: DATA 'double',
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'currency',
+51: ATTRIBUTE "office:value",
+52: REF 'double',
+53: DATA 'double',
+51: CHOICE
+52: ATTRIBUTE "office:currency",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'date',
+51: ATTRIBUTE "office:date-value",
+52: REF 'dateOrDateTime',
+53: CHOICE
+54: DATA 'date',
+54: DATA 'dateTime',
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'time',
+51: ATTRIBUTE "office:time-value",
+52: REF 'duration',
+53: DATA 'duration',
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'boolean',
+51: ATTRIBUTE "office:boolean-value",
+52: REF 'boolean',
+53: CHOICE
+54: VALUE 'true',
+54: VALUE 'false',
+50: SEQUENCE
+51: ATTRIBUTE "office:value-type",
+52: VALUE 'string',
+51: CHOICE
+52: ATTRIBUTE "office:string-value",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+48: REF 'common-field-display-value-none-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'value',
+52: VALUE 'none',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:variable-get",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-name-attlist',
+49: ATTRIBUTE "text:name",
+50: REF 'variableName',
+51: DATA 'string',
+48: REF 'common-field-display-value-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'value',
+52: VALUE 'formula',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:variable-input",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-name-attlist',
+49: ATTRIBUTE "text:name",
+50: REF 'variableName',
+51: DATA 'string',
+48: REF 'common-field-description-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:description",
+51: STRING
+50: EPSILON
+48: REF 'common-value-type-attlist',
+49: ATTRIBUTE "office:value-type",
+50: REF 'valueType',
+51: CHOICE
+52: VALUE 'float',
+52: VALUE 'time',
+52: VALUE 'date',
+52: VALUE 'percentage',
+52: VALUE 'currency',
+52: VALUE 'boolean',
+52: VALUE 'string',
+48: REF 'common-field-display-value-none-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'value',
+52: VALUE 'none',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:user-field-get",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-name-attlist',
+49: ATTRIBUTE "text:name",
+50: REF 'variableName',
+51: DATA 'string',
+48: REF 'common-field-display-value-formula-none-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'value',
+52: VALUE 'formula',
+52: VALUE 'none',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:user-field-input",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-name-attlist',
+49: ATTRIBUTE "text:name",
+50: REF 'variableName',
+51: DATA 'string',
+48: REF 'common-field-description-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:description",
+51: STRING
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:sequence",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-name-attlist',
+49: ATTRIBUTE "text:name",
+50: REF 'variableName',
+51: DATA 'string',
+48: REF 'common-field-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:formula",
+51: REF 'formula',
+52: DATA 'string',
+50: EPSILON
+48: REF 'common-field-num-format-attlist',
+49: CHOICE
+50: REF 'common-num-format-attlist',
+51: CHOICE
+52: ATTRIBUTE "style:num-format",
+53: CHOICE
+54: VALUE '1',
+54: VALUE 'i',
+54: VALUE 'I',
+54: REF 'string',
+55: DATA 'string',
+54: EPSILON
+52: SEQUENCE
+53: ATTRIBUTE "style:num-format",
+54: CHOICE
+55: VALUE 'a',
+55: VALUE 'A',
+53: REF 'style-num-letter-sync-attlist',
+54: CHOICE
+55: ATTRIBUTE "style:num-letter-sync",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+52: EPSILON
+50: EPSILON
+48: REF 'text-sequence-ref-name',
+49: CHOICE
+50: ATTRIBUTE "text:ref-name",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:expression",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:formula",
+51: REF 'formula',
+52: DATA 'string',
+50: EPSILON
+48: CHOICE
+49: REF 'common-value-and-type-attlist',
+50: CHOICE
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'float',
+52: ATTRIBUTE "office:value",
+53: REF 'double',
+54: DATA 'double',
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'percentage',
+52: ATTRIBUTE "office:value",
+53: REF 'double',
+54: DATA 'double',
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'currency',
+52: ATTRIBUTE "office:value",
+53: REF 'double',
+54: DATA 'double',
+52: CHOICE
+53: ATTRIBUTE "office:currency",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'date',
+52: ATTRIBUTE "office:date-value",
+53: REF 'dateOrDateTime',
+54: CHOICE
+55: DATA 'date',
+55: DATA 'dateTime',
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'time',
+52: ATTRIBUTE "office:time-value",
+53: REF 'duration',
+54: DATA 'duration',
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'boolean',
+52: ATTRIBUTE "office:boolean-value",
+53: REF 'boolean',
+54: CHOICE
+55: VALUE 'true',
+55: VALUE 'false',
+51: SEQUENCE
+52: ATTRIBUTE "office:value-type",
+53: VALUE 'string',
+52: CHOICE
+53: ATTRIBUTE "office:string-value",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+49: EPSILON
+48: REF 'common-field-display-value-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'value',
+52: VALUE 'formula',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:text-input",
+46: SEQUENCE
+47: REF 'common-field-description-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:description",
+50: STRING
+49: EPSILON
+47: STRING
+45: ELEMENT "text:initial-creator",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:creation-date",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:date-value",
+50: REF 'dateOrDateTime',
+51: CHOICE
+52: DATA 'date',
+52: DATA 'dateTime',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:creation-time",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:time-value",
+50: REF 'timeOrDateTime',
+51: CHOICE
+52: DATA 'time',
+52: DATA 'dateTime',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:description",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:user-defined",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: ATTRIBUTE "text:name",
+49: REF 'string',
+50: DATA 'string',
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "office:value",
+50: REF 'double',
+51: DATA 'double',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "office:date-value",
+50: REF 'dateOrDateTime',
+51: CHOICE
+52: DATA 'date',
+52: DATA 'dateTime',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "office:time-value",
+50: REF 'duration',
+51: DATA 'duration',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "office:boolean-value",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "office:string-value",
+50: REF 'string',
+51: DATA 'string',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:print-time",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:time-value",
+50: REF 'time',
+51: DATA 'time',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:print-date",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:date-value",
+50: REF 'date',
+51: DATA 'date',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:printed-by",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:title",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:subject",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:keywords",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:editing-cycles",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:editing-duration",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:duration",
+50: REF 'duration',
+51: DATA 'duration',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:modification-time",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:time-value",
+50: REF 'time',
+51: DATA 'time',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:modification-date",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-fixed-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:fixed",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:date-value",
+50: REF 'date',
+51: DATA 'date',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:creator",
+46: SEQUENCE
+47: REF 'common-field-fixed-attlist',
+48: CHOICE
+49: ATTRIBUTE "text:fixed",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:page-count", "text:paragraph-count", "text:word-count", "text:character-count", "text:table-count", "text:image-count", "text:object-count",
+46: SEQUENCE
+47: REF 'common-field-num-format-attlist',
+48: CHOICE
+49: REF 'common-num-format-attlist',
+50: CHOICE
+51: ATTRIBUTE "style:num-format",
+52: CHOICE
+53: VALUE '1',
+53: VALUE 'i',
+53: VALUE 'I',
+53: REF 'string',
+54: DATA 'string',
+53: EPSILON
+51: SEQUENCE
+52: ATTRIBUTE "style:num-format",
+53: CHOICE
+54: VALUE 'a',
+54: VALUE 'A',
+52: REF 'style-num-letter-sync-attlist',
+53: CHOICE
+54: ATTRIBUTE "style:num-letter-sync",
+55: REF 'boolean',
+56: CHOICE
+57: VALUE 'true',
+57: VALUE 'false',
+54: EPSILON
+51: EPSILON
+49: EPSILON
+47: STRING
+45: ELEMENT "text:database-display",
+46: SEQUENCE
+47: REF 'text-database-display-attlist',
+48: INTERLEAVE
+49: REF 'common-field-database-table',
+50: SEQUENCE
+51: REF 'common-field-database-table-attlist',
+52: INTERLEAVE
+53: ATTRIBUTE "text:table-name",
+54: REF 'string',
+55: DATA 'string',
+53: CHOICE
+54: ATTRIBUTE "text:table-type",
+55: CHOICE
+56: VALUE 'table',
+56: VALUE 'query',
+56: VALUE 'command',
+54: EPSILON
+51: REF 'common-field-database-name',
+52: CHOICE
+53: ATTRIBUTE "text:database-name",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+53: REF 'form-connection-resource',
+49: REF 'common-field-data-style-name-attlist',
+50: CHOICE
+51: ATTRIBUTE "style:data-style-name",
+52: REF 'styleNameRef',
+53: CHOICE
+54: DATA 'NCName',
+54: EPSILON
+51: EPSILON
+49: ATTRIBUTE "text:column-name",
+50: REF 'string',
+51: DATA 'string',
+47: STRING
+45: ELEMENT "text:database-next",
+46: REF 'text-database-next-attlist',
+47: INTERLEAVE
+48: REF 'common-field-database-table',
+49: SEQUENCE
+50: REF 'common-field-database-table-attlist',
+51: INTERLEAVE
+52: ATTRIBUTE "text:table-name",
+53: REF 'string',
+54: DATA 'string',
+52: CHOICE
+53: ATTRIBUTE "text:table-type",
+54: CHOICE
+55: VALUE 'table',
+55: VALUE 'query',
+55: VALUE 'command',
+53: EPSILON
+50: REF 'common-field-database-name',
+51: CHOICE
+52: ATTRIBUTE "text:database-name",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+52: REF 'form-connection-resource',
+48: CHOICE
+49: ATTRIBUTE "text:condition",
+50: REF 'formula',
+51: DATA 'string',
+49: EPSILON
+45: ELEMENT "text:database-row-select",
+46: REF 'text-database-row-select-attlist',
+47: INTERLEAVE
+48: REF 'common-field-database-table',
+49: SEQUENCE
+50: REF 'common-field-database-table-attlist',
+51: INTERLEAVE
+52: ATTRIBUTE "text:table-name",
+53: REF 'string',
+54: DATA 'string',
+52: CHOICE
+53: ATTRIBUTE "text:table-type",
+54: CHOICE
+55: VALUE 'table',
+55: VALUE 'query',
+55: VALUE 'command',
+53: EPSILON
+50: REF 'common-field-database-name',
+51: CHOICE
+52: ATTRIBUTE "text:database-name",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+52: REF 'form-connection-resource',
+48: CHOICE
+49: ATTRIBUTE "text:condition",
+50: REF 'formula',
+51: DATA 'string',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:row-number",
+50: REF 'nonNegativeInteger',
+51: DATA 'nonNegativeInteger',
+49: EPSILON
+45: ELEMENT "text:database-row-number",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-database-table',
+49: SEQUENCE
+50: REF 'common-field-database-table-attlist',
+51: INTERLEAVE
+52: ATTRIBUTE "text:table-name",
+53: REF 'string',
+54: DATA 'string',
+52: CHOICE
+53: ATTRIBUTE "text:table-type",
+54: CHOICE
+55: VALUE 'table',
+55: VALUE 'query',
+55: VALUE 'command',
+53: EPSILON
+50: REF 'common-field-database-name',
+51: CHOICE
+52: ATTRIBUTE "text:database-name",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+52: REF 'form-connection-resource',
+48: REF 'common-field-num-format-attlist',
+49: CHOICE
+50: REF 'common-num-format-attlist',
+51: CHOICE
+52: ATTRIBUTE "style:num-format",
+53: CHOICE
+54: VALUE '1',
+54: VALUE 'i',
+54: VALUE 'I',
+54: REF 'string',
+55: DATA 'string',
+54: EPSILON
+52: SEQUENCE
+53: ATTRIBUTE "style:num-format",
+54: CHOICE
+55: VALUE 'a',
+55: VALUE 'A',
+53: REF 'style-num-letter-sync-attlist',
+54: CHOICE
+55: ATTRIBUTE "style:num-letter-sync",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+52: EPSILON
+50: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:value",
+50: REF 'nonNegativeInteger',
+51: DATA 'nonNegativeInteger',
+49: EPSILON
+47: STRING
+45: ELEMENT "text:database-name",
+46: SEQUENCE
+47: REF 'common-field-database-table',
+48: SEQUENCE
+49: REF 'common-field-database-table-attlist',
+50: INTERLEAVE
+51: ATTRIBUTE "text:table-name",
+52: REF 'string',
+53: DATA 'string',
+51: CHOICE
+52: ATTRIBUTE "text:table-type",
+53: CHOICE
+54: VALUE 'table',
+54: VALUE 'query',
+54: VALUE 'command',
+52: EPSILON
+49: REF 'common-field-database-name',
+50: CHOICE
+51: ATTRIBUTE "text:database-name",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+51: REF 'form-connection-resource',
+47: STRING
+45: ELEMENT "text:page-variable-set",
+46: SEQUENCE
+47: REF 'text-set-page-variable-attlist',
+48: INTERLEAVE
+49: CHOICE
+50: ATTRIBUTE "text:active",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:page-adjust",
+51: REF 'integer',
+52: DATA 'integer',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:page-variable-get",
+46: SEQUENCE
+47: REF 'text-get-page-variable-attlist',
+48: REF 'common-field-num-format-attlist',
+49: CHOICE
+50: REF 'common-num-format-attlist',
+51: CHOICE
+52: ATTRIBUTE "style:num-format",
+53: CHOICE
+54: VALUE '1',
+54: VALUE 'i',
+54: VALUE 'I',
+54: REF 'string',
+55: DATA 'string',
+54: EPSILON
+52: SEQUENCE
+53: ATTRIBUTE "style:num-format",
+54: CHOICE
+55: VALUE 'a',
+55: VALUE 'A',
+53: REF 'style-num-letter-sync-attlist',
+54: CHOICE
+55: ATTRIBUTE "style:num-letter-sync",
+56: REF 'boolean',
+57: CHOICE
+58: VALUE 'true',
+58: VALUE 'false',
+55: EPSILON
+52: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:placeholder",
+46: SEQUENCE
+47: REF 'text-placeholder-attlist',
+48: INTERLEAVE
+49: ATTRIBUTE "text:placeholder-type",
+50: CHOICE
+51: VALUE 'text',
+51: VALUE 'table',
+51: VALUE 'text-box',
+51: VALUE 'image',
+51: VALUE 'object',
+49: REF 'common-field-description-attlist',
+50: CHOICE
+51: ATTRIBUTE "text:description",
+52: STRING
+51: EPSILON
+47: STRING
+45: ELEMENT "text:conditional-text",
+46: SEQUENCE
+47: REF 'text-conditional-text-attlist',
+48: INTERLEAVE
+49: ATTRIBUTE "text:condition",
+50: REF 'formula',
+51: DATA 'string',
+49: ATTRIBUTE "text:string-value-if-true",
+50: REF 'string',
+51: DATA 'string',
+49: ATTRIBUTE "text:string-value-if-false",
+50: REF 'string',
+51: DATA 'string',
+49: CHOICE
+50: ATTRIBUTE "text:current-value",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:hidden-text",
+46: SEQUENCE
+47: REF 'text-hidden-text-attlist',
+48: INTERLEAVE
+49: ATTRIBUTE "text:condition",
+50: REF 'formula',
+51: DATA 'string',
+49: ATTRIBUTE "text:string-value",
+50: REF 'string',
+51: DATA 'string',
+49: CHOICE
+50: ATTRIBUTE "text:is-hidden",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:reference-ref", "text:bookmark-ref",
+46: INTERLEAVE
+47: REF 'text-common-ref-content',
+48: INTERLEAVE
+49: STRING
+49: CHOICE
+50: ATTRIBUTE "text:ref-name",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+47: REF 'text-ref-content',
+48: CHOICE
+49: ATTRIBUTE "text:reference-format",
+50: CHOICE
+51: VALUE 'page',
+51: VALUE 'chapter',
+51: VALUE 'direction',
+51: VALUE 'text',
+49: EPSILON
+45: ELEMENT "text:note-ref",
+46: INTERLEAVE
+47: REF 'text-common-ref-content',
+48: INTERLEAVE
+49: STRING
+49: CHOICE
+50: ATTRIBUTE "text:ref-name",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+47: REF 'text-note-ref-content',
+48: REF 'text-note-class',
+49: ATTRIBUTE "text:note-class",
+50: CHOICE
+51: VALUE 'footnote',
+51: VALUE 'endnote',
+47: REF 'text-ref-content',
+48: CHOICE
+49: ATTRIBUTE "text:reference-format",
+50: CHOICE
+51: VALUE 'page',
+51: VALUE 'chapter',
+51: VALUE 'direction',
+51: VALUE 'text',
+49: EPSILON
+45: ELEMENT "text:sequence-ref",
+46: INTERLEAVE
+47: REF 'text-common-ref-content',
+48: INTERLEAVE
+49: STRING
+49: CHOICE
+50: ATTRIBUTE "text:ref-name",
+51: REF 'string',
+52: DATA 'string',
+50: EPSILON
+47: REF 'text-sequence-ref-content',
+48: CHOICE
+49: ATTRIBUTE "text:reference-format",
+50: CHOICE
+51: VALUE 'page',
+51: VALUE 'chapter',
+51: VALUE 'direction',
+51: VALUE 'text',
+51: VALUE 'category-and-value',
+51: VALUE 'caption',
+51: VALUE 'value',
+49: EPSILON
+45: ELEMENT "text:script",
+46: INTERLEAVE
+47: CHOICE
+48: SEQUENCE
+49: ATTRIBUTE "xlink:href",
+50: REF 'anyURI',
+51: DATA 'anyURI',
+49: CHOICE
+50: ATTRIBUTE "xlink:type",
+51: VALUE 'simple',
+50: EPSILON
+48: STRING
+47: CHOICE
+48: ATTRIBUTE "script:language",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+45: ELEMENT "text:execute-macro",
+46: SEQUENCE
+47: CHOICE
+48: ATTRIBUTE "text:name",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: CHOICE
+48: REF 'office-event-listeners',
+48: EPSILON
+47: STRING
+45: ELEMENT "text:hidden-paragraph",
+46: SEQUENCE
+47: REF 'text-hidden-paragraph-attlist',
+48: INTERLEAVE
+49: ATTRIBUTE "text:condition",
+50: REF 'formula',
+51: DATA 'string',
+49: CHOICE
+50: ATTRIBUTE "text:is-hidden",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+47: STRING
+45: ELEMENT "text:dde-connection",
+46: SEQUENCE
+47: ATTRIBUTE "text:connection-name",
+48: REF 'string',
+49: DATA 'string',
+47: STRING
+45: ELEMENT "text:measure",
+46: SEQUENCE
+47: ATTRIBUTE "text:kind",
+48: CHOICE
+49: VALUE 'value',
+49: VALUE 'unit',
+49: VALUE 'gap',
+47: STRING
+45: ELEMENT "text:table-formula",
+46: SEQUENCE
+47: INTERLEAVE
+48: REF 'common-field-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:formula",
+51: REF 'formula',
+52: DATA 'string',
+50: EPSILON
+48: REF 'common-field-display-value-formula-attlist',
+49: CHOICE
+50: ATTRIBUTE "text:display",
+51: CHOICE
+52: VALUE 'value',
+52: VALUE 'formula',
+50: EPSILON
+48: REF 'common-field-data-style-name-attlist',
+49: CHOICE
+50: ATTRIBUTE "style:data-style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: EPSILON
+47: STRING
+45: ELEMENT "text:toc-mark-start",
+46: REF 'text-toc-mark-start-attrs',
+47: SEQUENCE
+48: REF 'text-id',
+49: ATTRIBUTE "text:id",
+50: REF 'string',
+51: DATA 'string',
+48: REF 'text-outline-level',
+49: CHOICE
+50: ATTRIBUTE "text:outline-level",
+51: REF 'positiveInteger',
+52: DATA 'positiveInteger',
+50: EPSILON
+45: ELEMENT "text:toc-mark-end",
+46: REF 'text-id',
+47: ATTRIBUTE "text:id",
+48: REF 'string',
+49: DATA 'string',
+45: ELEMENT "text:toc-mark",
+46: SEQUENCE
+47: ATTRIBUTE "text:string-value",
+48: REF 'string',
+49: DATA 'string',
+47: REF 'text-outline-level',
+48: CHOICE
+49: ATTRIBUTE "text:outline-level",
+50: REF 'positiveInteger',
+51: DATA 'positiveInteger',
+49: EPSILON
+45: ELEMENT "text:user-index-mark-start",
+46: SEQUENCE
+47: REF 'text-id',
+48: ATTRIBUTE "text:id",
+49: REF 'string',
+50: DATA 'string',
+47: REF 'text-outline-level',
+48: CHOICE
+49: ATTRIBUTE "text:outline-level",
+50: REF 'positiveInteger',
+51: DATA 'positiveInteger',
+49: EPSILON
+47: REF 'text-index-name',
+48: ATTRIBUTE "text:index-name",
+49: REF 'string',
+50: DATA 'string',
+45: ELEMENT "text:user-index-mark-end",
+46: SEQUENCE
+47: REF 'text-id',
+48: ATTRIBUTE "text:id",
+49: REF 'string',
+50: DATA 'string',
+47: REF 'text-outline-level',
+48: CHOICE
+49: ATTRIBUTE "text:outline-level",
+50: REF 'positiveInteger',
+51: DATA 'positiveInteger',
+49: EPSILON
+45: ELEMENT "text:user-index-mark",
+46: SEQUENCE
+47: ATTRIBUTE "text:string-value",
+48: REF 'string',
+49: DATA 'string',
+47: REF 'text-outline-level',
+48: CHOICE
+49: ATTRIBUTE "text:outline-level",
+50: REF 'positiveInteger',
+51: DATA 'positiveInteger',
+49: EPSILON
+47: REF 'text-index-name',
+48: ATTRIBUTE "text:index-name",
+49: REF 'string',
+50: DATA 'string',
+45: ELEMENT "text:alphabetical-index-mark-start",
+46: SEQUENCE
+47: REF 'text-id',
+48: ATTRIBUTE "text:id",
+49: REF 'string',
+50: DATA 'string',
+47: REF 'text-alphabetical-index-mark-attrs',
+48: INTERLEAVE
+49: SEQUENCE
+50: CHOICE
+51: ATTRIBUTE "text:key1",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:key2",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+49: SEQUENCE
+50: CHOICE
+51: ATTRIBUTE "text:string-value-phonetic",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:key1-phonetic",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:key2-phonetic",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:main-entry",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+45: ELEMENT "text:alphabetical-index-mark-end",
+46: REF 'text-id',
+47: ATTRIBUTE "text:id",
+48: REF 'string',
+49: DATA 'string',
+45: ELEMENT "text:alphabetical-index-mark",
+46: SEQUENCE
+47: ATTRIBUTE "text:string-value",
+48: REF 'string',
+49: DATA 'string',
+47: REF 'text-alphabetical-index-mark-attrs',
+48: INTERLEAVE
+49: SEQUENCE
+50: CHOICE
+51: ATTRIBUTE "text:key1",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:key2",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+49: SEQUENCE
+50: CHOICE
+51: ATTRIBUTE "text:string-value-phonetic",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:key1-phonetic",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+50: CHOICE
+51: ATTRIBUTE "text:key2-phonetic",
+52: REF 'string',
+53: DATA 'string',
+51: EPSILON
+49: CHOICE
+50: ATTRIBUTE "text:main-entry",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: EPSILON
+45: ELEMENT "text:bibliography-mark",
+46: SEQUENCE
+47: ATTRIBUTE "text:bibliography-type",
+48: REF 'text-bibliography-types',
+49: CHOICE
+50: VALUE 'article',
+50: VALUE 'book',
+50: VALUE 'booklet',
+50: VALUE 'conference',
+50: VALUE 'custom1',
+50: VALUE 'custom2',
+50: VALUE 'custom3',
+50: VALUE 'custom4',
+50: VALUE 'custom5',
+50: VALUE 'email',
+50: VALUE 'inbook',
+50: VALUE 'incollection',
+50: VALUE 'inproceedings',
+50: VALUE 'journal',
+50: VALUE 'manual',
+50: VALUE 'mastersthesis',
+50: VALUE 'misc',
+50: VALUE 'phdthesis',
+50: VALUE 'proceedings',
+50: VALUE 'techreport',
+50: VALUE 'unpublished',
+50: VALUE 'www',
+47: CHOICE
+48: ONEOREMORE
+49: ATTRIBUTE "text:identifier", "text:address", "text:annote", "text:author", "text:booktitle", "text:chapter", "text:edition", "text:editor", "text:howpublished", "text:institution", "text:journal", "text:month", "text:note", "text:number", "text:organizations", "text:pages", "text:publisher", "text:school", "text:series", "text:title", "text:report-type", "text:volume", "text:year", "text:url", "text:custom1", "text:custom2", "text:custom3", "text:custom4", "text:custom5", "text:isbn", "text:issn",
+50: REF 'string',
+51: DATA 'string',
+48: EPSILON
+47: STRING
+45: ELEMENT "presentation:header",
+46: EPSILON
+45: ELEMENT "presentation:footer",
+46: EPSILON
+45: ELEMENT "presentation:date-time",
+46: EPSILON
+42: EPSILON
+37: EPSILON
+32: ELEMENT "text:deletion",
+33: SEQUENCE
+34: REF 'office-change-info',
+34: CHOICE
+35: ONEOREMORE
+36: REF 'text-content',
+37: CHOICE
+38: REF 'text-h',
+38: REF 'text-p',
+38: REF 'text-list',
+38: REF 'text-numbered-paragraph',
+38: REF 'table-table',
+38: REF 'draw-a',
+38: REF 'text-section',
+38: REF 'text-soft-page-break',
+38: REF 'text-table-of-content',
+38: REF 'text-illustration-index',
+38: REF 'text-table-index',
+38: REF 'text-object-index',
+38: REF 'text-user-index',
+38: REF 'text-alphabetical-index',
+38: REF 'text-bibliography',
+38: REF 'shape',
+39: CHOICE
+40: REF 'draw-rect',
+40: REF 'draw-line',
+40: REF 'draw-polyline',
+40: REF 'draw-polygon',
+40: REF 'draw-regular-polygon',
+40: REF 'draw-path',
+40: REF 'draw-circle',
+40: REF 'draw-ellipse',
+40: REF 'draw-g',
+40: REF 'draw-page-thumbnail',
+40: REF 'draw-frame',
+40: REF 'draw-measure',
+40: REF 'draw-caption',
+40: REF 'draw-connector',
+40: REF 'draw-control',
+40: REF 'dr3d-scene',
+40: REF 'draw-custom-shape',
+38: REF 'change-marks',
+39: CHOICE
+35: EPSILON
+32: ELEMENT "text:format-change",
+33: REF 'office-change-info',
+26: EPSILON
+23: EPSILON
+21: REF 'text-decls',
+22: SEQUENCE
+23: CHOICE
+24: ELEMENT "text:variable-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-variable-decl',
+28: ELEMENT "text:variable-decl",
+29: SEQUENCE
+30: REF 'common-field-name-attlist',
+31: ATTRIBUTE "text:name",
+32: REF 'variableName',
+33: DATA 'string',
+30: REF 'common-value-type-attlist',
+31: ATTRIBUTE "office:value-type",
+32: REF 'valueType',
+33: CHOICE
+34: VALUE 'float',
+34: VALUE 'time',
+34: VALUE 'date',
+34: VALUE 'percentage',
+34: VALUE 'currency',
+34: VALUE 'boolean',
+34: VALUE 'string',
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:sequence-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-sequence-decl',
+28: ELEMENT "text:sequence-decl",
+29: REF 'text-sequence-decl-attlist',
+30: INTERLEAVE
+31: REF 'common-field-name-attlist',
+32: ATTRIBUTE "text:name",
+33: REF 'variableName',
+34: DATA 'string',
+31: ATTRIBUTE "text:display-outline-level",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+31: CHOICE
+32: ATTRIBUTE "text:separation-character",
+33: REF 'character',
+34: DATA 'string',
+32: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:user-field-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-user-field-decl',
+28: ELEMENT "text:user-field-decl",
+29: SEQUENCE
+30: REF 'common-field-name-attlist',
+31: ATTRIBUTE "text:name",
+32: REF 'variableName',
+33: DATA 'string',
+30: CHOICE
+31: REF 'common-field-formula-attlist',
+32: CHOICE
+33: ATTRIBUTE "text:formula",
+34: REF 'formula',
+35: DATA 'string',
+33: EPSILON
+31: EPSILON
+30: REF 'common-value-and-type-attlist',
+31: CHOICE
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'float',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'percentage',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'currency',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+33: CHOICE
+34: ATTRIBUTE "office:currency",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'date',
+33: ATTRIBUTE "office:date-value",
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'time',
+33: ATTRIBUTE "office:time-value",
+34: REF 'duration',
+35: DATA 'duration',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'boolean',
+33: ATTRIBUTE "office:boolean-value",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'string',
+33: CHOICE
+34: ATTRIBUTE "office:string-value",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:dde-connection-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-dde-connection-decl',
+28: ELEMENT "text:dde-connection-decl",
+29: SEQUENCE
+30: REF 'text-dde-connection-decl-attlist',
+31: ATTRIBUTE "office:name",
+32: REF 'string',
+33: DATA 'string',
+30: REF 'common-dde-connection-decl-attlist',
+31: INTERLEAVE
+32: ATTRIBUTE "office:dde-application",
+33: REF 'string',
+34: DATA 'string',
+32: ATTRIBUTE "office:dde-topic",
+33: REF 'string',
+34: DATA 'string',
+32: ATTRIBUTE "office:dde-item",
+33: REF 'string',
+34: DATA 'string',
+32: CHOICE
+33: ATTRIBUTE "office:automatic-update",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: REF 'text-alphabetical-index-auto-mark-file',
+25: ELEMENT "text:alphabetical-index-auto-mark-file",
+26: SEQUENCE
+27: ATTRIBUTE "xlink:href",
+28: REF 'anyURI',
+29: DATA 'anyURI',
+27: CHOICE
+28: ATTRIBUTE "xlink:type",
+29: VALUE 'simple',
+28: EPSILON
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'text-h',
+24: REF 'text-p',
+24: REF 'text-list',
+24: REF 'table-table',
+24: REF 'text-section',
+24: REF 'text-table-of-content',
+24: REF 'text-illustration-index',
+24: REF 'text-table-index',
+24: REF 'text-object-index',
+24: REF 'text-user-index',
+24: REF 'text-alphabetical-index',
+24: REF 'text-bibliography',
+24: REF 'text-index-title',
+24: REF 'change-marks',
+25: CHOICE
+22: EPSILON
+20: SEQUENCE
+21: CHOICE
+22: REF 'style-region-left',
+23: ELEMENT "style:region-left",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-center',
+23: ELEMENT "style:region-center",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-right',
+23: ELEMENT "style:region-right",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+15: CHOICE
+16: REF 'style-header-left',
+17: ELEMENT "style:header-left",
+18: SEQUENCE
+19: REF 'common-style-header-footer-attlist',
+20: CHOICE
+21: ATTRIBUTE "style:display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+19: REF 'header-footer-content',
+20: CHOICE
+21: SEQUENCE
+22: REF 'text-tracked-changes',
+23: CHOICE
+22: REF 'text-decls',
+23: SEQUENCE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+25: REF 'text-alphabetical-index-auto-mark-file',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: CHOICE
+25: REF 'text-h',
+25: REF 'text-p',
+25: REF 'text-list',
+25: REF 'table-table',
+25: REF 'text-section',
+25: REF 'text-table-of-content',
+25: REF 'text-illustration-index',
+25: REF 'text-table-index',
+25: REF 'text-object-index',
+25: REF 'text-user-index',
+25: REF 'text-alphabetical-index',
+25: REF 'text-bibliography',
+25: REF 'text-index-title',
+25: REF 'change-marks',
+26: CHOICE
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'style-region-left',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-center',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-right',
+23: EPSILON
+16: EPSILON
+14: EPSILON
+13: CHOICE
+14: SEQUENCE
+15: REF 'style-footer',
+16: ELEMENT "style:footer",
+17: SEQUENCE
+18: REF 'common-style-header-footer-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:display",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+18: REF 'header-footer-content',
+19: CHOICE
+20: SEQUENCE
+21: REF 'text-tracked-changes',
+22: CHOICE
+21: REF 'text-decls',
+22: SEQUENCE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+24: REF 'text-alphabetical-index-auto-mark-file',
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'text-h',
+24: REF 'text-p',
+24: REF 'text-list',
+24: REF 'table-table',
+24: REF 'text-section',
+24: REF 'text-table-of-content',
+24: REF 'text-illustration-index',
+24: REF 'text-table-index',
+24: REF 'text-object-index',
+24: REF 'text-user-index',
+24: REF 'text-alphabetical-index',
+24: REF 'text-bibliography',
+24: REF 'text-index-title',
+24: REF 'change-marks',
+25: CHOICE
+22: EPSILON
+20: SEQUENCE
+21: CHOICE
+22: REF 'style-region-left',
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-center',
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-right',
+22: EPSILON
+15: CHOICE
+16: REF 'style-footer-left',
+17: ELEMENT "style:footer-left",
+18: SEQUENCE
+19: REF 'common-style-header-footer-attlist',
+20: CHOICE
+21: ATTRIBUTE "style:display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+19: REF 'header-footer-content',
+20: CHOICE
+21: SEQUENCE
+22: REF 'text-tracked-changes',
+23: CHOICE
+22: REF 'text-decls',
+23: SEQUENCE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+25: REF 'text-alphabetical-index-auto-mark-file',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: CHOICE
+25: REF 'text-h',
+25: REF 'text-p',
+25: REF 'text-list',
+25: REF 'table-table',
+25: REF 'text-section',
+25: REF 'text-table-of-content',
+25: REF 'text-illustration-index',
+25: REF 'text-table-index',
+25: REF 'text-object-index',
+25: REF 'text-user-index',
+25: REF 'text-alphabetical-index',
+25: REF 'text-bibliography',
+25: REF 'text-index-title',
+25: REF 'change-marks',
+26: CHOICE
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'style-region-left',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-center',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-right',
+23: EPSILON
+16: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'office-forms',
+15: CHOICE
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'style-style',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'shape',
+16: CHOICE
+17: REF 'draw-rect',
+17: REF 'draw-line',
+17: REF 'draw-polyline',
+17: REF 'draw-polygon',
+17: REF 'draw-regular-polygon',
+17: REF 'draw-path',
+17: REF 'draw-circle',
+17: REF 'draw-ellipse',
+17: REF 'draw-g',
+17: REF 'draw-page-thumbnail',
+17: REF 'draw-frame',
+17: REF 'draw-measure',
+17: REF 'draw-caption',
+17: REF 'draw-connector',
+17: REF 'draw-control',
+17: REF 'dr3d-scene',
+17: REF 'draw-custom-shape',
+14: EPSILON
+13: CHOICE
+14: REF 'presentation-notes',
+15: ELEMENT "presentation:notes",
+16: SEQUENCE
+17: REF 'common-presentation-header-footer-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: ATTRIBUTE "presentation:use-header-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:use-footer-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:use-date-time-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+17: REF 'presentation-notes-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: ATTRIBUTE "style:page-layout-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "draw:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+17: REF 'office-forms',
+18: CHOICE
+17: CHOICE
+18: ONEOREMORE
+19: REF 'shape',
+20: CHOICE
+21: REF 'draw-rect',
+21: REF 'draw-line',
+21: REF 'draw-polyline',
+21: REF 'draw-polygon',
+21: REF 'draw-regular-polygon',
+21: REF 'draw-path',
+21: REF 'draw-circle',
+21: REF 'draw-ellipse',
+21: REF 'draw-g',
+21: REF 'draw-page-thumbnail',
+21: REF 'draw-frame',
+21: REF 'draw-measure',
+21: REF 'draw-caption',
+21: REF 'draw-connector',
+21: REF 'draw-control',
+21: REF 'dr3d-scene',
+21: REF 'draw-custom-shape',
+18: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'style-handout-master',
+10: ELEMENT "style:handout-master",
+11: SEQUENCE
+12: REF 'common-presentation-header-footer-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "presentation:use-header-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "presentation:use-footer-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "presentation:use-date-time-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+12: REF 'style-handout-master-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "presentation:presentation-page-layout-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+14: ATTRIBUTE "style:page-layout-name",
+15: REF 'styleNameRef',
+16: CHOICE
+17: DATA 'NCName',
+17: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:style-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+12: CHOICE
+13: ONEOREMORE
+14: REF 'shape',
+15: CHOICE
+16: REF 'draw-rect',
+16: REF 'draw-line',
+16: REF 'draw-polyline',
+16: REF 'draw-polygon',
+16: REF 'draw-regular-polygon',
+16: REF 'draw-path',
+16: REF 'draw-circle',
+16: REF 'draw-ellipse',
+16: REF 'draw-g',
+16: REF 'draw-page-thumbnail',
+16: REF 'draw-frame',
+16: REF 'draw-measure',
+16: REF 'draw-caption',
+16: REF 'draw-connector',
+16: REF 'draw-control',
+16: REF 'dr3d-scene',
+16: REF 'draw-custom-shape',
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'draw-layer-set',
+10: ELEMENT "draw:layer-set",
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-layer',
+14: ELEMENT "draw:layer",
+15: SEQUENCE
+16: REF 'draw-layer-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "draw:name",
+19: REF 'string',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "draw:protected",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:display",
+20: CHOICE
+21: VALUE 'always',
+21: VALUE 'screen',
+21: VALUE 'printer',
+21: VALUE 'none',
+19: EPSILON
+16: CHOICE
+17: REF 'svg-title',
+17: EPSILON
+16: CHOICE
+17: REF 'svg-desc',
+17: EPSILON
+12: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-body',
+5: ELEMENT "office:body",
+6: REF 'office-body-content',
+7: CHOICE
+8: ELEMENT "office:text",
+9: SEQUENCE
+10: REF 'office-text-attlist',
+11: INTERLEAVE
+12: CHOICE
+13: ATTRIBUTE "text:global",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+12: CHOICE
+13: ATTRIBUTE "text:use-soft-page-breaks",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+10: REF 'office-text-content-prelude',
+11: SEQUENCE
+12: REF 'office-forms',
+13: CHOICE
+12: REF 'text-tracked-changes',
+13: CHOICE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+16: ELEMENT "table:calculation-settings",
+17: SEQUENCE
+18: REF 'table-calculation-setting-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:case-sensitive",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:precision-as-shown",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:search-criteria-must-apply-to-whole-cell",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:automatic-find-labels",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:use-regular-expressions",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:null-year",
+22: REF 'positiveInteger',
+23: DATA 'positiveInteger',
+21: EPSILON
+18: CHOICE
+19: REF 'table-null-date',
+20: ELEMENT "table:null-date",
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "table:value-type",
+24: REF 'valueType',
+25: CHOICE
+26: VALUE 'float',
+26: VALUE 'time',
+26: VALUE 'date',
+26: VALUE 'percentage',
+26: VALUE 'currency',
+26: VALUE 'boolean',
+26: VALUE 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:date-value",
+24: REF 'date',
+25: DATA 'date',
+23: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'table-iteration',
+20: ELEMENT "table:iteration",
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "table:status",
+24: CHOICE
+25: VALUE 'enable',
+25: VALUE 'disable',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:steps",
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:maximum-difference",
+24: REF 'double',
+25: DATA 'double',
+23: EPSILON
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+16: ELEMENT "table:content-validations",
+17: ONEOREMORE
+18: REF 'table-content-validation',
+19: ELEMENT "table:content-validation",
+20: SEQUENCE
+21: REF 'table-validation-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:condition",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:allow-empty-cell",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:display-list",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'unsorted',
+26: VALUE 'sort-ascending',
+24: EPSILON
+21: CHOICE
+22: REF 'table-help-message',
+23: ELEMENT "table:help-message",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:title",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'table-error-message',
+23: ELEMENT "table:error-message",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:title",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:message-type",
+27: CHOICE
+28: VALUE 'stop',
+28: VALUE 'warning',
+28: VALUE 'information',
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: SEQUENCE
+23: REF 'table-error-macro',
+24: ELEMENT "table:error-macro",
+25: CHOICE
+26: ATTRIBUTE "table:execute",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: CHOICE
+24: REF 'office-event-listeners',
+24: EPSILON
+22: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+16: ELEMENT "table:label-ranges",
+17: CHOICE
+18: ONEOREMORE
+19: REF 'table-label-range',
+20: ELEMENT "table:label-range",
+21: REF 'table-label-range-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:label-cell-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: ATTRIBUTE "table:data-cell-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: ATTRIBUTE "table:orientation",
+24: CHOICE
+25: VALUE 'column',
+25: VALUE 'row',
+18: EPSILON
+15: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'office-text-content-main',
+13: CHOICE
+14: ONEOREMORE
+15: REF 'text-content',
+16: CHOICE
+17: REF 'text-h',
+17: REF 'text-p',
+17: REF 'text-list',
+17: REF 'text-numbered-paragraph',
+17: REF 'table-table',
+17: REF 'draw-a',
+17: REF 'text-section',
+17: REF 'text-soft-page-break',
+17: REF 'text-table-of-content',
+17: REF 'text-illustration-index',
+17: REF 'text-table-index',
+17: REF 'text-object-index',
+17: REF 'text-user-index',
+17: REF 'text-alphabetical-index',
+17: REF 'text-bibliography',
+17: REF 'shape',
+18: CHOICE
+19: REF 'draw-rect',
+19: REF 'draw-line',
+19: REF 'draw-polyline',
+19: REF 'draw-polygon',
+19: REF 'draw-regular-polygon',
+19: REF 'draw-path',
+19: REF 'draw-circle',
+19: REF 'draw-ellipse',
+19: REF 'draw-g',
+19: REF 'draw-page-thumbnail',
+19: REF 'draw-frame',
+19: REF 'draw-measure',
+19: REF 'draw-caption',
+19: REF 'draw-connector',
+19: REF 'draw-control',
+19: REF 'dr3d-scene',
+19: REF 'draw-custom-shape',
+17: REF 'change-marks',
+18: CHOICE
+14: EPSILON
+14: SEQUENCE
+15: REF 'text-page-sequence',
+16: ELEMENT "text:page-sequence",
+17: ONEOREMORE
+18: REF 'text-page',
+19: ELEMENT "text:page",
+20: REF 'text-page-attlist',
+21: ATTRIBUTE "text:master-page-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: CHOICE
+18: REF 'draw-a',
+18: REF 'shape',
+19: CHOICE
+20: REF 'draw-rect',
+20: REF 'draw-line',
+20: REF 'draw-polyline',
+20: REF 'draw-polygon',
+20: REF 'draw-regular-polygon',
+20: REF 'draw-path',
+20: REF 'draw-circle',
+20: REF 'draw-ellipse',
+20: REF 'draw-g',
+20: REF 'draw-page-thumbnail',
+20: REF 'draw-frame',
+20: REF 'draw-measure',
+20: REF 'draw-caption',
+20: REF 'draw-connector',
+20: REF 'draw-control',
+20: REF 'dr3d-scene',
+20: REF 'draw-custom-shape',
+16: EPSILON
+11: EPSILON
+10: REF 'office-text-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+15: ELEMENT "table:named-expressions",
+16: CHOICE
+17: ONEOREMORE
+18: CHOICE
+19: REF 'table-named-range',
+20: ELEMENT "table:named-range",
+21: REF 'table-named-range-attlist',
+22: SEQUENCE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: ATTRIBUTE "table:cell-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:range-usable-as",
+25: CHOICE
+26: VALUE 'none',
+26: LIST
+27: ONEOREMORE
+28: CHOICE
+29: VALUE 'print-range',
+29: VALUE 'filter',
+29: VALUE 'repeat-row',
+29: VALUE 'repeat-column',
+24: EPSILON
+19: REF 'table-named-expression',
+20: ELEMENT "table:named-expression",
+21: REF 'table-named-expression-attlist',
+22: SEQUENCE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: ATTRIBUTE "table:expression",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+15: ELEMENT "table:database-ranges",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'table-database-range',
+19: ELEMENT "table:database-range",
+20: SEQUENCE
+21: REF 'table-database-range-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "table:name",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:is-selection",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:on-update-keep-styles",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:on-update-keep-size",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:has-persistent-data",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:orientation",
+25: CHOICE
+26: VALUE 'column',
+26: VALUE 'row',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:contains-header",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:display-filter-buttons",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: ATTRIBUTE "table:target-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:refresh-delay",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: CHOICE
+22: REF 'table-database-source-sql',
+23: ELEMENT "table:database-source-sql",
+24: REF 'table-database-source-sql-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:sql-statement",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "table:parse-sql-statement",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+22: REF 'table-database-source-table',
+23: ELEMENT "table:database-source-query",
+24: REF 'table-database-source-query-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:query-name",
+27: REF 'string',
+28: DATA 'string',
+22: REF 'table-database-source-query',
+23: ELEMENT "table:database-source-table",
+24: REF 'table-database-source-table-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:database-table-name",
+27: REF 'string',
+28: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: REF 'table-filter',
+23: ELEMENT "table:filter",
+24: SEQUENCE
+25: REF 'table-filter-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:target-range-address",
+29: REF 'cellRangeAddress',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:condition-source",
+29: CHOICE
+30: VALUE 'self',
+30: VALUE 'cell-range',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:condition-source-range-address",
+29: REF 'cellRangeAddress',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:display-duplicates",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: CHOICE
+26: REF 'table-filter-condition',
+27: ELEMENT "table:filter-condition",
+28: REF 'table-filter-condition-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-number",
+31: REF 'nonNegativeInteger',
+32: DATA 'nonNegativeInteger',
+30: ATTRIBUTE "table:value",
+31: REF 'string',
+32: DATA 'string',
+30: ATTRIBUTE "table:operator",
+31: REF 'string',
+32: DATA 'string',
+30: CHOICE
+31: ATTRIBUTE "table:case-sensitive",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+31: EPSILON
+26: REF 'table-filter-and',
+27: ELEMENT "table:filter-and",
+28: ONEOREMORE
+29: CHOICE
+30: REF 'table-filter-or',
+31: ELEMENT "table:filter-or",
+32: ONEOREMORE
+33: CHOICE
+34: REF 'table-filter-and',
+34: REF 'table-filter-condition',
+30: REF 'table-filter-condition',
+26: REF 'table-filter-or',
+22: EPSILON
+21: CHOICE
+22: REF 'table-sort',
+23: ELEMENT "table:sort",
+24: SEQUENCE
+25: REF 'table-sort-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:bind-styles-to-content",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:target-range-address",
+29: REF 'cellRangeAddress',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:case-sensitive",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:language",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:country",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:algorithm",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: ONEOREMORE
+26: REF 'table-sort-by',
+27: ELEMENT "table:sort-by",
+28: REF 'table-sort-by-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-number",
+31: REF 'nonNegativeInteger',
+32: DATA 'nonNegativeInteger',
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+33: VALUE 'automatic',
+33: REF 'string',
+34: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:order",
+32: CHOICE
+33: VALUE 'ascending',
+33: VALUE 'descending',
+31: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'table-subtotal-rules',
+23: ELEMENT "table:subtotal-rules",
+24: SEQUENCE
+25: REF 'table-subtotal-rules-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:bind-styles-to-content",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:case-sensitive",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:page-breaks-on-group-change",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: CHOICE
+26: REF 'table-sort-groups',
+27: ELEMENT "table:sort-groups",
+28: REF 'table-sort-groups-attlist',
+29: INTERLEAVE
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+33: VALUE 'automatic',
+33: REF 'string',
+34: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:order",
+32: CHOICE
+33: VALUE 'ascending',
+33: VALUE 'descending',
+31: EPSILON
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'table-subtotal-rule',
+28: ELEMENT "table:subtotal-rule",
+29: SEQUENCE
+30: REF 'table-subtotal-rule-attlist',
+31: ATTRIBUTE "table:group-by-field-number",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+30: CHOICE
+31: ONEOREMORE
+32: REF 'table-subtotal-field',
+33: ELEMENT "table:subtotal-field",
+34: REF 'table-subtotal-field-attlist',
+35: INTERLEAVE
+36: ATTRIBUTE "table:field-number",
+37: REF 'nonNegativeInteger',
+38: DATA 'nonNegativeInteger',
+36: ATTRIBUTE "table:function",
+37: CHOICE
+38: VALUE 'auto',
+38: VALUE 'average',
+38: VALUE 'count',
+38: VALUE 'countnums',
+38: VALUE 'max',
+38: VALUE 'min',
+38: VALUE 'product',
+38: VALUE 'stdev',
+38: VALUE 'stdevp',
+38: VALUE 'sum',
+38: VALUE 'var',
+38: VALUE 'varp',
+38: REF 'string',
+39: DATA 'string',
+31: EPSILON
+26: EPSILON
+22: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+15: ELEMENT "table:data-pilot-tables",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'table-data-pilot-table',
+19: ELEMENT "table:data-pilot-table",
+20: SEQUENCE
+21: REF 'table-data-pilot-table-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:application-data",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:grand-total",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'both',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:ignore-empty-rows",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:identify-categories",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: ATTRIBUTE "table:target-range-address",
+24: REF 'cellRangeAddress',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:buttons",
+25: REF 'cellRangeAddressList',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:show-filter-button",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:drill-down-on-double-click",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: CHOICE
+22: REF 'table-database-source-sql',
+22: REF 'table-database-source-table',
+22: REF 'table-database-source-query',
+22: REF 'table-source-service',
+23: ELEMENT "table:source-service",
+24: REF 'table-source-service-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:source-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:object-name",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "table:user-name",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:password",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+22: REF 'table-source-cell-range',
+23: ELEMENT "table:source-cell-range",
+24: SEQUENCE
+25: REF 'table-source-cell-range-attlist',
+26: ATTRIBUTE "table:cell-range-address",
+27: REF 'cellRangeAddress',
+28: DATA 'string',
+25: CHOICE
+26: REF 'table-filter',
+26: EPSILON
+22: EPSILON
+21: ONEOREMORE
+22: REF 'table-data-pilot-field',
+23: ELEMENT "table:data-pilot-field",
+24: SEQUENCE
+25: REF 'table-data-pilot-field-attlist',
+26: INTERLEAVE
+27: ATTRIBUTE "table:source-field-name",
+28: REF 'string',
+29: DATA 'string',
+27: CHOICE
+28: ATTRIBUTE "table:orientation",
+29: CHOICE
+30: VALUE 'row',
+30: VALUE 'column',
+30: VALUE 'data',
+30: VALUE 'hidden',
+28: SEQUENCE
+29: ATTRIBUTE "table:orientation",
+30: VALUE 'page',
+29: ATTRIBUTE "table:selected-page",
+30: REF 'string',
+31: DATA 'string',
+27: CHOICE
+28: ATTRIBUTE "table:is-data-layout-field",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:function",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'average',
+30: VALUE 'count',
+30: VALUE 'countnums',
+30: VALUE 'max',
+30: VALUE 'min',
+30: VALUE 'product',
+30: VALUE 'stdev',
+30: VALUE 'stdevp',
+30: VALUE 'sum',
+30: VALUE 'var',
+30: VALUE 'varp',
+30: REF 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:used-hierarchy",
+29: REF 'integer',
+30: DATA 'integer',
+28: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-level',
+27: ELEMENT "table:data-pilot-level",
+28: SEQUENCE
+29: REF 'table-data-pilot-level-attlist',
+30: CHOICE
+31: ATTRIBUTE "table:show-empty",
+32: REF 'boolean',
+33: CHOICE
+34: VALUE 'true',
+34: VALUE 'false',
+31: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-subtotals',
+31: ELEMENT "table:data-pilot-subtotals",
+32: CHOICE
+33: ONEOREMORE
+34: REF 'table-data-pilot-subtotal',
+35: ELEMENT "table:data-pilot-subtotal",
+36: REF 'table-data-pilot-subtotal-attlist',
+37: ATTRIBUTE "table:function",
+38: CHOICE
+39: VALUE 'auto',
+39: VALUE 'average',
+39: VALUE 'count',
+39: VALUE 'countnums',
+39: VALUE 'max',
+39: VALUE 'min',
+39: VALUE 'product',
+39: VALUE 'stdev',
+39: VALUE 'stdevp',
+39: VALUE 'sum',
+39: VALUE 'var',
+39: VALUE 'varp',
+39: REF 'string',
+40: DATA 'string',
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-members',
+31: ELEMENT "table:data-pilot-members",
+32: CHOICE
+33: ONEOREMORE
+34: REF 'table-data-pilot-member',
+35: ELEMENT "table:data-pilot-member",
+36: REF 'table-data-pilot-member-attlist',
+37: INTERLEAVE
+38: ATTRIBUTE "table:name",
+39: REF 'string',
+40: DATA 'string',
+38: CHOICE
+39: ATTRIBUTE "table:display",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+38: CHOICE
+39: ATTRIBUTE "table:show-details",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-display-info',
+31: ELEMENT "table:data-pilot-display-info",
+32: REF 'table-data-pilot-display-info-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "table:enabled",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: ATTRIBUTE "table:data-field",
+35: REF 'string',
+36: DATA 'string',
+34: ATTRIBUTE "table:member-count",
+35: REF 'nonNegativeInteger',
+36: DATA 'nonNegativeInteger',
+34: ATTRIBUTE "table:display-member-mode",
+35: CHOICE
+36: VALUE 'from-top',
+36: VALUE 'from-bottom',
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-sort-info',
+31: ELEMENT "table:data-pilot-sort-info",
+32: REF 'table-data-pilot-sort-info-attlist',
+33: INTERLEAVE
+34: CHOICE
+35: SEQUENCE
+36: ATTRIBUTE "table:sort-mode",
+37: VALUE 'data',
+36: ATTRIBUTE "table:data-field",
+37: REF 'string',
+38: DATA 'string',
+35: ATTRIBUTE "table:sort-mode",
+36: CHOICE
+37: VALUE 'none',
+37: VALUE 'manual',
+37: VALUE 'name',
+34: ATTRIBUTE "table:order",
+35: CHOICE
+36: VALUE 'ascending',
+36: VALUE 'descending',
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-layout-info',
+31: ELEMENT "table:data-pilot-layout-info",
+32: REF 'table-data-pilot-layout-info-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "table:layout-mode",
+35: CHOICE
+36: VALUE 'tabular-layout',
+36: VALUE 'outline-subtotals-top',
+36: VALUE 'outline-subtotals-bottom',
+34: ATTRIBUTE "table:add-empty-lines",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+30: EPSILON
+26: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-field-reference',
+27: ELEMENT "table:data-pilot-field-reference",
+28: REF 'table-data-pilot-field-reference-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-name",
+31: REF 'string',
+32: DATA 'string',
+30: CHOICE
+31: SEQUENCE
+32: ATTRIBUTE "table:member-type",
+33: VALUE 'named',
+32: ATTRIBUTE "table:member-name",
+33: REF 'string',
+34: DATA 'string',
+31: ATTRIBUTE "table:member-type",
+32: CHOICE
+33: VALUE 'previous',
+33: VALUE 'next',
+30: ATTRIBUTE "table:type",
+31: CHOICE
+32: VALUE 'none',
+32: VALUE 'member-difference',
+32: VALUE 'member-percentage',
+32: VALUE 'member-percentage-difference',
+32: VALUE 'running-total',
+32: VALUE 'row-percentage',
+32: VALUE 'column-percentage',
+32: VALUE 'total-percentage',
+32: VALUE 'index',
+26: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-groups',
+27: ELEMENT "table:data-pilot-groups",
+28: SEQUENCE
+29: REF 'table-data-pilot-groups-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:source-field-name",
+32: REF 'string',
+33: DATA 'string',
+31: CHOICE
+32: ATTRIBUTE "table:date-start",
+33: CHOICE
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+34: VALUE 'auto',
+32: ATTRIBUTE "table:start",
+33: CHOICE
+34: REF 'double',
+35: DATA 'double',
+34: VALUE 'auto',
+31: CHOICE
+32: ATTRIBUTE "table:date-end",
+33: CHOICE
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+34: VALUE 'auto',
+32: ATTRIBUTE "table:end",
+33: CHOICE
+34: REF 'double',
+35: DATA 'double',
+34: VALUE 'auto',
+31: ATTRIBUTE "table:step",
+32: REF 'double',
+33: DATA 'double',
+31: ATTRIBUTE "table:grouped-by",
+32: CHOICE
+33: VALUE 'seconds',
+33: VALUE 'minutes',
+33: VALUE 'hours',
+33: VALUE 'days',
+33: VALUE 'months',
+33: VALUE 'quarters',
+33: VALUE 'years',
+29: ONEOREMORE
+30: REF 'table-data-pilot-group',
+31: ELEMENT "table:data-pilot-group",
+32: SEQUENCE
+33: REF 'table-data-pilot-group-attlist',
+34: ATTRIBUTE "table:name",
+35: REF 'string',
+36: DATA 'string',
+33: ONEOREMORE
+34: REF 'table-data-pilot-group-member',
+35: ELEMENT "table:data-pilot-group-member",
+36: REF 'table-data-pilot-group-member-attlist',
+37: ATTRIBUTE "table:name",
+38: REF 'string',
+39: DATA 'string',
+26: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+15: ELEMENT "table:consolidation",
+16: REF 'table-consolidation-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "table:function",
+19: CHOICE
+20: VALUE 'auto',
+20: VALUE 'average',
+20: VALUE 'count',
+20: VALUE 'countnums',
+20: VALUE 'max',
+20: VALUE 'min',
+20: VALUE 'product',
+20: VALUE 'stdev',
+20: VALUE 'stdevp',
+20: VALUE 'sum',
+20: VALUE 'var',
+20: VALUE 'varp',
+20: REF 'string',
+21: DATA 'string',
+18: ATTRIBUTE "table:source-cell-range-addresses",
+19: REF 'cellRangeAddressList',
+20: DATA 'string',
+18: ATTRIBUTE "table:target-cell-address",
+19: REF 'cellAddress',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "table:use-labels",
+20: CHOICE
+21: VALUE 'none',
+21: VALUE 'row',
+21: VALUE 'column',
+21: VALUE 'both',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:link-to-source-data",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+15: ELEMENT "table:dde-links",
+16: ONEOREMORE
+17: REF 'table-dde-link',
+18: ELEMENT "table:dde-link",
+19: SEQUENCE
+20: REF 'office-dde-source',
+20: REF 'table-table',
+14: EPSILON
+8: ELEMENT "office:drawing",
+9: SEQUENCE
+10: REF 'office-drawing-attlist',
+11: EPSILON
+10: REF 'office-drawing-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-drawing-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-page',
+14: ELEMENT "draw:page",
+15: SEQUENCE
+16: REF 'common-presentation-header-footer-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "presentation:use-header-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:use-footer-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:use-date-time-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+16: REF 'draw-page-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "draw:name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: ATTRIBUTE "draw:master-page-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:presentation-page-layout-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:id",
+20: REF 'ID',
+21: DATA 'ID',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:nav-order",
+20: REF 'IDREFS',
+21: DATA 'IDREFS',
+19: EPSILON
+16: CHOICE
+17: REF 'office-forms',
+18: CHOICE
+17: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'shape',
+19: CHOICE
+20: REF 'draw-rect',
+20: REF 'draw-line',
+20: REF 'draw-polyline',
+20: REF 'draw-polygon',
+20: REF 'draw-regular-polygon',
+20: REF 'draw-path',
+20: REF 'draw-circle',
+20: REF 'draw-ellipse',
+20: REF 'draw-g',
+20: REF 'draw-page-thumbnail',
+20: REF 'draw-frame',
+20: REF 'draw-measure',
+20: REF 'draw-caption',
+20: REF 'draw-connector',
+20: REF 'draw-control',
+20: REF 'dr3d-scene',
+20: REF 'draw-custom-shape',
+17: EPSILON
+16: CHOICE
+17: REF 'presentation-animations',
+18: ELEMENT "presentation:animations",
+19: CHOICE
+20: ONEOREMORE
+21: CHOICE
+22: REF 'presentation-animation-elements',
+23: CHOICE
+24: REF 'presentation-show-shape',
+25: ELEMENT "presentation:show-shape",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-show-text',
+25: ELEMENT "presentation:show-text",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-hide-shape',
+25: ELEMENT "presentation:hide-shape",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-hide-text',
+25: ELEMENT "presentation:hide-text",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: STRING
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-dim',
+25: ELEMENT "presentation:dim",
+26: SEQUENCE
+27: REF 'presentation-dim-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: ATTRIBUTE "draw:color",
+30: REF 'color',
+31: DATA 'string',
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-play',
+25: ELEMENT "presentation:play",
+26: REF 'presentation-play-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "draw:shape-id",
+29: REF 'IDREF',
+30: DATA 'IDREF',
+28: CHOICE
+29: ATTRIBUTE "presentation:speed",
+30: REF 'presentationSpeeds',
+31: CHOICE
+32: VALUE 'slow',
+32: VALUE 'medium',
+32: VALUE 'fast',
+29: EPSILON
+22: REF 'presentation-animation-group',
+23: ELEMENT "presentation:animation-group",
+24: CHOICE
+25: ONEOREMORE
+26: REF 'presentation-animation-elements',
+27: CHOICE
+28: REF 'presentation-show-shape',
+28: REF 'presentation-show-text',
+28: REF 'presentation-hide-shape',
+28: REF 'presentation-hide-text',
+28: REF 'presentation-dim',
+28: REF 'presentation-play',
+25: EPSILON
+20: EPSILON
+17: REF 'animation-element',
+18: CHOICE
+19: ELEMENT "anim:animate",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-anim-spline-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:calcMode",
+24: CHOICE
+25: VALUE 'discrete',
+25: VALUE 'linear',
+25: VALUE 'paced',
+25: VALUE 'spline',
+23: EPSILON
+21: REF 'common-spline-anim-value-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:keyTimes",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:keySplines",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+19: ELEMENT "anim:set",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-set-values-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:to",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+19: ELEMENT "anim:animateMotion",
+20: SEQUENCE
+21: REF 'anim-animate-motion-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "svg:path",
+25: REF 'pathData',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "svg:origin",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:calcMode",
+25: CHOICE
+26: VALUE 'discrete',
+26: VALUE 'linear',
+26: VALUE 'paced',
+26: VALUE 'spline',
+24: EPSILON
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-spline-anim-value-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:keyTimes",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:keySplines",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+19: ELEMENT "anim:animateColor",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-anim-spline-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:calcMode",
+24: CHOICE
+25: VALUE 'discrete',
+25: VALUE 'linear',
+25: VALUE 'paced',
+25: VALUE 'spline',
+23: EPSILON
+21: REF 'common-spline-anim-value-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:keyTimes",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:keySplines",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'anim-animate-color-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "anim:color-interpolation",
+25: CHOICE
+26: VALUE 'rgb',
+26: VALUE 'hsl',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:color-interpolation-direction",
+25: CHOICE
+26: VALUE 'clockwise',
+26: VALUE 'counter-clockwise',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+19: ELEMENT "anim:animateTransform",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-named-target-attlist',
+22: ATTRIBUTE "smil:attributeName",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'anim-animate-transform-attlist',
+22: ATTRIBUTE "svg:type",
+23: CHOICE
+24: VALUE 'translate',
+24: VALUE 'scale',
+24: VALUE 'rotate',
+24: VALUE 'skewX',
+24: VALUE 'skewY',
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+19: ELEMENT "anim:transitionFilter",
+20: SEQUENCE
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-add-accum-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:accumulate",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'sum',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:additive",
+25: CHOICE
+26: VALUE 'replace',
+26: VALUE 'sum',
+24: EPSILON
+21: REF 'common-anim-values-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:values",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:formula",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: SEQUENCE
+24: REF 'common-anim-set-values-attlist',
+25: CHOICE
+26: ATTRIBUTE "smil:to",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:from",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:by",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: REF 'common-anim-spline-mode-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:calcMode",
+24: CHOICE
+25: VALUE 'discrete',
+25: VALUE 'linear',
+25: VALUE 'paced',
+25: VALUE 'spline',
+23: EPSILON
+21: REF 'anim-transition-filter-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "smil:type",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "smil:subtype",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:direction",
+25: CHOICE
+26: VALUE 'forward',
+26: VALUE 'reverse',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:fadeColor",
+25: CHOICE
+26: VALUE 'forward',
+26: VALUE 'reverse',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:mode",
+25: CHOICE
+26: VALUE 'in',
+26: VALUE 'out',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+19: ELEMENT "anim:par",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-endsync-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:endsync",
+24: CHOICE
+25: VALUE 'first',
+25: VALUE 'last',
+25: VALUE 'all',
+25: VALUE 'media',
+23: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: REF 'animation-element',
+24: CHOICE
+22: EPSILON
+19: ELEMENT "anim:seq",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'common-endsync-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:endsync",
+24: CHOICE
+25: VALUE 'first',
+25: VALUE 'last',
+25: VALUE 'all',
+25: VALUE 'media',
+23: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: REF 'animation-element',
+24: CHOICE
+22: EPSILON
+19: ELEMENT "anim:iterate",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'anim-iterate-attlist',
+22: INTERLEAVE
+23: REF 'common-anim-target-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:targetElement",
+27: REF 'IDREF',
+28: DATA 'IDREF',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "anim:sub-item",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:iterate-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:iterate-interval",
+25: REF 'duration',
+26: DATA 'duration',
+24: EPSILON
+21: REF 'common-timing-attlist',
+22: SEQUENCE
+23: REF 'common-basic-timing-attlist',
+24: SEQUENCE
+25: REF 'common-begin-end-timing-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "smil:begin",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:end",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-dur-timing-attlist',
+26: CHOICE
+27: ATTRIBUTE "smil:dur",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-repeat-timing-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "smil:repeatDur",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "smil:repeatCount",
+29: CHOICE
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+30: VALUE 'indefinite',
+28: EPSILON
+23: REF 'common-restart-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restart",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'default',
+25: EPSILON
+23: REF 'common-restart-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:restartDefault",
+26: CHOICE
+27: VALUE 'never',
+27: VALUE 'always',
+27: VALUE 'whenNotActive',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-fill-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fill",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'auto',
+27: VALUE 'default',
+27: VALUE 'transition',
+25: EPSILON
+23: REF 'common-fill-default-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:fillDefault",
+26: CHOICE
+27: VALUE 'remove',
+27: VALUE 'freeze',
+27: VALUE 'hold',
+27: VALUE 'transition',
+27: VALUE 'auto',
+27: VALUE 'inherit',
+25: EPSILON
+23: REF 'common-time-manip-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:accelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:decelerate",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:autoReverse",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+21: REF 'common-endsync-timing-attlist',
+22: CHOICE
+23: ATTRIBUTE "smil:endsync",
+24: CHOICE
+25: VALUE 'first',
+25: VALUE 'last',
+25: VALUE 'all',
+25: VALUE 'media',
+23: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: REF 'animation-element',
+24: CHOICE
+22: EPSILON
+19: ELEMENT "anim:audio",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'anim-audio-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "xlink:href",
+25: REF 'anyURI',
+26: DATA 'anyURI',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:audio-level",
+25: REF 'double',
+26: DATA 'double',
+24: EPSILON
+21: REF 'common-basic-timing-attlist',
+22: SEQUENCE
+23: REF 'common-begin-end-timing-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "smil:begin",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:end",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+23: REF 'common-dur-timing-attlist',
+24: CHOICE
+25: ATTRIBUTE "smil:dur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+23: REF 'common-repeat-timing-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "smil:repeatDur",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:repeatCount",
+27: CHOICE
+28: REF 'nonNegativeInteger',
+29: DATA 'nonNegativeInteger',
+28: VALUE 'indefinite',
+26: EPSILON
+19: ELEMENT "anim:command",
+20: SEQUENCE
+21: REF 'common-anim-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:node-type",
+25: CHOICE
+26: VALUE 'default',
+26: VALUE 'on-click',
+26: VALUE 'with-previous',
+26: VALUE 'after-previous',
+26: VALUE 'timing-root',
+26: VALUE 'main-sequence',
+26: VALUE 'interactive-sequence',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-sub-type",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:preset-class",
+25: CHOICE
+26: VALUE 'custom',
+26: VALUE 'entrance',
+26: VALUE 'exit',
+26: VALUE 'emphasis',
+26: VALUE 'motion-path',
+26: VALUE 'ole-action',
+26: VALUE 'media-call',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:master-element",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "presentation:group-id",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:id",
+25: REF 'ID',
+26: DATA 'ID',
+24: EPSILON
+21: REF 'anim-command-attlist',
+22: ATTRIBUTE "anim:command",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-begin-end-timing-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:begin",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "smil:end",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: REF 'common-anim-target-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "smil:targetElement",
+25: REF 'IDREF',
+26: DATA 'IDREF',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "anim:sub-item",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: ELEMENT "anim:param",
+24: SEQUENCE
+25: ATTRIBUTE "anim:name",
+26: STRING
+25: ATTRIBUTE "anim:value",
+26: STRING
+22: EPSILON
+17: EPSILON
+16: CHOICE
+17: REF 'presentation-notes',
+17: EPSILON
+12: EPSILON
+10: REF 'office-drawing-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:presentation",
+9: SEQUENCE
+10: REF 'office-presentation-attlist',
+11: EPSILON
+10: REF 'office-presentation-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+12: REF 'presentation-decls',
+13: CHOICE
+14: ONEOREMORE
+15: REF 'presentation-decl',
+16: CHOICE
+17: ELEMENT "presentation:header-decl",
+18: SEQUENCE
+19: REF 'presentation-header-decl-attlist',
+20: ATTRIBUTE "presentation:name",
+21: REF 'string',
+22: DATA 'string',
+19: STRING
+17: ELEMENT "presentation:footer-decl",
+18: SEQUENCE
+19: REF 'presentation-footer-decl-attlist',
+20: ATTRIBUTE "presentation:name",
+21: REF 'string',
+22: DATA 'string',
+19: STRING
+17: ELEMENT "presentation:date-time-decl",
+18: SEQUENCE
+19: REF 'presentation-date-time-decl-attlist',
+20: INTERLEAVE
+21: ATTRIBUTE "presentation:name",
+22: REF 'string',
+23: DATA 'string',
+21: ATTRIBUTE "presentation:source",
+22: CHOICE
+23: VALUE 'fixed',
+23: VALUE 'current-date',
+21: CHOICE
+22: ATTRIBUTE "style:data-style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+19: STRING
+14: EPSILON
+10: REF 'office-presentation-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-page',
+12: EPSILON
+10: REF 'office-presentation-content-epilogue',
+11: SEQUENCE
+12: REF 'presentation-settings',
+13: CHOICE
+14: ELEMENT "presentation:settings",
+15: SEQUENCE
+16: REF 'presentation-settings-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "presentation:start-page",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:full-screen",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:endless",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:pause",
+20: REF 'duration',
+21: DATA 'duration',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show-logo",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:force-manual",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:mouse-visible",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:mouse-as-pen",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:start-with-navigator",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:animations",
+20: CHOICE
+21: VALUE 'enabled',
+21: VALUE 'disabled',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:transition-on-click",
+20: CHOICE
+21: VALUE 'enabled',
+21: VALUE 'disabled',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:stay-on-top",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show-end-of-presentation-slide",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'presentation-show',
+19: ELEMENT "presentation:show",
+20: REF 'presentation-show-attlist',
+21: INTERLEAVE
+22: ATTRIBUTE "presentation:name",
+23: REF 'string',
+24: DATA 'string',
+22: ATTRIBUTE "presentation:pages",
+23: STRING
+17: EPSILON
+14: EPSILON
+12: REF 'table-functions',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-named-expressions',
+15: EPSILON
+14: CHOICE
+15: REF 'table-database-ranges',
+15: EPSILON
+14: CHOICE
+15: REF 'table-data-pilot-tables',
+15: EPSILON
+14: CHOICE
+15: REF 'table-consolidation',
+15: EPSILON
+14: CHOICE
+15: REF 'table-dde-links',
+15: EPSILON
+8: ELEMENT "office:spreadsheet",
+9: SEQUENCE
+10: REF 'office-spreadsheet-attlist',
+11: SEQUENCE
+12: CHOICE
+13: ATTRIBUTE "table:structure-protected",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+12: CHOICE
+13: ATTRIBUTE "table:protection-key",
+14: REF 'string',
+15: DATA 'string',
+13: EPSILON
+10: REF 'office-spreadsheet-content-prelude',
+11: SEQUENCE
+12: CHOICE
+13: REF 'table-tracked-changes',
+14: ELEMENT "table:tracked-changes",
+15: SEQUENCE
+16: REF 'table-tracked-changes-attlist',
+17: CHOICE
+18: ATTRIBUTE "table:track-changes",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: CHOICE
+19: REF 'table-cell-content-change',
+20: ELEMENT "table:cell-content-change",
+21: SEQUENCE
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'table-cell-address',
+23: ELEMENT "table:cell-address",
+24: REF 'common-table-cell-address-attlist',
+25: SEQUENCE
+26: ATTRIBUTE "table:column",
+27: REF 'integer',
+28: DATA 'integer',
+26: ATTRIBUTE "table:row",
+27: REF 'integer',
+28: DATA 'integer',
+26: ATTRIBUTE "table:table",
+27: REF 'integer',
+28: DATA 'integer',
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+24: ELEMENT "table:dependencies",
+25: ONEOREMORE
+26: REF 'table-dependency',
+27: ELEMENT "table:dependency",
+28: ATTRIBUTE "table:id",
+29: REF 'string',
+30: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+24: ELEMENT "table:deletions",
+25: ONEOREMORE
+26: CHOICE
+27: REF 'table-cell-content-deletion',
+28: ELEMENT "table:cell-content-deletion",
+29: SEQUENCE
+30: CHOICE
+31: ATTRIBUTE "table:id",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: REF 'table-cell-address',
+31: EPSILON
+30: CHOICE
+31: REF 'table-change-track-table-cell',
+32: ELEMENT "table:change-track-table-cell",
+33: SEQUENCE
+34: REF 'table-change-track-table-cell-attlist',
+35: INTERLEAVE
+36: CHOICE
+37: ATTRIBUTE "table:cell-address",
+38: REF 'cellAddress',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "table:matrix-covered",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+36: SEQUENCE
+37: CHOICE
+38: ATTRIBUTE "table:formula",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+37: CHOICE
+38: ATTRIBUTE "table:number-matrix-columns-spanned",
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+38: EPSILON
+37: CHOICE
+38: ATTRIBUTE "table:number-matrix-rows-spanned",
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+38: EPSILON
+37: CHOICE
+38: REF 'common-value-and-type-attlist',
+39: CHOICE
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'float',
+41: ATTRIBUTE "office:value",
+42: REF 'double',
+43: DATA 'double',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'percentage',
+41: ATTRIBUTE "office:value",
+42: REF 'double',
+43: DATA 'double',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'currency',
+41: ATTRIBUTE "office:value",
+42: REF 'double',
+43: DATA 'double',
+41: CHOICE
+42: ATTRIBUTE "office:currency",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'date',
+41: ATTRIBUTE "office:date-value",
+42: REF 'dateOrDateTime',
+43: CHOICE
+44: DATA 'date',
+44: DATA 'dateTime',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'time',
+41: ATTRIBUTE "office:time-value",
+42: REF 'duration',
+43: DATA 'duration',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'boolean',
+41: ATTRIBUTE "office:boolean-value",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+40: SEQUENCE
+41: ATTRIBUTE "office:value-type",
+42: VALUE 'string',
+41: CHOICE
+42: ATTRIBUTE "office:string-value",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+38: EPSILON
+34: CHOICE
+35: ONEOREMORE
+36: REF 'text-p',
+35: EPSILON
+31: EPSILON
+27: REF 'table-change-deletion',
+28: ELEMENT "table:change-deletion",
+29: CHOICE
+30: ATTRIBUTE "table:id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+23: EPSILON
+22: REF 'table-previous',
+23: ELEMENT "table:previous",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:id",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: REF 'table-change-track-table-cell',
+19: REF 'table-insertion',
+20: ELEMENT "table:insertion",
+21: SEQUENCE
+22: REF 'table-insertion-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:type",
+25: CHOICE
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'table',
+24: ATTRIBUTE "table:position",
+25: REF 'integer',
+26: DATA 'integer',
+24: CHOICE
+25: ATTRIBUTE "table:count",
+26: REF 'positiveInteger',
+27: DATA 'positiveInteger',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:table",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+19: REF 'table-deletion',
+20: ELEMENT "table:deletion",
+21: SEQUENCE
+22: REF 'table-deletion-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:type",
+25: CHOICE
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'table',
+24: ATTRIBUTE "table:position",
+25: REF 'integer',
+26: DATA 'integer',
+24: CHOICE
+25: ATTRIBUTE "table:table",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:multi-deletion-spanned",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+22: CHOICE
+23: REF 'table-cut-offs',
+24: ELEMENT "table:cut-offs",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'table-movement-cut-off',
+28: ELEMENT "table:movement-cut-off",
+29: REF 'table-movement-cut-off-attlist',
+30: CHOICE
+31: ATTRIBUTE "table:position",
+32: REF 'integer',
+33: DATA 'integer',
+31: SEQUENCE
+32: ATTRIBUTE "table:start-position",
+33: REF 'integer',
+34: DATA 'integer',
+32: ATTRIBUTE "table:end-position",
+33: REF 'integer',
+34: DATA 'integer',
+26: SEQUENCE
+27: REF 'table-insertion-cut-off',
+28: ELEMENT "table:insertion-cut-off",
+29: REF 'table-insertion-cut-off-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:id",
+32: REF 'string',
+33: DATA 'string',
+31: ATTRIBUTE "table:position",
+32: REF 'integer',
+33: DATA 'integer',
+27: CHOICE
+28: ONEOREMORE
+29: REF 'table-movement-cut-off',
+28: EPSILON
+23: EPSILON
+19: REF 'table-movement',
+20: ELEMENT "table:movement",
+21: SEQUENCE
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'table-source-range-address',
+23: ELEMENT "table:source-range-address",
+24: REF 'common-table-range-attlist',
+25: CHOICE
+26: REF 'common-table-cell-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:table",
+29: REF 'integer',
+30: DATA 'integer',
+26: REF 'common-table-cell-range-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:start-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-table",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-table",
+29: REF 'integer',
+30: DATA 'integer',
+22: REF 'table-target-range-address',
+23: ELEMENT "table:target-range-address",
+24: REF 'common-table-range-attlist',
+25: CHOICE
+26: REF 'common-table-cell-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:table",
+29: REF 'integer',
+30: DATA 'integer',
+26: REF 'common-table-cell-range-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:start-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-table",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-table",
+29: REF 'integer',
+30: DATA 'integer',
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+17: EPSILON
+13: EPSILON
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-spreadsheet-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'table-table',
+12: EPSILON
+10: REF 'office-spreadsheet-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:chart",
+9: SEQUENCE
+10: REF 'office-chart-attlist',
+11: EPSILON
+10: REF 'office-chart-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-chart-content-main',
+11: REF 'chart-chart',
+12: ELEMENT "chart:chart",
+13: SEQUENCE
+14: REF 'chart-chart-attlist',
+15: INTERLEAVE
+16: ATTRIBUTE "chart:class",
+17: REF 'namespacedToken',
+18: DATA 'string',
+16: REF 'common-draw-size-attlist',
+17: SEQUENCE
+18: CHOICE
+19: ATTRIBUTE "svg:width",
+20: REF 'length',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "svg:height",
+20: REF 'length',
+21: DATA 'string',
+19: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:column-mapping",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:row-mapping",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:style-name",
+18: REF 'styleNameRef',
+19: CHOICE
+20: DATA 'NCName',
+20: EPSILON
+17: EPSILON
+14: CHOICE
+15: REF 'chart-title',
+16: ELEMENT "chart:title",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellAddress',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-subtitle',
+16: ELEMENT "chart:subtitle",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellAddress',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-footer',
+16: ELEMENT "chart:footer",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellAddress',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-legend',
+16: ELEMENT "chart:legend",
+17: REF 'chart-legend-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: SEQUENCE
+21: ATTRIBUTE "chart:legend-position",
+22: CHOICE
+23: VALUE 'start',
+23: VALUE 'end',
+23: VALUE 'top',
+23: VALUE 'bottom',
+21: CHOICE
+22: ATTRIBUTE "chart:legend-align",
+23: CHOICE
+24: VALUE 'start',
+24: VALUE 'center',
+24: VALUE 'end',
+22: EPSILON
+20: ATTRIBUTE "chart:legend-position",
+21: CHOICE
+22: VALUE 'top-start',
+22: VALUE 'bottom-start',
+22: VALUE 'top-end',
+22: VALUE 'bottom-end',
+20: EPSILON
+19: REF 'common-draw-position-attlist',
+20: SEQUENCE
+21: CHOICE
+22: ATTRIBUTE "svg:x",
+23: REF 'coordinate',
+24: REF 'length',
+25: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "svg:y",
+23: REF 'coordinate',
+24: REF 'length',
+25: DATA 'string',
+22: EPSILON
+19: CHOICE
+20: ATTRIBUTE "style:legend-expansion",
+21: CHOICE
+22: VALUE 'wide',
+22: VALUE 'high',
+22: VALUE 'balanced',
+20: SEQUENCE
+21: ATTRIBUTE "style:legend-expansion",
+22: VALUE 'custom',
+21: ATTRIBUTE "style:legend-expansion-aspect-ratio",
+22: REF 'double',
+23: DATA 'double',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+15: EPSILON
+14: REF 'chart-plot-area',
+15: ELEMENT "chart:plot-area",
+16: SEQUENCE
+17: REF 'chart-plot-area-attlist',
+18: INTERLEAVE
+19: SEQUENCE
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: REF 'common-draw-size-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:height",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "table:cell-range-address",
+21: REF 'cellRangeAddress',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:data-source-has-labels",
+21: CHOICE
+22: VALUE 'none',
+22: VALUE 'row',
+22: VALUE 'column',
+22: VALUE 'both',
+20: EPSILON
+19: SEQUENCE
+20: REF 'dr3d-scene-attlist',
+21: INTERLEAVE
+22: SEQUENCE
+23: CHOICE
+24: ATTRIBUTE "dr3d:vrp",
+25: REF 'vector3D',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "dr3d:vpn",
+25: REF 'vector3D',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "dr3d:vup",
+25: REF 'vector3D',
+26: DATA 'string',
+24: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:projection",
+24: CHOICE
+25: VALUE 'parallel',
+25: VALUE 'perspective',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:distance",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:focal-length",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:shadow-slant",
+24: REF 'nonNegativeInteger',
+25: DATA 'nonNegativeInteger',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:shade-mode",
+24: CHOICE
+25: VALUE 'flat',
+25: VALUE 'phong',
+25: VALUE 'gouraud',
+25: VALUE 'draft',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:ambient-color",
+24: REF 'color',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "dr3d:lighting-mode",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+20: REF 'common-dr3d-transform-attlist',
+21: CHOICE
+22: ATTRIBUTE "dr3d:transform",
+23: STRING
+22: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'dr3d-light',
+18: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'chart-axis',
+20: ELEMENT "chart:axis",
+21: SEQUENCE
+22: REF 'chart-axis-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "chart:dimension",
+25: CHOICE
+26: VALUE 'x',
+26: VALUE 'y',
+26: VALUE 'z',
+24: CHOICE
+25: ATTRIBUTE "chart:name",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:style-name",
+26: REF 'styleNameRef',
+27: CHOICE
+28: DATA 'NCName',
+28: EPSILON
+25: EPSILON
+22: CHOICE
+23: REF 'chart-title',
+23: EPSILON
+22: CHOICE
+23: REF 'chart-categories',
+24: ELEMENT "chart:categories",
+25: CHOICE
+26: ATTRIBUTE "table:cell-range-address",
+27: REF 'cellRangeAddress',
+28: DATA 'string',
+26: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-grid',
+25: ELEMENT "chart:grid",
+26: REF 'chart-grid-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "chart:class",
+30: CHOICE
+31: VALUE 'major',
+31: VALUE 'minor',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'chart-series',
+20: ELEMENT "chart:series",
+21: SEQUENCE
+22: REF 'chart-series-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "chart:values-cell-range-address",
+26: REF 'cellRangeAddress',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:label-cell-address",
+26: REF 'cellAddress',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:class",
+26: REF 'namespacedToken',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:attached-axis",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:style-name",
+26: REF 'styleNameRef',
+27: CHOICE
+28: DATA 'NCName',
+28: EPSILON
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-domain',
+25: ELEMENT "chart:domain",
+26: CHOICE
+27: ATTRIBUTE "table:cell-range-address",
+28: REF 'cellRangeAddress',
+29: DATA 'string',
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-mean-value',
+24: ELEMENT "chart:mean-value",
+25: REF 'chart-mean-value-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-regression-curve',
+24: ELEMENT "chart:regression-curve",
+25: REF 'chart-regression-curve-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-error-indicator',
+24: ELEMENT "chart:error-indicator",
+25: REF 'chart-error-indicator-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-data-point',
+25: ELEMENT "chart:data-point",
+26: REF 'chart-data-point-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "chart:repeated",
+30: REF 'nonNegativeInteger',
+31: DATA 'nonNegativeInteger',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-gain-marker',
+19: ELEMENT "chart:stock-gain-marker",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-loss-marker',
+19: ELEMENT "chart:stock-loss-marker",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-range-line',
+19: ELEMENT "chart:stock-range-line",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-wall',
+19: ELEMENT "chart:wall",
+20: REF 'chart-wall-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "chart:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-floor',
+19: ELEMENT "chart:floor",
+20: REF 'chart-floor-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "chart:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+18: EPSILON
+14: CHOICE
+15: REF 'table-table',
+15: EPSILON
+10: REF 'office-chart-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:image",
+9: SEQUENCE
+10: REF 'office-image-attlist',
+11: EPSILON
+10: REF 'office-image-content-prelude',
+11: EPSILON
+10: REF 'office-image-content-main',
+11: REF 'draw-frame',
+10: REF 'office-image-content-epilogue',
+11: EPSILON
+1: REF 'office-document-content',
+2: ELEMENT "office:document-content",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-scripts',
+5: CHOICE
+4: REF 'office-font-face-decls',
+5: CHOICE
+4: REF 'office-automatic-styles',
+5: CHOICE
+4: REF 'office-body',
+1: REF 'office-document-styles',
+2: ELEMENT "office:document-styles",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-font-face-decls',
+5: CHOICE
+4: REF 'office-styles',
+5: CHOICE
+4: REF 'office-automatic-styles',
+5: CHOICE
+4: REF 'office-master-styles',
+5: CHOICE
+1: REF 'office-document-meta',
+2: ELEMENT "office:document-meta",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-meta',
+5: CHOICE
+1: REF 'office-document-settings',
+2: ELEMENT "office:document-settings",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: CHOICE
+6: ATTRIBUTE "office:version",
+7: REF 'string',
+8: DATA 'string',
+6: EPSILON
+4: REF 'office-settings',
+5: CHOICE
diff --git a/trunk/generator/schema2template/src/test/resources/examples/odf/odf12-msvtree.ref b/trunk/generator/schema2template/src/test/resources/examples/odf/odf12-msvtree.ref
new file mode 100644
index 0000000..3cb2ce3
--- /dev/null
+++ b/trunk/generator/schema2template/src/test/resources/examples/odf/odf12-msvtree.ref
@@ -0,0 +1,28008 @@
+0: CHOICE
+1: REF 'office-document',
+2: ELEMENT "office:document",
+3: SEQUENCE
+4: REF 'office-document-attrs',
+5: ATTRIBUTE "office:mimetype",
+6: REF 'string',
+7: DATA 'string',
+4: REF 'office-document-common-attrs',
+5: INTERLEAVE
+6: ATTRIBUTE "office:version",
+7: VALUE '1.2',
+6: CHOICE
+7: ATTRIBUTE "grddl:transformation",
+8: LIST
+9: CHOICE
+10: ONEOREMORE
+11: REF 'anyIRI',
+12: DATA 'anyURI',
+10: EPSILON
+7: EPSILON
+4: REF 'office-meta',
+5: CHOICE
+6: ELEMENT "office:meta",
+7: REF 'office-meta-content-strict',
+8: CHOICE
+9: ONEOREMORE
+10: REF 'office-meta-data',
+11: CHOICE
+12: ELEMENT "meta:generator",
+13: REF 'string',
+14: DATA 'string',
+12: ELEMENT "dc:title",
+13: REF 'string',
+14: DATA 'string',
+12: ELEMENT "dc:description",
+13: REF 'string',
+14: DATA 'string',
+12: ELEMENT "dc:subject",
+13: REF 'string',
+14: DATA 'string',
+12: ELEMENT "meta:keyword",
+13: REF 'string',
+14: DATA 'string',
+12: ELEMENT "meta:initial-creator",
+13: REF 'string',
+14: DATA 'string',
+12: REF 'dc-creator',
+13: ELEMENT "dc:creator",
+14: REF 'string',
+15: DATA 'string',
+12: ELEMENT "meta:printed-by",
+13: REF 'string',
+14: DATA 'string',
+12: ELEMENT "meta:creation-date",
+13: REF 'dateTime',
+14: DATA 'dateTime',
+12: REF 'dc-date',
+13: ELEMENT "dc:date",
+14: REF 'dateTime',
+15: DATA 'dateTime',
+12: ELEMENT "meta:print-date",
+13: REF 'dateTime',
+14: DATA 'dateTime',
+12: ELEMENT "meta:template",
+13: SEQUENCE
+14: ATTRIBUTE "xlink:type",
+15: VALUE 'simple',
+14: ATTRIBUTE "xlink:href",
+15: REF 'anyIRI',
+16: DATA 'anyURI',
+14: CHOICE
+15: ATTRIBUTE "xlink:actuate",
+16: VALUE 'onRequest',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "xlink:title",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:date",
+16: REF 'dateTime',
+17: DATA 'dateTime',
+15: EPSILON
+12: ELEMENT "meta:auto-reload",
+13: SEQUENCE
+14: CHOICE
+15: SEQUENCE
+16: ATTRIBUTE "xlink:type",
+17: VALUE 'simple',
+16: ATTRIBUTE "xlink:href",
+17: REF 'anyIRI',
+18: DATA 'anyURI',
+16: CHOICE
+17: ATTRIBUTE "xlink:show",
+18: VALUE 'replace',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "xlink:actuate",
+18: VALUE 'onLoad',
+17: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:delay",
+16: REF 'duration',
+17: DATA 'duration',
+15: EPSILON
+12: ELEMENT "meta:hyperlink-behaviour",
+13: SEQUENCE
+14: CHOICE
+15: ATTRIBUTE "office:target-frame-name",
+16: REF 'targetFrameName',
+17: CHOICE
+18: VALUE '_self',
+18: VALUE '_blank',
+18: VALUE '_parent',
+18: VALUE '_top',
+18: REF 'string',
+19: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "xlink:show",
+16: CHOICE
+17: VALUE 'new',
+17: VALUE 'replace',
+15: EPSILON
+12: ELEMENT "dc:language",
+13: REF 'language',
+14: DATA 'language',
+12: ELEMENT "meta:editing-cycles",
+13: REF 'nonNegativeInteger',
+14: DATA 'nonNegativeInteger',
+12: ELEMENT "meta:editing-duration",
+13: REF 'duration',
+14: DATA 'duration',
+12: ELEMENT "meta:document-statistic",
+13: SEQUENCE
+14: CHOICE
+15: ATTRIBUTE "meta:page-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:table-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:draw-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:image-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:ole-object-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:object-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:paragraph-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:word-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:character-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:frame-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:sentence-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:syllable-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:non-whitespace-character-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:row-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "meta:cell-count",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+12: ELEMENT "meta:user-defined",
+13: SEQUENCE
+14: ATTRIBUTE "meta:name",
+15: REF 'string',
+16: DATA 'string',
+14: CHOICE
+15: SEQUENCE
+16: ATTRIBUTE "meta:value-type",
+17: VALUE 'float',
+16: REF 'double',
+17: DATA 'double',
+15: SEQUENCE
+16: ATTRIBUTE "meta:value-type",
+17: VALUE 'date',
+16: REF 'dateOrDateTime',
+17: CHOICE
+18: DATA 'date',
+18: DATA 'dateTime',
+15: SEQUENCE
+16: ATTRIBUTE "meta:value-type",
+17: VALUE 'time',
+16: REF 'duration',
+17: DATA 'duration',
+15: SEQUENCE
+16: ATTRIBUTE "meta:value-type",
+17: VALUE 'boolean',
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: SEQUENCE
+16: ATTRIBUTE "meta:value-type",
+17: VALUE 'string',
+16: REF 'string',
+17: DATA 'string',
+15: STRING
+9: EPSILON
+6: EPSILON
+4: REF 'office-settings',
+5: CHOICE
+6: ELEMENT "office:settings",
+7: ONEOREMORE
+8: REF 'config-config-item-set',
+9: ELEMENT "config:config-item-set",
+10: SEQUENCE
+11: REF 'config-config-item-set-attlist',
+12: ATTRIBUTE "config:name",
+13: REF 'string',
+14: DATA 'string',
+11: REF 'config-items',
+12: ONEOREMORE
+13: CHOICE
+14: REF 'config-config-item',
+15: ELEMENT "config:config-item",
+16: SEQUENCE
+17: REF 'config-config-item-attlist',
+18: INTERLEAVE
+19: ATTRIBUTE "config:name",
+20: REF 'string',
+21: DATA 'string',
+19: ATTRIBUTE "config:type",
+20: CHOICE
+21: VALUE 'boolean',
+21: VALUE 'short',
+21: VALUE 'int',
+21: VALUE 'long',
+21: VALUE 'double',
+21: VALUE 'string',
+21: VALUE 'datetime',
+21: VALUE 'base64Binary',
+17: STRING
+14: REF 'config-config-item-set',
+14: REF 'config-config-item-map-named',
+15: ELEMENT "config:config-item-map-named",
+16: SEQUENCE
+17: REF 'config-config-item-map-named-attlist',
+18: ATTRIBUTE "config:name",
+19: REF 'string',
+20: DATA 'string',
+17: ONEOREMORE
+18: REF 'config-config-item-map-entry',
+19: ELEMENT "config:config-item-map-entry",
+20: SEQUENCE
+21: REF 'config-config-item-map-entry-attlist',
+22: CHOICE
+23: ATTRIBUTE "config:name",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'config-items',
+22: ONEOREMORE
+23: CHOICE
+24: REF 'config-config-item',
+24: REF 'config-config-item-set',
+24: REF 'config-config-item-map-named',
+24: REF 'config-config-item-map-indexed',
+25: ELEMENT "config:config-item-map-indexed",
+26: SEQUENCE
+27: REF 'config-config-item-map-indexed-attlist',
+28: ATTRIBUTE "config:name",
+29: REF 'string',
+30: DATA 'string',
+27: ONEOREMORE
+28: REF 'config-config-item-map-entry',
+14: REF 'config-config-item-map-indexed',
+6: EPSILON
+4: REF 'office-scripts',
+5: CHOICE
+6: ELEMENT "office:scripts",
+7: SEQUENCE
+8: CHOICE
+9: ONEOREMORE
+10: REF 'office-script',
+11: ELEMENT "office:script",
+12: SEQUENCE
+13: REF 'office-script-attlist',
+14: ATTRIBUTE "script:language",
+15: REF 'string',
+16: DATA 'string',
+13: MIXED
+14: REF 'anyElements',
+15: CHOICE
+16: ONEOREMORE
+17: ELEMENT "*",
+18: MIXED
+19: REF 'anyAttListOrElements',
+20: SEQUENCE
+21: CHOICE
+22: ONEOREMORE
+23: ATTRIBUTE "*",
+24: STRING
+22: EPSILON
+21: REF 'anyElements',
+22: CHOICE
+23: ONEOREMORE
+23: EPSILON
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'office-event-listeners',
+10: ELEMENT "office:event-listeners",
+11: CHOICE
+12: ONEOREMORE
+13: CHOICE
+14: REF 'script-event-listener',
+15: ELEMENT "script:event-listener",
+16: REF 'script-event-listener-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "script:event-name",
+19: REF 'string',
+20: DATA 'string',
+18: ATTRIBUTE "script:language",
+19: REF 'string',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "script:macro-name",
+20: REF 'string',
+21: DATA 'string',
+19: SEQUENCE
+20: ATTRIBUTE "xlink:type",
+21: VALUE 'simple',
+20: ATTRIBUTE "xlink:href",
+21: REF 'anyIRI',
+22: DATA 'anyURI',
+20: CHOICE
+21: ATTRIBUTE "xlink:actuate",
+22: VALUE 'onRequest',
+21: EPSILON
+14: REF 'presentation-event-listener',
+15: ELEMENT "presentation:event-listener",
+16: SEQUENCE
+17: REF 'presentation-event-listener-attlist',
+18: INTERLEAVE
+19: ATTRIBUTE "script:event-name",
+20: REF 'string',
+21: DATA 'string',
+19: ATTRIBUTE "presentation:action",
+20: CHOICE
+21: VALUE 'none',
+21: VALUE 'previous-page',
+21: VALUE 'next-page',
+21: VALUE 'first-page',
+21: VALUE 'last-page',
+21: VALUE 'hide',
+21: VALUE 'stop',
+21: VALUE 'execute',
+21: VALUE 'show',
+21: VALUE 'verb',
+21: VALUE 'fade-out',
+21: VALUE 'sound',
+21: VALUE 'last-visited-page',
+19: CHOICE
+20: ATTRIBUTE "presentation:effect",
+21: REF 'presentationEffects',
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'fade',
+23: VALUE 'move',
+23: VALUE 'stripes',
+23: VALUE 'open',
+23: VALUE 'close',
+23: VALUE 'dissolve',
+23: VALUE 'wavyline',
+23: VALUE 'random',
+23: VALUE 'lines',
+23: VALUE 'laser',
+23: VALUE 'appear',
+23: VALUE 'hide',
+23: VALUE 'move-short',
+23: VALUE 'checkerboard',
+23: VALUE 'rotate',
+23: VALUE 'stretch',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:direction",
+21: REF 'presentationEffectDirections',
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'from-left',
+23: VALUE 'from-top',
+23: VALUE 'from-right',
+23: VALUE 'from-bottom',
+23: VALUE 'from-center',
+23: VALUE 'from-upper-left',
+23: VALUE 'from-upper-right',
+23: VALUE 'from-lower-left',
+23: VALUE 'from-lower-right',
+23: VALUE 'to-left',
+23: VALUE 'to-top',
+23: VALUE 'to-right',
+23: VALUE 'to-bottom',
+23: VALUE 'to-upper-left',
+23: VALUE 'to-upper-right',
+23: VALUE 'to-lower-right',
+23: VALUE 'to-lower-left',
+23: VALUE 'path',
+23: VALUE 'spiral-inward-left',
+23: VALUE 'spiral-inward-right',
+23: VALUE 'spiral-outward-left',
+23: VALUE 'spiral-outward-right',
+23: VALUE 'vertical',
+23: VALUE 'horizontal',
+23: VALUE 'to-center',
+23: VALUE 'clockwise',
+23: VALUE 'counter-clockwise',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:speed",
+21: REF 'presentationSpeeds',
+22: CHOICE
+23: VALUE 'slow',
+23: VALUE 'medium',
+23: VALUE 'fast',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:start-scale",
+21: REF 'percent',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: SEQUENCE
+21: ATTRIBUTE "xlink:type",
+22: VALUE 'simple',
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyIRI',
+23: DATA 'anyURI',
+21: CHOICE
+22: ATTRIBUTE "xlink:show",
+23: VALUE 'embed',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "xlink:actuate",
+23: VALUE 'onRequest',
+22: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:verb",
+21: REF 'nonNegativeInteger',
+22: DATA 'nonNegativeInteger',
+20: EPSILON
+17: CHOICE
+18: REF 'presentation-sound',
+19: ELEMENT "presentation:sound",
+20: SEQUENCE
+21: REF 'presentation-sound-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "presentation:play-full",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: REF 'xml-id',
+25: ATTRIBUTE "xml:id",
+26: REF 'ID',
+27: DATA 'ID',
+24: EPSILON
+21: ATTRIBUTE "xlink:type",
+22: VALUE 'simple',
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyIRI',
+23: DATA 'anyURI',
+21: CHOICE
+22: ATTRIBUTE "xlink:actuate",
+23: VALUE 'onRequest',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "xlink:show",
+23: CHOICE
+24: VALUE 'new',
+24: VALUE 'replace',
+22: EPSILON
+18: EPSILON
+12: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-font-face-decls',
+5: CHOICE
+6: ELEMENT "office:font-face-decls",
+7: CHOICE
+8: ONEOREMORE
+9: REF 'style-font-face',
+10: ELEMENT "style:font-face",
+11: SEQUENCE
+12: REF 'style-font-face-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "svg:font-family",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:font-style",
+16: REF 'fontStyle',
+17: CHOICE
+18: VALUE 'normal',
+18: VALUE 'italic',
+18: VALUE 'oblique',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:font-variant",
+16: REF 'fontVariant',
+17: CHOICE
+18: VALUE 'normal',
+18: VALUE 'small-caps',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:font-weight",
+16: REF 'fontWeight',
+17: CHOICE
+18: VALUE 'normal',
+18: VALUE 'bold',
+18: VALUE '100',
+18: VALUE '200',
+18: VALUE '300',
+18: VALUE '400',
+18: VALUE '500',
+18: VALUE '600',
+18: VALUE '700',
+18: VALUE '800',
+18: VALUE '900',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:font-stretch",
+16: CHOICE
+17: VALUE 'normal',
+17: VALUE 'ultra-condensed',
+17: VALUE 'extra-condensed',
+17: VALUE 'condensed',
+17: VALUE 'semi-condensed',
+17: VALUE 'semi-expanded',
+17: VALUE 'expanded',
+17: VALUE 'extra-expanded',
+17: VALUE 'ultra-expanded',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:font-size",
+16: REF 'positiveLength',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:unicode-range",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:units-per-em",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:panose-1",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:stemv",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:stemh",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:slope",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:cap-height",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:x-height",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:accent-height",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:ascent",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:descent",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:widths",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:bbox",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:ideographic",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:alphabetic",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:mathematical",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:hanging",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:v-ideographic",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:v-alphabetic",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:v-mathematical",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:v-hanging",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:underline-position",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:underline-thickness",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:strikethrough-position",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:strikethrough-thickness",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:overline-position",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "svg:overline-thickness",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: ATTRIBUTE "style:name",
+15: REF 'string',
+16: DATA 'string',
+14: CHOICE
+15: ATTRIBUTE "style:font-adornments",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-family-generic",
+16: REF 'fontFamilyGeneric',
+17: CHOICE
+18: VALUE 'roman',
+18: VALUE 'swiss',
+18: VALUE 'modern',
+18: VALUE 'decorative',
+18: VALUE 'script',
+18: VALUE 'system',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-pitch",
+16: REF 'fontPitch',
+17: CHOICE
+18: VALUE 'fixed',
+18: VALUE 'variable',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:font-charset",
+16: REF 'textEncoding',
+17: DATA 'string',
+15: EPSILON
+12: CHOICE
+13: REF 'svg-font-face-src',
+14: ELEMENT "svg:font-face-src",
+15: ONEOREMORE
+16: CHOICE
+17: REF 'svg-font-face-uri',
+18: ELEMENT "svg:font-face-uri",
+19: SEQUENCE
+20: REF 'common-svg-font-face-xlink-attlist',
+21: SEQUENCE
+22: ATTRIBUTE "xlink:type",
+23: VALUE 'simple',
+22: ATTRIBUTE "xlink:href",
+23: REF 'anyIRI',
+24: DATA 'anyURI',
+22: CHOICE
+23: ATTRIBUTE "xlink:actuate",
+24: VALUE 'onRequest',
+23: EPSILON
+20: CHOICE
+21: ONEOREMORE
+22: REF 'svg-font-face-format',
+23: ELEMENT "svg:font-face-format",
+24: CHOICE
+25: ATTRIBUTE "svg:string",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+21: EPSILON
+17: REF 'svg-font-face-name',
+18: ELEMENT "svg:font-face-name",
+19: CHOICE
+20: ATTRIBUTE "svg:name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+13: EPSILON
+12: CHOICE
+13: REF 'svg-definition-src',
+14: ELEMENT "svg:definition-src",
+15: REF 'common-svg-font-face-xlink-attlist',
+16: SEQUENCE
+17: ATTRIBUTE "xlink:type",
+18: VALUE 'simple',
+17: ATTRIBUTE "xlink:href",
+18: REF 'anyIRI',
+19: DATA 'anyURI',
+17: CHOICE
+18: ATTRIBUTE "xlink:actuate",
+19: VALUE 'onRequest',
+18: EPSILON
+13: EPSILON
+8: EPSILON
+6: EPSILON
+4: REF 'office-styles',
+5: CHOICE
+6: ELEMENT "office:styles",
+7: INTERLEAVE
+8: REF 'styles',
+9: INTERLEAVE
+10: CHOICE
+11: ONEOREMORE
+12: REF 'style-style',
+13: ELEMENT "style:style",
+14: SEQUENCE
+15: REF 'style-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:parent-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:next-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:list-level",
+19: CHOICE
+20: REF 'positiveInteger',
+21: DATA 'positiveInteger',
+20: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:list-style-name",
+19: CHOICE
+20: REF 'styleName',
+21: DATA 'NCName',
+20: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:master-page-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:auto-update",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:data-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:percentage-data-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:class",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:default-outline-level",
+19: CHOICE
+20: REF 'positiveInteger',
+21: DATA 'positiveInteger',
+20: EPSILON
+18: EPSILON
+15: REF 'style-style-content',
+16: CHOICE
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'text',
+18: CHOICE
+19: REF 'style-text-properties',
+20: ELEMENT "style:text-properties",
+21: REF 'style-text-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-text-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "fo:font-variant",
+27: REF 'fontVariant',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'small-caps',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:text-transform",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'lowercase',
+28: VALUE 'uppercase',
+28: VALUE 'capitalize',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:use-window-font-color",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-outline",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-type",
+27: REF 'lineType',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'single',
+29: VALUE 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-style",
+27: REF 'lineStyle',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'dotted',
+29: VALUE 'dash',
+29: VALUE 'long-dash',
+29: VALUE 'dot-dash',
+29: VALUE 'dot-dot-dash',
+29: VALUE 'wave',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-width",
+27: REF 'lineWidth',
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'normal',
+29: VALUE 'bold',
+29: VALUE 'thin',
+29: VALUE 'medium',
+29: VALUE 'thick',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+29: REF 'percent',
+30: DATA 'string',
+29: REF 'positiveLength',
+30: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-color",
+27: CHOICE
+28: VALUE 'font-color',
+28: REF 'color',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-text",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-text-style",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-position",
+27: LIST
+28: SEQUENCE
+29: CHOICE
+30: REF 'percent',
+31: DATA 'string',
+30: VALUE 'super',
+30: VALUE 'sub',
+29: CHOICE
+30: REF 'percent',
+31: DATA 'string',
+30: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-name",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-name-asian",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-name-complex",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:font-family",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-family-asian",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-family-complex",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-family-generic",
+27: REF 'fontFamilyGeneric',
+28: CHOICE
+29: VALUE 'roman',
+29: VALUE 'swiss',
+29: VALUE 'modern',
+29: VALUE 'decorative',
+29: VALUE 'script',
+29: VALUE 'system',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-family-generic-asian",
+27: REF 'fontFamilyGeneric',
+28: CHOICE
+29: VALUE 'roman',
+29: VALUE 'swiss',
+29: VALUE 'modern',
+29: VALUE 'decorative',
+29: VALUE 'script',
+29: VALUE 'system',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-family-generic-complex",
+27: REF 'fontFamilyGeneric',
+28: CHOICE
+29: VALUE 'roman',
+29: VALUE 'swiss',
+29: VALUE 'modern',
+29: VALUE 'decorative',
+29: VALUE 'script',
+29: VALUE 'system',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-style-name",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-style-name-asian",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-style-name-complex",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-pitch",
+27: REF 'fontPitch',
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'variable',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-pitch-asian",
+27: REF 'fontPitch',
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'variable',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-pitch-complex",
+27: REF 'fontPitch',
+28: CHOICE
+29: VALUE 'fixed',
+29: VALUE 'variable',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-charset",
+27: REF 'textEncoding',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-charset-asian",
+27: REF 'textEncoding',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-charset-complex",
+27: REF 'textEncoding',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:font-size",
+27: CHOICE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-size-asian",
+27: CHOICE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-size-complex",
+27: CHOICE
+28: REF 'positiveLength',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-size-rel",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-size-rel-asian",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-size-rel-complex",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:script-type",
+27: CHOICE
+28: VALUE 'latin',
+28: VALUE 'asian',
+28: VALUE 'complex',
+28: VALUE 'ignore',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:letter-spacing",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: VALUE 'normal',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:language",
+27: REF 'languageCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:language-asian",
+27: REF 'languageCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:language-complex",
+27: REF 'languageCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:country",
+27: REF 'countryCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:country-asian",
+27: REF 'countryCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:country-complex",
+27: REF 'countryCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:script",
+27: REF 'scriptCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:script-asian",
+27: REF 'scriptCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:script-complex",
+27: REF 'scriptCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rfc-language-tag",
+27: REF 'language',
+28: DATA 'language',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rfc-language-tag-asian",
+27: REF 'language',
+28: DATA 'language',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rfc-language-tag-complex",
+27: REF 'language',
+28: DATA 'language',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:font-style",
+27: REF 'fontStyle',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'italic',
+29: VALUE 'oblique',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-style-asian",
+27: REF 'fontStyle',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'italic',
+29: VALUE 'oblique',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-style-complex",
+27: REF 'fontStyle',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'italic',
+29: VALUE 'oblique',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-relief",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'embossed',
+28: VALUE 'engraved',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:text-shadow",
+27: REF 'shadowType',
+28: CHOICE
+29: VALUE 'none',
+29: REF 'string',
+30: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-underline-type",
+27: REF 'lineType',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'single',
+29: VALUE 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-underline-style",
+27: REF 'lineStyle',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'dotted',
+29: VALUE 'dash',
+29: VALUE 'long-dash',
+29: VALUE 'dot-dash',
+29: VALUE 'dot-dot-dash',
+29: VALUE 'wave',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-underline-width",
+27: REF 'lineWidth',
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'normal',
+29: VALUE 'bold',
+29: VALUE 'thin',
+29: VALUE 'medium',
+29: VALUE 'thick',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+29: REF 'percent',
+30: DATA 'string',
+29: REF 'positiveLength',
+30: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-underline-color",
+27: CHOICE
+28: VALUE 'font-color',
+28: REF 'color',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-overline-type",
+27: REF 'lineType',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'single',
+29: VALUE 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-overline-style",
+27: REF 'lineStyle',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'dotted',
+29: VALUE 'dash',
+29: VALUE 'long-dash',
+29: VALUE 'dot-dash',
+29: VALUE 'dot-dot-dash',
+29: VALUE 'wave',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-overline-width",
+27: REF 'lineWidth',
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'normal',
+29: VALUE 'bold',
+29: VALUE 'thin',
+29: VALUE 'medium',
+29: VALUE 'thick',
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+29: REF 'percent',
+30: DATA 'string',
+29: REF 'positiveLength',
+30: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-overline-color",
+27: CHOICE
+28: VALUE 'font-color',
+28: REF 'color',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-overline-mode",
+27: REF 'lineMode',
+28: CHOICE
+29: VALUE 'continuous',
+29: VALUE 'skip-white-space',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:font-weight",
+27: REF 'fontWeight',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'bold',
+29: VALUE '100',
+29: VALUE '200',
+29: VALUE '300',
+29: VALUE '400',
+29: VALUE '500',
+29: VALUE '600',
+29: VALUE '700',
+29: VALUE '800',
+29: VALUE '900',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-weight-asian",
+27: REF 'fontWeight',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'bold',
+29: VALUE '100',
+29: VALUE '200',
+29: VALUE '300',
+29: VALUE '400',
+29: VALUE '500',
+29: VALUE '600',
+29: VALUE '700',
+29: VALUE '800',
+29: VALUE '900',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-weight-complex",
+27: REF 'fontWeight',
+28: CHOICE
+29: VALUE 'normal',
+29: VALUE 'bold',
+29: VALUE '100',
+29: VALUE '200',
+29: VALUE '300',
+29: VALUE '400',
+29: VALUE '500',
+29: VALUE '600',
+29: VALUE '700',
+29: VALUE '800',
+29: VALUE '900',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-underline-mode",
+27: REF 'lineMode',
+28: CHOICE
+29: VALUE 'continuous',
+29: VALUE 'skip-white-space',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-line-through-mode",
+27: REF 'lineMode',
+28: CHOICE
+29: VALUE 'continuous',
+29: VALUE 'skip-white-space',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:letter-kerning",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-blinking",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-combine",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'letters',
+28: VALUE 'lines',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-combine-start-char",
+27: REF 'character',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-combine-end-char",
+27: REF 'character',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-emphasize",
+27: CHOICE
+28: VALUE 'none',
+28: LIST
+29: SEQUENCE
+30: CHOICE
+31: VALUE 'none',
+31: VALUE 'accent',
+31: VALUE 'dot',
+31: VALUE 'circle',
+31: VALUE 'disc',
+30: CHOICE
+31: VALUE 'above',
+31: VALUE 'below',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-scale",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-rotation-angle",
+27: REF 'angle',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-rotation-scale",
+27: CHOICE
+28: VALUE 'fixed',
+28: VALUE 'line-height',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:hyphenate",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:hyphenation-remain-char-count",
+27: REF 'positiveInteger',
+28: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:hyphenation-push-char-count",
+27: REF 'positiveInteger',
+28: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:display",
+27: VALUE 'true',
+26: ATTRIBUTE "text:display",
+27: VALUE 'none',
+26: SEQUENCE
+27: ATTRIBUTE "text:display",
+28: VALUE 'condition',
+27: ATTRIBUTE "text:condition",
+28: VALUE 'none',
+26: EPSILON
+23: REF 'style-text-properties-elements',
+24: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'paragraph',
+18: CHOICE
+19: REF 'style-paragraph-properties',
+20: ELEMENT "style:paragraph-properties",
+21: REF 'style-paragraph-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-paragraph-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "fo:line-height",
+27: CHOICE
+28: VALUE 'normal',
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:line-height-at-least",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:line-spacing",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:font-independent-line-spacing",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-text-align',
+26: CHOICE
+27: ATTRIBUTE "fo:text-align",
+28: CHOICE
+29: VALUE 'start',
+29: VALUE 'end',
+29: VALUE 'left',
+29: VALUE 'right',
+29: VALUE 'center',
+29: VALUE 'justify',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:text-align-last",
+27: CHOICE
+28: VALUE 'start',
+28: VALUE 'center',
+28: VALUE 'justify',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:justify-single-word",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:keep-together",
+27: CHOICE
+28: VALUE 'auto',
+28: VALUE 'always',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:widows",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:orphans",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:tab-stop-distance",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:hyphenation-keep",
+27: CHOICE
+28: VALUE 'auto',
+28: VALUE 'page',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:hyphenation-ladder-count",
+27: CHOICE
+28: VALUE 'no-limit',
+28: REF 'positiveInteger',
+29: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:register-true",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-horizontal-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-left",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-right",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:text-indent",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:auto-text-indent",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-vertical-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-top",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-bottom",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-margin-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:margin",
+28: CHOICE
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-break-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:break-before",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:break-after",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-border-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:border",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-top",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-bottom",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-left",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-right",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-border-line-width-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-top",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-bottom",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-left",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-right",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:join-border",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-padding-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:padding",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-top",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-bottom",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-left",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-right",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-shadow-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:shadow",
+28: REF 'shadowType',
+29: CHOICE
+30: VALUE 'none',
+30: REF 'string',
+31: DATA 'string',
+27: EPSILON
+25: REF 'common-keep-with-next-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:keep-with-next",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'always',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:number-lines",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:line-number",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-autospace",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'ideograph-alpha',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:punctuation-wrap",
+27: CHOICE
+28: VALUE 'simple',
+28: VALUE 'hanging',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:line-break",
+27: CHOICE
+28: VALUE 'normal',
+28: VALUE 'strict',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:vertical-align",
+27: CHOICE
+28: VALUE 'top',
+28: VALUE 'middle',
+28: VALUE 'bottom',
+28: VALUE 'auto',
+28: VALUE 'baseline',
+26: EPSILON
+25: REF 'common-writing-mode-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode",
+28: CHOICE
+29: VALUE 'lr-tb',
+29: VALUE 'rl-tb',
+29: VALUE 'tb-rl',
+29: VALUE 'tb-lr',
+29: VALUE 'lr',
+29: VALUE 'rl',
+29: VALUE 'tb',
+29: VALUE 'page',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:writing-mode-automatic",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:snap-to-layout-grid",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-page-number-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:page-number",
+28: CHOICE
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+29: VALUE 'auto',
+27: EPSILON
+25: REF 'common-background-transparency-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:background-transparency",
+28: REF 'zeroToHundredPercent',
+29: DATA 'string',
+27: EPSILON
+23: REF 'style-paragraph-properties-elements',
+24: INTERLEAVE
+25: REF 'style-tab-stops',
+26: CHOICE
+27: ELEMENT "style:tab-stops",
+28: CHOICE
+29: ONEOREMORE
+30: REF 'style-tab-stop',
+31: ELEMENT "style:tab-stop",
+32: REF 'style-tab-stop-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "style:position",
+35: REF 'length',
+36: DATA 'string',
+34: CHOICE
+35: ATTRIBUTE "style:type",
+36: CHOICE
+37: VALUE 'left',
+37: VALUE 'center',
+37: VALUE 'right',
+35: EPSILON
+35: SEQUENCE
+36: ATTRIBUTE "style:type",
+37: VALUE 'char',
+36: REF 'style-tab-stop-char-attlist',
+37: ATTRIBUTE "style:char",
+38: REF 'character',
+39: DATA 'string',
+34: CHOICE
+35: ATTRIBUTE "style:leader-type",
+36: REF 'lineType',
+37: CHOICE
+38: VALUE 'none',
+38: VALUE 'single',
+38: VALUE 'double',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:leader-style",
+36: REF 'lineStyle',
+37: CHOICE
+38: VALUE 'none',
+38: VALUE 'solid',
+38: VALUE 'dotted',
+38: VALUE 'dash',
+38: VALUE 'long-dash',
+38: VALUE 'dot-dash',
+38: VALUE 'dot-dot-dash',
+38: VALUE 'wave',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:leader-width",
+36: REF 'lineWidth',
+37: CHOICE
+38: VALUE 'auto',
+38: VALUE 'normal',
+38: VALUE 'bold',
+38: VALUE 'thin',
+38: VALUE 'medium',
+38: VALUE 'thick',
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+38: REF 'percent',
+39: DATA 'string',
+38: REF 'positiveLength',
+39: DATA 'string',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:leader-color",
+36: CHOICE
+37: VALUE 'font-color',
+37: REF 'color',
+38: DATA 'string',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:leader-text",
+36: REF 'character',
+37: DATA 'string',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:leader-text-style",
+36: REF 'styleNameRef',
+37: CHOICE
+38: DATA 'NCName',
+38: EPSILON
+35: EPSILON
+29: EPSILON
+27: EPSILON
+25: REF 'style-drop-cap',
+26: CHOICE
+27: ELEMENT "style:drop-cap",
+28: REF 'style-drop-cap-attlist',
+29: INTERLEAVE
+30: CHOICE
+31: ATTRIBUTE "style:length",
+32: CHOICE
+33: VALUE 'word',
+33: REF 'positiveInteger',
+34: DATA 'positiveInteger',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "style:lines",
+32: REF 'positiveInteger',
+33: DATA 'positiveInteger',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "style:distance",
+32: REF 'length',
+33: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "style:style-name",
+32: REF 'styleNameRef',
+33: CHOICE
+34: DATA 'NCName',
+34: EPSILON
+31: EPSILON
+27: EPSILON
+25: REF 'style-background-image',
+26: CHOICE
+27: ELEMENT "style:background-image",
+28: SEQUENCE
+29: REF 'style-background-image-attlist',
+30: INTERLEAVE
+31: CHOICE
+32: ATTRIBUTE "style:repeat",
+33: CHOICE
+34: VALUE 'no-repeat',
+34: VALUE 'repeat',
+34: VALUE 'stretch',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:position",
+33: CHOICE
+34: VALUE 'left',
+34: VALUE 'center',
+34: VALUE 'right',
+34: VALUE 'top',
+34: VALUE 'bottom',
+34: LIST
+35: SEQUENCE
+36: REF 'horiBackPos',
+37: CHOICE
+38: VALUE 'left',
+38: VALUE 'center',
+38: VALUE 'right',
+36: REF 'vertBackPos',
+37: CHOICE
+38: VALUE 'top',
+38: VALUE 'center',
+38: VALUE 'bottom',
+34: LIST
+35: SEQUENCE
+36: REF 'vertBackPos',
+37: CHOICE
+38: VALUE 'top',
+38: VALUE 'center',
+38: VALUE 'bottom',
+36: REF 'horiBackPos',
+37: CHOICE
+38: VALUE 'left',
+38: VALUE 'center',
+38: VALUE 'right',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "style:filter-name",
+33: REF 'string',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "draw:opacity",
+33: REF 'zeroToHundredPercent',
+34: DATA 'string',
+32: EPSILON
+29: CHOICE
+30: REF 'common-draw-data-attlist',
+31: SEQUENCE
+32: ATTRIBUTE "xlink:type",
+33: VALUE 'simple',
+32: ATTRIBUTE "xlink:href",
+33: REF 'anyIRI',
+34: DATA 'anyURI',
+32: CHOICE
+33: ATTRIBUTE "xlink:show",
+34: VALUE 'embed',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "xlink:actuate",
+34: VALUE 'onLoad',
+33: EPSILON
+30: REF 'office-binary-data',
+31: ELEMENT "office:binary-data",
+32: REF 'base64Binary',
+33: DATA 'base64Binary',
+30: EPSILON
+27: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'section',
+18: CHOICE
+19: REF 'style-section-properties',
+20: ELEMENT "style:section-properties",
+21: REF 'style-section-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-section-properties-attlist',
+24: INTERLEAVE
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-horizontal-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-left",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-right",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:protect",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-editable-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:editable",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:dont-balance-text-columns",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-writing-mode-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode",
+28: CHOICE
+29: VALUE 'lr-tb',
+29: VALUE 'rl-tb',
+29: VALUE 'tb-rl',
+29: VALUE 'tb-lr',
+29: VALUE 'lr',
+29: VALUE 'rl',
+29: VALUE 'tb',
+29: VALUE 'page',
+27: EPSILON
+23: REF 'style-section-properties-elements',
+24: INTERLEAVE
+25: REF 'style-background-image',
+26: CHOICE
+25: REF 'style-columns',
+26: CHOICE
+27: ELEMENT "style:columns",
+28: SEQUENCE
+29: REF 'style-columns-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "fo:column-count",
+32: REF 'positiveInteger',
+33: DATA 'positiveInteger',
+31: CHOICE
+32: ATTRIBUTE "fo:column-gap",
+33: REF 'length',
+34: DATA 'string',
+32: EPSILON
+29: CHOICE
+30: REF 'style-column-sep',
+31: ELEMENT "style:column-sep",
+32: REF 'style-column-sep-attlist',
+33: INTERLEAVE
+34: CHOICE
+35: ATTRIBUTE "style:style",
+36: CHOICE
+37: VALUE 'none',
+37: VALUE 'solid',
+37: VALUE 'dotted',
+37: VALUE 'dashed',
+37: VALUE 'dot-dashed',
+35: EPSILON
+34: ATTRIBUTE "style:width",
+35: REF 'length',
+36: DATA 'string',
+34: CHOICE
+35: ATTRIBUTE "style:height",
+36: REF 'zeroToHundredPercent',
+37: DATA 'string',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:vertical-align",
+36: CHOICE
+37: VALUE 'top',
+37: VALUE 'middle',
+37: VALUE 'bottom',
+35: EPSILON
+34: CHOICE
+35: ATTRIBUTE "style:color",
+36: REF 'color',
+37: DATA 'string',
+35: EPSILON
+30: EPSILON
+29: CHOICE
+30: ONEOREMORE
+31: REF 'style-column',
+32: ELEMENT "style:column",
+33: REF 'style-column-attlist',
+34: INTERLEAVE
+35: ATTRIBUTE "style:rel-width",
+36: REF 'relativeLength',
+37: DATA 'string',
+35: CHOICE
+36: ATTRIBUTE "fo:start-indent",
+37: REF 'length',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "fo:end-indent",
+37: REF 'length',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "fo:space-before",
+37: REF 'length',
+38: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "fo:space-after",
+37: REF 'length',
+38: DATA 'string',
+36: EPSILON
+30: EPSILON
+27: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-notes-configuration',
+28: ELEMENT "text:notes-configuration",
+29: REF 'text-notes-configuration-content',
+30: INTERLEAVE
+31: REF 'text-note-class',
+32: ATTRIBUTE "text:note-class",
+33: CHOICE
+34: VALUE 'footnote',
+34: VALUE 'endnote',
+31: CHOICE
+32: ATTRIBUTE "text:citation-style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:citation-body-style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:default-style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:master-page-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:start-value",
+33: REF 'nonNegativeInteger',
+34: DATA 'nonNegativeInteger',
+32: EPSILON
+31: REF 'common-num-format-prefix-suffix-attlist',
+32: SEQUENCE
+33: CHOICE
+34: ATTRIBUTE "style:num-prefix",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "style:num-suffix",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+31: CHOICE
+32: REF 'common-num-format-attlist',
+33: CHOICE
+34: ATTRIBUTE "style:num-format",
+35: CHOICE
+36: VALUE '1',
+36: VALUE 'i',
+36: VALUE 'I',
+36: REF 'string',
+37: DATA 'string',
+36: EPSILON
+34: SEQUENCE
+35: ATTRIBUTE "style:num-format",
+36: CHOICE
+37: VALUE 'a',
+37: VALUE 'A',
+35: REF 'style-num-letter-sync-attlist',
+36: CHOICE
+37: ATTRIBUTE "style:num-letter-sync",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+34: EPSILON
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:start-numbering-at",
+33: CHOICE
+34: VALUE 'document',
+34: VALUE 'chapter',
+34: VALUE 'page',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:footnotes-position",
+33: CHOICE
+34: VALUE 'text',
+34: VALUE 'page',
+34: VALUE 'section',
+34: VALUE 'document',
+32: EPSILON
+31: CHOICE
+32: ELEMENT "text:note-continuation-notice-forward",
+33: STRING
+32: EPSILON
+31: CHOICE
+32: ELEMENT "text:note-continuation-notice-backward",
+33: STRING
+32: EPSILON
+26: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'ruby',
+18: CHOICE
+19: REF 'style-ruby-properties',
+20: ELEMENT "style:ruby-properties",
+21: REF 'style-ruby-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-ruby-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "style:ruby-position",
+27: CHOICE
+28: VALUE 'above',
+28: VALUE 'below',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:ruby-align",
+27: CHOICE
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+28: VALUE 'distribute-letter',
+28: VALUE 'distribute-space',
+26: EPSILON
+23: REF 'style-ruby-properties-elements',
+24: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table',
+18: CHOICE
+19: REF 'style-table-properties',
+20: ELEMENT "style:table-properties",
+21: REF 'style-table-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-table-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "style:width",
+27: REF 'positiveLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rel-width",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:align",
+27: CHOICE
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+28: VALUE 'margins',
+26: EPSILON
+25: REF 'common-horizontal-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-left",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-right",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-vertical-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-top",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-bottom",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-margin-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:margin",
+28: CHOICE
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-page-number-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:page-number",
+28: CHOICE
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+29: VALUE 'auto',
+27: EPSILON
+25: REF 'common-break-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:break-before",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:break-after",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-shadow-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:shadow",
+28: REF 'shadowType',
+29: CHOICE
+30: VALUE 'none',
+30: REF 'string',
+31: DATA 'string',
+27: EPSILON
+25: REF 'common-keep-with-next-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:keep-with-next",
+28: CHOICE
+29: VALUE 'auto',
+29: VALUE 'always',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:may-break-between-rows",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:border-model",
+27: CHOICE
+28: VALUE 'collapsing',
+28: VALUE 'separating',
+26: EPSILON
+25: REF 'common-writing-mode-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode",
+28: CHOICE
+29: VALUE 'lr-tb',
+29: VALUE 'rl-tb',
+29: VALUE 'tb-rl',
+29: VALUE 'tb-lr',
+29: VALUE 'lr',
+29: VALUE 'rl',
+29: VALUE 'tb',
+29: VALUE 'page',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: REF 'style-table-properties-elements',
+24: REF 'style-background-image',
+25: CHOICE
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-column',
+18: CHOICE
+19: REF 'style-table-column-properties',
+20: ELEMENT "style:table-column-properties",
+21: REF 'style-table-column-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-table-column-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "style:column-width",
+27: REF 'positiveLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rel-column-width",
+27: REF 'relativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:use-optimal-column-width",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-break-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:break-before",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:break-after",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+23: REF 'style-table-column-properties-elements',
+24: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-row',
+18: CHOICE
+19: REF 'style-table-row-properties',
+20: ELEMENT "style:table-row-properties",
+21: REF 'style-table-row-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-table-row-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "style:row-height",
+27: REF 'positiveLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:min-row-height",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:use-optimal-row-height",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-break-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:break-before",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:break-after",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'column',
+30: VALUE 'page',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:keep-together",
+27: CHOICE
+28: VALUE 'auto',
+28: VALUE 'always',
+26: EPSILON
+23: REF 'style-table-row-properties-elements',
+24: REF 'style-background-image',
+25: CHOICE
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'table-cell',
+18: CHOICE
+19: REF 'style-table-cell-properties',
+20: ELEMENT "style:table-cell-properties",
+21: REF 'style-table-cell-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-table-cell-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "style:vertical-align",
+27: CHOICE
+28: VALUE 'top',
+28: VALUE 'middle',
+28: VALUE 'bottom',
+28: VALUE 'automatic',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:text-align-source",
+27: CHOICE
+28: VALUE 'fix',
+28: VALUE 'value-type',
+26: EPSILON
+25: REF 'common-style-direction-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:direction",
+28: CHOICE
+29: VALUE 'ltr',
+29: VALUE 'ttb',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:glyph-orientation-vertical",
+27: CHOICE
+28: VALUE 'auto',
+28: VALUE '0',
+28: VALUE '0deg',
+28: VALUE '0rad',
+28: VALUE '0grad',
+26: EPSILON
+25: REF 'common-writing-mode-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode",
+28: CHOICE
+29: VALUE 'lr-tb',
+29: VALUE 'rl-tb',
+29: VALUE 'tb-rl',
+29: VALUE 'tb-lr',
+29: VALUE 'lr',
+29: VALUE 'rl',
+29: VALUE 'tb',
+29: VALUE 'page',
+27: EPSILON
+25: REF 'common-shadow-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:shadow",
+28: REF 'shadowType',
+29: CHOICE
+30: VALUE 'none',
+30: REF 'string',
+31: DATA 'string',
+27: EPSILON
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-border-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:border",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-top",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-bottom",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-left",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-right",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:diagonal-tl-br",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:diagonal-tl-br-widths",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:diagonal-bl-tr",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:diagonal-bl-tr-widths",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+25: REF 'common-border-line-width-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-top",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-bottom",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-left",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-right",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+25: REF 'common-padding-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:padding",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-top",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-bottom",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-left",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-right",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:wrap-option",
+27: CHOICE
+28: VALUE 'no-wrap',
+28: VALUE 'wrap',
+26: EPSILON
+25: REF 'common-rotation-angle-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:rotation-angle",
+28: REF 'angle',
+29: DATA 'string',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rotation-align",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'bottom',
+28: VALUE 'top',
+28: VALUE 'center',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:cell-protect",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'hidden-and-protected',
+28: LIST
+29: ONEOREMORE
+30: CHOICE
+31: VALUE 'protected',
+31: VALUE 'formula-hidden',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:print-content",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:decimal-places",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:repeat-content",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:shrink-to-fit",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: REF 'style-table-cell-properties-elements',
+24: REF 'style-background-image',
+25: CHOICE
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: CHOICE
+20: VALUE 'graphic',
+20: VALUE 'presentation',
+18: CHOICE
+19: REF 'style-graphic-properties',
+20: ELEMENT "style:graphic-properties",
+21: REF 'style-graphic-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-graphic-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "draw:stroke",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'dash',
+28: VALUE 'solid',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:stroke-dash",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:stroke-dash-names",
+27: REF 'styleNameRefs',
+28: LIST
+29: CHOICE
+30: ONEOREMORE
+31: DATA 'NCName',
+30: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:stroke-width",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:stroke-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:marker-start",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:marker-end",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:marker-start-width",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:marker-end-width",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:marker-start-center",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:marker-end-center",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:stroke-opacity",
+27: CHOICE
+28: DATA 'double',
+28: REF 'zeroToHundredPercent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:stroke-linejoin",
+27: CHOICE
+28: VALUE 'miter',
+28: VALUE 'round',
+28: VALUE 'bevel',
+28: VALUE 'middle',
+28: VALUE 'none',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:stroke-linecap",
+27: CHOICE
+28: VALUE 'butt',
+28: VALUE 'square',
+28: VALUE 'round',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:symbol-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'scroll',
+28: VALUE 'alternate',
+28: VALUE 'slide',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation-direction",
+27: CHOICE
+28: VALUE 'left',
+28: VALUE 'right',
+28: VALUE 'up',
+28: VALUE 'down',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation-start-inside",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation-stop-inside",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation-repeat",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation-delay",
+27: REF 'duration',
+28: DATA 'duration',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:animation-steps",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:auto-grow-width",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:auto-grow-height",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fit-to-size",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fit-to-contour",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:textarea-vertical-align",
+27: CHOICE
+28: VALUE 'top',
+28: VALUE 'middle',
+28: VALUE 'bottom',
+28: VALUE 'justify',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:textarea-horizontal-align",
+27: CHOICE
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+28: VALUE 'justify',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:wrap-option",
+27: CHOICE
+28: VALUE 'no-wrap',
+28: VALUE 'wrap',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:shrink-to-fit",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:color-mode",
+27: CHOICE
+28: VALUE 'greyscale',
+28: VALUE 'mono',
+28: VALUE 'watermark',
+28: VALUE 'standard',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:color-inversion",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:luminance",
+27: REF 'zeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:contrast",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:gamma",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:red",
+27: REF 'signedZeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:green",
+27: REF 'signedZeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:blue",
+27: REF 'signedZeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:image-opacity",
+27: REF 'zeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:shadow",
+27: CHOICE
+28: VALUE 'visible',
+28: VALUE 'hidden',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:shadow-offset-x",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:shadow-offset-y",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:shadow-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:shadow-opacity",
+27: REF 'zeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:start-line-spacing-horizontal",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:start-line-spacing-vertical",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:end-line-spacing-horizontal",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:end-line-spacing-vertical",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:line-distance",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:guide-overhang",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:guide-distance",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:start-guide",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:end-guide",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:placing",
+27: CHOICE
+28: VALUE 'below',
+28: VALUE 'above',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:parallel",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:measure-align",
+27: CHOICE
+28: VALUE 'automatic',
+28: VALUE 'left-outside',
+28: VALUE 'inside',
+28: VALUE 'right-outside',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:measure-vertical-align",
+27: CHOICE
+28: VALUE 'automatic',
+28: VALUE 'above',
+28: VALUE 'below',
+28: VALUE 'center',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:unit",
+27: CHOICE
+28: VALUE 'automatic',
+28: VALUE 'mm',
+28: VALUE 'cm',
+28: VALUE 'm',
+28: VALUE 'km',
+28: VALUE 'pt',
+28: VALUE 'pc',
+28: VALUE 'inch',
+28: VALUE 'ft',
+28: VALUE 'mi',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:show-unit",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:decimal-places",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-type",
+27: CHOICE
+28: VALUE 'straight-line',
+28: VALUE 'angled-line',
+28: VALUE 'angled-connector-line',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-angle-type",
+27: CHOICE
+28: VALUE 'fixed',
+28: VALUE 'free',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-angle",
+27: REF 'angle',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-gap",
+27: REF 'distance',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-escape-direction",
+27: CHOICE
+28: VALUE 'horizontal',
+28: VALUE 'vertical',
+28: VALUE 'auto',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-escape",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-line-length",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:caption-fit-line-length",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:horizontal-segments",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:vertical-segments",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:edge-rounding",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:edge-rounding-mode",
+27: CHOICE
+28: VALUE 'correct',
+28: VALUE 'attractive',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:back-scale",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:depth",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:backface-culling",
+27: CHOICE
+28: VALUE 'enabled',
+28: VALUE 'disabled',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:end-angle",
+27: REF 'angle',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:close-front",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:close-back",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:lighting-mode",
+27: CHOICE
+28: VALUE 'standard',
+28: VALUE 'double-sided',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:normals-kind",
+27: CHOICE
+28: VALUE 'object',
+28: VALUE 'flat',
+28: VALUE 'sphere',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:normals-direction",
+27: CHOICE
+28: VALUE 'normal',
+28: VALUE 'inverse',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:texture-generation-mode-x",
+27: CHOICE
+28: VALUE 'object',
+28: VALUE 'parallel',
+28: VALUE 'sphere',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:texture-generation-mode-y",
+27: CHOICE
+28: VALUE 'object',
+28: VALUE 'parallel',
+28: VALUE 'sphere',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:texture-kind",
+27: CHOICE
+28: VALUE 'luminance',
+28: VALUE 'intensity',
+28: VALUE 'color',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:texture-filter",
+27: CHOICE
+28: VALUE 'enabled',
+28: VALUE 'disabled',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:texture-mode",
+27: CHOICE
+28: VALUE 'replace',
+28: VALUE 'modulate',
+28: VALUE 'blend',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:ambient-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:emissive-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:specular-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:diffuse-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:shininess",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "dr3d:shadow",
+27: CHOICE
+28: VALUE 'visible',
+28: VALUE 'hidden',
+26: EPSILON
+25: REF 'common-draw-rel-size-attlist',
+26: SEQUENCE
+27: REF 'common-draw-size-attlist',
+28: SEQUENCE
+29: CHOICE
+30: ATTRIBUTE "svg:width",
+31: REF 'length',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "svg:height",
+31: REF 'length',
+32: DATA 'string',
+30: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:rel-width",
+29: CHOICE
+30: REF 'percent',
+31: DATA 'string',
+30: VALUE 'scale',
+30: VALUE 'scale-min',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:rel-height",
+29: CHOICE
+30: REF 'percent',
+31: DATA 'string',
+30: VALUE 'scale',
+30: VALUE 'scale-min',
+28: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:min-width",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:min-height",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:max-height",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:max-width",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: REF 'common-horizontal-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-left",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-right",
+29: CHOICE
+30: REF 'length',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-vertical-margin-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:margin-top",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:margin-bottom",
+29: CHOICE
+30: REF 'nonNegativeLength',
+31: DATA 'string',
+30: REF 'percent',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-margin-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:margin",
+28: CHOICE
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+29: REF 'percent',
+30: DATA 'string',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:print-content",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:protect",
+27: CHOICE
+28: VALUE 'none',
+28: LIST
+29: ONEOREMORE
+30: CHOICE
+31: VALUE 'content',
+31: VALUE 'position',
+31: VALUE 'size',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:horizontal-pos",
+27: CHOICE
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+28: VALUE 'from-left',
+28: VALUE 'inside',
+28: VALUE 'outside',
+28: VALUE 'from-inside',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:x",
+27: REF 'coordinate',
+28: REF 'length',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:horizontal-rel",
+27: CHOICE
+28: VALUE 'page',
+28: VALUE 'page-content',
+28: VALUE 'page-start-margin',
+28: VALUE 'page-end-margin',
+28: VALUE 'frame',
+28: VALUE 'frame-content',
+28: VALUE 'frame-start-margin',
+28: VALUE 'frame-end-margin',
+28: VALUE 'paragraph',
+28: VALUE 'paragraph-content',
+28: VALUE 'paragraph-start-margin',
+28: VALUE 'paragraph-end-margin',
+28: VALUE 'char',
+26: EPSILON
+25: REF 'common-vertical-pos-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:vertical-pos",
+29: CHOICE
+30: VALUE 'top',
+30: VALUE 'middle',
+30: VALUE 'bottom',
+30: VALUE 'from-top',
+30: VALUE 'below',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "svg:y",
+29: REF 'coordinate',
+30: REF 'length',
+31: DATA 'string',
+28: EPSILON
+25: REF 'common-vertical-rel-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:vertical-rel",
+28: CHOICE
+29: VALUE 'page',
+29: VALUE 'page-content',
+29: VALUE 'frame',
+29: VALUE 'frame-content',
+29: VALUE 'paragraph',
+29: VALUE 'paragraph-content',
+29: VALUE 'char',
+29: VALUE 'line',
+29: VALUE 'baseline',
+29: VALUE 'text',
+27: EPSILON
+25: REF 'common-text-anchor-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "text:anchor-type",
+29: CHOICE
+30: VALUE 'page',
+30: VALUE 'frame',
+30: VALUE 'paragraph',
+30: VALUE 'char',
+30: VALUE 'as-char',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "text:anchor-page-number",
+29: REF 'positiveInteger',
+30: DATA 'positiveInteger',
+28: EPSILON
+25: REF 'common-border-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:border",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-top",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-bottom",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-left",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:border-right",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-border-line-width-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-top",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-bottom",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-left",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "style:border-line-width-right",
+29: REF 'borderWidths',
+30: LIST
+31: SEQUENCE
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+32: REF 'positiveLength',
+33: DATA 'string',
+28: EPSILON
+25: REF 'common-padding-attlist',
+26: SEQUENCE
+27: CHOICE
+28: ATTRIBUTE "fo:padding",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-top",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-bottom",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-left",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "fo:padding-right",
+29: REF 'nonNegativeLength',
+30: DATA 'string',
+28: EPSILON
+25: REF 'common-shadow-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:shadow",
+28: REF 'shadowType',
+29: CHOICE
+30: VALUE 'none',
+30: REF 'string',
+31: DATA 'string',
+27: EPSILON
+25: REF 'common-background-color-attlist',
+26: CHOICE
+27: ATTRIBUTE "fo:background-color",
+28: CHOICE
+29: VALUE 'transparent',
+29: REF 'color',
+30: DATA 'string',
+27: EPSILON
+25: REF 'common-background-transparency-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:background-transparency",
+28: REF 'zeroToHundredPercent',
+29: DATA 'string',
+27: EPSILON
+25: REF 'common-editable-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:editable",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:wrap",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'left',
+28: VALUE 'right',
+28: VALUE 'parallel',
+28: VALUE 'dynamic',
+28: VALUE 'run-through',
+28: VALUE 'biggest',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:wrap-dynamic-threshold",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:number-wrapped-paragraphs",
+27: CHOICE
+28: VALUE 'no-limit',
+28: REF 'positiveInteger',
+29: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:wrap-contour",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:wrap-contour-mode",
+27: CHOICE
+28: VALUE 'full',
+28: VALUE 'outside',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:run-through",
+27: CHOICE
+28: VALUE 'foreground',
+28: VALUE 'background',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:flow-with-text",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:overflow-behavior",
+27: CHOICE
+28: VALUE 'clip',
+28: VALUE 'auto-create-new-frame',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:mirror",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'vertical',
+28: REF 'horizontal-mirror',
+29: CHOICE
+30: VALUE 'horizontal',
+30: VALUE 'horizontal-on-odd',
+30: VALUE 'horizontal-on-even',
+28: LIST
+29: SEQUENCE
+30: VALUE 'vertical',
+30: REF 'horizontal-mirror',
+31: CHOICE
+32: VALUE 'horizontal',
+32: VALUE 'horizontal-on-odd',
+32: VALUE 'horizontal-on-even',
+28: LIST
+29: SEQUENCE
+30: REF 'horizontal-mirror',
+31: CHOICE
+32: VALUE 'horizontal',
+32: VALUE 'horizontal-on-odd',
+32: VALUE 'horizontal-on-even',
+30: VALUE 'vertical',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:clip",
+27: CHOICE
+28: VALUE 'auto',
+28: REF 'clipShape',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:wrap-influence-on-position",
+27: CHOICE
+28: VALUE 'iterative',
+28: VALUE 'once-concurrent',
+28: VALUE 'once-successive',
+26: EPSILON
+25: REF 'common-writing-mode-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:writing-mode",
+28: CHOICE
+29: VALUE 'lr-tb',
+29: VALUE 'rl-tb',
+29: VALUE 'tb-rl',
+29: VALUE 'tb-lr',
+29: VALUE 'lr',
+29: VALUE 'rl',
+29: VALUE 'tb',
+29: VALUE 'page',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:frame-display-scrollbar",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:frame-display-border",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:frame-margin-horizontal",
+27: REF 'nonNegativePixelLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:frame-margin-vertical",
+27: REF 'nonNegativePixelLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:visible-area-left",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:visible-area-top",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:visible-area-width",
+27: REF 'positiveLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:visible-area-height",
+27: REF 'positiveLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:draw-aspect",
+27: CHOICE
+28: VALUE 'content',
+28: VALUE 'thumbnail',
+28: VALUE 'icon',
+28: VALUE 'print-view',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:ole-draw-aspect",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+23: REF 'style-graphic-fill-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "draw:fill",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'solid',
+28: VALUE 'bitmap',
+28: VALUE 'gradient',
+28: VALUE 'hatch',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:secondary-fill-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-gradient-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:gradient-step-count",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-hatch-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-hatch-solid",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:repeat",
+27: CHOICE
+28: VALUE 'no-repeat',
+28: VALUE 'repeat',
+28: VALUE 'stretch',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-width",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-height",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-ref-point-x",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-ref-point-y",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-ref-point",
+27: CHOICE
+28: VALUE 'top-left',
+28: VALUE 'top',
+28: VALUE 'top-right',
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+28: VALUE 'bottom-left',
+28: VALUE 'bottom',
+28: VALUE 'bottom-right',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:tile-repeat-offset",
+27: LIST
+28: SEQUENCE
+29: REF 'zeroToHundredPercent',
+30: DATA 'string',
+29: CHOICE
+30: VALUE 'horizontal',
+30: VALUE 'vertical',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:opacity",
+27: REF 'zeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:opacity-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:fill-rule",
+27: CHOICE
+28: VALUE 'nonzero',
+28: VALUE 'evenodd',
+26: EPSILON
+23: REF 'style-graphic-properties-elements',
+24: INTERLEAVE
+25: CHOICE
+26: REF 'text-list-style',
+27: ELEMENT "text:list-style",
+28: SEQUENCE
+29: REF 'text-list-style-attr',
+30: INTERLEAVE
+31: ATTRIBUTE "style:name",
+32: REF 'styleName',
+33: DATA 'NCName',
+31: CHOICE
+32: ATTRIBUTE "style:display-name",
+33: REF 'string',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "text:consecutive-numbering",
+33: REF 'boolean',
+34: CHOICE
+35: VALUE 'true',
+35: VALUE 'false',
+32: EPSILON
+29: CHOICE
+30: ONEOREMORE
+31: REF 'text-list-style-content',
+32: CHOICE
+33: ELEMENT "text:list-level-style-number",
+34: SEQUENCE
+35: REF 'text-list-level-style-attr',
+36: ATTRIBUTE "text:level",
+37: REF 'positiveInteger',
+38: DATA 'positiveInteger',
+35: REF 'text-list-level-style-number-attr',
+36: INTERLEAVE
+37: CHOICE
+38: ATTRIBUTE "text:style-name",
+39: REF 'styleNameRef',
+40: CHOICE
+41: DATA 'NCName',
+41: EPSILON
+38: EPSILON
+37: REF 'common-num-format-attlist',
+38: CHOICE
+39: ATTRIBUTE "style:num-format",
+40: CHOICE
+41: VALUE '1',
+41: VALUE 'i',
+41: VALUE 'I',
+41: REF 'string',
+42: DATA 'string',
+41: EPSILON
+39: SEQUENCE
+40: ATTRIBUTE "style:num-format",
+41: CHOICE
+42: VALUE 'a',
+42: VALUE 'A',
+40: REF 'style-num-letter-sync-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:num-letter-sync",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+42: EPSILON
+39: EPSILON
+37: REF 'common-num-format-prefix-suffix-attlist',
+38: SEQUENCE
+39: CHOICE
+40: ATTRIBUTE "style:num-prefix",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "style:num-suffix",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+37: CHOICE
+38: ATTRIBUTE "text:display-levels",
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+38: EPSILON
+37: CHOICE
+38: ATTRIBUTE "text:start-value",
+39: REF 'positiveInteger',
+40: DATA 'positiveInteger',
+38: EPSILON
+35: CHOICE
+36: REF 'style-list-level-properties',
+37: ELEMENT "style:list-level-properties",
+38: REF 'style-list-level-properties-content-strict',
+39: SEQUENCE
+40: REF 'style-list-level-properties-attlist',
+41: INTERLEAVE
+42: REF 'common-text-align',
+43: CHOICE
+44: ATTRIBUTE "fo:text-align",
+45: CHOICE
+46: VALUE 'start',
+46: VALUE 'end',
+46: VALUE 'left',
+46: VALUE 'right',
+46: VALUE 'center',
+46: VALUE 'justify',
+44: EPSILON
+42: CHOICE
+43: ATTRIBUTE "text:space-before",
+44: REF 'length',
+45: DATA 'string',
+43: EPSILON
+42: CHOICE
+43: ATTRIBUTE "text:min-label-width",
+44: REF 'nonNegativeLength',
+45: DATA 'string',
+43: EPSILON
+42: CHOICE
+43: ATTRIBUTE "text:min-label-distance",
+44: REF 'nonNegativeLength',
+45: DATA 'string',
+43: EPSILON
+42: CHOICE
+43: ATTRIBUTE "style:font-name",
+44: REF 'string',
+45: DATA 'string',
+43: EPSILON
+42: CHOICE
+43: ATTRIBUTE "fo:width",
+44: REF 'positiveLength',
+45: DATA 'string',
+43: EPSILON
+42: CHOICE
+43: ATTRIBUTE "fo:height",
+44: REF 'positiveLength',
+45: DATA 'string',
+43: EPSILON
+42: REF 'common-vertical-rel-attlist',
+43: CHOICE
+44: ATTRIBUTE "style:vertical-rel",
+45: CHOICE
+46: VALUE 'page',
+46: VALUE 'page-content',
+46: VALUE 'frame',
+46: VALUE 'frame-content',
+46: VALUE 'paragraph',
+46: VALUE 'paragraph-content',
+46: VALUE 'char',
+46: VALUE 'line',
+46: VALUE 'baseline',
+46: VALUE 'text',
+44: EPSILON
+42: REF 'common-vertical-pos-attlist',
+43: SEQUENCE
+44: CHOICE
+45: ATTRIBUTE "style:vertical-pos",
+46: CHOICE
+47: VALUE 'top',
+47: VALUE 'middle',
+47: VALUE 'bottom',
+47: VALUE 'from-top',
+47: VALUE 'below',
+45: EPSILON
+44: CHOICE
+45: ATTRIBUTE "svg:y",
+46: REF 'coordinate',
+47: REF 'length',
+48: DATA 'string',
+45: EPSILON
+42: CHOICE
+43: ATTRIBUTE "text:list-level-position-and-space-mode",
+44: CHOICE
+45: VALUE 'label-width-and-position',
+45: VALUE 'label-alignment',
+43: EPSILON
+40: REF 'style-list-level-properties-elements',
+41: REF 'style-list-level-label-alignment',
+42: CHOICE
+43: ELEMENT "style:list-level-label-alignment",
+44: REF 'style-list-level-label-alignment-attlist',
+45: INTERLEAVE
+46: ATTRIBUTE "text:label-followed-by",
+47: CHOICE
+48: VALUE 'listtab',
+48: VALUE 'space',
+48: VALUE 'nothing',
+46: CHOICE
+47: ATTRIBUTE "text:list-tab-stop-position",
+48: REF 'length',
+49: DATA 'string',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "fo:text-indent",
+48: REF 'length',
+49: DATA 'string',
+47: EPSILON
+46: CHOICE
+47: ATTRIBUTE "fo:margin-left",
+48: REF 'length',
+49: DATA 'string',
+47: EPSILON
+43: EPSILON
+36: EPSILON
+35: CHOICE
+36: REF 'style-text-properties',
+36: EPSILON
+33: ELEMENT "text:list-level-style-bullet",
+34: SEQUENCE
+35: REF 'text-list-level-style-attr',
+36: ATTRIBUTE "text:level",
+37: REF 'positiveInteger',
+38: DATA 'positiveInteger',
+35: REF 'text-list-level-style-bullet-attr',
+36: INTERLEAVE
+37: CHOICE
+38: ATTRIBUTE "text:style-name",
+39: REF 'styleNameRef',
+40: CHOICE
+41: DATA 'NCName',
+41: EPSILON
+38: EPSILON
+37: ATTRIBUTE "text:bullet-char",
+38: REF 'character',
+39: DATA 'string',
+37: REF 'common-num-format-prefix-suffix-attlist',
+38: SEQUENCE
+39: CHOICE
+40: ATTRIBUTE "style:num-prefix",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "style:num-suffix",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+37: CHOICE
+38: ATTRIBUTE "text:bullet-relative-size",
+39: REF 'percent',
+40: DATA 'string',
+38: EPSILON
+35: CHOICE
+36: REF 'style-list-level-properties',
+36: EPSILON
+35: CHOICE
+36: REF 'style-text-properties',
+36: EPSILON
+33: ELEMENT "text:list-level-style-image",
+34: SEQUENCE
+35: REF 'text-list-level-style-attr',
+36: ATTRIBUTE "text:level",
+37: REF 'positiveInteger',
+38: DATA 'positiveInteger',
+35: REF 'text-list-level-style-image-attr',
+36: CHOICE
+37: REF 'common-draw-data-attlist',
+38: SEQUENCE
+39: ATTRIBUTE "xlink:type",
+40: VALUE 'simple',
+39: ATTRIBUTE "xlink:href",
+40: REF 'anyIRI',
+41: DATA 'anyURI',
+39: CHOICE
+40: ATTRIBUTE "xlink:show",
+41: VALUE 'embed',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "xlink:actuate",
+41: VALUE 'onLoad',
+40: EPSILON
+37: REF 'office-binary-data',
+35: CHOICE
+36: REF 'style-list-level-properties',
+36: EPSILON
+30: EPSILON
+26: EPSILON
+25: REF 'style-background-image',
+26: CHOICE
+25: REF 'style-columns',
+26: CHOICE
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'drawing-page',
+18: CHOICE
+19: REF 'style-drawing-page-properties',
+20: ELEMENT "style:drawing-page-properties",
+21: REF 'style-drawing-page-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-graphic-fill-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "draw:fill",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'solid',
+28: VALUE 'bitmap',
+28: VALUE 'gradient',
+28: VALUE 'hatch',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:secondary-fill-color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-gradient-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:gradient-step-count",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-hatch-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-hatch-solid",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:repeat",
+27: CHOICE
+28: VALUE 'no-repeat',
+28: VALUE 'repeat',
+28: VALUE 'stretch',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-width",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-height",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-ref-point-x",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-ref-point-y",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:fill-image-ref-point",
+27: CHOICE
+28: VALUE 'top-left',
+28: VALUE 'top',
+28: VALUE 'top-right',
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+28: VALUE 'bottom-left',
+28: VALUE 'bottom',
+28: VALUE 'bottom-right',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:tile-repeat-offset",
+27: LIST
+28: SEQUENCE
+29: REF 'zeroToHundredPercent',
+30: DATA 'string',
+29: CHOICE
+30: VALUE 'horizontal',
+30: VALUE 'vertical',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:opacity",
+27: REF 'zeroToHundredPercent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:opacity-name",
+27: REF 'styleNameRef',
+28: CHOICE
+29: DATA 'NCName',
+29: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "svg:fill-rule",
+27: CHOICE
+28: VALUE 'nonzero',
+28: VALUE 'evenodd',
+26: EPSILON
+23: REF 'style-drawing-page-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "presentation:transition-type",
+27: CHOICE
+28: VALUE 'manual',
+28: VALUE 'automatic',
+28: VALUE 'semi-automatic',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:transition-style",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'fade-from-left',
+28: VALUE 'fade-from-top',
+28: VALUE 'fade-from-right',
+28: VALUE 'fade-from-bottom',
+28: VALUE 'fade-from-upperleft',
+28: VALUE 'fade-from-upperright',
+28: VALUE 'fade-from-lowerleft',
+28: VALUE 'fade-from-lowerright',
+28: VALUE 'move-from-left',
+28: VALUE 'move-from-top',
+28: VALUE 'move-from-right',
+28: VALUE 'move-from-bottom',
+28: VALUE 'move-from-upperleft',
+28: VALUE 'move-from-upperright',
+28: VALUE 'move-from-lowerleft',
+28: VALUE 'move-from-lowerright',
+28: VALUE 'uncover-to-left',
+28: VALUE 'uncover-to-top',
+28: VALUE 'uncover-to-right',
+28: VALUE 'uncover-to-bottom',
+28: VALUE 'uncover-to-upperleft',
+28: VALUE 'uncover-to-upperright',
+28: VALUE 'uncover-to-lowerleft',
+28: VALUE 'uncover-to-lowerright',
+28: VALUE 'fade-to-center',
+28: VALUE 'fade-from-center',
+28: VALUE 'vertical-stripes',
+28: VALUE 'horizontal-stripes',
+28: VALUE 'clockwise',
+28: VALUE 'counterclockwise',
+28: VALUE 'open-vertical',
+28: VALUE 'open-horizontal',
+28: VALUE 'close-vertical',
+28: VALUE 'close-horizontal',
+28: VALUE 'wavyline-from-left',
+28: VALUE 'wavyline-from-top',
+28: VALUE 'wavyline-from-right',
+28: VALUE 'wavyline-from-bottom',
+28: VALUE 'spiralin-left',
+28: VALUE 'spiralin-right',
+28: VALUE 'spiralout-left',
+28: VALUE 'spiralout-right',
+28: VALUE 'roll-from-top',
+28: VALUE 'roll-from-left',
+28: VALUE 'roll-from-right',
+28: VALUE 'roll-from-bottom',
+28: VALUE 'stretch-from-left',
+28: VALUE 'stretch-from-top',
+28: VALUE 'stretch-from-right',
+28: VALUE 'stretch-from-bottom',
+28: VALUE 'vertical-lines',
+28: VALUE 'horizontal-lines',
+28: VALUE 'dissolve',
+28: VALUE 'random',
+28: VALUE 'vertical-checkerboard',
+28: VALUE 'horizontal-checkerboard',
+28: VALUE 'interlocking-horizontal-left',
+28: VALUE 'interlocking-horizontal-right',
+28: VALUE 'interlocking-vertical-top',
+28: VALUE 'interlocking-vertical-bottom',
+28: VALUE 'fly-away',
+28: VALUE 'open',
+28: VALUE 'close',
+28: VALUE 'melt',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:transition-speed",
+27: REF 'presentationSpeeds',
+28: CHOICE
+29: VALUE 'slow',
+29: VALUE 'medium',
+29: VALUE 'fast',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:type",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:subtype",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:direction",
+27: CHOICE
+28: VALUE 'forward',
+28: VALUE 'reverse',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "smil:fadeColor",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:duration",
+27: REF 'duration',
+28: DATA 'duration',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:visibility",
+27: CHOICE
+28: VALUE 'visible',
+28: VALUE 'hidden',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "draw:background-size",
+27: CHOICE
+28: VALUE 'full',
+28: VALUE 'border',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:background-objects-visible",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:background-visible",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:display-header",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:display-footer",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:display-page-number",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "presentation:display-date-time",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: REF 'style-drawing-page-properties-elements',
+24: CHOICE
+25: REF 'presentation-sound',
+25: EPSILON
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:family",
+19: VALUE 'chart',
+18: CHOICE
+19: REF 'style-chart-properties',
+20: ELEMENT "style:chart-properties",
+21: REF 'style-chart-properties-content-strict',
+22: SEQUENCE
+23: REF 'style-chart-properties-attlist',
+24: INTERLEAVE
+25: CHOICE
+26: ATTRIBUTE "chart:scale-text",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:three-dimensional",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:deep",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:right-angled-axes",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:symbol-type",
+27: VALUE 'none',
+26: ATTRIBUTE "chart:symbol-type",
+27: VALUE 'automatic',
+26: SEQUENCE
+27: ATTRIBUTE "chart:symbol-type",
+28: VALUE 'named-symbol',
+27: ATTRIBUTE "chart:symbol-name",
+28: CHOICE
+29: VALUE 'square',
+29: VALUE 'diamond',
+29: VALUE 'arrow-down',
+29: VALUE 'arrow-up',
+29: VALUE 'arrow-right',
+29: VALUE 'arrow-left',
+29: VALUE 'bow-tie',
+29: VALUE 'hourglass',
+29: VALUE 'circle',
+29: VALUE 'star',
+29: VALUE 'x',
+29: VALUE 'plus',
+29: VALUE 'asterisk',
+29: VALUE 'horizontal-bar',
+29: VALUE 'vertical-bar',
+26: SEQUENCE
+27: ATTRIBUTE "chart:symbol-type",
+28: VALUE 'image',
+27: ELEMENT "chart:symbol-image",
+28: ATTRIBUTE "xlink:href",
+29: REF 'anyIRI',
+30: DATA 'anyURI',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:symbol-width",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:symbol-height",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:sort-by-x-values",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:vertical",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:connect-bars",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:gap-width",
+27: REF 'integer',
+28: DATA 'integer',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:overlap",
+27: REF 'integer',
+28: DATA 'integer',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:group-bars-per-axis",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:japanese-candle-stick",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:interpolation",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'cubic-spline',
+28: VALUE 'b-spline',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:spline-order",
+27: REF 'positiveInteger',
+28: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:spline-resolution",
+27: REF 'positiveInteger',
+28: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:pie-offset",
+27: REF 'nonNegativeInteger',
+28: DATA 'nonNegativeInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:angle-offset",
+27: REF 'angle',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:hole-size",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:lines",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:solid-type",
+27: CHOICE
+28: VALUE 'cuboid',
+28: VALUE 'cylinder',
+28: VALUE 'cone',
+28: VALUE 'pyramid',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:stacked",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:percentage",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:treat-empty-cells",
+27: CHOICE
+28: VALUE 'use-zero',
+28: VALUE 'leave-gap',
+28: VALUE 'ignore',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:link-data-style-to-source",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:logarithmic",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:maximum",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:minimum",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:origin",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:interval-major",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:interval-minor-divisor",
+27: REF 'positiveInteger',
+28: DATA 'positiveInteger',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:tick-marks-major-inner",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:tick-marks-major-outer",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:tick-marks-minor-inner",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:tick-marks-minor-outer",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:reverse-direction",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:display-label",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:text-overlap",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "text:line-break",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:label-arrangement",
+27: CHOICE
+28: VALUE 'side-by-side',
+28: VALUE 'stagger-even',
+28: VALUE 'stagger-odd',
+26: EPSILON
+25: REF 'common-style-direction-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:direction",
+28: CHOICE
+29: VALUE 'ltr',
+29: VALUE 'ttb',
+27: EPSILON
+25: REF 'common-rotation-angle-attlist',
+26: CHOICE
+27: ATTRIBUTE "style:rotation-angle",
+28: REF 'angle',
+29: DATA 'string',
+27: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:data-label-number",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'value',
+28: VALUE 'percentage',
+28: VALUE 'value-and-percentage',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:data-label-text",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:data-label-symbol",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ELEMENT "chart:label-separator",
+27: REF 'text-p',
+28: ELEMENT "text:p",
+29: SEQUENCE
+30: REF 'paragraph-attrs',
+31: INTERLEAVE
+32: CHOICE
+33: ATTRIBUTE "text:style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:class-names",
+34: REF 'styleNameRefs',
+35: LIST
+36: CHOICE
+37: ONEOREMORE
+38: DATA 'NCName',
+37: EPSILON
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "text:cond-style-name",
+34: REF 'styleNameRef',
+35: CHOICE
+36: DATA 'NCName',
+36: EPSILON
+33: EPSILON
+32: CHOICE
+33: SEQUENCE
+34: REF 'xml-id',
+35: ATTRIBUTE "xml:id",
+36: REF 'ID',
+37: DATA 'ID',
+34: CHOICE
+35: ATTRIBUTE "text:id",
+36: REF 'NCName',
+37: DATA 'NCName',
+35: EPSILON
+33: EPSILON
+32: CHOICE
+33: REF 'common-in-content-meta-attlist',
+34: SEQUENCE
+35: ATTRIBUTE "xhtml:about",
+36: REF 'URIorSafeCURIE',
+37: CHOICE
+38: REF 'anyURI',
+39: DATA 'anyURI',
+38: REF 'SafeCURIE',
+39: DATA 'string',
+35: ATTRIBUTE "xhtml:property",
+36: REF 'CURIEs',
+37: LIST
+38: ONEOREMORE
+39: REF 'CURIE',
+40: DATA 'string',
+35: REF 'common-meta-literal-attlist',
+36: SEQUENCE
+37: CHOICE
+38: ATTRIBUTE "xhtml:datatype",
+39: REF 'CURIE',
+40: DATA 'string',
+38: EPSILON
+37: CHOICE
+38: ATTRIBUTE "xhtml:content",
+39: REF 'string',
+40: DATA 'string',
+38: EPSILON
+33: EPSILON
+30: CHOICE
+31: ONEOREMORE
+32: REF 'paragraph-content-or-hyperlink',
+33: CHOICE
+34: REF 'paragraph-content',
+35: CHOICE
+36: STRING
+36: ELEMENT "text:s",
+37: CHOICE
+38: ATTRIBUTE "text:c",
+39: REF 'nonNegativeInteger',
+40: DATA 'nonNegativeInteger',
+38: EPSILON
+36: ELEMENT "text:tab",
+37: REF 'text-tab-attr',
+38: CHOICE
+39: ATTRIBUTE "text:tab-ref",
+40: REF 'nonNegativeInteger',
+41: DATA 'nonNegativeInteger',
+39: EPSILON
+36: ELEMENT "text:line-break",
+37: EPSILON
+36: REF 'text-soft-page-break',
+37: ELEMENT "text:soft-page-break",
+38: EPSILON
+36: ELEMENT "text:span",
+37: SEQUENCE
+38: CHOICE
+39: ATTRIBUTE "text:style-name",
+40: REF 'styleNameRef',
+41: CHOICE
+42: DATA 'NCName',
+42: EPSILON
+39: EPSILON
+38: CHOICE
+39: ATTRIBUTE "text:class-names",
+40: REF 'styleNameRefs',
+41: LIST
+42: CHOICE
+43: ONEOREMORE
+44: DATA 'NCName',
+43: EPSILON
+39: EPSILON
+38: CHOICE
+39: ONEOREMORE
+40: REF 'paragraph-content-or-hyperlink',
+41: CHOICE
+42: REF 'paragraph-content',
+43: CHOICE
+44: STRING
+42: REF 'text-a',
+43: ELEMENT "text:a",
+44: SEQUENCE
+45: REF 'text-a-attlist',
+46: INTERLEAVE
+47: CHOICE
+48: ATTRIBUTE "office:name",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "office:title",
+49: REF 'string',
+50: DATA 'string',
+48: EPSILON
+47: ATTRIBUTE "xlink:type",
+48: VALUE 'simple',
+47: ATTRIBUTE "xlink:href",
+48: REF 'anyIRI',
+49: DATA 'anyURI',
+47: CHOICE
+48: ATTRIBUTE "xlink:actuate",
+49: VALUE 'onRequest',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "office:target-frame-name",
+49: REF 'targetFrameName',
+50: CHOICE
+51: VALUE '_self',
+51: VALUE '_blank',
+51: VALUE '_parent',
+51: VALUE '_top',
+51: REF 'string',
+52: DATA 'string',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "xlink:show",
+49: CHOICE
+50: VALUE 'new',
+50: VALUE 'replace',
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "text:style-name",
+49: REF 'styleNameRef',
+50: CHOICE
+51: DATA 'NCName',
+51: EPSILON
+48: EPSILON
+47: CHOICE
+48: ATTRIBUTE "text:visited-style-name",
+49: REF 'styleNameRef',
+50: CHOICE
+51: DATA 'NCName',
+51: EPSILON
+48: EPSILON
+45: CHOICE
+46: REF 'office-event-listeners',
+46: EPSILON
+45: ONEOREMORE
+46: REF 'paragraph-content',
+47: CHOICE
+48: STRING
+39: EPSILON
+36: ELEMENT "text:meta",
+37: SEQUENCE
+38: REF 'text-meta-attlist',
+39: INTERLEAVE
+40: CHOICE
+41: REF 'common-in-content-meta-attlist',
+42: SEQUENCE
+43: ATTRIBUTE "xhtml:about",
+44: REF 'URIorSafeCURIE',
+45: CHOICE
+46: REF 'anyURI',
+47: DATA 'anyURI',
+46: REF 'SafeCURIE',
+47: DATA 'string',
+43: ATTRIBUTE "xhtml:property",
+44: REF 'CURIEs',
+45: LIST
+46: ONEOREMORE
+47: REF 'CURIE',
+48: DATA 'string',
+43: REF 'common-meta-literal-attlist',
+44: SEQUENCE
+45: CHOICE
+46: ATTRIBUTE "xhtml:datatype",
+47: REF 'CURIE',
+48: DATA 'string',
+46: EPSILON
+45: CHOICE
+46: ATTRIBUTE "xhtml:content",
+47: REF 'string',
+48: DATA 'string',
+46: EPSILON
+41: EPSILON
+40: CHOICE
+41: REF 'xml-id',
+42: ATTRIBUTE "xml:id",
+43: REF 'ID',
+44: DATA 'ID',
+41: EPSILON
+38: CHOICE
+39: ONEOREMORE
+40: REF 'paragraph-content-or-hyperlink',
+41: CHOICE
+42: REF 'paragraph-content',
+43: CHOICE
+44: STRING
+42: REF 'text-a',
+39: EPSILON
+36: REF 'text-bookmark',
+37: ELEMENT "text:bookmark",
+38: REF 'text-bookmark-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:name",
+41: REF 'string',
+42: DATA 'string',
+40: CHOICE
+41: REF 'xml-id',
+42: ATTRIBUTE "xml:id",
+43: REF 'ID',
+44: DATA 'ID',
+41: EPSILON
+36: REF 'text-bookmark-start',
+37: ELEMENT "text:bookmark-start",
+38: REF 'text-bookmark-start-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:name",
+41: REF 'string',
+42: DATA 'string',
+40: CHOICE
+41: REF 'xml-id',
+42: ATTRIBUTE "xml:id",
+43: REF 'ID',
+44: DATA 'ID',
+41: EPSILON
+40: CHOICE
+41: REF 'common-in-content-meta-attlist',
+42: SEQUENCE
+43: ATTRIBUTE "xhtml:about",
+44: REF 'URIorSafeCURIE',
+45: CHOICE
+46: REF 'anyURI',
+47: DATA 'anyURI',
+46: REF 'SafeCURIE',
+47: DATA 'string',
+43: ATTRIBUTE "xhtml:property",
+44: REF 'CURIEs',
+45: LIST
+46: ONEOREMORE
+47: REF 'CURIE',
+48: DATA 'string',
+43: REF 'common-meta-literal-attlist',
+44: SEQUENCE
+45: CHOICE
+46: ATTRIBUTE "xhtml:datatype",
+47: REF 'CURIE',
+48: DATA 'string',
+46: EPSILON
+45: CHOICE
+46: ATTRIBUTE "xhtml:content",
+47: REF 'string',
+48: DATA 'string',
+46: EPSILON
+41: EPSILON
+36: REF 'text-bookmark-end',
+37: ELEMENT "text:bookmark-end",
+38: REF 'text-bookmark-end-attlist',
+39: ATTRIBUTE "text:name",
+40: REF 'string',
+41: DATA 'string',
+36: ELEMENT "text:reference-mark",
+37: ATTRIBUTE "text:name",
+38: REF 'string',
+39: DATA 'string',
+36: ELEMENT "text:reference-mark-start",
+37: ATTRIBUTE "text:name",
+38: REF 'string',
+39: DATA 'string',
+36: ELEMENT "text:reference-mark-end",
+37: ATTRIBUTE "text:name",
+38: REF 'string',
+39: DATA 'string',
+36: ELEMENT "text:note",
+37: SEQUENCE
+38: REF 'text-note-class',
+39: ATTRIBUTE "text:note-class",
+40: CHOICE
+41: VALUE 'footnote',
+41: VALUE 'endnote',
+38: CHOICE
+39: ATTRIBUTE "text:id",
+40: REF 'string',
+41: DATA 'string',
+39: EPSILON
+38: ELEMENT "text:note-citation",
+39: SEQUENCE
+40: CHOICE
+41: ATTRIBUTE "text:label",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: STRING
+38: ELEMENT "text:note-body",
+39: CHOICE
+40: ONEOREMORE
+41: REF 'text-content',
+42: CHOICE
+43: REF 'text-h',
+44: ELEMENT "text:h",
+45: SEQUENCE
+46: REF 'heading-attrs',
+47: INTERLEAVE
+48: ATTRIBUTE "text:outline-level",
+49: REF 'positiveInteger',
+50: DATA 'positiveInteger',
+48: CHOICE
+49: ATTRIBUTE "text:restart-numbering",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:start-value",
+50: REF 'nonNegativeInteger',
+51: DATA 'nonNegativeInteger',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:is-list-header",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+46: REF 'paragraph-attrs',
+47: INTERLEAVE
+48: CHOICE
+49: ATTRIBUTE "text:style-name",
+50: REF 'styleNameRef',
+51: CHOICE
+52: DATA 'NCName',
+52: EPSILON
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:class-names",
+50: REF 'styleNameRefs',
+51: LIST
+52: CHOICE
+53: ONEOREMORE
+54: DATA 'NCName',
+53: EPSILON
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:cond-style-name",
+50: REF 'styleNameRef',
+51: CHOICE
+52: DATA 'NCName',
+52: EPSILON
+49: EPSILON
+48: CHOICE
+49: SEQUENCE
+50: REF 'xml-id',
+51: ATTRIBUTE "xml:id",
+52: REF 'ID',
+53: DATA 'ID',
+50: CHOICE
+51: ATTRIBUTE "text:id",
+52: REF 'NCName',
+53: DATA 'NCName',
+51: EPSILON
+49: EPSILON
+48: CHOICE
+49: REF 'common-in-content-meta-attlist',
+50: SEQUENCE
+51: ATTRIBUTE "xhtml:about",
+52: REF 'URIorSafeCURIE',
+53: CHOICE
+54: REF 'anyURI',
+55: DATA 'anyURI',
+54: REF 'SafeCURIE',
+55: DATA 'string',
+51: ATTRIBUTE "xhtml:property",
+52: REF 'CURIEs',
+53: LIST
+54: ONEOREMORE
+55: REF 'CURIE',
+56: DATA 'string',
+51: REF 'common-meta-literal-attlist',
+52: SEQUENCE
+53: CHOICE
+54: ATTRIBUTE "xhtml:datatype",
+55: REF 'CURIE',
+56: DATA 'string',
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "xhtml:content",
+55: REF 'string',
+56: DATA 'string',
+54: EPSILON
+49: EPSILON
+46: CHOICE
+47: REF 'text-number',
+48: ELEMENT "text:number",
+49: REF 'string',
+50: DATA 'string',
+47: EPSILON
+46: CHOICE
+47: ONEOREMORE
+48: REF 'paragraph-content-or-hyperlink',
+49: CHOICE
+50: REF 'paragraph-content',
+51: CHOICE
+52: STRING
+50: REF 'text-a',
+47: EPSILON
+43: REF 'text-p',
+43: REF 'text-list',
+44: ELEMENT "text:list",
+45: SEQUENCE
+46: REF 'text-list-attr',
+47: INTERLEAVE
+48: CHOICE
+49: ATTRIBUTE "text:style-name",
+50: REF 'styleNameRef',
+51: CHOICE
+52: DATA 'NCName',
+52: EPSILON
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:continue-numbering",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "text:continue-list",
+50: REF 'IDREF',
+51: DATA 'IDREF',
+49: EPSILON
+48: CHOICE
+49: REF 'xml-id',
+50: ATTRIBUTE "xml:id",
+51: REF 'ID',
+52: DATA 'ID',
+49: EPSILON
+46: CHOICE
+47: REF 'text-list-header',
+48: ELEMENT "text:list-header",
+49: SEQUENCE
+50: REF 'text-list-header-attr',
+51: CHOICE
+52: REF 'xml-id',
+53: ATTRIBUTE "xml:id",
+54: REF 'ID',
+55: DATA 'ID',
+52: EPSILON
+50: REF 'text-list-item-content',
+51: SEQUENCE
+52: CHOICE
+53: REF 'text-number',
+53: EPSILON
+52: CHOICE
+53: ONEOREMORE
+54: CHOICE
+55: REF 'text-p',
+55: REF 'text-h',
+55: REF 'text-list',
+55: REF 'text-soft-page-break',
+53: EPSILON
+47: EPSILON
+46: CHOICE
+47: ONEOREMORE
+48: REF 'text-list-item',
+49: ELEMENT "text:list-item",
+50: SEQUENCE
+51: REF 'text-list-item-attr',
+52: INTERLEAVE
+53: CHOICE
+54: ATTRIBUTE "text:start-value",
+55: REF 'nonNegativeInteger',
+56: DATA 'nonNegativeInteger',
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "text:style-override",
+55: REF 'styleNameRef',
+56: CHOICE
+57: DATA 'NCName',
+57: EPSILON
+54: EPSILON
+53: CHOICE
+54: REF 'xml-id',
+55: ATTRIBUTE "xml:id",
+56: REF 'ID',
+57: DATA 'ID',
+54: EPSILON
+51: REF 'text-list-item-content',
+52: SEQUENCE
+53: CHOICE
+54: REF 'text-number',
+54: EPSILON
+53: CHOICE
+54: ONEOREMORE
+55: CHOICE
+56: REF 'text-p',
+56: REF 'text-h',
+56: REF 'text-list',
+56: REF 'text-soft-page-break',
+54: EPSILON
+47: EPSILON
+43: REF 'text-numbered-paragraph',
+44: ELEMENT "text:numbered-paragraph",
+45: SEQUENCE
+46: REF 'text-numbered-paragraph-attr',
+47: INTERLEAVE
+48: ATTRIBUTE "text:list-id",
+49: REF 'NCName',
+50: DATA 'NCName',
+48: CHOICE
+49: ATTRIBUTE "text:level",
+50: REF 'positiveInteger',
+51: DATA 'positiveInteger',
+49: EPSILON
+48: CHOICE
+49: SEQUENCE
+50: ATTRIBUTE "text:style-name",
+51: REF 'styleNameRef',
+52: CHOICE
+53: DATA 'NCName',
+53: EPSILON
+50: ATTRIBUTE "text:continue-numbering",
+51: REF 'boolean',
+52: CHOICE
+53: VALUE 'true',
+53: VALUE 'false',
+50: ATTRIBUTE "text:start-value",
+51: REF 'nonNegativeInteger',
+52: DATA 'nonNegativeInteger',
+49: EPSILON
+48: CHOICE
+49: REF 'xml-id',
+50: ATTRIBUTE "xml:id",
+51: REF 'ID',
+52: DATA 'ID',
+49: EPSILON
+46: CHOICE
+47: REF 'text-number',
+47: EPSILON
+46: CHOICE
+47: REF 'text-p',
+47: REF 'text-h',
+43: REF 'table-table',
+44: ELEMENT "table:table",
+45: SEQUENCE
+46: REF 'table-table-attlist',
+47: INTERLEAVE
+48: CHOICE
+49: ATTRIBUTE "table:name",
+50: REF 'string',
+51: DATA 'string',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:style-name",
+50: REF 'styleNameRef',
+51: CHOICE
+52: DATA 'NCName',
+52: EPSILON
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:template-name",
+50: REF 'string',
+51: DATA 'string',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:use-first-row-styles",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:use-last-row-styles",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:use-first-column-styles",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:use-last-column-styles",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:use-banding-rows-styles",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:use-banding-columns-styles",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:protected",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:protection-key",
+50: REF 'string',
+51: DATA 'string',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:protection-key-digest-algorithm",
+50: REF 'anyIRI',
+51: DATA 'anyURI',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:print",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:print-ranges",
+50: REF 'cellRangeAddressList',
+51: DATA 'string',
+49: EPSILON
+48: CHOICE
+49: REF 'xml-id',
+50: ATTRIBUTE "xml:id",
+51: REF 'ID',
+52: DATA 'ID',
+49: EPSILON
+48: CHOICE
+49: ATTRIBUTE "table:is-sub-table",
+50: REF 'boolean',
+51: CHOICE
+52: VALUE 'true',
+52: VALUE 'false',
+49: EPSILON
+46: CHOICE
+47: REF 'table-title',
+48: ELEMENT "table:title",
+49: STRING
+47: EPSILON
+46: CHOICE
+47: REF 'table-desc',
+48: ELEMENT "table:desc",
+49: STRING
+47: EPSILON
+46: CHOICE
+47: REF 'table-table-source',
+48: ELEMENT "table:table-source",
+49: SEQUENCE
+50: REF 'table-table-source-attlist',
+51: INTERLEAVE
+52: CHOICE
+53: ATTRIBUTE "table:mode",
+54: CHOICE
+55: VALUE 'copy-all',
+55: VALUE 'copy-results-only',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "table:table-name",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+50: REF 'table-linked-source-attlist',
+51: INTERLEAVE
+52: ATTRIBUTE "xlink:type",
+53: VALUE 'simple',
+52: ATTRIBUTE "xlink:href",
+53: REF 'anyIRI',
+54: DATA 'anyURI',
+52: CHOICE
+53: ATTRIBUTE "xlink:actuate",
+54: VALUE 'onRequest',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "table:filter-name",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "table:filter-options",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "table:refresh-delay",
+54: REF 'duration',
+55: DATA 'duration',
+53: EPSILON
+47: EPSILON
+46: CHOICE
+47: REF 'office-dde-source',
+48: ELEMENT "office:dde-source",
+49: SEQUENCE
+50: REF 'office-dde-source-attlist',
+51: INTERLEAVE
+52: CHOICE
+53: ATTRIBUTE "office:name",
+54: REF 'string',
+55: DATA 'string',
+53: EPSILON
+52: CHOICE
+53: ATTRIBUTE "office:conversion-mode",
+54: CHOICE
+55: VALUE 'into-default-style-data-style',
+55: VALUE 'into-english-number',
+55: VALUE 'keep-text',
+53: EPSILON
+50: REF 'common-dde-connection-decl-attlist',
+51: INTERLEAVE
+52: ATTRIBUTE "office:dde-application",
+53: REF 'string',
+54: DATA 'string',
+52: ATTRIBUTE "office:dde-topic",
+53: REF 'string',
+54: DATA 'string',
+52: ATTRIBUTE "office:dde-item",
+53: REF 'string',
+54: DATA 'string',
+52: CHOICE
+53: ATTRIBUTE "office:automatic-update",
+54: REF 'boolean',
+55: CHOICE
+56: VALUE 'true',
+56: VALUE 'false',
+53: EPSILON
+47: EPSILON
+46: CHOICE
+47: REF 'table-scenario',
+48: ELEMENT "table:scenario",
+49: REF 'table-scenario-attlist',
+50: INTERLEAVE
+51: ATTRIBUTE "table:scenario-ranges",
+52: REF 'cellRangeAddressList',
+53: DATA 'string',
+51: ATTRIBUTE "table:is-active",
+52: REF 'boolean',
+53: CHOICE
+54: VALUE 'true',
+54: VALUE 'false',
+51: CHOICE
+52: ATTRIBUTE "table:display-border",
+53: REF 'boolean',
+54: CHOICE
+55: VALUE 'true',
+55: VALUE 'false',
+52: EPSILON
+51: CHOICE
+52: ATTRIBUTE "table:border-color",
+53: REF 'color',
+54: DATA 'string',
+52: EPSILON
+51: CHOICE
+52: ATTRIBUTE "table:copy-back",
+53: REF 'boolean',
+54: CHOICE
+55: VALUE 'true',
+55: VALUE 'false',
+52: EPSILON
+51: CHOICE
+52: ATTRIBUTE "table:copy-styles",
+53: REF 'boolean',
+54: CHOICE
+55: VALUE 'true',
+55: VALUE 'false',
+52: EPSILON
+51: CHOICE
+52: ATTRIBUTE "table:copy-formulas",
+53: REF 'boolean',
+54: CHOICE
+55: VALUE 'true',
+55: VALUE 'false',
+52: EPSILON
+51: CHOICE
+52: ATTRIBUTE "table:comment",
+53: REF 'string',
+54: DATA 'string',
+52: EPSILON
+51: CHOICE
+52: ATTRIBUTE "table:protected",
+53: REF 'boolean',
+54: CHOICE
+55: VALUE 'true',
+55: VALUE 'false',
+52: EPSILON
+47: EPSILON
+46: CHOICE
+47: REF 'office-forms',
+48: CHOICE
+49: ELEMENT "office:forms",
+50: SEQUENCE
+51: REF 'office-forms-attlist',
+52: INTERLEAVE
+53: CHOICE
+54: ATTRIBUTE "form:automatic-focus",
+55: REF 'boolean',
+56: CHOICE
+57: VALUE 'true',
+57: VALUE 'false',
+54: EPSILON
+53: CHOICE
+54: ATTRIBUTE "form:apply-design-mode",
+55: REF 'boolean',
+56: CHOICE
+57: VALUE 'true',
+57: VALUE 'false',
+54: EPSILON
+51: CHOICE
+52: ONEOREMORE
+53: CHOICE
+54: REF 'form-form',
+55: ELEMENT "form:form",
+56: SEQUENCE
+57: REF 'common-form-control-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "form:name",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:control-implementation",
+61: REF 'namespacedToken',
+62: DATA 'QName',
+60: EPSILON
+57: REF 'form-form-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: SEQUENCE
+61: ATTRIBUTE "xlink:type",
+62: VALUE 'simple',
+61: ATTRIBUTE "xlink:href",
+62: REF 'anyIRI',
+63: DATA 'anyURI',
+61: CHOICE
+62: ATTRIBUTE "xlink:actuate",
+63: VALUE 'onRequest',
+62: EPSILON
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "office:target-frame",
+61: REF 'targetFrameName',
+62: CHOICE
+63: VALUE '_self',
+63: VALUE '_blank',
+63: VALUE '_parent',
+63: VALUE '_top',
+63: REF 'string',
+64: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:method",
+61: CHOICE
+62: VALUE 'get',
+62: VALUE 'post',
+62: REF 'string',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:enctype",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:allow-deletes",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:allow-inserts",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:allow-updates",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:apply-filter",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:command-type",
+61: CHOICE
+62: VALUE 'table',
+62: VALUE 'query',
+62: VALUE 'command',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:command",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:datasource",
+61: CHOICE
+62: REF 'anyIRI',
+63: DATA 'anyURI',
+62: REF 'string',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:master-fields",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:detail-fields",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:escape-processing",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:filter",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:ignore-result",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:navigation-mode",
+61: REF 'navigation',
+62: CHOICE
+63: VALUE 'none',
+63: VALUE 'current',
+63: VALUE 'parent',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:order",
+61: REF 'string',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "form:tab-cycle",
+61: REF 'tab-cycles',
+62: CHOICE
+63: VALUE 'records',
+63: VALUE 'current',
+63: VALUE 'page',
+60: EPSILON
+57: CHOICE
+58: REF 'form-properties',
+59: ELEMENT "form:properties",
+60: ONEOREMORE
+61: REF 'form-property',
+62: CHOICE
+63: ELEMENT "form:property",
+64: SEQUENCE
+65: REF 'form-property-name',
+66: ATTRIBUTE "form:property-name",
+67: REF 'string',
+68: DATA 'string',
+65: REF 'form-property-value-and-type-attlist',
+66: CHOICE
+67: REF 'common-value-and-type-attlist',
+68: CHOICE
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'float',
+70: ATTRIBUTE "office:value",
+71: REF 'double',
+72: DATA 'double',
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'percentage',
+70: ATTRIBUTE "office:value",
+71: REF 'double',
+72: DATA 'double',
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'currency',
+70: ATTRIBUTE "office:value",
+71: REF 'double',
+72: DATA 'double',
+70: CHOICE
+71: ATTRIBUTE "office:currency",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'date',
+70: ATTRIBUTE "office:date-value",
+71: REF 'dateOrDateTime',
+72: CHOICE
+73: DATA 'date',
+73: DATA 'dateTime',
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'time',
+70: ATTRIBUTE "office:time-value",
+71: REF 'duration',
+72: DATA 'duration',
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'boolean',
+70: ATTRIBUTE "office:boolean-value",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+69: SEQUENCE
+70: ATTRIBUTE "office:value-type",
+71: VALUE 'string',
+70: CHOICE
+71: ATTRIBUTE "office:string-value",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+67: ATTRIBUTE "office:value-type",
+68: VALUE 'void',
+63: ELEMENT "form:list-property",
+64: SEQUENCE
+65: REF 'form-property-name',
+66: ATTRIBUTE "form:property-name",
+67: REF 'string',
+68: DATA 'string',
+65: REF 'form-property-type-and-value-list',
+66: CHOICE
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'float',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: ATTRIBUTE "office:value",
+72: REF 'double',
+73: DATA 'double',
+69: EPSILON
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'percentage',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: ATTRIBUTE "office:value",
+72: REF 'double',
+73: DATA 'double',
+69: EPSILON
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'currency',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: SEQUENCE
+72: ATTRIBUTE "office:value",
+73: REF 'double',
+74: DATA 'double',
+72: CHOICE
+73: ATTRIBUTE "office:currency",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+69: EPSILON
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'date',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: ATTRIBUTE "office:date-value",
+72: REF 'dateOrDateTime',
+73: CHOICE
+74: DATA 'date',
+74: DATA 'dateTime',
+69: EPSILON
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'time',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: ATTRIBUTE "office:time-value",
+72: REF 'duration',
+73: DATA 'duration',
+69: EPSILON
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'boolean',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: ATTRIBUTE "office:boolean-value",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+69: EPSILON
+67: SEQUENCE
+68: ATTRIBUTE "office:value-type",
+69: VALUE 'string',
+68: CHOICE
+69: ONEOREMORE
+70: ELEMENT "form:list-value",
+71: ATTRIBUTE "office:string-value",
+72: REF 'string',
+73: DATA 'string',
+69: EPSILON
+67: ATTRIBUTE "office:value-type",
+68: VALUE 'void',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: CHOICE
+60: REF 'controls',
+61: CHOICE
+62: REF 'column-controls',
+63: CHOICE
+64: ELEMENT "form:text",
+65: SEQUENCE
+66: REF 'form-text-attlist',
+67: SEQUENCE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-current-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:current-value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-linked-cell',
+69: CHOICE
+70: ATTRIBUTE "form:linked-cell",
+71: CHOICE
+72: REF 'cellAddress',
+73: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+64: ELEMENT "form:textarea",
+65: SEQUENCE
+66: REF 'form-textarea-attlist',
+67: SEQUENCE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-current-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:current-value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-linked-cell',
+69: CHOICE
+70: ATTRIBUTE "form:linked-cell",
+71: CHOICE
+72: REF 'cellAddress',
+73: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+66: CHOICE
+67: ONEOREMORE
+68: REF 'text-p',
+67: EPSILON
+64: ELEMENT "form:formatted-text",
+65: SEQUENCE
+66: REF 'form-formatted-text-attlist',
+67: INTERLEAVE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-current-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:current-value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-linked-cell',
+69: CHOICE
+70: ATTRIBUTE "form:linked-cell",
+71: CHOICE
+72: REF 'cellAddress',
+73: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+68: REF 'common-spin-button',
+69: CHOICE
+70: ATTRIBUTE "form:spin-button",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-repeat',
+69: CHOICE
+70: ATTRIBUTE "form:repeat",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-delay-for-repeat',
+69: CHOICE
+70: ATTRIBUTE "form:delay-for-repeat",
+71: REF 'duration',
+72: DATA 'duration',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:max-value",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:min-value",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:validation",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+64: ELEMENT "form:number",
+65: SEQUENCE
+66: REF 'form-number-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:value",
+70: REF 'double',
+71: DATA 'double',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:current-value",
+70: REF 'double',
+71: DATA 'double',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:min-value",
+70: REF 'double',
+71: DATA 'double',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:max-value",
+70: REF 'double',
+71: DATA 'double',
+69: EPSILON
+66: REF 'common-numeric-control-attlist',
+67: SEQUENCE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+66: REF 'common-spin-button',
+67: CHOICE
+68: ATTRIBUTE "form:spin-button",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:repeat",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-delay-for-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:delay-for-repeat",
+69: REF 'duration',
+70: DATA 'duration',
+68: EPSILON
+64: ELEMENT "form:date",
+65: SEQUENCE
+66: REF 'form-date-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:value",
+70: REF 'date',
+71: DATA 'date',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:current-value",
+70: REF 'date',
+71: DATA 'date',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:min-value",
+70: REF 'date',
+71: DATA 'date',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:max-value",
+70: REF 'date',
+71: DATA 'date',
+69: EPSILON
+66: REF 'common-numeric-control-attlist',
+67: SEQUENCE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+66: REF 'common-spin-button',
+67: CHOICE
+68: ATTRIBUTE "form:spin-button",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:repeat",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-delay-for-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:delay-for-repeat",
+69: REF 'duration',
+70: DATA 'duration',
+68: EPSILON
+64: ELEMENT "form:time",
+65: SEQUENCE
+66: REF 'form-time-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:value",
+70: REF 'time',
+71: DATA 'time',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:current-value",
+70: REF 'time',
+71: DATA 'time',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:min-value",
+70: REF 'time',
+71: DATA 'time',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:max-value",
+70: REF 'time',
+71: DATA 'time',
+69: EPSILON
+66: REF 'common-numeric-control-attlist',
+67: SEQUENCE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+66: REF 'common-spin-button',
+67: CHOICE
+68: ATTRIBUTE "form:spin-button",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:repeat",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-delay-for-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:delay-for-repeat",
+69: REF 'duration',
+70: DATA 'duration',
+68: EPSILON
+64: ELEMENT "form:combobox",
+65: SEQUENCE
+66: REF 'form-combobox-attlist',
+67: INTERLEAVE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-current-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:current-value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'dropdown',
+69: CHOICE
+70: ATTRIBUTE "form:dropdown",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-maxlength-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:max-length",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-readonly-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:readonly",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'size',
+69: CHOICE
+70: ATTRIBUTE "form:size",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-convert-empty-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:convert-empty-to-null",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'list-source',
+69: CHOICE
+70: ATTRIBUTE "form:list-source",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'list-source-type',
+69: CHOICE
+70: ATTRIBUTE "form:list-source-type",
+71: CHOICE
+72: VALUE 'table',
+72: VALUE 'query',
+72: VALUE 'sql',
+72: VALUE 'sql-pass-through',
+72: VALUE 'value-list',
+72: VALUE 'table-fields',
+70: EPSILON
+68: REF 'common-linked-cell',
+69: CHOICE
+70: ATTRIBUTE "form:linked-cell",
+71: CHOICE
+72: REF 'cellAddress',
+73: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+68: REF 'common-source-cell-range',
+69: CHOICE
+70: ATTRIBUTE "form:source-cell-range",
+71: CHOICE
+72: REF 'cellRangeAddress',
+73: CHOICE
+74: DATA 'string',
+74: DATA 'string',
+74: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:auto-complete",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+66: CHOICE
+67: ONEOREMORE
+68: REF 'form-item',
+69: ELEMENT "form:item",
+70: SEQUENCE
+71: REF 'form-item-attlist',
+72: REF 'label',
+73: CHOICE
+74: ATTRIBUTE "form:label",
+75: REF 'string',
+76: DATA 'string',
+74: EPSILON
+71: STRING
+67: EPSILON
+64: ELEMENT "form:listbox",
+65: SEQUENCE
+66: REF 'form-listbox-attlist',
+67: INTERLEAVE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'dropdown',
+69: CHOICE
+70: ATTRIBUTE "form:dropdown",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'size',
+69: CHOICE
+70: ATTRIBUTE "form:size",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'bound-column',
+69: CHOICE
+70: ATTRIBUTE "form:bound-column",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'list-source',
+69: CHOICE
+70: ATTRIBUTE "form:list-source",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'list-source-type',
+69: CHOICE
+70: ATTRIBUTE "form:list-source-type",
+71: CHOICE
+72: VALUE 'table',
+72: VALUE 'query',
+72: VALUE 'sql',
+72: VALUE 'sql-pass-through',
+72: VALUE 'value-list',
+72: VALUE 'table-fields',
+70: EPSILON
+68: REF 'common-linked-cell',
+69: CHOICE
+70: ATTRIBUTE "form:linked-cell",
+71: CHOICE
+72: REF 'cellAddress',
+73: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+68: REF 'list-linkage-type',
+69: CHOICE
+70: ATTRIBUTE "form:list-linkage-type",
+71: CHOICE
+72: VALUE 'selection',
+72: VALUE 'selection-indices',
+70: EPSILON
+68: REF 'common-source-cell-range',
+69: CHOICE
+70: ATTRIBUTE "form:source-cell-range",
+71: CHOICE
+72: REF 'cellRangeAddress',
+73: CHOICE
+74: DATA 'string',
+74: DATA 'string',
+74: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:multiple",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:xforms-list-source",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+66: CHOICE
+67: ONEOREMORE
+68: REF 'form-option',
+69: ELEMENT "form:option",
+70: SEQUENCE
+71: REF 'form-option-attlist',
+72: SEQUENCE
+73: REF 'current-selected',
+74: CHOICE
+75: ATTRIBUTE "form:current-selected",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+73: REF 'selected',
+74: CHOICE
+75: ATTRIBUTE "form:selected",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+73: REF 'label',
+74: CHOICE
+75: ATTRIBUTE "form:label",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+73: REF 'common-value-attlist',
+74: CHOICE
+75: ATTRIBUTE "form:value",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+71: STRING
+67: EPSILON
+64: ELEMENT "form:checkbox",
+65: SEQUENCE
+66: REF 'form-checkbox-attlist',
+67: INTERLEAVE
+68: REF 'form-control-attlist',
+69: SEQUENCE
+70: REF 'common-form-control-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "form:name",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "form:control-implementation",
+74: REF 'namespacedToken',
+75: DATA 'QName',
+73: EPSILON
+70: REF 'common-control-id-attlist',
+71: SEQUENCE
+72: REF 'xml-id',
+73: ATTRIBUTE "xml:id",
+74: REF 'ID',
+75: DATA 'ID',
+72: CHOICE
+73: ATTRIBUTE "form:id",
+74: REF 'NCName',
+75: DATA 'NCName',
+73: EPSILON
+70: REF 'xforms-bind-attlist',
+71: CHOICE
+72: ATTRIBUTE "xforms:bind",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+68: REF 'common-disabled-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:disabled",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'label',
+69: CHOICE
+70: ATTRIBUTE "form:label",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-printable-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:printable",
+71: REF 'boolean',
+72: CHOICE
+73: VALUE 'true',
+73: VALUE 'false',
+70: EPSILON
+68: REF 'common-tab-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:tab-index",
+72: REF 'nonNegativeInteger',
+73: DATA 'nonNegativeInteger',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:tab-stop",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+68: REF 'common-title-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:title",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-value-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:value",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-data-field-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:data-field",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-form-visual-effect-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:visual-effect",
+71: CHOICE
+72: VALUE 'flat',
+72: VALUE '3d',
+70: EPSILON
+68: REF 'common-form-relative-image-position-attlist',
+69: CHOICE
+70: ATTRIBUTE "form:image-position",
+71: VALUE 'center',
+70: EPSILON
+70: SEQUENCE
+71: ATTRIBUTE "form:image-position",
+72: CHOICE
+73: VALUE 'start',
+73: VALUE 'end',
+73: VALUE 'top',
+73: VALUE 'bottom',
+71: CHOICE
+72: ATTRIBUTE "form:image-align",
+73: CHOICE
+74: VALUE 'start',
+74: VALUE 'center',
+74: VALUE 'end',
+72: EPSILON
+68: REF 'common-linked-cell',
+69: CHOICE
+70: ATTRIBUTE "form:linked-cell",
+71: CHOICE
+72: REF 'cellAddress',
+73: DATA 'string',
+72: REF 'string',
+73: DATA 'string',
+70: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:current-state",
+70: REF 'states',
+71: CHOICE
+72: VALUE 'unchecked',
+72: VALUE 'checked',
+72: VALUE 'unknown',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:is-tristate",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:state",
+70: REF 'states',
+71: CHOICE
+72: VALUE 'unchecked',
+72: VALUE 'checked',
+72: VALUE 'unknown',
+69: EPSILON
+66: REF 'common-form-control-content',
+67: SEQUENCE
+68: CHOICE
+69: REF 'form-properties',
+69: EPSILON
+68: CHOICE
+69: REF 'office-event-listeners',
+69: EPSILON
+62: ELEMENT "form:password",
+63: SEQUENCE
+64: REF 'form-password-attlist',
+65: INTERLEAVE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-maxlength-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:max-length",
+69: REF 'nonNegativeInteger',
+70: DATA 'nonNegativeInteger',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-convert-empty-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:convert-empty-to-null",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:echo-char",
+68: REF 'character',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:file",
+63: SEQUENCE
+64: REF 'form-file-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-current-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:current-value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-maxlength-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:max-length",
+69: REF 'nonNegativeInteger',
+70: DATA 'nonNegativeInteger',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-readonly-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:readonly",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:fixed-text",
+63: SEQUENCE
+64: REF 'form-fixed-text-attlist',
+65: INTERLEAVE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'for',
+67: CHOICE
+68: ATTRIBUTE "form:for",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'label',
+67: CHOICE
+68: ATTRIBUTE "form:label",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:multi-line",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:button",
+63: SEQUENCE
+64: REF 'form-button-attlist',
+65: INTERLEAVE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'button-type',
+67: CHOICE
+68: ATTRIBUTE "form:button-type",
+69: REF 'types',
+70: CHOICE
+71: VALUE 'submit',
+71: VALUE 'reset',
+71: VALUE 'push',
+71: VALUE 'url',
+68: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'label',
+67: CHOICE
+68: ATTRIBUTE "form:label",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'image-data',
+67: CHOICE
+68: ATTRIBUTE "form:image-data",
+69: REF 'anyIRI',
+70: DATA 'anyURI',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'target-frame',
+67: CHOICE
+68: ATTRIBUTE "office:target-frame",
+69: REF 'targetFrameName',
+70: CHOICE
+71: VALUE '_self',
+71: VALUE '_blank',
+71: VALUE '_parent',
+71: VALUE '_top',
+71: REF 'string',
+72: DATA 'string',
+68: EPSILON
+66: REF 'target-location',
+67: CHOICE
+68: ATTRIBUTE "xlink:href",
+69: REF 'anyIRI',
+70: DATA 'anyURI',
+68: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-form-relative-image-position-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:image-position",
+69: VALUE 'center',
+68: EPSILON
+68: SEQUENCE
+69: ATTRIBUTE "form:image-position",
+70: CHOICE
+71: VALUE 'start',
+71: VALUE 'end',
+71: VALUE 'top',
+71: VALUE 'bottom',
+69: CHOICE
+70: ATTRIBUTE "form:image-align",
+71: CHOICE
+72: VALUE 'start',
+72: VALUE 'center',
+72: VALUE 'end',
+70: EPSILON
+66: REF 'common-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:repeat",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-delay-for-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:delay-for-repeat",
+69: REF 'duration',
+70: DATA 'duration',
+68: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:default-button",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:toggle",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:focus-on-click",
+68: REF 'boolean',
+69: CHOICE
+70: VALUE 'true',
+70: VALUE 'false',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:xforms-submission",
+68: REF 'string',
+69: DATA 'string',
+67: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:image",
+63: SEQUENCE
+64: REF 'form-image-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'button-type',
+67: CHOICE
+68: ATTRIBUTE "form:button-type",
+69: REF 'types',
+70: CHOICE
+71: VALUE 'submit',
+71: VALUE 'reset',
+71: VALUE 'push',
+71: VALUE 'url',
+68: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'image-data',
+67: CHOICE
+68: ATTRIBUTE "form:image-data",
+69: REF 'anyIRI',
+70: DATA 'anyURI',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'target-frame',
+67: CHOICE
+68: ATTRIBUTE "office:target-frame",
+69: REF 'targetFrameName',
+70: CHOICE
+71: VALUE '_self',
+71: VALUE '_blank',
+71: VALUE '_parent',
+71: VALUE '_top',
+71: REF 'string',
+72: DATA 'string',
+68: EPSILON
+66: REF 'target-location',
+67: CHOICE
+68: ATTRIBUTE "xlink:href",
+69: REF 'anyIRI',
+70: DATA 'anyURI',
+68: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:radio",
+63: SEQUENCE
+64: REF 'form-radio-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'current-selected',
+67: CHOICE
+68: ATTRIBUTE "form:current-selected",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'label',
+67: CHOICE
+68: ATTRIBUTE "form:label",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'selected',
+67: CHOICE
+68: ATTRIBUTE "form:selected",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-data-field-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:data-field",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-form-visual-effect-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:visual-effect",
+69: CHOICE
+70: VALUE 'flat',
+70: VALUE '3d',
+68: EPSILON
+66: REF 'common-form-relative-image-position-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:image-position",
+69: VALUE 'center',
+68: EPSILON
+68: SEQUENCE
+69: ATTRIBUTE "form:image-position",
+70: CHOICE
+71: VALUE 'start',
+71: VALUE 'end',
+71: VALUE 'top',
+71: VALUE 'bottom',
+69: CHOICE
+70: ATTRIBUTE "form:image-align",
+71: CHOICE
+72: VALUE 'start',
+72: VALUE 'center',
+72: VALUE 'end',
+70: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:frame",
+63: SEQUENCE
+64: REF 'form-frame-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'for',
+67: CHOICE
+68: ATTRIBUTE "form:for",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'label',
+67: CHOICE
+68: ATTRIBUTE "form:label",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:image-frame",
+63: SEQUENCE
+64: REF 'form-image-frame-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'image-data',
+67: CHOICE
+68: ATTRIBUTE "form:image-data",
+69: REF 'anyIRI',
+70: DATA 'anyURI',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-readonly-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:readonly",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-data-field-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:data-field",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:hidden",
+63: SEQUENCE
+64: REF 'form-hidden-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:grid",
+63: SEQUENCE
+64: REF 'form-grid-attlist',
+65: SEQUENCE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+64: CHOICE
+65: ONEOREMORE
+66: REF 'form-column',
+67: ELEMENT "form:column",
+68: SEQUENCE
+69: REF 'form-column-attlist',
+70: SEQUENCE
+71: REF 'common-form-control-attlist',
+72: INTERLEAVE
+73: CHOICE
+74: ATTRIBUTE "form:name",
+75: REF 'string',
+76: DATA 'string',
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "form:control-implementation",
+75: REF 'namespacedToken',
+76: DATA 'QName',
+74: EPSILON
+71: REF 'label',
+72: CHOICE
+73: ATTRIBUTE "form:label",
+74: REF 'string',
+75: DATA 'string',
+73: EPSILON
+71: REF 'text-style-name',
+72: CHOICE
+73: ATTRIBUTE "form:text-style-name",
+74: REF 'styleNameRef',
+75: CHOICE
+76: DATA 'NCName',
+76: EPSILON
+73: EPSILON
+69: ONEOREMORE
+70: REF 'column-controls',
+71: CHOICE
+65: EPSILON
+62: ELEMENT "form:value-range",
+63: SEQUENCE
+64: REF 'form-value-range-attlist',
+65: INTERLEAVE
+66: REF 'form-control-attlist',
+67: SEQUENCE
+68: REF 'common-form-control-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "form:name",
+72: REF 'string',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "form:control-implementation",
+72: REF 'namespacedToken',
+73: DATA 'QName',
+71: EPSILON
+68: REF 'common-control-id-attlist',
+69: SEQUENCE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: CHOICE
+71: ATTRIBUTE "form:id",
+72: REF 'NCName',
+73: DATA 'NCName',
+71: EPSILON
+68: REF 'xforms-bind-attlist',
+69: CHOICE
+70: ATTRIBUTE "xforms:bind",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+66: REF 'common-disabled-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:disabled",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-printable-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:printable",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-tab-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "form:tab-index",
+70: REF 'nonNegativeInteger',
+71: DATA 'nonNegativeInteger',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "form:tab-stop",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-title-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:title",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-value-attlist',
+67: CHOICE
+68: ATTRIBUTE "form:value",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: REF 'common-linked-cell',
+67: CHOICE
+68: ATTRIBUTE "form:linked-cell",
+69: CHOICE
+70: REF 'cellAddress',
+71: DATA 'string',
+70: REF 'string',
+71: DATA 'string',
+68: EPSILON
+66: REF 'common-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:repeat",
+69: REF 'boolean',
+70: CHOICE
+71: VALUE 'true',
+71: VALUE 'false',
+68: EPSILON
+66: REF 'common-delay-for-repeat',
+67: CHOICE
+68: ATTRIBUTE "form:delay-for-repeat",
+69: REF 'duration',
+70: DATA 'duration',
+68: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:max-value",
+68: REF 'integer',
+69: DATA 'integer',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:min-value",
+68: REF 'integer',
+69: DATA 'integer',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:step-size",
+68: REF 'positiveInteger',
+69: DATA 'positiveInteger',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:page-step-size",
+68: REF 'positiveInteger',
+69: DATA 'positiveInteger',
+67: EPSILON
+66: CHOICE
+67: ATTRIBUTE "form:orientation",
+68: CHOICE
+69: VALUE 'horizontal',
+69: VALUE 'vertical',
+67: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+62: ELEMENT "form:generic-control",
+63: SEQUENCE
+64: REF 'form-generic-control-attlist',
+65: REF 'form-control-attlist',
+66: SEQUENCE
+67: REF 'common-form-control-attlist',
+68: INTERLEAVE
+69: CHOICE
+70: ATTRIBUTE "form:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "form:control-implementation",
+71: REF 'namespacedToken',
+72: DATA 'QName',
+70: EPSILON
+67: REF 'common-control-id-attlist',
+68: SEQUENCE
+69: REF 'xml-id',
+70: ATTRIBUTE "xml:id",
+71: REF 'ID',
+72: DATA 'ID',
+69: CHOICE
+70: ATTRIBUTE "form:id",
+71: REF 'NCName',
+72: DATA 'NCName',
+70: EPSILON
+67: REF 'xforms-bind-attlist',
+68: CHOICE
+69: ATTRIBUTE "xforms:bind",
+70: REF 'string',
+71: DATA 'string',
+69: EPSILON
+64: REF 'common-form-control-content',
+65: SEQUENCE
+66: CHOICE
+67: REF 'form-properties',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+60: REF 'form-form',
+58: EPSILON
+57: CHOICE
+58: REF 'form-connection-resource',
+59: ELEMENT "form:connection-resource",
+60: ATTRIBUTE "xlink:href",
+61: REF 'anyIRI',
+62: DATA 'anyURI',
+58: EPSILON
+54: REF 'xforms-model',
+55: ELEMENT "xforms:model",
+56: REF 'anyAttListOrElements',
+57: SEQUENCE
+58: CHOICE
+59: ONEOREMORE
+60: ATTRIBUTE "*",
+61: STRING
+59: EPSILON
+58: REF 'anyElements',
+59: CHOICE
+60: ONEOREMORE
+60: EPSILON
+52: EPSILON
+49: EPSILON
+47: EPSILON
+46: CHOICE
+47: REF 'table-shapes',
+48: ELEMENT "table:shapes",
+49: ONEOREMORE
+50: REF 'shape',
+51: CHOICE
+52: REF 'shape-instance',
+53: CHOICE
+54: REF 'draw-rect',
+55: ELEMENT "draw:rect",
+56: SEQUENCE
+57: REF 'draw-rect-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:corner-radius",
+60: REF 'nonNegativeLength',
+61: DATA 'string',
+59: EPSILON
+59: SEQUENCE
+60: CHOICE
+61: ATTRIBUTE "svg:rx",
+62: REF 'nonNegativeLength',
+63: DATA 'string',
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "svg:ry",
+62: REF 'nonNegativeLength',
+63: DATA 'string',
+61: EPSILON
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-size-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:width",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:height",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+59: ELEMENT "svg:title",
+60: STRING
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+59: ELEMENT "svg:desc",
+60: STRING
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+60: ELEMENT "draw:glue-point",
+61: REF 'draw-glue-point-attlist',
+62: INTERLEAVE
+63: ATTRIBUTE "draw:id",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: ATTRIBUTE "svg:x",
+64: CHOICE
+65: REF 'distance',
+66: REF 'length',
+67: DATA 'string',
+65: REF 'percent',
+66: DATA 'string',
+63: ATTRIBUTE "svg:y",
+64: CHOICE
+65: REF 'distance',
+66: REF 'length',
+67: DATA 'string',
+65: REF 'percent',
+66: DATA 'string',
+63: CHOICE
+64: ATTRIBUTE "draw:align",
+65: CHOICE
+66: VALUE 'top-left',
+66: VALUE 'top',
+66: VALUE 'top-right',
+66: VALUE 'left',
+66: VALUE 'center',
+66: VALUE 'right',
+66: VALUE 'bottom-left',
+66: VALUE 'bottom-right',
+64: EPSILON
+63: ATTRIBUTE "draw:escape-direction",
+64: CHOICE
+65: VALUE 'auto',
+65: VALUE 'left',
+65: VALUE 'right',
+65: VALUE 'up',
+65: VALUE 'down',
+65: VALUE 'horizontal',
+65: VALUE 'vertical',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-line',
+55: ELEMENT "draw:line",
+56: SEQUENCE
+57: REF 'draw-line-attlist',
+58: INTERLEAVE
+59: ATTRIBUTE "svg:x1",
+60: REF 'coordinate',
+61: REF 'length',
+62: DATA 'string',
+59: ATTRIBUTE "svg:y1",
+60: REF 'coordinate',
+61: REF 'length',
+62: DATA 'string',
+59: ATTRIBUTE "svg:x2",
+60: REF 'coordinate',
+61: REF 'length',
+62: DATA 'string',
+59: ATTRIBUTE "svg:y2",
+60: REF 'coordinate',
+61: REF 'length',
+62: DATA 'string',
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-polyline',
+55: ELEMENT "draw:polyline",
+56: SEQUENCE
+57: REF 'common-draw-points-attlist',
+58: ATTRIBUTE "draw:points",
+59: REF 'points',
+60: DATA 'string',
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-size-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:width",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:height",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-viewbox-attlist',
+58: ATTRIBUTE "svg:viewBox",
+59: LIST
+60: SEQUENCE
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-polygon',
+55: ELEMENT "draw:polygon",
+56: SEQUENCE
+57: REF 'common-draw-points-attlist',
+58: ATTRIBUTE "draw:points",
+59: REF 'points',
+60: DATA 'string',
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-size-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:width",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:height",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-viewbox-attlist',
+58: ATTRIBUTE "svg:viewBox",
+59: LIST
+60: SEQUENCE
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-regular-polygon',
+55: ELEMENT "draw:regular-polygon",
+56: SEQUENCE
+57: REF 'draw-regular-polygon-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "draw:concave",
+61: VALUE 'false',
+60: SEQUENCE
+61: ATTRIBUTE "draw:concave",
+62: VALUE 'true',
+61: REF 'draw-regular-polygon-sharpness-attlist',
+62: ATTRIBUTE "draw:sharpness",
+63: REF 'percent',
+64: DATA 'string',
+59: ATTRIBUTE "draw:corners",
+60: REF 'positiveInteger',
+61: DATA 'positiveInteger',
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-size-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:width",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:height",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-path',
+55: ELEMENT "draw:path",
+56: SEQUENCE
+57: REF 'common-draw-path-data-attlist',
+58: ATTRIBUTE "svg:d",
+59: REF 'pathData',
+60: DATA 'string',
+57: REF 'common-draw-position-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-size-attlist',
+58: SEQUENCE
+59: CHOICE
+60: ATTRIBUTE "svg:width",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "svg:height",
+61: REF 'length',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-viewbox-attlist',
+58: ATTRIBUTE "svg:viewBox",
+59: LIST
+60: SEQUENCE
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+61: REF 'integer',
+62: DATA 'integer',
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-circle',
+55: ELEMENT "draw:circle",
+56: SEQUENCE
+57: CHOICE
+58: SEQUENCE
+59: REF 'draw-circle-attlist',
+60: ATTRIBUTE "svg:r",
+61: REF 'length',
+62: DATA 'string',
+59: REF 'common-draw-circle-ellipse-pos-attlist',
+60: SEQUENCE
+61: ATTRIBUTE "svg:cx",
+62: REF 'coordinate',
+63: REF 'length',
+64: DATA 'string',
+61: ATTRIBUTE "svg:cy",
+62: REF 'coordinate',
+63: REF 'length',
+64: DATA 'string',
+58: SEQUENCE
+59: REF 'common-draw-position-attlist',
+60: SEQUENCE
+61: CHOICE
+62: ATTRIBUTE "svg:x",
+63: REF 'coordinate',
+64: REF 'length',
+65: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "svg:y",
+63: REF 'coordinate',
+64: REF 'length',
+65: DATA 'string',
+62: EPSILON
+59: REF 'common-draw-size-attlist',
+60: SEQUENCE
+61: CHOICE
+62: ATTRIBUTE "svg:width",
+63: REF 'length',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "svg:height",
+63: REF 'length',
+64: DATA 'string',
+62: EPSILON
+57: REF 'common-draw-circle-ellipse-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "draw:kind",
+61: CHOICE
+62: VALUE 'full',
+62: VALUE 'section',
+62: VALUE 'cut',
+62: VALUE 'arc',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "draw:start-angle",
+61: REF 'angle',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "draw:end-angle",
+61: REF 'angle',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-ellipse',
+55: ELEMENT "draw:ellipse",
+56: SEQUENCE
+57: CHOICE
+58: SEQUENCE
+59: REF 'draw-ellipse-attlist',
+60: SEQUENCE
+61: ATTRIBUTE "svg:rx",
+62: REF 'length',
+63: DATA 'string',
+61: ATTRIBUTE "svg:ry",
+62: REF 'length',
+63: DATA 'string',
+59: REF 'common-draw-circle-ellipse-pos-attlist',
+60: SEQUENCE
+61: ATTRIBUTE "svg:cx",
+62: REF 'coordinate',
+63: REF 'length',
+64: DATA 'string',
+61: ATTRIBUTE "svg:cy",
+62: REF 'coordinate',
+63: REF 'length',
+64: DATA 'string',
+58: SEQUENCE
+59: REF 'common-draw-position-attlist',
+60: SEQUENCE
+61: CHOICE
+62: ATTRIBUTE "svg:x",
+63: REF 'coordinate',
+64: REF 'length',
+65: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "svg:y",
+63: REF 'coordinate',
+64: REF 'length',
+65: DATA 'string',
+62: EPSILON
+59: REF 'common-draw-size-attlist',
+60: SEQUENCE
+61: CHOICE
+62: ATTRIBUTE "svg:width",
+63: REF 'length',
+64: DATA 'string',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "svg:height",
+63: REF 'length',
+64: DATA 'string',
+62: EPSILON
+57: REF 'common-draw-circle-ellipse-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "draw:kind",
+61: CHOICE
+62: VALUE 'full',
+62: VALUE 'section',
+62: VALUE 'cut',
+62: VALUE 'arc',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "draw:start-angle",
+61: REF 'angle',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "draw:end-angle",
+61: REF 'angle',
+62: DATA 'string',
+60: EPSILON
+57: REF 'common-draw-shape-with-text-and-styles-attlist',
+58: SEQUENCE
+59: REF 'common-draw-shape-with-styles-attlist',
+60: SEQUENCE
+61: REF 'common-draw-z-index-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:z-index",
+64: REF 'nonNegativeInteger',
+65: DATA 'nonNegativeInteger',
+63: EPSILON
+61: REF 'common-draw-id-attlist',
+62: CHOICE
+63: SEQUENCE
+64: REF 'xml-id',
+65: ATTRIBUTE "xml:id",
+66: REF 'ID',
+67: DATA 'ID',
+64: CHOICE
+65: ATTRIBUTE "draw:id",
+66: REF 'NCName',
+67: DATA 'NCName',
+65: EPSILON
+63: EPSILON
+61: REF 'common-draw-layer-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:layer",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-style-name-attlist',
+62: CHOICE
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "draw:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "draw:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+63: SEQUENCE
+64: CHOICE
+65: ATTRIBUTE "presentation:style-name",
+66: REF 'styleNameRef',
+67: CHOICE
+68: DATA 'NCName',
+68: EPSILON
+65: EPSILON
+64: CHOICE
+65: ATTRIBUTE "presentation:class-names",
+66: REF 'styleNameRefs',
+67: LIST
+68: CHOICE
+69: ONEOREMORE
+70: DATA 'NCName',
+69: EPSILON
+65: EPSILON
+61: REF 'common-draw-transform-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:transform",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-draw-name-attlist',
+62: CHOICE
+63: ATTRIBUTE "draw:name",
+64: REF 'string',
+65: DATA 'string',
+63: EPSILON
+61: REF 'common-text-spreadsheet-shape-attlist',
+62: INTERLEAVE
+63: CHOICE
+64: ATTRIBUTE "table:end-cell-address",
+65: REF 'cellAddress',
+66: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-x",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:end-y",
+65: REF 'coordinate',
+66: REF 'length',
+67: DATA 'string',
+64: EPSILON
+63: CHOICE
+64: ATTRIBUTE "table:table-background",
+65: REF 'boolean',
+66: CHOICE
+67: VALUE 'true',
+67: VALUE 'false',
+64: EPSILON
+63: REF 'common-text-anchor-attlist',
+64: INTERLEAVE
+65: CHOICE
+66: ATTRIBUTE "text:anchor-type",
+67: CHOICE
+68: VALUE 'page',
+68: VALUE 'frame',
+68: VALUE 'paragraph',
+68: VALUE 'char',
+68: VALUE 'as-char',
+66: EPSILON
+65: CHOICE
+66: ATTRIBUTE "text:anchor-page-number",
+67: REF 'positiveInteger',
+68: DATA 'positiveInteger',
+66: EPSILON
+59: REF 'common-draw-text-style-name-attlist',
+60: CHOICE
+61: ATTRIBUTE "draw:text-style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: REF 'draw-text',
+58: CHOICE
+59: ONEOREMORE
+60: CHOICE
+61: REF 'text-p',
+61: REF 'text-list',
+59: EPSILON
+54: REF 'draw-g',
+55: ELEMENT "draw:g",
+56: SEQUENCE
+57: REF 'draw-g-attlist',
+58: CHOICE
+59: ATTRIBUTE "svg:y",
+60: REF 'coordinate',
+61: REF 'length',
+62: DATA 'string',
+59: EPSILON
+57: REF 'common-draw-z-index-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:z-index",
+60: REF 'nonNegativeInteger',
+61: DATA 'nonNegativeInteger',
+59: EPSILON
+57: REF 'common-draw-name-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:name",
+60: REF 'string',
+61: DATA 'string',
+59: EPSILON
+57: REF 'common-draw-id-attlist',
+58: CHOICE
+59: SEQUENCE
+60: REF 'xml-id',
+61: ATTRIBUTE "xml:id",
+62: REF 'ID',
+63: DATA 'ID',
+60: CHOICE
+61: ATTRIBUTE "draw:id",
+62: REF 'NCName',
+63: DATA 'NCName',
+61: EPSILON
+59: EPSILON
+57: REF 'common-draw-style-name-attlist',
+58: CHOICE
+59: SEQUENCE
+60: CHOICE
+61: ATTRIBUTE "draw:style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "draw:class-names",
+62: REF 'styleNameRefs',
+63: LIST
+64: CHOICE
+65: ONEOREMORE
+66: DATA 'NCName',
+65: EPSILON
+61: EPSILON
+59: SEQUENCE
+60: CHOICE
+61: ATTRIBUTE "presentation:style-name",
+62: REF 'styleNameRef',
+63: CHOICE
+64: DATA 'NCName',
+64: EPSILON
+61: EPSILON
+60: CHOICE
+61: ATTRIBUTE "presentation:class-names",
+62: REF 'styleNameRefs',
+63: LIST
+64: CHOICE
+65: ONEOREMORE
+66: DATA 'NCName',
+65: EPSILON
+61: EPSILON
+57: REF 'common-text-spreadsheet-shape-attlist',
+58: INTERLEAVE
+59: CHOICE
+60: ATTRIBUTE "table:end-cell-address",
+61: REF 'cellAddress',
+62: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "table:end-x",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "table:end-y",
+61: REF 'coordinate',
+62: REF 'length',
+63: DATA 'string',
+60: EPSILON
+59: CHOICE
+60: ATTRIBUTE "table:table-background",
+61: REF 'boolean',
+62: CHOICE
+63: VALUE 'true',
+63: VALUE 'false',
+60: EPSILON
+59: REF 'common-text-anchor-attlist',
+60: INTERLEAVE
+61: CHOICE
+62: ATTRIBUTE "text:anchor-type",
+63: CHOICE
+64: VALUE 'page',
+64: VALUE 'frame',
+64: VALUE 'paragraph',
+64: VALUE 'char',
+64: VALUE 'as-char',
+62: EPSILON
+61: CHOICE
+62: ATTRIBUTE "text:anchor-page-number",
+63: REF 'positiveInteger',
+64: DATA 'positiveInteger',
+62: EPSILON
+57: REF 'common-draw-caption-id-attlist',
+58: CHOICE
+59: ATTRIBUTE "draw:caption-id",
+60: REF 'IDREF',
+61: DATA 'IDREF',
+59: EPSILON
+57: CHOICE
+58: REF 'svg-title',
+58: EPSILON
+57: CHOICE
+58: REF 'svg-desc',
+58: EPSILON
+57: CHOICE
+58: REF 'office-event-listeners',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'draw-glue-point',
+58: EPSILON
+57: CHOICE
+58: ONEOREMORE
+59: REF 'shape',
+60: CHOICE
+61: REF 'shape-instance',
+62: CHOICE
+63: REF 'draw-rect',
+63: REF 'draw-line',
+63: REF 'draw-polyline',
+63: REF 'draw-polygon',
+63: REF 'draw-regular-polygon',
+63: REF 'draw-path',
+63: REF 'draw-circle',
+63: REF 'draw-ellipse',
+63: REF 'draw-g',
+63: REF 'draw-page-thumbnail',
+64: ELEMENT "draw:page-thumbnail",
+65: SEQUENCE
+66: REF 'draw-page-thumbnail-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:page-number",
+69: REF 'positiveInteger',
+70: DATA 'positiveInteger',
+68: EPSILON
+66: REF 'common-draw-position-attlist',
+67: SEQUENCE
+68: CHOICE
+69: ATTRIBUTE "svg:x",
+70: REF 'coordinate',
+71: REF 'length',
+72: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "svg:y",
+70: REF 'coordinate',
+71: REF 'length',
+72: DATA 'string',
+69: EPSILON
+66: REF 'common-draw-size-attlist',
+67: SEQUENCE
+68: CHOICE
+69: ATTRIBUTE "svg:width",
+70: REF 'length',
+71: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "svg:height",
+70: REF 'length',
+71: DATA 'string',
+69: EPSILON
+66: REF 'presentation-shape-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "presentation:class",
+70: REF 'presentation-classes',
+71: CHOICE
+72: VALUE 'title',
+72: VALUE 'outline',
+72: VALUE 'subtitle',
+72: VALUE 'text',
+72: VALUE 'graphic',
+72: VALUE 'object',
+72: VALUE 'chart',
+72: VALUE 'table',
+72: VALUE 'orgchart',
+72: VALUE 'page',
+72: VALUE 'notes',
+72: VALUE 'handout',
+72: VALUE 'header',
+72: VALUE 'footer',
+72: VALUE 'date-time',
+72: VALUE 'page-number',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "presentation:placeholder",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "presentation:user-transformed",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'common-draw-shape-with-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-z-index-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:z-index",
+71: REF 'nonNegativeInteger',
+72: DATA 'nonNegativeInteger',
+70: EPSILON
+68: REF 'common-draw-id-attlist',
+69: CHOICE
+70: SEQUENCE
+71: REF 'xml-id',
+72: ATTRIBUTE "xml:id",
+73: REF 'ID',
+74: DATA 'ID',
+71: CHOICE
+72: ATTRIBUTE "draw:id",
+73: REF 'NCName',
+74: DATA 'NCName',
+72: EPSILON
+70: EPSILON
+68: REF 'common-draw-layer-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:layer",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-style-name-attlist',
+69: CHOICE
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "draw:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "draw:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+70: SEQUENCE
+71: CHOICE
+72: ATTRIBUTE "presentation:style-name",
+73: REF 'styleNameRef',
+74: CHOICE
+75: DATA 'NCName',
+75: EPSILON
+72: EPSILON
+71: CHOICE
+72: ATTRIBUTE "presentation:class-names",
+73: REF 'styleNameRefs',
+74: LIST
+75: CHOICE
+76: ONEOREMORE
+77: DATA 'NCName',
+76: EPSILON
+72: EPSILON
+68: REF 'common-draw-transform-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:transform",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-draw-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:name",
+71: REF 'string',
+72: DATA 'string',
+70: EPSILON
+68: REF 'common-text-spreadsheet-shape-attlist',
+69: INTERLEAVE
+70: CHOICE
+71: ATTRIBUTE "table:end-cell-address",
+72: REF 'cellAddress',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:end-x",
+72: REF 'coordinate',
+73: REF 'length',
+74: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:end-y",
+72: REF 'coordinate',
+73: REF 'length',
+74: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "table:table-background",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+71: EPSILON
+70: REF 'common-text-anchor-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "text:anchor-type",
+74: CHOICE
+75: VALUE 'page',
+75: VALUE 'frame',
+75: VALUE 'paragraph',
+75: VALUE 'char',
+75: VALUE 'as-char',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "text:anchor-page-number",
+74: REF 'positiveInteger',
+75: DATA 'positiveInteger',
+73: EPSILON
+66: REF 'common-draw-caption-id-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:caption-id",
+69: REF 'IDREF',
+70: DATA 'IDREF',
+68: EPSILON
+66: CHOICE
+67: REF 'svg-title',
+67: EPSILON
+66: CHOICE
+67: REF 'svg-desc',
+67: EPSILON
+63: REF 'draw-frame',
+64: ELEMENT "draw:frame",
+65: SEQUENCE
+66: REF 'common-draw-shape-with-text-and-styles-attlist',
+67: SEQUENCE
+68: REF 'common-draw-shape-with-styles-attlist',
+69: SEQUENCE
+70: REF 'common-draw-z-index-attlist',
+71: CHOICE
+72: ATTRIBUTE "draw:z-index",
+73: REF 'nonNegativeInteger',
+74: DATA 'nonNegativeInteger',
+72: EPSILON
+70: REF 'common-draw-id-attlist',
+71: CHOICE
+72: SEQUENCE
+73: REF 'xml-id',
+74: ATTRIBUTE "xml:id",
+75: REF 'ID',
+76: DATA 'ID',
+73: CHOICE
+74: ATTRIBUTE "draw:id",
+75: REF 'NCName',
+76: DATA 'NCName',
+74: EPSILON
+72: EPSILON
+70: REF 'common-draw-layer-name-attlist',
+71: CHOICE
+72: ATTRIBUTE "draw:layer",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+70: REF 'common-draw-style-name-attlist',
+71: CHOICE
+72: SEQUENCE
+73: CHOICE
+74: ATTRIBUTE "draw:style-name",
+75: REF 'styleNameRef',
+76: CHOICE
+77: DATA 'NCName',
+77: EPSILON
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "draw:class-names",
+75: REF 'styleNameRefs',
+76: LIST
+77: CHOICE
+78: ONEOREMORE
+79: DATA 'NCName',
+78: EPSILON
+74: EPSILON
+72: SEQUENCE
+73: CHOICE
+74: ATTRIBUTE "presentation:style-name",
+75: REF 'styleNameRef',
+76: CHOICE
+77: DATA 'NCName',
+77: EPSILON
+74: EPSILON
+73: CHOICE
+74: ATTRIBUTE "presentation:class-names",
+75: REF 'styleNameRefs',
+76: LIST
+77: CHOICE
+78: ONEOREMORE
+79: DATA 'NCName',
+78: EPSILON
+74: EPSILON
+70: REF 'common-draw-transform-attlist',
+71: CHOICE
+72: ATTRIBUTE "draw:transform",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+70: REF 'common-draw-name-attlist',
+71: CHOICE
+72: ATTRIBUTE "draw:name",
+73: REF 'string',
+74: DATA 'string',
+72: EPSILON
+70: REF 'common-text-spreadsheet-shape-attlist',
+71: INTERLEAVE
+72: CHOICE
+73: ATTRIBUTE "table:end-cell-address",
+74: REF 'cellAddress',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "table:end-x",
+74: REF 'coordinate',
+75: REF 'length',
+76: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "table:end-y",
+74: REF 'coordinate',
+75: REF 'length',
+76: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "table:table-background",
+74: REF 'boolean',
+75: CHOICE
+76: VALUE 'true',
+76: VALUE 'false',
+73: EPSILON
+72: REF 'common-text-anchor-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "text:anchor-type",
+76: CHOICE
+77: VALUE 'page',
+77: VALUE 'frame',
+77: VALUE 'paragraph',
+77: VALUE 'char',
+77: VALUE 'as-char',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "text:anchor-page-number",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+68: REF 'common-draw-text-style-name-attlist',
+69: CHOICE
+70: ATTRIBUTE "draw:text-style-name",
+71: REF 'styleNameRef',
+72: CHOICE
+73: DATA 'NCName',
+73: EPSILON
+70: EPSILON
+66: REF 'common-draw-position-attlist',
+67: SEQUENCE
+68: CHOICE
+69: ATTRIBUTE "svg:x",
+70: REF 'coordinate',
+71: REF 'length',
+72: DATA 'string',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "svg:y",
+70: REF 'coordinate',
+71: REF 'length',
+72: DATA 'string',
+69: EPSILON
+66: REF 'common-draw-rel-size-attlist',
+67: SEQUENCE
+68: REF 'common-draw-size-attlist',
+69: SEQUENCE
+70: CHOICE
+71: ATTRIBUTE "svg:width",
+72: REF 'length',
+73: DATA 'string',
+71: EPSILON
+70: CHOICE
+71: ATTRIBUTE "svg:height",
+72: REF 'length',
+73: DATA 'string',
+71: EPSILON
+68: CHOICE
+69: ATTRIBUTE "style:rel-width",
+70: CHOICE
+71: REF 'percent',
+72: DATA 'string',
+71: VALUE 'scale',
+71: VALUE 'scale-min',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "style:rel-height",
+70: CHOICE
+71: REF 'percent',
+72: DATA 'string',
+71: VALUE 'scale',
+71: VALUE 'scale-min',
+69: EPSILON
+66: REF 'common-draw-caption-id-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:caption-id",
+69: REF 'IDREF',
+70: DATA 'IDREF',
+68: EPSILON
+66: REF 'presentation-shape-attlist',
+67: INTERLEAVE
+68: CHOICE
+69: ATTRIBUTE "presentation:class",
+70: REF 'presentation-classes',
+71: CHOICE
+72: VALUE 'title',
+72: VALUE 'outline',
+72: VALUE 'subtitle',
+72: VALUE 'text',
+72: VALUE 'graphic',
+72: VALUE 'object',
+72: VALUE 'chart',
+72: VALUE 'table',
+72: VALUE 'orgchart',
+72: VALUE 'page',
+72: VALUE 'notes',
+72: VALUE 'handout',
+72: VALUE 'header',
+72: VALUE 'footer',
+72: VALUE 'date-time',
+72: VALUE 'page-number',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "presentation:placeholder",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+68: CHOICE
+69: ATTRIBUTE "presentation:user-transformed",
+70: REF 'boolean',
+71: CHOICE
+72: VALUE 'true',
+72: VALUE 'false',
+69: EPSILON
+66: REF 'draw-frame-attlist',
+67: CHOICE
+68: ATTRIBUTE "draw:copy-of",
+69: REF 'string',
+70: DATA 'string',
+68: EPSILON
+66: CHOICE
+67: ONEOREMORE
+68: CHOICE
+69: REF 'draw-text-box',
+70: ELEMENT "draw:text-box",
+71: SEQUENCE
+72: REF 'draw-text-box-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:chain-next-name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "draw:corner-radius",
+76: REF 'nonNegativeLength',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "fo:min-height",
+76: CHOICE
+77: REF 'length',
+78: DATA 'string',
+77: REF 'percent',
+78: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "fo:min-width",
+76: CHOICE
+77: REF 'length',
+78: DATA 'string',
+77: REF 'percent',
+78: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "fo:max-height",
+76: CHOICE
+77: REF 'length',
+78: DATA 'string',
+77: REF 'percent',
+78: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "fo:max-width",
+76: CHOICE
+77: REF 'length',
+78: DATA 'string',
+77: REF 'percent',
+78: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: SEQUENCE
+76: REF 'xml-id',
+77: ATTRIBUTE "xml:id",
+78: REF 'ID',
+79: DATA 'ID',
+76: CHOICE
+77: ATTRIBUTE "text:id",
+78: REF 'NCName',
+79: DATA 'NCName',
+77: EPSILON
+75: EPSILON
+72: CHOICE
+73: ONEOREMORE
+74: REF 'text-content',
+75: CHOICE
+76: REF 'text-h',
+76: REF 'text-p',
+76: REF 'text-list',
+76: REF 'text-numbered-paragraph',
+76: REF 'table-table',
+76: REF 'text-section',
+77: ELEMENT "text:section",
+78: SEQUENCE
+79: REF 'text-section-attlist',
+80: INTERLEAVE
+81: REF 'common-section-attlist',
+82: INTERLEAVE
+83: CHOICE
+84: ATTRIBUTE "text:style-name",
+85: REF 'styleNameRef',
+86: CHOICE
+87: DATA 'NCName',
+87: EPSILON
+84: EPSILON
+83: ATTRIBUTE "text:name",
+84: REF 'string',
+85: DATA 'string',
+83: CHOICE
+84: ATTRIBUTE "text:protected",
+85: REF 'boolean',
+86: CHOICE
+87: VALUE 'true',
+87: VALUE 'false',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "text:protection-key",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+83: CHOICE
+84: ATTRIBUTE "text:protection-key-digest-algorithm",
+85: REF 'anyIRI',
+86: DATA 'anyURI',
+84: EPSILON
+83: CHOICE
+84: REF 'xml-id',
+85: ATTRIBUTE "xml:id",
+86: REF 'ID',
+87: DATA 'ID',
+84: EPSILON
+81: CHOICE
+82: ATTRIBUTE "text:display",
+83: CHOICE
+84: VALUE 'true',
+84: VALUE 'none',
+82: SEQUENCE
+83: ATTRIBUTE "text:display",
+84: VALUE 'condition',
+83: ATTRIBUTE "text:condition",
+84: REF 'string',
+85: DATA 'string',
+82: EPSILON
+79: CHOICE
+80: REF 'text-section-source',
+81: ELEMENT "text:section-source",
+82: REF 'text-section-source-attr',
+83: INTERLEAVE
+84: CHOICE
+85: SEQUENCE
+86: ATTRIBUTE "xlink:type",
+87: VALUE 'simple',
+86: ATTRIBUTE "xlink:href",
+87: REF 'anyIRI',
+88: DATA 'anyURI',
+86: CHOICE
+87: ATTRIBUTE "xlink:show",
+88: VALUE 'embed',
+87: EPSILON
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "text:section-name",
+86: REF 'string',
+87: DATA 'string',
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "text:filter-name",
+86: REF 'string',
+87: DATA 'string',
+85: EPSILON
+80: REF 'text-section-source-dde',
+81: REF 'office-dde-source',
+80: EPSILON
+79: CHOICE
+80: ONEOREMORE
+81: REF 'text-content',
+82: CHOICE
+83: REF 'text-h',
+83: REF 'text-p',
+83: REF 'text-list',
+83: REF 'text-numbered-paragraph',
+83: REF 'table-table',
+83: REF 'text-section',
+83: REF 'text-soft-page-break',
+83: REF 'text-table-of-content',
+84: ELEMENT "text:table-of-content",
+85: SEQUENCE
+86: REF 'common-section-attlist',
+87: INTERLEAVE
+88: CHOICE
+89: ATTRIBUTE "text:style-name",
+90: REF 'styleNameRef',
+91: CHOICE
+92: DATA 'NCName',
+92: EPSILON
+89: EPSILON
+88: ATTRIBUTE "text:name",
+89: REF 'string',
+90: DATA 'string',
+88: CHOICE
+89: ATTRIBUTE "text:protected",
+90: REF 'boolean',
+91: CHOICE
+92: VALUE 'true',
+92: VALUE 'false',
+89: EPSILON
+88: CHOICE
+89: ATTRIBUTE "text:protection-key",
+90: REF 'string',
+91: DATA 'string',
+89: EPSILON
+88: CHOICE
+89: ATTRIBUTE "text:protection-key-digest-algorithm",
+90: REF 'anyIRI',
+91: DATA 'anyURI',
+89: EPSILON
+88: CHOICE
+89: REF 'xml-id',
+90: ATTRIBUTE "xml:id",
+91: REF 'ID',
+92: DATA 'ID',
+89: EPSILON
+86: REF 'text-table-of-content-source',
+87: ELEMENT "text:table-of-content-source",
+88: SEQUENCE
+89: REF 'text-table-of-content-source-attlist',
+90: INTERLEAVE
+91: CHOICE
+92: ATTRIBUTE "text:outline-level",
+93: REF 'positiveInteger',
+94: DATA 'positiveInteger',
+92: EPSILON
+91: CHOICE
+92: ATTRIBUTE "text:use-outline-level",
+93: REF 'boolean',
+94: CHOICE
+95: VALUE 'true',
+95: VALUE 'false',
+92: EPSILON
+91: CHOICE
+92: ATTRIBUTE "text:use-index-marks",
+93: REF 'boolean',
+94: CHOICE
+95: VALUE 'true',
+95: VALUE 'false',
+92: EPSILON
+91: CHOICE
+92: ATTRIBUTE "text:use-index-source-styles",
+93: REF 'boolean',
+94: CHOICE
+95: VALUE 'true',
+95: VALUE 'false',
+92: EPSILON
+91: CHOICE
+92: ATTRIBUTE "text:index-scope",
+93: CHOICE
+94: VALUE 'document',
+94: VALUE 'chapter',
+92: EPSILON
+91: CHOICE
+92: ATTRIBUTE "text:relative-tab-stop-position",
+93: REF 'boolean',
+94: CHOICE
+95: VALUE 'true',
+95: VALUE 'false',
+92: EPSILON
+89: CHOICE
+90: REF 'text-index-title-template',
+91: ELEMENT "text:index-title-template",
+92: SEQUENCE
+93: CHOICE
+94: ATTRIBUTE "text:style-name",
+95: REF 'styleNameRef',
+96: CHOICE
+97: DATA 'NCName',
+97: EPSILON
+94: EPSILON
+93: STRING
+90: EPSILON
+89: CHOICE
+90: ONEOREMORE
+91: REF 'text-table-of-content-entry-template',
+92: ELEMENT "text:table-of-content-entry-template",
+93: SEQUENCE
+94: REF 'text-table-of-content-entry-template-attlist',
+95: INTERLEAVE
+96: ATTRIBUTE "text:outline-level",
+97: REF 'positiveInteger',
+98: DATA 'positiveInteger',
+96: ATTRIBUTE "text:style-name",
+97: REF 'styleNameRef',
+98: CHOICE
+99: DATA 'NCName',
+99: EPSILON
+94: CHOICE
+95: ONEOREMORE
+96: REF 'text-table-of-content-children',
+97: CHOICE
+98: REF 'text-index-entry-chapter',
+99: ELEMENT "text:index-entry-chapter",
+100: SEQUENCE
+101: CHOICE
+102: ATTRIBUTE "text:style-name",
+103: REF 'styleNameRef',
+104: CHOICE
+105: DATA 'NCName',
+105: EPSILON
+102: EPSILON
+101: REF 'text-index-entry-chapter-attrs',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "text:display",
+105: CHOICE
+106: VALUE 'name',
+106: VALUE 'number',
+106: VALUE 'number-and-name',
+106: VALUE 'plain-number',
+106: VALUE 'plain-number-and-name',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "text:outline-level",
+105: REF 'positiveInteger',
+106: DATA 'positiveInteger',
+104: EPSILON
+98: REF 'text-index-entry-page-number',
+99: ELEMENT "text:index-entry-page-number",
+100: CHOICE
+101: ATTRIBUTE "text:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+98: REF 'text-index-entry-text',
+99: ELEMENT "text:index-entry-text",
+100: CHOICE
+101: ATTRIBUTE "text:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+98: REF 'text-index-entry-span',
+99: ELEMENT "text:index-entry-span",
+100: SEQUENCE
+101: CHOICE
+102: ATTRIBUTE "text:style-name",
+103: REF 'styleNameRef',
+104: CHOICE
+105: DATA 'NCName',
+105: EPSILON
+102: EPSILON
+101: STRING
+98: REF 'text-index-entry-tab-stop',
+99: ELEMENT "text:index-entry-tab-stop",
+100: SEQUENCE
+101: CHOICE
+102: ATTRIBUTE "text:style-name",
+103: REF 'styleNameRef',
+104: CHOICE
+105: DATA 'NCName',
+105: EPSILON
+102: EPSILON
+101: REF 'text-index-entry-tab-stop-attrs',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "style:leader-char",
+105: REF 'character',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "style:type",
+105: VALUE 'right',
+104: SEQUENCE
+105: ATTRIBUTE "style:type",
+106: VALUE 'left',
+105: ATTRIBUTE "style:position",
+106: REF 'length',
+107: DATA 'string',
+98: REF 'text-index-entry-link-start',
+99: ELEMENT "text:index-entry-link-start",
+100: CHOICE
+101: ATTRIBUTE "text:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+98: REF 'text-index-entry-link-end',
+99: ELEMENT "text:index-entry-link-end",
+100: CHOICE
+101: ATTRIBUTE "text:style-name",
+102: REF 'styleNameRef',
+103: CHOICE
+104: DATA 'NCName',
+104: EPSILON
+101: EPSILON
+95: EPSILON
+90: EPSILON
+89: CHOICE
+90: ONEOREMORE
+91: REF 'text-index-source-styles',
+92: ELEMENT "text:index-source-styles",
+93: SEQUENCE
+94: ATTRIBUTE "text:outline-level",
+95: REF 'positiveInteger',
+96: DATA 'positiveInteger',
+94: CHOICE
+95: ONEOREMORE
+96: REF 'text-index-source-style',
+97: ELEMENT "text:index-source-style",
+98: ATTRIBUTE "text:style-name",
+99: REF 'styleName',
+100: DATA 'NCName',
+95: EPSILON
+90: EPSILON
+86: REF 'text-index-body',
+87: ELEMENT "text:index-body",
+88: CHOICE
+89: ONEOREMORE
+90: REF 'index-content-main',
+91: CHOICE
+92: REF 'text-content',
+93: CHOICE
+94: REF 'text-h',
+94: REF 'text-p',
+94: REF 'text-list',
+94: REF 'text-numbered-paragraph',
+94: REF 'table-table',
+94: REF 'text-section',
+94: REF 'text-soft-page-break',
+94: REF 'text-table-of-content',
+94: REF 'text-illustration-index',
+95: ELEMENT "text:illustration-index",
+96: SEQUENCE
+97: REF 'common-section-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "text:style-name",
+101: REF 'styleNameRef',
+102: CHOICE
+103: DATA 'NCName',
+103: EPSILON
+100: EPSILON
+99: ATTRIBUTE "text:name",
+100: REF 'string',
+101: DATA 'string',
+99: CHOICE
+100: ATTRIBUTE "text:protected",
+101: REF 'boolean',
+102: CHOICE
+103: VALUE 'true',
+103: VALUE 'false',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key",
+101: REF 'string',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key-digest-algorithm",
+101: REF 'anyIRI',
+102: DATA 'anyURI',
+100: EPSILON
+99: CHOICE
+100: REF 'xml-id',
+101: ATTRIBUTE "xml:id",
+102: REF 'ID',
+103: DATA 'ID',
+100: EPSILON
+97: REF 'text-illustration-index-source',
+98: ELEMENT "text:illustration-index-source",
+99: SEQUENCE
+100: REF 'text-illustration-index-source-attrs',
+101: INTERLEAVE
+102: REF 'text-index-scope-attr',
+103: CHOICE
+104: ATTRIBUTE "text:index-scope",
+105: CHOICE
+106: VALUE 'document',
+106: VALUE 'chapter',
+104: EPSILON
+102: REF 'text-relative-tab-stop-position-attr',
+103: CHOICE
+104: ATTRIBUTE "text:relative-tab-stop-position",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-caption",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:caption-sequence-name",
+104: REF 'string',
+105: DATA 'string',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:caption-sequence-format",
+104: CHOICE
+105: VALUE 'text',
+105: VALUE 'category-and-value',
+105: VALUE 'caption',
+103: EPSILON
+100: CHOICE
+101: REF 'text-index-title-template',
+101: EPSILON
+100: CHOICE
+101: REF 'text-illustration-index-entry-template',
+102: ELEMENT "text:illustration-index-entry-template",
+103: REF 'text-illustration-index-entry-content',
+104: SEQUENCE
+105: REF 'text-illustration-index-entry-template-attrs',
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-index-entry-chapter',
+108: REF 'text-index-entry-page-number',
+108: REF 'text-index-entry-text',
+108: REF 'text-index-entry-span',
+108: REF 'text-index-entry-tab-stop',
+106: EPSILON
+101: EPSILON
+97: REF 'text-index-body',
+94: REF 'text-table-index',
+95: ELEMENT "text:table-index",
+96: SEQUENCE
+97: REF 'common-section-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "text:style-name",
+101: REF 'styleNameRef',
+102: CHOICE
+103: DATA 'NCName',
+103: EPSILON
+100: EPSILON
+99: ATTRIBUTE "text:name",
+100: REF 'string',
+101: DATA 'string',
+99: CHOICE
+100: ATTRIBUTE "text:protected",
+101: REF 'boolean',
+102: CHOICE
+103: VALUE 'true',
+103: VALUE 'false',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key",
+101: REF 'string',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key-digest-algorithm",
+101: REF 'anyIRI',
+102: DATA 'anyURI',
+100: EPSILON
+99: CHOICE
+100: REF 'xml-id',
+101: ATTRIBUTE "xml:id",
+102: REF 'ID',
+103: DATA 'ID',
+100: EPSILON
+97: REF 'text-table-index-source',
+98: ELEMENT "text:table-index-source",
+99: SEQUENCE
+100: REF 'text-illustration-index-source-attrs',
+101: INTERLEAVE
+102: REF 'text-index-scope-attr',
+103: CHOICE
+104: ATTRIBUTE "text:index-scope",
+105: CHOICE
+106: VALUE 'document',
+106: VALUE 'chapter',
+104: EPSILON
+102: REF 'text-relative-tab-stop-position-attr',
+103: CHOICE
+104: ATTRIBUTE "text:relative-tab-stop-position",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-caption",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:caption-sequence-name",
+104: REF 'string',
+105: DATA 'string',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:caption-sequence-format",
+104: CHOICE
+105: VALUE 'text',
+105: VALUE 'category-and-value',
+105: VALUE 'caption',
+103: EPSILON
+100: CHOICE
+101: REF 'text-index-title-template',
+101: EPSILON
+100: CHOICE
+101: REF 'text-table-index-entry-template',
+102: ELEMENT "text:table-index-entry-template",
+103: REF 'text-illustration-index-entry-content',
+104: SEQUENCE
+105: REF 'text-illustration-index-entry-template-attrs',
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-index-entry-chapter',
+108: REF 'text-index-entry-page-number',
+108: REF 'text-index-entry-text',
+108: REF 'text-index-entry-span',
+108: REF 'text-index-entry-tab-stop',
+106: EPSILON
+101: EPSILON
+97: REF 'text-index-body',
+94: REF 'text-object-index',
+95: ELEMENT "text:object-index",
+96: SEQUENCE
+97: REF 'common-section-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "text:style-name",
+101: REF 'styleNameRef',
+102: CHOICE
+103: DATA 'NCName',
+103: EPSILON
+100: EPSILON
+99: ATTRIBUTE "text:name",
+100: REF 'string',
+101: DATA 'string',
+99: CHOICE
+100: ATTRIBUTE "text:protected",
+101: REF 'boolean',
+102: CHOICE
+103: VALUE 'true',
+103: VALUE 'false',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key",
+101: REF 'string',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key-digest-algorithm",
+101: REF 'anyIRI',
+102: DATA 'anyURI',
+100: EPSILON
+99: CHOICE
+100: REF 'xml-id',
+101: ATTRIBUTE "xml:id",
+102: REF 'ID',
+103: DATA 'ID',
+100: EPSILON
+97: REF 'text-object-index-source',
+98: ELEMENT "text:object-index-source",
+99: SEQUENCE
+100: REF 'text-object-index-source-attrs',
+101: INTERLEAVE
+102: REF 'text-index-scope-attr',
+103: CHOICE
+104: ATTRIBUTE "text:index-scope",
+105: CHOICE
+106: VALUE 'document',
+106: VALUE 'chapter',
+104: EPSILON
+102: REF 'text-relative-tab-stop-position-attr',
+103: CHOICE
+104: ATTRIBUTE "text:relative-tab-stop-position",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-spreadsheet-objects",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-math-objects",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-draw-objects",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-chart-objects",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-other-objects",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+100: CHOICE
+101: REF 'text-index-title-template',
+101: EPSILON
+100: CHOICE
+101: REF 'text-object-index-entry-template',
+102: ELEMENT "text:object-index-entry-template",
+103: REF 'text-illustration-index-entry-content',
+104: SEQUENCE
+105: REF 'text-illustration-index-entry-template-attrs',
+106: ATTRIBUTE "text:style-name",
+107: REF 'styleNameRef',
+108: CHOICE
+109: DATA 'NCName',
+109: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-index-entry-chapter',
+108: REF 'text-index-entry-page-number',
+108: REF 'text-index-entry-text',
+108: REF 'text-index-entry-span',
+108: REF 'text-index-entry-tab-stop',
+106: EPSILON
+101: EPSILON
+97: REF 'text-index-body',
+94: REF 'text-user-index',
+95: ELEMENT "text:user-index",
+96: SEQUENCE
+97: REF 'common-section-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "text:style-name",
+101: REF 'styleNameRef',
+102: CHOICE
+103: DATA 'NCName',
+103: EPSILON
+100: EPSILON
+99: ATTRIBUTE "text:name",
+100: REF 'string',
+101: DATA 'string',
+99: CHOICE
+100: ATTRIBUTE "text:protected",
+101: REF 'boolean',
+102: CHOICE
+103: VALUE 'true',
+103: VALUE 'false',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key",
+101: REF 'string',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key-digest-algorithm",
+101: REF 'anyIRI',
+102: DATA 'anyURI',
+100: EPSILON
+99: CHOICE
+100: REF 'xml-id',
+101: ATTRIBUTE "xml:id",
+102: REF 'ID',
+103: DATA 'ID',
+100: EPSILON
+97: REF 'text-user-index-source',
+98: ELEMENT "text:user-index-source",
+99: SEQUENCE
+100: REF 'text-user-index-source-attr',
+101: INTERLEAVE
+102: REF 'text-index-scope-attr',
+103: CHOICE
+104: ATTRIBUTE "text:index-scope",
+105: CHOICE
+106: VALUE 'document',
+106: VALUE 'chapter',
+104: EPSILON
+102: REF 'text-relative-tab-stop-position-attr',
+103: CHOICE
+104: ATTRIBUTE "text:relative-tab-stop-position",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-index-marks",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-index-source-styles",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-graphics",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-tables",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-floating-frames",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-objects",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:copy-outline-levels",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: ATTRIBUTE "text:index-name",
+103: REF 'string',
+104: DATA 'string',
+100: CHOICE
+101: REF 'text-index-title-template',
+101: EPSILON
+100: CHOICE
+101: ONEOREMORE
+102: REF 'text-user-index-entry-template',
+103: ELEMENT "text:user-index-entry-template",
+104: SEQUENCE
+105: REF 'text-user-index-entry-template-attrs',
+106: INTERLEAVE
+107: ATTRIBUTE "text:outline-level",
+108: REF 'positiveInteger',
+109: DATA 'positiveInteger',
+107: ATTRIBUTE "text:style-name",
+108: REF 'styleNameRef',
+109: CHOICE
+110: DATA 'NCName',
+110: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-index-entry-chapter',
+108: REF 'text-index-entry-page-number',
+108: REF 'text-index-entry-text',
+108: REF 'text-index-entry-span',
+108: REF 'text-index-entry-tab-stop',
+106: EPSILON
+101: EPSILON
+100: CHOICE
+101: ONEOREMORE
+102: REF 'text-index-source-styles',
+101: EPSILON
+97: REF 'text-index-body',
+94: REF 'text-alphabetical-index',
+95: ELEMENT "text:alphabetical-index",
+96: SEQUENCE
+97: REF 'common-section-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "text:style-name",
+101: REF 'styleNameRef',
+102: CHOICE
+103: DATA 'NCName',
+103: EPSILON
+100: EPSILON
+99: ATTRIBUTE "text:name",
+100: REF 'string',
+101: DATA 'string',
+99: CHOICE
+100: ATTRIBUTE "text:protected",
+101: REF 'boolean',
+102: CHOICE
+103: VALUE 'true',
+103: VALUE 'false',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key",
+101: REF 'string',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key-digest-algorithm",
+101: REF 'anyIRI',
+102: DATA 'anyURI',
+100: EPSILON
+99: CHOICE
+100: REF 'xml-id',
+101: ATTRIBUTE "xml:id",
+102: REF 'ID',
+103: DATA 'ID',
+100: EPSILON
+97: REF 'text-alphabetical-index-source',
+98: ELEMENT "text:alphabetical-index-source",
+99: SEQUENCE
+100: REF 'text-alphabetical-index-source-attrs',
+101: INTERLEAVE
+102: REF 'text-index-scope-attr',
+103: CHOICE
+104: ATTRIBUTE "text:index-scope",
+105: CHOICE
+106: VALUE 'document',
+106: VALUE 'chapter',
+104: EPSILON
+102: REF 'text-relative-tab-stop-position-attr',
+103: CHOICE
+104: ATTRIBUTE "text:relative-tab-stop-position",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:ignore-case",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:main-entry-style-name",
+104: REF 'styleNameRef',
+105: CHOICE
+106: DATA 'NCName',
+106: EPSILON
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:alphabetical-separators",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:combine-entries",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:combine-entries-with-dash",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:combine-entries-with-pp",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:use-keys-as-entries",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:capitalize-entries",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:comma-separated",
+104: REF 'boolean',
+105: CHOICE
+106: VALUE 'true',
+106: VALUE 'false',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "fo:language",
+104: REF 'languageCode',
+105: DATA 'token',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "fo:country",
+104: REF 'countryCode',
+105: DATA 'token',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "fo:script",
+104: REF 'scriptCode',
+105: DATA 'token',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "style:rfc-language-tag",
+104: REF 'language',
+105: DATA 'language',
+103: EPSILON
+102: CHOICE
+103: ATTRIBUTE "text:sort-algorithm",
+104: REF 'string',
+105: DATA 'string',
+103: EPSILON
+100: CHOICE
+101: REF 'text-index-title-template',
+101: EPSILON
+100: CHOICE
+101: ONEOREMORE
+102: REF 'text-alphabetical-index-entry-template',
+103: ELEMENT "text:alphabetical-index-entry-template",
+104: SEQUENCE
+105: REF 'text-alphabetical-index-entry-template-attrs',
+106: INTERLEAVE
+107: ATTRIBUTE "text:outline-level",
+108: CHOICE
+109: VALUE '1',
+109: VALUE '2',
+109: VALUE '3',
+109: VALUE 'separator',
+107: ATTRIBUTE "text:style-name",
+108: REF 'styleNameRef',
+109: CHOICE
+110: DATA 'NCName',
+110: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-index-entry-chapter',
+108: REF 'text-index-entry-page-number',
+108: REF 'text-index-entry-text',
+108: REF 'text-index-entry-span',
+108: REF 'text-index-entry-tab-stop',
+106: EPSILON
+101: EPSILON
+97: REF 'text-index-body',
+94: REF 'text-bibliography',
+95: ELEMENT "text:bibliography",
+96: SEQUENCE
+97: REF 'common-section-attlist',
+98: INTERLEAVE
+99: CHOICE
+100: ATTRIBUTE "text:style-name",
+101: REF 'styleNameRef',
+102: CHOICE
+103: DATA 'NCName',
+103: EPSILON
+100: EPSILON
+99: ATTRIBUTE "text:name",
+100: REF 'string',
+101: DATA 'string',
+99: CHOICE
+100: ATTRIBUTE "text:protected",
+101: REF 'boolean',
+102: CHOICE
+103: VALUE 'true',
+103: VALUE 'false',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key",
+101: REF 'string',
+102: DATA 'string',
+100: EPSILON
+99: CHOICE
+100: ATTRIBUTE "text:protection-key-digest-algorithm",
+101: REF 'anyIRI',
+102: DATA 'anyURI',
+100: EPSILON
+99: CHOICE
+100: REF 'xml-id',
+101: ATTRIBUTE "xml:id",
+102: REF 'ID',
+103: DATA 'ID',
+100: EPSILON
+97: REF 'text-bibliography-source',
+98: ELEMENT "text:bibliography-source",
+99: SEQUENCE
+100: CHOICE
+101: REF 'text-index-title-template',
+101: EPSILON
+100: CHOICE
+101: ONEOREMORE
+102: REF 'text-bibliography-entry-template',
+103: ELEMENT "text:bibliography-entry-template",
+104: SEQUENCE
+105: REF 'text-bibliography-entry-template-attrs',
+106: INTERLEAVE
+107: ATTRIBUTE "text:bibliography-type",
+108: REF 'text-bibliography-types',
+109: CHOICE
+110: VALUE 'article',
+110: VALUE 'book',
+110: VALUE 'booklet',
+110: VALUE 'conference',
+110: VALUE 'custom1',
+110: VALUE 'custom2',
+110: VALUE 'custom3',
+110: VALUE 'custom4',
+110: VALUE 'custom5',
+110: VALUE 'email',
+110: VALUE 'inbook',
+110: VALUE 'incollection',
+110: VALUE 'inproceedings',
+110: VALUE 'journal',
+110: VALUE 'manual',
+110: VALUE 'mastersthesis',
+110: VALUE 'misc',
+110: VALUE 'phdthesis',
+110: VALUE 'proceedings',
+110: VALUE 'techreport',
+110: VALUE 'unpublished',
+110: VALUE 'www',
+107: ATTRIBUTE "text:style-name",
+108: REF 'styleNameRef',
+109: CHOICE
+110: DATA 'NCName',
+110: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: CHOICE
+108: REF 'text-index-entry-span',
+108: REF 'text-index-entry-tab-stop',
+108: REF 'text-index-entry-bibliography',
+109: ELEMENT "text:index-entry-bibliography",
+110: REF 'text-index-entry-bibliography-attrs',
+111: INTERLEAVE
+112: CHOICE
+113: ATTRIBUTE "text:style-name",
+114: REF 'styleNameRef',
+115: CHOICE
+116: DATA 'NCName',
+116: EPSILON
+113: EPSILON
+112: ATTRIBUTE "text:bibliography-data-field",
+113: CHOICE
+114: VALUE 'address',
+114: VALUE 'annote',
+114: VALUE 'author',
+114: VALUE 'bibliography-type',
+114: VALUE 'booktitle',
+114: VALUE 'chapter',
+114: VALUE 'custom1',
+114: VALUE 'custom2',
+114: VALUE 'custom3',
+114: VALUE 'custom4',
+114: VALUE 'custom5',
+114: VALUE 'edition',
+114: VALUE 'editor',
+114: VALUE 'howpublished',
+114: VALUE 'identifier',
+114: VALUE 'institution',
+114: VALUE 'isbn',
+114: VALUE 'issn',
+114: VALUE 'journal',
+114: VALUE 'month',
+114: VALUE 'note',
+114: VALUE 'number',
+114: VALUE 'organizations',
+114: VALUE 'pages',
+114: VALUE 'publisher',
+114: VALUE 'report-type',
+114: VALUE 'school',
+114: VALUE 'series',
+114: VALUE 'title',
+114: VALUE 'url',
+114: VALUE 'volume',
+114: VALUE 'year',
+106: EPSILON
+101: EPSILON
+97: REF 'text-index-body',
+94: REF 'shape',
+95: CHOICE
+96: REF 'shape-instance',
+97: CHOICE
+98: REF 'draw-rect',
+98: REF 'draw-line',
+98: REF 'draw-polyline',
+98: REF 'draw-polygon',
+98: REF 'draw-regular-polygon',
+98: REF 'draw-path',
+98: REF 'draw-circle',
+98: REF 'draw-ellipse',
+98: REF 'draw-g',
+98: REF 'draw-page-thumbnail',
+98: REF 'draw-frame',
+98: REF 'draw-measure',
+99: ELEMENT "draw:measure",
+100: SEQUENCE
+101: REF 'draw-measure-attlist',
+102: INTERLEAVE
+103: ATTRIBUTE "svg:x1",
+104: REF 'coordinate',
+105: REF 'length',
+106: DATA 'string',
+103: ATTRIBUTE "svg:y1",
+104: REF 'coordinate',
+105: REF 'length',
+106: DATA 'string',
+103: ATTRIBUTE "svg:x2",
+104: REF 'coordinate',
+105: REF 'length',
+106: DATA 'string',
+103: ATTRIBUTE "svg:y2",
+104: REF 'coordinate',
+105: REF 'length',
+106: DATA 'string',
+101: REF 'common-draw-shape-with-text-and-styles-attlist',
+102: SEQUENCE
+103: REF 'common-draw-shape-with-styles-attlist',
+104: SEQUENCE
+105: REF 'common-draw-z-index-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:z-index",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+105: REF 'common-draw-id-attlist',
+106: CHOICE
+107: SEQUENCE
+108: REF 'xml-id',
+109: ATTRIBUTE "xml:id",
+110: REF 'ID',
+111: DATA 'ID',
+108: CHOICE
+109: ATTRIBUTE "draw:id",
+110: REF 'NCName',
+111: DATA 'NCName',
+109: EPSILON
+107: EPSILON
+105: REF 'common-draw-layer-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:layer",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-style-name-attlist',
+106: CHOICE
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "draw:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "draw:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "presentation:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "presentation:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+105: REF 'common-draw-transform-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:transform",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:name",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-text-spreadsheet-shape-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "table:end-cell-address",
+109: REF 'cellAddress',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:table-background",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: REF 'common-text-anchor-attlist',
+108: INTERLEAVE
+109: CHOICE
+110: ATTRIBUTE "text:anchor-type",
+111: CHOICE
+112: VALUE 'page',
+112: VALUE 'frame',
+112: VALUE 'paragraph',
+112: VALUE 'char',
+112: VALUE 'as-char',
+110: EPSILON
+109: CHOICE
+110: ATTRIBUTE "text:anchor-page-number",
+111: REF 'positiveInteger',
+112: DATA 'positiveInteger',
+110: EPSILON
+103: REF 'common-draw-text-style-name-attlist',
+104: CHOICE
+105: ATTRIBUTE "draw:text-style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+101: REF 'common-draw-caption-id-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:caption-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+103: EPSILON
+101: CHOICE
+102: REF 'svg-title',
+102: EPSILON
+101: CHOICE
+102: REF 'svg-desc',
+102: EPSILON
+101: CHOICE
+102: REF 'office-event-listeners',
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'draw-glue-point',
+102: EPSILON
+101: REF 'draw-text',
+102: CHOICE
+103: ONEOREMORE
+104: CHOICE
+105: REF 'text-p',
+105: REF 'text-list',
+103: EPSILON
+98: REF 'draw-caption',
+99: ELEMENT "draw:caption",
+100: SEQUENCE
+101: REF 'draw-caption-attlist',
+102: INTERLEAVE
+103: CHOICE
+104: SEQUENCE
+105: ATTRIBUTE "draw:caption-point-x",
+106: REF 'coordinate',
+107: REF 'length',
+108: DATA 'string',
+105: ATTRIBUTE "draw:caption-point-y",
+106: REF 'coordinate',
+107: REF 'length',
+108: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:corner-radius",
+105: REF 'nonNegativeLength',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-position-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:x",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:y",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-size-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:width",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:height",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-shape-with-text-and-styles-attlist',
+102: SEQUENCE
+103: REF 'common-draw-shape-with-styles-attlist',
+104: SEQUENCE
+105: REF 'common-draw-z-index-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:z-index",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+105: REF 'common-draw-id-attlist',
+106: CHOICE
+107: SEQUENCE
+108: REF 'xml-id',
+109: ATTRIBUTE "xml:id",
+110: REF 'ID',
+111: DATA 'ID',
+108: CHOICE
+109: ATTRIBUTE "draw:id",
+110: REF 'NCName',
+111: DATA 'NCName',
+109: EPSILON
+107: EPSILON
+105: REF 'common-draw-layer-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:layer",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-style-name-attlist',
+106: CHOICE
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "draw:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "draw:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "presentation:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "presentation:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+105: REF 'common-draw-transform-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:transform",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:name",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-text-spreadsheet-shape-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "table:end-cell-address",
+109: REF 'cellAddress',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:table-background",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: REF 'common-text-anchor-attlist',
+108: INTERLEAVE
+109: CHOICE
+110: ATTRIBUTE "text:anchor-type",
+111: CHOICE
+112: VALUE 'page',
+112: VALUE 'frame',
+112: VALUE 'paragraph',
+112: VALUE 'char',
+112: VALUE 'as-char',
+110: EPSILON
+109: CHOICE
+110: ATTRIBUTE "text:anchor-page-number",
+111: REF 'positiveInteger',
+112: DATA 'positiveInteger',
+110: EPSILON
+103: REF 'common-draw-text-style-name-attlist',
+104: CHOICE
+105: ATTRIBUTE "draw:text-style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+101: REF 'common-draw-caption-id-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:caption-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+103: EPSILON
+101: CHOICE
+102: REF 'svg-title',
+102: EPSILON
+101: CHOICE
+102: REF 'svg-desc',
+102: EPSILON
+101: CHOICE
+102: REF 'office-event-listeners',
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'draw-glue-point',
+102: EPSILON
+101: REF 'draw-text',
+102: CHOICE
+103: ONEOREMORE
+104: CHOICE
+105: REF 'text-p',
+105: REF 'text-list',
+103: EPSILON
+98: REF 'draw-connector',
+99: ELEMENT "draw:connector",
+100: SEQUENCE
+101: REF 'draw-connector-attlist',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "draw:type",
+105: CHOICE
+106: VALUE 'standard',
+106: VALUE 'lines',
+106: VALUE 'line',
+106: VALUE 'curve',
+104: EPSILON
+103: CHOICE
+104: SEQUENCE
+105: ATTRIBUTE "svg:x1",
+106: REF 'coordinate',
+107: REF 'length',
+108: DATA 'string',
+105: ATTRIBUTE "svg:y1",
+106: REF 'coordinate',
+107: REF 'length',
+108: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:start-shape",
+105: REF 'IDREF',
+106: DATA 'IDREF',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:start-glue-point",
+105: REF 'nonNegativeInteger',
+106: DATA 'nonNegativeInteger',
+104: EPSILON
+103: CHOICE
+104: SEQUENCE
+105: ATTRIBUTE "svg:x2",
+106: REF 'coordinate',
+107: REF 'length',
+108: DATA 'string',
+105: ATTRIBUTE "svg:y2",
+106: REF 'coordinate',
+107: REF 'length',
+108: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:end-shape",
+105: REF 'IDREF',
+106: DATA 'IDREF',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:end-glue-point",
+105: REF 'nonNegativeInteger',
+106: DATA 'nonNegativeInteger',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:line-skew",
+105: LIST
+106: SEQUENCE
+107: REF 'length',
+108: DATA 'string',
+107: CHOICE
+108: SEQUENCE
+109: REF 'length',
+110: DATA 'string',
+109: CHOICE
+110: REF 'length',
+111: DATA 'string',
+110: EPSILON
+108: EPSILON
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:d",
+105: REF 'pathData',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-shape-with-text-and-styles-attlist',
+102: SEQUENCE
+103: REF 'common-draw-shape-with-styles-attlist',
+104: SEQUENCE
+105: REF 'common-draw-z-index-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:z-index",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+105: REF 'common-draw-id-attlist',
+106: CHOICE
+107: SEQUENCE
+108: REF 'xml-id',
+109: ATTRIBUTE "xml:id",
+110: REF 'ID',
+111: DATA 'ID',
+108: CHOICE
+109: ATTRIBUTE "draw:id",
+110: REF 'NCName',
+111: DATA 'NCName',
+109: EPSILON
+107: EPSILON
+105: REF 'common-draw-layer-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:layer",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-style-name-attlist',
+106: CHOICE
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "draw:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "draw:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "presentation:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "presentation:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+105: REF 'common-draw-transform-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:transform",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:name",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-text-spreadsheet-shape-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "table:end-cell-address",
+109: REF 'cellAddress',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:table-background",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: REF 'common-text-anchor-attlist',
+108: INTERLEAVE
+109: CHOICE
+110: ATTRIBUTE "text:anchor-type",
+111: CHOICE
+112: VALUE 'page',
+112: VALUE 'frame',
+112: VALUE 'paragraph',
+112: VALUE 'char',
+112: VALUE 'as-char',
+110: EPSILON
+109: CHOICE
+110: ATTRIBUTE "text:anchor-page-number",
+111: REF 'positiveInteger',
+112: DATA 'positiveInteger',
+110: EPSILON
+103: REF 'common-draw-text-style-name-attlist',
+104: CHOICE
+105: ATTRIBUTE "draw:text-style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+101: REF 'common-draw-caption-id-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:caption-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+103: EPSILON
+101: REF 'common-draw-viewbox-attlist',
+102: ATTRIBUTE "svg:viewBox",
+103: LIST
+104: SEQUENCE
+105: REF 'integer',
+106: DATA 'integer',
+105: REF 'integer',
+106: DATA 'integer',
+105: REF 'integer',
+106: DATA 'integer',
+105: REF 'integer',
+106: DATA 'integer',
+101: CHOICE
+102: REF 'svg-title',
+102: EPSILON
+101: CHOICE
+102: REF 'svg-desc',
+102: EPSILON
+101: CHOICE
+102: REF 'office-event-listeners',
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'draw-glue-point',
+102: EPSILON
+101: REF 'draw-text',
+102: CHOICE
+103: ONEOREMORE
+104: CHOICE
+105: REF 'text-p',
+105: REF 'text-list',
+103: EPSILON
+98: REF 'draw-control',
+99: ELEMENT "draw:control",
+100: SEQUENCE
+101: REF 'draw-control-attlist',
+102: ATTRIBUTE "draw:control",
+103: REF 'IDREF',
+104: DATA 'IDREF',
+101: REF 'common-draw-position-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:x",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:y",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-size-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:width",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:height",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-shape-with-text-and-styles-attlist',
+102: SEQUENCE
+103: REF 'common-draw-shape-with-styles-attlist',
+104: SEQUENCE
+105: REF 'common-draw-z-index-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:z-index",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+105: REF 'common-draw-id-attlist',
+106: CHOICE
+107: SEQUENCE
+108: REF 'xml-id',
+109: ATTRIBUTE "xml:id",
+110: REF 'ID',
+111: DATA 'ID',
+108: CHOICE
+109: ATTRIBUTE "draw:id",
+110: REF 'NCName',
+111: DATA 'NCName',
+109: EPSILON
+107: EPSILON
+105: REF 'common-draw-layer-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:layer",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-style-name-attlist',
+106: CHOICE
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "draw:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "draw:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "presentation:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "presentation:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+105: REF 'common-draw-transform-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:transform",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:name",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-text-spreadsheet-shape-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "table:end-cell-address",
+109: REF 'cellAddress',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:table-background",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: REF 'common-text-anchor-attlist',
+108: INTERLEAVE
+109: CHOICE
+110: ATTRIBUTE "text:anchor-type",
+111: CHOICE
+112: VALUE 'page',
+112: VALUE 'frame',
+112: VALUE 'paragraph',
+112: VALUE 'char',
+112: VALUE 'as-char',
+110: EPSILON
+109: CHOICE
+110: ATTRIBUTE "text:anchor-page-number",
+111: REF 'positiveInteger',
+112: DATA 'positiveInteger',
+110: EPSILON
+103: REF 'common-draw-text-style-name-attlist',
+104: CHOICE
+105: ATTRIBUTE "draw:text-style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+101: REF 'common-draw-caption-id-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:caption-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+103: EPSILON
+101: CHOICE
+102: REF 'svg-title',
+102: EPSILON
+101: CHOICE
+102: REF 'svg-desc',
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'draw-glue-point',
+102: EPSILON
+98: REF 'dr3d-scene',
+99: ELEMENT "dr3d:scene",
+100: SEQUENCE
+101: REF 'dr3d-scene-attlist',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "dr3d:vrp",
+105: REF 'vector3D',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:vpn",
+105: REF 'vector3D',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:vup",
+105: REF 'vector3D',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:projection",
+105: CHOICE
+106: VALUE 'parallel',
+106: VALUE 'perspective',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:distance",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:focal-length",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:shadow-slant",
+105: REF 'angle',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:shade-mode",
+105: CHOICE
+106: VALUE 'flat',
+106: VALUE 'phong',
+106: VALUE 'gouraud',
+106: VALUE 'draft',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:ambient-color",
+105: REF 'color',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "dr3d:lighting-mode",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+101: REF 'common-draw-position-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:x",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:y",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-size-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:width",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:height",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-style-name-attlist',
+102: CHOICE
+103: SEQUENCE
+104: CHOICE
+105: ATTRIBUTE "draw:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "draw:class-names",
+106: REF 'styleNameRefs',
+107: LIST
+108: CHOICE
+109: ONEOREMORE
+110: DATA 'NCName',
+109: EPSILON
+105: EPSILON
+103: SEQUENCE
+104: CHOICE
+105: ATTRIBUTE "presentation:style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+104: CHOICE
+105: ATTRIBUTE "presentation:class-names",
+106: REF 'styleNameRefs',
+107: LIST
+108: CHOICE
+109: ONEOREMORE
+110: DATA 'NCName',
+109: EPSILON
+105: EPSILON
+101: REF 'common-draw-z-index-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:z-index",
+104: REF 'nonNegativeInteger',
+105: DATA 'nonNegativeInteger',
+103: EPSILON
+101: REF 'common-draw-id-attlist',
+102: CHOICE
+103: SEQUENCE
+104: REF 'xml-id',
+105: ATTRIBUTE "xml:id",
+106: REF 'ID',
+107: DATA 'ID',
+104: CHOICE
+105: ATTRIBUTE "draw:id",
+106: REF 'NCName',
+107: DATA 'NCName',
+105: EPSILON
+103: EPSILON
+101: REF 'common-draw-layer-name-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:layer",
+104: REF 'string',
+105: DATA 'string',
+103: EPSILON
+101: REF 'common-text-spreadsheet-shape-attlist',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "table:end-cell-address",
+105: REF 'cellAddress',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "table:end-x",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "table:end-y",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "table:table-background",
+105: REF 'boolean',
+106: CHOICE
+107: VALUE 'true',
+107: VALUE 'false',
+104: EPSILON
+103: REF 'common-text-anchor-attlist',
+104: INTERLEAVE
+105: CHOICE
+106: ATTRIBUTE "text:anchor-type",
+107: CHOICE
+108: VALUE 'page',
+108: VALUE 'frame',
+108: VALUE 'paragraph',
+108: VALUE 'char',
+108: VALUE 'as-char',
+106: EPSILON
+105: CHOICE
+106: ATTRIBUTE "text:anchor-page-number",
+107: REF 'positiveInteger',
+108: DATA 'positiveInteger',
+106: EPSILON
+101: REF 'common-dr3d-transform-attlist',
+102: CHOICE
+103: ATTRIBUTE "dr3d:transform",
+104: REF 'string',
+105: DATA 'string',
+103: EPSILON
+101: REF 'common-draw-caption-id-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:caption-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+103: EPSILON
+101: CHOICE
+102: REF 'svg-title',
+102: EPSILON
+101: CHOICE
+102: REF 'svg-desc',
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'dr3d-light',
+104: ELEMENT "dr3d:light",
+105: REF 'dr3d-light-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "dr3d:diffuse-color",
+109: REF 'color',
+110: DATA 'string',
+108: EPSILON
+107: ATTRIBUTE "dr3d:direction",
+108: REF 'vector3D',
+109: DATA 'string',
+107: CHOICE
+108: ATTRIBUTE "dr3d:enabled",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "dr3d:specular",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'shapes3d',
+104: CHOICE
+105: REF 'dr3d-scene',
+105: REF 'dr3d-extrude',
+106: ELEMENT "dr3d:extrude",
+107: SEQUENCE
+108: REF 'common-draw-path-data-attlist',
+109: ATTRIBUTE "svg:d",
+110: REF 'pathData',
+111: DATA 'string',
+108: REF 'common-draw-viewbox-attlist',
+109: ATTRIBUTE "svg:viewBox",
+110: LIST
+111: SEQUENCE
+112: REF 'integer',
+113: DATA 'integer',
+112: REF 'integer',
+113: DATA 'integer',
+112: REF 'integer',
+113: DATA 'integer',
+112: REF 'integer',
+113: DATA 'integer',
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: SEQUENCE
+111: REF 'xml-id',
+112: ATTRIBUTE "xml:id",
+113: REF 'ID',
+114: DATA 'ID',
+111: CHOICE
+112: ATTRIBUTE "draw:id",
+113: REF 'NCName',
+114: DATA 'NCName',
+112: EPSILON
+110: EPSILON
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-dr3d-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "dr3d:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+105: REF 'dr3d-sphere',
+106: ELEMENT "dr3d:sphere",
+107: SEQUENCE
+108: REF 'dr3d-sphere-attlist',
+109: INTERLEAVE
+110: CHOICE
+111: ATTRIBUTE "dr3d:center",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "dr3d:size",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: SEQUENCE
+111: REF 'xml-id',
+112: ATTRIBUTE "xml:id",
+113: REF 'ID',
+114: DATA 'ID',
+111: CHOICE
+112: ATTRIBUTE "draw:id",
+113: REF 'NCName',
+114: DATA 'NCName',
+112: EPSILON
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-dr3d-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "dr3d:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+105: REF 'dr3d-rotate',
+106: ELEMENT "dr3d:rotate",
+107: SEQUENCE
+108: REF 'common-draw-viewbox-attlist',
+109: ATTRIBUTE "svg:viewBox",
+110: LIST
+111: SEQUENCE
+112: REF 'integer',
+113: DATA 'integer',
+112: REF 'integer',
+113: DATA 'integer',
+112: REF 'integer',
+113: DATA 'integer',
+112: REF 'integer',
+113: DATA 'integer',
+108: REF 'common-draw-path-data-attlist',
+109: ATTRIBUTE "svg:d",
+110: REF 'pathData',
+111: DATA 'string',
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: SEQUENCE
+111: REF 'xml-id',
+112: ATTRIBUTE "xml:id",
+113: REF 'ID',
+114: DATA 'ID',
+111: CHOICE
+112: ATTRIBUTE "draw:id",
+113: REF 'NCName',
+114: DATA 'NCName',
+112: EPSILON
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-dr3d-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "dr3d:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+105: REF 'dr3d-cube',
+106: ELEMENT "dr3d:cube",
+107: SEQUENCE
+108: REF 'dr3d-cube-attlist',
+109: SEQUENCE
+110: CHOICE
+111: ATTRIBUTE "dr3d:min-edge",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+110: CHOICE
+111: ATTRIBUTE "dr3d:max-edge",
+112: REF 'vector3D',
+113: DATA 'string',
+111: EPSILON
+108: REF 'common-draw-z-index-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:z-index",
+111: REF 'nonNegativeInteger',
+112: DATA 'nonNegativeInteger',
+110: EPSILON
+108: REF 'common-draw-id-attlist',
+109: CHOICE
+110: SEQUENCE
+111: REF 'xml-id',
+112: ATTRIBUTE "xml:id",
+113: REF 'ID',
+114: DATA 'ID',
+111: CHOICE
+112: ATTRIBUTE "draw:id",
+113: REF 'NCName',
+114: DATA 'NCName',
+112: EPSILON
+110: EPSILON
+108: REF 'common-draw-layer-name-attlist',
+109: CHOICE
+110: ATTRIBUTE "draw:layer",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+108: REF 'common-draw-style-name-attlist',
+109: CHOICE
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "draw:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+110: SEQUENCE
+111: CHOICE
+112: ATTRIBUTE "presentation:style-name",
+113: REF 'styleNameRef',
+114: CHOICE
+115: DATA 'NCName',
+115: EPSILON
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "presentation:class-names",
+113: REF 'styleNameRefs',
+114: LIST
+115: CHOICE
+116: ONEOREMORE
+117: DATA 'NCName',
+116: EPSILON
+112: EPSILON
+108: REF 'common-dr3d-transform-attlist',
+109: CHOICE
+110: ATTRIBUTE "dr3d:transform",
+111: REF 'string',
+112: DATA 'string',
+110: EPSILON
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'draw-glue-point',
+102: EPSILON
+98: REF 'draw-custom-shape',
+99: ELEMENT "draw:custom-shape",
+100: SEQUENCE
+101: REF 'draw-custom-shape-attlist',
+102: INTERLEAVE
+103: CHOICE
+104: ATTRIBUTE "draw:engine",
+105: REF 'namespacedToken',
+106: DATA 'QName',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "draw:data",
+105: REF 'string',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-position-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:x",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:y",
+105: REF 'coordinate',
+106: REF 'length',
+107: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-size-attlist',
+102: SEQUENCE
+103: CHOICE
+104: ATTRIBUTE "svg:width",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+103: CHOICE
+104: ATTRIBUTE "svg:height",
+105: REF 'length',
+106: DATA 'string',
+104: EPSILON
+101: REF 'common-draw-shape-with-text-and-styles-attlist',
+102: SEQUENCE
+103: REF 'common-draw-shape-with-styles-attlist',
+104: SEQUENCE
+105: REF 'common-draw-z-index-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:z-index",
+108: REF 'nonNegativeInteger',
+109: DATA 'nonNegativeInteger',
+107: EPSILON
+105: REF 'common-draw-id-attlist',
+106: CHOICE
+107: SEQUENCE
+108: REF 'xml-id',
+109: ATTRIBUTE "xml:id",
+110: REF 'ID',
+111: DATA 'ID',
+108: CHOICE
+109: ATTRIBUTE "draw:id",
+110: REF 'NCName',
+111: DATA 'NCName',
+109: EPSILON
+107: EPSILON
+105: REF 'common-draw-layer-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:layer",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-style-name-attlist',
+106: CHOICE
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "draw:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "draw:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+107: SEQUENCE
+108: CHOICE
+109: ATTRIBUTE "presentation:style-name",
+110: REF 'styleNameRef',
+111: CHOICE
+112: DATA 'NCName',
+112: EPSILON
+109: EPSILON
+108: CHOICE
+109: ATTRIBUTE "presentation:class-names",
+110: REF 'styleNameRefs',
+111: LIST
+112: CHOICE
+113: ONEOREMORE
+114: DATA 'NCName',
+113: EPSILON
+109: EPSILON
+105: REF 'common-draw-transform-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:transform",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-draw-name-attlist',
+106: CHOICE
+107: ATTRIBUTE "draw:name",
+108: REF 'string',
+109: DATA 'string',
+107: EPSILON
+105: REF 'common-text-spreadsheet-shape-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "table:end-cell-address",
+109: REF 'cellAddress',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-x",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:end-y",
+109: REF 'coordinate',
+110: REF 'length',
+111: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "table:table-background",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: REF 'common-text-anchor-attlist',
+108: INTERLEAVE
+109: CHOICE
+110: ATTRIBUTE "text:anchor-type",
+111: CHOICE
+112: VALUE 'page',
+112: VALUE 'frame',
+112: VALUE 'paragraph',
+112: VALUE 'char',
+112: VALUE 'as-char',
+110: EPSILON
+109: CHOICE
+110: ATTRIBUTE "text:anchor-page-number",
+111: REF 'positiveInteger',
+112: DATA 'positiveInteger',
+110: EPSILON
+103: REF 'common-draw-text-style-name-attlist',
+104: CHOICE
+105: ATTRIBUTE "draw:text-style-name",
+106: REF 'styleNameRef',
+107: CHOICE
+108: DATA 'NCName',
+108: EPSILON
+105: EPSILON
+101: REF 'common-draw-caption-id-attlist',
+102: CHOICE
+103: ATTRIBUTE "draw:caption-id",
+104: REF 'IDREF',
+105: DATA 'IDREF',
+103: EPSILON
+101: CHOICE
+102: REF 'svg-title',
+102: EPSILON
+101: CHOICE
+102: REF 'svg-desc',
+102: EPSILON
+101: CHOICE
+102: REF 'office-event-listeners',
+102: EPSILON
+101: CHOICE
+102: ONEOREMORE
+103: REF 'draw-glue-point',
+102: EPSILON
+101: REF 'draw-text',
+102: CHOICE
+103: ONEOREMORE
+104: CHOICE
+105: REF 'text-p',
+105: REF 'text-list',
+103: EPSILON
+101: CHOICE
+102: REF 'draw-enhanced-geometry',
+103: ELEMENT "draw:enhanced-geometry",
+104: SEQUENCE
+105: REF 'draw-enhanced-geometry-attlist',
+106: INTERLEAVE
+107: CHOICE
+108: ATTRIBUTE "draw:type",
+109: REF 'custom-shape-type',
+110: CHOICE
+111: VALUE 'non-primitive',
+111: REF 'string',
+112: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "svg:viewBox",
+109: LIST
+110: SEQUENCE
+111: REF 'integer',
+112: DATA 'integer',
+111: REF 'integer',
+112: DATA 'integer',
+111: REF 'integer',
+112: DATA 'integer',
+111: REF 'integer',
+112: DATA 'integer',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:mirror-vertical",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:mirror-horizontal",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-rotate-angle",
+109: REF 'angle',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-allowed",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-path-allowed",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:concentric-gradient-fill-allowed",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-brightness",
+109: REF 'zeroToHundredPercent',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-depth",
+109: LIST
+110: SEQUENCE
+111: REF 'length',
+112: DATA 'string',
+111: REF 'double',
+112: DATA 'double',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-diffusion",
+109: REF 'percent',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-number-of-line-segments",
+109: REF 'integer',
+110: DATA 'integer',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-light-face",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-first-light-harsh",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-second-light-harsh",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-first-light-level",
+109: REF 'zeroToHundredPercent',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-second-light-level",
+109: REF 'zeroToHundredPercent',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-first-light-direction",
+109: REF 'vector3D',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-second-light-direction",
+109: REF 'vector3D',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-metal",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "dr3d:shade-mode",
+109: CHOICE
+110: VALUE 'flat',
+110: VALUE 'phong',
+110: VALUE 'gouraud',
+110: VALUE 'draft',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-rotation-angle",
+109: LIST
+110: SEQUENCE
+111: REF 'angle',
+112: DATA 'string',
+111: REF 'angle',
+112: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-rotation-center",
+109: REF 'vector3D',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-shininess",
+109: REF 'zeroToHundredPercent',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-skew",
+109: LIST
+110: SEQUENCE
+111: REF 'double',
+112: DATA 'double',
+111: REF 'angle',
+112: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-specularity",
+109: REF 'zeroToHundredPercent',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "dr3d:projection",
+109: CHOICE
+110: VALUE 'parallel',
+110: VALUE 'perspective',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-viewpoint",
+109: REF 'point3D',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-origin",
+109: LIST
+110: SEQUENCE
+111: REF 'extrusionOrigin',
+112: DATA 'double',
+111: REF 'extrusionOrigin',
+112: DATA 'double',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:extrusion-color",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:enhanced-path",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:path-stretchpoint-x",
+109: REF 'double',
+110: DATA 'double',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:path-stretchpoint-y",
+109: REF 'double',
+110: DATA 'double',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-areas",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:glue-points",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:glue-point-type",
+109: CHOICE
+110: VALUE 'none',
+110: VALUE 'segments',
+110: VALUE 'rectangle',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:glue-point-leaving-directions",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-path",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-path-mode",
+109: CHOICE
+110: VALUE 'normal',
+110: VALUE 'path',
+110: VALUE 'shape',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-path-scale",
+109: CHOICE
+110: VALUE 'path',
+110: VALUE 'shape',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:text-path-same-letter-heights",
+109: REF 'boolean',
+110: CHOICE
+111: VALUE 'true',
+111: VALUE 'false',
+108: EPSILON
+107: CHOICE
+108: ATTRIBUTE "draw:modifiers",
+109: REF 'string',
+110: DATA 'string',
+108: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: REF 'draw-equation',
+108: ELEMENT "draw:equation",
+109: REF 'draw-equation-attlist',
+110: INTERLEAVE
+111: CHOICE
+112: ATTRIBUTE "draw:name",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:formula",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+106: EPSILON
+105: CHOICE
+106: ONEOREMORE
+107: REF 'draw-handle',
+108: ELEMENT "draw:handle",
+109: REF 'draw-handle-attlist',
+110: INTERLEAVE
+111: CHOICE
+112: ATTRIBUTE "draw:handle-mirror-vertical",
+113: REF 'boolean',
+114: CHOICE
+115: VALUE 'true',
+115: VALUE 'false',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-mirror-horizontal",
+113: REF 'boolean',
+114: CHOICE
+115: VALUE 'true',
+115: VALUE 'false',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-switched",
+113: REF 'boolean',
+114: CHOICE
+115: VALUE 'true',
+115: VALUE 'false',
+112: EPSILON
+111: ATTRIBUTE "draw:handle-position",
+112: REF 'string',
+113: DATA 'string',
+111: CHOICE
+112: ATTRIBUTE "draw:handle-range-x-minimum",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-range-x-maximum",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-range-y-minimum",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-range-y-maximum",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-polar",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-radius-range-minimum",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+111: CHOICE
+112: ATTRIBUTE "draw:handle-radius-range-maximum",
+113: REF 'string',
+114: DATA 'string',
+112: EPSILON
+106: EPSILON
+102: EPSILON
+96: REF 'draw-a',
+97: ELEMENT "draw:a",
+98: SEQUENCE
+99: REF 'draw-a-attlist',
+100: INTERLEAVE
+101: ATTRIBUTE "xlink:type",
+102: VALUE 'simple',
+101: ATTRIBUTE "xlink:href",
+102: REF 'anyIRI',
+103: DATA 'anyURI',
+101: CHOICE
+102: ATTRIBUTE "xlink:actuate",
+103: VALUE 'onRequest',
+102: EPSILON
+101: CHOICE
+102: ATTRIBUTE "office:target-frame-name",
+103: REF 'targetFrameName',
+104: CHOICE
+105: VALUE '_self',
+105: VALUE '_blank',
+105: VALUE '_parent',
+105: VALUE '_top',
+105: REF 'string',
+106: DATA 'string',
+102: EPSILON
+101: CHOICE
+102: ATTRIBUTE "xlink:show",
+103: CHOICE
+104: VALUE 'new',
+104: VALUE 'replace',
+102: EPSILON
+101: CHOICE
+102: ATTRIBUTE "office:name",
+103: REF 'string',
+104: DATA 'string',
+102: EPSILON
+101: CHOICE
+102: ATTRIBUTE "office:title",
+103: REF 'string',
+104: DATA 'string',
+102: EPSILON
+101: CHOICE
+102: ATTRIBUTE "office:server-map",
+103: REF 'boolean',
+104: CHOICE
+105: VALUE 'true',
+105: VALUE 'false',
+102: EPSILON
+101: CHOICE
+102: REF 'xml-id',
+103: ATTRIBUTE "xml:id",
+104: REF 'ID',
+105: DATA 'ID',
+102: EPSILON
+99: REF 'shape-instance',
+100: CHOICE
+101: REF 'draw-rect',
+101: REF 'draw-line',
+101: REF 'draw-polyline',
+101: REF 'draw-polygon',
+101: REF 'draw-regular-polygon',
+101: REF 'draw-path',
+101: REF 'draw-circle',
+101: REF 'draw-ellipse',
+101: REF 'draw-g',
+101: REF 'draw-page-thumbnail',
+101: REF 'draw-frame',
+101: REF 'draw-measure',
+101: REF 'draw-caption',
+101: REF 'draw-connector',
+101: REF 'draw-control',
+101: REF 'dr3d-scene',
+101: REF 'draw-custom-shape',
+94: REF 'change-marks',
+95: CHOICE
+96: ELEMENT "text:change",
+97: REF 'change-mark-attr',
+98: ATTRIBUTE "text:change-id",
+99: REF 'IDREF',
+100: DATA 'IDREF',
+96: ELEMENT "text:change-start",
+97: REF 'change-mark-attr',
+98: ATTRIBUTE "text:change-id",
+99: REF 'IDREF',
+100: DATA 'IDREF',
+96: ELEMENT "text:change-end",
+97: REF 'change-mark-attr',
+98: ATTRIBUTE "text:change-id",
+99: REF 'IDREF',
+100: DATA 'IDREF',
+92: REF 'text-index-title',
+93: ELEMENT "text:index-title",
+94: SEQUENCE
+95: REF 'common-section-attlist',
+96: INTERLEAVE
+97: CHOICE
+98: ATTRIBUTE "text:style-name",
+99: REF 'styleNameRef',
+100: CHOICE
+101: DATA 'NCName',
+101: EPSILON
+98: EPSILON
+97: ATTRIBUTE "text:name",
+98: REF 'string',
+99: DATA 'string',
+97: CHOICE
+98: ATTRIBUTE "text:protected",
+99: REF 'boolean',
+100: CHOICE
+101: VALUE 'true',
+101: VALUE 'false',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "text:protection-key",
+99: REF 'string',
+100: DATA 'string',
+98: EPSILON
+97: CHOICE
+98: ATTRIBUTE "text:protection-key-digest-algorithm",
+99: REF 'anyIRI',
+100: DATA 'anyURI',
+98: EPSILON
+97: CHOICE
+98: REF 'xml-id',
+99: ATTRIBUTE "xml:id",
+100: REF 'ID',
+101: DATA 'ID',
+98: EPSILON
+95: CHOICE
+96: ONEOREMORE
+97: REF 'index-content-main',
+98: CHOICE
+99: REF 'text-content',
+100: CHOICE
+101: REF 'text-h',
+101: REF 'text-p',
+101: REF 'text-list',
+101: REF 'text-numbered-paragraph',
+101: REF 'table-table',
+101: REF 'text-section',
+101: REF 'text-soft-page-break',
+101: REF 'text-table-of-content',
+101: REF 'text-illustration-index',
+101: REF 'text-table-index',
+101: REF 'text-object-index',
+101: REF 'text-user-index',
+101: REF 'text-alphabetical-index',
+101: REF 'text-bibliography',
+101: REF 'shape',
+102: CHOICE
+103: REF 'shape-instance',
+104: CHOICE
+105: REF 'draw-rect',
+105: REF 'draw-line',
+105: REF 'draw-polyline',
+105: REF 'draw-polygon',
+105: REF 'draw-regular-polygon',
+105: REF 'draw-path',
+105: REF 'draw-circle',
+105: REF 'draw-ellipse',
+105: REF 'draw-g',
+105: REF 'draw-page-thumbnail',
+105: REF 'draw-frame',
+105: REF 'draw-measure',
+105: REF 'draw-caption',
+105: REF 'draw-connector',
+105: REF 'draw-control',
+105: REF 'dr3d-scene',
+105: REF 'draw-custom-shape',
+103: REF 'draw-a',
+101: REF 'change-marks',
+102: CHOICE
+99: REF 'text-index-title',
+96: EPSILON
+89: EPSILON
+83: REF 'text-illustration-index',
+83: REF 'text-table-index',
+83: REF 'text-object-index',
+83: REF 'text-user-index',
+83: REF 'text-alphabetical-index',
+83: REF 'text-bibliography',
+83: REF 'shape',
+84: CHOICE
+85: REF 'shape-instance',
+86: CHOICE
+87: REF 'draw-rect',
+87: REF 'draw-line',
+87: REF 'draw-polyline',
+87: REF 'draw-polygon',
+87: REF 'draw-regular-polygon',
+87: REF 'draw-path',
+87: REF 'draw-circle',
+87: REF 'draw-ellipse',
+87: REF 'draw-g',
+87: REF 'draw-page-thumbnail',
+87: REF 'draw-frame',
+87: REF 'draw-measure',
+87: REF 'draw-caption',
+87: REF 'draw-connector',
+87: REF 'draw-control',
+87: REF 'dr3d-scene',
+87: REF 'draw-custom-shape',
+85: REF 'draw-a',
+83: REF 'change-marks',
+84: CHOICE
+80: EPSILON
+76: REF 'text-soft-page-break',
+76: REF 'text-table-of-content',
+76: REF 'text-illustration-index',
+76: REF 'text-table-index',
+76: REF 'text-object-index',
+76: REF 'text-user-index',
+76: REF 'text-alphabetical-index',
+76: REF 'text-bibliography',
+76: REF 'shape',
+77: CHOICE
+78: REF 'shape-instance',
+79: CHOICE
+80: REF 'draw-rect',
+80: REF 'draw-line',
+80: REF 'draw-polyline',
+80: REF 'draw-polygon',
+80: REF 'draw-regular-polygon',
+80: REF 'draw-path',
+80: REF 'draw-circle',
+80: REF 'draw-ellipse',
+80: REF 'draw-g',
+80: REF 'draw-page-thumbnail',
+80: REF 'draw-frame',
+80: REF 'draw-measure',
+80: REF 'draw-caption',
+80: REF 'draw-connector',
+80: REF 'draw-control',
+80: REF 'dr3d-scene',
+80: REF 'draw-custom-shape',
+78: REF 'draw-a',
+76: REF 'change-marks',
+77: CHOICE
+73: EPSILON
+69: REF 'draw-image',
+70: ELEMENT "draw:image",
+71: SEQUENCE
+72: REF 'draw-image-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:filter-name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+72: CHOICE
+73: REF 'common-draw-data-attlist',
+74: SEQUENCE
+75: ATTRIBUTE "xlink:type",
+76: VALUE 'simple',
+75: ATTRIBUTE "xlink:href",
+76: REF 'anyIRI',
+77: DATA 'anyURI',
+75: CHOICE
+76: ATTRIBUTE "xlink:show",
+77: VALUE 'embed',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "xlink:actuate",
+77: VALUE 'onLoad',
+76: EPSILON
+73: REF 'office-binary-data',
+72: REF 'draw-text',
+73: CHOICE
+74: ONEOREMORE
+75: CHOICE
+76: REF 'text-p',
+76: REF 'text-list',
+74: EPSILON
+69: REF 'draw-object',
+70: ELEMENT "draw:object",
+71: SEQUENCE
+72: REF 'draw-object-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:notify-on-update-of-ranges",
+76: CHOICE
+77: REF 'cellRangeAddressList',
+78: DATA 'string',
+77: REF 'string',
+78: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+72: CHOICE
+73: REF 'common-draw-data-attlist',
+74: SEQUENCE
+75: ATTRIBUTE "xlink:type",
+76: VALUE 'simple',
+75: ATTRIBUTE "xlink:href",
+76: REF 'anyIRI',
+77: DATA 'anyURI',
+75: CHOICE
+76: ATTRIBUTE "xlink:show",
+77: VALUE 'embed',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "xlink:actuate",
+77: VALUE 'onLoad',
+76: EPSILON
+73: REF 'office-document',
+73: REF 'math-math',
+74: ELEMENT "math:math",
+75: REF 'mathMarkup',
+76: ONEOREMORE
+77: CHOICE
+78: ATTRIBUTE "*",
+79: STRING
+78: STRING
+78: ELEMENT "*",
+79: REF 'mathMarkup',
+80: ONEOREMORE
+81: CHOICE
+82: ATTRIBUTE "*",
+83: STRING
+82: STRING
+69: REF 'draw-object-ole',
+70: ELEMENT "draw:object-ole",
+71: SEQUENCE
+72: REF 'draw-object-ole-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:class-id",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+72: CHOICE
+73: REF 'common-draw-data-attlist',
+74: SEQUENCE
+75: ATTRIBUTE "xlink:type",
+76: VALUE 'simple',
+75: ATTRIBUTE "xlink:href",
+76: REF 'anyIRI',
+77: DATA 'anyURI',
+75: CHOICE
+76: ATTRIBUTE "xlink:show",
+77: VALUE 'embed',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "xlink:actuate",
+77: VALUE 'onLoad',
+76: EPSILON
+73: REF 'office-binary-data',
+69: REF 'draw-applet',
+70: ELEMENT "draw:applet",
+71: SEQUENCE
+72: REF 'draw-applet-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:code",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "draw:object",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "draw:archive",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "draw:may-script",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+72: CHOICE
+73: REF 'common-draw-data-attlist',
+74: SEQUENCE
+75: ATTRIBUTE "xlink:type",
+76: VALUE 'simple',
+75: ATTRIBUTE "xlink:href",
+76: REF 'anyIRI',
+77: DATA 'anyURI',
+75: CHOICE
+76: ATTRIBUTE "xlink:show",
+77: VALUE 'embed',
+76: EPSILON
+75: CHOICE
+76: ATTRIBUTE "xlink:actuate",
+77: VALUE 'onLoad',
+76: EPSILON
+73: EPSILON
+72: CHOICE
+73: ONEOREMORE
+74: REF 'draw-param',
+75: ELEMENT "draw:param",
+76: REF 'draw-param-attlist',
+77: INTERLEAVE
+78: CHOICE
+79: ATTRIBUTE "draw:name",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+78: CHOICE
+79: ATTRIBUTE "draw:value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+73: EPSILON
+69: REF 'draw-floating-frame',
+70: ELEMENT "draw:floating-frame",
+71: SEQUENCE
+72: REF 'draw-floating-frame-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:frame-name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+72: REF 'common-draw-data-attlist',
+73: SEQUENCE
+74: ATTRIBUTE "xlink:type",
+75: VALUE 'simple',
+74: ATTRIBUTE "xlink:href",
+75: REF 'anyIRI',
+76: DATA 'anyURI',
+74: CHOICE
+75: ATTRIBUTE "xlink:show",
+76: VALUE 'embed',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "xlink:actuate",
+76: VALUE 'onLoad',
+75: EPSILON
+69: REF 'draw-plugin',
+70: ELEMENT "draw:plugin",
+71: SEQUENCE
+72: REF 'draw-plugin-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "draw:mime-type",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+72: REF 'common-draw-data-attlist',
+73: SEQUENCE
+74: ATTRIBUTE "xlink:type",
+75: VALUE 'simple',
+74: ATTRIBUTE "xlink:href",
+75: REF 'anyIRI',
+76: DATA 'anyURI',
+74: CHOICE
+75: ATTRIBUTE "xlink:show",
+76: VALUE 'embed',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "xlink:actuate",
+76: VALUE 'onLoad',
+75: EPSILON
+72: CHOICE
+73: ONEOREMORE
+74: REF 'draw-param',
+73: EPSILON
+69: REF 'table-table',
+67: EPSILON
+66: CHOICE
+67: REF 'office-event-listeners',
+67: EPSILON
+66: CHOICE
+67: ONEOREMORE
+68: REF 'draw-glue-point',
+67: EPSILON
+66: CHOICE
+67: REF 'draw-image-map',
+68: ELEMENT "draw:image-map",
+69: CHOICE
+70: ONEOREMORE
+71: CHOICE
+72: REF 'draw-area-rectangle',
+73: ELEMENT "draw:area-rectangle",
+74: SEQUENCE
+75: REF 'common-draw-area-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: SEQUENCE
+79: ATTRIBUTE "xlink:type",
+80: VALUE 'simple',
+79: ATTRIBUTE "xlink:href",
+80: REF 'anyIRI',
+81: DATA 'anyURI',
+79: CHOICE
+80: ATTRIBUTE "office:target-frame-name",
+81: REF 'targetFrameName',
+82: CHOICE
+83: VALUE '_self',
+83: VALUE '_blank',
+83: VALUE '_parent',
+83: VALUE '_top',
+83: REF 'string',
+84: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:show",
+81: CHOICE
+82: VALUE 'new',
+82: VALUE 'replace',
+80: EPSILON
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "office:name",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "draw:nohref",
+79: VALUE 'nohref',
+78: EPSILON
+75: ATTRIBUTE "svg:x",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: ATTRIBUTE "svg:y",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: ATTRIBUTE "svg:width",
+76: REF 'length',
+77: DATA 'string',
+75: ATTRIBUTE "svg:height",
+76: REF 'length',
+77: DATA 'string',
+75: CHOICE
+76: REF 'svg-title',
+76: EPSILON
+75: CHOICE
+76: REF 'svg-desc',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+72: REF 'draw-area-circle',
+73: ELEMENT "draw:area-circle",
+74: SEQUENCE
+75: REF 'common-draw-area-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: SEQUENCE
+79: ATTRIBUTE "xlink:type",
+80: VALUE 'simple',
+79: ATTRIBUTE "xlink:href",
+80: REF 'anyIRI',
+81: DATA 'anyURI',
+79: CHOICE
+80: ATTRIBUTE "office:target-frame-name",
+81: REF 'targetFrameName',
+82: CHOICE
+83: VALUE '_self',
+83: VALUE '_blank',
+83: VALUE '_parent',
+83: VALUE '_top',
+83: REF 'string',
+84: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:show",
+81: CHOICE
+82: VALUE 'new',
+82: VALUE 'replace',
+80: EPSILON
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "office:name",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "draw:nohref",
+79: VALUE 'nohref',
+78: EPSILON
+75: ATTRIBUTE "svg:cx",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: ATTRIBUTE "svg:cy",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: ATTRIBUTE "svg:r",
+76: REF 'length',
+77: DATA 'string',
+75: CHOICE
+76: REF 'svg-title',
+76: EPSILON
+75: CHOICE
+76: REF 'svg-desc',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+72: REF 'draw-area-polygon',
+73: ELEMENT "draw:area-polygon",
+74: SEQUENCE
+75: REF 'common-draw-area-attlist',
+76: INTERLEAVE
+77: CHOICE
+78: SEQUENCE
+79: ATTRIBUTE "xlink:type",
+80: VALUE 'simple',
+79: ATTRIBUTE "xlink:href",
+80: REF 'anyIRI',
+81: DATA 'anyURI',
+79: CHOICE
+80: ATTRIBUTE "office:target-frame-name",
+81: REF 'targetFrameName',
+82: CHOICE
+83: VALUE '_self',
+83: VALUE '_blank',
+83: VALUE '_parent',
+83: VALUE '_top',
+83: REF 'string',
+84: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xlink:show",
+81: CHOICE
+82: VALUE 'new',
+82: VALUE 'replace',
+80: EPSILON
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "office:name",
+79: REF 'string',
+80: DATA 'string',
+78: EPSILON
+77: CHOICE
+78: ATTRIBUTE "draw:nohref",
+79: VALUE 'nohref',
+78: EPSILON
+75: ATTRIBUTE "svg:x",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: ATTRIBUTE "svg:y",
+76: REF 'coordinate',
+77: REF 'length',
+78: DATA 'string',
+75: ATTRIBUTE "svg:width",
+76: REF 'length',
+77: DATA 'string',
+75: ATTRIBUTE "svg:height",
+76: REF 'length',
+77: DATA 'string',
+75: REF 'common-draw-viewbox-attlist',
+76: ATTRIBUTE "svg:viewBox",
+77: LIST
+78: SEQUENCE
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+79: REF 'integer',
+80: DATA 'integer',
+75: REF 'common-draw-points-attlist',
+76: ATTRIBUTE "draw:points",
+77: REF 'points',
+78: DATA 'string',
+75: CHOICE
+76: REF 'svg-title',
+76: EPSILON
+75: CHOICE
+76: REF 'svg-desc',
+76: EPSILON
+75: CHOICE
+76: REF 'office-event-listeners',
+76: EPSILON
+70: EPSILON
+67: EPSILON
+66: CHOICE
+67: REF 'svg-title',
+67: EPSILON
+66: CHOICE
+67: REF 'svg-desc',
+67: EPSILON
+66: CHOICE
+67: REF 'draw-contour-polygon',
+68: ELEMENT "draw:contour-polygon",
+69: SEQUENCE
+70: REF 'common-contour-attlist',
+71: ATTRIBUTE "draw:recreate-on-edit",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+70: REF 'common-draw-size-attlist',
+71: SEQUENCE
+72: CHOICE
+73: ATTRIBUTE "svg:width",
+74: REF 'length',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "svg:height",
+74: REF 'length',
+75: DATA 'string',
+73: EPSILON
+70: REF 'common-draw-viewbox-attlist',
+71: ATTRIBUTE "svg:viewBox",
+72: LIST
+73: SEQUENCE
+74: REF 'integer',
+75: DATA 'integer',
+74: REF 'integer',
+75: DATA 'integer',
+74: REF 'integer',
+75: DATA 'integer',
+74: REF 'integer',
+75: DATA 'integer',
+70: REF 'common-draw-points-attlist',
+71: ATTRIBUTE "draw:points",
+72: REF 'points',
+73: DATA 'string',
+67: REF 'draw-contour-path',
+68: ELEMENT "draw:contour-path",
+69: SEQUENCE
+70: REF 'common-contour-attlist',
+71: ATTRIBUTE "draw:recreate-on-edit",
+72: REF 'boolean',
+73: CHOICE
+74: VALUE 'true',
+74: VALUE 'false',
+70: REF 'common-draw-size-attlist',
+71: SEQUENCE
+72: CHOICE
+73: ATTRIBUTE "svg:width",
+74: REF 'length',
+75: DATA 'string',
+73: EPSILON
+72: CHOICE
+73: ATTRIBUTE "svg:height",
+74: REF 'length',
+75: DATA 'string',
+73: EPSILON
+70: REF 'common-draw-viewbox-attlist',
+71: ATTRIBUTE "svg:viewBox",
+72: LIST
+73: SEQUENCE
+74: REF 'integer',
+75: DATA 'integer',
+74: REF 'integer',
+75: DATA 'integer',
+74: REF 'integer',
+75: DATA 'integer',
+74: REF 'integer',
+75: DATA 'integer',
+70: REF 'common-draw-path-data-attlist',
+71: ATTRIBUTE "svg:d",
+72: REF 'pathData',
+73: DATA 'string',
+67: EPSILON
+63: REF 'draw-measure',
+63: REF 'draw-caption',
+63: REF 'draw-connector',
+63: REF 'draw-control',
+63: REF 'dr3d-scene',
+63: REF 'draw-custom-shape',
+61: REF 'draw-a',
+58: EPSILON
+54: REF 'draw-page-thumbnail',
+54: REF 'draw-frame',
+54: REF 'draw-measure',
+54: REF 'draw-caption',
+54: REF 'draw-connector',
+54: REF 'draw-control',
+54: REF 'dr3d-scene',
+54: REF 'draw-custom-shape',
+52: REF 'draw-a',
+47: EPSILON
+46: REF 'table-columns-and-groups',
+47: ONEOREMORE
+48: CHOICE
+49: REF 'table-table-column-group',
+50: ELEMENT "table:table-column-group",
+51: SEQUENCE
+52: REF 'table-table-column-group-attlist',
+53: CHOICE
+54: ATTRIBUTE "table:display",
+55: REF 'boolean',
+56: CHOICE
+57: VALUE 'true',
+57: VALUE 'false',
+54: EPSILON
+52: REF 'table-columns-and-groups',
+53: ONEOREMORE
+54: CHOICE
+55: REF 'table-table-column-group',
+55: REF 'table-columns-no-group',
+56: CHOICE
+57: SEQUENCE
+58: REF 'table-columns',
+59: CHOICE
+60: REF 'table-table-columns',
+61: ELEMENT "table:table-columns",
+62: ONEOREMORE
+63: REF 'table-table-column',
+64: ELEMENT "table:table-column",
+65: REF 'table-table-column-attlist',
+66: INTERLEAVE
+67: CHOICE
+68: ATTRIBUTE "table:number-columns-repeated",
+69: REF 'positiveInteger',
+70: DATA 'positiveInteger',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "table:style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "table:visibility",
+69: REF 'table-visibility-value',
+70: CHOICE
+71: VALUE 'visible',
+71: VALUE 'collapse',
+71: VALUE 'filter',
+68: EPSILON
+67: CHOICE
+68: ATTRIBUTE "table:default-cell-style-name",
+69: REF 'styleNameRef',
+70: CHOICE
+71: DATA 'NCName',
+71: EPSILON
+68: EPSILON
+67: CHOICE
+68: REF 'xml-id',
+69: ATTRIBUTE "xml:id",
+70: REF 'ID',
+71: DATA 'ID',
+68: EPSILON
+60: ONEOREMORE
+61: REF 'table-table-column',
+58: CHOICE
+59: SEQUENCE
+60: REF 'table-table-header-columns',
+61: ELEMENT "table:table-header-columns",
+62: ONEOREMORE
+63: REF 'table-table-column',
+60: CHOICE
+61: REF 'table-columns',
+62: CHOICE
+63: REF 'table-table-columns',
+63: ONEOREMORE
+64: REF 'table-table-column',
+61: EPSILON
+59: EPSILON
+57: SEQUENCE
+58: REF 'table-table-header-columns',
+58: CHOICE
+59: REF 'table-columns',
+60: CHOICE
+61: REF 'table-table-columns',
+61: ONEOREMORE
+62: REF 'table-table-column',
+59: EPSILON
+49: REF 'table-columns-no-group',
+50: CHOICE
+51: SEQUENCE
+52: REF 'table-columns',
+53: CHOICE
+54: REF 'table-table-columns',
+54: ONEOREMORE
+55: REF 'table-table-column',
+52: CHOICE
+53: SEQUENCE
+54: REF 'table-table-header-columns',
+54: CHOICE
+55: REF 'table-columns',
+56: CHOICE
+57: REF 'table-table-columns',
+57: ONEOREMORE
+58: REF 'table-table-column',
+55: EPSILON
+53: EPSILON
+51: SEQUENCE
+52: REF 'table-table-header-columns',
+52: CHOICE
+53: REF 'table-columns',
+54: CHOICE
+55: REF 'table-table-columns',
+55: ONEOREMORE
+56: REF 'table-table-column',
+53: EPSILON
+46: REF 'table-rows-and-groups',
+47: ONEOREMORE
+48: CHOICE
+49: REF 'table-table-row-group',
+50: ELEMENT "table:table-row-group",
+51: SEQUENCE
+52: REF 'table-table-row-group-attlist',
+53: CHOICE
+54: ATTRIBUTE "table:display",
+55: REF 'boolean',
+56: CHOICE
+57: VALUE 'true',
+57: VALUE 'false',
+54: EPSILON
+52: REF 'table-rows-and-groups',
+53: ONEOREMORE
+54: CHOICE
+55: REF 'table-table-row-group',
+55: REF 'table-rows-no-group',
+56: CHOICE
+57: SEQUENCE
+58: REF 'table-rows',
+59: CHOICE
+60: REF 'table-table-rows',
+61: ELEMENT "table:table-rows",
+62: ONEOREMORE
+63: SEQUENCE
+64: CHOICE
+65: REF 'text-soft-page-break',
+65: EPSILON
+64: REF 'table-table-row',
+65: ELEMENT "table:table-row",
+66: SEQUENCE
+67: REF 'table-table-row-attlist',
+68: INTERLEAVE
+69: CHOICE
+70: ATTRIBUTE "table:number-rows-repeated",
+71: REF 'positiveInteger',
+72: DATA 'positiveInteger',
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "table:style-name",
+71: REF 'styleNameRef',
+72: CHOICE
+73: DATA 'NCName',
+73: EPSILON
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "table:default-cell-style-name",
+71: REF 'styleNameRef',
+72: CHOICE
+73: DATA 'NCName',
+73: EPSILON
+70: EPSILON
+69: CHOICE
+70: ATTRIBUTE "table:visibility",
+71: REF 'table-visibility-value',
+72: CHOICE
+73: VALUE 'visible',
+73: VALUE 'collapse',
+73: VALUE 'filter',
+70: EPSILON
+69: CHOICE
+70: REF 'xml-id',
+71: ATTRIBUTE "xml:id",
+72: REF 'ID',
+73: DATA 'ID',
+70: EPSILON
+67: ONEOREMORE
+68: CHOICE
+69: REF 'table-table-cell',
+70: ELEMENT "table:table-cell",
+71: SEQUENCE
+72: REF 'table-table-cell-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "table:number-columns-repeated",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:style-name",
+76: REF 'styleNameRef',
+77: CHOICE
+78: DATA 'NCName',
+78: EPSILON
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:content-validation-name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:formula",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'common-value-and-type-attlist',
+76: CHOICE
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'float',
+78: ATTRIBUTE "office:value",
+79: REF 'double',
+80: DATA 'double',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'percentage',
+78: ATTRIBUTE "office:value",
+79: REF 'double',
+80: DATA 'double',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'currency',
+78: ATTRIBUTE "office:value",
+79: REF 'double',
+80: DATA 'double',
+78: CHOICE
+79: ATTRIBUTE "office:currency",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'date',
+78: ATTRIBUTE "office:date-value",
+79: REF 'dateOrDateTime',
+80: CHOICE
+81: DATA 'date',
+81: DATA 'dateTime',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'time',
+78: ATTRIBUTE "office:time-value",
+79: REF 'duration',
+80: DATA 'duration',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'boolean',
+78: ATTRIBUTE "office:boolean-value",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'string',
+78: CHOICE
+79: ATTRIBUTE "office:string-value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:protect",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:protected",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+74: CHOICE
+75: REF 'common-in-content-meta-attlist',
+76: SEQUENCE
+77: ATTRIBUTE "xhtml:about",
+78: REF 'URIorSafeCURIE',
+79: CHOICE
+80: REF 'anyURI',
+81: DATA 'anyURI',
+80: REF 'SafeCURIE',
+81: DATA 'string',
+77: ATTRIBUTE "xhtml:property",
+78: REF 'CURIEs',
+79: LIST
+80: ONEOREMORE
+81: REF 'CURIE',
+82: DATA 'string',
+77: REF 'common-meta-literal-attlist',
+78: SEQUENCE
+79: CHOICE
+80: ATTRIBUTE "xhtml:datatype",
+81: REF 'CURIE',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xhtml:content",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+75: EPSILON
+72: REF 'table-table-cell-attlist-extra',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "table:number-columns-spanned",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:number-rows-spanned",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:number-matrix-columns-spanned",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:number-matrix-rows-spanned",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+72: REF 'table-table-cell-content',
+73: SEQUENCE
+74: CHOICE
+75: REF 'table-cell-range-source',
+76: ELEMENT "table:cell-range-source",
+77: SEQUENCE
+78: REF 'table-table-cell-range-source-attlist',
+79: INTERLEAVE
+80: ATTRIBUTE "table:name",
+81: REF 'string',
+82: DATA 'string',
+80: ATTRIBUTE "table:last-column-spanned",
+81: REF 'positiveInteger',
+82: DATA 'positiveInteger',
+80: ATTRIBUTE "table:last-row-spanned",
+81: REF 'positiveInteger',
+82: DATA 'positiveInteger',
+78: REF 'table-linked-source-attlist',
+79: INTERLEAVE
+80: ATTRIBUTE "xlink:type",
+81: VALUE 'simple',
+80: ATTRIBUTE "xlink:href",
+81: REF 'anyIRI',
+82: DATA 'anyURI',
+80: CHOICE
+81: ATTRIBUTE "xlink:actuate",
+82: VALUE 'onRequest',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "table:filter-name",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "table:filter-options",
+82: REF 'string',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "table:refresh-delay",
+82: REF 'duration',
+83: DATA 'duration',
+81: EPSILON
+75: EPSILON
+74: CHOICE
+75: REF 'office-annotation',
+76: ELEMENT "office:annotation",
+77: SEQUENCE
+78: REF 'office-annotation-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: ATTRIBUTE "office:display",
+82: REF 'boolean',
+83: CHOICE
+84: VALUE 'true',
+84: VALUE 'false',
+81: EPSILON
+80: CHOICE
+81: REF 'common-office-annotation-name-attlist',
+82: ATTRIBUTE "office:name",
+83: REF 'string',
+84: DATA 'string',
+81: EPSILON
+78: REF 'draw-caption-attlist',
+79: INTERLEAVE
+80: CHOICE
+81: SEQUENCE
+82: ATTRIBUTE "draw:caption-point-x",
+83: REF 'coordinate',
+84: REF 'length',
+85: DATA 'string',
+82: ATTRIBUTE "draw:caption-point-y",
+83: REF 'coordinate',
+84: REF 'length',
+85: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "draw:corner-radius",
+82: REF 'nonNegativeLength',
+83: DATA 'string',
+81: EPSILON
+78: REF 'common-draw-position-attlist',
+79: SEQUENCE
+80: CHOICE
+81: ATTRIBUTE "svg:x",
+82: REF 'coordinate',
+83: REF 'length',
+84: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "svg:y",
+82: REF 'coordinate',
+83: REF 'length',
+84: DATA 'string',
+81: EPSILON
+78: REF 'common-draw-size-attlist',
+79: SEQUENCE
+80: CHOICE
+81: ATTRIBUTE "svg:width",
+82: REF 'length',
+83: DATA 'string',
+81: EPSILON
+80: CHOICE
+81: ATTRIBUTE "svg:height",
+82: REF 'length',
+83: DATA 'string',
+81: EPSILON
+78: REF 'common-draw-shape-with-text-and-styles-attlist',
+79: SEQUENCE
+80: REF 'common-draw-shape-with-styles-attlist',
+81: SEQUENCE
+82: REF 'common-draw-z-index-attlist',
+83: CHOICE
+84: ATTRIBUTE "draw:z-index",
+85: REF 'nonNegativeInteger',
+86: DATA 'nonNegativeInteger',
+84: EPSILON
+82: REF 'common-draw-id-attlist',
+83: CHOICE
+84: SEQUENCE
+85: REF 'xml-id',
+86: ATTRIBUTE "xml:id",
+87: REF 'ID',
+88: DATA 'ID',
+85: CHOICE
+86: ATTRIBUTE "draw:id",
+87: REF 'NCName',
+88: DATA 'NCName',
+86: EPSILON
+84: EPSILON
+82: REF 'common-draw-layer-name-attlist',
+83: CHOICE
+84: ATTRIBUTE "draw:layer",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+82: REF 'common-draw-style-name-attlist',
+83: CHOICE
+84: SEQUENCE
+85: CHOICE
+86: ATTRIBUTE "draw:style-name",
+87: REF 'styleNameRef',
+88: CHOICE
+89: DATA 'NCName',
+89: EPSILON
+86: EPSILON
+85: CHOICE
+86: ATTRIBUTE "draw:class-names",
+87: REF 'styleNameRefs',
+88: LIST
+89: CHOICE
+90: ONEOREMORE
+91: DATA 'NCName',
+90: EPSILON
+86: EPSILON
+84: SEQUENCE
+85: CHOICE
+86: ATTRIBUTE "presentation:style-name",
+87: REF 'styleNameRef',
+88: CHOICE
+89: DATA 'NCName',
+89: EPSILON
+86: EPSILON
+85: CHOICE
+86: ATTRIBUTE "presentation:class-names",
+87: REF 'styleNameRefs',
+88: LIST
+89: CHOICE
+90: ONEOREMORE
+91: DATA 'NCName',
+90: EPSILON
+86: EPSILON
+82: REF 'common-draw-transform-attlist',
+83: CHOICE
+84: ATTRIBUTE "draw:transform",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+82: REF 'common-draw-name-attlist',
+83: CHOICE
+84: ATTRIBUTE "draw:name",
+85: REF 'string',
+86: DATA 'string',
+84: EPSILON
+82: REF 'common-text-spreadsheet-shape-attlist',
+83: INTERLEAVE
+84: CHOICE
+85: ATTRIBUTE "table:end-cell-address",
+86: REF 'cellAddress',
+87: DATA 'string',
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "table:end-x",
+86: REF 'coordinate',
+87: REF 'length',
+88: DATA 'string',
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "table:end-y",
+86: REF 'coordinate',
+87: REF 'length',
+88: DATA 'string',
+85: EPSILON
+84: CHOICE
+85: ATTRIBUTE "table:table-background",
+86: REF 'boolean',
+87: CHOICE
+88: VALUE 'true',
+88: VALUE 'false',
+85: EPSILON
+84: REF 'common-text-anchor-attlist',
+85: INTERLEAVE
+86: CHOICE
+87: ATTRIBUTE "text:anchor-type",
+88: CHOICE
+89: VALUE 'page',
+89: VALUE 'frame',
+89: VALUE 'paragraph',
+89: VALUE 'char',
+89: VALUE 'as-char',
+87: EPSILON
+86: CHOICE
+87: ATTRIBUTE "text:anchor-page-number",
+88: REF 'positiveInteger',
+89: DATA 'positiveInteger',
+87: EPSILON
+80: REF 'common-draw-text-style-name-attlist',
+81: CHOICE
+82: ATTRIBUTE "draw:text-style-name",
+83: REF 'styleNameRef',
+84: CHOICE
+85: DATA 'NCName',
+85: EPSILON
+82: EPSILON
+78: CHOICE
+79: REF 'dc-creator',
+79: EPSILON
+78: CHOICE
+79: REF 'dc-date',
+79: EPSILON
+78: CHOICE
+79: REF 'meta-date-string',
+80: ELEMENT "meta:date-string",
+81: REF 'string',
+82: DATA 'string',
+79: EPSILON
+78: CHOICE
+79: ONEOREMORE
+80: CHOICE
+81: REF 'text-p',
+81: REF 'text-list',
+79: EPSILON
+75: EPSILON
+74: CHOICE
+75: REF 'table-detective',
+76: ELEMENT "table:detective",
+77: SEQUENCE
+78: CHOICE
+79: ONEOREMORE
+80: REF 'table-highlighted-range',
+81: ELEMENT "table:highlighted-range",
+82: CHOICE
+83: REF 'table-highlighted-range-attlist',
+84: INTERLEAVE
+85: CHOICE
+86: ATTRIBUTE "table:cell-range-address",
+87: REF 'cellRangeAddress',
+88: CHOICE
+89: DATA 'string',
+89: DATA 'string',
+89: DATA 'string',
+86: EPSILON
+85: ATTRIBUTE "table:direction",
+86: CHOICE
+87: VALUE 'from-another-table',
+87: VALUE 'to-another-table',
+87: VALUE 'from-same-table',
+85: CHOICE
+86: ATTRIBUTE "table:contains-error",
+87: REF 'boolean',
+88: CHOICE
+89: VALUE 'true',
+89: VALUE 'false',
+86: EPSILON
+83: REF 'table-highlighted-range-attlist-invalid',
+84: ATTRIBUTE "table:marked-invalid",
+85: REF 'boolean',
+86: CHOICE
+87: VALUE 'true',
+87: VALUE 'false',
+79: EPSILON
+78: CHOICE
+79: ONEOREMORE
+80: REF 'table-operation',
+81: ELEMENT "table:operation",
+82: REF 'table-operation-attlist',
+83: INTERLEAVE
+84: ATTRIBUTE "table:name",
+85: CHOICE
+86: VALUE 'trace-dependents',
+86: VALUE 'remove-dependents',
+86: VALUE 'trace-precedents',
+86: VALUE 'remove-precedents',
+86: VALUE 'trace-errors',
+84: ATTRIBUTE "table:index",
+85: REF 'nonNegativeInteger',
+86: DATA 'nonNegativeInteger',
+79: EPSILON
+75: EPSILON
+74: CHOICE
+75: ONEOREMORE
+76: REF 'text-content',
+77: CHOICE
+78: REF 'text-h',
+78: REF 'text-p',
+78: REF 'text-list',
+78: REF 'text-numbered-paragraph',
+78: REF 'table-table',
+78: REF 'text-section',
+78: REF 'text-soft-page-break',
+78: REF 'text-table-of-content',
+78: REF 'text-illustration-index',
+78: REF 'text-table-index',
+78: REF 'text-object-index',
+78: REF 'text-user-index',
+78: REF 'text-alphabetical-index',
+78: REF 'text-bibliography',
+78: REF 'shape',
+79: CHOICE
+80: REF 'shape-instance',
+81: CHOICE
+82: REF 'draw-rect',
+82: REF 'draw-line',
+82: REF 'draw-polyline',
+82: REF 'draw-polygon',
+82: REF 'draw-regular-polygon',
+82: REF 'draw-path',
+82: REF 'draw-circle',
+82: REF 'draw-ellipse',
+82: REF 'draw-g',
+82: REF 'draw-page-thumbnail',
+82: REF 'draw-frame',
+82: REF 'draw-measure',
+82: REF 'draw-caption',
+82: REF 'draw-connector',
+82: REF 'draw-control',
+82: REF 'dr3d-scene',
+82: REF 'draw-custom-shape',
+80: REF 'draw-a',
+78: REF 'change-marks',
+79: CHOICE
+75: EPSILON
+69: REF 'table-covered-table-cell',
+70: ELEMENT "table:covered-table-cell",
+71: SEQUENCE
+72: REF 'table-table-cell-attlist',
+73: INTERLEAVE
+74: CHOICE
+75: ATTRIBUTE "table:number-columns-repeated",
+76: REF 'positiveInteger',
+77: DATA 'positiveInteger',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:style-name",
+76: REF 'styleNameRef',
+77: CHOICE
+78: DATA 'NCName',
+78: EPSILON
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:content-validation-name",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:formula",
+76: REF 'string',
+77: DATA 'string',
+75: EPSILON
+74: CHOICE
+75: REF 'common-value-and-type-attlist',
+76: CHOICE
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'float',
+78: ATTRIBUTE "office:value",
+79: REF 'double',
+80: DATA 'double',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'percentage',
+78: ATTRIBUTE "office:value",
+79: REF 'double',
+80: DATA 'double',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'currency',
+78: ATTRIBUTE "office:value",
+79: REF 'double',
+80: DATA 'double',
+78: CHOICE
+79: ATTRIBUTE "office:currency",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'date',
+78: ATTRIBUTE "office:date-value",
+79: REF 'dateOrDateTime',
+80: CHOICE
+81: DATA 'date',
+81: DATA 'dateTime',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'time',
+78: ATTRIBUTE "office:time-value",
+79: REF 'duration',
+80: DATA 'duration',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'boolean',
+78: ATTRIBUTE "office:boolean-value",
+79: REF 'boolean',
+80: CHOICE
+81: VALUE 'true',
+81: VALUE 'false',
+77: SEQUENCE
+78: ATTRIBUTE "office:value-type",
+79: VALUE 'string',
+78: CHOICE
+79: ATTRIBUTE "office:string-value",
+80: REF 'string',
+81: DATA 'string',
+79: EPSILON
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:protect",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+74: CHOICE
+75: ATTRIBUTE "table:protected",
+76: REF 'boolean',
+77: CHOICE
+78: VALUE 'true',
+78: VALUE 'false',
+75: EPSILON
+74: CHOICE
+75: REF 'xml-id',
+76: ATTRIBUTE "xml:id",
+77: REF 'ID',
+78: DATA 'ID',
+75: EPSILON
+74: CHOICE
+75: REF 'common-in-content-meta-attlist',
+76: SEQUENCE
+77: ATTRIBUTE "xhtml:about",
+78: REF 'URIorSafeCURIE',
+79: CHOICE
+80: REF 'anyURI',
+81: DATA 'anyURI',
+80: REF 'SafeCURIE',
+81: DATA 'string',
+77: ATTRIBUTE "xhtml:property",
+78: REF 'CURIEs',
+79: LIST
+80: ONEOREMORE
+81: REF 'CURIE',
+82: DATA 'string',
+77: REF 'common-meta-literal-attlist',
+78: SEQUENCE
+79: CHOICE
+80: ATTRIBUTE "xhtml:datatype",
+81: REF 'CURIE',
+82: DATA 'string',
+80: EPSILON
+79: CHOICE
+80: ATTRIBUTE "xhtml:content",
+81: REF 'string',
+82: DATA 'string',
+80: EPSILON
+75: EPSILON
+72: REF 'table-table-cell-content',
+73: SEQUENCE
+74: CHOICE
+75: REF 'table-cell-range-source',
+75: EPSILON
+74: CHOICE
+75: REF 'office-annotation',
+75: EPSILON
+74: CHOICE
+75: REF 'table-detective',
+75: EPSILON
+74: CHOICE
+75: ONEOREMORE
+76: REF 'text-content',
+77: CHOICE
+78: REF 'text-h',
+78: REF 'text-p',
+78: REF 'text-list',
+78: REF 'text-numbered-paragraph',
+78: REF 'table-table',
+78: REF 'text-section',
+78: REF 'text-soft-page-break',
+78: REF 'text-table-of-content',
+78: REF 'text-illustration-index',
+78: REF 'text-table-index',
+78: REF 'text-object-index',
+78: REF 'text-user-index',
+78: REF 'text-alphabetical-index',
+78: REF 'text-bibliography',
+78: REF 'shape',
+79: CHOICE
+80: REF 'shape-instance',
+81: CHOICE
+82: REF 'draw-rect',
+82: REF 'draw-line',
+82: REF 'draw-polyline',
+82: REF 'draw-polygon',
+82: REF 'draw-regular-polygon',
+82: REF 'draw-path',
+82: REF 'draw-circle',
+82: REF 'draw-ellipse',
+82: REF 'draw-g',
+82: REF 'draw-page-thumbnail',
+82: REF 'draw-frame',
+82: REF 'draw-measure',
+82: REF 'draw-caption',
+82: REF 'draw-connector',
+82: REF 'draw-control',
+82: REF 'dr3d-scene',
+82: REF 'draw-custom-shape',
+80: REF 'draw-a',
+78: REF 'change-marks',
+79: CHOICE
+75: EPSILON
+60: ONEOREMORE
+61: SEQUENCE
+62: CHOICE
+63: REF 'text-soft-page-break',
+63: EPSILON
+62: REF 'table-table-row',
+58: CHOICE
+59: SEQUENCE
+60: REF 'table-table-header-rows',
+61: ELEMENT "table:table-header-rows",
+62: ONEOREMORE
+63: SEQUENCE
+64: CHOICE
+65: REF 'text-soft-page-break',
+65: EPSILON
+64: REF 'table-table-row',
+60: CHOICE
+61: REF 'table-rows',
+62: CHOICE
+63: REF 'table-table-rows',
+63: ONEOREMORE
+64: SEQUENCE
+65: CHOICE
+66: REF 'text-soft-page-break',
+66: EPSILON
+65: REF 'table-table-row',
+61: EPSILON
+59: EPSILON
+57: SEQUENCE
+58: REF 'table-table-header-rows',
+58: CHOICE
+59: REF 'table-rows',
+60: CHOICE
+61: REF 'table-table-rows',
+61: ONEOREMORE
+62: SEQUENCE
+63: CHOICE
+64: REF 'text-soft-page-break',
+64: EPSILON
+63: REF 'table-table-row',
+59: EPSILON
+49: REF 'table-rows-no-group',
+50: CHOICE
+51: SEQUENCE
+52: REF 'table-rows',
+53: CHOICE
+54: REF 'table-table-rows',
+54: ONEOREMORE
+55: SEQUENCE
+56: CHOICE
+57: REF 'text-soft-page-break',
+57: EPSILON
+56: REF 'table-table-row',
+52: CHOICE
+53: SEQUENCE
+54: REF 'table-table-header-rows',
+54: CHOICE
+55: REF 'table-rows',
+56: CHOICE
+57: REF 'table-table-rows',
+57: ONEOREMORE
+58: SEQUENCE
+59: CHOICE
+60: REF 'text-soft-page-break',
+60: EPSILON
+59: REF 'table-table-row',
+55: EPSILON
+53: EPSILON
+51: SEQUENCE
+52: REF 'table-table-header-rows',
+52: CHOICE
+53: REF 'table-rows',
+54: CHOICE
+55: REF 'table-table-rows',
+55: ONEOREMORE
+56: SEQUENCE
+57: CHOICE
+58: REF 'text-soft-page-break',
+58: EPSILON
+57: REF 'table-table-row',
+53: EPSILON
+46: CHOICE
+47: REF 'table-named-expressions',
+48: ELEMENT "table:named-expressions",
+49: CHOICE
+50: ONEOREMORE
+51: CHOICE
+52: REF 'table-named-range',
+53: ELEMENT "table:named-range",
+54: REF 'table-named-range-attlist',
+55: SEQUENCE
+56: ATTRIBUTE "table:name",
+57: REF 'string',
+58: DATA 'string',
+56: ATTRIBUTE "table:cell-range-address",
+57: REF 'cellRangeAddress',
+58: CHOICE
+59: DATA 'string',
+59: DATA 'string',
+59: DATA 'string',
+56: CHOICE
+57: ATTRIBUTE "table:base-cell-address",
+58: REF 'cellAddress',
+59: DATA 'string',
+57: EPSILON
+56: CHOICE
+57: ATTRIBUTE "table:range-usable-as",
+58: CHOICE
+59: VALUE 'none',
+59: LIST
+60: ONEOREMORE
+61: CHOICE
+62: VALUE 'print-range',
+62: VALUE 'filter',
+62: VALUE 'repeat-row',
+62: VALUE 'repeat-column',
+57: EPSILON
+52: REF 'table-named-expression',
+53: ELEMENT "table:named-expression",
+54: REF 'table-named-expression-attlist',
+55: SEQUENCE
+56: ATTRIBUTE "table:name",
+57: REF 'string',
+58: DATA 'string',
+56: ATTRIBUTE "table:expression",
+57: REF 'string',
+58: DATA 'string',
+56: CHOICE
+57: ATTRIBUTE "table:base-cell-address",
+58: REF 'cellAddress',
+59: DATA 'string',
+57: EPSILON
+50: EPSILON
+47: EPSILON
+43: REF 'text-section',
+43: REF 'text-soft-page-break',
+43: REF 'text-table-of-content',
+43: REF 'text-illustration-index',
+43: REF 'text-table-index',
+43: REF 'text-object-index',
+43: REF 'text-user-index',
+43: REF 'text-alphabetical-index',
+43: REF 'text-bibliography',
+43: REF 'shape',
+44: CHOICE
+45: REF 'shape-instance',
+46: CHOICE
+47: REF 'draw-rect',
+47: REF 'draw-line',
+47: REF 'draw-polyline',
+47: REF 'draw-polygon',
+47: REF 'draw-regular-polygon',
+47: REF 'draw-path',
+47: REF 'draw-circle',
+47: REF 'draw-ellipse',
+47: REF 'draw-g',
+47: REF 'draw-page-thumbnail',
+47: REF 'draw-frame',
+47: REF 'draw-measure',
+47: REF 'draw-caption',
+47: REF 'draw-connector',
+47: REF 'draw-control',
+47: REF 'dr3d-scene',
+47: REF 'draw-custom-shape',
+45: REF 'draw-a',
+43: REF 'change-marks',
+44: CHOICE
+40: EPSILON
+36: ELEMENT "text:ruby",
+37: SEQUENCE
+38: CHOICE
+39: ATTRIBUTE "text:style-name",
+40: REF 'styleNameRef',
+41: CHOICE
+42: DATA 'NCName',
+42: EPSILON
+39: EPSILON
+38: ELEMENT "text:ruby-base",
+39: CHOICE
+40: ONEOREMORE
+41: REF 'paragraph-content-or-hyperlink',
+42: CHOICE
+43: REF 'paragraph-content',
+44: CHOICE
+45: STRING
+43: REF 'text-a',
+40: EPSILON
+38: ELEMENT "text:ruby-text",
+39: SEQUENCE
+40: CHOICE
+41: ATTRIBUTE "text:style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+40: STRING
+36: REF 'office-annotation',
+36: REF 'office-annotation-end',
+37: ELEMENT "office:annotation-end",
+38: REF 'office-annotation-end-attlist',
+39: REF 'common-office-annotation-name-attlist',
+40: ATTRIBUTE "office:name",
+41: REF 'string',
+42: DATA 'string',
+36: REF 'change-marks',
+37: CHOICE
+36: REF 'shape',
+37: CHOICE
+38: REF 'shape-instance',
+39: CHOICE
+40: REF 'draw-rect',
+40: REF 'draw-line',
+40: REF 'draw-polyline',
+40: REF 'draw-polygon',
+40: REF 'draw-regular-polygon',
+40: REF 'draw-path',
+40: REF 'draw-circle',
+40: REF 'draw-ellipse',
+40: REF 'draw-g',
+40: REF 'draw-page-thumbnail',
+40: REF 'draw-frame',
+40: REF 'draw-measure',
+40: REF 'draw-caption',
+40: REF 'draw-connector',
+40: REF 'draw-control',
+40: REF 'dr3d-scene',
+40: REF 'draw-custom-shape',
+38: REF 'draw-a',
+36: ELEMENT "text:date",
+37: SEQUENCE
+38: REF 'text-date-attlist',
+39: INTERLEAVE
+40: REF 'common-field-fixed-attlist',
+41: CHOICE
+42: ATTRIBUTE "text:fixed",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+42: EPSILON
+40: REF 'common-field-data-style-name-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:data-style-name",
+43: REF 'styleNameRef',
+44: CHOICE
+45: DATA 'NCName',
+45: EPSILON
+42: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:date-value",
+42: REF 'dateOrDateTime',
+43: CHOICE
+44: DATA 'date',
+44: DATA 'dateTime',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:date-adjust",
+42: REF 'duration',
+43: DATA 'duration',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:time",
+37: SEQUENCE
+38: REF 'text-time-attlist',
+39: INTERLEAVE
+40: REF 'common-field-fixed-attlist',
+41: CHOICE
+42: ATTRIBUTE "text:fixed",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+42: EPSILON
+40: REF 'common-field-data-style-name-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:data-style-name",
+43: REF 'styleNameRef',
+44: CHOICE
+45: DATA 'NCName',
+45: EPSILON
+42: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:time-value",
+42: REF 'timeOrDateTime',
+43: CHOICE
+44: DATA 'time',
+44: DATA 'dateTime',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:time-adjust",
+42: REF 'duration',
+43: DATA 'duration',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:page-number",
+37: SEQUENCE
+38: REF 'text-page-number-attlist',
+39: INTERLEAVE
+40: REF 'common-field-num-format-attlist',
+41: CHOICE
+42: REF 'common-num-format-attlist',
+43: CHOICE
+44: ATTRIBUTE "style:num-format",
+45: CHOICE
+46: VALUE '1',
+46: VALUE 'i',
+46: VALUE 'I',
+46: REF 'string',
+47: DATA 'string',
+46: EPSILON
+44: SEQUENCE
+45: ATTRIBUTE "style:num-format",
+46: CHOICE
+47: VALUE 'a',
+47: VALUE 'A',
+45: REF 'style-num-letter-sync-attlist',
+46: CHOICE
+47: ATTRIBUTE "style:num-letter-sync",
+48: REF 'boolean',
+49: CHOICE
+50: VALUE 'true',
+50: VALUE 'false',
+47: EPSILON
+44: EPSILON
+42: EPSILON
+40: REF 'common-field-fixed-attlist',
+41: CHOICE
+42: ATTRIBUTE "text:fixed",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+42: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:page-adjust",
+42: REF 'integer',
+43: DATA 'integer',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:select-page",
+42: CHOICE
+43: VALUE 'previous',
+43: VALUE 'current',
+43: VALUE 'next',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:page-continuation",
+37: SEQUENCE
+38: REF 'text-page-continuation-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:select-page",
+41: CHOICE
+42: VALUE 'previous',
+42: VALUE 'next',
+40: CHOICE
+41: ATTRIBUTE "text:string-value",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:sender-firstname",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-lastname",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-initials",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-title",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-position",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-email",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-phone-private",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-fax",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-company",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-phone-work",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-street",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-city",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-postal-code",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-country",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sender-state-or-province",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:author-name",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:author-initials",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:chapter",
+37: SEQUENCE
+38: REF 'text-chapter-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:display",
+41: CHOICE
+42: VALUE 'name',
+42: VALUE 'number',
+42: VALUE 'number-and-name',
+42: VALUE 'plain-number-and-name',
+42: VALUE 'plain-number',
+40: ATTRIBUTE "text:outline-level",
+41: REF 'nonNegativeInteger',
+42: DATA 'nonNegativeInteger',
+38: STRING
+36: ELEMENT "text:file-name",
+37: SEQUENCE
+38: REF 'text-file-name-attlist',
+39: INTERLEAVE
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'full',
+43: VALUE 'path',
+43: VALUE 'name',
+43: VALUE 'name-and-extension',
+41: EPSILON
+40: REF 'common-field-fixed-attlist',
+41: CHOICE
+42: ATTRIBUTE "text:fixed",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+42: EPSILON
+38: STRING
+36: ELEMENT "text:template-name",
+37: SEQUENCE
+38: REF 'text-template-name-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:display",
+41: CHOICE
+42: VALUE 'full',
+42: VALUE 'path',
+42: VALUE 'name',
+42: VALUE 'name-and-extension',
+42: VALUE 'area',
+42: VALUE 'title',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:sheet-name",
+37: STRING
+36: ELEMENT "text:variable-set",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-name-attlist',
+40: ATTRIBUTE "text:name",
+41: REF 'variableName',
+42: DATA 'string',
+39: REF 'common-field-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:formula",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: REF 'common-value-and-type-attlist',
+40: CHOICE
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'float',
+42: ATTRIBUTE "office:value",
+43: REF 'double',
+44: DATA 'double',
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'percentage',
+42: ATTRIBUTE "office:value",
+43: REF 'double',
+44: DATA 'double',
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'currency',
+42: ATTRIBUTE "office:value",
+43: REF 'double',
+44: DATA 'double',
+42: CHOICE
+43: ATTRIBUTE "office:currency",
+44: REF 'string',
+45: DATA 'string',
+43: EPSILON
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'date',
+42: ATTRIBUTE "office:date-value",
+43: REF 'dateOrDateTime',
+44: CHOICE
+45: DATA 'date',
+45: DATA 'dateTime',
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'time',
+42: ATTRIBUTE "office:time-value",
+43: REF 'duration',
+44: DATA 'duration',
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'boolean',
+42: ATTRIBUTE "office:boolean-value",
+43: REF 'boolean',
+44: CHOICE
+45: VALUE 'true',
+45: VALUE 'false',
+41: SEQUENCE
+42: ATTRIBUTE "office:value-type",
+43: VALUE 'string',
+42: CHOICE
+43: ATTRIBUTE "office:string-value",
+44: REF 'string',
+45: DATA 'string',
+43: EPSILON
+39: REF 'common-field-display-value-none-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'value',
+43: VALUE 'none',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:variable-get",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-name-attlist',
+40: ATTRIBUTE "text:name",
+41: REF 'variableName',
+42: DATA 'string',
+39: REF 'common-field-display-value-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'value',
+43: VALUE 'formula',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:variable-input",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-name-attlist',
+40: ATTRIBUTE "text:name",
+41: REF 'variableName',
+42: DATA 'string',
+39: REF 'common-field-description-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:description",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: REF 'common-value-type-attlist',
+40: ATTRIBUTE "office:value-type",
+41: REF 'valueType',
+42: CHOICE
+43: VALUE 'float',
+43: VALUE 'time',
+43: VALUE 'date',
+43: VALUE 'percentage',
+43: VALUE 'currency',
+43: VALUE 'boolean',
+43: VALUE 'string',
+39: REF 'common-field-display-value-none-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'value',
+43: VALUE 'none',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:user-field-get",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-name-attlist',
+40: ATTRIBUTE "text:name",
+41: REF 'variableName',
+42: DATA 'string',
+39: REF 'common-field-display-value-formula-none-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'value',
+43: VALUE 'formula',
+43: VALUE 'none',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:user-field-input",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-name-attlist',
+40: ATTRIBUTE "text:name",
+41: REF 'variableName',
+42: DATA 'string',
+39: REF 'common-field-description-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:description",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:sequence",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-name-attlist',
+40: ATTRIBUTE "text:name",
+41: REF 'variableName',
+42: DATA 'string',
+39: REF 'common-field-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:formula",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: REF 'common-field-num-format-attlist',
+40: CHOICE
+41: REF 'common-num-format-attlist',
+42: CHOICE
+43: ATTRIBUTE "style:num-format",
+44: CHOICE
+45: VALUE '1',
+45: VALUE 'i',
+45: VALUE 'I',
+45: REF 'string',
+46: DATA 'string',
+45: EPSILON
+43: SEQUENCE
+44: ATTRIBUTE "style:num-format",
+45: CHOICE
+46: VALUE 'a',
+46: VALUE 'A',
+44: REF 'style-num-letter-sync-attlist',
+45: CHOICE
+46: ATTRIBUTE "style:num-letter-sync",
+47: REF 'boolean',
+48: CHOICE
+49: VALUE 'true',
+49: VALUE 'false',
+46: EPSILON
+43: EPSILON
+41: EPSILON
+39: REF 'text-sequence-ref-name',
+40: CHOICE
+41: ATTRIBUTE "text:ref-name",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:expression",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:formula",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: CHOICE
+40: REF 'common-value-and-type-attlist',
+41: CHOICE
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'float',
+43: ATTRIBUTE "office:value",
+44: REF 'double',
+45: DATA 'double',
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'percentage',
+43: ATTRIBUTE "office:value",
+44: REF 'double',
+45: DATA 'double',
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'currency',
+43: ATTRIBUTE "office:value",
+44: REF 'double',
+45: DATA 'double',
+43: CHOICE
+44: ATTRIBUTE "office:currency",
+45: REF 'string',
+46: DATA 'string',
+44: EPSILON
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'date',
+43: ATTRIBUTE "office:date-value",
+44: REF 'dateOrDateTime',
+45: CHOICE
+46: DATA 'date',
+46: DATA 'dateTime',
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'time',
+43: ATTRIBUTE "office:time-value",
+44: REF 'duration',
+45: DATA 'duration',
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'boolean',
+43: ATTRIBUTE "office:boolean-value",
+44: REF 'boolean',
+45: CHOICE
+46: VALUE 'true',
+46: VALUE 'false',
+42: SEQUENCE
+43: ATTRIBUTE "office:value-type",
+44: VALUE 'string',
+43: CHOICE
+44: ATTRIBUTE "office:string-value",
+45: REF 'string',
+46: DATA 'string',
+44: EPSILON
+40: EPSILON
+39: REF 'common-field-display-value-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'value',
+43: VALUE 'formula',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:text-input",
+37: SEQUENCE
+38: REF 'common-field-description-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:description",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:initial-creator",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:creation-date",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:date-value",
+41: REF 'dateOrDateTime',
+42: CHOICE
+43: DATA 'date',
+43: DATA 'dateTime',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:creation-time",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:time-value",
+41: REF 'timeOrDateTime',
+42: CHOICE
+43: DATA 'time',
+43: DATA 'dateTime',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:description",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:user-defined",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: ATTRIBUTE "text:name",
+40: REF 'string',
+41: DATA 'string',
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "office:value",
+41: REF 'double',
+42: DATA 'double',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "office:date-value",
+41: REF 'dateOrDateTime',
+42: CHOICE
+43: DATA 'date',
+43: DATA 'dateTime',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "office:time-value",
+41: REF 'duration',
+42: DATA 'duration',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "office:boolean-value",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "office:string-value",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:print-time",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:time-value",
+41: REF 'time',
+42: DATA 'time',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:print-date",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:date-value",
+41: REF 'date',
+42: DATA 'date',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:printed-by",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:title",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:subject",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:keywords",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:editing-cycles",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:editing-duration",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:duration",
+41: REF 'duration',
+42: DATA 'duration',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:modification-time",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:time-value",
+41: REF 'time',
+42: DATA 'time',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:modification-date",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-fixed-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:fixed",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:date-value",
+41: REF 'date',
+42: DATA 'date',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:creator",
+37: SEQUENCE
+38: REF 'common-field-fixed-attlist',
+39: CHOICE
+40: ATTRIBUTE "text:fixed",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:page-count", "text:paragraph-count", "text:word-count", "text:character-count", "text:table-count", "text:image-count", "text:object-count",
+37: SEQUENCE
+38: REF 'common-field-num-format-attlist',
+39: CHOICE
+40: REF 'common-num-format-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:num-format",
+43: CHOICE
+44: VALUE '1',
+44: VALUE 'i',
+44: VALUE 'I',
+44: REF 'string',
+45: DATA 'string',
+44: EPSILON
+42: SEQUENCE
+43: ATTRIBUTE "style:num-format",
+44: CHOICE
+45: VALUE 'a',
+45: VALUE 'A',
+43: REF 'style-num-letter-sync-attlist',
+44: CHOICE
+45: ATTRIBUTE "style:num-letter-sync",
+46: REF 'boolean',
+47: CHOICE
+48: VALUE 'true',
+48: VALUE 'false',
+45: EPSILON
+42: EPSILON
+40: EPSILON
+38: STRING
+36: ELEMENT "text:database-display",
+37: SEQUENCE
+38: REF 'text-database-display-attlist',
+39: INTERLEAVE
+40: REF 'common-field-database-table',
+41: SEQUENCE
+42: REF 'common-field-database-table-attlist',
+43: INTERLEAVE
+44: ATTRIBUTE "text:table-name",
+45: REF 'string',
+46: DATA 'string',
+44: CHOICE
+45: ATTRIBUTE "text:table-type",
+46: CHOICE
+47: VALUE 'table',
+47: VALUE 'query',
+47: VALUE 'command',
+45: EPSILON
+42: REF 'common-field-database-name',
+43: CHOICE
+44: ATTRIBUTE "text:database-name",
+45: REF 'string',
+46: DATA 'string',
+44: EPSILON
+44: REF 'form-connection-resource',
+40: REF 'common-field-data-style-name-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:data-style-name",
+43: REF 'styleNameRef',
+44: CHOICE
+45: DATA 'NCName',
+45: EPSILON
+42: EPSILON
+40: ATTRIBUTE "text:column-name",
+41: REF 'string',
+42: DATA 'string',
+38: STRING
+36: ELEMENT "text:database-next",
+37: REF 'text-database-next-attlist',
+38: INTERLEAVE
+39: REF 'common-field-database-table',
+40: SEQUENCE
+41: REF 'common-field-database-table-attlist',
+42: INTERLEAVE
+43: ATTRIBUTE "text:table-name",
+44: REF 'string',
+45: DATA 'string',
+43: CHOICE
+44: ATTRIBUTE "text:table-type",
+45: CHOICE
+46: VALUE 'table',
+46: VALUE 'query',
+46: VALUE 'command',
+44: EPSILON
+41: REF 'common-field-database-name',
+42: CHOICE
+43: ATTRIBUTE "text:database-name",
+44: REF 'string',
+45: DATA 'string',
+43: EPSILON
+43: REF 'form-connection-resource',
+39: CHOICE
+40: ATTRIBUTE "text:condition",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+36: ELEMENT "text:database-row-select",
+37: REF 'text-database-row-select-attlist',
+38: INTERLEAVE
+39: REF 'common-field-database-table',
+40: SEQUENCE
+41: REF 'common-field-database-table-attlist',
+42: INTERLEAVE
+43: ATTRIBUTE "text:table-name",
+44: REF 'string',
+45: DATA 'string',
+43: CHOICE
+44: ATTRIBUTE "text:table-type",
+45: CHOICE
+46: VALUE 'table',
+46: VALUE 'query',
+46: VALUE 'command',
+44: EPSILON
+41: REF 'common-field-database-name',
+42: CHOICE
+43: ATTRIBUTE "text:database-name",
+44: REF 'string',
+45: DATA 'string',
+43: EPSILON
+43: REF 'form-connection-resource',
+39: CHOICE
+40: ATTRIBUTE "text:condition",
+41: REF 'string',
+42: DATA 'string',
+40: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:row-number",
+41: REF 'nonNegativeInteger',
+42: DATA 'nonNegativeInteger',
+40: EPSILON
+36: ELEMENT "text:database-row-number",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-database-table',
+40: SEQUENCE
+41: REF 'common-field-database-table-attlist',
+42: INTERLEAVE
+43: ATTRIBUTE "text:table-name",
+44: REF 'string',
+45: DATA 'string',
+43: CHOICE
+44: ATTRIBUTE "text:table-type",
+45: CHOICE
+46: VALUE 'table',
+46: VALUE 'query',
+46: VALUE 'command',
+44: EPSILON
+41: REF 'common-field-database-name',
+42: CHOICE
+43: ATTRIBUTE "text:database-name",
+44: REF 'string',
+45: DATA 'string',
+43: EPSILON
+43: REF 'form-connection-resource',
+39: REF 'common-field-num-format-attlist',
+40: CHOICE
+41: REF 'common-num-format-attlist',
+42: CHOICE
+43: ATTRIBUTE "style:num-format",
+44: CHOICE
+45: VALUE '1',
+45: VALUE 'i',
+45: VALUE 'I',
+45: REF 'string',
+46: DATA 'string',
+45: EPSILON
+43: SEQUENCE
+44: ATTRIBUTE "style:num-format",
+45: CHOICE
+46: VALUE 'a',
+46: VALUE 'A',
+44: REF 'style-num-letter-sync-attlist',
+45: CHOICE
+46: ATTRIBUTE "style:num-letter-sync",
+47: REF 'boolean',
+48: CHOICE
+49: VALUE 'true',
+49: VALUE 'false',
+46: EPSILON
+43: EPSILON
+41: EPSILON
+39: CHOICE
+40: ATTRIBUTE "text:value",
+41: REF 'nonNegativeInteger',
+42: DATA 'nonNegativeInteger',
+40: EPSILON
+38: STRING
+36: ELEMENT "text:database-name",
+37: SEQUENCE
+38: REF 'common-field-database-table',
+39: SEQUENCE
+40: REF 'common-field-database-table-attlist',
+41: INTERLEAVE
+42: ATTRIBUTE "text:table-name",
+43: REF 'string',
+44: DATA 'string',
+42: CHOICE
+43: ATTRIBUTE "text:table-type",
+44: CHOICE
+45: VALUE 'table',
+45: VALUE 'query',
+45: VALUE 'command',
+43: EPSILON
+40: REF 'common-field-database-name',
+41: CHOICE
+42: ATTRIBUTE "text:database-name",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+42: REF 'form-connection-resource',
+38: STRING
+36: ELEMENT "text:page-variable-set",
+37: SEQUENCE
+38: REF 'text-set-page-variable-attlist',
+39: INTERLEAVE
+40: CHOICE
+41: ATTRIBUTE "text:active",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:page-adjust",
+42: REF 'integer',
+43: DATA 'integer',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:page-variable-get",
+37: SEQUENCE
+38: REF 'text-get-page-variable-attlist',
+39: REF 'common-field-num-format-attlist',
+40: CHOICE
+41: REF 'common-num-format-attlist',
+42: CHOICE
+43: ATTRIBUTE "style:num-format",
+44: CHOICE
+45: VALUE '1',
+45: VALUE 'i',
+45: VALUE 'I',
+45: REF 'string',
+46: DATA 'string',
+45: EPSILON
+43: SEQUENCE
+44: ATTRIBUTE "style:num-format",
+45: CHOICE
+46: VALUE 'a',
+46: VALUE 'A',
+44: REF 'style-num-letter-sync-attlist',
+45: CHOICE
+46: ATTRIBUTE "style:num-letter-sync",
+47: REF 'boolean',
+48: CHOICE
+49: VALUE 'true',
+49: VALUE 'false',
+46: EPSILON
+43: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:placeholder",
+37: SEQUENCE
+38: REF 'text-placeholder-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:placeholder-type",
+41: CHOICE
+42: VALUE 'text',
+42: VALUE 'table',
+42: VALUE 'text-box',
+42: VALUE 'image',
+42: VALUE 'object',
+40: REF 'common-field-description-attlist',
+41: CHOICE
+42: ATTRIBUTE "text:description",
+43: REF 'string',
+44: DATA 'string',
+42: EPSILON
+38: STRING
+36: ELEMENT "text:conditional-text",
+37: SEQUENCE
+38: REF 'text-conditional-text-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:condition",
+41: REF 'string',
+42: DATA 'string',
+40: ATTRIBUTE "text:string-value-if-true",
+41: REF 'string',
+42: DATA 'string',
+40: ATTRIBUTE "text:string-value-if-false",
+41: REF 'string',
+42: DATA 'string',
+40: CHOICE
+41: ATTRIBUTE "text:current-value",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:hidden-text",
+37: SEQUENCE
+38: REF 'text-hidden-text-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:condition",
+41: REF 'string',
+42: DATA 'string',
+40: ATTRIBUTE "text:string-value",
+41: REF 'string',
+42: DATA 'string',
+40: CHOICE
+41: ATTRIBUTE "text:is-hidden",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:reference-ref", "text:bookmark-ref",
+37: INTERLEAVE
+38: REF 'text-common-ref-content',
+39: INTERLEAVE
+40: STRING
+40: CHOICE
+41: ATTRIBUTE "text:ref-name",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: REF 'text-bookmark-ref-content',
+39: CHOICE
+40: ATTRIBUTE "text:reference-format",
+41: CHOICE
+42: REF 'common-ref-format-values',
+43: CHOICE
+44: VALUE 'page',
+44: VALUE 'chapter',
+44: VALUE 'direction',
+44: VALUE 'text',
+42: VALUE 'number-no-superior',
+42: VALUE 'number-all-superior',
+42: VALUE 'number',
+40: EPSILON
+36: ELEMENT "text:note-ref",
+37: INTERLEAVE
+38: REF 'text-common-ref-content',
+39: INTERLEAVE
+40: STRING
+40: CHOICE
+41: ATTRIBUTE "text:ref-name",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: REF 'text-note-ref-content',
+39: INTERLEAVE
+40: CHOICE
+41: ATTRIBUTE "text:reference-format",
+42: REF 'common-ref-format-values',
+43: CHOICE
+44: VALUE 'page',
+44: VALUE 'chapter',
+44: VALUE 'direction',
+44: VALUE 'text',
+41: EPSILON
+40: REF 'text-note-class',
+41: ATTRIBUTE "text:note-class",
+42: CHOICE
+43: VALUE 'footnote',
+43: VALUE 'endnote',
+36: ELEMENT "text:sequence-ref",
+37: INTERLEAVE
+38: REF 'text-common-ref-content',
+39: INTERLEAVE
+40: STRING
+40: CHOICE
+41: ATTRIBUTE "text:ref-name",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+38: REF 'text-sequence-ref-content',
+39: CHOICE
+40: ATTRIBUTE "text:reference-format",
+41: CHOICE
+42: REF 'common-ref-format-values',
+43: CHOICE
+44: VALUE 'page',
+44: VALUE 'chapter',
+44: VALUE 'direction',
+44: VALUE 'text',
+42: VALUE 'category-and-value',
+42: VALUE 'caption',
+42: VALUE 'value',
+40: EPSILON
+36: ELEMENT "text:script",
+37: INTERLEAVE
+38: CHOICE
+39: SEQUENCE
+40: ATTRIBUTE "xlink:type",
+41: VALUE 'simple',
+40: ATTRIBUTE "xlink:href",
+41: REF 'anyIRI',
+42: DATA 'anyURI',
+39: STRING
+38: CHOICE
+39: ATTRIBUTE "script:language",
+40: REF 'string',
+41: DATA 'string',
+39: EPSILON
+36: ELEMENT "text:execute-macro",
+37: SEQUENCE
+38: CHOICE
+39: ATTRIBUTE "text:name",
+40: REF 'string',
+41: DATA 'string',
+39: EPSILON
+38: CHOICE
+39: REF 'office-event-listeners',
+39: EPSILON
+38: STRING
+36: ELEMENT "text:hidden-paragraph",
+37: SEQUENCE
+38: REF 'text-hidden-paragraph-attlist',
+39: INTERLEAVE
+40: ATTRIBUTE "text:condition",
+41: REF 'string',
+42: DATA 'string',
+40: CHOICE
+41: ATTRIBUTE "text:is-hidden",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+38: STRING
+36: ELEMENT "text:dde-connection",
+37: SEQUENCE
+38: ATTRIBUTE "text:connection-name",
+39: REF 'string',
+40: DATA 'string',
+38: STRING
+36: ELEMENT "text:measure",
+37: SEQUENCE
+38: ATTRIBUTE "text:kind",
+39: CHOICE
+40: VALUE 'value',
+40: VALUE 'unit',
+40: VALUE 'gap',
+38: STRING
+36: ELEMENT "text:table-formula",
+37: SEQUENCE
+38: INTERLEAVE
+39: REF 'common-field-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:formula",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: REF 'common-field-display-value-formula-attlist',
+40: CHOICE
+41: ATTRIBUTE "text:display",
+42: CHOICE
+43: VALUE 'value',
+43: VALUE 'formula',
+41: EPSILON
+39: REF 'common-field-data-style-name-attlist',
+40: CHOICE
+41: ATTRIBUTE "style:data-style-name",
+42: REF 'styleNameRef',
+43: CHOICE
+44: DATA 'NCName',
+44: EPSILON
+41: EPSILON
+38: STRING
+36: ELEMENT "text:meta-field",
+37: SEQUENCE
+38: REF 'text-meta-field-attlist',
+39: INTERLEAVE
+40: REF 'xml-id',
+41: ATTRIBUTE "xml:id",
+42: REF 'ID',
+43: DATA 'ID',
+40: REF 'common-field-data-style-name-attlist',
+41: CHOICE
+42: ATTRIBUTE "style:data-style-name",
+43: REF 'styleNameRef',
+44: CHOICE
+45: DATA 'NCName',
+45: EPSILON
+42: EPSILON
+38: CHOICE
+39: ONEOREMORE
+40: REF 'paragraph-content-or-hyperlink',
+41: CHOICE
+42: REF 'paragraph-content',
+43: CHOICE
+44: STRING
+42: REF 'text-a',
+39: EPSILON
+36: ELEMENT "text:toc-mark-start",
+37: REF 'text-toc-mark-start-attrs',
+38: SEQUENCE
+39: REF 'text-id',
+40: ATTRIBUTE "text:id",
+41: REF 'string',
+42: DATA 'string',
+39: REF 'text-outline-level',
+40: CHOICE
+41: ATTRIBUTE "text:outline-level",
+42: REF 'positiveInteger',
+43: DATA 'positiveInteger',
+41: EPSILON
+36: ELEMENT "text:toc-mark-end",
+37: REF 'text-id',
+38: ATTRIBUTE "text:id",
+39: REF 'string',
+40: DATA 'string',
+36: ELEMENT "text:toc-mark",
+37: SEQUENCE
+38: ATTRIBUTE "text:string-value",
+39: REF 'string',
+40: DATA 'string',
+38: REF 'text-outline-level',
+39: CHOICE
+40: ATTRIBUTE "text:outline-level",
+41: REF 'positiveInteger',
+42: DATA 'positiveInteger',
+40: EPSILON
+36: ELEMENT "text:user-index-mark-start",
+37: SEQUENCE
+38: REF 'text-id',
+39: ATTRIBUTE "text:id",
+40: REF 'string',
+41: DATA 'string',
+38: REF 'text-outline-level',
+39: CHOICE
+40: ATTRIBUTE "text:outline-level",
+41: REF 'positiveInteger',
+42: DATA 'positiveInteger',
+40: EPSILON
+38: REF 'text-index-name',
+39: ATTRIBUTE "text:index-name",
+40: REF 'string',
+41: DATA 'string',
+36: ELEMENT "text:user-index-mark-end",
+37: REF 'text-id',
+38: ATTRIBUTE "text:id",
+39: REF 'string',
+40: DATA 'string',
+36: ELEMENT "text:user-index-mark",
+37: SEQUENCE
+38: ATTRIBUTE "text:string-value",
+39: REF 'string',
+40: DATA 'string',
+38: REF 'text-outline-level',
+39: CHOICE
+40: ATTRIBUTE "text:outline-level",
+41: REF 'positiveInteger',
+42: DATA 'positiveInteger',
+40: EPSILON
+38: REF 'text-index-name',
+39: ATTRIBUTE "text:index-name",
+40: REF 'string',
+41: DATA 'string',
+36: ELEMENT "text:alphabetical-index-mark-start",
+37: SEQUENCE
+38: REF 'text-id',
+39: ATTRIBUTE "text:id",
+40: REF 'string',
+41: DATA 'string',
+38: REF 'text-alphabetical-index-mark-attrs',
+39: INTERLEAVE
+40: CHOICE
+41: ATTRIBUTE "text:key1",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:key2",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:string-value-phonetic",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:key1-phonetic",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:key2-phonetic",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:main-entry",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+36: ELEMENT "text:alphabetical-index-mark-end",
+37: REF 'text-id',
+38: ATTRIBUTE "text:id",
+39: REF 'string',
+40: DATA 'string',
+36: ELEMENT "text:alphabetical-index-mark",
+37: SEQUENCE
+38: ATTRIBUTE "text:string-value",
+39: REF 'string',
+40: DATA 'string',
+38: REF 'text-alphabetical-index-mark-attrs',
+39: INTERLEAVE
+40: CHOICE
+41: ATTRIBUTE "text:key1",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:key2",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:string-value-phonetic",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:key1-phonetic",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:key2-phonetic",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "text:main-entry",
+42: REF 'boolean',
+43: CHOICE
+44: VALUE 'true',
+44: VALUE 'false',
+41: EPSILON
+36: ELEMENT "text:bibliography-mark",
+37: SEQUENCE
+38: ATTRIBUTE "text:bibliography-type",
+39: REF 'text-bibliography-types',
+40: CHOICE
+41: VALUE 'article',
+41: VALUE 'book',
+41: VALUE 'booklet',
+41: VALUE 'conference',
+41: VALUE 'custom1',
+41: VALUE 'custom2',
+41: VALUE 'custom3',
+41: VALUE 'custom4',
+41: VALUE 'custom5',
+41: VALUE 'email',
+41: VALUE 'inbook',
+41: VALUE 'incollection',
+41: VALUE 'inproceedings',
+41: VALUE 'journal',
+41: VALUE 'manual',
+41: VALUE 'mastersthesis',
+41: VALUE 'misc',
+41: VALUE 'phdthesis',
+41: VALUE 'proceedings',
+41: VALUE 'techreport',
+41: VALUE 'unpublished',
+41: VALUE 'www',
+38: CHOICE
+39: ONEOREMORE
+40: ATTRIBUTE "text:identifier", "text:address", "text:annote", "text:author", "text:booktitle", "text:chapter", "text:edition", "text:editor", "text:howpublished", "text:institution", "text:journal", "text:month", "text:note", "text:number", "text:organizations", "text:pages", "text:publisher", "text:school", "text:series", "text:title", "text:report-type", "text:volume", "text:year", "text:url", "text:custom1", "text:custom2", "text:custom3", "text:custom4", "text:custom5", "text:isbn", "text:issn",
+41: REF 'string',
+42: DATA 'string',
+39: EPSILON
+38: STRING
+36: ELEMENT "presentation:header",
+37: EPSILON
+36: ELEMENT "presentation:footer",
+37: EPSILON
+36: ELEMENT "presentation:date-time",
+37: EPSILON
+34: REF 'text-a',
+31: EPSILON
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:label-position",
+27: REF 'labelPositions',
+28: CHOICE
+29: VALUE 'avoid-overlap',
+29: VALUE 'center',
+29: VALUE 'top',
+29: VALUE 'top-right',
+29: VALUE 'right',
+29: VALUE 'bottom-right',
+29: VALUE 'bottom',
+29: VALUE 'bottom-left',
+29: VALUE 'left',
+29: VALUE 'top-left',
+29: VALUE 'inside',
+29: VALUE 'outside',
+29: VALUE 'near-origin',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:label-position-negative",
+27: REF 'labelPositions',
+28: CHOICE
+29: VALUE 'avoid-overlap',
+29: VALUE 'center',
+29: VALUE 'top',
+29: VALUE 'top-right',
+29: VALUE 'right',
+29: VALUE 'bottom-right',
+29: VALUE 'bottom',
+29: VALUE 'bottom-left',
+29: VALUE 'left',
+29: VALUE 'top-left',
+29: VALUE 'inside',
+29: VALUE 'outside',
+29: VALUE 'near-origin',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:visible",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:auto-position",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:auto-size",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:mean-value",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-category",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'variance',
+28: VALUE 'standard-deviation',
+28: VALUE 'percentage',
+28: VALUE 'error-margin',
+28: VALUE 'constant',
+28: VALUE 'standard-error',
+28: VALUE 'cell-range',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-percentage",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-margin",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-lower-limit",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-upper-limit",
+27: REF 'double',
+28: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-upper-indicator",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-lower-indicator",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-lower-range",
+27: REF 'cellRangeAddressList',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:error-upper-range",
+27: REF 'cellRangeAddressList',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:series-source",
+27: CHOICE
+28: VALUE 'columns',
+28: VALUE 'rows',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:regression-type",
+27: CHOICE
+28: VALUE 'none',
+28: VALUE 'linear',
+28: VALUE 'logarithmic',
+28: VALUE 'exponential',
+28: VALUE 'power',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:axis-position",
+27: CHOICE
+28: VALUE 'start',
+28: VALUE 'end',
+28: REF 'double',
+29: DATA 'double',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:axis-label-position",
+27: CHOICE
+28: VALUE 'near-axis',
+28: VALUE 'near-axis-other-side',
+28: VALUE 'outside-start',
+28: VALUE 'outside-end',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:tick-mark-position",
+27: CHOICE
+28: VALUE 'at-labels',
+28: VALUE 'at-axis',
+28: VALUE 'at-labels-and-axis',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "chart:include-hidden-cells",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: REF 'style-chart-properties-elements',
+24: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'style-graphic-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-paragraph-properties',
+19: EPSILON
+18: CHOICE
+19: REF 'style-text-properties',
+19: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+18: ELEMENT "style:map",
+19: REF 'style-map-attlist',
+20: INTERLEAVE
+21: ATTRIBUTE "style:condition",
+22: REF 'string',
+23: DATA 'string',
+21: ATTRIBUTE "style:apply-style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: CHOICE
+22: ATTRIBUTE "style:base-cell-address",
+23: REF 'cellAddress',
+24: DATA 'string',
+22: EPSILON
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'text-list-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-number-style',
+13: ELEMENT "number:number-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+17: ELEMENT "number:text",
+18: STRING
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'any-number',
+18: CHOICE
+19: REF 'number-number',
+20: ELEMENT "number:number",
+21: SEQUENCE
+22: REF 'number-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:decimal-replacement",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:display-factor",
+26: REF 'double',
+27: DATA 'double',
+25: EPSILON
+22: REF 'common-decimal-places-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'number-embedded-text',
+25: ELEMENT "number:embedded-text",
+26: SEQUENCE
+27: REF 'number-embedded-text-attlist',
+28: ATTRIBUTE "number:position",
+29: REF 'integer',
+30: DATA 'integer',
+27: STRING
+23: EPSILON
+19: REF 'number-scientific-number',
+20: ELEMENT "number:scientific-number",
+21: SEQUENCE
+22: REF 'number-scientific-number-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:min-exponent-digits",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-decimal-places-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+19: REF 'number-fraction',
+20: ELEMENT "number:fraction",
+21: SEQUENCE
+22: REF 'number-fraction-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-numerator-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:min-denominator-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:denominator-value",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-number-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:min-integer-digits",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:grouping",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-currency-style',
+13: ELEMENT "number:currency-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-auto-reorder-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:automatic-order",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'number-and-text',
+18: SEQUENCE
+19: REF 'number-number',
+19: CHOICE
+20: REF 'number-text',
+20: EPSILON
+17: CHOICE
+18: REF 'currency-symbol-and-text',
+19: SEQUENCE
+20: REF 'number-currency-symbol',
+21: ELEMENT "number:currency-symbol",
+22: SEQUENCE
+23: REF 'number-currency-symbol-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "number:language",
+27: REF 'languageCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "number:country",
+27: REF 'countryCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "number:script",
+27: REF 'scriptCode',
+28: DATA 'token',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "number:rfc-language-tag",
+27: REF 'language',
+28: DATA 'language',
+26: EPSILON
+23: STRING
+20: CHOICE
+21: REF 'number-text',
+21: EPSILON
+18: EPSILON
+16: SEQUENCE
+17: REF 'currency-symbol-and-text',
+18: SEQUENCE
+19: REF 'number-currency-symbol',
+19: CHOICE
+20: REF 'number-text',
+20: EPSILON
+17: CHOICE
+18: REF 'number-and-text',
+19: SEQUENCE
+20: REF 'number-number',
+20: CHOICE
+21: REF 'number-text',
+21: EPSILON
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-percentage-style',
+13: ELEMENT "number:percentage-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: REF 'number-and-text',
+17: SEQUENCE
+18: REF 'number-number',
+18: CHOICE
+19: REF 'number-text',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-date-style',
+13: ELEMENT "number:date-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-auto-reorder-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:automatic-order",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: REF 'common-format-source-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:format-source",
+18: CHOICE
+19: VALUE 'fixed',
+19: VALUE 'language',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: ONEOREMORE
+16: SEQUENCE
+17: REF 'any-date',
+18: CHOICE
+19: REF 'number-day',
+20: ELEMENT "number:day",
+21: SEQUENCE
+22: REF 'number-day-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-month',
+20: ELEMENT "number:month",
+21: SEQUENCE
+22: REF 'number-month-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "number:textual",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:possessive-form",
+26: REF 'boolean',
+27: CHOICE
+28: VALUE 'true',
+28: VALUE 'false',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "number:style",
+26: CHOICE
+27: VALUE 'short',
+27: VALUE 'long',
+25: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-year',
+20: ELEMENT "number:year",
+21: SEQUENCE
+22: REF 'number-year-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-era',
+20: ELEMENT "number:era",
+21: SEQUENCE
+22: REF 'number-era-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-day-of-week',
+20: ELEMENT "number:day-of-week",
+21: SEQUENCE
+22: REF 'number-day-of-week-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-week-of-year',
+20: ELEMENT "number:week-of-year",
+21: REF 'common-calendar-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:calendar",
+24: CHOICE
+25: VALUE 'gregorian',
+25: VALUE 'gengou',
+25: VALUE 'ROC',
+25: VALUE 'hanja_yoil',
+25: VALUE 'hanja',
+25: VALUE 'hijri',
+25: VALUE 'jewish',
+25: VALUE 'buddhist',
+25: REF 'string',
+26: DATA 'string',
+23: EPSILON
+19: REF 'number-quarter',
+20: ELEMENT "number:quarter",
+21: SEQUENCE
+22: REF 'number-quarter-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+22: REF 'common-calendar-attlist',
+23: CHOICE
+24: ATTRIBUTE "number:calendar",
+25: CHOICE
+26: VALUE 'gregorian',
+26: VALUE 'gengou',
+26: VALUE 'ROC',
+26: VALUE 'hanja_yoil',
+26: VALUE 'hanja',
+26: VALUE 'hijri',
+26: VALUE 'jewish',
+26: VALUE 'buddhist',
+26: REF 'string',
+27: DATA 'string',
+24: EPSILON
+19: REF 'number-hours',
+20: ELEMENT "number:hours",
+21: REF 'number-hours-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:style",
+24: CHOICE
+25: VALUE 'short',
+25: VALUE 'long',
+23: EPSILON
+19: REF 'number-am-pm',
+20: ELEMENT "number:am-pm",
+21: EPSILON
+19: REF 'number-minutes',
+20: ELEMENT "number:minutes",
+21: REF 'number-minutes-attlist',
+22: CHOICE
+23: ATTRIBUTE "number:style",
+24: CHOICE
+25: VALUE 'short',
+25: VALUE 'long',
+23: EPSILON
+19: REF 'number-seconds',
+20: ELEMENT "number:seconds",
+21: REF 'number-seconds-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "number:style",
+25: CHOICE
+26: VALUE 'short',
+26: VALUE 'long',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "number:decimal-places",
+25: REF 'integer',
+26: DATA 'integer',
+24: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-time-style',
+13: ELEMENT "number:time-style",
+14: SEQUENCE
+15: REF 'number-time-style-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:truncate-on-overflow",
+18: REF 'boolean',
+19: CHOICE
+20: VALUE 'true',
+20: VALUE 'false',
+17: EPSILON
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: REF 'common-format-source-attlist',
+16: CHOICE
+17: ATTRIBUTE "number:format-source",
+18: CHOICE
+19: VALUE 'fixed',
+19: VALUE 'language',
+17: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: ONEOREMORE
+16: SEQUENCE
+17: REF 'any-time',
+18: CHOICE
+19: REF 'number-hours',
+19: REF 'number-am-pm',
+19: REF 'number-minutes',
+19: REF 'number-seconds',
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-boolean-style',
+13: ELEMENT "number:boolean-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: SEQUENCE
+17: REF 'number-boolean',
+18: ELEMENT "number:boolean",
+19: EPSILON
+17: CHOICE
+18: REF 'number-text',
+18: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-text-style',
+13: ELEMENT "number:text-style",
+14: SEQUENCE
+15: REF 'common-data-style-attlist',
+16: INTERLEAVE
+17: ATTRIBUTE "style:name",
+18: REF 'styleName',
+19: DATA 'NCName',
+17: CHOICE
+18: ATTRIBUTE "style:display-name",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:language",
+19: REF 'languageCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:script",
+19: REF 'scriptCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:rfc-language-tag",
+19: REF 'language',
+20: DATA 'language',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:title",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "style:volatile",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-format",
+19: REF 'string',
+20: DATA 'string',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-language",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-country",
+19: REF 'countryCode',
+20: DATA 'token',
+18: EPSILON
+17: CHOICE
+18: ATTRIBUTE "number:transliteration-style",
+19: CHOICE
+20: VALUE 'short',
+20: VALUE 'medium',
+20: VALUE 'long',
+18: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'number-text',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: SEQUENCE
+18: REF 'number-text-content',
+19: ELEMENT "number:text-content",
+20: EPSILON
+18: CHOICE
+19: REF 'number-text',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'style-map',
+16: EPSILON
+11: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-default-style',
+11: ELEMENT "style:default-style",
+12: REF 'style-style-content',
+13: CHOICE
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'text',
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'paragraph',
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'section',
+15: CHOICE
+16: REF 'style-section-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'ruby',
+15: CHOICE
+16: REF 'style-ruby-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table',
+15: CHOICE
+16: REF 'style-table-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-column',
+15: CHOICE
+16: REF 'style-table-column-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-row',
+15: CHOICE
+16: REF 'style-table-row-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'table-cell',
+15: CHOICE
+16: REF 'style-table-cell-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: CHOICE
+17: VALUE 'graphic',
+17: VALUE 'presentation',
+15: CHOICE
+16: REF 'style-graphic-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'drawing-page',
+15: CHOICE
+16: REF 'style-drawing-page-properties',
+16: EPSILON
+14: SEQUENCE
+15: ATTRIBUTE "style:family",
+16: VALUE 'chart',
+15: CHOICE
+16: REF 'style-chart-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-graphic-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-paragraph-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-text-properties',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'style-default-page-layout',
+10: ELEMENT "style:default-page-layout",
+11: REF 'style-page-layout-content',
+12: SEQUENCE
+13: CHOICE
+14: REF 'style-page-layout-properties',
+15: ELEMENT "style:page-layout-properties",
+16: REF 'style-page-layout-properties-content-strict',
+17: SEQUENCE
+18: REF 'style-page-layout-properties-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "fo:page-width",
+22: REF 'length',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "fo:page-height",
+22: REF 'length',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: REF 'common-num-format-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:num-format",
+24: CHOICE
+25: VALUE '1',
+25: VALUE 'i',
+25: VALUE 'I',
+25: REF 'string',
+26: DATA 'string',
+25: EPSILON
+23: SEQUENCE
+24: ATTRIBUTE "style:num-format",
+25: CHOICE
+26: VALUE 'a',
+26: VALUE 'A',
+24: REF 'style-num-letter-sync-attlist',
+25: CHOICE
+26: ATTRIBUTE "style:num-letter-sync",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: EPSILON
+21: EPSILON
+20: REF 'common-num-format-prefix-suffix-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "style:num-prefix",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:num-suffix",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:paper-tray-name",
+22: CHOICE
+23: VALUE 'default',
+23: REF 'string',
+24: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:print-orientation",
+22: CHOICE
+23: VALUE 'portrait',
+23: VALUE 'landscape',
+21: EPSILON
+20: REF 'common-horizontal-margin-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "fo:margin-left",
+24: CHOICE
+25: REF 'length',
+26: DATA 'string',
+25: REF 'percent',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:margin-right",
+24: CHOICE
+25: REF 'length',
+26: DATA 'string',
+25: REF 'percent',
+26: DATA 'string',
+23: EPSILON
+20: REF 'common-vertical-margin-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "fo:margin-top",
+24: CHOICE
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+25: REF 'percent',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:margin-bottom",
+24: CHOICE
+25: REF 'nonNegativeLength',
+26: DATA 'string',
+25: REF 'percent',
+26: DATA 'string',
+23: EPSILON
+20: REF 'common-margin-attlist',
+21: CHOICE
+22: ATTRIBUTE "fo:margin",
+23: CHOICE
+24: REF 'nonNegativeLength',
+25: DATA 'string',
+24: REF 'percent',
+25: DATA 'string',
+22: EPSILON
+20: REF 'common-border-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "fo:border",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:border-top",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:border-bottom",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:border-left",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:border-right",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+20: REF 'common-border-line-width-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "style:border-line-width",
+24: REF 'borderWidths',
+25: LIST
+26: SEQUENCE
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:border-line-width-top",
+24: REF 'borderWidths',
+25: LIST
+26: SEQUENCE
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:border-line-width-bottom",
+24: REF 'borderWidths',
+25: LIST
+26: SEQUENCE
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:border-line-width-left",
+24: REF 'borderWidths',
+25: LIST
+26: SEQUENCE
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "style:border-line-width-right",
+24: REF 'borderWidths',
+25: LIST
+26: SEQUENCE
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+27: REF 'positiveLength',
+28: DATA 'string',
+23: EPSILON
+20: REF 'common-padding-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "fo:padding",
+24: REF 'nonNegativeLength',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:padding-top",
+24: REF 'nonNegativeLength',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:padding-bottom",
+24: REF 'nonNegativeLength',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:padding-left",
+24: REF 'nonNegativeLength',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "fo:padding-right",
+24: REF 'nonNegativeLength',
+25: DATA 'string',
+23: EPSILON
+20: REF 'common-shadow-attlist',
+21: CHOICE
+22: ATTRIBUTE "style:shadow",
+23: REF 'shadowType',
+24: CHOICE
+25: VALUE 'none',
+25: REF 'string',
+26: DATA 'string',
+22: EPSILON
+20: REF 'common-background-color-attlist',
+21: CHOICE
+22: ATTRIBUTE "fo:background-color",
+23: CHOICE
+24: VALUE 'transparent',
+24: REF 'color',
+25: DATA 'string',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:register-truth-ref-style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:print",
+22: LIST
+23: CHOICE
+24: ONEOREMORE
+25: CHOICE
+26: VALUE 'headers',
+26: VALUE 'grid',
+26: VALUE 'annotations',
+26: VALUE 'objects',
+26: VALUE 'charts',
+26: VALUE 'drawings',
+26: VALUE 'formulas',
+26: VALUE 'zero-values',
+24: EPSILON
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:print-page-order",
+22: CHOICE
+23: VALUE 'ttb',
+23: VALUE 'ltr',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:first-page-number",
+22: CHOICE
+23: REF 'positiveInteger',
+24: DATA 'positiveInteger',
+23: VALUE 'continue',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:scale-to",
+22: REF 'percent',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:scale-to-pages",
+22: REF 'positiveInteger',
+23: DATA 'positiveInteger',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:table-centering",
+22: CHOICE
+23: VALUE 'horizontal',
+23: VALUE 'vertical',
+23: VALUE 'both',
+23: VALUE 'none',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:footnote-max-height",
+22: REF 'length',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-writing-mode-attlist',
+21: CHOICE
+22: ATTRIBUTE "style:writing-mode",
+23: CHOICE
+24: VALUE 'lr-tb',
+24: VALUE 'rl-tb',
+24: VALUE 'tb-rl',
+24: VALUE 'tb-lr',
+24: VALUE 'lr',
+24: VALUE 'rl',
+24: VALUE 'tb',
+24: VALUE 'page',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-mode",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'line',
+23: VALUE 'both',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-standard-mode",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-base-height",
+22: REF 'length',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-ruby-height",
+22: REF 'length',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-lines",
+22: REF 'positiveInteger',
+23: DATA 'positiveInteger',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-base-width",
+22: REF 'length',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-color",
+22: REF 'color',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-ruby-below",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-print",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:layout-grid-snap-to",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+18: REF 'style-page-layout-properties-elements',
+19: INTERLEAVE
+20: REF 'style-background-image',
+21: CHOICE
+20: REF 'style-columns',
+21: CHOICE
+20: REF 'style-footnote-sep',
+21: CHOICE
+22: ELEMENT "style:footnote-sep",
+23: REF 'style-footnote-sep-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "style:width",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:rel-width",
+27: REF 'percent',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:color",
+27: REF 'color',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:line-style",
+27: REF 'lineStyle',
+28: CHOICE
+29: VALUE 'none',
+29: VALUE 'solid',
+29: VALUE 'dotted',
+29: VALUE 'dash',
+29: VALUE 'long-dash',
+29: VALUE 'dot-dash',
+29: VALUE 'dot-dot-dash',
+29: VALUE 'wave',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:adjustment",
+27: CHOICE
+28: VALUE 'left',
+28: VALUE 'center',
+28: VALUE 'right',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:distance-before-sep",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:distance-after-sep",
+27: REF 'length',
+28: DATA 'string',
+26: EPSILON
+22: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'style-header-style',
+15: ELEMENT "style:header-style",
+16: CHOICE
+17: REF 'style-header-footer-properties',
+18: ELEMENT "style:header-footer-properties",
+19: REF 'style-header-footer-properties-content-strict',
+20: SEQUENCE
+21: REF 'style-header-footer-properties-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "svg:height",
+25: REF 'length',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "fo:min-height",
+25: REF 'length',
+26: DATA 'string',
+24: EPSILON
+23: REF 'common-horizontal-margin-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "fo:margin-left",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:margin-right",
+27: CHOICE
+28: REF 'length',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+23: REF 'common-vertical-margin-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "fo:margin-top",
+27: CHOICE
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:margin-bottom",
+27: CHOICE
+28: REF 'nonNegativeLength',
+29: DATA 'string',
+28: REF 'percent',
+29: DATA 'string',
+26: EPSILON
+23: REF 'common-margin-attlist',
+24: CHOICE
+25: ATTRIBUTE "fo:margin",
+26: CHOICE
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+27: REF 'percent',
+28: DATA 'string',
+25: EPSILON
+23: REF 'common-border-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "fo:border",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:border-top",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:border-bottom",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:border-left",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:border-right",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+23: REF 'common-border-line-width-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "style:border-line-width",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:border-line-width-top",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:border-line-width-bottom",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:border-line-width-left",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "style:border-line-width-right",
+27: REF 'borderWidths',
+28: LIST
+29: SEQUENCE
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+30: REF 'positiveLength',
+31: DATA 'string',
+26: EPSILON
+23: REF 'common-padding-attlist',
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "fo:padding",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:padding-top",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:padding-bottom",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:padding-left",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "fo:padding-right",
+27: REF 'nonNegativeLength',
+28: DATA 'string',
+26: EPSILON
+23: REF 'common-background-color-attlist',
+24: CHOICE
+25: ATTRIBUTE "fo:background-color",
+26: CHOICE
+27: VALUE 'transparent',
+27: REF 'color',
+28: DATA 'string',
+25: EPSILON
+23: REF 'common-shadow-attlist',
+24: CHOICE
+25: ATTRIBUTE "style:shadow",
+26: REF 'shadowType',
+27: CHOICE
+28: VALUE 'none',
+28: REF 'string',
+29: DATA 'string',
+25: EPSILON
+23: CHOICE
+24: ATTRIBUTE "style:dynamic-spacing",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: REF 'style-header-footer-properties-elements',
+22: REF 'style-background-image',
+23: CHOICE
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'style-footer-style',
+15: ELEMENT "style:footer-style",
+16: CHOICE
+17: REF 'style-header-footer-properties',
+17: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'text-outline-style',
+10: ELEMENT "text:outline-style",
+11: SEQUENCE
+12: REF 'text-outline-style-attr',
+13: ATTRIBUTE "style:name",
+14: REF 'styleName',
+15: DATA 'NCName',
+12: ONEOREMORE
+13: REF 'text-outline-level-style',
+14: ELEMENT "text:outline-level-style",
+15: SEQUENCE
+16: REF 'text-outline-level-style-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "text:level",
+19: REF 'positiveInteger',
+20: DATA 'positiveInteger',
+18: CHOICE
+19: ATTRIBUTE "text:style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: REF 'common-num-format-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:num-format",
+21: CHOICE
+22: VALUE '1',
+22: VALUE 'i',
+22: VALUE 'I',
+22: REF 'string',
+23: DATA 'string',
+22: EPSILON
+20: SEQUENCE
+21: ATTRIBUTE "style:num-format",
+22: CHOICE
+23: VALUE 'a',
+23: VALUE 'A',
+21: REF 'style-num-letter-sync-attlist',
+22: CHOICE
+23: ATTRIBUTE "style:num-letter-sync",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+20: EPSILON
+18: REF 'common-num-format-prefix-suffix-attlist',
+19: SEQUENCE
+20: CHOICE
+21: ATTRIBUTE "style:num-prefix",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:num-suffix",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "text:display-levels",
+20: REF 'positiveInteger',
+21: DATA 'positiveInteger',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "text:start-value",
+20: REF 'positiveInteger',
+21: DATA 'positiveInteger',
+19: EPSILON
+16: CHOICE
+17: REF 'style-list-level-properties',
+17: EPSILON
+16: CHOICE
+17: REF 'style-text-properties',
+17: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'text-notes-configuration',
+9: EPSILON
+8: CHOICE
+9: REF 'text-bibliography-configuration',
+10: ELEMENT "text:bibliography-configuration",
+11: SEQUENCE
+12: REF 'text-bibliography-configuration-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "text:prefix",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:suffix",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:numbered-entries",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:sort-by-position",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "fo:language",
+16: REF 'languageCode',
+17: DATA 'token',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "fo:country",
+16: REF 'countryCode',
+17: DATA 'token',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "fo:script",
+16: REF 'scriptCode',
+17: DATA 'token',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "style:rfc-language-tag",
+16: REF 'language',
+17: DATA 'language',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:sort-algorithm",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+12: CHOICE
+13: ONEOREMORE
+14: REF 'text-sort-key',
+15: ELEMENT "text:sort-key",
+16: REF 'text-sort-key-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "text:key",
+19: CHOICE
+20: VALUE 'address',
+20: VALUE 'annote',
+20: VALUE 'author',
+20: VALUE 'bibliography-type',
+20: VALUE 'booktitle',
+20: VALUE 'chapter',
+20: VALUE 'custom1',
+20: VALUE 'custom2',
+20: VALUE 'custom3',
+20: VALUE 'custom4',
+20: VALUE 'custom5',
+20: VALUE 'edition',
+20: VALUE 'editor',
+20: VALUE 'howpublished',
+20: VALUE 'identifier',
+20: VALUE 'institution',
+20: VALUE 'isbn',
+20: VALUE 'issn',
+20: VALUE 'journal',
+20: VALUE 'month',
+20: VALUE 'note',
+20: VALUE 'number',
+20: VALUE 'organizations',
+20: VALUE 'pages',
+20: VALUE 'publisher',
+20: VALUE 'report-type',
+20: VALUE 'school',
+20: VALUE 'series',
+20: VALUE 'title',
+20: VALUE 'url',
+20: VALUE 'volume',
+20: VALUE 'year',
+18: CHOICE
+19: ATTRIBUTE "text:sort-ascending",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'text-linenumbering-configuration',
+10: ELEMENT "text:linenumbering-configuration",
+11: SEQUENCE
+12: REF 'text-linenumbering-configuration-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "text:number-lines",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: REF 'common-num-format-attlist',
+16: CHOICE
+17: ATTRIBUTE "style:num-format",
+18: CHOICE
+19: VALUE '1',
+19: VALUE 'i',
+19: VALUE 'I',
+19: REF 'string',
+20: DATA 'string',
+19: EPSILON
+17: SEQUENCE
+18: ATTRIBUTE "style:num-format",
+19: CHOICE
+20: VALUE 'a',
+20: VALUE 'A',
+18: REF 'style-num-letter-sync-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:num-letter-sync",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+17: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:style-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:increment",
+16: REF 'nonNegativeInteger',
+17: DATA 'nonNegativeInteger',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:number-position",
+16: CHOICE
+17: VALUE 'left',
+17: VALUE 'right',
+17: VALUE 'inner',
+17: VALUE 'outer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:offset",
+16: REF 'nonNegativeLength',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:count-empty-lines",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:count-in-text-boxes",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "text:restart-on-page",
+16: REF 'boolean',
+17: CHOICE
+18: VALUE 'true',
+18: VALUE 'false',
+15: EPSILON
+12: CHOICE
+13: REF 'text-linenumbering-separator',
+14: ELEMENT "text:linenumbering-separator",
+15: SEQUENCE
+16: CHOICE
+17: ATTRIBUTE "text:increment",
+18: REF 'nonNegativeInteger',
+19: DATA 'nonNegativeInteger',
+17: EPSILON
+16: STRING
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-gradient',
+11: ELEMENT "draw:gradient",
+12: SEQUENCE
+13: REF 'common-draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:name",
+17: REF 'styleName',
+18: DATA 'NCName',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "draw:style",
+16: REF 'gradient-style',
+17: CHOICE
+18: VALUE 'linear',
+18: VALUE 'axial',
+18: VALUE 'radial',
+18: VALUE 'ellipsoid',
+18: VALUE 'square',
+18: VALUE 'rectangular',
+15: CHOICE
+16: ATTRIBUTE "draw:cx",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:cy",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:angle",
+17: REF 'angle',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:border",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+13: REF 'draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:start-color",
+17: REF 'color',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:end-color",
+17: REF 'color',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:start-intensity",
+17: REF 'zeroToHundredPercent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:end-intensity",
+17: REF 'zeroToHundredPercent',
+18: DATA 'string',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'svg-linearGradient',
+11: ELEMENT "svg:linearGradient",
+12: SEQUENCE
+13: REF 'common-svg-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "svg:gradientUnits",
+17: VALUE 'objectBoundingBox',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:gradientTransform",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:spreadMethod",
+17: CHOICE
+18: VALUE 'pad',
+18: VALUE 'reflect',
+18: VALUE 'repeat',
+16: EPSILON
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:x1",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:y1",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:x2",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:y2",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'svg-stop',
+16: ELEMENT "svg:stop",
+17: SEQUENCE
+18: ATTRIBUTE "svg:offset",
+19: CHOICE
+20: REF 'double',
+21: DATA 'double',
+20: REF 'percent',
+21: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "svg:stop-color",
+20: REF 'color',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "svg:stop-opacity",
+20: REF 'double',
+21: DATA 'double',
+19: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'svg-radialGradient',
+11: ELEMENT "svg:radialGradient",
+12: SEQUENCE
+13: REF 'common-svg-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "svg:gradientUnits",
+17: VALUE 'objectBoundingBox',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:gradientTransform",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:spreadMethod",
+17: CHOICE
+18: VALUE 'pad',
+18: VALUE 'reflect',
+18: VALUE 'repeat',
+16: EPSILON
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:cx",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:cy",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:r",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:fx",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "svg:fy",
+15: CHOICE
+16: REF 'coordinate',
+17: REF 'length',
+18: DATA 'string',
+16: REF 'percent',
+17: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'svg-stop',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-hatch',
+11: ELEMENT "draw:hatch",
+12: REF 'draw-hatch-attlist',
+13: INTERLEAVE
+14: ATTRIBUTE "draw:name",
+15: REF 'styleName',
+16: DATA 'NCName',
+14: CHOICE
+15: ATTRIBUTE "draw:display-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: ATTRIBUTE "draw:style",
+15: CHOICE
+16: VALUE 'single',
+16: VALUE 'double',
+16: VALUE 'triple',
+14: CHOICE
+15: ATTRIBUTE "draw:color",
+16: REF 'color',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:distance",
+16: REF 'length',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:rotation",
+16: REF 'angle',
+17: DATA 'string',
+15: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-fill-image',
+11: ELEMENT "draw:fill-image",
+12: SEQUENCE
+13: REF 'draw-fill-image-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:width",
+17: REF 'length',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "svg:height",
+17: REF 'length',
+18: DATA 'string',
+16: EPSILON
+13: ATTRIBUTE "xlink:type",
+14: VALUE 'simple',
+13: ATTRIBUTE "xlink:href",
+14: REF 'anyIRI',
+15: DATA 'anyURI',
+13: CHOICE
+14: ATTRIBUTE "xlink:show",
+15: VALUE 'embed',
+14: EPSILON
+13: CHOICE
+14: ATTRIBUTE "xlink:actuate",
+15: VALUE 'onLoad',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-marker',
+11: ELEMENT "draw:marker",
+12: SEQUENCE
+13: REF 'draw-marker-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "draw:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+13: REF 'common-draw-viewbox-attlist',
+14: ATTRIBUTE "svg:viewBox",
+15: LIST
+16: SEQUENCE
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+17: REF 'integer',
+18: DATA 'integer',
+13: REF 'common-draw-path-data-attlist',
+14: ATTRIBUTE "svg:d",
+15: REF 'pathData',
+16: DATA 'string',
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-stroke-dash',
+11: ELEMENT "draw:stroke-dash",
+12: REF 'draw-stroke-dash-attlist',
+13: INTERLEAVE
+14: ATTRIBUTE "draw:name",
+15: REF 'styleName',
+16: DATA 'NCName',
+14: CHOICE
+15: ATTRIBUTE "draw:display-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:style",
+16: CHOICE
+17: VALUE 'rect',
+17: VALUE 'round',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:dots1",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:dots1-length",
+16: CHOICE
+17: REF 'length',
+18: DATA 'string',
+17: REF 'percent',
+18: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:dots2",
+16: REF 'integer',
+17: DATA 'integer',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:dots2-length",
+16: CHOICE
+17: REF 'length',
+18: DATA 'string',
+17: REF 'percent',
+18: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:distance",
+16: CHOICE
+17: REF 'length',
+18: DATA 'string',
+17: REF 'percent',
+18: DATA 'string',
+15: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'draw-opacity',
+11: ELEMENT "draw:opacity",
+12: SEQUENCE
+13: REF 'common-draw-gradient-attlist',
+14: INTERLEAVE
+15: CHOICE
+16: ATTRIBUTE "draw:name",
+17: REF 'styleName',
+18: DATA 'NCName',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "draw:style",
+16: REF 'gradient-style',
+17: CHOICE
+18: VALUE 'linear',
+18: VALUE 'axial',
+18: VALUE 'radial',
+18: VALUE 'ellipsoid',
+18: VALUE 'square',
+18: VALUE 'rectangular',
+15: CHOICE
+16: ATTRIBUTE "draw:cx",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:cy",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:angle",
+17: REF 'angle',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:border",
+17: REF 'percent',
+18: DATA 'string',
+16: EPSILON
+13: REF 'draw-opacity-attlist',
+14: SEQUENCE
+15: CHOICE
+16: ATTRIBUTE "draw:start",
+17: REF 'zeroToHundredPercent',
+18: DATA 'string',
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:end",
+17: REF 'zeroToHundredPercent',
+18: DATA 'string',
+16: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-presentation-page-layout',
+11: ELEMENT "style:presentation-page-layout",
+12: SEQUENCE
+13: ATTRIBUTE "style:name",
+14: REF 'styleName',
+15: DATA 'NCName',
+13: CHOICE
+14: ATTRIBUTE "style:display-name",
+15: REF 'string',
+16: DATA 'string',
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'presentation-placeholder',
+16: ELEMENT "presentation:placeholder",
+17: SEQUENCE
+18: ATTRIBUTE "presentation:object",
+19: REF 'presentation-classes',
+20: CHOICE
+21: VALUE 'title',
+21: VALUE 'outline',
+21: VALUE 'subtitle',
+21: VALUE 'text',
+21: VALUE 'graphic',
+21: VALUE 'object',
+21: VALUE 'chart',
+21: VALUE 'table',
+21: VALUE 'orgchart',
+21: VALUE 'page',
+21: VALUE 'notes',
+21: VALUE 'handout',
+21: VALUE 'header',
+21: VALUE 'footer',
+21: VALUE 'date-time',
+21: VALUE 'page-number',
+18: ATTRIBUTE "svg:x",
+19: CHOICE
+20: REF 'coordinate',
+21: REF 'length',
+22: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:y",
+19: CHOICE
+20: REF 'coordinate',
+21: REF 'length',
+22: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:width",
+19: CHOICE
+20: REF 'length',
+21: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+18: ATTRIBUTE "svg:height",
+19: CHOICE
+20: REF 'length',
+21: DATA 'string',
+20: REF 'percent',
+21: DATA 'string',
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'table-table-template',
+11: ELEMENT "table:table-template",
+12: SEQUENCE
+13: REF 'table-table-template-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "table:name",
+16: REF 'string',
+17: DATA 'string',
+15: ATTRIBUTE "table:first-row-start-column",
+16: REF 'rowOrCol',
+17: CHOICE
+18: VALUE 'row',
+18: VALUE 'column',
+15: ATTRIBUTE "table:first-row-end-column",
+16: REF 'rowOrCol',
+17: CHOICE
+18: VALUE 'row',
+18: VALUE 'column',
+15: ATTRIBUTE "table:last-row-start-column",
+16: REF 'rowOrCol',
+17: CHOICE
+18: VALUE 'row',
+18: VALUE 'column',
+15: ATTRIBUTE "table:last-row-end-column",
+16: REF 'rowOrCol',
+17: CHOICE
+18: VALUE 'row',
+18: VALUE 'column',
+13: CHOICE
+14: REF 'table-first-row',
+15: ELEMENT "table:first-row",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-last-row',
+15: ELEMENT "table:last-row",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-first-column',
+15: ELEMENT "table:first-column",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-last-column',
+15: ELEMENT "table:last-column",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: REF 'table-body',
+14: ELEMENT "table:body",
+15: REF 'common-table-template-attlist',
+16: SEQUENCE
+17: ATTRIBUTE "table:style-name",
+18: REF 'styleNameRef',
+19: CHOICE
+20: DATA 'NCName',
+20: EPSILON
+17: CHOICE
+18: ATTRIBUTE "table:paragraph-style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: EPSILON
+13: CHOICE
+14: REF 'table-even-rows',
+15: ELEMENT "table:even-rows",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-odd-rows',
+15: ELEMENT "table:odd-rows",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-even-columns',
+15: ELEMENT "table:even-columns",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-odd-columns',
+15: ELEMENT "table:odd-columns",
+16: REF 'common-table-template-attlist',
+17: SEQUENCE
+18: ATTRIBUTE "table:style-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:paragraph-style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-background',
+15: ELEMENT "table:background",
+16: REF 'table-background-attlist',
+17: ATTRIBUTE "table:style-name",
+18: REF 'styleNameRef',
+19: CHOICE
+20: DATA 'NCName',
+20: EPSILON
+14: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-automatic-styles',
+5: CHOICE
+6: ELEMENT "office:automatic-styles",
+7: INTERLEAVE
+8: REF 'styles',
+9: INTERLEAVE
+10: CHOICE
+11: ONEOREMORE
+12: REF 'style-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'text-list-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-number-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-currency-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-percentage-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-date-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-time-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-boolean-style',
+11: EPSILON
+10: CHOICE
+11: ONEOREMORE
+12: REF 'number-text-style',
+11: EPSILON
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-page-layout',
+11: ELEMENT "style:page-layout",
+12: SEQUENCE
+13: REF 'style-page-layout-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "style:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "style:page-usage",
+17: CHOICE
+18: VALUE 'all',
+18: VALUE 'left',
+18: VALUE 'right',
+18: VALUE 'mirrored',
+16: EPSILON
+13: REF 'style-page-layout-content',
+14: SEQUENCE
+15: CHOICE
+16: REF 'style-page-layout-properties',
+16: EPSILON
+15: CHOICE
+16: REF 'style-header-style',
+16: EPSILON
+15: CHOICE
+16: REF 'style-footer-style',
+16: EPSILON
+9: EPSILON
+6: EPSILON
+4: REF 'office-master-styles',
+5: CHOICE
+6: ELEMENT "office:master-styles",
+7: INTERLEAVE
+8: CHOICE
+9: ONEOREMORE
+10: REF 'style-master-page',
+11: ELEMENT "style:master-page",
+12: SEQUENCE
+13: REF 'style-master-page-attlist',
+14: INTERLEAVE
+15: ATTRIBUTE "style:name",
+16: REF 'styleName',
+17: DATA 'NCName',
+15: CHOICE
+16: ATTRIBUTE "style:display-name",
+17: REF 'string',
+18: DATA 'string',
+16: EPSILON
+15: ATTRIBUTE "style:page-layout-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: CHOICE
+16: ATTRIBUTE "draw:style-name",
+17: REF 'styleNameRef',
+18: CHOICE
+19: DATA 'NCName',
+19: EPSILON
+16: EPSILON
+15: CHOICE
+16: ATTRIBUTE "style:next-style-name",
+17: REF 'styleNameRef',
+18: CHOICE
+19: DATA 'NCName',
+19: EPSILON
+16: EPSILON
+13: CHOICE
+14: SEQUENCE
+15: REF 'style-header',
+16: ELEMENT "style:header",
+17: SEQUENCE
+18: REF 'common-style-header-footer-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:display",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+18: REF 'header-footer-content',
+19: CHOICE
+20: SEQUENCE
+21: REF 'text-tracked-changes',
+22: CHOICE
+23: ELEMENT "text:tracked-changes",
+24: SEQUENCE
+25: REF 'text-tracked-changes-attr',
+26: CHOICE
+27: ATTRIBUTE "text:track-changes",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-changed-region',
+28: ELEMENT "text:changed-region",
+29: SEQUENCE
+30: REF 'text-changed-region-attr',
+31: SEQUENCE
+32: REF 'xml-id',
+33: ATTRIBUTE "xml:id",
+34: REF 'ID',
+35: DATA 'ID',
+32: CHOICE
+33: ATTRIBUTE "text:id",
+34: REF 'NCName',
+35: DATA 'NCName',
+33: EPSILON
+30: REF 'text-changed-region-content',
+31: CHOICE
+32: ELEMENT "text:insertion",
+33: REF 'office-change-info',
+34: ELEMENT "office:change-info",
+35: SEQUENCE
+36: REF 'dc-creator',
+36: REF 'dc-date',
+36: CHOICE
+37: ONEOREMORE
+38: REF 'text-p',
+37: EPSILON
+32: ELEMENT "text:deletion",
+33: SEQUENCE
+34: REF 'office-change-info',
+34: CHOICE
+35: ONEOREMORE
+36: REF 'text-content',
+37: CHOICE
+38: REF 'text-h',
+38: REF 'text-p',
+38: REF 'text-list',
+38: REF 'text-numbered-paragraph',
+38: REF 'table-table',
+38: REF 'text-section',
+38: REF 'text-soft-page-break',
+38: REF 'text-table-of-content',
+38: REF 'text-illustration-index',
+38: REF 'text-table-index',
+38: REF 'text-object-index',
+38: REF 'text-user-index',
+38: REF 'text-alphabetical-index',
+38: REF 'text-bibliography',
+38: REF 'shape',
+39: CHOICE
+40: REF 'shape-instance',
+41: CHOICE
+42: REF 'draw-rect',
+42: REF 'draw-line',
+42: REF 'draw-polyline',
+42: REF 'draw-polygon',
+42: REF 'draw-regular-polygon',
+42: REF 'draw-path',
+42: REF 'draw-circle',
+42: REF 'draw-ellipse',
+42: REF 'draw-g',
+42: REF 'draw-page-thumbnail',
+42: REF 'draw-frame',
+42: REF 'draw-measure',
+42: REF 'draw-caption',
+42: REF 'draw-connector',
+42: REF 'draw-control',
+42: REF 'dr3d-scene',
+42: REF 'draw-custom-shape',
+40: REF 'draw-a',
+38: REF 'change-marks',
+39: CHOICE
+35: EPSILON
+32: ELEMENT "text:format-change",
+33: REF 'office-change-info',
+26: EPSILON
+23: EPSILON
+21: REF 'text-decls',
+22: SEQUENCE
+23: CHOICE
+24: ELEMENT "text:variable-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-variable-decl',
+28: ELEMENT "text:variable-decl",
+29: SEQUENCE
+30: REF 'common-field-name-attlist',
+31: ATTRIBUTE "text:name",
+32: REF 'variableName',
+33: DATA 'string',
+30: REF 'common-value-type-attlist',
+31: ATTRIBUTE "office:value-type",
+32: REF 'valueType',
+33: CHOICE
+34: VALUE 'float',
+34: VALUE 'time',
+34: VALUE 'date',
+34: VALUE 'percentage',
+34: VALUE 'currency',
+34: VALUE 'boolean',
+34: VALUE 'string',
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:sequence-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-sequence-decl',
+28: ELEMENT "text:sequence-decl",
+29: REF 'text-sequence-decl-attlist',
+30: INTERLEAVE
+31: REF 'common-field-name-attlist',
+32: ATTRIBUTE "text:name",
+33: REF 'variableName',
+34: DATA 'string',
+31: ATTRIBUTE "text:display-outline-level",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+31: CHOICE
+32: ATTRIBUTE "text:separation-character",
+33: REF 'character',
+34: DATA 'string',
+32: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:user-field-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-user-field-decl',
+28: ELEMENT "text:user-field-decl",
+29: SEQUENCE
+30: REF 'common-field-name-attlist',
+31: ATTRIBUTE "text:name",
+32: REF 'variableName',
+33: DATA 'string',
+30: CHOICE
+31: REF 'common-field-formula-attlist',
+32: CHOICE
+33: ATTRIBUTE "text:formula",
+34: REF 'string',
+35: DATA 'string',
+33: EPSILON
+31: EPSILON
+30: REF 'common-value-and-type-attlist',
+31: CHOICE
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'float',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'percentage',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'currency',
+33: ATTRIBUTE "office:value",
+34: REF 'double',
+35: DATA 'double',
+33: CHOICE
+34: ATTRIBUTE "office:currency",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'date',
+33: ATTRIBUTE "office:date-value",
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'time',
+33: ATTRIBUTE "office:time-value",
+34: REF 'duration',
+35: DATA 'duration',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'boolean',
+33: ATTRIBUTE "office:boolean-value",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+32: SEQUENCE
+33: ATTRIBUTE "office:value-type",
+34: VALUE 'string',
+33: CHOICE
+34: ATTRIBUTE "office:string-value",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ELEMENT "text:dde-connection-decls",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-dde-connection-decl',
+28: ELEMENT "text:dde-connection-decl",
+29: SEQUENCE
+30: REF 'text-dde-connection-decl-attlist',
+31: ATTRIBUTE "office:name",
+32: REF 'string',
+33: DATA 'string',
+30: REF 'common-dde-connection-decl-attlist',
+31: INTERLEAVE
+32: ATTRIBUTE "office:dde-application",
+33: REF 'string',
+34: DATA 'string',
+32: ATTRIBUTE "office:dde-topic",
+33: REF 'string',
+34: DATA 'string',
+32: ATTRIBUTE "office:dde-item",
+33: REF 'string',
+34: DATA 'string',
+32: CHOICE
+33: ATTRIBUTE "office:automatic-update",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: REF 'text-alphabetical-index-auto-mark-file',
+25: ELEMENT "text:alphabetical-index-auto-mark-file",
+26: SEQUENCE
+27: ATTRIBUTE "xlink:type",
+28: VALUE 'simple',
+27: ATTRIBUTE "xlink:href",
+28: REF 'anyIRI',
+29: DATA 'anyURI',
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'text-h',
+24: REF 'text-p',
+24: REF 'text-list',
+24: REF 'table-table',
+24: REF 'text-section',
+24: REF 'text-table-of-content',
+24: REF 'text-illustration-index',
+24: REF 'text-table-index',
+24: REF 'text-object-index',
+24: REF 'text-user-index',
+24: REF 'text-alphabetical-index',
+24: REF 'text-bibliography',
+24: REF 'text-index-title',
+24: REF 'change-marks',
+25: CHOICE
+22: EPSILON
+20: SEQUENCE
+21: CHOICE
+22: REF 'style-region-left',
+23: ELEMENT "style:region-left",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-center',
+23: ELEMENT "style:region-center",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-right',
+23: ELEMENT "style:region-right",
+24: REF 'region-content',
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+15: CHOICE
+16: REF 'style-header-left',
+17: ELEMENT "style:header-left",
+18: SEQUENCE
+19: REF 'common-style-header-footer-attlist',
+20: CHOICE
+21: ATTRIBUTE "style:display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+19: REF 'header-footer-content',
+20: CHOICE
+21: SEQUENCE
+22: REF 'text-tracked-changes',
+23: CHOICE
+22: REF 'text-decls',
+23: SEQUENCE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+25: REF 'text-alphabetical-index-auto-mark-file',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: CHOICE
+25: REF 'text-h',
+25: REF 'text-p',
+25: REF 'text-list',
+25: REF 'table-table',
+25: REF 'text-section',
+25: REF 'text-table-of-content',
+25: REF 'text-illustration-index',
+25: REF 'text-table-index',
+25: REF 'text-object-index',
+25: REF 'text-user-index',
+25: REF 'text-alphabetical-index',
+25: REF 'text-bibliography',
+25: REF 'text-index-title',
+25: REF 'change-marks',
+26: CHOICE
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'style-region-left',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-center',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-right',
+23: EPSILON
+16: EPSILON
+14: EPSILON
+13: CHOICE
+14: SEQUENCE
+15: REF 'style-footer',
+16: ELEMENT "style:footer",
+17: SEQUENCE
+18: REF 'common-style-header-footer-attlist',
+19: CHOICE
+20: ATTRIBUTE "style:display",
+21: REF 'boolean',
+22: CHOICE
+23: VALUE 'true',
+23: VALUE 'false',
+20: EPSILON
+18: REF 'header-footer-content',
+19: CHOICE
+20: SEQUENCE
+21: REF 'text-tracked-changes',
+22: CHOICE
+21: REF 'text-decls',
+22: SEQUENCE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+23: CHOICE
+24: REF 'text-alphabetical-index-auto-mark-file',
+24: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'text-h',
+24: REF 'text-p',
+24: REF 'text-list',
+24: REF 'table-table',
+24: REF 'text-section',
+24: REF 'text-table-of-content',
+24: REF 'text-illustration-index',
+24: REF 'text-table-index',
+24: REF 'text-object-index',
+24: REF 'text-user-index',
+24: REF 'text-alphabetical-index',
+24: REF 'text-bibliography',
+24: REF 'text-index-title',
+24: REF 'change-marks',
+25: CHOICE
+22: EPSILON
+20: SEQUENCE
+21: CHOICE
+22: REF 'style-region-left',
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-center',
+22: EPSILON
+21: CHOICE
+22: REF 'style-region-right',
+22: EPSILON
+15: CHOICE
+16: REF 'style-footer-left',
+17: ELEMENT "style:footer-left",
+18: SEQUENCE
+19: REF 'common-style-header-footer-attlist',
+20: CHOICE
+21: ATTRIBUTE "style:display",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+19: REF 'header-footer-content',
+20: CHOICE
+21: SEQUENCE
+22: REF 'text-tracked-changes',
+23: CHOICE
+22: REF 'text-decls',
+23: SEQUENCE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+24: CHOICE
+25: REF 'text-alphabetical-index-auto-mark-file',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: CHOICE
+25: REF 'text-h',
+25: REF 'text-p',
+25: REF 'text-list',
+25: REF 'table-table',
+25: REF 'text-section',
+25: REF 'text-table-of-content',
+25: REF 'text-illustration-index',
+25: REF 'text-table-index',
+25: REF 'text-object-index',
+25: REF 'text-user-index',
+25: REF 'text-alphabetical-index',
+25: REF 'text-bibliography',
+25: REF 'text-index-title',
+25: REF 'change-marks',
+26: CHOICE
+23: EPSILON
+21: SEQUENCE
+22: CHOICE
+23: REF 'style-region-left',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-center',
+23: EPSILON
+22: CHOICE
+23: REF 'style-region-right',
+23: EPSILON
+16: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'draw-layer-set',
+15: ELEMENT "draw:layer-set",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'draw-layer',
+19: ELEMENT "draw:layer",
+20: SEQUENCE
+21: REF 'draw-layer-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "draw:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "draw:protected",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "draw:display",
+25: CHOICE
+26: VALUE 'always',
+26: VALUE 'screen',
+26: VALUE 'printer',
+26: VALUE 'none',
+24: EPSILON
+21: CHOICE
+22: REF 'svg-title',
+22: EPSILON
+21: CHOICE
+22: REF 'svg-desc',
+22: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'office-forms',
+15: CHOICE
+14: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'shape',
+16: CHOICE
+17: REF 'shape-instance',
+18: CHOICE
+19: REF 'draw-rect',
+19: REF 'draw-line',
+19: REF 'draw-polyline',
+19: REF 'draw-polygon',
+19: REF 'draw-regular-polygon',
+19: REF 'draw-path',
+19: REF 'draw-circle',
+19: REF 'draw-ellipse',
+19: REF 'draw-g',
+19: REF 'draw-page-thumbnail',
+19: REF 'draw-frame',
+19: REF 'draw-measure',
+19: REF 'draw-caption',
+19: REF 'draw-connector',
+19: REF 'draw-control',
+19: REF 'dr3d-scene',
+19: REF 'draw-custom-shape',
+17: REF 'draw-a',
+14: EPSILON
+13: CHOICE
+14: REF 'animation-element',
+15: CHOICE
+16: ELEMENT "anim:animate",
+17: SEQUENCE
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-named-target-attlist',
+19: ATTRIBUTE "smil:attributeName",
+20: REF 'string',
+21: DATA 'string',
+18: REF 'common-anim-values-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:values",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:formula",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-anim-set-values-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:to",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:from",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:by",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-spline-mode-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:calcMode",
+21: CHOICE
+22: VALUE 'discrete',
+22: VALUE 'linear',
+22: VALUE 'paced',
+22: VALUE 'spline',
+20: EPSILON
+18: REF 'common-spline-anim-value-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:keyTimes",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:keySplines",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+18: REF 'common-anim-add-accum-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:accumulate",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'sum',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:additive",
+22: CHOICE
+23: VALUE 'replace',
+23: VALUE 'sum',
+21: EPSILON
+16: ELEMENT "anim:set",
+17: SEQUENCE
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-named-target-attlist',
+19: ATTRIBUTE "smil:attributeName",
+20: REF 'string',
+21: DATA 'string',
+18: REF 'common-anim-set-values-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:to",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+18: REF 'common-anim-add-accum-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:accumulate",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'sum',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:additive",
+22: CHOICE
+23: VALUE 'replace',
+23: VALUE 'sum',
+21: EPSILON
+16: ELEMENT "anim:animateMotion",
+17: SEQUENCE
+18: REF 'anim-animate-motion-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "svg:path",
+22: REF 'pathData',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "svg:origin",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:calcMode",
+22: CHOICE
+23: VALUE 'discrete',
+23: VALUE 'linear',
+23: VALUE 'paced',
+23: VALUE 'spline',
+21: EPSILON
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-named-target-attlist',
+19: ATTRIBUTE "smil:attributeName",
+20: REF 'string',
+21: DATA 'string',
+18: REF 'common-anim-add-accum-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:accumulate",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'sum',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:additive",
+22: CHOICE
+23: VALUE 'replace',
+23: VALUE 'sum',
+21: EPSILON
+18: REF 'common-anim-values-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:values",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:formula",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-anim-set-values-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:to",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:from",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:by",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+18: REF 'common-spline-anim-value-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:keyTimes",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:keySplines",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+16: ELEMENT "anim:animateColor",
+17: SEQUENCE
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-named-target-attlist',
+19: ATTRIBUTE "smil:attributeName",
+20: REF 'string',
+21: DATA 'string',
+18: REF 'common-anim-add-accum-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:accumulate",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'sum',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:additive",
+22: CHOICE
+23: VALUE 'replace',
+23: VALUE 'sum',
+21: EPSILON
+18: REF 'common-anim-values-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:values",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:formula",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-anim-set-values-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:to",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:from",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:by",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-spline-mode-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:calcMode",
+21: CHOICE
+22: VALUE 'discrete',
+22: VALUE 'linear',
+22: VALUE 'paced',
+22: VALUE 'spline',
+20: EPSILON
+18: REF 'common-spline-anim-value-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:keyTimes",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:keySplines",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'anim-animate-color-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "anim:color-interpolation",
+22: CHOICE
+23: VALUE 'rgb',
+23: VALUE 'hsl',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:color-interpolation-direction",
+22: CHOICE
+23: VALUE 'clockwise',
+23: VALUE 'counter-clockwise',
+21: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+16: ELEMENT "anim:animateTransform",
+17: SEQUENCE
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-named-target-attlist',
+19: ATTRIBUTE "smil:attributeName",
+20: REF 'string',
+21: DATA 'string',
+18: REF 'common-anim-add-accum-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:accumulate",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'sum',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:additive",
+22: CHOICE
+23: VALUE 'replace',
+23: VALUE 'sum',
+21: EPSILON
+18: REF 'common-anim-values-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:values",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:formula",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-anim-set-values-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:to",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:from",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:by",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'anim-animate-transform-attlist',
+19: ATTRIBUTE "svg:type",
+20: CHOICE
+21: VALUE 'translate',
+21: VALUE 'scale',
+21: VALUE 'rotate',
+21: VALUE 'skewX',
+21: VALUE 'skewY',
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+16: ELEMENT "anim:transitionFilter",
+17: SEQUENCE
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-add-accum-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:accumulate",
+22: CHOICE
+23: VALUE 'none',
+23: VALUE 'sum',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:additive",
+22: CHOICE
+23: VALUE 'replace',
+23: VALUE 'sum',
+21: EPSILON
+18: REF 'common-anim-values-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:values",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:formula",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-anim-set-values-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:to",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:from",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:by",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-spline-mode-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:calcMode",
+21: CHOICE
+22: VALUE 'discrete',
+22: VALUE 'linear',
+22: VALUE 'paced',
+22: VALUE 'spline',
+20: EPSILON
+18: REF 'anim-transition-filter-attlist',
+19: INTERLEAVE
+20: ATTRIBUTE "smil:type",
+21: REF 'string',
+22: DATA 'string',
+20: CHOICE
+21: ATTRIBUTE "smil:subtype",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:direction",
+22: CHOICE
+23: VALUE 'forward',
+23: VALUE 'reverse',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:fadeColor",
+22: REF 'color',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:mode",
+22: CHOICE
+23: VALUE 'in',
+23: VALUE 'out',
+21: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+16: ELEMENT "anim:par",
+17: SEQUENCE
+18: REF 'common-anim-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "presentation:node-type",
+22: CHOICE
+23: VALUE 'default',
+23: VALUE 'on-click',
+23: VALUE 'with-previous',
+23: VALUE 'after-previous',
+23: VALUE 'timing-root',
+23: VALUE 'main-sequence',
+23: VALUE 'interactive-sequence',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-sub-type",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-class",
+22: CHOICE
+23: VALUE 'custom',
+23: VALUE 'entrance',
+23: VALUE 'exit',
+23: VALUE 'emphasis',
+23: VALUE 'motion-path',
+23: VALUE 'ole-action',
+23: VALUE 'media-call',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:master-element",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:group-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: SEQUENCE
+22: REF 'xml-id',
+23: ATTRIBUTE "xml:id",
+24: REF 'ID',
+25: DATA 'ID',
+22: CHOICE
+23: ATTRIBUTE "anim:id",
+24: REF 'NCName',
+25: DATA 'NCName',
+23: EPSILON
+21: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+18: REF 'common-endsync-timing-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:endsync",
+21: CHOICE
+22: VALUE 'first',
+22: VALUE 'last',
+22: VALUE 'all',
+22: VALUE 'media',
+22: REF 'IDREF',
+23: DATA 'IDREF',
+20: EPSILON
+18: CHOICE
+19: ONEOREMORE
+20: REF 'animation-element',
+21: CHOICE
+19: EPSILON
+16: ELEMENT "anim:seq",
+17: SEQUENCE
+18: REF 'common-anim-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "presentation:node-type",
+22: CHOICE
+23: VALUE 'default',
+23: VALUE 'on-click',
+23: VALUE 'with-previous',
+23: VALUE 'after-previous',
+23: VALUE 'timing-root',
+23: VALUE 'main-sequence',
+23: VALUE 'interactive-sequence',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-sub-type",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-class",
+22: CHOICE
+23: VALUE 'custom',
+23: VALUE 'entrance',
+23: VALUE 'exit',
+23: VALUE 'emphasis',
+23: VALUE 'motion-path',
+23: VALUE 'ole-action',
+23: VALUE 'media-call',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:master-element",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:group-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: SEQUENCE
+22: REF 'xml-id',
+23: ATTRIBUTE "xml:id",
+24: REF 'ID',
+25: DATA 'ID',
+22: CHOICE
+23: ATTRIBUTE "anim:id",
+24: REF 'NCName',
+25: DATA 'NCName',
+23: EPSILON
+21: EPSILON
+18: REF 'common-endsync-timing-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:endsync",
+21: CHOICE
+22: VALUE 'first',
+22: VALUE 'last',
+22: VALUE 'all',
+22: VALUE 'media',
+22: REF 'IDREF',
+23: DATA 'IDREF',
+20: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+18: CHOICE
+19: ONEOREMORE
+20: REF 'animation-element',
+21: CHOICE
+19: EPSILON
+16: ELEMENT "anim:iterate",
+17: SEQUENCE
+18: REF 'common-anim-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "presentation:node-type",
+22: CHOICE
+23: VALUE 'default',
+23: VALUE 'on-click',
+23: VALUE 'with-previous',
+23: VALUE 'after-previous',
+23: VALUE 'timing-root',
+23: VALUE 'main-sequence',
+23: VALUE 'interactive-sequence',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-sub-type",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-class",
+22: CHOICE
+23: VALUE 'custom',
+23: VALUE 'entrance',
+23: VALUE 'exit',
+23: VALUE 'emphasis',
+23: VALUE 'motion-path',
+23: VALUE 'ole-action',
+23: VALUE 'media-call',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:master-element",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:group-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: SEQUENCE
+22: REF 'xml-id',
+23: ATTRIBUTE "xml:id",
+24: REF 'ID',
+25: DATA 'ID',
+22: CHOICE
+23: ATTRIBUTE "anim:id",
+24: REF 'NCName',
+25: DATA 'NCName',
+23: EPSILON
+21: EPSILON
+18: REF 'anim-iterate-attlist',
+19: INTERLEAVE
+20: REF 'common-anim-target-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:targetElement",
+24: REF 'IDREF',
+25: DATA 'IDREF',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "anim:sub-item",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:iterate-type",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:iterate-interval",
+22: REF 'duration',
+23: DATA 'duration',
+21: EPSILON
+18: REF 'common-timing-attlist',
+19: SEQUENCE
+20: REF 'common-basic-timing-attlist',
+21: SEQUENCE
+22: REF 'common-begin-end-timing-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "smil:begin",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:end",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'common-dur-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:dur",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+22: REF 'common-repeat-timing-attlist',
+23: SEQUENCE
+24: CHOICE
+25: ATTRIBUTE "smil:repeatDur",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "smil:repeatCount",
+26: CHOICE
+27: REF 'nonNegativeDecimal',
+28: DATA 'decimal',
+27: VALUE 'indefinite',
+25: EPSILON
+22: REF 'common-restart-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restart",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'default',
+24: EPSILON
+22: REF 'common-restart-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:restartDefault",
+25: CHOICE
+26: VALUE 'never',
+26: VALUE 'always',
+26: VALUE 'whenNotActive',
+26: VALUE 'inherit',
+24: EPSILON
+22: REF 'common-fill-timing-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fill",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'auto',
+26: VALUE 'default',
+26: VALUE 'transition',
+24: EPSILON
+22: REF 'common-fill-default-attlist',
+23: CHOICE
+24: ATTRIBUTE "smil:fillDefault",
+25: CHOICE
+26: VALUE 'remove',
+26: VALUE 'freeze',
+26: VALUE 'hold',
+26: VALUE 'transition',
+26: VALUE 'auto',
+26: VALUE 'inherit',
+24: EPSILON
+20: REF 'common-time-manip-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:accelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:decelerate",
+24: REF 'zeroToOneDecimal',
+25: DATA 'decimal',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:autoReverse",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+18: REF 'common-endsync-timing-attlist',
+19: CHOICE
+20: ATTRIBUTE "smil:endsync",
+21: CHOICE
+22: VALUE 'first',
+22: VALUE 'last',
+22: VALUE 'all',
+22: VALUE 'media',
+22: REF 'IDREF',
+23: DATA 'IDREF',
+20: EPSILON
+18: CHOICE
+19: ONEOREMORE
+20: REF 'animation-element',
+21: CHOICE
+19: EPSILON
+16: ELEMENT "anim:audio",
+17: SEQUENCE
+18: REF 'common-anim-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "presentation:node-type",
+22: CHOICE
+23: VALUE 'default',
+23: VALUE 'on-click',
+23: VALUE 'with-previous',
+23: VALUE 'after-previous',
+23: VALUE 'timing-root',
+23: VALUE 'main-sequence',
+23: VALUE 'interactive-sequence',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-sub-type",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-class",
+22: CHOICE
+23: VALUE 'custom',
+23: VALUE 'entrance',
+23: VALUE 'exit',
+23: VALUE 'emphasis',
+23: VALUE 'motion-path',
+23: VALUE 'ole-action',
+23: VALUE 'media-call',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:master-element",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:group-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: SEQUENCE
+22: REF 'xml-id',
+23: ATTRIBUTE "xml:id",
+24: REF 'ID',
+25: DATA 'ID',
+22: CHOICE
+23: ATTRIBUTE "anim:id",
+24: REF 'NCName',
+25: DATA 'NCName',
+23: EPSILON
+21: EPSILON
+18: REF 'anim-audio-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "xlink:href",
+22: REF 'anyIRI',
+23: DATA 'anyURI',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:audio-level",
+22: REF 'double',
+23: DATA 'double',
+21: EPSILON
+18: REF 'common-basic-timing-attlist',
+19: SEQUENCE
+20: REF 'common-begin-end-timing-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "smil:begin",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:end",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+20: REF 'common-dur-timing-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:dur",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: REF 'common-repeat-timing-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "smil:repeatDur",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "smil:repeatCount",
+24: CHOICE
+25: REF 'nonNegativeDecimal',
+26: DATA 'decimal',
+25: VALUE 'indefinite',
+23: EPSILON
+20: REF 'common-restart-timing-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:restart",
+23: CHOICE
+24: VALUE 'never',
+24: VALUE 'always',
+24: VALUE 'whenNotActive',
+24: VALUE 'default',
+22: EPSILON
+20: REF 'common-restart-default-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:restartDefault",
+23: CHOICE
+24: VALUE 'never',
+24: VALUE 'always',
+24: VALUE 'whenNotActive',
+24: VALUE 'inherit',
+22: EPSILON
+20: REF 'common-fill-timing-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:fill",
+23: CHOICE
+24: VALUE 'remove',
+24: VALUE 'freeze',
+24: VALUE 'hold',
+24: VALUE 'auto',
+24: VALUE 'default',
+24: VALUE 'transition',
+22: EPSILON
+20: REF 'common-fill-default-attlist',
+21: CHOICE
+22: ATTRIBUTE "smil:fillDefault",
+23: CHOICE
+24: VALUE 'remove',
+24: VALUE 'freeze',
+24: VALUE 'hold',
+24: VALUE 'transition',
+24: VALUE 'auto',
+24: VALUE 'inherit',
+22: EPSILON
+16: ELEMENT "anim:command",
+17: SEQUENCE
+18: REF 'common-anim-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "presentation:node-type",
+22: CHOICE
+23: VALUE 'default',
+23: VALUE 'on-click',
+23: VALUE 'with-previous',
+23: VALUE 'after-previous',
+23: VALUE 'timing-root',
+23: VALUE 'main-sequence',
+23: VALUE 'interactive-sequence',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-sub-type",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:preset-class",
+22: CHOICE
+23: VALUE 'custom',
+23: VALUE 'entrance',
+23: VALUE 'exit',
+23: VALUE 'emphasis',
+23: VALUE 'motion-path',
+23: VALUE 'ole-action',
+23: VALUE 'media-call',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:master-element",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "presentation:group-id",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: SEQUENCE
+22: REF 'xml-id',
+23: ATTRIBUTE "xml:id",
+24: REF 'ID',
+25: DATA 'ID',
+22: CHOICE
+23: ATTRIBUTE "anim:id",
+24: REF 'NCName',
+25: DATA 'NCName',
+23: EPSILON
+21: EPSILON
+18: REF 'anim-command-attlist',
+19: ATTRIBUTE "anim:command",
+20: REF 'string',
+21: DATA 'string',
+18: REF 'common-begin-end-timing-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:begin",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "smil:end",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: REF 'common-anim-target-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "smil:targetElement",
+22: REF 'IDREF',
+23: DATA 'IDREF',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "anim:sub-item",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+18: CHOICE
+19: ONEOREMORE
+20: ELEMENT "anim:param",
+21: SEQUENCE
+22: ATTRIBUTE "anim:name",
+23: REF 'string',
+24: DATA 'string',
+22: ATTRIBUTE "anim:value",
+23: REF 'string',
+24: DATA 'string',
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'presentation-notes',
+15: ELEMENT "presentation:notes",
+16: SEQUENCE
+17: REF 'common-presentation-header-footer-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: ATTRIBUTE "presentation:use-header-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:use-footer-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "presentation:use-date-time-name",
+21: REF 'string',
+22: DATA 'string',
+20: EPSILON
+17: REF 'presentation-notes-attlist',
+18: INTERLEAVE
+19: CHOICE
+20: ATTRIBUTE "style:page-layout-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "draw:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+17: REF 'office-forms',
+18: CHOICE
+17: CHOICE
+18: ONEOREMORE
+19: REF 'shape',
+20: CHOICE
+21: REF 'shape-instance',
+22: CHOICE
+23: REF 'draw-rect',
+23: REF 'draw-line',
+23: REF 'draw-polyline',
+23: REF 'draw-polygon',
+23: REF 'draw-regular-polygon',
+23: REF 'draw-path',
+23: REF 'draw-circle',
+23: REF 'draw-ellipse',
+23: REF 'draw-g',
+23: REF 'draw-page-thumbnail',
+23: REF 'draw-frame',
+23: REF 'draw-measure',
+23: REF 'draw-caption',
+23: REF 'draw-connector',
+23: REF 'draw-control',
+23: REF 'dr3d-scene',
+23: REF 'draw-custom-shape',
+21: REF 'draw-a',
+18: EPSILON
+14: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'style-handout-master',
+10: ELEMENT "style:handout-master",
+11: SEQUENCE
+12: REF 'common-presentation-header-footer-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "presentation:use-header-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "presentation:use-footer-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+14: CHOICE
+15: ATTRIBUTE "presentation:use-date-time-name",
+16: REF 'string',
+17: DATA 'string',
+15: EPSILON
+12: REF 'style-handout-master-attlist',
+13: INTERLEAVE
+14: CHOICE
+15: ATTRIBUTE "presentation:presentation-page-layout-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+14: ATTRIBUTE "style:page-layout-name",
+15: REF 'styleNameRef',
+16: CHOICE
+17: DATA 'NCName',
+17: EPSILON
+14: CHOICE
+15: ATTRIBUTE "draw:style-name",
+16: REF 'styleNameRef',
+17: CHOICE
+18: DATA 'NCName',
+18: EPSILON
+15: EPSILON
+12: CHOICE
+13: ONEOREMORE
+14: REF 'shape',
+15: CHOICE
+16: REF 'shape-instance',
+17: CHOICE
+18: REF 'draw-rect',
+18: REF 'draw-line',
+18: REF 'draw-polyline',
+18: REF 'draw-polygon',
+18: REF 'draw-regular-polygon',
+18: REF 'draw-path',
+18: REF 'draw-circle',
+18: REF 'draw-ellipse',
+18: REF 'draw-g',
+18: REF 'draw-page-thumbnail',
+18: REF 'draw-frame',
+18: REF 'draw-measure',
+18: REF 'draw-caption',
+18: REF 'draw-connector',
+18: REF 'draw-control',
+18: REF 'dr3d-scene',
+18: REF 'draw-custom-shape',
+16: REF 'draw-a',
+13: EPSILON
+9: EPSILON
+8: CHOICE
+9: REF 'draw-layer-set',
+9: EPSILON
+6: EPSILON
+4: REF 'office-body',
+5: ELEMENT "office:body",
+6: REF 'office-body-content',
+7: CHOICE
+8: ELEMENT "office:text",
+9: SEQUENCE
+10: REF 'office-text-attlist',
+11: INTERLEAVE
+12: CHOICE
+13: ATTRIBUTE "text:global",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+12: CHOICE
+13: ATTRIBUTE "text:use-soft-page-breaks",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+10: REF 'office-text-content-prelude',
+11: SEQUENCE
+12: REF 'office-forms',
+13: CHOICE
+12: REF 'text-tracked-changes',
+13: CHOICE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+16: ELEMENT "table:calculation-settings",
+17: SEQUENCE
+18: REF 'table-calculation-setting-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:case-sensitive",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:precision-as-shown",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:search-criteria-must-apply-to-whole-cell",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:automatic-find-labels",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:use-regular-expressions",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:use-wildcards",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "table:null-year",
+22: REF 'positiveInteger',
+23: DATA 'positiveInteger',
+21: EPSILON
+18: CHOICE
+19: REF 'table-null-date',
+20: ELEMENT "table:null-date",
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "table:value-type",
+24: VALUE 'date',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:date-value",
+24: REF 'date',
+25: DATA 'date',
+23: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'table-iteration',
+20: ELEMENT "table:iteration",
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "table:status",
+24: CHOICE
+25: VALUE 'enable',
+25: VALUE 'disable',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:steps",
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "table:maximum-difference",
+24: REF 'double',
+25: DATA 'double',
+23: EPSILON
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+16: ELEMENT "table:content-validations",
+17: ONEOREMORE
+18: REF 'table-content-validation',
+19: ELEMENT "table:content-validation",
+20: SEQUENCE
+21: REF 'table-validation-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:condition",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:base-cell-address",
+25: REF 'cellAddress',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:allow-empty-cell",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:display-list",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'unsorted',
+26: VALUE 'sort-ascending',
+24: EPSILON
+21: CHOICE
+22: REF 'table-help-message',
+23: ELEMENT "table:help-message",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:title",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'table-error-message',
+23: ELEMENT "table:error-message",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:title",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:display",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "table:message-type",
+27: CHOICE
+28: VALUE 'stop',
+28: VALUE 'warning',
+28: VALUE 'information',
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'text-p',
+26: EPSILON
+22: SEQUENCE
+23: REF 'table-error-macro',
+24: ELEMENT "table:error-macro",
+25: CHOICE
+26: ATTRIBUTE "table:execute",
+27: REF 'boolean',
+28: CHOICE
+29: VALUE 'true',
+29: VALUE 'false',
+26: EPSILON
+23: REF 'office-event-listeners',
+22: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+16: ELEMENT "table:label-ranges",
+17: CHOICE
+18: ONEOREMORE
+19: REF 'table-label-range',
+20: ELEMENT "table:label-range",
+21: REF 'table-label-range-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:label-cell-range-address",
+24: REF 'cellRangeAddress',
+25: CHOICE
+26: DATA 'string',
+26: DATA 'string',
+26: DATA 'string',
+23: ATTRIBUTE "table:data-cell-range-address",
+24: REF 'cellRangeAddress',
+25: CHOICE
+26: DATA 'string',
+26: DATA 'string',
+26: DATA 'string',
+23: ATTRIBUTE "table:orientation",
+24: CHOICE
+25: VALUE 'column',
+25: VALUE 'row',
+18: EPSILON
+15: EPSILON
+10: REF 'office-text-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'text-content',
+14: CHOICE
+15: REF 'text-h',
+15: REF 'text-p',
+15: REF 'text-list',
+15: REF 'text-numbered-paragraph',
+15: REF 'table-table',
+15: REF 'text-section',
+15: REF 'text-soft-page-break',
+15: REF 'text-table-of-content',
+15: REF 'text-illustration-index',
+15: REF 'text-table-index',
+15: REF 'text-object-index',
+15: REF 'text-user-index',
+15: REF 'text-alphabetical-index',
+15: REF 'text-bibliography',
+15: REF 'shape',
+16: CHOICE
+17: REF 'shape-instance',
+18: CHOICE
+19: REF 'draw-rect',
+19: REF 'draw-line',
+19: REF 'draw-polyline',
+19: REF 'draw-polygon',
+19: REF 'draw-regular-polygon',
+19: REF 'draw-path',
+19: REF 'draw-circle',
+19: REF 'draw-ellipse',
+19: REF 'draw-g',
+19: REF 'draw-page-thumbnail',
+19: REF 'draw-frame',
+19: REF 'draw-measure',
+19: REF 'draw-caption',
+19: REF 'draw-connector',
+19: REF 'draw-control',
+19: REF 'dr3d-scene',
+19: REF 'draw-custom-shape',
+17: REF 'draw-a',
+15: REF 'change-marks',
+16: CHOICE
+12: EPSILON
+12: SEQUENCE
+13: REF 'text-page-sequence',
+14: ELEMENT "text:page-sequence",
+15: ONEOREMORE
+16: REF 'text-page',
+17: ELEMENT "text:page",
+18: REF 'text-page-attlist',
+19: ATTRIBUTE "text:master-page-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+13: CHOICE
+14: ONEOREMORE
+15: REF 'shape',
+16: CHOICE
+17: REF 'shape-instance',
+18: CHOICE
+19: REF 'draw-rect',
+19: REF 'draw-line',
+19: REF 'draw-polyline',
+19: REF 'draw-polygon',
+19: REF 'draw-regular-polygon',
+19: REF 'draw-path',
+19: REF 'draw-circle',
+19: REF 'draw-ellipse',
+19: REF 'draw-g',
+19: REF 'draw-page-thumbnail',
+19: REF 'draw-frame',
+19: REF 'draw-measure',
+19: REF 'draw-caption',
+19: REF 'draw-connector',
+19: REF 'draw-control',
+19: REF 'dr3d-scene',
+19: REF 'draw-custom-shape',
+17: REF 'draw-a',
+14: EPSILON
+10: REF 'office-text-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+15: ELEMENT "table:database-ranges",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'table-database-range',
+19: ELEMENT "table:database-range",
+20: SEQUENCE
+21: REF 'table-database-range-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "table:name",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:is-selection",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:on-update-keep-styles",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:on-update-keep-size",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:has-persistent-data",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:orientation",
+25: CHOICE
+26: VALUE 'column',
+26: VALUE 'row',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:contains-header",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:display-filter-buttons",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: ATTRIBUTE "table:target-range-address",
+24: REF 'cellRangeAddress',
+25: CHOICE
+26: DATA 'string',
+26: DATA 'string',
+26: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:refresh-delay",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: CHOICE
+22: REF 'table-database-source-sql',
+23: ELEMENT "table:database-source-sql",
+24: REF 'table-database-source-sql-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:sql-statement",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "table:parse-sql-statement",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+22: REF 'table-database-source-table',
+23: ELEMENT "table:database-source-query",
+24: REF 'table-database-source-query-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:query-name",
+27: REF 'string',
+28: DATA 'string',
+22: REF 'table-database-source-query',
+23: ELEMENT "table:database-source-table",
+24: REF 'table-database-source-table-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:database-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:database-table-name",
+27: REF 'string',
+28: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: REF 'table-filter',
+23: ELEMENT "table:filter",
+24: SEQUENCE
+25: REF 'table-filter-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:target-range-address",
+29: REF 'cellRangeAddress',
+30: CHOICE
+31: DATA 'string',
+31: DATA 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:condition-source",
+29: CHOICE
+30: VALUE 'self',
+30: VALUE 'cell-range',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:condition-source-range-address",
+29: REF 'cellRangeAddress',
+30: CHOICE
+31: DATA 'string',
+31: DATA 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:display-duplicates",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: CHOICE
+26: REF 'table-filter-condition',
+27: ELEMENT "table:filter-condition",
+28: SEQUENCE
+29: REF 'table-filter-condition-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:field-number",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+31: ATTRIBUTE "table:value",
+32: CHOICE
+33: REF 'string',
+34: DATA 'string',
+33: REF 'double',
+34: DATA 'double',
+31: ATTRIBUTE "table:operator",
+32: REF 'string',
+33: DATA 'string',
+31: CHOICE
+32: ATTRIBUTE "table:case-sensitive",
+33: REF 'string',
+34: DATA 'string',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "table:data-type",
+33: CHOICE
+34: VALUE 'text',
+34: VALUE 'number',
+32: EPSILON
+29: CHOICE
+30: ONEOREMORE
+31: REF 'table-filter-set-item',
+32: ELEMENT "table:filter-set-item",
+33: ATTRIBUTE "table:value",
+34: REF 'string',
+35: DATA 'string',
+30: EPSILON
+26: REF 'table-filter-and',
+27: ELEMENT "table:filter-and",
+28: ONEOREMORE
+29: CHOICE
+30: REF 'table-filter-or',
+31: ELEMENT "table:filter-or",
+32: ONEOREMORE
+33: CHOICE
+34: REF 'table-filter-and',
+34: REF 'table-filter-condition',
+30: REF 'table-filter-condition',
+26: REF 'table-filter-or',
+22: EPSILON
+21: CHOICE
+22: REF 'table-sort',
+23: ELEMENT "table:sort",
+24: SEQUENCE
+25: REF 'table-sort-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:bind-styles-to-content",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:target-range-address",
+29: REF 'cellRangeAddress',
+30: CHOICE
+31: DATA 'string',
+31: DATA 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:case-sensitive",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:language",
+29: REF 'languageCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:country",
+29: REF 'countryCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:script",
+29: REF 'scriptCode',
+30: DATA 'token',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:rfc-language-tag",
+29: REF 'language',
+30: DATA 'language',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:algorithm",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:embedded-number-behavior",
+29: CHOICE
+30: VALUE 'alpha-numeric',
+30: VALUE 'integer',
+30: VALUE 'double',
+28: EPSILON
+25: ONEOREMORE
+26: REF 'table-sort-by',
+27: ELEMENT "table:sort-by",
+28: REF 'table-sort-by-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-number",
+31: REF 'nonNegativeInteger',
+32: DATA 'nonNegativeInteger',
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+33: VALUE 'automatic',
+33: REF 'string',
+34: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:order",
+32: CHOICE
+33: VALUE 'ascending',
+33: VALUE 'descending',
+31: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'table-subtotal-rules',
+23: ELEMENT "table:subtotal-rules",
+24: SEQUENCE
+25: REF 'table-subtotal-rules-attlist',
+26: INTERLEAVE
+27: CHOICE
+28: ATTRIBUTE "table:bind-styles-to-content",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:case-sensitive",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:page-breaks-on-group-change",
+29: REF 'boolean',
+30: CHOICE
+31: VALUE 'true',
+31: VALUE 'false',
+28: EPSILON
+25: CHOICE
+26: REF 'table-sort-groups',
+27: ELEMENT "table:sort-groups",
+28: REF 'table-sort-groups-attlist',
+29: INTERLEAVE
+30: CHOICE
+31: ATTRIBUTE "table:data-type",
+32: CHOICE
+33: VALUE 'text',
+33: VALUE 'number',
+33: VALUE 'automatic',
+33: REF 'string',
+34: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: ATTRIBUTE "table:order",
+32: CHOICE
+33: VALUE 'ascending',
+33: VALUE 'descending',
+31: EPSILON
+26: EPSILON
+25: CHOICE
+26: ONEOREMORE
+27: REF 'table-subtotal-rule',
+28: ELEMENT "table:subtotal-rule",
+29: SEQUENCE
+30: REF 'table-subtotal-rule-attlist',
+31: ATTRIBUTE "table:group-by-field-number",
+32: REF 'nonNegativeInteger',
+33: DATA 'nonNegativeInteger',
+30: CHOICE
+31: ONEOREMORE
+32: REF 'table-subtotal-field',
+33: ELEMENT "table:subtotal-field",
+34: REF 'table-subtotal-field-attlist',
+35: INTERLEAVE
+36: ATTRIBUTE "table:field-number",
+37: REF 'nonNegativeInteger',
+38: DATA 'nonNegativeInteger',
+36: ATTRIBUTE "table:function",
+37: CHOICE
+38: VALUE 'average',
+38: VALUE 'count',
+38: VALUE 'countnums',
+38: VALUE 'max',
+38: VALUE 'min',
+38: VALUE 'product',
+38: VALUE 'stdev',
+38: VALUE 'stdevp',
+38: VALUE 'sum',
+38: VALUE 'var',
+38: VALUE 'varp',
+38: REF 'string',
+39: DATA 'string',
+31: EPSILON
+26: EPSILON
+22: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+15: ELEMENT "table:data-pilot-tables",
+16: CHOICE
+17: ONEOREMORE
+18: REF 'table-data-pilot-table',
+19: ELEMENT "table:data-pilot-table",
+20: SEQUENCE
+21: REF 'table-data-pilot-table-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "table:name",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:application-data",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:grand-total",
+25: CHOICE
+26: VALUE 'none',
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'both',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:ignore-empty-rows",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:identify-categories",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: ATTRIBUTE "table:target-range-address",
+24: REF 'cellRangeAddress',
+25: CHOICE
+26: DATA 'string',
+26: DATA 'string',
+26: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "table:buttons",
+25: REF 'cellRangeAddressList',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:show-filter-button",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "table:drill-down-on-double-click",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: CHOICE
+22: REF 'table-database-source-sql',
+22: REF 'table-database-source-table',
+22: REF 'table-database-source-query',
+22: REF 'table-source-service',
+23: ELEMENT "table:source-service",
+24: REF 'table-source-service-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "table:name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:source-name",
+27: REF 'string',
+28: DATA 'string',
+26: ATTRIBUTE "table:object-name",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "table:user-name",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "table:password",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+22: REF 'table-source-cell-range',
+23: ELEMENT "table:source-cell-range",
+24: SEQUENCE
+25: REF 'table-source-cell-range-attlist',
+26: ATTRIBUTE "table:cell-range-address",
+27: REF 'cellRangeAddress',
+28: CHOICE
+29: DATA 'string',
+29: DATA 'string',
+29: DATA 'string',
+25: CHOICE
+26: REF 'table-filter',
+26: EPSILON
+22: EPSILON
+21: ONEOREMORE
+22: REF 'table-data-pilot-field',
+23: ELEMENT "table:data-pilot-field",
+24: SEQUENCE
+25: REF 'table-data-pilot-field-attlist',
+26: INTERLEAVE
+27: ATTRIBUTE "table:source-field-name",
+28: REF 'string',
+29: DATA 'string',
+27: CHOICE
+28: ATTRIBUTE "table:orientation",
+29: CHOICE
+30: VALUE 'row',
+30: VALUE 'column',
+30: VALUE 'data',
+30: VALUE 'hidden',
+28: SEQUENCE
+29: ATTRIBUTE "table:orientation",
+30: VALUE 'page',
+29: ATTRIBUTE "table:selected-page",
+30: REF 'string',
+31: DATA 'string',
+27: CHOICE
+28: ATTRIBUTE "table:is-data-layout-field",
+29: REF 'string',
+30: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:function",
+29: CHOICE
+30: VALUE 'auto',
+30: VALUE 'average',
+30: VALUE 'count',
+30: VALUE 'countnums',
+30: VALUE 'max',
+30: VALUE 'min',
+30: VALUE 'product',
+30: VALUE 'stdev',
+30: VALUE 'stdevp',
+30: VALUE 'sum',
+30: VALUE 'var',
+30: VALUE 'varp',
+30: REF 'string',
+31: DATA 'string',
+28: EPSILON
+27: CHOICE
+28: ATTRIBUTE "table:used-hierarchy",
+29: REF 'integer',
+30: DATA 'integer',
+28: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-level',
+27: ELEMENT "table:data-pilot-level",
+28: SEQUENCE
+29: REF 'table-data-pilot-level-attlist',
+30: CHOICE
+31: ATTRIBUTE "table:show-empty",
+32: REF 'boolean',
+33: CHOICE
+34: VALUE 'true',
+34: VALUE 'false',
+31: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-subtotals',
+31: ELEMENT "table:data-pilot-subtotals",
+32: CHOICE
+33: ONEOREMORE
+34: REF 'table-data-pilot-subtotal',
+35: ELEMENT "table:data-pilot-subtotal",
+36: REF 'table-data-pilot-subtotal-attlist',
+37: ATTRIBUTE "table:function",
+38: CHOICE
+39: VALUE 'auto',
+39: VALUE 'average',
+39: VALUE 'count',
+39: VALUE 'countnums',
+39: VALUE 'max',
+39: VALUE 'min',
+39: VALUE 'product',
+39: VALUE 'stdev',
+39: VALUE 'stdevp',
+39: VALUE 'sum',
+39: VALUE 'var',
+39: VALUE 'varp',
+39: REF 'string',
+40: DATA 'string',
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-members',
+31: ELEMENT "table:data-pilot-members",
+32: CHOICE
+33: ONEOREMORE
+34: REF 'table-data-pilot-member',
+35: ELEMENT "table:data-pilot-member",
+36: REF 'table-data-pilot-member-attlist',
+37: INTERLEAVE
+38: ATTRIBUTE "table:name",
+39: REF 'string',
+40: DATA 'string',
+38: CHOICE
+39: ATTRIBUTE "table:display",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+38: CHOICE
+39: ATTRIBUTE "table:show-details",
+40: REF 'boolean',
+41: CHOICE
+42: VALUE 'true',
+42: VALUE 'false',
+39: EPSILON
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-display-info',
+31: ELEMENT "table:data-pilot-display-info",
+32: REF 'table-data-pilot-display-info-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "table:enabled",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: ATTRIBUTE "table:data-field",
+35: REF 'string',
+36: DATA 'string',
+34: ATTRIBUTE "table:member-count",
+35: REF 'nonNegativeInteger',
+36: DATA 'nonNegativeInteger',
+34: ATTRIBUTE "table:display-member-mode",
+35: CHOICE
+36: VALUE 'from-top',
+36: VALUE 'from-bottom',
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-sort-info',
+31: ELEMENT "table:data-pilot-sort-info",
+32: REF 'table-data-pilot-sort-info-attlist',
+33: INTERLEAVE
+34: CHOICE
+35: SEQUENCE
+36: ATTRIBUTE "table:sort-mode",
+37: VALUE 'data',
+36: ATTRIBUTE "table:data-field",
+37: REF 'string',
+38: DATA 'string',
+35: ATTRIBUTE "table:sort-mode",
+36: CHOICE
+37: VALUE 'none',
+37: VALUE 'manual',
+37: VALUE 'name',
+34: ATTRIBUTE "table:order",
+35: CHOICE
+36: VALUE 'ascending',
+36: VALUE 'descending',
+30: EPSILON
+29: CHOICE
+30: REF 'table-data-pilot-layout-info',
+31: ELEMENT "table:data-pilot-layout-info",
+32: REF 'table-data-pilot-layout-info-attlist',
+33: INTERLEAVE
+34: ATTRIBUTE "table:layout-mode",
+35: CHOICE
+36: VALUE 'tabular-layout',
+36: VALUE 'outline-subtotals-top',
+36: VALUE 'outline-subtotals-bottom',
+34: ATTRIBUTE "table:add-empty-lines",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+30: EPSILON
+26: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-field-reference',
+27: ELEMENT "table:data-pilot-field-reference",
+28: REF 'table-data-pilot-field-reference-attlist',
+29: INTERLEAVE
+30: ATTRIBUTE "table:field-name",
+31: REF 'string',
+32: DATA 'string',
+30: CHOICE
+31: SEQUENCE
+32: ATTRIBUTE "table:member-type",
+33: VALUE 'named',
+32: ATTRIBUTE "table:member-name",
+33: REF 'string',
+34: DATA 'string',
+31: ATTRIBUTE "table:member-type",
+32: CHOICE
+33: VALUE 'previous',
+33: VALUE 'next',
+30: ATTRIBUTE "table:type",
+31: CHOICE
+32: VALUE 'none',
+32: VALUE 'member-difference',
+32: VALUE 'member-percentage',
+32: VALUE 'member-percentage-difference',
+32: VALUE 'running-total',
+32: VALUE 'row-percentage',
+32: VALUE 'column-percentage',
+32: VALUE 'total-percentage',
+32: VALUE 'index',
+26: EPSILON
+25: CHOICE
+26: REF 'table-data-pilot-groups',
+27: ELEMENT "table:data-pilot-groups",
+28: SEQUENCE
+29: REF 'table-data-pilot-groups-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:source-field-name",
+32: REF 'string',
+33: DATA 'string',
+31: CHOICE
+32: ATTRIBUTE "table:date-start",
+33: CHOICE
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+34: VALUE 'auto',
+32: ATTRIBUTE "table:start",
+33: CHOICE
+34: REF 'double',
+35: DATA 'double',
+34: VALUE 'auto',
+31: CHOICE
+32: ATTRIBUTE "table:date-end",
+33: CHOICE
+34: REF 'dateOrDateTime',
+35: CHOICE
+36: DATA 'date',
+36: DATA 'dateTime',
+34: VALUE 'auto',
+32: ATTRIBUTE "table:end",
+33: CHOICE
+34: REF 'double',
+35: DATA 'double',
+34: VALUE 'auto',
+31: ATTRIBUTE "table:step",
+32: REF 'double',
+33: DATA 'double',
+31: ATTRIBUTE "table:grouped-by",
+32: CHOICE
+33: VALUE 'seconds',
+33: VALUE 'minutes',
+33: VALUE 'hours',
+33: VALUE 'days',
+33: VALUE 'months',
+33: VALUE 'quarters',
+33: VALUE 'years',
+29: ONEOREMORE
+30: REF 'table-data-pilot-group',
+31: ELEMENT "table:data-pilot-group",
+32: SEQUENCE
+33: REF 'table-data-pilot-group-attlist',
+34: ATTRIBUTE "table:name",
+35: REF 'string',
+36: DATA 'string',
+33: ONEOREMORE
+34: REF 'table-data-pilot-group-member',
+35: ELEMENT "table:data-pilot-group-member",
+36: REF 'table-data-pilot-group-member-attlist',
+37: ATTRIBUTE "table:name",
+38: REF 'string',
+39: DATA 'string',
+26: EPSILON
+17: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+15: ELEMENT "table:consolidation",
+16: REF 'table-consolidation-attlist',
+17: INTERLEAVE
+18: ATTRIBUTE "table:function",
+19: CHOICE
+20: VALUE 'average',
+20: VALUE 'count',
+20: VALUE 'countnums',
+20: VALUE 'max',
+20: VALUE 'min',
+20: VALUE 'product',
+20: VALUE 'stdev',
+20: VALUE 'stdevp',
+20: VALUE 'sum',
+20: VALUE 'var',
+20: VALUE 'varp',
+20: REF 'string',
+21: DATA 'string',
+18: ATTRIBUTE "table:source-cell-range-addresses",
+19: REF 'cellRangeAddressList',
+20: DATA 'string',
+18: ATTRIBUTE "table:target-cell-address",
+19: REF 'cellAddress',
+20: DATA 'string',
+18: CHOICE
+19: ATTRIBUTE "table:use-labels",
+20: CHOICE
+21: VALUE 'none',
+21: VALUE 'row',
+21: VALUE 'column',
+21: VALUE 'both',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "table:link-to-source-data",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+15: ELEMENT "table:dde-links",
+16: ONEOREMORE
+17: REF 'table-dde-link',
+18: ELEMENT "table:dde-link",
+19: SEQUENCE
+20: REF 'office-dde-source',
+20: REF 'table-table',
+14: EPSILON
+8: ELEMENT "office:drawing",
+9: SEQUENCE
+10: REF 'office-drawing-attlist',
+11: EPSILON
+10: REF 'office-drawing-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-drawing-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-page',
+14: ELEMENT "draw:page",
+15: SEQUENCE
+16: REF 'common-presentation-header-footer-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "presentation:use-header-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:use-footer-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:use-date-time-name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+16: REF 'draw-page-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "draw:name",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:style-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: ATTRIBUTE "draw:master-page-name",
+19: REF 'styleNameRef',
+20: CHOICE
+21: DATA 'NCName',
+21: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:presentation-page-layout-name",
+20: REF 'styleNameRef',
+21: CHOICE
+22: DATA 'NCName',
+22: EPSILON
+19: EPSILON
+18: CHOICE
+19: SEQUENCE
+20: REF 'xml-id',
+21: ATTRIBUTE "xml:id",
+22: REF 'ID',
+23: DATA 'ID',
+20: CHOICE
+21: ATTRIBUTE "draw:id",
+22: REF 'NCName',
+23: DATA 'NCName',
+21: EPSILON
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "draw:nav-order",
+20: REF 'IDREFS',
+21: DATA 'IDREFS',
+19: EPSILON
+16: CHOICE
+17: REF 'svg-title',
+17: EPSILON
+16: CHOICE
+17: REF 'svg-desc',
+17: EPSILON
+16: CHOICE
+17: REF 'draw-layer-set',
+17: EPSILON
+16: CHOICE
+17: REF 'office-forms',
+18: CHOICE
+17: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'shape',
+19: CHOICE
+20: REF 'shape-instance',
+21: CHOICE
+22: REF 'draw-rect',
+22: REF 'draw-line',
+22: REF 'draw-polyline',
+22: REF 'draw-polygon',
+22: REF 'draw-regular-polygon',
+22: REF 'draw-path',
+22: REF 'draw-circle',
+22: REF 'draw-ellipse',
+22: REF 'draw-g',
+22: REF 'draw-page-thumbnail',
+22: REF 'draw-frame',
+22: REF 'draw-measure',
+22: REF 'draw-caption',
+22: REF 'draw-connector',
+22: REF 'draw-control',
+22: REF 'dr3d-scene',
+22: REF 'draw-custom-shape',
+20: REF 'draw-a',
+17: EPSILON
+16: CHOICE
+17: REF 'presentation-animations',
+18: ELEMENT "presentation:animations",
+19: CHOICE
+20: ONEOREMORE
+21: CHOICE
+22: REF 'presentation-animation-elements',
+23: CHOICE
+24: REF 'presentation-show-shape',
+25: ELEMENT "presentation:show-shape",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-show-text',
+25: ELEMENT "presentation:show-text",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-hide-shape',
+25: ELEMENT "presentation:hide-shape",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-hide-text',
+25: ELEMENT "presentation:hide-text",
+26: SEQUENCE
+27: REF 'common-presentation-effect-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: CHOICE
+30: ATTRIBUTE "presentation:effect",
+31: REF 'presentationEffects',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'fade',
+33: VALUE 'move',
+33: VALUE 'stripes',
+33: VALUE 'open',
+33: VALUE 'close',
+33: VALUE 'dissolve',
+33: VALUE 'wavyline',
+33: VALUE 'random',
+33: VALUE 'lines',
+33: VALUE 'laser',
+33: VALUE 'appear',
+33: VALUE 'hide',
+33: VALUE 'move-short',
+33: VALUE 'checkerboard',
+33: VALUE 'rotate',
+33: VALUE 'stretch',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:direction",
+31: REF 'presentationEffectDirections',
+32: CHOICE
+33: VALUE 'none',
+33: VALUE 'from-left',
+33: VALUE 'from-top',
+33: VALUE 'from-right',
+33: VALUE 'from-bottom',
+33: VALUE 'from-center',
+33: VALUE 'from-upper-left',
+33: VALUE 'from-upper-right',
+33: VALUE 'from-lower-left',
+33: VALUE 'from-lower-right',
+33: VALUE 'to-left',
+33: VALUE 'to-top',
+33: VALUE 'to-right',
+33: VALUE 'to-bottom',
+33: VALUE 'to-upper-left',
+33: VALUE 'to-upper-right',
+33: VALUE 'to-lower-right',
+33: VALUE 'to-lower-left',
+33: VALUE 'path',
+33: VALUE 'spiral-inward-left',
+33: VALUE 'spiral-inward-right',
+33: VALUE 'spiral-outward-left',
+33: VALUE 'spiral-outward-right',
+33: VALUE 'vertical',
+33: VALUE 'horizontal',
+33: VALUE 'to-center',
+33: VALUE 'clockwise',
+33: VALUE 'counter-clockwise',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:speed",
+31: REF 'presentationSpeeds',
+32: CHOICE
+33: VALUE 'slow',
+33: VALUE 'medium',
+33: VALUE 'fast',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:delay",
+31: REF 'duration',
+32: DATA 'duration',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:start-scale",
+31: REF 'percent',
+32: DATA 'string',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "presentation:path-id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-dim',
+25: ELEMENT "presentation:dim",
+26: SEQUENCE
+27: REF 'presentation-dim-attlist',
+28: INTERLEAVE
+29: ATTRIBUTE "draw:shape-id",
+30: REF 'IDREF',
+31: DATA 'IDREF',
+29: ATTRIBUTE "draw:color",
+30: REF 'color',
+31: DATA 'string',
+27: CHOICE
+28: REF 'presentation-sound',
+28: EPSILON
+24: REF 'presentation-play',
+25: ELEMENT "presentation:play",
+26: REF 'presentation-play-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "draw:shape-id",
+29: REF 'IDREF',
+30: DATA 'IDREF',
+28: CHOICE
+29: ATTRIBUTE "presentation:speed",
+30: REF 'presentationSpeeds',
+31: CHOICE
+32: VALUE 'slow',
+32: VALUE 'medium',
+32: VALUE 'fast',
+29: EPSILON
+22: REF 'presentation-animation-group',
+23: ELEMENT "presentation:animation-group",
+24: CHOICE
+25: ONEOREMORE
+26: REF 'presentation-animation-elements',
+27: CHOICE
+28: REF 'presentation-show-shape',
+28: REF 'presentation-show-text',
+28: REF 'presentation-hide-shape',
+28: REF 'presentation-hide-text',
+28: REF 'presentation-dim',
+28: REF 'presentation-play',
+25: EPSILON
+20: EPSILON
+17: REF 'animation-element',
+18: CHOICE
+17: EPSILON
+16: CHOICE
+17: REF 'presentation-notes',
+17: EPSILON
+12: EPSILON
+10: REF 'office-drawing-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:presentation",
+9: SEQUENCE
+10: REF 'office-presentation-attlist',
+11: EPSILON
+10: REF 'office-presentation-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+12: REF 'presentation-decls',
+13: CHOICE
+14: ONEOREMORE
+15: REF 'presentation-decl',
+16: CHOICE
+17: ELEMENT "presentation:header-decl",
+18: SEQUENCE
+19: REF 'presentation-header-decl-attlist',
+20: ATTRIBUTE "presentation:name",
+21: REF 'string',
+22: DATA 'string',
+19: STRING
+17: ELEMENT "presentation:footer-decl",
+18: SEQUENCE
+19: REF 'presentation-footer-decl-attlist',
+20: ATTRIBUTE "presentation:name",
+21: REF 'string',
+22: DATA 'string',
+19: STRING
+17: ELEMENT "presentation:date-time-decl",
+18: SEQUENCE
+19: REF 'presentation-date-time-decl-attlist',
+20: INTERLEAVE
+21: ATTRIBUTE "presentation:name",
+22: REF 'string',
+23: DATA 'string',
+21: ATTRIBUTE "presentation:source",
+22: CHOICE
+23: VALUE 'fixed',
+23: VALUE 'current-date',
+21: CHOICE
+22: ATTRIBUTE "style:data-style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+19: STRING
+14: EPSILON
+10: REF 'office-presentation-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'draw-page',
+12: EPSILON
+10: REF 'office-presentation-content-epilogue',
+11: SEQUENCE
+12: REF 'presentation-settings',
+13: CHOICE
+14: ELEMENT "presentation:settings",
+15: SEQUENCE
+16: REF 'presentation-settings-attlist',
+17: INTERLEAVE
+18: CHOICE
+19: ATTRIBUTE "presentation:start-page",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show",
+20: REF 'string',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:full-screen",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:endless",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:pause",
+20: REF 'duration',
+21: DATA 'duration',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show-logo",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:force-manual",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:mouse-visible",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:mouse-as-pen",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:start-with-navigator",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:animations",
+20: CHOICE
+21: VALUE 'enabled',
+21: VALUE 'disabled',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:transition-on-click",
+20: CHOICE
+21: VALUE 'enabled',
+21: VALUE 'disabled',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:stay-on-top",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "presentation:show-end-of-presentation-slide",
+20: REF 'boolean',
+21: CHOICE
+22: VALUE 'true',
+22: VALUE 'false',
+19: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: REF 'presentation-show',
+19: ELEMENT "presentation:show",
+20: REF 'presentation-show-attlist',
+21: INTERLEAVE
+22: ATTRIBUTE "presentation:name",
+23: REF 'string',
+24: DATA 'string',
+22: ATTRIBUTE "presentation:pages",
+23: REF 'string',
+24: DATA 'string',
+17: EPSILON
+14: EPSILON
+12: REF 'table-functions',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-named-expressions',
+15: EPSILON
+14: CHOICE
+15: REF 'table-database-ranges',
+15: EPSILON
+14: CHOICE
+15: REF 'table-data-pilot-tables',
+15: EPSILON
+14: CHOICE
+15: REF 'table-consolidation',
+15: EPSILON
+14: CHOICE
+15: REF 'table-dde-links',
+15: EPSILON
+8: ELEMENT "office:spreadsheet",
+9: SEQUENCE
+10: REF 'office-spreadsheet-attlist',
+11: SEQUENCE
+12: CHOICE
+13: ATTRIBUTE "table:structure-protected",
+14: REF 'boolean',
+15: CHOICE
+16: VALUE 'true',
+16: VALUE 'false',
+13: EPSILON
+12: CHOICE
+13: ATTRIBUTE "table:protection-key",
+14: REF 'string',
+15: DATA 'string',
+13: EPSILON
+12: CHOICE
+13: ATTRIBUTE "table:protection-key-digest-algorithm",
+14: REF 'anyIRI',
+15: DATA 'anyURI',
+13: EPSILON
+10: REF 'office-spreadsheet-content-prelude',
+11: SEQUENCE
+12: CHOICE
+13: REF 'table-tracked-changes',
+14: ELEMENT "table:tracked-changes",
+15: SEQUENCE
+16: REF 'table-tracked-changes-attlist',
+17: CHOICE
+18: ATTRIBUTE "table:track-changes",
+19: REF 'boolean',
+20: CHOICE
+21: VALUE 'true',
+21: VALUE 'false',
+18: EPSILON
+16: CHOICE
+17: ONEOREMORE
+18: CHOICE
+19: REF 'table-cell-content-change',
+20: ELEMENT "table:cell-content-change",
+21: SEQUENCE
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'table-cell-address',
+23: ELEMENT "table:cell-address",
+24: REF 'common-table-cell-address-attlist',
+25: SEQUENCE
+26: ATTRIBUTE "table:column",
+27: REF 'integer',
+28: DATA 'integer',
+26: ATTRIBUTE "table:row",
+27: REF 'integer',
+28: DATA 'integer',
+26: ATTRIBUTE "table:table",
+27: REF 'integer',
+28: DATA 'integer',
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+24: ELEMENT "table:dependencies",
+25: ONEOREMORE
+26: REF 'table-dependency',
+27: ELEMENT "table:dependency",
+28: ATTRIBUTE "table:id",
+29: REF 'string',
+30: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+24: ELEMENT "table:deletions",
+25: ONEOREMORE
+26: CHOICE
+27: REF 'table-cell-content-deletion',
+28: ELEMENT "table:cell-content-deletion",
+29: SEQUENCE
+30: CHOICE
+31: ATTRIBUTE "table:id",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+30: CHOICE
+31: REF 'table-cell-address',
+31: EPSILON
+30: CHOICE
+31: REF 'table-change-track-table-cell',
+32: ELEMENT "table:change-track-table-cell",
+33: SEQUENCE
+34: REF 'table-change-track-table-cell-attlist',
+35: INTERLEAVE
+36: CHOICE
+37: ATTRIBUTE "table:cell-address",
+38: REF 'cellAddress',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "table:matrix-covered",
+38: REF 'boolean',
+39: CHOICE
+40: VALUE 'true',
+40: VALUE 'false',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "table:formula",
+38: REF 'string',
+39: DATA 'string',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "table:number-matrix-columns-spanned",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+37: EPSILON
+36: CHOICE
+37: ATTRIBUTE "table:number-matrix-rows-spanned",
+38: REF 'positiveInteger',
+39: DATA 'positiveInteger',
+37: EPSILON
+36: CHOICE
+37: REF 'common-value-and-type-attlist',
+38: CHOICE
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'float',
+40: ATTRIBUTE "office:value",
+41: REF 'double',
+42: DATA 'double',
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'percentage',
+40: ATTRIBUTE "office:value",
+41: REF 'double',
+42: DATA 'double',
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'currency',
+40: ATTRIBUTE "office:value",
+41: REF 'double',
+42: DATA 'double',
+40: CHOICE
+41: ATTRIBUTE "office:currency",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'date',
+40: ATTRIBUTE "office:date-value",
+41: REF 'dateOrDateTime',
+42: CHOICE
+43: DATA 'date',
+43: DATA 'dateTime',
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'time',
+40: ATTRIBUTE "office:time-value",
+41: REF 'duration',
+42: DATA 'duration',
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'boolean',
+40: ATTRIBUTE "office:boolean-value",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+39: SEQUENCE
+40: ATTRIBUTE "office:value-type",
+41: VALUE 'string',
+40: CHOICE
+41: ATTRIBUTE "office:string-value",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+37: EPSILON
+34: CHOICE
+35: ONEOREMORE
+36: REF 'text-p',
+35: EPSILON
+31: EPSILON
+27: REF 'table-change-deletion',
+28: ELEMENT "table:change-deletion",
+29: CHOICE
+30: ATTRIBUTE "table:id",
+31: REF 'string',
+32: DATA 'string',
+30: EPSILON
+23: EPSILON
+22: REF 'table-previous',
+23: ELEMENT "table:previous",
+24: SEQUENCE
+25: CHOICE
+26: ATTRIBUTE "table:id",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: REF 'table-change-track-table-cell',
+19: REF 'table-insertion',
+20: ELEMENT "table:insertion",
+21: SEQUENCE
+22: REF 'table-insertion-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:type",
+25: CHOICE
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'table',
+24: ATTRIBUTE "table:position",
+25: REF 'integer',
+26: DATA 'integer',
+24: CHOICE
+25: ATTRIBUTE "table:count",
+26: REF 'positiveInteger',
+27: DATA 'positiveInteger',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:table",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+19: REF 'table-deletion',
+20: ELEMENT "table:deletion",
+21: SEQUENCE
+22: REF 'table-deletion-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:type",
+25: CHOICE
+26: VALUE 'row',
+26: VALUE 'column',
+26: VALUE 'table',
+24: ATTRIBUTE "table:position",
+25: REF 'integer',
+26: DATA 'integer',
+24: CHOICE
+25: ATTRIBUTE "table:table",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:multi-deletion-spanned",
+26: REF 'integer',
+27: DATA 'integer',
+25: EPSILON
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+22: CHOICE
+23: REF 'table-cut-offs',
+24: ELEMENT "table:cut-offs",
+25: CHOICE
+26: ONEOREMORE
+27: REF 'table-movement-cut-off',
+28: ELEMENT "table:movement-cut-off",
+29: REF 'table-movement-cut-off-attlist',
+30: CHOICE
+31: ATTRIBUTE "table:position",
+32: REF 'integer',
+33: DATA 'integer',
+31: SEQUENCE
+32: ATTRIBUTE "table:start-position",
+33: REF 'integer',
+34: DATA 'integer',
+32: ATTRIBUTE "table:end-position",
+33: REF 'integer',
+34: DATA 'integer',
+26: SEQUENCE
+27: REF 'table-insertion-cut-off',
+28: ELEMENT "table:insertion-cut-off",
+29: REF 'table-insertion-cut-off-attlist',
+30: INTERLEAVE
+31: ATTRIBUTE "table:id",
+32: REF 'string',
+33: DATA 'string',
+31: ATTRIBUTE "table:position",
+32: REF 'integer',
+33: DATA 'integer',
+27: CHOICE
+28: ONEOREMORE
+29: REF 'table-movement-cut-off',
+28: EPSILON
+23: EPSILON
+19: REF 'table-movement',
+20: ELEMENT "table:movement",
+21: SEQUENCE
+22: REF 'common-table-change-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "table:id",
+25: REF 'string',
+26: DATA 'string',
+24: CHOICE
+25: ATTRIBUTE "table:acceptance-state",
+26: CHOICE
+27: VALUE 'accepted',
+27: VALUE 'rejected',
+27: VALUE 'pending',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "table:rejecting-change-id",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+22: REF 'table-source-range-address',
+23: ELEMENT "table:source-range-address",
+24: REF 'common-table-range-attlist',
+25: CHOICE
+26: REF 'common-table-cell-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:table",
+29: REF 'integer',
+30: DATA 'integer',
+26: REF 'common-table-cell-range-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:start-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-table",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-table",
+29: REF 'integer',
+30: DATA 'integer',
+22: REF 'table-target-range-address',
+23: ELEMENT "table:target-range-address",
+24: REF 'common-table-range-attlist',
+25: CHOICE
+26: REF 'common-table-cell-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:table",
+29: REF 'integer',
+30: DATA 'integer',
+26: REF 'common-table-cell-range-address-attlist',
+27: SEQUENCE
+28: ATTRIBUTE "table:start-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:start-table",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-column",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-row",
+29: REF 'integer',
+30: DATA 'integer',
+28: ATTRIBUTE "table:end-table",
+29: REF 'integer',
+30: DATA 'integer',
+22: REF 'office-change-info',
+22: CHOICE
+23: REF 'table-dependencies',
+23: EPSILON
+22: CHOICE
+23: REF 'table-deletions',
+23: EPSILON
+17: EPSILON
+13: EPSILON
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-spreadsheet-content-main',
+11: CHOICE
+12: ONEOREMORE
+13: REF 'table-table',
+12: EPSILON
+10: REF 'office-spreadsheet-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:chart",
+9: SEQUENCE
+10: REF 'office-chart-attlist',
+11: EPSILON
+10: REF 'office-chart-content-prelude',
+11: SEQUENCE
+12: REF 'text-decls',
+13: SEQUENCE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+14: CHOICE
+15: REF 'text-alphabetical-index-auto-mark-file',
+15: EPSILON
+12: REF 'table-decls',
+13: SEQUENCE
+14: CHOICE
+15: REF 'table-calculation-settings',
+15: EPSILON
+14: CHOICE
+15: REF 'table-content-validations',
+15: EPSILON
+14: CHOICE
+15: REF 'table-label-ranges',
+15: EPSILON
+10: REF 'office-chart-content-main',
+11: REF 'chart-chart',
+12: ELEMENT "chart:chart",
+13: SEQUENCE
+14: REF 'chart-chart-attlist',
+15: INTERLEAVE
+16: ATTRIBUTE "chart:class",
+17: REF 'namespacedToken',
+18: DATA 'QName',
+16: REF 'common-draw-size-attlist',
+17: SEQUENCE
+18: CHOICE
+19: ATTRIBUTE "svg:width",
+20: REF 'length',
+21: DATA 'string',
+19: EPSILON
+18: CHOICE
+19: ATTRIBUTE "svg:height",
+20: REF 'length',
+21: DATA 'string',
+19: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:column-mapping",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:row-mapping",
+18: REF 'string',
+19: DATA 'string',
+17: EPSILON
+16: CHOICE
+17: ATTRIBUTE "chart:style-name",
+18: REF 'styleNameRef',
+19: CHOICE
+20: DATA 'NCName',
+20: EPSILON
+17: EPSILON
+16: CHOICE
+17: SEQUENCE
+18: ATTRIBUTE "xlink:type",
+19: VALUE 'simple',
+18: ATTRIBUTE "xlink:href",
+19: REF 'anyIRI',
+20: DATA 'anyURI',
+17: EPSILON
+16: CHOICE
+17: REF 'xml-id',
+18: ATTRIBUTE "xml:id",
+19: REF 'ID',
+20: DATA 'ID',
+17: EPSILON
+14: CHOICE
+15: REF 'chart-title',
+16: ELEMENT "chart:title",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellRangeAddressList',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-subtitle',
+16: ELEMENT "chart:subtitle",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellRangeAddressList',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-footer',
+16: ELEMENT "chart:footer",
+17: SEQUENCE
+18: REF 'chart-title-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "table:cell-range",
+22: REF 'cellRangeAddressList',
+23: DATA 'string',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'chart-legend',
+16: ELEMENT "chart:legend",
+17: SEQUENCE
+18: REF 'chart-legend-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: SEQUENCE
+22: ATTRIBUTE "chart:legend-position",
+23: CHOICE
+24: VALUE 'start',
+24: VALUE 'end',
+24: VALUE 'top',
+24: VALUE 'bottom',
+22: CHOICE
+23: ATTRIBUTE "chart:legend-align",
+24: CHOICE
+25: VALUE 'start',
+25: VALUE 'center',
+25: VALUE 'end',
+23: EPSILON
+21: ATTRIBUTE "chart:legend-position",
+22: CHOICE
+23: VALUE 'top-start',
+23: VALUE 'bottom-start',
+23: VALUE 'top-end',
+23: VALUE 'bottom-end',
+21: EPSILON
+20: REF 'common-draw-position-attlist',
+21: SEQUENCE
+22: CHOICE
+23: ATTRIBUTE "svg:x",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "svg:y",
+24: REF 'coordinate',
+25: REF 'length',
+26: DATA 'string',
+23: EPSILON
+20: CHOICE
+21: ATTRIBUTE "style:legend-expansion",
+22: CHOICE
+23: VALUE 'wide',
+23: VALUE 'high',
+23: VALUE 'balanced',
+21: SEQUENCE
+22: ATTRIBUTE "style:legend-expansion",
+23: VALUE 'custom',
+22: ATTRIBUTE "style:legend-expansion-aspect-ratio",
+23: REF 'double',
+24: DATA 'double',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "chart:style-name",
+22: REF 'styleNameRef',
+23: CHOICE
+24: DATA 'NCName',
+24: EPSILON
+21: EPSILON
+18: CHOICE
+19: REF 'text-p',
+19: EPSILON
+15: EPSILON
+14: REF 'chart-plot-area',
+15: ELEMENT "chart:plot-area",
+16: SEQUENCE
+17: REF 'chart-plot-area-attlist',
+18: INTERLEAVE
+19: REF 'common-draw-position-attlist',
+20: SEQUENCE
+21: CHOICE
+22: ATTRIBUTE "svg:x",
+23: REF 'coordinate',
+24: REF 'length',
+25: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "svg:y",
+23: REF 'coordinate',
+24: REF 'length',
+25: DATA 'string',
+22: EPSILON
+19: REF 'common-draw-size-attlist',
+20: SEQUENCE
+21: CHOICE
+22: ATTRIBUTE "svg:width",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "svg:height",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:style-name",
+21: REF 'styleNameRef',
+22: CHOICE
+23: DATA 'NCName',
+23: EPSILON
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "table:cell-range-address",
+21: REF 'cellRangeAddressList',
+22: DATA 'string',
+20: EPSILON
+19: CHOICE
+20: ATTRIBUTE "chart:data-source-has-labels",
+21: CHOICE
+22: VALUE 'none',
+22: VALUE 'row',
+22: VALUE 'column',
+22: VALUE 'both',
+20: EPSILON
+19: REF 'dr3d-scene-attlist',
+20: INTERLEAVE
+21: CHOICE
+22: ATTRIBUTE "dr3d:vrp",
+23: REF 'vector3D',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:vpn",
+23: REF 'vector3D',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:vup",
+23: REF 'vector3D',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:projection",
+23: CHOICE
+24: VALUE 'parallel',
+24: VALUE 'perspective',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:distance",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:focal-length",
+23: REF 'length',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:shadow-slant",
+23: REF 'angle',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:shade-mode",
+23: CHOICE
+24: VALUE 'flat',
+24: VALUE 'phong',
+24: VALUE 'gouraud',
+24: VALUE 'draft',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:ambient-color",
+23: REF 'color',
+24: DATA 'string',
+22: EPSILON
+21: CHOICE
+22: ATTRIBUTE "dr3d:lighting-mode",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+19: REF 'common-dr3d-transform-attlist',
+20: CHOICE
+21: ATTRIBUTE "dr3d:transform",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+19: CHOICE
+20: REF 'xml-id',
+21: ATTRIBUTE "xml:id",
+22: REF 'ID',
+23: DATA 'ID',
+20: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'dr3d-light',
+18: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'chart-axis',
+20: ELEMENT "chart:axis",
+21: SEQUENCE
+22: REF 'chart-axis-attlist',
+23: INTERLEAVE
+24: ATTRIBUTE "chart:dimension",
+25: REF 'chart-dimension',
+26: CHOICE
+27: VALUE 'x',
+27: VALUE 'y',
+27: VALUE 'z',
+24: CHOICE
+25: ATTRIBUTE "chart:name",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:style-name",
+26: REF 'styleNameRef',
+27: CHOICE
+28: DATA 'NCName',
+28: EPSILON
+25: EPSILON
+22: CHOICE
+23: REF 'chart-title',
+23: EPSILON
+22: CHOICE
+23: REF 'chart-categories',
+24: ELEMENT "chart:categories",
+25: CHOICE
+26: ATTRIBUTE "table:cell-range-address",
+27: REF 'cellRangeAddressList',
+28: DATA 'string',
+26: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-grid',
+25: ELEMENT "chart:grid",
+26: REF 'chart-grid-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "chart:class",
+30: CHOICE
+31: VALUE 'major',
+31: VALUE 'minor',
+29: EPSILON
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: ONEOREMORE
+19: REF 'chart-series',
+20: ELEMENT "chart:series",
+21: SEQUENCE
+22: REF 'chart-series-attlist',
+23: INTERLEAVE
+24: CHOICE
+25: ATTRIBUTE "chart:values-cell-range-address",
+26: REF 'cellRangeAddressList',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:label-cell-address",
+26: REF 'cellRangeAddressList',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:class",
+26: REF 'namespacedToken',
+27: DATA 'QName',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:attached-axis",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+24: CHOICE
+25: ATTRIBUTE "chart:style-name",
+26: REF 'styleNameRef',
+27: CHOICE
+28: DATA 'NCName',
+28: EPSILON
+25: EPSILON
+24: CHOICE
+25: REF 'xml-id',
+26: ATTRIBUTE "xml:id",
+27: REF 'ID',
+28: DATA 'ID',
+25: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-domain',
+25: ELEMENT "chart:domain",
+26: CHOICE
+27: ATTRIBUTE "table:cell-range-address",
+28: REF 'cellRangeAddressList',
+29: DATA 'string',
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-mean-value',
+24: ELEMENT "chart:mean-value",
+25: REF 'chart-mean-value-attlist',
+26: CHOICE
+27: ATTRIBUTE "chart:style-name",
+28: REF 'styleNameRef',
+29: CHOICE
+30: DATA 'NCName',
+30: EPSILON
+27: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-regression-curve',
+25: ELEMENT "chart:regression-curve",
+26: SEQUENCE
+27: REF 'chart-regression-curve-attlist',
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+27: CHOICE
+28: REF 'chart-equation',
+29: ELEMENT "chart:equation",
+30: SEQUENCE
+31: REF 'chart-equation-attlist',
+32: INTERLEAVE
+33: CHOICE
+34: ATTRIBUTE "chart:automatic-content",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "chart:display-r-square",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "chart:display-equation",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: EPSILON
+33: REF 'common-draw-position-attlist',
+34: SEQUENCE
+35: CHOICE
+36: ATTRIBUTE "svg:x",
+37: REF 'coordinate',
+38: REF 'length',
+39: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "svg:y",
+37: REF 'coordinate',
+38: REF 'length',
+39: DATA 'string',
+36: EPSILON
+33: CHOICE
+34: ATTRIBUTE "chart:style-name",
+35: REF 'styleNameRef',
+36: CHOICE
+37: DATA 'NCName',
+37: EPSILON
+34: EPSILON
+31: CHOICE
+32: REF 'text-p',
+32: EPSILON
+28: EPSILON
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-error-indicator',
+25: ELEMENT "chart:error-indicator",
+26: REF 'chart-error-indicator-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "chart:style-name",
+30: REF 'styleNameRef',
+31: CHOICE
+32: DATA 'NCName',
+32: EPSILON
+29: EPSILON
+28: ATTRIBUTE "chart:dimension",
+29: REF 'chart-dimension',
+30: CHOICE
+31: VALUE 'x',
+31: VALUE 'y',
+31: VALUE 'z',
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'chart-data-point',
+25: ELEMENT "chart:data-point",
+26: SEQUENCE
+27: REF 'chart-data-point-attlist',
+28: INTERLEAVE
+29: CHOICE
+30: ATTRIBUTE "chart:repeated",
+31: REF 'positiveInteger',
+32: DATA 'positiveInteger',
+30: EPSILON
+29: CHOICE
+30: ATTRIBUTE "chart:style-name",
+31: REF 'styleNameRef',
+32: CHOICE
+33: DATA 'NCName',
+33: EPSILON
+30: EPSILON
+29: CHOICE
+30: REF 'xml-id',
+31: ATTRIBUTE "xml:id",
+32: REF 'ID',
+33: DATA 'ID',
+30: EPSILON
+27: CHOICE
+28: REF 'chart-data-label',
+29: ELEMENT "chart:data-label",
+30: SEQUENCE
+31: REF 'chart-data-label-attlist',
+32: INTERLEAVE
+33: REF 'common-draw-position-attlist',
+34: SEQUENCE
+35: CHOICE
+36: ATTRIBUTE "svg:x",
+37: REF 'coordinate',
+38: REF 'length',
+39: DATA 'string',
+36: EPSILON
+35: CHOICE
+36: ATTRIBUTE "svg:y",
+37: REF 'coordinate',
+38: REF 'length',
+39: DATA 'string',
+36: EPSILON
+33: CHOICE
+34: ATTRIBUTE "chart:style-name",
+35: REF 'styleNameRef',
+36: CHOICE
+37: DATA 'NCName',
+37: EPSILON
+34: EPSILON
+31: CHOICE
+32: REF 'text-p',
+32: EPSILON
+28: EPSILON
+23: EPSILON
+22: CHOICE
+23: REF 'chart-data-label',
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-gain-marker',
+19: ELEMENT "chart:stock-gain-marker",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-loss-marker',
+19: ELEMENT "chart:stock-loss-marker",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-stock-range-line',
+19: ELEMENT "chart:stock-range-line",
+20: REF 'common-stock-marker-attlist',
+21: CHOICE
+22: ATTRIBUTE "chart:style-name",
+23: REF 'styleNameRef',
+24: CHOICE
+25: DATA 'NCName',
+25: EPSILON
+22: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-wall',
+19: ELEMENT "chart:wall",
+20: REF 'chart-wall-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "chart:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+18: EPSILON
+17: CHOICE
+18: REF 'chart-floor',
+19: ELEMENT "chart:floor",
+20: REF 'chart-floor-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "svg:width",
+24: REF 'length',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "chart:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+18: EPSILON
+14: CHOICE
+15: REF 'table-table',
+15: EPSILON
+10: REF 'office-chart-content-epilogue',
+11: REF 'table-functions',
+12: SEQUENCE
+13: CHOICE
+14: REF 'table-named-expressions',
+14: EPSILON
+13: CHOICE
+14: REF 'table-database-ranges',
+14: EPSILON
+13: CHOICE
+14: REF 'table-data-pilot-tables',
+14: EPSILON
+13: CHOICE
+14: REF 'table-consolidation',
+14: EPSILON
+13: CHOICE
+14: REF 'table-dde-links',
+14: EPSILON
+8: ELEMENT "office:image",
+9: SEQUENCE
+10: REF 'office-image-attlist',
+11: EPSILON
+10: REF 'office-image-content-prelude',
+11: EPSILON
+10: REF 'office-image-content-main',
+11: REF 'draw-frame',
+10: REF 'office-image-content-epilogue',
+11: EPSILON
+8: REF 'office-database',
+9: ELEMENT "office:database",
+10: SEQUENCE
+11: REF 'db-data-source',
+12: ELEMENT "db:data-source",
+13: SEQUENCE
+14: REF 'db-data-source-attlist',
+15: EPSILON
+14: REF 'db-connection-data',
+15: ELEMENT "db:connection-data",
+16: SEQUENCE
+17: REF 'db-connection-data-attlist',
+18: EPSILON
+17: CHOICE
+18: REF 'db-database-description',
+19: ELEMENT "db:database-description",
+20: SEQUENCE
+21: REF 'db-database-description-attlist',
+22: EPSILON
+21: CHOICE
+22: REF 'db-file-based-database',
+23: ELEMENT "db:file-based-database",
+24: REF 'db-file-based-database-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "xlink:type",
+27: VALUE 'simple',
+26: ATTRIBUTE "xlink:href",
+27: REF 'anyIRI',
+28: DATA 'anyURI',
+26: ATTRIBUTE "db:media-type",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "db:extension",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+22: REF 'db-server-database',
+23: ELEMENT "db:server-database",
+24: REF 'db-server-database-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "db:type",
+27: REF 'namespacedToken',
+28: DATA 'QName',
+26: CHOICE
+27: REF 'db-host-and-port',
+28: SEQUENCE
+29: ATTRIBUTE "db:hostname",
+30: REF 'string',
+31: DATA 'string',
+29: CHOICE
+30: ATTRIBUTE "db:port",
+31: REF 'positiveInteger',
+32: DATA 'positiveInteger',
+30: EPSILON
+27: REF 'db-local-socket-name',
+28: CHOICE
+29: ATTRIBUTE "db:local-socket",
+30: REF 'string',
+31: DATA 'string',
+29: EPSILON
+26: CHOICE
+27: ATTRIBUTE "db:database-name",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+18: REF 'db-connection-resource',
+19: ELEMENT "db:connection-resource",
+20: REF 'db-connection-resource-attlist',
+21: SEQUENCE
+22: ATTRIBUTE "xlink:type",
+23: VALUE 'simple',
+22: ATTRIBUTE "xlink:href",
+23: REF 'anyIRI',
+24: DATA 'anyURI',
+22: CHOICE
+23: ATTRIBUTE "xlink:show",
+24: VALUE 'none',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "xlink:actuate",
+24: VALUE 'onRequest',
+23: EPSILON
+17: CHOICE
+18: REF 'db-login',
+19: ELEMENT "db:login",
+20: REF 'db-login-attlist',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "db:user-name",
+24: REF 'string',
+25: DATA 'string',
+23: ATTRIBUTE "db:use-system-user",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "db:is-password-required",
+24: REF 'boolean',
+25: CHOICE
+26: VALUE 'true',
+26: VALUE 'false',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "db:login-timeout",
+24: REF 'positiveInteger',
+25: DATA 'positiveInteger',
+23: EPSILON
+18: EPSILON
+14: CHOICE
+15: REF 'db-driver-settings',
+16: ELEMENT "db:driver-settings",
+17: SEQUENCE
+18: REF 'db-driver-settings-attlist',
+19: INTERLEAVE
+20: REF 'db-show-deleted',
+21: CHOICE
+22: ATTRIBUTE "db:show-deleted",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:system-driver-settings",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:base-dn",
+22: REF 'string',
+23: DATA 'string',
+21: EPSILON
+20: REF 'db-is-first-row-header-line',
+21: CHOICE
+22: ATTRIBUTE "db:is-first-row-header-line",
+23: REF 'boolean',
+24: CHOICE
+25: VALUE 'true',
+25: VALUE 'false',
+22: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:parameter-name-substitution",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+18: CHOICE
+19: REF 'db-auto-increment',
+20: ELEMENT "db:auto-increment",
+21: REF 'db-auto-increment-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "db:additional-column-statement",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "db:row-retrieving-statement",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'db-delimiter',
+20: ELEMENT "db:delimiter",
+21: REF 'db-delimiter-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "db:field",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "db:string",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "db:decimal",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "db:thousand",
+25: REF 'string',
+26: DATA 'string',
+24: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'db-character-set',
+20: ELEMENT "db:character-set",
+21: REF 'db-character-set-attlist',
+22: CHOICE
+23: ATTRIBUTE "db:encoding",
+24: REF 'textEncoding',
+25: DATA 'string',
+23: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'db-table-settings',
+20: ELEMENT "db:table-settings",
+21: CHOICE
+22: ONEOREMORE
+23: REF 'db-table-setting',
+24: ELEMENT "db:table-setting",
+25: SEQUENCE
+26: REF 'db-table-setting-attlist',
+27: SEQUENCE
+28: REF 'db-is-first-row-header-line',
+29: CHOICE
+30: ATTRIBUTE "db:is-first-row-header-line",
+31: REF 'boolean',
+32: CHOICE
+33: VALUE 'true',
+33: VALUE 'false',
+30: EPSILON
+28: REF 'db-show-deleted',
+29: CHOICE
+30: ATTRIBUTE "db:show-deleted",
+31: REF 'boolean',
+32: CHOICE
+33: VALUE 'true',
+33: VALUE 'false',
+30: EPSILON
+26: CHOICE
+27: REF 'db-delimiter',
+27: EPSILON
+26: CHOICE
+27: REF 'db-character-set',
+27: EPSILON
+22: EPSILON
+19: EPSILON
+15: EPSILON
+14: CHOICE
+15: REF 'db-application-connection-settings',
+16: ELEMENT "db:application-connection-settings",
+17: SEQUENCE
+18: REF 'db-application-connection-settings-attlist',
+19: INTERLEAVE
+20: CHOICE
+21: ATTRIBUTE "db:is-table-name-length-limited",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:enable-sql92-check",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:append-table-alias-name",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:ignore-driver-privileges",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:boolean-comparison-mode",
+22: CHOICE
+23: VALUE 'equal-integer',
+23: VALUE 'is-boolean',
+23: VALUE 'equal-boolean',
+23: VALUE 'equal-use-only-zero',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:use-catalog",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:max-row-count",
+22: REF 'integer',
+23: DATA 'integer',
+21: EPSILON
+20: CHOICE
+21: ATTRIBUTE "db:suppress-version-columns",
+22: REF 'boolean',
+23: CHOICE
+24: VALUE 'true',
+24: VALUE 'false',
+21: EPSILON
+18: CHOICE
+19: REF 'db-table-filter',
+20: ELEMENT "db:table-filter",
+21: SEQUENCE
+22: REF 'db-table-filter-attlist',
+23: EPSILON
+22: CHOICE
+23: REF 'db-table-include-filter',
+24: ELEMENT "db:table-include-filter",
+25: SEQUENCE
+26: REF 'db-table-include-filter-attlist',
+27: EPSILON
+26: ONEOREMORE
+27: REF 'db-table-filter-pattern',
+28: ELEMENT "db:table-filter-pattern",
+29: SEQUENCE
+30: REF 'db-table-filter-pattern-attlist',
+31: EPSILON
+30: REF 'string',
+31: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: REF 'db-table-exclude-filter',
+24: ELEMENT "db:table-exclude-filter",
+25: SEQUENCE
+26: REF 'db-table-exclude-filter-attlist',
+27: EPSILON
+26: ONEOREMORE
+27: REF 'db-table-filter-pattern',
+23: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'db-table-type-filter',
+20: ELEMENT "db:table-type-filter",
+21: SEQUENCE
+22: REF 'db-table-type-filter-attlist',
+23: EPSILON
+22: CHOICE
+23: ONEOREMORE
+24: REF 'db-table-type',
+25: ELEMENT "db:table-type",
+26: SEQUENCE
+27: REF 'db-table-type-attlist',
+28: EPSILON
+27: REF 'string',
+28: DATA 'string',
+23: EPSILON
+19: EPSILON
+18: CHOICE
+19: REF 'db-data-source-settings',
+20: ELEMENT "db:data-source-settings",
+21: SEQUENCE
+22: REF 'db-data-source-settings-attlist',
+23: EPSILON
+22: ONEOREMORE
+23: REF 'db-data-source-setting',
+24: ELEMENT "db:data-source-setting",
+25: SEQUENCE
+26: REF 'db-data-source-setting-attlist',
+27: INTERLEAVE
+28: CHOICE
+29: ATTRIBUTE "db:data-source-setting-is-list",
+30: REF 'boolean',
+31: CHOICE
+32: VALUE 'true',
+32: VALUE 'false',
+29: EPSILON
+28: ATTRIBUTE "db:data-source-setting-name",
+29: REF 'string',
+30: DATA 'string',
+28: ATTRIBUTE "db:data-source-setting-type",
+29: REF 'db-data-source-setting-types',
+30: CHOICE
+31: VALUE 'boolean',
+31: VALUE 'short',
+31: VALUE 'int',
+31: VALUE 'long',
+31: VALUE 'double',
+31: VALUE 'string',
+26: ONEOREMORE
+27: REF 'db-data-source-setting-value',
+28: ELEMENT "db:data-source-setting-value",
+29: SEQUENCE
+30: REF 'db-data-source-setting-value-attlist',
+31: EPSILON
+30: REF 'string',
+31: DATA 'string',
+19: EPSILON
+15: EPSILON
+11: CHOICE
+12: REF 'db-forms',
+13: ELEMENT "db:forms",
+14: SEQUENCE
+15: REF 'db-forms-attlist',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: CHOICE
+18: REF 'db-component',
+19: ELEMENT "db:component",
+20: SEQUENCE
+21: REF 'db-component-attlist',
+22: INTERLEAVE
+23: CHOICE
+24: SEQUENCE
+25: ATTRIBUTE "xlink:type",
+26: VALUE 'simple',
+25: ATTRIBUTE "xlink:href",
+26: REF 'anyIRI',
+27: DATA 'anyURI',
+25: CHOICE
+26: ATTRIBUTE "xlink:show",
+27: VALUE 'none',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "xlink:actuate",
+27: VALUE 'onRequest',
+26: EPSILON
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "db:as-template",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: REF 'common-db-object-name',
+22: ATTRIBUTE "db:name",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-db-object-title',
+22: CHOICE
+23: ATTRIBUTE "db:title",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-db-object-description',
+22: CHOICE
+23: ATTRIBUTE "db:description",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: CHOICE
+22: REF 'office-document',
+22: REF 'math-math',
+22: EPSILON
+18: REF 'db-component-collection',
+19: ELEMENT "db:component-collection",
+20: SEQUENCE
+21: REF 'db-component-collection-attlist',
+22: EPSILON
+21: REF 'common-db-object-name',
+22: ATTRIBUTE "db:name",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-db-object-title',
+22: CHOICE
+23: ATTRIBUTE "db:title",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-db-object-description',
+22: CHOICE
+23: ATTRIBUTE "db:description",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'db-component',
+24: REF 'db-component-collection',
+22: EPSILON
+16: EPSILON
+12: EPSILON
+11: CHOICE
+12: REF 'db-reports',
+13: ELEMENT "db:reports",
+14: SEQUENCE
+15: REF 'db-reports-attlist',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: CHOICE
+18: REF 'db-component',
+18: REF 'db-component-collection',
+16: EPSILON
+12: EPSILON
+11: CHOICE
+12: REF 'db-queries',
+13: ELEMENT "db:queries",
+14: SEQUENCE
+15: REF 'db-queries-attlist',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: CHOICE
+18: REF 'db-query',
+19: ELEMENT "db:query",
+20: SEQUENCE
+21: REF 'db-query-attlist',
+22: INTERLEAVE
+23: ATTRIBUTE "db:command",
+24: REF 'string',
+25: DATA 'string',
+23: CHOICE
+24: ATTRIBUTE "db:escape-processing",
+25: REF 'boolean',
+26: CHOICE
+27: VALUE 'true',
+27: VALUE 'false',
+24: EPSILON
+21: REF 'common-db-object-name',
+22: ATTRIBUTE "db:name",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-db-object-title',
+22: CHOICE
+23: ATTRIBUTE "db:title",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-db-object-description',
+22: CHOICE
+23: ATTRIBUTE "db:description",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-db-table-style-name',
+22: INTERLEAVE
+23: CHOICE
+24: ATTRIBUTE "db:style-name",
+25: REF 'styleNameRef',
+26: CHOICE
+27: DATA 'NCName',
+27: EPSILON
+24: EPSILON
+23: CHOICE
+24: ATTRIBUTE "db:default-row-style-name",
+25: REF 'styleNameRef',
+26: CHOICE
+27: DATA 'NCName',
+27: EPSILON
+24: EPSILON
+21: CHOICE
+22: REF 'db-order-statement',
+23: ELEMENT "db:order-statement",
+24: SEQUENCE
+25: REF 'db-command',
+26: ATTRIBUTE "db:command",
+27: REF 'string',
+28: DATA 'string',
+25: REF 'db-apply-command',
+26: CHOICE
+27: ATTRIBUTE "db:apply-command",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'db-filter-statement',
+23: ELEMENT "db:filter-statement",
+24: SEQUENCE
+25: REF 'db-command',
+26: ATTRIBUTE "db:command",
+27: REF 'string',
+28: DATA 'string',
+25: REF 'db-apply-command',
+26: CHOICE
+27: ATTRIBUTE "db:apply-command",
+28: REF 'boolean',
+29: CHOICE
+30: VALUE 'true',
+30: VALUE 'false',
+27: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'db-columns',
+23: ELEMENT "db:columns",
+24: SEQUENCE
+25: REF 'db-columns-attlist',
+26: EPSILON
+25: ONEOREMORE
+26: REF 'db-column',
+27: ELEMENT "db:column",
+28: SEQUENCE
+29: REF 'db-column-attlist',
+30: INTERLEAVE
+31: CHOICE
+32: ATTRIBUTE "db:visible",
+33: REF 'boolean',
+34: CHOICE
+35: VALUE 'true',
+35: VALUE 'false',
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "db:style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+31: CHOICE
+32: ATTRIBUTE "db:default-cell-style-name",
+33: REF 'styleNameRef',
+34: CHOICE
+35: DATA 'NCName',
+35: EPSILON
+32: EPSILON
+29: REF 'common-db-object-name',
+30: ATTRIBUTE "db:name",
+31: REF 'string',
+32: DATA 'string',
+29: REF 'common-db-object-title',
+30: CHOICE
+31: ATTRIBUTE "db:title",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+29: REF 'common-db-object-description',
+30: CHOICE
+31: ATTRIBUTE "db:description",
+32: REF 'string',
+33: DATA 'string',
+31: EPSILON
+29: REF 'common-db-default-value',
+30: CHOICE
+31: REF 'common-value-and-type-attlist',
+32: CHOICE
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'float',
+34: ATTRIBUTE "office:value",
+35: REF 'double',
+36: DATA 'double',
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'percentage',
+34: ATTRIBUTE "office:value",
+35: REF 'double',
+36: DATA 'double',
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'currency',
+34: ATTRIBUTE "office:value",
+35: REF 'double',
+36: DATA 'double',
+34: CHOICE
+35: ATTRIBUTE "office:currency",
+36: REF 'string',
+37: DATA 'string',
+35: EPSILON
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'date',
+34: ATTRIBUTE "office:date-value",
+35: REF 'dateOrDateTime',
+36: CHOICE
+37: DATA 'date',
+37: DATA 'dateTime',
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'time',
+34: ATTRIBUTE "office:time-value",
+35: REF 'duration',
+36: DATA 'duration',
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'boolean',
+34: ATTRIBUTE "office:boolean-value",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+33: SEQUENCE
+34: ATTRIBUTE "office:value-type",
+35: VALUE 'string',
+34: CHOICE
+35: ATTRIBUTE "office:string-value",
+36: REF 'string',
+37: DATA 'string',
+35: EPSILON
+31: EPSILON
+22: EPSILON
+21: CHOICE
+22: REF 'db-update-table',
+23: ELEMENT "db:update-table",
+24: REF 'common-db-table-name-attlist',
+25: INTERLEAVE
+26: ATTRIBUTE "db:name",
+27: REF 'string',
+28: DATA 'string',
+26: CHOICE
+27: ATTRIBUTE "db:catalog-name",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+26: CHOICE
+27: ATTRIBUTE "db:schema-name",
+28: REF 'string',
+29: DATA 'string',
+27: EPSILON
+22: EPSILON
+18: REF 'db-query-collection',
+19: ELEMENT "db:query-collection",
+20: SEQUENCE
+21: REF 'db-query-collection-attlist',
+22: EPSILON
+21: REF 'common-db-object-name',
+22: ATTRIBUTE "db:name",
+23: REF 'string',
+24: DATA 'string',
+21: REF 'common-db-object-title',
+22: CHOICE
+23: ATTRIBUTE "db:title",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: REF 'common-db-object-description',
+22: CHOICE
+23: ATTRIBUTE "db:description",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+21: CHOICE
+22: ONEOREMORE
+23: CHOICE
+24: REF 'db-query',
+24: REF 'db-query-collection',
+22: EPSILON
+16: EPSILON
+12: EPSILON
+11: CHOICE
+12: REF 'db-table-presentations',
+13: ELEMENT "db:table-representations",
+14: SEQUENCE
+15: REF 'db-table-presentations-attlist',
+16: EPSILON
+15: CHOICE
+16: ONEOREMORE
+17: REF 'db-table-presentation',
+18: ELEMENT "db:table-representation",
+19: SEQUENCE
+20: REF 'db-table-presentation-attlist',
+21: EPSILON
+20: REF 'common-db-table-name-attlist',
+21: INTERLEAVE
+22: ATTRIBUTE "db:name",
+23: REF 'string',
+24: DATA 'string',
+22: CHOICE
+23: ATTRIBUTE "db:catalog-name",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "db:schema-name",
+24: REF 'string',
+25: DATA 'string',
+23: EPSILON
+20: REF 'common-db-object-title',
+21: CHOICE
+22: ATTRIBUTE "db:title",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: REF 'common-db-object-description',
+21: CHOICE
+22: ATTRIBUTE "db:description",
+23: REF 'string',
+24: DATA 'string',
+22: EPSILON
+20: REF 'common-db-table-style-name',
+21: INTERLEAVE
+22: CHOICE
+23: ATTRIBUTE "db:style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+22: CHOICE
+23: ATTRIBUTE "db:default-row-style-name",
+24: REF 'styleNameRef',
+25: CHOICE
+26: DATA 'NCName',
+26: EPSILON
+23: EPSILON
+20: CHOICE
+21: REF 'db-order-statement',
+21: EPSILON
+20: CHOICE
+21: REF 'db-filter-statement',
+21: EPSILON
+20: CHOICE
+21: REF 'db-columns',
+21: EPSILON
+16: EPSILON
+12: EPSILON
+11: CHOICE
+12: REF 'db-schema-definition',
+13: ELEMENT "db:schema-definition",
+14: SEQUENCE
+15: REF 'db-schema-definition-attlist',
+16: EPSILON
+15: REF 'db-table-definitions',
+16: ELEMENT "db:table-definitions",
+17: SEQUENCE
+18: REF 'db-table-definitions-attlist',
+19: EPSILON
+18: CHOICE
+19: ONEOREMORE
+20: REF 'db-table-definition',
+21: ELEMENT "db:table-definition",
+22: SEQUENCE
+23: REF 'common-db-table-name-attlist',
+24: INTERLEAVE
+25: ATTRIBUTE "db:name",
+26: REF 'string',
+27: DATA 'string',
+25: CHOICE
+26: ATTRIBUTE "db:catalog-name",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+25: CHOICE
+26: ATTRIBUTE "db:schema-name",
+27: REF 'string',
+28: DATA 'string',
+26: EPSILON
+23: REF 'db-table-definition-attlist',
+24: CHOICE
+25: ATTRIBUTE "db:type",
+26: REF 'string',
+27: DATA 'string',
+25: EPSILON
+23: REF 'db-column-definitions',
+24: ELEMENT "db:column-definitions",
+25: SEQUENCE
+26: REF 'db-column-definitions-attlist',
+27: EPSILON
+26: ONEOREMORE
+27: REF 'db-column-definition',
+28: ELEMENT "db:column-definition",
+29: SEQUENCE
+30: REF 'db-column-definition-attlist',
+31: INTERLEAVE
+32: ATTRIBUTE "db:name",
+33: REF 'string',
+34: DATA 'string',
+32: CHOICE
+33: ATTRIBUTE "db:data-type",
+34: REF 'db-data-types',
+35: CHOICE
+36: VALUE 'bit',
+36: VALUE 'boolean',
+36: VALUE 'tinyint',
+36: VALUE 'smallint',
+36: VALUE 'integer',
+36: VALUE 'bigint',
+36: VALUE 'float',
+36: VALUE 'real',
+36: VALUE 'double',
+36: VALUE 'numeric',
+36: VALUE 'decimal',
+36: VALUE 'char',
+36: VALUE 'varchar',
+36: VALUE 'longvarchar',
+36: VALUE 'date',
+36: VALUE 'time',
+36: VALUE 'timestmp',
+36: VALUE 'binary',
+36: VALUE 'varbinary',
+36: VALUE 'longvarbinary',
+36: VALUE 'sqlnull',
+36: VALUE 'other',
+36: VALUE 'object',
+36: VALUE 'distinct',
+36: VALUE 'struct',
+36: VALUE 'array',
+36: VALUE 'blob',
+36: VALUE 'clob',
+36: VALUE 'ref',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "db:type-name",
+34: REF 'string',
+35: DATA 'string',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "db:precision",
+34: REF 'positiveInteger',
+35: DATA 'positiveInteger',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "db:scale",
+34: REF 'positiveInteger',
+35: DATA 'positiveInteger',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "db:is-nullable",
+34: CHOICE
+35: VALUE 'no-nulls',
+35: VALUE 'nullable',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "db:is-empty-allowed",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+32: CHOICE
+33: ATTRIBUTE "db:is-autoincrement",
+34: REF 'boolean',
+35: CHOICE
+36: VALUE 'true',
+36: VALUE 'false',
+33: EPSILON
+30: REF 'common-db-default-value',
+31: CHOICE
+32: REF 'common-value-and-type-attlist',
+33: CHOICE
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'float',
+35: ATTRIBUTE "office:value",
+36: REF 'double',
+37: DATA 'double',
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'percentage',
+35: ATTRIBUTE "office:value",
+36: REF 'double',
+37: DATA 'double',
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'currency',
+35: ATTRIBUTE "office:value",
+36: REF 'double',
+37: DATA 'double',
+35: CHOICE
+36: ATTRIBUTE "office:currency",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'date',
+35: ATTRIBUTE "office:date-value",
+36: REF 'dateOrDateTime',
+37: CHOICE
+38: DATA 'date',
+38: DATA 'dateTime',
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'time',
+35: ATTRIBUTE "office:time-value",
+36: REF 'duration',
+37: DATA 'duration',
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'boolean',
+35: ATTRIBUTE "office:boolean-value",
+36: REF 'boolean',
+37: CHOICE
+38: VALUE 'true',
+38: VALUE 'false',
+34: SEQUENCE
+35: ATTRIBUTE "office:value-type",
+36: VALUE 'string',
+35: CHOICE
+36: ATTRIBUTE "office:string-value",
+37: REF 'string',
+38: DATA 'string',
+36: EPSILON
+32: EPSILON
+23: CHOICE
+24: REF 'db-keys',
+25: ELEMENT "db:keys",
+26: SEQUENCE
+27: REF 'db-keys-attlist',
+28: EPSILON
+27: ONEOREMORE
+28: REF 'db-key',
+29: ELEMENT "db:key",
+30: SEQUENCE
+31: REF 'db-key-attlist',
+32: INTERLEAVE
+33: CHOICE
+34: ATTRIBUTE "db:name",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+33: ATTRIBUTE "db:type",
+34: CHOICE
+35: VALUE 'primary',
+35: VALUE 'unique',
+35: VALUE 'foreign',
+33: CHOICE
+34: ATTRIBUTE "db:referenced-table-name",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "db:update-rule",
+35: CHOICE
+36: VALUE 'cascade',
+36: VALUE 'restrict',
+36: VALUE 'set-null',
+36: VALUE 'no-action',
+36: VALUE 'set-default',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "db:delete-rule",
+35: CHOICE
+36: VALUE 'cascade',
+36: VALUE 'restrict',
+36: VALUE 'set-null',
+36: VALUE 'no-action',
+36: VALUE 'set-default',
+34: EPSILON
+31: ONEOREMORE
+32: REF 'db-key-columns',
+33: ELEMENT "db:key-columns",
+34: SEQUENCE
+35: REF 'db-key-columns-attlist',
+36: EPSILON
+35: ONEOREMORE
+36: REF 'db-key-column',
+37: ELEMENT "db:key-column",
+38: REF 'db-key-column-attlist',
+39: INTERLEAVE
+40: CHOICE
+41: ATTRIBUTE "db:name",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+40: CHOICE
+41: ATTRIBUTE "db:related-column-name",
+42: REF 'string',
+43: DATA 'string',
+41: EPSILON
+24: EPSILON
+23: CHOICE
+24: REF 'db-indices',
+25: ELEMENT "db:indices",
+26: SEQUENCE
+27: REF 'db-indices-attlist',
+28: EPSILON
+27: ONEOREMORE
+28: REF 'db-index',
+29: ELEMENT "db:index",
+30: SEQUENCE
+31: REF 'db-index-attlist',
+32: INTERLEAVE
+33: ATTRIBUTE "db:name",
+34: REF 'string',
+35: DATA 'string',
+33: CHOICE
+34: ATTRIBUTE "db:catalog-name",
+35: REF 'string',
+36: DATA 'string',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "db:is-unique",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: EPSILON
+33: CHOICE
+34: ATTRIBUTE "db:is-clustered",
+35: REF 'boolean',
+36: CHOICE
+37: VALUE 'true',
+37: VALUE 'false',
+34: EPSILON
+31: ONEOREMORE
+32: REF 'db-index-columns',
+33: ELEMENT "db:index-columns",
+34: ONEOREMORE
+35: REF 'db-index-column',
+36: ELEMENT "db:index-column",
+37: REF 'db-index-column-attlist',
+38: INTERLEAVE
+39: ATTRIBUTE "db:name",
+40: REF 'string',
+41: DATA 'string',
+39: CHOICE
+40: ATTRIBUTE "db:is-ascending",
+41: REF 'boolean',
+42: CHOICE
+43: VALUE 'true',
+43: VALUE 'false',
+40: EPSILON
+24: EPSILON
+19: EPSILON
+12: EPSILON
+1: REF 'office-document-content',
+2: ELEMENT "office:document-content",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: INTERLEAVE
+6: ATTRIBUTE "office:version",
+7: VALUE '1.2',
+6: CHOICE
+7: ATTRIBUTE "grddl:transformation",
+8: LIST
+9: CHOICE
+10: ONEOREMORE
+11: REF 'anyIRI',
+12: DATA 'anyURI',
+10: EPSILON
+7: EPSILON
+4: REF 'office-scripts',
+5: CHOICE
+4: REF 'office-font-face-decls',
+5: CHOICE
+4: REF 'office-automatic-styles',
+5: CHOICE
+4: REF 'office-body',
+1: REF 'office-document-styles',
+2: ELEMENT "office:document-styles",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: INTERLEAVE
+6: ATTRIBUTE "office:version",
+7: VALUE '1.2',
+6: CHOICE
+7: ATTRIBUTE "grddl:transformation",
+8: LIST
+9: CHOICE
+10: ONEOREMORE
+11: REF 'anyIRI',
+12: DATA 'anyURI',
+10: EPSILON
+7: EPSILON
+4: REF 'office-font-face-decls',
+5: CHOICE
+4: REF 'office-styles',
+5: CHOICE
+4: REF 'office-automatic-styles',
+5: CHOICE
+4: REF 'office-master-styles',
+5: CHOICE
+1: REF 'office-document-meta',
+2: ELEMENT "office:document-meta",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: INTERLEAVE
+6: ATTRIBUTE "office:version",
+7: VALUE '1.2',
+6: CHOICE
+7: ATTRIBUTE "grddl:transformation",
+8: LIST
+9: CHOICE
+10: ONEOREMORE
+11: REF 'anyIRI',
+12: DATA 'anyURI',
+10: EPSILON
+7: EPSILON
+4: REF 'office-meta',
+5: CHOICE
+1: REF 'office-document-settings',
+2: ELEMENT "office:document-settings",
+3: SEQUENCE
+4: REF 'office-document-common-attrs',
+5: INTERLEAVE
+6: ATTRIBUTE "office:version",
+7: VALUE '1.2',
+6: CHOICE
+7: ATTRIBUTE "grddl:transformation",
+8: LIST
+9: CHOICE
+10: ONEOREMORE
+11: REF 'anyIRI',
+12: DATA 'anyURI',
+10: EPSILON
+7: EPSILON
+4: REF 'office-settings',
+5: CHOICE
diff --git a/trunk/legal/LICENSE b/trunk/legal/LICENSE
new file mode 100644
index 0000000..57bc88a
--- /dev/null
+++ b/trunk/legal/LICENSE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/trunk/legal/NOTICE b/trunk/legal/NOTICE
new file mode 100644
index 0000000..b602d3f
--- /dev/null
+++ b/trunk/legal/NOTICE
@@ -0,0 +1,8 @@
+Apache ODF Toolkit
+
+Copyright 2011 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions copyright IBM, 2009-2011.  All rights reserved.
diff --git a/trunk/odfdom/LICENSE.txt b/trunk/odfdom/LICENSE.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/trunk/odfdom/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/trunk/odfdom/README.txt b/trunk/odfdom/README.txt
new file mode 100644
index 0000000..eb74ee0
--- /dev/null
+++ b/trunk/odfdom/README.txt
@@ -0,0 +1,49 @@
+*************************************************************
+* ODFDOM Java Library                                       *
+*                                                           *
+*************************************************************
+
+
+About ODFDOM
+-------------
+
+ODFDOM is an OpenDocument Format (ODF) framework. Its purpose 
+is to provide an easy common way to create, access and 
+manipulate ODF files, without requiring detailed knowledge of
+the ODF specification. It is designed to provide the ODF
+developer community with an easy lightwork programming API
+portable to any object-oriented language.
+
+The current reference implementation is written in Java.
+
+
+Documentation
+--------------
+
+The latest release notes and a summary of API changes (if any) are available
+online at the project's Wiki page:
+    http://odftoolkit.org/projects/odfdom/pages/ReleaseNotes
+
+In general, the Wiki page is a great place to start when looking for online
+documentation and other information about the odfdom project.
+    http://odftoolkit.org/projects/odfdom/pages/Home
+
+API documentation (Javadoc) can be downloaded from the project's download area:
+    http://odftoolkit.org/projects/odfdom/downloads
+
+The Javadoc can also be viewed online and is available for each version, e.g.
+    http://odfdom.odftoolkit.org/0.8.6/docs/api/
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
+
+Installation
+-------------
+
+Just put the file odfdom.jar in your classpath. You will
+need Apache Xerces-J as well. Get it from
+    http://xml.apache.org/dist/xerces-j/
diff --git a/trunk/odfdom/pom.xml b/trunk/odfdom/pom.xml
new file mode 100644
index 0000000..7c5d6bd
--- /dev/null
+++ b/trunk/odfdom/pom.xml
@@ -0,0 +1,531 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.odftoolkit</groupId>
+		<artifactId>odftoolkit</artifactId>
+		<version>0.6.1-incubating</version>
+	</parent>
+  
+	<artifactId>odfdom-java</artifactId>
+	<version>0.8.10-incubating</version>
+	<packaging>jar</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>taglets</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>xerces</groupId>
+			<artifactId>xercesImpl</artifactId>
+		</dependency>
+        <dependency>
+            <groupId>xml-apis</groupId>
+            <artifactId>xml-apis</artifactId>
+        </dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jena</groupId>
+			<artifactId>jena-core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jena</groupId>
+			<artifactId>jena-core</artifactId>
+			<classifier>tests</classifier>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>net.rootdev</groupId>
+			<artifactId>java-rdfa</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-validator</groupId>
+			<artifactId>commons-validator</artifactId>
+		</dependency>
+	</dependencies>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss</maven.build.timestamp.format>
+	</properties>
+
+	<!-- Build Settings -->
+	<build>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-webdav-jackrabbit</artifactId>
+				<version>1.0-beta-7</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+					<meminitial>512m</meminitial>
+					<maxmem>1024m</maxmem>
+					<showDeprecation>true</showDeprecation>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.3.1</version>
+				<configuration>
+					<archive>
+						<index>true</index>
+						<manifest>
+							<mainClass>org.odftoolkit.odfdom.JarManifest</mainClass>
+						</manifest>
+						<manifestEntries>
+							<version>${project.version}</version>
+						</manifestEntries>
+						<manifestSections>
+							<manifestSection>
+								<name>ODFDOM</name>
+								<manifestEntries>
+									<ODFDOM-Name>odfdom</ODFDOM-Name>
+									<ODFDOM-Version>${project.version}</ODFDOM-Version>
+									<ODFDOM-Website>http://incubator.apache.org/odftoolkit/odfdom/index.html</ODFDOM-Website>
+									<ODFDOM-Built-Date>${build.timestamp}</ODFDOM-Built-Date>
+									<ODFDOM-Supported-Odf-Version>1.2</ODFDOM-Supported-Odf-Version>
+								</manifestEntries>
+							</manifestSection>
+						</manifestSections>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-release-plugin</artifactId>
+				<version>2.1</version>
+				<configuration>
+					<!-- Workaround for http://jira.codehaus.org/browse/MGPG-9 -->
+					<mavenExecutorId>forked-path</mavenExecutorId>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<!-- Explizit version required for fix on systemPropertyVariables -->
+				<version>2.6</version>
+				<configuration>
+					<forkMode>pertest</forkMode>
+					<argLine>-Xms512m -Xmx512m</argLine>
+					<systemPropertyVariables>
+						<odfdom.version>${project.version}</odfdom.version>
+						<odfdom.timestamp>${build.timestamp}</odfdom.timestamp>
+						<org.odftoolkit.odfdom.validation>org.odftoolkit.odfdom.pkg.DefaultErrorHandler</org.odftoolkit.odfdom.validation>
+					</systemPropertyVariables>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<doctitle>ODFDOM</doctitle>
+					<minmemory>1024m</minmemory>
+					<maxmemory>1024m</maxmemory>
+					<links>
+						<link>http://download.oracle.com/javase/6/docs/api/</link>
+						<link>http://xerces.apache.org/xerces-j/apiDocs/</link>
+						<link>http://simple.odftoolkit.org/javadoc/</link>
+					</links>
+					<splitindex>true</splitindex>
+					<windowtitle>ODFDOM API v${project.version} - http://incubator.apache.org/odftoolkit/</windowtitle>
+					<taglets>
+						<taglet>
+							<tagletClass>org.odftoolkit.odfdom.taglet.OdfElementTaglet</tagletClass>
+						</taglet>
+						<taglet>
+							<tagletClass>org.odftoolkit.odfdom.taglet.OdfAttributeTaglet</tagletClass>
+						</taglet>
+						<taglet>
+							<tagletClass>org.odftoolkit.odfdom.taglet.OdfDatatypeTaglet</tagletClass>
+						</taglet>
+					</taglets>
+					<tagletArtifact>
+						<groupId>${project.groupId}</groupId>
+						<artifactId>taglets</artifactId>
+						<version>${project.version}</version>
+					</tagletArtifact>
+				</configuration>
+				<executions>
+					<execution>
+						<id>attach-javadocs</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-source-plugin</artifactId>
+				<version>2.1.2</version>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<configuration>
+					<descriptorRefs>
+						<descriptorRef>jar-with-dependencies</descriptorRef>
+					</descriptorRefs>
+				</configuration>
+				<executions>
+					<execution>
+						<id>single</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.rat</groupId>
+				<artifactId>apache-rat-plugin</artifactId>
+				<configuration>
+					<excludes>
+						<exclude>src/main/resources/**</exclude>
+						<exclude>src/test/resources/**</exclude>
+						<exclude>src/main/javadoc/doc-files/OpenDocument-v1.2-part1.html</exclude>
+						<exclude>src/main/javadoc/doc-files/OpenDocument-v1.2-part3.html</exclude>
+						<exclude>src/codegen/resources/dom/*.rng</exclude>
+						<exclude>src/codegen/resources/pkg/*.rng</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<doctitle>ODFDOM</doctitle>
+					<minmemory>512m</minmemory>
+					<maxmemory>1024m</maxmemory>
+					<links>
+						<link>http://download.oracle.com/javase/6/docs/api/</link>
+						<link>http://xerces.apache.org/xerces-j/apiDocs/</link>
+					</links>
+					<splitindex>true</splitindex>
+					<windowtitle>ODFDOM API v${project.version} - http://incubator.apache.org/odftoolkit/</windowtitle>
+				</configuration>
+			</plugin>
+			<!-- Code Coverage Testing generated by Cobertura -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>cobertura-maven-plugin</artifactId>
+				<version>2.4</version>
+				<configuration>
+					<instrumentation>
+						<excludes>
+							<exclude>org/odftoolkit/**/*Test.class</exclude>
+						</excludes>
+					</instrumentation>
+				</configuration>
+			</plugin>
+			<!-- Reporting integration test results -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+				<version>2.5</version>
+				<reportSets>
+					<reportSet>
+						<id>integration-tests</id>
+						<reports>
+							<report>report-only</report>
+						</reports>
+						<configuration>
+							<outputName>failsafe-report</outputName>
+						</configuration>
+					</reportSet>
+				</reportSets>
+			</plugin>
+		</plugins>
+	</reporting>
+
+	<!-- More Project Information -->
+	<name>ODFDOM</name>
+	<description>
+		ODFDOM is an OpenDocument Format (ODF) framework. Its purpose
+		is to provide an easy common way to create, access and
+		manipulate ODF files, without requiring detailed knowledge of
+		the ODF specification. It is designed to provide the ODF
+		developer community with an easy lightwork programming API
+		portable to any object-oriented language.
+
+		The current reference implementation is written in Java.
+	</description>
+	<url>http://incubator.apache.org/odftoolkit/odfdom/index.html</url>
+	<inceptionYear>2008</inceptionYear>
+    
+	<licenses>
+		<license>
+			<name>Apache 2</name>
+			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+		</license>
+	</licenses>
+	<organization>
+		<name>The Apache Software Foundation</name>
+		<url>http://www.apache.org/</url>
+	</organization>
+
+	<scm>
+		<connection>scm:svn:http://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/odfdom</connection>
+		<developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/odfdom</developerConnection>
+		<url>http://svn.apache.org/viewvc/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/odfdom</url>
+	</scm>
+	<profiles>
+		<profile>
+			<id>codegen</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>wagon-maven-plugin</artifactId>
+						<version>1.0-beta-3</version>
+						<executions>
+							<execution>
+								<id>download-odf-schema-v1.2</id>
+								<phase>validate</phase>
+								<goals>
+									<goal>download-single</goal>
+								</goals>
+								<configuration>
+									<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+									<fromFile>os/OpenDocument-v1.2-os-schema.rng</fromFile>
+									<toDir>${project.build.directory}/odf-schemas</toDir>
+								</configuration>
+							</execution>
+							<execution>
+								<id>download-odf-manifest-schema-v1.2</id>
+								<phase>validate</phase>
+								<goals>
+									<goal>download-single</goal>
+								</goals>
+								<configuration>
+									<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+									<fromFile>os/OpenDocument-v1.2-os-manifest-schema.rng</fromFile>
+									<toDir>${project.build.directory}/odf-schemas</toDir>
+								</configuration>
+							</execution>
+							<execution>
+								<id>download-odf-dsig-schema-v1.2</id>
+								<phase>validate</phase>
+								<goals>
+									<goal>download-single</goal>
+								</goals>
+								<configuration>
+									<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+									<fromFile>os/OpenDocument-v1.2-os-dsig-schema.rng</fromFile>
+									<toDir>${project.build.directory}/odf-schemas</toDir>
+								</configuration>
+							</execution>
+							<execution>
+								<id>download-odf-schema-v1.1</id>
+								<phase>validate</phase>
+								<goals>
+									<goal>download-single</goal>
+								</goals>
+								<configuration>
+									<url>dav:http://docs.oasis-open.org/office/v1.1</url>
+									<fromFile>OS/OpenDocument-schema-v1.1.rng</fromFile>
+									<toDir>${project.build.directory}/odf-schemas</toDir>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>${project.groupId}</groupId>
+						<artifactId>schema2template-maven-plugin</artifactId>
+						<version>${project.version}</version>
+						<executions>
+							<execution>
+								<id>dom</id>
+								<phase>generate-sources</phase>
+								<goals>
+									<goal>codegen</goal>
+								</goals>
+								<!-- DOM LAYER CONFIGURATION -->
+								<configuration>
+									<targetRoot>${basedir}/src/main/java/</targetRoot>
+									<domResourceRoot>${basedir}/src/codegen/resources/dom/template</domResourceRoot>
+									<pkgResourceRoot>${basedir}/src/codegen/resources/pkg/template</pkgResourceRoot>
+									<odf12SchemaFile>${project.build.directory}/odf-schemas/OpenDocument-v1.2-os-schema.rng</odf12SchemaFile>
+									<odf11SchemaFile>${project.build.directory}/odf-schemas/OpenDocument-schema-v1.1.rng</odf11SchemaFile>
+									<signatureSchemaFile>${project.build.directory}/odf-schemas/OpenDocument-v1.2-os-dsig-schema.rng</signatureSchemaFile>
+									<manifestSchemaFile>${project.build.directory}/odf-schemas/OpenDocument-v1.2-os-manifest-schema.rng</manifestSchemaFile>
+									<configFile>${basedir}/src/codegen/resources/config.xml</configFile>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<!--
+		<profile>
+			<id>codegen-pkg</id>
+			<activation>
+			  <activeByDefault>true</activeByDefault>
+			</activation>
+			<build>
+				<defaultGoal>install</defaultGoal>
+				<plugins>
+					<plugin>
+						<groupId>org.odftoolkit</groupId>
+						<artifactId>maven-codegen-plugin</artifactId>
+						<version>0.8</version>
+						<executions>
+							<execution>
+								<id>pkg</id>
+								<phase>generate-sources</phase>
+								<goals>
+									<goal>codegen</goal>
+								</goals>
+								<configuration>
+									<sourceRoot>${basedir}/src/main/java</sourceRoot>
+									<schemaFile>${basedir}/src/codegen/resources/pkg/OpenDocument-manifest-schema-v1.2-draft7.rng</schemaFile>
+									<configFile>${basedir}/src/codegen/resources/pkg/config.xml</configFile>
+									<templateFile>${basedir}/src/codegen/resources/pkg/javacodetemplate.xml</templateFile>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		-->
+		<profile>
+			<id>integration-test</id>
+			<activation>
+				<property>
+					<name>integration-test</name>
+				</property>
+			</activation>
+			<build>
+				<defaultGoal>verify</defaultGoal>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-failsafe-plugin</artifactId>
+						<version>2.5</version>
+						<executions>
+							<execution>
+								<id>failsafe-it</id>
+								<phase>integration-test</phase>
+								<goals>
+									<goal>integration-test</goal>
+									<goal>verify</goal>
+								</goals>
+								<configuration>
+									<classesDirectory>${basedir}/target/odfdom*.jar</classesDirectory>
+									<systemPropertyVariables>
+										<testresourcefolder>performance</testresourcefolder>
+										<executetimes>1</executetimes>
+										<testflag>test</testflag>
+									</systemPropertyVariables>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-surefire-plugin</artifactId>
+						<!-- Explizit version required for fix on systemPropertyVariables -->
+						<version>2.6</version>
+						<configuration>
+							<systemPropertyVariables>
+								<odfdom.version>${project.version}</odfdom.version>
+								<odfdom.timestamp>${build.timestamp}</odfdom.timestamp>
+								<org.odftoolkit.odfdom.validation>true</org.odftoolkit.odfdom.validation>
+							</systemPropertyVariables>
+							<skip>true</skip>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<!-- Profile for deploying to the Sonatype repository, which
+		requires GPG signatures 
+		see
+		https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
+		https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven
+		https://issues.sonatype.org/browse/OSSRH-960
+		-->
+		<profile>
+			<id>release-sign-artifacts</id>
+			<activation>
+				<property>
+					<name>performRelease</name>
+					<value>true</value>
+				</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-gpg-plugin</artifactId>
+						<version>1.1</version>
+						<executions>
+							<execution>
+								<id>sign-artifacts</id>
+								<phase>verify</phase>
+								<goals>
+									<goal>sign</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+			<!-- <distributionManagement>
+				<site>
+					<id>odfdom</id>
+					<name>ODFDOM Java Toolkit Project</name>
+					<url>dav:https://odftoolkit.org/website/odfdom/${project.version}/odfdom</url>
+				</site>
+			</distributionManagement> -->
+		</profile>
+	</profiles>
+</project>
diff --git a/trunk/odfdom/src/codegen/resources/config.xml b/trunk/odfdom/src/codegen/resources/config.xml
new file mode 100644
index 0000000..b472c32
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/config.xml
@@ -0,0 +1,680 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<config>
+    <elements>
+        <element name="chart:axis" family="chart:chart"/>
+        <element name="chart:chart" family="chart:chart"/>
+        <element name="chart:data-point" family="chart:chart"/>
+        <element name="chart:error-indicator" family="chart:chart"/>
+        <element name="chart:floor" family="chart:chart"/>
+        <element name="chart:footer" family="chart:chart"/>
+        <element name="chart:grid" family="chart:chart"/>
+        <element name="chart:legend" family="chart:chart"/>
+        <element name="chart:mean-value" family="chart:chart"/>
+        <element name="chart:plot-area" family="chart:chart"/>
+        <element name="chart:regression-curve" family="chart:chart"/>
+        <element name="chart:series" family="chart:chart"/>
+        <element name="chart:stock-gain-marker" family="chart:chart"/>
+        <element name="chart:stock-loss-marker" family="chart:chart"/>
+        <element name="chart:stock-range-line" family="chart:chart"/>
+        <element name="chart:subtitle" family="chart:chart"/>
+        <element name="chart:title" family="chart:chart"/>
+        <element name="chart:wall" family="chart:chart"/>
+        <element name="draw:page" family="draw:drawing-page"/>
+        <element name="presentation:notes" family="draw:drawing-page"/>
+        <element name="dr3d:cube" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:extrude" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:rotate" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:scene" family="draw:graphic,presentation:presentation"/>
+        <element name="dr3d:sphere" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:a" rename="draw:hyperlink"/>
+        <element name="draw:caption" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:circle" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:connector" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:control" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:custom-shape" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:ellipse" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:frame" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:g" rename="draw:group" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:line" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:measure" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:page-thumbnail" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:path" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:polygon" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:polyline" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:rect" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="draw:regular-polygon" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="office:annotation" base="draw:shape" family="draw:graphic,presentation:presentation"/>
+        <element name="text:alphabetical-index-entry-template" family="text:paragraph"/>
+        <element name="text:bibliography-entry-template" family="text:paragraph"/>
+        <element name="text:h" rename="text:heading" base="text:paragraph" family="text:paragraph"/>
+        <element name="text:illustration-index-entry-template" family="text:paragraph"/>
+        <element name="text:index-source-style" family="text:paragraph"/>
+        <element name="text:index-title-template" family="text:paragraph"/>
+        <element name="text:object-index-entry-template" family="text:paragraph"/>
+        <element name="text:p" rename="text:paragraph" base="text:paragraph" family="text:paragraph"/>
+        <element name="text:table-index-entry-template" family="text:paragraph"/>
+        <element name="text:table-of-content-entry-template" family="text:paragraph"/>
+        <element name="text:user-index-entry-template" family="text:paragraph"/>
+        <element name="text:ruby" family="text:ruby"/>
+        <element name="text:ruby-text" family="text:ruby"/>
+        <element name="text:alphabetical-index" family="text:section"/>
+        <element name="text:bibliography" family="text:section"/>
+        <element name="text:illustration-index" family="text:section"/>
+        <element name="text:index-title" family="text:section"/>
+        <element name="text:object-index" family="text:section"/>
+        <element name="text:section" family="text:section"/>
+        <element name="text:s" rename="text:space"/>
+        <element name="text:table-index" family="text:section"/>
+        <element name="text:table-of-content" family="text:section"/>
+        <element name="text:user-index" family="text:section"/>
+        <element name="table:table" family="table:table"/>
+        <element name="table:covered-table-cell" base="table:table-cell" family="table:table-cell"/>
+        <element name="table:table-cell" base="table:table-cell" family="table:table-cell"/>
+        <element name="table:table-column" family="table:table-column"/>
+        <element name="table:table-row" family="table:table-row"/>
+        <element name="text:a" rename="text:hyperlink" family="text:text"/>
+        <element name="text:index-entry-bibliography" family="text:text"/>
+        <element name="text:index-entry-chapter" family="text:text"/>
+        <element name="text:index-entry-link-end" family="text:text"/>
+        <element name="text:index-entry-link-start" family="text:text"/>
+        <element name="text:index-entry-page-number" family="text:text"/>
+        <element name="text:index-entry-span" family="text:text"/>
+        <element name="text:index-entry-tab-stop" family="text:text"/>
+        <element name="text:index-entry-text" family="text:text"/>
+        <element name="text:span" family="text:text"/>
+        <element name="style:handout-master" family="draw:drawing-page"/>
+        <element name="style:master-page" family="draw:drawing-page"/>
+        <element name="table:body" family="table:table-cell"/>
+        <element name="table:even-columns" family="table:table-cell"/>
+        <element name="table:even-rows" family="table:table-cell"/>
+        <element name="table:first-column" family="table:table-cell"/>
+        <element name="table:first-row" family="table:table-cell"/>
+        <element name="table:last-column" family="table:table-cell"/>
+        <element name="table:last-row" family="table:table-cell"/>
+        <element name="table:odd-columns" family="table:table-cell"/>
+        <element name="table:odd-rows" family="table:table-cell"/>
+        <element name="style:drop-cap" family="text:text"/>
+        <element name="text:linenumbering-configuration" family="text:text"/>
+
+		<!-- does not exist as element only as baseclass -->
+        <element name="text:list-level-style" base="style"/>
+        <element name="text:list-level-style-number" base="text:list-level-style"/>
+        <element name="text:list-level-style-bullet" base="text:list-level-style"/>
+        <element name="text:list-level-style-image" base="text:list-level-style"/>
+
+        <element name="text:numbered-paragraph" family="text:list"/>
+        <element name="office:styles" base="container"/>
+        <element name="office:automatic-styles" base="container"/>
+        <element name="office:master-styles" base="container"/>
+        <!--element name="office:presentation" base="container"/-->
+
+        <element name="style:style" base="style"/>
+        <element name="style:default-style" base="style"/>
+        <element name="style:page-layout" base="style"/>
+        <element name="text:outline-level-style" base="style"/>
+        <element name="text:list-style" base="style"/>
+
+        <element name="style:chart-properties" base="styleproperties"/>
+        <element name="style:drawing-page-properties" base="styleproperties"/>
+        <element name="style:graphic-properties" base="styleproperties"/>
+        <element name="style:list-level-properties" base="styleproperties"/>
+        <element name="style:paragraph-properties" base="styleproperties"/>
+        <element name="style:ruby-properties" base="styleproperties"/>
+        <element name="style:section-properties" base="styleproperties"/>
+        <element name="style:page-layout-properties" base="styleproperties"/>
+        <element name="style:header-footer-properties" base="styleproperties"/>
+        <element name="style:text-properties" base="styleproperties"/>
+        <element name="style:table-properties" base="styleproperties"/>
+        <element name="style:table-column-properties" base="styleproperties"/>
+        <element name="style:table-row-properties" base="styleproperties"/>
+        <element name="style:table-cell-properties" base="styleproperties"/>
+    </elements>
+    <data-types>
+        <data name="anyURI" value-type="java.net.URI" conversion-type="org.odftoolkit.odfdom.type.AnyURI"/>
+        <data name="boolean" value-type="Boolean" conversion-type="Boolean"/>
+        <data name="base64Binary" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Base64Binary"/>
+        <data name="cellAddress" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CellAddress"/>
+        <data name="cellRangeAddress" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CellRangeAddress"/>
+        <data name="cellRangeAddressList" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CellRangeAddressList"/>
+        <data name="clipShape" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ClipShape"/>
+        <data name="color" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Color"/>
+        <data name="coordinate" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Coordinate"/>
+        <data name="countryCode" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CountryCode"/>
+        <data name="CURIE" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CURIE"/>
+        <data name="CURIEs" value-type="String" conversion-type="org.odftoolkit.odfdom.type.CURIEs"/>
+        <data name="date" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.Date"/>
+        <data name="dateOrDateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.DateOrDateTime"/>
+        <data name="dateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.DateTime"/>
+        <data name="distance" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Distance"/>
+        <data name="duration" value-type="javax.xml.datatype.Duration" conversion-type="org.odftoolkit.odfdom.type.DurationType"/>
+        <data name="double" value-type="Double" conversion-type="Double"/>
+        <!--data name="extrusionOrigin" value-type="String" conversion-type="org.odftoolkit.odfdom.attribute.ExtrusionOrigin"/-->
+        <data name="formula" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Formula"/>
+        <data name="ID" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ID"/>
+        <data name="IDREF" value-type="String" conversion-type="org.odftoolkit.odfdom.type.IDREF"/>
+        <data name="IDREFS" value-type="String" conversion-type="org.odftoolkit.odfdom.type.IDREFS"/>
+        <data name="integer" value-type="Integer" conversion-type="Integer"/>
+        <data name="language" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Language"/>
+        <data name="languageCode" value-type="String" conversion-type="org.odftoolkit.odfdom.type.LanguageCode"/>
+        <data name="length" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Length"/>
+        <data name="namespacedToken" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NamespacedToken"/>
+        <data name="NCName" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NCName"/>
+        <data name="nonNegativeDecimal" value-type="Double" conversion-type="org.odftoolkit.odfdom.type.NonNegativeDecimal"/>
+        <data name="nonNegativeInteger" value-type="Integer" conversion-type="org.odftoolkit.odfdom.type.NonNegativeInteger"/>
+        <data name="nonNegativeLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NonNegativeLength"/>
+        <data name="nonNegativePixelLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.NonNegativePixelLength"/>
+        <data name="percent" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Percent"/>
+        <data name="point3D" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Point3D"/>
+        <data name="points" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Points"/>
+        <data name="positiveInteger" value-type="Integer" conversion-type="org.odftoolkit.odfdom.type.PositiveInteger"/>
+        <data name="positiveLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.PositiveLength"/>
+        <!--data name="presentation-classes" value-type="String" conversion-type="org.odftoolkit.odfdom.attribute.PresentationClasses"/-->
+        <data name="relativeLength" value-type="String" conversion-type="org.odftoolkit.odfdom.type.RelativeLength"/>
+        <data name="SafeCURIE" value-type="String" conversion-type="org.odftoolkit.odfdom.type.SafeCURIE"/>
+        <data name="scriptCode" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ScriptCode"/>
+        <data name="signedZeroToHundredPercent" value-type="String" conversion-type="org.odftoolkit.odfdom.type.SignedZeroToHundredPercent"/>
+        <data name="string" value-type="String" conversion-type="String"/>
+        <data name="styleName" value-type="String" conversion-type="org.odftoolkit.odfdom.type.StyleName"/>
+        <data name="styleNameRef" value-type="String" conversion-type="org.odftoolkit.odfdom.type.StyleNameRef"/>
+        <data name="styleNameRefs" value-type="String" conversion-type="org.odftoolkit.odfdom.type.StyleNameRefs"/>
+        <data name="targetFrameName" value-type="String" conversion-type="org.odftoolkit.odfdom.type.TargetFrameName"/>
+        <!--data name="targetFrameName" value-type="enum" conversion-type="office:target-frame-name"/-->
+        <data name="textEncoding" value-type="String" conversion-type="org.odftoolkit.odfdom.type.TextEncoding"/>
+        <data name="time" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.Time"/>
+        <data name="timeOrDateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.type.TimeOrDateTime"/>
+        <data name="URIorSafeCURIE" value-type="String" conversion-type="org.odftoolkit.odfdom.type.URIorSafeCURIE"/>
+        <data name="valueType" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ValueType"/>
+        <data name="vector3D" value-type="String" conversion-type="org.odftoolkit.odfdom.type.Vector3D"/>
+        <data name="zeroToHundredPercent" value-type="String" conversion-type="org.odftoolkit.odfdom.type.ZeroToHundredPercent"/>
+        <data name="zeroToOneDecimal" value-type="Double" conversion-type="org.odftoolkit.odfdom.type.ZeroToOneDecimal"/>
+        <!--data name="rowOrCol" value-type="enum" conversion-type="table:row-or-column"/-->
+        <data name="stylefamily" value-type="org.odftoolkit.odfdom.dom.style.OdfStyleFamily" conversion-type="org.odftoolkit.odfdom.dom.style.OdfStyleFamily"/>
+        
+        
+    </data-types>
+   <attributes>
+      <attribute name="anim:color-interpolation" defaultValue="rgb"/>
+      <attribute name="anim:color-interpolation-direction" defaultValue="clockwise"/>
+      <attribute name="chart:automatic-content" defaultValue="true"/>
+      <attribute name="chart:class" defaultValue="major" element="chart:grid"/>
+      <attribute name="chart:data-source-has-labels" defaultValue="none"/>
+      <attribute name="chart:display-equation" defaultValue="true"/>
+      <attribute name="chart:display-r-square" defaultValue="false"/>
+      <attribute name="db:append-table-alias-name" defaultValue="true"/>
+      <attribute name="db:apply-command" defaultValue="false"/>
+      <attribute name="db:boolean-comparison-mode" defaultValue="equal-integer"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:decimal" defaultValue="."/>
+      <attribute name="db:delete-rule" defaultValue="no-action"/>
+      <attribute name="db:enable-sql92-check" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:encoding" defaultValue="utf-8"/>
+      <attribute name="db:escape-processing" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:field" defaultValue=";"/>
+      <attribute name="db:ignore-driver-privileges" defaultValue="true"/>
+      <attribute name="db:is-first-row-header-line" defaultValue="true"/>
+      <attribute name="db:is-password-required" defaultValue="false"/>
+      <attribute name="db:is-table-name-length-limited" defaultValue="true"/>
+      <attribute name="db:parameter-name-substitution" defaultValue="true"/>
+      <attribute name="db:show-deleted" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:string" defaultValue="."/>
+      <attribute name="db:suppress-version-columns" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="db:thousand" defaultValue=","/>
+      <attribute name="db:update-rule" defaultValue="no-action"/>
+      <attribute name="db:use-catalog" defaultValue="false"/>
+      <attribute name="db:visible" defaultValue="true"/>
+      <attribute name="dr3d:projection" defaultValue="parallel" element="draw:enhanced-geometry"/>
+      <attribute name="dr3d:shade-mode" defaultValue="flat" element="draw:enhanced-geometry"/>
+      <attribute name="draw:concentric-gradient-fill-allowed" defaultValue="false"/>
+      <attribute name="draw:display" defaultValue="always"/>
+      <attribute name="draw:extrusion" defaultValue="false"/>
+      <attribute name="draw:extrusion-allowed" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-brightness" defaultValue="33%"/>
+      <attribute name="draw:extrusion-color" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-depth" defaultValue="36pt 0"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-diffusion" defaultValue="0%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-first-light-direction" defaultValue="(5 0 1)"/>
+      <attribute name="draw:extrusion-first-light-harsh" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-first-light-level" defaultValue="66%"/>
+      <attribute name="draw:extrusion-light-face" defaultValue="true"/>
+      <attribute name="draw:extrusion-metal" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-number-of-line-segments" defaultValue="30"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-origin" defaultValue="0.5 -0.5"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-rotation-angle" defaultValue="0 0"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-second-light-direction" defaultValue="(-5 0 1)"/>
+      <attribute name="draw:extrusion-second-light-harsh" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-second-light-level" defaultValue="66%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-shininess" defaultValue="50%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-skew" defaultValue="50 45"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-specularity" defaultValue="0%"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:extrusion-viewpoint" defaultValue="3.5cm -3.5cm 25cm"/>
+      <attribute name="draw:glue-point-type" defaultValue="none"/>
+      <attribute name="draw:handle-mirror-horizontal" defaultValue="false"/>
+      <attribute name="draw:handle-mirror-vertical" defaultValue="false"/>
+      <attribute name="draw:handle-switched" defaultValue="false"/>
+      <attribute name="draw:kind" defaultValue="full"/>
+      <attribute name="draw:mirror-horizontal" defaultValue="false"/>
+      <attribute name="draw:mirror-vertical" defaultValue="false"/>
+      <attribute name="draw:may-script" defaultValue="false"/>
+      <attribute name="draw:protected" defaultValue="false"/>
+      <attribute name="draw:text-path" defaultValue="false"/>
+      <attribute name="draw:text-path-allowed" defaultValue="false"/>
+      <attribute name="draw:text-path-mode" defaultValue="normal"/>
+      <attribute name="draw:text-path-same-letter-heights" defaultValue="false"/>
+      <attribute name="draw:text-path-scale" defaultValue="path"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="draw:text-rotate-angle" defaultValue="0"/>
+      <attribute name="draw:type" defaultValue="standard" element="draw:connector"/>
+      <attribute name="draw:type" defaultValue="non-primitive" element="draw:enhanced-geometry"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:end-indent" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:space-after" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:space-before" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="fo:start-indent" defaultValue="0cm"/>
+      <attribute name="form:allow-deletes" defaultValue="true"/>
+      <attribute name="form:allow-inserts" defaultValue="true"/>
+      <attribute name="form:allow-updates" defaultValue="true"/>
+      <attribute name="form:apply-design-mode" defaultValue="true"/>
+      <attribute name="form:apply-filter" defaultValue="false"/>
+      <attribute name="form:automatic-focus" defaultValue="false"/>
+      <attribute name="form:button-type" defaultValue="push"/>
+      <attribute name="form:command-type" defaultValue="command"/>
+      <attribute name="form:convert-empty-to-null" defaultValue="false"/>
+      <attribute name="form:current-selected" defaultValue="false"/>
+      <attribute name="form:default-button" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:delay-for-repeat" defaultValue="PT0.050S"/>
+      <attribute name="form:disabled" defaultValue="false"/>
+      <attribute name="form:dropdown" defaultValue="false"/>
+      <attribute name="form:echo-char" defaultValue="*"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:enctype" defaultValue="application/x-www-form-urlencoded"/>
+      <attribute name="form:escape-processing" defaultValue="true"/>
+      <attribute name="form:ignore-result" defaultValue="false"/>
+      <attribute name="form:image-align" defaultValue="center"/>
+      <attribute name="form:image-position" defaultValue="center"/>
+      <attribute name="form:is-tristate" defaultValue="false"/>
+      <attribute name="form:method" defaultValue="get"/>
+      <attribute name="form:multi-line" defaultValue="false"/>
+      <attribute name="form:multiple" defaultValue="false"/>
+      <attribute name="form:printable" defaultValue="true"/>
+      <attribute name="form:readonly" defaultValue="false"/>
+      <attribute name="form:selected" defaultValue="false"/>
+      <attribute name="form:spin-button" defaultValue="false"/>
+      <attribute name="form:state" defaultValue="unchecked"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:step-size" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="form:tab-index" defaultValue="0"/>
+      <attribute name="form:tab-stop" defaultValue="true"/>
+      <attribute name="form:toggle" defaultValue="false"/>
+      <attribute name="form:validation" defaultValue="false"/>
+      <attribute name="number:automatic-order" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="number:decimal-places" defaultValue="0" element="number:seconds"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="number:display-factor" defaultValue="1"/>
+      <attribute name="number:format-source" defaultValue="fixed"/>
+      <attribute name="number:grouping" defaultValue="false"/>
+      <attribute name="number:textual" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="number:transliteration-format" defaultValue="1"/>
+      <attribute name="number:transliteration-style" defaultValue="short"/>
+      <attribute name="number:truncate-on-overflow" defaultValue="true"/>
+      <attribute name="office:automatic-update" defaultValue="true"/>
+      <attribute name="office:conversion-mode" defaultValue="into-default-style-data-style"/>
+      <attribute name="office:server-map" defaultValue="false"/>
+      <attribute name="office:target-frame" defaultValue="_blank"/>
+      <attribute name="presentation:animations" defaultValue="enabled"/>
+      <attribute name="presentation:direction" defaultValue="none"/>
+      <attribute name="presentation:endless" defaultValue="false"/>
+      <attribute name="presentation:effect" defaultValue="none"/>
+      <attribute name="presentation:force-manual" defaultValue="false"/>
+      <attribute name="presentation:full-screen" defaultValue="true"/>
+      <attribute name="presentation:mouse-as-pen" defaultValue="false"/>
+      <attribute name="presentation:mouse-visible" defaultValue="true"/>
+      <attribute name="presentation:node-type" defaultValue="default"/>
+      <attribute name="presentation:preset-class" defaultValue="custom"/>
+      <attribute name="presentation:show-end-of-presentation-slide" defaultValue="true"/>
+      <attribute name="presentation:show-logo" defaultValue="false"/>
+      <attribute name="presentation:speed" defaultValue="medium"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="presentation:start-scale" defaultValue="100%"/>
+      <attribute name="presentation:start-with-navigator" defaultValue="false"/>
+      <attribute name="presentation:stay-on-top" defaultValue="false"/>
+      <attribute name="presentation:transition-on-click" defaultValue="enabled"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="smil:accelerate" defaultValue="0.0"/>
+      <attribute name="smil:autoReverse" defaultValue="false"/>
+      <attribute name="smil:calcMode" defaultValue="discrete" element="anim:animate"/>
+      <attribute name="smil:calcMode" defaultValue="discrete" element="anim:animateColor"/>
+      <attribute name="smil:calcMode" defaultValue="paced" element="anim:animateMotion"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="smil:decelerate" defaultValue="0.0"/>
+      <attribute name="smil:direction" defaultValue="forward" element="anim:transitionFilter"/>
+      <attribute name="smil:fadeColor" defaultValue="#000000"/>
+      <attribute name="smil:mode" defaultValue="in"/>
+      <attribute name="smil:restart" defaultValue="default"/>
+      <attribute name="smil:restartDefault" defaultValue="inherit"/>
+      <attribute name="style:adjustment" defaultValue="left"/>
+      <attribute name="style:auto-update" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:color" defaultValue="#000000" element="style:column-sep"/>
+      <attribute name="style:display" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:distance" defaultValue="0cm"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:height" defaultValue="100%"/>
+      <attribute name="style:leader-text" defaultValue=" "/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:length" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="style:lines" defaultValue="1"/>
+      <attribute name="style:page-usage" defaultValue="all"/>
+      <attribute name="style:position" defaultValue="center" element="style:background-image"/>
+      <attribute name="style:repeat" defaultValue="repeat" element="style:background-image"/>
+      <attribute name="style:style" defaultValue="solid"/>
+      <attribute name="style:type" defaultValue="left" element="style:tab-stop"/>
+      <attribute name="style:vertical-align" defaultValue="top" element="style:column-sep"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:cx" defaultValue="50%" element="svg:radialGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:cy" defaultValue="50%" element="svg:radialGradient"/>
+      <attribute name="svg:gradientUnits" defaultValue="objectBoundingBox"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:r" defaultValue="50%" element="svg:radialGradient"/>
+      <attribute name="svg:spreadMethod" defaultValue="pad"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:x1" defaultValue="0%" element="svg:linearGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:x2" defaultValue="100%" element="svg:linearGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:y1" defaultValue="0%" element="svg:linearGradient"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="svg:y2" defaultValue="100%" element="svg:linearGradient"/>
+      <attribute name="table:acceptance-state" defaultValue="pending"/>
+      <attribute name="table:allow-empty-cell" defaultValue="true"/>
+      <attribute name="table:automatic-find-labels" defaultValue="true"/>
+      <attribute name="table:bind-styles-to-content" defaultValue="true"/>
+      <attribute name="table:case-sensitive" defaultValue="true"
+                 element="table:calculation-settings"/>
+      <attribute name="table:case-sensitive" defaultValue="false"
+                 element="table:filter-condition"/>
+      <attribute name="table:case-sensitive" defaultValue="false" element="table:sort"/>
+      <attribute name="table:case-sensitive" defaultValue="false" element="table:subtotal-rules"/>
+      <attribute name="table:condition-source" defaultValue="self"/>
+      <attribute name="table:contains-error" defaultValue="false"/>
+      <attribute name="table:contains-header" defaultValue="true"/>
+      <attribute name="table:copy-back" defaultValue="true"/>
+      <attribute name="table:copy-formulas" defaultValue="true"/>
+      <attribute name="table:copy-styles" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:count" defaultValue="1"/>
+      <attribute name="table:data-type" defaultValue="text" element="table:filter-condition"/>
+      <attribute name="table:data-type" defaultValue="automatic" element="table:sort-by"/>
+      <attribute name="table:data-type" defaultValue="automatic" element="table:sort-groups"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:date-value" defaultValue="1899-12-30"/>
+      <attribute name="table:display" defaultValue="true" element="table:table-column-group"/>
+      <attribute name="table:display" defaultValue="true" element="table:table-row-group"/>
+      <attribute name="table:display" defaultValue="false" element="table:error-message"/>
+      <attribute name="table:display" defaultValue="false" element="table:help-message"/>
+      <attribute name="table:display-border" defaultValue="true"/>
+      <attribute name="table:display-duplicates" defaultValue="true"/>
+      <attribute name="table:display-filter-buttons" defaultValue="false"/>
+      <attribute name="table:display-list" defaultValue="unsorted"/>
+      <attribute name="table:drill-down-on-double-click" defaultValue="true"/>
+      <attribute name="table:embedded-number-behavior" defaultValue="alpha-numeric"/>
+      <attribute name="table:execute" defaultValue="true"/>
+      <attribute name="table:grand-total" defaultValue="both"/>
+      <attribute name="table:has-persistent-data" defaultValue="true"/>
+      <attribute name="table:identify-categories" defaultValue="false"/>
+      <attribute name="table:ignore-empty-rows" defaultValue="false"/>
+      <attribute name="table:is-data-layout-field" defaultValue="false"/>
+      <attribute name="table:is-selection" defaultValue="false"/>
+      <attribute name="table:is-sub-table" defaultValue="false"/>
+      <attribute name="table:link-to-source-data" defaultValue="false"/>
+      <attribute name="table:matrix-covered" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:maximum-difference" defaultValue="0.001"/>
+      <attribute name="table:message-type" defaultValue="stop"/>
+      <attribute name="table:mode" defaultValue="copy-all"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:null-year" defaultValue="1930"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-repeated" defaultValue="1"
+                 element="table:covered-table-cell"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-repeated" defaultValue="1"
+                 element="table:table-cell"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-repeated" defaultValue="1"
+                 element="table:table-column"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-columns-spanned" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-rows-repeated" defaultValue="1"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:number-rows-spanned" defaultValue="1"/>
+      <attribute name="table:on-update-keep-size" defaultValue="true"/>
+      <attribute name="table:on-update-keep-styles" defaultValue="false"/>
+      <attribute name="table:order" defaultValue="ascending" element="table:sort-by"/>
+      <attribute name="table:order" defaultValue="ascending" element="table:sort-groups"/>
+      <attribute name="table:orientation" defaultValue="row" element="table:database-range"/>
+      <attribute name="table:page-breaks-on-group-change" defaultValue="false"/>
+      <attribute name="table:parse-sql-statement" defaultValue="false"/>
+      <attribute name="table:precision-as-shown" defaultValue="false"/>
+      <attribute name="table:print" defaultValue="true"/>
+      <attribute name="table:protect" defaultValue="false"/>
+      <attribute name="table:protected" defaultValue="false" element="table:covered-table-cell"/>
+      <attribute name="table:protected" defaultValue="false" element="table:table"/>
+      <attribute name="table:protected" defaultValue="false" element="table:table-cell"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:protection-key-digest-algorithm"
+                 defaultValue="http://www.w3.org/2000/09/xmldsig#sha1"/>
+      <attribute name="table:range-usable-as" defaultValue="none"/>
+      <attribute name="table:search-criteria-must-apply-to-whole-cell" defaultValue="true"/>
+      <attribute name="table:show-filter-button" defaultValue="true"/>
+      <attribute name="table:status" defaultValue="disable"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:steps" defaultValue="100"/>
+      <attribute name="table:structure-protected" defaultValue="false"/>
+      <attribute name="table:track-changes" defaultValue="false"/>
+      <attribute name="table:use-banding-columns-styles" defaultValue="false"/>
+      <attribute name="table:use-banding-rows-styles" defaultValue="false"/>
+      <attribute name="table:use-first-column-styles" defaultValue="false"/>
+      <attribute name="table:use-first-row-styles" defaultValue="false"/>
+      <attribute name="table:use-last-column-styles" defaultValue="false"/>
+      <attribute name="table:use-last-row-styles" defaultValue="false"/>
+      <attribute name="table:use-labels" defaultValue="none"/>
+      <attribute name="table:use-regular-expressions" defaultValue="true"/>
+      <attribute name="table:use-wildcards" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="table:used-hierarchy" defaultValue="-1"/>
+      <attribute name="table:value-type" defaultValue="date"/>
+      <attribute name="table:visibility" defaultValue="visible"/>
+      <attribute name="text:alphabetical-separators" defaultValue="false"/>
+      <attribute name="text:capitalize-entries" defaultValue="false"/>
+      <attribute name="text:combine-entries" defaultValue="true"/>
+      <attribute name="text:combine-entries-with-dash" defaultValue="false"/>
+      <attribute name="text:combine-entries-with-pp" defaultValue="true"/>
+      <attribute name="text:comma-separated" defaultValue="false"/>
+      <attribute name="text:consecutive-numbering" defaultValue="false"/>
+      <attribute name="text:copy-outline-levels" defaultValue="false"/>
+      <attribute name="text:count-empty-lines" defaultValue="true"/>
+      <attribute name="text:count-in-text-boxes" defaultValue="false"/>
+      <attribute name="text:display" defaultValue="number" element="text:index-entry-chapter"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:display-levels" defaultValue="1"/>
+      <attribute name="text:global" defaultValue="false"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:alphabetical-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:illustration-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:object-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:table-index-source"/>
+      <attribute name="text:index-scope" defaultValue="document"
+                 element="text:user-index-source"/>
+      <attribute name="text:ignore-case" defaultValue="false"/>
+      <attribute name="text:is-list-header" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:level" defaultValue="1" element="text:numbered-paragraph"/>
+      <attribute name="text:main-entry" defaultValue="false"/>
+      <attribute name="text:number-lines" defaultValue="true"
+                 element="text:linenumbering-configuration"/>
+      <attribute name="text:number-position" defaultValue="left"/>
+      <attribute name="text:numbered-entries" defaultValue="false"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:protection-key-digest-algorithm"
+                 defaultValue="http://www.w3.org/2000/09/xmldsig#sha1"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:alphabetical-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:illustration-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:object-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:table-index-source"/>
+      <attribute name="text:relative-tab-stop-position" defaultValue="true"
+                 element="text:user-index-source"/>
+      <attribute name="text:restart-numbering" defaultValue="false"/>
+      <attribute name="text:restart-on-page" defaultValue="false"/>
+      <attribute name="text:sort-ascending" defaultValue="true"/>
+      <attribute name="text:sort-by-position" defaultValue="true"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:start-value" defaultValue="1" element="text:list-level-style-number"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:start-value" defaultValue="1" element="text:notes-configuration"/>
+      <!--The following attribute default value is listed in the ODF schema-->            
+      <attribute name="text:start-value" defaultValue="1" element="text:outline-level-style"/>
+      <attribute name="text:track-changes" defaultValue="true"/>
+      <attribute name="text:use-caption" defaultValue="true"/>
+      <attribute name="text:use-chart-objects" defaultValue="false"/>
+      <attribute name="text:use-draw-objects" defaultValue="false"/>
+      <attribute name="text:use-floating-frames" defaultValue="false"/>
+      <attribute name="text:use-graphics" defaultValue="false"/>
+      <attribute name="text:use-index-marks" defaultValue="false"
+                 element="text:user-index-source"/>
+      <attribute name="text:use-index-source-styles" defaultValue="false"
+                 element="text:user-index-source"/>
+      <attribute name="text:use-keys-as-entries" defaultValue="false"/>
+      <attribute name="text:use-math-objects" defaultValue="false"/>
+      <attribute name="text:use-objects" defaultValue="false"/>
+      <attribute name="text:use-other-objects" defaultValue="false"/>
+      <attribute name="text:use-outline-level" defaultValue="true"/>
+      <attribute name="text:use-soft-page-breaks" defaultValue="false"/>
+      <attribute name="text:use-spreadsheet-objects" defaultValue="false"/>
+      <attribute name="text:use-tables" defaultValue="false"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="db:connection-resource"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="draw:a"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="form:form"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="meta:template"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest"
+                 element="presentation:event-listener"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="presentation:sound"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="script:event-listener"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="svg:definition-src"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="svg:font-face-uri"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="table:cell-range-source"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="table:table-source"/>
+      <attribute name="xlink:actuate" defaultValue="onRequest" element="text:a"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:applet"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:fill-image"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:floating-frame"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:image"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:object"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:object-ole"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="draw:plugin"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="meta:auto-reload"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad" element="style:background-image"/>
+      <attribute name="xlink:actuate" defaultValue="onLoad"
+                 element="text:list-level-style-image"/>
+      <attribute name="xlink:show" defaultValue="replace" element="meta:auto-reload"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:applet"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:fill-image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:floating-frame"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:object"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:object-ole"/>
+      <attribute name="xlink:show" defaultValue="embed" element="draw:plugin"/>
+      <attribute name="xlink:show" defaultValue="embed" element="presentation:event-listener"/>
+      <attribute name="xlink:show" defaultValue="embed" element="style:background-image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="text:list-level-style-image"/>
+      <attribute name="xlink:show" defaultValue="embed" element="text:section-source"/>
+      <attribute name="xlink:show" defaultValue="none" element="db:connection-resource"/>
+      <attribute name="xlink:type" defaultValue="simple" element="db:connection-resource"/>
+      <attribute name="xlink:type" defaultValue="simple" element="db:file-based-database"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:a"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:applet"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:area-circle"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:area-polygon"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:area-rectangle"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:fill-image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:floating-frame"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:object"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:object-ole"/>
+      <attribute name="xlink:type" defaultValue="simple" element="draw:plugin"/>
+      <attribute name="xlink:type" defaultValue="simple" element="form:form"/>
+      <attribute name="xlink:type" defaultValue="simple" element="meta:auto-reload"/>
+      <attribute name="xlink:type" defaultValue="simple" element="meta:template"/>
+      <attribute name="xlink:type" defaultValue="simple" element="presentation:event-listener"/>
+      <attribute name="xlink:type" defaultValue="simple" element="presentation:sound"/>
+      <attribute name="xlink:type" defaultValue="simple" element="script:event-listener"/>
+      <attribute name="xlink:type" defaultValue="simple" element="style:background-image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="svg:definition-src"/>
+      <attribute name="xlink:type" defaultValue="simple" element="svg:font-face-uri"/>
+      <attribute name="xlink:type" defaultValue="simple" element="table:cell-range-source"/>
+      <attribute name="xlink:type" defaultValue="simple" element="table:table-source"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:a"/>
+      <attribute name="xlink:type" defaultValue="simple"
+                 element="text:alphabetical-index-auto-mark-file"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:list-level-style-image"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:script"/>
+      <attribute name="xlink:type" defaultValue="simple" element="text:section-source"/>
+   </attributes>
+</config>
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/copyright.txt b/trunk/odfdom/src/codegen/resources/dom/template/copyright.txt
new file mode 100644
index 0000000..1b1fc5d
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/copyright.txt
@@ -0,0 +1,22 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/dom-output-files.vm b/trunk/odfdom/src/codegen/resources/dom/template/dom-output-files.vm
new file mode 100644
index 0000000..36f3b1b
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/dom-output-files.vm
@@ -0,0 +1,75 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?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>
+	<file path="org/odftoolkit/odfdom/dom/style/OdfStyleFamily.java" template="java-odfdom-stylefamily.vm" />
+	<file path="org/odftoolkit/odfdom/dom/style/props/OdfStylePropertiesSet.java" template="java-odfdom-styleset.vm" />
+	<file path="org/odftoolkit/odfdom/dom/DefaultElementVisitor.java" template="java-odfdom-element-visitor.vm" />
+####<file path="org/odftoolkit/odfdom/pkg/DefaultAttributeVisitor.java" template="java-odfdom-attribute-visitor.vm" />
+##
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+##
+#set($classname = "${model.camelCase($element)}Element")
+	<file path="org/odftoolkit/odfdom/dom/element/${model.extractNamespace($element)}/${classname}.java" context="$element" template="java-odfdom-element-template.vm" />
+##
+#end
+#end
+##
+#foreach ($base in $javamodel.getBaseclasses())
+##
+#if ($base != "container" && $base != "style" && $base != "styleproperties")
+#set($classname = "${model.camelCase($base)}ElementBase")
+	<file path="org/odftoolkit/odfdom/dom/element/${model.extractNamespace($base)}/${classname}.java" context="$base" template="java-odfdom-elementbase-template.vm" />
+#end
+##
+#end
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+##
+#set($classname = "${model.camelCase($attribute)}Attribute")
+	<file path="org/odftoolkit/odfdom/dom/attribute/${model.extractNamespace($attribute)}/${classname}.java" context="$attribute" template="java-odfdom-attribute-template.vm" />
+#end
+#end
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+##
+#set($classname = "${model.camelCase($attribute)}Attribute")
+	<file path="org/odftoolkit/odfdom/dom/attribute/${model.extractNamespace($attribute)}/${classname}.java" context="$attribute" template="java-odfdom-attribute-template.vm" />
+#end
+#end
+##
+#foreach ($styleelement in ${model.getElements().withoutMultiples()})
+#if ($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+#set ($properties=${styleelement.withMultiples().getAttributes()})
+#if ($properties.size()>0)
+	<file path="org/odftoolkit/odfdom/dom/style/props/Odf${model.camelCase(${styleelement.getLocalName()})}.java" context="$styleelement" template="java-odfdom-styleproperties.vm" />
+#end
+#end
+#end
+</filelist>
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-attribute-template.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-attribute-template.vm
new file mode 100644
index 0000000..a81e66e
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-attribute-template.vm
@@ -0,0 +1,386 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+################################################################## 
+## 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 = $model.getAttribute($context))
+#set($NS = $attribute.getNamespace())
+#set($localname = ${model.extractLocalname($attribute)})
+#set($classname = "${model.camelCase($attribute)}Attribute")
+#set ($valueobject = "String")
+##
+#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
+#if ($datatypes.size() > 0)
+#set ($hasdatatype = true)
+#else
+#set ($hasdatatype = false)
+#end
+##
+##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
+#set($values = ${attribute.getValues().withoutMultiples()})
+#if ($values.size() > 0)
+#if ($values.size() ==2 && $hasdatatype == false)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueobject = "Boolean")
+#end
+#end
+#set ($enum = true)
+#if ($valueobject == "Boolean")
+#set ($enum = false)
+#end
+#else
+#set ($enum = false)
+#end
+##
+## Check whether the attribute has default value.
+##
+#set ($hasDefaultValue = false)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
+#set ($hasDefaultValue = true)
+#end
+#end
+##
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($hasDefaultValue and $defaultValueSet.size() == 1)
+#foreach ($value in $defaultValueSet)
+#set ($uniqueDefaultValue = $value)
+#end
+#end
+##
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.${NS};
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+#if ($hasDefaultValue)
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+#if ($hasDefaultValue and $defaultValueSet.size()>1)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
+import org.odftoolkit.odfdom.dom.element.${parent.getNamespace()}.${model.camelCase($parent)}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(OdfDocumentNamespace.${NS.toUpperCase()}, "$localname");
+#if ($hasDefaultValue)
+#if ($defaultValueSet.size()>1)
+#foreach ($defaultValue in $defaultValueSet)
+#set ($constant = $model.constantCase($defaultValue))
+#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)} = "$defaultValue";
+#else
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)} = Value.${model.escapeKeyword($constant)}.toString();
+#end
+#end
+#else
+#if ($uniqueDefaultValue=="&#34;")
+	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
+#else
+	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
+#end
+#end
+#end
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute ${attribute}}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute ${attribute}}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+##
+#if ($enum)
+
+	/**
+	 * The value set of {@odf.attribute ${attribute}}.
+	 */
+	public enum Value {
+#set ($separator="		")
+#foreach($value in $values)
+#if (${value.toString().length()} == 1)
+#set ($constant = $value)
+#else
+#set ($constant = $model.constantCase($value))
+#end${separator}${model.escapeKeyword($constant)}("${model.escapeLiteral($value)}")#set ($separator=", ")
+#end ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+#end
+##
+## Handle Non-String-Attributes
+#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
+#if ($valueobject != "Boolean")
+#foreach ($valuetype in $valuetypes)
+#set ($valueobject = $valuetype)
+#end
+#end
+#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
+#set ($valueobject = "String")
+#end
+#if ($valueobject != "String")
+#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
+##
+
+	/**
+	 * @param value The <code>${simplevalue}</code> value of the attribute.
+	 */
+	public void set${model.camelCase($simplevalue)}Value(${simplevalue} value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>${simplevalue}</code> value of the attribute
+	 */
+	public ${simplevalue} ${simplevalue}Value() {
+		String val = super.getValue();
+		try {
+			return ${valueobject}.parse${model.camelCase($simplevalue)}(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+#end
+##
+#*
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+#else
+## enum and no datatype
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+#end
+#else
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+#end
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+#else
+## enum and no datatype
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of ${attribute} is not valid");
+		}
+#end
+#else
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of ${attribute} is not valid");
+		}
+#end
+	}
+*#
+#if ($hasDefaultValue)
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+#if ($defaultValueSet.size()>1)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
+			if (parentElement instanceof ${model.camelCase($parent)}Element) {
+#set ($constant = ${model.constantCase($odfmodel.getDefaultAttributeValue($attribute, $parent))})
+				defaultValue = DEFAULT_VALUE_${model.escapeKeyword($constant)};
+			}
+#end
+#end
+#else
+			defaultValue=DEFAULT_VALUE;
+#end
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+#else
+	/**
+	 * Returns the default value of {@odf.attribute ${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+#end
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+#if ($hasdatatype and $datatypes.size() > 0)
+#set ($datatype="")
+#foreach($value in $datatypes)
+#set ($datatype=$value)
+#end
+#if ($datatype == "ID")
+		return true;
+#else
+		return false;
+#end
+#else
+		return false;
+#end
+	}
+}
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-element-template.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-element-template.vm
new file mode 100644
index 0000000..2167135
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-element-template.vm
@@ -0,0 +1,471 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the Java class representing an ODF element
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+#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
+#set ($children = ${element.getChildElements().withoutMultiples()})
+#set ($attributes = ${element.getAttributes().withoutMultiples()})
+##
+## Determine whether element is stylable. Set base class OdfElement, OdfStylableElement, or...
+#if ($odfmodel.isStylable($element))
+#set ($stylable = true)
+#set ($baseclassname = "OdfStylableElement")
+#set ($elementStyleFamily=${odfmodel.getStyleFamilies($element)})
+#set ($useOdfStyleableShapeElement = false)
+#foreach($f in $elementStyleFamily)
+#if (${f.getQName()}=="draw:graphic" || ${f.getQName()}=="presentation:presentation")
+#set ($useOdfStyleableShapeElement = true)
+#end
+#end
+#if ($useOdfStyleableShapeElement)
+#set ($baseclassname = "OdfStyleableShapeElement")
+#end
+#set ($baseHasMandatoryAttr = false)
+#set ($firstfamily = ${model.camelCase($model.extractLocalname($odfmodel.getStyleFamilies($element).get(0)))})
+#else
+#set ($stylable = false)
+#set ($baseclassname = "OdfElement")
+#set ($baseHasMandatoryAttr = false)
+#end
+##
+## ...or configured base class
+#if (${javamodel.getBaseclassOf($element)})
+#set ($base = ${javamodel.getBaseclassOf($element)})
+## Configured manually generated base class?
+#if ($base == "container")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfContainerElementBase")
+#set ($baseimport = "org.odftoolkit.odfdom.pkg.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+#if ($base == "style")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfStyleBase")
+#set ($baseimport = "org.odftoolkit.odfdom.dom.element.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+#if ($base == "styleproperties")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfStylePropertiesBase")
+#set ($baseimport = "org.odftoolkit.odfdom.dom.element.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+## Configured automatic generated base class. If so, remove all attributes defined in base class
+#if (!$_specialbase)
+#set ($baseclassname = "${model.camelCase($base)}ElementBase")
+#if ($base.getNamespace() != $NS)
+#set ($baseimport = "org.odftoolkit.odfdom.dom.element.${base.getNamespace()}.$baseclassname")
+#end
+#set ($attributes = $attributes.without($base.getBaseAttributes()))
+#set ($baseElement = ${model.getElement($base.getQName())})
+#set ($bAttributes = ${baseElement.getAttributes().withoutMultiples()})
+#foreach ($bAttribute in $bAttributes)
+#if (${baseElement.isMandatory($bAttribute)})
+#set ($baseHasMandatoryAttr = true)
+#end
+#end
+#end
+#end
+##
+## Test if this element has mandatory (non optional) attributes
+#set ($hasMandatoryAttr = false)
+#foreach ($attribute in $attributes)
+#if (${element.isMandatory($attribute)})
+#set ($hasMandatoryAttr = true)
+#set ($mandatoryAttr = $attribute)
+#end
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.${NS};
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+#if ($stylable)
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+#else
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+#if ($base == "styleproperties")
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+#end
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+#foreach ($child in $children)
+#if ($child == "*")
+#set ($anychild = true)
+#else
+#set ($childNS = ${child.getNamespace()})
+#set ($childClassname = "${model.camelCase($child)}Element")
+#if ($childNS != $NS)
+import org.odftoolkit.odfdom.dom.element.${childNS}.$childClassname;
+#end
+#end
+#end
+##
+#foreach ($child in $attributes)
+#if ($child == "*")
+#set ($anyattribute = true)
+#else
+#set ($childNS = ${child.getNamespace()})
+#set ($childClassname = "${model.camelCase($child)}Attribute")
+import org.odftoolkit.odfdom.dom.attribute.${childNS}.$childClassname;
+#end
+#end
+##
+## If there is a base class which is not in the current package
+#if ($baseimport)
+import ${baseimport};
+#end
+
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * DOM implementation of OpenDocument element  {@odf.element ${context}}.
+ *
+#if ($anychild)
+ * This class can have any org.w3c.dom.Element child element.
+#end
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public class $classname extends $baseclassname {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.${NS.toUpperCase()}, "${element.getLocalName()}");
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDoc) {
+#if (($stylable && ($useOdfStyleableShapeElement == false)))
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.${firstfamily}, OdfName.newName(OdfDocumentNamespace.${NS.toUpperCase()}, "style-name"));
+#else
+		super(ownerDoc, ELEMENT_NAME);
+#end
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+## ---------------------------------------------------
+##  Only for base = styleproperties
+## ---------------------------------------------------
+#if ($base == "styleproperties")
+#foreach ($attribute in $attributes)
+#if ($attribute != "*")
+#set($propertyName = ${attribute.getLocalName()})
+#if (${element.getLocalName()}=="graphic-properties" && $propertyName =="shadow")
+#set($propertyName = ${attribute.getQName()})
+#end
+
+	public final static OdfStyleProperty ${model.camelCase($propertyName)} =
+		OdfStyleProperty.get(OdfStylePropertiesSet.${model.camelCase($element.getLocalName())}, OdfName.newName(OdfDocumentNamespace.${model.firstWord($attribute).toUpperCase()}, "${attribute.getLocalName()}"));
+#end
+#end
+#end
+##
+## ---------------------------------------------------
+##  Add init method if this element or the base
+##  element has mandatory attributes
+##  TODO: NO caller use this method.
+## ---------------------------------------------------
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in $attributes)
+#set($attri = ${model.getAttribute($attr.getQName())})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+## use attri get all of the values.
+#set($values = ${attri.getValues().withoutMultiples()})
+#if ($values.size() ==2 && $dataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${model.camelCase($attribute)}Attribute")
+#set ($aParam = "${model.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+#if (${element.isMandatory($attribute)})
+	 * Attribute is mandatory.
+	 *
+#end
+	 * @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(OdfDocumentNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
+#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $model.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Methods for child element creation
+## ---------------------------------------------------
+##
+#foreach($ch in $children)
+#if ($ch != "*")
+#set ($child = ${ch.withMultiples()})
+#set ($cClassname = "${model.camelCase($child)}Element")
+#set ($cVar = ${model.javaCase($child)})
+#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
+##set has parameter flag
+#set ($hasParams = false)
+#foreach ($ch_attribute in $ch_attributes)
+#if (${child.isMandatory($ch_attribute)})
+#set ($hasParams = true)
+#end
+#end
+#if ($hasParams)
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+#set ($seperateFlag="")
+#set ($params="")
+#foreach ($ch_attr in $ch_attributes)
+#if (${child.isMandatory($ch_attr)})
+#set($ch_attri = ${model.getAttribute($ch_attr.getQName())})
+#set ($ch_ValueObject = "String")
+#set ($ch_SimpleValue = "")
+#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
+#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
+#foreach ($ch_ValueType in $ch_ValueTypes)
+#set ($ch_ValueObject = $ch_ValueType)
+#end
+## use ch_attri get all of the values.
+#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
+#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($ch_Value in $ch_Values)
+#if ($ch_Value==true)
+#set ($trueFlag = true)
+#end
+#if ($ch_Value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($ch_Hasdatatype = true)
+#set ($ch_ValueObject = "Boolean")
+#end
+#end
+#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
+#set ($ch_ValueObject = "String")
+#end
+#if ($ch_ValueObject != "String")
+#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
+#end
+#if ($ch_attr != "*")
+#set ($attribute = ${ch_attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${model.camelCase($attribute)}Attribute")
+#set ($aParam = "${model.javaCase($attribute)}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}")
+#else
+#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
+#end
+#set ($seperateFlag=", ")
+#end
+#end
+#end
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	 public $cClassname new${cClassname}($params) {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+#foreach ($ch_attr in $ch_attributes)
+#if ($ch_attr != "*" && ${child.isMandatory($ch_attr)})
+#set ($aClassname = "${model.camelCase($ch_attr)}Attribute")
+#set ($aParam = "${model.javaCase($ch_attr)}Value")
+		${cVar}.set$aClassname($aParam);
+#end
+#end
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#else
+	/**
+	 * Create child element {@odf.element ${child}}.
+	 *
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ${child}}
+	 */
+	public $cClassname new${cClassname}() {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#end
+#end
+#end
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+##
+## -----------------------------------------------------
+##  New: newTextNode
+## -----------------------------------------------------
+##
+#if ($element.canHaveText())
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-element-visitor.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-element-visitor.vm
new file mode 100644
index 0000000..7927941
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-element-visitor.vm
@@ -0,0 +1,70 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom;
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+##
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+#set ($NS = ${element.getNamespace()})
+#set ($classname = "${model.camelCase($element)}Element")
+import org.odftoolkit.odfdom.dom.element.${NS}.${classname};
+#end
+#end
+##
+
+/**
+ * The default visitor for ODF XML sSchema elements.
+ * The default behavior of all specific elements is to dispatch to the visit call
+ * to their super class <code>OdfElement<code>.
+ * This default method is abstract and have to be overridden.
+ * The method is the only method of <code>ElementVisitor<code> interface from the package layer.
+ */
+public abstract class DefaultElementVisitor implements ElementVisitor {
+
+	abstract public void visit(OdfElement element);
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+#set ($NS = ${element.getNamespace()})
+#set ($classname = "${model.camelCase($element)}Element")
+
+	/**
+	 * A method to visit "${element.getQName()}" elements
+	 * @param ele - an instance of $classname
+	 */
+	public void visit($classname ele) {
+		visit((OdfElement) ele);
+	}
+#end
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-elementbase-template.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-elementbase-template.vm
new file mode 100644
index 0000000..44315a8
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-elementbase-template.vm
@@ -0,0 +1,206 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the Java class representing an ODF element.
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+#set ($base = $javamodel.getBaseclass($context))
+#set ($baseElement = ${model.getElement($base.getQName())})
+#set($classname = "${model.camelCase($base)}ElementBase")
+##
+## Set Superclass
+#if (${base.isStylable()})
+#set ($stylable = true)
+#set ($superclass = "OdfStylableElement")
+#if ($baseElement)
+#set ($elementStyleFamily=${odfmodel.getStyleFamilies($baseElement)})
+#set ($useOdfStyleableShapeElement = false)
+#foreach($f in $elementStyleFamily)
+#if (${f.getQName()}=="draw:graphic" || ${f.getQName()}=="presentation:presentation")
+#set ($useOdfStyleableShapeElement = true)
+#end
+#end
+#end
+#else
+#set ($superclass = 'OdfElement')
+#end
+#if ($context== "text:list-level-style")
+#set ($superclass = 'OdfStyleBase')
+#end
+
+#if ($useOdfStyleableShapeElement || $classname=="DrawShapeElementBase")
+#set ($superclass = "OdfStyleableShapeElement")
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.${base.getNamespace()};
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+#foreach ($attribute in ${base.getBaseAttributes().withoutMultiples()})
+#if ($attribute == "*")
+#set ($anyattribute = true)
+#else
+import org.odftoolkit.odfdom.dom.attribute.${attribute.getNamespace()}.${model.camelCase($attribute)}Attribute;
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * DOM implementation of OpenDocument base element
+ *
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public abstract class $classname extends $superclass {
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+#if (${base.isStylable()}&& ($useOdfStyleableShapeElement == false) || $classname=="TextParagraphElementBase")
+	public $classname(OdfFileDom ownerDoc, OdfName elementName, OdfStyleFamily styleFamily, OdfName styleAttrName) {
+		super(ownerDoc, elementName, styleFamily, styleAttrName);
+	}
+#else
+	public $classname(OdfFileDom ownerDoc, OdfName elementName) {
+		super(ownerDoc, elementName);
+	}
+#end
+
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in ${base.getBaseAttributes().withoutMultiples()})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attr.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+#set($values = ${attr.getValues().withoutMultiples()})
+#if ($values.size() ==2)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${model.camelCase($attribute)}Attribute")
+#set ($aParam = "${model.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @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(OdfDocumentNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attr, $base))
+#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attr, $base))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attr))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $model.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-stylefamily.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-stylefamily.vm
new file mode 100644
index 0000000..5ebd24e
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-stylefamily.vm
@@ -0,0 +1,117 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the list of artefacts which are to be generated
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.style;
+
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFamilyAttribute;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Map;
+import java.util.HashMap;
+##
+#foreach ($styleelement in ${model.getElements().withoutMultiples()})
+#if ($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+import org.odftoolkit.odfdom.dom.element.style.${model.camelCase($styleelement)}Element;
+#end
+#end
+
+public class OdfStyleFamily implements Comparable<OdfStyleFamily> {
+
+	private String m_name;
+//    private Class m_styleClass;
+	private Set<OdfStyleProperty> m_properties = new TreeSet<OdfStyleProperty>();
+	private static Map<String, OdfStyleFamily> m_familyByName = new HashMap<String, OdfStyleFamily>();
+
+	public static OdfStyleFamily getByName(String name) {
+		return m_familyByName.get(name);
+	}
+
+	private OdfStyleFamily(String name /*, Class styleClass*/, OdfStyleProperty[] props) {
+		m_name = name;
+//        m_styleClass = styleClass;
+		for (OdfStyleProperty prop : props) {
+			m_properties.add(prop);
+		}
+		m_familyByName.put(name, this);
+	}
+
+	public String getName() {
+		return m_name;
+	}
+
+	public int compareTo(OdfStyleFamily o) {
+		return m_name.compareTo(o.toString());
+	}
+
+	public static OdfStyleFamily valueOf(String name) {
+		OdfStyleFamily family = getByName(name);
+		if (family == null)
+			family = new OdfStyleFamily(name,  new OdfStyleProperty[]{ null });
+
+		return family;
+	}
+
+	public static String toString(OdfStyleFamily family) {
+		if (family != null)
+			return family.toString();
+		else
+			return new String();
+	}
+
+	@Override
+	public String toString() {
+		return m_name;
+	}
+
+	public Set<OdfStyleProperty> getProperties() {
+		return m_properties;
+	}
+
+#foreach ($family in ${odfmodel.getStyleFamilies()})
+	public final static OdfStyleFamily ${model.camelCase($model.extractLocalname($family))} = new OdfStyleFamily("${model.extractLocalname($family)}",
+			new OdfStyleProperty[]{
+#foreach ($styleelement in ${model.getElements().withoutMultiples()})
+#if ($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+#foreach ($property in ${styleelement.withMultiples().getAttributes()})
+#set($propertyName = ${property.getLocalName()})
+#if (${styleelement.getLocalName()}=="graphic-properties" && $propertyName =="shadow")
+#set($propertyName = ${property.getQName()})
+#end
+	${model.camelCase($styleelement)}Element.${model.camelCase($propertyName)},
+#end
+#end
+#end
+	});
+
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-styleproperties.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-styleproperties.vm
new file mode 100644
index 0000000..9e9dfe7
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-styleproperties.vm
@@ -0,0 +1,40 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+#include('copyright.txt')
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+#set ($element = ${model.getElement($context)})
+#set ($classname = "Odf${model.camelCase($element.getLocalName())}")
+public interface $classname {
+#foreach ($property in ${element.getAttributes().withoutMultiples()})
+#set($propertyName = ${property.getLocalName()})
+#if (${element.getLocalName()}=="graphic-properties" && $propertyName =="shadow")
+#set($propertyName = ${property.getQName()})
+#end
+	public final static OdfStyleProperty ${model.camelCase($propertyName)} =
+		OdfStyleProperty.get(OdfStylePropertiesSet.${model.camelCase($element.getLocalName())}, OdfName.newName(OdfDocumentNamespace.${property.getNamespace().toUpperCase()}, "${property.getLocalName()}"));
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-styleset.vm b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-styleset.vm
new file mode 100644
index 0000000..340fec7
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/dom/template/java-odfdom-styleset.vm
@@ -0,0 +1,37 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+## Template	to create the list of artefacts	which are to be	generated
+##
+## Documentation of	template development can be	found in local file
+## TemplateHelp.html.
+##
+##
+#include('copyright.txt')
+// !!! GENERATED SOURCE	CODE !!!
+package	org.odftoolkit.odfdom.dom.style.props;
+public enum	OdfStylePropertiesSet {
+#foreach ($styleelement	in ${model.getElements().withoutMultiples()})
+#if	($styleelement.getNamespace() == "style" && ${styleelement.getLocalName().endsWith("properties")})
+	// style-${styleelement.getLocalName()}-attlist
+	${model.camelCase($styleelement.getLocalName())},
+#end
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/pkg/config.xml b/trunk/odfdom/src/codegen/resources/pkg/config.xml
new file mode 100644
index 0000000..0bf8c2e
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/config.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<config>
+    <data-types>
+        <data name="NCName" value-type="String" conversion-type="String"/>
+        <data name="anyURI" value-type="String" conversion-type="org.odftoolkit.odfdom.dom.type.OdfAnyURI"/>
+        <data name="integer" value-type="Integer" conversion-type="Integer"/>
+        <data name="ID" value-type="String" conversion-type="org.odftoolkit.odfdom.dom.type.OdfId"/>
+        <data name="IDREF" value-type="String" conversion-type="org.odftoolkit.odfdom.dom.type.OdfId"/>
+        <data name="IDREFS" value-type="String" conversion-type="org.odftoolkit.odfdom.dom.type.OdfId"/>
+        <data name="double" value-type="Double" conversion-type="Double"/>
+        <data name="date" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.dom.type.OdfDate"/>
+        <data name="nonNegativeInteger" value-type="Integer" conversion-type="org.odftoolkit.odfdom.dom.type.OdfNonNegativeInteger"/>
+        <data name="positiveInteger" value-type="Integer" conversion-type="org.odftoolkit.odfdom.dom.type.OdfPositiveInteger"/>
+        <data name="time" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.dom.type.OdfDate"/>
+        <data name="duration" value-type="javax.xml.datatype.Duration" conversion-type="org.odftoolkit.odfdom.dom.type.OdfDuration"/>
+        <data name="base64Binary" value-type="String" conversion-type="String"/>
+        <data name="token" value-type="String" conversion-type="String"/>
+        <data name="string" value-type="String" conversion-type="String"/>
+        <data name="language" value-type="String" conversion-type="String"/>
+        <data name="dateOrDateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.dom.type.OdfDate"/>
+        <data name="dateTime" value-type="javax.xml.datatype.XMLGregorianCalendar" conversion-type="org.odftoolkit.odfdom.dom.type.OdfDate"/>
+        <data name="boolean" value-type="Boolean" conversion-type="org.odftoolkit.odfdom.dom.type.OdfBoolean"/>
+        <data name="percent" value-type="Double" conversion-type="org.odftoolkit.odfdom.dom.type.OdfPercent"/>
+        <data name="nonNegativeLength" value-type="String" conversion-type="org.odftoolkit.odfdom.dom.type.OdfNonNegativeLength"/>
+    </data-types>
+</config>
diff --git a/trunk/odfdom/src/codegen/resources/pkg/javacodetemplate.xml b/trunk/odfdom/src/codegen/resources/pkg/javacodetemplate.xml
new file mode 100644
index 0000000..cb0ddff
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/javacodetemplate.xml
@@ -0,0 +1,1200 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+  
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ 
+-->
+<template class="java">
+
+<ref name="gen_dom_type_enumerations"/>
+<ref name="gen_dom_base_elements"/>
+<ref name="gen_manifest_dom_elements"/>
+<ref name="gen_OdfNamespace"/>
+<ref name="gen_manifest_pkg_elements"/>
+<ref name="gen_OdfElementFactory"/>
+    
+<!-- generate flat rng -->
+<!--file name="elements" extension="xml">
+<code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;elements&gt;</code>
+      <foreach type="element">
+<code>
+&lt;element name="%{elementqname}"&gt;</code>
+<foreach type="attribute">
+<if test="valuetype='enum'">
+<code>
+&lt;attribute name="%{attributeqname}" type="enum"&gt;</code>
+<foreach type="value" seperator=", ">
+ <code>"%{value}"</code>
+</foreach>
+<code>&lt;/attribute&gt;</code>
+<else>
+<code>
+&lt;attribute name="%{attributeqname}" type="%{valuetype}"/&gt;</code>    
+</else>
+</if>
+</foreach>   
+<code>
+&lt;/element&gt;</code>      
+      </foreach>
+<code>
+&lt;/elements&gt;</code>
+</file-->  
+
+<!-- copyright header for .java files -->  
+<define name="header">
+<code>/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */    
+</code>
+</define>
+
+<!-- copyright header for .java files -->  
+<define name="docheader">
+<code>/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+</code>
+</define>
+<!-- sets the name for the current attribute ============================== -->
+
+<define name="convertenumvaluetype">
+    <if test="valuetype='enum'">
+        <if test="not endswith(conversiontype,'type')">
+            <set valuetype="org.odftoolkit.odfdom.dom.type.%{prefix(conversiontype)}:Odf%{identifier(conversiontype)}Type"/>
+            <else>
+                <set valuetype="org.odftoolkit.odfdom.dom.type.%{prefix(conversiontype)}:Odf%{identifier(conversiontype)}"/>
+            </else>
+         </if>
+         <set conversiontype="%{valuetype}"/>
+         <set valueoffunc="enumValueOf"/>
+         <else>
+             <set valueoffunc="valueOf"/>
+         </else>
+    </if>            
+</define>
+
+
+<!-- create getter and setter for all attributes of the current element ==== -->
+
+<define name="setxlinkdefaults">
+    <foreach type="attribute">
+        <if test="(valuetype = 'String') and (attributeqname = 'xlink:type' or attributeqname = 'xlink:show' or attributeqname = 'xlink:actuate')">
+            <foreach type="value">
+<code>        setOdfAttribute( OdfName.get( OdfNamespace.XLINK, "%{local_name(attributeqname)}" ), "%{value}" );
+</code>
+            </foreach>
+        </if>
+    </foreach>
+</define>
+
+<define name="attributes">
+    <foreach type="attribute">
+    <ref name="convertenumvaluetype"/>
+    <if test="not prefix(attributeqname)">
+        <set namespace='""'/>
+        <else>
+            <set namespace="OdfNamespace.%{toupper(prefix(attributeqname))}"/>
+        </else>
+    </if>
+    <if test="(valuetype != 'String') or (attributeqname != 'xlink:type' and attributeqname != 'xlink:show' and attributeqname != 'xlink:actuate')">
+        <code>
+    /**
+     * Get value of attribute {@attributeName %{attributeqname}}.
+     *
+     *@return return the attribute which type is %{local_name(valuetype)}
+     */
+    public %{local_name(valuetype)} get%{identifier(attributename)}()
+    {</code>
+            <if test="not defaultvalue and valuetype = 'String' and conversiontype = 'String'">
+<code>
+        return getOdfAttribute( OdfName.get( %{namespace}, "%{local_name(attributeqname)}" ) );
+</code>        
+                <else>
+<code>                    
+        String aStringVal = getOdfAttribute( OdfName.get( %{namespace}, "%{local_name(attributeqname)}" ) );</code>
+<if test=" defaultvalue = '&quot;' ">
+<code>
+        if( aStringVal.length()==0 )
+        {
+            aStringVal = "\%{defaultvalue}";
+        }
+</code>   
+	<else>
+		<if test="defaultvalue">
+<code>
+        if( aStringVal.length()==0 )
+        {
+            aStringVal = "%{defaultvalue}";
+        }
+</code> 			
+		</if>
+	</else>
+</if>        
+<code>
+        return %{local_name(conversiontype)}.%{valueoffunc}( aStringVal);
+</code>        
+                </else>
+            </if>
+<code>    }
+
+    /**
+     * Set value of attribute {@attributeName %{attributeqname}}.
+     *
+     *@param  _a%{identifier(attributename)}    the attribute's type is %{local_name(valuetype)}
+     */
+    public void set%{identifier(attributename)}( %{local_name(valuetype)} _a%{identifier(attributename)} )
+    {</code>
+            <if test="valuetype = 'String' and conversiontype = 'String'">
+<code>
+        setOdfAttribute( OdfName.get( %{namespace}, "%{local_name(attributeqname)}" ), _a%{identifier(attributename)} );
+</code>        
+                <else>
+<code>                    
+        String aStringVal = %{local_name(conversiontype)}.toString( _a%{identifier(attributename)} );
+        setOdfAttribute( OdfName.get( %{namespace}, "%{local_name(attributeqname)}" ), aStringVal );
+</code>        
+                </else>
+            </if>            
+            
+            <if test="attributeqname = 'xlink:href'">
+                <ref name="setxlinkdefaults"/>
+            </if>
+<code>    }
+</code> 
+      </if>
+    </foreach>          
+</define>
+
+<!-- imports section for the current element =============================== -->
+
+<define name="doImport">
+  <if test="not contains(imports,import,';')">
+<code>import %{import};
+</code>
+      <set imports="%{imports};%{import}"/>
+  </if>
+</define>
+
+<define name="element-import-section">
+<code>import org.odftoolkit.odfdom.dom.OdfName;
+import org.odftoolkit.odfdom.pkg.manifest.OdfNamespace;
+import org.odftoolkit.odfdom.doc.OdfFileDom;
+</code>
+<if test="elementstylefamily!=''">
+<code>import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+</code>
+</if>
+<!-- import base class, but only if it is in another package -->
+<if test="prefix(baseclassname) != prefix(classname)">
+<code>import %{baseclassname};
+</code>
+</if>
+  <!-- do imports for attribute values and conversion types -->
+ <if test="elementbasename != 'styleproperties'">
+  <set imports=""/>
+  <foreach type="attribute">
+    <set import=""/>
+    <if test="valuetype = 'enum'">
+        <ref name="convertenumvaluetype"/>
+        <set import="%{prefix(valuetype)}.%{local_name(valuetype)}"/>
+        <set conversiontype="%{valuetype}"/>
+        <else>
+            <if test="prefix(valuetype) != ''">
+                <set import="%{substring-before(valuetype,'&lt;')}"/>
+            </if>
+        </else>
+    </if>
+    <if test="import">
+        <ref name="doImport"/>
+    </if>
+    <if test="valuetype != conversiontype">
+        <if test="prefix(conversiontype)">
+            <set import="%{substring-before(conversiontype,'&lt;')}"/>
+            <ref name="doImport"/>
+        </if>
+    </if>
+  </foreach>
+  <else>
+<code>import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+</code>
+</else>
+  </if>
+</define>
+
+<!-- sets 'ret' to 'true' if the current element has non optional attributes -->
+<define name="check_for_non_optional_attributes">
+    <set ret="false"/>
+    <foreach type="attribute">
+        <if test="not optionalattribute">
+            <set ret="true"/>
+        </if>
+    </foreach>
+</define>
+
+<!-- create constructor parameter string for current non optional attributes -->
+<define name="element_ctor_params">
+    <foreach type="attribute">
+        <if test="not optionalattribute">
+            <ref name="convertenumvaluetype"/>
+                <code>%{sep}%{local_name(valuetype)} _a%{identifier(attributename)}</code>
+            <set sep=", "/>
+        </if>
+    </foreach>
+</define>
+
+<!-- create the parameter list for the init method of the current element == -->
+<define name="element_init_params">
+    <foreach type="attribute">
+        <if test="not optionalattribute">
+            <ref name="convertenumvaluetype"/>
+                <code>_a%{identifier(attributename)}</code>
+            <set sep=", "/>
+        </if>
+    </foreach>
+</define>
+
+<!-- create init method for current non optional attributes -->
+<define name="element_ctor_init">
+    <foreach type="attribute">
+        <if test="not optionalattribute">
+            <ref name="convertenumvaluetype"/>
+<code>        set%{identifier(attributename)}( _a%{identifier(attributename)} );
+</code>
+        </if>
+    </foreach>
+</define>
+ 
+<!-- create enumerations java files ===================================== -->
+<define name="gen_dom_type_enumerations">
+  <foreach type="element">
+    <foreach type="attribute">
+      <if test="valuetype='enum'">
+        <ref name="convertenumvaluetype"/>
+        <set enumclassname="%{local_name(valuetype)}"/>
+        <file path="%{prefix(valuetype)}" name="%{enumclassname}" extensions="java">
+          <ref name="header"/>
+<code>package %{prefix(valuetype)};
+
+public enum %{enumclassname}
+{
+              </code>
+              <foreach type="value" seperator=", ">
+                 <code>%{toupper(identifier(replace("-","_",value)))}( "%{value}" )</code>
+              </foreach>
+              <code>;
+
+    private String m_aValue;
+
+    %{enumclassname}( String _aValue )
+    {
+        m_aValue = _aValue;
+    }
+
+    public String toString()
+    {
+        return m_aValue;
+    }
+
+    public static String toString( %{enumclassname} _aEnum )
+    {
+        return _aEnum.toString();
+    }
+
+    public static %{enumclassname} enumValueOf( String _aString )
+    {
+        for( %{enumclassname} aIter : values() )
+        {
+            if( _aString.equals( aIter.toString() ) )
+            {
+                return aIter;
+            }
+        }
+        return null;
+    }
+
+}
+</code>
+        </file>
+      </if>
+    </foreach>
+  </foreach>
+</define>
+
+<!-- create base element class files ===================================== -->
+<define name="gen_dom_base_elements">
+  <foreach type="baseelement">
+    <set classname="org.odftoolkit.odfdom.dom.element.%{prefix(elementqname)}.Odf%{identifier(elementname)}ElementBase"/>
+    <if test="not elementstylefamily">        
+        <if test="elementbasename = 'container'">
+            <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfContainerElementBase"/>
+            <else>
+                <if test="elementbasename = 'style'">
+                    <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStyleBase"/>
+                    <else>
+                       <if test="elementbasename = 'styleproperties'">
+                          <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase"/>
+                          <else>
+                              <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfElement"/>
+                          </else>
+                       </if>
+                     </else>
+                  </if>
+               </else>
+           </if>
+        <else>
+            <if test="elementstylefamily!='draw:graphic,presentation:presentation'">
+                <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStylableElement"/>
+                <else>
+                    <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStyleablePresentationElement"/>
+                </else>
+            </if>
+        </else>
+    </if>
+    <file path="%{prefix(classname)}" name="%{local_name(classname)}" extensions="java">      
+      <ref name="header"/>
+<code>package org.odftoolkit.odfdom.dom.element.%{prefix(elementqname)};
+</code>
+      <ref name="element-import-section"/>
+      <code>
+
+/**
+ * ODF DOM base element implementation.
+ */
+public abstract class %{local_name(classname)} extends %{local_name(baseclassname)}
+{</code>
+<if test="(elementstylefamily = '') or (elementstylefamily = 'draw:graphic,presentation:presentation')">
+<code>
+    public %{local_name(classname)}( OdfFileDom _aOwnerDoc, OdfName element_name )
+    {
+        super( _aOwnerDoc, element_name );
+    }</code>
+<else>    
+<code>
+    public %{local_name(classname)}( OdfFileDom _aOwnerDoc ,OdfName _elementName ,OdfStyleFamily _styleFamily ,OdfName _styleAttrName )
+    {
+        super( _aOwnerDoc, _elementName, _styleFamily, _styleAttrName );
+    }</code>   
+</else>    
+</if>
+<code>
+    /**
+     * Initialize mandatory attributes.
+     */
+    public void init(</code>
+<set sep=""/>    
+<ref name="element_ctor_params"/>    
+<code>)
+    {
+</code>
+<ref name="element_ctor_init"/>    
+<code>    }
+      </code>
+      <if test="elementbasename != 'styleproperties'">
+        <ref name="attributes"/>
+        <else>
+            
+        </else>
+      </if>
+      <code>
+}
+      </code>
+    </file>
+  </foreach>    
+</define>
+
+<define name="get_baseclassname">
+    <if test="not elementbasename">
+        <if test="not elementstylefamily">        
+            <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfElement"/>
+            <else>
+                <if test="elementstylefamily!='draw:graphic,presentation:presentation'">
+                    <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStylableElement"/>
+                    <else>
+                        <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStyleablePresentationElement"/>
+                    </else>
+                </if>                
+            </else>
+        </if>
+        <else>
+            <if test="elementbasename = 'container'">
+                <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfContainerElementBase"/>
+            <else>
+                <if test="elementbasename = 'style'">
+                    <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStyleBase"/>
+                    <else>
+                       <if test="elementbasename = 'styleproperties'">
+                          <set baseclassname="org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase"/>
+                          <else>
+                            <set baseclassname="org.odftoolkit.odfdom.dom.element.%{prefix(elementbasename)}.Odf%{identifier(elementbasename)}ElementBase"/>
+                          </else>
+                       </if>
+                    </else>
+                </if>
+            </else>
+            </if>
+        </else>
+    </if>
+</define>
+
+<!-- create dom element class files ========================================== -->
+<define name="gen_manifest_dom_elements">
+  <foreach type="element">
+    <!-- test if this element has mandatory (non optional) attributes -->
+    <ref name="check_for_non_optional_attributes"/>
+    <set hasMandatoryAttr="%{ret}"/>
+    <set packagename = "%{prefix(elementqname)}" />
+    <set currentname = "%{elementname}" />
+
+    <!-- now check if base element has mandatory (non optional) attributes -->
+    <set baseHasMandatoryAttr="false"/>
+    <if test="prefix(elementbasename) != ''">
+      <select type="baseelement" name="%{elementbasename}">
+        <ref name="check_for_non_optional_attributes"/>
+        <set baseHasMandatoryAttr="%{ret}"/>
+      </select>
+    </if>
+
+	<set classname="org.odftoolkit.odfdom.pkg.%{prefix(elementqname)}.element.Odf%{identifier(elementname)}Element"/>
+    <ref name="get_baseclassname"/>
+    <file path="%{prefix(classname)}" name="Odf%{identifier(elementname)}Element" extensions="java">
+      <ref name="header"/>
+      <code>
+package %{prefix(classname)};
+
+</code>
+      <ref name="element-import-section"/>
+      
+      <!-- now set the imports for child elements and attributes -->
+     <set imports=""/>
+     <set import="" />  
+       <children type="element">
+            <if test = "currentname != elementname">
+               <if test="prefix(elementqname) != packagename and elementname !='hyperlink' and elementname !='measure' and elementqname !='presentation:event-listener' ">
+                  <set import="org.odftoolkit.odfdom.dom.element.%{prefix(elementqname)}.Odf%{identifier(elementname)}Element"/>
+               </if>
+           </if>
+           <if test="not contains(imports,import,';')">
+               <if test="import !=''">
+                <if test="imports =''">
+                   <set imports="import %{import}"/>
+                   <else>
+                      <set imports="%{imports};%{import}"/>
+                   </else>
+                </if>
+               </if>
+           </if>
+           <set import="" />
+           <subattribute>
+               <group>
+                  <set import="" />
+                  <if test = "valuetype != conversiontype and attributeqname !='style:num-format'">" >
+                       <if test=" valuetype = 'enum'">
+                             <if test="not endswith(conversiontype,'type')">
+                                      <set import="org.odftoolkit.odfdom.dom.type.%{prefix(conversiontype)}.Odf%{identifier(conversiontype)}Type"/>
+                                   <else>
+                                        <set import="org.odftoolkit.odfdom.dom.type.%{prefix(conversiontype)}.Odf%{identifier(conversiontype)}"/>
+                                   </else>
+                             </if>
+                       </if>
+                       <if test="local_name(valuetype) ='Duration' or local_name(valuetype) = 'XMLGregorianCalendar' ">
+                             <set import="%{valuetype}" />
+                       </if>
+                       <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='Type' or identifier(attributename)='Orientation' or identifier(attributename)='SortMode') ">
+                                <set import="org.odftoolkit.odfdom.dom.type.%{prefix(attributeqname)}.Odf%{identifier(conversiontype)}Type"/>
+                       </if>
+ 
+                       <else>
+                            <if test=" valuetype ='String' and identifier(attributename)='ValueType'">
+                                <set import="org.odftoolkit.odfdom.dom.type.%{prefix(attributeqname)}.Odf%{identifier(attributename)}"/>
+                            </if>
+                            <if test=" valuetype ='String' and identifier(attributename)='LegendExpansion'">
+                                <set import="org.odftoolkit.odfdom.dom.type.%{prefix(attributeqname)}.Odf%{identifier(attributename)}Type"/>
+                            </if>
+                            <if test="local_name(valuetype) ='OdfPresentationClasses'">
+                                <set import="%{valuetype}" />
+                            </if>
+                       </else>                       
+                  </if>
+                  <if test="not contains(imports,import,';')">
+                          <if test="import !=''">
+                            <if test="imports =''">
+                                <set imports="import %{import}"/>
+                            <else>
+                                 <set imports="%{imports};%{import}"/>
+                             </else>
+                             </if>
+                           </if>
+                   </if>
+               </group>
+           </subattribute>
+      </children>
+      <if test ="imports =''">
+           <set allimport=""/>
+         <else>
+           <set allimport="%{imports}"/>
+           <set allimport="%{replace(';',';\nimport ',allimport)}" />
+        </else>
+       </if><code>
+%{allimport};</code>
+      
+      <code>
+
+/**
+ * ODF DOM Element implementation for element {@odfLink %{elementqname}}.
+ *
+ */
+public abstract class %{local_name(classname)} extends %{local_name(baseclassname)}
+{        
+    public static final OdfName ELEMENT_NAME = OdfName.get( OdfNamespace.%{toupper(prefix(elementqname))}, "%{local_name(elementqname)}" );
+
+    public %{local_name(classname)}( OdfFileDom _aOwnerDoc )
+    {
+        super( _aOwnerDoc, ELEMENT_NAME</code>
+<if test="(elementstylefamily != '') and (elementstylefamily != 'draw:graphic,presentation:presentation')">
+<code>, OdfStyleFamily.%{identifier(elementstylefamily)}, OdfName.get( OdfNamespace.%{toupper(prefix(elementstylefamily))}, "style-name" )</code>
+</if>
+<code> );
+    }
+
+    public OdfName getOdfName()
+    {
+        return ELEMENT_NAME;
+    }
+
+</code>
+
+      <if test="elementbasename != 'styleproperties'">
+
+<!-- add init method if this element or the base element has mandatory attributes -->
+<if test="hasMandatoryAttr or baseHasMandatoryAttr">
+<code>    /**
+     * Initialize mandatory attributes.
+     */
+    public void init(</code>
+<set sep=""/>    
+<ref name="element_ctor_params"/>
+<if test="baseHasMandatoryAttr">
+  <select type="baseelement" name="%{elementbasename}">
+    <ref name="element_ctor_params"/>
+  </select>
+</if>
+<code>)
+    {
+</code>
+<ref name="element_ctor_init"/>    
+      <!-- if we have a base element, call its init function here -->
+      <if test="baseHasMandatoryAttr">
+          <select type="baseelement" name="%{elementbasename}">
+              <code>        super.init( </code>
+              <set sep=""/>
+                  <ref name="element_init_params"/>
+              <code> );
+</code>
+        </select>
+      </if>
+<code>    }
+</code>
+</if>      
+        <ref name="attributes"/>
+<else>
+            <foreach type="attribute">
+<code>    public final static OdfStyleProperty %{identifier(attributename)} = 
+        OdfStyleProperty.get(OdfStylePropertiesSet.%{identifier(local_name(elementqname))}, OdfName.get(OdfNamespace.%{toupper(prefix(attributeqname))}, "%{local_name(attributeqname)}"));
+</code>
+            </foreach>
+</else>
+</if>
+
+<!-- add create child elements method  -->
+      <set selements="" />
+      <children type="element">
+          <set hasparameters="false" />
+            <subattribute>
+              <set hasparameters="true" />
+              <if test="elementname='hyperlink'or elementname='measure' or elementqname ='presentation:event-listener'">
+                     <set childname="org.odftoolkit.odfdom.dom.element.%{prefix(elementqname)}.Odf%{identifier(elementname)}Element"/>
+            <code>
+    /**
+    * Create child element {@odfLink %{elementqname}}.
+    *</code>
+               <set parameters = ""/>
+               <set sep="" />
+               <group>
+                  <set hasparameters="true" />
+                  <if test="valuetype != conversiontype " >
+                       <if test="valuetype ='enum' and attributeqname != 'style:num-format'">
+                             <if test="not endswith(conversiontype,'type') ">
+                                    <set parameter="_a%{identifier(attributename)}     the attribute's type is Odf%{identifier(conversiontype)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                                 <else>
+                                   <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(conversiontype)}, see {@attributeName  %{conversiontype}} at specification"/>
+                                 </else>
+                             </if>
+                             <else>
+                               <if test="attributeqname ='style:num-format'">
+                                   <set parameter="_a%{identifier(attributename)}   the attribute's type is String"/>
+                                </if>                             
+                             </else>                      
+                       </if>
+                       <if test=" valuetype ='Integer' or valuetype ='Boolean' or valuetype='String'">
+                                <set parameter="_a%{identifier(attributename)}  the attribute's type is %{valuetype}"/>
+                       </if>
+                       <if test=" valuetype='javax.xml.datatype.Duration' or valuetype ='javax.xml.datatype.XMLGregorianCalendar' ">
+                                <set parameter="_a%{identifier(attributename)}    the attribute's type is %{local_name(valuetype)}"/>
+                       </if>
+                       <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='Display')">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(conversiontype)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                       </if>
+                        <if test=" valuetype ='String' and identifier(attributename)='LegendExpansion' ">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(attributename)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                        </if>
+                        <if test=" valuetype ='String' and attributename ='style:num-format' ">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is String"/>
+                        </if>
+                        <if test=" valuetype ='String' and (identifier(attributename)='Type' or identifier(attributename)='Orientation' or identifier(attributename)='SortMode')">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(conversiontype)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                        </if>
+                       <else>
+                            <set parameter="_a%{identifier(attributename)} %{local_name(valuetype)}   " />
+                            <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='MemberType') ">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(attributename)}, see {@attributeName  %{attributename}} at specification"/>
+                            </if>
+                             <if test=" valuetype ='String' and (identifier(attributename)='LegendExpansion' or identifier(attributename)='SortMode')">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(attributename)}Type, see {@attributeName  %{attributename}} at specification"/>
+                             </if>
+                             <if test=" valuetype ='String' and identifier(attributename)='Concave' ">
+                                  <set parameter="_a%{identifier(attributename)}   the attribute's type is Boolean"/>
+                             </if>
+                       </else>
+                  </if>
+                  <set parameters="%{parameters}%{sep}%{parameter}" /> 
+                  <set sep=";"/> 
+               </group>
+               <if test="parameters != ''" ><code>*@param %{replace(';','\n    *@param ',parameters)}</code></if>
+    <code>*@return   return  the element {@odfLink %{elementqname}}
+    */
+    public %{childname} create%{prefix(elementqname)}%{identifier(elementname)}Element(</code>
+                   <else>
+                     <set childname = "Odf%{identifier(elementname)}Element" />
+                                 <code>
+    /**
+    * Create child element {@odfLink %{elementqname}}.
+    *
+    </code>
+               <set parameters = ""/>
+               <set sep="" />
+               <group>
+                  <set hasparameters="true" />
+                  <if test="valuetype != conversiontype " >
+                       <if test="valuetype ='enum' and attributeqname != 'style:num-format'">
+                             <if test="not endswith(conversiontype,'type') ">
+                                    <set parameter="_a%{identifier(attributename)}     the attribute's type is Odf%{identifier(conversiontype)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                                 <else>
+                                   <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(conversiontype)}, see {@attributeName  %{conversiontype}} at specification"/>
+                                 </else>
+                             </if>
+                             <else>
+                               <if test="attributeqname ='style:num-format'">
+                                   <set parameter="_a%{identifier(attributename)}   the attribute's type is String"/>
+                                </if>                             
+                             </else>                      
+                       </if>
+                       <if test=" valuetype ='Integer' or valuetype ='Boolean' or valuetype='String'">
+                                <set parameter="_a%{identifier(attributename)}  the attribute's type is %{valuetype}"/>
+                       </if>
+                       <if test=" valuetype='javax.xml.datatype.Duration' or valuetype ='javax.xml.datatype.XMLGregorianCalendar' ">
+                                <set parameter="_a%{identifier(attributename)}    the attribute's type is %{local_name(valuetype)}"/>
+                       </if>
+                       <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='Display')">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(conversiontype)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                       </if>
+                        <if test=" valuetype ='String' and identifier(attributename)='LegendExpansion' ">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(attributename)}Type"/>
+                        </if>
+                        <if test=" valuetype ='String' and attributename ='style:num-format' ">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is String"/>
+                        </if>
+                        <if test=" valuetype ='String' and (identifier(attributename)='Type' or identifier(attributename)='Orientation' or identifier(attributename)='SortMode')">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(conversiontype)}Type, see {@attributeName  %{conversiontype}} at specification"/>
+                        </if>
+                       <else>
+                            <set parameter="_a%{identifier(attributename)} %{local_name(valuetype)}   " />
+                            <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='MemberType') ">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(attributename)}, see {@attributeName  %{attributename}} at specification"/>
+                            </if>
+                             <if test=" valuetype ='String' and (identifier(attributename)='LegendExpansion' or identifier(attributename)='SortMode')">
+                                <set parameter="_a%{identifier(attributename)}   the attribute's type is Odf%{identifier(attributename)}Type, see {@attributeName  %{attributename}} at specification"/>
+                             </if>
+                             <if test=" valuetype ='String' and identifier(attributename)='Concave' ">
+                                  <set parameter="_a%{identifier(attributename)}   the attribute's type is Boolean"/>
+                             </if>
+                       </else>
+                  </if>
+                  <set parameters="%{parameters}%{sep}%{parameter}" /> 
+                  <set sep=";"/> 
+               </group>
+               <if test="parameters != ''" ><code>*@param %{replace(';','\n    *@param ',parameters)}</code></if>
+    <code>*@return   return  the element {@odfLink %{elementqname}}
+    */
+    public %{childname} create%{identifier(elementname)}Element(</code>
+                   </else>
+              </if>
+               <set parameters = ""/>
+               <set sep="" />
+               <group>
+                  <set hasparameters="true" />
+                  <if test="valuetype != conversiontype " >
+                       <if test="valuetype ='enum' and attributeqname != 'style:num-format'">
+                             <if test="not endswith(conversiontype,'type') ">
+                                    <set parameter="Odf%{identifier(conversiontype)}Type   _a%{identifier(attributename)}"/>
+                                 <else>
+                                   <set parameter="Odf%{identifier(conversiontype)}   _a%{identifier(attributename)}"/>
+                                 </else>
+                             </if>
+                             <else>
+                               <if test="attributeqname ='style:num-format'">
+                                   <set parameter="String   _a%{identifier(attributename)}"/>
+                                </if>                             
+                             </else>                      
+                       </if>
+                       <if test=" valuetype ='Integer' or valuetype ='Boolean' or valuetype='String'">
+                                <set parameter="%{valuetype}   _a%{identifier(attributename)}"/>
+                       </if>
+                       <if test=" valuetype='javax.xml.datatype.Duration' or valuetype ='javax.xml.datatype.XMLGregorianCalendar' ">
+                                <set parameter="%{local_name(valuetype)}   _a%{identifier(attributename)}"/>
+                       </if>
+                       <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='Display')">
+                                <set parameter="Odf%{identifier(conversiontype)}Type   _a%{identifier(attributename)}"/>
+                       </if>
+                        <if test=" valuetype ='String' and identifier(attributename)='LegendExpansion' ">
+                                <set parameter="Odf%{identifier(attributename)}Type   _a%{identifier(attributename)}"/>
+                        </if>
+                        <if test=" valuetype ='String' and attributename ='style:num-format' ">
+                                <set parameter="String   _a%{identifier(attributename)}"/>
+                        </if>
+                        <if test=" valuetype ='String' and (identifier(attributename)='Type' or identifier(attributename)='Orientation' or identifier(attributename)='SortMode')">
+                                <set parameter="Odf%{identifier(conversiontype)}Type   _a%{identifier(attributename)}"/>
+                        </if>
+                       <else>
+                            <set parameter="%{local_name(valuetype)}   _a%{identifier(attributename)}" />
+                            <if test=" valuetype ='String' and (identifier(attributename)='ValueType' or identifier(attributename)='MemberType') ">
+                                <set parameter="Odf%{identifier(attributename)}   _a%{identifier(attributename)}"/>
+                            </if>
+                             <if test=" valuetype ='String' and (identifier(attributename)='LegendExpansion' or identifier(attributename)='SortMode')">
+                                <set parameter="Odf%{identifier(attributename)}Type   _a%{identifier(attributename)}"/>
+                             </if>
+                             <if test=" valuetype ='String' and identifier(attributename)='Concave' ">
+                                  <set parameter="Boolean   _a%{identifier(attributename)}"/>
+                             </if>
+                       </else>
+                  </if>
+                  <set parameters="%{parameters}%{sep}%{parameter}" /> 
+                  <set sep=", "/> 
+               </group>
+               <code>%{parameters})
+    {
+        %{childname}  _n%{identifier(elementname)} = ((OdfFileDom)this.ownerDocument).createOdfElement(%{childname}.class);</code>
+            <group>
+            <ref name="convertenumvaluetype"/>
+            <if test="elementbasename = 'styleproperties' or attributeqname ='chart:class'" >
+               <else><code>
+        _n%{identifier(elementname)}.set%{identifier(attributename)}( _a%{identifier(attributename)});</code>
+               </else>
+            </if>
+            </group><code>
+        this.appendChild( _n%{identifier(elementname)});
+        return  _n%{identifier(elementname)};      
+    }
+    </code>
+            </subattribute>
+            <if test="hasparameters='false'" >
+                 <set selement="%{elementqname}"/>
+                 <if test="not contains(selements,selement,';')">
+  
+                   <if test="elementname='hyperlink'or elementname='measure' or elementqname ='presentation:event-listener'">
+                         <set childname="org.odftoolkit.odfdom.dom.element.%{prefix(elementqname)}.Odf%{identifier(elementname)}Element"/>
+                     <else>
+                         <set childname = "Odf%{identifier(elementname)}Element" />
+                     </else>
+                   </if>
+                
+               <code>
+    /**
+    * Create child element {@odfLink %{elementqname}}.
+    *
+    *@return   return  the element {@odfLink %{elementqname}}
+    */
+    public %{childname} create%{identifier(elementname)}Element()
+    {
+        %{childname}  _n%{identifier(elementname)} = ((OdfFileDom)this.ownerDocument).createOdfElement(%{childname}.class);
+        this.appendChild( _n%{identifier(elementname)});
+        return  _n%{identifier(elementname)};
+    }                   
+               </code>
+                                  <set selements="%{selements};%{selement}" />
+
+                </if>
+            </if>
+      </children>
+      <code>
+}
+</code>
+    </file>
+  </foreach>  
+</define>
+
+<!-- generate OdfNamespace java file -->
+<define name="gen_OdfNamespace">
+<set classname="org.odftoolkit.odfdom.pkg.manifest.OdfNamespace"/>
+  <file path="%{prefix(classname)}" name="%{local_name(classname)}" extensions="java">
+      <ref name="header"/>
+<code>
+package %{prefix(classname)};
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.xml.namespace.NamespaceContext;
+import org.odftoolkit.odfdom.dom.OdfName;
+
+/**
+ * class keeping some constants for OpenDocument namespaces
+ */
+public class %{local_name(classname)} implements Comparable, NamespaceContext {
+
+    private static Map&lt;String, String&gt; namesspacesByPrefix;
+    private static Map&lt;String, String&gt; namesspacesByUri;
+
+    static private enum OOoNamespace {
+</code>
+    <foreach type="namespace" seperator=","><code>
+        %{toupper(namespaceprefix)}("%{namespaceprefix}", "%{namespaceuri}")</code>  
+    </foreach>
+	<code>;
+    </code>
+<code>
+        private String mPrefix;
+        private String mNamespaceUri;
+
+        OOoNamespace(String prefix, String namespaceUri) {
+            mPrefix = prefix;
+            mNamespaceUri = namespaceUri;
+        }
+    }
+
+    static {
+        namesspacesByPrefix = new HashMap&lt;String, String&gt;();
+        namesspacesByUri = new HashMap&lt;String, String&gt;();
+        for (OOoNamespace ns : OOoNamespace.values()) {
+            namesspacesByPrefix.put(ns.mPrefix, ns.mNamespaceUri);
+            namesspacesByUri.put(ns.mNamespaceUri, ns.mPrefix);
+        }
+    }
+    private String m_uri;
+    private String m_prefix;
+
+    public %{local_name(classname)}(){}
+    
+    private %{local_name(classname)}(String uri) {
+        this(null, uri);
+    }
+
+    private %{local_name(classname)}(String prefix, String uri) {
+        if (uri != null &amp;&amp; uri.length() > 0) {
+            m_uri = uri;
+        }
+        if (prefix != null &amp;&amp; prefix.length() > 0) {
+            m_prefix = prefix;
+        }
+    }
+
+    public OdfName getOdfName(String name) {
+        int i = name.indexOf(':');
+        if (i >= 0) {
+            return OdfName.get(this, name.substring(i + 1));
+        } else {
+            return OdfName.get(this, name);
+        }
+    }
+    private static SortedSet m_namespaces = new TreeSet();
+
+    public static OdfNamespace get(String uri) {
+        OdfNamespace newns = new OdfNamespace(uri);
+        SortedSet tail = m_namespaces.tailSet(newns);
+        if (tail.size() > 0) {
+            OdfNamespace result = (OdfNamespace) tail.first();
+            if (result.equals(uri)) {
+                return result;
+            }
+        }
+        // no namespace found, create a new one        
+        m_namespaces.add(newns);
+        return newns;
+    }
+
+    public static OdfNamespace get(String prefix, String uri) {
+        OdfNamespace newns = new OdfNamespace(prefix, uri);
+        SortedSet tail = m_namespaces.tailSet(newns);
+        for (Object obj : tail) {
+            OdfNamespace result = (OdfNamespace) obj;
+            if (tail.first().equals(uri)) {
+                if (result.getPrefix().equals(prefix)) {
+                    return result;
+                } else {
+                    // try to find a matching prefix as long as the uri matches
+                    continue;
+                }
+            } else {
+                // uri doesn't match any longer. stop searching
+                break;
+            }
+        }
+        // no namespace found, create a new one        
+        m_namespaces.add(newns);
+        return newns;
+
+    }
+
+    public boolean hasPrefix() {
+        return m_prefix != null;
+    }
+
+    public String getPrefix() {
+        return m_prefix;
+    }
+
+    public String getUri() {
+        return m_uri;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (m_uri != null) {
+            return m_uri.equals(obj.toString());
+        } else {
+            return m_uri == obj;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        if (m_uri != null) {
+            return m_uri.hashCode();
+        } else {
+            return 0;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return m_uri;
+    }
+
+    public static String[] splitQName(String qname) {
+        String localpart = qname;
+        String prefix = null;
+        int colon = qname.indexOf(':');
+        if (colon > 0) {
+            localpart = qname.substring(colon + 1);
+            prefix = qname.substring(0, colon);
+        }
+        return new String[]{prefix, localpart};
+    }
+
+    public static String getPrefixPart(String qname) {
+        return splitQName(qname)[0];
+    }
+
+    public static String getLocalPart(String qname) {
+        return splitQName(qname)[1];
+    }
+
+    public int compareTo(Object o) {
+        return toString().compareTo(o.toString());
+    }
+    
+    // 2DO: use only constants from Enumeration
+    // 2DO: move Namespaceconstants into OdfName.. (?)
+</code>
+    <foreach type="namespace">
+<code>    public static final OdfNamespace %{toupper(namespaceprefix)} = get("%{namespaceprefix}", "%{namespaceuri}");
+</code>
+    </foreach>
+<code>
+    public String getNamespaceURI(String prefix) {
+        return namesspacesByPrefix.get(prefix);
+    }
+
+    public static String getNamespaceURIByPrefix(String prefix) {
+        return namesspacesByPrefix.get(prefix);
+    }
+    
+    public String getPrefix(String namespaceUri) {
+        return namesspacesByUri.get(namespaceUri);
+    }
+
+    public Iterator getPrefixes(String namespaceuri) {
+        return namesspacesByPrefix.keySet().iterator();
+    }
+}
+</code>
+</file>
+</define>
+
+<!-- generate doc element java classes ===================================== -->
+<define name="gen_manifest_pkg_elements">
+	<foreach type="element">
+		<set classname="org.odftoolkit.odfdom.pkg.%{prefix(elementqname)}.%{identifier(elementname)}"/>
+		<set baseclassname="org.odftoolkit.odfdom.pkg.%{prefix(elementqname)}.element.Odf%{identifier(elementname)}Element"/>
+		<file path="org/odftoolkit/odfdom/pkg/%{prefix(elementqname)}" name="%{identifier(elementname)}" extensions="java">
+			<ref name="docheader"/>
+			<code>
+package %{prefix(classname)};
+
+import org.odftoolkit.odfdom.doc.OdfFileDom;
+import %{baseclassname};
+
+/**
+ *
+ */
+public class %{local_name(classname)} extends %{local_name(baseclassname)}
+{
+    public %{local_name(classname)}( OdfFileDom _aOwnerDoc )
+    {
+        super( _aOwnerDoc );
+    }
+}
+</code>
+</file>
+</foreach>
+</define>
+
+<!-- create org.odftoolkit.odfdom.doc.element.OdfElementFactory.java ========== -->
+<define name="gen_OdfElementFactory">
+<file path="org/odftoolkit/odfdom/pkg/manifest" name="OdfElementFactory" extensions="java">
+<ref name="header"/>
+<code>
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.Map;
+import org.odftoolkit.odfdom.doc.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfElement;
+import org.odftoolkit.odfdom.dom.OdfName;
+import org.w3c.dom.DOMException;
+import org.odftoolkit.odfdom.doc.element.OdfDefault;
+
+public class OdfElementFactory {
+
+    private static Map&lt;OdfName, Class&gt; m_elementTypes;
+
+    static {
+        populateElementTypes();
+    }
+
+    private synchronized static void populateElementTypes() {
+        if (m_elementTypes != null) {
+            return;
+        }
+        m_elementTypes = new HashMap&lt;OdfName, Class&gt;();
+</code>
+<foreach type="element">
+<set classname="org.odftoolkit.odfdom.pkg.%{prefix(elementqname)}.%{identifier(elementname)}"/>
+<!-- we must use the full qualified class name here as we have equal element names in different namespaces! -->
+<code>        m_elementTypes.put(%{classname}.ELEMENT_NAME, %{classname}.class);
+</code>
+</foreach>
+<code>    }
+    
+    public static void mapOdfNameToClass(OdfName odfName, Class className){
+        m_elementTypes.put(odfName, className);
+    }
+
+    public static OdfElement createOdfElement(OdfFileDom ownerDocument, OdfName name) throws DOMException {
+        OdfElement e = null;
+
+        // lookup registered class for qname
+        Class elementClass = m_elementTypes.get(name);
+
+        // if a class was registered create an instance of that class
+        if (elementClass != null) {
+            try {
+                Constructor ctor = elementClass.getConstructor(new Class[]{OdfFileDom.class});
+                e = (OdfElement) ctor.newInstance(new Object[]{ownerDocument});
+                return e;
+            } catch (Exception cause) {
+                // an exception at this point is a bug. Throw an Error
+                throw new Error("OdfDOM error in element factory", cause);
+            }
+        }
+
+        // otherwise create the default class for odf
+        return (OdfElement) new OdfDefault(ownerDocument, name);
+    }
+}
+</code>    
+</file>
+</define>
+</template>
diff --git a/trunk/odfdom/src/codegen/resources/pkg/template/copyright.txt b/trunk/odfdom/src/codegen/resources/pkg/template/copyright.txt
new file mode 100644
index 0000000..b4a06cd
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/template/copyright.txt
@@ -0,0 +1,24 @@
+/************************************************************************
+ *
+ * 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.
+ * 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.
+ *
+ ************************************************************************/
+
diff --git a/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-dsig-attribute-template.vm b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-dsig-attribute-template.vm
new file mode 100644
index 0000000..60fce5b
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-dsig-attribute-template.vm
@@ -0,0 +1,379 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the list of signature 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
+## 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 ($valueobject = "String")
+##
+#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
+#if ($datatypes.size() > 0)
+#set ($hasdatatype = true)
+#else
+#set ($hasdatatype = false)
+#end
+##
+##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
+#set($values = ${attribute.getValues().withoutMultiples()})
+#if ($values.size() > 0)
+#if ($values.size() ==2 && $hasdatatype == false)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueobject = "Boolean")
+#end
+#end
+#set ($enum = true)
+#if ($valueobject == "Boolean")
+#set ($enum = false)
+#end
+#else
+#set ($enum = false)
+#end
+##
+## Check whether the attribute has default value.
+##
+#set ($hasDefaultValue = false)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
+#set ($hasDefaultValue = true)
+#end
+#end
+##
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($hasDefaultValue and $defaultValueSet.size() == 1)
+#foreach ($value in $defaultValueSet)
+#set ($uniqueDefaultValue = $value)
+#end
+#end
+##
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+#if ($hasDefaultValue)
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute ${PREFIX}:${attribute.getQName()}}.
+ *
+ */
+public class $classname extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("${NS}", "${PREFIX}:${attribute}");
+#if ($hasDefaultValue)
+#if ($defaultValueSet.size()>1)
+#foreach ($defaultValue in $defaultValueSet)
+#set ($constant = $signaturemodel.constantCase($defaultValue))
+#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
+	public static final String DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)}= "$defaultValue";
+#else
+	public static final String DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)}=	Value.${signaturemodel.escapeKeyword($constant)}.toString();
+#end
+#end
+#else
+#if ($uniqueDefaultValue=="&#34;")
+	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
+#else
+	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
+#end
+#end
+#end
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute ${PREFIX}:${attribute}}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute ${PREFIX}:${attribute}}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+##
+#if ($enum)
+
+	/**
+	 * The value set of {@odf.attribute ${PREFIX}:${attribute}}.
+	 */
+	public enum Value {
+#set ($separator="		")
+#foreach($value in $values)
+#if (${value.toString().length()} == 1)
+#set ($constant = $value)
+#else
+#set ($constant = $signaturemodel.constantCase($value))
+#end${separator}${signaturemodel.escapeKeyword($constant)}("${signaturemodel.escapeLiteral($value)}")#set ($separator=", ")
+#end ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+#end
+##
+## Handle Non-String-Attributes
+#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
+#if ($valueobject != "Boolean")
+#foreach ($valuetype in $valuetypes)
+#set ($valueobject = $valuetype)
+#end
+#end
+#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
+#set ($valueobject = "String")
+#end
+#if ($valueobject != "String")
+#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
+##
+
+	/**
+	 * @param value The <code>${simplevalue}</code> value of the attribute.
+	 */
+	public void set${signaturemodel.camelCase($simplevalue)}Value(${simplevalue} value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>${simplevalue}</code> value of the attribute
+	 */
+	public ${simplevalue} ${simplevalue}Value() {
+		String val = super.getValue();
+		try {
+			return ${valueobject}.parse${signaturemodel.camelCase($simplevalue)}(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+#end
+##
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+#else
+## enum and no datatype
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+#end
+#else
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+#end
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+#else
+## enum and no datatype
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of ${PREFIX}:${attribute} is not valid");
+		}
+#end
+#else
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of ${PREFIX}:${attribute} is not valid");
+		}
+#end
+	}
+
+#if ($hasDefaultValue)
+	/**
+	 * Returns the default value of {@odf.attribute ${PREFIX}:${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+#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))}";
+			}
+#end
+#end
+#else
+			defaultValue = "${signaturemodel.escapeLiteral($uniqueDefaultValue)}";
+#end
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${PREFIX}:${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+#else
+	/**
+	 * Returns the default value of {@odf.attribute ${PREFIX}:${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute ${PREFIX}:${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+#end
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+#if ($hasdatatype and $datatypes.size() > 0)
+#set ($datatype="")
+#foreach($value in $datatypes)
+#set ($datatype=$value)
+#end
+#if ($datatype == "ID")
+		return true;
+#else
+		return false;
+#end
+#else
+		return false;
+#end
+	}
+}
diff --git a/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-dsig-element-template.vm b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-dsig-element-template.vm
new file mode 100644
index 0000000..a7d2f38
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-dsig-element-template.vm
@@ -0,0 +1,370 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the Java class representing an ODF signature element
+##
+## 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 ($classname = "${model.camelCase($element)}Element")
+##
+## Set child element and child attributes
+#set ($children = ${element.getChildElements().withoutMultiples()})
+#set ($attributes = ${element.getAttributes().withoutMultiples()})
+##
+## Set base class OdfElement
+#set ($baseclassname = "OdfElement")
+#set ($baseHasMandatoryAttr = false)
+##
+## ...or configured base class
+#if (${javamodel.getBaseclassOf($element)})
+#set ($base = ${javamodel.getBaseclassOf($element)})
+#end
+## Configured manually generated base class?
+#if ($base == "container")
+#set ($_specialbase = true)
+#set ($baseclassname = "OdfContainerElementBase")
+#set ($baseimport = "org.odftoolkit.odfdom.pkg.$baseclassname")
+#set ($baseHasMandatoryAttr = false)
+#end
+##
+## Test if this element has mandatory (non optional) attributes
+#set ($hasMandatoryAttr = false)
+#foreach ($attribute in $attributes)
+#if (${element.isMandatory($attribute)})
+#set ($hasMandatoryAttr = true)
+#set ($mandatoryAttr = $attribute)
+#end
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+##
+## If there is a base class which is not in the current package
+#if ($baseimport)
+import ${baseimport};
+#end
+
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * DOM implementation of OpenDocument element  {@odf.element ${PREFIX}:${context}}.
+ *
+#if ($anychild)
+ * This class can have any org.w3c.dom.Element child element.
+#end
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public class $classname extends $baseclassname {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName("${NS}", "${PREFIX}:${element}");
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return <code>OdfName</code> the name of element {@odf.element ${PREFIX}:${context}}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+##
+## ---------------------------------------------------
+##  Add init method if this element or the base
+##  element has mandatory attributes
+##  TODO: NO caller use this method.
+## ---------------------------------------------------
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in $attributes)
+#set($attri = ${signaturemodel.getAttribute($attr.getQName())})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+## use attri get all of the values.
+#set($values = ${attri.getValues().withoutMultiples()})
+#if ($values.size() ==2 && $dataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${signaturemodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${signaturemodel.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${PREFIX}:${attribute.getQName()}}
+	 *
+#if (${element.isMandatory($attribute)})
+	 * Attribute is mandatory.
+	 *
+#end
+	 * @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);
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
+#set ($defaultValue = ${signaturemodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $signaturemodel.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${PREFIX}:${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${signaturemodel.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Methods for child element creation
+## ---------------------------------------------------
+##
+#foreach($ch in $children)
+#if ($ch != "*")
+#set ($child = ${ch.withMultiples()})
+#set ($cClassname = "${signaturemodel.camelCase($child)}Element")
+#set ($cVar = ${signaturemodel.javaCase($child)})
+#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
+##set has parameter flag
+#set ($hasParams = false)
+#foreach ($ch_attribute in $ch_attributes)
+#if (${child.isMandatory($ch_attribute)})
+#set ($hasParams = true)
+#end
+#end
+#if ($hasParams)
+	/**
+	 * Create child element {@odf.element ds:${child}}.
+	 *
+#set ($seperateFlag="")
+#set ($params="")
+#foreach ($ch_attr in $ch_attributes)
+#if (${child.isMandatory($ch_attr)})
+#set($ch_attri = ${signaturemodel.getAttribute($ch_attr.getQName())})
+#set ($ch_ValueObject = "String")
+#set ($ch_SimpleValue = "")
+#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
+#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
+#foreach ($ch_ValueType in $ch_ValueTypes)
+#set ($ch_ValueObject = $ch_ValueType)
+#end
+## use ch_attri get all of the values.
+#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
+#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($ch_Value in $ch_Values)
+#if ($ch_Value==true)
+#set ($trueFlag = true)
+#end
+#if ($ch_Value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($ch_Hasdatatype = true)
+#set ($ch_ValueObject = "Boolean")
+#end
+#end
+#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
+#set ($ch_ValueObject = "String")
+#end
+#if ($ch_ValueObject != "String")
+#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
+#end
+#if ($ch_attr != "*")
+#set ($attribute = ${ch_attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${signaturemodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${signaturemodel.javaCase($attribute)}Value")
+	 * @param $aParam  the <code>$ch_ValueObject</code> value of <code>$aClassname</code>, see {@odf.attribute ${PREFIX}:${attribute.getQName()}} at specification
+#if ($ch_SimpleValue!="")
+#set ($params="${params}${seperateFlag}${ch_SimpleValue} ${aParam}")
+#else
+#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
+#end
+#set ($seperateFlag=", ")
+#end
+#end
+#end
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ds:${child}}
+	 */
+	 public $cClassname new${cClassname}($params) {
+		$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")
+		${cVar}.set$aClassname($aParam);
+#end
+#end
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#else
+	/**
+	 * Create child element {@odf.element ds:${child}}.
+	 *
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element ds:${child}}
+	 */
+	public $cClassname new${cClassname}() {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#end
+#end
+#end
+##
+## -----------------------------------------------------
+##  New: newTextNode
+## -----------------------------------------------------
+##
+#if ($element.canHaveText())
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	 }
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-manifest-attribute-template.vm b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-manifest-attribute-template.vm
new file mode 100644
index 0000000..60189d9
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-manifest-attribute-template.vm
@@ -0,0 +1,385 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the list of manifest 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 ($valueobject = "String")
+##
+#set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
+#if ($datatypes.size() > 0)
+#set ($hasdatatype = true)
+#else
+#set ($hasdatatype = false)
+#end
+##
+##2DO: Svante - getValues() vs. getValueLiterals() - only literals / constants for attribute values are taken
+#set($values = ${attribute.getValues().withoutMultiples()})
+#if ($values.size() > 0)
+#if ($values.size() ==2 && $hasdatatype == false)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueobject = "Boolean")
+#end
+#end
+#set ($enum = true)
+#if ($valueobject == "Boolean")
+#set ($enum = false)
+#end
+#else
+#set ($enum = false)
+#end
+##
+## Check whether the attribute has default value.
+##
+#set ($hasDefaultValue = false)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if (${odfmodel.getDefaultAttributeValue($attribute, $parent)})
+#set ($hasDefaultValue = true)
+#end
+#end
+##
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($hasDefaultValue and $defaultValueSet.size() == 1)
+#foreach ($value in $defaultValueSet)
+#set ($uniqueDefaultValue = $value)
+#end
+#end
+##
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+#if ($hasDefaultValue)
+import org.odftoolkit.odfdom.pkg.OdfElement;
+#end
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+#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;
+#end
+#end
+#end
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:${attribute.getQName()}}.
+ *
+ */
+public class $classname extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("${NS}", "manifest:${attribute}");
+#if ($hasDefaultValue)
+#if ($defaultValueSet.size()>1)
+#foreach ($defaultValue in $defaultValueSet)
+#set ($constant = $manifestmodel.constantCase($defaultValue))
+#if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
+	public static final String DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)}= "$defaultValue";
+#else
+	public static final String DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)}=	Value.${manifestmodel.escapeKeyword($constant)}.toString();
+#end
+#end
+#else
+#if ($uniqueDefaultValue=="&#34;")
+	public static final String DEFAULT_VALUE = "\${uniqueDefaultValue}";
+#else
+	public static final String DEFAULT_VALUE = "$uniqueDefaultValue";
+#end
+#end
+#end
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:${attribute}}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:${attribute}}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+##
+#if ($enum)
+
+	/**
+	 * The value set of {@odf.attribute manifest:${attribute}}.
+	 */
+	public enum Value {
+#set ($separator="		")
+#foreach($value in $values)
+#if (${value.toString().length()} == 1)
+#set ($constant = $value)
+#else
+#set ($constant = $manifestmodel.constantCase($value))
+#end${separator}${manifestmodel.escapeKeyword($constant)}("${manifestmodel.escapeLiteral($value)}")#set ($separator=", ")
+#end ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+#end
+##
+## Handle Non-String-Attributes
+#set ($valuetypes = ${javamodel.getValuetypes($datatypes)})
+#if ($valueobject != "Boolean")
+#foreach ($valuetype in $valuetypes)
+#set ($valueobject = $valuetype)
+#end
+#end
+#if ($valueobject != "String" && $valueobject != "Double" && $valueobject != "Integer" && $valueobject != "Boolean")
+#set ($valueobject = "String")
+#end
+#if ($valueobject != "String")
+#set ($simplevalue = ${javamodel.getPrimitiveType($valueobject)})
+##
+
+	/**
+	 * @param value The <code>${simplevalue}</code> value of the attribute.
+	 */
+	public void set${manifestmodel.camelCase($simplevalue)}Value(${simplevalue} value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>${simplevalue}</code> value of the attribute
+	 */
+	public ${simplevalue} ${simplevalue}Value() {
+		String val = super.getValue();
+		try {
+			return ${valueobject}.parse${manifestmodel.camelCase($simplevalue)}(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+#end
+##
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+#else
+## enum and no datatype
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+#end
+#else
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+#end
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+#if ($enum)
+#if ($hasdatatype)
+## enum and datatype
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+#else
+## enum and no datatype
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of ${attribute} is not valid");
+		}
+#end
+#else
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of ${attribute} is not valid");
+		}
+#end
+	}
+
+#if ($hasDefaultValue)
+	/**
+	 * Returns the default value of {@odf.attribute manifest:${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+#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))}";
+			}
+#end
+#end
+#else
+			defaultValue = "${manifestmodel.escapeLiteral($uniqueDefaultValue)}";
+#end
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+#else
+	/**
+	 * Returns the default value of {@odf.attribute manifest:${attribute}}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:${attribute}} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+#end
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+#if ($hasdatatype and $datatypes.size() > 0)
+#set ($datatype="")
+#foreach($value in $datatypes)
+#set ($datatype=$value)
+#end
+#if ($datatype == "ID")
+		return true;
+#else
+		return false;
+#end
+#else
+		return false;
+#end
+	}
+}
diff --git a/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-manifest-element-template.vm b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-manifest-element-template.vm
new file mode 100644
index 0000000..668194c
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/template/odfdom-manifest-element-template.vm
@@ -0,0 +1,344 @@
+##################################################################
+## 
+## Licensed to the Apache 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.
+##
+##################################################################
+## Template to create the Java class representing an ODF manifest element
+##
+## Documentation of template development can be found in local file
+## TemplateHelp.html.
+##
+#set ($element = ${manifestmodel.getElement($context)})
+#set ($oldelement = ${oldmodel.getElement($context)})
+###set ($NS = ${element.getNamespace()})
+#set ($classname = "${manifestmodel.camelCase($element)}Element")
+##
+## Set child element and child attributes
+#set ($children = ${element.getChildElements().withoutMultiples()})
+#set ($attributes = ${element.getAttributes().withoutMultiples()})
+##
+#set ($baseclassname = "OdfElement")
+#set ($baseHasMandatoryAttr = false)
+##
+## Test if this element has mandatory (non optional) attributes
+#set ($hasMandatoryAttr = false)
+#foreach ($attribute in $attributes)
+#if (${element.isMandatory($attribute)})
+#set ($hasMandatoryAttr = true)
+#set ($mandatoryAttr = $attribute)
+#end
+#end
+##
+## Begin Code
+#include('copyright.txt')
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+##
+## ---------------------------------------------------
+##  Imports
+## ---------------------------------------------------
+##
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+##
+## ---------------------------------------------------
+##  Class
+## ---------------------------------------------------
+##
+/**
+ * Manifest implementation of OpenDocument element  {@odf.element manifest:${context}}.
+ *
+#if ($anychild)
+ * This class can have any org.w3c.dom.Element child element.
+#end
+#if ($anyattribute)
+ * This class can have any org.w3c.dom.Attribute attribute.
+#end
+ */
+public class $classname extends $baseclassname {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:${element}");
+
+	/**
+	 * Create the instance of <code>$classname</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public $classname(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:${context}}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+##
+## ---------------------------------------------------
+##  Add init method if this element or the base
+##  element has mandatory attributes
+##  TODO: NO caller use this method.
+## ---------------------------------------------------
+##
+## ---------------------------------------------------
+##  Attribute getters and setters
+## ---------------------------------------------------
+##
+#foreach ($attr in $attributes)
+#set($attri = ${manifestmodel.getAttribute($attr.getQName())})
+#set ($valueObject = "String")
+#set ($simpleValue = "")
+#set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
+#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
+#foreach ($valueType in $valueTypes)
+#set ($valueObject = $valueType)
+#end
+## use attri get all of the values.
+#set($values = ${attri.getValues().withoutMultiples()})
+#if ($values.size() ==2 && $dataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($value in $values)
+#if ($value==true)
+#set ($trueFlag = true)
+#end
+#if ($value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($hasdatatype = true)
+#set ($valueObject = "Boolean")
+#end
+#end
+#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
+#set ($valueObject = "String")
+#end
+#if ($valueObject != "String")
+#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
+#end
+#if ($attr != "*")
+#set ($attribute = ${attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${manifestmodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute manifest:${attribute.getQName()}}
+	 *
+#if (${element.isMandatory($attribute)})
+	 * Attribute is mandatory.
+	 *
+#end
+	 * @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);
+		if (attr != null) {
+#if ($simpleValue!="")
+			return ${valueObject}.valueOf(attr.${simpleValue}Value());
+#else
+			return ${valueObject}.valueOf(attr.getValue());
+#end
+		}
+#if ($odfmodel.getDefaultAttributeValue($attribute, $element))
+#set ($defaultValue = ${manifestmodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
+#if ($defaultValueSet.size()>1)
+#set ($constant = $manifestmodel.constantCase($defaultValue))
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)};
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)});
+#end
+#else
+#if ($valueObject == "String")
+		return ${aClassname}.DEFAULT_VALUE;
+#else
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
+#end
+#end
+#else
+		return null;
+#end
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute manifest:${attribute.getQName()}}
+	 *
+	 * @param $aParam   The type is <code>$valueObject</code>
+	 */
+	public void set${aClassname}($valueObject $aParam) {
+		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+#if ($valueObject == "String")
+		attr.setValue($aParam);
+#else
+		attr.set${manifestmodel.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+#end
+	}
+#end
+#end
+
+##
+## ---------------------------------------------------
+##  Methods for child element creation
+## ---------------------------------------------------
+##
+#foreach($ch in $children)
+#if ($ch != "*")
+#set ($child = ${ch.withMultiples()})
+#set ($cClassname = "${manifestmodel.camelCase($child)}Element")
+#set ($cVar = ${manifestmodel.javaCase($child)})
+#set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
+##set has parameter flag
+#set ($hasParams = false)
+#foreach ($ch_attribute in $ch_attributes)
+#if (${child.isMandatory($ch_attribute)})
+#set ($hasParams = true)
+#end
+#end
+#if ($hasParams)
+	/**
+	 * Create child element {@odf.element manifest:${child}}.
+	 *
+#set ($seperateFlag="")
+#set ($params="")
+#foreach ($ch_attr in $ch_attributes)
+#if (${child.isMandatory($ch_attr)})
+#set($ch_attri = ${manifestmodel.getAttribute($ch_attr.getQName())})
+#set ($ch_ValueObject = "String")
+#set ($ch_SimpleValue = "")
+#set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
+#set ($ch_ValueTypes = ${javamodel.getValuetypes($ch_DataTypes)})
+#foreach ($ch_ValueType in $ch_ValueTypes)
+#set ($ch_ValueObject = $ch_ValueType)
+#end
+## use ch_attri get all of the values.
+#set($ch_Values = ${ch_attri.getValues().withoutMultiples()})
+#if ($ch_Values.size() ==2 && $ch_DataTypes.size()==0)
+#set ($trueFlag = false)
+#set ($falseFlag = false)
+#foreach ($ch_Value in $ch_Values)
+#if ($ch_Value==true)
+#set ($trueFlag = true)
+#end
+#if ($ch_Value==false)
+#set ($falseFlag = true)
+#end
+#end
+#if ($trueFlag and $falseFlag)
+#set ($ch_Hasdatatype = true)
+#set ($ch_ValueObject = "Boolean")
+#end
+#end
+#if ($ch_ValueObject != "String" && $ch_ValueObject != "Double" && $ch_ValueObject != "Integer" && $ch_ValueObject != "Boolean")
+#set ($ch_ValueObject = "String")
+#end
+#if ($ch_ValueObject != "String")
+#set ($ch_SimpleValue = ${javamodel.getPrimitiveType($ch_ValueObject)})
+#end
+#if ($ch_attr != "*")
+#set ($attribute = ${ch_attr.withMultiples()})
+#set ($aNS = ${attribute.getNamespace()})
+#set ($aClassname = "${manifestmodel.camelCase($attribute)}Attribute")
+#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")
+	 * @param $aParam  the <code>$ch_ValueObject</code> value of <code>$aClassname</code>, see {@odf.attribute  manifest:${attribute.getQName()}} at specification
+#if ($ch_SimpleValue!="")
+#set ($params="${params}${seperateFlag}${ch_SimpleValue} ${aParam}")
+#else
+#set ($params="${params}${seperateFlag}${ch_ValueObject} ${aParam}")
+#end
+#set ($seperateFlag=", ")
+#end
+#end
+#end
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element manifest:${child}}
+	 */
+	 public $cClassname new${cClassname}($params) {
+		$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")
+		${cVar}.set$aClassname($aParam);
+#end
+#end
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#else
+	/**
+	 * Create child element {@odf.element manifest:${child}}.
+	 *
+## Compare element from old and new Spec. A direct comparison is not possible (both encapsulate different RelaxNG Expressions)
+## but we can compare by name
+#if (!$oldelement || !${oldelement.getChildElements().containsName($child)})
+	 * Child element is new in Odf 1.2
+	 *
+#end
+#if (${element.isMandatory($child)})
+	 * Child element is mandatory.
+	 *
+#end
+	 * @return the element {@odf.element manifest:${child}}
+	 */
+	public $cClassname new${cClassname}() {
+		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
+		this.appendChild($cVar);
+		return $cVar;
+	}
+
+#end
+#end
+#end
+##
+## -----------------------------------------------------
+##  New: newTextNode
+## -----------------------------------------------------
+##
+#if ($element.canHaveText())
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	 }
+#end
+}
diff --git a/trunk/odfdom/src/codegen/resources/pkg/template/pkg-output-files.vm b/trunk/odfdom/src/codegen/resources/pkg/template/pkg-output-files.vm
new file mode 100644
index 0000000..f5e3f81
--- /dev/null
+++ b/trunk/odfdom/src/codegen/resources/pkg/template/pkg-output-files.vm
@@ -0,0 +1,62 @@
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?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>
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/JarManifest.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/JarManifest.java
new file mode 100644
index 0000000..d2741cf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/JarManifest.java
@@ -0,0 +1,145 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Provides metadata about the ODFDOM library as build date, version number. Its
+ * main() method is the start method of the library, enabling the access of
+ * versioning methods from command line: "java -jar odfdom.jar".
+ */
+public class JarManifest {
+
+    private static final String CURRENT_CLASS_RESOURCE_PATH = "org/odftoolkit/odfdom/JarManifest.class";
+    private static final String MANIFEST_JAR_PATH = "META-INF/MANIFEST.MF";
+    private static String ODFDOM_NAME;
+    private static String ODFDOM_VERSION;
+    private static String ODFDOM_WEBSITE;
+    private static String ODFDOM_BUILD_DATE;
+    private static String ODFDOM_SUPPORTED_ODF_VERSION;
+   
+    static {
+        try {
+            Manifest manifest = new Manifest(getManifestAsStream());
+            Attributes attr = manifest.getEntries().get("ODFDOM");
+            ODFDOM_NAME = attr.getValue("ODFDOM-Name");
+            ODFDOM_VERSION = attr.getValue("ODFDOM-Version");
+            ODFDOM_WEBSITE = attr.getValue("ODFDOM-Website");
+            ODFDOM_BUILD_DATE = attr.getValue("ODFDOM-Built-Date");
+            ODFDOM_SUPPORTED_ODF_VERSION = attr.getValue("ODFDOM-Supported-Odf-Version");
+        } catch (Exception e) {
+            Logger.getLogger(JarManifest.class.getName()).log(Level.SEVERE, null, e);
+        }
+    }
+
+    private static InputStream getManifestAsStream() {
+        String versionRef = JarManifest.class.getClassLoader().getResource(CURRENT_CLASS_RESOURCE_PATH).toString();
+        String manifestRef = versionRef.substring(0, versionRef.lastIndexOf(CURRENT_CLASS_RESOURCE_PATH)) + MANIFEST_JAR_PATH;
+        URL manifestURL = null;
+        InputStream in = null;
+        try {
+            manifestURL = new URL(manifestRef);
+        } catch (MalformedURLException ex) {
+            Logger.getLogger(JarManifest.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        try {
+            in = manifestURL.openStream();
+        } catch (IOException ex) {
+            Logger.getLogger(JarManifest.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return in;
+    }
+
+    private JarManifest() {
+    }
+
+	/**
+	 * The main method is meant to be called when the JAR is being executed,
+	 * e.g. "java -jar odfdom.jar" and provides versioning information:
+	 *
+	 *	odfdom 0.9-SNAPSHOT (build 20100701-1729)
+	 *	from http://odftoolkit.org supporting ODF 1.2
+	 *
+	 * Allowing version access from the JAR without the need to unzip the JAR nor naming the JAR
+	 * (requiring the change of classpath for every version due to JAR naming change).
+	 */
+    public static void main(String[] args) throws IOException {
+        System.out.println(getOdfdomTitle() + " (build " + getOdfdomBuildDate() + ')' + "\nfrom " + getOdfdomWebsite() + " supporting ODF " + getOdfdomSupportedOdfVersion());
+    }
+
+    /**
+     * Return the name of ODFDOM;
+     * @return the ODFDOM library name
+     */
+    public static String getOdfdomName() {
+        return ODFDOM_NAME;
+    }
+
+    /**
+     * Returns the ODFDOM library title
+     * 
+     * @return A string containing both the name and the version of the ODFDOM library.
+     */
+    public static String getOdfdomTitle() {
+        return getOdfdomName() + ' ' + getOdfdomVersion();
+    }    
+
+    /**
+     * Return the version of the ODFDOM library (ie. odfdom.jar)
+     * @return the ODFDOM library version
+     */
+    public static String getOdfdomVersion() {
+        return ODFDOM_VERSION;
+    }
+
+    /**
+     * Return the website of the ODFDOM library (ie. odfdom.jar)
+     * @return the ODFDOM library website
+     */
+    public static String getOdfdomWebsite() {
+        return ODFDOM_WEBSITE;
+    }
+
+    /**
+     * Return the date when ODFDOM had been build
+     * @return the date of the build formated as "yyyy-MM-dd'T'HH:mm:ss".
+     */
+    public static String getOdfdomBuildDate() {
+        return ODFDOM_BUILD_DATE;
+    }
+
+    /**
+     * Returns the version of the OpenDocument specification covered by the ODFDOM library (ie. odfdom.jar)
+     * @return the supported ODF version number
+     */
+    public static String getOdfdomSupportedOdfVersion() {
+        return ODFDOM_SUPPORTED_ODF_VERSION;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfChartDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfChartDocument.java
new file mode 100644
index 0000000..48b395a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfChartDocument.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeChartElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.SAXException;
+
+/**
+ * This class represents an empty ODF document , which will be in general embedded
+ * in an existing ODF (Spreadsheet) document.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.ChartDocument} in Simple API.
+ */
+public class OdfChartDocument extends OdfDocument {
+
+	private static final String EMPTY_CHART_DOCUMENT_PATH = "/OdfChartDocument.odc";
+	static final Resource EMPTY_CHART_DOCUMENT_RESOURCE = new Resource(EMPTY_CHART_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of OdfChartDocument documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		CHART(OdfDocument.OdfMediaType.CHART),
+		CHART_TEMPLATE(OdfDocument.OdfMediaType.CHART_TEMPLATE);
+		private final OdfDocument.OdfMediaType mMediaType;
+
+		OdfMediaType(OdfDocument.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfDocument.OdfMediaType getOdfMediaType(String mediaType) {
+			return OdfDocument.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty charts document.
+	 * *  <br/><em>Note: ODF Chart documents are (with OOo 3.0) only used as embedded document and not used stand-alone.</em>
+	 * @return ODF charts document based on a default template
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfChartDocument newChartDocument() throws Exception {
+		return (OdfChartDocument) OdfDocument.loadTemplate(EMPTY_CHART_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.CHART);
+	}
+
+	/**
+	 * Creates an empty charts template.
+	 * *  <br/><em>Note: ODF Chart documents are (with OOo 3.0) only used as embedded document and not used stand-alone.</em>
+	 * @return ODF charts template based on a default template
+	 * @throws java.lang.Exception - if the template could not be created
+	 */
+	public static OdfChartDocument newChartTemplateDocument() throws Exception {
+		OdfChartDocument doc = (OdfChartDocument) OdfDocument.loadTemplate(EMPTY_CHART_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.CHART_TEMPLATE);
+		doc.changeMode(OdfMediaType.CHART_TEMPLATE);
+		return doc;
+	}
+
+	/**
+	 * Creates an OdfChartDocument from the OpenDocument provided by a resource Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfChartDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 * 
+	 * <p>If the resource stream is not a ODF chart document, ClassCastException might be thrown.</p>
+	 *
+	 * @param inputStream - the InputStream of the ODF chart document.
+	 * @return the chart document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfChartDocument loadDocument(InputStream inputStream) throws Exception {
+        return (OdfChartDocument) OdfDocument.loadDocument(inputStream);
+    }
+	
+	/**
+	 * Loads an OdfChartDocument from the provided path.
+	 *
+	 * <p>OdfChartDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfChartDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF chart document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the chart document from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfChartDocument loadDocument(String documentPath) throws Exception {
+		return (OdfChartDocument)OdfDocument.loadDocument(documentPath);
+	}
+	
+	/**
+	 * Creates an OdfChartDocument from the OpenDocument provided by a File.
+	 *
+	 * <p>OdfChartDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfChartDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF chart document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param file - a file representing the ODF chart document.
+	 * @return the chart document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfChartDocument loadDocument(File file) throws Exception {
+		return (OdfChartDocument)OdfDocument.loadDocument(file);
+	}
+	
+	/** To avoid data duplication a new document is only created, if not already opened.
+	 * A document is cached by this constructor using the internalpath as key. */
+	protected OdfChartDocument(OdfPackage pkg, String internalPath, OdfChartDocument.OdfMediaType odfMediaType) throws SAXException {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Get the content root of a chart document.
+	 *
+	 * @return content root, representing the office:chart tag
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeChartElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeChartElement.class);
+	}
+	/**
+	 * Changes the document to the given mediatype.
+	 * This method can only be used to convert a document to a related mediatype, e.g. template.
+	 * 
+	 * @param mediaType the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfDocument.java
new file mode 100644
index 0000000..b8425bf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfDocument.java
@@ -0,0 +1,1046 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.odftoolkit.odfdom.doc.table.OdfTable;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfMetaDom;
+import org.odftoolkit.odfdom.dom.OdfSchemaConstraint;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfTextProperties;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.meta.OdfOfficeMeta;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.odfdom.type.Duration;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+
+/** 
+ * This abstract class is representing one of the possible ODF documents.
+ * 
+ */
+public abstract class OdfDocument extends OdfSchemaDocument {
+	// Static parts of file references
+
+	private static final String SLASH = "/";
+	private OdfMediaType mMediaType;
+	private OdfOfficeMeta mOfficeMeta;
+	private long documentOpeningTime;
+	private static final Pattern CONTROL_CHAR_PATTERN = Pattern.compile("\\p{Cntrl}");
+	private static final String EMPTY_STRING = "";
+	private Calendar mCreationDate;
+
+	// Using static factory instead of constructor
+	protected OdfDocument(OdfPackage pkg, String internalPath, OdfMediaType mediaType) throws SAXException {
+		super(pkg, internalPath, mediaType.getMediaTypeString());
+		mMediaType = mediaType;
+		//set document opening time.
+		documentOpeningTime = System.currentTimeMillis();
+	}
+
+	/**
+	 * This enum contains all possible media types of OpenDocument documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		CHART("application/vnd.oasis.opendocument.chart", "odc"),
+		CHART_TEMPLATE("application/vnd.oasis.opendocument.chart-template", "otc"),
+		FORMULA("application/vnd.oasis.opendocument.formula", "odf"),
+		FORMULA_TEMPLATE("application/vnd.oasis.opendocument.formula-template", "otf"),
+		DATABASE_FRONT_END("application/vnd.oasis.opendocument.base", "odb"),
+		GRAPHICS("application/vnd.oasis.opendocument.graphics", "odg"),
+		GRAPHICS_TEMPLATE("application/vnd.oasis.opendocument.graphics-template", "otg"),
+		IMAGE("application/vnd.oasis.opendocument.image", "odi"),
+		IMAGE_TEMPLATE("application/vnd.oasis.opendocument.image-template", "oti"),
+		PRESENTATION("application/vnd.oasis.opendocument.presentation", "odp"),
+		PRESENTATION_TEMPLATE("application/vnd.oasis.opendocument.presentation-template", "otp"),
+		SPREADSHEET("application/vnd.oasis.opendocument.spreadsheet", "ods"),
+		SPREADSHEET_TEMPLATE("application/vnd.oasis.opendocument.spreadsheet-template", "ots"),
+		TEXT("application/vnd.oasis.opendocument.text", "odt"),
+		TEXT_MASTER("application/vnd.oasis.opendocument.text-master", "odm"),
+		TEXT_TEMPLATE("application/vnd.oasis.opendocument.text-template", "ott"),
+		TEXT_WEB("application/vnd.oasis.opendocument.text-web", "oth");
+		private final String mMediaType;
+		private final String mSuffix;
+
+		OdfMediaType(String mediaType, String suffix) {
+			this.mMediaType = mediaType;
+			this.mSuffix = suffix;
+		}
+
+		/**
+		 * @return the mediatype String of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType;
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mSuffix;
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfMediaType getOdfMediaType(String mediaType) {
+			OdfMediaType odfMediaType = null;
+			if (mediaType != null) {
+
+				String mediaTypeShort = mediaType.substring(mediaType.lastIndexOf(".") + 1, mediaType.length());
+				mediaTypeShort = mediaTypeShort.replace('-', '_').toUpperCase();
+				try {
+					odfMediaType = OdfMediaType.valueOf(mediaTypeShort);
+
+				} catch (IllegalArgumentException e) {
+					throw new IllegalArgumentException("Given mediaType '" + mediaType + "' is not an ODF mediatype!");
+				}
+			}
+			return odfMediaType;
+		}
+	}
+
+	/**
+	 * Loads the ODF root document from the given Resource.
+	 * 
+	 * NOTE: Initial meta data (like the document creation time) will be added in this method.
+	 * 
+	 * @param res a resource containing a package with a root document
+	 * @param odfMediaType the media type of the root document
+	 * @return the OpenDocument document
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	protected static OdfDocument loadTemplate(Resource res, OdfMediaType odfMediaType) throws Exception {
+		InputStream in = res.createInputStream();
+		OdfPackage pkg = null;
+		try {
+			pkg = OdfPackage.loadPackage(in);
+		} finally {
+			in.close();
+		}
+		OdfDocument newDocument = newDocument(pkg, ROOT_DOCUMENT_PATH, odfMediaType);
+		//add creation time, the metadata have to be explicitly set
+		newDocument.mCreationDate = Calendar.getInstance();
+		return newDocument;
+	}
+
+	/**
+	 * Loads the ODF root document from the ODF package provided by its path.
+	 *
+	 * <p>OdfDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfDocument.</p>
+	 *
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the OpenDocument from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfDocument loadDocument(String documentPath) throws Exception {
+		return loadDocument(OdfPackage.loadPackage(documentPath));
+	}
+
+	/**
+	 * Loads the ODF root document from the ODF package provided by a Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 *
+	 * @param inStream - the InputStream of the ODF document.
+	 * @return the document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfDocument loadDocument(InputStream inStream) throws Exception {
+		return loadDocument(OdfPackage.loadPackage(inStream));
+	}
+
+	/**
+	 * Loads the ODF root document from the ODF package provided as a File.
+	 *
+	 * @param file - a file representing the ODF document.
+	 * @return the document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfDocument loadDocument(File file) throws Exception {
+		return loadDocument(OdfPackage.loadPackage(file));
+	}
+
+	/**
+	 * Loads the ODF root document from the ODF package.
+	 *
+	 * @param odfPackage - the ODF package containing the ODF document.
+	 * @return the root document of the given OdfPackage
+	 * @throws java.lang.Exception - if the ODF document could not be created.
+	 */
+	public static OdfDocument loadDocument(OdfPackage odfPackage) throws Exception {
+		return loadDocument(odfPackage, ROOT_DOCUMENT_PATH);
+	}
+
+	/**
+	 * Creates an OdfDocument from the OpenDocument provided by an ODF package.
+	 * @param odfPackage - the ODF package containing the ODF document.
+	 * @param internalPath - the path to the ODF document relative to the package root, or an empty String for the root document.
+	 * @return the root document of the given OdfPackage
+	 * @throws java.lang.Exception - if the ODF document could not be created.
+	 */
+	public static OdfDocument loadDocument(OdfPackage odfPackage, String internalPath) throws Exception {
+		String documentMediaType = odfPackage.getMediaTypeString(internalPath);
+		OdfMediaType odfMediaType = null;
+		try {
+			odfMediaType = OdfMediaType.getOdfMediaType(documentMediaType);
+		} catch (IllegalArgumentException e) {
+			// the returned NULL will be taking care of afterwards
+		}
+		if (odfMediaType == null) {
+			ErrorHandler errorHandler = odfPackage.getErrorHandler();
+			Matcher matcherCTRL = CONTROL_CHAR_PATTERN.matcher(documentMediaType);
+			if (matcherCTRL.find()) {
+				documentMediaType = matcherCTRL.replaceAll(EMPTY_STRING);
+			}
+			OdfValidationException ve = new OdfValidationException(OdfSchemaConstraint.DOCUMENT_WITHOUT_ODF_MIMETYPE, internalPath, documentMediaType);
+			if (errorHandler != null) {
+				errorHandler.fatalError(ve);
+			}
+			throw ve;
+		}
+		return newDocument(odfPackage, internalPath, odfMediaType);
+	}
+
+	//return null if the media type can not be recognized.
+	private static OdfDocument loadDocumentFromTemplate(OdfMediaType odfMediaType) throws Exception {
+
+		final Resource documentTemplate;
+		switch (odfMediaType) {
+			case TEXT:
+			case TEXT_TEMPLATE:
+			case TEXT_MASTER:
+			case TEXT_WEB:
+				documentTemplate = OdfTextDocument.EMPTY_TEXT_DOCUMENT_RESOURCE;
+				break;
+
+			case SPREADSHEET:
+			case SPREADSHEET_TEMPLATE:
+				documentTemplate = OdfSpreadsheetDocument.EMPTY_SPREADSHEET_DOCUMENT_RESOURCE;
+				break;
+
+			case PRESENTATION:
+			case PRESENTATION_TEMPLATE:
+				documentTemplate = OdfPresentationDocument.EMPTY_PRESENTATION_DOCUMENT_RESOURCE;
+				break;
+
+			case GRAPHICS:
+			case GRAPHICS_TEMPLATE:
+				documentTemplate = OdfGraphicsDocument.EMPTY_GRAPHICS_DOCUMENT_RESOURCE;
+				break;
+
+			case CHART:
+			case CHART_TEMPLATE:
+				documentTemplate = OdfChartDocument.EMPTY_CHART_DOCUMENT_RESOURCE;
+				break;
+
+			case IMAGE:
+			case IMAGE_TEMPLATE:
+				documentTemplate = OdfImageDocument.EMPTY_IMAGE_DOCUMENT_RESOURCE;
+				break;
+
+			default:
+				documentTemplate = null;
+				throw new IllegalArgumentException("Given mediaType '" + odfMediaType.mMediaType + "' is not yet supported!");
+		}
+		return loadTemplate(documentTemplate, odfMediaType);
+	}
+
+	/**
+	 * Creates one of the ODF documents based a given mediatype.
+	 *
+	 * @param odfMediaType The ODF Mediatype of the ODF document to be created.
+	 * @return The ODF document, which mediatype dependends on the parameter or
+	 *	NULL if media type were not supported.
+	 */
+	private static OdfDocument newDocument(OdfPackage pkg, String internalPath, OdfMediaType odfMediaType) throws SAXException {
+		OdfDocument newDoc = null;
+		switch (odfMediaType) {
+			case TEXT:
+				newDoc = new OdfTextDocument(pkg, internalPath, OdfTextDocument.OdfMediaType.TEXT);
+				break;
+
+			case TEXT_TEMPLATE:
+				newDoc = new OdfTextDocument(pkg, internalPath, OdfTextDocument.OdfMediaType.TEXT_TEMPLATE);
+				break;
+
+			case TEXT_MASTER:
+				newDoc = new OdfTextDocument(pkg, internalPath, OdfTextDocument.OdfMediaType.TEXT_MASTER);
+				break;
+
+			case TEXT_WEB:
+				newDoc = new OdfTextDocument(pkg, internalPath, OdfTextDocument.OdfMediaType.TEXT_WEB);
+				break;
+
+			case SPREADSHEET:
+				newDoc = new OdfSpreadsheetDocument(pkg, internalPath, OdfSpreadsheetDocument.OdfMediaType.SPREADSHEET);
+				break;
+
+			case SPREADSHEET_TEMPLATE:
+				newDoc = new OdfSpreadsheetDocument(pkg, internalPath, OdfSpreadsheetDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+				break;
+
+			case PRESENTATION:
+				newDoc = new OdfPresentationDocument(pkg, internalPath, OdfPresentationDocument.OdfMediaType.PRESENTATION);
+				break;
+
+			case PRESENTATION_TEMPLATE:
+				newDoc = new OdfPresentationDocument(pkg, internalPath, OdfPresentationDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+				break;
+
+			case GRAPHICS:
+				newDoc = new OdfGraphicsDocument(pkg, internalPath, OdfGraphicsDocument.OdfMediaType.GRAPHICS);
+				break;
+
+			case GRAPHICS_TEMPLATE:
+				newDoc = new OdfGraphicsDocument(pkg, internalPath, OdfGraphicsDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+				break;
+
+			case CHART:
+				newDoc = new OdfChartDocument(pkg, internalPath, OdfChartDocument.OdfMediaType.CHART);
+				break;
+
+			case CHART_TEMPLATE:
+				newDoc = new OdfChartDocument(pkg, internalPath, OdfChartDocument.OdfMediaType.CHART_TEMPLATE);
+				break;
+
+			case IMAGE:
+				newDoc = new OdfImageDocument(pkg, internalPath, OdfImageDocument.OdfMediaType.IMAGE);
+				break;
+
+			case IMAGE_TEMPLATE:
+				newDoc = new OdfImageDocument(pkg, internalPath, OdfImageDocument.OdfMediaType.IMAGE_TEMPLATE);
+				break;
+
+			default:
+				newDoc = null;
+				throw new IllegalArgumentException("Given mediaType '" + odfMediaType.mMediaType + "' is not yet supported!");
+		}
+		// returning null if MediaType is not supported
+		return newDoc;
+	}
+
+	/**
+	 * Returns an embedded OdfPackageDocument from the given package path.
+	 *
+	 * @param documentPath to the ODF document within the package. The path is relative the current ODF document path.
+	 * @return an embedded OdfPackageDocument
+	 */
+	@Override
+	public OdfDocument loadSubDocument(String documentPath) {
+		return (OdfDocument) super.loadSubDocument(documentPath);
+	}
+
+	/**
+	 * Method returns all embedded OdfPackageDocuments, which match a valid OdfMediaType,
+	 * of the current OdfPackageDocument. Note: The root document is not part of the returned collection.
+	 * @return a map with all embedded documents and their paths of the current OdfPackageDocument
+	 */
+	public Map<String, OdfDocument> loadSubDocuments() {
+		return loadSubDocuments(null);
+	}
+
+	/**
+	 * Method returns all embedded OdfPackageDocuments of sthe current OdfPackageDocument matching the
+	 * according MediaType. This is done by matching the subfolder entries of the
+	 * manifest file with the given OdfMediaType.
+	 * @param desiredMediaType media type of the documents to be returned (used as a filter).
+	 * @return embedded documents of the current OdfPackageDocument matching the given media type
+	 */
+	public Map<String, OdfDocument> loadSubDocuments(OdfMediaType desiredMediaType) {
+		String wantedMediaString = null;
+		if (desiredMediaType != null) {
+			wantedMediaString = desiredMediaType.getMediaTypeString();
+		}
+		Map<String, OdfDocument> embeddedObjectsMap = new HashMap<String, OdfDocument>();
+		// check manifest for current embedded OdfPackageDocuments
+		Set<String> manifestEntries = mPackage.getFilePaths();
+		for (String path : manifestEntries) {
+			// any directory that is not the root document "/"
+			if (path.length() > 1 && path.endsWith(SLASH)) {
+				String entryMediaType = mPackage.getFileEntry(path).getMediaTypeString();
+				// if the entry is a document (directory has mediaType)
+				if (entryMediaType != null) {
+					// if a specific ODF mediatype was requested
+					if (wantedMediaString != null) {
+						// test if the desired mediatype matches the current
+						if (entryMediaType.equals(wantedMediaString)) {
+							path = normalizeDocumentPath(path);
+							embeddedObjectsMap.put(path, (OdfDocument) mPackage.loadDocument(path));
+						}
+					} else {
+						// test if any ODF mediatype matches the current
+						for (OdfMediaType mediaType : OdfMediaType.values()) {
+							if (entryMediaType.equals(mediaType.getMediaTypeString())) {
+								embeddedObjectsMap.put(path, (OdfDocument) mPackage.loadDocument(path));
+							}
+						}
+					}
+				}
+			}
+		}
+		return embeddedObjectsMap;
+	}
+
+	/**
+	 * Sets the media type of the OdfDocument
+	 * @param odfMediaType media type to be set
+	 */
+	protected void setOdfMediaType(OdfMediaType odfMediaType) {
+		mMediaType = odfMediaType;
+		super.setMediaTypeString(odfMediaType.getMediaTypeString());
+	}
+
+	/**
+	 * Gets the media type of the OdfDocument
+	 */
+	protected OdfMediaType getOdfMediaType() {
+		return mMediaType;
+	}
+
+	/**
+	 * Get the meta data feature instance of the current document
+	 * 
+	 * @return the meta data feature instance which represent 
+	 * <code>office:meta</code> in the meta.xml	 
+	 */
+	public OdfOfficeMeta getOfficeMetadata() {
+		if (mOfficeMeta == null) {
+			try {
+				OdfMetaDom metaDom = getMetaDom();
+				if (metaDom == null) {
+					metaDom = new OdfMetaDom(this, OdfSchemaDocument.OdfXMLFile.META.getFileName());
+				}
+				mOfficeMeta = new OdfOfficeMeta(metaDom);
+			} catch (Exception ex) {
+				Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		return mOfficeMeta;
+	}
+
+	/**
+	 * Save the document to an OutputStream. Delegate to the root document
+	 * and save possible embedded OdfDocuments.
+	 *
+	 * <p>If the input file has been cached (this is the case when loading from an
+	 * InputStream), the input file can be overwritten.</p>
+	 *
+	 * <p>If not, the OutputStream may not point to the input file! Otherwise
+	 * this will result in unwanted behaviour and broken files.</p>
+	 *
+	 * <p>When save the embedded document to a stand alone document,
+	 * all the file entries of the embedded document will be copied to a new document package.
+	 * If the embedded document is outside of the current document directory,
+	 * you have to embed it to the sub directory and refresh the link of the embedded document.
+	 * you should reload it from the stream to get the saved embedded document.
+	 *
+	 * @param out - the OutputStream to write the file to
+	 * @throws java.lang.Exception  if the document could not be saved
+	 */
+	public void save(OutputStream out) throws Exception {
+		updateMetaData();
+		if (!isRootDocument()) {
+			OdfDocument newDoc = loadDocumentFromTemplate(getOdfMediaType());
+			newDoc.insertDocument(this, ROOT_DOCUMENT_PATH);
+			newDoc.updateMetaData();
+			newDoc.mPackage.save(out);
+			// ToDo: (Issue 219 - PackageRefactoring) - Return the document, when not closing!
+			// Should we close the sources now? User will never receive the open package!
+		} else {
+			mPackage.save(out);
+		}
+	}
+
+	/**
+	 * Save the document to a given file.
+	 *
+	 * <p>If the input file has been cached (this is the case when loading from an
+	 * InputStream), the input file can be overwritten.</p>
+	 *
+	 * <p>Otherwise it's allowed to overwrite the input file as long as
+	 * the same path name is used that was used for loading (no symbolic link
+	 * foo2.odt pointing to the loaded file foo1.odt, no network path X:\foo.odt
+	 * pointing to the loaded file D:\foo.odt).</p>
+	 * 
+	 * <p>When saving the embedded document to a stand alone document,
+	 * all files of the embedded document will be copied to a new document package.
+	 * If the embedded document is outside of the current document directory, 
+	 * you have to embed it to the sub directory and refresh the link of the embedded document.
+	 * You should reload it from the given file to get the saved embedded document.
+	 *
+	 * @param file - the file to save the document
+	 * @throws java.lang.Exception  if the document could not be saved
+	 */
+	@Override
+	public void save(File file) throws Exception {
+		updateMetaData();
+		if (!isRootDocument()) {
+			OdfDocument newDoc = loadDocumentFromTemplate(getOdfMediaType());
+			newDoc.insertDocument(this, ROOT_DOCUMENT_PATH);
+			newDoc.updateMetaData();
+			newDoc.mPackage.save(file);
+			// ToDo: (Issue 219 - PackageRefactoring) - Return the document, when not closing!
+			// Should we close the sources now? User will never receive the open package!
+		} else {
+			this.mPackage.save(file);
+		}
+	}
+
+	/**
+	 * Close the OdfPackage and release all temporary created data.
+	 * Acter execution of this method, this class is no longer usable.
+	 * Do this as the last action to free resources.
+	 * Closing an already closed document has no effect.
+	 */
+	@Override
+	public void close() {
+		// set all member variables explicit to null
+		mMediaType = null;
+		mOfficeMeta = null;
+		super.close();
+	}
+
+	/**
+	 * Get the content root of a document.
+	 *
+	 * You may prefer to use the getContentRoot methods of subclasses of
+	 * OdfDocument. Their return parameters are already casted to
+	 * respective subclasses of OdfElement.
+	 *
+	 * @param the type of the content root, depend on the document type
+	 * @return the child element of office:body, e.g. office:text for text docs
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@SuppressWarnings("unchecked")
+	<T extends OdfElement> T getContentRoot(Class<T> clazz) throws Exception {
+		OdfElement contentRoot = getContentDom().getRootElement();
+		OfficeBodyElement contentBody = OdfElement.findFirstChildNode(
+				OfficeBodyElement.class, contentRoot);
+		NodeList childs = contentBody.getChildNodes();
+		for (int i = 0;
+				i < childs.getLength();
+				i++) {
+			Node cur = childs.item(i);
+			if ((cur != null) && clazz.isInstance(cur)) {
+				return (T) cur;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Get the content root of a document.
+	 *
+	 * You may prefer to use the getContentRoot methods of subclasses of
+	 * OdfDocument.
+	 * 
+	 * @return the child element of office:body, e.g. office:text for text docs
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	public OdfElement getContentRoot() throws Exception {
+		return getContentRoot(OdfElement.class);
+	}
+
+	@Override
+	public String toString() {
+		return "\n" + getMediaTypeString() + " - ID: " + this.hashCode() + " " + getPackage().getBaseURI();
+	}
+
+	/**
+	 * Insert an Image from the specified uri to the end of the OdfDocument.
+	 * @param imageUri The URI of the image that will be added to the document,
+	 * 				   add image stream to the package,
+	 *                 in the 'Pictures/' graphic directory with the same image file name as in the URI.
+	 *                 If the imageURI is relative first the user.dir is taken to make it absolute.
+	 * @return         Returns the internal package path of the image, which was created based on the given URI.
+	 * */
+	public String newImage(URI imageUri) {
+		try {
+			OdfContentDom contentDom = this.getContentDom();
+			OdfDrawFrame drawFrame = contentDom.newOdfElement(OdfDrawFrame.class);
+			XPath xpath = contentDom.getXPath();
+			if (this instanceof OdfSpreadsheetDocument) {
+				TableTableCellElement lastCell = (TableTableCellElement) xpath.evaluate("//table:table-cell[last()]", contentDom, XPathConstants.NODE);
+				lastCell.appendChild(drawFrame);
+				drawFrame.removeAttribute("text:anchor-type");
+
+			} else if (this instanceof OdfTextDocument) {
+				TextPElement lastPara = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom, XPathConstants.NODE);
+				if (lastPara == null) {
+					lastPara = ((OdfTextDocument) this).newParagraph();
+				}
+				lastPara.appendChild(drawFrame);
+				drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+			} else if (this instanceof OdfPresentationDocument) {
+				DrawPageElement lastPage = (DrawPageElement) xpath.evaluate("//draw:page[last()]", contentDom, XPathConstants.NODE);
+				lastPage.appendChild(drawFrame);
+			}
+			OdfDrawImage image = (OdfDrawImage) drawFrame.newDrawImageElement();
+			String imagePath = image.newImage(imageUri);
+			return imagePath;
+		} catch (Exception ex) {
+			Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+
+	/**
+	 * Return an instance of table feature with the specific table name.
+	 * @param name of the table beeing searched for.
+	 * @return an instance of table feature with the specific table name.
+	 */
+	public OdfTable getTableByName(String name) {
+		try {
+			OdfElement root = getContentDom().getRootElement();
+			OfficeBodyElement officeBody = OdfElement.findFirstChildNode(OfficeBodyElement.class, root);
+			OdfElement typedContent = OdfElement.findFirstChildNode(OdfElement.class, officeBody);
+
+			NodeList childList = typedContent.getChildNodes();
+			for (int i = 0; i < childList.getLength(); i++) {
+				if (childList.item(i) instanceof TableTableElement) {
+					TableTableElement table = (TableTableElement) childList.item(i);
+					if (table.getOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.TABLE, "name")).equals(name)) {
+						return OdfTable.getInstance(table);
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+
+	/**
+	 * Return a list of table features in this document.
+	 * @return a list of table features in this document.
+	 */
+	public List<OdfTable> getTableList() {
+		List<OdfTable> tableList = null;
+		try {
+			List<TableTableElement> tableElementList = getTables();
+			tableList = new ArrayList<OdfTable>(tableElementList.size());
+			for (int i = 0;
+					i < tableElementList.size();
+					i++) {
+				tableList.add(OdfTable.getInstance(tableElementList.get(i)));
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return tableList;
+	}
+
+	/**
+	 * Update document meta data in the ODF document. Following metadata data is
+	 * being updated:
+	 * <ul>
+	 * <li>The name of the person who last modified this document will be the Java user.name System property</li>
+	 * <li>The date and time when the document was last modified using current data</li>
+	 * <li>The number of times this document has been edited is incremented by 1</li>
+	 * <li>The total time spent editing this document</li>
+	 * </ul>
+	 * 
+	 * TODO:This method will be moved to OdfMetadata class. 
+	 *      see http://odftoolkit.org/bugzilla/show_bug.cgi?id=204
+	 * @throws Exception 
+	 * @throws IllegalArgumentException 
+	 */
+	private void updateMetaData() throws IllegalArgumentException, Exception {
+		if (getOfficeMetadata().hasAutomaticUpdate()) {
+			OdfOfficeMeta metaData = getOfficeMetadata();
+
+			// set creation date´
+			if (mCreationDate != null) {
+				getOfficeMetadata().setCreationDate(mCreationDate);
+			}
+
+			// update late modfied date
+			Calendar calendar = Calendar.getInstance();
+			metaData.setDate(calendar);
+
+			// update editing-cycles
+			Integer cycle = metaData.getEditingCycles();
+			if (cycle != null) {
+				metaData.setEditingCycles(++cycle);
+			} else {
+				metaData.setEditingCycles(1);
+			}
+			// update editing-duration
+			long editingDuration = calendar.getTimeInMillis() - documentOpeningTime;
+			editingDuration = (editingDuration < 1) ? 1 : editingDuration;
+			try {
+				DatatypeFactory aFactory = DatatypeFactory.newInstance();
+				metaData.setEditingDuration(new Duration(aFactory.newDurationDayTime(editingDuration)));
+			} catch (DatatypeConfigurationException e) {
+				Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE,
+						"editing duration update fail as DatatypeFactory can not be instanced", e);
+			}
+		}
+	}
+
+	// /////////////////
+	// Following is the implementation of locale settings
+	// ////////////////
+	/**
+	 * <p>
+	 * Unicode characters are in general divided by office applications into
+	 * three different groups.
+	 * 
+	 * <p>
+	 * 1) There is CJK: the Chinese, Japanese and Korean script (also old
+	 * Vietnamese belong to this group). See
+	 * http://en.wikipedia.org/wiki/CJK_characters
+	 * 
+	 * <p>
+	 * 2) There is CTL: Complex Text Layout, which uses BIDI algorithms and/or
+	 * glyph modules for instance Arabic, Hebrew, Indic and Thai. See http://en.wikipedia.org/wiki/Complex_Text_Layout
+	 * 
+	 * <p>
+	 * 3) And there is all the rest, which was once called by MS Western.
+	 */
+	public enum UnicodeGroup {
+
+		/**
+		 * Western language
+		 */
+		WESTERN,
+		/**
+		 * Chinese, Japanese and Korean
+		 */
+		CJK,
+		/**
+		 * Complex Text Layout language
+		 */
+		CTL;
+	}
+	private final static HashSet<String> CJKLanguage = new HashSet<String>();
+	private final static HashSet<String> CTLLanguage = new HashSet<String>();
+
+	{
+		CJKLanguage.add("zh"); // LANGUAGE_CHINES
+		CJKLanguage.add("ja"); // LANGUAGE_JAPANESE
+		CJKLanguage.add("ko"); // LANGUAGE_KOREANE
+
+		CTLLanguage.add("am"); // LANGUAGE_AMHARIC_ETHIOPIA
+		CTLLanguage.add("ar"); // LANGUAGE_ARABIC_SAUDI_ARABIA
+		CTLLanguage.add("as"); // LANGUAGE_ASSAMESE
+		CTLLanguage.add("bn"); // LANGUAGE_BENGALI
+		CTLLanguage.add("bo"); // LANGUAGE_TIBETAN
+		CTLLanguage.add("brx");// LANGUAGE_USER_BODO_INDIA
+		CTLLanguage.add("dgo");// LANGUAGE_USER_DOGRI_INDIA
+		CTLLanguage.add("dv"); // LANGUAGE_DHIVEHI
+		CTLLanguage.add("dz"); // LANGUAGE_DZONGKHA
+		CTLLanguage.add("fa"); // LANGUAGE_FARSI
+		CTLLanguage.add("gu"); // LANGUAGE_GUJARATI
+		CTLLanguage.add("he"); // LANGUAGE_HEBREW
+		CTLLanguage.add("hi"); // LANGUAGE_HINDI
+		CTLLanguage.add("km"); // LANGUAGE_KHMER
+		CTLLanguage.add("kn"); // LANGUAGE_KANNADA
+		CTLLanguage.add("ks"); // LANGUAGE_KASHMIRI
+		CTLLanguage.add("ku"); // LANGUAGE_USER_KURDISH_IRAQ
+		CTLLanguage.add("lo"); // LANGUAGE_LAO
+		CTLLanguage.add("mai");// LANGUAGE_USER_MAITHILI_INDIA
+		CTLLanguage.add("ml"); // LANGUAGE_MALAYALAM
+		CTLLanguage.add("mn"); // LANGUAGE_MONGOLIAN_MONGOLIAN
+		CTLLanguage.add("mni");// LANGUAGE_MANIPURI
+		CTLLanguage.add("mr"); // LANGUAGE_MARATHI
+		CTLLanguage.add("my"); // LANGUAGE_BURMESE
+		CTLLanguage.add("ne"); // LANGUAGE_NEPALI
+		CTLLanguage.add("or"); // LANGUAGE_ORIYA
+		CTLLanguage.add("pa"); // LANGUAGE_PUNJABI
+		CTLLanguage.add("sa"); // LANGUAGE_SANSKRIT
+		CTLLanguage.add("sd"); // LANGUAGE_SINDHI
+		CTLLanguage.add("si"); // LANGUAGE_SINHALESE_SRI_LANKA
+		CTLLanguage.add("syr");// LANGUAGE_SYRIAC
+		CTLLanguage.add("ta"); // LANGUAGE_TAMIL
+		CTLLanguage.add("te"); // LANGUAGE_TELUGU
+		CTLLanguage.add("th"); // LANGUAGE_THAI
+		CTLLanguage.add("ug"); // LANGUAGE_UIGHUR_CHINA
+		CTLLanguage.add("ur"); // LANGUAGE_URDU
+		CTLLanguage.add("yi"); // LANGUAGE_YIDDISH
+	}
+
+	/**
+	 * <p>
+	 * Set a locale information.
+	 * <p>
+	 * The locale information will affect the language and country setting of
+	 * the document. Thus the font settings, the spell checkings and etc will be
+	 * affected.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale
+	 */
+	public void setLocale(Locale locale) {
+		setLocale(locale, getUnicodeGroup(locale));
+	}
+
+	/**
+	 * This method will return Locale, which presents the default
+	 * language and country information settings in this document.
+	 *
+	 * @return an instance of Locale that the default language and country is
+	 *         set to.
+	 */
+	/**
+	 * Similar to OpenOffice.org, ODFDOM assumes that every Locale is related
+	 * to one of the three Unicodes Groups, either CJK, CTL or Western.
+	 * @param locale the UnicodeGroup is requested for
+	 * @return the related UnicodeGroup
+	 */
+	public static UnicodeGroup getUnicodeGroup(Locale locale) {
+		String language = locale.getLanguage();
+		if (CJKLanguage.contains(language)) {
+			return UnicodeGroup.CJK;
+		}
+		if (CTLLanguage.contains(language)) {
+			return UnicodeGroup.CTL;
+		}
+		return UnicodeGroup.WESTERN;
+
+	}
+
+	/**
+	 * <p>
+	 * Set a locale of a specific script type.
+	 * <p>
+	 * If the locale does not belong to the script type, it will not be set.
+	 *
+	 * @param locale
+	 *            - Locale information
+	 * @param unicodeGroup
+	 *            - The script type
+	 */
+	private void setLocale(Locale locale, UnicodeGroup unicodeGroup) {
+		try {
+			switch (unicodeGroup) {
+				case WESTERN:
+					setDefaultWesternLanguage(locale);
+					break;
+				case CJK:
+					setDefaultAsianLanguage(locale);
+					break;
+				case CTL:
+					setDefaultComplexLanguage(locale);
+					break;
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE,
+					"Failed to set locale", e);
+		}
+	}
+
+	/**
+	 * This method will return Locale, which presents the default
+	 * language and country information settings in this document
+	 * <p>
+	 * ODF allows to set a Locale for each of the three UnicodeGroups.
+	 * Therefore there might be three different Locale for the document.
+	 * 
+	 * @param unicodeGroup
+	 *            - One of the three (CJK, CTL or Western).
+	 * @return the Locale for the given UnicodeGroup
+	 */
+	public Locale getLocale(UnicodeGroup unicodeGroup) {
+		try {
+			switch (unicodeGroup) {
+				case WESTERN:
+					return getDefaultLanguageByProperty(OdfTextProperties.Country,
+							OdfTextProperties.Language);
+				case CJK:
+					return getDefaultLanguageByProperty(
+							OdfTextProperties.CountryAsian,
+							OdfTextProperties.LanguageAsian);
+				case CTL:
+					return getDefaultLanguageByProperty(
+							OdfTextProperties.CountryComplex,
+							OdfTextProperties.LanguageComplex);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfDocument.class.getName()).log(Level.SEVERE,
+					"Failed to get locale", e);
+		}
+		return null;
+	}
+
+	/** Returns the current Locale for the OdfStyleProperty of the corresponding UnicodeGroup */
+	private Locale getDefaultLanguageByProperty(OdfStyleProperty countryProp,
+			OdfStyleProperty languageProp) throws Exception {
+		String lang = null, ctry = null;
+
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+
+		// get language and country setting from default style setting for
+		// paragraph
+		OdfDefaultStyle defaultStyle = styles.getDefaultStyle(OdfStyleFamily.Paragraph);
+		if (defaultStyle != null) {
+			if (defaultStyle.hasProperty(countryProp) && defaultStyle.hasProperty(languageProp)) {
+				ctry = defaultStyle.getProperty(countryProp);
+				lang = defaultStyle.getProperty(languageProp);
+				return new Locale(lang, ctry);
+			}
+		}
+		// if no default style setting for paragraph
+		// get language and country setting from other default style settings
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+		while (itera.hasNext()) {
+			OdfDefaultStyle style = itera.next();
+			if (style.hasProperty(countryProp) && style.hasProperty(languageProp)) {
+				ctry = style.getProperty(countryProp);
+				lang = style.getProperty(languageProp);
+				return new Locale(lang, ctry);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method will set the default language and country information of the
+	 * document, based on the parameter of the Locale information.
+	 *
+	 * @param locale
+	 *            - an instance of Locale that the default language and country
+	 *            will be set to.
+	 * @throws Exception
+	 */
+	private void setDefaultWesternLanguage(Locale locale) throws Exception {
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		if (defaultStyles != null) {
+			Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+			while (itera.hasNext()) {
+				OdfDefaultStyle style = itera.next();
+				if (style.getFamily().getProperties().contains(
+						OdfTextProperties.Language)) {
+					style.setProperty(OdfTextProperties.Language, locale.getLanguage());
+					style.setProperty(OdfTextProperties.Country, locale.getCountry());
+				}
+			}
+		}
+	}
+
+	/**
+	 * This method will set the default Asian language and country information
+	 * of the document, based on the parameter of the Locale information. If the
+	 * Locale instance is not set a Asian language (Chinese, Traditional
+	 * Chinese, Japanese and Korean, nothing will take effect.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale that the default Asian language and
+	 *            country will be set to.
+	 * @throws Exception
+	 */
+	private void setDefaultAsianLanguage(Locale locale) throws Exception {
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		if (defaultStyles != null) {
+			Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+			while (itera.hasNext()) {
+				OdfDefaultStyle style = itera.next();
+				if (style.getFamily().getProperties().contains(
+						OdfTextProperties.LanguageAsian)) {
+					style.setProperty(OdfTextProperties.LanguageAsian, locale.getLanguage());
+					style.setProperty(OdfTextProperties.CountryAsian, locale.getCountry());
+				}
+			}
+		}
+	}
+
+	/**
+	 * This method will set the default complex language and country information
+	 * of the document, based on the parameter of the Locale information.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale that the default complex language and
+	 *            country will be set to.
+	 * @throws Exception
+	 */
+	private void setDefaultComplexLanguage(Locale locale) throws Exception {
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		if (defaultStyles != null) {
+			Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+			while (itera.hasNext()) {
+				OdfDefaultStyle style = itera.next();
+				if (style.getFamily().getProperties().contains(
+						OdfTextProperties.LanguageComplex)) {
+					style.setProperty(OdfTextProperties.LanguageComplex, locale.getLanguage());
+					style.setProperty(OdfTextProperties.CountryComplex, locale.getCountry());
+				}
+			}
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfGraphicsDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfGraphicsDocument.java
new file mode 100644
index 0000000..1d3fd9b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfGraphicsDocument.java
@@ -0,0 +1,177 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeDrawingElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.SAXException;
+
+/**
+ * This class represents an empty ODF graphics document.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.GraphicsDocument} in Simple API.
+ */
+public class OdfGraphicsDocument extends OdfDocument {
+
+	private static final String EMPTY_GRAPHICS_DOCUMENT_PATH = "/OdfGraphicsDocument.odg";
+	static final Resource EMPTY_GRAPHICS_DOCUMENT_RESOURCE = new Resource(EMPTY_GRAPHICS_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of OdfGraphicsDocument documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		GRAPHICS(OdfDocument.OdfMediaType.GRAPHICS),
+		GRAPHICS_TEMPLATE(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+		private final OdfDocument.OdfMediaType mMediaType;
+
+		OdfMediaType(OdfDocument.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfDocument.OdfMediaType getOdfMediaType(String mediaType) {
+			return OdfDocument.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty graphics document.
+	 * @return ODF graphics document based on a default template
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfGraphicsDocument newGraphicsDocument() throws Exception {
+		return (OdfGraphicsDocument) OdfDocument.loadTemplate(EMPTY_GRAPHICS_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.GRAPHICS);
+	}
+
+	/**
+	 * Creates an empty graphics template.
+	 * @return ODF graphics template based on a default
+	 * @throws java.lang.Exception - if the template could not be created
+	 */
+	public static OdfGraphicsDocument newGraphicsTemplateDocument() throws Exception {
+		OdfGraphicsDocument doc = (OdfGraphicsDocument) OdfDocument.loadTemplate(EMPTY_GRAPHICS_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+		doc.changeMode(OdfMediaType.GRAPHICS_TEMPLATE);
+		return doc;
+	}
+
+	/** To avoid data duplication a new document is only created, if not already opened.
+	 * A document is cached by this constructor using the internalpath as key. */
+	protected OdfGraphicsDocument(OdfPackage pkg, String internalPath, OdfGraphicsDocument.OdfMediaType odfMediaType) throws SAXException {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Creates an OdfGraphicsDocument from the OpenDocument provided by a resource Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfGraphicsDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 * 
+	 * <p>If the resource stream is not a ODF graphics document, ClassCastException might be thrown.</p>
+	 *
+	 * @param inputStream - the InputStream of the ODF graphics document.
+	 * @return the graphics document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfGraphicsDocument loadDocument(InputStream inputStream) throws Exception {
+        return (OdfGraphicsDocument) OdfDocument.loadDocument(inputStream);
+    }
+	
+	/**
+	 * Loads an OdfGraphicsDocument from the provided path.
+	 *
+	 * <p>OdfGraphicsDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfGraphicsDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF graphics document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the graphics document from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfGraphicsDocument loadDocument(String documentPath) throws Exception {
+		return (OdfGraphicsDocument)OdfDocument.loadDocument(documentPath);
+	}
+	
+	/**
+	 * Creates an OdfGraphicsDocument from the OpenDocument provided by a File.
+	 *
+	 * <p>OdfGraphicsDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfGraphicsDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF graphics document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param file - a file representing the ODF graphics document.
+	 * @return the graphics document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfGraphicsDocument loadDocument(File file) throws Exception {
+		return (OdfGraphicsDocument)OdfDocument.loadDocument(file);
+	}
+	
+	/**
+	 * Get the content root of a graphics document.
+	 *
+	 * @return content root, representing the office:drawing tag
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeDrawingElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeDrawingElement.class);
+	}
+
+	/**
+	 * Changes the document to the given mediatype. 
+	 * This method can only be used to convert a document to a related mediatype, e.g. template.
+	 *
+	 * @param mediaType the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfImageDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfImageDocument.java
new file mode 100644
index 0000000..e0d3b90
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfImageDocument.java
@@ -0,0 +1,175 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeImageElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.SAXException;
+
+/**
+ * This class represents an ODF image document.
+ * 
+ */
+public class OdfImageDocument extends OdfDocument {
+
+	private static final String EMPTY_IMAGE_DOCUMENT_PATH = "/OdfImageDocument.odi";
+	static final Resource EMPTY_IMAGE_DOCUMENT_RESOURCE = new Resource(EMPTY_IMAGE_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of OdfImageDocument documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		IMAGE(OdfDocument.OdfMediaType.IMAGE),
+		IMAGE_TEMPLATE(OdfDocument.OdfMediaType.IMAGE_TEMPLATE);
+		private final OdfDocument.OdfMediaType mMediaType;
+
+		OdfMediaType(OdfDocument.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfDocument.OdfMediaType getOdfMediaType(String mediaType) {
+			return OdfDocument.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty image document.
+	 * @return ODF image document based on a default template
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfImageDocument newImageDocument() throws Exception {
+		return (OdfImageDocument) OdfDocument.loadTemplate(EMPTY_IMAGE_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.IMAGE);
+	}
+
+	/**
+	 * Creates an empty image template.
+	 * @return ODF image template based on a default
+	 * @throws java.lang.Exception - if the template could not be created
+	 */
+	public static OdfImageDocument newImageTemplateDocument() throws Exception {
+		OdfImageDocument doc = (OdfImageDocument) OdfDocument.loadTemplate(EMPTY_IMAGE_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.IMAGE_TEMPLATE);
+		doc.changeMode(OdfMediaType.IMAGE_TEMPLATE);
+		return doc;
+	}
+
+	/** To avoid data duplication a new document is only created, if not already opened.
+	 * A document is cached by this constructor using the internalpath as key. */
+	protected OdfImageDocument(OdfPackage pkg, String internalPath, OdfImageDocument.OdfMediaType odfMediaType) throws SAXException {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Creates an OdfImageDocument from the OpenDocument provided by a resource Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfImageDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 * 
+	 * <p>If the resource stream is not a ODF image document, ClassCastException might be thrown.</p>
+	 *
+	 * @param inputStream - the InputStream of the ODF image document.
+	 * @return the image document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfImageDocument loadDocument(InputStream inputStream) throws Exception {
+        return (OdfImageDocument) OdfDocument.loadDocument(inputStream);
+    }
+	
+	/**
+	 * Loads an OdfImageDocument from the provided path.
+	 *
+	 * <p>OdfImageDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfImageDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF image document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the image document from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfImageDocument loadDocument(String documentPath) throws Exception {
+		return (OdfImageDocument)OdfDocument.loadDocument(documentPath);
+	}
+	
+	/**
+	 * Creates an OdfImageDocument from the OpenDocument provided by a File.
+	 *
+	 * <p>OdfImageDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfImageDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF image document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param file - a file representing the ODF image document.
+	 * @return the image document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfImageDocument loadDocument(File file) throws Exception {
+		return (OdfImageDocument)OdfDocument.loadDocument(file);
+	}
+	/**
+	 * Get the content root of a image document.
+	 *
+	 * @return content root, representing the office:drawing tag
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeImageElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeImageElement.class);
+	}
+
+	/**
+	 * Changes the document to the given mediatype.
+	 * This method can only be used to convert a document to a related mediatype, e.g. template.
+	 *
+	 * @param mediaType the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfPresentationDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfPresentationDocument.java
new file mode 100644
index 0000000..88a6d85
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfPresentationDocument.java
@@ -0,0 +1,1468 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.doc.presentation.OdfSlide;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePresentationPageLayoutElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * This class represents an empty ODF presentation.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.PresentationDocument} in Simple API.
+ */
+public class OdfPresentationDocument extends OdfDocument {
+
+	private static final String EMPTY_PRESENTATION_DOCUMENT_PATH = "/OdfPresentationDocument.odp";
+	static final Resource EMPTY_PRESENTATION_DOCUMENT_RESOURCE = new Resource(EMPTY_PRESENTATION_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of OdfPresentationDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		PRESENTATION(OdfDocument.OdfMediaType.PRESENTATION),
+		PRESENTATION_TEMPLATE(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+		private final OdfDocument.OdfMediaType mMediaType;
+
+		OdfMediaType(OdfDocument.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the ODF mediatype of this document
+		 */
+		public OdfDocument.OdfMediaType getOdfMediaType() {
+			return mMediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfDocument.OdfMediaType getOdfMediaType(String mediaType) {
+			return OdfDocument.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty presentation document.
+	 * @return ODF presentation document based on a default template
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfPresentationDocument newPresentationDocument() throws Exception {
+		return (OdfPresentationDocument) OdfDocument.loadTemplate(EMPTY_PRESENTATION_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.PRESENTATION);
+	}
+
+	/**
+	 * Creates an empty presentation template.
+	 * @return ODF presentation template based on a default
+	 * @throws Exception - if the template could not be created
+	 */
+	public static OdfPresentationDocument newPresentationTemplateDocument() throws Exception {
+		OdfPresentationDocument doc = (OdfPresentationDocument) OdfDocument.loadTemplate(EMPTY_PRESENTATION_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+		doc.changeMode(OdfMediaType.PRESENTATION_TEMPLATE);
+		return doc;
+	}
+
+	/** To avoid data duplication a new document is only created, if not already opened.
+	 * A document is cached by this constructor using the internalpath as key. */
+	protected OdfPresentationDocument(OdfPackage pkg, String internalPath, OdfPresentationDocument.OdfMediaType odfMediaType) throws SAXException {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Creates an OdfPresentationDocument from the OpenDocument provided by a resource Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfPresentationDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 * 
+	 * <p>If the resource stream is not a ODF presentation document, ClassCastException might be thrown.</p>
+	 *
+	 * @param inputStream - the InputStream of the ODF presentation document.
+	 * @return the presentation document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfPresentationDocument loadDocument(InputStream inputStream) throws Exception {
+		return (OdfPresentationDocument) OdfDocument.loadDocument(inputStream);
+	}
+
+	/**
+	 * Loads an OdfPresentationDocument from the provided path.
+	 *
+	 * <p>OdfPresentationDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfPresentationDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF presentation document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the presentation document from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfPresentationDocument loadDocument(String documentPath) throws Exception {
+		return (OdfPresentationDocument) OdfDocument.loadDocument(documentPath);
+	}
+
+	/**
+	 * Creates an OdfPresentationDocument from the OpenDocument provided by a File.
+	 *
+	 * <p>OdfPresentationDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfPresentationDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF presentation document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param file - a file representing the ODF presentation document.
+	 * @return the presentation document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfPresentationDocument loadDocument(File file) throws Exception {
+		return (OdfPresentationDocument) OdfDocument.loadDocument(file);
+	}
+
+	/**
+	 * Get the content root of a presentation document.
+	 *
+	 * @return content root, representing the office:presentation tag
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@Override
+	public OfficePresentationElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficePresentationElement.class);
+	}
+
+	/**
+	 * Switches this instance to the given type. This method can be used to e.g.
+	 * convert a document instance to a template and vice versa.
+	 * Changes take affect in the package when saving the document.
+	 *
+	 * @param type the compatible ODF mediatype.
+	 */
+	public void changeMode(OdfMediaType type) {
+		setOdfMediaType(type.mMediaType);
+	}
+	private boolean hasCheckSlideName = false;
+	//if the copy foreign slide for several times, 
+	//the same style might be copied for several times with the different name
+	//so use styleRenameMap to keep track the renamed style so we can reuse the style, 
+	//rather than new several styles which only have the different style names.
+	//while if the style elements really have the same style name but with different content
+	//such as that these style elements are from different document
+	//so the value for each key should be a list
+	private HashMap<String, List<String>> styleRenameMap = new HashMap<String, List<String>>();
+	//the map is used to record if the renamed style name is appended to the current dom
+	private HashMap<String, Boolean> styleAppendMap = new HashMap<String, Boolean>();
+	//the object rename map for image.
+	//can not easily recognize if the embedded document are the same.
+//	private HashMap<String, String> objectRenameMap = new HashMap<String, String>();
+
+	/**
+	 * Return the slide at a specified position in this presentation.
+	 * Return null if the index is out of range.
+	 *
+	 * @param index	the index of the slide to be returned
+	 * @return	a draw slide at the specified position
+	 */
+	public OdfSlide getSlideByIndex(int index) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		if ((index >= slideNodes.getLength()) || (index < 0)) {
+			return null;
+		}
+		DrawPageElement slideElement = (DrawPageElement) slideNodes.item(index);
+		return OdfSlide.getInstance(slideElement);
+	}
+
+	/**
+	 * Get the number of the slides in this presentation.
+	 *
+	 * @return	the number of slides
+	 */
+	public int getSlideCount() {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return 0;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		return slideNodes.getLength();
+	}
+
+	/**
+	 * Return the slide which have a specified slide name in this presentation.
+	 * <p>
+	 * According to the odf specification
+	 * "The draw:name attribute specifies a name by which this element can be referenced. 
+	 * It is optional but if present, must be unique within the document instance. 
+	 * If not present, an application may generate a unique name."
+	 * <p>
+	 * If the name is null, then return null because all the slide must has its own unique name.
+	 * 
+	 * @param name	the specified slide name
+	 * @return	the slide whose name equals to the specified name
+	 */
+	public OdfSlide getSlideByName(String name) {
+		checkAllSlideName();
+		if (name == null) {
+			return null;
+		}
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideElement = (DrawPageElement) slideNodes.item(i);
+			OdfSlide slide = OdfSlide.getInstance(slideElement);
+			String slideName = slide.getSlideName();
+			if (slideName.equals(name)) {
+				return slide;
+			}
+		}
+		return null;
+	}
+
+	//when access slide related method, this function should be called
+	private void checkAllSlideName() {
+		//check if this function is called or not
+		if (hasCheckSlideName) {
+			return;
+		}
+		List<String> slideNameList = new ArrayList<String>();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideElement = (DrawPageElement) slideNodes.item(i);
+			String slideName = slideElement.getDrawNameAttribute();
+			if ((slideName == null) || slideNameList.contains(slideName)) {
+				slideName = "page" + (i + 1) + "-" + makeUniqueName();
+				slideElement.setDrawNameAttribute(slideName);
+			}
+			slideNameList.add(slideName);
+		}
+		hasCheckSlideName = true;
+	}
+
+	/**
+	 * Return a list iterator containing all slides in this presentation.
+	 *
+	 * @return	a list iterator containing all slides in this presentation
+	 */
+	public Iterator<OdfSlide> getSlides() {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		ArrayList<OdfSlide> slideList = new ArrayList<OdfSlide>();
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideElement = (DrawPageElement) slideNodes.item(i);
+			slideList.add(OdfSlide.getInstance(slideElement));
+		}
+		return slideList.iterator();
+	}
+
+	/**
+	 * Delete the slide at a specified position in this presentation.
+	 *
+	 * @param index	the index of the slide that need to be delete
+	 * <p>
+	 * Throw IndexOutOfBoundsException if the slide index is out of the presentation document slide count.
+	 * @return false if the operation was not successful
+	 */
+	public boolean deleteSlideByIndex(int index) {
+		boolean success = true;
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+			return success;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		if ((index >= slideNodes.getLength()) || (index < 0)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call deleteSlideByIndex method.");
+		}
+		DrawPageElement slideElement = (DrawPageElement) slideNodes.item(index);
+		//remove all the content of the current page
+		//1. the reference of the path that contained in this slide is 1, then remove it
+		success &= deleteLinkRef(slideElement);
+		//2.the reference of the style is 1, then remove it
+		//in order to save time, do not delete the style here
+		success &= deleteStyleRef(slideElement);
+		//remove the current page element
+		contentRoot.removeChild(slideElement);
+		adjustNotePageNumber(index);
+		return success;
+	}
+
+	private boolean deleteStyleRef(DrawPageElement slideEle) {
+		boolean success = true;
+		try {			
+			//method 1:
+			//1.1. iterate child element of the content element
+			//1.2. if the child element is an OdfStylableElement, get the style-name ref count
+			////////////////
+			//method 2:
+			//2.1. get the list of the style definition
+			ArrayList<OdfElement> removeStyles = new ArrayList<OdfElement>();
+			OdfOfficeAutomaticStyles autoStyles = getContentDom().getAutomaticStyles();
+
+			NodeList stylesList = autoStyles.getChildNodes();
+			OdfContentDom contentDom = getContentDom();
+			XPath xpath = contentDom.getXPath();
+
+			//2.2. get the reference of each style which occurred in the current page
+			for (int i = 0; i < stylesList.getLength(); i++) {
+				Node item = stylesList.item(i);
+				if (item instanceof OdfElement) {
+					OdfElement node = (OdfElement) item;
+					String styleName = node.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "name");
+					if (styleName != null) {
+						//search the styleName contained at the current page element
+						NodeList styleNodes = (NodeList) xpath.evaluate("//*[@*='" + styleName + "']", contentDom, XPathConstants.NODESET);
+						int styleCnt = styleNodes.getLength();
+						if (styleCnt > 1) {
+							//the first styleName is occurred in the style definition
+							//so check if the second styleName and last styleName is occurred in the current page element
+							//if yes, then remove it
+							OdfElement elementFirst = (OdfElement) styleNodes.item(1);
+							OdfElement elementLast = (OdfElement) styleNodes.item(styleCnt - 1);
+							boolean isSamePage = false;
+							if (elementFirst instanceof DrawPageElement) {
+								DrawPageElement tempPage = (DrawPageElement) elementFirst;
+								if (tempPage.equals(slideEle)) {
+									isSamePage = true;
+								}
+							}
+							int relationFirst = slideEle.compareDocumentPosition(elementFirst);
+							int relationLast = slideEle.compareDocumentPosition(elementLast);
+							//if slide element contains the child element which has the styleName reference
+							if (((relationFirst & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0
+									&& (relationLast & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0)
+									|| (isSamePage && (styleCnt == 1))) {
+								if (node instanceof OdfStyleBase) {
+									removeStyles.add(node);
+								}
+							}
+						} else {
+							continue;
+						}
+					}
+				}
+			}
+			for (int i = 0; i < removeStyles.size(); i++) {
+				autoStyles.removeChild(removeStyles.get(i));
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+		}
+		return success;
+	}
+
+	//delete all the xlink:href object which is contained in slideElement and does not referred by other slides
+	private boolean deleteLinkRef(DrawPageElement slideEle) {
+		boolean success = true;
+		try {
+			OdfContentDom contentDom = getContentDom();
+			XPath xpath = contentDom.getXPath();
+			NodeList linkNodes = (NodeList) xpath.evaluate("//*[@xlink:href]", contentDom, XPathConstants.NODESET);
+			for (int i = 0; i < linkNodes.getLength(); i++) {
+				OdfElement object = (OdfElement) linkNodes.item(i);
+				String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+				int relation = slideEle.compareDocumentPosition(object);
+				//if slide element contains the returned element which has the xlink:href reference
+				if ((relation & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0 && refObjPath != null && refObjPath.length() > 0) {
+					//the path of the object is start with "./"
+					NodeList pathNodes = (NodeList) xpath.evaluate("//*[@xlink:href='" + refObjPath + "']", getContentDom(), XPathConstants.NODESET);
+					int refCount = pathNodes.getLength();
+					if (refCount == 1) {
+						//delete "./"
+						if (refObjPath.startsWith("./")) {
+							refObjPath = refObjPath.substring(2);
+						}
+						//check if the current document contains the same path
+						OdfFileEntry fileEntry = getPackage().getFileEntry(refObjPath);
+						if (fileEntry != null) {
+							//it is a stream, such as image, binary file
+							getPackage().remove(refObjPath);
+						} else {
+							//note: if refObjPath is a directory, it must end with '/'
+							fileEntry = getPackage().getFileEntry(refObjPath + "/");
+							removeDocument(refObjPath);
+						}
+					}
+				}
+			}
+		} catch (XPathExpressionException e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+		}
+		return success;
+	}
+
+	/**
+	 * Delete all the slides with a specified name in this presentation.
+	 *
+	 * @param name	the name of the slide that need to be delete
+	 * @return false if the operation was not successful
+	 */
+	public boolean deleteSlideByName(String name) {
+		boolean success = true;
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+			return success;
+		}
+		OdfSlide slide = getSlideByName(name);
+		DrawPageElement slideElement = slide.getOdfElement();
+		//remove all the content of the current page
+		//1. the reference of the path that contained in this slide is 1, then remove its
+		success &= deleteLinkRef(slideElement);
+		//2.the reference of the style is 1, then remove it
+		//in order to save time, do not delete style here
+		success &= deleteStyleRef(slideElement);
+		//remove the current page element
+		contentRoot.removeChild(slideElement);
+		adjustNotePageNumber(0);
+		return success;
+	}
+
+	/**
+	 * Make a copy of the slide at a specified position to another position in this presentation.
+	 * The original slide which at the dest index and after the dest index will move after.
+	 * <p>
+	 * @param source	the source position of the slide need to be copied 
+	 * @param dest		the destination position of the slide need to be copied
+	 * @param newName	the new name of the copied slide
+	 * @return the new slide at the destination position with the specified name, and it has the same content 
+	 * with the slide at the source position.
+	 * <p>
+	 * Throw IndexOutOfBoundsException if the slide index is out of the presentation document slide count.
+	 * If copy the slide at the end of document, destIndex should set the same value with the slide count.
+	 */
+	public OdfSlide copySlide(int source, int dest, String newName) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((source < 0) || (source >= slideCount)
+				|| (dest < 0) || (dest > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call copySlide method.");
+		}
+		DrawPageElement sourceSlideElement = (DrawPageElement) slideList.item(source);
+		DrawPageElement cloneSlideElement = (DrawPageElement) sourceSlideElement.cloneNode(true);
+		cloneSlideElement.setDrawNameAttribute(newName);
+		if (dest == slideCount) {
+			contentRoot.appendChild(cloneSlideElement);
+		} else {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(dest);
+			contentRoot.insertBefore(cloneSlideElement, refSlide);
+		}
+		adjustNotePageNumber(Math.min(source, dest));
+		//in case that the appended new slide have the same name with the original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+		return OdfSlide.getInstance(cloneSlideElement);
+	}
+
+	/**
+	 * Move the slide at a specified position to the destination position.
+	 *
+	 * @param source	the current index of the slide that need to be moved
+	 * @param dest		The index of the destination position before the move action
+	 * <p>
+	 * Throw IndexOutOfBoundsException if the slide index is out of the presentation document slide count.
+	 */
+	public void moveSlide(int source, int dest) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((source < 0) || (source >= slideCount)
+				|| (dest < 0) || (dest > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call moveSlide method.");
+		}
+		DrawPageElement sourceSlide = (DrawPageElement) slideList.item(source);
+		if (dest == slideCount) {
+			contentRoot.appendChild(sourceSlide);
+		} else {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(dest);
+			contentRoot.insertBefore(sourceSlide, refSlide);
+		}
+		adjustNotePageNumber(Math.min(source, dest));
+	}
+
+	/**
+	 * Append all the slides of the specified presentation document to the current document.
+	 * @param srcDoc	the specified <code>OdfPresentationDocument</code> that need to be appended
+	 */
+	public void appendPresentation(OdfPresentationDocument srcDoc) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		OdfFileDom contentDom = null;
+		OfficePresentationElement srcContentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+			contentDom = getContentDom();
+			srcContentRoot = srcDoc.getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideNum = slideList.getLength();
+		//clone the srcContentRoot, and make a modification on this clone node.
+		OfficePresentationElement srcCloneContentRoot = (OfficePresentationElement) srcContentRoot.cloneNode(true);
+		//copy all the referred xlink:href here
+		copyForeignLinkRef(srcCloneContentRoot);
+		//copy all the referred style definition here
+		copyForeignStyleRef(srcCloneContentRoot, srcDoc);
+		Node child = srcCloneContentRoot.getFirstChild();
+		while (child != null) {
+			Node cloneElement = cloneForeignElement(child, contentDom, true);
+			contentRoot.appendChild(cloneElement);
+			child = child.getNextSibling();
+		}
+		adjustNotePageNumber(slideNum - 1);
+
+		//in case that the appended new slide have the same name with the original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+	}
+
+	/**
+	 * Make a copy of slide which locates at the specified position of the source presentation document
+	 * and insert it to the current presentation document at the new position.
+	 * The original slide which at the dest index and after the dest index will move after.
+	 * @param destIndex	the new position of the copied slide in the current document
+	 * @param srcDoc	the source document of the copied slide
+	 * @param srcIndex	the slide index of the source document that need to be copied
+	 * @return the new slide which has the same content with the source slide
+	 * <p>
+	 * Throw IndexOutOfBoundsException if the slide index is out of the presentation document slide count
+	 * If insert the foreign slide at the end of document, destIndex should set the same value
+	 * with the slide count of the current presentation document.
+	 */
+	public OdfSlide copyForeignSlide(int destIndex,
+			OdfPresentationDocument srcDoc, int srcIndex) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		OdfFileDom contentDom = null;
+		try {
+			contentRoot = getContentRoot();
+			contentDom = getContentDom();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((destIndex < 0) || (destIndex > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call copyForeignSlide method.");
+		}
+		OdfSlide sourceSlide = srcDoc.getSlideByIndex(srcIndex);
+		DrawPageElement sourceSlideElement = sourceSlide.getOdfElement();
+		//clone the sourceSlideEle, and make a modification on this clone node.
+		DrawPageElement sourceCloneSlideElement = (DrawPageElement) sourceSlideElement.cloneNode(true);
+
+		//copy all the referred xlink:href here
+		copyForeignLinkRef(sourceCloneSlideElement);
+		//copy all the referred style definition here
+		copyForeignStyleRef(sourceCloneSlideElement, srcDoc);
+		//clone the sourceCloneSlideEle, and this cloned element should in the current dom tree
+		DrawPageElement cloneSlideElement = (DrawPageElement) cloneForeignElement(sourceCloneSlideElement, contentDom, true);
+		if (destIndex == slideCount) {
+			contentRoot.appendChild(cloneSlideElement);
+		} else {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(destIndex);
+			contentRoot.insertBefore(cloneSlideElement, refSlide);
+		}
+		adjustNotePageNumber(destIndex);
+		//in case that the appended new slide have the same name with the original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+		return OdfSlide.getInstance(cloneSlideElement);
+	}
+
+	//clone the source clone element's referred object path to the current package
+	//if the current package contains the same name with the referred object path,
+	//rename the object path and path reference of this slide element
+	//notes: the source clone element is the copied one to avoid changing the content of the source document.
+	private void copyForeignLinkRef(OdfElement sourceCloneEle) {
+		try {
+			OdfFileDom fileDom = (OdfFileDom) sourceCloneEle.getOwnerDocument();
+			XPath xpath;
+			if (fileDom instanceof OdfContentDom) {
+				xpath = ((OdfContentDom) fileDom).getXPath();
+			} else {
+				xpath = ((OdfStylesDom) fileDom).getXPath();
+			}
+			OdfPackageDocument srcDoc = fileDom.getDocument();
+			//new a map to put the original name and the rename string, in case that the same name might be referred by the slide several times.
+			HashMap<String, String> objectRenameMap = new HashMap<String, String>();
+			NodeList linkNodes = (NodeList) xpath.evaluate(".//*[@xlink:href]", sourceCloneEle, XPathConstants.NODESET);
+			for (int i = 0; i <= linkNodes.getLength(); i++) {
+				OdfElement object = null;
+				if (linkNodes.getLength() == i) {
+					if (sourceCloneEle.hasAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href")) {
+						object = sourceCloneEle;
+					} else {
+						break;
+					}
+				} else {
+					object = (OdfElement) linkNodes.item(i);
+				}
+				String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+				if (refObjPath != null && refObjPath.length() > 0) {
+					//the path of the object is start with "./"
+					boolean hasPrefix = false;
+					String prefix = "./";
+					if (refObjPath.startsWith(prefix)) {
+						refObjPath = refObjPath.substring(2);
+						hasPrefix = true;
+					}
+					//check if the current document contains the same path
+					OdfFileEntry fileEntry = getPackage().getFileEntry(refObjPath);
+					//note: if refObjPath is a directory, it must end with '/'
+					if (fileEntry == null) {
+						fileEntry = getPackage().getFileEntry(refObjPath + "/");
+					}
+					String newObjPath = refObjPath;
+					if (fileEntry != null) {
+						//rename the object path
+						newObjPath = objectRenameMap.get(refObjPath);
+						if (newObjPath == null) {
+							//if refObjPath still contains ".", it means that it has the suffix
+							//then change the name before the suffix string
+							int dotIndex = refObjPath.indexOf(".");
+							if (dotIndex != -1) {
+								newObjPath = refObjPath.substring(0, dotIndex) + "-" + makeUniqueName() + refObjPath.substring(dotIndex);
+							} else {
+								newObjPath = refObjPath + "-" + makeUniqueName();
+							}
+							objectRenameMap.put(refObjPath, newObjPath);
+						}
+						object.setAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "xlink:href", hasPrefix ? (prefix + newObjPath) : newObjPath);
+					}
+					InputStream is = srcDoc.getPackage().getInputStream(refObjPath);
+					if (is != null) {
+						String mediaType = srcDoc.getPackage().getFileEntry(refObjPath).getMediaTypeString();
+						getPackage().insert(is, newObjPath, mediaType);
+					} else {
+						OdfDocument embedDoc = (OdfDocument) srcDoc.loadSubDocument(refObjPath);
+						if (embedDoc != null) {
+							insertDocument(embedDoc, newObjPath);
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	private void copyForeignStyleRef(OdfElement sourceCloneEle,
+			OdfPresentationDocument doc) {
+		try {
+			OdfContentDom contentDom = getContentDom();
+			XPath xpath = contentDom.getXPath();
+			//1. collect all the referred style element which has "style:name" attribute
+			//1.1. style:name of content.xml
+			String styleQName = "style:name";
+			NodeList srcStyleDefNodeList = (NodeList) xpath.evaluate("//*[@" + styleQName + "]", contentDom, XPathConstants.NODESET);
+			HashMap<OdfElement, List<OdfElement>> srcContentStyleCloneEleList = new HashMap<OdfElement, List<OdfElement>>();
+			HashMap<OdfElement, OdfElement> appendContentStyleList = new HashMap<OdfElement, OdfElement>();
+			getCopyStyleList(null, sourceCloneEle, styleQName, srcStyleDefNodeList, srcContentStyleCloneEleList, appendContentStyleList, true);
+			//1.2. style:name of styles.xml
+			srcStyleDefNodeList = (NodeList) xpath.evaluate("//*[@" + styleQName + "]", doc.getStylesDom(), XPathConstants.NODESET);
+			HashMap<OdfElement, List<OdfElement>> srcStylesStyleCloneEleList = new HashMap<OdfElement, List<OdfElement>>();
+			HashMap<OdfElement, OdfElement> appendStylesStyleList = new HashMap<OdfElement, OdfElement>();
+			getCopyStyleList(null, sourceCloneEle, styleQName, srcStyleDefNodeList, srcStylesStyleCloneEleList, appendStylesStyleList, true);
+			//1.3 rename, copy the referred style element to the corresponding position in the dom tree
+			insertCollectedStyle(styleQName, srcContentStyleCloneEleList, getContentDom(), appendContentStyleList);
+			insertCollectedStyle(styleQName, srcStylesStyleCloneEleList, getStylesDom(), appendStylesStyleList);
+
+
+			//2. collect all the referred style element which has "draw:name" attribute 
+			//2.1 draw:name of styles.xml
+			//the value of draw:name is string or StyleName,
+			//only when the value is StyleName type, the style definition should be cloned to the destination document
+			//in ODF spec, such attribute type is only exist in <office:styles> element, so only search it in styles.xml dom
+			styleQName = "draw:name";
+			srcStyleDefNodeList = (NodeList) xpath.evaluate("//*[@" + styleQName + "]", doc.getStylesDom(), XPathConstants.NODESET);
+			HashMap<OdfElement, List<OdfElement>> srcDrawStyleCloneEleList = new HashMap<OdfElement, List<OdfElement>>();
+			HashMap<OdfElement, OdfElement> appendDrawStyleList = new HashMap<OdfElement, OdfElement>();
+			Iterator<OdfElement> iter = appendContentStyleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendContentStyleList.get(styleElement);
+				getCopyStyleList(styleElement, cloneStyleElement, styleQName, srcStyleDefNodeList, srcDrawStyleCloneEleList, appendDrawStyleList, false);
+			}
+			iter = appendStylesStyleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendStylesStyleList.get(styleElement);
+				getCopyStyleList(styleElement, cloneStyleElement, styleQName, srcStyleDefNodeList, srcDrawStyleCloneEleList, appendDrawStyleList, false);
+			}
+			//2.2 rename, copy the referred style element to the corresponding position in the dom tree
+			//note: "draw:name" style element only exist in styles.dom
+			insertCollectedStyle(styleQName, srcDrawStyleCloneEleList, getStylesDom(), appendDrawStyleList);
+
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+
+	}
+
+	//1. modified the style name of the style definition element which has the same name with the source document
+	//2. As to the style definition which match 1) condition, modified the referred style name of the element which reference this style
+	//3. All the style which also contains other style reference, should be copied to the source document.
+	private void insertCollectedStyle(String styleQName,
+			HashMap<OdfElement, List<OdfElement>> srcStyleCloneEleList, OdfFileDom dom, HashMap<OdfElement, OdfElement> appendStyleList) {
+		try {
+			String stylePrefix = OdfNamespace.getPrefixPart(styleQName);
+			String styleLocalName = OdfNamespace.getLocalPart(styleQName);
+			String styleURI = OdfDocumentNamespace.STYLE.getUri();
+			// is the DOM always the styles.xml
+			XPath xpath = dom.getXPath();
+			NodeList destStyleNodeList = (NodeList) xpath.evaluate("//*[@" + styleQName + "]", dom, XPathConstants.NODESET);
+
+//			HashMap<String, String> styleRenameMap = new HashMap<String, String>();
+			Iterator<OdfElement> iter = srcStyleCloneEleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendStyleList.get(styleElement);
+				if (cloneStyleElement == null) {
+					cloneStyleElement = (OdfElement) styleElement.cloneNode(true);
+					appendStyleList.put(styleElement, cloneStyleElement);
+				}
+				String styleName = styleElement.getAttributeNS(styleURI, styleLocalName);
+				List<String> newStyleNameList = styleRenameMap.get(styleName);
+				// if the newStyleNameList != null, means that styleName exists in dest document
+				// and it has already been renamed
+				if ((newStyleNameList != null)
+						|| (isStyleNameExist(destStyleNodeList, styleName) != null)) {
+					String newStyleName = null;
+					if (newStyleNameList == null) {
+						newStyleNameList = new ArrayList<String>();
+						newStyleName = styleName + "-" + makeUniqueName();
+						newStyleNameList.add(newStyleName);
+						styleRenameMap.put(styleName, newStyleNameList);
+					} else {
+						for (int i = 0; i < newStyleNameList.size(); i++) {
+							String styleNameIter = newStyleNameList.get(i);
+							OdfElement destStyleElementWithNewName = isStyleNameExist(destStyleNodeList, styleNameIter);
+							//check if the two style elements have the same content
+							//if not, the cloneStyleElement should rename, rather than reuse the new style name
+							cloneStyleElement.setAttributeNS(styleURI, styleQName, styleNameIter);
+							if ((destStyleElementWithNewName != null) && destStyleElementWithNewName.equals(cloneStyleElement)) {
+								newStyleName = styleNameIter;
+								break;
+							}
+						}
+						if (newStyleName == null) {
+							newStyleName = styleName + "-" + makeUniqueName();
+							newStyleNameList.add(newStyleName);
+						}
+					}
+					// if newStyleName has been set in the element as the new name
+					// which means that the newStyleName is conform to the odf spec
+					// then change element style reference name
+					if (changeStyleRefName(srcStyleCloneEleList.get(styleElement), styleName, newStyleName)) {
+						cloneStyleElement.setAttributeNS(styleURI, styleQName, newStyleName);
+						//if display name should also be renamed
+						String displayName = cloneStyleElement.getAttributeNS(styleURI, "display-name");
+						if ((displayName != null) && (displayName.length() > 0)) {
+							cloneStyleElement.setAttributeNS(styleURI, stylePrefix + ":display-name",
+									displayName + newStyleName.substring(newStyleName.length() - 8));
+						}
+					}
+
+				}
+			}
+
+			iter = appendStyleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendStyleList.get(styleElement);
+				String newStyleName = cloneStyleElement.getAttributeNS(styleURI, styleLocalName);
+				Boolean isAppended = styleAppendMap.get(newStyleName);
+				//if styleAppendMap contain the newStyleName, 
+				//means that cloneStyleElement has already been appended
+				if ((isAppended != null) && isAppended.booleanValue() == true) {
+					continue;
+				} else {
+					styleAppendMap.put(newStyleName, true);
+				}
+				OdfElement cloneForeignStyleElement = (OdfElement) cloneForeignElement(cloneStyleElement, dom, true);
+				String styleElePath = getElementPath(styleElement);
+				appendForeignStyleElement(cloneForeignStyleElement, dom, styleElePath);
+				copyForeignLinkRef(cloneStyleElement);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+
+	}
+
+	//get all the copy of referred style element which is directly referred or indirectly referred by cloneEle
+	//all the style are defined in srcStyleNodeList
+	//and these style are all have the styleName defined in styleQName attribute
+	//the key of copyStyleEleList is the style definition element
+	//the value of the corresponding key is the clone of the element which refer to the key, 
+	//the cloned element can be the content of slide or the style element.
+	//the key of appendStyleList is the style definition element which has the other style reference
+	//the value of the corresponding key is the the style definition clone element
+	//loop means if recursive call this function
+	//if loop == true, get the style definition element reference other style definition element
+	private void getCopyStyleList(OdfElement ele, OdfElement cloneEle, String styleQName, NodeList srcStyleNodeList,
+			HashMap<OdfElement, List<OdfElement>> copyStyleEleList, HashMap<OdfElement, OdfElement> appendStyleList, boolean loop) {
+		try {
+			String styleLocalName = OdfNamespace.getLocalPart(styleQName);
+			String styleURI = OdfDocumentNamespace.STYLE.getUri();
+			//OdfElement override the "toString" method
+			String cloneEleStr = cloneEle.toString();
+			for (int i = 0; i < srcStyleNodeList.getLength(); i++) {
+				OdfElement styleElement = (OdfElement) srcStyleNodeList.item(i);
+				String styleName = styleElement.getAttributeNS(styleURI, styleLocalName);
+				if (styleName != null) {
+					int index = 0;
+					index = cloneEleStr.indexOf("=\"" + styleName + "\"", index);
+					while (index >= 0) {
+						String subStr = cloneEleStr.substring(0, index);
+						int lastSpaceIndex = subStr.lastIndexOf(' ');
+						String attrStr = subStr.substring(lastSpaceIndex + 1, index);
+						XPath xpath = ((OdfFileDom) cloneEle.getOwnerDocument()).getXPath();
+						NodeList styleRefNodes = (NodeList) xpath.evaluate(".//*[@" + attrStr + "='" + styleName + "']", cloneEle, XPathConstants.NODESET);
+						boolean isExist = false;
+						for (int j = 0; j <= styleRefNodes.getLength(); j++) {
+							OdfElement styleRefElement = null;
+							if (j == styleRefNodes.getLength()) {
+								isExist = isStyleNameRefExist(cloneEle, styleName, false);
+								if (isExist) {
+									styleRefElement = cloneEle;
+								} else {
+									continue;
+								}
+							} else {
+								OdfElement tmpElement = (OdfElement) styleRefNodes.item(j);
+								if (isStyleNameRefExist(tmpElement, styleName, false)) {
+									styleRefElement = tmpElement;
+								} else {
+									continue;
+								}
+							}
+							boolean hasLoopStyleDef = true;
+							if (copyStyleEleList.get(styleElement) == null) {
+								List<OdfElement> styleRefEleList = new ArrayList<OdfElement>();
+								copyStyleEleList.put(styleElement, styleRefEleList);
+								hasLoopStyleDef = false;
+							}
+							copyStyleEleList.get(styleElement).add(styleRefElement);
+
+							OdfElement cloneStyleElement = appendStyleList.get(styleElement);
+							if (cloneStyleElement == null) {
+								cloneStyleElement = (OdfElement) styleElement.cloneNode(true);
+								appendStyleList.put(styleElement, cloneStyleElement);
+							}
+							if (loop && !hasLoopStyleDef) {
+								getCopyStyleList(styleElement, cloneStyleElement, styleQName, srcStyleNodeList, copyStyleEleList, appendStyleList, loop);
+							}
+						}
+						index = cloneEleStr.indexOf("=\"" + styleName + "\"", index + styleName.length());
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+	//append the cloneStyleElement to the contentDom which position is defined by styleElePath
+
+	private void appendForeignStyleElement(OdfElement cloneStyleEle,
+			OdfFileDom dom, String styleElePath) {
+		StringTokenizer token = new StringTokenizer(styleElePath, "/");
+		boolean isExist = true;
+		Node iterNode = dom.getFirstChild();
+		Node parentNode = dom;
+		while (token.hasMoreTokens()) {
+			String onePath = token.nextToken();
+
+			while ((iterNode != null) && isExist) {
+				String path = iterNode.getNamespaceURI();
+				String prefix = iterNode.getPrefix();
+				if (prefix == null) {
+					path += "@" + iterNode.getLocalName();
+				} else {
+					path += "@" + prefix + ":" + iterNode.getLocalName();
+				}
+				if (!path.equals(onePath)) {
+					//not found, then get the next sibling to find such path node
+					iterNode = iterNode.getNextSibling();
+				} else {
+					//found, then get the child nodes to find the next path node
+					parentNode = iterNode;
+					iterNode = iterNode.getFirstChild();
+					break;
+				}
+			}
+
+			if (iterNode == null) {
+				//should new the element since the current path node
+				if (isExist) {
+					isExist = false;
+				}
+				StringTokenizer token2 = new StringTokenizer(onePath, "@");
+				OdfElement newElement = dom.createElementNS(OdfName.newName(token2.nextToken(), token2.nextToken()));
+				parentNode.appendChild(newElement);
+				parentNode = newElement;
+			}
+		}
+		parentNode.appendChild(cloneStyleEle);
+	}
+
+	//The returned string is a path from the top of the dom tree to the specified element
+	//and the path is split by "/" between each node
+	private String getElementPath(OdfElement styleEle) {
+		String path = "";
+		Node parentNode = styleEle.getParentNode();
+		while (!(parentNode instanceof OdfFileDom)) {
+			String qname = null;
+			String prefix = parentNode.getPrefix();
+			if (prefix == null) {
+				qname = parentNode.getLocalName();
+			} else {
+				qname = prefix + ":" + parentNode.getLocalName();
+			}
+			path = parentNode.getNamespaceURI() + "@" + qname + "/" + path;
+			parentNode = parentNode.getParentNode();
+		}
+		return path;
+	}
+
+	//change the element referred oldStyleName to the new name
+	//if true then set newStyleName attribute value successfully
+	//if false means that the newStyleName value is not conform to the ODF spec, so do not modify the oldStyleName
+	private boolean changeStyleRefName(List<OdfElement> list, String oldStyleName, String newStyleName) {
+		boolean rtn = false;
+		for (int index = 0; index < list.size(); index++) {
+			OdfElement element = list.get(index);
+			NamedNodeMap attributes = element.getAttributes();
+
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node item = attributes.item(i);
+					String value = item.getNodeValue();
+					if (oldStyleName.equals(value)) {
+						try {
+							item.setNodeValue(newStyleName);
+							rtn = true;
+							break;
+						} catch (IllegalArgumentException e) {
+							return false;
+						}
+					}
+				}
+			}
+		}
+		return rtn;
+	}
+
+	//check if the element contains the referred styleName
+	private boolean isStyleNameRefExist(Node element, String styleName, boolean deep) {
+		NamedNodeMap attributes = element.getAttributes();
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Node item = attributes.item(i);
+				if (item.getNodeValue().equals(styleName)
+						&& !item.getNodeName().equals("style:name")) //this is style definition, not reference
+				{
+					return true;
+				}
+			}
+		}
+		if (deep) {
+			Node childNode = element.getFirstChild();
+			while (childNode != null) {
+				if (!isStyleNameRefExist(childNode, styleName, true)) {
+					childNode = childNode.getNextSibling();
+				} else {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	//check if nodeList contains the node that "style:name" attribute has the same value with styleName
+	//Note: nodeList here is all the style definition list
+	private OdfElement isStyleNameExist(NodeList nodeList,
+			String styleName) {
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			OdfElement element = (OdfElement) nodeList.item(i);
+			String name = element.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "name");
+			if (name.equals(styleName)) //return true;
+			{
+				return element;
+			}
+		}
+		//return false;
+		return null;
+	}
+
+	private String makeUniqueName() {
+		return String.format("a%06x", (int) (Math.random() * 0xffffff));
+	}
+
+	/**
+	 * Make a content copy of the specified element, 
+	 * and the returned element should have the specified ownerDocument.
+	 * @param element	The element that need to be copied
+	 * @param dom		The specified DOM tree that the returned element belong to
+	 * @param deep		If true, recursively clone the subtree under the element,
+	 * 					false, only clone the element itself
+	 * @return	Returns a duplicated element which is not in the DOM tree with the specified element
+	 */
+	public Node cloneForeignElement(Node element, OdfFileDom dom, boolean deep) {
+		checkAllSlideName();
+		if (element instanceof OdfElement) {
+			OdfElement cloneElement = dom.createElementNS(((OdfElement) element).getOdfName());
+
+			NamedNodeMap attributes = element.getAttributes();
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node item = attributes.item(i);
+					String qname = null;
+					String prefix = item.getPrefix();
+					if (prefix == null) {
+						qname = item.getLocalName();
+					} else {
+						qname = prefix + ":" + item.getLocalName();
+					}
+
+					cloneElement.setAttributeNS(item.getNamespaceURI(), qname, item.getNodeValue());
+				}
+			}
+
+			if (deep) {
+				Node childNode = element.getFirstChild();
+				while (childNode != null) {
+					cloneElement.appendChild(cloneForeignElement(childNode, dom, true));
+					childNode = childNode.getNextSibling();
+				}
+			}
+
+			return cloneElement;
+		} else {
+			return dom.createTextNode(element.getNodeValue());
+		}
+
+	}
+
+	/**
+	 * New a slide at the specified position with the specified name,
+	 * and use the specified slide template.
+	 * See <code>OdfDrawPage.SlideLayout</code>.
+	 * <p>
+	 * If index is invalid, such as larger than the current document 
+	 * slide number or is negative,
+	 * then append the new slide at the end of the document.
+	 * <p>
+	 * The slide name can be null.
+	 * @param index		the new slide position
+	 * @param name		the new slide name
+	 * @param slideLayout	the new slide template
+	 * @return	the new slide which locate at the specified position 
+	 * with the specified name and apply the specified slide template.
+	 * If slideLayout is null, then use the default slide template which is a blank slide.
+	 * <p>
+	 * Throw IndexOutOfBoundsException if index is out of the presentation document slide count.
+	 */
+	public OdfSlide newSlide(int index, String name, OdfSlide.SlideLayout slideLayout) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((index < 0) || (index > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call newSlide method.");
+		}
+		//if insert page at the beginning of the document,
+		//get the next page style as the new page style
+		//else get the previous page style as the new page style
+		DrawPageElement refStyleSlide = null;
+		int refSlideIndex = 0;
+		if (index > 0) {
+			refSlideIndex = index - 1;
+		}
+		refStyleSlide = (DrawPageElement) slideList.item(refSlideIndex);
+		String masterPageStyleName = "Default";
+		String masterName = refStyleSlide.getDrawMasterPageNameAttribute();
+		if (masterName != null) {
+			masterPageStyleName = masterName;
+		}
+		DrawPageElement newSlideElement = contentRoot.newDrawPageElement(masterPageStyleName);
+		newSlideElement.setDrawNameAttribute(name);
+		String drawStyleName = refStyleSlide.getDrawStyleNameAttribute();
+		if (drawStyleName != null) {
+			newSlideElement.setDrawStyleNameAttribute(drawStyleName);
+		}
+		String pageLayoutName = refStyleSlide.getPresentationPresentationPageLayoutNameAttribute();
+		if (pageLayoutName != null) {
+			newSlideElement.setPresentationPresentationPageLayoutNameAttribute(pageLayoutName);
+		}
+		setSlideLayout(newSlideElement, slideLayout);
+		//insert notes page
+		NodeList noteNodes = refStyleSlide.getElementsByTagNameNS(OdfDocumentNamespace.PRESENTATION.getUri(), "notes");
+		if (noteNodes.getLength() > 0) {
+			PresentationNotesElement notePage = (PresentationNotesElement) noteNodes.item(0);
+			PresentationNotesElement cloneNotePage = (PresentationNotesElement) notePage.cloneNode(true);
+			newSlideElement.appendChild(cloneNotePage);
+		}
+		if (index < slideCount) {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(index);
+			contentRoot.insertBefore(newSlideElement, refSlide);
+		}
+		adjustNotePageNumber(index);
+		//in case that the appended new slide have the same name with the original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+		return OdfSlide.getInstance(newSlideElement);
+	}
+
+	//when insert a slide, the note page for this slide is also inserted.
+	//note page refer the slide index in order to show the corresponding slide notes view
+	//this function is used to adjust note page referred slide index since startIndex
+	//when the slide at startIndex has been delete or insert
+	private void adjustNotePageNumber(int startIndex) {
+		try {
+			OfficePresentationElement contentRoot = getContentRoot();
+			NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+			for (int i = startIndex; i < getSlideCount(); i++) {
+				DrawPageElement page = (DrawPageElement) slideList.item(i);
+				NodeList noteNodes = page.getElementsByTagNameNS(OdfDocumentNamespace.PRESENTATION.getUri(), "notes");
+				if (noteNodes.getLength() > 0) {
+					PresentationNotesElement notePage = (PresentationNotesElement) noteNodes.item(0);
+					NodeList thumbnailList = notePage.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page-thumbnail");
+					if (thumbnailList.getLength() > 0) {
+						DrawPageThumbnailElement thumbnail = (DrawPageThumbnailElement) thumbnailList.item(0);
+						thumbnail.setDrawPageNumberAttribute(i + 1);
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	//covered element
+	//<presentation:notes>, <draw:page-thumbnail>, <draw:frame>
+	//<style:presentation-page-layout>
+	private void setSlideLayout(DrawPageElement page,
+			OdfSlide.SlideLayout slideLayout) {
+		if (slideLayout == null) {
+			slideLayout = OdfSlide.SlideLayout.BLANK;
+		}
+		OdfOfficeStyles styles = getOrCreateDocumentStyles();
+		String layoutName;
+
+		if (slideLayout.toString().equals(OdfSlide.SlideLayout.TITLE_ONLY.toString())) {
+			layoutName = "AL1T" + makeUniqueName();
+			try {
+				StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+				layout.newPresentationPlaceholderElement("title", "2.058cm", "1.743cm", "23.91cm", "3.507cm");
+			} catch (Exception e1) {
+				Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e1);
+			}
+			page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+			DrawFrameElement frame1 = page.newDrawFrameElement();
+			frame1.setProperty(StyleGraphicPropertiesElement.StyleShadow, "true");
+			frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+			frame1.setDrawLayerAttribute("layout");
+			frame1.setSvgHeightAttribute("3.006cm");
+			frame1.setSvgWidthAttribute("24.299cm");
+			frame1.setSvgXAttribute("1.35cm");
+			frame1.setSvgYAttribute("0.717cm");
+			frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+			frame1.setPresentationPlaceholderAttribute(true);
+			frame1.newDrawTextBoxElement();
+		} else if (slideLayout.toString().equals(OdfSlide.SlideLayout.TITLE_OUTLINE.toString())) {
+			layoutName = makeUniqueName();
+			try {
+				styles = super.getStylesDom().getOfficeStyles();
+				if (styles == null) {
+					styles = super.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+				}
+				StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+				layout.newPresentationPlaceholderElement("title", "2.058cm", "1.743cm", "23.91cm", "3.507cm");
+				layout.newPresentationPlaceholderElement("outline", "2.058cm", "1.743cm", "23.91cm", "3.507cm");
+
+			} catch (Exception e1) {
+				Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e1);
+			}
+			page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+
+			DrawFrameElement frame1 = page.newDrawFrameElement();
+			frame1.setProperty(StyleGraphicPropertiesElement.StyleShadow, "true");
+			frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+			frame1.setDrawLayerAttribute("layout");
+			frame1.setSvgHeightAttribute("3.006cm");
+			frame1.setSvgWidthAttribute("24.299cm");
+			frame1.setSvgXAttribute("1.35cm");
+			frame1.setSvgYAttribute("0.717cm");
+			frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+			frame1.setPresentationPlaceholderAttribute(true);
+			frame1.newDrawTextBoxElement();
+			DrawFrameElement frame2 = page.newDrawFrameElement();
+
+			frame2.setProperty(StyleGraphicPropertiesElement.FillColor, "#ffffff");
+			frame2.setProperty(StyleGraphicPropertiesElement.MinHeight, "13.114");
+			frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+
+			frame2.setDrawLayerAttribute("layout");
+			frame2.setSvgHeightAttribute("11.629cm");
+			frame2.setSvgWidthAttribute("24.199cm");
+			frame2.setSvgXAttribute("1.35cm");
+			frame2.setSvgYAttribute("4.337cm");
+			frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+			frame2.setPresentationPlaceholderAttribute(true);
+			frame2.newDrawTextBoxElement();
+		} else if (slideLayout.toString().equals(OdfSlide.SlideLayout.TITLE_PLUS_TEXT.toString())) {
+			layoutName = makeUniqueName();
+			try {
+				styles = super.getStylesDom().getOfficeStyles();
+				if (styles == null) {
+					styles = super.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+				}
+				StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+				layout.newPresentationPlaceholderElement("title", "2.058cm", "1.743cm", "23.91cm", "1.743cm");
+				layout.newPresentationPlaceholderElement("subtitle", "2.058cm", "5.838cm", "23.91cm", "13.23cm");
+
+			} catch (Exception e1) {
+				Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e1);
+			}
+			page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+			DrawFrameElement frame1 = page.newDrawFrameElement();
+			frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+			frame1.setDrawLayerAttribute("layout");
+			frame1.setSvgHeightAttribute("3.006cm");
+			frame1.setSvgWidthAttribute("24.299cm");
+			frame1.setSvgXAttribute("1.35cm");
+			frame1.setSvgYAttribute("0.717cm");
+			frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+			frame1.setPresentationPlaceholderAttribute(true);
+			frame1.newDrawTextBoxElement();
+			DrawFrameElement frame2 = page.newDrawFrameElement();
+			frame2.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame2.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+
+			frame2.setDrawLayerAttribute("layout");
+			frame2.setSvgHeightAttribute("11.88cm");
+			frame2.setSvgWidthAttribute("24.299cm");
+			frame2.setSvgXAttribute("1.35cm");
+			frame2.setSvgYAttribute("4.712cm");
+			frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.SUBTITLE.toString());
+			frame2.setPresentationPlaceholderAttribute(true);
+			frame2.newDrawTextBoxElement();
+
+		} else if (slideLayout.toString().equals(OdfSlide.SlideLayout.TITLE_PLUS_2_TEXT_BLOCK.toString())) {
+
+			layoutName = makeUniqueName();
+			try {
+				styles = super.getStylesDom().getOfficeStyles();
+				if (styles == null) {
+					styles = super.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+				}
+				StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+				layout.newPresentationPlaceholderElement("outline", "2.058cm", "1.743cm", "23.91cm", "1.743cm");
+				layout.newPresentationPlaceholderElement("outline", "1.35cm", "4.212cm", "11.857cm", "11.629cm");
+				layout.newPresentationPlaceholderElement("outline", "4.212cm", "13.8cm", "11.857cm", "11.629cm");
+
+			} catch (Exception e1) {
+				Logger.getLogger(OdfPresentationDocument.class.getName()).log(Level.SEVERE, null, e1);
+			}
+
+			DrawFrameElement frame1 = page.newDrawFrameElement();
+			frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+			frame1.setDrawLayerAttribute("layout");
+			frame1.setSvgHeightAttribute("3.006cm");
+			frame1.setSvgWidthAttribute("24.299cm");
+			frame1.setSvgXAttribute("1.35cm");
+			frame1.setSvgYAttribute("0.717cm");
+			frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+			frame1.setPresentationPlaceholderAttribute(true);
+			frame1.newDrawTextBoxElement();
+			DrawFrameElement frame2 = page.newDrawFrameElement();
+			frame2.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame2.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+
+			frame2.setDrawLayerAttribute("layout");
+			frame2.setSvgHeightAttribute("11.629cm");
+			frame2.setSvgWidthAttribute("11.857cm");
+			frame2.setSvgXAttribute("1.35cm");
+			frame2.setSvgYAttribute("4.212cm");
+			frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+			frame2.setPresentationPlaceholderAttribute(true);
+			frame2.newDrawTextBoxElement();
+			DrawFrameElement frame3 = page.newDrawFrameElement();
+			frame3.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+			frame3.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+			frame3.setPresentationStyleNameAttribute(frame3.getStyleName());
+
+			frame3.setDrawLayerAttribute("layout");
+			frame3.setSvgHeightAttribute("11.62cm");
+			frame3.setSvgWidthAttribute("11.857cm");
+			frame3.setSvgXAttribute("13.8cm");
+			frame3.setSvgYAttribute("4.212cm");
+			frame3.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+			frame3.setPresentationPlaceholderAttribute(true);
+			frame3.newDrawTextBoxElement();
+
+			page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfSpreadsheetDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfSpreadsheetDocument.java
new file mode 100644
index 0000000..e11f7c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfSpreadsheetDocument.java
@@ -0,0 +1,178 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.SAXException;
+
+/**
+ * This class represents an empty ODF spreadsheet document.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.SpreadsheetDocument} in Simple API.
+ */
+public class OdfSpreadsheetDocument extends OdfDocument {
+
+	private static final String EMPTY_SPREADSHEET_DOCUMENT_PATH = "/OdfSpreadsheetDocument.ods";
+	static final Resource EMPTY_SPREADSHEET_DOCUMENT_RESOURCE = new Resource(EMPTY_SPREADSHEET_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of OdfSpreadsheetDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		SPREADSHEET(OdfDocument.OdfMediaType.SPREADSHEET),
+		SPREADSHEET_TEMPLATE(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+		private final OdfDocument.OdfMediaType mMediaType;
+
+		OdfMediaType(OdfDocument.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfDocument.OdfMediaType getOdfMediaType(String mediaType) {
+			return OdfDocument.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty spreadsheet document.
+	 * @return ODF spreadsheet document based on a default template*
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfSpreadsheetDocument newSpreadsheetDocument() throws Exception {
+		return (OdfSpreadsheetDocument) OdfDocument.loadTemplate(EMPTY_SPREADSHEET_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.SPREADSHEET);
+	}
+
+	/**
+	 * Creates an empty spreadsheet template.
+	 * @return ODF spreadsheet template based on a default
+	 * @throws java.lang.Exception - if the template could not be created
+	 */
+	public static OdfSpreadsheetDocument newSpreadsheetTemplateDocument() throws Exception {
+		OdfSpreadsheetDocument doc = (OdfSpreadsheetDocument) OdfDocument.loadTemplate(EMPTY_SPREADSHEET_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+		doc.changeMode(OdfMediaType.SPREADSHEET_TEMPLATE);
+		return doc;
+	}
+
+	/** To avoid data duplication a new document is only created, if not already opened.
+	 * A document is cached by this constructor using the internalpath as key. */
+	protected OdfSpreadsheetDocument(OdfPackage pkg, String internalPath, OdfSpreadsheetDocument.OdfMediaType odfMediaType) throws SAXException {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Creates an OdfSpreadsheetDocument from the OpenDocument provided by a resource Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfSpreadsheetDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 * 
+	 * <p>If the resource stream is not a ODF spreadsheet document, ClassCastException might be thrown.</p>
+	 *
+	 * @param inputStream - the InputStream of the ODF spreadsheet document.
+	 * @return the spreadsheet document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfSpreadsheetDocument loadDocument(InputStream inputStream) throws Exception {
+        return (OdfSpreadsheetDocument) OdfDocument.loadDocument(inputStream);
+    }
+	
+	/**
+	 * Loads an OdfSpreadsheetDocument from the provided path.
+	 *
+	 * <p>OdfSpreadsheetDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfSpreadsheetDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF spreadsheet document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the spreadsheet document from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfSpreadsheetDocument loadDocument(String documentPath) throws Exception {
+		return (OdfSpreadsheetDocument)OdfDocument.loadDocument(documentPath);
+	}
+	
+	/**
+	 * Creates an OdfSpreadsheetDocument from the OpenDocument provided by a File.
+	 *
+	 * <p>OdfSpreadsheetDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfSpreadsheetDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF spreadsheet document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param file - a file representing the ODF spreadsheet document.
+	 * @return the spreadsheet document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfSpreadsheetDocument loadDocument(File file) throws Exception {
+		return (OdfSpreadsheetDocument)OdfDocument.loadDocument(file);
+	}
+	
+	/**
+	 * Get the content root of a spreadsheet document.
+	 *
+	 * @return content root, representing the office:spreadsheet tag
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeSpreadsheetElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeSpreadsheetElement.class);
+	}
+
+	/**
+	 * Changes the document to the given mediatype.
+	 * This method can only be used to convert a document to a related mediatype, e.g. template.
+	 *
+	 * @param mediaType the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfTextDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfTextDocument.java
new file mode 100644
index 0000000..664246f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/OdfTextDocument.java
@@ -0,0 +1,257 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+/**
+ * This class represents an empty ODF text document.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.TextDocument} in Simple API.
+ */
+public class OdfTextDocument extends OdfDocument {
+
+	private static final String EMPTY_TEXT_DOCUMENT_PATH = "/OdfTextDocument.odt";
+	static final Resource EMPTY_TEXT_DOCUMENT_RESOURCE = new Resource(EMPTY_TEXT_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of OdfSpreadsheetDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		TEXT(OdfDocument.OdfMediaType.TEXT),
+		TEXT_TEMPLATE(OdfDocument.OdfMediaType.TEXT_TEMPLATE),
+		TEXT_MASTER(OdfDocument.OdfMediaType.TEXT_MASTER),
+		TEXT_WEB(OdfDocument.OdfMediaType.TEXT_WEB);
+		private final OdfDocument.OdfMediaType mMediaType;
+
+		OdfMediaType(OdfDocument.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 *
+		 * @param mediaType string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and the suffix
+		 */
+		public static OdfDocument.OdfMediaType getOdfMediaType(String mediaType) {
+			return OdfDocument.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty text document.
+	 * @return ODF text document based on a default template
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfTextDocument newTextDocument() throws Exception {
+		return (OdfTextDocument) OdfDocument.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.TEXT);
+	}
+
+	/**
+	 * Creates an empty text document.
+	 * @return ODF text document based on a default template
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfTextDocument newTextDocument(OdfTextDocument.OdfMediaType mimeType) throws Exception {
+		return (OdfTextDocument) OdfDocument.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.TEXT);
+	}
+
+
+	/**
+	 * Creates an empty text template.
+	 * @return ODF text template based on a default
+	 * @throws java.lang.Exception - if the template could not be created
+	 */
+	public static OdfTextDocument newTextTemplateDocument() throws Exception {
+		return  (OdfTextDocument) OdfDocument.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.TEXT_TEMPLATE);
+	}
+
+	/**
+	 * Creates an empty text master document.
+	 * @return ODF text master based on a default
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfTextDocument newTextMasterDocument() throws Exception {
+		OdfTextDocument doc = (OdfTextDocument) OdfDocument.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.TEXT_MASTER);
+		doc.changeMode(OdfMediaType.TEXT_MASTER);
+		return doc;
+	}
+
+	/**
+	 * Creates an empty text web.
+	 * @return ODF text web based on a default
+	 * @throws java.lang.Exception - if the document could not be created
+	 */
+	public static OdfTextDocument newTextWebDocument() throws Exception {
+		OdfTextDocument doc = (OdfTextDocument) OdfDocument.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, OdfDocument.OdfMediaType.TEXT_WEB);
+		doc.changeMode(OdfMediaType.TEXT_WEB);
+		return doc;
+	}
+
+	/**
+	 * Creates an OdfTextDocument from the OpenDocument provided by a resource Stream.
+	 *
+	 * <p>Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfTextDocument, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods.
+	 * An advantage of caching is that there are no problems overwriting
+	 * an input file.</p>
+	 * 
+	 * <p>If the resource stream is not a ODF text document, ClassCastException might be thrown.</p>
+	 *
+	 * @param inputStream - the InputStream of the ODF text document.
+	 * @return the text document created from the given InputStream
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfTextDocument loadDocument(InputStream inputStream) throws Exception {
+        return (OdfTextDocument) OdfDocument.loadDocument(inputStream);
+    }
+	
+	/**
+	 * Loads an OdfTextDocument from the provided path.
+	 *
+	 * <p>OdfTextDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfTextDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF text document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the text document from the given path
+	 *		  or NULL if the media type is not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfTextDocument loadDocument(String documentPath) throws Exception {
+		return (OdfTextDocument)OdfDocument.loadDocument(documentPath);
+	}
+	
+	/**
+	 * Creates an OdfTextDocument from the OpenDocument provided by a File.
+	 *
+	 * <p>OdfTextDocument relies on the file being available for read access over
+	 * the whole lifecycle of OdfTextDocument.</p>
+	 *
+	 * <p>If the resource stream is not a ODF text document, ClassCastException might be thrown.</p>
+	 * 
+	 * @param file - a file representing the ODF text document.
+	 * @return the text document created from the given File
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfTextDocument loadDocument(File file) throws Exception {
+		return (OdfTextDocument)OdfDocument.loadDocument(file);
+	}
+	
+	/** To avoid data duplication a new document is only created, if not already opened.
+	 * A document is cached by this constructor using the internalpath as key. */
+	protected OdfTextDocument(OdfPackage pkg, String internalPath, OdfTextDocument.OdfMediaType odfMediaType) throws SAXException {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Get the content root of a text document. Start here to get or create new
+	 * elements of a text document like paragraphs, headings, tables or lists.
+	 *
+	 * @return content root, representing the office:text tag
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeTextElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeTextElement.class);
+	}
+	/**
+	 * Creates a new paragraph and append text
+	 *
+	 * @param text
+	 * @return the new paragraph
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	public OdfTextParagraph newParagraph(String text) throws Exception {
+		OdfTextParagraph para = newParagraph();
+		para.addContent(text);
+		return para;
+	}
+
+	/**
+	 * Creates a new paragraph
+	 *
+	 * @return The new paragraph
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	public OdfTextParagraph newParagraph() throws Exception {
+		OfficeTextElement odfText = getContentRoot();
+		return (OdfTextParagraph) odfText.newTextPElement();
+	}
+
+	/**
+	 * Append text to the end of a text document.
+	 * If there is no paragraph at the end of a document, a new one will be created.
+	 *
+	 * @param text initial text for the paragraph.
+	 * @return The paragraph at the end of the text document, where the text has been added to.
+	 * @throws Exception if the file DOM could not be created.
+	 */
+	public OdfTextParagraph addText(String text) throws Exception {
+		OfficeTextElement odfText = getContentRoot();
+		Node n = odfText.getLastChild();
+		OdfTextParagraph para;
+		if (OdfTextParagraph.class.isInstance(n)) {
+			para = (OdfTextParagraph) n;
+		} else {
+			para = newParagraph();
+		}
+		para.addContent(text);
+		return para;
+	}
+
+	/**
+	 * Changes the document to the given mediatype.
+	 * This method can only be used to convert a document to a related mediatype, e.g. template.
+	 *
+	 * @param mediaType the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/presentation/OdfPresentationNotes.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/presentation/OdfPresentationNotes.java
new file mode 100644
index 0000000..1046547
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/presentation/OdfPresentationNotes.java
@@ -0,0 +1,92 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.doc.presentation;
+
+import java.util.Hashtable;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawTextBoxElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.w3c.dom.NodeList;
+
+/**
+ * Convenient functionality for the parent ODF OpenDocument element
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.presentation.Notes} in Simple API.
+ */
+public class OdfPresentationNotes
+{
+	PresentationNotesElement maNoteElement;
+	private static Hashtable<PresentationNotesElement, OdfPresentationNotes> maNotesRepository = 
+		new Hashtable<PresentationNotesElement, OdfPresentationNotes>();	
+	
+	private OdfPresentationNotes( PresentationNotesElement noteElement )
+	{
+		maNoteElement = noteElement;
+	}
+	
+	/**
+	 * Return an instance of <code>PresentationNotesElement</code> which represents presentation notes page feature.
+	 * 
+	 * @return an instance of <code>PresentationNotesElement</code>
+	 */
+	public PresentationNotesElement getOdfElement()
+	{
+		return maNoteElement;
+	}
+	/**
+	 * Get a presentation notes page instance by an instance of <code>PresentationNotesElement</code>.
+	 * 
+	 * @param noteElement	an instance of <code>PresentationNotesElement</code>
+	 * @return an instance of <code>OdfPresentationNotes</code> that can represent <code>PresentationNotesElement</code>
+	 */
+	public static OdfPresentationNotes getInstance(PresentationNotesElement noteElement)
+	{
+		if (maNotesRepository.containsKey(noteElement))
+			return maNotesRepository.get(noteElement);
+		else {
+			OdfPresentationNotes newNotes = new OdfPresentationNotes(noteElement);
+			maNotesRepository.put(noteElement, newNotes);
+			return newNotes;
+		}	
+	}
+	
+	/**
+	 * insert some text to the notes page
+	 * @param text	the text that need to insert in the notes page
+	 */
+	public void addText(String text){
+		NodeList frameList = maNoteElement.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "frame");
+		if(frameList.getLength() > 0){
+			DrawFrameElement frame = (DrawFrameElement)frameList.item(0);
+			NodeList textBoxList = frame.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "text-box");
+			if(textBoxList.getLength() > 0){
+				DrawTextBoxElement textBox = (DrawTextBoxElement)textBoxList.item(0);
+				TextPElement newPara = textBox.newTextPElement();
+				newPara.setTextContent(text);
+			}
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/presentation/OdfSlide.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/presentation/OdfSlide.java
new file mode 100644
index 0000000..9c95b80
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/presentation/OdfSlide.java
@@ -0,0 +1,230 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.presentation;
+
+import java.util.Hashtable;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.w3c.dom.NodeList;
+
+/**
+ * <code>OdfSlide</code> represents the presentation slide feature of the ODF document.
+ * <code>OdfSlide</code> provides methods to get the slide index,get the content of the current slide, etc.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.presentation.Slide} in Simple API.
+ */
+public class OdfSlide {
+
+	DrawPageElement maSlideElement;
+	private static Hashtable<DrawPageElement, OdfSlide> maSlideRepository =
+			new Hashtable<DrawPageElement, OdfSlide>();
+
+	private OdfSlide(DrawPageElement pageElement) {
+		maSlideElement = pageElement;
+	}
+
+	/**
+	 * Get a presentation slide instance by an instance of <code>DrawPageElement</code>.
+	 * 
+	 * @param pageElement	an instance of <code>DrawPageElement</code>
+	 * @return an instance of <code>OdfSlide</code> that can represent <code>pageElement</code>
+	 */
+	public static OdfSlide getInstance(DrawPageElement pageElement) {
+		if (maSlideRepository.containsKey(pageElement)) {
+			return maSlideRepository.get(pageElement);
+		} else {
+			OdfSlide newSlide = new OdfSlide(pageElement);
+			maSlideRepository.put(pageElement, newSlide);
+			return newSlide;
+		}
+	}
+
+	/**
+	 * Return an instance of <code>DrawPageElement</code> which represents presentation slide feature.
+	 * 
+	 * @return an instance of <code>DrawPageElement</code>
+	 */
+	public DrawPageElement getOdfElement() {
+		return maSlideElement;
+	}
+
+	/**
+	 * Get the current slide index in the owner document.
+	 * @return the slide index in the owner document
+	 * <p>
+	 * -1, if the odf element which can represent this slide is not in the document DOM tree
+	 */
+	public int getSlideIndex() {
+		OdfFileDom contentDom = (OdfFileDom) maSlideElement.getOwnerDocument();
+		NodeList slideNodes = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideEle = (DrawPageElement) slideNodes.item(i);
+			if (slideEle == maSlideElement)//should not equals here, see OdfElement.equals(Object obj)
+			{
+				return i;
+			}
+		}
+		return -1;
+	}
+
+	/**
+	 * Get the current slide name.
+	 * <p>
+	 * If the "draw:name" attribute is not present there,
+	 * create an unique name for this slide
+	 * @return the name of the current slide
+	 */
+	public String getSlideName() {
+		String slideName = maSlideElement.getDrawNameAttribute();
+		if (slideName == null) {
+			slideName = makeUniqueSlideName();
+			maSlideElement.setDrawNameAttribute(slideName);
+		}
+		return slideName;
+	}
+
+	/**
+	 * Set the current slide name. 
+	 * <p>
+	 * It must be unique slide name in the current presentation.
+	 * If not, an IllegalArgumentException will be thrown.
+	 * If the given name is null,  an IllegalArgumentException will also be thrown.
+	 * @param name	the new name of the current slide
+	 * @throws IllegalArgumentException if the given name is null or it is not unique in the current presentation.
+	 */
+	public void setSlideName(String name) {
+		if (name == null) {
+			throw new IllegalArgumentException("slide name is null is not accepted in the presentation document");
+		}
+		//check if name is unique in this presentation
+		OdfFileDom contentDom = (OdfFileDom) maSlideElement.getOwnerDocument();
+		NodeList slideNodes = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideEle = (DrawPageElement) slideNodes.item(i);
+			OdfSlide slide = OdfSlide.getInstance(slideEle);
+			String slideName = slide.getSlideName();
+			if (slideName.equals(name)) {
+				throw new IllegalArgumentException("the given slide name is already exist in the current presentation document");
+			}
+		}
+		maSlideElement.setDrawNameAttribute(name);
+	}
+
+	/**
+	 * Get the Notes page of this slide
+	 * @return the instance of <code>OdfPresentationNotes</code> which represent the notes page of the current slide
+	 */
+	public OdfPresentationNotes getNotesPage() {
+		NodeList notesList = maSlideElement.getElementsByTagNameNS(OdfDocumentNamespace.PRESENTATION.getUri(), "notes");
+		if (notesList.getLength() > 0) {
+			PresentationNotesElement noteEle = (PresentationNotesElement) notesList.item(0);
+			return OdfPresentationNotes.getInstance(noteEle);
+
+		}
+		return null;
+	}
+
+	private String makeUniqueSlideName() {
+		int index = getSlideIndex();
+		String slideName = "page" + (index + 1) + "-" + String.format("a%06x", (int) (Math.random() * 0xffffff));
+		return slideName;
+	}
+
+	/** 
+	 * A slide layout is a slide with some predefine placeholder.
+	 *
+	 * we define some template layout as below:
+	 *
+	 * "blank" template is a slide without any filled element,
+	 *
+	 * "title_only" template is a slide with a title,
+	 *
+	 * "title_outline" template is a slide with a title and an outline block,
+	 *
+	 * "title_text" template is a slide with a title and a text block,
+	 *
+	 * "title_two_text_block" template is a slide with a title two text blocks.
+	 */
+	public enum SlideLayout {
+
+		/**
+		 * Blank,  a blank presentation
+		 */
+		BLANK("blank"),
+		/**
+		 * Title_only, the presentation with title only
+		 */
+		TITLE_ONLY("title_only"),
+		/**
+		 * Title_outline, the presentation with outline
+		 */
+		TITLE_OUTLINE("title_outline"),
+		/**
+		 * Title_text, the presentation with title and one text block
+		 */
+		TITLE_PLUS_TEXT("title_text"),
+		/**
+		 * title_two_text_block, the presentation with title and two text blocks
+		 */
+		TITLE_PLUS_2_TEXT_BLOCK("title_two_text_block");
+		private String mValue;
+
+		SlideLayout(String aValue) {
+			mValue = aValue;
+		}
+
+		/**
+		 * Return the slide template type value.
+		 * @return   the template type value
+		 */
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		/**
+		 * Return the name of the template slide type.
+		 * @param aEnum    a <code>SlideLayout</code>
+		 * @return         the name of slide template type
+		 */
+		public static String toString(SlideLayout aEnum) {
+			return aEnum.toString();
+		}
+
+		/**
+		 * Return a template slide type.
+		 * @param aString   the name of the slide template type
+		 * @return       a <code>SlideLayout</code>
+		 */
+		public static SlideLayout enumValueOf(String aString) {
+			for (SlideLayout aIter : values()) {
+				if (aString.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return null;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/DomNodeList.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/DomNodeList.java
new file mode 100644
index 0000000..917ded8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/DomNodeList.java
@@ -0,0 +1,47 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.util.AbstractList;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+class DomNodeList extends AbstractList<Node> {
+    
+    private NodeList m_nodeList;
+    
+    /** Creates a new instance of NodeList */
+    public DomNodeList(NodeList list) {
+        m_nodeList = list;
+    }
+
+    @Override
+	public int size() {
+        return m_nodeList.getLength();
+    }
+
+    @Override
+	public Node get(int index) {
+        return m_nodeList.item(index);
+    }    
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java
new file mode 100644
index 0000000..058bb0c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java
@@ -0,0 +1,2397 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfDocument.OdfMediaType;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAlignAttribute;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableProperties;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * OdfTable represents the table feature in ODF spreadsheet and text documents.
+ * <p>
+ * OdfTable provides methods to get/add/delete/modify table column/row/cell.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.table.Table} in Simple API.
+ */
+public class OdfTable {
+
+	TableTableElement mTableElement;
+	protected OdfDocument mDocument;
+	protected boolean mIsSpreadsheet;
+	protected boolean mIsCellStyleInheritance = true;
+	private static final int DEFAULT_ROW_COUNT = 2;
+	private static final int DEFAULT_COLUMN_COUNT = 5;
+	private static final double DEFAULT_TABLE_WIDTH = 6;
+	private static final int DEFAULT_REL_TABLE_WIDTH = 65535;
+	private static final String DEFAULT_TABLE_ALIGN = "margins";
+	// TODO: should save seperately for different dom tree
+	static IdentityHashMap<TableTableElement, OdfTable> mTableRepository =
+			new IdentityHashMap<TableTableElement, OdfTable>();
+	IdentityHashMap<TableTableCellElementBase, Vector<OdfTableCell>> mCellRepository =
+			new IdentityHashMap<TableTableCellElementBase, Vector<OdfTableCell>>();
+	IdentityHashMap<TableTableRowElement, Vector<OdfTableRow>> mRowRepository =
+			new IdentityHashMap<TableTableRowElement, Vector<OdfTableRow>>();
+	IdentityHashMap<TableTableColumnElement, Vector<OdfTableColumn>> mColumnRepository =
+			new IdentityHashMap<TableTableColumnElement, Vector<OdfTableColumn>>();
+
+	private OdfTable(TableTableElement table) {
+		mTableElement = table;
+		mDocument = (OdfDocument) ((OdfFileDom)(table.getOwnerDocument())).getDocument();
+		if (mDocument instanceof OdfSpreadsheetDocument)
+			mIsSpreadsheet = true;
+		else mIsSpreadsheet = false;
+	}
+
+	/**
+	 * Get a table feature instance by an instance of <code>TableTableElement</code>.
+	 * 
+	 * @param odfElement	an instance of <code>TableTableElement</code>
+	 * @return an instance of <code>OdfTable</code> that can represent <code>odfElement</code>
+	 */
+	public synchronized static OdfTable getInstance(TableTableElement odfElement) {
+		if (mTableRepository.containsKey(odfElement)) {
+			return mTableRepository.get(odfElement);
+		} else {
+			OdfTable newTable = new OdfTable(odfElement);
+			mTableRepository.put(odfElement, newTable);
+			return newTable;
+		}
+	}
+
+	OdfTableCell getCellInstance(TableTableCellElementBase cell, int repeatedColIndex, int repeatedRowIndex) {
+		if (mCellRepository.containsKey(cell)) {
+			Vector<OdfTableCell> list = mCellRepository.get(cell);
+			OdfTableCell fCell = null;
+			for (int i = 0; i < list.size(); i++) {
+				if (list.get(i).getOdfElement() == cell
+						&& list.get(i).mnRepeatedColIndex == repeatedColIndex
+						&& list.get(i).mnRepeatedRowIndex == repeatedRowIndex) {
+					fCell = list.get(i);
+					break;
+				}
+			}
+			if (fCell == null) {
+				fCell = new OdfTableCell(cell, repeatedColIndex, repeatedRowIndex);
+				list.add(fCell);
+			}
+			return fCell;
+		} else {
+			OdfTableCell newCell = new OdfTableCell(cell, repeatedColIndex, repeatedRowIndex);
+			Vector<OdfTableCell> list = new Vector<OdfTableCell>();
+			list.add(newCell);
+			mCellRepository.put(cell, list);
+			return newCell;
+		}
+	}
+
+	OdfTableRow getRowInstance(TableTableRowElement row, int repeatedRowIndex) {
+		if (mRowRepository.containsKey(row)) {
+			Vector<OdfTableRow> list = mRowRepository.get(row);
+			if (list.size() <= repeatedRowIndex) {
+				list.setSize(repeatedRowIndex + 1);
+			}
+			OdfTableRow fCell = list.get(repeatedRowIndex);
+			if (fCell == null) {
+				fCell = new OdfTableRow(row, repeatedRowIndex);
+				list.set(repeatedRowIndex, fCell);
+			}
+			return fCell;
+		} else {
+			OdfTableRow newCell = new OdfTableRow(row, repeatedRowIndex);
+			int size = (repeatedRowIndex > 7) ? (repeatedRowIndex + 1) : 8;
+			Vector<OdfTableRow> list = new Vector<OdfTableRow>(size);
+			list.setSize(repeatedRowIndex + 1);
+			list.set(repeatedRowIndex, newCell);
+			mRowRepository.put(row, list);
+			return newCell;
+		}
+	}
+
+	OdfTableColumn getColumnInstance(TableTableColumnElement col, int repeatedColIndex) {
+		if (mColumnRepository.containsKey(col)) {
+			Vector<OdfTableColumn> list = mColumnRepository.get(col);
+			if (list.size() <= repeatedColIndex) {
+				list.setSize(repeatedColIndex + 1);
+			}
+			OdfTableColumn fClm = list.get(repeatedColIndex);
+			if (fClm == null) {
+				fClm = new OdfTableColumn(col, repeatedColIndex);
+				list.set(repeatedColIndex, fClm);
+			}
+			return fClm;
+		} else {
+			OdfTableColumn newCell = new OdfTableColumn(col, repeatedColIndex);
+			int size = (repeatedColIndex > 7) ? (repeatedColIndex + 1) : 8;
+			Vector<OdfTableColumn> list = new Vector<OdfTableColumn>(size);
+			list.setSize(repeatedColIndex + 1);
+			list.set(repeatedColIndex, newCell);
+			mColumnRepository.put(col, list);
+			return newCell;
+		}
+	}
+
+	TableTableColumnElement getColumnElementByIndex(int colIndex) {
+		int result = 0;
+		TableTableColumnElement columnEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableColumnElement) {
+						columnEle = (TableTableColumnElement) m;
+						if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+							result += 1;
+						} else {
+							result += columnEle.getTableNumberColumnsRepeatedAttribute();
+						}
+					}
+					if (result > colIndex) {
+						break;
+					}
+				}
+			}
+			if (n instanceof TableTableColumnElement) {
+				columnEle = (TableTableColumnElement) n;
+				if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+					result += 1;
+				} else {
+					result += columnEle.getTableNumberColumnsRepeatedAttribute();
+				}
+			}
+			if (result > colIndex) {
+				break;
+			}
+		}
+		return columnEle;
+	}
+
+	TableTableRowElement getRowElementByIndex(int rowIndex) {
+		int result = 0;
+		TableTableRowElement rowEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableRowElement) {
+						rowEle = (TableTableRowElement) m;
+						result += rowEle.getTableNumberRowsRepeatedAttribute();
+					}
+					if (result > rowIndex) {
+						break;
+					}
+				}
+			}
+			if (n instanceof TableTableRowElement) {
+				rowEle = (TableTableRowElement) n;
+				result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+			}
+			if (result > rowIndex) {
+				break;
+			}
+		}
+		return rowEle;
+	}
+
+	/**
+	 * Get the width of the table (in Millimeter).
+	 * <p>
+	 * Throw an UnsupportedOperationException if the 
+	 * table is one sheet of a spreadsheet document.
+	 * because the sheet doesn't have an attribute of table width.
+	 * 
+	 * @return the width of the current table (in Millimeter).
+	 * <p>
+	 * An UnsupportedOperationException will be thrown if the table is in the spreadsheet document.
+	 */
+	public long getWidth() {	
+		if (!mIsSpreadsheet) {
+			String sWidth = mTableElement.getProperty(OdfTableProperties.Width);
+			if(sWidth == null){
+				int colCount = getColumnCount();
+				int tableWidth = 0;
+				for(int i = 0; i<colCount;i++){
+					OdfTableColumn col = getColumnByIndex(i);
+					tableWidth += col.getWidth();
+				}
+				return tableWidth;
+			}else
+				return PositiveLength.parseLong(sWidth, Unit.MILLIMETER);
+		} else {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	/**
+	 * Set the width of the table (in Millimeter).
+	 * <p>
+	 * Throw an UnsupportedOperationException if the 
+	 * table is part of a spreadsheet document that does not allow to change the table size,
+	 * because spreadsheet is not allow user to set the table size.
+	 * 
+	 * @param width	the width that need to set (in Millimeter).
+	 * <p>
+	 * An UnsupportedOperationException will be thrown if the table is in the spreadsheet document.
+	 */
+	public void setWidth(long width) {
+		if (!mIsSpreadsheet) {
+			String sWidthMM = String.valueOf(width) + Unit.MILLIMETER.abbr();
+			String sWidthIN = PositiveLength.mapToUnit(sWidthMM, Unit.INCH);
+			mTableElement.setProperty(OdfTableProperties.Width, sWidthIN);
+			//if the width is changed, we should also change the table:align properties if it is "margins"
+			//otherwise the width seems not changed
+			String alineStyle = mTableElement.getProperty(StyleTablePropertiesElement.Align);
+			if (TableAlignAttribute.Value.MARGINS.toString().equals(alineStyle)) {
+				mTableElement.setProperty(StyleTablePropertiesElement.Align, TableAlignAttribute.Value.LEFT.toString());
+			}
+		} else {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	static void setLeftTopBorderStyleProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.BorderLeft, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderRight, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderTop, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderBottom, "0.0007in solid #000000");
+	}
+
+	static void setRightTopBorderStyleProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.Border, "0.0007in solid #000000");
+	}
+
+	static void setLeftBottomBorderStylesProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.BorderLeft, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderRight, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderTop, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderBottom, "0.0007in solid #000000");
+
+	}
+
+	static void setRightBottomBorderStylesProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.Border, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderTop, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderBottom, "0.0007in solid #000000");
+	}
+
+	private static TableTableElement createTable(OdfElement parent, int numRows, int numCols, int headerRowNumber, int headerColumnNumber) throws Exception {
+		
+		
+		// check arguments
+		if (numRows < 1 || numCols < 1 || headerRowNumber < 0
+				|| headerColumnNumber < 0 || headerRowNumber > numRows
+				|| headerColumnNumber > numCols) {
+			throw new IllegalArgumentException("Can not create table with the given parameters:\n"
+					+ "Rows " + numRows + ", Columns " + numCols + ", HeaderRows " + headerRowNumber + ", HeaderColumns " + headerColumnNumber);
+		}
+		OdfFileDom dom = (OdfFileDom) parent.getOwnerDocument();
+		OdfOfficeAutomaticStyles styles = null;
+		if(dom instanceof OdfContentDom){
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		}else if(dom instanceof OdfStylesDom){
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		
+		//1. create table element
+		TableTableElement newTEle = (TableTableElement) OdfXMLFactory.newOdfElement(dom,
+				OdfName.newName(OdfDocumentNamespace.TABLE, "table"));
+		String tablename = getUniqueTableName(parent);
+		newTEle.setTableNameAttribute(tablename);
+		//create style
+		OdfStyle tableStyle = styles.newStyle(OdfStyleFamily.Table);
+		String stylename = tableStyle.getStyleNameAttribute();
+		tableStyle.setProperty(StyleTablePropertiesElement.Width, DEFAULT_TABLE_WIDTH + "in");
+		tableStyle.setProperty(StyleTablePropertiesElement.Align, DEFAULT_TABLE_ALIGN);
+		newTEle.setStyleName(stylename);
+
+		// 2. create column elements
+		// 2.0 create column style
+		OdfStyle columnStyle = styles.newStyle(OdfStyleFamily.TableColumn);
+		String columnStylename = columnStyle.getStyleNameAttribute();
+		columnStyle.setProperty(StyleTableColumnPropertiesElement.ColumnWidth,
+				new DecimalFormat("000.0000").format(DEFAULT_TABLE_WIDTH / numCols) + "in");
+		columnStyle.setProperty(StyleTableColumnPropertiesElement.RelColumnWidth, Math.round(DEFAULT_REL_TABLE_WIDTH / numCols) + "*");
+		// 2.1 create header column elements
+		if (headerColumnNumber > 0) {
+			TableTableHeaderColumnsElement headercolumns = (TableTableHeaderColumnsElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(OdfDocumentNamespace.TABLE, "table-header-columns"));
+			TableTableColumnElement headercolumn = (TableTableColumnElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(OdfDocumentNamespace.TABLE, "table-column"));
+			headercolumn.setTableNumberColumnsRepeatedAttribute(headerColumnNumber);
+			headercolumns.appendChild(headercolumn);
+			newTEle.appendChild(headercolumns);
+			headercolumn.setStyleName(columnStylename);
+		}
+		//2.2 create common column elements
+		TableTableColumnElement columns = (TableTableColumnElement) OdfXMLFactory.newOdfElement(dom,
+				OdfName.newName(OdfDocumentNamespace.TABLE, "table-column"));
+		columns.setTableNumberColumnsRepeatedAttribute(numCols - headerColumnNumber);
+		columns.setStyleName(columnStylename);
+		newTEle.appendChild(columns);
+
+		//3. create row elements
+		//3.0 create 4 kinds of styles
+		OdfStyle lefttopStyle=null,leftbottomStyle=null,righttopStyle=null,rightbottomStyle=null;
+
+		OdfPackageDocument document = dom.getDocument();
+		if (!document.getMediaTypeString().equals(OdfMediaType.SPREADSHEET.getMediaTypeString())) {
+			lefttopStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setLeftTopBorderStyleProperties(lefttopStyle);
+	
+			leftbottomStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setLeftBottomBorderStylesProperties(leftbottomStyle);
+	
+			righttopStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setRightTopBorderStyleProperties(righttopStyle);
+	
+			rightbottomStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setRightBottomBorderStylesProperties(rightbottomStyle);
+		}
+
+		//3.1 create header row elements
+		if( headerRowNumber > 0)
+		{
+			TableTableHeaderRowsElement headerrows = (TableTableHeaderRowsElement) OdfXMLFactory.newOdfElement(dom,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-header-rows"));
+			for (int i = 0; i < headerRowNumber; i++) {
+				TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement(dom,
+						OdfName.newName(OdfDocumentNamespace.TABLE, "table-row"));
+				for (int j = 0; j < numCols; j++) {
+					TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom,
+							OdfName.newName(OdfDocumentNamespace.TABLE, "table-cell"));
+					TextPElement aParagraph = (TextPElement) OdfXMLFactory.newOdfElement(dom,
+							OdfName.newName(OdfDocumentNamespace.TEXT, "p"));
+					aCell.appendChild(aParagraph);
+					if (!(document instanceof OdfSpreadsheetDocument)) {
+						if ((j + 1 == numCols) && (i == 0)) {
+							aCell.setStyleName(righttopStyle.getStyleNameAttribute());
+						} else if (i == 0) {
+							aCell.setStyleName(lefttopStyle.getStyleNameAttribute());
+						} else if ((j + 1 == numCols) && (i > 0)) {
+							aCell.setStyleName(rightbottomStyle.getStyleNameAttribute());
+						} else {
+							aCell.setStyleName(leftbottomStyle.getStyleNameAttribute());
+						}
+					}
+					aRow.appendChild(aCell);
+				}
+				headerrows.appendChild(aRow);
+			}
+			newTEle.appendChild(headerrows);
+		}
+
+		//3.2 create common row elements
+		for (int i = headerRowNumber; i < numRows; i++) {
+			TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement(dom,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-row"));
+			for (int j = 0; j < numCols; j++) {
+				TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom,
+						OdfName.newName(OdfDocumentNamespace.TABLE, "table-cell"));
+				TextPElement aParagraph = (TextPElement) OdfXMLFactory.newOdfElement(dom,
+						OdfName.newName(OdfDocumentNamespace.TEXT, "p"));
+				aCell.appendChild(aParagraph);
+				if (!(document instanceof OdfSpreadsheetDocument)) {
+					if ((j + 1 == numCols) && (i == 0)) {
+						aCell.setStyleName(righttopStyle.getStyleNameAttribute());
+					} else if (i == 0) {
+						aCell.setStyleName(lefttopStyle.getStyleNameAttribute());
+					} else if ((j + 1 == numCols) && (i > 0)) {
+						aCell.setStyleName(rightbottomStyle.getStyleNameAttribute());
+					} else {
+						aCell.setStyleName(leftbottomStyle.getStyleNameAttribute());
+					}
+				}
+				aRow.appendChild(aCell);
+			}
+			newTEle.appendChild(aRow);
+		}
+
+		return newTEle;
+	}
+
+
+//	/**
+//	 * The given table will be appended at the end of the given document.
+//	 *
+//	 * @param document	the ODF document that contains this feature
+//	 * @return the created <code>OdfTable</code> feature instance
+//	 */
+//	public static void appendTable(TableTableElement table, OdfDocument document) {
+//		try {
+//			OdfElement contentRoot = document.getContentRoot();
+//			contentRoot.appendChild(table);
+//		} catch (DOMException e) {
+//			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+//		} catch (Exception e) {
+//			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+//		}
+//	}
+
+
+	/**
+	 * Construct the <code>OdfTable</code> feature.
+	 * The default column count is 5.
+	 * The default row count is 2.
+	 * <p>
+	 * The table will be inserted at the end of the document the parent element belongs to.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 * 
+	 * @param tableParent the ODF element the new table will be appended to
+	 * @return the created <code>OdfTable</code> feature instance
+	 */
+	public static OdfTable newTable(OdfElement tableParent) {
+		try {
+			TableTableElement newTEle = createTable(tableParent, DEFAULT_ROW_COUNT, DEFAULT_COLUMN_COUNT, 0, 0);
+			tableParent.appendChild(newTEle);
+			return OdfTable.getInstance(newTEle);
+
+		} catch (DOMException e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		} catch (Exception e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Construct the <code>OdfTable</code> feature.
+	 * The default column count is 5.
+	 * The default row count is 2.
+	 * <p>
+	 * The table will be inserted at the end of the given document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+ 	 * @param document	the ODF document that contains this feature
+	 * @return the created <code>OdfTable</code> feature instance
+	 */
+	public static OdfTable newTable(OdfDocument document) {
+		OdfTable table = null;
+		try {
+			table = newTable(document.getContentRoot());
+		} catch (Exception ex) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return table;
+	}
+
+	private static String getUniqueTableName(OdfElement tableParent) {
+		OdfFileDom dom = (OdfFileDom) tableParent.getOwnerDocument();
+		List<TableTableElement> tableList = ((OdfSchemaDocument) dom.getDocument()).getTables();
+		boolean notUnique = true;
+
+		String tablename = "Table" + (tableList.size() + 1);
+
+		while (notUnique) {
+			notUnique = false;
+			for (int i = 0; i < tableList.size(); i++) {
+				if (tableList.get(i).getTableNameAttribute().equalsIgnoreCase(tablename)) {
+					notUnique = true;
+					break;
+				}
+			}
+			if (notUnique) {
+				tablename = tablename + Math.round(Math.random() * 10);
+			}
+		}
+
+		return tablename;
+	}
+
+	/**
+	 * Construct the <code>OdfTable</code> feature
+	 * with a specified row number and column number.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 * 
+	 * @param tableParent	the ODF element the new table will be appended to
+	 * @param numRows	the row number
+	 * @param numCols	the column number
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfElement tableParent, int numRows, int numCols) {
+		try {
+			TableTableElement newTEle = createTable(tableParent, numRows, numCols, 0, 0);
+			tableParent.appendChild(newTEle);
+
+			return OdfTable.getInstance(newTEle);
+		
+		} catch (Exception e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+
+		return null;
+	}
+
+
+	/**
+	 * Construct the <code>OdfTable</code> feature
+	 * with a specified row number and column number.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 *
+	 * @param document	the ODF document that contains this feature
+	 * @param numRows	the row number
+	 * @param numCols	the column number
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfDocument document, int numRows, int numCols) {
+			OdfTable table = null;
+		try {
+			table = newTable(document.getContentRoot(), numRows, numCols);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return table;
+	}
+
+	/**
+	 * Construct the <code>OdfTable</code> feature
+	 * with a specified row number, column number, header row number, header column number.
+	 * <p>
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 * 
+	 * @param tableParent the ODF element the new table will be appended to
+	 * @param numRows	the row number
+	 * @param numCols	the column number
+	 * @param headerRowNumber	the header row number
+	 * @param headerColumnNumber	the header column number
+	 * @return a new instance of <code>OdfTable</code>
+	 * */
+	public static OdfTable newTable(OdfElement tableParent, int numRows, int numCols, int headerRowNumber, int headerColumnNumber) {
+		try {
+			TableTableElement newTEle = createTable(tableParent, numRows, numCols, headerRowNumber, headerColumnNumber);
+			tableParent.appendChild(newTEle);
+
+			return OdfTable.getInstance(newTEle);
+
+		} catch (DOMException e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		} catch (Exception e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Construct the OdfTable feature
+	 * with a specified 2 dimension array as the data of this table.
+	 * The value type of each cell is float.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 *
+	 * @param document	the ODF document that contains this feature
+	 * @param numRows	the row number
+	 * @param numCols	the column number
+	 * @param headerRowNumber	the header row number
+	 * @param headerColumnNumber	the header column number
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfDocument document, int numRows, int numCols, int headerRowNumber, int headerColumnNumber) {
+		OdfTable table = null;
+		try {
+			table = newTable(document.getContentRoot(), numRows, numCols, headerRowNumber, headerColumnNumber);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return table;
+	}
+
+	/**
+	 * Construct the OdfTable feature
+	 * with a specified 2 dimension array as the data of this table.
+	 * The value type of each cell is float.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 * 
+	 * @param tableParent	the ODF document that contains this feature
+	 * @param rowLabel	set as the header row, it can be null if no header row needed
+	 * @param columnLabel	set as the header column, it can be null if no header column needed
+	 * @param data	the two dimension array of double as the data of this table
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfElement tableParent, String[] rowLabel, String[] columnLabel, double[][] data) {
+		int rowNumber = DEFAULT_ROW_COUNT;
+		int columnNumber = DEFAULT_COLUMN_COUNT;
+		if (data != null) {
+			rowNumber = data.length;
+			columnNumber = data[0].length;
+		}
+		int rowHeaders = 0, columnHeaders = 0;
+
+		if (rowLabel != null) {
+			rowHeaders = 1;
+		}
+		if (columnLabel != null) {
+			columnHeaders = 1;
+		}
+
+		try {
+			TableTableElement newTEle = createTable(tableParent, rowNumber + rowHeaders, columnNumber + columnHeaders, rowHeaders, columnHeaders);
+			tableParent.appendChild(newTEle);
+
+			OdfTable table = OdfTable.getInstance(newTEle);
+			List<OdfTableRow> rowList = table.getRowList();
+			for (int i = 0; i < rowNumber + rowHeaders; i++) {
+				OdfTableRow row = rowList.get(i);
+				for (int j = 0; j < columnNumber + columnHeaders; j++) {
+					if ((i == 0) && (j == 0)) {
+						continue;
+					}
+					OdfTableCell cell = row.getCellByIndex(j);
+					if (i == 0 && columnLabel != null) //first row, should fill column labels
+					{
+						if (j <= columnLabel.length) {
+							cell.setStringValue(columnLabel[j - 1]);
+						} else {
+							cell.setStringValue("");
+						}
+					} else if (j == 0 && rowLabel != null) //first column, should fill row labels
+					{
+						if (i <= rowLabel.length) {
+							cell.setStringValue(rowLabel[i - 1]);
+						} else {
+							cell.setStringValue("");
+						}
+					} else {//data
+						if ((data != null) && (i >= rowHeaders) && (j >= columnHeaders)) {
+							cell.setDoubleValue(data[i - rowHeaders][j - columnHeaders]);
+						}
+					}
+				}
+			}
+			return table;
+		} catch (DOMException e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		} catch (Exception e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		return null;
+	}
+
+
+	/**
+	 * Construct the OdfTable feature
+	 * with a specified 2 dimension array as the data of this table.
+	 * The value type of each cell is float.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 *
+	 * @param document	the ODF document that contains this feature
+	 * @param rowLabel	set as the header row, it can be null if no header row needed
+	 * @param columnLabel	set as the header column, it can be null if no header column needed
+	 * @param data	the two dimension array of double as the data of this table
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfDocument document, String[] rowLabel, String[] columnLabel, double[][] data) {
+		OdfTable table = null;
+		try {
+			table = newTable(document.getContentRoot(), rowLabel, columnLabel, data);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return table;
+	}
+
+	/**
+	 * Construct the OdfTable feature
+	 * with a specified 2 dimension array as the data of this table.
+	 * The value type of each cell is string.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 * 
+	 * @param tableParent the ODF element the new table will be appended to
+	 * @param rowLabel	set as the header row, it can be null if no header row needed
+	 * @param columnLabel	set as the header column, it can be null if no header column needed
+	 * @param data	the two dimension array of string as the data of this table
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfElement tableParent, String[] rowLabel, String[] columnLabel, String[][] data) {
+		int rowNumber = DEFAULT_ROW_COUNT;
+		int columnNumber = DEFAULT_COLUMN_COUNT;
+		if (data != null) {
+			rowNumber = data.length;
+			columnNumber = data[0].length;
+		}
+		int rowHeaders = 0, columnHeaders = 0;
+
+		if (rowLabel != null) {
+			rowHeaders = 1;
+		}
+		if (columnLabel != null) {
+			columnHeaders = 1;
+		}
+
+		try {
+			TableTableElement newTEle = createTable(tableParent, rowNumber + rowHeaders, columnNumber + columnHeaders, rowHeaders, columnHeaders);
+			tableParent.appendChild(newTEle);
+
+			OdfTable table = OdfTable.getInstance(newTEle);
+			List<OdfTableRow> rowList = table.getRowList();
+			for (int i = 0; i < rowNumber + rowHeaders; i++) {
+				OdfTableRow row = rowList.get(i);
+				for (int j = 0; j < columnNumber + columnHeaders; j++) {
+					if ((i == 0) && (j == 0)) {
+						continue;
+					}
+					OdfTableCell cell = row.getCellByIndex(j);
+					if (i == 0 && columnLabel != null) //first row, should fill column labels
+					{
+						if (j <= columnLabel.length) {
+							cell.setStringValue(columnLabel[j - 1]);
+						} else {
+							cell.setStringValue("");
+						}
+					} else if (j == 0 && rowLabel != null) //first column, should fill row labels
+					{
+						if (i <= rowLabel.length) {
+							cell.setStringValue(rowLabel[i - 1]);
+						} else {
+							cell.setStringValue("");
+						}
+					} else {
+						if ((data != null) && (i >= rowHeaders) && (j >= columnHeaders)) {
+							cell.setStringValue(data[i - rowHeaders][j - columnHeaders]);
+						}
+					}
+				}
+			}
+
+			return table;
+
+		} catch (DOMException e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		} catch (Exception e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Construct the OdfTable feature
+	 * with a specified 2 dimension array as the data of this table.
+	 * The value type of each cell is string.
+	 * <p>
+	 * The table will be inserted at the end of the document.
+	 * An unique table name will be given, you may set a custom table name using the <code>setTableName</code> method.
+	 * <p>
+	 * If the document is a text document, cell borders will be created by default.
+	 *
+	 * @param document	the ODF document that contains this feature
+	 * @param rowLabel	set as the header row, it can be null if no header row needed
+	 * @param columnLabel	set as the header column, it can be null if no header column needed
+	 * @param data	the two dimension array of string as the data of this table
+	 * @return a new instance of <code>OdfTable</code>
+	 */
+	public static OdfTable newTable(OdfDocument document, String[] rowLabel, String[] columnLabel, String[][] data) {
+
+		OdfTable table = null;
+		try {
+			table = newTable(document.getContentRoot(), rowLabel, columnLabel, data);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return table;
+	}
+
+	/**
+	 * Get the row count of this table.
+	 * 
+	 * @return total count of rows
+	 */
+	public int getRowCount() {
+		int result = 0;
+
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				result += getHeaderRowCount((TableTableHeaderRowsElement) n);
+			}
+			if (n instanceof TableTableRowElement) {
+				result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Get the column count of this table.
+	 * 
+	 * @return total count of columns
+	 */
+	public int getColumnCount() {
+		int result = 0;
+
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				result += getHeaderColumnCount((TableTableHeaderColumnsElement) n);
+			}
+			if (n instanceof TableTableColumnElement) {
+				result += getColumnInstance((TableTableColumnElement) n, 0).getColumnsRepeatedNumber();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * This method is invoked by appendRow.
+	 * When a table has no row, the first row is a default row.
+	 */
+	private TableTableRowElement createDefaultRow(int columnCount) {
+		OdfFileDom dom = (OdfFileDom) mTableElement.getOwnerDocument();
+		//3. create row elements
+		//3.0 create 4 kinds of styles
+		OdfStyle lefttopStyle=null,righttopStyle=null;
+		
+		if (!mIsSpreadsheet) {
+			lefttopStyle = mTableElement.getAutomaticStyles().newStyle(OdfStyleFamily.TableCell);
+			setLeftTopBorderStyleProperties(lefttopStyle);
+	
+			righttopStyle = mTableElement.getAutomaticStyles().newStyle(OdfStyleFamily.TableCell);
+			setRightTopBorderStyleProperties(righttopStyle);
+		}
+
+		//3.1 create header row elements
+		TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement(dom,
+				OdfName.newName(OdfDocumentNamespace.TABLE, "table-row"));
+		for (int j = 0; j < columnCount; j++) {
+			TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-cell"));
+			TextPElement aParagraph = (TextPElement) OdfXMLFactory.newOdfElement(dom,
+					OdfName.newName(OdfDocumentNamespace.TEXT, "p"));
+			aCell.appendChild(aParagraph);
+			if (!mIsSpreadsheet) {
+				if (j + 1 == columnCount) {
+					aCell.setStyleName(righttopStyle.getStyleNameAttribute());
+				} else {
+					aCell.setStyleName(lefttopStyle.getStyleNameAttribute());
+				}
+			}
+			aRow.appendChild(aCell);
+		}
+
+		return aRow;
+	}
+
+	/**
+	 * Append a row to the end of the table. The style of new row is same with
+	 * the last row in the table.
+	 * <p>
+	 * Since ODFDOM 8.5 automatic table expansion is supported. Whenever a cell
+	 * outside the current table is addressed the table is instantly expanded.
+	 * Method <code>getCellByPosition</code> can randomly access any cell, no
+	 * matter it in or out of the table original range.
+	 * 
+	 * @return a new appended row
+	 * @see #appendRows(int)
+	 * @see #getRowByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public OdfTableRow appendRow() {
+		int columnCount = getColumnCount();
+		List<OdfTableRow> rowList = getRowList();
+
+		if (rowList.size() == 0) //no row, create a default row
+		{
+			TableTableRowElement newRow = createDefaultRow(columnCount);
+			mTableElement.appendChild(newRow);
+
+			return getRowInstance(newRow, 0);
+		} else {
+			OdfTableRow refRow = rowList.get(rowList.size() - 1);
+			OdfTableRow newRow = insertRowBefore(refRow, null);
+			return newRow;
+		}
+	}
+
+	/**
+	 * Append a specific number of rows to the end of the table. The style of
+	 * new rows are same with the last row in the table. 
+	 * <p>
+	 * Since ODFDOM 8.5 automatic table expansion is supported. Whenever a cell
+	 * outside the current table is addressed the table is instantly expanded.
+	 * Method <code>getCellByPosition</code> can randomly access any cell, no
+	 * matter it in or out of the table original range.
+	 * 
+	 * @param rowCount  is the number of rows to be appended.
+	 * @return a list of new appended rows
+	 * @see #appendRow()
+	 * @see #getRowByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public List<OdfTableRow> appendRows(int rowCount) {
+		return appendRows(rowCount, false);
+	}
+
+	List<OdfTableRow> appendRows(int rowCount, boolean isCleanStyle) {
+		List<OdfTableRow> resultList = new ArrayList<OdfTableRow>();
+		if (rowCount <= 0) {
+			return resultList;
+		}
+		OdfTableRow firstRow = appendRow();
+		resultList.add(firstRow);
+		if (rowCount == 1) {
+			return resultList;
+		}
+		List<OdfTableRow> list = insertRowsBefore((getRowCount() - 1),
+				(rowCount - 1));
+		resultList.addAll(list);
+		if (isCleanStyle) {
+			// clean style name
+			for (OdfTableRow row : resultList) {
+				for (int i = 0; i < row.getCellCount(); i++) {
+					TableTableCellElement cellElement = (TableTableCellElement) (row
+							.getCellByIndex(i).mCellElement);
+					cellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+				}
+			}
+		}
+		return resultList;
+	}
+
+	/**
+	 * Append a column at the end of the table. The style of new column is
+	 * same with the last column in the table.
+	 * <p>
+	 * Since ODFDOM 8.5 automatic table expansion is supported. Whenever a cell
+	 * outside the current table is addressed the table is instantly expanded.
+	 * Method <code>getCellByPosition</code> can randomly access any cell, no
+	 * matter it in or out of the table original range.
+	 * 
+	 * @return a new appended column
+	 * @see #appendColumns(int)
+	 * @see #getColumnByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public OdfTableColumn appendColumn() {
+		List<OdfTableColumn> columnList = getColumnList();
+		int columnCount = columnList.size();
+
+		TableTableColumnElement newColumn;
+		OdfElement positonElement = getRowElementByIndex(0);
+		if (positonElement.getParentNode() instanceof TableTableHeaderRowsElement) {
+			positonElement = (OdfElement) positonElement.getParentNode();
+		}
+		
+		//Moved before column elements inserted
+		//insert cells firstly
+		//Or else, wrong column number will be gotten in updateCellRepository, which will cause a NPE.
+		//insertCellBefore()->splitRepeatedRows()->updateRowRepository()->updateCellRepository() 
+		List<OdfTableRow> rowList = getRowList();
+		for (int i = 0; i < rowList.size();) {
+			OdfTableRow row1 = rowList.get(i);
+			row1.insertCellBefore(row1.getCellByIndex(columnCount - 1), null);
+			i = i + row1.getRowsRepeatedNumber();
+		}		
+
+		//insert columns secondly
+		if (columnList.size() == 0) //no column, create a new column
+		{
+			OdfStyle columnStyle = mTableElement.getAutomaticStyles().newStyle(OdfStyleFamily.TableColumn);
+			String columnStylename = columnStyle.getStyleNameAttribute();
+			columnStyle.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, DEFAULT_TABLE_WIDTH + "in");
+			columnStyle.setProperty(StyleTableColumnPropertiesElement.RelColumnWidth, DEFAULT_REL_TABLE_WIDTH + "*");
+
+			newColumn = (TableTableColumnElement) OdfXMLFactory.newOdfElement((OdfFileDom) mTableElement.getOwnerDocument(),
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-column"));
+			newColumn.setStyleName(columnStylename);
+			mTableElement.insertBefore(newColumn, positonElement);
+		} else { //has column, append a same column as the last one.
+			TableTableColumnElement refColumn = columnList.get(columnList.size() - 1).getOdfElement();
+			newColumn = (TableTableColumnElement) refColumn.cloneNode(true);
+			newColumn.setTableNumberColumnsRepeatedAttribute(1);//chagne to remove attribute
+			mTableElement.insertBefore(newColumn, positonElement);
+		}
+
+		return getColumnInstance(newColumn, 0);
+	}
+
+	/**
+	 * Append a specific number of columns to the right of the table. The style
+	 * of new columns are same with the rightmost column in the table. 
+	 * <p>
+	 * Since ODFDOM 8.5 automatic table expansion is supported. Whenever a cell
+	 * outside the current table is addressed the table is instantly expanded.
+	 * Method <code>getCellByPosition</code> can randomly access any cell, no
+	 * matter it in or out of the table original range.
+	 * 
+	 * @param columnCount is the number of columns to be appended.
+	 * @return a list of new appended columns
+	 * @see #appendColumn()
+	 * @see #getColumnByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public List<OdfTableColumn> appendColumns(int columnCount) {
+		return appendColumns(columnCount, false);
+	}
+
+	List<OdfTableColumn> appendColumns(int columnCount, boolean isCleanStyle) {
+		List<OdfTableColumn> resultList = new ArrayList<OdfTableColumn>();
+		if (columnCount <= 0) {
+			return resultList;
+		}
+		OdfTableColumn firstClm = appendColumn();
+		resultList.add(firstClm);
+		if (columnCount == 1) {
+			return resultList;
+		}
+		List<OdfTableColumn> list = insertColumnsBefore((getColumnCount() - 1), (columnCount - 1));
+		resultList.addAll(list);
+		// clean style name
+		if(isCleanStyle){
+			for (OdfTableColumn column : resultList) {
+				for (int i = 0; i < column.getCellCount(); i++) {
+					TableTableCellElement cellElement = (TableTableCellElement) (column
+							.getCellByIndex(i).mCellElement);
+					cellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+				}
+			}
+		}		
+		return resultList;
+	}
+
+	/**
+	 * This method is to insert a numbers of row  
+	 */
+	private List<OdfTableRow> insertMultipleRowBefore(OdfTableRow refRow, OdfTableRow positionRow, int count) {
+		List<OdfTableRow> resultList = new ArrayList<OdfTableRow>();
+		int j = 1;
+
+		if (count <= 0) {
+			return resultList;
+		}
+
+		OdfTableRow firstRow = insertRowBefore(refRow, positionRow);
+		resultList.add(firstRow);
+
+		if (count == 1) {
+			return resultList;
+		}
+
+		TableTableRowElement rowEle = firstRow.getOdfElement();
+		for (int i = 0; i < getColumnCount();) {
+			OdfTableCell refCell = refRow.getCellByIndex(i);
+			if (!refCell.isCoveredElement()) {
+				int coveredHeigth = refCell.getRowSpannedNumber();
+				if (coveredHeigth > 1) {
+					refCell.setRowSpannedNumber(coveredHeigth + 1);
+				}
+			}
+			i += refCell.getColumnsRepeatedNumber();
+		}
+		firstRow.setRowsRepeatedNumber(count);
+		while (j < count) {
+			resultList.add(getRowInstance(rowEle, j));
+			j++;
+		}
+		return resultList;
+	}
+
+	private OdfTableRow insertRowBefore(OdfTableRow refRow, OdfTableRow positionRow) //only insert one Row
+	{
+		int columnCount = getColumnCount();
+		TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement((OdfFileDom) mTableElement.getOwnerDocument(),
+				OdfName.newName(OdfDocumentNamespace.TABLE, "table-row"));
+		int coveredLength = 0, coveredHeigth = 0;
+		for (int i = 0; i < columnCount;) {
+			OdfTableCell refCell = refRow.getCellByIndex(i);
+			if (!refCell.isCoveredElement()) //not cover element
+			{
+				TableTableCellElement aCellEle = (TableTableCellElement) refCell.getOdfElement();
+				coveredHeigth = aCellEle.getTableNumberRowsSpannedAttribute();
+				if (coveredHeigth == 1) {
+					TableTableCellElement newCellEle = (TableTableCellElement) aCellEle.cloneNode(true);
+					cleanCell(newCellEle);
+					aRow.appendChild(newCellEle);
+				} else { //cover more rows
+					aCellEle.setTableNumberRowsSpannedAttribute(coveredHeigth + 1);
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+							(OdfFileDom) mTableElement.getOwnerDocument(),
+							OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+					newCellEle.setTableNumberColumnsRepeatedAttribute(refCell.getColumnsRepeatedNumber());
+					aRow.appendChild(newCellEle);
+				}
+
+				coveredLength = aCellEle.getTableNumberColumnsSpannedAttribute() - refCell.getColumnsRepeatedNumber();
+				i = i + refCell.getColumnsRepeatedNumber();
+			} else {
+				TableCoveredTableCellElement aCellEle = (TableCoveredTableCellElement) refCell.getOdfElement();
+				if (coveredLength >= 1) {
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) aCellEle.cloneNode(true);
+					aRow.appendChild(newCellEle);
+					coveredLength -= newCellEle.getTableNumberColumnsRepeatedAttribute();
+				} else {
+					TableTableCellElement coveredCell = (TableTableCellElement) refCell.getCoverCell().getOdfElement();
+					TableTableCellElement newCellEle = (TableTableCellElement) coveredCell.cloneNode(true);
+					cleanCell(newCellEle);
+					newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-spanned");
+					aRow.appendChild(newCellEle);
+
+					coveredLength = coveredCell.getTableNumberColumnsSpannedAttribute() - refCell.getColumnsRepeatedNumber();
+				}
+				i = i + refCell.getColumnsRepeatedNumber();
+			}
+		}
+		if (positionRow == null) {
+			mTableElement.appendChild(aRow);
+		} else {
+			mTableElement.insertBefore(aRow, positionRow.getOdfElement());
+		}
+
+		return getRowInstance(aRow, 0);
+	}
+
+	void cleanCell(TableTableCellElement newCellEle) {
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "date-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "time-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "boolean-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "string-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "formula");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "value-type");
+		if(!isCellStyleInheritance()){
+			newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+		}
+		Node n = newCellEle.getFirstChild();
+		while (n != null) {
+			Node m = n.getNextSibling();
+			if (n instanceof TextPElement
+					|| n instanceof TextHElement
+					|| n instanceof TextListElement) {
+				newCellEle.removeChild(n);
+			}
+			n = m;
+		}
+	}
+
+	/**
+	 * Return an instance of <code>TableTableElement</code> which represents this feature.
+	 * 
+	 * @return an instance of <code>TableTableElement</code>
+	 */
+	public TableTableElement getOdfElement() {
+		return mTableElement;
+	}
+
+	/** 
+	 * Insert a specific number of columns before the column whose index is <code>index</code>.
+	 * 
+	 * @param index	is the index of the column to insert before.
+	 * @param columnCount	is the number of columns to insert.
+	 * @return a list of new inserted columns
+	 */
+	public List<OdfTableColumn> insertColumnsBefore(int index, int columnCount) {
+		OdfTableColumn refColumn, positionCol;
+		ArrayList<OdfTableColumn> list = new ArrayList<OdfTableColumn>();
+		int columncount = getColumnCount();
+
+		if (index >= columncount) {
+			throw new IndexOutOfBoundsException();
+		}
+
+		if (index == 0) {
+			int iRowCount = getRowCount();
+			for (int i = 0; i < iRowCount; i++) {
+				OdfTableRow row = getRowByIndex(i);
+				row.insertCellByIndex(index, columnCount);
+			}
+
+			refColumn = getColumnByIndex(index);
+			positionCol = refColumn;
+
+			TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement().cloneNode(true);
+			newColumnEle.setTableNumberColumnsRepeatedAttribute(new Integer(columnCount));
+			mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+
+			for (int i = 0; i < columnCount; i++) {
+				list.add(getColumnInstance(newColumnEle, i));
+			}
+			return list;
+		}
+
+		//1. insert the cell
+		int iRowCount = getRowCount();
+		for (int i = iRowCount - 1; i >= 0;) {
+			OdfTableRow row = getRowByIndex(i);
+			OdfTableCell refCell = row.getCellByIndex(index - 1);
+			OdfTableCell positionCell = null;
+			positionCell = row.getCellByIndex(index);
+			row.insertCellBefore(refCell, positionCell, columnCount);
+			i = i - row.getRowsRepeatedNumber();
+		}
+
+		refColumn = getColumnByIndex(index - 1);
+		positionCol = getColumnByIndex(index);
+		//2. insert a <table:table-column>
+		if (refColumn.getOdfElement() == positionCol.getOdfElement()) {
+			TableTableColumnElement column = refColumn.getOdfElement();
+			int repeatedCount = getColumnInstance(column, 0).getColumnsRepeatedNumber();
+			getColumnInstance(column, 0).setColumnsRepeatedNumber((repeatedCount + columnCount));
+			TableTableColumnElement columnEle = positionCol.getOdfElement();
+			OdfTableColumn startCol = getColumnInstance(positionCol.getOdfElement(), 0);
+			for (int i = repeatedCount + columnCount - 1; i >= columnCount + (index - startCol.getColumnIndex()); i--) {
+				updateColumnRepository(columnEle, i - columnCount, columnEle, i);
+			}
+			for (int i = 0; i < columnCount; i++) {
+				list.add(getColumnInstance(column, refColumn.mnRepeatedIndex + 1 + i));
+			}
+		} else {
+			TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement().cloneNode(true);
+			newColumnEle.setTableNumberColumnsRepeatedAttribute(new Integer(columnCount));
+			mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+
+			for (int i = 0; i < columnCount; i++) {
+				list.add(getColumnInstance(newColumnEle, i));
+			}
+		}
+
+		return list;
+	}
+
+	/** 
+	 * Remove a specific number of columns, starting from the column at <code>index</code>.
+	 * 
+	 * @param startIndex
+	 * 				is the index of the first column to delete.
+	 * @param deleteColCount
+	 * 				is the number of columns to delete.
+	 */
+	public void removeColumnsByIndex(int startIndex, int deleteColCount) {
+		//0. verify the index
+		if(deleteColCount <= 0) {
+			return;
+		}
+		if(startIndex < 0) {
+			throw new IllegalArgumentException("startIndex of the deleted columns should not be negative");
+		}
+		int colCount = getColumnCount();
+		if (startIndex >= colCount) {
+			throw new IndexOutOfBoundsException("Start column index is out of bound");
+		}
+		if (startIndex + deleteColCount >= colCount) {
+			deleteColCount = colCount - startIndex;
+		}
+
+		//1. remove cell
+		for (int i = 0; i < getRowCount(); i++) {
+			OdfTableRow aRow = getRowByIndex(i);
+			aRow.removeCellByIndex(startIndex, deleteColCount);
+		}
+
+		//2. remove column
+		OdfTableColumn firstColumn;
+		for (int i = 0; i < deleteColCount; i++) {
+			firstColumn = getColumnByIndex(startIndex);
+			int repeatedAttr = firstColumn.getColumnsRepeatedNumber();
+			if (repeatedAttr == 1) {
+				TableTableColumnElement columnEle = OdfElement.findNextChildNode(TableTableColumnElement.class, firstColumn.getOdfElement());
+				mTableElement.removeChild(firstColumn.getOdfElement());
+				if (i < (deleteColCount - 1)) {
+					firstColumn = this.getColumnInstance(columnEle, 0);
+				}
+			} else {
+				if (repeatedAttr > firstColumn.mnRepeatedIndex) {
+					firstColumn.setColumnsRepeatedNumber(repeatedAttr - 1);
+					OdfTableColumn startCol = this.getColumnInstance(firstColumn.getOdfElement(), 0);
+					updateColumnRepository(firstColumn.getOdfElement(), startIndex - startCol.getColumnIndex(), null, 0);
+				}
+			}
+		}
+
+	}
+
+	private void reviseStyleFromTopRowToMediumRow(OdfTableRow oldTopRow) {
+		if (mIsSpreadsheet) return;
+		int length = getColumnCount();
+
+		for (int i = 0; i < length;) {
+			OdfTableCell cell = oldTopRow.getCellByIndex(i);
+			if (cell.isCoveredElement()) {
+				i = i + cell.getColumnsRepeatedNumber();
+				continue;
+			}
+			OdfStyle styleEle = cell.getCellStyleElementForWrite();
+			if (i < length - 1) {
+				setLeftBottomBorderStylesProperties(styleEle);
+			} else {
+				setRightBottomBorderStylesProperties(styleEle);
+			}
+			i = i + cell.getColumnsRepeatedNumber();
+		}
+	}
+
+	private void reviseStyleFromMediumRowToTopRow(OdfTableRow newTopRow) {
+		if (mIsSpreadsheet) {
+			return;
+		}
+		int length = getColumnCount();
+		
+		for (int i = 0; i < length;) {
+			OdfTableCell cell = newTopRow.getCellByIndex(i);
+			if (cell.isCoveredElement()) {
+				i = i + cell.getColumnsRepeatedNumber();
+				continue;
+			}
+			OdfStyle styleEle = cell.getCellStyleElementForWrite();
+			if (i < length - 1) {
+				setLeftTopBorderStyleProperties(styleEle);
+			} else {
+				setRightTopBorderStyleProperties(styleEle);
+			}
+			i = i + cell.getColumnsRepeatedNumber();
+		}
+	}
+
+	/**
+	 * Insert a specific number of rows before the row at <code>index</code>.
+	 * 
+	 * @param index	is the index of the row to insert before.
+	 * @param rowCount	is the number of rows to insert.
+	 * @return a list of new inserted rows
+	 */
+	public List<OdfTableRow> insertRowsBefore(int index, int rowCount) {
+		if (index >= getRowCount()) {
+			throw new IndexOutOfBoundsException();
+		}
+
+		ArrayList<OdfTableRow> list = new ArrayList<OdfTableRow>();
+
+		if (index == 0) {
+			OdfTableRow refRow = getRowByIndex(index);
+			OdfTableRow positionRow = refRow;
+			//add first row
+			OdfTableRow newFirstRow = insertRowBefore(refRow, positionRow);
+			reviseStyleFromTopRowToMediumRow(refRow);
+			list.add(newFirstRow);
+			List<OdfTableRow> rowList = insertMultipleRowBefore(refRow, refRow, rowCount - 1);
+			for (int i = 0; i < rowList.size(); i++) {
+				list.add(rowList.get(i));
+			}
+			return list;
+		}
+
+		OdfTableRow refRow = getRowByIndex(index - 1);
+		OdfTableRow positionRow = getRowByIndex(index);
+		//1. insert a <table:table-column>
+		if (refRow.getOdfElement() == positionRow.getOdfElement()) {
+			TableTableRowElement row = refRow.getOdfElement();
+			int repeatedCount = refRow.getRowsRepeatedNumber();
+			refRow.setRowsRepeatedNumber(repeatedCount + rowCount);
+			TableTableRowElement rowEle = positionRow.getOdfElement();
+			OdfTableRow startRow = getRowInstance(positionRow.getOdfElement(), 0);
+			for (int i = repeatedCount + rowCount - 1; i >= rowCount + (index - startRow.getRowIndex()); i--) {
+				updateRowRepository(rowEle, i - rowCount, rowEle, i);
+			}
+			for (int i = 0; i < rowCount; i++) {
+				list.add(getRowInstance(row, refRow.mnRepeatedIndex + 1 + i));
+			}
+		} else {
+			List<OdfTableRow> newRowList = insertMultipleRowBefore(refRow, positionRow, rowCount);
+			if (index - 1 == 0) {
+				//correct styles
+				reviseStyleFromTopRowToMediumRow(newRowList.get(0));
+			}
+			for (int i = 0; i < newRowList.size(); i++) {
+				list.add(newRowList.get(i));
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Return a list of columns in the current table.
+	 * 
+	 * @return a list of table columns
+	 */
+	public List<OdfTableColumn> getColumnList() {
+		ArrayList<OdfTableColumn> list = new ArrayList<OdfTableColumn>();
+		TableTableColumnElement colEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableColumnElement) {
+						colEle = (TableTableColumnElement) m;
+						for (int i = 0; i < getColumnInstance(colEle, 0).getColumnsRepeatedNumber(); i++) {
+							list.add(getColumnInstance(colEle, i));
+						}
+					}
+				}
+			}
+			if (n instanceof TableTableColumnElement) {
+				colEle = (TableTableColumnElement) n;
+				for (int i = 0; i < getColumnInstance(colEle, 0).getColumnsRepeatedNumber(); i++) {
+					list.add(getColumnInstance(colEle, i));
+				}
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * Return a list of table rows in the current table.
+	 * 
+	 * @return a list of table rows
+	 */
+	public List<OdfTableRow> getRowList() {
+		ArrayList<OdfTableRow> list = new ArrayList<OdfTableRow>();
+		TableTableRowElement rowEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableRowElement) {
+						rowEle = (TableTableRowElement) m;
+						for (int i = 0; i < rowEle.getTableNumberRowsRepeatedAttribute(); i++) {
+							list.add(getRowInstance(rowEle, i));
+						}
+					}
+				}
+			}
+			if (n instanceof TableTableRowElement) {
+				rowEle = (TableTableRowElement) n;
+				for (int i = 0; i < rowEle.getTableNumberRowsRepeatedAttribute(); i++) {
+					list.add(getRowInstance(rowEle, i));
+				}
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * Get the column at the specified index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the zero-based index of the column.
+	 * @return the column at the specified index
+	 */
+	public OdfTableColumn getColumnByIndex(int index) {
+		if (index < 0) {
+			throw new IllegalArgumentException(
+					"index should be nonnegative integer.");
+		}
+		// expand column as needed.
+		int lastIndex = getColumnCount() - 1;
+		if (index > lastIndex) {
+			appendColumns(index - lastIndex);
+		}
+		int result = 0;
+		OdfTableColumn col = null;
+		// TableTableColumnElement colEle=null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				col = getHeaderColumnByIndex(
+						(TableTableHeaderColumnsElement) n, index);
+				if (col != null) {
+					return col;
+				}
+				result += getHeaderColumnCount((TableTableHeaderColumnsElement) n);
+			}
+			if (n instanceof TableTableColumnElement) {
+				col = getColumnInstance((TableTableColumnElement) n, 0);
+				result += col.getColumnsRepeatedNumber();
+			}
+			if ((result > index) && (col != null)) {
+				return getColumnInstance(col.getOdfElement(), index
+						- (result - col.getColumnsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	private OdfTableRow getHeaderRowByIndex(TableTableHeaderRowsElement headers, int nIndex) {
+		int result = 0;
+		OdfTableRow row = null;
+		for (Node n : new DomNodeList(headers.getChildNodes())) {
+			if (n instanceof TableTableRowElement) {
+				row = getRowInstance((TableTableRowElement) n, 0);
+				result += row.getRowsRepeatedNumber();
+			}
+			if ((result > nIndex) && (row != null)) {
+				return getRowInstance(row.getOdfElement(), nIndex - (result - row.getRowsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	private OdfTableColumn getHeaderColumnByIndex(TableTableHeaderColumnsElement headers, int nIndex) {
+		int result = 0;
+		OdfTableColumn col = null;
+		for (Node n : new DomNodeList(headers.getChildNodes())) {
+			if (n instanceof TableTableColumnElement) {
+				col = getColumnInstance((TableTableColumnElement) n, 0);
+				result += col.getColumnsRepeatedNumber();
+			}
+			if (result > nIndex) {
+				return getColumnInstance(col.getOdfElement(), nIndex - (result - col.getColumnsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Get the row at the specified index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the zero-based index of the row.
+	 * @return the row at the specified index
+	 */
+	public OdfTableRow getRowByIndex(int index) {
+		if (index < 0) {
+			throw new IllegalArgumentException(
+					"index should be nonnegative integer.");
+		}
+		// expand row as needed.
+		int lastIndex = getRowCount() - 1;
+		if (index > lastIndex) {
+			appendRows(index - lastIndex);
+		}
+		int result = 0;
+		OdfTableRow row = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				row = getHeaderRowByIndex((TableTableHeaderRowsElement) n,
+						index);
+				if (row != null) {
+					return row;
+				}
+				result += getHeaderRowCount((TableTableHeaderRowsElement) n);
+			}
+			if (n instanceof TableTableRowElement) {
+				row = getRowInstance((TableTableRowElement) n, 0);
+				result += row.getRowsRepeatedNumber();
+			}
+			if (result > index) {
+				return getRowInstance(row.getOdfElement(), index
+						- (result - row.getRowsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	/** 
+	 * Remove the specific number of rows, starting from the row at <code>index</code>.
+	 * 
+	 * @param startIndex	is the zero-based index of the first row to delete.
+	 * @param deleteRowCount	is the number of rows to delete.
+	 */
+	public void removeRowsByIndex(int startIndex, int deleteRowCount) {
+		boolean deleted = false;
+		//0. verify the index
+		if(deleteRowCount <= 0) {
+			return;
+		}
+		if(startIndex < 0) {
+			throw new IllegalArgumentException("startIndex of the deleted rows should not be negative");
+		}
+		int rowCount = getRowCount();
+		if (startIndex >= rowCount) {
+			throw new IndexOutOfBoundsException("Start index out of bound");
+		}
+		if (startIndex + deleteRowCount >= rowCount) {
+			deleteRowCount = rowCount - startIndex;
+		}
+
+		//1. remove row
+		OdfTableRow firstRow = getRowByIndex(startIndex);
+		for (int i = startIndex; i < startIndex + deleteRowCount; i++) {
+			int repeatedAttr = firstRow.getRowsRepeatedNumber();
+			if (repeatedAttr == 1) {
+				TableTableRowElement rowEle = OdfElement.findNextChildNode(TableTableRowElement.class, firstRow.getOdfElement());
+				firstRow.removeAllCellsRelationship();
+				firstRow.getOdfElement().getParentNode().removeChild(firstRow.getOdfElement());
+				updateRowRepository(firstRow.getOdfElement(), firstRow.mnRepeatedIndex, null, 0);
+				if (i < (startIndex + deleteRowCount - 1)) {
+					firstRow = this.getRowInstance(rowEle, 0);
+				}
+				deleted = true;
+			} else {
+				if (repeatedAttr > firstRow.mnRepeatedIndex) {
+					firstRow.setRowsRepeatedNumber(repeatedAttr - 1);
+					OdfTableRow startRow = this.getRowInstance(firstRow.getOdfElement(), 0);
+					updateRowRepository(firstRow.getOdfElement(), i - startRow.getRowIndex(), null, 0);
+				}
+			}
+		}
+		//2. if mediumRow becomes as top row, revise style
+		if (deleted && startIndex == 0) {
+			OdfTableRow aRow = getRowByIndex(0);
+			reviseStyleFromMediumRowToTopRow(aRow);
+		}
+	}
+
+	/**
+	 * Remove this table from the document
+	 */
+	public void remove() {
+		mTableElement.getParentNode().removeChild(mTableElement);
+
+	}
+
+	private int getHeaderRowCount(TableTableHeaderRowsElement headers) {
+		int result = 0;
+		if (headers != null) {
+			for (Node n : new DomNodeList(headers.getChildNodes())) {
+				if (n instanceof TableTableRowElement) {
+					result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Return the number of header rows in this table.
+	 * 
+	 * @return the number of header rows.
+	 */
+	public int getHeaderRowCount() {
+
+		TableTableHeaderRowsElement headers = OdfElement.findFirstChildNode(TableTableHeaderRowsElement.class, mTableElement);
+		return getHeaderRowCount(headers);
+	}
+
+	private int getHeaderColumnCount(TableTableHeaderColumnsElement headers) {
+		int result = 0;
+		if (headers != null) {
+			for (Node n : new DomNodeList(headers.getChildNodes())) {
+				if (n instanceof TableTableColumnElement) {
+					result += getColumnInstance(((TableTableColumnElement) n),
+							0).getColumnsRepeatedNumber();
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Return the number of header columns in the table.
+	 * 
+	 * @return the number of header columns.
+	 */
+	public int getHeaderColumnCount() {
+		TableTableHeaderColumnsElement headers = OdfElement.findFirstChildNode(TableTableHeaderColumnsElement.class, mTableElement);
+		return getHeaderColumnCount(headers);
+	}
+
+	/**
+	 * Return the table name.
+	 * 
+	 * @return the table name
+	 */
+	public String getTableName() {
+		return mTableElement.getTableNameAttribute();
+	}
+
+	/**
+	 * Set the table name.
+	 * 
+	 * @param tableName the table name
+	 * @throws IllegalArgumentException if the tableName is duplicate with one of tables in the current document
+	 */
+	public void setTableName(String tableName) {
+		//check if the table name is already exist 		
+		List<OdfTable> tableList = mDocument.getTableList();
+		for(int i=0;i<tableList.size();i++){
+			OdfTable table = tableList.get(i);
+			if(tableName.equals(table.getTableName())){
+				if(table != this) {
+					throw new IllegalArgumentException("The table name is duplicate with one of tables in the current document.");
+				}
+			}	
+		}		
+		mTableElement.setTableNameAttribute(tableName);
+	}
+
+	/**
+	 * Return true if the table is protected.
+	 * 
+	 * @return true if the table is protected
+	 */
+	public boolean isProtected() {
+		if (mTableElement.getTableProtectedAttribute() != null) {
+			return mTableElement.getTableProtectedAttribute().booleanValue();
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Set if the table is protected.
+	 * @param isProtected	the protected attribute of the table to be set
+	 */
+	public void setProtected(boolean isProtected) {
+		mTableElement.setTableProtectedAttribute(isProtected);
+	}
+	
+	/**
+	 * Return true if cell style is inherited when a new cell is added to the
+	 * table.
+	 * <p>
+	 * The default setting is inherited. In this condition, the style of new
+	 * column is same with the previous column before the inserted position,
+	 * while the style of new row is same with the last row before the inserted
+	 * position.
+	 * <p>
+	 * This feature setting will influence <code>appendRow()</code>,
+	 * <code>appendColumn()</code>, <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code> and
+	 * <code>insertColumnsBefore()</code>.
+	 * <p>
+	 * For <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>, if need
+	 * automatically expand cells, it will return empty cell(s) without any
+	 * style settings. So inheritance setting have no effect on them.
+	 * 
+	 * @return true if cell style is inherited when a new cell is added to the
+	 *         table.
+	 * 
+	 * @see #setCellStyleInheritance(boolean)
+	 * @see #appendColumn()
+	 * @see #appendColumns(int)
+	 * @see #appendRow()
+	 * @see #appendRows(int)
+	 * @see #insertColumnsBefore(int, int)
+	 * @see #insertRowsBefore(int, int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 * @see #getCellRangeByPosition(int, int, int, int)
+	 * @see #getCellRangeByPosition(String, String)
+	 * @see #getCellRangeByName(String)
+	 * @see #getColumnByIndex(int)
+	 * @see #getRowByIndex(int)
+	 */
+	protected boolean isCellStyleInheritance() {
+		return mIsCellStyleInheritance;
+	}
+
+	/**
+	 * This method allows users to set whether cell style is inherited or not
+	 * when a new cell is added to the table. Of course, the default setting is
+	 * inherited. In this condition, the style of new column is same with the
+	 * previous column before the inserted position, while the style of new row
+	 * is same with the last row before the inserted position.
+	 * <p>
+	 * This feature setting will influence <code>appendRow()</code>,
+	 * <code>appendColumn()</code>, <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code> and
+	 * <code>insertColumnsBefore()</code>.
+	 * <p>
+	 * For <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>, if need
+	 * automatically expand cells, it will return empty cell(s) without any
+	 * style settings. So inheritance setting have no effect on them.
+	 * 
+	 * @param isEnabled
+	 *            if<code>isEnabled</code> is true, cell style will be inherited
+	 *            by new cell.
+	 *            
+	 * @see #isCellStyleInheritance()
+	 * @see #appendColumn()
+	 * @see #appendColumns(int)
+	 * @see #appendRow()
+	 * @see #appendRows(int)
+	 * @see #insertColumnsBefore(int, int)
+	 * @see #insertRowsBefore(int, int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 * @see #getCellRangeByPosition(int, int, int, int)
+	 * @see #getCellRangeByPosition(String, String)
+	 * @see #getCellRangeByName(String)
+	 * @see #getColumnByIndex(int)
+	 * @see #getRowByIndex(int)
+	 */
+	protected void setCellStyleInheritance(boolean	isEnabled) {
+		mIsCellStyleInheritance=isEnabled;
+	}
+	////////////////////////////////////////////////////////////////////////////////////////////
+	/**
+	 * Return a range of cells within the specified range. The table will be
+	 * automatically expanded as need.
+	 * 
+	 * @param startCol
+	 *            the column index of the first cell inside the range.
+	 * @param startRow
+	 *            the row index of the first cell inside the range.
+	 * @param endCol
+	 *            the column index of the last cell inside the range.
+	 * @param endRow
+	 *            the row index of the last cell inside the range.
+	 * @return the specified cell range.
+	 */
+	public OdfTableCellRange getCellRangeByPosition(int startCol, int startRow,
+			int endCol, int endRow) {
+		// test whether cell position is out of table range and expand table
+		// automatically.
+		getCellByPosition(startCol, startRow);
+		getCellByPosition(endCol, endRow);
+		return new OdfTableCellRange(this, startCol, startRow, endCol, endRow);
+	}
+
+	/**
+	 * Return a range of cells within the specified range. The range is
+	 * specified by the cell address of the first cell and the cell address of
+	 * the last cell. The table will be automatically expanded as need.
+	 * <p>
+	 * The cell address is constructed with a table name, a dot (.), an
+	 * alphabetic value representing the column, and a numeric value
+	 * representing the row. The table name can be omitted. For example:
+	 * "$Sheet1.A1", "Sheet1.A1" and "A1" are all valid cell address.
+	 * 
+	 * @param startAddress
+	 *            the cell address of the first cell inside the range.
+	 * @param endAddress
+	 *            the cell address of the last cell inside the range.
+	 * @return the specified cell range.
+	 */
+	public OdfTableCellRange getCellRangeByPosition(String startAddress,
+			String endAddress) {
+		return getCellRangeByPosition(getColIndexFromCellAddress(startAddress),
+				getRowIndexFromCellAddress(startAddress),
+				getColIndexFromCellAddress(endAddress),
+				getRowIndexFromCellAddress(endAddress));
+	}
+
+	/**
+	 * Return a range of cells by a specified name.
+	 * <p>
+	 * After you get a cell range with <code>getCellRangeByPosition</code>,  
+	 * you can assign a name to this cell range with the method <code>setCellRangeName<code> in class <code>OdfTableCellRange</code>.
+	 * Then you will get a <b>named range</b> which can be represented by name.
+	 * This method can be used to get a named range.
+	 * 
+	 * @param name	the name of the specified named range
+	 * @return	the specified cell range.
+	 */
+	public OdfTableCellRange getCellRangeByName(String name) {
+		NodeList nameRanges;
+		try {
+			nameRanges = mTableElement.getOwnerDocument().getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "named-range");
+			for (int i = 0; i < nameRanges.getLength(); i++) {
+				TableNamedRangeElement nameRange = (TableNamedRangeElement) nameRanges.item(i);
+				if (nameRange.getTableNameAttribute().equals(name)) {
+					String cellRange = nameRange.getTableCellRangeAddressAttribute();
+					String[] addresses = cellRange.split(":");
+					return getCellRangeByPosition(addresses[0], addresses[1]);
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfTable.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	/**
+	 * Return a single cell that is positioned at the specified column and row. 
+	 * The table will be automatically expanded as need.
+	 * 
+	 * @param colIndex  the column index of the cell.
+	 * @param rowIndex  the row index of the cell.
+	 * @return the cell at the specified position
+	 */
+	public OdfTableCell getCellByPosition(int colIndex, int rowIndex) {
+		if (colIndex < 0 || rowIndex < 0) {
+			throw new IllegalArgumentException(
+					"colIndex and rowIndex should be nonnegative integer.");
+		}
+		// expand row as needed.
+		int lastRowIndex = getRowCount() - 1;
+		if (rowIndex > lastRowIndex) {
+			//need clean cell style.
+			appendRows((rowIndex - lastRowIndex), true);
+		}
+		// expand column as needed.
+		int lastColumnIndex = getColumnCount() - 1;
+		if (colIndex > lastColumnIndex) {
+			//need clean cell style.
+			appendColumns((colIndex - lastColumnIndex), true);
+		}
+		OdfTableRow row = getRowByIndex(rowIndex);
+		return row.getCellByIndex(colIndex);
+	}
+
+	//return array of string contain 3 member
+	//1. sheet table name
+	//2. alphabetic represent the column 
+	//3. string represent the row number
+	String[] splitCellAddress(String cellAddress) {
+		String[] returnArray = new String[3];
+		//seperate column and row from cell range
+		StringTokenizer stDot = new StringTokenizer(cellAddress, ".");
+		//get sheet table name and the cell address
+		String cell = "";
+		if (stDot.countTokens() >= 2) {
+			StringTokenizer stDollar = new StringTokenizer(stDot.nextToken(), "$");
+			returnArray[0] = stDollar.nextToken();
+			cell = stDot.nextToken();
+		} else {
+			returnArray[0] = getTableName();
+			cell = stDot.nextToken();
+		}
+
+		//get the column/row number from the cell address
+		StringTokenizer stDollar = new StringTokenizer(cell, "$");
+		if (stDollar.countTokens() >= 2) {
+			returnArray[1] = stDollar.nextToken();
+			returnArray[2] = stDollar.nextToken();
+		} else {
+			cell = stDollar.nextToken();
+			for (int i = 0; i < cell.length(); i++) {
+				if (!Character.isLetter(cell.charAt(i))) {
+					returnArray[1] = cell.substring(0, i);
+					returnArray[2] = cell.substring(i);
+					break;
+				}
+			}
+		}
+		return returnArray;
+
+	}
+
+	/**
+	 * Return a single cell that is positioned at the specified cell address.
+	 * The table can be automatically expanded as need.
+	 * <p>
+	 * The cell address is constructed with a table name, a dot (.), 
+	 * an alphabetic value representing the column, and a numeric value representing the row. 
+	 * The table name can be omitted. For example: "$Sheet1.A1", "Sheet1.A1" and "A1" are all
+	 * valid cell address.
+	 * 
+	 * @param address	the cell address of the cell.
+	 * @return the cell at the specified position.
+	 */
+	public OdfTableCell getCellByPosition(String address) {
+		return getCellByPosition(getColIndexFromCellAddress(address),
+				getRowIndexFromCellAddress(address));
+	}
+
+	//TODO: can put these two method to type.CellAddress
+	int getColIndexFromCellAddress(String cellAddress) {
+		String[] returnArray = splitCellAddress(cellAddress);
+		String colNum = returnArray[1];
+		int colIndex = 0;
+		for (int i = 0; i < colNum.length(); i++) {
+			colIndex = 26 * colIndex;
+			colIndex += (colNum.charAt(i) - 'A') + 1;
+		}
+
+		return (colIndex - 1);
+	}
+
+	int getRowIndexFromCellAddress(String cellAddress) {
+		String[] returnArray = splitCellAddress(cellAddress);
+		return Integer.parseInt(returnArray[2]) - 1;
+	}
+
+	String getAbsoluteCellAddress(int colIndex, int rowIndex) {
+		int remainder = 0;
+		int multiple = colIndex;
+		String cellRange = "";
+		while (multiple != 0) {
+			multiple = colIndex / 26;
+			remainder = colIndex % 26;
+			char c;
+			if (multiple == 0) {
+				c = (char) ('A' + remainder);
+			} else {
+				c = (char) ('A' + multiple - 1);
+			}
+			cellRange = cellRange + String.valueOf(c);
+			colIndex = remainder;
+		}
+		cellRange = "$" + cellRange + "$" + (rowIndex + 1);
+		return cellRange;
+
+	}
+	//the parameter is the column/row index in the ownerTable,rather than in the cell range
+	//if the position is a covered cell, then get the owner cell for it
+
+	OdfTableCell getOwnerCellByPosition(List<CellCoverInfo> coverList, int nCol, int nRow) {
+		CellCoverInfo info;
+		if (!isCoveredCellInOwnerTable(coverList, nCol, nRow)) {
+			OdfTableCell cell = getCellByPosition(nCol, nRow);
+			return cell;
+		} else {
+			for (int m = 0; m < coverList.size(); m++) {
+				info = coverList.get(m);
+				if (((nCol > info.nStartCol) && (nCol <= info.nEndCol)
+						&& (nRow == info.nStartRow) && (nRow == info.nEndRow))
+						|| ((nCol == info.nStartCol) && (nCol == info.nEndCol)
+						&& (nRow > info.nStartRow) && (nRow <= info.nEndRow))
+						|| ((nCol > info.nStartCol) && (nCol <= info.nEndCol)
+						&& (nRow > info.nStartRow) && (nRow <= info.nEndRow))) {
+					OdfTableCell cell = getCellByPosition(info.nStartCol, info.nStartRow);
+					return cell;
+				}
+			}
+		}
+		return null;
+	}
+
+	//the parameter is the column/row index in the ownerTable,rather than in the cell range
+	boolean isCoveredCellInOwnerTable(List<CellCoverInfo> coverList, int nCol, int nRow) {
+		CellCoverInfo info;
+		for (int m = 0; m < coverList.size(); m++) {
+			info = coverList.get(m);
+			if (((nCol > info.nStartCol) && (nCol <= info.nEndCol)
+					&& (nRow == info.nStartRow) && (nRow == info.nEndRow))
+					|| ((nCol == info.nStartCol) && (nCol == info.nEndCol)
+					&& (nRow > info.nStartRow) && (nRow <= info.nEndRow))
+					|| ((nCol > info.nStartCol) && (nCol <= info.nEndCol)
+					&& (nRow > info.nStartRow) && (nRow <= info.nEndRow))) //covered cell
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+
+	List<CellCoverInfo> getCellCoverInfos(int nStartCol, int nStartRow, int nEndCol, int nEndRow) {
+		List<CellCoverInfo> coverList = new ArrayList<CellCoverInfo>();
+		int nColSpan, nRowSpan;
+		for (int i = nStartCol; i < nEndCol + 1; i++) {
+			for (int j = nStartRow; j < nEndRow + 1; j++) {
+				OdfTableCell cell = getCellByPosition(i, j);
+				if (cell != null) {
+					nColSpan = cell.getColumnSpannedNumber();
+					nRowSpan = cell.getRowSpannedNumber();
+					if ((nColSpan > 1) || (nRowSpan > 1)) {
+						coverList.add(new CellCoverInfo(i, j, nColSpan, nRowSpan));
+					}
+				}
+			}
+		}
+		return coverList;
+	}
+
+	//the odfelement of the FTableColumn changed, so we should update the repository here
+	void updateColumnRepository(TableTableColumnElement oldElement, int oldRepeatIndex, TableTableColumnElement newElement, int newRepeatIndex) {
+		if (mColumnRepository.containsKey(oldElement)) {
+			Vector<OdfTableColumn> oldList = mColumnRepository.get(oldElement);
+			if (oldRepeatIndex < oldList.size()) {
+				if (oldElement != newElement) {
+					//the new column replace the old column
+					OdfTableColumn oldColumn = oldList.get(oldRepeatIndex);
+					if (oldColumn != null) {
+						//update the mnRepeateIndex of the column which locate after the removed column
+						for (int i = oldRepeatIndex + 1; i < oldList.size(); i++) {
+							OdfTableColumn column = oldList.get(i);
+							if (column != null) {
+								column.mnRepeatedIndex = i - 1;
+							}
+						}
+						oldList.remove(oldColumn);
+						//oldList.add(oldRepeatIndex, null);
+						if (newElement != null) {
+							oldColumn.maColumnElement = newElement;
+							oldColumn.mnRepeatedIndex = newRepeatIndex;
+							int size = (newRepeatIndex > 7) ? (newRepeatIndex + 1) : 8;
+							Vector<OdfTableColumn> list = new Vector<OdfTableColumn>(size);
+							list.setSize(newRepeatIndex + 1);
+							list.set(newRepeatIndex, oldColumn);
+							mColumnRepository.put(newElement, list);
+						} else {
+							oldColumn.maColumnElement = null;
+						}
+					}
+				} else {
+					//the new column element is equal to the old column element, just change the repeatIndex
+					OdfTableColumn oldColumn = oldList.get(oldRepeatIndex);
+					if (oldColumn != null) {
+						oldList.remove(oldColumn);
+						oldList.add(oldRepeatIndex, null);
+						oldColumn.mnRepeatedIndex = newRepeatIndex;
+						if (newRepeatIndex >= oldList.size()) {
+							oldList.setSize(newRepeatIndex + 1);
+						}
+						oldList.set(newRepeatIndex, oldColumn);
+					} else {
+						getColumnInstance(newElement, newRepeatIndex);
+					}
+				}
+			}
+		}
+	}
+
+	//the odfelement of the FTableRow changed, so we should update the repository here
+	void updateRowRepository(TableTableRowElement oldElement, int oldRepeatIndex, TableTableRowElement newElement, int newRepeatIndex) {
+		if (mRowRepository.containsKey(oldElement)) {
+			Vector<OdfTableRow> oldList = mRowRepository.get(oldElement);
+			if (oldRepeatIndex < oldList.size()) {
+				if (oldElement != newElement) {
+					//the new row replace the old row
+					OdfTableRow oldRow = oldList.get(oldRepeatIndex);
+					Vector<OdfTableCell> updateCellList = new Vector<OdfTableCell>();
+					if (oldRow != null) {
+						//update the mnRepeateIndex of the row which locate after the removed row
+						for (int i = oldRepeatIndex + 1; i < oldList.size(); i++) {
+							OdfTableRow row = oldList.get(i);
+							if (row != null) {
+								//update the cell in this row, 
+								int colNum = getColumnCount();
+								for (int j = 0; j < colNum; j++) {
+									OdfTableCell cell = row.getCellByIndex(j);
+									updateCellList.add(cell);
+								}
+								row.mnRepeatedIndex = i - 1;
+							}
+						}
+						oldList.remove(oldRow);
+						if (newElement != null) {
+							//update the cell in this row
+							int colNum = getColumnCount();
+							OdfTableCell[] oldCells = new OdfTableCell[colNum];
+							for (int j = 0; j < colNum; j++) {
+								oldCells[j] = oldRow.getCellByIndex(j);
+							}
+							///
+							oldRow.maRowElement = newElement;
+							oldRow.mnRepeatedIndex = newRepeatIndex;
+							int size = (newRepeatIndex > 7) ? (newRepeatIndex + 1) : 8;
+							Vector<OdfTableRow> list = new Vector<OdfTableRow>(size);
+							list.setSize(newRepeatIndex + 1);
+							list.set(newRepeatIndex, oldRow);
+							mRowRepository.put(newElement, list);
+							//update the cell in this row
+							OdfTableCell[] newCells = new OdfTableCell[colNum];
+							for (int j = 0; j < colNum; j++) {
+								newCells[j] = oldRow.getCellByIndex(j);
+							}
+							for (int j = 0; j < colNum; j++) {
+								this.updateCellRepository(oldCells[j].getOdfElement(), oldCells[j].mnRepeatedColIndex, oldCells[j].mnRepeatedRowIndex,
+										newCells[j].getOdfElement(), newCells[j].mnRepeatedColIndex, newCells[j].mnRepeatedRowIndex);
+							}
+
+							//update the mnRepeatedRowIndex of the cell which locate after the removed row
+							for (int j = 0; j < updateCellList.size(); j++) {
+								OdfTableCell cell = updateCellList.get(j);
+								if (cell.mnRepeatedRowIndex > oldRepeatIndex) {
+									cell.mnRepeatedRowIndex--;
+								}
+							}
+						} else {
+							oldRow.maRowElement = null;
+						}
+					}
+				} else {
+					//the new row element is equal to the old row element, just change the repeatIndex
+					OdfTableRow oldRow = oldList.get(oldRepeatIndex);
+					if (oldRow != null) {
+						oldList.remove(oldRow);
+						oldList.add(oldRepeatIndex, null);
+						oldRow.mnRepeatedIndex = newRepeatIndex;
+						if (newRepeatIndex >= oldList.size()) {
+							oldList.setSize(newRepeatIndex + 1);
+						}
+						oldList.set(newRepeatIndex, oldRow);
+					} else {
+						getRowInstance(newElement, newRepeatIndex);
+					}
+				}
+			}
+		}
+	}
+
+	//the odfelement of the FTableCell changed, so we should update the repository here
+	void updateCellRepository(TableTableCellElementBase oldElement, int oldRepeatColIndex, int oldRepeatRowIndex,
+			TableTableCellElementBase newElement, int newRepeatColIndex, int newRepeatRowIndex) {
+		if (mCellRepository.containsKey(oldElement)) {
+			OdfTableCell oldCell = null;
+			Vector<OdfTableCell> oldList = mCellRepository.get(oldElement);
+			for (int i = 0; i < oldList.size(); i++) {
+				if (oldList.get(i).getOdfElement() == oldElement
+						&& oldList.get(i).mnRepeatedColIndex == oldRepeatColIndex
+						&& oldList.get(i).mnRepeatedRowIndex == oldRepeatRowIndex) {
+					oldCell = oldList.get(i);
+					break;
+				}
+			}
+			if (oldElement != newElement) {
+				//the new cell replace the old cell
+				if (oldCell != null) {
+					//update the mnRepeateRowIndex &  mnRepeateColIndex of the cell which locate after the removed cell
+					for (int i = 0; i < oldList.size(); i++) {
+						OdfTableCell cell = oldList.get(i);
+						if (cell != null && (cell.getOdfElement() == oldElement)) {
+							if ((cell.mnRepeatedRowIndex == oldRepeatRowIndex)
+									&& (cell.mnRepeatedColIndex > oldRepeatColIndex)) {
+								cell.mnRepeatedColIndex--;
+							}
+						}
+					}
+					oldList.remove(oldCell);
+					if (oldList.size() == 0) {
+						mCellRepository.remove(oldElement);
+					}
+					if (newElement != null) {
+						oldCell.mCellElement = newElement;
+						oldCell.mnRepeatedColIndex = newRepeatColIndex;
+						oldCell.mnRepeatedRowIndex = newRepeatRowIndex;
+						Vector<OdfTableCell> list;
+						if (mCellRepository.containsKey(newElement)) {
+							list = mCellRepository.get(newElement);
+							boolean bReplaced = false;
+							for (int i = 0; i < list.size(); i++) {
+								OdfTableCell cell = list.get(i);
+								if (cell != null && (cell.getOdfElement() == newElement)) {
+									if ((cell.mnRepeatedColIndex == newRepeatColIndex)
+											&& (cell.mnRepeatedRowIndex == newRepeatRowIndex)) {
+										list.remove(i);
+										list.add(i, oldCell);
+										bReplaced = true;
+										break;
+									}
+								}
+							}
+							if (!bReplaced) {
+								list.add(oldCell);
+							}
+						} else {
+							list = new Vector<OdfTableCell>();
+							list.add(oldCell);
+							mCellRepository.put(newElement, list);
+						}
+					} else {
+						oldCell.mCellElement = null;
+						oldCell.mnRepeatedColIndex = 0;
+						oldCell.mnRepeatedRowIndex = 0;
+					}
+				}
+			} else {
+				//the new cell element is equal to the old cell element, just change the repeatIndex
+				if (oldCell != null) {
+					oldCell.mnRepeatedColIndex = newRepeatColIndex;
+					oldCell.mnRepeatedRowIndex = newRepeatRowIndex;
+				} else {
+					getCellInstance(newElement, newRepeatColIndex, newRepeatRowIndex);
+				}
+			}
+		}
+	}
+
+	void updateRepositoryWhenCellElementChanged(int startRow, int endRow, int startClm, int endClm, TableTableCellElement newCellEle) {
+		for (int i = startRow; i < endRow; i++) {
+			for (int j = startClm; j < endClm; j++) {
+				OdfTableCell cell = getCellByPosition(j, i);
+				updateCellRepository(cell.getOdfElement(), cell.mnRepeatedColIndex, cell.mnRepeatedRowIndex,
+						newCellEle, cell.mnRepeatedColIndex, cell.mnRepeatedRowIndex);
+			}
+		}
+	}
+}
+
+/**
+ * Record the Cell Cover Info in this cell range.
+ * <p>
+ * Sometimes the covered cell is not tagged as <table:covered-table-cell> element.
+ *
+ */
+class CellCoverInfo {
+
+	int nStartCol;
+	int nStartRow;
+	int nEndCol;
+	int nEndRow;
+
+	CellCoverInfo(int nSC, int nSR, int nColumnSpan, int nRowSpan) {
+		nStartCol = nSC;
+		nStartRow = nSR;
+		nEndCol = nSC + nColumnSpan - 1;
+		nEndRow = nSR + nRowSpan - 1;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableCell.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableCell.java
new file mode 100644
index 0000000..8a45404
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableCell.java
@@ -0,0 +1,1735 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoWrapOptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencySymbolElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfWhitespaceProcessor;
+import org.odftoolkit.odfdom.type.Color;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * OdfTableCell represents table cell feature in ODF document.
+ * <p>
+ * OdfTable provides methods to get/set/modify the cell content and cell properties.
+ *
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.table.Cell} in Simple API.
+ */
+public class OdfTableCell {
+
+	TableTableCellElementBase mOdfElement;
+	int mnRepeatedColIndex;
+	int mnRepeatedRowIndex;
+	OdfTable mOwnerTable;
+	String msFormatString;
+	/**
+	 * The default date format of table cell.
+	 */
+	private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+	/**
+	 * The default time format of table cell.
+	 */
+	private static final String DEFAULT_TIME_FORMAT = "'PT'HH'H'mm'M'ss'S'";
+	/**
+	 * The default cell back color of table cell.
+	 */
+	private static final String DEFAULT_BACKGROUND_COLOR = "#FFFFFF";
+	/**
+	 * The default column spanned number.
+	 */
+	private static final int DEFAULT_COLUMN_SPANNED_NUMBER = 1;
+	/**
+	 * The default row spanned number.
+	 */
+	private static final int DEFAULT_ROW_SPANNED_NUMBER = 1;
+	/**
+	 * The default columns repeated number.
+	 */
+	private static final int DEFAULT_COLUMNS_REPEATED_NUMBER = 1;
+	TableTableCellElementBase mCellElement;
+	OdfDocument mDocument;
+
+	OdfTableCell(TableTableCellElementBase odfElement, int repeatedColIndex, int repeatedRowIndex) {
+		mCellElement = odfElement;
+		mnRepeatedColIndex = repeatedColIndex;
+		mnRepeatedRowIndex = repeatedRowIndex;
+		mOwnerTable = getTable();
+		mDocument = ((OdfDocument) ((OdfFileDom) mCellElement.getOwnerDocument()).getDocument());
+	}
+
+	/**
+	 * Get the <code>OdfTableCell</code> instance from the <code>TableTableCellElementBase</code> instance.
+	 * <p>
+	 * Each <code>TableTableCellElementBase</code> instance has a one-to-one relationship to the a <code>OdfTableCell</code> instance.
+	 * 
+	 * @param cellElement	the cell element that need to get the corresponding <code>OdfTableCell</code> instance
+	 * @return the <code>OdfTableCell</code> instance that represents a specified cell element
+	 */
+	public static OdfTableCell getInstance(TableTableCellElementBase cellElement) {
+		TableTableElement tableElement = null;
+		Node node = cellElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				tableElement = (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		OdfTable table = null;
+		if (tableElement != null) {
+			table = OdfTable.getInstance(tableElement);
+		} else {
+			throw new IllegalArgumentException("the cellElement is not in the table dom tree");
+		}
+
+		OdfTableCell cell = table.getCellInstance(cellElement, 0, 0);
+		int colRepeatedNum = cell.getColumnsRepeatedNumber();
+		int rowRepeatedNum = cell.getTableRow().getRowsRepeatedNumber();
+		if (colRepeatedNum > 1 && rowRepeatedNum > 1) {
+			if (colRepeatedNum > 1) {
+				Logger.getLogger(OdfTableCell.class.getName()).log(Level.WARNING, "the cell has the repeated column number, and puzzled about get which repeated column index of the cell,");
+			}
+			if (rowRepeatedNum > 1) {
+				Logger.getLogger(OdfTableCell.class.getName()).log(Level.WARNING, "the row contains the current cell has the repeated row number, and puzzled about get which repeated row index of the cell,");
+			}
+			Logger.getLogger(OdfTableCell.class.getName()).log(Level.WARNING, "here just return the first cell that the repeated column index is 0 and repeated row index is 0, too.");
+		}
+		return cell;
+	}
+
+	/**
+	 * Return the horizontal alignment setting of this cell.
+	 * <p>
+	 * The returned value can be "center", "end", "justify", "left", "right", or "start".
+	 * If no horizontal alignment is set, null will be returned.
+	 * 
+	 * @return the horizontal alignment setting. 
+	 */
+	public String getHorizontalAlignment() {
+		OdfStyleBase styleElement = getCellStyleElement();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "text-align"));
+			return styleElement.getProperty(property);
+		}
+		return null;
+	}
+
+	/**
+	 * Set the horizontal alignment setting of this cell.
+	 * <p>
+	 * The parameter can be "center", "end", "justify", "left", "right", or "start".
+	 * Actually, "left" will be interpreted as "start", while "right" will be interpreted as "end".
+	 * If argument is null, the explicit horizontal alignment setting is removed.
+	 * 
+	 * @param horizontalAlignment	the horizontal alignment setting.
+	 */
+	public void setHorizontalAlignment(String horizontalAlignment) {
+		if (FoTextAlignAttribute.Value.LEFT.toString().equalsIgnoreCase(horizontalAlignment)) {
+			horizontalAlignment = FoTextAlignAttribute.Value.START.toString();
+		}
+		if (FoTextAlignAttribute.Value.RIGHT.toString().equalsIgnoreCase(horizontalAlignment)) {
+			horizontalAlignment = FoTextAlignAttribute.Value.END.toString();
+		}
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getCellStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(
+					OdfDocumentNamespace.FO, "text-align"));
+			if (horizontalAlignment != null) {
+				styleElement.setProperty(property, horizontalAlignment);
+			} else {
+				styleElement.removeProperty(property);
+			}
+		}
+	}
+
+	/**
+	 * Return the vertical alignment setting of this cell.
+	 * <p>
+	 * The returned value can be "auto", "automatic", "baseline", "bottom", "middle", or "top".
+	 * 
+	 * @return the vertical alignment setting of this cell. 
+	 */
+	public String getVerticalAlignment() {
+		OdfStyleBase styleElement = getCellStyleElement();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+			return styleElement.getProperty(property);
+		}
+		return null;
+	}
+
+	/**
+	 * Set the vertical alignment setting of this cell.
+	 * <p>
+	 * The parameter can be "auto", "automatic", "baseline", "bottom", "middle", or "top".
+	 * If argument is null, the explicit vertical alignment setting is removed.
+	 * 
+	 * @param verticalAlignment	the vertical alignment setting.
+	 */
+	public void setVerticalAlignment(String verticalAlignment) {
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getCellStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(
+					OdfDocumentNamespace.STYLE, "vertical-align"));
+			if (verticalAlignment != null) {
+				styleElement.setProperty(property, verticalAlignment);
+			} else {
+				styleElement.removeProperty(property);
+			}
+		}
+	}
+
+	/**
+	 * Return the wrap option of this cell.
+	 * @return true if the cell content can be wrapped; 
+	 * <p>
+	 * false if the cell content cannot be wrapped.
+	 */
+	public boolean isTextWrapped() {
+		OdfStyleBase styleElement = getCellStyleElement();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "wrap-option"));
+			String wrapped = styleElement.getProperty(property);
+			if ((wrapped != null) && (wrapped.equals(FoWrapOptionAttribute.Value.WRAP.toString()))) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Set the wrap option of this cell.
+	 * @param isTextWrapped	whether the cell content can be wrapped or not
+	 */
+	public void setTextWrapped(boolean isTextWrapped) {
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getCellStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "wrap-option"));
+			if (isTextWrapped) {
+				styleElement.setProperty(property, FoWrapOptionAttribute.Value.WRAP.toString());
+			} else {
+				styleElement.setProperty(property, FoWrapOptionAttribute.Value.NO_WRAP.toString());
+			}
+		}
+	}
+
+	private TableTableRowElement findRowInTableHeaderRows(TableTableHeaderRowsElement headers, TableTableRowElement tr, int[] indexs) {
+		int result = 0;
+		for (Node m : new DomNodeList(headers.getChildNodes())) {
+			if (m == tr) {
+				indexs[0] = result;
+				return tr;
+			}
+			if (m instanceof TableTableRowElement) {
+				result += ((TableTableRowElement) m).getTableNumberRowsRepeatedAttribute().intValue();
+			}
+		}
+		indexs[0] = result;
+		return null;
+	}
+
+	private TableTableRowElement findRowInTableRows(TableTableRowsElement rows, TableTableRowElement tr, int[] indexs) {
+		int result = 0;
+		for (Node m : new DomNodeList(rows.getChildNodes())) {
+			if (m == tr) {
+				indexs[0] = result;
+				return tr;
+			}
+			if (m instanceof TableTableRowElement) {
+				result += ((TableTableRowElement) m).getTableNumberRowsRepeatedAttribute().intValue();
+			}
+		}
+		indexs[0] = result;
+		return null;
+	}
+
+	private TableTableRowElement findRowInTableRowGroup(OdfElement group, TableTableRowElement tr, int[] indexs) {
+		int result = 0;
+		int[] resultIndexs = new int[1];
+
+		if (!(group instanceof TableTableRowGroupElement) && !(group instanceof TableTableElement)) {
+			indexs[0] = 0;
+			return null;
+		}
+
+		for (Node m : new DomNodeList(group.getChildNodes())) {
+			if (m instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) m;
+				TableTableRowElement returnEle = findRowInTableHeaderRows(headers, tr, resultIndexs);
+				result += resultIndexs[0];
+				if (returnEle != null) {//find
+					indexs[0] = result;
+					return returnEle;
+				}
+			} else if (m instanceof TableTableRowGroupElement) {
+				TableTableRowGroupElement aGroup = (TableTableRowGroupElement) m;
+				TableTableRowElement returnEle = findRowInTableRowGroup(aGroup, tr, resultIndexs);
+				result += resultIndexs[0];
+				if (returnEle != null) {//find
+					indexs[0] = result;
+					return returnEle;
+				}
+			} else if (m instanceof TableTableRowsElement) {
+				TableTableRowsElement rows = (TableTableRowsElement) m;
+				TableTableRowElement returnEle = findRowInTableRows(rows, tr, resultIndexs);
+				result += resultIndexs[0];
+				if (returnEle != null) {//find
+					indexs[0] = result;
+					return returnEle;
+				}
+			} else if (m instanceof TableTableRowElement) {
+				if (m == tr) { //find
+					indexs[0] = result;
+					return tr;
+				}
+				result += ((TableTableRowElement) m).getTableNumberRowsRepeatedAttribute().intValue();
+			}
+		}
+		indexs[0] = result;
+		return null;
+	}
+
+	/**
+	 * Get the index of the table row which contains this cell.
+	 * @return the index of the row containing this cell
+	 */
+	public int getRowIndex() {
+		TableTableElement table = getTableElement();
+		TableTableRowElement tr = getTableRowElement();
+		int[] indexs = new int[1];
+
+		TableTableRowElement returnEle = findRowInTableRowGroup(table, tr, indexs);
+		if (returnEle != null) {
+			return (indexs[0] + mnRepeatedRowIndex);
+		} else {
+			return -1;
+		}
+	}
+
+	/**
+	 * Get an instance of table feature which contains this cell.
+	 * @return the table containing this cell
+	 */
+	public OdfTable getTable() {
+		TableTableElement tableElement = getTableElement();
+		if (tableElement != null) {
+			return OdfTable.getInstance(tableElement);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the index of the table column which contains this cell.
+	 * @return the index of the column containing this cell
+	 */
+	public int getColumnIndex() {
+		TableTableRowElement tr = (TableTableRowElement) mCellElement.getParentNode();
+		int result = 0;
+		for (Node n : new DomNodeList(tr.getChildNodes())) {
+			if (n == mCellElement) {
+				return result + mnRepeatedColIndex;
+			}
+			if (n instanceof TableTableCellElementBase) {
+				result += ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute().intValue();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Get the instance of table column feature which contains this cell.
+	 * @return the instance of table column feature which contains the cell.
+	 */
+	public OdfTableColumn getTableColumn() {
+		OdfTable table = getTable();
+		int index = getColumnIndex();
+		return table.getColumnByIndex(index);
+	}
+
+	TableTableColumnElement getTableColumnElement() {
+		//return OdfTableCellBaseImpl.getTableColumn((OdfTableCellBase) mCellElement);
+		TableTableElement tableElement = getTableElement();
+		int columnindex = getColumnIndex();
+		OdfTable fTable = OdfTable.getInstance(tableElement);
+		return fTable.getColumnElementByIndex(columnindex);
+	}
+
+	/**
+	 * Get the instance of table row feature which contains this cell.
+	 * @return the instance of table row feature which contains the cell.
+	 */
+	public OdfTableRow getTableRow() {
+		OdfTable table = getTable();
+		int index = getRowIndex();
+		return table.getRowByIndex(index);
+	}
+
+	private TableTableRowElement getTableRowElement() {
+		Node node = mCellElement.getParentNode();
+		if (node instanceof TableTableRowElement) {
+			return (TableTableRowElement) node;
+		}
+		return null;
+	}
+
+	/**
+	 * Get the table object who contains this cell.
+	 * @return the table object who contains the cell.
+	 */
+	private TableTableElement getTableElement() {
+		Node node = mCellElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				return (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	/**
+	 * Get the cell that covers this cell.
+	 * <p>
+	 * If the cell is a covered cell, the owner cell will be returned;
+	 * if the cell is a real cell , the cell itself will be returned.
+	 * @return the cell that covers the current cell
+	 */
+	public OdfTableCell getOwnerTableCell() {
+		OdfTable ownerTable = getTable();
+		List<CellCoverInfo> coverList = ownerTable.getCellCoverInfos(0, 0, ownerTable.getColumnCount() - 1, ownerTable.getRowCount() - 1);
+		return ownerTable.getOwnerCellByPosition(coverList, getColumnIndex(), getRowIndex());
+	}
+
+	/**
+	 * Get the instance of <code>TableTableCellElementBase</code> which represents this cell.
+	 * @return the instance of <code>TableTableCellElementBase</code> 
+	 */
+	public TableTableCellElementBase getOdfElement() {
+		return mCellElement;
+	}
+
+	/**
+	 * Return the currency code of this cell, for example, "USD", "EUR", "CNY", and etc. 
+	 * <p>
+	 * If the value type is not "currency", an IllegalArgumentException will be thrown.
+	 * 
+	 * @return the currency code
+	 * <p>
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown if the value type is not "currency".
+	 */
+	public String getCurrencyCode() {
+		if (mCellElement.getOfficeValueTypeAttribute().equals(OfficeValueTypeAttribute.Value.CURRENCY.toString())) {
+			return mCellElement.getOfficeCurrencyAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the currency code of this cell, for example, "USD", "EUR", "CNY", and etc.
+	 * 
+	 * @param currency	the currency code that need to be set.
+	 * @throws IllegalArgumentException  If input <code>currency</code> is null, an IllegalArgumentException will be thrown.
+	 */
+	public void setCurrencyCode(String currency) {
+		if (currency == null) {
+			throw new IllegalArgumentException(
+					"Currency code of cell should not be null.");
+		}
+		splitRepeatedCells();
+		if (mCellElement.getOfficeValueTypeAttribute().equals(OfficeValueTypeAttribute.Value.CURRENCY.toString())) {
+			mCellElement.setOfficeCurrencyAttribute(currency);
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	private void setTypeAttr(OfficeValueTypeAttribute.Value type) {
+		mCellElement.setOfficeValueTypeAttribute(type.toString());
+	}
+
+	/**
+	 * Set the value type of this cell.
+	 * The parameter can be "boolean", "currency", "date", "float", "percentage", "string" or "time".
+	 * <p>
+	 * If the parameter <code>type</code> is not a valid cell type, an IllegalArgumentException will be thrown.
+	 * 
+	 * @param type	the type that need to be set
+	 * If input type is null, an IllegalArgumentException will be thrown.
+	 */
+	public void setValueType(String type) {
+		if (type == null) {
+			throw new IllegalArgumentException("type shouldn't be null.");
+		}
+		String sType = type.toLowerCase();
+		OfficeValueTypeAttribute.Value value = OfficeValueTypeAttribute.Value.enumValueOf(sType);
+		if (value == null) {
+			throw new IllegalArgumentException("the value type of cell is not valid");
+		}
+
+		mCellElement.setOfficeValueTypeAttribute(sType);
+	}
+
+	/**
+	 * Get the value type of this cell.
+	 * The returned value can be "boolean", "currency", "date", "float", "percentage", "string" or "time".
+	 * If no value type is set, null will be returned.
+	 * 
+	 * @return the type of the cell
+	 */
+	public String getValueType() {
+		return mCellElement.getOfficeValueTypeAttribute();
+	}
+
+	private OfficeValueTypeAttribute.Value getTypeAttr() {
+		String type = mCellElement.getOfficeValueTypeAttribute();
+		return OfficeValueTypeAttribute.Value.enumValueOf(type);
+	}
+
+	/**
+	 * Get the double value of this cell as Double object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "float".
+	 * 
+	 * @return the double value of this cell as a Double object. If the cell value is empty, null will be returned.
+	 * <p>
+	 * An IllegalArgumentException will be thrown if the cell type is not "float".
+	 */
+	public Double getDoubleValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.FLOAT) {
+			return mCellElement.getOfficeValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Get the currency value of this cell as Double object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "currency".
+	 * 
+	 * @return the currency value of this cell as a Double object. If the cell value is empty, null will be returned.
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown if the cell type is not "currency".
+	 */
+	public Double getCurrencyValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.CURRENCY) {
+			return mCellElement.getOfficeValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Get the symbol of currency.
+	 * @return the currency symbol
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown if the value type is not "currency".
+	 */
+	public String getCurrencySymbol() {
+		if (getTypeAttr() != OfficeValueTypeAttribute.Value.CURRENCY) {
+			throw new IllegalArgumentException();
+		}
+
+		OdfStyle style = getCellStyleElement();
+		if (style != null) {
+			String dataStyleName = style.getOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.STYLE, "data-style-name"));
+			OdfNumberCurrencyStyle dataStyle = mCellElement.getAutomaticStyles().getCurrencyStyle(dataStyleName);
+			if (dataStyle == null) {
+				dataStyle = mDocument.getDocumentStyles().getCurrencyStyle(dataStyleName);
+			}
+			if ((dataStyle != null) && (dataStyle.getCurrencySymbolElement() != null)) {
+				return dataStyle.getCurrencySymbolElement().getTextContent();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Set the value and currency of the cell, and set the value type as "currency". 
+	 * If<code>value</value> is null, the cell value will be removed.
+	 * 
+	 * @param value  the value that will be set 
+	 * @param currency	the currency that will be set.
+	 * @throws IllegalArgumentException  If input currency is null, an IllegalArgumentException will be thrown.
+	 */
+	public void setCurrencyValue(Double value, String currency) {
+		if (currency == null) {
+			throw new IllegalArgumentException("currency shouldn't be null.");
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.CURRENCY);
+		mCellElement.setOfficeValueAttribute(value);
+		mCellElement.setOfficeCurrencyAttribute(currency);
+	}
+
+	/**
+	 * Get the cell percentage value as Double object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "percentage".
+	 * 
+	 * @return the percentage value of this cell as a Double object. If the cell value is empty, null will be returned.
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown if the cell type is not "percentage".
+	 */
+	public Double getPercentageValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			return mCellElement.getOfficeValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a percentage value and set the value type as percentage too.
+	 * If<code>value</value> is null, the cell value will be removed.
+	 * 
+	 * @param value	the value that will be set
+	 */
+	public void setPercentageValue(Double value) {
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.PERCENTAGE);
+		mCellElement.setOfficeValueAttribute(value);
+	}
+
+	/**
+	 * Get the text displayed in this cell.
+	 * 
+	 * @return the text displayed in this cell
+	 */
+	public String getDisplayText() {
+		//TODO: This function doesn't work well if a cell contains a list.
+		//Refer to testGetSetTextValue();
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+		return textProcessor.getText(mCellElement);
+	}
+
+	/**
+	 * Set the text displayed in this cell.
+	 * <p>
+	 * Please note the displayed text in ODF viewer might be different with the value set by this method,
+	 * because the displayed text in ODF viewer is calculated and set by editor. 
+	 * 
+	 * @param content	the displayed text. 
+	 * If content is null, it will display the empty string instead. 
+	 */
+	public void setDisplayText(String content) {
+		if (content == null) {
+			content = "";
+		}
+		removeContent();
+
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+		OdfTextParagraph para = new OdfTextParagraph((OdfFileDom) mCellElement.getOwnerDocument());
+		textProcessor.append(para, content);
+
+		mCellElement.appendChild(para);
+	}
+
+	/**
+	 * Set the text displayed in this cell, with a specified style name.
+	 * <p>
+	 * Please note the displayed text in ODF viewer might be different with the value set by this method,
+	 * because the displayed text in ODF viewer are calculated and set by editor. 
+	 * 
+	 * @param content    the displayed text. If content is null, it will display the empty string instead. 
+	 * @param stylename  the style name. If stylename is null, the content will use the default paragraph style.
+	 */
+	public void setDisplayText(String content, String stylename) {
+		if (content == null) {
+			content = "";
+		}
+		removeContent();
+
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+		OdfTextParagraph para = new OdfTextParagraph((OdfFileDom) mCellElement.getOwnerDocument());
+		if ((stylename != null) && (stylename.length() > 0)) {
+			para.setStyleName(stylename);
+		}
+		textProcessor.append(para, content);
+
+		mCellElement.appendChild(para);
+	}
+
+	/**
+	 * Set the cell value as a double and set the value type to be "float".
+	 * 
+	 * @param value	the double value that will be set. If<code>value</value> is null, the cell value will be removed.
+	 */
+	public void setDoubleValue(Double value) {
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.FLOAT);
+		mCellElement.setOfficeValueAttribute(value);
+		setDisplayText(value + "");
+	}
+
+	/**
+	 * Get the cell boolean value as Boolean object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "boolean".
+	 * 
+	 * @return the Boolean value of cell. If the cell value is empty, null will be returned.
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown if the cell type is not "boolean".
+	 */
+	public Boolean getBooleanValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.BOOLEAN) {
+			return mCellElement.getOfficeBooleanValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a boolean and set the value type to be boolean. If<code>value</value> is null, the cell value will be removed.
+	 * 
+	 * @param value	the value of boolean type
+	 */
+	public void setBooleanValue(Boolean value) {
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.BOOLEAN);
+		mCellElement.setOfficeBooleanValueAttribute(value);
+		setDisplayText(value + "");
+	}
+
+	/**
+	 * Get the cell date value as Calendar.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "date".
+	 * 
+	 * @return the Calendar value of cell
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown, if the cell type is not "date".
+	 */
+	public Calendar getDateValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.DATE) {
+			String dateStr = mCellElement.getOfficeDateValueAttribute();
+			if (dateStr == null) {
+				return null;
+			}
+			Date date = parseString(dateStr, DEFAULT_DATE_FORMAT);
+			Calendar calender = Calendar.getInstance();
+			calender.setTime(date);
+			return calender;
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a date, and set the value type to be "date".
+	 * 
+	 * @param date	the value of {@link java.util.Calendar java.util.Calendar} type.
+	 */
+	public void setDateValue(Calendar date) {
+		if (date == null) {
+			throw new IllegalArgumentException("date shouldn't be null.");
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.DATE);
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
+		String svalue = simpleFormat.format(date.getTime());
+		mCellElement.setOfficeDateValueAttribute(svalue);
+		setDisplayText(svalue);
+	}
+
+	/**
+	 * Set the cell value as a string, and set the value type to be string.
+	 * 
+	 * @param str	the value of string type. 
+	 * If input string is null, an empty string will be set.
+	 */
+	public void setStringValue(String str) {
+		if (str == null) {
+			str = "";
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.STRING);
+		mCellElement.setOfficeStringValueAttribute(str);
+		setDisplayText(str);
+	}
+
+	//Note: if you want to change the cell
+	//splitRepeatedCells must be called first in order to 
+	//1. update parent row if the row is the repeated rows.
+	//2. update the cell itself if the cell is the column repeated cells.
+	void splitRepeatedCells() {
+		OdfTable table = getTable();
+		//1.if the parent row is the repeated row
+		//the repeated row has to be separated
+		//after this the cell element and repeated index will be updated
+		//according to the new parent row
+		OdfTableRow row = getTableRow();
+		int colIndex = getColumnIndex();
+		if (row.getRowsRepeatedNumber() > 1) {
+			row.splitRepeatedRows();
+			OdfTableCell cell = row.getCellByIndex(colIndex);
+			mCellElement = cell.getOdfElement();
+			mnRepeatedColIndex = cell.mnRepeatedColIndex;
+			mnRepeatedRowIndex = cell.mnRepeatedRowIndex;
+		}
+
+		//2.if the cell is the column repeated cell
+		//this repeated cell has to be separated
+		int repeateNum = getColumnsRepeatedNumber();
+		if (repeateNum > 1) {
+			//change this repeated column to several single columns
+			TableTableCellElementBase ownerCellElement = null;
+			int repeatedColIndex = mnRepeatedColIndex;
+			Node refElement = mCellElement;
+			for (int i = repeateNum - 1; i >= 0; i--) {
+				TableTableCellElementBase newCell = (TableTableCellElementBase) mCellElement.cloneNode(true);
+				newCell.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+				row.getOdfElement().insertBefore(newCell, refElement);
+				refElement = newCell;
+				if (repeatedColIndex == i) {
+					ownerCellElement = newCell;
+				} else {
+					table.updateCellRepository(mCellElement, i, mnRepeatedRowIndex, newCell, 0, mnRepeatedRowIndex);
+				}
+			}
+			//remove this column element
+			row.getOdfElement().removeChild(mCellElement);
+
+			if (ownerCellElement != null) {
+				table.updateCellRepository(mCellElement, mnRepeatedColIndex, mnRepeatedRowIndex, ownerCellElement, 0, mnRepeatedRowIndex);
+				mCellElement = ownerCellElement;
+				mnRepeatedColIndex = 0;
+			}
+		}
+	}
+
+	/**
+	 * Get the cell value as a string.
+	 * <p>
+	 * If the cell type is not string, the display text will be returned.
+	 * 
+	 * @return the string value of this cell, or the display text
+	 */
+	public String getStringValue() {
+		return getDisplayText();
+	}
+
+	/**
+	 * Get the cell value as {@link java.util.Calendar java.util.Calendar}.
+	 * <p>
+	 * Throw exception if the cell type is not "time".
+	 * 
+	 * @return the Calendar value of cell
+	 * @throws IllegalArgumentException  an IllegalArgumentException will be thrown if the cell type is not time.
+	 */
+	public Calendar getTimeValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.TIME) {
+			String timeStr = mCellElement.getOfficeTimeValueAttribute();
+                        if (timeStr == null) {
+                            return null;
+                        }
+			Date date = parseString(timeStr, DEFAULT_TIME_FORMAT);
+			Calendar calender = Calendar.getInstance();
+			calender.setTime(date);
+			calender.clear(Calendar.YEAR);
+			calender.clear(Calendar.MONTH);
+			calender.clear(Calendar.DAY_OF_MONTH);
+			return calender;
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a time and set the value type to be "time" too.
+	 * 
+	 * @param time  the value of {@link java.util.Calendar java.util.Calendar} type.
+	 * @throws IllegalArgumentException   If input time is null, an IllegalArgumentException exception will be thrown.
+	 */
+	public void setTimeValue(Calendar time) {
+		if (time == null) {
+			throw new IllegalArgumentException("time shouldn't be null.");
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.TIME);
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
+		String svalue = simpleFormat.format(time.getTime());
+		mCellElement.setOfficeTimeValueAttribute(svalue);
+		setDisplayText(svalue);
+	}
+
+	private Date parseString(String value, String format) {
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(format);
+		Date simpleDate = null;
+		try {
+			simpleDate = simpleFormat.parse(value);
+		} catch (ParseException e) {
+			Logger.getLogger(OdfTableCell.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			return null;
+		}
+		return simpleDate;
+	}
+
+	/**
+	 * Get the background color of this cell.
+	 * <p>
+	 * If no background color is set, default background color "#FFFFFF" will be returned.
+	 * 
+	 * @return the background color of this cell 
+	 */
+	public Color getCellBackgroundColor() {
+		Color color = Color.WHITE;
+		OdfStyleBase styleElement = getCellStyleElement();
+		if (styleElement != null) {
+			OdfStyleProperty bkColorProperty = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+			String property = styleElement.getProperty(bkColorProperty);
+			if (property != null) {
+				try {
+					color = new Color(property);
+				} catch (Exception e) {
+					// use default background color White
+					color = Color.WHITE;
+					Logger.getLogger(OdfTableCell.class.getName()).log(Level.WARNING, e.getMessage());
+				}
+			}
+		}
+		return color;
+	}
+
+	/**
+	 * Get the background color string of this cell.
+	 * <p>
+	 * If no background color is set, default background color "#FFFFFF" will be returned.
+	 * 
+	 * @return the background color of this cell 
+	 */
+	public String getCellBackgroundColorString() {
+		String color = DEFAULT_BACKGROUND_COLOR;
+		OdfStyleBase styleElement = getCellStyleElement();
+		if (styleElement != null) {
+			OdfStyleProperty bkColorProperty = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+			String property = styleElement.getProperty(bkColorProperty);
+			if (Color.isValid(property)) {
+				color = property;
+			}
+		}
+		return color;
+	}
+
+	/**
+	 * Set the background color of this cell.
+	 * 
+	 * @param cellBackgroundColor
+	 *            the background color that need to set. 
+	 *            If <code>cellBackgroundColor</code> is null, default background color <code>Color.WHITE</code> will be set.
+	 */
+	public void setCellBackgroundColor(Color cellBackgroundColor) {
+		if (cellBackgroundColor == null) {
+			cellBackgroundColor = Color.WHITE;
+		}
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getCellStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty bkColorProperty = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+			styleElement.setProperty(bkColorProperty, cellBackgroundColor.toString());
+		}
+	}
+
+	/**
+	 * Set the background color of this cell using string. The string must be a valid argument for 
+	 * constructing {@link org.odftoolkit.odfdom.type.Color <code>org.odftoolkit.odfdom.type.Color</code>}. 
+	 * 
+	 * @param cellBackgroundColor
+	 *            the background color that need to set. 
+	 *            If cellBackgroundColor is null, default background color #FFFFFF will be set.
+	 * @see org.odftoolkit.odfdom.type.Color
+	 */
+	public void setCellBackgroundColor(String cellBackgroundColor) {
+		if (!Color.isValid(cellBackgroundColor)) {
+			Logger.getLogger(OdfTableCell.class.getName()).log(Level.WARNING, "Parameter is invalid for datatype Color, default background color #FFFFFF will be set.");
+			cellBackgroundColor = DEFAULT_BACKGROUND_COLOR;
+		}
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getCellStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty bkColorProperty = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties,
+					OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+			styleElement.setProperty(bkColorProperty, cellBackgroundColor);
+		}
+	}
+
+	/**
+	 * Get the column spanned number of this cell.
+	 * 
+	 * @return the column spanned number
+	 */
+	int getColumnSpannedNumber() {
+		if (mCellElement instanceof TableCoveredTableCellElement) {
+			return 1;
+		}
+		Integer value = ((TableTableCellElement) mCellElement).getTableNumberColumnsSpannedAttribute();
+		if (value != null) {
+			return value.intValue();
+		}
+		return DEFAULT_COLUMN_SPANNED_NUMBER;
+	}
+
+	/**
+	 * Get the column repeated number of this cell.
+	 * 
+	 * @return the column repeated number
+	 */
+	int getColumnsRepeatedNumber() {
+		Integer value = mCellElement.getTableNumberColumnsRepeatedAttribute();
+		if (value != null) {
+			return value.intValue();
+		}
+		return DEFAULT_COLUMNS_REPEATED_NUMBER;
+	}
+
+	/**
+	 * Get the row spanned number of this cell.
+	 * 
+	 * @return the row spanned number
+	 */
+	int getRowSpannedNumber() {
+		if (mCellElement instanceof TableCoveredTableCellElement) {
+			return 1;
+		}
+		Integer value = ((TableTableCellElement) mCellElement).getTableNumberRowsSpannedAttribute();
+		if (value != null) {
+			return value.intValue();
+		}
+		return DEFAULT_ROW_SPANNED_NUMBER;
+	}
+
+	/**
+	 * Set the column spanned number.
+	 * 
+	 * @param spannedNum
+	 *            the column spanned number to be set. If spannedNum is less than 1,
+	 *            default column spanned number 1 will be
+	 *            set.
+	 */
+	void setColumnSpannedNumber(int spannedNum) {
+		if (spannedNum < 1) {
+			spannedNum = DEFAULT_COLUMN_SPANNED_NUMBER;
+		}
+		splitRepeatedCells();
+		if (mCellElement instanceof TableTableCellElement) {
+			((TableTableCellElement) mCellElement).setTableNumberColumnsSpannedAttribute(new Integer(spannedNum));
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the column repeated number.
+	 * 
+	 * @param repeatedNum
+	 *            the column repeated number that need to be set. If repeatedNum
+	 *            is less than 1, default columns repeated number 1 will be set.
+	 */
+	void setColumnsRepeatedNumber(int repeatedNum) {
+		if (repeatedNum < 1) {
+			repeatedNum = DEFAULT_COLUMNS_REPEATED_NUMBER;
+		}
+		mCellElement.setTableNumberColumnsRepeatedAttribute(new Integer(repeatedNum));
+	}
+
+	/**
+	 * Set the row spanned number.
+	 * 
+	 * @param spannedNum	row spanned number that need to be set 
+	 *            the row spanned number that need to be set. If spannedNum is
+	 *            less than 1, default row spanned number 1 will be
+	 *            set.
+	 */
+	void setRowSpannedNumber(int spannedNum) {
+		if (spannedNum < 1) {
+			spannedNum = DEFAULT_ROW_SPANNED_NUMBER;
+		}
+		splitRepeatedCells();
+		if (mCellElement instanceof TableTableCellElement) {
+			((TableTableCellElement) mCellElement).setTableNumberRowsSpannedAttribute(new Integer(spannedNum));
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Judge if the ODF DOM element of this cell is the covered cell element.
+	 * 
+	 * @return true if the ODFDOM element is TableCoveredTableCellElement
+	 */
+	boolean isCoveredElement() {
+		if (mCellElement instanceof TableCoveredTableCellElement) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Get the style name of this cell.
+	 * 
+	 * @return the name of the style
+	 */
+	public String getStyleName() {
+		OdfStyle style = getCellStyleElement();
+		if (style == null) {
+			return "";
+		}
+		return style.getStyleNameAttribute();
+	}
+
+	/** 
+	 * Set a formula to the cell.
+	 * <p>
+	 * Please note, the parameter <code>formula</code> will not be checked and interpreted;
+	 * the cell value will not be calculated.
+	 * It's just simply set as a formula attribute. See {@odf.attribute table:formula}
+	 * 
+	 * @param formula	the formula that need to be set.
+	 * @throws IllegalArgumentException  if formula is null, an IllegalArgumentException will be thrown.
+	 */
+	public void setFormula(String formula) {
+		if (formula == null) {
+			throw new IllegalArgumentException("formula shouldn't be null.");
+		}
+		splitRepeatedCells();
+		mCellElement.setTableFormulaAttribute(formula);
+	}
+
+	/**
+	 * Get the formula string of the cell.
+	 * 
+	 * @return the formula representation of the cell
+	 * <p>
+	 * If the cell does not contain a formula, null will be returned.
+	 * 
+	 */
+	public String getFormula() {
+		return mCellElement.getTableFormulaAttribute();
+	}
+
+//	/**
+//	 * get the error value of the cell
+//	 * if the formula can not be calculated, an error will be set
+//	 * @return
+//	 * 			return 0 if the cell has no error
+//	 * 			return the error value of the cell if the formula result can not be calculated
+//	 * 			such as divided by 0
+//	 */
+//	public long getError()
+//	{
+//		return 0;
+//	}
+	/**
+	 * Set the currency symbol and overall format of a currency cell.
+	 * <p>
+	 * Please note the overall format includes the symbol character, for example: $#,##0.00.
+	 * <p>
+	 * This function only works for currency.
+	 * @param currencySymbol	the currency symbol
+	 * @param format			overall format
+	 * @throws IllegalArgumentException  if input currencySymbol or format is null, an IllegalArgumentException will be thrown.
+	 */
+	public void setCurrencyFormat(String currencySymbol, String format) {
+		if (currencySymbol == null) {
+			throw new IllegalArgumentException(
+					"currencySymbol shouldn't be null.");
+		}
+		if (format == null) {
+			throw new IllegalArgumentException("format shouldn't be null.");
+		}
+		splitRepeatedCells();
+		String type = mCellElement.getOfficeValueTypeAttribute();
+		OfficeValueTypeAttribute.Value typeValue = null;
+		msFormatString = format;
+		if (type != null) {
+			typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		}
+
+		if (typeValue != OfficeValueTypeAttribute.Value.CURRENCY) {
+			throw new IllegalArgumentException();
+		}
+
+		OdfNumberCurrencyStyle currencyStyle = new OdfNumberCurrencyStyle(
+				(OdfFileDom) mCellElement.getOwnerDocument(),
+				currencySymbol,
+				format,
+				getUniqueCurrencyStyleName());
+		mCellElement.getAutomaticStyles().appendChild(currencyStyle);
+		setDataDisplayStyleName(currencyStyle.getStyleNameAttribute());
+		Double value = getCurrencyValue();
+
+		//set display text
+		if (value != null) {
+			setDisplayText(formatCurrency(currencyStyle, value.doubleValue()));
+		}
+	}
+
+	//This method doesn't handle style:map element.
+	private String formatCurrency(OdfNumberCurrencyStyle currencyStyle, double value) {
+		String valuestr = "";
+		for (Node m : new DomNodeList(currencyStyle.getChildNodes())) {
+			if (m instanceof NumberCurrencySymbolElement) {
+				valuestr += m.getTextContent();
+			} else if (m instanceof NumberNumberElement) {
+				String numberformat = currencyStyle.getNumberFormat();
+				valuestr += (new DecimalFormat(numberformat)).format(value);
+			} else if (m instanceof NumberTextElement) {
+				String textcontent = m.getTextContent();
+				if (textcontent == null || textcontent.length() == 0) {
+					textcontent = " ";
+				}
+				valuestr += textcontent;
+			}
+		}
+		return valuestr;
+	}
+
+	/**
+	 * Set the format string of the cell.
+	 * <p>
+	 * This function only works for float, date, time and percentage, otherwise an
+	 * {@link java.lang.IllegalArgumentException} will be thrown. 
+	 * <p>
+	 * For value type float and percentage, the <code>formatStr</code> must follow the encoding 
+	 * rule of {@link java.text.DecimalFormat <code>java.text.DecimalFormat</code>}.
+	 * For value type date and time, the <code>formatStr</code> must follow the encoding 
+	 * rule of {@link java.text.SimpleDateFormat <code>java.text.SimpleDateFormat</code>}.
+	 * <p>
+	 * Refer to {@link org.odftoolkit.odfdom.doc.table.OdfTableCell#setCurrencyFormat <code>setCurrencyFormat</code>} to set the format of currency.
+	 * <p>
+	 * If the cell value type is not set, the method will try to give it a value type, according 
+	 * to common ordination. The adapt order is: percentage-> time-> date-> float.
+	 * <blockquote>
+	 * <table border=0 cellspacing=3 cellpadding=0 summary="Chart showing ValueType, Distinguish Symbol
+	 * and Distinguish Priority.">
+	 *     <tr bgcolor="#ccccff">
+	 *          <th align=left>ValueType
+	 *          <th align=left>Distinguish Symbol
+	 *          <th align=left>Distinguish Priority
+	 *     <tr valign=top>
+	 *          <td>percentage
+	 *          <td>%
+	 *          <td>1
+	 *     <tr valign=top>
+	 *          <td>time
+	 *          <td>H, k, m, s, S
+	 *          <td>2
+	 *     <tr valign=top>
+	 *          <td>date
+	 *          <td>y, M, w, W, D, d, F, E, K, h
+	 *          <td>3
+	 *     <tr valign=top>
+	 *          <td>float
+	 *          <td>#, 0
+	 *          <td>4
+	 * </table>
+	 * </blockquote>
+	 * The adapt result may be inaccurate, so you'd better set value type before call this method. 
+	 * If adaptive failed, an {@link java.lang.UnsupportedOperationException} will be thrown.
+	 * <p>
+	 * @param formatStr	the cell need be formatted as this specified format string.
+	 * @throws IllegalArgumentException if <code>formatStr</code> is null or the cell value type is supported.
+	 * @throws UnsupportedOperationException if the adaptive failed, when cell value type is not set.
+	 * @see java.text.SimpleDateFormat
+	 * @see java.text.DecimalFormat
+	 */
+	public void setFormatString(String formatStr) {
+		if (formatStr == null) {
+			throw new IllegalArgumentException("formatStr shouldn't be null.");
+		}
+		String type = getValueType();
+		if (type == null) {
+			if (formatStr.contains("%")) {
+				setValueType("percentage");
+			} else if (formatStr.contains("H") || formatStr.contains("k")
+					|| formatStr.contains("m") || formatStr.contains("s")
+					|| formatStr.contains("S")) {
+				setValueType("time");
+			} else if (formatStr.contains("y") || formatStr.contains("M")
+					|| formatStr.contains("w") || formatStr.contains("W")
+					|| formatStr.contains("D") || formatStr.contains("d")
+					|| formatStr.contains("F") || formatStr.contains("E")
+					|| formatStr.contains("K") || formatStr.contains("h")) {
+				setValueType("date");
+			} else if (formatStr.contains("#") || formatStr.contains("0")) {
+				setValueType("float");
+			} else {
+				throw new UnsupportedOperationException("format string: "
+						+ formatStr
+						+ " can't be adapted to a possible value type.");
+			}
+			type = getValueType();
+		}
+		setCellFormatString(formatStr, type);
+	}
+
+	private void setCellFormatString(String formatStr, String type) {
+		OfficeValueTypeAttribute.Value typeValue = null;
+		msFormatString = formatStr;
+		splitRepeatedCells();
+		typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		if (typeValue == OfficeValueTypeAttribute.Value.FLOAT) {
+			OdfNumberStyle numberStyle = new OdfNumberStyle(
+					(OdfFileDom) mCellElement.getOwnerDocument(),
+					formatStr,
+					getUniqueNumberStyleName());
+			mCellElement.getAutomaticStyles().appendChild(numberStyle);
+			setDataDisplayStyleName(numberStyle.getStyleNameAttribute());
+			Double value = getDoubleValue();
+			if (value != null) {
+				setDisplayText((new DecimalFormat(formatStr)).format(value.doubleValue()));
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.DATE) {
+			OdfNumberDateStyle dateStyle = new OdfNumberDateStyle(
+					(OdfFileDom) mCellElement.getOwnerDocument(),
+					formatStr,
+					getUniqueDateStyleName(), null);
+			mCellElement.getAutomaticStyles().appendChild(dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+			String dateStr = mCellElement.getOfficeDateValueAttribute();
+			if (dateStr != null) {
+				Calendar date = getDateValue();
+				setDisplayText((new SimpleDateFormat(formatStr)).format(date.getTime()));
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.TIME) {
+			OdfNumberTimeStyle timeStyle = new OdfNumberTimeStyle(
+					(OdfFileDom) mCellElement.getOwnerDocument(), formatStr,
+					getUniqueDateStyleName());
+			mCellElement.getAutomaticStyles().appendChild(timeStyle);
+			setDataDisplayStyleName(timeStyle.getStyleNameAttribute());
+			String timeStr = mCellElement.getOfficeTimeValueAttribute();
+			if (timeStr != null) {
+				Calendar time = getTimeValue();
+				setDisplayText((new SimpleDateFormat(formatStr)).format(time.getTime()));
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			OdfNumberPercentageStyle dateStyle = new OdfNumberPercentageStyle(
+					(OdfFileDom) mCellElement.getOwnerDocument(),
+					formatStr,
+					getUniquePercentageStyleName());
+			mCellElement.getAutomaticStyles().appendChild(dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+			Double value = getPercentageValue();
+			if (value != null) {
+				setDisplayText((new DecimalFormat(formatStr)).format(value.doubleValue()));
+			}
+		} else {
+			throw new IllegalArgumentException("This function doesn't support " + typeValue + " cell.");
+		}
+	}
+
+	private void setDataDisplayStyleName(String name) {
+		OdfStyleBase styleElement = getCellStyleElementForWrite();
+		if (styleElement != null) {
+			styleElement.setOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.STYLE, "data-style-name"), name);
+		}
+	}
+
+	protected OdfStyle getCellStyleElement() {
+		String styleName = mCellElement.getStyleName();
+		if (styleName == null || (styleName.equals(""))) {	//search in row
+			OdfTableRow aRow = getTableRow();
+			styleName = aRow.getOdfElement().getTableDefaultCellStyleNameAttribute();
+		}
+		if (styleName == null || (styleName.equals(""))) {	//search in column
+			OdfTableColumn aColumn = getTableColumn();
+			styleName = aColumn.getOdfElement().getTableDefaultCellStyleNameAttribute();
+		}
+		if (styleName == null || (styleName.equals(""))) {
+			return null;
+		}
+
+		OdfStyle styleElement = mCellElement.getAutomaticStyles().getStyle(styleName, mCellElement.getStyleFamily());
+
+		if (styleElement == null) {
+			styleElement = mDocument.getDocumentStyles().getStyle(styleName,
+					OdfStyleFamily.TableCell);
+		}
+
+		if (styleElement == null) {
+			styleElement = mCellElement.getDocumentStyle();
+		}
+
+		if (styleElement == null) {
+			OdfStyle newStyle = mCellElement.getAutomaticStyles().newStyle(
+					OdfStyleFamily.TableCell);
+			String newname = newStyle.getStyleNameAttribute();
+			mCellElement.setStyleName(newname);
+			newStyle.addStyleUser(mCellElement);
+			return newStyle;
+		}
+
+		return styleElement;
+	}
+
+	protected OdfStyle getCellStyleElementForWrite() {
+		boolean copy = false;
+		String styleName = mCellElement.getStyleName();
+		if (styleName == null || (styleName.equals(""))) {	//search in row
+			OdfTableRow aRow = getTableRow();
+			styleName = aRow.getOdfElement().getTableDefaultCellStyleNameAttribute();
+			copy = true;
+		}
+		if (styleName == null || (styleName.equals(""))) {	//search in column
+			OdfTableColumn aColumn = getTableColumn();
+			styleName = aColumn.getOdfElement().getTableDefaultCellStyleNameAttribute();
+			copy = true;
+		}
+		if (styleName == null || (styleName.equals(""))) {
+			return null;
+		}
+
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		OdfStyle styleElement = styles.getStyle(styleName, mCellElement.getStyleFamily());
+
+		if (styleElement == null) {
+			styleElement = mDocument.getDocumentStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+		}
+
+		if (styleElement == null) {
+			styleElement = mCellElement.getDocumentStyle();
+		}
+
+		if (styleElement.getStyleUserCount() > 1 || copy) //if this style are used by many users,
+		//should create a new one.
+		{
+			OdfStyle newStyle = mCellElement.getAutomaticStyles().newStyle(OdfStyleFamily.TableCell);
+			newStyle.setProperties(styleElement.getStylePropertiesDeep());
+			//copy attributes
+			NamedNodeMap attributes = styleElement.getAttributes();
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Node attr = attributes.item(i);
+				if (!attr.getNodeName().equals("style:name")) {
+					newStyle.setAttributeNS(attr.getNamespaceURI(), attr.getNodeName(), attr.getNodeValue());
+				}
+			}//end of copying attributes
+			//mCellElement.getAutomaticStyles().appendChild(newStyle);
+			String newname = newStyle.getStyleNameAttribute();
+			mCellElement.setStyleName(newname);
+			return newStyle;
+		}
+		return styleElement;
+	}
+
+	private String getDataDisplayStyleName() {
+		String datadisplayStylename = null;
+		OdfStyleBase styleElement = getCellStyleElement();
+		if (styleElement != null) {
+			datadisplayStylename = styleElement.getOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.STYLE, "data-style-name"));
+		}
+
+		return datadisplayStylename;
+	}
+
+	private String getUniqueNumberStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("n%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getNumberStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private String getUniqueDateStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("d%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getDateStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private String getUniquePercentageStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("p%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getPercentageStyle(unique_name) != null);
+		return unique_name;
+	}
+
+//    private String getUniqueCellStyleName() {
+//    	String unique_name;
+//		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+//	    do {
+//			unique_name = String.format("a%06x", (int) (Math.random() * 0xffffff));
+//		} while (styles.getStyle(unique_name, OdfStyleFamily.TableCell) != null);
+//    	return unique_name;
+//    }	
+	private String getUniqueCurrencyStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("c%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getCurrencyStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	/**
+	 * Get the format string of the cell.
+	 * 
+	 * @return the format string of the cell
+	 */
+	public String getFormatString() {
+		String type = mCellElement.getOfficeValueTypeAttribute();
+		OfficeValueTypeAttribute.Value typeValue = null;
+		if (type != null) {
+			typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		}
+
+		if (typeValue == OfficeValueTypeAttribute.Value.FLOAT) {
+			String name = getDataDisplayStyleName();
+			OdfNumberStyle style = mCellElement.getAutomaticStyles().getNumberStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getNumberStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.DATE) {
+			String name = getDataDisplayStyleName();
+			OdfNumberDateStyle style = mCellElement.getAutomaticStyles().getDateStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getDateStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.CURRENCY) {
+			String name = getCurrencyDisplayStyleName();
+			OdfNumberCurrencyStyle dataStyle = mCellElement.getAutomaticStyles().getCurrencyStyle(name);
+			if (dataStyle == null) {
+				dataStyle = mDocument.getDocumentStyles().getCurrencyStyle(name);
+			}
+			if (dataStyle != null) {
+				return dataStyle.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			String name = getDataDisplayStyleName();
+			OdfNumberPercentageStyle style = mCellElement.getAutomaticStyles().getPercentageStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getPercentageStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		}
+		return null;
+	}
+
+	private String getCurrencyDisplayStyleName() {
+		String name = getDataDisplayStyleName();
+		OdfNumberCurrencyStyle dataStyle = mCellElement.getAutomaticStyles().getCurrencyStyle(name);
+		if (dataStyle == null) {
+			dataStyle = mDocument.getDocumentStyles().getCurrencyStyle(name);
+		}
+
+		if (dataStyle != null) {
+			return dataStyle.getConditionStyleName(getCurrencyValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Remove all the text content of cell.
+	 */
+	public void removeTextContent() {
+		splitRepeatedCells();
+		//delete text:p child element
+		Node node = mCellElement.getFirstChild();
+		while (node != null) {
+			Node nextNode = node.getNextSibling();
+			if (node instanceof TextPElement
+					|| node instanceof TextHElement
+					|| node instanceof TextListElement) {
+				mCellElement.removeChild(node);
+			}
+			node = nextNode;
+		}
+	}
+
+	/**
+	 * Remove all the content of the cell.
+	 */
+	public void removeContent() {
+		splitRepeatedCells();
+		Node node = mCellElement.getFirstChild();
+		while (node != null) {
+			Node nextNode = node.getNextSibling();
+			mCellElement.removeChild(node);
+			node = nextNode;
+		}
+	}
+
+	/**
+	 * Append the content of another cell.
+	 * 
+	 * @param fromCell	another cell whose content will be appended to this cell
+	 */
+	void appendContentFrom(OdfTableCell fromCell) {
+		splitRepeatedCells();
+		OdfWhitespaceProcessor textProcess = new OdfWhitespaceProcessor();
+		TableTableCellElementBase cell = fromCell.getOdfElement();
+		Node node = cell.getFirstChild();
+		while (node != null) {
+			if (node instanceof OdfTextParagraph) {
+				if (!textProcess.getText(node).equals("")) {
+					mCellElement.appendChild(node.cloneNode(true));
+				}
+			} else {
+				mCellElement.appendChild(node.cloneNode(true));
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*****************************************
+	 * Moved from OdfTable
+	 * 
+	 *******************************************/
+	/**
+	 * This method is invoked by insertCellBefore and insertRowBefore
+	 * When it is needed to clone a cell and the cell is a cover cell,
+	 * for some instance, we need to find the cell who covers this cell.
+	 * So this method is to get the cell who covers this cell
+	 */
+	OdfTableCell getCoverCell() {
+		int startRowi = getRowIndex();
+		int startColumni = getColumnIndex();
+
+		for (int i = startRowi; i >= 0; i--) {
+			OdfTableRow aRow = mOwnerTable.getRowByIndex(i);
+			for (int j = startColumni; j >= 0; j--) {
+				if (i == startRowi && j == startColumni) {
+					continue;
+				}
+				OdfTableCell cell = aRow.getCellByIndex(j);
+				if (cell.getOdfElement() instanceof TableTableCellElement) {
+					TableTableCellElement cellEle = (TableTableCellElement) cell.getOdfElement();
+					if ((cellEle.getTableNumberColumnsSpannedAttribute() + j > startColumni)
+							&& (cellEle.getTableNumberRowsSpannedAttribute() + i > startRowi)) {
+						return mOwnerTable.getCellInstance(cellEle, 0, 0);
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method is invoked by getCoverCell.
+	 * It's to get the cell in a same row who covers this cell.
+	 * 
+	 * @return the cell in a same row who covers this cell
+	 * <p>
+	 *         Null if there is no cell who covers this cell
+	 */
+	OdfTableCell getCoverCellInSameRow() {
+		int startRowi = getRowIndex();
+		int startColumni = getColumnIndex();
+
+		for (int j = startColumni - 1; j >= 0; j--) {
+			OdfTableCell cell = mOwnerTable.getCellByPosition(j, startRowi);
+			if (cell.getOdfElement() instanceof TableCoveredTableCellElement) {
+				continue;
+			}
+
+			int oldSpanN = cell.getColumnSpannedNumber();
+			if (oldSpanN + j > startColumni) {
+				//cell.setColumnSpannedNumber(oldSpanN-1);
+				return cell;
+			}
+			return null;
+		}
+		return null;
+	}
+
+	/**
+	 * This method is invoked by getCoverCell
+	 */
+	OdfTableCell getCoverCellInSameColumn() {
+		int startRowi = getRowIndex();
+		int startColumni = getColumnIndex();
+
+		for (int i = startRowi - 1; i >= 0; i--) {
+			OdfTableCell cell = mOwnerTable.getCellByPosition(startColumni, i);
+			if (cell.getOdfElement() instanceof TableCoveredTableCellElement) {
+				continue;
+			}
+
+			int oldSpanN = cell.getRowSpannedNumber();
+			if (oldSpanN + i > startRowi) {
+				//cell.setRowSpannedNumber(oldSpanN-1);
+				return cell;
+			}
+			return null;
+		}
+		return null;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableCellRange.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableCellRange.java
new file mode 100644
index 0000000..03ae5a1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableCellRange.java
@@ -0,0 +1,472 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+
+/**
+ * OdfTableCellRange represent a rang of cells that are adjacent with each other
+ * <p>
+ * OdfTableCellRange provides methods to get/set/modify the properties of cell range.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.table.CellRange} in Simple API.
+ */
+public class OdfTableCellRange {
+
+	private int mnStartRow;
+	private int mnStartColumn;
+	private int mnEndRow;
+	private int mnEndColumn;
+	private String msCellRangeName;
+	private OdfTable maOwnerTable;
+	private boolean mbSpreadsheet;
+
+	/**
+	 * Construct the instance of OdfTableCellRange.
+	 * @param table
+	 * 					is the container table of this cell range.
+	 * @param startColumn
+	 * 					is the column index of the first cell in this cell range.
+	 * @param startRow
+	 * 					is the row index of the first cell in this cell range.
+	 * @param endColumn
+	 * 					is the column index of the last cell in this cell range.
+	 * @param endRow
+	 * 					is the row index of the last cell in this cell range.
+	 */
+	OdfTableCellRange(OdfTable table, int startColumn, int startRow, int endColumn, int endRow) {
+		maOwnerTable = table;
+
+		OdfDocument doc = (OdfDocument) ((OdfFileDom) maOwnerTable.getOdfElement().getOwnerDocument()).getDocument();
+		if (doc instanceof OdfSpreadsheetDocument) {
+			mbSpreadsheet = true;
+		}
+
+		//the first cell is the covered cell, then the cell range should be enlarged
+		//so that it can contains the complete cell
+		//get the cell cover info
+		mnStartColumn = startColumn;
+		mnStartRow = startRow;
+		mnEndColumn = endColumn;
+		mnEndRow = endRow;
+		List<CellCoverInfo> coverList = maOwnerTable.getCellCoverInfos(0, 0, maOwnerTable.getColumnCount() - 1, maOwnerTable.getRowCount() - 1);
+		OdfTableCell cell;// = maOwnerTable.getOwnerCellByPosition(coverList, nStartColumn, nStartRow);
+		for (int i = startColumn; i <= endColumn; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, i, startRow);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+
+		for (int i = startColumn; i <= endColumn; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, i, endRow);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+
+		for (int i = startRow + 1; i < endRow; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, startColumn, i);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+
+		for (int i = startRow + 1; i < endRow; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, endColumn, i);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+	}
+
+	/**
+	 * construct the empty cellRange
+	 */
+	OdfTableCellRange() {
+	}
+
+	/**
+	 * Merge the current cell range to one cell
+	 */
+	public void merge() {
+		OdfTableCell firstCell = maOwnerTable.getCellByPosition(mnStartColumn, mnStartRow);
+
+		//note: after merge, the cell row/column count might  be changed
+		int rowCount = maOwnerTable.getRowCount();
+		int colCount = maOwnerTable.getColumnCount();
+		//if the cell range is the whole table, then merge it to a big cell
+		//as to the spreadsheet document, it should still keep the original cell count,
+		//rather than merge to a big cell.
+		if (rowCount == (mnEndRow - mnStartRow + 1)
+				&& colCount == (mnEndColumn - mnStartColumn + 1)
+				&& !mbSpreadsheet) {
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-spanned");
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-spanned");
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//just copy the text of the other cells to this first cell
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					OdfTableCell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						//copy the content of this cell to the first cell
+						firstCell.appendContentFrom(cellBase);
+					}
+				}
+			}
+			maOwnerTable.removeRowsByIndex(1, maOwnerTable.getRowCount() - 1);
+			maOwnerTable.removeColumnsByIndex(1, maOwnerTable.getColumnCount() - 1);
+			OdfTableColumn firstColumn = maOwnerTable.getColumnByIndex(0);
+			firstColumn.setWidth(maOwnerTable.getWidth());
+			mnEndRow = mnStartRow;
+			mnEndColumn = mnStartColumn;
+			return;
+		} //if the cell range covered all the table row, and the merged column > 1
+		//the merged column can be removed
+		else if (rowCount == (mnEndRow - mnStartRow + 1)
+				&& colCount > (mnEndColumn - mnStartColumn + 1)
+				&& (mnEndColumn - mnStartColumn) > 0) {
+			//the first cell, set the span attribute
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-spanned");
+				firstCellElement.setTableNumberRowsSpannedAttribute(Integer.valueOf(mnEndRow - mnStartRow + 1));
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//the other cell, copy the content to first cell
+			//if it is also in the first column of the cell range, set to the covered cell
+			//other cell not in the first column will be removed when remove the column
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					OdfTableCell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						//append content to first cell
+						firstCell.appendContentFrom(cellBase);
+						//change the cell in the first column of cell range to covered cell
+						if ((j == mnStartColumn) && (cellBase.getOdfElement() instanceof TableTableCellElement)) {
+							//change the normal cell to be the covered cell
+							TableTableCellElement firstColumnCell = (TableTableCellElement) cellBase.getOdfElement();
+							TableCoveredTableCellElement coveredCell = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+									(OdfFileDom) firstColumnCell.getOwnerDocument(),
+									OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+							OdfTableRow parentRow = cellBase.getTableRow();
+							parentRow.getOdfElement().insertBefore(coveredCell, firstColumnCell);
+							parentRow.getOdfElement().removeChild(firstColumnCell);
+						}
+					}
+				}
+			}
+			List<Long> widthList = getCellRangeWidthList();
+			long nCellRangeWidth = widthList.get(widthList.size() - 1).longValue() - widthList.get(0).longValue();
+			maOwnerTable.removeColumnsByIndex(mnStartColumn + 1, mnEndColumn - mnStartColumn);
+			OdfTableColumn firstColumn = maOwnerTable.getColumnByIndex(mnStartColumn);
+			firstColumn.setWidth(nCellRangeWidth);
+			mnEndColumn = mnStartColumn;
+			return;
+		} //if the cell range covered all the table column, the merged row can be removed
+		else if (rowCount > (mnEndRow - mnStartRow + 1)
+				&& colCount == (mnEndColumn - mnStartColumn + 1)
+				&& (mnEndRow - mnStartRow) > 0) {
+			//the first cell, set the span attribute
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-spanned");
+				firstCellElement.setTableNumberColumnsSpannedAttribute(Integer.valueOf(mnEndColumn - mnStartColumn + 1));
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//the other cell, copy the content to first cell
+			//if it is also in the first row of the cell range, set to the covered cell
+			//other cell not in the first row will be removed when remove the row
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					OdfTableCell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						//append content to first cell
+						firstCell.appendContentFrom(cellBase);
+						//change the cell in the first row of cell range to covered cell
+						if ((i == mnStartRow) && (cellBase.getOdfElement() instanceof TableTableCellElement)) {
+							//change the normal cell to be the covered cell
+							TableTableCellElement firstRowCell = (TableTableCellElement) cellBase.getOdfElement();
+							TableCoveredTableCellElement coveredCell = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+									(OdfFileDom) firstRowCell.getOwnerDocument(),
+									OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+							OdfTableRow parentRow = cellBase.getTableRow();
+							parentRow.getOdfElement().insertBefore(coveredCell, firstRowCell);
+							parentRow.getOdfElement().removeChild(firstRowCell);
+						}
+					}
+				}
+			}
+			maOwnerTable.removeRowsByIndex(mnStartRow + 1, mnEndRow - mnStartRow);
+			mnEndRow = mnStartRow;
+			return;
+		} //don't remove any row/column
+		else {
+			//first keep the column and row count in this cell range
+			//the first cell, set the span attribute
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.setTableNumberColumnsSpannedAttribute(Integer.valueOf(mnEndColumn - mnStartColumn + 1));
+				firstCellElement.setTableNumberRowsSpannedAttribute(Integer.valueOf(mnEndRow - mnStartRow + 1));
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//the other cell, set to the covered cell
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					OdfTableCell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						if (cellBase.getOdfElement() instanceof TableTableCellElement) {
+							//change the normal cell to be the covered cell
+							TableTableCellElement cell = (TableTableCellElement) cellBase.getOdfElement();
+							TableCoveredTableCellElement coveredCell = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+									(OdfFileDom) cell.getOwnerDocument(),
+									OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+
+							OdfTableRow parentRow = cellBase.getTableRow();
+							parentRow.getOdfElement().insertBefore(coveredCell, cell);
+							//copy the content of this cell to the first cell
+							firstCell.appendContentFrom(cellBase);
+							cellBase.removeContent();
+							//set the table column repeated attribute
+							int repeatedNum = cell.getTableNumberColumnsRepeatedAttribute().intValue();
+							int num = (mnEndColumn - j + 1) - repeatedNum;
+							if (num >= 0) {
+								coveredCell.setTableNumberColumnsRepeatedAttribute(Integer.valueOf(repeatedNum));
+								parentRow.getOdfElement().removeChild(cell);
+							} else {
+								coveredCell.setTableNumberColumnsRepeatedAttribute(new Integer(mnEndColumn - j + 1));
+								cell.setTableNumberColumnsRepeatedAttribute(Integer.valueOf(-num));
+							}
+
+						} else if (cellBase.getOdfElement() instanceof TableCoveredTableCellElement) {
+							try {
+								//copy the content of this cell to the first cell
+								firstCell.appendContentFrom(cellBase);
+								cellBase.removeContent();
+							} catch (Exception e) {
+								Logger.getLogger(OdfTableCellRange.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	//vector store the x coordinate of each column which reference to the left start point of owner table
+	//the returned value is all measured with "mm" unit
+	private List<Long> getCellRangeWidthList() {
+		List<Long> list = new ArrayList<Long>();
+		Long length = Long.valueOf(0);
+		for (int i = 0; i < maOwnerTable.getColumnCount() - 1; i++) {
+			OdfTableColumn col = maOwnerTable.getColumnByIndex(i);
+			int repeateNum = col.getColumnsRepeatedNumber();
+			if (repeateNum == 1) {
+				if (isColumnInCellRange(i)) {
+					list.add(length);
+				}
+				length = Long.valueOf(length.longValue() + col.getWidth());
+			} else {
+				for (int j = 0; j < repeateNum; j++) {
+					if (isColumnInCellRange(i + j)) {
+						list.add(length);
+						length = Long.valueOf(length.longValue() + col.getWidth());
+					}
+				}
+				i += repeateNum - 1;
+			}
+		}
+		//x coordinate of last column right point 
+		list.add(length);
+		return list;
+	}
+
+	//vector store the x coordinate of each will split column start point
+	List<Long> getVeticalSplitCellRangeWidthList(int splitNum) {
+		//get each cell in the cell range(the cell here means the real cell, not the covered cell)
+		List<CellCoverInfo> coverList = maOwnerTable.getCellCoverInfos(mnStartColumn, mnStartRow, mnEndColumn, mnEndRow);
+		//then get the real(uncovered) cell x coordinate
+		List<Long> tmpList = new ArrayList<Long>();
+		List<Long> widthList = getCellRangeWidthList();
+		for (int i = mnStartColumn; i < mnEndColumn + 1; i++) {
+			for (int j = mnStartRow; j < mnEndRow + 1; j++) {
+				if (maOwnerTable.isCoveredCellInOwnerTable(coverList, i, j)) {
+					continue;
+				} else {
+					//the real cell, record the x coordinate of the left point
+					Long width = widthList.get(i - mnStartColumn);
+					if (!tmpList.contains(width)) {
+						tmpList.add(width);
+					}
+				}
+			}
+		}
+
+		//last, reorder the tmpVector and split it to splitNum between each item
+		Long[] widthArray = (Long[]) tmpList.toArray();
+		Arrays.sort(widthArray);
+		List<Long> rtnValues = new ArrayList<Long>();
+		Long colWidth;
+		long unitWidth;
+		rtnValues.add(widthArray[0]);
+		for (int i = 1; i < widthArray.length; i++) {
+			colWidth = Long.valueOf(widthArray[i].longValue() - widthArray[i - 1].longValue());
+			unitWidth = colWidth.longValue() / splitNum;
+			for (int j = 1; j < splitNum; j++) {
+				long eachWidth = unitWidth * j + widthArray[i - 1].longValue();
+				rtnValues.add(Long.valueOf(eachWidth));
+			}
+			rtnValues.add(widthArray[i]);
+		}
+		return rtnValues;
+	}
+
+	/**
+	 * Get the name of the named cell range.
+	 * 
+	 * @return the name of the cell range
+	 */
+	public String getCellRangeName() {
+		return msCellRangeName;
+	}
+
+	/**
+	 * Set the name of the current cell range.
+	 * 
+	 * @param cellRangeName	the name that need to set
+	 */
+	public void setCellRangeName(String cellRangeName) {
+		try {
+			OdfElement contentRoot = maOwnerTable.mDocument.getContentRoot();
+			//create name range element
+			OdfFileDom contentDom = ((OdfFileDom) maOwnerTable.getOdfElement().getOwnerDocument());
+			TableNamedExpressionsElement nameExpress = (TableNamedExpressionsElement) OdfXMLFactory.newOdfElement(
+					contentDom,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "named-expressions"));
+			String startCellRange = "$" + maOwnerTable.getTableName() + "." + maOwnerTable.getAbsoluteCellAddress(mnStartColumn, mnStartRow);
+			String endCellRange = "$" + maOwnerTable.getTableName() + "." + maOwnerTable.getAbsoluteCellAddress(mnEndColumn, mnEndRow);
+			TableNamedRangeElement nameRange = (TableNamedRangeElement) nameExpress.newTableNamedRangeElement(startCellRange + ":" + endCellRange, cellRangeName);
+			nameRange.setTableBaseCellAddressAttribute(endCellRange);
+			contentRoot.appendChild(nameExpress);
+			msCellRangeName = cellRangeName;
+		} catch (Exception ex) {
+			Logger.getLogger(OdfTableCellRange.class.getName()).log(Level.SEVERE, null, ex);
+		}
+
+	}
+
+	/**
+	 * Get the <code>OdfTable</code> instance who contains this cell range.
+	 * @return the table that contains the cell range.
+	 */
+	public OdfTable getTable() {
+		return maOwnerTable;
+	}
+
+	/**
+	 * Get the number of rows in this cell range.
+	 * @return rows number in the cell range
+	 */
+	public int getRowNumber() {
+		return (mnEndRow - mnStartRow + 1);
+	}
+
+	/**
+	 * Get the number of columns in this cell range.
+	 * @return columns number in the cell range
+	 */
+	public int getColumnNumber() {
+		return (mnEndColumn - mnStartColumn + 1);
+	}
+
+	/** 
+	 * Returns a single cell that is positioned at specified column and row.
+	 * @param clmIndex	the column index of the cell inside the range.
+	 * @param rowIndex	the row index of the cell inside the range.
+	 * @return
+	 * 				the cell at the specified position relative to the start position of the cell range
+	 * @throws IndexOutOfBoundsException if the column/row index is bigger than the column/row count
+	 */
+	public OdfTableCell getCellByPosition(int clmIndex, int rowIndex) throws IndexOutOfBoundsException {
+		return maOwnerTable.getCellByPosition(mnStartColumn + clmIndex, mnStartRow + rowIndex);
+	}
+
+	/**
+	 * Check if the given column in is this cell range.
+	 * @param colIndex	
+	 * 					the given column index
+	 * @return true if the given column index is in the current cell range
+	 * 
+	 */
+	private boolean isColumnInCellRange(int colIndex) {
+		if (colIndex < mnStartColumn || colIndex > mnEndColumn) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	/** 
+	 * Returns a single cell that is positioned at specified cell address.
+	 * 
+	 * @param address
+	 * 				the cell address of the cell inside the range.
+	 * @return
+	 * 				the cell at the specified cell address relative to the start position of the cell range
+	 */
+	public OdfTableCell getCellByPosition(String address) {
+		//if the address also contain the table name,  but the table is not the maOwnerTable
+		//what should do? get the table then getcellByPosition?
+		return getCellByPosition(maOwnerTable.getColIndexFromCellAddress(address), maOwnerTable.getRowIndexFromCellAddress(address));
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableColumn.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableColumn.java
new file mode 100644
index 0000000..b1cd403
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableColumn.java
@@ -0,0 +1,489 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.xpath.XPath;
+
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableColumnProperties;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.w3c.dom.Node;
+
+/**
+ * OdfTableColumn represents table column feature in ODF document.
+ * <p>
+ * OdfTableColumn provides methods to get table cells that belong to this table column.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.table.Column} in Simple API.
+ */
+public class OdfTableColumn {
+
+	TableTableColumnElement maColumnElement;
+	int mnRepeatedIndex;
+	private static final String DEFAULT_WIDTH = "0in";
+	private OdfDocument mDocument;
+
+	/**
+	 * Construct the <code>OdfTableColumn</code> feature.
+	 * 
+	 * @param odfElement
+	 * 					the element that can construct this table column
+	 * @param repeatedIndex 
+	 * 					the index in the repeated columns
+	 */
+	OdfTableColumn(TableTableColumnElement colElement, int repeatedIndex) {
+		maColumnElement = colElement;
+		mnRepeatedIndex = repeatedIndex;
+		mDocument = (OdfDocument) ((OdfFileDom) maColumnElement.getOwnerDocument()).getDocument();
+	}
+
+	/**
+	 * Get the <code>OdfTableColumn</code> instance from the <code>TableTableColumnElement</code> instance.
+	 * <p>
+	 * Each <code>TableTableColumnElement</code> instance has a one-to-one relationship to the a <code>OdfTableColumn</code> instance.
+	 * 
+	 * @param colElement	the column element that need to get the corresponding <code>OdfTableColumn</code> instance
+	 * @return the <code>OdfTableColumn</code> instance represent the specified column element
+	 */
+	public static OdfTableColumn getInstance(TableTableColumnElement colElement) {
+		TableTableElement tableElement = null;
+		Node node = colElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				tableElement = (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		OdfTable table = null;
+		if (tableElement != null) {
+			table = OdfTable.getInstance(tableElement);
+		} else {
+			throw new IllegalArgumentException("the colElement is not in the table dom tree");
+		}
+
+		OdfTableColumn column = table.getColumnInstance(colElement, 0);
+		if (column.getColumnsRepeatedNumber() > 1) {
+			Logger.getLogger(OdfTableColumn.class.getName()).log(Level.WARNING, "the column has the repeated column number, and puzzled about get which repeated index of the column,"
+					+ "here just return the first column of the repeated columns.");
+		}
+		return column;
+	}
+
+	/**
+	 * Get the <code>TableTableElement</code> who contains this cell.
+	 * @return the table that contains the cell.
+	 */
+	private TableTableElement getTableElement() {
+		Node node = maColumnElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				return (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	/**
+	 * Get owner table of the current column.
+	 *
+	 * @return
+	 * 			the parent table of this column
+	 */
+	public OdfTable getTable() {
+		TableTableElement tableElement = getTableElement();
+		if (tableElement != null) {
+			return OdfTable.getInstance(tableElement);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the width of the column (in Millimeter).
+	 * 
+	 * @return the width of the current column (in Millimeter).
+	 */
+	public long getWidth() {
+		String sWidth = maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+		if (sWidth == null) {
+			sWidth = DEFAULT_WIDTH;
+		}
+		return PositiveLength.parseLong(sWidth, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the width of the column (in Millimeter).
+	 * @param width
+	 * 				the width that will be set to the column (in Millimeter).
+	 */
+	public void setWidth(long width) {
+		String sWidthMM = String.valueOf(width) + Unit.MILLIMETER.abbr();
+		String sWidthIN = PositiveLength.mapToUnit(sWidthMM, Unit.INCH);
+
+		splitRepeatedColumns();
+		maColumnElement.setProperty(OdfTableColumnProperties.ColumnWidth, sWidthIN);
+
+		//check if need set relative width
+		int index = getColumnIndex();
+		if (index >= 1) {
+			index = index - 1;
+		} else {
+			index = index + 1;
+		}
+		OdfTableColumn column = null;
+		if (index < getTable().getColumnCount()) {
+			column = getTable().getColumnByIndex(index);
+		}
+		if (column != null) {
+			long prevColumnRelWidth = column.getRelativeWidth();
+			if (prevColumnRelWidth != 0) {
+				long prevColumnWidth = column.getWidth();
+				setRelativeWidth(prevColumnRelWidth / prevColumnWidth * width);
+			}
+		}
+	}
+
+	//if one of the repeated column want to change something
+	//then this repeated column have to split to repeated number columns
+	//the maColumnElement should also be updated according to the original index in the repeated column
+	void splitRepeatedColumns() {
+		OdfTable table = getTable();
+		TableTableElement tableEle = table.getOdfElement();
+		int repeateNum = getColumnsRepeatedNumber();
+		if (repeateNum > 1) {
+			//change this repeated column to several single columns
+			TableTableColumnElement ownerColumnElement = null;
+			int repeatedColumnIndex = mnRepeatedIndex;
+			Node refElement = maColumnElement;
+			maColumnElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+			String originalWidth = maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+			String originalRelWidth = maColumnElement.getProperty(OdfTableColumnProperties.RelColumnWidth);
+			for (int i = repeateNum - 1; i >= 0; i--) {
+				TableTableColumnElement newColumn = (TableTableColumnElement) OdfXMLFactory.newOdfElement((OdfFileDom) maColumnElement.getOwnerDocument(),
+						OdfName.newName(OdfDocumentNamespace.TABLE, "table-column"));
+				if (originalWidth != null && originalWidth.length() > 0) {
+					newColumn.setProperty(OdfTableColumnProperties.ColumnWidth, originalWidth);
+				}
+				if (originalRelWidth != null && originalRelWidth.length() > 0) {
+					newColumn.setProperty(OdfTableColumnProperties.RelColumnWidth, originalRelWidth);
+				}
+				tableEle.insertBefore(newColumn, refElement);
+				refElement = newColumn;
+				if (repeatedColumnIndex == i) {
+					ownerColumnElement = newColumn;
+				} else {
+					table.updateColumnRepository(maColumnElement, i, newColumn, 0);
+				}
+			}
+			//remove this column element
+			tableEle.removeChild(maColumnElement);
+
+			if (ownerColumnElement != null) {
+				table.updateColumnRepository(maColumnElement, mnRepeatedIndex, ownerColumnElement, 0);
+			}
+		}
+	}
+
+	private long getRelativeWidth() {
+		String sRelWidth = maColumnElement.getProperty(OdfTableColumnProperties.RelColumnWidth);
+		if (sRelWidth != null) {
+			if (sRelWidth.contains("*")) {
+				Long value = Long.valueOf(sRelWidth.substring(0, sRelWidth.indexOf("*")));
+				return value.longValue();
+			}
+		}
+		return 0;
+	}
+
+	private void setRelativeWidth(long relWidth) {
+		maColumnElement.setProperty(OdfTableColumnProperties.RelColumnWidth, String.valueOf(relWidth) + "*");
+	}
+
+	/**
+	 * Returns if the column always keeps its optimal width.
+	 * @return 
+	 * 			true if the column always keeps its optimal width;
+	 * 			vice versa
+	 */
+	public boolean isOptimalWidth() {
+		return Boolean.parseBoolean(maColumnElement.getProperty(OdfTableColumnProperties.UseOptimalColumnWidth));
+	}
+
+	/**
+	 * Set if the column always keeps its optimal width.
+	 * 
+	 * @param isUseOptimalWidth
+	 * 					the flag that indicate column should keep its optimal width or not
+	 */
+	public void setUseOptimalWidth(boolean isUseOptimalWidth) {
+		maColumnElement.setProperty(OdfTableColumnProperties.UseOptimalColumnWidth, String.valueOf(isUseOptimalWidth));
+	}
+
+	/**
+	 * Return an instance of <code>TableTableColumnElement</code> which represents this feature.
+	 * 
+	 * @return an instance of <code>TableTableColumnElement</code>
+	 */
+	public TableTableColumnElement getOdfElement() {
+		return maColumnElement;
+	}
+
+	/**
+	 * Get the count of cells in this column.
+	 * 
+	 * @return 	the cells count in the current column
+	 */
+	public int getCellCount() {
+		return getTable().getRowCount();
+	}
+
+	/**
+	 * Get a cell with a specific index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the cell index in this column
+	 * @return the cell object in the given cell index
+	 */
+	public OdfTableCell getCellByIndex(int index) {
+		return getTable().getCellByPosition(getColumnIndex(), index);
+	}
+
+	/**
+	 * Get the previous column of the current column.
+	 *
+	 * @return the previous column before this column in the owner table
+	 */
+	public OdfTableColumn getPreviousColumn() {
+		OdfTable table = getTable();
+		//the column has repeated column number > 1
+		if (maColumnElement.getTableNumberColumnsRepeatedAttribute().intValue() > 1) {
+			if (mnRepeatedIndex > 0) {
+				return table.getColumnInstance(maColumnElement, mnRepeatedIndex - 1);
+			}
+		}
+		//the column has repeated column number > 1 && the index is 0
+		//or the column has repeated column num = 1
+		Node aPrevNode = maColumnElement.getPreviousSibling();
+		Node aCurNode = maColumnElement;
+		while (true) {
+			if (aPrevNode == null) {
+				//does not have previous sibling, then get the parent
+				//because aCurNode might be the child element of table-header-columns, table-columns, table-column-group
+				Node parentNode = aCurNode.getParentNode();
+				//if the parent is table, then it means that this column is the first column in this table
+				//it has no previous column
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aPrevNode = parentNode.getPreviousSibling();
+			}
+			//else the parent node might be table-header-columns, table-columns, table-column-group
+			if (aPrevNode != null) {
+				try {
+					if (aPrevNode instanceof TableTableColumnElement) {
+						return table.getColumnInstance((TableTableColumnElement) aPrevNode, ((TableTableColumnElement) aPrevNode).getTableNumberColumnsRepeatedAttribute().intValue() - 1);
+					} else if (aPrevNode instanceof TableTableColumnsElement
+							|| aPrevNode instanceof TableTableHeaderColumnsElement
+							|| aPrevNode instanceof TableTableColumnGroupElement) {
+						XPath xpath = ((OdfFileDom) maColumnElement.getOwnerDocument()).getXPath();
+						TableTableColumnElement lastCol = (TableTableColumnElement) xpath.evaluate("//table:table-column[last()]", aPrevNode, XPathConstants.NODE);
+						if (lastCol != null) {
+							return table.getColumnInstance(lastCol, lastCol.getTableNumberColumnsRepeatedAttribute().intValue() - 1);
+						}
+					} else {
+						aCurNode = aPrevNode;
+						aPrevNode = aPrevNode.getPreviousSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(OdfTableColumn.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get the next column of the current column.
+	 *
+	 * @return the next column after this column in the owner table
+	 */
+	public OdfTableColumn getNextColumn() {
+		OdfTable table = getTable();
+		//the column has repeated column number > 1
+		if (getColumnsRepeatedNumber() > 1) {
+			if (mnRepeatedIndex < (getColumnsRepeatedNumber() - 1)) {
+				return table.getColumnInstance(maColumnElement, mnRepeatedIndex + 1);
+			}
+		}
+		Node aNextNode = maColumnElement.getNextSibling();
+		Node aCurNode = maColumnElement;
+		while (true) {
+			if (aNextNode == null) {
+				//does not have next sibling, then get the parent
+				//because aCurNode might be the child element of table-header-columns, table-columns, table-column-group
+				Node parentNode = aCurNode.getParentNode();
+				//if the parent is table, then it means that this column is the last column in this table
+				//it has no next column
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aNextNode = parentNode.getNextSibling();
+			}
+			//else the parent node might be table-header-columns, table-columns, table-column-group
+			if (aNextNode != null) {
+				try {
+					if (aNextNode instanceof TableTableColumnElement) {
+						return table.getColumnInstance((TableTableColumnElement) aNextNode, 0);
+					} else if (aNextNode instanceof TableTableColumnsElement
+							|| aNextNode instanceof TableTableHeaderColumnsElement
+							|| aNextNode instanceof TableTableColumnGroupElement) {
+						XPath xpath = ((OdfFileDom) maColumnElement.getOwnerDocument()).getXPath();
+						TableTableColumnElement firstCol = (TableTableColumnElement) xpath.evaluate("//table:table-column[first()]", aNextNode, XPathConstants.NODE);
+						if (firstCol != null) {
+							return table.getColumnInstance(firstCol, 0);
+						}
+					} else {
+						aCurNode = aNextNode;
+						aNextNode = aNextNode.getNextSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(OdfTableColumn.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get the index of this column in the owner table.
+	 * 
+	 * @return the index of the column
+	 */
+	public int getColumnIndex() {
+		int result = 0;
+		OdfTable table = getTable();
+		TableTableColumnElement columnEle;
+		TableTableElement mTableElement = table.getOdfElement();
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableColumnElement) {
+						columnEle = (TableTableColumnElement) m;
+						if (columnEle == getOdfElement()) {
+							return result + mnRepeatedIndex;
+						}
+						if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+							result += 1;
+						} else {
+							result += columnEle.getTableNumberColumnsRepeatedAttribute();
+						}
+					}
+				}
+			}
+			if (n instanceof TableTableColumnElement) {
+				columnEle = (TableTableColumnElement) n;
+				if (columnEle == getOdfElement()) {
+					break;
+				}
+				if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+					result += 1;
+				} else {
+					result += columnEle.getTableNumberColumnsRepeatedAttribute();
+				}
+			}
+		}
+		return result + mnRepeatedIndex;
+	}
+
+	/**
+	 * Set the default cell style to this column.
+	 * <p>
+	 * The style should already exist in this document.
+	 * <p>
+	 * This method is not recommended for text document cases. 
+	 * These is a style assigned to each cell in tables under text documents.
+	 * So setting the default cell style to a column may not work.
+	 * 
+	 * @param style
+	 * 			the cell style of the document
+	 */
+	public void setDefaultCellStyle(OdfStyle style) {
+		splitRepeatedColumns();
+		OdfStyle defaultStyle = getDefaultCellStyle();
+		if (defaultStyle != null) {
+			defaultStyle.removeStyleUser(maColumnElement);
+		}
+
+		if (style != null) {
+			style.addStyleUser(maColumnElement);
+			maColumnElement.setTableDefaultCellStyleNameAttribute(
+					style.getStyleNameAttribute());
+		}
+	}
+
+	/**
+	 * Get the default cell style of this column.
+	 * @return the default cell style of this column
+	 */
+	public OdfStyle getDefaultCellStyle() {
+		String styleName = maColumnElement.getTableDefaultCellStyleNameAttribute();
+		OdfStyle style = maColumnElement.getAutomaticStyles().getStyle(
+				styleName, OdfStyleFamily.TableCell);
+
+		if (style == null) {
+			style = mDocument.getDocumentStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+		}
+		return style;
+	}
+
+	//note: we have to use this method to modify the column repeated number
+	//in order to update mnRepeatedIndex of the each column
+	void setColumnsRepeatedNumber(int num) {
+		//update the mnRepeatedIndex for the ever repeated column
+		maColumnElement.setTableNumberColumnsRepeatedAttribute(Integer.valueOf(num));
+	}
+
+	int getColumnsRepeatedNumber() {
+		Integer count = maColumnElement.getTableNumberColumnsRepeatedAttribute();
+		if (count == null) {
+			return 1;
+		} else {
+			return count.intValue();
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableRow.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableRow.java
new file mode 100644
index 0000000..eb6a4d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableRow.java
@@ -0,0 +1,842 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.xpath.XPath;
+
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableRowProperties;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.w3c.dom.Node;
+
+/**
+ * OdfTableRow represents table row feature in ODF document.
+ * <p>
+ * OdfTableRow provides methods to get table cells that belong to this table row.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.table.Row} in Simple API.
+ */
+public class OdfTableRow {
+
+	//boolean mbVisible;
+	TableTableRowElement maRowElement;
+	int mnRepeatedIndex;
+	int mRowsRepeatedNumber = -1;
+	private static final String DEFAULT_HEIGHT = "0.30in";
+	private OdfDocument mDocument;
+
+	/**
+	 * Construct the <code>OdfTableRow</code> feature.
+	 * @param rowElement	the row element represent this row
+	 * @param repeatedIndex	the index in the repeated rows
+	 */
+	OdfTableRow(TableTableRowElement rowElement, int repeatedIndex) {
+		maRowElement = rowElement;
+		mnRepeatedIndex = repeatedIndex;
+		mDocument = (OdfDocument) ((OdfFileDom) maRowElement.getOwnerDocument()).getDocument();
+	}
+
+	/**
+	 * Get the <code>OdfTableRow</code> instance from the <code>TableTableRowElement</code> instance.
+	 * <p>
+	 * Each <code>TableTableRowElement</code> instance has a one-to-one relationship to a <code>OdfTableRow</code> instance.
+	 * 
+	 * @param rowElement	the row element that need to get the corresponding <code>OdfTableRow</code> instance
+	 * @return the <code>OdfTableRow</code> instance represent the specified row element
+	 */
+	public static OdfTableRow getInstance(TableTableRowElement rowElement) {
+		TableTableElement tableElement = null;
+		Node node = rowElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				tableElement = (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		OdfTable table = null;
+		if (tableElement != null) {
+			table = OdfTable.getInstance(tableElement);
+		} else {
+			throw new IllegalArgumentException("the rowElement is not in the table dom tree");
+		}
+
+		OdfTableRow row = table.getRowInstance(rowElement, 0);
+		if (row.getRowsRepeatedNumber() > 1) {
+			Logger.getLogger(OdfTableRow.class.getName()).log(Level.WARNING, "the row has the repeated row number, and puzzled about get which repeated index of the row,"
+					+ "here just return the first row of the repeated rows.");
+		}
+		return row;
+	}
+
+	/**
+	 * Get the <code>TableTableElement</code>  who contains this row.
+	 * 
+	 * @return the table element that contains the row.
+	 */
+	private TableTableElement getTableElement() {
+		Node node = maRowElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				return (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	/**
+	 * Get owner table of the current row.
+	 * @return	the parent table of this row
+	 */
+	public OdfTable getTable() {
+		TableTableElement tableElement = getTableElement();
+		if (tableElement != null) {
+			return OdfTable.getInstance(tableElement);
+		}
+		return null;
+	}
+
+	/**
+	 * Return the height of the row (in Millimeter).
+	 * <p>
+	 * Return the minimal height, if the row height is not set, 
+	 * @return the height of the current row (in Millimeter).
+	 */
+	public long getHeight() {
+		String sHeight = maRowElement.getProperty(OdfTableRowProperties.RowHeight);
+		if (sHeight == null) {
+			sHeight = maRowElement.getProperty(OdfTableRowProperties.MinRowHeight);
+		}
+		if (sHeight == null) {
+			sHeight = DEFAULT_HEIGHT;
+		}
+		return PositiveLength.parseLong(sHeight, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the height/minimal height of the row (in Millimeter) according to the second parameter.
+	 * @param height
+	 * 				the height/minimal height that will be set to the row (in Millimeter).
+	 * @param isMinHeight
+	 * 				if it is true, the row can fit the height to the text, vice versa.
+	 */
+	public void setHeight(long height, boolean isMinHeight) {
+		String sHeightMM = String.valueOf(height) + Unit.MILLIMETER.abbr();
+		String sHeightIN = PositiveLength.mapToUnit(sHeightMM, Unit.INCH);
+		splitRepeatedRows();
+		maRowElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+		maRowElement.setProperty(OdfTableRowProperties.RowHeight, sHeightIN);
+	}
+
+	//if one of the repeated row want to change something
+	//then this repeated row have to split to repeated number rows
+	//the maRowElement/mnRepeatedIndex should also be updated according to the original index in the repeated column
+	void splitRepeatedRows() {
+		int repeateNum = getRowsRepeatedNumber();
+		if (repeateNum > 1) {
+			OdfTable table = getTable();
+			TableTableElement tableEle = table.getOdfElement();
+			//change this repeated row to several single rows
+			TableTableRowElement ownerRowElement = null;
+			int repeatedRowIndex = mnRepeatedIndex;
+			Node refElement = maRowElement;
+			Node oldRowElement = maRowElement;
+			for (int i = repeateNum - 1; i >= 0; i--) {
+				TableTableRowElement newRow = (TableTableRowElement) maRowElement.cloneNode(true);
+				newRow.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-repeated");
+				tableEle.insertBefore(newRow, refElement);
+				refElement = newRow;
+				if (repeatedRowIndex == i) {
+					ownerRowElement = newRow;
+				} else {
+					table.updateRowRepository(maRowElement, i, newRow, 0);
+				}
+			}
+
+			if (ownerRowElement != null) {
+				table.updateRowRepository(maRowElement, mnRepeatedIndex, ownerRowElement, 0);
+			}
+			tableEle.removeChild(oldRowElement);
+			mRowsRepeatedNumber = -1;
+		}
+	}
+
+	/**
+	 * Return if the row always keeps its optimal height.
+	 * @return 
+	 * 			true if the row always keeps its optimal height;
+	 * 			vice versa
+	 */
+	public boolean isOptimalHeight() {
+		return Boolean.parseBoolean(maRowElement.getProperty(OdfTableRowProperties.UseOptimalRowHeight));
+	}
+
+	/**
+	 * Set if the row always keeps its optimal height.
+	 * @param isUseOptimalHeight
+	 * 					the flag that indicate row should keep its optimal height or not
+	 */
+	public void setUseOptimalHeight(boolean isUseOptimalHeight) {
+		maRowElement.setProperty(OdfTableRowProperties.UseOptimalRowHeight, String.valueOf(isUseOptimalHeight));
+	}
+
+	/**
+	 * Return an instance of <code>TableTableRowElement</code> which represents this feature.
+	 * @return an instance of <code>TableTableRowElement</code>
+	 */
+	public TableTableRowElement getOdfElement() {
+		return maRowElement;
+	}
+
+	/**
+	 * Get a cell with a specific index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the cell index in this row
+	 * @return the cell object in the given cell index
+	 */
+	public OdfTableCell getCellByIndex(int index) {
+		OdfTable table = getTable();
+		if (index < 0) {
+			throw new IllegalArgumentException("index should be nonnegative integer.");
+		}
+		// expand column as needed.
+		int lastColumnIndex = table.getColumnCount() - 1;
+		if (index > lastColumnIndex) {
+			//need clean cell style.
+			table.appendColumns((index - lastColumnIndex), true);
+		}
+		for (Node n : new DomNodeList(maRowElement.getChildNodes())) {
+			if (n instanceof TableTableCellElementBase) {
+				if (index == 0) {
+					return table.getCellInstance((TableTableCellElementBase) n,
+							0, mnRepeatedIndex);
+				} else {
+					int nextIndex = index
+							- ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute().intValue();
+					if (nextIndex < 0) {
+						OdfTableCell cell = table.getCellInstance(
+								(TableTableCellElementBase) n, index,
+								mnRepeatedIndex);
+						return cell;
+					} else {
+						index = nextIndex;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Return the count of real cells in this row.
+	 * The cells covered by top cells are not counted.
+	 * <p>
+	 * Please note it might not equal to the column count of the owner table,
+	 * because some of them are the covered cells.
+	 * @return 		the cell count
+	 */
+	public int getCellCount() {
+		OdfTable table = getTable();
+		Set<OdfTableCell> realCells = new HashSet<OdfTableCell>();
+		List<CellCoverInfo> coverList = table.getCellCoverInfos(0, 0, table.getColumnCount() - 1, table.getRowCount() - 1);
+		int rowIndex = getRowIndex();
+		for (int i = 0; i < table.getColumnCount(); i++) {
+			OdfTableCell cell = table.getOwnerCellByPosition(coverList, i, rowIndex);
+			realCells.add(cell);
+		}
+		return realCells.size();
+	}
+
+	/**
+	 * Return the previous row of the current row.
+	 *
+	 * @return the previous row before this row in the owner table
+	 */
+	public OdfTableRow getPreviousRow() {
+		OdfTable table = getTable();
+		//the row has repeated row number > 1
+		if (getRowsRepeatedNumber() > 1) {
+			if (mnRepeatedIndex > 0) {
+				return table.getRowInstance(maRowElement, mnRepeatedIndex - 1);
+			}
+		}
+		//the row has repeated row number > 1 && the index is 0
+		//or the row has repeated row num = 1
+		Node aPrevNode = maRowElement.getPreviousSibling();
+		Node aCurNode = maRowElement;
+		TableTableRowElement lastRow;
+		while (true) {
+			if (aPrevNode == null) {
+				//does not have previous sibling, then get the parent
+				//because aCurNode might be the child element of table-header-rows, table-rows, table-row-group
+				Node parentNode = aCurNode.getParentNode();
+				//if the parent is table, then it means that this row is the first row in this table
+				//it has no previous row
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aPrevNode = parentNode.getPreviousSibling();
+			}
+			//else the previous node might be table-header-rows, table-rows, table-row-group
+			if (aPrevNode != null) {
+				try {
+					if (aPrevNode instanceof TableTableRowElement) {
+						return table.getRowInstance((TableTableRowElement) aPrevNode,
+								((TableTableRowElement) aPrevNode).getTableNumberRowsRepeatedAttribute().intValue() - 1);
+					} else if (aPrevNode instanceof TableTableRowsElement
+							|| aPrevNode instanceof TableTableHeaderRowsElement
+							|| aPrevNode instanceof TableTableRowGroupElement) {
+						XPath xpath = ((OdfContentDom) aPrevNode.getOwnerDocument()).getXPath();
+						synchronized (mDocument) {
+							lastRow = (TableTableRowElement) xpath.evaluate(".//table:table-row[last()]", aPrevNode, XPathConstants.NODE);
+						}
+						if (lastRow != null) {
+							return table.getRowInstance(lastRow, lastRow.getTableNumberRowsRepeatedAttribute().intValue() - 1);
+						}
+					} else {
+						aCurNode = aPrevNode;
+						aPrevNode = aPrevNode.getPreviousSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(OdfTableRow.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Return the next row of the current row.
+	 *
+	 * @return the next row after this row in the owner table
+	 */
+	public OdfTableRow getNextRow() {
+		OdfTable table = getTable();
+		//the row has repeated row number > 1
+		if (getRowsRepeatedNumber() > 1) {
+			if (mnRepeatedIndex < (getRowsRepeatedNumber() - 1)) {
+				return table.getRowInstance(maRowElement, mnRepeatedIndex + 1);
+			}
+		}
+
+		Node aNextNode = maRowElement.getNextSibling();
+		Node aCurNode = maRowElement;		
+		TableTableRowElement firstRow;
+		while (true) {
+			if (aNextNode == null) {
+				//does not have next sibling, then get the parent
+				//because aCurNode might be the child element of table-header-rows, table-rows, table-row-group
+				Node parentNode = aCurNode.getParentNode();
+				//if the parent is table, then it means that this row is the last row in this table
+				//it has no next row
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aNextNode = parentNode.getNextSibling();
+			}
+			//else the next node might be table-header-rows, table-rows, table-row-group
+			if (aNextNode != null) {
+				try {
+					if (aNextNode instanceof TableTableRowElement) {
+						return table.getRowInstance((TableTableRowElement) aNextNode, 0);
+					} else if (aNextNode instanceof TableTableRowsElement
+							|| aNextNode instanceof TableTableHeaderRowsElement
+							|| aNextNode instanceof TableTableRowGroupElement) {
+						XPath xpath = ((OdfContentDom) aNextNode.getOwnerDocument()).getXPath();
+						synchronized (mDocument) {
+							firstRow = (TableTableRowElement) xpath.evaluate(".//table:table-row[first()]", aNextNode, XPathConstants.NODE);
+						}
+						if (firstRow != null) {
+							return table.getRowInstance(firstRow, 0);
+						}
+					} else {
+						aCurNode = aNextNode;
+						aNextNode = aNextNode.getNextSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(OdfTableRow.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+	/**
+	 * Set the default cell style to this row.
+	 * <p>
+	 * The style should already exist in this document.
+	 * @param style
+	 * 			the cell style of the document
+	 */
+	public void setDefaultCellStyle(OdfStyle style) {
+		splitRepeatedRows();
+		OdfStyle defaultStyle = getDefaultCellStyle();
+		if (defaultStyle != null) {
+			defaultStyle.removeStyleUser(maRowElement);
+		}
+
+		if (style != null) {
+			style.addStyleUser(maRowElement);
+			maRowElement.setTableDefaultCellStyleNameAttribute(
+					style.getStyleNameAttribute());
+		}
+	}
+
+	/**
+	 * Get the default cell style of this row.
+	 *
+	 * @return the default cell style of this row
+	 */
+	public OdfStyle getDefaultCellStyle() {
+		String styleName = maRowElement.getTableDefaultCellStyleNameAttribute();
+		OdfStyle style = maRowElement.getAutomaticStyles().getStyle(
+				styleName, OdfStyleFamily.TableCell);
+
+		if (style == null) {
+			style = mDocument.getDocumentStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+		}
+		return style;
+	}
+
+	/**
+	 * Return the index of this row in the owner table.
+	 * 
+	 * @return the index of the row
+	 */
+	public int getRowIndex() {
+		int result = 0;
+		TableTableElement mTableElement = getTableElement();
+		TableTableRowElement rowEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableRowElement) {
+						rowEle = (TableTableRowElement) m;
+						if (rowEle == getOdfElement()) {
+							return result + mnRepeatedIndex;
+						}
+						result += rowEle.getTableNumberRowsRepeatedAttribute();
+					}
+				}
+			}
+			if (n instanceof TableTableRowElement) {
+				rowEle = (TableTableRowElement) n;
+				if (rowEle == getOdfElement()) {
+					break;
+				}
+				result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+			}
+		}
+		return result + mnRepeatedIndex;
+
+	}
+
+	//insert count number of cell from index
+	//this is called after insertColumn has been called by OdfTable
+	void insertCellByIndex(int index, int count) {
+		splitRepeatedRows();
+		//all insert the real cell
+		OdfTable table = getTable();
+		List<CellCoverInfo> coverList = table.getCellCoverInfos(0, 0, table.getColumnCount() - 1, table.getRowCount() - 1);
+		int rowIndex = getRowIndex();
+		OdfTableCell preCell;
+		if (index == 0) {
+			preCell = table.getOwnerCellByPosition(coverList, 0, rowIndex);
+		} else {
+			preCell = table.getOwnerCellByPosition(coverList, index - 1, rowIndex);
+		}
+		OdfTableCell nextCell = getCellByIndex(index);
+		if (nextCell == null) {
+			nextCell = getCellByIndex(getCellCount() - 1);
+		}
+		for (int i = index + count; i > index; i--) {
+			TableTableCellElement newCell = (TableTableCellElement) OdfXMLFactory.newOdfElement((OdfFileDom) maRowElement.getOwnerDocument() ,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-cell"));
+			newCell.setTableStyleNameAttribute(preCell.getStyleName());
+			maRowElement.insertBefore(newCell, nextCell.getOdfElement());
+		}
+	}
+
+	//note: we have to use this method to modify the row repeated number
+	//in order to update mnRepeatedIndex of the each row
+	void setRowsRepeatedNumber(int num) {
+		mRowsRepeatedNumber = num;
+		//update the mnRepeatedIndex for the ever repeated row
+		maRowElement.setTableNumberRowsRepeatedAttribute(Integer.valueOf(num));
+	}
+
+	int getRowsRepeatedNumber() {
+		if (mRowsRepeatedNumber < 0) {
+			Integer count = maRowElement.getTableNumberRowsRepeatedAttribute();
+			if (count == null) {
+				mRowsRepeatedNumber = 1;
+			} else {
+				mRowsRepeatedNumber = count.intValue();
+			}
+		}
+		return mRowsRepeatedNumber;
+	}
+
+	/****************************
+	 * Moved from OdfTable
+	 * 
+	 */
+	private void insertCellElementBefore(OdfElement parentEle, TableTableCellElementBase positionEle, TableTableCellElementBase cellEle, int count) {
+		if (positionEle == null) {
+			parentEle.appendChild(cellEle);
+			for (int i = 1; i < count; i++) {
+				parentEle.appendChild(cellEle.cloneNode(true));
+			}
+		} else {
+			parentEle.insertBefore(cellEle, positionEle);
+			for (int i = 1; i < count; i++) {
+				parentEle.insertBefore(cellEle.cloneNode(true), positionEle);
+			}
+		}
+	}
+
+	void insertCellBefore(OdfTableCell refCell, OdfTableCell positionCell, int count) {
+		splitRepeatedRows();
+		OdfTable ownerTable = getTable();
+
+		if (positionCell == null) {
+			if (refCell.isCoveredElement()) {
+				TableTableCellElement coverCellEle = (TableTableCellElement) refCell.getCoverCell().getOdfElement();
+				TableTableCellElement newCellEle = (TableTableCellElement) coverCellEle.cloneNode(true);
+				cleanCell(newCellEle);
+				insertCellElementBefore(getOdfElement(), null, newCellEle, count);
+			} else {
+				TableTableCellElement endCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(endCellEle);
+				getOdfElement().appendChild(endCellEle);
+				reviseStyleFromLastColumnToMedium(refCell);
+				if (count > 1) {
+					TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+					cleanCell(newCellEle);
+					insertCellElementBefore(getOdfElement(), endCellEle, newCellEle, count - 1);
+				}
+			}
+		} else {
+			TableTableCellElement coverRefCellEle = null;
+			TableTableCellElement coverPosCellEle = null;
+			OdfTableCell coverRefCell = null;
+			if (refCell.isCoveredElement()) { //get ref cover cell
+				coverRefCell = refCell.getCoverCell();
+				coverRefCellEle = (TableTableCellElement) coverRefCell.getOdfElement();
+			}
+			if (positionCell.isCoveredElement()) //get position cover cell
+			{
+				coverPosCellEle = (TableTableCellElement) positionCell.getCoverCell().getOdfElement();
+			}
+
+			if ((coverRefCellEle != null && coverRefCellEle == coverPosCellEle) //is cover cell and have the same cover cell
+					|| (coverPosCellEle != null && refCell.getOdfElement() == coverPosCellEle)) //position cell is cover cell and refer cell covers position cell
+			{
+				if (coverRefCellEle == null) {
+					coverRefCellEle = (TableTableCellElement) refCell.getOdfElement();
+					coverRefCell = refCell;
+				}
+				TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+						(OdfFileDom) ownerTable.getOdfElement().getOwnerDocument(),
+						OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+				insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) //the first cover line
+				{
+					coverRefCell.setColumnSpannedNumber(coverRefCell.getColumnSpannedNumber() + count);
+				}
+			} else if (coverRefCellEle != null) //is cover cell
+			{
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) { //the first cover line
+					TableTableCellElement newCellEle = (TableTableCellElement) coverRefCellEle.cloneNode(true);
+					cleanCell(newCellEle);
+					insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+				} else { //the second and other cover line
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) refCell.getOdfElement().cloneNode(true);
+					newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+					insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+				}
+			} else if ((refCell.getOdfElement() == positionCell.getOdfElement())
+					&& (refCell.getColumnsRepeatedNumber() > 1)) //repeated number
+			{
+				int repeatNum = refCell.getColumnsRepeatedNumber();
+				//update the cell that after the ref cell
+				for (int i = repeatNum - 1; i > refCell.mnRepeatedColIndex; i--) {
+					ownerTable.updateCellRepository(refCell.getOdfElement(), i, refCell.mnRepeatedRowIndex,
+							refCell.getOdfElement(), i + count, refCell.mnRepeatedRowIndex);
+				}
+				refCell.getOdfElement().setTableNumberColumnsRepeatedAttribute(repeatNum + count);
+			} else {
+				TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(newCellEle);
+				insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+			}
+		}
+	}
+
+	/**
+	 * This method is to insert a cell same as refCell before positionCell.
+	 * <p>
+	 * This method is invoked by appendColumn and insertColumnBefore.
+	 */
+	OdfTableCell insertCellBefore(OdfTableCell refCell, OdfTableCell positionCell) {
+		splitRepeatedRows();
+		OdfTableCell newCell = null;
+		OdfTable ownerTable = getTable();
+
+		if (positionCell == null) {
+			if (refCell.isCoveredElement()) {
+				TableTableCellElement coverCellEle = (TableTableCellElement) refCell.getCoverCell().getOdfElement();
+				TableTableCellElement newCellEle = (TableTableCellElement) coverCellEle.cloneNode(true);
+				cleanCell(newCellEle);
+				getOdfElement().appendChild(newCellEle);
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+			} else {
+				TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(newCellEle);
+				getOdfElement().appendChild(newCellEle);
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+				reviseStyleFromLastColumnToMedium(refCell);
+			}
+		} else {
+			TableTableCellElement coverRefCellEle = null;
+			TableTableCellElement coverPosCellEle = null;
+			OdfTableCell coverRefCell = null;
+			if (refCell.isCoveredElement()) { //get ref cover cell
+				coverRefCell = refCell.getCoverCell();
+				coverRefCellEle = (TableTableCellElement) coverRefCell.getOdfElement();
+			}
+			if (positionCell.isCoveredElement()) //get position cover cell
+			{
+				coverPosCellEle = (TableTableCellElement) positionCell.getCoverCell().getOdfElement();
+			}
+
+			if ((coverRefCellEle != null && coverRefCellEle == coverPosCellEle) //is cover cell and have the same cover cell
+					|| (coverPosCellEle != null && refCell.getOdfElement() == coverPosCellEle)) //position cell is cover cell and refer cell covers position cell
+			{
+				if (coverRefCellEle == null) {
+					coverRefCellEle = (TableTableCellElement) refCell.getOdfElement();
+					coverRefCell = refCell;
+				}
+				TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+						(OdfFileDom) ownerTable.getOdfElement().getOwnerDocument(),
+						OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+				getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) //the first cover line
+				{
+					coverRefCell.setColumnSpannedNumber(coverRefCell.getColumnSpannedNumber() + 1);
+				}
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+			} else if (coverRefCellEle != null) //is cover cell
+			{
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) { //the first cover line
+					TableTableCellElement newCellEle = (TableTableCellElement) coverRefCellEle.cloneNode(true);
+					cleanCell(newCellEle);
+					getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+					newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+				} else { //the second and other cover line
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) refCell.getOdfElement().cloneNode(true);
+					newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+					getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+					newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+				}
+			} else if ((refCell.getOdfElement() == positionCell.getOdfElement())
+					&& (refCell.getColumnsRepeatedNumber() > 1)) //repeated number
+			{
+				int repeatNum = refCell.getColumnsRepeatedNumber();
+				//update the cell that after the ref cell
+				for (int i = repeatNum - 1; i > refCell.mnRepeatedColIndex; i--) {
+					ownerTable.updateCellRepository(refCell.getOdfElement(), i, refCell.mnRepeatedRowIndex,
+							refCell.getOdfElement(), i + 1, refCell.mnRepeatedRowIndex);
+				}
+				refCell.getOdfElement().setTableNumberColumnsRepeatedAttribute(repeatNum + 1);
+				newCell = ownerTable.getCellInstance(refCell.getOdfElement(), refCell.mnRepeatedColIndex + 1, refCell.mnRepeatedRowIndex);
+			} else {
+				TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(newCellEle);
+				getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+			}
+		}
+		return newCell;
+	}
+
+	private void cleanCell(TableTableCellElement newCellEle) {
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "date-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "time-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "boolean-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "string-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "formula");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-spanned");
+		if(!getTable().isCellStyleInheritance()){
+			newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+		}
+		Node n = newCellEle.getFirstChild();
+		while (n != null) {
+			Node m = n.getNextSibling();
+			if (n instanceof TextPElement
+					|| n instanceof TextHElement
+					|| n instanceof TextListElement) {
+				newCellEle.removeChild(n);
+			}
+			n = m;
+		}
+	}
+
+	private void reviseStyleFromLastColumnToMedium(OdfTableCell oldLastCell) {
+		if (getTable().mIsSpreadsheet) return;
+		
+		OdfStyle styleEle = oldLastCell.getCellStyleElementForWrite();
+		if (styleEle != null) {
+			if (oldLastCell.getRowIndex() == 0) {
+				OdfTable.setLeftTopBorderStyleProperties(styleEle);
+			} else {
+				OdfTable.setLeftBottomBorderStylesProperties(styleEle);
+			}
+		}
+	}
+
+	private void reviseStyleFromMediumColumnToLast(OdfTableCell newLastCell) {
+		if (getTable().mIsSpreadsheet) return;
+		
+		OdfStyle styleEle = newLastCell.getCellStyleElementForWrite();
+		if (styleEle != null) {
+			if (newLastCell.getRowIndex() == 0) {
+				OdfTable.setRightTopBorderStyleProperties(styleEle);
+			} else {
+				OdfTable.setRightBottomBorderStylesProperties(styleEle);
+			}
+		}
+	}
+
+	/**
+	 * This method is invoked by removeColumnByIndex
+	 * So we don't need to care about 
+	 * the covered and spanned cell in a same column 
+	 */
+	void removeCellByIndex(int nStart, int nCount) {
+		splitRepeatedRows();
+		OdfTableCell startCell = getCellByIndex(nStart);
+		OdfTableCell coverCell = null;
+		if (startCell.isCoveredElement()) {
+			coverCell = startCell.getCoverCellInSameRow();
+		}
+
+		int index = nStart;
+		for (int i = 0; i < nCount; i++) {
+			OdfTableCell cell = getCellByIndex(index);
+			cell.splitRepeatedCells();
+			if (cell.isCoveredElement() && coverCell != null) {
+				coverCell.setColumnSpannedNumber(coverCell.getColumnSpannedNumber() - cell.getColumnsRepeatedNumber());
+				maRowElement.removeChild(cell.getOdfElement());
+				i += cell.getColumnsRepeatedNumber() - 1;
+			} else if (cell.isCoveredElement()) {
+				maRowElement.removeChild(cell.getOdfElement());
+				i += cell.getColumnsRepeatedNumber() - 1;
+			} else if (!cell.isCoveredElement()) {
+				if (i + cell.getColumnSpannedNumber() <= nCount) {
+					maRowElement.removeChild(cell.getOdfElement());
+					i += cell.getColumnSpannedNumber() - 1;
+				} else {
+					removeCellByIndex(index + 1, nCount - i);
+				}
+			}
+		}
+
+		int clmnum = getTable().getColumnCount();
+		if (nStart + nCount >= clmnum) {
+			OdfTableCell cell = getCellByIndex(nStart - 1);
+			reviseStyleFromMediumColumnToLast(cell);
+		}
+	}
+
+	void removeAllCellsRelationship() {
+		OdfTable table = getTable();
+
+		for (int i = 0; i < table.getColumnCount();) {
+			OdfTableCell cell = getCellByIndex(i);
+			if (cell.isCoveredElement()) //cell is a cover cell
+			{
+				OdfTableCell coverCell = cell.getCoverCellInSameColumn();
+				if (coverCell != null) {
+					coverCell.setRowSpannedNumber(coverCell.getRowSpannedNumber() - getRowsRepeatedNumber());
+				}
+				getOdfElement().removeChild(cell.getOdfElement());
+			} else {
+				if (cell.getRowSpannedNumber() > 1) //cell is not a cover cell, and it span more rows
+				{
+					//split the cell under this cell to a single cell
+					OdfTableRow nextRow = table.getRowByIndex(getRowIndex() + 1);
+					if (nextRow.getRowsRepeatedNumber() > 1) {
+						nextRow.splitRepeatedRows();
+					}
+					OdfTableCell coveredCell = table.getCellByPosition(cell.getColumnIndex(), getRowIndex() + 1);
+					if (coveredCell.getColumnsRepeatedNumber() > 1) {
+						coveredCell.splitRepeatedCells();
+						coveredCell = table.getCellByPosition(cell.getColumnIndex(), getRowIndex() + 1);
+					}
+
+					//create a new cell
+					TableTableCellElement newCellEle = (TableTableCellElement) cell.getOdfElement().cloneNode(true);
+					newCellEle.setTableNumberRowsSpannedAttribute(cell.getRowSpannedNumber() - getRowsRepeatedNumber());
+					//update repository
+					int startRow = coveredCell.getRowIndex();
+					int endRow = coveredCell.getRowIndex() + newCellEle.getTableNumberRowsSpannedAttribute();
+					int startClm = coveredCell.getColumnIndex();
+					int endClm = coveredCell.getColumnIndex() + newCellEle.getTableNumberColumnsSpannedAttribute() * newCellEle.getTableNumberColumnsRepeatedAttribute();
+					coveredCell.getOdfElement().getParentNode().replaceChild(newCellEle, coveredCell.getOdfElement());
+
+					table.updateRepositoryWhenCellElementChanged(startRow, endRow, startClm, endClm, newCellEle);
+				}
+			}
+			i += cell.getColumnSpannedNumber();
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/DefaultElementVisitor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/DefaultElementVisitor.java
new file mode 100644
index 0000000..4bbe95d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/DefaultElementVisitor.java
@@ -0,0 +1,5423 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateColorElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateMotionElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateTransformElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAudioElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimCommandElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimIterateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimParElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimParamElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimSeqElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimSetElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimTransitionFilterElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartAxisElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartCategoriesElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartChartElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartDataLabelElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartDataPointElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartDomainElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartEquationElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartErrorIndicatorElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartFloorElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartFooterElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartGridElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartLabelSeparatorElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartLegendElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartMeanValueElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartPlotAreaElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartRegressionCurveElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartSeriesElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartStockGainMarkerElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartStockLossMarkerElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartStockRangeLineElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartSubtitleElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartSymbolImageElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartTitleElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartWallElement;
+import org.odftoolkit.odfdom.dom.element.config.ConfigConfigItemElement;
+import org.odftoolkit.odfdom.dom.element.config.ConfigConfigItemMapEntryElement;
+import org.odftoolkit.odfdom.dom.element.config.ConfigConfigItemMapIndexedElement;
+import org.odftoolkit.odfdom.dom.element.config.ConfigConfigItemMapNamedElement;
+import org.odftoolkit.odfdom.dom.element.config.ConfigConfigItemSetElement;
+import org.odftoolkit.odfdom.dom.element.db.DbApplicationConnectionSettingsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbAutoIncrementElement;
+import org.odftoolkit.odfdom.dom.element.db.DbCharacterSetElement;
+import org.odftoolkit.odfdom.dom.element.db.DbColumnElement;
+import org.odftoolkit.odfdom.dom.element.db.DbColumnDefinitionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbColumnDefinitionsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbColumnsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbComponentElement;
+import org.odftoolkit.odfdom.dom.element.db.DbComponentCollectionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbConnectionDataElement;
+import org.odftoolkit.odfdom.dom.element.db.DbConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDataSourceElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDataSourceSettingElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDataSourceSettingValueElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDataSourceSettingsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDatabaseDescriptionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDelimiterElement;
+import org.odftoolkit.odfdom.dom.element.db.DbDriverSettingsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbFileBasedDatabaseElement;
+import org.odftoolkit.odfdom.dom.element.db.DbFilterStatementElement;
+import org.odftoolkit.odfdom.dom.element.db.DbFormsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbIndexElement;
+import org.odftoolkit.odfdom.dom.element.db.DbIndexColumnElement;
+import org.odftoolkit.odfdom.dom.element.db.DbIndexColumnsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbIndicesElement;
+import org.odftoolkit.odfdom.dom.element.db.DbKeyElement;
+import org.odftoolkit.odfdom.dom.element.db.DbKeyColumnElement;
+import org.odftoolkit.odfdom.dom.element.db.DbKeyColumnsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbKeysElement;
+import org.odftoolkit.odfdom.dom.element.db.DbLoginElement;
+import org.odftoolkit.odfdom.dom.element.db.DbOrderStatementElement;
+import org.odftoolkit.odfdom.dom.element.db.DbQueriesElement;
+import org.odftoolkit.odfdom.dom.element.db.DbQueryElement;
+import org.odftoolkit.odfdom.dom.element.db.DbQueryCollectionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbReportsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbSchemaDefinitionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbServerDatabaseElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableDefinitionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableDefinitionsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableExcludeFilterElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableFilterElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableFilterPatternElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableIncludeFilterElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableRepresentationElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableRepresentationsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableSettingElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableSettingsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableTypeElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableTypeFilterElement;
+import org.odftoolkit.odfdom.dom.element.db.DbUpdateTableElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDescriptionElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcLanguageElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcSubjectElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcTitleElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dCubeElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dExtrudeElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dLightElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dRotateElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSphereElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAppletElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAreaCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAreaPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAreaRectangleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawContourPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawContourPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEnhancedGeometryElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEquationElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFloatingFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGluePointElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGradientElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawHandleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawHatchElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageMapElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLayerElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLayerSetElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMarkerElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectOleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawOpacityElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawParamElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPluginElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawStrokeDashElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawTextBoxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormButtonElement;
+import org.odftoolkit.odfdom.dom.element.form.FormCheckboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormColumnElement;
+import org.odftoolkit.odfdom.dom.element.form.FormComboboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.element.form.FormDateElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFileElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFixedTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFrameElement;
+import org.odftoolkit.odfdom.dom.element.form.FormGenericControlElement;
+import org.odftoolkit.odfdom.dom.element.form.FormGridElement;
+import org.odftoolkit.odfdom.dom.element.form.FormHiddenElement;
+import org.odftoolkit.odfdom.dom.element.form.FormImageElement;
+import org.odftoolkit.odfdom.dom.element.form.FormImageFrameElement;
+import org.odftoolkit.odfdom.dom.element.form.FormItemElement;
+import org.odftoolkit.odfdom.dom.element.form.FormListPropertyElement;
+import org.odftoolkit.odfdom.dom.element.form.FormListValueElement;
+import org.odftoolkit.odfdom.dom.element.form.FormListboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormNumberElement;
+import org.odftoolkit.odfdom.dom.element.form.FormOptionElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPasswordElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertyElement;
+import org.odftoolkit.odfdom.dom.element.form.FormRadioElement;
+import org.odftoolkit.odfdom.dom.element.form.FormTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormTextareaElement;
+import org.odftoolkit.odfdom.dom.element.form.FormTimeElement;
+import org.odftoolkit.odfdom.dom.element.form.FormValueRangeElement;
+import org.odftoolkit.odfdom.dom.element.math.MathMathElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaAutoReloadElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaCreationDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDateStringElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingCyclesElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingDurationElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaGeneratorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaHyperlinkBehaviourElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaInitialCreatorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintedByElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaTemplateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberAmPmElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencyStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencySymbolElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDateStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDayElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDayOfWeekElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberEmbeddedTextElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberEraElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberFractionElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberHoursElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberMinutesElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberMonthElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberPercentageStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberQuarterElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberScientificNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberSecondsElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextContentElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTimeStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberWeekOfYearElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberYearElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAutomaticStylesElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBinaryDataElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChartElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDatabaseElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDdeSourceElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentContentElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentMetaElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentSettingsElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentStylesElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDrawingElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFontFaceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeImageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMetaElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeScriptElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeScriptsElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSettingsElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeStylesElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationAnimationGroupElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationAnimationsElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeDeclElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDimElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationEventListenerElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterDeclElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderDeclElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHideShapeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHideTextElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationPlaceholderElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationPlayElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationShowElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationShowShapeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationShowTextElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationSoundElement;
+import org.odftoolkit.odfdom.dom.element.script.ScriptEventListenerElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleBackgroundImageElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleChartPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleColumnElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleColumnSepElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleColumnsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDefaultPageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDefaultStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDrawingPagePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDropCapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFontFaceElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterLeftElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFootnoteSepElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHandoutMasterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderFooterPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderLeftElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelLabelAlignmentElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePresentationPageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleRegionCenterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleRegionLeftElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleRegionRightElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleRubyPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleSectionPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTabStopElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTabStopsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableRowPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDefinitionSrcElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgFontFaceFormatElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgFontFaceNameElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgFontFaceSrcElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgFontFaceUriElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgLinearGradientElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgRadialGradientElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgStopElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.table.TableBackgroundElement;
+import org.odftoolkit.odfdom.dom.element.table.TableBodyElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCellAddressElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCellContentChangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCellContentDeletionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCellRangeSourceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableChangeDeletionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableChangeTrackTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableConsolidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCutOffsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotDisplayInfoElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotFieldElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotFieldReferenceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotGroupMemberElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotGroupsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotLayoutInfoElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotLevelElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotMemberElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotMembersElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotSortInfoElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotSubtotalElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotSubtotalsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTablesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseSourceQueryElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseSourceSqlElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseSourceTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinkElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinksElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDeletionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDeletionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDependenciesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDependencyElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDescElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDetectiveElement;
+import org.odftoolkit.odfdom.dom.element.table.TableErrorMacroElement;
+import org.odftoolkit.odfdom.dom.element.table.TableErrorMessageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableEvenColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableEvenRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFilterElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFilterAndElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFilterConditionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFilterOrElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFilterSetItemElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFirstColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFirstRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableHelpMessageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableHighlightedRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableInsertionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableInsertionCutOffElement;
+import org.odftoolkit.odfdom.dom.element.table.TableIterationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLastColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLastRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableMovementElement;
+import org.odftoolkit.odfdom.dom.element.table.TableMovementCutOffElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNullDateElement;
+import org.odftoolkit.odfdom.dom.element.table.TableOddColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableOddRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableOperationElement;
+import org.odftoolkit.odfdom.dom.element.table.TablePreviousElement;
+import org.odftoolkit.odfdom.dom.element.table.TableScenarioElement;
+import org.odftoolkit.odfdom.dom.element.table.TableShapesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSortElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSortByElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSortGroupsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSourceCellRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSourceRangeAddressElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSourceServiceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSubtotalFieldElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSubtotalRuleElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSubtotalRulesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableSourceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableTemplateElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTargetRangeAddressElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTitleElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexMarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexMarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorInitialsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyConfigurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographySourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkRefElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangedRegionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChapterElement;
+import org.odftoolkit.odfdom.dom.element.text.TextCharacterCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextConditionalTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextCreationDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextCreationTimeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextCreatorElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDatabaseDisplayElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDatabaseNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDatabaseNextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDatabaseRowNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDatabaseRowSelectElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDeletionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDescriptionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextEditingCyclesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextEditingDurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextExecuteMacroElement;
+import org.odftoolkit.odfdom.dom.element.text.TextExpressionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextFileNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextFormatChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHiddenParagraphElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHiddenTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextImageCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexBodyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryChapterElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryLinkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryLinkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryPageNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntrySpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryTabStopElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexSourceStyleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexSourceStylesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextInitialCreatorElement;
+import org.odftoolkit.odfdom.dom.element.text.TextInsertionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextKeywordsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLinenumberingConfigurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLinenumberingSeparatorElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListHeaderElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleBulletElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListStyleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextMeasureElement;
+import org.odftoolkit.odfdom.dom.element.text.TextMetaElement;
+import org.odftoolkit.odfdom.dom.element.text.TextMetaFieldElement;
+import org.odftoolkit.odfdom.dom.element.text.TextModificationDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextModificationTimeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNoteElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNoteBodyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNoteCitationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNoteContinuationNoticeBackwardElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNoteContinuationNoticeForwardElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNoteRefElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNotesConfigurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberedParagraphElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextOutlineLevelStyleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextOutlineStyleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageContinuationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageSequenceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageVariableGetElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageVariableSetElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPlaceholderElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPrintDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPrintTimeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPrintedByElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceMarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceMarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceRefElement;
+import org.odftoolkit.odfdom.dom.element.text.TextRubyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextRubyBaseElement;
+import org.odftoolkit.odfdom.dom.element.text.TextRubyTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextScriptElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderCityElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderCompanyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderCountryElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderEmailElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderFaxElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderFirstnameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderInitialsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderLastnameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderPhonePrivateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderPhoneWorkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderPositionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderPostalCodeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderStateOrProvinceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderStreetElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSenderTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceRefElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSheetNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSortKeyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSubjectElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableFormulaElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTemplateNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTextInputElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTimeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserDefinedElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldGetElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldInputElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexMarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexMarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableGetElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableInputElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableSetElement;
+import org.odftoolkit.odfdom.dom.element.text.TextWordCountElement;
+import org.odftoolkit.odfdom.dom.element.xforms.XformsModelElement;
+
+/**
+ * The default visitor for ODF XML sSchema elements.
+ * The default behavior of all specific elements is to dispatch to the visit call
+ * to their super class <code>OdfElement<code>.
+ * This default method is abstract and have to be overridden.
+ * The method is the only method of <code>ElementVisitor<code> interface from the package layer.
+ */
+public abstract class DefaultElementVisitor implements ElementVisitor {
+
+	abstract public void visit(OdfElement element);
+
+	/**
+	 * A method to visit "anim:animate" elements
+	 * @param ele - an instance of AnimAnimateElement
+	 */
+	public void visit(AnimAnimateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:animateColor" elements
+	 * @param ele - an instance of AnimAnimateColorElement
+	 */
+	public void visit(AnimAnimateColorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:animateMotion" elements
+	 * @param ele - an instance of AnimAnimateMotionElement
+	 */
+	public void visit(AnimAnimateMotionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:animateTransform" elements
+	 * @param ele - an instance of AnimAnimateTransformElement
+	 */
+	public void visit(AnimAnimateTransformElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:audio" elements
+	 * @param ele - an instance of AnimAudioElement
+	 */
+	public void visit(AnimAudioElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:command" elements
+	 * @param ele - an instance of AnimCommandElement
+	 */
+	public void visit(AnimCommandElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:iterate" elements
+	 * @param ele - an instance of AnimIterateElement
+	 */
+	public void visit(AnimIterateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:par" elements
+	 * @param ele - an instance of AnimParElement
+	 */
+	public void visit(AnimParElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:param" elements
+	 * @param ele - an instance of AnimParamElement
+	 */
+	public void visit(AnimParamElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:seq" elements
+	 * @param ele - an instance of AnimSeqElement
+	 */
+	public void visit(AnimSeqElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:set" elements
+	 * @param ele - an instance of AnimSetElement
+	 */
+	public void visit(AnimSetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "anim:transitionFilter" elements
+	 * @param ele - an instance of AnimTransitionFilterElement
+	 */
+	public void visit(AnimTransitionFilterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:axis" elements
+	 * @param ele - an instance of ChartAxisElement
+	 */
+	public void visit(ChartAxisElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:categories" elements
+	 * @param ele - an instance of ChartCategoriesElement
+	 */
+	public void visit(ChartCategoriesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:chart" elements
+	 * @param ele - an instance of ChartChartElement
+	 */
+	public void visit(ChartChartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:data-label" elements
+	 * @param ele - an instance of ChartDataLabelElement
+	 */
+	public void visit(ChartDataLabelElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:data-point" elements
+	 * @param ele - an instance of ChartDataPointElement
+	 */
+	public void visit(ChartDataPointElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:domain" elements
+	 * @param ele - an instance of ChartDomainElement
+	 */
+	public void visit(ChartDomainElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:equation" elements
+	 * @param ele - an instance of ChartEquationElement
+	 */
+	public void visit(ChartEquationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:error-indicator" elements
+	 * @param ele - an instance of ChartErrorIndicatorElement
+	 */
+	public void visit(ChartErrorIndicatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:floor" elements
+	 * @param ele - an instance of ChartFloorElement
+	 */
+	public void visit(ChartFloorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:footer" elements
+	 * @param ele - an instance of ChartFooterElement
+	 */
+	public void visit(ChartFooterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:grid" elements
+	 * @param ele - an instance of ChartGridElement
+	 */
+	public void visit(ChartGridElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:label-separator" elements
+	 * @param ele - an instance of ChartLabelSeparatorElement
+	 */
+	public void visit(ChartLabelSeparatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:legend" elements
+	 * @param ele - an instance of ChartLegendElement
+	 */
+	public void visit(ChartLegendElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:mean-value" elements
+	 * @param ele - an instance of ChartMeanValueElement
+	 */
+	public void visit(ChartMeanValueElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:plot-area" elements
+	 * @param ele - an instance of ChartPlotAreaElement
+	 */
+	public void visit(ChartPlotAreaElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:regression-curve" elements
+	 * @param ele - an instance of ChartRegressionCurveElement
+	 */
+	public void visit(ChartRegressionCurveElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:series" elements
+	 * @param ele - an instance of ChartSeriesElement
+	 */
+	public void visit(ChartSeriesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:stock-gain-marker" elements
+	 * @param ele - an instance of ChartStockGainMarkerElement
+	 */
+	public void visit(ChartStockGainMarkerElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:stock-loss-marker" elements
+	 * @param ele - an instance of ChartStockLossMarkerElement
+	 */
+	public void visit(ChartStockLossMarkerElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:stock-range-line" elements
+	 * @param ele - an instance of ChartStockRangeLineElement
+	 */
+	public void visit(ChartStockRangeLineElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:subtitle" elements
+	 * @param ele - an instance of ChartSubtitleElement
+	 */
+	public void visit(ChartSubtitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:symbol-image" elements
+	 * @param ele - an instance of ChartSymbolImageElement
+	 */
+	public void visit(ChartSymbolImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:title" elements
+	 * @param ele - an instance of ChartTitleElement
+	 */
+	public void visit(ChartTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "chart:wall" elements
+	 * @param ele - an instance of ChartWallElement
+	 */
+	public void visit(ChartWallElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "config:config-item" elements
+	 * @param ele - an instance of ConfigConfigItemElement
+	 */
+	public void visit(ConfigConfigItemElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "config:config-item-map-entry" elements
+	 * @param ele - an instance of ConfigConfigItemMapEntryElement
+	 */
+	public void visit(ConfigConfigItemMapEntryElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "config:config-item-map-indexed" elements
+	 * @param ele - an instance of ConfigConfigItemMapIndexedElement
+	 */
+	public void visit(ConfigConfigItemMapIndexedElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "config:config-item-map-named" elements
+	 * @param ele - an instance of ConfigConfigItemMapNamedElement
+	 */
+	public void visit(ConfigConfigItemMapNamedElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "config:config-item-set" elements
+	 * @param ele - an instance of ConfigConfigItemSetElement
+	 */
+	public void visit(ConfigConfigItemSetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:application-connection-settings" elements
+	 * @param ele - an instance of DbApplicationConnectionSettingsElement
+	 */
+	public void visit(DbApplicationConnectionSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:auto-increment" elements
+	 * @param ele - an instance of DbAutoIncrementElement
+	 */
+	public void visit(DbAutoIncrementElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:character-set" elements
+	 * @param ele - an instance of DbCharacterSetElement
+	 */
+	public void visit(DbCharacterSetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:column" elements
+	 * @param ele - an instance of DbColumnElement
+	 */
+	public void visit(DbColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:column-definition" elements
+	 * @param ele - an instance of DbColumnDefinitionElement
+	 */
+	public void visit(DbColumnDefinitionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:column-definitions" elements
+	 * @param ele - an instance of DbColumnDefinitionsElement
+	 */
+	public void visit(DbColumnDefinitionsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:columns" elements
+	 * @param ele - an instance of DbColumnsElement
+	 */
+	public void visit(DbColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:component" elements
+	 * @param ele - an instance of DbComponentElement
+	 */
+	public void visit(DbComponentElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:component-collection" elements
+	 * @param ele - an instance of DbComponentCollectionElement
+	 */
+	public void visit(DbComponentCollectionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:connection-data" elements
+	 * @param ele - an instance of DbConnectionDataElement
+	 */
+	public void visit(DbConnectionDataElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:connection-resource" elements
+	 * @param ele - an instance of DbConnectionResourceElement
+	 */
+	public void visit(DbConnectionResourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:data-source" elements
+	 * @param ele - an instance of DbDataSourceElement
+	 */
+	public void visit(DbDataSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:data-source-setting" elements
+	 * @param ele - an instance of DbDataSourceSettingElement
+	 */
+	public void visit(DbDataSourceSettingElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:data-source-setting-value" elements
+	 * @param ele - an instance of DbDataSourceSettingValueElement
+	 */
+	public void visit(DbDataSourceSettingValueElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:data-source-settings" elements
+	 * @param ele - an instance of DbDataSourceSettingsElement
+	 */
+	public void visit(DbDataSourceSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:database-description" elements
+	 * @param ele - an instance of DbDatabaseDescriptionElement
+	 */
+	public void visit(DbDatabaseDescriptionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:delimiter" elements
+	 * @param ele - an instance of DbDelimiterElement
+	 */
+	public void visit(DbDelimiterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:driver-settings" elements
+	 * @param ele - an instance of DbDriverSettingsElement
+	 */
+	public void visit(DbDriverSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:file-based-database" elements
+	 * @param ele - an instance of DbFileBasedDatabaseElement
+	 */
+	public void visit(DbFileBasedDatabaseElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:filter-statement" elements
+	 * @param ele - an instance of DbFilterStatementElement
+	 */
+	public void visit(DbFilterStatementElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:forms" elements
+	 * @param ele - an instance of DbFormsElement
+	 */
+	public void visit(DbFormsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:index" elements
+	 * @param ele - an instance of DbIndexElement
+	 */
+	public void visit(DbIndexElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:index-column" elements
+	 * @param ele - an instance of DbIndexColumnElement
+	 */
+	public void visit(DbIndexColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:index-columns" elements
+	 * @param ele - an instance of DbIndexColumnsElement
+	 */
+	public void visit(DbIndexColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:indices" elements
+	 * @param ele - an instance of DbIndicesElement
+	 */
+	public void visit(DbIndicesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:key" elements
+	 * @param ele - an instance of DbKeyElement
+	 */
+	public void visit(DbKeyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:key-column" elements
+	 * @param ele - an instance of DbKeyColumnElement
+	 */
+	public void visit(DbKeyColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:key-columns" elements
+	 * @param ele - an instance of DbKeyColumnsElement
+	 */
+	public void visit(DbKeyColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:keys" elements
+	 * @param ele - an instance of DbKeysElement
+	 */
+	public void visit(DbKeysElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:login" elements
+	 * @param ele - an instance of DbLoginElement
+	 */
+	public void visit(DbLoginElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:order-statement" elements
+	 * @param ele - an instance of DbOrderStatementElement
+	 */
+	public void visit(DbOrderStatementElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:queries" elements
+	 * @param ele - an instance of DbQueriesElement
+	 */
+	public void visit(DbQueriesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:query" elements
+	 * @param ele - an instance of DbQueryElement
+	 */
+	public void visit(DbQueryElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:query-collection" elements
+	 * @param ele - an instance of DbQueryCollectionElement
+	 */
+	public void visit(DbQueryCollectionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:reports" elements
+	 * @param ele - an instance of DbReportsElement
+	 */
+	public void visit(DbReportsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:schema-definition" elements
+	 * @param ele - an instance of DbSchemaDefinitionElement
+	 */
+	public void visit(DbSchemaDefinitionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:server-database" elements
+	 * @param ele - an instance of DbServerDatabaseElement
+	 */
+	public void visit(DbServerDatabaseElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-definition" elements
+	 * @param ele - an instance of DbTableDefinitionElement
+	 */
+	public void visit(DbTableDefinitionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-definitions" elements
+	 * @param ele - an instance of DbTableDefinitionsElement
+	 */
+	public void visit(DbTableDefinitionsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-exclude-filter" elements
+	 * @param ele - an instance of DbTableExcludeFilterElement
+	 */
+	public void visit(DbTableExcludeFilterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-filter" elements
+	 * @param ele - an instance of DbTableFilterElement
+	 */
+	public void visit(DbTableFilterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-filter-pattern" elements
+	 * @param ele - an instance of DbTableFilterPatternElement
+	 */
+	public void visit(DbTableFilterPatternElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-include-filter" elements
+	 * @param ele - an instance of DbTableIncludeFilterElement
+	 */
+	public void visit(DbTableIncludeFilterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-representation" elements
+	 * @param ele - an instance of DbTableRepresentationElement
+	 */
+	public void visit(DbTableRepresentationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-representations" elements
+	 * @param ele - an instance of DbTableRepresentationsElement
+	 */
+	public void visit(DbTableRepresentationsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-setting" elements
+	 * @param ele - an instance of DbTableSettingElement
+	 */
+	public void visit(DbTableSettingElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-settings" elements
+	 * @param ele - an instance of DbTableSettingsElement
+	 */
+	public void visit(DbTableSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-type" elements
+	 * @param ele - an instance of DbTableTypeElement
+	 */
+	public void visit(DbTableTypeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:table-type-filter" elements
+	 * @param ele - an instance of DbTableTypeFilterElement
+	 */
+	public void visit(DbTableTypeFilterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "db:update-table" elements
+	 * @param ele - an instance of DbUpdateTableElement
+	 */
+	public void visit(DbUpdateTableElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dc:creator" elements
+	 * @param ele - an instance of DcCreatorElement
+	 */
+	public void visit(DcCreatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dc:date" elements
+	 * @param ele - an instance of DcDateElement
+	 */
+	public void visit(DcDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dc:description" elements
+	 * @param ele - an instance of DcDescriptionElement
+	 */
+	public void visit(DcDescriptionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dc:language" elements
+	 * @param ele - an instance of DcLanguageElement
+	 */
+	public void visit(DcLanguageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dc:subject" elements
+	 * @param ele - an instance of DcSubjectElement
+	 */
+	public void visit(DcSubjectElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dc:title" elements
+	 * @param ele - an instance of DcTitleElement
+	 */
+	public void visit(DcTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dr3d:cube" elements
+	 * @param ele - an instance of Dr3dCubeElement
+	 */
+	public void visit(Dr3dCubeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dr3d:extrude" elements
+	 * @param ele - an instance of Dr3dExtrudeElement
+	 */
+	public void visit(Dr3dExtrudeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dr3d:light" elements
+	 * @param ele - an instance of Dr3dLightElement
+	 */
+	public void visit(Dr3dLightElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dr3d:rotate" elements
+	 * @param ele - an instance of Dr3dRotateElement
+	 */
+	public void visit(Dr3dRotateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dr3d:scene" elements
+	 * @param ele - an instance of Dr3dSceneElement
+	 */
+	public void visit(Dr3dSceneElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "dr3d:sphere" elements
+	 * @param ele - an instance of Dr3dSphereElement
+	 */
+	public void visit(Dr3dSphereElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:a" elements
+	 * @param ele - an instance of DrawAElement
+	 */
+	public void visit(DrawAElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:applet" elements
+	 * @param ele - an instance of DrawAppletElement
+	 */
+	public void visit(DrawAppletElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:area-circle" elements
+	 * @param ele - an instance of DrawAreaCircleElement
+	 */
+	public void visit(DrawAreaCircleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:area-polygon" elements
+	 * @param ele - an instance of DrawAreaPolygonElement
+	 */
+	public void visit(DrawAreaPolygonElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:area-rectangle" elements
+	 * @param ele - an instance of DrawAreaRectangleElement
+	 */
+	public void visit(DrawAreaRectangleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:caption" elements
+	 * @param ele - an instance of DrawCaptionElement
+	 */
+	public void visit(DrawCaptionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:circle" elements
+	 * @param ele - an instance of DrawCircleElement
+	 */
+	public void visit(DrawCircleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:connector" elements
+	 * @param ele - an instance of DrawConnectorElement
+	 */
+	public void visit(DrawConnectorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:contour-path" elements
+	 * @param ele - an instance of DrawContourPathElement
+	 */
+	public void visit(DrawContourPathElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:contour-polygon" elements
+	 * @param ele - an instance of DrawContourPolygonElement
+	 */
+	public void visit(DrawContourPolygonElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:control" elements
+	 * @param ele - an instance of DrawControlElement
+	 */
+	public void visit(DrawControlElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:custom-shape" elements
+	 * @param ele - an instance of DrawCustomShapeElement
+	 */
+	public void visit(DrawCustomShapeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:ellipse" elements
+	 * @param ele - an instance of DrawEllipseElement
+	 */
+	public void visit(DrawEllipseElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:enhanced-geometry" elements
+	 * @param ele - an instance of DrawEnhancedGeometryElement
+	 */
+	public void visit(DrawEnhancedGeometryElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:equation" elements
+	 * @param ele - an instance of DrawEquationElement
+	 */
+	public void visit(DrawEquationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:fill-image" elements
+	 * @param ele - an instance of DrawFillImageElement
+	 */
+	public void visit(DrawFillImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:floating-frame" elements
+	 * @param ele - an instance of DrawFloatingFrameElement
+	 */
+	public void visit(DrawFloatingFrameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:frame" elements
+	 * @param ele - an instance of DrawFrameElement
+	 */
+	public void visit(DrawFrameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:g" elements
+	 * @param ele - an instance of DrawGElement
+	 */
+	public void visit(DrawGElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:glue-point" elements
+	 * @param ele - an instance of DrawGluePointElement
+	 */
+	public void visit(DrawGluePointElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:gradient" elements
+	 * @param ele - an instance of DrawGradientElement
+	 */
+	public void visit(DrawGradientElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:handle" elements
+	 * @param ele - an instance of DrawHandleElement
+	 */
+	public void visit(DrawHandleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:hatch" elements
+	 * @param ele - an instance of DrawHatchElement
+	 */
+	public void visit(DrawHatchElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:image" elements
+	 * @param ele - an instance of DrawImageElement
+	 */
+	public void visit(DrawImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:image-map" elements
+	 * @param ele - an instance of DrawImageMapElement
+	 */
+	public void visit(DrawImageMapElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:layer" elements
+	 * @param ele - an instance of DrawLayerElement
+	 */
+	public void visit(DrawLayerElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:layer-set" elements
+	 * @param ele - an instance of DrawLayerSetElement
+	 */
+	public void visit(DrawLayerSetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:line" elements
+	 * @param ele - an instance of DrawLineElement
+	 */
+	public void visit(DrawLineElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:marker" elements
+	 * @param ele - an instance of DrawMarkerElement
+	 */
+	public void visit(DrawMarkerElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:measure" elements
+	 * @param ele - an instance of DrawMeasureElement
+	 */
+	public void visit(DrawMeasureElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:object" elements
+	 * @param ele - an instance of DrawObjectElement
+	 */
+	public void visit(DrawObjectElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:object-ole" elements
+	 * @param ele - an instance of DrawObjectOleElement
+	 */
+	public void visit(DrawObjectOleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:opacity" elements
+	 * @param ele - an instance of DrawOpacityElement
+	 */
+	public void visit(DrawOpacityElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:page" elements
+	 * @param ele - an instance of DrawPageElement
+	 */
+	public void visit(DrawPageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:page-thumbnail" elements
+	 * @param ele - an instance of DrawPageThumbnailElement
+	 */
+	public void visit(DrawPageThumbnailElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:param" elements
+	 * @param ele - an instance of DrawParamElement
+	 */
+	public void visit(DrawParamElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:path" elements
+	 * @param ele - an instance of DrawPathElement
+	 */
+	public void visit(DrawPathElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:plugin" elements
+	 * @param ele - an instance of DrawPluginElement
+	 */
+	public void visit(DrawPluginElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:polygon" elements
+	 * @param ele - an instance of DrawPolygonElement
+	 */
+	public void visit(DrawPolygonElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:polyline" elements
+	 * @param ele - an instance of DrawPolylineElement
+	 */
+	public void visit(DrawPolylineElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:rect" elements
+	 * @param ele - an instance of DrawRectElement
+	 */
+	public void visit(DrawRectElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:regular-polygon" elements
+	 * @param ele - an instance of DrawRegularPolygonElement
+	 */
+	public void visit(DrawRegularPolygonElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:stroke-dash" elements
+	 * @param ele - an instance of DrawStrokeDashElement
+	 */
+	public void visit(DrawStrokeDashElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "draw:text-box" elements
+	 * @param ele - an instance of DrawTextBoxElement
+	 */
+	public void visit(DrawTextBoxElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:button" elements
+	 * @param ele - an instance of FormButtonElement
+	 */
+	public void visit(FormButtonElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:checkbox" elements
+	 * @param ele - an instance of FormCheckboxElement
+	 */
+	public void visit(FormCheckboxElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:column" elements
+	 * @param ele - an instance of FormColumnElement
+	 */
+	public void visit(FormColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:combobox" elements
+	 * @param ele - an instance of FormComboboxElement
+	 */
+	public void visit(FormComboboxElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:connection-resource" elements
+	 * @param ele - an instance of FormConnectionResourceElement
+	 */
+	public void visit(FormConnectionResourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:date" elements
+	 * @param ele - an instance of FormDateElement
+	 */
+	public void visit(FormDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:file" elements
+	 * @param ele - an instance of FormFileElement
+	 */
+	public void visit(FormFileElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:fixed-text" elements
+	 * @param ele - an instance of FormFixedTextElement
+	 */
+	public void visit(FormFixedTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:form" elements
+	 * @param ele - an instance of FormFormElement
+	 */
+	public void visit(FormFormElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:formatted-text" elements
+	 * @param ele - an instance of FormFormattedTextElement
+	 */
+	public void visit(FormFormattedTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:frame" elements
+	 * @param ele - an instance of FormFrameElement
+	 */
+	public void visit(FormFrameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:generic-control" elements
+	 * @param ele - an instance of FormGenericControlElement
+	 */
+	public void visit(FormGenericControlElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:grid" elements
+	 * @param ele - an instance of FormGridElement
+	 */
+	public void visit(FormGridElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:hidden" elements
+	 * @param ele - an instance of FormHiddenElement
+	 */
+	public void visit(FormHiddenElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:image" elements
+	 * @param ele - an instance of FormImageElement
+	 */
+	public void visit(FormImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:image-frame" elements
+	 * @param ele - an instance of FormImageFrameElement
+	 */
+	public void visit(FormImageFrameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:item" elements
+	 * @param ele - an instance of FormItemElement
+	 */
+	public void visit(FormItemElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:list-property" elements
+	 * @param ele - an instance of FormListPropertyElement
+	 */
+	public void visit(FormListPropertyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:list-value" elements
+	 * @param ele - an instance of FormListValueElement
+	 */
+	public void visit(FormListValueElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:listbox" elements
+	 * @param ele - an instance of FormListboxElement
+	 */
+	public void visit(FormListboxElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:number" elements
+	 * @param ele - an instance of FormNumberElement
+	 */
+	public void visit(FormNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:option" elements
+	 * @param ele - an instance of FormOptionElement
+	 */
+	public void visit(FormOptionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:password" elements
+	 * @param ele - an instance of FormPasswordElement
+	 */
+	public void visit(FormPasswordElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:properties" elements
+	 * @param ele - an instance of FormPropertiesElement
+	 */
+	public void visit(FormPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:property" elements
+	 * @param ele - an instance of FormPropertyElement
+	 */
+	public void visit(FormPropertyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:radio" elements
+	 * @param ele - an instance of FormRadioElement
+	 */
+	public void visit(FormRadioElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:text" elements
+	 * @param ele - an instance of FormTextElement
+	 */
+	public void visit(FormTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:textarea" elements
+	 * @param ele - an instance of FormTextareaElement
+	 */
+	public void visit(FormTextareaElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:time" elements
+	 * @param ele - an instance of FormTimeElement
+	 */
+	public void visit(FormTimeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "form:value-range" elements
+	 * @param ele - an instance of FormValueRangeElement
+	 */
+	public void visit(FormValueRangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "math:math" elements
+	 * @param ele - an instance of MathMathElement
+	 */
+	public void visit(MathMathElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:auto-reload" elements
+	 * @param ele - an instance of MetaAutoReloadElement
+	 */
+	public void visit(MetaAutoReloadElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:creation-date" elements
+	 * @param ele - an instance of MetaCreationDateElement
+	 */
+	public void visit(MetaCreationDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:date-string" elements
+	 * @param ele - an instance of MetaDateStringElement
+	 */
+	public void visit(MetaDateStringElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:document-statistic" elements
+	 * @param ele - an instance of MetaDocumentStatisticElement
+	 */
+	public void visit(MetaDocumentStatisticElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:editing-cycles" elements
+	 * @param ele - an instance of MetaEditingCyclesElement
+	 */
+	public void visit(MetaEditingCyclesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:editing-duration" elements
+	 * @param ele - an instance of MetaEditingDurationElement
+	 */
+	public void visit(MetaEditingDurationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:generator" elements
+	 * @param ele - an instance of MetaGeneratorElement
+	 */
+	public void visit(MetaGeneratorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:hyperlink-behaviour" elements
+	 * @param ele - an instance of MetaHyperlinkBehaviourElement
+	 */
+	public void visit(MetaHyperlinkBehaviourElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:initial-creator" elements
+	 * @param ele - an instance of MetaInitialCreatorElement
+	 */
+	public void visit(MetaInitialCreatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:keyword" elements
+	 * @param ele - an instance of MetaKeywordElement
+	 */
+	public void visit(MetaKeywordElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:print-date" elements
+	 * @param ele - an instance of MetaPrintDateElement
+	 */
+	public void visit(MetaPrintDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:printed-by" elements
+	 * @param ele - an instance of MetaPrintedByElement
+	 */
+	public void visit(MetaPrintedByElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:template" elements
+	 * @param ele - an instance of MetaTemplateElement
+	 */
+	public void visit(MetaTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "meta:user-defined" elements
+	 * @param ele - an instance of MetaUserDefinedElement
+	 */
+	public void visit(MetaUserDefinedElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:am-pm" elements
+	 * @param ele - an instance of NumberAmPmElement
+	 */
+	public void visit(NumberAmPmElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:boolean" elements
+	 * @param ele - an instance of NumberBooleanElement
+	 */
+	public void visit(NumberBooleanElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:boolean-style" elements
+	 * @param ele - an instance of NumberBooleanStyleElement
+	 */
+	public void visit(NumberBooleanStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:currency-style" elements
+	 * @param ele - an instance of NumberCurrencyStyleElement
+	 */
+	public void visit(NumberCurrencyStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:currency-symbol" elements
+	 * @param ele - an instance of NumberCurrencySymbolElement
+	 */
+	public void visit(NumberCurrencySymbolElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:date-style" elements
+	 * @param ele - an instance of NumberDateStyleElement
+	 */
+	public void visit(NumberDateStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:day" elements
+	 * @param ele - an instance of NumberDayElement
+	 */
+	public void visit(NumberDayElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:day-of-week" elements
+	 * @param ele - an instance of NumberDayOfWeekElement
+	 */
+	public void visit(NumberDayOfWeekElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:embedded-text" elements
+	 * @param ele - an instance of NumberEmbeddedTextElement
+	 */
+	public void visit(NumberEmbeddedTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:era" elements
+	 * @param ele - an instance of NumberEraElement
+	 */
+	public void visit(NumberEraElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:fraction" elements
+	 * @param ele - an instance of NumberFractionElement
+	 */
+	public void visit(NumberFractionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:hours" elements
+	 * @param ele - an instance of NumberHoursElement
+	 */
+	public void visit(NumberHoursElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:minutes" elements
+	 * @param ele - an instance of NumberMinutesElement
+	 */
+	public void visit(NumberMinutesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:month" elements
+	 * @param ele - an instance of NumberMonthElement
+	 */
+	public void visit(NumberMonthElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:number" elements
+	 * @param ele - an instance of NumberNumberElement
+	 */
+	public void visit(NumberNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:number-style" elements
+	 * @param ele - an instance of NumberNumberStyleElement
+	 */
+	public void visit(NumberNumberStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:percentage-style" elements
+	 * @param ele - an instance of NumberPercentageStyleElement
+	 */
+	public void visit(NumberPercentageStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:quarter" elements
+	 * @param ele - an instance of NumberQuarterElement
+	 */
+	public void visit(NumberQuarterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:scientific-number" elements
+	 * @param ele - an instance of NumberScientificNumberElement
+	 */
+	public void visit(NumberScientificNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:seconds" elements
+	 * @param ele - an instance of NumberSecondsElement
+	 */
+	public void visit(NumberSecondsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:text" elements
+	 * @param ele - an instance of NumberTextElement
+	 */
+	public void visit(NumberTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:text-content" elements
+	 * @param ele - an instance of NumberTextContentElement
+	 */
+	public void visit(NumberTextContentElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:text-style" elements
+	 * @param ele - an instance of NumberTextStyleElement
+	 */
+	public void visit(NumberTextStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:time-style" elements
+	 * @param ele - an instance of NumberTimeStyleElement
+	 */
+	public void visit(NumberTimeStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:week-of-year" elements
+	 * @param ele - an instance of NumberWeekOfYearElement
+	 */
+	public void visit(NumberWeekOfYearElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "number:year" elements
+	 * @param ele - an instance of NumberYearElement
+	 */
+	public void visit(NumberYearElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:annotation" elements
+	 * @param ele - an instance of OfficeAnnotationElement
+	 */
+	public void visit(OfficeAnnotationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:annotation-end" elements
+	 * @param ele - an instance of OfficeAnnotationEndElement
+	 */
+	public void visit(OfficeAnnotationEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:automatic-styles" elements
+	 * @param ele - an instance of OfficeAutomaticStylesElement
+	 */
+	public void visit(OfficeAutomaticStylesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:binary-data" elements
+	 * @param ele - an instance of OfficeBinaryDataElement
+	 */
+	public void visit(OfficeBinaryDataElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:body" elements
+	 * @param ele - an instance of OfficeBodyElement
+	 */
+	public void visit(OfficeBodyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:change-info" elements
+	 * @param ele - an instance of OfficeChangeInfoElement
+	 */
+	public void visit(OfficeChangeInfoElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:chart" elements
+	 * @param ele - an instance of OfficeChartElement
+	 */
+	public void visit(OfficeChartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:database" elements
+	 * @param ele - an instance of OfficeDatabaseElement
+	 */
+	public void visit(OfficeDatabaseElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:dde-source" elements
+	 * @param ele - an instance of OfficeDdeSourceElement
+	 */
+	public void visit(OfficeDdeSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:document" elements
+	 * @param ele - an instance of OfficeDocumentElement
+	 */
+	public void visit(OfficeDocumentElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:document-content" elements
+	 * @param ele - an instance of OfficeDocumentContentElement
+	 */
+	public void visit(OfficeDocumentContentElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:document-meta" elements
+	 * @param ele - an instance of OfficeDocumentMetaElement
+	 */
+	public void visit(OfficeDocumentMetaElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:document-settings" elements
+	 * @param ele - an instance of OfficeDocumentSettingsElement
+	 */
+	public void visit(OfficeDocumentSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:document-styles" elements
+	 * @param ele - an instance of OfficeDocumentStylesElement
+	 */
+	public void visit(OfficeDocumentStylesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:drawing" elements
+	 * @param ele - an instance of OfficeDrawingElement
+	 */
+	public void visit(OfficeDrawingElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:event-listeners" elements
+	 * @param ele - an instance of OfficeEventListenersElement
+	 */
+	public void visit(OfficeEventListenersElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:font-face-decls" elements
+	 * @param ele - an instance of OfficeFontFaceDeclsElement
+	 */
+	public void visit(OfficeFontFaceDeclsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:forms" elements
+	 * @param ele - an instance of OfficeFormsElement
+	 */
+	public void visit(OfficeFormsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:image" elements
+	 * @param ele - an instance of OfficeImageElement
+	 */
+	public void visit(OfficeImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:master-styles" elements
+	 * @param ele - an instance of OfficeMasterStylesElement
+	 */
+	public void visit(OfficeMasterStylesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:meta" elements
+	 * @param ele - an instance of OfficeMetaElement
+	 */
+	public void visit(OfficeMetaElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:presentation" elements
+	 * @param ele - an instance of OfficePresentationElement
+	 */
+	public void visit(OfficePresentationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:script" elements
+	 * @param ele - an instance of OfficeScriptElement
+	 */
+	public void visit(OfficeScriptElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:scripts" elements
+	 * @param ele - an instance of OfficeScriptsElement
+	 */
+	public void visit(OfficeScriptsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:settings" elements
+	 * @param ele - an instance of OfficeSettingsElement
+	 */
+	public void visit(OfficeSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:spreadsheet" elements
+	 * @param ele - an instance of OfficeSpreadsheetElement
+	 */
+	public void visit(OfficeSpreadsheetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:styles" elements
+	 * @param ele - an instance of OfficeStylesElement
+	 */
+	public void visit(OfficeStylesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "office:text" elements
+	 * @param ele - an instance of OfficeTextElement
+	 */
+	public void visit(OfficeTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:animation-group" elements
+	 * @param ele - an instance of PresentationAnimationGroupElement
+	 */
+	public void visit(PresentationAnimationGroupElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:animations" elements
+	 * @param ele - an instance of PresentationAnimationsElement
+	 */
+	public void visit(PresentationAnimationsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:date-time" elements
+	 * @param ele - an instance of PresentationDateTimeElement
+	 */
+	public void visit(PresentationDateTimeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:date-time-decl" elements
+	 * @param ele - an instance of PresentationDateTimeDeclElement
+	 */
+	public void visit(PresentationDateTimeDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:dim" elements
+	 * @param ele - an instance of PresentationDimElement
+	 */
+	public void visit(PresentationDimElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:event-listener" elements
+	 * @param ele - an instance of PresentationEventListenerElement
+	 */
+	public void visit(PresentationEventListenerElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:footer" elements
+	 * @param ele - an instance of PresentationFooterElement
+	 */
+	public void visit(PresentationFooterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:footer-decl" elements
+	 * @param ele - an instance of PresentationFooterDeclElement
+	 */
+	public void visit(PresentationFooterDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:header" elements
+	 * @param ele - an instance of PresentationHeaderElement
+	 */
+	public void visit(PresentationHeaderElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:header-decl" elements
+	 * @param ele - an instance of PresentationHeaderDeclElement
+	 */
+	public void visit(PresentationHeaderDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:hide-shape" elements
+	 * @param ele - an instance of PresentationHideShapeElement
+	 */
+	public void visit(PresentationHideShapeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:hide-text" elements
+	 * @param ele - an instance of PresentationHideTextElement
+	 */
+	public void visit(PresentationHideTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:notes" elements
+	 * @param ele - an instance of PresentationNotesElement
+	 */
+	public void visit(PresentationNotesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:placeholder" elements
+	 * @param ele - an instance of PresentationPlaceholderElement
+	 */
+	public void visit(PresentationPlaceholderElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:play" elements
+	 * @param ele - an instance of PresentationPlayElement
+	 */
+	public void visit(PresentationPlayElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:settings" elements
+	 * @param ele - an instance of PresentationSettingsElement
+	 */
+	public void visit(PresentationSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:show" elements
+	 * @param ele - an instance of PresentationShowElement
+	 */
+	public void visit(PresentationShowElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:show-shape" elements
+	 * @param ele - an instance of PresentationShowShapeElement
+	 */
+	public void visit(PresentationShowShapeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:show-text" elements
+	 * @param ele - an instance of PresentationShowTextElement
+	 */
+	public void visit(PresentationShowTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "presentation:sound" elements
+	 * @param ele - an instance of PresentationSoundElement
+	 */
+	public void visit(PresentationSoundElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "script:event-listener" elements
+	 * @param ele - an instance of ScriptEventListenerElement
+	 */
+	public void visit(ScriptEventListenerElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:background-image" elements
+	 * @param ele - an instance of StyleBackgroundImageElement
+	 */
+	public void visit(StyleBackgroundImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:chart-properties" elements
+	 * @param ele - an instance of StyleChartPropertiesElement
+	 */
+	public void visit(StyleChartPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:column" elements
+	 * @param ele - an instance of StyleColumnElement
+	 */
+	public void visit(StyleColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:column-sep" elements
+	 * @param ele - an instance of StyleColumnSepElement
+	 */
+	public void visit(StyleColumnSepElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:columns" elements
+	 * @param ele - an instance of StyleColumnsElement
+	 */
+	public void visit(StyleColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:default-page-layout" elements
+	 * @param ele - an instance of StyleDefaultPageLayoutElement
+	 */
+	public void visit(StyleDefaultPageLayoutElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:default-style" elements
+	 * @param ele - an instance of StyleDefaultStyleElement
+	 */
+	public void visit(StyleDefaultStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:drawing-page-properties" elements
+	 * @param ele - an instance of StyleDrawingPagePropertiesElement
+	 */
+	public void visit(StyleDrawingPagePropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:drop-cap" elements
+	 * @param ele - an instance of StyleDropCapElement
+	 */
+	public void visit(StyleDropCapElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:font-face" elements
+	 * @param ele - an instance of StyleFontFaceElement
+	 */
+	public void visit(StyleFontFaceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:footer" elements
+	 * @param ele - an instance of StyleFooterElement
+	 */
+	public void visit(StyleFooterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:footer-left" elements
+	 * @param ele - an instance of StyleFooterLeftElement
+	 */
+	public void visit(StyleFooterLeftElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:footer-style" elements
+	 * @param ele - an instance of StyleFooterStyleElement
+	 */
+	public void visit(StyleFooterStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:footnote-sep" elements
+	 * @param ele - an instance of StyleFootnoteSepElement
+	 */
+	public void visit(StyleFootnoteSepElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:graphic-properties" elements
+	 * @param ele - an instance of StyleGraphicPropertiesElement
+	 */
+	public void visit(StyleGraphicPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:handout-master" elements
+	 * @param ele - an instance of StyleHandoutMasterElement
+	 */
+	public void visit(StyleHandoutMasterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:header" elements
+	 * @param ele - an instance of StyleHeaderElement
+	 */
+	public void visit(StyleHeaderElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:header-footer-properties" elements
+	 * @param ele - an instance of StyleHeaderFooterPropertiesElement
+	 */
+	public void visit(StyleHeaderFooterPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:header-left" elements
+	 * @param ele - an instance of StyleHeaderLeftElement
+	 */
+	public void visit(StyleHeaderLeftElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:header-style" elements
+	 * @param ele - an instance of StyleHeaderStyleElement
+	 */
+	public void visit(StyleHeaderStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:list-level-label-alignment" elements
+	 * @param ele - an instance of StyleListLevelLabelAlignmentElement
+	 */
+	public void visit(StyleListLevelLabelAlignmentElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:list-level-properties" elements
+	 * @param ele - an instance of StyleListLevelPropertiesElement
+	 */
+	public void visit(StyleListLevelPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:map" elements
+	 * @param ele - an instance of StyleMapElement
+	 */
+	public void visit(StyleMapElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:master-page" elements
+	 * @param ele - an instance of StyleMasterPageElement
+	 */
+	public void visit(StyleMasterPageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:page-layout" elements
+	 * @param ele - an instance of StylePageLayoutElement
+	 */
+	public void visit(StylePageLayoutElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:page-layout-properties" elements
+	 * @param ele - an instance of StylePageLayoutPropertiesElement
+	 */
+	public void visit(StylePageLayoutPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:paragraph-properties" elements
+	 * @param ele - an instance of StyleParagraphPropertiesElement
+	 */
+	public void visit(StyleParagraphPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:presentation-page-layout" elements
+	 * @param ele - an instance of StylePresentationPageLayoutElement
+	 */
+	public void visit(StylePresentationPageLayoutElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:region-center" elements
+	 * @param ele - an instance of StyleRegionCenterElement
+	 */
+	public void visit(StyleRegionCenterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:region-left" elements
+	 * @param ele - an instance of StyleRegionLeftElement
+	 */
+	public void visit(StyleRegionLeftElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:region-right" elements
+	 * @param ele - an instance of StyleRegionRightElement
+	 */
+	public void visit(StyleRegionRightElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:ruby-properties" elements
+	 * @param ele - an instance of StyleRubyPropertiesElement
+	 */
+	public void visit(StyleRubyPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:section-properties" elements
+	 * @param ele - an instance of StyleSectionPropertiesElement
+	 */
+	public void visit(StyleSectionPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:style" elements
+	 * @param ele - an instance of StyleStyleElement
+	 */
+	public void visit(StyleStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:tab-stop" elements
+	 * @param ele - an instance of StyleTabStopElement
+	 */
+	public void visit(StyleTabStopElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:tab-stops" elements
+	 * @param ele - an instance of StyleTabStopsElement
+	 */
+	public void visit(StyleTabStopsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:table-cell-properties" elements
+	 * @param ele - an instance of StyleTableCellPropertiesElement
+	 */
+	public void visit(StyleTableCellPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:table-column-properties" elements
+	 * @param ele - an instance of StyleTableColumnPropertiesElement
+	 */
+	public void visit(StyleTableColumnPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:table-properties" elements
+	 * @param ele - an instance of StyleTablePropertiesElement
+	 */
+	public void visit(StyleTablePropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:table-row-properties" elements
+	 * @param ele - an instance of StyleTableRowPropertiesElement
+	 */
+	public void visit(StyleTableRowPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "style:text-properties" elements
+	 * @param ele - an instance of StyleTextPropertiesElement
+	 */
+	public void visit(StyleTextPropertiesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:definition-src" elements
+	 * @param ele - an instance of SvgDefinitionSrcElement
+	 */
+	public void visit(SvgDefinitionSrcElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:desc" elements
+	 * @param ele - an instance of SvgDescElement
+	 */
+	public void visit(SvgDescElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:font-face-format" elements
+	 * @param ele - an instance of SvgFontFaceFormatElement
+	 */
+	public void visit(SvgFontFaceFormatElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:font-face-name" elements
+	 * @param ele - an instance of SvgFontFaceNameElement
+	 */
+	public void visit(SvgFontFaceNameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:font-face-src" elements
+	 * @param ele - an instance of SvgFontFaceSrcElement
+	 */
+	public void visit(SvgFontFaceSrcElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:font-face-uri" elements
+	 * @param ele - an instance of SvgFontFaceUriElement
+	 */
+	public void visit(SvgFontFaceUriElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:linearGradient" elements
+	 * @param ele - an instance of SvgLinearGradientElement
+	 */
+	public void visit(SvgLinearGradientElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:radialGradient" elements
+	 * @param ele - an instance of SvgRadialGradientElement
+	 */
+	public void visit(SvgRadialGradientElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:stop" elements
+	 * @param ele - an instance of SvgStopElement
+	 */
+	public void visit(SvgStopElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "svg:title" elements
+	 * @param ele - an instance of SvgTitleElement
+	 */
+	public void visit(SvgTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:background" elements
+	 * @param ele - an instance of TableBackgroundElement
+	 */
+	public void visit(TableBackgroundElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:body" elements
+	 * @param ele - an instance of TableBodyElement
+	 */
+	public void visit(TableBodyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:calculation-settings" elements
+	 * @param ele - an instance of TableCalculationSettingsElement
+	 */
+	public void visit(TableCalculationSettingsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:cell-address" elements
+	 * @param ele - an instance of TableCellAddressElement
+	 */
+	public void visit(TableCellAddressElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:cell-content-change" elements
+	 * @param ele - an instance of TableCellContentChangeElement
+	 */
+	public void visit(TableCellContentChangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:cell-content-deletion" elements
+	 * @param ele - an instance of TableCellContentDeletionElement
+	 */
+	public void visit(TableCellContentDeletionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:cell-range-source" elements
+	 * @param ele - an instance of TableCellRangeSourceElement
+	 */
+	public void visit(TableCellRangeSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:change-deletion" elements
+	 * @param ele - an instance of TableChangeDeletionElement
+	 */
+	public void visit(TableChangeDeletionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:change-track-table-cell" elements
+	 * @param ele - an instance of TableChangeTrackTableCellElement
+	 */
+	public void visit(TableChangeTrackTableCellElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:consolidation" elements
+	 * @param ele - an instance of TableConsolidationElement
+	 */
+	public void visit(TableConsolidationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:content-validation" elements
+	 * @param ele - an instance of TableContentValidationElement
+	 */
+	public void visit(TableContentValidationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:content-validations" elements
+	 * @param ele - an instance of TableContentValidationsElement
+	 */
+	public void visit(TableContentValidationsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:covered-table-cell" elements
+	 * @param ele - an instance of TableCoveredTableCellElement
+	 */
+	public void visit(TableCoveredTableCellElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:cut-offs" elements
+	 * @param ele - an instance of TableCutOffsElement
+	 */
+	public void visit(TableCutOffsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-display-info" elements
+	 * @param ele - an instance of TableDataPilotDisplayInfoElement
+	 */
+	public void visit(TableDataPilotDisplayInfoElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-field" elements
+	 * @param ele - an instance of TableDataPilotFieldElement
+	 */
+	public void visit(TableDataPilotFieldElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-field-reference" elements
+	 * @param ele - an instance of TableDataPilotFieldReferenceElement
+	 */
+	public void visit(TableDataPilotFieldReferenceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-group" elements
+	 * @param ele - an instance of TableDataPilotGroupElement
+	 */
+	public void visit(TableDataPilotGroupElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-group-member" elements
+	 * @param ele - an instance of TableDataPilotGroupMemberElement
+	 */
+	public void visit(TableDataPilotGroupMemberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-groups" elements
+	 * @param ele - an instance of TableDataPilotGroupsElement
+	 */
+	public void visit(TableDataPilotGroupsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-layout-info" elements
+	 * @param ele - an instance of TableDataPilotLayoutInfoElement
+	 */
+	public void visit(TableDataPilotLayoutInfoElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-level" elements
+	 * @param ele - an instance of TableDataPilotLevelElement
+	 */
+	public void visit(TableDataPilotLevelElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-member" elements
+	 * @param ele - an instance of TableDataPilotMemberElement
+	 */
+	public void visit(TableDataPilotMemberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-members" elements
+	 * @param ele - an instance of TableDataPilotMembersElement
+	 */
+	public void visit(TableDataPilotMembersElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-sort-info" elements
+	 * @param ele - an instance of TableDataPilotSortInfoElement
+	 */
+	public void visit(TableDataPilotSortInfoElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-subtotal" elements
+	 * @param ele - an instance of TableDataPilotSubtotalElement
+	 */
+	public void visit(TableDataPilotSubtotalElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-subtotals" elements
+	 * @param ele - an instance of TableDataPilotSubtotalsElement
+	 */
+	public void visit(TableDataPilotSubtotalsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-table" elements
+	 * @param ele - an instance of TableDataPilotTableElement
+	 */
+	public void visit(TableDataPilotTableElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:data-pilot-tables" elements
+	 * @param ele - an instance of TableDataPilotTablesElement
+	 */
+	public void visit(TableDataPilotTablesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:database-range" elements
+	 * @param ele - an instance of TableDatabaseRangeElement
+	 */
+	public void visit(TableDatabaseRangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:database-ranges" elements
+	 * @param ele - an instance of TableDatabaseRangesElement
+	 */
+	public void visit(TableDatabaseRangesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:database-source-query" elements
+	 * @param ele - an instance of TableDatabaseSourceQueryElement
+	 */
+	public void visit(TableDatabaseSourceQueryElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:database-source-sql" elements
+	 * @param ele - an instance of TableDatabaseSourceSqlElement
+	 */
+	public void visit(TableDatabaseSourceSqlElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:database-source-table" elements
+	 * @param ele - an instance of TableDatabaseSourceTableElement
+	 */
+	public void visit(TableDatabaseSourceTableElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:dde-link" elements
+	 * @param ele - an instance of TableDdeLinkElement
+	 */
+	public void visit(TableDdeLinkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:dde-links" elements
+	 * @param ele - an instance of TableDdeLinksElement
+	 */
+	public void visit(TableDdeLinksElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:deletion" elements
+	 * @param ele - an instance of TableDeletionElement
+	 */
+	public void visit(TableDeletionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:deletions" elements
+	 * @param ele - an instance of TableDeletionsElement
+	 */
+	public void visit(TableDeletionsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:dependencies" elements
+	 * @param ele - an instance of TableDependenciesElement
+	 */
+	public void visit(TableDependenciesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:dependency" elements
+	 * @param ele - an instance of TableDependencyElement
+	 */
+	public void visit(TableDependencyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:desc" elements
+	 * @param ele - an instance of TableDescElement
+	 */
+	public void visit(TableDescElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:detective" elements
+	 * @param ele - an instance of TableDetectiveElement
+	 */
+	public void visit(TableDetectiveElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:error-macro" elements
+	 * @param ele - an instance of TableErrorMacroElement
+	 */
+	public void visit(TableErrorMacroElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:error-message" elements
+	 * @param ele - an instance of TableErrorMessageElement
+	 */
+	public void visit(TableErrorMessageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:even-columns" elements
+	 * @param ele - an instance of TableEvenColumnsElement
+	 */
+	public void visit(TableEvenColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:even-rows" elements
+	 * @param ele - an instance of TableEvenRowsElement
+	 */
+	public void visit(TableEvenRowsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:filter" elements
+	 * @param ele - an instance of TableFilterElement
+	 */
+	public void visit(TableFilterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:filter-and" elements
+	 * @param ele - an instance of TableFilterAndElement
+	 */
+	public void visit(TableFilterAndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:filter-condition" elements
+	 * @param ele - an instance of TableFilterConditionElement
+	 */
+	public void visit(TableFilterConditionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:filter-or" elements
+	 * @param ele - an instance of TableFilterOrElement
+	 */
+	public void visit(TableFilterOrElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:filter-set-item" elements
+	 * @param ele - an instance of TableFilterSetItemElement
+	 */
+	public void visit(TableFilterSetItemElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:first-column" elements
+	 * @param ele - an instance of TableFirstColumnElement
+	 */
+	public void visit(TableFirstColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:first-row" elements
+	 * @param ele - an instance of TableFirstRowElement
+	 */
+	public void visit(TableFirstRowElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:help-message" elements
+	 * @param ele - an instance of TableHelpMessageElement
+	 */
+	public void visit(TableHelpMessageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:highlighted-range" elements
+	 * @param ele - an instance of TableHighlightedRangeElement
+	 */
+	public void visit(TableHighlightedRangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:insertion" elements
+	 * @param ele - an instance of TableInsertionElement
+	 */
+	public void visit(TableInsertionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:insertion-cut-off" elements
+	 * @param ele - an instance of TableInsertionCutOffElement
+	 */
+	public void visit(TableInsertionCutOffElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:iteration" elements
+	 * @param ele - an instance of TableIterationElement
+	 */
+	public void visit(TableIterationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:label-range" elements
+	 * @param ele - an instance of TableLabelRangeElement
+	 */
+	public void visit(TableLabelRangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:label-ranges" elements
+	 * @param ele - an instance of TableLabelRangesElement
+	 */
+	public void visit(TableLabelRangesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:last-column" elements
+	 * @param ele - an instance of TableLastColumnElement
+	 */
+	public void visit(TableLastColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:last-row" elements
+	 * @param ele - an instance of TableLastRowElement
+	 */
+	public void visit(TableLastRowElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:movement" elements
+	 * @param ele - an instance of TableMovementElement
+	 */
+	public void visit(TableMovementElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:movement-cut-off" elements
+	 * @param ele - an instance of TableMovementCutOffElement
+	 */
+	public void visit(TableMovementCutOffElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:named-expression" elements
+	 * @param ele - an instance of TableNamedExpressionElement
+	 */
+	public void visit(TableNamedExpressionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:named-expressions" elements
+	 * @param ele - an instance of TableNamedExpressionsElement
+	 */
+	public void visit(TableNamedExpressionsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:named-range" elements
+	 * @param ele - an instance of TableNamedRangeElement
+	 */
+	public void visit(TableNamedRangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:null-date" elements
+	 * @param ele - an instance of TableNullDateElement
+	 */
+	public void visit(TableNullDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:odd-columns" elements
+	 * @param ele - an instance of TableOddColumnsElement
+	 */
+	public void visit(TableOddColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:odd-rows" elements
+	 * @param ele - an instance of TableOddRowsElement
+	 */
+	public void visit(TableOddRowsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:operation" elements
+	 * @param ele - an instance of TableOperationElement
+	 */
+	public void visit(TableOperationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:previous" elements
+	 * @param ele - an instance of TablePreviousElement
+	 */
+	public void visit(TablePreviousElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:scenario" elements
+	 * @param ele - an instance of TableScenarioElement
+	 */
+	public void visit(TableScenarioElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:shapes" elements
+	 * @param ele - an instance of TableShapesElement
+	 */
+	public void visit(TableShapesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:sort" elements
+	 * @param ele - an instance of TableSortElement
+	 */
+	public void visit(TableSortElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:sort-by" elements
+	 * @param ele - an instance of TableSortByElement
+	 */
+	public void visit(TableSortByElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:sort-groups" elements
+	 * @param ele - an instance of TableSortGroupsElement
+	 */
+	public void visit(TableSortGroupsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:source-cell-range" elements
+	 * @param ele - an instance of TableSourceCellRangeElement
+	 */
+	public void visit(TableSourceCellRangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:source-range-address" elements
+	 * @param ele - an instance of TableSourceRangeAddressElement
+	 */
+	public void visit(TableSourceRangeAddressElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:source-service" elements
+	 * @param ele - an instance of TableSourceServiceElement
+	 */
+	public void visit(TableSourceServiceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:subtotal-field" elements
+	 * @param ele - an instance of TableSubtotalFieldElement
+	 */
+	public void visit(TableSubtotalFieldElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:subtotal-rule" elements
+	 * @param ele - an instance of TableSubtotalRuleElement
+	 */
+	public void visit(TableSubtotalRuleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:subtotal-rules" elements
+	 * @param ele - an instance of TableSubtotalRulesElement
+	 */
+	public void visit(TableSubtotalRulesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table" elements
+	 * @param ele - an instance of TableTableElement
+	 */
+	public void visit(TableTableElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-cell" elements
+	 * @param ele - an instance of TableTableCellElement
+	 */
+	public void visit(TableTableCellElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-column" elements
+	 * @param ele - an instance of TableTableColumnElement
+	 */
+	public void visit(TableTableColumnElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-column-group" elements
+	 * @param ele - an instance of TableTableColumnGroupElement
+	 */
+	public void visit(TableTableColumnGroupElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-columns" elements
+	 * @param ele - an instance of TableTableColumnsElement
+	 */
+	public void visit(TableTableColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-header-columns" elements
+	 * @param ele - an instance of TableTableHeaderColumnsElement
+	 */
+	public void visit(TableTableHeaderColumnsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-header-rows" elements
+	 * @param ele - an instance of TableTableHeaderRowsElement
+	 */
+	public void visit(TableTableHeaderRowsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-row" elements
+	 * @param ele - an instance of TableTableRowElement
+	 */
+	public void visit(TableTableRowElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-row-group" elements
+	 * @param ele - an instance of TableTableRowGroupElement
+	 */
+	public void visit(TableTableRowGroupElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-rows" elements
+	 * @param ele - an instance of TableTableRowsElement
+	 */
+	public void visit(TableTableRowsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-source" elements
+	 * @param ele - an instance of TableTableSourceElement
+	 */
+	public void visit(TableTableSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:table-template" elements
+	 * @param ele - an instance of TableTableTemplateElement
+	 */
+	public void visit(TableTableTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:target-range-address" elements
+	 * @param ele - an instance of TableTargetRangeAddressElement
+	 */
+	public void visit(TableTargetRangeAddressElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:title" elements
+	 * @param ele - an instance of TableTitleElement
+	 */
+	public void visit(TableTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "table:tracked-changes" elements
+	 * @param ele - an instance of TableTrackedChangesElement
+	 */
+	public void visit(TableTrackedChangesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:a" elements
+	 * @param ele - an instance of TextAElement
+	 */
+	public void visit(TextAElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index" elements
+	 * @param ele - an instance of TextAlphabeticalIndexElement
+	 */
+	public void visit(TextAlphabeticalIndexElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index-auto-mark-file" elements
+	 * @param ele - an instance of TextAlphabeticalIndexAutoMarkFileElement
+	 */
+	public void visit(TextAlphabeticalIndexAutoMarkFileElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index-entry-template" elements
+	 * @param ele - an instance of TextAlphabeticalIndexEntryTemplateElement
+	 */
+	public void visit(TextAlphabeticalIndexEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index-mark" elements
+	 * @param ele - an instance of TextAlphabeticalIndexMarkElement
+	 */
+	public void visit(TextAlphabeticalIndexMarkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index-mark-end" elements
+	 * @param ele - an instance of TextAlphabeticalIndexMarkEndElement
+	 */
+	public void visit(TextAlphabeticalIndexMarkEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index-mark-start" elements
+	 * @param ele - an instance of TextAlphabeticalIndexMarkStartElement
+	 */
+	public void visit(TextAlphabeticalIndexMarkStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:alphabetical-index-source" elements
+	 * @param ele - an instance of TextAlphabeticalIndexSourceElement
+	 */
+	public void visit(TextAlphabeticalIndexSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:author-initials" elements
+	 * @param ele - an instance of TextAuthorInitialsElement
+	 */
+	public void visit(TextAuthorInitialsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:author-name" elements
+	 * @param ele - an instance of TextAuthorNameElement
+	 */
+	public void visit(TextAuthorNameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bibliography" elements
+	 * @param ele - an instance of TextBibliographyElement
+	 */
+	public void visit(TextBibliographyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bibliography-configuration" elements
+	 * @param ele - an instance of TextBibliographyConfigurationElement
+	 */
+	public void visit(TextBibliographyConfigurationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bibliography-entry-template" elements
+	 * @param ele - an instance of TextBibliographyEntryTemplateElement
+	 */
+	public void visit(TextBibliographyEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bibliography-mark" elements
+	 * @param ele - an instance of TextBibliographyMarkElement
+	 */
+	public void visit(TextBibliographyMarkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bibliography-source" elements
+	 * @param ele - an instance of TextBibliographySourceElement
+	 */
+	public void visit(TextBibliographySourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bookmark" elements
+	 * @param ele - an instance of TextBookmarkElement
+	 */
+	public void visit(TextBookmarkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bookmark-end" elements
+	 * @param ele - an instance of TextBookmarkEndElement
+	 */
+	public void visit(TextBookmarkEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bookmark-ref" elements
+	 * @param ele - an instance of TextBookmarkRefElement
+	 */
+	public void visit(TextBookmarkRefElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:bookmark-start" elements
+	 * @param ele - an instance of TextBookmarkStartElement
+	 */
+	public void visit(TextBookmarkStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:change" elements
+	 * @param ele - an instance of TextChangeElement
+	 */
+	public void visit(TextChangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:change-end" elements
+	 * @param ele - an instance of TextChangeEndElement
+	 */
+	public void visit(TextChangeEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:change-start" elements
+	 * @param ele - an instance of TextChangeStartElement
+	 */
+	public void visit(TextChangeStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:changed-region" elements
+	 * @param ele - an instance of TextChangedRegionElement
+	 */
+	public void visit(TextChangedRegionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:chapter" elements
+	 * @param ele - an instance of TextChapterElement
+	 */
+	public void visit(TextChapterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:character-count" elements
+	 * @param ele - an instance of TextCharacterCountElement
+	 */
+	public void visit(TextCharacterCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:conditional-text" elements
+	 * @param ele - an instance of TextConditionalTextElement
+	 */
+	public void visit(TextConditionalTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:creation-date" elements
+	 * @param ele - an instance of TextCreationDateElement
+	 */
+	public void visit(TextCreationDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:creation-time" elements
+	 * @param ele - an instance of TextCreationTimeElement
+	 */
+	public void visit(TextCreationTimeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:creator" elements
+	 * @param ele - an instance of TextCreatorElement
+	 */
+	public void visit(TextCreatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:database-display" elements
+	 * @param ele - an instance of TextDatabaseDisplayElement
+	 */
+	public void visit(TextDatabaseDisplayElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:database-name" elements
+	 * @param ele - an instance of TextDatabaseNameElement
+	 */
+	public void visit(TextDatabaseNameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:database-next" elements
+	 * @param ele - an instance of TextDatabaseNextElement
+	 */
+	public void visit(TextDatabaseNextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:database-row-number" elements
+	 * @param ele - an instance of TextDatabaseRowNumberElement
+	 */
+	public void visit(TextDatabaseRowNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:database-row-select" elements
+	 * @param ele - an instance of TextDatabaseRowSelectElement
+	 */
+	public void visit(TextDatabaseRowSelectElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:date" elements
+	 * @param ele - an instance of TextDateElement
+	 */
+	public void visit(TextDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:dde-connection" elements
+	 * @param ele - an instance of TextDdeConnectionElement
+	 */
+	public void visit(TextDdeConnectionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:dde-connection-decl" elements
+	 * @param ele - an instance of TextDdeConnectionDeclElement
+	 */
+	public void visit(TextDdeConnectionDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:dde-connection-decls" elements
+	 * @param ele - an instance of TextDdeConnectionDeclsElement
+	 */
+	public void visit(TextDdeConnectionDeclsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:deletion" elements
+	 * @param ele - an instance of TextDeletionElement
+	 */
+	public void visit(TextDeletionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:description" elements
+	 * @param ele - an instance of TextDescriptionElement
+	 */
+	public void visit(TextDescriptionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:editing-cycles" elements
+	 * @param ele - an instance of TextEditingCyclesElement
+	 */
+	public void visit(TextEditingCyclesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:editing-duration" elements
+	 * @param ele - an instance of TextEditingDurationElement
+	 */
+	public void visit(TextEditingDurationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:execute-macro" elements
+	 * @param ele - an instance of TextExecuteMacroElement
+	 */
+	public void visit(TextExecuteMacroElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:expression" elements
+	 * @param ele - an instance of TextExpressionElement
+	 */
+	public void visit(TextExpressionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:file-name" elements
+	 * @param ele - an instance of TextFileNameElement
+	 */
+	public void visit(TextFileNameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:format-change" elements
+	 * @param ele - an instance of TextFormatChangeElement
+	 */
+	public void visit(TextFormatChangeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:h" elements
+	 * @param ele - an instance of TextHElement
+	 */
+	public void visit(TextHElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:hidden-paragraph" elements
+	 * @param ele - an instance of TextHiddenParagraphElement
+	 */
+	public void visit(TextHiddenParagraphElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:hidden-text" elements
+	 * @param ele - an instance of TextHiddenTextElement
+	 */
+	public void visit(TextHiddenTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:illustration-index" elements
+	 * @param ele - an instance of TextIllustrationIndexElement
+	 */
+	public void visit(TextIllustrationIndexElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:illustration-index-entry-template" elements
+	 * @param ele - an instance of TextIllustrationIndexEntryTemplateElement
+	 */
+	public void visit(TextIllustrationIndexEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:illustration-index-source" elements
+	 * @param ele - an instance of TextIllustrationIndexSourceElement
+	 */
+	public void visit(TextIllustrationIndexSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:image-count" elements
+	 * @param ele - an instance of TextImageCountElement
+	 */
+	public void visit(TextImageCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-body" elements
+	 * @param ele - an instance of TextIndexBodyElement
+	 */
+	public void visit(TextIndexBodyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-bibliography" elements
+	 * @param ele - an instance of TextIndexEntryBibliographyElement
+	 */
+	public void visit(TextIndexEntryBibliographyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-chapter" elements
+	 * @param ele - an instance of TextIndexEntryChapterElement
+	 */
+	public void visit(TextIndexEntryChapterElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-link-end" elements
+	 * @param ele - an instance of TextIndexEntryLinkEndElement
+	 */
+	public void visit(TextIndexEntryLinkEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-link-start" elements
+	 * @param ele - an instance of TextIndexEntryLinkStartElement
+	 */
+	public void visit(TextIndexEntryLinkStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-page-number" elements
+	 * @param ele - an instance of TextIndexEntryPageNumberElement
+	 */
+	public void visit(TextIndexEntryPageNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-span" elements
+	 * @param ele - an instance of TextIndexEntrySpanElement
+	 */
+	public void visit(TextIndexEntrySpanElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-tab-stop" elements
+	 * @param ele - an instance of TextIndexEntryTabStopElement
+	 */
+	public void visit(TextIndexEntryTabStopElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-entry-text" elements
+	 * @param ele - an instance of TextIndexEntryTextElement
+	 */
+	public void visit(TextIndexEntryTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-source-style" elements
+	 * @param ele - an instance of TextIndexSourceStyleElement
+	 */
+	public void visit(TextIndexSourceStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-source-styles" elements
+	 * @param ele - an instance of TextIndexSourceStylesElement
+	 */
+	public void visit(TextIndexSourceStylesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-title" elements
+	 * @param ele - an instance of TextIndexTitleElement
+	 */
+	public void visit(TextIndexTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:index-title-template" elements
+	 * @param ele - an instance of TextIndexTitleTemplateElement
+	 */
+	public void visit(TextIndexTitleTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:initial-creator" elements
+	 * @param ele - an instance of TextInitialCreatorElement
+	 */
+	public void visit(TextInitialCreatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:insertion" elements
+	 * @param ele - an instance of TextInsertionElement
+	 */
+	public void visit(TextInsertionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:keywords" elements
+	 * @param ele - an instance of TextKeywordsElement
+	 */
+	public void visit(TextKeywordsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:line-break" elements
+	 * @param ele - an instance of TextLineBreakElement
+	 */
+	public void visit(TextLineBreakElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:linenumbering-configuration" elements
+	 * @param ele - an instance of TextLinenumberingConfigurationElement
+	 */
+	public void visit(TextLinenumberingConfigurationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:linenumbering-separator" elements
+	 * @param ele - an instance of TextLinenumberingSeparatorElement
+	 */
+	public void visit(TextLinenumberingSeparatorElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list" elements
+	 * @param ele - an instance of TextListElement
+	 */
+	public void visit(TextListElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list-header" elements
+	 * @param ele - an instance of TextListHeaderElement
+	 */
+	public void visit(TextListHeaderElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list-item" elements
+	 * @param ele - an instance of TextListItemElement
+	 */
+	public void visit(TextListItemElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list-level-style-bullet" elements
+	 * @param ele - an instance of TextListLevelStyleBulletElement
+	 */
+	public void visit(TextListLevelStyleBulletElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list-level-style-image" elements
+	 * @param ele - an instance of TextListLevelStyleImageElement
+	 */
+	public void visit(TextListLevelStyleImageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list-level-style-number" elements
+	 * @param ele - an instance of TextListLevelStyleNumberElement
+	 */
+	public void visit(TextListLevelStyleNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:list-style" elements
+	 * @param ele - an instance of TextListStyleElement
+	 */
+	public void visit(TextListStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:measure" elements
+	 * @param ele - an instance of TextMeasureElement
+	 */
+	public void visit(TextMeasureElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:meta" elements
+	 * @param ele - an instance of TextMetaElement
+	 */
+	public void visit(TextMetaElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:meta-field" elements
+	 * @param ele - an instance of TextMetaFieldElement
+	 */
+	public void visit(TextMetaFieldElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:modification-date" elements
+	 * @param ele - an instance of TextModificationDateElement
+	 */
+	public void visit(TextModificationDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:modification-time" elements
+	 * @param ele - an instance of TextModificationTimeElement
+	 */
+	public void visit(TextModificationTimeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:note" elements
+	 * @param ele - an instance of TextNoteElement
+	 */
+	public void visit(TextNoteElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:note-body" elements
+	 * @param ele - an instance of TextNoteBodyElement
+	 */
+	public void visit(TextNoteBodyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:note-citation" elements
+	 * @param ele - an instance of TextNoteCitationElement
+	 */
+	public void visit(TextNoteCitationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:note-continuation-notice-backward" elements
+	 * @param ele - an instance of TextNoteContinuationNoticeBackwardElement
+	 */
+	public void visit(TextNoteContinuationNoticeBackwardElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:note-continuation-notice-forward" elements
+	 * @param ele - an instance of TextNoteContinuationNoticeForwardElement
+	 */
+	public void visit(TextNoteContinuationNoticeForwardElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:note-ref" elements
+	 * @param ele - an instance of TextNoteRefElement
+	 */
+	public void visit(TextNoteRefElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:notes-configuration" elements
+	 * @param ele - an instance of TextNotesConfigurationElement
+	 */
+	public void visit(TextNotesConfigurationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:number" elements
+	 * @param ele - an instance of TextNumberElement
+	 */
+	public void visit(TextNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:numbered-paragraph" elements
+	 * @param ele - an instance of TextNumberedParagraphElement
+	 */
+	public void visit(TextNumberedParagraphElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:object-count" elements
+	 * @param ele - an instance of TextObjectCountElement
+	 */
+	public void visit(TextObjectCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:object-index" elements
+	 * @param ele - an instance of TextObjectIndexElement
+	 */
+	public void visit(TextObjectIndexElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:object-index-entry-template" elements
+	 * @param ele - an instance of TextObjectIndexEntryTemplateElement
+	 */
+	public void visit(TextObjectIndexEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:object-index-source" elements
+	 * @param ele - an instance of TextObjectIndexSourceElement
+	 */
+	public void visit(TextObjectIndexSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:outline-level-style" elements
+	 * @param ele - an instance of TextOutlineLevelStyleElement
+	 */
+	public void visit(TextOutlineLevelStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:outline-style" elements
+	 * @param ele - an instance of TextOutlineStyleElement
+	 */
+	public void visit(TextOutlineStyleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:p" elements
+	 * @param ele - an instance of TextPElement
+	 */
+	public void visit(TextPElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page" elements
+	 * @param ele - an instance of TextPageElement
+	 */
+	public void visit(TextPageElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page-continuation" elements
+	 * @param ele - an instance of TextPageContinuationElement
+	 */
+	public void visit(TextPageContinuationElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page-count" elements
+	 * @param ele - an instance of TextPageCountElement
+	 */
+	public void visit(TextPageCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page-number" elements
+	 * @param ele - an instance of TextPageNumberElement
+	 */
+	public void visit(TextPageNumberElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page-sequence" elements
+	 * @param ele - an instance of TextPageSequenceElement
+	 */
+	public void visit(TextPageSequenceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page-variable-get" elements
+	 * @param ele - an instance of TextPageVariableGetElement
+	 */
+	public void visit(TextPageVariableGetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:page-variable-set" elements
+	 * @param ele - an instance of TextPageVariableSetElement
+	 */
+	public void visit(TextPageVariableSetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:paragraph-count" elements
+	 * @param ele - an instance of TextParagraphCountElement
+	 */
+	public void visit(TextParagraphCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:placeholder" elements
+	 * @param ele - an instance of TextPlaceholderElement
+	 */
+	public void visit(TextPlaceholderElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:print-date" elements
+	 * @param ele - an instance of TextPrintDateElement
+	 */
+	public void visit(TextPrintDateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:print-time" elements
+	 * @param ele - an instance of TextPrintTimeElement
+	 */
+	public void visit(TextPrintTimeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:printed-by" elements
+	 * @param ele - an instance of TextPrintedByElement
+	 */
+	public void visit(TextPrintedByElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:reference-mark" elements
+	 * @param ele - an instance of TextReferenceMarkElement
+	 */
+	public void visit(TextReferenceMarkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:reference-mark-end" elements
+	 * @param ele - an instance of TextReferenceMarkEndElement
+	 */
+	public void visit(TextReferenceMarkEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:reference-mark-start" elements
+	 * @param ele - an instance of TextReferenceMarkStartElement
+	 */
+	public void visit(TextReferenceMarkStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:reference-ref" elements
+	 * @param ele - an instance of TextReferenceRefElement
+	 */
+	public void visit(TextReferenceRefElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:ruby" elements
+	 * @param ele - an instance of TextRubyElement
+	 */
+	public void visit(TextRubyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:ruby-base" elements
+	 * @param ele - an instance of TextRubyBaseElement
+	 */
+	public void visit(TextRubyBaseElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:ruby-text" elements
+	 * @param ele - an instance of TextRubyTextElement
+	 */
+	public void visit(TextRubyTextElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:s" elements
+	 * @param ele - an instance of TextSElement
+	 */
+	public void visit(TextSElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:script" elements
+	 * @param ele - an instance of TextScriptElement
+	 */
+	public void visit(TextScriptElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:section" elements
+	 * @param ele - an instance of TextSectionElement
+	 */
+	public void visit(TextSectionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:section-source" elements
+	 * @param ele - an instance of TextSectionSourceElement
+	 */
+	public void visit(TextSectionSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-city" elements
+	 * @param ele - an instance of TextSenderCityElement
+	 */
+	public void visit(TextSenderCityElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-company" elements
+	 * @param ele - an instance of TextSenderCompanyElement
+	 */
+	public void visit(TextSenderCompanyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-country" elements
+	 * @param ele - an instance of TextSenderCountryElement
+	 */
+	public void visit(TextSenderCountryElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-email" elements
+	 * @param ele - an instance of TextSenderEmailElement
+	 */
+	public void visit(TextSenderEmailElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-fax" elements
+	 * @param ele - an instance of TextSenderFaxElement
+	 */
+	public void visit(TextSenderFaxElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-firstname" elements
+	 * @param ele - an instance of TextSenderFirstnameElement
+	 */
+	public void visit(TextSenderFirstnameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-initials" elements
+	 * @param ele - an instance of TextSenderInitialsElement
+	 */
+	public void visit(TextSenderInitialsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-lastname" elements
+	 * @param ele - an instance of TextSenderLastnameElement
+	 */
+	public void visit(TextSenderLastnameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-phone-private" elements
+	 * @param ele - an instance of TextSenderPhonePrivateElement
+	 */
+	public void visit(TextSenderPhonePrivateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-phone-work" elements
+	 * @param ele - an instance of TextSenderPhoneWorkElement
+	 */
+	public void visit(TextSenderPhoneWorkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-position" elements
+	 * @param ele - an instance of TextSenderPositionElement
+	 */
+	public void visit(TextSenderPositionElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-postal-code" elements
+	 * @param ele - an instance of TextSenderPostalCodeElement
+	 */
+	public void visit(TextSenderPostalCodeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-state-or-province" elements
+	 * @param ele - an instance of TextSenderStateOrProvinceElement
+	 */
+	public void visit(TextSenderStateOrProvinceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-street" elements
+	 * @param ele - an instance of TextSenderStreetElement
+	 */
+	public void visit(TextSenderStreetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sender-title" elements
+	 * @param ele - an instance of TextSenderTitleElement
+	 */
+	public void visit(TextSenderTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sequence" elements
+	 * @param ele - an instance of TextSequenceElement
+	 */
+	public void visit(TextSequenceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sequence-decl" elements
+	 * @param ele - an instance of TextSequenceDeclElement
+	 */
+	public void visit(TextSequenceDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sequence-decls" elements
+	 * @param ele - an instance of TextSequenceDeclsElement
+	 */
+	public void visit(TextSequenceDeclsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sequence-ref" elements
+	 * @param ele - an instance of TextSequenceRefElement
+	 */
+	public void visit(TextSequenceRefElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sheet-name" elements
+	 * @param ele - an instance of TextSheetNameElement
+	 */
+	public void visit(TextSheetNameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:soft-page-break" elements
+	 * @param ele - an instance of TextSoftPageBreakElement
+	 */
+	public void visit(TextSoftPageBreakElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:sort-key" elements
+	 * @param ele - an instance of TextSortKeyElement
+	 */
+	public void visit(TextSortKeyElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:span" elements
+	 * @param ele - an instance of TextSpanElement
+	 */
+	public void visit(TextSpanElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:subject" elements
+	 * @param ele - an instance of TextSubjectElement
+	 */
+	public void visit(TextSubjectElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:tab" elements
+	 * @param ele - an instance of TextTabElement
+	 */
+	public void visit(TextTabElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-count" elements
+	 * @param ele - an instance of TextTableCountElement
+	 */
+	public void visit(TextTableCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-formula" elements
+	 * @param ele - an instance of TextTableFormulaElement
+	 */
+	public void visit(TextTableFormulaElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-index" elements
+	 * @param ele - an instance of TextTableIndexElement
+	 */
+	public void visit(TextTableIndexElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-index-entry-template" elements
+	 * @param ele - an instance of TextTableIndexEntryTemplateElement
+	 */
+	public void visit(TextTableIndexEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-index-source" elements
+	 * @param ele - an instance of TextTableIndexSourceElement
+	 */
+	public void visit(TextTableIndexSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-of-content" elements
+	 * @param ele - an instance of TextTableOfContentElement
+	 */
+	public void visit(TextTableOfContentElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-of-content-entry-template" elements
+	 * @param ele - an instance of TextTableOfContentEntryTemplateElement
+	 */
+	public void visit(TextTableOfContentEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:table-of-content-source" elements
+	 * @param ele - an instance of TextTableOfContentSourceElement
+	 */
+	public void visit(TextTableOfContentSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:template-name" elements
+	 * @param ele - an instance of TextTemplateNameElement
+	 */
+	public void visit(TextTemplateNameElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:text-input" elements
+	 * @param ele - an instance of TextTextInputElement
+	 */
+	public void visit(TextTextInputElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:time" elements
+	 * @param ele - an instance of TextTimeElement
+	 */
+	public void visit(TextTimeElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:title" elements
+	 * @param ele - an instance of TextTitleElement
+	 */
+	public void visit(TextTitleElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:toc-mark" elements
+	 * @param ele - an instance of TextTocMarkElement
+	 */
+	public void visit(TextTocMarkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:toc-mark-end" elements
+	 * @param ele - an instance of TextTocMarkEndElement
+	 */
+	public void visit(TextTocMarkEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:toc-mark-start" elements
+	 * @param ele - an instance of TextTocMarkStartElement
+	 */
+	public void visit(TextTocMarkStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:tracked-changes" elements
+	 * @param ele - an instance of TextTrackedChangesElement
+	 */
+	public void visit(TextTrackedChangesElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-defined" elements
+	 * @param ele - an instance of TextUserDefinedElement
+	 */
+	public void visit(TextUserDefinedElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-field-decl" elements
+	 * @param ele - an instance of TextUserFieldDeclElement
+	 */
+	public void visit(TextUserFieldDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-field-decls" elements
+	 * @param ele - an instance of TextUserFieldDeclsElement
+	 */
+	public void visit(TextUserFieldDeclsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-field-get" elements
+	 * @param ele - an instance of TextUserFieldGetElement
+	 */
+	public void visit(TextUserFieldGetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-field-input" elements
+	 * @param ele - an instance of TextUserFieldInputElement
+	 */
+	public void visit(TextUserFieldInputElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-index" elements
+	 * @param ele - an instance of TextUserIndexElement
+	 */
+	public void visit(TextUserIndexElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-index-entry-template" elements
+	 * @param ele - an instance of TextUserIndexEntryTemplateElement
+	 */
+	public void visit(TextUserIndexEntryTemplateElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-index-mark" elements
+	 * @param ele - an instance of TextUserIndexMarkElement
+	 */
+	public void visit(TextUserIndexMarkElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-index-mark-end" elements
+	 * @param ele - an instance of TextUserIndexMarkEndElement
+	 */
+	public void visit(TextUserIndexMarkEndElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-index-mark-start" elements
+	 * @param ele - an instance of TextUserIndexMarkStartElement
+	 */
+	public void visit(TextUserIndexMarkStartElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:user-index-source" elements
+	 * @param ele - an instance of TextUserIndexSourceElement
+	 */
+	public void visit(TextUserIndexSourceElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:variable-decl" elements
+	 * @param ele - an instance of TextVariableDeclElement
+	 */
+	public void visit(TextVariableDeclElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:variable-decls" elements
+	 * @param ele - an instance of TextVariableDeclsElement
+	 */
+	public void visit(TextVariableDeclsElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:variable-get" elements
+	 * @param ele - an instance of TextVariableGetElement
+	 */
+	public void visit(TextVariableGetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:variable-input" elements
+	 * @param ele - an instance of TextVariableInputElement
+	 */
+	public void visit(TextVariableInputElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:variable-set" elements
+	 * @param ele - an instance of TextVariableSetElement
+	 */
+	public void visit(TextVariableSetElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "text:word-count" elements
+	 * @param ele - an instance of TextWordCountElement
+	 */
+	public void visit(TextWordCountElement ele) {
+		visit((OdfElement) ele);
+	}
+
+	/**
+	 * A method to visit "xforms:model" elements
+	 * @param ele - an instance of XformsModelElement
+	 */
+	public void visit(XformsModelElement ele) {
+		visit((OdfElement) ele);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfContentDom.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfContentDom.java
new file mode 100644
index 0000000..40a4b61
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfContentDom.java
@@ -0,0 +1,135 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentContentElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.pkg.NamespaceName;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.Node;
+
+/**
+ * The DOM repesentation of the ODF content.xml file of an ODF document.
+ */
+public class OdfContentDom extends OdfFileDom {
+
+	private static final long serialVersionUID = 766167617530147883L;
+
+	/**
+	 * Creates the DOM representation of an XML file of an Odf document.
+	 *
+	 * @param odfDocument   the document the XML files belongs to
+	 * @param packagePath   the internal package path to the XML file
+	 */
+	public OdfContentDom(OdfSchemaDocument odfDocument, String packagePath) {
+		super(odfDocument, packagePath);
+	}
+
+	/** Might be used to initialize specific XML Namespace prefixes/URIs for this XML file*/
+	@Override
+	protected void initialize() {
+		for (NamespaceName name : OdfDocumentNamespace.values()) {
+			mUriByPrefix.put(name.getPrefix(), name.getUri());
+			mPrefixByUri.put(name.getUri(), name.getPrefix());
+		}
+		super.initialize();
+	}
+
+	/**
+	 * Retrieves the Odf Document
+	 * 
+	 * @return The <code>OdfDocument</code>
+	 */
+	@Override
+	public OdfSchemaDocument getDocument() {
+		return (OdfSchemaDocument) mPackageDocument;
+	}
+
+	/**
+	 * @return The root element <office:document-content> of the content.xml file as <code>OfficeDocumentContentElement</code>.
+	 */
+	@Override
+	public OfficeDocumentContentElement getRootElement() {
+		return (OfficeDocumentContentElement) 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.
+	 */
+	@Override
+	public XPath getXPath() {
+		if (mXPath == null) {
+			mXPath = XPathFactory.newInstance().newXPath();
+			mXPath.setNamespaceContext(this);
+		}
+		return mXPath;
+	}
+
+	/**
+	 * Retrieve the ODF AutomaticStyles
+	 *
+	 * @return the {@odf.element style:automatic-styles} element of this dom. May return null
+	 *         if there is not yet such element in this dom.
+	 *
+	 * @see #getOrCreateAutomaticStyles()
+	 *
+	 */
+	public OdfOfficeAutomaticStyles getAutomaticStyles() {
+		return OdfElement.findFirstChildNode(OdfOfficeAutomaticStyles.class, getFirstChild());
+	}
+
+	/**
+	 * @return the {@odf.element style:automatic-styles} element of this dom. If it does not
+	 *         yet exists, a new one is inserted into the dom and returned.
+	 *
+	 */
+	public OdfOfficeAutomaticStyles getOrCreateAutomaticStyles() {
+
+		OdfOfficeAutomaticStyles automaticStyles = getAutomaticStyles();
+		if (automaticStyles == null) {
+			automaticStyles = newOdfElement(OdfOfficeAutomaticStyles.class);
+
+			Node parent = getFirstChild();
+
+			// try to insert before body or before master-styles element
+			OdfElement sibling = OdfElement.findFirstChildNode(OfficeBodyElement.class, parent);
+			if (sibling == null) {
+				sibling = OdfElement.findFirstChildNode(OdfOfficeMasterStyles.class, parent);
+			}
+			if (sibling == null) {
+				parent.appendChild(automaticStyles);
+			} else {
+				parent.insertBefore(automaticStyles, sibling);
+			}
+		}
+		return automaticStyles;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfDocumentNamespace.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfDocumentNamespace.java
new file mode 100644
index 0000000..6efaaab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfDocumentNamespace.java
@@ -0,0 +1,80 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.dom;
+
+import org.odftoolkit.odfdom.pkg.NamespaceName;
+
+/**
+ * Namespaces of OpenDocument 1.2 XML Schema
+ */
+public enum OdfDocumentNamespace implements NamespaceName {
+
+	ANIM("anim", "urn:oasis:names:tc:opendocument:xmlns:animation:1.0"),
+	CHART("chart", "urn:oasis:names:tc:opendocument:xmlns:chart:1.0"),
+	CONFIG("config", "urn:oasis:names:tc:opendocument:xmlns:config:1.0"),
+	DB("db", "urn:oasis:names:tc:opendocument:xmlns:database:1.0"),
+	DC("dc", "http://purl.org/dc/elements/1.1/"),
+	DR3D("dr3d", "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"),
+	DRAW("draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"),
+	FO("fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"),
+	FORM("form", "urn:oasis:names:tc:opendocument:xmlns:form:1.0"),
+	GRDDL("grddl", "http://www.w3.org/2003/g/data-view#"),
+	MATH("math", "http://www.w3.org/1998/Math/MathML"),
+	META("meta", "urn:oasis:names:tc:opendocument:xmlns:meta:1.0"),
+	NUMBER("number", "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"),
+	OF("of", "urn:oasis:names:tc:opendocument:xmlns:of:1.2"),
+	OFFICE("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0"),
+	PRESENTATION("presentation", "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"),
+	SCRIPT("script", "urn:oasis:names:tc:opendocument:xmlns:script:1.0"),
+	SMIL("smil", "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"),
+	STYLE("style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0"),
+	SVG("svg", "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"),
+	TABLE("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0"),
+	TEXT("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0"),
+	XFORMS("xforms", "http://www.w3.org/2002/xforms"),
+	XHTML("xhtml", "http://www.w3.org/1999/xhtml"),
+	XLINK("xlink", "http://www.w3.org/1999/xlink"),
+	XML("xml", "http://www.w3.org/XML/1998/namespace" );
+    	
+	private String mPrefix;
+	private String mUri;
+	
+	OdfDocumentNamespace(String prefix, String uri) {
+		mPrefix = prefix;
+		mUri = uri;
+	}    
+
+	/**
+	 * @return the prefix currently related to ODF Namespace.
+	 */
+	public String getPrefix() {
+		return mPrefix;
+	}
+
+	/**
+	 * @return the URI identifiying the ODF Namespace.
+	 */
+	public String getUri() {
+		return mUri;
+	}
+} 
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfMetaDom.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfMetaDom.java
new file mode 100644
index 0000000..f3e7877
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfMetaDom.java
@@ -0,0 +1,102 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentMetaElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMetaElement;
+import org.odftoolkit.odfdom.pkg.NamespaceName;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+
+/**
+ * The DOM repesentation of the ODF meta.xml file of an ODF document.
+ */
+public class OdfMetaDom extends OdfFileDom {
+
+	private static final long serialVersionUID = 766167617530147884L;
+
+	/**
+	 * Creates the DOM representation of an XML file of an Odf document.
+	 *
+	 * @param odfDocument   the document the XML files belongs to
+	 * @param packagePath   the internal package path to the XML file
+	 */
+	public OdfMetaDom(OdfSchemaDocument odfDocument, String packagePath) {
+		super(odfDocument, packagePath);
+		OfficeDocumentMetaElement rootElement = this.getRootElement();
+		if(rootElement == null){		
+			rootElement = new OfficeDocumentMetaElement(this);
+			this.appendChild(rootElement);
+			OfficeMetaElement officeMetaElement = new OfficeMetaElement(this);
+			rootElement.appendChild(officeMetaElement);
+		}
+	}
+
+	/** Might be used to initialize specific XML Namespace prefixes/URIs for this XML file*/
+	@Override
+	protected void initialize() {
+		for (NamespaceName name : OdfDocumentNamespace.values()) {
+			mUriByPrefix.put(name.getPrefix(), name.getUri());
+			mPrefixByUri.put(name.getUri(), name.getPrefix());
+		}
+		super.initialize();
+	}
+
+	/**
+	 * Retrieves the Odf Document
+	 *
+	 * @return The <code>OdfDocument</code>
+	 */
+	@Override
+	public OdfSchemaDocument getDocument() {
+		return (OdfSchemaDocument) mPackageDocument;
+	}
+
+	/**
+	 * @return The root element <office:document-meta> of the meta.xml file as <code>OfficeDocumentMetaElement</code>.
+	 */
+	@Override
+	public final OfficeDocumentMetaElement getRootElement() {
+		return (OfficeDocumentMetaElement) 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.
+	 */
+	@Override
+	public XPath getXPath() {
+		if (mXPath == null) {
+			mXPath = XPathFactory.newInstance().newXPath();
+			mXPath.setNamespaceContext(this);
+			for (NamespaceName name : OdfDocumentNamespace.values()) {
+				mUriByPrefix.put(name.getPrefix(), name.getUri());
+				mPrefixByUri.put(name.getUri(), name.getPrefix());
+			}
+		}
+		return mXPath;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSchemaConstraint.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSchemaConstraint.java
new file mode 100644
index 0000000..437f091
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSchemaConstraint.java
@@ -0,0 +1,80 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import org.odftoolkit.odfdom.pkg.ValidationConstraint;
+
+/**
+ * This class is used for validation of the ODF Document.
+ * It contains the constraint messages are taken from the OASIS ODF 1.2 part 1, the XML Schema specification.
+ * These messages are used by the <code>ValidationException</code> for ODF validation.
+ * The validation is enabled, when an <code>ErrorHandler</code> was provided to the <code>OdfPackage</code>.
+ */
+public enum OdfSchemaConstraint implements ValidationConstraint {
+
+	// NOTE FOLLOWING CODE CONVENTION:
+	// The first parameter is ALWAYS the source path, followed by a missing space. The OdfValidationException will take care of adjusting.
+	/** A ODF mimetype is invalid for the ODF XML Schema document. */
+	DOCUMENT_WITHOUT_ODF_MIMETYPE("The ODF mimetype '%2$s' is invalid for the ODF XML Schema document%1$s!"),
+	/** At least \'content.xml' or 'styles.xml' have to be contained in the ODF XML Schema package.*/
+	DOCUMENT_WITHOUT_CONTENT_NOR_STYLES_XML("At least 'content.xml' or 'styles.xml' have to be contained in the ODF XML Schema package%1$s!"),
+	/** The 'mimetype' file have to be contained in the ODF XML Schema package.*/
+	PACKAGE_SHALL_CONTAIN_MIMETYPE("The 'mimetype' file have to be contained in the ODF XML Schema package%1$s!");
+
+	private final String mMessage;
+
+	/**
+	 * Creates a ODF Document constraint
+	 * @param message of the constraint */
+	OdfSchemaConstraint(String message) {
+		mMessage = message;
+	}
+
+	/**
+	 * Creates a localized description of a Constraint.
+	 * Subclasses may override this method in order to produce a
+	 * locale-specific message.  For subclasses that do not override this
+	 * method, the default implementation returns the same result as
+	 * <code>getMessage()</code>.
+	 *
+	 * @return  The localized description of this constraint. */
+	public String getLocalizedMessage() {
+//    FUTURE FEATUE: LOCALIZATION:
+//    =============================
+//    There should be a property files e.g. OdfPackageConstraint_de_DE.properties Sourcecode:
+//    PACKAGE_SHALL_BE_ZIP=%s muß eine ZIP Datei sein, wie in [ZIP] definiert. Alle Dateien innerhalbe des ZIPS müssen entwder unkomprimiert (STORED) oder komprimiert sein (DEFLATED) und den DEFLATE aloritmus verwenden.
+//    PACKAGE_SHALL_CONTAIN_MANIFEST=.....
+//    ResourceBundle bundle = ResourceBundle.getBundle(OdfPackageConstraint.class.getName());
+//    return bundle.getString(this.name());
+		return mMessage;
+	}
+
+	/**
+	 * Returns the detail message string of this Constraint.
+	 *
+	 * @return  the detail message string of this <tt>Constraint</tt> instance
+	 *          (which may be <tt>null</tt>).
+	 */
+	public String getMessage() {
+		return mMessage;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSchemaDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSchemaDocument.java
new file mode 100644
index 0000000..25188b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSchemaDocument.java
@@ -0,0 +1,496 @@
+/**
+ * **********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.util.ResourceUtils;
+import java.io.InputStreamReader;
+
+/**
+ * A document in ODF is from the package view a directory with a media type.
+ * If the media type represents a document described by the ODF 1.2 Schema,
+ * certain files are assumed within:
+ * content.xml, styles.xml, metadata.xml and settings.xml.
+ *
+ * The class represents such a document, providing easier access to its XML files.
+ */
+public abstract class OdfSchemaDocument extends OdfPackageDocument {
+
+	protected OdfContentDom mContentDom;
+	protected OdfStylesDom mStylesDom;
+	protected OdfMetaDom mMetaDom;
+	protected OdfSettingsDom mSettingsDom;
+	protected OdfOfficeStyles mDocumentStyles;
+
+	/**
+	 * Creates a new OdfSchemaDocument.
+	 *
+	 * @param pkg - the ODF Package that contains the document. A baseURL is being generated based on its location.
+	 * @param internalPath - the directory path within the package from where the document should be loaded.
+	 * @param mediaTypeString
+	 *      - media type of stream. If unknown null can be used.
+	 */
+	protected OdfSchemaDocument(OdfPackage pkg, String internalPath, String mediaTypeString) {
+		super(pkg, internalPath, mediaTypeString);
+		ErrorHandler errorHandler = pkg.getErrorHandler();
+		if (errorHandler != null) {
+			if (pkg.getFileEntry(internalPath + "content.xml") == null && pkg.getFileEntry(internalPath + "styles.xml") == null) {
+				try {
+					String baseURI = pkg.getBaseURI();
+					if (baseURI == null) {
+						baseURI = internalPath;
+					} else {
+						if (!internalPath.equals(ROOT_DOCUMENT_PATH)) {
+							baseURI = "/" + internalPath;
+						}
+					}
+					errorHandler.error(new OdfValidationException(OdfSchemaConstraint.DOCUMENT_WITHOUT_CONTENT_NOR_STYLES_XML, baseURI));
+				} catch (SAXException ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+			InputStream mimetypeStream = pkg.getInputStream(OdfPackage.OdfFile.MEDIA_TYPE.getPath(), true);
+			if (internalPath.equals(ROOT_DOCUMENT_PATH) && mimetypeStream == null) {
+				try {
+					errorHandler.error(new OdfValidationException(OdfSchemaConstraint.PACKAGE_SHALL_CONTAIN_MIMETYPE, pkg.getBaseURI()));
+				} catch (SAXException ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		}
+	}
+
+	/**
+	 * This enum contains all possible standardized XML ODF files of the OpenDocument document.
+	 */
+	public static enum OdfXMLFile {
+
+		/** The XML file containing the content of an ODF document as specified by the ODF 1.2 specification part 1. */
+		CONTENT("content.xml"),
+		/** The XML file containing a predifined set of metadata related to an ODF document as specified by the ODF 1.2 specification part 1. */
+		META("meta.xml"),
+		/** The XML file containing the settings of an ODF document as specified by the ODF 1.2 specification part 1. */
+		SETTINGS("settings.xml"),
+		/** The XML file containing the styles of an ODF document as specified by the ODF 1.2 specification part 1. */
+		STYLES("styles.xml");
+		private final String mFileName;
+
+		/**
+		 * @return the file name of xml files contained in odf packages.
+		 */
+		public String getFileName() {
+			return mFileName;
+		}
+
+		OdfXMLFile(String fileName) {
+			this.mFileName = fileName;
+		}
+	}
+
+	/**
+	 * Gets the ODF content.xml file as stream.
+	 *
+	 * @return - a stream of the ODF content 'content.xml' file
+	 * @throws java.lang.Exception - if the stream can not be extracted
+	 */
+	public InputStream getContentStream() throws Exception {
+		String path = getXMLFilePath(OdfXMLFile.CONTENT);
+		return mPackage.getInputStream(path);
+	}
+
+	/**
+	 * Gets the ODF style.xml file as stream.
+	 *
+	 * @return - a stream of the ODF style 'styles.xml' file
+	 * @throws java.lang.Exception - if the stream can not be extracted
+	 */
+	public InputStream getStylesStream() throws Exception {
+		return mPackage.getInputStream(getXMLFilePath(OdfXMLFile.STYLES));
+	}
+
+	/**
+	 * Gets the ODF settings.xml file as stream.
+	 *
+	 * @return - a stream of the ODF settings 'setting.xml' file
+	 * @throws java.lang.Exception - if the stream can not be extracted
+	 */
+	public InputStream getSettingsStream() throws Exception {
+		return mPackage.getInputStream(getXMLFilePath(OdfXMLFile.SETTINGS));
+	}
+
+	/**
+	 * Gets the ODF metadata.xml file as stream.
+	 *
+	 * @return - a stream of the ODF metadata 'meta.xml' file
+	 * @throws java.lang.Exception - if the stream can not be extracted
+	 */
+	public InputStream getMetaStream() throws Exception {
+		return mPackage.getInputStream(getXMLFilePath(OdfXMLFile.META));
+	}
+
+	/**
+	 * Get the relative path for an embedded ODF document including its file name.
+	 * @param file represents one of the standardized XML ODF files.
+	 * @return path to embedded ODF XML file relative to ODF package root.
+	 */
+	protected String getXMLFilePath(OdfXMLFile file) {
+		return file.mFileName;
+	}
+
+	/**
+	 * Get the URI, where this ODF document is stored.
+	 * @return the URI to the ODF document. Returns null if document is not stored yet.
+	 */
+	public String getBaseURI() {
+		return mPackage.getBaseURI();
+
+
+	}
+
+	/**
+	 * Return the ODF type-based content DOM of the content.xml
+	 *
+	 * @return ODF type-based content DOM or null if no content.xml exists.
+	 * @throws Exception if content DOM could not be initialized
+	 */
+	public OdfContentDom getContentDom() throws Exception {
+		if (mContentDom == null) {
+			mContentDom = (OdfContentDom) getFileDom(OdfXMLFile.CONTENT);
+		}
+		return mContentDom;
+	}
+
+	/**
+	 * Return the ODF type-based styles DOM of the styles.xml
+	 *
+	 * @return ODF type-based styles DOM or null if no styles.xml exists.
+	 * @throws Exception if styles DOM could not be initialized
+	 */
+	public OdfStylesDom getStylesDom() throws Exception {
+		if (mStylesDom == null) {
+			mStylesDom = (OdfStylesDom) getFileDom(OdfXMLFile.STYLES);
+		}
+		return mStylesDom;
+	}
+
+	/**
+	 * Return the ODF type-based metadata DOM of the meta.xml
+	 *
+	 * @return ODF type-based meta DOM or null if no meta.xml exists.
+	 * @throws Exception if meta DOM could not be initialized
+	 */
+	public OdfMetaDom getMetaDom() throws Exception {
+		if (mMetaDom == null) {
+			mMetaDom = (OdfMetaDom) getFileDom(OdfXMLFile.META);
+		}
+		return mMetaDom;
+	}
+
+	/**
+	 * Return the ODF type-based settings DOM of the settings.xml
+	 *
+	 * @return ODF type-based settings DOM or null if no settings.xml exists.
+	 * @throws Exception if settings DOM could not be initialized
+	 */
+	public OdfSettingsDom getSettingsDom() throws Exception {
+		if (mSettingsDom == null) {
+			mSettingsDom = (OdfSettingsDom) getFileDom(OdfXMLFile.SETTINGS);
+		}
+		return mSettingsDom;
+	}
+
+	/**
+	 *
+	 * @return the office:styles element from the styles dom or null if there is
+	 * no such element.
+	 */
+	public OdfOfficeStyles getDocumentStyles() {
+		if (mDocumentStyles == null) {
+			try {
+				OdfFileDom stylesDom = getStylesDom();
+				if (stylesDom != null) {
+					mDocumentStyles = OdfElement.findFirstChildNode(OdfOfficeStyles.class, stylesDom.getFirstChild());
+				} else {
+					return null;
+				}
+			} catch (Exception ex) {
+				Logger.getLogger(OdfSchemaDocument.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		return mDocumentStyles;
+	}
+
+	/**
+	 * return the office:master-styles element of this document.
+	 *
+	 * @return the office:master-styles element
+	 */
+	public OdfOfficeMasterStyles getOfficeMasterStyles() {
+		try {
+			OdfFileDom fileDom = getStylesDom();
+			if (fileDom != null) {
+				return OdfElement.findFirstChildNode(OdfOfficeMasterStyles.class, fileDom.getFirstChild());
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(OdfSchemaDocument.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+
+	/**
+	 *
+	 * @return the office:styles element from the styles dom. If there is not
+	 *         yet such an element, it is created.
+	 */
+	public OdfOfficeStyles getOrCreateDocumentStyles() {
+		if (mDocumentStyles == null) {
+			try {
+				OdfFileDom stylesDom = getStylesDom();
+				Node parent = stylesDom != null ? stylesDom.getFirstChild() : null;
+				if (parent != null) {
+					mDocumentStyles = OdfElement.findFirstChildNode(OdfOfficeStyles.class, parent);
+					if (mDocumentStyles == null) {
+						mDocumentStyles = stylesDom.newOdfElement(OdfOfficeStyles.class);
+						parent.insertBefore(mDocumentStyles, parent.getFirstChild());
+					}
+				}
+			} catch (Exception ex) {
+				Logger.getLogger(OdfSchemaDocument.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		return mDocumentStyles;
+	}
+
+	/**
+	 * Return a list of table features in this document.
+	 *
+	 * @return a list of table features in this document.
+	 */
+	// ToDo: Instead of a method to receive all possible feature/components on the document, there might be a generic or one each element?
+	public List<TableTableElement> getTables() {
+		List<TableTableElement> tableList = new ArrayList<TableTableElement>();
+		try {
+			// find tables from content.xml
+			OfficeBodyElement officeBody = OdfElement.findFirstChildNode(OfficeBodyElement.class, getContentDom().getRootElement());
+			OdfElement contentRoot = OdfElement.findFirstChildNode(OdfElement.class, officeBody);
+			tableList = fillTableList(contentRoot, tableList);
+
+			// find tables from styles.xml (header & footer)
+			Map<String, StyleMasterPageElement> masterPages = getMasterPages();
+			StyleMasterPageElement defaultMasterPage = masterPages.get("Standard");
+			if (defaultMasterPage != null) {
+				tableList = fillTableList(defaultMasterPage, tableList);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(OdfSchemaDocument.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return tableList;
+	}
+
+	// Only tables being on root level are being considered
+	private List<TableTableElement> fillTableList(Element startElement, List<TableTableElement> tableList) {
+		NodeList childList = startElement.getChildNodes();
+		for (int i = 0;
+				i < childList.getLength();
+				i++) {
+			Node childNode = childList.item(i);
+			if (childNode instanceof Element) {
+				if(childNode instanceof TableTableElement){
+					tableList.add((TableTableElement) childList.item(i));
+				}else{
+					fillTableList((Element) childNode, tableList);
+				}
+			}
+		}
+		return tableList;
+	}
+
+	/**
+	 * ToDo: Instead of adding all elements using an index to the document, we
+	 * might add a pattern to the code generation to create a HashMap either on
+	 * demand (whenever such a structure is required from the user) or by
+	 * default
+	 *
+	 * @deprecated This method will be moved to the generated sources as soon
+	 *              code generation was improved!
+	 *
+	 */
+	public Map<String, StyleMasterPageElement> getMasterPages() throws Exception {
+
+		// get original values:
+		OdfStylesDom stylesDoc = getStylesDom();
+		OfficeMasterStylesElement masterStyles = OdfElement.findFirstChildNode(OfficeMasterStylesElement.class, stylesDoc.getRootElement());
+		Map<String, StyleMasterPageElement> masterPages = null;
+		if (masterStyles != null) {
+			NodeList lstMasterPages = stylesDoc.getElementsByTagNameNS(OdfDocumentNamespace.STYLE.getUri(), "master-page");
+			if (lstMasterPages != null && lstMasterPages.getLength() > 0) {
+				masterPages = new HashMap();
+				for (int i = 0; i < lstMasterPages.getLength(); i++) {
+					StyleMasterPageElement masterPage = (StyleMasterPageElement) lstMasterPages.item(i); //Take the node from the list
+					//ToDo: Drop Attribute Suffix for methods returning String values and NOT Attributes
+					String styleName = masterPage.getStyleNameAttribute();
+					masterPages.put(styleName, masterPage);
+				}
+			}
+		}
+		return masterPages;
+	}
+
+	/**
+	 * Close the OdfPackage and release all temporary created data.
+	 * Acter execution of this method, this class is no longer usable.
+	 * Do this as the last action to free resources.
+	 * Closing an already closed document has no effect.
+	 * Note that this will not close any cached documents.
+	 */
+	@Override
+	public void close() {
+		mContentDom = null;
+		mStylesDom = null;
+		mMetaDom = null;
+		mSettingsDom = null;
+		mDocumentStyles = null;
+		super.close();
+	}
+
+	public OdfFileDom getFileDom(OdfXMLFile file) throws Exception {
+		return getFileDom(getXMLFilePath(file));
+	}
+
+	/**
+	 * Get all two types of RDF Metadata through GRDDL XSLT:
+	 * http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#__RefHeading__1415068_253892949
+	 */
+	public Model getRDFMetadata() throws Exception {
+		Model m = getInContentMetadata().union(this.getManifestRDFMetadata());
+		return m;
+	}
+
+	/**
+	 * Get In Content RDF Metadata through GRDDL XSLT
+	 * http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#__RefHeading__1415070_253892949
+	 */
+	public Model getInContentMetadata() throws Exception {
+		Model documentRDFModel = ModelFactory.createDefaultModel();
+		Model fileRDFModel = null;
+		for (String internalPath : this.getPackage().getFilePaths()) {
+			for (OdfXMLFile file : OdfXMLFile.values()) {
+				if (Util.isSubPathOf(internalPath, this.getDocumentPath())
+						&& internalPath.endsWith(file.getFileName())) {
+					fileRDFModel = getXMLFileMetadata(internalPath);
+					if (fileRDFModel.size() > 0) {
+						documentRDFModel = documentRDFModel.union(fileRDFModel);
+					}
+					break;
+				}
+			}
+		}
+		if (fileRDFModel.size() > 0) {
+			documentRDFModel = documentRDFModel.union(fileRDFModel);
+		}
+		return documentRDFModel;
+	}
+
+	/**
+	 * Get in-content metadata cache model
+	 *
+	 * @return The in-content metadata cache model
+	 * @throws Exception
+	 */
+	public Model getInContentMetadataFromCache() throws Exception {
+		Model m = ModelFactory.createDefaultModel();
+		// find and merge the RDF triples cache from the OdfXMLFile files
+		for (OdfXMLFile file : OdfXMLFile.values()) {
+			for (Model m1 : this.getFileDom(file).getInContentMetadataCache().values()) {
+				m = m.union(m1);
+			}
+		}
+		return m;
+	}
+
+	/**
+	 * Get RDF metadata from manifest.rdf and those rdf files registered in the
+	 * manifest.xml as "application/rdf+xml" through GRDDL XSLT
+	 * http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#__RefHeading__1415072_253892949
+	 */
+	public Model getManifestRDFMetadata() throws Exception {
+		Model m = ModelFactory.createDefaultModel();
+		for (String internalPath : this.getPackage().getFilePaths()) {
+			if (Util.isSubPathOf(internalPath, this.getDocumentPath()) && this.getPackage().getMediaTypeString(internalPath).endsWith("application/rdf+xml")) {
+				Model m1 = ModelFactory.createDefaultModel();
+				String RDFBaseUri = Util.getRDFBaseUri(this.getPackage().getBaseURI(), internalPath);
+				m1.read(new InputStreamReader(this.getPackage().getInputStream(internalPath), "utf-8"), RDFBaseUri);
+				// remove the last SLASH at the end of the RDFBaseUri:
+				// test_rdfmeta.odt/ --> test_rdfmeta.odt
+				ResourceUtils.renameResource(m1.getResource(RDFBaseUri), RDFBaseUri.substring(0, RDFBaseUri.length() - 1));
+				if (m1.size() > 0) {
+					m = m.union(m1);
+				}
+			}
+		}
+		return m;
+	}
+
+	/**
+	 * Get in-content metadata model of bookmarks
+	 *
+	 * @return The in-content metadata model of bookmarks
+	 * @throws Exception
+	 */
+	public Model getBookmarkRDFMetadata() throws Exception {
+		Model m = ModelFactory.createDefaultModel();
+		for (OdfXMLFile file : OdfXMLFile.values()) {
+			OdfFileDom dom = getFileDom(file);
+			m = m.union(dom.getBookmarkRDFMetadata());
+		}
+		return m;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSettingsDom.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSettingsDom.java
new file mode 100644
index 0000000..bda91f6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfSettingsDom.java
@@ -0,0 +1,94 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentSettingsElement;
+import org.odftoolkit.odfdom.pkg.NamespaceName;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+
+/**
+ * The DOM repesentation of the ODF Settings.xml file of an ODF document.
+ */
+public class OdfSettingsDom extends OdfFileDom {
+
+	private static final long serialVersionUID = 766167617530147885L;
+
+	/**
+	 * Creates the DOM representation of an XML file of an Odf document.
+	 *
+	 * @param odfDocument   the document the XML files belongs to
+	 * @param packagePath   the internal package path to the XML file
+	 */
+	public OdfSettingsDom(OdfSchemaDocument odfDocument, String packagePath) {
+		super(odfDocument, packagePath);
+	}
+
+	/** Might be used to initialize specific XML Namespace prefixes/URIs for this XML file*/
+	@Override
+	protected void initialize() {
+		for (NamespaceName name : OdfDocumentNamespace.values()) {
+			mUriByPrefix.put(name.getPrefix(), name.getUri());
+			mPrefixByUri.put(name.getUri(), name.getPrefix());
+		}
+		super.initialize();
+	}
+
+	/**
+	 * Retrieves the Odf Document
+	 *
+	 * @return The <code>OdfDocument</code>
+	 */
+	@Override
+	public OdfSchemaDocument getDocument() {
+		return (OdfSchemaDocument) mPackageDocument;
+	}
+
+	/**
+	 * @return The root element <office:document-settings> of the settings.xml file as <code>OfficeDocumentSettingsElement</code>.
+	 */
+	@Override
+	public OfficeDocumentSettingsElement getRootElement() {
+		return (OfficeDocumentSettingsElement) 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.
+	 */
+	@Override
+	public XPath getXPath() {
+		if (mXPath == null) {
+			mXPath = XPathFactory.newInstance().newXPath();
+			mXPath.setNamespaceContext(this);
+			for (NamespaceName name : OdfDocumentNamespace.values()) {
+				mUriByPrefix.put(name.getPrefix(), name.getUri());
+				mPrefixByUri.put(name.getUri(), name.getPrefix());
+			}
+		}
+		return mXPath;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfStylesDom.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfStylesDom.java
new file mode 100644
index 0000000..b820177
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/OdfStylesDom.java
@@ -0,0 +1,155 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentStylesElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.pkg.NamespaceName;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.Node;
+
+/**
+ * The DOM repesentation of the ODF styles.xml file of an ODF document.
+ */
+public class OdfStylesDom extends OdfFileDom {
+
+	private static final long serialVersionUID = 766167617530147886L;
+
+	/**
+	 * Creates the DOM representation of an XML file of an Odf document.
+	 *
+	 * @param odfDocument   the document the XML files belongs to
+	 * @param packagePath   the internal package path to the XML file
+	 */
+	public OdfStylesDom(OdfSchemaDocument odfDocument, String packagePath) {
+		super(odfDocument, packagePath);
+	}
+
+	/** Might be used to initialize specific XML Namespace prefixes/URIs for this XML file*/
+	@Override
+	protected void initialize() {
+		for (NamespaceName name : OdfDocumentNamespace.values()) {
+			mUriByPrefix.put(name.getPrefix(), name.getUri());
+			mPrefixByUri.put(name.getUri(), name.getPrefix());
+		}
+		super.initialize();
+	}
+
+	/**
+	 * Retrieves the Odf Document
+	 *
+	 * @return The <code>OdfDocument</code>
+	 */
+	@Override
+	public OdfSchemaDocument getDocument() {
+		return (OdfSchemaDocument) mPackageDocument;
+	}
+
+	/**
+	 * * @return The root element <office:document-styles> of the styles.xml file as <code>OfficeDocumentStylesElement</code>.
+	 */
+	@Override
+	public OfficeDocumentStylesElement getRootElement() {
+		return (OfficeDocumentStylesElement) 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.
+	 */
+	@Override
+	public XPath getXPath() {
+		if (mXPath == null) {
+			mXPath = XPathFactory.newInstance().newXPath();
+			mXPath.setNamespaceContext(this);
+			for (NamespaceName name : OdfDocumentNamespace.values()) {
+				mUriByPrefix.put(name.getPrefix(), name.getUri());
+				mPrefixByUri.put(name.getUri(), name.getPrefix());
+			}
+		}
+		return mXPath;
+	}
+
+
+	// ToDo bug 72 - STYLE REFACTORING - THE FOLLOWING METHODS WILL BE RE/MOVED
+	// As Package layer should not refer to DOM/DOC layer and DOM files should not
+	// handle automatic styles the upcoming DOM Document should capsulate this.
+	/**
+	 * @return the style:office-styles element of this dom. May return null
+	 *         if there is not yet such element in this dom.
+	 *
+	 * @see #getOrCreateAutomaticStyles()
+	 *
+	 */
+	public OdfOfficeStyles getOfficeStyles() {
+		return OdfElement.findFirstChildNode(OdfOfficeStyles.class, getFirstChild());
+	}
+
+	/**
+	 * Retrieve the ODF AutomaticStyles
+	 *
+	 * @return the {@odf.element style:automatic-styles} element of this dom. May return null
+	 *         if there is not yet such element in this dom.
+	 *
+	 * @see #getOrCreateAutomaticStyles()
+	 *
+	 */
+	public OdfOfficeAutomaticStyles getAutomaticStyles() {
+		return OdfElement.findFirstChildNode(OdfOfficeAutomaticStyles.class, getFirstChild());
+	}
+
+	/**
+	 * @return the {@odf.element style:automatic-styles} element of this dom. If it does not
+	 *         yet exists, a new one is inserted into the dom and returned.
+	 *
+	 */
+	public OdfOfficeAutomaticStyles getOrCreateAutomaticStyles() {
+
+		OdfOfficeAutomaticStyles automaticStyles = getAutomaticStyles();
+		if (automaticStyles == null) {
+			automaticStyles = newOdfElement(OdfOfficeAutomaticStyles.class);
+
+			Node parent = getFirstChild();
+
+			// try to insert before body or before master-styles element
+			OdfElement sibling = OdfElement.findFirstChildNode(OfficeBodyElement.class, parent);
+			if (sibling == null) {
+				sibling = OdfElement.findFirstChildNode(OdfOfficeMasterStyles.class, parent);
+			}
+			if (sibling == null) {
+				parent.appendChild(automaticStyles);
+			} else {
+				parent.insertBefore(automaticStyles, sibling);
+			}
+		}
+		return automaticStyles;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimAudioLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimAudioLevelAttribute.java
new file mode 100644
index 0000000..cbca6a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimAudioLevelAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:audio-level}.
+ *
+ */
+public class AnimAudioLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "audio-level");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:audio-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimAudioLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:audio-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:audio-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:audio-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimColorInterpolationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimColorInterpolationAttribute.java
new file mode 100644
index 0000000..736edef
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimColorInterpolationAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:color-interpolation}.
+ *
+ */
+public class AnimColorInterpolationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "color-interpolation");
+	public static final String DEFAULT_VALUE = "rgb";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:color-interpolation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimColorInterpolationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:color-interpolation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute anim:color-interpolation}.
+	 */
+	public enum Value {
+		HSL("hsl"), RGB("rgb") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:color-interpolation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:color-interpolation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimColorInterpolationDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimColorInterpolationDirectionAttribute.java
new file mode 100644
index 0000000..ad847fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimColorInterpolationDirectionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:color-interpolation-direction}.
+ *
+ */
+public class AnimColorInterpolationDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "color-interpolation-direction");
+	public static final String DEFAULT_VALUE = "clockwise";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:color-interpolation-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimColorInterpolationDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:color-interpolation-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute anim:color-interpolation-direction}.
+	 */
+	public enum Value {
+		CLOCKWISE("clockwise"), COUNTER_CLOCKWISE("counter-clockwise") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:color-interpolation-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:color-interpolation-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimCommandAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimCommandAttribute.java
new file mode 100644
index 0000000..a8ea69c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimCommandAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:command}.
+ *
+ */
+public class AnimCommandAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "command");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:command}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimCommandAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:command}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:command}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:command} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimFormulaAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimFormulaAttribute.java
new file mode 100644
index 0000000..75d5ff6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimFormulaAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:formula}.
+ *
+ */
+public class AnimFormulaAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "formula");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:formula}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimFormulaAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:formula}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:formula}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:formula} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIdAttribute.java
new file mode 100644
index 0000000..35799c7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:id}.
+ *
+ */
+public class AnimIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIterateIntervalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIterateIntervalAttribute.java
new file mode 100644
index 0000000..6669fbc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIterateIntervalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:iterate-interval}.
+ *
+ */
+public class AnimIterateIntervalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "iterate-interval");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:iterate-interval}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimIterateIntervalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:iterate-interval}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:iterate-interval}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:iterate-interval} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIterateTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIterateTypeAttribute.java
new file mode 100644
index 0000000..06253b6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimIterateTypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:iterate-type}.
+ *
+ */
+public class AnimIterateTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "iterate-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:iterate-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimIterateTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:iterate-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:iterate-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:iterate-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimNameAttribute.java
new file mode 100644
index 0000000..5922d79
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:name}.
+ *
+ */
+public class AnimNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimSubItemAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimSubItemAttribute.java
new file mode 100644
index 0000000..4b50d2c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimSubItemAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:sub-item}.
+ *
+ */
+public class AnimSubItemAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "sub-item");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:sub-item}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimSubItemAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:sub-item}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:sub-item}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:sub-item} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimValueAttribute.java
new file mode 100644
index 0000000..6ae9696
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/anim/AnimValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.anim;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute anim:value}.
+ *
+ */
+public class AnimValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute anim:value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AnimValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute anim:value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute anim:value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute anim:value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAngleOffsetAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAngleOffsetAttribute.java
new file mode 100644
index 0000000..45e6387
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAngleOffsetAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:angle-offset}.
+ *
+ */
+public class ChartAngleOffsetAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "angle-offset");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:angle-offset}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAngleOffsetAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:angle-offset}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:angle-offset}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:angle-offset} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAttachedAxisAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAttachedAxisAttribute.java
new file mode 100644
index 0000000..2e90b50
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAttachedAxisAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:attached-axis}.
+ *
+ */
+public class ChartAttachedAxisAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "attached-axis");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:attached-axis}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAttachedAxisAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:attached-axis}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:attached-axis}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:attached-axis} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutoPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutoPositionAttribute.java
new file mode 100644
index 0000000..d40fb9d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutoPositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:auto-position}.
+ *
+ */
+public class ChartAutoPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "auto-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:auto-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAutoPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:auto-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:auto-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:auto-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutoSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutoSizeAttribute.java
new file mode 100644
index 0000000..2fd83fb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutoSizeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:auto-size}.
+ *
+ */
+public class ChartAutoSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "auto-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:auto-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAutoSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:auto-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:auto-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:auto-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutomaticContentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutomaticContentAttribute.java
new file mode 100644
index 0000000..da7c4e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAutomaticContentAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:automatic-content}.
+ *
+ */
+public class ChartAutomaticContentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "automatic-content");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:automatic-content}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAutomaticContentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:automatic-content}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:automatic-content}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:automatic-content} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAxisLabelPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAxisLabelPositionAttribute.java
new file mode 100644
index 0000000..17f627b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAxisLabelPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:axis-label-position}.
+ *
+ */
+public class ChartAxisLabelPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "axis-label-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:axis-label-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAxisLabelPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:axis-label-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:axis-label-position}.
+	 */
+	public enum Value {
+		NEAR_AXIS("near-axis"), NEAR_AXIS_OTHER_SIDE("near-axis-other-side"), OUTSIDE_END("outside-end"), OUTSIDE_START("outside-start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:axis-label-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:axis-label-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAxisPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAxisPositionAttribute.java
new file mode 100644
index 0000000..d71fe1e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartAxisPositionAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:axis-position}.
+ *
+ */
+public class ChartAxisPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "axis-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:axis-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartAxisPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:axis-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:axis-position}.
+	 */
+	public enum Value {
+		END("end"), START("start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:axis-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:axis-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartClassAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartClassAttribute.java
new file mode 100644
index 0000000..7c6cd54
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartClassAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:class}.
+ *
+ */
+public class ChartClassAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "class");
+	public static final String DEFAULT_VALUE = "major";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:class}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartClassAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:class}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:class}.
+	 */
+	public enum Value {
+		MAJOR("major"), MINOR("minor") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:class}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:class} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartColumnMappingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartColumnMappingAttribute.java
new file mode 100644
index 0000000..582cb62
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartColumnMappingAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:column-mapping}.
+ *
+ */
+public class ChartColumnMappingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "column-mapping");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:column-mapping}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartColumnMappingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:column-mapping}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:column-mapping}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:column-mapping} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartConnectBarsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartConnectBarsAttribute.java
new file mode 100644
index 0000000..147ee82
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartConnectBarsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:connect-bars}.
+ *
+ */
+public class ChartConnectBarsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "connect-bars");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:connect-bars}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartConnectBarsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:connect-bars}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:connect-bars}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:connect-bars} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelNumberAttribute.java
new file mode 100644
index 0000000..d0a09c3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelNumberAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:data-label-number}.
+ *
+ */
+public class ChartDataLabelNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "data-label-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:data-label-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDataLabelNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:data-label-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:data-label-number}.
+	 */
+	public enum Value {
+		NONE("none"), PERCENTAGE("percentage"), VALUE("value"), VALUE_AND_PERCENTAGE("value-and-percentage") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:data-label-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:data-label-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelSymbolAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelSymbolAttribute.java
new file mode 100644
index 0000000..f1f2b2b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelSymbolAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:data-label-symbol}.
+ *
+ */
+public class ChartDataLabelSymbolAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "data-label-symbol");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:data-label-symbol}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDataLabelSymbolAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:data-label-symbol}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:data-label-symbol}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:data-label-symbol} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelTextAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelTextAttribute.java
new file mode 100644
index 0000000..e284a01
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataLabelTextAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:data-label-text}.
+ *
+ */
+public class ChartDataLabelTextAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "data-label-text");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:data-label-text}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDataLabelTextAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:data-label-text}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:data-label-text}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:data-label-text} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataSourceHasLabelsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataSourceHasLabelsAttribute.java
new file mode 100644
index 0000000..c8579ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDataSourceHasLabelsAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:data-source-has-labels}.
+ *
+ */
+public class ChartDataSourceHasLabelsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "data-source-has-labels");
+	public static final String DEFAULT_VALUE = "none";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:data-source-has-labels}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDataSourceHasLabelsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:data-source-has-labels}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:data-source-has-labels}.
+	 */
+	public enum Value {
+		BOTH("both"), COLUMN("column"), NONE("none"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:data-source-has-labels}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:data-source-has-labels} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDeepAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDeepAttribute.java
new file mode 100644
index 0000000..57b9afc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDeepAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:deep}.
+ *
+ */
+public class ChartDeepAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "deep");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:deep}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDeepAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:deep}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:deep}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:deep} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDimensionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDimensionAttribute.java
new file mode 100644
index 0000000..37601f1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDimensionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:dimension}.
+ *
+ */
+public class ChartDimensionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "dimension");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:dimension}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDimensionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:dimension}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:dimension}.
+	 */
+	public enum Value {
+		x("x"), y("y"), z("z") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:dimension}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:dimension} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayEquationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayEquationAttribute.java
new file mode 100644
index 0000000..d5bb71e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayEquationAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:display-equation}.
+ *
+ */
+public class ChartDisplayEquationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "display-equation");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:display-equation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDisplayEquationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:display-equation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:display-equation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:display-equation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayLabelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayLabelAttribute.java
new file mode 100644
index 0000000..8b35eed
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayLabelAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:display-label}.
+ *
+ */
+public class ChartDisplayLabelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "display-label");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:display-label}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDisplayLabelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:display-label}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:display-label}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:display-label} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayRSquareAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayRSquareAttribute.java
new file mode 100644
index 0000000..b9237ce
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartDisplayRSquareAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:display-r-square}.
+ *
+ */
+public class ChartDisplayRSquareAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "display-r-square");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:display-r-square}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartDisplayRSquareAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:display-r-square}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:display-r-square}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:display-r-square} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorCategoryAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorCategoryAttribute.java
new file mode 100644
index 0000000..632e1aa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorCategoryAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-category}.
+ *
+ */
+public class ChartErrorCategoryAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-category");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-category}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorCategoryAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-category}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:error-category}.
+	 */
+	public enum Value {
+		CELL_RANGE("cell-range"), CONSTANT("constant"), ERROR_MARGIN("error-margin"), NONE("none"), PERCENTAGE("percentage"), STANDARD_DEVIATION("standard-deviation"), STANDARD_ERROR("standard-error"), VARIANCE("variance") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-category}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-category} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerIndicatorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerIndicatorAttribute.java
new file mode 100644
index 0000000..3fb2709
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerIndicatorAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-lower-indicator}.
+ *
+ */
+public class ChartErrorLowerIndicatorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-indicator");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-lower-indicator}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorLowerIndicatorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-lower-indicator}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-lower-indicator}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-lower-indicator} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerLimitAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerLimitAttribute.java
new file mode 100644
index 0000000..484fcbf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerLimitAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-lower-limit}.
+ *
+ */
+public class ChartErrorLowerLimitAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-limit");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-lower-limit}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorLowerLimitAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-lower-limit}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-lower-limit}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-lower-limit} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerRangeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerRangeAttribute.java
new file mode 100644
index 0000000..e812e28
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorLowerRangeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-lower-range}.
+ *
+ */
+public class ChartErrorLowerRangeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-range");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-lower-range}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorLowerRangeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-lower-range}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-lower-range}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-lower-range} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorMarginAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorMarginAttribute.java
new file mode 100644
index 0000000..deb6586
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorMarginAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-margin}.
+ *
+ */
+public class ChartErrorMarginAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-margin");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-margin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorMarginAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-margin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-margin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-margin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorPercentageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorPercentageAttribute.java
new file mode 100644
index 0000000..7b27ac4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorPercentageAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-percentage}.
+ *
+ */
+public class ChartErrorPercentageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-percentage");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-percentage}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorPercentageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-percentage}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-percentage}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-percentage} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperIndicatorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperIndicatorAttribute.java
new file mode 100644
index 0000000..0b6b764
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperIndicatorAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-upper-indicator}.
+ *
+ */
+public class ChartErrorUpperIndicatorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-indicator");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-upper-indicator}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorUpperIndicatorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-upper-indicator}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-upper-indicator}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-upper-indicator} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperLimitAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperLimitAttribute.java
new file mode 100644
index 0000000..721f714
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperLimitAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-upper-limit}.
+ *
+ */
+public class ChartErrorUpperLimitAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-limit");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-upper-limit}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorUpperLimitAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-upper-limit}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-upper-limit}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-upper-limit} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperRangeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperRangeAttribute.java
new file mode 100644
index 0000000..22dec32
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartErrorUpperRangeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:error-upper-range}.
+ *
+ */
+public class ChartErrorUpperRangeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-range");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:error-upper-range}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorUpperRangeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:error-upper-range}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:error-upper-range}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:error-upper-range} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartGapWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartGapWidthAttribute.java
new file mode 100644
index 0000000..a306b43
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartGapWidthAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:gap-width}.
+ *
+ */
+public class ChartGapWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "gap-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:gap-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartGapWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:gap-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:gap-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:gap-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartGroupBarsPerAxisAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartGroupBarsPerAxisAttribute.java
new file mode 100644
index 0000000..582f0d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartGroupBarsPerAxisAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:group-bars-per-axis}.
+ *
+ */
+public class ChartGroupBarsPerAxisAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "group-bars-per-axis");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:group-bars-per-axis}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartGroupBarsPerAxisAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:group-bars-per-axis}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:group-bars-per-axis}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:group-bars-per-axis} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartHoleSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartHoleSizeAttribute.java
new file mode 100644
index 0000000..eec45be
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartHoleSizeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:hole-size}.
+ *
+ */
+public class ChartHoleSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "hole-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:hole-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartHoleSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:hole-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:hole-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:hole-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIncludeHiddenCellsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIncludeHiddenCellsAttribute.java
new file mode 100644
index 0000000..7319148
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIncludeHiddenCellsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:include-hidden-cells}.
+ *
+ */
+public class ChartIncludeHiddenCellsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "include-hidden-cells");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:include-hidden-cells}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartIncludeHiddenCellsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:include-hidden-cells}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:include-hidden-cells}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:include-hidden-cells} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartInterpolationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartInterpolationAttribute.java
new file mode 100644
index 0000000..20555da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartInterpolationAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:interpolation}.
+ *
+ */
+public class ChartInterpolationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "interpolation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:interpolation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartInterpolationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:interpolation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:interpolation}.
+	 */
+	public enum Value {
+		B_SPLINE("b-spline"), CUBIC_SPLINE("cubic-spline"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:interpolation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:interpolation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIntervalMajorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIntervalMajorAttribute.java
new file mode 100644
index 0000000..0434afd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIntervalMajorAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:interval-major}.
+ *
+ */
+public class ChartIntervalMajorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "interval-major");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:interval-major}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartIntervalMajorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:interval-major}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:interval-major}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:interval-major} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIntervalMinorDivisorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIntervalMinorDivisorAttribute.java
new file mode 100644
index 0000000..666d9d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartIntervalMinorDivisorAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:interval-minor-divisor}.
+ *
+ */
+public class ChartIntervalMinorDivisorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "interval-minor-divisor");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:interval-minor-divisor}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartIntervalMinorDivisorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:interval-minor-divisor}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:interval-minor-divisor}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:interval-minor-divisor} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartJapaneseCandleStickAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartJapaneseCandleStickAttribute.java
new file mode 100644
index 0000000..9357cd2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartJapaneseCandleStickAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:japanese-candle-stick}.
+ *
+ */
+public class ChartJapaneseCandleStickAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "japanese-candle-stick");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:japanese-candle-stick}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartJapaneseCandleStickAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:japanese-candle-stick}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:japanese-candle-stick}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:japanese-candle-stick} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelArrangementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelArrangementAttribute.java
new file mode 100644
index 0000000..0627a5f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelArrangementAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:label-arrangement}.
+ *
+ */
+public class ChartLabelArrangementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "label-arrangement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:label-arrangement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLabelArrangementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:label-arrangement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:label-arrangement}.
+	 */
+	public enum Value {
+		SIDE_BY_SIDE("side-by-side"), STAGGER_EVEN("stagger-even"), STAGGER_ODD("stagger-odd") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:label-arrangement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:label-arrangement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelCellAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelCellAddressAttribute.java
new file mode 100644
index 0000000..321ea5d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelCellAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:label-cell-address}.
+ *
+ */
+public class ChartLabelCellAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "label-cell-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:label-cell-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLabelCellAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:label-cell-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:label-cell-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:label-cell-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelPositionAttribute.java
new file mode 100644
index 0000000..751c7c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:label-position}.
+ *
+ */
+public class ChartLabelPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "label-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:label-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLabelPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:label-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:label-position}.
+	 */
+	public enum Value {
+		AVOID_OVERLAP("avoid-overlap"), BOTTOM("bottom"), BOTTOM_LEFT("bottom-left"), BOTTOM_RIGHT("bottom-right"), CENTER("center"), INSIDE("inside"), LEFT("left"), NEAR_ORIGIN("near-origin"), OUTSIDE("outside"), RIGHT("right"), TOP("top"), TOP_LEFT("top-left"), TOP_RIGHT("top-right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:label-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:label-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelPositionNegativeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelPositionNegativeAttribute.java
new file mode 100644
index 0000000..144f7c2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLabelPositionNegativeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:label-position-negative}.
+ *
+ */
+public class ChartLabelPositionNegativeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "label-position-negative");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:label-position-negative}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLabelPositionNegativeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:label-position-negative}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:label-position-negative}.
+	 */
+	public enum Value {
+		AVOID_OVERLAP("avoid-overlap"), BOTTOM("bottom"), BOTTOM_LEFT("bottom-left"), BOTTOM_RIGHT("bottom-right"), CENTER("center"), INSIDE("inside"), LEFT("left"), NEAR_ORIGIN("near-origin"), OUTSIDE("outside"), RIGHT("right"), TOP("top"), TOP_LEFT("top-left"), TOP_RIGHT("top-right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:label-position-negative}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:label-position-negative} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLegendAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLegendAlignAttribute.java
new file mode 100644
index 0000000..28e5f64
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLegendAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:legend-align}.
+ *
+ */
+public class ChartLegendAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "legend-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:legend-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLegendAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:legend-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:legend-align}.
+	 */
+	public enum Value {
+		CENTER("center"), END("end"), START("start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:legend-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:legend-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLegendPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLegendPositionAttribute.java
new file mode 100644
index 0000000..a2b116e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLegendPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:legend-position}.
+ *
+ */
+public class ChartLegendPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "legend-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:legend-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLegendPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:legend-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:legend-position}.
+	 */
+	public enum Value {
+		BOTTOM("bottom"), BOTTOM_END("bottom-end"), BOTTOM_START("bottom-start"), END("end"), START("start"), TOP("top"), TOP_END("top-end"), TOP_START("top-start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:legend-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:legend-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLinesAttribute.java
new file mode 100644
index 0000000..0c20a93
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLinesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:lines}.
+ *
+ */
+public class ChartLinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "lines");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:lines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:lines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:lines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:lines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLinkDataStyleToSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLinkDataStyleToSourceAttribute.java
new file mode 100644
index 0000000..5816e41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLinkDataStyleToSourceAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:link-data-style-to-source}.
+ *
+ */
+public class ChartLinkDataStyleToSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "link-data-style-to-source");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:link-data-style-to-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLinkDataStyleToSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:link-data-style-to-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:link-data-style-to-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:link-data-style-to-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLogarithmicAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLogarithmicAttribute.java
new file mode 100644
index 0000000..31bf383
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartLogarithmicAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:logarithmic}.
+ *
+ */
+public class ChartLogarithmicAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "logarithmic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:logarithmic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartLogarithmicAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:logarithmic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:logarithmic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:logarithmic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMaximumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMaximumAttribute.java
new file mode 100644
index 0000000..03d86ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMaximumAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:maximum}.
+ *
+ */
+public class ChartMaximumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "maximum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:maximum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartMaximumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:maximum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:maximum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:maximum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMeanValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMeanValueAttribute.java
new file mode 100644
index 0000000..bbeb651
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMeanValueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:mean-value}.
+ *
+ */
+public class ChartMeanValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "mean-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:mean-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartMeanValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:mean-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:mean-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:mean-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMinimumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMinimumAttribute.java
new file mode 100644
index 0000000..f7f647c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartMinimumAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:minimum}.
+ *
+ */
+public class ChartMinimumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "minimum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:minimum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartMinimumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:minimum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:minimum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:minimum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartNameAttribute.java
new file mode 100644
index 0000000..e5e422b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:name}.
+ *
+ */
+public class ChartNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartOriginAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartOriginAttribute.java
new file mode 100644
index 0000000..014fbe3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartOriginAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:origin}.
+ *
+ */
+public class ChartOriginAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "origin");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:origin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartOriginAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:origin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:origin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:origin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartOverlapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartOverlapAttribute.java
new file mode 100644
index 0000000..86229ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartOverlapAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:overlap}.
+ *
+ */
+public class ChartOverlapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "overlap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:overlap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartOverlapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:overlap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:overlap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:overlap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartPercentageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartPercentageAttribute.java
new file mode 100644
index 0000000..0a159f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartPercentageAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:percentage}.
+ *
+ */
+public class ChartPercentageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "percentage");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:percentage}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartPercentageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:percentage}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:percentage}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:percentage} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartPieOffsetAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartPieOffsetAttribute.java
new file mode 100644
index 0000000..9d1533f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartPieOffsetAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:pie-offset}.
+ *
+ */
+public class ChartPieOffsetAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "pie-offset");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:pie-offset}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartPieOffsetAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:pie-offset}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:pie-offset}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:pie-offset} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRegressionTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRegressionTypeAttribute.java
new file mode 100644
index 0000000..1459336
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRegressionTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:regression-type}.
+ *
+ */
+public class ChartRegressionTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "regression-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:regression-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartRegressionTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:regression-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:regression-type}.
+	 */
+	public enum Value {
+		EXPONENTIAL("exponential"), LINEAR("linear"), LOGARITHMIC("logarithmic"), NONE("none"), POWER("power") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:regression-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:regression-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRepeatedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRepeatedAttribute.java
new file mode 100644
index 0000000..ca9c865
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRepeatedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:repeated}.
+ *
+ */
+public class ChartRepeatedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "repeated");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:repeated}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartRepeatedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:repeated}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:repeated}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:repeated} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartReverseDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartReverseDirectionAttribute.java
new file mode 100644
index 0000000..3c50378
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartReverseDirectionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:reverse-direction}.
+ *
+ */
+public class ChartReverseDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "reverse-direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:reverse-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartReverseDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:reverse-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:reverse-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:reverse-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRightAngledAxesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRightAngledAxesAttribute.java
new file mode 100644
index 0000000..c1fb793
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRightAngledAxesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:right-angled-axes}.
+ *
+ */
+public class ChartRightAngledAxesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "right-angled-axes");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:right-angled-axes}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartRightAngledAxesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:right-angled-axes}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:right-angled-axes}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:right-angled-axes} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRowMappingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRowMappingAttribute.java
new file mode 100644
index 0000000..c09119a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartRowMappingAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:row-mapping}.
+ *
+ */
+public class ChartRowMappingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "row-mapping");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:row-mapping}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartRowMappingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:row-mapping}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:row-mapping}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:row-mapping} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartScaleTextAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartScaleTextAttribute.java
new file mode 100644
index 0000000..87fe1d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartScaleTextAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:scale-text}.
+ *
+ */
+public class ChartScaleTextAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "scale-text");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:scale-text}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartScaleTextAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:scale-text}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:scale-text}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:scale-text} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSeriesSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSeriesSourceAttribute.java
new file mode 100644
index 0000000..3797c5d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSeriesSourceAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:series-source}.
+ *
+ */
+public class ChartSeriesSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "series-source");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:series-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSeriesSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:series-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:series-source}.
+	 */
+	public enum Value {
+		COLUMNS("columns"), ROWS("rows") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:series-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:series-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSolidTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSolidTypeAttribute.java
new file mode 100644
index 0000000..5377fe0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSolidTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:solid-type}.
+ *
+ */
+public class ChartSolidTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "solid-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:solid-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSolidTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:solid-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:solid-type}.
+	 */
+	public enum Value {
+		CONE("cone"), CUBOID("cuboid"), CYLINDER("cylinder"), PYRAMID("pyramid") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:solid-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:solid-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSortByXValuesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSortByXValuesAttribute.java
new file mode 100644
index 0000000..9f3c3a8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSortByXValuesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:sort-by-x-values}.
+ *
+ */
+public class ChartSortByXValuesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "sort-by-x-values");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:sort-by-x-values}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSortByXValuesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:sort-by-x-values}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:sort-by-x-values}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:sort-by-x-values} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSplineOrderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSplineOrderAttribute.java
new file mode 100644
index 0000000..03b1345
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSplineOrderAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:spline-order}.
+ *
+ */
+public class ChartSplineOrderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "spline-order");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:spline-order}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSplineOrderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:spline-order}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:spline-order}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:spline-order} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSplineResolutionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSplineResolutionAttribute.java
new file mode 100644
index 0000000..2ae5762
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSplineResolutionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:spline-resolution}.
+ *
+ */
+public class ChartSplineResolutionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "spline-resolution");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:spline-resolution}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSplineResolutionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:spline-resolution}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:spline-resolution}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:spline-resolution} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartStackedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartStackedAttribute.java
new file mode 100644
index 0000000..ad22149
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartStackedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:stacked}.
+ *
+ */
+public class ChartStackedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "stacked");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:stacked}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartStackedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:stacked}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:stacked}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:stacked} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartStyleNameAttribute.java
new file mode 100644
index 0000000..d9e3261
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:style-name}.
+ *
+ */
+public class ChartStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolHeightAttribute.java
new file mode 100644
index 0000000..f907e55
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:symbol-height}.
+ *
+ */
+public class ChartSymbolHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "symbol-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:symbol-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSymbolHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:symbol-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:symbol-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:symbol-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolNameAttribute.java
new file mode 100644
index 0000000..7f184f5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolNameAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:symbol-name}.
+ *
+ */
+public class ChartSymbolNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "symbol-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:symbol-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSymbolNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:symbol-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:symbol-name}.
+	 */
+	public enum Value {
+		ARROW_DOWN("arrow-down"), ARROW_LEFT("arrow-left"), ARROW_RIGHT("arrow-right"), ARROW_UP("arrow-up"), ASTERISK("asterisk"), BOW_TIE("bow-tie"), CIRCLE("circle"), DIAMOND("diamond"), HORIZONTAL_BAR("horizontal-bar"), HOURGLASS("hourglass"), PLUS("plus"), SQUARE("square"), STAR("star"), VERTICAL_BAR("vertical-bar"), x("x") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:symbol-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:symbol-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolTypeAttribute.java
new file mode 100644
index 0000000..f163239
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:symbol-type}.
+ *
+ */
+public class ChartSymbolTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "symbol-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:symbol-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSymbolTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:symbol-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:symbol-type}.
+	 */
+	public enum Value {
+		AUTOMATIC("automatic"), IMAGE("image"), NAMED_SYMBOL("named-symbol"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:symbol-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:symbol-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolWidthAttribute.java
new file mode 100644
index 0000000..200650b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartSymbolWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:symbol-width}.
+ *
+ */
+public class ChartSymbolWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "symbol-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:symbol-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartSymbolWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:symbol-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:symbol-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:symbol-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTextOverlapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTextOverlapAttribute.java
new file mode 100644
index 0000000..a568953
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTextOverlapAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:text-overlap}.
+ *
+ */
+public class ChartTextOverlapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "text-overlap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:text-overlap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTextOverlapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:text-overlap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:text-overlap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:text-overlap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartThreeDimensionalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartThreeDimensionalAttribute.java
new file mode 100644
index 0000000..2ca5134
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartThreeDimensionalAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:three-dimensional}.
+ *
+ */
+public class ChartThreeDimensionalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "three-dimensional");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:three-dimensional}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartThreeDimensionalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:three-dimensional}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:three-dimensional}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:three-dimensional} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarkPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarkPositionAttribute.java
new file mode 100644
index 0000000..1e0d50c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarkPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:tick-mark-position}.
+ *
+ */
+public class ChartTickMarkPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "tick-mark-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:tick-mark-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTickMarkPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:tick-mark-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:tick-mark-position}.
+	 */
+	public enum Value {
+		AT_AXIS("at-axis"), AT_LABELS("at-labels"), AT_LABELS_AND_AXIS("at-labels-and-axis") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:tick-mark-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:tick-mark-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMajorInnerAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMajorInnerAttribute.java
new file mode 100644
index 0000000..4607001
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMajorInnerAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:tick-marks-major-inner}.
+ *
+ */
+public class ChartTickMarksMajorInnerAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-major-inner");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:tick-marks-major-inner}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTickMarksMajorInnerAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:tick-marks-major-inner}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:tick-marks-major-inner}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:tick-marks-major-inner} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMajorOuterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMajorOuterAttribute.java
new file mode 100644
index 0000000..636244d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMajorOuterAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:tick-marks-major-outer}.
+ *
+ */
+public class ChartTickMarksMajorOuterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-major-outer");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:tick-marks-major-outer}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTickMarksMajorOuterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:tick-marks-major-outer}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:tick-marks-major-outer}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:tick-marks-major-outer} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMinorInnerAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMinorInnerAttribute.java
new file mode 100644
index 0000000..1c0874d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMinorInnerAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:tick-marks-minor-inner}.
+ *
+ */
+public class ChartTickMarksMinorInnerAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-minor-inner");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:tick-marks-minor-inner}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTickMarksMinorInnerAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:tick-marks-minor-inner}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:tick-marks-minor-inner}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:tick-marks-minor-inner} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMinorOuterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMinorOuterAttribute.java
new file mode 100644
index 0000000..b5b1e26
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTickMarksMinorOuterAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:tick-marks-minor-outer}.
+ *
+ */
+public class ChartTickMarksMinorOuterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-minor-outer");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:tick-marks-minor-outer}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTickMarksMinorOuterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:tick-marks-minor-outer}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:tick-marks-minor-outer}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:tick-marks-minor-outer} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTreatEmptyCellsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTreatEmptyCellsAttribute.java
new file mode 100644
index 0000000..812f29f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartTreatEmptyCellsAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:treat-empty-cells}.
+ *
+ */
+public class ChartTreatEmptyCellsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "treat-empty-cells");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:treat-empty-cells}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartTreatEmptyCellsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:treat-empty-cells}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute chart:treat-empty-cells}.
+	 */
+	public enum Value {
+		IGNORE("ignore"), LEAVE_GAP("leave-gap"), USE_ZERO("use-zero") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:treat-empty-cells}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:treat-empty-cells} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartValuesCellRangeAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartValuesCellRangeAddressAttribute.java
new file mode 100644
index 0000000..0f2d121
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartValuesCellRangeAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:values-cell-range-address}.
+ *
+ */
+public class ChartValuesCellRangeAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "values-cell-range-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:values-cell-range-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartValuesCellRangeAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:values-cell-range-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:values-cell-range-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:values-cell-range-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartVerticalAttribute.java
new file mode 100644
index 0000000..6ab8ff5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartVerticalAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:vertical}.
+ *
+ */
+public class ChartVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "vertical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartVisibleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartVisibleAttribute.java
new file mode 100644
index 0000000..db6dec5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/chart/ChartVisibleAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.chart;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute chart:visible}.
+ *
+ */
+public class ChartVisibleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "visible");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute chart:visible}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChartVisibleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute chart:visible}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute chart:visible}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute chart:visible} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/config/ConfigNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/config/ConfigNameAttribute.java
new file mode 100644
index 0000000..546601d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/config/ConfigNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.config;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute config:name}.
+ *
+ */
+public class ConfigNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute config:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ConfigNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute config:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute config:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute config:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/config/ConfigTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/config/ConfigTypeAttribute.java
new file mode 100644
index 0000000..f0dd3f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/config/ConfigTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.config;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute config:type}.
+ *
+ */
+public class ConfigTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute config:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ConfigTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute config:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute config:type}.
+	 */
+	public enum Value {
+		BASE64BINARY("base64Binary"), BOOLEAN("boolean"), DATETIME("datetime"), DOUBLE("double"), INT("int"), LONG("long"), SHORT("short"), STRING("string") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute config:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute config:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAdditionalColumnStatementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAdditionalColumnStatementAttribute.java
new file mode 100644
index 0000000..66306e1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAdditionalColumnStatementAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:additional-column-statement}.
+ *
+ */
+public class DbAdditionalColumnStatementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "additional-column-statement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:additional-column-statement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbAdditionalColumnStatementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:additional-column-statement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:additional-column-statement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:additional-column-statement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAppendTableAliasNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAppendTableAliasNameAttribute.java
new file mode 100644
index 0000000..fab2205
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAppendTableAliasNameAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:append-table-alias-name}.
+ *
+ */
+public class DbAppendTableAliasNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "append-table-alias-name");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:append-table-alias-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbAppendTableAliasNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:append-table-alias-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:append-table-alias-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:append-table-alias-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbApplyCommandAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbApplyCommandAttribute.java
new file mode 100644
index 0000000..8573a04
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbApplyCommandAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:apply-command}.
+ *
+ */
+public class DbApplyCommandAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "apply-command");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:apply-command}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbApplyCommandAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:apply-command}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:apply-command}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:apply-command} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAsTemplateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAsTemplateAttribute.java
new file mode 100644
index 0000000..ac35135
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbAsTemplateAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:as-template}.
+ *
+ */
+public class DbAsTemplateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "as-template");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:as-template}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbAsTemplateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:as-template}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:as-template}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:as-template} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbBaseDnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbBaseDnAttribute.java
new file mode 100644
index 0000000..9a7850a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbBaseDnAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:base-dn}.
+ *
+ */
+public class DbBaseDnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "base-dn");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:base-dn}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbBaseDnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:base-dn}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:base-dn}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:base-dn} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbBooleanComparisonModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbBooleanComparisonModeAttribute.java
new file mode 100644
index 0000000..a538541
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbBooleanComparisonModeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:boolean-comparison-mode}.
+ *
+ */
+public class DbBooleanComparisonModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "boolean-comparison-mode");
+	public static final String DEFAULT_VALUE = "equal-integer";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:boolean-comparison-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbBooleanComparisonModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:boolean-comparison-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:boolean-comparison-mode}.
+	 */
+	public enum Value {
+		EQUAL_BOOLEAN("equal-boolean"), EQUAL_INTEGER("equal-integer"), EQUAL_USE_ONLY_ZERO("equal-use-only-zero"), IS_BOOLEAN("is-boolean") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:boolean-comparison-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:boolean-comparison-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbCatalogNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbCatalogNameAttribute.java
new file mode 100644
index 0000000..aa837b9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbCatalogNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:catalog-name}.
+ *
+ */
+public class DbCatalogNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "catalog-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:catalog-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbCatalogNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:catalog-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:catalog-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:catalog-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbCommandAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbCommandAttribute.java
new file mode 100644
index 0000000..86d51ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbCommandAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:command}.
+ *
+ */
+public class DbCommandAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "command");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:command}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbCommandAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:command}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:command}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:command} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingIsListAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingIsListAttribute.java
new file mode 100644
index 0000000..0c79087
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingIsListAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:data-source-setting-is-list}.
+ *
+ */
+public class DbDataSourceSettingIsListAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source-setting-is-list");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:data-source-setting-is-list}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceSettingIsListAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:data-source-setting-is-list}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:data-source-setting-is-list}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:data-source-setting-is-list} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingNameAttribute.java
new file mode 100644
index 0000000..ee5cf80
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:data-source-setting-name}.
+ *
+ */
+public class DbDataSourceSettingNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source-setting-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:data-source-setting-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceSettingNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:data-source-setting-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:data-source-setting-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:data-source-setting-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingTypeAttribute.java
new file mode 100644
index 0000000..34279fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataSourceSettingTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:data-source-setting-type}.
+ *
+ */
+public class DbDataSourceSettingTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source-setting-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:data-source-setting-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceSettingTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:data-source-setting-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:data-source-setting-type}.
+	 */
+	public enum Value {
+		BOOLEAN("boolean"), DOUBLE("double"), INT("int"), LONG("long"), SHORT("short"), STRING("string") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:data-source-setting-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:data-source-setting-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataTypeAttribute.java
new file mode 100644
index 0000000..233f700
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDataTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:data-type}.
+ *
+ */
+public class DbDataTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:data-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDataTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:data-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:data-type}.
+	 */
+	public enum Value {
+		ARRAY("array"), BIGINT("bigint"), BINARY("binary"), BIT("bit"), BLOB("blob"), BOOLEAN("boolean"), CHAR("char"), CLOB("clob"), DATE("date"), DECIMAL("decimal"), DISTINCT("distinct"), DOUBLE("double"), FLOAT("float"), INTEGER("integer"), LONGVARBINARY("longvarbinary"), LONGVARCHAR("longvarchar"), NUMERIC("numeric"), OBJECT("object"), OTHER("other"), REAL("real"), REF("ref"), SMALLINT("smallint"), SQLNULL("sqlnull"), STRUCT("struct"), TIME("time"), TIMESTMP("timestmp"), TINYINT("tinyint"), VARBINARY("varbinary"), VARCHAR("varchar") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:data-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:data-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDatabaseNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDatabaseNameAttribute.java
new file mode 100644
index 0000000..a8a628f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDatabaseNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:database-name}.
+ *
+ */
+public class DbDatabaseNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "database-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:database-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDatabaseNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:database-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:database-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:database-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDecimalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDecimalAttribute.java
new file mode 100644
index 0000000..54fcfcd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDecimalAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:decimal}.
+ *
+ */
+public class DbDecimalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "decimal");
+	public static final String DEFAULT_VALUE = ".";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:decimal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDecimalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:decimal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:decimal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:decimal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDefaultCellStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDefaultCellStyleNameAttribute.java
new file mode 100644
index 0000000..02624f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDefaultCellStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:default-cell-style-name}.
+ *
+ */
+public class DbDefaultCellStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "default-cell-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:default-cell-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDefaultCellStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:default-cell-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:default-cell-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:default-cell-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDefaultRowStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDefaultRowStyleNameAttribute.java
new file mode 100644
index 0000000..d4ef50c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDefaultRowStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:default-row-style-name}.
+ *
+ */
+public class DbDefaultRowStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "default-row-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:default-row-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDefaultRowStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:default-row-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:default-row-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:default-row-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDeleteRuleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDeleteRuleAttribute.java
new file mode 100644
index 0000000..73c6d62
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDeleteRuleAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:delete-rule}.
+ *
+ */
+public class DbDeleteRuleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "delete-rule");
+	public static final String DEFAULT_VALUE = "no-action";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:delete-rule}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDeleteRuleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:delete-rule}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:delete-rule}.
+	 */
+	public enum Value {
+		CASCADE("cascade"), NO_ACTION("no-action"), RESTRICT("restrict"), SET_DEFAULT("set-default"), SET_NULL("set-null") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:delete-rule}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:delete-rule} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDescriptionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDescriptionAttribute.java
new file mode 100644
index 0000000..0b84bd4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbDescriptionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:description}.
+ *
+ */
+public class DbDescriptionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "description");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:description}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbDescriptionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:description}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:description}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:description} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEnableSql92CheckAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEnableSql92CheckAttribute.java
new file mode 100644
index 0000000..cb442b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEnableSql92CheckAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:enable-sql92-check}.
+ *
+ */
+public class DbEnableSql92CheckAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "enable-sql92-check");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:enable-sql92-check}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbEnableSql92CheckAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:enable-sql92-check}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:enable-sql92-check}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:enable-sql92-check} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEncodingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEncodingAttribute.java
new file mode 100644
index 0000000..97c4547
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEncodingAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:encoding}.
+ *
+ */
+public class DbEncodingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "encoding");
+	public static final String DEFAULT_VALUE = "utf-8";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:encoding}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbEncodingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:encoding}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:encoding}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:encoding} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEscapeProcessingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEscapeProcessingAttribute.java
new file mode 100644
index 0000000..8832b57
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbEscapeProcessingAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:escape-processing}.
+ *
+ */
+public class DbEscapeProcessingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "escape-processing");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:escape-processing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbEscapeProcessingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:escape-processing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:escape-processing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:escape-processing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbExtensionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbExtensionAttribute.java
new file mode 100644
index 0000000..851b718
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbExtensionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:extension}.
+ *
+ */
+public class DbExtensionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "extension");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:extension}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbExtensionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:extension}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:extension}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:extension} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbFieldAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbFieldAttribute.java
new file mode 100644
index 0000000..9d7f1a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbFieldAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:field}.
+ *
+ */
+public class DbFieldAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "field");
+	public static final String DEFAULT_VALUE = ";";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:field}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbFieldAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:field}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:field}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:field} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbHostnameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbHostnameAttribute.java
new file mode 100644
index 0000000..01a3023
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbHostnameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:hostname}.
+ *
+ */
+public class DbHostnameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "hostname");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:hostname}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbHostnameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:hostname}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:hostname}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:hostname} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIgnoreDriverPrivilegesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIgnoreDriverPrivilegesAttribute.java
new file mode 100644
index 0000000..64b282e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIgnoreDriverPrivilegesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:ignore-driver-privileges}.
+ *
+ */
+public class DbIgnoreDriverPrivilegesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "ignore-driver-privileges");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:ignore-driver-privileges}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIgnoreDriverPrivilegesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:ignore-driver-privileges}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:ignore-driver-privileges}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:ignore-driver-privileges} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsAscendingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsAscendingAttribute.java
new file mode 100644
index 0000000..9c5a4aa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsAscendingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-ascending}.
+ *
+ */
+public class DbIsAscendingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-ascending");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-ascending}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsAscendingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-ascending}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-ascending}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-ascending} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsAutoincrementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsAutoincrementAttribute.java
new file mode 100644
index 0000000..45cabae
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsAutoincrementAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-autoincrement}.
+ *
+ */
+public class DbIsAutoincrementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-autoincrement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-autoincrement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsAutoincrementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-autoincrement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-autoincrement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-autoincrement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsClusteredAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsClusteredAttribute.java
new file mode 100644
index 0000000..771162b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsClusteredAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-clustered}.
+ *
+ */
+public class DbIsClusteredAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-clustered");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-clustered}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsClusteredAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-clustered}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-clustered}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-clustered} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsEmptyAllowedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsEmptyAllowedAttribute.java
new file mode 100644
index 0000000..6fdb26a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsEmptyAllowedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-empty-allowed}.
+ *
+ */
+public class DbIsEmptyAllowedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-empty-allowed");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-empty-allowed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsEmptyAllowedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-empty-allowed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-empty-allowed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-empty-allowed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsFirstRowHeaderLineAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsFirstRowHeaderLineAttribute.java
new file mode 100644
index 0000000..efe7d52
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsFirstRowHeaderLineAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-first-row-header-line}.
+ *
+ */
+public class DbIsFirstRowHeaderLineAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-first-row-header-line");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-first-row-header-line}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsFirstRowHeaderLineAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-first-row-header-line}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-first-row-header-line}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-first-row-header-line} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsNullableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsNullableAttribute.java
new file mode 100644
index 0000000..7cd744b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsNullableAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-nullable}.
+ *
+ */
+public class DbIsNullableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-nullable");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-nullable}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsNullableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-nullable}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:is-nullable}.
+	 */
+	public enum Value {
+		NO_NULLS("no-nulls"), NULLABLE("nullable") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-nullable}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-nullable} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsPasswordRequiredAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsPasswordRequiredAttribute.java
new file mode 100644
index 0000000..5a08e3e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsPasswordRequiredAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-password-required}.
+ *
+ */
+public class DbIsPasswordRequiredAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-password-required");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-password-required}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsPasswordRequiredAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-password-required}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-password-required}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-password-required} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsTableNameLengthLimitedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsTableNameLengthLimitedAttribute.java
new file mode 100644
index 0000000..1c793ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsTableNameLengthLimitedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-table-name-length-limited}.
+ *
+ */
+public class DbIsTableNameLengthLimitedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-table-name-length-limited");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-table-name-length-limited}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsTableNameLengthLimitedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-table-name-length-limited}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-table-name-length-limited}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-table-name-length-limited} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsUniqueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsUniqueAttribute.java
new file mode 100644
index 0000000..ac31408
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbIsUniqueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:is-unique}.
+ *
+ */
+public class DbIsUniqueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "is-unique");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:is-unique}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbIsUniqueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:is-unique}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:is-unique}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:is-unique} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbLocalSocketAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbLocalSocketAttribute.java
new file mode 100644
index 0000000..45ab36a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbLocalSocketAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:local-socket}.
+ *
+ */
+public class DbLocalSocketAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "local-socket");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:local-socket}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbLocalSocketAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:local-socket}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:local-socket}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:local-socket} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbLoginTimeoutAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbLoginTimeoutAttribute.java
new file mode 100644
index 0000000..2f77cfc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbLoginTimeoutAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:login-timeout}.
+ *
+ */
+public class DbLoginTimeoutAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "login-timeout");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:login-timeout}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbLoginTimeoutAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:login-timeout}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:login-timeout}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:login-timeout} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbMaxRowCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbMaxRowCountAttribute.java
new file mode 100644
index 0000000..fc29d84
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbMaxRowCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:max-row-count}.
+ *
+ */
+public class DbMaxRowCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "max-row-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:max-row-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbMaxRowCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:max-row-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:max-row-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:max-row-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbMediaTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbMediaTypeAttribute.java
new file mode 100644
index 0000000..d393cc9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbMediaTypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:media-type}.
+ *
+ */
+public class DbMediaTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "media-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:media-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbMediaTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:media-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:media-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:media-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbNameAttribute.java
new file mode 100644
index 0000000..f43c89d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:name}.
+ *
+ */
+public class DbNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbParameterNameSubstitutionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbParameterNameSubstitutionAttribute.java
new file mode 100644
index 0000000..1e82114
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbParameterNameSubstitutionAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:parameter-name-substitution}.
+ *
+ */
+public class DbParameterNameSubstitutionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "parameter-name-substitution");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:parameter-name-substitution}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbParameterNameSubstitutionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:parameter-name-substitution}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:parameter-name-substitution}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:parameter-name-substitution} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbPortAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbPortAttribute.java
new file mode 100644
index 0000000..6a34912
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbPortAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:port}.
+ *
+ */
+public class DbPortAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "port");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:port}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbPortAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:port}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:port}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:port} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbPrecisionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbPrecisionAttribute.java
new file mode 100644
index 0000000..0136eea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbPrecisionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:precision}.
+ *
+ */
+public class DbPrecisionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "precision");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:precision}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbPrecisionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:precision}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:precision}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:precision} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbReferencedTableNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbReferencedTableNameAttribute.java
new file mode 100644
index 0000000..800b99a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbReferencedTableNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:referenced-table-name}.
+ *
+ */
+public class DbReferencedTableNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "referenced-table-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:referenced-table-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbReferencedTableNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:referenced-table-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:referenced-table-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:referenced-table-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbRelatedColumnNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbRelatedColumnNameAttribute.java
new file mode 100644
index 0000000..1a5bc0d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbRelatedColumnNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:related-column-name}.
+ *
+ */
+public class DbRelatedColumnNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "related-column-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:related-column-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbRelatedColumnNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:related-column-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:related-column-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:related-column-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbRowRetrievingStatementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbRowRetrievingStatementAttribute.java
new file mode 100644
index 0000000..ca05e1e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbRowRetrievingStatementAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:row-retrieving-statement}.
+ *
+ */
+public class DbRowRetrievingStatementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "row-retrieving-statement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:row-retrieving-statement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbRowRetrievingStatementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:row-retrieving-statement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:row-retrieving-statement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:row-retrieving-statement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbScaleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbScaleAttribute.java
new file mode 100644
index 0000000..b2007ba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbScaleAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:scale}.
+ *
+ */
+public class DbScaleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "scale");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:scale}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbScaleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:scale}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:scale}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:scale} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSchemaNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSchemaNameAttribute.java
new file mode 100644
index 0000000..f8b816c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSchemaNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:schema-name}.
+ *
+ */
+public class DbSchemaNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "schema-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:schema-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbSchemaNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:schema-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:schema-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:schema-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbShowDeletedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbShowDeletedAttribute.java
new file mode 100644
index 0000000..6d3199b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbShowDeletedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:show-deleted}.
+ *
+ */
+public class DbShowDeletedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "show-deleted");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:show-deleted}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbShowDeletedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:show-deleted}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:show-deleted}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:show-deleted} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbStringAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbStringAttribute.java
new file mode 100644
index 0000000..a6da6bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbStringAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:string}.
+ *
+ */
+public class DbStringAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "string");
+	public static final String DEFAULT_VALUE = ".";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:string}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbStringAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:string}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:string}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:string} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbStyleNameAttribute.java
new file mode 100644
index 0000000..e1415f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:style-name}.
+ *
+ */
+public class DbStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSuppressVersionColumnsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSuppressVersionColumnsAttribute.java
new file mode 100644
index 0000000..26f3b7a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSuppressVersionColumnsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:suppress-version-columns}.
+ *
+ */
+public class DbSuppressVersionColumnsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "suppress-version-columns");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:suppress-version-columns}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbSuppressVersionColumnsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:suppress-version-columns}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:suppress-version-columns}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:suppress-version-columns} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSystemDriverSettingsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSystemDriverSettingsAttribute.java
new file mode 100644
index 0000000..29a05e8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbSystemDriverSettingsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:system-driver-settings}.
+ *
+ */
+public class DbSystemDriverSettingsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "system-driver-settings");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:system-driver-settings}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbSystemDriverSettingsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:system-driver-settings}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:system-driver-settings}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:system-driver-settings} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbThousandAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbThousandAttribute.java
new file mode 100644
index 0000000..35272ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbThousandAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:thousand}.
+ *
+ */
+public class DbThousandAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "thousand");
+	public static final String DEFAULT_VALUE = ",";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:thousand}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbThousandAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:thousand}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:thousand}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:thousand} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTitleAttribute.java
new file mode 100644
index 0000000..ef59b4f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:title}.
+ *
+ */
+public class DbTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTypeAttribute.java
new file mode 100644
index 0000000..ea340fc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:type}.
+ *
+ */
+public class DbTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:type}.
+	 */
+	public enum Value {
+		FOREIGN("foreign"), PRIMARY("primary"), UNIQUE("unique") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTypeNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTypeNameAttribute.java
new file mode 100644
index 0000000..9498f9d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbTypeNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:type-name}.
+ *
+ */
+public class DbTypeNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "type-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:type-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbTypeNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:type-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:type-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:type-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUpdateRuleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUpdateRuleAttribute.java
new file mode 100644
index 0000000..8e8cc31
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUpdateRuleAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:update-rule}.
+ *
+ */
+public class DbUpdateRuleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "update-rule");
+	public static final String DEFAULT_VALUE = "no-action";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:update-rule}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbUpdateRuleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:update-rule}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute db:update-rule}.
+	 */
+	public enum Value {
+		CASCADE("cascade"), NO_ACTION("no-action"), RESTRICT("restrict"), SET_DEFAULT("set-default"), SET_NULL("set-null") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:update-rule}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:update-rule} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUseCatalogAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUseCatalogAttribute.java
new file mode 100644
index 0000000..8793d03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUseCatalogAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:use-catalog}.
+ *
+ */
+public class DbUseCatalogAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "use-catalog");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:use-catalog}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbUseCatalogAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:use-catalog}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:use-catalog}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:use-catalog} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUseSystemUserAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUseSystemUserAttribute.java
new file mode 100644
index 0000000..eaca5d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUseSystemUserAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:use-system-user}.
+ *
+ */
+public class DbUseSystemUserAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "use-system-user");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:use-system-user}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbUseSystemUserAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:use-system-user}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:use-system-user}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:use-system-user} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUserNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUserNameAttribute.java
new file mode 100644
index 0000000..6f007e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbUserNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:user-name}.
+ *
+ */
+public class DbUserNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "user-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:user-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbUserNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:user-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:user-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:user-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbVisibleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbVisibleAttribute.java
new file mode 100644
index 0000000..4b15329
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/db/DbVisibleAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.db;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute db:visible}.
+ *
+ */
+public class DbVisibleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DB, "visible");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute db:visible}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DbVisibleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute db:visible}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute db:visible}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute db:visible} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dAmbientColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dAmbientColorAttribute.java
new file mode 100644
index 0000000..5d6954e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dAmbientColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:ambient-color}.
+ *
+ */
+public class Dr3dAmbientColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "ambient-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:ambient-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dAmbientColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:ambient-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:ambient-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:ambient-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dBackScaleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dBackScaleAttribute.java
new file mode 100644
index 0000000..92c94df
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dBackScaleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:back-scale}.
+ *
+ */
+public class Dr3dBackScaleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "back-scale");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:back-scale}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dBackScaleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:back-scale}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:back-scale}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:back-scale} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dBackfaceCullingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dBackfaceCullingAttribute.java
new file mode 100644
index 0000000..f738a02
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dBackfaceCullingAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:backface-culling}.
+ *
+ */
+public class Dr3dBackfaceCullingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "backface-culling");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:backface-culling}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dBackfaceCullingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:backface-culling}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:backface-culling}.
+	 */
+	public enum Value {
+		DISABLED("disabled"), ENABLED("enabled") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:backface-culling}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:backface-culling} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCenterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCenterAttribute.java
new file mode 100644
index 0000000..84509d1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCenterAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:center}.
+ *
+ */
+public class Dr3dCenterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "center");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:center}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dCenterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:center}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:center}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:center} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCloseBackAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCloseBackAttribute.java
new file mode 100644
index 0000000..5819b98
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCloseBackAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:close-back}.
+ *
+ */
+public class Dr3dCloseBackAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "close-back");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:close-back}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dCloseBackAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:close-back}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:close-back}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:close-back} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCloseFrontAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCloseFrontAttribute.java
new file mode 100644
index 0000000..0976eee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dCloseFrontAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:close-front}.
+ *
+ */
+public class Dr3dCloseFrontAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "close-front");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:close-front}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dCloseFrontAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:close-front}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:close-front}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:close-front} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDepthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDepthAttribute.java
new file mode 100644
index 0000000..3cda5e5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDepthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:depth}.
+ *
+ */
+public class Dr3dDepthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "depth");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:depth}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dDepthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:depth}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:depth}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:depth} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDiffuseColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDiffuseColorAttribute.java
new file mode 100644
index 0000000..e2be3f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDiffuseColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:diffuse-color}.
+ *
+ */
+public class Dr3dDiffuseColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "diffuse-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:diffuse-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dDiffuseColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:diffuse-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:diffuse-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:diffuse-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDirectionAttribute.java
new file mode 100644
index 0000000..7801893
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDirectionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:direction}.
+ *
+ */
+public class Dr3dDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDistanceAttribute.java
new file mode 100644
index 0000000..1da6537
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dDistanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:distance}.
+ *
+ */
+public class Dr3dDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "distance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEdgeRoundingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEdgeRoundingAttribute.java
new file mode 100644
index 0000000..ca46d92
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEdgeRoundingAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:edge-rounding}.
+ *
+ */
+public class Dr3dEdgeRoundingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "edge-rounding");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:edge-rounding}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dEdgeRoundingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:edge-rounding}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:edge-rounding}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:edge-rounding} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEdgeRoundingModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEdgeRoundingModeAttribute.java
new file mode 100644
index 0000000..b5ea4e9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEdgeRoundingModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:edge-rounding-mode}.
+ *
+ */
+public class Dr3dEdgeRoundingModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "edge-rounding-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:edge-rounding-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dEdgeRoundingModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:edge-rounding-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:edge-rounding-mode}.
+	 */
+	public enum Value {
+		ATTRACTIVE("attractive"), CORRECT("correct") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:edge-rounding-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:edge-rounding-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEmissiveColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEmissiveColorAttribute.java
new file mode 100644
index 0000000..5017071
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEmissiveColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:emissive-color}.
+ *
+ */
+public class Dr3dEmissiveColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "emissive-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:emissive-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dEmissiveColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:emissive-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:emissive-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:emissive-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEnabledAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEnabledAttribute.java
new file mode 100644
index 0000000..49b6d9a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEnabledAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:enabled}.
+ *
+ */
+public class Dr3dEnabledAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "enabled");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:enabled}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dEnabledAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:enabled}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:enabled}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:enabled} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEndAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEndAngleAttribute.java
new file mode 100644
index 0000000..c7f8450
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dEndAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:end-angle}.
+ *
+ */
+public class Dr3dEndAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "end-angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:end-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dEndAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:end-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:end-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:end-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dFocalLengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dFocalLengthAttribute.java
new file mode 100644
index 0000000..b82eb4a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dFocalLengthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:focal-length}.
+ *
+ */
+public class Dr3dFocalLengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "focal-length");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:focal-length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dFocalLengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:focal-length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:focal-length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:focal-length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dHorizontalSegmentsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dHorizontalSegmentsAttribute.java
new file mode 100644
index 0000000..2ca7a80
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dHorizontalSegmentsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:horizontal-segments}.
+ *
+ */
+public class Dr3dHorizontalSegmentsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "horizontal-segments");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:horizontal-segments}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dHorizontalSegmentsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:horizontal-segments}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:horizontal-segments}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:horizontal-segments} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dLightingModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dLightingModeAttribute.java
new file mode 100644
index 0000000..4011d3c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dLightingModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:lighting-mode}.
+ *
+ */
+public class Dr3dLightingModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "lighting-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:lighting-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dLightingModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:lighting-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:lighting-mode}.
+	 */
+	public enum Value {
+		DOUBLE_SIDED("double-sided"), FALSE("false"), STANDARD("standard"), TRUE("true") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:lighting-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:lighting-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dMaxEdgeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dMaxEdgeAttribute.java
new file mode 100644
index 0000000..49e94bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dMaxEdgeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:max-edge}.
+ *
+ */
+public class Dr3dMaxEdgeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "max-edge");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:max-edge}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dMaxEdgeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:max-edge}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:max-edge}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:max-edge} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dMinEdgeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dMinEdgeAttribute.java
new file mode 100644
index 0000000..0789c30
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dMinEdgeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:min-edge}.
+ *
+ */
+public class Dr3dMinEdgeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "min-edge");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:min-edge}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dMinEdgeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:min-edge}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:min-edge}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:min-edge} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dNormalsDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dNormalsDirectionAttribute.java
new file mode 100644
index 0000000..c70cfe1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dNormalsDirectionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:normals-direction}.
+ *
+ */
+public class Dr3dNormalsDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "normals-direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:normals-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dNormalsDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:normals-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:normals-direction}.
+	 */
+	public enum Value {
+		INVERSE("inverse"), NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:normals-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:normals-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dNormalsKindAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dNormalsKindAttribute.java
new file mode 100644
index 0000000..59b82d3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dNormalsKindAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:normals-kind}.
+ *
+ */
+public class Dr3dNormalsKindAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "normals-kind");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:normals-kind}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dNormalsKindAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:normals-kind}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:normals-kind}.
+	 */
+	public enum Value {
+		FLAT("flat"), OBJECT("object"), SPHERE("sphere") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:normals-kind}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:normals-kind} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dProjectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dProjectionAttribute.java
new file mode 100644
index 0000000..fed482c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dProjectionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:projection}.
+ *
+ */
+public class Dr3dProjectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "projection");
+	public static final String DEFAULT_VALUE = "parallel";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:projection}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dProjectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:projection}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:projection}.
+	 */
+	public enum Value {
+		PARALLEL("parallel"), PERSPECTIVE("perspective") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:projection}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:projection} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadeModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadeModeAttribute.java
new file mode 100644
index 0000000..29f963a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadeModeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:shade-mode}.
+ *
+ */
+public class Dr3dShadeModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "shade-mode");
+	public static final String DEFAULT_VALUE = "flat";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:shade-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dShadeModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:shade-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:shade-mode}.
+	 */
+	public enum Value {
+		DRAFT("draft"), FLAT("flat"), GOURAUD("gouraud"), PHONG("phong") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:shade-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:shade-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadowAttribute.java
new file mode 100644
index 0000000..c4efb75
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadowAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:shadow}.
+ *
+ */
+public class Dr3dShadowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "shadow");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:shadow}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dShadowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:shadow}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:shadow}.
+	 */
+	public enum Value {
+		HIDDEN("hidden"), VISIBLE("visible") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:shadow}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:shadow} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadowSlantAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadowSlantAttribute.java
new file mode 100644
index 0000000..cf01e7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShadowSlantAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:shadow-slant}.
+ *
+ */
+public class Dr3dShadowSlantAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "shadow-slant");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:shadow-slant}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dShadowSlantAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:shadow-slant}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:shadow-slant}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:shadow-slant} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShininessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShininessAttribute.java
new file mode 100644
index 0000000..c578776
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dShininessAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:shininess}.
+ *
+ */
+public class Dr3dShininessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "shininess");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:shininess}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dShininessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:shininess}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:shininess}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:shininess} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSizeAttribute.java
new file mode 100644
index 0000000..31600cc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSizeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:size}.
+ *
+ */
+public class Dr3dSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSpecularAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSpecularAttribute.java
new file mode 100644
index 0000000..2ab557f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSpecularAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:specular}.
+ *
+ */
+public class Dr3dSpecularAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "specular");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:specular}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dSpecularAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:specular}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:specular}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:specular} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSpecularColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSpecularColorAttribute.java
new file mode 100644
index 0000000..65b28cd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dSpecularColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:specular-color}.
+ *
+ */
+public class Dr3dSpecularColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "specular-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:specular-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dSpecularColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:specular-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:specular-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:specular-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureFilterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureFilterAttribute.java
new file mode 100644
index 0000000..4c35ca1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureFilterAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:texture-filter}.
+ *
+ */
+public class Dr3dTextureFilterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "texture-filter");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:texture-filter}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dTextureFilterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:texture-filter}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:texture-filter}.
+	 */
+	public enum Value {
+		DISABLED("disabled"), ENABLED("enabled") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:texture-filter}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:texture-filter} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureGenerationModeXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureGenerationModeXAttribute.java
new file mode 100644
index 0000000..bc1a201
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureGenerationModeXAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:texture-generation-mode-x}.
+ *
+ */
+public class Dr3dTextureGenerationModeXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "texture-generation-mode-x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:texture-generation-mode-x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dTextureGenerationModeXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:texture-generation-mode-x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:texture-generation-mode-x}.
+	 */
+	public enum Value {
+		OBJECT("object"), PARALLEL("parallel"), SPHERE("sphere") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:texture-generation-mode-x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:texture-generation-mode-x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureGenerationModeYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureGenerationModeYAttribute.java
new file mode 100644
index 0000000..621281a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureGenerationModeYAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:texture-generation-mode-y}.
+ *
+ */
+public class Dr3dTextureGenerationModeYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "texture-generation-mode-y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:texture-generation-mode-y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dTextureGenerationModeYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:texture-generation-mode-y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:texture-generation-mode-y}.
+	 */
+	public enum Value {
+		OBJECT("object"), PARALLEL("parallel"), SPHERE("sphere") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:texture-generation-mode-y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:texture-generation-mode-y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureKindAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureKindAttribute.java
new file mode 100644
index 0000000..90a3567
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureKindAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:texture-kind}.
+ *
+ */
+public class Dr3dTextureKindAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "texture-kind");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:texture-kind}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dTextureKindAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:texture-kind}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:texture-kind}.
+	 */
+	public enum Value {
+		COLOR("color"), INTENSITY("intensity"), LUMINANCE("luminance") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:texture-kind}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:texture-kind} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureModeAttribute.java
new file mode 100644
index 0000000..a42494b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTextureModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:texture-mode}.
+ *
+ */
+public class Dr3dTextureModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "texture-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:texture-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dTextureModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:texture-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dr3d:texture-mode}.
+	 */
+	public enum Value {
+		BLEND("blend"), MODULATE("modulate"), REPLACE("replace") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:texture-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:texture-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTransformAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTransformAttribute.java
new file mode 100644
index 0000000..af8ec91
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dTransformAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:transform}.
+ *
+ */
+public class Dr3dTransformAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "transform");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:transform}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dTransformAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:transform}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:transform}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:transform} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVerticalSegmentsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVerticalSegmentsAttribute.java
new file mode 100644
index 0000000..922340f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVerticalSegmentsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:vertical-segments}.
+ *
+ */
+public class Dr3dVerticalSegmentsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "vertical-segments");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:vertical-segments}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dVerticalSegmentsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:vertical-segments}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:vertical-segments}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:vertical-segments} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVpnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVpnAttribute.java
new file mode 100644
index 0000000..0192285
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVpnAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:vpn}.
+ *
+ */
+public class Dr3dVpnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "vpn");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:vpn}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dVpnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:vpn}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:vpn}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:vpn} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVrpAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVrpAttribute.java
new file mode 100644
index 0000000..1483f66
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVrpAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:vrp}.
+ *
+ */
+public class Dr3dVrpAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "vrp");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:vrp}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dVrpAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:vrp}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:vrp}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:vrp} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVupAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVupAttribute.java
new file mode 100644
index 0000000..4194f77
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/dr3d/Dr3dVupAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.dr3d;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dr3d:vup}.
+ *
+ */
+public class Dr3dVupAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "vup");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dr3d:vup}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dVupAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dr3d:vup}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dr3d:vup}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dr3d:vup} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAlignAttribute.java
new file mode 100644
index 0000000..2db4cdb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:align}.
+ *
+ */
+public class DrawAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:align}.
+	 */
+	public enum Value {
+		BOTTOM_LEFT("bottom-left"), BOTTOM_RIGHT("bottom-right"), CENTER("center"), LEFT("left"), RIGHT("right"), TOP("top"), TOP_LEFT("top-left"), TOP_RIGHT("top-right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAngleAttribute.java
new file mode 100644
index 0000000..c1f943f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:angle}.
+ *
+ */
+public class DrawAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawArchiveAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawArchiveAttribute.java
new file mode 100644
index 0000000..41cada5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawArchiveAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:archive}.
+ *
+ */
+public class DrawArchiveAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "archive");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:archive}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawArchiveAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:archive}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:archive}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:archive} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAutoGrowHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAutoGrowHeightAttribute.java
new file mode 100644
index 0000000..bd4c391
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAutoGrowHeightAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:auto-grow-height}.
+ *
+ */
+public class DrawAutoGrowHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "auto-grow-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:auto-grow-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawAutoGrowHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:auto-grow-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:auto-grow-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:auto-grow-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAutoGrowWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAutoGrowWidthAttribute.java
new file mode 100644
index 0000000..efe10ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawAutoGrowWidthAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:auto-grow-width}.
+ *
+ */
+public class DrawAutoGrowWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "auto-grow-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:auto-grow-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawAutoGrowWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:auto-grow-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:auto-grow-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:auto-grow-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBackgroundSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBackgroundSizeAttribute.java
new file mode 100644
index 0000000..4cec987
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBackgroundSizeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:background-size}.
+ *
+ */
+public class DrawBackgroundSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "background-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:background-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawBackgroundSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:background-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:background-size}.
+	 */
+	public enum Value {
+		BORDER("border"), FULL("full") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:background-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:background-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBlueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBlueAttribute.java
new file mode 100644
index 0000000..8969351
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBlueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:blue}.
+ *
+ */
+public class DrawBlueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "blue");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:blue}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawBlueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:blue}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:blue}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:blue} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBorderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBorderAttribute.java
new file mode 100644
index 0000000..1f17a37
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawBorderAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:border}.
+ *
+ */
+public class DrawBorderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "border");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:border}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawBorderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:border}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:border}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:border} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionAngleAttribute.java
new file mode 100644
index 0000000..5470746
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-angle}.
+ *
+ */
+public class DrawCaptionAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionAngleTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionAngleTypeAttribute.java
new file mode 100644
index 0000000..6032f39
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionAngleTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-angle-type}.
+ *
+ */
+public class DrawCaptionAngleTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-angle-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-angle-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionAngleTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-angle-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:caption-angle-type}.
+	 */
+	public enum Value {
+		FIXED("fixed"), FREE("free") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-angle-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-angle-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionEscapeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionEscapeAttribute.java
new file mode 100644
index 0000000..f389dbe
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionEscapeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-escape}.
+ *
+ */
+public class DrawCaptionEscapeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-escape");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-escape}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionEscapeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-escape}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-escape}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-escape} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionEscapeDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionEscapeDirectionAttribute.java
new file mode 100644
index 0000000..11214c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionEscapeDirectionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-escape-direction}.
+ *
+ */
+public class DrawCaptionEscapeDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-escape-direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-escape-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionEscapeDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-escape-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:caption-escape-direction}.
+	 */
+	public enum Value {
+		AUTO("auto"), HORIZONTAL("horizontal"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-escape-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-escape-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionFitLineLengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionFitLineLengthAttribute.java
new file mode 100644
index 0000000..cf20a57
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionFitLineLengthAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-fit-line-length}.
+ *
+ */
+public class DrawCaptionFitLineLengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-fit-line-length");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-fit-line-length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionFitLineLengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-fit-line-length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-fit-line-length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-fit-line-length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionGapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionGapAttribute.java
new file mode 100644
index 0000000..f58324d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionGapAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-gap}.
+ *
+ */
+public class DrawCaptionGapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-gap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-gap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionGapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-gap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-gap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-gap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionIdAttribute.java
new file mode 100644
index 0000000..e64504f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-id}.
+ *
+ */
+public class DrawCaptionIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionLineLengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionLineLengthAttribute.java
new file mode 100644
index 0000000..7d9b3bd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionLineLengthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-line-length}.
+ *
+ */
+public class DrawCaptionLineLengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-line-length");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-line-length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionLineLengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-line-length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-line-length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-line-length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionPointXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionPointXAttribute.java
new file mode 100644
index 0000000..c84084f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionPointXAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-point-x}.
+ *
+ */
+public class DrawCaptionPointXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-point-x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-point-x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionPointXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-point-x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-point-x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-point-x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionPointYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionPointYAttribute.java
new file mode 100644
index 0000000..9004276
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionPointYAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-point-y}.
+ *
+ */
+public class DrawCaptionPointYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-point-y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-point-y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionPointYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-point-y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-point-y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-point-y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionTypeAttribute.java
new file mode 100644
index 0000000..95ddbf7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCaptionTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:caption-type}.
+ *
+ */
+public class DrawCaptionTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:caption-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:caption-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:caption-type}.
+	 */
+	public enum Value {
+		ANGLED_CONNECTOR_LINE("angled-connector-line"), ANGLED_LINE("angled-line"), STRAIGHT_LINE("straight-line") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:caption-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:caption-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawChainNextNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawChainNextNameAttribute.java
new file mode 100644
index 0000000..900833c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawChainNextNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:chain-next-name}.
+ *
+ */
+public class DrawChainNextNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "chain-next-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:chain-next-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawChainNextNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:chain-next-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:chain-next-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:chain-next-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawClassIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawClassIdAttribute.java
new file mode 100644
index 0000000..fb61b65
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawClassIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:class-id}.
+ *
+ */
+public class DrawClassIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "class-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:class-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawClassIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:class-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:class-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:class-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawClassNamesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawClassNamesAttribute.java
new file mode 100644
index 0000000..7864138
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawClassNamesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:class-names}.
+ *
+ */
+public class DrawClassNamesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "class-names");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:class-names}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawClassNamesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:class-names}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:class-names}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:class-names} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCodeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCodeAttribute.java
new file mode 100644
index 0000000..c4798c9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCodeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:code}.
+ *
+ */
+public class DrawCodeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "code");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:code}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCodeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:code}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:code}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:code} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorAttribute.java
new file mode 100644
index 0000000..93f3f59
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:color}.
+ *
+ */
+public class DrawColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorInversionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorInversionAttribute.java
new file mode 100644
index 0000000..8d0a47b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorInversionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:color-inversion}.
+ *
+ */
+public class DrawColorInversionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "color-inversion");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:color-inversion}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawColorInversionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:color-inversion}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:color-inversion}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:color-inversion} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorModeAttribute.java
new file mode 100644
index 0000000..97a7470
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawColorModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:color-mode}.
+ *
+ */
+public class DrawColorModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "color-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:color-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawColorModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:color-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:color-mode}.
+	 */
+	public enum Value {
+		GREYSCALE("greyscale"), MONO("mono"), STANDARD("standard"), WATERMARK("watermark") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:color-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:color-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawConcaveAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawConcaveAttribute.java
new file mode 100644
index 0000000..de1d401
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawConcaveAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:concave}.
+ *
+ */
+public class DrawConcaveAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "concave");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:concave}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawConcaveAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:concave}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:concave}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:concave} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawConcentricGradientFillAllowedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawConcentricGradientFillAllowedAttribute.java
new file mode 100644
index 0000000..2bde9a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawConcentricGradientFillAllowedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:concentric-gradient-fill-allowed}.
+ *
+ */
+public class DrawConcentricGradientFillAllowedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "concentric-gradient-fill-allowed");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:concentric-gradient-fill-allowed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawConcentricGradientFillAllowedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:concentric-gradient-fill-allowed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:concentric-gradient-fill-allowed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:concentric-gradient-fill-allowed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawContrastAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawContrastAttribute.java
new file mode 100644
index 0000000..f3389a7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawContrastAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:contrast}.
+ *
+ */
+public class DrawContrastAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "contrast");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:contrast}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawContrastAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:contrast}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:contrast}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:contrast} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawControlAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawControlAttribute.java
new file mode 100644
index 0000000..1c3e4f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawControlAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:control}.
+ *
+ */
+public class DrawControlAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "control");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:control}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawControlAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:control}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:control}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:control} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCopyOfAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCopyOfAttribute.java
new file mode 100644
index 0000000..7f6f929
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCopyOfAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:copy-of}.
+ *
+ */
+public class DrawCopyOfAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "copy-of");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:copy-of}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCopyOfAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:copy-of}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:copy-of}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:copy-of} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCornerRadiusAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCornerRadiusAttribute.java
new file mode 100644
index 0000000..b734d41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCornerRadiusAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:corner-radius}.
+ *
+ */
+public class DrawCornerRadiusAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "corner-radius");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:corner-radius}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCornerRadiusAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:corner-radius}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:corner-radius}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:corner-radius} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCornersAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCornersAttribute.java
new file mode 100644
index 0000000..0c1d8e2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCornersAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:corners}.
+ *
+ */
+public class DrawCornersAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "corners");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:corners}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCornersAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:corners}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:corners}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:corners} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCxAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCxAttribute.java
new file mode 100644
index 0000000..c5aeed5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCxAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:cx}.
+ *
+ */
+public class DrawCxAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "cx");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:cx}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCxAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:cx}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:cx}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:cx} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCyAttribute.java
new file mode 100644
index 0000000..fc8aa9f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawCyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:cy}.
+ *
+ */
+public class DrawCyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "cy");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:cy}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawCyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:cy}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:cy}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:cy} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDataAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDataAttribute.java
new file mode 100644
index 0000000..d610e72
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDataAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:data}.
+ *
+ */
+public class DrawDataAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "data");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:data}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDataAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:data}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:data}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:data} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDecimalPlacesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDecimalPlacesAttribute.java
new file mode 100644
index 0000000..c823de9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDecimalPlacesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:decimal-places}.
+ *
+ */
+public class DrawDecimalPlacesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "decimal-places");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:decimal-places}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDecimalPlacesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:decimal-places}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:decimal-places}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:decimal-places} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDisplayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDisplayAttribute.java
new file mode 100644
index 0000000..747311f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDisplayAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:display}.
+ *
+ */
+public class DrawDisplayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "display");
+	public static final String DEFAULT_VALUE = "always";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:display}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDisplayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:display}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:display}.
+	 */
+	public enum Value {
+		ALWAYS("always"), NONE("none"), PRINTER("printer"), SCREEN("screen") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:display}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:display} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDisplayNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDisplayNameAttribute.java
new file mode 100644
index 0000000..2a8094b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDisplayNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:display-name}.
+ *
+ */
+public class DrawDisplayNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "display-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:display-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDisplayNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:display-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:display-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:display-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDistanceAttribute.java
new file mode 100644
index 0000000..fd657d1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDistanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:distance}.
+ *
+ */
+public class DrawDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "distance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots1Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots1Attribute.java
new file mode 100644
index 0000000..4d11ce9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots1Attribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:dots1}.
+ *
+ */
+public class DrawDots1Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "dots1");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:dots1}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDots1Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:dots1}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:dots1}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:dots1} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots1LengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots1LengthAttribute.java
new file mode 100644
index 0000000..f81872a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots1LengthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:dots1-length}.
+ *
+ */
+public class DrawDots1LengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "dots1-length");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:dots1-length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDots1LengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:dots1-length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:dots1-length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:dots1-length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots2Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots2Attribute.java
new file mode 100644
index 0000000..bf0a987
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots2Attribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:dots2}.
+ *
+ */
+public class DrawDots2Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "dots2");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:dots2}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDots2Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:dots2}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:dots2}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:dots2} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots2LengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots2LengthAttribute.java
new file mode 100644
index 0000000..d883813
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDots2LengthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:dots2-length}.
+ *
+ */
+public class DrawDots2LengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "dots2-length");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:dots2-length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDots2LengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:dots2-length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:dots2-length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:dots2-length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDrawAspectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDrawAspectAttribute.java
new file mode 100644
index 0000000..e0f24e4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawDrawAspectAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:draw-aspect}.
+ *
+ */
+public class DrawDrawAspectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "draw-aspect");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:draw-aspect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawDrawAspectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:draw-aspect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:draw-aspect}.
+	 */
+	public enum Value {
+		CONTENT("content"), ICON("icon"), PRINT_VIEW("print-view"), THUMBNAIL("thumbnail") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:draw-aspect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:draw-aspect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndAngleAttribute.java
new file mode 100644
index 0000000..0ae80e5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-angle}.
+ *
+ */
+public class DrawEndAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndAttribute.java
new file mode 100644
index 0000000..e507d97
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end}.
+ *
+ */
+public class DrawEndAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndColorAttribute.java
new file mode 100644
index 0000000..fd3d6ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-color}.
+ *
+ */
+public class DrawEndColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndGluePointAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndGluePointAttribute.java
new file mode 100644
index 0000000..3b2d9a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndGluePointAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-glue-point}.
+ *
+ */
+public class DrawEndGluePointAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-glue-point");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-glue-point}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndGluePointAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-glue-point}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-glue-point}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-glue-point} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndGuideAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndGuideAttribute.java
new file mode 100644
index 0000000..132d7b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndGuideAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-guide}.
+ *
+ */
+public class DrawEndGuideAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-guide");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-guide}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndGuideAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-guide}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-guide}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-guide} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndIntensityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndIntensityAttribute.java
new file mode 100644
index 0000000..2453d52
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndIntensityAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-intensity}.
+ *
+ */
+public class DrawEndIntensityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-intensity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-intensity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndIntensityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-intensity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-intensity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-intensity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndLineSpacingHorizontalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndLineSpacingHorizontalAttribute.java
new file mode 100644
index 0000000..4636615
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndLineSpacingHorizontalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-line-spacing-horizontal}.
+ *
+ */
+public class DrawEndLineSpacingHorizontalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-line-spacing-horizontal");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-line-spacing-horizontal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndLineSpacingHorizontalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-line-spacing-horizontal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-line-spacing-horizontal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-line-spacing-horizontal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndLineSpacingVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndLineSpacingVerticalAttribute.java
new file mode 100644
index 0000000..02691d4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndLineSpacingVerticalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-line-spacing-vertical}.
+ *
+ */
+public class DrawEndLineSpacingVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-line-spacing-vertical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-line-spacing-vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndLineSpacingVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-line-spacing-vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-line-spacing-vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-line-spacing-vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndShapeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndShapeAttribute.java
new file mode 100644
index 0000000..9aaaa0b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEndShapeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:end-shape}.
+ *
+ */
+public class DrawEndShapeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "end-shape");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:end-shape}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEndShapeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:end-shape}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:end-shape}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:end-shape} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEngineAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEngineAttribute.java
new file mode 100644
index 0000000..d70b642
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEngineAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:engine}.
+ *
+ */
+public class DrawEngineAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "engine");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:engine}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEngineAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:engine}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:engine}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:engine} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEnhancedPathAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEnhancedPathAttribute.java
new file mode 100644
index 0000000..4078226
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEnhancedPathAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:enhanced-path}.
+ *
+ */
+public class DrawEnhancedPathAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "enhanced-path");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:enhanced-path}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEnhancedPathAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:enhanced-path}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:enhanced-path}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:enhanced-path} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEscapeDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEscapeDirectionAttribute.java
new file mode 100644
index 0000000..e97d8f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawEscapeDirectionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:escape-direction}.
+ *
+ */
+public class DrawEscapeDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "escape-direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:escape-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawEscapeDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:escape-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:escape-direction}.
+	 */
+	public enum Value {
+		AUTO("auto"), DOWN("down"), HORIZONTAL("horizontal"), LEFT("left"), RIGHT("right"), UP("up"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:escape-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:escape-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionAllowedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionAllowedAttribute.java
new file mode 100644
index 0000000..a4eb3d0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionAllowedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-allowed}.
+ *
+ */
+public class DrawExtrusionAllowedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-allowed");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-allowed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionAllowedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-allowed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-allowed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-allowed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionAttribute.java
new file mode 100644
index 0000000..aee9026
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion}.
+ *
+ */
+public class DrawExtrusionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionBrightnessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionBrightnessAttribute.java
new file mode 100644
index 0000000..6892e16
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionBrightnessAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-brightness}.
+ *
+ */
+public class DrawExtrusionBrightnessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-brightness");
+	public static final String DEFAULT_VALUE = "33%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-brightness}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionBrightnessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-brightness}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-brightness}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-brightness} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionColorAttribute.java
new file mode 100644
index 0000000..66143d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionColorAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-color}.
+ *
+ */
+public class DrawExtrusionColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-color");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionDepthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionDepthAttribute.java
new file mode 100644
index 0000000..f638ad4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionDepthAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-depth}.
+ *
+ */
+public class DrawExtrusionDepthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-depth");
+	public static final String DEFAULT_VALUE = "36pt 0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-depth}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionDepthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-depth}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-depth}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-depth} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionDiffusionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionDiffusionAttribute.java
new file mode 100644
index 0000000..7a31905
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionDiffusionAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-diffusion}.
+ *
+ */
+public class DrawExtrusionDiffusionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-diffusion");
+	public static final String DEFAULT_VALUE = "0%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-diffusion}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionDiffusionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-diffusion}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-diffusion}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-diffusion} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightDirectionAttribute.java
new file mode 100644
index 0000000..77aedc6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightDirectionAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-first-light-direction}.
+ *
+ */
+public class DrawExtrusionFirstLightDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-first-light-direction");
+	public static final String DEFAULT_VALUE = "(5 0 1)";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-first-light-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionFirstLightDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-first-light-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-first-light-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-first-light-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightHarshAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightHarshAttribute.java
new file mode 100644
index 0000000..72a2e49
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightHarshAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-first-light-harsh}.
+ *
+ */
+public class DrawExtrusionFirstLightHarshAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-first-light-harsh");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-first-light-harsh}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionFirstLightHarshAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-first-light-harsh}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-first-light-harsh}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-first-light-harsh} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightLevelAttribute.java
new file mode 100644
index 0000000..d342a27
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionFirstLightLevelAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-first-light-level}.
+ *
+ */
+public class DrawExtrusionFirstLightLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-first-light-level");
+	public static final String DEFAULT_VALUE = "66%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-first-light-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionFirstLightLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-first-light-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-first-light-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-first-light-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionLightFaceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionLightFaceAttribute.java
new file mode 100644
index 0000000..6b2ad21
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionLightFaceAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-light-face}.
+ *
+ */
+public class DrawExtrusionLightFaceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-light-face");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-light-face}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionLightFaceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-light-face}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-light-face}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-light-face} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionMetalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionMetalAttribute.java
new file mode 100644
index 0000000..99fc8f9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionMetalAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-metal}.
+ *
+ */
+public class DrawExtrusionMetalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-metal");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-metal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionMetalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-metal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-metal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-metal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionNumberOfLineSegmentsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionNumberOfLineSegmentsAttribute.java
new file mode 100644
index 0000000..c901b49
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionNumberOfLineSegmentsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-number-of-line-segments}.
+ *
+ */
+public class DrawExtrusionNumberOfLineSegmentsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-number-of-line-segments");
+	public static final String DEFAULT_VALUE = "30";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-number-of-line-segments}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionNumberOfLineSegmentsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-number-of-line-segments}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-number-of-line-segments}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-number-of-line-segments} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionOriginAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionOriginAttribute.java
new file mode 100644
index 0000000..7661d07
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionOriginAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-origin}.
+ *
+ */
+public class DrawExtrusionOriginAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-origin");
+	public static final String DEFAULT_VALUE = "0.5 -0.5";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-origin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionOriginAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-origin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-origin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-origin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionRotationAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionRotationAngleAttribute.java
new file mode 100644
index 0000000..bf64553
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionRotationAngleAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-rotation-angle}.
+ *
+ */
+public class DrawExtrusionRotationAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-rotation-angle");
+	public static final String DEFAULT_VALUE = "0 0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-rotation-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionRotationAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-rotation-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-rotation-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-rotation-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionRotationCenterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionRotationCenterAttribute.java
new file mode 100644
index 0000000..1b1245a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionRotationCenterAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-rotation-center}.
+ *
+ */
+public class DrawExtrusionRotationCenterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-rotation-center");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-rotation-center}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionRotationCenterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-rotation-center}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-rotation-center}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-rotation-center} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightDirectionAttribute.java
new file mode 100644
index 0000000..c2b2bd1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightDirectionAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-second-light-direction}.
+ *
+ */
+public class DrawExtrusionSecondLightDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-second-light-direction");
+	public static final String DEFAULT_VALUE = "(-5 0 1)";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-second-light-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionSecondLightDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-second-light-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-second-light-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-second-light-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightHarshAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightHarshAttribute.java
new file mode 100644
index 0000000..ec33cc2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightHarshAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-second-light-harsh}.
+ *
+ */
+public class DrawExtrusionSecondLightHarshAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-second-light-harsh");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-second-light-harsh}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionSecondLightHarshAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-second-light-harsh}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-second-light-harsh}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-second-light-harsh} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightLevelAttribute.java
new file mode 100644
index 0000000..4757c85
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSecondLightLevelAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-second-light-level}.
+ *
+ */
+public class DrawExtrusionSecondLightLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-second-light-level");
+	public static final String DEFAULT_VALUE = "66%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-second-light-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionSecondLightLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-second-light-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-second-light-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-second-light-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionShininessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionShininessAttribute.java
new file mode 100644
index 0000000..3e53385
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionShininessAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-shininess}.
+ *
+ */
+public class DrawExtrusionShininessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-shininess");
+	public static final String DEFAULT_VALUE = "50%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-shininess}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionShininessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-shininess}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-shininess}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-shininess} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSkewAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSkewAttribute.java
new file mode 100644
index 0000000..01123d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSkewAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-skew}.
+ *
+ */
+public class DrawExtrusionSkewAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-skew");
+	public static final String DEFAULT_VALUE = "50 45";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-skew}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionSkewAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-skew}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-skew}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-skew} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSpecularityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSpecularityAttribute.java
new file mode 100644
index 0000000..97315b3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionSpecularityAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-specularity}.
+ *
+ */
+public class DrawExtrusionSpecularityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-specularity");
+	public static final String DEFAULT_VALUE = "0%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-specularity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionSpecularityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-specularity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-specularity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-specularity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionViewpointAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionViewpointAttribute.java
new file mode 100644
index 0000000..ee86587
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawExtrusionViewpointAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:extrusion-viewpoint}.
+ *
+ */
+public class DrawExtrusionViewpointAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "extrusion-viewpoint");
+	public static final String DEFAULT_VALUE = "3.5cm -3.5cm 25cm";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:extrusion-viewpoint}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawExtrusionViewpointAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:extrusion-viewpoint}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:extrusion-viewpoint}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:extrusion-viewpoint} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillAttribute.java
new file mode 100644
index 0000000..be5cc05
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill}.
+ *
+ */
+public class DrawFillAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:fill}.
+	 */
+	public enum Value {
+		BITMAP("bitmap"), GRADIENT("gradient"), HATCH("hatch"), NONE("none"), SOLID("solid") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillColorAttribute.java
new file mode 100644
index 0000000..bd4c24c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-color}.
+ *
+ */
+public class DrawFillColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillGradientNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillGradientNameAttribute.java
new file mode 100644
index 0000000..f2c5548
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillGradientNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-gradient-name}.
+ *
+ */
+public class DrawFillGradientNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-gradient-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-gradient-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillGradientNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-gradient-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-gradient-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-gradient-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillHatchNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillHatchNameAttribute.java
new file mode 100644
index 0000000..7cbb207
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillHatchNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-hatch-name}.
+ *
+ */
+public class DrawFillHatchNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-hatch-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillHatchNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-hatch-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-hatch-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-hatch-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillHatchSolidAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillHatchSolidAttribute.java
new file mode 100644
index 0000000..436c17c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillHatchSolidAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-hatch-solid}.
+ *
+ */
+public class DrawFillHatchSolidAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-solid");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-hatch-solid}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillHatchSolidAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-hatch-solid}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-hatch-solid}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-hatch-solid} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageHeightAttribute.java
new file mode 100644
index 0000000..84f26b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-image-height}.
+ *
+ */
+public class DrawFillImageHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-image-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-image-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-image-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-image-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageNameAttribute.java
new file mode 100644
index 0000000..93ba63e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-image-name}.
+ *
+ */
+public class DrawFillImageNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-image-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-image-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-image-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-image-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointAttribute.java
new file mode 100644
index 0000000..ae5b2e0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-image-ref-point}.
+ *
+ */
+public class DrawFillImageRefPointAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-image-ref-point}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageRefPointAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-image-ref-point}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:fill-image-ref-point}.
+	 */
+	public enum Value {
+		BOTTOM("bottom"), BOTTOM_LEFT("bottom-left"), BOTTOM_RIGHT("bottom-right"), CENTER("center"), LEFT("left"), RIGHT("right"), TOP("top"), TOP_LEFT("top-left"), TOP_RIGHT("top-right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-image-ref-point}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-image-ref-point} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointXAttribute.java
new file mode 100644
index 0000000..ff6ed4a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointXAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-image-ref-point-x}.
+ *
+ */
+public class DrawFillImageRefPointXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-image-ref-point-x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageRefPointXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-image-ref-point-x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-image-ref-point-x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-image-ref-point-x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointYAttribute.java
new file mode 100644
index 0000000..4234e49
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageRefPointYAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-image-ref-point-y}.
+ *
+ */
+public class DrawFillImageRefPointYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-image-ref-point-y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageRefPointYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-image-ref-point-y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-image-ref-point-y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-image-ref-point-y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageWidthAttribute.java
new file mode 100644
index 0000000..d3802f3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFillImageWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fill-image-width}.
+ *
+ */
+public class DrawFillImageWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fill-image-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fill-image-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fill-image-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fill-image-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFilterNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFilterNameAttribute.java
new file mode 100644
index 0000000..7e97261
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFilterNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:filter-name}.
+ *
+ */
+public class DrawFilterNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "filter-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:filter-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFilterNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:filter-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:filter-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:filter-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFitToContourAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFitToContourAttribute.java
new file mode 100644
index 0000000..3d1d764
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFitToContourAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fit-to-contour}.
+ *
+ */
+public class DrawFitToContourAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fit-to-contour");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fit-to-contour}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFitToContourAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fit-to-contour}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fit-to-contour}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fit-to-contour} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFitToSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFitToSizeAttribute.java
new file mode 100644
index 0000000..571840a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFitToSizeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:fit-to-size}.
+ *
+ */
+public class DrawFitToSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fit-to-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:fit-to-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFitToSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:fit-to-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:fit-to-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:fit-to-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFormulaAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFormulaAttribute.java
new file mode 100644
index 0000000..aa404e8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFormulaAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:formula}.
+ *
+ */
+public class DrawFormulaAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "formula");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:formula}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFormulaAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:formula}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:formula}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:formula} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameDisplayBorderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameDisplayBorderAttribute.java
new file mode 100644
index 0000000..61bae3d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameDisplayBorderAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:frame-display-border}.
+ *
+ */
+public class DrawFrameDisplayBorderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "frame-display-border");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:frame-display-border}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFrameDisplayBorderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:frame-display-border}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:frame-display-border}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:frame-display-border} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameDisplayScrollbarAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameDisplayScrollbarAttribute.java
new file mode 100644
index 0000000..cda0878
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameDisplayScrollbarAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:frame-display-scrollbar}.
+ *
+ */
+public class DrawFrameDisplayScrollbarAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "frame-display-scrollbar");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:frame-display-scrollbar}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFrameDisplayScrollbarAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:frame-display-scrollbar}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:frame-display-scrollbar}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:frame-display-scrollbar} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameMarginHorizontalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameMarginHorizontalAttribute.java
new file mode 100644
index 0000000..d9f2dbc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameMarginHorizontalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:frame-margin-horizontal}.
+ *
+ */
+public class DrawFrameMarginHorizontalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "frame-margin-horizontal");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:frame-margin-horizontal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFrameMarginHorizontalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:frame-margin-horizontal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:frame-margin-horizontal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:frame-margin-horizontal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameMarginVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameMarginVerticalAttribute.java
new file mode 100644
index 0000000..cfee5f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameMarginVerticalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:frame-margin-vertical}.
+ *
+ */
+public class DrawFrameMarginVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "frame-margin-vertical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:frame-margin-vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFrameMarginVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:frame-margin-vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:frame-margin-vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:frame-margin-vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameNameAttribute.java
new file mode 100644
index 0000000..4bc4d08
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawFrameNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:frame-name}.
+ *
+ */
+public class DrawFrameNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "frame-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:frame-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawFrameNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:frame-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:frame-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:frame-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGammaAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGammaAttribute.java
new file mode 100644
index 0000000..dbff3b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGammaAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:gamma}.
+ *
+ */
+public class DrawGammaAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "gamma");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:gamma}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGammaAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:gamma}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:gamma}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:gamma} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointLeavingDirectionsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointLeavingDirectionsAttribute.java
new file mode 100644
index 0000000..14046d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointLeavingDirectionsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:glue-point-leaving-directions}.
+ *
+ */
+public class DrawGluePointLeavingDirectionsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "glue-point-leaving-directions");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:glue-point-leaving-directions}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGluePointLeavingDirectionsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:glue-point-leaving-directions}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:glue-point-leaving-directions}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:glue-point-leaving-directions} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointTypeAttribute.java
new file mode 100644
index 0000000..45c8e31
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:glue-point-type}.
+ *
+ */
+public class DrawGluePointTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "glue-point-type");
+	public static final String DEFAULT_VALUE = "none";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:glue-point-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGluePointTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:glue-point-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:glue-point-type}.
+	 */
+	public enum Value {
+		NONE("none"), RECTANGLE("rectangle"), SEGMENTS("segments") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:glue-point-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:glue-point-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointsAttribute.java
new file mode 100644
index 0000000..2809ace
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGluePointsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:glue-points}.
+ *
+ */
+public class DrawGluePointsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "glue-points");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:glue-points}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGluePointsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:glue-points}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:glue-points}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:glue-points} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGradientStepCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGradientStepCountAttribute.java
new file mode 100644
index 0000000..60daece
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGradientStepCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:gradient-step-count}.
+ *
+ */
+public class DrawGradientStepCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "gradient-step-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:gradient-step-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGradientStepCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:gradient-step-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:gradient-step-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:gradient-step-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGreenAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGreenAttribute.java
new file mode 100644
index 0000000..8cb82fa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGreenAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:green}.
+ *
+ */
+public class DrawGreenAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "green");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:green}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGreenAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:green}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:green}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:green} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGuideDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGuideDistanceAttribute.java
new file mode 100644
index 0000000..9203e89
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGuideDistanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:guide-distance}.
+ *
+ */
+public class DrawGuideDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "guide-distance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:guide-distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGuideDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:guide-distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:guide-distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:guide-distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGuideOverhangAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGuideOverhangAttribute.java
new file mode 100644
index 0000000..8bd5930
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawGuideOverhangAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:guide-overhang}.
+ *
+ */
+public class DrawGuideOverhangAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "guide-overhang");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:guide-overhang}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawGuideOverhangAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:guide-overhang}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:guide-overhang}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:guide-overhang} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleMirrorHorizontalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleMirrorHorizontalAttribute.java
new file mode 100644
index 0000000..7fd4477
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleMirrorHorizontalAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-mirror-horizontal}.
+ *
+ */
+public class DrawHandleMirrorHorizontalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-mirror-horizontal");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-mirror-horizontal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleMirrorHorizontalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-mirror-horizontal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-mirror-horizontal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-mirror-horizontal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleMirrorVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleMirrorVerticalAttribute.java
new file mode 100644
index 0000000..041f4a0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleMirrorVerticalAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-mirror-vertical}.
+ *
+ */
+public class DrawHandleMirrorVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-mirror-vertical");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-mirror-vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleMirrorVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-mirror-vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-mirror-vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-mirror-vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandlePolarAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandlePolarAttribute.java
new file mode 100644
index 0000000..63c9a63
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandlePolarAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-polar}.
+ *
+ */
+public class DrawHandlePolarAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-polar");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-polar}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandlePolarAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-polar}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-polar}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-polar} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandlePositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandlePositionAttribute.java
new file mode 100644
index 0000000..fe5bc72
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandlePositionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-position}.
+ *
+ */
+public class DrawHandlePositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandlePositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRadiusRangeMaximumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRadiusRangeMaximumAttribute.java
new file mode 100644
index 0000000..1da11d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRadiusRangeMaximumAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-radius-range-maximum}.
+ *
+ */
+public class DrawHandleRadiusRangeMaximumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-radius-range-maximum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-radius-range-maximum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleRadiusRangeMaximumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-radius-range-maximum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-radius-range-maximum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-radius-range-maximum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRadiusRangeMinimumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRadiusRangeMinimumAttribute.java
new file mode 100644
index 0000000..be6ffdc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRadiusRangeMinimumAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-radius-range-minimum}.
+ *
+ */
+public class DrawHandleRadiusRangeMinimumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-radius-range-minimum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-radius-range-minimum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleRadiusRangeMinimumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-radius-range-minimum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-radius-range-minimum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-radius-range-minimum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeXMaximumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeXMaximumAttribute.java
new file mode 100644
index 0000000..fc21760
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeXMaximumAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-range-x-maximum}.
+ *
+ */
+public class DrawHandleRangeXMaximumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-range-x-maximum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-range-x-maximum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleRangeXMaximumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-range-x-maximum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-range-x-maximum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-range-x-maximum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeXMinimumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeXMinimumAttribute.java
new file mode 100644
index 0000000..5917a3e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeXMinimumAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-range-x-minimum}.
+ *
+ */
+public class DrawHandleRangeXMinimumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-range-x-minimum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-range-x-minimum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleRangeXMinimumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-range-x-minimum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-range-x-minimum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-range-x-minimum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeYMaximumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeYMaximumAttribute.java
new file mode 100644
index 0000000..d6e3bc5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeYMaximumAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-range-y-maximum}.
+ *
+ */
+public class DrawHandleRangeYMaximumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-range-y-maximum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-range-y-maximum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleRangeYMaximumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-range-y-maximum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-range-y-maximum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-range-y-maximum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeYMinimumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeYMinimumAttribute.java
new file mode 100644
index 0000000..231eb74
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleRangeYMinimumAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-range-y-minimum}.
+ *
+ */
+public class DrawHandleRangeYMinimumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-range-y-minimum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-range-y-minimum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleRangeYMinimumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-range-y-minimum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-range-y-minimum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-range-y-minimum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleSwitchedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleSwitchedAttribute.java
new file mode 100644
index 0000000..c4f7714
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawHandleSwitchedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:handle-switched}.
+ *
+ */
+public class DrawHandleSwitchedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle-switched");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:handle-switched}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleSwitchedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:handle-switched}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:handle-switched}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:handle-switched} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawIdAttribute.java
new file mode 100644
index 0000000..6cd2005
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:id}.
+ *
+ */
+public class DrawIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawImageOpacityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawImageOpacityAttribute.java
new file mode 100644
index 0000000..fcd1420
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawImageOpacityAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:image-opacity}.
+ *
+ */
+public class DrawImageOpacityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "image-opacity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:image-opacity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawImageOpacityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:image-opacity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:image-opacity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:image-opacity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawKindAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawKindAttribute.java
new file mode 100644
index 0000000..ce7b9fa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawKindAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:kind}.
+ *
+ */
+public class DrawKindAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "kind");
+	public static final String DEFAULT_VALUE = "full";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:kind}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawKindAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:kind}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:kind}.
+	 */
+	public enum Value {
+		ARC("arc"), CUT("cut"), FULL("full"), SECTION("section") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:kind}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:kind} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLayerAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLayerAttribute.java
new file mode 100644
index 0000000..bf42a96
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLayerAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:layer}.
+ *
+ */
+public class DrawLayerAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "layer");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:layer}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawLayerAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:layer}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:layer}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:layer} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLineDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLineDistanceAttribute.java
new file mode 100644
index 0000000..4c59fd5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLineDistanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:line-distance}.
+ *
+ */
+public class DrawLineDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "line-distance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:line-distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawLineDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:line-distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:line-distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:line-distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLineSkewAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLineSkewAttribute.java
new file mode 100644
index 0000000..c26efa4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLineSkewAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:line-skew}.
+ *
+ */
+public class DrawLineSkewAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "line-skew");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:line-skew}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawLineSkewAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:line-skew}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:line-skew}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:line-skew} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLuminanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLuminanceAttribute.java
new file mode 100644
index 0000000..1315226
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawLuminanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:luminance}.
+ *
+ */
+public class DrawLuminanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "luminance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:luminance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawLuminanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:luminance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:luminance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:luminance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndAttribute.java
new file mode 100644
index 0000000..92ae305
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:marker-end}.
+ *
+ */
+public class DrawMarkerEndAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:marker-end}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerEndAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:marker-end}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:marker-end}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:marker-end} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndCenterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndCenterAttribute.java
new file mode 100644
index 0000000..5997a8d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndCenterAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:marker-end-center}.
+ *
+ */
+public class DrawMarkerEndCenterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end-center");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:marker-end-center}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerEndCenterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:marker-end-center}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:marker-end-center}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:marker-end-center} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndWidthAttribute.java
new file mode 100644
index 0000000..7086aba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerEndWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:marker-end-width}.
+ *
+ */
+public class DrawMarkerEndWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:marker-end-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerEndWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:marker-end-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:marker-end-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:marker-end-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartAttribute.java
new file mode 100644
index 0000000..2957fd4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:marker-start}.
+ *
+ */
+public class DrawMarkerStartAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:marker-start}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerStartAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:marker-start}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:marker-start}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:marker-start} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartCenterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartCenterAttribute.java
new file mode 100644
index 0000000..7c88dcc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartCenterAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:marker-start-center}.
+ *
+ */
+public class DrawMarkerStartCenterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start-center");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:marker-start-center}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerStartCenterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:marker-start-center}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:marker-start-center}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:marker-start-center} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartWidthAttribute.java
new file mode 100644
index 0000000..b3bdaed
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMarkerStartWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:marker-start-width}.
+ *
+ */
+public class DrawMarkerStartWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:marker-start-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerStartWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:marker-start-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:marker-start-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:marker-start-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMasterPageNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMasterPageNameAttribute.java
new file mode 100644
index 0000000..5777e0e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMasterPageNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:master-page-name}.
+ *
+ */
+public class DrawMasterPageNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "master-page-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:master-page-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMasterPageNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:master-page-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:master-page-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:master-page-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMayScriptAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMayScriptAttribute.java
new file mode 100644
index 0000000..65607dc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMayScriptAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:may-script}.
+ *
+ */
+public class DrawMayScriptAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "may-script");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:may-script}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMayScriptAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:may-script}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:may-script}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:may-script} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMeasureAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMeasureAlignAttribute.java
new file mode 100644
index 0000000..09b4fe0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMeasureAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:measure-align}.
+ *
+ */
+public class DrawMeasureAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "measure-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:measure-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMeasureAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:measure-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:measure-align}.
+	 */
+	public enum Value {
+		AUTOMATIC("automatic"), INSIDE("inside"), LEFT_OUTSIDE("left-outside"), RIGHT_OUTSIDE("right-outside") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:measure-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:measure-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMeasureVerticalAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMeasureVerticalAlignAttribute.java
new file mode 100644
index 0000000..2b06499
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMeasureVerticalAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:measure-vertical-align}.
+ *
+ */
+public class DrawMeasureVerticalAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "measure-vertical-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:measure-vertical-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMeasureVerticalAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:measure-vertical-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:measure-vertical-align}.
+	 */
+	public enum Value {
+		ABOVE("above"), AUTOMATIC("automatic"), BELOW("below"), CENTER("center") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:measure-vertical-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:measure-vertical-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMimeTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMimeTypeAttribute.java
new file mode 100644
index 0000000..610df86
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMimeTypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:mime-type}.
+ *
+ */
+public class DrawMimeTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "mime-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:mime-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMimeTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:mime-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:mime-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:mime-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMirrorHorizontalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMirrorHorizontalAttribute.java
new file mode 100644
index 0000000..093da0d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMirrorHorizontalAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:mirror-horizontal}.
+ *
+ */
+public class DrawMirrorHorizontalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "mirror-horizontal");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:mirror-horizontal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMirrorHorizontalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:mirror-horizontal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:mirror-horizontal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:mirror-horizontal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMirrorVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMirrorVerticalAttribute.java
new file mode 100644
index 0000000..5ca745b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawMirrorVerticalAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:mirror-vertical}.
+ *
+ */
+public class DrawMirrorVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "mirror-vertical");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:mirror-vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawMirrorVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:mirror-vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:mirror-vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:mirror-vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawModifiersAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawModifiersAttribute.java
new file mode 100644
index 0000000..720cdd0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawModifiersAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:modifiers}.
+ *
+ */
+public class DrawModifiersAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "modifiers");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:modifiers}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawModifiersAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:modifiers}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:modifiers}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:modifiers} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNameAttribute.java
new file mode 100644
index 0000000..d25d102
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:name}.
+ *
+ */
+public class DrawNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNavOrderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNavOrderAttribute.java
new file mode 100644
index 0000000..b40c6f3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNavOrderAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:nav-order}.
+ *
+ */
+public class DrawNavOrderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "nav-order");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:nav-order}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawNavOrderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:nav-order}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:nav-order}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:nav-order} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNohrefAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNohrefAttribute.java
new file mode 100644
index 0000000..ba94ddb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNohrefAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:nohref}.
+ *
+ */
+public class DrawNohrefAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "nohref");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:nohref}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawNohrefAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:nohref}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:nohref}.
+	 */
+	public enum Value {
+		NOHREF("nohref") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:nohref}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:nohref} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNotifyOnUpdateOfRangesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNotifyOnUpdateOfRangesAttribute.java
new file mode 100644
index 0000000..ab3737b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawNotifyOnUpdateOfRangesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:notify-on-update-of-ranges}.
+ *
+ */
+public class DrawNotifyOnUpdateOfRangesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "notify-on-update-of-ranges");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:notify-on-update-of-ranges}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawNotifyOnUpdateOfRangesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:notify-on-update-of-ranges}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:notify-on-update-of-ranges}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:notify-on-update-of-ranges} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawObjectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawObjectAttribute.java
new file mode 100644
index 0000000..008f97b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawObjectAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:object}.
+ *
+ */
+public class DrawObjectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "object");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:object}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawObjectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:object}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:object}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:object} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOleDrawAspectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOleDrawAspectAttribute.java
new file mode 100644
index 0000000..1c96b9a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOleDrawAspectAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:ole-draw-aspect}.
+ *
+ */
+public class DrawOleDrawAspectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "ole-draw-aspect");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:ole-draw-aspect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawOleDrawAspectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:ole-draw-aspect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:ole-draw-aspect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:ole-draw-aspect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOpacityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOpacityAttribute.java
new file mode 100644
index 0000000..b29fb16
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOpacityAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:opacity}.
+ *
+ */
+public class DrawOpacityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "opacity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:opacity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawOpacityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:opacity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:opacity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:opacity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOpacityNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOpacityNameAttribute.java
new file mode 100644
index 0000000..1e7d384
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawOpacityNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:opacity-name}.
+ *
+ */
+public class DrawOpacityNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "opacity-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:opacity-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawOpacityNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:opacity-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:opacity-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:opacity-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPageNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPageNumberAttribute.java
new file mode 100644
index 0000000..6098b66
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPageNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:page-number}.
+ *
+ */
+public class DrawPageNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "page-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:page-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawPageNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:page-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:page-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:page-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawParallelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawParallelAttribute.java
new file mode 100644
index 0000000..685c1da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawParallelAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:parallel}.
+ *
+ */
+public class DrawParallelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "parallel");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:parallel}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawParallelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:parallel}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:parallel}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:parallel} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPathStretchpointXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPathStretchpointXAttribute.java
new file mode 100644
index 0000000..16d6237
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPathStretchpointXAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:path-stretchpoint-x}.
+ *
+ */
+public class DrawPathStretchpointXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "path-stretchpoint-x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:path-stretchpoint-x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawPathStretchpointXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:path-stretchpoint-x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:path-stretchpoint-x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:path-stretchpoint-x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPathStretchpointYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPathStretchpointYAttribute.java
new file mode 100644
index 0000000..531f414
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPathStretchpointYAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:path-stretchpoint-y}.
+ *
+ */
+public class DrawPathStretchpointYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "path-stretchpoint-y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:path-stretchpoint-y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawPathStretchpointYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:path-stretchpoint-y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:path-stretchpoint-y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:path-stretchpoint-y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPlacingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPlacingAttribute.java
new file mode 100644
index 0000000..4d41731
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPlacingAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:placing}.
+ *
+ */
+public class DrawPlacingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "placing");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:placing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawPlacingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:placing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:placing}.
+	 */
+	public enum Value {
+		ABOVE("above"), BELOW("below") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:placing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:placing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPointsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPointsAttribute.java
new file mode 100644
index 0000000..c107320
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawPointsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:points}.
+ *
+ */
+public class DrawPointsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "points");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:points}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawPointsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:points}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:points}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:points} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawProtectedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawProtectedAttribute.java
new file mode 100644
index 0000000..7d19d41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawProtectedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:protected}.
+ *
+ */
+public class DrawProtectedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "protected");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:protected}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawProtectedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:protected}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:protected}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:protected} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRecreateOnEditAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRecreateOnEditAttribute.java
new file mode 100644
index 0000000..5872825
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRecreateOnEditAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:recreate-on-edit}.
+ *
+ */
+public class DrawRecreateOnEditAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "recreate-on-edit");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:recreate-on-edit}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawRecreateOnEditAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:recreate-on-edit}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:recreate-on-edit}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:recreate-on-edit} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRedAttribute.java
new file mode 100644
index 0000000..7bd6739
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRedAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:red}.
+ *
+ */
+public class DrawRedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "red");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:red}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawRedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:red}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:red}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:red} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRotationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRotationAttribute.java
new file mode 100644
index 0000000..f0fb0d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawRotationAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:rotation}.
+ *
+ */
+public class DrawRotationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "rotation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:rotation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawRotationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:rotation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:rotation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:rotation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSecondaryFillColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSecondaryFillColorAttribute.java
new file mode 100644
index 0000000..3384c4b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSecondaryFillColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:secondary-fill-color}.
+ *
+ */
+public class DrawSecondaryFillColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "secondary-fill-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:secondary-fill-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawSecondaryFillColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:secondary-fill-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:secondary-fill-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:secondary-fill-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowAttribute.java
new file mode 100644
index 0000000..e35cc41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:shadow}.
+ *
+ */
+public class DrawShadowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "shadow");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:shadow}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShadowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:shadow}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:shadow}.
+	 */
+	public enum Value {
+		HIDDEN("hidden"), VISIBLE("visible") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:shadow}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:shadow} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowColorAttribute.java
new file mode 100644
index 0000000..c4d0ba5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:shadow-color}.
+ *
+ */
+public class DrawShadowColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:shadow-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShadowColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:shadow-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:shadow-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:shadow-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOffsetXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOffsetXAttribute.java
new file mode 100644
index 0000000..7611ae0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOffsetXAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:shadow-offset-x}.
+ *
+ */
+public class DrawShadowOffsetXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-offset-x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:shadow-offset-x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShadowOffsetXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:shadow-offset-x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:shadow-offset-x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:shadow-offset-x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOffsetYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOffsetYAttribute.java
new file mode 100644
index 0000000..68b0fe3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOffsetYAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:shadow-offset-y}.
+ *
+ */
+public class DrawShadowOffsetYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-offset-y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:shadow-offset-y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShadowOffsetYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:shadow-offset-y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:shadow-offset-y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:shadow-offset-y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOpacityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOpacityAttribute.java
new file mode 100644
index 0000000..44513c9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShadowOpacityAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:shadow-opacity}.
+ *
+ */
+public class DrawShadowOpacityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-opacity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:shadow-opacity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShadowOpacityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:shadow-opacity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:shadow-opacity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:shadow-opacity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShapeIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShapeIdAttribute.java
new file mode 100644
index 0000000..3503cf7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShapeIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:shape-id}.
+ *
+ */
+public class DrawShapeIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "shape-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:shape-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShapeIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:shape-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:shape-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:shape-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSharpnessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSharpnessAttribute.java
new file mode 100644
index 0000000..a45dff4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSharpnessAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:sharpness}.
+ *
+ */
+public class DrawSharpnessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "sharpness");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:sharpness}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawSharpnessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:sharpness}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:sharpness}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:sharpness} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShowUnitAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShowUnitAttribute.java
new file mode 100644
index 0000000..b2e4ea7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawShowUnitAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:show-unit}.
+ *
+ */
+public class DrawShowUnitAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "show-unit");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:show-unit}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawShowUnitAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:show-unit}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:show-unit}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:show-unit} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartAngleAttribute.java
new file mode 100644
index 0000000..f9e73b8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-angle}.
+ *
+ */
+public class DrawStartAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartAttribute.java
new file mode 100644
index 0000000..f3faab8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start}.
+ *
+ */
+public class DrawStartAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartColorAttribute.java
new file mode 100644
index 0000000..91fcdb9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-color}.
+ *
+ */
+public class DrawStartColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartGluePointAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartGluePointAttribute.java
new file mode 100644
index 0000000..d1158ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartGluePointAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-glue-point}.
+ *
+ */
+public class DrawStartGluePointAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-glue-point");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-glue-point}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartGluePointAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-glue-point}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-glue-point}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-glue-point} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartGuideAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartGuideAttribute.java
new file mode 100644
index 0000000..70e3b8a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartGuideAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-guide}.
+ *
+ */
+public class DrawStartGuideAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-guide");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-guide}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartGuideAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-guide}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-guide}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-guide} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartIntensityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartIntensityAttribute.java
new file mode 100644
index 0000000..fc133c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartIntensityAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-intensity}.
+ *
+ */
+public class DrawStartIntensityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-intensity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-intensity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartIntensityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-intensity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-intensity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-intensity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartLineSpacingHorizontalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartLineSpacingHorizontalAttribute.java
new file mode 100644
index 0000000..59d1158
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartLineSpacingHorizontalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-line-spacing-horizontal}.
+ *
+ */
+public class DrawStartLineSpacingHorizontalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-line-spacing-horizontal");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-line-spacing-horizontal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartLineSpacingHorizontalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-line-spacing-horizontal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-line-spacing-horizontal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-line-spacing-horizontal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartLineSpacingVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartLineSpacingVerticalAttribute.java
new file mode 100644
index 0000000..c9d1c1d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartLineSpacingVerticalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-line-spacing-vertical}.
+ *
+ */
+public class DrawStartLineSpacingVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-line-spacing-vertical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-line-spacing-vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartLineSpacingVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-line-spacing-vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-line-spacing-vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-line-spacing-vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartShapeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartShapeAttribute.java
new file mode 100644
index 0000000..d0ce742
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStartShapeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:start-shape}.
+ *
+ */
+public class DrawStartShapeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "start-shape");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:start-shape}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStartShapeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:start-shape}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:start-shape}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:start-shape} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeAttribute.java
new file mode 100644
index 0000000..5321363
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:stroke}.
+ *
+ */
+public class DrawStrokeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "stroke");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:stroke}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStrokeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:stroke}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:stroke}.
+	 */
+	public enum Value {
+		DASH("dash"), NONE("none"), SOLID("solid") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:stroke}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:stroke} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeDashAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeDashAttribute.java
new file mode 100644
index 0000000..187c6bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeDashAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:stroke-dash}.
+ *
+ */
+public class DrawStrokeDashAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:stroke-dash}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStrokeDashAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:stroke-dash}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:stroke-dash}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:stroke-dash} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeDashNamesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeDashNamesAttribute.java
new file mode 100644
index 0000000..2d6447d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeDashNamesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:stroke-dash-names}.
+ *
+ */
+public class DrawStrokeDashNamesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash-names");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:stroke-dash-names}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStrokeDashNamesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:stroke-dash-names}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:stroke-dash-names}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:stroke-dash-names} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeLinejoinAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeLinejoinAttribute.java
new file mode 100644
index 0000000..90417fa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStrokeLinejoinAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:stroke-linejoin}.
+ *
+ */
+public class DrawStrokeLinejoinAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-linejoin");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:stroke-linejoin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStrokeLinejoinAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:stroke-linejoin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:stroke-linejoin}.
+	 */
+	public enum Value {
+		BEVEL("bevel"), MIDDLE("middle"), MITER("miter"), NONE("none"), ROUND("round") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:stroke-linejoin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:stroke-linejoin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStyleAttribute.java
new file mode 100644
index 0000000..449b4d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:style}.
+ *
+ */
+public class DrawStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:style}.
+	 */
+	public enum Value {
+		AXIAL("axial"), DOUBLE("double"), ELLIPSOID("ellipsoid"), LINEAR("linear"), RADIAL("radial"), RECT("rect"), RECTANGULAR("rectangular"), ROUND("round"), SINGLE("single"), SQUARE("square"), TRIPLE("triple") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStyleNameAttribute.java
new file mode 100644
index 0000000..f1d7898
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:style-name}.
+ *
+ */
+public class DrawStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSymbolColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSymbolColorAttribute.java
new file mode 100644
index 0000000..2d65aaa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawSymbolColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:symbol-color}.
+ *
+ */
+public class DrawSymbolColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "symbol-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:symbol-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawSymbolColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:symbol-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:symbol-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:symbol-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextAreasAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextAreasAttribute.java
new file mode 100644
index 0000000..830cb1e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextAreasAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-areas}.
+ *
+ */
+public class DrawTextAreasAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-areas");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-areas}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextAreasAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-areas}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-areas}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-areas} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathAllowedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathAllowedAttribute.java
new file mode 100644
index 0000000..78331f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathAllowedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-path-allowed}.
+ *
+ */
+public class DrawTextPathAllowedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-path-allowed");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-path-allowed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextPathAllowedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-path-allowed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-path-allowed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-path-allowed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathAttribute.java
new file mode 100644
index 0000000..8c2f869
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-path}.
+ *
+ */
+public class DrawTextPathAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-path");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-path}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextPathAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-path}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-path}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-path} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathModeAttribute.java
new file mode 100644
index 0000000..99c1b03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathModeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-path-mode}.
+ *
+ */
+public class DrawTextPathModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-path-mode");
+	public static final String DEFAULT_VALUE = "normal";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-path-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextPathModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-path-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:text-path-mode}.
+	 */
+	public enum Value {
+		NORMAL("normal"), PATH("path"), SHAPE("shape") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-path-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-path-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathSameLetterHeightsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathSameLetterHeightsAttribute.java
new file mode 100644
index 0000000..ba845df
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathSameLetterHeightsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-path-same-letter-heights}.
+ *
+ */
+public class DrawTextPathSameLetterHeightsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-path-same-letter-heights");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-path-same-letter-heights}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextPathSameLetterHeightsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-path-same-letter-heights}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-path-same-letter-heights}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-path-same-letter-heights} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathScaleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathScaleAttribute.java
new file mode 100644
index 0000000..58ec77f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextPathScaleAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-path-scale}.
+ *
+ */
+public class DrawTextPathScaleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-path-scale");
+	public static final String DEFAULT_VALUE = "path";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-path-scale}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextPathScaleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-path-scale}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:text-path-scale}.
+	 */
+	public enum Value {
+		PATH("path"), SHAPE("shape") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-path-scale}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-path-scale} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextRotateAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextRotateAngleAttribute.java
new file mode 100644
index 0000000..29b37e5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextRotateAngleAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-rotate-angle}.
+ *
+ */
+public class DrawTextRotateAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-rotate-angle");
+	public static final String DEFAULT_VALUE = "0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-rotate-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextRotateAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-rotate-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-rotate-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-rotate-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextStyleNameAttribute.java
new file mode 100644
index 0000000..2ec2d6b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:text-style-name}.
+ *
+ */
+public class DrawTextStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:text-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:text-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:text-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:text-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextareaHorizontalAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextareaHorizontalAlignAttribute.java
new file mode 100644
index 0000000..98a7760
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextareaHorizontalAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:textarea-horizontal-align}.
+ *
+ */
+public class DrawTextareaHorizontalAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "textarea-horizontal-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:textarea-horizontal-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextareaHorizontalAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:textarea-horizontal-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:textarea-horizontal-align}.
+	 */
+	public enum Value {
+		CENTER("center"), JUSTIFY("justify"), LEFT("left"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:textarea-horizontal-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:textarea-horizontal-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextareaVerticalAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextareaVerticalAlignAttribute.java
new file mode 100644
index 0000000..cffc72c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTextareaVerticalAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:textarea-vertical-align}.
+ *
+ */
+public class DrawTextareaVerticalAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "textarea-vertical-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:textarea-vertical-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextareaVerticalAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:textarea-vertical-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:textarea-vertical-align}.
+	 */
+	public enum Value {
+		BOTTOM("bottom"), JUSTIFY("justify"), MIDDLE("middle"), TOP("top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:textarea-vertical-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:textarea-vertical-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTileRepeatOffsetAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTileRepeatOffsetAttribute.java
new file mode 100644
index 0000000..035bda2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTileRepeatOffsetAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:tile-repeat-offset}.
+ *
+ */
+public class DrawTileRepeatOffsetAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "tile-repeat-offset");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:tile-repeat-offset}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTileRepeatOffsetAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:tile-repeat-offset}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:tile-repeat-offset}.
+	 */
+	public enum Value {
+		HORIZONTAL("horizontal"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:tile-repeat-offset}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:tile-repeat-offset} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTransformAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTransformAttribute.java
new file mode 100644
index 0000000..5be28f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTransformAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:transform}.
+ *
+ */
+public class DrawTransformAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "transform");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:transform}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTransformAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:transform}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:transform}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:transform} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTypeAttribute.java
new file mode 100644
index 0000000..c6c9724
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawTypeAttribute.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEnhancedGeometryElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:type}.
+ *
+ */
+public class DrawTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "type");
+	public static final String DEFAULT_VALUE_STANDARD = Value.STANDARD.toString();
+	public static final String DEFAULT_VALUE_NON_PRIMITIVE = Value.NON_PRIMITIVE.toString();
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:type}.
+	 */
+	public enum Value {
+		CURVE("curve"), LINE("line"), LINES("lines"), NON_PRIMITIVE("non-primitive"), STANDARD("standard") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof DrawConnectorElement) {
+				defaultValue = DEFAULT_VALUE_STANDARD;
+			}
+			if (parentElement instanceof DrawEnhancedGeometryElement) {
+				defaultValue = DEFAULT_VALUE_NON_PRIMITIVE;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawUnitAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawUnitAttribute.java
new file mode 100644
index 0000000..d680ba6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawUnitAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:unit}.
+ *
+ */
+public class DrawUnitAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "unit");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:unit}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawUnitAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:unit}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:unit}.
+	 */
+	public enum Value {
+		AUTOMATIC("automatic"), CM("cm"), FT("ft"), INCH("inch"), KM("km"), m("m"), MI("mi"), MM("mm"), PC("pc"), PT("pt") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:unit}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:unit} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawValueAttribute.java
new file mode 100644
index 0000000..d62dcf9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:value}.
+ *
+ */
+public class DrawValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaHeightAttribute.java
new file mode 100644
index 0000000..30af74c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:visible-area-height}.
+ *
+ */
+public class DrawVisibleAreaHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:visible-area-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawVisibleAreaHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:visible-area-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:visible-area-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:visible-area-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaLeftAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaLeftAttribute.java
new file mode 100644
index 0000000..3144b15
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaLeftAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:visible-area-left}.
+ *
+ */
+public class DrawVisibleAreaLeftAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-left");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:visible-area-left}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawVisibleAreaLeftAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:visible-area-left}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:visible-area-left}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:visible-area-left} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaTopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaTopAttribute.java
new file mode 100644
index 0000000..4f7abe4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaTopAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:visible-area-top}.
+ *
+ */
+public class DrawVisibleAreaTopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-top");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:visible-area-top}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawVisibleAreaTopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:visible-area-top}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:visible-area-top}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:visible-area-top} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaWidthAttribute.java
new file mode 100644
index 0000000..3a19b71
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawVisibleAreaWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:visible-area-width}.
+ *
+ */
+public class DrawVisibleAreaWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:visible-area-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawVisibleAreaWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:visible-area-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:visible-area-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:visible-area-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawWrapInfluenceOnPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawWrapInfluenceOnPositionAttribute.java
new file mode 100644
index 0000000..fb06883
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawWrapInfluenceOnPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:wrap-influence-on-position}.
+ *
+ */
+public class DrawWrapInfluenceOnPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "wrap-influence-on-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:wrap-influence-on-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawWrapInfluenceOnPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:wrap-influence-on-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute draw:wrap-influence-on-position}.
+	 */
+	public enum Value {
+		ITERATIVE("iterative"), ONCE_CONCURRENT("once-concurrent"), ONCE_SUCCESSIVE("once-successive") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:wrap-influence-on-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:wrap-influence-on-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawZIndexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawZIndexAttribute.java
new file mode 100644
index 0000000..ba9026c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/draw/DrawZIndexAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.draw;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute draw:z-index}.
+ *
+ */
+public class DrawZIndexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "z-index");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute draw:z-index}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public DrawZIndexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute draw:z-index}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute draw:z-index}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute draw:z-index} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBackgroundColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBackgroundColorAttribute.java
new file mode 100644
index 0000000..f34920c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBackgroundColorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:background-color}.
+ *
+ */
+public class FoBackgroundColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "background-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:background-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBackgroundColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:background-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:background-color}.
+	 */
+	public enum Value {
+		TRANSPARENT("transparent") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:background-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:background-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderAttribute.java
new file mode 100644
index 0000000..b89779c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:border}.
+ *
+ */
+public class FoBorderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "border");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:border}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBorderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:border}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:border}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:border} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderBottomAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderBottomAttribute.java
new file mode 100644
index 0000000..eb7726b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderBottomAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:border-bottom}.
+ *
+ */
+public class FoBorderBottomAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "border-bottom");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:border-bottom}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBorderBottomAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:border-bottom}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:border-bottom}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:border-bottom} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderLeftAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderLeftAttribute.java
new file mode 100644
index 0000000..c523a7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderLeftAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:border-left}.
+ *
+ */
+public class FoBorderLeftAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "border-left");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:border-left}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBorderLeftAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:border-left}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:border-left}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:border-left} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderRightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderRightAttribute.java
new file mode 100644
index 0000000..16d079d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderRightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:border-right}.
+ *
+ */
+public class FoBorderRightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "border-right");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:border-right}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBorderRightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:border-right}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:border-right}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:border-right} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderTopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderTopAttribute.java
new file mode 100644
index 0000000..864c30a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBorderTopAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:border-top}.
+ *
+ */
+public class FoBorderTopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "border-top");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:border-top}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBorderTopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:border-top}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:border-top}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:border-top} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBreakAfterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBreakAfterAttribute.java
new file mode 100644
index 0000000..8de261d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBreakAfterAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:break-after}.
+ *
+ */
+public class FoBreakAfterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "break-after");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:break-after}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBreakAfterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:break-after}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:break-after}.
+	 */
+	public enum Value {
+		AUTO("auto"), COLUMN("column"), PAGE("page") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:break-after}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:break-after} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBreakBeforeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBreakBeforeAttribute.java
new file mode 100644
index 0000000..d43f2a8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoBreakBeforeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:break-before}.
+ *
+ */
+public class FoBreakBeforeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "break-before");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:break-before}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoBreakBeforeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:break-before}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:break-before}.
+	 */
+	public enum Value {
+		AUTO("auto"), COLUMN("column"), PAGE("page") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:break-before}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:break-before} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoClipAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoClipAttribute.java
new file mode 100644
index 0000000..a5029c9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoClipAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:clip}.
+ *
+ */
+public class FoClipAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "clip");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:clip}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoClipAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:clip}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:clip}.
+	 */
+	public enum Value {
+		AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:clip}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:clip} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColorAttribute.java
new file mode 100644
index 0000000..5452ced
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:color}.
+ *
+ */
+public class FoColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColumnCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColumnCountAttribute.java
new file mode 100644
index 0000000..da10538
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColumnCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:column-count}.
+ *
+ */
+public class FoColumnCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "column-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:column-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoColumnCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:column-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:column-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:column-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColumnGapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColumnGapAttribute.java
new file mode 100644
index 0000000..5c67f13
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoColumnGapAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:column-gap}.
+ *
+ */
+public class FoColumnGapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "column-gap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:column-gap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoColumnGapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:column-gap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:column-gap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:column-gap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoCountryAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoCountryAttribute.java
new file mode 100644
index 0000000..c34b330
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoCountryAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:country}.
+ *
+ */
+public class FoCountryAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "country");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:country}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoCountryAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:country}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:country}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:country} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoEndIndentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoEndIndentAttribute.java
new file mode 100644
index 0000000..3073187
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoEndIndentAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:end-indent}.
+ *
+ */
+public class FoEndIndentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "end-indent");
+	public static final String DEFAULT_VALUE = "0cm";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:end-indent}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoEndIndentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:end-indent}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:end-indent}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:end-indent} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontFamilyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontFamilyAttribute.java
new file mode 100644
index 0000000..94b8b76
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontFamilyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:font-family}.
+ *
+ */
+public class FoFontFamilyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "font-family");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:font-family}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoFontFamilyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:font-family}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:font-family}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:font-family} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontSizeAttribute.java
new file mode 100644
index 0000000..a268d91
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontSizeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:font-size}.
+ *
+ */
+public class FoFontSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "font-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:font-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoFontSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:font-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:font-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:font-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontStyleAttribute.java
new file mode 100644
index 0000000..5ec7be5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:font-style}.
+ *
+ */
+public class FoFontStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "font-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:font-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoFontStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:font-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:font-style}.
+	 */
+	public enum Value {
+		ITALIC("italic"), NORMAL("normal"), OBLIQUE("oblique") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:font-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:font-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontVariantAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontVariantAttribute.java
new file mode 100644
index 0000000..b251670
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontVariantAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:font-variant}.
+ *
+ */
+public class FoFontVariantAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "font-variant");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:font-variant}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoFontVariantAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:font-variant}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:font-variant}.
+	 */
+	public enum Value {
+		NORMAL("normal"), SMALL_CAPS("small-caps") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:font-variant}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:font-variant} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontWeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontWeightAttribute.java
new file mode 100644
index 0000000..ccb25dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoFontWeightAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:font-weight}.
+ *
+ */
+public class FoFontWeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "font-weight");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:font-weight}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoFontWeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:font-weight}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:font-weight}.
+	 */
+	public enum Value {
+		_100("100"), _200("200"), _300("300"), _400("400"), _500("500"), _600("600"), _700("700"), _800("800"), _900("900"), BOLD("bold"), NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:font-weight}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:font-weight} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHeightAttribute.java
new file mode 100644
index 0000000..e000550
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:height}.
+ *
+ */
+public class FoHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenateAttribute.java
new file mode 100644
index 0000000..ca2eb4d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenateAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:hyphenate}.
+ *
+ */
+public class FoHyphenateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "hyphenate");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:hyphenate}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoHyphenateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:hyphenate}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:hyphenate}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:hyphenate} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationKeepAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationKeepAttribute.java
new file mode 100644
index 0000000..aaab846
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationKeepAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:hyphenation-keep}.
+ *
+ */
+public class FoHyphenationKeepAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-keep");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:hyphenation-keep}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoHyphenationKeepAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:hyphenation-keep}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:hyphenation-keep}.
+	 */
+	public enum Value {
+		AUTO("auto"), PAGE("page") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:hyphenation-keep}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:hyphenation-keep} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationLadderCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationLadderCountAttribute.java
new file mode 100644
index 0000000..f2a8e3e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationLadderCountAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:hyphenation-ladder-count}.
+ *
+ */
+public class FoHyphenationLadderCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-ladder-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:hyphenation-ladder-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoHyphenationLadderCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:hyphenation-ladder-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:hyphenation-ladder-count}.
+	 */
+	public enum Value {
+		NO_LIMIT("no-limit") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:hyphenation-ladder-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:hyphenation-ladder-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationPushCharCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationPushCharCountAttribute.java
new file mode 100644
index 0000000..822ed42
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationPushCharCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:hyphenation-push-char-count}.
+ *
+ */
+public class FoHyphenationPushCharCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-push-char-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:hyphenation-push-char-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoHyphenationPushCharCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:hyphenation-push-char-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:hyphenation-push-char-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:hyphenation-push-char-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationRemainCharCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationRemainCharCountAttribute.java
new file mode 100644
index 0000000..cd1471c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoHyphenationRemainCharCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:hyphenation-remain-char-count}.
+ *
+ */
+public class FoHyphenationRemainCharCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-remain-char-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:hyphenation-remain-char-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoHyphenationRemainCharCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:hyphenation-remain-char-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:hyphenation-remain-char-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:hyphenation-remain-char-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoKeepTogetherAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoKeepTogetherAttribute.java
new file mode 100644
index 0000000..772e737
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoKeepTogetherAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:keep-together}.
+ *
+ */
+public class FoKeepTogetherAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "keep-together");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:keep-together}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoKeepTogetherAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:keep-together}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:keep-together}.
+	 */
+	public enum Value {
+		ALWAYS("always"), AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:keep-together}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:keep-together} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoKeepWithNextAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoKeepWithNextAttribute.java
new file mode 100644
index 0000000..41eaec4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoKeepWithNextAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:keep-with-next}.
+ *
+ */
+public class FoKeepWithNextAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "keep-with-next");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:keep-with-next}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoKeepWithNextAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:keep-with-next}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:keep-with-next}.
+	 */
+	public enum Value {
+		ALWAYS("always"), AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:keep-with-next}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:keep-with-next} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLanguageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLanguageAttribute.java
new file mode 100644
index 0000000..1b9259f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLanguageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:language}.
+ *
+ */
+public class FoLanguageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "language");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:language}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoLanguageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:language}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:language}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:language} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLetterSpacingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLetterSpacingAttribute.java
new file mode 100644
index 0000000..f6a917c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLetterSpacingAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:letter-spacing}.
+ *
+ */
+public class FoLetterSpacingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "letter-spacing");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:letter-spacing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoLetterSpacingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:letter-spacing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:letter-spacing}.
+	 */
+	public enum Value {
+		NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:letter-spacing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:letter-spacing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLineHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLineHeightAttribute.java
new file mode 100644
index 0000000..a4329ce
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoLineHeightAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:line-height}.
+ *
+ */
+public class FoLineHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "line-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:line-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoLineHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:line-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:line-height}.
+	 */
+	public enum Value {
+		NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:line-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:line-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginAttribute.java
new file mode 100644
index 0000000..7127357
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:margin}.
+ *
+ */
+public class FoMarginAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "margin");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:margin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMarginAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:margin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:margin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:margin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginBottomAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginBottomAttribute.java
new file mode 100644
index 0000000..7cb9bee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginBottomAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:margin-bottom}.
+ *
+ */
+public class FoMarginBottomAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:margin-bottom}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMarginBottomAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:margin-bottom}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:margin-bottom}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:margin-bottom} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginLeftAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginLeftAttribute.java
new file mode 100644
index 0000000..61f7f4c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginLeftAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:margin-left}.
+ *
+ */
+public class FoMarginLeftAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "margin-left");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:margin-left}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMarginLeftAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:margin-left}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:margin-left}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:margin-left} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginRightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginRightAttribute.java
new file mode 100644
index 0000000..f0c73ae
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginRightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:margin-right}.
+ *
+ */
+public class FoMarginRightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "margin-right");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:margin-right}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMarginRightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:margin-right}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:margin-right}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:margin-right} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginTopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginTopAttribute.java
new file mode 100644
index 0000000..768f3ac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMarginTopAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:margin-top}.
+ *
+ */
+public class FoMarginTopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "margin-top");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:margin-top}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMarginTopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:margin-top}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:margin-top}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:margin-top} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMaxHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMaxHeightAttribute.java
new file mode 100644
index 0000000..cb6be35
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMaxHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:max-height}.
+ *
+ */
+public class FoMaxHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "max-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:max-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMaxHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:max-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:max-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:max-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMaxWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMaxWidthAttribute.java
new file mode 100644
index 0000000..26ec6cc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMaxWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:max-width}.
+ *
+ */
+public class FoMaxWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "max-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:max-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMaxWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:max-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:max-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:max-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMinHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMinHeightAttribute.java
new file mode 100644
index 0000000..7d2a32b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMinHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:min-height}.
+ *
+ */
+public class FoMinHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "min-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:min-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMinHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:min-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:min-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:min-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMinWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMinWidthAttribute.java
new file mode 100644
index 0000000..2c5fc02
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoMinWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:min-width}.
+ *
+ */
+public class FoMinWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "min-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:min-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoMinWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:min-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:min-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:min-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoOrphansAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoOrphansAttribute.java
new file mode 100644
index 0000000..38baa82
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoOrphansAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:orphans}.
+ *
+ */
+public class FoOrphansAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "orphans");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:orphans}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoOrphansAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:orphans}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:orphans}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:orphans} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingAttribute.java
new file mode 100644
index 0000000..dfaf4a0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:padding}.
+ *
+ */
+public class FoPaddingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "padding");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:padding}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPaddingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:padding}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:padding}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:padding} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingBottomAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingBottomAttribute.java
new file mode 100644
index 0000000..50742a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingBottomAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:padding-bottom}.
+ *
+ */
+public class FoPaddingBottomAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:padding-bottom}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPaddingBottomAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:padding-bottom}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:padding-bottom}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:padding-bottom} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingLeftAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingLeftAttribute.java
new file mode 100644
index 0000000..72f6143
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingLeftAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:padding-left}.
+ *
+ */
+public class FoPaddingLeftAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "padding-left");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:padding-left}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPaddingLeftAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:padding-left}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:padding-left}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:padding-left} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingRightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingRightAttribute.java
new file mode 100644
index 0000000..d6cf467
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingRightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:padding-right}.
+ *
+ */
+public class FoPaddingRightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "padding-right");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:padding-right}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPaddingRightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:padding-right}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:padding-right}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:padding-right} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingTopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingTopAttribute.java
new file mode 100644
index 0000000..4b58f0f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPaddingTopAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:padding-top}.
+ *
+ */
+public class FoPaddingTopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "padding-top");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:padding-top}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPaddingTopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:padding-top}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:padding-top}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:padding-top} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPageHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPageHeightAttribute.java
new file mode 100644
index 0000000..7783a81
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPageHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:page-height}.
+ *
+ */
+public class FoPageHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "page-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:page-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPageHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:page-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:page-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:page-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPageWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPageWidthAttribute.java
new file mode 100644
index 0000000..764f4cb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoPageWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:page-width}.
+ *
+ */
+public class FoPageWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "page-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:page-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoPageWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:page-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:page-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:page-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoScriptAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoScriptAttribute.java
new file mode 100644
index 0000000..976dee6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoScriptAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:script}.
+ *
+ */
+public class FoScriptAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "script");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:script}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoScriptAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:script}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:script}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:script} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoSpaceAfterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoSpaceAfterAttribute.java
new file mode 100644
index 0000000..df153c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoSpaceAfterAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:space-after}.
+ *
+ */
+public class FoSpaceAfterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "space-after");
+	public static final String DEFAULT_VALUE = "0cm";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:space-after}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoSpaceAfterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:space-after}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:space-after}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:space-after} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoSpaceBeforeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoSpaceBeforeAttribute.java
new file mode 100644
index 0000000..9c2da39
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoSpaceBeforeAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:space-before}.
+ *
+ */
+public class FoSpaceBeforeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "space-before");
+	public static final String DEFAULT_VALUE = "0cm";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:space-before}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoSpaceBeforeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:space-before}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:space-before}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:space-before} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoStartIndentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoStartIndentAttribute.java
new file mode 100644
index 0000000..ac5d1c0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoStartIndentAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:start-indent}.
+ *
+ */
+public class FoStartIndentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "start-indent");
+	public static final String DEFAULT_VALUE = "0cm";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:start-indent}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoStartIndentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:start-indent}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:start-indent}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:start-indent} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextAlignAttribute.java
new file mode 100644
index 0000000..1d9e621
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:text-align}.
+ *
+ */
+public class FoTextAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "text-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:text-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoTextAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:text-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:text-align}.
+	 */
+	public enum Value {
+		CENTER("center"), END("end"), JUSTIFY("justify"), LEFT("left"), RIGHT("right"), START("start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:text-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:text-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextAlignLastAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextAlignLastAttribute.java
new file mode 100644
index 0000000..39bb289
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextAlignLastAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:text-align-last}.
+ *
+ */
+public class FoTextAlignLastAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "text-align-last");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:text-align-last}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoTextAlignLastAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:text-align-last}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:text-align-last}.
+	 */
+	public enum Value {
+		CENTER("center"), JUSTIFY("justify"), START("start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:text-align-last}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:text-align-last} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextIndentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextIndentAttribute.java
new file mode 100644
index 0000000..51666c5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextIndentAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:text-indent}.
+ *
+ */
+public class FoTextIndentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "text-indent");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:text-indent}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoTextIndentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:text-indent}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:text-indent}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:text-indent} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextShadowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextShadowAttribute.java
new file mode 100644
index 0000000..2b3d1b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextShadowAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:text-shadow}.
+ *
+ */
+public class FoTextShadowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "text-shadow");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:text-shadow}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoTextShadowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:text-shadow}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:text-shadow}.
+	 */
+	public enum Value {
+		NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:text-shadow}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:text-shadow} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextTransformAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextTransformAttribute.java
new file mode 100644
index 0000000..89aa7ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoTextTransformAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:text-transform}.
+ *
+ */
+public class FoTextTransformAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "text-transform");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:text-transform}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoTextTransformAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:text-transform}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:text-transform}.
+	 */
+	public enum Value {
+		CAPITALIZE("capitalize"), LOWERCASE("lowercase"), NONE("none"), UPPERCASE("uppercase") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:text-transform}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:text-transform} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWidowsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWidowsAttribute.java
new file mode 100644
index 0000000..ea9486e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWidowsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:widows}.
+ *
+ */
+public class FoWidowsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "widows");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:widows}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoWidowsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:widows}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:widows}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:widows} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWidthAttribute.java
new file mode 100644
index 0000000..1c8d085
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:width}.
+ *
+ */
+public class FoWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWrapOptionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWrapOptionAttribute.java
new file mode 100644
index 0000000..c21595e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/fo/FoWrapOptionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.fo;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute fo:wrap-option}.
+ *
+ */
+public class FoWrapOptionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FO, "wrap-option");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute fo:wrap-option}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FoWrapOptionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute fo:wrap-option}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute fo:wrap-option}.
+	 */
+	public enum Value {
+		NO_WRAP("no-wrap"), WRAP("wrap") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute fo:wrap-option}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute fo:wrap-option} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowDeletesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowDeletesAttribute.java
new file mode 100644
index 0000000..791b797
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowDeletesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:allow-deletes}.
+ *
+ */
+public class FormAllowDeletesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "allow-deletes");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:allow-deletes}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormAllowDeletesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:allow-deletes}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:allow-deletes}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:allow-deletes} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowInsertsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowInsertsAttribute.java
new file mode 100644
index 0000000..26611b8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowInsertsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:allow-inserts}.
+ *
+ */
+public class FormAllowInsertsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "allow-inserts");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:allow-inserts}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormAllowInsertsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:allow-inserts}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:allow-inserts}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:allow-inserts} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowUpdatesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowUpdatesAttribute.java
new file mode 100644
index 0000000..8e76908
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAllowUpdatesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:allow-updates}.
+ *
+ */
+public class FormAllowUpdatesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "allow-updates");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:allow-updates}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormAllowUpdatesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:allow-updates}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:allow-updates}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:allow-updates} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormApplyDesignModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormApplyDesignModeAttribute.java
new file mode 100644
index 0000000..6eb4bfb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormApplyDesignModeAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:apply-design-mode}.
+ *
+ */
+public class FormApplyDesignModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "apply-design-mode");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:apply-design-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormApplyDesignModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:apply-design-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:apply-design-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:apply-design-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormApplyFilterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormApplyFilterAttribute.java
new file mode 100644
index 0000000..52e09f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormApplyFilterAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:apply-filter}.
+ *
+ */
+public class FormApplyFilterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "apply-filter");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:apply-filter}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormApplyFilterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:apply-filter}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:apply-filter}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:apply-filter} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAutoCompleteAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAutoCompleteAttribute.java
new file mode 100644
index 0000000..17527b1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAutoCompleteAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:auto-complete}.
+ *
+ */
+public class FormAutoCompleteAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "auto-complete");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:auto-complete}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormAutoCompleteAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:auto-complete}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:auto-complete}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:auto-complete} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAutomaticFocusAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAutomaticFocusAttribute.java
new file mode 100644
index 0000000..2a5eb98
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormAutomaticFocusAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:automatic-focus}.
+ *
+ */
+public class FormAutomaticFocusAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "automatic-focus");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:automatic-focus}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormAutomaticFocusAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:automatic-focus}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:automatic-focus}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:automatic-focus} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormBoundColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormBoundColumnAttribute.java
new file mode 100644
index 0000000..51fc41c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormBoundColumnAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:bound-column}.
+ *
+ */
+public class FormBoundColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "bound-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:bound-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormBoundColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:bound-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:bound-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:bound-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormButtonTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormButtonTypeAttribute.java
new file mode 100644
index 0000000..b3848bf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormButtonTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:button-type}.
+ *
+ */
+public class FormButtonTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "button-type");
+	public static final String DEFAULT_VALUE = "push";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:button-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormButtonTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:button-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:button-type}.
+	 */
+	public enum Value {
+		PUSH("push"), RESET("reset"), SUBMIT("submit"), URL("url") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:button-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:button-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCommandAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCommandAttribute.java
new file mode 100644
index 0000000..9704cb9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCommandAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:command}.
+ *
+ */
+public class FormCommandAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "command");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:command}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormCommandAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:command}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:command}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:command} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCommandTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCommandTypeAttribute.java
new file mode 100644
index 0000000..06038e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCommandTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:command-type}.
+ *
+ */
+public class FormCommandTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "command-type");
+	public static final String DEFAULT_VALUE = "command";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:command-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormCommandTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:command-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:command-type}.
+	 */
+	public enum Value {
+		COMMAND("command"), QUERY("query"), TABLE("table") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:command-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:command-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormControlImplementationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormControlImplementationAttribute.java
new file mode 100644
index 0000000..6f17839
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormControlImplementationAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:control-implementation}.
+ *
+ */
+public class FormControlImplementationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "control-implementation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:control-implementation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormControlImplementationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:control-implementation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:control-implementation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:control-implementation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormConvertEmptyToNullAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormConvertEmptyToNullAttribute.java
new file mode 100644
index 0000000..1ea514e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormConvertEmptyToNullAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:convert-empty-to-null}.
+ *
+ */
+public class FormConvertEmptyToNullAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:convert-empty-to-null}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormConvertEmptyToNullAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:convert-empty-to-null}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:convert-empty-to-null}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:convert-empty-to-null} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentSelectedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentSelectedAttribute.java
new file mode 100644
index 0000000..f18c250
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentSelectedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:current-selected}.
+ *
+ */
+public class FormCurrentSelectedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "current-selected");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:current-selected}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormCurrentSelectedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:current-selected}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:current-selected}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:current-selected} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentStateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentStateAttribute.java
new file mode 100644
index 0000000..0d82a57
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentStateAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:current-state}.
+ *
+ */
+public class FormCurrentStateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "current-state");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:current-state}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormCurrentStateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:current-state}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:current-state}.
+	 */
+	public enum Value {
+		CHECKED("checked"), UNCHECKED("unchecked"), UNKNOWN("unknown") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:current-state}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:current-state} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentValueAttribute.java
new file mode 100644
index 0000000..12875dc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormCurrentValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:current-value}.
+ *
+ */
+public class FormCurrentValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "current-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:current-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormCurrentValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:current-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:current-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:current-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDataFieldAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDataFieldAttribute.java
new file mode 100644
index 0000000..37ba771
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDataFieldAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:data-field}.
+ *
+ */
+public class FormDataFieldAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "data-field");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:data-field}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDataFieldAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:data-field}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:data-field}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:data-field} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDatasourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDatasourceAttribute.java
new file mode 100644
index 0000000..ad7d7cb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDatasourceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:datasource}.
+ *
+ */
+public class FormDatasourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "datasource");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:datasource}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDatasourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:datasource}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:datasource}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:datasource} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDefaultButtonAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDefaultButtonAttribute.java
new file mode 100644
index 0000000..59c1b10
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDefaultButtonAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:default-button}.
+ *
+ */
+public class FormDefaultButtonAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "default-button");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:default-button}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDefaultButtonAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:default-button}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:default-button}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:default-button} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDelayForRepeatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDelayForRepeatAttribute.java
new file mode 100644
index 0000000..f6245dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDelayForRepeatAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:delay-for-repeat}.
+ *
+ */
+public class FormDelayForRepeatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "delay-for-repeat");
+	public static final String DEFAULT_VALUE = "PT0.050S";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:delay-for-repeat}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDelayForRepeatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:delay-for-repeat}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:delay-for-repeat}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:delay-for-repeat} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDetailFieldsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDetailFieldsAttribute.java
new file mode 100644
index 0000000..93727b3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDetailFieldsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:detail-fields}.
+ *
+ */
+public class FormDetailFieldsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "detail-fields");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:detail-fields}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDetailFieldsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:detail-fields}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:detail-fields}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:detail-fields} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDisabledAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDisabledAttribute.java
new file mode 100644
index 0000000..7b88e82
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDisabledAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:disabled}.
+ *
+ */
+public class FormDisabledAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "disabled");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:disabled}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDisabledAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:disabled}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:disabled}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:disabled} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDropdownAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDropdownAttribute.java
new file mode 100644
index 0000000..e51cd97
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormDropdownAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:dropdown}.
+ *
+ */
+public class FormDropdownAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "dropdown");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:dropdown}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormDropdownAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:dropdown}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:dropdown}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:dropdown} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEchoCharAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEchoCharAttribute.java
new file mode 100644
index 0000000..0be6ed7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEchoCharAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:echo-char}.
+ *
+ */
+public class FormEchoCharAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "echo-char");
+	public static final String DEFAULT_VALUE = "*";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:echo-char}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormEchoCharAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:echo-char}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:echo-char}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:echo-char} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEnctypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEnctypeAttribute.java
new file mode 100644
index 0000000..55aca2c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEnctypeAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:enctype}.
+ *
+ */
+public class FormEnctypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "enctype");
+	public static final String DEFAULT_VALUE = "application/x-www-form-urlencoded";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:enctype}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormEnctypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:enctype}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:enctype}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:enctype} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEscapeProcessingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEscapeProcessingAttribute.java
new file mode 100644
index 0000000..926ad93
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormEscapeProcessingAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:escape-processing}.
+ *
+ */
+public class FormEscapeProcessingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "escape-processing");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:escape-processing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormEscapeProcessingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:escape-processing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:escape-processing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:escape-processing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormFilterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormFilterAttribute.java
new file mode 100644
index 0000000..007f2e1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormFilterAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:filter}.
+ *
+ */
+public class FormFilterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "filter");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:filter}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormFilterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:filter}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:filter}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:filter} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormFocusOnClickAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormFocusOnClickAttribute.java
new file mode 100644
index 0000000..9eef773
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormFocusOnClickAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:focus-on-click}.
+ *
+ */
+public class FormFocusOnClickAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "focus-on-click");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:focus-on-click}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormFocusOnClickAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:focus-on-click}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:focus-on-click}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:focus-on-click} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormForAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormForAttribute.java
new file mode 100644
index 0000000..32d651a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormForAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:for}.
+ *
+ */
+public class FormForAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "for");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:for}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormForAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:for}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:for}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:for} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIdAttribute.java
new file mode 100644
index 0000000..e73e804
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:id}.
+ *
+ */
+public class FormIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIgnoreResultAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIgnoreResultAttribute.java
new file mode 100644
index 0000000..17ba7d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIgnoreResultAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:ignore-result}.
+ *
+ */
+public class FormIgnoreResultAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "ignore-result");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:ignore-result}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormIgnoreResultAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:ignore-result}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:ignore-result}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:ignore-result} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImageAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImageAlignAttribute.java
new file mode 100644
index 0000000..45ee746
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImageAlignAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:image-align}.
+ *
+ */
+public class FormImageAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "image-align");
+	public static final String DEFAULT_VALUE = "center";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:image-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormImageAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:image-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:image-align}.
+	 */
+	public enum Value {
+		CENTER("center"), END("end"), START("start") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:image-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:image-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImageDataAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImageDataAttribute.java
new file mode 100644
index 0000000..5a87854
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImageDataAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:image-data}.
+ *
+ */
+public class FormImageDataAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "image-data");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:image-data}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormImageDataAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:image-data}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:image-data}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:image-data} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImagePositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImagePositionAttribute.java
new file mode 100644
index 0000000..d24de69
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormImagePositionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:image-position}.
+ *
+ */
+public class FormImagePositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "image-position");
+	public static final String DEFAULT_VALUE = "center";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:image-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormImagePositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:image-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:image-position}.
+	 */
+	public enum Value {
+		BOTTOM("bottom"), CENTER("center"), END("end"), START("start"), TOP("top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:image-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:image-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIsTristateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIsTristateAttribute.java
new file mode 100644
index 0000000..beb9198
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormIsTristateAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:is-tristate}.
+ *
+ */
+public class FormIsTristateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "is-tristate");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:is-tristate}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormIsTristateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:is-tristate}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:is-tristate}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:is-tristate} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormLabelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormLabelAttribute.java
new file mode 100644
index 0000000..a9b7401
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormLabelAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:label}.
+ *
+ */
+public class FormLabelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "label");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:label}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormLabelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:label}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:label}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:label} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormLinkedCellAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormLinkedCellAttribute.java
new file mode 100644
index 0000000..e7c378a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormLinkedCellAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:linked-cell}.
+ *
+ */
+public class FormLinkedCellAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "linked-cell");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:linked-cell}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormLinkedCellAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:linked-cell}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:linked-cell}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:linked-cell} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListLinkageTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListLinkageTypeAttribute.java
new file mode 100644
index 0000000..cccf9d9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListLinkageTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:list-linkage-type}.
+ *
+ */
+public class FormListLinkageTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "list-linkage-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:list-linkage-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormListLinkageTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:list-linkage-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:list-linkage-type}.
+	 */
+	public enum Value {
+		SELECTION("selection"), SELECTION_INDICES("selection-indices") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:list-linkage-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:list-linkage-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListSourceAttribute.java
new file mode 100644
index 0000000..d06a0be
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListSourceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:list-source}.
+ *
+ */
+public class FormListSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "list-source");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:list-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormListSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:list-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:list-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:list-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListSourceTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListSourceTypeAttribute.java
new file mode 100644
index 0000000..d33b3ae
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormListSourceTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:list-source-type}.
+ *
+ */
+public class FormListSourceTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "list-source-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:list-source-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormListSourceTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:list-source-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:list-source-type}.
+	 */
+	public enum Value {
+		QUERY("query"), SQL("sql"), SQL_PASS_THROUGH("sql-pass-through"), TABLE("table"), TABLE_FIELDS("table-fields"), VALUE_LIST("value-list") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:list-source-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:list-source-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMasterFieldsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMasterFieldsAttribute.java
new file mode 100644
index 0000000..867476c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMasterFieldsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:master-fields}.
+ *
+ */
+public class FormMasterFieldsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "master-fields");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:master-fields}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMasterFieldsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:master-fields}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:master-fields}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:master-fields} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMaxLengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMaxLengthAttribute.java
new file mode 100644
index 0000000..b94be6a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMaxLengthAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:max-length}.
+ *
+ */
+public class FormMaxLengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "max-length");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:max-length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMaxLengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:max-length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:max-length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:max-length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMaxValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMaxValueAttribute.java
new file mode 100644
index 0000000..1b764f1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMaxValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:max-value}.
+ *
+ */
+public class FormMaxValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "max-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:max-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMaxValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:max-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:max-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:max-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMethodAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMethodAttribute.java
new file mode 100644
index 0000000..a38b984
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMethodAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:method}.
+ *
+ */
+public class FormMethodAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "method");
+	public static final String DEFAULT_VALUE = "get";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:method}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMethodAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:method}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:method}.
+	 */
+	public enum Value {
+		GET("get"), POST("post") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:method}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:method} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMinValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMinValueAttribute.java
new file mode 100644
index 0000000..205e835
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMinValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:min-value}.
+ *
+ */
+public class FormMinValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "min-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:min-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMinValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:min-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:min-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:min-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMultiLineAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMultiLineAttribute.java
new file mode 100644
index 0000000..0d87d28
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMultiLineAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:multi-line}.
+ *
+ */
+public class FormMultiLineAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "multi-line");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:multi-line}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMultiLineAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:multi-line}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:multi-line}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:multi-line} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMultipleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMultipleAttribute.java
new file mode 100644
index 0000000..90f7800
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormMultipleAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:multiple}.
+ *
+ */
+public class FormMultipleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "multiple");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:multiple}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormMultipleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:multiple}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:multiple}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:multiple} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormNameAttribute.java
new file mode 100644
index 0000000..90d0909
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:name}.
+ *
+ */
+public class FormNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormNavigationModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormNavigationModeAttribute.java
new file mode 100644
index 0000000..2ee3ae9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormNavigationModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:navigation-mode}.
+ *
+ */
+public class FormNavigationModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "navigation-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:navigation-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormNavigationModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:navigation-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:navigation-mode}.
+	 */
+	public enum Value {
+		CURRENT("current"), NONE("none"), PARENT("parent") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:navigation-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:navigation-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormOrderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormOrderAttribute.java
new file mode 100644
index 0000000..d9897d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormOrderAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:order}.
+ *
+ */
+public class FormOrderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "order");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:order}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormOrderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:order}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:order}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:order} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormOrientationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormOrientationAttribute.java
new file mode 100644
index 0000000..27ff189
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormOrientationAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:orientation}.
+ *
+ */
+public class FormOrientationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "orientation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:orientation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormOrientationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:orientation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:orientation}.
+	 */
+	public enum Value {
+		HORIZONTAL("horizontal"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:orientation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:orientation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPageStepSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPageStepSizeAttribute.java
new file mode 100644
index 0000000..71f2569
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPageStepSizeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:page-step-size}.
+ *
+ */
+public class FormPageStepSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "page-step-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:page-step-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormPageStepSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:page-step-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:page-step-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:page-step-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPrintableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPrintableAttribute.java
new file mode 100644
index 0000000..2f60b22
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPrintableAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:printable}.
+ *
+ */
+public class FormPrintableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "printable");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:printable}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormPrintableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:printable}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:printable}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:printable} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPropertyNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPropertyNameAttribute.java
new file mode 100644
index 0000000..3a9c4dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormPropertyNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:property-name}.
+ *
+ */
+public class FormPropertyNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "property-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:property-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormPropertyNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:property-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:property-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:property-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormReadonlyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormReadonlyAttribute.java
new file mode 100644
index 0000000..d07a098
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormReadonlyAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:readonly}.
+ *
+ */
+public class FormReadonlyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "readonly");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:readonly}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormReadonlyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:readonly}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:readonly}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:readonly} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormRepeatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormRepeatAttribute.java
new file mode 100644
index 0000000..b534d88
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormRepeatAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:repeat}.
+ *
+ */
+public class FormRepeatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "repeat");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:repeat}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormRepeatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:repeat}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:repeat}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:repeat} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSelectedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSelectedAttribute.java
new file mode 100644
index 0000000..0167024
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSelectedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:selected}.
+ *
+ */
+public class FormSelectedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "selected");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:selected}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormSelectedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:selected}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:selected}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:selected} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSizeAttribute.java
new file mode 100644
index 0000000..a37074c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSizeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:size}.
+ *
+ */
+public class FormSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSourceCellRangeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSourceCellRangeAttribute.java
new file mode 100644
index 0000000..fc0a83a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSourceCellRangeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:source-cell-range}.
+ *
+ */
+public class FormSourceCellRangeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "source-cell-range");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:source-cell-range}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormSourceCellRangeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:source-cell-range}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:source-cell-range}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:source-cell-range} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSpinButtonAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSpinButtonAttribute.java
new file mode 100644
index 0000000..e400141
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormSpinButtonAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:spin-button}.
+ *
+ */
+public class FormSpinButtonAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "spin-button");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:spin-button}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormSpinButtonAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:spin-button}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:spin-button}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:spin-button} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormStateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormStateAttribute.java
new file mode 100644
index 0000000..a0a98c7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormStateAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:state}.
+ *
+ */
+public class FormStateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "state");
+	public static final String DEFAULT_VALUE = "unchecked";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:state}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormStateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:state}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:state}.
+	 */
+	public enum Value {
+		CHECKED("checked"), UNCHECKED("unchecked"), UNKNOWN("unknown") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:state}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:state} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormStepSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormStepSizeAttribute.java
new file mode 100644
index 0000000..b48d3a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormStepSizeAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:step-size}.
+ *
+ */
+public class FormStepSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "step-size");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:step-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormStepSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:step-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:step-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:step-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabCycleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabCycleAttribute.java
new file mode 100644
index 0000000..282d4c6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabCycleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:tab-cycle}.
+ *
+ */
+public class FormTabCycleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "tab-cycle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:tab-cycle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormTabCycleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:tab-cycle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:tab-cycle}.
+	 */
+	public enum Value {
+		CURRENT("current"), PAGE("page"), RECORDS("records") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:tab-cycle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:tab-cycle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabIndexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabIndexAttribute.java
new file mode 100644
index 0000000..aeb68f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabIndexAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:tab-index}.
+ *
+ */
+public class FormTabIndexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "tab-index");
+	public static final String DEFAULT_VALUE = "0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:tab-index}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormTabIndexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:tab-index}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:tab-index}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:tab-index} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabStopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabStopAttribute.java
new file mode 100644
index 0000000..0f648c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTabStopAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:tab-stop}.
+ *
+ */
+public class FormTabStopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "tab-stop");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:tab-stop}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormTabStopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:tab-stop}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:tab-stop}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:tab-stop} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTextStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTextStyleNameAttribute.java
new file mode 100644
index 0000000..813f313
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTextStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:text-style-name}.
+ *
+ */
+public class FormTextStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "text-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:text-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormTextStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:text-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:text-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:text-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTitleAttribute.java
new file mode 100644
index 0000000..a8cfb32
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:title}.
+ *
+ */
+public class FormTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormToggleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormToggleAttribute.java
new file mode 100644
index 0000000..da5b4b5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormToggleAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:toggle}.
+ *
+ */
+public class FormToggleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "toggle");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:toggle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormToggleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:toggle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:toggle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:toggle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormValidationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormValidationAttribute.java
new file mode 100644
index 0000000..af2a0e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormValidationAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:validation}.
+ *
+ */
+public class FormValidationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "validation");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:validation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormValidationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:validation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:validation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:validation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormValueAttribute.java
new file mode 100644
index 0000000..a260e32
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:value}.
+ *
+ */
+public class FormValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormVisualEffectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormVisualEffectAttribute.java
new file mode 100644
index 0000000..9df6cad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormVisualEffectAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:visual-effect}.
+ *
+ */
+public class FormVisualEffectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "visual-effect");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:visual-effect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormVisualEffectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:visual-effect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute form:visual-effect}.
+	 */
+	public enum Value {
+		_3D("3d"), FLAT("flat") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:visual-effect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:visual-effect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormXformsListSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormXformsListSourceAttribute.java
new file mode 100644
index 0000000..03a3aff
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormXformsListSourceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:xforms-list-source}.
+ *
+ */
+public class FormXformsListSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "xforms-list-source");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:xforms-list-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormXformsListSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:xforms-list-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:xforms-list-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:xforms-list-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormXformsSubmissionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormXformsSubmissionAttribute.java
new file mode 100644
index 0000000..2624e6d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/form/FormXformsSubmissionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.form;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute form:xforms-submission}.
+ *
+ */
+public class FormXformsSubmissionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "xforms-submission");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute form:xforms-submission}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FormXformsSubmissionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute form:xforms-submission}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute form:xforms-submission}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute form:xforms-submission} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/grddl/GrddlTransformationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/grddl/GrddlTransformationAttribute.java
new file mode 100644
index 0000000..5b6af8d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/grddl/GrddlTransformationAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.grddl;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute grddl:transformation}.
+ *
+ */
+public class GrddlTransformationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.GRDDL, "transformation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute grddl:transformation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public GrddlTransformationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute grddl:transformation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute grddl:transformation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute grddl:transformation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaCellCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaCellCountAttribute.java
new file mode 100644
index 0000000..5d84568
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaCellCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:cell-count}.
+ *
+ */
+public class MetaCellCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "cell-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:cell-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaCellCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:cell-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:cell-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:cell-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaCharacterCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaCharacterCountAttribute.java
new file mode 100644
index 0000000..d066ec5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaCharacterCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:character-count}.
+ *
+ */
+public class MetaCharacterCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "character-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:character-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaCharacterCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:character-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:character-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:character-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDateAttribute.java
new file mode 100644
index 0000000..914313b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDateAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:date}.
+ *
+ */
+public class MetaDateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "date");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:date}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaDateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:date}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:date}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:date} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDelayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDelayAttribute.java
new file mode 100644
index 0000000..4c3706d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDelayAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:delay}.
+ *
+ */
+public class MetaDelayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "delay");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:delay}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaDelayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:delay}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:delay}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:delay} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDrawCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDrawCountAttribute.java
new file mode 100644
index 0000000..a05ab76
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaDrawCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:draw-count}.
+ *
+ */
+public class MetaDrawCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "draw-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:draw-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaDrawCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:draw-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:draw-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:draw-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaFrameCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaFrameCountAttribute.java
new file mode 100644
index 0000000..86c40c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaFrameCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:frame-count}.
+ *
+ */
+public class MetaFrameCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "frame-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:frame-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaFrameCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:frame-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:frame-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:frame-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaImageCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaImageCountAttribute.java
new file mode 100644
index 0000000..2ad688d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaImageCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:image-count}.
+ *
+ */
+public class MetaImageCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "image-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:image-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaImageCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:image-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:image-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:image-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaNameAttribute.java
new file mode 100644
index 0000000..24c1725
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:name}.
+ *
+ */
+public class MetaNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaNonWhitespaceCharacterCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaNonWhitespaceCharacterCountAttribute.java
new file mode 100644
index 0000000..3e04e84
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaNonWhitespaceCharacterCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:non-whitespace-character-count}.
+ *
+ */
+public class MetaNonWhitespaceCharacterCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "non-whitespace-character-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:non-whitespace-character-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaNonWhitespaceCharacterCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:non-whitespace-character-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:non-whitespace-character-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:non-whitespace-character-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaObjectCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaObjectCountAttribute.java
new file mode 100644
index 0000000..847cf68
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaObjectCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:object-count}.
+ *
+ */
+public class MetaObjectCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "object-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:object-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaObjectCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:object-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:object-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:object-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaOleObjectCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaOleObjectCountAttribute.java
new file mode 100644
index 0000000..27f2252
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaOleObjectCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:ole-object-count}.
+ *
+ */
+public class MetaOleObjectCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "ole-object-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:ole-object-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaOleObjectCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:ole-object-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:ole-object-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:ole-object-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaPageCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaPageCountAttribute.java
new file mode 100644
index 0000000..17f163c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaPageCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:page-count}.
+ *
+ */
+public class MetaPageCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "page-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:page-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaPageCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:page-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:page-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:page-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaParagraphCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaParagraphCountAttribute.java
new file mode 100644
index 0000000..e8e8d63
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaParagraphCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:paragraph-count}.
+ *
+ */
+public class MetaParagraphCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "paragraph-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:paragraph-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaParagraphCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:paragraph-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:paragraph-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:paragraph-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaRowCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaRowCountAttribute.java
new file mode 100644
index 0000000..009e3b6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaRowCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:row-count}.
+ *
+ */
+public class MetaRowCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "row-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:row-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaRowCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:row-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:row-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:row-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaSentenceCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaSentenceCountAttribute.java
new file mode 100644
index 0000000..e12660f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaSentenceCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:sentence-count}.
+ *
+ */
+public class MetaSentenceCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "sentence-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:sentence-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaSentenceCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:sentence-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:sentence-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:sentence-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaSyllableCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaSyllableCountAttribute.java
new file mode 100644
index 0000000..2c17e07
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaSyllableCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:syllable-count}.
+ *
+ */
+public class MetaSyllableCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "syllable-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:syllable-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaSyllableCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:syllable-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:syllable-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:syllable-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaTableCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaTableCountAttribute.java
new file mode 100644
index 0000000..451efca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaTableCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:table-count}.
+ *
+ */
+public class MetaTableCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "table-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:table-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaTableCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:table-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:table-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:table-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaValueTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaValueTypeAttribute.java
new file mode 100644
index 0000000..87e3c1c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaValueTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:value-type}.
+ *
+ */
+public class MetaValueTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "value-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:value-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaValueTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:value-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute meta:value-type}.
+	 */
+	public enum Value {
+		BOOLEAN("boolean"), DATE("date"), FLOAT("float"), STRING("string"), TIME("time") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:value-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:value-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaWordCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaWordCountAttribute.java
new file mode 100644
index 0000000..303a86d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/meta/MetaWordCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.meta;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute meta:word-count}.
+ *
+ */
+public class MetaWordCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.META, "word-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute meta:word-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MetaWordCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute meta:word-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute meta:word-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute meta:word-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberAutomaticOrderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberAutomaticOrderAttribute.java
new file mode 100644
index 0000000..192c4f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberAutomaticOrderAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:automatic-order}.
+ *
+ */
+public class NumberAutomaticOrderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "automatic-order");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:automatic-order}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberAutomaticOrderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:automatic-order}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:automatic-order}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:automatic-order} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberCalendarAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberCalendarAttribute.java
new file mode 100644
index 0000000..8b2d51f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberCalendarAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:calendar}.
+ *
+ */
+public class NumberCalendarAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "calendar");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:calendar}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberCalendarAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:calendar}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute number:calendar}.
+	 */
+	public enum Value {
+		ROC("ROC"), BUDDHIST("buddhist"), GENGOU("gengou"), GREGORIAN("gregorian"), HANJA("hanja"), HANJA_YOIL("hanja_yoil"), HIJRI("hijri"), JEWISH("jewish") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:calendar}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:calendar} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberCountryAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberCountryAttribute.java
new file mode 100644
index 0000000..b02348b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberCountryAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:country}.
+ *
+ */
+public class NumberCountryAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "country");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:country}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberCountryAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:country}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:country}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:country} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDecimalPlacesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDecimalPlacesAttribute.java
new file mode 100644
index 0000000..1fa355e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDecimalPlacesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:decimal-places}.
+ *
+ */
+public class NumberDecimalPlacesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "decimal-places");
+	public static final String DEFAULT_VALUE = "0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:decimal-places}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberDecimalPlacesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:decimal-places}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:decimal-places}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:decimal-places} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDecimalReplacementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDecimalReplacementAttribute.java
new file mode 100644
index 0000000..2480747
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDecimalReplacementAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:decimal-replacement}.
+ *
+ */
+public class NumberDecimalReplacementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "decimal-replacement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:decimal-replacement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberDecimalReplacementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:decimal-replacement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:decimal-replacement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:decimal-replacement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDenominatorValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDenominatorValueAttribute.java
new file mode 100644
index 0000000..443a89b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDenominatorValueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:denominator-value}.
+ *
+ */
+public class NumberDenominatorValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "denominator-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:denominator-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberDenominatorValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:denominator-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:denominator-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:denominator-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDisplayFactorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDisplayFactorAttribute.java
new file mode 100644
index 0000000..9ad86ee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberDisplayFactorAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:display-factor}.
+ *
+ */
+public class NumberDisplayFactorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "display-factor");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:display-factor}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberDisplayFactorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:display-factor}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:display-factor}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:display-factor} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberFormatSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberFormatSourceAttribute.java
new file mode 100644
index 0000000..eff57ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberFormatSourceAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:format-source}.
+ *
+ */
+public class NumberFormatSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "format-source");
+	public static final String DEFAULT_VALUE = "fixed";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:format-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberFormatSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:format-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute number:format-source}.
+	 */
+	public enum Value {
+		FIXED("fixed"), LANGUAGE("language") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:format-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:format-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberGroupingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberGroupingAttribute.java
new file mode 100644
index 0000000..f6054c7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberGroupingAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:grouping}.
+ *
+ */
+public class NumberGroupingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "grouping");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:grouping}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberGroupingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:grouping}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:grouping}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:grouping} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberLanguageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberLanguageAttribute.java
new file mode 100644
index 0000000..bee9316
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberLanguageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:language}.
+ *
+ */
+public class NumberLanguageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "language");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:language}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberLanguageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:language}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:language}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:language} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinDenominatorDigitsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinDenominatorDigitsAttribute.java
new file mode 100644
index 0000000..fa617b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinDenominatorDigitsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:min-denominator-digits}.
+ *
+ */
+public class NumberMinDenominatorDigitsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "min-denominator-digits");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:min-denominator-digits}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberMinDenominatorDigitsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:min-denominator-digits}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:min-denominator-digits}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:min-denominator-digits} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinExponentDigitsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinExponentDigitsAttribute.java
new file mode 100644
index 0000000..1795dcb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinExponentDigitsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:min-exponent-digits}.
+ *
+ */
+public class NumberMinExponentDigitsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "min-exponent-digits");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:min-exponent-digits}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberMinExponentDigitsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:min-exponent-digits}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:min-exponent-digits}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:min-exponent-digits} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinIntegerDigitsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinIntegerDigitsAttribute.java
new file mode 100644
index 0000000..0aa26f6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinIntegerDigitsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:min-integer-digits}.
+ *
+ */
+public class NumberMinIntegerDigitsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "min-integer-digits");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:min-integer-digits}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberMinIntegerDigitsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:min-integer-digits}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:min-integer-digits}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:min-integer-digits} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinNumeratorDigitsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinNumeratorDigitsAttribute.java
new file mode 100644
index 0000000..72d502f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberMinNumeratorDigitsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:min-numerator-digits}.
+ *
+ */
+public class NumberMinNumeratorDigitsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "min-numerator-digits");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:min-numerator-digits}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberMinNumeratorDigitsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:min-numerator-digits}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:min-numerator-digits}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:min-numerator-digits} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberPositionAttribute.java
new file mode 100644
index 0000000..c76b5f6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberPositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:position}.
+ *
+ */
+public class NumberPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberPossessiveFormAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberPossessiveFormAttribute.java
new file mode 100644
index 0000000..f08261b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberPossessiveFormAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:possessive-form}.
+ *
+ */
+public class NumberPossessiveFormAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "possessive-form");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:possessive-form}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberPossessiveFormAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:possessive-form}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:possessive-form}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:possessive-form} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberRfcLanguageTagAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberRfcLanguageTagAttribute.java
new file mode 100644
index 0000000..388501b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberRfcLanguageTagAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:rfc-language-tag}.
+ *
+ */
+public class NumberRfcLanguageTagAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:rfc-language-tag}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberRfcLanguageTagAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:rfc-language-tag}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:rfc-language-tag}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:rfc-language-tag} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberScriptAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberScriptAttribute.java
new file mode 100644
index 0000000..c6cfd88
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberScriptAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:script}.
+ *
+ */
+public class NumberScriptAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "script");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:script}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberScriptAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:script}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:script}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:script} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberStyleAttribute.java
new file mode 100644
index 0000000..c9fd240
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:style}.
+ *
+ */
+public class NumberStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute number:style}.
+	 */
+	public enum Value {
+		LONG("long"), SHORT("short") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTextualAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTextualAttribute.java
new file mode 100644
index 0000000..5b2bbdb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTextualAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:textual}.
+ *
+ */
+public class NumberTextualAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "textual");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:textual}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTextualAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:textual}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:textual}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:textual} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTitleAttribute.java
new file mode 100644
index 0000000..b66b20b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:title}.
+ *
+ */
+public class NumberTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationCountryAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationCountryAttribute.java
new file mode 100644
index 0000000..0593e00
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationCountryAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:transliteration-country}.
+ *
+ */
+public class NumberTransliterationCountryAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "transliteration-country");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:transliteration-country}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTransliterationCountryAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:transliteration-country}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:transliteration-country}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:transliteration-country} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationFormatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationFormatAttribute.java
new file mode 100644
index 0000000..0362b34
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationFormatAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:transliteration-format}.
+ *
+ */
+public class NumberTransliterationFormatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "transliteration-format");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:transliteration-format}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTransliterationFormatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:transliteration-format}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:transliteration-format}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:transliteration-format} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationLanguageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationLanguageAttribute.java
new file mode 100644
index 0000000..84f184e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationLanguageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:transliteration-language}.
+ *
+ */
+public class NumberTransliterationLanguageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "transliteration-language");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:transliteration-language}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTransliterationLanguageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:transliteration-language}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:transliteration-language}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:transliteration-language} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationStyleAttribute.java
new file mode 100644
index 0000000..76b7ee0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTransliterationStyleAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:transliteration-style}.
+ *
+ */
+public class NumberTransliterationStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "transliteration-style");
+	public static final String DEFAULT_VALUE = "short";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:transliteration-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTransliterationStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:transliteration-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute number:transliteration-style}.
+	 */
+	public enum Value {
+		LONG("long"), MEDIUM("medium"), SHORT("short") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:transliteration-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:transliteration-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTruncateOnOverflowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTruncateOnOverflowAttribute.java
new file mode 100644
index 0000000..f799376
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/number/NumberTruncateOnOverflowAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.number;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute number:truncate-on-overflow}.
+ *
+ */
+public class NumberTruncateOnOverflowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "truncate-on-overflow");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute number:truncate-on-overflow}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public NumberTruncateOnOverflowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute number:truncate-on-overflow}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute number:truncate-on-overflow}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute number:truncate-on-overflow} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeAutomaticUpdateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeAutomaticUpdateAttribute.java
new file mode 100644
index 0000000..228a514
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeAutomaticUpdateAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:automatic-update}.
+ *
+ */
+public class OfficeAutomaticUpdateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "automatic-update");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:automatic-update}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeAutomaticUpdateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:automatic-update}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:automatic-update}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:automatic-update} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeBooleanValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeBooleanValueAttribute.java
new file mode 100644
index 0000000..fda2607
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeBooleanValueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:boolean-value}.
+ *
+ */
+public class OfficeBooleanValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "boolean-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:boolean-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeBooleanValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:boolean-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:boolean-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:boolean-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeConversionModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeConversionModeAttribute.java
new file mode 100644
index 0000000..fd2c509
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeConversionModeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:conversion-mode}.
+ *
+ */
+public class OfficeConversionModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "conversion-mode");
+	public static final String DEFAULT_VALUE = "into-default-style-data-style";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:conversion-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeConversionModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:conversion-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute office:conversion-mode}.
+	 */
+	public enum Value {
+		INTO_DEFAULT_STYLE_DATA_STYLE("into-default-style-data-style"), INTO_ENGLISH_NUMBER("into-english-number"), KEEP_TEXT("keep-text") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:conversion-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:conversion-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeCurrencyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeCurrencyAttribute.java
new file mode 100644
index 0000000..3b7e2d4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeCurrencyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:currency}.
+ *
+ */
+public class OfficeCurrencyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "currency");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:currency}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeCurrencyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:currency}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:currency}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:currency} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDateValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDateValueAttribute.java
new file mode 100644
index 0000000..17e184d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDateValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:date-value}.
+ *
+ */
+public class OfficeDateValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "date-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:date-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDateValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:date-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:date-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:date-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeApplicationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeApplicationAttribute.java
new file mode 100644
index 0000000..b7df1ec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeApplicationAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:dde-application}.
+ *
+ */
+public class OfficeDdeApplicationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "dde-application");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:dde-application}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDdeApplicationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:dde-application}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:dde-application}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:dde-application} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeItemAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeItemAttribute.java
new file mode 100644
index 0000000..9a020b1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeItemAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:dde-item}.
+ *
+ */
+public class OfficeDdeItemAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "dde-item");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:dde-item}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDdeItemAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:dde-item}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:dde-item}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:dde-item} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeTopicAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeTopicAttribute.java
new file mode 100644
index 0000000..662fadd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDdeTopicAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:dde-topic}.
+ *
+ */
+public class OfficeDdeTopicAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "dde-topic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:dde-topic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDdeTopicAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:dde-topic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:dde-topic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:dde-topic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDisplayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDisplayAttribute.java
new file mode 100644
index 0000000..aff94c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeDisplayAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:display}.
+ *
+ */
+public class OfficeDisplayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "display");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:display}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDisplayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:display}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:display}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:display} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeMimetypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeMimetypeAttribute.java
new file mode 100644
index 0000000..3210344
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeMimetypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:mimetype}.
+ *
+ */
+public class OfficeMimetypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "mimetype");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:mimetype}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeMimetypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:mimetype}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:mimetype}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:mimetype} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeNameAttribute.java
new file mode 100644
index 0000000..5a729f7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:name}.
+ *
+ */
+public class OfficeNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeServerMapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeServerMapAttribute.java
new file mode 100644
index 0000000..41db53f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeServerMapAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:server-map}.
+ *
+ */
+public class OfficeServerMapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "server-map");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:server-map}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeServerMapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:server-map}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:server-map}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:server-map} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeStringValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeStringValueAttribute.java
new file mode 100644
index 0000000..1aef7e2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeStringValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:string-value}.
+ *
+ */
+public class OfficeStringValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "string-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:string-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeStringValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:string-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:string-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:string-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTargetFrameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTargetFrameAttribute.java
new file mode 100644
index 0000000..d2f15e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTargetFrameAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:target-frame}.
+ *
+ */
+public class OfficeTargetFrameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "target-frame");
+	public static final String DEFAULT_VALUE = "_blank";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:target-frame}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeTargetFrameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:target-frame}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute office:target-frame}.
+	 */
+	public enum Value {
+		BLANK("_blank"), PARENT("_parent"), SELF("_self"), TOP("_top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:target-frame}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:target-frame} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTargetFrameNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTargetFrameNameAttribute.java
new file mode 100644
index 0000000..87999f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTargetFrameNameAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:target-frame-name}.
+ *
+ */
+public class OfficeTargetFrameNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "target-frame-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:target-frame-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeTargetFrameNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:target-frame-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute office:target-frame-name}.
+	 */
+	public enum Value {
+		BLANK("_blank"), PARENT("_parent"), SELF("_self"), TOP("_top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:target-frame-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:target-frame-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTimeValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTimeValueAttribute.java
new file mode 100644
index 0000000..4787198
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTimeValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:time-value}.
+ *
+ */
+public class OfficeTimeValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "time-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:time-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeTimeValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:time-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:time-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:time-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTitleAttribute.java
new file mode 100644
index 0000000..3e2da94
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:title}.
+ *
+ */
+public class OfficeTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeValueAttribute.java
new file mode 100644
index 0000000..1c55251
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeValueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:value}.
+ *
+ */
+public class OfficeValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeValueTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeValueTypeAttribute.java
new file mode 100644
index 0000000..09dc189
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeValueTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:value-type}.
+ *
+ */
+public class OfficeValueTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "value-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:value-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeValueTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:value-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute office:value-type}.
+	 */
+	public enum Value {
+		BOOLEAN("boolean"), CURRENCY("currency"), DATE("date"), FLOAT("float"), PERCENTAGE("percentage"), STRING("string"), TIME("time"), VOID("void") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:value-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:value-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeVersionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeVersionAttribute.java
new file mode 100644
index 0000000..0247c97
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/office/OfficeVersionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.office;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute office:version}.
+ *
+ */
+public class OfficeVersionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "version");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute office:version}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public OfficeVersionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute office:version}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute office:version}.
+	 */
+	public enum Value {
+		_1_2("1.2") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute office:version}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute office:version} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationActionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationActionAttribute.java
new file mode 100644
index 0000000..6dfc76f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationActionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:action}.
+ *
+ */
+public class PresentationActionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "action");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:action}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationActionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:action}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:action}.
+	 */
+	public enum Value {
+		EXECUTE("execute"), FADE_OUT("fade-out"), FIRST_PAGE("first-page"), HIDE("hide"), LAST_PAGE("last-page"), LAST_VISITED_PAGE("last-visited-page"), NEXT_PAGE("next-page"), NONE("none"), PREVIOUS_PAGE("previous-page"), SHOW("show"), SOUND("sound"), STOP("stop"), VERB("verb") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:action}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:action} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationAnimationsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationAnimationsAttribute.java
new file mode 100644
index 0000000..d817930
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationAnimationsAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:animations}.
+ *
+ */
+public class PresentationAnimationsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "animations");
+	public static final String DEFAULT_VALUE = "enabled";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:animations}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationAnimationsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:animations}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:animations}.
+	 */
+	public enum Value {
+		DISABLED("disabled"), ENABLED("enabled") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:animations}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:animations} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationBackgroundObjectsVisibleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationBackgroundObjectsVisibleAttribute.java
new file mode 100644
index 0000000..6c12950
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationBackgroundObjectsVisibleAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:background-objects-visible}.
+ *
+ */
+public class PresentationBackgroundObjectsVisibleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "background-objects-visible");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:background-objects-visible}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationBackgroundObjectsVisibleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:background-objects-visible}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:background-objects-visible}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:background-objects-visible} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationBackgroundVisibleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationBackgroundVisibleAttribute.java
new file mode 100644
index 0000000..b28cdd1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationBackgroundVisibleAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:background-visible}.
+ *
+ */
+public class PresentationBackgroundVisibleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "background-visible");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:background-visible}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationBackgroundVisibleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:background-visible}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:background-visible}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:background-visible} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationClassAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationClassAttribute.java
new file mode 100644
index 0000000..5eee3a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationClassAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:class}.
+ *
+ */
+public class PresentationClassAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "class");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:class}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationClassAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:class}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:class}.
+	 */
+	public enum Value {
+		CHART("chart"), DATE_TIME("date-time"), FOOTER("footer"), GRAPHIC("graphic"), HANDOUT("handout"), HEADER("header"), NOTES("notes"), OBJECT("object"), ORGCHART("orgchart"), OUTLINE("outline"), PAGE("page"), PAGE_NUMBER("page-number"), SUBTITLE("subtitle"), TABLE("table"), TEXT("text"), TITLE("title") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:class}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:class} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationClassNamesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationClassNamesAttribute.java
new file mode 100644
index 0000000..9b69dd3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationClassNamesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:class-names}.
+ *
+ */
+public class PresentationClassNamesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "class-names");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:class-names}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationClassNamesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:class-names}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:class-names}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:class-names} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDelayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDelayAttribute.java
new file mode 100644
index 0000000..7d810d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDelayAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:delay}.
+ *
+ */
+public class PresentationDelayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "delay");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:delay}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDelayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:delay}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:delay}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:delay} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDirectionAttribute.java
new file mode 100644
index 0000000..33d2a6c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDirectionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:direction}.
+ *
+ */
+public class PresentationDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "direction");
+	public static final String DEFAULT_VALUE = "none";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:direction}.
+	 */
+	public enum Value {
+		CLOCKWISE("clockwise"), COUNTER_CLOCKWISE("counter-clockwise"), FROM_BOTTOM("from-bottom"), FROM_CENTER("from-center"), FROM_LEFT("from-left"), FROM_LOWER_LEFT("from-lower-left"), FROM_LOWER_RIGHT("from-lower-right"), FROM_RIGHT("from-right"), FROM_TOP("from-top"), FROM_UPPER_LEFT("from-upper-left"), FROM_UPPER_RIGHT("from-upper-right"), HORIZONTAL("horizontal"), NONE("none"), PATH("path"), SPIRAL_INWARD_LEFT("spiral-inward-left"), SPIRAL_INWARD_RIGHT("spiral-inward-right"), SPIRAL_OUTWARD_LEFT("spiral-outward-left"), SPIRAL_OUTWARD_RIGHT("spiral-outward-right"), TO_BOTTOM("to-bottom"), TO_CENTER("to-center"), TO_LEFT("to-left"), TO_LOWER_LEFT("to-lower-left"), TO_LOWER_RIGHT("to-lower-right"), TO_RIGHT("to-right"), TO_TOP("to-top"), TO_UPPER_LEFT("to-upper-left"), TO_UPPER_RIGHT("to-upper-right"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayDateTimeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayDateTimeAttribute.java
new file mode 100644
index 0000000..9dd8fa7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayDateTimeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:display-date-time}.
+ *
+ */
+public class PresentationDisplayDateTimeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-date-time");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:display-date-time}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDisplayDateTimeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:display-date-time}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:display-date-time}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:display-date-time} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayFooterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayFooterAttribute.java
new file mode 100644
index 0000000..d6947d0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayFooterAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:display-footer}.
+ *
+ */
+public class PresentationDisplayFooterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-footer");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:display-footer}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDisplayFooterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:display-footer}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:display-footer}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:display-footer} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayHeaderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayHeaderAttribute.java
new file mode 100644
index 0000000..13e2e75
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayHeaderAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:display-header}.
+ *
+ */
+public class PresentationDisplayHeaderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-header");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:display-header}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDisplayHeaderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:display-header}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:display-header}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:display-header} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayPageNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayPageNumberAttribute.java
new file mode 100644
index 0000000..a11de40
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDisplayPageNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:display-page-number}.
+ *
+ */
+public class PresentationDisplayPageNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-page-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:display-page-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDisplayPageNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:display-page-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:display-page-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:display-page-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDurationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDurationAttribute.java
new file mode 100644
index 0000000..c1f0ed4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationDurationAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:duration}.
+ *
+ */
+public class PresentationDurationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "duration");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:duration}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDurationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:duration}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:duration}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:duration} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationEffectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationEffectAttribute.java
new file mode 100644
index 0000000..b4e3462
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationEffectAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:effect}.
+ *
+ */
+public class PresentationEffectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "effect");
+	public static final String DEFAULT_VALUE = "none";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:effect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationEffectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:effect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:effect}.
+	 */
+	public enum Value {
+		APPEAR("appear"), CHECKERBOARD("checkerboard"), CLOSE("close"), DISSOLVE("dissolve"), FADE("fade"), HIDE("hide"), LASER("laser"), LINES("lines"), MOVE("move"), MOVE_SHORT("move-short"), NONE("none"), OPEN("open"), RANDOM("random"), ROTATE("rotate"), STRETCH("stretch"), STRIPES("stripes"), WAVYLINE("wavyline") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:effect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:effect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationEndlessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationEndlessAttribute.java
new file mode 100644
index 0000000..4c86b50
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationEndlessAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:endless}.
+ *
+ */
+public class PresentationEndlessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "endless");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:endless}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationEndlessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:endless}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:endless}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:endless} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationForceManualAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationForceManualAttribute.java
new file mode 100644
index 0000000..182dd24
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationForceManualAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:force-manual}.
+ *
+ */
+public class PresentationForceManualAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "force-manual");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:force-manual}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationForceManualAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:force-manual}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:force-manual}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:force-manual} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationFullScreenAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationFullScreenAttribute.java
new file mode 100644
index 0000000..a6f7ccf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationFullScreenAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:full-screen}.
+ *
+ */
+public class PresentationFullScreenAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "full-screen");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:full-screen}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationFullScreenAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:full-screen}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:full-screen}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:full-screen} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationGroupIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationGroupIdAttribute.java
new file mode 100644
index 0000000..42b1706
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationGroupIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:group-id}.
+ *
+ */
+public class PresentationGroupIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "group-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:group-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationGroupIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:group-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:group-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:group-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMasterElementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMasterElementAttribute.java
new file mode 100644
index 0000000..ce213b5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMasterElementAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:master-element}.
+ *
+ */
+public class PresentationMasterElementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "master-element");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:master-element}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationMasterElementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:master-element}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:master-element}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:master-element} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMouseAsPenAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMouseAsPenAttribute.java
new file mode 100644
index 0000000..951a35a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMouseAsPenAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:mouse-as-pen}.
+ *
+ */
+public class PresentationMouseAsPenAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "mouse-as-pen");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:mouse-as-pen}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationMouseAsPenAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:mouse-as-pen}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:mouse-as-pen}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:mouse-as-pen} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMouseVisibleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMouseVisibleAttribute.java
new file mode 100644
index 0000000..b3006ef
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationMouseVisibleAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:mouse-visible}.
+ *
+ */
+public class PresentationMouseVisibleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "mouse-visible");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:mouse-visible}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationMouseVisibleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:mouse-visible}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:mouse-visible}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:mouse-visible} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationNameAttribute.java
new file mode 100644
index 0000000..d83e950
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:name}.
+ *
+ */
+public class PresentationNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationNodeTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationNodeTypeAttribute.java
new file mode 100644
index 0000000..8bdb889
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationNodeTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:node-type}.
+ *
+ */
+public class PresentationNodeTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "node-type");
+	public static final String DEFAULT_VALUE = "default";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:node-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationNodeTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:node-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:node-type}.
+	 */
+	public enum Value {
+		AFTER_PREVIOUS("after-previous"), DEFAULT("default"), INTERACTIVE_SEQUENCE("interactive-sequence"), MAIN_SEQUENCE("main-sequence"), ON_CLICK("on-click"), TIMING_ROOT("timing-root"), WITH_PREVIOUS("with-previous") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:node-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:node-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationObjectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationObjectAttribute.java
new file mode 100644
index 0000000..b51e47a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationObjectAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:object}.
+ *
+ */
+public class PresentationObjectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "object");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:object}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationObjectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:object}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:object}.
+	 */
+	public enum Value {
+		CHART("chart"), DATE_TIME("date-time"), FOOTER("footer"), GRAPHIC("graphic"), HANDOUT("handout"), HEADER("header"), NOTES("notes"), OBJECT("object"), ORGCHART("orgchart"), OUTLINE("outline"), PAGE("page"), PAGE_NUMBER("page-number"), SUBTITLE("subtitle"), TABLE("table"), TEXT("text"), TITLE("title") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:object}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:object} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPagesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPagesAttribute.java
new file mode 100644
index 0000000..0ee8300
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPagesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:pages}.
+ *
+ */
+public class PresentationPagesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "pages");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:pages}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPagesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:pages}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:pages}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:pages} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPathIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPathIdAttribute.java
new file mode 100644
index 0000000..b83b716
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPathIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:path-id}.
+ *
+ */
+public class PresentationPathIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "path-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:path-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPathIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:path-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:path-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:path-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPauseAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPauseAttribute.java
new file mode 100644
index 0000000..616050b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPauseAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:pause}.
+ *
+ */
+public class PresentationPauseAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "pause");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:pause}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPauseAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:pause}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:pause}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:pause} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPlaceholderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPlaceholderAttribute.java
new file mode 100644
index 0000000..c5a78ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPlaceholderAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:placeholder}.
+ *
+ */
+public class PresentationPlaceholderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "placeholder");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:placeholder}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPlaceholderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:placeholder}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:placeholder}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:placeholder} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPlayFullAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPlayFullAttribute.java
new file mode 100644
index 0000000..6568639
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPlayFullAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:play-full}.
+ *
+ */
+public class PresentationPlayFullAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "play-full");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:play-full}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPlayFullAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:play-full}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:play-full}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:play-full} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresentationPageLayoutNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresentationPageLayoutNameAttribute.java
new file mode 100644
index 0000000..a174e1f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresentationPageLayoutNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:presentation-page-layout-name}.
+ *
+ */
+public class PresentationPresentationPageLayoutNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "presentation-page-layout-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:presentation-page-layout-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPresentationPageLayoutNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:presentation-page-layout-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:presentation-page-layout-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:presentation-page-layout-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetClassAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetClassAttribute.java
new file mode 100644
index 0000000..cc4f1ea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetClassAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:preset-class}.
+ *
+ */
+public class PresentationPresetClassAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "preset-class");
+	public static final String DEFAULT_VALUE = "custom";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:preset-class}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPresetClassAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:preset-class}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:preset-class}.
+	 */
+	public enum Value {
+		CUSTOM("custom"), EMPHASIS("emphasis"), ENTRANCE("entrance"), EXIT("exit"), MEDIA_CALL("media-call"), MOTION_PATH("motion-path"), OLE_ACTION("ole-action") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:preset-class}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:preset-class} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetIdAttribute.java
new file mode 100644
index 0000000..0ca2a5e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:preset-id}.
+ *
+ */
+public class PresentationPresetIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "preset-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:preset-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPresetIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:preset-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:preset-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:preset-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetSubTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetSubTypeAttribute.java
new file mode 100644
index 0000000..b39ec31
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationPresetSubTypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:preset-sub-type}.
+ *
+ */
+public class PresentationPresetSubTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "preset-sub-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:preset-sub-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPresetSubTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:preset-sub-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:preset-sub-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:preset-sub-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowAttribute.java
new file mode 100644
index 0000000..aba85bc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:show}.
+ *
+ */
+public class PresentationShowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "show");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:show}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationShowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:show}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:show}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:show} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowEndOfPresentationSlideAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowEndOfPresentationSlideAttribute.java
new file mode 100644
index 0000000..bc90e98
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowEndOfPresentationSlideAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:show-end-of-presentation-slide}.
+ *
+ */
+public class PresentationShowEndOfPresentationSlideAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "show-end-of-presentation-slide");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:show-end-of-presentation-slide}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationShowEndOfPresentationSlideAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:show-end-of-presentation-slide}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:show-end-of-presentation-slide}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:show-end-of-presentation-slide} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowLogoAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowLogoAttribute.java
new file mode 100644
index 0000000..cb093b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationShowLogoAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:show-logo}.
+ *
+ */
+public class PresentationShowLogoAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "show-logo");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:show-logo}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationShowLogoAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:show-logo}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:show-logo}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:show-logo} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationSourceAttribute.java
new file mode 100644
index 0000000..b0b9d5e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationSourceAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:source}.
+ *
+ */
+public class PresentationSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "source");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:source}.
+	 */
+	public enum Value {
+		CURRENT_DATE("current-date"), FIXED("fixed") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationSpeedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationSpeedAttribute.java
new file mode 100644
index 0000000..a903bb4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationSpeedAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:speed}.
+ *
+ */
+public class PresentationSpeedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "speed");
+	public static final String DEFAULT_VALUE = "medium";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:speed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationSpeedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:speed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:speed}.
+	 */
+	public enum Value {
+		FAST("fast"), MEDIUM("medium"), SLOW("slow") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:speed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:speed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartPageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartPageAttribute.java
new file mode 100644
index 0000000..a40798a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartPageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:start-page}.
+ *
+ */
+public class PresentationStartPageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "start-page");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:start-page}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationStartPageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:start-page}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:start-page}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:start-page} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartScaleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartScaleAttribute.java
new file mode 100644
index 0000000..766fe60
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartScaleAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:start-scale}.
+ *
+ */
+public class PresentationStartScaleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "start-scale");
+	public static final String DEFAULT_VALUE = "100%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:start-scale}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationStartScaleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:start-scale}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:start-scale}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:start-scale} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartWithNavigatorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartWithNavigatorAttribute.java
new file mode 100644
index 0000000..d5a1d02
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStartWithNavigatorAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:start-with-navigator}.
+ *
+ */
+public class PresentationStartWithNavigatorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "start-with-navigator");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:start-with-navigator}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationStartWithNavigatorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:start-with-navigator}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:start-with-navigator}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:start-with-navigator} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStayOnTopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStayOnTopAttribute.java
new file mode 100644
index 0000000..05c8ac1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStayOnTopAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:stay-on-top}.
+ *
+ */
+public class PresentationStayOnTopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "stay-on-top");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:stay-on-top}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationStayOnTopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:stay-on-top}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:stay-on-top}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:stay-on-top} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStyleNameAttribute.java
new file mode 100644
index 0000000..0655df7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:style-name}.
+ *
+ */
+public class PresentationStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionOnClickAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionOnClickAttribute.java
new file mode 100644
index 0000000..c3df428
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionOnClickAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:transition-on-click}.
+ *
+ */
+public class PresentationTransitionOnClickAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-on-click");
+	public static final String DEFAULT_VALUE = "enabled";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:transition-on-click}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationTransitionOnClickAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:transition-on-click}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:transition-on-click}.
+	 */
+	public enum Value {
+		DISABLED("disabled"), ENABLED("enabled") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:transition-on-click}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:transition-on-click} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionSpeedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionSpeedAttribute.java
new file mode 100644
index 0000000..bd19c89
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionSpeedAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:transition-speed}.
+ *
+ */
+public class PresentationTransitionSpeedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-speed");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:transition-speed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationTransitionSpeedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:transition-speed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:transition-speed}.
+	 */
+	public enum Value {
+		FAST("fast"), MEDIUM("medium"), SLOW("slow") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:transition-speed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:transition-speed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionStyleAttribute.java
new file mode 100644
index 0000000..7f22614
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:transition-style}.
+ *
+ */
+public class PresentationTransitionStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:transition-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationTransitionStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:transition-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:transition-style}.
+	 */
+	public enum Value {
+		CLOCKWISE("clockwise"), CLOSE("close"), CLOSE_HORIZONTAL("close-horizontal"), CLOSE_VERTICAL("close-vertical"), COUNTERCLOCKWISE("counterclockwise"), DISSOLVE("dissolve"), FADE_FROM_BOTTOM("fade-from-bottom"), FADE_FROM_CENTER("fade-from-center"), FADE_FROM_LEFT("fade-from-left"), FADE_FROM_LOWERLEFT("fade-from-lowerleft"), FADE_FROM_LOWERRIGHT("fade-from-lowerright"), FADE_FROM_RIGHT("fade-from-right"), FADE_FROM_TOP("fade-from-top"), FADE_FROM_UPPERLEFT("fade-from-upperleft"), FADE_FROM_UPPERRIGHT("fade-from-upperright"), FADE_TO_CENTER("fade-to-center"), FLY_AWAY("fly-away"), HORIZONTAL_CHECKERBOARD("horizontal-checkerboard"), HORIZONTAL_LINES("horizontal-lines"), HORIZONTAL_STRIPES("horizontal-stripes"), INTERLOCKING_HORIZONTAL_LEFT("interlocking-horizontal-left"), INTERLOCKING_HORIZONTAL_RIGHT("interlocking-horizontal-right"), INTERLOCKING_VERTICAL_BOTTOM("interlocking-vertical-bottom"), INTERLOCKING_VERTICAL_TOP("interlocking-vertical-top"), MELT("melt"), MOVE_FROM_BOTTOM("move-from-bottom"), MOVE_FROM_LEFT("move-from-left"), MOVE_FROM_LOWERLEFT("move-from-lowerleft"), MOVE_FROM_LOWERRIGHT("move-from-lowerright"), MOVE_FROM_RIGHT("move-from-right"), MOVE_FROM_TOP("move-from-top"), MOVE_FROM_UPPERLEFT("move-from-upperleft"), MOVE_FROM_UPPERRIGHT("move-from-upperright"), NONE("none"), OPEN("open"), OPEN_HORIZONTAL("open-horizontal"), OPEN_VERTICAL("open-vertical"), RANDOM("random"), ROLL_FROM_BOTTOM("roll-from-bottom"), ROLL_FROM_LEFT("roll-from-left"), ROLL_FROM_RIGHT("roll-from-right"), ROLL_FROM_TOP("roll-from-top"), SPIRALIN_LEFT("spiralin-left"), SPIRALIN_RIGHT("spiralin-right"), SPIRALOUT_LEFT("spiralout-left"), SPIRALOUT_RIGHT("spiralout-right"), STRETCH_FROM_BOTTOM("stretch-from-bottom"), STRETCH_FROM_LEFT("stretch-from-left"), STRETCH_FROM_RIGHT("stretch-from-right"), STRETCH_FROM_TOP("stretch-from-top"), UNCOVER_TO_BOTTOM("uncover-to-bottom"), UNCOVER_TO_LEFT("uncover-to-left"), UNCOVER_TO_LOWERLEFT("uncover-to-lowerleft"), UNCOVER_TO_LOWERRIGHT("uncover-to-lowerright"), UNCOVER_TO_RIGHT("uncover-to-right"), UNCOVER_TO_TOP("uncover-to-top"), UNCOVER_TO_UPPERLEFT("uncover-to-upperleft"), UNCOVER_TO_UPPERRIGHT("uncover-to-upperright"), VERTICAL_CHECKERBOARD("vertical-checkerboard"), VERTICAL_LINES("vertical-lines"), VERTICAL_STRIPES("vertical-stripes"), WAVYLINE_FROM_BOTTOM("wavyline-from-bottom"), WAVYLINE_FROM_LEFT("wavyline-from-left"), WAVYLINE_FROM_RIGHT("wavyline-from-right"), WAVYLINE_FROM_TOP("wavyline-from-top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:transition-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:transition-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionTypeAttribute.java
new file mode 100644
index 0000000..4638c5e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationTransitionTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:transition-type}.
+ *
+ */
+public class PresentationTransitionTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:transition-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationTransitionTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:transition-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:transition-type}.
+	 */
+	public enum Value {
+		AUTOMATIC("automatic"), MANUAL("manual"), SEMI_AUTOMATIC("semi-automatic") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:transition-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:transition-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseDateTimeNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseDateTimeNameAttribute.java
new file mode 100644
index 0000000..4695e58
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseDateTimeNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:use-date-time-name}.
+ *
+ */
+public class PresentationUseDateTimeNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "use-date-time-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:use-date-time-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationUseDateTimeNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:use-date-time-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:use-date-time-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:use-date-time-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseFooterNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseFooterNameAttribute.java
new file mode 100644
index 0000000..52ea784
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseFooterNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:use-footer-name}.
+ *
+ */
+public class PresentationUseFooterNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "use-footer-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:use-footer-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationUseFooterNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:use-footer-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:use-footer-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:use-footer-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseHeaderNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseHeaderNameAttribute.java
new file mode 100644
index 0000000..07ab2e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUseHeaderNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:use-header-name}.
+ *
+ */
+public class PresentationUseHeaderNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "use-header-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:use-header-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationUseHeaderNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:use-header-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:use-header-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:use-header-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUserTransformedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUserTransformedAttribute.java
new file mode 100644
index 0000000..48d4960
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationUserTransformedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:user-transformed}.
+ *
+ */
+public class PresentationUserTransformedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "user-transformed");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:user-transformed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationUserTransformedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:user-transformed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:user-transformed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:user-transformed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationVerbAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationVerbAttribute.java
new file mode 100644
index 0000000..dc908c5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationVerbAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:verb}.
+ *
+ */
+public class PresentationVerbAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "verb");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:verb}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationVerbAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:verb}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:verb}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:verb} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationVisibilityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationVisibilityAttribute.java
new file mode 100644
index 0000000..a84e2e5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/presentation/PresentationVisibilityAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.presentation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute presentation:visibility}.
+ *
+ */
+public class PresentationVisibilityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "visibility");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute presentation:visibility}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PresentationVisibilityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute presentation:visibility}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute presentation:visibility}.
+	 */
+	public enum Value {
+		HIDDEN("hidden"), VISIBLE("visible") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute presentation:visibility}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute presentation:visibility} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptEventNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptEventNameAttribute.java
new file mode 100644
index 0000000..75cf0b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptEventNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.script;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute script:event-name}.
+ *
+ */
+public class ScriptEventNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SCRIPT, "event-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute script:event-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ScriptEventNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute script:event-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute script:event-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute script:event-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptLanguageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptLanguageAttribute.java
new file mode 100644
index 0000000..12d41b5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptLanguageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.script;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute script:language}.
+ *
+ */
+public class ScriptLanguageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SCRIPT, "language");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute script:language}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ScriptLanguageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute script:language}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute script:language}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute script:language} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptMacroNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptMacroNameAttribute.java
new file mode 100644
index 0000000..0e32963
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/script/ScriptMacroNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.script;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute script:macro-name}.
+ *
+ */
+public class ScriptMacroNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SCRIPT, "macro-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute script:macro-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ScriptMacroNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute script:macro-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute script:macro-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute script:macro-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAccelerateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAccelerateAttribute.java
new file mode 100644
index 0000000..15718e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAccelerateAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:accelerate}.
+ *
+ */
+public class SmilAccelerateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "accelerate");
+	public static final String DEFAULT_VALUE = "0.0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:accelerate}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilAccelerateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:accelerate}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:accelerate}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:accelerate} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAccumulateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAccumulateAttribute.java
new file mode 100644
index 0000000..61b0125
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAccumulateAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:accumulate}.
+ *
+ */
+public class SmilAccumulateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "accumulate");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:accumulate}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilAccumulateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:accumulate}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:accumulate}.
+	 */
+	public enum Value {
+		NONE("none"), SUM("sum") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:accumulate}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:accumulate} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAdditiveAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAdditiveAttribute.java
new file mode 100644
index 0000000..def7139
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAdditiveAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:additive}.
+ *
+ */
+public class SmilAdditiveAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "additive");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:additive}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilAdditiveAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:additive}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:additive}.
+	 */
+	public enum Value {
+		REPLACE("replace"), SUM("sum") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:additive}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:additive} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAttributeNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAttributeNameAttribute.java
new file mode 100644
index 0000000..89d3e10
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAttributeNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:attributeName}.
+ *
+ */
+public class SmilAttributeNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "attributeName");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:attributeName}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilAttributeNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:attributeName}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:attributeName}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:attributeName} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAutoReverseAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAutoReverseAttribute.java
new file mode 100644
index 0000000..6bb46cd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilAutoReverseAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:autoReverse}.
+ *
+ */
+public class SmilAutoReverseAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "autoReverse");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:autoReverse}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilAutoReverseAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:autoReverse}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:autoReverse}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:autoReverse} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilBeginAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilBeginAttribute.java
new file mode 100644
index 0000000..f9e0fc3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilBeginAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:begin}.
+ *
+ */
+public class SmilBeginAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "begin");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:begin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilBeginAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:begin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:begin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:begin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilByAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilByAttribute.java
new file mode 100644
index 0000000..94aa93d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilByAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:by}.
+ *
+ */
+public class SmilByAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "by");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:by}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilByAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:by}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:by}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:by} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilCalcModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilCalcModeAttribute.java
new file mode 100644
index 0000000..9323edb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilCalcModeAttribute.java
@@ -0,0 +1,158 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateColorElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateMotionElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:calcMode}.
+ *
+ */
+public class SmilCalcModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "calcMode");
+	public static final String DEFAULT_VALUE_DISCRETE = Value.DISCRETE.toString();
+	public static final String DEFAULT_VALUE_PACED = Value.PACED.toString();
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:calcMode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilCalcModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:calcMode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:calcMode}.
+	 */
+	public enum Value {
+		DISCRETE("discrete"), LINEAR("linear"), PACED("paced"), SPLINE("spline") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:calcMode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof AnimAnimateElement) {
+				defaultValue = DEFAULT_VALUE_DISCRETE;
+			}
+			if (parentElement instanceof AnimAnimateColorElement) {
+				defaultValue = DEFAULT_VALUE_DISCRETE;
+			}
+			if (parentElement instanceof AnimAnimateMotionElement) {
+				defaultValue = DEFAULT_VALUE_PACED;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:calcMode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDecelerateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDecelerateAttribute.java
new file mode 100644
index 0000000..a7675d3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDecelerateAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:decelerate}.
+ *
+ */
+public class SmilDecelerateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "decelerate");
+	public static final String DEFAULT_VALUE = "0.0";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:decelerate}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilDecelerateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:decelerate}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:decelerate}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:decelerate} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDirectionAttribute.java
new file mode 100644
index 0000000..7803c0f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDirectionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:direction}.
+ *
+ */
+public class SmilDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "direction");
+	public static final String DEFAULT_VALUE = "forward";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:direction}.
+	 */
+	public enum Value {
+		FORWARD("forward"), REVERSE("reverse") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDurAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDurAttribute.java
new file mode 100644
index 0000000..8d47903
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilDurAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:dur}.
+ *
+ */
+public class SmilDurAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "dur");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:dur}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilDurAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:dur}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:dur}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:dur} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilEndAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilEndAttribute.java
new file mode 100644
index 0000000..f17394c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilEndAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:end}.
+ *
+ */
+public class SmilEndAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "end");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:end}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilEndAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:end}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:end}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:end} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilEndsyncAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilEndsyncAttribute.java
new file mode 100644
index 0000000..61c1b7a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilEndsyncAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:endsync}.
+ *
+ */
+public class SmilEndsyncAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "endsync");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:endsync}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilEndsyncAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:endsync}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:endsync}.
+	 */
+	public enum Value {
+		ALL("all"), FIRST("first"), LAST("last"), MEDIA("media") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:endsync}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:endsync} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFadeColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFadeColorAttribute.java
new file mode 100644
index 0000000..3c0ef21
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFadeColorAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:fadeColor}.
+ *
+ */
+public class SmilFadeColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "fadeColor");
+	public static final String DEFAULT_VALUE = "#000000";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:fadeColor}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilFadeColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:fadeColor}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:fadeColor}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:fadeColor} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFillAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFillAttribute.java
new file mode 100644
index 0000000..1bc65ed
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFillAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:fill}.
+ *
+ */
+public class SmilFillAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "fill");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:fill}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilFillAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:fill}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:fill}.
+	 */
+	public enum Value {
+		AUTO("auto"), DEFAULT("default"), FREEZE("freeze"), HOLD("hold"), REMOVE("remove"), TRANSITION("transition") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:fill}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:fill} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFillDefaultAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFillDefaultAttribute.java
new file mode 100644
index 0000000..5627c52
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFillDefaultAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:fillDefault}.
+ *
+ */
+public class SmilFillDefaultAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "fillDefault");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:fillDefault}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilFillDefaultAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:fillDefault}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:fillDefault}.
+	 */
+	public enum Value {
+		AUTO("auto"), FREEZE("freeze"), HOLD("hold"), INHERIT("inherit"), REMOVE("remove"), TRANSITION("transition") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:fillDefault}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:fillDefault} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFromAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFromAttribute.java
new file mode 100644
index 0000000..6ed50d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilFromAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:from}.
+ *
+ */
+public class SmilFromAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "from");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:from}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilFromAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:from}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:from}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:from} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilKeySplinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilKeySplinesAttribute.java
new file mode 100644
index 0000000..2e6f22a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilKeySplinesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:keySplines}.
+ *
+ */
+public class SmilKeySplinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "keySplines");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:keySplines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilKeySplinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:keySplines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:keySplines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:keySplines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilKeyTimesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilKeyTimesAttribute.java
new file mode 100644
index 0000000..c5107a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilKeyTimesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:keyTimes}.
+ *
+ */
+public class SmilKeyTimesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "keyTimes");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:keyTimes}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilKeyTimesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:keyTimes}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:keyTimes}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:keyTimes} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilModeAttribute.java
new file mode 100644
index 0000000..c2d35c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilModeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:mode}.
+ *
+ */
+public class SmilModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "mode");
+	public static final String DEFAULT_VALUE = "in";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:mode}.
+	 */
+	public enum Value {
+		IN("in"), OUT("out") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRepeatCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRepeatCountAttribute.java
new file mode 100644
index 0000000..5ecd4ea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRepeatCountAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:repeatCount}.
+ *
+ */
+public class SmilRepeatCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "repeatCount");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:repeatCount}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilRepeatCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:repeatCount}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:repeatCount}.
+	 */
+	public enum Value {
+		INDEFINITE("indefinite") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:repeatCount}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:repeatCount} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRepeatDurAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRepeatDurAttribute.java
new file mode 100644
index 0000000..39f897d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRepeatDurAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:repeatDur}.
+ *
+ */
+public class SmilRepeatDurAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "repeatDur");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:repeatDur}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilRepeatDurAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:repeatDur}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:repeatDur}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:repeatDur} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRestartAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRestartAttribute.java
new file mode 100644
index 0000000..f4295c0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRestartAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:restart}.
+ *
+ */
+public class SmilRestartAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "restart");
+	public static final String DEFAULT_VALUE = "default";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:restart}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilRestartAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:restart}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:restart}.
+	 */
+	public enum Value {
+		ALWAYS("always"), DEFAULT("default"), NEVER("never"), WHENNOTACTIVE("whenNotActive") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:restart}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:restart} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRestartDefaultAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRestartDefaultAttribute.java
new file mode 100644
index 0000000..d8ef4b5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilRestartDefaultAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:restartDefault}.
+ *
+ */
+public class SmilRestartDefaultAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "restartDefault");
+	public static final String DEFAULT_VALUE = "inherit";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:restartDefault}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilRestartDefaultAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:restartDefault}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute smil:restartDefault}.
+	 */
+	public enum Value {
+		ALWAYS("always"), INHERIT("inherit"), NEVER("never"), WHENNOTACTIVE("whenNotActive") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:restartDefault}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:restartDefault} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilSubtypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilSubtypeAttribute.java
new file mode 100644
index 0000000..2d468de
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilSubtypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:subtype}.
+ *
+ */
+public class SmilSubtypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "subtype");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:subtype}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilSubtypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:subtype}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:subtype}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:subtype} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilTargetElementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilTargetElementAttribute.java
new file mode 100644
index 0000000..152a8e0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilTargetElementAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:targetElement}.
+ *
+ */
+public class SmilTargetElementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "targetElement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:targetElement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilTargetElementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:targetElement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:targetElement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:targetElement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilToAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilToAttribute.java
new file mode 100644
index 0000000..cb5c14a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilToAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:to}.
+ *
+ */
+public class SmilToAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "to");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:to}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilToAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:to}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:to}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:to} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilTypeAttribute.java
new file mode 100644
index 0000000..80221ec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilTypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:type}.
+ *
+ */
+public class SmilTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilValuesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilValuesAttribute.java
new file mode 100644
index 0000000..37577a8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/smil/SmilValuesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.smil;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute smil:values}.
+ *
+ */
+public class SmilValuesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SMIL, "values");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute smil:values}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SmilValuesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute smil:values}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute smil:values}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute smil:values} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAdjustmentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAdjustmentAttribute.java
new file mode 100644
index 0000000..e594a21
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAdjustmentAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:adjustment}.
+ *
+ */
+public class StyleAdjustmentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "adjustment");
+	public static final String DEFAULT_VALUE = "left";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:adjustment}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleAdjustmentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:adjustment}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:adjustment}.
+	 */
+	public enum Value {
+		CENTER("center"), LEFT("left"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:adjustment}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:adjustment} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleApplyStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleApplyStyleNameAttribute.java
new file mode 100644
index 0000000..6718228
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleApplyStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:apply-style-name}.
+ *
+ */
+public class StyleApplyStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "apply-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:apply-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleApplyStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:apply-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:apply-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:apply-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAutoTextIndentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAutoTextIndentAttribute.java
new file mode 100644
index 0000000..9a5a6ff
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAutoTextIndentAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:auto-text-indent}.
+ *
+ */
+public class StyleAutoTextIndentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "auto-text-indent");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:auto-text-indent}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleAutoTextIndentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:auto-text-indent}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:auto-text-indent}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:auto-text-indent} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAutoUpdateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAutoUpdateAttribute.java
new file mode 100644
index 0000000..3fe6c56
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleAutoUpdateAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:auto-update}.
+ *
+ */
+public class StyleAutoUpdateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "auto-update");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:auto-update}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleAutoUpdateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:auto-update}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:auto-update}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:auto-update} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBackgroundTransparencyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBackgroundTransparencyAttribute.java
new file mode 100644
index 0000000..9b320d1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBackgroundTransparencyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:background-transparency}.
+ *
+ */
+public class StyleBackgroundTransparencyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "background-transparency");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:background-transparency}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBackgroundTransparencyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:background-transparency}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:background-transparency}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:background-transparency} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBaseCellAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBaseCellAddressAttribute.java
new file mode 100644
index 0000000..7ba2443
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBaseCellAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:base-cell-address}.
+ *
+ */
+public class StyleBaseCellAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "base-cell-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:base-cell-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBaseCellAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:base-cell-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:base-cell-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:base-cell-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthAttribute.java
new file mode 100644
index 0000000..b9f365d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:border-line-width}.
+ *
+ */
+public class StyleBorderLineWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:border-line-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBorderLineWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:border-line-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:border-line-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:border-line-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthBottomAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthBottomAttribute.java
new file mode 100644
index 0000000..2038237
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthBottomAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:border-line-width-bottom}.
+ *
+ */
+public class StyleBorderLineWidthBottomAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:border-line-width-bottom}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBorderLineWidthBottomAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:border-line-width-bottom}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:border-line-width-bottom}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:border-line-width-bottom} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthLeftAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthLeftAttribute.java
new file mode 100644
index 0000000..cd8266a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthLeftAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:border-line-width-left}.
+ *
+ */
+public class StyleBorderLineWidthLeftAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:border-line-width-left}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBorderLineWidthLeftAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:border-line-width-left}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:border-line-width-left}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:border-line-width-left} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthRightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthRightAttribute.java
new file mode 100644
index 0000000..e8b3d53
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthRightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:border-line-width-right}.
+ *
+ */
+public class StyleBorderLineWidthRightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:border-line-width-right}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBorderLineWidthRightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:border-line-width-right}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:border-line-width-right}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:border-line-width-right} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthTopAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthTopAttribute.java
new file mode 100644
index 0000000..ad0946b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleBorderLineWidthTopAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:border-line-width-top}.
+ *
+ */
+public class StyleBorderLineWidthTopAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:border-line-width-top}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleBorderLineWidthTopAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:border-line-width-top}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:border-line-width-top}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:border-line-width-top} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCellProtectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCellProtectAttribute.java
new file mode 100644
index 0000000..5c14cf7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCellProtectAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:cell-protect}.
+ *
+ */
+public class StyleCellProtectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "cell-protect");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:cell-protect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleCellProtectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:cell-protect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:cell-protect}.
+	 */
+	public enum Value {
+		FORMULA_HIDDEN("formula-hidden"), HIDDEN_AND_PROTECTED("hidden-and-protected"), NONE("none"), PROTECTED("protected") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:cell-protect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:cell-protect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCharAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCharAttribute.java
new file mode 100644
index 0000000..549dd7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCharAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:char}.
+ *
+ */
+public class StyleCharAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "char");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:char}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleCharAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:char}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:char}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:char} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleClassAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleClassAttribute.java
new file mode 100644
index 0000000..e07a26d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleClassAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:class}.
+ *
+ */
+public class StyleClassAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "class");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:class}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleClassAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:class}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:class}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:class} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleColorAttribute.java
new file mode 100644
index 0000000..06e99b9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleColorAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:color}.
+ *
+ */
+public class StyleColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "color");
+	public static final String DEFAULT_VALUE = "#000000";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleColumnWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleColumnWidthAttribute.java
new file mode 100644
index 0000000..6944c98
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleColumnWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:column-width}.
+ *
+ */
+public class StyleColumnWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "column-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:column-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleColumnWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:column-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:column-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:column-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleConditionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleConditionAttribute.java
new file mode 100644
index 0000000..f249459
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleConditionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:condition}.
+ *
+ */
+public class StyleConditionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "condition");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:condition}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleConditionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:condition}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:condition}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:condition} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCountryAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCountryAsianAttribute.java
new file mode 100644
index 0000000..4b5e8af
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCountryAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:country-asian}.
+ *
+ */
+public class StyleCountryAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "country-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:country-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleCountryAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:country-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:country-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:country-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCountryComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCountryComplexAttribute.java
new file mode 100644
index 0000000..f7def71
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleCountryComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:country-complex}.
+ *
+ */
+public class StyleCountryComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "country-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:country-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleCountryComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:country-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:country-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:country-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDataStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDataStyleNameAttribute.java
new file mode 100644
index 0000000..1b9b269
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDataStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:data-style-name}.
+ *
+ */
+public class StyleDataStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "data-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:data-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDataStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:data-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:data-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:data-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDecimalPlacesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDecimalPlacesAttribute.java
new file mode 100644
index 0000000..2200123
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDecimalPlacesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:decimal-places}.
+ *
+ */
+public class StyleDecimalPlacesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "decimal-places");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:decimal-places}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDecimalPlacesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:decimal-places}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:decimal-places}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:decimal-places} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDefaultOutlineLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDefaultOutlineLevelAttribute.java
new file mode 100644
index 0000000..9cfd79f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDefaultOutlineLevelAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:default-outline-level}.
+ *
+ */
+public class StyleDefaultOutlineLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "default-outline-level");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:default-outline-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDefaultOutlineLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:default-outline-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:default-outline-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:default-outline-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalBlTrAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalBlTrAttribute.java
new file mode 100644
index 0000000..ab5a5d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalBlTrAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:diagonal-bl-tr}.
+ *
+ */
+public class StyleDiagonalBlTrAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-bl-tr");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:diagonal-bl-tr}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDiagonalBlTrAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:diagonal-bl-tr}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:diagonal-bl-tr}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:diagonal-bl-tr} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalBlTrWidthsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalBlTrWidthsAttribute.java
new file mode 100644
index 0000000..f32e2d9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalBlTrWidthsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:diagonal-bl-tr-widths}.
+ *
+ */
+public class StyleDiagonalBlTrWidthsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-bl-tr-widths");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:diagonal-bl-tr-widths}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDiagonalBlTrWidthsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:diagonal-bl-tr-widths}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:diagonal-bl-tr-widths}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:diagonal-bl-tr-widths} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalTlBrAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalTlBrAttribute.java
new file mode 100644
index 0000000..90e844e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalTlBrAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:diagonal-tl-br}.
+ *
+ */
+public class StyleDiagonalTlBrAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-tl-br");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:diagonal-tl-br}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDiagonalTlBrAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:diagonal-tl-br}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:diagonal-tl-br}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:diagonal-tl-br} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalTlBrWidthsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalTlBrWidthsAttribute.java
new file mode 100644
index 0000000..2505b5d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDiagonalTlBrWidthsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:diagonal-tl-br-widths}.
+ *
+ */
+public class StyleDiagonalTlBrWidthsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-tl-br-widths");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:diagonal-tl-br-widths}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDiagonalTlBrWidthsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:diagonal-tl-br-widths}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:diagonal-tl-br-widths}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:diagonal-tl-br-widths} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDirectionAttribute.java
new file mode 100644
index 0000000..4b89c88
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDirectionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:direction}.
+ *
+ */
+public class StyleDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:direction}.
+	 */
+	public enum Value {
+		LTR("ltr"), TTB("ttb") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDisplayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDisplayAttribute.java
new file mode 100644
index 0000000..105d620
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDisplayAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:display}.
+ *
+ */
+public class StyleDisplayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "display");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:display}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDisplayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:display}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:display}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:display} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDisplayNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDisplayNameAttribute.java
new file mode 100644
index 0000000..641e8d1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDisplayNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:display-name}.
+ *
+ */
+public class StyleDisplayNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "display-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:display-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDisplayNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:display-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:display-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:display-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceAfterSepAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceAfterSepAttribute.java
new file mode 100644
index 0000000..461f5aa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceAfterSepAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:distance-after-sep}.
+ *
+ */
+public class StyleDistanceAfterSepAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "distance-after-sep");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:distance-after-sep}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDistanceAfterSepAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:distance-after-sep}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:distance-after-sep}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:distance-after-sep} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceAttribute.java
new file mode 100644
index 0000000..cf6fcde
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:distance}.
+ *
+ */
+public class StyleDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "distance");
+	public static final String DEFAULT_VALUE = "0cm";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceBeforeSepAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceBeforeSepAttribute.java
new file mode 100644
index 0000000..92ac3d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDistanceBeforeSepAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:distance-before-sep}.
+ *
+ */
+public class StyleDistanceBeforeSepAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "distance-before-sep");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:distance-before-sep}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDistanceBeforeSepAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:distance-before-sep}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:distance-before-sep}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:distance-before-sep} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDynamicSpacingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDynamicSpacingAttribute.java
new file mode 100644
index 0000000..6040f15
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleDynamicSpacingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:dynamic-spacing}.
+ *
+ */
+public class StyleDynamicSpacingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "dynamic-spacing");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:dynamic-spacing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleDynamicSpacingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:dynamic-spacing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:dynamic-spacing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:dynamic-spacing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleEditableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleEditableAttribute.java
new file mode 100644
index 0000000..d915123
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleEditableAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:editable}.
+ *
+ */
+public class StyleEditableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "editable");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:editable}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleEditableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:editable}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:editable}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:editable} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFamilyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFamilyAttribute.java
new file mode 100644
index 0000000..797bd45
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFamilyAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:family}.
+ *
+ */
+public class StyleFamilyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "family");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:family}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFamilyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:family}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:family}.
+	 */
+	public enum Value {
+		CHART("chart"), DRAWING_PAGE("drawing-page"), GRAPHIC("graphic"), PARAGRAPH("paragraph"), PRESENTATION("presentation"), RUBY("ruby"), SECTION("section"), TABLE("table"), TABLE_CELL("table-cell"), TABLE_COLUMN("table-column"), TABLE_ROW("table-row"), TEXT("text") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:family}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:family} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFilterNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFilterNameAttribute.java
new file mode 100644
index 0000000..7b9ebc1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFilterNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:filter-name}.
+ *
+ */
+public class StyleFilterNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "filter-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:filter-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFilterNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:filter-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:filter-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:filter-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFirstPageNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFirstPageNumberAttribute.java
new file mode 100644
index 0000000..013e0d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFirstPageNumberAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:first-page-number}.
+ *
+ */
+public class StyleFirstPageNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "first-page-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:first-page-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFirstPageNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:first-page-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:first-page-number}.
+	 */
+	public enum Value {
+		CONTINUE("continue") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:first-page-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:first-page-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFlowWithTextAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFlowWithTextAttribute.java
new file mode 100644
index 0000000..040e61a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFlowWithTextAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:flow-with-text}.
+ *
+ */
+public class StyleFlowWithTextAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "flow-with-text");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:flow-with-text}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFlowWithTextAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:flow-with-text}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:flow-with-text}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:flow-with-text} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontAdornmentsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontAdornmentsAttribute.java
new file mode 100644
index 0000000..3a863d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontAdornmentsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-adornments}.
+ *
+ */
+public class StyleFontAdornmentsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-adornments");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-adornments}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontAdornmentsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-adornments}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-adornments}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-adornments} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetAsianAttribute.java
new file mode 100644
index 0000000..fd95757
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-charset-asian}.
+ *
+ */
+public class StyleFontCharsetAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-charset-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontCharsetAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-charset-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-charset-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-charset-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetAttribute.java
new file mode 100644
index 0000000..967b32d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-charset}.
+ *
+ */
+public class StyleFontCharsetAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-charset}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontCharsetAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-charset}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-charset}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-charset} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetComplexAttribute.java
new file mode 100644
index 0000000..07eb08f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontCharsetComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-charset-complex}.
+ *
+ */
+public class StyleFontCharsetComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-charset-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontCharsetComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-charset-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-charset-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-charset-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyAsianAttribute.java
new file mode 100644
index 0000000..ba8c012
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-family-asian}.
+ *
+ */
+public class StyleFontFamilyAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-family-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontFamilyAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-family-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-family-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-family-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyComplexAttribute.java
new file mode 100644
index 0000000..fb0ef4e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-family-complex}.
+ *
+ */
+public class StyleFontFamilyComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-family-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontFamilyComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-family-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-family-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-family-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericAsianAttribute.java
new file mode 100644
index 0000000..55c692c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericAsianAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-family-generic-asian}.
+ *
+ */
+public class StyleFontFamilyGenericAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-family-generic-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontFamilyGenericAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-family-generic-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-family-generic-asian}.
+	 */
+	public enum Value {
+		DECORATIVE("decorative"), MODERN("modern"), ROMAN("roman"), SCRIPT("script"), SWISS("swiss"), SYSTEM("system") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-family-generic-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-family-generic-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericAttribute.java
new file mode 100644
index 0000000..d104906
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-family-generic}.
+ *
+ */
+public class StyleFontFamilyGenericAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-family-generic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontFamilyGenericAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-family-generic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-family-generic}.
+	 */
+	public enum Value {
+		DECORATIVE("decorative"), MODERN("modern"), ROMAN("roman"), SCRIPT("script"), SWISS("swiss"), SYSTEM("system") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-family-generic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-family-generic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericComplexAttribute.java
new file mode 100644
index 0000000..595a6fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontFamilyGenericComplexAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-family-generic-complex}.
+ *
+ */
+public class StyleFontFamilyGenericComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-family-generic-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontFamilyGenericComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-family-generic-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-family-generic-complex}.
+	 */
+	public enum Value {
+		DECORATIVE("decorative"), MODERN("modern"), ROMAN("roman"), SCRIPT("script"), SWISS("swiss"), SYSTEM("system") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-family-generic-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-family-generic-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontIndependentLineSpacingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontIndependentLineSpacingAttribute.java
new file mode 100644
index 0000000..8ed1feb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontIndependentLineSpacingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-independent-line-spacing}.
+ *
+ */
+public class StyleFontIndependentLineSpacingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-independent-line-spacing");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-independent-line-spacing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontIndependentLineSpacingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-independent-line-spacing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-independent-line-spacing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-independent-line-spacing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameAsianAttribute.java
new file mode 100644
index 0000000..7fc76a0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-name-asian}.
+ *
+ */
+public class StyleFontNameAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-name-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-name-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontNameAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-name-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-name-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-name-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameAttribute.java
new file mode 100644
index 0000000..30e5465
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-name}.
+ *
+ */
+public class StyleFontNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameComplexAttribute.java
new file mode 100644
index 0000000..3855a0a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontNameComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-name-complex}.
+ *
+ */
+public class StyleFontNameComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-name-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-name-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontNameComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-name-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-name-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-name-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchAsianAttribute.java
new file mode 100644
index 0000000..7924787
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchAsianAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-pitch-asian}.
+ *
+ */
+public class StyleFontPitchAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-pitch-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontPitchAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-pitch-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-pitch-asian}.
+	 */
+	public enum Value {
+		FIXED("fixed"), VARIABLE("variable") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-pitch-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-pitch-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchAttribute.java
new file mode 100644
index 0000000..7e59ac2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-pitch}.
+ *
+ */
+public class StyleFontPitchAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-pitch}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontPitchAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-pitch}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-pitch}.
+	 */
+	public enum Value {
+		FIXED("fixed"), VARIABLE("variable") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-pitch}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-pitch} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchComplexAttribute.java
new file mode 100644
index 0000000..2314d4c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontPitchComplexAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-pitch-complex}.
+ *
+ */
+public class StyleFontPitchComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-pitch-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontPitchComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-pitch-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-pitch-complex}.
+	 */
+	public enum Value {
+		FIXED("fixed"), VARIABLE("variable") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-pitch-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-pitch-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontReliefAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontReliefAttribute.java
new file mode 100644
index 0000000..408f5a7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontReliefAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-relief}.
+ *
+ */
+public class StyleFontReliefAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-relief");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-relief}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontReliefAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-relief}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-relief}.
+	 */
+	public enum Value {
+		EMBOSSED("embossed"), ENGRAVED("engraved"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-relief}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-relief} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeAsianAttribute.java
new file mode 100644
index 0000000..3a7fe54
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-size-asian}.
+ *
+ */
+public class StyleFontSizeAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-size-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontSizeAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-size-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-size-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-size-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeComplexAttribute.java
new file mode 100644
index 0000000..9b4b1b6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-size-complex}.
+ *
+ */
+public class StyleFontSizeComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-size-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontSizeComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-size-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-size-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-size-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelAsianAttribute.java
new file mode 100644
index 0000000..9ceb861
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-size-rel-asian}.
+ *
+ */
+public class StyleFontSizeRelAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-size-rel-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontSizeRelAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-size-rel-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-size-rel-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-size-rel-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelAttribute.java
new file mode 100644
index 0000000..9bab558
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-size-rel}.
+ *
+ */
+public class StyleFontSizeRelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-size-rel}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontSizeRelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-size-rel}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-size-rel}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-size-rel} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelComplexAttribute.java
new file mode 100644
index 0000000..64cae9c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontSizeRelComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-size-rel-complex}.
+ *
+ */
+public class StyleFontSizeRelComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-size-rel-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontSizeRelComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-size-rel-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-size-rel-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-size-rel-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleAsianAttribute.java
new file mode 100644
index 0000000..b242cc5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleAsianAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-style-asian}.
+ *
+ */
+public class StyleFontStyleAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-style-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontStyleAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-style-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-style-asian}.
+	 */
+	public enum Value {
+		ITALIC("italic"), NORMAL("normal"), OBLIQUE("oblique") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-style-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-style-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleComplexAttribute.java
new file mode 100644
index 0000000..0c24800
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleComplexAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-style-complex}.
+ *
+ */
+public class StyleFontStyleComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-style-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontStyleComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-style-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-style-complex}.
+	 */
+	public enum Value {
+		ITALIC("italic"), NORMAL("normal"), OBLIQUE("oblique") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-style-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-style-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameAsianAttribute.java
new file mode 100644
index 0000000..667dca9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-style-name-asian}.
+ *
+ */
+public class StyleFontStyleNameAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-style-name-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontStyleNameAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-style-name-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-style-name-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-style-name-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameAttribute.java
new file mode 100644
index 0000000..5318991
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-style-name}.
+ *
+ */
+public class StyleFontStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameComplexAttribute.java
new file mode 100644
index 0000000..f65605e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontStyleNameComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-style-name-complex}.
+ *
+ */
+public class StyleFontStyleNameComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-style-name-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontStyleNameComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-style-name-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-style-name-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-style-name-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontWeightAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontWeightAsianAttribute.java
new file mode 100644
index 0000000..7651ed1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontWeightAsianAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-weight-asian}.
+ *
+ */
+public class StyleFontWeightAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-weight-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-weight-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontWeightAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-weight-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-weight-asian}.
+	 */
+	public enum Value {
+		_100("100"), _200("200"), _300("300"), _400("400"), _500("500"), _600("600"), _700("700"), _800("800"), _900("900"), BOLD("bold"), NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-weight-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-weight-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontWeightComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontWeightComplexAttribute.java
new file mode 100644
index 0000000..04dca19
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFontWeightComplexAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:font-weight-complex}.
+ *
+ */
+public class StyleFontWeightComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-weight-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:font-weight-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontWeightComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:font-weight-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:font-weight-complex}.
+	 */
+	public enum Value {
+		_100("100"), _200("200"), _300("300"), _400("400"), _500("500"), _600("600"), _700("700"), _800("800"), _900("900"), BOLD("bold"), NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:font-weight-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:font-weight-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFootnoteMaxHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFootnoteMaxHeightAttribute.java
new file mode 100644
index 0000000..51f937e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleFootnoteMaxHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:footnote-max-height}.
+ *
+ */
+public class StyleFootnoteMaxHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "footnote-max-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:footnote-max-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleFootnoteMaxHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:footnote-max-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:footnote-max-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:footnote-max-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleGlyphOrientationVerticalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleGlyphOrientationVerticalAttribute.java
new file mode 100644
index 0000000..dc39013
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleGlyphOrientationVerticalAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:glyph-orientation-vertical}.
+ *
+ */
+public class StyleGlyphOrientationVerticalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "glyph-orientation-vertical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:glyph-orientation-vertical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleGlyphOrientationVerticalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:glyph-orientation-vertical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:glyph-orientation-vertical}.
+	 */
+	public enum Value {
+		_0("0"), _0DEG("0deg"), _0GRAD("0grad"), _0RAD("0rad"), AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:glyph-orientation-vertical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:glyph-orientation-vertical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHeightAttribute.java
new file mode 100644
index 0000000..eb40c0f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHeightAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:height}.
+ *
+ */
+public class StyleHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "height");
+	public static final String DEFAULT_VALUE = "100%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHorizontalPosAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHorizontalPosAttribute.java
new file mode 100644
index 0000000..5f08b8a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHorizontalPosAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:horizontal-pos}.
+ *
+ */
+public class StyleHorizontalPosAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "horizontal-pos");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:horizontal-pos}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleHorizontalPosAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:horizontal-pos}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:horizontal-pos}.
+	 */
+	public enum Value {
+		CENTER("center"), FROM_INSIDE("from-inside"), FROM_LEFT("from-left"), INSIDE("inside"), LEFT("left"), OUTSIDE("outside"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:horizontal-pos}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:horizontal-pos} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHorizontalRelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHorizontalRelAttribute.java
new file mode 100644
index 0000000..5808f85
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleHorizontalRelAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:horizontal-rel}.
+ *
+ */
+public class StyleHorizontalRelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "horizontal-rel");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:horizontal-rel}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleHorizontalRelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:horizontal-rel}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:horizontal-rel}.
+	 */
+	public enum Value {
+		CHAR("char"), FRAME("frame"), FRAME_CONTENT("frame-content"), FRAME_END_MARGIN("frame-end-margin"), FRAME_START_MARGIN("frame-start-margin"), PAGE("page"), PAGE_CONTENT("page-content"), PAGE_END_MARGIN("page-end-margin"), PAGE_START_MARGIN("page-start-margin"), PARAGRAPH("paragraph"), PARAGRAPH_CONTENT("paragraph-content"), PARAGRAPH_END_MARGIN("paragraph-end-margin"), PARAGRAPH_START_MARGIN("paragraph-start-margin") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:horizontal-rel}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:horizontal-rel} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleJoinBorderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleJoinBorderAttribute.java
new file mode 100644
index 0000000..10fc706
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleJoinBorderAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:join-border}.
+ *
+ */
+public class StyleJoinBorderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "join-border");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:join-border}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleJoinBorderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:join-border}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:join-border}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:join-border} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleJustifySingleWordAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleJustifySingleWordAttribute.java
new file mode 100644
index 0000000..3c71bc1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleJustifySingleWordAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:justify-single-word}.
+ *
+ */
+public class StyleJustifySingleWordAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "justify-single-word");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:justify-single-word}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleJustifySingleWordAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:justify-single-word}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:justify-single-word}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:justify-single-word} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLanguageAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLanguageAsianAttribute.java
new file mode 100644
index 0000000..1ea143e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLanguageAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:language-asian}.
+ *
+ */
+public class StyleLanguageAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "language-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:language-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLanguageAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:language-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:language-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:language-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLanguageComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLanguageComplexAttribute.java
new file mode 100644
index 0000000..bb8debc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLanguageComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:language-complex}.
+ *
+ */
+public class StyleLanguageComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "language-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:language-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLanguageComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:language-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:language-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:language-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridBaseHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridBaseHeightAttribute.java
new file mode 100644
index 0000000..28aeb35
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridBaseHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-base-height}.
+ *
+ */
+public class StyleLayoutGridBaseHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-base-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-base-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridBaseHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-base-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-base-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-base-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridBaseWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridBaseWidthAttribute.java
new file mode 100644
index 0000000..8cdba9c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridBaseWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-base-width}.
+ *
+ */
+public class StyleLayoutGridBaseWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-base-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-base-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridBaseWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-base-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-base-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-base-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridColorAttribute.java
new file mode 100644
index 0000000..1557bc7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-color}.
+ *
+ */
+public class StyleLayoutGridColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridDisplayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridDisplayAttribute.java
new file mode 100644
index 0000000..68257d9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridDisplayAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-display}.
+ *
+ */
+public class StyleLayoutGridDisplayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-display");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-display}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridDisplayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-display}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-display}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-display} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridLinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridLinesAttribute.java
new file mode 100644
index 0000000..0e7d35a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridLinesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-lines}.
+ *
+ */
+public class StyleLayoutGridLinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-lines");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-lines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridLinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-lines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-lines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-lines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridModeAttribute.java
new file mode 100644
index 0000000..4852195
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-mode}.
+ *
+ */
+public class StyleLayoutGridModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:layout-grid-mode}.
+	 */
+	public enum Value {
+		BOTH("both"), LINE("line"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridPrintAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridPrintAttribute.java
new file mode 100644
index 0000000..b42f7dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridPrintAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-print}.
+ *
+ */
+public class StyleLayoutGridPrintAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-print");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-print}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridPrintAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-print}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-print}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-print} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridRubyBelowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridRubyBelowAttribute.java
new file mode 100644
index 0000000..4b775ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridRubyBelowAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-ruby-below}.
+ *
+ */
+public class StyleLayoutGridRubyBelowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-ruby-below");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-ruby-below}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridRubyBelowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-ruby-below}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-ruby-below}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-ruby-below} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridRubyHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridRubyHeightAttribute.java
new file mode 100644
index 0000000..8cb1cae
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridRubyHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-ruby-height}.
+ *
+ */
+public class StyleLayoutGridRubyHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-ruby-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-ruby-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridRubyHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-ruby-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-ruby-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-ruby-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridSnapToAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridSnapToAttribute.java
new file mode 100644
index 0000000..f96adb0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridSnapToAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-snap-to}.
+ *
+ */
+public class StyleLayoutGridSnapToAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-snap-to");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-snap-to}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridSnapToAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-snap-to}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-snap-to}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-snap-to} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridStandardModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridStandardModeAttribute.java
new file mode 100644
index 0000000..bb92517
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLayoutGridStandardModeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:layout-grid-standard-mode}.
+ *
+ */
+public class StyleLayoutGridStandardModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-standard-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:layout-grid-standard-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLayoutGridStandardModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:layout-grid-standard-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:layout-grid-standard-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:layout-grid-standard-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderCharAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderCharAttribute.java
new file mode 100644
index 0000000..337a1b3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderCharAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-char}.
+ *
+ */
+public class StyleLeaderCharAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-char");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-char}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderCharAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-char}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-char}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-char} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderColorAttribute.java
new file mode 100644
index 0000000..8ae7012
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderColorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-color}.
+ *
+ */
+public class StyleLeaderColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:leader-color}.
+	 */
+	public enum Value {
+		FONT_COLOR("font-color") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderStyleAttribute.java
new file mode 100644
index 0000000..ceb5f1a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-style}.
+ *
+ */
+public class StyleLeaderStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:leader-style}.
+	 */
+	public enum Value {
+		DASH("dash"), DOT_DASH("dot-dash"), DOT_DOT_DASH("dot-dot-dash"), DOTTED("dotted"), LONG_DASH("long-dash"), NONE("none"), SOLID("solid"), WAVE("wave") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTextAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTextAttribute.java
new file mode 100644
index 0000000..cd6368c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTextAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-text}.
+ *
+ */
+public class StyleLeaderTextAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-text");
+	public static final String DEFAULT_VALUE = " ";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-text}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderTextAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-text}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-text}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-text} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTextStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTextStyleAttribute.java
new file mode 100644
index 0000000..8eeeb3f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTextStyleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-text-style}.
+ *
+ */
+public class StyleLeaderTextStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-text-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-text-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderTextStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-text-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-text-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-text-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTypeAttribute.java
new file mode 100644
index 0000000..d9284f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-type}.
+ *
+ */
+public class StyleLeaderTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:leader-type}.
+	 */
+	public enum Value {
+		DOUBLE("double"), NONE("none"), SINGLE("single") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderWidthAttribute.java
new file mode 100644
index 0000000..771291d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLeaderWidthAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:leader-width}.
+ *
+ */
+public class StyleLeaderWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "leader-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:leader-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLeaderWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:leader-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:leader-width}.
+	 */
+	public enum Value {
+		AUTO("auto"), BOLD("bold"), MEDIUM("medium"), NORMAL("normal"), THICK("thick"), THIN("thin") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:leader-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:leader-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLegendExpansionAspectRatioAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLegendExpansionAspectRatioAttribute.java
new file mode 100644
index 0000000..8815afe
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLegendExpansionAspectRatioAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:legend-expansion-aspect-ratio}.
+ *
+ */
+public class StyleLegendExpansionAspectRatioAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "legend-expansion-aspect-ratio");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:legend-expansion-aspect-ratio}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLegendExpansionAspectRatioAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:legend-expansion-aspect-ratio}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:legend-expansion-aspect-ratio}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:legend-expansion-aspect-ratio} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLegendExpansionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLegendExpansionAttribute.java
new file mode 100644
index 0000000..1c644d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLegendExpansionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:legend-expansion}.
+ *
+ */
+public class StyleLegendExpansionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "legend-expansion");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:legend-expansion}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLegendExpansionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:legend-expansion}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:legend-expansion}.
+	 */
+	public enum Value {
+		BALANCED("balanced"), CUSTOM("custom"), HIGH("high"), WIDE("wide") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:legend-expansion}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:legend-expansion} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLengthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLengthAttribute.java
new file mode 100644
index 0000000..ab5ef57
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLengthAttribute.java
@@ -0,0 +1,166 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:length}.
+ *
+ */
+public class StyleLengthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "length");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:length}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLengthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:length}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:length}.
+	 */
+	public enum Value {
+		WORD("word") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:length}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:length} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLetterKerningAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLetterKerningAttribute.java
new file mode 100644
index 0000000..13485ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLetterKerningAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:letter-kerning}.
+ *
+ */
+public class StyleLetterKerningAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "letter-kerning");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:letter-kerning}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLetterKerningAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:letter-kerning}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:letter-kerning}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:letter-kerning} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineBreakAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineBreakAttribute.java
new file mode 100644
index 0000000..9376ef3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineBreakAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:line-break}.
+ *
+ */
+public class StyleLineBreakAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "line-break");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:line-break}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLineBreakAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:line-break}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:line-break}.
+	 */
+	public enum Value {
+		NORMAL("normal"), STRICT("strict") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:line-break}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:line-break} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineHeightAtLeastAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineHeightAtLeastAttribute.java
new file mode 100644
index 0000000..84b30bc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineHeightAtLeastAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:line-height-at-least}.
+ *
+ */
+public class StyleLineHeightAtLeastAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "line-height-at-least");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:line-height-at-least}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLineHeightAtLeastAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:line-height-at-least}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:line-height-at-least}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:line-height-at-least} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineSpacingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineSpacingAttribute.java
new file mode 100644
index 0000000..2b76c20
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineSpacingAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:line-spacing}.
+ *
+ */
+public class StyleLineSpacingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "line-spacing");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:line-spacing}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLineSpacingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:line-spacing}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:line-spacing}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:line-spacing} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineStyleAttribute.java
new file mode 100644
index 0000000..22f5604
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLineStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:line-style}.
+ *
+ */
+public class StyleLineStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "line-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:line-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLineStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:line-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:line-style}.
+	 */
+	public enum Value {
+		DASH("dash"), DOT_DASH("dot-dash"), DOT_DOT_DASH("dot-dot-dash"), DOTTED("dotted"), LONG_DASH("long-dash"), NONE("none"), SOLID("solid"), WAVE("wave") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:line-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:line-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLinesAttribute.java
new file mode 100644
index 0000000..490d943
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleLinesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:lines}.
+ *
+ */
+public class StyleLinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "lines");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:lines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleLinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:lines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:lines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:lines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleListLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleListLevelAttribute.java
new file mode 100644
index 0000000..b094658
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleListLevelAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:list-level}.
+ *
+ */
+public class StyleListLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "list-level");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:list-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleListLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:list-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:list-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:list-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleListStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleListStyleNameAttribute.java
new file mode 100644
index 0000000..eccb112
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleListStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:list-style-name}.
+ *
+ */
+public class StyleListStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "list-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:list-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleListStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:list-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:list-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:list-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMasterPageNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMasterPageNameAttribute.java
new file mode 100644
index 0000000..0ac0e66
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMasterPageNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:master-page-name}.
+ *
+ */
+public class StyleMasterPageNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "master-page-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:master-page-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleMasterPageNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:master-page-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:master-page-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:master-page-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMayBreakBetweenRowsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMayBreakBetweenRowsAttribute.java
new file mode 100644
index 0000000..299ca84
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMayBreakBetweenRowsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:may-break-between-rows}.
+ *
+ */
+public class StyleMayBreakBetweenRowsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "may-break-between-rows");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:may-break-between-rows}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleMayBreakBetweenRowsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:may-break-between-rows}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:may-break-between-rows}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:may-break-between-rows} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMinRowHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMinRowHeightAttribute.java
new file mode 100644
index 0000000..2275b2d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMinRowHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:min-row-height}.
+ *
+ */
+public class StyleMinRowHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "min-row-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:min-row-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleMinRowHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:min-row-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:min-row-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:min-row-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMirrorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMirrorAttribute.java
new file mode 100644
index 0000000..a735293
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleMirrorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:mirror}.
+ *
+ */
+public class StyleMirrorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "mirror");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:mirror}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleMirrorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:mirror}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:mirror}.
+	 */
+	public enum Value {
+		HORIZONTAL("horizontal"), HORIZONTAL_ON_EVEN("horizontal-on-even"), HORIZONTAL_ON_ODD("horizontal-on-odd"), NONE("none"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:mirror}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:mirror} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNameAttribute.java
new file mode 100644
index 0000000..787d697
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:name}.
+ *
+ */
+public class StyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNextStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNextStyleNameAttribute.java
new file mode 100644
index 0000000..7a1951a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNextStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:next-style-name}.
+ *
+ */
+public class StyleNextStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "next-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:next-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNextStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:next-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:next-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:next-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumFormatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumFormatAttribute.java
new file mode 100644
index 0000000..8215351
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumFormatAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:num-format}.
+ *
+ */
+public class StyleNumFormatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "num-format");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:num-format}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNumFormatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:num-format}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:num-format}.
+	 */
+	public enum Value {
+		_1("1"), A("A"), I("I"), a("a"), i("i") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:num-format}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:num-format} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumLetterSyncAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumLetterSyncAttribute.java
new file mode 100644
index 0000000..0202ef2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumLetterSyncAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:num-letter-sync}.
+ *
+ */
+public class StyleNumLetterSyncAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "num-letter-sync");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:num-letter-sync}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNumLetterSyncAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:num-letter-sync}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:num-letter-sync}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:num-letter-sync} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumPrefixAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumPrefixAttribute.java
new file mode 100644
index 0000000..62dd2f9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumPrefixAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:num-prefix}.
+ *
+ */
+public class StyleNumPrefixAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "num-prefix");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:num-prefix}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNumPrefixAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:num-prefix}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:num-prefix}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:num-prefix} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumSuffixAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumSuffixAttribute.java
new file mode 100644
index 0000000..f8b9c2e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumSuffixAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:num-suffix}.
+ *
+ */
+public class StyleNumSuffixAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "num-suffix");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:num-suffix}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNumSuffixAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:num-suffix}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:num-suffix}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:num-suffix} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumberWrappedParagraphsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumberWrappedParagraphsAttribute.java
new file mode 100644
index 0000000..698fa81
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleNumberWrappedParagraphsAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:number-wrapped-paragraphs}.
+ *
+ */
+public class StyleNumberWrappedParagraphsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "number-wrapped-paragraphs");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:number-wrapped-paragraphs}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleNumberWrappedParagraphsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:number-wrapped-paragraphs}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:number-wrapped-paragraphs}.
+	 */
+	public enum Value {
+		NO_LIMIT("no-limit") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:number-wrapped-paragraphs}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:number-wrapped-paragraphs} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleOverflowBehaviorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleOverflowBehaviorAttribute.java
new file mode 100644
index 0000000..3fe3a71
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleOverflowBehaviorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:overflow-behavior}.
+ *
+ */
+public class StyleOverflowBehaviorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "overflow-behavior");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:overflow-behavior}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleOverflowBehaviorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:overflow-behavior}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:overflow-behavior}.
+	 */
+	public enum Value {
+		AUTO_CREATE_NEW_FRAME("auto-create-new-frame"), CLIP("clip") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:overflow-behavior}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:overflow-behavior} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageLayoutNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageLayoutNameAttribute.java
new file mode 100644
index 0000000..5a7d903
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageLayoutNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:page-layout-name}.
+ *
+ */
+public class StylePageLayoutNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "page-layout-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:page-layout-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePageLayoutNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:page-layout-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:page-layout-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:page-layout-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageNumberAttribute.java
new file mode 100644
index 0000000..b96013a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageNumberAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:page-number}.
+ *
+ */
+public class StylePageNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "page-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:page-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePageNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:page-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:page-number}.
+	 */
+	public enum Value {
+		AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:page-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:page-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageUsageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageUsageAttribute.java
new file mode 100644
index 0000000..05934a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePageUsageAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:page-usage}.
+ *
+ */
+public class StylePageUsageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "page-usage");
+	public static final String DEFAULT_VALUE = "all";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:page-usage}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePageUsageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:page-usage}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:page-usage}.
+	 */
+	public enum Value {
+		ALL("all"), LEFT("left"), MIRRORED("mirrored"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:page-usage}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:page-usage} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePaperTrayNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePaperTrayNameAttribute.java
new file mode 100644
index 0000000..5f1ea6b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePaperTrayNameAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:paper-tray-name}.
+ *
+ */
+public class StylePaperTrayNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "paper-tray-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:paper-tray-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePaperTrayNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:paper-tray-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:paper-tray-name}.
+	 */
+	public enum Value {
+		DEFAULT("default") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:paper-tray-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:paper-tray-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleParentStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleParentStyleNameAttribute.java
new file mode 100644
index 0000000..10e2ccc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleParentStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:parent-style-name}.
+ *
+ */
+public class StyleParentStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "parent-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:parent-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleParentStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:parent-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:parent-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:parent-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePercentageDataStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePercentageDataStyleNameAttribute.java
new file mode 100644
index 0000000..6e48ee5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePercentageDataStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:percentage-data-style-name}.
+ *
+ */
+public class StylePercentageDataStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "percentage-data-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:percentage-data-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePercentageDataStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:percentage-data-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:percentage-data-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:percentage-data-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePositionAttribute.java
new file mode 100644
index 0000000..9f584e5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePositionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:position}.
+ *
+ */
+public class StylePositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "position");
+	public static final String DEFAULT_VALUE = "center";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:position}.
+	 */
+	public enum Value {
+		BOTTOM("bottom"), CENTER("center"), LEFT("left"), RIGHT("right"), TOP("top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintAttribute.java
new file mode 100644
index 0000000..4f17852
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:print}.
+ *
+ */
+public class StylePrintAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "print");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:print}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePrintAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:print}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:print}.
+	 */
+	public enum Value {
+		ANNOTATIONS("annotations"), CHARTS("charts"), DRAWINGS("drawings"), FORMULAS("formulas"), GRID("grid"), HEADERS("headers"), OBJECTS("objects"), ZERO_VALUES("zero-values") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:print}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:print} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintContentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintContentAttribute.java
new file mode 100644
index 0000000..dd01501
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintContentAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:print-content}.
+ *
+ */
+public class StylePrintContentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "print-content");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:print-content}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePrintContentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:print-content}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:print-content}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:print-content} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintOrientationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintOrientationAttribute.java
new file mode 100644
index 0000000..896b050
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintOrientationAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:print-orientation}.
+ *
+ */
+public class StylePrintOrientationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "print-orientation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:print-orientation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePrintOrientationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:print-orientation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:print-orientation}.
+	 */
+	public enum Value {
+		LANDSCAPE("landscape"), PORTRAIT("portrait") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:print-orientation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:print-orientation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintPageOrderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintPageOrderAttribute.java
new file mode 100644
index 0000000..46f3f08
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePrintPageOrderAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:print-page-order}.
+ *
+ */
+public class StylePrintPageOrderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "print-page-order");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:print-page-order}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePrintPageOrderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:print-page-order}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:print-page-order}.
+	 */
+	public enum Value {
+		LTR("ltr"), TTB("ttb") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:print-page-order}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:print-page-order} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleProtectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleProtectAttribute.java
new file mode 100644
index 0000000..89b7498
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleProtectAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:protect}.
+ *
+ */
+public class StyleProtectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "protect");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:protect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleProtectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:protect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:protect}.
+	 */
+	public enum Value {
+		CONTENT("content"), FALSE("false"), NONE("none"), POSITION("position"), SIZE("size"), TRUE("true") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:protect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:protect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePunctuationWrapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePunctuationWrapAttribute.java
new file mode 100644
index 0000000..37bd14a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StylePunctuationWrapAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:punctuation-wrap}.
+ *
+ */
+public class StylePunctuationWrapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "punctuation-wrap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:punctuation-wrap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StylePunctuationWrapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:punctuation-wrap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:punctuation-wrap}.
+	 */
+	public enum Value {
+		HANGING("hanging"), SIMPLE("simple") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:punctuation-wrap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:punctuation-wrap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRegisterTrueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRegisterTrueAttribute.java
new file mode 100644
index 0000000..12d6c93
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRegisterTrueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:register-true}.
+ *
+ */
+public class StyleRegisterTrueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "register-true");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:register-true}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRegisterTrueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:register-true}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:register-true}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:register-true} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRegisterTruthRefStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRegisterTruthRefStyleNameAttribute.java
new file mode 100644
index 0000000..a21ceb3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRegisterTruthRefStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:register-truth-ref-style-name}.
+ *
+ */
+public class StyleRegisterTruthRefStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "register-truth-ref-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:register-truth-ref-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRegisterTruthRefStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:register-truth-ref-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:register-truth-ref-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:register-truth-ref-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelColumnWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelColumnWidthAttribute.java
new file mode 100644
index 0000000..765561a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelColumnWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rel-column-width}.
+ *
+ */
+public class StyleRelColumnWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rel-column-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rel-column-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRelColumnWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rel-column-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rel-column-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rel-column-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelHeightAttribute.java
new file mode 100644
index 0000000..388dc03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelHeightAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rel-height}.
+ *
+ */
+public class StyleRelHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rel-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rel-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRelHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rel-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:rel-height}.
+	 */
+	public enum Value {
+		SCALE("scale"), SCALE_MIN("scale-min") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rel-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rel-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelWidthAttribute.java
new file mode 100644
index 0000000..7308636
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRelWidthAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rel-width}.
+ *
+ */
+public class StyleRelWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rel-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rel-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRelWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rel-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:rel-width}.
+	 */
+	public enum Value {
+		SCALE("scale"), SCALE_MIN("scale-min") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rel-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rel-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRepeatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRepeatAttribute.java
new file mode 100644
index 0000000..d8bcc52
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRepeatAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:repeat}.
+ *
+ */
+public class StyleRepeatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "repeat");
+	public static final String DEFAULT_VALUE = "repeat";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:repeat}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRepeatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:repeat}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:repeat}.
+	 */
+	public enum Value {
+		NO_REPEAT("no-repeat"), REPEAT("repeat"), STRETCH("stretch") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:repeat}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:repeat} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRepeatContentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRepeatContentAttribute.java
new file mode 100644
index 0000000..2e3e648
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRepeatContentAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:repeat-content}.
+ *
+ */
+public class StyleRepeatContentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "repeat-content");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:repeat-content}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRepeatContentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:repeat-content}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:repeat-content}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:repeat-content} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagAsianAttribute.java
new file mode 100644
index 0000000..444e58f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rfc-language-tag-asian}.
+ *
+ */
+public class StyleRfcLanguageTagAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rfc-language-tag-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRfcLanguageTagAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rfc-language-tag-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rfc-language-tag-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rfc-language-tag-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagAttribute.java
new file mode 100644
index 0000000..9789be0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rfc-language-tag}.
+ *
+ */
+public class StyleRfcLanguageTagAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rfc-language-tag}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRfcLanguageTagAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rfc-language-tag}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rfc-language-tag}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rfc-language-tag} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagComplexAttribute.java
new file mode 100644
index 0000000..0b09199
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRfcLanguageTagComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rfc-language-tag-complex}.
+ *
+ */
+public class StyleRfcLanguageTagComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rfc-language-tag-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRfcLanguageTagComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rfc-language-tag-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rfc-language-tag-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rfc-language-tag-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRotationAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRotationAlignAttribute.java
new file mode 100644
index 0000000..b6f9986
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRotationAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rotation-align}.
+ *
+ */
+public class StyleRotationAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rotation-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRotationAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rotation-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:rotation-align}.
+	 */
+	public enum Value {
+		BOTTOM("bottom"), CENTER("center"), NONE("none"), TOP("top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rotation-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rotation-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRotationAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRotationAngleAttribute.java
new file mode 100644
index 0000000..5b9055e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRotationAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:rotation-angle}.
+ *
+ */
+public class StyleRotationAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:rotation-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRotationAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:rotation-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:rotation-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:rotation-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRowHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRowHeightAttribute.java
new file mode 100644
index 0000000..15fde36
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRowHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:row-height}.
+ *
+ */
+public class StyleRowHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "row-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:row-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRowHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:row-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:row-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:row-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRubyAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRubyAlignAttribute.java
new file mode 100644
index 0000000..ed939c9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRubyAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:ruby-align}.
+ *
+ */
+public class StyleRubyAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:ruby-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRubyAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:ruby-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:ruby-align}.
+	 */
+	public enum Value {
+		CENTER("center"), DISTRIBUTE_LETTER("distribute-letter"), DISTRIBUTE_SPACE("distribute-space"), LEFT("left"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:ruby-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:ruby-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRubyPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRubyPositionAttribute.java
new file mode 100644
index 0000000..15d6d79
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRubyPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:ruby-position}.
+ *
+ */
+public class StyleRubyPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:ruby-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRubyPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:ruby-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:ruby-position}.
+	 */
+	public enum Value {
+		ABOVE("above"), BELOW("below") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:ruby-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:ruby-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRunThroughAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRunThroughAttribute.java
new file mode 100644
index 0000000..86c78ba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleRunThroughAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:run-through}.
+ *
+ */
+public class StyleRunThroughAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "run-through");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:run-through}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleRunThroughAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:run-through}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:run-through}.
+	 */
+	public enum Value {
+		BACKGROUND("background"), FOREGROUND("foreground") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:run-through}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:run-through} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScaleToAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScaleToAttribute.java
new file mode 100644
index 0000000..6fa979c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScaleToAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:scale-to}.
+ *
+ */
+public class StyleScaleToAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "scale-to");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:scale-to}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleScaleToAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:scale-to}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:scale-to}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:scale-to} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScaleToPagesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScaleToPagesAttribute.java
new file mode 100644
index 0000000..a90ead7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScaleToPagesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:scale-to-pages}.
+ *
+ */
+public class StyleScaleToPagesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "scale-to-pages");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:scale-to-pages}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleScaleToPagesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:scale-to-pages}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:scale-to-pages}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:scale-to-pages} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptAsianAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptAsianAttribute.java
new file mode 100644
index 0000000..c9ff736
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptAsianAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:script-asian}.
+ *
+ */
+public class StyleScriptAsianAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "script-asian");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:script-asian}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleScriptAsianAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:script-asian}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:script-asian}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:script-asian} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptComplexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptComplexAttribute.java
new file mode 100644
index 0000000..d9b194f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptComplexAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:script-complex}.
+ *
+ */
+public class StyleScriptComplexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "script-complex");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:script-complex}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleScriptComplexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:script-complex}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:script-complex}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:script-complex} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptTypeAttribute.java
new file mode 100644
index 0000000..6835cc9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleScriptTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:script-type}.
+ *
+ */
+public class StyleScriptTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "script-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:script-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleScriptTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:script-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:script-type}.
+	 */
+	public enum Value {
+		ASIAN("asian"), COMPLEX("complex"), IGNORE("ignore"), LATIN("latin") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:script-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:script-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleShadowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleShadowAttribute.java
new file mode 100644
index 0000000..9d37706
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleShadowAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:shadow}.
+ *
+ */
+public class StyleShadowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "shadow");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:shadow}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleShadowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:shadow}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:shadow}.
+	 */
+	public enum Value {
+		NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:shadow}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:shadow} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleShrinkToFitAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleShrinkToFitAttribute.java
new file mode 100644
index 0000000..98ee14d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleShrinkToFitAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:shrink-to-fit}.
+ *
+ */
+public class StyleShrinkToFitAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "shrink-to-fit");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:shrink-to-fit}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleShrinkToFitAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:shrink-to-fit}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:shrink-to-fit}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:shrink-to-fit} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleSnapToLayoutGridAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleSnapToLayoutGridAttribute.java
new file mode 100644
index 0000000..012defc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleSnapToLayoutGridAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:snap-to-layout-grid}.
+ *
+ */
+public class StyleSnapToLayoutGridAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "snap-to-layout-grid");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:snap-to-layout-grid}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleSnapToLayoutGridAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:snap-to-layout-grid}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:snap-to-layout-grid}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:snap-to-layout-grid} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleStyleAttribute.java
new file mode 100644
index 0000000..a872fac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleStyleAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:style}.
+ *
+ */
+public class StyleStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "style");
+	public static final String DEFAULT_VALUE = "solid";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:style}.
+	 */
+	public enum Value {
+		DASHED("dashed"), DOT_DASHED("dot-dashed"), DOTTED("dotted"), NONE("none"), SOLID("solid") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleStyleNameAttribute.java
new file mode 100644
index 0000000..d8858cb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:style-name}.
+ *
+ */
+public class StyleStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTabStopDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTabStopDistanceAttribute.java
new file mode 100644
index 0000000..26c2cec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTabStopDistanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:tab-stop-distance}.
+ *
+ */
+public class StyleTabStopDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "tab-stop-distance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:tab-stop-distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTabStopDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:tab-stop-distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:tab-stop-distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:tab-stop-distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTableCenteringAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTableCenteringAttribute.java
new file mode 100644
index 0000000..50138f1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTableCenteringAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:table-centering}.
+ *
+ */
+public class StyleTableCenteringAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "table-centering");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:table-centering}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTableCenteringAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:table-centering}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:table-centering}.
+	 */
+	public enum Value {
+		BOTH("both"), HORIZONTAL("horizontal"), NONE("none"), VERTICAL("vertical") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:table-centering}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:table-centering} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextAlignSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextAlignSourceAttribute.java
new file mode 100644
index 0000000..ec2cca1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextAlignSourceAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-align-source}.
+ *
+ */
+public class StyleTextAlignSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-align-source");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-align-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextAlignSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-align-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-align-source}.
+	 */
+	public enum Value {
+		FIX("fix"), VALUE_TYPE("value-type") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-align-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-align-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextAutospaceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextAutospaceAttribute.java
new file mode 100644
index 0000000..1492e01
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextAutospaceAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-autospace}.
+ *
+ */
+public class StyleTextAutospaceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-autospace");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-autospace}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextAutospaceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-autospace}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-autospace}.
+	 */
+	public enum Value {
+		IDEOGRAPH_ALPHA("ideograph-alpha"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-autospace}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-autospace} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextBlinkingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextBlinkingAttribute.java
new file mode 100644
index 0000000..437eba6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextBlinkingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-blinking}.
+ *
+ */
+public class StyleTextBlinkingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-blinking");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-blinking}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextBlinkingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-blinking}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-blinking}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-blinking} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineAttribute.java
new file mode 100644
index 0000000..5ab79d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-combine}.
+ *
+ */
+public class StyleTextCombineAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-combine}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextCombineAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-combine}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-combine}.
+	 */
+	public enum Value {
+		LETTERS("letters"), LINES("lines"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-combine}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-combine} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineEndCharAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineEndCharAttribute.java
new file mode 100644
index 0000000..5bbfafe
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineEndCharAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-combine-end-char}.
+ *
+ */
+public class StyleTextCombineEndCharAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine-end-char");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-combine-end-char}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextCombineEndCharAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-combine-end-char}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-combine-end-char}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-combine-end-char} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineStartCharAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineStartCharAttribute.java
new file mode 100644
index 0000000..5ee68ac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextCombineStartCharAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-combine-start-char}.
+ *
+ */
+public class StyleTextCombineStartCharAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine-start-char");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-combine-start-char}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextCombineStartCharAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-combine-start-char}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-combine-start-char}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-combine-start-char} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextEmphasizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextEmphasizeAttribute.java
new file mode 100644
index 0000000..3561378
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextEmphasizeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-emphasize}.
+ *
+ */
+public class StyleTextEmphasizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-emphasize");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-emphasize}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextEmphasizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-emphasize}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-emphasize}.
+	 */
+	public enum Value {
+		ABOVE("above"), ACCENT("accent"), BELOW("below"), CIRCLE("circle"), DISC("disc"), DOT("dot"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-emphasize}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-emphasize} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughColorAttribute.java
new file mode 100644
index 0000000..94b6d1a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughColorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-color}.
+ *
+ */
+public class StyleTextLineThroughColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-line-through-color}.
+	 */
+	public enum Value {
+		FONT_COLOR("font-color") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughModeAttribute.java
new file mode 100644
index 0000000..8d28800
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-mode}.
+ *
+ */
+public class StyleTextLineThroughModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-line-through-mode}.
+	 */
+	public enum Value {
+		CONTINUOUS("continuous"), SKIP_WHITE_SPACE("skip-white-space") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughStyleAttribute.java
new file mode 100644
index 0000000..a1eb8b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-style}.
+ *
+ */
+public class StyleTextLineThroughStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-line-through-style}.
+	 */
+	public enum Value {
+		DASH("dash"), DOT_DASH("dot-dash"), DOT_DOT_DASH("dot-dot-dash"), DOTTED("dotted"), LONG_DASH("long-dash"), NONE("none"), SOLID("solid"), WAVE("wave") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTextAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTextAttribute.java
new file mode 100644
index 0000000..c9dbeca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTextAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-text}.
+ *
+ */
+public class StyleTextLineThroughTextAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-text");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-text}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughTextAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-text}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-text}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-text} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTextStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTextStyleAttribute.java
new file mode 100644
index 0000000..eacac77
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTextStyleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-text-style}.
+ *
+ */
+public class StyleTextLineThroughTextStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-text-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-text-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughTextStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-text-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-text-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-text-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTypeAttribute.java
new file mode 100644
index 0000000..8fe602d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-type}.
+ *
+ */
+public class StyleTextLineThroughTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-line-through-type}.
+	 */
+	public enum Value {
+		DOUBLE("double"), NONE("none"), SINGLE("single") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughWidthAttribute.java
new file mode 100644
index 0000000..52b7896
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextLineThroughWidthAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-line-through-width}.
+ *
+ */
+public class StyleTextLineThroughWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-line-through-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextLineThroughWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-line-through-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-line-through-width}.
+	 */
+	public enum Value {
+		AUTO("auto"), BOLD("bold"), MEDIUM("medium"), NORMAL("normal"), THICK("thick"), THIN("thin") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-line-through-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-line-through-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOutlineAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOutlineAttribute.java
new file mode 100644
index 0000000..9cd83c5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOutlineAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-outline}.
+ *
+ */
+public class StyleTextOutlineAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-outline");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-outline}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextOutlineAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-outline}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-outline}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-outline} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineColorAttribute.java
new file mode 100644
index 0000000..7ca27a4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineColorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-overline-color}.
+ *
+ */
+public class StyleTextOverlineColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-overline-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextOverlineColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-overline-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-overline-color}.
+	 */
+	public enum Value {
+		FONT_COLOR("font-color") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-overline-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-overline-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineModeAttribute.java
new file mode 100644
index 0000000..2d22bd6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-overline-mode}.
+ *
+ */
+public class StyleTextOverlineModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-overline-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextOverlineModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-overline-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-overline-mode}.
+	 */
+	public enum Value {
+		CONTINUOUS("continuous"), SKIP_WHITE_SPACE("skip-white-space") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-overline-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-overline-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineStyleAttribute.java
new file mode 100644
index 0000000..7ca07b5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-overline-style}.
+ *
+ */
+public class StyleTextOverlineStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-overline-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextOverlineStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-overline-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-overline-style}.
+	 */
+	public enum Value {
+		DASH("dash"), DOT_DASH("dot-dash"), DOT_DOT_DASH("dot-dot-dash"), DOTTED("dotted"), LONG_DASH("long-dash"), NONE("none"), SOLID("solid"), WAVE("wave") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-overline-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-overline-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineTypeAttribute.java
new file mode 100644
index 0000000..e9d0364
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-overline-type}.
+ *
+ */
+public class StyleTextOverlineTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-overline-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextOverlineTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-overline-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-overline-type}.
+	 */
+	public enum Value {
+		DOUBLE("double"), NONE("none"), SINGLE("single") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-overline-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-overline-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineWidthAttribute.java
new file mode 100644
index 0000000..5f4ac39
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextOverlineWidthAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-overline-width}.
+ *
+ */
+public class StyleTextOverlineWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-overline-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextOverlineWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-overline-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-overline-width}.
+	 */
+	public enum Value {
+		AUTO("auto"), BOLD("bold"), MEDIUM("medium"), NORMAL("normal"), THICK("thick"), THIN("thin") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-overline-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-overline-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextPositionAttribute.java
new file mode 100644
index 0000000..5aa816b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-position}.
+ *
+ */
+public class StyleTextPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-position}.
+	 */
+	public enum Value {
+		SUB("sub"), SUPER("super") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextRotationAngleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextRotationAngleAttribute.java
new file mode 100644
index 0000000..bdc2846
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextRotationAngleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-rotation-angle}.
+ *
+ */
+public class StyleTextRotationAngleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-rotation-angle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-rotation-angle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextRotationAngleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-rotation-angle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-rotation-angle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-rotation-angle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextRotationScaleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextRotationScaleAttribute.java
new file mode 100644
index 0000000..dfbffc1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextRotationScaleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-rotation-scale}.
+ *
+ */
+public class StyleTextRotationScaleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-rotation-scale");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-rotation-scale}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextRotationScaleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-rotation-scale}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-rotation-scale}.
+	 */
+	public enum Value {
+		FIXED("fixed"), LINE_HEIGHT("line-height") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-rotation-scale}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-rotation-scale} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextScaleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextScaleAttribute.java
new file mode 100644
index 0000000..0d7ea5e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextScaleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-scale}.
+ *
+ */
+public class StyleTextScaleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-scale");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-scale}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextScaleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-scale}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-scale}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-scale} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineColorAttribute.java
new file mode 100644
index 0000000..1f76529
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineColorAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-underline-color}.
+ *
+ */
+public class StyleTextUnderlineColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-underline-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextUnderlineColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-underline-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-underline-color}.
+	 */
+	public enum Value {
+		FONT_COLOR("font-color") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-underline-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-underline-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineModeAttribute.java
new file mode 100644
index 0000000..23c98b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-underline-mode}.
+ *
+ */
+public class StyleTextUnderlineModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-underline-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextUnderlineModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-underline-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-underline-mode}.
+	 */
+	public enum Value {
+		CONTINUOUS("continuous"), SKIP_WHITE_SPACE("skip-white-space") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-underline-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-underline-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineStyleAttribute.java
new file mode 100644
index 0000000..75c55d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-underline-style}.
+ *
+ */
+public class StyleTextUnderlineStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-underline-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextUnderlineStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-underline-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-underline-style}.
+	 */
+	public enum Value {
+		DASH("dash"), DOT_DASH("dot-dash"), DOT_DOT_DASH("dot-dot-dash"), DOTTED("dotted"), LONG_DASH("long-dash"), NONE("none"), SOLID("solid"), WAVE("wave") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-underline-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-underline-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineTypeAttribute.java
new file mode 100644
index 0000000..5fdb65e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-underline-type}.
+ *
+ */
+public class StyleTextUnderlineTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-underline-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextUnderlineTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-underline-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-underline-type}.
+	 */
+	public enum Value {
+		DOUBLE("double"), NONE("none"), SINGLE("single") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-underline-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-underline-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineWidthAttribute.java
new file mode 100644
index 0000000..f16907f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTextUnderlineWidthAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:text-underline-width}.
+ *
+ */
+public class StyleTextUnderlineWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:text-underline-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextUnderlineWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:text-underline-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:text-underline-width}.
+	 */
+	public enum Value {
+		AUTO("auto"), BOLD("bold"), MEDIUM("medium"), NORMAL("normal"), THICK("thick"), THIN("thin") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:text-underline-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:text-underline-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTypeAttribute.java
new file mode 100644
index 0000000..27588d4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:type}.
+ *
+ */
+public class StyleTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "type");
+	public static final String DEFAULT_VALUE = "left";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:type}.
+	 */
+	public enum Value {
+		CENTER("center"), CHAR("char"), LEFT("left"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseOptimalColumnWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseOptimalColumnWidthAttribute.java
new file mode 100644
index 0000000..f159fb3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseOptimalColumnWidthAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:use-optimal-column-width}.
+ *
+ */
+public class StyleUseOptimalColumnWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "use-optimal-column-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:use-optimal-column-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleUseOptimalColumnWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:use-optimal-column-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:use-optimal-column-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:use-optimal-column-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseOptimalRowHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseOptimalRowHeightAttribute.java
new file mode 100644
index 0000000..418cb7e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseOptimalRowHeightAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:use-optimal-row-height}.
+ *
+ */
+public class StyleUseOptimalRowHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "use-optimal-row-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:use-optimal-row-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleUseOptimalRowHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:use-optimal-row-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:use-optimal-row-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:use-optimal-row-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseWindowFontColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseWindowFontColorAttribute.java
new file mode 100644
index 0000000..8e52bb4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleUseWindowFontColorAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:use-window-font-color}.
+ *
+ */
+public class StyleUseWindowFontColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "use-window-font-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:use-window-font-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleUseWindowFontColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:use-window-font-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:use-window-font-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:use-window-font-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalAlignAttribute.java
new file mode 100644
index 0000000..19bcd00
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalAlignAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:vertical-align}.
+ *
+ */
+public class StyleVerticalAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-align");
+	public static final String DEFAULT_VALUE = "top";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:vertical-align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleVerticalAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:vertical-align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:vertical-align}.
+	 */
+	public enum Value {
+		AUTO("auto"), AUTOMATIC("automatic"), BASELINE("baseline"), BOTTOM("bottom"), MIDDLE("middle"), TOP("top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:vertical-align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:vertical-align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalPosAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalPosAttribute.java
new file mode 100644
index 0000000..6298d68
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalPosAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:vertical-pos}.
+ *
+ */
+public class StyleVerticalPosAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-pos");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:vertical-pos}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleVerticalPosAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:vertical-pos}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:vertical-pos}.
+	 */
+	public enum Value {
+		BELOW("below"), BOTTOM("bottom"), FROM_TOP("from-top"), MIDDLE("middle"), TOP("top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:vertical-pos}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:vertical-pos} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalRelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalRelAttribute.java
new file mode 100644
index 0000000..a231d0d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVerticalRelAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:vertical-rel}.
+ *
+ */
+public class StyleVerticalRelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-rel");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:vertical-rel}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleVerticalRelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:vertical-rel}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:vertical-rel}.
+	 */
+	public enum Value {
+		BASELINE("baseline"), CHAR("char"), FRAME("frame"), FRAME_CONTENT("frame-content"), LINE("line"), PAGE("page"), PAGE_CONTENT("page-content"), PARAGRAPH("paragraph"), PARAGRAPH_CONTENT("paragraph-content"), TEXT("text") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:vertical-rel}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:vertical-rel} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVolatileAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVolatileAttribute.java
new file mode 100644
index 0000000..bf5f50b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleVolatileAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:volatile}.
+ *
+ */
+public class StyleVolatileAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "volatile");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:volatile}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleVolatileAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:volatile}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:volatile}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:volatile} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWidthAttribute.java
new file mode 100644
index 0000000..3f88eee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:width}.
+ *
+ */
+public class StyleWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapAttribute.java
new file mode 100644
index 0000000..0146af8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:wrap}.
+ *
+ */
+public class StyleWrapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "wrap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:wrap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWrapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:wrap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:wrap}.
+	 */
+	public enum Value {
+		BIGGEST("biggest"), DYNAMIC("dynamic"), LEFT("left"), NONE("none"), PARALLEL("parallel"), RIGHT("right"), RUN_THROUGH("run-through") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:wrap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:wrap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapContourAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapContourAttribute.java
new file mode 100644
index 0000000..d420ac5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapContourAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:wrap-contour}.
+ *
+ */
+public class StyleWrapContourAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-contour");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:wrap-contour}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWrapContourAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:wrap-contour}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:wrap-contour}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:wrap-contour} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapContourModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapContourModeAttribute.java
new file mode 100644
index 0000000..4581118
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapContourModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:wrap-contour-mode}.
+ *
+ */
+public class StyleWrapContourModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-contour-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:wrap-contour-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWrapContourModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:wrap-contour-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:wrap-contour-mode}.
+	 */
+	public enum Value {
+		FULL("full"), OUTSIDE("outside") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:wrap-contour-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:wrap-contour-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapDynamicThresholdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapDynamicThresholdAttribute.java
new file mode 100644
index 0000000..3cce318
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWrapDynamicThresholdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:wrap-dynamic-threshold}.
+ *
+ */
+public class StyleWrapDynamicThresholdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-dynamic-threshold");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:wrap-dynamic-threshold}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWrapDynamicThresholdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:wrap-dynamic-threshold}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:wrap-dynamic-threshold}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:wrap-dynamic-threshold} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWritingModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWritingModeAttribute.java
new file mode 100644
index 0000000..2f892f3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWritingModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:writing-mode}.
+ *
+ */
+public class StyleWritingModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:writing-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWritingModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:writing-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute style:writing-mode}.
+	 */
+	public enum Value {
+		LR("lr"), LR_TB("lr-tb"), PAGE("page"), RL("rl"), RL_TB("rl-tb"), TB("tb"), TB_LR("tb-lr"), TB_RL("tb-rl") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:writing-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:writing-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWritingModeAutomaticAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWritingModeAutomaticAttribute.java
new file mode 100644
index 0000000..9231bf8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/style/StyleWritingModeAutomaticAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.style;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute style:writing-mode-automatic}.
+ *
+ */
+public class StyleWritingModeAutomaticAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode-automatic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute style:writing-mode-automatic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StyleWritingModeAutomaticAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute style:writing-mode-automatic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute style:writing-mode-automatic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute style:writing-mode-automatic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAccentHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAccentHeightAttribute.java
new file mode 100644
index 0000000..cb8c216
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAccentHeightAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:accent-height}.
+ *
+ */
+public class SvgAccentHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "accent-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:accent-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgAccentHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:accent-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:accent-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:accent-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAlphabeticAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAlphabeticAttribute.java
new file mode 100644
index 0000000..4ad7f09
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAlphabeticAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:alphabetic}.
+ *
+ */
+public class SvgAlphabeticAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "alphabetic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:alphabetic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgAlphabeticAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:alphabetic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:alphabetic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:alphabetic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAscentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAscentAttribute.java
new file mode 100644
index 0000000..6a42fcb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgAscentAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:ascent}.
+ *
+ */
+public class SvgAscentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "ascent");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:ascent}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgAscentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:ascent}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:ascent}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:ascent} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgBboxAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgBboxAttribute.java
new file mode 100644
index 0000000..13b676a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgBboxAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:bbox}.
+ *
+ */
+public class SvgBboxAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "bbox");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:bbox}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgBboxAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:bbox}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:bbox}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:bbox} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCapHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCapHeightAttribute.java
new file mode 100644
index 0000000..8501fa3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCapHeightAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:cap-height}.
+ *
+ */
+public class SvgCapHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "cap-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:cap-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgCapHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:cap-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:cap-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:cap-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCxAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCxAttribute.java
new file mode 100644
index 0000000..f5929d1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCxAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:cx}.
+ *
+ */
+public class SvgCxAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "cx");
+	public static final String DEFAULT_VALUE = "50%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:cx}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgCxAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:cx}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:cx}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:cx} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCyAttribute.java
new file mode 100644
index 0000000..68e18b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgCyAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:cy}.
+ *
+ */
+public class SvgCyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "cy");
+	public static final String DEFAULT_VALUE = "50%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:cy}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgCyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:cy}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:cy}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:cy} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgDAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgDAttribute.java
new file mode 100644
index 0000000..9e3aad1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgDAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:d}.
+ *
+ */
+public class SvgDAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "d");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:d}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgDAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:d}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:d}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:d} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgDescentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgDescentAttribute.java
new file mode 100644
index 0000000..59cc7a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgDescentAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:descent}.
+ *
+ */
+public class SvgDescentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "descent");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:descent}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgDescentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:descent}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:descent}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:descent} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFillRuleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFillRuleAttribute.java
new file mode 100644
index 0000000..a21bea8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFillRuleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:fill-rule}.
+ *
+ */
+public class SvgFillRuleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "fill-rule");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:fill-rule}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFillRuleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:fill-rule}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:fill-rule}.
+	 */
+	public enum Value {
+		EVENODD("evenodd"), NONZERO("nonzero") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:fill-rule}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:fill-rule} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontFamilyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontFamilyAttribute.java
new file mode 100644
index 0000000..5198e7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontFamilyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:font-family}.
+ *
+ */
+public class SvgFontFamilyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-family");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:font-family}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontFamilyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:font-family}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:font-family}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:font-family} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontSizeAttribute.java
new file mode 100644
index 0000000..c4a4dad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontSizeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:font-size}.
+ *
+ */
+public class SvgFontSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:font-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:font-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:font-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:font-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontStretchAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontStretchAttribute.java
new file mode 100644
index 0000000..0a76af0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontStretchAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:font-stretch}.
+ *
+ */
+public class SvgFontStretchAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-stretch");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:font-stretch}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontStretchAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:font-stretch}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:font-stretch}.
+	 */
+	public enum Value {
+		CONDENSED("condensed"), EXPANDED("expanded"), EXTRA_CONDENSED("extra-condensed"), EXTRA_EXPANDED("extra-expanded"), NORMAL("normal"), SEMI_CONDENSED("semi-condensed"), SEMI_EXPANDED("semi-expanded"), ULTRA_CONDENSED("ultra-condensed"), ULTRA_EXPANDED("ultra-expanded") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:font-stretch}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:font-stretch} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontStyleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontStyleAttribute.java
new file mode 100644
index 0000000..0eeae4a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontStyleAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:font-style}.
+ *
+ */
+public class SvgFontStyleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-style");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:font-style}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontStyleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:font-style}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:font-style}.
+	 */
+	public enum Value {
+		ITALIC("italic"), NORMAL("normal"), OBLIQUE("oblique") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:font-style}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:font-style} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontVariantAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontVariantAttribute.java
new file mode 100644
index 0000000..1edd3a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontVariantAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:font-variant}.
+ *
+ */
+public class SvgFontVariantAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-variant");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:font-variant}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontVariantAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:font-variant}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:font-variant}.
+	 */
+	public enum Value {
+		NORMAL("normal"), SMALL_CAPS("small-caps") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:font-variant}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:font-variant} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontWeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontWeightAttribute.java
new file mode 100644
index 0000000..88de32f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFontWeightAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:font-weight}.
+ *
+ */
+public class SvgFontWeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-weight");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:font-weight}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontWeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:font-weight}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:font-weight}.
+	 */
+	public enum Value {
+		_100("100"), _200("200"), _300("300"), _400("400"), _500("500"), _600("600"), _700("700"), _800("800"), _900("900"), BOLD("bold"), NORMAL("normal") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:font-weight}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:font-weight} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFxAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFxAttribute.java
new file mode 100644
index 0000000..8ecc25d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFxAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:fx}.
+ *
+ */
+public class SvgFxAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "fx");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:fx}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFxAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:fx}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:fx}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:fx} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFyAttribute.java
new file mode 100644
index 0000000..9ccf816
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgFyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:fy}.
+ *
+ */
+public class SvgFyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "fy");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:fy}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgFyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:fy}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:fy}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:fy} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgGradientTransformAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgGradientTransformAttribute.java
new file mode 100644
index 0000000..81926ff
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgGradientTransformAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:gradientTransform}.
+ *
+ */
+public class SvgGradientTransformAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "gradientTransform");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:gradientTransform}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgGradientTransformAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:gradientTransform}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:gradientTransform}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:gradientTransform} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgGradientUnitsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgGradientUnitsAttribute.java
new file mode 100644
index 0000000..69cf8a8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgGradientUnitsAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:gradientUnits}.
+ *
+ */
+public class SvgGradientUnitsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "gradientUnits");
+	public static final String DEFAULT_VALUE = "objectBoundingBox";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:gradientUnits}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgGradientUnitsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:gradientUnits}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:gradientUnits}.
+	 */
+	public enum Value {
+		OBJECTBOUNDINGBOX("objectBoundingBox") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:gradientUnits}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:gradientUnits} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgHangingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgHangingAttribute.java
new file mode 100644
index 0000000..7d20d2c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgHangingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:hanging}.
+ *
+ */
+public class SvgHangingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "hanging");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:hanging}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgHangingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:hanging}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:hanging}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:hanging} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgHeightAttribute.java
new file mode 100644
index 0000000..56d92c1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgHeightAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:height}.
+ *
+ */
+public class SvgHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgIdeographicAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgIdeographicAttribute.java
new file mode 100644
index 0000000..2b8ec93
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgIdeographicAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:ideographic}.
+ *
+ */
+public class SvgIdeographicAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "ideographic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:ideographic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgIdeographicAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:ideographic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:ideographic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:ideographic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgMathematicalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgMathematicalAttribute.java
new file mode 100644
index 0000000..1bb9d07
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgMathematicalAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:mathematical}.
+ *
+ */
+public class SvgMathematicalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "mathematical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:mathematical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgMathematicalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:mathematical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:mathematical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:mathematical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgNameAttribute.java
new file mode 100644
index 0000000..55fabd7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:name}.
+ *
+ */
+public class SvgNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOffsetAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOffsetAttribute.java
new file mode 100644
index 0000000..e57941d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOffsetAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:offset}.
+ *
+ */
+public class SvgOffsetAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "offset");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:offset}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgOffsetAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:offset}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:offset}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:offset} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOriginAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOriginAttribute.java
new file mode 100644
index 0000000..00e0202
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOriginAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:origin}.
+ *
+ */
+public class SvgOriginAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "origin");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:origin}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgOriginAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:origin}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:origin}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:origin} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOverlinePositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOverlinePositionAttribute.java
new file mode 100644
index 0000000..bbf06b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOverlinePositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:overline-position}.
+ *
+ */
+public class SvgOverlinePositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "overline-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:overline-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgOverlinePositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:overline-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:overline-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:overline-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOverlineThicknessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOverlineThicknessAttribute.java
new file mode 100644
index 0000000..47afd17
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgOverlineThicknessAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:overline-thickness}.
+ *
+ */
+public class SvgOverlineThicknessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "overline-thickness");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:overline-thickness}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgOverlineThicknessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:overline-thickness}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:overline-thickness}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:overline-thickness} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgPanose1Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgPanose1Attribute.java
new file mode 100644
index 0000000..1fd15ea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgPanose1Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:panose-1}.
+ *
+ */
+public class SvgPanose1Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "panose-1");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:panose-1}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgPanose1Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:panose-1}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:panose-1}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:panose-1} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgPathAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgPathAttribute.java
new file mode 100644
index 0000000..00cb3a7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgPathAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:path}.
+ *
+ */
+public class SvgPathAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "path");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:path}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgPathAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:path}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:path}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:path} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRAttribute.java
new file mode 100644
index 0000000..1c7f442
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:r}.
+ *
+ */
+public class SvgRAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "r");
+	public static final String DEFAULT_VALUE = "50%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:r}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgRAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:r}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:r}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:r} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRxAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRxAttribute.java
new file mode 100644
index 0000000..f91f32e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRxAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:rx}.
+ *
+ */
+public class SvgRxAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "rx");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:rx}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgRxAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:rx}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:rx}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:rx} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRyAttribute.java
new file mode 100644
index 0000000..1b32739
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgRyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:ry}.
+ *
+ */
+public class SvgRyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "ry");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:ry}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgRyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:ry}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:ry}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:ry} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgSlopeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgSlopeAttribute.java
new file mode 100644
index 0000000..ffe7fe6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgSlopeAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:slope}.
+ *
+ */
+public class SvgSlopeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "slope");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:slope}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgSlopeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:slope}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:slope}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:slope} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgSpreadMethodAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgSpreadMethodAttribute.java
new file mode 100644
index 0000000..496ce4e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgSpreadMethodAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:spreadMethod}.
+ *
+ */
+public class SvgSpreadMethodAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "spreadMethod");
+	public static final String DEFAULT_VALUE = "pad";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:spreadMethod}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgSpreadMethodAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:spreadMethod}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:spreadMethod}.
+	 */
+	public enum Value {
+		PAD("pad"), REFLECT("reflect"), REPEAT("repeat") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:spreadMethod}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:spreadMethod} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStemhAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStemhAttribute.java
new file mode 100644
index 0000000..c69a713
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStemhAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stemh}.
+ *
+ */
+public class SvgStemhAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stemh");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stemh}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStemhAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stemh}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stemh}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stemh} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStemvAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStemvAttribute.java
new file mode 100644
index 0000000..9c7404b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStemvAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stemv}.
+ *
+ */
+public class SvgStemvAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stemv");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stemv}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStemvAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stemv}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stemv}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stemv} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStopColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStopColorAttribute.java
new file mode 100644
index 0000000..1378ff0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStopColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stop-color}.
+ *
+ */
+public class SvgStopColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stop-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stop-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStopColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stop-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stop-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stop-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStopOpacityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStopOpacityAttribute.java
new file mode 100644
index 0000000..899b8f7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStopOpacityAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stop-opacity}.
+ *
+ */
+public class SvgStopOpacityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stop-opacity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stop-opacity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStopOpacityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stop-opacity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stop-opacity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stop-opacity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrikethroughPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrikethroughPositionAttribute.java
new file mode 100644
index 0000000..7d1d74d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrikethroughPositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:strikethrough-position}.
+ *
+ */
+public class SvgStrikethroughPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "strikethrough-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:strikethrough-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStrikethroughPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:strikethrough-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:strikethrough-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:strikethrough-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrikethroughThicknessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrikethroughThicknessAttribute.java
new file mode 100644
index 0000000..dbe7de4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrikethroughThicknessAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:strikethrough-thickness}.
+ *
+ */
+public class SvgStrikethroughThicknessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "strikethrough-thickness");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:strikethrough-thickness}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStrikethroughThicknessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:strikethrough-thickness}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:strikethrough-thickness}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:strikethrough-thickness} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStringAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStringAttribute.java
new file mode 100644
index 0000000..7b8204b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStringAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:string}.
+ *
+ */
+public class SvgStringAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "string");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:string}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStringAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:string}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:string}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:string} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeColorAttribute.java
new file mode 100644
index 0000000..81d2a68
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stroke-color}.
+ *
+ */
+public class SvgStrokeColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stroke-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stroke-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStrokeColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stroke-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stroke-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stroke-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeLinecapAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeLinecapAttribute.java
new file mode 100644
index 0000000..d0c2e5e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeLinecapAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stroke-linecap}.
+ *
+ */
+public class SvgStrokeLinecapAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stroke-linecap");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stroke-linecap}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStrokeLinecapAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stroke-linecap}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:stroke-linecap}.
+	 */
+	public enum Value {
+		BUTT("butt"), ROUND("round"), SQUARE("square") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stroke-linecap}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stroke-linecap} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeOpacityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeOpacityAttribute.java
new file mode 100644
index 0000000..f8c263e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeOpacityAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stroke-opacity}.
+ *
+ */
+public class SvgStrokeOpacityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stroke-opacity");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stroke-opacity}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStrokeOpacityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stroke-opacity}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stroke-opacity}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stroke-opacity} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeWidthAttribute.java
new file mode 100644
index 0000000..ebc1dc2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgStrokeWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:stroke-width}.
+ *
+ */
+public class SvgStrokeWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stroke-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:stroke-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgStrokeWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:stroke-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:stroke-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:stroke-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgTypeAttribute.java
new file mode 100644
index 0000000..98321b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:type}.
+ *
+ */
+public class SvgTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute svg:type}.
+	 */
+	public enum Value {
+		ROTATE("rotate"), SCALE("scale"), SKEWX("skewX"), SKEWY("skewY"), TRANSLATE("translate") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnderlinePositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnderlinePositionAttribute.java
new file mode 100644
index 0000000..62459cb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnderlinePositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:underline-position}.
+ *
+ */
+public class SvgUnderlinePositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "underline-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:underline-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgUnderlinePositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:underline-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:underline-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:underline-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnderlineThicknessAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnderlineThicknessAttribute.java
new file mode 100644
index 0000000..a147eaf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnderlineThicknessAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:underline-thickness}.
+ *
+ */
+public class SvgUnderlineThicknessAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "underline-thickness");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:underline-thickness}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgUnderlineThicknessAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:underline-thickness}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:underline-thickness}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:underline-thickness} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnicodeRangeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnicodeRangeAttribute.java
new file mode 100644
index 0000000..8941f8d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnicodeRangeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:unicode-range}.
+ *
+ */
+public class SvgUnicodeRangeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "unicode-range");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:unicode-range}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgUnicodeRangeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:unicode-range}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:unicode-range}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:unicode-range} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnitsPerEmAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnitsPerEmAttribute.java
new file mode 100644
index 0000000..3d30ab8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgUnitsPerEmAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:units-per-em}.
+ *
+ */
+public class SvgUnitsPerEmAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "units-per-em");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:units-per-em}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgUnitsPerEmAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:units-per-em}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:units-per-em}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:units-per-em} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVAlphabeticAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVAlphabeticAttribute.java
new file mode 100644
index 0000000..9465fd2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVAlphabeticAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:v-alphabetic}.
+ *
+ */
+public class SvgVAlphabeticAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "v-alphabetic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:v-alphabetic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgVAlphabeticAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:v-alphabetic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:v-alphabetic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:v-alphabetic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVHangingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVHangingAttribute.java
new file mode 100644
index 0000000..bc80f1e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVHangingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:v-hanging}.
+ *
+ */
+public class SvgVHangingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "v-hanging");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:v-hanging}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgVHangingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:v-hanging}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:v-hanging}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:v-hanging} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVIdeographicAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVIdeographicAttribute.java
new file mode 100644
index 0000000..2718ac8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVIdeographicAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:v-ideographic}.
+ *
+ */
+public class SvgVIdeographicAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "v-ideographic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:v-ideographic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgVIdeographicAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:v-ideographic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:v-ideographic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:v-ideographic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVMathematicalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVMathematicalAttribute.java
new file mode 100644
index 0000000..1713a47
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgVMathematicalAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:v-mathematical}.
+ *
+ */
+public class SvgVMathematicalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "v-mathematical");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:v-mathematical}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgVMathematicalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:v-mathematical}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:v-mathematical}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:v-mathematical} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgViewBoxAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgViewBoxAttribute.java
new file mode 100644
index 0000000..03f63a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgViewBoxAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:viewBox}.
+ *
+ */
+public class SvgViewBoxAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "viewBox");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:viewBox}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgViewBoxAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:viewBox}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:viewBox}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:viewBox} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgWidthAttribute.java
new file mode 100644
index 0000000..f0a0d99
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:width}.
+ *
+ */
+public class SvgWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgWidthsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgWidthsAttribute.java
new file mode 100644
index 0000000..7e49e03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgWidthsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:widths}.
+ *
+ */
+public class SvgWidthsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "widths");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:widths}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgWidthsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:widths}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:widths}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:widths} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgX1Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgX1Attribute.java
new file mode 100644
index 0000000..ad9cad4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgX1Attribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:x1}.
+ *
+ */
+public class SvgX1Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "x1");
+	public static final String DEFAULT_VALUE = "0%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:x1}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgX1Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:x1}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:x1}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:x1} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgX2Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgX2Attribute.java
new file mode 100644
index 0000000..8d9d4aa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgX2Attribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:x2}.
+ *
+ */
+public class SvgX2Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "x2");
+	public static final String DEFAULT_VALUE = "100%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:x2}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgX2Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:x2}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:x2}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:x2} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgXAttribute.java
new file mode 100644
index 0000000..00484de
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgXAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:x}.
+ *
+ */
+public class SvgXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgXHeightAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgXHeightAttribute.java
new file mode 100644
index 0000000..920a739
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgXHeightAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:x-height}.
+ *
+ */
+public class SvgXHeightAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "x-height");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:x-height}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgXHeightAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:x-height}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:x-height}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:x-height} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgY1Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgY1Attribute.java
new file mode 100644
index 0000000..e5cb9da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgY1Attribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:y1}.
+ *
+ */
+public class SvgY1Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "y1");
+	public static final String DEFAULT_VALUE = "0%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:y1}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgY1Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:y1}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:y1}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:y1} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgY2Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgY2Attribute.java
new file mode 100644
index 0000000..136b6d3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgY2Attribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:y2}.
+ *
+ */
+public class SvgY2Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "y2");
+	public static final String DEFAULT_VALUE = "100%";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:y2}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgY2Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:y2}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:y2}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:y2} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgYAttribute.java
new file mode 100644
index 0000000..b780668
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/svg/SvgYAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.svg;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute svg:y}.
+ *
+ */
+public class SvgYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute svg:y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SvgYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute svg:y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute svg:y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute svg:y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAcceptanceStateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAcceptanceStateAttribute.java
new file mode 100644
index 0000000..608e7bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAcceptanceStateAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:acceptance-state}.
+ *
+ */
+public class TableAcceptanceStateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "acceptance-state");
+	public static final String DEFAULT_VALUE = "pending";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:acceptance-state}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableAcceptanceStateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:acceptance-state}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:acceptance-state}.
+	 */
+	public enum Value {
+		ACCEPTED("accepted"), PENDING("pending"), REJECTED("rejected") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:acceptance-state}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:acceptance-state} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAddEmptyLinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAddEmptyLinesAttribute.java
new file mode 100644
index 0000000..e7e6efe
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAddEmptyLinesAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:add-empty-lines}.
+ *
+ */
+public class TableAddEmptyLinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "add-empty-lines");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:add-empty-lines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableAddEmptyLinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:add-empty-lines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:add-empty-lines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:add-empty-lines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAlgorithmAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAlgorithmAttribute.java
new file mode 100644
index 0000000..e00a27c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAlgorithmAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:algorithm}.
+ *
+ */
+public class TableAlgorithmAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "algorithm");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:algorithm}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableAlgorithmAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:algorithm}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:algorithm}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:algorithm} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAlignAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAlignAttribute.java
new file mode 100644
index 0000000..7b8334b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAlignAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:align}.
+ *
+ */
+public class TableAlignAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "align");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:align}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableAlignAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:align}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:align}.
+	 */
+	public enum Value {
+		CENTER("center"), LEFT("left"), MARGINS("margins"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:align}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:align} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAllowEmptyCellAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAllowEmptyCellAttribute.java
new file mode 100644
index 0000000..345eac3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAllowEmptyCellAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:allow-empty-cell}.
+ *
+ */
+public class TableAllowEmptyCellAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "allow-empty-cell");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:allow-empty-cell}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableAllowEmptyCellAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:allow-empty-cell}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:allow-empty-cell}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:allow-empty-cell} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableApplicationDataAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableApplicationDataAttribute.java
new file mode 100644
index 0000000..1cc231d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableApplicationDataAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:application-data}.
+ *
+ */
+public class TableApplicationDataAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "application-data");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:application-data}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableApplicationDataAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:application-data}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:application-data}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:application-data} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAutomaticFindLabelsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAutomaticFindLabelsAttribute.java
new file mode 100644
index 0000000..161b823
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableAutomaticFindLabelsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:automatic-find-labels}.
+ *
+ */
+public class TableAutomaticFindLabelsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "automatic-find-labels");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:automatic-find-labels}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableAutomaticFindLabelsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:automatic-find-labels}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:automatic-find-labels}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:automatic-find-labels} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBaseCellAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBaseCellAddressAttribute.java
new file mode 100644
index 0000000..2d6a672
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBaseCellAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:base-cell-address}.
+ *
+ */
+public class TableBaseCellAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "base-cell-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:base-cell-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableBaseCellAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:base-cell-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:base-cell-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:base-cell-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBindStylesToContentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBindStylesToContentAttribute.java
new file mode 100644
index 0000000..7e0891e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBindStylesToContentAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:bind-styles-to-content}.
+ *
+ */
+public class TableBindStylesToContentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "bind-styles-to-content");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:bind-styles-to-content}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableBindStylesToContentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:bind-styles-to-content}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:bind-styles-to-content}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:bind-styles-to-content} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBorderColorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBorderColorAttribute.java
new file mode 100644
index 0000000..68ee27e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBorderColorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:border-color}.
+ *
+ */
+public class TableBorderColorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "border-color");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:border-color}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableBorderColorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:border-color}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:border-color}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:border-color} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBorderModelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBorderModelAttribute.java
new file mode 100644
index 0000000..4095a09
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableBorderModelAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:border-model}.
+ *
+ */
+public class TableBorderModelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "border-model");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:border-model}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableBorderModelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:border-model}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:border-model}.
+	 */
+	public enum Value {
+		COLLAPSING("collapsing"), SEPARATING("separating") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:border-model}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:border-model} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableButtonsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableButtonsAttribute.java
new file mode 100644
index 0000000..b67b49e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableButtonsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:buttons}.
+ *
+ */
+public class TableButtonsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "buttons");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:buttons}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableButtonsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:buttons}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:buttons}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:buttons} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCaseSensitiveAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCaseSensitiveAttribute.java
new file mode 100644
index 0000000..3924ae4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCaseSensitiveAttribute.java
@@ -0,0 +1,162 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFilterConditionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSortElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSubtotalRulesElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:case-sensitive}.
+ *
+ */
+public class TableCaseSensitiveAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "case-sensitive");
+	public static final String DEFAULT_VALUE_FALSE = Value.FALSE.toString();
+	public static final String DEFAULT_VALUE_TRUE = Value.TRUE.toString();
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:case-sensitive}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCaseSensitiveAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:case-sensitive}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:case-sensitive}.
+	 */
+	public enum Value {
+		FALSE("false"), TRUE("true") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:case-sensitive}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof TableCalculationSettingsElement) {
+				defaultValue = DEFAULT_VALUE_TRUE;
+			}
+			if (parentElement instanceof TableFilterConditionElement) {
+				defaultValue = DEFAULT_VALUE_FALSE;
+			}
+			if (parentElement instanceof TableSortElement) {
+				defaultValue = DEFAULT_VALUE_FALSE;
+			}
+			if (parentElement instanceof TableSubtotalRulesElement) {
+				defaultValue = DEFAULT_VALUE_FALSE;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:case-sensitive} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellAddressAttribute.java
new file mode 100644
index 0000000..0f447eb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:cell-address}.
+ *
+ */
+public class TableCellAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:cell-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCellAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:cell-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:cell-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:cell-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellRangeAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellRangeAddressAttribute.java
new file mode 100644
index 0000000..b3613be
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellRangeAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:cell-range-address}.
+ *
+ */
+public class TableCellRangeAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-range-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:cell-range-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCellRangeAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:cell-range-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:cell-range-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:cell-range-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellRangeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellRangeAttribute.java
new file mode 100644
index 0000000..54b2632
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCellRangeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:cell-range}.
+ *
+ */
+public class TableCellRangeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-range");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:cell-range}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCellRangeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:cell-range}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:cell-range}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:cell-range} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableColumnAttribute.java
new file mode 100644
index 0000000..bab1db9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableColumnAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:column}.
+ *
+ */
+public class TableColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCommentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCommentAttribute.java
new file mode 100644
index 0000000..2efdebb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCommentAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:comment}.
+ *
+ */
+public class TableCommentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "comment");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:comment}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCommentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:comment}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:comment}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:comment} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionAttribute.java
new file mode 100644
index 0000000..4826af2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:condition}.
+ *
+ */
+public class TableConditionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "condition");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:condition}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableConditionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:condition}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:condition}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:condition} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionSourceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionSourceAttribute.java
new file mode 100644
index 0000000..74ed0b3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionSourceAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:condition-source}.
+ *
+ */
+public class TableConditionSourceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "condition-source");
+	public static final String DEFAULT_VALUE = "self";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:condition-source}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableConditionSourceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:condition-source}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:condition-source}.
+	 */
+	public enum Value {
+		CELL_RANGE("cell-range"), SELF("self") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:condition-source}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:condition-source} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionSourceRangeAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionSourceRangeAddressAttribute.java
new file mode 100644
index 0000000..33ed458
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableConditionSourceRangeAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:condition-source-range-address}.
+ *
+ */
+public class TableConditionSourceRangeAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "condition-source-range-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:condition-source-range-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableConditionSourceRangeAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:condition-source-range-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:condition-source-range-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:condition-source-range-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContainsErrorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContainsErrorAttribute.java
new file mode 100644
index 0000000..2f426b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContainsErrorAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:contains-error}.
+ *
+ */
+public class TableContainsErrorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "contains-error");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:contains-error}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableContainsErrorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:contains-error}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:contains-error}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:contains-error} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContainsHeaderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContainsHeaderAttribute.java
new file mode 100644
index 0000000..1a25bb1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContainsHeaderAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:contains-header}.
+ *
+ */
+public class TableContainsHeaderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "contains-header");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:contains-header}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableContainsHeaderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:contains-header}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:contains-header}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:contains-header} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContentValidationNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContentValidationNameAttribute.java
new file mode 100644
index 0000000..dcfe8fb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableContentValidationNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:content-validation-name}.
+ *
+ */
+public class TableContentValidationNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "content-validation-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:content-validation-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableContentValidationNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:content-validation-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:content-validation-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:content-validation-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyBackAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyBackAttribute.java
new file mode 100644
index 0000000..e41e69f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyBackAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:copy-back}.
+ *
+ */
+public class TableCopyBackAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "copy-back");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:copy-back}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCopyBackAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:copy-back}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:copy-back}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:copy-back} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyFormulasAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyFormulasAttribute.java
new file mode 100644
index 0000000..7d21045
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyFormulasAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:copy-formulas}.
+ *
+ */
+public class TableCopyFormulasAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "copy-formulas");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:copy-formulas}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCopyFormulasAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:copy-formulas}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:copy-formulas}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:copy-formulas} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyStylesAttribute.java
new file mode 100644
index 0000000..b889e05
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCopyStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:copy-styles}.
+ *
+ */
+public class TableCopyStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "copy-styles");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:copy-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCopyStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:copy-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:copy-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:copy-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCountAttribute.java
new file mode 100644
index 0000000..6edf6e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCountAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:count}.
+ *
+ */
+public class TableCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "count");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCountryAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCountryAttribute.java
new file mode 100644
index 0000000..1428e4d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableCountryAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:country}.
+ *
+ */
+public class TableCountryAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "country");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:country}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableCountryAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:country}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:country}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:country} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataCellRangeAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataCellRangeAddressAttribute.java
new file mode 100644
index 0000000..26544e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataCellRangeAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:data-cell-range-address}.
+ *
+ */
+public class TableDataCellRangeAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-cell-range-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:data-cell-range-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDataCellRangeAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:data-cell-range-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:data-cell-range-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:data-cell-range-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataFieldAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataFieldAttribute.java
new file mode 100644
index 0000000..86e21aa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataFieldAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:data-field}.
+ *
+ */
+public class TableDataFieldAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-field");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:data-field}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDataFieldAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:data-field}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:data-field}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:data-field} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataTypeAttribute.java
new file mode 100644
index 0000000..fbba33c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDataTypeAttribute.java
@@ -0,0 +1,158 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.table.TableFilterConditionElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSortByElement;
+import org.odftoolkit.odfdom.dom.element.table.TableSortGroupsElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:data-type}.
+ *
+ */
+public class TableDataTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-type");
+	public static final String DEFAULT_VALUE_TEXT = Value.TEXT.toString();
+	public static final String DEFAULT_VALUE_AUTOMATIC = Value.AUTOMATIC.toString();
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:data-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDataTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:data-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:data-type}.
+	 */
+	public enum Value {
+		AUTOMATIC("automatic"), NUMBER("number"), TEXT("text") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:data-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof TableFilterConditionElement) {
+				defaultValue = DEFAULT_VALUE_TEXT;
+			}
+			if (parentElement instanceof TableSortByElement) {
+				defaultValue = DEFAULT_VALUE_AUTOMATIC;
+			}
+			if (parentElement instanceof TableSortGroupsElement) {
+				defaultValue = DEFAULT_VALUE_AUTOMATIC;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:data-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDatabaseNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDatabaseNameAttribute.java
new file mode 100644
index 0000000..6094f40
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDatabaseNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:database-name}.
+ *
+ */
+public class TableDatabaseNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:database-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:database-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:database-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:database-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDatabaseTableNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDatabaseTableNameAttribute.java
new file mode 100644
index 0000000..b472edb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDatabaseTableNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:database-table-name}.
+ *
+ */
+public class TableDatabaseTableNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-table-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:database-table-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseTableNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:database-table-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:database-table-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:database-table-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateEndAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateEndAttribute.java
new file mode 100644
index 0000000..5b32686
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateEndAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:date-end}.
+ *
+ */
+public class TableDateEndAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "date-end");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:date-end}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDateEndAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:date-end}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:date-end}.
+	 */
+	public enum Value {
+		AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:date-end}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:date-end} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateStartAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateStartAttribute.java
new file mode 100644
index 0000000..e8a0838
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateStartAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:date-start}.
+ *
+ */
+public class TableDateStartAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "date-start");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:date-start}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDateStartAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:date-start}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:date-start}.
+	 */
+	public enum Value {
+		AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:date-start}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:date-start} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateValueAttribute.java
new file mode 100644
index 0000000..c6bc0b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDateValueAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:date-value}.
+ *
+ */
+public class TableDateValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "date-value");
+	public static final String DEFAULT_VALUE = "1899-12-30";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:date-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDateValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:date-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:date-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:date-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDefaultCellStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDefaultCellStyleNameAttribute.java
new file mode 100644
index 0000000..25f9efa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDefaultCellStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:default-cell-style-name}.
+ *
+ */
+public class TableDefaultCellStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "default-cell-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:default-cell-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDefaultCellStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:default-cell-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:default-cell-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:default-cell-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDirectionAttribute.java
new file mode 100644
index 0000000..432a3ec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDirectionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:direction}.
+ *
+ */
+public class TableDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:direction}.
+	 */
+	public enum Value {
+		FROM_ANOTHER_TABLE("from-another-table"), FROM_SAME_TABLE("from-same-table"), TO_ANOTHER_TABLE("to-another-table") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayAttribute.java
new file mode 100644
index 0000000..40ef5df
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayAttribute.java
@@ -0,0 +1,141 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.table.TableErrorMessageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableHelpMessageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:display}.
+ *
+ */
+public class TableDisplayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "display");
+	public static final String DEFAULT_VALUE_TRUE = "true";
+	public static final String DEFAULT_VALUE_FALSE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:display}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDisplayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:display}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:display}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof TableErrorMessageElement) {
+				defaultValue = DEFAULT_VALUE_FALSE;
+			}
+			if (parentElement instanceof TableHelpMessageElement) {
+				defaultValue = DEFAULT_VALUE_FALSE;
+			}
+			if (parentElement instanceof TableTableColumnGroupElement) {
+				defaultValue = DEFAULT_VALUE_TRUE;
+			}
+			if (parentElement instanceof TableTableRowGroupElement) {
+				defaultValue = DEFAULT_VALUE_TRUE;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:display} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayBorderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayBorderAttribute.java
new file mode 100644
index 0000000..ea08ce4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayBorderAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:display-border}.
+ *
+ */
+public class TableDisplayBorderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "display-border");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:display-border}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDisplayBorderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:display-border}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:display-border}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:display-border} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayDuplicatesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayDuplicatesAttribute.java
new file mode 100644
index 0000000..63f9f1b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayDuplicatesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:display-duplicates}.
+ *
+ */
+public class TableDisplayDuplicatesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "display-duplicates");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:display-duplicates}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDisplayDuplicatesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:display-duplicates}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:display-duplicates}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:display-duplicates} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayFilterButtonsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayFilterButtonsAttribute.java
new file mode 100644
index 0000000..6d51cf3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayFilterButtonsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:display-filter-buttons}.
+ *
+ */
+public class TableDisplayFilterButtonsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "display-filter-buttons");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:display-filter-buttons}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDisplayFilterButtonsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:display-filter-buttons}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:display-filter-buttons}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:display-filter-buttons} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayListAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayListAttribute.java
new file mode 100644
index 0000000..e97ab64
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayListAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:display-list}.
+ *
+ */
+public class TableDisplayListAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "display-list");
+	public static final String DEFAULT_VALUE = "unsorted";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:display-list}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDisplayListAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:display-list}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:display-list}.
+	 */
+	public enum Value {
+		NONE("none"), SORT_ASCENDING("sort-ascending"), UNSORTED("unsorted") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:display-list}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:display-list} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayMemberModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayMemberModeAttribute.java
new file mode 100644
index 0000000..9889169
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDisplayMemberModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:display-member-mode}.
+ *
+ */
+public class TableDisplayMemberModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "display-member-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:display-member-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDisplayMemberModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:display-member-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:display-member-mode}.
+	 */
+	public enum Value {
+		FROM_BOTTOM("from-bottom"), FROM_TOP("from-top") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:display-member-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:display-member-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDrillDownOnDoubleClickAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDrillDownOnDoubleClickAttribute.java
new file mode 100644
index 0000000..c254651
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableDrillDownOnDoubleClickAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:drill-down-on-double-click}.
+ *
+ */
+public class TableDrillDownOnDoubleClickAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "drill-down-on-double-click");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:drill-down-on-double-click}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableDrillDownOnDoubleClickAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:drill-down-on-double-click}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:drill-down-on-double-click}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:drill-down-on-double-click} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEmbeddedNumberBehaviorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEmbeddedNumberBehaviorAttribute.java
new file mode 100644
index 0000000..39a51f3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEmbeddedNumberBehaviorAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:embedded-number-behavior}.
+ *
+ */
+public class TableEmbeddedNumberBehaviorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "embedded-number-behavior");
+	public static final String DEFAULT_VALUE = "alpha-numeric";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:embedded-number-behavior}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEmbeddedNumberBehaviorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:embedded-number-behavior}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:embedded-number-behavior}.
+	 */
+	public enum Value {
+		ALPHA_NUMERIC("alpha-numeric"), DOUBLE("double"), INTEGER("integer") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:embedded-number-behavior}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:embedded-number-behavior} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEnabledAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEnabledAttribute.java
new file mode 100644
index 0000000..e75e588
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEnabledAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:enabled}.
+ *
+ */
+public class TableEnabledAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "enabled");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:enabled}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEnabledAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:enabled}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:enabled}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:enabled} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndAttribute.java
new file mode 100644
index 0000000..1a1ba4e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end}.
+ *
+ */
+public class TableEndAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:end}.
+	 */
+	public enum Value {
+		AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndCellAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndCellAddressAttribute.java
new file mode 100644
index 0000000..2c2d648
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndCellAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-cell-address}.
+ *
+ */
+public class TableEndCellAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-cell-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-cell-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndCellAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-cell-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-cell-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-cell-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndColumnAttribute.java
new file mode 100644
index 0000000..b048dcf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndColumnAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-column}.
+ *
+ */
+public class TableEndColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndPositionAttribute.java
new file mode 100644
index 0000000..82afb16
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndPositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-position}.
+ *
+ */
+public class TableEndPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndRowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndRowAttribute.java
new file mode 100644
index 0000000..b35b0a2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndRowAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-row}.
+ *
+ */
+public class TableEndRowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-row");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-row}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndRowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-row}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-row}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-row} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndTableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndTableAttribute.java
new file mode 100644
index 0000000..aecb76a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndTableAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-table}.
+ *
+ */
+public class TableEndTableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-table");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-table}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndTableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-table}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-table}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-table} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndXAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndXAttribute.java
new file mode 100644
index 0000000..35cbbbc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndXAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-x}.
+ *
+ */
+public class TableEndXAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-x");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-x}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndXAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-x}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-x}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-x} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndYAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndYAttribute.java
new file mode 100644
index 0000000..b98aed8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableEndYAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:end-y}.
+ *
+ */
+public class TableEndYAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "end-y");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:end-y}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableEndYAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:end-y}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:end-y}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:end-y} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableExecuteAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableExecuteAttribute.java
new file mode 100644
index 0000000..c4e623c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableExecuteAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:execute}.
+ *
+ */
+public class TableExecuteAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "execute");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:execute}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableExecuteAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:execute}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:execute}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:execute} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableExpressionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableExpressionAttribute.java
new file mode 100644
index 0000000..93b2558
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableExpressionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:expression}.
+ *
+ */
+public class TableExpressionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "expression");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:expression}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableExpressionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:expression}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:expression}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:expression} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFieldNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFieldNameAttribute.java
new file mode 100644
index 0000000..b5927f5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFieldNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:field-name}.
+ *
+ */
+public class TableFieldNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "field-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:field-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFieldNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:field-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:field-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:field-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFieldNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFieldNumberAttribute.java
new file mode 100644
index 0000000..f274576
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFieldNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:field-number}.
+ *
+ */
+public class TableFieldNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "field-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:field-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFieldNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:field-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:field-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:field-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFilterNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFilterNameAttribute.java
new file mode 100644
index 0000000..2cb8990
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFilterNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:filter-name}.
+ *
+ */
+public class TableFilterNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:filter-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:filter-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:filter-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:filter-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFilterOptionsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFilterOptionsAttribute.java
new file mode 100644
index 0000000..44a544f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFilterOptionsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:filter-options}.
+ *
+ */
+public class TableFilterOptionsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter-options");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:filter-options}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterOptionsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:filter-options}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:filter-options}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:filter-options} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFirstRowEndColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFirstRowEndColumnAttribute.java
new file mode 100644
index 0000000..d3d4934
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFirstRowEndColumnAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:first-row-end-column}.
+ *
+ */
+public class TableFirstRowEndColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "first-row-end-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:first-row-end-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFirstRowEndColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:first-row-end-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:first-row-end-column}.
+	 */
+	public enum Value {
+		COLUMN("column"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:first-row-end-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:first-row-end-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFirstRowStartColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFirstRowStartColumnAttribute.java
new file mode 100644
index 0000000..6bc8a0e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFirstRowStartColumnAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:first-row-start-column}.
+ *
+ */
+public class TableFirstRowStartColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "first-row-start-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:first-row-start-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFirstRowStartColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:first-row-start-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:first-row-start-column}.
+	 */
+	public enum Value {
+		COLUMN("column"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:first-row-start-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:first-row-start-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFormulaAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFormulaAttribute.java
new file mode 100644
index 0000000..52ce9b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFormulaAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:formula}.
+ *
+ */
+public class TableFormulaAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "formula");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:formula}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFormulaAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:formula}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:formula}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:formula} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFunctionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFunctionAttribute.java
new file mode 100644
index 0000000..b472dfa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableFunctionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:function}.
+ *
+ */
+public class TableFunctionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "function");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:function}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableFunctionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:function}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:function}.
+	 */
+	public enum Value {
+		AUTO("auto"), AVERAGE("average"), COUNT("count"), COUNTNUMS("countnums"), MAX("max"), MIN("min"), PRODUCT("product"), STDEV("stdev"), STDEVP("stdevp"), SUM("sum"), VAR("var"), VARP("varp") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:function}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:function} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGrandTotalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGrandTotalAttribute.java
new file mode 100644
index 0000000..f1fe0ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGrandTotalAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:grand-total}.
+ *
+ */
+public class TableGrandTotalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "grand-total");
+	public static final String DEFAULT_VALUE = "both";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:grand-total}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableGrandTotalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:grand-total}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:grand-total}.
+	 */
+	public enum Value {
+		BOTH("both"), COLUMN("column"), NONE("none"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:grand-total}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:grand-total} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGroupByFieldNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGroupByFieldNumberAttribute.java
new file mode 100644
index 0000000..819691f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGroupByFieldNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:group-by-field-number}.
+ *
+ */
+public class TableGroupByFieldNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "group-by-field-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:group-by-field-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableGroupByFieldNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:group-by-field-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:group-by-field-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:group-by-field-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGroupedByAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGroupedByAttribute.java
new file mode 100644
index 0000000..381c67c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableGroupedByAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:grouped-by}.
+ *
+ */
+public class TableGroupedByAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "grouped-by");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:grouped-by}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableGroupedByAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:grouped-by}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:grouped-by}.
+	 */
+	public enum Value {
+		DAYS("days"), HOURS("hours"), MINUTES("minutes"), MONTHS("months"), QUARTERS("quarters"), SECONDS("seconds"), YEARS("years") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:grouped-by}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:grouped-by} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableHasPersistentDataAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableHasPersistentDataAttribute.java
new file mode 100644
index 0000000..674dcbf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableHasPersistentDataAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:has-persistent-data}.
+ *
+ */
+public class TableHasPersistentDataAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "has-persistent-data");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:has-persistent-data}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableHasPersistentDataAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:has-persistent-data}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:has-persistent-data}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:has-persistent-data} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIdAttribute.java
new file mode 100644
index 0000000..260b5d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:id}.
+ *
+ */
+public class TableIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIdentifyCategoriesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIdentifyCategoriesAttribute.java
new file mode 100644
index 0000000..a507f41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIdentifyCategoriesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:identify-categories}.
+ *
+ */
+public class TableIdentifyCategoriesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "identify-categories");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:identify-categories}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIdentifyCategoriesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:identify-categories}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:identify-categories}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:identify-categories} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIgnoreEmptyRowsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIgnoreEmptyRowsAttribute.java
new file mode 100644
index 0000000..e2b6b2b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIgnoreEmptyRowsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:ignore-empty-rows}.
+ *
+ */
+public class TableIgnoreEmptyRowsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "ignore-empty-rows");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:ignore-empty-rows}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIgnoreEmptyRowsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:ignore-empty-rows}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:ignore-empty-rows}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:ignore-empty-rows} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIndexAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIndexAttribute.java
new file mode 100644
index 0000000..7d9fe68
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIndexAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:index}.
+ *
+ */
+public class TableIndexAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "index");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:index}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIndexAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:index}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:index}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:index} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsActiveAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsActiveAttribute.java
new file mode 100644
index 0000000..bc30ef8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsActiveAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:is-active}.
+ *
+ */
+public class TableIsActiveAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "is-active");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:is-active}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIsActiveAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:is-active}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:is-active}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:is-active} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsDataLayoutFieldAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsDataLayoutFieldAttribute.java
new file mode 100644
index 0000000..bfe87f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsDataLayoutFieldAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:is-data-layout-field}.
+ *
+ */
+public class TableIsDataLayoutFieldAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "is-data-layout-field");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:is-data-layout-field}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIsDataLayoutFieldAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:is-data-layout-field}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:is-data-layout-field}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:is-data-layout-field} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsSelectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsSelectionAttribute.java
new file mode 100644
index 0000000..a424fcc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsSelectionAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:is-selection}.
+ *
+ */
+public class TableIsSelectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "is-selection");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:is-selection}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIsSelectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:is-selection}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:is-selection}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:is-selection} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsSubTableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsSubTableAttribute.java
new file mode 100644
index 0000000..10773d3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableIsSubTableAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:is-sub-table}.
+ *
+ */
+public class TableIsSubTableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "is-sub-table");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:is-sub-table}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableIsSubTableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:is-sub-table}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:is-sub-table}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:is-sub-table} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLabelCellRangeAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLabelCellRangeAddressAttribute.java
new file mode 100644
index 0000000..7dd97fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLabelCellRangeAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:label-cell-range-address}.
+ *
+ */
+public class TableLabelCellRangeAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "label-cell-range-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:label-cell-range-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLabelCellRangeAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:label-cell-range-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:label-cell-range-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:label-cell-range-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLanguageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLanguageAttribute.java
new file mode 100644
index 0000000..c99e5da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLanguageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:language}.
+ *
+ */
+public class TableLanguageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "language");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:language}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLanguageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:language}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:language}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:language} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastColumnSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastColumnSpannedAttribute.java
new file mode 100644
index 0000000..7f467a2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastColumnSpannedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:last-column-spanned}.
+ *
+ */
+public class TableLastColumnSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "last-column-spanned");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:last-column-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLastColumnSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:last-column-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:last-column-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:last-column-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowEndColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowEndColumnAttribute.java
new file mode 100644
index 0000000..4f0d422
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowEndColumnAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:last-row-end-column}.
+ *
+ */
+public class TableLastRowEndColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "last-row-end-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:last-row-end-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLastRowEndColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:last-row-end-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:last-row-end-column}.
+	 */
+	public enum Value {
+		COLUMN("column"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:last-row-end-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:last-row-end-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowSpannedAttribute.java
new file mode 100644
index 0000000..d12a962
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowSpannedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:last-row-spanned}.
+ *
+ */
+public class TableLastRowSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "last-row-spanned");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:last-row-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLastRowSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:last-row-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:last-row-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:last-row-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowStartColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowStartColumnAttribute.java
new file mode 100644
index 0000000..f8bedad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLastRowStartColumnAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:last-row-start-column}.
+ *
+ */
+public class TableLastRowStartColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "last-row-start-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:last-row-start-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLastRowStartColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:last-row-start-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:last-row-start-column}.
+	 */
+	public enum Value {
+		COLUMN("column"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:last-row-start-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:last-row-start-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLayoutModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLayoutModeAttribute.java
new file mode 100644
index 0000000..c9ecd1b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLayoutModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:layout-mode}.
+ *
+ */
+public class TableLayoutModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "layout-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:layout-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLayoutModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:layout-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:layout-mode}.
+	 */
+	public enum Value {
+		OUTLINE_SUBTOTALS_BOTTOM("outline-subtotals-bottom"), OUTLINE_SUBTOTALS_TOP("outline-subtotals-top"), TABULAR_LAYOUT("tabular-layout") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:layout-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:layout-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLinkToSourceDataAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLinkToSourceDataAttribute.java
new file mode 100644
index 0000000..e0cd34f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableLinkToSourceDataAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:link-to-source-data}.
+ *
+ */
+public class TableLinkToSourceDataAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "link-to-source-data");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:link-to-source-data}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableLinkToSourceDataAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:link-to-source-data}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:link-to-source-data}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:link-to-source-data} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMarkedInvalidAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMarkedInvalidAttribute.java
new file mode 100644
index 0000000..db0bd45
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMarkedInvalidAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:marked-invalid}.
+ *
+ */
+public class TableMarkedInvalidAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "marked-invalid");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:marked-invalid}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMarkedInvalidAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:marked-invalid}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:marked-invalid}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:marked-invalid} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMatrixCoveredAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMatrixCoveredAttribute.java
new file mode 100644
index 0000000..2145d53
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMatrixCoveredAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:matrix-covered}.
+ *
+ */
+public class TableMatrixCoveredAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "matrix-covered");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:matrix-covered}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMatrixCoveredAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:matrix-covered}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:matrix-covered}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:matrix-covered} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMaximumDifferenceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMaximumDifferenceAttribute.java
new file mode 100644
index 0000000..28d25cf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMaximumDifferenceAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:maximum-difference}.
+ *
+ */
+public class TableMaximumDifferenceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "maximum-difference");
+	public static final String DEFAULT_VALUE = "0.001";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:maximum-difference}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMaximumDifferenceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:maximum-difference}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:maximum-difference}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:maximum-difference} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberCountAttribute.java
new file mode 100644
index 0000000..018d7bc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberCountAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:member-count}.
+ *
+ */
+public class TableMemberCountAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "member-count");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:member-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMemberCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:member-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:member-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:member-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberNameAttribute.java
new file mode 100644
index 0000000..6f49b89
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:member-name}.
+ *
+ */
+public class TableMemberNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "member-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:member-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMemberNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:member-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:member-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:member-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberTypeAttribute.java
new file mode 100644
index 0000000..8f18754
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMemberTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:member-type}.
+ *
+ */
+public class TableMemberTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "member-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:member-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMemberTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:member-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:member-type}.
+	 */
+	public enum Value {
+		NAMED("named"), NEXT("next"), PREVIOUS("previous") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:member-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:member-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMessageTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMessageTypeAttribute.java
new file mode 100644
index 0000000..2658ba9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMessageTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:message-type}.
+ *
+ */
+public class TableMessageTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "message-type");
+	public static final String DEFAULT_VALUE = "stop";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:message-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMessageTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:message-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:message-type}.
+	 */
+	public enum Value {
+		INFORMATION("information"), STOP("stop"), WARNING("warning") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:message-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:message-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableModeAttribute.java
new file mode 100644
index 0000000..3947ccd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableModeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:mode}.
+ *
+ */
+public class TableModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "mode");
+	public static final String DEFAULT_VALUE = "copy-all";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:mode}.
+	 */
+	public enum Value {
+		COPY_ALL("copy-all"), COPY_RESULTS_ONLY("copy-results-only") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMultiDeletionSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMultiDeletionSpannedAttribute.java
new file mode 100644
index 0000000..431bbc3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableMultiDeletionSpannedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:multi-deletion-spanned}.
+ *
+ */
+public class TableMultiDeletionSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "multi-deletion-spanned");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:multi-deletion-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableMultiDeletionSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:multi-deletion-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:multi-deletion-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:multi-deletion-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNameAttribute.java
new file mode 100644
index 0000000..cfae354
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNameAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:name}.
+ *
+ */
+public class TableNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:name}.
+	 */
+	public enum Value {
+		REMOVE_DEPENDENTS("remove-dependents"), REMOVE_PRECEDENTS("remove-precedents"), TRACE_DEPENDENTS("trace-dependents"), TRACE_ERRORS("trace-errors"), TRACE_PRECEDENTS("trace-precedents") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNullYearAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNullYearAttribute.java
new file mode 100644
index 0000000..2075073
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNullYearAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:null-year}.
+ *
+ */
+public class TableNullYearAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "null-year");
+	public static final String DEFAULT_VALUE = "1930";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:null-year}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNullYearAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:null-year}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:null-year}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:null-year} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberColumnsRepeatedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberColumnsRepeatedAttribute.java
new file mode 100644
index 0000000..b7b9167
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberColumnsRepeatedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:number-columns-repeated}.
+ *
+ */
+public class TableNumberColumnsRepeatedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "number-columns-repeated");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:number-columns-repeated}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNumberColumnsRepeatedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:number-columns-repeated}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:number-columns-repeated}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:number-columns-repeated} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberColumnsSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberColumnsSpannedAttribute.java
new file mode 100644
index 0000000..a3c7574
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberColumnsSpannedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:number-columns-spanned}.
+ *
+ */
+public class TableNumberColumnsSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "number-columns-spanned");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:number-columns-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNumberColumnsSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:number-columns-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:number-columns-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:number-columns-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberMatrixColumnsSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberMatrixColumnsSpannedAttribute.java
new file mode 100644
index 0000000..4f5180f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberMatrixColumnsSpannedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:number-matrix-columns-spanned}.
+ *
+ */
+public class TableNumberMatrixColumnsSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "number-matrix-columns-spanned");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:number-matrix-columns-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNumberMatrixColumnsSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:number-matrix-columns-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:number-matrix-columns-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:number-matrix-columns-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberMatrixRowsSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberMatrixRowsSpannedAttribute.java
new file mode 100644
index 0000000..7463383
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberMatrixRowsSpannedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:number-matrix-rows-spanned}.
+ *
+ */
+public class TableNumberMatrixRowsSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "number-matrix-rows-spanned");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:number-matrix-rows-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNumberMatrixRowsSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:number-matrix-rows-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:number-matrix-rows-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:number-matrix-rows-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberRowsRepeatedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberRowsRepeatedAttribute.java
new file mode 100644
index 0000000..40d7764
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberRowsRepeatedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:number-rows-repeated}.
+ *
+ */
+public class TableNumberRowsRepeatedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "number-rows-repeated");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:number-rows-repeated}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNumberRowsRepeatedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:number-rows-repeated}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:number-rows-repeated}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:number-rows-repeated} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberRowsSpannedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberRowsSpannedAttribute.java
new file mode 100644
index 0000000..3a1d7c1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableNumberRowsSpannedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:number-rows-spanned}.
+ *
+ */
+public class TableNumberRowsSpannedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "number-rows-spanned");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:number-rows-spanned}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableNumberRowsSpannedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:number-rows-spanned}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:number-rows-spanned}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:number-rows-spanned} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableObjectNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableObjectNameAttribute.java
new file mode 100644
index 0000000..84b3b53
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableObjectNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:object-name}.
+ *
+ */
+public class TableObjectNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "object-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:object-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableObjectNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:object-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:object-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:object-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOnUpdateKeepSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOnUpdateKeepSizeAttribute.java
new file mode 100644
index 0000000..c53e379
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOnUpdateKeepSizeAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:on-update-keep-size}.
+ *
+ */
+public class TableOnUpdateKeepSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "on-update-keep-size");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:on-update-keep-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableOnUpdateKeepSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:on-update-keep-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:on-update-keep-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:on-update-keep-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOnUpdateKeepStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOnUpdateKeepStylesAttribute.java
new file mode 100644
index 0000000..e8b8f50
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOnUpdateKeepStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:on-update-keep-styles}.
+ *
+ */
+public class TableOnUpdateKeepStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "on-update-keep-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:on-update-keep-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableOnUpdateKeepStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:on-update-keep-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:on-update-keep-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:on-update-keep-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOperatorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOperatorAttribute.java
new file mode 100644
index 0000000..af2a8f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOperatorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:operator}.
+ *
+ */
+public class TableOperatorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "operator");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:operator}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableOperatorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:operator}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:operator}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:operator} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOrderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOrderAttribute.java
new file mode 100644
index 0000000..9e4c582
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOrderAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:order}.
+ *
+ */
+public class TableOrderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "order");
+	public static final String DEFAULT_VALUE = "ascending";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:order}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableOrderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:order}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:order}.
+	 */
+	public enum Value {
+		ASCENDING("ascending"), DESCENDING("descending") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:order}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:order} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOrientationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOrientationAttribute.java
new file mode 100644
index 0000000..e26b496
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableOrientationAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:orientation}.
+ *
+ */
+public class TableOrientationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "orientation");
+	public static final String DEFAULT_VALUE = "row";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:orientation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableOrientationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:orientation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:orientation}.
+	 */
+	public enum Value {
+		COLUMN("column"), DATA("data"), HIDDEN("hidden"), PAGE("page"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:orientation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:orientation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePageBreaksOnGroupChangeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePageBreaksOnGroupChangeAttribute.java
new file mode 100644
index 0000000..d00adc5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePageBreaksOnGroupChangeAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:page-breaks-on-group-change}.
+ *
+ */
+public class TablePageBreaksOnGroupChangeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "page-breaks-on-group-change");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:page-breaks-on-group-change}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TablePageBreaksOnGroupChangeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:page-breaks-on-group-change}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:page-breaks-on-group-change}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:page-breaks-on-group-change} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableParagraphStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableParagraphStyleNameAttribute.java
new file mode 100644
index 0000000..410231c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableParagraphStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:paragraph-style-name}.
+ *
+ */
+public class TableParagraphStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:paragraph-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableParagraphStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:paragraph-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:paragraph-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:paragraph-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableParseSqlStatementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableParseSqlStatementAttribute.java
new file mode 100644
index 0000000..ee3fafd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableParseSqlStatementAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:parse-sql-statement}.
+ *
+ */
+public class TableParseSqlStatementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "parse-sql-statement");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:parse-sql-statement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableParseSqlStatementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:parse-sql-statement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:parse-sql-statement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:parse-sql-statement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePasswordAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePasswordAttribute.java
new file mode 100644
index 0000000..a19b3b8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePasswordAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:password}.
+ *
+ */
+public class TablePasswordAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "password");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:password}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TablePasswordAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:password}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:password}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:password} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePositionAttribute.java
new file mode 100644
index 0000000..3591476
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:position}.
+ *
+ */
+public class TablePositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TablePositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrecisionAsShownAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrecisionAsShownAttribute.java
new file mode 100644
index 0000000..f90270c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrecisionAsShownAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:precision-as-shown}.
+ *
+ */
+public class TablePrecisionAsShownAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "precision-as-shown");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:precision-as-shown}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TablePrecisionAsShownAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:precision-as-shown}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:precision-as-shown}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:precision-as-shown} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrintAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrintAttribute.java
new file mode 100644
index 0000000..6b49da7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrintAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:print}.
+ *
+ */
+public class TablePrintAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "print");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:print}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TablePrintAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:print}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:print}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:print} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrintRangesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrintRangesAttribute.java
new file mode 100644
index 0000000..ac22388
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TablePrintRangesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:print-ranges}.
+ *
+ */
+public class TablePrintRangesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "print-ranges");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:print-ranges}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TablePrintRangesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:print-ranges}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:print-ranges}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:print-ranges} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectAttribute.java
new file mode 100644
index 0000000..adb228b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:protect}.
+ *
+ */
+public class TableProtectAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "protect");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:protect}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableProtectAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:protect}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:protect}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:protect} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectedAttribute.java
new file mode 100644
index 0000000..88748c2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:protected}.
+ *
+ */
+public class TableProtectedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "protected");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:protected}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableProtectedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:protected}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:protected}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:protected} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectionKeyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectionKeyAttribute.java
new file mode 100644
index 0000000..1ce151e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectionKeyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:protection-key}.
+ *
+ */
+public class TableProtectionKeyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "protection-key");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:protection-key}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableProtectionKeyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:protection-key}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:protection-key}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:protection-key} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectionKeyDigestAlgorithmAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectionKeyDigestAlgorithmAttribute.java
new file mode 100644
index 0000000..03db2ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableProtectionKeyDigestAlgorithmAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:protection-key-digest-algorithm}.
+ *
+ */
+public class TableProtectionKeyDigestAlgorithmAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "protection-key-digest-algorithm");
+	public static final String DEFAULT_VALUE = "http://www.w3.org/2000/09/xmldsig#sha1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:protection-key-digest-algorithm}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableProtectionKeyDigestAlgorithmAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:protection-key-digest-algorithm}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:protection-key-digest-algorithm}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:protection-key-digest-algorithm} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableQueryNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableQueryNameAttribute.java
new file mode 100644
index 0000000..e41bc71
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableQueryNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:query-name}.
+ *
+ */
+public class TableQueryNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "query-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:query-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableQueryNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:query-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:query-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:query-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRangeUsableAsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRangeUsableAsAttribute.java
new file mode 100644
index 0000000..18e5163
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRangeUsableAsAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:range-usable-as}.
+ *
+ */
+public class TableRangeUsableAsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "range-usable-as");
+	public static final String DEFAULT_VALUE = "none";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:range-usable-as}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableRangeUsableAsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:range-usable-as}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:range-usable-as}.
+	 */
+	public enum Value {
+		FILTER("filter"), NONE("none"), PRINT_RANGE("print-range"), REPEAT_COLUMN("repeat-column"), REPEAT_ROW("repeat-row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:range-usable-as}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:range-usable-as} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRefreshDelayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRefreshDelayAttribute.java
new file mode 100644
index 0000000..ddaeb5a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRefreshDelayAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:refresh-delay}.
+ *
+ */
+public class TableRefreshDelayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "refresh-delay");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:refresh-delay}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableRefreshDelayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:refresh-delay}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:refresh-delay}.
+	 */
+	public enum Value {
+		FALSE("false"), TRUE("true") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:refresh-delay}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:refresh-delay} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRejectingChangeIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRejectingChangeIdAttribute.java
new file mode 100644
index 0000000..925bc30
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRejectingChangeIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:rejecting-change-id}.
+ *
+ */
+public class TableRejectingChangeIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "rejecting-change-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:rejecting-change-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableRejectingChangeIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:rejecting-change-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:rejecting-change-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:rejecting-change-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRfcLanguageTagAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRfcLanguageTagAttribute.java
new file mode 100644
index 0000000..1bdfe25
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRfcLanguageTagAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:rfc-language-tag}.
+ *
+ */
+public class TableRfcLanguageTagAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "rfc-language-tag");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:rfc-language-tag}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableRfcLanguageTagAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:rfc-language-tag}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:rfc-language-tag}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:rfc-language-tag} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRowAttribute.java
new file mode 100644
index 0000000..a3629e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableRowAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:row}.
+ *
+ */
+public class TableRowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "row");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:row}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableRowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:row}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:row}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:row} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableScenarioRangesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableScenarioRangesAttribute.java
new file mode 100644
index 0000000..0d8fdf0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableScenarioRangesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:scenario-ranges}.
+ *
+ */
+public class TableScenarioRangesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "scenario-ranges");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:scenario-ranges}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableScenarioRangesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:scenario-ranges}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:scenario-ranges}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:scenario-ranges} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableScriptAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableScriptAttribute.java
new file mode 100644
index 0000000..93510de
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableScriptAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:script}.
+ *
+ */
+public class TableScriptAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "script");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:script}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableScriptAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:script}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:script}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:script} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSearchCriteriaMustApplyToWholeCellAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSearchCriteriaMustApplyToWholeCellAttribute.java
new file mode 100644
index 0000000..9af9780
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSearchCriteriaMustApplyToWholeCellAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:search-criteria-must-apply-to-whole-cell}.
+ *
+ */
+public class TableSearchCriteriaMustApplyToWholeCellAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "search-criteria-must-apply-to-whole-cell");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:search-criteria-must-apply-to-whole-cell}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSearchCriteriaMustApplyToWholeCellAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:search-criteria-must-apply-to-whole-cell}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:search-criteria-must-apply-to-whole-cell}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:search-criteria-must-apply-to-whole-cell} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSelectedPageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSelectedPageAttribute.java
new file mode 100644
index 0000000..0c83389
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSelectedPageAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:selected-page}.
+ *
+ */
+public class TableSelectedPageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "selected-page");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:selected-page}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSelectedPageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:selected-page}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:selected-page}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:selected-page} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowDetailsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowDetailsAttribute.java
new file mode 100644
index 0000000..fbe12f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowDetailsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:show-details}.
+ *
+ */
+public class TableShowDetailsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "show-details");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:show-details}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableShowDetailsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:show-details}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:show-details}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:show-details} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowEmptyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowEmptyAttribute.java
new file mode 100644
index 0000000..fd8333d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowEmptyAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:show-empty}.
+ *
+ */
+public class TableShowEmptyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "show-empty");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:show-empty}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableShowEmptyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:show-empty}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:show-empty}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:show-empty} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowFilterButtonAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowFilterButtonAttribute.java
new file mode 100644
index 0000000..98de10b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableShowFilterButtonAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:show-filter-button}.
+ *
+ */
+public class TableShowFilterButtonAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "show-filter-button");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:show-filter-button}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableShowFilterButtonAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:show-filter-button}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:show-filter-button}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:show-filter-button} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSortModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSortModeAttribute.java
new file mode 100644
index 0000000..5a6edf1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSortModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:sort-mode}.
+ *
+ */
+public class TableSortModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "sort-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:sort-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSortModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:sort-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:sort-mode}.
+	 */
+	public enum Value {
+		DATA("data"), MANUAL("manual"), NAME("name"), NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:sort-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:sort-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceCellRangeAddressesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceCellRangeAddressesAttribute.java
new file mode 100644
index 0000000..657afb2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceCellRangeAddressesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:source-cell-range-addresses}.
+ *
+ */
+public class TableSourceCellRangeAddressesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "source-cell-range-addresses");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:source-cell-range-addresses}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSourceCellRangeAddressesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:source-cell-range-addresses}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:source-cell-range-addresses}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:source-cell-range-addresses} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceFieldNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceFieldNameAttribute.java
new file mode 100644
index 0000000..825b152
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceFieldNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:source-field-name}.
+ *
+ */
+public class TableSourceFieldNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "source-field-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:source-field-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSourceFieldNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:source-field-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:source-field-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:source-field-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceNameAttribute.java
new file mode 100644
index 0000000..2c0bee8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSourceNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:source-name}.
+ *
+ */
+public class TableSourceNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "source-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:source-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSourceNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:source-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:source-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:source-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSqlStatementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSqlStatementAttribute.java
new file mode 100644
index 0000000..fd0b72a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableSqlStatementAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:sql-statement}.
+ *
+ */
+public class TableSqlStatementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "sql-statement");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:sql-statement}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableSqlStatementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:sql-statement}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:sql-statement}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:sql-statement} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartAttribute.java
new file mode 100644
index 0000000..638011b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:start}.
+ *
+ */
+public class TableStartAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "start");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:start}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStartAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:start}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:start}.
+	 */
+	public enum Value {
+		AUTO("auto") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:start}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:start} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartColumnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartColumnAttribute.java
new file mode 100644
index 0000000..38a3f3d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartColumnAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:start-column}.
+ *
+ */
+public class TableStartColumnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "start-column");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:start-column}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStartColumnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:start-column}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:start-column}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:start-column} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartPositionAttribute.java
new file mode 100644
index 0000000..46749a1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartPositionAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:start-position}.
+ *
+ */
+public class TableStartPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "start-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:start-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStartPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:start-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:start-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:start-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartRowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartRowAttribute.java
new file mode 100644
index 0000000..d271cb4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartRowAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:start-row}.
+ *
+ */
+public class TableStartRowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "start-row");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:start-row}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStartRowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:start-row}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:start-row}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:start-row} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartTableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartTableAttribute.java
new file mode 100644
index 0000000..f785d6b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStartTableAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:start-table}.
+ *
+ */
+public class TableStartTableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "start-table");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:start-table}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStartTableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:start-table}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:start-table}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:start-table} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStatusAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStatusAttribute.java
new file mode 100644
index 0000000..71a7e5d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStatusAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:status}.
+ *
+ */
+public class TableStatusAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "status");
+	public static final String DEFAULT_VALUE = "disable";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:status}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStatusAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:status}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:status}.
+	 */
+	public enum Value {
+		DISABLE("disable"), ENABLE("enable") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:status}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:status} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStepAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStepAttribute.java
new file mode 100644
index 0000000..6a00f24
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStepAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:step}.
+ *
+ */
+public class TableStepAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "step");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:step}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStepAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:step}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>double</code> value of the attribute.
+	 */
+	public void setDoubleValue(double value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>double</code> value of the attribute
+	 */
+	public double doubleValue() {
+		String val = super.getValue();
+		try {
+			return Double.parseDouble(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:step}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:step} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStepsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStepsAttribute.java
new file mode 100644
index 0000000..a75157f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStepsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:steps}.
+ *
+ */
+public class TableStepsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "steps");
+	public static final String DEFAULT_VALUE = "100";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:steps}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStepsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:steps}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:steps}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:steps} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStructureProtectedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStructureProtectedAttribute.java
new file mode 100644
index 0000000..54401db
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStructureProtectedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:structure-protected}.
+ *
+ */
+public class TableStructureProtectedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "structure-protected");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:structure-protected}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStructureProtectedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:structure-protected}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:structure-protected}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:structure-protected} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStyleNameAttribute.java
new file mode 100644
index 0000000..06bc0eb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:style-name}.
+ *
+ */
+public class TableStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableAttribute.java
new file mode 100644
index 0000000..8b741bc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:table}.
+ *
+ */
+public class TableTableAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:table}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTableAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:table}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:table}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:table} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableBackgroundAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableBackgroundAttribute.java
new file mode 100644
index 0000000..7eebabc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableBackgroundAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:table-background}.
+ *
+ */
+public class TableTableBackgroundAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-background");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:table-background}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTableBackgroundAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:table-background}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:table-background}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:table-background} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableNameAttribute.java
new file mode 100644
index 0000000..9063cb3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTableNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:table-name}.
+ *
+ */
+public class TableTableNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:table-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTableNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:table-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:table-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:table-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTargetCellAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTargetCellAddressAttribute.java
new file mode 100644
index 0000000..3e4985d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTargetCellAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:target-cell-address}.
+ *
+ */
+public class TableTargetCellAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "target-cell-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:target-cell-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTargetCellAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:target-cell-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:target-cell-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:target-cell-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTargetRangeAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTargetRangeAddressAttribute.java
new file mode 100644
index 0000000..f8a5784
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTargetRangeAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:target-range-address}.
+ *
+ */
+public class TableTargetRangeAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "target-range-address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:target-range-address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTargetRangeAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:target-range-address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:target-range-address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:target-range-address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTemplateNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTemplateNameAttribute.java
new file mode 100644
index 0000000..f7f0676
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTemplateNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:template-name}.
+ *
+ */
+public class TableTemplateNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "template-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:template-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTemplateNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:template-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:template-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:template-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTitleAttribute.java
new file mode 100644
index 0000000..5891b21
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:title}.
+ *
+ */
+public class TableTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTrackChangesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTrackChangesAttribute.java
new file mode 100644
index 0000000..b48bcde
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTrackChangesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:track-changes}.
+ *
+ */
+public class TableTrackChangesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "track-changes");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:track-changes}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTrackChangesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:track-changes}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:track-changes}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:track-changes} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTypeAttribute.java
new file mode 100644
index 0000000..7b9fecc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:type}.
+ *
+ */
+public class TableTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:type}.
+	 */
+	public enum Value {
+		COLUMN("column"), COLUMN_PERCENTAGE("column-percentage"), INDEX("index"), MEMBER_DIFFERENCE("member-difference"), MEMBER_PERCENTAGE("member-percentage"), MEMBER_PERCENTAGE_DIFFERENCE("member-percentage-difference"), NONE("none"), ROW("row"), ROW_PERCENTAGE("row-percentage"), RUNNING_TOTAL("running-total"), TABLE("table"), TOTAL_PERCENTAGE("total-percentage") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseBandingColumnsStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseBandingColumnsStylesAttribute.java
new file mode 100644
index 0000000..435a438
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseBandingColumnsStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-banding-columns-styles}.
+ *
+ */
+public class TableUseBandingColumnsStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-banding-columns-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-banding-columns-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseBandingColumnsStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-banding-columns-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-banding-columns-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-banding-columns-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseBandingRowsStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseBandingRowsStylesAttribute.java
new file mode 100644
index 0000000..57a5c16
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseBandingRowsStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-banding-rows-styles}.
+ *
+ */
+public class TableUseBandingRowsStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-banding-rows-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-banding-rows-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseBandingRowsStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-banding-rows-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-banding-rows-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-banding-rows-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseFirstColumnStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseFirstColumnStylesAttribute.java
new file mode 100644
index 0000000..80bd5af
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseFirstColumnStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-first-column-styles}.
+ *
+ */
+public class TableUseFirstColumnStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-first-column-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-first-column-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseFirstColumnStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-first-column-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-first-column-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-first-column-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseFirstRowStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseFirstRowStylesAttribute.java
new file mode 100644
index 0000000..1104693
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseFirstRowStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-first-row-styles}.
+ *
+ */
+public class TableUseFirstRowStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-first-row-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-first-row-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseFirstRowStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-first-row-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-first-row-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-first-row-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLabelsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLabelsAttribute.java
new file mode 100644
index 0000000..46f3b08
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLabelsAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-labels}.
+ *
+ */
+public class TableUseLabelsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-labels");
+	public static final String DEFAULT_VALUE = "none";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-labels}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseLabelsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-labels}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:use-labels}.
+	 */
+	public enum Value {
+		BOTH("both"), COLUMN("column"), NONE("none"), ROW("row") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-labels}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-labels} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLastColumnStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLastColumnStylesAttribute.java
new file mode 100644
index 0000000..ff28fbe
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLastColumnStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-last-column-styles}.
+ *
+ */
+public class TableUseLastColumnStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-last-column-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-last-column-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseLastColumnStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-last-column-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-last-column-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-last-column-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLastRowStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLastRowStylesAttribute.java
new file mode 100644
index 0000000..cee15d0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseLastRowStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-last-row-styles}.
+ *
+ */
+public class TableUseLastRowStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-last-row-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-last-row-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseLastRowStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-last-row-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-last-row-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-last-row-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseRegularExpressionsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseRegularExpressionsAttribute.java
new file mode 100644
index 0000000..44fd2a4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseRegularExpressionsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-regular-expressions}.
+ *
+ */
+public class TableUseRegularExpressionsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-regular-expressions");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-regular-expressions}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseRegularExpressionsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-regular-expressions}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-regular-expressions}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-regular-expressions} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseWildcardsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseWildcardsAttribute.java
new file mode 100644
index 0000000..30ee1bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUseWildcardsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:use-wildcards}.
+ *
+ */
+public class TableUseWildcardsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "use-wildcards");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:use-wildcards}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUseWildcardsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:use-wildcards}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:use-wildcards}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:use-wildcards} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUsedHierarchyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUsedHierarchyAttribute.java
new file mode 100644
index 0000000..429bbc8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUsedHierarchyAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:used-hierarchy}.
+ *
+ */
+public class TableUsedHierarchyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "used-hierarchy");
+	public static final String DEFAULT_VALUE = "-1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:used-hierarchy}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUsedHierarchyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:used-hierarchy}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:used-hierarchy}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:used-hierarchy} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUserNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUserNameAttribute.java
new file mode 100644
index 0000000..e7e2efb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableUserNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:user-name}.
+ *
+ */
+public class TableUserNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "user-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:user-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableUserNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:user-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:user-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:user-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableValueAttribute.java
new file mode 100644
index 0000000..38da79d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:value}.
+ *
+ */
+public class TableValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableValueTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableValueTypeAttribute.java
new file mode 100644
index 0000000..fde7c67
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableValueTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:value-type}.
+ *
+ */
+public class TableValueTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "value-type");
+	public static final String DEFAULT_VALUE = "date";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:value-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableValueTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:value-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:value-type}.
+	 */
+	public enum Value {
+		DATE("date") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:value-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:value-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableVisibilityAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableVisibilityAttribute.java
new file mode 100644
index 0000000..816bcb1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/table/TableVisibilityAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.table;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute table:visibility}.
+ *
+ */
+public class TableVisibilityAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "visibility");
+	public static final String DEFAULT_VALUE = "visible";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute table:visibility}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TableVisibilityAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute table:visibility}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute table:visibility}.
+	 */
+	public enum Value {
+		COLLAPSE("collapse"), FILTER("filter"), VISIBLE("visible") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute table:visibility}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute table:visibility} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextActiveAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextActiveAttribute.java
new file mode 100644
index 0000000..16a718b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextActiveAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:active}.
+ *
+ */
+public class TextActiveAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "active");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:active}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextActiveAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:active}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:active}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:active} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAddressAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAddressAttribute.java
new file mode 100644
index 0000000..ce686ed
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAddressAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:address}.
+ *
+ */
+public class TextAddressAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "address");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:address}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAddressAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:address}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:address}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:address} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAlphabeticalSeparatorsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAlphabeticalSeparatorsAttribute.java
new file mode 100644
index 0000000..a00679b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAlphabeticalSeparatorsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:alphabetical-separators}.
+ *
+ */
+public class TextAlphabeticalSeparatorsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-separators");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:alphabetical-separators}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalSeparatorsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:alphabetical-separators}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:alphabetical-separators}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:alphabetical-separators} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnchorPageNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnchorPageNumberAttribute.java
new file mode 100644
index 0000000..6d2052c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnchorPageNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:anchor-page-number}.
+ *
+ */
+public class TextAnchorPageNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "anchor-page-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:anchor-page-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnchorPageNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:anchor-page-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:anchor-page-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:anchor-page-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnchorTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnchorTypeAttribute.java
new file mode 100644
index 0000000..6dd0750
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnchorTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:anchor-type}.
+ *
+ */
+public class TextAnchorTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "anchor-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:anchor-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnchorTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:anchor-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:anchor-type}.
+	 */
+	public enum Value {
+		AS_CHAR("as-char"), CHAR("char"), FRAME("frame"), PAGE("page"), PARAGRAPH("paragraph") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:anchor-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:anchor-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationAttribute.java
new file mode 100644
index 0000000..f0022be
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation}.
+ *
+ */
+public class TextAnimationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:animation}.
+	 */
+	public enum Value {
+		ALTERNATE("alternate"), NONE("none"), SCROLL("scroll"), SLIDE("slide") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationDelayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationDelayAttribute.java
new file mode 100644
index 0000000..989cef8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationDelayAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation-delay}.
+ *
+ */
+public class TextAnimationDelayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation-delay");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation-delay}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationDelayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation-delay}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation-delay}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation-delay} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationDirectionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationDirectionAttribute.java
new file mode 100644
index 0000000..469a274
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationDirectionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation-direction}.
+ *
+ */
+public class TextAnimationDirectionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation-direction");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation-direction}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationDirectionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation-direction}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:animation-direction}.
+	 */
+	public enum Value {
+		DOWN("down"), LEFT("left"), RIGHT("right"), UP("up") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation-direction}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation-direction} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationRepeatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationRepeatAttribute.java
new file mode 100644
index 0000000..8379294
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationRepeatAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation-repeat}.
+ *
+ */
+public class TextAnimationRepeatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation-repeat");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation-repeat}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationRepeatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation-repeat}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation-repeat}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation-repeat} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStartInsideAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStartInsideAttribute.java
new file mode 100644
index 0000000..ca92ae4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStartInsideAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation-start-inside}.
+ *
+ */
+public class TextAnimationStartInsideAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation-start-inside");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation-start-inside}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationStartInsideAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation-start-inside}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation-start-inside}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation-start-inside} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStepsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStepsAttribute.java
new file mode 100644
index 0000000..5fd531d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStepsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation-steps}.
+ *
+ */
+public class TextAnimationStepsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation-steps");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation-steps}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationStepsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation-steps}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation-steps}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation-steps} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStopInsideAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStopInsideAttribute.java
new file mode 100644
index 0000000..12c3435
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnimationStopInsideAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:animation-stop-inside}.
+ *
+ */
+public class TextAnimationStopInsideAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "animation-stop-inside");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:animation-stop-inside}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnimationStopInsideAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:animation-stop-inside}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:animation-stop-inside}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:animation-stop-inside} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnnoteAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnnoteAttribute.java
new file mode 100644
index 0000000..00d2ae9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAnnoteAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:annote}.
+ *
+ */
+public class TextAnnoteAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "annote");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:annote}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAnnoteAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:annote}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:annote}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:annote} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAuthorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAuthorAttribute.java
new file mode 100644
index 0000000..dd9f121
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextAuthorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:author}.
+ *
+ */
+public class TextAuthorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "author");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:author}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextAuthorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:author}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:author}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:author} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBibliographyDataFieldAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBibliographyDataFieldAttribute.java
new file mode 100644
index 0000000..28ee8c1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBibliographyDataFieldAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:bibliography-data-field}.
+ *
+ */
+public class TextBibliographyDataFieldAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography-data-field");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:bibliography-data-field}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographyDataFieldAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:bibliography-data-field}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:bibliography-data-field}.
+	 */
+	public enum Value {
+		ADDRESS("address"), ANNOTE("annote"), AUTHOR("author"), BIBLIOGRAPHY_TYPE("bibliography-type"), BOOKTITLE("booktitle"), CHAPTER("chapter"), CUSTOM1("custom1"), CUSTOM2("custom2"), CUSTOM3("custom3"), CUSTOM4("custom4"), CUSTOM5("custom5"), EDITION("edition"), EDITOR("editor"), HOWPUBLISHED("howpublished"), IDENTIFIER("identifier"), INSTITUTION("institution"), ISBN("isbn"), ISSN("issn"), JOURNAL("journal"), MONTH("month"), NOTE("note"), NUMBER("number"), ORGANIZATIONS("organizations"), PAGES("pages"), PUBLISHER("publisher"), REPORT_TYPE("report-type"), SCHOOL("school"), SERIES("series"), TITLE("title"), URL("url"), VOLUME("volume"), YEAR("year") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:bibliography-data-field}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:bibliography-data-field} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBibliographyTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBibliographyTypeAttribute.java
new file mode 100644
index 0000000..1fac5e9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBibliographyTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:bibliography-type}.
+ *
+ */
+public class TextBibliographyTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:bibliography-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographyTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:bibliography-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:bibliography-type}.
+	 */
+	public enum Value {
+		ARTICLE("article"), BOOK("book"), BOOKLET("booklet"), CONFERENCE("conference"), CUSTOM1("custom1"), CUSTOM2("custom2"), CUSTOM3("custom3"), CUSTOM4("custom4"), CUSTOM5("custom5"), EMAIL("email"), INBOOK("inbook"), INCOLLECTION("incollection"), INPROCEEDINGS("inproceedings"), JOURNAL("journal"), MANUAL("manual"), MASTERSTHESIS("mastersthesis"), MISC("misc"), PHDTHESIS("phdthesis"), PROCEEDINGS("proceedings"), TECHREPORT("techreport"), UNPUBLISHED("unpublished"), WWW("www") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:bibliography-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:bibliography-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBooktitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBooktitleAttribute.java
new file mode 100644
index 0000000..aaeda73
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBooktitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:booktitle}.
+ *
+ */
+public class TextBooktitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "booktitle");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:booktitle}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextBooktitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:booktitle}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:booktitle}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:booktitle} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBulletCharAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBulletCharAttribute.java
new file mode 100644
index 0000000..87ce13c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBulletCharAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:bullet-char}.
+ *
+ */
+public class TextBulletCharAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bullet-char");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:bullet-char}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextBulletCharAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:bullet-char}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:bullet-char}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:bullet-char} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBulletRelativeSizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBulletRelativeSizeAttribute.java
new file mode 100644
index 0000000..0bc13e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextBulletRelativeSizeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:bullet-relative-size}.
+ *
+ */
+public class TextBulletRelativeSizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bullet-relative-size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:bullet-relative-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextBulletRelativeSizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:bullet-relative-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:bullet-relative-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:bullet-relative-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCAttribute.java
new file mode 100644
index 0000000..fd65a9d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:c}.
+ *
+ */
+public class TextCAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "c");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:c}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:c}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:c}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:c} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCapitalizeEntriesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCapitalizeEntriesAttribute.java
new file mode 100644
index 0000000..8736bd3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCapitalizeEntriesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:capitalize-entries}.
+ *
+ */
+public class TextCapitalizeEntriesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "capitalize-entries");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:capitalize-entries}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCapitalizeEntriesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:capitalize-entries}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:capitalize-entries}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:capitalize-entries} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCaptionSequenceFormatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCaptionSequenceFormatAttribute.java
new file mode 100644
index 0000000..6c1327c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCaptionSequenceFormatAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:caption-sequence-format}.
+ *
+ */
+public class TextCaptionSequenceFormatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "caption-sequence-format");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:caption-sequence-format}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCaptionSequenceFormatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:caption-sequence-format}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:caption-sequence-format}.
+	 */
+	public enum Value {
+		CAPTION("caption"), CATEGORY_AND_VALUE("category-and-value"), TEXT("text") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:caption-sequence-format}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:caption-sequence-format} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCaptionSequenceNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCaptionSequenceNameAttribute.java
new file mode 100644
index 0000000..1ff218d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCaptionSequenceNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:caption-sequence-name}.
+ *
+ */
+public class TextCaptionSequenceNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "caption-sequence-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:caption-sequence-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCaptionSequenceNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:caption-sequence-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:caption-sequence-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:caption-sequence-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextChangeIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextChangeIdAttribute.java
new file mode 100644
index 0000000..b1ad4da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextChangeIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:change-id}.
+ *
+ */
+public class TextChangeIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "change-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:change-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextChangeIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:change-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:change-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:change-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextChapterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextChapterAttribute.java
new file mode 100644
index 0000000..a29a705
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextChapterAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:chapter}.
+ *
+ */
+public class TextChapterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "chapter");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:chapter}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextChapterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:chapter}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:chapter}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:chapter} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCitationBodyStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCitationBodyStyleNameAttribute.java
new file mode 100644
index 0000000..993c725
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCitationBodyStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:citation-body-style-name}.
+ *
+ */
+public class TextCitationBodyStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "citation-body-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:citation-body-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCitationBodyStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:citation-body-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:citation-body-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:citation-body-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCitationStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCitationStyleNameAttribute.java
new file mode 100644
index 0000000..1f3ae3b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCitationStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:citation-style-name}.
+ *
+ */
+public class TextCitationStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "citation-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:citation-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCitationStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:citation-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:citation-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:citation-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextClassNamesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextClassNamesAttribute.java
new file mode 100644
index 0000000..3913510
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextClassNamesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:class-names}.
+ *
+ */
+public class TextClassNamesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "class-names");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:class-names}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextClassNamesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:class-names}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:class-names}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:class-names} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextColumnNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextColumnNameAttribute.java
new file mode 100644
index 0000000..9cf96b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextColumnNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:column-name}.
+ *
+ */
+public class TextColumnNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "column-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:column-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextColumnNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:column-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:column-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:column-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesAttribute.java
new file mode 100644
index 0000000..19af562
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:combine-entries}.
+ *
+ */
+public class TextCombineEntriesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "combine-entries");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:combine-entries}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCombineEntriesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:combine-entries}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:combine-entries}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:combine-entries} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesWithDashAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesWithDashAttribute.java
new file mode 100644
index 0000000..0ffa9ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesWithDashAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:combine-entries-with-dash}.
+ *
+ */
+public class TextCombineEntriesWithDashAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "combine-entries-with-dash");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:combine-entries-with-dash}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCombineEntriesWithDashAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:combine-entries-with-dash}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:combine-entries-with-dash}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:combine-entries-with-dash} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesWithPpAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesWithPpAttribute.java
new file mode 100644
index 0000000..49c1fa0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCombineEntriesWithPpAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:combine-entries-with-pp}.
+ *
+ */
+public class TextCombineEntriesWithPpAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "combine-entries-with-pp");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:combine-entries-with-pp}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCombineEntriesWithPpAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:combine-entries-with-pp}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:combine-entries-with-pp}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:combine-entries-with-pp} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCommaSeparatedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCommaSeparatedAttribute.java
new file mode 100644
index 0000000..c7169f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCommaSeparatedAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:comma-separated}.
+ *
+ */
+public class TextCommaSeparatedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "comma-separated");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:comma-separated}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCommaSeparatedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:comma-separated}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:comma-separated}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:comma-separated} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCondStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCondStyleNameAttribute.java
new file mode 100644
index 0000000..50e1fee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCondStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:cond-style-name}.
+ *
+ */
+public class TextCondStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "cond-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:cond-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCondStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:cond-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:cond-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:cond-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConditionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConditionAttribute.java
new file mode 100644
index 0000000..13086d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConditionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:condition}.
+ *
+ */
+public class TextConditionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "condition");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:condition}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextConditionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:condition}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:condition}.
+	 */
+	public enum Value {
+		NONE("none") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:condition}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:condition} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConnectionNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConnectionNameAttribute.java
new file mode 100644
index 0000000..8872092
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConnectionNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:connection-name}.
+ *
+ */
+public class TextConnectionNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "connection-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:connection-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextConnectionNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:connection-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:connection-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:connection-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConsecutiveNumberingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConsecutiveNumberingAttribute.java
new file mode 100644
index 0000000..0dcb090
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextConsecutiveNumberingAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:consecutive-numbering}.
+ *
+ */
+public class TextConsecutiveNumberingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "consecutive-numbering");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:consecutive-numbering}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextConsecutiveNumberingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:consecutive-numbering}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:consecutive-numbering}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:consecutive-numbering} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextContinueListAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextContinueListAttribute.java
new file mode 100644
index 0000000..ea4356d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextContinueListAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:continue-list}.
+ *
+ */
+public class TextContinueListAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "continue-list");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:continue-list}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextContinueListAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:continue-list}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:continue-list}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:continue-list} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextContinueNumberingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextContinueNumberingAttribute.java
new file mode 100644
index 0000000..613476a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextContinueNumberingAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:continue-numbering}.
+ *
+ */
+public class TextContinueNumberingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "continue-numbering");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:continue-numbering}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextContinueNumberingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:continue-numbering}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:continue-numbering}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:continue-numbering} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCopyOutlineLevelsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCopyOutlineLevelsAttribute.java
new file mode 100644
index 0000000..517b663
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCopyOutlineLevelsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:copy-outline-levels}.
+ *
+ */
+public class TextCopyOutlineLevelsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "copy-outline-levels");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:copy-outline-levels}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCopyOutlineLevelsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:copy-outline-levels}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:copy-outline-levels}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:copy-outline-levels} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCountEmptyLinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCountEmptyLinesAttribute.java
new file mode 100644
index 0000000..f376d51
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCountEmptyLinesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:count-empty-lines}.
+ *
+ */
+public class TextCountEmptyLinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "count-empty-lines");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:count-empty-lines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCountEmptyLinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:count-empty-lines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:count-empty-lines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:count-empty-lines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCountInTextBoxesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCountInTextBoxesAttribute.java
new file mode 100644
index 0000000..eb206b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCountInTextBoxesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:count-in-text-boxes}.
+ *
+ */
+public class TextCountInTextBoxesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "count-in-text-boxes");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:count-in-text-boxes}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCountInTextBoxesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:count-in-text-boxes}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:count-in-text-boxes}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:count-in-text-boxes} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCurrentValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCurrentValueAttribute.java
new file mode 100644
index 0000000..94b80c6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCurrentValueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:current-value}.
+ *
+ */
+public class TextCurrentValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "current-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:current-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCurrentValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:current-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:current-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:current-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom1Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom1Attribute.java
new file mode 100644
index 0000000..a096bea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom1Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:custom1}.
+ *
+ */
+public class TextCustom1Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "custom1");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:custom1}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCustom1Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:custom1}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:custom1}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:custom1} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom2Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom2Attribute.java
new file mode 100644
index 0000000..ffc76d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom2Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:custom2}.
+ *
+ */
+public class TextCustom2Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "custom2");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:custom2}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCustom2Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:custom2}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:custom2}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:custom2} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom3Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom3Attribute.java
new file mode 100644
index 0000000..416a859
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom3Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:custom3}.
+ *
+ */
+public class TextCustom3Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "custom3");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:custom3}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCustom3Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:custom3}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:custom3}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:custom3} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom4Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom4Attribute.java
new file mode 100644
index 0000000..5ee116e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom4Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:custom4}.
+ *
+ */
+public class TextCustom4Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "custom4");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:custom4}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCustom4Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:custom4}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:custom4}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:custom4} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom5Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom5Attribute.java
new file mode 100644
index 0000000..163bf29
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextCustom5Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:custom5}.
+ *
+ */
+public class TextCustom5Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "custom5");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:custom5}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextCustom5Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:custom5}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:custom5}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:custom5} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDatabaseNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDatabaseNameAttribute.java
new file mode 100644
index 0000000..f529fc1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDatabaseNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:database-name}.
+ *
+ */
+public class TextDatabaseNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "database-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:database-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDatabaseNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:database-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:database-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:database-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDateAdjustAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDateAdjustAttribute.java
new file mode 100644
index 0000000..823e778
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDateAdjustAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:date-adjust}.
+ *
+ */
+public class TextDateAdjustAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "date-adjust");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:date-adjust}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDateAdjustAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:date-adjust}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:date-adjust}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:date-adjust} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDateValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDateValueAttribute.java
new file mode 100644
index 0000000..bc7fc6c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDateValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:date-value}.
+ *
+ */
+public class TextDateValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "date-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:date-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDateValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:date-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:date-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:date-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDefaultStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDefaultStyleNameAttribute.java
new file mode 100644
index 0000000..636ad41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDefaultStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:default-style-name}.
+ *
+ */
+public class TextDefaultStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "default-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:default-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDefaultStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:default-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:default-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:default-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDescriptionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDescriptionAttribute.java
new file mode 100644
index 0000000..78999c1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDescriptionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:description}.
+ *
+ */
+public class TextDescriptionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "description");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:description}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDescriptionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:description}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:description}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:description} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayAttribute.java
new file mode 100644
index 0000000..308fc3f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:display}.
+ *
+ */
+public class TextDisplayAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "display");
+	public static final String DEFAULT_VALUE = "number";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:display}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDisplayAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:display}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:display}.
+	 */
+	public enum Value {
+		AREA("area"), CONDITION("condition"), FORMULA("formula"), FULL("full"), NAME("name"), NAME_AND_EXTENSION("name-and-extension"), NONE("none"), NUMBER("number"), NUMBER_AND_NAME("number-and-name"), PATH("path"), PLAIN_NUMBER("plain-number"), PLAIN_NUMBER_AND_NAME("plain-number-and-name"), TITLE("title"), TRUE("true"), VALUE("value") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:display}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:display} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayLevelsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayLevelsAttribute.java
new file mode 100644
index 0000000..20d5343
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayLevelsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:display-levels}.
+ *
+ */
+public class TextDisplayLevelsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "display-levels");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:display-levels}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDisplayLevelsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:display-levels}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:display-levels}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:display-levels} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayOutlineLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayOutlineLevelAttribute.java
new file mode 100644
index 0000000..815f0a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDisplayOutlineLevelAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:display-outline-level}.
+ *
+ */
+public class TextDisplayOutlineLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "display-outline-level");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:display-outline-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDisplayOutlineLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:display-outline-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:display-outline-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:display-outline-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDontBalanceTextColumnsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDontBalanceTextColumnsAttribute.java
new file mode 100644
index 0000000..070a94a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDontBalanceTextColumnsAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:dont-balance-text-columns}.
+ *
+ */
+public class TextDontBalanceTextColumnsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "dont-balance-text-columns");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:dont-balance-text-columns}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDontBalanceTextColumnsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:dont-balance-text-columns}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:dont-balance-text-columns}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:dont-balance-text-columns} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDurationAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDurationAttribute.java
new file mode 100644
index 0000000..6a4db0d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextDurationAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:duration}.
+ *
+ */
+public class TextDurationAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "duration");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:duration}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextDurationAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:duration}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:duration}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:duration} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextEditionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextEditionAttribute.java
new file mode 100644
index 0000000..bc5d026
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextEditionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:edition}.
+ *
+ */
+public class TextEditionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "edition");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:edition}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextEditionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:edition}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:edition}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:edition} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextEditorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextEditorAttribute.java
new file mode 100644
index 0000000..12beb0d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextEditorAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:editor}.
+ *
+ */
+public class TextEditorAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "editor");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:editor}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextEditorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:editor}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:editor}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:editor} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFilterNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFilterNameAttribute.java
new file mode 100644
index 0000000..5fc3a1a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFilterNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:filter-name}.
+ *
+ */
+public class TextFilterNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "filter-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:filter-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextFilterNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:filter-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:filter-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:filter-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFixedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFixedAttribute.java
new file mode 100644
index 0000000..e0ecc01
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFixedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:fixed}.
+ *
+ */
+public class TextFixedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "fixed");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:fixed}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextFixedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:fixed}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:fixed}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:fixed} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFootnotesPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFootnotesPositionAttribute.java
new file mode 100644
index 0000000..2d0af2b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFootnotesPositionAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:footnotes-position}.
+ *
+ */
+public class TextFootnotesPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "footnotes-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:footnotes-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextFootnotesPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:footnotes-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:footnotes-position}.
+	 */
+	public enum Value {
+		DOCUMENT("document"), PAGE("page"), SECTION("section"), TEXT("text") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:footnotes-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:footnotes-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFormulaAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFormulaAttribute.java
new file mode 100644
index 0000000..344b361
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextFormulaAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:formula}.
+ *
+ */
+public class TextFormulaAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "formula");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:formula}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextFormulaAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:formula}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:formula}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:formula} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextGlobalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextGlobalAttribute.java
new file mode 100644
index 0000000..8da1816
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextGlobalAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:global}.
+ *
+ */
+public class TextGlobalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "global");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:global}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextGlobalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:global}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:global}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:global} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextHowpublishedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextHowpublishedAttribute.java
new file mode 100644
index 0000000..1eed8fc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextHowpublishedAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:howpublished}.
+ *
+ */
+public class TextHowpublishedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "howpublished");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:howpublished}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextHowpublishedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:howpublished}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:howpublished}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:howpublished} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIdAttribute.java
new file mode 100644
index 0000000..8f1c4ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:id}.
+ *
+ */
+public class TextIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIdentifierAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIdentifierAttribute.java
new file mode 100644
index 0000000..ef893a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIdentifierAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:identifier}.
+ *
+ */
+public class TextIdentifierAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "identifier");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:identifier}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIdentifierAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:identifier}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:identifier}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:identifier} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIgnoreCaseAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIgnoreCaseAttribute.java
new file mode 100644
index 0000000..98c8deb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIgnoreCaseAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:ignore-case}.
+ *
+ */
+public class TextIgnoreCaseAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "ignore-case");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:ignore-case}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIgnoreCaseAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:ignore-case}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:ignore-case}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:ignore-case} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIncrementAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIncrementAttribute.java
new file mode 100644
index 0000000..843ac4a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIncrementAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:increment}.
+ *
+ */
+public class TextIncrementAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "increment");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:increment}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIncrementAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:increment}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:increment}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:increment} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIndexNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIndexNameAttribute.java
new file mode 100644
index 0000000..8b47a23
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIndexNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:index-name}.
+ *
+ */
+public class TextIndexNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:index-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:index-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:index-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:index-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIndexScopeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIndexScopeAttribute.java
new file mode 100644
index 0000000..bacb48b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIndexScopeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:index-scope}.
+ *
+ */
+public class TextIndexScopeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-scope");
+	public static final String DEFAULT_VALUE = "document";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:index-scope}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexScopeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:index-scope}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:index-scope}.
+	 */
+	public enum Value {
+		CHAPTER("chapter"), DOCUMENT("document") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:index-scope}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:index-scope} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextInstitutionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextInstitutionAttribute.java
new file mode 100644
index 0000000..7355223
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextInstitutionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:institution}.
+ *
+ */
+public class TextInstitutionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "institution");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:institution}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextInstitutionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:institution}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:institution}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:institution} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsHiddenAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsHiddenAttribute.java
new file mode 100644
index 0000000..47f5213
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsHiddenAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:is-hidden}.
+ *
+ */
+public class TextIsHiddenAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "is-hidden");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:is-hidden}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIsHiddenAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:is-hidden}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:is-hidden}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:is-hidden} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsListHeaderAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsListHeaderAttribute.java
new file mode 100644
index 0000000..c685308
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsListHeaderAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:is-list-header}.
+ *
+ */
+public class TextIsListHeaderAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "is-list-header");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:is-list-header}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIsListHeaderAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:is-list-header}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:is-list-header}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:is-list-header} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsbnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsbnAttribute.java
new file mode 100644
index 0000000..345353e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIsbnAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:isbn}.
+ *
+ */
+public class TextIsbnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "isbn");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:isbn}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIsbnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:isbn}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:isbn}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:isbn} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIssnAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIssnAttribute.java
new file mode 100644
index 0000000..474b6c1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextIssnAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:issn}.
+ *
+ */
+public class TextIssnAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "issn");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:issn}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextIssnAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:issn}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:issn}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:issn} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextJournalAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextJournalAttribute.java
new file mode 100644
index 0000000..ff70268
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextJournalAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:journal}.
+ *
+ */
+public class TextJournalAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "journal");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:journal}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextJournalAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:journal}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:journal}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:journal} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey1Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey1Attribute.java
new file mode 100644
index 0000000..b6a828c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey1Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:key1}.
+ *
+ */
+public class TextKey1Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "key1");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:key1}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextKey1Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:key1}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:key1}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:key1} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey1PhoneticAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey1PhoneticAttribute.java
new file mode 100644
index 0000000..11ebfec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey1PhoneticAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:key1-phonetic}.
+ *
+ */
+public class TextKey1PhoneticAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "key1-phonetic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:key1-phonetic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextKey1PhoneticAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:key1-phonetic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:key1-phonetic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:key1-phonetic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey2Attribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey2Attribute.java
new file mode 100644
index 0000000..eccff42
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey2Attribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:key2}.
+ *
+ */
+public class TextKey2Attribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "key2");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:key2}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextKey2Attribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:key2}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:key2}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:key2} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey2PhoneticAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey2PhoneticAttribute.java
new file mode 100644
index 0000000..7efc70e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKey2PhoneticAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:key2-phonetic}.
+ *
+ */
+public class TextKey2PhoneticAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "key2-phonetic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:key2-phonetic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextKey2PhoneticAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:key2-phonetic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:key2-phonetic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:key2-phonetic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKeyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKeyAttribute.java
new file mode 100644
index 0000000..8653fe5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKeyAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:key}.
+ *
+ */
+public class TextKeyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "key");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:key}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextKeyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:key}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:key}.
+	 */
+	public enum Value {
+		ADDRESS("address"), ANNOTE("annote"), AUTHOR("author"), BIBLIOGRAPHY_TYPE("bibliography-type"), BOOKTITLE("booktitle"), CHAPTER("chapter"), CUSTOM1("custom1"), CUSTOM2("custom2"), CUSTOM3("custom3"), CUSTOM4("custom4"), CUSTOM5("custom5"), EDITION("edition"), EDITOR("editor"), HOWPUBLISHED("howpublished"), IDENTIFIER("identifier"), INSTITUTION("institution"), ISBN("isbn"), ISSN("issn"), JOURNAL("journal"), MONTH("month"), NOTE("note"), NUMBER("number"), ORGANIZATIONS("organizations"), PAGES("pages"), PUBLISHER("publisher"), REPORT_TYPE("report-type"), SCHOOL("school"), SERIES("series"), TITLE("title"), URL("url"), VOLUME("volume"), YEAR("year") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:key}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:key} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKindAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKindAttribute.java
new file mode 100644
index 0000000..d5d9b03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextKindAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:kind}.
+ *
+ */
+public class TextKindAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "kind");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:kind}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextKindAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:kind}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:kind}.
+	 */
+	public enum Value {
+		GAP("gap"), UNIT("unit"), VALUE("value") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:kind}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:kind} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLabelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLabelAttribute.java
new file mode 100644
index 0000000..256e0e7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLabelAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:label}.
+ *
+ */
+public class TextLabelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "label");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:label}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextLabelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:label}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:label}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:label} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLabelFollowedByAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLabelFollowedByAttribute.java
new file mode 100644
index 0000000..caa8df8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLabelFollowedByAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:label-followed-by}.
+ *
+ */
+public class TextLabelFollowedByAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "label-followed-by");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:label-followed-by}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextLabelFollowedByAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:label-followed-by}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:label-followed-by}.
+	 */
+	public enum Value {
+		LISTTAB("listtab"), NOTHING("nothing"), SPACE("space") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:label-followed-by}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:label-followed-by} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLevelAttribute.java
new file mode 100644
index 0000000..16d0a39
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLevelAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:level}.
+ *
+ */
+public class TextLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "level");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLineBreakAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLineBreakAttribute.java
new file mode 100644
index 0000000..9aa9835
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLineBreakAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:line-break}.
+ *
+ */
+public class TextLineBreakAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "line-break");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:line-break}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextLineBreakAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:line-break}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:line-break}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:line-break} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLineNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLineNumberAttribute.java
new file mode 100644
index 0000000..d49be52
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextLineNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:line-number}.
+ *
+ */
+public class TextLineNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "line-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:line-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextLineNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:line-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:line-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:line-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListIdAttribute.java
new file mode 100644
index 0000000..2f35c4f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:list-id}.
+ *
+ */
+public class TextListIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:list-id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextListIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:list-id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:list-id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:list-id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListLevelPositionAndSpaceModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListLevelPositionAndSpaceModeAttribute.java
new file mode 100644
index 0000000..eef7ac2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListLevelPositionAndSpaceModeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:list-level-position-and-space-mode}.
+ *
+ */
+public class TextListLevelPositionAndSpaceModeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-level-position-and-space-mode");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:list-level-position-and-space-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextListLevelPositionAndSpaceModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:list-level-position-and-space-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:list-level-position-and-space-mode}.
+	 */
+	public enum Value {
+		LABEL_ALIGNMENT("label-alignment"), LABEL_WIDTH_AND_POSITION("label-width-and-position") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:list-level-position-and-space-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:list-level-position-and-space-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListTabStopPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListTabStopPositionAttribute.java
new file mode 100644
index 0000000..fe12c7c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextListTabStopPositionAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:list-tab-stop-position}.
+ *
+ */
+public class TextListTabStopPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-tab-stop-position");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:list-tab-stop-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextListTabStopPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:list-tab-stop-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:list-tab-stop-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:list-tab-stop-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMainEntryAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMainEntryAttribute.java
new file mode 100644
index 0000000..e9a4e07
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMainEntryAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:main-entry}.
+ *
+ */
+public class TextMainEntryAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "main-entry");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:main-entry}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextMainEntryAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:main-entry}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:main-entry}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:main-entry} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMainEntryStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMainEntryStyleNameAttribute.java
new file mode 100644
index 0000000..2bbd82b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMainEntryStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:main-entry-style-name}.
+ *
+ */
+public class TextMainEntryStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "main-entry-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:main-entry-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextMainEntryStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:main-entry-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:main-entry-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:main-entry-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMasterPageNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMasterPageNameAttribute.java
new file mode 100644
index 0000000..7414990
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMasterPageNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:master-page-name}.
+ *
+ */
+public class TextMasterPageNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "master-page-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:master-page-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextMasterPageNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:master-page-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:master-page-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:master-page-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMinLabelDistanceAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMinLabelDistanceAttribute.java
new file mode 100644
index 0000000..2882ddf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMinLabelDistanceAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:min-label-distance}.
+ *
+ */
+public class TextMinLabelDistanceAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "min-label-distance");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:min-label-distance}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextMinLabelDistanceAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:min-label-distance}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:min-label-distance}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:min-label-distance} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMinLabelWidthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMinLabelWidthAttribute.java
new file mode 100644
index 0000000..942b4e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMinLabelWidthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:min-label-width}.
+ *
+ */
+public class TextMinLabelWidthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "min-label-width");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:min-label-width}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextMinLabelWidthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:min-label-width}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:min-label-width}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:min-label-width} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMonthAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMonthAttribute.java
new file mode 100644
index 0000000..6c254a4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextMonthAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:month}.
+ *
+ */
+public class TextMonthAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "month");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:month}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextMonthAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:month}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:month}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:month} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNameAttribute.java
new file mode 100644
index 0000000..eff20ba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:name}.
+ *
+ */
+public class TextNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNoteAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNoteAttribute.java
new file mode 100644
index 0000000..efd3c7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNoteAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:note}.
+ *
+ */
+public class TextNoteAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:note}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:note}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:note}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:note} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNoteClassAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNoteClassAttribute.java
new file mode 100644
index 0000000..bfbfc8b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNoteClassAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:note-class}.
+ *
+ */
+public class TextNoteClassAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note-class");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:note-class}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteClassAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:note-class}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:note-class}.
+	 */
+	public enum Value {
+		ENDNOTE("endnote"), FOOTNOTE("footnote") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:note-class}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:note-class} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberAttribute.java
new file mode 100644
index 0000000..312180a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:number}.
+ *
+ */
+public class TextNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberLinesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberLinesAttribute.java
new file mode 100644
index 0000000..7d02df1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberLinesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:number-lines}.
+ *
+ */
+public class TextNumberLinesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "number-lines");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:number-lines}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNumberLinesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:number-lines}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:number-lines}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:number-lines} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberPositionAttribute.java
new file mode 100644
index 0000000..d29b308
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberPositionAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:number-position}.
+ *
+ */
+public class TextNumberPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "number-position");
+	public static final String DEFAULT_VALUE = "left";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:number-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNumberPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:number-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:number-position}.
+	 */
+	public enum Value {
+		INNER("inner"), LEFT("left"), OUTER("outer"), RIGHT("right") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:number-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:number-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberedEntriesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberedEntriesAttribute.java
new file mode 100644
index 0000000..f7fce0e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextNumberedEntriesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:numbered-entries}.
+ *
+ */
+public class TextNumberedEntriesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "numbered-entries");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:numbered-entries}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextNumberedEntriesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:numbered-entries}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:numbered-entries}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:numbered-entries} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOffsetAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOffsetAttribute.java
new file mode 100644
index 0000000..29fd046
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOffsetAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:offset}.
+ *
+ */
+public class TextOffsetAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "offset");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:offset}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextOffsetAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:offset}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:offset}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:offset} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOrganizationsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOrganizationsAttribute.java
new file mode 100644
index 0000000..af28a32
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOrganizationsAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:organizations}.
+ *
+ */
+public class TextOrganizationsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "organizations");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:organizations}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextOrganizationsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:organizations}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:organizations}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:organizations} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOutlineLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOutlineLevelAttribute.java
new file mode 100644
index 0000000..4d3b0fe
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextOutlineLevelAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:outline-level}.
+ *
+ */
+public class TextOutlineLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "outline-level");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:outline-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextOutlineLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:outline-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:outline-level}.
+	 */
+	public enum Value {
+		_1("1"), _2("2"), _3("3"), SEPARATOR("separator") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:outline-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:outline-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPageAdjustAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPageAdjustAttribute.java
new file mode 100644
index 0000000..9874dbf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPageAdjustAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:page-adjust}.
+ *
+ */
+public class TextPageAdjustAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-adjust");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:page-adjust}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextPageAdjustAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:page-adjust}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:page-adjust}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:page-adjust} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPagesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPagesAttribute.java
new file mode 100644
index 0000000..f9165f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPagesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:pages}.
+ *
+ */
+public class TextPagesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "pages");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:pages}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextPagesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:pages}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:pages}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:pages} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPlaceholderTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPlaceholderTypeAttribute.java
new file mode 100644
index 0000000..0d16f91
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPlaceholderTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:placeholder-type}.
+ *
+ */
+public class TextPlaceholderTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "placeholder-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:placeholder-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextPlaceholderTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:placeholder-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:placeholder-type}.
+	 */
+	public enum Value {
+		IMAGE("image"), OBJECT("object"), TABLE("table"), TEXT("text"), TEXT_BOX("text-box") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:placeholder-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:placeholder-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPrefixAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPrefixAttribute.java
new file mode 100644
index 0000000..5b2369a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPrefixAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:prefix}.
+ *
+ */
+public class TextPrefixAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "prefix");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:prefix}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextPrefixAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:prefix}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:prefix}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:prefix} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectedAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectedAttribute.java
new file mode 100644
index 0000000..e1794ac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectedAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:protected}.
+ *
+ */
+public class TextProtectedAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "protected");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:protected}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextProtectedAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:protected}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:protected}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:protected} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectionKeyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectionKeyAttribute.java
new file mode 100644
index 0000000..09e4033
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectionKeyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:protection-key}.
+ *
+ */
+public class TextProtectionKeyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "protection-key");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:protection-key}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextProtectionKeyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:protection-key}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:protection-key}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:protection-key} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectionKeyDigestAlgorithmAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectionKeyDigestAlgorithmAttribute.java
new file mode 100644
index 0000000..fdfa9b5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextProtectionKeyDigestAlgorithmAttribute.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:protection-key-digest-algorithm}.
+ *
+ */
+public class TextProtectionKeyDigestAlgorithmAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+	public static final String DEFAULT_VALUE = "http://www.w3.org/2000/09/xmldsig#sha1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:protection-key-digest-algorithm}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextProtectionKeyDigestAlgorithmAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:protection-key-digest-algorithm}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:protection-key-digest-algorithm}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:protection-key-digest-algorithm} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPublisherAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPublisherAttribute.java
new file mode 100644
index 0000000..f1ef3be
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextPublisherAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:publisher}.
+ *
+ */
+public class TextPublisherAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "publisher");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:publisher}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextPublisherAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:publisher}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:publisher}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:publisher} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRefNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRefNameAttribute.java
new file mode 100644
index 0000000..b9216f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRefNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:ref-name}.
+ *
+ */
+public class TextRefNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "ref-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:ref-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextRefNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:ref-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:ref-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:ref-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextReferenceFormatAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextReferenceFormatAttribute.java
new file mode 100644
index 0000000..fd95f05
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextReferenceFormatAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:reference-format}.
+ *
+ */
+public class TextReferenceFormatAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "reference-format");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:reference-format}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextReferenceFormatAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:reference-format}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:reference-format}.
+	 */
+	public enum Value {
+		CAPTION("caption"), CATEGORY_AND_VALUE("category-and-value"), CHAPTER("chapter"), DIRECTION("direction"), NUMBER("number"), NUMBER_ALL_SUPERIOR("number-all-superior"), NUMBER_NO_SUPERIOR("number-no-superior"), PAGE("page"), TEXT("text"), VALUE("value") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:reference-format}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:reference-format} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRelativeTabStopPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRelativeTabStopPositionAttribute.java
new file mode 100644
index 0000000..3058b00
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRelativeTabStopPositionAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:relative-tab-stop-position}.
+ *
+ */
+public class TextRelativeTabStopPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:relative-tab-stop-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextRelativeTabStopPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:relative-tab-stop-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:relative-tab-stop-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:relative-tab-stop-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextReportTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextReportTypeAttribute.java
new file mode 100644
index 0000000..5ec3bc2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextReportTypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:report-type}.
+ *
+ */
+public class TextReportTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "report-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:report-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextReportTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:report-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:report-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:report-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRestartNumberingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRestartNumberingAttribute.java
new file mode 100644
index 0000000..a8b336e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRestartNumberingAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:restart-numbering}.
+ *
+ */
+public class TextRestartNumberingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "restart-numbering");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:restart-numbering}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextRestartNumberingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:restart-numbering}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:restart-numbering}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:restart-numbering} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRestartOnPageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRestartOnPageAttribute.java
new file mode 100644
index 0000000..ca0d3ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRestartOnPageAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:restart-on-page}.
+ *
+ */
+public class TextRestartOnPageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "restart-on-page");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:restart-on-page}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextRestartOnPageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:restart-on-page}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:restart-on-page}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:restart-on-page} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRowNumberAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRowNumberAttribute.java
new file mode 100644
index 0000000..23f5110
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextRowNumberAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:row-number}.
+ *
+ */
+public class TextRowNumberAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "row-number");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:row-number}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextRowNumberAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:row-number}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:row-number}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:row-number} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSchoolAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSchoolAttribute.java
new file mode 100644
index 0000000..b32121f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSchoolAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:school}.
+ *
+ */
+public class TextSchoolAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "school");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:school}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSchoolAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:school}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:school}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:school} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSectionNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSectionNameAttribute.java
new file mode 100644
index 0000000..e57a003
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSectionNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:section-name}.
+ *
+ */
+public class TextSectionNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "section-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:section-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSectionNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:section-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:section-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:section-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSelectPageAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSelectPageAttribute.java
new file mode 100644
index 0000000..8795fa8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSelectPageAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:select-page}.
+ *
+ */
+public class TextSelectPageAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "select-page");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:select-page}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSelectPageAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:select-page}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:select-page}.
+	 */
+	public enum Value {
+		CURRENT("current"), NEXT("next"), PREVIOUS("previous") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:select-page}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:select-page} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSeparationCharacterAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSeparationCharacterAttribute.java
new file mode 100644
index 0000000..6b59435
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSeparationCharacterAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:separation-character}.
+ *
+ */
+public class TextSeparationCharacterAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "separation-character");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:separation-character}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSeparationCharacterAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:separation-character}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:separation-character}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:separation-character} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSeriesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSeriesAttribute.java
new file mode 100644
index 0000000..764f8f5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSeriesAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:series}.
+ *
+ */
+public class TextSeriesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "series");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:series}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSeriesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:series}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:series}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:series} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortAlgorithmAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortAlgorithmAttribute.java
new file mode 100644
index 0000000..5c5f566
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortAlgorithmAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:sort-algorithm}.
+ *
+ */
+public class TextSortAlgorithmAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sort-algorithm");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:sort-algorithm}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSortAlgorithmAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:sort-algorithm}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:sort-algorithm}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:sort-algorithm} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortAscendingAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortAscendingAttribute.java
new file mode 100644
index 0000000..6b52950
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortAscendingAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:sort-ascending}.
+ *
+ */
+public class TextSortAscendingAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sort-ascending");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:sort-ascending}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSortAscendingAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:sort-ascending}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:sort-ascending}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:sort-ascending} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortByPositionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortByPositionAttribute.java
new file mode 100644
index 0000000..0ee074a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSortByPositionAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:sort-by-position}.
+ *
+ */
+public class TextSortByPositionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sort-by-position");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:sort-by-position}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSortByPositionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:sort-by-position}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:sort-by-position}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:sort-by-position} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSpaceBeforeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSpaceBeforeAttribute.java
new file mode 100644
index 0000000..4558711
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSpaceBeforeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:space-before}.
+ *
+ */
+public class TextSpaceBeforeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "space-before");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:space-before}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSpaceBeforeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:space-before}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:space-before}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:space-before} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStartNumberingAtAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStartNumberingAtAttribute.java
new file mode 100644
index 0000000..25c33ee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStartNumberingAtAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:start-numbering-at}.
+ *
+ */
+public class TextStartNumberingAtAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "start-numbering-at");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:start-numbering-at}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStartNumberingAtAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:start-numbering-at}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:start-numbering-at}.
+	 */
+	public enum Value {
+		CHAPTER("chapter"), DOCUMENT("document"), PAGE("page") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:start-numbering-at}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:start-numbering-at} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStartValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStartValueAttribute.java
new file mode 100644
index 0000000..432e373
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStartValueAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:start-value}.
+ *
+ */
+public class TextStartValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "start-value");
+	public static final String DEFAULT_VALUE = "1";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:start-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStartValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:start-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:start-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:start-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueAttribute.java
new file mode 100644
index 0000000..eaa2daa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:string-value}.
+ *
+ */
+public class TextStringValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "string-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:string-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStringValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:string-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:string-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:string-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueIfFalseAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueIfFalseAttribute.java
new file mode 100644
index 0000000..0a141d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueIfFalseAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:string-value-if-false}.
+ *
+ */
+public class TextStringValueIfFalseAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "string-value-if-false");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:string-value-if-false}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStringValueIfFalseAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:string-value-if-false}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:string-value-if-false}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:string-value-if-false} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueIfTrueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueIfTrueAttribute.java
new file mode 100644
index 0000000..9824cce
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValueIfTrueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:string-value-if-true}.
+ *
+ */
+public class TextStringValueIfTrueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "string-value-if-true");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:string-value-if-true}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStringValueIfTrueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:string-value-if-true}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:string-value-if-true}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:string-value-if-true} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValuePhoneticAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValuePhoneticAttribute.java
new file mode 100644
index 0000000..61e1267
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStringValuePhoneticAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:string-value-phonetic}.
+ *
+ */
+public class TextStringValuePhoneticAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "string-value-phonetic");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:string-value-phonetic}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStringValuePhoneticAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:string-value-phonetic}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:string-value-phonetic}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:string-value-phonetic} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStyleNameAttribute.java
new file mode 100644
index 0000000..01cea91
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:style-name}.
+ *
+ */
+public class TextStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStyleOverrideAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStyleOverrideAttribute.java
new file mode 100644
index 0000000..6a96d9e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextStyleOverrideAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:style-override}.
+ *
+ */
+public class TextStyleOverrideAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "style-override");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:style-override}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextStyleOverrideAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:style-override}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:style-override}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:style-override} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSuffixAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSuffixAttribute.java
new file mode 100644
index 0000000..33656d3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextSuffixAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:suffix}.
+ *
+ */
+public class TextSuffixAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "suffix");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:suffix}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextSuffixAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:suffix}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:suffix}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:suffix} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTabRefAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTabRefAttribute.java
new file mode 100644
index 0000000..24a0f3a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTabRefAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:tab-ref}.
+ *
+ */
+public class TextTabRefAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "tab-ref");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:tab-ref}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTabRefAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:tab-ref}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:tab-ref}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:tab-ref} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTableNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTableNameAttribute.java
new file mode 100644
index 0000000..291580b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTableNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:table-name}.
+ *
+ */
+public class TextTableNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:table-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTableNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:table-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:table-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:table-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTableTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTableTypeAttribute.java
new file mode 100644
index 0000000..8028e8b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTableTypeAttribute.java
@@ -0,0 +1,139 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:table-type}.
+ *
+ */
+public class TextTableTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-type");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:table-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTableTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:table-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute text:table-type}.
+	 */
+	public enum Value {
+		COMMAND("command"), QUERY("query"), TABLE("table") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:table-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:table-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTimeAdjustAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTimeAdjustAttribute.java
new file mode 100644
index 0000000..d83055b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTimeAdjustAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:time-adjust}.
+ *
+ */
+public class TextTimeAdjustAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "time-adjust");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:time-adjust}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTimeAdjustAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:time-adjust}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:time-adjust}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:time-adjust} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTimeValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTimeValueAttribute.java
new file mode 100644
index 0000000..b8d5ee8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTimeValueAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:time-value}.
+ *
+ */
+public class TextTimeValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "time-value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:time-value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTimeValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:time-value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:time-value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:time-value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTitleAttribute.java
new file mode 100644
index 0000000..226f3ff
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:title}.
+ *
+ */
+public class TextTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTrackChangesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTrackChangesAttribute.java
new file mode 100644
index 0000000..abf399a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextTrackChangesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:track-changes}.
+ *
+ */
+public class TextTrackChangesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "track-changes");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:track-changes}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextTrackChangesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:track-changes}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:track-changes}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:track-changes} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUrlAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUrlAttribute.java
new file mode 100644
index 0000000..55fa52c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUrlAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:url}.
+ *
+ */
+public class TextUrlAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "url");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:url}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUrlAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:url}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:url}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:url} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseCaptionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseCaptionAttribute.java
new file mode 100644
index 0000000..586c970
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseCaptionAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-caption}.
+ *
+ */
+public class TextUseCaptionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-caption");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-caption}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseCaptionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-caption}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-caption}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-caption} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseChartObjectsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseChartObjectsAttribute.java
new file mode 100644
index 0000000..cbc9f95
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseChartObjectsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-chart-objects}.
+ *
+ */
+public class TextUseChartObjectsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-chart-objects");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-chart-objects}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseChartObjectsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-chart-objects}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-chart-objects}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-chart-objects} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseDrawObjectsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseDrawObjectsAttribute.java
new file mode 100644
index 0000000..52ee900
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseDrawObjectsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-draw-objects}.
+ *
+ */
+public class TextUseDrawObjectsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-draw-objects");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-draw-objects}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseDrawObjectsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-draw-objects}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-draw-objects}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-draw-objects} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseFloatingFramesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseFloatingFramesAttribute.java
new file mode 100644
index 0000000..912aaf7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseFloatingFramesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-floating-frames}.
+ *
+ */
+public class TextUseFloatingFramesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-floating-frames");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-floating-frames}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseFloatingFramesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-floating-frames}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-floating-frames}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-floating-frames} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseGraphicsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseGraphicsAttribute.java
new file mode 100644
index 0000000..7c74b7e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseGraphicsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-graphics}.
+ *
+ */
+public class TextUseGraphicsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-graphics");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-graphics}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseGraphicsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-graphics}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-graphics}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-graphics} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseIndexMarksAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseIndexMarksAttribute.java
new file mode 100644
index 0000000..679cbe3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseIndexMarksAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-index-marks}.
+ *
+ */
+public class TextUseIndexMarksAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-index-marks");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-index-marks}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseIndexMarksAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-index-marks}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-index-marks}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-index-marks} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseIndexSourceStylesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseIndexSourceStylesAttribute.java
new file mode 100644
index 0000000..d029183
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseIndexSourceStylesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-index-source-styles}.
+ *
+ */
+public class TextUseIndexSourceStylesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-index-source-styles");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-index-source-styles}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseIndexSourceStylesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-index-source-styles}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-index-source-styles}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-index-source-styles} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseKeysAsEntriesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseKeysAsEntriesAttribute.java
new file mode 100644
index 0000000..428b30c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseKeysAsEntriesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-keys-as-entries}.
+ *
+ */
+public class TextUseKeysAsEntriesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-keys-as-entries");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-keys-as-entries}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseKeysAsEntriesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-keys-as-entries}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-keys-as-entries}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-keys-as-entries} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseMathObjectsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseMathObjectsAttribute.java
new file mode 100644
index 0000000..e7bc605
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseMathObjectsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-math-objects}.
+ *
+ */
+public class TextUseMathObjectsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-math-objects");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-math-objects}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseMathObjectsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-math-objects}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-math-objects}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-math-objects} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseObjectsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseObjectsAttribute.java
new file mode 100644
index 0000000..fdf3ebf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseObjectsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-objects}.
+ *
+ */
+public class TextUseObjectsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-objects");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-objects}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseObjectsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-objects}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-objects}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-objects} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseOtherObjectsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseOtherObjectsAttribute.java
new file mode 100644
index 0000000..23a1d4e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseOtherObjectsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-other-objects}.
+ *
+ */
+public class TextUseOtherObjectsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-other-objects");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-other-objects}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseOtherObjectsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-other-objects}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-other-objects}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-other-objects} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseOutlineLevelAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseOutlineLevelAttribute.java
new file mode 100644
index 0000000..e11841b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseOutlineLevelAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-outline-level}.
+ *
+ */
+public class TextUseOutlineLevelAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-outline-level");
+	public static final String DEFAULT_VALUE = "true";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-outline-level}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseOutlineLevelAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-outline-level}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-outline-level}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-outline-level} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseSoftPageBreaksAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseSoftPageBreaksAttribute.java
new file mode 100644
index 0000000..daad01b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseSoftPageBreaksAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-soft-page-breaks}.
+ *
+ */
+public class TextUseSoftPageBreaksAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-soft-page-breaks");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-soft-page-breaks}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseSoftPageBreaksAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-soft-page-breaks}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-soft-page-breaks}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-soft-page-breaks} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseSpreadsheetObjectsAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseSpreadsheetObjectsAttribute.java
new file mode 100644
index 0000000..6dab339
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseSpreadsheetObjectsAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-spreadsheet-objects}.
+ *
+ */
+public class TextUseSpreadsheetObjectsAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-spreadsheet-objects");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-spreadsheet-objects}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseSpreadsheetObjectsAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-spreadsheet-objects}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-spreadsheet-objects}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-spreadsheet-objects} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseTablesAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseTablesAttribute.java
new file mode 100644
index 0000000..9560655
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextUseTablesAttribute.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:use-tables}.
+ *
+ */
+public class TextUseTablesAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "use-tables");
+	public static final String DEFAULT_VALUE = "false";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:use-tables}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextUseTablesAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:use-tables}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>boolean</code> value of the attribute.
+	 */
+	public void setBooleanValue(boolean value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>boolean</code> value of the attribute
+	 */
+	public boolean booleanValue() {
+		String val = super.getValue();
+		try {
+			return Boolean.parseBoolean(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:use-tables}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:use-tables} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextValueAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextValueAttribute.java
new file mode 100644
index 0000000..f8352da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextValueAttribute.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:value}.
+ *
+ */
+public class TextValueAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "value");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:value}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextValueAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:value}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:value}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:value} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextVisitedStyleNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextVisitedStyleNameAttribute.java
new file mode 100644
index 0000000..01158a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextVisitedStyleNameAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:visited-style-name}.
+ *
+ */
+public class TextVisitedStyleNameAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "visited-style-name");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:visited-style-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextVisitedStyleNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:visited-style-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:visited-style-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:visited-style-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextVolumeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextVolumeAttribute.java
new file mode 100644
index 0000000..bae0bd8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextVolumeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:volume}.
+ *
+ */
+public class TextVolumeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "volume");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:volume}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextVolumeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:volume}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:volume}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:volume} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextYearAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextYearAttribute.java
new file mode 100644
index 0000000..d5e596f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/text/TextYearAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.text;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute text:year}.
+ *
+ */
+public class TextYearAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "year");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute text:year}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public TextYearAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute text:year}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute text:year}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute text:year} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xforms/XformsBindAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xforms/XformsBindAttribute.java
new file mode 100644
index 0000000..ce57029
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xforms/XformsBindAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xforms;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xforms:bind}.
+ *
+ */
+public class XformsBindAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XFORMS, "bind");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xforms:bind}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XformsBindAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xforms:bind}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xforms:bind}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xforms:bind} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlAboutAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlAboutAttribute.java
new file mode 100644
index 0000000..80222a4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlAboutAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xhtml;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xhtml:about}.
+ *
+ */
+public class XhtmlAboutAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XHTML, "about");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xhtml:about}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XhtmlAboutAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xhtml:about}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xhtml:about}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xhtml:about} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlContentAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlContentAttribute.java
new file mode 100644
index 0000000..19fef05
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlContentAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xhtml;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xhtml:content}.
+ *
+ */
+public class XhtmlContentAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XHTML, "content");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xhtml:content}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XhtmlContentAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xhtml:content}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xhtml:content}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xhtml:content} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlDatatypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlDatatypeAttribute.java
new file mode 100644
index 0000000..7826b3f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlDatatypeAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xhtml;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xhtml:datatype}.
+ *
+ */
+public class XhtmlDatatypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XHTML, "datatype");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xhtml:datatype}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XhtmlDatatypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xhtml:datatype}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xhtml:datatype}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xhtml:datatype} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlPropertyAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlPropertyAttribute.java
new file mode 100644
index 0000000..8a918ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xhtml/XhtmlPropertyAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xhtml;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xhtml:property}.
+ *
+ */
+public class XhtmlPropertyAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XHTML, "property");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xhtml:property}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XhtmlPropertyAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xhtml:property}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xhtml:property}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xhtml:property} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkActuateAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkActuateAttribute.java
new file mode 100644
index 0000000..7c50a42
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkActuateAttribute.java
@@ -0,0 +1,234 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xlink;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.db.DbConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAppletElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFloatingFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectOleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPluginElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaAutoReloadElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaTemplateElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationEventListenerElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationSoundElement;
+import org.odftoolkit.odfdom.dom.element.script.ScriptEventListenerElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleBackgroundImageElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDefinitionSrcElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgFontFaceUriElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCellRangeSourceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleImageElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xlink:actuate}.
+ *
+ */
+public class XlinkActuateAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XLINK, "actuate");
+	public static final String DEFAULT_VALUE_ONLOAD = Value.ONLOAD.toString();
+	public static final String DEFAULT_VALUE_ONREQUEST = Value.ONREQUEST.toString();
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xlink:actuate}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XlinkActuateAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xlink:actuate}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute xlink:actuate}.
+	 */
+	public enum Value {
+		ONLOAD("onLoad"), ONREQUEST("onRequest") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xlink:actuate}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof DbConnectionResourceElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof DrawAElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof DrawAppletElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof DrawFillImageElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof DrawFloatingFrameElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof DrawImageElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof DrawObjectElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof DrawObjectOleElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof DrawPluginElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof FormFormElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof MetaAutoReloadElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof MetaTemplateElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof PresentationEventListenerElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof PresentationSoundElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof ScriptEventListenerElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof StyleBackgroundImageElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+			if (parentElement instanceof SvgDefinitionSrcElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof SvgFontFaceUriElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof TableCellRangeSourceElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof TableTableSourceElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof TextAElement) {
+				defaultValue = DEFAULT_VALUE_ONREQUEST;
+			}
+			if (parentElement instanceof TextListLevelStyleImageElement) {
+				defaultValue = DEFAULT_VALUE_ONLOAD;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xlink:actuate} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkHrefAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkHrefAttribute.java
new file mode 100644
index 0000000..0764737
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkHrefAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xlink;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xlink:href}.
+ *
+ */
+public class XlinkHrefAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XLINK, "href");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xlink:href}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XlinkHrefAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xlink:href}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xlink:href}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xlink:href} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkShowAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkShowAttribute.java
new file mode 100644
index 0000000..a63c555
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkShowAttribute.java
@@ -0,0 +1,199 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xlink;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+import org.odftoolkit.odfdom.dom.element.db.DbConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAppletElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFloatingFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectOleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPluginElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaAutoReloadElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationEventListenerElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleBackgroundImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionSourceElement;
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xlink:show}.
+ *
+ */
+public class XlinkShowAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XLINK, "show");
+	public static final String DEFAULT_VALUE_REPLACE = Value.REPLACE.toString();
+	public static final String DEFAULT_VALUE_NONE = Value.NONE.toString();
+	public static final String DEFAULT_VALUE_EMBED = Value.EMBED.toString();
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xlink:show}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XlinkShowAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xlink:show}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute xlink:show}.
+	 */
+	public enum Value {
+		EMBED("embed"), NEW("new"), NONE("none"), REPLACE("replace") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xlink:show}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			if (parentElement instanceof DbConnectionResourceElement) {
+				defaultValue = DEFAULT_VALUE_NONE;
+			}
+			if (parentElement instanceof DrawAppletElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof DrawFillImageElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof DrawFloatingFrameElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof DrawImageElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof DrawObjectElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof DrawObjectOleElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof DrawPluginElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof MetaAutoReloadElement) {
+				defaultValue = DEFAULT_VALUE_REPLACE;
+			}
+			if (parentElement instanceof PresentationEventListenerElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof StyleBackgroundImageElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof TextListLevelStyleImageElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+			if (parentElement instanceof TextSectionSourceElement) {
+				defaultValue = DEFAULT_VALUE_EMBED;
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xlink:show} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkTitleAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkTitleAttribute.java
new file mode 100644
index 0000000..ad112f5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkTitleAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xlink;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xlink:title}.
+ *
+ */
+public class XlinkTitleAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XLINK, "title");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xlink:title}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XlinkTitleAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xlink:title}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xlink:title}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xlink:title} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkTypeAttribute.java
new file mode 100644
index 0000000..8af713c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xlink/XlinkTypeAttribute.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xlink;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xlink:type}.
+ *
+ */
+public class XlinkTypeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XLINK, "type");
+	public static final String DEFAULT_VALUE = "simple";
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xlink:type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XlinkTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xlink:type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute xlink:type}.
+	 */
+	public enum Value {
+		SIMPLE("simple") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xlink:type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		OdfElement parentElement = (OdfElement)getOwnerElement();
+		String defaultValue = null;
+		if (parentElement != null) {
+			defaultValue=DEFAULT_VALUE;
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xlink:type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return getOwnerElement() == null ? false : true;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xml/XmlIdAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xml/XmlIdAttribute.java
new file mode 100644
index 0000000..2a601a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/attribute/xml/XmlIdAttribute.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.attribute.xml;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute xml:id}.
+ *
+ */
+public class XmlIdAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfDocumentNamespace.XML, "id");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute xml:id}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public XmlIdAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute xml:id}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute xml:id}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute xml:id} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return true;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStylableElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStylableElement.java
new file mode 100644
index 0000000..fc2c4c6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStylableElement.java
@@ -0,0 +1,448 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.element;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.OdfStylePropertySet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.type.StyleNameRef;
+import org.w3c.dom.DOMException;
+
+// ToDo: change modifier public to package after refactoring
+abstract public class OdfStylableElement extends OdfElement implements
+		OdfStylePropertySet {
+
+	private static final long serialVersionUID = -7828513537641758879L;
+	// ToDo: Overall StyleRefactoring: DOM Layer reaches to upper layer here...
+	private OdfStyle mAutomaticStyle;
+	protected OdfStyleFamily mFamily;
+	protected OdfName mStyleNameAttrib;
+	private OdfSchemaDocument mOdfSchemaDocument;
+
+	/**
+	 * Creates a new instance of OdfElementImpl
+	 * 
+	 * @param ownerDocument
+	 * @param name
+	 * @param family
+	 * @param styleNameAttrib
+	 * @throws DOMException
+	 */
+	public OdfStylableElement(OdfFileDom ownerDocument, OdfName name,
+			OdfStyleFamily family, OdfName styleNameAttrib) throws DOMException {
+		super(ownerDocument, name.getUri(), name.getQName());
+		mFamily = family;
+		mStyleNameAttrib = styleNameAttrib;
+		mOdfSchemaDocument = (OdfSchemaDocument) ownerDocument.getDocument();
+	}
+
+	/**
+	 * Retrieve or create uniqiue ODF AutomaticStyle
+	 * 
+	 * @return The <code>StyleStyleElement</code> element
+	 */
+	public StyleStyleElement getOrCreateUnqiueAutomaticStyle() {
+		if ((mAutomaticStyle == null)
+				|| (mAutomaticStyle.getStyleUserCount() > 1)) {
+			// we need a new automatic style
+			OdfOfficeAutomaticStyles automatic_styles = getAutomaticStyles();
+			if (automatic_styles != null) {
+				StyleNameRef sParentStyleName = null;
+				if (mAutomaticStyle == null) {
+					mAutomaticStyle = automatic_styles.newStyle(getStyleFamily());
+					sParentStyleName = new StyleNameRef(getStyleName());
+				} else {
+					String nameAttr = mAutomaticStyle.getStyleParentStyleNameAttribute();
+					sParentStyleName = new StyleNameRef(nameAttr == null ? "" : nameAttr);
+					mAutomaticStyle.removeStyleUser(this);
+					mAutomaticStyle = automatic_styles.makeStyleUnique(mAutomaticStyle);
+				}
+
+				mAutomaticStyle.addStyleUser(this);
+
+				if ((sParentStyleName != null)
+						&& (sParentStyleName.toString().length() != 0)) {
+					mAutomaticStyle.setStyleParentStyleNameAttribute(sParentStyleName.toString());
+				}
+				setStyleName(mAutomaticStyle.getStyleNameAttribute());
+			}
+		}
+		return mAutomaticStyle;
+	}
+
+	/**
+	 * Retrieve ODF OfficeAutomaticStyles
+	 * 
+	 * @return the <code>OdfOfficeAutomaticStyles</code> element that contains
+	 *         the automatic style for this element, or null if not available.
+	 */
+	public OdfOfficeAutomaticStyles getAutomaticStyles() {
+		OdfFileDom fileDom = (OdfFileDom) this.ownerDocument;
+		if (fileDom != null) {
+			if(fileDom instanceof OdfContentDom){
+				return ((OdfContentDom) fileDom).getAutomaticStyles();
+			}else if(fileDom instanceof OdfStylesDom){
+				return ((OdfStylesDom) fileDom).getAutomaticStyles();
+			}else
+			return null;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Set style attribute value with uri and name
+	 * 
+	 * @param uri
+	 *            The namespace uri
+	 * @param qname
+	 *            The qualified name of the attribute
+	 * @param value
+	 *            The attribute value
+	 */
+	@Override
+	public void setAttributeNS(String uri, String qname, String value) {
+		super.setAttributeNS(uri, qname, value);
+
+		// check if style has changed
+		if (mStyleNameAttrib.equals(uri, qname)) {
+			OdfStyle autoStyle = null;
+
+			// optimization: check if we already know this automatic style
+			if ((mAutomaticStyle != null)
+					&& (mAutomaticStyle.getStyleNameAttribute().equals(value))) {
+				// nothing todo
+			} else {
+				// register new automatic style
+				OdfOfficeAutomaticStyles automatic_styles = getAutomaticStyles();
+				if (automatic_styles != null) {
+					autoStyle = automatic_styles.getStyle(value,
+							getStyleFamily());
+				}
+
+				if (mAutomaticStyle != null) {
+					mAutomaticStyle.removeStyleUser(this);
+				}
+
+				mAutomaticStyle = autoStyle;
+
+				if (mAutomaticStyle != null) {
+					mAutomaticStyle.addStyleUser(this);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Retrieve style name
+	 * 
+	 * @return the style name
+	 */
+	public String getStyleName() {
+		return getAttributeNS(mStyleNameAttrib.getUri(), mStyleNameAttrib.getLocalName());
+	}
+
+	/**
+	 * Set style name
+	 * 
+	 * @param name
+	 *            The style name
+	 */
+	public void setStyleName(String name) {
+		setAttributeNS(mStyleNameAttrib.getUri(), mStyleNameAttrib.getQName(),
+				name);
+	}
+
+	/**
+	 * Retrieve ODF AutomaticStyle
+	 * 
+	 * @return the <code>OdfStyle</code> element
+	 */
+	public OdfStyle getAutomaticStyle() {
+		return mAutomaticStyle;
+	}
+
+	/**
+	 * Judge if there is an automatic style
+	 * 
+	 * @return true if there is an automatic style
+	 */
+	public boolean hasAutomaticStyle() {
+		return mAutomaticStyle != null;
+	}
+
+	/*
+	 * public void setLocalStyleProperties(OdfStyle style) { mAutomaticStyle =
+	 * style.getAsLocalStyle(); setStyleName(style.getName()); }
+	 */
+	/**
+	 * Returns a DocumentStyle if there is no local style
+	 * 
+	 * @return The <code>OdfStyle</code> element
+	 * 
+	 * */
+	public OdfStyle reuseDocumentStyle(String styleName) {
+		OdfStyle style = null;
+		if (styleName != null) {
+			style = mOdfSchemaDocument.getDocumentStyles().getStyle(styleName,
+					getStyleFamily());
+			if (style != null) {
+				setDocumentStyle(style);
+			}
+		}
+		return style;
+	}
+
+	/**
+	 * Set ODF DocumentStyle
+	 * 
+	 * @param style
+	 *            The document style
+	 */
+	public void setDocumentStyle(OdfStyle style) {
+		// when there is a local style, the document style becomes the parent
+		// of the local style
+		if (mAutomaticStyle != null) {
+			mAutomaticStyle.setStyleParentStyleNameAttribute(style.getStyleNameAttribute());
+		} else {
+			setStyleName(style.getStyleNameAttribute());
+		}
+	}
+
+	// protected static final String LOCAL_STYLE_PREFIX = "#local-style";
+
+	/*
+	 * public OdfStyle newDocumentStyle(String name) { OdfStyle newDocStyle =
+	 * mFamily.newStyle(name, mOdfSchemaDocument.getDocumentStyles());
+	 * setDocumentStyle(newDocStyle); return newDocStyle; }
+	 */
+	/**
+	 * Retrieve ODF DocumentStyle
+	 * 
+	 * @return the document style
+	 */
+	public OdfStyle getDocumentStyle() {
+		String styleName;
+		if (mAutomaticStyle != null) {
+			styleName = mAutomaticStyle.getStyleParentStyleNameAttribute();
+		} else {
+			styleName = getStyleName();
+		}
+
+		return mOdfSchemaDocument.getDocumentStyles().getStyle(styleName,
+				getStyleFamily());
+	}
+
+	/**
+	 * 
+	 * @return true if there is a document style.
+	 */
+	public boolean hasDocumentStyle() {
+		return getDocumentStyle() != null;
+	}
+
+	/*
+	 * public OdfStyle getAutomaticStyle() { if (mAutomaticStyle == null) {
+	 * mAutomaticStyle = mFamily.newStyle(LOCAL_STYLE_PREFIX, null); // if there
+	 * is already a document style, but no local style String styleName = null;
+	 * if ((styleName = getStyleName()) != null) {
+	 * mAutomaticStyle.setParentName(styleName); } } return mAutomaticStyle; }
+	 */
+	/**
+	 * Retrieve ODF style family
+	 * 
+	 * @return the style family.
+	 */
+	public OdfStyleFamily getStyleFamily() {
+		return mFamily;
+	}
+
+	/*
+	 * public OdfStyle getMergedStyle() { OdfStyle merged = new
+	 * OdfStyle("#merged-style", getStyleFamily()); OdfStyle docStyle =
+	 * getDocumentStyle(); if (mAutomaticStyle != null) { // a document style
+	 * may be referenced indirectly from the local style... if (docStyle ==
+	 * null) { docStyle =
+	 * mOdfSchemaDocument.getDocumentStyles().getStyle(mAutomaticStyle
+	 * .getParentName()); } // copy local style to merged style
+	 * mAutomaticStyle.copyTo(merged, true,false); }
+	 * 
+	 * // copy doc style to merged style // copyTo only copies properties that
+	 * are not already set at the // target style if (docStyle != null) {
+	 * docStyle.copyTo(merged, true,false); }
+	 * 
+	 * return merged; }
+	 */
+	/**
+	 * Retrieve ODF style property
+	 * 
+	 * @param property
+	 *            The style property
+	 * @return string for a property.
+	 */
+	public String getProperty(OdfStyleProperty property) {
+		// first try automatic style
+		StyleStyleElement style = mAutomaticStyle;
+
+		if (style == null) {
+			style = getOfficeStyle();
+		}
+
+		if (style != null) {
+			return style.getProperty(property);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Retrieve the set of ODF style proerties
+	 * 
+	 * @param properties
+	 * @return a map of all the properties.
+	 */
+	public Map<OdfStyleProperty, String> getProperties(
+			Set<OdfStyleProperty> properties) {
+		HashMap<OdfStyleProperty, String> map = new HashMap<OdfStyleProperty, String>();
+		for (OdfStyleProperty property : properties) {
+			map.put(property, getProperty(property));
+		}
+
+		return map;
+	}
+
+	/**
+	 * Retrieve the set of strict ODF properties
+	 * 
+	 * @return a set of all the properties from the style family.
+	 */
+	public Set<OdfStyleProperty> getStrictProperties() {
+		return getStyleFamily().getProperties();
+	}
+
+	/**
+	 * Judge if there is an automatic style with this property
+	 * 
+	 * @param property
+	 * @return true if there is an automatic style with this property.
+	 */
+	public boolean hasProperty(OdfStyleProperty property) {
+		return (mAutomaticStyle != null)
+				&& mAutomaticStyle.hasProperty(property);
+	}
+
+	/**
+	 * Remove the ODF property
+	 * 
+	 * @param property
+	 */
+	public void removeProperty(OdfStyleProperty property) {
+		if (mAutomaticStyle != null) {
+			mAutomaticStyle.removeProperty(property);
+		}
+	}
+
+	/**
+	 * Set ODF properties
+	 * 
+	 * @param properties
+	 */
+	public void setProperties(Map<OdfStyleProperty, String> properties) {
+		for (Map.Entry<OdfStyleProperty, String> entry : properties.entrySet()) {
+			setProperty(entry.getKey(), entry.getValue());
+		}
+	}
+
+	/**
+	 * Set ODF style property with value
+	 * 
+	 * @param property
+	 * @param value
+	 */
+	public void setProperty(OdfStyleProperty property, String value) {
+		getOrCreateUnqiueAutomaticStyle().setProperty(property, value);
+	}
+
+	@Override
+	protected void onInsertNode() {
+		super.onInsertNode();
+
+		String stylename = getStyleName();
+		if (stylename.length() != 0) {
+			if (mAutomaticStyle != null) {
+				if (mAutomaticStyle.getStyleNameAttribute().equals(stylename)) {
+					return;
+				}
+
+				mAutomaticStyle.removeStyleUser(this);
+				mAutomaticStyle = null;
+			}
+
+			OdfOfficeAutomaticStyles automatic_styles = getAutomaticStyles();
+			if (automatic_styles != null) {
+				mAutomaticStyle = automatic_styles.getStyle(stylename,
+						getStyleFamily());
+
+				if (mAutomaticStyle != null) {
+					mAutomaticStyle.addStyleUser(this);
+				}
+			}
+		}
+	}
+
+	/**
+	 *
+	 */
+	@Override
+	protected void onRemoveNode() {
+		super.onInsertNode();
+
+		if (this.mAutomaticStyle != null) {
+			this.mAutomaticStyle.removeStyleUser(this);
+			this.mAutomaticStyle = null;
+		}
+	}
+
+	// todo: rename after newName rid of deprecated getDocumentStyle()
+	private OdfStyle getOfficeStyle() {
+		OdfOfficeStyles styles = this.mOdfSchemaDocument.getDocumentStyles();
+		if (styles != null) {
+			return styles.getStyle(getStyleName(), getStyleFamily());
+		} else {
+			return null;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStyleBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStyleBase.java
new file mode 100644
index 0000000..9483627
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStyleBase.java
@@ -0,0 +1,527 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.element;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfContainerElementBase;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.style.StyleChartPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDrawingPagePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderFooterPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleRubyPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleSectionPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableRowPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.OdfStylePropertySet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * 
+ */
+abstract public class OdfStyleBase extends OdfContainerElementBase implements OdfStylePropertySet, Comparable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 8271282184913774000L;
+    private HashMap<OdfStylePropertiesSet, OdfStylePropertiesBase> mPropertySetElementMap;
+    private ArrayList<OdfStylableElement> mStyleUser;
+    static HashMap<OdfName, OdfStylePropertiesSet> mStylePropertiesElementToSetMap;
+
+
+    static {
+        mStylePropertiesElementToSetMap = new HashMap<OdfName, OdfStylePropertiesSet>();
+        mStylePropertiesElementToSetMap.put(StyleChartPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.ChartProperties);
+        mStylePropertiesElementToSetMap.put(StyleDrawingPagePropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.DrawingPageProperties);
+        mStylePropertiesElementToSetMap.put(StyleGraphicPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.GraphicProperties);
+        mStylePropertiesElementToSetMap.put(StyleHeaderFooterPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.HeaderFooterProperties);
+        mStylePropertiesElementToSetMap.put(StyleListLevelPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.ListLevelProperties);
+        mStylePropertiesElementToSetMap.put(StylePageLayoutPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.PageLayoutProperties);
+        mStylePropertiesElementToSetMap.put(StyleParagraphPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.ParagraphProperties);
+        mStylePropertiesElementToSetMap.put(StyleRubyPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.RubyProperties);
+        mStylePropertiesElementToSetMap.put(StyleSectionPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.SectionProperties);
+        mStylePropertiesElementToSetMap.put(StyleTableCellPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.TableCellProperties);
+        mStylePropertiesElementToSetMap.put(StyleTableColumnPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.TableColumnProperties);
+        mStylePropertiesElementToSetMap.put(StyleTablePropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.TableProperties);
+        mStylePropertiesElementToSetMap.put(StyleTableRowPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.TableRowProperties);
+        mStylePropertiesElementToSetMap.put(StyleTextPropertiesElement.ELEMENT_NAME, OdfStylePropertiesSet.TextProperties);
+    }
+
+    /** Creates a new instance of OdfElement */
+    public OdfStyleBase(OdfFileDom ownerDocument,
+            String namespaceURI,
+            String qualifiedName) throws DOMException {
+        super(ownerDocument, namespaceURI, qualifiedName);
+    }
+
+    /** Creates a new instance of OdfElement */
+    public OdfStyleBase(OdfFileDom ownerDocument,
+            OdfName aName) throws DOMException {
+        super(ownerDocument, aName.getUri(), aName.getQName());
+    }
+
+    public void addStyleUser(OdfStylableElement user) {
+        if (mStyleUser == null) {
+            mStyleUser = new ArrayList<OdfStylableElement>();
+        }
+        mStyleUser.add(user);
+    }
+
+    /**
+     * get a map containing all properties of this style and their values.
+     * @return map of properties. 
+     */
+    public Map<OdfStyleProperty, String> getStyleProperties() {
+        TreeMap<OdfStyleProperty, String> result = new TreeMap<OdfStyleProperty, String>();
+        OdfStyleFamily family = getFamily();
+        if (family != null) {
+            for (OdfStyleProperty property : family.getProperties()) {
+                if (hasProperty(property)) {
+                    result.put(property, getProperty(property));
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * get a map containing all properties of this style and their values.
+     * The map will also include any properties set by parent styles
+     * @return  a map of all the properties.
+     */
+    public Map<OdfStyleProperty, String> getStylePropertiesDeep() {
+        TreeMap<OdfStyleProperty, String> result = new TreeMap<OdfStyleProperty, String>();
+        OdfStyleBase style = this;
+        while (style != null) {
+            OdfStyleFamily family = style.getFamily();
+            if (family != null) {
+                for (OdfStyleProperty property : family.getProperties()) {
+                    if (!result.containsKey(property) && style.hasProperty(property)) {
+                        result.put(property, style.getProperty(property));
+                    }
+                }
+            }
+
+            style = style.getParentStyle();
+        }
+        return result;
+    }
+
+    public void removeStyleUser(OdfStylableElement user) {
+        if (mStyleUser != null) {
+            mStyleUser.remove(user);
+        }
+    }
+
+    public int getStyleUserCount() {
+        return mStyleUser == null ? 0 : mStyleUser.size();
+    }
+
+    /** Returns an iterator for all <code>OdfStylableElement</code> elements
+     * using this style.
+     *
+     * @return an iterator for all <code>OdfStylableElement</code> elements
+     * using this style
+     */
+    public Iterable<OdfStylableElement> getStyleUsers() {
+        if (mStyleUser != null) {
+            return mStyleUser;
+        }
+        return new ArrayList<OdfStylableElement>();
+    }
+
+    public String getFamilyName() {
+        return getFamily().getName();
+    }
+
+
+    /**
+     * 
+     * @param set
+     * @return the style:*-properties element for the given set. Returns null if
+     *         such element does not exist yet.
+     */
+    public OdfStylePropertiesBase getPropertiesElement(OdfStylePropertiesSet set) {
+        if (mPropertySetElementMap != null) {
+            return mPropertySetElementMap.get(set);
+        }
+
+        return null;
+    }
+
+    /**
+     * 
+     * @param set
+     * @return the style:*-properties element for the given set. If such element
+     *         does not yet exist, it is created.
+     */
+    public OdfStylePropertiesBase getOrCreatePropertiesElement(OdfStylePropertiesSet set) {
+        OdfStylePropertiesBase properties = null;
+
+        if (mPropertySetElementMap != null) {
+            properties = mPropertySetElementMap.get(set);
+        }
+
+        if (properties == null) {
+            for (Entry<OdfName, OdfStylePropertiesSet> entry : mStylePropertiesElementToSetMap.entrySet()) {
+                if (entry.getValue().equals(set)) {
+                    properties = (OdfStylePropertiesBase) ((OdfFileDom) this.ownerDocument).createElementNS(entry.getKey());
+                    if (getFirstChild() == null) {
+                        appendChild(properties);
+                    } else {
+                        // make sure the properties elements are in the correct order
+                        Node beforeNode = null;
+                        if (set.equals(OdfStylePropertiesSet.GraphicProperties)) {
+                            beforeNode = OdfElement.findFirstChildNode(StyleParagraphPropertiesElement.class, this);
+                            if (beforeNode == null) {
+                                beforeNode = OdfElement.findFirstChildNode(StyleTextPropertiesElement.class, this);
+                            }
+                        } else if (set.equals(OdfStylePropertiesSet.ParagraphProperties)) {
+                            beforeNode = OdfElement.findFirstChildNode(StyleTextPropertiesElement.class, this);
+                        } else if (!set.equals(OdfStylePropertiesSet.TextProperties)) {
+                            beforeNode = getFirstChild();
+                        }
+
+                        if (beforeNode == null) {
+                            beforeNode = getFirstChild();
+                            // find first non properties node
+                            while (beforeNode != null) {
+                                if (beforeNode.getNodeType() == Node.ELEMENT_NODE) {
+                                    if (!(beforeNode instanceof OdfStylePropertiesBase)) {
+                                        break;
+                                    }
+                                }
+                                beforeNode = beforeNode.getNextSibling();
+                            }
+                        }
+
+                        insertBefore(properties, beforeNode);
+                    }
+                    break;
+                }
+            }
+        }
+
+        return properties;
+    }
+
+    /**
+     * 
+     * @return a property value.
+     */
+    public String getProperty(OdfStyleProperty prop) {
+        String value = null;
+
+        OdfStylePropertiesBase properties = getPropertiesElement(prop.getPropertySet());
+        if (properties != null) {
+            if (properties.hasAttributeNS(prop.getName().getUri(), prop.getName().getLocalName())) {
+                return properties.getOdfAttribute(prop.getName()).getValue();
+            }
+        }
+
+        OdfStyleBase parent = getParentStyle();
+        if (parent != null) {
+            return parent.getProperty(prop);
+        }
+
+        return value;
+    }
+
+    public boolean hasProperty(OdfStyleProperty prop) {
+        if (mPropertySetElementMap != null) {
+            OdfStylePropertiesBase properties = mPropertySetElementMap.get(prop.getPropertySet());
+            if (properties != null) {
+                return properties.hasAttributeNS(prop.getName().getUri(), prop.getName().getLocalName());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    protected void onOdfNodeInserted(OdfElement node, Node refChild) {
+        if (node instanceof OdfStylePropertiesBase) {
+            OdfStylePropertiesSet set = mStylePropertiesElementToSetMap.get(node.getOdfName());
+            if (set != null) {
+                if (mPropertySetElementMap == null) {
+                    mPropertySetElementMap = new HashMap<OdfStylePropertiesSet, OdfStylePropertiesBase>();
+                }
+                mPropertySetElementMap.put(set, (OdfStylePropertiesBase) node);
+            }
+        }
+    }
+
+    @Override
+    protected void onOdfNodeRemoved(OdfElement node) {
+        if (mPropertySetElementMap != null) {
+            if (node instanceof OdfStylePropertiesBase) {
+                OdfStylePropertiesSet set = mStylePropertiesElementToSetMap.get(node.getOdfName());
+                if (set != null) {
+                    mPropertySetElementMap.remove(set);
+                }
+            }
+        }
+    }
+
+    public Map<OdfStyleProperty, String> getProperties(Set<OdfStyleProperty> properties) {
+        HashMap<OdfStyleProperty, String> map = new HashMap<OdfStyleProperty, String>();
+        for (OdfStyleProperty property : properties) {
+            map.put(property, getProperty(property));
+        }
+
+        return map;
+    }
+
+    public Set<OdfStyleProperty> getStrictProperties() {
+        return getFamily().getProperties();
+    }
+
+    public void removeProperty(OdfStyleProperty property) {
+        if (mPropertySetElementMap != null) {
+            OdfStylePropertiesBase properties = mPropertySetElementMap.get(property.getPropertySet());
+            if (properties != null) {
+                properties.removeAttributeNS(property.getName().getUri(), property.getName().getLocalName());
+            }
+        }
+    }
+
+    public void setProperties(Map<OdfStyleProperty, String> properties) {
+        for (Map.Entry<OdfStyleProperty, String> entry : properties.entrySet()) {
+            setProperty(entry.getKey(), entry.getValue());
+        }
+    }
+
+    public void setProperty(OdfStyleProperty property, String value) {
+        OdfStylePropertiesBase properties = getOrCreatePropertiesElement(property.getPropertySet());
+        if (properties != null) {
+        	OdfAttribute propertyAttr = ((OdfFileDom) this.ownerDocument).createAttributeNS(property.getName());
+            properties.setOdfAttribute(propertyAttr);
+            propertyAttr.setValue(value);
+        }
+    }
+
+    /** compare one style to another one.
+     *  This implements a total order on style objects.
+     *
+     * @param obj - the reference object with which to compare2.
+     * @return 0 if this object is the same as the obj argument; -1 if this
+     * object is less than the obj argument; 1 if this object is greater than
+     * the obj argument
+     */
+    public int compareTo(Object obj) {
+        if (this == obj) {
+            return 0;
+        }
+
+        if (!(obj instanceof OdfStyleBase)) {
+            if (obj == null) {
+                throw new ClassCastException("The object to be compared is null!");
+            } else {
+                throw new ClassCastException("The object to be compared is not a style!");
+            }
+        }
+        OdfStyleBase compare = (OdfStyleBase) obj;
+
+        int c = compareNodes(this, compare);
+        return c;
+    }
+
+    // Currently this function does not consider the order of child nodes, e.g.,
+    //
+    //		<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
+    //			<style:paragraph-properties>
+    //				<style:tab-stops>
+    //					<style:tab-stop style:position="4.344cm"/>
+    //				</style:tab-stops>
+    //				<style:background-image xlink:href="Pictures/1.jpg" xlink:type="simple" xlink:actuate="onLoad"/>
+    //			</style:paragraph-properties>
+    //		</style:style>
+    //
+    //  and
+    //
+    //		<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
+    //			<style:paragraph-properties>
+    //				<style:background-image xlink:href="Pictures/1.jpg" xlink:type="simple" xlink:actuate="onLoad"/>
+    //				<style:tab-stops>
+    //					<style:tab-stop style:position="4.344cm"/>
+    //				</style:tab-stops>
+    //			</style:paragraph-properties>
+    //		</style:style>
+    //
+    //  are regarded non-equal
+    //
+    static private int compareNodes(Node compare1, Node compare2) {
+        // Only styles can be equal, that are from the same element
+        // (e.g. style:style and text:list-level-style-bullet are never equal)
+        int c = 0;
+        // if the local name is unequal (e.g. style vs. list-level-style-bullet)
+        // the String compareTo will give me the order
+        if ((c = compare1.getLocalName().compareTo(compare2.getLocalName())) != 0) {
+            return c;
+        }
+
+        // if the namespaceURI is unequal (e.g. style vs. text)
+        // the String compareTo will give me the order
+        if ((c = compare1.getNamespaceURI().compareTo(compare2.getNamespaceURI())) != 0) {
+            return c;
+        }
+
+        // compare number of attributes
+        int attr_count1 = compare1.getAttributes() != null ? compare1.getAttributes().getLength() : 0;
+        int attr_count2 = compare2.getAttributes() != null ? compare2.getAttributes().getLength() : 0;
+
+        // attributes with default values do not exist in the ODFDOM XML model
+        if (attr_count1 != attr_count2) {
+            return attr_count1 < attr_count2 ? -1 : 1;
+        }
+
+        // sort attributes by namespace:localname, omit style name
+        SortedMap<String, String> attr1 = getSortedAttributes(compare1);
+        SortedMap<String, String> attr2 = getSortedAttributes(compare2);
+
+        // compare2 attribute names and values
+        Iterator<String> keySet1Iter = attr1.keySet().iterator();
+        Iterator<String> keySet2Iter = attr2.keySet().iterator();
+
+        while (keySet1Iter.hasNext()) {
+            String key1 = keySet1Iter.next();
+            String key2 = keySet2Iter.next();
+
+            if ((c = key1.compareTo(key2)) != 0) {
+                return c;
+            }
+
+            String attrValue1 = attr1.get(key1);
+            String attrValue2 = attr2.get(key1);
+            
+            if ((c = attrValue1.compareTo(attrValue2)) != 0) {
+                return c;
+            }
+        }
+
+        // now number of child elements
+        ArrayList<Node> nodes1 = getNonEmptyChildNodes(compare1);
+        ArrayList<Node> nodes2 = getNonEmptyChildNodes(compare2);
+
+        if (nodes1.size() != nodes2.size()) {
+            return nodes1.size() < nodes2.size() ? -1 : 1;
+        }
+
+        // now compare child elements
+        Iterator<Node> iter1 = nodes1.iterator();
+        Iterator<Node> iter2 = nodes2.iterator();
+
+        while (iter1.hasNext()) {
+            Node child1 = iter1.next();
+            Node child2 = iter2.next();
+            if ((c = compareNodes(child1, child2)) != 0) {
+                return c;
+            }
+        }
+
+        return 0;
+    }
+
+    // helper function for compareTo.
+    // sorts attributes by namespace:localname
+    private static SortedMap<String, String> getSortedAttributes(Node node) {
+        SortedMap<String, String> ret = new TreeMap<String, String>();
+        NamedNodeMap attrs = node.getAttributes();
+        for (int i = 0; i < attrs.getLength(); i++) {
+            Node cur = attrs.item(i);
+            String namespace = cur.getNamespaceURI();
+            String local = cur.getLocalName();
+            // styles can be still the same, even if they have different names
+            if (local.equals("name") && namespace.equals(OdfDocumentNamespace.STYLE.getUri())) {
+                continue;
+            }
+            ret.put(namespace + ":" + local, ((Attr) cur).getValue());
+        }
+        return ret;
+    }
+
+    // helper function for compareTo.
+    // all except "empty" text nodes will be returned
+    private static ArrayList<Node> getNonEmptyChildNodes(Node node) {
+        ArrayList<Node> ret = new ArrayList<Node>();
+        NodeList childs = node.getChildNodes();
+        for (int i = 0; i < childs.getLength(); i++) {
+            Node cur = childs.item(i);
+            if (cur.getNodeType() == Node.TEXT_NODE) {
+                if (cur.getNodeValue().trim().length() == 0) {
+                    continue; // skip whitespace text nodes
+                }
+            }
+            ret.add(cur);
+        }
+        return ret;
+    }
+
+    /** Indicates if some other object is equal to this one.
+     *  The attribute style:name is ignored during compare2.
+     *
+     * @param obj - the reference object with which to compare2.
+     * @return true if this object is the same as the obj argument; false otherwise.
+     */
+	@Override
+	public boolean equals(Object obj) {
+        return obj != null ? compareTo(obj) == 0 : false;
+	}
+
+    @Override
+    public int hashCode() {
+        return 59 * 7 + (this.mPropertySetElementMap != null ? this.mPropertySetElementMap.hashCode() : 0);
+    }
+    
+    public OdfStyleFamily getFamily() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public OdfStyleBase getParentStyle() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStylePropertiesBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStylePropertiesBase.java
new file mode 100644
index 0000000..6d98736
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStylePropertiesBase.java
@@ -0,0 +1,59 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.dom.element;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.w3c.dom.DOMException;
+
+/**
+ * Base class for those ODF element having several ODF style attributes.
+ * NOTE: We call style attribute commonly style properties.
+ */
+abstract public class OdfStylePropertiesBase extends OdfElement
+{
+    /**
+	 * Base class for all ODF elements having style attributes (we call properties).
+	 */
+	private static final long serialVersionUID = -6575728390842696683L;
+
+	/** Creates a new instance of OdfStyleProperties */
+    public OdfStylePropertiesBase(OdfFileDom ownerDocument,
+            String namespaceURI,
+            String qualifiedName) throws DOMException {
+        super(ownerDocument, namespaceURI, qualifiedName);
+    }
+
+    /** Creates a new instance of OdfStyleProperties */
+    public OdfStylePropertiesBase(OdfFileDom ownerDocument, 
+            OdfName aName) throws DOMException {
+        super(ownerDocument,aName);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return getOdfName().hashCode() + 7;
+    }    
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStyleableShapeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStyleableShapeElement.java
new file mode 100644
index 0000000..2fc5e67
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/OdfStyleableShapeElement.java
@@ -0,0 +1,97 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.dom.element;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.w3c.dom.Attr;
+
+/**
+ * This class decides upon the shape style attribute, whether the style family is
+ * of type 'graphic' or 'presentation'.
+ *
+ * 
+ * Why do have ODF shapes two alternatives for their style:family attribute?
+ *
+ * In ODF a style (ie. style:style) is always identified not alone by its name,
+ * but as well by its style:family. Elements are in general predefined to one style:family.
+ * For instance, a paragraph (text:p) will have a style from the style:family="paragraph",
+ * a span (text:span) would have a style:family="text".
+ *
+ * Only ODF shapes (e.g. draw:frame) can choose between two different style:family values,
+ * ie. 'presentation' and 'graphic'.
+ *
+ * The idea behind is that 'graphic' family shapes have a style that belong to the document
+ * similar as all other styles, but 'presentation' family shapes have a style that belongs
+ * to a master page.
+ * 
+ * The difference:
+ * Whenever in an application the master page of a page is being changed, all 'graphic'
+ * shapes look the same, only the 'presentation' shapes will get a new look-and-feel
+ * from the new master page.
+ */
+abstract public class OdfStyleableShapeElement extends OdfStylableElement {
+
+	private static final long serialVersionUID = 3604813885619852184L;
+	private static OdfName PresStyleAttrName = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "style-name");
+	private static OdfName DrawStyleAttrName = OdfName.newName(OdfDocumentNamespace.DRAW, "style-name");
+
+	public OdfStyleableShapeElement(OdfFileDom ownerDocument, OdfName name) {
+		super(ownerDocument, name, OdfStyleFamily.Graphic, DrawStyleAttrName);
+	}
+
+	/**
+	 * When the style-name prefix is changed between draw: and presentation:
+	 * the style:family is adjusted as well
+	 *
+	 * @param uri the namespace uri of the attribute to be changed
+	 * @param localname of the attribute to be changed
+	 */
+	protected void adjustStyleNameAttrib(String uri, String localname) {
+		if (DrawStyleAttrName.equals(uri, localname)) {
+			mStyleNameAttrib = DrawStyleAttrName;
+			mFamily = OdfStyleFamily.Graphic;
+		} else if (PresStyleAttrName.equals(uri, localname)) {
+			mStyleNameAttrib = PresStyleAttrName;
+			mFamily = OdfStyleFamily.Presentation;
+		}
+	}
+
+	@Override
+	public void setAttributeNS(String uri, String localname, String value) {
+		if ((value != null) && (value.length() != 0)) {
+			adjustStyleNameAttrib(uri, localname);
+		}
+
+		super.setAttributeNS(uri, localname, value);
+	}
+
+	@Override
+	public Attr setAttributeNodeNS(Attr newAttr) {
+		String uri = newAttr.getNamespaceURI();
+		String localname = newAttr.getName();
+		adjustStyleNameAttrib(uri, localname);
+		return super.setAttributeNodeNS(newAttr);
+	}
+}
+
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateColorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateColorElement.java
new file mode 100644
index 0000000..5ddbb4e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateColorElement.java
@@ -0,0 +1,748 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimColorInterpolationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimColorInterpolationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccumulateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAdditiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAttributeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilCalcModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFromAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilKeySplinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilKeyTimesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilValuesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:animateColor}.
+ *
+ */
+public class AnimAnimateColorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "animateColor");
+
+	/**
+	 * Create the instance of <code>AnimAnimateColorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimAnimateColorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:animateColor}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimColorInterpolationAttribute</code> , See {@odf.attribute anim:color-interpolation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimColorInterpolationAttribute() {
+		AnimColorInterpolationAttribute attr = (AnimColorInterpolationAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "color-interpolation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return AnimColorInterpolationAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimColorInterpolationAttribute</code> , See {@odf.attribute anim:color-interpolation}
+	 *
+	 * @param animColorInterpolationValue   The type is <code>String</code>
+	 */
+	public void setAnimColorInterpolationAttribute(String animColorInterpolationValue) {
+		AnimColorInterpolationAttribute attr = new AnimColorInterpolationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animColorInterpolationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimColorInterpolationDirectionAttribute</code> , See {@odf.attribute anim:color-interpolation-direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimColorInterpolationDirectionAttribute() {
+		AnimColorInterpolationDirectionAttribute attr = (AnimColorInterpolationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "color-interpolation-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return AnimColorInterpolationDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimColorInterpolationDirectionAttribute</code> , See {@odf.attribute anim:color-interpolation-direction}
+	 *
+	 * @param animColorInterpolationDirectionValue   The type is <code>String</code>
+	 */
+	public void setAnimColorInterpolationDirectionAttribute(String animColorInterpolationDirectionValue) {
+		AnimColorInterpolationDirectionAttribute attr = new AnimColorInterpolationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animColorInterpolationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimFormulaAttribute() {
+		AnimFormulaAttribute attr = (AnimFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @param animFormulaValue   The type is <code>String</code>
+	 */
+	public void setAnimFormulaAttribute(String animFormulaValue) {
+		AnimFormulaAttribute attr = new AnimFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccumulateAttribute() {
+		SmilAccumulateAttribute attr = (SmilAccumulateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accumulate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @param smilAccumulateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccumulateAttribute(String smilAccumulateValue) {
+		SmilAccumulateAttribute attr = new SmilAccumulateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccumulateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAdditiveAttribute() {
+		SmilAdditiveAttribute attr = (SmilAdditiveAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "additive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @param smilAdditiveValue   The type is <code>String</code>
+	 */
+	public void setSmilAdditiveAttribute(String smilAdditiveValue) {
+		SmilAdditiveAttribute attr = new SmilAdditiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAdditiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAttributeNameAttribute() {
+		SmilAttributeNameAttribute attr = (SmilAttributeNameAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "attributeName");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * @param smilAttributeNameValue   The type is <code>String</code>
+	 */
+	public void setSmilAttributeNameAttribute(String smilAttributeNameValue) {
+		SmilAttributeNameAttribute attr = new SmilAttributeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAttributeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilByAttribute() {
+		SmilByAttribute attr = (SmilByAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @param smilByValue   The type is <code>String</code>
+	 */
+	public void setSmilByAttribute(String smilByValue) {
+		SmilByAttribute attr = new SmilByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilCalcModeAttribute() {
+		SmilCalcModeAttribute attr = (SmilCalcModeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "calcMode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilCalcModeAttribute.DEFAULT_VALUE_DISCRETE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @param smilCalcModeValue   The type is <code>String</code>
+	 */
+	public void setSmilCalcModeAttribute(String smilCalcModeValue) {
+		SmilCalcModeAttribute attr = new SmilCalcModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilCalcModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFromAttribute() {
+		SmilFromAttribute attr = (SmilFromAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "from");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @param smilFromValue   The type is <code>String</code>
+	 */
+	public void setSmilFromAttribute(String smilFromValue) {
+		SmilFromAttribute attr = new SmilFromAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFromValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilKeySplinesAttribute</code> , See {@odf.attribute smil:keySplines}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilKeySplinesAttribute() {
+		SmilKeySplinesAttribute attr = (SmilKeySplinesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "keySplines");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilKeySplinesAttribute</code> , See {@odf.attribute smil:keySplines}
+	 *
+	 * @param smilKeySplinesValue   The type is <code>String</code>
+	 */
+	public void setSmilKeySplinesAttribute(String smilKeySplinesValue) {
+		SmilKeySplinesAttribute attr = new SmilKeySplinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilKeySplinesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilKeyTimesAttribute</code> , See {@odf.attribute smil:keyTimes}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilKeyTimesAttribute() {
+		SmilKeyTimesAttribute attr = (SmilKeyTimesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "keyTimes");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilKeyTimesAttribute</code> , See {@odf.attribute smil:keyTimes}
+	 *
+	 * @param smilKeyTimesValue   The type is <code>String</code>
+	 */
+	public void setSmilKeyTimesAttribute(String smilKeyTimesValue) {
+		SmilKeyTimesAttribute attr = new SmilKeyTimesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilKeyTimesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilToAttribute() {
+		SmilToAttribute attr = (SmilToAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @param smilToValue   The type is <code>String</code>
+	 */
+	public void setSmilToAttribute(String smilToValue) {
+		SmilToAttribute attr = new SmilToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilToValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilValuesAttribute() {
+		SmilValuesAttribute attr = (SmilValuesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "values");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @param smilValuesValue   The type is <code>String</code>
+	 */
+	public void setSmilValuesAttribute(String smilValuesValue) {
+		SmilValuesAttribute attr = new SmilValuesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilValuesValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateElement.java
new file mode 100644
index 0000000..35425d4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateElement.java
@@ -0,0 +1,698 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccumulateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAdditiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAttributeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilCalcModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFromAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilKeySplinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilKeyTimesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilValuesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:animate}.
+ *
+ */
+public class AnimAnimateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "animate");
+
+	/**
+	 * Create the instance of <code>AnimAnimateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimAnimateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:animate}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimFormulaAttribute() {
+		AnimFormulaAttribute attr = (AnimFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @param animFormulaValue   The type is <code>String</code>
+	 */
+	public void setAnimFormulaAttribute(String animFormulaValue) {
+		AnimFormulaAttribute attr = new AnimFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccumulateAttribute() {
+		SmilAccumulateAttribute attr = (SmilAccumulateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accumulate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @param smilAccumulateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccumulateAttribute(String smilAccumulateValue) {
+		SmilAccumulateAttribute attr = new SmilAccumulateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccumulateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAdditiveAttribute() {
+		SmilAdditiveAttribute attr = (SmilAdditiveAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "additive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @param smilAdditiveValue   The type is <code>String</code>
+	 */
+	public void setSmilAdditiveAttribute(String smilAdditiveValue) {
+		SmilAdditiveAttribute attr = new SmilAdditiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAdditiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAttributeNameAttribute() {
+		SmilAttributeNameAttribute attr = (SmilAttributeNameAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "attributeName");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * @param smilAttributeNameValue   The type is <code>String</code>
+	 */
+	public void setSmilAttributeNameAttribute(String smilAttributeNameValue) {
+		SmilAttributeNameAttribute attr = new SmilAttributeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAttributeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilByAttribute() {
+		SmilByAttribute attr = (SmilByAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @param smilByValue   The type is <code>String</code>
+	 */
+	public void setSmilByAttribute(String smilByValue) {
+		SmilByAttribute attr = new SmilByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilCalcModeAttribute() {
+		SmilCalcModeAttribute attr = (SmilCalcModeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "calcMode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilCalcModeAttribute.DEFAULT_VALUE_DISCRETE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @param smilCalcModeValue   The type is <code>String</code>
+	 */
+	public void setSmilCalcModeAttribute(String smilCalcModeValue) {
+		SmilCalcModeAttribute attr = new SmilCalcModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilCalcModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFromAttribute() {
+		SmilFromAttribute attr = (SmilFromAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "from");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @param smilFromValue   The type is <code>String</code>
+	 */
+	public void setSmilFromAttribute(String smilFromValue) {
+		SmilFromAttribute attr = new SmilFromAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFromValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilKeySplinesAttribute</code> , See {@odf.attribute smil:keySplines}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilKeySplinesAttribute() {
+		SmilKeySplinesAttribute attr = (SmilKeySplinesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "keySplines");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilKeySplinesAttribute</code> , See {@odf.attribute smil:keySplines}
+	 *
+	 * @param smilKeySplinesValue   The type is <code>String</code>
+	 */
+	public void setSmilKeySplinesAttribute(String smilKeySplinesValue) {
+		SmilKeySplinesAttribute attr = new SmilKeySplinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilKeySplinesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilKeyTimesAttribute</code> , See {@odf.attribute smil:keyTimes}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilKeyTimesAttribute() {
+		SmilKeyTimesAttribute attr = (SmilKeyTimesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "keyTimes");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilKeyTimesAttribute</code> , See {@odf.attribute smil:keyTimes}
+	 *
+	 * @param smilKeyTimesValue   The type is <code>String</code>
+	 */
+	public void setSmilKeyTimesAttribute(String smilKeyTimesValue) {
+		SmilKeyTimesAttribute attr = new SmilKeyTimesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilKeyTimesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilToAttribute() {
+		SmilToAttribute attr = (SmilToAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @param smilToValue   The type is <code>String</code>
+	 */
+	public void setSmilToAttribute(String smilToValue) {
+		SmilToAttribute attr = new SmilToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilToValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilValuesAttribute() {
+		SmilValuesAttribute attr = (SmilValuesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "values");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @param smilValuesValue   The type is <code>String</code>
+	 */
+	public void setSmilValuesAttribute(String smilValuesValue) {
+		SmilValuesAttribute attr = new SmilValuesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilValuesValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateMotionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateMotionElement.java
new file mode 100644
index 0000000..6c049ae
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateMotionElement.java
@@ -0,0 +1,748 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccumulateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAdditiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAttributeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilCalcModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFromAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilKeySplinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilKeyTimesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilValuesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgOriginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgPathAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:animateMotion}.
+ *
+ */
+public class AnimAnimateMotionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "animateMotion");
+
+	/**
+	 * Create the instance of <code>AnimAnimateMotionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimAnimateMotionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:animateMotion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimFormulaAttribute() {
+		AnimFormulaAttribute attr = (AnimFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @param animFormulaValue   The type is <code>String</code>
+	 */
+	public void setAnimFormulaAttribute(String animFormulaValue) {
+		AnimFormulaAttribute attr = new AnimFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccumulateAttribute() {
+		SmilAccumulateAttribute attr = (SmilAccumulateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accumulate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @param smilAccumulateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccumulateAttribute(String smilAccumulateValue) {
+		SmilAccumulateAttribute attr = new SmilAccumulateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccumulateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAdditiveAttribute() {
+		SmilAdditiveAttribute attr = (SmilAdditiveAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "additive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @param smilAdditiveValue   The type is <code>String</code>
+	 */
+	public void setSmilAdditiveAttribute(String smilAdditiveValue) {
+		SmilAdditiveAttribute attr = new SmilAdditiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAdditiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAttributeNameAttribute() {
+		SmilAttributeNameAttribute attr = (SmilAttributeNameAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "attributeName");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * @param smilAttributeNameValue   The type is <code>String</code>
+	 */
+	public void setSmilAttributeNameAttribute(String smilAttributeNameValue) {
+		SmilAttributeNameAttribute attr = new SmilAttributeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAttributeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilByAttribute() {
+		SmilByAttribute attr = (SmilByAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @param smilByValue   The type is <code>String</code>
+	 */
+	public void setSmilByAttribute(String smilByValue) {
+		SmilByAttribute attr = new SmilByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilCalcModeAttribute() {
+		SmilCalcModeAttribute attr = (SmilCalcModeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "calcMode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilCalcModeAttribute.DEFAULT_VALUE_PACED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @param smilCalcModeValue   The type is <code>String</code>
+	 */
+	public void setSmilCalcModeAttribute(String smilCalcModeValue) {
+		SmilCalcModeAttribute attr = new SmilCalcModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilCalcModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFromAttribute() {
+		SmilFromAttribute attr = (SmilFromAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "from");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @param smilFromValue   The type is <code>String</code>
+	 */
+	public void setSmilFromAttribute(String smilFromValue) {
+		SmilFromAttribute attr = new SmilFromAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFromValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilKeySplinesAttribute</code> , See {@odf.attribute smil:keySplines}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilKeySplinesAttribute() {
+		SmilKeySplinesAttribute attr = (SmilKeySplinesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "keySplines");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilKeySplinesAttribute</code> , See {@odf.attribute smil:keySplines}
+	 *
+	 * @param smilKeySplinesValue   The type is <code>String</code>
+	 */
+	public void setSmilKeySplinesAttribute(String smilKeySplinesValue) {
+		SmilKeySplinesAttribute attr = new SmilKeySplinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilKeySplinesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilKeyTimesAttribute</code> , See {@odf.attribute smil:keyTimes}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilKeyTimesAttribute() {
+		SmilKeyTimesAttribute attr = (SmilKeyTimesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "keyTimes");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilKeyTimesAttribute</code> , See {@odf.attribute smil:keyTimes}
+	 *
+	 * @param smilKeyTimesValue   The type is <code>String</code>
+	 */
+	public void setSmilKeyTimesAttribute(String smilKeyTimesValue) {
+		SmilKeyTimesAttribute attr = new SmilKeyTimesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilKeyTimesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilToAttribute() {
+		SmilToAttribute attr = (SmilToAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @param smilToValue   The type is <code>String</code>
+	 */
+	public void setSmilToAttribute(String smilToValue) {
+		SmilToAttribute attr = new SmilToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilToValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilValuesAttribute() {
+		SmilValuesAttribute attr = (SmilValuesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "values");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @param smilValuesValue   The type is <code>String</code>
+	 */
+	public void setSmilValuesAttribute(String smilValuesValue) {
+		SmilValuesAttribute attr = new SmilValuesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilValuesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgOriginAttribute</code> , See {@odf.attribute svg:origin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgOriginAttribute() {
+		SvgOriginAttribute attr = (SvgOriginAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "origin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgOriginAttribute</code> , See {@odf.attribute svg:origin}
+	 *
+	 * @param svgOriginValue   The type is <code>String</code>
+	 */
+	public void setSvgOriginAttribute(String svgOriginValue) {
+		SvgOriginAttribute attr = new SvgOriginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgOriginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgPathAttribute</code> , See {@odf.attribute svg:path}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgPathAttribute() {
+		SvgPathAttribute attr = (SvgPathAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "path");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgPathAttribute</code> , See {@odf.attribute svg:path}
+	 *
+	 * @param svgPathValue   The type is <code>String</code>
+	 */
+	public void setSvgPathAttribute(String svgPathValue) {
+		SvgPathAttribute attr = new SvgPathAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgPathValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateTransformElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateTransformElement.java
new file mode 100644
index 0000000..3270973
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAnimateTransformElement.java
@@ -0,0 +1,650 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccumulateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAdditiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAttributeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFromAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilValuesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:animateTransform}.
+ *
+ */
+public class AnimAnimateTransformElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "animateTransform");
+
+	/**
+	 * Create the instance of <code>AnimAnimateTransformElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimAnimateTransformElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:animateTransform}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimFormulaAttribute() {
+		AnimFormulaAttribute attr = (AnimFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @param animFormulaValue   The type is <code>String</code>
+	 */
+	public void setAnimFormulaAttribute(String animFormulaValue) {
+		AnimFormulaAttribute attr = new AnimFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccumulateAttribute() {
+		SmilAccumulateAttribute attr = (SmilAccumulateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accumulate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @param smilAccumulateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccumulateAttribute(String smilAccumulateValue) {
+		SmilAccumulateAttribute attr = new SmilAccumulateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccumulateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAdditiveAttribute() {
+		SmilAdditiveAttribute attr = (SmilAdditiveAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "additive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @param smilAdditiveValue   The type is <code>String</code>
+	 */
+	public void setSmilAdditiveAttribute(String smilAdditiveValue) {
+		SmilAdditiveAttribute attr = new SmilAdditiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAdditiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAttributeNameAttribute() {
+		SmilAttributeNameAttribute attr = (SmilAttributeNameAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "attributeName");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * @param smilAttributeNameValue   The type is <code>String</code>
+	 */
+	public void setSmilAttributeNameAttribute(String smilAttributeNameValue) {
+		SmilAttributeNameAttribute attr = new SmilAttributeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAttributeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilByAttribute() {
+		SmilByAttribute attr = (SmilByAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @param smilByValue   The type is <code>String</code>
+	 */
+	public void setSmilByAttribute(String smilByValue) {
+		SmilByAttribute attr = new SmilByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFromAttribute() {
+		SmilFromAttribute attr = (SmilFromAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "from");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @param smilFromValue   The type is <code>String</code>
+	 */
+	public void setSmilFromAttribute(String smilFromValue) {
+		SmilFromAttribute attr = new SmilFromAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFromValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilToAttribute() {
+		SmilToAttribute attr = (SmilToAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @param smilToValue   The type is <code>String</code>
+	 */
+	public void setSmilToAttribute(String smilToValue) {
+		SmilToAttribute attr = new SmilToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilToValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilValuesAttribute() {
+		SmilValuesAttribute attr = (SmilValuesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "values");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @param smilValuesValue   The type is <code>String</code>
+	 */
+	public void setSmilValuesAttribute(String smilValuesValue) {
+		SmilValuesAttribute attr = new SmilValuesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilValuesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgTypeAttribute</code> , See {@odf.attribute svg:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgTypeAttribute() {
+		SvgTypeAttribute attr = (SvgTypeAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgTypeAttribute</code> , See {@odf.attribute svg:type}
+	 *
+	 * @param svgTypeValue   The type is <code>String</code>
+	 */
+	public void setSvgTypeAttribute(String svgTypeValue) {
+		SvgTypeAttribute attr = new SvgTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAudioElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAudioElement.java
new file mode 100644
index 0000000..91dc3a8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimAudioElement.java
@@ -0,0 +1,546 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimAudioLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationGroupIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMasterElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNodeTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetSubTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:audio}.
+ *
+ */
+public class AnimAudioElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "audio");
+
+	/**
+	 * Create the instance of <code>AnimAudioElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimAudioElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:audio}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimAudioLevelAttribute</code> , See {@odf.attribute anim:audio-level}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getAnimAudioLevelAttribute() {
+		AnimAudioLevelAttribute attr = (AnimAudioLevelAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "audio-level");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimAudioLevelAttribute</code> , See {@odf.attribute anim:audio-level}
+	 *
+	 * @param animAudioLevelValue   The type is <code>Double</code>
+	 */
+	public void setAnimAudioLevelAttribute(Double animAudioLevelValue) {
+		AnimAudioLevelAttribute attr = new AnimAudioLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(animAudioLevelValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIdAttribute() {
+		AnimIdAttribute attr = (AnimIdAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @param animIdValue   The type is <code>String</code>
+	 */
+	public void setAnimIdAttribute(String animIdValue) {
+		AnimIdAttribute attr = new AnimIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationGroupIdAttribute() {
+		PresentationGroupIdAttribute attr = (PresentationGroupIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "group-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @param presentationGroupIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationGroupIdAttribute(String presentationGroupIdValue) {
+		PresentationGroupIdAttribute attr = new PresentationGroupIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationGroupIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationMasterElementAttribute() {
+		PresentationMasterElementAttribute attr = (PresentationMasterElementAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "master-element");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @param presentationMasterElementValue   The type is <code>String</code>
+	 */
+	public void setPresentationMasterElementAttribute(String presentationMasterElementValue) {
+		PresentationMasterElementAttribute attr = new PresentationMasterElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationMasterElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNodeTypeAttribute() {
+		PresentationNodeTypeAttribute attr = (PresentationNodeTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "node-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationNodeTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @param presentationNodeTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationNodeTypeAttribute(String presentationNodeTypeValue) {
+		PresentationNodeTypeAttribute attr = new PresentationNodeTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNodeTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetClassAttribute() {
+		PresentationPresetClassAttribute attr = (PresentationPresetClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationPresetClassAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @param presentationPresetClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetClassAttribute(String presentationPresetClassValue) {
+		PresentationPresetClassAttribute attr = new PresentationPresetClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetIdAttribute() {
+		PresentationPresetIdAttribute attr = (PresentationPresetIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @param presentationPresetIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetIdAttribute(String presentationPresetIdValue) {
+		PresentationPresetIdAttribute attr = new PresentationPresetIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetSubTypeAttribute() {
+		PresentationPresetSubTypeAttribute attr = (PresentationPresetSubTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-sub-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @param presentationPresetSubTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetSubTypeAttribute(String presentationPresetSubTypeValue) {
+		PresentationPresetSubTypeAttribute attr = new PresentationPresetSubTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetSubTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimCommandElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimCommandElement.java
new file mode 100644
index 0000000..cc09f9a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimCommandElement.java
@@ -0,0 +1,413 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimCommandAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationGroupIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMasterElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNodeTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetSubTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:command}.
+ *
+ */
+public class AnimCommandElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "command");
+
+	/**
+	 * Create the instance of <code>AnimCommandElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimCommandElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:command}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimCommandAttribute</code> , See {@odf.attribute anim:command}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimCommandAttribute() {
+		AnimCommandAttribute attr = (AnimCommandAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "command");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimCommandAttribute</code> , See {@odf.attribute anim:command}
+	 *
+	 * @param animCommandValue   The type is <code>String</code>
+	 */
+	public void setAnimCommandAttribute(String animCommandValue) {
+		AnimCommandAttribute attr = new AnimCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animCommandValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIdAttribute() {
+		AnimIdAttribute attr = (AnimIdAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @param animIdValue   The type is <code>String</code>
+	 */
+	public void setAnimIdAttribute(String animIdValue) {
+		AnimIdAttribute attr = new AnimIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationGroupIdAttribute() {
+		PresentationGroupIdAttribute attr = (PresentationGroupIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "group-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @param presentationGroupIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationGroupIdAttribute(String presentationGroupIdValue) {
+		PresentationGroupIdAttribute attr = new PresentationGroupIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationGroupIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationMasterElementAttribute() {
+		PresentationMasterElementAttribute attr = (PresentationMasterElementAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "master-element");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @param presentationMasterElementValue   The type is <code>String</code>
+	 */
+	public void setPresentationMasterElementAttribute(String presentationMasterElementValue) {
+		PresentationMasterElementAttribute attr = new PresentationMasterElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationMasterElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNodeTypeAttribute() {
+		PresentationNodeTypeAttribute attr = (PresentationNodeTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "node-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationNodeTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @param presentationNodeTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationNodeTypeAttribute(String presentationNodeTypeValue) {
+		PresentationNodeTypeAttribute attr = new PresentationNodeTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNodeTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetClassAttribute() {
+		PresentationPresetClassAttribute attr = (PresentationPresetClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationPresetClassAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @param presentationPresetClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetClassAttribute(String presentationPresetClassValue) {
+		PresentationPresetClassAttribute attr = new PresentationPresetClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetIdAttribute() {
+		PresentationPresetIdAttribute attr = (PresentationPresetIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @param presentationPresetIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetIdAttribute(String presentationPresetIdValue) {
+		PresentationPresetIdAttribute attr = new PresentationPresetIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetSubTypeAttribute() {
+		PresentationPresetSubTypeAttribute attr = (PresentationPresetSubTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-sub-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @param presentationPresetSubTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetSubTypeAttribute(String presentationPresetSubTypeValue) {
+		PresentationPresetSubTypeAttribute attr = new PresentationPresetSubTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetSubTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element anim:param}.
+	 *
+	 * @param animNameValue  the <code>String</code> value of <code>AnimNameAttribute</code>, see {@odf.attribute  anim:name} at specification
+	 * @param animValueValue  the <code>String</code> value of <code>AnimValueAttribute</code>, see {@odf.attribute  anim:value} at specification
+	 * @return the element {@odf.element anim:param}
+	 */
+	 public AnimParamElement newAnimParamElement(String animNameValue, String animValueValue) {
+		AnimParamElement animParam = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimParamElement.class);
+		animParam.setAnimNameAttribute(animNameValue);
+		animParam.setAnimValueAttribute(animValueValue);
+		this.appendChild(animParam);
+		return animParam;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimIterateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimIterateElement.java
new file mode 100644
index 0000000..db391d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimIterateElement.java
@@ -0,0 +1,833 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIterateIntervalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIterateTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationGroupIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMasterElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNodeTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetSubTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndsyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:iterate}.
+ *
+ */
+public class AnimIterateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "iterate");
+
+	/**
+	 * Create the instance of <code>AnimIterateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimIterateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:iterate}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIdAttribute() {
+		AnimIdAttribute attr = (AnimIdAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @param animIdValue   The type is <code>String</code>
+	 */
+	public void setAnimIdAttribute(String animIdValue) {
+		AnimIdAttribute attr = new AnimIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIterateIntervalAttribute</code> , See {@odf.attribute anim:iterate-interval}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIterateIntervalAttribute() {
+		AnimIterateIntervalAttribute attr = (AnimIterateIntervalAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "iterate-interval");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIterateIntervalAttribute</code> , See {@odf.attribute anim:iterate-interval}
+	 *
+	 * @param animIterateIntervalValue   The type is <code>String</code>
+	 */
+	public void setAnimIterateIntervalAttribute(String animIterateIntervalValue) {
+		AnimIterateIntervalAttribute attr = new AnimIterateIntervalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIterateIntervalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIterateTypeAttribute</code> , See {@odf.attribute anim:iterate-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIterateTypeAttribute() {
+		AnimIterateTypeAttribute attr = (AnimIterateTypeAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "iterate-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIterateTypeAttribute</code> , See {@odf.attribute anim:iterate-type}
+	 *
+	 * @param animIterateTypeValue   The type is <code>String</code>
+	 */
+	public void setAnimIterateTypeAttribute(String animIterateTypeValue) {
+		AnimIterateTypeAttribute attr = new AnimIterateTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIterateTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationGroupIdAttribute() {
+		PresentationGroupIdAttribute attr = (PresentationGroupIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "group-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @param presentationGroupIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationGroupIdAttribute(String presentationGroupIdValue) {
+		PresentationGroupIdAttribute attr = new PresentationGroupIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationGroupIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationMasterElementAttribute() {
+		PresentationMasterElementAttribute attr = (PresentationMasterElementAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "master-element");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @param presentationMasterElementValue   The type is <code>String</code>
+	 */
+	public void setPresentationMasterElementAttribute(String presentationMasterElementValue) {
+		PresentationMasterElementAttribute attr = new PresentationMasterElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationMasterElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNodeTypeAttribute() {
+		PresentationNodeTypeAttribute attr = (PresentationNodeTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "node-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationNodeTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @param presentationNodeTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationNodeTypeAttribute(String presentationNodeTypeValue) {
+		PresentationNodeTypeAttribute attr = new PresentationNodeTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNodeTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetClassAttribute() {
+		PresentationPresetClassAttribute attr = (PresentationPresetClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationPresetClassAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @param presentationPresetClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetClassAttribute(String presentationPresetClassValue) {
+		PresentationPresetClassAttribute attr = new PresentationPresetClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetIdAttribute() {
+		PresentationPresetIdAttribute attr = (PresentationPresetIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @param presentationPresetIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetIdAttribute(String presentationPresetIdValue) {
+		PresentationPresetIdAttribute attr = new PresentationPresetIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetSubTypeAttribute() {
+		PresentationPresetSubTypeAttribute attr = (PresentationPresetSubTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-sub-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @param presentationPresetSubTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetSubTypeAttribute(String presentationPresetSubTypeValue) {
+		PresentationPresetSubTypeAttribute attr = new PresentationPresetSubTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetSubTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndsyncAttribute</code> , See {@odf.attribute smil:endsync}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndsyncAttribute() {
+		SmilEndsyncAttribute attr = (SmilEndsyncAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "endsync");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndsyncAttribute</code> , See {@odf.attribute smil:endsync}
+	 *
+	 * @param smilEndsyncValue   The type is <code>String</code>
+	 */
+	public void setSmilEndsyncAttribute(String smilEndsyncValue) {
+		SmilEndsyncAttribute attr = new SmilEndsyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndsyncValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animate}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animate}
+	 */
+	 public AnimAnimateElement newAnimAnimateElement(String smilAttributeNameValue) {
+		AnimAnimateElement animAnimate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateElement.class);
+		animAnimate.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimate);
+		return animAnimate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateColor}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateColor}
+	 */
+	 public AnimAnimateColorElement newAnimAnimateColorElement(String smilAttributeNameValue) {
+		AnimAnimateColorElement animAnimateColor = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateColorElement.class);
+		animAnimateColor.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateColor);
+		return animAnimateColor;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateMotion}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateMotion}
+	 */
+	 public AnimAnimateMotionElement newAnimAnimateMotionElement(String smilAttributeNameValue) {
+		AnimAnimateMotionElement animAnimateMotion = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateMotionElement.class);
+		animAnimateMotion.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateMotion);
+		return animAnimateMotion;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateTransform}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @param svgTypeValue  the <code>String</code> value of <code>SvgTypeAttribute</code>, see {@odf.attribute  svg:type} at specification
+	 * @return the element {@odf.element anim:animateTransform}
+	 */
+	 public AnimAnimateTransformElement newAnimAnimateTransformElement(String smilAttributeNameValue, String svgTypeValue) {
+		AnimAnimateTransformElement animAnimateTransform = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateTransformElement.class);
+		animAnimateTransform.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		animAnimateTransform.setSvgTypeAttribute(svgTypeValue);
+		this.appendChild(animAnimateTransform);
+		return animAnimateTransform;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:audio}.
+	 *
+	 * @return the element {@odf.element anim:audio}
+	 */
+	public AnimAudioElement newAnimAudioElement() {
+		AnimAudioElement animAudio = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAudioElement.class);
+		this.appendChild(animAudio);
+		return animAudio;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:command}.
+	 *
+	 * @param animCommandValue  the <code>String</code> value of <code>AnimCommandAttribute</code>, see {@odf.attribute  anim:command} at specification
+	 * @return the element {@odf.element anim:command}
+	 */
+	 public AnimCommandElement newAnimCommandElement(String animCommandValue) {
+		AnimCommandElement animCommand = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimCommandElement.class);
+		animCommand.setAnimCommandAttribute(animCommandValue);
+		this.appendChild(animCommand);
+		return animCommand;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:iterate}.
+	 *
+	 * @return the element {@odf.element anim:iterate}
+	 */
+	public AnimIterateElement newAnimIterateElement() {
+		AnimIterateElement animIterate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimIterateElement.class);
+		this.appendChild(animIterate);
+		return animIterate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:par}.
+	 *
+	 * @return the element {@odf.element anim:par}
+	 */
+	public AnimParElement newAnimParElement() {
+		AnimParElement animPar = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimParElement.class);
+		this.appendChild(animPar);
+		return animPar;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:seq}.
+	 *
+	 * @return the element {@odf.element anim:seq}
+	 */
+	public AnimSeqElement newAnimSeqElement() {
+		AnimSeqElement animSeq = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSeqElement.class);
+		this.appendChild(animSeq);
+		return animSeq;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:set}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:set}
+	 */
+	 public AnimSetElement newAnimSetElement(String smilAttributeNameValue) {
+		AnimSetElement animSet = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSetElement.class);
+		animSet.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animSet);
+		return animSet;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:transitionFilter}.
+	 *
+	 * @param smilTypeValue  the <code>String</code> value of <code>SmilTypeAttribute</code>, see {@odf.attribute  smil:type} at specification
+	 * @return the element {@odf.element anim:transitionFilter}
+	 */
+	 public AnimTransitionFilterElement newAnimTransitionFilterElement(String smilTypeValue) {
+		AnimTransitionFilterElement animTransitionFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimTransitionFilterElement.class);
+		animTransitionFilter.setSmilTypeAttribute(smilTypeValue);
+		this.appendChild(animTransitionFilter);
+		return animTransitionFilter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimParElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimParElement.java
new file mode 100644
index 0000000..4bb5abc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimParElement.java
@@ -0,0 +1,733 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationGroupIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMasterElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNodeTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetSubTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndsyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:par}.
+ *
+ */
+public class AnimParElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "par");
+
+	/**
+	 * Create the instance of <code>AnimParElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimParElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:par}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIdAttribute() {
+		AnimIdAttribute attr = (AnimIdAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @param animIdValue   The type is <code>String</code>
+	 */
+	public void setAnimIdAttribute(String animIdValue) {
+		AnimIdAttribute attr = new AnimIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationGroupIdAttribute() {
+		PresentationGroupIdAttribute attr = (PresentationGroupIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "group-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @param presentationGroupIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationGroupIdAttribute(String presentationGroupIdValue) {
+		PresentationGroupIdAttribute attr = new PresentationGroupIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationGroupIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationMasterElementAttribute() {
+		PresentationMasterElementAttribute attr = (PresentationMasterElementAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "master-element");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @param presentationMasterElementValue   The type is <code>String</code>
+	 */
+	public void setPresentationMasterElementAttribute(String presentationMasterElementValue) {
+		PresentationMasterElementAttribute attr = new PresentationMasterElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationMasterElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNodeTypeAttribute() {
+		PresentationNodeTypeAttribute attr = (PresentationNodeTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "node-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationNodeTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @param presentationNodeTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationNodeTypeAttribute(String presentationNodeTypeValue) {
+		PresentationNodeTypeAttribute attr = new PresentationNodeTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNodeTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetClassAttribute() {
+		PresentationPresetClassAttribute attr = (PresentationPresetClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationPresetClassAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @param presentationPresetClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetClassAttribute(String presentationPresetClassValue) {
+		PresentationPresetClassAttribute attr = new PresentationPresetClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetIdAttribute() {
+		PresentationPresetIdAttribute attr = (PresentationPresetIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @param presentationPresetIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetIdAttribute(String presentationPresetIdValue) {
+		PresentationPresetIdAttribute attr = new PresentationPresetIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetSubTypeAttribute() {
+		PresentationPresetSubTypeAttribute attr = (PresentationPresetSubTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-sub-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @param presentationPresetSubTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetSubTypeAttribute(String presentationPresetSubTypeValue) {
+		PresentationPresetSubTypeAttribute attr = new PresentationPresetSubTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetSubTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndsyncAttribute</code> , See {@odf.attribute smil:endsync}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndsyncAttribute() {
+		SmilEndsyncAttribute attr = (SmilEndsyncAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "endsync");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndsyncAttribute</code> , See {@odf.attribute smil:endsync}
+	 *
+	 * @param smilEndsyncValue   The type is <code>String</code>
+	 */
+	public void setSmilEndsyncAttribute(String smilEndsyncValue) {
+		SmilEndsyncAttribute attr = new SmilEndsyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndsyncValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animate}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animate}
+	 */
+	 public AnimAnimateElement newAnimAnimateElement(String smilAttributeNameValue) {
+		AnimAnimateElement animAnimate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateElement.class);
+		animAnimate.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimate);
+		return animAnimate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateColor}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateColor}
+	 */
+	 public AnimAnimateColorElement newAnimAnimateColorElement(String smilAttributeNameValue) {
+		AnimAnimateColorElement animAnimateColor = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateColorElement.class);
+		animAnimateColor.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateColor);
+		return animAnimateColor;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateMotion}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateMotion}
+	 */
+	 public AnimAnimateMotionElement newAnimAnimateMotionElement(String smilAttributeNameValue) {
+		AnimAnimateMotionElement animAnimateMotion = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateMotionElement.class);
+		animAnimateMotion.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateMotion);
+		return animAnimateMotion;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateTransform}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @param svgTypeValue  the <code>String</code> value of <code>SvgTypeAttribute</code>, see {@odf.attribute  svg:type} at specification
+	 * @return the element {@odf.element anim:animateTransform}
+	 */
+	 public AnimAnimateTransformElement newAnimAnimateTransformElement(String smilAttributeNameValue, String svgTypeValue) {
+		AnimAnimateTransformElement animAnimateTransform = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateTransformElement.class);
+		animAnimateTransform.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		animAnimateTransform.setSvgTypeAttribute(svgTypeValue);
+		this.appendChild(animAnimateTransform);
+		return animAnimateTransform;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:audio}.
+	 *
+	 * @return the element {@odf.element anim:audio}
+	 */
+	public AnimAudioElement newAnimAudioElement() {
+		AnimAudioElement animAudio = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAudioElement.class);
+		this.appendChild(animAudio);
+		return animAudio;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:command}.
+	 *
+	 * @param animCommandValue  the <code>String</code> value of <code>AnimCommandAttribute</code>, see {@odf.attribute  anim:command} at specification
+	 * @return the element {@odf.element anim:command}
+	 */
+	 public AnimCommandElement newAnimCommandElement(String animCommandValue) {
+		AnimCommandElement animCommand = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimCommandElement.class);
+		animCommand.setAnimCommandAttribute(animCommandValue);
+		this.appendChild(animCommand);
+		return animCommand;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:iterate}.
+	 *
+	 * @return the element {@odf.element anim:iterate}
+	 */
+	public AnimIterateElement newAnimIterateElement() {
+		AnimIterateElement animIterate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimIterateElement.class);
+		this.appendChild(animIterate);
+		return animIterate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:par}.
+	 *
+	 * @return the element {@odf.element anim:par}
+	 */
+	public AnimParElement newAnimParElement() {
+		AnimParElement animPar = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimParElement.class);
+		this.appendChild(animPar);
+		return animPar;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:seq}.
+	 *
+	 * @return the element {@odf.element anim:seq}
+	 */
+	public AnimSeqElement newAnimSeqElement() {
+		AnimSeqElement animSeq = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSeqElement.class);
+		this.appendChild(animSeq);
+		return animSeq;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:set}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:set}
+	 */
+	 public AnimSetElement newAnimSetElement(String smilAttributeNameValue) {
+		AnimSetElement animSet = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSetElement.class);
+		animSet.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animSet);
+		return animSet;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:transitionFilter}.
+	 *
+	 * @param smilTypeValue  the <code>String</code> value of <code>SmilTypeAttribute</code>, see {@odf.attribute  smil:type} at specification
+	 * @return the element {@odf.element anim:transitionFilter}
+	 */
+	 public AnimTransitionFilterElement newAnimTransitionFilterElement(String smilTypeValue) {
+		AnimTransitionFilterElement animTransitionFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimTransitionFilterElement.class);
+		animTransitionFilter.setSmilTypeAttribute(smilTypeValue);
+		this.appendChild(animTransitionFilter);
+		return animTransitionFilter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimParamElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimParamElement.java
new file mode 100644
index 0000000..05663d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimParamElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:param}.
+ *
+ */
+public class AnimParamElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "param");
+
+	/**
+	 * Create the instance of <code>AnimParamElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimParamElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:param}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimNameAttribute</code> , See {@odf.attribute anim:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimNameAttribute() {
+		AnimNameAttribute attr = (AnimNameAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimNameAttribute</code> , See {@odf.attribute anim:name}
+	 *
+	 * @param animNameValue   The type is <code>String</code>
+	 */
+	public void setAnimNameAttribute(String animNameValue) {
+		AnimNameAttribute attr = new AnimNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimValueAttribute</code> , See {@odf.attribute anim:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimValueAttribute() {
+		AnimValueAttribute attr = (AnimValueAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimValueAttribute</code> , See {@odf.attribute anim:value}
+	 *
+	 * @param animValueValue   The type is <code>String</code>
+	 */
+	public void setAnimValueAttribute(String animValueValue) {
+		AnimValueAttribute attr = new AnimValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimSeqElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimSeqElement.java
new file mode 100644
index 0000000..aabadec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimSeqElement.java
@@ -0,0 +1,733 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationGroupIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMasterElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNodeTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresetSubTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndsyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:seq}.
+ *
+ */
+public class AnimSeqElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "seq");
+
+	/**
+	 * Create the instance of <code>AnimSeqElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimSeqElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:seq}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimIdAttribute() {
+		AnimIdAttribute attr = (AnimIdAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimIdAttribute</code> , See {@odf.attribute anim:id}
+	 *
+	 * @param animIdValue   The type is <code>String</code>
+	 */
+	public void setAnimIdAttribute(String animIdValue) {
+		AnimIdAttribute attr = new AnimIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationGroupIdAttribute() {
+		PresentationGroupIdAttribute attr = (PresentationGroupIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "group-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationGroupIdAttribute</code> , See {@odf.attribute presentation:group-id}
+	 *
+	 * @param presentationGroupIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationGroupIdAttribute(String presentationGroupIdValue) {
+		PresentationGroupIdAttribute attr = new PresentationGroupIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationGroupIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationMasterElementAttribute() {
+		PresentationMasterElementAttribute attr = (PresentationMasterElementAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "master-element");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMasterElementAttribute</code> , See {@odf.attribute presentation:master-element}
+	 *
+	 * @param presentationMasterElementValue   The type is <code>String</code>
+	 */
+	public void setPresentationMasterElementAttribute(String presentationMasterElementValue) {
+		PresentationMasterElementAttribute attr = new PresentationMasterElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationMasterElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNodeTypeAttribute() {
+		PresentationNodeTypeAttribute attr = (PresentationNodeTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "node-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationNodeTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNodeTypeAttribute</code> , See {@odf.attribute presentation:node-type}
+	 *
+	 * @param presentationNodeTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationNodeTypeAttribute(String presentationNodeTypeValue) {
+		PresentationNodeTypeAttribute attr = new PresentationNodeTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNodeTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetClassAttribute() {
+		PresentationPresetClassAttribute attr = (PresentationPresetClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationPresetClassAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetClassAttribute</code> , See {@odf.attribute presentation:preset-class}
+	 *
+	 * @param presentationPresetClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetClassAttribute(String presentationPresetClassValue) {
+		PresentationPresetClassAttribute attr = new PresentationPresetClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetIdAttribute() {
+		PresentationPresetIdAttribute attr = (PresentationPresetIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetIdAttribute</code> , See {@odf.attribute presentation:preset-id}
+	 *
+	 * @param presentationPresetIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetIdAttribute(String presentationPresetIdValue) {
+		PresentationPresetIdAttribute attr = new PresentationPresetIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresetSubTypeAttribute() {
+		PresentationPresetSubTypeAttribute attr = (PresentationPresetSubTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "preset-sub-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresetSubTypeAttribute</code> , See {@odf.attribute presentation:preset-sub-type}
+	 *
+	 * @param presentationPresetSubTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresetSubTypeAttribute(String presentationPresetSubTypeValue) {
+		PresentationPresetSubTypeAttribute attr = new PresentationPresetSubTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresetSubTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndsyncAttribute</code> , See {@odf.attribute smil:endsync}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndsyncAttribute() {
+		SmilEndsyncAttribute attr = (SmilEndsyncAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "endsync");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndsyncAttribute</code> , See {@odf.attribute smil:endsync}
+	 *
+	 * @param smilEndsyncValue   The type is <code>String</code>
+	 */
+	public void setSmilEndsyncAttribute(String smilEndsyncValue) {
+		SmilEndsyncAttribute attr = new SmilEndsyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndsyncValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animate}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animate}
+	 */
+	 public AnimAnimateElement newAnimAnimateElement(String smilAttributeNameValue) {
+		AnimAnimateElement animAnimate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateElement.class);
+		animAnimate.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimate);
+		return animAnimate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateColor}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateColor}
+	 */
+	 public AnimAnimateColorElement newAnimAnimateColorElement(String smilAttributeNameValue) {
+		AnimAnimateColorElement animAnimateColor = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateColorElement.class);
+		animAnimateColor.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateColor);
+		return animAnimateColor;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateMotion}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateMotion}
+	 */
+	 public AnimAnimateMotionElement newAnimAnimateMotionElement(String smilAttributeNameValue) {
+		AnimAnimateMotionElement animAnimateMotion = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateMotionElement.class);
+		animAnimateMotion.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateMotion);
+		return animAnimateMotion;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateTransform}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @param svgTypeValue  the <code>String</code> value of <code>SvgTypeAttribute</code>, see {@odf.attribute  svg:type} at specification
+	 * @return the element {@odf.element anim:animateTransform}
+	 */
+	 public AnimAnimateTransformElement newAnimAnimateTransformElement(String smilAttributeNameValue, String svgTypeValue) {
+		AnimAnimateTransformElement animAnimateTransform = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateTransformElement.class);
+		animAnimateTransform.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		animAnimateTransform.setSvgTypeAttribute(svgTypeValue);
+		this.appendChild(animAnimateTransform);
+		return animAnimateTransform;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:audio}.
+	 *
+	 * @return the element {@odf.element anim:audio}
+	 */
+	public AnimAudioElement newAnimAudioElement() {
+		AnimAudioElement animAudio = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAudioElement.class);
+		this.appendChild(animAudio);
+		return animAudio;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:command}.
+	 *
+	 * @param animCommandValue  the <code>String</code> value of <code>AnimCommandAttribute</code>, see {@odf.attribute  anim:command} at specification
+	 * @return the element {@odf.element anim:command}
+	 */
+	 public AnimCommandElement newAnimCommandElement(String animCommandValue) {
+		AnimCommandElement animCommand = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimCommandElement.class);
+		animCommand.setAnimCommandAttribute(animCommandValue);
+		this.appendChild(animCommand);
+		return animCommand;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:iterate}.
+	 *
+	 * @return the element {@odf.element anim:iterate}
+	 */
+	public AnimIterateElement newAnimIterateElement() {
+		AnimIterateElement animIterate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimIterateElement.class);
+		this.appendChild(animIterate);
+		return animIterate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:par}.
+	 *
+	 * @return the element {@odf.element anim:par}
+	 */
+	public AnimParElement newAnimParElement() {
+		AnimParElement animPar = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimParElement.class);
+		this.appendChild(animPar);
+		return animPar;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:seq}.
+	 *
+	 * @return the element {@odf.element anim:seq}
+	 */
+	public AnimSeqElement newAnimSeqElement() {
+		AnimSeqElement animSeq = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSeqElement.class);
+		this.appendChild(animSeq);
+		return animSeq;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:set}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:set}
+	 */
+	 public AnimSetElement newAnimSetElement(String smilAttributeNameValue) {
+		AnimSetElement animSet = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSetElement.class);
+		animSet.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animSet);
+		return animSet;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:transitionFilter}.
+	 *
+	 * @param smilTypeValue  the <code>String</code> value of <code>SmilTypeAttribute</code>, see {@odf.attribute  smil:type} at specification
+	 * @return the element {@odf.element anim:transitionFilter}
+	 */
+	 public AnimTransitionFilterElement newAnimTransitionFilterElement(String smilTypeValue) {
+		AnimTransitionFilterElement animTransitionFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimTransitionFilterElement.class);
+		animTransitionFilter.setSmilTypeAttribute(smilTypeValue);
+		this.appendChild(animTransitionFilter);
+		return animTransitionFilter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimSetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimSetElement.java
new file mode 100644
index 0000000..ad134f3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimSetElement.java
@@ -0,0 +1,523 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccumulateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAdditiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAttributeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilToAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:set}.
+ *
+ */
+public class AnimSetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "set");
+
+	/**
+	 * Create the instance of <code>AnimSetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimSetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:set}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccumulateAttribute() {
+		SmilAccumulateAttribute attr = (SmilAccumulateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accumulate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @param smilAccumulateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccumulateAttribute(String smilAccumulateValue) {
+		SmilAccumulateAttribute attr = new SmilAccumulateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccumulateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAdditiveAttribute() {
+		SmilAdditiveAttribute attr = (SmilAdditiveAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "additive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @param smilAdditiveValue   The type is <code>String</code>
+	 */
+	public void setSmilAdditiveAttribute(String smilAdditiveValue) {
+		SmilAdditiveAttribute attr = new SmilAdditiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAdditiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAttributeNameAttribute() {
+		SmilAttributeNameAttribute attr = (SmilAttributeNameAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "attributeName");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAttributeNameAttribute</code> , See {@odf.attribute smil:attributeName}
+	 *
+	 * @param smilAttributeNameValue   The type is <code>String</code>
+	 */
+	public void setSmilAttributeNameAttribute(String smilAttributeNameValue) {
+		SmilAttributeNameAttribute attr = new SmilAttributeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAttributeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilToAttribute() {
+		SmilToAttribute attr = (SmilToAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @param smilToValue   The type is <code>String</code>
+	 */
+	public void setSmilToAttribute(String smilToValue) {
+		SmilToAttribute attr = new SmilToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilToValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimTransitionFilterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimTransitionFilterElement.java
new file mode 100644
index 0000000..b348d1e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/anim/AnimTransitionFilterElement.java
@@ -0,0 +1,748 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.anim;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.anim.AnimSubItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAccumulateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAdditiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilAutoReverseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilBeginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilCalcModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDecelerateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFadeColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFillDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFromAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRepeatDurAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilRestartDefaultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilSubtypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTargetElementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilValuesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element anim:transitionFilter}.
+ *
+ */
+public class AnimTransitionFilterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.ANIM, "transitionFilter");
+
+	/**
+	 * Create the instance of <code>AnimTransitionFilterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public AnimTransitionFilterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element anim:transitionFilter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimFormulaAttribute() {
+		AnimFormulaAttribute attr = (AnimFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimFormulaAttribute</code> , See {@odf.attribute anim:formula}
+	 *
+	 * @param animFormulaValue   The type is <code>String</code>
+	 */
+	public void setAnimFormulaAttribute(String animFormulaValue) {
+		AnimFormulaAttribute attr = new AnimFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getAnimSubItemAttribute() {
+		AnimSubItemAttribute attr = (AnimSubItemAttribute) getOdfAttribute(OdfDocumentNamespace.ANIM, "sub-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AnimSubItemAttribute</code> , See {@odf.attribute anim:sub-item}
+	 *
+	 * @param animSubItemValue   The type is <code>String</code>
+	 */
+	public void setAnimSubItemAttribute(String animSubItemValue) {
+		AnimSubItemAttribute attr = new AnimSubItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(animSubItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccelerateAttribute() {
+		SmilAccelerateAttribute attr = (SmilAccelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilAccelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccelerateAttribute</code> , See {@odf.attribute smil:accelerate}
+	 *
+	 * @param smilAccelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccelerateAttribute(String smilAccelerateValue) {
+		SmilAccelerateAttribute attr = new SmilAccelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAccumulateAttribute() {
+		SmilAccumulateAttribute attr = (SmilAccumulateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "accumulate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAccumulateAttribute</code> , See {@odf.attribute smil:accumulate}
+	 *
+	 * @param smilAccumulateValue   The type is <code>String</code>
+	 */
+	public void setSmilAccumulateAttribute(String smilAccumulateValue) {
+		SmilAccumulateAttribute attr = new SmilAccumulateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAccumulateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilAdditiveAttribute() {
+		SmilAdditiveAttribute attr = (SmilAdditiveAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "additive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAdditiveAttribute</code> , See {@odf.attribute smil:additive}
+	 *
+	 * @param smilAdditiveValue   The type is <code>String</code>
+	 */
+	public void setSmilAdditiveAttribute(String smilAdditiveValue) {
+		SmilAdditiveAttribute attr = new SmilAdditiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilAdditiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getSmilAutoReverseAttribute() {
+		SmilAutoReverseAttribute attr = (SmilAutoReverseAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "autoReverse");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(SmilAutoReverseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilAutoReverseAttribute</code> , See {@odf.attribute smil:autoReverse}
+	 *
+	 * @param smilAutoReverseValue   The type is <code>Boolean</code>
+	 */
+	public void setSmilAutoReverseAttribute(Boolean smilAutoReverseValue) {
+		SmilAutoReverseAttribute attr = new SmilAutoReverseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(smilAutoReverseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilBeginAttribute() {
+		SmilBeginAttribute attr = (SmilBeginAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "begin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilBeginAttribute</code> , See {@odf.attribute smil:begin}
+	 *
+	 * @param smilBeginValue   The type is <code>String</code>
+	 */
+	public void setSmilBeginAttribute(String smilBeginValue) {
+		SmilBeginAttribute attr = new SmilBeginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilBeginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilByAttribute() {
+		SmilByAttribute attr = (SmilByAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilByAttribute</code> , See {@odf.attribute smil:by}
+	 *
+	 * @param smilByValue   The type is <code>String</code>
+	 */
+	public void setSmilByAttribute(String smilByValue) {
+		SmilByAttribute attr = new SmilByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilCalcModeAttribute() {
+		SmilCalcModeAttribute attr = (SmilCalcModeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "calcMode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilCalcModeAttribute</code> , See {@odf.attribute smil:calcMode}
+	 *
+	 * @param smilCalcModeValue   The type is <code>String</code>
+	 */
+	public void setSmilCalcModeAttribute(String smilCalcModeValue) {
+		SmilCalcModeAttribute attr = new SmilCalcModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilCalcModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDecelerateAttribute() {
+		SmilDecelerateAttribute attr = (SmilDecelerateAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "decelerate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDecelerateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDecelerateAttribute</code> , See {@odf.attribute smil:decelerate}
+	 *
+	 * @param smilDecelerateValue   The type is <code>String</code>
+	 */
+	public void setSmilDecelerateAttribute(String smilDecelerateValue) {
+		SmilDecelerateAttribute attr = new SmilDecelerateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDecelerateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDirectionAttribute</code> , See {@odf.attribute smil:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDirectionAttribute() {
+		SmilDirectionAttribute attr = (SmilDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDirectionAttribute</code> , See {@odf.attribute smil:direction}
+	 *
+	 * @param smilDirectionValue   The type is <code>String</code>
+	 */
+	public void setSmilDirectionAttribute(String smilDirectionValue) {
+		SmilDirectionAttribute attr = new SmilDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDurAttribute() {
+		SmilDurAttribute attr = (SmilDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "dur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDurAttribute</code> , See {@odf.attribute smil:dur}
+	 *
+	 * @param smilDurValue   The type is <code>String</code>
+	 */
+	public void setSmilDurAttribute(String smilDurValue) {
+		SmilDurAttribute attr = new SmilDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilEndAttribute() {
+		SmilEndAttribute attr = (SmilEndAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilEndAttribute</code> , See {@odf.attribute smil:end}
+	 *
+	 * @param smilEndValue   The type is <code>String</code>
+	 */
+	public void setSmilEndAttribute(String smilEndValue) {
+		SmilEndAttribute attr = new SmilEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFadeColorAttribute</code> , See {@odf.attribute smil:fadeColor}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFadeColorAttribute() {
+		SmilFadeColorAttribute attr = (SmilFadeColorAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fadeColor");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilFadeColorAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFadeColorAttribute</code> , See {@odf.attribute smil:fadeColor}
+	 *
+	 * @param smilFadeColorValue   The type is <code>String</code>
+	 */
+	public void setSmilFadeColorAttribute(String smilFadeColorValue) {
+		SmilFadeColorAttribute attr = new SmilFadeColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFadeColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillAttribute() {
+		SmilFillAttribute attr = (SmilFillAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillAttribute</code> , See {@odf.attribute smil:fill}
+	 *
+	 * @param smilFillValue   The type is <code>String</code>
+	 */
+	public void setSmilFillAttribute(String smilFillValue) {
+		SmilFillAttribute attr = new SmilFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFillDefaultAttribute() {
+		SmilFillDefaultAttribute attr = (SmilFillDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fillDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFillDefaultAttribute</code> , See {@odf.attribute smil:fillDefault}
+	 *
+	 * @param smilFillDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilFillDefaultAttribute(String smilFillDefaultValue) {
+		SmilFillDefaultAttribute attr = new SmilFillDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFillDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFromAttribute() {
+		SmilFromAttribute attr = (SmilFromAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "from");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFromAttribute</code> , See {@odf.attribute smil:from}
+	 *
+	 * @param smilFromValue   The type is <code>String</code>
+	 */
+	public void setSmilFromAttribute(String smilFromValue) {
+		SmilFromAttribute attr = new SmilFromAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFromValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilModeAttribute</code> , See {@odf.attribute smil:mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilModeAttribute() {
+		SmilModeAttribute attr = (SmilModeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilModeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilModeAttribute</code> , See {@odf.attribute smil:mode}
+	 *
+	 * @param smilModeValue   The type is <code>String</code>
+	 */
+	public void setSmilModeAttribute(String smilModeValue) {
+		SmilModeAttribute attr = new SmilModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatCountAttribute() {
+		SmilRepeatCountAttribute attr = (SmilRepeatCountAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatCount");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatCountAttribute</code> , See {@odf.attribute smil:repeatCount}
+	 *
+	 * @param smilRepeatCountValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatCountAttribute(String smilRepeatCountValue) {
+		SmilRepeatCountAttribute attr = new SmilRepeatCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatCountValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRepeatDurAttribute() {
+		SmilRepeatDurAttribute attr = (SmilRepeatDurAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "repeatDur");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRepeatDurAttribute</code> , See {@odf.attribute smil:repeatDur}
+	 *
+	 * @param smilRepeatDurValue   The type is <code>String</code>
+	 */
+	public void setSmilRepeatDurAttribute(String smilRepeatDurValue) {
+		SmilRepeatDurAttribute attr = new SmilRepeatDurAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRepeatDurValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartAttribute() {
+		SmilRestartAttribute attr = (SmilRestartAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restart");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartAttribute</code> , See {@odf.attribute smil:restart}
+	 *
+	 * @param smilRestartValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartAttribute(String smilRestartValue) {
+		SmilRestartAttribute attr = new SmilRestartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilRestartDefaultAttribute() {
+		SmilRestartDefaultAttribute attr = (SmilRestartDefaultAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "restartDefault");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilRestartDefaultAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilRestartDefaultAttribute</code> , See {@odf.attribute smil:restartDefault}
+	 *
+	 * @param smilRestartDefaultValue   The type is <code>String</code>
+	 */
+	public void setSmilRestartDefaultAttribute(String smilRestartDefaultValue) {
+		SmilRestartDefaultAttribute attr = new SmilRestartDefaultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilRestartDefaultValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilSubtypeAttribute</code> , See {@odf.attribute smil:subtype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilSubtypeAttribute() {
+		SmilSubtypeAttribute attr = (SmilSubtypeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "subtype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilSubtypeAttribute</code> , See {@odf.attribute smil:subtype}
+	 *
+	 * @param smilSubtypeValue   The type is <code>String</code>
+	 */
+	public void setSmilSubtypeAttribute(String smilSubtypeValue) {
+		SmilSubtypeAttribute attr = new SmilSubtypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilSubtypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTargetElementAttribute() {
+		SmilTargetElementAttribute attr = (SmilTargetElementAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "targetElement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTargetElementAttribute</code> , See {@odf.attribute smil:targetElement}
+	 *
+	 * @param smilTargetElementValue   The type is <code>String</code>
+	 */
+	public void setSmilTargetElementAttribute(String smilTargetElementValue) {
+		SmilTargetElementAttribute attr = new SmilTargetElementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTargetElementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilToAttribute() {
+		SmilToAttribute attr = (SmilToAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilToAttribute</code> , See {@odf.attribute smil:to}
+	 *
+	 * @param smilToValue   The type is <code>String</code>
+	 */
+	public void setSmilToAttribute(String smilToValue) {
+		SmilToAttribute attr = new SmilToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilToValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTypeAttribute</code> , See {@odf.attribute smil:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTypeAttribute() {
+		SmilTypeAttribute attr = (SmilTypeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTypeAttribute</code> , See {@odf.attribute smil:type}
+	 *
+	 * @param smilTypeValue   The type is <code>String</code>
+	 */
+	public void setSmilTypeAttribute(String smilTypeValue) {
+		SmilTypeAttribute attr = new SmilTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilValuesAttribute() {
+		SmilValuesAttribute attr = (SmilValuesAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "values");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilValuesAttribute</code> , See {@odf.attribute smil:values}
+	 *
+	 * @param smilValuesValue   The type is <code>String</code>
+	 */
+	public void setSmilValuesAttribute(String smilValuesValue) {
+		SmilValuesAttribute attr = new SmilValuesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilValuesValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartAxisElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartAxisElement.java
new file mode 100644
index 0000000..ee61d3e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartAxisElement.java
@@ -0,0 +1,183 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDimensionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:axis}.
+ *
+ */
+public class ChartAxisElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "axis");
+
+	/**
+	 * Create the instance of <code>ChartAxisElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartAxisElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:axis}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDimensionAttribute</code> , See {@odf.attribute chart:dimension}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartDimensionAttribute() {
+		ChartDimensionAttribute attr = (ChartDimensionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "dimension");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDimensionAttribute</code> , See {@odf.attribute chart:dimension}
+	 *
+	 * @param chartDimensionValue   The type is <code>String</code>
+	 */
+	public void setChartDimensionAttribute(String chartDimensionValue) {
+		ChartDimensionAttribute attr = new ChartDimensionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartDimensionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartNameAttribute</code> , See {@odf.attribute chart:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartNameAttribute() {
+		ChartNameAttribute attr = (ChartNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartNameAttribute</code> , See {@odf.attribute chart:name}
+	 *
+	 * @param chartNameValue   The type is <code>String</code>
+	 */
+	public void setChartNameAttribute(String chartNameValue) {
+		ChartNameAttribute attr = new ChartNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element chart:categories}.
+	 *
+	 * @return the element {@odf.element chart:categories}
+	 */
+	public ChartCategoriesElement newChartCategoriesElement() {
+		ChartCategoriesElement chartCategories = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartCategoriesElement.class);
+		this.appendChild(chartCategories);
+		return chartCategories;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:grid}.
+	 *
+	 * @return the element {@odf.element chart:grid}
+	 */
+	public ChartGridElement newChartGridElement() {
+		ChartGridElement chartGrid = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartGridElement.class);
+		this.appendChild(chartGrid);
+		return chartGrid;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:title}.
+	 *
+	 * @return the element {@odf.element chart:title}
+	 */
+	public ChartTitleElement newChartTitleElement() {
+		ChartTitleElement chartTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartTitleElement.class);
+		this.appendChild(chartTitle);
+		return chartTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartCategoriesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartCategoriesElement.java
new file mode 100644
index 0000000..b3a45e5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartCategoriesElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:categories}.
+ *
+ */
+public class ChartCategoriesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "categories");
+
+	/**
+	 * Create the instance of <code>ChartCategoriesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartCategoriesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:categories}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAddressAttribute() {
+		TableCellRangeAddressAttribute attr = (TableCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @param tableCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAddressAttribute(String tableCellRangeAddressValue) {
+		TableCellRangeAddressAttribute attr = new TableCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeAddressValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartChartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartChartElement.java
new file mode 100644
index 0000000..1aac1ea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartChartElement.java
@@ -0,0 +1,373 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartColumnMappingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartRowMappingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:chart}.
+ *
+ */
+public class ChartChartElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "chart");
+
+	/**
+	 * Create the instance of <code>ChartChartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartChartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:chart}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartClassAttribute</code> , See {@odf.attribute chart:class}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartClassAttribute() {
+		ChartClassAttribute attr = (ChartClassAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartClassAttribute</code> , See {@odf.attribute chart:class}
+	 *
+	 * @param chartClassValue   The type is <code>String</code>
+	 */
+	public void setChartClassAttribute(String chartClassValue) {
+		ChartClassAttribute attr = new ChartClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartColumnMappingAttribute</code> , See {@odf.attribute chart:column-mapping}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartColumnMappingAttribute() {
+		ChartColumnMappingAttribute attr = (ChartColumnMappingAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "column-mapping");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartColumnMappingAttribute</code> , See {@odf.attribute chart:column-mapping}
+	 *
+	 * @param chartColumnMappingValue   The type is <code>String</code>
+	 */
+	public void setChartColumnMappingAttribute(String chartColumnMappingValue) {
+		ChartColumnMappingAttribute attr = new ChartColumnMappingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartColumnMappingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartRowMappingAttribute</code> , See {@odf.attribute chart:row-mapping}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartRowMappingAttribute() {
+		ChartRowMappingAttribute attr = (ChartRowMappingAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "row-mapping");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartRowMappingAttribute</code> , See {@odf.attribute chart:row-mapping}
+	 *
+	 * @param chartRowMappingValue   The type is <code>String</code>
+	 */
+	public void setChartRowMappingAttribute(String chartRowMappingValue) {
+		ChartRowMappingAttribute attr = new ChartRowMappingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartRowMappingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element chart:footer}.
+	 *
+	 * @return the element {@odf.element chart:footer}
+	 */
+	public ChartFooterElement newChartFooterElement() {
+		ChartFooterElement chartFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartFooterElement.class);
+		this.appendChild(chartFooter);
+		return chartFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:legend}.
+	 *
+	 * @param chartLegendPositionValue  the <code>String</code> value of <code>ChartLegendPositionAttribute</code>, see {@odf.attribute  chart:legend-position} at specification
+	 * @param styleLegendExpansionValue  the <code>String</code> value of <code>StyleLegendExpansionAttribute</code>, see {@odf.attribute  style:legend-expansion} at specification
+	 * @return the element {@odf.element chart:legend}
+	 */
+	 public ChartLegendElement newChartLegendElement(String chartLegendPositionValue, String styleLegendExpansionValue) {
+		ChartLegendElement chartLegend = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartLegendElement.class);
+		chartLegend.setChartLegendPositionAttribute(chartLegendPositionValue);
+		chartLegend.setStyleLegendExpansionAttribute(styleLegendExpansionValue);
+		this.appendChild(chartLegend);
+		return chartLegend;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:plot-area}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element chart:plot-area}
+	 */
+	public ChartPlotAreaElement newChartPlotAreaElement() {
+		ChartPlotAreaElement chartPlotArea = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartPlotAreaElement.class);
+		this.appendChild(chartPlotArea);
+		return chartPlotArea;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:subtitle}.
+	 *
+	 * @return the element {@odf.element chart:subtitle}
+	 */
+	public ChartSubtitleElement newChartSubtitleElement() {
+		ChartSubtitleElement chartSubtitle = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartSubtitleElement.class);
+		this.appendChild(chartSubtitle);
+		return chartSubtitle;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:title}.
+	 *
+	 * @return the element {@odf.element chart:title}
+	 */
+	public ChartTitleElement newChartTitleElement() {
+		ChartTitleElement chartTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartTitleElement.class);
+		this.appendChild(chartTitle);
+		return chartTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDataLabelElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDataLabelElement.java
new file mode 100644
index 0000000..4992629
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDataLabelElement.java
@@ -0,0 +1,160 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:data-label}.
+ *
+ */
+public class ChartDataLabelElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "data-label");
+
+	/**
+	 * Create the instance of <code>ChartDataLabelElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartDataLabelElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:data-label}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDataPointElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDataPointElement.java
new file mode 100644
index 0000000..5812c70
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDataPointElement.java
@@ -0,0 +1,161 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartRepeatedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:data-point}.
+ *
+ */
+public class ChartDataPointElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "data-point");
+
+	/**
+	 * Create the instance of <code>ChartDataPointElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartDataPointElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:data-point}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartRepeatedAttribute</code> , See {@odf.attribute chart:repeated}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartRepeatedAttribute() {
+		ChartRepeatedAttribute attr = (ChartRepeatedAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "repeated");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartRepeatedAttribute</code> , See {@odf.attribute chart:repeated}
+	 *
+	 * @param chartRepeatedValue   The type is <code>Integer</code>
+	 */
+	public void setChartRepeatedAttribute(Integer chartRepeatedValue) {
+		ChartRepeatedAttribute attr = new ChartRepeatedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartRepeatedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element chart:data-label}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element chart:data-label}
+	 */
+	public ChartDataLabelElement newChartDataLabelElement() {
+		ChartDataLabelElement chartDataLabel = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartDataLabelElement.class);
+		this.appendChild(chartDataLabel);
+		return chartDataLabel;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDomainElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDomainElement.java
new file mode 100644
index 0000000..303f9ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartDomainElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:domain}.
+ *
+ */
+public class ChartDomainElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "domain");
+
+	/**
+	 * Create the instance of <code>ChartDomainElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartDomainElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:domain}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAddressAttribute() {
+		TableCellRangeAddressAttribute attr = (TableCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @param tableCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAddressAttribute(String tableCellRangeAddressValue) {
+		TableCellRangeAddressAttribute attr = new TableCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeAddressValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartEquationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartEquationElement.java
new file mode 100644
index 0000000..d664ee5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartEquationElement.java
@@ -0,0 +1,235 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAutomaticContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDisplayEquationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDisplayRSquareAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:equation}.
+ *
+ */
+public class ChartEquationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "equation");
+
+	/**
+	 * Create the instance of <code>ChartEquationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartEquationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:equation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAutomaticContentAttribute</code> , See {@odf.attribute chart:automatic-content}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartAutomaticContentAttribute() {
+		ChartAutomaticContentAttribute attr = (ChartAutomaticContentAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "automatic-content");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(ChartAutomaticContentAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAutomaticContentAttribute</code> , See {@odf.attribute chart:automatic-content}
+	 *
+	 * @param chartAutomaticContentValue   The type is <code>Boolean</code>
+	 */
+	public void setChartAutomaticContentAttribute(Boolean chartAutomaticContentValue) {
+		ChartAutomaticContentAttribute attr = new ChartAutomaticContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartAutomaticContentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDisplayEquationAttribute</code> , See {@odf.attribute chart:display-equation}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartDisplayEquationAttribute() {
+		ChartDisplayEquationAttribute attr = (ChartDisplayEquationAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "display-equation");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(ChartDisplayEquationAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDisplayEquationAttribute</code> , See {@odf.attribute chart:display-equation}
+	 *
+	 * @param chartDisplayEquationValue   The type is <code>Boolean</code>
+	 */
+	public void setChartDisplayEquationAttribute(Boolean chartDisplayEquationValue) {
+		ChartDisplayEquationAttribute attr = new ChartDisplayEquationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartDisplayEquationValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDisplayRSquareAttribute</code> , See {@odf.attribute chart:display-r-square}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartDisplayRSquareAttribute() {
+		ChartDisplayRSquareAttribute attr = (ChartDisplayRSquareAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "display-r-square");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(ChartDisplayRSquareAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDisplayRSquareAttribute</code> , See {@odf.attribute chart:display-r-square}
+	 *
+	 * @param chartDisplayRSquareValue   The type is <code>Boolean</code>
+	 */
+	public void setChartDisplayRSquareAttribute(Boolean chartDisplayRSquareValue) {
+		ChartDisplayRSquareAttribute attr = new ChartDisplayRSquareAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartDisplayRSquareValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartErrorIndicatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartErrorIndicatorElement.java
new file mode 100644
index 0000000..7948093
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartErrorIndicatorElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDimensionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:error-indicator}.
+ *
+ */
+public class ChartErrorIndicatorElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "error-indicator");
+
+	/**
+	 * Create the instance of <code>ChartErrorIndicatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartErrorIndicatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:error-indicator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDimensionAttribute</code> , See {@odf.attribute chart:dimension}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartDimensionAttribute() {
+		ChartDimensionAttribute attr = (ChartDimensionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "dimension");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDimensionAttribute</code> , See {@odf.attribute chart:dimension}
+	 *
+	 * @param chartDimensionValue   The type is <code>String</code>
+	 */
+	public void setChartDimensionAttribute(String chartDimensionValue) {
+		ChartDimensionAttribute attr = new ChartDimensionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartDimensionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartFloorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartFloorElement.java
new file mode 100644
index 0000000..38a0560
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartFloorElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:floor}.
+ *
+ */
+public class ChartFloorElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "floor");
+
+	/**
+	 * Create the instance of <code>ChartFloorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartFloorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:floor}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartFooterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartFooterElement.java
new file mode 100644
index 0000000..89bb908
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartFooterElement.java
@@ -0,0 +1,185 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:footer}.
+ *
+ */
+public class ChartFooterElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "footer");
+
+	/**
+	 * Create the instance of <code>ChartFooterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartFooterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:footer}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAttribute</code> , See {@odf.attribute table:cell-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAttribute() {
+		TableCellRangeAttribute attr = (TableCellRangeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAttribute</code> , See {@odf.attribute table:cell-range}
+	 *
+	 * @param tableCellRangeValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAttribute(String tableCellRangeValue) {
+		TableCellRangeAttribute attr = new TableCellRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartGridElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartGridElement.java
new file mode 100644
index 0000000..68df17b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartGridElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:grid}.
+ *
+ */
+public class ChartGridElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "grid");
+
+	/**
+	 * Create the instance of <code>ChartGridElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartGridElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:grid}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartClassAttribute</code> , See {@odf.attribute chart:class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartClassAttribute() {
+		ChartClassAttribute attr = (ChartClassAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return ChartClassAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartClassAttribute</code> , See {@odf.attribute chart:class}
+	 *
+	 * @param chartClassValue   The type is <code>String</code>
+	 */
+	public void setChartClassAttribute(String chartClassValue) {
+		ChartClassAttribute attr = new ChartClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartLabelSeparatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartLabelSeparatorElement.java
new file mode 100644
index 0000000..aed33c7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartLabelSeparatorElement.java
@@ -0,0 +1,87 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:label-separator}.
+ *
+ */
+public class ChartLabelSeparatorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "label-separator");
+
+	/**
+	 * Create the instance of <code>ChartLabelSeparatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartLabelSeparatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:label-separator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartLegendElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartLegendElement.java
new file mode 100644
index 0000000..9cd9115
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartLegendElement.java
@@ -0,0 +1,266 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLegendAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLegendPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLegendExpansionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLegendExpansionAspectRatioAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:legend}.
+ *
+ */
+public class ChartLegendElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "legend");
+
+	/**
+	 * Create the instance of <code>ChartLegendElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartLegendElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:legend}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLegendAlignAttribute</code> , See {@odf.attribute chart:legend-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartLegendAlignAttribute() {
+		ChartLegendAlignAttribute attr = (ChartLegendAlignAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "legend-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLegendAlignAttribute</code> , See {@odf.attribute chart:legend-align}
+	 *
+	 * @param chartLegendAlignValue   The type is <code>String</code>
+	 */
+	public void setChartLegendAlignAttribute(String chartLegendAlignValue) {
+		ChartLegendAlignAttribute attr = new ChartLegendAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartLegendAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLegendPositionAttribute</code> , See {@odf.attribute chart:legend-position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartLegendPositionAttribute() {
+		ChartLegendPositionAttribute attr = (ChartLegendPositionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "legend-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLegendPositionAttribute</code> , See {@odf.attribute chart:legend-position}
+	 *
+	 * @param chartLegendPositionValue   The type is <code>String</code>
+	 */
+	public void setChartLegendPositionAttribute(String chartLegendPositionValue) {
+		ChartLegendPositionAttribute attr = new ChartLegendPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartLegendPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLegendExpansionAttribute</code> , See {@odf.attribute style:legend-expansion}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLegendExpansionAttribute() {
+		StyleLegendExpansionAttribute attr = (StyleLegendExpansionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "legend-expansion");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLegendExpansionAttribute</code> , See {@odf.attribute style:legend-expansion}
+	 *
+	 * @param styleLegendExpansionValue   The type is <code>String</code>
+	 */
+	public void setStyleLegendExpansionAttribute(String styleLegendExpansionValue) {
+		StyleLegendExpansionAttribute attr = new StyleLegendExpansionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLegendExpansionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLegendExpansionAspectRatioAttribute</code> , See {@odf.attribute style:legend-expansion-aspect-ratio}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getStyleLegendExpansionAspectRatioAttribute() {
+		StyleLegendExpansionAspectRatioAttribute attr = (StyleLegendExpansionAspectRatioAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "legend-expansion-aspect-ratio");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLegendExpansionAspectRatioAttribute</code> , See {@odf.attribute style:legend-expansion-aspect-ratio}
+	 *
+	 * @param styleLegendExpansionAspectRatioValue   The type is <code>Double</code>
+	 */
+	public void setStyleLegendExpansionAspectRatioAttribute(Double styleLegendExpansionAspectRatioValue) {
+		StyleLegendExpansionAspectRatioAttribute attr = new StyleLegendExpansionAspectRatioAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(styleLegendExpansionAspectRatioValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartMeanValueElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartMeanValueElement.java
new file mode 100644
index 0000000..dfcf56b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartMeanValueElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:mean-value}.
+ *
+ */
+public class ChartMeanValueElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "mean-value");
+
+	/**
+	 * Create the instance of <code>ChartMeanValueElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartMeanValueElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:mean-value}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartPlotAreaElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartPlotAreaElement.java
new file mode 100644
index 0000000..38f4eb6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartPlotAreaElement.java
@@ -0,0 +1,641 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dLightElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDataSourceHasLabelsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dAmbientColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dFocalLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dLightingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dProjectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadeModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadowSlantAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVpnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVrpAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVupAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:plot-area}.
+ *
+ */
+public class ChartPlotAreaElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "plot-area");
+
+	/**
+	 * Create the instance of <code>ChartPlotAreaElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartPlotAreaElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:plot-area}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDataSourceHasLabelsAttribute</code> , See {@odf.attribute chart:data-source-has-labels}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartDataSourceHasLabelsAttribute() {
+		ChartDataSourceHasLabelsAttribute attr = (ChartDataSourceHasLabelsAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "data-source-has-labels");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return ChartDataSourceHasLabelsAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDataSourceHasLabelsAttribute</code> , See {@odf.attribute chart:data-source-has-labels}
+	 *
+	 * @param chartDataSourceHasLabelsValue   The type is <code>String</code>
+	 */
+	public void setChartDataSourceHasLabelsAttribute(String chartDataSourceHasLabelsValue) {
+		ChartDataSourceHasLabelsAttribute attr = new ChartDataSourceHasLabelsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartDataSourceHasLabelsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dAmbientColorAttribute</code> , See {@odf.attribute dr3d:ambient-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dAmbientColorAttribute() {
+		Dr3dAmbientColorAttribute attr = (Dr3dAmbientColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "ambient-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dAmbientColorAttribute</code> , See {@odf.attribute dr3d:ambient-color}
+	 *
+	 * @param dr3dAmbientColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dAmbientColorAttribute(String dr3dAmbientColorValue) {
+		Dr3dAmbientColorAttribute attr = new Dr3dAmbientColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dAmbientColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dDistanceAttribute</code> , See {@odf.attribute dr3d:distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dDistanceAttribute() {
+		Dr3dDistanceAttribute attr = (Dr3dDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dDistanceAttribute</code> , See {@odf.attribute dr3d:distance}
+	 *
+	 * @param dr3dDistanceValue   The type is <code>String</code>
+	 */
+	public void setDr3dDistanceAttribute(String dr3dDistanceValue) {
+		Dr3dDistanceAttribute attr = new Dr3dDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dFocalLengthAttribute</code> , See {@odf.attribute dr3d:focal-length}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dFocalLengthAttribute() {
+		Dr3dFocalLengthAttribute attr = (Dr3dFocalLengthAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "focal-length");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dFocalLengthAttribute</code> , See {@odf.attribute dr3d:focal-length}
+	 *
+	 * @param dr3dFocalLengthValue   The type is <code>String</code>
+	 */
+	public void setDr3dFocalLengthAttribute(String dr3dFocalLengthValue) {
+		Dr3dFocalLengthAttribute attr = new Dr3dFocalLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dFocalLengthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dLightingModeAttribute</code> , See {@odf.attribute dr3d:lighting-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dLightingModeAttribute() {
+		Dr3dLightingModeAttribute attr = (Dr3dLightingModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "lighting-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dLightingModeAttribute</code> , See {@odf.attribute dr3d:lighting-mode}
+	 *
+	 * @param dr3dLightingModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dLightingModeAttribute(String dr3dLightingModeValue) {
+		Dr3dLightingModeAttribute attr = new Dr3dLightingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dLightingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dProjectionAttribute</code> , See {@odf.attribute dr3d:projection}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dProjectionAttribute() {
+		Dr3dProjectionAttribute attr = (Dr3dProjectionAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "projection");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dProjectionAttribute</code> , See {@odf.attribute dr3d:projection}
+	 *
+	 * @param dr3dProjectionValue   The type is <code>String</code>
+	 */
+	public void setDr3dProjectionAttribute(String dr3dProjectionValue) {
+		Dr3dProjectionAttribute attr = new Dr3dProjectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dProjectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShadeModeAttribute</code> , See {@odf.attribute dr3d:shade-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShadeModeAttribute() {
+		Dr3dShadeModeAttribute attr = (Dr3dShadeModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shade-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShadeModeAttribute</code> , See {@odf.attribute dr3d:shade-mode}
+	 *
+	 * @param dr3dShadeModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dShadeModeAttribute(String dr3dShadeModeValue) {
+		Dr3dShadeModeAttribute attr = new Dr3dShadeModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShadeModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShadowSlantAttribute</code> , See {@odf.attribute dr3d:shadow-slant}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShadowSlantAttribute() {
+		Dr3dShadowSlantAttribute attr = (Dr3dShadowSlantAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shadow-slant");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShadowSlantAttribute</code> , See {@odf.attribute dr3d:shadow-slant}
+	 *
+	 * @param dr3dShadowSlantValue   The type is <code>String</code>
+	 */
+	public void setDr3dShadowSlantAttribute(String dr3dShadowSlantValue) {
+		Dr3dShadowSlantAttribute attr = new Dr3dShadowSlantAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShadowSlantValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTransformAttribute() {
+		Dr3dTransformAttribute attr = (Dr3dTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @param dr3dTransformValue   The type is <code>String</code>
+	 */
+	public void setDr3dTransformAttribute(String dr3dTransformValue) {
+		Dr3dTransformAttribute attr = new Dr3dTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVpnAttribute</code> , See {@odf.attribute dr3d:vpn}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dVpnAttribute() {
+		Dr3dVpnAttribute attr = (Dr3dVpnAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vpn");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVpnAttribute</code> , See {@odf.attribute dr3d:vpn}
+	 *
+	 * @param dr3dVpnValue   The type is <code>String</code>
+	 */
+	public void setDr3dVpnAttribute(String dr3dVpnValue) {
+		Dr3dVpnAttribute attr = new Dr3dVpnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dVpnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVrpAttribute</code> , See {@odf.attribute dr3d:vrp}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dVrpAttribute() {
+		Dr3dVrpAttribute attr = (Dr3dVrpAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vrp");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVrpAttribute</code> , See {@odf.attribute dr3d:vrp}
+	 *
+	 * @param dr3dVrpValue   The type is <code>String</code>
+	 */
+	public void setDr3dVrpAttribute(String dr3dVrpValue) {
+		Dr3dVrpAttribute attr = new Dr3dVrpAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dVrpValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVupAttribute</code> , See {@odf.attribute dr3d:vup}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dVupAttribute() {
+		Dr3dVupAttribute attr = (Dr3dVupAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vup");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVupAttribute</code> , See {@odf.attribute dr3d:vup}
+	 *
+	 * @param dr3dVupValue   The type is <code>String</code>
+	 */
+	public void setDr3dVupAttribute(String dr3dVupValue) {
+		Dr3dVupAttribute attr = new Dr3dVupAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dVupValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAddressAttribute() {
+		TableCellRangeAddressAttribute attr = (TableCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @param tableCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAddressAttribute(String tableCellRangeAddressValue) {
+		TableCellRangeAddressAttribute attr = new TableCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element chart:axis}.
+	 *
+	 * @param chartDimensionValue  the <code>String</code> value of <code>ChartDimensionAttribute</code>, see {@odf.attribute  chart:dimension} at specification
+	 * @return the element {@odf.element chart:axis}
+	 */
+	 public ChartAxisElement newChartAxisElement(String chartDimensionValue) {
+		ChartAxisElement chartAxis = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartAxisElement.class);
+		chartAxis.setChartDimensionAttribute(chartDimensionValue);
+		this.appendChild(chartAxis);
+		return chartAxis;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:floor}.
+	 *
+	 * @return the element {@odf.element chart:floor}
+	 */
+	public ChartFloorElement newChartFloorElement() {
+		ChartFloorElement chartFloor = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartFloorElement.class);
+		this.appendChild(chartFloor);
+		return chartFloor;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:series}.
+	 *
+	 * @return the element {@odf.element chart:series}
+	 */
+	public ChartSeriesElement newChartSeriesElement() {
+		ChartSeriesElement chartSeries = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartSeriesElement.class);
+		this.appendChild(chartSeries);
+		return chartSeries;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:stock-gain-marker}.
+	 *
+	 * @return the element {@odf.element chart:stock-gain-marker}
+	 */
+	public ChartStockGainMarkerElement newChartStockGainMarkerElement() {
+		ChartStockGainMarkerElement chartStockGainMarker = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartStockGainMarkerElement.class);
+		this.appendChild(chartStockGainMarker);
+		return chartStockGainMarker;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:stock-loss-marker}.
+	 *
+	 * @return the element {@odf.element chart:stock-loss-marker}
+	 */
+	public ChartStockLossMarkerElement newChartStockLossMarkerElement() {
+		ChartStockLossMarkerElement chartStockLossMarker = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartStockLossMarkerElement.class);
+		this.appendChild(chartStockLossMarker);
+		return chartStockLossMarker;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:stock-range-line}.
+	 *
+	 * @return the element {@odf.element chart:stock-range-line}
+	 */
+	public ChartStockRangeLineElement newChartStockRangeLineElement() {
+		ChartStockRangeLineElement chartStockRangeLine = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartStockRangeLineElement.class);
+		this.appendChild(chartStockRangeLine);
+		return chartStockRangeLine;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:wall}.
+	 *
+	 * @return the element {@odf.element chart:wall}
+	 */
+	public ChartWallElement newChartWallElement() {
+		ChartWallElement chartWall = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartWallElement.class);
+		this.appendChild(chartWall);
+		return chartWall;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:light}.
+	 *
+	 * @param dr3dDirectionValue  the <code>String</code> value of <code>Dr3dDirectionAttribute</code>, see {@odf.attribute  dr3d:direction} at specification
+	 * @return the element {@odf.element dr3d:light}
+	 */
+	 public Dr3dLightElement newDr3dLightElement(String dr3dDirectionValue) {
+		Dr3dLightElement dr3dLight = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dLightElement.class);
+		dr3dLight.setDr3dDirectionAttribute(dr3dDirectionValue);
+		this.appendChild(dr3dLight);
+		return dr3dLight;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartRegressionCurveElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartRegressionCurveElement.java
new file mode 100644
index 0000000..7375ba0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartRegressionCurveElement.java
@@ -0,0 +1,111 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:regression-curve}.
+ *
+ */
+public class ChartRegressionCurveElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "regression-curve");
+
+	/**
+	 * Create the instance of <code>ChartRegressionCurveElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartRegressionCurveElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:regression-curve}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element chart:equation}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element chart:equation}
+	 */
+	public ChartEquationElement newChartEquationElement() {
+		ChartEquationElement chartEquation = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartEquationElement.class);
+		this.appendChild(chartEquation);
+		return chartEquation;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSeriesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSeriesElement.java
new file mode 100644
index 0000000..3075abc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSeriesElement.java
@@ -0,0 +1,293 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAttachedAxisAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLabelCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartValuesCellRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:series}.
+ *
+ */
+public class ChartSeriesElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "series");
+
+	/**
+	 * Create the instance of <code>ChartSeriesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartSeriesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:series}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAttachedAxisAttribute</code> , See {@odf.attribute chart:attached-axis}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartAttachedAxisAttribute() {
+		ChartAttachedAxisAttribute attr = (ChartAttachedAxisAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "attached-axis");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAttachedAxisAttribute</code> , See {@odf.attribute chart:attached-axis}
+	 *
+	 * @param chartAttachedAxisValue   The type is <code>String</code>
+	 */
+	public void setChartAttachedAxisAttribute(String chartAttachedAxisValue) {
+		ChartAttachedAxisAttribute attr = new ChartAttachedAxisAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartAttachedAxisValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartClassAttribute</code> , See {@odf.attribute chart:class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartClassAttribute() {
+		ChartClassAttribute attr = (ChartClassAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartClassAttribute</code> , See {@odf.attribute chart:class}
+	 *
+	 * @param chartClassValue   The type is <code>String</code>
+	 */
+	public void setChartClassAttribute(String chartClassValue) {
+		ChartClassAttribute attr = new ChartClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLabelCellAddressAttribute</code> , See {@odf.attribute chart:label-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartLabelCellAddressAttribute() {
+		ChartLabelCellAddressAttribute attr = (ChartLabelCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "label-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLabelCellAddressAttribute</code> , See {@odf.attribute chart:label-cell-address}
+	 *
+	 * @param chartLabelCellAddressValue   The type is <code>String</code>
+	 */
+	public void setChartLabelCellAddressAttribute(String chartLabelCellAddressValue) {
+		ChartLabelCellAddressAttribute attr = new ChartLabelCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartLabelCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartValuesCellRangeAddressAttribute</code> , See {@odf.attribute chart:values-cell-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartValuesCellRangeAddressAttribute() {
+		ChartValuesCellRangeAddressAttribute attr = (ChartValuesCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "values-cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartValuesCellRangeAddressAttribute</code> , See {@odf.attribute chart:values-cell-range-address}
+	 *
+	 * @param chartValuesCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setChartValuesCellRangeAddressAttribute(String chartValuesCellRangeAddressValue) {
+		ChartValuesCellRangeAddressAttribute attr = new ChartValuesCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartValuesCellRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element chart:data-label}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element chart:data-label}
+	 */
+	public ChartDataLabelElement newChartDataLabelElement() {
+		ChartDataLabelElement chartDataLabel = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartDataLabelElement.class);
+		this.appendChild(chartDataLabel);
+		return chartDataLabel;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:data-point}.
+	 *
+	 * @return the element {@odf.element chart:data-point}
+	 */
+	public ChartDataPointElement newChartDataPointElement() {
+		ChartDataPointElement chartDataPoint = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartDataPointElement.class);
+		this.appendChild(chartDataPoint);
+		return chartDataPoint;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:domain}.
+	 *
+	 * @return the element {@odf.element chart:domain}
+	 */
+	public ChartDomainElement newChartDomainElement() {
+		ChartDomainElement chartDomain = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartDomainElement.class);
+		this.appendChild(chartDomain);
+		return chartDomain;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:error-indicator}.
+	 *
+	 * @param chartDimensionValue  the <code>String</code> value of <code>ChartDimensionAttribute</code>, see {@odf.attribute  chart:dimension} at specification
+	 * @return the element {@odf.element chart:error-indicator}
+	 */
+	 public ChartErrorIndicatorElement newChartErrorIndicatorElement(String chartDimensionValue) {
+		ChartErrorIndicatorElement chartErrorIndicator = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartErrorIndicatorElement.class);
+		chartErrorIndicator.setChartDimensionAttribute(chartDimensionValue);
+		this.appendChild(chartErrorIndicator);
+		return chartErrorIndicator;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:mean-value}.
+	 *
+	 * @return the element {@odf.element chart:mean-value}
+	 */
+	public ChartMeanValueElement newChartMeanValueElement() {
+		ChartMeanValueElement chartMeanValue = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartMeanValueElement.class);
+		this.appendChild(chartMeanValue);
+		return chartMeanValue;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:regression-curve}.
+	 *
+	 * @return the element {@odf.element chart:regression-curve}
+	 */
+	public ChartRegressionCurveElement newChartRegressionCurveElement() {
+		ChartRegressionCurveElement chartRegressionCurve = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartRegressionCurveElement.class);
+		this.appendChild(chartRegressionCurve);
+		return chartRegressionCurve;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockGainMarkerElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockGainMarkerElement.java
new file mode 100644
index 0000000..748bef5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockGainMarkerElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:stock-gain-marker}.
+ *
+ */
+public class ChartStockGainMarkerElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "stock-gain-marker");
+
+	/**
+	 * Create the instance of <code>ChartStockGainMarkerElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartStockGainMarkerElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:stock-gain-marker}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockLossMarkerElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockLossMarkerElement.java
new file mode 100644
index 0000000..1e0ed98
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockLossMarkerElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:stock-loss-marker}.
+ *
+ */
+public class ChartStockLossMarkerElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "stock-loss-marker");
+
+	/**
+	 * Create the instance of <code>ChartStockLossMarkerElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartStockLossMarkerElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:stock-loss-marker}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockRangeLineElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockRangeLineElement.java
new file mode 100644
index 0000000..690421f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartStockRangeLineElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:stock-range-line}.
+ *
+ */
+public class ChartStockRangeLineElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "stock-range-line");
+
+	/**
+	 * Create the instance of <code>ChartStockRangeLineElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartStockRangeLineElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:stock-range-line}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSubtitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSubtitleElement.java
new file mode 100644
index 0000000..71c5958
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSubtitleElement.java
@@ -0,0 +1,185 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:subtitle}.
+ *
+ */
+public class ChartSubtitleElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "subtitle");
+
+	/**
+	 * Create the instance of <code>ChartSubtitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartSubtitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:subtitle}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAttribute</code> , See {@odf.attribute table:cell-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAttribute() {
+		TableCellRangeAttribute attr = (TableCellRangeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAttribute</code> , See {@odf.attribute table:cell-range}
+	 *
+	 * @param tableCellRangeValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAttribute(String tableCellRangeValue) {
+		TableCellRangeAttribute attr = new TableCellRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSymbolImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSymbolImageElement.java
new file mode 100644
index 0000000..5301cab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartSymbolImageElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:symbol-image}.
+ *
+ */
+public class ChartSymbolImageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "symbol-image");
+
+	/**
+	 * Create the instance of <code>ChartSymbolImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartSymbolImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:symbol-image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartTitleElement.java
new file mode 100644
index 0000000..3f54fff
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartTitleElement.java
@@ -0,0 +1,185 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:title}.
+ *
+ */
+public class ChartTitleElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "title");
+
+	/**
+	 * Create the instance of <code>ChartTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAttribute</code> , See {@odf.attribute table:cell-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAttribute() {
+		TableCellRangeAttribute attr = (TableCellRangeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAttribute</code> , See {@odf.attribute table:cell-range}
+	 *
+	 * @param tableCellRangeValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAttribute(String tableCellRangeValue) {
+		TableCellRangeAttribute attr = new TableCellRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartWallElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartWallElement.java
new file mode 100644
index 0000000..5ff9b70
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/chart/ChartWallElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.chart;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element chart:wall}.
+ *
+ */
+public class ChartWallElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CHART, "wall");
+
+	/**
+	 * Create the instance of <code>ChartWallElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ChartWallElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Chart, OdfName.newName(OdfDocumentNamespace.CHART, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element chart:wall}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartStyleNameAttribute() {
+		ChartStyleNameAttribute attr = (ChartStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStyleNameAttribute</code> , See {@odf.attribute chart:style-name}
+	 *
+	 * @param chartStyleNameValue   The type is <code>String</code>
+	 */
+	public void setChartStyleNameAttribute(String chartStyleNameValue) {
+		ChartStyleNameAttribute attr = new ChartStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemElement.java
new file mode 100644
index 0000000..4ef456d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemElement.java
@@ -0,0 +1,133 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.config;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.config.ConfigNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.config.ConfigTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element config:config-item}.
+ *
+ */
+public class ConfigConfigItemElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "config-item");
+
+	/**
+	 * Create the instance of <code>ConfigConfigItemElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ConfigConfigItemElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element config:config-item}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getConfigNameAttribute() {
+		ConfigNameAttribute attr = (ConfigNameAttribute) getOdfAttribute(OdfDocumentNamespace.CONFIG, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * @param configNameValue   The type is <code>String</code>
+	 */
+	public void setConfigNameAttribute(String configNameValue) {
+		ConfigNameAttribute attr = new ConfigNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(configNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ConfigTypeAttribute</code> , See {@odf.attribute config:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getConfigTypeAttribute() {
+		ConfigTypeAttribute attr = (ConfigTypeAttribute) getOdfAttribute(OdfDocumentNamespace.CONFIG, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ConfigTypeAttribute</code> , See {@odf.attribute config:type}
+	 *
+	 * @param configTypeValue   The type is <code>String</code>
+	 */
+	public void setConfigTypeAttribute(String configTypeValue) {
+		ConfigTypeAttribute attr = new ConfigTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(configTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapEntryElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapEntryElement.java
new file mode 100644
index 0000000..989cba8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapEntryElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.config;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.config.ConfigNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element config:config-item-map-entry}.
+ *
+ */
+public class ConfigConfigItemMapEntryElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "config-item-map-entry");
+
+	/**
+	 * Create the instance of <code>ConfigConfigItemMapEntryElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ConfigConfigItemMapEntryElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element config:config-item-map-entry}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getConfigNameAttribute() {
+		ConfigNameAttribute attr = (ConfigNameAttribute) getOdfAttribute(OdfDocumentNamespace.CONFIG, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * @param configNameValue   The type is <code>String</code>
+	 */
+	public void setConfigNameAttribute(String configNameValue) {
+		ConfigNameAttribute attr = new ConfigNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(configNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @param configTypeValue  the <code>String</code> value of <code>ConfigTypeAttribute</code>, see {@odf.attribute  config:type} at specification
+	 * @return the element {@odf.element config:config-item}
+	 */
+	 public ConfigConfigItemElement newConfigConfigItemElement(String configNameValue, String configTypeValue) {
+		ConfigConfigItemElement configConfigItem = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemElement.class);
+		configConfigItem.setConfigNameAttribute(configNameValue);
+		configConfigItem.setConfigTypeAttribute(configTypeValue);
+		this.appendChild(configConfigItem);
+		return configConfigItem;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-map-indexed}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @return the element {@odf.element config:config-item-map-indexed}
+	 */
+	 public ConfigConfigItemMapIndexedElement newConfigConfigItemMapIndexedElement(String configNameValue) {
+		ConfigConfigItemMapIndexedElement configConfigItemMapIndexed = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemMapIndexedElement.class);
+		configConfigItemMapIndexed.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemMapIndexed);
+		return configConfigItemMapIndexed;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-map-named}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @return the element {@odf.element config:config-item-map-named}
+	 */
+	 public ConfigConfigItemMapNamedElement newConfigConfigItemMapNamedElement(String configNameValue) {
+		ConfigConfigItemMapNamedElement configConfigItemMapNamed = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemMapNamedElement.class);
+		configConfigItemMapNamed.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemMapNamed);
+		return configConfigItemMapNamed;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-set}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @return the element {@odf.element config:config-item-set}
+	 */
+	 public ConfigConfigItemSetElement newConfigConfigItemSetElement(String configNameValue) {
+		ConfigConfigItemSetElement configConfigItemSet = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemSetElement.class);
+		configConfigItemSet.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemSet);
+		return configConfigItemSet;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapIndexedElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapIndexedElement.java
new file mode 100644
index 0000000..b23306c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapIndexedElement.java
@@ -0,0 +1,111 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.config;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.config.ConfigNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element config:config-item-map-indexed}.
+ *
+ */
+public class ConfigConfigItemMapIndexedElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "config-item-map-indexed");
+
+	/**
+	 * Create the instance of <code>ConfigConfigItemMapIndexedElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ConfigConfigItemMapIndexedElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element config:config-item-map-indexed}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getConfigNameAttribute() {
+		ConfigNameAttribute attr = (ConfigNameAttribute) getOdfAttribute(OdfDocumentNamespace.CONFIG, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * @param configNameValue   The type is <code>String</code>
+	 */
+	public void setConfigNameAttribute(String configNameValue) {
+		ConfigNameAttribute attr = new ConfigNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(configNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-map-entry}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element config:config-item-map-entry}
+	 */
+	public ConfigConfigItemMapEntryElement newConfigConfigItemMapEntryElement() {
+		ConfigConfigItemMapEntryElement configConfigItemMapEntry = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemMapEntryElement.class);
+		this.appendChild(configConfigItemMapEntry);
+		return configConfigItemMapEntry;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapNamedElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapNamedElement.java
new file mode 100644
index 0000000..2e8813b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemMapNamedElement.java
@@ -0,0 +1,111 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.config;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.config.ConfigNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element config:config-item-map-named}.
+ *
+ */
+public class ConfigConfigItemMapNamedElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "config-item-map-named");
+
+	/**
+	 * Create the instance of <code>ConfigConfigItemMapNamedElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ConfigConfigItemMapNamedElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element config:config-item-map-named}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getConfigNameAttribute() {
+		ConfigNameAttribute attr = (ConfigNameAttribute) getOdfAttribute(OdfDocumentNamespace.CONFIG, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * @param configNameValue   The type is <code>String</code>
+	 */
+	public void setConfigNameAttribute(String configNameValue) {
+		ConfigNameAttribute attr = new ConfigNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(configNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-map-entry}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element config:config-item-map-entry}
+	 */
+	public ConfigConfigItemMapEntryElement newConfigConfigItemMapEntryElement() {
+		ConfigConfigItemMapEntryElement configConfigItemMapEntry = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemMapEntryElement.class);
+		this.appendChild(configConfigItemMapEntry);
+		return configConfigItemMapEntry;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemSetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemSetElement.java
new file mode 100644
index 0000000..f4b05a2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/config/ConfigConfigItemSetElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.config;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.config.ConfigNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element config:config-item-set}.
+ *
+ */
+public class ConfigConfigItemSetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.CONFIG, "config-item-set");
+
+	/**
+	 * Create the instance of <code>ConfigConfigItemSetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ConfigConfigItemSetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element config:config-item-set}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getConfigNameAttribute() {
+		ConfigNameAttribute attr = (ConfigNameAttribute) getOdfAttribute(OdfDocumentNamespace.CONFIG, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ConfigNameAttribute</code> , See {@odf.attribute config:name}
+	 *
+	 * @param configNameValue   The type is <code>String</code>
+	 */
+	public void setConfigNameAttribute(String configNameValue) {
+		ConfigNameAttribute attr = new ConfigNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(configNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @param configTypeValue  the <code>String</code> value of <code>ConfigTypeAttribute</code>, see {@odf.attribute  config:type} at specification
+	 * @return the element {@odf.element config:config-item}
+	 */
+	 public ConfigConfigItemElement newConfigConfigItemElement(String configNameValue, String configTypeValue) {
+		ConfigConfigItemElement configConfigItem = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemElement.class);
+		configConfigItem.setConfigNameAttribute(configNameValue);
+		configConfigItem.setConfigTypeAttribute(configTypeValue);
+		this.appendChild(configConfigItem);
+		return configConfigItem;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-map-indexed}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @return the element {@odf.element config:config-item-map-indexed}
+	 */
+	 public ConfigConfigItemMapIndexedElement newConfigConfigItemMapIndexedElement(String configNameValue) {
+		ConfigConfigItemMapIndexedElement configConfigItemMapIndexed = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemMapIndexedElement.class);
+		configConfigItemMapIndexed.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemMapIndexed);
+		return configConfigItemMapIndexed;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-map-named}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * @return the element {@odf.element config:config-item-map-named}
+	 */
+	 public ConfigConfigItemMapNamedElement newConfigConfigItemMapNamedElement(String configNameValue) {
+		ConfigConfigItemMapNamedElement configConfigItemMapNamed = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemMapNamedElement.class);
+		configConfigItemMapNamed.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemMapNamed);
+		return configConfigItemMapNamed;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-set}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element config:config-item-set}
+	 */
+	 public ConfigConfigItemSetElement newConfigConfigItemSetElement(String configNameValue) {
+		ConfigConfigItemSetElement configConfigItemSet = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemSetElement.class);
+		configConfigItemSet.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemSet);
+		return configConfigItemSet;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbApplicationConnectionSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbApplicationConnectionSettingsElement.java
new file mode 100644
index 0000000..8077ca9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbApplicationConnectionSettingsElement.java
@@ -0,0 +1,310 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbAppendTableAliasNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbBooleanComparisonModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbEnableSql92CheckAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIgnoreDriverPrivilegesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsTableNameLengthLimitedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbMaxRowCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbSuppressVersionColumnsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbUseCatalogAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:application-connection-settings}.
+ *
+ */
+public class DbApplicationConnectionSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "application-connection-settings");
+
+	/**
+	 * Create the instance of <code>DbApplicationConnectionSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbApplicationConnectionSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:application-connection-settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbAppendTableAliasNameAttribute</code> , See {@odf.attribute db:append-table-alias-name}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbAppendTableAliasNameAttribute() {
+		DbAppendTableAliasNameAttribute attr = (DbAppendTableAliasNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "append-table-alias-name");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbAppendTableAliasNameAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbAppendTableAliasNameAttribute</code> , See {@odf.attribute db:append-table-alias-name}
+	 *
+	 * @param dbAppendTableAliasNameValue   The type is <code>Boolean</code>
+	 */
+	public void setDbAppendTableAliasNameAttribute(Boolean dbAppendTableAliasNameValue) {
+		DbAppendTableAliasNameAttribute attr = new DbAppendTableAliasNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbAppendTableAliasNameValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbBooleanComparisonModeAttribute</code> , See {@odf.attribute db:boolean-comparison-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbBooleanComparisonModeAttribute() {
+		DbBooleanComparisonModeAttribute attr = (DbBooleanComparisonModeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "boolean-comparison-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbBooleanComparisonModeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbBooleanComparisonModeAttribute</code> , See {@odf.attribute db:boolean-comparison-mode}
+	 *
+	 * @param dbBooleanComparisonModeValue   The type is <code>String</code>
+	 */
+	public void setDbBooleanComparisonModeAttribute(String dbBooleanComparisonModeValue) {
+		DbBooleanComparisonModeAttribute attr = new DbBooleanComparisonModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbBooleanComparisonModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbEnableSql92CheckAttribute</code> , See {@odf.attribute db:enable-sql92-check}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbEnableSql92CheckAttribute() {
+		DbEnableSql92CheckAttribute attr = (DbEnableSql92CheckAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "enable-sql92-check");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbEnableSql92CheckAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbEnableSql92CheckAttribute</code> , See {@odf.attribute db:enable-sql92-check}
+	 *
+	 * @param dbEnableSql92CheckValue   The type is <code>Boolean</code>
+	 */
+	public void setDbEnableSql92CheckAttribute(Boolean dbEnableSql92CheckValue) {
+		DbEnableSql92CheckAttribute attr = new DbEnableSql92CheckAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbEnableSql92CheckValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIgnoreDriverPrivilegesAttribute</code> , See {@odf.attribute db:ignore-driver-privileges}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIgnoreDriverPrivilegesAttribute() {
+		DbIgnoreDriverPrivilegesAttribute attr = (DbIgnoreDriverPrivilegesAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "ignore-driver-privileges");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbIgnoreDriverPrivilegesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIgnoreDriverPrivilegesAttribute</code> , See {@odf.attribute db:ignore-driver-privileges}
+	 *
+	 * @param dbIgnoreDriverPrivilegesValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIgnoreDriverPrivilegesAttribute(Boolean dbIgnoreDriverPrivilegesValue) {
+		DbIgnoreDriverPrivilegesAttribute attr = new DbIgnoreDriverPrivilegesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIgnoreDriverPrivilegesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsTableNameLengthLimitedAttribute</code> , See {@odf.attribute db:is-table-name-length-limited}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsTableNameLengthLimitedAttribute() {
+		DbIsTableNameLengthLimitedAttribute attr = (DbIsTableNameLengthLimitedAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-table-name-length-limited");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbIsTableNameLengthLimitedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsTableNameLengthLimitedAttribute</code> , See {@odf.attribute db:is-table-name-length-limited}
+	 *
+	 * @param dbIsTableNameLengthLimitedValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsTableNameLengthLimitedAttribute(Boolean dbIsTableNameLengthLimitedValue) {
+		DbIsTableNameLengthLimitedAttribute attr = new DbIsTableNameLengthLimitedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsTableNameLengthLimitedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbMaxRowCountAttribute</code> , See {@odf.attribute db:max-row-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDbMaxRowCountAttribute() {
+		DbMaxRowCountAttribute attr = (DbMaxRowCountAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "max-row-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbMaxRowCountAttribute</code> , See {@odf.attribute db:max-row-count}
+	 *
+	 * @param dbMaxRowCountValue   The type is <code>Integer</code>
+	 */
+	public void setDbMaxRowCountAttribute(Integer dbMaxRowCountValue) {
+		DbMaxRowCountAttribute attr = new DbMaxRowCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dbMaxRowCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbSuppressVersionColumnsAttribute</code> , See {@odf.attribute db:suppress-version-columns}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbSuppressVersionColumnsAttribute() {
+		DbSuppressVersionColumnsAttribute attr = (DbSuppressVersionColumnsAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "suppress-version-columns");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbSuppressVersionColumnsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbSuppressVersionColumnsAttribute</code> , See {@odf.attribute db:suppress-version-columns}
+	 *
+	 * @param dbSuppressVersionColumnsValue   The type is <code>Boolean</code>
+	 */
+	public void setDbSuppressVersionColumnsAttribute(Boolean dbSuppressVersionColumnsValue) {
+		DbSuppressVersionColumnsAttribute attr = new DbSuppressVersionColumnsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbSuppressVersionColumnsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbUseCatalogAttribute</code> , See {@odf.attribute db:use-catalog}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbUseCatalogAttribute() {
+		DbUseCatalogAttribute attr = (DbUseCatalogAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "use-catalog");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbUseCatalogAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbUseCatalogAttribute</code> , See {@odf.attribute db:use-catalog}
+	 *
+	 * @param dbUseCatalogValue   The type is <code>Boolean</code>
+	 */
+	public void setDbUseCatalogAttribute(Boolean dbUseCatalogValue) {
+		DbUseCatalogAttribute attr = new DbUseCatalogAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbUseCatalogValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element db:data-source-settings}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:data-source-settings}
+	 */
+	public DbDataSourceSettingsElement newDbDataSourceSettingsElement() {
+		DbDataSourceSettingsElement dbDataSourceSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDataSourceSettingsElement.class);
+		this.appendChild(dbDataSourceSettings);
+		return dbDataSourceSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-filter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-filter}
+	 */
+	public DbTableFilterElement newDbTableFilterElement() {
+		DbTableFilterElement dbTableFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableFilterElement.class);
+		this.appendChild(dbTableFilter);
+		return dbTableFilter;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-type-filter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-type-filter}
+	 */
+	public DbTableTypeFilterElement newDbTableTypeFilterElement() {
+		DbTableTypeFilterElement dbTableTypeFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableTypeFilterElement.class);
+		this.appendChild(dbTableTypeFilter);
+		return dbTableTypeFilter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbAutoIncrementElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbAutoIncrementElement.java
new file mode 100644
index 0000000..d6f5268
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbAutoIncrementElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbAdditionalColumnStatementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbRowRetrievingStatementAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:auto-increment}.
+ *
+ */
+public class DbAutoIncrementElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "auto-increment");
+
+	/**
+	 * Create the instance of <code>DbAutoIncrementElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbAutoIncrementElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:auto-increment}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbAdditionalColumnStatementAttribute</code> , See {@odf.attribute db:additional-column-statement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbAdditionalColumnStatementAttribute() {
+		DbAdditionalColumnStatementAttribute attr = (DbAdditionalColumnStatementAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "additional-column-statement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbAdditionalColumnStatementAttribute</code> , See {@odf.attribute db:additional-column-statement}
+	 *
+	 * @param dbAdditionalColumnStatementValue   The type is <code>String</code>
+	 */
+	public void setDbAdditionalColumnStatementAttribute(String dbAdditionalColumnStatementValue) {
+		DbAdditionalColumnStatementAttribute attr = new DbAdditionalColumnStatementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbAdditionalColumnStatementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbRowRetrievingStatementAttribute</code> , See {@odf.attribute db:row-retrieving-statement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbRowRetrievingStatementAttribute() {
+		DbRowRetrievingStatementAttribute attr = (DbRowRetrievingStatementAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "row-retrieving-statement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbRowRetrievingStatementAttribute</code> , See {@odf.attribute db:row-retrieving-statement}
+	 *
+	 * @param dbRowRetrievingStatementValue   The type is <code>String</code>
+	 */
+	public void setDbRowRetrievingStatementAttribute(String dbRowRetrievingStatementValue) {
+		DbRowRetrievingStatementAttribute attr = new DbRowRetrievingStatementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbRowRetrievingStatementValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbCharacterSetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbCharacterSetElement.java
new file mode 100644
index 0000000..0205d37
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbCharacterSetElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbEncodingAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:character-set}.
+ *
+ */
+public class DbCharacterSetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "character-set");
+
+	/**
+	 * Create the instance of <code>DbCharacterSetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbCharacterSetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:character-set}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbEncodingAttribute</code> , See {@odf.attribute db:encoding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbEncodingAttribute() {
+		DbEncodingAttribute attr = (DbEncodingAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "encoding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbEncodingAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbEncodingAttribute</code> , See {@odf.attribute db:encoding}
+	 *
+	 * @param dbEncodingValue   The type is <code>String</code>
+	 */
+	public void setDbEncodingAttribute(String dbEncodingValue) {
+		DbEncodingAttribute attr = new DbEncodingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbEncodingValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnDefinitionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnDefinitionElement.java
new file mode 100644
index 0000000..2929e2a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnDefinitionElement.java
@@ -0,0 +1,452 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDataTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsAutoincrementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsEmptyAllowedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsNullableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbPrecisionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbScaleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTypeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:column-definition}.
+ *
+ */
+public class DbColumnDefinitionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "column-definition");
+
+	/**
+	 * Create the instance of <code>DbColumnDefinitionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbColumnDefinitionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:column-definition}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDataTypeAttribute</code> , See {@odf.attribute db:data-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDataTypeAttribute() {
+		DbDataTypeAttribute attr = (DbDataTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "data-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDataTypeAttribute</code> , See {@odf.attribute db:data-type}
+	 *
+	 * @param dbDataTypeValue   The type is <code>String</code>
+	 */
+	public void setDbDataTypeAttribute(String dbDataTypeValue) {
+		DbDataTypeAttribute attr = new DbDataTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDataTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsAutoincrementAttribute</code> , See {@odf.attribute db:is-autoincrement}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsAutoincrementAttribute() {
+		DbIsAutoincrementAttribute attr = (DbIsAutoincrementAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-autoincrement");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsAutoincrementAttribute</code> , See {@odf.attribute db:is-autoincrement}
+	 *
+	 * @param dbIsAutoincrementValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsAutoincrementAttribute(Boolean dbIsAutoincrementValue) {
+		DbIsAutoincrementAttribute attr = new DbIsAutoincrementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsAutoincrementValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsEmptyAllowedAttribute</code> , See {@odf.attribute db:is-empty-allowed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsEmptyAllowedAttribute() {
+		DbIsEmptyAllowedAttribute attr = (DbIsEmptyAllowedAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-empty-allowed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsEmptyAllowedAttribute</code> , See {@odf.attribute db:is-empty-allowed}
+	 *
+	 * @param dbIsEmptyAllowedValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsEmptyAllowedAttribute(Boolean dbIsEmptyAllowedValue) {
+		DbIsEmptyAllowedAttribute attr = new DbIsEmptyAllowedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsEmptyAllowedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsNullableAttribute</code> , See {@odf.attribute db:is-nullable}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbIsNullableAttribute() {
+		DbIsNullableAttribute attr = (DbIsNullableAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-nullable");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsNullableAttribute</code> , See {@odf.attribute db:is-nullable}
+	 *
+	 * @param dbIsNullableValue   The type is <code>String</code>
+	 */
+	public void setDbIsNullableAttribute(String dbIsNullableValue) {
+		DbIsNullableAttribute attr = new DbIsNullableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbIsNullableValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbPrecisionAttribute</code> , See {@odf.attribute db:precision}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDbPrecisionAttribute() {
+		DbPrecisionAttribute attr = (DbPrecisionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "precision");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbPrecisionAttribute</code> , See {@odf.attribute db:precision}
+	 *
+	 * @param dbPrecisionValue   The type is <code>Integer</code>
+	 */
+	public void setDbPrecisionAttribute(Integer dbPrecisionValue) {
+		DbPrecisionAttribute attr = new DbPrecisionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dbPrecisionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbScaleAttribute</code> , See {@odf.attribute db:scale}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDbScaleAttribute() {
+		DbScaleAttribute attr = (DbScaleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "scale");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbScaleAttribute</code> , See {@odf.attribute db:scale}
+	 *
+	 * @param dbScaleValue   The type is <code>Integer</code>
+	 */
+	public void setDbScaleAttribute(Integer dbScaleValue) {
+		DbScaleAttribute attr = new DbScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dbScaleValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTypeNameAttribute</code> , See {@odf.attribute db:type-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTypeNameAttribute() {
+		DbTypeNameAttribute attr = (DbTypeNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "type-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTypeNameAttribute</code> , See {@odf.attribute db:type-name}
+	 *
+	 * @param dbTypeNameValue   The type is <code>String</code>
+	 */
+	public void setDbTypeNameAttribute(String dbTypeNameValue) {
+		DbTypeNameAttribute attr = new DbTypeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTypeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnDefinitionsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnDefinitionsElement.java
new file mode 100644
index 0000000..4e40d3b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnDefinitionsElement.java
@@ -0,0 +1,92 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:column-definitions}.
+ *
+ */
+public class DbColumnDefinitionsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "column-definitions");
+
+	/**
+	 * Create the instance of <code>DbColumnDefinitionsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbColumnDefinitionsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:column-definitions}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:column-definition}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:column-definition}
+	 */
+	 public DbColumnDefinitionElement newDbColumnDefinitionElement(String dbNameValue, double officeValueValue, String officeValueTypeValue) {
+		DbColumnDefinitionElement dbColumnDefinition = ((OdfFileDom) this.ownerDocument).newOdfElement(DbColumnDefinitionElement.class);
+		dbColumnDefinition.setDbNameAttribute(dbNameValue);
+		dbColumnDefinition.setOfficeValueAttribute(officeValueValue);
+		dbColumnDefinition.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(dbColumnDefinition);
+		return dbColumnDefinition;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnElement.java
new file mode 100644
index 0000000..892cc76
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnElement.java
@@ -0,0 +1,402 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDefaultCellStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbVisibleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:column}.
+ *
+ */
+public class DbColumnElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "column");
+
+	/**
+	 * Create the instance of <code>DbColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDefaultCellStyleNameAttribute</code> , See {@odf.attribute db:default-cell-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDefaultCellStyleNameAttribute() {
+		DbDefaultCellStyleNameAttribute attr = (DbDefaultCellStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "default-cell-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDefaultCellStyleNameAttribute</code> , See {@odf.attribute db:default-cell-style-name}
+	 *
+	 * @param dbDefaultCellStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDbDefaultCellStyleNameAttribute(String dbDefaultCellStyleNameValue) {
+		DbDefaultCellStyleNameAttribute attr = new DbDefaultCellStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDefaultCellStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDescriptionAttribute() {
+		DbDescriptionAttribute attr = (DbDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @param dbDescriptionValue   The type is <code>String</code>
+	 */
+	public void setDbDescriptionAttribute(String dbDescriptionValue) {
+		DbDescriptionAttribute attr = new DbDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbStyleNameAttribute</code> , See {@odf.attribute db:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbStyleNameAttribute() {
+		DbStyleNameAttribute attr = (DbStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbStyleNameAttribute</code> , See {@odf.attribute db:style-name}
+	 *
+	 * @param dbStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDbStyleNameAttribute(String dbStyleNameValue) {
+		DbStyleNameAttribute attr = new DbStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTitleAttribute() {
+		DbTitleAttribute attr = (DbTitleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @param dbTitleValue   The type is <code>String</code>
+	 */
+	public void setDbTitleAttribute(String dbTitleValue) {
+		DbTitleAttribute attr = new DbTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbVisibleAttribute</code> , See {@odf.attribute db:visible}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbVisibleAttribute() {
+		DbVisibleAttribute attr = (DbVisibleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "visible");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbVisibleAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbVisibleAttribute</code> , See {@odf.attribute db:visible}
+	 *
+	 * @param dbVisibleValue   The type is <code>Boolean</code>
+	 */
+	public void setDbVisibleAttribute(Boolean dbVisibleValue) {
+		DbVisibleAttribute attr = new DbVisibleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbVisibleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnsElement.java
new file mode 100644
index 0000000..f759fed
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbColumnsElement.java
@@ -0,0 +1,92 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:columns}.
+ *
+ */
+public class DbColumnsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "columns");
+
+	/**
+	 * Create the instance of <code>DbColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:column}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:column}
+	 */
+	 public DbColumnElement newDbColumnElement(String dbNameValue, double officeValueValue, String officeValueTypeValue) {
+		DbColumnElement dbColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(DbColumnElement.class);
+		dbColumn.setDbNameAttribute(dbNameValue);
+		dbColumn.setOfficeValueAttribute(officeValueValue);
+		dbColumn.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(dbColumn);
+		return dbColumn;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbComponentCollectionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbComponentCollectionElement.java
new file mode 100644
index 0000000..3886782
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbComponentCollectionElement.java
@@ -0,0 +1,178 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTitleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:component-collection}.
+ *
+ */
+public class DbComponentCollectionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "component-collection");
+
+	/**
+	 * Create the instance of <code>DbComponentCollectionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbComponentCollectionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:component-collection}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDescriptionAttribute() {
+		DbDescriptionAttribute attr = (DbDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @param dbDescriptionValue   The type is <code>String</code>
+	 */
+	public void setDbDescriptionAttribute(String dbDescriptionValue) {
+		DbDescriptionAttribute attr = new DbDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTitleAttribute() {
+		DbTitleAttribute attr = (DbTitleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @param dbTitleValue   The type is <code>String</code>
+	 */
+	public void setDbTitleAttribute(String dbTitleValue) {
+		DbTitleAttribute attr = new DbTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTitleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:component}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:component}
+	 */
+	 public DbComponentElement newDbComponentElement(String dbNameValue) {
+		DbComponentElement dbComponent = ((OdfFileDom) this.ownerDocument).newOdfElement(DbComponentElement.class);
+		dbComponent.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbComponent);
+		return dbComponent;
+	}
+
+	/**
+	 * Create child element {@odf.element db:component-collection}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:component-collection}
+	 */
+	 public DbComponentCollectionElement newDbComponentCollectionElement(String dbNameValue) {
+		DbComponentCollectionElement dbComponentCollection = ((OdfFileDom) this.ownerDocument).newOdfElement(DbComponentCollectionElement.class);
+		dbComponentCollection.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbComponentCollection);
+		return dbComponentCollection;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbComponentElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbComponentElement.java
new file mode 100644
index 0000000..61d94fc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbComponentElement.java
@@ -0,0 +1,305 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.math.MathMathElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentElement;
+import org.odftoolkit.odfdom.dom.attribute.db.DbAsTemplateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:component}.
+ *
+ */
+public class DbComponentElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "component");
+
+	/**
+	 * Create the instance of <code>DbComponentElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbComponentElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:component}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbAsTemplateAttribute</code> , See {@odf.attribute db:as-template}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbAsTemplateAttribute() {
+		DbAsTemplateAttribute attr = (DbAsTemplateAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "as-template");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbAsTemplateAttribute</code> , See {@odf.attribute db:as-template}
+	 *
+	 * @param dbAsTemplateValue   The type is <code>Boolean</code>
+	 */
+	public void setDbAsTemplateAttribute(Boolean dbAsTemplateValue) {
+		DbAsTemplateAttribute attr = new DbAsTemplateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbAsTemplateValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDescriptionAttribute() {
+		DbDescriptionAttribute attr = (DbDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @param dbDescriptionValue   The type is <code>String</code>
+	 */
+	public void setDbDescriptionAttribute(String dbDescriptionValue) {
+		DbDescriptionAttribute attr = new DbDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTitleAttribute() {
+		DbTitleAttribute attr = (DbTitleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @param dbTitleValue   The type is <code>String</code>
+	 */
+	public void setDbTitleAttribute(String dbTitleValue) {
+		DbTitleAttribute attr = new DbTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element math:math}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element math:math}
+	 */
+	public MathMathElement newMathMathElement() {
+		MathMathElement mathMath = ((OdfFileDom) this.ownerDocument).newOdfElement(MathMathElement.class);
+		this.appendChild(mathMath);
+		return mathMath;
+	}
+
+	/**
+	 * Create child element {@odf.element office:document}.
+	 *
+	 * @param officeMimetypeValue  the <code>String</code> value of <code>OfficeMimetypeAttribute</code>, see {@odf.attribute  office:mimetype} at specification
+	 * @param officeVersionValue  the <code>String</code> value of <code>OfficeVersionAttribute</code>, see {@odf.attribute  office:version} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:document}
+	 */
+	 public OfficeDocumentElement newOfficeDocumentElement(String officeMimetypeValue, String officeVersionValue) {
+		OfficeDocumentElement officeDocument = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDocumentElement.class);
+		officeDocument.setOfficeMimetypeAttribute(officeMimetypeValue);
+		officeDocument.setOfficeVersionAttribute(officeVersionValue);
+		this.appendChild(officeDocument);
+		return officeDocument;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbConnectionDataElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbConnectionDataElement.java
new file mode 100644
index 0000000..2adf74b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbConnectionDataElement.java
@@ -0,0 +1,114 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:connection-data}.
+ *
+ */
+public class DbConnectionDataElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "connection-data");
+
+	/**
+	 * Create the instance of <code>DbConnectionDataElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbConnectionDataElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:connection-data}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:connection-resource}
+	 */
+	 public DbConnectionResourceElement newDbConnectionResourceElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DbConnectionResourceElement dbConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(DbConnectionResourceElement.class);
+		dbConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		dbConnectionResource.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(dbConnectionResource);
+		return dbConnectionResource;
+	}
+
+	/**
+	 * Create child element {@odf.element db:database-description}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:database-description}
+	 */
+	public DbDatabaseDescriptionElement newDbDatabaseDescriptionElement() {
+		DbDatabaseDescriptionElement dbDatabaseDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDatabaseDescriptionElement.class);
+		this.appendChild(dbDatabaseDescription);
+		return dbDatabaseDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element db:login}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:login}
+	 */
+	public DbLoginElement newDbLoginElement() {
+		DbLoginElement dbLogin = ((OdfFileDom) this.ownerDocument).newOdfElement(DbLoginElement.class);
+		this.appendChild(dbLogin);
+		return dbLogin;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbConnectionResourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbConnectionResourceElement.java
new file mode 100644
index 0000000..9f79621
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbConnectionResourceElement.java
@@ -0,0 +1,175 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:connection-resource}.
+ *
+ */
+public class DbConnectionResourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "connection-resource");
+
+	/**
+	 * Create the instance of <code>DbConnectionResourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbConnectionResourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:connection-resource}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_NONE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceElement.java
new file mode 100644
index 0000000..2448188
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceElement.java
@@ -0,0 +1,112 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:data-source}.
+ *
+ */
+public class DbDataSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source");
+
+	/**
+	 * Create the instance of <code>DbDataSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:data-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:application-connection-settings}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:application-connection-settings}
+	 */
+	public DbApplicationConnectionSettingsElement newDbApplicationConnectionSettingsElement() {
+		DbApplicationConnectionSettingsElement dbApplicationConnectionSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(DbApplicationConnectionSettingsElement.class);
+		this.appendChild(dbApplicationConnectionSettings);
+		return dbApplicationConnectionSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element db:connection-data}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:connection-data}
+	 */
+	public DbConnectionDataElement newDbConnectionDataElement() {
+		DbConnectionDataElement dbConnectionData = ((OdfFileDom) this.ownerDocument).newOdfElement(DbConnectionDataElement.class);
+		this.appendChild(dbConnectionData);
+		return dbConnectionData;
+	}
+
+	/**
+	 * Create child element {@odf.element db:driver-settings}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:driver-settings}
+	 */
+	public DbDriverSettingsElement newDbDriverSettingsElement() {
+		DbDriverSettingsElement dbDriverSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDriverSettingsElement.class);
+		this.appendChild(dbDriverSettings);
+		return dbDriverSettings;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingElement.java
new file mode 100644
index 0000000..c7fec3e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingElement.java
@@ -0,0 +1,165 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDataSourceSettingIsListAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDataSourceSettingNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDataSourceSettingTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:data-source-setting}.
+ *
+ */
+public class DbDataSourceSettingElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source-setting");
+
+	/**
+	 * Create the instance of <code>DbDataSourceSettingElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceSettingElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:data-source-setting}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDataSourceSettingIsListAttribute</code> , See {@odf.attribute db:data-source-setting-is-list}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbDataSourceSettingIsListAttribute() {
+		DbDataSourceSettingIsListAttribute attr = (DbDataSourceSettingIsListAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "data-source-setting-is-list");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDataSourceSettingIsListAttribute</code> , See {@odf.attribute db:data-source-setting-is-list}
+	 *
+	 * @param dbDataSourceSettingIsListValue   The type is <code>Boolean</code>
+	 */
+	public void setDbDataSourceSettingIsListAttribute(Boolean dbDataSourceSettingIsListValue) {
+		DbDataSourceSettingIsListAttribute attr = new DbDataSourceSettingIsListAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbDataSourceSettingIsListValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDataSourceSettingNameAttribute</code> , See {@odf.attribute db:data-source-setting-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDataSourceSettingNameAttribute() {
+		DbDataSourceSettingNameAttribute attr = (DbDataSourceSettingNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "data-source-setting-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDataSourceSettingNameAttribute</code> , See {@odf.attribute db:data-source-setting-name}
+	 *
+	 * @param dbDataSourceSettingNameValue   The type is <code>String</code>
+	 */
+	public void setDbDataSourceSettingNameAttribute(String dbDataSourceSettingNameValue) {
+		DbDataSourceSettingNameAttribute attr = new DbDataSourceSettingNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDataSourceSettingNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDataSourceSettingTypeAttribute</code> , See {@odf.attribute db:data-source-setting-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDataSourceSettingTypeAttribute() {
+		DbDataSourceSettingTypeAttribute attr = (DbDataSourceSettingTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "data-source-setting-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDataSourceSettingTypeAttribute</code> , See {@odf.attribute db:data-source-setting-type}
+	 *
+	 * @param dbDataSourceSettingTypeValue   The type is <code>String</code>
+	 */
+	public void setDbDataSourceSettingTypeAttribute(String dbDataSourceSettingTypeValue) {
+		DbDataSourceSettingTypeAttribute attr = new DbDataSourceSettingTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDataSourceSettingTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:data-source-setting-value}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:data-source-setting-value}
+	 */
+	public DbDataSourceSettingValueElement newDbDataSourceSettingValueElement() {
+		DbDataSourceSettingValueElement dbDataSourceSettingValue = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDataSourceSettingValueElement.class);
+		this.appendChild(dbDataSourceSettingValue);
+		return dbDataSourceSettingValue;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingValueElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingValueElement.java
new file mode 100644
index 0000000..c873df1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingValueElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:data-source-setting-value}.
+ *
+ */
+public class DbDataSourceSettingValueElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source-setting-value");
+
+	/**
+	 * Create the instance of <code>DbDataSourceSettingValueElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceSettingValueElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:data-source-setting-value}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingsElement.java
new file mode 100644
index 0000000..19533a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDataSourceSettingsElement.java
@@ -0,0 +1,90 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:data-source-settings}.
+ *
+ */
+public class DbDataSourceSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "data-source-settings");
+
+	/**
+	 * Create the instance of <code>DbDataSourceSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDataSourceSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:data-source-settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:data-source-setting}.
+	 *
+	 * @param dbDataSourceSettingNameValue  the <code>String</code> value of <code>DbDataSourceSettingNameAttribute</code>, see {@odf.attribute  db:data-source-setting-name} at specification
+	 * @param dbDataSourceSettingTypeValue  the <code>String</code> value of <code>DbDataSourceSettingTypeAttribute</code>, see {@odf.attribute  db:data-source-setting-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:data-source-setting}
+	 */
+	 public DbDataSourceSettingElement newDbDataSourceSettingElement(String dbDataSourceSettingNameValue, String dbDataSourceSettingTypeValue) {
+		DbDataSourceSettingElement dbDataSourceSetting = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDataSourceSettingElement.class);
+		dbDataSourceSetting.setDbDataSourceSettingNameAttribute(dbDataSourceSettingNameValue);
+		dbDataSourceSetting.setDbDataSourceSettingTypeAttribute(dbDataSourceSettingTypeValue);
+		this.appendChild(dbDataSourceSetting);
+		return dbDataSourceSetting;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDatabaseDescriptionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDatabaseDescriptionElement.java
new file mode 100644
index 0000000..0524d61
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDatabaseDescriptionElement.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:database-description}.
+ *
+ */
+public class DbDatabaseDescriptionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "database-description");
+
+	/**
+	 * Create the instance of <code>DbDatabaseDescriptionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDatabaseDescriptionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:database-description}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:file-based-database}.
+	 *
+	 * @param dbMediaTypeValue  the <code>String</code> value of <code>DbMediaTypeAttribute</code>, see {@odf.attribute  db:media-type} at specification
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:file-based-database}
+	 */
+	 public DbFileBasedDatabaseElement newDbFileBasedDatabaseElement(String dbMediaTypeValue, String xlinkHrefValue, String xlinkTypeValue) {
+		DbFileBasedDatabaseElement dbFileBasedDatabase = ((OdfFileDom) this.ownerDocument).newOdfElement(DbFileBasedDatabaseElement.class);
+		dbFileBasedDatabase.setDbMediaTypeAttribute(dbMediaTypeValue);
+		dbFileBasedDatabase.setXlinkHrefAttribute(xlinkHrefValue);
+		dbFileBasedDatabase.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(dbFileBasedDatabase);
+		return dbFileBasedDatabase;
+	}
+
+	/**
+	 * Create child element {@odf.element db:server-database}.
+	 *
+	 * @param dbTypeValue  the <code>String</code> value of <code>DbTypeAttribute</code>, see {@odf.attribute  db:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:server-database}
+	 */
+	 public DbServerDatabaseElement newDbServerDatabaseElement(String dbTypeValue) {
+		DbServerDatabaseElement dbServerDatabase = ((OdfFileDom) this.ownerDocument).newOdfElement(DbServerDatabaseElement.class);
+		dbServerDatabase.setDbTypeAttribute(dbTypeValue);
+		this.appendChild(dbServerDatabase);
+		return dbServerDatabase;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDelimiterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDelimiterElement.java
new file mode 100644
index 0000000..eaea850
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDelimiterElement.java
@@ -0,0 +1,171 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDecimalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbStringAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbThousandAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:delimiter}.
+ *
+ */
+public class DbDelimiterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "delimiter");
+
+	/**
+	 * Create the instance of <code>DbDelimiterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDelimiterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:delimiter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDecimalAttribute</code> , See {@odf.attribute db:decimal}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDecimalAttribute() {
+		DbDecimalAttribute attr = (DbDecimalAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "decimal");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbDecimalAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDecimalAttribute</code> , See {@odf.attribute db:decimal}
+	 *
+	 * @param dbDecimalValue   The type is <code>String</code>
+	 */
+	public void setDbDecimalAttribute(String dbDecimalValue) {
+		DbDecimalAttribute attr = new DbDecimalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDecimalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbFieldAttribute</code> , See {@odf.attribute db:field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbFieldAttribute() {
+		DbFieldAttribute attr = (DbFieldAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbFieldAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbFieldAttribute</code> , See {@odf.attribute db:field}
+	 *
+	 * @param dbFieldValue   The type is <code>String</code>
+	 */
+	public void setDbFieldAttribute(String dbFieldValue) {
+		DbFieldAttribute attr = new DbFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbStringAttribute</code> , See {@odf.attribute db:string}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbStringAttribute() {
+		DbStringAttribute attr = (DbStringAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "string");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbStringAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbStringAttribute</code> , See {@odf.attribute db:string}
+	 *
+	 * @param dbStringValue   The type is <code>String</code>
+	 */
+	public void setDbStringAttribute(String dbStringValue) {
+		DbStringAttribute attr = new DbStringAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbStringValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbThousandAttribute</code> , See {@odf.attribute db:thousand}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbThousandAttribute() {
+		DbThousandAttribute attr = (DbThousandAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "thousand");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbThousandAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbThousandAttribute</code> , See {@odf.attribute db:thousand}
+	 *
+	 * @param dbThousandValue   The type is <code>String</code>
+	 */
+	public void setDbThousandAttribute(String dbThousandValue) {
+		DbThousandAttribute attr = new DbThousandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbThousandValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDriverSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDriverSettingsElement.java
new file mode 100644
index 0000000..5cbe2fa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbDriverSettingsElement.java
@@ -0,0 +1,248 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbBaseDnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsFirstRowHeaderLineAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbParameterNameSubstitutionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbShowDeletedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbSystemDriverSettingsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:driver-settings}.
+ *
+ */
+public class DbDriverSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "driver-settings");
+
+	/**
+	 * Create the instance of <code>DbDriverSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbDriverSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:driver-settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbBaseDnAttribute</code> , See {@odf.attribute db:base-dn}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbBaseDnAttribute() {
+		DbBaseDnAttribute attr = (DbBaseDnAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "base-dn");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbBaseDnAttribute</code> , See {@odf.attribute db:base-dn}
+	 *
+	 * @param dbBaseDnValue   The type is <code>String</code>
+	 */
+	public void setDbBaseDnAttribute(String dbBaseDnValue) {
+		DbBaseDnAttribute attr = new DbBaseDnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbBaseDnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsFirstRowHeaderLineAttribute</code> , See {@odf.attribute db:is-first-row-header-line}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsFirstRowHeaderLineAttribute() {
+		DbIsFirstRowHeaderLineAttribute attr = (DbIsFirstRowHeaderLineAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-first-row-header-line");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbIsFirstRowHeaderLineAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsFirstRowHeaderLineAttribute</code> , See {@odf.attribute db:is-first-row-header-line}
+	 *
+	 * @param dbIsFirstRowHeaderLineValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsFirstRowHeaderLineAttribute(Boolean dbIsFirstRowHeaderLineValue) {
+		DbIsFirstRowHeaderLineAttribute attr = new DbIsFirstRowHeaderLineAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsFirstRowHeaderLineValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbParameterNameSubstitutionAttribute</code> , See {@odf.attribute db:parameter-name-substitution}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbParameterNameSubstitutionAttribute() {
+		DbParameterNameSubstitutionAttribute attr = (DbParameterNameSubstitutionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "parameter-name-substitution");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbParameterNameSubstitutionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbParameterNameSubstitutionAttribute</code> , See {@odf.attribute db:parameter-name-substitution}
+	 *
+	 * @param dbParameterNameSubstitutionValue   The type is <code>Boolean</code>
+	 */
+	public void setDbParameterNameSubstitutionAttribute(Boolean dbParameterNameSubstitutionValue) {
+		DbParameterNameSubstitutionAttribute attr = new DbParameterNameSubstitutionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbParameterNameSubstitutionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbShowDeletedAttribute</code> , See {@odf.attribute db:show-deleted}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbShowDeletedAttribute() {
+		DbShowDeletedAttribute attr = (DbShowDeletedAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "show-deleted");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbShowDeletedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbShowDeletedAttribute</code> , See {@odf.attribute db:show-deleted}
+	 *
+	 * @param dbShowDeletedValue   The type is <code>Boolean</code>
+	 */
+	public void setDbShowDeletedAttribute(Boolean dbShowDeletedValue) {
+		DbShowDeletedAttribute attr = new DbShowDeletedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbShowDeletedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbSystemDriverSettingsAttribute</code> , See {@odf.attribute db:system-driver-settings}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbSystemDriverSettingsAttribute() {
+		DbSystemDriverSettingsAttribute attr = (DbSystemDriverSettingsAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "system-driver-settings");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbSystemDriverSettingsAttribute</code> , See {@odf.attribute db:system-driver-settings}
+	 *
+	 * @param dbSystemDriverSettingsValue   The type is <code>String</code>
+	 */
+	public void setDbSystemDriverSettingsAttribute(String dbSystemDriverSettingsValue) {
+		DbSystemDriverSettingsAttribute attr = new DbSystemDriverSettingsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbSystemDriverSettingsValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:auto-increment}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:auto-increment}
+	 */
+	public DbAutoIncrementElement newDbAutoIncrementElement() {
+		DbAutoIncrementElement dbAutoIncrement = ((OdfFileDom) this.ownerDocument).newOdfElement(DbAutoIncrementElement.class);
+		this.appendChild(dbAutoIncrement);
+		return dbAutoIncrement;
+	}
+
+	/**
+	 * Create child element {@odf.element db:character-set}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:character-set}
+	 */
+	public DbCharacterSetElement newDbCharacterSetElement() {
+		DbCharacterSetElement dbCharacterSet = ((OdfFileDom) this.ownerDocument).newOdfElement(DbCharacterSetElement.class);
+		this.appendChild(dbCharacterSet);
+		return dbCharacterSet;
+	}
+
+	/**
+	 * Create child element {@odf.element db:delimiter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:delimiter}
+	 */
+	public DbDelimiterElement newDbDelimiterElement() {
+		DbDelimiterElement dbDelimiter = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDelimiterElement.class);
+		this.appendChild(dbDelimiter);
+		return dbDelimiter;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-settings}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-settings}
+	 */
+	public DbTableSettingsElement newDbTableSettingsElement() {
+		DbTableSettingsElement dbTableSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableSettingsElement.class);
+		this.appendChild(dbTableSettings);
+		return dbTableSettings;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFileBasedDatabaseElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFileBasedDatabaseElement.java
new file mode 100644
index 0000000..50fcd76
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFileBasedDatabaseElement.java
@@ -0,0 +1,177 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbExtensionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbMediaTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:file-based-database}.
+ *
+ */
+public class DbFileBasedDatabaseElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "file-based-database");
+
+	/**
+	 * Create the instance of <code>DbFileBasedDatabaseElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbFileBasedDatabaseElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:file-based-database}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbExtensionAttribute</code> , See {@odf.attribute db:extension}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbExtensionAttribute() {
+		DbExtensionAttribute attr = (DbExtensionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "extension");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbExtensionAttribute</code> , See {@odf.attribute db:extension}
+	 *
+	 * @param dbExtensionValue   The type is <code>String</code>
+	 */
+	public void setDbExtensionAttribute(String dbExtensionValue) {
+		DbExtensionAttribute attr = new DbExtensionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbExtensionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbMediaTypeAttribute</code> , See {@odf.attribute db:media-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbMediaTypeAttribute() {
+		DbMediaTypeAttribute attr = (DbMediaTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "media-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbMediaTypeAttribute</code> , See {@odf.attribute db:media-type}
+	 *
+	 * @param dbMediaTypeValue   The type is <code>String</code>
+	 */
+	public void setDbMediaTypeAttribute(String dbMediaTypeValue) {
+		DbMediaTypeAttribute attr = new DbMediaTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbMediaTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFilterStatementElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFilterStatementElement.java
new file mode 100644
index 0000000..b5d3070
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFilterStatementElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbApplyCommandAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCommandAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:filter-statement}.
+ *
+ */
+public class DbFilterStatementElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "filter-statement");
+
+	/**
+	 * Create the instance of <code>DbFilterStatementElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbFilterStatementElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:filter-statement}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbApplyCommandAttribute</code> , See {@odf.attribute db:apply-command}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbApplyCommandAttribute() {
+		DbApplyCommandAttribute attr = (DbApplyCommandAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "apply-command");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbApplyCommandAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbApplyCommandAttribute</code> , See {@odf.attribute db:apply-command}
+	 *
+	 * @param dbApplyCommandValue   The type is <code>Boolean</code>
+	 */
+	public void setDbApplyCommandAttribute(Boolean dbApplyCommandValue) {
+		DbApplyCommandAttribute attr = new DbApplyCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbApplyCommandValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCommandAttribute</code> , See {@odf.attribute db:command}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCommandAttribute() {
+		DbCommandAttribute attr = (DbCommandAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "command");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCommandAttribute</code> , See {@odf.attribute db:command}
+	 *
+	 * @param dbCommandValue   The type is <code>String</code>
+	 */
+	public void setDbCommandAttribute(String dbCommandValue) {
+		DbCommandAttribute attr = new DbCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCommandValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFormsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFormsElement.java
new file mode 100644
index 0000000..f2b65ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbFormsElement.java
@@ -0,0 +1,101 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:forms}.
+ *
+ */
+public class DbFormsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "forms");
+
+	/**
+	 * Create the instance of <code>DbFormsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbFormsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:forms}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:component}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:component}
+	 */
+	 public DbComponentElement newDbComponentElement(String dbNameValue) {
+		DbComponentElement dbComponent = ((OdfFileDom) this.ownerDocument).newOdfElement(DbComponentElement.class);
+		dbComponent.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbComponent);
+		return dbComponent;
+	}
+
+	/**
+	 * Create child element {@odf.element db:component-collection}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:component-collection}
+	 */
+	 public DbComponentCollectionElement newDbComponentCollectionElement(String dbNameValue) {
+		DbComponentCollectionElement dbComponentCollection = ((OdfFileDom) this.ownerDocument).newOdfElement(DbComponentCollectionElement.class);
+		dbComponentCollection.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbComponentCollection);
+		return dbComponentCollection;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexColumnElement.java
new file mode 100644
index 0000000..bbdb5f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexColumnElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsAscendingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:index-column}.
+ *
+ */
+public class DbIndexColumnElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "index-column");
+
+	/**
+	 * Create the instance of <code>DbIndexColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbIndexColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:index-column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsAscendingAttribute</code> , See {@odf.attribute db:is-ascending}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsAscendingAttribute() {
+		DbIsAscendingAttribute attr = (DbIsAscendingAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-ascending");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsAscendingAttribute</code> , See {@odf.attribute db:is-ascending}
+	 *
+	 * @param dbIsAscendingValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsAscendingAttribute(Boolean dbIsAscendingValue) {
+		DbIsAscendingAttribute attr = new DbIsAscendingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsAscendingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexColumnsElement.java
new file mode 100644
index 0000000..d629c4f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexColumnsElement.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:index-columns}.
+ *
+ */
+public class DbIndexColumnsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "index-columns");
+
+	/**
+	 * Create the instance of <code>DbIndexColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbIndexColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:index-columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:index-column}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:index-column}
+	 */
+	 public DbIndexColumnElement newDbIndexColumnElement(String dbNameValue) {
+		DbIndexColumnElement dbIndexColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(DbIndexColumnElement.class);
+		dbIndexColumn.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbIndexColumn);
+		return dbIndexColumn;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexElement.java
new file mode 100644
index 0000000..0cb0e11
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndexElement.java
@@ -0,0 +1,188 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCatalogNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsClusteredAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsUniqueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:index}.
+ *
+ */
+public class DbIndexElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "index");
+
+	/**
+	 * Create the instance of <code>DbIndexElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbIndexElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:index}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCatalogNameAttribute() {
+		DbCatalogNameAttribute attr = (DbCatalogNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "catalog-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @param dbCatalogNameValue   The type is <code>String</code>
+	 */
+	public void setDbCatalogNameAttribute(String dbCatalogNameValue) {
+		DbCatalogNameAttribute attr = new DbCatalogNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCatalogNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsClusteredAttribute</code> , See {@odf.attribute db:is-clustered}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsClusteredAttribute() {
+		DbIsClusteredAttribute attr = (DbIsClusteredAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-clustered");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsClusteredAttribute</code> , See {@odf.attribute db:is-clustered}
+	 *
+	 * @param dbIsClusteredValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsClusteredAttribute(Boolean dbIsClusteredValue) {
+		DbIsClusteredAttribute attr = new DbIsClusteredAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsClusteredValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsUniqueAttribute</code> , See {@odf.attribute db:is-unique}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsUniqueAttribute() {
+		DbIsUniqueAttribute attr = (DbIsUniqueAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-unique");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsUniqueAttribute</code> , See {@odf.attribute db:is-unique}
+	 *
+	 * @param dbIsUniqueValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsUniqueAttribute(Boolean dbIsUniqueValue) {
+		DbIsUniqueAttribute attr = new DbIsUniqueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsUniqueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:index-columns}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:index-columns}
+	 */
+	public DbIndexColumnsElement newDbIndexColumnsElement() {
+		DbIndexColumnsElement dbIndexColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(DbIndexColumnsElement.class);
+		this.appendChild(dbIndexColumns);
+		return dbIndexColumns;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndicesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndicesElement.java
new file mode 100644
index 0000000..cb05935
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbIndicesElement.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:indices}.
+ *
+ */
+public class DbIndicesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "indices");
+
+	/**
+	 * Create the instance of <code>DbIndicesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbIndicesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:indices}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:index}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:index}
+	 */
+	 public DbIndexElement newDbIndexElement(String dbNameValue) {
+		DbIndexElement dbIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(DbIndexElement.class);
+		dbIndex.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbIndex);
+		return dbIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyColumnElement.java
new file mode 100644
index 0000000..c0603c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyColumnElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbRelatedColumnNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:key-column}.
+ *
+ */
+public class DbKeyColumnElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "key-column");
+
+	/**
+	 * Create the instance of <code>DbKeyColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbKeyColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:key-column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbRelatedColumnNameAttribute</code> , See {@odf.attribute db:related-column-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbRelatedColumnNameAttribute() {
+		DbRelatedColumnNameAttribute attr = (DbRelatedColumnNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "related-column-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbRelatedColumnNameAttribute</code> , See {@odf.attribute db:related-column-name}
+	 *
+	 * @param dbRelatedColumnNameValue   The type is <code>String</code>
+	 */
+	public void setDbRelatedColumnNameAttribute(String dbRelatedColumnNameValue) {
+		DbRelatedColumnNameAttribute attr = new DbRelatedColumnNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbRelatedColumnNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyColumnsElement.java
new file mode 100644
index 0000000..a73cb6f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyColumnsElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:key-columns}.
+ *
+ */
+public class DbKeyColumnsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "key-columns");
+
+	/**
+	 * Create the instance of <code>DbKeyColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbKeyColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:key-columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:key-column}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:key-column}
+	 */
+	public DbKeyColumnElement newDbKeyColumnElement() {
+		DbKeyColumnElement dbKeyColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(DbKeyColumnElement.class);
+		this.appendChild(dbKeyColumn);
+		return dbKeyColumn;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyElement.java
new file mode 100644
index 0000000..8fb7981
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeyElement.java
@@ -0,0 +1,213 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDeleteRuleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbReferencedTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbUpdateRuleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:key}.
+ *
+ */
+public class DbKeyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "key");
+
+	/**
+	 * Create the instance of <code>DbKeyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbKeyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:key}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDeleteRuleAttribute</code> , See {@odf.attribute db:delete-rule}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDeleteRuleAttribute() {
+		DbDeleteRuleAttribute attr = (DbDeleteRuleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "delete-rule");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbDeleteRuleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDeleteRuleAttribute</code> , See {@odf.attribute db:delete-rule}
+	 *
+	 * @param dbDeleteRuleValue   The type is <code>String</code>
+	 */
+	public void setDbDeleteRuleAttribute(String dbDeleteRuleValue) {
+		DbDeleteRuleAttribute attr = new DbDeleteRuleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDeleteRuleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbReferencedTableNameAttribute</code> , See {@odf.attribute db:referenced-table-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbReferencedTableNameAttribute() {
+		DbReferencedTableNameAttribute attr = (DbReferencedTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "referenced-table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbReferencedTableNameAttribute</code> , See {@odf.attribute db:referenced-table-name}
+	 *
+	 * @param dbReferencedTableNameValue   The type is <code>String</code>
+	 */
+	public void setDbReferencedTableNameAttribute(String dbReferencedTableNameValue) {
+		DbReferencedTableNameAttribute attr = new DbReferencedTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbReferencedTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTypeAttribute</code> , See {@odf.attribute db:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTypeAttribute() {
+		DbTypeAttribute attr = (DbTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTypeAttribute</code> , See {@odf.attribute db:type}
+	 *
+	 * @param dbTypeValue   The type is <code>String</code>
+	 */
+	public void setDbTypeAttribute(String dbTypeValue) {
+		DbTypeAttribute attr = new DbTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbUpdateRuleAttribute</code> , See {@odf.attribute db:update-rule}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbUpdateRuleAttribute() {
+		DbUpdateRuleAttribute attr = (DbUpdateRuleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "update-rule");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DbUpdateRuleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbUpdateRuleAttribute</code> , See {@odf.attribute db:update-rule}
+	 *
+	 * @param dbUpdateRuleValue   The type is <code>String</code>
+	 */
+	public void setDbUpdateRuleAttribute(String dbUpdateRuleValue) {
+		DbUpdateRuleAttribute attr = new DbUpdateRuleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbUpdateRuleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:key-columns}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:key-columns}
+	 */
+	public DbKeyColumnsElement newDbKeyColumnsElement() {
+		DbKeyColumnsElement dbKeyColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(DbKeyColumnsElement.class);
+		this.appendChild(dbKeyColumns);
+		return dbKeyColumns;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeysElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeysElement.java
new file mode 100644
index 0000000..7f3af94
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbKeysElement.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:keys}.
+ *
+ */
+public class DbKeysElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "keys");
+
+	/**
+	 * Create the instance of <code>DbKeysElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbKeysElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:keys}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:key}.
+	 *
+	 * @param dbTypeValue  the <code>String</code> value of <code>DbTypeAttribute</code>, see {@odf.attribute  db:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:key}
+	 */
+	 public DbKeyElement newDbKeyElement(String dbTypeValue) {
+		DbKeyElement dbKey = ((OdfFileDom) this.ownerDocument).newOdfElement(DbKeyElement.class);
+		dbKey.setDbTypeAttribute(dbTypeValue);
+		this.appendChild(dbKey);
+		return dbKey;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbLoginElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbLoginElement.java
new file mode 100644
index 0000000..6703ad4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbLoginElement.java
@@ -0,0 +1,171 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsPasswordRequiredAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbLoginTimeoutAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbUseSystemUserAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbUserNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:login}.
+ *
+ */
+public class DbLoginElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "login");
+
+	/**
+	 * Create the instance of <code>DbLoginElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbLoginElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:login}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsPasswordRequiredAttribute</code> , See {@odf.attribute db:is-password-required}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsPasswordRequiredAttribute() {
+		DbIsPasswordRequiredAttribute attr = (DbIsPasswordRequiredAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-password-required");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbIsPasswordRequiredAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsPasswordRequiredAttribute</code> , See {@odf.attribute db:is-password-required}
+	 *
+	 * @param dbIsPasswordRequiredValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsPasswordRequiredAttribute(Boolean dbIsPasswordRequiredValue) {
+		DbIsPasswordRequiredAttribute attr = new DbIsPasswordRequiredAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsPasswordRequiredValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbLoginTimeoutAttribute</code> , See {@odf.attribute db:login-timeout}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDbLoginTimeoutAttribute() {
+		DbLoginTimeoutAttribute attr = (DbLoginTimeoutAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "login-timeout");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbLoginTimeoutAttribute</code> , See {@odf.attribute db:login-timeout}
+	 *
+	 * @param dbLoginTimeoutValue   The type is <code>Integer</code>
+	 */
+	public void setDbLoginTimeoutAttribute(Integer dbLoginTimeoutValue) {
+		DbLoginTimeoutAttribute attr = new DbLoginTimeoutAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dbLoginTimeoutValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbUseSystemUserAttribute</code> , See {@odf.attribute db:use-system-user}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbUseSystemUserAttribute() {
+		DbUseSystemUserAttribute attr = (DbUseSystemUserAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "use-system-user");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbUseSystemUserAttribute</code> , See {@odf.attribute db:use-system-user}
+	 *
+	 * @param dbUseSystemUserValue   The type is <code>Boolean</code>
+	 */
+	public void setDbUseSystemUserAttribute(Boolean dbUseSystemUserValue) {
+		DbUseSystemUserAttribute attr = new DbUseSystemUserAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbUseSystemUserValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbUserNameAttribute</code> , See {@odf.attribute db:user-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbUserNameAttribute() {
+		DbUserNameAttribute attr = (DbUserNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "user-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbUserNameAttribute</code> , See {@odf.attribute db:user-name}
+	 *
+	 * @param dbUserNameValue   The type is <code>String</code>
+	 */
+	public void setDbUserNameAttribute(String dbUserNameValue) {
+		DbUserNameAttribute attr = new DbUserNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbUserNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbOrderStatementElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbOrderStatementElement.java
new file mode 100644
index 0000000..90d4c96
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbOrderStatementElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbApplyCommandAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCommandAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:order-statement}.
+ *
+ */
+public class DbOrderStatementElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "order-statement");
+
+	/**
+	 * Create the instance of <code>DbOrderStatementElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbOrderStatementElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:order-statement}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbApplyCommandAttribute</code> , See {@odf.attribute db:apply-command}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbApplyCommandAttribute() {
+		DbApplyCommandAttribute attr = (DbApplyCommandAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "apply-command");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbApplyCommandAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbApplyCommandAttribute</code> , See {@odf.attribute db:apply-command}
+	 *
+	 * @param dbApplyCommandValue   The type is <code>Boolean</code>
+	 */
+	public void setDbApplyCommandAttribute(Boolean dbApplyCommandValue) {
+		DbApplyCommandAttribute attr = new DbApplyCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbApplyCommandValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCommandAttribute</code> , See {@odf.attribute db:command}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCommandAttribute() {
+		DbCommandAttribute attr = (DbCommandAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "command");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCommandAttribute</code> , See {@odf.attribute db:command}
+	 *
+	 * @param dbCommandValue   The type is <code>String</code>
+	 */
+	public void setDbCommandAttribute(String dbCommandValue) {
+		DbCommandAttribute attr = new DbCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCommandValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueriesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueriesElement.java
new file mode 100644
index 0000000..fe26afb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueriesElement.java
@@ -0,0 +1,103 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:queries}.
+ *
+ */
+public class DbQueriesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "queries");
+
+	/**
+	 * Create the instance of <code>DbQueriesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbQueriesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:queries}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:query}.
+	 *
+	 * @param dbCommandValue  the <code>String</code> value of <code>DbCommandAttribute</code>, see {@odf.attribute  db:command} at specification
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:query}
+	 */
+	 public DbQueryElement newDbQueryElement(String dbCommandValue, String dbNameValue) {
+		DbQueryElement dbQuery = ((OdfFileDom) this.ownerDocument).newOdfElement(DbQueryElement.class);
+		dbQuery.setDbCommandAttribute(dbCommandValue);
+		dbQuery.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbQuery);
+		return dbQuery;
+	}
+
+	/**
+	 * Create child element {@odf.element db:query-collection}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:query-collection}
+	 */
+	 public DbQueryCollectionElement newDbQueryCollectionElement(String dbNameValue) {
+		DbQueryCollectionElement dbQueryCollection = ((OdfFileDom) this.ownerDocument).newOdfElement(DbQueryCollectionElement.class);
+		dbQueryCollection.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbQueryCollection);
+		return dbQueryCollection;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueryCollectionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueryCollectionElement.java
new file mode 100644
index 0000000..c3fca39
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueryCollectionElement.java
@@ -0,0 +1,180 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTitleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:query-collection}.
+ *
+ */
+public class DbQueryCollectionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "query-collection");
+
+	/**
+	 * Create the instance of <code>DbQueryCollectionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbQueryCollectionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:query-collection}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDescriptionAttribute() {
+		DbDescriptionAttribute attr = (DbDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @param dbDescriptionValue   The type is <code>String</code>
+	 */
+	public void setDbDescriptionAttribute(String dbDescriptionValue) {
+		DbDescriptionAttribute attr = new DbDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTitleAttribute() {
+		DbTitleAttribute attr = (DbTitleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @param dbTitleValue   The type is <code>String</code>
+	 */
+	public void setDbTitleAttribute(String dbTitleValue) {
+		DbTitleAttribute attr = new DbTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTitleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:query}.
+	 *
+	 * @param dbCommandValue  the <code>String</code> value of <code>DbCommandAttribute</code>, see {@odf.attribute  db:command} at specification
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:query}
+	 */
+	 public DbQueryElement newDbQueryElement(String dbCommandValue, String dbNameValue) {
+		DbQueryElement dbQuery = ((OdfFileDom) this.ownerDocument).newOdfElement(DbQueryElement.class);
+		dbQuery.setDbCommandAttribute(dbCommandValue);
+		dbQuery.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbQuery);
+		return dbQuery;
+	}
+
+	/**
+	 * Create child element {@odf.element db:query-collection}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:query-collection}
+	 */
+	 public DbQueryCollectionElement newDbQueryCollectionElement(String dbNameValue) {
+		DbQueryCollectionElement dbQueryCollection = ((OdfFileDom) this.ownerDocument).newOdfElement(DbQueryCollectionElement.class);
+		dbQueryCollection.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbQueryCollection);
+		return dbQueryCollection;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueryElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueryElement.java
new file mode 100644
index 0000000..eea78f1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbQueryElement.java
@@ -0,0 +1,308 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCommandAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDefaultRowStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbEscapeProcessingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTitleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:query}.
+ *
+ */
+public class DbQueryElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "query");
+
+	/**
+	 * Create the instance of <code>DbQueryElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbQueryElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:query}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCommandAttribute</code> , See {@odf.attribute db:command}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCommandAttribute() {
+		DbCommandAttribute attr = (DbCommandAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "command");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCommandAttribute</code> , See {@odf.attribute db:command}
+	 *
+	 * @param dbCommandValue   The type is <code>String</code>
+	 */
+	public void setDbCommandAttribute(String dbCommandValue) {
+		DbCommandAttribute attr = new DbCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCommandValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDefaultRowStyleNameAttribute</code> , See {@odf.attribute db:default-row-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDefaultRowStyleNameAttribute() {
+		DbDefaultRowStyleNameAttribute attr = (DbDefaultRowStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "default-row-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDefaultRowStyleNameAttribute</code> , See {@odf.attribute db:default-row-style-name}
+	 *
+	 * @param dbDefaultRowStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDbDefaultRowStyleNameAttribute(String dbDefaultRowStyleNameValue) {
+		DbDefaultRowStyleNameAttribute attr = new DbDefaultRowStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDefaultRowStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDescriptionAttribute() {
+		DbDescriptionAttribute attr = (DbDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @param dbDescriptionValue   The type is <code>String</code>
+	 */
+	public void setDbDescriptionAttribute(String dbDescriptionValue) {
+		DbDescriptionAttribute attr = new DbDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbEscapeProcessingAttribute</code> , See {@odf.attribute db:escape-processing}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbEscapeProcessingAttribute() {
+		DbEscapeProcessingAttribute attr = (DbEscapeProcessingAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "escape-processing");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbEscapeProcessingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbEscapeProcessingAttribute</code> , See {@odf.attribute db:escape-processing}
+	 *
+	 * @param dbEscapeProcessingValue   The type is <code>Boolean</code>
+	 */
+	public void setDbEscapeProcessingAttribute(Boolean dbEscapeProcessingValue) {
+		DbEscapeProcessingAttribute attr = new DbEscapeProcessingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbEscapeProcessingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbStyleNameAttribute</code> , See {@odf.attribute db:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbStyleNameAttribute() {
+		DbStyleNameAttribute attr = (DbStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbStyleNameAttribute</code> , See {@odf.attribute db:style-name}
+	 *
+	 * @param dbStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDbStyleNameAttribute(String dbStyleNameValue) {
+		DbStyleNameAttribute attr = new DbStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTitleAttribute() {
+		DbTitleAttribute attr = (DbTitleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @param dbTitleValue   The type is <code>String</code>
+	 */
+	public void setDbTitleAttribute(String dbTitleValue) {
+		DbTitleAttribute attr = new DbTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTitleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:columns}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:columns}
+	 */
+	public DbColumnsElement newDbColumnsElement() {
+		DbColumnsElement dbColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(DbColumnsElement.class);
+		this.appendChild(dbColumns);
+		return dbColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element db:filter-statement}.
+	 *
+	 * @param dbCommandValue  the <code>String</code> value of <code>DbCommandAttribute</code>, see {@odf.attribute  db:command} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:filter-statement}
+	 */
+	 public DbFilterStatementElement newDbFilterStatementElement(String dbCommandValue) {
+		DbFilterStatementElement dbFilterStatement = ((OdfFileDom) this.ownerDocument).newOdfElement(DbFilterStatementElement.class);
+		dbFilterStatement.setDbCommandAttribute(dbCommandValue);
+		this.appendChild(dbFilterStatement);
+		return dbFilterStatement;
+	}
+
+	/**
+	 * Create child element {@odf.element db:order-statement}.
+	 *
+	 * @param dbCommandValue  the <code>String</code> value of <code>DbCommandAttribute</code>, see {@odf.attribute  db:command} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:order-statement}
+	 */
+	 public DbOrderStatementElement newDbOrderStatementElement(String dbCommandValue) {
+		DbOrderStatementElement dbOrderStatement = ((OdfFileDom) this.ownerDocument).newOdfElement(DbOrderStatementElement.class);
+		dbOrderStatement.setDbCommandAttribute(dbCommandValue);
+		this.appendChild(dbOrderStatement);
+		return dbOrderStatement;
+	}
+
+	/**
+	 * Create child element {@odf.element db:update-table}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:update-table}
+	 */
+	 public DbUpdateTableElement newDbUpdateTableElement(String dbNameValue) {
+		DbUpdateTableElement dbUpdateTable = ((OdfFileDom) this.ownerDocument).newOdfElement(DbUpdateTableElement.class);
+		dbUpdateTable.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbUpdateTable);
+		return dbUpdateTable;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbReportsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbReportsElement.java
new file mode 100644
index 0000000..6c5f699
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbReportsElement.java
@@ -0,0 +1,101 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:reports}.
+ *
+ */
+public class DbReportsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "reports");
+
+	/**
+	 * Create the instance of <code>DbReportsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbReportsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:reports}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:component}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:component}
+	 */
+	 public DbComponentElement newDbComponentElement(String dbNameValue) {
+		DbComponentElement dbComponent = ((OdfFileDom) this.ownerDocument).newOdfElement(DbComponentElement.class);
+		dbComponent.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbComponent);
+		return dbComponent;
+	}
+
+	/**
+	 * Create child element {@odf.element db:component-collection}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:component-collection}
+	 */
+	 public DbComponentCollectionElement newDbComponentCollectionElement(String dbNameValue) {
+		DbComponentCollectionElement dbComponentCollection = ((OdfFileDom) this.ownerDocument).newOdfElement(DbComponentCollectionElement.class);
+		dbComponentCollection.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbComponentCollection);
+		return dbComponentCollection;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbSchemaDefinitionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbSchemaDefinitionElement.java
new file mode 100644
index 0000000..eecefcb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbSchemaDefinitionElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:schema-definition}.
+ *
+ */
+public class DbSchemaDefinitionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "schema-definition");
+
+	/**
+	 * Create the instance of <code>DbSchemaDefinitionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbSchemaDefinitionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:schema-definition}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-definitions}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:table-definitions}
+	 */
+	public DbTableDefinitionsElement newDbTableDefinitionsElement() {
+		DbTableDefinitionsElement dbTableDefinitions = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableDefinitionsElement.class);
+		this.appendChild(dbTableDefinitions);
+		return dbTableDefinitions;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbServerDatabaseElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbServerDatabaseElement.java
new file mode 100644
index 0000000..966a57c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbServerDatabaseElement.java
@@ -0,0 +1,198 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbHostnameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbLocalSocketAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbPortAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:server-database}.
+ *
+ */
+public class DbServerDatabaseElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "server-database");
+
+	/**
+	 * Create the instance of <code>DbServerDatabaseElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbServerDatabaseElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:server-database}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDatabaseNameAttribute</code> , See {@odf.attribute db:database-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDatabaseNameAttribute() {
+		DbDatabaseNameAttribute attr = (DbDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDatabaseNameAttribute</code> , See {@odf.attribute db:database-name}
+	 *
+	 * @param dbDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setDbDatabaseNameAttribute(String dbDatabaseNameValue) {
+		DbDatabaseNameAttribute attr = new DbDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbHostnameAttribute</code> , See {@odf.attribute db:hostname}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbHostnameAttribute() {
+		DbHostnameAttribute attr = (DbHostnameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "hostname");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbHostnameAttribute</code> , See {@odf.attribute db:hostname}
+	 *
+	 * @param dbHostnameValue   The type is <code>String</code>
+	 */
+	public void setDbHostnameAttribute(String dbHostnameValue) {
+		DbHostnameAttribute attr = new DbHostnameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbHostnameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbLocalSocketAttribute</code> , See {@odf.attribute db:local-socket}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbLocalSocketAttribute() {
+		DbLocalSocketAttribute attr = (DbLocalSocketAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "local-socket");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbLocalSocketAttribute</code> , See {@odf.attribute db:local-socket}
+	 *
+	 * @param dbLocalSocketValue   The type is <code>String</code>
+	 */
+	public void setDbLocalSocketAttribute(String dbLocalSocketValue) {
+		DbLocalSocketAttribute attr = new DbLocalSocketAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbLocalSocketValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbPortAttribute</code> , See {@odf.attribute db:port}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDbPortAttribute() {
+		DbPortAttribute attr = (DbPortAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "port");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbPortAttribute</code> , See {@odf.attribute db:port}
+	 *
+	 * @param dbPortValue   The type is <code>Integer</code>
+	 */
+	public void setDbPortAttribute(Integer dbPortValue) {
+		DbPortAttribute attr = new DbPortAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dbPortValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTypeAttribute</code> , See {@odf.attribute db:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTypeAttribute() {
+		DbTypeAttribute attr = (DbTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTypeAttribute</code> , See {@odf.attribute db:type}
+	 *
+	 * @param dbTypeValue   The type is <code>String</code>
+	 */
+	public void setDbTypeAttribute(String dbTypeValue) {
+		DbTypeAttribute attr = new DbTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableDefinitionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableDefinitionElement.java
new file mode 100644
index 0000000..9b148d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableDefinitionElement.java
@@ -0,0 +1,214 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCatalogNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbSchemaNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-definition}.
+ *
+ */
+public class DbTableDefinitionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-definition");
+
+	/**
+	 * Create the instance of <code>DbTableDefinitionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableDefinitionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-definition}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCatalogNameAttribute() {
+		DbCatalogNameAttribute attr = (DbCatalogNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "catalog-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @param dbCatalogNameValue   The type is <code>String</code>
+	 */
+	public void setDbCatalogNameAttribute(String dbCatalogNameValue) {
+		DbCatalogNameAttribute attr = new DbCatalogNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCatalogNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbSchemaNameAttribute</code> , See {@odf.attribute db:schema-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbSchemaNameAttribute() {
+		DbSchemaNameAttribute attr = (DbSchemaNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "schema-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbSchemaNameAttribute</code> , See {@odf.attribute db:schema-name}
+	 *
+	 * @param dbSchemaNameValue   The type is <code>String</code>
+	 */
+	public void setDbSchemaNameAttribute(String dbSchemaNameValue) {
+		DbSchemaNameAttribute attr = new DbSchemaNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbSchemaNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTypeAttribute</code> , See {@odf.attribute db:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTypeAttribute() {
+		DbTypeAttribute attr = (DbTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTypeAttribute</code> , See {@odf.attribute db:type}
+	 *
+	 * @param dbTypeValue   The type is <code>String</code>
+	 */
+	public void setDbTypeAttribute(String dbTypeValue) {
+		DbTypeAttribute attr = new DbTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:column-definitions}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:column-definitions}
+	 */
+	public DbColumnDefinitionsElement newDbColumnDefinitionsElement() {
+		DbColumnDefinitionsElement dbColumnDefinitions = ((OdfFileDom) this.ownerDocument).newOdfElement(DbColumnDefinitionsElement.class);
+		this.appendChild(dbColumnDefinitions);
+		return dbColumnDefinitions;
+	}
+
+	/**
+	 * Create child element {@odf.element db:indices}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:indices}
+	 */
+	public DbIndicesElement newDbIndicesElement() {
+		DbIndicesElement dbIndices = ((OdfFileDom) this.ownerDocument).newOdfElement(DbIndicesElement.class);
+		this.appendChild(dbIndices);
+		return dbIndices;
+	}
+
+	/**
+	 * Create child element {@odf.element db:keys}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:keys}
+	 */
+	public DbKeysElement newDbKeysElement() {
+		DbKeysElement dbKeys = ((OdfFileDom) this.ownerDocument).newOdfElement(DbKeysElement.class);
+		this.appendChild(dbKeys);
+		return dbKeys;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableDefinitionsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableDefinitionsElement.java
new file mode 100644
index 0000000..f049f69
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableDefinitionsElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-definitions}.
+ *
+ */
+public class DbTableDefinitionsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-definitions");
+
+	/**
+	 * Create the instance of <code>DbTableDefinitionsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableDefinitionsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-definitions}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-definition}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-definition}
+	 */
+	 public DbTableDefinitionElement newDbTableDefinitionElement(String dbNameValue) {
+		DbTableDefinitionElement dbTableDefinition = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableDefinitionElement.class);
+		dbTableDefinition.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbTableDefinition);
+		return dbTableDefinition;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableExcludeFilterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableExcludeFilterElement.java
new file mode 100644
index 0000000..3163e75
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableExcludeFilterElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-exclude-filter}.
+ *
+ */
+public class DbTableExcludeFilterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-exclude-filter");
+
+	/**
+	 * Create the instance of <code>DbTableExcludeFilterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableExcludeFilterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-exclude-filter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-filter-pattern}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:table-filter-pattern}
+	 */
+	public DbTableFilterPatternElement newDbTableFilterPatternElement() {
+		DbTableFilterPatternElement dbTableFilterPattern = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableFilterPatternElement.class);
+		this.appendChild(dbTableFilterPattern);
+		return dbTableFilterPattern;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableFilterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableFilterElement.java
new file mode 100644
index 0000000..8e7ec38
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableFilterElement.java
@@ -0,0 +1,97 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-filter}.
+ *
+ */
+public class DbTableFilterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-filter");
+
+	/**
+	 * Create the instance of <code>DbTableFilterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableFilterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-filter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-exclude-filter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-exclude-filter}
+	 */
+	public DbTableExcludeFilterElement newDbTableExcludeFilterElement() {
+		DbTableExcludeFilterElement dbTableExcludeFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableExcludeFilterElement.class);
+		this.appendChild(dbTableExcludeFilter);
+		return dbTableExcludeFilter;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-include-filter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-include-filter}
+	 */
+	public DbTableIncludeFilterElement newDbTableIncludeFilterElement() {
+		DbTableIncludeFilterElement dbTableIncludeFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableIncludeFilterElement.class);
+		this.appendChild(dbTableIncludeFilter);
+		return dbTableIncludeFilter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableFilterPatternElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableFilterPatternElement.java
new file mode 100644
index 0000000..9acac4b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableFilterPatternElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-filter-pattern}.
+ *
+ */
+public class DbTableFilterPatternElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-filter-pattern");
+
+	/**
+	 * Create the instance of <code>DbTableFilterPatternElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableFilterPatternElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-filter-pattern}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableIncludeFilterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableIncludeFilterElement.java
new file mode 100644
index 0000000..55815f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableIncludeFilterElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-include-filter}.
+ *
+ */
+public class DbTableIncludeFilterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-include-filter");
+
+	/**
+	 * Create the instance of <code>DbTableIncludeFilterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableIncludeFilterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-include-filter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-filter-pattern}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:table-filter-pattern}
+	 */
+	public DbTableFilterPatternElement newDbTableFilterPatternElement() {
+		DbTableFilterPatternElement dbTableFilterPattern = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableFilterPatternElement.class);
+		this.appendChild(dbTableFilterPattern);
+		return dbTableFilterPattern;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableRepresentationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableRepresentationElement.java
new file mode 100644
index 0000000..9c618d4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableRepresentationElement.java
@@ -0,0 +1,291 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCatalogNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDefaultRowStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbSchemaNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbTitleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-representation}.
+ *
+ */
+public class DbTableRepresentationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-representation");
+
+	/**
+	 * Create the instance of <code>DbTableRepresentationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableRepresentationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-representation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCatalogNameAttribute() {
+		DbCatalogNameAttribute attr = (DbCatalogNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "catalog-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @param dbCatalogNameValue   The type is <code>String</code>
+	 */
+	public void setDbCatalogNameAttribute(String dbCatalogNameValue) {
+		DbCatalogNameAttribute attr = new DbCatalogNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCatalogNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDefaultRowStyleNameAttribute</code> , See {@odf.attribute db:default-row-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDefaultRowStyleNameAttribute() {
+		DbDefaultRowStyleNameAttribute attr = (DbDefaultRowStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "default-row-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDefaultRowStyleNameAttribute</code> , See {@odf.attribute db:default-row-style-name}
+	 *
+	 * @param dbDefaultRowStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDbDefaultRowStyleNameAttribute(String dbDefaultRowStyleNameValue) {
+		DbDefaultRowStyleNameAttribute attr = new DbDefaultRowStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDefaultRowStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbDescriptionAttribute() {
+		DbDescriptionAttribute attr = (DbDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbDescriptionAttribute</code> , See {@odf.attribute db:description}
+	 *
+	 * @param dbDescriptionValue   The type is <code>String</code>
+	 */
+	public void setDbDescriptionAttribute(String dbDescriptionValue) {
+		DbDescriptionAttribute attr = new DbDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbSchemaNameAttribute</code> , See {@odf.attribute db:schema-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbSchemaNameAttribute() {
+		DbSchemaNameAttribute attr = (DbSchemaNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "schema-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbSchemaNameAttribute</code> , See {@odf.attribute db:schema-name}
+	 *
+	 * @param dbSchemaNameValue   The type is <code>String</code>
+	 */
+	public void setDbSchemaNameAttribute(String dbSchemaNameValue) {
+		DbSchemaNameAttribute attr = new DbSchemaNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbSchemaNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbStyleNameAttribute</code> , See {@odf.attribute db:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbStyleNameAttribute() {
+		DbStyleNameAttribute attr = (DbStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbStyleNameAttribute</code> , See {@odf.attribute db:style-name}
+	 *
+	 * @param dbStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDbStyleNameAttribute(String dbStyleNameValue) {
+		DbStyleNameAttribute attr = new DbStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbTitleAttribute() {
+		DbTitleAttribute attr = (DbTitleAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbTitleAttribute</code> , See {@odf.attribute db:title}
+	 *
+	 * @param dbTitleValue   The type is <code>String</code>
+	 */
+	public void setDbTitleAttribute(String dbTitleValue) {
+		DbTitleAttribute attr = new DbTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbTitleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element db:columns}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:columns}
+	 */
+	public DbColumnsElement newDbColumnsElement() {
+		DbColumnsElement dbColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(DbColumnsElement.class);
+		this.appendChild(dbColumns);
+		return dbColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element db:filter-statement}.
+	 *
+	 * @param dbCommandValue  the <code>String</code> value of <code>DbCommandAttribute</code>, see {@odf.attribute  db:command} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:filter-statement}
+	 */
+	 public DbFilterStatementElement newDbFilterStatementElement(String dbCommandValue) {
+		DbFilterStatementElement dbFilterStatement = ((OdfFileDom) this.ownerDocument).newOdfElement(DbFilterStatementElement.class);
+		dbFilterStatement.setDbCommandAttribute(dbCommandValue);
+		this.appendChild(dbFilterStatement);
+		return dbFilterStatement;
+	}
+
+	/**
+	 * Create child element {@odf.element db:order-statement}.
+	 *
+	 * @param dbCommandValue  the <code>String</code> value of <code>DbCommandAttribute</code>, see {@odf.attribute  db:command} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:order-statement}
+	 */
+	 public DbOrderStatementElement newDbOrderStatementElement(String dbCommandValue) {
+		DbOrderStatementElement dbOrderStatement = ((OdfFileDom) this.ownerDocument).newOdfElement(DbOrderStatementElement.class);
+		dbOrderStatement.setDbCommandAttribute(dbCommandValue);
+		this.appendChild(dbOrderStatement);
+		return dbOrderStatement;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableRepresentationsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableRepresentationsElement.java
new file mode 100644
index 0000000..d166e36
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableRepresentationsElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-representations}.
+ *
+ */
+public class DbTableRepresentationsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-representations");
+
+	/**
+	 * Create the instance of <code>DbTableRepresentationsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableRepresentationsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-representations}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-representation}.
+	 *
+	 * @param dbNameValue  the <code>String</code> value of <code>DbNameAttribute</code>, see {@odf.attribute  db:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-representation}
+	 */
+	 public DbTableRepresentationElement newDbTableRepresentationElement(String dbNameValue) {
+		DbTableRepresentationElement dbTableRepresentation = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableRepresentationElement.class);
+		dbTableRepresentation.setDbNameAttribute(dbNameValue);
+		this.appendChild(dbTableRepresentation);
+		return dbTableRepresentation;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableSettingElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableSettingElement.java
new file mode 100644
index 0000000..bb3345f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableSettingElement.java
@@ -0,0 +1,147 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbIsFirstRowHeaderLineAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbShowDeletedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-setting}.
+ *
+ */
+public class DbTableSettingElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-setting");
+
+	/**
+	 * Create the instance of <code>DbTableSettingElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableSettingElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-setting}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbIsFirstRowHeaderLineAttribute</code> , See {@odf.attribute db:is-first-row-header-line}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbIsFirstRowHeaderLineAttribute() {
+		DbIsFirstRowHeaderLineAttribute attr = (DbIsFirstRowHeaderLineAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "is-first-row-header-line");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbIsFirstRowHeaderLineAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbIsFirstRowHeaderLineAttribute</code> , See {@odf.attribute db:is-first-row-header-line}
+	 *
+	 * @param dbIsFirstRowHeaderLineValue   The type is <code>Boolean</code>
+	 */
+	public void setDbIsFirstRowHeaderLineAttribute(Boolean dbIsFirstRowHeaderLineValue) {
+		DbIsFirstRowHeaderLineAttribute attr = new DbIsFirstRowHeaderLineAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbIsFirstRowHeaderLineValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbShowDeletedAttribute</code> , See {@odf.attribute db:show-deleted}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDbShowDeletedAttribute() {
+		DbShowDeletedAttribute attr = (DbShowDeletedAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "show-deleted");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DbShowDeletedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbShowDeletedAttribute</code> , See {@odf.attribute db:show-deleted}
+	 *
+	 * @param dbShowDeletedValue   The type is <code>Boolean</code>
+	 */
+	public void setDbShowDeletedAttribute(Boolean dbShowDeletedValue) {
+		DbShowDeletedAttribute attr = new DbShowDeletedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dbShowDeletedValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element db:character-set}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:character-set}
+	 */
+	public DbCharacterSetElement newDbCharacterSetElement() {
+		DbCharacterSetElement dbCharacterSet = ((OdfFileDom) this.ownerDocument).newOdfElement(DbCharacterSetElement.class);
+		this.appendChild(dbCharacterSet);
+		return dbCharacterSet;
+	}
+
+	/**
+	 * Create child element {@odf.element db:delimiter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:delimiter}
+	 */
+	public DbDelimiterElement newDbDelimiterElement() {
+		DbDelimiterElement dbDelimiter = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDelimiterElement.class);
+		this.appendChild(dbDelimiter);
+		return dbDelimiter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableSettingsElement.java
new file mode 100644
index 0000000..9b36b86
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableSettingsElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-settings}.
+ *
+ */
+public class DbTableSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-settings");
+
+	/**
+	 * Create the instance of <code>DbTableSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-setting}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-setting}
+	 */
+	public DbTableSettingElement newDbTableSettingElement() {
+		DbTableSettingElement dbTableSetting = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableSettingElement.class);
+		this.appendChild(dbTableSetting);
+		return dbTableSetting;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableTypeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableTypeElement.java
new file mode 100644
index 0000000..99f5166
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableTypeElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-type}.
+ *
+ */
+public class DbTableTypeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-type");
+
+	/**
+	 * Create the instance of <code>DbTableTypeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableTypeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-type}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableTypeFilterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableTypeFilterElement.java
new file mode 100644
index 0000000..65937cf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbTableTypeFilterElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:table-type-filter}.
+ *
+ */
+public class DbTableTypeFilterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "table-type-filter");
+
+	/**
+	 * Create the instance of <code>DbTableTypeFilterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbTableTypeFilterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:table-type-filter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-type}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-type}
+	 */
+	public DbTableTypeElement newDbTableTypeElement() {
+		DbTableTypeElement dbTableType = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableTypeElement.class);
+		this.appendChild(dbTableType);
+		return dbTableType;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbUpdateTableElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbUpdateTableElement.java
new file mode 100644
index 0000000..ccfa01d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/db/DbUpdateTableElement.java
@@ -0,0 +1,148 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.db;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.db.DbCatalogNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.db.DbSchemaNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element db:update-table}.
+ *
+ */
+public class DbUpdateTableElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DB, "update-table");
+
+	/**
+	 * Create the instance of <code>DbUpdateTableElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DbUpdateTableElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element db:update-table}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbCatalogNameAttribute() {
+		DbCatalogNameAttribute attr = (DbCatalogNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "catalog-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbCatalogNameAttribute</code> , See {@odf.attribute db:catalog-name}
+	 *
+	 * @param dbCatalogNameValue   The type is <code>String</code>
+	 */
+	public void setDbCatalogNameAttribute(String dbCatalogNameValue) {
+		DbCatalogNameAttribute attr = new DbCatalogNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbCatalogNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbNameAttribute() {
+		DbNameAttribute attr = (DbNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbNameAttribute</code> , See {@odf.attribute db:name}
+	 *
+	 * @param dbNameValue   The type is <code>String</code>
+	 */
+	public void setDbNameAttribute(String dbNameValue) {
+		DbNameAttribute attr = new DbNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DbSchemaNameAttribute</code> , See {@odf.attribute db:schema-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDbSchemaNameAttribute() {
+		DbSchemaNameAttribute attr = (DbSchemaNameAttribute) getOdfAttribute(OdfDocumentNamespace.DB, "schema-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DbSchemaNameAttribute</code> , See {@odf.attribute db:schema-name}
+	 *
+	 * @param dbSchemaNameValue   The type is <code>String</code>
+	 */
+	public void setDbSchemaNameAttribute(String dbSchemaNameValue) {
+		DbSchemaNameAttribute attr = new DbSchemaNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dbSchemaNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcCreatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcCreatorElement.java
new file mode 100644
index 0000000..ce9c5cc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcCreatorElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dc:creator}.
+ *
+ */
+public class DcCreatorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DC, "creator");
+
+	/**
+	 * Create the instance of <code>DcCreatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DcCreatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dc:creator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcDateElement.java
new file mode 100644
index 0000000..c167554
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcDateElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dc:date}.
+ *
+ */
+public class DcDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DC, "date");
+
+	/**
+	 * Create the instance of <code>DcDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DcDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dc:date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcDescriptionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcDescriptionElement.java
new file mode 100644
index 0000000..4599df8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcDescriptionElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dc:description}.
+ *
+ */
+public class DcDescriptionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DC, "description");
+
+	/**
+	 * Create the instance of <code>DcDescriptionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DcDescriptionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dc:description}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcLanguageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcLanguageElement.java
new file mode 100644
index 0000000..b8b4cdd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcLanguageElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dc:language}.
+ *
+ */
+public class DcLanguageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DC, "language");
+
+	/**
+	 * Create the instance of <code>DcLanguageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DcLanguageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dc:language}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcSubjectElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcSubjectElement.java
new file mode 100644
index 0000000..ee749dc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcSubjectElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dc:subject}.
+ *
+ */
+public class DcSubjectElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DC, "subject");
+
+	/**
+	 * Create the instance of <code>DcSubjectElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DcSubjectElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dc:subject}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcTitleElement.java
new file mode 100644
index 0000000..177e872
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dc/DcTitleElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dc:title}.
+ *
+ */
+public class DcTitleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DC, "title");
+
+	/**
+	 * Create the instance of <code>DcTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DcTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dc:title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dCubeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dCubeElement.java
new file mode 100644
index 0000000..80de20d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dCubeElement.java
@@ -0,0 +1,348 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dr3d;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dMaxEdgeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dMinEdgeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawZIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dr3d:cube}.
+ *
+ */
+public class Dr3dCubeElement extends OdfStyleableShapeElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "cube");
+
+	/**
+	 * Create the instance of <code>Dr3dCubeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dCubeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dr3d:cube}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dMaxEdgeAttribute</code> , See {@odf.attribute dr3d:max-edge}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dMaxEdgeAttribute() {
+		Dr3dMaxEdgeAttribute attr = (Dr3dMaxEdgeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "max-edge");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dMaxEdgeAttribute</code> , See {@odf.attribute dr3d:max-edge}
+	 *
+	 * @param dr3dMaxEdgeValue   The type is <code>String</code>
+	 */
+	public void setDr3dMaxEdgeAttribute(String dr3dMaxEdgeValue) {
+		Dr3dMaxEdgeAttribute attr = new Dr3dMaxEdgeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dMaxEdgeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dMinEdgeAttribute</code> , See {@odf.attribute dr3d:min-edge}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dMinEdgeAttribute() {
+		Dr3dMinEdgeAttribute attr = (Dr3dMinEdgeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "min-edge");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dMinEdgeAttribute</code> , See {@odf.attribute dr3d:min-edge}
+	 *
+	 * @param dr3dMinEdgeValue   The type is <code>String</code>
+	 */
+	public void setDr3dMinEdgeAttribute(String dr3dMinEdgeValue) {
+		Dr3dMinEdgeAttribute attr = new Dr3dMinEdgeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dMinEdgeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTransformAttribute() {
+		Dr3dTransformAttribute attr = (Dr3dTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @param dr3dTransformValue   The type is <code>String</code>
+	 */
+	public void setDr3dTransformAttribute(String dr3dTransformValue) {
+		Dr3dTransformAttribute attr = new Dr3dTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassNamesAttribute() {
+		DrawClassNamesAttribute attr = (DrawClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @param drawClassNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawClassNamesAttribute(String drawClassNamesValue) {
+		DrawClassNamesAttribute attr = new DrawClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawZIndexAttribute() {
+		DrawZIndexAttribute attr = (DrawZIndexAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "z-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @param drawZIndexValue   The type is <code>Integer</code>
+	 */
+	public void setDrawZIndexAttribute(Integer drawZIndexValue) {
+		DrawZIndexAttribute attr = new DrawZIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawZIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassNamesAttribute() {
+		PresentationClassNamesAttribute attr = (PresentationClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @param presentationClassNamesValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassNamesAttribute(String presentationClassNamesValue) {
+		PresentationClassNamesAttribute attr = new PresentationClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStyleNameAttribute() {
+		PresentationStyleNameAttribute attr = (PresentationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @param presentationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationStyleNameAttribute(String presentationStyleNameValue) {
+		PresentationStyleNameAttribute attr = new PresentationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dExtrudeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dExtrudeElement.java
new file mode 100644
index 0000000..8514c8f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dExtrudeElement.java
@@ -0,0 +1,352 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dr3d;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawZIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dr3d:extrude}.
+ *
+ */
+public class Dr3dExtrudeElement extends OdfStyleableShapeElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "extrude");
+
+	/**
+	 * Create the instance of <code>Dr3dExtrudeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dExtrudeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dr3d:extrude}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTransformAttribute() {
+		Dr3dTransformAttribute attr = (Dr3dTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @param dr3dTransformValue   The type is <code>String</code>
+	 */
+	public void setDr3dTransformAttribute(String dr3dTransformValue) {
+		Dr3dTransformAttribute attr = new Dr3dTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassNamesAttribute() {
+		DrawClassNamesAttribute attr = (DrawClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @param drawClassNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawClassNamesAttribute(String drawClassNamesValue) {
+		DrawClassNamesAttribute attr = new DrawClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawZIndexAttribute() {
+		DrawZIndexAttribute attr = (DrawZIndexAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "z-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @param drawZIndexValue   The type is <code>Integer</code>
+	 */
+	public void setDrawZIndexAttribute(Integer drawZIndexValue) {
+		DrawZIndexAttribute attr = new DrawZIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawZIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassNamesAttribute() {
+		PresentationClassNamesAttribute attr = (PresentationClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @param presentationClassNamesValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassNamesAttribute(String presentationClassNamesValue) {
+		PresentationClassNamesAttribute attr = new PresentationClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStyleNameAttribute() {
+		PresentationStyleNameAttribute attr = (PresentationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @param presentationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationStyleNameAttribute(String presentationStyleNameValue) {
+		PresentationStyleNameAttribute attr = new PresentationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgDAttribute() {
+		SvgDAttribute attr = (SvgDAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "d");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @param svgDValue   The type is <code>String</code>
+	 */
+	public void setSvgDAttribute(String svgDValue) {
+		SvgDAttribute attr = new SvgDAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgDValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dLightElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dLightElement.java
new file mode 100644
index 0000000..1b720eb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dLightElement.java
@@ -0,0 +1,173 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dr3d;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dDiffuseColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dEnabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dSpecularAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dr3d:light}.
+ *
+ */
+public class Dr3dLightElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "light");
+
+	/**
+	 * Create the instance of <code>Dr3dLightElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dLightElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dr3d:light}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dDiffuseColorAttribute</code> , See {@odf.attribute dr3d:diffuse-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dDiffuseColorAttribute() {
+		Dr3dDiffuseColorAttribute attr = (Dr3dDiffuseColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "diffuse-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dDiffuseColorAttribute</code> , See {@odf.attribute dr3d:diffuse-color}
+	 *
+	 * @param dr3dDiffuseColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dDiffuseColorAttribute(String dr3dDiffuseColorValue) {
+		Dr3dDiffuseColorAttribute attr = new Dr3dDiffuseColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dDiffuseColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dDirectionAttribute</code> , See {@odf.attribute dr3d:direction}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dDirectionAttribute() {
+		Dr3dDirectionAttribute attr = (Dr3dDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dDirectionAttribute</code> , See {@odf.attribute dr3d:direction}
+	 *
+	 * @param dr3dDirectionValue   The type is <code>String</code>
+	 */
+	public void setDr3dDirectionAttribute(String dr3dDirectionValue) {
+		Dr3dDirectionAttribute attr = new Dr3dDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dEnabledAttribute</code> , See {@odf.attribute dr3d:enabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDr3dEnabledAttribute() {
+		Dr3dEnabledAttribute attr = (Dr3dEnabledAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "enabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dEnabledAttribute</code> , See {@odf.attribute dr3d:enabled}
+	 *
+	 * @param dr3dEnabledValue   The type is <code>Boolean</code>
+	 */
+	public void setDr3dEnabledAttribute(Boolean dr3dEnabledValue) {
+		Dr3dEnabledAttribute attr = new Dr3dEnabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dr3dEnabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dSpecularAttribute</code> , See {@odf.attribute dr3d:specular}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDr3dSpecularAttribute() {
+		Dr3dSpecularAttribute attr = (Dr3dSpecularAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "specular");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dSpecularAttribute</code> , See {@odf.attribute dr3d:specular}
+	 *
+	 * @param dr3dSpecularValue   The type is <code>Boolean</code>
+	 */
+	public void setDr3dSpecularAttribute(Boolean dr3dSpecularValue) {
+		Dr3dSpecularAttribute attr = new Dr3dSpecularAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dr3dSpecularValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dRotateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dRotateElement.java
new file mode 100644
index 0000000..1b8b893
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dRotateElement.java
@@ -0,0 +1,352 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dr3d;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawZIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dr3d:rotate}.
+ *
+ */
+public class Dr3dRotateElement extends OdfStyleableShapeElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "rotate");
+
+	/**
+	 * Create the instance of <code>Dr3dRotateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dRotateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dr3d:rotate}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTransformAttribute() {
+		Dr3dTransformAttribute attr = (Dr3dTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @param dr3dTransformValue   The type is <code>String</code>
+	 */
+	public void setDr3dTransformAttribute(String dr3dTransformValue) {
+		Dr3dTransformAttribute attr = new Dr3dTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassNamesAttribute() {
+		DrawClassNamesAttribute attr = (DrawClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @param drawClassNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawClassNamesAttribute(String drawClassNamesValue) {
+		DrawClassNamesAttribute attr = new DrawClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawZIndexAttribute() {
+		DrawZIndexAttribute attr = (DrawZIndexAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "z-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @param drawZIndexValue   The type is <code>Integer</code>
+	 */
+	public void setDrawZIndexAttribute(Integer drawZIndexValue) {
+		DrawZIndexAttribute attr = new DrawZIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawZIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassNamesAttribute() {
+		PresentationClassNamesAttribute attr = (PresentationClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @param presentationClassNamesValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassNamesAttribute(String presentationClassNamesValue) {
+		PresentationClassNamesAttribute attr = new PresentationClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStyleNameAttribute() {
+		PresentationStyleNameAttribute attr = (PresentationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @param presentationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationStyleNameAttribute(String presentationStyleNameValue) {
+		PresentationStyleNameAttribute attr = new PresentationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgDAttribute() {
+		SvgDAttribute attr = (SvgDAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "d");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @param svgDValue   The type is <code>String</code>
+	 */
+	public void setSvgDAttribute(String svgDValue) {
+		SvgDAttribute attr = new SvgDAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgDValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dSceneElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dSceneElement.java
new file mode 100644
index 0000000..8d3a679
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dSceneElement.java
@@ -0,0 +1,945 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dr3d;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGluePointElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dAmbientColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dFocalLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dLightingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dProjectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadeModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadowSlantAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVpnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVrpAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVupAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawZIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableBackgroundAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorPageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dr3d:scene}.
+ *
+ */
+public class Dr3dSceneElement extends OdfStyleableShapeElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "scene");
+
+	/**
+	 * Create the instance of <code>Dr3dSceneElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dSceneElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dr3d:scene}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dAmbientColorAttribute</code> , See {@odf.attribute dr3d:ambient-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dAmbientColorAttribute() {
+		Dr3dAmbientColorAttribute attr = (Dr3dAmbientColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "ambient-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dAmbientColorAttribute</code> , See {@odf.attribute dr3d:ambient-color}
+	 *
+	 * @param dr3dAmbientColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dAmbientColorAttribute(String dr3dAmbientColorValue) {
+		Dr3dAmbientColorAttribute attr = new Dr3dAmbientColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dAmbientColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dDistanceAttribute</code> , See {@odf.attribute dr3d:distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dDistanceAttribute() {
+		Dr3dDistanceAttribute attr = (Dr3dDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dDistanceAttribute</code> , See {@odf.attribute dr3d:distance}
+	 *
+	 * @param dr3dDistanceValue   The type is <code>String</code>
+	 */
+	public void setDr3dDistanceAttribute(String dr3dDistanceValue) {
+		Dr3dDistanceAttribute attr = new Dr3dDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dFocalLengthAttribute</code> , See {@odf.attribute dr3d:focal-length}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dFocalLengthAttribute() {
+		Dr3dFocalLengthAttribute attr = (Dr3dFocalLengthAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "focal-length");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dFocalLengthAttribute</code> , See {@odf.attribute dr3d:focal-length}
+	 *
+	 * @param dr3dFocalLengthValue   The type is <code>String</code>
+	 */
+	public void setDr3dFocalLengthAttribute(String dr3dFocalLengthValue) {
+		Dr3dFocalLengthAttribute attr = new Dr3dFocalLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dFocalLengthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dLightingModeAttribute</code> , See {@odf.attribute dr3d:lighting-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dLightingModeAttribute() {
+		Dr3dLightingModeAttribute attr = (Dr3dLightingModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "lighting-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dLightingModeAttribute</code> , See {@odf.attribute dr3d:lighting-mode}
+	 *
+	 * @param dr3dLightingModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dLightingModeAttribute(String dr3dLightingModeValue) {
+		Dr3dLightingModeAttribute attr = new Dr3dLightingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dLightingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dProjectionAttribute</code> , See {@odf.attribute dr3d:projection}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dProjectionAttribute() {
+		Dr3dProjectionAttribute attr = (Dr3dProjectionAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "projection");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dProjectionAttribute</code> , See {@odf.attribute dr3d:projection}
+	 *
+	 * @param dr3dProjectionValue   The type is <code>String</code>
+	 */
+	public void setDr3dProjectionAttribute(String dr3dProjectionValue) {
+		Dr3dProjectionAttribute attr = new Dr3dProjectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dProjectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShadeModeAttribute</code> , See {@odf.attribute dr3d:shade-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShadeModeAttribute() {
+		Dr3dShadeModeAttribute attr = (Dr3dShadeModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shade-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShadeModeAttribute</code> , See {@odf.attribute dr3d:shade-mode}
+	 *
+	 * @param dr3dShadeModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dShadeModeAttribute(String dr3dShadeModeValue) {
+		Dr3dShadeModeAttribute attr = new Dr3dShadeModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShadeModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShadowSlantAttribute</code> , See {@odf.attribute dr3d:shadow-slant}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShadowSlantAttribute() {
+		Dr3dShadowSlantAttribute attr = (Dr3dShadowSlantAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shadow-slant");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShadowSlantAttribute</code> , See {@odf.attribute dr3d:shadow-slant}
+	 *
+	 * @param dr3dShadowSlantValue   The type is <code>String</code>
+	 */
+	public void setDr3dShadowSlantAttribute(String dr3dShadowSlantValue) {
+		Dr3dShadowSlantAttribute attr = new Dr3dShadowSlantAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShadowSlantValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTransformAttribute() {
+		Dr3dTransformAttribute attr = (Dr3dTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @param dr3dTransformValue   The type is <code>String</code>
+	 */
+	public void setDr3dTransformAttribute(String dr3dTransformValue) {
+		Dr3dTransformAttribute attr = new Dr3dTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVpnAttribute</code> , See {@odf.attribute dr3d:vpn}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dVpnAttribute() {
+		Dr3dVpnAttribute attr = (Dr3dVpnAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vpn");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVpnAttribute</code> , See {@odf.attribute dr3d:vpn}
+	 *
+	 * @param dr3dVpnValue   The type is <code>String</code>
+	 */
+	public void setDr3dVpnAttribute(String dr3dVpnValue) {
+		Dr3dVpnAttribute attr = new Dr3dVpnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dVpnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVrpAttribute</code> , See {@odf.attribute dr3d:vrp}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dVrpAttribute() {
+		Dr3dVrpAttribute attr = (Dr3dVrpAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vrp");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVrpAttribute</code> , See {@odf.attribute dr3d:vrp}
+	 *
+	 * @param dr3dVrpValue   The type is <code>String</code>
+	 */
+	public void setDr3dVrpAttribute(String dr3dVrpValue) {
+		Dr3dVrpAttribute attr = new Dr3dVrpAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dVrpValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVupAttribute</code> , See {@odf.attribute dr3d:vup}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dVupAttribute() {
+		Dr3dVupAttribute attr = (Dr3dVupAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vup");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVupAttribute</code> , See {@odf.attribute dr3d:vup}
+	 *
+	 * @param dr3dVupValue   The type is <code>String</code>
+	 */
+	public void setDr3dVupAttribute(String dr3dVupValue) {
+		Dr3dVupAttribute attr = new Dr3dVupAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dVupValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassNamesAttribute() {
+		DrawClassNamesAttribute attr = (DrawClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @param drawClassNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawClassNamesAttribute(String drawClassNamesValue) {
+		DrawClassNamesAttribute attr = new DrawClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawZIndexAttribute() {
+		DrawZIndexAttribute attr = (DrawZIndexAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "z-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @param drawZIndexValue   The type is <code>Integer</code>
+	 */
+	public void setDrawZIndexAttribute(Integer drawZIndexValue) {
+		DrawZIndexAttribute attr = new DrawZIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawZIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassNamesAttribute() {
+		PresentationClassNamesAttribute attr = (PresentationClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @param presentationClassNamesValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassNamesAttribute(String presentationClassNamesValue) {
+		PresentationClassNamesAttribute attr = new PresentationClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStyleNameAttribute() {
+		PresentationStyleNameAttribute attr = (PresentationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @param presentationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationStyleNameAttribute(String presentationStyleNameValue) {
+		PresentationStyleNameAttribute attr = new PresentationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndCellAddressAttribute</code> , See {@odf.attribute table:end-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEndCellAddressAttribute() {
+		TableEndCellAddressAttribute attr = (TableEndCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndCellAddressAttribute</code> , See {@odf.attribute table:end-cell-address}
+	 *
+	 * @param tableEndCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableEndCellAddressAttribute(String tableEndCellAddressValue) {
+		TableEndCellAddressAttribute attr = new TableEndCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEndCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndXAttribute</code> , See {@odf.attribute table:end-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEndXAttribute() {
+		TableEndXAttribute attr = (TableEndXAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndXAttribute</code> , See {@odf.attribute table:end-x}
+	 *
+	 * @param tableEndXValue   The type is <code>String</code>
+	 */
+	public void setTableEndXAttribute(String tableEndXValue) {
+		TableEndXAttribute attr = new TableEndXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEndXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndYAttribute</code> , See {@odf.attribute table:end-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEndYAttribute() {
+		TableEndYAttribute attr = (TableEndYAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndYAttribute</code> , See {@odf.attribute table:end-y}
+	 *
+	 * @param tableEndYValue   The type is <code>String</code>
+	 */
+	public void setTableEndYAttribute(String tableEndYValue) {
+		TableEndYAttribute attr = new TableEndYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEndYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableBackgroundAttribute</code> , See {@odf.attribute table:table-background}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableTableBackgroundAttribute() {
+		TableTableBackgroundAttribute attr = (TableTableBackgroundAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table-background");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableBackgroundAttribute</code> , See {@odf.attribute table:table-background}
+	 *
+	 * @param tableTableBackgroundValue   The type is <code>Boolean</code>
+	 */
+	public void setTableTableBackgroundAttribute(Boolean tableTableBackgroundValue) {
+		TableTableBackgroundAttribute attr = new TableTableBackgroundAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableTableBackgroundValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnchorPageNumberAttribute</code> , See {@odf.attribute text:anchor-page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextAnchorPageNumberAttribute() {
+		TextAnchorPageNumberAttribute attr = (TextAnchorPageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "anchor-page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnchorPageNumberAttribute</code> , See {@odf.attribute text:anchor-page-number}
+	 *
+	 * @param textAnchorPageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTextAnchorPageNumberAttribute(Integer textAnchorPageNumberValue) {
+		TextAnchorPageNumberAttribute attr = new TextAnchorPageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textAnchorPageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnchorTypeAttribute</code> , See {@odf.attribute text:anchor-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnchorTypeAttribute() {
+		TextAnchorTypeAttribute attr = (TextAnchorTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "anchor-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnchorTypeAttribute</code> , See {@odf.attribute text:anchor-type}
+	 *
+	 * @param textAnchorTypeValue   The type is <code>String</code>
+	 */
+	public void setTextAnchorTypeAttribute(String textAnchorTypeValue) {
+		TextAnchorTypeAttribute attr = new TextAnchorTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnchorTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:cube}.
+	 *
+	 * @return the element {@odf.element dr3d:cube}
+	 */
+	public Dr3dCubeElement newDr3dCubeElement() {
+		Dr3dCubeElement dr3dCube = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dCubeElement.class);
+		this.appendChild(dr3dCube);
+		return dr3dCube;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:extrude}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element dr3d:extrude}
+	 */
+	 public Dr3dExtrudeElement newDr3dExtrudeElement(String svgDValue, int svgViewBoxValue) {
+		Dr3dExtrudeElement dr3dExtrude = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dExtrudeElement.class);
+		dr3dExtrude.setSvgDAttribute(svgDValue);
+		dr3dExtrude.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(dr3dExtrude);
+		return dr3dExtrude;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:light}.
+	 *
+	 * @param dr3dDirectionValue  the <code>String</code> value of <code>Dr3dDirectionAttribute</code>, see {@odf.attribute  dr3d:direction} at specification
+	 * @return the element {@odf.element dr3d:light}
+	 */
+	 public Dr3dLightElement newDr3dLightElement(String dr3dDirectionValue) {
+		Dr3dLightElement dr3dLight = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dLightElement.class);
+		dr3dLight.setDr3dDirectionAttribute(dr3dDirectionValue);
+		this.appendChild(dr3dLight);
+		return dr3dLight;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:rotate}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element dr3d:rotate}
+	 */
+	 public Dr3dRotateElement newDr3dRotateElement(String svgDValue, int svgViewBoxValue) {
+		Dr3dRotateElement dr3dRotate = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dRotateElement.class);
+		dr3dRotate.setSvgDAttribute(svgDValue);
+		dr3dRotate.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(dr3dRotate);
+		return dr3dRotate;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:sphere}.
+	 *
+	 * @return the element {@odf.element dr3d:sphere}
+	 */
+	public Dr3dSphereElement newDr3dSphereElement() {
+		Dr3dSphereElement dr3dSphere = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSphereElement.class);
+		this.appendChild(dr3dSphere);
+		return dr3dSphere;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dSphereElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dSphereElement.java
new file mode 100644
index 0000000..fdabf6e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/dr3d/Dr3dSphereElement.java
@@ -0,0 +1,348 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.dr3d;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dCenterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawZIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element dr3d:sphere}.
+ *
+ */
+public class Dr3dSphereElement extends OdfStyleableShapeElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DR3D, "sphere");
+
+	/**
+	 * Create the instance of <code>Dr3dSphereElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public Dr3dSphereElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dr3d:sphere}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dCenterAttribute</code> , See {@odf.attribute dr3d:center}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dCenterAttribute() {
+		Dr3dCenterAttribute attr = (Dr3dCenterAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "center");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dCenterAttribute</code> , See {@odf.attribute dr3d:center}
+	 *
+	 * @param dr3dCenterValue   The type is <code>String</code>
+	 */
+	public void setDr3dCenterAttribute(String dr3dCenterValue) {
+		Dr3dCenterAttribute attr = new Dr3dCenterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dCenterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dSizeAttribute</code> , See {@odf.attribute dr3d:size}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dSizeAttribute() {
+		Dr3dSizeAttribute attr = (Dr3dSizeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "size");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dSizeAttribute</code> , See {@odf.attribute dr3d:size}
+	 *
+	 * @param dr3dSizeValue   The type is <code>String</code>
+	 */
+	public void setDr3dSizeAttribute(String dr3dSizeValue) {
+		Dr3dSizeAttribute attr = new Dr3dSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dSizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTransformAttribute() {
+		Dr3dTransformAttribute attr = (Dr3dTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTransformAttribute</code> , See {@odf.attribute dr3d:transform}
+	 *
+	 * @param dr3dTransformValue   The type is <code>String</code>
+	 */
+	public void setDr3dTransformAttribute(String dr3dTransformValue) {
+		Dr3dTransformAttribute attr = new Dr3dTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassNamesAttribute() {
+		DrawClassNamesAttribute attr = (DrawClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @param drawClassNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawClassNamesAttribute(String drawClassNamesValue) {
+		DrawClassNamesAttribute attr = new DrawClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawZIndexAttribute() {
+		DrawZIndexAttribute attr = (DrawZIndexAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "z-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @param drawZIndexValue   The type is <code>Integer</code>
+	 */
+	public void setDrawZIndexAttribute(Integer drawZIndexValue) {
+		DrawZIndexAttribute attr = new DrawZIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawZIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassNamesAttribute() {
+		PresentationClassNamesAttribute attr = (PresentationClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @param presentationClassNamesValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassNamesAttribute(String presentationClassNamesValue) {
+		PresentationClassNamesAttribute attr = new PresentationClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStyleNameAttribute() {
+		PresentationStyleNameAttribute attr = (PresentationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @param presentationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationStyleNameAttribute(String presentationStyleNameValue) {
+		PresentationStyleNameAttribute attr = new PresentationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAElement.java
new file mode 100644
index 0000000..5a57ebb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAElement.java
@@ -0,0 +1,556 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeServerMapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:a}.
+ *
+ */
+public class DrawAElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "a");
+
+	/**
+	 * Create the instance of <code>DrawAElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawAElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:a}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeServerMapAttribute</code> , See {@odf.attribute office:server-map}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeServerMapAttribute() {
+		OfficeServerMapAttribute attr = (OfficeServerMapAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "server-map");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(OfficeServerMapAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeServerMapAttribute</code> , See {@odf.attribute office:server-map}
+	 *
+	 * @param officeServerMapValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeServerMapAttribute(Boolean officeServerMapValue) {
+		OfficeServerMapAttribute attr = new OfficeServerMapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeServerMapValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameNameAttribute() {
+		OfficeTargetFrameNameAttribute attr = (OfficeTargetFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @param officeTargetFrameNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameNameAttribute(String officeTargetFrameNameValue) {
+		OfficeTargetFrameNameAttribute attr = new OfficeTargetFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTitleAttribute</code> , See {@odf.attribute office:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTitleAttribute() {
+		OfficeTitleAttribute attr = (OfficeTitleAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTitleAttribute</code> , See {@odf.attribute office:title}
+	 *
+	 * @param officeTitleValue   The type is <code>String</code>
+	 */
+	public void setOfficeTitleAttribute(String officeTitleValue) {
+		OfficeTitleAttribute attr = new OfficeTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAppletElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAppletElement.java
new file mode 100644
index 0000000..df7d814
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAppletElement.java
@@ -0,0 +1,307 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawArchiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCodeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMayScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawObjectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:applet}.
+ *
+ */
+public class DrawAppletElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "applet");
+
+	/**
+	 * Create the instance of <code>DrawAppletElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawAppletElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:applet}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawArchiveAttribute</code> , See {@odf.attribute draw:archive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawArchiveAttribute() {
+		DrawArchiveAttribute attr = (DrawArchiveAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "archive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawArchiveAttribute</code> , See {@odf.attribute draw:archive}
+	 *
+	 * @param drawArchiveValue   The type is <code>String</code>
+	 */
+	public void setDrawArchiveAttribute(String drawArchiveValue) {
+		DrawArchiveAttribute attr = new DrawArchiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawArchiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCodeAttribute</code> , See {@odf.attribute draw:code}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCodeAttribute() {
+		DrawCodeAttribute attr = (DrawCodeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "code");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCodeAttribute</code> , See {@odf.attribute draw:code}
+	 *
+	 * @param drawCodeValue   The type is <code>String</code>
+	 */
+	public void setDrawCodeAttribute(String drawCodeValue) {
+		DrawCodeAttribute attr = new DrawCodeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCodeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMayScriptAttribute</code> , See {@odf.attribute draw:may-script}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawMayScriptAttribute() {
+		DrawMayScriptAttribute attr = (DrawMayScriptAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "may-script");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawMayScriptAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMayScriptAttribute</code> , See {@odf.attribute draw:may-script}
+	 *
+	 * @param drawMayScriptValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawMayScriptAttribute(Boolean drawMayScriptValue) {
+		DrawMayScriptAttribute attr = new DrawMayScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawMayScriptValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawObjectAttribute</code> , See {@odf.attribute draw:object}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawObjectAttribute() {
+		DrawObjectAttribute attr = (DrawObjectAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "object");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawObjectAttribute</code> , See {@odf.attribute draw:object}
+	 *
+	 * @param drawObjectValue   The type is <code>String</code>
+	 */
+	public void setDrawObjectAttribute(String drawObjectValue) {
+		DrawObjectAttribute attr = new DrawObjectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawObjectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:param}.
+	 *
+	 * @return the element {@odf.element draw:param}
+	 */
+	public DrawParamElement newDrawParamElement() {
+		DrawParamElement drawParam = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawParamElement.class);
+		this.appendChild(drawParam);
+		return drawParam;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaCircleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaCircleElement.java
new file mode 100644
index 0000000..fcbb903
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaCircleElement.java
@@ -0,0 +1,338 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNohrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:area-circle}.
+ *
+ */
+public class DrawAreaCircleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "area-circle");
+
+	/**
+	 * Create the instance of <code>DrawAreaCircleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawAreaCircleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:area-circle}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNohrefAttribute</code> , See {@odf.attribute draw:nohref}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNohrefAttribute() {
+		DrawNohrefAttribute attr = (DrawNohrefAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "nohref");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNohrefAttribute</code> , See {@odf.attribute draw:nohref}
+	 *
+	 * @param drawNohrefValue   The type is <code>String</code>
+	 */
+	public void setDrawNohrefAttribute(String drawNohrefValue) {
+		DrawNohrefAttribute attr = new DrawNohrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNohrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameNameAttribute() {
+		OfficeTargetFrameNameAttribute attr = (OfficeTargetFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @param officeTargetFrameNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameNameAttribute(String officeTargetFrameNameValue) {
+		OfficeTargetFrameNameAttribute attr = new OfficeTargetFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCxAttribute() {
+		SvgCxAttribute attr = (SvgCxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @param svgCxValue   The type is <code>String</code>
+	 */
+	public void setSvgCxAttribute(String svgCxValue) {
+		SvgCxAttribute attr = new SvgCxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCyAttribute() {
+		SvgCyAttribute attr = (SvgCyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @param svgCyValue   The type is <code>String</code>
+	 */
+	public void setSvgCyAttribute(String svgCyValue) {
+		SvgCyAttribute attr = new SvgCyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRAttribute</code> , See {@odf.attribute svg:r}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRAttribute() {
+		SvgRAttribute attr = (SvgRAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "r");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRAttribute</code> , See {@odf.attribute svg:r}
+	 *
+	 * @param svgRValue   The type is <code>String</code>
+	 */
+	public void setSvgRAttribute(String svgRValue) {
+		SvgRAttribute attr = new SvgRAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaPolygonElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaPolygonElement.java
new file mode 100644
index 0000000..ccf8df4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaPolygonElement.java
@@ -0,0 +1,419 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNohrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPointsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:area-polygon}.
+ *
+ */
+public class DrawAreaPolygonElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "area-polygon");
+
+	/**
+	 * Create the instance of <code>DrawAreaPolygonElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawAreaPolygonElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:area-polygon}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNohrefAttribute</code> , See {@odf.attribute draw:nohref}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNohrefAttribute() {
+		DrawNohrefAttribute attr = (DrawNohrefAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "nohref");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNohrefAttribute</code> , See {@odf.attribute draw:nohref}
+	 *
+	 * @param drawNohrefValue   The type is <code>String</code>
+	 */
+	public void setDrawNohrefAttribute(String drawNohrefValue) {
+		DrawNohrefAttribute attr = new DrawNohrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNohrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawPointsAttribute() {
+		DrawPointsAttribute attr = (DrawPointsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "points");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * @param drawPointsValue   The type is <code>String</code>
+	 */
+	public void setDrawPointsAttribute(String drawPointsValue) {
+		DrawPointsAttribute attr = new DrawPointsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawPointsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameNameAttribute() {
+		OfficeTargetFrameNameAttribute attr = (OfficeTargetFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @param officeTargetFrameNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameNameAttribute(String officeTargetFrameNameValue) {
+		OfficeTargetFrameNameAttribute attr = new OfficeTargetFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaRectangleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaRectangleElement.java
new file mode 100644
index 0000000..608f1e9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawAreaRectangleElement.java
@@ -0,0 +1,365 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNohrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:area-rectangle}.
+ *
+ */
+public class DrawAreaRectangleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "area-rectangle");
+
+	/**
+	 * Create the instance of <code>DrawAreaRectangleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawAreaRectangleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:area-rectangle}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNohrefAttribute</code> , See {@odf.attribute draw:nohref}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNohrefAttribute() {
+		DrawNohrefAttribute attr = (DrawNohrefAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "nohref");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNohrefAttribute</code> , See {@odf.attribute draw:nohref}
+	 *
+	 * @param drawNohrefValue   The type is <code>String</code>
+	 */
+	public void setDrawNohrefAttribute(String drawNohrefValue) {
+		DrawNohrefAttribute attr = new DrawNohrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNohrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameNameAttribute() {
+		OfficeTargetFrameNameAttribute attr = (OfficeTargetFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @param officeTargetFrameNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameNameAttribute(String officeTargetFrameNameValue) {
+		OfficeTargetFrameNameAttribute attr = new OfficeTargetFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCaptionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCaptionElement.java
new file mode 100644
index 0000000..66338ca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCaptionElement.java
@@ -0,0 +1,427 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionPointXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionPointYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCornerRadiusAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:caption}.
+ *
+ */
+public class DrawCaptionElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "caption");
+
+	/**
+	 * Create the instance of <code>DrawCaptionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawCaptionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:caption}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionPointXAttribute</code> , See {@odf.attribute draw:caption-point-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionPointXAttribute() {
+		DrawCaptionPointXAttribute attr = (DrawCaptionPointXAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-point-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionPointXAttribute</code> , See {@odf.attribute draw:caption-point-x}
+	 *
+	 * @param drawCaptionPointXValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionPointXAttribute(String drawCaptionPointXValue) {
+		DrawCaptionPointXAttribute attr = new DrawCaptionPointXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionPointXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionPointYAttribute</code> , See {@odf.attribute draw:caption-point-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionPointYAttribute() {
+		DrawCaptionPointYAttribute attr = (DrawCaptionPointYAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-point-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionPointYAttribute</code> , See {@odf.attribute draw:caption-point-y}
+	 *
+	 * @param drawCaptionPointYValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionPointYAttribute(String drawCaptionPointYValue) {
+		DrawCaptionPointYAttribute attr = new DrawCaptionPointYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionPointYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCornerRadiusAttribute() {
+		DrawCornerRadiusAttribute attr = (DrawCornerRadiusAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "corner-radius");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @param drawCornerRadiusValue   The type is <code>String</code>
+	 */
+	public void setDrawCornerRadiusAttribute(String drawCornerRadiusValue) {
+		DrawCornerRadiusAttribute attr = new DrawCornerRadiusAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCornerRadiusValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCircleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCircleElement.java
new file mode 100644
index 0000000..2000b0f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCircleElement.java
@@ -0,0 +1,502 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawKindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:circle}.
+ *
+ */
+public class DrawCircleElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "circle");
+
+	/**
+	 * Create the instance of <code>DrawCircleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawCircleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:circle}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndAngleAttribute</code> , See {@odf.attribute draw:end-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndAngleAttribute() {
+		DrawEndAngleAttribute attr = (DrawEndAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndAngleAttribute</code> , See {@odf.attribute draw:end-angle}
+	 *
+	 * @param drawEndAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawEndAngleAttribute(String drawEndAngleValue) {
+		DrawEndAngleAttribute attr = new DrawEndAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawKindAttribute</code> , See {@odf.attribute draw:kind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawKindAttribute() {
+		DrawKindAttribute attr = (DrawKindAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "kind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawKindAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawKindAttribute</code> , See {@odf.attribute draw:kind}
+	 *
+	 * @param drawKindValue   The type is <code>String</code>
+	 */
+	public void setDrawKindAttribute(String drawKindValue) {
+		DrawKindAttribute attr = new DrawKindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawKindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartAngleAttribute</code> , See {@odf.attribute draw:start-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartAngleAttribute() {
+		DrawStartAngleAttribute attr = (DrawStartAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartAngleAttribute</code> , See {@odf.attribute draw:start-angle}
+	 *
+	 * @param drawStartAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawStartAngleAttribute(String drawStartAngleValue) {
+		DrawStartAngleAttribute attr = new DrawStartAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCxAttribute() {
+		SvgCxAttribute attr = (SvgCxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @param svgCxValue   The type is <code>String</code>
+	 */
+	public void setSvgCxAttribute(String svgCxValue) {
+		SvgCxAttribute attr = new SvgCxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCyAttribute() {
+		SvgCyAttribute attr = (SvgCyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @param svgCyValue   The type is <code>String</code>
+	 */
+	public void setSvgCyAttribute(String svgCyValue) {
+		SvgCyAttribute attr = new SvgCyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRAttribute</code> , See {@odf.attribute svg:r}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRAttribute() {
+		SvgRAttribute attr = (SvgRAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "r");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRAttribute</code> , See {@odf.attribute svg:r}
+	 *
+	 * @param svgRValue   The type is <code>String</code>
+	 */
+	public void setSvgRAttribute(String svgRValue) {
+		SvgRAttribute attr = new SvgRAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawConnectorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawConnectorElement.java
new file mode 100644
index 0000000..418d75d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawConnectorElement.java
@@ -0,0 +1,554 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndGluePointAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndShapeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLineSkewAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartGluePointAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartShapeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY2Attribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:connector}.
+ *
+ */
+public class DrawConnectorElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "connector");
+
+	/**
+	 * Create the instance of <code>DrawConnectorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawConnectorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:connector}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndGluePointAttribute</code> , See {@odf.attribute draw:end-glue-point}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawEndGluePointAttribute() {
+		DrawEndGluePointAttribute attr = (DrawEndGluePointAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-glue-point");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndGluePointAttribute</code> , See {@odf.attribute draw:end-glue-point}
+	 *
+	 * @param drawEndGluePointValue   The type is <code>Integer</code>
+	 */
+	public void setDrawEndGluePointAttribute(Integer drawEndGluePointValue) {
+		DrawEndGluePointAttribute attr = new DrawEndGluePointAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawEndGluePointValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndShapeAttribute</code> , See {@odf.attribute draw:end-shape}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndShapeAttribute() {
+		DrawEndShapeAttribute attr = (DrawEndShapeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-shape");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndShapeAttribute</code> , See {@odf.attribute draw:end-shape}
+	 *
+	 * @param drawEndShapeValue   The type is <code>String</code>
+	 */
+	public void setDrawEndShapeAttribute(String drawEndShapeValue) {
+		DrawEndShapeAttribute attr = new DrawEndShapeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndShapeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLineSkewAttribute</code> , See {@odf.attribute draw:line-skew}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLineSkewAttribute() {
+		DrawLineSkewAttribute attr = (DrawLineSkewAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "line-skew");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLineSkewAttribute</code> , See {@odf.attribute draw:line-skew}
+	 *
+	 * @param drawLineSkewValue   The type is <code>String</code>
+	 */
+	public void setDrawLineSkewAttribute(String drawLineSkewValue) {
+		DrawLineSkewAttribute attr = new DrawLineSkewAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLineSkewValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartGluePointAttribute</code> , See {@odf.attribute draw:start-glue-point}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawStartGluePointAttribute() {
+		DrawStartGluePointAttribute attr = (DrawStartGluePointAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-glue-point");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartGluePointAttribute</code> , See {@odf.attribute draw:start-glue-point}
+	 *
+	 * @param drawStartGluePointValue   The type is <code>Integer</code>
+	 */
+	public void setDrawStartGluePointAttribute(Integer drawStartGluePointValue) {
+		DrawStartGluePointAttribute attr = new DrawStartGluePointAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawStartGluePointValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartShapeAttribute</code> , See {@odf.attribute draw:start-shape}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartShapeAttribute() {
+		DrawStartShapeAttribute attr = (DrawStartShapeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-shape");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartShapeAttribute</code> , See {@odf.attribute draw:start-shape}
+	 *
+	 * @param drawStartShapeValue   The type is <code>String</code>
+	 */
+	public void setDrawStartShapeAttribute(String drawStartShapeValue) {
+		DrawStartShapeAttribute attr = new DrawStartShapeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartShapeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTypeAttribute</code> , See {@odf.attribute draw:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTypeAttribute() {
+		DrawTypeAttribute attr = (DrawTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawTypeAttribute.DEFAULT_VALUE_STANDARD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTypeAttribute</code> , See {@odf.attribute draw:type}
+	 *
+	 * @param drawTypeValue   The type is <code>String</code>
+	 */
+	public void setDrawTypeAttribute(String drawTypeValue) {
+		DrawTypeAttribute attr = new DrawTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgDAttribute() {
+		SvgDAttribute attr = (SvgDAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "d");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @param svgDValue   The type is <code>String</code>
+	 */
+	public void setSvgDAttribute(String svgDValue) {
+		SvgDAttribute attr = new SvgDAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgDValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX1Attribute() {
+		SvgX1Attribute attr = (SvgX1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * @param svgX1Value   The type is <code>String</code>
+	 */
+	public void setSvgX1Attribute(String svgX1Value) {
+		SvgX1Attribute attr = new SvgX1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX2Attribute() {
+		SvgX2Attribute attr = (SvgX2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * @param svgX2Value   The type is <code>String</code>
+	 */
+	public void setSvgX2Attribute(String svgX2Value) {
+		SvgX2Attribute attr = new SvgX2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY1Attribute() {
+		SvgY1Attribute attr = (SvgY1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * @param svgY1Value   The type is <code>String</code>
+	 */
+	public void setSvgY1Attribute(String svgY1Value) {
+		SvgY1Attribute attr = new SvgY1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY2Attribute() {
+		SvgY2Attribute attr = (SvgY2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * @param svgY2Value   The type is <code>String</code>
+	 */
+	public void setSvgY2Attribute(String svgY2Value) {
+		SvgY2Attribute attr = new SvgY2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY2Value);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawContourPathElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawContourPathElement.java
new file mode 100644
index 0000000..50cdcf1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawContourPathElement.java
@@ -0,0 +1,202 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawRecreateOnEditAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:contour-path}.
+ *
+ */
+public class DrawContourPathElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "contour-path");
+
+	/**
+	 * Create the instance of <code>DrawContourPathElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawContourPathElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:contour-path}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawRecreateOnEditAttribute</code> , See {@odf.attribute draw:recreate-on-edit}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawRecreateOnEditAttribute() {
+		DrawRecreateOnEditAttribute attr = (DrawRecreateOnEditAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "recreate-on-edit");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawRecreateOnEditAttribute</code> , See {@odf.attribute draw:recreate-on-edit}
+	 *
+	 * @param drawRecreateOnEditValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawRecreateOnEditAttribute(Boolean drawRecreateOnEditValue) {
+		DrawRecreateOnEditAttribute attr = new DrawRecreateOnEditAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawRecreateOnEditValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgDAttribute() {
+		SvgDAttribute attr = (SvgDAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "d");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @param svgDValue   The type is <code>String</code>
+	 */
+	public void setSvgDAttribute(String svgDValue) {
+		SvgDAttribute attr = new SvgDAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgDValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawContourPolygonElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawContourPolygonElement.java
new file mode 100644
index 0000000..68fd650
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawContourPolygonElement.java
@@ -0,0 +1,202 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPointsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawRecreateOnEditAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:contour-polygon}.
+ *
+ */
+public class DrawContourPolygonElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "contour-polygon");
+
+	/**
+	 * Create the instance of <code>DrawContourPolygonElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawContourPolygonElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:contour-polygon}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawPointsAttribute() {
+		DrawPointsAttribute attr = (DrawPointsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "points");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * @param drawPointsValue   The type is <code>String</code>
+	 */
+	public void setDrawPointsAttribute(String drawPointsValue) {
+		DrawPointsAttribute attr = new DrawPointsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawPointsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawRecreateOnEditAttribute</code> , See {@odf.attribute draw:recreate-on-edit}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawRecreateOnEditAttribute() {
+		DrawRecreateOnEditAttribute attr = (DrawRecreateOnEditAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "recreate-on-edit");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawRecreateOnEditAttribute</code> , See {@odf.attribute draw:recreate-on-edit}
+	 *
+	 * @param drawRecreateOnEditValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawRecreateOnEditAttribute(Boolean drawRecreateOnEditValue) {
+		DrawRecreateOnEditAttribute attr = new DrawRecreateOnEditAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawRecreateOnEditValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawControlElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawControlElement.java
new file mode 100644
index 0000000..07b396f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawControlElement.java
@@ -0,0 +1,343 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawControlAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:control}.
+ *
+ */
+public class DrawControlElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "control");
+
+	/**
+	 * Create the instance of <code>DrawControlElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawControlElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:control}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawControlAttribute</code> , See {@odf.attribute draw:control}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawControlAttribute() {
+		DrawControlAttribute attr = (DrawControlAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "control");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawControlAttribute</code> , See {@odf.attribute draw:control}
+	 *
+	 * @param drawControlValue   The type is <code>String</code>
+	 */
+	public void setDrawControlAttribute(String drawControlValue) {
+		DrawControlAttribute attr = new DrawControlAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawControlValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCustomShapeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCustomShapeElement.java
new file mode 100644
index 0000000..1818fce
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawCustomShapeElement.java
@@ -0,0 +1,413 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEngineAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:custom-shape}.
+ *
+ */
+public class DrawCustomShapeElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "custom-shape");
+
+	/**
+	 * Create the instance of <code>DrawCustomShapeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawCustomShapeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:custom-shape}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDataAttribute</code> , See {@odf.attribute draw:data}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDataAttribute() {
+		DrawDataAttribute attr = (DrawDataAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "data");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDataAttribute</code> , See {@odf.attribute draw:data}
+	 *
+	 * @param drawDataValue   The type is <code>String</code>
+	 */
+	public void setDrawDataAttribute(String drawDataValue) {
+		DrawDataAttribute attr = new DrawDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDataValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEngineAttribute</code> , See {@odf.attribute draw:engine}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEngineAttribute() {
+		DrawEngineAttribute attr = (DrawEngineAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "engine");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEngineAttribute</code> , See {@odf.attribute draw:engine}
+	 *
+	 * @param drawEngineValue   The type is <code>String</code>
+	 */
+	public void setDrawEngineAttribute(String drawEngineValue) {
+		DrawEngineAttribute attr = new DrawEngineAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEngineValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:enhanced-geometry}.
+	 *
+	 * @return the element {@odf.element draw:enhanced-geometry}
+	 */
+	public DrawEnhancedGeometryElement newDrawEnhancedGeometryElement() {
+		DrawEnhancedGeometryElement drawEnhancedGeometry = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEnhancedGeometryElement.class);
+		this.appendChild(drawEnhancedGeometry);
+		return drawEnhancedGeometry;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEllipseElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEllipseElement.java
new file mode 100644
index 0000000..9e126e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEllipseElement.java
@@ -0,0 +1,527 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawKindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:ellipse}.
+ *
+ */
+public class DrawEllipseElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "ellipse");
+
+	/**
+	 * Create the instance of <code>DrawEllipseElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawEllipseElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:ellipse}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndAngleAttribute</code> , See {@odf.attribute draw:end-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndAngleAttribute() {
+		DrawEndAngleAttribute attr = (DrawEndAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndAngleAttribute</code> , See {@odf.attribute draw:end-angle}
+	 *
+	 * @param drawEndAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawEndAngleAttribute(String drawEndAngleValue) {
+		DrawEndAngleAttribute attr = new DrawEndAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawKindAttribute</code> , See {@odf.attribute draw:kind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawKindAttribute() {
+		DrawKindAttribute attr = (DrawKindAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "kind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawKindAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawKindAttribute</code> , See {@odf.attribute draw:kind}
+	 *
+	 * @param drawKindValue   The type is <code>String</code>
+	 */
+	public void setDrawKindAttribute(String drawKindValue) {
+		DrawKindAttribute attr = new DrawKindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawKindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartAngleAttribute</code> , See {@odf.attribute draw:start-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartAngleAttribute() {
+		DrawStartAngleAttribute attr = (DrawStartAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartAngleAttribute</code> , See {@odf.attribute draw:start-angle}
+	 *
+	 * @param drawStartAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawStartAngleAttribute(String drawStartAngleValue) {
+		DrawStartAngleAttribute attr = new DrawStartAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCxAttribute() {
+		SvgCxAttribute attr = (SvgCxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @param svgCxValue   The type is <code>String</code>
+	 */
+	public void setSvgCxAttribute(String svgCxValue) {
+		SvgCxAttribute attr = new SvgCxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCyAttribute() {
+		SvgCyAttribute attr = (SvgCyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @param svgCyValue   The type is <code>String</code>
+	 */
+	public void setSvgCyAttribute(String svgCyValue) {
+		SvgCyAttribute attr = new SvgCyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRxAttribute</code> , See {@odf.attribute svg:rx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRxAttribute() {
+		SvgRxAttribute attr = (SvgRxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "rx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRxAttribute</code> , See {@odf.attribute svg:rx}
+	 *
+	 * @param svgRxValue   The type is <code>String</code>
+	 */
+	public void setSvgRxAttribute(String svgRxValue) {
+		SvgRxAttribute attr = new SvgRxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRyAttribute</code> , See {@odf.attribute svg:ry}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRyAttribute() {
+		SvgRyAttribute attr = (SvgRyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "ry");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRyAttribute</code> , See {@odf.attribute svg:ry}
+	 *
+	 * @param svgRyValue   The type is <code>String</code>
+	 */
+	public void setSvgRyAttribute(String svgRyValue) {
+		SvgRyAttribute attr = new SvgRyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEnhancedGeometryElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEnhancedGeometryElement.java
new file mode 100644
index 0000000..23535a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEnhancedGeometryElement.java
@@ -0,0 +1,1170 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dProjectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadeModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawConcentricGradientFillAllowedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEnhancedPathAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionAllowedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionBrightnessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionDepthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionDiffusionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionFirstLightDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionFirstLightHarshAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionFirstLightLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionLightFaceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionMetalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionNumberOfLineSegmentsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionOriginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionRotationAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionRotationCenterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionSecondLightDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionSecondLightHarshAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionSecondLightLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionShininessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionSkewAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionSpecularityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawExtrusionViewpointAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGluePointLeavingDirectionsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGluePointTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGluePointsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMirrorHorizontalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMirrorVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawModifiersAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPathStretchpointXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPathStretchpointYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextAreasAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextPathAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextPathAllowedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextPathModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextPathSameLetterHeightsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextPathScaleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextRotateAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:enhanced-geometry}.
+ *
+ */
+public class DrawEnhancedGeometryElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "enhanced-geometry");
+
+	/**
+	 * Create the instance of <code>DrawEnhancedGeometryElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawEnhancedGeometryElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:enhanced-geometry}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dProjectionAttribute</code> , See {@odf.attribute dr3d:projection}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dProjectionAttribute() {
+		Dr3dProjectionAttribute attr = (Dr3dProjectionAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "projection");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return Dr3dProjectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dProjectionAttribute</code> , See {@odf.attribute dr3d:projection}
+	 *
+	 * @param dr3dProjectionValue   The type is <code>String</code>
+	 */
+	public void setDr3dProjectionAttribute(String dr3dProjectionValue) {
+		Dr3dProjectionAttribute attr = new Dr3dProjectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dProjectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShadeModeAttribute</code> , See {@odf.attribute dr3d:shade-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShadeModeAttribute() {
+		Dr3dShadeModeAttribute attr = (Dr3dShadeModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shade-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return Dr3dShadeModeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShadeModeAttribute</code> , See {@odf.attribute dr3d:shade-mode}
+	 *
+	 * @param dr3dShadeModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dShadeModeAttribute(String dr3dShadeModeValue) {
+		Dr3dShadeModeAttribute attr = new Dr3dShadeModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShadeModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawConcentricGradientFillAllowedAttribute</code> , See {@odf.attribute draw:concentric-gradient-fill-allowed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawConcentricGradientFillAllowedAttribute() {
+		DrawConcentricGradientFillAllowedAttribute attr = (DrawConcentricGradientFillAllowedAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "concentric-gradient-fill-allowed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawConcentricGradientFillAllowedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawConcentricGradientFillAllowedAttribute</code> , See {@odf.attribute draw:concentric-gradient-fill-allowed}
+	 *
+	 * @param drawConcentricGradientFillAllowedValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawConcentricGradientFillAllowedAttribute(Boolean drawConcentricGradientFillAllowedValue) {
+		DrawConcentricGradientFillAllowedAttribute attr = new DrawConcentricGradientFillAllowedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawConcentricGradientFillAllowedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEnhancedPathAttribute</code> , See {@odf.attribute draw:enhanced-path}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEnhancedPathAttribute() {
+		DrawEnhancedPathAttribute attr = (DrawEnhancedPathAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "enhanced-path");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEnhancedPathAttribute</code> , See {@odf.attribute draw:enhanced-path}
+	 *
+	 * @param drawEnhancedPathValue   The type is <code>String</code>
+	 */
+	public void setDrawEnhancedPathAttribute(String drawEnhancedPathValue) {
+		DrawEnhancedPathAttribute attr = new DrawEnhancedPathAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEnhancedPathValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionAttribute</code> , See {@odf.attribute draw:extrusion}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionAttribute() {
+		DrawExtrusionAttribute attr = (DrawExtrusionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionAttribute</code> , See {@odf.attribute draw:extrusion}
+	 *
+	 * @param drawExtrusionValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionAttribute(Boolean drawExtrusionValue) {
+		DrawExtrusionAttribute attr = new DrawExtrusionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionAllowedAttribute</code> , See {@odf.attribute draw:extrusion-allowed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionAllowedAttribute() {
+		DrawExtrusionAllowedAttribute attr = (DrawExtrusionAllowedAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-allowed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionAllowedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionAllowedAttribute</code> , See {@odf.attribute draw:extrusion-allowed}
+	 *
+	 * @param drawExtrusionAllowedValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionAllowedAttribute(Boolean drawExtrusionAllowedValue) {
+		DrawExtrusionAllowedAttribute attr = new DrawExtrusionAllowedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionAllowedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionBrightnessAttribute</code> , See {@odf.attribute draw:extrusion-brightness}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionBrightnessAttribute() {
+		DrawExtrusionBrightnessAttribute attr = (DrawExtrusionBrightnessAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-brightness");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionBrightnessAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionBrightnessAttribute</code> , See {@odf.attribute draw:extrusion-brightness}
+	 *
+	 * @param drawExtrusionBrightnessValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionBrightnessAttribute(String drawExtrusionBrightnessValue) {
+		DrawExtrusionBrightnessAttribute attr = new DrawExtrusionBrightnessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionBrightnessValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionColorAttribute</code> , See {@odf.attribute draw:extrusion-color}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionColorAttribute() {
+		DrawExtrusionColorAttribute attr = (DrawExtrusionColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-color");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionColorAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionColorAttribute</code> , See {@odf.attribute draw:extrusion-color}
+	 *
+	 * @param drawExtrusionColorValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionColorAttribute(Boolean drawExtrusionColorValue) {
+		DrawExtrusionColorAttribute attr = new DrawExtrusionColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionColorValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionDepthAttribute</code> , See {@odf.attribute draw:extrusion-depth}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionDepthAttribute() {
+		DrawExtrusionDepthAttribute attr = (DrawExtrusionDepthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-depth");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionDepthAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionDepthAttribute</code> , See {@odf.attribute draw:extrusion-depth}
+	 *
+	 * @param drawExtrusionDepthValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionDepthAttribute(String drawExtrusionDepthValue) {
+		DrawExtrusionDepthAttribute attr = new DrawExtrusionDepthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionDepthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionDiffusionAttribute</code> , See {@odf.attribute draw:extrusion-diffusion}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionDiffusionAttribute() {
+		DrawExtrusionDiffusionAttribute attr = (DrawExtrusionDiffusionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-diffusion");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionDiffusionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionDiffusionAttribute</code> , See {@odf.attribute draw:extrusion-diffusion}
+	 *
+	 * @param drawExtrusionDiffusionValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionDiffusionAttribute(String drawExtrusionDiffusionValue) {
+		DrawExtrusionDiffusionAttribute attr = new DrawExtrusionDiffusionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionDiffusionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionFirstLightDirectionAttribute</code> , See {@odf.attribute draw:extrusion-first-light-direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionFirstLightDirectionAttribute() {
+		DrawExtrusionFirstLightDirectionAttribute attr = (DrawExtrusionFirstLightDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-first-light-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionFirstLightDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionFirstLightDirectionAttribute</code> , See {@odf.attribute draw:extrusion-first-light-direction}
+	 *
+	 * @param drawExtrusionFirstLightDirectionValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionFirstLightDirectionAttribute(String drawExtrusionFirstLightDirectionValue) {
+		DrawExtrusionFirstLightDirectionAttribute attr = new DrawExtrusionFirstLightDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionFirstLightDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionFirstLightHarshAttribute</code> , See {@odf.attribute draw:extrusion-first-light-harsh}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionFirstLightHarshAttribute() {
+		DrawExtrusionFirstLightHarshAttribute attr = (DrawExtrusionFirstLightHarshAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-first-light-harsh");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionFirstLightHarshAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionFirstLightHarshAttribute</code> , See {@odf.attribute draw:extrusion-first-light-harsh}
+	 *
+	 * @param drawExtrusionFirstLightHarshValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionFirstLightHarshAttribute(Boolean drawExtrusionFirstLightHarshValue) {
+		DrawExtrusionFirstLightHarshAttribute attr = new DrawExtrusionFirstLightHarshAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionFirstLightHarshValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionFirstLightLevelAttribute</code> , See {@odf.attribute draw:extrusion-first-light-level}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionFirstLightLevelAttribute() {
+		DrawExtrusionFirstLightLevelAttribute attr = (DrawExtrusionFirstLightLevelAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-first-light-level");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionFirstLightLevelAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionFirstLightLevelAttribute</code> , See {@odf.attribute draw:extrusion-first-light-level}
+	 *
+	 * @param drawExtrusionFirstLightLevelValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionFirstLightLevelAttribute(String drawExtrusionFirstLightLevelValue) {
+		DrawExtrusionFirstLightLevelAttribute attr = new DrawExtrusionFirstLightLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionFirstLightLevelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionLightFaceAttribute</code> , See {@odf.attribute draw:extrusion-light-face}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionLightFaceAttribute() {
+		DrawExtrusionLightFaceAttribute attr = (DrawExtrusionLightFaceAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-light-face");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionLightFaceAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionLightFaceAttribute</code> , See {@odf.attribute draw:extrusion-light-face}
+	 *
+	 * @param drawExtrusionLightFaceValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionLightFaceAttribute(Boolean drawExtrusionLightFaceValue) {
+		DrawExtrusionLightFaceAttribute attr = new DrawExtrusionLightFaceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionLightFaceValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionMetalAttribute</code> , See {@odf.attribute draw:extrusion-metal}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionMetalAttribute() {
+		DrawExtrusionMetalAttribute attr = (DrawExtrusionMetalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-metal");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionMetalAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionMetalAttribute</code> , See {@odf.attribute draw:extrusion-metal}
+	 *
+	 * @param drawExtrusionMetalValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionMetalAttribute(Boolean drawExtrusionMetalValue) {
+		DrawExtrusionMetalAttribute attr = new DrawExtrusionMetalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionMetalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionNumberOfLineSegmentsAttribute</code> , See {@odf.attribute draw:extrusion-number-of-line-segments}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawExtrusionNumberOfLineSegmentsAttribute() {
+		DrawExtrusionNumberOfLineSegmentsAttribute attr = (DrawExtrusionNumberOfLineSegmentsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-number-of-line-segments");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(DrawExtrusionNumberOfLineSegmentsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionNumberOfLineSegmentsAttribute</code> , See {@odf.attribute draw:extrusion-number-of-line-segments}
+	 *
+	 * @param drawExtrusionNumberOfLineSegmentsValue   The type is <code>Integer</code>
+	 */
+	public void setDrawExtrusionNumberOfLineSegmentsAttribute(Integer drawExtrusionNumberOfLineSegmentsValue) {
+		DrawExtrusionNumberOfLineSegmentsAttribute attr = new DrawExtrusionNumberOfLineSegmentsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawExtrusionNumberOfLineSegmentsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionOriginAttribute</code> , See {@odf.attribute draw:extrusion-origin}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getDrawExtrusionOriginAttribute() {
+		DrawExtrusionOriginAttribute attr = (DrawExtrusionOriginAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-origin");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return Double.valueOf(DrawExtrusionOriginAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionOriginAttribute</code> , See {@odf.attribute draw:extrusion-origin}
+	 *
+	 * @param drawExtrusionOriginValue   The type is <code>Double</code>
+	 */
+	public void setDrawExtrusionOriginAttribute(Double drawExtrusionOriginValue) {
+		DrawExtrusionOriginAttribute attr = new DrawExtrusionOriginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(drawExtrusionOriginValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionRotationAngleAttribute</code> , See {@odf.attribute draw:extrusion-rotation-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionRotationAngleAttribute() {
+		DrawExtrusionRotationAngleAttribute attr = (DrawExtrusionRotationAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-rotation-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionRotationAngleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionRotationAngleAttribute</code> , See {@odf.attribute draw:extrusion-rotation-angle}
+	 *
+	 * @param drawExtrusionRotationAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionRotationAngleAttribute(String drawExtrusionRotationAngleValue) {
+		DrawExtrusionRotationAngleAttribute attr = new DrawExtrusionRotationAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionRotationAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionRotationCenterAttribute</code> , See {@odf.attribute draw:extrusion-rotation-center}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionRotationCenterAttribute() {
+		DrawExtrusionRotationCenterAttribute attr = (DrawExtrusionRotationCenterAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-rotation-center");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionRotationCenterAttribute</code> , See {@odf.attribute draw:extrusion-rotation-center}
+	 *
+	 * @param drawExtrusionRotationCenterValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionRotationCenterAttribute(String drawExtrusionRotationCenterValue) {
+		DrawExtrusionRotationCenterAttribute attr = new DrawExtrusionRotationCenterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionRotationCenterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionSecondLightDirectionAttribute</code> , See {@odf.attribute draw:extrusion-second-light-direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionSecondLightDirectionAttribute() {
+		DrawExtrusionSecondLightDirectionAttribute attr = (DrawExtrusionSecondLightDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-second-light-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionSecondLightDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionSecondLightDirectionAttribute</code> , See {@odf.attribute draw:extrusion-second-light-direction}
+	 *
+	 * @param drawExtrusionSecondLightDirectionValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionSecondLightDirectionAttribute(String drawExtrusionSecondLightDirectionValue) {
+		DrawExtrusionSecondLightDirectionAttribute attr = new DrawExtrusionSecondLightDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionSecondLightDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionSecondLightHarshAttribute</code> , See {@odf.attribute draw:extrusion-second-light-harsh}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawExtrusionSecondLightHarshAttribute() {
+		DrawExtrusionSecondLightHarshAttribute attr = (DrawExtrusionSecondLightHarshAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-second-light-harsh");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawExtrusionSecondLightHarshAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionSecondLightHarshAttribute</code> , See {@odf.attribute draw:extrusion-second-light-harsh}
+	 *
+	 * @param drawExtrusionSecondLightHarshValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawExtrusionSecondLightHarshAttribute(Boolean drawExtrusionSecondLightHarshValue) {
+		DrawExtrusionSecondLightHarshAttribute attr = new DrawExtrusionSecondLightHarshAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawExtrusionSecondLightHarshValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionSecondLightLevelAttribute</code> , See {@odf.attribute draw:extrusion-second-light-level}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionSecondLightLevelAttribute() {
+		DrawExtrusionSecondLightLevelAttribute attr = (DrawExtrusionSecondLightLevelAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-second-light-level");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionSecondLightLevelAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionSecondLightLevelAttribute</code> , See {@odf.attribute draw:extrusion-second-light-level}
+	 *
+	 * @param drawExtrusionSecondLightLevelValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionSecondLightLevelAttribute(String drawExtrusionSecondLightLevelValue) {
+		DrawExtrusionSecondLightLevelAttribute attr = new DrawExtrusionSecondLightLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionSecondLightLevelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionShininessAttribute</code> , See {@odf.attribute draw:extrusion-shininess}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionShininessAttribute() {
+		DrawExtrusionShininessAttribute attr = (DrawExtrusionShininessAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-shininess");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionShininessAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionShininessAttribute</code> , See {@odf.attribute draw:extrusion-shininess}
+	 *
+	 * @param drawExtrusionShininessValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionShininessAttribute(String drawExtrusionShininessValue) {
+		DrawExtrusionShininessAttribute attr = new DrawExtrusionShininessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionShininessValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionSkewAttribute</code> , See {@odf.attribute draw:extrusion-skew}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionSkewAttribute() {
+		DrawExtrusionSkewAttribute attr = (DrawExtrusionSkewAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-skew");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionSkewAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionSkewAttribute</code> , See {@odf.attribute draw:extrusion-skew}
+	 *
+	 * @param drawExtrusionSkewValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionSkewAttribute(String drawExtrusionSkewValue) {
+		DrawExtrusionSkewAttribute attr = new DrawExtrusionSkewAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionSkewValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionSpecularityAttribute</code> , See {@odf.attribute draw:extrusion-specularity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionSpecularityAttribute() {
+		DrawExtrusionSpecularityAttribute attr = (DrawExtrusionSpecularityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-specularity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionSpecularityAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionSpecularityAttribute</code> , See {@odf.attribute draw:extrusion-specularity}
+	 *
+	 * @param drawExtrusionSpecularityValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionSpecularityAttribute(String drawExtrusionSpecularityValue) {
+		DrawExtrusionSpecularityAttribute attr = new DrawExtrusionSpecularityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionSpecularityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawExtrusionViewpointAttribute</code> , See {@odf.attribute draw:extrusion-viewpoint}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawExtrusionViewpointAttribute() {
+		DrawExtrusionViewpointAttribute attr = (DrawExtrusionViewpointAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "extrusion-viewpoint");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawExtrusionViewpointAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawExtrusionViewpointAttribute</code> , See {@odf.attribute draw:extrusion-viewpoint}
+	 *
+	 * @param drawExtrusionViewpointValue   The type is <code>String</code>
+	 */
+	public void setDrawExtrusionViewpointAttribute(String drawExtrusionViewpointValue) {
+		DrawExtrusionViewpointAttribute attr = new DrawExtrusionViewpointAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawExtrusionViewpointValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGluePointLeavingDirectionsAttribute</code> , See {@odf.attribute draw:glue-point-leaving-directions}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGluePointLeavingDirectionsAttribute() {
+		DrawGluePointLeavingDirectionsAttribute attr = (DrawGluePointLeavingDirectionsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "glue-point-leaving-directions");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGluePointLeavingDirectionsAttribute</code> , See {@odf.attribute draw:glue-point-leaving-directions}
+	 *
+	 * @param drawGluePointLeavingDirectionsValue   The type is <code>String</code>
+	 */
+	public void setDrawGluePointLeavingDirectionsAttribute(String drawGluePointLeavingDirectionsValue) {
+		DrawGluePointLeavingDirectionsAttribute attr = new DrawGluePointLeavingDirectionsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGluePointLeavingDirectionsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGluePointTypeAttribute</code> , See {@odf.attribute draw:glue-point-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGluePointTypeAttribute() {
+		DrawGluePointTypeAttribute attr = (DrawGluePointTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "glue-point-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawGluePointTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGluePointTypeAttribute</code> , See {@odf.attribute draw:glue-point-type}
+	 *
+	 * @param drawGluePointTypeValue   The type is <code>String</code>
+	 */
+	public void setDrawGluePointTypeAttribute(String drawGluePointTypeValue) {
+		DrawGluePointTypeAttribute attr = new DrawGluePointTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGluePointTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGluePointsAttribute</code> , See {@odf.attribute draw:glue-points}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGluePointsAttribute() {
+		DrawGluePointsAttribute attr = (DrawGluePointsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "glue-points");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGluePointsAttribute</code> , See {@odf.attribute draw:glue-points}
+	 *
+	 * @param drawGluePointsValue   The type is <code>String</code>
+	 */
+	public void setDrawGluePointsAttribute(String drawGluePointsValue) {
+		DrawGluePointsAttribute attr = new DrawGluePointsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGluePointsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMirrorHorizontalAttribute</code> , See {@odf.attribute draw:mirror-horizontal}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawMirrorHorizontalAttribute() {
+		DrawMirrorHorizontalAttribute attr = (DrawMirrorHorizontalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "mirror-horizontal");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawMirrorHorizontalAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMirrorHorizontalAttribute</code> , See {@odf.attribute draw:mirror-horizontal}
+	 *
+	 * @param drawMirrorHorizontalValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawMirrorHorizontalAttribute(Boolean drawMirrorHorizontalValue) {
+		DrawMirrorHorizontalAttribute attr = new DrawMirrorHorizontalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawMirrorHorizontalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMirrorVerticalAttribute</code> , See {@odf.attribute draw:mirror-vertical}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawMirrorVerticalAttribute() {
+		DrawMirrorVerticalAttribute attr = (DrawMirrorVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "mirror-vertical");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawMirrorVerticalAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMirrorVerticalAttribute</code> , See {@odf.attribute draw:mirror-vertical}
+	 *
+	 * @param drawMirrorVerticalValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawMirrorVerticalAttribute(Boolean drawMirrorVerticalValue) {
+		DrawMirrorVerticalAttribute attr = new DrawMirrorVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawMirrorVerticalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawModifiersAttribute</code> , See {@odf.attribute draw:modifiers}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawModifiersAttribute() {
+		DrawModifiersAttribute attr = (DrawModifiersAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "modifiers");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawModifiersAttribute</code> , See {@odf.attribute draw:modifiers}
+	 *
+	 * @param drawModifiersValue   The type is <code>String</code>
+	 */
+	public void setDrawModifiersAttribute(String drawModifiersValue) {
+		DrawModifiersAttribute attr = new DrawModifiersAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawModifiersValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPathStretchpointXAttribute</code> , See {@odf.attribute draw:path-stretchpoint-x}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getDrawPathStretchpointXAttribute() {
+		DrawPathStretchpointXAttribute attr = (DrawPathStretchpointXAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "path-stretchpoint-x");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPathStretchpointXAttribute</code> , See {@odf.attribute draw:path-stretchpoint-x}
+	 *
+	 * @param drawPathStretchpointXValue   The type is <code>Double</code>
+	 */
+	public void setDrawPathStretchpointXAttribute(Double drawPathStretchpointXValue) {
+		DrawPathStretchpointXAttribute attr = new DrawPathStretchpointXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(drawPathStretchpointXValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPathStretchpointYAttribute</code> , See {@odf.attribute draw:path-stretchpoint-y}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getDrawPathStretchpointYAttribute() {
+		DrawPathStretchpointYAttribute attr = (DrawPathStretchpointYAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "path-stretchpoint-y");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPathStretchpointYAttribute</code> , See {@odf.attribute draw:path-stretchpoint-y}
+	 *
+	 * @param drawPathStretchpointYValue   The type is <code>Double</code>
+	 */
+	public void setDrawPathStretchpointYAttribute(Double drawPathStretchpointYValue) {
+		DrawPathStretchpointYAttribute attr = new DrawPathStretchpointYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(drawPathStretchpointYValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextAreasAttribute</code> , See {@odf.attribute draw:text-areas}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextAreasAttribute() {
+		DrawTextAreasAttribute attr = (DrawTextAreasAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-areas");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextAreasAttribute</code> , See {@odf.attribute draw:text-areas}
+	 *
+	 * @param drawTextAreasValue   The type is <code>String</code>
+	 */
+	public void setDrawTextAreasAttribute(String drawTextAreasValue) {
+		DrawTextAreasAttribute attr = new DrawTextAreasAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextAreasValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextPathAttribute</code> , See {@odf.attribute draw:text-path}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawTextPathAttribute() {
+		DrawTextPathAttribute attr = (DrawTextPathAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-path");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawTextPathAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextPathAttribute</code> , See {@odf.attribute draw:text-path}
+	 *
+	 * @param drawTextPathValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawTextPathAttribute(Boolean drawTextPathValue) {
+		DrawTextPathAttribute attr = new DrawTextPathAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawTextPathValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextPathAllowedAttribute</code> , See {@odf.attribute draw:text-path-allowed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawTextPathAllowedAttribute() {
+		DrawTextPathAllowedAttribute attr = (DrawTextPathAllowedAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-path-allowed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawTextPathAllowedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextPathAllowedAttribute</code> , See {@odf.attribute draw:text-path-allowed}
+	 *
+	 * @param drawTextPathAllowedValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawTextPathAllowedAttribute(Boolean drawTextPathAllowedValue) {
+		DrawTextPathAllowedAttribute attr = new DrawTextPathAllowedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawTextPathAllowedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextPathModeAttribute</code> , See {@odf.attribute draw:text-path-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextPathModeAttribute() {
+		DrawTextPathModeAttribute attr = (DrawTextPathModeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-path-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawTextPathModeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextPathModeAttribute</code> , See {@odf.attribute draw:text-path-mode}
+	 *
+	 * @param drawTextPathModeValue   The type is <code>String</code>
+	 */
+	public void setDrawTextPathModeAttribute(String drawTextPathModeValue) {
+		DrawTextPathModeAttribute attr = new DrawTextPathModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextPathModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextPathSameLetterHeightsAttribute</code> , See {@odf.attribute draw:text-path-same-letter-heights}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawTextPathSameLetterHeightsAttribute() {
+		DrawTextPathSameLetterHeightsAttribute attr = (DrawTextPathSameLetterHeightsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-path-same-letter-heights");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawTextPathSameLetterHeightsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextPathSameLetterHeightsAttribute</code> , See {@odf.attribute draw:text-path-same-letter-heights}
+	 *
+	 * @param drawTextPathSameLetterHeightsValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawTextPathSameLetterHeightsAttribute(Boolean drawTextPathSameLetterHeightsValue) {
+		DrawTextPathSameLetterHeightsAttribute attr = new DrawTextPathSameLetterHeightsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawTextPathSameLetterHeightsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextPathScaleAttribute</code> , See {@odf.attribute draw:text-path-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextPathScaleAttribute() {
+		DrawTextPathScaleAttribute attr = (DrawTextPathScaleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-path-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawTextPathScaleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextPathScaleAttribute</code> , See {@odf.attribute draw:text-path-scale}
+	 *
+	 * @param drawTextPathScaleValue   The type is <code>String</code>
+	 */
+	public void setDrawTextPathScaleAttribute(String drawTextPathScaleValue) {
+		DrawTextPathScaleAttribute attr = new DrawTextPathScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextPathScaleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextRotateAngleAttribute</code> , See {@odf.attribute draw:text-rotate-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextRotateAngleAttribute() {
+		DrawTextRotateAngleAttribute attr = (DrawTextRotateAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-rotate-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawTextRotateAngleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextRotateAngleAttribute</code> , See {@odf.attribute draw:text-rotate-angle}
+	 *
+	 * @param drawTextRotateAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawTextRotateAngleAttribute(String drawTextRotateAngleValue) {
+		DrawTextRotateAngleAttribute attr = new DrawTextRotateAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextRotateAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTypeAttribute</code> , See {@odf.attribute draw:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTypeAttribute() {
+		DrawTypeAttribute attr = (DrawTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawTypeAttribute.DEFAULT_VALUE_NON_PRIMITIVE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTypeAttribute</code> , See {@odf.attribute draw:type}
+	 *
+	 * @param drawTypeValue   The type is <code>String</code>
+	 */
+	public void setDrawTypeAttribute(String drawTypeValue) {
+		DrawTypeAttribute attr = new DrawTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element draw:equation}.
+	 *
+	 * @return the element {@odf.element draw:equation}
+	 */
+	public DrawEquationElement newDrawEquationElement() {
+		DrawEquationElement drawEquation = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEquationElement.class);
+		this.appendChild(drawEquation);
+		return drawEquation;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:handle}.
+	 *
+	 * @param drawHandlePositionValue  the <code>String</code> value of <code>DrawHandlePositionAttribute</code>, see {@odf.attribute  draw:handle-position} at specification
+	 * @return the element {@odf.element draw:handle}
+	 */
+	 public DrawHandleElement newDrawHandleElement(String drawHandlePositionValue) {
+		DrawHandleElement drawHandle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawHandleElement.class);
+		drawHandle.setDrawHandlePositionAttribute(drawHandlePositionValue);
+		this.appendChild(drawHandle);
+		return drawHandle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEquationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEquationElement.java
new file mode 100644
index 0000000..8f6ecbf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawEquationElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:equation}.
+ *
+ */
+public class DrawEquationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "equation");
+
+	/**
+	 * Create the instance of <code>DrawEquationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawEquationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:equation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFormulaAttribute</code> , See {@odf.attribute draw:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFormulaAttribute() {
+		DrawFormulaAttribute attr = (DrawFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFormulaAttribute</code> , See {@odf.attribute draw:formula}
+	 *
+	 * @param drawFormulaValue   The type is <code>String</code>
+	 */
+	public void setDrawFormulaAttribute(String drawFormulaValue) {
+		DrawFormulaAttribute attr = new DrawFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFillImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFillImageElement.java
new file mode 100644
index 0000000..a31a2de
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFillImageElement.java
@@ -0,0 +1,277 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:fill-image}.
+ *
+ */
+public class DrawFillImageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image");
+
+	/**
+	 * Create the instance of <code>DrawFillImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawFillImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:fill-image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFloatingFrameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFloatingFrameElement.java
new file mode 100644
index 0000000..0a4599c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFloatingFrameElement.java
@@ -0,0 +1,225 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:floating-frame}.
+ *
+ */
+public class DrawFloatingFrameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "floating-frame");
+
+	/**
+	 * Create the instance of <code>DrawFloatingFrameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawFloatingFrameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:floating-frame}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFrameNameAttribute</code> , See {@odf.attribute draw:frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFrameNameAttribute() {
+		DrawFrameNameAttribute attr = (DrawFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFrameNameAttribute</code> , See {@odf.attribute draw:frame-name}
+	 *
+	 * @param drawFrameNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFrameNameAttribute(String drawFrameNameValue) {
+		DrawFrameNameAttribute attr = new DrawFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFrameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFrameElement.java
new file mode 100644
index 0000000..9d44269
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawFrameElement.java
@@ -0,0 +1,622 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCopyOfAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPlaceholderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUserTransformedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:frame}.
+ *
+ */
+public class DrawFrameElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "frame");
+
+	/**
+	 * Create the instance of <code>DrawFrameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawFrameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:frame}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCopyOfAttribute</code> , See {@odf.attribute draw:copy-of}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCopyOfAttribute() {
+		DrawCopyOfAttribute attr = (DrawCopyOfAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "copy-of");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCopyOfAttribute</code> , See {@odf.attribute draw:copy-of}
+	 *
+	 * @param drawCopyOfValue   The type is <code>String</code>
+	 */
+	public void setDrawCopyOfAttribute(String drawCopyOfValue) {
+		DrawCopyOfAttribute attr = new DrawCopyOfAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCopyOfValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassAttribute</code> , See {@odf.attribute presentation:class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassAttribute() {
+		PresentationClassAttribute attr = (PresentationClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassAttribute</code> , See {@odf.attribute presentation:class}
+	 *
+	 * @param presentationClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassAttribute(String presentationClassValue) {
+		PresentationClassAttribute attr = new PresentationClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPlaceholderAttribute</code> , See {@odf.attribute presentation:placeholder}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationPlaceholderAttribute() {
+		PresentationPlaceholderAttribute attr = (PresentationPlaceholderAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "placeholder");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPlaceholderAttribute</code> , See {@odf.attribute presentation:placeholder}
+	 *
+	 * @param presentationPlaceholderValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationPlaceholderAttribute(Boolean presentationPlaceholderValue) {
+		PresentationPlaceholderAttribute attr = new PresentationPlaceholderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationPlaceholderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUserTransformedAttribute</code> , See {@odf.attribute presentation:user-transformed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationUserTransformedAttribute() {
+		PresentationUserTransformedAttribute attr = (PresentationUserTransformedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "user-transformed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUserTransformedAttribute</code> , See {@odf.attribute presentation:user-transformed}
+	 *
+	 * @param presentationUserTransformedValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationUserTransformedAttribute(Boolean presentationUserTransformedValue) {
+		PresentationUserTransformedAttribute attr = new PresentationUserTransformedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationUserTransformedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelHeightAttribute</code> , See {@odf.attribute style:rel-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelHeightAttribute() {
+		StyleRelHeightAttribute attr = (StyleRelHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelHeightAttribute</code> , See {@odf.attribute style:rel-height}
+	 *
+	 * @param styleRelHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleRelHeightAttribute(String styleRelHeightValue) {
+		StyleRelHeightAttribute attr = new StyleRelHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelWidthAttribute() {
+		StyleRelWidthAttribute attr = (StyleRelWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @param styleRelWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleRelWidthAttribute(String styleRelWidthValue) {
+		StyleRelWidthAttribute attr = new StyleRelWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:applet}.
+	 *
+	 * @return the element {@odf.element draw:applet}
+	 */
+	public DrawAppletElement newDrawAppletElement() {
+		DrawAppletElement drawApplet = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAppletElement.class);
+		this.appendChild(drawApplet);
+		return drawApplet;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:contour-path}.
+	 *
+	 * @param drawRecreateOnEditValue  the <code>Boolean</code> value of <code>DrawRecreateOnEditAttribute</code>, see {@odf.attribute  draw:recreate-on-edit} at specification
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:contour-path}
+	 */
+	 public DrawContourPathElement newDrawContourPathElement(boolean drawRecreateOnEditValue, String svgDValue, int svgViewBoxValue) {
+		DrawContourPathElement drawContourPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawContourPathElement.class);
+		drawContourPath.setDrawRecreateOnEditAttribute(drawRecreateOnEditValue);
+		drawContourPath.setSvgDAttribute(svgDValue);
+		drawContourPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawContourPath);
+		return drawContourPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:contour-polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param drawRecreateOnEditValue  the <code>Boolean</code> value of <code>DrawRecreateOnEditAttribute</code>, see {@odf.attribute  draw:recreate-on-edit} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:contour-polygon}
+	 */
+	 public DrawContourPolygonElement newDrawContourPolygonElement(String drawPointsValue, boolean drawRecreateOnEditValue, int svgViewBoxValue) {
+		DrawContourPolygonElement drawContourPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawContourPolygonElement.class);
+		drawContourPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawContourPolygon.setDrawRecreateOnEditAttribute(drawRecreateOnEditValue);
+		drawContourPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawContourPolygon);
+		return drawContourPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:floating-frame}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:floating-frame}
+	 */
+	 public DrawFloatingFrameElement newDrawFloatingFrameElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawFloatingFrameElement drawFloatingFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFloatingFrameElement.class);
+		drawFloatingFrame.setXlinkHrefAttribute(xlinkHrefValue);
+		drawFloatingFrame.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawFloatingFrame);
+		return drawFloatingFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:image}.
+	 *
+	 * @return the element {@odf.element draw:image}
+	 */
+	public DrawImageElement newDrawImageElement() {
+		DrawImageElement drawImage = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawImageElement.class);
+		this.appendChild(drawImage);
+		return drawImage;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:image-map}.
+	 *
+	 * @return the element {@odf.element draw:image-map}
+	 */
+	public DrawImageMapElement newDrawImageMapElement() {
+		DrawImageMapElement drawImageMap = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawImageMapElement.class);
+		this.appendChild(drawImageMap);
+		return drawImageMap;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:object}.
+	 *
+	 * @return the element {@odf.element draw:object}
+	 */
+	public DrawObjectElement newDrawObjectElement() {
+		DrawObjectElement drawObject = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawObjectElement.class);
+		this.appendChild(drawObject);
+		return drawObject;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:object-ole}.
+	 *
+	 * @return the element {@odf.element draw:object-ole}
+	 */
+	public DrawObjectOleElement newDrawObjectOleElement() {
+		DrawObjectOleElement drawObjectOle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawObjectOleElement.class);
+		this.appendChild(drawObjectOle);
+		return drawObjectOle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:plugin}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:plugin}
+	 */
+	 public DrawPluginElement newDrawPluginElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawPluginElement drawPlugin = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPluginElement.class);
+		drawPlugin.setXlinkHrefAttribute(xlinkHrefValue);
+		drawPlugin.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawPlugin);
+		return drawPlugin;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:text-box}.
+	 *
+	 * @return the element {@odf.element draw:text-box}
+	 */
+	public DrawTextBoxElement newDrawTextBoxElement() {
+		DrawTextBoxElement drawTextBox = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawTextBoxElement.class);
+		this.appendChild(drawTextBox);
+		return drawTextBox;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGElement.java
new file mode 100644
index 0000000..fd797ba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGElement.java
@@ -0,0 +1,419 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:g}.
+ *
+ */
+public class DrawGElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "g");
+
+	/**
+	 * Create the instance of <code>DrawGElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawGElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:g}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGluePointElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGluePointElement.java
new file mode 100644
index 0000000..a6a432b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGluePointElement.java
@@ -0,0 +1,204 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEscapeDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:glue-point}.
+ *
+ */
+public class DrawGluePointElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "glue-point");
+
+	/**
+	 * Create the instance of <code>DrawGluePointElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawGluePointElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:glue-point}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawAlignAttribute</code> , See {@odf.attribute draw:align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawAlignAttribute() {
+		DrawAlignAttribute attr = (DrawAlignAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawAlignAttribute</code> , See {@odf.attribute draw:align}
+	 *
+	 * @param drawAlignValue   The type is <code>String</code>
+	 */
+	public void setDrawAlignAttribute(String drawAlignValue) {
+		DrawAlignAttribute attr = new DrawAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEscapeDirectionAttribute</code> , See {@odf.attribute draw:escape-direction}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEscapeDirectionAttribute() {
+		DrawEscapeDirectionAttribute attr = (DrawEscapeDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "escape-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEscapeDirectionAttribute</code> , See {@odf.attribute draw:escape-direction}
+	 *
+	 * @param drawEscapeDirectionValue   The type is <code>String</code>
+	 */
+	public void setDrawEscapeDirectionAttribute(String drawEscapeDirectionValue) {
+		DrawEscapeDirectionAttribute attr = new DrawEscapeDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEscapeDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGradientElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGradientElement.java
new file mode 100644
index 0000000..92e5ea0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawGradientElement.java
@@ -0,0 +1,348 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndIntensityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartIntensityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:gradient}.
+ *
+ */
+public class DrawGradientElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "gradient");
+
+	/**
+	 * Create the instance of <code>DrawGradientElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawGradientElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:gradient}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawAngleAttribute</code> , See {@odf.attribute draw:angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawAngleAttribute() {
+		DrawAngleAttribute attr = (DrawAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawAngleAttribute</code> , See {@odf.attribute draw:angle}
+	 *
+	 * @param drawAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawAngleAttribute(String drawAngleValue) {
+		DrawAngleAttribute attr = new DrawAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawBorderAttribute</code> , See {@odf.attribute draw:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawBorderAttribute() {
+		DrawBorderAttribute attr = (DrawBorderAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawBorderAttribute</code> , See {@odf.attribute draw:border}
+	 *
+	 * @param drawBorderValue   The type is <code>String</code>
+	 */
+	public void setDrawBorderAttribute(String drawBorderValue) {
+		DrawBorderAttribute attr = new DrawBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCxAttribute</code> , See {@odf.attribute draw:cx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCxAttribute() {
+		DrawCxAttribute attr = (DrawCxAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "cx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCxAttribute</code> , See {@odf.attribute draw:cx}
+	 *
+	 * @param drawCxValue   The type is <code>String</code>
+	 */
+	public void setDrawCxAttribute(String drawCxValue) {
+		DrawCxAttribute attr = new DrawCxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCyAttribute</code> , See {@odf.attribute draw:cy}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCyAttribute() {
+		DrawCyAttribute attr = (DrawCyAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "cy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCyAttribute</code> , See {@odf.attribute draw:cy}
+	 *
+	 * @param drawCyValue   The type is <code>String</code>
+	 */
+	public void setDrawCyAttribute(String drawCyValue) {
+		DrawCyAttribute attr = new DrawCyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndColorAttribute</code> , See {@odf.attribute draw:end-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndColorAttribute() {
+		DrawEndColorAttribute attr = (DrawEndColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndColorAttribute</code> , See {@odf.attribute draw:end-color}
+	 *
+	 * @param drawEndColorValue   The type is <code>String</code>
+	 */
+	public void setDrawEndColorAttribute(String drawEndColorValue) {
+		DrawEndColorAttribute attr = new DrawEndColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndIntensityAttribute</code> , See {@odf.attribute draw:end-intensity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndIntensityAttribute() {
+		DrawEndIntensityAttribute attr = (DrawEndIntensityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-intensity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndIntensityAttribute</code> , See {@odf.attribute draw:end-intensity}
+	 *
+	 * @param drawEndIntensityValue   The type is <code>String</code>
+	 */
+	public void setDrawEndIntensityAttribute(String drawEndIntensityValue) {
+		DrawEndIntensityAttribute attr = new DrawEndIntensityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndIntensityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartColorAttribute</code> , See {@odf.attribute draw:start-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartColorAttribute() {
+		DrawStartColorAttribute attr = (DrawStartColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartColorAttribute</code> , See {@odf.attribute draw:start-color}
+	 *
+	 * @param drawStartColorValue   The type is <code>String</code>
+	 */
+	public void setDrawStartColorAttribute(String drawStartColorValue) {
+		DrawStartColorAttribute attr = new DrawStartColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartIntensityAttribute</code> , See {@odf.attribute draw:start-intensity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartIntensityAttribute() {
+		DrawStartIntensityAttribute attr = (DrawStartIntensityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-intensity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartIntensityAttribute</code> , See {@odf.attribute draw:start-intensity}
+	 *
+	 * @param drawStartIntensityValue   The type is <code>String</code>
+	 */
+	public void setDrawStartIntensityAttribute(String drawStartIntensityValue) {
+		DrawStartIntensityAttribute attr = new DrawStartIntensityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartIntensityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleAttribute() {
+		DrawStyleAttribute attr = (DrawStyleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * @param drawStyleValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleAttribute(String drawStyleValue) {
+		DrawStyleAttribute attr = new DrawStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawHandleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawHandleElement.java
new file mode 100644
index 0000000..46fbec9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawHandleElement.java
@@ -0,0 +1,348 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleMirrorHorizontalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleMirrorVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandlePolarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandlePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleRadiusRangeMaximumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleRadiusRangeMinimumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleRangeXMaximumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleRangeXMinimumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleRangeYMaximumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleRangeYMinimumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawHandleSwitchedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:handle}.
+ *
+ */
+public class DrawHandleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "handle");
+
+	/**
+	 * Create the instance of <code>DrawHandleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawHandleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:handle}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleMirrorHorizontalAttribute</code> , See {@odf.attribute draw:handle-mirror-horizontal}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawHandleMirrorHorizontalAttribute() {
+		DrawHandleMirrorHorizontalAttribute attr = (DrawHandleMirrorHorizontalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-mirror-horizontal");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawHandleMirrorHorizontalAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleMirrorHorizontalAttribute</code> , See {@odf.attribute draw:handle-mirror-horizontal}
+	 *
+	 * @param drawHandleMirrorHorizontalValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawHandleMirrorHorizontalAttribute(Boolean drawHandleMirrorHorizontalValue) {
+		DrawHandleMirrorHorizontalAttribute attr = new DrawHandleMirrorHorizontalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawHandleMirrorHorizontalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleMirrorVerticalAttribute</code> , See {@odf.attribute draw:handle-mirror-vertical}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawHandleMirrorVerticalAttribute() {
+		DrawHandleMirrorVerticalAttribute attr = (DrawHandleMirrorVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-mirror-vertical");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawHandleMirrorVerticalAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleMirrorVerticalAttribute</code> , See {@odf.attribute draw:handle-mirror-vertical}
+	 *
+	 * @param drawHandleMirrorVerticalValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawHandleMirrorVerticalAttribute(Boolean drawHandleMirrorVerticalValue) {
+		DrawHandleMirrorVerticalAttribute attr = new DrawHandleMirrorVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawHandleMirrorVerticalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandlePolarAttribute</code> , See {@odf.attribute draw:handle-polar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandlePolarAttribute() {
+		DrawHandlePolarAttribute attr = (DrawHandlePolarAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-polar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandlePolarAttribute</code> , See {@odf.attribute draw:handle-polar}
+	 *
+	 * @param drawHandlePolarValue   The type is <code>String</code>
+	 */
+	public void setDrawHandlePolarAttribute(String drawHandlePolarValue) {
+		DrawHandlePolarAttribute attr = new DrawHandlePolarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandlePolarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandlePositionAttribute</code> , See {@odf.attribute draw:handle-position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandlePositionAttribute() {
+		DrawHandlePositionAttribute attr = (DrawHandlePositionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandlePositionAttribute</code> , See {@odf.attribute draw:handle-position}
+	 *
+	 * @param drawHandlePositionValue   The type is <code>String</code>
+	 */
+	public void setDrawHandlePositionAttribute(String drawHandlePositionValue) {
+		DrawHandlePositionAttribute attr = new DrawHandlePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandlePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleRadiusRangeMaximumAttribute</code> , See {@odf.attribute draw:handle-radius-range-maximum}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandleRadiusRangeMaximumAttribute() {
+		DrawHandleRadiusRangeMaximumAttribute attr = (DrawHandleRadiusRangeMaximumAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-radius-range-maximum");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleRadiusRangeMaximumAttribute</code> , See {@odf.attribute draw:handle-radius-range-maximum}
+	 *
+	 * @param drawHandleRadiusRangeMaximumValue   The type is <code>String</code>
+	 */
+	public void setDrawHandleRadiusRangeMaximumAttribute(String drawHandleRadiusRangeMaximumValue) {
+		DrawHandleRadiusRangeMaximumAttribute attr = new DrawHandleRadiusRangeMaximumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandleRadiusRangeMaximumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleRadiusRangeMinimumAttribute</code> , See {@odf.attribute draw:handle-radius-range-minimum}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandleRadiusRangeMinimumAttribute() {
+		DrawHandleRadiusRangeMinimumAttribute attr = (DrawHandleRadiusRangeMinimumAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-radius-range-minimum");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleRadiusRangeMinimumAttribute</code> , See {@odf.attribute draw:handle-radius-range-minimum}
+	 *
+	 * @param drawHandleRadiusRangeMinimumValue   The type is <code>String</code>
+	 */
+	public void setDrawHandleRadiusRangeMinimumAttribute(String drawHandleRadiusRangeMinimumValue) {
+		DrawHandleRadiusRangeMinimumAttribute attr = new DrawHandleRadiusRangeMinimumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandleRadiusRangeMinimumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleRangeXMaximumAttribute</code> , See {@odf.attribute draw:handle-range-x-maximum}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandleRangeXMaximumAttribute() {
+		DrawHandleRangeXMaximumAttribute attr = (DrawHandleRangeXMaximumAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-range-x-maximum");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleRangeXMaximumAttribute</code> , See {@odf.attribute draw:handle-range-x-maximum}
+	 *
+	 * @param drawHandleRangeXMaximumValue   The type is <code>String</code>
+	 */
+	public void setDrawHandleRangeXMaximumAttribute(String drawHandleRangeXMaximumValue) {
+		DrawHandleRangeXMaximumAttribute attr = new DrawHandleRangeXMaximumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandleRangeXMaximumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleRangeXMinimumAttribute</code> , See {@odf.attribute draw:handle-range-x-minimum}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandleRangeXMinimumAttribute() {
+		DrawHandleRangeXMinimumAttribute attr = (DrawHandleRangeXMinimumAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-range-x-minimum");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleRangeXMinimumAttribute</code> , See {@odf.attribute draw:handle-range-x-minimum}
+	 *
+	 * @param drawHandleRangeXMinimumValue   The type is <code>String</code>
+	 */
+	public void setDrawHandleRangeXMinimumAttribute(String drawHandleRangeXMinimumValue) {
+		DrawHandleRangeXMinimumAttribute attr = new DrawHandleRangeXMinimumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandleRangeXMinimumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleRangeYMaximumAttribute</code> , See {@odf.attribute draw:handle-range-y-maximum}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandleRangeYMaximumAttribute() {
+		DrawHandleRangeYMaximumAttribute attr = (DrawHandleRangeYMaximumAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-range-y-maximum");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleRangeYMaximumAttribute</code> , See {@odf.attribute draw:handle-range-y-maximum}
+	 *
+	 * @param drawHandleRangeYMaximumValue   The type is <code>String</code>
+	 */
+	public void setDrawHandleRangeYMaximumAttribute(String drawHandleRangeYMaximumValue) {
+		DrawHandleRangeYMaximumAttribute attr = new DrawHandleRangeYMaximumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandleRangeYMaximumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleRangeYMinimumAttribute</code> , See {@odf.attribute draw:handle-range-y-minimum}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawHandleRangeYMinimumAttribute() {
+		DrawHandleRangeYMinimumAttribute attr = (DrawHandleRangeYMinimumAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-range-y-minimum");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleRangeYMinimumAttribute</code> , See {@odf.attribute draw:handle-range-y-minimum}
+	 *
+	 * @param drawHandleRangeYMinimumValue   The type is <code>String</code>
+	 */
+	public void setDrawHandleRangeYMinimumAttribute(String drawHandleRangeYMinimumValue) {
+		DrawHandleRangeYMinimumAttribute attr = new DrawHandleRangeYMinimumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawHandleRangeYMinimumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawHandleSwitchedAttribute</code> , See {@odf.attribute draw:handle-switched}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawHandleSwitchedAttribute() {
+		DrawHandleSwitchedAttribute attr = (DrawHandleSwitchedAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "handle-switched");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawHandleSwitchedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawHandleSwitchedAttribute</code> , See {@odf.attribute draw:handle-switched}
+	 *
+	 * @param drawHandleSwitchedValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawHandleSwitchedAttribute(Boolean drawHandleSwitchedValue) {
+		DrawHandleSwitchedAttribute attr = new DrawHandleSwitchedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawHandleSwitchedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawHatchElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawHatchElement.java
new file mode 100644
index 0000000..c2cbf93
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawHatchElement.java
@@ -0,0 +1,225 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawRotationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:hatch}.
+ *
+ */
+public class DrawHatchElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "hatch");
+
+	/**
+	 * Create the instance of <code>DrawHatchElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawHatchElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:hatch}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawColorAttribute</code> , See {@odf.attribute draw:color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawColorAttribute() {
+		DrawColorAttribute attr = (DrawColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawColorAttribute</code> , See {@odf.attribute draw:color}
+	 *
+	 * @param drawColorValue   The type is <code>String</code>
+	 */
+	public void setDrawColorAttribute(String drawColorValue) {
+		DrawColorAttribute attr = new DrawColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDistanceAttribute</code> , See {@odf.attribute draw:distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDistanceAttribute() {
+		DrawDistanceAttribute attr = (DrawDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDistanceAttribute</code> , See {@odf.attribute draw:distance}
+	 *
+	 * @param drawDistanceValue   The type is <code>String</code>
+	 */
+	public void setDrawDistanceAttribute(String drawDistanceValue) {
+		DrawDistanceAttribute attr = new DrawDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawRotationAttribute</code> , See {@odf.attribute draw:rotation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawRotationAttribute() {
+		DrawRotationAttribute attr = (DrawRotationAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "rotation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawRotationAttribute</code> , See {@odf.attribute draw:rotation}
+	 *
+	 * @param drawRotationValue   The type is <code>String</code>
+	 */
+	public void setDrawRotationAttribute(String drawRotationValue) {
+		DrawRotationAttribute attr = new DrawRotationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawRotationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleAttribute() {
+		DrawStyleAttribute attr = (DrawStyleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * @param drawStyleValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleAttribute(String drawStyleValue) {
+		DrawStyleAttribute attr = new DrawStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawImageElement.java
new file mode 100644
index 0000000..3e9d65c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawImageElement.java
@@ -0,0 +1,257 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBinaryDataElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFilterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:image}.
+ *
+ */
+public class DrawImageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "image");
+
+	/**
+	 * Create the instance of <code>DrawImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFilterNameAttribute</code> , See {@odf.attribute draw:filter-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFilterNameAttribute() {
+		DrawFilterNameAttribute attr = (DrawFilterNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "filter-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFilterNameAttribute</code> , See {@odf.attribute draw:filter-name}
+	 *
+	 * @param drawFilterNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFilterNameAttribute(String drawFilterNameValue) {
+		DrawFilterNameAttribute attr = new DrawFilterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFilterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:binary-data}.
+	 *
+	 * @return the element {@odf.element office:binary-data}
+	 */
+	public OfficeBinaryDataElement newOfficeBinaryDataElement() {
+		OfficeBinaryDataElement officeBinaryData = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeBinaryDataElement.class);
+		this.appendChild(officeBinaryData);
+		return officeBinaryData;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawImageMapElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawImageMapElement.java
new file mode 100644
index 0000000..21b85ec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawImageMapElement.java
@@ -0,0 +1,130 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:image-map}.
+ *
+ */
+public class DrawImageMapElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "image-map");
+
+	/**
+	 * Create the instance of <code>DrawImageMapElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawImageMapElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:image-map}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:area-circle}.
+	 *
+	 * @param svgCxValue  the <code>String</code> value of <code>SvgCxAttribute</code>, see {@odf.attribute  svg:cx} at specification
+	 * @param svgCyValue  the <code>String</code> value of <code>SvgCyAttribute</code>, see {@odf.attribute  svg:cy} at specification
+	 * @param svgRValue  the <code>String</code> value of <code>SvgRAttribute</code>, see {@odf.attribute  svg:r} at specification
+	 * @return the element {@odf.element draw:area-circle}
+	 */
+	 public DrawAreaCircleElement newDrawAreaCircleElement(String svgCxValue, String svgCyValue, String svgRValue) {
+		DrawAreaCircleElement drawAreaCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAreaCircleElement.class);
+		drawAreaCircle.setSvgCxAttribute(svgCxValue);
+		drawAreaCircle.setSvgCyAttribute(svgCyValue);
+		drawAreaCircle.setSvgRAttribute(svgRValue);
+		this.appendChild(drawAreaCircle);
+		return drawAreaCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:area-polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgHeightValue  the <code>String</code> value of <code>SvgHeightAttribute</code>, see {@odf.attribute  svg:height} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @param svgWidthValue  the <code>String</code> value of <code>SvgWidthAttribute</code>, see {@odf.attribute  svg:width} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:area-polygon}
+	 */
+	 public DrawAreaPolygonElement newDrawAreaPolygonElement(String drawPointsValue, String svgHeightValue, int svgViewBoxValue, String svgWidthValue, String svgXValue, String svgYValue) {
+		DrawAreaPolygonElement drawAreaPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAreaPolygonElement.class);
+		drawAreaPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawAreaPolygon.setSvgHeightAttribute(svgHeightValue);
+		drawAreaPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		drawAreaPolygon.setSvgWidthAttribute(svgWidthValue);
+		drawAreaPolygon.setSvgXAttribute(svgXValue);
+		drawAreaPolygon.setSvgYAttribute(svgYValue);
+		this.appendChild(drawAreaPolygon);
+		return drawAreaPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:area-rectangle}.
+	 *
+	 * @param svgHeightValue  the <code>String</code> value of <code>SvgHeightAttribute</code>, see {@odf.attribute  svg:height} at specification
+	 * @param svgWidthValue  the <code>String</code> value of <code>SvgWidthAttribute</code>, see {@odf.attribute  svg:width} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:area-rectangle}
+	 */
+	 public DrawAreaRectangleElement newDrawAreaRectangleElement(String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue) {
+		DrawAreaRectangleElement drawAreaRectangle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAreaRectangleElement.class);
+		drawAreaRectangle.setSvgHeightAttribute(svgHeightValue);
+		drawAreaRectangle.setSvgWidthAttribute(svgWidthValue);
+		drawAreaRectangle.setSvgXAttribute(svgXValue);
+		drawAreaRectangle.setSvgYAttribute(svgYValue);
+		this.appendChild(drawAreaRectangle);
+		return drawAreaRectangle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLayerElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLayerElement.java
new file mode 100644
index 0000000..d089533
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLayerElement.java
@@ -0,0 +1,172 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawProtectedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:layer}.
+ *
+ */
+public class DrawLayerElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "layer");
+
+	/**
+	 * Create the instance of <code>DrawLayerElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawLayerElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:layer}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayAttribute</code> , See {@odf.attribute draw:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayAttribute() {
+		DrawDisplayAttribute attr = (DrawDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return DrawDisplayAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayAttribute</code> , See {@odf.attribute draw:display}
+	 *
+	 * @param drawDisplayValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayAttribute(String drawDisplayValue) {
+		DrawDisplayAttribute attr = new DrawDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawProtectedAttribute</code> , See {@odf.attribute draw:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawProtectedAttribute() {
+		DrawProtectedAttribute attr = (DrawProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(DrawProtectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawProtectedAttribute</code> , See {@odf.attribute draw:protected}
+	 *
+	 * @param drawProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawProtectedAttribute(Boolean drawProtectedValue) {
+		DrawProtectedAttribute attr = new DrawProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLayerSetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLayerSetElement.java
new file mode 100644
index 0000000..b648ca0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLayerSetElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:layer-set}.
+ *
+ */
+public class DrawLayerSetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "layer-set");
+
+	/**
+	 * Create the instance of <code>DrawLayerSetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawLayerSetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:layer-set}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:layer}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @return the element {@odf.element draw:layer}
+	 */
+	 public DrawLayerElement newDrawLayerElement(String drawNameValue) {
+		DrawLayerElement drawLayer = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLayerElement.class);
+		drawLayer.setDrawNameAttribute(drawNameValue);
+		this.appendChild(drawLayer);
+		return drawLayer;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLineElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLineElement.java
new file mode 100644
index 0000000..043e400
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawLineElement.java
@@ -0,0 +1,360 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY2Attribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:line}.
+ *
+ */
+public class DrawLineElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "line");
+
+	/**
+	 * Create the instance of <code>DrawLineElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawLineElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:line}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX1Attribute() {
+		SvgX1Attribute attr = (SvgX1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * @param svgX1Value   The type is <code>String</code>
+	 */
+	public void setSvgX1Attribute(String svgX1Value) {
+		SvgX1Attribute attr = new SvgX1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX2Attribute() {
+		SvgX2Attribute attr = (SvgX2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * @param svgX2Value   The type is <code>String</code>
+	 */
+	public void setSvgX2Attribute(String svgX2Value) {
+		SvgX2Attribute attr = new SvgX2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY1Attribute() {
+		SvgY1Attribute attr = (SvgY1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * @param svgY1Value   The type is <code>String</code>
+	 */
+	public void setSvgY1Attribute(String svgY1Value) {
+		SvgY1Attribute attr = new SvgY1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY2Attribute() {
+		SvgY2Attribute attr = (SvgY2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * @param svgY2Value   The type is <code>String</code>
+	 */
+	public void setSvgY2Attribute(String svgY2Value) {
+		SvgY2Attribute attr = new SvgY2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY2Value);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawMarkerElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawMarkerElement.java
new file mode 100644
index 0000000..7acade8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawMarkerElement.java
@@ -0,0 +1,177 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:marker}.
+ *
+ */
+public class DrawMarkerElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "marker");
+
+	/**
+	 * Create the instance of <code>DrawMarkerElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawMarkerElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:marker}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgDAttribute() {
+		SvgDAttribute attr = (SvgDAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "d");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @param svgDValue   The type is <code>String</code>
+	 */
+	public void setSvgDAttribute(String svgDValue) {
+		SvgDAttribute attr = new SvgDAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgDValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawMeasureElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawMeasureElement.java
new file mode 100644
index 0000000..615d65f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawMeasureElement.java
@@ -0,0 +1,360 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY2Attribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:measure}.
+ *
+ */
+public class DrawMeasureElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "measure");
+
+	/**
+	 * Create the instance of <code>DrawMeasureElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawMeasureElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:measure}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX1Attribute() {
+		SvgX1Attribute attr = (SvgX1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * @param svgX1Value   The type is <code>String</code>
+	 */
+	public void setSvgX1Attribute(String svgX1Value) {
+		SvgX1Attribute attr = new SvgX1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX2Attribute() {
+		SvgX2Attribute attr = (SvgX2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * @param svgX2Value   The type is <code>String</code>
+	 */
+	public void setSvgX2Attribute(String svgX2Value) {
+		SvgX2Attribute attr = new SvgX2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY1Attribute() {
+		SvgY1Attribute attr = (SvgY1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * @param svgY1Value   The type is <code>String</code>
+	 */
+	public void setSvgY1Attribute(String svgY1Value) {
+		SvgY1Attribute attr = new SvgY1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY2Attribute() {
+		SvgY2Attribute attr = (SvgY2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * @param svgY2Value   The type is <code>String</code>
+	 */
+	public void setSvgY2Attribute(String svgY2Value) {
+		SvgY2Attribute attr = new SvgY2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY2Value);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawObjectElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawObjectElement.java
new file mode 100644
index 0000000..c4a70eb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawObjectElement.java
@@ -0,0 +1,249 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.math.MathMathElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNotifyOnUpdateOfRangesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:object}.
+ *
+ */
+public class DrawObjectElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "object");
+
+	/**
+	 * Create the instance of <code>DrawObjectElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawObjectElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:object}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNotifyOnUpdateOfRangesAttribute</code> , See {@odf.attribute draw:notify-on-update-of-ranges}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNotifyOnUpdateOfRangesAttribute() {
+		DrawNotifyOnUpdateOfRangesAttribute attr = (DrawNotifyOnUpdateOfRangesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "notify-on-update-of-ranges");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNotifyOnUpdateOfRangesAttribute</code> , See {@odf.attribute draw:notify-on-update-of-ranges}
+	 *
+	 * @param drawNotifyOnUpdateOfRangesValue   The type is <code>String</code>
+	 */
+	public void setDrawNotifyOnUpdateOfRangesAttribute(String drawNotifyOnUpdateOfRangesValue) {
+		DrawNotifyOnUpdateOfRangesAttribute attr = new DrawNotifyOnUpdateOfRangesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNotifyOnUpdateOfRangesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element math:math}.
+	 *
+	 * @return the element {@odf.element math:math}
+	 */
+	public MathMathElement newMathMathElement() {
+		MathMathElement mathMath = ((OdfFileDom) this.ownerDocument).newOdfElement(MathMathElement.class);
+		this.appendChild(mathMath);
+		return mathMath;
+	}
+
+	/**
+	 * Create child element {@odf.element office:document}.
+	 *
+	 * @param officeMimetypeValue  the <code>String</code> value of <code>OfficeMimetypeAttribute</code>, see {@odf.attribute  office:mimetype} at specification
+	 * @param officeVersionValue  the <code>String</code> value of <code>OfficeVersionAttribute</code>, see {@odf.attribute  office:version} at specification
+	 * @return the element {@odf.element office:document}
+	 */
+	 public OfficeDocumentElement newOfficeDocumentElement(String officeMimetypeValue, String officeVersionValue) {
+		OfficeDocumentElement officeDocument = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDocumentElement.class);
+		officeDocument.setOfficeMimetypeAttribute(officeMimetypeValue);
+		officeDocument.setOfficeVersionAttribute(officeVersionValue);
+		this.appendChild(officeDocument);
+		return officeDocument;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawObjectOleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawObjectOleElement.java
new file mode 100644
index 0000000..e956e35
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawObjectOleElement.java
@@ -0,0 +1,233 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBinaryDataElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:object-ole}.
+ *
+ */
+public class DrawObjectOleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "object-ole");
+
+	/**
+	 * Create the instance of <code>DrawObjectOleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawObjectOleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:object-ole}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassIdAttribute</code> , See {@odf.attribute draw:class-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassIdAttribute() {
+		DrawClassIdAttribute attr = (DrawClassIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassIdAttribute</code> , See {@odf.attribute draw:class-id}
+	 *
+	 * @param drawClassIdValue   The type is <code>String</code>
+	 */
+	public void setDrawClassIdAttribute(String drawClassIdValue) {
+		DrawClassIdAttribute attr = new DrawClassIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:binary-data}.
+	 *
+	 * @return the element {@odf.element office:binary-data}
+	 */
+	public OfficeBinaryDataElement newOfficeBinaryDataElement() {
+		OfficeBinaryDataElement officeBinaryData = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeBinaryDataElement.class);
+		this.appendChild(officeBinaryData);
+		return officeBinaryData;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawOpacityElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawOpacityElement.java
new file mode 100644
index 0000000..f43f03d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawOpacityElement.java
@@ -0,0 +1,298 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:opacity}.
+ *
+ */
+public class DrawOpacityElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "opacity");
+
+	/**
+	 * Create the instance of <code>DrawOpacityElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawOpacityElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:opacity}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawAngleAttribute</code> , See {@odf.attribute draw:angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawAngleAttribute() {
+		DrawAngleAttribute attr = (DrawAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawAngleAttribute</code> , See {@odf.attribute draw:angle}
+	 *
+	 * @param drawAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawAngleAttribute(String drawAngleValue) {
+		DrawAngleAttribute attr = new DrawAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawBorderAttribute</code> , See {@odf.attribute draw:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawBorderAttribute() {
+		DrawBorderAttribute attr = (DrawBorderAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawBorderAttribute</code> , See {@odf.attribute draw:border}
+	 *
+	 * @param drawBorderValue   The type is <code>String</code>
+	 */
+	public void setDrawBorderAttribute(String drawBorderValue) {
+		DrawBorderAttribute attr = new DrawBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCxAttribute</code> , See {@odf.attribute draw:cx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCxAttribute() {
+		DrawCxAttribute attr = (DrawCxAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "cx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCxAttribute</code> , See {@odf.attribute draw:cx}
+	 *
+	 * @param drawCxValue   The type is <code>String</code>
+	 */
+	public void setDrawCxAttribute(String drawCxValue) {
+		DrawCxAttribute attr = new DrawCxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCyAttribute</code> , See {@odf.attribute draw:cy}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCyAttribute() {
+		DrawCyAttribute attr = (DrawCyAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "cy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCyAttribute</code> , See {@odf.attribute draw:cy}
+	 *
+	 * @param drawCyValue   The type is <code>String</code>
+	 */
+	public void setDrawCyAttribute(String drawCyValue) {
+		DrawCyAttribute attr = new DrawCyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndAttribute</code> , See {@odf.attribute draw:end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndAttribute() {
+		DrawEndAttribute attr = (DrawEndAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndAttribute</code> , See {@odf.attribute draw:end}
+	 *
+	 * @param drawEndValue   The type is <code>String</code>
+	 */
+	public void setDrawEndAttribute(String drawEndValue) {
+		DrawEndAttribute attr = new DrawEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartAttribute</code> , See {@odf.attribute draw:start}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartAttribute() {
+		DrawStartAttribute attr = (DrawStartAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartAttribute</code> , See {@odf.attribute draw:start}
+	 *
+	 * @param drawStartValue   The type is <code>String</code>
+	 */
+	public void setDrawStartAttribute(String drawStartValue) {
+		DrawStartAttribute attr = new DrawStartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleAttribute() {
+		DrawStyleAttribute attr = (DrawStyleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * @param drawStyleValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleAttribute(String drawStyleValue) {
+		DrawStyleAttribute attr = new DrawStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPageElement.java
new file mode 100644
index 0000000..0ccf1cd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPageElement.java
@@ -0,0 +1,791 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateColorElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateMotionElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateTransformElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAudioElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimCommandElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimIterateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimParElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimSeqElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimSetElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimTransitionFilterElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationAnimationsElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMasterPageNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNavOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresentationPageLayoutNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseDateTimeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseFooterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseHeaderNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:page}.
+ *
+ */
+public class DrawPageElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "page");
+
+	/**
+	 * Create the instance of <code>DrawPageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawPageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.DrawingPage, OdfName.newName(OdfDocumentNamespace.DRAW, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:page}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMasterPageNameAttribute</code> , See {@odf.attribute draw:master-page-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMasterPageNameAttribute() {
+		DrawMasterPageNameAttribute attr = (DrawMasterPageNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "master-page-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMasterPageNameAttribute</code> , See {@odf.attribute draw:master-page-name}
+	 *
+	 * @param drawMasterPageNameValue   The type is <code>String</code>
+	 */
+	public void setDrawMasterPageNameAttribute(String drawMasterPageNameValue) {
+		DrawMasterPageNameAttribute attr = new DrawMasterPageNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMasterPageNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNavOrderAttribute</code> , See {@odf.attribute draw:nav-order}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNavOrderAttribute() {
+		DrawNavOrderAttribute attr = (DrawNavOrderAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "nav-order");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNavOrderAttribute</code> , See {@odf.attribute draw:nav-order}
+	 *
+	 * @param drawNavOrderValue   The type is <code>String</code>
+	 */
+	public void setDrawNavOrderAttribute(String drawNavOrderValue) {
+		DrawNavOrderAttribute attr = new DrawNavOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNavOrderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresentationPageLayoutNameAttribute</code> , See {@odf.attribute presentation:presentation-page-layout-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresentationPageLayoutNameAttribute() {
+		PresentationPresentationPageLayoutNameAttribute attr = (PresentationPresentationPageLayoutNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "presentation-page-layout-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresentationPageLayoutNameAttribute</code> , See {@odf.attribute presentation:presentation-page-layout-name}
+	 *
+	 * @param presentationPresentationPageLayoutNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresentationPageLayoutNameAttribute(String presentationPresentationPageLayoutNameValue) {
+		PresentationPresentationPageLayoutNameAttribute attr = new PresentationPresentationPageLayoutNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresentationPageLayoutNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseDateTimeNameAttribute</code> , See {@odf.attribute presentation:use-date-time-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseDateTimeNameAttribute() {
+		PresentationUseDateTimeNameAttribute attr = (PresentationUseDateTimeNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-date-time-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseDateTimeNameAttribute</code> , See {@odf.attribute presentation:use-date-time-name}
+	 *
+	 * @param presentationUseDateTimeNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseDateTimeNameAttribute(String presentationUseDateTimeNameValue) {
+		PresentationUseDateTimeNameAttribute attr = new PresentationUseDateTimeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseDateTimeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseFooterNameAttribute</code> , See {@odf.attribute presentation:use-footer-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseFooterNameAttribute() {
+		PresentationUseFooterNameAttribute attr = (PresentationUseFooterNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-footer-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseFooterNameAttribute</code> , See {@odf.attribute presentation:use-footer-name}
+	 *
+	 * @param presentationUseFooterNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseFooterNameAttribute(String presentationUseFooterNameValue) {
+		PresentationUseFooterNameAttribute attr = new PresentationUseFooterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseFooterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseHeaderNameAttribute</code> , See {@odf.attribute presentation:use-header-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseHeaderNameAttribute() {
+		PresentationUseHeaderNameAttribute attr = (PresentationUseHeaderNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-header-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseHeaderNameAttribute</code> , See {@odf.attribute presentation:use-header-name}
+	 *
+	 * @param presentationUseHeaderNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseHeaderNameAttribute(String presentationUseHeaderNameValue) {
+		PresentationUseHeaderNameAttribute attr = new PresentationUseHeaderNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseHeaderNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animate}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animate}
+	 */
+	 public AnimAnimateElement newAnimAnimateElement(String smilAttributeNameValue) {
+		AnimAnimateElement animAnimate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateElement.class);
+		animAnimate.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimate);
+		return animAnimate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateColor}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateColor}
+	 */
+	 public AnimAnimateColorElement newAnimAnimateColorElement(String smilAttributeNameValue) {
+		AnimAnimateColorElement animAnimateColor = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateColorElement.class);
+		animAnimateColor.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateColor);
+		return animAnimateColor;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateMotion}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:animateMotion}
+	 */
+	 public AnimAnimateMotionElement newAnimAnimateMotionElement(String smilAttributeNameValue) {
+		AnimAnimateMotionElement animAnimateMotion = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateMotionElement.class);
+		animAnimateMotion.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateMotion);
+		return animAnimateMotion;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateTransform}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @param svgTypeValue  the <code>String</code> value of <code>SvgTypeAttribute</code>, see {@odf.attribute  svg:type} at specification
+	 * @return the element {@odf.element anim:animateTransform}
+	 */
+	 public AnimAnimateTransformElement newAnimAnimateTransformElement(String smilAttributeNameValue, String svgTypeValue) {
+		AnimAnimateTransformElement animAnimateTransform = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateTransformElement.class);
+		animAnimateTransform.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		animAnimateTransform.setSvgTypeAttribute(svgTypeValue);
+		this.appendChild(animAnimateTransform);
+		return animAnimateTransform;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:audio}.
+	 *
+	 * @return the element {@odf.element anim:audio}
+	 */
+	public AnimAudioElement newAnimAudioElement() {
+		AnimAudioElement animAudio = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAudioElement.class);
+		this.appendChild(animAudio);
+		return animAudio;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:command}.
+	 *
+	 * @param animCommandValue  the <code>String</code> value of <code>AnimCommandAttribute</code>, see {@odf.attribute  anim:command} at specification
+	 * @return the element {@odf.element anim:command}
+	 */
+	 public AnimCommandElement newAnimCommandElement(String animCommandValue) {
+		AnimCommandElement animCommand = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimCommandElement.class);
+		animCommand.setAnimCommandAttribute(animCommandValue);
+		this.appendChild(animCommand);
+		return animCommand;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:iterate}.
+	 *
+	 * @return the element {@odf.element anim:iterate}
+	 */
+	public AnimIterateElement newAnimIterateElement() {
+		AnimIterateElement animIterate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimIterateElement.class);
+		this.appendChild(animIterate);
+		return animIterate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:par}.
+	 *
+	 * @return the element {@odf.element anim:par}
+	 */
+	public AnimParElement newAnimParElement() {
+		AnimParElement animPar = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimParElement.class);
+		this.appendChild(animPar);
+		return animPar;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:seq}.
+	 *
+	 * @return the element {@odf.element anim:seq}
+	 */
+	public AnimSeqElement newAnimSeqElement() {
+		AnimSeqElement animSeq = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSeqElement.class);
+		this.appendChild(animSeq);
+		return animSeq;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:set}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @return the element {@odf.element anim:set}
+	 */
+	 public AnimSetElement newAnimSetElement(String smilAttributeNameValue) {
+		AnimSetElement animSet = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSetElement.class);
+		animSet.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animSet);
+		return animSet;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:transitionFilter}.
+	 *
+	 * @param smilTypeValue  the <code>String</code> value of <code>SmilTypeAttribute</code>, see {@odf.attribute  smil:type} at specification
+	 * @return the element {@odf.element anim:transitionFilter}
+	 */
+	 public AnimTransitionFilterElement newAnimTransitionFilterElement(String smilTypeValue) {
+		AnimTransitionFilterElement animTransitionFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimTransitionFilterElement.class);
+		animTransitionFilter.setSmilTypeAttribute(smilTypeValue);
+		this.appendChild(animTransitionFilter);
+		return animTransitionFilter;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:layer-set}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:layer-set}
+	 */
+	public DrawLayerSetElement newDrawLayerSetElement() {
+		DrawLayerSetElement drawLayerSet = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLayerSetElement.class);
+		this.appendChild(drawLayerSet);
+		return drawLayerSet;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:forms}.
+	 *
+	 * @return the element {@odf.element office:forms}
+	 */
+	public OfficeFormsElement newOfficeFormsElement() {
+		OfficeFormsElement officeForms = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFormsElement.class);
+		this.appendChild(officeForms);
+		return officeForms;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:animations}.
+	 *
+	 * @return the element {@odf.element presentation:animations}
+	 */
+	public PresentationAnimationsElement newPresentationAnimationsElement() {
+		PresentationAnimationsElement presentationAnimations = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationAnimationsElement.class);
+		this.appendChild(presentationAnimations);
+		return presentationAnimations;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:notes}.
+	 *
+	 * @return the element {@odf.element presentation:notes}
+	 */
+	public PresentationNotesElement newPresentationNotesElement() {
+		PresentationNotesElement presentationNotes = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationNotesElement.class);
+		this.appendChild(presentationNotes);
+		return presentationNotes;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPageThumbnailElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPageThumbnailElement.java
new file mode 100644
index 0000000..e9f271f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPageThumbnailElement.java
@@ -0,0 +1,372 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPlaceholderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUserTransformedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:page-thumbnail}.
+ *
+ */
+public class DrawPageThumbnailElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "page-thumbnail");
+
+	/**
+	 * Create the instance of <code>DrawPageThumbnailElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawPageThumbnailElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:page-thumbnail}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPageNumberAttribute</code> , See {@odf.attribute draw:page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawPageNumberAttribute() {
+		DrawPageNumberAttribute attr = (DrawPageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPageNumberAttribute</code> , See {@odf.attribute draw:page-number}
+	 *
+	 * @param drawPageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setDrawPageNumberAttribute(Integer drawPageNumberValue) {
+		DrawPageNumberAttribute attr = new DrawPageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawPageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassAttribute</code> , See {@odf.attribute presentation:class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassAttribute() {
+		PresentationClassAttribute attr = (PresentationClassAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassAttribute</code> , See {@odf.attribute presentation:class}
+	 *
+	 * @param presentationClassValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassAttribute(String presentationClassValue) {
+		PresentationClassAttribute attr = new PresentationClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPlaceholderAttribute</code> , See {@odf.attribute presentation:placeholder}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationPlaceholderAttribute() {
+		PresentationPlaceholderAttribute attr = (PresentationPlaceholderAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "placeholder");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPlaceholderAttribute</code> , See {@odf.attribute presentation:placeholder}
+	 *
+	 * @param presentationPlaceholderValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationPlaceholderAttribute(Boolean presentationPlaceholderValue) {
+		PresentationPlaceholderAttribute attr = new PresentationPlaceholderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationPlaceholderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUserTransformedAttribute</code> , See {@odf.attribute presentation:user-transformed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationUserTransformedAttribute() {
+		PresentationUserTransformedAttribute attr = (PresentationUserTransformedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "user-transformed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUserTransformedAttribute</code> , See {@odf.attribute presentation:user-transformed}
+	 *
+	 * @param presentationUserTransformedValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationUserTransformedAttribute(Boolean presentationUserTransformedValue) {
+		PresentationUserTransformedAttribute attr = new PresentationUserTransformedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationUserTransformedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawParamElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawParamElement.java
new file mode 100644
index 0000000..fe1d8ac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawParamElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:param}.
+ *
+ */
+public class DrawParamElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "param");
+
+	/**
+	 * Create the instance of <code>DrawParamElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawParamElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:param}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawValueAttribute</code> , See {@odf.attribute draw:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawValueAttribute() {
+		DrawValueAttribute attr = (DrawValueAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawValueAttribute</code> , See {@odf.attribute draw:value}
+	 *
+	 * @param drawValueValue   The type is <code>String</code>
+	 */
+	public void setDrawValueAttribute(String drawValueValue) {
+		DrawValueAttribute attr = new DrawValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPathElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPathElement.java
new file mode 100644
index 0000000..22ff029
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPathElement.java
@@ -0,0 +1,406 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:path}.
+ *
+ */
+public class DrawPathElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "path");
+
+	/**
+	 * Create the instance of <code>DrawPathElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawPathElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:path}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgDAttribute() {
+		SvgDAttribute attr = (SvgDAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "d");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDAttribute</code> , See {@odf.attribute svg:d}
+	 *
+	 * @param svgDValue   The type is <code>String</code>
+	 */
+	public void setSvgDAttribute(String svgDValue) {
+		SvgDAttribute attr = new SvgDAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgDValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPluginElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPluginElement.java
new file mode 100644
index 0000000..36c8ffa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPluginElement.java
@@ -0,0 +1,236 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMimeTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:plugin}.
+ *
+ */
+public class DrawPluginElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "plugin");
+
+	/**
+	 * Create the instance of <code>DrawPluginElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawPluginElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:plugin}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMimeTypeAttribute</code> , See {@odf.attribute draw:mime-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMimeTypeAttribute() {
+		DrawMimeTypeAttribute attr = (DrawMimeTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "mime-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMimeTypeAttribute</code> , See {@odf.attribute draw:mime-type}
+	 *
+	 * @param drawMimeTypeValue   The type is <code>String</code>
+	 */
+	public void setDrawMimeTypeAttribute(String drawMimeTypeValue) {
+		DrawMimeTypeAttribute attr = new DrawMimeTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMimeTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:param}.
+	 *
+	 * @return the element {@odf.element draw:param}
+	 */
+	public DrawParamElement newDrawParamElement() {
+		DrawParamElement drawParam = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawParamElement.class);
+		this.appendChild(drawParam);
+		return drawParam;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPolygonElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPolygonElement.java
new file mode 100644
index 0000000..6e9cd90
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPolygonElement.java
@@ -0,0 +1,406 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPointsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:polygon}.
+ *
+ */
+public class DrawPolygonElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "polygon");
+
+	/**
+	 * Create the instance of <code>DrawPolygonElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawPolygonElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:polygon}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawPointsAttribute() {
+		DrawPointsAttribute attr = (DrawPointsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "points");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * @param drawPointsValue   The type is <code>String</code>
+	 */
+	public void setDrawPointsAttribute(String drawPointsValue) {
+		DrawPointsAttribute attr = new DrawPointsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawPointsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPolylineElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPolylineElement.java
new file mode 100644
index 0000000..dd6f3c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawPolylineElement.java
@@ -0,0 +1,406 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPointsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgViewBoxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:polyline}.
+ *
+ */
+public class DrawPolylineElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "polyline");
+
+	/**
+	 * Create the instance of <code>DrawPolylineElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawPolylineElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:polyline}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawPointsAttribute() {
+		DrawPointsAttribute attr = (DrawPointsAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "points");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPointsAttribute</code> , See {@odf.attribute draw:points}
+	 *
+	 * @param drawPointsValue   The type is <code>String</code>
+	 */
+	public void setDrawPointsAttribute(String drawPointsValue) {
+		DrawPointsAttribute attr = new DrawPointsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawPointsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgViewBoxAttribute() {
+		SvgViewBoxAttribute attr = (SvgViewBoxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "viewBox");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgViewBoxAttribute</code> , See {@odf.attribute svg:viewBox}
+	 *
+	 * @param svgViewBoxValue   The type is <code>Integer</code>
+	 */
+	public void setSvgViewBoxAttribute(Integer svgViewBoxValue) {
+		SvgViewBoxAttribute attr = new SvgViewBoxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgViewBoxValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawRectElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawRectElement.java
new file mode 100644
index 0000000..b358fdb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawRectElement.java
@@ -0,0 +1,427 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCornerRadiusAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:rect}.
+ *
+ */
+public class DrawRectElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "rect");
+
+	/**
+	 * Create the instance of <code>DrawRectElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawRectElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:rect}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCornerRadiusAttribute() {
+		DrawCornerRadiusAttribute attr = (DrawCornerRadiusAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "corner-radius");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @param drawCornerRadiusValue   The type is <code>String</code>
+	 */
+	public void setDrawCornerRadiusAttribute(String drawCornerRadiusValue) {
+		DrawCornerRadiusAttribute attr = new DrawCornerRadiusAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCornerRadiusValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRxAttribute</code> , See {@odf.attribute svg:rx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRxAttribute() {
+		SvgRxAttribute attr = (SvgRxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "rx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRxAttribute</code> , See {@odf.attribute svg:rx}
+	 *
+	 * @param svgRxValue   The type is <code>String</code>
+	 */
+	public void setSvgRxAttribute(String svgRxValue) {
+		SvgRxAttribute attr = new SvgRxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRyAttribute</code> , See {@odf.attribute svg:ry}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRyAttribute() {
+		SvgRyAttribute attr = (SvgRyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "ry");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRyAttribute</code> , See {@odf.attribute svg:ry}
+	 *
+	 * @param svgRyValue   The type is <code>String</code>
+	 */
+	public void setSvgRyAttribute(String svgRyValue) {
+		SvgRyAttribute attr = new SvgRyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawRegularPolygonElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawRegularPolygonElement.java
new file mode 100644
index 0000000..af3301e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawRegularPolygonElement.java
@@ -0,0 +1,431 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawConcaveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCornersAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawSharpnessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:regular-polygon}.
+ *
+ */
+public class DrawRegularPolygonElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "regular-polygon");
+
+	/**
+	 * Create the instance of <code>DrawRegularPolygonElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawRegularPolygonElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:regular-polygon}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionIdAttribute() {
+		DrawCaptionIdAttribute attr = (DrawCaptionIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionIdAttribute</code> , See {@odf.attribute draw:caption-id}
+	 *
+	 * @param drawCaptionIdValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionIdAttribute(String drawCaptionIdValue) {
+		DrawCaptionIdAttribute attr = new DrawCaptionIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawConcaveAttribute</code> , See {@odf.attribute draw:concave}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawConcaveAttribute() {
+		DrawConcaveAttribute attr = (DrawConcaveAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "concave");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawConcaveAttribute</code> , See {@odf.attribute draw:concave}
+	 *
+	 * @param drawConcaveValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawConcaveAttribute(Boolean drawConcaveValue) {
+		DrawConcaveAttribute attr = new DrawConcaveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawConcaveValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCornersAttribute</code> , See {@odf.attribute draw:corners}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawCornersAttribute() {
+		DrawCornersAttribute attr = (DrawCornersAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "corners");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCornersAttribute</code> , See {@odf.attribute draw:corners}
+	 *
+	 * @param drawCornersValue   The type is <code>Integer</code>
+	 */
+	public void setDrawCornersAttribute(Integer drawCornersValue) {
+		DrawCornersAttribute attr = new DrawCornersAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawCornersValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawSharpnessAttribute</code> , See {@odf.attribute draw:sharpness}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawSharpnessAttribute() {
+		DrawSharpnessAttribute attr = (DrawSharpnessAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "sharpness");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawSharpnessAttribute</code> , See {@odf.attribute draw:sharpness}
+	 *
+	 * @param drawSharpnessValue   The type is <code>String</code>
+	 */
+	public void setDrawSharpnessAttribute(String drawSharpnessValue) {
+		DrawSharpnessAttribute attr = new DrawSharpnessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawSharpnessValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element draw:glue-point}.
+	 *
+	 * @param drawEscapeDirectionValue  the <code>String</code> value of <code>DrawEscapeDirectionAttribute</code>, see {@odf.attribute  draw:escape-direction} at specification
+	 * @param drawIdValue  the <code>String</code> value of <code>DrawIdAttribute</code>, see {@odf.attribute  draw:id} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element draw:glue-point}
+	 */
+	 public DrawGluePointElement newDrawGluePointElement(String drawEscapeDirectionValue, String drawIdValue, String svgXValue, String svgYValue) {
+		DrawGluePointElement drawGluePoint = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGluePointElement.class);
+		drawGluePoint.setDrawEscapeDirectionAttribute(drawEscapeDirectionValue);
+		drawGluePoint.setDrawIdAttribute(drawIdValue);
+		drawGluePoint.setSvgXAttribute(svgXValue);
+		drawGluePoint.setSvgYAttribute(svgYValue);
+		this.appendChild(drawGluePoint);
+		return drawGluePoint;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:desc}.
+	 *
+	 * @return the element {@odf.element svg:desc}
+	 */
+	public SvgDescElement newSvgDescElement() {
+		SvgDescElement svgDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDescElement.class);
+		this.appendChild(svgDesc);
+		return svgDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:title}.
+	 *
+	 * @return the element {@odf.element svg:title}
+	 */
+	public SvgTitleElement newSvgTitleElement() {
+		SvgTitleElement svgTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgTitleElement.class);
+		this.appendChild(svgTitle);
+		return svgTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawShapeElementBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawShapeElementBase.java
new file mode 100644
index 0000000..ccb2e49
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawShapeElementBase.java
@@ -0,0 +1,404 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawZIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableBackgroundAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorPageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument base element
+ *
+ */
+public abstract class DrawShapeElementBase extends OdfStyleableShapeElement {
+
+	/**
+	 * Create the instance of <code>DrawShapeElementBase</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawShapeElementBase(OdfFileDom ownerDoc, OdfName elementName) {
+		super(ownerDoc, elementName);
+	}
+
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawClassNamesAttribute() {
+		DrawClassNamesAttribute attr = (DrawClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawClassNamesAttribute</code> , See {@odf.attribute draw:class-names}
+	 *
+	 * @param drawClassNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawClassNamesAttribute(String drawClassNamesValue) {
+		DrawClassNamesAttribute attr = new DrawClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawIdAttribute() {
+		DrawIdAttribute attr = (DrawIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawIdAttribute</code> , See {@odf.attribute draw:id}
+	 *
+	 * @param drawIdValue   The type is <code>String</code>
+	 */
+	public void setDrawIdAttribute(String drawIdValue) {
+		DrawIdAttribute attr = new DrawIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawZIndexAttribute() {
+		DrawZIndexAttribute attr = (DrawZIndexAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "z-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawZIndexAttribute</code> , See {@odf.attribute draw:z-index}
+	 *
+	 * @param drawZIndexValue   The type is <code>Integer</code>
+	 */
+	public void setDrawZIndexAttribute(Integer drawZIndexValue) {
+		DrawZIndexAttribute attr = new DrawZIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawZIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationClassNamesAttribute() {
+		PresentationClassNamesAttribute attr = (PresentationClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationClassNamesAttribute</code> , See {@odf.attribute presentation:class-names}
+	 *
+	 * @param presentationClassNamesValue   The type is <code>String</code>
+	 */
+	public void setPresentationClassNamesAttribute(String presentationClassNamesValue) {
+		PresentationClassNamesAttribute attr = new PresentationClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStyleNameAttribute() {
+		PresentationStyleNameAttribute attr = (PresentationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStyleNameAttribute</code> , See {@odf.attribute presentation:style-name}
+	 *
+	 * @param presentationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationStyleNameAttribute(String presentationStyleNameValue) {
+		PresentationStyleNameAttribute attr = new PresentationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndCellAddressAttribute</code> , See {@odf.attribute table:end-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEndCellAddressAttribute() {
+		TableEndCellAddressAttribute attr = (TableEndCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndCellAddressAttribute</code> , See {@odf.attribute table:end-cell-address}
+	 *
+	 * @param tableEndCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableEndCellAddressAttribute(String tableEndCellAddressValue) {
+		TableEndCellAddressAttribute attr = new TableEndCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEndCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndXAttribute</code> , See {@odf.attribute table:end-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEndXAttribute() {
+		TableEndXAttribute attr = (TableEndXAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndXAttribute</code> , See {@odf.attribute table:end-x}
+	 *
+	 * @param tableEndXValue   The type is <code>String</code>
+	 */
+	public void setTableEndXAttribute(String tableEndXValue) {
+		TableEndXAttribute attr = new TableEndXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEndXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndYAttribute</code> , See {@odf.attribute table:end-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEndYAttribute() {
+		TableEndYAttribute attr = (TableEndYAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndYAttribute</code> , See {@odf.attribute table:end-y}
+	 *
+	 * @param tableEndYValue   The type is <code>String</code>
+	 */
+	public void setTableEndYAttribute(String tableEndYValue) {
+		TableEndYAttribute attr = new TableEndYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEndYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableBackgroundAttribute</code> , See {@odf.attribute table:table-background}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableTableBackgroundAttribute() {
+		TableTableBackgroundAttribute attr = (TableTableBackgroundAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table-background");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableBackgroundAttribute</code> , See {@odf.attribute table:table-background}
+	 *
+	 * @param tableTableBackgroundValue   The type is <code>Boolean</code>
+	 */
+	public void setTableTableBackgroundAttribute(Boolean tableTableBackgroundValue) {
+		TableTableBackgroundAttribute attr = new TableTableBackgroundAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableTableBackgroundValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnchorPageNumberAttribute</code> , See {@odf.attribute text:anchor-page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextAnchorPageNumberAttribute() {
+		TextAnchorPageNumberAttribute attr = (TextAnchorPageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "anchor-page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnchorPageNumberAttribute</code> , See {@odf.attribute text:anchor-page-number}
+	 *
+	 * @param textAnchorPageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTextAnchorPageNumberAttribute(Integer textAnchorPageNumberValue) {
+		TextAnchorPageNumberAttribute attr = new TextAnchorPageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textAnchorPageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnchorTypeAttribute</code> , See {@odf.attribute text:anchor-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnchorTypeAttribute() {
+		TextAnchorTypeAttribute attr = (TextAnchorTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "anchor-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnchorTypeAttribute</code> , See {@odf.attribute text:anchor-type}
+	 *
+	 * @param textAnchorTypeValue   The type is <code>String</code>
+	 */
+	public void setTextAnchorTypeAttribute(String textAnchorTypeValue) {
+		TextAnchorTypeAttribute attr = new TextAnchorTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnchorTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawStrokeDashElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawStrokeDashElement.java
new file mode 100644
index 0000000..b8b5a03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawStrokeDashElement.java
@@ -0,0 +1,273 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDots1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDots1LengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDots2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDots2LengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:stroke-dash}.
+ *
+ */
+public class DrawStrokeDashElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash");
+
+	/**
+	 * Create the instance of <code>DrawStrokeDashElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawStrokeDashElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:stroke-dash}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDistanceAttribute</code> , See {@odf.attribute draw:distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDistanceAttribute() {
+		DrawDistanceAttribute attr = (DrawDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDistanceAttribute</code> , See {@odf.attribute draw:distance}
+	 *
+	 * @param drawDistanceValue   The type is <code>String</code>
+	 */
+	public void setDrawDistanceAttribute(String drawDistanceValue) {
+		DrawDistanceAttribute attr = new DrawDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDots1Attribute</code> , See {@odf.attribute draw:dots1}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawDots1Attribute() {
+		DrawDots1Attribute attr = (DrawDots1Attribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "dots1");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDots1Attribute</code> , See {@odf.attribute draw:dots1}
+	 *
+	 * @param drawDots1Value   The type is <code>Integer</code>
+	 */
+	public void setDrawDots1Attribute(Integer drawDots1Value) {
+		DrawDots1Attribute attr = new DrawDots1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawDots1Value.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDots1LengthAttribute</code> , See {@odf.attribute draw:dots1-length}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDots1LengthAttribute() {
+		DrawDots1LengthAttribute attr = (DrawDots1LengthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "dots1-length");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDots1LengthAttribute</code> , See {@odf.attribute draw:dots1-length}
+	 *
+	 * @param drawDots1LengthValue   The type is <code>String</code>
+	 */
+	public void setDrawDots1LengthAttribute(String drawDots1LengthValue) {
+		DrawDots1LengthAttribute attr = new DrawDots1LengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDots1LengthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDots2Attribute</code> , See {@odf.attribute draw:dots2}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawDots2Attribute() {
+		DrawDots2Attribute attr = (DrawDots2Attribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "dots2");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDots2Attribute</code> , See {@odf.attribute draw:dots2}
+	 *
+	 * @param drawDots2Value   The type is <code>Integer</code>
+	 */
+	public void setDrawDots2Attribute(Integer drawDots2Value) {
+		DrawDots2Attribute attr = new DrawDots2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawDots2Value.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDots2LengthAttribute</code> , See {@odf.attribute draw:dots2-length}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDots2LengthAttribute() {
+		DrawDots2LengthAttribute attr = (DrawDots2LengthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "dots2-length");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDots2LengthAttribute</code> , See {@odf.attribute draw:dots2-length}
+	 *
+	 * @param drawDots2LengthValue   The type is <code>String</code>
+	 */
+	public void setDrawDots2LengthAttribute(String drawDots2LengthValue) {
+		DrawDots2LengthAttribute attr = new DrawDots2LengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDots2LengthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleAttribute() {
+		DrawStyleAttribute attr = (DrawStyleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleAttribute</code> , See {@odf.attribute draw:style}
+	 *
+	 * @param drawStyleValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleAttribute(String drawStyleValue) {
+		DrawStyleAttribute attr = new DrawStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawTextBoxElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawTextBoxElement.java
new file mode 100644
index 0000000..67cb727
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/draw/DrawTextBoxElement.java
@@ -0,0 +1,742 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberedParagraphElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawChainNextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCornerRadiusAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMaxHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMaxWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMinHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMinWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element draw:text-box}.
+ *
+ */
+public class DrawTextBoxElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.DRAW, "text-box");
+
+	/**
+	 * Create the instance of <code>DrawTextBoxElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public DrawTextBoxElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element draw:text-box}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawChainNextNameAttribute</code> , See {@odf.attribute draw:chain-next-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawChainNextNameAttribute() {
+		DrawChainNextNameAttribute attr = (DrawChainNextNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "chain-next-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawChainNextNameAttribute</code> , See {@odf.attribute draw:chain-next-name}
+	 *
+	 * @param drawChainNextNameValue   The type is <code>String</code>
+	 */
+	public void setDrawChainNextNameAttribute(String drawChainNextNameValue) {
+		DrawChainNextNameAttribute attr = new DrawChainNextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawChainNextNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCornerRadiusAttribute() {
+		DrawCornerRadiusAttribute attr = (DrawCornerRadiusAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "corner-radius");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @param drawCornerRadiusValue   The type is <code>String</code>
+	 */
+	public void setDrawCornerRadiusAttribute(String drawCornerRadiusValue) {
+		DrawCornerRadiusAttribute attr = new DrawCornerRadiusAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCornerRadiusValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMaxHeightAttribute</code> , See {@odf.attribute fo:max-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMaxHeightAttribute() {
+		FoMaxHeightAttribute attr = (FoMaxHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "max-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMaxHeightAttribute</code> , See {@odf.attribute fo:max-height}
+	 *
+	 * @param foMaxHeightValue   The type is <code>String</code>
+	 */
+	public void setFoMaxHeightAttribute(String foMaxHeightValue) {
+		FoMaxHeightAttribute attr = new FoMaxHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMaxHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMaxWidthAttribute</code> , See {@odf.attribute fo:max-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMaxWidthAttribute() {
+		FoMaxWidthAttribute attr = (FoMaxWidthAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "max-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMaxWidthAttribute</code> , See {@odf.attribute fo:max-width}
+	 *
+	 * @param foMaxWidthValue   The type is <code>String</code>
+	 */
+	public void setFoMaxWidthAttribute(String foMaxWidthValue) {
+		FoMaxWidthAttribute attr = new FoMaxWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMaxWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMinHeightAttribute</code> , See {@odf.attribute fo:min-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMinHeightAttribute() {
+		FoMinHeightAttribute attr = (FoMinHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "min-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMinHeightAttribute</code> , See {@odf.attribute fo:min-height}
+	 *
+	 * @param foMinHeightValue   The type is <code>String</code>
+	 */
+	public void setFoMinHeightAttribute(String foMinHeightValue) {
+		FoMinHeightAttribute attr = new FoMinHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMinHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMinWidthAttribute</code> , See {@odf.attribute fo:min-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMinWidthAttribute() {
+		FoMinWidthAttribute attr = (FoMinWidthAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "min-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMinWidthAttribute</code> , See {@odf.attribute fo:min-width}
+	 *
+	 * @param foMinWidthValue   The type is <code>String</code>
+	 */
+	public void setFoMinWidthAttribute(String foMinWidthValue) {
+		FoMinWidthAttribute attr = new FoMinWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMinWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormButtonElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormButtonElement.java
new file mode 100644
index 0000000..186c436
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormButtonElement.java
@@ -0,0 +1,698 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormButtonTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDefaultButtonAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDelayForRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormFocusOnClickAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImageAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImageDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImagePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormToggleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormXformsSubmissionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:button}.
+ *
+ */
+public class FormButtonElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "button");
+
+	/**
+	 * Create the instance of <code>FormButtonElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormButtonElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:button}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormButtonTypeAttribute</code> , See {@odf.attribute form:button-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormButtonTypeAttribute() {
+		FormButtonTypeAttribute attr = (FormButtonTypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "button-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormButtonTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormButtonTypeAttribute</code> , See {@odf.attribute form:button-type}
+	 *
+	 * @param formButtonTypeValue   The type is <code>String</code>
+	 */
+	public void setFormButtonTypeAttribute(String formButtonTypeValue) {
+		FormButtonTypeAttribute attr = new FormButtonTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formButtonTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDefaultButtonAttribute</code> , See {@odf.attribute form:default-button}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDefaultButtonAttribute() {
+		FormDefaultButtonAttribute attr = (FormDefaultButtonAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "default-button");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDefaultButtonAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDefaultButtonAttribute</code> , See {@odf.attribute form:default-button}
+	 *
+	 * @param formDefaultButtonValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDefaultButtonAttribute(Boolean formDefaultButtonValue) {
+		FormDefaultButtonAttribute attr = new FormDefaultButtonAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDefaultButtonValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDelayForRepeatAttribute() {
+		FormDelayForRepeatAttribute attr = (FormDelayForRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "delay-for-repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormDelayForRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @param formDelayForRepeatValue   The type is <code>String</code>
+	 */
+	public void setFormDelayForRepeatAttribute(String formDelayForRepeatValue) {
+		FormDelayForRepeatAttribute attr = new FormDelayForRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDelayForRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormFocusOnClickAttribute</code> , See {@odf.attribute form:focus-on-click}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormFocusOnClickAttribute() {
+		FormFocusOnClickAttribute attr = (FormFocusOnClickAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "focus-on-click");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormFocusOnClickAttribute</code> , See {@odf.attribute form:focus-on-click}
+	 *
+	 * @param formFocusOnClickValue   The type is <code>Boolean</code>
+	 */
+	public void setFormFocusOnClickAttribute(Boolean formFocusOnClickValue) {
+		FormFocusOnClickAttribute attr = new FormFocusOnClickAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formFocusOnClickValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImageAlignAttribute</code> , See {@odf.attribute form:image-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImageAlignAttribute() {
+		FormImageAlignAttribute attr = (FormImageAlignAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormImageAlignAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImageAlignAttribute</code> , See {@odf.attribute form:image-align}
+	 *
+	 * @param formImageAlignValue   The type is <code>String</code>
+	 */
+	public void setFormImageAlignAttribute(String formImageAlignValue) {
+		FormImageAlignAttribute attr = new FormImageAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImageAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImageDataAttribute</code> , See {@odf.attribute form:image-data}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImageDataAttribute() {
+		FormImageDataAttribute attr = (FormImageDataAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-data");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImageDataAttribute</code> , See {@odf.attribute form:image-data}
+	 *
+	 * @param formImageDataValue   The type is <code>String</code>
+	 */
+	public void setFormImageDataAttribute(String formImageDataValue) {
+		FormImageDataAttribute attr = new FormImageDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImageDataValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImagePositionAttribute</code> , See {@odf.attribute form:image-position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImagePositionAttribute() {
+		FormImagePositionAttribute attr = (FormImagePositionAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormImagePositionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImagePositionAttribute</code> , See {@odf.attribute form:image-position}
+	 *
+	 * @param formImagePositionValue   The type is <code>String</code>
+	 */
+	public void setFormImagePositionAttribute(String formImagePositionValue) {
+		FormImagePositionAttribute attr = new FormImagePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImagePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormRepeatAttribute() {
+		FormRepeatAttribute attr = (FormRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "repeat");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @param formRepeatValue   The type is <code>Boolean</code>
+	 */
+	public void setFormRepeatAttribute(Boolean formRepeatValue) {
+		FormRepeatAttribute attr = new FormRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formRepeatValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormToggleAttribute</code> , See {@odf.attribute form:toggle}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormToggleAttribute() {
+		FormToggleAttribute attr = (FormToggleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "toggle");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormToggleAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormToggleAttribute</code> , See {@odf.attribute form:toggle}
+	 *
+	 * @param formToggleValue   The type is <code>Boolean</code>
+	 */
+	public void setFormToggleAttribute(Boolean formToggleValue) {
+		FormToggleAttribute attr = new FormToggleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formToggleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormXformsSubmissionAttribute</code> , See {@odf.attribute form:xforms-submission}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormXformsSubmissionAttribute() {
+		FormXformsSubmissionAttribute attr = (FormXformsSubmissionAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "xforms-submission");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormXformsSubmissionAttribute</code> , See {@odf.attribute form:xforms-submission}
+	 *
+	 * @param formXformsSubmissionValue   The type is <code>String</code>
+	 */
+	public void setFormXformsSubmissionAttribute(String formXformsSubmissionValue) {
+		FormXformsSubmissionAttribute attr = new FormXformsSubmissionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formXformsSubmissionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameAttribute</code> , See {@odf.attribute office:target-frame}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameAttribute() {
+		OfficeTargetFrameAttribute attr = (OfficeTargetFrameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return OfficeTargetFrameAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameAttribute</code> , See {@odf.attribute office:target-frame}
+	 *
+	 * @param officeTargetFrameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameAttribute(String officeTargetFrameValue) {
+		OfficeTargetFrameAttribute attr = new OfficeTargetFrameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormCheckboxElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormCheckboxElement.java
new file mode 100644
index 0000000..b2d8a0f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormCheckboxElement.java
@@ -0,0 +1,598 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentStateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImageAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImagePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIsTristateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormStateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormVisualEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:checkbox}.
+ *
+ */
+public class FormCheckboxElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "checkbox");
+
+	/**
+	 * Create the instance of <code>FormCheckboxElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormCheckboxElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:checkbox}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentStateAttribute</code> , See {@odf.attribute form:current-state}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentStateAttribute() {
+		FormCurrentStateAttribute attr = (FormCurrentStateAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-state");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentStateAttribute</code> , See {@odf.attribute form:current-state}
+	 *
+	 * @param formCurrentStateValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentStateAttribute(String formCurrentStateValue) {
+		FormCurrentStateAttribute attr = new FormCurrentStateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentStateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImageAlignAttribute</code> , See {@odf.attribute form:image-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImageAlignAttribute() {
+		FormImageAlignAttribute attr = (FormImageAlignAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormImageAlignAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImageAlignAttribute</code> , See {@odf.attribute form:image-align}
+	 *
+	 * @param formImageAlignValue   The type is <code>String</code>
+	 */
+	public void setFormImageAlignAttribute(String formImageAlignValue) {
+		FormImageAlignAttribute attr = new FormImageAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImageAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImagePositionAttribute</code> , See {@odf.attribute form:image-position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImagePositionAttribute() {
+		FormImagePositionAttribute attr = (FormImagePositionAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormImagePositionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImagePositionAttribute</code> , See {@odf.attribute form:image-position}
+	 *
+	 * @param formImagePositionValue   The type is <code>String</code>
+	 */
+	public void setFormImagePositionAttribute(String formImagePositionValue) {
+		FormImagePositionAttribute attr = new FormImagePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImagePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIsTristateAttribute</code> , See {@odf.attribute form:is-tristate}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormIsTristateAttribute() {
+		FormIsTristateAttribute attr = (FormIsTristateAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "is-tristate");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormIsTristateAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIsTristateAttribute</code> , See {@odf.attribute form:is-tristate}
+	 *
+	 * @param formIsTristateValue   The type is <code>Boolean</code>
+	 */
+	public void setFormIsTristateAttribute(Boolean formIsTristateValue) {
+		FormIsTristateAttribute attr = new FormIsTristateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formIsTristateValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormStateAttribute</code> , See {@odf.attribute form:state}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormStateAttribute() {
+		FormStateAttribute attr = (FormStateAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "state");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormStateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormStateAttribute</code> , See {@odf.attribute form:state}
+	 *
+	 * @param formStateValue   The type is <code>String</code>
+	 */
+	public void setFormStateAttribute(String formStateValue) {
+		FormStateAttribute attr = new FormStateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formStateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormVisualEffectAttribute</code> , See {@odf.attribute form:visual-effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormVisualEffectAttribute() {
+		FormVisualEffectAttribute attr = (FormVisualEffectAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "visual-effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormVisualEffectAttribute</code> , See {@odf.attribute form:visual-effect}
+	 *
+	 * @param formVisualEffectValue   The type is <code>String</code>
+	 */
+	public void setFormVisualEffectAttribute(String formVisualEffectValue) {
+		FormVisualEffectAttribute attr = new FormVisualEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formVisualEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormColumnElement.java
new file mode 100644
index 0000000..d4d3295
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormColumnElement.java
@@ -0,0 +1,292 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:column}.
+ *
+ */
+public class FormColumnElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "column");
+
+	/**
+	 * Create the instance of <code>FormColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTextStyleNameAttribute</code> , See {@odf.attribute form:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTextStyleNameAttribute() {
+		FormTextStyleNameAttribute attr = (FormTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTextStyleNameAttribute</code> , See {@odf.attribute form:text-style-name}
+	 *
+	 * @param formTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setFormTextStyleNameAttribute(String formTextStyleNameValue) {
+		FormTextStyleNameAttribute attr = new FormTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTextStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:checkbox}.
+	 *
+	 * @param formImagePositionValue  the <code>String</code> value of <code>FormImagePositionAttribute</code>, see {@odf.attribute  form:image-position} at specification
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:checkbox}
+	 */
+	 public FormCheckboxElement newFormCheckboxElement(String formImagePositionValue, String xmlIdValue) {
+		FormCheckboxElement formCheckbox = ((OdfFileDom) this.ownerDocument).newOdfElement(FormCheckboxElement.class);
+		formCheckbox.setFormImagePositionAttribute(formImagePositionValue);
+		formCheckbox.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formCheckbox);
+		return formCheckbox;
+	}
+
+	/**
+	 * Create child element {@odf.element form:combobox}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:combobox}
+	 */
+	 public FormComboboxElement newFormComboboxElement(String xmlIdValue) {
+		FormComboboxElement formCombobox = ((OdfFileDom) this.ownerDocument).newOdfElement(FormComboboxElement.class);
+		formCombobox.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formCombobox);
+		return formCombobox;
+	}
+
+	/**
+	 * Create child element {@odf.element form:date}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:date}
+	 */
+	 public FormDateElement newFormDateElement(String xmlIdValue) {
+		FormDateElement formDate = ((OdfFileDom) this.ownerDocument).newOdfElement(FormDateElement.class);
+		formDate.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formDate);
+		return formDate;
+	}
+
+	/**
+	 * Create child element {@odf.element form:formatted-text}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:formatted-text}
+	 */
+	 public FormFormattedTextElement newFormFormattedTextElement(String xmlIdValue) {
+		FormFormattedTextElement formFormattedText = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFormattedTextElement.class);
+		formFormattedText.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formFormattedText);
+		return formFormattedText;
+	}
+
+	/**
+	 * Create child element {@odf.element form:listbox}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:listbox}
+	 */
+	 public FormListboxElement newFormListboxElement(String xmlIdValue) {
+		FormListboxElement formListbox = ((OdfFileDom) this.ownerDocument).newOdfElement(FormListboxElement.class);
+		formListbox.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formListbox);
+		return formListbox;
+	}
+
+	/**
+	 * Create child element {@odf.element form:number}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:number}
+	 */
+	 public FormNumberElement newFormNumberElement(String xmlIdValue) {
+		FormNumberElement formNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(FormNumberElement.class);
+		formNumber.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formNumber);
+		return formNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element form:text}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:text}
+	 */
+	 public FormTextElement newFormTextElement(String xmlIdValue) {
+		FormTextElement formText = ((OdfFileDom) this.ownerDocument).newOdfElement(FormTextElement.class);
+		formText.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formText);
+		return formText;
+	}
+
+	/**
+	 * Create child element {@odf.element form:textarea}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:textarea}
+	 */
+	 public FormTextareaElement newFormTextareaElement(String xmlIdValue) {
+		FormTextareaElement formTextarea = ((OdfFileDom) this.ownerDocument).newOdfElement(FormTextareaElement.class);
+		formTextarea.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formTextarea);
+		return formTextarea;
+	}
+
+	/**
+	 * Create child element {@odf.element form:time}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element form:time}
+	 */
+	 public FormTimeElement newFormTimeElement(String xmlIdValue) {
+		FormTimeElement formTime = ((OdfFileDom) this.ownerDocument).newOdfElement(FormTimeElement.class);
+		formTime.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formTime);
+		return formTime;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormComboboxElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormComboboxElement.java
new file mode 100644
index 0000000..5272d53
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormComboboxElement.java
@@ -0,0 +1,682 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormAutoCompleteAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDropdownAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormListSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormListSourceTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSourceCellRangeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:combobox}.
+ *
+ */
+public class FormComboboxElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "combobox");
+
+	/**
+	 * Create the instance of <code>FormComboboxElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormComboboxElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:combobox}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormAutoCompleteAttribute</code> , See {@odf.attribute form:auto-complete}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormAutoCompleteAttribute() {
+		FormAutoCompleteAttribute attr = (FormAutoCompleteAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "auto-complete");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormAutoCompleteAttribute</code> , See {@odf.attribute form:auto-complete}
+	 *
+	 * @param formAutoCompleteValue   The type is <code>Boolean</code>
+	 */
+	public void setFormAutoCompleteAttribute(Boolean formAutoCompleteValue) {
+		FormAutoCompleteAttribute attr = new FormAutoCompleteAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formAutoCompleteValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDropdownAttribute</code> , See {@odf.attribute form:dropdown}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDropdownAttribute() {
+		FormDropdownAttribute attr = (FormDropdownAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "dropdown");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDropdownAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDropdownAttribute</code> , See {@odf.attribute form:dropdown}
+	 *
+	 * @param formDropdownValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDropdownAttribute(Boolean formDropdownValue) {
+		FormDropdownAttribute attr = new FormDropdownAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDropdownValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormListSourceAttribute</code> , See {@odf.attribute form:list-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormListSourceAttribute() {
+		FormListSourceAttribute attr = (FormListSourceAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "list-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormListSourceAttribute</code> , See {@odf.attribute form:list-source}
+	 *
+	 * @param formListSourceValue   The type is <code>String</code>
+	 */
+	public void setFormListSourceAttribute(String formListSourceValue) {
+		FormListSourceAttribute attr = new FormListSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formListSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormListSourceTypeAttribute</code> , See {@odf.attribute form:list-source-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormListSourceTypeAttribute() {
+		FormListSourceTypeAttribute attr = (FormListSourceTypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "list-source-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormListSourceTypeAttribute</code> , See {@odf.attribute form:list-source-type}
+	 *
+	 * @param formListSourceTypeValue   The type is <code>String</code>
+	 */
+	public void setFormListSourceTypeAttribute(String formListSourceTypeValue) {
+		FormListSourceTypeAttribute attr = new FormListSourceTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formListSourceTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSizeAttribute</code> , See {@odf.attribute form:size}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormSizeAttribute() {
+		FormSizeAttribute attr = (FormSizeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "size");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSizeAttribute</code> , See {@odf.attribute form:size}
+	 *
+	 * @param formSizeValue   The type is <code>Integer</code>
+	 */
+	public void setFormSizeAttribute(Integer formSizeValue) {
+		FormSizeAttribute attr = new FormSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formSizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSourceCellRangeAttribute</code> , See {@odf.attribute form:source-cell-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormSourceCellRangeAttribute() {
+		FormSourceCellRangeAttribute attr = (FormSourceCellRangeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "source-cell-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSourceCellRangeAttribute</code> , See {@odf.attribute form:source-cell-range}
+	 *
+	 * @param formSourceCellRangeValue   The type is <code>String</code>
+	 */
+	public void setFormSourceCellRangeAttribute(String formSourceCellRangeValue) {
+		FormSourceCellRangeAttribute attr = new FormSourceCellRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formSourceCellRangeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:item}.
+	 *
+	 * @return the element {@odf.element form:item}
+	 */
+	public FormItemElement newFormItemElement() {
+		FormItemElement formItem = ((OdfFileDom) this.ownerDocument).newOdfElement(FormItemElement.class);
+		this.appendChild(formItem);
+		return formItem;
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormConnectionResourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormConnectionResourceElement.java
new file mode 100644
index 0000000..4e86eeb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormConnectionResourceElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:connection-resource}.
+ *
+ */
+public class FormConnectionResourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "connection-resource");
+
+	/**
+	 * Create the instance of <code>FormConnectionResourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormConnectionResourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:connection-resource}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormDateElement.java
new file mode 100644
index 0000000..2b4a655
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormDateElement.java
@@ -0,0 +1,646 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDelayForRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMinValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSpinButtonAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:date}.
+ *
+ */
+public class FormDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "date");
+
+	/**
+	 * Create the instance of <code>FormDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDelayForRepeatAttribute() {
+		FormDelayForRepeatAttribute attr = (FormDelayForRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "delay-for-repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormDelayForRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @param formDelayForRepeatValue   The type is <code>String</code>
+	 */
+	public void setFormDelayForRepeatAttribute(String formDelayForRepeatValue) {
+		FormDelayForRepeatAttribute attr = new FormDelayForRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDelayForRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMaxValueAttribute() {
+		FormMaxValueAttribute attr = (FormMaxValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @param formMaxValueValue   The type is <code>String</code>
+	 */
+	public void setFormMaxValueAttribute(String formMaxValueValue) {
+		FormMaxValueAttribute attr = new FormMaxValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMaxValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMinValueAttribute() {
+		FormMinValueAttribute attr = (FormMinValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "min-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @param formMinValueValue   The type is <code>String</code>
+	 */
+	public void setFormMinValueAttribute(String formMinValueValue) {
+		FormMinValueAttribute attr = new FormMinValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMinValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormRepeatAttribute() {
+		FormRepeatAttribute attr = (FormRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "repeat");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @param formRepeatValue   The type is <code>Boolean</code>
+	 */
+	public void setFormRepeatAttribute(Boolean formRepeatValue) {
+		FormRepeatAttribute attr = new FormRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formRepeatValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormSpinButtonAttribute() {
+		FormSpinButtonAttribute attr = (FormSpinButtonAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "spin-button");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormSpinButtonAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @param formSpinButtonValue   The type is <code>Boolean</code>
+	 */
+	public void setFormSpinButtonAttribute(Boolean formSpinButtonValue) {
+		FormSpinButtonAttribute attr = new FormSpinButtonAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formSpinButtonValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFileElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFileElement.java
new file mode 100644
index 0000000..d532f69
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFileElement.java
@@ -0,0 +1,471 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:file}.
+ *
+ */
+public class FormFileElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "file");
+
+	/**
+	 * Create the instance of <code>FormFileElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormFileElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:file}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFixedTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFixedTextElement.java
new file mode 100644
index 0000000..b6b0f5a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFixedTextElement.java
@@ -0,0 +1,371 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormForAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMultiLineAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:fixed-text}.
+ *
+ */
+public class FormFixedTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "fixed-text");
+
+	/**
+	 * Create the instance of <code>FormFixedTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormFixedTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:fixed-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormForAttribute</code> , See {@odf.attribute form:for}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormForAttribute() {
+		FormForAttribute attr = (FormForAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "for");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormForAttribute</code> , See {@odf.attribute form:for}
+	 *
+	 * @param formForValue   The type is <code>String</code>
+	 */
+	public void setFormForAttribute(String formForValue) {
+		FormForAttribute attr = new FormForAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formForValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMultiLineAttribute</code> , See {@odf.attribute form:multi-line}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormMultiLineAttribute() {
+		FormMultiLineAttribute attr = (FormMultiLineAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "multi-line");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormMultiLineAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMultiLineAttribute</code> , See {@odf.attribute form:multi-line}
+	 *
+	 * @param formMultiLineValue   The type is <code>Boolean</code>
+	 */
+	public void setFormMultiLineAttribute(Boolean formMultiLineValue) {
+		FormMultiLineAttribute attr = new FormMultiLineAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formMultiLineValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFormElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFormElement.java
new file mode 100644
index 0000000..156e847
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFormElement.java
@@ -0,0 +1,972 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormAllowDeletesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormAllowInsertsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormAllowUpdatesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormApplyFilterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCommandAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCommandTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDatasourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDetailFieldsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormEnctypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormEscapeProcessingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormFilterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIgnoreResultAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMasterFieldsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMethodAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNavigationModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabCycleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:form}.
+ *
+ */
+public class FormFormElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "form");
+
+	/**
+	 * Create the instance of <code>FormFormElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormFormElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:form}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormAllowDeletesAttribute</code> , See {@odf.attribute form:allow-deletes}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormAllowDeletesAttribute() {
+		FormAllowDeletesAttribute attr = (FormAllowDeletesAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "allow-deletes");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormAllowDeletesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormAllowDeletesAttribute</code> , See {@odf.attribute form:allow-deletes}
+	 *
+	 * @param formAllowDeletesValue   The type is <code>Boolean</code>
+	 */
+	public void setFormAllowDeletesAttribute(Boolean formAllowDeletesValue) {
+		FormAllowDeletesAttribute attr = new FormAllowDeletesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formAllowDeletesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormAllowInsertsAttribute</code> , See {@odf.attribute form:allow-inserts}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormAllowInsertsAttribute() {
+		FormAllowInsertsAttribute attr = (FormAllowInsertsAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "allow-inserts");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormAllowInsertsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormAllowInsertsAttribute</code> , See {@odf.attribute form:allow-inserts}
+	 *
+	 * @param formAllowInsertsValue   The type is <code>Boolean</code>
+	 */
+	public void setFormAllowInsertsAttribute(Boolean formAllowInsertsValue) {
+		FormAllowInsertsAttribute attr = new FormAllowInsertsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formAllowInsertsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormAllowUpdatesAttribute</code> , See {@odf.attribute form:allow-updates}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormAllowUpdatesAttribute() {
+		FormAllowUpdatesAttribute attr = (FormAllowUpdatesAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "allow-updates");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormAllowUpdatesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormAllowUpdatesAttribute</code> , See {@odf.attribute form:allow-updates}
+	 *
+	 * @param formAllowUpdatesValue   The type is <code>Boolean</code>
+	 */
+	public void setFormAllowUpdatesAttribute(Boolean formAllowUpdatesValue) {
+		FormAllowUpdatesAttribute attr = new FormAllowUpdatesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formAllowUpdatesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormApplyFilterAttribute</code> , See {@odf.attribute form:apply-filter}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormApplyFilterAttribute() {
+		FormApplyFilterAttribute attr = (FormApplyFilterAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "apply-filter");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormApplyFilterAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormApplyFilterAttribute</code> , See {@odf.attribute form:apply-filter}
+	 *
+	 * @param formApplyFilterValue   The type is <code>Boolean</code>
+	 */
+	public void setFormApplyFilterAttribute(Boolean formApplyFilterValue) {
+		FormApplyFilterAttribute attr = new FormApplyFilterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formApplyFilterValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCommandAttribute</code> , See {@odf.attribute form:command}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCommandAttribute() {
+		FormCommandAttribute attr = (FormCommandAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "command");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCommandAttribute</code> , See {@odf.attribute form:command}
+	 *
+	 * @param formCommandValue   The type is <code>String</code>
+	 */
+	public void setFormCommandAttribute(String formCommandValue) {
+		FormCommandAttribute attr = new FormCommandAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCommandValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCommandTypeAttribute</code> , See {@odf.attribute form:command-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCommandTypeAttribute() {
+		FormCommandTypeAttribute attr = (FormCommandTypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "command-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormCommandTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCommandTypeAttribute</code> , See {@odf.attribute form:command-type}
+	 *
+	 * @param formCommandTypeValue   The type is <code>String</code>
+	 */
+	public void setFormCommandTypeAttribute(String formCommandTypeValue) {
+		FormCommandTypeAttribute attr = new FormCommandTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCommandTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDatasourceAttribute</code> , See {@odf.attribute form:datasource}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDatasourceAttribute() {
+		FormDatasourceAttribute attr = (FormDatasourceAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "datasource");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDatasourceAttribute</code> , See {@odf.attribute form:datasource}
+	 *
+	 * @param formDatasourceValue   The type is <code>String</code>
+	 */
+	public void setFormDatasourceAttribute(String formDatasourceValue) {
+		FormDatasourceAttribute attr = new FormDatasourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDatasourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDetailFieldsAttribute</code> , See {@odf.attribute form:detail-fields}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDetailFieldsAttribute() {
+		FormDetailFieldsAttribute attr = (FormDetailFieldsAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "detail-fields");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDetailFieldsAttribute</code> , See {@odf.attribute form:detail-fields}
+	 *
+	 * @param formDetailFieldsValue   The type is <code>String</code>
+	 */
+	public void setFormDetailFieldsAttribute(String formDetailFieldsValue) {
+		FormDetailFieldsAttribute attr = new FormDetailFieldsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDetailFieldsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormEnctypeAttribute</code> , See {@odf.attribute form:enctype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormEnctypeAttribute() {
+		FormEnctypeAttribute attr = (FormEnctypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "enctype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormEnctypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormEnctypeAttribute</code> , See {@odf.attribute form:enctype}
+	 *
+	 * @param formEnctypeValue   The type is <code>String</code>
+	 */
+	public void setFormEnctypeAttribute(String formEnctypeValue) {
+		FormEnctypeAttribute attr = new FormEnctypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formEnctypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormEscapeProcessingAttribute</code> , See {@odf.attribute form:escape-processing}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormEscapeProcessingAttribute() {
+		FormEscapeProcessingAttribute attr = (FormEscapeProcessingAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "escape-processing");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormEscapeProcessingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormEscapeProcessingAttribute</code> , See {@odf.attribute form:escape-processing}
+	 *
+	 * @param formEscapeProcessingValue   The type is <code>Boolean</code>
+	 */
+	public void setFormEscapeProcessingAttribute(Boolean formEscapeProcessingValue) {
+		FormEscapeProcessingAttribute attr = new FormEscapeProcessingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formEscapeProcessingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormFilterAttribute</code> , See {@odf.attribute form:filter}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormFilterAttribute() {
+		FormFilterAttribute attr = (FormFilterAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "filter");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormFilterAttribute</code> , See {@odf.attribute form:filter}
+	 *
+	 * @param formFilterValue   The type is <code>String</code>
+	 */
+	public void setFormFilterAttribute(String formFilterValue) {
+		FormFilterAttribute attr = new FormFilterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formFilterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIgnoreResultAttribute</code> , See {@odf.attribute form:ignore-result}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormIgnoreResultAttribute() {
+		FormIgnoreResultAttribute attr = (FormIgnoreResultAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "ignore-result");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormIgnoreResultAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIgnoreResultAttribute</code> , See {@odf.attribute form:ignore-result}
+	 *
+	 * @param formIgnoreResultValue   The type is <code>Boolean</code>
+	 */
+	public void setFormIgnoreResultAttribute(Boolean formIgnoreResultValue) {
+		FormIgnoreResultAttribute attr = new FormIgnoreResultAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formIgnoreResultValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMasterFieldsAttribute</code> , See {@odf.attribute form:master-fields}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMasterFieldsAttribute() {
+		FormMasterFieldsAttribute attr = (FormMasterFieldsAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "master-fields");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMasterFieldsAttribute</code> , See {@odf.attribute form:master-fields}
+	 *
+	 * @param formMasterFieldsValue   The type is <code>String</code>
+	 */
+	public void setFormMasterFieldsAttribute(String formMasterFieldsValue) {
+		FormMasterFieldsAttribute attr = new FormMasterFieldsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMasterFieldsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMethodAttribute</code> , See {@odf.attribute form:method}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMethodAttribute() {
+		FormMethodAttribute attr = (FormMethodAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "method");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormMethodAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMethodAttribute</code> , See {@odf.attribute form:method}
+	 *
+	 * @param formMethodValue   The type is <code>String</code>
+	 */
+	public void setFormMethodAttribute(String formMethodValue) {
+		FormMethodAttribute attr = new FormMethodAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMethodValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNavigationModeAttribute</code> , See {@odf.attribute form:navigation-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNavigationModeAttribute() {
+		FormNavigationModeAttribute attr = (FormNavigationModeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "navigation-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNavigationModeAttribute</code> , See {@odf.attribute form:navigation-mode}
+	 *
+	 * @param formNavigationModeValue   The type is <code>String</code>
+	 */
+	public void setFormNavigationModeAttribute(String formNavigationModeValue) {
+		FormNavigationModeAttribute attr = new FormNavigationModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNavigationModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormOrderAttribute</code> , See {@odf.attribute form:order}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormOrderAttribute() {
+		FormOrderAttribute attr = (FormOrderAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "order");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormOrderAttribute</code> , See {@odf.attribute form:order}
+	 *
+	 * @param formOrderValue   The type is <code>String</code>
+	 */
+	public void setFormOrderAttribute(String formOrderValue) {
+		FormOrderAttribute attr = new FormOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formOrderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabCycleAttribute</code> , See {@odf.attribute form:tab-cycle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTabCycleAttribute() {
+		FormTabCycleAttribute attr = (FormTabCycleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-cycle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabCycleAttribute</code> , See {@odf.attribute form:tab-cycle}
+	 *
+	 * @param formTabCycleValue   The type is <code>String</code>
+	 */
+	public void setFormTabCycleAttribute(String formTabCycleValue) {
+		FormTabCycleAttribute attr = new FormTabCycleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTabCycleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameAttribute</code> , See {@odf.attribute office:target-frame}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameAttribute() {
+		OfficeTargetFrameAttribute attr = (OfficeTargetFrameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return OfficeTargetFrameAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameAttribute</code> , See {@odf.attribute office:target-frame}
+	 *
+	 * @param officeTargetFrameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameAttribute(String officeTargetFrameValue) {
+		OfficeTargetFrameAttribute attr = new OfficeTargetFrameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:button}.
+	 *
+	 * @param formImagePositionValue  the <code>String</code> value of <code>FormImagePositionAttribute</code>, see {@odf.attribute  form:image-position} at specification
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:button}
+	 */
+	 public FormButtonElement newFormButtonElement(String formImagePositionValue, String xmlIdValue) {
+		FormButtonElement formButton = ((OdfFileDom) this.ownerDocument).newOdfElement(FormButtonElement.class);
+		formButton.setFormImagePositionAttribute(formImagePositionValue);
+		formButton.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formButton);
+		return formButton;
+	}
+
+	/**
+	 * Create child element {@odf.element form:checkbox}.
+	 *
+	 * @param formImagePositionValue  the <code>String</code> value of <code>FormImagePositionAttribute</code>, see {@odf.attribute  form:image-position} at specification
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:checkbox}
+	 */
+	 public FormCheckboxElement newFormCheckboxElement(String formImagePositionValue, String xmlIdValue) {
+		FormCheckboxElement formCheckbox = ((OdfFileDom) this.ownerDocument).newOdfElement(FormCheckboxElement.class);
+		formCheckbox.setFormImagePositionAttribute(formImagePositionValue);
+		formCheckbox.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formCheckbox);
+		return formCheckbox;
+	}
+
+	/**
+	 * Create child element {@odf.element form:combobox}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:combobox}
+	 */
+	 public FormComboboxElement newFormComboboxElement(String xmlIdValue) {
+		FormComboboxElement formCombobox = ((OdfFileDom) this.ownerDocument).newOdfElement(FormComboboxElement.class);
+		formCombobox.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formCombobox);
+		return formCombobox;
+	}
+
+	/**
+	 * Create child element {@odf.element form:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @return the element {@odf.element form:connection-resource}
+	 */
+	 public FormConnectionResourceElement newFormConnectionResourceElement(String xlinkHrefValue) {
+		FormConnectionResourceElement formConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(FormConnectionResourceElement.class);
+		formConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(formConnectionResource);
+		return formConnectionResource;
+	}
+
+	/**
+	 * Create child element {@odf.element form:date}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:date}
+	 */
+	 public FormDateElement newFormDateElement(String xmlIdValue) {
+		FormDateElement formDate = ((OdfFileDom) this.ownerDocument).newOdfElement(FormDateElement.class);
+		formDate.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formDate);
+		return formDate;
+	}
+
+	/**
+	 * Create child element {@odf.element form:file}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:file}
+	 */
+	 public FormFileElement newFormFileElement(String xmlIdValue) {
+		FormFileElement formFile = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFileElement.class);
+		formFile.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formFile);
+		return formFile;
+	}
+
+	/**
+	 * Create child element {@odf.element form:fixed-text}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:fixed-text}
+	 */
+	 public FormFixedTextElement newFormFixedTextElement(String xmlIdValue) {
+		FormFixedTextElement formFixedText = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFixedTextElement.class);
+		formFixedText.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formFixedText);
+		return formFixedText;
+	}
+
+	/**
+	 * Create child element {@odf.element form:form}.
+	 *
+	 * @return the element {@odf.element form:form}
+	 */
+	public FormFormElement newFormFormElement() {
+		FormFormElement formForm = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFormElement.class);
+		this.appendChild(formForm);
+		return formForm;
+	}
+
+	/**
+	 * Create child element {@odf.element form:formatted-text}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:formatted-text}
+	 */
+	 public FormFormattedTextElement newFormFormattedTextElement(String xmlIdValue) {
+		FormFormattedTextElement formFormattedText = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFormattedTextElement.class);
+		formFormattedText.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formFormattedText);
+		return formFormattedText;
+	}
+
+	/**
+	 * Create child element {@odf.element form:frame}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:frame}
+	 */
+	 public FormFrameElement newFormFrameElement(String xmlIdValue) {
+		FormFrameElement formFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFrameElement.class);
+		formFrame.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formFrame);
+		return formFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element form:generic-control}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:generic-control}
+	 */
+	 public FormGenericControlElement newFormGenericControlElement(String xmlIdValue) {
+		FormGenericControlElement formGenericControl = ((OdfFileDom) this.ownerDocument).newOdfElement(FormGenericControlElement.class);
+		formGenericControl.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formGenericControl);
+		return formGenericControl;
+	}
+
+	/**
+	 * Create child element {@odf.element form:grid}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:grid}
+	 */
+	 public FormGridElement newFormGridElement(String xmlIdValue) {
+		FormGridElement formGrid = ((OdfFileDom) this.ownerDocument).newOdfElement(FormGridElement.class);
+		formGrid.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formGrid);
+		return formGrid;
+	}
+
+	/**
+	 * Create child element {@odf.element form:hidden}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:hidden}
+	 */
+	 public FormHiddenElement newFormHiddenElement(String xmlIdValue) {
+		FormHiddenElement formHidden = ((OdfFileDom) this.ownerDocument).newOdfElement(FormHiddenElement.class);
+		formHidden.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formHidden);
+		return formHidden;
+	}
+
+	/**
+	 * Create child element {@odf.element form:image}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:image}
+	 */
+	 public FormImageElement newFormImageElement(String xmlIdValue) {
+		FormImageElement formImage = ((OdfFileDom) this.ownerDocument).newOdfElement(FormImageElement.class);
+		formImage.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formImage);
+		return formImage;
+	}
+
+	/**
+	 * Create child element {@odf.element form:image-frame}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:image-frame}
+	 */
+	 public FormImageFrameElement newFormImageFrameElement(String xmlIdValue) {
+		FormImageFrameElement formImageFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(FormImageFrameElement.class);
+		formImageFrame.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formImageFrame);
+		return formImageFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element form:listbox}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:listbox}
+	 */
+	 public FormListboxElement newFormListboxElement(String xmlIdValue) {
+		FormListboxElement formListbox = ((OdfFileDom) this.ownerDocument).newOdfElement(FormListboxElement.class);
+		formListbox.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formListbox);
+		return formListbox;
+	}
+
+	/**
+	 * Create child element {@odf.element form:number}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:number}
+	 */
+	 public FormNumberElement newFormNumberElement(String xmlIdValue) {
+		FormNumberElement formNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(FormNumberElement.class);
+		formNumber.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formNumber);
+		return formNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element form:password}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:password}
+	 */
+	 public FormPasswordElement newFormPasswordElement(String xmlIdValue) {
+		FormPasswordElement formPassword = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPasswordElement.class);
+		formPassword.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formPassword);
+		return formPassword;
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element form:radio}.
+	 *
+	 * @param formImagePositionValue  the <code>String</code> value of <code>FormImagePositionAttribute</code>, see {@odf.attribute  form:image-position} at specification
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:radio}
+	 */
+	 public FormRadioElement newFormRadioElement(String formImagePositionValue, String xmlIdValue) {
+		FormRadioElement formRadio = ((OdfFileDom) this.ownerDocument).newOdfElement(FormRadioElement.class);
+		formRadio.setFormImagePositionAttribute(formImagePositionValue);
+		formRadio.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formRadio);
+		return formRadio;
+	}
+
+	/**
+	 * Create child element {@odf.element form:text}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:text}
+	 */
+	 public FormTextElement newFormTextElement(String xmlIdValue) {
+		FormTextElement formText = ((OdfFileDom) this.ownerDocument).newOdfElement(FormTextElement.class);
+		formText.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formText);
+		return formText;
+	}
+
+	/**
+	 * Create child element {@odf.element form:textarea}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:textarea}
+	 */
+	 public FormTextareaElement newFormTextareaElement(String xmlIdValue) {
+		FormTextareaElement formTextarea = ((OdfFileDom) this.ownerDocument).newOdfElement(FormTextareaElement.class);
+		formTextarea.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formTextarea);
+		return formTextarea;
+	}
+
+	/**
+	 * Create child element {@odf.element form:time}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:time}
+	 */
+	 public FormTimeElement newFormTimeElement(String xmlIdValue) {
+		FormTimeElement formTime = ((OdfFileDom) this.ownerDocument).newOdfElement(FormTimeElement.class);
+		formTime.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formTime);
+		return formTime;
+	}
+
+	/**
+	 * Create child element {@odf.element form:value-range}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element form:value-range}
+	 */
+	 public FormValueRangeElement newFormValueRangeElement(String xmlIdValue) {
+		FormValueRangeElement formValueRange = ((OdfFileDom) this.ownerDocument).newOdfElement(FormValueRangeElement.class);
+		formValueRange.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(formValueRange);
+		return formValueRange;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFormattedTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFormattedTextElement.java
new file mode 100644
index 0000000..366dfa8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFormattedTextElement.java
@@ -0,0 +1,671 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDelayForRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMinValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSpinButtonAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValidationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:formatted-text}.
+ *
+ */
+public class FormFormattedTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "formatted-text");
+
+	/**
+	 * Create the instance of <code>FormFormattedTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormFormattedTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:formatted-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDelayForRepeatAttribute() {
+		FormDelayForRepeatAttribute attr = (FormDelayForRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "delay-for-repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormDelayForRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @param formDelayForRepeatValue   The type is <code>String</code>
+	 */
+	public void setFormDelayForRepeatAttribute(String formDelayForRepeatValue) {
+		FormDelayForRepeatAttribute attr = new FormDelayForRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDelayForRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMaxValueAttribute() {
+		FormMaxValueAttribute attr = (FormMaxValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @param formMaxValueValue   The type is <code>String</code>
+	 */
+	public void setFormMaxValueAttribute(String formMaxValueValue) {
+		FormMaxValueAttribute attr = new FormMaxValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMaxValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMinValueAttribute() {
+		FormMinValueAttribute attr = (FormMinValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "min-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @param formMinValueValue   The type is <code>String</code>
+	 */
+	public void setFormMinValueAttribute(String formMinValueValue) {
+		FormMinValueAttribute attr = new FormMinValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMinValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormRepeatAttribute() {
+		FormRepeatAttribute attr = (FormRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "repeat");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @param formRepeatValue   The type is <code>Boolean</code>
+	 */
+	public void setFormRepeatAttribute(Boolean formRepeatValue) {
+		FormRepeatAttribute attr = new FormRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formRepeatValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormSpinButtonAttribute() {
+		FormSpinButtonAttribute attr = (FormSpinButtonAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "spin-button");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormSpinButtonAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @param formSpinButtonValue   The type is <code>Boolean</code>
+	 */
+	public void setFormSpinButtonAttribute(Boolean formSpinButtonValue) {
+		FormSpinButtonAttribute attr = new FormSpinButtonAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formSpinButtonValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValidationAttribute</code> , See {@odf.attribute form:validation}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormValidationAttribute() {
+		FormValidationAttribute attr = (FormValidationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "validation");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormValidationAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValidationAttribute</code> , See {@odf.attribute form:validation}
+	 *
+	 * @param formValidationValue   The type is <code>Boolean</code>
+	 */
+	public void setFormValidationAttribute(Boolean formValidationValue) {
+		FormValidationAttribute attr = new FormValidationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formValidationValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFrameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFrameElement.java
new file mode 100644
index 0000000..bb77d79
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormFrameElement.java
@@ -0,0 +1,346 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormForAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:frame}.
+ *
+ */
+public class FormFrameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "frame");
+
+	/**
+	 * Create the instance of <code>FormFrameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormFrameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:frame}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormForAttribute</code> , See {@odf.attribute form:for}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormForAttribute() {
+		FormForAttribute attr = (FormForAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "for");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormForAttribute</code> , See {@odf.attribute form:for}
+	 *
+	 * @param formForValue   The type is <code>String</code>
+	 */
+	public void setFormForAttribute(String formForValue) {
+		FormForAttribute attr = new FormForAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formForValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormGenericControlElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormGenericControlElement.java
new file mode 100644
index 0000000..8667323
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormGenericControlElement.java
@@ -0,0 +1,221 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:generic-control}.
+ *
+ */
+public class FormGenericControlElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "generic-control");
+
+	/**
+	 * Create the instance of <code>FormGenericControlElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormGenericControlElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:generic-control}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormGridElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormGridElement.java
new file mode 100644
index 0000000..67b1eac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormGridElement.java
@@ -0,0 +1,357 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:grid}.
+ *
+ */
+public class FormGridElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "grid");
+
+	/**
+	 * Create the instance of <code>FormGridElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormGridElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:grid}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:column}.
+	 *
+	 * @return the element {@odf.element form:column}
+	 */
+	public FormColumnElement newFormColumnElement() {
+		FormColumnElement formColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(FormColumnElement.class);
+		this.appendChild(formColumn);
+		return formColumn;
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormHiddenElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormHiddenElement.java
new file mode 100644
index 0000000..169687f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormHiddenElement.java
@@ -0,0 +1,246 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:hidden}.
+ *
+ */
+public class FormHiddenElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "hidden");
+
+	/**
+	 * Create the instance of <code>FormHiddenElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormHiddenElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:hidden}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormImageElement.java
new file mode 100644
index 0000000..b1cbaab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormImageElement.java
@@ -0,0 +1,471 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormButtonTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImageDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:image}.
+ *
+ */
+public class FormImageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "image");
+
+	/**
+	 * Create the instance of <code>FormImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormButtonTypeAttribute</code> , See {@odf.attribute form:button-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormButtonTypeAttribute() {
+		FormButtonTypeAttribute attr = (FormButtonTypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "button-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormButtonTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormButtonTypeAttribute</code> , See {@odf.attribute form:button-type}
+	 *
+	 * @param formButtonTypeValue   The type is <code>String</code>
+	 */
+	public void setFormButtonTypeAttribute(String formButtonTypeValue) {
+		FormButtonTypeAttribute attr = new FormButtonTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formButtonTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImageDataAttribute</code> , See {@odf.attribute form:image-data}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImageDataAttribute() {
+		FormImageDataAttribute attr = (FormImageDataAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-data");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImageDataAttribute</code> , See {@odf.attribute form:image-data}
+	 *
+	 * @param formImageDataValue   The type is <code>String</code>
+	 */
+	public void setFormImageDataAttribute(String formImageDataValue) {
+		FormImageDataAttribute attr = new FormImageDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImageDataValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameAttribute</code> , See {@odf.attribute office:target-frame}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameAttribute() {
+		OfficeTargetFrameAttribute attr = (OfficeTargetFrameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return OfficeTargetFrameAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameAttribute</code> , See {@odf.attribute office:target-frame}
+	 *
+	 * @param officeTargetFrameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameAttribute(String officeTargetFrameValue) {
+		OfficeTargetFrameAttribute attr = new OfficeTargetFrameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormImageFrameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormImageFrameElement.java
new file mode 100644
index 0000000..d203db3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormImageFrameElement.java
@@ -0,0 +1,371 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImageDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:image-frame}.
+ *
+ */
+public class FormImageFrameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "image-frame");
+
+	/**
+	 * Create the instance of <code>FormImageFrameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormImageFrameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:image-frame}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImageDataAttribute</code> , See {@odf.attribute form:image-data}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImageDataAttribute() {
+		FormImageDataAttribute attr = (FormImageDataAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-data");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImageDataAttribute</code> , See {@odf.attribute form:image-data}
+	 *
+	 * @param formImageDataValue   The type is <code>String</code>
+	 */
+	public void setFormImageDataAttribute(String formImageDataValue) {
+		FormImageDataAttribute attr = new FormImageDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImageDataValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormItemElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormItemElement.java
new file mode 100644
index 0000000..ee56e66
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormItemElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:item}.
+ *
+ */
+public class FormItemElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "item");
+
+	/**
+	 * Create the instance of <code>FormItemElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormItemElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:item}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListPropertyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListPropertyElement.java
new file mode 100644
index 0000000..d7e658d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListPropertyElement.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPropertyNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:list-property}.
+ *
+ */
+public class FormListPropertyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "list-property");
+
+	/**
+	 * Create the instance of <code>FormListPropertyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormListPropertyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:list-property}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPropertyNameAttribute</code> , See {@odf.attribute form:property-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormPropertyNameAttribute() {
+		FormPropertyNameAttribute attr = (FormPropertyNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "property-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPropertyNameAttribute</code> , See {@odf.attribute form:property-name}
+	 *
+	 * @param formPropertyNameValue   The type is <code>String</code>
+	 */
+	public void setFormPropertyNameAttribute(String formPropertyNameValue) {
+		FormPropertyNameAttribute attr = new FormPropertyNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formPropertyNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:list-value}.
+	 *
+	 * @param officeBooleanValueValue  the <code>Boolean</code> value of <code>OfficeBooleanValueAttribute</code>, see {@odf.attribute  office:boolean-value} at specification
+	 * @param officeDateValueValue  the <code>String</code> value of <code>OfficeDateValueAttribute</code>, see {@odf.attribute  office:date-value} at specification
+	 * @param officeStringValueValue  the <code>String</code> value of <code>OfficeStringValueAttribute</code>, see {@odf.attribute  office:string-value} at specification
+	 * @param officeTimeValueValue  the <code>String</code> value of <code>OfficeTimeValueAttribute</code>, see {@odf.attribute  office:time-value} at specification
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @return the element {@odf.element form:list-value}
+	 */
+	 public FormListValueElement newFormListValueElement(boolean officeBooleanValueValue, String officeDateValueValue, String officeStringValueValue, String officeTimeValueValue, double officeValueValue) {
+		FormListValueElement formListValue = ((OdfFileDom) this.ownerDocument).newOdfElement(FormListValueElement.class);
+		formListValue.setOfficeBooleanValueAttribute(officeBooleanValueValue);
+		formListValue.setOfficeDateValueAttribute(officeDateValueValue);
+		formListValue.setOfficeStringValueAttribute(officeStringValueValue);
+		formListValue.setOfficeTimeValueAttribute(officeTimeValueValue);
+		formListValue.setOfficeValueAttribute(officeValueValue);
+		this.appendChild(formListValue);
+		return formListValue;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListValueElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListValueElement.java
new file mode 100644
index 0000000..20a9031
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListValueElement.java
@@ -0,0 +1,231 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:list-value}.
+ *
+ */
+public class FormListValueElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "list-value");
+
+	/**
+	 * Create the instance of <code>FormListValueElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormListValueElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:list-value}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListboxElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListboxElement.java
new file mode 100644
index 0000000..e1452c2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormListboxElement.java
@@ -0,0 +1,632 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormBoundColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDropdownAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormListLinkageTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormListSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormListSourceTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMultipleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSourceCellRangeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormXformsListSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:listbox}.
+ *
+ */
+public class FormListboxElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "listbox");
+
+	/**
+	 * Create the instance of <code>FormListboxElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormListboxElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:listbox}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormBoundColumnAttribute</code> , See {@odf.attribute form:bound-column}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormBoundColumnAttribute() {
+		FormBoundColumnAttribute attr = (FormBoundColumnAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "bound-column");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormBoundColumnAttribute</code> , See {@odf.attribute form:bound-column}
+	 *
+	 * @param formBoundColumnValue   The type is <code>String</code>
+	 */
+	public void setFormBoundColumnAttribute(String formBoundColumnValue) {
+		FormBoundColumnAttribute attr = new FormBoundColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formBoundColumnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDropdownAttribute</code> , See {@odf.attribute form:dropdown}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDropdownAttribute() {
+		FormDropdownAttribute attr = (FormDropdownAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "dropdown");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDropdownAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDropdownAttribute</code> , See {@odf.attribute form:dropdown}
+	 *
+	 * @param formDropdownValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDropdownAttribute(Boolean formDropdownValue) {
+		FormDropdownAttribute attr = new FormDropdownAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDropdownValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormListLinkageTypeAttribute</code> , See {@odf.attribute form:list-linkage-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormListLinkageTypeAttribute() {
+		FormListLinkageTypeAttribute attr = (FormListLinkageTypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "list-linkage-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormListLinkageTypeAttribute</code> , See {@odf.attribute form:list-linkage-type}
+	 *
+	 * @param formListLinkageTypeValue   The type is <code>String</code>
+	 */
+	public void setFormListLinkageTypeAttribute(String formListLinkageTypeValue) {
+		FormListLinkageTypeAttribute attr = new FormListLinkageTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formListLinkageTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormListSourceAttribute</code> , See {@odf.attribute form:list-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormListSourceAttribute() {
+		FormListSourceAttribute attr = (FormListSourceAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "list-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormListSourceAttribute</code> , See {@odf.attribute form:list-source}
+	 *
+	 * @param formListSourceValue   The type is <code>String</code>
+	 */
+	public void setFormListSourceAttribute(String formListSourceValue) {
+		FormListSourceAttribute attr = new FormListSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formListSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormListSourceTypeAttribute</code> , See {@odf.attribute form:list-source-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormListSourceTypeAttribute() {
+		FormListSourceTypeAttribute attr = (FormListSourceTypeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "list-source-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormListSourceTypeAttribute</code> , See {@odf.attribute form:list-source-type}
+	 *
+	 * @param formListSourceTypeValue   The type is <code>String</code>
+	 */
+	public void setFormListSourceTypeAttribute(String formListSourceTypeValue) {
+		FormListSourceTypeAttribute attr = new FormListSourceTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formListSourceTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMultipleAttribute</code> , See {@odf.attribute form:multiple}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormMultipleAttribute() {
+		FormMultipleAttribute attr = (FormMultipleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "multiple");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormMultipleAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMultipleAttribute</code> , See {@odf.attribute form:multiple}
+	 *
+	 * @param formMultipleValue   The type is <code>Boolean</code>
+	 */
+	public void setFormMultipleAttribute(Boolean formMultipleValue) {
+		FormMultipleAttribute attr = new FormMultipleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formMultipleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSizeAttribute</code> , See {@odf.attribute form:size}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormSizeAttribute() {
+		FormSizeAttribute attr = (FormSizeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "size");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSizeAttribute</code> , See {@odf.attribute form:size}
+	 *
+	 * @param formSizeValue   The type is <code>Integer</code>
+	 */
+	public void setFormSizeAttribute(Integer formSizeValue) {
+		FormSizeAttribute attr = new FormSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formSizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSourceCellRangeAttribute</code> , See {@odf.attribute form:source-cell-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormSourceCellRangeAttribute() {
+		FormSourceCellRangeAttribute attr = (FormSourceCellRangeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "source-cell-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSourceCellRangeAttribute</code> , See {@odf.attribute form:source-cell-range}
+	 *
+	 * @param formSourceCellRangeValue   The type is <code>String</code>
+	 */
+	public void setFormSourceCellRangeAttribute(String formSourceCellRangeValue) {
+		FormSourceCellRangeAttribute attr = new FormSourceCellRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formSourceCellRangeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormXformsListSourceAttribute</code> , See {@odf.attribute form:xforms-list-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormXformsListSourceAttribute() {
+		FormXformsListSourceAttribute attr = (FormXformsListSourceAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "xforms-list-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormXformsListSourceAttribute</code> , See {@odf.attribute form:xforms-list-source}
+	 *
+	 * @param formXformsListSourceValue   The type is <code>String</code>
+	 */
+	public void setFormXformsListSourceAttribute(String formXformsListSourceValue) {
+		FormXformsListSourceAttribute attr = new FormXformsListSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formXformsListSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:option}.
+	 *
+	 * @return the element {@odf.element form:option}
+	 */
+	public FormOptionElement newFormOptionElement() {
+		FormOptionElement formOption = ((OdfFileDom) this.ownerDocument).newOdfElement(FormOptionElement.class);
+		this.appendChild(formOption);
+		return formOption;
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormNumberElement.java
new file mode 100644
index 0000000..87b075b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormNumberElement.java
@@ -0,0 +1,646 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDelayForRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMinValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSpinButtonAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:number}.
+ *
+ */
+public class FormNumberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "number");
+
+	/**
+	 * Create the instance of <code>FormNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDelayForRepeatAttribute() {
+		FormDelayForRepeatAttribute attr = (FormDelayForRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "delay-for-repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormDelayForRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @param formDelayForRepeatValue   The type is <code>String</code>
+	 */
+	public void setFormDelayForRepeatAttribute(String formDelayForRepeatValue) {
+		FormDelayForRepeatAttribute attr = new FormDelayForRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDelayForRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMaxValueAttribute() {
+		FormMaxValueAttribute attr = (FormMaxValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @param formMaxValueValue   The type is <code>String</code>
+	 */
+	public void setFormMaxValueAttribute(String formMaxValueValue) {
+		FormMaxValueAttribute attr = new FormMaxValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMaxValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMinValueAttribute() {
+		FormMinValueAttribute attr = (FormMinValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "min-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @param formMinValueValue   The type is <code>String</code>
+	 */
+	public void setFormMinValueAttribute(String formMinValueValue) {
+		FormMinValueAttribute attr = new FormMinValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMinValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormRepeatAttribute() {
+		FormRepeatAttribute attr = (FormRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "repeat");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @param formRepeatValue   The type is <code>Boolean</code>
+	 */
+	public void setFormRepeatAttribute(Boolean formRepeatValue) {
+		FormRepeatAttribute attr = new FormRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formRepeatValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormSpinButtonAttribute() {
+		FormSpinButtonAttribute attr = (FormSpinButtonAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "spin-button");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormSpinButtonAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @param formSpinButtonValue   The type is <code>Boolean</code>
+	 */
+	public void setFormSpinButtonAttribute(Boolean formSpinButtonValue) {
+		FormSpinButtonAttribute attr = new FormSpinButtonAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formSpinButtonValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormOptionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormOptionElement.java
new file mode 100644
index 0000000..02c6045
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormOptionElement.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentSelectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSelectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:option}.
+ *
+ */
+public class FormOptionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "option");
+
+	/**
+	 * Create the instance of <code>FormOptionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormOptionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:option}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentSelectedAttribute</code> , See {@odf.attribute form:current-selected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormCurrentSelectedAttribute() {
+		FormCurrentSelectedAttribute attr = (FormCurrentSelectedAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-selected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormCurrentSelectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentSelectedAttribute</code> , See {@odf.attribute form:current-selected}
+	 *
+	 * @param formCurrentSelectedValue   The type is <code>Boolean</code>
+	 */
+	public void setFormCurrentSelectedAttribute(Boolean formCurrentSelectedValue) {
+		FormCurrentSelectedAttribute attr = new FormCurrentSelectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formCurrentSelectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSelectedAttribute</code> , See {@odf.attribute form:selected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormSelectedAttribute() {
+		FormSelectedAttribute attr = (FormSelectedAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "selected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormSelectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSelectedAttribute</code> , See {@odf.attribute form:selected}
+	 *
+	 * @param formSelectedValue   The type is <code>Boolean</code>
+	 */
+	public void setFormSelectedAttribute(Boolean formSelectedValue) {
+		FormSelectedAttribute attr = new FormSelectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formSelectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPasswordElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPasswordElement.java
new file mode 100644
index 0000000..60fc406
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPasswordElement.java
@@ -0,0 +1,471 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormEchoCharAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:password}.
+ *
+ */
+public class FormPasswordElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "password");
+
+	/**
+	 * Create the instance of <code>FormPasswordElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormPasswordElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:password}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormEchoCharAttribute</code> , See {@odf.attribute form:echo-char}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormEchoCharAttribute() {
+		FormEchoCharAttribute attr = (FormEchoCharAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "echo-char");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormEchoCharAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormEchoCharAttribute</code> , See {@odf.attribute form:echo-char}
+	 *
+	 * @param formEchoCharValue   The type is <code>String</code>
+	 */
+	public void setFormEchoCharAttribute(String formEchoCharValue) {
+		FormEchoCharAttribute attr = new FormEchoCharAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formEchoCharValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPropertiesElement.java
new file mode 100644
index 0000000..43f07b6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPropertiesElement.java
@@ -0,0 +1,103 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:properties}.
+ *
+ */
+public class FormPropertiesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "properties");
+
+	/**
+	 * Create the instance of <code>FormPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element form:list-property}.
+	 *
+	 * @param formPropertyNameValue  the <code>String</code> value of <code>FormPropertyNameAttribute</code>, see {@odf.attribute  form:property-name} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element form:list-property}
+	 */
+	 public FormListPropertyElement newFormListPropertyElement(String formPropertyNameValue, String officeValueTypeValue) {
+		FormListPropertyElement formListProperty = ((OdfFileDom) this.ownerDocument).newOdfElement(FormListPropertyElement.class);
+		formListProperty.setFormPropertyNameAttribute(formPropertyNameValue);
+		formListProperty.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(formListProperty);
+		return formListProperty;
+	}
+
+	/**
+	 * Create child element {@odf.element form:property}.
+	 *
+	 * @param formPropertyNameValue  the <code>String</code> value of <code>FormPropertyNameAttribute</code>, see {@odf.attribute  form:property-name} at specification
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element form:property}
+	 */
+	 public FormPropertyElement newFormPropertyElement(String formPropertyNameValue, double officeValueValue, String officeValueTypeValue) {
+		FormPropertyElement formProperty = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertyElement.class);
+		formProperty.setFormPropertyNameAttribute(formPropertyNameValue);
+		formProperty.setOfficeValueAttribute(officeValueValue);
+		formProperty.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(formProperty);
+		return formProperty;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPropertyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPropertyElement.java
new file mode 100644
index 0000000..6657322
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormPropertyElement.java
@@ -0,0 +1,277 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPropertyNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:property}.
+ *
+ */
+public class FormPropertyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "property");
+
+	/**
+	 * Create the instance of <code>FormPropertyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormPropertyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:property}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPropertyNameAttribute</code> , See {@odf.attribute form:property-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormPropertyNameAttribute() {
+		FormPropertyNameAttribute attr = (FormPropertyNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "property-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPropertyNameAttribute</code> , See {@odf.attribute form:property-name}
+	 *
+	 * @param formPropertyNameValue   The type is <code>String</code>
+	 */
+	public void setFormPropertyNameAttribute(String formPropertyNameValue) {
+		FormPropertyNameAttribute attr = new FormPropertyNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formPropertyNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormRadioElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormRadioElement.java
new file mode 100644
index 0000000..0e44e58
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormRadioElement.java
@@ -0,0 +1,573 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentSelectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImageAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormImagePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSelectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormVisualEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:radio}.
+ *
+ */
+public class FormRadioElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "radio");
+
+	/**
+	 * Create the instance of <code>FormRadioElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormRadioElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:radio}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentSelectedAttribute</code> , See {@odf.attribute form:current-selected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormCurrentSelectedAttribute() {
+		FormCurrentSelectedAttribute attr = (FormCurrentSelectedAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-selected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormCurrentSelectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentSelectedAttribute</code> , See {@odf.attribute form:current-selected}
+	 *
+	 * @param formCurrentSelectedValue   The type is <code>Boolean</code>
+	 */
+	public void setFormCurrentSelectedAttribute(Boolean formCurrentSelectedValue) {
+		FormCurrentSelectedAttribute attr = new FormCurrentSelectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formCurrentSelectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImageAlignAttribute</code> , See {@odf.attribute form:image-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImageAlignAttribute() {
+		FormImageAlignAttribute attr = (FormImageAlignAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormImageAlignAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImageAlignAttribute</code> , See {@odf.attribute form:image-align}
+	 *
+	 * @param formImageAlignValue   The type is <code>String</code>
+	 */
+	public void setFormImageAlignAttribute(String formImageAlignValue) {
+		FormImageAlignAttribute attr = new FormImageAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImageAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormImagePositionAttribute</code> , See {@odf.attribute form:image-position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormImagePositionAttribute() {
+		FormImagePositionAttribute attr = (FormImagePositionAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "image-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormImagePositionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormImagePositionAttribute</code> , See {@odf.attribute form:image-position}
+	 *
+	 * @param formImagePositionValue   The type is <code>String</code>
+	 */
+	public void setFormImagePositionAttribute(String formImagePositionValue) {
+		FormImagePositionAttribute attr = new FormImagePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formImagePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLabelAttribute() {
+		FormLabelAttribute attr = (FormLabelAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLabelAttribute</code> , See {@odf.attribute form:label}
+	 *
+	 * @param formLabelValue   The type is <code>String</code>
+	 */
+	public void setFormLabelAttribute(String formLabelValue) {
+		FormLabelAttribute attr = new FormLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLabelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSelectedAttribute</code> , See {@odf.attribute form:selected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormSelectedAttribute() {
+		FormSelectedAttribute attr = (FormSelectedAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "selected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormSelectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSelectedAttribute</code> , See {@odf.attribute form:selected}
+	 *
+	 * @param formSelectedValue   The type is <code>Boolean</code>
+	 */
+	public void setFormSelectedAttribute(Boolean formSelectedValue) {
+		FormSelectedAttribute attr = new FormSelectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formSelectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormVisualEffectAttribute</code> , See {@odf.attribute form:visual-effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormVisualEffectAttribute() {
+		FormVisualEffectAttribute attr = (FormVisualEffectAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "visual-effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormVisualEffectAttribute</code> , See {@odf.attribute form:visual-effect}
+	 *
+	 * @param formVisualEffectValue   The type is <code>String</code>
+	 */
+	public void setFormVisualEffectAttribute(String formVisualEffectValue) {
+		FormVisualEffectAttribute attr = new FormVisualEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formVisualEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTextElement.java
new file mode 100644
index 0000000..e648d8a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTextElement.java
@@ -0,0 +1,521 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:text}.
+ *
+ */
+public class FormTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "text");
+
+	/**
+	 * Create the instance of <code>FormTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTextareaElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTextareaElement.java
new file mode 100644
index 0000000..b752f95
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTextareaElement.java
@@ -0,0 +1,533 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:textarea}.
+ *
+ */
+public class FormTextareaElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "textarea");
+
+	/**
+	 * Create the instance of <code>FormTextareaElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormTextareaElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:textarea}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTimeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTimeElement.java
new file mode 100644
index 0000000..c27f284
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormTimeElement.java
@@ -0,0 +1,646 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormConvertEmptyToNullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDelayForRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMinValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormReadonlyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormSpinButtonAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:time}.
+ *
+ */
+public class FormTimeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "time");
+
+	/**
+	 * Create the instance of <code>FormTimeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormTimeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:time}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormConvertEmptyToNullAttribute() {
+		FormConvertEmptyToNullAttribute attr = (FormConvertEmptyToNullAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "convert-empty-to-null");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormConvertEmptyToNullAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormConvertEmptyToNullAttribute</code> , See {@odf.attribute form:convert-empty-to-null}
+	 *
+	 * @param formConvertEmptyToNullValue   The type is <code>Boolean</code>
+	 */
+	public void setFormConvertEmptyToNullAttribute(Boolean formConvertEmptyToNullValue) {
+		FormConvertEmptyToNullAttribute attr = new FormConvertEmptyToNullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formConvertEmptyToNullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormCurrentValueAttribute() {
+		FormCurrentValueAttribute attr = (FormCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "current-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormCurrentValueAttribute</code> , See {@odf.attribute form:current-value}
+	 *
+	 * @param formCurrentValueValue   The type is <code>String</code>
+	 */
+	public void setFormCurrentValueAttribute(String formCurrentValueValue) {
+		FormCurrentValueAttribute attr = new FormCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formCurrentValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDataFieldAttribute() {
+		FormDataFieldAttribute attr = (FormDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDataFieldAttribute</code> , See {@odf.attribute form:data-field}
+	 *
+	 * @param formDataFieldValue   The type is <code>String</code>
+	 */
+	public void setFormDataFieldAttribute(String formDataFieldValue) {
+		FormDataFieldAttribute attr = new FormDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDelayForRepeatAttribute() {
+		FormDelayForRepeatAttribute attr = (FormDelayForRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "delay-for-repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormDelayForRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @param formDelayForRepeatValue   The type is <code>String</code>
+	 */
+	public void setFormDelayForRepeatAttribute(String formDelayForRepeatValue) {
+		FormDelayForRepeatAttribute attr = new FormDelayForRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDelayForRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormMaxLengthAttribute() {
+		FormMaxLengthAttribute attr = (FormMaxLengthAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxLengthAttribute</code> , See {@odf.attribute form:max-length}
+	 *
+	 * @param formMaxLengthValue   The type is <code>Integer</code>
+	 */
+	public void setFormMaxLengthAttribute(Integer formMaxLengthValue) {
+		FormMaxLengthAttribute attr = new FormMaxLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formMaxLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMaxValueAttribute() {
+		FormMaxValueAttribute attr = (FormMaxValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @param formMaxValueValue   The type is <code>String</code>
+	 */
+	public void setFormMaxValueAttribute(String formMaxValueValue) {
+		FormMaxValueAttribute attr = new FormMaxValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMaxValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMinValueAttribute() {
+		FormMinValueAttribute attr = (FormMinValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "min-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @param formMinValueValue   The type is <code>String</code>
+	 */
+	public void setFormMinValueAttribute(String formMinValueValue) {
+		FormMinValueAttribute attr = new FormMinValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMinValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormReadonlyAttribute() {
+		FormReadonlyAttribute attr = (FormReadonlyAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "readonly");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormReadonlyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormReadonlyAttribute</code> , See {@odf.attribute form:readonly}
+	 *
+	 * @param formReadonlyValue   The type is <code>Boolean</code>
+	 */
+	public void setFormReadonlyAttribute(Boolean formReadonlyValue) {
+		FormReadonlyAttribute attr = new FormReadonlyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formReadonlyValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormRepeatAttribute() {
+		FormRepeatAttribute attr = (FormRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "repeat");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @param formRepeatValue   The type is <code>Boolean</code>
+	 */
+	public void setFormRepeatAttribute(Boolean formRepeatValue) {
+		FormRepeatAttribute attr = new FormRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formRepeatValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormSpinButtonAttribute() {
+		FormSpinButtonAttribute attr = (FormSpinButtonAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "spin-button");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormSpinButtonAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormSpinButtonAttribute</code> , See {@odf.attribute form:spin-button}
+	 *
+	 * @param formSpinButtonValue   The type is <code>Boolean</code>
+	 */
+	public void setFormSpinButtonAttribute(Boolean formSpinButtonValue) {
+		FormSpinButtonAttribute attr = new FormSpinButtonAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formSpinButtonValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormValueRangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormValueRangeElement.java
new file mode 100644
index 0000000..ef62ca0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/form/FormValueRangeElement.java
@@ -0,0 +1,571 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.form;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormControlImplementationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDelayForRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormDisabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormLinkedCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMaxValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormMinValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormOrientationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPageStepSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormPrintableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormStepSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTabStopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xforms.XformsBindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element form:value-range}.
+ *
+ */
+public class FormValueRangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.FORM, "value-range");
+
+	/**
+	 * Create the instance of <code>FormValueRangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public FormValueRangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element form:value-range}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormControlImplementationAttribute() {
+		FormControlImplementationAttribute attr = (FormControlImplementationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "control-implementation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormControlImplementationAttribute</code> , See {@odf.attribute form:control-implementation}
+	 *
+	 * @param formControlImplementationValue   The type is <code>String</code>
+	 */
+	public void setFormControlImplementationAttribute(String formControlImplementationValue) {
+		FormControlImplementationAttribute attr = new FormControlImplementationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formControlImplementationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormDelayForRepeatAttribute() {
+		FormDelayForRepeatAttribute attr = (FormDelayForRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "delay-for-repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FormDelayForRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDelayForRepeatAttribute</code> , See {@odf.attribute form:delay-for-repeat}
+	 *
+	 * @param formDelayForRepeatValue   The type is <code>String</code>
+	 */
+	public void setFormDelayForRepeatAttribute(String formDelayForRepeatValue) {
+		FormDelayForRepeatAttribute attr = new FormDelayForRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formDelayForRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormDisabledAttribute() {
+		FormDisabledAttribute attr = (FormDisabledAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "disabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormDisabledAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormDisabledAttribute</code> , See {@odf.attribute form:disabled}
+	 *
+	 * @param formDisabledValue   The type is <code>Boolean</code>
+	 */
+	public void setFormDisabledAttribute(Boolean formDisabledValue) {
+		FormDisabledAttribute attr = new FormDisabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formDisabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormIdAttribute() {
+		FormIdAttribute attr = (FormIdAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormIdAttribute</code> , See {@odf.attribute form:id}
+	 *
+	 * @param formIdValue   The type is <code>String</code>
+	 */
+	public void setFormIdAttribute(String formIdValue) {
+		FormIdAttribute attr = new FormIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormLinkedCellAttribute() {
+		FormLinkedCellAttribute attr = (FormLinkedCellAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "linked-cell");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormLinkedCellAttribute</code> , See {@odf.attribute form:linked-cell}
+	 *
+	 * @param formLinkedCellValue   The type is <code>String</code>
+	 */
+	public void setFormLinkedCellAttribute(String formLinkedCellValue) {
+		FormLinkedCellAttribute attr = new FormLinkedCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formLinkedCellValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMaxValueAttribute() {
+		FormMaxValueAttribute attr = (FormMaxValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "max-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMaxValueAttribute</code> , See {@odf.attribute form:max-value}
+	 *
+	 * @param formMaxValueValue   The type is <code>String</code>
+	 */
+	public void setFormMaxValueAttribute(String formMaxValueValue) {
+		FormMaxValueAttribute attr = new FormMaxValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMaxValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormMinValueAttribute() {
+		FormMinValueAttribute attr = (FormMinValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "min-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormMinValueAttribute</code> , See {@odf.attribute form:min-value}
+	 *
+	 * @param formMinValueValue   The type is <code>String</code>
+	 */
+	public void setFormMinValueAttribute(String formMinValueValue) {
+		FormMinValueAttribute attr = new FormMinValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formMinValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormNameAttribute() {
+		FormNameAttribute attr = (FormNameAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormNameAttribute</code> , See {@odf.attribute form:name}
+	 *
+	 * @param formNameValue   The type is <code>String</code>
+	 */
+	public void setFormNameAttribute(String formNameValue) {
+		FormNameAttribute attr = new FormNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormOrientationAttribute</code> , See {@odf.attribute form:orientation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormOrientationAttribute() {
+		FormOrientationAttribute attr = (FormOrientationAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "orientation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormOrientationAttribute</code> , See {@odf.attribute form:orientation}
+	 *
+	 * @param formOrientationValue   The type is <code>String</code>
+	 */
+	public void setFormOrientationAttribute(String formOrientationValue) {
+		FormOrientationAttribute attr = new FormOrientationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formOrientationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPageStepSizeAttribute</code> , See {@odf.attribute form:page-step-size}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormPageStepSizeAttribute() {
+		FormPageStepSizeAttribute attr = (FormPageStepSizeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "page-step-size");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPageStepSizeAttribute</code> , See {@odf.attribute form:page-step-size}
+	 *
+	 * @param formPageStepSizeValue   The type is <code>Integer</code>
+	 */
+	public void setFormPageStepSizeAttribute(Integer formPageStepSizeValue) {
+		FormPageStepSizeAttribute attr = new FormPageStepSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formPageStepSizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormPrintableAttribute() {
+		FormPrintableAttribute attr = (FormPrintableAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "printable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormPrintableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormPrintableAttribute</code> , See {@odf.attribute form:printable}
+	 *
+	 * @param formPrintableValue   The type is <code>Boolean</code>
+	 */
+	public void setFormPrintableAttribute(Boolean formPrintableValue) {
+		FormPrintableAttribute attr = new FormPrintableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formPrintableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormRepeatAttribute() {
+		FormRepeatAttribute attr = (FormRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "repeat");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormRepeatAttribute</code> , See {@odf.attribute form:repeat}
+	 *
+	 * @param formRepeatValue   The type is <code>Boolean</code>
+	 */
+	public void setFormRepeatAttribute(Boolean formRepeatValue) {
+		FormRepeatAttribute attr = new FormRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formRepeatValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormStepSizeAttribute</code> , See {@odf.attribute form:step-size}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormStepSizeAttribute() {
+		FormStepSizeAttribute attr = (FormStepSizeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "step-size");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormStepSizeAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormStepSizeAttribute</code> , See {@odf.attribute form:step-size}
+	 *
+	 * @param formStepSizeValue   The type is <code>Integer</code>
+	 */
+	public void setFormStepSizeAttribute(Integer formStepSizeValue) {
+		FormStepSizeAttribute attr = new FormStepSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formStepSizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFormTabIndexAttribute() {
+		FormTabIndexAttribute attr = (FormTabIndexAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(FormTabIndexAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabIndexAttribute</code> , See {@odf.attribute form:tab-index}
+	 *
+	 * @param formTabIndexValue   The type is <code>Integer</code>
+	 */
+	public void setFormTabIndexAttribute(Integer formTabIndexValue) {
+		FormTabIndexAttribute attr = new FormTabIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(formTabIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormTabStopAttribute() {
+		FormTabStopAttribute attr = (FormTabStopAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "tab-stop");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormTabStopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTabStopAttribute</code> , See {@odf.attribute form:tab-stop}
+	 *
+	 * @param formTabStopValue   The type is <code>Boolean</code>
+	 */
+	public void setFormTabStopAttribute(Boolean formTabStopValue) {
+		FormTabStopAttribute attr = new FormTabStopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formTabStopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormTitleAttribute() {
+		FormTitleAttribute attr = (FormTitleAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormTitleAttribute</code> , See {@odf.attribute form:title}
+	 *
+	 * @param formTitleValue   The type is <code>String</code>
+	 */
+	public void setFormTitleAttribute(String formTitleValue) {
+		FormTitleAttribute attr = new FormTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFormValueAttribute() {
+		FormValueAttribute attr = (FormValueAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormValueAttribute</code> , See {@odf.attribute form:value}
+	 *
+	 * @param formValueValue   The type is <code>String</code>
+	 */
+	public void setFormValueAttribute(String formValueValue) {
+		FormValueAttribute attr = new FormValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(formValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXformsBindAttribute() {
+		XformsBindAttribute attr = (XformsBindAttribute) getOdfAttribute(OdfDocumentNamespace.XFORMS, "bind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XformsBindAttribute</code> , See {@odf.attribute xforms:bind}
+	 *
+	 * @param xformsBindValue   The type is <code>String</code>
+	 */
+	public void setXformsBindAttribute(String xformsBindValue) {
+		XformsBindAttribute attr = new XformsBindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xformsBindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:properties}.
+	 *
+	 * @return the element {@odf.element form:properties}
+	 */
+	public FormPropertiesElement newFormPropertiesElement() {
+		FormPropertiesElement formProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(FormPropertiesElement.class);
+		this.appendChild(formProperties);
+		return formProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/math/MathMathElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/math/MathMathElement.java
new file mode 100644
index 0000000..b0db54b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/math/MathMathElement.java
@@ -0,0 +1,81 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.math;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element math:math}.
+ *
+ * This class can have any org.w3c.dom.Element child element.
+ * This class can have any org.w3c.dom.Attribute attribute.
+ */
+public class MathMathElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.MATH, "math");
+
+	/**
+	 * Create the instance of <code>MathMathElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MathMathElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element math:math}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaAutoReloadElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaAutoReloadElement.java
new file mode 100644
index 0000000..ad690b7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaAutoReloadElement.java
@@ -0,0 +1,196 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:auto-reload}.
+ *
+ */
+public class MetaAutoReloadElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "auto-reload");
+
+	/**
+	 * Create the instance of <code>MetaAutoReloadElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaAutoReloadElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:auto-reload}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaDelayAttribute</code> , See {@odf.attribute meta:delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getMetaDelayAttribute() {
+		MetaDelayAttribute attr = (MetaDelayAttribute) getOdfAttribute(OdfDocumentNamespace.META, "delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaDelayAttribute</code> , See {@odf.attribute meta:delay}
+	 *
+	 * @param metaDelayValue   The type is <code>String</code>
+	 */
+	public void setMetaDelayAttribute(String metaDelayValue) {
+		MetaDelayAttribute attr = new MetaDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(metaDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_REPLACE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaCreationDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaCreationDateElement.java
new file mode 100644
index 0000000..fc2c328
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaCreationDateElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:creation-date}.
+ *
+ */
+public class MetaCreationDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "creation-date");
+
+	/**
+	 * Create the instance of <code>MetaCreationDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaCreationDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:creation-date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaDateStringElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaDateStringElement.java
new file mode 100644
index 0000000..358b9ba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaDateStringElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:date-string}.
+ *
+ */
+public class MetaDateStringElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "date-string");
+
+	/**
+	 * Create the instance of <code>MetaDateStringElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaDateStringElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:date-string}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaDocumentStatisticElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaDocumentStatisticElement.java
new file mode 100644
index 0000000..a3b8d3d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaDocumentStatisticElement.java
@@ -0,0 +1,446 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaCellCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaCharacterCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaDrawCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaFrameCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaImageCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaNonWhitespaceCharacterCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaObjectCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaOleObjectCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaPageCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaParagraphCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaRowCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaSentenceCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaSyllableCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaTableCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaWordCountAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:document-statistic}.
+ *
+ */
+public class MetaDocumentStatisticElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "document-statistic");
+
+	/**
+	 * Create the instance of <code>MetaDocumentStatisticElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaDocumentStatisticElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:document-statistic}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaCellCountAttribute</code> , See {@odf.attribute meta:cell-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaCellCountAttribute() {
+		MetaCellCountAttribute attr = (MetaCellCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "cell-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaCellCountAttribute</code> , See {@odf.attribute meta:cell-count}
+	 *
+	 * @param metaCellCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaCellCountAttribute(Integer metaCellCountValue) {
+		MetaCellCountAttribute attr = new MetaCellCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaCellCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaCharacterCountAttribute</code> , See {@odf.attribute meta:character-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaCharacterCountAttribute() {
+		MetaCharacterCountAttribute attr = (MetaCharacterCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "character-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaCharacterCountAttribute</code> , See {@odf.attribute meta:character-count}
+	 *
+	 * @param metaCharacterCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaCharacterCountAttribute(Integer metaCharacterCountValue) {
+		MetaCharacterCountAttribute attr = new MetaCharacterCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaCharacterCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaDrawCountAttribute</code> , See {@odf.attribute meta:draw-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaDrawCountAttribute() {
+		MetaDrawCountAttribute attr = (MetaDrawCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "draw-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaDrawCountAttribute</code> , See {@odf.attribute meta:draw-count}
+	 *
+	 * @param metaDrawCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaDrawCountAttribute(Integer metaDrawCountValue) {
+		MetaDrawCountAttribute attr = new MetaDrawCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaDrawCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaFrameCountAttribute</code> , See {@odf.attribute meta:frame-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaFrameCountAttribute() {
+		MetaFrameCountAttribute attr = (MetaFrameCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "frame-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaFrameCountAttribute</code> , See {@odf.attribute meta:frame-count}
+	 *
+	 * @param metaFrameCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaFrameCountAttribute(Integer metaFrameCountValue) {
+		MetaFrameCountAttribute attr = new MetaFrameCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaFrameCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaImageCountAttribute</code> , See {@odf.attribute meta:image-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaImageCountAttribute() {
+		MetaImageCountAttribute attr = (MetaImageCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "image-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaImageCountAttribute</code> , See {@odf.attribute meta:image-count}
+	 *
+	 * @param metaImageCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaImageCountAttribute(Integer metaImageCountValue) {
+		MetaImageCountAttribute attr = new MetaImageCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaImageCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaNonWhitespaceCharacterCountAttribute</code> , See {@odf.attribute meta:non-whitespace-character-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaNonWhitespaceCharacterCountAttribute() {
+		MetaNonWhitespaceCharacterCountAttribute attr = (MetaNonWhitespaceCharacterCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "non-whitespace-character-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaNonWhitespaceCharacterCountAttribute</code> , See {@odf.attribute meta:non-whitespace-character-count}
+	 *
+	 * @param metaNonWhitespaceCharacterCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaNonWhitespaceCharacterCountAttribute(Integer metaNonWhitespaceCharacterCountValue) {
+		MetaNonWhitespaceCharacterCountAttribute attr = new MetaNonWhitespaceCharacterCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaNonWhitespaceCharacterCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaObjectCountAttribute</code> , See {@odf.attribute meta:object-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaObjectCountAttribute() {
+		MetaObjectCountAttribute attr = (MetaObjectCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "object-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaObjectCountAttribute</code> , See {@odf.attribute meta:object-count}
+	 *
+	 * @param metaObjectCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaObjectCountAttribute(Integer metaObjectCountValue) {
+		MetaObjectCountAttribute attr = new MetaObjectCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaObjectCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaOleObjectCountAttribute</code> , See {@odf.attribute meta:ole-object-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaOleObjectCountAttribute() {
+		MetaOleObjectCountAttribute attr = (MetaOleObjectCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "ole-object-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaOleObjectCountAttribute</code> , See {@odf.attribute meta:ole-object-count}
+	 *
+	 * @param metaOleObjectCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaOleObjectCountAttribute(Integer metaOleObjectCountValue) {
+		MetaOleObjectCountAttribute attr = new MetaOleObjectCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaOleObjectCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaPageCountAttribute</code> , See {@odf.attribute meta:page-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaPageCountAttribute() {
+		MetaPageCountAttribute attr = (MetaPageCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "page-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaPageCountAttribute</code> , See {@odf.attribute meta:page-count}
+	 *
+	 * @param metaPageCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaPageCountAttribute(Integer metaPageCountValue) {
+		MetaPageCountAttribute attr = new MetaPageCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaPageCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaParagraphCountAttribute</code> , See {@odf.attribute meta:paragraph-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaParagraphCountAttribute() {
+		MetaParagraphCountAttribute attr = (MetaParagraphCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "paragraph-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaParagraphCountAttribute</code> , See {@odf.attribute meta:paragraph-count}
+	 *
+	 * @param metaParagraphCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaParagraphCountAttribute(Integer metaParagraphCountValue) {
+		MetaParagraphCountAttribute attr = new MetaParagraphCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaParagraphCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaRowCountAttribute</code> , See {@odf.attribute meta:row-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaRowCountAttribute() {
+		MetaRowCountAttribute attr = (MetaRowCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "row-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaRowCountAttribute</code> , See {@odf.attribute meta:row-count}
+	 *
+	 * @param metaRowCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaRowCountAttribute(Integer metaRowCountValue) {
+		MetaRowCountAttribute attr = new MetaRowCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaRowCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaSentenceCountAttribute</code> , See {@odf.attribute meta:sentence-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaSentenceCountAttribute() {
+		MetaSentenceCountAttribute attr = (MetaSentenceCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "sentence-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaSentenceCountAttribute</code> , See {@odf.attribute meta:sentence-count}
+	 *
+	 * @param metaSentenceCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaSentenceCountAttribute(Integer metaSentenceCountValue) {
+		MetaSentenceCountAttribute attr = new MetaSentenceCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaSentenceCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaSyllableCountAttribute</code> , See {@odf.attribute meta:syllable-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaSyllableCountAttribute() {
+		MetaSyllableCountAttribute attr = (MetaSyllableCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "syllable-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaSyllableCountAttribute</code> , See {@odf.attribute meta:syllable-count}
+	 *
+	 * @param metaSyllableCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaSyllableCountAttribute(Integer metaSyllableCountValue) {
+		MetaSyllableCountAttribute attr = new MetaSyllableCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaSyllableCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaTableCountAttribute</code> , See {@odf.attribute meta:table-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaTableCountAttribute() {
+		MetaTableCountAttribute attr = (MetaTableCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "table-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaTableCountAttribute</code> , See {@odf.attribute meta:table-count}
+	 *
+	 * @param metaTableCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaTableCountAttribute(Integer metaTableCountValue) {
+		MetaTableCountAttribute attr = new MetaTableCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaTableCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaWordCountAttribute</code> , See {@odf.attribute meta:word-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getMetaWordCountAttribute() {
+		MetaWordCountAttribute attr = (MetaWordCountAttribute) getOdfAttribute(OdfDocumentNamespace.META, "word-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaWordCountAttribute</code> , See {@odf.attribute meta:word-count}
+	 *
+	 * @param metaWordCountValue   The type is <code>Integer</code>
+	 */
+	public void setMetaWordCountAttribute(Integer metaWordCountValue) {
+		MetaWordCountAttribute attr = new MetaWordCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(metaWordCountValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaEditingCyclesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaEditingCyclesElement.java
new file mode 100644
index 0000000..54c593b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaEditingCyclesElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:editing-cycles}.
+ *
+ */
+public class MetaEditingCyclesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "editing-cycles");
+
+	/**
+	 * Create the instance of <code>MetaEditingCyclesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaEditingCyclesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:editing-cycles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaEditingDurationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaEditingDurationElement.java
new file mode 100644
index 0000000..7ebe811
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaEditingDurationElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:editing-duration}.
+ *
+ */
+public class MetaEditingDurationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "editing-duration");
+
+	/**
+	 * Create the instance of <code>MetaEditingDurationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaEditingDurationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:editing-duration}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaGeneratorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaGeneratorElement.java
new file mode 100644
index 0000000..a9f89a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaGeneratorElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:generator}.
+ *
+ */
+public class MetaGeneratorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "generator");
+
+	/**
+	 * Create the instance of <code>MetaGeneratorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaGeneratorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:generator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaHyperlinkBehaviourElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaHyperlinkBehaviourElement.java
new file mode 100644
index 0000000..6ad124e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaHyperlinkBehaviourElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:hyperlink-behaviour}.
+ *
+ */
+public class MetaHyperlinkBehaviourElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "hyperlink-behaviour");
+
+	/**
+	 * Create the instance of <code>MetaHyperlinkBehaviourElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaHyperlinkBehaviourElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:hyperlink-behaviour}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameNameAttribute() {
+		OfficeTargetFrameNameAttribute attr = (OfficeTargetFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @param officeTargetFrameNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameNameAttribute(String officeTargetFrameNameValue) {
+		OfficeTargetFrameNameAttribute attr = new OfficeTargetFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaInitialCreatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaInitialCreatorElement.java
new file mode 100644
index 0000000..618381f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaInitialCreatorElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:initial-creator}.
+ *
+ */
+public class MetaInitialCreatorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "initial-creator");
+
+	/**
+	 * Create the instance of <code>MetaInitialCreatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaInitialCreatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:initial-creator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaKeywordElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaKeywordElement.java
new file mode 100644
index 0000000..558985f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaKeywordElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:keyword}.
+ *
+ */
+public class MetaKeywordElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "keyword");
+
+	/**
+	 * Create the instance of <code>MetaKeywordElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaKeywordElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:keyword}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaPrintDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaPrintDateElement.java
new file mode 100644
index 0000000..b044981
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaPrintDateElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:print-date}.
+ *
+ */
+public class MetaPrintDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "print-date");
+
+	/**
+	 * Create the instance of <code>MetaPrintDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaPrintDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:print-date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaPrintedByElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaPrintedByElement.java
new file mode 100644
index 0000000..4663505
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaPrintedByElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:printed-by}.
+ *
+ */
+public class MetaPrintedByElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "printed-by");
+
+	/**
+	 * Create the instance of <code>MetaPrintedByElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaPrintedByElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:printed-by}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaTemplateElement.java
new file mode 100644
index 0000000..4a5ea23
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaTemplateElement.java
@@ -0,0 +1,200 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaDateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:template}.
+ *
+ */
+public class MetaTemplateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "template");
+
+	/**
+	 * Create the instance of <code>MetaTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaDateAttribute</code> , See {@odf.attribute meta:date}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getMetaDateAttribute() {
+		MetaDateAttribute attr = (MetaDateAttribute) getOdfAttribute(OdfDocumentNamespace.META, "date");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaDateAttribute</code> , See {@odf.attribute meta:date}
+	 *
+	 * @param metaDateValue   The type is <code>String</code>
+	 */
+	public void setMetaDateAttribute(String metaDateValue) {
+		MetaDateAttribute attr = new MetaDateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(metaDateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTitleAttribute</code> , See {@odf.attribute xlink:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTitleAttribute() {
+		XlinkTitleAttribute attr = (XlinkTitleAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTitleAttribute</code> , See {@odf.attribute xlink:title}
+	 *
+	 * @param xlinkTitleValue   The type is <code>String</code>
+	 */
+	public void setXlinkTitleAttribute(String xlinkTitleValue) {
+		XlinkTitleAttribute attr = new XlinkTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaUserDefinedElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaUserDefinedElement.java
new file mode 100644
index 0000000..6e32128
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/meta/MetaUserDefinedElement.java
@@ -0,0 +1,133 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.meta;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaValueTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element meta:user-defined}.
+ *
+ */
+public class MetaUserDefinedElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.META, "user-defined");
+
+	/**
+	 * Create the instance of <code>MetaUserDefinedElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public MetaUserDefinedElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element meta:user-defined}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaNameAttribute</code> , See {@odf.attribute meta:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getMetaNameAttribute() {
+		MetaNameAttribute attr = (MetaNameAttribute) getOdfAttribute(OdfDocumentNamespace.META, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaNameAttribute</code> , See {@odf.attribute meta:name}
+	 *
+	 * @param metaNameValue   The type is <code>String</code>
+	 */
+	public void setMetaNameAttribute(String metaNameValue) {
+		MetaNameAttribute attr = new MetaNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(metaNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MetaValueTypeAttribute</code> , See {@odf.attribute meta:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getMetaValueTypeAttribute() {
+		MetaValueTypeAttribute attr = (MetaValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.META, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MetaValueTypeAttribute</code> , See {@odf.attribute meta:value-type}
+	 *
+	 * @param metaValueTypeValue   The type is <code>String</code>
+	 */
+	public void setMetaValueTypeAttribute(String metaValueTypeValue) {
+		MetaValueTypeAttribute attr = new MetaValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(metaValueTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberAmPmElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberAmPmElement.java
new file mode 100644
index 0000000..7fb5aa7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberAmPmElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:am-pm}.
+ *
+ */
+public class NumberAmPmElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "am-pm");
+
+	/**
+	 * Create the instance of <code>NumberAmPmElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberAmPmElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:am-pm}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberBooleanElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberBooleanElement.java
new file mode 100644
index 0000000..2a9bb1c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberBooleanElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:boolean}.
+ *
+ */
+public class NumberBooleanElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "boolean");
+
+	/**
+	 * Create the instance of <code>NumberBooleanElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberBooleanElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:boolean}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberBooleanStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberBooleanStyleElement.java
new file mode 100644
index 0000000..751d461
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberBooleanStyleElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:boolean-style}.
+ *
+ */
+public class NumberBooleanStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "boolean-style");
+
+	/**
+	 * Create the instance of <code>NumberBooleanStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberBooleanStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:boolean-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:boolean}.
+	 *
+	 * @return the element {@odf.element number:boolean}
+	 */
+	public NumberBooleanElement newNumberBooleanElement() {
+		NumberBooleanElement numberBoolean = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberBooleanElement.class);
+		this.appendChild(numberBoolean);
+		return numberBoolean;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberCurrencyStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberCurrencyStyleElement.java
new file mode 100644
index 0000000..11819d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberCurrencyStyleElement.java
@@ -0,0 +1,461 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberAutomaticOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:currency-style}.
+ *
+ */
+public class NumberCurrencyStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "currency-style");
+
+	/**
+	 * Create the instance of <code>NumberCurrencyStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberCurrencyStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:currency-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberAutomaticOrderAttribute</code> , See {@odf.attribute number:automatic-order}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberAutomaticOrderAttribute() {
+		NumberAutomaticOrderAttribute attr = (NumberAutomaticOrderAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "automatic-order");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberAutomaticOrderAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberAutomaticOrderAttribute</code> , See {@odf.attribute number:automatic-order}
+	 *
+	 * @param numberAutomaticOrderValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberAutomaticOrderAttribute(Boolean numberAutomaticOrderValue) {
+		NumberAutomaticOrderAttribute attr = new NumberAutomaticOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberAutomaticOrderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:currency-symbol}.
+	 *
+	 * @return the element {@odf.element number:currency-symbol}
+	 */
+	public NumberCurrencySymbolElement newNumberCurrencySymbolElement() {
+		NumberCurrencySymbolElement numberCurrencySymbol = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberCurrencySymbolElement.class);
+		this.appendChild(numberCurrencySymbol);
+		return numberCurrencySymbol;
+	}
+
+	/**
+	 * Create child element {@odf.element number:number}.
+	 *
+	 * @return the element {@odf.element number:number}
+	 */
+	public NumberNumberElement newNumberNumberElement() {
+		NumberNumberElement numberNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberNumberElement.class);
+		this.appendChild(numberNumber);
+		return numberNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberCurrencySymbolElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberCurrencySymbolElement.java
new file mode 100644
index 0000000..e87814c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberCurrencySymbolElement.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:currency-symbol}.
+ *
+ */
+public class NumberCurrencySymbolElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "currency-symbol");
+
+	/**
+	 * Create the instance of <code>NumberCurrencySymbolElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberCurrencySymbolElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:currency-symbol}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDateStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDateStyleElement.java
new file mode 100644
index 0000000..2f4f75f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDateStyleElement.java
@@ -0,0 +1,585 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberAutomaticOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberFormatSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:date-style}.
+ *
+ */
+public class NumberDateStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "date-style");
+
+	/**
+	 * Create the instance of <code>NumberDateStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberDateStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:date-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberAutomaticOrderAttribute</code> , See {@odf.attribute number:automatic-order}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberAutomaticOrderAttribute() {
+		NumberAutomaticOrderAttribute attr = (NumberAutomaticOrderAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "automatic-order");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberAutomaticOrderAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberAutomaticOrderAttribute</code> , See {@odf.attribute number:automatic-order}
+	 *
+	 * @param numberAutomaticOrderValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberAutomaticOrderAttribute(Boolean numberAutomaticOrderValue) {
+		NumberAutomaticOrderAttribute attr = new NumberAutomaticOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberAutomaticOrderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberFormatSourceAttribute</code> , See {@odf.attribute number:format-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberFormatSourceAttribute() {
+		NumberFormatSourceAttribute attr = (NumberFormatSourceAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "format-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberFormatSourceAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberFormatSourceAttribute</code> , See {@odf.attribute number:format-source}
+	 *
+	 * @param numberFormatSourceValue   The type is <code>String</code>
+	 */
+	public void setNumberFormatSourceAttribute(String numberFormatSourceValue) {
+		NumberFormatSourceAttribute attr = new NumberFormatSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberFormatSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:am-pm}.
+	 *
+	 * @return the element {@odf.element number:am-pm}
+	 */
+	public NumberAmPmElement newNumberAmPmElement() {
+		NumberAmPmElement numberAmPm = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberAmPmElement.class);
+		this.appendChild(numberAmPm);
+		return numberAmPm;
+	}
+
+	/**
+	 * Create child element {@odf.element number:day}.
+	 *
+	 * @return the element {@odf.element number:day}
+	 */
+	public NumberDayElement newNumberDayElement() {
+		NumberDayElement numberDay = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberDayElement.class);
+		this.appendChild(numberDay);
+		return numberDay;
+	}
+
+	/**
+	 * Create child element {@odf.element number:day-of-week}.
+	 *
+	 * @return the element {@odf.element number:day-of-week}
+	 */
+	public NumberDayOfWeekElement newNumberDayOfWeekElement() {
+		NumberDayOfWeekElement numberDayOfWeek = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberDayOfWeekElement.class);
+		this.appendChild(numberDayOfWeek);
+		return numberDayOfWeek;
+	}
+
+	/**
+	 * Create child element {@odf.element number:era}.
+	 *
+	 * @return the element {@odf.element number:era}
+	 */
+	public NumberEraElement newNumberEraElement() {
+		NumberEraElement numberEra = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberEraElement.class);
+		this.appendChild(numberEra);
+		return numberEra;
+	}
+
+	/**
+	 * Create child element {@odf.element number:hours}.
+	 *
+	 * @return the element {@odf.element number:hours}
+	 */
+	public NumberHoursElement newNumberHoursElement() {
+		NumberHoursElement numberHours = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberHoursElement.class);
+		this.appendChild(numberHours);
+		return numberHours;
+	}
+
+	/**
+	 * Create child element {@odf.element number:minutes}.
+	 *
+	 * @return the element {@odf.element number:minutes}
+	 */
+	public NumberMinutesElement newNumberMinutesElement() {
+		NumberMinutesElement numberMinutes = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberMinutesElement.class);
+		this.appendChild(numberMinutes);
+		return numberMinutes;
+	}
+
+	/**
+	 * Create child element {@odf.element number:month}.
+	 *
+	 * @return the element {@odf.element number:month}
+	 */
+	public NumberMonthElement newNumberMonthElement() {
+		NumberMonthElement numberMonth = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberMonthElement.class);
+		this.appendChild(numberMonth);
+		return numberMonth;
+	}
+
+	/**
+	 * Create child element {@odf.element number:quarter}.
+	 *
+	 * @return the element {@odf.element number:quarter}
+	 */
+	public NumberQuarterElement newNumberQuarterElement() {
+		NumberQuarterElement numberQuarter = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberQuarterElement.class);
+		this.appendChild(numberQuarter);
+		return numberQuarter;
+	}
+
+	/**
+	 * Create child element {@odf.element number:seconds}.
+	 *
+	 * @return the element {@odf.element number:seconds}
+	 */
+	public NumberSecondsElement newNumberSecondsElement() {
+		NumberSecondsElement numberSeconds = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberSecondsElement.class);
+		this.appendChild(numberSeconds);
+		return numberSeconds;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element number:week-of-year}.
+	 *
+	 * @return the element {@odf.element number:week-of-year}
+	 */
+	public NumberWeekOfYearElement newNumberWeekOfYearElement() {
+		NumberWeekOfYearElement numberWeekOfYear = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberWeekOfYearElement.class);
+		this.appendChild(numberWeekOfYear);
+		return numberWeekOfYear;
+	}
+
+	/**
+	 * Create child element {@odf.element number:year}.
+	 *
+	 * @return the element {@odf.element number:year}
+	 */
+	public NumberYearElement newNumberYearElement() {
+		NumberYearElement numberYear = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberYearElement.class);
+		this.appendChild(numberYear);
+		return numberYear;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDayElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDayElement.java
new file mode 100644
index 0000000..dd2675e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDayElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:day}.
+ *
+ */
+public class NumberDayElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "day");
+
+	/**
+	 * Create the instance of <code>NumberDayElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberDayElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:day}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDayOfWeekElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDayOfWeekElement.java
new file mode 100644
index 0000000..f4d4e40
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberDayOfWeekElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:day-of-week}.
+ *
+ */
+public class NumberDayOfWeekElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "day-of-week");
+
+	/**
+	 * Create the instance of <code>NumberDayOfWeekElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberDayOfWeekElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:day-of-week}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberEmbeddedTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberEmbeddedTextElement.java
new file mode 100644
index 0000000..69d4f60
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberEmbeddedTextElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberPositionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:embedded-text}.
+ *
+ */
+public class NumberEmbeddedTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "embedded-text");
+
+	/**
+	 * Create the instance of <code>NumberEmbeddedTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberEmbeddedTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:embedded-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberPositionAttribute</code> , See {@odf.attribute number:position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberPositionAttribute() {
+		NumberPositionAttribute attr = (NumberPositionAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberPositionAttribute</code> , See {@odf.attribute number:position}
+	 *
+	 * @param numberPositionValue   The type is <code>Integer</code>
+	 */
+	public void setNumberPositionAttribute(Integer numberPositionValue) {
+		NumberPositionAttribute attr = new NumberPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberPositionValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberEraElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberEraElement.java
new file mode 100644
index 0000000..8ebd392
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberEraElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:era}.
+ *
+ */
+public class NumberEraElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "era");
+
+	/**
+	 * Create the instance of <code>NumberEraElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberEraElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:era}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberFractionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberFractionElement.java
new file mode 100644
index 0000000..6959977
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberFractionElement.java
@@ -0,0 +1,196 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberDenominatorValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberGroupingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberMinDenominatorDigitsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberMinIntegerDigitsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberMinNumeratorDigitsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:fraction}.
+ *
+ */
+public class NumberFractionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "fraction");
+
+	/**
+	 * Create the instance of <code>NumberFractionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberFractionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:fraction}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberDenominatorValueAttribute</code> , See {@odf.attribute number:denominator-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberDenominatorValueAttribute() {
+		NumberDenominatorValueAttribute attr = (NumberDenominatorValueAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "denominator-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberDenominatorValueAttribute</code> , See {@odf.attribute number:denominator-value}
+	 *
+	 * @param numberDenominatorValueValue   The type is <code>Integer</code>
+	 */
+	public void setNumberDenominatorValueAttribute(Integer numberDenominatorValueValue) {
+		NumberDenominatorValueAttribute attr = new NumberDenominatorValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberDenominatorValueValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberGroupingAttribute</code> , See {@odf.attribute number:grouping}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberGroupingAttribute() {
+		NumberGroupingAttribute attr = (NumberGroupingAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "grouping");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberGroupingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberGroupingAttribute</code> , See {@odf.attribute number:grouping}
+	 *
+	 * @param numberGroupingValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberGroupingAttribute(Boolean numberGroupingValue) {
+		NumberGroupingAttribute attr = new NumberGroupingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberGroupingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberMinDenominatorDigitsAttribute</code> , See {@odf.attribute number:min-denominator-digits}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberMinDenominatorDigitsAttribute() {
+		NumberMinDenominatorDigitsAttribute attr = (NumberMinDenominatorDigitsAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "min-denominator-digits");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberMinDenominatorDigitsAttribute</code> , See {@odf.attribute number:min-denominator-digits}
+	 *
+	 * @param numberMinDenominatorDigitsValue   The type is <code>Integer</code>
+	 */
+	public void setNumberMinDenominatorDigitsAttribute(Integer numberMinDenominatorDigitsValue) {
+		NumberMinDenominatorDigitsAttribute attr = new NumberMinDenominatorDigitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberMinDenominatorDigitsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberMinIntegerDigitsAttribute</code> , See {@odf.attribute number:min-integer-digits}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberMinIntegerDigitsAttribute() {
+		NumberMinIntegerDigitsAttribute attr = (NumberMinIntegerDigitsAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "min-integer-digits");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberMinIntegerDigitsAttribute</code> , See {@odf.attribute number:min-integer-digits}
+	 *
+	 * @param numberMinIntegerDigitsValue   The type is <code>Integer</code>
+	 */
+	public void setNumberMinIntegerDigitsAttribute(Integer numberMinIntegerDigitsValue) {
+		NumberMinIntegerDigitsAttribute attr = new NumberMinIntegerDigitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberMinIntegerDigitsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberMinNumeratorDigitsAttribute</code> , See {@odf.attribute number:min-numerator-digits}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberMinNumeratorDigitsAttribute() {
+		NumberMinNumeratorDigitsAttribute attr = (NumberMinNumeratorDigitsAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "min-numerator-digits");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberMinNumeratorDigitsAttribute</code> , See {@odf.attribute number:min-numerator-digits}
+	 *
+	 * @param numberMinNumeratorDigitsValue   The type is <code>Integer</code>
+	 */
+	public void setNumberMinNumeratorDigitsAttribute(Integer numberMinNumeratorDigitsValue) {
+		NumberMinNumeratorDigitsAttribute attr = new NumberMinNumeratorDigitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberMinNumeratorDigitsValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberHoursElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberHoursElement.java
new file mode 100644
index 0000000..d3819c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberHoursElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:hours}.
+ *
+ */
+public class NumberHoursElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "hours");
+
+	/**
+	 * Create the instance of <code>NumberHoursElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberHoursElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:hours}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberMinutesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberMinutesElement.java
new file mode 100644
index 0000000..a1aa74f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberMinutesElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:minutes}.
+ *
+ */
+public class NumberMinutesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "minutes");
+
+	/**
+	 * Create the instance of <code>NumberMinutesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberMinutesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:minutes}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberMonthElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberMonthElement.java
new file mode 100644
index 0000000..12caa6c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberMonthElement.java
@@ -0,0 +1,171 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberPossessiveFormAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTextualAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:month}.
+ *
+ */
+public class NumberMonthElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "month");
+
+	/**
+	 * Create the instance of <code>NumberMonthElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberMonthElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:month}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberPossessiveFormAttribute</code> , See {@odf.attribute number:possessive-form}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberPossessiveFormAttribute() {
+		NumberPossessiveFormAttribute attr = (NumberPossessiveFormAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "possessive-form");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberPossessiveFormAttribute</code> , See {@odf.attribute number:possessive-form}
+	 *
+	 * @param numberPossessiveFormValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberPossessiveFormAttribute(Boolean numberPossessiveFormValue) {
+		NumberPossessiveFormAttribute attr = new NumberPossessiveFormAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberPossessiveFormValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTextualAttribute</code> , See {@odf.attribute number:textual}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberTextualAttribute() {
+		NumberTextualAttribute attr = (NumberTextualAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "textual");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberTextualAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTextualAttribute</code> , See {@odf.attribute number:textual}
+	 *
+	 * @param numberTextualValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberTextualAttribute(Boolean numberTextualValue) {
+		NumberTextualAttribute attr = new NumberTextualAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberTextualValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberNumberElement.java
new file mode 100644
index 0000000..3d046a7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberNumberElement.java
@@ -0,0 +1,209 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberDecimalPlacesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberDecimalReplacementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberDisplayFactorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberGroupingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberMinIntegerDigitsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:number}.
+ *
+ */
+public class NumberNumberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "number");
+
+	/**
+	 * Create the instance of <code>NumberNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberDecimalPlacesAttribute</code> , See {@odf.attribute number:decimal-places}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberDecimalPlacesAttribute() {
+		NumberDecimalPlacesAttribute attr = (NumberDecimalPlacesAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "decimal-places");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberDecimalPlacesAttribute</code> , See {@odf.attribute number:decimal-places}
+	 *
+	 * @param numberDecimalPlacesValue   The type is <code>Integer</code>
+	 */
+	public void setNumberDecimalPlacesAttribute(Integer numberDecimalPlacesValue) {
+		NumberDecimalPlacesAttribute attr = new NumberDecimalPlacesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberDecimalPlacesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberDecimalReplacementAttribute</code> , See {@odf.attribute number:decimal-replacement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberDecimalReplacementAttribute() {
+		NumberDecimalReplacementAttribute attr = (NumberDecimalReplacementAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "decimal-replacement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberDecimalReplacementAttribute</code> , See {@odf.attribute number:decimal-replacement}
+	 *
+	 * @param numberDecimalReplacementValue   The type is <code>String</code>
+	 */
+	public void setNumberDecimalReplacementAttribute(String numberDecimalReplacementValue) {
+		NumberDecimalReplacementAttribute attr = new NumberDecimalReplacementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberDecimalReplacementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberDisplayFactorAttribute</code> , See {@odf.attribute number:display-factor}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getNumberDisplayFactorAttribute() {
+		NumberDisplayFactorAttribute attr = (NumberDisplayFactorAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "display-factor");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return Double.valueOf(NumberDisplayFactorAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberDisplayFactorAttribute</code> , See {@odf.attribute number:display-factor}
+	 *
+	 * @param numberDisplayFactorValue   The type is <code>Double</code>
+	 */
+	public void setNumberDisplayFactorAttribute(Double numberDisplayFactorValue) {
+		NumberDisplayFactorAttribute attr = new NumberDisplayFactorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(numberDisplayFactorValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberGroupingAttribute</code> , See {@odf.attribute number:grouping}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberGroupingAttribute() {
+		NumberGroupingAttribute attr = (NumberGroupingAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "grouping");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberGroupingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberGroupingAttribute</code> , See {@odf.attribute number:grouping}
+	 *
+	 * @param numberGroupingValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberGroupingAttribute(Boolean numberGroupingValue) {
+		NumberGroupingAttribute attr = new NumberGroupingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberGroupingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberMinIntegerDigitsAttribute</code> , See {@odf.attribute number:min-integer-digits}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberMinIntegerDigitsAttribute() {
+		NumberMinIntegerDigitsAttribute attr = (NumberMinIntegerDigitsAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "min-integer-digits");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberMinIntegerDigitsAttribute</code> , See {@odf.attribute number:min-integer-digits}
+	 *
+	 * @param numberMinIntegerDigitsValue   The type is <code>Integer</code>
+	 */
+	public void setNumberMinIntegerDigitsAttribute(Integer numberMinIntegerDigitsValue) {
+		NumberMinIntegerDigitsAttribute attr = new NumberMinIntegerDigitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberMinIntegerDigitsValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:embedded-text}.
+	 *
+	 * @param numberPositionValue  the <code>Integer</code> value of <code>NumberPositionAttribute</code>, see {@odf.attribute  number:position} at specification
+	 * @return the element {@odf.element number:embedded-text}
+	 */
+	 public NumberEmbeddedTextElement newNumberEmbeddedTextElement(int numberPositionValue) {
+		NumberEmbeddedTextElement numberEmbeddedText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberEmbeddedTextElement.class);
+		numberEmbeddedText.setNumberPositionAttribute(numberPositionValue);
+		this.appendChild(numberEmbeddedText);
+		return numberEmbeddedText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberNumberStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberNumberStyleElement.java
new file mode 100644
index 0000000..b7c232b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberNumberStyleElement.java
@@ -0,0 +1,447 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:number-style}.
+ *
+ */
+public class NumberNumberStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "number-style");
+
+	/**
+	 * Create the instance of <code>NumberNumberStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberNumberStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:number-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:fraction}.
+	 *
+	 * @return the element {@odf.element number:fraction}
+	 */
+	public NumberFractionElement newNumberFractionElement() {
+		NumberFractionElement numberFraction = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberFractionElement.class);
+		this.appendChild(numberFraction);
+		return numberFraction;
+	}
+
+	/**
+	 * Create child element {@odf.element number:number}.
+	 *
+	 * @return the element {@odf.element number:number}
+	 */
+	public NumberNumberElement newNumberNumberElement() {
+		NumberNumberElement numberNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberNumberElement.class);
+		this.appendChild(numberNumber);
+		return numberNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element number:scientific-number}.
+	 *
+	 * @return the element {@odf.element number:scientific-number}
+	 */
+	public NumberScientificNumberElement newNumberScientificNumberElement() {
+		NumberScientificNumberElement numberScientificNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberScientificNumberElement.class);
+		this.appendChild(numberScientificNumber);
+		return numberScientificNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberPercentageStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberPercentageStyleElement.java
new file mode 100644
index 0000000..a99e6b2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberPercentageStyleElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:percentage-style}.
+ *
+ */
+public class NumberPercentageStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "percentage-style");
+
+	/**
+	 * Create the instance of <code>NumberPercentageStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberPercentageStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:percentage-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:number}.
+	 *
+	 * @return the element {@odf.element number:number}
+	 */
+	public NumberNumberElement newNumberNumberElement() {
+		NumberNumberElement numberNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberNumberElement.class);
+		this.appendChild(numberNumber);
+		return numberNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberQuarterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberQuarterElement.java
new file mode 100644
index 0000000..c508b8a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberQuarterElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:quarter}.
+ *
+ */
+public class NumberQuarterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "quarter");
+
+	/**
+	 * Create the instance of <code>NumberQuarterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberQuarterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:quarter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberScientificNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberScientificNumberElement.java
new file mode 100644
index 0000000..eaa06f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberScientificNumberElement.java
@@ -0,0 +1,171 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberDecimalPlacesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberGroupingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberMinExponentDigitsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberMinIntegerDigitsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:scientific-number}.
+ *
+ */
+public class NumberScientificNumberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "scientific-number");
+
+	/**
+	 * Create the instance of <code>NumberScientificNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberScientificNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:scientific-number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberDecimalPlacesAttribute</code> , See {@odf.attribute number:decimal-places}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberDecimalPlacesAttribute() {
+		NumberDecimalPlacesAttribute attr = (NumberDecimalPlacesAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "decimal-places");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberDecimalPlacesAttribute</code> , See {@odf.attribute number:decimal-places}
+	 *
+	 * @param numberDecimalPlacesValue   The type is <code>Integer</code>
+	 */
+	public void setNumberDecimalPlacesAttribute(Integer numberDecimalPlacesValue) {
+		NumberDecimalPlacesAttribute attr = new NumberDecimalPlacesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberDecimalPlacesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberGroupingAttribute</code> , See {@odf.attribute number:grouping}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberGroupingAttribute() {
+		NumberGroupingAttribute attr = (NumberGroupingAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "grouping");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberGroupingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberGroupingAttribute</code> , See {@odf.attribute number:grouping}
+	 *
+	 * @param numberGroupingValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberGroupingAttribute(Boolean numberGroupingValue) {
+		NumberGroupingAttribute attr = new NumberGroupingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberGroupingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberMinExponentDigitsAttribute</code> , See {@odf.attribute number:min-exponent-digits}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberMinExponentDigitsAttribute() {
+		NumberMinExponentDigitsAttribute attr = (NumberMinExponentDigitsAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "min-exponent-digits");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberMinExponentDigitsAttribute</code> , See {@odf.attribute number:min-exponent-digits}
+	 *
+	 * @param numberMinExponentDigitsValue   The type is <code>Integer</code>
+	 */
+	public void setNumberMinExponentDigitsAttribute(Integer numberMinExponentDigitsValue) {
+		NumberMinExponentDigitsAttribute attr = new NumberMinExponentDigitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberMinExponentDigitsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberMinIntegerDigitsAttribute</code> , See {@odf.attribute number:min-integer-digits}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberMinIntegerDigitsAttribute() {
+		NumberMinIntegerDigitsAttribute attr = (NumberMinIntegerDigitsAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "min-integer-digits");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberMinIntegerDigitsAttribute</code> , See {@odf.attribute number:min-integer-digits}
+	 *
+	 * @param numberMinIntegerDigitsValue   The type is <code>Integer</code>
+	 */
+	public void setNumberMinIntegerDigitsAttribute(Integer numberMinIntegerDigitsValue) {
+		NumberMinIntegerDigitsAttribute attr = new NumberMinIntegerDigitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberMinIntegerDigitsValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberSecondsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberSecondsElement.java
new file mode 100644
index 0000000..6fcc704
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberSecondsElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberDecimalPlacesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:seconds}.
+ *
+ */
+public class NumberSecondsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "seconds");
+
+	/**
+	 * Create the instance of <code>NumberSecondsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberSecondsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:seconds}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberDecimalPlacesAttribute</code> , See {@odf.attribute number:decimal-places}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNumberDecimalPlacesAttribute() {
+		NumberDecimalPlacesAttribute attr = (NumberDecimalPlacesAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "decimal-places");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(NumberDecimalPlacesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberDecimalPlacesAttribute</code> , See {@odf.attribute number:decimal-places}
+	 *
+	 * @param numberDecimalPlacesValue   The type is <code>Integer</code>
+	 */
+	public void setNumberDecimalPlacesAttribute(Integer numberDecimalPlacesValue) {
+		NumberDecimalPlacesAttribute attr = new NumberDecimalPlacesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(numberDecimalPlacesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextContentElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextContentElement.java
new file mode 100644
index 0000000..c2115c0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextContentElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:text-content}.
+ *
+ */
+public class NumberTextContentElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "text-content");
+
+	/**
+	 * Create the instance of <code>NumberTextContentElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberTextContentElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:text-content}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextElement.java
new file mode 100644
index 0000000..c11e547
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:text}.
+ *
+ */
+public class NumberTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "text");
+
+	/**
+	 * Create the instance of <code>NumberTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextStyleElement.java
new file mode 100644
index 0000000..a9a6001
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTextStyleElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:text-style}.
+ *
+ */
+public class NumberTextStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "text-style");
+
+	/**
+	 * Create the instance of <code>NumberTextStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberTextStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:text-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text-content}.
+	 *
+	 * @return the element {@odf.element number:text-content}
+	 */
+	public NumberTextContentElement newNumberTextContentElement() {
+		NumberTextContentElement numberTextContent = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextContentElement.class);
+		this.appendChild(numberTextContent);
+		return numberTextContent;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTimeStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTimeStyleElement.java
new file mode 100644
index 0000000..f5731b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberTimeStyleElement.java
@@ -0,0 +1,508 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberFormatSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTransliterationStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberTruncateOnOverflowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVolatileAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:time-style}.
+ *
+ */
+public class NumberTimeStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "time-style");
+
+	/**
+	 * Create the instance of <code>NumberTimeStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberTimeStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:time-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCountryAttribute() {
+		NumberCountryAttribute attr = (NumberCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCountryAttribute</code> , See {@odf.attribute number:country}
+	 *
+	 * @param numberCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberCountryAttribute(String numberCountryValue) {
+		NumberCountryAttribute attr = new NumberCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberFormatSourceAttribute</code> , See {@odf.attribute number:format-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberFormatSourceAttribute() {
+		NumberFormatSourceAttribute attr = (NumberFormatSourceAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "format-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberFormatSourceAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberFormatSourceAttribute</code> , See {@odf.attribute number:format-source}
+	 *
+	 * @param numberFormatSourceValue   The type is <code>String</code>
+	 */
+	public void setNumberFormatSourceAttribute(String numberFormatSourceValue) {
+		NumberFormatSourceAttribute attr = new NumberFormatSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberFormatSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberLanguageAttribute() {
+		NumberLanguageAttribute attr = (NumberLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberLanguageAttribute</code> , See {@odf.attribute number:language}
+	 *
+	 * @param numberLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberLanguageAttribute(String numberLanguageValue) {
+		NumberLanguageAttribute attr = new NumberLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberRfcLanguageTagAttribute() {
+		NumberRfcLanguageTagAttribute attr = (NumberRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberRfcLanguageTagAttribute</code> , See {@odf.attribute number:rfc-language-tag}
+	 *
+	 * @param numberRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setNumberRfcLanguageTagAttribute(String numberRfcLanguageTagValue) {
+		NumberRfcLanguageTagAttribute attr = new NumberRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberScriptAttribute() {
+		NumberScriptAttribute attr = (NumberScriptAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberScriptAttribute</code> , See {@odf.attribute number:script}
+	 *
+	 * @param numberScriptValue   The type is <code>String</code>
+	 */
+	public void setNumberScriptAttribute(String numberScriptValue) {
+		NumberScriptAttribute attr = new NumberScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTitleAttribute() {
+		NumberTitleAttribute attr = (NumberTitleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTitleAttribute</code> , See {@odf.attribute number:title}
+	 *
+	 * @param numberTitleValue   The type is <code>String</code>
+	 */
+	public void setNumberTitleAttribute(String numberTitleValue) {
+		NumberTitleAttribute attr = new NumberTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationCountryAttribute() {
+		NumberTransliterationCountryAttribute attr = (NumberTransliterationCountryAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationCountryAttribute</code> , See {@odf.attribute number:transliteration-country}
+	 *
+	 * @param numberTransliterationCountryValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationCountryAttribute(String numberTransliterationCountryValue) {
+		NumberTransliterationCountryAttribute attr = new NumberTransliterationCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationFormatAttribute() {
+		NumberTransliterationFormatAttribute attr = (NumberTransliterationFormatAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationFormatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationFormatAttribute</code> , See {@odf.attribute number:transliteration-format}
+	 *
+	 * @param numberTransliterationFormatValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationFormatAttribute(String numberTransliterationFormatValue) {
+		NumberTransliterationFormatAttribute attr = new NumberTransliterationFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationLanguageAttribute() {
+		NumberTransliterationLanguageAttribute attr = (NumberTransliterationLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationLanguageAttribute</code> , See {@odf.attribute number:transliteration-language}
+	 *
+	 * @param numberTransliterationLanguageValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationLanguageAttribute(String numberTransliterationLanguageValue) {
+		NumberTransliterationLanguageAttribute attr = new NumberTransliterationLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberTransliterationStyleAttribute() {
+		NumberTransliterationStyleAttribute attr = (NumberTransliterationStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "transliteration-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return NumberTransliterationStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTransliterationStyleAttribute</code> , See {@odf.attribute number:transliteration-style}
+	 *
+	 * @param numberTransliterationStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberTransliterationStyleAttribute(String numberTransliterationStyleValue) {
+		NumberTransliterationStyleAttribute attr = new NumberTransliterationStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberTransliterationStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberTruncateOnOverflowAttribute</code> , See {@odf.attribute number:truncate-on-overflow}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getNumberTruncateOnOverflowAttribute() {
+		NumberTruncateOnOverflowAttribute attr = (NumberTruncateOnOverflowAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "truncate-on-overflow");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(NumberTruncateOnOverflowAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberTruncateOnOverflowAttribute</code> , See {@odf.attribute number:truncate-on-overflow}
+	 *
+	 * @param numberTruncateOnOverflowValue   The type is <code>Boolean</code>
+	 */
+	public void setNumberTruncateOnOverflowAttribute(Boolean numberTruncateOnOverflowValue) {
+		NumberTruncateOnOverflowAttribute attr = new NumberTruncateOnOverflowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(numberTruncateOnOverflowValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleVolatileAttribute() {
+		StyleVolatileAttribute attr = (StyleVolatileAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "volatile");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVolatileAttribute</code> , See {@odf.attribute style:volatile}
+	 *
+	 * @param styleVolatileValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleVolatileAttribute(Boolean styleVolatileValue) {
+		StyleVolatileAttribute attr = new StyleVolatileAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleVolatileValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element number:am-pm}.
+	 *
+	 * @return the element {@odf.element number:am-pm}
+	 */
+	public NumberAmPmElement newNumberAmPmElement() {
+		NumberAmPmElement numberAmPm = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberAmPmElement.class);
+		this.appendChild(numberAmPm);
+		return numberAmPm;
+	}
+
+	/**
+	 * Create child element {@odf.element number:hours}.
+	 *
+	 * @return the element {@odf.element number:hours}
+	 */
+	public NumberHoursElement newNumberHoursElement() {
+		NumberHoursElement numberHours = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberHoursElement.class);
+		this.appendChild(numberHours);
+		return numberHours;
+	}
+
+	/**
+	 * Create child element {@odf.element number:minutes}.
+	 *
+	 * @return the element {@odf.element number:minutes}
+	 */
+	public NumberMinutesElement newNumberMinutesElement() {
+		NumberMinutesElement numberMinutes = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberMinutesElement.class);
+		this.appendChild(numberMinutes);
+		return numberMinutes;
+	}
+
+	/**
+	 * Create child element {@odf.element number:seconds}.
+	 *
+	 * @return the element {@odf.element number:seconds}
+	 */
+	public NumberSecondsElement newNumberSecondsElement() {
+		NumberSecondsElement numberSeconds = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberSecondsElement.class);
+		this.appendChild(numberSeconds);
+		return numberSeconds;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text}.
+	 *
+	 * @return the element {@odf.element number:text}
+	 */
+	public NumberTextElement newNumberTextElement() {
+		NumberTextElement numberText = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextElement.class);
+		this.appendChild(numberText);
+		return numberText;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberWeekOfYearElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberWeekOfYearElement.java
new file mode 100644
index 0000000..6db3b19
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberWeekOfYearElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:week-of-year}.
+ *
+ */
+public class NumberWeekOfYearElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "week-of-year");
+
+	/**
+	 * Create the instance of <code>NumberWeekOfYearElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberWeekOfYearElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:week-of-year}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberYearElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberYearElement.java
new file mode 100644
index 0000000..d46e766
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/number/NumberYearElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberCalendarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberStyleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element number:year}.
+ *
+ */
+public class NumberYearElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.NUMBER, "year");
+
+	/**
+	 * Create the instance of <code>NumberYearElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public NumberYearElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element number:year}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberCalendarAttribute() {
+		NumberCalendarAttribute attr = (NumberCalendarAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "calendar");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberCalendarAttribute</code> , See {@odf.attribute number:calendar}
+	 *
+	 * @param numberCalendarValue   The type is <code>String</code>
+	 */
+	public void setNumberCalendarAttribute(String numberCalendarValue) {
+		NumberCalendarAttribute attr = new NumberCalendarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberCalendarValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getNumberStyleAttribute() {
+		NumberStyleAttribute attr = (NumberStyleAttribute) getOdfAttribute(OdfDocumentNamespace.NUMBER, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>NumberStyleAttribute</code> , See {@odf.attribute number:style}
+	 *
+	 * @param numberStyleValue   The type is <code>String</code>
+	 */
+	public void setNumberStyleAttribute(String numberStyleValue) {
+		NumberStyleAttribute attr = new NumberStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(numberStyleValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAnnotationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAnnotationElement.java
new file mode 100644
index 0000000..b1b8fe4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAnnotationElement.java
@@ -0,0 +1,434 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDateStringElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionPointXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionPointYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCornerRadiusAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLayerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawShapeElementBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:annotation}.
+ *
+ */
+public class OfficeAnnotationElement extends DrawShapeElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "annotation");
+
+	/**
+	 * Create the instance of <code>OfficeAnnotationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeAnnotationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:annotation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionPointXAttribute</code> , See {@odf.attribute draw:caption-point-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionPointXAttribute() {
+		DrawCaptionPointXAttribute attr = (DrawCaptionPointXAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-point-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionPointXAttribute</code> , See {@odf.attribute draw:caption-point-x}
+	 *
+	 * @param drawCaptionPointXValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionPointXAttribute(String drawCaptionPointXValue) {
+		DrawCaptionPointXAttribute attr = new DrawCaptionPointXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionPointXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionPointYAttribute</code> , See {@odf.attribute draw:caption-point-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionPointYAttribute() {
+		DrawCaptionPointYAttribute attr = (DrawCaptionPointYAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-point-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionPointYAttribute</code> , See {@odf.attribute draw:caption-point-y}
+	 *
+	 * @param drawCaptionPointYValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionPointYAttribute(String drawCaptionPointYValue) {
+		DrawCaptionPointYAttribute attr = new DrawCaptionPointYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionPointYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCornerRadiusAttribute() {
+		DrawCornerRadiusAttribute attr = (DrawCornerRadiusAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "corner-radius");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCornerRadiusAttribute</code> , See {@odf.attribute draw:corner-radius}
+	 *
+	 * @param drawCornerRadiusValue   The type is <code>String</code>
+	 */
+	public void setDrawCornerRadiusAttribute(String drawCornerRadiusValue) {
+		DrawCornerRadiusAttribute attr = new DrawCornerRadiusAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCornerRadiusValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLayerAttribute() {
+		DrawLayerAttribute attr = (DrawLayerAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "layer");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLayerAttribute</code> , See {@odf.attribute draw:layer}
+	 *
+	 * @param drawLayerValue   The type is <code>String</code>
+	 */
+	public void setDrawLayerAttribute(String drawLayerValue) {
+		DrawLayerAttribute attr = new DrawLayerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLayerValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextStyleNameAttribute() {
+		DrawTextStyleNameAttribute attr = (DrawTextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "text-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextStyleNameAttribute</code> , See {@odf.attribute draw:text-style-name}
+	 *
+	 * @param drawTextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawTextStyleNameAttribute(String drawTextStyleNameValue) {
+		DrawTextStyleNameAttribute attr = new DrawTextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTransformAttribute() {
+		DrawTransformAttribute attr = (DrawTransformAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTransformAttribute</code> , See {@odf.attribute draw:transform}
+	 *
+	 * @param drawTransformValue   The type is <code>String</code>
+	 */
+	public void setDrawTransformAttribute(String drawTransformValue) {
+		DrawTransformAttribute attr = new DrawTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDisplayAttribute</code> , See {@odf.attribute office:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeDisplayAttribute() {
+		OfficeDisplayAttribute attr = (OfficeDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDisplayAttribute</code> , See {@odf.attribute office:display}
+	 *
+	 * @param officeDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeDisplayAttribute(Boolean officeDisplayValue) {
+		OfficeDisplayAttribute attr = new OfficeDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dc:creator}.
+	 *
+	 * @return the element {@odf.element dc:creator}
+	 */
+	public DcCreatorElement newDcCreatorElement() {
+		DcCreatorElement dcCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(DcCreatorElement.class);
+		this.appendChild(dcCreator);
+		return dcCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:date}.
+	 *
+	 * @return the element {@odf.element dc:date}
+	 */
+	public DcDateElement newDcDateElement() {
+		DcDateElement dcDate = ((OdfFileDom) this.ownerDocument).newOdfElement(DcDateElement.class);
+		this.appendChild(dcDate);
+		return dcDate;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:date-string}.
+	 *
+	 * @return the element {@odf.element meta:date-string}
+	 */
+	public MetaDateStringElement newMetaDateStringElement() {
+		MetaDateStringElement metaDateString = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaDateStringElement.class);
+		this.appendChild(metaDateString);
+		return metaDateString;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAnnotationEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAnnotationEndElement.java
new file mode 100644
index 0000000..bb65a72
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAnnotationEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:annotation-end}.
+ *
+ */
+public class OfficeAnnotationEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "annotation-end");
+
+	/**
+	 * Create the instance of <code>OfficeAnnotationEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeAnnotationEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:annotation-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAutomaticStylesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAutomaticStylesElement.java
new file mode 100644
index 0000000..bff8d33
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeAutomaticStylesElement.java
@@ -0,0 +1,214 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencyStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDateStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberPercentageStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTimeStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListStyleElement;
+import org.odftoolkit.odfdom.pkg.OdfContainerElementBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:automatic-styles}.
+ *
+ */
+public class OfficeAutomaticStylesElement extends OdfContainerElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "automatic-styles");
+
+	/**
+	 * Create the instance of <code>OfficeAutomaticStylesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeAutomaticStylesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:automatic-styles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element number:boolean-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:boolean-style}
+	 */
+	 public NumberBooleanStyleElement newNumberBooleanStyleElement(String styleNameValue) {
+		NumberBooleanStyleElement numberBooleanStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberBooleanStyleElement.class);
+		numberBooleanStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberBooleanStyle);
+		return numberBooleanStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:currency-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:currency-style}
+	 */
+	 public NumberCurrencyStyleElement newNumberCurrencyStyleElement(String styleNameValue) {
+		NumberCurrencyStyleElement numberCurrencyStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberCurrencyStyleElement.class);
+		numberCurrencyStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberCurrencyStyle);
+		return numberCurrencyStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:date-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:date-style}
+	 */
+	 public NumberDateStyleElement newNumberDateStyleElement(String styleNameValue) {
+		NumberDateStyleElement numberDateStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberDateStyleElement.class);
+		numberDateStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberDateStyle);
+		return numberDateStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:number-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:number-style}
+	 */
+	 public NumberNumberStyleElement newNumberNumberStyleElement(String styleNameValue) {
+		NumberNumberStyleElement numberNumberStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberNumberStyleElement.class);
+		numberNumberStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberNumberStyle);
+		return numberNumberStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:percentage-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:percentage-style}
+	 */
+	 public NumberPercentageStyleElement newNumberPercentageStyleElement(String styleNameValue) {
+		NumberPercentageStyleElement numberPercentageStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberPercentageStyleElement.class);
+		numberPercentageStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberPercentageStyle);
+		return numberPercentageStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:text-style}
+	 */
+	 public NumberTextStyleElement newNumberTextStyleElement(String styleNameValue) {
+		NumberTextStyleElement numberTextStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextStyleElement.class);
+		numberTextStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberTextStyle);
+		return numberTextStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:time-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:time-style}
+	 */
+	 public NumberTimeStyleElement newNumberTimeStyleElement(String styleNameValue) {
+		NumberTimeStyleElement numberTimeStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTimeStyleElement.class);
+		numberTimeStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberTimeStyle);
+		return numberTimeStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:page-layout}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element style:page-layout}
+	 */
+	 public StylePageLayoutElement newStylePageLayoutElement(String styleNameValue) {
+		StylePageLayoutElement stylePageLayout = ((OdfFileDom) this.ownerDocument).newOdfElement(StylePageLayoutElement.class);
+		stylePageLayout.setStyleNameAttribute(styleNameValue);
+		this.appendChild(stylePageLayout);
+		return stylePageLayout;
+	}
+
+	/**
+	 * Create child element {@odf.element style:style}.
+	 *
+	 * @param styleFamilyValue  the <code>String</code> value of <code>StyleFamilyAttribute</code>, see {@odf.attribute  style:family} at specification
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element style:style}
+	 */
+	 public StyleStyleElement newStyleStyleElement(String styleFamilyValue, String styleNameValue) {
+		StyleStyleElement styleStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleStyleElement.class);
+		styleStyle.setStyleFamilyAttribute(styleFamilyValue);
+		styleStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(styleStyle);
+		return styleStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element text:list-style}
+	 */
+	 public TextListStyleElement newTextListStyleElement(String styleNameValue) {
+		TextListStyleElement textListStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListStyleElement.class);
+		textListStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(textListStyle);
+		return textListStyle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeBinaryDataElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeBinaryDataElement.java
new file mode 100644
index 0000000..22f5ae1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeBinaryDataElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:binary-data}.
+ *
+ */
+public class OfficeBinaryDataElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "binary-data");
+
+	/**
+	 * Create the instance of <code>OfficeBinaryDataElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeBinaryDataElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:binary-data}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeBodyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeBodyElement.java
new file mode 100644
index 0000000..fb13aba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeBodyElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:body}.
+ *
+ */
+public class OfficeBodyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "body");
+
+	/**
+	 * Create the instance of <code>OfficeBodyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeBodyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:body}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element office:chart}.
+	 *
+	 * @return the element {@odf.element office:chart}
+	 */
+	public OfficeChartElement newOfficeChartElement() {
+		OfficeChartElement officeChart = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChartElement.class);
+		this.appendChild(officeChart);
+		return officeChart;
+	}
+
+	/**
+	 * Create child element {@odf.element office:database}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:database}
+	 */
+	public OfficeDatabaseElement newOfficeDatabaseElement() {
+		OfficeDatabaseElement officeDatabase = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDatabaseElement.class);
+		this.appendChild(officeDatabase);
+		return officeDatabase;
+	}
+
+	/**
+	 * Create child element {@odf.element office:drawing}.
+	 *
+	 * @return the element {@odf.element office:drawing}
+	 */
+	public OfficeDrawingElement newOfficeDrawingElement() {
+		OfficeDrawingElement officeDrawing = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDrawingElement.class);
+		this.appendChild(officeDrawing);
+		return officeDrawing;
+	}
+
+	/**
+	 * Create child element {@odf.element office:image}.
+	 *
+	 * @return the element {@odf.element office:image}
+	 */
+	public OfficeImageElement newOfficeImageElement() {
+		OfficeImageElement officeImage = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeImageElement.class);
+		this.appendChild(officeImage);
+		return officeImage;
+	}
+
+	/**
+	 * Create child element {@odf.element office:presentation}.
+	 *
+	 * @return the element {@odf.element office:presentation}
+	 */
+	public OfficePresentationElement newOfficePresentationElement() {
+		OfficePresentationElement officePresentation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficePresentationElement.class);
+		this.appendChild(officePresentation);
+		return officePresentation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:spreadsheet}.
+	 *
+	 * @return the element {@odf.element office:spreadsheet}
+	 */
+	public OfficeSpreadsheetElement newOfficeSpreadsheetElement() {
+		OfficeSpreadsheetElement officeSpreadsheet = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeSpreadsheetElement.class);
+		this.appendChild(officeSpreadsheet);
+		return officeSpreadsheet;
+	}
+
+	/**
+	 * Create child element {@odf.element office:text}.
+	 *
+	 * @return the element {@odf.element office:text}
+	 */
+	public OfficeTextElement newOfficeTextElement() {
+		OfficeTextElement officeText = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeTextElement.class);
+		this.appendChild(officeText);
+		return officeText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeChangeInfoElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeChangeInfoElement.java
new file mode 100644
index 0000000..2ef4466
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeChangeInfoElement.java
@@ -0,0 +1,111 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:change-info}.
+ *
+ */
+public class OfficeChangeInfoElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "change-info");
+
+	/**
+	 * Create the instance of <code>OfficeChangeInfoElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeChangeInfoElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:change-info}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:creator}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element dc:creator}
+	 */
+	public DcCreatorElement newDcCreatorElement() {
+		DcCreatorElement dcCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(DcCreatorElement.class);
+		this.appendChild(dcCreator);
+		return dcCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:date}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element dc:date}
+	 */
+	public DcDateElement newDcDateElement() {
+		DcDateElement dcDate = ((OdfFileDom) this.ownerDocument).newOdfElement(DcDateElement.class);
+		this.appendChild(dcDate);
+		return dcDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeChartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeChartElement.java
new file mode 100644
index 0000000..88dfb64
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeChartElement.java
@@ -0,0 +1,253 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.chart.ChartChartElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableConsolidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTablesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinksElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:chart}.
+ *
+ */
+public class OfficeChartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "chart");
+
+	/**
+	 * Create the instance of <code>OfficeChartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeChartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:chart}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:chart}.
+	 *
+	 * @param chartClassValue  the <code>String</code> value of <code>ChartClassAttribute</code>, see {@odf.attribute  chart:class} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element chart:chart}
+	 */
+	 public ChartChartElement newChartChartElement(String chartClassValue) {
+		ChartChartElement chartChart = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartChartElement.class);
+		chartChart.setChartClassAttribute(chartClassValue);
+		this.appendChild(chartChart);
+		return chartChart;
+	}
+
+	/**
+	 * Create child element {@odf.element table:calculation-settings}.
+	 *
+	 * @return the element {@odf.element table:calculation-settings}
+	 */
+	public TableCalculationSettingsElement newTableCalculationSettingsElement() {
+		TableCalculationSettingsElement tableCalculationSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCalculationSettingsElement.class);
+		this.appendChild(tableCalculationSettings);
+		return tableCalculationSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element table:consolidation}.
+	 *
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @param tableSourceCellRangeAddressesValue  the <code>String</code> value of <code>TableSourceCellRangeAddressesAttribute</code>, see {@odf.attribute  table:source-cell-range-addresses} at specification
+	 * @param tableTargetCellAddressValue  the <code>String</code> value of <code>TableTargetCellAddressAttribute</code>, see {@odf.attribute  table:target-cell-address} at specification
+	 * @return the element {@odf.element table:consolidation}
+	 */
+	 public TableConsolidationElement newTableConsolidationElement(String tableFunctionValue, String tableSourceCellRangeAddressesValue, String tableTargetCellAddressValue) {
+		TableConsolidationElement tableConsolidation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableConsolidationElement.class);
+		tableConsolidation.setTableFunctionAttribute(tableFunctionValue);
+		tableConsolidation.setTableSourceCellRangeAddressesAttribute(tableSourceCellRangeAddressesValue);
+		tableConsolidation.setTableTargetCellAddressAttribute(tableTargetCellAddressValue);
+		this.appendChild(tableConsolidation);
+		return tableConsolidation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:content-validations}.
+	 *
+	 * @return the element {@odf.element table:content-validations}
+	 */
+	public TableContentValidationsElement newTableContentValidationsElement() {
+		TableContentValidationsElement tableContentValidations = ((OdfFileDom) this.ownerDocument).newOdfElement(TableContentValidationsElement.class);
+		this.appendChild(tableContentValidations);
+		return tableContentValidations;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-tables}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-tables}
+	 */
+	public TableDataPilotTablesElement newTableDataPilotTablesElement() {
+		TableDataPilotTablesElement tableDataPilotTables = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotTablesElement.class);
+		this.appendChild(tableDataPilotTables);
+		return tableDataPilotTables;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-ranges}.
+	 *
+	 * @return the element {@odf.element table:database-ranges}
+	 */
+	public TableDatabaseRangesElement newTableDatabaseRangesElement() {
+		TableDatabaseRangesElement tableDatabaseRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseRangesElement.class);
+		this.appendChild(tableDatabaseRanges);
+		return tableDatabaseRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dde-links}.
+	 *
+	 * @return the element {@odf.element table:dde-links}
+	 */
+	public TableDdeLinksElement newTableDdeLinksElement() {
+		TableDdeLinksElement tableDdeLinks = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDdeLinksElement.class);
+		this.appendChild(tableDdeLinks);
+		return tableDdeLinks;
+	}
+
+	/**
+	 * Create child element {@odf.element table:label-ranges}.
+	 *
+	 * @return the element {@odf.element table:label-ranges}
+	 */
+	public TableLabelRangesElement newTableLabelRangesElement() {
+		TableLabelRangesElement tableLabelRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLabelRangesElement.class);
+		this.appendChild(tableLabelRanges);
+		return tableLabelRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expressions}.
+	 *
+	 * @return the element {@odf.element table:named-expressions}
+	 */
+	public TableNamedExpressionsElement newTableNamedExpressionsElement() {
+		TableNamedExpressionsElement tableNamedExpressions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionsElement.class);
+		this.appendChild(tableNamedExpressions);
+		return tableNamedExpressions;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDatabaseElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDatabaseElement.java
new file mode 100644
index 0000000..52b06bf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDatabaseElement.java
@@ -0,0 +1,157 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.db.DbDataSourceElement;
+import org.odftoolkit.odfdom.dom.element.db.DbFormsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbQueriesElement;
+import org.odftoolkit.odfdom.dom.element.db.DbReportsElement;
+import org.odftoolkit.odfdom.dom.element.db.DbSchemaDefinitionElement;
+import org.odftoolkit.odfdom.dom.element.db.DbTableRepresentationsElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:database}.
+ *
+ */
+public class OfficeDatabaseElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "database");
+
+	/**
+	 * Create the instance of <code>OfficeDatabaseElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDatabaseElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:database}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element db:data-source}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element db:data-source}
+	 */
+	public DbDataSourceElement newDbDataSourceElement() {
+		DbDataSourceElement dbDataSource = ((OdfFileDom) this.ownerDocument).newOdfElement(DbDataSourceElement.class);
+		this.appendChild(dbDataSource);
+		return dbDataSource;
+	}
+
+	/**
+	 * Create child element {@odf.element db:forms}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:forms}
+	 */
+	public DbFormsElement newDbFormsElement() {
+		DbFormsElement dbForms = ((OdfFileDom) this.ownerDocument).newOdfElement(DbFormsElement.class);
+		this.appendChild(dbForms);
+		return dbForms;
+	}
+
+	/**
+	 * Create child element {@odf.element db:queries}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:queries}
+	 */
+	public DbQueriesElement newDbQueriesElement() {
+		DbQueriesElement dbQueries = ((OdfFileDom) this.ownerDocument).newOdfElement(DbQueriesElement.class);
+		this.appendChild(dbQueries);
+		return dbQueries;
+	}
+
+	/**
+	 * Create child element {@odf.element db:reports}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:reports}
+	 */
+	public DbReportsElement newDbReportsElement() {
+		DbReportsElement dbReports = ((OdfFileDom) this.ownerDocument).newOdfElement(DbReportsElement.class);
+		this.appendChild(dbReports);
+		return dbReports;
+	}
+
+	/**
+	 * Create child element {@odf.element db:schema-definition}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:schema-definition}
+	 */
+	public DbSchemaDefinitionElement newDbSchemaDefinitionElement() {
+		DbSchemaDefinitionElement dbSchemaDefinition = ((OdfFileDom) this.ownerDocument).newOdfElement(DbSchemaDefinitionElement.class);
+		this.appendChild(dbSchemaDefinition);
+		return dbSchemaDefinition;
+	}
+
+	/**
+	 * Create child element {@odf.element db:table-representations}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element db:table-representations}
+	 */
+	public DbTableRepresentationsElement newDbTableRepresentationsElement() {
+		DbTableRepresentationsElement dbTableRepresentations = ((OdfFileDom) this.ownerDocument).newOdfElement(DbTableRepresentationsElement.class);
+		this.appendChild(dbTableRepresentations);
+		return dbTableRepresentations;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDdeSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDdeSourceElement.java
new file mode 100644
index 0000000..ca53ba6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDdeSourceElement.java
@@ -0,0 +1,227 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeAutomaticUpdateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeConversionModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDdeApplicationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDdeItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDdeTopicAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:dde-source}.
+ *
+ */
+public class OfficeDdeSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "dde-source");
+
+	/**
+	 * Create the instance of <code>OfficeDdeSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDdeSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:dde-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeAutomaticUpdateAttribute</code> , See {@odf.attribute office:automatic-update}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeAutomaticUpdateAttribute() {
+		OfficeAutomaticUpdateAttribute attr = (OfficeAutomaticUpdateAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "automatic-update");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(OfficeAutomaticUpdateAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeAutomaticUpdateAttribute</code> , See {@odf.attribute office:automatic-update}
+	 *
+	 * @param officeAutomaticUpdateValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeAutomaticUpdateAttribute(Boolean officeAutomaticUpdateValue) {
+		OfficeAutomaticUpdateAttribute attr = new OfficeAutomaticUpdateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeAutomaticUpdateValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeConversionModeAttribute</code> , See {@odf.attribute office:conversion-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeConversionModeAttribute() {
+		OfficeConversionModeAttribute attr = (OfficeConversionModeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "conversion-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return OfficeConversionModeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeConversionModeAttribute</code> , See {@odf.attribute office:conversion-mode}
+	 *
+	 * @param officeConversionModeValue   The type is <code>String</code>
+	 */
+	public void setOfficeConversionModeAttribute(String officeConversionModeValue) {
+		OfficeConversionModeAttribute attr = new OfficeConversionModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeConversionModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDdeApplicationAttribute</code> , See {@odf.attribute office:dde-application}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDdeApplicationAttribute() {
+		OfficeDdeApplicationAttribute attr = (OfficeDdeApplicationAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "dde-application");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDdeApplicationAttribute</code> , See {@odf.attribute office:dde-application}
+	 *
+	 * @param officeDdeApplicationValue   The type is <code>String</code>
+	 */
+	public void setOfficeDdeApplicationAttribute(String officeDdeApplicationValue) {
+		OfficeDdeApplicationAttribute attr = new OfficeDdeApplicationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDdeApplicationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDdeItemAttribute</code> , See {@odf.attribute office:dde-item}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDdeItemAttribute() {
+		OfficeDdeItemAttribute attr = (OfficeDdeItemAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "dde-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDdeItemAttribute</code> , See {@odf.attribute office:dde-item}
+	 *
+	 * @param officeDdeItemValue   The type is <code>String</code>
+	 */
+	public void setOfficeDdeItemAttribute(String officeDdeItemValue) {
+		OfficeDdeItemAttribute attr = new OfficeDdeItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDdeItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDdeTopicAttribute</code> , See {@odf.attribute office:dde-topic}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDdeTopicAttribute() {
+		OfficeDdeTopicAttribute attr = (OfficeDdeTopicAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "dde-topic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDdeTopicAttribute</code> , See {@odf.attribute office:dde-topic}
+	 *
+	 * @param officeDdeTopicValue   The type is <code>String</code>
+	 */
+	public void setOfficeDdeTopicAttribute(String officeDdeTopicValue) {
+		OfficeDdeTopicAttribute attr = new OfficeDdeTopicAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDdeTopicValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentContentElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentContentElement.java
new file mode 100644
index 0000000..8915241
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentContentElement.java
@@ -0,0 +1,169 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.grddl.GrddlTransformationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:document-content}.
+ *
+ */
+public class OfficeDocumentContentElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "document-content");
+
+	/**
+	 * Create the instance of <code>OfficeDocumentContentElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDocumentContentElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:document-content}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getGrddlTransformationAttribute() {
+		GrddlTransformationAttribute attr = (GrddlTransformationAttribute) getOdfAttribute(OdfDocumentNamespace.GRDDL, "transformation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @param grddlTransformationValue   The type is <code>String</code>
+	 */
+	public void setGrddlTransformationAttribute(String grddlTransformationValue) {
+		GrddlTransformationAttribute attr = new GrddlTransformationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(grddlTransformationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeVersionAttribute() {
+		OfficeVersionAttribute attr = (OfficeVersionAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "version");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * @param officeVersionValue   The type is <code>String</code>
+	 */
+	public void setOfficeVersionAttribute(String officeVersionValue) {
+		OfficeVersionAttribute attr = new OfficeVersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeVersionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:automatic-styles}.
+	 *
+	 * @return the element {@odf.element office:automatic-styles}
+	 */
+	public OfficeAutomaticStylesElement newOfficeAutomaticStylesElement() {
+		OfficeAutomaticStylesElement officeAutomaticStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAutomaticStylesElement.class);
+		this.appendChild(officeAutomaticStyles);
+		return officeAutomaticStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element office:body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:body}
+	 */
+	public OfficeBodyElement newOfficeBodyElement() {
+		OfficeBodyElement officeBody = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeBodyElement.class);
+		this.appendChild(officeBody);
+		return officeBody;
+	}
+
+	/**
+	 * Create child element {@odf.element office:font-face-decls}.
+	 *
+	 * @return the element {@odf.element office:font-face-decls}
+	 */
+	public OfficeFontFaceDeclsElement newOfficeFontFaceDeclsElement() {
+		OfficeFontFaceDeclsElement officeFontFaceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFontFaceDeclsElement.class);
+		this.appendChild(officeFontFaceDecls);
+		return officeFontFaceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element office:scripts}.
+	 *
+	 * @return the element {@odf.element office:scripts}
+	 */
+	public OfficeScriptsElement newOfficeScriptsElement() {
+		OfficeScriptsElement officeScripts = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeScriptsElement.class);
+		this.appendChild(officeScripts);
+		return officeScripts;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentElement.java
new file mode 100644
index 0000000..7b0de67
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentElement.java
@@ -0,0 +1,240 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.grddl.GrddlTransformationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeMimetypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:document}.
+ *
+ */
+public class OfficeDocumentElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "document");
+
+	/**
+	 * Create the instance of <code>OfficeDocumentElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDocumentElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:document}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getGrddlTransformationAttribute() {
+		GrddlTransformationAttribute attr = (GrddlTransformationAttribute) getOdfAttribute(OdfDocumentNamespace.GRDDL, "transformation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @param grddlTransformationValue   The type is <code>String</code>
+	 */
+	public void setGrddlTransformationAttribute(String grddlTransformationValue) {
+		GrddlTransformationAttribute attr = new GrddlTransformationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(grddlTransformationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeMimetypeAttribute</code> , See {@odf.attribute office:mimetype}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeMimetypeAttribute() {
+		OfficeMimetypeAttribute attr = (OfficeMimetypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "mimetype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeMimetypeAttribute</code> , See {@odf.attribute office:mimetype}
+	 *
+	 * @param officeMimetypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeMimetypeAttribute(String officeMimetypeValue) {
+		OfficeMimetypeAttribute attr = new OfficeMimetypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeMimetypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeVersionAttribute() {
+		OfficeVersionAttribute attr = (OfficeVersionAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "version");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * @param officeVersionValue   The type is <code>String</code>
+	 */
+	public void setOfficeVersionAttribute(String officeVersionValue) {
+		OfficeVersionAttribute attr = new OfficeVersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeVersionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:automatic-styles}.
+	 *
+	 * @return the element {@odf.element office:automatic-styles}
+	 */
+	public OfficeAutomaticStylesElement newOfficeAutomaticStylesElement() {
+		OfficeAutomaticStylesElement officeAutomaticStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAutomaticStylesElement.class);
+		this.appendChild(officeAutomaticStyles);
+		return officeAutomaticStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element office:body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:body}
+	 */
+	public OfficeBodyElement newOfficeBodyElement() {
+		OfficeBodyElement officeBody = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeBodyElement.class);
+		this.appendChild(officeBody);
+		return officeBody;
+	}
+
+	/**
+	 * Create child element {@odf.element office:font-face-decls}.
+	 *
+	 * @return the element {@odf.element office:font-face-decls}
+	 */
+	public OfficeFontFaceDeclsElement newOfficeFontFaceDeclsElement() {
+		OfficeFontFaceDeclsElement officeFontFaceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFontFaceDeclsElement.class);
+		this.appendChild(officeFontFaceDecls);
+		return officeFontFaceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element office:master-styles}.
+	 *
+	 * @return the element {@odf.element office:master-styles}
+	 */
+	public OfficeMasterStylesElement newOfficeMasterStylesElement() {
+		OfficeMasterStylesElement officeMasterStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeMasterStylesElement.class);
+		this.appendChild(officeMasterStyles);
+		return officeMasterStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element office:meta}.
+	 *
+	 * @return the element {@odf.element office:meta}
+	 */
+	public OfficeMetaElement newOfficeMetaElement() {
+		OfficeMetaElement officeMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeMetaElement.class);
+		this.appendChild(officeMeta);
+		return officeMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element office:scripts}.
+	 *
+	 * @return the element {@odf.element office:scripts}
+	 */
+	public OfficeScriptsElement newOfficeScriptsElement() {
+		OfficeScriptsElement officeScripts = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeScriptsElement.class);
+		this.appendChild(officeScripts);
+		return officeScripts;
+	}
+
+	/**
+	 * Create child element {@odf.element office:settings}.
+	 *
+	 * @return the element {@odf.element office:settings}
+	 */
+	public OfficeSettingsElement newOfficeSettingsElement() {
+		OfficeSettingsElement officeSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeSettingsElement.class);
+		this.appendChild(officeSettings);
+		return officeSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element office:styles}.
+	 *
+	 * @return the element {@odf.element office:styles}
+	 */
+	public OfficeStylesElement newOfficeStylesElement() {
+		OfficeStylesElement officeStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeStylesElement.class);
+		this.appendChild(officeStyles);
+		return officeStyles;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentMetaElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentMetaElement.java
new file mode 100644
index 0000000..0e99f1b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentMetaElement.java
@@ -0,0 +1,134 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.grddl.GrddlTransformationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:document-meta}.
+ *
+ */
+public class OfficeDocumentMetaElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "document-meta");
+
+	/**
+	 * Create the instance of <code>OfficeDocumentMetaElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDocumentMetaElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:document-meta}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getGrddlTransformationAttribute() {
+		GrddlTransformationAttribute attr = (GrddlTransformationAttribute) getOdfAttribute(OdfDocumentNamespace.GRDDL, "transformation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @param grddlTransformationValue   The type is <code>String</code>
+	 */
+	public void setGrddlTransformationAttribute(String grddlTransformationValue) {
+		GrddlTransformationAttribute attr = new GrddlTransformationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(grddlTransformationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeVersionAttribute() {
+		OfficeVersionAttribute attr = (OfficeVersionAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "version");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * @param officeVersionValue   The type is <code>String</code>
+	 */
+	public void setOfficeVersionAttribute(String officeVersionValue) {
+		OfficeVersionAttribute attr = new OfficeVersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeVersionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:meta}.
+	 *
+	 * @return the element {@odf.element office:meta}
+	 */
+	public OfficeMetaElement newOfficeMetaElement() {
+		OfficeMetaElement officeMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeMetaElement.class);
+		this.appendChild(officeMeta);
+		return officeMeta;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentSettingsElement.java
new file mode 100644
index 0000000..43375e9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentSettingsElement.java
@@ -0,0 +1,134 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.grddl.GrddlTransformationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:document-settings}.
+ *
+ */
+public class OfficeDocumentSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "document-settings");
+
+	/**
+	 * Create the instance of <code>OfficeDocumentSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDocumentSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:document-settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getGrddlTransformationAttribute() {
+		GrddlTransformationAttribute attr = (GrddlTransformationAttribute) getOdfAttribute(OdfDocumentNamespace.GRDDL, "transformation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @param grddlTransformationValue   The type is <code>String</code>
+	 */
+	public void setGrddlTransformationAttribute(String grddlTransformationValue) {
+		GrddlTransformationAttribute attr = new GrddlTransformationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(grddlTransformationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeVersionAttribute() {
+		OfficeVersionAttribute attr = (OfficeVersionAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "version");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * @param officeVersionValue   The type is <code>String</code>
+	 */
+	public void setOfficeVersionAttribute(String officeVersionValue) {
+		OfficeVersionAttribute attr = new OfficeVersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeVersionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:settings}.
+	 *
+	 * @return the element {@odf.element office:settings}
+	 */
+	public OfficeSettingsElement newOfficeSettingsElement() {
+		OfficeSettingsElement officeSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeSettingsElement.class);
+		this.appendChild(officeSettings);
+		return officeSettings;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentStylesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentStylesElement.java
new file mode 100644
index 0000000..17fa6ad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDocumentStylesElement.java
@@ -0,0 +1,167 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.grddl.GrddlTransformationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:document-styles}.
+ *
+ */
+public class OfficeDocumentStylesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "document-styles");
+
+	/**
+	 * Create the instance of <code>OfficeDocumentStylesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDocumentStylesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:document-styles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getGrddlTransformationAttribute() {
+		GrddlTransformationAttribute attr = (GrddlTransformationAttribute) getOdfAttribute(OdfDocumentNamespace.GRDDL, "transformation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>GrddlTransformationAttribute</code> , See {@odf.attribute grddl:transformation}
+	 *
+	 * @param grddlTransformationValue   The type is <code>String</code>
+	 */
+	public void setGrddlTransformationAttribute(String grddlTransformationValue) {
+		GrddlTransformationAttribute attr = new GrddlTransformationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(grddlTransformationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeVersionAttribute() {
+		OfficeVersionAttribute attr = (OfficeVersionAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "version");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeVersionAttribute</code> , See {@odf.attribute office:version}
+	 *
+	 * @param officeVersionValue   The type is <code>String</code>
+	 */
+	public void setOfficeVersionAttribute(String officeVersionValue) {
+		OfficeVersionAttribute attr = new OfficeVersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeVersionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:automatic-styles}.
+	 *
+	 * @return the element {@odf.element office:automatic-styles}
+	 */
+	public OfficeAutomaticStylesElement newOfficeAutomaticStylesElement() {
+		OfficeAutomaticStylesElement officeAutomaticStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAutomaticStylesElement.class);
+		this.appendChild(officeAutomaticStyles);
+		return officeAutomaticStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element office:font-face-decls}.
+	 *
+	 * @return the element {@odf.element office:font-face-decls}
+	 */
+	public OfficeFontFaceDeclsElement newOfficeFontFaceDeclsElement() {
+		OfficeFontFaceDeclsElement officeFontFaceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFontFaceDeclsElement.class);
+		this.appendChild(officeFontFaceDecls);
+		return officeFontFaceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element office:master-styles}.
+	 *
+	 * @return the element {@odf.element office:master-styles}
+	 */
+	public OfficeMasterStylesElement newOfficeMasterStylesElement() {
+		OfficeMasterStylesElement officeMasterStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeMasterStylesElement.class);
+		this.appendChild(officeMasterStyles);
+		return officeMasterStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element office:styles}.
+	 *
+	 * @return the element {@odf.element office:styles}
+	 */
+	public OfficeStylesElement newOfficeStylesElement() {
+		OfficeStylesElement officeStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeStylesElement.class);
+		this.appendChild(officeStyles);
+		return officeStyles;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDrawingElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDrawingElement.java
new file mode 100644
index 0000000..1133241
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeDrawingElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableConsolidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTablesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinksElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:drawing}.
+ *
+ */
+public class OfficeDrawingElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "drawing");
+
+	/**
+	 * Create the instance of <code>OfficeDrawingElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeDrawingElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:drawing}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page}.
+	 *
+	 * @param drawMasterPageNameValue  the <code>String</code> value of <code>DrawMasterPageNameAttribute</code>, see {@odf.attribute  draw:master-page-name} at specification
+	 * @return the element {@odf.element draw:page}
+	 */
+	 public DrawPageElement newDrawPageElement(String drawMasterPageNameValue) {
+		DrawPageElement drawPage = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageElement.class);
+		drawPage.setDrawMasterPageNameAttribute(drawMasterPageNameValue);
+		this.appendChild(drawPage);
+		return drawPage;
+	}
+
+	/**
+	 * Create child element {@odf.element table:calculation-settings}.
+	 *
+	 * @return the element {@odf.element table:calculation-settings}
+	 */
+	public TableCalculationSettingsElement newTableCalculationSettingsElement() {
+		TableCalculationSettingsElement tableCalculationSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCalculationSettingsElement.class);
+		this.appendChild(tableCalculationSettings);
+		return tableCalculationSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element table:consolidation}.
+	 *
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @param tableSourceCellRangeAddressesValue  the <code>String</code> value of <code>TableSourceCellRangeAddressesAttribute</code>, see {@odf.attribute  table:source-cell-range-addresses} at specification
+	 * @param tableTargetCellAddressValue  the <code>String</code> value of <code>TableTargetCellAddressAttribute</code>, see {@odf.attribute  table:target-cell-address} at specification
+	 * @return the element {@odf.element table:consolidation}
+	 */
+	 public TableConsolidationElement newTableConsolidationElement(String tableFunctionValue, String tableSourceCellRangeAddressesValue, String tableTargetCellAddressValue) {
+		TableConsolidationElement tableConsolidation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableConsolidationElement.class);
+		tableConsolidation.setTableFunctionAttribute(tableFunctionValue);
+		tableConsolidation.setTableSourceCellRangeAddressesAttribute(tableSourceCellRangeAddressesValue);
+		tableConsolidation.setTableTargetCellAddressAttribute(tableTargetCellAddressValue);
+		this.appendChild(tableConsolidation);
+		return tableConsolidation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:content-validations}.
+	 *
+	 * @return the element {@odf.element table:content-validations}
+	 */
+	public TableContentValidationsElement newTableContentValidationsElement() {
+		TableContentValidationsElement tableContentValidations = ((OdfFileDom) this.ownerDocument).newOdfElement(TableContentValidationsElement.class);
+		this.appendChild(tableContentValidations);
+		return tableContentValidations;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-tables}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-tables}
+	 */
+	public TableDataPilotTablesElement newTableDataPilotTablesElement() {
+		TableDataPilotTablesElement tableDataPilotTables = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotTablesElement.class);
+		this.appendChild(tableDataPilotTables);
+		return tableDataPilotTables;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-ranges}.
+	 *
+	 * @return the element {@odf.element table:database-ranges}
+	 */
+	public TableDatabaseRangesElement newTableDatabaseRangesElement() {
+		TableDatabaseRangesElement tableDatabaseRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseRangesElement.class);
+		this.appendChild(tableDatabaseRanges);
+		return tableDatabaseRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dde-links}.
+	 *
+	 * @return the element {@odf.element table:dde-links}
+	 */
+	public TableDdeLinksElement newTableDdeLinksElement() {
+		TableDdeLinksElement tableDdeLinks = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDdeLinksElement.class);
+		this.appendChild(tableDdeLinks);
+		return tableDdeLinks;
+	}
+
+	/**
+	 * Create child element {@odf.element table:label-ranges}.
+	 *
+	 * @return the element {@odf.element table:label-ranges}
+	 */
+	public TableLabelRangesElement newTableLabelRangesElement() {
+		TableLabelRangesElement tableLabelRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLabelRangesElement.class);
+		this.appendChild(tableLabelRanges);
+		return tableLabelRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expressions}.
+	 *
+	 * @return the element {@odf.element table:named-expressions}
+	 */
+	public TableNamedExpressionsElement newTableNamedExpressionsElement() {
+		TableNamedExpressionsElement tableNamedExpressions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionsElement.class);
+		this.appendChild(tableNamedExpressions);
+		return tableNamedExpressions;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeEventListenersElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeEventListenersElement.java
new file mode 100644
index 0000000..648a639
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeEventListenersElement.java
@@ -0,0 +1,103 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationEventListenerElement;
+import org.odftoolkit.odfdom.dom.element.script.ScriptEventListenerElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:event-listeners}.
+ *
+ */
+public class OfficeEventListenersElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "event-listeners");
+
+	/**
+	 * Create the instance of <code>OfficeEventListenersElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeEventListenersElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:event-listeners}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:event-listener}.
+	 *
+	 * @param presentationActionValue  the <code>String</code> value of <code>PresentationActionAttribute</code>, see {@odf.attribute  presentation:action} at specification
+	 * @param scriptEventNameValue  the <code>String</code> value of <code>ScriptEventNameAttribute</code>, see {@odf.attribute  script:event-name} at specification
+	 * @return the element {@odf.element presentation:event-listener}
+	 */
+	 public PresentationEventListenerElement newPresentationEventListenerElement(String presentationActionValue, String scriptEventNameValue) {
+		PresentationEventListenerElement presentationEventListener = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationEventListenerElement.class);
+		presentationEventListener.setPresentationActionAttribute(presentationActionValue);
+		presentationEventListener.setScriptEventNameAttribute(scriptEventNameValue);
+		this.appendChild(presentationEventListener);
+		return presentationEventListener;
+	}
+
+	/**
+	 * Create child element {@odf.element script:event-listener}.
+	 *
+	 * @param scriptEventNameValue  the <code>String</code> value of <code>ScriptEventNameAttribute</code>, see {@odf.attribute  script:event-name} at specification
+	 * @param scriptLanguageValue  the <code>String</code> value of <code>ScriptLanguageAttribute</code>, see {@odf.attribute  script:language} at specification
+	 * @return the element {@odf.element script:event-listener}
+	 */
+	 public ScriptEventListenerElement newScriptEventListenerElement(String scriptEventNameValue, String scriptLanguageValue) {
+		ScriptEventListenerElement scriptEventListener = ((OdfFileDom) this.ownerDocument).newOdfElement(ScriptEventListenerElement.class);
+		scriptEventListener.setScriptEventNameAttribute(scriptEventNameValue);
+		scriptEventListener.setScriptLanguageAttribute(scriptLanguageValue);
+		this.appendChild(scriptEventListener);
+		return scriptEventListener;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeFontFaceDeclsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeFontFaceDeclsElement.java
new file mode 100644
index 0000000..90185c5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeFontFaceDeclsElement.java
@@ -0,0 +1,85 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleFontFaceElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:font-face-decls}.
+ *
+ */
+public class OfficeFontFaceDeclsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "font-face-decls");
+
+	/**
+	 * Create the instance of <code>OfficeFontFaceDeclsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeFontFaceDeclsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:font-face-decls}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element style:font-face}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element style:font-face}
+	 */
+	 public StyleFontFaceElement newStyleFontFaceElement(String styleNameValue) {
+		StyleFontFaceElement styleFontFace = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleFontFaceElement.class);
+		styleFontFace.setStyleNameAttribute(styleNameValue);
+		this.appendChild(styleFontFace);
+		return styleFontFace;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeFormsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeFormsElement.java
new file mode 100644
index 0000000..57c2ef8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeFormsElement.java
@@ -0,0 +1,145 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.xforms.XformsModelElement;
+import org.odftoolkit.odfdom.dom.attribute.form.FormApplyDesignModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.form.FormAutomaticFocusAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:forms}.
+ *
+ */
+public class OfficeFormsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "forms");
+
+	/**
+	 * Create the instance of <code>OfficeFormsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeFormsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:forms}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormApplyDesignModeAttribute</code> , See {@odf.attribute form:apply-design-mode}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormApplyDesignModeAttribute() {
+		FormApplyDesignModeAttribute attr = (FormApplyDesignModeAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "apply-design-mode");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormApplyDesignModeAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormApplyDesignModeAttribute</code> , See {@odf.attribute form:apply-design-mode}
+	 *
+	 * @param formApplyDesignModeValue   The type is <code>Boolean</code>
+	 */
+	public void setFormApplyDesignModeAttribute(Boolean formApplyDesignModeValue) {
+		FormApplyDesignModeAttribute attr = new FormApplyDesignModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formApplyDesignModeValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FormAutomaticFocusAttribute</code> , See {@odf.attribute form:automatic-focus}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFormAutomaticFocusAttribute() {
+		FormAutomaticFocusAttribute attr = (FormAutomaticFocusAttribute) getOdfAttribute(OdfDocumentNamespace.FORM, "automatic-focus");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(FormAutomaticFocusAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FormAutomaticFocusAttribute</code> , See {@odf.attribute form:automatic-focus}
+	 *
+	 * @param formAutomaticFocusValue   The type is <code>Boolean</code>
+	 */
+	public void setFormAutomaticFocusAttribute(Boolean formAutomaticFocusValue) {
+		FormAutomaticFocusAttribute attr = new FormAutomaticFocusAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(formAutomaticFocusValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element form:form}.
+	 *
+	 * @return the element {@odf.element form:form}
+	 */
+	public FormFormElement newFormFormElement() {
+		FormFormElement formForm = ((OdfFileDom) this.ownerDocument).newOdfElement(FormFormElement.class);
+		this.appendChild(formForm);
+		return formForm;
+	}
+
+	/**
+	 * Create child element {@odf.element xforms:model}.
+	 *
+	 * @return the element {@odf.element xforms:model}
+	 */
+	public XformsModelElement newXformsModelElement() {
+		XformsModelElement xformsModel = ((OdfFileDom) this.ownerDocument).newOdfElement(XformsModelElement.class);
+		this.appendChild(xformsModel);
+		return xformsModel;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeImageElement.java
new file mode 100644
index 0000000..3ed1b04
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeImageElement.java
@@ -0,0 +1,85 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:image}.
+ *
+ */
+public class OfficeImageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "image");
+
+	/**
+	 * Create the instance of <code>OfficeImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeMasterStylesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeMasterStylesElement.java
new file mode 100644
index 0000000..1f91061
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeMasterStylesElement.java
@@ -0,0 +1,114 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLayerSetElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHandoutMasterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.pkg.OdfContainerElementBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:master-styles}.
+ *
+ */
+public class OfficeMasterStylesElement extends OdfContainerElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "master-styles");
+
+	/**
+	 * Create the instance of <code>OfficeMasterStylesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeMasterStylesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:master-styles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:layer-set}.
+	 *
+	 * @return the element {@odf.element draw:layer-set}
+	 */
+	public DrawLayerSetElement newDrawLayerSetElement() {
+		DrawLayerSetElement drawLayerSet = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLayerSetElement.class);
+		this.appendChild(drawLayerSet);
+		return drawLayerSet;
+	}
+
+	/**
+	 * Create child element {@odf.element style:handout-master}.
+	 *
+	 * @param stylePageLayoutNameValue  the <code>String</code> value of <code>StylePageLayoutNameAttribute</code>, see {@odf.attribute  style:page-layout-name} at specification
+	 * @return the element {@odf.element style:handout-master}
+	 */
+	 public StyleHandoutMasterElement newStyleHandoutMasterElement(String stylePageLayoutNameValue) {
+		StyleHandoutMasterElement styleHandoutMaster = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHandoutMasterElement.class);
+		styleHandoutMaster.setStylePageLayoutNameAttribute(stylePageLayoutNameValue);
+		this.appendChild(styleHandoutMaster);
+		return styleHandoutMaster;
+	}
+
+	/**
+	 * Create child element {@odf.element style:master-page}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @param stylePageLayoutNameValue  the <code>String</code> value of <code>StylePageLayoutNameAttribute</code>, see {@odf.attribute  style:page-layout-name} at specification
+	 * @return the element {@odf.element style:master-page}
+	 */
+	 public StyleMasterPageElement newStyleMasterPageElement(String styleNameValue, String stylePageLayoutNameValue) {
+		StyleMasterPageElement styleMasterPage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMasterPageElement.class);
+		styleMasterPage.setStyleNameAttribute(styleNameValue);
+		styleMasterPage.setStylePageLayoutNameAttribute(stylePageLayoutNameValue);
+		this.appendChild(styleMasterPage);
+		return styleMasterPage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeMetaElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeMetaElement.java
new file mode 100644
index 0000000..b27cb66
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeMetaElement.java
@@ -0,0 +1,345 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDescriptionElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcLanguageElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcSubjectElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcTitleElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaAutoReloadElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaCreationDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingCyclesElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingDurationElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaGeneratorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaHyperlinkBehaviourElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaInitialCreatorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintedByElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaTemplateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:meta}.
+ *
+ */
+public class OfficeMetaElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "meta");
+
+	/**
+	 * Create the instance of <code>OfficeMetaElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeMetaElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:meta}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:creator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dc:creator}
+	 */
+	public DcCreatorElement newDcCreatorElement() {
+		DcCreatorElement dcCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(DcCreatorElement.class);
+		this.appendChild(dcCreator);
+		return dcCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dc:date}
+	 */
+	public DcDateElement newDcDateElement() {
+		DcDateElement dcDate = ((OdfFileDom) this.ownerDocument).newOdfElement(DcDateElement.class);
+		this.appendChild(dcDate);
+		return dcDate;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:description}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dc:description}
+	 */
+	public DcDescriptionElement newDcDescriptionElement() {
+		DcDescriptionElement dcDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(DcDescriptionElement.class);
+		this.appendChild(dcDescription);
+		return dcDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:language}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dc:language}
+	 */
+	public DcLanguageElement newDcLanguageElement() {
+		DcLanguageElement dcLanguage = ((OdfFileDom) this.ownerDocument).newOdfElement(DcLanguageElement.class);
+		this.appendChild(dcLanguage);
+		return dcLanguage;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:subject}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dc:subject}
+	 */
+	public DcSubjectElement newDcSubjectElement() {
+		DcSubjectElement dcSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(DcSubjectElement.class);
+		this.appendChild(dcSubject);
+		return dcSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element dc:title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dc:title}
+	 */
+	public DcTitleElement newDcTitleElement() {
+		DcTitleElement dcTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(DcTitleElement.class);
+		this.appendChild(dcTitle);
+		return dcTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:auto-reload}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:auto-reload}
+	 */
+	public MetaAutoReloadElement newMetaAutoReloadElement() {
+		MetaAutoReloadElement metaAutoReload = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaAutoReloadElement.class);
+		this.appendChild(metaAutoReload);
+		return metaAutoReload;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:creation-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:creation-date}
+	 */
+	public MetaCreationDateElement newMetaCreationDateElement() {
+		MetaCreationDateElement metaCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaCreationDateElement.class);
+		this.appendChild(metaCreationDate);
+		return metaCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:document-statistic}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:document-statistic}
+	 */
+	public MetaDocumentStatisticElement newMetaDocumentStatisticElement() {
+		MetaDocumentStatisticElement metaDocumentStatistic = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaDocumentStatisticElement.class);
+		this.appendChild(metaDocumentStatistic);
+		return metaDocumentStatistic;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:editing-cycles}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:editing-cycles}
+	 */
+	public MetaEditingCyclesElement newMetaEditingCyclesElement() {
+		MetaEditingCyclesElement metaEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaEditingCyclesElement.class);
+		this.appendChild(metaEditingCycles);
+		return metaEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:editing-duration}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:editing-duration}
+	 */
+	public MetaEditingDurationElement newMetaEditingDurationElement() {
+		MetaEditingDurationElement metaEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaEditingDurationElement.class);
+		this.appendChild(metaEditingDuration);
+		return metaEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:generator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:generator}
+	 */
+	public MetaGeneratorElement newMetaGeneratorElement() {
+		MetaGeneratorElement metaGenerator = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaGeneratorElement.class);
+		this.appendChild(metaGenerator);
+		return metaGenerator;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:hyperlink-behaviour}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:hyperlink-behaviour}
+	 */
+	public MetaHyperlinkBehaviourElement newMetaHyperlinkBehaviourElement() {
+		MetaHyperlinkBehaviourElement metaHyperlinkBehaviour = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaHyperlinkBehaviourElement.class);
+		this.appendChild(metaHyperlinkBehaviour);
+		return metaHyperlinkBehaviour;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:initial-creator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:initial-creator}
+	 */
+	public MetaInitialCreatorElement newMetaInitialCreatorElement() {
+		MetaInitialCreatorElement metaInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaInitialCreatorElement.class);
+		this.appendChild(metaInitialCreator);
+		return metaInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:keyword}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:keyword}
+	 */
+	public MetaKeywordElement newMetaKeywordElement() {
+		MetaKeywordElement metaKeyword = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaKeywordElement.class);
+		this.appendChild(metaKeyword);
+		return metaKeyword;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:print-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:print-date}
+	 */
+	public MetaPrintDateElement newMetaPrintDateElement() {
+		MetaPrintDateElement metaPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaPrintDateElement.class);
+		this.appendChild(metaPrintDate);
+		return metaPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:printed-by}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:printed-by}
+	 */
+	public MetaPrintedByElement newMetaPrintedByElement() {
+		MetaPrintedByElement metaPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaPrintedByElement.class);
+		this.appendChild(metaPrintedBy);
+		return metaPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:template}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:template}
+	 */
+	 public MetaTemplateElement newMetaTemplateElement(String xlinkHrefValue, String xlinkTypeValue) {
+		MetaTemplateElement metaTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaTemplateElement.class);
+		metaTemplate.setXlinkHrefAttribute(xlinkHrefValue);
+		metaTemplate.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(metaTemplate);
+		return metaTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element meta:user-defined}.
+	 *
+	 * @param metaNameValue  the <code>String</code> value of <code>MetaNameAttribute</code>, see {@odf.attribute  meta:name} at specification
+	 * @param metaValueTypeValue  the <code>String</code> value of <code>MetaValueTypeAttribute</code>, see {@odf.attribute  meta:value-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element meta:user-defined}
+	 */
+	 public MetaUserDefinedElement newMetaUserDefinedElement(String metaNameValue, String metaValueTypeValue) {
+		MetaUserDefinedElement metaUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(MetaUserDefinedElement.class);
+		metaUserDefined.setMetaNameAttribute(metaNameValue);
+		metaUserDefined.setMetaValueTypeAttribute(metaValueTypeValue);
+		this.appendChild(metaUserDefined);
+		return metaUserDefined;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficePresentationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficePresentationElement.java
new file mode 100644
index 0000000..a9cef55
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficePresentationElement.java
@@ -0,0 +1,307 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeDeclElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterDeclElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderDeclElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableConsolidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTablesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinksElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:presentation}.
+ *
+ */
+public class OfficePresentationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "presentation");
+
+	/**
+	 * Create the instance of <code>OfficePresentationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficePresentationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:presentation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page}.
+	 *
+	 * @param drawMasterPageNameValue  the <code>String</code> value of <code>DrawMasterPageNameAttribute</code>, see {@odf.attribute  draw:master-page-name} at specification
+	 * @return the element {@odf.element draw:page}
+	 */
+	 public DrawPageElement newDrawPageElement(String drawMasterPageNameValue) {
+		DrawPageElement drawPage = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageElement.class);
+		drawPage.setDrawMasterPageNameAttribute(drawMasterPageNameValue);
+		this.appendChild(drawPage);
+		return drawPage;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time-decl}.
+	 *
+	 * @param presentationNameValue  the <code>String</code> value of <code>PresentationNameAttribute</code>, see {@odf.attribute  presentation:name} at specification
+	 * @param presentationSourceValue  the <code>String</code> value of <code>PresentationSourceAttribute</code>, see {@odf.attribute  presentation:source} at specification
+	 * @return the element {@odf.element presentation:date-time-decl}
+	 */
+	 public PresentationDateTimeDeclElement newPresentationDateTimeDeclElement(String presentationNameValue, String presentationSourceValue) {
+		PresentationDateTimeDeclElement presentationDateTimeDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeDeclElement.class);
+		presentationDateTimeDecl.setPresentationNameAttribute(presentationNameValue);
+		presentationDateTimeDecl.setPresentationSourceAttribute(presentationSourceValue);
+		this.appendChild(presentationDateTimeDecl);
+		return presentationDateTimeDecl;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer-decl}.
+	 *
+	 * @param presentationNameValue  the <code>String</code> value of <code>PresentationNameAttribute</code>, see {@odf.attribute  presentation:name} at specification
+	 * @return the element {@odf.element presentation:footer-decl}
+	 */
+	 public PresentationFooterDeclElement newPresentationFooterDeclElement(String presentationNameValue) {
+		PresentationFooterDeclElement presentationFooterDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterDeclElement.class);
+		presentationFooterDecl.setPresentationNameAttribute(presentationNameValue);
+		this.appendChild(presentationFooterDecl);
+		return presentationFooterDecl;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header-decl}.
+	 *
+	 * @param presentationNameValue  the <code>String</code> value of <code>PresentationNameAttribute</code>, see {@odf.attribute  presentation:name} at specification
+	 * @return the element {@odf.element presentation:header-decl}
+	 */
+	 public PresentationHeaderDeclElement newPresentationHeaderDeclElement(String presentationNameValue) {
+		PresentationHeaderDeclElement presentationHeaderDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderDeclElement.class);
+		presentationHeaderDecl.setPresentationNameAttribute(presentationNameValue);
+		this.appendChild(presentationHeaderDecl);
+		return presentationHeaderDecl;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:settings}.
+	 *
+	 * @return the element {@odf.element presentation:settings}
+	 */
+	public PresentationSettingsElement newPresentationSettingsElement() {
+		PresentationSettingsElement presentationSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSettingsElement.class);
+		this.appendChild(presentationSettings);
+		return presentationSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element table:calculation-settings}.
+	 *
+	 * @return the element {@odf.element table:calculation-settings}
+	 */
+	public TableCalculationSettingsElement newTableCalculationSettingsElement() {
+		TableCalculationSettingsElement tableCalculationSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCalculationSettingsElement.class);
+		this.appendChild(tableCalculationSettings);
+		return tableCalculationSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element table:consolidation}.
+	 *
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @param tableSourceCellRangeAddressesValue  the <code>String</code> value of <code>TableSourceCellRangeAddressesAttribute</code>, see {@odf.attribute  table:source-cell-range-addresses} at specification
+	 * @param tableTargetCellAddressValue  the <code>String</code> value of <code>TableTargetCellAddressAttribute</code>, see {@odf.attribute  table:target-cell-address} at specification
+	 * @return the element {@odf.element table:consolidation}
+	 */
+	 public TableConsolidationElement newTableConsolidationElement(String tableFunctionValue, String tableSourceCellRangeAddressesValue, String tableTargetCellAddressValue) {
+		TableConsolidationElement tableConsolidation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableConsolidationElement.class);
+		tableConsolidation.setTableFunctionAttribute(tableFunctionValue);
+		tableConsolidation.setTableSourceCellRangeAddressesAttribute(tableSourceCellRangeAddressesValue);
+		tableConsolidation.setTableTargetCellAddressAttribute(tableTargetCellAddressValue);
+		this.appendChild(tableConsolidation);
+		return tableConsolidation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:content-validations}.
+	 *
+	 * @return the element {@odf.element table:content-validations}
+	 */
+	public TableContentValidationsElement newTableContentValidationsElement() {
+		TableContentValidationsElement tableContentValidations = ((OdfFileDom) this.ownerDocument).newOdfElement(TableContentValidationsElement.class);
+		this.appendChild(tableContentValidations);
+		return tableContentValidations;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-tables}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-tables}
+	 */
+	public TableDataPilotTablesElement newTableDataPilotTablesElement() {
+		TableDataPilotTablesElement tableDataPilotTables = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotTablesElement.class);
+		this.appendChild(tableDataPilotTables);
+		return tableDataPilotTables;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-ranges}.
+	 *
+	 * @return the element {@odf.element table:database-ranges}
+	 */
+	public TableDatabaseRangesElement newTableDatabaseRangesElement() {
+		TableDatabaseRangesElement tableDatabaseRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseRangesElement.class);
+		this.appendChild(tableDatabaseRanges);
+		return tableDatabaseRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dde-links}.
+	 *
+	 * @return the element {@odf.element table:dde-links}
+	 */
+	public TableDdeLinksElement newTableDdeLinksElement() {
+		TableDdeLinksElement tableDdeLinks = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDdeLinksElement.class);
+		this.appendChild(tableDdeLinks);
+		return tableDdeLinks;
+	}
+
+	/**
+	 * Create child element {@odf.element table:label-ranges}.
+	 *
+	 * @return the element {@odf.element table:label-ranges}
+	 */
+	public TableLabelRangesElement newTableLabelRangesElement() {
+		TableLabelRangesElement tableLabelRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLabelRangesElement.class);
+		this.appendChild(tableLabelRanges);
+		return tableLabelRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expressions}.
+	 *
+	 * @return the element {@odf.element table:named-expressions}
+	 */
+	public TableNamedExpressionsElement newTableNamedExpressionsElement() {
+		TableNamedExpressionsElement tableNamedExpressions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionsElement.class);
+		this.appendChild(tableNamedExpressions);
+		return tableNamedExpressions;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeScriptElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeScriptElement.java
new file mode 100644
index 0000000..cb9c254
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeScriptElement.java
@@ -0,0 +1,99 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.script.ScriptLanguageAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:script}.
+ *
+ * This class can have any org.w3c.dom.Element child element.
+ */
+public class OfficeScriptElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "script");
+
+	/**
+	 * Create the instance of <code>OfficeScriptElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeScriptElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:script}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ScriptLanguageAttribute</code> , See {@odf.attribute script:language}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getScriptLanguageAttribute() {
+		ScriptLanguageAttribute attr = (ScriptLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.SCRIPT, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ScriptLanguageAttribute</code> , See {@odf.attribute script:language}
+	 *
+	 * @param scriptLanguageValue   The type is <code>String</code>
+	 */
+	public void setScriptLanguageAttribute(String scriptLanguageValue) {
+		ScriptLanguageAttribute attr = new ScriptLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(scriptLanguageValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeScriptsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeScriptsElement.java
new file mode 100644
index 0000000..082dadb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeScriptsElement.java
@@ -0,0 +1,95 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:scripts}.
+ *
+ */
+public class OfficeScriptsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "scripts");
+
+	/**
+	 * Create the instance of <code>OfficeScriptsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeScriptsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:scripts}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element office:script}.
+	 *
+	 * @param scriptLanguageValue  the <code>String</code> value of <code>ScriptLanguageAttribute</code>, see {@odf.attribute  script:language} at specification
+	 * @return the element {@odf.element office:script}
+	 */
+	 public OfficeScriptElement newOfficeScriptElement(String scriptLanguageValue) {
+		OfficeScriptElement officeScript = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeScriptElement.class);
+		officeScript.setScriptLanguageAttribute(scriptLanguageValue);
+		this.appendChild(officeScript);
+		return officeScript;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeSettingsElement.java
new file mode 100644
index 0000000..8bec837
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeSettingsElement.java
@@ -0,0 +1,87 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.config.ConfigConfigItemSetElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:settings}.
+ *
+ */
+public class OfficeSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "settings");
+
+	/**
+	 * Create the instance of <code>OfficeSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element config:config-item-set}.
+	 *
+	 * @param configNameValue  the <code>String</code> value of <code>ConfigNameAttribute</code>, see {@odf.attribute  config:name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element config:config-item-set}
+	 */
+	 public ConfigConfigItemSetElement newConfigConfigItemSetElement(String configNameValue) {
+		ConfigConfigItemSetElement configConfigItemSet = ((OdfFileDom) this.ownerDocument).newOdfElement(ConfigConfigItemSetElement.class);
+		configConfigItemSet.setConfigNameAttribute(configNameValue);
+		this.appendChild(configConfigItemSet);
+		return configConfigItemSet;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeSpreadsheetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeSpreadsheetElement.java
new file mode 100644
index 0000000..897edad
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeSpreadsheetElement.java
@@ -0,0 +1,336 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableConsolidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTablesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinksElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStructureProtectedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:spreadsheet}.
+ *
+ */
+public class OfficeSpreadsheetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "spreadsheet");
+
+	/**
+	 * Create the instance of <code>OfficeSpreadsheetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeSpreadsheetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:spreadsheet}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectionKeyAttribute</code> , See {@odf.attribute table:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableProtectionKeyAttribute() {
+		TableProtectionKeyAttribute attr = (TableProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectionKeyAttribute</code> , See {@odf.attribute table:protection-key}
+	 *
+	 * @param tableProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTableProtectionKeyAttribute(String tableProtectionKeyValue) {
+		TableProtectionKeyAttribute attr = new TableProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute table:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableProtectionKeyDigestAlgorithmAttribute() {
+		TableProtectionKeyDigestAlgorithmAttribute attr = (TableProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute table:protection-key-digest-algorithm}
+	 *
+	 * @param tableProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTableProtectionKeyDigestAlgorithmAttribute(String tableProtectionKeyDigestAlgorithmValue) {
+		TableProtectionKeyDigestAlgorithmAttribute attr = new TableProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStructureProtectedAttribute</code> , See {@odf.attribute table:structure-protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableStructureProtectedAttribute() {
+		TableStructureProtectedAttribute attr = (TableStructureProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "structure-protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableStructureProtectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStructureProtectedAttribute</code> , See {@odf.attribute table:structure-protected}
+	 *
+	 * @param tableStructureProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTableStructureProtectedAttribute(Boolean tableStructureProtectedValue) {
+		TableStructureProtectedAttribute attr = new TableStructureProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableStructureProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:calculation-settings}.
+	 *
+	 * @return the element {@odf.element table:calculation-settings}
+	 */
+	public TableCalculationSettingsElement newTableCalculationSettingsElement() {
+		TableCalculationSettingsElement tableCalculationSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCalculationSettingsElement.class);
+		this.appendChild(tableCalculationSettings);
+		return tableCalculationSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element table:consolidation}.
+	 *
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @param tableSourceCellRangeAddressesValue  the <code>String</code> value of <code>TableSourceCellRangeAddressesAttribute</code>, see {@odf.attribute  table:source-cell-range-addresses} at specification
+	 * @param tableTargetCellAddressValue  the <code>String</code> value of <code>TableTargetCellAddressAttribute</code>, see {@odf.attribute  table:target-cell-address} at specification
+	 * @return the element {@odf.element table:consolidation}
+	 */
+	 public TableConsolidationElement newTableConsolidationElement(String tableFunctionValue, String tableSourceCellRangeAddressesValue, String tableTargetCellAddressValue) {
+		TableConsolidationElement tableConsolidation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableConsolidationElement.class);
+		tableConsolidation.setTableFunctionAttribute(tableFunctionValue);
+		tableConsolidation.setTableSourceCellRangeAddressesAttribute(tableSourceCellRangeAddressesValue);
+		tableConsolidation.setTableTargetCellAddressAttribute(tableTargetCellAddressValue);
+		this.appendChild(tableConsolidation);
+		return tableConsolidation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:content-validations}.
+	 *
+	 * @return the element {@odf.element table:content-validations}
+	 */
+	public TableContentValidationsElement newTableContentValidationsElement() {
+		TableContentValidationsElement tableContentValidations = ((OdfFileDom) this.ownerDocument).newOdfElement(TableContentValidationsElement.class);
+		this.appendChild(tableContentValidations);
+		return tableContentValidations;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-tables}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-tables}
+	 */
+	public TableDataPilotTablesElement newTableDataPilotTablesElement() {
+		TableDataPilotTablesElement tableDataPilotTables = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotTablesElement.class);
+		this.appendChild(tableDataPilotTables);
+		return tableDataPilotTables;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-ranges}.
+	 *
+	 * @return the element {@odf.element table:database-ranges}
+	 */
+	public TableDatabaseRangesElement newTableDatabaseRangesElement() {
+		TableDatabaseRangesElement tableDatabaseRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseRangesElement.class);
+		this.appendChild(tableDatabaseRanges);
+		return tableDatabaseRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dde-links}.
+	 *
+	 * @return the element {@odf.element table:dde-links}
+	 */
+	public TableDdeLinksElement newTableDdeLinksElement() {
+		TableDdeLinksElement tableDdeLinks = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDdeLinksElement.class);
+		this.appendChild(tableDdeLinks);
+		return tableDdeLinks;
+	}
+
+	/**
+	 * Create child element {@odf.element table:label-ranges}.
+	 *
+	 * @return the element {@odf.element table:label-ranges}
+	 */
+	public TableLabelRangesElement newTableLabelRangesElement() {
+		TableLabelRangesElement tableLabelRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLabelRangesElement.class);
+		this.appendChild(tableLabelRanges);
+		return tableLabelRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expressions}.
+	 *
+	 * @return the element {@odf.element table:named-expressions}
+	 */
+	public TableNamedExpressionsElement newTableNamedExpressionsElement() {
+		TableNamedExpressionsElement tableNamedExpressions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionsElement.class);
+		this.appendChild(tableNamedExpressions);
+		return tableNamedExpressions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element table:tracked-changes}.
+	 *
+	 * @return the element {@odf.element table:tracked-changes}
+	 */
+	public TableTrackedChangesElement newTableTrackedChangesElement() {
+		TableTrackedChangesElement tableTrackedChanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTrackedChangesElement.class);
+		this.appendChild(tableTrackedChanges);
+		return tableTrackedChanges;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeStylesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeStylesElement.java
new file mode 100644
index 0000000..f988401
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeStylesElement.java
@@ -0,0 +1,444 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGradientElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawHatchElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMarkerElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawOpacityElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawStrokeDashElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencyStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDateStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberPercentageStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTimeStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDefaultPageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDefaultStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePresentationPageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgLinearGradientElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgRadialGradientElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyConfigurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLinenumberingConfigurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListStyleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNotesConfigurationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextOutlineStyleElement;
+import org.odftoolkit.odfdom.pkg.OdfContainerElementBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:styles}.
+ *
+ */
+public class OfficeStylesElement extends OdfContainerElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "styles");
+
+	/**
+	 * Create the instance of <code>OfficeStylesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeStylesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:styles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:fill-image}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:fill-image}
+	 */
+	 public DrawFillImageElement newDrawFillImageElement(String drawNameValue, String xlinkHrefValue, String xlinkTypeValue) {
+		DrawFillImageElement drawFillImage = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFillImageElement.class);
+		drawFillImage.setDrawNameAttribute(drawNameValue);
+		drawFillImage.setXlinkHrefAttribute(xlinkHrefValue);
+		drawFillImage.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawFillImage);
+		return drawFillImage;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:gradient}.
+	 *
+	 * @param drawStyleValue  the <code>String</code> value of <code>DrawStyleAttribute</code>, see {@odf.attribute  draw:style} at specification
+	 * @return the element {@odf.element draw:gradient}
+	 */
+	 public DrawGradientElement newDrawGradientElement(String drawStyleValue) {
+		DrawGradientElement drawGradient = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGradientElement.class);
+		drawGradient.setDrawStyleAttribute(drawStyleValue);
+		this.appendChild(drawGradient);
+		return drawGradient;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:hatch}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @param drawStyleValue  the <code>String</code> value of <code>DrawStyleAttribute</code>, see {@odf.attribute  draw:style} at specification
+	 * @return the element {@odf.element draw:hatch}
+	 */
+	 public DrawHatchElement newDrawHatchElement(String drawNameValue, String drawStyleValue) {
+		DrawHatchElement drawHatch = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawHatchElement.class);
+		drawHatch.setDrawNameAttribute(drawNameValue);
+		drawHatch.setDrawStyleAttribute(drawStyleValue);
+		this.appendChild(drawHatch);
+		return drawHatch;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:marker}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:marker}
+	 */
+	 public DrawMarkerElement newDrawMarkerElement(String drawNameValue, String svgDValue, int svgViewBoxValue) {
+		DrawMarkerElement drawMarker = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMarkerElement.class);
+		drawMarker.setDrawNameAttribute(drawNameValue);
+		drawMarker.setSvgDAttribute(svgDValue);
+		drawMarker.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawMarker);
+		return drawMarker;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:opacity}.
+	 *
+	 * @param drawStyleValue  the <code>String</code> value of <code>DrawStyleAttribute</code>, see {@odf.attribute  draw:style} at specification
+	 * @return the element {@odf.element draw:opacity}
+	 */
+	 public DrawOpacityElement newDrawOpacityElement(String drawStyleValue) {
+		DrawOpacityElement drawOpacity = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawOpacityElement.class);
+		drawOpacity.setDrawStyleAttribute(drawStyleValue);
+		this.appendChild(drawOpacity);
+		return drawOpacity;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:stroke-dash}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @return the element {@odf.element draw:stroke-dash}
+	 */
+	 public DrawStrokeDashElement newDrawStrokeDashElement(String drawNameValue) {
+		DrawStrokeDashElement drawStrokeDash = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawStrokeDashElement.class);
+		drawStrokeDash.setDrawNameAttribute(drawNameValue);
+		this.appendChild(drawStrokeDash);
+		return drawStrokeDash;
+	}
+
+	/**
+	 * Create child element {@odf.element number:boolean-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:boolean-style}
+	 */
+	 public NumberBooleanStyleElement newNumberBooleanStyleElement(String styleNameValue) {
+		NumberBooleanStyleElement numberBooleanStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberBooleanStyleElement.class);
+		numberBooleanStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberBooleanStyle);
+		return numberBooleanStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:currency-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:currency-style}
+	 */
+	 public NumberCurrencyStyleElement newNumberCurrencyStyleElement(String styleNameValue) {
+		NumberCurrencyStyleElement numberCurrencyStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberCurrencyStyleElement.class);
+		numberCurrencyStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberCurrencyStyle);
+		return numberCurrencyStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:date-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:date-style}
+	 */
+	 public NumberDateStyleElement newNumberDateStyleElement(String styleNameValue) {
+		NumberDateStyleElement numberDateStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberDateStyleElement.class);
+		numberDateStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberDateStyle);
+		return numberDateStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:number-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:number-style}
+	 */
+	 public NumberNumberStyleElement newNumberNumberStyleElement(String styleNameValue) {
+		NumberNumberStyleElement numberNumberStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberNumberStyleElement.class);
+		numberNumberStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberNumberStyle);
+		return numberNumberStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:percentage-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:percentage-style}
+	 */
+	 public NumberPercentageStyleElement newNumberPercentageStyleElement(String styleNameValue) {
+		NumberPercentageStyleElement numberPercentageStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberPercentageStyleElement.class);
+		numberPercentageStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberPercentageStyle);
+		return numberPercentageStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:text-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:text-style}
+	 */
+	 public NumberTextStyleElement newNumberTextStyleElement(String styleNameValue) {
+		NumberTextStyleElement numberTextStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTextStyleElement.class);
+		numberTextStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberTextStyle);
+		return numberTextStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element number:time-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element number:time-style}
+	 */
+	 public NumberTimeStyleElement newNumberTimeStyleElement(String styleNameValue) {
+		NumberTimeStyleElement numberTimeStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(NumberTimeStyleElement.class);
+		numberTimeStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(numberTimeStyle);
+		return numberTimeStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:default-page-layout}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:default-page-layout}
+	 */
+	public StyleDefaultPageLayoutElement newStyleDefaultPageLayoutElement() {
+		StyleDefaultPageLayoutElement styleDefaultPageLayout = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleDefaultPageLayoutElement.class);
+		this.appendChild(styleDefaultPageLayout);
+		return styleDefaultPageLayout;
+	}
+
+	/**
+	 * Create child element {@odf.element style:default-style}.
+	 *
+	 * @param styleFamilyValue  the <code>String</code> value of <code>StyleFamilyAttribute</code>, see {@odf.attribute  style:family} at specification
+	 * @return the element {@odf.element style:default-style}
+	 */
+	 public StyleDefaultStyleElement newStyleDefaultStyleElement(String styleFamilyValue) {
+		StyleDefaultStyleElement styleDefaultStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleDefaultStyleElement.class);
+		styleDefaultStyle.setStyleFamilyAttribute(styleFamilyValue);
+		this.appendChild(styleDefaultStyle);
+		return styleDefaultStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:presentation-page-layout}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element style:presentation-page-layout}
+	 */
+	 public StylePresentationPageLayoutElement newStylePresentationPageLayoutElement(String styleNameValue) {
+		StylePresentationPageLayoutElement stylePresentationPageLayout = ((OdfFileDom) this.ownerDocument).newOdfElement(StylePresentationPageLayoutElement.class);
+		stylePresentationPageLayout.setStyleNameAttribute(styleNameValue);
+		this.appendChild(stylePresentationPageLayout);
+		return stylePresentationPageLayout;
+	}
+
+	/**
+	 * Create child element {@odf.element style:style}.
+	 *
+	 * @param styleFamilyValue  the <code>String</code> value of <code>StyleFamilyAttribute</code>, see {@odf.attribute  style:family} at specification
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element style:style}
+	 */
+	 public StyleStyleElement newStyleStyleElement(String styleFamilyValue, String styleNameValue) {
+		StyleStyleElement styleStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleStyleElement.class);
+		styleStyle.setStyleFamilyAttribute(styleFamilyValue);
+		styleStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(styleStyle);
+		return styleStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:linearGradient}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @return the element {@odf.element svg:linearGradient}
+	 */
+	 public SvgLinearGradientElement newSvgLinearGradientElement(String drawNameValue) {
+		SvgLinearGradientElement svgLinearGradient = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgLinearGradientElement.class);
+		svgLinearGradient.setDrawNameAttribute(drawNameValue);
+		this.appendChild(svgLinearGradient);
+		return svgLinearGradient;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:radialGradient}.
+	 *
+	 * @param drawNameValue  the <code>String</code> value of <code>DrawNameAttribute</code>, see {@odf.attribute  draw:name} at specification
+	 * @return the element {@odf.element svg:radialGradient}
+	 */
+	 public SvgRadialGradientElement newSvgRadialGradientElement(String drawNameValue) {
+		SvgRadialGradientElement svgRadialGradient = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgRadialGradientElement.class);
+		svgRadialGradient.setDrawNameAttribute(drawNameValue);
+		this.appendChild(svgRadialGradient);
+		return svgRadialGradient;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-template}.
+	 *
+	 * @param tableFirstRowEndColumnValue  the <code>String</code> value of <code>TableFirstRowEndColumnAttribute</code>, see {@odf.attribute  table:first-row-end-column} at specification
+	 * @param tableFirstRowStartColumnValue  the <code>String</code> value of <code>TableFirstRowStartColumnAttribute</code>, see {@odf.attribute  table:first-row-start-column} at specification
+	 * @param tableLastRowEndColumnValue  the <code>String</code> value of <code>TableLastRowEndColumnAttribute</code>, see {@odf.attribute  table:last-row-end-column} at specification
+	 * @param tableLastRowStartColumnValue  the <code>String</code> value of <code>TableLastRowStartColumnAttribute</code>, see {@odf.attribute  table:last-row-start-column} at specification
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:table-template}
+	 */
+	 public TableTableTemplateElement newTableTableTemplateElement(String tableFirstRowEndColumnValue, String tableFirstRowStartColumnValue, String tableLastRowEndColumnValue, String tableLastRowStartColumnValue, String tableNameValue) {
+		TableTableTemplateElement tableTableTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableTemplateElement.class);
+		tableTableTemplate.setTableFirstRowEndColumnAttribute(tableFirstRowEndColumnValue);
+		tableTableTemplate.setTableFirstRowStartColumnAttribute(tableFirstRowStartColumnValue);
+		tableTableTemplate.setTableLastRowEndColumnAttribute(tableLastRowEndColumnValue);
+		tableTableTemplate.setTableLastRowStartColumnAttribute(tableLastRowStartColumnValue);
+		tableTableTemplate.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableTableTemplate);
+		return tableTableTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-configuration}.
+	 *
+	 * @return the element {@odf.element text:bibliography-configuration}
+	 */
+	public TextBibliographyConfigurationElement newTextBibliographyConfigurationElement() {
+		TextBibliographyConfigurationElement textBibliographyConfiguration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyConfigurationElement.class);
+		this.appendChild(textBibliographyConfiguration);
+		return textBibliographyConfiguration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:linenumbering-configuration}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:linenumbering-configuration}
+	 */
+	 public TextLinenumberingConfigurationElement newTextLinenumberingConfigurationElement(String styleNumFormatValue) {
+		TextLinenumberingConfigurationElement textLinenumberingConfiguration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLinenumberingConfigurationElement.class);
+		textLinenumberingConfiguration.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textLinenumberingConfiguration);
+		return textLinenumberingConfiguration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element text:list-style}
+	 */
+	 public TextListStyleElement newTextListStyleElement(String styleNameValue) {
+		TextListStyleElement textListStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListStyleElement.class);
+		textListStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(textListStyle);
+		return textListStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:notes-configuration}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:notes-configuration}
+	 */
+	 public TextNotesConfigurationElement newTextNotesConfigurationElement(String styleNumFormatValue, String textNoteClassValue) {
+		TextNotesConfigurationElement textNotesConfiguration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNotesConfigurationElement.class);
+		textNotesConfiguration.setStyleNumFormatAttribute(styleNumFormatValue);
+		textNotesConfiguration.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNotesConfiguration);
+		return textNotesConfiguration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:outline-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * @return the element {@odf.element text:outline-style}
+	 */
+	 public TextOutlineStyleElement newTextOutlineStyleElement(String styleNameValue) {
+		TextOutlineStyleElement textOutlineStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextOutlineStyleElement.class);
+		textOutlineStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(textOutlineStyle);
+		return textOutlineStyle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeTextElement.java
new file mode 100644
index 0000000..5502dca
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/office/OfficeTextElement.java
@@ -0,0 +1,810 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.office;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCalculationSettingsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableConsolidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDataPilotTablesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDatabaseRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableDdeLinksElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLabelRangesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberedParagraphElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageSequenceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextGlobalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseSoftPageBreaksAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element office:text}.
+ *
+ */
+public class OfficeTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.OFFICE, "text");
+
+	/**
+	 * Create the instance of <code>OfficeTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public OfficeTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element office:text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextGlobalAttribute</code> , See {@odf.attribute text:global}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextGlobalAttribute() {
+		TextGlobalAttribute attr = (TextGlobalAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "global");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextGlobalAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextGlobalAttribute</code> , See {@odf.attribute text:global}
+	 *
+	 * @param textGlobalValue   The type is <code>Boolean</code>
+	 */
+	public void setTextGlobalAttribute(Boolean textGlobalValue) {
+		TextGlobalAttribute attr = new TextGlobalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textGlobalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseSoftPageBreaksAttribute</code> , See {@odf.attribute text:use-soft-page-breaks}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseSoftPageBreaksAttribute() {
+		TextUseSoftPageBreaksAttribute attr = (TextUseSoftPageBreaksAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-soft-page-breaks");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseSoftPageBreaksAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseSoftPageBreaksAttribute</code> , See {@odf.attribute text:use-soft-page-breaks}
+	 *
+	 * @param textUseSoftPageBreaksValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseSoftPageBreaksAttribute(Boolean textUseSoftPageBreaksValue) {
+		TextUseSoftPageBreaksAttribute attr = new TextUseSoftPageBreaksAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseSoftPageBreaksValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:forms}.
+	 *
+	 * @return the element {@odf.element office:forms}
+	 */
+	public OfficeFormsElement newOfficeFormsElement() {
+		OfficeFormsElement officeForms = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFormsElement.class);
+		this.appendChild(officeForms);
+		return officeForms;
+	}
+
+	/**
+	 * Create child element {@odf.element table:calculation-settings}.
+	 *
+	 * @return the element {@odf.element table:calculation-settings}
+	 */
+	public TableCalculationSettingsElement newTableCalculationSettingsElement() {
+		TableCalculationSettingsElement tableCalculationSettings = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCalculationSettingsElement.class);
+		this.appendChild(tableCalculationSettings);
+		return tableCalculationSettings;
+	}
+
+	/**
+	 * Create child element {@odf.element table:consolidation}.
+	 *
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @param tableSourceCellRangeAddressesValue  the <code>String</code> value of <code>TableSourceCellRangeAddressesAttribute</code>, see {@odf.attribute  table:source-cell-range-addresses} at specification
+	 * @param tableTargetCellAddressValue  the <code>String</code> value of <code>TableTargetCellAddressAttribute</code>, see {@odf.attribute  table:target-cell-address} at specification
+	 * @return the element {@odf.element table:consolidation}
+	 */
+	 public TableConsolidationElement newTableConsolidationElement(String tableFunctionValue, String tableSourceCellRangeAddressesValue, String tableTargetCellAddressValue) {
+		TableConsolidationElement tableConsolidation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableConsolidationElement.class);
+		tableConsolidation.setTableFunctionAttribute(tableFunctionValue);
+		tableConsolidation.setTableSourceCellRangeAddressesAttribute(tableSourceCellRangeAddressesValue);
+		tableConsolidation.setTableTargetCellAddressAttribute(tableTargetCellAddressValue);
+		this.appendChild(tableConsolidation);
+		return tableConsolidation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:content-validations}.
+	 *
+	 * @return the element {@odf.element table:content-validations}
+	 */
+	public TableContentValidationsElement newTableContentValidationsElement() {
+		TableContentValidationsElement tableContentValidations = ((OdfFileDom) this.ownerDocument).newOdfElement(TableContentValidationsElement.class);
+		this.appendChild(tableContentValidations);
+		return tableContentValidations;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-tables}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-tables}
+	 */
+	public TableDataPilotTablesElement newTableDataPilotTablesElement() {
+		TableDataPilotTablesElement tableDataPilotTables = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotTablesElement.class);
+		this.appendChild(tableDataPilotTables);
+		return tableDataPilotTables;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-ranges}.
+	 *
+	 * @return the element {@odf.element table:database-ranges}
+	 */
+	public TableDatabaseRangesElement newTableDatabaseRangesElement() {
+		TableDatabaseRangesElement tableDatabaseRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseRangesElement.class);
+		this.appendChild(tableDatabaseRanges);
+		return tableDatabaseRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dde-links}.
+	 *
+	 * @return the element {@odf.element table:dde-links}
+	 */
+	public TableDdeLinksElement newTableDdeLinksElement() {
+		TableDdeLinksElement tableDdeLinks = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDdeLinksElement.class);
+		this.appendChild(tableDdeLinks);
+		return tableDdeLinks;
+	}
+
+	/**
+	 * Create child element {@odf.element table:label-ranges}.
+	 *
+	 * @return the element {@odf.element table:label-ranges}
+	 */
+	public TableLabelRangesElement newTableLabelRangesElement() {
+		TableLabelRangesElement tableLabelRanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLabelRangesElement.class);
+		this.appendChild(tableLabelRanges);
+		return tableLabelRanges;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expressions}.
+	 *
+	 * @return the element {@odf.element table:named-expressions}
+	 */
+	public TableNamedExpressionsElement newTableNamedExpressionsElement() {
+		TableNamedExpressionsElement tableNamedExpressions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionsElement.class);
+		this.appendChild(tableNamedExpressions);
+		return tableNamedExpressions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-sequence}.
+	 *
+	 * @return the element {@odf.element text:page-sequence}
+	 */
+	public TextPageSequenceElement newTextPageSequenceElement() {
+		TextPageSequenceElement textPageSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageSequenceElement.class);
+		this.appendChild(textPageSequence);
+		return textPageSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tracked-changes}.
+	 *
+	 * @return the element {@odf.element text:tracked-changes}
+	 */
+	public TextTrackedChangesElement newTextTrackedChangesElement() {
+		TextTrackedChangesElement textTrackedChanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTrackedChangesElement.class);
+		this.appendChild(textTrackedChanges);
+		return textTrackedChanges;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationAnimationGroupElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationAnimationGroupElement.java
new file mode 100644
index 0000000..3e02e71
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationAnimationGroupElement.java
@@ -0,0 +1,151 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:animation-group}.
+ *
+ */
+public class PresentationAnimationGroupElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "animation-group");
+
+	/**
+	 * Create the instance of <code>PresentationAnimationGroupElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationAnimationGroupElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:animation-group}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:dim}.
+	 *
+	 * @param drawColorValue  the <code>String</code> value of <code>DrawColorAttribute</code>, see {@odf.attribute  draw:color} at specification
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:dim}
+	 */
+	 public PresentationDimElement newPresentationDimElement(String drawColorValue, String drawShapeIdValue) {
+		PresentationDimElement presentationDim = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDimElement.class);
+		presentationDim.setDrawColorAttribute(drawColorValue);
+		presentationDim.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationDim);
+		return presentationDim;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:hide-shape}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:hide-shape}
+	 */
+	 public PresentationHideShapeElement newPresentationHideShapeElement(String drawShapeIdValue) {
+		PresentationHideShapeElement presentationHideShape = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHideShapeElement.class);
+		presentationHideShape.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationHideShape);
+		return presentationHideShape;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:hide-text}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:hide-text}
+	 */
+	 public PresentationHideTextElement newPresentationHideTextElement(String drawShapeIdValue) {
+		PresentationHideTextElement presentationHideText = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHideTextElement.class);
+		presentationHideText.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationHideText);
+		return presentationHideText;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:play}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:play}
+	 */
+	 public PresentationPlayElement newPresentationPlayElement(String drawShapeIdValue) {
+		PresentationPlayElement presentationPlay = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationPlayElement.class);
+		presentationPlay.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationPlay);
+		return presentationPlay;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:show-shape}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:show-shape}
+	 */
+	 public PresentationShowShapeElement newPresentationShowShapeElement(String drawShapeIdValue) {
+		PresentationShowShapeElement presentationShowShape = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationShowShapeElement.class);
+		presentationShowShape.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationShowShape);
+		return presentationShowShape;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:show-text}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:show-text}
+	 */
+	 public PresentationShowTextElement newPresentationShowTextElement(String drawShapeIdValue) {
+		PresentationShowTextElement presentationShowText = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationShowTextElement.class);
+		presentationShowText.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationShowText);
+		return presentationShowText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationAnimationsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationAnimationsElement.java
new file mode 100644
index 0000000..733bc0c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationAnimationsElement.java
@@ -0,0 +1,162 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:animations}.
+ *
+ */
+public class PresentationAnimationsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "animations");
+
+	/**
+	 * Create the instance of <code>PresentationAnimationsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationAnimationsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:animations}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:animation-group}.
+	 *
+	 * @return the element {@odf.element presentation:animation-group}
+	 */
+	public PresentationAnimationGroupElement newPresentationAnimationGroupElement() {
+		PresentationAnimationGroupElement presentationAnimationGroup = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationAnimationGroupElement.class);
+		this.appendChild(presentationAnimationGroup);
+		return presentationAnimationGroup;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:dim}.
+	 *
+	 * @param drawColorValue  the <code>String</code> value of <code>DrawColorAttribute</code>, see {@odf.attribute  draw:color} at specification
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:dim}
+	 */
+	 public PresentationDimElement newPresentationDimElement(String drawColorValue, String drawShapeIdValue) {
+		PresentationDimElement presentationDim = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDimElement.class);
+		presentationDim.setDrawColorAttribute(drawColorValue);
+		presentationDim.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationDim);
+		return presentationDim;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:hide-shape}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:hide-shape}
+	 */
+	 public PresentationHideShapeElement newPresentationHideShapeElement(String drawShapeIdValue) {
+		PresentationHideShapeElement presentationHideShape = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHideShapeElement.class);
+		presentationHideShape.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationHideShape);
+		return presentationHideShape;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:hide-text}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:hide-text}
+	 */
+	 public PresentationHideTextElement newPresentationHideTextElement(String drawShapeIdValue) {
+		PresentationHideTextElement presentationHideText = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHideTextElement.class);
+		presentationHideText.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationHideText);
+		return presentationHideText;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:play}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:play}
+	 */
+	 public PresentationPlayElement newPresentationPlayElement(String drawShapeIdValue) {
+		PresentationPlayElement presentationPlay = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationPlayElement.class);
+		presentationPlay.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationPlay);
+		return presentationPlay;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:show-shape}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:show-shape}
+	 */
+	 public PresentationShowShapeElement newPresentationShowShapeElement(String drawShapeIdValue) {
+		PresentationShowShapeElement presentationShowShape = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationShowShapeElement.class);
+		presentationShowShape.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationShowShape);
+		return presentationShowShape;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:show-text}.
+	 *
+	 * @param drawShapeIdValue  the <code>String</code> value of <code>DrawShapeIdAttribute</code>, see {@odf.attribute  draw:shape-id} at specification
+	 * @return the element {@odf.element presentation:show-text}
+	 */
+	 public PresentationShowTextElement newPresentationShowTextElement(String drawShapeIdValue) {
+		PresentationShowTextElement presentationShowText = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationShowTextElement.class);
+		presentationShowText.setDrawShapeIdAttribute(drawShapeIdValue);
+		this.appendChild(presentationShowText);
+		return presentationShowText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDateTimeDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDateTimeDeclElement.java
new file mode 100644
index 0000000..e8b34c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDateTimeDeclElement.java
@@ -0,0 +1,158 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:date-time-decl}.
+ *
+ */
+public class PresentationDateTimeDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "date-time-decl");
+
+	/**
+	 * Create the instance of <code>PresentationDateTimeDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDateTimeDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:date-time-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNameAttribute() {
+		PresentationNameAttribute attr = (PresentationNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * @param presentationNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationNameAttribute(String presentationNameValue) {
+		PresentationNameAttribute attr = new PresentationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSourceAttribute</code> , See {@odf.attribute presentation:source}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSourceAttribute() {
+		PresentationSourceAttribute attr = (PresentationSourceAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSourceAttribute</code> , See {@odf.attribute presentation:source}
+	 *
+	 * @param presentationSourceValue   The type is <code>String</code>
+	 */
+	public void setPresentationSourceAttribute(String presentationSourceValue) {
+		PresentationSourceAttribute attr = new PresentationSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDateTimeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDateTimeElement.java
new file mode 100644
index 0000000..3ba6431
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDateTimeElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:date-time}.
+ *
+ */
+public class PresentationDateTimeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "date-time");
+
+	/**
+	 * Create the instance of <code>PresentationDateTimeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDateTimeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:date-time}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDimElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDimElement.java
new file mode 100644
index 0000000..b04138b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationDimElement.java
@@ -0,0 +1,140 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShapeIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:dim}.
+ *
+ */
+public class PresentationDimElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "dim");
+
+	/**
+	 * Create the instance of <code>PresentationDimElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationDimElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:dim}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawColorAttribute</code> , See {@odf.attribute draw:color}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawColorAttribute() {
+		DrawColorAttribute attr = (DrawColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawColorAttribute</code> , See {@odf.attribute draw:color}
+	 *
+	 * @param drawColorValue   The type is <code>String</code>
+	 */
+	public void setDrawColorAttribute(String drawColorValue) {
+		DrawColorAttribute attr = new DrawColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShapeIdAttribute() {
+		DrawShapeIdAttribute attr = (DrawShapeIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shape-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * @param drawShapeIdValue   The type is <code>String</code>
+	 */
+	public void setDrawShapeIdAttribute(String drawShapeIdValue) {
+		DrawShapeIdAttribute attr = new DrawShapeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShapeIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationEventListenerElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationEventListenerElement.java
new file mode 100644
index 0000000..dfe191d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationEventListenerElement.java
@@ -0,0 +1,365 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationActionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSpeedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartScaleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationVerbAttribute;
+import org.odftoolkit.odfdom.dom.attribute.script.ScriptEventNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:event-listener}.
+ *
+ */
+public class PresentationEventListenerElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "event-listener");
+
+	/**
+	 * Create the instance of <code>PresentationEventListenerElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationEventListenerElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:event-listener}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationActionAttribute</code> , See {@odf.attribute presentation:action}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationActionAttribute() {
+		PresentationActionAttribute attr = (PresentationActionAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "action");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationActionAttribute</code> , See {@odf.attribute presentation:action}
+	 *
+	 * @param presentationActionValue   The type is <code>String</code>
+	 */
+	public void setPresentationActionAttribute(String presentationActionValue) {
+		PresentationActionAttribute attr = new PresentationActionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationActionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDirectionAttribute() {
+		PresentationDirectionAttribute attr = (PresentationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @param presentationDirectionValue   The type is <code>String</code>
+	 */
+	public void setPresentationDirectionAttribute(String presentationDirectionValue) {
+		PresentationDirectionAttribute attr = new PresentationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationEffectAttribute() {
+		PresentationEffectAttribute attr = (PresentationEffectAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationEffectAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @param presentationEffectValue   The type is <code>String</code>
+	 */
+	public void setPresentationEffectAttribute(String presentationEffectValue) {
+		PresentationEffectAttribute attr = new PresentationEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSpeedAttribute() {
+		PresentationSpeedAttribute attr = (PresentationSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationSpeedAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @param presentationSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationSpeedAttribute(String presentationSpeedValue) {
+		PresentationSpeedAttribute attr = new PresentationSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSpeedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStartScaleAttribute() {
+		PresentationStartScaleAttribute attr = (PresentationStartScaleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationStartScaleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @param presentationStartScaleValue   The type is <code>String</code>
+	 */
+	public void setPresentationStartScaleAttribute(String presentationStartScaleValue) {
+		PresentationStartScaleAttribute attr = new PresentationStartScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStartScaleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationVerbAttribute</code> , See {@odf.attribute presentation:verb}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getPresentationVerbAttribute() {
+		PresentationVerbAttribute attr = (PresentationVerbAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "verb");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationVerbAttribute</code> , See {@odf.attribute presentation:verb}
+	 *
+	 * @param presentationVerbValue   The type is <code>Integer</code>
+	 */
+	public void setPresentationVerbAttribute(Integer presentationVerbValue) {
+		PresentationVerbAttribute attr = new PresentationVerbAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(presentationVerbValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ScriptEventNameAttribute</code> , See {@odf.attribute script:event-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getScriptEventNameAttribute() {
+		ScriptEventNameAttribute attr = (ScriptEventNameAttribute) getOdfAttribute(OdfDocumentNamespace.SCRIPT, "event-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ScriptEventNameAttribute</code> , See {@odf.attribute script:event-name}
+	 *
+	 * @param scriptEventNameValue   The type is <code>String</code>
+	 */
+	public void setScriptEventNameAttribute(String scriptEventNameValue) {
+		ScriptEventNameAttribute attr = new ScriptEventNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(scriptEventNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationFooterDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationFooterDeclElement.java
new file mode 100644
index 0000000..62e25e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationFooterDeclElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:footer-decl}.
+ *
+ */
+public class PresentationFooterDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "footer-decl");
+
+	/**
+	 * Create the instance of <code>PresentationFooterDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationFooterDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:footer-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNameAttribute() {
+		PresentationNameAttribute attr = (PresentationNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * @param presentationNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationNameAttribute(String presentationNameValue) {
+		PresentationNameAttribute attr = new PresentationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationFooterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationFooterElement.java
new file mode 100644
index 0000000..bc655ea
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationFooterElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:footer}.
+ *
+ */
+public class PresentationFooterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "footer");
+
+	/**
+	 * Create the instance of <code>PresentationFooterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationFooterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:footer}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHeaderDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHeaderDeclElement.java
new file mode 100644
index 0000000..d669f14
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHeaderDeclElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:header-decl}.
+ *
+ */
+public class PresentationHeaderDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "header-decl");
+
+	/**
+	 * Create the instance of <code>PresentationHeaderDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationHeaderDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:header-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNameAttribute() {
+		PresentationNameAttribute attr = (PresentationNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * @param presentationNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationNameAttribute(String presentationNameValue) {
+		PresentationNameAttribute attr = new PresentationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHeaderElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHeaderElement.java
new file mode 100644
index 0000000..cdf3d41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHeaderElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:header}.
+ *
+ */
+public class PresentationHeaderElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "header");
+
+	/**
+	 * Create the instance of <code>PresentationHeaderElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationHeaderElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:header}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHideShapeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHideShapeElement.java
new file mode 100644
index 0000000..a1fdd3a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHideShapeElement.java
@@ -0,0 +1,263 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShapeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPathIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSpeedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartScaleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:hide-shape}.
+ *
+ */
+public class PresentationHideShapeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "hide-shape");
+
+	/**
+	 * Create the instance of <code>PresentationHideShapeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationHideShapeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:hide-shape}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShapeIdAttribute() {
+		DrawShapeIdAttribute attr = (DrawShapeIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shape-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * @param drawShapeIdValue   The type is <code>String</code>
+	 */
+	public void setDrawShapeIdAttribute(String drawShapeIdValue) {
+		DrawShapeIdAttribute attr = new DrawShapeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShapeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDelayAttribute() {
+		PresentationDelayAttribute attr = (PresentationDelayAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @param presentationDelayValue   The type is <code>String</code>
+	 */
+	public void setPresentationDelayAttribute(String presentationDelayValue) {
+		PresentationDelayAttribute attr = new PresentationDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDirectionAttribute() {
+		PresentationDirectionAttribute attr = (PresentationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @param presentationDirectionValue   The type is <code>String</code>
+	 */
+	public void setPresentationDirectionAttribute(String presentationDirectionValue) {
+		PresentationDirectionAttribute attr = new PresentationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationEffectAttribute() {
+		PresentationEffectAttribute attr = (PresentationEffectAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationEffectAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @param presentationEffectValue   The type is <code>String</code>
+	 */
+	public void setPresentationEffectAttribute(String presentationEffectValue) {
+		PresentationEffectAttribute attr = new PresentationEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPathIdAttribute() {
+		PresentationPathIdAttribute attr = (PresentationPathIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "path-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @param presentationPathIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPathIdAttribute(String presentationPathIdValue) {
+		PresentationPathIdAttribute attr = new PresentationPathIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPathIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSpeedAttribute() {
+		PresentationSpeedAttribute attr = (PresentationSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationSpeedAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @param presentationSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationSpeedAttribute(String presentationSpeedValue) {
+		PresentationSpeedAttribute attr = new PresentationSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSpeedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStartScaleAttribute() {
+		PresentationStartScaleAttribute attr = (PresentationStartScaleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationStartScaleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @param presentationStartScaleValue   The type is <code>String</code>
+	 */
+	public void setPresentationStartScaleAttribute(String presentationStartScaleValue) {
+		PresentationStartScaleAttribute attr = new PresentationStartScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStartScaleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHideTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHideTextElement.java
new file mode 100644
index 0000000..95bc8e0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationHideTextElement.java
@@ -0,0 +1,263 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShapeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPathIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSpeedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartScaleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:hide-text}.
+ *
+ */
+public class PresentationHideTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "hide-text");
+
+	/**
+	 * Create the instance of <code>PresentationHideTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationHideTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:hide-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShapeIdAttribute() {
+		DrawShapeIdAttribute attr = (DrawShapeIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shape-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * @param drawShapeIdValue   The type is <code>String</code>
+	 */
+	public void setDrawShapeIdAttribute(String drawShapeIdValue) {
+		DrawShapeIdAttribute attr = new DrawShapeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShapeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDelayAttribute() {
+		PresentationDelayAttribute attr = (PresentationDelayAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @param presentationDelayValue   The type is <code>String</code>
+	 */
+	public void setPresentationDelayAttribute(String presentationDelayValue) {
+		PresentationDelayAttribute attr = new PresentationDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDirectionAttribute() {
+		PresentationDirectionAttribute attr = (PresentationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @param presentationDirectionValue   The type is <code>String</code>
+	 */
+	public void setPresentationDirectionAttribute(String presentationDirectionValue) {
+		PresentationDirectionAttribute attr = new PresentationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationEffectAttribute() {
+		PresentationEffectAttribute attr = (PresentationEffectAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationEffectAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @param presentationEffectValue   The type is <code>String</code>
+	 */
+	public void setPresentationEffectAttribute(String presentationEffectValue) {
+		PresentationEffectAttribute attr = new PresentationEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPathIdAttribute() {
+		PresentationPathIdAttribute attr = (PresentationPathIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "path-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @param presentationPathIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPathIdAttribute(String presentationPathIdValue) {
+		PresentationPathIdAttribute attr = new PresentationPathIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPathIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSpeedAttribute() {
+		PresentationSpeedAttribute attr = (PresentationSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationSpeedAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @param presentationSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationSpeedAttribute(String presentationSpeedValue) {
+		PresentationSpeedAttribute attr = new PresentationSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSpeedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStartScaleAttribute() {
+		PresentationStartScaleAttribute attr = (PresentationStartScaleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationStartScaleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @param presentationStartScaleValue   The type is <code>String</code>
+	 */
+	public void setPresentationStartScaleAttribute(String presentationStartScaleValue) {
+		PresentationStartScaleAttribute attr = new PresentationStartScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStartScaleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationNotesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationNotesElement.java
new file mode 100644
index 0000000..acb8fe0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationNotesElement.java
@@ -0,0 +1,468 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseDateTimeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseFooterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseHeaderNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageLayoutNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:notes}.
+ *
+ */
+public class PresentationNotesElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "notes");
+
+	/**
+	 * Create the instance of <code>PresentationNotesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationNotesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.DrawingPage, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:notes}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseDateTimeNameAttribute</code> , See {@odf.attribute presentation:use-date-time-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseDateTimeNameAttribute() {
+		PresentationUseDateTimeNameAttribute attr = (PresentationUseDateTimeNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-date-time-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseDateTimeNameAttribute</code> , See {@odf.attribute presentation:use-date-time-name}
+	 *
+	 * @param presentationUseDateTimeNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseDateTimeNameAttribute(String presentationUseDateTimeNameValue) {
+		PresentationUseDateTimeNameAttribute attr = new PresentationUseDateTimeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseDateTimeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseFooterNameAttribute</code> , See {@odf.attribute presentation:use-footer-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseFooterNameAttribute() {
+		PresentationUseFooterNameAttribute attr = (PresentationUseFooterNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-footer-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseFooterNameAttribute</code> , See {@odf.attribute presentation:use-footer-name}
+	 *
+	 * @param presentationUseFooterNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseFooterNameAttribute(String presentationUseFooterNameValue) {
+		PresentationUseFooterNameAttribute attr = new PresentationUseFooterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseFooterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseHeaderNameAttribute</code> , See {@odf.attribute presentation:use-header-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseHeaderNameAttribute() {
+		PresentationUseHeaderNameAttribute attr = (PresentationUseHeaderNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-header-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseHeaderNameAttribute</code> , See {@odf.attribute presentation:use-header-name}
+	 *
+	 * @param presentationUseHeaderNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseHeaderNameAttribute(String presentationUseHeaderNameValue) {
+		PresentationUseHeaderNameAttribute attr = new PresentationUseHeaderNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseHeaderNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePageLayoutNameAttribute</code> , See {@odf.attribute style:page-layout-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePageLayoutNameAttribute() {
+		StylePageLayoutNameAttribute attr = (StylePageLayoutNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "page-layout-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePageLayoutNameAttribute</code> , See {@odf.attribute style:page-layout-name}
+	 *
+	 * @param stylePageLayoutNameValue   The type is <code>String</code>
+	 */
+	public void setStylePageLayoutNameAttribute(String stylePageLayoutNameValue) {
+		StylePageLayoutNameAttribute attr = new StylePageLayoutNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePageLayoutNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:forms}.
+	 *
+	 * @return the element {@odf.element office:forms}
+	 */
+	public OfficeFormsElement newOfficeFormsElement() {
+		OfficeFormsElement officeForms = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFormsElement.class);
+		this.appendChild(officeForms);
+		return officeForms;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationPlaceholderElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationPlaceholderElement.java
new file mode 100644
index 0000000..3e1c9b6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationPlaceholderElement.java
@@ -0,0 +1,206 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationObjectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:placeholder}.
+ *
+ */
+public class PresentationPlaceholderElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "placeholder");
+
+	/**
+	 * Create the instance of <code>PresentationPlaceholderElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPlaceholderElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:placeholder}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationObjectAttribute</code> , See {@odf.attribute presentation:object}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationObjectAttribute() {
+		PresentationObjectAttribute attr = (PresentationObjectAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "object");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationObjectAttribute</code> , See {@odf.attribute presentation:object}
+	 *
+	 * @param presentationObjectValue   The type is <code>String</code>
+	 */
+	public void setPresentationObjectAttribute(String presentationObjectValue) {
+		PresentationObjectAttribute attr = new PresentationObjectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationObjectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationPlayElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationPlayElement.java
new file mode 100644
index 0000000..62f14c3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationPlayElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShapeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSpeedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:play}.
+ *
+ */
+public class PresentationPlayElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "play");
+
+	/**
+	 * Create the instance of <code>PresentationPlayElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationPlayElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:play}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShapeIdAttribute() {
+		DrawShapeIdAttribute attr = (DrawShapeIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shape-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * @param drawShapeIdValue   The type is <code>String</code>
+	 */
+	public void setDrawShapeIdAttribute(String drawShapeIdValue) {
+		DrawShapeIdAttribute attr = new DrawShapeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShapeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSpeedAttribute() {
+		PresentationSpeedAttribute attr = (PresentationSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationSpeedAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @param presentationSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationSpeedAttribute(String presentationSpeedValue) {
+		PresentationSpeedAttribute attr = new PresentationSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSpeedValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationSettingsElement.java
new file mode 100644
index 0000000..98e305e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationSettingsElement.java
@@ -0,0 +1,436 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationAnimationsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationEndlessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationForceManualAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationFullScreenAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMouseAsPenAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationMouseVisibleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPauseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationShowEndOfPresentationSlideAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationShowLogoAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartPageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartWithNavigatorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStayOnTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationTransitionOnClickAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:settings}.
+ *
+ */
+public class PresentationSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "settings");
+
+	/**
+	 * Create the instance of <code>PresentationSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationAnimationsAttribute</code> , See {@odf.attribute presentation:animations}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationAnimationsAttribute() {
+		PresentationAnimationsAttribute attr = (PresentationAnimationsAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "animations");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationAnimationsAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationAnimationsAttribute</code> , See {@odf.attribute presentation:animations}
+	 *
+	 * @param presentationAnimationsValue   The type is <code>String</code>
+	 */
+	public void setPresentationAnimationsAttribute(String presentationAnimationsValue) {
+		PresentationAnimationsAttribute attr = new PresentationAnimationsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationAnimationsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationEndlessAttribute</code> , See {@odf.attribute presentation:endless}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationEndlessAttribute() {
+		PresentationEndlessAttribute attr = (PresentationEndlessAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "endless");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationEndlessAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationEndlessAttribute</code> , See {@odf.attribute presentation:endless}
+	 *
+	 * @param presentationEndlessValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationEndlessAttribute(Boolean presentationEndlessValue) {
+		PresentationEndlessAttribute attr = new PresentationEndlessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationEndlessValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationForceManualAttribute</code> , See {@odf.attribute presentation:force-manual}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationForceManualAttribute() {
+		PresentationForceManualAttribute attr = (PresentationForceManualAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "force-manual");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationForceManualAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationForceManualAttribute</code> , See {@odf.attribute presentation:force-manual}
+	 *
+	 * @param presentationForceManualValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationForceManualAttribute(Boolean presentationForceManualValue) {
+		PresentationForceManualAttribute attr = new PresentationForceManualAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationForceManualValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationFullScreenAttribute</code> , See {@odf.attribute presentation:full-screen}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationFullScreenAttribute() {
+		PresentationFullScreenAttribute attr = (PresentationFullScreenAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "full-screen");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationFullScreenAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationFullScreenAttribute</code> , See {@odf.attribute presentation:full-screen}
+	 *
+	 * @param presentationFullScreenValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationFullScreenAttribute(Boolean presentationFullScreenValue) {
+		PresentationFullScreenAttribute attr = new PresentationFullScreenAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationFullScreenValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMouseAsPenAttribute</code> , See {@odf.attribute presentation:mouse-as-pen}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationMouseAsPenAttribute() {
+		PresentationMouseAsPenAttribute attr = (PresentationMouseAsPenAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "mouse-as-pen");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationMouseAsPenAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMouseAsPenAttribute</code> , See {@odf.attribute presentation:mouse-as-pen}
+	 *
+	 * @param presentationMouseAsPenValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationMouseAsPenAttribute(Boolean presentationMouseAsPenValue) {
+		PresentationMouseAsPenAttribute attr = new PresentationMouseAsPenAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationMouseAsPenValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationMouseVisibleAttribute</code> , See {@odf.attribute presentation:mouse-visible}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationMouseVisibleAttribute() {
+		PresentationMouseVisibleAttribute attr = (PresentationMouseVisibleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "mouse-visible");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationMouseVisibleAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationMouseVisibleAttribute</code> , See {@odf.attribute presentation:mouse-visible}
+	 *
+	 * @param presentationMouseVisibleValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationMouseVisibleAttribute(Boolean presentationMouseVisibleValue) {
+		PresentationMouseVisibleAttribute attr = new PresentationMouseVisibleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationMouseVisibleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPauseAttribute</code> , See {@odf.attribute presentation:pause}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPauseAttribute() {
+		PresentationPauseAttribute attr = (PresentationPauseAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "pause");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPauseAttribute</code> , See {@odf.attribute presentation:pause}
+	 *
+	 * @param presentationPauseValue   The type is <code>String</code>
+	 */
+	public void setPresentationPauseAttribute(String presentationPauseValue) {
+		PresentationPauseAttribute attr = new PresentationPauseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPauseValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationShowAttribute</code> , See {@odf.attribute presentation:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationShowAttribute() {
+		PresentationShowAttribute attr = (PresentationShowAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationShowAttribute</code> , See {@odf.attribute presentation:show}
+	 *
+	 * @param presentationShowValue   The type is <code>String</code>
+	 */
+	public void setPresentationShowAttribute(String presentationShowValue) {
+		PresentationShowAttribute attr = new PresentationShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationShowEndOfPresentationSlideAttribute</code> , See {@odf.attribute presentation:show-end-of-presentation-slide}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationShowEndOfPresentationSlideAttribute() {
+		PresentationShowEndOfPresentationSlideAttribute attr = (PresentationShowEndOfPresentationSlideAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "show-end-of-presentation-slide");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationShowEndOfPresentationSlideAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationShowEndOfPresentationSlideAttribute</code> , See {@odf.attribute presentation:show-end-of-presentation-slide}
+	 *
+	 * @param presentationShowEndOfPresentationSlideValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationShowEndOfPresentationSlideAttribute(Boolean presentationShowEndOfPresentationSlideValue) {
+		PresentationShowEndOfPresentationSlideAttribute attr = new PresentationShowEndOfPresentationSlideAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationShowEndOfPresentationSlideValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationShowLogoAttribute</code> , See {@odf.attribute presentation:show-logo}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationShowLogoAttribute() {
+		PresentationShowLogoAttribute attr = (PresentationShowLogoAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "show-logo");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationShowLogoAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationShowLogoAttribute</code> , See {@odf.attribute presentation:show-logo}
+	 *
+	 * @param presentationShowLogoValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationShowLogoAttribute(Boolean presentationShowLogoValue) {
+		PresentationShowLogoAttribute attr = new PresentationShowLogoAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationShowLogoValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartPageAttribute</code> , See {@odf.attribute presentation:start-page}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStartPageAttribute() {
+		PresentationStartPageAttribute attr = (PresentationStartPageAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-page");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartPageAttribute</code> , See {@odf.attribute presentation:start-page}
+	 *
+	 * @param presentationStartPageValue   The type is <code>String</code>
+	 */
+	public void setPresentationStartPageAttribute(String presentationStartPageValue) {
+		PresentationStartPageAttribute attr = new PresentationStartPageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStartPageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartWithNavigatorAttribute</code> , See {@odf.attribute presentation:start-with-navigator}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationStartWithNavigatorAttribute() {
+		PresentationStartWithNavigatorAttribute attr = (PresentationStartWithNavigatorAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-with-navigator");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationStartWithNavigatorAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartWithNavigatorAttribute</code> , See {@odf.attribute presentation:start-with-navigator}
+	 *
+	 * @param presentationStartWithNavigatorValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationStartWithNavigatorAttribute(Boolean presentationStartWithNavigatorValue) {
+		PresentationStartWithNavigatorAttribute attr = new PresentationStartWithNavigatorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationStartWithNavigatorValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStayOnTopAttribute</code> , See {@odf.attribute presentation:stay-on-top}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationStayOnTopAttribute() {
+		PresentationStayOnTopAttribute attr = (PresentationStayOnTopAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "stay-on-top");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(PresentationStayOnTopAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStayOnTopAttribute</code> , See {@odf.attribute presentation:stay-on-top}
+	 *
+	 * @param presentationStayOnTopValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationStayOnTopAttribute(Boolean presentationStayOnTopValue) {
+		PresentationStayOnTopAttribute attr = new PresentationStayOnTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationStayOnTopValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationTransitionOnClickAttribute</code> , See {@odf.attribute presentation:transition-on-click}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationTransitionOnClickAttribute() {
+		PresentationTransitionOnClickAttribute attr = (PresentationTransitionOnClickAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "transition-on-click");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationTransitionOnClickAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationTransitionOnClickAttribute</code> , See {@odf.attribute presentation:transition-on-click}
+	 *
+	 * @param presentationTransitionOnClickValue   The type is <code>String</code>
+	 */
+	public void setPresentationTransitionOnClickAttribute(String presentationTransitionOnClickValue) {
+		PresentationTransitionOnClickAttribute attr = new PresentationTransitionOnClickAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationTransitionOnClickValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:show}.
+	 *
+	 * @param presentationNameValue  the <code>String</code> value of <code>PresentationNameAttribute</code>, see {@odf.attribute  presentation:name} at specification
+	 * @param presentationPagesValue  the <code>String</code> value of <code>PresentationPagesAttribute</code>, see {@odf.attribute  presentation:pages} at specification
+	 * @return the element {@odf.element presentation:show}
+	 */
+	 public PresentationShowElement newPresentationShowElement(String presentationNameValue, String presentationPagesValue) {
+		PresentationShowElement presentationShow = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationShowElement.class);
+		presentationShow.setPresentationNameAttribute(presentationNameValue);
+		presentationShow.setPresentationPagesAttribute(presentationPagesValue);
+		this.appendChild(presentationShow);
+		return presentationShow;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowElement.java
new file mode 100644
index 0000000..cb6f86b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPagesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:show}.
+ *
+ */
+public class PresentationShowElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "show");
+
+	/**
+	 * Create the instance of <code>PresentationShowElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationShowElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:show}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationNameAttribute() {
+		PresentationNameAttribute attr = (PresentationNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationNameAttribute</code> , See {@odf.attribute presentation:name}
+	 *
+	 * @param presentationNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationNameAttribute(String presentationNameValue) {
+		PresentationNameAttribute attr = new PresentationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPagesAttribute</code> , See {@odf.attribute presentation:pages}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPagesAttribute() {
+		PresentationPagesAttribute attr = (PresentationPagesAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "pages");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPagesAttribute</code> , See {@odf.attribute presentation:pages}
+	 *
+	 * @param presentationPagesValue   The type is <code>String</code>
+	 */
+	public void setPresentationPagesAttribute(String presentationPagesValue) {
+		PresentationPagesAttribute attr = new PresentationPagesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPagesValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowShapeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowShapeElement.java
new file mode 100644
index 0000000..15680ef
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowShapeElement.java
@@ -0,0 +1,263 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShapeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPathIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSpeedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartScaleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:show-shape}.
+ *
+ */
+public class PresentationShowShapeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "show-shape");
+
+	/**
+	 * Create the instance of <code>PresentationShowShapeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationShowShapeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:show-shape}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShapeIdAttribute() {
+		DrawShapeIdAttribute attr = (DrawShapeIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shape-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * @param drawShapeIdValue   The type is <code>String</code>
+	 */
+	public void setDrawShapeIdAttribute(String drawShapeIdValue) {
+		DrawShapeIdAttribute attr = new DrawShapeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShapeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDelayAttribute() {
+		PresentationDelayAttribute attr = (PresentationDelayAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @param presentationDelayValue   The type is <code>String</code>
+	 */
+	public void setPresentationDelayAttribute(String presentationDelayValue) {
+		PresentationDelayAttribute attr = new PresentationDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDirectionAttribute() {
+		PresentationDirectionAttribute attr = (PresentationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @param presentationDirectionValue   The type is <code>String</code>
+	 */
+	public void setPresentationDirectionAttribute(String presentationDirectionValue) {
+		PresentationDirectionAttribute attr = new PresentationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationEffectAttribute() {
+		PresentationEffectAttribute attr = (PresentationEffectAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationEffectAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @param presentationEffectValue   The type is <code>String</code>
+	 */
+	public void setPresentationEffectAttribute(String presentationEffectValue) {
+		PresentationEffectAttribute attr = new PresentationEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPathIdAttribute() {
+		PresentationPathIdAttribute attr = (PresentationPathIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "path-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @param presentationPathIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPathIdAttribute(String presentationPathIdValue) {
+		PresentationPathIdAttribute attr = new PresentationPathIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPathIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSpeedAttribute() {
+		PresentationSpeedAttribute attr = (PresentationSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationSpeedAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @param presentationSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationSpeedAttribute(String presentationSpeedValue) {
+		PresentationSpeedAttribute attr = new PresentationSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSpeedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStartScaleAttribute() {
+		PresentationStartScaleAttribute attr = (PresentationStartScaleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationStartScaleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @param presentationStartScaleValue   The type is <code>String</code>
+	 */
+	public void setPresentationStartScaleAttribute(String presentationStartScaleValue) {
+		PresentationStartScaleAttribute attr = new PresentationStartScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStartScaleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowTextElement.java
new file mode 100644
index 0000000..1d8a704
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationShowTextElement.java
@@ -0,0 +1,263 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShapeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationEffectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPathIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationSpeedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationStartScaleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:show-text}.
+ *
+ */
+public class PresentationShowTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "show-text");
+
+	/**
+	 * Create the instance of <code>PresentationShowTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationShowTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:show-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShapeIdAttribute() {
+		DrawShapeIdAttribute attr = (DrawShapeIdAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shape-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShapeIdAttribute</code> , See {@odf.attribute draw:shape-id}
+	 *
+	 * @param drawShapeIdValue   The type is <code>String</code>
+	 */
+	public void setDrawShapeIdAttribute(String drawShapeIdValue) {
+		DrawShapeIdAttribute attr = new DrawShapeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShapeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDelayAttribute() {
+		PresentationDelayAttribute attr = (PresentationDelayAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDelayAttribute</code> , See {@odf.attribute presentation:delay}
+	 *
+	 * @param presentationDelayValue   The type is <code>String</code>
+	 */
+	public void setPresentationDelayAttribute(String presentationDelayValue) {
+		PresentationDelayAttribute attr = new PresentationDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDirectionAttribute() {
+		PresentationDirectionAttribute attr = (PresentationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationDirectionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDirectionAttribute</code> , See {@odf.attribute presentation:direction}
+	 *
+	 * @param presentationDirectionValue   The type is <code>String</code>
+	 */
+	public void setPresentationDirectionAttribute(String presentationDirectionValue) {
+		PresentationDirectionAttribute attr = new PresentationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationEffectAttribute() {
+		PresentationEffectAttribute attr = (PresentationEffectAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "effect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationEffectAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationEffectAttribute</code> , See {@odf.attribute presentation:effect}
+	 *
+	 * @param presentationEffectValue   The type is <code>String</code>
+	 */
+	public void setPresentationEffectAttribute(String presentationEffectValue) {
+		PresentationEffectAttribute attr = new PresentationEffectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationEffectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPathIdAttribute() {
+		PresentationPathIdAttribute attr = (PresentationPathIdAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "path-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPathIdAttribute</code> , See {@odf.attribute presentation:path-id}
+	 *
+	 * @param presentationPathIdValue   The type is <code>String</code>
+	 */
+	public void setPresentationPathIdAttribute(String presentationPathIdValue) {
+		PresentationPathIdAttribute attr = new PresentationPathIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPathIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationSpeedAttribute() {
+		PresentationSpeedAttribute attr = (PresentationSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationSpeedAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationSpeedAttribute</code> , See {@odf.attribute presentation:speed}
+	 *
+	 * @param presentationSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationSpeedAttribute(String presentationSpeedValue) {
+		PresentationSpeedAttribute attr = new PresentationSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationSpeedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationStartScaleAttribute() {
+		PresentationStartScaleAttribute attr = (PresentationStartScaleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "start-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return PresentationStartScaleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationStartScaleAttribute</code> , See {@odf.attribute presentation:start-scale}
+	 *
+	 * @param presentationStartScaleValue   The type is <code>String</code>
+	 */
+	public void setPresentationStartScaleAttribute(String presentationStartScaleValue) {
+		PresentationStartScaleAttribute attr = new PresentationStartScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationStartScaleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationSoundElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationSoundElement.java
new file mode 100644
index 0000000..fc427a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/presentation/PresentationSoundElement.java
@@ -0,0 +1,225 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.presentation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPlayFullAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element presentation:sound}.
+ *
+ */
+public class PresentationSoundElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.PRESENTATION, "sound");
+
+	/**
+	 * Create the instance of <code>PresentationSoundElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public PresentationSoundElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element presentation:sound}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPlayFullAttribute</code> , See {@odf.attribute presentation:play-full}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationPlayFullAttribute() {
+		PresentationPlayFullAttribute attr = (PresentationPlayFullAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "play-full");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPlayFullAttribute</code> , See {@odf.attribute presentation:play-full}
+	 *
+	 * @param presentationPlayFullValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationPlayFullAttribute(Boolean presentationPlayFullValue) {
+		PresentationPlayFullAttribute attr = new PresentationPlayFullAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationPlayFullValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/script/ScriptEventListenerElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/script/ScriptEventListenerElement.java
new file mode 100644
index 0000000..c2b9edd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/script/ScriptEventListenerElement.java
@@ -0,0 +1,225 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.script;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.script.ScriptEventNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.script.ScriptLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.script.ScriptMacroNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element script:event-listener}.
+ *
+ */
+public class ScriptEventListenerElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SCRIPT, "event-listener");
+
+	/**
+	 * Create the instance of <code>ScriptEventListenerElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public ScriptEventListenerElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element script:event-listener}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ScriptEventNameAttribute</code> , See {@odf.attribute script:event-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getScriptEventNameAttribute() {
+		ScriptEventNameAttribute attr = (ScriptEventNameAttribute) getOdfAttribute(OdfDocumentNamespace.SCRIPT, "event-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ScriptEventNameAttribute</code> , See {@odf.attribute script:event-name}
+	 *
+	 * @param scriptEventNameValue   The type is <code>String</code>
+	 */
+	public void setScriptEventNameAttribute(String scriptEventNameValue) {
+		ScriptEventNameAttribute attr = new ScriptEventNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(scriptEventNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ScriptLanguageAttribute</code> , See {@odf.attribute script:language}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getScriptLanguageAttribute() {
+		ScriptLanguageAttribute attr = (ScriptLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.SCRIPT, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ScriptLanguageAttribute</code> , See {@odf.attribute script:language}
+	 *
+	 * @param scriptLanguageValue   The type is <code>String</code>
+	 */
+	public void setScriptLanguageAttribute(String scriptLanguageValue) {
+		ScriptLanguageAttribute attr = new ScriptLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(scriptLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ScriptMacroNameAttribute</code> , See {@odf.attribute script:macro-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getScriptMacroNameAttribute() {
+		ScriptMacroNameAttribute attr = (ScriptMacroNameAttribute) getOdfAttribute(OdfDocumentNamespace.SCRIPT, "macro-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ScriptMacroNameAttribute</code> , See {@odf.attribute script:macro-name}
+	 *
+	 * @param scriptMacroNameValue   The type is <code>String</code>
+	 */
+	public void setScriptMacroNameAttribute(String scriptMacroNameValue) {
+		ScriptMacroNameAttribute attr = new ScriptMacroNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(scriptMacroNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleBackgroundImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleBackgroundImageElement.java
new file mode 100644
index 0000000..1c3a49e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleBackgroundImageElement.java
@@ -0,0 +1,285 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBinaryDataElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawOpacityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFilterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:background-image}.
+ *
+ */
+public class StyleBackgroundImageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "background-image");
+
+	/**
+	 * Create the instance of <code>StyleBackgroundImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleBackgroundImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:background-image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawOpacityAttribute</code> , See {@odf.attribute draw:opacity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawOpacityAttribute() {
+		DrawOpacityAttribute attr = (DrawOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "opacity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawOpacityAttribute</code> , See {@odf.attribute draw:opacity}
+	 *
+	 * @param drawOpacityValue   The type is <code>String</code>
+	 */
+	public void setDrawOpacityAttribute(String drawOpacityValue) {
+		DrawOpacityAttribute attr = new DrawOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawOpacityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFilterNameAttribute</code> , See {@odf.attribute style:filter-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFilterNameAttribute() {
+		StyleFilterNameAttribute attr = (StyleFilterNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "filter-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFilterNameAttribute</code> , See {@odf.attribute style:filter-name}
+	 *
+	 * @param styleFilterNameValue   The type is <code>String</code>
+	 */
+	public void setStyleFilterNameAttribute(String styleFilterNameValue) {
+		StyleFilterNameAttribute attr = new StyleFilterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFilterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePositionAttribute</code> , See {@odf.attribute style:position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePositionAttribute() {
+		StylePositionAttribute attr = (StylePositionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StylePositionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePositionAttribute</code> , See {@odf.attribute style:position}
+	 *
+	 * @param stylePositionValue   The type is <code>String</code>
+	 */
+	public void setStylePositionAttribute(String stylePositionValue) {
+		StylePositionAttribute attr = new StylePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRepeatAttribute</code> , See {@odf.attribute style:repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRepeatAttribute() {
+		StyleRepeatAttribute attr = (StyleRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleRepeatAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRepeatAttribute</code> , See {@odf.attribute style:repeat}
+	 *
+	 * @param styleRepeatValue   The type is <code>String</code>
+	 */
+	public void setStyleRepeatAttribute(String styleRepeatValue) {
+		StyleRepeatAttribute attr = new StyleRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:binary-data}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:binary-data}
+	 */
+	public OfficeBinaryDataElement newOfficeBinaryDataElement() {
+		OfficeBinaryDataElement officeBinaryData = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeBinaryDataElement.class);
+		this.appendChild(officeBinaryData);
+		return officeBinaryData;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleChartPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleChartPropertiesElement.java
new file mode 100644
index 0000000..bc598cd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleChartPropertiesElement.java
@@ -0,0 +1,2010 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.chart.ChartLabelSeparatorElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartSymbolImageElement;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAngleOffsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAutoPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAutoSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAxisLabelPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartAxisPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartConnectBarsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDataLabelNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDataLabelSymbolAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDataLabelTextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDeepAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDisplayLabelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorCategoryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorLowerIndicatorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorLowerLimitAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorLowerRangeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorMarginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorPercentageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorUpperIndicatorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorUpperLimitAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartErrorUpperRangeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartGapWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartGroupBarsPerAxisAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartHoleSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartIncludeHiddenCellsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartInterpolationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartIntervalMajorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartIntervalMinorDivisorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartJapaneseCandleStickAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLabelArrangementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLabelPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLabelPositionNegativeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLinkDataStyleToSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLogarithmicAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartMaximumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartMeanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartMinimumAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartOriginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartOverlapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartPercentageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartPieOffsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartRegressionTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartReverseDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartRightAngledAxesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartScaleTextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSeriesSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSolidTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSortByXValuesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSplineOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSplineResolutionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartStackedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSymbolHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSymbolNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSymbolTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartSymbolWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTextOverlapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartThreeDimensionalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTickMarkPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTickMarksMajorInnerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTickMarksMajorOuterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTickMarksMinorInnerAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTickMarksMinorOuterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartTreatEmptyCellsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartVisibleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRotationAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLineBreakAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:chart-properties}.
+ *
+ */
+public class StyleChartPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "chart-properties");
+
+	/**
+	 * Create the instance of <code>StyleChartPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleChartPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:chart-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty AngleOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "angle-offset"));
+
+	public final static OdfStyleProperty AutoPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "auto-position"));
+
+	public final static OdfStyleProperty AutoSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "auto-size"));
+
+	public final static OdfStyleProperty AxisLabelPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "axis-label-position"));
+
+	public final static OdfStyleProperty AxisPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "axis-position"));
+
+	public final static OdfStyleProperty ConnectBars =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "connect-bars"));
+
+	public final static OdfStyleProperty DataLabelNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "data-label-number"));
+
+	public final static OdfStyleProperty DataLabelSymbol =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "data-label-symbol"));
+
+	public final static OdfStyleProperty DataLabelText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "data-label-text"));
+
+	public final static OdfStyleProperty Deep =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "deep"));
+
+	public final static OdfStyleProperty DisplayLabel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "display-label"));
+
+	public final static OdfStyleProperty ErrorCategory =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-category"));
+
+	public final static OdfStyleProperty ErrorLowerIndicator =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-indicator"));
+
+	public final static OdfStyleProperty ErrorLowerLimit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-limit"));
+
+	public final static OdfStyleProperty ErrorLowerRange =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-range"));
+
+	public final static OdfStyleProperty ErrorMargin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-margin"));
+
+	public final static OdfStyleProperty ErrorPercentage =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-percentage"));
+
+	public final static OdfStyleProperty ErrorUpperIndicator =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-indicator"));
+
+	public final static OdfStyleProperty ErrorUpperLimit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-limit"));
+
+	public final static OdfStyleProperty ErrorUpperRange =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-range"));
+
+	public final static OdfStyleProperty GapWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "gap-width"));
+
+	public final static OdfStyleProperty GroupBarsPerAxis =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "group-bars-per-axis"));
+
+	public final static OdfStyleProperty HoleSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "hole-size"));
+
+	public final static OdfStyleProperty IncludeHiddenCells =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "include-hidden-cells"));
+
+	public final static OdfStyleProperty Interpolation =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "interpolation"));
+
+	public final static OdfStyleProperty IntervalMajor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "interval-major"));
+
+	public final static OdfStyleProperty IntervalMinorDivisor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "interval-minor-divisor"));
+
+	public final static OdfStyleProperty JapaneseCandleStick =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "japanese-candle-stick"));
+
+	public final static OdfStyleProperty LabelArrangement =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "label-arrangement"));
+
+	public final static OdfStyleProperty LabelPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "label-position"));
+
+	public final static OdfStyleProperty LabelPositionNegative =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "label-position-negative"));
+
+	public final static OdfStyleProperty Lines =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "lines"));
+
+	public final static OdfStyleProperty LinkDataStyleToSource =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "link-data-style-to-source"));
+
+	public final static OdfStyleProperty Logarithmic =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "logarithmic"));
+
+	public final static OdfStyleProperty Maximum =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "maximum"));
+
+	public final static OdfStyleProperty MeanValue =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "mean-value"));
+
+	public final static OdfStyleProperty Minimum =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "minimum"));
+
+	public final static OdfStyleProperty Origin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "origin"));
+
+	public final static OdfStyleProperty Overlap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "overlap"));
+
+	public final static OdfStyleProperty Percentage =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "percentage"));
+
+	public final static OdfStyleProperty PieOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "pie-offset"));
+
+	public final static OdfStyleProperty RegressionType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "regression-type"));
+
+	public final static OdfStyleProperty ReverseDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "reverse-direction"));
+
+	public final static OdfStyleProperty RightAngledAxes =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "right-angled-axes"));
+
+	public final static OdfStyleProperty ScaleText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "scale-text"));
+
+	public final static OdfStyleProperty SeriesSource =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "series-source"));
+
+	public final static OdfStyleProperty SolidType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "solid-type"));
+
+	public final static OdfStyleProperty SortByXValues =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "sort-by-x-values"));
+
+	public final static OdfStyleProperty SplineOrder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "spline-order"));
+
+	public final static OdfStyleProperty SplineResolution =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "spline-resolution"));
+
+	public final static OdfStyleProperty Stacked =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "stacked"));
+
+	public final static OdfStyleProperty SymbolHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-height"));
+
+	public final static OdfStyleProperty SymbolName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-name"));
+
+	public final static OdfStyleProperty SymbolType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-type"));
+
+	public final static OdfStyleProperty SymbolWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-width"));
+
+	public final static OdfStyleProperty TextOverlap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "text-overlap"));
+
+	public final static OdfStyleProperty ThreeDimensional =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "three-dimensional"));
+
+	public final static OdfStyleProperty TickMarkPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-mark-position"));
+
+	public final static OdfStyleProperty TickMarksMajorInner =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-major-inner"));
+
+	public final static OdfStyleProperty TickMarksMajorOuter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-major-outer"));
+
+	public final static OdfStyleProperty TickMarksMinorInner =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-minor-inner"));
+
+	public final static OdfStyleProperty TickMarksMinorOuter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-minor-outer"));
+
+	public final static OdfStyleProperty TreatEmptyCells =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "treat-empty-cells"));
+
+	public final static OdfStyleProperty Vertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "vertical"));
+
+	public final static OdfStyleProperty Visible =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "visible"));
+
+	public final static OdfStyleProperty Direction =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "direction"));
+
+	public final static OdfStyleProperty RotationAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-angle"));
+
+	public final static OdfStyleProperty LineBreak =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "line-break"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAngleOffsetAttribute</code> , See {@odf.attribute chart:angle-offset}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartAngleOffsetAttribute() {
+		ChartAngleOffsetAttribute attr = (ChartAngleOffsetAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "angle-offset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAngleOffsetAttribute</code> , See {@odf.attribute chart:angle-offset}
+	 *
+	 * @param chartAngleOffsetValue   The type is <code>String</code>
+	 */
+	public void setChartAngleOffsetAttribute(String chartAngleOffsetValue) {
+		ChartAngleOffsetAttribute attr = new ChartAngleOffsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartAngleOffsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAutoPositionAttribute</code> , See {@odf.attribute chart:auto-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartAutoPositionAttribute() {
+		ChartAutoPositionAttribute attr = (ChartAutoPositionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "auto-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAutoPositionAttribute</code> , See {@odf.attribute chart:auto-position}
+	 *
+	 * @param chartAutoPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setChartAutoPositionAttribute(Boolean chartAutoPositionValue) {
+		ChartAutoPositionAttribute attr = new ChartAutoPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartAutoPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAutoSizeAttribute</code> , See {@odf.attribute chart:auto-size}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartAutoSizeAttribute() {
+		ChartAutoSizeAttribute attr = (ChartAutoSizeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "auto-size");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAutoSizeAttribute</code> , See {@odf.attribute chart:auto-size}
+	 *
+	 * @param chartAutoSizeValue   The type is <code>Boolean</code>
+	 */
+	public void setChartAutoSizeAttribute(Boolean chartAutoSizeValue) {
+		ChartAutoSizeAttribute attr = new ChartAutoSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartAutoSizeValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAxisLabelPositionAttribute</code> , See {@odf.attribute chart:axis-label-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartAxisLabelPositionAttribute() {
+		ChartAxisLabelPositionAttribute attr = (ChartAxisLabelPositionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "axis-label-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAxisLabelPositionAttribute</code> , See {@odf.attribute chart:axis-label-position}
+	 *
+	 * @param chartAxisLabelPositionValue   The type is <code>String</code>
+	 */
+	public void setChartAxisLabelPositionAttribute(String chartAxisLabelPositionValue) {
+		ChartAxisLabelPositionAttribute attr = new ChartAxisLabelPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartAxisLabelPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartAxisPositionAttribute</code> , See {@odf.attribute chart:axis-position}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartAxisPositionAttribute() {
+		ChartAxisPositionAttribute attr = (ChartAxisPositionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "axis-position");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartAxisPositionAttribute</code> , See {@odf.attribute chart:axis-position}
+	 *
+	 * @param chartAxisPositionValue   The type is <code>Double</code>
+	 */
+	public void setChartAxisPositionAttribute(Double chartAxisPositionValue) {
+		ChartAxisPositionAttribute attr = new ChartAxisPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartAxisPositionValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartConnectBarsAttribute</code> , See {@odf.attribute chart:connect-bars}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartConnectBarsAttribute() {
+		ChartConnectBarsAttribute attr = (ChartConnectBarsAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "connect-bars");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartConnectBarsAttribute</code> , See {@odf.attribute chart:connect-bars}
+	 *
+	 * @param chartConnectBarsValue   The type is <code>Boolean</code>
+	 */
+	public void setChartConnectBarsAttribute(Boolean chartConnectBarsValue) {
+		ChartConnectBarsAttribute attr = new ChartConnectBarsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartConnectBarsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDataLabelNumberAttribute</code> , See {@odf.attribute chart:data-label-number}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartDataLabelNumberAttribute() {
+		ChartDataLabelNumberAttribute attr = (ChartDataLabelNumberAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "data-label-number");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDataLabelNumberAttribute</code> , See {@odf.attribute chart:data-label-number}
+	 *
+	 * @param chartDataLabelNumberValue   The type is <code>String</code>
+	 */
+	public void setChartDataLabelNumberAttribute(String chartDataLabelNumberValue) {
+		ChartDataLabelNumberAttribute attr = new ChartDataLabelNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartDataLabelNumberValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDataLabelSymbolAttribute</code> , See {@odf.attribute chart:data-label-symbol}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartDataLabelSymbolAttribute() {
+		ChartDataLabelSymbolAttribute attr = (ChartDataLabelSymbolAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "data-label-symbol");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDataLabelSymbolAttribute</code> , See {@odf.attribute chart:data-label-symbol}
+	 *
+	 * @param chartDataLabelSymbolValue   The type is <code>Boolean</code>
+	 */
+	public void setChartDataLabelSymbolAttribute(Boolean chartDataLabelSymbolValue) {
+		ChartDataLabelSymbolAttribute attr = new ChartDataLabelSymbolAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartDataLabelSymbolValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDataLabelTextAttribute</code> , See {@odf.attribute chart:data-label-text}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartDataLabelTextAttribute() {
+		ChartDataLabelTextAttribute attr = (ChartDataLabelTextAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "data-label-text");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDataLabelTextAttribute</code> , See {@odf.attribute chart:data-label-text}
+	 *
+	 * @param chartDataLabelTextValue   The type is <code>Boolean</code>
+	 */
+	public void setChartDataLabelTextAttribute(Boolean chartDataLabelTextValue) {
+		ChartDataLabelTextAttribute attr = new ChartDataLabelTextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartDataLabelTextValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDeepAttribute</code> , See {@odf.attribute chart:deep}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartDeepAttribute() {
+		ChartDeepAttribute attr = (ChartDeepAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "deep");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDeepAttribute</code> , See {@odf.attribute chart:deep}
+	 *
+	 * @param chartDeepValue   The type is <code>Boolean</code>
+	 */
+	public void setChartDeepAttribute(Boolean chartDeepValue) {
+		ChartDeepAttribute attr = new ChartDeepAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartDeepValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartDisplayLabelAttribute</code> , See {@odf.attribute chart:display-label}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartDisplayLabelAttribute() {
+		ChartDisplayLabelAttribute attr = (ChartDisplayLabelAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "display-label");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartDisplayLabelAttribute</code> , See {@odf.attribute chart:display-label}
+	 *
+	 * @param chartDisplayLabelValue   The type is <code>Boolean</code>
+	 */
+	public void setChartDisplayLabelAttribute(Boolean chartDisplayLabelValue) {
+		ChartDisplayLabelAttribute attr = new ChartDisplayLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartDisplayLabelValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorCategoryAttribute</code> , See {@odf.attribute chart:error-category}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartErrorCategoryAttribute() {
+		ChartErrorCategoryAttribute attr = (ChartErrorCategoryAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-category");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorCategoryAttribute</code> , See {@odf.attribute chart:error-category}
+	 *
+	 * @param chartErrorCategoryValue   The type is <code>String</code>
+	 */
+	public void setChartErrorCategoryAttribute(String chartErrorCategoryValue) {
+		ChartErrorCategoryAttribute attr = new ChartErrorCategoryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartErrorCategoryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorLowerIndicatorAttribute</code> , See {@odf.attribute chart:error-lower-indicator}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartErrorLowerIndicatorAttribute() {
+		ChartErrorLowerIndicatorAttribute attr = (ChartErrorLowerIndicatorAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-lower-indicator");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorLowerIndicatorAttribute</code> , See {@odf.attribute chart:error-lower-indicator}
+	 *
+	 * @param chartErrorLowerIndicatorValue   The type is <code>Boolean</code>
+	 */
+	public void setChartErrorLowerIndicatorAttribute(Boolean chartErrorLowerIndicatorValue) {
+		ChartErrorLowerIndicatorAttribute attr = new ChartErrorLowerIndicatorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartErrorLowerIndicatorValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorLowerLimitAttribute</code> , See {@odf.attribute chart:error-lower-limit}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartErrorLowerLimitAttribute() {
+		ChartErrorLowerLimitAttribute attr = (ChartErrorLowerLimitAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-lower-limit");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorLowerLimitAttribute</code> , See {@odf.attribute chart:error-lower-limit}
+	 *
+	 * @param chartErrorLowerLimitValue   The type is <code>Double</code>
+	 */
+	public void setChartErrorLowerLimitAttribute(Double chartErrorLowerLimitValue) {
+		ChartErrorLowerLimitAttribute attr = new ChartErrorLowerLimitAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartErrorLowerLimitValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorLowerRangeAttribute</code> , See {@odf.attribute chart:error-lower-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartErrorLowerRangeAttribute() {
+		ChartErrorLowerRangeAttribute attr = (ChartErrorLowerRangeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-lower-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorLowerRangeAttribute</code> , See {@odf.attribute chart:error-lower-range}
+	 *
+	 * @param chartErrorLowerRangeValue   The type is <code>String</code>
+	 */
+	public void setChartErrorLowerRangeAttribute(String chartErrorLowerRangeValue) {
+		ChartErrorLowerRangeAttribute attr = new ChartErrorLowerRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartErrorLowerRangeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorMarginAttribute</code> , See {@odf.attribute chart:error-margin}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartErrorMarginAttribute() {
+		ChartErrorMarginAttribute attr = (ChartErrorMarginAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-margin");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorMarginAttribute</code> , See {@odf.attribute chart:error-margin}
+	 *
+	 * @param chartErrorMarginValue   The type is <code>Double</code>
+	 */
+	public void setChartErrorMarginAttribute(Double chartErrorMarginValue) {
+		ChartErrorMarginAttribute attr = new ChartErrorMarginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartErrorMarginValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorPercentageAttribute</code> , See {@odf.attribute chart:error-percentage}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartErrorPercentageAttribute() {
+		ChartErrorPercentageAttribute attr = (ChartErrorPercentageAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-percentage");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorPercentageAttribute</code> , See {@odf.attribute chart:error-percentage}
+	 *
+	 * @param chartErrorPercentageValue   The type is <code>Double</code>
+	 */
+	public void setChartErrorPercentageAttribute(Double chartErrorPercentageValue) {
+		ChartErrorPercentageAttribute attr = new ChartErrorPercentageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartErrorPercentageValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorUpperIndicatorAttribute</code> , See {@odf.attribute chart:error-upper-indicator}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartErrorUpperIndicatorAttribute() {
+		ChartErrorUpperIndicatorAttribute attr = (ChartErrorUpperIndicatorAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-upper-indicator");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorUpperIndicatorAttribute</code> , See {@odf.attribute chart:error-upper-indicator}
+	 *
+	 * @param chartErrorUpperIndicatorValue   The type is <code>Boolean</code>
+	 */
+	public void setChartErrorUpperIndicatorAttribute(Boolean chartErrorUpperIndicatorValue) {
+		ChartErrorUpperIndicatorAttribute attr = new ChartErrorUpperIndicatorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartErrorUpperIndicatorValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorUpperLimitAttribute</code> , See {@odf.attribute chart:error-upper-limit}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartErrorUpperLimitAttribute() {
+		ChartErrorUpperLimitAttribute attr = (ChartErrorUpperLimitAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-upper-limit");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorUpperLimitAttribute</code> , See {@odf.attribute chart:error-upper-limit}
+	 *
+	 * @param chartErrorUpperLimitValue   The type is <code>Double</code>
+	 */
+	public void setChartErrorUpperLimitAttribute(Double chartErrorUpperLimitValue) {
+		ChartErrorUpperLimitAttribute attr = new ChartErrorUpperLimitAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartErrorUpperLimitValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartErrorUpperRangeAttribute</code> , See {@odf.attribute chart:error-upper-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartErrorUpperRangeAttribute() {
+		ChartErrorUpperRangeAttribute attr = (ChartErrorUpperRangeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "error-upper-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartErrorUpperRangeAttribute</code> , See {@odf.attribute chart:error-upper-range}
+	 *
+	 * @param chartErrorUpperRangeValue   The type is <code>String</code>
+	 */
+	public void setChartErrorUpperRangeAttribute(String chartErrorUpperRangeValue) {
+		ChartErrorUpperRangeAttribute attr = new ChartErrorUpperRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartErrorUpperRangeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartGapWidthAttribute</code> , See {@odf.attribute chart:gap-width}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartGapWidthAttribute() {
+		ChartGapWidthAttribute attr = (ChartGapWidthAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "gap-width");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartGapWidthAttribute</code> , See {@odf.attribute chart:gap-width}
+	 *
+	 * @param chartGapWidthValue   The type is <code>Integer</code>
+	 */
+	public void setChartGapWidthAttribute(Integer chartGapWidthValue) {
+		ChartGapWidthAttribute attr = new ChartGapWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartGapWidthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartGroupBarsPerAxisAttribute</code> , See {@odf.attribute chart:group-bars-per-axis}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartGroupBarsPerAxisAttribute() {
+		ChartGroupBarsPerAxisAttribute attr = (ChartGroupBarsPerAxisAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "group-bars-per-axis");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartGroupBarsPerAxisAttribute</code> , See {@odf.attribute chart:group-bars-per-axis}
+	 *
+	 * @param chartGroupBarsPerAxisValue   The type is <code>Boolean</code>
+	 */
+	public void setChartGroupBarsPerAxisAttribute(Boolean chartGroupBarsPerAxisValue) {
+		ChartGroupBarsPerAxisAttribute attr = new ChartGroupBarsPerAxisAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartGroupBarsPerAxisValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartHoleSizeAttribute</code> , See {@odf.attribute chart:hole-size}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartHoleSizeAttribute() {
+		ChartHoleSizeAttribute attr = (ChartHoleSizeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "hole-size");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartHoleSizeAttribute</code> , See {@odf.attribute chart:hole-size}
+	 *
+	 * @param chartHoleSizeValue   The type is <code>String</code>
+	 */
+	public void setChartHoleSizeAttribute(String chartHoleSizeValue) {
+		ChartHoleSizeAttribute attr = new ChartHoleSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartHoleSizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartIncludeHiddenCellsAttribute</code> , See {@odf.attribute chart:include-hidden-cells}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartIncludeHiddenCellsAttribute() {
+		ChartIncludeHiddenCellsAttribute attr = (ChartIncludeHiddenCellsAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "include-hidden-cells");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartIncludeHiddenCellsAttribute</code> , See {@odf.attribute chart:include-hidden-cells}
+	 *
+	 * @param chartIncludeHiddenCellsValue   The type is <code>Boolean</code>
+	 */
+	public void setChartIncludeHiddenCellsAttribute(Boolean chartIncludeHiddenCellsValue) {
+		ChartIncludeHiddenCellsAttribute attr = new ChartIncludeHiddenCellsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartIncludeHiddenCellsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartInterpolationAttribute</code> , See {@odf.attribute chart:interpolation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartInterpolationAttribute() {
+		ChartInterpolationAttribute attr = (ChartInterpolationAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "interpolation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartInterpolationAttribute</code> , See {@odf.attribute chart:interpolation}
+	 *
+	 * @param chartInterpolationValue   The type is <code>String</code>
+	 */
+	public void setChartInterpolationAttribute(String chartInterpolationValue) {
+		ChartInterpolationAttribute attr = new ChartInterpolationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartInterpolationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartIntervalMajorAttribute</code> , See {@odf.attribute chart:interval-major}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartIntervalMajorAttribute() {
+		ChartIntervalMajorAttribute attr = (ChartIntervalMajorAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "interval-major");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartIntervalMajorAttribute</code> , See {@odf.attribute chart:interval-major}
+	 *
+	 * @param chartIntervalMajorValue   The type is <code>Double</code>
+	 */
+	public void setChartIntervalMajorAttribute(Double chartIntervalMajorValue) {
+		ChartIntervalMajorAttribute attr = new ChartIntervalMajorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartIntervalMajorValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartIntervalMinorDivisorAttribute</code> , See {@odf.attribute chart:interval-minor-divisor}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartIntervalMinorDivisorAttribute() {
+		ChartIntervalMinorDivisorAttribute attr = (ChartIntervalMinorDivisorAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "interval-minor-divisor");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartIntervalMinorDivisorAttribute</code> , See {@odf.attribute chart:interval-minor-divisor}
+	 *
+	 * @param chartIntervalMinorDivisorValue   The type is <code>Integer</code>
+	 */
+	public void setChartIntervalMinorDivisorAttribute(Integer chartIntervalMinorDivisorValue) {
+		ChartIntervalMinorDivisorAttribute attr = new ChartIntervalMinorDivisorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartIntervalMinorDivisorValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartJapaneseCandleStickAttribute</code> , See {@odf.attribute chart:japanese-candle-stick}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartJapaneseCandleStickAttribute() {
+		ChartJapaneseCandleStickAttribute attr = (ChartJapaneseCandleStickAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "japanese-candle-stick");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartJapaneseCandleStickAttribute</code> , See {@odf.attribute chart:japanese-candle-stick}
+	 *
+	 * @param chartJapaneseCandleStickValue   The type is <code>Boolean</code>
+	 */
+	public void setChartJapaneseCandleStickAttribute(Boolean chartJapaneseCandleStickValue) {
+		ChartJapaneseCandleStickAttribute attr = new ChartJapaneseCandleStickAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartJapaneseCandleStickValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLabelArrangementAttribute</code> , See {@odf.attribute chart:label-arrangement}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartLabelArrangementAttribute() {
+		ChartLabelArrangementAttribute attr = (ChartLabelArrangementAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "label-arrangement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLabelArrangementAttribute</code> , See {@odf.attribute chart:label-arrangement}
+	 *
+	 * @param chartLabelArrangementValue   The type is <code>String</code>
+	 */
+	public void setChartLabelArrangementAttribute(String chartLabelArrangementValue) {
+		ChartLabelArrangementAttribute attr = new ChartLabelArrangementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartLabelArrangementValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLabelPositionAttribute</code> , See {@odf.attribute chart:label-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartLabelPositionAttribute() {
+		ChartLabelPositionAttribute attr = (ChartLabelPositionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "label-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLabelPositionAttribute</code> , See {@odf.attribute chart:label-position}
+	 *
+	 * @param chartLabelPositionValue   The type is <code>String</code>
+	 */
+	public void setChartLabelPositionAttribute(String chartLabelPositionValue) {
+		ChartLabelPositionAttribute attr = new ChartLabelPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartLabelPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLabelPositionNegativeAttribute</code> , See {@odf.attribute chart:label-position-negative}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartLabelPositionNegativeAttribute() {
+		ChartLabelPositionNegativeAttribute attr = (ChartLabelPositionNegativeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "label-position-negative");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLabelPositionNegativeAttribute</code> , See {@odf.attribute chart:label-position-negative}
+	 *
+	 * @param chartLabelPositionNegativeValue   The type is <code>String</code>
+	 */
+	public void setChartLabelPositionNegativeAttribute(String chartLabelPositionNegativeValue) {
+		ChartLabelPositionNegativeAttribute attr = new ChartLabelPositionNegativeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartLabelPositionNegativeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLinesAttribute</code> , See {@odf.attribute chart:lines}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartLinesAttribute() {
+		ChartLinesAttribute attr = (ChartLinesAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "lines");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLinesAttribute</code> , See {@odf.attribute chart:lines}
+	 *
+	 * @param chartLinesValue   The type is <code>Boolean</code>
+	 */
+	public void setChartLinesAttribute(Boolean chartLinesValue) {
+		ChartLinesAttribute attr = new ChartLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartLinesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLinkDataStyleToSourceAttribute</code> , See {@odf.attribute chart:link-data-style-to-source}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartLinkDataStyleToSourceAttribute() {
+		ChartLinkDataStyleToSourceAttribute attr = (ChartLinkDataStyleToSourceAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "link-data-style-to-source");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLinkDataStyleToSourceAttribute</code> , See {@odf.attribute chart:link-data-style-to-source}
+	 *
+	 * @param chartLinkDataStyleToSourceValue   The type is <code>Boolean</code>
+	 */
+	public void setChartLinkDataStyleToSourceAttribute(Boolean chartLinkDataStyleToSourceValue) {
+		ChartLinkDataStyleToSourceAttribute attr = new ChartLinkDataStyleToSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartLinkDataStyleToSourceValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartLogarithmicAttribute</code> , See {@odf.attribute chart:logarithmic}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartLogarithmicAttribute() {
+		ChartLogarithmicAttribute attr = (ChartLogarithmicAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "logarithmic");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartLogarithmicAttribute</code> , See {@odf.attribute chart:logarithmic}
+	 *
+	 * @param chartLogarithmicValue   The type is <code>Boolean</code>
+	 */
+	public void setChartLogarithmicAttribute(Boolean chartLogarithmicValue) {
+		ChartLogarithmicAttribute attr = new ChartLogarithmicAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartLogarithmicValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartMaximumAttribute</code> , See {@odf.attribute chart:maximum}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartMaximumAttribute() {
+		ChartMaximumAttribute attr = (ChartMaximumAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "maximum");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartMaximumAttribute</code> , See {@odf.attribute chart:maximum}
+	 *
+	 * @param chartMaximumValue   The type is <code>Double</code>
+	 */
+	public void setChartMaximumAttribute(Double chartMaximumValue) {
+		ChartMaximumAttribute attr = new ChartMaximumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartMaximumValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartMeanValueAttribute</code> , See {@odf.attribute chart:mean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartMeanValueAttribute() {
+		ChartMeanValueAttribute attr = (ChartMeanValueAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "mean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartMeanValueAttribute</code> , See {@odf.attribute chart:mean-value}
+	 *
+	 * @param chartMeanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setChartMeanValueAttribute(Boolean chartMeanValueValue) {
+		ChartMeanValueAttribute attr = new ChartMeanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartMeanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartMinimumAttribute</code> , See {@odf.attribute chart:minimum}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartMinimumAttribute() {
+		ChartMinimumAttribute attr = (ChartMinimumAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "minimum");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartMinimumAttribute</code> , See {@odf.attribute chart:minimum}
+	 *
+	 * @param chartMinimumValue   The type is <code>Double</code>
+	 */
+	public void setChartMinimumAttribute(Double chartMinimumValue) {
+		ChartMinimumAttribute attr = new ChartMinimumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartMinimumValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartOriginAttribute</code> , See {@odf.attribute chart:origin}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getChartOriginAttribute() {
+		ChartOriginAttribute attr = (ChartOriginAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "origin");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartOriginAttribute</code> , See {@odf.attribute chart:origin}
+	 *
+	 * @param chartOriginValue   The type is <code>Double</code>
+	 */
+	public void setChartOriginAttribute(Double chartOriginValue) {
+		ChartOriginAttribute attr = new ChartOriginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(chartOriginValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartOverlapAttribute</code> , See {@odf.attribute chart:overlap}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartOverlapAttribute() {
+		ChartOverlapAttribute attr = (ChartOverlapAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "overlap");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartOverlapAttribute</code> , See {@odf.attribute chart:overlap}
+	 *
+	 * @param chartOverlapValue   The type is <code>Integer</code>
+	 */
+	public void setChartOverlapAttribute(Integer chartOverlapValue) {
+		ChartOverlapAttribute attr = new ChartOverlapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartOverlapValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartPercentageAttribute</code> , See {@odf.attribute chart:percentage}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartPercentageAttribute() {
+		ChartPercentageAttribute attr = (ChartPercentageAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "percentage");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartPercentageAttribute</code> , See {@odf.attribute chart:percentage}
+	 *
+	 * @param chartPercentageValue   The type is <code>Boolean</code>
+	 */
+	public void setChartPercentageAttribute(Boolean chartPercentageValue) {
+		ChartPercentageAttribute attr = new ChartPercentageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartPercentageValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartPieOffsetAttribute</code> , See {@odf.attribute chart:pie-offset}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartPieOffsetAttribute() {
+		ChartPieOffsetAttribute attr = (ChartPieOffsetAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "pie-offset");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartPieOffsetAttribute</code> , See {@odf.attribute chart:pie-offset}
+	 *
+	 * @param chartPieOffsetValue   The type is <code>Integer</code>
+	 */
+	public void setChartPieOffsetAttribute(Integer chartPieOffsetValue) {
+		ChartPieOffsetAttribute attr = new ChartPieOffsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartPieOffsetValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartRegressionTypeAttribute</code> , See {@odf.attribute chart:regression-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartRegressionTypeAttribute() {
+		ChartRegressionTypeAttribute attr = (ChartRegressionTypeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "regression-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartRegressionTypeAttribute</code> , See {@odf.attribute chart:regression-type}
+	 *
+	 * @param chartRegressionTypeValue   The type is <code>String</code>
+	 */
+	public void setChartRegressionTypeAttribute(String chartRegressionTypeValue) {
+		ChartRegressionTypeAttribute attr = new ChartRegressionTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartRegressionTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartReverseDirectionAttribute</code> , See {@odf.attribute chart:reverse-direction}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartReverseDirectionAttribute() {
+		ChartReverseDirectionAttribute attr = (ChartReverseDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "reverse-direction");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartReverseDirectionAttribute</code> , See {@odf.attribute chart:reverse-direction}
+	 *
+	 * @param chartReverseDirectionValue   The type is <code>Boolean</code>
+	 */
+	public void setChartReverseDirectionAttribute(Boolean chartReverseDirectionValue) {
+		ChartReverseDirectionAttribute attr = new ChartReverseDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartReverseDirectionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartRightAngledAxesAttribute</code> , See {@odf.attribute chart:right-angled-axes}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartRightAngledAxesAttribute() {
+		ChartRightAngledAxesAttribute attr = (ChartRightAngledAxesAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "right-angled-axes");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartRightAngledAxesAttribute</code> , See {@odf.attribute chart:right-angled-axes}
+	 *
+	 * @param chartRightAngledAxesValue   The type is <code>Boolean</code>
+	 */
+	public void setChartRightAngledAxesAttribute(Boolean chartRightAngledAxesValue) {
+		ChartRightAngledAxesAttribute attr = new ChartRightAngledAxesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartRightAngledAxesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartScaleTextAttribute</code> , See {@odf.attribute chart:scale-text}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartScaleTextAttribute() {
+		ChartScaleTextAttribute attr = (ChartScaleTextAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "scale-text");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartScaleTextAttribute</code> , See {@odf.attribute chart:scale-text}
+	 *
+	 * @param chartScaleTextValue   The type is <code>Boolean</code>
+	 */
+	public void setChartScaleTextAttribute(Boolean chartScaleTextValue) {
+		ChartScaleTextAttribute attr = new ChartScaleTextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartScaleTextValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSeriesSourceAttribute</code> , See {@odf.attribute chart:series-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartSeriesSourceAttribute() {
+		ChartSeriesSourceAttribute attr = (ChartSeriesSourceAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "series-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSeriesSourceAttribute</code> , See {@odf.attribute chart:series-source}
+	 *
+	 * @param chartSeriesSourceValue   The type is <code>String</code>
+	 */
+	public void setChartSeriesSourceAttribute(String chartSeriesSourceValue) {
+		ChartSeriesSourceAttribute attr = new ChartSeriesSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartSeriesSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSolidTypeAttribute</code> , See {@odf.attribute chart:solid-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartSolidTypeAttribute() {
+		ChartSolidTypeAttribute attr = (ChartSolidTypeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "solid-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSolidTypeAttribute</code> , See {@odf.attribute chart:solid-type}
+	 *
+	 * @param chartSolidTypeValue   The type is <code>String</code>
+	 */
+	public void setChartSolidTypeAttribute(String chartSolidTypeValue) {
+		ChartSolidTypeAttribute attr = new ChartSolidTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartSolidTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSortByXValuesAttribute</code> , See {@odf.attribute chart:sort-by-x-values}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartSortByXValuesAttribute() {
+		ChartSortByXValuesAttribute attr = (ChartSortByXValuesAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "sort-by-x-values");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSortByXValuesAttribute</code> , See {@odf.attribute chart:sort-by-x-values}
+	 *
+	 * @param chartSortByXValuesValue   The type is <code>Boolean</code>
+	 */
+	public void setChartSortByXValuesAttribute(Boolean chartSortByXValuesValue) {
+		ChartSortByXValuesAttribute attr = new ChartSortByXValuesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartSortByXValuesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSplineOrderAttribute</code> , See {@odf.attribute chart:spline-order}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartSplineOrderAttribute() {
+		ChartSplineOrderAttribute attr = (ChartSplineOrderAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "spline-order");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSplineOrderAttribute</code> , See {@odf.attribute chart:spline-order}
+	 *
+	 * @param chartSplineOrderValue   The type is <code>Integer</code>
+	 */
+	public void setChartSplineOrderAttribute(Integer chartSplineOrderValue) {
+		ChartSplineOrderAttribute attr = new ChartSplineOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartSplineOrderValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSplineResolutionAttribute</code> , See {@odf.attribute chart:spline-resolution}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getChartSplineResolutionAttribute() {
+		ChartSplineResolutionAttribute attr = (ChartSplineResolutionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "spline-resolution");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSplineResolutionAttribute</code> , See {@odf.attribute chart:spline-resolution}
+	 *
+	 * @param chartSplineResolutionValue   The type is <code>Integer</code>
+	 */
+	public void setChartSplineResolutionAttribute(Integer chartSplineResolutionValue) {
+		ChartSplineResolutionAttribute attr = new ChartSplineResolutionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(chartSplineResolutionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartStackedAttribute</code> , See {@odf.attribute chart:stacked}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartStackedAttribute() {
+		ChartStackedAttribute attr = (ChartStackedAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "stacked");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartStackedAttribute</code> , See {@odf.attribute chart:stacked}
+	 *
+	 * @param chartStackedValue   The type is <code>Boolean</code>
+	 */
+	public void setChartStackedAttribute(Boolean chartStackedValue) {
+		ChartStackedAttribute attr = new ChartStackedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartStackedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSymbolHeightAttribute</code> , See {@odf.attribute chart:symbol-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartSymbolHeightAttribute() {
+		ChartSymbolHeightAttribute attr = (ChartSymbolHeightAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "symbol-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSymbolHeightAttribute</code> , See {@odf.attribute chart:symbol-height}
+	 *
+	 * @param chartSymbolHeightValue   The type is <code>String</code>
+	 */
+	public void setChartSymbolHeightAttribute(String chartSymbolHeightValue) {
+		ChartSymbolHeightAttribute attr = new ChartSymbolHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartSymbolHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSymbolNameAttribute</code> , See {@odf.attribute chart:symbol-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartSymbolNameAttribute() {
+		ChartSymbolNameAttribute attr = (ChartSymbolNameAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "symbol-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSymbolNameAttribute</code> , See {@odf.attribute chart:symbol-name}
+	 *
+	 * @param chartSymbolNameValue   The type is <code>String</code>
+	 */
+	public void setChartSymbolNameAttribute(String chartSymbolNameValue) {
+		ChartSymbolNameAttribute attr = new ChartSymbolNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartSymbolNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSymbolTypeAttribute</code> , See {@odf.attribute chart:symbol-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartSymbolTypeAttribute() {
+		ChartSymbolTypeAttribute attr = (ChartSymbolTypeAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "symbol-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSymbolTypeAttribute</code> , See {@odf.attribute chart:symbol-type}
+	 *
+	 * @param chartSymbolTypeValue   The type is <code>String</code>
+	 */
+	public void setChartSymbolTypeAttribute(String chartSymbolTypeValue) {
+		ChartSymbolTypeAttribute attr = new ChartSymbolTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartSymbolTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartSymbolWidthAttribute</code> , See {@odf.attribute chart:symbol-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartSymbolWidthAttribute() {
+		ChartSymbolWidthAttribute attr = (ChartSymbolWidthAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "symbol-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartSymbolWidthAttribute</code> , See {@odf.attribute chart:symbol-width}
+	 *
+	 * @param chartSymbolWidthValue   The type is <code>String</code>
+	 */
+	public void setChartSymbolWidthAttribute(String chartSymbolWidthValue) {
+		ChartSymbolWidthAttribute attr = new ChartSymbolWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartSymbolWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTextOverlapAttribute</code> , See {@odf.attribute chart:text-overlap}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartTextOverlapAttribute() {
+		ChartTextOverlapAttribute attr = (ChartTextOverlapAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "text-overlap");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTextOverlapAttribute</code> , See {@odf.attribute chart:text-overlap}
+	 *
+	 * @param chartTextOverlapValue   The type is <code>Boolean</code>
+	 */
+	public void setChartTextOverlapAttribute(Boolean chartTextOverlapValue) {
+		ChartTextOverlapAttribute attr = new ChartTextOverlapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartTextOverlapValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartThreeDimensionalAttribute</code> , See {@odf.attribute chart:three-dimensional}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartThreeDimensionalAttribute() {
+		ChartThreeDimensionalAttribute attr = (ChartThreeDimensionalAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "three-dimensional");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartThreeDimensionalAttribute</code> , See {@odf.attribute chart:three-dimensional}
+	 *
+	 * @param chartThreeDimensionalValue   The type is <code>Boolean</code>
+	 */
+	public void setChartThreeDimensionalAttribute(Boolean chartThreeDimensionalValue) {
+		ChartThreeDimensionalAttribute attr = new ChartThreeDimensionalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartThreeDimensionalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTickMarkPositionAttribute</code> , See {@odf.attribute chart:tick-mark-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartTickMarkPositionAttribute() {
+		ChartTickMarkPositionAttribute attr = (ChartTickMarkPositionAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "tick-mark-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTickMarkPositionAttribute</code> , See {@odf.attribute chart:tick-mark-position}
+	 *
+	 * @param chartTickMarkPositionValue   The type is <code>String</code>
+	 */
+	public void setChartTickMarkPositionAttribute(String chartTickMarkPositionValue) {
+		ChartTickMarkPositionAttribute attr = new ChartTickMarkPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartTickMarkPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTickMarksMajorInnerAttribute</code> , See {@odf.attribute chart:tick-marks-major-inner}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartTickMarksMajorInnerAttribute() {
+		ChartTickMarksMajorInnerAttribute attr = (ChartTickMarksMajorInnerAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "tick-marks-major-inner");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTickMarksMajorInnerAttribute</code> , See {@odf.attribute chart:tick-marks-major-inner}
+	 *
+	 * @param chartTickMarksMajorInnerValue   The type is <code>Boolean</code>
+	 */
+	public void setChartTickMarksMajorInnerAttribute(Boolean chartTickMarksMajorInnerValue) {
+		ChartTickMarksMajorInnerAttribute attr = new ChartTickMarksMajorInnerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartTickMarksMajorInnerValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTickMarksMajorOuterAttribute</code> , See {@odf.attribute chart:tick-marks-major-outer}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartTickMarksMajorOuterAttribute() {
+		ChartTickMarksMajorOuterAttribute attr = (ChartTickMarksMajorOuterAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "tick-marks-major-outer");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTickMarksMajorOuterAttribute</code> , See {@odf.attribute chart:tick-marks-major-outer}
+	 *
+	 * @param chartTickMarksMajorOuterValue   The type is <code>Boolean</code>
+	 */
+	public void setChartTickMarksMajorOuterAttribute(Boolean chartTickMarksMajorOuterValue) {
+		ChartTickMarksMajorOuterAttribute attr = new ChartTickMarksMajorOuterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartTickMarksMajorOuterValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTickMarksMinorInnerAttribute</code> , See {@odf.attribute chart:tick-marks-minor-inner}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartTickMarksMinorInnerAttribute() {
+		ChartTickMarksMinorInnerAttribute attr = (ChartTickMarksMinorInnerAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "tick-marks-minor-inner");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTickMarksMinorInnerAttribute</code> , See {@odf.attribute chart:tick-marks-minor-inner}
+	 *
+	 * @param chartTickMarksMinorInnerValue   The type is <code>Boolean</code>
+	 */
+	public void setChartTickMarksMinorInnerAttribute(Boolean chartTickMarksMinorInnerValue) {
+		ChartTickMarksMinorInnerAttribute attr = new ChartTickMarksMinorInnerAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartTickMarksMinorInnerValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTickMarksMinorOuterAttribute</code> , See {@odf.attribute chart:tick-marks-minor-outer}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartTickMarksMinorOuterAttribute() {
+		ChartTickMarksMinorOuterAttribute attr = (ChartTickMarksMinorOuterAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "tick-marks-minor-outer");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTickMarksMinorOuterAttribute</code> , See {@odf.attribute chart:tick-marks-minor-outer}
+	 *
+	 * @param chartTickMarksMinorOuterValue   The type is <code>Boolean</code>
+	 */
+	public void setChartTickMarksMinorOuterAttribute(Boolean chartTickMarksMinorOuterValue) {
+		ChartTickMarksMinorOuterAttribute attr = new ChartTickMarksMinorOuterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartTickMarksMinorOuterValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartTreatEmptyCellsAttribute</code> , See {@odf.attribute chart:treat-empty-cells}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getChartTreatEmptyCellsAttribute() {
+		ChartTreatEmptyCellsAttribute attr = (ChartTreatEmptyCellsAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "treat-empty-cells");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartTreatEmptyCellsAttribute</code> , See {@odf.attribute chart:treat-empty-cells}
+	 *
+	 * @param chartTreatEmptyCellsValue   The type is <code>String</code>
+	 */
+	public void setChartTreatEmptyCellsAttribute(String chartTreatEmptyCellsValue) {
+		ChartTreatEmptyCellsAttribute attr = new ChartTreatEmptyCellsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(chartTreatEmptyCellsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartVerticalAttribute</code> , See {@odf.attribute chart:vertical}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartVerticalAttribute() {
+		ChartVerticalAttribute attr = (ChartVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "vertical");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartVerticalAttribute</code> , See {@odf.attribute chart:vertical}
+	 *
+	 * @param chartVerticalValue   The type is <code>Boolean</code>
+	 */
+	public void setChartVerticalAttribute(Boolean chartVerticalValue) {
+		ChartVerticalAttribute attr = new ChartVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartVerticalValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChartVisibleAttribute</code> , See {@odf.attribute chart:visible}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getChartVisibleAttribute() {
+		ChartVisibleAttribute attr = (ChartVisibleAttribute) getOdfAttribute(OdfDocumentNamespace.CHART, "visible");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChartVisibleAttribute</code> , See {@odf.attribute chart:visible}
+	 *
+	 * @param chartVisibleValue   The type is <code>Boolean</code>
+	 */
+	public void setChartVisibleAttribute(Boolean chartVisibleValue) {
+		ChartVisibleAttribute attr = new ChartVisibleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(chartVisibleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDirectionAttribute</code> , See {@odf.attribute style:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDirectionAttribute() {
+		StyleDirectionAttribute attr = (StyleDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDirectionAttribute</code> , See {@odf.attribute style:direction}
+	 *
+	 * @param styleDirectionValue   The type is <code>String</code>
+	 */
+	public void setStyleDirectionAttribute(String styleDirectionValue) {
+		StyleDirectionAttribute attr = new StyleDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRotationAngleAttribute</code> , See {@odf.attribute style:rotation-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRotationAngleAttribute() {
+		StyleRotationAngleAttribute attr = (StyleRotationAngleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rotation-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRotationAngleAttribute</code> , See {@odf.attribute style:rotation-angle}
+	 *
+	 * @param styleRotationAngleValue   The type is <code>String</code>
+	 */
+	public void setStyleRotationAngleAttribute(String styleRotationAngleValue) {
+		StyleRotationAngleAttribute attr = new StyleRotationAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRotationAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLineBreakAttribute</code> , See {@odf.attribute text:line-break}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextLineBreakAttribute() {
+		TextLineBreakAttribute attr = (TextLineBreakAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "line-break");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLineBreakAttribute</code> , See {@odf.attribute text:line-break}
+	 *
+	 * @param textLineBreakValue   The type is <code>Boolean</code>
+	 */
+	public void setTextLineBreakAttribute(Boolean textLineBreakValue) {
+		TextLineBreakAttribute attr = new TextLineBreakAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textLineBreakValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element chart:label-separator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element chart:label-separator}
+	 */
+	public ChartLabelSeparatorElement newChartLabelSeparatorElement() {
+		ChartLabelSeparatorElement chartLabelSeparator = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartLabelSeparatorElement.class);
+		this.appendChild(chartLabelSeparator);
+		return chartLabelSeparator;
+	}
+
+	/**
+	 * Create child element {@odf.element chart:symbol-image}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element chart:symbol-image}
+	 */
+	 public ChartSymbolImageElement newChartSymbolImageElement(String xlinkHrefValue) {
+		ChartSymbolImageElement chartSymbolImage = ((OdfFileDom) this.ownerDocument).newOdfElement(ChartSymbolImageElement.class);
+		chartSymbolImage.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(chartSymbolImage);
+		return chartSymbolImage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnElement.java
new file mode 100644
index 0000000..ce80b7a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnElement.java
@@ -0,0 +1,198 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoEndIndentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoSpaceAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoSpaceBeforeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoStartIndentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:column}.
+ *
+ */
+public class StyleColumnElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "column");
+
+	/**
+	 * Create the instance of <code>StyleColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoEndIndentAttribute</code> , See {@odf.attribute fo:end-indent}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoEndIndentAttribute() {
+		FoEndIndentAttribute attr = (FoEndIndentAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "end-indent");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FoEndIndentAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoEndIndentAttribute</code> , See {@odf.attribute fo:end-indent}
+	 *
+	 * @param foEndIndentValue   The type is <code>String</code>
+	 */
+	public void setFoEndIndentAttribute(String foEndIndentValue) {
+		FoEndIndentAttribute attr = new FoEndIndentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foEndIndentValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoSpaceAfterAttribute</code> , See {@odf.attribute fo:space-after}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoSpaceAfterAttribute() {
+		FoSpaceAfterAttribute attr = (FoSpaceAfterAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "space-after");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FoSpaceAfterAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoSpaceAfterAttribute</code> , See {@odf.attribute fo:space-after}
+	 *
+	 * @param foSpaceAfterValue   The type is <code>String</code>
+	 */
+	public void setFoSpaceAfterAttribute(String foSpaceAfterValue) {
+		FoSpaceAfterAttribute attr = new FoSpaceAfterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foSpaceAfterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoSpaceBeforeAttribute</code> , See {@odf.attribute fo:space-before}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoSpaceBeforeAttribute() {
+		FoSpaceBeforeAttribute attr = (FoSpaceBeforeAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "space-before");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FoSpaceBeforeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoSpaceBeforeAttribute</code> , See {@odf.attribute fo:space-before}
+	 *
+	 * @param foSpaceBeforeValue   The type is <code>String</code>
+	 */
+	public void setFoSpaceBeforeAttribute(String foSpaceBeforeValue) {
+		FoSpaceBeforeAttribute attr = new FoSpaceBeforeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foSpaceBeforeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoStartIndentAttribute</code> , See {@odf.attribute fo:start-indent}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoStartIndentAttribute() {
+		FoStartIndentAttribute attr = (FoStartIndentAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "start-indent");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return FoStartIndentAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoStartIndentAttribute</code> , See {@odf.attribute fo:start-indent}
+	 *
+	 * @param foStartIndentValue   The type is <code>String</code>
+	 */
+	public void setFoStartIndentAttribute(String foStartIndentValue) {
+		FoStartIndentAttribute attr = new FoStartIndentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foStartIndentValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelWidthAttribute() {
+		StyleRelWidthAttribute attr = (StyleRelWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @param styleRelWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleRelWidthAttribute(String styleRelWidthValue) {
+		StyleRelWidthAttribute attr = new StyleRelWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnSepElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnSepElement.java
new file mode 100644
index 0000000..eeb1f8a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnSepElement.java
@@ -0,0 +1,198 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:column-sep}.
+ *
+ */
+public class StyleColumnSepElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "column-sep");
+
+	/**
+	 * Create the instance of <code>StyleColumnSepElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleColumnSepElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:column-sep}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleColorAttribute</code> , See {@odf.attribute style:color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleColorAttribute() {
+		StyleColorAttribute attr = (StyleColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleColorAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleColorAttribute</code> , See {@odf.attribute style:color}
+	 *
+	 * @param styleColorValue   The type is <code>String</code>
+	 */
+	public void setStyleColorAttribute(String styleColorValue) {
+		StyleColorAttribute attr = new StyleColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleHeightAttribute</code> , See {@odf.attribute style:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleHeightAttribute() {
+		StyleHeightAttribute attr = (StyleHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleHeightAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleHeightAttribute</code> , See {@odf.attribute style:height}
+	 *
+	 * @param styleHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleHeightAttribute(String styleHeightValue) {
+		StyleHeightAttribute attr = new StyleHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleStyleAttribute</code> , See {@odf.attribute style:style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleStyleAttribute() {
+		StyleStyleAttribute attr = (StyleStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleStyleAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleStyleAttribute</code> , See {@odf.attribute style:style}
+	 *
+	 * @param styleStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleStyleAttribute(String styleStyleValue) {
+		StyleStyleAttribute attr = new StyleStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalAlignAttribute</code> , See {@odf.attribute style:vertical-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalAlignAttribute() {
+		StyleVerticalAlignAttribute attr = (StyleVerticalAlignAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleVerticalAlignAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalAlignAttribute</code> , See {@odf.attribute style:vertical-align}
+	 *
+	 * @param styleVerticalAlignValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalAlignAttribute(String styleVerticalAlignValue) {
+		StyleVerticalAlignAttribute attr = new StyleVerticalAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWidthAttribute</code> , See {@odf.attribute style:width}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWidthAttribute() {
+		StyleWidthAttribute attr = (StyleWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWidthAttribute</code> , See {@odf.attribute style:width}
+	 *
+	 * @param styleWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleWidthAttribute(String styleWidthValue) {
+		StyleWidthAttribute attr = new StyleWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnsElement.java
new file mode 100644
index 0000000..50f882e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleColumnsElement.java
@@ -0,0 +1,153 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoColumnCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoColumnGapAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:columns}.
+ *
+ */
+public class StyleColumnsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "columns");
+
+	/**
+	 * Create the instance of <code>StyleColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoColumnCountAttribute</code> , See {@odf.attribute fo:column-count}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFoColumnCountAttribute() {
+		FoColumnCountAttribute attr = (FoColumnCountAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "column-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoColumnCountAttribute</code> , See {@odf.attribute fo:column-count}
+	 *
+	 * @param foColumnCountValue   The type is <code>Integer</code>
+	 */
+	public void setFoColumnCountAttribute(Integer foColumnCountValue) {
+		FoColumnCountAttribute attr = new FoColumnCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(foColumnCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoColumnGapAttribute</code> , See {@odf.attribute fo:column-gap}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoColumnGapAttribute() {
+		FoColumnGapAttribute attr = (FoColumnGapAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "column-gap");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoColumnGapAttribute</code> , See {@odf.attribute fo:column-gap}
+	 *
+	 * @param foColumnGapValue   The type is <code>String</code>
+	 */
+	public void setFoColumnGapAttribute(String foColumnGapValue) {
+		FoColumnGapAttribute attr = new FoColumnGapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foColumnGapValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:column}.
+	 *
+	 * @param styleRelWidthValue  the <code>String</code> value of <code>StyleRelWidthAttribute</code>, see {@odf.attribute  style:rel-width} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:column}
+	 */
+	 public StyleColumnElement newStyleColumnElement(String styleRelWidthValue) {
+		StyleColumnElement styleColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleColumnElement.class);
+		styleColumn.setStyleRelWidthAttribute(styleRelWidthValue);
+		this.appendChild(styleColumn);
+		return styleColumn;
+	}
+
+	/**
+	 * Create child element {@odf.element style:column-sep}.
+	 *
+	 * @param styleWidthValue  the <code>String</code> value of <code>StyleWidthAttribute</code>, see {@odf.attribute  style:width} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:column-sep}
+	 */
+	 public StyleColumnSepElement newStyleColumnSepElement(String styleWidthValue) {
+		StyleColumnSepElement styleColumnSep = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleColumnSepElement.class);
+		styleColumnSep.setStyleWidthAttribute(styleWidthValue);
+		this.appendChild(styleColumnSep);
+		return styleColumnSep;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDefaultPageLayoutElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDefaultPageLayoutElement.java
new file mode 100644
index 0000000..29436d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDefaultPageLayoutElement.java
@@ -0,0 +1,112 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:default-page-layout}.
+ *
+ */
+public class StyleDefaultPageLayoutElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "default-page-layout");
+
+	/**
+	 * Create the instance of <code>StyleDefaultPageLayoutElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleDefaultPageLayoutElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:default-page-layout}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element style:footer-style}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:footer-style}
+	 */
+	public StyleFooterStyleElement newStyleFooterStyleElement() {
+		StyleFooterStyleElement styleFooterStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleFooterStyleElement.class);
+		this.appendChild(styleFooterStyle);
+		return styleFooterStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:header-style}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:header-style}
+	 */
+	public StyleHeaderStyleElement newStyleHeaderStyleElement() {
+		StyleHeaderStyleElement styleHeaderStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHeaderStyleElement.class);
+		this.appendChild(styleHeaderStyle);
+		return styleHeaderStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:page-layout-properties}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:page-layout-properties}
+	 */
+	 public StylePageLayoutPropertiesElement newStylePageLayoutPropertiesElement(String styleNumFormatValue) {
+		StylePageLayoutPropertiesElement stylePageLayoutProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StylePageLayoutPropertiesElement.class);
+		stylePageLayoutProperties.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(stylePageLayoutProperties);
+		return stylePageLayoutProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDefaultStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDefaultStyleElement.java
new file mode 100644
index 0000000..75a26b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDefaultStyleElement.java
@@ -0,0 +1,224 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFamilyAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:default-style}.
+ *
+ */
+public class StyleDefaultStyleElement extends OdfStyleBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "default-style");
+
+	/**
+	 * Create the instance of <code>StyleDefaultStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleDefaultStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:default-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFamilyAttribute</code> , See {@odf.attribute style:family}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFamilyAttribute() {
+		StyleFamilyAttribute attr = (StyleFamilyAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "family");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFamilyAttribute</code> , See {@odf.attribute style:family}
+	 *
+	 * @param styleFamilyValue   The type is <code>String</code>
+	 */
+	public void setStyleFamilyAttribute(String styleFamilyValue) {
+		StyleFamilyAttribute attr = new StyleFamilyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFamilyValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:chart-properties}.
+	 *
+	 * @param chartSymbolTypeValue  the <code>String</code> value of <code>ChartSymbolTypeAttribute</code>, see {@odf.attribute  chart:symbol-type} at specification
+	 * @return the element {@odf.element style:chart-properties}
+	 */
+	 public StyleChartPropertiesElement newStyleChartPropertiesElement(String chartSymbolTypeValue) {
+		StyleChartPropertiesElement styleChartProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleChartPropertiesElement.class);
+		styleChartProperties.setChartSymbolTypeAttribute(chartSymbolTypeValue);
+		this.appendChild(styleChartProperties);
+		return styleChartProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:drawing-page-properties}.
+	 *
+	 * @return the element {@odf.element style:drawing-page-properties}
+	 */
+	public StyleDrawingPagePropertiesElement newStyleDrawingPagePropertiesElement() {
+		StyleDrawingPagePropertiesElement styleDrawingPageProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleDrawingPagePropertiesElement.class);
+		this.appendChild(styleDrawingPageProperties);
+		return styleDrawingPageProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:graphic-properties}.
+	 *
+	 * @return the element {@odf.element style:graphic-properties}
+	 */
+	public StyleGraphicPropertiesElement newStyleGraphicPropertiesElement() {
+		StyleGraphicPropertiesElement styleGraphicProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleGraphicPropertiesElement.class);
+		this.appendChild(styleGraphicProperties);
+		return styleGraphicProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:paragraph-properties}.
+	 *
+	 * @return the element {@odf.element style:paragraph-properties}
+	 */
+	public StyleParagraphPropertiesElement newStyleParagraphPropertiesElement() {
+		StyleParagraphPropertiesElement styleParagraphProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleParagraphPropertiesElement.class);
+		this.appendChild(styleParagraphProperties);
+		return styleParagraphProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:ruby-properties}.
+	 *
+	 * @return the element {@odf.element style:ruby-properties}
+	 */
+	public StyleRubyPropertiesElement newStyleRubyPropertiesElement() {
+		StyleRubyPropertiesElement styleRubyProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRubyPropertiesElement.class);
+		this.appendChild(styleRubyProperties);
+		return styleRubyProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:section-properties}.
+	 *
+	 * @return the element {@odf.element style:section-properties}
+	 */
+	public StyleSectionPropertiesElement newStyleSectionPropertiesElement() {
+		StyleSectionPropertiesElement styleSectionProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleSectionPropertiesElement.class);
+		this.appendChild(styleSectionProperties);
+		return styleSectionProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-cell-properties}.
+	 *
+	 * @return the element {@odf.element style:table-cell-properties}
+	 */
+	public StyleTableCellPropertiesElement newStyleTableCellPropertiesElement() {
+		StyleTableCellPropertiesElement styleTableCellProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTableCellPropertiesElement.class);
+		this.appendChild(styleTableCellProperties);
+		return styleTableCellProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-column-properties}.
+	 *
+	 * @return the element {@odf.element style:table-column-properties}
+	 */
+	public StyleTableColumnPropertiesElement newStyleTableColumnPropertiesElement() {
+		StyleTableColumnPropertiesElement styleTableColumnProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTableColumnPropertiesElement.class);
+		this.appendChild(styleTableColumnProperties);
+		return styleTableColumnProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-properties}.
+	 *
+	 * @return the element {@odf.element style:table-properties}
+	 */
+	public StyleTablePropertiesElement newStyleTablePropertiesElement() {
+		StyleTablePropertiesElement styleTableProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTablePropertiesElement.class);
+		this.appendChild(styleTableProperties);
+		return styleTableProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-row-properties}.
+	 *
+	 * @return the element {@odf.element style:table-row-properties}
+	 */
+	public StyleTableRowPropertiesElement newStyleTableRowPropertiesElement() {
+		StyleTableRowPropertiesElement styleTableRowProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTableRowPropertiesElement.class);
+		this.appendChild(styleTableRowProperties);
+		return styleTableRowProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDrawingPagePropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDrawingPagePropertiesElement.java
new file mode 100644
index 0000000..99e39cf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDrawingPagePropertiesElement.java
@@ -0,0 +1,1044 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationSoundElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawBackgroundSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillGradientNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillHatchNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillHatchSolidAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageRefPointAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageRefPointXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageRefPointYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGradientStepCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawOpacityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawOpacityNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawSecondaryFillColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTileRepeatOffsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationBackgroundObjectsVisibleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationBackgroundVisibleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDisplayDateTimeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDisplayFooterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDisplayHeaderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDisplayPageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationDurationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationTransitionSpeedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationTransitionStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationTransitionTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationVisibilityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilFadeColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilSubtypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.smil.SmilTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFillRuleAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:drawing-page-properties}.
+ *
+ */
+public class StyleDrawingPagePropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "drawing-page-properties");
+
+	/**
+	 * Create the instance of <code>StyleDrawingPagePropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleDrawingPagePropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:drawing-page-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "background-size"));
+
+	public final static OdfStyleProperty Fill =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill"));
+
+	public final static OdfStyleProperty FillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-color"));
+
+	public final static OdfStyleProperty FillGradientName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-gradient-name"));
+
+	public final static OdfStyleProperty FillHatchName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-name"));
+
+	public final static OdfStyleProperty FillHatchSolid =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-solid"));
+
+	public final static OdfStyleProperty FillImageHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-height"));
+
+	public final static OdfStyleProperty FillImageName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-name"));
+
+	public final static OdfStyleProperty FillImageRefPoint =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point"));
+
+	public final static OdfStyleProperty FillImageRefPointX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x"));
+
+	public final static OdfStyleProperty FillImageRefPointY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y"));
+
+	public final static OdfStyleProperty FillImageWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-width"));
+
+	public final static OdfStyleProperty GradientStepCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "gradient-step-count"));
+
+	public final static OdfStyleProperty Opacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity"));
+
+	public final static OdfStyleProperty OpacityName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity-name"));
+
+	public final static OdfStyleProperty SecondaryFillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "secondary-fill-color"));
+
+	public final static OdfStyleProperty TileRepeatOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "tile-repeat-offset"));
+
+	public final static OdfStyleProperty BackgroundObjectsVisible =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "background-objects-visible"));
+
+	public final static OdfStyleProperty BackgroundVisible =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "background-visible"));
+
+	public final static OdfStyleProperty DisplayDateTime =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-date-time"));
+
+	public final static OdfStyleProperty DisplayFooter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-footer"));
+
+	public final static OdfStyleProperty DisplayHeader =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-header"));
+
+	public final static OdfStyleProperty DisplayPageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-page-number"));
+
+	public final static OdfStyleProperty Duration =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "duration"));
+
+	public final static OdfStyleProperty TransitionSpeed =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-speed"));
+
+	public final static OdfStyleProperty TransitionStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-style"));
+
+	public final static OdfStyleProperty TransitionType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-type"));
+
+	public final static OdfStyleProperty Visibility =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "visibility"));
+
+	public final static OdfStyleProperty Direction =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "direction"));
+
+	public final static OdfStyleProperty FadeColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "fadeColor"));
+
+	public final static OdfStyleProperty Subtype =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "subtype"));
+
+	public final static OdfStyleProperty Type =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "type"));
+
+	public final static OdfStyleProperty Repeat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "repeat"));
+
+	public final static OdfStyleProperty FillRule =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SVG, "fill-rule"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawBackgroundSizeAttribute</code> , See {@odf.attribute draw:background-size}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawBackgroundSizeAttribute() {
+		DrawBackgroundSizeAttribute attr = (DrawBackgroundSizeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "background-size");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawBackgroundSizeAttribute</code> , See {@odf.attribute draw:background-size}
+	 *
+	 * @param drawBackgroundSizeValue   The type is <code>String</code>
+	 */
+	public void setDrawBackgroundSizeAttribute(String drawBackgroundSizeValue) {
+		DrawBackgroundSizeAttribute attr = new DrawBackgroundSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawBackgroundSizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillAttribute</code> , See {@odf.attribute draw:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillAttribute() {
+		DrawFillAttribute attr = (DrawFillAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillAttribute</code> , See {@odf.attribute draw:fill}
+	 *
+	 * @param drawFillValue   The type is <code>String</code>
+	 */
+	public void setDrawFillAttribute(String drawFillValue) {
+		DrawFillAttribute attr = new DrawFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillColorAttribute</code> , See {@odf.attribute draw:fill-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillColorAttribute() {
+		DrawFillColorAttribute attr = (DrawFillColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillColorAttribute</code> , See {@odf.attribute draw:fill-color}
+	 *
+	 * @param drawFillColorValue   The type is <code>String</code>
+	 */
+	public void setDrawFillColorAttribute(String drawFillColorValue) {
+		DrawFillColorAttribute attr = new DrawFillColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillGradientNameAttribute</code> , See {@odf.attribute draw:fill-gradient-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillGradientNameAttribute() {
+		DrawFillGradientNameAttribute attr = (DrawFillGradientNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-gradient-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillGradientNameAttribute</code> , See {@odf.attribute draw:fill-gradient-name}
+	 *
+	 * @param drawFillGradientNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFillGradientNameAttribute(String drawFillGradientNameValue) {
+		DrawFillGradientNameAttribute attr = new DrawFillGradientNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillGradientNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillHatchNameAttribute</code> , See {@odf.attribute draw:fill-hatch-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillHatchNameAttribute() {
+		DrawFillHatchNameAttribute attr = (DrawFillHatchNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-hatch-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillHatchNameAttribute</code> , See {@odf.attribute draw:fill-hatch-name}
+	 *
+	 * @param drawFillHatchNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFillHatchNameAttribute(String drawFillHatchNameValue) {
+		DrawFillHatchNameAttribute attr = new DrawFillHatchNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillHatchNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillHatchSolidAttribute</code> , See {@odf.attribute draw:fill-hatch-solid}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawFillHatchSolidAttribute() {
+		DrawFillHatchSolidAttribute attr = (DrawFillHatchSolidAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-hatch-solid");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillHatchSolidAttribute</code> , See {@odf.attribute draw:fill-hatch-solid}
+	 *
+	 * @param drawFillHatchSolidValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawFillHatchSolidAttribute(Boolean drawFillHatchSolidValue) {
+		DrawFillHatchSolidAttribute attr = new DrawFillHatchSolidAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawFillHatchSolidValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageHeightAttribute</code> , See {@odf.attribute draw:fill-image-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageHeightAttribute() {
+		DrawFillImageHeightAttribute attr = (DrawFillImageHeightAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageHeightAttribute</code> , See {@odf.attribute draw:fill-image-height}
+	 *
+	 * @param drawFillImageHeightValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageHeightAttribute(String drawFillImageHeightValue) {
+		DrawFillImageHeightAttribute attr = new DrawFillImageHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageNameAttribute</code> , See {@odf.attribute draw:fill-image-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageNameAttribute() {
+		DrawFillImageNameAttribute attr = (DrawFillImageNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageNameAttribute</code> , See {@odf.attribute draw:fill-image-name}
+	 *
+	 * @param drawFillImageNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageNameAttribute(String drawFillImageNameValue) {
+		DrawFillImageNameAttribute attr = new DrawFillImageNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageRefPointAttribute</code> , See {@odf.attribute draw:fill-image-ref-point}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageRefPointAttribute() {
+		DrawFillImageRefPointAttribute attr = (DrawFillImageRefPointAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-ref-point");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageRefPointAttribute</code> , See {@odf.attribute draw:fill-image-ref-point}
+	 *
+	 * @param drawFillImageRefPointValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageRefPointAttribute(String drawFillImageRefPointValue) {
+		DrawFillImageRefPointAttribute attr = new DrawFillImageRefPointAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageRefPointValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageRefPointXAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageRefPointXAttribute() {
+		DrawFillImageRefPointXAttribute attr = (DrawFillImageRefPointXAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageRefPointXAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-x}
+	 *
+	 * @param drawFillImageRefPointXValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageRefPointXAttribute(String drawFillImageRefPointXValue) {
+		DrawFillImageRefPointXAttribute attr = new DrawFillImageRefPointXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageRefPointXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageRefPointYAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageRefPointYAttribute() {
+		DrawFillImageRefPointYAttribute attr = (DrawFillImageRefPointYAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageRefPointYAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-y}
+	 *
+	 * @param drawFillImageRefPointYValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageRefPointYAttribute(String drawFillImageRefPointYValue) {
+		DrawFillImageRefPointYAttribute attr = new DrawFillImageRefPointYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageRefPointYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageWidthAttribute</code> , See {@odf.attribute draw:fill-image-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageWidthAttribute() {
+		DrawFillImageWidthAttribute attr = (DrawFillImageWidthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageWidthAttribute</code> , See {@odf.attribute draw:fill-image-width}
+	 *
+	 * @param drawFillImageWidthValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageWidthAttribute(String drawFillImageWidthValue) {
+		DrawFillImageWidthAttribute attr = new DrawFillImageWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGradientStepCountAttribute</code> , See {@odf.attribute draw:gradient-step-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawGradientStepCountAttribute() {
+		DrawGradientStepCountAttribute attr = (DrawGradientStepCountAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "gradient-step-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGradientStepCountAttribute</code> , See {@odf.attribute draw:gradient-step-count}
+	 *
+	 * @param drawGradientStepCountValue   The type is <code>Integer</code>
+	 */
+	public void setDrawGradientStepCountAttribute(Integer drawGradientStepCountValue) {
+		DrawGradientStepCountAttribute attr = new DrawGradientStepCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawGradientStepCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawOpacityAttribute</code> , See {@odf.attribute draw:opacity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawOpacityAttribute() {
+		DrawOpacityAttribute attr = (DrawOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "opacity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawOpacityAttribute</code> , See {@odf.attribute draw:opacity}
+	 *
+	 * @param drawOpacityValue   The type is <code>String</code>
+	 */
+	public void setDrawOpacityAttribute(String drawOpacityValue) {
+		DrawOpacityAttribute attr = new DrawOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawOpacityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawOpacityNameAttribute</code> , See {@odf.attribute draw:opacity-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawOpacityNameAttribute() {
+		DrawOpacityNameAttribute attr = (DrawOpacityNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "opacity-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawOpacityNameAttribute</code> , See {@odf.attribute draw:opacity-name}
+	 *
+	 * @param drawOpacityNameValue   The type is <code>String</code>
+	 */
+	public void setDrawOpacityNameAttribute(String drawOpacityNameValue) {
+		DrawOpacityNameAttribute attr = new DrawOpacityNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawOpacityNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawSecondaryFillColorAttribute</code> , See {@odf.attribute draw:secondary-fill-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawSecondaryFillColorAttribute() {
+		DrawSecondaryFillColorAttribute attr = (DrawSecondaryFillColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "secondary-fill-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawSecondaryFillColorAttribute</code> , See {@odf.attribute draw:secondary-fill-color}
+	 *
+	 * @param drawSecondaryFillColorValue   The type is <code>String</code>
+	 */
+	public void setDrawSecondaryFillColorAttribute(String drawSecondaryFillColorValue) {
+		DrawSecondaryFillColorAttribute attr = new DrawSecondaryFillColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawSecondaryFillColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTileRepeatOffsetAttribute</code> , See {@odf.attribute draw:tile-repeat-offset}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTileRepeatOffsetAttribute() {
+		DrawTileRepeatOffsetAttribute attr = (DrawTileRepeatOffsetAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "tile-repeat-offset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTileRepeatOffsetAttribute</code> , See {@odf.attribute draw:tile-repeat-offset}
+	 *
+	 * @param drawTileRepeatOffsetValue   The type is <code>String</code>
+	 */
+	public void setDrawTileRepeatOffsetAttribute(String drawTileRepeatOffsetValue) {
+		DrawTileRepeatOffsetAttribute attr = new DrawTileRepeatOffsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTileRepeatOffsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationBackgroundObjectsVisibleAttribute</code> , See {@odf.attribute presentation:background-objects-visible}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationBackgroundObjectsVisibleAttribute() {
+		PresentationBackgroundObjectsVisibleAttribute attr = (PresentationBackgroundObjectsVisibleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "background-objects-visible");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationBackgroundObjectsVisibleAttribute</code> , See {@odf.attribute presentation:background-objects-visible}
+	 *
+	 * @param presentationBackgroundObjectsVisibleValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationBackgroundObjectsVisibleAttribute(Boolean presentationBackgroundObjectsVisibleValue) {
+		PresentationBackgroundObjectsVisibleAttribute attr = new PresentationBackgroundObjectsVisibleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationBackgroundObjectsVisibleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationBackgroundVisibleAttribute</code> , See {@odf.attribute presentation:background-visible}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationBackgroundVisibleAttribute() {
+		PresentationBackgroundVisibleAttribute attr = (PresentationBackgroundVisibleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "background-visible");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationBackgroundVisibleAttribute</code> , See {@odf.attribute presentation:background-visible}
+	 *
+	 * @param presentationBackgroundVisibleValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationBackgroundVisibleAttribute(Boolean presentationBackgroundVisibleValue) {
+		PresentationBackgroundVisibleAttribute attr = new PresentationBackgroundVisibleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationBackgroundVisibleValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDisplayDateTimeAttribute</code> , See {@odf.attribute presentation:display-date-time}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationDisplayDateTimeAttribute() {
+		PresentationDisplayDateTimeAttribute attr = (PresentationDisplayDateTimeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "display-date-time");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDisplayDateTimeAttribute</code> , See {@odf.attribute presentation:display-date-time}
+	 *
+	 * @param presentationDisplayDateTimeValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationDisplayDateTimeAttribute(Boolean presentationDisplayDateTimeValue) {
+		PresentationDisplayDateTimeAttribute attr = new PresentationDisplayDateTimeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationDisplayDateTimeValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDisplayFooterAttribute</code> , See {@odf.attribute presentation:display-footer}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationDisplayFooterAttribute() {
+		PresentationDisplayFooterAttribute attr = (PresentationDisplayFooterAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "display-footer");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDisplayFooterAttribute</code> , See {@odf.attribute presentation:display-footer}
+	 *
+	 * @param presentationDisplayFooterValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationDisplayFooterAttribute(Boolean presentationDisplayFooterValue) {
+		PresentationDisplayFooterAttribute attr = new PresentationDisplayFooterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationDisplayFooterValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDisplayHeaderAttribute</code> , See {@odf.attribute presentation:display-header}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationDisplayHeaderAttribute() {
+		PresentationDisplayHeaderAttribute attr = (PresentationDisplayHeaderAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "display-header");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDisplayHeaderAttribute</code> , See {@odf.attribute presentation:display-header}
+	 *
+	 * @param presentationDisplayHeaderValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationDisplayHeaderAttribute(Boolean presentationDisplayHeaderValue) {
+		PresentationDisplayHeaderAttribute attr = new PresentationDisplayHeaderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationDisplayHeaderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDisplayPageNumberAttribute</code> , See {@odf.attribute presentation:display-page-number}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getPresentationDisplayPageNumberAttribute() {
+		PresentationDisplayPageNumberAttribute attr = (PresentationDisplayPageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "display-page-number");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDisplayPageNumberAttribute</code> , See {@odf.attribute presentation:display-page-number}
+	 *
+	 * @param presentationDisplayPageNumberValue   The type is <code>Boolean</code>
+	 */
+	public void setPresentationDisplayPageNumberAttribute(Boolean presentationDisplayPageNumberValue) {
+		PresentationDisplayPageNumberAttribute attr = new PresentationDisplayPageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(presentationDisplayPageNumberValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationDurationAttribute</code> , See {@odf.attribute presentation:duration}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationDurationAttribute() {
+		PresentationDurationAttribute attr = (PresentationDurationAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "duration");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationDurationAttribute</code> , See {@odf.attribute presentation:duration}
+	 *
+	 * @param presentationDurationValue   The type is <code>String</code>
+	 */
+	public void setPresentationDurationAttribute(String presentationDurationValue) {
+		PresentationDurationAttribute attr = new PresentationDurationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationDurationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationTransitionSpeedAttribute</code> , See {@odf.attribute presentation:transition-speed}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationTransitionSpeedAttribute() {
+		PresentationTransitionSpeedAttribute attr = (PresentationTransitionSpeedAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "transition-speed");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationTransitionSpeedAttribute</code> , See {@odf.attribute presentation:transition-speed}
+	 *
+	 * @param presentationTransitionSpeedValue   The type is <code>String</code>
+	 */
+	public void setPresentationTransitionSpeedAttribute(String presentationTransitionSpeedValue) {
+		PresentationTransitionSpeedAttribute attr = new PresentationTransitionSpeedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationTransitionSpeedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationTransitionStyleAttribute</code> , See {@odf.attribute presentation:transition-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationTransitionStyleAttribute() {
+		PresentationTransitionStyleAttribute attr = (PresentationTransitionStyleAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "transition-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationTransitionStyleAttribute</code> , See {@odf.attribute presentation:transition-style}
+	 *
+	 * @param presentationTransitionStyleValue   The type is <code>String</code>
+	 */
+	public void setPresentationTransitionStyleAttribute(String presentationTransitionStyleValue) {
+		PresentationTransitionStyleAttribute attr = new PresentationTransitionStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationTransitionStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationTransitionTypeAttribute</code> , See {@odf.attribute presentation:transition-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationTransitionTypeAttribute() {
+		PresentationTransitionTypeAttribute attr = (PresentationTransitionTypeAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "transition-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationTransitionTypeAttribute</code> , See {@odf.attribute presentation:transition-type}
+	 *
+	 * @param presentationTransitionTypeValue   The type is <code>String</code>
+	 */
+	public void setPresentationTransitionTypeAttribute(String presentationTransitionTypeValue) {
+		PresentationTransitionTypeAttribute attr = new PresentationTransitionTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationTransitionTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationVisibilityAttribute</code> , See {@odf.attribute presentation:visibility}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationVisibilityAttribute() {
+		PresentationVisibilityAttribute attr = (PresentationVisibilityAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "visibility");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationVisibilityAttribute</code> , See {@odf.attribute presentation:visibility}
+	 *
+	 * @param presentationVisibilityValue   The type is <code>String</code>
+	 */
+	public void setPresentationVisibilityAttribute(String presentationVisibilityValue) {
+		PresentationVisibilityAttribute attr = new PresentationVisibilityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationVisibilityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilDirectionAttribute</code> , See {@odf.attribute smil:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilDirectionAttribute() {
+		SmilDirectionAttribute attr = (SmilDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilDirectionAttribute</code> , See {@odf.attribute smil:direction}
+	 *
+	 * @param smilDirectionValue   The type is <code>String</code>
+	 */
+	public void setSmilDirectionAttribute(String smilDirectionValue) {
+		SmilDirectionAttribute attr = new SmilDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilFadeColorAttribute</code> , See {@odf.attribute smil:fadeColor}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilFadeColorAttribute() {
+		SmilFadeColorAttribute attr = (SmilFadeColorAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "fadeColor");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SmilFadeColorAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilFadeColorAttribute</code> , See {@odf.attribute smil:fadeColor}
+	 *
+	 * @param smilFadeColorValue   The type is <code>String</code>
+	 */
+	public void setSmilFadeColorAttribute(String smilFadeColorValue) {
+		SmilFadeColorAttribute attr = new SmilFadeColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilFadeColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilSubtypeAttribute</code> , See {@odf.attribute smil:subtype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilSubtypeAttribute() {
+		SmilSubtypeAttribute attr = (SmilSubtypeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "subtype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilSubtypeAttribute</code> , See {@odf.attribute smil:subtype}
+	 *
+	 * @param smilSubtypeValue   The type is <code>String</code>
+	 */
+	public void setSmilSubtypeAttribute(String smilSubtypeValue) {
+		SmilSubtypeAttribute attr = new SmilSubtypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilSubtypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SmilTypeAttribute</code> , See {@odf.attribute smil:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSmilTypeAttribute() {
+		SmilTypeAttribute attr = (SmilTypeAttribute) getOdfAttribute(OdfDocumentNamespace.SMIL, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SmilTypeAttribute</code> , See {@odf.attribute smil:type}
+	 *
+	 * @param smilTypeValue   The type is <code>String</code>
+	 */
+	public void setSmilTypeAttribute(String smilTypeValue) {
+		SmilTypeAttribute attr = new SmilTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(smilTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRepeatAttribute</code> , See {@odf.attribute style:repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRepeatAttribute() {
+		StyleRepeatAttribute attr = (StyleRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRepeatAttribute</code> , See {@odf.attribute style:repeat}
+	 *
+	 * @param styleRepeatValue   The type is <code>String</code>
+	 */
+	public void setStyleRepeatAttribute(String styleRepeatValue) {
+		StyleRepeatAttribute attr = new StyleRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFillRuleAttribute</code> , See {@odf.attribute svg:fill-rule}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFillRuleAttribute() {
+		SvgFillRuleAttribute attr = (SvgFillRuleAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "fill-rule");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFillRuleAttribute</code> , See {@odf.attribute svg:fill-rule}
+	 *
+	 * @param svgFillRuleValue   The type is <code>String</code>
+	 */
+	public void setSvgFillRuleAttribute(String svgFillRuleValue) {
+		SvgFillRuleAttribute attr = new SvgFillRuleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFillRuleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:sound}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:sound}
+	 */
+	 public PresentationSoundElement newPresentationSoundElement(String xlinkHrefValue, String xlinkTypeValue) {
+		PresentationSoundElement presentationSound = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationSoundElement.class);
+		presentationSound.setXlinkHrefAttribute(xlinkHrefValue);
+		presentationSound.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(presentationSound);
+		return presentationSound;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDropCapElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDropCapElement.java
new file mode 100644
index 0000000..ee074d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleDropCapElement.java
@@ -0,0 +1,173 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:drop-cap}.
+ *
+ */
+public class StyleDropCapElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "drop-cap");
+
+	/**
+	 * Create the instance of <code>StyleDropCapElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleDropCapElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.STYLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:drop-cap}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDistanceAttribute</code> , See {@odf.attribute style:distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDistanceAttribute() {
+		StyleDistanceAttribute attr = (StyleDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleDistanceAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDistanceAttribute</code> , See {@odf.attribute style:distance}
+	 *
+	 * @param styleDistanceValue   The type is <code>String</code>
+	 */
+	public void setStyleDistanceAttribute(String styleDistanceValue) {
+		StyleDistanceAttribute attr = new StyleDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLengthAttribute</code> , See {@odf.attribute style:length}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleLengthAttribute() {
+		StyleLengthAttribute attr = (StyleLengthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "length");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(StyleLengthAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLengthAttribute</code> , See {@odf.attribute style:length}
+	 *
+	 * @param styleLengthValue   The type is <code>Integer</code>
+	 */
+	public void setStyleLengthAttribute(Integer styleLengthValue) {
+		StyleLengthAttribute attr = new StyleLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleLengthValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLinesAttribute</code> , See {@odf.attribute style:lines}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleLinesAttribute() {
+		StyleLinesAttribute attr = (StyleLinesAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "lines");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(StyleLinesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLinesAttribute</code> , See {@odf.attribute style:lines}
+	 *
+	 * @param styleLinesValue   The type is <code>Integer</code>
+	 */
+	public void setStyleLinesAttribute(Integer styleLinesValue) {
+		StyleLinesAttribute attr = new StyleLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleLinesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleStyleNameAttribute</code> , See {@odf.attribute style:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleStyleNameAttribute() {
+		StyleStyleNameAttribute attr = (StyleStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleStyleNameAttribute</code> , See {@odf.attribute style:style-name}
+	 *
+	 * @param styleStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleStyleNameAttribute(String styleStyleNameValue) {
+		StyleStyleNameAttribute attr = new StyleStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFontFaceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFontFaceElement.java
new file mode 100644
index 0000000..cd8fe9d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFontFaceElement.java
@@ -0,0 +1,1051 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDefinitionSrcElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgFontFaceSrcElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontAdornmentsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontCharsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontFamilyGenericAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontPitchAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgAccentHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgAlphabeticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgAscentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgBboxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCapHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgDescentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFontFamilyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFontSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFontStretchAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFontStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFontVariantAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFontWeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHangingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgIdeographicAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgMathematicalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgOverlinePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgOverlineThicknessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgPanose1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgSlopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStemhAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStemvAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStrikethroughPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStrikethroughThicknessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgUnderlinePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgUnderlineThicknessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgUnicodeRangeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgUnitsPerEmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgVAlphabeticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgVHangingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgVIdeographicAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgVMathematicalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXHeightAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:font-face}.
+ *
+ */
+public class StyleFontFaceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "font-face");
+
+	/**
+	 * Create the instance of <code>StyleFontFaceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleFontFaceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:font-face}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontAdornmentsAttribute</code> , See {@odf.attribute style:font-adornments}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontAdornmentsAttribute() {
+		StyleFontAdornmentsAttribute attr = (StyleFontAdornmentsAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-adornments");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontAdornmentsAttribute</code> , See {@odf.attribute style:font-adornments}
+	 *
+	 * @param styleFontAdornmentsValue   The type is <code>String</code>
+	 */
+	public void setStyleFontAdornmentsAttribute(String styleFontAdornmentsValue) {
+		StyleFontAdornmentsAttribute attr = new StyleFontAdornmentsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontAdornmentsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontCharsetAttribute</code> , See {@odf.attribute style:font-charset}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontCharsetAttribute() {
+		StyleFontCharsetAttribute attr = (StyleFontCharsetAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-charset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontCharsetAttribute</code> , See {@odf.attribute style:font-charset}
+	 *
+	 * @param styleFontCharsetValue   The type is <code>String</code>
+	 */
+	public void setStyleFontCharsetAttribute(String styleFontCharsetValue) {
+		StyleFontCharsetAttribute attr = new StyleFontCharsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontCharsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontFamilyGenericAttribute</code> , See {@odf.attribute style:font-family-generic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontFamilyGenericAttribute() {
+		StyleFontFamilyGenericAttribute attr = (StyleFontFamilyGenericAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-family-generic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontFamilyGenericAttribute</code> , See {@odf.attribute style:font-family-generic}
+	 *
+	 * @param styleFontFamilyGenericValue   The type is <code>String</code>
+	 */
+	public void setStyleFontFamilyGenericAttribute(String styleFontFamilyGenericValue) {
+		StyleFontFamilyGenericAttribute attr = new StyleFontFamilyGenericAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontFamilyGenericValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontPitchAttribute</code> , See {@odf.attribute style:font-pitch}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontPitchAttribute() {
+		StyleFontPitchAttribute attr = (StyleFontPitchAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-pitch");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontPitchAttribute</code> , See {@odf.attribute style:font-pitch}
+	 *
+	 * @param styleFontPitchValue   The type is <code>String</code>
+	 */
+	public void setStyleFontPitchAttribute(String styleFontPitchValue) {
+		StyleFontPitchAttribute attr = new StyleFontPitchAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontPitchValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgAccentHeightAttribute</code> , See {@odf.attribute svg:accent-height}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgAccentHeightAttribute() {
+		SvgAccentHeightAttribute attr = (SvgAccentHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "accent-height");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgAccentHeightAttribute</code> , See {@odf.attribute svg:accent-height}
+	 *
+	 * @param svgAccentHeightValue   The type is <code>Integer</code>
+	 */
+	public void setSvgAccentHeightAttribute(Integer svgAccentHeightValue) {
+		SvgAccentHeightAttribute attr = new SvgAccentHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgAccentHeightValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgAlphabeticAttribute</code> , See {@odf.attribute svg:alphabetic}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgAlphabeticAttribute() {
+		SvgAlphabeticAttribute attr = (SvgAlphabeticAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "alphabetic");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgAlphabeticAttribute</code> , See {@odf.attribute svg:alphabetic}
+	 *
+	 * @param svgAlphabeticValue   The type is <code>Integer</code>
+	 */
+	public void setSvgAlphabeticAttribute(Integer svgAlphabeticValue) {
+		SvgAlphabeticAttribute attr = new SvgAlphabeticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgAlphabeticValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgAscentAttribute</code> , See {@odf.attribute svg:ascent}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgAscentAttribute() {
+		SvgAscentAttribute attr = (SvgAscentAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "ascent");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgAscentAttribute</code> , See {@odf.attribute svg:ascent}
+	 *
+	 * @param svgAscentValue   The type is <code>Integer</code>
+	 */
+	public void setSvgAscentAttribute(Integer svgAscentValue) {
+		SvgAscentAttribute attr = new SvgAscentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgAscentValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgBboxAttribute</code> , See {@odf.attribute svg:bbox}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgBboxAttribute() {
+		SvgBboxAttribute attr = (SvgBboxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "bbox");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgBboxAttribute</code> , See {@odf.attribute svg:bbox}
+	 *
+	 * @param svgBboxValue   The type is <code>String</code>
+	 */
+	public void setSvgBboxAttribute(String svgBboxValue) {
+		SvgBboxAttribute attr = new SvgBboxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgBboxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCapHeightAttribute</code> , See {@odf.attribute svg:cap-height}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgCapHeightAttribute() {
+		SvgCapHeightAttribute attr = (SvgCapHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cap-height");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCapHeightAttribute</code> , See {@odf.attribute svg:cap-height}
+	 *
+	 * @param svgCapHeightValue   The type is <code>Integer</code>
+	 */
+	public void setSvgCapHeightAttribute(Integer svgCapHeightValue) {
+		SvgCapHeightAttribute attr = new SvgCapHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgCapHeightValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgDescentAttribute</code> , See {@odf.attribute svg:descent}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgDescentAttribute() {
+		SvgDescentAttribute attr = (SvgDescentAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "descent");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgDescentAttribute</code> , See {@odf.attribute svg:descent}
+	 *
+	 * @param svgDescentValue   The type is <code>Integer</code>
+	 */
+	public void setSvgDescentAttribute(Integer svgDescentValue) {
+		SvgDescentAttribute attr = new SvgDescentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgDescentValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFontFamilyAttribute</code> , See {@odf.attribute svg:font-family}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFontFamilyAttribute() {
+		SvgFontFamilyAttribute attr = (SvgFontFamilyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "font-family");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFontFamilyAttribute</code> , See {@odf.attribute svg:font-family}
+	 *
+	 * @param svgFontFamilyValue   The type is <code>String</code>
+	 */
+	public void setSvgFontFamilyAttribute(String svgFontFamilyValue) {
+		SvgFontFamilyAttribute attr = new SvgFontFamilyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFontFamilyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFontSizeAttribute</code> , See {@odf.attribute svg:font-size}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFontSizeAttribute() {
+		SvgFontSizeAttribute attr = (SvgFontSizeAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "font-size");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFontSizeAttribute</code> , See {@odf.attribute svg:font-size}
+	 *
+	 * @param svgFontSizeValue   The type is <code>String</code>
+	 */
+	public void setSvgFontSizeAttribute(String svgFontSizeValue) {
+		SvgFontSizeAttribute attr = new SvgFontSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFontSizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFontStretchAttribute</code> , See {@odf.attribute svg:font-stretch}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFontStretchAttribute() {
+		SvgFontStretchAttribute attr = (SvgFontStretchAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "font-stretch");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFontStretchAttribute</code> , See {@odf.attribute svg:font-stretch}
+	 *
+	 * @param svgFontStretchValue   The type is <code>String</code>
+	 */
+	public void setSvgFontStretchAttribute(String svgFontStretchValue) {
+		SvgFontStretchAttribute attr = new SvgFontStretchAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFontStretchValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFontStyleAttribute</code> , See {@odf.attribute svg:font-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFontStyleAttribute() {
+		SvgFontStyleAttribute attr = (SvgFontStyleAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "font-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFontStyleAttribute</code> , See {@odf.attribute svg:font-style}
+	 *
+	 * @param svgFontStyleValue   The type is <code>String</code>
+	 */
+	public void setSvgFontStyleAttribute(String svgFontStyleValue) {
+		SvgFontStyleAttribute attr = new SvgFontStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFontStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFontVariantAttribute</code> , See {@odf.attribute svg:font-variant}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFontVariantAttribute() {
+		SvgFontVariantAttribute attr = (SvgFontVariantAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "font-variant");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFontVariantAttribute</code> , See {@odf.attribute svg:font-variant}
+	 *
+	 * @param svgFontVariantValue   The type is <code>String</code>
+	 */
+	public void setSvgFontVariantAttribute(String svgFontVariantValue) {
+		SvgFontVariantAttribute attr = new SvgFontVariantAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFontVariantValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFontWeightAttribute</code> , See {@odf.attribute svg:font-weight}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFontWeightAttribute() {
+		SvgFontWeightAttribute attr = (SvgFontWeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "font-weight");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFontWeightAttribute</code> , See {@odf.attribute svg:font-weight}
+	 *
+	 * @param svgFontWeightValue   The type is <code>String</code>
+	 */
+	public void setSvgFontWeightAttribute(String svgFontWeightValue) {
+		SvgFontWeightAttribute attr = new SvgFontWeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFontWeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHangingAttribute</code> , See {@odf.attribute svg:hanging}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgHangingAttribute() {
+		SvgHangingAttribute attr = (SvgHangingAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "hanging");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHangingAttribute</code> , See {@odf.attribute svg:hanging}
+	 *
+	 * @param svgHangingValue   The type is <code>Integer</code>
+	 */
+	public void setSvgHangingAttribute(Integer svgHangingValue) {
+		SvgHangingAttribute attr = new SvgHangingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgHangingValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgIdeographicAttribute</code> , See {@odf.attribute svg:ideographic}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgIdeographicAttribute() {
+		SvgIdeographicAttribute attr = (SvgIdeographicAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "ideographic");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgIdeographicAttribute</code> , See {@odf.attribute svg:ideographic}
+	 *
+	 * @param svgIdeographicValue   The type is <code>Integer</code>
+	 */
+	public void setSvgIdeographicAttribute(Integer svgIdeographicValue) {
+		SvgIdeographicAttribute attr = new SvgIdeographicAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgIdeographicValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgMathematicalAttribute</code> , See {@odf.attribute svg:mathematical}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgMathematicalAttribute() {
+		SvgMathematicalAttribute attr = (SvgMathematicalAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "mathematical");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgMathematicalAttribute</code> , See {@odf.attribute svg:mathematical}
+	 *
+	 * @param svgMathematicalValue   The type is <code>Integer</code>
+	 */
+	public void setSvgMathematicalAttribute(Integer svgMathematicalValue) {
+		SvgMathematicalAttribute attr = new SvgMathematicalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgMathematicalValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgOverlinePositionAttribute</code> , See {@odf.attribute svg:overline-position}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgOverlinePositionAttribute() {
+		SvgOverlinePositionAttribute attr = (SvgOverlinePositionAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "overline-position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgOverlinePositionAttribute</code> , See {@odf.attribute svg:overline-position}
+	 *
+	 * @param svgOverlinePositionValue   The type is <code>Integer</code>
+	 */
+	public void setSvgOverlinePositionAttribute(Integer svgOverlinePositionValue) {
+		SvgOverlinePositionAttribute attr = new SvgOverlinePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgOverlinePositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgOverlineThicknessAttribute</code> , See {@odf.attribute svg:overline-thickness}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgOverlineThicknessAttribute() {
+		SvgOverlineThicknessAttribute attr = (SvgOverlineThicknessAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "overline-thickness");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgOverlineThicknessAttribute</code> , See {@odf.attribute svg:overline-thickness}
+	 *
+	 * @param svgOverlineThicknessValue   The type is <code>Integer</code>
+	 */
+	public void setSvgOverlineThicknessAttribute(Integer svgOverlineThicknessValue) {
+		SvgOverlineThicknessAttribute attr = new SvgOverlineThicknessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgOverlineThicknessValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgPanose1Attribute</code> , See {@odf.attribute svg:panose-1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgPanose1Attribute() {
+		SvgPanose1Attribute attr = (SvgPanose1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "panose-1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgPanose1Attribute</code> , See {@odf.attribute svg:panose-1}
+	 *
+	 * @param svgPanose1Value   The type is <code>String</code>
+	 */
+	public void setSvgPanose1Attribute(String svgPanose1Value) {
+		SvgPanose1Attribute attr = new SvgPanose1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgPanose1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgSlopeAttribute</code> , See {@odf.attribute svg:slope}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgSlopeAttribute() {
+		SvgSlopeAttribute attr = (SvgSlopeAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "slope");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgSlopeAttribute</code> , See {@odf.attribute svg:slope}
+	 *
+	 * @param svgSlopeValue   The type is <code>Integer</code>
+	 */
+	public void setSvgSlopeAttribute(Integer svgSlopeValue) {
+		SvgSlopeAttribute attr = new SvgSlopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgSlopeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStemhAttribute</code> , See {@odf.attribute svg:stemh}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgStemhAttribute() {
+		SvgStemhAttribute attr = (SvgStemhAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stemh");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStemhAttribute</code> , See {@odf.attribute svg:stemh}
+	 *
+	 * @param svgStemhValue   The type is <code>Integer</code>
+	 */
+	public void setSvgStemhAttribute(Integer svgStemhValue) {
+		SvgStemhAttribute attr = new SvgStemhAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgStemhValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStemvAttribute</code> , See {@odf.attribute svg:stemv}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgStemvAttribute() {
+		SvgStemvAttribute attr = (SvgStemvAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stemv");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStemvAttribute</code> , See {@odf.attribute svg:stemv}
+	 *
+	 * @param svgStemvValue   The type is <code>Integer</code>
+	 */
+	public void setSvgStemvAttribute(Integer svgStemvValue) {
+		SvgStemvAttribute attr = new SvgStemvAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgStemvValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStrikethroughPositionAttribute</code> , See {@odf.attribute svg:strikethrough-position}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgStrikethroughPositionAttribute() {
+		SvgStrikethroughPositionAttribute attr = (SvgStrikethroughPositionAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "strikethrough-position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStrikethroughPositionAttribute</code> , See {@odf.attribute svg:strikethrough-position}
+	 *
+	 * @param svgStrikethroughPositionValue   The type is <code>Integer</code>
+	 */
+	public void setSvgStrikethroughPositionAttribute(Integer svgStrikethroughPositionValue) {
+		SvgStrikethroughPositionAttribute attr = new SvgStrikethroughPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgStrikethroughPositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStrikethroughThicknessAttribute</code> , See {@odf.attribute svg:strikethrough-thickness}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgStrikethroughThicknessAttribute() {
+		SvgStrikethroughThicknessAttribute attr = (SvgStrikethroughThicknessAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "strikethrough-thickness");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStrikethroughThicknessAttribute</code> , See {@odf.attribute svg:strikethrough-thickness}
+	 *
+	 * @param svgStrikethroughThicknessValue   The type is <code>Integer</code>
+	 */
+	public void setSvgStrikethroughThicknessAttribute(Integer svgStrikethroughThicknessValue) {
+		SvgStrikethroughThicknessAttribute attr = new SvgStrikethroughThicknessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgStrikethroughThicknessValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgUnderlinePositionAttribute</code> , See {@odf.attribute svg:underline-position}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgUnderlinePositionAttribute() {
+		SvgUnderlinePositionAttribute attr = (SvgUnderlinePositionAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "underline-position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgUnderlinePositionAttribute</code> , See {@odf.attribute svg:underline-position}
+	 *
+	 * @param svgUnderlinePositionValue   The type is <code>Integer</code>
+	 */
+	public void setSvgUnderlinePositionAttribute(Integer svgUnderlinePositionValue) {
+		SvgUnderlinePositionAttribute attr = new SvgUnderlinePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgUnderlinePositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgUnderlineThicknessAttribute</code> , See {@odf.attribute svg:underline-thickness}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgUnderlineThicknessAttribute() {
+		SvgUnderlineThicknessAttribute attr = (SvgUnderlineThicknessAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "underline-thickness");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgUnderlineThicknessAttribute</code> , See {@odf.attribute svg:underline-thickness}
+	 *
+	 * @param svgUnderlineThicknessValue   The type is <code>Integer</code>
+	 */
+	public void setSvgUnderlineThicknessAttribute(Integer svgUnderlineThicknessValue) {
+		SvgUnderlineThicknessAttribute attr = new SvgUnderlineThicknessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgUnderlineThicknessValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgUnicodeRangeAttribute</code> , See {@odf.attribute svg:unicode-range}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgUnicodeRangeAttribute() {
+		SvgUnicodeRangeAttribute attr = (SvgUnicodeRangeAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "unicode-range");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgUnicodeRangeAttribute</code> , See {@odf.attribute svg:unicode-range}
+	 *
+	 * @param svgUnicodeRangeValue   The type is <code>String</code>
+	 */
+	public void setSvgUnicodeRangeAttribute(String svgUnicodeRangeValue) {
+		SvgUnicodeRangeAttribute attr = new SvgUnicodeRangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgUnicodeRangeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgUnitsPerEmAttribute</code> , See {@odf.attribute svg:units-per-em}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgUnitsPerEmAttribute() {
+		SvgUnitsPerEmAttribute attr = (SvgUnitsPerEmAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "units-per-em");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgUnitsPerEmAttribute</code> , See {@odf.attribute svg:units-per-em}
+	 *
+	 * @param svgUnitsPerEmValue   The type is <code>Integer</code>
+	 */
+	public void setSvgUnitsPerEmAttribute(Integer svgUnitsPerEmValue) {
+		SvgUnitsPerEmAttribute attr = new SvgUnitsPerEmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgUnitsPerEmValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgVAlphabeticAttribute</code> , See {@odf.attribute svg:v-alphabetic}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgVAlphabeticAttribute() {
+		SvgVAlphabeticAttribute attr = (SvgVAlphabeticAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "v-alphabetic");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgVAlphabeticAttribute</code> , See {@odf.attribute svg:v-alphabetic}
+	 *
+	 * @param svgVAlphabeticValue   The type is <code>Integer</code>
+	 */
+	public void setSvgVAlphabeticAttribute(Integer svgVAlphabeticValue) {
+		SvgVAlphabeticAttribute attr = new SvgVAlphabeticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgVAlphabeticValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgVHangingAttribute</code> , See {@odf.attribute svg:v-hanging}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgVHangingAttribute() {
+		SvgVHangingAttribute attr = (SvgVHangingAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "v-hanging");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgVHangingAttribute</code> , See {@odf.attribute svg:v-hanging}
+	 *
+	 * @param svgVHangingValue   The type is <code>Integer</code>
+	 */
+	public void setSvgVHangingAttribute(Integer svgVHangingValue) {
+		SvgVHangingAttribute attr = new SvgVHangingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgVHangingValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgVIdeographicAttribute</code> , See {@odf.attribute svg:v-ideographic}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgVIdeographicAttribute() {
+		SvgVIdeographicAttribute attr = (SvgVIdeographicAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "v-ideographic");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgVIdeographicAttribute</code> , See {@odf.attribute svg:v-ideographic}
+	 *
+	 * @param svgVIdeographicValue   The type is <code>Integer</code>
+	 */
+	public void setSvgVIdeographicAttribute(Integer svgVIdeographicValue) {
+		SvgVIdeographicAttribute attr = new SvgVIdeographicAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgVIdeographicValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgVMathematicalAttribute</code> , See {@odf.attribute svg:v-mathematical}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgVMathematicalAttribute() {
+		SvgVMathematicalAttribute attr = (SvgVMathematicalAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "v-mathematical");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgVMathematicalAttribute</code> , See {@odf.attribute svg:v-mathematical}
+	 *
+	 * @param svgVMathematicalValue   The type is <code>Integer</code>
+	 */
+	public void setSvgVMathematicalAttribute(Integer svgVMathematicalValue) {
+		SvgVMathematicalAttribute attr = new SvgVMathematicalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgVMathematicalValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthsAttribute</code> , See {@odf.attribute svg:widths}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthsAttribute() {
+		SvgWidthsAttribute attr = (SvgWidthsAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "widths");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthsAttribute</code> , See {@odf.attribute svg:widths}
+	 *
+	 * @param svgWidthsValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthsAttribute(String svgWidthsValue) {
+		SvgWidthsAttribute attr = new SvgWidthsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXHeightAttribute</code> , See {@odf.attribute svg:x-height}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSvgXHeightAttribute() {
+		SvgXHeightAttribute attr = (SvgXHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x-height");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXHeightAttribute</code> , See {@odf.attribute svg:x-height}
+	 *
+	 * @param svgXHeightValue   The type is <code>Integer</code>
+	 */
+	public void setSvgXHeightAttribute(Integer svgXHeightValue) {
+		SvgXHeightAttribute attr = new SvgXHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(svgXHeightValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element svg:definition-src}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element svg:definition-src}
+	 */
+	 public SvgDefinitionSrcElement newSvgDefinitionSrcElement(String xlinkHrefValue, String xlinkTypeValue) {
+		SvgDefinitionSrcElement svgDefinitionSrc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgDefinitionSrcElement.class);
+		svgDefinitionSrc.setXlinkHrefAttribute(xlinkHrefValue);
+		svgDefinitionSrc.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(svgDefinitionSrc);
+		return svgDefinitionSrc;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:font-face-src}.
+	 *
+	 * @return the element {@odf.element svg:font-face-src}
+	 */
+	public SvgFontFaceSrcElement newSvgFontFaceSrcElement() {
+		SvgFontFaceSrcElement svgFontFaceSrc = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgFontFaceSrcElement.class);
+		this.appendChild(svgFontFaceSrc);
+		return svgFontFaceSrc;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterElement.java
new file mode 100644
index 0000000..d000c5f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:footer}.
+ *
+ */
+public class StyleFooterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "footer");
+
+	/**
+	 * Create the instance of <code>StyleFooterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleFooterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:footer}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleDisplayAttribute() {
+		StyleDisplayAttribute attr = (StyleDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(StyleDisplayAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @param styleDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleDisplayAttribute(Boolean styleDisplayValue) {
+		StyleDisplayAttribute attr = new StyleDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-center}.
+	 *
+	 * @return the element {@odf.element style:region-center}
+	 */
+	public StyleRegionCenterElement newStyleRegionCenterElement() {
+		StyleRegionCenterElement styleRegionCenter = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionCenterElement.class);
+		this.appendChild(styleRegionCenter);
+		return styleRegionCenter;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-left}.
+	 *
+	 * @return the element {@odf.element style:region-left}
+	 */
+	public StyleRegionLeftElement newStyleRegionLeftElement() {
+		StyleRegionLeftElement styleRegionLeft = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionLeftElement.class);
+		this.appendChild(styleRegionLeft);
+		return styleRegionLeft;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-right}.
+	 *
+	 * @return the element {@odf.element style:region-right}
+	 */
+	public StyleRegionRightElement newStyleRegionRightElement() {
+		StyleRegionRightElement styleRegionRight = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionRightElement.class);
+		this.appendChild(styleRegionRight);
+		return styleRegionRight;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:index-title}
+	 */
+	 public TextIndexTitleElement newTextIndexTitleElement(String textNameValue) {
+		TextIndexTitleElement textIndexTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleElement.class);
+		textIndexTitle.setTextNameAttribute(textNameValue);
+		this.appendChild(textIndexTitle);
+		return textIndexTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tracked-changes}.
+	 *
+	 * @return the element {@odf.element text:tracked-changes}
+	 */
+	public TextTrackedChangesElement newTextTrackedChangesElement() {
+		TextTrackedChangesElement textTrackedChanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTrackedChangesElement.class);
+		this.appendChild(textTrackedChanges);
+		return textTrackedChanges;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterLeftElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterLeftElement.java
new file mode 100644
index 0000000..9828fce
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterLeftElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:footer-left}.
+ *
+ */
+public class StyleFooterLeftElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "footer-left");
+
+	/**
+	 * Create the instance of <code>StyleFooterLeftElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleFooterLeftElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:footer-left}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleDisplayAttribute() {
+		StyleDisplayAttribute attr = (StyleDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(StyleDisplayAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @param styleDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleDisplayAttribute(Boolean styleDisplayValue) {
+		StyleDisplayAttribute attr = new StyleDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-center}.
+	 *
+	 * @return the element {@odf.element style:region-center}
+	 */
+	public StyleRegionCenterElement newStyleRegionCenterElement() {
+		StyleRegionCenterElement styleRegionCenter = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionCenterElement.class);
+		this.appendChild(styleRegionCenter);
+		return styleRegionCenter;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-left}.
+	 *
+	 * @return the element {@odf.element style:region-left}
+	 */
+	public StyleRegionLeftElement newStyleRegionLeftElement() {
+		StyleRegionLeftElement styleRegionLeft = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionLeftElement.class);
+		this.appendChild(styleRegionLeft);
+		return styleRegionLeft;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-right}.
+	 *
+	 * @return the element {@odf.element style:region-right}
+	 */
+	public StyleRegionRightElement newStyleRegionRightElement() {
+		StyleRegionRightElement styleRegionRight = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionRightElement.class);
+		this.appendChild(styleRegionRight);
+		return styleRegionRight;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:index-title}
+	 */
+	 public TextIndexTitleElement newTextIndexTitleElement(String textNameValue) {
+		TextIndexTitleElement textIndexTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleElement.class);
+		textIndexTitle.setTextNameAttribute(textNameValue);
+		this.appendChild(textIndexTitle);
+		return textIndexTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tracked-changes}.
+	 *
+	 * @return the element {@odf.element text:tracked-changes}
+	 */
+	public TextTrackedChangesElement newTextTrackedChangesElement() {
+		TextTrackedChangesElement textTrackedChanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTrackedChangesElement.class);
+		this.appendChild(textTrackedChanges);
+		return textTrackedChanges;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterStyleElement.java
new file mode 100644
index 0000000..7bf4c5c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFooterStyleElement.java
@@ -0,0 +1,82 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:footer-style}.
+ *
+ */
+public class StyleFooterStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "footer-style");
+
+	/**
+	 * Create the instance of <code>StyleFooterStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleFooterStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:footer-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element style:header-footer-properties}.
+	 *
+	 * @return the element {@odf.element style:header-footer-properties}
+	 */
+	public StyleHeaderFooterPropertiesElement newStyleHeaderFooterPropertiesElement() {
+		StyleHeaderFooterPropertiesElement styleHeaderFooterProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHeaderFooterPropertiesElement.class);
+		this.appendChild(styleHeaderFooterProperties);
+		return styleHeaderFooterProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFootnoteSepElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFootnoteSepElement.java
new file mode 100644
index 0000000..8bf01f6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleFootnoteSepElement.java
@@ -0,0 +1,246 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleAdjustmentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDistanceAfterSepAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDistanceBeforeSepAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLineStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWidthAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:footnote-sep}.
+ *
+ */
+public class StyleFootnoteSepElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "footnote-sep");
+
+	/**
+	 * Create the instance of <code>StyleFootnoteSepElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleFootnoteSepElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:footnote-sep}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleAdjustmentAttribute</code> , See {@odf.attribute style:adjustment}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleAdjustmentAttribute() {
+		StyleAdjustmentAttribute attr = (StyleAdjustmentAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "adjustment");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleAdjustmentAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleAdjustmentAttribute</code> , See {@odf.attribute style:adjustment}
+	 *
+	 * @param styleAdjustmentValue   The type is <code>String</code>
+	 */
+	public void setStyleAdjustmentAttribute(String styleAdjustmentValue) {
+		StyleAdjustmentAttribute attr = new StyleAdjustmentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleAdjustmentValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleColorAttribute</code> , See {@odf.attribute style:color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleColorAttribute() {
+		StyleColorAttribute attr = (StyleColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleColorAttribute</code> , See {@odf.attribute style:color}
+	 *
+	 * @param styleColorValue   The type is <code>String</code>
+	 */
+	public void setStyleColorAttribute(String styleColorValue) {
+		StyleColorAttribute attr = new StyleColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDistanceAfterSepAttribute</code> , See {@odf.attribute style:distance-after-sep}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDistanceAfterSepAttribute() {
+		StyleDistanceAfterSepAttribute attr = (StyleDistanceAfterSepAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "distance-after-sep");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDistanceAfterSepAttribute</code> , See {@odf.attribute style:distance-after-sep}
+	 *
+	 * @param styleDistanceAfterSepValue   The type is <code>String</code>
+	 */
+	public void setStyleDistanceAfterSepAttribute(String styleDistanceAfterSepValue) {
+		StyleDistanceAfterSepAttribute attr = new StyleDistanceAfterSepAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDistanceAfterSepValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDistanceBeforeSepAttribute</code> , See {@odf.attribute style:distance-before-sep}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDistanceBeforeSepAttribute() {
+		StyleDistanceBeforeSepAttribute attr = (StyleDistanceBeforeSepAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "distance-before-sep");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDistanceBeforeSepAttribute</code> , See {@odf.attribute style:distance-before-sep}
+	 *
+	 * @param styleDistanceBeforeSepValue   The type is <code>String</code>
+	 */
+	public void setStyleDistanceBeforeSepAttribute(String styleDistanceBeforeSepValue) {
+		StyleDistanceBeforeSepAttribute attr = new StyleDistanceBeforeSepAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDistanceBeforeSepValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLineStyleAttribute</code> , See {@odf.attribute style:line-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLineStyleAttribute() {
+		StyleLineStyleAttribute attr = (StyleLineStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "line-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLineStyleAttribute</code> , See {@odf.attribute style:line-style}
+	 *
+	 * @param styleLineStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleLineStyleAttribute(String styleLineStyleValue) {
+		StyleLineStyleAttribute attr = new StyleLineStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLineStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelWidthAttribute() {
+		StyleRelWidthAttribute attr = (StyleRelWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @param styleRelWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleRelWidthAttribute(String styleRelWidthValue) {
+		StyleRelWidthAttribute attr = new StyleRelWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWidthAttribute</code> , See {@odf.attribute style:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWidthAttribute() {
+		StyleWidthAttribute attr = (StyleWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWidthAttribute</code> , See {@odf.attribute style:width}
+	 *
+	 * @param styleWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleWidthAttribute(String styleWidthValue) {
+		StyleWidthAttribute attr = new StyleWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWidthValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleGraphicPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleGraphicPropertiesElement.java
new file mode 100644
index 0000000..678465c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleGraphicPropertiesElement.java
@@ -0,0 +1,4990 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextListStyleElement;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dAmbientColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dBackScaleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dBackfaceCullingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dCloseBackAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dCloseFrontAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dDepthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dDiffuseColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dEdgeRoundingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dEdgeRoundingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dEmissiveColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dEndAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dHorizontalSegmentsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dLightingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dNormalsDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dNormalsKindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShininessAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dSpecularColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTextureFilterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTextureGenerationModeXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTextureGenerationModeYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTextureKindAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dTextureModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dVerticalSegmentsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawAutoGrowHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawAutoGrowWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawBlueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionAngleTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionEscapeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionEscapeDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionFitLineLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionGapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionLineLengthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawCaptionTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawColorInversionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawColorModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawContrastAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDecimalPlacesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDrawAspectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndGuideAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndLineSpacingHorizontalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawEndLineSpacingVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillGradientNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillHatchNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillHatchSolidAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageRefPointAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageRefPointXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageRefPointYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFillImageWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFitToContourAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFitToSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFrameDisplayBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFrameDisplayScrollbarAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFrameMarginHorizontalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawFrameMarginVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGammaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGradientStepCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGreenAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGuideDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawGuideOverhangAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawImageOpacityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLineDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawLuminanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMarkerEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMarkerEndCenterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMarkerEndWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMarkerStartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMarkerStartCenterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMarkerStartWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMeasureAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawMeasureVerticalAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawOleDrawAspectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawOpacityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawOpacityNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawParallelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawPlacingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawRedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawSecondaryFillColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShadowColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShadowOffsetXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShadowOffsetYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShadowOpacityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawShowUnitAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartGuideAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartLineSpacingHorizontalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStartLineSpacingVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStrokeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStrokeDashAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStrokeDashNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStrokeLinejoinAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawSymbolColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextareaHorizontalAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTextareaVerticalAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawTileRepeatOffsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawUnitAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawVisibleAreaHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawVisibleAreaLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawVisibleAreaTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawVisibleAreaWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawWrapInfluenceOnPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoClipAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMaxHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMaxWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMinHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMinWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoWrapOptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBackgroundTransparencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleEditableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFlowWithTextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleHorizontalPosAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleHorizontalRelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleMirrorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumberWrappedParagraphsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleOverflowBehaviorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePrintContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleProtectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRunThroughAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShrinkToFitAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalPosAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalRelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWrapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWrapContourAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWrapContourModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWrapDynamicThresholdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFillRuleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStrokeColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStrokeLinecapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStrokeOpacityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStrokeWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgXAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorPageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationRepeatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationStartInsideAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationStepsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnimationStopInsideAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:graphic-properties}.
+ *
+ */
+public class StyleGraphicPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "graphic-properties");
+
+	/**
+	 * Create the instance of <code>StyleGraphicPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleGraphicPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:graphic-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty AmbientColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "ambient-color"));
+
+	public final static OdfStyleProperty BackScale =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "back-scale"));
+
+	public final static OdfStyleProperty BackfaceCulling =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "backface-culling"));
+
+	public final static OdfStyleProperty CloseBack =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "close-back"));
+
+	public final static OdfStyleProperty CloseFront =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "close-front"));
+
+	public final static OdfStyleProperty Depth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "depth"));
+
+	public final static OdfStyleProperty DiffuseColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "diffuse-color"));
+
+	public final static OdfStyleProperty EdgeRounding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "edge-rounding"));
+
+	public final static OdfStyleProperty EdgeRoundingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "edge-rounding-mode"));
+
+	public final static OdfStyleProperty EmissiveColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "emissive-color"));
+
+	public final static OdfStyleProperty EndAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "end-angle"));
+
+	public final static OdfStyleProperty HorizontalSegments =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "horizontal-segments"));
+
+	public final static OdfStyleProperty LightingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "lighting-mode"));
+
+	public final static OdfStyleProperty NormalsDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "normals-direction"));
+
+	public final static OdfStyleProperty NormalsKind =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "normals-kind"));
+
+	public final static OdfStyleProperty Dr3dShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "shadow"));
+
+	public final static OdfStyleProperty Shininess =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "shininess"));
+
+	public final static OdfStyleProperty SpecularColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "specular-color"));
+
+	public final static OdfStyleProperty TextureFilter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-filter"));
+
+	public final static OdfStyleProperty TextureGenerationModeX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-generation-mode-x"));
+
+	public final static OdfStyleProperty TextureGenerationModeY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-generation-mode-y"));
+
+	public final static OdfStyleProperty TextureKind =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-kind"));
+
+	public final static OdfStyleProperty TextureMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-mode"));
+
+	public final static OdfStyleProperty VerticalSegments =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "vertical-segments"));
+
+	public final static OdfStyleProperty AutoGrowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "auto-grow-height"));
+
+	public final static OdfStyleProperty AutoGrowWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "auto-grow-width"));
+
+	public final static OdfStyleProperty Blue =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "blue"));
+
+	public final static OdfStyleProperty CaptionAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-angle"));
+
+	public final static OdfStyleProperty CaptionAngleType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-angle-type"));
+
+	public final static OdfStyleProperty CaptionEscape =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-escape"));
+
+	public final static OdfStyleProperty CaptionEscapeDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-escape-direction"));
+
+	public final static OdfStyleProperty CaptionFitLineLength =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-fit-line-length"));
+
+	public final static OdfStyleProperty CaptionGap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-gap"));
+
+	public final static OdfStyleProperty CaptionLineLength =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-line-length"));
+
+	public final static OdfStyleProperty CaptionType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-type"));
+
+	public final static OdfStyleProperty ColorInversion =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "color-inversion"));
+
+	public final static OdfStyleProperty ColorMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "color-mode"));
+
+	public final static OdfStyleProperty Contrast =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "contrast"));
+
+	public final static OdfStyleProperty DecimalPlaces =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "decimal-places"));
+
+	public final static OdfStyleProperty DrawAspect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "draw-aspect"));
+
+	public final static OdfStyleProperty EndGuide =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "end-guide"));
+
+	public final static OdfStyleProperty EndLineSpacingHorizontal =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "end-line-spacing-horizontal"));
+
+	public final static OdfStyleProperty EndLineSpacingVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "end-line-spacing-vertical"));
+
+	public final static OdfStyleProperty Fill =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill"));
+
+	public final static OdfStyleProperty FillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-color"));
+
+	public final static OdfStyleProperty FillGradientName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-gradient-name"));
+
+	public final static OdfStyleProperty FillHatchName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-name"));
+
+	public final static OdfStyleProperty FillHatchSolid =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-solid"));
+
+	public final static OdfStyleProperty FillImageHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-height"));
+
+	public final static OdfStyleProperty FillImageName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-name"));
+
+	public final static OdfStyleProperty FillImageRefPoint =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point"));
+
+	public final static OdfStyleProperty FillImageRefPointX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x"));
+
+	public final static OdfStyleProperty FillImageRefPointY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y"));
+
+	public final static OdfStyleProperty FillImageWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-width"));
+
+	public final static OdfStyleProperty FitToContour =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fit-to-contour"));
+
+	public final static OdfStyleProperty FitToSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fit-to-size"));
+
+	public final static OdfStyleProperty FrameDisplayBorder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-display-border"));
+
+	public final static OdfStyleProperty FrameDisplayScrollbar =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-display-scrollbar"));
+
+	public final static OdfStyleProperty FrameMarginHorizontal =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-margin-horizontal"));
+
+	public final static OdfStyleProperty FrameMarginVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-margin-vertical"));
+
+	public final static OdfStyleProperty Gamma =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "gamma"));
+
+	public final static OdfStyleProperty GradientStepCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "gradient-step-count"));
+
+	public final static OdfStyleProperty Green =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "green"));
+
+	public final static OdfStyleProperty GuideDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "guide-distance"));
+
+	public final static OdfStyleProperty GuideOverhang =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "guide-overhang"));
+
+	public final static OdfStyleProperty ImageOpacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "image-opacity"));
+
+	public final static OdfStyleProperty LineDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "line-distance"));
+
+	public final static OdfStyleProperty Luminance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "luminance"));
+
+	public final static OdfStyleProperty MarkerEnd =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end"));
+
+	public final static OdfStyleProperty MarkerEndCenter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end-center"));
+
+	public final static OdfStyleProperty MarkerEndWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end-width"));
+
+	public final static OdfStyleProperty MarkerStart =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start"));
+
+	public final static OdfStyleProperty MarkerStartCenter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start-center"));
+
+	public final static OdfStyleProperty MarkerStartWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start-width"));
+
+	public final static OdfStyleProperty MeasureAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "measure-align"));
+
+	public final static OdfStyleProperty MeasureVerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "measure-vertical-align"));
+
+	public final static OdfStyleProperty OleDrawAspect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "ole-draw-aspect"));
+
+	public final static OdfStyleProperty Opacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity"));
+
+	public final static OdfStyleProperty OpacityName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity-name"));
+
+	public final static OdfStyleProperty Parallel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "parallel"));
+
+	public final static OdfStyleProperty Placing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "placing"));
+
+	public final static OdfStyleProperty Red =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "red"));
+
+	public final static OdfStyleProperty SecondaryFillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "secondary-fill-color"));
+
+	public final static OdfStyleProperty DrawShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow"));
+
+	public final static OdfStyleProperty ShadowColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-color"));
+
+	public final static OdfStyleProperty ShadowOffsetX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-offset-x"));
+
+	public final static OdfStyleProperty ShadowOffsetY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-offset-y"));
+
+	public final static OdfStyleProperty ShadowOpacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-opacity"));
+
+	public final static OdfStyleProperty ShowUnit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "show-unit"));
+
+	public final static OdfStyleProperty StartGuide =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "start-guide"));
+
+	public final static OdfStyleProperty StartLineSpacingHorizontal =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "start-line-spacing-horizontal"));
+
+	public final static OdfStyleProperty StartLineSpacingVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "start-line-spacing-vertical"));
+
+	public final static OdfStyleProperty Stroke =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke"));
+
+	public final static OdfStyleProperty StrokeDash =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash"));
+
+	public final static OdfStyleProperty StrokeDashNames =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash-names"));
+
+	public final static OdfStyleProperty StrokeLinejoin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-linejoin"));
+
+	public final static OdfStyleProperty SymbolColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "symbol-color"));
+
+	public final static OdfStyleProperty TextareaHorizontalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "textarea-horizontal-align"));
+
+	public final static OdfStyleProperty TextareaVerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "textarea-vertical-align"));
+
+	public final static OdfStyleProperty TileRepeatOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "tile-repeat-offset"));
+
+	public final static OdfStyleProperty Unit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "unit"));
+
+	public final static OdfStyleProperty VisibleAreaHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-height"));
+
+	public final static OdfStyleProperty VisibleAreaLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-left"));
+
+	public final static OdfStyleProperty VisibleAreaTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-top"));
+
+	public final static OdfStyleProperty VisibleAreaWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-width"));
+
+	public final static OdfStyleProperty WrapInfluenceOnPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "wrap-influence-on-position"));
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+
+	public final static OdfStyleProperty Clip =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "clip"));
+
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+
+	public final static OdfStyleProperty MaxHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "max-height"));
+
+	public final static OdfStyleProperty MaxWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "max-width"));
+
+	public final static OdfStyleProperty MinHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "min-height"));
+
+	public final static OdfStyleProperty MinWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "min-width"));
+
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+
+	public final static OdfStyleProperty WrapOption =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "wrap-option"));
+
+	public final static OdfStyleProperty BackgroundTransparency =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "background-transparency"));
+
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+
+	public final static OdfStyleProperty Editable =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "editable"));
+
+	public final static OdfStyleProperty FlowWithText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "flow-with-text"));
+
+	public final static OdfStyleProperty HorizontalPos =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "horizontal-pos"));
+
+	public final static OdfStyleProperty HorizontalRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "horizontal-rel"));
+
+	public final static OdfStyleProperty Mirror =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "mirror"));
+
+	public final static OdfStyleProperty NumberWrappedParagraphs =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "number-wrapped-paragraphs"));
+
+	public final static OdfStyleProperty OverflowBehavior =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "overflow-behavior"));
+
+	public final static OdfStyleProperty PrintContent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-content"));
+
+	public final static OdfStyleProperty Protect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "protect"));
+
+	public final static OdfStyleProperty RelHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-height"));
+
+	public final static OdfStyleProperty RelWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-width"));
+
+	public final static OdfStyleProperty Repeat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "repeat"));
+
+	public final static OdfStyleProperty RunThrough =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "run-through"));
+
+	public final static OdfStyleProperty StyleShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+
+	public final static OdfStyleProperty ShrinkToFit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shrink-to-fit"));
+
+	public final static OdfStyleProperty VerticalPos =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-pos"));
+
+	public final static OdfStyleProperty VerticalRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-rel"));
+
+	public final static OdfStyleProperty Wrap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap"));
+
+	public final static OdfStyleProperty WrapContour =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-contour"));
+
+	public final static OdfStyleProperty WrapContourMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-contour-mode"));
+
+	public final static OdfStyleProperty WrapDynamicThreshold =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-dynamic-threshold"));
+
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+
+	public final static OdfStyleProperty FillRule =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "fill-rule"));
+
+	public final static OdfStyleProperty Height =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "height"));
+
+	public final static OdfStyleProperty StrokeColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-color"));
+
+	public final static OdfStyleProperty StrokeLinecap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-linecap"));
+
+	public final static OdfStyleProperty StrokeOpacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-opacity"));
+
+	public final static OdfStyleProperty StrokeWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-width"));
+
+	public final static OdfStyleProperty Width =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "width"));
+
+	public final static OdfStyleProperty X =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "x"));
+
+	public final static OdfStyleProperty Y =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "y"));
+
+	public final static OdfStyleProperty AnchorPageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "anchor-page-number"));
+
+	public final static OdfStyleProperty AnchorType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "anchor-type"));
+
+	public final static OdfStyleProperty Animation =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation"));
+
+	public final static OdfStyleProperty AnimationDelay =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-delay"));
+
+	public final static OdfStyleProperty AnimationDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-direction"));
+
+	public final static OdfStyleProperty AnimationRepeat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-repeat"));
+
+	public final static OdfStyleProperty AnimationStartInside =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-start-inside"));
+
+	public final static OdfStyleProperty AnimationSteps =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-steps"));
+
+	public final static OdfStyleProperty AnimationStopInside =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-stop-inside"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dAmbientColorAttribute</code> , See {@odf.attribute dr3d:ambient-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dAmbientColorAttribute() {
+		Dr3dAmbientColorAttribute attr = (Dr3dAmbientColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "ambient-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dAmbientColorAttribute</code> , See {@odf.attribute dr3d:ambient-color}
+	 *
+	 * @param dr3dAmbientColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dAmbientColorAttribute(String dr3dAmbientColorValue) {
+		Dr3dAmbientColorAttribute attr = new Dr3dAmbientColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dAmbientColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dBackScaleAttribute</code> , See {@odf.attribute dr3d:back-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dBackScaleAttribute() {
+		Dr3dBackScaleAttribute attr = (Dr3dBackScaleAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "back-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dBackScaleAttribute</code> , See {@odf.attribute dr3d:back-scale}
+	 *
+	 * @param dr3dBackScaleValue   The type is <code>String</code>
+	 */
+	public void setDr3dBackScaleAttribute(String dr3dBackScaleValue) {
+		Dr3dBackScaleAttribute attr = new Dr3dBackScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dBackScaleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dBackfaceCullingAttribute</code> , See {@odf.attribute dr3d:backface-culling}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dBackfaceCullingAttribute() {
+		Dr3dBackfaceCullingAttribute attr = (Dr3dBackfaceCullingAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "backface-culling");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dBackfaceCullingAttribute</code> , See {@odf.attribute dr3d:backface-culling}
+	 *
+	 * @param dr3dBackfaceCullingValue   The type is <code>String</code>
+	 */
+	public void setDr3dBackfaceCullingAttribute(String dr3dBackfaceCullingValue) {
+		Dr3dBackfaceCullingAttribute attr = new Dr3dBackfaceCullingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dBackfaceCullingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dCloseBackAttribute</code> , See {@odf.attribute dr3d:close-back}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDr3dCloseBackAttribute() {
+		Dr3dCloseBackAttribute attr = (Dr3dCloseBackAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "close-back");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dCloseBackAttribute</code> , See {@odf.attribute dr3d:close-back}
+	 *
+	 * @param dr3dCloseBackValue   The type is <code>Boolean</code>
+	 */
+	public void setDr3dCloseBackAttribute(Boolean dr3dCloseBackValue) {
+		Dr3dCloseBackAttribute attr = new Dr3dCloseBackAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dr3dCloseBackValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dCloseFrontAttribute</code> , See {@odf.attribute dr3d:close-front}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDr3dCloseFrontAttribute() {
+		Dr3dCloseFrontAttribute attr = (Dr3dCloseFrontAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "close-front");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dCloseFrontAttribute</code> , See {@odf.attribute dr3d:close-front}
+	 *
+	 * @param dr3dCloseFrontValue   The type is <code>Boolean</code>
+	 */
+	public void setDr3dCloseFrontAttribute(Boolean dr3dCloseFrontValue) {
+		Dr3dCloseFrontAttribute attr = new Dr3dCloseFrontAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(dr3dCloseFrontValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dDepthAttribute</code> , See {@odf.attribute dr3d:depth}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dDepthAttribute() {
+		Dr3dDepthAttribute attr = (Dr3dDepthAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "depth");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dDepthAttribute</code> , See {@odf.attribute dr3d:depth}
+	 *
+	 * @param dr3dDepthValue   The type is <code>String</code>
+	 */
+	public void setDr3dDepthAttribute(String dr3dDepthValue) {
+		Dr3dDepthAttribute attr = new Dr3dDepthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dDepthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dDiffuseColorAttribute</code> , See {@odf.attribute dr3d:diffuse-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dDiffuseColorAttribute() {
+		Dr3dDiffuseColorAttribute attr = (Dr3dDiffuseColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "diffuse-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dDiffuseColorAttribute</code> , See {@odf.attribute dr3d:diffuse-color}
+	 *
+	 * @param dr3dDiffuseColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dDiffuseColorAttribute(String dr3dDiffuseColorValue) {
+		Dr3dDiffuseColorAttribute attr = new Dr3dDiffuseColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dDiffuseColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dEdgeRoundingAttribute</code> , See {@odf.attribute dr3d:edge-rounding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dEdgeRoundingAttribute() {
+		Dr3dEdgeRoundingAttribute attr = (Dr3dEdgeRoundingAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "edge-rounding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dEdgeRoundingAttribute</code> , See {@odf.attribute dr3d:edge-rounding}
+	 *
+	 * @param dr3dEdgeRoundingValue   The type is <code>String</code>
+	 */
+	public void setDr3dEdgeRoundingAttribute(String dr3dEdgeRoundingValue) {
+		Dr3dEdgeRoundingAttribute attr = new Dr3dEdgeRoundingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dEdgeRoundingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dEdgeRoundingModeAttribute</code> , See {@odf.attribute dr3d:edge-rounding-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dEdgeRoundingModeAttribute() {
+		Dr3dEdgeRoundingModeAttribute attr = (Dr3dEdgeRoundingModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "edge-rounding-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dEdgeRoundingModeAttribute</code> , See {@odf.attribute dr3d:edge-rounding-mode}
+	 *
+	 * @param dr3dEdgeRoundingModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dEdgeRoundingModeAttribute(String dr3dEdgeRoundingModeValue) {
+		Dr3dEdgeRoundingModeAttribute attr = new Dr3dEdgeRoundingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dEdgeRoundingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dEmissiveColorAttribute</code> , See {@odf.attribute dr3d:emissive-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dEmissiveColorAttribute() {
+		Dr3dEmissiveColorAttribute attr = (Dr3dEmissiveColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "emissive-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dEmissiveColorAttribute</code> , See {@odf.attribute dr3d:emissive-color}
+	 *
+	 * @param dr3dEmissiveColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dEmissiveColorAttribute(String dr3dEmissiveColorValue) {
+		Dr3dEmissiveColorAttribute attr = new Dr3dEmissiveColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dEmissiveColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dEndAngleAttribute</code> , See {@odf.attribute dr3d:end-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dEndAngleAttribute() {
+		Dr3dEndAngleAttribute attr = (Dr3dEndAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "end-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dEndAngleAttribute</code> , See {@odf.attribute dr3d:end-angle}
+	 *
+	 * @param dr3dEndAngleValue   The type is <code>String</code>
+	 */
+	public void setDr3dEndAngleAttribute(String dr3dEndAngleValue) {
+		Dr3dEndAngleAttribute attr = new Dr3dEndAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dEndAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dHorizontalSegmentsAttribute</code> , See {@odf.attribute dr3d:horizontal-segments}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDr3dHorizontalSegmentsAttribute() {
+		Dr3dHorizontalSegmentsAttribute attr = (Dr3dHorizontalSegmentsAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "horizontal-segments");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dHorizontalSegmentsAttribute</code> , See {@odf.attribute dr3d:horizontal-segments}
+	 *
+	 * @param dr3dHorizontalSegmentsValue   The type is <code>Integer</code>
+	 */
+	public void setDr3dHorizontalSegmentsAttribute(Integer dr3dHorizontalSegmentsValue) {
+		Dr3dHorizontalSegmentsAttribute attr = new Dr3dHorizontalSegmentsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dr3dHorizontalSegmentsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dLightingModeAttribute</code> , See {@odf.attribute dr3d:lighting-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dLightingModeAttribute() {
+		Dr3dLightingModeAttribute attr = (Dr3dLightingModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "lighting-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dLightingModeAttribute</code> , See {@odf.attribute dr3d:lighting-mode}
+	 *
+	 * @param dr3dLightingModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dLightingModeAttribute(String dr3dLightingModeValue) {
+		Dr3dLightingModeAttribute attr = new Dr3dLightingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dLightingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dNormalsDirectionAttribute</code> , See {@odf.attribute dr3d:normals-direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dNormalsDirectionAttribute() {
+		Dr3dNormalsDirectionAttribute attr = (Dr3dNormalsDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "normals-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dNormalsDirectionAttribute</code> , See {@odf.attribute dr3d:normals-direction}
+	 *
+	 * @param dr3dNormalsDirectionValue   The type is <code>String</code>
+	 */
+	public void setDr3dNormalsDirectionAttribute(String dr3dNormalsDirectionValue) {
+		Dr3dNormalsDirectionAttribute attr = new Dr3dNormalsDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dNormalsDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dNormalsKindAttribute</code> , See {@odf.attribute dr3d:normals-kind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dNormalsKindAttribute() {
+		Dr3dNormalsKindAttribute attr = (Dr3dNormalsKindAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "normals-kind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dNormalsKindAttribute</code> , See {@odf.attribute dr3d:normals-kind}
+	 *
+	 * @param dr3dNormalsKindValue   The type is <code>String</code>
+	 */
+	public void setDr3dNormalsKindAttribute(String dr3dNormalsKindValue) {
+		Dr3dNormalsKindAttribute attr = new Dr3dNormalsKindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dNormalsKindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShadowAttribute</code> , See {@odf.attribute dr3d:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShadowAttribute() {
+		Dr3dShadowAttribute attr = (Dr3dShadowAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShadowAttribute</code> , See {@odf.attribute dr3d:shadow}
+	 *
+	 * @param dr3dShadowValue   The type is <code>String</code>
+	 */
+	public void setDr3dShadowAttribute(String dr3dShadowValue) {
+		Dr3dShadowAttribute attr = new Dr3dShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dShininessAttribute</code> , See {@odf.attribute dr3d:shininess}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dShininessAttribute() {
+		Dr3dShininessAttribute attr = (Dr3dShininessAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "shininess");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dShininessAttribute</code> , See {@odf.attribute dr3d:shininess}
+	 *
+	 * @param dr3dShininessValue   The type is <code>String</code>
+	 */
+	public void setDr3dShininessAttribute(String dr3dShininessValue) {
+		Dr3dShininessAttribute attr = new Dr3dShininessAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dShininessValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dSpecularColorAttribute</code> , See {@odf.attribute dr3d:specular-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dSpecularColorAttribute() {
+		Dr3dSpecularColorAttribute attr = (Dr3dSpecularColorAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "specular-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dSpecularColorAttribute</code> , See {@odf.attribute dr3d:specular-color}
+	 *
+	 * @param dr3dSpecularColorValue   The type is <code>String</code>
+	 */
+	public void setDr3dSpecularColorAttribute(String dr3dSpecularColorValue) {
+		Dr3dSpecularColorAttribute attr = new Dr3dSpecularColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dSpecularColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTextureFilterAttribute</code> , See {@odf.attribute dr3d:texture-filter}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTextureFilterAttribute() {
+		Dr3dTextureFilterAttribute attr = (Dr3dTextureFilterAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "texture-filter");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTextureFilterAttribute</code> , See {@odf.attribute dr3d:texture-filter}
+	 *
+	 * @param dr3dTextureFilterValue   The type is <code>String</code>
+	 */
+	public void setDr3dTextureFilterAttribute(String dr3dTextureFilterValue) {
+		Dr3dTextureFilterAttribute attr = new Dr3dTextureFilterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTextureFilterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTextureGenerationModeXAttribute</code> , See {@odf.attribute dr3d:texture-generation-mode-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTextureGenerationModeXAttribute() {
+		Dr3dTextureGenerationModeXAttribute attr = (Dr3dTextureGenerationModeXAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "texture-generation-mode-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTextureGenerationModeXAttribute</code> , See {@odf.attribute dr3d:texture-generation-mode-x}
+	 *
+	 * @param dr3dTextureGenerationModeXValue   The type is <code>String</code>
+	 */
+	public void setDr3dTextureGenerationModeXAttribute(String dr3dTextureGenerationModeXValue) {
+		Dr3dTextureGenerationModeXAttribute attr = new Dr3dTextureGenerationModeXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTextureGenerationModeXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTextureGenerationModeYAttribute</code> , See {@odf.attribute dr3d:texture-generation-mode-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTextureGenerationModeYAttribute() {
+		Dr3dTextureGenerationModeYAttribute attr = (Dr3dTextureGenerationModeYAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "texture-generation-mode-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTextureGenerationModeYAttribute</code> , See {@odf.attribute dr3d:texture-generation-mode-y}
+	 *
+	 * @param dr3dTextureGenerationModeYValue   The type is <code>String</code>
+	 */
+	public void setDr3dTextureGenerationModeYAttribute(String dr3dTextureGenerationModeYValue) {
+		Dr3dTextureGenerationModeYAttribute attr = new Dr3dTextureGenerationModeYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTextureGenerationModeYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTextureKindAttribute</code> , See {@odf.attribute dr3d:texture-kind}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTextureKindAttribute() {
+		Dr3dTextureKindAttribute attr = (Dr3dTextureKindAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "texture-kind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTextureKindAttribute</code> , See {@odf.attribute dr3d:texture-kind}
+	 *
+	 * @param dr3dTextureKindValue   The type is <code>String</code>
+	 */
+	public void setDr3dTextureKindAttribute(String dr3dTextureKindValue) {
+		Dr3dTextureKindAttribute attr = new Dr3dTextureKindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTextureKindValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dTextureModeAttribute</code> , See {@odf.attribute dr3d:texture-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDr3dTextureModeAttribute() {
+		Dr3dTextureModeAttribute attr = (Dr3dTextureModeAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "texture-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dTextureModeAttribute</code> , See {@odf.attribute dr3d:texture-mode}
+	 *
+	 * @param dr3dTextureModeValue   The type is <code>String</code>
+	 */
+	public void setDr3dTextureModeAttribute(String dr3dTextureModeValue) {
+		Dr3dTextureModeAttribute attr = new Dr3dTextureModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(dr3dTextureModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>Dr3dVerticalSegmentsAttribute</code> , See {@odf.attribute dr3d:vertical-segments}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDr3dVerticalSegmentsAttribute() {
+		Dr3dVerticalSegmentsAttribute attr = (Dr3dVerticalSegmentsAttribute) getOdfAttribute(OdfDocumentNamespace.DR3D, "vertical-segments");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>Dr3dVerticalSegmentsAttribute</code> , See {@odf.attribute dr3d:vertical-segments}
+	 *
+	 * @param dr3dVerticalSegmentsValue   The type is <code>Integer</code>
+	 */
+	public void setDr3dVerticalSegmentsAttribute(Integer dr3dVerticalSegmentsValue) {
+		Dr3dVerticalSegmentsAttribute attr = new Dr3dVerticalSegmentsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(dr3dVerticalSegmentsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawAutoGrowHeightAttribute</code> , See {@odf.attribute draw:auto-grow-height}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawAutoGrowHeightAttribute() {
+		DrawAutoGrowHeightAttribute attr = (DrawAutoGrowHeightAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "auto-grow-height");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawAutoGrowHeightAttribute</code> , See {@odf.attribute draw:auto-grow-height}
+	 *
+	 * @param drawAutoGrowHeightValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawAutoGrowHeightAttribute(Boolean drawAutoGrowHeightValue) {
+		DrawAutoGrowHeightAttribute attr = new DrawAutoGrowHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawAutoGrowHeightValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawAutoGrowWidthAttribute</code> , See {@odf.attribute draw:auto-grow-width}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawAutoGrowWidthAttribute() {
+		DrawAutoGrowWidthAttribute attr = (DrawAutoGrowWidthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "auto-grow-width");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawAutoGrowWidthAttribute</code> , See {@odf.attribute draw:auto-grow-width}
+	 *
+	 * @param drawAutoGrowWidthValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawAutoGrowWidthAttribute(Boolean drawAutoGrowWidthValue) {
+		DrawAutoGrowWidthAttribute attr = new DrawAutoGrowWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawAutoGrowWidthValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawBlueAttribute</code> , See {@odf.attribute draw:blue}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawBlueAttribute() {
+		DrawBlueAttribute attr = (DrawBlueAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "blue");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawBlueAttribute</code> , See {@odf.attribute draw:blue}
+	 *
+	 * @param drawBlueValue   The type is <code>String</code>
+	 */
+	public void setDrawBlueAttribute(String drawBlueValue) {
+		DrawBlueAttribute attr = new DrawBlueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawBlueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionAngleAttribute</code> , See {@odf.attribute draw:caption-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionAngleAttribute() {
+		DrawCaptionAngleAttribute attr = (DrawCaptionAngleAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionAngleAttribute</code> , See {@odf.attribute draw:caption-angle}
+	 *
+	 * @param drawCaptionAngleValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionAngleAttribute(String drawCaptionAngleValue) {
+		DrawCaptionAngleAttribute attr = new DrawCaptionAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionAngleTypeAttribute</code> , See {@odf.attribute draw:caption-angle-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionAngleTypeAttribute() {
+		DrawCaptionAngleTypeAttribute attr = (DrawCaptionAngleTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-angle-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionAngleTypeAttribute</code> , See {@odf.attribute draw:caption-angle-type}
+	 *
+	 * @param drawCaptionAngleTypeValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionAngleTypeAttribute(String drawCaptionAngleTypeValue) {
+		DrawCaptionAngleTypeAttribute attr = new DrawCaptionAngleTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionAngleTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionEscapeAttribute</code> , See {@odf.attribute draw:caption-escape}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionEscapeAttribute() {
+		DrawCaptionEscapeAttribute attr = (DrawCaptionEscapeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-escape");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionEscapeAttribute</code> , See {@odf.attribute draw:caption-escape}
+	 *
+	 * @param drawCaptionEscapeValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionEscapeAttribute(String drawCaptionEscapeValue) {
+		DrawCaptionEscapeAttribute attr = new DrawCaptionEscapeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionEscapeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionEscapeDirectionAttribute</code> , See {@odf.attribute draw:caption-escape-direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionEscapeDirectionAttribute() {
+		DrawCaptionEscapeDirectionAttribute attr = (DrawCaptionEscapeDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-escape-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionEscapeDirectionAttribute</code> , See {@odf.attribute draw:caption-escape-direction}
+	 *
+	 * @param drawCaptionEscapeDirectionValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionEscapeDirectionAttribute(String drawCaptionEscapeDirectionValue) {
+		DrawCaptionEscapeDirectionAttribute attr = new DrawCaptionEscapeDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionEscapeDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionFitLineLengthAttribute</code> , See {@odf.attribute draw:caption-fit-line-length}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawCaptionFitLineLengthAttribute() {
+		DrawCaptionFitLineLengthAttribute attr = (DrawCaptionFitLineLengthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-fit-line-length");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionFitLineLengthAttribute</code> , See {@odf.attribute draw:caption-fit-line-length}
+	 *
+	 * @param drawCaptionFitLineLengthValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawCaptionFitLineLengthAttribute(Boolean drawCaptionFitLineLengthValue) {
+		DrawCaptionFitLineLengthAttribute attr = new DrawCaptionFitLineLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawCaptionFitLineLengthValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionGapAttribute</code> , See {@odf.attribute draw:caption-gap}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionGapAttribute() {
+		DrawCaptionGapAttribute attr = (DrawCaptionGapAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-gap");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionGapAttribute</code> , See {@odf.attribute draw:caption-gap}
+	 *
+	 * @param drawCaptionGapValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionGapAttribute(String drawCaptionGapValue) {
+		DrawCaptionGapAttribute attr = new DrawCaptionGapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionGapValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionLineLengthAttribute</code> , See {@odf.attribute draw:caption-line-length}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionLineLengthAttribute() {
+		DrawCaptionLineLengthAttribute attr = (DrawCaptionLineLengthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-line-length");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionLineLengthAttribute</code> , See {@odf.attribute draw:caption-line-length}
+	 *
+	 * @param drawCaptionLineLengthValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionLineLengthAttribute(String drawCaptionLineLengthValue) {
+		DrawCaptionLineLengthAttribute attr = new DrawCaptionLineLengthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionLineLengthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawCaptionTypeAttribute</code> , See {@odf.attribute draw:caption-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawCaptionTypeAttribute() {
+		DrawCaptionTypeAttribute attr = (DrawCaptionTypeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "caption-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawCaptionTypeAttribute</code> , See {@odf.attribute draw:caption-type}
+	 *
+	 * @param drawCaptionTypeValue   The type is <code>String</code>
+	 */
+	public void setDrawCaptionTypeAttribute(String drawCaptionTypeValue) {
+		DrawCaptionTypeAttribute attr = new DrawCaptionTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawCaptionTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawColorInversionAttribute</code> , See {@odf.attribute draw:color-inversion}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawColorInversionAttribute() {
+		DrawColorInversionAttribute attr = (DrawColorInversionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "color-inversion");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawColorInversionAttribute</code> , See {@odf.attribute draw:color-inversion}
+	 *
+	 * @param drawColorInversionValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawColorInversionAttribute(Boolean drawColorInversionValue) {
+		DrawColorInversionAttribute attr = new DrawColorInversionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawColorInversionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawColorModeAttribute</code> , See {@odf.attribute draw:color-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawColorModeAttribute() {
+		DrawColorModeAttribute attr = (DrawColorModeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "color-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawColorModeAttribute</code> , See {@odf.attribute draw:color-mode}
+	 *
+	 * @param drawColorModeValue   The type is <code>String</code>
+	 */
+	public void setDrawColorModeAttribute(String drawColorModeValue) {
+		DrawColorModeAttribute attr = new DrawColorModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawColorModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawContrastAttribute</code> , See {@odf.attribute draw:contrast}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawContrastAttribute() {
+		DrawContrastAttribute attr = (DrawContrastAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "contrast");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawContrastAttribute</code> , See {@odf.attribute draw:contrast}
+	 *
+	 * @param drawContrastValue   The type is <code>String</code>
+	 */
+	public void setDrawContrastAttribute(String drawContrastValue) {
+		DrawContrastAttribute attr = new DrawContrastAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawContrastValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDecimalPlacesAttribute</code> , See {@odf.attribute draw:decimal-places}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawDecimalPlacesAttribute() {
+		DrawDecimalPlacesAttribute attr = (DrawDecimalPlacesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "decimal-places");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDecimalPlacesAttribute</code> , See {@odf.attribute draw:decimal-places}
+	 *
+	 * @param drawDecimalPlacesValue   The type is <code>Integer</code>
+	 */
+	public void setDrawDecimalPlacesAttribute(Integer drawDecimalPlacesValue) {
+		DrawDecimalPlacesAttribute attr = new DrawDecimalPlacesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawDecimalPlacesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDrawAspectAttribute</code> , See {@odf.attribute draw:draw-aspect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDrawAspectAttribute() {
+		DrawDrawAspectAttribute attr = (DrawDrawAspectAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "draw-aspect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDrawAspectAttribute</code> , See {@odf.attribute draw:draw-aspect}
+	 *
+	 * @param drawDrawAspectValue   The type is <code>String</code>
+	 */
+	public void setDrawDrawAspectAttribute(String drawDrawAspectValue) {
+		DrawDrawAspectAttribute attr = new DrawDrawAspectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDrawAspectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndGuideAttribute</code> , See {@odf.attribute draw:end-guide}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndGuideAttribute() {
+		DrawEndGuideAttribute attr = (DrawEndGuideAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-guide");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndGuideAttribute</code> , See {@odf.attribute draw:end-guide}
+	 *
+	 * @param drawEndGuideValue   The type is <code>String</code>
+	 */
+	public void setDrawEndGuideAttribute(String drawEndGuideValue) {
+		DrawEndGuideAttribute attr = new DrawEndGuideAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndGuideValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndLineSpacingHorizontalAttribute</code> , See {@odf.attribute draw:end-line-spacing-horizontal}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndLineSpacingHorizontalAttribute() {
+		DrawEndLineSpacingHorizontalAttribute attr = (DrawEndLineSpacingHorizontalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-line-spacing-horizontal");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndLineSpacingHorizontalAttribute</code> , See {@odf.attribute draw:end-line-spacing-horizontal}
+	 *
+	 * @param drawEndLineSpacingHorizontalValue   The type is <code>String</code>
+	 */
+	public void setDrawEndLineSpacingHorizontalAttribute(String drawEndLineSpacingHorizontalValue) {
+		DrawEndLineSpacingHorizontalAttribute attr = new DrawEndLineSpacingHorizontalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndLineSpacingHorizontalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawEndLineSpacingVerticalAttribute</code> , See {@odf.attribute draw:end-line-spacing-vertical}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawEndLineSpacingVerticalAttribute() {
+		DrawEndLineSpacingVerticalAttribute attr = (DrawEndLineSpacingVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "end-line-spacing-vertical");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawEndLineSpacingVerticalAttribute</code> , See {@odf.attribute draw:end-line-spacing-vertical}
+	 *
+	 * @param drawEndLineSpacingVerticalValue   The type is <code>String</code>
+	 */
+	public void setDrawEndLineSpacingVerticalAttribute(String drawEndLineSpacingVerticalValue) {
+		DrawEndLineSpacingVerticalAttribute attr = new DrawEndLineSpacingVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawEndLineSpacingVerticalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillAttribute</code> , See {@odf.attribute draw:fill}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillAttribute() {
+		DrawFillAttribute attr = (DrawFillAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillAttribute</code> , See {@odf.attribute draw:fill}
+	 *
+	 * @param drawFillValue   The type is <code>String</code>
+	 */
+	public void setDrawFillAttribute(String drawFillValue) {
+		DrawFillAttribute attr = new DrawFillAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillColorAttribute</code> , See {@odf.attribute draw:fill-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillColorAttribute() {
+		DrawFillColorAttribute attr = (DrawFillColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillColorAttribute</code> , See {@odf.attribute draw:fill-color}
+	 *
+	 * @param drawFillColorValue   The type is <code>String</code>
+	 */
+	public void setDrawFillColorAttribute(String drawFillColorValue) {
+		DrawFillColorAttribute attr = new DrawFillColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillGradientNameAttribute</code> , See {@odf.attribute draw:fill-gradient-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillGradientNameAttribute() {
+		DrawFillGradientNameAttribute attr = (DrawFillGradientNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-gradient-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillGradientNameAttribute</code> , See {@odf.attribute draw:fill-gradient-name}
+	 *
+	 * @param drawFillGradientNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFillGradientNameAttribute(String drawFillGradientNameValue) {
+		DrawFillGradientNameAttribute attr = new DrawFillGradientNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillGradientNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillHatchNameAttribute</code> , See {@odf.attribute draw:fill-hatch-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillHatchNameAttribute() {
+		DrawFillHatchNameAttribute attr = (DrawFillHatchNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-hatch-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillHatchNameAttribute</code> , See {@odf.attribute draw:fill-hatch-name}
+	 *
+	 * @param drawFillHatchNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFillHatchNameAttribute(String drawFillHatchNameValue) {
+		DrawFillHatchNameAttribute attr = new DrawFillHatchNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillHatchNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillHatchSolidAttribute</code> , See {@odf.attribute draw:fill-hatch-solid}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawFillHatchSolidAttribute() {
+		DrawFillHatchSolidAttribute attr = (DrawFillHatchSolidAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-hatch-solid");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillHatchSolidAttribute</code> , See {@odf.attribute draw:fill-hatch-solid}
+	 *
+	 * @param drawFillHatchSolidValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawFillHatchSolidAttribute(Boolean drawFillHatchSolidValue) {
+		DrawFillHatchSolidAttribute attr = new DrawFillHatchSolidAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawFillHatchSolidValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageHeightAttribute</code> , See {@odf.attribute draw:fill-image-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageHeightAttribute() {
+		DrawFillImageHeightAttribute attr = (DrawFillImageHeightAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageHeightAttribute</code> , See {@odf.attribute draw:fill-image-height}
+	 *
+	 * @param drawFillImageHeightValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageHeightAttribute(String drawFillImageHeightValue) {
+		DrawFillImageHeightAttribute attr = new DrawFillImageHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageNameAttribute</code> , See {@odf.attribute draw:fill-image-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageNameAttribute() {
+		DrawFillImageNameAttribute attr = (DrawFillImageNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageNameAttribute</code> , See {@odf.attribute draw:fill-image-name}
+	 *
+	 * @param drawFillImageNameValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageNameAttribute(String drawFillImageNameValue) {
+		DrawFillImageNameAttribute attr = new DrawFillImageNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageRefPointAttribute</code> , See {@odf.attribute draw:fill-image-ref-point}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageRefPointAttribute() {
+		DrawFillImageRefPointAttribute attr = (DrawFillImageRefPointAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-ref-point");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageRefPointAttribute</code> , See {@odf.attribute draw:fill-image-ref-point}
+	 *
+	 * @param drawFillImageRefPointValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageRefPointAttribute(String drawFillImageRefPointValue) {
+		DrawFillImageRefPointAttribute attr = new DrawFillImageRefPointAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageRefPointValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageRefPointXAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageRefPointXAttribute() {
+		DrawFillImageRefPointXAttribute attr = (DrawFillImageRefPointXAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageRefPointXAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-x}
+	 *
+	 * @param drawFillImageRefPointXValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageRefPointXAttribute(String drawFillImageRefPointXValue) {
+		DrawFillImageRefPointXAttribute attr = new DrawFillImageRefPointXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageRefPointXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageRefPointYAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageRefPointYAttribute() {
+		DrawFillImageRefPointYAttribute attr = (DrawFillImageRefPointYAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageRefPointYAttribute</code> , See {@odf.attribute draw:fill-image-ref-point-y}
+	 *
+	 * @param drawFillImageRefPointYValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageRefPointYAttribute(String drawFillImageRefPointYValue) {
+		DrawFillImageRefPointYAttribute attr = new DrawFillImageRefPointYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageRefPointYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFillImageWidthAttribute</code> , See {@odf.attribute draw:fill-image-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFillImageWidthAttribute() {
+		DrawFillImageWidthAttribute attr = (DrawFillImageWidthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fill-image-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFillImageWidthAttribute</code> , See {@odf.attribute draw:fill-image-width}
+	 *
+	 * @param drawFillImageWidthValue   The type is <code>String</code>
+	 */
+	public void setDrawFillImageWidthAttribute(String drawFillImageWidthValue) {
+		DrawFillImageWidthAttribute attr = new DrawFillImageWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFillImageWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFitToContourAttribute</code> , See {@odf.attribute draw:fit-to-contour}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawFitToContourAttribute() {
+		DrawFitToContourAttribute attr = (DrawFitToContourAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fit-to-contour");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFitToContourAttribute</code> , See {@odf.attribute draw:fit-to-contour}
+	 *
+	 * @param drawFitToContourValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawFitToContourAttribute(Boolean drawFitToContourValue) {
+		DrawFitToContourAttribute attr = new DrawFitToContourAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawFitToContourValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFitToSizeAttribute</code> , See {@odf.attribute draw:fit-to-size}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawFitToSizeAttribute() {
+		DrawFitToSizeAttribute attr = (DrawFitToSizeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "fit-to-size");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFitToSizeAttribute</code> , See {@odf.attribute draw:fit-to-size}
+	 *
+	 * @param drawFitToSizeValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawFitToSizeAttribute(Boolean drawFitToSizeValue) {
+		DrawFitToSizeAttribute attr = new DrawFitToSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawFitToSizeValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFrameDisplayBorderAttribute</code> , See {@odf.attribute draw:frame-display-border}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawFrameDisplayBorderAttribute() {
+		DrawFrameDisplayBorderAttribute attr = (DrawFrameDisplayBorderAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "frame-display-border");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFrameDisplayBorderAttribute</code> , See {@odf.attribute draw:frame-display-border}
+	 *
+	 * @param drawFrameDisplayBorderValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawFrameDisplayBorderAttribute(Boolean drawFrameDisplayBorderValue) {
+		DrawFrameDisplayBorderAttribute attr = new DrawFrameDisplayBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawFrameDisplayBorderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFrameDisplayScrollbarAttribute</code> , See {@odf.attribute draw:frame-display-scrollbar}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawFrameDisplayScrollbarAttribute() {
+		DrawFrameDisplayScrollbarAttribute attr = (DrawFrameDisplayScrollbarAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "frame-display-scrollbar");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFrameDisplayScrollbarAttribute</code> , See {@odf.attribute draw:frame-display-scrollbar}
+	 *
+	 * @param drawFrameDisplayScrollbarValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawFrameDisplayScrollbarAttribute(Boolean drawFrameDisplayScrollbarValue) {
+		DrawFrameDisplayScrollbarAttribute attr = new DrawFrameDisplayScrollbarAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawFrameDisplayScrollbarValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFrameMarginHorizontalAttribute</code> , See {@odf.attribute draw:frame-margin-horizontal}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFrameMarginHorizontalAttribute() {
+		DrawFrameMarginHorizontalAttribute attr = (DrawFrameMarginHorizontalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "frame-margin-horizontal");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFrameMarginHorizontalAttribute</code> , See {@odf.attribute draw:frame-margin-horizontal}
+	 *
+	 * @param drawFrameMarginHorizontalValue   The type is <code>String</code>
+	 */
+	public void setDrawFrameMarginHorizontalAttribute(String drawFrameMarginHorizontalValue) {
+		DrawFrameMarginHorizontalAttribute attr = new DrawFrameMarginHorizontalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFrameMarginHorizontalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawFrameMarginVerticalAttribute</code> , See {@odf.attribute draw:frame-margin-vertical}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawFrameMarginVerticalAttribute() {
+		DrawFrameMarginVerticalAttribute attr = (DrawFrameMarginVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "frame-margin-vertical");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawFrameMarginVerticalAttribute</code> , See {@odf.attribute draw:frame-margin-vertical}
+	 *
+	 * @param drawFrameMarginVerticalValue   The type is <code>String</code>
+	 */
+	public void setDrawFrameMarginVerticalAttribute(String drawFrameMarginVerticalValue) {
+		DrawFrameMarginVerticalAttribute attr = new DrawFrameMarginVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawFrameMarginVerticalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGammaAttribute</code> , See {@odf.attribute draw:gamma}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGammaAttribute() {
+		DrawGammaAttribute attr = (DrawGammaAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "gamma");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGammaAttribute</code> , See {@odf.attribute draw:gamma}
+	 *
+	 * @param drawGammaValue   The type is <code>String</code>
+	 */
+	public void setDrawGammaAttribute(String drawGammaValue) {
+		DrawGammaAttribute attr = new DrawGammaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGammaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGradientStepCountAttribute</code> , See {@odf.attribute draw:gradient-step-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawGradientStepCountAttribute() {
+		DrawGradientStepCountAttribute attr = (DrawGradientStepCountAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "gradient-step-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGradientStepCountAttribute</code> , See {@odf.attribute draw:gradient-step-count}
+	 *
+	 * @param drawGradientStepCountValue   The type is <code>Integer</code>
+	 */
+	public void setDrawGradientStepCountAttribute(Integer drawGradientStepCountValue) {
+		DrawGradientStepCountAttribute attr = new DrawGradientStepCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawGradientStepCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGreenAttribute</code> , See {@odf.attribute draw:green}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGreenAttribute() {
+		DrawGreenAttribute attr = (DrawGreenAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "green");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGreenAttribute</code> , See {@odf.attribute draw:green}
+	 *
+	 * @param drawGreenValue   The type is <code>String</code>
+	 */
+	public void setDrawGreenAttribute(String drawGreenValue) {
+		DrawGreenAttribute attr = new DrawGreenAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGreenValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGuideDistanceAttribute</code> , See {@odf.attribute draw:guide-distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGuideDistanceAttribute() {
+		DrawGuideDistanceAttribute attr = (DrawGuideDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "guide-distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGuideDistanceAttribute</code> , See {@odf.attribute draw:guide-distance}
+	 *
+	 * @param drawGuideDistanceValue   The type is <code>String</code>
+	 */
+	public void setDrawGuideDistanceAttribute(String drawGuideDistanceValue) {
+		DrawGuideDistanceAttribute attr = new DrawGuideDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGuideDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawGuideOverhangAttribute</code> , See {@odf.attribute draw:guide-overhang}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawGuideOverhangAttribute() {
+		DrawGuideOverhangAttribute attr = (DrawGuideOverhangAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "guide-overhang");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawGuideOverhangAttribute</code> , See {@odf.attribute draw:guide-overhang}
+	 *
+	 * @param drawGuideOverhangValue   The type is <code>String</code>
+	 */
+	public void setDrawGuideOverhangAttribute(String drawGuideOverhangValue) {
+		DrawGuideOverhangAttribute attr = new DrawGuideOverhangAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawGuideOverhangValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawImageOpacityAttribute</code> , See {@odf.attribute draw:image-opacity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawImageOpacityAttribute() {
+		DrawImageOpacityAttribute attr = (DrawImageOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "image-opacity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawImageOpacityAttribute</code> , See {@odf.attribute draw:image-opacity}
+	 *
+	 * @param drawImageOpacityValue   The type is <code>String</code>
+	 */
+	public void setDrawImageOpacityAttribute(String drawImageOpacityValue) {
+		DrawImageOpacityAttribute attr = new DrawImageOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawImageOpacityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLineDistanceAttribute</code> , See {@odf.attribute draw:line-distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLineDistanceAttribute() {
+		DrawLineDistanceAttribute attr = (DrawLineDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "line-distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLineDistanceAttribute</code> , See {@odf.attribute draw:line-distance}
+	 *
+	 * @param drawLineDistanceValue   The type is <code>String</code>
+	 */
+	public void setDrawLineDistanceAttribute(String drawLineDistanceValue) {
+		DrawLineDistanceAttribute attr = new DrawLineDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLineDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawLuminanceAttribute</code> , See {@odf.attribute draw:luminance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawLuminanceAttribute() {
+		DrawLuminanceAttribute attr = (DrawLuminanceAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "luminance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawLuminanceAttribute</code> , See {@odf.attribute draw:luminance}
+	 *
+	 * @param drawLuminanceValue   The type is <code>String</code>
+	 */
+	public void setDrawLuminanceAttribute(String drawLuminanceValue) {
+		DrawLuminanceAttribute attr = new DrawLuminanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawLuminanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMarkerEndAttribute</code> , See {@odf.attribute draw:marker-end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMarkerEndAttribute() {
+		DrawMarkerEndAttribute attr = (DrawMarkerEndAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "marker-end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMarkerEndAttribute</code> , See {@odf.attribute draw:marker-end}
+	 *
+	 * @param drawMarkerEndValue   The type is <code>String</code>
+	 */
+	public void setDrawMarkerEndAttribute(String drawMarkerEndValue) {
+		DrawMarkerEndAttribute attr = new DrawMarkerEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMarkerEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMarkerEndCenterAttribute</code> , See {@odf.attribute draw:marker-end-center}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawMarkerEndCenterAttribute() {
+		DrawMarkerEndCenterAttribute attr = (DrawMarkerEndCenterAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "marker-end-center");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMarkerEndCenterAttribute</code> , See {@odf.attribute draw:marker-end-center}
+	 *
+	 * @param drawMarkerEndCenterValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawMarkerEndCenterAttribute(Boolean drawMarkerEndCenterValue) {
+		DrawMarkerEndCenterAttribute attr = new DrawMarkerEndCenterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawMarkerEndCenterValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMarkerEndWidthAttribute</code> , See {@odf.attribute draw:marker-end-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMarkerEndWidthAttribute() {
+		DrawMarkerEndWidthAttribute attr = (DrawMarkerEndWidthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "marker-end-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMarkerEndWidthAttribute</code> , See {@odf.attribute draw:marker-end-width}
+	 *
+	 * @param drawMarkerEndWidthValue   The type is <code>String</code>
+	 */
+	public void setDrawMarkerEndWidthAttribute(String drawMarkerEndWidthValue) {
+		DrawMarkerEndWidthAttribute attr = new DrawMarkerEndWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMarkerEndWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMarkerStartAttribute</code> , See {@odf.attribute draw:marker-start}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMarkerStartAttribute() {
+		DrawMarkerStartAttribute attr = (DrawMarkerStartAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "marker-start");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMarkerStartAttribute</code> , See {@odf.attribute draw:marker-start}
+	 *
+	 * @param drawMarkerStartValue   The type is <code>String</code>
+	 */
+	public void setDrawMarkerStartAttribute(String drawMarkerStartValue) {
+		DrawMarkerStartAttribute attr = new DrawMarkerStartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMarkerStartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMarkerStartCenterAttribute</code> , See {@odf.attribute draw:marker-start-center}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawMarkerStartCenterAttribute() {
+		DrawMarkerStartCenterAttribute attr = (DrawMarkerStartCenterAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "marker-start-center");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMarkerStartCenterAttribute</code> , See {@odf.attribute draw:marker-start-center}
+	 *
+	 * @param drawMarkerStartCenterValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawMarkerStartCenterAttribute(Boolean drawMarkerStartCenterValue) {
+		DrawMarkerStartCenterAttribute attr = new DrawMarkerStartCenterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawMarkerStartCenterValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMarkerStartWidthAttribute</code> , See {@odf.attribute draw:marker-start-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMarkerStartWidthAttribute() {
+		DrawMarkerStartWidthAttribute attr = (DrawMarkerStartWidthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "marker-start-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMarkerStartWidthAttribute</code> , See {@odf.attribute draw:marker-start-width}
+	 *
+	 * @param drawMarkerStartWidthValue   The type is <code>String</code>
+	 */
+	public void setDrawMarkerStartWidthAttribute(String drawMarkerStartWidthValue) {
+		DrawMarkerStartWidthAttribute attr = new DrawMarkerStartWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMarkerStartWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMeasureAlignAttribute</code> , See {@odf.attribute draw:measure-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMeasureAlignAttribute() {
+		DrawMeasureAlignAttribute attr = (DrawMeasureAlignAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "measure-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMeasureAlignAttribute</code> , See {@odf.attribute draw:measure-align}
+	 *
+	 * @param drawMeasureAlignValue   The type is <code>String</code>
+	 */
+	public void setDrawMeasureAlignAttribute(String drawMeasureAlignValue) {
+		DrawMeasureAlignAttribute attr = new DrawMeasureAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMeasureAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawMeasureVerticalAlignAttribute</code> , See {@odf.attribute draw:measure-vertical-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawMeasureVerticalAlignAttribute() {
+		DrawMeasureVerticalAlignAttribute attr = (DrawMeasureVerticalAlignAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "measure-vertical-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawMeasureVerticalAlignAttribute</code> , See {@odf.attribute draw:measure-vertical-align}
+	 *
+	 * @param drawMeasureVerticalAlignValue   The type is <code>String</code>
+	 */
+	public void setDrawMeasureVerticalAlignAttribute(String drawMeasureVerticalAlignValue) {
+		DrawMeasureVerticalAlignAttribute attr = new DrawMeasureVerticalAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawMeasureVerticalAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawOleDrawAspectAttribute</code> , See {@odf.attribute draw:ole-draw-aspect}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawOleDrawAspectAttribute() {
+		DrawOleDrawAspectAttribute attr = (DrawOleDrawAspectAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "ole-draw-aspect");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawOleDrawAspectAttribute</code> , See {@odf.attribute draw:ole-draw-aspect}
+	 *
+	 * @param drawOleDrawAspectValue   The type is <code>Integer</code>
+	 */
+	public void setDrawOleDrawAspectAttribute(Integer drawOleDrawAspectValue) {
+		DrawOleDrawAspectAttribute attr = new DrawOleDrawAspectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(drawOleDrawAspectValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawOpacityAttribute</code> , See {@odf.attribute draw:opacity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawOpacityAttribute() {
+		DrawOpacityAttribute attr = (DrawOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "opacity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawOpacityAttribute</code> , See {@odf.attribute draw:opacity}
+	 *
+	 * @param drawOpacityValue   The type is <code>String</code>
+	 */
+	public void setDrawOpacityAttribute(String drawOpacityValue) {
+		DrawOpacityAttribute attr = new DrawOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawOpacityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawOpacityNameAttribute</code> , See {@odf.attribute draw:opacity-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawOpacityNameAttribute() {
+		DrawOpacityNameAttribute attr = (DrawOpacityNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "opacity-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawOpacityNameAttribute</code> , See {@odf.attribute draw:opacity-name}
+	 *
+	 * @param drawOpacityNameValue   The type is <code>String</code>
+	 */
+	public void setDrawOpacityNameAttribute(String drawOpacityNameValue) {
+		DrawOpacityNameAttribute attr = new DrawOpacityNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawOpacityNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawParallelAttribute</code> , See {@odf.attribute draw:parallel}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawParallelAttribute() {
+		DrawParallelAttribute attr = (DrawParallelAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "parallel");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawParallelAttribute</code> , See {@odf.attribute draw:parallel}
+	 *
+	 * @param drawParallelValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawParallelAttribute(Boolean drawParallelValue) {
+		DrawParallelAttribute attr = new DrawParallelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawParallelValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawPlacingAttribute</code> , See {@odf.attribute draw:placing}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawPlacingAttribute() {
+		DrawPlacingAttribute attr = (DrawPlacingAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "placing");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawPlacingAttribute</code> , See {@odf.attribute draw:placing}
+	 *
+	 * @param drawPlacingValue   The type is <code>String</code>
+	 */
+	public void setDrawPlacingAttribute(String drawPlacingValue) {
+		DrawPlacingAttribute attr = new DrawPlacingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawPlacingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawRedAttribute</code> , See {@odf.attribute draw:red}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawRedAttribute() {
+		DrawRedAttribute attr = (DrawRedAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "red");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawRedAttribute</code> , See {@odf.attribute draw:red}
+	 *
+	 * @param drawRedValue   The type is <code>String</code>
+	 */
+	public void setDrawRedAttribute(String drawRedValue) {
+		DrawRedAttribute attr = new DrawRedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawRedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawSecondaryFillColorAttribute</code> , See {@odf.attribute draw:secondary-fill-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawSecondaryFillColorAttribute() {
+		DrawSecondaryFillColorAttribute attr = (DrawSecondaryFillColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "secondary-fill-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawSecondaryFillColorAttribute</code> , See {@odf.attribute draw:secondary-fill-color}
+	 *
+	 * @param drawSecondaryFillColorValue   The type is <code>String</code>
+	 */
+	public void setDrawSecondaryFillColorAttribute(String drawSecondaryFillColorValue) {
+		DrawSecondaryFillColorAttribute attr = new DrawSecondaryFillColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawSecondaryFillColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShadowAttribute</code> , See {@odf.attribute draw:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShadowAttribute() {
+		DrawShadowAttribute attr = (DrawShadowAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShadowAttribute</code> , See {@odf.attribute draw:shadow}
+	 *
+	 * @param drawShadowValue   The type is <code>String</code>
+	 */
+	public void setDrawShadowAttribute(String drawShadowValue) {
+		DrawShadowAttribute attr = new DrawShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShadowColorAttribute</code> , See {@odf.attribute draw:shadow-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShadowColorAttribute() {
+		DrawShadowColorAttribute attr = (DrawShadowColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shadow-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShadowColorAttribute</code> , See {@odf.attribute draw:shadow-color}
+	 *
+	 * @param drawShadowColorValue   The type is <code>String</code>
+	 */
+	public void setDrawShadowColorAttribute(String drawShadowColorValue) {
+		DrawShadowColorAttribute attr = new DrawShadowColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShadowColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShadowOffsetXAttribute</code> , See {@odf.attribute draw:shadow-offset-x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShadowOffsetXAttribute() {
+		DrawShadowOffsetXAttribute attr = (DrawShadowOffsetXAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shadow-offset-x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShadowOffsetXAttribute</code> , See {@odf.attribute draw:shadow-offset-x}
+	 *
+	 * @param drawShadowOffsetXValue   The type is <code>String</code>
+	 */
+	public void setDrawShadowOffsetXAttribute(String drawShadowOffsetXValue) {
+		DrawShadowOffsetXAttribute attr = new DrawShadowOffsetXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShadowOffsetXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShadowOffsetYAttribute</code> , See {@odf.attribute draw:shadow-offset-y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShadowOffsetYAttribute() {
+		DrawShadowOffsetYAttribute attr = (DrawShadowOffsetYAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shadow-offset-y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShadowOffsetYAttribute</code> , See {@odf.attribute draw:shadow-offset-y}
+	 *
+	 * @param drawShadowOffsetYValue   The type is <code>String</code>
+	 */
+	public void setDrawShadowOffsetYAttribute(String drawShadowOffsetYValue) {
+		DrawShadowOffsetYAttribute attr = new DrawShadowOffsetYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShadowOffsetYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShadowOpacityAttribute</code> , See {@odf.attribute draw:shadow-opacity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawShadowOpacityAttribute() {
+		DrawShadowOpacityAttribute attr = (DrawShadowOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "shadow-opacity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShadowOpacityAttribute</code> , See {@odf.attribute draw:shadow-opacity}
+	 *
+	 * @param drawShadowOpacityValue   The type is <code>String</code>
+	 */
+	public void setDrawShadowOpacityAttribute(String drawShadowOpacityValue) {
+		DrawShadowOpacityAttribute attr = new DrawShadowOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawShadowOpacityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawShowUnitAttribute</code> , See {@odf.attribute draw:show-unit}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getDrawShowUnitAttribute() {
+		DrawShowUnitAttribute attr = (DrawShowUnitAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "show-unit");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawShowUnitAttribute</code> , See {@odf.attribute draw:show-unit}
+	 *
+	 * @param drawShowUnitValue   The type is <code>Boolean</code>
+	 */
+	public void setDrawShowUnitAttribute(Boolean drawShowUnitValue) {
+		DrawShowUnitAttribute attr = new DrawShowUnitAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(drawShowUnitValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartGuideAttribute</code> , See {@odf.attribute draw:start-guide}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartGuideAttribute() {
+		DrawStartGuideAttribute attr = (DrawStartGuideAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-guide");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartGuideAttribute</code> , See {@odf.attribute draw:start-guide}
+	 *
+	 * @param drawStartGuideValue   The type is <code>String</code>
+	 */
+	public void setDrawStartGuideAttribute(String drawStartGuideValue) {
+		DrawStartGuideAttribute attr = new DrawStartGuideAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartGuideValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartLineSpacingHorizontalAttribute</code> , See {@odf.attribute draw:start-line-spacing-horizontal}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartLineSpacingHorizontalAttribute() {
+		DrawStartLineSpacingHorizontalAttribute attr = (DrawStartLineSpacingHorizontalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-line-spacing-horizontal");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartLineSpacingHorizontalAttribute</code> , See {@odf.attribute draw:start-line-spacing-horizontal}
+	 *
+	 * @param drawStartLineSpacingHorizontalValue   The type is <code>String</code>
+	 */
+	public void setDrawStartLineSpacingHorizontalAttribute(String drawStartLineSpacingHorizontalValue) {
+		DrawStartLineSpacingHorizontalAttribute attr = new DrawStartLineSpacingHorizontalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartLineSpacingHorizontalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStartLineSpacingVerticalAttribute</code> , See {@odf.attribute draw:start-line-spacing-vertical}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStartLineSpacingVerticalAttribute() {
+		DrawStartLineSpacingVerticalAttribute attr = (DrawStartLineSpacingVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "start-line-spacing-vertical");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStartLineSpacingVerticalAttribute</code> , See {@odf.attribute draw:start-line-spacing-vertical}
+	 *
+	 * @param drawStartLineSpacingVerticalValue   The type is <code>String</code>
+	 */
+	public void setDrawStartLineSpacingVerticalAttribute(String drawStartLineSpacingVerticalValue) {
+		DrawStartLineSpacingVerticalAttribute attr = new DrawStartLineSpacingVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStartLineSpacingVerticalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStrokeAttribute</code> , See {@odf.attribute draw:stroke}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStrokeAttribute() {
+		DrawStrokeAttribute attr = (DrawStrokeAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "stroke");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStrokeAttribute</code> , See {@odf.attribute draw:stroke}
+	 *
+	 * @param drawStrokeValue   The type is <code>String</code>
+	 */
+	public void setDrawStrokeAttribute(String drawStrokeValue) {
+		DrawStrokeAttribute attr = new DrawStrokeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStrokeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStrokeDashAttribute</code> , See {@odf.attribute draw:stroke-dash}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStrokeDashAttribute() {
+		DrawStrokeDashAttribute attr = (DrawStrokeDashAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "stroke-dash");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStrokeDashAttribute</code> , See {@odf.attribute draw:stroke-dash}
+	 *
+	 * @param drawStrokeDashValue   The type is <code>String</code>
+	 */
+	public void setDrawStrokeDashAttribute(String drawStrokeDashValue) {
+		DrawStrokeDashAttribute attr = new DrawStrokeDashAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStrokeDashValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStrokeDashNamesAttribute</code> , See {@odf.attribute draw:stroke-dash-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStrokeDashNamesAttribute() {
+		DrawStrokeDashNamesAttribute attr = (DrawStrokeDashNamesAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "stroke-dash-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStrokeDashNamesAttribute</code> , See {@odf.attribute draw:stroke-dash-names}
+	 *
+	 * @param drawStrokeDashNamesValue   The type is <code>String</code>
+	 */
+	public void setDrawStrokeDashNamesAttribute(String drawStrokeDashNamesValue) {
+		DrawStrokeDashNamesAttribute attr = new DrawStrokeDashNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStrokeDashNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStrokeLinejoinAttribute</code> , See {@odf.attribute draw:stroke-linejoin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStrokeLinejoinAttribute() {
+		DrawStrokeLinejoinAttribute attr = (DrawStrokeLinejoinAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "stroke-linejoin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStrokeLinejoinAttribute</code> , See {@odf.attribute draw:stroke-linejoin}
+	 *
+	 * @param drawStrokeLinejoinValue   The type is <code>String</code>
+	 */
+	public void setDrawStrokeLinejoinAttribute(String drawStrokeLinejoinValue) {
+		DrawStrokeLinejoinAttribute attr = new DrawStrokeLinejoinAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStrokeLinejoinValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawSymbolColorAttribute</code> , See {@odf.attribute draw:symbol-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawSymbolColorAttribute() {
+		DrawSymbolColorAttribute attr = (DrawSymbolColorAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "symbol-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawSymbolColorAttribute</code> , See {@odf.attribute draw:symbol-color}
+	 *
+	 * @param drawSymbolColorValue   The type is <code>String</code>
+	 */
+	public void setDrawSymbolColorAttribute(String drawSymbolColorValue) {
+		DrawSymbolColorAttribute attr = new DrawSymbolColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawSymbolColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextareaHorizontalAlignAttribute</code> , See {@odf.attribute draw:textarea-horizontal-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextareaHorizontalAlignAttribute() {
+		DrawTextareaHorizontalAlignAttribute attr = (DrawTextareaHorizontalAlignAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "textarea-horizontal-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextareaHorizontalAlignAttribute</code> , See {@odf.attribute draw:textarea-horizontal-align}
+	 *
+	 * @param drawTextareaHorizontalAlignValue   The type is <code>String</code>
+	 */
+	public void setDrawTextareaHorizontalAlignAttribute(String drawTextareaHorizontalAlignValue) {
+		DrawTextareaHorizontalAlignAttribute attr = new DrawTextareaHorizontalAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextareaHorizontalAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTextareaVerticalAlignAttribute</code> , See {@odf.attribute draw:textarea-vertical-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTextareaVerticalAlignAttribute() {
+		DrawTextareaVerticalAlignAttribute attr = (DrawTextareaVerticalAlignAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "textarea-vertical-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTextareaVerticalAlignAttribute</code> , See {@odf.attribute draw:textarea-vertical-align}
+	 *
+	 * @param drawTextareaVerticalAlignValue   The type is <code>String</code>
+	 */
+	public void setDrawTextareaVerticalAlignAttribute(String drawTextareaVerticalAlignValue) {
+		DrawTextareaVerticalAlignAttribute attr = new DrawTextareaVerticalAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTextareaVerticalAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawTileRepeatOffsetAttribute</code> , See {@odf.attribute draw:tile-repeat-offset}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawTileRepeatOffsetAttribute() {
+		DrawTileRepeatOffsetAttribute attr = (DrawTileRepeatOffsetAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "tile-repeat-offset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawTileRepeatOffsetAttribute</code> , See {@odf.attribute draw:tile-repeat-offset}
+	 *
+	 * @param drawTileRepeatOffsetValue   The type is <code>String</code>
+	 */
+	public void setDrawTileRepeatOffsetAttribute(String drawTileRepeatOffsetValue) {
+		DrawTileRepeatOffsetAttribute attr = new DrawTileRepeatOffsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawTileRepeatOffsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawUnitAttribute</code> , See {@odf.attribute draw:unit}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawUnitAttribute() {
+		DrawUnitAttribute attr = (DrawUnitAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "unit");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawUnitAttribute</code> , See {@odf.attribute draw:unit}
+	 *
+	 * @param drawUnitValue   The type is <code>String</code>
+	 */
+	public void setDrawUnitAttribute(String drawUnitValue) {
+		DrawUnitAttribute attr = new DrawUnitAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawUnitValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawVisibleAreaHeightAttribute</code> , See {@odf.attribute draw:visible-area-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawVisibleAreaHeightAttribute() {
+		DrawVisibleAreaHeightAttribute attr = (DrawVisibleAreaHeightAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "visible-area-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawVisibleAreaHeightAttribute</code> , See {@odf.attribute draw:visible-area-height}
+	 *
+	 * @param drawVisibleAreaHeightValue   The type is <code>String</code>
+	 */
+	public void setDrawVisibleAreaHeightAttribute(String drawVisibleAreaHeightValue) {
+		DrawVisibleAreaHeightAttribute attr = new DrawVisibleAreaHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawVisibleAreaHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawVisibleAreaLeftAttribute</code> , See {@odf.attribute draw:visible-area-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawVisibleAreaLeftAttribute() {
+		DrawVisibleAreaLeftAttribute attr = (DrawVisibleAreaLeftAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "visible-area-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawVisibleAreaLeftAttribute</code> , See {@odf.attribute draw:visible-area-left}
+	 *
+	 * @param drawVisibleAreaLeftValue   The type is <code>String</code>
+	 */
+	public void setDrawVisibleAreaLeftAttribute(String drawVisibleAreaLeftValue) {
+		DrawVisibleAreaLeftAttribute attr = new DrawVisibleAreaLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawVisibleAreaLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawVisibleAreaTopAttribute</code> , See {@odf.attribute draw:visible-area-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawVisibleAreaTopAttribute() {
+		DrawVisibleAreaTopAttribute attr = (DrawVisibleAreaTopAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "visible-area-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawVisibleAreaTopAttribute</code> , See {@odf.attribute draw:visible-area-top}
+	 *
+	 * @param drawVisibleAreaTopValue   The type is <code>String</code>
+	 */
+	public void setDrawVisibleAreaTopAttribute(String drawVisibleAreaTopValue) {
+		DrawVisibleAreaTopAttribute attr = new DrawVisibleAreaTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawVisibleAreaTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawVisibleAreaWidthAttribute</code> , See {@odf.attribute draw:visible-area-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawVisibleAreaWidthAttribute() {
+		DrawVisibleAreaWidthAttribute attr = (DrawVisibleAreaWidthAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "visible-area-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawVisibleAreaWidthAttribute</code> , See {@odf.attribute draw:visible-area-width}
+	 *
+	 * @param drawVisibleAreaWidthValue   The type is <code>String</code>
+	 */
+	public void setDrawVisibleAreaWidthAttribute(String drawVisibleAreaWidthValue) {
+		DrawVisibleAreaWidthAttribute attr = new DrawVisibleAreaWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawVisibleAreaWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawWrapInfluenceOnPositionAttribute</code> , See {@odf.attribute draw:wrap-influence-on-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawWrapInfluenceOnPositionAttribute() {
+		DrawWrapInfluenceOnPositionAttribute attr = (DrawWrapInfluenceOnPositionAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "wrap-influence-on-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawWrapInfluenceOnPositionAttribute</code> , See {@odf.attribute draw:wrap-influence-on-position}
+	 *
+	 * @param drawWrapInfluenceOnPositionValue   The type is <code>String</code>
+	 */
+	public void setDrawWrapInfluenceOnPositionAttribute(String drawWrapInfluenceOnPositionValue) {
+		DrawWrapInfluenceOnPositionAttribute attr = new DrawWrapInfluenceOnPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawWrapInfluenceOnPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderAttribute() {
+		FoBorderAttribute attr = (FoBorderAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @param foBorderValue   The type is <code>String</code>
+	 */
+	public void setFoBorderAttribute(String foBorderValue) {
+		FoBorderAttribute attr = new FoBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderBottomAttribute() {
+		FoBorderBottomAttribute attr = (FoBorderBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @param foBorderBottomValue   The type is <code>String</code>
+	 */
+	public void setFoBorderBottomAttribute(String foBorderBottomValue) {
+		FoBorderBottomAttribute attr = new FoBorderBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderLeftAttribute() {
+		FoBorderLeftAttribute attr = (FoBorderLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @param foBorderLeftValue   The type is <code>String</code>
+	 */
+	public void setFoBorderLeftAttribute(String foBorderLeftValue) {
+		FoBorderLeftAttribute attr = new FoBorderLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderRightAttribute() {
+		FoBorderRightAttribute attr = (FoBorderRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @param foBorderRightValue   The type is <code>String</code>
+	 */
+	public void setFoBorderRightAttribute(String foBorderRightValue) {
+		FoBorderRightAttribute attr = new FoBorderRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderTopAttribute() {
+		FoBorderTopAttribute attr = (FoBorderTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @param foBorderTopValue   The type is <code>String</code>
+	 */
+	public void setFoBorderTopAttribute(String foBorderTopValue) {
+		FoBorderTopAttribute attr = new FoBorderTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoClipAttribute</code> , See {@odf.attribute fo:clip}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoClipAttribute() {
+		FoClipAttribute attr = (FoClipAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "clip");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoClipAttribute</code> , See {@odf.attribute fo:clip}
+	 *
+	 * @param foClipValue   The type is <code>String</code>
+	 */
+	public void setFoClipAttribute(String foClipValue) {
+		FoClipAttribute attr = new FoClipAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foClipValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginAttribute() {
+		FoMarginAttribute attr = (FoMarginAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @param foMarginValue   The type is <code>String</code>
+	 */
+	public void setFoMarginAttribute(String foMarginValue) {
+		FoMarginAttribute attr = new FoMarginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginBottomAttribute() {
+		FoMarginBottomAttribute attr = (FoMarginBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @param foMarginBottomValue   The type is <code>String</code>
+	 */
+	public void setFoMarginBottomAttribute(String foMarginBottomValue) {
+		FoMarginBottomAttribute attr = new FoMarginBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginRightAttribute() {
+		FoMarginRightAttribute attr = (FoMarginRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @param foMarginRightValue   The type is <code>String</code>
+	 */
+	public void setFoMarginRightAttribute(String foMarginRightValue) {
+		FoMarginRightAttribute attr = new FoMarginRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginTopAttribute() {
+		FoMarginTopAttribute attr = (FoMarginTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @param foMarginTopValue   The type is <code>String</code>
+	 */
+	public void setFoMarginTopAttribute(String foMarginTopValue) {
+		FoMarginTopAttribute attr = new FoMarginTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMaxHeightAttribute</code> , See {@odf.attribute fo:max-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMaxHeightAttribute() {
+		FoMaxHeightAttribute attr = (FoMaxHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "max-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMaxHeightAttribute</code> , See {@odf.attribute fo:max-height}
+	 *
+	 * @param foMaxHeightValue   The type is <code>String</code>
+	 */
+	public void setFoMaxHeightAttribute(String foMaxHeightValue) {
+		FoMaxHeightAttribute attr = new FoMaxHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMaxHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMaxWidthAttribute</code> , See {@odf.attribute fo:max-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMaxWidthAttribute() {
+		FoMaxWidthAttribute attr = (FoMaxWidthAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "max-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMaxWidthAttribute</code> , See {@odf.attribute fo:max-width}
+	 *
+	 * @param foMaxWidthValue   The type is <code>String</code>
+	 */
+	public void setFoMaxWidthAttribute(String foMaxWidthValue) {
+		FoMaxWidthAttribute attr = new FoMaxWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMaxWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMinHeightAttribute</code> , See {@odf.attribute fo:min-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMinHeightAttribute() {
+		FoMinHeightAttribute attr = (FoMinHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "min-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMinHeightAttribute</code> , See {@odf.attribute fo:min-height}
+	 *
+	 * @param foMinHeightValue   The type is <code>String</code>
+	 */
+	public void setFoMinHeightAttribute(String foMinHeightValue) {
+		FoMinHeightAttribute attr = new FoMinHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMinHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMinWidthAttribute</code> , See {@odf.attribute fo:min-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMinWidthAttribute() {
+		FoMinWidthAttribute attr = (FoMinWidthAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "min-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMinWidthAttribute</code> , See {@odf.attribute fo:min-width}
+	 *
+	 * @param foMinWidthValue   The type is <code>String</code>
+	 */
+	public void setFoMinWidthAttribute(String foMinWidthValue) {
+		FoMinWidthAttribute attr = new FoMinWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMinWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingAttribute() {
+		FoPaddingAttribute attr = (FoPaddingAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @param foPaddingValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingAttribute(String foPaddingValue) {
+		FoPaddingAttribute attr = new FoPaddingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingBottomAttribute() {
+		FoPaddingBottomAttribute attr = (FoPaddingBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @param foPaddingBottomValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingBottomAttribute(String foPaddingBottomValue) {
+		FoPaddingBottomAttribute attr = new FoPaddingBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingLeftAttribute() {
+		FoPaddingLeftAttribute attr = (FoPaddingLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @param foPaddingLeftValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingLeftAttribute(String foPaddingLeftValue) {
+		FoPaddingLeftAttribute attr = new FoPaddingLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingRightAttribute() {
+		FoPaddingRightAttribute attr = (FoPaddingRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @param foPaddingRightValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingRightAttribute(String foPaddingRightValue) {
+		FoPaddingRightAttribute attr = new FoPaddingRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingTopAttribute() {
+		FoPaddingTopAttribute attr = (FoPaddingTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @param foPaddingTopValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingTopAttribute(String foPaddingTopValue) {
+		FoPaddingTopAttribute attr = new FoPaddingTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoWrapOptionAttribute</code> , See {@odf.attribute fo:wrap-option}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoWrapOptionAttribute() {
+		FoWrapOptionAttribute attr = (FoWrapOptionAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "wrap-option");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoWrapOptionAttribute</code> , See {@odf.attribute fo:wrap-option}
+	 *
+	 * @param foWrapOptionValue   The type is <code>String</code>
+	 */
+	public void setFoWrapOptionAttribute(String foWrapOptionValue) {
+		FoWrapOptionAttribute attr = new FoWrapOptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foWrapOptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBackgroundTransparencyAttribute</code> , See {@odf.attribute style:background-transparency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBackgroundTransparencyAttribute() {
+		StyleBackgroundTransparencyAttribute attr = (StyleBackgroundTransparencyAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "background-transparency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBackgroundTransparencyAttribute</code> , See {@odf.attribute style:background-transparency}
+	 *
+	 * @param styleBackgroundTransparencyValue   The type is <code>String</code>
+	 */
+	public void setStyleBackgroundTransparencyAttribute(String styleBackgroundTransparencyValue) {
+		StyleBackgroundTransparencyAttribute attr = new StyleBackgroundTransparencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBackgroundTransparencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthAttribute() {
+		StyleBorderLineWidthAttribute attr = (StyleBorderLineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @param styleBorderLineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthAttribute(String styleBorderLineWidthValue) {
+		StyleBorderLineWidthAttribute attr = new StyleBorderLineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthBottomAttribute() {
+		StyleBorderLineWidthBottomAttribute attr = (StyleBorderLineWidthBottomAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @param styleBorderLineWidthBottomValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthBottomAttribute(String styleBorderLineWidthBottomValue) {
+		StyleBorderLineWidthBottomAttribute attr = new StyleBorderLineWidthBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthLeftAttribute() {
+		StyleBorderLineWidthLeftAttribute attr = (StyleBorderLineWidthLeftAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @param styleBorderLineWidthLeftValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthLeftAttribute(String styleBorderLineWidthLeftValue) {
+		StyleBorderLineWidthLeftAttribute attr = new StyleBorderLineWidthLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthRightAttribute() {
+		StyleBorderLineWidthRightAttribute attr = (StyleBorderLineWidthRightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @param styleBorderLineWidthRightValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthRightAttribute(String styleBorderLineWidthRightValue) {
+		StyleBorderLineWidthRightAttribute attr = new StyleBorderLineWidthRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthTopAttribute() {
+		StyleBorderLineWidthTopAttribute attr = (StyleBorderLineWidthTopAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @param styleBorderLineWidthTopValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthTopAttribute(String styleBorderLineWidthTopValue) {
+		StyleBorderLineWidthTopAttribute attr = new StyleBorderLineWidthTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleEditableAttribute</code> , See {@odf.attribute style:editable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleEditableAttribute() {
+		StyleEditableAttribute attr = (StyleEditableAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "editable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleEditableAttribute</code> , See {@odf.attribute style:editable}
+	 *
+	 * @param styleEditableValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleEditableAttribute(Boolean styleEditableValue) {
+		StyleEditableAttribute attr = new StyleEditableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleEditableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFlowWithTextAttribute</code> , See {@odf.attribute style:flow-with-text}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleFlowWithTextAttribute() {
+		StyleFlowWithTextAttribute attr = (StyleFlowWithTextAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "flow-with-text");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFlowWithTextAttribute</code> , See {@odf.attribute style:flow-with-text}
+	 *
+	 * @param styleFlowWithTextValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleFlowWithTextAttribute(Boolean styleFlowWithTextValue) {
+		StyleFlowWithTextAttribute attr = new StyleFlowWithTextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleFlowWithTextValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleHorizontalPosAttribute</code> , See {@odf.attribute style:horizontal-pos}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleHorizontalPosAttribute() {
+		StyleHorizontalPosAttribute attr = (StyleHorizontalPosAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "horizontal-pos");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleHorizontalPosAttribute</code> , See {@odf.attribute style:horizontal-pos}
+	 *
+	 * @param styleHorizontalPosValue   The type is <code>String</code>
+	 */
+	public void setStyleHorizontalPosAttribute(String styleHorizontalPosValue) {
+		StyleHorizontalPosAttribute attr = new StyleHorizontalPosAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleHorizontalPosValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleHorizontalRelAttribute</code> , See {@odf.attribute style:horizontal-rel}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleHorizontalRelAttribute() {
+		StyleHorizontalRelAttribute attr = (StyleHorizontalRelAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "horizontal-rel");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleHorizontalRelAttribute</code> , See {@odf.attribute style:horizontal-rel}
+	 *
+	 * @param styleHorizontalRelValue   The type is <code>String</code>
+	 */
+	public void setStyleHorizontalRelAttribute(String styleHorizontalRelValue) {
+		StyleHorizontalRelAttribute attr = new StyleHorizontalRelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleHorizontalRelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleMirrorAttribute</code> , See {@odf.attribute style:mirror}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleMirrorAttribute() {
+		StyleMirrorAttribute attr = (StyleMirrorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "mirror");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleMirrorAttribute</code> , See {@odf.attribute style:mirror}
+	 *
+	 * @param styleMirrorValue   The type is <code>String</code>
+	 */
+	public void setStyleMirrorAttribute(String styleMirrorValue) {
+		StyleMirrorAttribute attr = new StyleMirrorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleMirrorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumberWrappedParagraphsAttribute</code> , See {@odf.attribute style:number-wrapped-paragraphs}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleNumberWrappedParagraphsAttribute() {
+		StyleNumberWrappedParagraphsAttribute attr = (StyleNumberWrappedParagraphsAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "number-wrapped-paragraphs");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumberWrappedParagraphsAttribute</code> , See {@odf.attribute style:number-wrapped-paragraphs}
+	 *
+	 * @param styleNumberWrappedParagraphsValue   The type is <code>Integer</code>
+	 */
+	public void setStyleNumberWrappedParagraphsAttribute(Integer styleNumberWrappedParagraphsValue) {
+		StyleNumberWrappedParagraphsAttribute attr = new StyleNumberWrappedParagraphsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleNumberWrappedParagraphsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleOverflowBehaviorAttribute</code> , See {@odf.attribute style:overflow-behavior}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleOverflowBehaviorAttribute() {
+		StyleOverflowBehaviorAttribute attr = (StyleOverflowBehaviorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "overflow-behavior");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleOverflowBehaviorAttribute</code> , See {@odf.attribute style:overflow-behavior}
+	 *
+	 * @param styleOverflowBehaviorValue   The type is <code>String</code>
+	 */
+	public void setStyleOverflowBehaviorAttribute(String styleOverflowBehaviorValue) {
+		StyleOverflowBehaviorAttribute attr = new StyleOverflowBehaviorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleOverflowBehaviorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePrintContentAttribute</code> , See {@odf.attribute style:print-content}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStylePrintContentAttribute() {
+		StylePrintContentAttribute attr = (StylePrintContentAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "print-content");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePrintContentAttribute</code> , See {@odf.attribute style:print-content}
+	 *
+	 * @param stylePrintContentValue   The type is <code>Boolean</code>
+	 */
+	public void setStylePrintContentAttribute(Boolean stylePrintContentValue) {
+		StylePrintContentAttribute attr = new StylePrintContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(stylePrintContentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleProtectAttribute</code> , See {@odf.attribute style:protect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleProtectAttribute() {
+		StyleProtectAttribute attr = (StyleProtectAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "protect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleProtectAttribute</code> , See {@odf.attribute style:protect}
+	 *
+	 * @param styleProtectValue   The type is <code>String</code>
+	 */
+	public void setStyleProtectAttribute(String styleProtectValue) {
+		StyleProtectAttribute attr = new StyleProtectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleProtectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelHeightAttribute</code> , See {@odf.attribute style:rel-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelHeightAttribute() {
+		StyleRelHeightAttribute attr = (StyleRelHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelHeightAttribute</code> , See {@odf.attribute style:rel-height}
+	 *
+	 * @param styleRelHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleRelHeightAttribute(String styleRelHeightValue) {
+		StyleRelHeightAttribute attr = new StyleRelHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelWidthAttribute() {
+		StyleRelWidthAttribute attr = (StyleRelWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @param styleRelWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleRelWidthAttribute(String styleRelWidthValue) {
+		StyleRelWidthAttribute attr = new StyleRelWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRepeatAttribute</code> , See {@odf.attribute style:repeat}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRepeatAttribute() {
+		StyleRepeatAttribute attr = (StyleRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "repeat");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRepeatAttribute</code> , See {@odf.attribute style:repeat}
+	 *
+	 * @param styleRepeatValue   The type is <code>String</code>
+	 */
+	public void setStyleRepeatAttribute(String styleRepeatValue) {
+		StyleRepeatAttribute attr = new StyleRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRepeatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRunThroughAttribute</code> , See {@odf.attribute style:run-through}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRunThroughAttribute() {
+		StyleRunThroughAttribute attr = (StyleRunThroughAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "run-through");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRunThroughAttribute</code> , See {@odf.attribute style:run-through}
+	 *
+	 * @param styleRunThroughValue   The type is <code>String</code>
+	 */
+	public void setStyleRunThroughAttribute(String styleRunThroughValue) {
+		StyleRunThroughAttribute attr = new StyleRunThroughAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRunThroughValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleShadowAttribute() {
+		StyleShadowAttribute attr = (StyleShadowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @param styleShadowValue   The type is <code>String</code>
+	 */
+	public void setStyleShadowAttribute(String styleShadowValue) {
+		StyleShadowAttribute attr = new StyleShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShrinkToFitAttribute</code> , See {@odf.attribute style:shrink-to-fit}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleShrinkToFitAttribute() {
+		StyleShrinkToFitAttribute attr = (StyleShrinkToFitAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shrink-to-fit");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShrinkToFitAttribute</code> , See {@odf.attribute style:shrink-to-fit}
+	 *
+	 * @param styleShrinkToFitValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleShrinkToFitAttribute(Boolean styleShrinkToFitValue) {
+		StyleShrinkToFitAttribute attr = new StyleShrinkToFitAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleShrinkToFitValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalPosAttribute</code> , See {@odf.attribute style:vertical-pos}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalPosAttribute() {
+		StyleVerticalPosAttribute attr = (StyleVerticalPosAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-pos");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalPosAttribute</code> , See {@odf.attribute style:vertical-pos}
+	 *
+	 * @param styleVerticalPosValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalPosAttribute(String styleVerticalPosValue) {
+		StyleVerticalPosAttribute attr = new StyleVerticalPosAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalPosValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalRelAttribute</code> , See {@odf.attribute style:vertical-rel}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalRelAttribute() {
+		StyleVerticalRelAttribute attr = (StyleVerticalRelAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-rel");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalRelAttribute</code> , See {@odf.attribute style:vertical-rel}
+	 *
+	 * @param styleVerticalRelValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalRelAttribute(String styleVerticalRelValue) {
+		StyleVerticalRelAttribute attr = new StyleVerticalRelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalRelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWrapAttribute</code> , See {@odf.attribute style:wrap}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWrapAttribute() {
+		StyleWrapAttribute attr = (StyleWrapAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "wrap");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWrapAttribute</code> , See {@odf.attribute style:wrap}
+	 *
+	 * @param styleWrapValue   The type is <code>String</code>
+	 */
+	public void setStyleWrapAttribute(String styleWrapValue) {
+		StyleWrapAttribute attr = new StyleWrapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWrapValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWrapContourAttribute</code> , See {@odf.attribute style:wrap-contour}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleWrapContourAttribute() {
+		StyleWrapContourAttribute attr = (StyleWrapContourAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "wrap-contour");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWrapContourAttribute</code> , See {@odf.attribute style:wrap-contour}
+	 *
+	 * @param styleWrapContourValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleWrapContourAttribute(Boolean styleWrapContourValue) {
+		StyleWrapContourAttribute attr = new StyleWrapContourAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleWrapContourValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWrapContourModeAttribute</code> , See {@odf.attribute style:wrap-contour-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWrapContourModeAttribute() {
+		StyleWrapContourModeAttribute attr = (StyleWrapContourModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "wrap-contour-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWrapContourModeAttribute</code> , See {@odf.attribute style:wrap-contour-mode}
+	 *
+	 * @param styleWrapContourModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWrapContourModeAttribute(String styleWrapContourModeValue) {
+		StyleWrapContourModeAttribute attr = new StyleWrapContourModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWrapContourModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWrapDynamicThresholdAttribute</code> , See {@odf.attribute style:wrap-dynamic-threshold}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWrapDynamicThresholdAttribute() {
+		StyleWrapDynamicThresholdAttribute attr = (StyleWrapDynamicThresholdAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "wrap-dynamic-threshold");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWrapDynamicThresholdAttribute</code> , See {@odf.attribute style:wrap-dynamic-threshold}
+	 *
+	 * @param styleWrapDynamicThresholdValue   The type is <code>String</code>
+	 */
+	public void setStyleWrapDynamicThresholdAttribute(String styleWrapDynamicThresholdValue) {
+		StyleWrapDynamicThresholdAttribute attr = new StyleWrapDynamicThresholdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWrapDynamicThresholdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWritingModeAttribute() {
+		StyleWritingModeAttribute attr = (StyleWritingModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @param styleWritingModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWritingModeAttribute(String styleWritingModeValue) {
+		StyleWritingModeAttribute attr = new StyleWritingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWritingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFillRuleAttribute</code> , See {@odf.attribute svg:fill-rule}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFillRuleAttribute() {
+		SvgFillRuleAttribute attr = (SvgFillRuleAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "fill-rule");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFillRuleAttribute</code> , See {@odf.attribute svg:fill-rule}
+	 *
+	 * @param svgFillRuleValue   The type is <code>String</code>
+	 */
+	public void setSvgFillRuleAttribute(String svgFillRuleValue) {
+		SvgFillRuleAttribute attr = new SvgFillRuleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFillRuleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStrokeColorAttribute</code> , See {@odf.attribute svg:stroke-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgStrokeColorAttribute() {
+		SvgStrokeColorAttribute attr = (SvgStrokeColorAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stroke-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStrokeColorAttribute</code> , See {@odf.attribute svg:stroke-color}
+	 *
+	 * @param svgStrokeColorValue   The type is <code>String</code>
+	 */
+	public void setSvgStrokeColorAttribute(String svgStrokeColorValue) {
+		SvgStrokeColorAttribute attr = new SvgStrokeColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgStrokeColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStrokeLinecapAttribute</code> , See {@odf.attribute svg:stroke-linecap}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgStrokeLinecapAttribute() {
+		SvgStrokeLinecapAttribute attr = (SvgStrokeLinecapAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stroke-linecap");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStrokeLinecapAttribute</code> , See {@odf.attribute svg:stroke-linecap}
+	 *
+	 * @param svgStrokeLinecapValue   The type is <code>String</code>
+	 */
+	public void setSvgStrokeLinecapAttribute(String svgStrokeLinecapValue) {
+		SvgStrokeLinecapAttribute attr = new SvgStrokeLinecapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgStrokeLinecapValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStrokeOpacityAttribute</code> , See {@odf.attribute svg:stroke-opacity}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgStrokeOpacityAttribute() {
+		SvgStrokeOpacityAttribute attr = (SvgStrokeOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stroke-opacity");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStrokeOpacityAttribute</code> , See {@odf.attribute svg:stroke-opacity}
+	 *
+	 * @param svgStrokeOpacityValue   The type is <code>String</code>
+	 */
+	public void setSvgStrokeOpacityAttribute(String svgStrokeOpacityValue) {
+		SvgStrokeOpacityAttribute attr = new SvgStrokeOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgStrokeOpacityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStrokeWidthAttribute</code> , See {@odf.attribute svg:stroke-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgStrokeWidthAttribute() {
+		SvgStrokeWidthAttribute attr = (SvgStrokeWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stroke-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStrokeWidthAttribute</code> , See {@odf.attribute svg:stroke-width}
+	 *
+	 * @param svgStrokeWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgStrokeWidthAttribute(String svgStrokeWidthValue) {
+		SvgStrokeWidthAttribute attr = new SvgStrokeWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgStrokeWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgWidthAttribute() {
+		SvgWidthAttribute attr = (SvgWidthAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgWidthAttribute</code> , See {@odf.attribute svg:width}
+	 *
+	 * @param svgWidthValue   The type is <code>String</code>
+	 */
+	public void setSvgWidthAttribute(String svgWidthValue) {
+		SvgWidthAttribute attr = new SvgWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgXAttribute() {
+		SvgXAttribute attr = (SvgXAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgXAttribute</code> , See {@odf.attribute svg:x}
+	 *
+	 * @param svgXValue   The type is <code>String</code>
+	 */
+	public void setSvgXAttribute(String svgXValue) {
+		SvgXAttribute attr = new SvgXAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgXValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnchorPageNumberAttribute</code> , See {@odf.attribute text:anchor-page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextAnchorPageNumberAttribute() {
+		TextAnchorPageNumberAttribute attr = (TextAnchorPageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "anchor-page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnchorPageNumberAttribute</code> , See {@odf.attribute text:anchor-page-number}
+	 *
+	 * @param textAnchorPageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTextAnchorPageNumberAttribute(Integer textAnchorPageNumberValue) {
+		TextAnchorPageNumberAttribute attr = new TextAnchorPageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textAnchorPageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnchorTypeAttribute</code> , See {@odf.attribute text:anchor-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnchorTypeAttribute() {
+		TextAnchorTypeAttribute attr = (TextAnchorTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "anchor-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnchorTypeAttribute</code> , See {@odf.attribute text:anchor-type}
+	 *
+	 * @param textAnchorTypeValue   The type is <code>String</code>
+	 */
+	public void setTextAnchorTypeAttribute(String textAnchorTypeValue) {
+		TextAnchorTypeAttribute attr = new TextAnchorTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnchorTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationAttribute</code> , See {@odf.attribute text:animation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnimationAttribute() {
+		TextAnimationAttribute attr = (TextAnimationAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationAttribute</code> , See {@odf.attribute text:animation}
+	 *
+	 * @param textAnimationValue   The type is <code>String</code>
+	 */
+	public void setTextAnimationAttribute(String textAnimationValue) {
+		TextAnimationAttribute attr = new TextAnimationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnimationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationDelayAttribute</code> , See {@odf.attribute text:animation-delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnimationDelayAttribute() {
+		TextAnimationDelayAttribute attr = (TextAnimationDelayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation-delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationDelayAttribute</code> , See {@odf.attribute text:animation-delay}
+	 *
+	 * @param textAnimationDelayValue   The type is <code>String</code>
+	 */
+	public void setTextAnimationDelayAttribute(String textAnimationDelayValue) {
+		TextAnimationDelayAttribute attr = new TextAnimationDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnimationDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationDirectionAttribute</code> , See {@odf.attribute text:animation-direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnimationDirectionAttribute() {
+		TextAnimationDirectionAttribute attr = (TextAnimationDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation-direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationDirectionAttribute</code> , See {@odf.attribute text:animation-direction}
+	 *
+	 * @param textAnimationDirectionValue   The type is <code>String</code>
+	 */
+	public void setTextAnimationDirectionAttribute(String textAnimationDirectionValue) {
+		TextAnimationDirectionAttribute attr = new TextAnimationDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnimationDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationRepeatAttribute</code> , See {@odf.attribute text:animation-repeat}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextAnimationRepeatAttribute() {
+		TextAnimationRepeatAttribute attr = (TextAnimationRepeatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation-repeat");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationRepeatAttribute</code> , See {@odf.attribute text:animation-repeat}
+	 *
+	 * @param textAnimationRepeatValue   The type is <code>Integer</code>
+	 */
+	public void setTextAnimationRepeatAttribute(Integer textAnimationRepeatValue) {
+		TextAnimationRepeatAttribute attr = new TextAnimationRepeatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textAnimationRepeatValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationStartInsideAttribute</code> , See {@odf.attribute text:animation-start-inside}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextAnimationStartInsideAttribute() {
+		TextAnimationStartInsideAttribute attr = (TextAnimationStartInsideAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation-start-inside");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationStartInsideAttribute</code> , See {@odf.attribute text:animation-start-inside}
+	 *
+	 * @param textAnimationStartInsideValue   The type is <code>Boolean</code>
+	 */
+	public void setTextAnimationStartInsideAttribute(Boolean textAnimationStartInsideValue) {
+		TextAnimationStartInsideAttribute attr = new TextAnimationStartInsideAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textAnimationStartInsideValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationStepsAttribute</code> , See {@odf.attribute text:animation-steps}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnimationStepsAttribute() {
+		TextAnimationStepsAttribute attr = (TextAnimationStepsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation-steps");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationStepsAttribute</code> , See {@odf.attribute text:animation-steps}
+	 *
+	 * @param textAnimationStepsValue   The type is <code>String</code>
+	 */
+	public void setTextAnimationStepsAttribute(String textAnimationStepsValue) {
+		TextAnimationStepsAttribute attr = new TextAnimationStepsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnimationStepsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnimationStopInsideAttribute</code> , See {@odf.attribute text:animation-stop-inside}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextAnimationStopInsideAttribute() {
+		TextAnimationStopInsideAttribute attr = (TextAnimationStopInsideAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "animation-stop-inside");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnimationStopInsideAttribute</code> , See {@odf.attribute text:animation-stop-inside}
+	 *
+	 * @param textAnimationStopInsideValue   The type is <code>Boolean</code>
+	 */
+	public void setTextAnimationStopInsideAttribute(Boolean textAnimationStopInsideValue) {
+		TextAnimationStopInsideAttribute attr = new TextAnimationStopInsideAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textAnimationStopInsideValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	/**
+	 * Create child element {@odf.element style:columns}.
+	 *
+	 * @param foColumnCountValue  the <code>Integer</code> value of <code>FoColumnCountAttribute</code>, see {@odf.attribute  fo:column-count} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:columns}
+	 */
+	 public StyleColumnsElement newStyleColumnsElement(int foColumnCountValue) {
+		StyleColumnsElement styleColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleColumnsElement.class);
+		styleColumns.setFoColumnCountAttribute(foColumnCountValue);
+		this.appendChild(styleColumns);
+		return styleColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-style}.
+	 *
+	 * @param styleNameValue  the <code>String</code> value of <code>StyleNameAttribute</code>, see {@odf.attribute  style:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:list-style}
+	 */
+	 public TextListStyleElement newTextListStyleElement(String styleNameValue) {
+		TextListStyleElement textListStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListStyleElement.class);
+		textListStyle.setStyleNameAttribute(styleNameValue);
+		this.appendChild(textListStyle);
+		return textListStyle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHandoutMasterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHandoutMasterElement.java
new file mode 100644
index 0000000..f9ed001
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHandoutMasterElement.java
@@ -0,0 +1,483 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationPresentationPageLayoutNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseDateTimeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseFooterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationUseHeaderNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageLayoutNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:handout-master}.
+ *
+ */
+public class StyleHandoutMasterElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "handout-master");
+
+	/**
+	 * Create the instance of <code>StyleHandoutMasterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleHandoutMasterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.DrawingPage, OdfName.newName(OdfDocumentNamespace.STYLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:handout-master}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationPresentationPageLayoutNameAttribute</code> , See {@odf.attribute presentation:presentation-page-layout-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationPresentationPageLayoutNameAttribute() {
+		PresentationPresentationPageLayoutNameAttribute attr = (PresentationPresentationPageLayoutNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "presentation-page-layout-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationPresentationPageLayoutNameAttribute</code> , See {@odf.attribute presentation:presentation-page-layout-name}
+	 *
+	 * @param presentationPresentationPageLayoutNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationPresentationPageLayoutNameAttribute(String presentationPresentationPageLayoutNameValue) {
+		PresentationPresentationPageLayoutNameAttribute attr = new PresentationPresentationPageLayoutNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationPresentationPageLayoutNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseDateTimeNameAttribute</code> , See {@odf.attribute presentation:use-date-time-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseDateTimeNameAttribute() {
+		PresentationUseDateTimeNameAttribute attr = (PresentationUseDateTimeNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-date-time-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseDateTimeNameAttribute</code> , See {@odf.attribute presentation:use-date-time-name}
+	 *
+	 * @param presentationUseDateTimeNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseDateTimeNameAttribute(String presentationUseDateTimeNameValue) {
+		PresentationUseDateTimeNameAttribute attr = new PresentationUseDateTimeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseDateTimeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseFooterNameAttribute</code> , See {@odf.attribute presentation:use-footer-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseFooterNameAttribute() {
+		PresentationUseFooterNameAttribute attr = (PresentationUseFooterNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-footer-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseFooterNameAttribute</code> , See {@odf.attribute presentation:use-footer-name}
+	 *
+	 * @param presentationUseFooterNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseFooterNameAttribute(String presentationUseFooterNameValue) {
+		PresentationUseFooterNameAttribute attr = new PresentationUseFooterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseFooterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PresentationUseHeaderNameAttribute</code> , See {@odf.attribute presentation:use-header-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getPresentationUseHeaderNameAttribute() {
+		PresentationUseHeaderNameAttribute attr = (PresentationUseHeaderNameAttribute) getOdfAttribute(OdfDocumentNamespace.PRESENTATION, "use-header-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PresentationUseHeaderNameAttribute</code> , See {@odf.attribute presentation:use-header-name}
+	 *
+	 * @param presentationUseHeaderNameValue   The type is <code>String</code>
+	 */
+	public void setPresentationUseHeaderNameAttribute(String presentationUseHeaderNameValue) {
+		PresentationUseHeaderNameAttribute attr = new PresentationUseHeaderNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(presentationUseHeaderNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePageLayoutNameAttribute</code> , See {@odf.attribute style:page-layout-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePageLayoutNameAttribute() {
+		StylePageLayoutNameAttribute attr = (StylePageLayoutNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "page-layout-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePageLayoutNameAttribute</code> , See {@odf.attribute style:page-layout-name}
+	 *
+	 * @param stylePageLayoutNameValue   The type is <code>String</code>
+	 */
+	public void setStylePageLayoutNameAttribute(String stylePageLayoutNameValue) {
+		StylePageLayoutNameAttribute attr = new StylePageLayoutNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePageLayoutNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderElement.java
new file mode 100644
index 0000000..63673e0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:header}.
+ *
+ */
+public class StyleHeaderElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "header");
+
+	/**
+	 * Create the instance of <code>StyleHeaderElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleHeaderElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:header}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleDisplayAttribute() {
+		StyleDisplayAttribute attr = (StyleDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(StyleDisplayAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @param styleDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleDisplayAttribute(Boolean styleDisplayValue) {
+		StyleDisplayAttribute attr = new StyleDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-center}.
+	 *
+	 * @return the element {@odf.element style:region-center}
+	 */
+	public StyleRegionCenterElement newStyleRegionCenterElement() {
+		StyleRegionCenterElement styleRegionCenter = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionCenterElement.class);
+		this.appendChild(styleRegionCenter);
+		return styleRegionCenter;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-left}.
+	 *
+	 * @return the element {@odf.element style:region-left}
+	 */
+	public StyleRegionLeftElement newStyleRegionLeftElement() {
+		StyleRegionLeftElement styleRegionLeft = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionLeftElement.class);
+		this.appendChild(styleRegionLeft);
+		return styleRegionLeft;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-right}.
+	 *
+	 * @return the element {@odf.element style:region-right}
+	 */
+	public StyleRegionRightElement newStyleRegionRightElement() {
+		StyleRegionRightElement styleRegionRight = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionRightElement.class);
+		this.appendChild(styleRegionRight);
+		return styleRegionRight;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:index-title}
+	 */
+	 public TextIndexTitleElement newTextIndexTitleElement(String textNameValue) {
+		TextIndexTitleElement textIndexTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleElement.class);
+		textIndexTitle.setTextNameAttribute(textNameValue);
+		this.appendChild(textIndexTitle);
+		return textIndexTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tracked-changes}.
+	 *
+	 * @return the element {@odf.element text:tracked-changes}
+	 */
+	public TextTrackedChangesElement newTextTrackedChangesElement() {
+		TextTrackedChangesElement textTrackedChanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTrackedChangesElement.class);
+		this.appendChild(textTrackedChanges);
+		return textTrackedChanges;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderFooterPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderFooterPropertiesElement.java
new file mode 100644
index 0000000..f863aa3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderFooterPropertiesElement.java
@@ -0,0 +1,787 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMinHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDynamicSpacingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgHeightAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:header-footer-properties}.
+ *
+ */
+public class StyleHeaderFooterPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "header-footer-properties");
+
+	/**
+	 * Create the instance of <code>StyleHeaderFooterPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleHeaderFooterPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:header-footer-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+
+	public final static OdfStyleProperty MinHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "min-height"));
+
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+
+	public final static OdfStyleProperty DynamicSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "dynamic-spacing"));
+
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+
+	public final static OdfStyleProperty Height =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.SVG, "height"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderAttribute() {
+		FoBorderAttribute attr = (FoBorderAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @param foBorderValue   The type is <code>String</code>
+	 */
+	public void setFoBorderAttribute(String foBorderValue) {
+		FoBorderAttribute attr = new FoBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderBottomAttribute() {
+		FoBorderBottomAttribute attr = (FoBorderBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @param foBorderBottomValue   The type is <code>String</code>
+	 */
+	public void setFoBorderBottomAttribute(String foBorderBottomValue) {
+		FoBorderBottomAttribute attr = new FoBorderBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderLeftAttribute() {
+		FoBorderLeftAttribute attr = (FoBorderLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @param foBorderLeftValue   The type is <code>String</code>
+	 */
+	public void setFoBorderLeftAttribute(String foBorderLeftValue) {
+		FoBorderLeftAttribute attr = new FoBorderLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderRightAttribute() {
+		FoBorderRightAttribute attr = (FoBorderRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @param foBorderRightValue   The type is <code>String</code>
+	 */
+	public void setFoBorderRightAttribute(String foBorderRightValue) {
+		FoBorderRightAttribute attr = new FoBorderRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderTopAttribute() {
+		FoBorderTopAttribute attr = (FoBorderTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @param foBorderTopValue   The type is <code>String</code>
+	 */
+	public void setFoBorderTopAttribute(String foBorderTopValue) {
+		FoBorderTopAttribute attr = new FoBorderTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginAttribute() {
+		FoMarginAttribute attr = (FoMarginAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @param foMarginValue   The type is <code>String</code>
+	 */
+	public void setFoMarginAttribute(String foMarginValue) {
+		FoMarginAttribute attr = new FoMarginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginBottomAttribute() {
+		FoMarginBottomAttribute attr = (FoMarginBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @param foMarginBottomValue   The type is <code>String</code>
+	 */
+	public void setFoMarginBottomAttribute(String foMarginBottomValue) {
+		FoMarginBottomAttribute attr = new FoMarginBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginRightAttribute() {
+		FoMarginRightAttribute attr = (FoMarginRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @param foMarginRightValue   The type is <code>String</code>
+	 */
+	public void setFoMarginRightAttribute(String foMarginRightValue) {
+		FoMarginRightAttribute attr = new FoMarginRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginTopAttribute() {
+		FoMarginTopAttribute attr = (FoMarginTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @param foMarginTopValue   The type is <code>String</code>
+	 */
+	public void setFoMarginTopAttribute(String foMarginTopValue) {
+		FoMarginTopAttribute attr = new FoMarginTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMinHeightAttribute</code> , See {@odf.attribute fo:min-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMinHeightAttribute() {
+		FoMinHeightAttribute attr = (FoMinHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "min-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMinHeightAttribute</code> , See {@odf.attribute fo:min-height}
+	 *
+	 * @param foMinHeightValue   The type is <code>String</code>
+	 */
+	public void setFoMinHeightAttribute(String foMinHeightValue) {
+		FoMinHeightAttribute attr = new FoMinHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMinHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingAttribute() {
+		FoPaddingAttribute attr = (FoPaddingAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @param foPaddingValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingAttribute(String foPaddingValue) {
+		FoPaddingAttribute attr = new FoPaddingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingBottomAttribute() {
+		FoPaddingBottomAttribute attr = (FoPaddingBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @param foPaddingBottomValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingBottomAttribute(String foPaddingBottomValue) {
+		FoPaddingBottomAttribute attr = new FoPaddingBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingLeftAttribute() {
+		FoPaddingLeftAttribute attr = (FoPaddingLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @param foPaddingLeftValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingLeftAttribute(String foPaddingLeftValue) {
+		FoPaddingLeftAttribute attr = new FoPaddingLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingRightAttribute() {
+		FoPaddingRightAttribute attr = (FoPaddingRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @param foPaddingRightValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingRightAttribute(String foPaddingRightValue) {
+		FoPaddingRightAttribute attr = new FoPaddingRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingTopAttribute() {
+		FoPaddingTopAttribute attr = (FoPaddingTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @param foPaddingTopValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingTopAttribute(String foPaddingTopValue) {
+		FoPaddingTopAttribute attr = new FoPaddingTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthAttribute() {
+		StyleBorderLineWidthAttribute attr = (StyleBorderLineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @param styleBorderLineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthAttribute(String styleBorderLineWidthValue) {
+		StyleBorderLineWidthAttribute attr = new StyleBorderLineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthBottomAttribute() {
+		StyleBorderLineWidthBottomAttribute attr = (StyleBorderLineWidthBottomAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @param styleBorderLineWidthBottomValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthBottomAttribute(String styleBorderLineWidthBottomValue) {
+		StyleBorderLineWidthBottomAttribute attr = new StyleBorderLineWidthBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthLeftAttribute() {
+		StyleBorderLineWidthLeftAttribute attr = (StyleBorderLineWidthLeftAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @param styleBorderLineWidthLeftValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthLeftAttribute(String styleBorderLineWidthLeftValue) {
+		StyleBorderLineWidthLeftAttribute attr = new StyleBorderLineWidthLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthRightAttribute() {
+		StyleBorderLineWidthRightAttribute attr = (StyleBorderLineWidthRightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @param styleBorderLineWidthRightValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthRightAttribute(String styleBorderLineWidthRightValue) {
+		StyleBorderLineWidthRightAttribute attr = new StyleBorderLineWidthRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthTopAttribute() {
+		StyleBorderLineWidthTopAttribute attr = (StyleBorderLineWidthTopAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @param styleBorderLineWidthTopValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthTopAttribute(String styleBorderLineWidthTopValue) {
+		StyleBorderLineWidthTopAttribute attr = new StyleBorderLineWidthTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDynamicSpacingAttribute</code> , See {@odf.attribute style:dynamic-spacing}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleDynamicSpacingAttribute() {
+		StyleDynamicSpacingAttribute attr = (StyleDynamicSpacingAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "dynamic-spacing");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDynamicSpacingAttribute</code> , See {@odf.attribute style:dynamic-spacing}
+	 *
+	 * @param styleDynamicSpacingValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleDynamicSpacingAttribute(Boolean styleDynamicSpacingValue) {
+		StyleDynamicSpacingAttribute attr = new StyleDynamicSpacingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleDynamicSpacingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleShadowAttribute() {
+		StyleShadowAttribute attr = (StyleShadowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @param styleShadowValue   The type is <code>String</code>
+	 */
+	public void setStyleShadowAttribute(String styleShadowValue) {
+		StyleShadowAttribute attr = new StyleShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgHeightAttribute() {
+		SvgHeightAttribute attr = (SvgHeightAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgHeightAttribute</code> , See {@odf.attribute svg:height}
+	 *
+	 * @param svgHeightValue   The type is <code>String</code>
+	 */
+	public void setSvgHeightAttribute(String svgHeightValue) {
+		SvgHeightAttribute attr = new SvgHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgHeightValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderLeftElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderLeftElement.java
new file mode 100644
index 0000000..60afabb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderLeftElement.java
@@ -0,0 +1,425 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexAutoMarkFileElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDdeConnectionDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:header-left}.
+ *
+ */
+public class StyleHeaderLeftElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "header-left");
+
+	/**
+	 * Create the instance of <code>StyleHeaderLeftElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleHeaderLeftElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:header-left}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleDisplayAttribute() {
+		StyleDisplayAttribute attr = (StyleDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(StyleDisplayAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayAttribute</code> , See {@odf.attribute style:display}
+	 *
+	 * @param styleDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleDisplayAttribute(Boolean styleDisplayValue) {
+		StyleDisplayAttribute attr = new StyleDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-center}.
+	 *
+	 * @return the element {@odf.element style:region-center}
+	 */
+	public StyleRegionCenterElement newStyleRegionCenterElement() {
+		StyleRegionCenterElement styleRegionCenter = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionCenterElement.class);
+		this.appendChild(styleRegionCenter);
+		return styleRegionCenter;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-left}.
+	 *
+	 * @return the element {@odf.element style:region-left}
+	 */
+	public StyleRegionLeftElement newStyleRegionLeftElement() {
+		StyleRegionLeftElement styleRegionLeft = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionLeftElement.class);
+		this.appendChild(styleRegionLeft);
+		return styleRegionLeft;
+	}
+
+	/**
+	 * Create child element {@odf.element style:region-right}.
+	 *
+	 * @return the element {@odf.element style:region-right}
+	 */
+	public StyleRegionRightElement newStyleRegionRightElement() {
+		StyleRegionRightElement styleRegionRight = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRegionRightElement.class);
+		this.appendChild(styleRegionRight);
+		return styleRegionRight;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:alphabetical-index-auto-mark-file}
+	 */
+	 public TextAlphabeticalIndexAutoMarkFileElement newTextAlphabeticalIndexAutoMarkFileElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAlphabeticalIndexAutoMarkFileElement textAlphabeticalIndexAutoMarkFile = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexAutoMarkFileElement.class);
+		textAlphabeticalIndexAutoMarkFile.setXlinkHrefAttribute(xlinkHrefValue);
+		textAlphabeticalIndexAutoMarkFile.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textAlphabeticalIndexAutoMarkFile);
+		return textAlphabeticalIndexAutoMarkFile;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decls}.
+	 *
+	 * @return the element {@odf.element text:dde-connection-decls}
+	 */
+	public TextDdeConnectionDeclsElement newTextDdeConnectionDeclsElement() {
+		TextDdeConnectionDeclsElement textDdeConnectionDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclsElement.class);
+		this.appendChild(textDdeConnectionDecls);
+		return textDdeConnectionDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:index-title}
+	 */
+	 public TextIndexTitleElement newTextIndexTitleElement(String textNameValue) {
+		TextIndexTitleElement textIndexTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleElement.class);
+		textIndexTitle.setTextNameAttribute(textNameValue);
+		this.appendChild(textIndexTitle);
+		return textIndexTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decls}.
+	 *
+	 * @return the element {@odf.element text:sequence-decls}
+	 */
+	public TextSequenceDeclsElement newTextSequenceDeclsElement() {
+		TextSequenceDeclsElement textSequenceDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclsElement.class);
+		this.appendChild(textSequenceDecls);
+		return textSequenceDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tracked-changes}.
+	 *
+	 * @return the element {@odf.element text:tracked-changes}
+	 */
+	public TextTrackedChangesElement newTextTrackedChangesElement() {
+		TextTrackedChangesElement textTrackedChanges = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTrackedChangesElement.class);
+		this.appendChild(textTrackedChanges);
+		return textTrackedChanges;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decls}.
+	 *
+	 * @return the element {@odf.element text:user-field-decls}
+	 */
+	public TextUserFieldDeclsElement newTextUserFieldDeclsElement() {
+		TextUserFieldDeclsElement textUserFieldDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclsElement.class);
+		this.appendChild(textUserFieldDecls);
+		return textUserFieldDecls;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decls}.
+	 *
+	 * @return the element {@odf.element text:variable-decls}
+	 */
+	public TextVariableDeclsElement newTextVariableDeclsElement() {
+		TextVariableDeclsElement textVariableDecls = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclsElement.class);
+		this.appendChild(textVariableDecls);
+		return textVariableDecls;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderStyleElement.java
new file mode 100644
index 0000000..5dec9a2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleHeaderStyleElement.java
@@ -0,0 +1,82 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:header-style}.
+ *
+ */
+public class StyleHeaderStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "header-style");
+
+	/**
+	 * Create the instance of <code>StyleHeaderStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleHeaderStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:header-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element style:header-footer-properties}.
+	 *
+	 * @return the element {@odf.element style:header-footer-properties}
+	 */
+	public StyleHeaderFooterPropertiesElement newStyleHeaderFooterPropertiesElement() {
+		StyleHeaderFooterPropertiesElement styleHeaderFooterProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHeaderFooterPropertiesElement.class);
+		this.appendChild(styleHeaderFooterProperties);
+		return styleHeaderFooterProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleListLevelLabelAlignmentElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleListLevelLabelAlignmentElement.java
new file mode 100644
index 0000000..eda05e3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleListLevelLabelAlignmentElement.java
@@ -0,0 +1,173 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextIndentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLabelFollowedByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextListTabStopPositionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:list-level-label-alignment}.
+ *
+ */
+public class StyleListLevelLabelAlignmentElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "list-level-label-alignment");
+
+	/**
+	 * Create the instance of <code>StyleListLevelLabelAlignmentElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleListLevelLabelAlignmentElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:list-level-label-alignment}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextIndentAttribute</code> , See {@odf.attribute fo:text-indent}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextIndentAttribute() {
+		FoTextIndentAttribute attr = (FoTextIndentAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-indent");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextIndentAttribute</code> , See {@odf.attribute fo:text-indent}
+	 *
+	 * @param foTextIndentValue   The type is <code>String</code>
+	 */
+	public void setFoTextIndentAttribute(String foTextIndentValue) {
+		FoTextIndentAttribute attr = new FoTextIndentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextIndentValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLabelFollowedByAttribute</code> , See {@odf.attribute text:label-followed-by}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextLabelFollowedByAttribute() {
+		TextLabelFollowedByAttribute attr = (TextLabelFollowedByAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "label-followed-by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLabelFollowedByAttribute</code> , See {@odf.attribute text:label-followed-by}
+	 *
+	 * @param textLabelFollowedByValue   The type is <code>String</code>
+	 */
+	public void setTextLabelFollowedByAttribute(String textLabelFollowedByValue) {
+		TextLabelFollowedByAttribute attr = new TextLabelFollowedByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textLabelFollowedByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextListTabStopPositionAttribute</code> , See {@odf.attribute text:list-tab-stop-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextListTabStopPositionAttribute() {
+		TextListTabStopPositionAttribute attr = (TextListTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "list-tab-stop-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextListTabStopPositionAttribute</code> , See {@odf.attribute text:list-tab-stop-position}
+	 *
+	 * @param textListTabStopPositionValue   The type is <code>String</code>
+	 */
+	public void setTextListTabStopPositionAttribute(String textListTabStopPositionValue) {
+		TextListTabStopPositionAttribute attr = new TextListTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textListTabStopPositionValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleListLevelPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleListLevelPropertiesElement.java
new file mode 100644
index 0000000..5644065
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleListLevelPropertiesElement.java
@@ -0,0 +1,397 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalPosAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalRelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgYAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextListLevelPositionAndSpaceModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMinLabelDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMinLabelWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSpaceBeforeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:list-level-properties}.
+ *
+ */
+public class StyleListLevelPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "list-level-properties");
+
+	/**
+	 * Create the instance of <code>StyleListLevelPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleListLevelPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:list-level-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty Height =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.FO, "height"));
+
+	public final static OdfStyleProperty TextAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-align"));
+
+	public final static OdfStyleProperty Width =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.FO, "width"));
+
+	public final static OdfStyleProperty FontName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name"));
+
+	public final static OdfStyleProperty VerticalPos =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-pos"));
+
+	public final static OdfStyleProperty VerticalRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-rel"));
+
+	public final static OdfStyleProperty Y =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.SVG, "y"));
+
+	public final static OdfStyleProperty ListLevelPositionAndSpaceMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "list-level-position-and-space-mode"));
+
+	public final static OdfStyleProperty MinLabelDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "min-label-distance"));
+
+	public final static OdfStyleProperty MinLabelWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "min-label-width"));
+
+	public final static OdfStyleProperty SpaceBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "space-before"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoHeightAttribute</code> , See {@odf.attribute fo:height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoHeightAttribute() {
+		FoHeightAttribute attr = (FoHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoHeightAttribute</code> , See {@odf.attribute fo:height}
+	 *
+	 * @param foHeightValue   The type is <code>String</code>
+	 */
+	public void setFoHeightAttribute(String foHeightValue) {
+		FoHeightAttribute attr = new FoHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextAlignAttribute</code> , See {@odf.attribute fo:text-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextAlignAttribute() {
+		FoTextAlignAttribute attr = (FoTextAlignAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextAlignAttribute</code> , See {@odf.attribute fo:text-align}
+	 *
+	 * @param foTextAlignValue   The type is <code>String</code>
+	 */
+	public void setFoTextAlignAttribute(String foTextAlignValue) {
+		FoTextAlignAttribute attr = new FoTextAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoWidthAttribute</code> , See {@odf.attribute fo:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoWidthAttribute() {
+		FoWidthAttribute attr = (FoWidthAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoWidthAttribute</code> , See {@odf.attribute fo:width}
+	 *
+	 * @param foWidthValue   The type is <code>String</code>
+	 */
+	public void setFoWidthAttribute(String foWidthValue) {
+		FoWidthAttribute attr = new FoWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontNameAttribute</code> , See {@odf.attribute style:font-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontNameAttribute() {
+		StyleFontNameAttribute attr = (StyleFontNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontNameAttribute</code> , See {@odf.attribute style:font-name}
+	 *
+	 * @param styleFontNameValue   The type is <code>String</code>
+	 */
+	public void setStyleFontNameAttribute(String styleFontNameValue) {
+		StyleFontNameAttribute attr = new StyleFontNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalPosAttribute</code> , See {@odf.attribute style:vertical-pos}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalPosAttribute() {
+		StyleVerticalPosAttribute attr = (StyleVerticalPosAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-pos");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalPosAttribute</code> , See {@odf.attribute style:vertical-pos}
+	 *
+	 * @param styleVerticalPosValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalPosAttribute(String styleVerticalPosValue) {
+		StyleVerticalPosAttribute attr = new StyleVerticalPosAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalPosValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalRelAttribute</code> , See {@odf.attribute style:vertical-rel}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalRelAttribute() {
+		StyleVerticalRelAttribute attr = (StyleVerticalRelAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-rel");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalRelAttribute</code> , See {@odf.attribute style:vertical-rel}
+	 *
+	 * @param styleVerticalRelValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalRelAttribute(String styleVerticalRelValue) {
+		StyleVerticalRelAttribute attr = new StyleVerticalRelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalRelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgYAttribute() {
+		SvgYAttribute attr = (SvgYAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgYAttribute</code> , See {@odf.attribute svg:y}
+	 *
+	 * @param svgYValue   The type is <code>String</code>
+	 */
+	public void setSvgYAttribute(String svgYValue) {
+		SvgYAttribute attr = new SvgYAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgYValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextListLevelPositionAndSpaceModeAttribute</code> , See {@odf.attribute text:list-level-position-and-space-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextListLevelPositionAndSpaceModeAttribute() {
+		TextListLevelPositionAndSpaceModeAttribute attr = (TextListLevelPositionAndSpaceModeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "list-level-position-and-space-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextListLevelPositionAndSpaceModeAttribute</code> , See {@odf.attribute text:list-level-position-and-space-mode}
+	 *
+	 * @param textListLevelPositionAndSpaceModeValue   The type is <code>String</code>
+	 */
+	public void setTextListLevelPositionAndSpaceModeAttribute(String textListLevelPositionAndSpaceModeValue) {
+		TextListLevelPositionAndSpaceModeAttribute attr = new TextListLevelPositionAndSpaceModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textListLevelPositionAndSpaceModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMinLabelDistanceAttribute</code> , See {@odf.attribute text:min-label-distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextMinLabelDistanceAttribute() {
+		TextMinLabelDistanceAttribute attr = (TextMinLabelDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "min-label-distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMinLabelDistanceAttribute</code> , See {@odf.attribute text:min-label-distance}
+	 *
+	 * @param textMinLabelDistanceValue   The type is <code>String</code>
+	 */
+	public void setTextMinLabelDistanceAttribute(String textMinLabelDistanceValue) {
+		TextMinLabelDistanceAttribute attr = new TextMinLabelDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textMinLabelDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMinLabelWidthAttribute</code> , See {@odf.attribute text:min-label-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextMinLabelWidthAttribute() {
+		TextMinLabelWidthAttribute attr = (TextMinLabelWidthAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "min-label-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMinLabelWidthAttribute</code> , See {@odf.attribute text:min-label-width}
+	 *
+	 * @param textMinLabelWidthValue   The type is <code>String</code>
+	 */
+	public void setTextMinLabelWidthAttribute(String textMinLabelWidthValue) {
+		TextMinLabelWidthAttribute attr = new TextMinLabelWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textMinLabelWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSpaceBeforeAttribute</code> , See {@odf.attribute text:space-before}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSpaceBeforeAttribute() {
+		TextSpaceBeforeAttribute attr = (TextSpaceBeforeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "space-before");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSpaceBeforeAttribute</code> , See {@odf.attribute text:space-before}
+	 *
+	 * @param textSpaceBeforeValue   The type is <code>String</code>
+	 */
+	public void setTextSpaceBeforeAttribute(String textSpaceBeforeValue) {
+		TextSpaceBeforeAttribute attr = new TextSpaceBeforeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSpaceBeforeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:list-level-label-alignment}.
+	 *
+	 * @param textLabelFollowedByValue  the <code>String</code> value of <code>TextLabelFollowedByAttribute</code>, see {@odf.attribute  text:label-followed-by} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:list-level-label-alignment}
+	 */
+	 public StyleListLevelLabelAlignmentElement newStyleListLevelLabelAlignmentElement(String textLabelFollowedByValue) {
+		StyleListLevelLabelAlignmentElement styleListLevelLabelAlignment = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleListLevelLabelAlignmentElement.class);
+		styleListLevelLabelAlignment.setTextLabelFollowedByAttribute(textLabelFollowedByValue);
+		this.appendChild(styleListLevelLabelAlignment);
+		return styleListLevelLabelAlignment;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleMapElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleMapElement.java
new file mode 100644
index 0000000..d0a56c6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleMapElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleApplyStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBaseCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleConditionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:map}.
+ *
+ */
+public class StyleMapElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "map");
+
+	/**
+	 * Create the instance of <code>StyleMapElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleMapElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:map}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleApplyStyleNameAttribute</code> , See {@odf.attribute style:apply-style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleApplyStyleNameAttribute() {
+		StyleApplyStyleNameAttribute attr = (StyleApplyStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "apply-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleApplyStyleNameAttribute</code> , See {@odf.attribute style:apply-style-name}
+	 *
+	 * @param styleApplyStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleApplyStyleNameAttribute(String styleApplyStyleNameValue) {
+		StyleApplyStyleNameAttribute attr = new StyleApplyStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleApplyStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBaseCellAddressAttribute</code> , See {@odf.attribute style:base-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBaseCellAddressAttribute() {
+		StyleBaseCellAddressAttribute attr = (StyleBaseCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "base-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBaseCellAddressAttribute</code> , See {@odf.attribute style:base-cell-address}
+	 *
+	 * @param styleBaseCellAddressValue   The type is <code>String</code>
+	 */
+	public void setStyleBaseCellAddressAttribute(String styleBaseCellAddressValue) {
+		StyleBaseCellAddressAttribute attr = new StyleBaseCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBaseCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleConditionAttribute</code> , See {@odf.attribute style:condition}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleConditionAttribute() {
+		StyleConditionAttribute attr = (StyleConditionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleConditionAttribute</code> , See {@odf.attribute style:condition}
+	 *
+	 * @param styleConditionValue   The type is <code>String</code>
+	 */
+	public void setStyleConditionAttribute(String styleConditionValue) {
+		StyleConditionAttribute attr = new StyleConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleConditionValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleMasterPageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleMasterPageElement.java
new file mode 100644
index 0000000..d75abdd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleMasterPageElement.java
@@ -0,0 +1,712 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateColorElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateMotionElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateTransformElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAudioElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimCommandElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimIterateElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimParElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimSeqElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimSetElement;
+import org.odftoolkit.odfdom.dom.element.anim.AnimTransitionFilterElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLayerSetElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageLayoutNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:master-page}.
+ *
+ */
+public class StyleMasterPageElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "master-page");
+
+	/**
+	 * Create the instance of <code>StyleMasterPageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleMasterPageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.DrawingPage, OdfName.newName(OdfDocumentNamespace.STYLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:master-page}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawStyleNameAttribute() {
+		DrawStyleNameAttribute attr = (DrawStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawStyleNameAttribute</code> , See {@odf.attribute draw:style-name}
+	 *
+	 * @param drawStyleNameValue   The type is <code>String</code>
+	 */
+	public void setDrawStyleNameAttribute(String drawStyleNameValue) {
+		DrawStyleNameAttribute attr = new DrawStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNextStyleNameAttribute</code> , See {@odf.attribute style:next-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNextStyleNameAttribute() {
+		StyleNextStyleNameAttribute attr = (StyleNextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "next-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNextStyleNameAttribute</code> , See {@odf.attribute style:next-style-name}
+	 *
+	 * @param styleNextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNextStyleNameAttribute(String styleNextStyleNameValue) {
+		StyleNextStyleNameAttribute attr = new StyleNextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePageLayoutNameAttribute</code> , See {@odf.attribute style:page-layout-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePageLayoutNameAttribute() {
+		StylePageLayoutNameAttribute attr = (StylePageLayoutNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "page-layout-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePageLayoutNameAttribute</code> , See {@odf.attribute style:page-layout-name}
+	 *
+	 * @param stylePageLayoutNameValue   The type is <code>String</code>
+	 */
+	public void setStylePageLayoutNameAttribute(String stylePageLayoutNameValue) {
+		StylePageLayoutNameAttribute attr = new StylePageLayoutNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePageLayoutNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animate}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:animate}
+	 */
+	 public AnimAnimateElement newAnimAnimateElement(String smilAttributeNameValue) {
+		AnimAnimateElement animAnimate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateElement.class);
+		animAnimate.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimate);
+		return animAnimate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateColor}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:animateColor}
+	 */
+	 public AnimAnimateColorElement newAnimAnimateColorElement(String smilAttributeNameValue) {
+		AnimAnimateColorElement animAnimateColor = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateColorElement.class);
+		animAnimateColor.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateColor);
+		return animAnimateColor;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateMotion}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:animateMotion}
+	 */
+	 public AnimAnimateMotionElement newAnimAnimateMotionElement(String smilAttributeNameValue) {
+		AnimAnimateMotionElement animAnimateMotion = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateMotionElement.class);
+		animAnimateMotion.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animAnimateMotion);
+		return animAnimateMotion;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:animateTransform}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * @param svgTypeValue  the <code>String</code> value of <code>SvgTypeAttribute</code>, see {@odf.attribute  svg:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:animateTransform}
+	 */
+	 public AnimAnimateTransformElement newAnimAnimateTransformElement(String smilAttributeNameValue, String svgTypeValue) {
+		AnimAnimateTransformElement animAnimateTransform = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAnimateTransformElement.class);
+		animAnimateTransform.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		animAnimateTransform.setSvgTypeAttribute(svgTypeValue);
+		this.appendChild(animAnimateTransform);
+		return animAnimateTransform;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:audio}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:audio}
+	 */
+	public AnimAudioElement newAnimAudioElement() {
+		AnimAudioElement animAudio = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimAudioElement.class);
+		this.appendChild(animAudio);
+		return animAudio;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:command}.
+	 *
+	 * @param animCommandValue  the <code>String</code> value of <code>AnimCommandAttribute</code>, see {@odf.attribute  anim:command} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:command}
+	 */
+	 public AnimCommandElement newAnimCommandElement(String animCommandValue) {
+		AnimCommandElement animCommand = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimCommandElement.class);
+		animCommand.setAnimCommandAttribute(animCommandValue);
+		this.appendChild(animCommand);
+		return animCommand;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:iterate}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:iterate}
+	 */
+	public AnimIterateElement newAnimIterateElement() {
+		AnimIterateElement animIterate = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimIterateElement.class);
+		this.appendChild(animIterate);
+		return animIterate;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:par}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:par}
+	 */
+	public AnimParElement newAnimParElement() {
+		AnimParElement animPar = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimParElement.class);
+		this.appendChild(animPar);
+		return animPar;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:seq}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:seq}
+	 */
+	public AnimSeqElement newAnimSeqElement() {
+		AnimSeqElement animSeq = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSeqElement.class);
+		this.appendChild(animSeq);
+		return animSeq;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:set}.
+	 *
+	 * @param smilAttributeNameValue  the <code>String</code> value of <code>SmilAttributeNameAttribute</code>, see {@odf.attribute  smil:attributeName} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:set}
+	 */
+	 public AnimSetElement newAnimSetElement(String smilAttributeNameValue) {
+		AnimSetElement animSet = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimSetElement.class);
+		animSet.setSmilAttributeNameAttribute(smilAttributeNameValue);
+		this.appendChild(animSet);
+		return animSet;
+	}
+
+	/**
+	 * Create child element {@odf.element anim:transitionFilter}.
+	 *
+	 * @param smilTypeValue  the <code>String</code> value of <code>SmilTypeAttribute</code>, see {@odf.attribute  smil:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element anim:transitionFilter}
+	 */
+	 public AnimTransitionFilterElement newAnimTransitionFilterElement(String smilTypeValue) {
+		AnimTransitionFilterElement animTransitionFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(AnimTransitionFilterElement.class);
+		animTransitionFilter.setSmilTypeAttribute(smilTypeValue);
+		this.appendChild(animTransitionFilter);
+		return animTransitionFilter;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:layer-set}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:layer-set}
+	 */
+	public DrawLayerSetElement newDrawLayerSetElement() {
+		DrawLayerSetElement drawLayerSet = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLayerSetElement.class);
+		this.appendChild(drawLayerSet);
+		return drawLayerSet;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:forms}.
+	 *
+	 * @return the element {@odf.element office:forms}
+	 */
+	public OfficeFormsElement newOfficeFormsElement() {
+		OfficeFormsElement officeForms = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFormsElement.class);
+		this.appendChild(officeForms);
+		return officeForms;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:notes}.
+	 *
+	 * @return the element {@odf.element presentation:notes}
+	 */
+	public PresentationNotesElement newPresentationNotesElement() {
+		PresentationNotesElement presentationNotes = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationNotesElement.class);
+		this.appendChild(presentationNotes);
+		return presentationNotes;
+	}
+
+	/**
+	 * Create child element {@odf.element style:footer}.
+	 *
+	 * @return the element {@odf.element style:footer}
+	 */
+	public StyleFooterElement newStyleFooterElement() {
+		StyleFooterElement styleFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleFooterElement.class);
+		this.appendChild(styleFooter);
+		return styleFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element style:footer-left}.
+	 *
+	 * @return the element {@odf.element style:footer-left}
+	 */
+	public StyleFooterLeftElement newStyleFooterLeftElement() {
+		StyleFooterLeftElement styleFooterLeft = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleFooterLeftElement.class);
+		this.appendChild(styleFooterLeft);
+		return styleFooterLeft;
+	}
+
+	/**
+	 * Create child element {@odf.element style:header}.
+	 *
+	 * @return the element {@odf.element style:header}
+	 */
+	public StyleHeaderElement newStyleHeaderElement() {
+		StyleHeaderElement styleHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHeaderElement.class);
+		this.appendChild(styleHeader);
+		return styleHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element style:header-left}.
+	 *
+	 * @return the element {@odf.element style:header-left}
+	 */
+	public StyleHeaderLeftElement newStyleHeaderLeftElement() {
+		StyleHeaderLeftElement styleHeaderLeft = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHeaderLeftElement.class);
+		this.appendChild(styleHeaderLeft);
+		return styleHeaderLeft;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePageLayoutElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePageLayoutElement.java
new file mode 100644
index 0000000..6e2d099
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePageLayoutElement.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageUsageAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:page-layout}.
+ *
+ */
+public class StylePageLayoutElement extends OdfStyleBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "page-layout");
+
+	/**
+	 * Create the instance of <code>StylePageLayoutElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StylePageLayoutElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:page-layout}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePageUsageAttribute</code> , See {@odf.attribute style:page-usage}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePageUsageAttribute() {
+		StylePageUsageAttribute attr = (StylePageUsageAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "page-usage");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StylePageUsageAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePageUsageAttribute</code> , See {@odf.attribute style:page-usage}
+	 *
+	 * @param stylePageUsageValue   The type is <code>String</code>
+	 */
+	public void setStylePageUsageAttribute(String stylePageUsageValue) {
+		StylePageUsageAttribute attr = new StylePageUsageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePageUsageValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:footer-style}.
+	 *
+	 * @return the element {@odf.element style:footer-style}
+	 */
+	public StyleFooterStyleElement newStyleFooterStyleElement() {
+		StyleFooterStyleElement styleFooterStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleFooterStyleElement.class);
+		this.appendChild(styleFooterStyle);
+		return styleFooterStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:header-style}.
+	 *
+	 * @return the element {@odf.element style:header-style}
+	 */
+	public StyleHeaderStyleElement newStyleHeaderStyleElement() {
+		StyleHeaderStyleElement styleHeaderStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleHeaderStyleElement.class);
+		this.appendChild(styleHeaderStyle);
+		return styleHeaderStyle;
+	}
+
+	/**
+	 * Create child element {@odf.element style:page-layout-properties}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element style:page-layout-properties}
+	 */
+	 public StylePageLayoutPropertiesElement newStylePageLayoutPropertiesElement(String styleNumFormatValue) {
+		StylePageLayoutPropertiesElement stylePageLayoutProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StylePageLayoutPropertiesElement.class);
+		stylePageLayoutProperties.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(stylePageLayoutProperties);
+		return stylePageLayoutProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePageLayoutPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePageLayoutPropertiesElement.java
new file mode 100644
index 0000000..f15c43e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePageLayoutPropertiesElement.java
@@ -0,0 +1,1517 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPageHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPageWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFirstPageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFootnoteMaxHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridBaseHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridBaseWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridLinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridPrintAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridRubyBelowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridRubyHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridSnapToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLayoutGridStandardModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumPrefixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumSuffixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePaperTrayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePrintAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePrintOrientationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePrintPageOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRegisterTruthRefStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleScaleToAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleScaleToPagesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTableCenteringAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:page-layout-properties}.
+ *
+ */
+public class StylePageLayoutPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "page-layout-properties");
+
+	/**
+	 * Create the instance of <code>StylePageLayoutPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StylePageLayoutPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:page-layout-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+
+	public final static OdfStyleProperty PageHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "page-height"));
+
+	public final static OdfStyleProperty PageWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "page-width"));
+
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+
+	public final static OdfStyleProperty FirstPageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "first-page-number"));
+
+	public final static OdfStyleProperty FootnoteMaxHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "footnote-max-height"));
+
+	public final static OdfStyleProperty LayoutGridBaseHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-base-height"));
+
+	public final static OdfStyleProperty LayoutGridBaseWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-base-width"));
+
+	public final static OdfStyleProperty LayoutGridColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-color"));
+
+	public final static OdfStyleProperty LayoutGridDisplay =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-display"));
+
+	public final static OdfStyleProperty LayoutGridLines =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-lines"));
+
+	public final static OdfStyleProperty LayoutGridMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-mode"));
+
+	public final static OdfStyleProperty LayoutGridPrint =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-print"));
+
+	public final static OdfStyleProperty LayoutGridRubyBelow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-ruby-below"));
+
+	public final static OdfStyleProperty LayoutGridRubyHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-ruby-height"));
+
+	public final static OdfStyleProperty LayoutGridSnapTo =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-snap-to"));
+
+	public final static OdfStyleProperty LayoutGridStandardMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-standard-mode"));
+
+	public final static OdfStyleProperty NumFormat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-format"));
+
+	public final static OdfStyleProperty NumLetterSync =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-letter-sync"));
+
+	public final static OdfStyleProperty NumPrefix =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-prefix"));
+
+	public final static OdfStyleProperty NumSuffix =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-suffix"));
+
+	public final static OdfStyleProperty PaperTrayName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "paper-tray-name"));
+
+	public final static OdfStyleProperty Print =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print"));
+
+	public final static OdfStyleProperty PrintOrientation =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-orientation"));
+
+	public final static OdfStyleProperty PrintPageOrder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-page-order"));
+
+	public final static OdfStyleProperty RegisterTruthRefStyleName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "register-truth-ref-style-name"));
+
+	public final static OdfStyleProperty ScaleTo =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "scale-to"));
+
+	public final static OdfStyleProperty ScaleToPages =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "scale-to-pages"));
+
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+
+	public final static OdfStyleProperty TableCentering =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "table-centering"));
+
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderAttribute() {
+		FoBorderAttribute attr = (FoBorderAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @param foBorderValue   The type is <code>String</code>
+	 */
+	public void setFoBorderAttribute(String foBorderValue) {
+		FoBorderAttribute attr = new FoBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderBottomAttribute() {
+		FoBorderBottomAttribute attr = (FoBorderBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @param foBorderBottomValue   The type is <code>String</code>
+	 */
+	public void setFoBorderBottomAttribute(String foBorderBottomValue) {
+		FoBorderBottomAttribute attr = new FoBorderBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderLeftAttribute() {
+		FoBorderLeftAttribute attr = (FoBorderLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @param foBorderLeftValue   The type is <code>String</code>
+	 */
+	public void setFoBorderLeftAttribute(String foBorderLeftValue) {
+		FoBorderLeftAttribute attr = new FoBorderLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderRightAttribute() {
+		FoBorderRightAttribute attr = (FoBorderRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @param foBorderRightValue   The type is <code>String</code>
+	 */
+	public void setFoBorderRightAttribute(String foBorderRightValue) {
+		FoBorderRightAttribute attr = new FoBorderRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderTopAttribute() {
+		FoBorderTopAttribute attr = (FoBorderTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @param foBorderTopValue   The type is <code>String</code>
+	 */
+	public void setFoBorderTopAttribute(String foBorderTopValue) {
+		FoBorderTopAttribute attr = new FoBorderTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginAttribute() {
+		FoMarginAttribute attr = (FoMarginAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @param foMarginValue   The type is <code>String</code>
+	 */
+	public void setFoMarginAttribute(String foMarginValue) {
+		FoMarginAttribute attr = new FoMarginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginBottomAttribute() {
+		FoMarginBottomAttribute attr = (FoMarginBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @param foMarginBottomValue   The type is <code>String</code>
+	 */
+	public void setFoMarginBottomAttribute(String foMarginBottomValue) {
+		FoMarginBottomAttribute attr = new FoMarginBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginRightAttribute() {
+		FoMarginRightAttribute attr = (FoMarginRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @param foMarginRightValue   The type is <code>String</code>
+	 */
+	public void setFoMarginRightAttribute(String foMarginRightValue) {
+		FoMarginRightAttribute attr = new FoMarginRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginTopAttribute() {
+		FoMarginTopAttribute attr = (FoMarginTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @param foMarginTopValue   The type is <code>String</code>
+	 */
+	public void setFoMarginTopAttribute(String foMarginTopValue) {
+		FoMarginTopAttribute attr = new FoMarginTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingAttribute() {
+		FoPaddingAttribute attr = (FoPaddingAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @param foPaddingValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingAttribute(String foPaddingValue) {
+		FoPaddingAttribute attr = new FoPaddingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingBottomAttribute() {
+		FoPaddingBottomAttribute attr = (FoPaddingBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @param foPaddingBottomValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingBottomAttribute(String foPaddingBottomValue) {
+		FoPaddingBottomAttribute attr = new FoPaddingBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingLeftAttribute() {
+		FoPaddingLeftAttribute attr = (FoPaddingLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @param foPaddingLeftValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingLeftAttribute(String foPaddingLeftValue) {
+		FoPaddingLeftAttribute attr = new FoPaddingLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingRightAttribute() {
+		FoPaddingRightAttribute attr = (FoPaddingRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @param foPaddingRightValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingRightAttribute(String foPaddingRightValue) {
+		FoPaddingRightAttribute attr = new FoPaddingRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingTopAttribute() {
+		FoPaddingTopAttribute attr = (FoPaddingTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @param foPaddingTopValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingTopAttribute(String foPaddingTopValue) {
+		FoPaddingTopAttribute attr = new FoPaddingTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPageHeightAttribute</code> , See {@odf.attribute fo:page-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPageHeightAttribute() {
+		FoPageHeightAttribute attr = (FoPageHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "page-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPageHeightAttribute</code> , See {@odf.attribute fo:page-height}
+	 *
+	 * @param foPageHeightValue   The type is <code>String</code>
+	 */
+	public void setFoPageHeightAttribute(String foPageHeightValue) {
+		FoPageHeightAttribute attr = new FoPageHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPageHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPageWidthAttribute</code> , See {@odf.attribute fo:page-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPageWidthAttribute() {
+		FoPageWidthAttribute attr = (FoPageWidthAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "page-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPageWidthAttribute</code> , See {@odf.attribute fo:page-width}
+	 *
+	 * @param foPageWidthValue   The type is <code>String</code>
+	 */
+	public void setFoPageWidthAttribute(String foPageWidthValue) {
+		FoPageWidthAttribute attr = new FoPageWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPageWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthAttribute() {
+		StyleBorderLineWidthAttribute attr = (StyleBorderLineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @param styleBorderLineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthAttribute(String styleBorderLineWidthValue) {
+		StyleBorderLineWidthAttribute attr = new StyleBorderLineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthBottomAttribute() {
+		StyleBorderLineWidthBottomAttribute attr = (StyleBorderLineWidthBottomAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @param styleBorderLineWidthBottomValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthBottomAttribute(String styleBorderLineWidthBottomValue) {
+		StyleBorderLineWidthBottomAttribute attr = new StyleBorderLineWidthBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthLeftAttribute() {
+		StyleBorderLineWidthLeftAttribute attr = (StyleBorderLineWidthLeftAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @param styleBorderLineWidthLeftValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthLeftAttribute(String styleBorderLineWidthLeftValue) {
+		StyleBorderLineWidthLeftAttribute attr = new StyleBorderLineWidthLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthRightAttribute() {
+		StyleBorderLineWidthRightAttribute attr = (StyleBorderLineWidthRightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @param styleBorderLineWidthRightValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthRightAttribute(String styleBorderLineWidthRightValue) {
+		StyleBorderLineWidthRightAttribute attr = new StyleBorderLineWidthRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthTopAttribute() {
+		StyleBorderLineWidthTopAttribute attr = (StyleBorderLineWidthTopAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @param styleBorderLineWidthTopValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthTopAttribute(String styleBorderLineWidthTopValue) {
+		StyleBorderLineWidthTopAttribute attr = new StyleBorderLineWidthTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFirstPageNumberAttribute</code> , See {@odf.attribute style:first-page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleFirstPageNumberAttribute() {
+		StyleFirstPageNumberAttribute attr = (StyleFirstPageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "first-page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFirstPageNumberAttribute</code> , See {@odf.attribute style:first-page-number}
+	 *
+	 * @param styleFirstPageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setStyleFirstPageNumberAttribute(Integer styleFirstPageNumberValue) {
+		StyleFirstPageNumberAttribute attr = new StyleFirstPageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleFirstPageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFootnoteMaxHeightAttribute</code> , See {@odf.attribute style:footnote-max-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFootnoteMaxHeightAttribute() {
+		StyleFootnoteMaxHeightAttribute attr = (StyleFootnoteMaxHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "footnote-max-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFootnoteMaxHeightAttribute</code> , See {@odf.attribute style:footnote-max-height}
+	 *
+	 * @param styleFootnoteMaxHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleFootnoteMaxHeightAttribute(String styleFootnoteMaxHeightValue) {
+		StyleFootnoteMaxHeightAttribute attr = new StyleFootnoteMaxHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFootnoteMaxHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridBaseHeightAttribute</code> , See {@odf.attribute style:layout-grid-base-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLayoutGridBaseHeightAttribute() {
+		StyleLayoutGridBaseHeightAttribute attr = (StyleLayoutGridBaseHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-base-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridBaseHeightAttribute</code> , See {@odf.attribute style:layout-grid-base-height}
+	 *
+	 * @param styleLayoutGridBaseHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleLayoutGridBaseHeightAttribute(String styleLayoutGridBaseHeightValue) {
+		StyleLayoutGridBaseHeightAttribute attr = new StyleLayoutGridBaseHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLayoutGridBaseHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridBaseWidthAttribute</code> , See {@odf.attribute style:layout-grid-base-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLayoutGridBaseWidthAttribute() {
+		StyleLayoutGridBaseWidthAttribute attr = (StyleLayoutGridBaseWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-base-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridBaseWidthAttribute</code> , See {@odf.attribute style:layout-grid-base-width}
+	 *
+	 * @param styleLayoutGridBaseWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleLayoutGridBaseWidthAttribute(String styleLayoutGridBaseWidthValue) {
+		StyleLayoutGridBaseWidthAttribute attr = new StyleLayoutGridBaseWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLayoutGridBaseWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridColorAttribute</code> , See {@odf.attribute style:layout-grid-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLayoutGridColorAttribute() {
+		StyleLayoutGridColorAttribute attr = (StyleLayoutGridColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridColorAttribute</code> , See {@odf.attribute style:layout-grid-color}
+	 *
+	 * @param styleLayoutGridColorValue   The type is <code>String</code>
+	 */
+	public void setStyleLayoutGridColorAttribute(String styleLayoutGridColorValue) {
+		StyleLayoutGridColorAttribute attr = new StyleLayoutGridColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLayoutGridColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridDisplayAttribute</code> , See {@odf.attribute style:layout-grid-display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleLayoutGridDisplayAttribute() {
+		StyleLayoutGridDisplayAttribute attr = (StyleLayoutGridDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridDisplayAttribute</code> , See {@odf.attribute style:layout-grid-display}
+	 *
+	 * @param styleLayoutGridDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleLayoutGridDisplayAttribute(Boolean styleLayoutGridDisplayValue) {
+		StyleLayoutGridDisplayAttribute attr = new StyleLayoutGridDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleLayoutGridDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridLinesAttribute</code> , See {@odf.attribute style:layout-grid-lines}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleLayoutGridLinesAttribute() {
+		StyleLayoutGridLinesAttribute attr = (StyleLayoutGridLinesAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-lines");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridLinesAttribute</code> , See {@odf.attribute style:layout-grid-lines}
+	 *
+	 * @param styleLayoutGridLinesValue   The type is <code>Integer</code>
+	 */
+	public void setStyleLayoutGridLinesAttribute(Integer styleLayoutGridLinesValue) {
+		StyleLayoutGridLinesAttribute attr = new StyleLayoutGridLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleLayoutGridLinesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridModeAttribute</code> , See {@odf.attribute style:layout-grid-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLayoutGridModeAttribute() {
+		StyleLayoutGridModeAttribute attr = (StyleLayoutGridModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridModeAttribute</code> , See {@odf.attribute style:layout-grid-mode}
+	 *
+	 * @param styleLayoutGridModeValue   The type is <code>String</code>
+	 */
+	public void setStyleLayoutGridModeAttribute(String styleLayoutGridModeValue) {
+		StyleLayoutGridModeAttribute attr = new StyleLayoutGridModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLayoutGridModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridPrintAttribute</code> , See {@odf.attribute style:layout-grid-print}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleLayoutGridPrintAttribute() {
+		StyleLayoutGridPrintAttribute attr = (StyleLayoutGridPrintAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-print");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridPrintAttribute</code> , See {@odf.attribute style:layout-grid-print}
+	 *
+	 * @param styleLayoutGridPrintValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleLayoutGridPrintAttribute(Boolean styleLayoutGridPrintValue) {
+		StyleLayoutGridPrintAttribute attr = new StyleLayoutGridPrintAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleLayoutGridPrintValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridRubyBelowAttribute</code> , See {@odf.attribute style:layout-grid-ruby-below}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleLayoutGridRubyBelowAttribute() {
+		StyleLayoutGridRubyBelowAttribute attr = (StyleLayoutGridRubyBelowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-ruby-below");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridRubyBelowAttribute</code> , See {@odf.attribute style:layout-grid-ruby-below}
+	 *
+	 * @param styleLayoutGridRubyBelowValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleLayoutGridRubyBelowAttribute(Boolean styleLayoutGridRubyBelowValue) {
+		StyleLayoutGridRubyBelowAttribute attr = new StyleLayoutGridRubyBelowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleLayoutGridRubyBelowValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridRubyHeightAttribute</code> , See {@odf.attribute style:layout-grid-ruby-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLayoutGridRubyHeightAttribute() {
+		StyleLayoutGridRubyHeightAttribute attr = (StyleLayoutGridRubyHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-ruby-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridRubyHeightAttribute</code> , See {@odf.attribute style:layout-grid-ruby-height}
+	 *
+	 * @param styleLayoutGridRubyHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleLayoutGridRubyHeightAttribute(String styleLayoutGridRubyHeightValue) {
+		StyleLayoutGridRubyHeightAttribute attr = new StyleLayoutGridRubyHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLayoutGridRubyHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridSnapToAttribute</code> , See {@odf.attribute style:layout-grid-snap-to}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleLayoutGridSnapToAttribute() {
+		StyleLayoutGridSnapToAttribute attr = (StyleLayoutGridSnapToAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-snap-to");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridSnapToAttribute</code> , See {@odf.attribute style:layout-grid-snap-to}
+	 *
+	 * @param styleLayoutGridSnapToValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleLayoutGridSnapToAttribute(Boolean styleLayoutGridSnapToValue) {
+		StyleLayoutGridSnapToAttribute attr = new StyleLayoutGridSnapToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleLayoutGridSnapToValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLayoutGridStandardModeAttribute</code> , See {@odf.attribute style:layout-grid-standard-mode}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleLayoutGridStandardModeAttribute() {
+		StyleLayoutGridStandardModeAttribute attr = (StyleLayoutGridStandardModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "layout-grid-standard-mode");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLayoutGridStandardModeAttribute</code> , See {@odf.attribute style:layout-grid-standard-mode}
+	 *
+	 * @param styleLayoutGridStandardModeValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleLayoutGridStandardModeAttribute(Boolean styleLayoutGridStandardModeValue) {
+		StyleLayoutGridStandardModeAttribute attr = new StyleLayoutGridStandardModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleLayoutGridStandardModeValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumPrefixAttribute() {
+		StyleNumPrefixAttribute attr = (StyleNumPrefixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-prefix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @param styleNumPrefixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumPrefixAttribute(String styleNumPrefixValue) {
+		StyleNumPrefixAttribute attr = new StyleNumPrefixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumPrefixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumSuffixAttribute() {
+		StyleNumSuffixAttribute attr = (StyleNumSuffixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-suffix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @param styleNumSuffixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumSuffixAttribute(String styleNumSuffixValue) {
+		StyleNumSuffixAttribute attr = new StyleNumSuffixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumSuffixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePaperTrayNameAttribute</code> , See {@odf.attribute style:paper-tray-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePaperTrayNameAttribute() {
+		StylePaperTrayNameAttribute attr = (StylePaperTrayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "paper-tray-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePaperTrayNameAttribute</code> , See {@odf.attribute style:paper-tray-name}
+	 *
+	 * @param stylePaperTrayNameValue   The type is <code>String</code>
+	 */
+	public void setStylePaperTrayNameAttribute(String stylePaperTrayNameValue) {
+		StylePaperTrayNameAttribute attr = new StylePaperTrayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePaperTrayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePrintAttribute</code> , See {@odf.attribute style:print}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePrintAttribute() {
+		StylePrintAttribute attr = (StylePrintAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "print");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePrintAttribute</code> , See {@odf.attribute style:print}
+	 *
+	 * @param stylePrintValue   The type is <code>String</code>
+	 */
+	public void setStylePrintAttribute(String stylePrintValue) {
+		StylePrintAttribute attr = new StylePrintAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePrintValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePrintOrientationAttribute</code> , See {@odf.attribute style:print-orientation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePrintOrientationAttribute() {
+		StylePrintOrientationAttribute attr = (StylePrintOrientationAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "print-orientation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePrintOrientationAttribute</code> , See {@odf.attribute style:print-orientation}
+	 *
+	 * @param stylePrintOrientationValue   The type is <code>String</code>
+	 */
+	public void setStylePrintOrientationAttribute(String stylePrintOrientationValue) {
+		StylePrintOrientationAttribute attr = new StylePrintOrientationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePrintOrientationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePrintPageOrderAttribute</code> , See {@odf.attribute style:print-page-order}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePrintPageOrderAttribute() {
+		StylePrintPageOrderAttribute attr = (StylePrintPageOrderAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "print-page-order");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePrintPageOrderAttribute</code> , See {@odf.attribute style:print-page-order}
+	 *
+	 * @param stylePrintPageOrderValue   The type is <code>String</code>
+	 */
+	public void setStylePrintPageOrderAttribute(String stylePrintPageOrderValue) {
+		StylePrintPageOrderAttribute attr = new StylePrintPageOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePrintPageOrderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRegisterTruthRefStyleNameAttribute</code> , See {@odf.attribute style:register-truth-ref-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRegisterTruthRefStyleNameAttribute() {
+		StyleRegisterTruthRefStyleNameAttribute attr = (StyleRegisterTruthRefStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "register-truth-ref-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRegisterTruthRefStyleNameAttribute</code> , See {@odf.attribute style:register-truth-ref-style-name}
+	 *
+	 * @param styleRegisterTruthRefStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleRegisterTruthRefStyleNameAttribute(String styleRegisterTruthRefStyleNameValue) {
+		StyleRegisterTruthRefStyleNameAttribute attr = new StyleRegisterTruthRefStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRegisterTruthRefStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleScaleToAttribute</code> , See {@odf.attribute style:scale-to}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleScaleToAttribute() {
+		StyleScaleToAttribute attr = (StyleScaleToAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "scale-to");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleScaleToAttribute</code> , See {@odf.attribute style:scale-to}
+	 *
+	 * @param styleScaleToValue   The type is <code>String</code>
+	 */
+	public void setStyleScaleToAttribute(String styleScaleToValue) {
+		StyleScaleToAttribute attr = new StyleScaleToAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleScaleToValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleScaleToPagesAttribute</code> , See {@odf.attribute style:scale-to-pages}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleScaleToPagesAttribute() {
+		StyleScaleToPagesAttribute attr = (StyleScaleToPagesAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "scale-to-pages");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleScaleToPagesAttribute</code> , See {@odf.attribute style:scale-to-pages}
+	 *
+	 * @param styleScaleToPagesValue   The type is <code>Integer</code>
+	 */
+	public void setStyleScaleToPagesAttribute(Integer styleScaleToPagesValue) {
+		StyleScaleToPagesAttribute attr = new StyleScaleToPagesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleScaleToPagesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleShadowAttribute() {
+		StyleShadowAttribute attr = (StyleShadowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @param styleShadowValue   The type is <code>String</code>
+	 */
+	public void setStyleShadowAttribute(String styleShadowValue) {
+		StyleShadowAttribute attr = new StyleShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTableCenteringAttribute</code> , See {@odf.attribute style:table-centering}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTableCenteringAttribute() {
+		StyleTableCenteringAttribute attr = (StyleTableCenteringAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "table-centering");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTableCenteringAttribute</code> , See {@odf.attribute style:table-centering}
+	 *
+	 * @param styleTableCenteringValue   The type is <code>String</code>
+	 */
+	public void setStyleTableCenteringAttribute(String styleTableCenteringValue) {
+		StyleTableCenteringAttribute attr = new StyleTableCenteringAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTableCenteringValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWritingModeAttribute() {
+		StyleWritingModeAttribute attr = (StyleWritingModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @param styleWritingModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWritingModeAttribute(String styleWritingModeValue) {
+		StyleWritingModeAttribute attr = new StyleWritingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWritingModeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	/**
+	 * Create child element {@odf.element style:columns}.
+	 *
+	 * @param foColumnCountValue  the <code>Integer</code> value of <code>FoColumnCountAttribute</code>, see {@odf.attribute  fo:column-count} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:columns}
+	 */
+	 public StyleColumnsElement newStyleColumnsElement(int foColumnCountValue) {
+		StyleColumnsElement styleColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleColumnsElement.class);
+		styleColumns.setFoColumnCountAttribute(foColumnCountValue);
+		this.appendChild(styleColumns);
+		return styleColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element style:footnote-sep}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:footnote-sep}
+	 */
+	public StyleFootnoteSepElement newStyleFootnoteSepElement() {
+		StyleFootnoteSepElement styleFootnoteSep = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleFootnoteSepElement.class);
+		this.appendChild(styleFootnoteSep);
+		return styleFootnoteSep;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleParagraphPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleParagraphPropertiesElement.java
new file mode 100644
index 0000000..ab96b84
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleParagraphPropertiesElement.java
@@ -0,0 +1,1597 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakBeforeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoHyphenationKeepAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoHyphenationLadderCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoKeepTogetherAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoKeepWithNextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoLineHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoOrphansAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextAlignLastAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextIndentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoWidowsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleAutoTextIndentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBackgroundTransparencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontIndependentLineSpacingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleJoinBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleJustifySingleWordAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLineBreakAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLineHeightAtLeastAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLineSpacingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePunctuationWrapAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRegisterTrueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleSnapToLayoutGridAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTabStopDistanceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextAutospaceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAutomaticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLineNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNumberLinesAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:paragraph-properties}.
+ *
+ */
+public class StyleParagraphPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "paragraph-properties");
+
+	/**
+	 * Create the instance of <code>StyleParagraphPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleParagraphPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:paragraph-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+
+	public final static OdfStyleProperty HyphenationKeep =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-keep"));
+
+	public final static OdfStyleProperty HyphenationLadderCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-ladder-count"));
+
+	public final static OdfStyleProperty KeepTogether =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-together"));
+
+	public final static OdfStyleProperty KeepWithNext =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-with-next"));
+
+	public final static OdfStyleProperty LineHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "line-height"));
+
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+
+	public final static OdfStyleProperty Orphans =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "orphans"));
+
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+
+	public final static OdfStyleProperty TextAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-align"));
+
+	public final static OdfStyleProperty TextAlignLast =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-align-last"));
+
+	public final static OdfStyleProperty TextIndent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-indent"));
+
+	public final static OdfStyleProperty Widows =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "widows"));
+
+	public final static OdfStyleProperty AutoTextIndent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "auto-text-indent"));
+
+	public final static OdfStyleProperty BackgroundTransparency =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "background-transparency"));
+
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+
+	public final static OdfStyleProperty FontIndependentLineSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-independent-line-spacing"));
+
+	public final static OdfStyleProperty JoinBorder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "join-border"));
+
+	public final static OdfStyleProperty JustifySingleWord =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "justify-single-word"));
+
+	public final static OdfStyleProperty LineBreak =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "line-break"));
+
+	public final static OdfStyleProperty LineHeightAtLeast =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "line-height-at-least"));
+
+	public final static OdfStyleProperty LineSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "line-spacing"));
+
+	public final static OdfStyleProperty PageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "page-number"));
+
+	public final static OdfStyleProperty PunctuationWrap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "punctuation-wrap"));
+
+	public final static OdfStyleProperty RegisterTrue =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "register-true"));
+
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+
+	public final static OdfStyleProperty SnapToLayoutGrid =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "snap-to-layout-grid"));
+
+	public final static OdfStyleProperty TabStopDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "tab-stop-distance"));
+
+	public final static OdfStyleProperty TextAutospace =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-autospace"));
+
+	public final static OdfStyleProperty VerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+
+	public final static OdfStyleProperty WritingModeAutomatic =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode-automatic"));
+
+	public final static OdfStyleProperty LineNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "line-number"));
+
+	public final static OdfStyleProperty NumberLines =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "number-lines"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderAttribute() {
+		FoBorderAttribute attr = (FoBorderAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @param foBorderValue   The type is <code>String</code>
+	 */
+	public void setFoBorderAttribute(String foBorderValue) {
+		FoBorderAttribute attr = new FoBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderBottomAttribute() {
+		FoBorderBottomAttribute attr = (FoBorderBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @param foBorderBottomValue   The type is <code>String</code>
+	 */
+	public void setFoBorderBottomAttribute(String foBorderBottomValue) {
+		FoBorderBottomAttribute attr = new FoBorderBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderLeftAttribute() {
+		FoBorderLeftAttribute attr = (FoBorderLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @param foBorderLeftValue   The type is <code>String</code>
+	 */
+	public void setFoBorderLeftAttribute(String foBorderLeftValue) {
+		FoBorderLeftAttribute attr = new FoBorderLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderRightAttribute() {
+		FoBorderRightAttribute attr = (FoBorderRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @param foBorderRightValue   The type is <code>String</code>
+	 */
+	public void setFoBorderRightAttribute(String foBorderRightValue) {
+		FoBorderRightAttribute attr = new FoBorderRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderTopAttribute() {
+		FoBorderTopAttribute attr = (FoBorderTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @param foBorderTopValue   The type is <code>String</code>
+	 */
+	public void setFoBorderTopAttribute(String foBorderTopValue) {
+		FoBorderTopAttribute attr = new FoBorderTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakAfterAttribute() {
+		FoBreakAfterAttribute attr = (FoBreakAfterAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-after");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @param foBreakAfterValue   The type is <code>String</code>
+	 */
+	public void setFoBreakAfterAttribute(String foBreakAfterValue) {
+		FoBreakAfterAttribute attr = new FoBreakAfterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakAfterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakBeforeAttribute() {
+		FoBreakBeforeAttribute attr = (FoBreakBeforeAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-before");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @param foBreakBeforeValue   The type is <code>String</code>
+	 */
+	public void setFoBreakBeforeAttribute(String foBreakBeforeValue) {
+		FoBreakBeforeAttribute attr = new FoBreakBeforeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakBeforeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoHyphenationKeepAttribute</code> , See {@odf.attribute fo:hyphenation-keep}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoHyphenationKeepAttribute() {
+		FoHyphenationKeepAttribute attr = (FoHyphenationKeepAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "hyphenation-keep");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoHyphenationKeepAttribute</code> , See {@odf.attribute fo:hyphenation-keep}
+	 *
+	 * @param foHyphenationKeepValue   The type is <code>String</code>
+	 */
+	public void setFoHyphenationKeepAttribute(String foHyphenationKeepValue) {
+		FoHyphenationKeepAttribute attr = new FoHyphenationKeepAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foHyphenationKeepValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoHyphenationLadderCountAttribute</code> , See {@odf.attribute fo:hyphenation-ladder-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFoHyphenationLadderCountAttribute() {
+		FoHyphenationLadderCountAttribute attr = (FoHyphenationLadderCountAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "hyphenation-ladder-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoHyphenationLadderCountAttribute</code> , See {@odf.attribute fo:hyphenation-ladder-count}
+	 *
+	 * @param foHyphenationLadderCountValue   The type is <code>Integer</code>
+	 */
+	public void setFoHyphenationLadderCountAttribute(Integer foHyphenationLadderCountValue) {
+		FoHyphenationLadderCountAttribute attr = new FoHyphenationLadderCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(foHyphenationLadderCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoKeepTogetherAttribute</code> , See {@odf.attribute fo:keep-together}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoKeepTogetherAttribute() {
+		FoKeepTogetherAttribute attr = (FoKeepTogetherAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "keep-together");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoKeepTogetherAttribute</code> , See {@odf.attribute fo:keep-together}
+	 *
+	 * @param foKeepTogetherValue   The type is <code>String</code>
+	 */
+	public void setFoKeepTogetherAttribute(String foKeepTogetherValue) {
+		FoKeepTogetherAttribute attr = new FoKeepTogetherAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foKeepTogetherValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoKeepWithNextAttribute</code> , See {@odf.attribute fo:keep-with-next}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoKeepWithNextAttribute() {
+		FoKeepWithNextAttribute attr = (FoKeepWithNextAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "keep-with-next");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoKeepWithNextAttribute</code> , See {@odf.attribute fo:keep-with-next}
+	 *
+	 * @param foKeepWithNextValue   The type is <code>String</code>
+	 */
+	public void setFoKeepWithNextAttribute(String foKeepWithNextValue) {
+		FoKeepWithNextAttribute attr = new FoKeepWithNextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foKeepWithNextValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoLineHeightAttribute</code> , See {@odf.attribute fo:line-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoLineHeightAttribute() {
+		FoLineHeightAttribute attr = (FoLineHeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "line-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoLineHeightAttribute</code> , See {@odf.attribute fo:line-height}
+	 *
+	 * @param foLineHeightValue   The type is <code>String</code>
+	 */
+	public void setFoLineHeightAttribute(String foLineHeightValue) {
+		FoLineHeightAttribute attr = new FoLineHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foLineHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginAttribute() {
+		FoMarginAttribute attr = (FoMarginAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @param foMarginValue   The type is <code>String</code>
+	 */
+	public void setFoMarginAttribute(String foMarginValue) {
+		FoMarginAttribute attr = new FoMarginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginBottomAttribute() {
+		FoMarginBottomAttribute attr = (FoMarginBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @param foMarginBottomValue   The type is <code>String</code>
+	 */
+	public void setFoMarginBottomAttribute(String foMarginBottomValue) {
+		FoMarginBottomAttribute attr = new FoMarginBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginRightAttribute() {
+		FoMarginRightAttribute attr = (FoMarginRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @param foMarginRightValue   The type is <code>String</code>
+	 */
+	public void setFoMarginRightAttribute(String foMarginRightValue) {
+		FoMarginRightAttribute attr = new FoMarginRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginTopAttribute() {
+		FoMarginTopAttribute attr = (FoMarginTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @param foMarginTopValue   The type is <code>String</code>
+	 */
+	public void setFoMarginTopAttribute(String foMarginTopValue) {
+		FoMarginTopAttribute attr = new FoMarginTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoOrphansAttribute</code> , See {@odf.attribute fo:orphans}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFoOrphansAttribute() {
+		FoOrphansAttribute attr = (FoOrphansAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "orphans");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoOrphansAttribute</code> , See {@odf.attribute fo:orphans}
+	 *
+	 * @param foOrphansValue   The type is <code>Integer</code>
+	 */
+	public void setFoOrphansAttribute(Integer foOrphansValue) {
+		FoOrphansAttribute attr = new FoOrphansAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(foOrphansValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingAttribute() {
+		FoPaddingAttribute attr = (FoPaddingAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @param foPaddingValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingAttribute(String foPaddingValue) {
+		FoPaddingAttribute attr = new FoPaddingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingBottomAttribute() {
+		FoPaddingBottomAttribute attr = (FoPaddingBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @param foPaddingBottomValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingBottomAttribute(String foPaddingBottomValue) {
+		FoPaddingBottomAttribute attr = new FoPaddingBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingLeftAttribute() {
+		FoPaddingLeftAttribute attr = (FoPaddingLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @param foPaddingLeftValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingLeftAttribute(String foPaddingLeftValue) {
+		FoPaddingLeftAttribute attr = new FoPaddingLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingRightAttribute() {
+		FoPaddingRightAttribute attr = (FoPaddingRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @param foPaddingRightValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingRightAttribute(String foPaddingRightValue) {
+		FoPaddingRightAttribute attr = new FoPaddingRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingTopAttribute() {
+		FoPaddingTopAttribute attr = (FoPaddingTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @param foPaddingTopValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingTopAttribute(String foPaddingTopValue) {
+		FoPaddingTopAttribute attr = new FoPaddingTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextAlignAttribute</code> , See {@odf.attribute fo:text-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextAlignAttribute() {
+		FoTextAlignAttribute attr = (FoTextAlignAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextAlignAttribute</code> , See {@odf.attribute fo:text-align}
+	 *
+	 * @param foTextAlignValue   The type is <code>String</code>
+	 */
+	public void setFoTextAlignAttribute(String foTextAlignValue) {
+		FoTextAlignAttribute attr = new FoTextAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextAlignLastAttribute</code> , See {@odf.attribute fo:text-align-last}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextAlignLastAttribute() {
+		FoTextAlignLastAttribute attr = (FoTextAlignLastAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-align-last");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextAlignLastAttribute</code> , See {@odf.attribute fo:text-align-last}
+	 *
+	 * @param foTextAlignLastValue   The type is <code>String</code>
+	 */
+	public void setFoTextAlignLastAttribute(String foTextAlignLastValue) {
+		FoTextAlignLastAttribute attr = new FoTextAlignLastAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextAlignLastValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextIndentAttribute</code> , See {@odf.attribute fo:text-indent}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextIndentAttribute() {
+		FoTextIndentAttribute attr = (FoTextIndentAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-indent");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextIndentAttribute</code> , See {@odf.attribute fo:text-indent}
+	 *
+	 * @param foTextIndentValue   The type is <code>String</code>
+	 */
+	public void setFoTextIndentAttribute(String foTextIndentValue) {
+		FoTextIndentAttribute attr = new FoTextIndentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextIndentValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoWidowsAttribute</code> , See {@odf.attribute fo:widows}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFoWidowsAttribute() {
+		FoWidowsAttribute attr = (FoWidowsAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "widows");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoWidowsAttribute</code> , See {@odf.attribute fo:widows}
+	 *
+	 * @param foWidowsValue   The type is <code>Integer</code>
+	 */
+	public void setFoWidowsAttribute(Integer foWidowsValue) {
+		FoWidowsAttribute attr = new FoWidowsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(foWidowsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleAutoTextIndentAttribute</code> , See {@odf.attribute style:auto-text-indent}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleAutoTextIndentAttribute() {
+		StyleAutoTextIndentAttribute attr = (StyleAutoTextIndentAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "auto-text-indent");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleAutoTextIndentAttribute</code> , See {@odf.attribute style:auto-text-indent}
+	 *
+	 * @param styleAutoTextIndentValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleAutoTextIndentAttribute(Boolean styleAutoTextIndentValue) {
+		StyleAutoTextIndentAttribute attr = new StyleAutoTextIndentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleAutoTextIndentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBackgroundTransparencyAttribute</code> , See {@odf.attribute style:background-transparency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBackgroundTransparencyAttribute() {
+		StyleBackgroundTransparencyAttribute attr = (StyleBackgroundTransparencyAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "background-transparency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBackgroundTransparencyAttribute</code> , See {@odf.attribute style:background-transparency}
+	 *
+	 * @param styleBackgroundTransparencyValue   The type is <code>String</code>
+	 */
+	public void setStyleBackgroundTransparencyAttribute(String styleBackgroundTransparencyValue) {
+		StyleBackgroundTransparencyAttribute attr = new StyleBackgroundTransparencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBackgroundTransparencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthAttribute() {
+		StyleBorderLineWidthAttribute attr = (StyleBorderLineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @param styleBorderLineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthAttribute(String styleBorderLineWidthValue) {
+		StyleBorderLineWidthAttribute attr = new StyleBorderLineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthBottomAttribute() {
+		StyleBorderLineWidthBottomAttribute attr = (StyleBorderLineWidthBottomAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @param styleBorderLineWidthBottomValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthBottomAttribute(String styleBorderLineWidthBottomValue) {
+		StyleBorderLineWidthBottomAttribute attr = new StyleBorderLineWidthBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthLeftAttribute() {
+		StyleBorderLineWidthLeftAttribute attr = (StyleBorderLineWidthLeftAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @param styleBorderLineWidthLeftValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthLeftAttribute(String styleBorderLineWidthLeftValue) {
+		StyleBorderLineWidthLeftAttribute attr = new StyleBorderLineWidthLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthRightAttribute() {
+		StyleBorderLineWidthRightAttribute attr = (StyleBorderLineWidthRightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @param styleBorderLineWidthRightValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthRightAttribute(String styleBorderLineWidthRightValue) {
+		StyleBorderLineWidthRightAttribute attr = new StyleBorderLineWidthRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthTopAttribute() {
+		StyleBorderLineWidthTopAttribute attr = (StyleBorderLineWidthTopAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @param styleBorderLineWidthTopValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthTopAttribute(String styleBorderLineWidthTopValue) {
+		StyleBorderLineWidthTopAttribute attr = new StyleBorderLineWidthTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontIndependentLineSpacingAttribute</code> , See {@odf.attribute style:font-independent-line-spacing}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleFontIndependentLineSpacingAttribute() {
+		StyleFontIndependentLineSpacingAttribute attr = (StyleFontIndependentLineSpacingAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-independent-line-spacing");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontIndependentLineSpacingAttribute</code> , See {@odf.attribute style:font-independent-line-spacing}
+	 *
+	 * @param styleFontIndependentLineSpacingValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleFontIndependentLineSpacingAttribute(Boolean styleFontIndependentLineSpacingValue) {
+		StyleFontIndependentLineSpacingAttribute attr = new StyleFontIndependentLineSpacingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleFontIndependentLineSpacingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleJoinBorderAttribute</code> , See {@odf.attribute style:join-border}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleJoinBorderAttribute() {
+		StyleJoinBorderAttribute attr = (StyleJoinBorderAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "join-border");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleJoinBorderAttribute</code> , See {@odf.attribute style:join-border}
+	 *
+	 * @param styleJoinBorderValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleJoinBorderAttribute(Boolean styleJoinBorderValue) {
+		StyleJoinBorderAttribute attr = new StyleJoinBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleJoinBorderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleJustifySingleWordAttribute</code> , See {@odf.attribute style:justify-single-word}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleJustifySingleWordAttribute() {
+		StyleJustifySingleWordAttribute attr = (StyleJustifySingleWordAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "justify-single-word");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleJustifySingleWordAttribute</code> , See {@odf.attribute style:justify-single-word}
+	 *
+	 * @param styleJustifySingleWordValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleJustifySingleWordAttribute(Boolean styleJustifySingleWordValue) {
+		StyleJustifySingleWordAttribute attr = new StyleJustifySingleWordAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleJustifySingleWordValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLineBreakAttribute</code> , See {@odf.attribute style:line-break}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLineBreakAttribute() {
+		StyleLineBreakAttribute attr = (StyleLineBreakAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "line-break");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLineBreakAttribute</code> , See {@odf.attribute style:line-break}
+	 *
+	 * @param styleLineBreakValue   The type is <code>String</code>
+	 */
+	public void setStyleLineBreakAttribute(String styleLineBreakValue) {
+		StyleLineBreakAttribute attr = new StyleLineBreakAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLineBreakValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLineHeightAtLeastAttribute</code> , See {@odf.attribute style:line-height-at-least}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLineHeightAtLeastAttribute() {
+		StyleLineHeightAtLeastAttribute attr = (StyleLineHeightAtLeastAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "line-height-at-least");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLineHeightAtLeastAttribute</code> , See {@odf.attribute style:line-height-at-least}
+	 *
+	 * @param styleLineHeightAtLeastValue   The type is <code>String</code>
+	 */
+	public void setStyleLineHeightAtLeastAttribute(String styleLineHeightAtLeastValue) {
+		StyleLineHeightAtLeastAttribute attr = new StyleLineHeightAtLeastAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLineHeightAtLeastValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLineSpacingAttribute</code> , See {@odf.attribute style:line-spacing}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLineSpacingAttribute() {
+		StyleLineSpacingAttribute attr = (StyleLineSpacingAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "line-spacing");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLineSpacingAttribute</code> , See {@odf.attribute style:line-spacing}
+	 *
+	 * @param styleLineSpacingValue   The type is <code>String</code>
+	 */
+	public void setStyleLineSpacingAttribute(String styleLineSpacingValue) {
+		StyleLineSpacingAttribute attr = new StyleLineSpacingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLineSpacingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePageNumberAttribute</code> , See {@odf.attribute style:page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStylePageNumberAttribute() {
+		StylePageNumberAttribute attr = (StylePageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePageNumberAttribute</code> , See {@odf.attribute style:page-number}
+	 *
+	 * @param stylePageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setStylePageNumberAttribute(Integer stylePageNumberValue) {
+		StylePageNumberAttribute attr = new StylePageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(stylePageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePunctuationWrapAttribute</code> , See {@odf.attribute style:punctuation-wrap}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePunctuationWrapAttribute() {
+		StylePunctuationWrapAttribute attr = (StylePunctuationWrapAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "punctuation-wrap");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePunctuationWrapAttribute</code> , See {@odf.attribute style:punctuation-wrap}
+	 *
+	 * @param stylePunctuationWrapValue   The type is <code>String</code>
+	 */
+	public void setStylePunctuationWrapAttribute(String stylePunctuationWrapValue) {
+		StylePunctuationWrapAttribute attr = new StylePunctuationWrapAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePunctuationWrapValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRegisterTrueAttribute</code> , See {@odf.attribute style:register-true}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleRegisterTrueAttribute() {
+		StyleRegisterTrueAttribute attr = (StyleRegisterTrueAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "register-true");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRegisterTrueAttribute</code> , See {@odf.attribute style:register-true}
+	 *
+	 * @param styleRegisterTrueValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleRegisterTrueAttribute(Boolean styleRegisterTrueValue) {
+		StyleRegisterTrueAttribute attr = new StyleRegisterTrueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleRegisterTrueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleShadowAttribute() {
+		StyleShadowAttribute attr = (StyleShadowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @param styleShadowValue   The type is <code>String</code>
+	 */
+	public void setStyleShadowAttribute(String styleShadowValue) {
+		StyleShadowAttribute attr = new StyleShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleSnapToLayoutGridAttribute</code> , See {@odf.attribute style:snap-to-layout-grid}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleSnapToLayoutGridAttribute() {
+		StyleSnapToLayoutGridAttribute attr = (StyleSnapToLayoutGridAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "snap-to-layout-grid");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleSnapToLayoutGridAttribute</code> , See {@odf.attribute style:snap-to-layout-grid}
+	 *
+	 * @param styleSnapToLayoutGridValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleSnapToLayoutGridAttribute(Boolean styleSnapToLayoutGridValue) {
+		StyleSnapToLayoutGridAttribute attr = new StyleSnapToLayoutGridAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleSnapToLayoutGridValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTabStopDistanceAttribute</code> , See {@odf.attribute style:tab-stop-distance}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTabStopDistanceAttribute() {
+		StyleTabStopDistanceAttribute attr = (StyleTabStopDistanceAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "tab-stop-distance");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTabStopDistanceAttribute</code> , See {@odf.attribute style:tab-stop-distance}
+	 *
+	 * @param styleTabStopDistanceValue   The type is <code>String</code>
+	 */
+	public void setStyleTabStopDistanceAttribute(String styleTabStopDistanceValue) {
+		StyleTabStopDistanceAttribute attr = new StyleTabStopDistanceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTabStopDistanceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextAutospaceAttribute</code> , See {@odf.attribute style:text-autospace}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextAutospaceAttribute() {
+		StyleTextAutospaceAttribute attr = (StyleTextAutospaceAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-autospace");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextAutospaceAttribute</code> , See {@odf.attribute style:text-autospace}
+	 *
+	 * @param styleTextAutospaceValue   The type is <code>String</code>
+	 */
+	public void setStyleTextAutospaceAttribute(String styleTextAutospaceValue) {
+		StyleTextAutospaceAttribute attr = new StyleTextAutospaceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextAutospaceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalAlignAttribute</code> , See {@odf.attribute style:vertical-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalAlignAttribute() {
+		StyleVerticalAlignAttribute attr = (StyleVerticalAlignAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalAlignAttribute</code> , See {@odf.attribute style:vertical-align}
+	 *
+	 * @param styleVerticalAlignValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalAlignAttribute(String styleVerticalAlignValue) {
+		StyleVerticalAlignAttribute attr = new StyleVerticalAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWritingModeAttribute() {
+		StyleWritingModeAttribute attr = (StyleWritingModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @param styleWritingModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWritingModeAttribute(String styleWritingModeValue) {
+		StyleWritingModeAttribute attr = new StyleWritingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWritingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAutomaticAttribute</code> , See {@odf.attribute style:writing-mode-automatic}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleWritingModeAutomaticAttribute() {
+		StyleWritingModeAutomaticAttribute attr = (StyleWritingModeAutomaticAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode-automatic");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAutomaticAttribute</code> , See {@odf.attribute style:writing-mode-automatic}
+	 *
+	 * @param styleWritingModeAutomaticValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleWritingModeAutomaticAttribute(Boolean styleWritingModeAutomaticValue) {
+		StyleWritingModeAutomaticAttribute attr = new StyleWritingModeAutomaticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleWritingModeAutomaticValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLineNumberAttribute</code> , See {@odf.attribute text:line-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextLineNumberAttribute() {
+		TextLineNumberAttribute attr = (TextLineNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "line-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLineNumberAttribute</code> , See {@odf.attribute text:line-number}
+	 *
+	 * @param textLineNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTextLineNumberAttribute(Integer textLineNumberValue) {
+		TextLineNumberAttribute attr = new TextLineNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textLineNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNumberLinesAttribute</code> , See {@odf.attribute text:number-lines}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextNumberLinesAttribute() {
+		TextNumberLinesAttribute attr = (TextNumberLinesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "number-lines");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNumberLinesAttribute</code> , See {@odf.attribute text:number-lines}
+	 *
+	 * @param textNumberLinesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextNumberLinesAttribute(Boolean textNumberLinesValue) {
+		TextNumberLinesAttribute attr = new TextNumberLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textNumberLinesValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	/**
+	 * Create child element {@odf.element style:drop-cap}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:drop-cap}
+	 */
+	public StyleDropCapElement newStyleDropCapElement() {
+		StyleDropCapElement styleDropCap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleDropCapElement.class);
+		this.appendChild(styleDropCap);
+		return styleDropCap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:tab-stops}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:tab-stops}
+	 */
+	public StyleTabStopsElement newStyleTabStopsElement() {
+		StyleTabStopsElement styleTabStops = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTabStopsElement.class);
+		this.appendChild(styleTabStops);
+		return styleTabStops;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePresentationPageLayoutElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePresentationPageLayoutElement.java
new file mode 100644
index 0000000..55ef09e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StylePresentationPageLayoutElement.java
@@ -0,0 +1,145 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationPlaceholderElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:presentation-page-layout}.
+ *
+ */
+public class StylePresentationPageLayoutElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "presentation-page-layout");
+
+	/**
+	 * Create the instance of <code>StylePresentationPageLayoutElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StylePresentationPageLayoutElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:presentation-page-layout}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:placeholder}.
+	 *
+	 * @param presentationObjectValue  the <code>String</code> value of <code>PresentationObjectAttribute</code>, see {@odf.attribute  presentation:object} at specification
+	 * @param svgHeightValue  the <code>String</code> value of <code>SvgHeightAttribute</code>, see {@odf.attribute  svg:height} at specification
+	 * @param svgWidthValue  the <code>String</code> value of <code>SvgWidthAttribute</code>, see {@odf.attribute  svg:width} at specification
+	 * @param svgXValue  the <code>String</code> value of <code>SvgXAttribute</code>, see {@odf.attribute  svg:x} at specification
+	 * @param svgYValue  the <code>String</code> value of <code>SvgYAttribute</code>, see {@odf.attribute  svg:y} at specification
+	 * @return the element {@odf.element presentation:placeholder}
+	 */
+	 public PresentationPlaceholderElement newPresentationPlaceholderElement(String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue) {
+		PresentationPlaceholderElement presentationPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationPlaceholderElement.class);
+		presentationPlaceholder.setPresentationObjectAttribute(presentationObjectValue);
+		presentationPlaceholder.setSvgHeightAttribute(svgHeightValue);
+		presentationPlaceholder.setSvgWidthAttribute(svgWidthValue);
+		presentationPlaceholder.setSvgXAttribute(svgXValue);
+		presentationPlaceholder.setSvgYAttribute(svgYValue);
+		this.appendChild(presentationPlaceholder);
+		return presentationPlaceholder;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionCenterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionCenterElement.java
new file mode 100644
index 0000000..d721c82
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionCenterElement.java
@@ -0,0 +1,83 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:region-center}.
+ *
+ */
+public class StyleRegionCenterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "region-center");
+
+	/**
+	 * Create the instance of <code>StyleRegionCenterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleRegionCenterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:region-center}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionLeftElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionLeftElement.java
new file mode 100644
index 0000000..20f5e9c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionLeftElement.java
@@ -0,0 +1,83 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:region-left}.
+ *
+ */
+public class StyleRegionLeftElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "region-left");
+
+	/**
+	 * Create the instance of <code>StyleRegionLeftElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleRegionLeftElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:region-left}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionRightElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionRightElement.java
new file mode 100644
index 0000000..125a9d6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRegionRightElement.java
@@ -0,0 +1,83 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:region-right}.
+ *
+ */
+public class StyleRegionRightElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "region-right");
+
+	/**
+	 * Create the instance of <code>StyleRegionRightElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleRegionRightElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:region-right}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRubyPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRubyPropertiesElement.java
new file mode 100644
index 0000000..c490487
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleRubyPropertiesElement.java
@@ -0,0 +1,130 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRubyAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRubyPositionAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:ruby-properties}.
+ *
+ */
+public class StyleRubyPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-properties");
+
+	/**
+	 * Create the instance of <code>StyleRubyPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleRubyPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:ruby-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty RubyAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.RubyProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-align"));
+
+	public final static OdfStyleProperty RubyPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.RubyProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-position"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRubyAlignAttribute</code> , See {@odf.attribute style:ruby-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRubyAlignAttribute() {
+		StyleRubyAlignAttribute attr = (StyleRubyAlignAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "ruby-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRubyAlignAttribute</code> , See {@odf.attribute style:ruby-align}
+	 *
+	 * @param styleRubyAlignValue   The type is <code>String</code>
+	 */
+	public void setStyleRubyAlignAttribute(String styleRubyAlignValue) {
+		StyleRubyAlignAttribute attr = new StyleRubyAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRubyAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRubyPositionAttribute</code> , See {@odf.attribute style:ruby-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRubyPositionAttribute() {
+		StyleRubyPositionAttribute attr = (StyleRubyPositionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "ruby-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRubyPositionAttribute</code> , See {@odf.attribute style:ruby-position}
+	 *
+	 * @param styleRubyPositionValue   The type is <code>String</code>
+	 */
+	public void setStyleRubyPositionAttribute(String styleRubyPositionValue) {
+		StyleRubyPositionAttribute attr = new StyleRubyPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRubyPositionValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleSectionPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleSectionPropertiesElement.java
new file mode 100644
index 0000000..a2c7b5f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleSectionPropertiesElement.java
@@ -0,0 +1,316 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextNotesConfigurationElement;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleEditableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleProtectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDontBalanceTextColumnsAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:section-properties}.
+ *
+ */
+public class StyleSectionPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "section-properties");
+
+	/**
+	 * Create the instance of <code>StyleSectionPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleSectionPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:section-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+
+	public final static OdfStyleProperty Editable =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "editable"));
+
+	public final static OdfStyleProperty Protect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "protect"));
+
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+
+	public final static OdfStyleProperty DontBalanceTextColumns =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "dont-balance-text-columns"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginRightAttribute() {
+		FoMarginRightAttribute attr = (FoMarginRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @param foMarginRightValue   The type is <code>String</code>
+	 */
+	public void setFoMarginRightAttribute(String foMarginRightValue) {
+		FoMarginRightAttribute attr = new FoMarginRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleEditableAttribute</code> , See {@odf.attribute style:editable}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleEditableAttribute() {
+		StyleEditableAttribute attr = (StyleEditableAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "editable");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleEditableAttribute</code> , See {@odf.attribute style:editable}
+	 *
+	 * @param styleEditableValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleEditableAttribute(Boolean styleEditableValue) {
+		StyleEditableAttribute attr = new StyleEditableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleEditableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleProtectAttribute</code> , See {@odf.attribute style:protect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleProtectAttribute() {
+		StyleProtectAttribute attr = (StyleProtectAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "protect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleProtectAttribute</code> , See {@odf.attribute style:protect}
+	 *
+	 * @param styleProtectValue   The type is <code>String</code>
+	 */
+	public void setStyleProtectAttribute(String styleProtectValue) {
+		StyleProtectAttribute attr = new StyleProtectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleProtectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWritingModeAttribute() {
+		StyleWritingModeAttribute attr = (StyleWritingModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @param styleWritingModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWritingModeAttribute(String styleWritingModeValue) {
+		StyleWritingModeAttribute attr = new StyleWritingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWritingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDontBalanceTextColumnsAttribute</code> , See {@odf.attribute text:dont-balance-text-columns}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextDontBalanceTextColumnsAttribute() {
+		TextDontBalanceTextColumnsAttribute attr = (TextDontBalanceTextColumnsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "dont-balance-text-columns");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDontBalanceTextColumnsAttribute</code> , See {@odf.attribute text:dont-balance-text-columns}
+	 *
+	 * @param textDontBalanceTextColumnsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextDontBalanceTextColumnsAttribute(Boolean textDontBalanceTextColumnsValue) {
+		TextDontBalanceTextColumnsAttribute attr = new TextDontBalanceTextColumnsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textDontBalanceTextColumnsValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	/**
+	 * Create child element {@odf.element style:columns}.
+	 *
+	 * @param foColumnCountValue  the <code>Integer</code> value of <code>FoColumnCountAttribute</code>, see {@odf.attribute  fo:column-count} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:columns}
+	 */
+	 public StyleColumnsElement newStyleColumnsElement(int foColumnCountValue) {
+		StyleColumnsElement styleColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleColumnsElement.class);
+		styleColumns.setFoColumnCountAttribute(foColumnCountValue);
+		this.appendChild(styleColumns);
+		return styleColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element text:notes-configuration}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:notes-configuration}
+	 */
+	 public TextNotesConfigurationElement newTextNotesConfigurationElement(String styleNumFormatValue, String textNoteClassValue) {
+		TextNotesConfigurationElement textNotesConfiguration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNotesConfigurationElement.class);
+		textNotesConfiguration.setStyleNumFormatAttribute(styleNumFormatValue);
+		textNotesConfiguration.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNotesConfiguration);
+		return textNotesConfiguration;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleStyleElement.java
new file mode 100644
index 0000000..549dc29
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleStyleElement.java
@@ -0,0 +1,541 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleAutoUpdateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDefaultOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFamilyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleListLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleListStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleMasterPageNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleParentStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePercentageDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:style}.
+ *
+ */
+public class StyleStyleElement extends OdfStyleBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "style");
+
+	/**
+	 * Create the instance of <code>StyleStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleAutoUpdateAttribute</code> , See {@odf.attribute style:auto-update}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleAutoUpdateAttribute() {
+		StyleAutoUpdateAttribute attr = (StyleAutoUpdateAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "auto-update");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(StyleAutoUpdateAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleAutoUpdateAttribute</code> , See {@odf.attribute style:auto-update}
+	 *
+	 * @param styleAutoUpdateValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleAutoUpdateAttribute(Boolean styleAutoUpdateValue) {
+		StyleAutoUpdateAttribute attr = new StyleAutoUpdateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleAutoUpdateValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleClassAttribute</code> , See {@odf.attribute style:class}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleClassAttribute() {
+		StyleClassAttribute attr = (StyleClassAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleClassAttribute</code> , See {@odf.attribute style:class}
+	 *
+	 * @param styleClassValue   The type is <code>String</code>
+	 */
+	public void setStyleClassAttribute(String styleClassValue) {
+		StyleClassAttribute attr = new StyleClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDefaultOutlineLevelAttribute</code> , See {@odf.attribute style:default-outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleDefaultOutlineLevelAttribute() {
+		StyleDefaultOutlineLevelAttribute attr = (StyleDefaultOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "default-outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDefaultOutlineLevelAttribute</code> , See {@odf.attribute style:default-outline-level}
+	 *
+	 * @param styleDefaultOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setStyleDefaultOutlineLevelAttribute(Integer styleDefaultOutlineLevelValue) {
+		StyleDefaultOutlineLevelAttribute attr = new StyleDefaultOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleDefaultOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFamilyAttribute</code> , See {@odf.attribute style:family}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFamilyAttribute() {
+		StyleFamilyAttribute attr = (StyleFamilyAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "family");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFamilyAttribute</code> , See {@odf.attribute style:family}
+	 *
+	 * @param styleFamilyValue   The type is <code>String</code>
+	 */
+	public void setStyleFamilyAttribute(String styleFamilyValue) {
+		StyleFamilyAttribute attr = new StyleFamilyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFamilyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleListLevelAttribute</code> , See {@odf.attribute style:list-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleListLevelAttribute() {
+		StyleListLevelAttribute attr = (StyleListLevelAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "list-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleListLevelAttribute</code> , See {@odf.attribute style:list-level}
+	 *
+	 * @param styleListLevelValue   The type is <code>Integer</code>
+	 */
+	public void setStyleListLevelAttribute(Integer styleListLevelValue) {
+		StyleListLevelAttribute attr = new StyleListLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleListLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleListStyleNameAttribute</code> , See {@odf.attribute style:list-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleListStyleNameAttribute() {
+		StyleListStyleNameAttribute attr = (StyleListStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "list-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleListStyleNameAttribute</code> , See {@odf.attribute style:list-style-name}
+	 *
+	 * @param styleListStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleListStyleNameAttribute(String styleListStyleNameValue) {
+		StyleListStyleNameAttribute attr = new StyleListStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleListStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleMasterPageNameAttribute</code> , See {@odf.attribute style:master-page-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleMasterPageNameAttribute() {
+		StyleMasterPageNameAttribute attr = (StyleMasterPageNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "master-page-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleMasterPageNameAttribute</code> , See {@odf.attribute style:master-page-name}
+	 *
+	 * @param styleMasterPageNameValue   The type is <code>String</code>
+	 */
+	public void setStyleMasterPageNameAttribute(String styleMasterPageNameValue) {
+		StyleMasterPageNameAttribute attr = new StyleMasterPageNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleMasterPageNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNextStyleNameAttribute</code> , See {@odf.attribute style:next-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNextStyleNameAttribute() {
+		StyleNextStyleNameAttribute attr = (StyleNextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "next-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNextStyleNameAttribute</code> , See {@odf.attribute style:next-style-name}
+	 *
+	 * @param styleNextStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNextStyleNameAttribute(String styleNextStyleNameValue) {
+		StyleNextStyleNameAttribute attr = new StyleNextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNextStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleParentStyleNameAttribute</code> , See {@odf.attribute style:parent-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleParentStyleNameAttribute() {
+		StyleParentStyleNameAttribute attr = (StyleParentStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "parent-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleParentStyleNameAttribute</code> , See {@odf.attribute style:parent-style-name}
+	 *
+	 * @param styleParentStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleParentStyleNameAttribute(String styleParentStyleNameValue) {
+		StyleParentStyleNameAttribute attr = new StyleParentStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleParentStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePercentageDataStyleNameAttribute</code> , See {@odf.attribute style:percentage-data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePercentageDataStyleNameAttribute() {
+		StylePercentageDataStyleNameAttribute attr = (StylePercentageDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "percentage-data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePercentageDataStyleNameAttribute</code> , See {@odf.attribute style:percentage-data-style-name}
+	 *
+	 * @param stylePercentageDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStylePercentageDataStyleNameAttribute(String stylePercentageDataStyleNameValue) {
+		StylePercentageDataStyleNameAttribute attr = new StylePercentageDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePercentageDataStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:chart-properties}.
+	 *
+	 * @param chartSymbolTypeValue  the <code>String</code> value of <code>ChartSymbolTypeAttribute</code>, see {@odf.attribute  chart:symbol-type} at specification
+	 * @return the element {@odf.element style:chart-properties}
+	 */
+	 public StyleChartPropertiesElement newStyleChartPropertiesElement(String chartSymbolTypeValue) {
+		StyleChartPropertiesElement styleChartProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleChartPropertiesElement.class);
+		styleChartProperties.setChartSymbolTypeAttribute(chartSymbolTypeValue);
+		this.appendChild(styleChartProperties);
+		return styleChartProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:drawing-page-properties}.
+	 *
+	 * @return the element {@odf.element style:drawing-page-properties}
+	 */
+	public StyleDrawingPagePropertiesElement newStyleDrawingPagePropertiesElement() {
+		StyleDrawingPagePropertiesElement styleDrawingPageProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleDrawingPagePropertiesElement.class);
+		this.appendChild(styleDrawingPageProperties);
+		return styleDrawingPageProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:graphic-properties}.
+	 *
+	 * @return the element {@odf.element style:graphic-properties}
+	 */
+	public StyleGraphicPropertiesElement newStyleGraphicPropertiesElement() {
+		StyleGraphicPropertiesElement styleGraphicProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleGraphicPropertiesElement.class);
+		this.appendChild(styleGraphicProperties);
+		return styleGraphicProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:map}.
+	 *
+	 * @param styleApplyStyleNameValue  the <code>String</code> value of <code>StyleApplyStyleNameAttribute</code>, see {@odf.attribute  style:apply-style-name} at specification
+	 * @param styleConditionValue  the <code>String</code> value of <code>StyleConditionAttribute</code>, see {@odf.attribute  style:condition} at specification
+	 * @return the element {@odf.element style:map}
+	 */
+	 public StyleMapElement newStyleMapElement(String styleApplyStyleNameValue, String styleConditionValue) {
+		StyleMapElement styleMap = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleMapElement.class);
+		styleMap.setStyleApplyStyleNameAttribute(styleApplyStyleNameValue);
+		styleMap.setStyleConditionAttribute(styleConditionValue);
+		this.appendChild(styleMap);
+		return styleMap;
+	}
+
+	/**
+	 * Create child element {@odf.element style:paragraph-properties}.
+	 *
+	 * @return the element {@odf.element style:paragraph-properties}
+	 */
+	public StyleParagraphPropertiesElement newStyleParagraphPropertiesElement() {
+		StyleParagraphPropertiesElement styleParagraphProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleParagraphPropertiesElement.class);
+		this.appendChild(styleParagraphProperties);
+		return styleParagraphProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:ruby-properties}.
+	 *
+	 * @return the element {@odf.element style:ruby-properties}
+	 */
+	public StyleRubyPropertiesElement newStyleRubyPropertiesElement() {
+		StyleRubyPropertiesElement styleRubyProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleRubyPropertiesElement.class);
+		this.appendChild(styleRubyProperties);
+		return styleRubyProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:section-properties}.
+	 *
+	 * @return the element {@odf.element style:section-properties}
+	 */
+	public StyleSectionPropertiesElement newStyleSectionPropertiesElement() {
+		StyleSectionPropertiesElement styleSectionProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleSectionPropertiesElement.class);
+		this.appendChild(styleSectionProperties);
+		return styleSectionProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-cell-properties}.
+	 *
+	 * @return the element {@odf.element style:table-cell-properties}
+	 */
+	public StyleTableCellPropertiesElement newStyleTableCellPropertiesElement() {
+		StyleTableCellPropertiesElement styleTableCellProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTableCellPropertiesElement.class);
+		this.appendChild(styleTableCellProperties);
+		return styleTableCellProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-column-properties}.
+	 *
+	 * @return the element {@odf.element style:table-column-properties}
+	 */
+	public StyleTableColumnPropertiesElement newStyleTableColumnPropertiesElement() {
+		StyleTableColumnPropertiesElement styleTableColumnProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTableColumnPropertiesElement.class);
+		this.appendChild(styleTableColumnProperties);
+		return styleTableColumnProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-properties}.
+	 *
+	 * @return the element {@odf.element style:table-properties}
+	 */
+	public StyleTablePropertiesElement newStyleTablePropertiesElement() {
+		StyleTablePropertiesElement styleTableProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTablePropertiesElement.class);
+		this.appendChild(styleTableProperties);
+		return styleTableProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:table-row-properties}.
+	 *
+	 * @return the element {@odf.element style:table-row-properties}
+	 */
+	public StyleTableRowPropertiesElement newStyleTableRowPropertiesElement() {
+		StyleTableRowPropertiesElement styleTableRowProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTableRowPropertiesElement.class);
+		this.appendChild(styleTableRowProperties);
+		return styleTableRowProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTabStopElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTabStopElement.java
new file mode 100644
index 0000000..4bdf951
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTabStopElement.java
@@ -0,0 +1,300 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleCharAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderTextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderTextStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:tab-stop}.
+ *
+ */
+public class StyleTabStopElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "tab-stop");
+
+	/**
+	 * Create the instance of <code>StyleTabStopElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTabStopElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:tab-stop}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleCharAttribute</code> , See {@odf.attribute style:char}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleCharAttribute() {
+		StyleCharAttribute attr = (StyleCharAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "char");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleCharAttribute</code> , See {@odf.attribute style:char}
+	 *
+	 * @param styleCharValue   The type is <code>String</code>
+	 */
+	public void setStyleCharAttribute(String styleCharValue) {
+		StyleCharAttribute attr = new StyleCharAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleCharValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderColorAttribute</code> , See {@odf.attribute style:leader-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderColorAttribute() {
+		StyleLeaderColorAttribute attr = (StyleLeaderColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderColorAttribute</code> , See {@odf.attribute style:leader-color}
+	 *
+	 * @param styleLeaderColorValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderColorAttribute(String styleLeaderColorValue) {
+		StyleLeaderColorAttribute attr = new StyleLeaderColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderStyleAttribute</code> , See {@odf.attribute style:leader-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderStyleAttribute() {
+		StyleLeaderStyleAttribute attr = (StyleLeaderStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderStyleAttribute</code> , See {@odf.attribute style:leader-style}
+	 *
+	 * @param styleLeaderStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderStyleAttribute(String styleLeaderStyleValue) {
+		StyleLeaderStyleAttribute attr = new StyleLeaderStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderTextAttribute</code> , See {@odf.attribute style:leader-text}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderTextAttribute() {
+		StyleLeaderTextAttribute attr = (StyleLeaderTextAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-text");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleLeaderTextAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderTextAttribute</code> , See {@odf.attribute style:leader-text}
+	 *
+	 * @param styleLeaderTextValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderTextAttribute(String styleLeaderTextValue) {
+		StyleLeaderTextAttribute attr = new StyleLeaderTextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderTextValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderTextStyleAttribute</code> , See {@odf.attribute style:leader-text-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderTextStyleAttribute() {
+		StyleLeaderTextStyleAttribute attr = (StyleLeaderTextStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-text-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderTextStyleAttribute</code> , See {@odf.attribute style:leader-text-style}
+	 *
+	 * @param styleLeaderTextStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderTextStyleAttribute(String styleLeaderTextStyleValue) {
+		StyleLeaderTextStyleAttribute attr = new StyleLeaderTextStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderTextStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderTypeAttribute</code> , See {@odf.attribute style:leader-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderTypeAttribute() {
+		StyleLeaderTypeAttribute attr = (StyleLeaderTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderTypeAttribute</code> , See {@odf.attribute style:leader-type}
+	 *
+	 * @param styleLeaderTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderTypeAttribute(String styleLeaderTypeValue) {
+		StyleLeaderTypeAttribute attr = new StyleLeaderTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderWidthAttribute</code> , See {@odf.attribute style:leader-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderWidthAttribute() {
+		StyleLeaderWidthAttribute attr = (StyleLeaderWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderWidthAttribute</code> , See {@odf.attribute style:leader-width}
+	 *
+	 * @param styleLeaderWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderWidthAttribute(String styleLeaderWidthValue) {
+		StyleLeaderWidthAttribute attr = new StyleLeaderWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePositionAttribute</code> , See {@odf.attribute style:position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePositionAttribute() {
+		StylePositionAttribute attr = (StylePositionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePositionAttribute</code> , See {@odf.attribute style:position}
+	 *
+	 * @param stylePositionValue   The type is <code>String</code>
+	 */
+	public void setStylePositionAttribute(String stylePositionValue) {
+		StylePositionAttribute attr = new StylePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTypeAttribute</code> , See {@odf.attribute style:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTypeAttribute() {
+		StyleTypeAttribute attr = (StyleTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return StyleTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTypeAttribute</code> , See {@odf.attribute style:type}
+	 *
+	 * @param styleTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleTypeAttribute(String styleTypeValue) {
+		StyleTypeAttribute attr = new StyleTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTabStopsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTabStopsElement.java
new file mode 100644
index 0000000..0792ce6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTabStopsElement.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:tab-stops}.
+ *
+ */
+public class StyleTabStopsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "tab-stops");
+
+	/**
+	 * Create the instance of <code>StyleTabStopsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTabStopsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:tab-stops}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element style:tab-stop}.
+	 *
+	 * @param stylePositionValue  the <code>String</code> value of <code>StylePositionAttribute</code>, see {@odf.attribute  style:position} at specification
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:tab-stop}
+	 */
+	 public StyleTabStopElement newStyleTabStopElement(String stylePositionValue, String styleTypeValue) {
+		StyleTabStopElement styleTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTabStopElement.class);
+		styleTabStop.setStylePositionAttribute(stylePositionValue);
+		styleTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(styleTabStop);
+		return styleTabStop;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableCellPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableCellPropertiesElement.java
new file mode 100644
index 0000000..81b1546
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableCellPropertiesElement.java
@@ -0,0 +1,1039 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPaddingTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoWrapOptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleCellProtectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDecimalPlacesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalBlTrAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalBlTrWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalTlBrAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalTlBrWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleGlyphOrientationVerticalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePrintContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRepeatContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRotationAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRotationAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShrinkToFitAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextAlignSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:table-cell-properties}.
+ *
+ */
+public class StyleTableCellPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "table-cell-properties");
+
+	/**
+	 * Create the instance of <code>StyleTableCellPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTableCellPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:table-cell-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+
+	public final static OdfStyleProperty WrapOption =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "wrap-option"));
+
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+
+	public final static OdfStyleProperty CellProtect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "cell-protect"));
+
+	public final static OdfStyleProperty DecimalPlaces =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "decimal-places"));
+
+	public final static OdfStyleProperty DiagonalBlTr =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-bl-tr"));
+
+	public final static OdfStyleProperty DiagonalBlTrWidths =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-bl-tr-widths"));
+
+	public final static OdfStyleProperty DiagonalTlBr =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-tl-br"));
+
+	public final static OdfStyleProperty DiagonalTlBrWidths =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-tl-br-widths"));
+
+	public final static OdfStyleProperty Direction =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "direction"));
+
+	public final static OdfStyleProperty GlyphOrientationVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "glyph-orientation-vertical"));
+
+	public final static OdfStyleProperty PrintContent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-content"));
+
+	public final static OdfStyleProperty RepeatContent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "repeat-content"));
+
+	public final static OdfStyleProperty RotationAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-align"));
+
+	public final static OdfStyleProperty RotationAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-angle"));
+
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+
+	public final static OdfStyleProperty ShrinkToFit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shrink-to-fit"));
+
+	public final static OdfStyleProperty TextAlignSource =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-align-source"));
+
+	public final static OdfStyleProperty VerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderAttribute() {
+		FoBorderAttribute attr = (FoBorderAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderAttribute</code> , See {@odf.attribute fo:border}
+	 *
+	 * @param foBorderValue   The type is <code>String</code>
+	 */
+	public void setFoBorderAttribute(String foBorderValue) {
+		FoBorderAttribute attr = new FoBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderBottomAttribute() {
+		FoBorderBottomAttribute attr = (FoBorderBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderBottomAttribute</code> , See {@odf.attribute fo:border-bottom}
+	 *
+	 * @param foBorderBottomValue   The type is <code>String</code>
+	 */
+	public void setFoBorderBottomAttribute(String foBorderBottomValue) {
+		FoBorderBottomAttribute attr = new FoBorderBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderLeftAttribute() {
+		FoBorderLeftAttribute attr = (FoBorderLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderLeftAttribute</code> , See {@odf.attribute fo:border-left}
+	 *
+	 * @param foBorderLeftValue   The type is <code>String</code>
+	 */
+	public void setFoBorderLeftAttribute(String foBorderLeftValue) {
+		FoBorderLeftAttribute attr = new FoBorderLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderRightAttribute() {
+		FoBorderRightAttribute attr = (FoBorderRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderRightAttribute</code> , See {@odf.attribute fo:border-right}
+	 *
+	 * @param foBorderRightValue   The type is <code>String</code>
+	 */
+	public void setFoBorderRightAttribute(String foBorderRightValue) {
+		FoBorderRightAttribute attr = new FoBorderRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBorderTopAttribute() {
+		FoBorderTopAttribute attr = (FoBorderTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "border-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBorderTopAttribute</code> , See {@odf.attribute fo:border-top}
+	 *
+	 * @param foBorderTopValue   The type is <code>String</code>
+	 */
+	public void setFoBorderTopAttribute(String foBorderTopValue) {
+		FoBorderTopAttribute attr = new FoBorderTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBorderTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingAttribute() {
+		FoPaddingAttribute attr = (FoPaddingAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingAttribute</code> , See {@odf.attribute fo:padding}
+	 *
+	 * @param foPaddingValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingAttribute(String foPaddingValue) {
+		FoPaddingAttribute attr = new FoPaddingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingBottomAttribute() {
+		FoPaddingBottomAttribute attr = (FoPaddingBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingBottomAttribute</code> , See {@odf.attribute fo:padding-bottom}
+	 *
+	 * @param foPaddingBottomValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingBottomAttribute(String foPaddingBottomValue) {
+		FoPaddingBottomAttribute attr = new FoPaddingBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingLeftAttribute() {
+		FoPaddingLeftAttribute attr = (FoPaddingLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingLeftAttribute</code> , See {@odf.attribute fo:padding-left}
+	 *
+	 * @param foPaddingLeftValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingLeftAttribute(String foPaddingLeftValue) {
+		FoPaddingLeftAttribute attr = new FoPaddingLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingRightAttribute() {
+		FoPaddingRightAttribute attr = (FoPaddingRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingRightAttribute</code> , See {@odf.attribute fo:padding-right}
+	 *
+	 * @param foPaddingRightValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingRightAttribute(String foPaddingRightValue) {
+		FoPaddingRightAttribute attr = new FoPaddingRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoPaddingTopAttribute() {
+		FoPaddingTopAttribute attr = (FoPaddingTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "padding-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoPaddingTopAttribute</code> , See {@odf.attribute fo:padding-top}
+	 *
+	 * @param foPaddingTopValue   The type is <code>String</code>
+	 */
+	public void setFoPaddingTopAttribute(String foPaddingTopValue) {
+		FoPaddingTopAttribute attr = new FoPaddingTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foPaddingTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoWrapOptionAttribute</code> , See {@odf.attribute fo:wrap-option}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoWrapOptionAttribute() {
+		FoWrapOptionAttribute attr = (FoWrapOptionAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "wrap-option");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoWrapOptionAttribute</code> , See {@odf.attribute fo:wrap-option}
+	 *
+	 * @param foWrapOptionValue   The type is <code>String</code>
+	 */
+	public void setFoWrapOptionAttribute(String foWrapOptionValue) {
+		FoWrapOptionAttribute attr = new FoWrapOptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foWrapOptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthAttribute() {
+		StyleBorderLineWidthAttribute attr = (StyleBorderLineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthAttribute</code> , See {@odf.attribute style:border-line-width}
+	 *
+	 * @param styleBorderLineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthAttribute(String styleBorderLineWidthValue) {
+		StyleBorderLineWidthAttribute attr = new StyleBorderLineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthBottomAttribute() {
+		StyleBorderLineWidthBottomAttribute attr = (StyleBorderLineWidthBottomAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthBottomAttribute</code> , See {@odf.attribute style:border-line-width-bottom}
+	 *
+	 * @param styleBorderLineWidthBottomValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthBottomAttribute(String styleBorderLineWidthBottomValue) {
+		StyleBorderLineWidthBottomAttribute attr = new StyleBorderLineWidthBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthLeftAttribute() {
+		StyleBorderLineWidthLeftAttribute attr = (StyleBorderLineWidthLeftAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthLeftAttribute</code> , See {@odf.attribute style:border-line-width-left}
+	 *
+	 * @param styleBorderLineWidthLeftValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthLeftAttribute(String styleBorderLineWidthLeftValue) {
+		StyleBorderLineWidthLeftAttribute attr = new StyleBorderLineWidthLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthRightAttribute() {
+		StyleBorderLineWidthRightAttribute attr = (StyleBorderLineWidthRightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthRightAttribute</code> , See {@odf.attribute style:border-line-width-right}
+	 *
+	 * @param styleBorderLineWidthRightValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthRightAttribute(String styleBorderLineWidthRightValue) {
+		StyleBorderLineWidthRightAttribute attr = new StyleBorderLineWidthRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleBorderLineWidthTopAttribute() {
+		StyleBorderLineWidthTopAttribute attr = (StyleBorderLineWidthTopAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "border-line-width-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleBorderLineWidthTopAttribute</code> , See {@odf.attribute style:border-line-width-top}
+	 *
+	 * @param styleBorderLineWidthTopValue   The type is <code>String</code>
+	 */
+	public void setStyleBorderLineWidthTopAttribute(String styleBorderLineWidthTopValue) {
+		StyleBorderLineWidthTopAttribute attr = new StyleBorderLineWidthTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleBorderLineWidthTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleCellProtectAttribute</code> , See {@odf.attribute style:cell-protect}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleCellProtectAttribute() {
+		StyleCellProtectAttribute attr = (StyleCellProtectAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "cell-protect");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleCellProtectAttribute</code> , See {@odf.attribute style:cell-protect}
+	 *
+	 * @param styleCellProtectValue   The type is <code>String</code>
+	 */
+	public void setStyleCellProtectAttribute(String styleCellProtectValue) {
+		StyleCellProtectAttribute attr = new StyleCellProtectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleCellProtectValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDecimalPlacesAttribute</code> , See {@odf.attribute style:decimal-places}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStyleDecimalPlacesAttribute() {
+		StyleDecimalPlacesAttribute attr = (StyleDecimalPlacesAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "decimal-places");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDecimalPlacesAttribute</code> , See {@odf.attribute style:decimal-places}
+	 *
+	 * @param styleDecimalPlacesValue   The type is <code>Integer</code>
+	 */
+	public void setStyleDecimalPlacesAttribute(Integer styleDecimalPlacesValue) {
+		StyleDecimalPlacesAttribute attr = new StyleDecimalPlacesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(styleDecimalPlacesValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDiagonalBlTrAttribute</code> , See {@odf.attribute style:diagonal-bl-tr}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDiagonalBlTrAttribute() {
+		StyleDiagonalBlTrAttribute attr = (StyleDiagonalBlTrAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "diagonal-bl-tr");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDiagonalBlTrAttribute</code> , See {@odf.attribute style:diagonal-bl-tr}
+	 *
+	 * @param styleDiagonalBlTrValue   The type is <code>String</code>
+	 */
+	public void setStyleDiagonalBlTrAttribute(String styleDiagonalBlTrValue) {
+		StyleDiagonalBlTrAttribute attr = new StyleDiagonalBlTrAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDiagonalBlTrValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDiagonalBlTrWidthsAttribute</code> , See {@odf.attribute style:diagonal-bl-tr-widths}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDiagonalBlTrWidthsAttribute() {
+		StyleDiagonalBlTrWidthsAttribute attr = (StyleDiagonalBlTrWidthsAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "diagonal-bl-tr-widths");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDiagonalBlTrWidthsAttribute</code> , See {@odf.attribute style:diagonal-bl-tr-widths}
+	 *
+	 * @param styleDiagonalBlTrWidthsValue   The type is <code>String</code>
+	 */
+	public void setStyleDiagonalBlTrWidthsAttribute(String styleDiagonalBlTrWidthsValue) {
+		StyleDiagonalBlTrWidthsAttribute attr = new StyleDiagonalBlTrWidthsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDiagonalBlTrWidthsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDiagonalTlBrAttribute</code> , See {@odf.attribute style:diagonal-tl-br}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDiagonalTlBrAttribute() {
+		StyleDiagonalTlBrAttribute attr = (StyleDiagonalTlBrAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "diagonal-tl-br");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDiagonalTlBrAttribute</code> , See {@odf.attribute style:diagonal-tl-br}
+	 *
+	 * @param styleDiagonalTlBrValue   The type is <code>String</code>
+	 */
+	public void setStyleDiagonalTlBrAttribute(String styleDiagonalTlBrValue) {
+		StyleDiagonalTlBrAttribute attr = new StyleDiagonalTlBrAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDiagonalTlBrValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDiagonalTlBrWidthsAttribute</code> , See {@odf.attribute style:diagonal-tl-br-widths}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDiagonalTlBrWidthsAttribute() {
+		StyleDiagonalTlBrWidthsAttribute attr = (StyleDiagonalTlBrWidthsAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "diagonal-tl-br-widths");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDiagonalTlBrWidthsAttribute</code> , See {@odf.attribute style:diagonal-tl-br-widths}
+	 *
+	 * @param styleDiagonalTlBrWidthsValue   The type is <code>String</code>
+	 */
+	public void setStyleDiagonalTlBrWidthsAttribute(String styleDiagonalTlBrWidthsValue) {
+		StyleDiagonalTlBrWidthsAttribute attr = new StyleDiagonalTlBrWidthsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDiagonalTlBrWidthsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDirectionAttribute</code> , See {@odf.attribute style:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDirectionAttribute() {
+		StyleDirectionAttribute attr = (StyleDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDirectionAttribute</code> , See {@odf.attribute style:direction}
+	 *
+	 * @param styleDirectionValue   The type is <code>String</code>
+	 */
+	public void setStyleDirectionAttribute(String styleDirectionValue) {
+		StyleDirectionAttribute attr = new StyleDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleGlyphOrientationVerticalAttribute</code> , See {@odf.attribute style:glyph-orientation-vertical}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleGlyphOrientationVerticalAttribute() {
+		StyleGlyphOrientationVerticalAttribute attr = (StyleGlyphOrientationVerticalAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "glyph-orientation-vertical");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleGlyphOrientationVerticalAttribute</code> , See {@odf.attribute style:glyph-orientation-vertical}
+	 *
+	 * @param styleGlyphOrientationVerticalValue   The type is <code>String</code>
+	 */
+	public void setStyleGlyphOrientationVerticalAttribute(String styleGlyphOrientationVerticalValue) {
+		StyleGlyphOrientationVerticalAttribute attr = new StyleGlyphOrientationVerticalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleGlyphOrientationVerticalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePrintContentAttribute</code> , See {@odf.attribute style:print-content}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStylePrintContentAttribute() {
+		StylePrintContentAttribute attr = (StylePrintContentAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "print-content");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePrintContentAttribute</code> , See {@odf.attribute style:print-content}
+	 *
+	 * @param stylePrintContentValue   The type is <code>Boolean</code>
+	 */
+	public void setStylePrintContentAttribute(Boolean stylePrintContentValue) {
+		StylePrintContentAttribute attr = new StylePrintContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(stylePrintContentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRepeatContentAttribute</code> , See {@odf.attribute style:repeat-content}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleRepeatContentAttribute() {
+		StyleRepeatContentAttribute attr = (StyleRepeatContentAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "repeat-content");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRepeatContentAttribute</code> , See {@odf.attribute style:repeat-content}
+	 *
+	 * @param styleRepeatContentValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleRepeatContentAttribute(Boolean styleRepeatContentValue) {
+		StyleRepeatContentAttribute attr = new StyleRepeatContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleRepeatContentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRotationAlignAttribute</code> , See {@odf.attribute style:rotation-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRotationAlignAttribute() {
+		StyleRotationAlignAttribute attr = (StyleRotationAlignAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rotation-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRotationAlignAttribute</code> , See {@odf.attribute style:rotation-align}
+	 *
+	 * @param styleRotationAlignValue   The type is <code>String</code>
+	 */
+	public void setStyleRotationAlignAttribute(String styleRotationAlignValue) {
+		StyleRotationAlignAttribute attr = new StyleRotationAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRotationAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRotationAngleAttribute</code> , See {@odf.attribute style:rotation-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRotationAngleAttribute() {
+		StyleRotationAngleAttribute attr = (StyleRotationAngleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rotation-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRotationAngleAttribute</code> , See {@odf.attribute style:rotation-angle}
+	 *
+	 * @param styleRotationAngleValue   The type is <code>String</code>
+	 */
+	public void setStyleRotationAngleAttribute(String styleRotationAngleValue) {
+		StyleRotationAngleAttribute attr = new StyleRotationAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRotationAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleShadowAttribute() {
+		StyleShadowAttribute attr = (StyleShadowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @param styleShadowValue   The type is <code>String</code>
+	 */
+	public void setStyleShadowAttribute(String styleShadowValue) {
+		StyleShadowAttribute attr = new StyleShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShrinkToFitAttribute</code> , See {@odf.attribute style:shrink-to-fit}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleShrinkToFitAttribute() {
+		StyleShrinkToFitAttribute attr = (StyleShrinkToFitAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shrink-to-fit");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShrinkToFitAttribute</code> , See {@odf.attribute style:shrink-to-fit}
+	 *
+	 * @param styleShrinkToFitValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleShrinkToFitAttribute(Boolean styleShrinkToFitValue) {
+		StyleShrinkToFitAttribute attr = new StyleShrinkToFitAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleShrinkToFitValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextAlignSourceAttribute</code> , See {@odf.attribute style:text-align-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextAlignSourceAttribute() {
+		StyleTextAlignSourceAttribute attr = (StyleTextAlignSourceAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-align-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextAlignSourceAttribute</code> , See {@odf.attribute style:text-align-source}
+	 *
+	 * @param styleTextAlignSourceValue   The type is <code>String</code>
+	 */
+	public void setStyleTextAlignSourceAttribute(String styleTextAlignSourceValue) {
+		StyleTextAlignSourceAttribute attr = new StyleTextAlignSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextAlignSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleVerticalAlignAttribute</code> , See {@odf.attribute style:vertical-align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleVerticalAlignAttribute() {
+		StyleVerticalAlignAttribute attr = (StyleVerticalAlignAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "vertical-align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleVerticalAlignAttribute</code> , See {@odf.attribute style:vertical-align}
+	 *
+	 * @param styleVerticalAlignValue   The type is <code>String</code>
+	 */
+	public void setStyleVerticalAlignAttribute(String styleVerticalAlignValue) {
+		StyleVerticalAlignAttribute attr = new StyleVerticalAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleVerticalAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWritingModeAttribute() {
+		StyleWritingModeAttribute attr = (StyleWritingModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @param styleWritingModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWritingModeAttribute(String styleWritingModeValue) {
+		StyleWritingModeAttribute attr = new StyleWritingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWritingModeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableColumnPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableColumnPropertiesElement.java
new file mode 100644
index 0000000..c7226c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableColumnPropertiesElement.java
@@ -0,0 +1,214 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakBeforeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleColumnWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelColumnWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleUseOptimalColumnWidthAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:table-column-properties}.
+ *
+ */
+public class StyleTableColumnPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "table-column-properties");
+
+	/**
+	 * Create the instance of <code>StyleTableColumnPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTableColumnPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:table-column-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+
+	public final static OdfStyleProperty ColumnWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "column-width"));
+
+	public final static OdfStyleProperty RelColumnWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-column-width"));
+
+	public final static OdfStyleProperty UseOptimalColumnWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "use-optimal-column-width"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakAfterAttribute() {
+		FoBreakAfterAttribute attr = (FoBreakAfterAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-after");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @param foBreakAfterValue   The type is <code>String</code>
+	 */
+	public void setFoBreakAfterAttribute(String foBreakAfterValue) {
+		FoBreakAfterAttribute attr = new FoBreakAfterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakAfterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakBeforeAttribute() {
+		FoBreakBeforeAttribute attr = (FoBreakBeforeAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-before");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @param foBreakBeforeValue   The type is <code>String</code>
+	 */
+	public void setFoBreakBeforeAttribute(String foBreakBeforeValue) {
+		FoBreakBeforeAttribute attr = new FoBreakBeforeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakBeforeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleColumnWidthAttribute</code> , See {@odf.attribute style:column-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleColumnWidthAttribute() {
+		StyleColumnWidthAttribute attr = (StyleColumnWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "column-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleColumnWidthAttribute</code> , See {@odf.attribute style:column-width}
+	 *
+	 * @param styleColumnWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleColumnWidthAttribute(String styleColumnWidthValue) {
+		StyleColumnWidthAttribute attr = new StyleColumnWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleColumnWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelColumnWidthAttribute</code> , See {@odf.attribute style:rel-column-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelColumnWidthAttribute() {
+		StyleRelColumnWidthAttribute attr = (StyleRelColumnWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-column-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelColumnWidthAttribute</code> , See {@odf.attribute style:rel-column-width}
+	 *
+	 * @param styleRelColumnWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleRelColumnWidthAttribute(String styleRelColumnWidthValue) {
+		StyleRelColumnWidthAttribute attr = new StyleRelColumnWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelColumnWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleUseOptimalColumnWidthAttribute</code> , See {@odf.attribute style:use-optimal-column-width}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleUseOptimalColumnWidthAttribute() {
+		StyleUseOptimalColumnWidthAttribute attr = (StyleUseOptimalColumnWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "use-optimal-column-width");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleUseOptimalColumnWidthAttribute</code> , See {@odf.attribute style:use-optimal-column-width}
+	 *
+	 * @param styleUseOptimalColumnWidthValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleUseOptimalColumnWidthAttribute(Boolean styleUseOptimalColumnWidthValue) {
+		StyleUseOptimalColumnWidthAttribute attr = new StyleUseOptimalColumnWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleUseOptimalColumnWidthValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTablePropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTablePropertiesElement.java
new file mode 100644
index 0000000..0916c83
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTablePropertiesElement.java
@@ -0,0 +1,591 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakBeforeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoKeepWithNextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleMayBreakBetweenRowsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWritingModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBorderModelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:table-properties}.
+ *
+ */
+public class StyleTablePropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "table-properties");
+
+	/**
+	 * Create the instance of <code>StyleTablePropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTablePropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:table-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+
+	public final static OdfStyleProperty KeepWithNext =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-with-next"));
+
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+
+	public final static OdfStyleProperty MayBreakBetweenRows =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "may-break-between-rows"));
+
+	public final static OdfStyleProperty PageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "page-number"));
+
+	public final static OdfStyleProperty RelWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-width"));
+
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+
+	public final static OdfStyleProperty Width =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "width"));
+
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+
+	public final static OdfStyleProperty Align =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.TABLE, "align"));
+
+	public final static OdfStyleProperty BorderModel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.TABLE, "border-model"));
+
+	public final static OdfStyleProperty Display =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.TABLE, "display"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakAfterAttribute() {
+		FoBreakAfterAttribute attr = (FoBreakAfterAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-after");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @param foBreakAfterValue   The type is <code>String</code>
+	 */
+	public void setFoBreakAfterAttribute(String foBreakAfterValue) {
+		FoBreakAfterAttribute attr = new FoBreakAfterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakAfterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakBeforeAttribute() {
+		FoBreakBeforeAttribute attr = (FoBreakBeforeAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-before");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @param foBreakBeforeValue   The type is <code>String</code>
+	 */
+	public void setFoBreakBeforeAttribute(String foBreakBeforeValue) {
+		FoBreakBeforeAttribute attr = new FoBreakBeforeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakBeforeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoKeepWithNextAttribute</code> , See {@odf.attribute fo:keep-with-next}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoKeepWithNextAttribute() {
+		FoKeepWithNextAttribute attr = (FoKeepWithNextAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "keep-with-next");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoKeepWithNextAttribute</code> , See {@odf.attribute fo:keep-with-next}
+	 *
+	 * @param foKeepWithNextValue   The type is <code>String</code>
+	 */
+	public void setFoKeepWithNextAttribute(String foKeepWithNextValue) {
+		FoKeepWithNextAttribute attr = new FoKeepWithNextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foKeepWithNextValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginAttribute() {
+		FoMarginAttribute attr = (FoMarginAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginAttribute</code> , See {@odf.attribute fo:margin}
+	 *
+	 * @param foMarginValue   The type is <code>String</code>
+	 */
+	public void setFoMarginAttribute(String foMarginValue) {
+		FoMarginAttribute attr = new FoMarginAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginBottomAttribute() {
+		FoMarginBottomAttribute attr = (FoMarginBottomAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-bottom");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginBottomAttribute</code> , See {@odf.attribute fo:margin-bottom}
+	 *
+	 * @param foMarginBottomValue   The type is <code>String</code>
+	 */
+	public void setFoMarginBottomAttribute(String foMarginBottomValue) {
+		FoMarginBottomAttribute attr = new FoMarginBottomAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginBottomValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginLeftAttribute() {
+		FoMarginLeftAttribute attr = (FoMarginLeftAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-left");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginLeftAttribute</code> , See {@odf.attribute fo:margin-left}
+	 *
+	 * @param foMarginLeftValue   The type is <code>String</code>
+	 */
+	public void setFoMarginLeftAttribute(String foMarginLeftValue) {
+		FoMarginLeftAttribute attr = new FoMarginLeftAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginLeftValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginRightAttribute() {
+		FoMarginRightAttribute attr = (FoMarginRightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-right");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginRightAttribute</code> , See {@odf.attribute fo:margin-right}
+	 *
+	 * @param foMarginRightValue   The type is <code>String</code>
+	 */
+	public void setFoMarginRightAttribute(String foMarginRightValue) {
+		FoMarginRightAttribute attr = new FoMarginRightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginRightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoMarginTopAttribute() {
+		FoMarginTopAttribute attr = (FoMarginTopAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "margin-top");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoMarginTopAttribute</code> , See {@odf.attribute fo:margin-top}
+	 *
+	 * @param foMarginTopValue   The type is <code>String</code>
+	 */
+	public void setFoMarginTopAttribute(String foMarginTopValue) {
+		FoMarginTopAttribute attr = new FoMarginTopAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foMarginTopValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleMayBreakBetweenRowsAttribute</code> , See {@odf.attribute style:may-break-between-rows}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleMayBreakBetweenRowsAttribute() {
+		StyleMayBreakBetweenRowsAttribute attr = (StyleMayBreakBetweenRowsAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "may-break-between-rows");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleMayBreakBetweenRowsAttribute</code> , See {@odf.attribute style:may-break-between-rows}
+	 *
+	 * @param styleMayBreakBetweenRowsValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleMayBreakBetweenRowsAttribute(Boolean styleMayBreakBetweenRowsValue) {
+		StyleMayBreakBetweenRowsAttribute attr = new StyleMayBreakBetweenRowsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleMayBreakBetweenRowsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePageNumberAttribute</code> , See {@odf.attribute style:page-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getStylePageNumberAttribute() {
+		StylePageNumberAttribute attr = (StylePageNumberAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "page-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePageNumberAttribute</code> , See {@odf.attribute style:page-number}
+	 *
+	 * @param stylePageNumberValue   The type is <code>Integer</code>
+	 */
+	public void setStylePageNumberAttribute(Integer stylePageNumberValue) {
+		StylePageNumberAttribute attr = new StylePageNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(stylePageNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRelWidthAttribute() {
+		StyleRelWidthAttribute attr = (StyleRelWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rel-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRelWidthAttribute</code> , See {@odf.attribute style:rel-width}
+	 *
+	 * @param styleRelWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleRelWidthAttribute(String styleRelWidthValue) {
+		StyleRelWidthAttribute attr = new StyleRelWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRelWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleShadowAttribute() {
+		StyleShadowAttribute attr = (StyleShadowAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleShadowAttribute</code> , See {@odf.attribute style:shadow}
+	 *
+	 * @param styleShadowValue   The type is <code>String</code>
+	 */
+	public void setStyleShadowAttribute(String styleShadowValue) {
+		StyleShadowAttribute attr = new StyleShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWidthAttribute</code> , See {@odf.attribute style:width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWidthAttribute() {
+		StyleWidthAttribute attr = (StyleWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWidthAttribute</code> , See {@odf.attribute style:width}
+	 *
+	 * @param styleWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleWidthAttribute(String styleWidthValue) {
+		StyleWidthAttribute attr = new StyleWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleWritingModeAttribute() {
+		StyleWritingModeAttribute attr = (StyleWritingModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "writing-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleWritingModeAttribute</code> , See {@odf.attribute style:writing-mode}
+	 *
+	 * @param styleWritingModeValue   The type is <code>String</code>
+	 */
+	public void setStyleWritingModeAttribute(String styleWritingModeValue) {
+		StyleWritingModeAttribute attr = new StyleWritingModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleWritingModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAlignAttribute</code> , See {@odf.attribute table:align}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableAlignAttribute() {
+		TableAlignAttribute attr = (TableAlignAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "align");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAlignAttribute</code> , See {@odf.attribute table:align}
+	 *
+	 * @param tableAlignValue   The type is <code>String</code>
+	 */
+	public void setTableAlignAttribute(String tableAlignValue) {
+		TableAlignAttribute attr = new TableAlignAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableAlignValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBorderModelAttribute</code> , See {@odf.attribute table:border-model}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableBorderModelAttribute() {
+		TableBorderModelAttribute attr = (TableBorderModelAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "border-model");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBorderModelAttribute</code> , See {@odf.attribute table:border-model}
+	 *
+	 * @param tableBorderModelValue   The type is <code>String</code>
+	 */
+	public void setTableBorderModelAttribute(String tableBorderModelValue) {
+		TableBorderModelAttribute attr = new TableBorderModelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableBorderModelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayAttribute() {
+		TableDisplayAttribute attr = (TableDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @param tableDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayAttribute(Boolean tableDisplayValue) {
+		TableDisplayAttribute attr = new TableDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableRowPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableRowPropertiesElement.java
new file mode 100644
index 0000000..1789f87
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTableRowPropertiesElement.java
@@ -0,0 +1,283 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakBeforeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoKeepTogetherAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleMinRowHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRowHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleUseOptimalRowHeightAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:table-row-properties}.
+ *
+ */
+public class StyleTableRowPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "table-row-properties");
+
+	/**
+	 * Create the instance of <code>StyleTableRowPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTableRowPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:table-row-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+
+	public final static OdfStyleProperty KeepTogether =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-together"));
+
+	public final static OdfStyleProperty MinRowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "min-row-height"));
+
+	public final static OdfStyleProperty RowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "row-height"));
+
+	public final static OdfStyleProperty UseOptimalRowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "use-optimal-row-height"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakAfterAttribute() {
+		FoBreakAfterAttribute attr = (FoBreakAfterAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-after");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakAfterAttribute</code> , See {@odf.attribute fo:break-after}
+	 *
+	 * @param foBreakAfterValue   The type is <code>String</code>
+	 */
+	public void setFoBreakAfterAttribute(String foBreakAfterValue) {
+		FoBreakAfterAttribute attr = new FoBreakAfterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakAfterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBreakBeforeAttribute() {
+		FoBreakBeforeAttribute attr = (FoBreakBeforeAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "break-before");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBreakBeforeAttribute</code> , See {@odf.attribute fo:break-before}
+	 *
+	 * @param foBreakBeforeValue   The type is <code>String</code>
+	 */
+	public void setFoBreakBeforeAttribute(String foBreakBeforeValue) {
+		FoBreakBeforeAttribute attr = new FoBreakBeforeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBreakBeforeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoKeepTogetherAttribute</code> , See {@odf.attribute fo:keep-together}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoKeepTogetherAttribute() {
+		FoKeepTogetherAttribute attr = (FoKeepTogetherAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "keep-together");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoKeepTogetherAttribute</code> , See {@odf.attribute fo:keep-together}
+	 *
+	 * @param foKeepTogetherValue   The type is <code>String</code>
+	 */
+	public void setFoKeepTogetherAttribute(String foKeepTogetherValue) {
+		FoKeepTogetherAttribute attr = new FoKeepTogetherAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foKeepTogetherValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleMinRowHeightAttribute</code> , See {@odf.attribute style:min-row-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleMinRowHeightAttribute() {
+		StyleMinRowHeightAttribute attr = (StyleMinRowHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "min-row-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleMinRowHeightAttribute</code> , See {@odf.attribute style:min-row-height}
+	 *
+	 * @param styleMinRowHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleMinRowHeightAttribute(String styleMinRowHeightValue) {
+		StyleMinRowHeightAttribute attr = new StyleMinRowHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleMinRowHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRowHeightAttribute</code> , See {@odf.attribute style:row-height}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRowHeightAttribute() {
+		StyleRowHeightAttribute attr = (StyleRowHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "row-height");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRowHeightAttribute</code> , See {@odf.attribute style:row-height}
+	 *
+	 * @param styleRowHeightValue   The type is <code>String</code>
+	 */
+	public void setStyleRowHeightAttribute(String styleRowHeightValue) {
+		StyleRowHeightAttribute attr = new StyleRowHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRowHeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleUseOptimalRowHeightAttribute</code> , See {@odf.attribute style:use-optimal-row-height}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleUseOptimalRowHeightAttribute() {
+		StyleUseOptimalRowHeightAttribute attr = (StyleUseOptimalRowHeightAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "use-optimal-row-height");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleUseOptimalRowHeightAttribute</code> , See {@odf.attribute style:use-optimal-row-height}
+	 *
+	 * @param styleUseOptimalRowHeightValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleUseOptimalRowHeightAttribute(Boolean styleUseOptimalRowHeightValue) {
+		StyleUseOptimalRowHeightAttribute attr = new StyleUseOptimalRowHeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleUseOptimalRowHeightValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element style:background-image}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element style:background-image}
+	 */
+	public StyleBackgroundImageElement newStyleBackgroundImageElement() {
+		StyleBackgroundImageElement styleBackgroundImage = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleBackgroundImageElement.class);
+		this.appendChild(styleBackgroundImage);
+		return styleBackgroundImage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTextPropertiesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTextPropertiesElement.java
new file mode 100644
index 0000000..59e836e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/style/StyleTextPropertiesElement.java
@@ -0,0 +1,2428 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.style;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontFamilyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontVariantAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontWeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoHyphenateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoHyphenationPushCharCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoHyphenationRemainCharCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoLetterSpacingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextShadowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleCountryAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleCountryComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontCharsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontCharsetAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontCharsetComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontFamilyAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontFamilyComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontFamilyGenericAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontFamilyGenericAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontFamilyGenericComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontPitchAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontPitchAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontPitchComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontReliefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeRelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeRelAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeRelComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleNameAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleNameComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontWeightAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontWeightComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLanguageAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLanguageComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLetterKerningAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRfcLanguageTagAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRfcLanguageTagComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleScriptAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleScriptComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleScriptTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextBlinkingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextCombineAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextCombineEndCharAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextCombineStartCharAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextEmphasizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughTextAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughTextStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextOutlineAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextOverlineColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextOverlineModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextOverlineStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextOverlineTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextOverlineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextRotationAngleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextRotationScaleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextScaleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleUseWindowFontColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element style:text-properties}.
+ *
+ */
+public class StyleTextPropertiesElement extends OdfStylePropertiesBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.STYLE, "text-properties");
+
+	/**
+	 * Create the instance of <code>StyleTextPropertiesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public StyleTextPropertiesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element style:text-properties}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+
+	public final static OdfStyleProperty Color =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "color"));
+
+	public final static OdfStyleProperty Country =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "country"));
+
+	public final static OdfStyleProperty FontFamily =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-family"));
+
+	public final static OdfStyleProperty FontSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-size"));
+
+	public final static OdfStyleProperty FontStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-style"));
+
+	public final static OdfStyleProperty FontVariant =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-variant"));
+
+	public final static OdfStyleProperty FontWeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-weight"));
+
+	public final static OdfStyleProperty Hyphenate =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenate"));
+
+	public final static OdfStyleProperty HyphenationPushCharCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-push-char-count"));
+
+	public final static OdfStyleProperty HyphenationRemainCharCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-remain-char-count"));
+
+	public final static OdfStyleProperty Language =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "language"));
+
+	public final static OdfStyleProperty LetterSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "letter-spacing"));
+
+	public final static OdfStyleProperty Script =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "script"));
+
+	public final static OdfStyleProperty TextShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-shadow"));
+
+	public final static OdfStyleProperty TextTransform =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-transform"));
+
+	public final static OdfStyleProperty CountryAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "country-asian"));
+
+	public final static OdfStyleProperty CountryComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "country-complex"));
+
+	public final static OdfStyleProperty FontCharset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset"));
+
+	public final static OdfStyleProperty FontCharsetAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset-asian"));
+
+	public final static OdfStyleProperty FontCharsetComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset-complex"));
+
+	public final static OdfStyleProperty FontFamilyAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-asian"));
+
+	public final static OdfStyleProperty FontFamilyComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-complex"));
+
+	public final static OdfStyleProperty FontFamilyGeneric =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic"));
+
+	public final static OdfStyleProperty FontFamilyGenericAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic-asian"));
+
+	public final static OdfStyleProperty FontFamilyGenericComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic-complex"));
+
+	public final static OdfStyleProperty FontName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name"));
+
+	public final static OdfStyleProperty FontNameAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name-asian"));
+
+	public final static OdfStyleProperty FontNameComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name-complex"));
+
+	public final static OdfStyleProperty FontPitch =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch"));
+
+	public final static OdfStyleProperty FontPitchAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch-asian"));
+
+	public final static OdfStyleProperty FontPitchComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch-complex"));
+
+	public final static OdfStyleProperty FontRelief =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-relief"));
+
+	public final static OdfStyleProperty FontSizeAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-asian"));
+
+	public final static OdfStyleProperty FontSizeComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-complex"));
+
+	public final static OdfStyleProperty FontSizeRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel"));
+
+	public final static OdfStyleProperty FontSizeRelAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel-asian"));
+
+	public final static OdfStyleProperty FontSizeRelComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel-complex"));
+
+	public final static OdfStyleProperty FontStyleAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-asian"));
+
+	public final static OdfStyleProperty FontStyleComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-complex"));
+
+	public final static OdfStyleProperty FontStyleName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name"));
+
+	public final static OdfStyleProperty FontStyleNameAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name-asian"));
+
+	public final static OdfStyleProperty FontStyleNameComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name-complex"));
+
+	public final static OdfStyleProperty FontWeightAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-weight-asian"));
+
+	public final static OdfStyleProperty FontWeightComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-weight-complex"));
+
+	public final static OdfStyleProperty LanguageAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "language-asian"));
+
+	public final static OdfStyleProperty LanguageComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "language-complex"));
+
+	public final static OdfStyleProperty LetterKerning =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "letter-kerning"));
+
+	public final static OdfStyleProperty RfcLanguageTag =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag"));
+
+	public final static OdfStyleProperty RfcLanguageTagAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag-asian"));
+
+	public final static OdfStyleProperty RfcLanguageTagComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag-complex"));
+
+	public final static OdfStyleProperty ScriptAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "script-asian"));
+
+	public final static OdfStyleProperty ScriptComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "script-complex"));
+
+	public final static OdfStyleProperty ScriptType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "script-type"));
+
+	public final static OdfStyleProperty TextBlinking =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-blinking"));
+
+	public final static OdfStyleProperty TextCombine =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine"));
+
+	public final static OdfStyleProperty TextCombineEndChar =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine-end-char"));
+
+	public final static OdfStyleProperty TextCombineStartChar =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine-start-char"));
+
+	public final static OdfStyleProperty TextEmphasize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-emphasize"));
+
+	public final static OdfStyleProperty TextLineThroughColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-color"));
+
+	public final static OdfStyleProperty TextLineThroughMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-mode"));
+
+	public final static OdfStyleProperty TextLineThroughStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-style"));
+
+	public final static OdfStyleProperty TextLineThroughText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-text"));
+
+	public final static OdfStyleProperty TextLineThroughTextStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-text-style"));
+
+	public final static OdfStyleProperty TextLineThroughType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-type"));
+
+	public final static OdfStyleProperty TextLineThroughWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-width"));
+
+	public final static OdfStyleProperty TextOutline =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-outline"));
+
+	public final static OdfStyleProperty TextOverlineColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-color"));
+
+	public final static OdfStyleProperty TextOverlineMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-mode"));
+
+	public final static OdfStyleProperty TextOverlineStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-style"));
+
+	public final static OdfStyleProperty TextOverlineType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-type"));
+
+	public final static OdfStyleProperty TextOverlineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-width"));
+
+	public final static OdfStyleProperty TextPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-position"));
+
+	public final static OdfStyleProperty TextRotationAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-rotation-angle"));
+
+	public final static OdfStyleProperty TextRotationScale =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-rotation-scale"));
+
+	public final static OdfStyleProperty TextScale =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-scale"));
+
+	public final static OdfStyleProperty TextUnderlineColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-color"));
+
+	public final static OdfStyleProperty TextUnderlineMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-mode"));
+
+	public final static OdfStyleProperty TextUnderlineStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-style"));
+
+	public final static OdfStyleProperty TextUnderlineType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-type"));
+
+	public final static OdfStyleProperty TextUnderlineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-width"));
+
+	public final static OdfStyleProperty UseWindowFontColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "use-window-font-color"));
+
+	public final static OdfStyleProperty Condition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "condition"));
+
+	public final static OdfStyleProperty Display =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "display"));
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoBackgroundColorAttribute() {
+		FoBackgroundColorAttribute attr = (FoBackgroundColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "background-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoBackgroundColorAttribute</code> , See {@odf.attribute fo:background-color}
+	 *
+	 * @param foBackgroundColorValue   The type is <code>String</code>
+	 */
+	public void setFoBackgroundColorAttribute(String foBackgroundColorValue) {
+		FoBackgroundColorAttribute attr = new FoBackgroundColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foBackgroundColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoColorAttribute</code> , See {@odf.attribute fo:color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoColorAttribute() {
+		FoColorAttribute attr = (FoColorAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoColorAttribute</code> , See {@odf.attribute fo:color}
+	 *
+	 * @param foColorValue   The type is <code>String</code>
+	 */
+	public void setFoColorAttribute(String foColorValue) {
+		FoColorAttribute attr = new FoColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoCountryAttribute</code> , See {@odf.attribute fo:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoCountryAttribute() {
+		FoCountryAttribute attr = (FoCountryAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoCountryAttribute</code> , See {@odf.attribute fo:country}
+	 *
+	 * @param foCountryValue   The type is <code>String</code>
+	 */
+	public void setFoCountryAttribute(String foCountryValue) {
+		FoCountryAttribute attr = new FoCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoFontFamilyAttribute</code> , See {@odf.attribute fo:font-family}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoFontFamilyAttribute() {
+		FoFontFamilyAttribute attr = (FoFontFamilyAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "font-family");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoFontFamilyAttribute</code> , See {@odf.attribute fo:font-family}
+	 *
+	 * @param foFontFamilyValue   The type is <code>String</code>
+	 */
+	public void setFoFontFamilyAttribute(String foFontFamilyValue) {
+		FoFontFamilyAttribute attr = new FoFontFamilyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foFontFamilyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoFontSizeAttribute</code> , See {@odf.attribute fo:font-size}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoFontSizeAttribute() {
+		FoFontSizeAttribute attr = (FoFontSizeAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "font-size");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoFontSizeAttribute</code> , See {@odf.attribute fo:font-size}
+	 *
+	 * @param foFontSizeValue   The type is <code>String</code>
+	 */
+	public void setFoFontSizeAttribute(String foFontSizeValue) {
+		FoFontSizeAttribute attr = new FoFontSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foFontSizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoFontStyleAttribute</code> , See {@odf.attribute fo:font-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoFontStyleAttribute() {
+		FoFontStyleAttribute attr = (FoFontStyleAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "font-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoFontStyleAttribute</code> , See {@odf.attribute fo:font-style}
+	 *
+	 * @param foFontStyleValue   The type is <code>String</code>
+	 */
+	public void setFoFontStyleAttribute(String foFontStyleValue) {
+		FoFontStyleAttribute attr = new FoFontStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foFontStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoFontVariantAttribute</code> , See {@odf.attribute fo:font-variant}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoFontVariantAttribute() {
+		FoFontVariantAttribute attr = (FoFontVariantAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "font-variant");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoFontVariantAttribute</code> , See {@odf.attribute fo:font-variant}
+	 *
+	 * @param foFontVariantValue   The type is <code>String</code>
+	 */
+	public void setFoFontVariantAttribute(String foFontVariantValue) {
+		FoFontVariantAttribute attr = new FoFontVariantAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foFontVariantValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoFontWeightAttribute</code> , See {@odf.attribute fo:font-weight}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoFontWeightAttribute() {
+		FoFontWeightAttribute attr = (FoFontWeightAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "font-weight");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoFontWeightAttribute</code> , See {@odf.attribute fo:font-weight}
+	 *
+	 * @param foFontWeightValue   The type is <code>String</code>
+	 */
+	public void setFoFontWeightAttribute(String foFontWeightValue) {
+		FoFontWeightAttribute attr = new FoFontWeightAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foFontWeightValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoHyphenateAttribute</code> , See {@odf.attribute fo:hyphenate}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getFoHyphenateAttribute() {
+		FoHyphenateAttribute attr = (FoHyphenateAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "hyphenate");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoHyphenateAttribute</code> , See {@odf.attribute fo:hyphenate}
+	 *
+	 * @param foHyphenateValue   The type is <code>Boolean</code>
+	 */
+	public void setFoHyphenateAttribute(Boolean foHyphenateValue) {
+		FoHyphenateAttribute attr = new FoHyphenateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(foHyphenateValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoHyphenationPushCharCountAttribute</code> , See {@odf.attribute fo:hyphenation-push-char-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFoHyphenationPushCharCountAttribute() {
+		FoHyphenationPushCharCountAttribute attr = (FoHyphenationPushCharCountAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "hyphenation-push-char-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoHyphenationPushCharCountAttribute</code> , See {@odf.attribute fo:hyphenation-push-char-count}
+	 *
+	 * @param foHyphenationPushCharCountValue   The type is <code>Integer</code>
+	 */
+	public void setFoHyphenationPushCharCountAttribute(Integer foHyphenationPushCharCountValue) {
+		FoHyphenationPushCharCountAttribute attr = new FoHyphenationPushCharCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(foHyphenationPushCharCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoHyphenationRemainCharCountAttribute</code> , See {@odf.attribute fo:hyphenation-remain-char-count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFoHyphenationRemainCharCountAttribute() {
+		FoHyphenationRemainCharCountAttribute attr = (FoHyphenationRemainCharCountAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "hyphenation-remain-char-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoHyphenationRemainCharCountAttribute</code> , See {@odf.attribute fo:hyphenation-remain-char-count}
+	 *
+	 * @param foHyphenationRemainCharCountValue   The type is <code>Integer</code>
+	 */
+	public void setFoHyphenationRemainCharCountAttribute(Integer foHyphenationRemainCharCountValue) {
+		FoHyphenationRemainCharCountAttribute attr = new FoHyphenationRemainCharCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(foHyphenationRemainCharCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoLanguageAttribute</code> , See {@odf.attribute fo:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoLanguageAttribute() {
+		FoLanguageAttribute attr = (FoLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoLanguageAttribute</code> , See {@odf.attribute fo:language}
+	 *
+	 * @param foLanguageValue   The type is <code>String</code>
+	 */
+	public void setFoLanguageAttribute(String foLanguageValue) {
+		FoLanguageAttribute attr = new FoLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoLetterSpacingAttribute</code> , See {@odf.attribute fo:letter-spacing}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoLetterSpacingAttribute() {
+		FoLetterSpacingAttribute attr = (FoLetterSpacingAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "letter-spacing");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoLetterSpacingAttribute</code> , See {@odf.attribute fo:letter-spacing}
+	 *
+	 * @param foLetterSpacingValue   The type is <code>String</code>
+	 */
+	public void setFoLetterSpacingAttribute(String foLetterSpacingValue) {
+		FoLetterSpacingAttribute attr = new FoLetterSpacingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foLetterSpacingValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoScriptAttribute</code> , See {@odf.attribute fo:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoScriptAttribute() {
+		FoScriptAttribute attr = (FoScriptAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoScriptAttribute</code> , See {@odf.attribute fo:script}
+	 *
+	 * @param foScriptValue   The type is <code>String</code>
+	 */
+	public void setFoScriptAttribute(String foScriptValue) {
+		FoScriptAttribute attr = new FoScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextShadowAttribute</code> , See {@odf.attribute fo:text-shadow}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextShadowAttribute() {
+		FoTextShadowAttribute attr = (FoTextShadowAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-shadow");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextShadowAttribute</code> , See {@odf.attribute fo:text-shadow}
+	 *
+	 * @param foTextShadowValue   The type is <code>String</code>
+	 */
+	public void setFoTextShadowAttribute(String foTextShadowValue) {
+		FoTextShadowAttribute attr = new FoTextShadowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextShadowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoTextTransformAttribute</code> , See {@odf.attribute fo:text-transform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoTextTransformAttribute() {
+		FoTextTransformAttribute attr = (FoTextTransformAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "text-transform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoTextTransformAttribute</code> , See {@odf.attribute fo:text-transform}
+	 *
+	 * @param foTextTransformValue   The type is <code>String</code>
+	 */
+	public void setFoTextTransformAttribute(String foTextTransformValue) {
+		FoTextTransformAttribute attr = new FoTextTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foTextTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleCountryAsianAttribute</code> , See {@odf.attribute style:country-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleCountryAsianAttribute() {
+		StyleCountryAsianAttribute attr = (StyleCountryAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "country-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleCountryAsianAttribute</code> , See {@odf.attribute style:country-asian}
+	 *
+	 * @param styleCountryAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleCountryAsianAttribute(String styleCountryAsianValue) {
+		StyleCountryAsianAttribute attr = new StyleCountryAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleCountryAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleCountryComplexAttribute</code> , See {@odf.attribute style:country-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleCountryComplexAttribute() {
+		StyleCountryComplexAttribute attr = (StyleCountryComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "country-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleCountryComplexAttribute</code> , See {@odf.attribute style:country-complex}
+	 *
+	 * @param styleCountryComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleCountryComplexAttribute(String styleCountryComplexValue) {
+		StyleCountryComplexAttribute attr = new StyleCountryComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleCountryComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontCharsetAttribute</code> , See {@odf.attribute style:font-charset}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontCharsetAttribute() {
+		StyleFontCharsetAttribute attr = (StyleFontCharsetAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-charset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontCharsetAttribute</code> , See {@odf.attribute style:font-charset}
+	 *
+	 * @param styleFontCharsetValue   The type is <code>String</code>
+	 */
+	public void setStyleFontCharsetAttribute(String styleFontCharsetValue) {
+		StyleFontCharsetAttribute attr = new StyleFontCharsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontCharsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontCharsetAsianAttribute</code> , See {@odf.attribute style:font-charset-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontCharsetAsianAttribute() {
+		StyleFontCharsetAsianAttribute attr = (StyleFontCharsetAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-charset-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontCharsetAsianAttribute</code> , See {@odf.attribute style:font-charset-asian}
+	 *
+	 * @param styleFontCharsetAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontCharsetAsianAttribute(String styleFontCharsetAsianValue) {
+		StyleFontCharsetAsianAttribute attr = new StyleFontCharsetAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontCharsetAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontCharsetComplexAttribute</code> , See {@odf.attribute style:font-charset-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontCharsetComplexAttribute() {
+		StyleFontCharsetComplexAttribute attr = (StyleFontCharsetComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-charset-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontCharsetComplexAttribute</code> , See {@odf.attribute style:font-charset-complex}
+	 *
+	 * @param styleFontCharsetComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontCharsetComplexAttribute(String styleFontCharsetComplexValue) {
+		StyleFontCharsetComplexAttribute attr = new StyleFontCharsetComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontCharsetComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontFamilyAsianAttribute</code> , See {@odf.attribute style:font-family-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontFamilyAsianAttribute() {
+		StyleFontFamilyAsianAttribute attr = (StyleFontFamilyAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-family-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontFamilyAsianAttribute</code> , See {@odf.attribute style:font-family-asian}
+	 *
+	 * @param styleFontFamilyAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontFamilyAsianAttribute(String styleFontFamilyAsianValue) {
+		StyleFontFamilyAsianAttribute attr = new StyleFontFamilyAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontFamilyAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontFamilyComplexAttribute</code> , See {@odf.attribute style:font-family-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontFamilyComplexAttribute() {
+		StyleFontFamilyComplexAttribute attr = (StyleFontFamilyComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-family-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontFamilyComplexAttribute</code> , See {@odf.attribute style:font-family-complex}
+	 *
+	 * @param styleFontFamilyComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontFamilyComplexAttribute(String styleFontFamilyComplexValue) {
+		StyleFontFamilyComplexAttribute attr = new StyleFontFamilyComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontFamilyComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontFamilyGenericAttribute</code> , See {@odf.attribute style:font-family-generic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontFamilyGenericAttribute() {
+		StyleFontFamilyGenericAttribute attr = (StyleFontFamilyGenericAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-family-generic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontFamilyGenericAttribute</code> , See {@odf.attribute style:font-family-generic}
+	 *
+	 * @param styleFontFamilyGenericValue   The type is <code>String</code>
+	 */
+	public void setStyleFontFamilyGenericAttribute(String styleFontFamilyGenericValue) {
+		StyleFontFamilyGenericAttribute attr = new StyleFontFamilyGenericAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontFamilyGenericValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontFamilyGenericAsianAttribute</code> , See {@odf.attribute style:font-family-generic-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontFamilyGenericAsianAttribute() {
+		StyleFontFamilyGenericAsianAttribute attr = (StyleFontFamilyGenericAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-family-generic-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontFamilyGenericAsianAttribute</code> , See {@odf.attribute style:font-family-generic-asian}
+	 *
+	 * @param styleFontFamilyGenericAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontFamilyGenericAsianAttribute(String styleFontFamilyGenericAsianValue) {
+		StyleFontFamilyGenericAsianAttribute attr = new StyleFontFamilyGenericAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontFamilyGenericAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontFamilyGenericComplexAttribute</code> , See {@odf.attribute style:font-family-generic-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontFamilyGenericComplexAttribute() {
+		StyleFontFamilyGenericComplexAttribute attr = (StyleFontFamilyGenericComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-family-generic-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontFamilyGenericComplexAttribute</code> , See {@odf.attribute style:font-family-generic-complex}
+	 *
+	 * @param styleFontFamilyGenericComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontFamilyGenericComplexAttribute(String styleFontFamilyGenericComplexValue) {
+		StyleFontFamilyGenericComplexAttribute attr = new StyleFontFamilyGenericComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontFamilyGenericComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontNameAttribute</code> , See {@odf.attribute style:font-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontNameAttribute() {
+		StyleFontNameAttribute attr = (StyleFontNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontNameAttribute</code> , See {@odf.attribute style:font-name}
+	 *
+	 * @param styleFontNameValue   The type is <code>String</code>
+	 */
+	public void setStyleFontNameAttribute(String styleFontNameValue) {
+		StyleFontNameAttribute attr = new StyleFontNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontNameAsianAttribute</code> , See {@odf.attribute style:font-name-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontNameAsianAttribute() {
+		StyleFontNameAsianAttribute attr = (StyleFontNameAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-name-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontNameAsianAttribute</code> , See {@odf.attribute style:font-name-asian}
+	 *
+	 * @param styleFontNameAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontNameAsianAttribute(String styleFontNameAsianValue) {
+		StyleFontNameAsianAttribute attr = new StyleFontNameAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontNameAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontNameComplexAttribute</code> , See {@odf.attribute style:font-name-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontNameComplexAttribute() {
+		StyleFontNameComplexAttribute attr = (StyleFontNameComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-name-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontNameComplexAttribute</code> , See {@odf.attribute style:font-name-complex}
+	 *
+	 * @param styleFontNameComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontNameComplexAttribute(String styleFontNameComplexValue) {
+		StyleFontNameComplexAttribute attr = new StyleFontNameComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontNameComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontPitchAttribute</code> , See {@odf.attribute style:font-pitch}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontPitchAttribute() {
+		StyleFontPitchAttribute attr = (StyleFontPitchAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-pitch");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontPitchAttribute</code> , See {@odf.attribute style:font-pitch}
+	 *
+	 * @param styleFontPitchValue   The type is <code>String</code>
+	 */
+	public void setStyleFontPitchAttribute(String styleFontPitchValue) {
+		StyleFontPitchAttribute attr = new StyleFontPitchAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontPitchValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontPitchAsianAttribute</code> , See {@odf.attribute style:font-pitch-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontPitchAsianAttribute() {
+		StyleFontPitchAsianAttribute attr = (StyleFontPitchAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-pitch-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontPitchAsianAttribute</code> , See {@odf.attribute style:font-pitch-asian}
+	 *
+	 * @param styleFontPitchAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontPitchAsianAttribute(String styleFontPitchAsianValue) {
+		StyleFontPitchAsianAttribute attr = new StyleFontPitchAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontPitchAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontPitchComplexAttribute</code> , See {@odf.attribute style:font-pitch-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontPitchComplexAttribute() {
+		StyleFontPitchComplexAttribute attr = (StyleFontPitchComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-pitch-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontPitchComplexAttribute</code> , See {@odf.attribute style:font-pitch-complex}
+	 *
+	 * @param styleFontPitchComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontPitchComplexAttribute(String styleFontPitchComplexValue) {
+		StyleFontPitchComplexAttribute attr = new StyleFontPitchComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontPitchComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontReliefAttribute</code> , See {@odf.attribute style:font-relief}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontReliefAttribute() {
+		StyleFontReliefAttribute attr = (StyleFontReliefAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-relief");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontReliefAttribute</code> , See {@odf.attribute style:font-relief}
+	 *
+	 * @param styleFontReliefValue   The type is <code>String</code>
+	 */
+	public void setStyleFontReliefAttribute(String styleFontReliefValue) {
+		StyleFontReliefAttribute attr = new StyleFontReliefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontReliefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontSizeAsianAttribute</code> , See {@odf.attribute style:font-size-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontSizeAsianAttribute() {
+		StyleFontSizeAsianAttribute attr = (StyleFontSizeAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-size-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontSizeAsianAttribute</code> , See {@odf.attribute style:font-size-asian}
+	 *
+	 * @param styleFontSizeAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontSizeAsianAttribute(String styleFontSizeAsianValue) {
+		StyleFontSizeAsianAttribute attr = new StyleFontSizeAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontSizeAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontSizeComplexAttribute</code> , See {@odf.attribute style:font-size-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontSizeComplexAttribute() {
+		StyleFontSizeComplexAttribute attr = (StyleFontSizeComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-size-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontSizeComplexAttribute</code> , See {@odf.attribute style:font-size-complex}
+	 *
+	 * @param styleFontSizeComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontSizeComplexAttribute(String styleFontSizeComplexValue) {
+		StyleFontSizeComplexAttribute attr = new StyleFontSizeComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontSizeComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontSizeRelAttribute</code> , See {@odf.attribute style:font-size-rel}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontSizeRelAttribute() {
+		StyleFontSizeRelAttribute attr = (StyleFontSizeRelAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-size-rel");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontSizeRelAttribute</code> , See {@odf.attribute style:font-size-rel}
+	 *
+	 * @param styleFontSizeRelValue   The type is <code>String</code>
+	 */
+	public void setStyleFontSizeRelAttribute(String styleFontSizeRelValue) {
+		StyleFontSizeRelAttribute attr = new StyleFontSizeRelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontSizeRelValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontSizeRelAsianAttribute</code> , See {@odf.attribute style:font-size-rel-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontSizeRelAsianAttribute() {
+		StyleFontSizeRelAsianAttribute attr = (StyleFontSizeRelAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-size-rel-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontSizeRelAsianAttribute</code> , See {@odf.attribute style:font-size-rel-asian}
+	 *
+	 * @param styleFontSizeRelAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontSizeRelAsianAttribute(String styleFontSizeRelAsianValue) {
+		StyleFontSizeRelAsianAttribute attr = new StyleFontSizeRelAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontSizeRelAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontSizeRelComplexAttribute</code> , See {@odf.attribute style:font-size-rel-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontSizeRelComplexAttribute() {
+		StyleFontSizeRelComplexAttribute attr = (StyleFontSizeRelComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-size-rel-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontSizeRelComplexAttribute</code> , See {@odf.attribute style:font-size-rel-complex}
+	 *
+	 * @param styleFontSizeRelComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontSizeRelComplexAttribute(String styleFontSizeRelComplexValue) {
+		StyleFontSizeRelComplexAttribute attr = new StyleFontSizeRelComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontSizeRelComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontStyleAsianAttribute</code> , See {@odf.attribute style:font-style-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontStyleAsianAttribute() {
+		StyleFontStyleAsianAttribute attr = (StyleFontStyleAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-style-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontStyleAsianAttribute</code> , See {@odf.attribute style:font-style-asian}
+	 *
+	 * @param styleFontStyleAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontStyleAsianAttribute(String styleFontStyleAsianValue) {
+		StyleFontStyleAsianAttribute attr = new StyleFontStyleAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontStyleAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontStyleComplexAttribute</code> , See {@odf.attribute style:font-style-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontStyleComplexAttribute() {
+		StyleFontStyleComplexAttribute attr = (StyleFontStyleComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-style-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontStyleComplexAttribute</code> , See {@odf.attribute style:font-style-complex}
+	 *
+	 * @param styleFontStyleComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontStyleComplexAttribute(String styleFontStyleComplexValue) {
+		StyleFontStyleComplexAttribute attr = new StyleFontStyleComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontStyleComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontStyleNameAttribute</code> , See {@odf.attribute style:font-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontStyleNameAttribute() {
+		StyleFontStyleNameAttribute attr = (StyleFontStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontStyleNameAttribute</code> , See {@odf.attribute style:font-style-name}
+	 *
+	 * @param styleFontStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleFontStyleNameAttribute(String styleFontStyleNameValue) {
+		StyleFontStyleNameAttribute attr = new StyleFontStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontStyleNameAsianAttribute</code> , See {@odf.attribute style:font-style-name-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontStyleNameAsianAttribute() {
+		StyleFontStyleNameAsianAttribute attr = (StyleFontStyleNameAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-style-name-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontStyleNameAsianAttribute</code> , See {@odf.attribute style:font-style-name-asian}
+	 *
+	 * @param styleFontStyleNameAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontStyleNameAsianAttribute(String styleFontStyleNameAsianValue) {
+		StyleFontStyleNameAsianAttribute attr = new StyleFontStyleNameAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontStyleNameAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontStyleNameComplexAttribute</code> , See {@odf.attribute style:font-style-name-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontStyleNameComplexAttribute() {
+		StyleFontStyleNameComplexAttribute attr = (StyleFontStyleNameComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-style-name-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontStyleNameComplexAttribute</code> , See {@odf.attribute style:font-style-name-complex}
+	 *
+	 * @param styleFontStyleNameComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontStyleNameComplexAttribute(String styleFontStyleNameComplexValue) {
+		StyleFontStyleNameComplexAttribute attr = new StyleFontStyleNameComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontStyleNameComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontWeightAsianAttribute</code> , See {@odf.attribute style:font-weight-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontWeightAsianAttribute() {
+		StyleFontWeightAsianAttribute attr = (StyleFontWeightAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-weight-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontWeightAsianAttribute</code> , See {@odf.attribute style:font-weight-asian}
+	 *
+	 * @param styleFontWeightAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleFontWeightAsianAttribute(String styleFontWeightAsianValue) {
+		StyleFontWeightAsianAttribute attr = new StyleFontWeightAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontWeightAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleFontWeightComplexAttribute</code> , See {@odf.attribute style:font-weight-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleFontWeightComplexAttribute() {
+		StyleFontWeightComplexAttribute attr = (StyleFontWeightComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "font-weight-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleFontWeightComplexAttribute</code> , See {@odf.attribute style:font-weight-complex}
+	 *
+	 * @param styleFontWeightComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleFontWeightComplexAttribute(String styleFontWeightComplexValue) {
+		StyleFontWeightComplexAttribute attr = new StyleFontWeightComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleFontWeightComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLanguageAsianAttribute</code> , See {@odf.attribute style:language-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLanguageAsianAttribute() {
+		StyleLanguageAsianAttribute attr = (StyleLanguageAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "language-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLanguageAsianAttribute</code> , See {@odf.attribute style:language-asian}
+	 *
+	 * @param styleLanguageAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleLanguageAsianAttribute(String styleLanguageAsianValue) {
+		StyleLanguageAsianAttribute attr = new StyleLanguageAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLanguageAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLanguageComplexAttribute</code> , See {@odf.attribute style:language-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLanguageComplexAttribute() {
+		StyleLanguageComplexAttribute attr = (StyleLanguageComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "language-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLanguageComplexAttribute</code> , See {@odf.attribute style:language-complex}
+	 *
+	 * @param styleLanguageComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleLanguageComplexAttribute(String styleLanguageComplexValue) {
+		StyleLanguageComplexAttribute attr = new StyleLanguageComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLanguageComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLetterKerningAttribute</code> , See {@odf.attribute style:letter-kerning}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleLetterKerningAttribute() {
+		StyleLetterKerningAttribute attr = (StyleLetterKerningAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "letter-kerning");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLetterKerningAttribute</code> , See {@odf.attribute style:letter-kerning}
+	 *
+	 * @param styleLetterKerningValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleLetterKerningAttribute(Boolean styleLetterKerningValue) {
+		StyleLetterKerningAttribute attr = new StyleLetterKerningAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleLetterKerningValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRfcLanguageTagAttribute</code> , See {@odf.attribute style:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRfcLanguageTagAttribute() {
+		StyleRfcLanguageTagAttribute attr = (StyleRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRfcLanguageTagAttribute</code> , See {@odf.attribute style:rfc-language-tag}
+	 *
+	 * @param styleRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setStyleRfcLanguageTagAttribute(String styleRfcLanguageTagValue) {
+		StyleRfcLanguageTagAttribute attr = new StyleRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRfcLanguageTagAsianAttribute</code> , See {@odf.attribute style:rfc-language-tag-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRfcLanguageTagAsianAttribute() {
+		StyleRfcLanguageTagAsianAttribute attr = (StyleRfcLanguageTagAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rfc-language-tag-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRfcLanguageTagAsianAttribute</code> , See {@odf.attribute style:rfc-language-tag-asian}
+	 *
+	 * @param styleRfcLanguageTagAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleRfcLanguageTagAsianAttribute(String styleRfcLanguageTagAsianValue) {
+		StyleRfcLanguageTagAsianAttribute attr = new StyleRfcLanguageTagAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRfcLanguageTagAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRfcLanguageTagComplexAttribute</code> , See {@odf.attribute style:rfc-language-tag-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRfcLanguageTagComplexAttribute() {
+		StyleRfcLanguageTagComplexAttribute attr = (StyleRfcLanguageTagComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rfc-language-tag-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRfcLanguageTagComplexAttribute</code> , See {@odf.attribute style:rfc-language-tag-complex}
+	 *
+	 * @param styleRfcLanguageTagComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleRfcLanguageTagComplexAttribute(String styleRfcLanguageTagComplexValue) {
+		StyleRfcLanguageTagComplexAttribute attr = new StyleRfcLanguageTagComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRfcLanguageTagComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleScriptAsianAttribute</code> , See {@odf.attribute style:script-asian}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleScriptAsianAttribute() {
+		StyleScriptAsianAttribute attr = (StyleScriptAsianAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "script-asian");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleScriptAsianAttribute</code> , See {@odf.attribute style:script-asian}
+	 *
+	 * @param styleScriptAsianValue   The type is <code>String</code>
+	 */
+	public void setStyleScriptAsianAttribute(String styleScriptAsianValue) {
+		StyleScriptAsianAttribute attr = new StyleScriptAsianAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleScriptAsianValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleScriptComplexAttribute</code> , See {@odf.attribute style:script-complex}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleScriptComplexAttribute() {
+		StyleScriptComplexAttribute attr = (StyleScriptComplexAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "script-complex");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleScriptComplexAttribute</code> , See {@odf.attribute style:script-complex}
+	 *
+	 * @param styleScriptComplexValue   The type is <code>String</code>
+	 */
+	public void setStyleScriptComplexAttribute(String styleScriptComplexValue) {
+		StyleScriptComplexAttribute attr = new StyleScriptComplexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleScriptComplexValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleScriptTypeAttribute</code> , See {@odf.attribute style:script-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleScriptTypeAttribute() {
+		StyleScriptTypeAttribute attr = (StyleScriptTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "script-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleScriptTypeAttribute</code> , See {@odf.attribute style:script-type}
+	 *
+	 * @param styleScriptTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleScriptTypeAttribute(String styleScriptTypeValue) {
+		StyleScriptTypeAttribute attr = new StyleScriptTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleScriptTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextBlinkingAttribute</code> , See {@odf.attribute style:text-blinking}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleTextBlinkingAttribute() {
+		StyleTextBlinkingAttribute attr = (StyleTextBlinkingAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-blinking");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextBlinkingAttribute</code> , See {@odf.attribute style:text-blinking}
+	 *
+	 * @param styleTextBlinkingValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleTextBlinkingAttribute(Boolean styleTextBlinkingValue) {
+		StyleTextBlinkingAttribute attr = new StyleTextBlinkingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleTextBlinkingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextCombineAttribute</code> , See {@odf.attribute style:text-combine}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextCombineAttribute() {
+		StyleTextCombineAttribute attr = (StyleTextCombineAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-combine");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextCombineAttribute</code> , See {@odf.attribute style:text-combine}
+	 *
+	 * @param styleTextCombineValue   The type is <code>String</code>
+	 */
+	public void setStyleTextCombineAttribute(String styleTextCombineValue) {
+		StyleTextCombineAttribute attr = new StyleTextCombineAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextCombineValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextCombineEndCharAttribute</code> , See {@odf.attribute style:text-combine-end-char}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextCombineEndCharAttribute() {
+		StyleTextCombineEndCharAttribute attr = (StyleTextCombineEndCharAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-combine-end-char");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextCombineEndCharAttribute</code> , See {@odf.attribute style:text-combine-end-char}
+	 *
+	 * @param styleTextCombineEndCharValue   The type is <code>String</code>
+	 */
+	public void setStyleTextCombineEndCharAttribute(String styleTextCombineEndCharValue) {
+		StyleTextCombineEndCharAttribute attr = new StyleTextCombineEndCharAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextCombineEndCharValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextCombineStartCharAttribute</code> , See {@odf.attribute style:text-combine-start-char}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextCombineStartCharAttribute() {
+		StyleTextCombineStartCharAttribute attr = (StyleTextCombineStartCharAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-combine-start-char");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextCombineStartCharAttribute</code> , See {@odf.attribute style:text-combine-start-char}
+	 *
+	 * @param styleTextCombineStartCharValue   The type is <code>String</code>
+	 */
+	public void setStyleTextCombineStartCharAttribute(String styleTextCombineStartCharValue) {
+		StyleTextCombineStartCharAttribute attr = new StyleTextCombineStartCharAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextCombineStartCharValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextEmphasizeAttribute</code> , See {@odf.attribute style:text-emphasize}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextEmphasizeAttribute() {
+		StyleTextEmphasizeAttribute attr = (StyleTextEmphasizeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-emphasize");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextEmphasizeAttribute</code> , See {@odf.attribute style:text-emphasize}
+	 *
+	 * @param styleTextEmphasizeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextEmphasizeAttribute(String styleTextEmphasizeValue) {
+		StyleTextEmphasizeAttribute attr = new StyleTextEmphasizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextEmphasizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughColorAttribute</code> , See {@odf.attribute style:text-line-through-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughColorAttribute() {
+		StyleTextLineThroughColorAttribute attr = (StyleTextLineThroughColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughColorAttribute</code> , See {@odf.attribute style:text-line-through-color}
+	 *
+	 * @param styleTextLineThroughColorValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughColorAttribute(String styleTextLineThroughColorValue) {
+		StyleTextLineThroughColorAttribute attr = new StyleTextLineThroughColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughModeAttribute</code> , See {@odf.attribute style:text-line-through-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughModeAttribute() {
+		StyleTextLineThroughModeAttribute attr = (StyleTextLineThroughModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughModeAttribute</code> , See {@odf.attribute style:text-line-through-mode}
+	 *
+	 * @param styleTextLineThroughModeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughModeAttribute(String styleTextLineThroughModeValue) {
+		StyleTextLineThroughModeAttribute attr = new StyleTextLineThroughModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughStyleAttribute</code> , See {@odf.attribute style:text-line-through-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughStyleAttribute() {
+		StyleTextLineThroughStyleAttribute attr = (StyleTextLineThroughStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughStyleAttribute</code> , See {@odf.attribute style:text-line-through-style}
+	 *
+	 * @param styleTextLineThroughStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughStyleAttribute(String styleTextLineThroughStyleValue) {
+		StyleTextLineThroughStyleAttribute attr = new StyleTextLineThroughStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughTextAttribute</code> , See {@odf.attribute style:text-line-through-text}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughTextAttribute() {
+		StyleTextLineThroughTextAttribute attr = (StyleTextLineThroughTextAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-text");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughTextAttribute</code> , See {@odf.attribute style:text-line-through-text}
+	 *
+	 * @param styleTextLineThroughTextValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughTextAttribute(String styleTextLineThroughTextValue) {
+		StyleTextLineThroughTextAttribute attr = new StyleTextLineThroughTextAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughTextValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughTextStyleAttribute</code> , See {@odf.attribute style:text-line-through-text-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughTextStyleAttribute() {
+		StyleTextLineThroughTextStyleAttribute attr = (StyleTextLineThroughTextStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-text-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughTextStyleAttribute</code> , See {@odf.attribute style:text-line-through-text-style}
+	 *
+	 * @param styleTextLineThroughTextStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughTextStyleAttribute(String styleTextLineThroughTextStyleValue) {
+		StyleTextLineThroughTextStyleAttribute attr = new StyleTextLineThroughTextStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughTextStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughTypeAttribute</code> , See {@odf.attribute style:text-line-through-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughTypeAttribute() {
+		StyleTextLineThroughTypeAttribute attr = (StyleTextLineThroughTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughTypeAttribute</code> , See {@odf.attribute style:text-line-through-type}
+	 *
+	 * @param styleTextLineThroughTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughTypeAttribute(String styleTextLineThroughTypeValue) {
+		StyleTextLineThroughTypeAttribute attr = new StyleTextLineThroughTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextLineThroughWidthAttribute</code> , See {@odf.attribute style:text-line-through-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextLineThroughWidthAttribute() {
+		StyleTextLineThroughWidthAttribute attr = (StyleTextLineThroughWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-line-through-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextLineThroughWidthAttribute</code> , See {@odf.attribute style:text-line-through-width}
+	 *
+	 * @param styleTextLineThroughWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleTextLineThroughWidthAttribute(String styleTextLineThroughWidthValue) {
+		StyleTextLineThroughWidthAttribute attr = new StyleTextLineThroughWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextLineThroughWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextOutlineAttribute</code> , See {@odf.attribute style:text-outline}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleTextOutlineAttribute() {
+		StyleTextOutlineAttribute attr = (StyleTextOutlineAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-outline");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextOutlineAttribute</code> , See {@odf.attribute style:text-outline}
+	 *
+	 * @param styleTextOutlineValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleTextOutlineAttribute(Boolean styleTextOutlineValue) {
+		StyleTextOutlineAttribute attr = new StyleTextOutlineAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleTextOutlineValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextOverlineColorAttribute</code> , See {@odf.attribute style:text-overline-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextOverlineColorAttribute() {
+		StyleTextOverlineColorAttribute attr = (StyleTextOverlineColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-overline-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextOverlineColorAttribute</code> , See {@odf.attribute style:text-overline-color}
+	 *
+	 * @param styleTextOverlineColorValue   The type is <code>String</code>
+	 */
+	public void setStyleTextOverlineColorAttribute(String styleTextOverlineColorValue) {
+		StyleTextOverlineColorAttribute attr = new StyleTextOverlineColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextOverlineColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextOverlineModeAttribute</code> , See {@odf.attribute style:text-overline-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextOverlineModeAttribute() {
+		StyleTextOverlineModeAttribute attr = (StyleTextOverlineModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-overline-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextOverlineModeAttribute</code> , See {@odf.attribute style:text-overline-mode}
+	 *
+	 * @param styleTextOverlineModeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextOverlineModeAttribute(String styleTextOverlineModeValue) {
+		StyleTextOverlineModeAttribute attr = new StyleTextOverlineModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextOverlineModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextOverlineStyleAttribute</code> , See {@odf.attribute style:text-overline-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextOverlineStyleAttribute() {
+		StyleTextOverlineStyleAttribute attr = (StyleTextOverlineStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-overline-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextOverlineStyleAttribute</code> , See {@odf.attribute style:text-overline-style}
+	 *
+	 * @param styleTextOverlineStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextOverlineStyleAttribute(String styleTextOverlineStyleValue) {
+		StyleTextOverlineStyleAttribute attr = new StyleTextOverlineStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextOverlineStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextOverlineTypeAttribute</code> , See {@odf.attribute style:text-overline-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextOverlineTypeAttribute() {
+		StyleTextOverlineTypeAttribute attr = (StyleTextOverlineTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-overline-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextOverlineTypeAttribute</code> , See {@odf.attribute style:text-overline-type}
+	 *
+	 * @param styleTextOverlineTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextOverlineTypeAttribute(String styleTextOverlineTypeValue) {
+		StyleTextOverlineTypeAttribute attr = new StyleTextOverlineTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextOverlineTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextOverlineWidthAttribute</code> , See {@odf.attribute style:text-overline-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextOverlineWidthAttribute() {
+		StyleTextOverlineWidthAttribute attr = (StyleTextOverlineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-overline-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextOverlineWidthAttribute</code> , See {@odf.attribute style:text-overline-width}
+	 *
+	 * @param styleTextOverlineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleTextOverlineWidthAttribute(String styleTextOverlineWidthValue) {
+		StyleTextOverlineWidthAttribute attr = new StyleTextOverlineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextOverlineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextPositionAttribute</code> , See {@odf.attribute style:text-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextPositionAttribute() {
+		StyleTextPositionAttribute attr = (StyleTextPositionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextPositionAttribute</code> , See {@odf.attribute style:text-position}
+	 *
+	 * @param styleTextPositionValue   The type is <code>String</code>
+	 */
+	public void setStyleTextPositionAttribute(String styleTextPositionValue) {
+		StyleTextPositionAttribute attr = new StyleTextPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextRotationAngleAttribute</code> , See {@odf.attribute style:text-rotation-angle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextRotationAngleAttribute() {
+		StyleTextRotationAngleAttribute attr = (StyleTextRotationAngleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-rotation-angle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextRotationAngleAttribute</code> , See {@odf.attribute style:text-rotation-angle}
+	 *
+	 * @param styleTextRotationAngleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextRotationAngleAttribute(String styleTextRotationAngleValue) {
+		StyleTextRotationAngleAttribute attr = new StyleTextRotationAngleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextRotationAngleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextRotationScaleAttribute</code> , See {@odf.attribute style:text-rotation-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextRotationScaleAttribute() {
+		StyleTextRotationScaleAttribute attr = (StyleTextRotationScaleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-rotation-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextRotationScaleAttribute</code> , See {@odf.attribute style:text-rotation-scale}
+	 *
+	 * @param styleTextRotationScaleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextRotationScaleAttribute(String styleTextRotationScaleValue) {
+		StyleTextRotationScaleAttribute attr = new StyleTextRotationScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextRotationScaleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextScaleAttribute</code> , See {@odf.attribute style:text-scale}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextScaleAttribute() {
+		StyleTextScaleAttribute attr = (StyleTextScaleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-scale");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextScaleAttribute</code> , See {@odf.attribute style:text-scale}
+	 *
+	 * @param styleTextScaleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextScaleAttribute(String styleTextScaleValue) {
+		StyleTextScaleAttribute attr = new StyleTextScaleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextScaleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextUnderlineColorAttribute</code> , See {@odf.attribute style:text-underline-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextUnderlineColorAttribute() {
+		StyleTextUnderlineColorAttribute attr = (StyleTextUnderlineColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-underline-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextUnderlineColorAttribute</code> , See {@odf.attribute style:text-underline-color}
+	 *
+	 * @param styleTextUnderlineColorValue   The type is <code>String</code>
+	 */
+	public void setStyleTextUnderlineColorAttribute(String styleTextUnderlineColorValue) {
+		StyleTextUnderlineColorAttribute attr = new StyleTextUnderlineColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextUnderlineColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextUnderlineModeAttribute</code> , See {@odf.attribute style:text-underline-mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextUnderlineModeAttribute() {
+		StyleTextUnderlineModeAttribute attr = (StyleTextUnderlineModeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-underline-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextUnderlineModeAttribute</code> , See {@odf.attribute style:text-underline-mode}
+	 *
+	 * @param styleTextUnderlineModeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextUnderlineModeAttribute(String styleTextUnderlineModeValue) {
+		StyleTextUnderlineModeAttribute attr = new StyleTextUnderlineModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextUnderlineModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextUnderlineStyleAttribute</code> , See {@odf.attribute style:text-underline-style}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextUnderlineStyleAttribute() {
+		StyleTextUnderlineStyleAttribute attr = (StyleTextUnderlineStyleAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-underline-style");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextUnderlineStyleAttribute</code> , See {@odf.attribute style:text-underline-style}
+	 *
+	 * @param styleTextUnderlineStyleValue   The type is <code>String</code>
+	 */
+	public void setStyleTextUnderlineStyleAttribute(String styleTextUnderlineStyleValue) {
+		StyleTextUnderlineStyleAttribute attr = new StyleTextUnderlineStyleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextUnderlineStyleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextUnderlineTypeAttribute</code> , See {@odf.attribute style:text-underline-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextUnderlineTypeAttribute() {
+		StyleTextUnderlineTypeAttribute attr = (StyleTextUnderlineTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-underline-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextUnderlineTypeAttribute</code> , See {@odf.attribute style:text-underline-type}
+	 *
+	 * @param styleTextUnderlineTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleTextUnderlineTypeAttribute(String styleTextUnderlineTypeValue) {
+		StyleTextUnderlineTypeAttribute attr = new StyleTextUnderlineTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextUnderlineTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTextUnderlineWidthAttribute</code> , See {@odf.attribute style:text-underline-width}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTextUnderlineWidthAttribute() {
+		StyleTextUnderlineWidthAttribute attr = (StyleTextUnderlineWidthAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "text-underline-width");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTextUnderlineWidthAttribute</code> , See {@odf.attribute style:text-underline-width}
+	 *
+	 * @param styleTextUnderlineWidthValue   The type is <code>String</code>
+	 */
+	public void setStyleTextUnderlineWidthAttribute(String styleTextUnderlineWidthValue) {
+		StyleTextUnderlineWidthAttribute attr = new StyleTextUnderlineWidthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTextUnderlineWidthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleUseWindowFontColorAttribute</code> , See {@odf.attribute style:use-window-font-color}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleUseWindowFontColorAttribute() {
+		StyleUseWindowFontColorAttribute attr = (StyleUseWindowFontColorAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "use-window-font-color");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleUseWindowFontColorAttribute</code> , See {@odf.attribute style:use-window-font-color}
+	 *
+	 * @param styleUseWindowFontColorValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleUseWindowFontColorAttribute(Boolean styleUseWindowFontColorValue) {
+		StyleUseWindowFontColorAttribute attr = new StyleUseWindowFontColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleUseWindowFontColorValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgDefinitionSrcElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgDefinitionSrcElement.java
new file mode 100644
index 0000000..90620e9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgDefinitionSrcElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:definition-src}.
+ *
+ */
+public class SvgDefinitionSrcElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "definition-src");
+
+	/**
+	 * Create the instance of <code>SvgDefinitionSrcElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgDefinitionSrcElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:definition-src}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgDescElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgDescElement.java
new file mode 100644
index 0000000..a8e2d85
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgDescElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:desc}.
+ *
+ */
+public class SvgDescElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "desc");
+
+	/**
+	 * Create the instance of <code>SvgDescElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgDescElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:desc}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceFormatElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceFormatElement.java
new file mode 100644
index 0000000..b48aad3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceFormatElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStringAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:font-face-format}.
+ *
+ */
+public class SvgFontFaceFormatElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-face-format");
+
+	/**
+	 * Create the instance of <code>SvgFontFaceFormatElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontFaceFormatElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:font-face-format}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStringAttribute</code> , See {@odf.attribute svg:string}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgStringAttribute() {
+		SvgStringAttribute attr = (SvgStringAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "string");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStringAttribute</code> , See {@odf.attribute svg:string}
+	 *
+	 * @param svgStringValue   The type is <code>String</code>
+	 */
+	public void setSvgStringAttribute(String svgStringValue) {
+		SvgStringAttribute attr = new SvgStringAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgStringValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceNameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceNameElement.java
new file mode 100644
index 0000000..6b4b908
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceNameElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:font-face-name}.
+ *
+ */
+public class SvgFontFaceNameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-face-name");
+
+	/**
+	 * Create the instance of <code>SvgFontFaceNameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontFaceNameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:font-face-name}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgNameAttribute</code> , See {@odf.attribute svg:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgNameAttribute() {
+		SvgNameAttribute attr = (SvgNameAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgNameAttribute</code> , See {@odf.attribute svg:name}
+	 *
+	 * @param svgNameValue   The type is <code>String</code>
+	 */
+	public void setSvgNameAttribute(String svgNameValue) {
+		SvgNameAttribute attr = new SvgNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceSrcElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceSrcElement.java
new file mode 100644
index 0000000..dbd38d3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceSrcElement.java
@@ -0,0 +1,97 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:font-face-src}.
+ *
+ */
+public class SvgFontFaceSrcElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-face-src");
+
+	/**
+	 * Create the instance of <code>SvgFontFaceSrcElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontFaceSrcElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:font-face-src}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:font-face-name}.
+	 *
+	 * @return the element {@odf.element svg:font-face-name}
+	 */
+	public SvgFontFaceNameElement newSvgFontFaceNameElement() {
+		SvgFontFaceNameElement svgFontFaceName = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgFontFaceNameElement.class);
+		this.appendChild(svgFontFaceName);
+		return svgFontFaceName;
+	}
+
+	/**
+	 * Create child element {@odf.element svg:font-face-uri}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element svg:font-face-uri}
+	 */
+	 public SvgFontFaceUriElement newSvgFontFaceUriElement(String xlinkHrefValue, String xlinkTypeValue) {
+		SvgFontFaceUriElement svgFontFaceUri = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgFontFaceUriElement.class);
+		svgFontFaceUri.setXlinkHrefAttribute(xlinkHrefValue);
+		svgFontFaceUri.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(svgFontFaceUri);
+		return svgFontFaceUri;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceUriElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceUriElement.java
new file mode 100644
index 0000000..5da877d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgFontFaceUriElement.java
@@ -0,0 +1,161 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:font-face-uri}.
+ *
+ */
+public class SvgFontFaceUriElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "font-face-uri");
+
+	/**
+	 * Create the instance of <code>SvgFontFaceUriElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgFontFaceUriElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:font-face-uri}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element svg:font-face-format}.
+	 *
+	 * @return the element {@odf.element svg:font-face-format}
+	 */
+	public SvgFontFaceFormatElement newSvgFontFaceFormatElement() {
+		SvgFontFaceFormatElement svgFontFaceFormat = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgFontFaceFormatElement.class);
+		this.appendChild(svgFontFaceFormat);
+		return svgFontFaceFormat;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgLinearGradientElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgLinearGradientElement.java
new file mode 100644
index 0000000..7f05a29
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgLinearGradientElement.java
@@ -0,0 +1,311 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgGradientTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgGradientUnitsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgSpreadMethodAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgX2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgY2Attribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:linearGradient}.
+ *
+ */
+public class SvgLinearGradientElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "linearGradient");
+
+	/**
+	 * Create the instance of <code>SvgLinearGradientElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgLinearGradientElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:linearGradient}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgGradientTransformAttribute</code> , See {@odf.attribute svg:gradientTransform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgGradientTransformAttribute() {
+		SvgGradientTransformAttribute attr = (SvgGradientTransformAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "gradientTransform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgGradientTransformAttribute</code> , See {@odf.attribute svg:gradientTransform}
+	 *
+	 * @param svgGradientTransformValue   The type is <code>String</code>
+	 */
+	public void setSvgGradientTransformAttribute(String svgGradientTransformValue) {
+		SvgGradientTransformAttribute attr = new SvgGradientTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgGradientTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgGradientUnitsAttribute</code> , See {@odf.attribute svg:gradientUnits}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgGradientUnitsAttribute() {
+		SvgGradientUnitsAttribute attr = (SvgGradientUnitsAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "gradientUnits");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgGradientUnitsAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgGradientUnitsAttribute</code> , See {@odf.attribute svg:gradientUnits}
+	 *
+	 * @param svgGradientUnitsValue   The type is <code>String</code>
+	 */
+	public void setSvgGradientUnitsAttribute(String svgGradientUnitsValue) {
+		SvgGradientUnitsAttribute attr = new SvgGradientUnitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgGradientUnitsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgSpreadMethodAttribute</code> , See {@odf.attribute svg:spreadMethod}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgSpreadMethodAttribute() {
+		SvgSpreadMethodAttribute attr = (SvgSpreadMethodAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "spreadMethod");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgSpreadMethodAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgSpreadMethodAttribute</code> , See {@odf.attribute svg:spreadMethod}
+	 *
+	 * @param svgSpreadMethodValue   The type is <code>String</code>
+	 */
+	public void setSvgSpreadMethodAttribute(String svgSpreadMethodValue) {
+		SvgSpreadMethodAttribute attr = new SvgSpreadMethodAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgSpreadMethodValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX1Attribute() {
+		SvgX1Attribute attr = (SvgX1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgX1Attribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX1Attribute</code> , See {@odf.attribute svg:x1}
+	 *
+	 * @param svgX1Value   The type is <code>String</code>
+	 */
+	public void setSvgX1Attribute(String svgX1Value) {
+		SvgX1Attribute attr = new SvgX1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgX2Attribute() {
+		SvgX2Attribute attr = (SvgX2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "x2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgX2Attribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgX2Attribute</code> , See {@odf.attribute svg:x2}
+	 *
+	 * @param svgX2Value   The type is <code>String</code>
+	 */
+	public void setSvgX2Attribute(String svgX2Value) {
+		SvgX2Attribute attr = new SvgX2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgX2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY1Attribute() {
+		SvgY1Attribute attr = (SvgY1Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgY1Attribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY1Attribute</code> , See {@odf.attribute svg:y1}
+	 *
+	 * @param svgY1Value   The type is <code>String</code>
+	 */
+	public void setSvgY1Attribute(String svgY1Value) {
+		SvgY1Attribute attr = new SvgY1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgY2Attribute() {
+		SvgY2Attribute attr = (SvgY2Attribute) getOdfAttribute(OdfDocumentNamespace.SVG, "y2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgY2Attribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgY2Attribute</code> , See {@odf.attribute svg:y2}
+	 *
+	 * @param svgY2Value   The type is <code>String</code>
+	 */
+	public void setSvgY2Attribute(String svgY2Value) {
+		SvgY2Attribute attr = new SvgY2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgY2Value);
+	}
+
+	/**
+	 * Create child element {@odf.element svg:stop}.
+	 *
+	 * @param svgOffsetValue  the <code>String</code> value of <code>SvgOffsetAttribute</code>, see {@odf.attribute  svg:offset} at specification
+	 * @return the element {@odf.element svg:stop}
+	 */
+	 public SvgStopElement newSvgStopElement(String svgOffsetValue) {
+		SvgStopElement svgStop = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgStopElement.class);
+		svgStop.setSvgOffsetAttribute(svgOffsetValue);
+		this.appendChild(svgStop);
+		return svgStop;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgRadialGradientElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgRadialGradientElement.java
new file mode 100644
index 0000000..eb91d70
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgRadialGradientElement.java
@@ -0,0 +1,336 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.draw.DrawNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgCyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFxAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgFyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgGradientTransformAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgGradientUnitsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgRAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgSpreadMethodAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:radialGradient}.
+ *
+ */
+public class SvgRadialGradientElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "radialGradient");
+
+	/**
+	 * Create the instance of <code>SvgRadialGradientElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgRadialGradientElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:radialGradient}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawDisplayNameAttribute() {
+		DrawDisplayNameAttribute attr = (DrawDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawDisplayNameAttribute</code> , See {@odf.attribute draw:display-name}
+	 *
+	 * @param drawDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setDrawDisplayNameAttribute(String drawDisplayNameValue) {
+		DrawDisplayNameAttribute attr = new DrawDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getDrawNameAttribute() {
+		DrawNameAttribute attr = (DrawNameAttribute) getOdfAttribute(OdfDocumentNamespace.DRAW, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>DrawNameAttribute</code> , See {@odf.attribute draw:name}
+	 *
+	 * @param drawNameValue   The type is <code>String</code>
+	 */
+	public void setDrawNameAttribute(String drawNameValue) {
+		DrawNameAttribute attr = new DrawNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(drawNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCxAttribute() {
+		SvgCxAttribute attr = (SvgCxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgCxAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCxAttribute</code> , See {@odf.attribute svg:cx}
+	 *
+	 * @param svgCxValue   The type is <code>String</code>
+	 */
+	public void setSvgCxAttribute(String svgCxValue) {
+		SvgCxAttribute attr = new SvgCxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgCyAttribute() {
+		SvgCyAttribute attr = (SvgCyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "cy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgCyAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgCyAttribute</code> , See {@odf.attribute svg:cy}
+	 *
+	 * @param svgCyValue   The type is <code>String</code>
+	 */
+	public void setSvgCyAttribute(String svgCyValue) {
+		SvgCyAttribute attr = new SvgCyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgCyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFxAttribute</code> , See {@odf.attribute svg:fx}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFxAttribute() {
+		SvgFxAttribute attr = (SvgFxAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "fx");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFxAttribute</code> , See {@odf.attribute svg:fx}
+	 *
+	 * @param svgFxValue   The type is <code>String</code>
+	 */
+	public void setSvgFxAttribute(String svgFxValue) {
+		SvgFxAttribute attr = new SvgFxAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFxValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgFyAttribute</code> , See {@odf.attribute svg:fy}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgFyAttribute() {
+		SvgFyAttribute attr = (SvgFyAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "fy");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgFyAttribute</code> , See {@odf.attribute svg:fy}
+	 *
+	 * @param svgFyValue   The type is <code>String</code>
+	 */
+	public void setSvgFyAttribute(String svgFyValue) {
+		SvgFyAttribute attr = new SvgFyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgFyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgGradientTransformAttribute</code> , See {@odf.attribute svg:gradientTransform}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgGradientTransformAttribute() {
+		SvgGradientTransformAttribute attr = (SvgGradientTransformAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "gradientTransform");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgGradientTransformAttribute</code> , See {@odf.attribute svg:gradientTransform}
+	 *
+	 * @param svgGradientTransformValue   The type is <code>String</code>
+	 */
+	public void setSvgGradientTransformAttribute(String svgGradientTransformValue) {
+		SvgGradientTransformAttribute attr = new SvgGradientTransformAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgGradientTransformValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgGradientUnitsAttribute</code> , See {@odf.attribute svg:gradientUnits}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgGradientUnitsAttribute() {
+		SvgGradientUnitsAttribute attr = (SvgGradientUnitsAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "gradientUnits");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgGradientUnitsAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgGradientUnitsAttribute</code> , See {@odf.attribute svg:gradientUnits}
+	 *
+	 * @param svgGradientUnitsValue   The type is <code>String</code>
+	 */
+	public void setSvgGradientUnitsAttribute(String svgGradientUnitsValue) {
+		SvgGradientUnitsAttribute attr = new SvgGradientUnitsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgGradientUnitsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgRAttribute</code> , See {@odf.attribute svg:r}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgRAttribute() {
+		SvgRAttribute attr = (SvgRAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "r");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgRAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgRAttribute</code> , See {@odf.attribute svg:r}
+	 *
+	 * @param svgRValue   The type is <code>String</code>
+	 */
+	public void setSvgRAttribute(String svgRValue) {
+		SvgRAttribute attr = new SvgRAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgRValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgSpreadMethodAttribute</code> , See {@odf.attribute svg:spreadMethod}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgSpreadMethodAttribute() {
+		SvgSpreadMethodAttribute attr = (SvgSpreadMethodAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "spreadMethod");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return SvgSpreadMethodAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgSpreadMethodAttribute</code> , See {@odf.attribute svg:spreadMethod}
+	 *
+	 * @param svgSpreadMethodValue   The type is <code>String</code>
+	 */
+	public void setSvgSpreadMethodAttribute(String svgSpreadMethodValue) {
+		SvgSpreadMethodAttribute attr = new SvgSpreadMethodAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgSpreadMethodValue);
+	}
+
+	/**
+	 * Create child element {@odf.element svg:stop}.
+	 *
+	 * @param svgOffsetValue  the <code>String</code> value of <code>SvgOffsetAttribute</code>, see {@odf.attribute  svg:offset} at specification
+	 * @return the element {@odf.element svg:stop}
+	 */
+	 public SvgStopElement newSvgStopElement(String svgOffsetValue) {
+		SvgStopElement svgStop = ((OdfFileDom) this.ownerDocument).newOdfElement(SvgStopElement.class);
+		svgStop.setSvgOffsetAttribute(svgOffsetValue);
+		this.appendChild(svgStop);
+		return svgStop;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgStopElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgStopElement.java
new file mode 100644
index 0000000..3a49442
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgStopElement.java
@@ -0,0 +1,148 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgOffsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStopColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.svg.SvgStopOpacityAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:stop}.
+ *
+ */
+public class SvgStopElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "stop");
+
+	/**
+	 * Create the instance of <code>SvgStopElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgStopElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:stop}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgOffsetAttribute</code> , See {@odf.attribute svg:offset}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgOffsetAttribute() {
+		SvgOffsetAttribute attr = (SvgOffsetAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "offset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgOffsetAttribute</code> , See {@odf.attribute svg:offset}
+	 *
+	 * @param svgOffsetValue   The type is <code>String</code>
+	 */
+	public void setSvgOffsetAttribute(String svgOffsetValue) {
+		SvgOffsetAttribute attr = new SvgOffsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgOffsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStopColorAttribute</code> , See {@odf.attribute svg:stop-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getSvgStopColorAttribute() {
+		SvgStopColorAttribute attr = (SvgStopColorAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stop-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStopColorAttribute</code> , See {@odf.attribute svg:stop-color}
+	 *
+	 * @param svgStopColorValue   The type is <code>String</code>
+	 */
+	public void setSvgStopColorAttribute(String svgStopColorValue) {
+		SvgStopColorAttribute attr = new SvgStopColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(svgStopColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SvgStopOpacityAttribute</code> , See {@odf.attribute svg:stop-opacity}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getSvgStopOpacityAttribute() {
+		SvgStopOpacityAttribute attr = (SvgStopOpacityAttribute) getOdfAttribute(OdfDocumentNamespace.SVG, "stop-opacity");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SvgStopOpacityAttribute</code> , See {@odf.attribute svg:stop-opacity}
+	 *
+	 * @param svgStopOpacityValue   The type is <code>Double</code>
+	 */
+	public void setSvgStopOpacityAttribute(Double svgStopOpacityValue) {
+		SvgStopOpacityAttribute attr = new SvgStopOpacityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(svgStopOpacityValue.doubleValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgTitleElement.java
new file mode 100644
index 0000000..193dee2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/svg/SvgTitleElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.svg;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element svg:title}.
+ *
+ */
+public class SvgTitleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.SVG, "title");
+
+	/**
+	 * Create the instance of <code>SvgTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public SvgTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element svg:title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableBackgroundElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableBackgroundElement.java
new file mode 100644
index 0000000..e04d1a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableBackgroundElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:background}.
+ *
+ */
+public class TableBackgroundElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "background");
+
+	/**
+	 * Create the instance of <code>TableBackgroundElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableBackgroundElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:background}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableBodyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableBodyElement.java
new file mode 100644
index 0000000..0a8fc8a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableBodyElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:body}.
+ *
+ */
+public class TableBodyElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "body");
+
+	/**
+	 * Create the instance of <code>TableBodyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableBodyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:body}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCalculationSettingsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCalculationSettingsElement.java
new file mode 100644
index 0000000..e27df01
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCalculationSettingsElement.java
@@ -0,0 +1,268 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAutomaticFindLabelsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCaseSensitiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNullYearAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePrecisionAsShownAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSearchCriteriaMustApplyToWholeCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseRegularExpressionsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseWildcardsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:calculation-settings}.
+ *
+ */
+public class TableCalculationSettingsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "calculation-settings");
+
+	/**
+	 * Create the instance of <code>TableCalculationSettingsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCalculationSettingsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:calculation-settings}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAutomaticFindLabelsAttribute</code> , See {@odf.attribute table:automatic-find-labels}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableAutomaticFindLabelsAttribute() {
+		TableAutomaticFindLabelsAttribute attr = (TableAutomaticFindLabelsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "automatic-find-labels");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableAutomaticFindLabelsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAutomaticFindLabelsAttribute</code> , See {@odf.attribute table:automatic-find-labels}
+	 *
+	 * @param tableAutomaticFindLabelsValue   The type is <code>Boolean</code>
+	 */
+	public void setTableAutomaticFindLabelsAttribute(Boolean tableAutomaticFindLabelsValue) {
+		TableAutomaticFindLabelsAttribute attr = new TableAutomaticFindLabelsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableAutomaticFindLabelsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCaseSensitiveAttribute() {
+		TableCaseSensitiveAttribute attr = (TableCaseSensitiveAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "case-sensitive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableCaseSensitiveAttribute.DEFAULT_VALUE_TRUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @param tableCaseSensitiveValue   The type is <code>String</code>
+	 */
+	public void setTableCaseSensitiveAttribute(String tableCaseSensitiveValue) {
+		TableCaseSensitiveAttribute attr = new TableCaseSensitiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCaseSensitiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNullYearAttribute</code> , See {@odf.attribute table:null-year}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNullYearAttribute() {
+		TableNullYearAttribute attr = (TableNullYearAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "null-year");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableNullYearAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNullYearAttribute</code> , See {@odf.attribute table:null-year}
+	 *
+	 * @param tableNullYearValue   The type is <code>Integer</code>
+	 */
+	public void setTableNullYearAttribute(Integer tableNullYearValue) {
+		TableNullYearAttribute attr = new TableNullYearAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNullYearValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePrecisionAsShownAttribute</code> , See {@odf.attribute table:precision-as-shown}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTablePrecisionAsShownAttribute() {
+		TablePrecisionAsShownAttribute attr = (TablePrecisionAsShownAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "precision-as-shown");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TablePrecisionAsShownAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePrecisionAsShownAttribute</code> , See {@odf.attribute table:precision-as-shown}
+	 *
+	 * @param tablePrecisionAsShownValue   The type is <code>Boolean</code>
+	 */
+	public void setTablePrecisionAsShownAttribute(Boolean tablePrecisionAsShownValue) {
+		TablePrecisionAsShownAttribute attr = new TablePrecisionAsShownAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tablePrecisionAsShownValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSearchCriteriaMustApplyToWholeCellAttribute</code> , See {@odf.attribute table:search-criteria-must-apply-to-whole-cell}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableSearchCriteriaMustApplyToWholeCellAttribute() {
+		TableSearchCriteriaMustApplyToWholeCellAttribute attr = (TableSearchCriteriaMustApplyToWholeCellAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "search-criteria-must-apply-to-whole-cell");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableSearchCriteriaMustApplyToWholeCellAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSearchCriteriaMustApplyToWholeCellAttribute</code> , See {@odf.attribute table:search-criteria-must-apply-to-whole-cell}
+	 *
+	 * @param tableSearchCriteriaMustApplyToWholeCellValue   The type is <code>Boolean</code>
+	 */
+	public void setTableSearchCriteriaMustApplyToWholeCellAttribute(Boolean tableSearchCriteriaMustApplyToWholeCellValue) {
+		TableSearchCriteriaMustApplyToWholeCellAttribute attr = new TableSearchCriteriaMustApplyToWholeCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableSearchCriteriaMustApplyToWholeCellValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseRegularExpressionsAttribute</code> , See {@odf.attribute table:use-regular-expressions}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseRegularExpressionsAttribute() {
+		TableUseRegularExpressionsAttribute attr = (TableUseRegularExpressionsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-regular-expressions");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseRegularExpressionsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseRegularExpressionsAttribute</code> , See {@odf.attribute table:use-regular-expressions}
+	 *
+	 * @param tableUseRegularExpressionsValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseRegularExpressionsAttribute(Boolean tableUseRegularExpressionsValue) {
+		TableUseRegularExpressionsAttribute attr = new TableUseRegularExpressionsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseRegularExpressionsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseWildcardsAttribute</code> , See {@odf.attribute table:use-wildcards}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseWildcardsAttribute() {
+		TableUseWildcardsAttribute attr = (TableUseWildcardsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-wildcards");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseWildcardsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseWildcardsAttribute</code> , See {@odf.attribute table:use-wildcards}
+	 *
+	 * @param tableUseWildcardsValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseWildcardsAttribute(Boolean tableUseWildcardsValue) {
+		TableUseWildcardsAttribute attr = new TableUseWildcardsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseWildcardsValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:iteration}.
+	 *
+	 * @return the element {@odf.element table:iteration}
+	 */
+	public TableIterationElement newTableIterationElement() {
+		TableIterationElement tableIteration = ((OdfFileDom) this.ownerDocument).newOdfElement(TableIterationElement.class);
+		this.appendChild(tableIteration);
+		return tableIteration;
+	}
+
+	/**
+	 * Create child element {@odf.element table:null-date}.
+	 *
+	 * @return the element {@odf.element table:null-date}
+	 */
+	public TableNullDateElement newTableNullDateElement() {
+		TableNullDateElement tableNullDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNullDateElement.class);
+		this.appendChild(tableNullDate);
+		return tableNullDate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellAddressElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellAddressElement.java
new file mode 100644
index 0000000..5762350
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellAddressElement.java
@@ -0,0 +1,152 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:cell-address}.
+ *
+ */
+public class TableCellAddressElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-address");
+
+	/**
+	 * Create the instance of <code>TableCellAddressElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCellAddressElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:cell-address}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableColumnAttribute</code> , See {@odf.attribute table:column}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableColumnAttribute() {
+		TableColumnAttribute attr = (TableColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableColumnAttribute</code> , See {@odf.attribute table:column}
+	 *
+	 * @param tableColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableColumnAttribute(Integer tableColumnValue) {
+		TableColumnAttribute attr = new TableColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRowAttribute</code> , See {@odf.attribute table:row}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableRowAttribute() {
+		TableRowAttribute attr = (TableRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRowAttribute</code> , See {@odf.attribute table:row}
+	 *
+	 * @param tableRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableRowAttribute(Integer tableRowValue) {
+		TableRowAttribute attr = new TableRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableTableAttribute() {
+		TableTableAttribute attr = (TableTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @param tableTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableTableAttribute(Integer tableTableValue) {
+		TableTableAttribute attr = new TableTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableTableValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellContentChangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellContentChangeElement.java
new file mode 100644
index 0000000..ac9ef4b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellContentChangeElement.java
@@ -0,0 +1,216 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAcceptanceStateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRejectingChangeIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:cell-content-change}.
+ *
+ */
+public class TableCellContentChangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-content-change");
+
+	/**
+	 * Create the instance of <code>TableCellContentChangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCellContentChangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:cell-content-change}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableAcceptanceStateAttribute() {
+		TableAcceptanceStateAttribute attr = (TableAcceptanceStateAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "acceptance-state");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableAcceptanceStateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @param tableAcceptanceStateValue   The type is <code>String</code>
+	 */
+	public void setTableAcceptanceStateAttribute(String tableAcceptanceStateValue) {
+		TableAcceptanceStateAttribute attr = new TableAcceptanceStateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableAcceptanceStateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRejectingChangeIdAttribute() {
+		TableRejectingChangeIdAttribute attr = (TableRejectingChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "rejecting-change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @param tableRejectingChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTableRejectingChangeIdAttribute(String tableRejectingChangeIdValue) {
+		TableRejectingChangeIdAttribute attr = new TableRejectingChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRejectingChangeIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:cell-address}.
+	 *
+	 * @param tableColumnValue  the <code>Integer</code> value of <code>TableColumnAttribute</code>, see {@odf.attribute  table:column} at specification
+	 * @param tableRowValue  the <code>Integer</code> value of <code>TableRowAttribute</code>, see {@odf.attribute  table:row} at specification
+	 * @param tableTableValue  the <code>Integer</code> value of <code>TableTableAttribute</code>, see {@odf.attribute  table:table} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:cell-address}
+	 */
+	 public TableCellAddressElement newTableCellAddressElement(int tableColumnValue, int tableRowValue, int tableTableValue) {
+		TableCellAddressElement tableCellAddress = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCellAddressElement.class);
+		tableCellAddress.setTableColumnAttribute(tableColumnValue);
+		tableCellAddress.setTableRowAttribute(tableRowValue);
+		tableCellAddress.setTableTableAttribute(tableTableValue);
+		this.appendChild(tableCellAddress);
+		return tableCellAddress;
+	}
+
+	/**
+	 * Create child element {@odf.element table:deletions}.
+	 *
+	 * @return the element {@odf.element table:deletions}
+	 */
+	public TableDeletionsElement newTableDeletionsElement() {
+		TableDeletionsElement tableDeletions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDeletionsElement.class);
+		this.appendChild(tableDeletions);
+		return tableDeletions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dependencies}.
+	 *
+	 * @return the element {@odf.element table:dependencies}
+	 */
+	public TableDependenciesElement newTableDependenciesElement() {
+		TableDependenciesElement tableDependencies = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDependenciesElement.class);
+		this.appendChild(tableDependencies);
+		return tableDependencies;
+	}
+
+	/**
+	 * Create child element {@odf.element table:previous}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:previous}
+	 */
+	public TablePreviousElement newTablePreviousElement() {
+		TablePreviousElement tablePrevious = ((OdfFileDom) this.ownerDocument).newOdfElement(TablePreviousElement.class);
+		this.appendChild(tablePrevious);
+		return tablePrevious;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellContentDeletionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellContentDeletionElement.java
new file mode 100644
index 0000000..6d6962f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellContentDeletionElement.java
@@ -0,0 +1,128 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:cell-content-deletion}.
+ *
+ */
+public class TableCellContentDeletionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-content-deletion");
+
+	/**
+	 * Create the instance of <code>TableCellContentDeletionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCellContentDeletionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:cell-content-deletion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:cell-address}.
+	 *
+	 * @param tableColumnValue  the <code>Integer</code> value of <code>TableColumnAttribute</code>, see {@odf.attribute  table:column} at specification
+	 * @param tableRowValue  the <code>Integer</code> value of <code>TableRowAttribute</code>, see {@odf.attribute  table:row} at specification
+	 * @param tableTableValue  the <code>Integer</code> value of <code>TableTableAttribute</code>, see {@odf.attribute  table:table} at specification
+	 * @return the element {@odf.element table:cell-address}
+	 */
+	 public TableCellAddressElement newTableCellAddressElement(int tableColumnValue, int tableRowValue, int tableTableValue) {
+		TableCellAddressElement tableCellAddress = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCellAddressElement.class);
+		tableCellAddress.setTableColumnAttribute(tableColumnValue);
+		tableCellAddress.setTableRowAttribute(tableRowValue);
+		tableCellAddress.setTableTableAttribute(tableTableValue);
+		this.appendChild(tableCellAddress);
+		return tableCellAddress;
+	}
+
+	/**
+	 * Create child element {@odf.element table:change-track-table-cell}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element table:change-track-table-cell}
+	 */
+	 public TableChangeTrackTableCellElement newTableChangeTrackTableCellElement(double officeValueValue, String officeValueTypeValue) {
+		TableChangeTrackTableCellElement tableChangeTrackTableCell = ((OdfFileDom) this.ownerDocument).newOdfElement(TableChangeTrackTableCellElement.class);
+		tableChangeTrackTableCell.setOfficeValueAttribute(officeValueValue);
+		tableChangeTrackTableCell.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(tableChangeTrackTableCell);
+		return tableChangeTrackTableCell;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellRangeSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellRangeSourceElement.java
new file mode 100644
index 0000000..cf1ab83
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCellRangeSourceElement.java
@@ -0,0 +1,306 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFilterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFilterOptionsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLastColumnSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLastRowSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRefreshDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:cell-range-source}.
+ *
+ */
+public class TableCellRangeSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cell-range-source");
+
+	/**
+	 * Create the instance of <code>TableCellRangeSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCellRangeSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:cell-range-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFilterNameAttribute</code> , See {@odf.attribute table:filter-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFilterNameAttribute() {
+		TableFilterNameAttribute attr = (TableFilterNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "filter-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFilterNameAttribute</code> , See {@odf.attribute table:filter-name}
+	 *
+	 * @param tableFilterNameValue   The type is <code>String</code>
+	 */
+	public void setTableFilterNameAttribute(String tableFilterNameValue) {
+		TableFilterNameAttribute attr = new TableFilterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFilterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFilterOptionsAttribute</code> , See {@odf.attribute table:filter-options}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFilterOptionsAttribute() {
+		TableFilterOptionsAttribute attr = (TableFilterOptionsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "filter-options");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFilterOptionsAttribute</code> , See {@odf.attribute table:filter-options}
+	 *
+	 * @param tableFilterOptionsValue   The type is <code>String</code>
+	 */
+	public void setTableFilterOptionsAttribute(String tableFilterOptionsValue) {
+		TableFilterOptionsAttribute attr = new TableFilterOptionsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFilterOptionsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLastColumnSpannedAttribute</code> , See {@odf.attribute table:last-column-spanned}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableLastColumnSpannedAttribute() {
+		TableLastColumnSpannedAttribute attr = (TableLastColumnSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "last-column-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLastColumnSpannedAttribute</code> , See {@odf.attribute table:last-column-spanned}
+	 *
+	 * @param tableLastColumnSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableLastColumnSpannedAttribute(Integer tableLastColumnSpannedValue) {
+		TableLastColumnSpannedAttribute attr = new TableLastColumnSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableLastColumnSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLastRowSpannedAttribute</code> , See {@odf.attribute table:last-row-spanned}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableLastRowSpannedAttribute() {
+		TableLastRowSpannedAttribute attr = (TableLastRowSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "last-row-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLastRowSpannedAttribute</code> , See {@odf.attribute table:last-row-spanned}
+	 *
+	 * @param tableLastRowSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableLastRowSpannedAttribute(Integer tableLastRowSpannedValue) {
+		TableLastRowSpannedAttribute attr = new TableLastRowSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableLastRowSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRefreshDelayAttribute</code> , See {@odf.attribute table:refresh-delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRefreshDelayAttribute() {
+		TableRefreshDelayAttribute attr = (TableRefreshDelayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "refresh-delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRefreshDelayAttribute</code> , See {@odf.attribute table:refresh-delay}
+	 *
+	 * @param tableRefreshDelayValue   The type is <code>String</code>
+	 */
+	public void setTableRefreshDelayAttribute(String tableRefreshDelayValue) {
+		TableRefreshDelayAttribute attr = new TableRefreshDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRefreshDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableChangeDeletionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableChangeDeletionElement.java
new file mode 100644
index 0000000..dc3c45a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableChangeDeletionElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:change-deletion}.
+ *
+ */
+public class TableChangeDeletionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "change-deletion");
+
+	/**
+	 * Create the instance of <code>TableChangeDeletionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableChangeDeletionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:change-deletion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableChangeTrackTableCellElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableChangeTrackTableCellElement.java
new file mode 100644
index 0000000..06e0271
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableChangeTrackTableCellElement.java
@@ -0,0 +1,387 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMatrixCoveredAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberMatrixColumnsSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberMatrixRowsSpannedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:change-track-table-cell}.
+ *
+ */
+public class TableChangeTrackTableCellElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "change-track-table-cell");
+
+	/**
+	 * Create the instance of <code>TableChangeTrackTableCellElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableChangeTrackTableCellElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:change-track-table-cell}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellAddressAttribute</code> , See {@odf.attribute table:cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellAddressAttribute() {
+		TableCellAddressAttribute attr = (TableCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellAddressAttribute</code> , See {@odf.attribute table:cell-address}
+	 *
+	 * @param tableCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellAddressAttribute(String tableCellAddressValue) {
+		TableCellAddressAttribute attr = new TableCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFormulaAttribute</code> , See {@odf.attribute table:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFormulaAttribute() {
+		TableFormulaAttribute attr = (TableFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFormulaAttribute</code> , See {@odf.attribute table:formula}
+	 *
+	 * @param tableFormulaValue   The type is <code>String</code>
+	 */
+	public void setTableFormulaAttribute(String tableFormulaValue) {
+		TableFormulaAttribute attr = new TableFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMatrixCoveredAttribute</code> , See {@odf.attribute table:matrix-covered}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableMatrixCoveredAttribute() {
+		TableMatrixCoveredAttribute attr = (TableMatrixCoveredAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "matrix-covered");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableMatrixCoveredAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMatrixCoveredAttribute</code> , See {@odf.attribute table:matrix-covered}
+	 *
+	 * @param tableMatrixCoveredValue   The type is <code>Boolean</code>
+	 */
+	public void setTableMatrixCoveredAttribute(Boolean tableMatrixCoveredValue) {
+		TableMatrixCoveredAttribute attr = new TableMatrixCoveredAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableMatrixCoveredValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberMatrixColumnsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-columns-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberMatrixColumnsSpannedAttribute() {
+		TableNumberMatrixColumnsSpannedAttribute attr = (TableNumberMatrixColumnsSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-matrix-columns-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberMatrixColumnsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-columns-spanned}
+	 *
+	 * @param tableNumberMatrixColumnsSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberMatrixColumnsSpannedAttribute(Integer tableNumberMatrixColumnsSpannedValue) {
+		TableNumberMatrixColumnsSpannedAttribute attr = new TableNumberMatrixColumnsSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberMatrixColumnsSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberMatrixRowsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-rows-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberMatrixRowsSpannedAttribute() {
+		TableNumberMatrixRowsSpannedAttribute attr = (TableNumberMatrixRowsSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-matrix-rows-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberMatrixRowsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-rows-spanned}
+	 *
+	 * @param tableNumberMatrixRowsSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberMatrixRowsSpannedAttribute(Integer tableNumberMatrixRowsSpannedValue) {
+		TableNumberMatrixRowsSpannedAttribute attr = new TableNumberMatrixRowsSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberMatrixRowsSpannedValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableConsolidationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableConsolidationElement.java
new file mode 100644
index 0000000..762b319
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableConsolidationElement.java
@@ -0,0 +1,202 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFunctionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLinkToSourceDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSourceCellRangeAddressesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTargetCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseLabelsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:consolidation}.
+ *
+ */
+public class TableConsolidationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "consolidation");
+
+	/**
+	 * Create the instance of <code>TableConsolidationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableConsolidationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:consolidation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFunctionAttribute() {
+		TableFunctionAttribute attr = (TableFunctionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "function");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * @param tableFunctionValue   The type is <code>String</code>
+	 */
+	public void setTableFunctionAttribute(String tableFunctionValue) {
+		TableFunctionAttribute attr = new TableFunctionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFunctionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLinkToSourceDataAttribute</code> , See {@odf.attribute table:link-to-source-data}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableLinkToSourceDataAttribute() {
+		TableLinkToSourceDataAttribute attr = (TableLinkToSourceDataAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "link-to-source-data");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableLinkToSourceDataAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLinkToSourceDataAttribute</code> , See {@odf.attribute table:link-to-source-data}
+	 *
+	 * @param tableLinkToSourceDataValue   The type is <code>Boolean</code>
+	 */
+	public void setTableLinkToSourceDataAttribute(Boolean tableLinkToSourceDataValue) {
+		TableLinkToSourceDataAttribute attr = new TableLinkToSourceDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableLinkToSourceDataValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSourceCellRangeAddressesAttribute</code> , See {@odf.attribute table:source-cell-range-addresses}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSourceCellRangeAddressesAttribute() {
+		TableSourceCellRangeAddressesAttribute attr = (TableSourceCellRangeAddressesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "source-cell-range-addresses");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSourceCellRangeAddressesAttribute</code> , See {@odf.attribute table:source-cell-range-addresses}
+	 *
+	 * @param tableSourceCellRangeAddressesValue   The type is <code>String</code>
+	 */
+	public void setTableSourceCellRangeAddressesAttribute(String tableSourceCellRangeAddressesValue) {
+		TableSourceCellRangeAddressesAttribute attr = new TableSourceCellRangeAddressesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSourceCellRangeAddressesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTargetCellAddressAttribute</code> , See {@odf.attribute table:target-cell-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTargetCellAddressAttribute() {
+		TableTargetCellAddressAttribute attr = (TableTargetCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "target-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTargetCellAddressAttribute</code> , See {@odf.attribute table:target-cell-address}
+	 *
+	 * @param tableTargetCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableTargetCellAddressAttribute(String tableTargetCellAddressValue) {
+		TableTargetCellAddressAttribute attr = new TableTargetCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTargetCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseLabelsAttribute</code> , See {@odf.attribute table:use-labels}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableUseLabelsAttribute() {
+		TableUseLabelsAttribute attr = (TableUseLabelsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-labels");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableUseLabelsAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseLabelsAttribute</code> , See {@odf.attribute table:use-labels}
+	 *
+	 * @param tableUseLabelsValue   The type is <code>String</code>
+	 */
+	public void setTableUseLabelsAttribute(String tableUseLabelsValue) {
+		TableUseLabelsAttribute attr = new TableUseLabelsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableUseLabelsValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableContentValidationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableContentValidationElement.java
new file mode 100644
index 0000000..ae9e84f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableContentValidationElement.java
@@ -0,0 +1,243 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAllowEmptyCellAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBaseCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayListAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:content-validation}.
+ *
+ */
+public class TableContentValidationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "content-validation");
+
+	/**
+	 * Create the instance of <code>TableContentValidationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableContentValidationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:content-validation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAllowEmptyCellAttribute</code> , See {@odf.attribute table:allow-empty-cell}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableAllowEmptyCellAttribute() {
+		TableAllowEmptyCellAttribute attr = (TableAllowEmptyCellAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "allow-empty-cell");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableAllowEmptyCellAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAllowEmptyCellAttribute</code> , See {@odf.attribute table:allow-empty-cell}
+	 *
+	 * @param tableAllowEmptyCellValue   The type is <code>Boolean</code>
+	 */
+	public void setTableAllowEmptyCellAttribute(Boolean tableAllowEmptyCellValue) {
+		TableAllowEmptyCellAttribute attr = new TableAllowEmptyCellAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableAllowEmptyCellValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBaseCellAddressAttribute</code> , See {@odf.attribute table:base-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableBaseCellAddressAttribute() {
+		TableBaseCellAddressAttribute attr = (TableBaseCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "base-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBaseCellAddressAttribute</code> , See {@odf.attribute table:base-cell-address}
+	 *
+	 * @param tableBaseCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableBaseCellAddressAttribute(String tableBaseCellAddressValue) {
+		TableBaseCellAddressAttribute attr = new TableBaseCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableBaseCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableConditionAttribute</code> , See {@odf.attribute table:condition}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableConditionAttribute() {
+		TableConditionAttribute attr = (TableConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableConditionAttribute</code> , See {@odf.attribute table:condition}
+	 *
+	 * @param tableConditionValue   The type is <code>String</code>
+	 */
+	public void setTableConditionAttribute(String tableConditionValue) {
+		TableConditionAttribute attr = new TableConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayListAttribute</code> , See {@odf.attribute table:display-list}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDisplayListAttribute() {
+		TableDisplayListAttribute attr = (TableDisplayListAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display-list");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableDisplayListAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayListAttribute</code> , See {@odf.attribute table:display-list}
+	 *
+	 * @param tableDisplayListValue   The type is <code>String</code>
+	 */
+	public void setTableDisplayListAttribute(String tableDisplayListValue) {
+		TableDisplayListAttribute attr = new TableDisplayListAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDisplayListValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element table:error-macro}.
+	 *
+	 * @return the element {@odf.element table:error-macro}
+	 */
+	public TableErrorMacroElement newTableErrorMacroElement() {
+		TableErrorMacroElement tableErrorMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TableErrorMacroElement.class);
+		this.appendChild(tableErrorMacro);
+		return tableErrorMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element table:error-message}.
+	 *
+	 * @return the element {@odf.element table:error-message}
+	 */
+	public TableErrorMessageElement newTableErrorMessageElement() {
+		TableErrorMessageElement tableErrorMessage = ((OdfFileDom) this.ownerDocument).newOdfElement(TableErrorMessageElement.class);
+		this.appendChild(tableErrorMessage);
+		return tableErrorMessage;
+	}
+
+	/**
+	 * Create child element {@odf.element table:help-message}.
+	 *
+	 * @return the element {@odf.element table:help-message}
+	 */
+	public TableHelpMessageElement newTableHelpMessageElement() {
+		TableHelpMessageElement tableHelpMessage = ((OdfFileDom) this.ownerDocument).newOdfElement(TableHelpMessageElement.class);
+		this.appendChild(tableHelpMessage);
+		return tableHelpMessage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableContentValidationsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableContentValidationsElement.java
new file mode 100644
index 0000000..65f7785
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableContentValidationsElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:content-validations}.
+ *
+ */
+public class TableContentValidationsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "content-validations");
+
+	/**
+	 * Create the instance of <code>TableContentValidationsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableContentValidationsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:content-validations}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:content-validation}.
+	 *
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:content-validation}
+	 */
+	 public TableContentValidationElement newTableContentValidationElement(String tableNameValue) {
+		TableContentValidationElement tableContentValidation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableContentValidationElement.class);
+		tableContentValidation.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableContentValidation);
+		return tableContentValidation;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCoveredTableCellElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCoveredTableCellElement.java
new file mode 100644
index 0000000..393f19b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCoveredTableCellElement.java
@@ -0,0 +1,604 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberedParagraphElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:covered-table-cell}.
+ *
+ */
+public class TableCoveredTableCellElement extends TableTableCellElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell");
+
+	/**
+	 * Create the instance of <code>TableCoveredTableCellElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCoveredTableCellElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:covered-table-cell}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:cell-range-source}.
+	 *
+	 * @param tableLastColumnSpannedValue  the <code>Integer</code> value of <code>TableLastColumnSpannedAttribute</code>, see {@odf.attribute  table:last-column-spanned} at specification
+	 * @param tableLastRowSpannedValue  the <code>Integer</code> value of <code>TableLastRowSpannedAttribute</code>, see {@odf.attribute  table:last-row-spanned} at specification
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element table:cell-range-source}
+	 */
+	 public TableCellRangeSourceElement newTableCellRangeSourceElement(int tableLastColumnSpannedValue, int tableLastRowSpannedValue, String tableNameValue, String xlinkHrefValue, String xlinkTypeValue) {
+		TableCellRangeSourceElement tableCellRangeSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCellRangeSourceElement.class);
+		tableCellRangeSource.setTableLastColumnSpannedAttribute(tableLastColumnSpannedValue);
+		tableCellRangeSource.setTableLastRowSpannedAttribute(tableLastRowSpannedValue);
+		tableCellRangeSource.setTableNameAttribute(tableNameValue);
+		tableCellRangeSource.setXlinkHrefAttribute(xlinkHrefValue);
+		tableCellRangeSource.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(tableCellRangeSource);
+		return tableCellRangeSource;
+	}
+
+	/**
+	 * Create child element {@odf.element table:detective}.
+	 *
+	 * @return the element {@odf.element table:detective}
+	 */
+	public TableDetectiveElement newTableDetectiveElement() {
+		TableDetectiveElement tableDetective = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDetectiveElement.class);
+		this.appendChild(tableDetective);
+		return tableDetective;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCutOffsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCutOffsElement.java
new file mode 100644
index 0000000..6efcd07
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableCutOffsElement.java
@@ -0,0 +1,97 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:cut-offs}.
+ *
+ */
+public class TableCutOffsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "cut-offs");
+
+	/**
+	 * Create the instance of <code>TableCutOffsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableCutOffsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:cut-offs}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:insertion-cut-off}.
+	 *
+	 * @param tableIdValue  the <code>String</code> value of <code>TableIdAttribute</code>, see {@odf.attribute  table:id} at specification
+	 * @param tablePositionValue  the <code>Integer</code> value of <code>TablePositionAttribute</code>, see {@odf.attribute  table:position} at specification
+	 * @return the element {@odf.element table:insertion-cut-off}
+	 */
+	 public TableInsertionCutOffElement newTableInsertionCutOffElement(String tableIdValue, int tablePositionValue) {
+		TableInsertionCutOffElement tableInsertionCutOff = ((OdfFileDom) this.ownerDocument).newOdfElement(TableInsertionCutOffElement.class);
+		tableInsertionCutOff.setTableIdAttribute(tableIdValue);
+		tableInsertionCutOff.setTablePositionAttribute(tablePositionValue);
+		this.appendChild(tableInsertionCutOff);
+		return tableInsertionCutOff;
+	}
+
+	/**
+	 * Create child element {@odf.element table:movement-cut-off}.
+	 *
+	 * @return the element {@odf.element table:movement-cut-off}
+	 */
+	public TableMovementCutOffElement newTableMovementCutOffElement() {
+		TableMovementCutOffElement tableMovementCutOff = ((OdfFileDom) this.ownerDocument).newOdfElement(TableMovementCutOffElement.class);
+		this.appendChild(tableMovementCutOff);
+		return tableMovementCutOff;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotDisplayInfoElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotDisplayInfoElement.java
new file mode 100644
index 0000000..c5d822b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotDisplayInfoElement.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayMemberModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEnabledAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMemberCountAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-display-info}.
+ *
+ */
+public class TableDataPilotDisplayInfoElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-display-info");
+
+	/**
+	 * Create the instance of <code>TableDataPilotDisplayInfoElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotDisplayInfoElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-display-info}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDataFieldAttribute</code> , See {@odf.attribute table:data-field}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDataFieldAttribute() {
+		TableDataFieldAttribute attr = (TableDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDataFieldAttribute</code> , See {@odf.attribute table:data-field}
+	 *
+	 * @param tableDataFieldValue   The type is <code>String</code>
+	 */
+	public void setTableDataFieldAttribute(String tableDataFieldValue) {
+		TableDataFieldAttribute attr = new TableDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayMemberModeAttribute</code> , See {@odf.attribute table:display-member-mode}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDisplayMemberModeAttribute() {
+		TableDisplayMemberModeAttribute attr = (TableDisplayMemberModeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display-member-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayMemberModeAttribute</code> , See {@odf.attribute table:display-member-mode}
+	 *
+	 * @param tableDisplayMemberModeValue   The type is <code>String</code>
+	 */
+	public void setTableDisplayMemberModeAttribute(String tableDisplayMemberModeValue) {
+		TableDisplayMemberModeAttribute attr = new TableDisplayMemberModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDisplayMemberModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEnabledAttribute</code> , See {@odf.attribute table:enabled}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableEnabledAttribute() {
+		TableEnabledAttribute attr = (TableEnabledAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "enabled");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEnabledAttribute</code> , See {@odf.attribute table:enabled}
+	 *
+	 * @param tableEnabledValue   The type is <code>Boolean</code>
+	 */
+	public void setTableEnabledAttribute(Boolean tableEnabledValue) {
+		TableEnabledAttribute attr = new TableEnabledAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableEnabledValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMemberCountAttribute</code> , See {@odf.attribute table:member-count}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableMemberCountAttribute() {
+		TableMemberCountAttribute attr = (TableMemberCountAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "member-count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMemberCountAttribute</code> , See {@odf.attribute table:member-count}
+	 *
+	 * @param tableMemberCountValue   The type is <code>Integer</code>
+	 */
+	public void setTableMemberCountAttribute(Integer tableMemberCountValue) {
+		TableMemberCountAttribute attr = new TableMemberCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableMemberCountValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotFieldElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotFieldElement.java
new file mode 100644
index 0000000..01e7987
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotFieldElement.java
@@ -0,0 +1,270 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFunctionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIsDataLayoutFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOrientationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSelectedPageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSourceFieldNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUsedHierarchyAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-field}.
+ *
+ */
+public class TableDataPilotFieldElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-field");
+
+	/**
+	 * Create the instance of <code>TableDataPilotFieldElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotFieldElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-field}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFunctionAttribute() {
+		TableFunctionAttribute attr = (TableFunctionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "function");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * @param tableFunctionValue   The type is <code>String</code>
+	 */
+	public void setTableFunctionAttribute(String tableFunctionValue) {
+		TableFunctionAttribute attr = new TableFunctionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFunctionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIsDataLayoutFieldAttribute</code> , See {@odf.attribute table:is-data-layout-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIsDataLayoutFieldAttribute() {
+		TableIsDataLayoutFieldAttribute attr = (TableIsDataLayoutFieldAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "is-data-layout-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableIsDataLayoutFieldAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIsDataLayoutFieldAttribute</code> , See {@odf.attribute table:is-data-layout-field}
+	 *
+	 * @param tableIsDataLayoutFieldValue   The type is <code>String</code>
+	 */
+	public void setTableIsDataLayoutFieldAttribute(String tableIsDataLayoutFieldValue) {
+		TableIsDataLayoutFieldAttribute attr = new TableIsDataLayoutFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIsDataLayoutFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOrientationAttribute</code> , See {@odf.attribute table:orientation}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOrientationAttribute() {
+		TableOrientationAttribute attr = (TableOrientationAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "orientation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOrientationAttribute</code> , See {@odf.attribute table:orientation}
+	 *
+	 * @param tableOrientationValue   The type is <code>String</code>
+	 */
+	public void setTableOrientationAttribute(String tableOrientationValue) {
+		TableOrientationAttribute attr = new TableOrientationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOrientationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSelectedPageAttribute</code> , See {@odf.attribute table:selected-page}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSelectedPageAttribute() {
+		TableSelectedPageAttribute attr = (TableSelectedPageAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "selected-page");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSelectedPageAttribute</code> , See {@odf.attribute table:selected-page}
+	 *
+	 * @param tableSelectedPageValue   The type is <code>String</code>
+	 */
+	public void setTableSelectedPageAttribute(String tableSelectedPageValue) {
+		TableSelectedPageAttribute attr = new TableSelectedPageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSelectedPageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSourceFieldNameAttribute</code> , See {@odf.attribute table:source-field-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSourceFieldNameAttribute() {
+		TableSourceFieldNameAttribute attr = (TableSourceFieldNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "source-field-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSourceFieldNameAttribute</code> , See {@odf.attribute table:source-field-name}
+	 *
+	 * @param tableSourceFieldNameValue   The type is <code>String</code>
+	 */
+	public void setTableSourceFieldNameAttribute(String tableSourceFieldNameValue) {
+		TableSourceFieldNameAttribute attr = new TableSourceFieldNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSourceFieldNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUsedHierarchyAttribute</code> , See {@odf.attribute table:used-hierarchy}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableUsedHierarchyAttribute() {
+		TableUsedHierarchyAttribute attr = (TableUsedHierarchyAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "used-hierarchy");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableUsedHierarchyAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUsedHierarchyAttribute</code> , See {@odf.attribute table:used-hierarchy}
+	 *
+	 * @param tableUsedHierarchyValue   The type is <code>Integer</code>
+	 */
+	public void setTableUsedHierarchyAttribute(Integer tableUsedHierarchyValue) {
+		TableUsedHierarchyAttribute attr = new TableUsedHierarchyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableUsedHierarchyValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-field-reference}.
+	 *
+	 * @param tableFieldNameValue  the <code>String</code> value of <code>TableFieldNameAttribute</code>, see {@odf.attribute  table:field-name} at specification
+	 * @param tableMemberTypeValue  the <code>String</code> value of <code>TableMemberTypeAttribute</code>, see {@odf.attribute  table:member-type} at specification
+	 * @param tableTypeValue  the <code>String</code> value of <code>TableTypeAttribute</code>, see {@odf.attribute  table:type} at specification
+	 * @return the element {@odf.element table:data-pilot-field-reference}
+	 */
+	 public TableDataPilotFieldReferenceElement newTableDataPilotFieldReferenceElement(String tableFieldNameValue, String tableMemberTypeValue, String tableTypeValue) {
+		TableDataPilotFieldReferenceElement tableDataPilotFieldReference = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotFieldReferenceElement.class);
+		tableDataPilotFieldReference.setTableFieldNameAttribute(tableFieldNameValue);
+		tableDataPilotFieldReference.setTableMemberTypeAttribute(tableMemberTypeValue);
+		tableDataPilotFieldReference.setTableTypeAttribute(tableTypeValue);
+		this.appendChild(tableDataPilotFieldReference);
+		return tableDataPilotFieldReference;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-groups}.
+	 *
+	 * @param tableGroupedByValue  the <code>String</code> value of <code>TableGroupedByAttribute</code>, see {@odf.attribute  table:grouped-by} at specification
+	 * @param tableSourceFieldNameValue  the <code>String</code> value of <code>TableSourceFieldNameAttribute</code>, see {@odf.attribute  table:source-field-name} at specification
+	 * @param tableStepValue  the <code>Double</code> value of <code>TableStepAttribute</code>, see {@odf.attribute  table:step} at specification
+	 * @return the element {@odf.element table:data-pilot-groups}
+	 */
+	 public TableDataPilotGroupsElement newTableDataPilotGroupsElement(String tableGroupedByValue, String tableSourceFieldNameValue, double tableStepValue) {
+		TableDataPilotGroupsElement tableDataPilotGroups = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotGroupsElement.class);
+		tableDataPilotGroups.setTableGroupedByAttribute(tableGroupedByValue);
+		tableDataPilotGroups.setTableSourceFieldNameAttribute(tableSourceFieldNameValue);
+		tableDataPilotGroups.setTableStepAttribute(tableStepValue);
+		this.appendChild(tableDataPilotGroups);
+		return tableDataPilotGroups;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-level}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-level}
+	 */
+	public TableDataPilotLevelElement newTableDataPilotLevelElement() {
+		TableDataPilotLevelElement tableDataPilotLevel = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotLevelElement.class);
+		this.appendChild(tableDataPilotLevel);
+		return tableDataPilotLevel;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotFieldReferenceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotFieldReferenceElement.java
new file mode 100644
index 0000000..eb1f50c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotFieldReferenceElement.java
@@ -0,0 +1,177 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFieldNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMemberNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMemberTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-field-reference}.
+ *
+ */
+public class TableDataPilotFieldReferenceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-field-reference");
+
+	/**
+	 * Create the instance of <code>TableDataPilotFieldReferenceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotFieldReferenceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-field-reference}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFieldNameAttribute</code> , See {@odf.attribute table:field-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFieldNameAttribute() {
+		TableFieldNameAttribute attr = (TableFieldNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "field-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFieldNameAttribute</code> , See {@odf.attribute table:field-name}
+	 *
+	 * @param tableFieldNameValue   The type is <code>String</code>
+	 */
+	public void setTableFieldNameAttribute(String tableFieldNameValue) {
+		TableFieldNameAttribute attr = new TableFieldNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFieldNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMemberNameAttribute</code> , See {@odf.attribute table:member-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableMemberNameAttribute() {
+		TableMemberNameAttribute attr = (TableMemberNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "member-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMemberNameAttribute</code> , See {@odf.attribute table:member-name}
+	 *
+	 * @param tableMemberNameValue   The type is <code>String</code>
+	 */
+	public void setTableMemberNameAttribute(String tableMemberNameValue) {
+		TableMemberNameAttribute attr = new TableMemberNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableMemberNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMemberTypeAttribute</code> , See {@odf.attribute table:member-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableMemberTypeAttribute() {
+		TableMemberTypeAttribute attr = (TableMemberTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "member-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMemberTypeAttribute</code> , See {@odf.attribute table:member-type}
+	 *
+	 * @param tableMemberTypeValue   The type is <code>String</code>
+	 */
+	public void setTableMemberTypeAttribute(String tableMemberTypeValue) {
+		TableMemberTypeAttribute attr = new TableMemberTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableMemberTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTypeAttribute</code> , See {@odf.attribute table:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTypeAttribute() {
+		TableTypeAttribute attr = (TableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTypeAttribute</code> , See {@odf.attribute table:type}
+	 *
+	 * @param tableTypeValue   The type is <code>String</code>
+	 */
+	public void setTableTypeAttribute(String tableTypeValue) {
+		TableTypeAttribute attr = new TableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupElement.java
new file mode 100644
index 0000000..76d951c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupElement.java
@@ -0,0 +1,113 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-group}.
+ *
+ */
+public class TableDataPilotGroupElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-group");
+
+	/**
+	 * Create the instance of <code>TableDataPilotGroupElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotGroupElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-group}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-group-member}.
+	 *
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:data-pilot-group-member}
+	 */
+	 public TableDataPilotGroupMemberElement newTableDataPilotGroupMemberElement(String tableNameValue) {
+		TableDataPilotGroupMemberElement tableDataPilotGroupMember = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotGroupMemberElement.class);
+		tableDataPilotGroupMember.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableDataPilotGroupMember);
+		return tableDataPilotGroupMember;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupMemberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupMemberElement.java
new file mode 100644
index 0000000..ce727cf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupMemberElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-group-member}.
+ *
+ */
+public class TableDataPilotGroupMemberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-group-member");
+
+	/**
+	 * Create the instance of <code>TableDataPilotGroupMemberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotGroupMemberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-group-member}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupsElement.java
new file mode 100644
index 0000000..8174fc2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotGroupsElement.java
@@ -0,0 +1,267 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDateEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDateStartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableGroupedByAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSourceFieldNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStepAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-groups}.
+ *
+ */
+public class TableDataPilotGroupsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-groups");
+
+	/**
+	 * Create the instance of <code>TableDataPilotGroupsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotGroupsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-groups}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDateEndAttribute</code> , See {@odf.attribute table:date-end}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDateEndAttribute() {
+		TableDateEndAttribute attr = (TableDateEndAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "date-end");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDateEndAttribute</code> , See {@odf.attribute table:date-end}
+	 *
+	 * @param tableDateEndValue   The type is <code>String</code>
+	 */
+	public void setTableDateEndAttribute(String tableDateEndValue) {
+		TableDateEndAttribute attr = new TableDateEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDateEndValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDateStartAttribute</code> , See {@odf.attribute table:date-start}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDateStartAttribute() {
+		TableDateStartAttribute attr = (TableDateStartAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "date-start");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDateStartAttribute</code> , See {@odf.attribute table:date-start}
+	 *
+	 * @param tableDateStartValue   The type is <code>String</code>
+	 */
+	public void setTableDateStartAttribute(String tableDateStartValue) {
+		TableDateStartAttribute attr = new TableDateStartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDateStartValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndAttribute</code> , See {@odf.attribute table:end}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getTableEndAttribute() {
+		TableEndAttribute attr = (TableEndAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndAttribute</code> , See {@odf.attribute table:end}
+	 *
+	 * @param tableEndValue   The type is <code>Double</code>
+	 */
+	public void setTableEndAttribute(Double tableEndValue) {
+		TableEndAttribute attr = new TableEndAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(tableEndValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableGroupedByAttribute</code> , See {@odf.attribute table:grouped-by}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableGroupedByAttribute() {
+		TableGroupedByAttribute attr = (TableGroupedByAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "grouped-by");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableGroupedByAttribute</code> , See {@odf.attribute table:grouped-by}
+	 *
+	 * @param tableGroupedByValue   The type is <code>String</code>
+	 */
+	public void setTableGroupedByAttribute(String tableGroupedByValue) {
+		TableGroupedByAttribute attr = new TableGroupedByAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableGroupedByValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSourceFieldNameAttribute</code> , See {@odf.attribute table:source-field-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSourceFieldNameAttribute() {
+		TableSourceFieldNameAttribute attr = (TableSourceFieldNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "source-field-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSourceFieldNameAttribute</code> , See {@odf.attribute table:source-field-name}
+	 *
+	 * @param tableSourceFieldNameValue   The type is <code>String</code>
+	 */
+	public void setTableSourceFieldNameAttribute(String tableSourceFieldNameValue) {
+		TableSourceFieldNameAttribute attr = new TableSourceFieldNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSourceFieldNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartAttribute</code> , See {@odf.attribute table:start}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getTableStartAttribute() {
+		TableStartAttribute attr = (TableStartAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartAttribute</code> , See {@odf.attribute table:start}
+	 *
+	 * @param tableStartValue   The type is <code>Double</code>
+	 */
+	public void setTableStartAttribute(Double tableStartValue) {
+		TableStartAttribute attr = new TableStartAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(tableStartValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStepAttribute</code> , See {@odf.attribute table:step}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getTableStepAttribute() {
+		TableStepAttribute attr = (TableStepAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "step");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStepAttribute</code> , See {@odf.attribute table:step}
+	 *
+	 * @param tableStepValue   The type is <code>Double</code>
+	 */
+	public void setTableStepAttribute(Double tableStepValue) {
+		TableStepAttribute attr = new TableStepAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(tableStepValue.doubleValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-group}.
+	 *
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:data-pilot-group}
+	 */
+	 public TableDataPilotGroupElement newTableDataPilotGroupElement(String tableNameValue) {
+		TableDataPilotGroupElement tableDataPilotGroup = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotGroupElement.class);
+		tableDataPilotGroup.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableDataPilotGroup);
+		return tableDataPilotGroup;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotLayoutInfoElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotLayoutInfoElement.java
new file mode 100644
index 0000000..9d5c708
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotLayoutInfoElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAddEmptyLinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLayoutModeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-layout-info}.
+ *
+ */
+public class TableDataPilotLayoutInfoElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-layout-info");
+
+	/**
+	 * Create the instance of <code>TableDataPilotLayoutInfoElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotLayoutInfoElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-layout-info}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAddEmptyLinesAttribute</code> , See {@odf.attribute table:add-empty-lines}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableAddEmptyLinesAttribute() {
+		TableAddEmptyLinesAttribute attr = (TableAddEmptyLinesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "add-empty-lines");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAddEmptyLinesAttribute</code> , See {@odf.attribute table:add-empty-lines}
+	 *
+	 * @param tableAddEmptyLinesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableAddEmptyLinesAttribute(Boolean tableAddEmptyLinesValue) {
+		TableAddEmptyLinesAttribute attr = new TableAddEmptyLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableAddEmptyLinesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLayoutModeAttribute</code> , See {@odf.attribute table:layout-mode}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableLayoutModeAttribute() {
+		TableLayoutModeAttribute attr = (TableLayoutModeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "layout-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLayoutModeAttribute</code> , See {@odf.attribute table:layout-mode}
+	 *
+	 * @param tableLayoutModeValue   The type is <code>String</code>
+	 */
+	public void setTableLayoutModeAttribute(String tableLayoutModeValue) {
+		TableLayoutModeAttribute attr = new TableLayoutModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableLayoutModeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotLevelElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotLevelElement.java
new file mode 100644
index 0000000..5e50c1f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotLevelElement.java
@@ -0,0 +1,167 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableShowEmptyAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-level}.
+ *
+ */
+public class TableDataPilotLevelElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-level");
+
+	/**
+	 * Create the instance of <code>TableDataPilotLevelElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotLevelElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-level}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableShowEmptyAttribute</code> , See {@odf.attribute table:show-empty}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableShowEmptyAttribute() {
+		TableShowEmptyAttribute attr = (TableShowEmptyAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "show-empty");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableShowEmptyAttribute</code> , See {@odf.attribute table:show-empty}
+	 *
+	 * @param tableShowEmptyValue   The type is <code>Boolean</code>
+	 */
+	public void setTableShowEmptyAttribute(Boolean tableShowEmptyValue) {
+		TableShowEmptyAttribute attr = new TableShowEmptyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableShowEmptyValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-display-info}.
+	 *
+	 * @param tableDataFieldValue  the <code>String</code> value of <code>TableDataFieldAttribute</code>, see {@odf.attribute  table:data-field} at specification
+	 * @param tableDisplayMemberModeValue  the <code>String</code> value of <code>TableDisplayMemberModeAttribute</code>, see {@odf.attribute  table:display-member-mode} at specification
+	 * @param tableEnabledValue  the <code>Boolean</code> value of <code>TableEnabledAttribute</code>, see {@odf.attribute  table:enabled} at specification
+	 * @param tableMemberCountValue  the <code>Integer</code> value of <code>TableMemberCountAttribute</code>, see {@odf.attribute  table:member-count} at specification
+	 * @return the element {@odf.element table:data-pilot-display-info}
+	 */
+	 public TableDataPilotDisplayInfoElement newTableDataPilotDisplayInfoElement(String tableDataFieldValue, String tableDisplayMemberModeValue, boolean tableEnabledValue, int tableMemberCountValue) {
+		TableDataPilotDisplayInfoElement tableDataPilotDisplayInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotDisplayInfoElement.class);
+		tableDataPilotDisplayInfo.setTableDataFieldAttribute(tableDataFieldValue);
+		tableDataPilotDisplayInfo.setTableDisplayMemberModeAttribute(tableDisplayMemberModeValue);
+		tableDataPilotDisplayInfo.setTableEnabledAttribute(tableEnabledValue);
+		tableDataPilotDisplayInfo.setTableMemberCountAttribute(tableMemberCountValue);
+		this.appendChild(tableDataPilotDisplayInfo);
+		return tableDataPilotDisplayInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-layout-info}.
+	 *
+	 * @param tableAddEmptyLinesValue  the <code>Boolean</code> value of <code>TableAddEmptyLinesAttribute</code>, see {@odf.attribute  table:add-empty-lines} at specification
+	 * @param tableLayoutModeValue  the <code>String</code> value of <code>TableLayoutModeAttribute</code>, see {@odf.attribute  table:layout-mode} at specification
+	 * @return the element {@odf.element table:data-pilot-layout-info}
+	 */
+	 public TableDataPilotLayoutInfoElement newTableDataPilotLayoutInfoElement(boolean tableAddEmptyLinesValue, String tableLayoutModeValue) {
+		TableDataPilotLayoutInfoElement tableDataPilotLayoutInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotLayoutInfoElement.class);
+		tableDataPilotLayoutInfo.setTableAddEmptyLinesAttribute(tableAddEmptyLinesValue);
+		tableDataPilotLayoutInfo.setTableLayoutModeAttribute(tableLayoutModeValue);
+		this.appendChild(tableDataPilotLayoutInfo);
+		return tableDataPilotLayoutInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-members}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-members}
+	 */
+	public TableDataPilotMembersElement newTableDataPilotMembersElement() {
+		TableDataPilotMembersElement tableDataPilotMembers = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotMembersElement.class);
+		this.appendChild(tableDataPilotMembers);
+		return tableDataPilotMembers;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-sort-info}.
+	 *
+	 * @param tableOrderValue  the <code>String</code> value of <code>TableOrderAttribute</code>, see {@odf.attribute  table:order} at specification
+	 * @param tableSortModeValue  the <code>String</code> value of <code>TableSortModeAttribute</code>, see {@odf.attribute  table:sort-mode} at specification
+	 * @return the element {@odf.element table:data-pilot-sort-info}
+	 */
+	 public TableDataPilotSortInfoElement newTableDataPilotSortInfoElement(String tableOrderValue, String tableSortModeValue) {
+		TableDataPilotSortInfoElement tableDataPilotSortInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotSortInfoElement.class);
+		tableDataPilotSortInfo.setTableOrderAttribute(tableOrderValue);
+		tableDataPilotSortInfo.setTableSortModeAttribute(tableSortModeValue);
+		this.appendChild(tableDataPilotSortInfo);
+		return tableDataPilotSortInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-subtotals}.
+	 *
+	 * @return the element {@odf.element table:data-pilot-subtotals}
+	 */
+	public TableDataPilotSubtotalsElement newTableDataPilotSubtotalsElement() {
+		TableDataPilotSubtotalsElement tableDataPilotSubtotals = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotSubtotalsElement.class);
+		this.appendChild(tableDataPilotSubtotals);
+		return tableDataPilotSubtotals;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotMemberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotMemberElement.java
new file mode 100644
index 0000000..cf6d2ec
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotMemberElement.java
@@ -0,0 +1,148 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableShowDetailsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-member}.
+ *
+ */
+public class TableDataPilotMemberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-member");
+
+	/**
+	 * Create the instance of <code>TableDataPilotMemberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotMemberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-member}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayAttribute() {
+		TableDisplayAttribute attr = (TableDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @param tableDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayAttribute(Boolean tableDisplayValue) {
+		TableDisplayAttribute attr = new TableDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableShowDetailsAttribute</code> , See {@odf.attribute table:show-details}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableShowDetailsAttribute() {
+		TableShowDetailsAttribute attr = (TableShowDetailsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "show-details");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableShowDetailsAttribute</code> , See {@odf.attribute table:show-details}
+	 *
+	 * @param tableShowDetailsValue   The type is <code>Boolean</code>
+	 */
+	public void setTableShowDetailsAttribute(Boolean tableShowDetailsValue) {
+		TableShowDetailsAttribute attr = new TableShowDetailsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableShowDetailsValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotMembersElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotMembersElement.java
new file mode 100644
index 0000000..498c23b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotMembersElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-members}.
+ *
+ */
+public class TableDataPilotMembersElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-members");
+
+	/**
+	 * Create the instance of <code>TableDataPilotMembersElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotMembersElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-members}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-member}.
+	 *
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @return the element {@odf.element table:data-pilot-member}
+	 */
+	 public TableDataPilotMemberElement newTableDataPilotMemberElement(String tableNameValue) {
+		TableDataPilotMemberElement tableDataPilotMember = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotMemberElement.class);
+		tableDataPilotMember.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableDataPilotMember);
+		return tableDataPilotMember;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSortInfoElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSortInfoElement.java
new file mode 100644
index 0000000..efbfa11
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSortInfoElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOrderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSortModeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-sort-info}.
+ *
+ */
+public class TableDataPilotSortInfoElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-sort-info");
+
+	/**
+	 * Create the instance of <code>TableDataPilotSortInfoElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotSortInfoElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-sort-info}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDataFieldAttribute</code> , See {@odf.attribute table:data-field}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDataFieldAttribute() {
+		TableDataFieldAttribute attr = (TableDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDataFieldAttribute</code> , See {@odf.attribute table:data-field}
+	 *
+	 * @param tableDataFieldValue   The type is <code>String</code>
+	 */
+	public void setTableDataFieldAttribute(String tableDataFieldValue) {
+		TableDataFieldAttribute attr = new TableDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOrderAttribute</code> , See {@odf.attribute table:order}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOrderAttribute() {
+		TableOrderAttribute attr = (TableOrderAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "order");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOrderAttribute</code> , See {@odf.attribute table:order}
+	 *
+	 * @param tableOrderValue   The type is <code>String</code>
+	 */
+	public void setTableOrderAttribute(String tableOrderValue) {
+		TableOrderAttribute attr = new TableOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOrderValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSortModeAttribute</code> , See {@odf.attribute table:sort-mode}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSortModeAttribute() {
+		TableSortModeAttribute attr = (TableSortModeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "sort-mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSortModeAttribute</code> , See {@odf.attribute table:sort-mode}
+	 *
+	 * @param tableSortModeValue   The type is <code>String</code>
+	 */
+	public void setTableSortModeAttribute(String tableSortModeValue) {
+		TableSortModeAttribute attr = new TableSortModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSortModeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSubtotalElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSubtotalElement.java
new file mode 100644
index 0000000..957fbcd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSubtotalElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFunctionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-subtotal}.
+ *
+ */
+public class TableDataPilotSubtotalElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-subtotal");
+
+	/**
+	 * Create the instance of <code>TableDataPilotSubtotalElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotSubtotalElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-subtotal}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFunctionAttribute() {
+		TableFunctionAttribute attr = (TableFunctionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "function");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * @param tableFunctionValue   The type is <code>String</code>
+	 */
+	public void setTableFunctionAttribute(String tableFunctionValue) {
+		TableFunctionAttribute attr = new TableFunctionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFunctionValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSubtotalsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSubtotalsElement.java
new file mode 100644
index 0000000..0c183a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotSubtotalsElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-subtotals}.
+ *
+ */
+public class TableDataPilotSubtotalsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-subtotals");
+
+	/**
+	 * Create the instance of <code>TableDataPilotSubtotalsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotSubtotalsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-subtotals}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-subtotal}.
+	 *
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @return the element {@odf.element table:data-pilot-subtotal}
+	 */
+	 public TableDataPilotSubtotalElement newTableDataPilotSubtotalElement(String tableFunctionValue) {
+		TableDataPilotSubtotalElement tableDataPilotSubtotal = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotSubtotalElement.class);
+		tableDataPilotSubtotal.setTableFunctionAttribute(tableFunctionValue);
+		this.appendChild(tableDataPilotSubtotal);
+		return tableDataPilotSubtotal;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotTableElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotTableElement.java
new file mode 100644
index 0000000..4dd4aff
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotTableElement.java
@@ -0,0 +1,392 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableApplicationDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableButtonsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDrillDownOnDoubleClickAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableGrandTotalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdentifyCategoriesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIgnoreEmptyRowsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableShowFilterButtonAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTargetRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-table}.
+ *
+ */
+public class TableDataPilotTableElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-table");
+
+	/**
+	 * Create the instance of <code>TableDataPilotTableElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotTableElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-table}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableApplicationDataAttribute</code> , See {@odf.attribute table:application-data}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableApplicationDataAttribute() {
+		TableApplicationDataAttribute attr = (TableApplicationDataAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "application-data");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableApplicationDataAttribute</code> , See {@odf.attribute table:application-data}
+	 *
+	 * @param tableApplicationDataValue   The type is <code>String</code>
+	 */
+	public void setTableApplicationDataAttribute(String tableApplicationDataValue) {
+		TableApplicationDataAttribute attr = new TableApplicationDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableApplicationDataValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableButtonsAttribute</code> , See {@odf.attribute table:buttons}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableButtonsAttribute() {
+		TableButtonsAttribute attr = (TableButtonsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "buttons");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableButtonsAttribute</code> , See {@odf.attribute table:buttons}
+	 *
+	 * @param tableButtonsValue   The type is <code>String</code>
+	 */
+	public void setTableButtonsAttribute(String tableButtonsValue) {
+		TableButtonsAttribute attr = new TableButtonsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableButtonsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDrillDownOnDoubleClickAttribute</code> , See {@odf.attribute table:drill-down-on-double-click}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDrillDownOnDoubleClickAttribute() {
+		TableDrillDownOnDoubleClickAttribute attr = (TableDrillDownOnDoubleClickAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "drill-down-on-double-click");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDrillDownOnDoubleClickAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDrillDownOnDoubleClickAttribute</code> , See {@odf.attribute table:drill-down-on-double-click}
+	 *
+	 * @param tableDrillDownOnDoubleClickValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDrillDownOnDoubleClickAttribute(Boolean tableDrillDownOnDoubleClickValue) {
+		TableDrillDownOnDoubleClickAttribute attr = new TableDrillDownOnDoubleClickAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDrillDownOnDoubleClickValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableGrandTotalAttribute</code> , See {@odf.attribute table:grand-total}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableGrandTotalAttribute() {
+		TableGrandTotalAttribute attr = (TableGrandTotalAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "grand-total");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableGrandTotalAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableGrandTotalAttribute</code> , See {@odf.attribute table:grand-total}
+	 *
+	 * @param tableGrandTotalValue   The type is <code>String</code>
+	 */
+	public void setTableGrandTotalAttribute(String tableGrandTotalValue) {
+		TableGrandTotalAttribute attr = new TableGrandTotalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableGrandTotalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdentifyCategoriesAttribute</code> , See {@odf.attribute table:identify-categories}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableIdentifyCategoriesAttribute() {
+		TableIdentifyCategoriesAttribute attr = (TableIdentifyCategoriesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "identify-categories");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableIdentifyCategoriesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdentifyCategoriesAttribute</code> , See {@odf.attribute table:identify-categories}
+	 *
+	 * @param tableIdentifyCategoriesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableIdentifyCategoriesAttribute(Boolean tableIdentifyCategoriesValue) {
+		TableIdentifyCategoriesAttribute attr = new TableIdentifyCategoriesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableIdentifyCategoriesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIgnoreEmptyRowsAttribute</code> , See {@odf.attribute table:ignore-empty-rows}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableIgnoreEmptyRowsAttribute() {
+		TableIgnoreEmptyRowsAttribute attr = (TableIgnoreEmptyRowsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "ignore-empty-rows");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableIgnoreEmptyRowsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIgnoreEmptyRowsAttribute</code> , See {@odf.attribute table:ignore-empty-rows}
+	 *
+	 * @param tableIgnoreEmptyRowsValue   The type is <code>Boolean</code>
+	 */
+	public void setTableIgnoreEmptyRowsAttribute(Boolean tableIgnoreEmptyRowsValue) {
+		TableIgnoreEmptyRowsAttribute attr = new TableIgnoreEmptyRowsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableIgnoreEmptyRowsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableShowFilterButtonAttribute</code> , See {@odf.attribute table:show-filter-button}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableShowFilterButtonAttribute() {
+		TableShowFilterButtonAttribute attr = (TableShowFilterButtonAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "show-filter-button");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableShowFilterButtonAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableShowFilterButtonAttribute</code> , See {@odf.attribute table:show-filter-button}
+	 *
+	 * @param tableShowFilterButtonValue   The type is <code>Boolean</code>
+	 */
+	public void setTableShowFilterButtonAttribute(Boolean tableShowFilterButtonValue) {
+		TableShowFilterButtonAttribute attr = new TableShowFilterButtonAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableShowFilterButtonValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTargetRangeAddressAttribute() {
+		TableTargetRangeAddressAttribute attr = (TableTargetRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "target-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * @param tableTargetRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableTargetRangeAddressAttribute(String tableTargetRangeAddressValue) {
+		TableTargetRangeAddressAttribute attr = new TableTargetRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTargetRangeAddressValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-field}.
+	 *
+	 * @param tableOrientationValue  the <code>String</code> value of <code>TableOrientationAttribute</code>, see {@odf.attribute  table:orientation} at specification
+	 * @param tableSourceFieldNameValue  the <code>String</code> value of <code>TableSourceFieldNameAttribute</code>, see {@odf.attribute  table:source-field-name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:data-pilot-field}
+	 */
+	 public TableDataPilotFieldElement newTableDataPilotFieldElement(String tableOrientationValue, String tableSourceFieldNameValue) {
+		TableDataPilotFieldElement tableDataPilotField = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotFieldElement.class);
+		tableDataPilotField.setTableOrientationAttribute(tableOrientationValue);
+		tableDataPilotField.setTableSourceFieldNameAttribute(tableSourceFieldNameValue);
+		this.appendChild(tableDataPilotField);
+		return tableDataPilotField;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-source-query}.
+	 *
+	 * @param tableDatabaseNameValue  the <code>String</code> value of <code>TableDatabaseNameAttribute</code>, see {@odf.attribute  table:database-name} at specification
+	 * @param tableQueryNameValue  the <code>String</code> value of <code>TableQueryNameAttribute</code>, see {@odf.attribute  table:query-name} at specification
+	 * @return the element {@odf.element table:database-source-query}
+	 */
+	 public TableDatabaseSourceQueryElement newTableDatabaseSourceQueryElement(String tableDatabaseNameValue, String tableQueryNameValue) {
+		TableDatabaseSourceQueryElement tableDatabaseSourceQuery = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseSourceQueryElement.class);
+		tableDatabaseSourceQuery.setTableDatabaseNameAttribute(tableDatabaseNameValue);
+		tableDatabaseSourceQuery.setTableQueryNameAttribute(tableQueryNameValue);
+		this.appendChild(tableDatabaseSourceQuery);
+		return tableDatabaseSourceQuery;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-source-sql}.
+	 *
+	 * @param tableDatabaseNameValue  the <code>String</code> value of <code>TableDatabaseNameAttribute</code>, see {@odf.attribute  table:database-name} at specification
+	 * @param tableSqlStatementValue  the <code>String</code> value of <code>TableSqlStatementAttribute</code>, see {@odf.attribute  table:sql-statement} at specification
+	 * @return the element {@odf.element table:database-source-sql}
+	 */
+	 public TableDatabaseSourceSqlElement newTableDatabaseSourceSqlElement(String tableDatabaseNameValue, String tableSqlStatementValue) {
+		TableDatabaseSourceSqlElement tableDatabaseSourceSql = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseSourceSqlElement.class);
+		tableDatabaseSourceSql.setTableDatabaseNameAttribute(tableDatabaseNameValue);
+		tableDatabaseSourceSql.setTableSqlStatementAttribute(tableSqlStatementValue);
+		this.appendChild(tableDatabaseSourceSql);
+		return tableDatabaseSourceSql;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-source-table}.
+	 *
+	 * @param tableDatabaseNameValue  the <code>String</code> value of <code>TableDatabaseNameAttribute</code>, see {@odf.attribute  table:database-name} at specification
+	 * @param tableDatabaseTableNameValue  the <code>String</code> value of <code>TableDatabaseTableNameAttribute</code>, see {@odf.attribute  table:database-table-name} at specification
+	 * @return the element {@odf.element table:database-source-table}
+	 */
+	 public TableDatabaseSourceTableElement newTableDatabaseSourceTableElement(String tableDatabaseNameValue, String tableDatabaseTableNameValue) {
+		TableDatabaseSourceTableElement tableDatabaseSourceTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseSourceTableElement.class);
+		tableDatabaseSourceTable.setTableDatabaseNameAttribute(tableDatabaseNameValue);
+		tableDatabaseSourceTable.setTableDatabaseTableNameAttribute(tableDatabaseTableNameValue);
+		this.appendChild(tableDatabaseSourceTable);
+		return tableDatabaseSourceTable;
+	}
+
+	/**
+	 * Create child element {@odf.element table:source-cell-range}.
+	 *
+	 * @param tableCellRangeAddressValue  the <code>String</code> value of <code>TableCellRangeAddressAttribute</code>, see {@odf.attribute  table:cell-range-address} at specification
+	 * @return the element {@odf.element table:source-cell-range}
+	 */
+	 public TableSourceCellRangeElement newTableSourceCellRangeElement(String tableCellRangeAddressValue) {
+		TableSourceCellRangeElement tableSourceCellRange = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSourceCellRangeElement.class);
+		tableSourceCellRange.setTableCellRangeAddressAttribute(tableCellRangeAddressValue);
+		this.appendChild(tableSourceCellRange);
+		return tableSourceCellRange;
+	}
+
+	/**
+	 * Create child element {@odf.element table:source-service}.
+	 *
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @param tableObjectNameValue  the <code>String</code> value of <code>TableObjectNameAttribute</code>, see {@odf.attribute  table:object-name} at specification
+	 * @param tableSourceNameValue  the <code>String</code> value of <code>TableSourceNameAttribute</code>, see {@odf.attribute  table:source-name} at specification
+	 * @return the element {@odf.element table:source-service}
+	 */
+	 public TableSourceServiceElement newTableSourceServiceElement(String tableNameValue, String tableObjectNameValue, String tableSourceNameValue) {
+		TableSourceServiceElement tableSourceService = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSourceServiceElement.class);
+		tableSourceService.setTableNameAttribute(tableNameValue);
+		tableSourceService.setTableObjectNameAttribute(tableObjectNameValue);
+		tableSourceService.setTableSourceNameAttribute(tableSourceNameValue);
+		this.appendChild(tableSourceService);
+		return tableSourceService;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotTablesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotTablesElement.java
new file mode 100644
index 0000000..fe8762e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDataPilotTablesElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:data-pilot-tables}.
+ *
+ */
+public class TableDataPilotTablesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "data-pilot-tables");
+
+	/**
+	 * Create the instance of <code>TableDataPilotTablesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDataPilotTablesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:data-pilot-tables}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:data-pilot-table}.
+	 *
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @param tableTargetRangeAddressValue  the <code>String</code> value of <code>TableTargetRangeAddressAttribute</code>, see {@odf.attribute  table:target-range-address} at specification
+	 * @return the element {@odf.element table:data-pilot-table}
+	 */
+	 public TableDataPilotTableElement newTableDataPilotTableElement(String tableNameValue, String tableTargetRangeAddressValue) {
+		TableDataPilotTableElement tableDataPilotTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDataPilotTableElement.class);
+		tableDataPilotTable.setTableNameAttribute(tableNameValue);
+		tableDataPilotTable.setTableTargetRangeAddressAttribute(tableTargetRangeAddressValue);
+		this.appendChild(tableDataPilotTable);
+		return tableDataPilotTable;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseRangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseRangeElement.java
new file mode 100644
index 0000000..b061835
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseRangeElement.java
@@ -0,0 +1,401 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableContainsHeaderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayFilterButtonsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableHasPersistentDataAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIsSelectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOnUpdateKeepSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOnUpdateKeepStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOrientationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRefreshDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTargetRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:database-range}.
+ *
+ */
+public class TableDatabaseRangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-range");
+
+	/**
+	 * Create the instance of <code>TableDatabaseRangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseRangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:database-range}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableContainsHeaderAttribute</code> , See {@odf.attribute table:contains-header}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableContainsHeaderAttribute() {
+		TableContainsHeaderAttribute attr = (TableContainsHeaderAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "contains-header");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableContainsHeaderAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableContainsHeaderAttribute</code> , See {@odf.attribute table:contains-header}
+	 *
+	 * @param tableContainsHeaderValue   The type is <code>Boolean</code>
+	 */
+	public void setTableContainsHeaderAttribute(Boolean tableContainsHeaderValue) {
+		TableContainsHeaderAttribute attr = new TableContainsHeaderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableContainsHeaderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayFilterButtonsAttribute</code> , See {@odf.attribute table:display-filter-buttons}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayFilterButtonsAttribute() {
+		TableDisplayFilterButtonsAttribute attr = (TableDisplayFilterButtonsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display-filter-buttons");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayFilterButtonsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayFilterButtonsAttribute</code> , See {@odf.attribute table:display-filter-buttons}
+	 *
+	 * @param tableDisplayFilterButtonsValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayFilterButtonsAttribute(Boolean tableDisplayFilterButtonsValue) {
+		TableDisplayFilterButtonsAttribute attr = new TableDisplayFilterButtonsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayFilterButtonsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableHasPersistentDataAttribute</code> , See {@odf.attribute table:has-persistent-data}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableHasPersistentDataAttribute() {
+		TableHasPersistentDataAttribute attr = (TableHasPersistentDataAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "has-persistent-data");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableHasPersistentDataAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableHasPersistentDataAttribute</code> , See {@odf.attribute table:has-persistent-data}
+	 *
+	 * @param tableHasPersistentDataValue   The type is <code>Boolean</code>
+	 */
+	public void setTableHasPersistentDataAttribute(Boolean tableHasPersistentDataValue) {
+		TableHasPersistentDataAttribute attr = new TableHasPersistentDataAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableHasPersistentDataValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIsSelectionAttribute</code> , See {@odf.attribute table:is-selection}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableIsSelectionAttribute() {
+		TableIsSelectionAttribute attr = (TableIsSelectionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "is-selection");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableIsSelectionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIsSelectionAttribute</code> , See {@odf.attribute table:is-selection}
+	 *
+	 * @param tableIsSelectionValue   The type is <code>Boolean</code>
+	 */
+	public void setTableIsSelectionAttribute(Boolean tableIsSelectionValue) {
+		TableIsSelectionAttribute attr = new TableIsSelectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableIsSelectionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOnUpdateKeepSizeAttribute</code> , See {@odf.attribute table:on-update-keep-size}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableOnUpdateKeepSizeAttribute() {
+		TableOnUpdateKeepSizeAttribute attr = (TableOnUpdateKeepSizeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "on-update-keep-size");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableOnUpdateKeepSizeAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOnUpdateKeepSizeAttribute</code> , See {@odf.attribute table:on-update-keep-size}
+	 *
+	 * @param tableOnUpdateKeepSizeValue   The type is <code>Boolean</code>
+	 */
+	public void setTableOnUpdateKeepSizeAttribute(Boolean tableOnUpdateKeepSizeValue) {
+		TableOnUpdateKeepSizeAttribute attr = new TableOnUpdateKeepSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableOnUpdateKeepSizeValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOnUpdateKeepStylesAttribute</code> , See {@odf.attribute table:on-update-keep-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableOnUpdateKeepStylesAttribute() {
+		TableOnUpdateKeepStylesAttribute attr = (TableOnUpdateKeepStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "on-update-keep-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableOnUpdateKeepStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOnUpdateKeepStylesAttribute</code> , See {@odf.attribute table:on-update-keep-styles}
+	 *
+	 * @param tableOnUpdateKeepStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableOnUpdateKeepStylesAttribute(Boolean tableOnUpdateKeepStylesValue) {
+		TableOnUpdateKeepStylesAttribute attr = new TableOnUpdateKeepStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableOnUpdateKeepStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOrientationAttribute</code> , See {@odf.attribute table:orientation}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOrientationAttribute() {
+		TableOrientationAttribute attr = (TableOrientationAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "orientation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableOrientationAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOrientationAttribute</code> , See {@odf.attribute table:orientation}
+	 *
+	 * @param tableOrientationValue   The type is <code>String</code>
+	 */
+	public void setTableOrientationAttribute(String tableOrientationValue) {
+		TableOrientationAttribute attr = new TableOrientationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOrientationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRefreshDelayAttribute</code> , See {@odf.attribute table:refresh-delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRefreshDelayAttribute() {
+		TableRefreshDelayAttribute attr = (TableRefreshDelayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "refresh-delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRefreshDelayAttribute</code> , See {@odf.attribute table:refresh-delay}
+	 *
+	 * @param tableRefreshDelayValue   The type is <code>String</code>
+	 */
+	public void setTableRefreshDelayAttribute(String tableRefreshDelayValue) {
+		TableRefreshDelayAttribute attr = new TableRefreshDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRefreshDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTargetRangeAddressAttribute() {
+		TableTargetRangeAddressAttribute attr = (TableTargetRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "target-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * @param tableTargetRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableTargetRangeAddressAttribute(String tableTargetRangeAddressValue) {
+		TableTargetRangeAddressAttribute attr = new TableTargetRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTargetRangeAddressValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-source-query}.
+	 *
+	 * @param tableDatabaseNameValue  the <code>String</code> value of <code>TableDatabaseNameAttribute</code>, see {@odf.attribute  table:database-name} at specification
+	 * @param tableQueryNameValue  the <code>String</code> value of <code>TableQueryNameAttribute</code>, see {@odf.attribute  table:query-name} at specification
+	 * @return the element {@odf.element table:database-source-query}
+	 */
+	 public TableDatabaseSourceQueryElement newTableDatabaseSourceQueryElement(String tableDatabaseNameValue, String tableQueryNameValue) {
+		TableDatabaseSourceQueryElement tableDatabaseSourceQuery = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseSourceQueryElement.class);
+		tableDatabaseSourceQuery.setTableDatabaseNameAttribute(tableDatabaseNameValue);
+		tableDatabaseSourceQuery.setTableQueryNameAttribute(tableQueryNameValue);
+		this.appendChild(tableDatabaseSourceQuery);
+		return tableDatabaseSourceQuery;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-source-sql}.
+	 *
+	 * @param tableDatabaseNameValue  the <code>String</code> value of <code>TableDatabaseNameAttribute</code>, see {@odf.attribute  table:database-name} at specification
+	 * @param tableSqlStatementValue  the <code>String</code> value of <code>TableSqlStatementAttribute</code>, see {@odf.attribute  table:sql-statement} at specification
+	 * @return the element {@odf.element table:database-source-sql}
+	 */
+	 public TableDatabaseSourceSqlElement newTableDatabaseSourceSqlElement(String tableDatabaseNameValue, String tableSqlStatementValue) {
+		TableDatabaseSourceSqlElement tableDatabaseSourceSql = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseSourceSqlElement.class);
+		tableDatabaseSourceSql.setTableDatabaseNameAttribute(tableDatabaseNameValue);
+		tableDatabaseSourceSql.setTableSqlStatementAttribute(tableSqlStatementValue);
+		this.appendChild(tableDatabaseSourceSql);
+		return tableDatabaseSourceSql;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-source-table}.
+	 *
+	 * @param tableDatabaseNameValue  the <code>String</code> value of <code>TableDatabaseNameAttribute</code>, see {@odf.attribute  table:database-name} at specification
+	 * @param tableDatabaseTableNameValue  the <code>String</code> value of <code>TableDatabaseTableNameAttribute</code>, see {@odf.attribute  table:database-table-name} at specification
+	 * @return the element {@odf.element table:database-source-table}
+	 */
+	 public TableDatabaseSourceTableElement newTableDatabaseSourceTableElement(String tableDatabaseNameValue, String tableDatabaseTableNameValue) {
+		TableDatabaseSourceTableElement tableDatabaseSourceTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseSourceTableElement.class);
+		tableDatabaseSourceTable.setTableDatabaseNameAttribute(tableDatabaseNameValue);
+		tableDatabaseSourceTable.setTableDatabaseTableNameAttribute(tableDatabaseTableNameValue);
+		this.appendChild(tableDatabaseSourceTable);
+		return tableDatabaseSourceTable;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter}.
+	 *
+	 * @return the element {@odf.element table:filter}
+	 */
+	public TableFilterElement newTableFilterElement() {
+		TableFilterElement tableFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterElement.class);
+		this.appendChild(tableFilter);
+		return tableFilter;
+	}
+
+	/**
+	 * Create child element {@odf.element table:sort}.
+	 *
+	 * @return the element {@odf.element table:sort}
+	 */
+	public TableSortElement newTableSortElement() {
+		TableSortElement tableSort = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSortElement.class);
+		this.appendChild(tableSort);
+		return tableSort;
+	}
+
+	/**
+	 * Create child element {@odf.element table:subtotal-rules}.
+	 *
+	 * @return the element {@odf.element table:subtotal-rules}
+	 */
+	public TableSubtotalRulesElement newTableSubtotalRulesElement() {
+		TableSubtotalRulesElement tableSubtotalRules = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSubtotalRulesElement.class);
+		this.appendChild(tableSubtotalRules);
+		return tableSubtotalRules;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseRangesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseRangesElement.java
new file mode 100644
index 0000000..8c7afa6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseRangesElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:database-ranges}.
+ *
+ */
+public class TableDatabaseRangesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-ranges");
+
+	/**
+	 * Create the instance of <code>TableDatabaseRangesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseRangesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:database-ranges}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:database-range}.
+	 *
+	 * @param tableTargetRangeAddressValue  the <code>String</code> value of <code>TableTargetRangeAddressAttribute</code>, see {@odf.attribute  table:target-range-address} at specification
+	 * @return the element {@odf.element table:database-range}
+	 */
+	 public TableDatabaseRangeElement newTableDatabaseRangeElement(String tableTargetRangeAddressValue) {
+		TableDatabaseRangeElement tableDatabaseRange = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDatabaseRangeElement.class);
+		tableDatabaseRange.setTableTargetRangeAddressAttribute(tableTargetRangeAddressValue);
+		this.appendChild(tableDatabaseRange);
+		return tableDatabaseRange;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceQueryElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceQueryElement.java
new file mode 100644
index 0000000..6cfeeaa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceQueryElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableQueryNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:database-source-query}.
+ *
+ */
+public class TableDatabaseSourceQueryElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-source-query");
+
+	/**
+	 * Create the instance of <code>TableDatabaseSourceQueryElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseSourceQueryElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:database-source-query}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDatabaseNameAttribute</code> , See {@odf.attribute table:database-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDatabaseNameAttribute() {
+		TableDatabaseNameAttribute attr = (TableDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDatabaseNameAttribute</code> , See {@odf.attribute table:database-name}
+	 *
+	 * @param tableDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTableDatabaseNameAttribute(String tableDatabaseNameValue) {
+		TableDatabaseNameAttribute attr = new TableDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableQueryNameAttribute</code> , See {@odf.attribute table:query-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableQueryNameAttribute() {
+		TableQueryNameAttribute attr = (TableQueryNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "query-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableQueryNameAttribute</code> , See {@odf.attribute table:query-name}
+	 *
+	 * @param tableQueryNameValue   The type is <code>String</code>
+	 */
+	public void setTableQueryNameAttribute(String tableQueryNameValue) {
+		TableQueryNameAttribute attr = new TableQueryNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableQueryNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceSqlElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceSqlElement.java
new file mode 100644
index 0000000..5eada57
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceSqlElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParseSqlStatementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSqlStatementAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:database-source-sql}.
+ *
+ */
+public class TableDatabaseSourceSqlElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-source-sql");
+
+	/**
+	 * Create the instance of <code>TableDatabaseSourceSqlElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseSourceSqlElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:database-source-sql}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDatabaseNameAttribute</code> , See {@odf.attribute table:database-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDatabaseNameAttribute() {
+		TableDatabaseNameAttribute attr = (TableDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDatabaseNameAttribute</code> , See {@odf.attribute table:database-name}
+	 *
+	 * @param tableDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTableDatabaseNameAttribute(String tableDatabaseNameValue) {
+		TableDatabaseNameAttribute attr = new TableDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParseSqlStatementAttribute</code> , See {@odf.attribute table:parse-sql-statement}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableParseSqlStatementAttribute() {
+		TableParseSqlStatementAttribute attr = (TableParseSqlStatementAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "parse-sql-statement");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableParseSqlStatementAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParseSqlStatementAttribute</code> , See {@odf.attribute table:parse-sql-statement}
+	 *
+	 * @param tableParseSqlStatementValue   The type is <code>Boolean</code>
+	 */
+	public void setTableParseSqlStatementAttribute(Boolean tableParseSqlStatementValue) {
+		TableParseSqlStatementAttribute attr = new TableParseSqlStatementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableParseSqlStatementValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSqlStatementAttribute</code> , See {@odf.attribute table:sql-statement}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSqlStatementAttribute() {
+		TableSqlStatementAttribute attr = (TableSqlStatementAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "sql-statement");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSqlStatementAttribute</code> , See {@odf.attribute table:sql-statement}
+	 *
+	 * @param tableSqlStatementValue   The type is <code>String</code>
+	 */
+	public void setTableSqlStatementAttribute(String tableSqlStatementValue) {
+		TableSqlStatementAttribute attr = new TableSqlStatementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSqlStatementValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceTableElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceTableElement.java
new file mode 100644
index 0000000..be008cf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDatabaseSourceTableElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDatabaseTableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:database-source-table}.
+ *
+ */
+public class TableDatabaseSourceTableElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "database-source-table");
+
+	/**
+	 * Create the instance of <code>TableDatabaseSourceTableElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDatabaseSourceTableElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:database-source-table}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDatabaseNameAttribute</code> , See {@odf.attribute table:database-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDatabaseNameAttribute() {
+		TableDatabaseNameAttribute attr = (TableDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDatabaseNameAttribute</code> , See {@odf.attribute table:database-name}
+	 *
+	 * @param tableDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTableDatabaseNameAttribute(String tableDatabaseNameValue) {
+		TableDatabaseNameAttribute attr = new TableDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDatabaseTableNameAttribute</code> , See {@odf.attribute table:database-table-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDatabaseTableNameAttribute() {
+		TableDatabaseTableNameAttribute attr = (TableDatabaseTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "database-table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDatabaseTableNameAttribute</code> , See {@odf.attribute table:database-table-name}
+	 *
+	 * @param tableDatabaseTableNameValue   The type is <code>String</code>
+	 */
+	public void setTableDatabaseTableNameAttribute(String tableDatabaseTableNameValue) {
+		TableDatabaseTableNameAttribute attr = new TableDatabaseTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDatabaseTableNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDdeLinkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDdeLinkElement.java
new file mode 100644
index 0000000..28c36bc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDdeLinkElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDdeSourceElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:dde-link}.
+ *
+ */
+public class TableDdeLinkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "dde-link");
+
+	/**
+	 * Create the instance of <code>TableDdeLinkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDdeLinkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:dde-link}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element office:dde-source}.
+	 *
+	 * @param officeDdeApplicationValue  the <code>String</code> value of <code>OfficeDdeApplicationAttribute</code>, see {@odf.attribute  office:dde-application} at specification
+	 * @param officeDdeItemValue  the <code>String</code> value of <code>OfficeDdeItemAttribute</code>, see {@odf.attribute  office:dde-item} at specification
+	 * @param officeDdeTopicValue  the <code>String</code> value of <code>OfficeDdeTopicAttribute</code>, see {@odf.attribute  office:dde-topic} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:dde-source}
+	 */
+	 public OfficeDdeSourceElement newOfficeDdeSourceElement(String officeDdeApplicationValue, String officeDdeItemValue, String officeDdeTopicValue) {
+		OfficeDdeSourceElement officeDdeSource = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDdeSourceElement.class);
+		officeDdeSource.setOfficeDdeApplicationAttribute(officeDdeApplicationValue);
+		officeDdeSource.setOfficeDdeItemAttribute(officeDdeItemValue);
+		officeDdeSource.setOfficeDdeTopicAttribute(officeDdeTopicValue);
+		this.appendChild(officeDdeSource);
+		return officeDdeSource;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDdeLinksElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDdeLinksElement.java
new file mode 100644
index 0000000..345c389
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDdeLinksElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:dde-links}.
+ *
+ */
+public class TableDdeLinksElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "dde-links");
+
+	/**
+	 * Create the instance of <code>TableDdeLinksElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDdeLinksElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:dde-links}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dde-link}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:dde-link}
+	 */
+	public TableDdeLinkElement newTableDdeLinkElement() {
+		TableDdeLinkElement tableDdeLink = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDdeLinkElement.class);
+		this.appendChild(tableDdeLink);
+		return tableDdeLink;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDeletionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDeletionElement.java
new file mode 100644
index 0000000..19019a0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDeletionElement.java
@@ -0,0 +1,299 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAcceptanceStateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMultiDeletionSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRejectingChangeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:deletion}.
+ *
+ */
+public class TableDeletionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "deletion");
+
+	/**
+	 * Create the instance of <code>TableDeletionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDeletionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:deletion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableAcceptanceStateAttribute() {
+		TableAcceptanceStateAttribute attr = (TableAcceptanceStateAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "acceptance-state");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableAcceptanceStateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @param tableAcceptanceStateValue   The type is <code>String</code>
+	 */
+	public void setTableAcceptanceStateAttribute(String tableAcceptanceStateValue) {
+		TableAcceptanceStateAttribute attr = new TableAcceptanceStateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableAcceptanceStateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMultiDeletionSpannedAttribute</code> , See {@odf.attribute table:multi-deletion-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableMultiDeletionSpannedAttribute() {
+		TableMultiDeletionSpannedAttribute attr = (TableMultiDeletionSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "multi-deletion-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMultiDeletionSpannedAttribute</code> , See {@odf.attribute table:multi-deletion-spanned}
+	 *
+	 * @param tableMultiDeletionSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableMultiDeletionSpannedAttribute(Integer tableMultiDeletionSpannedValue) {
+		TableMultiDeletionSpannedAttribute attr = new TableMultiDeletionSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableMultiDeletionSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTablePositionAttribute() {
+		TablePositionAttribute attr = (TablePositionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * @param tablePositionValue   The type is <code>Integer</code>
+	 */
+	public void setTablePositionAttribute(Integer tablePositionValue) {
+		TablePositionAttribute attr = new TablePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tablePositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRejectingChangeIdAttribute() {
+		TableRejectingChangeIdAttribute attr = (TableRejectingChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "rejecting-change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @param tableRejectingChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTableRejectingChangeIdAttribute(String tableRejectingChangeIdValue) {
+		TableRejectingChangeIdAttribute attr = new TableRejectingChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRejectingChangeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableTableAttribute() {
+		TableTableAttribute attr = (TableTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @param tableTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableTableAttribute(Integer tableTableValue) {
+		TableTableAttribute attr = new TableTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableTableValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTypeAttribute</code> , See {@odf.attribute table:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTypeAttribute() {
+		TableTypeAttribute attr = (TableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTypeAttribute</code> , See {@odf.attribute table:type}
+	 *
+	 * @param tableTypeValue   The type is <code>String</code>
+	 */
+	public void setTableTypeAttribute(String tableTypeValue) {
+		TableTypeAttribute attr = new TableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:cut-offs}.
+	 *
+	 * @return the element {@odf.element table:cut-offs}
+	 */
+	public TableCutOffsElement newTableCutOffsElement() {
+		TableCutOffsElement tableCutOffs = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCutOffsElement.class);
+		this.appendChild(tableCutOffs);
+		return tableCutOffs;
+	}
+
+	/**
+	 * Create child element {@odf.element table:deletions}.
+	 *
+	 * @return the element {@odf.element table:deletions}
+	 */
+	public TableDeletionsElement newTableDeletionsElement() {
+		TableDeletionsElement tableDeletions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDeletionsElement.class);
+		this.appendChild(tableDeletions);
+		return tableDeletions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dependencies}.
+	 *
+	 * @return the element {@odf.element table:dependencies}
+	 */
+	public TableDependenciesElement newTableDependenciesElement() {
+		TableDependenciesElement tableDependencies = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDependenciesElement.class);
+		this.appendChild(tableDependencies);
+		return tableDependencies;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDeletionsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDeletionsElement.java
new file mode 100644
index 0000000..639ac6f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDeletionsElement.java
@@ -0,0 +1,93 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:deletions}.
+ *
+ */
+public class TableDeletionsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "deletions");
+
+	/**
+	 * Create the instance of <code>TableDeletionsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDeletionsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:deletions}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:cell-content-deletion}.
+	 *
+	 * @return the element {@odf.element table:cell-content-deletion}
+	 */
+	public TableCellContentDeletionElement newTableCellContentDeletionElement() {
+		TableCellContentDeletionElement tableCellContentDeletion = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCellContentDeletionElement.class);
+		this.appendChild(tableCellContentDeletion);
+		return tableCellContentDeletion;
+	}
+
+	/**
+	 * Create child element {@odf.element table:change-deletion}.
+	 *
+	 * @return the element {@odf.element table:change-deletion}
+	 */
+	public TableChangeDeletionElement newTableChangeDeletionElement() {
+		TableChangeDeletionElement tableChangeDeletion = ((OdfFileDom) this.ownerDocument).newOdfElement(TableChangeDeletionElement.class);
+		this.appendChild(tableChangeDeletion);
+		return tableChangeDeletion;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDependenciesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDependenciesElement.java
new file mode 100644
index 0000000..70e1484
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDependenciesElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:dependencies}.
+ *
+ */
+public class TableDependenciesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "dependencies");
+
+	/**
+	 * Create the instance of <code>TableDependenciesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDependenciesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:dependencies}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dependency}.
+	 *
+	 * @param tableIdValue  the <code>String</code> value of <code>TableIdAttribute</code>, see {@odf.attribute  table:id} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:dependency}
+	 */
+	 public TableDependencyElement newTableDependencyElement(String tableIdValue) {
+		TableDependencyElement tableDependency = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDependencyElement.class);
+		tableDependency.setTableIdAttribute(tableIdValue);
+		this.appendChild(tableDependency);
+		return tableDependency;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDependencyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDependencyElement.java
new file mode 100644
index 0000000..b7e3873
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDependencyElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:dependency}.
+ *
+ */
+public class TableDependencyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "dependency");
+
+	/**
+	 * Create the instance of <code>TableDependencyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDependencyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:dependency}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDescElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDescElement.java
new file mode 100644
index 0000000..e2cbba8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDescElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:desc}.
+ *
+ */
+public class TableDescElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "desc");
+
+	/**
+	 * Create the instance of <code>TableDescElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDescElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:desc}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDetectiveElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDetectiveElement.java
new file mode 100644
index 0000000..104e0a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableDetectiveElement.java
@@ -0,0 +1,97 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:detective}.
+ *
+ */
+public class TableDetectiveElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "detective");
+
+	/**
+	 * Create the instance of <code>TableDetectiveElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableDetectiveElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:detective}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:highlighted-range}.
+	 *
+	 * @return the element {@odf.element table:highlighted-range}
+	 */
+	public TableHighlightedRangeElement newTableHighlightedRangeElement() {
+		TableHighlightedRangeElement tableHighlightedRange = ((OdfFileDom) this.ownerDocument).newOdfElement(TableHighlightedRangeElement.class);
+		this.appendChild(tableHighlightedRange);
+		return tableHighlightedRange;
+	}
+
+	/**
+	 * Create child element {@odf.element table:operation}.
+	 *
+	 * @param tableIndexValue  the <code>Integer</code> value of <code>TableIndexAttribute</code>, see {@odf.attribute  table:index} at specification
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @return the element {@odf.element table:operation}
+	 */
+	 public TableOperationElement newTableOperationElement(int tableIndexValue, String tableNameValue) {
+		TableOperationElement tableOperation = ((OdfFileDom) this.ownerDocument).newOdfElement(TableOperationElement.class);
+		tableOperation.setTableIndexAttribute(tableIndexValue);
+		tableOperation.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableOperation);
+		return tableOperation;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableErrorMacroElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableErrorMacroElement.java
new file mode 100644
index 0000000..bf6e868
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableErrorMacroElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableExecuteAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:error-macro}.
+ *
+ */
+public class TableErrorMacroElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "error-macro");
+
+	/**
+	 * Create the instance of <code>TableErrorMacroElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableErrorMacroElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:error-macro}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableExecuteAttribute</code> , See {@odf.attribute table:execute}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableExecuteAttribute() {
+		TableExecuteAttribute attr = (TableExecuteAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "execute");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableExecuteAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableExecuteAttribute</code> , See {@odf.attribute table:execute}
+	 *
+	 * @param tableExecuteValue   The type is <code>Boolean</code>
+	 */
+	public void setTableExecuteAttribute(Boolean tableExecuteValue) {
+		TableExecuteAttribute attr = new TableExecuteAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableExecuteValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableErrorMessageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableErrorMessageElement.java
new file mode 100644
index 0000000..6552b8d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableErrorMessageElement.java
@@ -0,0 +1,158 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMessageTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTitleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:error-message}.
+ *
+ */
+public class TableErrorMessageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "error-message");
+
+	/**
+	 * Create the instance of <code>TableErrorMessageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableErrorMessageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:error-message}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayAttribute() {
+		TableDisplayAttribute attr = (TableDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayAttribute.DEFAULT_VALUE_FALSE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @param tableDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayAttribute(Boolean tableDisplayValue) {
+		TableDisplayAttribute attr = new TableDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMessageTypeAttribute</code> , See {@odf.attribute table:message-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableMessageTypeAttribute() {
+		TableMessageTypeAttribute attr = (TableMessageTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "message-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableMessageTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMessageTypeAttribute</code> , See {@odf.attribute table:message-type}
+	 *
+	 * @param tableMessageTypeValue   The type is <code>String</code>
+	 */
+	public void setTableMessageTypeAttribute(String tableMessageTypeValue) {
+		TableMessageTypeAttribute attr = new TableMessageTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableMessageTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTitleAttribute</code> , See {@odf.attribute table:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTitleAttribute() {
+		TableTitleAttribute attr = (TableTitleAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTitleAttribute</code> , See {@odf.attribute table:title}
+	 *
+	 * @param tableTitleValue   The type is <code>String</code>
+	 */
+	public void setTableTitleAttribute(String tableTitleValue) {
+		TableTitleAttribute attr = new TableTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTitleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableEvenColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableEvenColumnsElement.java
new file mode 100644
index 0000000..f3dc402
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableEvenColumnsElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:even-columns}.
+ *
+ */
+public class TableEvenColumnsElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "even-columns");
+
+	/**
+	 * Create the instance of <code>TableEvenColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableEvenColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:even-columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableEvenRowsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableEvenRowsElement.java
new file mode 100644
index 0000000..1f43ec0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableEvenRowsElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:even-rows}.
+ *
+ */
+public class TableEvenRowsElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "even-rows");
+
+	/**
+	 * Create the instance of <code>TableEvenRowsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableEvenRowsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:even-rows}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterAndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterAndElement.java
new file mode 100644
index 0000000..8e96030
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterAndElement.java
@@ -0,0 +1,99 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:filter-and}.
+ *
+ */
+public class TableFilterAndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter-and");
+
+	/**
+	 * Create the instance of <code>TableFilterAndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterAndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:filter-and}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-condition}.
+	 *
+	 * @param tableFieldNumberValue  the <code>Integer</code> value of <code>TableFieldNumberAttribute</code>, see {@odf.attribute  table:field-number} at specification
+	 * @param tableOperatorValue  the <code>String</code> value of <code>TableOperatorAttribute</code>, see {@odf.attribute  table:operator} at specification
+	 * @param tableValueValue  the <code>String</code> value of <code>TableValueAttribute</code>, see {@odf.attribute  table:value} at specification
+	 * @return the element {@odf.element table:filter-condition}
+	 */
+	 public TableFilterConditionElement newTableFilterConditionElement(int tableFieldNumberValue, String tableOperatorValue, String tableValueValue) {
+		TableFilterConditionElement tableFilterCondition = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterConditionElement.class);
+		tableFilterCondition.setTableFieldNumberAttribute(tableFieldNumberValue);
+		tableFilterCondition.setTableOperatorAttribute(tableOperatorValue);
+		tableFilterCondition.setTableValueAttribute(tableValueValue);
+		this.appendChild(tableFilterCondition);
+		return tableFilterCondition;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-or}.
+	 *
+	 * @return the element {@odf.element table:filter-or}
+	 */
+	public TableFilterOrElement newTableFilterOrElement() {
+		TableFilterOrElement tableFilterOr = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterOrElement.class);
+		this.appendChild(tableFilterOr);
+		return tableFilterOr;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterConditionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterConditionElement.java
new file mode 100644
index 0000000..ef2fdc9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterConditionElement.java
@@ -0,0 +1,217 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCaseSensitiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDataTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFieldNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOperatorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:filter-condition}.
+ *
+ */
+public class TableFilterConditionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter-condition");
+
+	/**
+	 * Create the instance of <code>TableFilterConditionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterConditionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:filter-condition}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCaseSensitiveAttribute() {
+		TableCaseSensitiveAttribute attr = (TableCaseSensitiveAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "case-sensitive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableCaseSensitiveAttribute.DEFAULT_VALUE_FALSE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @param tableCaseSensitiveValue   The type is <code>String</code>
+	 */
+	public void setTableCaseSensitiveAttribute(String tableCaseSensitiveValue) {
+		TableCaseSensitiveAttribute attr = new TableCaseSensitiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCaseSensitiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDataTypeAttribute</code> , See {@odf.attribute table:data-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDataTypeAttribute() {
+		TableDataTypeAttribute attr = (TableDataTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "data-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableDataTypeAttribute.DEFAULT_VALUE_TEXT;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDataTypeAttribute</code> , See {@odf.attribute table:data-type}
+	 *
+	 * @param tableDataTypeValue   The type is <code>String</code>
+	 */
+	public void setTableDataTypeAttribute(String tableDataTypeValue) {
+		TableDataTypeAttribute attr = new TableDataTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDataTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFieldNumberAttribute</code> , See {@odf.attribute table:field-number}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableFieldNumberAttribute() {
+		TableFieldNumberAttribute attr = (TableFieldNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "field-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFieldNumberAttribute</code> , See {@odf.attribute table:field-number}
+	 *
+	 * @param tableFieldNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTableFieldNumberAttribute(Integer tableFieldNumberValue) {
+		TableFieldNumberAttribute attr = new TableFieldNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableFieldNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOperatorAttribute</code> , See {@odf.attribute table:operator}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOperatorAttribute() {
+		TableOperatorAttribute attr = (TableOperatorAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "operator");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOperatorAttribute</code> , See {@odf.attribute table:operator}
+	 *
+	 * @param tableOperatorValue   The type is <code>String</code>
+	 */
+	public void setTableOperatorAttribute(String tableOperatorValue) {
+		TableOperatorAttribute attr = new TableOperatorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOperatorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableValueAttribute</code> , See {@odf.attribute table:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableValueAttribute() {
+		TableValueAttribute attr = (TableValueAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableValueAttribute</code> , See {@odf.attribute table:value}
+	 *
+	 * @param tableValueValue   The type is <code>String</code>
+	 */
+	public void setTableValueAttribute(String tableValueValue) {
+		TableValueAttribute attr = new TableValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableValueValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-set-item}.
+	 *
+	 * @param tableValueValue  the <code>String</code> value of <code>TableValueAttribute</code>, see {@odf.attribute  table:value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:filter-set-item}
+	 */
+	 public TableFilterSetItemElement newTableFilterSetItemElement(String tableValueValue) {
+		TableFilterSetItemElement tableFilterSetItem = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterSetItemElement.class);
+		tableFilterSetItem.setTableValueAttribute(tableValueValue);
+		this.appendChild(tableFilterSetItem);
+		return tableFilterSetItem;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterElement.java
new file mode 100644
index 0000000..0f31544
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterElement.java
@@ -0,0 +1,210 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableConditionSourceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableConditionSourceRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayDuplicatesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTargetRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:filter}.
+ *
+ */
+public class TableFilterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter");
+
+	/**
+	 * Create the instance of <code>TableFilterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:filter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableConditionSourceAttribute</code> , See {@odf.attribute table:condition-source}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableConditionSourceAttribute() {
+		TableConditionSourceAttribute attr = (TableConditionSourceAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "condition-source");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableConditionSourceAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableConditionSourceAttribute</code> , See {@odf.attribute table:condition-source}
+	 *
+	 * @param tableConditionSourceValue   The type is <code>String</code>
+	 */
+	public void setTableConditionSourceAttribute(String tableConditionSourceValue) {
+		TableConditionSourceAttribute attr = new TableConditionSourceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableConditionSourceValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableConditionSourceRangeAddressAttribute</code> , See {@odf.attribute table:condition-source-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableConditionSourceRangeAddressAttribute() {
+		TableConditionSourceRangeAddressAttribute attr = (TableConditionSourceRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "condition-source-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableConditionSourceRangeAddressAttribute</code> , See {@odf.attribute table:condition-source-range-address}
+	 *
+	 * @param tableConditionSourceRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableConditionSourceRangeAddressAttribute(String tableConditionSourceRangeAddressValue) {
+		TableConditionSourceRangeAddressAttribute attr = new TableConditionSourceRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableConditionSourceRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayDuplicatesAttribute</code> , See {@odf.attribute table:display-duplicates}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayDuplicatesAttribute() {
+		TableDisplayDuplicatesAttribute attr = (TableDisplayDuplicatesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display-duplicates");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayDuplicatesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayDuplicatesAttribute</code> , See {@odf.attribute table:display-duplicates}
+	 *
+	 * @param tableDisplayDuplicatesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayDuplicatesAttribute(Boolean tableDisplayDuplicatesValue) {
+		TableDisplayDuplicatesAttribute attr = new TableDisplayDuplicatesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayDuplicatesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTargetRangeAddressAttribute() {
+		TableTargetRangeAddressAttribute attr = (TableTargetRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "target-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * @param tableTargetRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableTargetRangeAddressAttribute(String tableTargetRangeAddressValue) {
+		TableTargetRangeAddressAttribute attr = new TableTargetRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTargetRangeAddressValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-and}.
+	 *
+	 * @return the element {@odf.element table:filter-and}
+	 */
+	public TableFilterAndElement newTableFilterAndElement() {
+		TableFilterAndElement tableFilterAnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterAndElement.class);
+		this.appendChild(tableFilterAnd);
+		return tableFilterAnd;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-condition}.
+	 *
+	 * @param tableFieldNumberValue  the <code>Integer</code> value of <code>TableFieldNumberAttribute</code>, see {@odf.attribute  table:field-number} at specification
+	 * @param tableOperatorValue  the <code>String</code> value of <code>TableOperatorAttribute</code>, see {@odf.attribute  table:operator} at specification
+	 * @param tableValueValue  the <code>String</code> value of <code>TableValueAttribute</code>, see {@odf.attribute  table:value} at specification
+	 * @return the element {@odf.element table:filter-condition}
+	 */
+	 public TableFilterConditionElement newTableFilterConditionElement(int tableFieldNumberValue, String tableOperatorValue, String tableValueValue) {
+		TableFilterConditionElement tableFilterCondition = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterConditionElement.class);
+		tableFilterCondition.setTableFieldNumberAttribute(tableFieldNumberValue);
+		tableFilterCondition.setTableOperatorAttribute(tableOperatorValue);
+		tableFilterCondition.setTableValueAttribute(tableValueValue);
+		this.appendChild(tableFilterCondition);
+		return tableFilterCondition;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-or}.
+	 *
+	 * @return the element {@odf.element table:filter-or}
+	 */
+	public TableFilterOrElement newTableFilterOrElement() {
+		TableFilterOrElement tableFilterOr = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterOrElement.class);
+		this.appendChild(tableFilterOr);
+		return tableFilterOr;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterOrElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterOrElement.java
new file mode 100644
index 0000000..2dbc04d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterOrElement.java
@@ -0,0 +1,99 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:filter-or}.
+ *
+ */
+public class TableFilterOrElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter-or");
+
+	/**
+	 * Create the instance of <code>TableFilterOrElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterOrElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:filter-or}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-and}.
+	 *
+	 * @return the element {@odf.element table:filter-and}
+	 */
+	public TableFilterAndElement newTableFilterAndElement() {
+		TableFilterAndElement tableFilterAnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterAndElement.class);
+		this.appendChild(tableFilterAnd);
+		return tableFilterAnd;
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter-condition}.
+	 *
+	 * @param tableFieldNumberValue  the <code>Integer</code> value of <code>TableFieldNumberAttribute</code>, see {@odf.attribute  table:field-number} at specification
+	 * @param tableOperatorValue  the <code>String</code> value of <code>TableOperatorAttribute</code>, see {@odf.attribute  table:operator} at specification
+	 * @param tableValueValue  the <code>String</code> value of <code>TableValueAttribute</code>, see {@odf.attribute  table:value} at specification
+	 * @return the element {@odf.element table:filter-condition}
+	 */
+	 public TableFilterConditionElement newTableFilterConditionElement(int tableFieldNumberValue, String tableOperatorValue, String tableValueValue) {
+		TableFilterConditionElement tableFilterCondition = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterConditionElement.class);
+		tableFilterCondition.setTableFieldNumberAttribute(tableFieldNumberValue);
+		tableFilterCondition.setTableOperatorAttribute(tableOperatorValue);
+		tableFilterCondition.setTableValueAttribute(tableValueValue);
+		this.appendChild(tableFilterCondition);
+		return tableFilterCondition;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterSetItemElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterSetItemElement.java
new file mode 100644
index 0000000..27aff14
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFilterSetItemElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:filter-set-item}.
+ *
+ */
+public class TableFilterSetItemElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "filter-set-item");
+
+	/**
+	 * Create the instance of <code>TableFilterSetItemElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFilterSetItemElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:filter-set-item}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableValueAttribute</code> , See {@odf.attribute table:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableValueAttribute() {
+		TableValueAttribute attr = (TableValueAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableValueAttribute</code> , See {@odf.attribute table:value}
+	 *
+	 * @param tableValueValue   The type is <code>String</code>
+	 */
+	public void setTableValueAttribute(String tableValueValue) {
+		TableValueAttribute attr = new TableValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFirstColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFirstColumnElement.java
new file mode 100644
index 0000000..d74b083
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFirstColumnElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:first-column}.
+ *
+ */
+public class TableFirstColumnElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "first-column");
+
+	/**
+	 * Create the instance of <code>TableFirstColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFirstColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:first-column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFirstRowElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFirstRowElement.java
new file mode 100644
index 0000000..1b10177
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableFirstRowElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:first-row}.
+ *
+ */
+public class TableFirstRowElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "first-row");
+
+	/**
+	 * Create the instance of <code>TableFirstRowElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableFirstRowElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:first-row}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableHelpMessageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableHelpMessageElement.java
new file mode 100644
index 0000000..cf2df07
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableHelpMessageElement.java
@@ -0,0 +1,133 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTitleAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:help-message}.
+ *
+ */
+public class TableHelpMessageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "help-message");
+
+	/**
+	 * Create the instance of <code>TableHelpMessageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableHelpMessageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:help-message}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayAttribute() {
+		TableDisplayAttribute attr = (TableDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayAttribute.DEFAULT_VALUE_FALSE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @param tableDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayAttribute(Boolean tableDisplayValue) {
+		TableDisplayAttribute attr = new TableDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTitleAttribute</code> , See {@odf.attribute table:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTitleAttribute() {
+		TableTitleAttribute attr = (TableTitleAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTitleAttribute</code> , See {@odf.attribute table:title}
+	 *
+	 * @param tableTitleValue   The type is <code>String</code>
+	 */
+	public void setTableTitleAttribute(String tableTitleValue) {
+		TableTitleAttribute attr = new TableTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTitleValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableHighlightedRangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableHighlightedRangeElement.java
new file mode 100644
index 0000000..ec17c81
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableHighlightedRangeElement.java
@@ -0,0 +1,171 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableContainsErrorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDirectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMarkedInvalidAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:highlighted-range}.
+ *
+ */
+public class TableHighlightedRangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "highlighted-range");
+
+	/**
+	 * Create the instance of <code>TableHighlightedRangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableHighlightedRangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:highlighted-range}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAddressAttribute() {
+		TableCellRangeAddressAttribute attr = (TableCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @param tableCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAddressAttribute(String tableCellRangeAddressValue) {
+		TableCellRangeAddressAttribute attr = new TableCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableContainsErrorAttribute</code> , See {@odf.attribute table:contains-error}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableContainsErrorAttribute() {
+		TableContainsErrorAttribute attr = (TableContainsErrorAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "contains-error");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableContainsErrorAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableContainsErrorAttribute</code> , See {@odf.attribute table:contains-error}
+	 *
+	 * @param tableContainsErrorValue   The type is <code>Boolean</code>
+	 */
+	public void setTableContainsErrorAttribute(Boolean tableContainsErrorValue) {
+		TableContainsErrorAttribute attr = new TableContainsErrorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableContainsErrorValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDirectionAttribute</code> , See {@odf.attribute table:direction}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDirectionAttribute() {
+		TableDirectionAttribute attr = (TableDirectionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "direction");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDirectionAttribute</code> , See {@odf.attribute table:direction}
+	 *
+	 * @param tableDirectionValue   The type is <code>String</code>
+	 */
+	public void setTableDirectionAttribute(String tableDirectionValue) {
+		TableDirectionAttribute attr = new TableDirectionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDirectionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMarkedInvalidAttribute</code> , See {@odf.attribute table:marked-invalid}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableMarkedInvalidAttribute() {
+		TableMarkedInvalidAttribute attr = (TableMarkedInvalidAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "marked-invalid");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMarkedInvalidAttribute</code> , See {@odf.attribute table:marked-invalid}
+	 *
+	 * @param tableMarkedInvalidValue   The type is <code>Boolean</code>
+	 */
+	public void setTableMarkedInvalidAttribute(Boolean tableMarkedInvalidValue) {
+		TableMarkedInvalidAttribute attr = new TableMarkedInvalidAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableMarkedInvalidValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableInsertionCutOffElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableInsertionCutOffElement.java
new file mode 100644
index 0000000..dea6884
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableInsertionCutOffElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePositionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:insertion-cut-off}.
+ *
+ */
+public class TableInsertionCutOffElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "insertion-cut-off");
+
+	/**
+	 * Create the instance of <code>TableInsertionCutOffElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableInsertionCutOffElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:insertion-cut-off}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTablePositionAttribute() {
+		TablePositionAttribute attr = (TablePositionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * @param tablePositionValue   The type is <code>Integer</code>
+	 */
+	public void setTablePositionAttribute(Integer tablePositionValue) {
+		TablePositionAttribute attr = new TablePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tablePositionValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableInsertionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableInsertionElement.java
new file mode 100644
index 0000000..868d823
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableInsertionElement.java
@@ -0,0 +1,288 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAcceptanceStateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCountAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRejectingChangeIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:insertion}.
+ *
+ */
+public class TableInsertionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "insertion");
+
+	/**
+	 * Create the instance of <code>TableInsertionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableInsertionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:insertion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableAcceptanceStateAttribute() {
+		TableAcceptanceStateAttribute attr = (TableAcceptanceStateAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "acceptance-state");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableAcceptanceStateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @param tableAcceptanceStateValue   The type is <code>String</code>
+	 */
+	public void setTableAcceptanceStateAttribute(String tableAcceptanceStateValue) {
+		TableAcceptanceStateAttribute attr = new TableAcceptanceStateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableAcceptanceStateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCountAttribute</code> , See {@odf.attribute table:count}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableCountAttribute() {
+		TableCountAttribute attr = (TableCountAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "count");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableCountAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCountAttribute</code> , See {@odf.attribute table:count}
+	 *
+	 * @param tableCountValue   The type is <code>Integer</code>
+	 */
+	public void setTableCountAttribute(Integer tableCountValue) {
+		TableCountAttribute attr = new TableCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTablePositionAttribute() {
+		TablePositionAttribute attr = (TablePositionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * @param tablePositionValue   The type is <code>Integer</code>
+	 */
+	public void setTablePositionAttribute(Integer tablePositionValue) {
+		TablePositionAttribute attr = new TablePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tablePositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRejectingChangeIdAttribute() {
+		TableRejectingChangeIdAttribute attr = (TableRejectingChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "rejecting-change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @param tableRejectingChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTableRejectingChangeIdAttribute(String tableRejectingChangeIdValue) {
+		TableRejectingChangeIdAttribute attr = new TableRejectingChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRejectingChangeIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableTableAttribute() {
+		TableTableAttribute attr = (TableTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @param tableTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableTableAttribute(Integer tableTableValue) {
+		TableTableAttribute attr = new TableTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableTableValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTypeAttribute</code> , See {@odf.attribute table:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTypeAttribute() {
+		TableTypeAttribute attr = (TableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTypeAttribute</code> , See {@odf.attribute table:type}
+	 *
+	 * @param tableTypeValue   The type is <code>String</code>
+	 */
+	public void setTableTypeAttribute(String tableTypeValue) {
+		TableTypeAttribute attr = new TableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:deletions}.
+	 *
+	 * @return the element {@odf.element table:deletions}
+	 */
+	public TableDeletionsElement newTableDeletionsElement() {
+		TableDeletionsElement tableDeletions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDeletionsElement.class);
+		this.appendChild(tableDeletions);
+		return tableDeletions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dependencies}.
+	 *
+	 * @return the element {@odf.element table:dependencies}
+	 */
+	public TableDependenciesElement newTableDependenciesElement() {
+		TableDependenciesElement tableDependencies = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDependenciesElement.class);
+		this.appendChild(tableDependencies);
+		return tableDependencies;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableIterationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableIterationElement.java
new file mode 100644
index 0000000..f2c817b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableIterationElement.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableMaximumDifferenceAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStatusAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStepsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:iteration}.
+ *
+ */
+public class TableIterationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "iteration");
+
+	/**
+	 * Create the instance of <code>TableIterationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableIterationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:iteration}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableMaximumDifferenceAttribute</code> , See {@odf.attribute table:maximum-difference}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getTableMaximumDifferenceAttribute() {
+		TableMaximumDifferenceAttribute attr = (TableMaximumDifferenceAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "maximum-difference");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return Double.valueOf(TableMaximumDifferenceAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableMaximumDifferenceAttribute</code> , See {@odf.attribute table:maximum-difference}
+	 *
+	 * @param tableMaximumDifferenceValue   The type is <code>Double</code>
+	 */
+	public void setTableMaximumDifferenceAttribute(Double tableMaximumDifferenceValue) {
+		TableMaximumDifferenceAttribute attr = new TableMaximumDifferenceAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(tableMaximumDifferenceValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStatusAttribute</code> , See {@odf.attribute table:status}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStatusAttribute() {
+		TableStatusAttribute attr = (TableStatusAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "status");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableStatusAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStatusAttribute</code> , See {@odf.attribute table:status}
+	 *
+	 * @param tableStatusValue   The type is <code>String</code>
+	 */
+	public void setTableStatusAttribute(String tableStatusValue) {
+		TableStatusAttribute attr = new TableStatusAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStatusValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStepsAttribute</code> , See {@odf.attribute table:steps}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStepsAttribute() {
+		TableStepsAttribute attr = (TableStepsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "steps");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableStepsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStepsAttribute</code> , See {@odf.attribute table:steps}
+	 *
+	 * @param tableStepsValue   The type is <code>Integer</code>
+	 */
+	public void setTableStepsAttribute(Integer tableStepsValue) {
+		TableStepsAttribute attr = new TableStepsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStepsValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLabelRangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLabelRangeElement.java
new file mode 100644
index 0000000..ebc264d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLabelRangeElement.java
@@ -0,0 +1,152 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDataCellRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLabelCellRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOrientationAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:label-range}.
+ *
+ */
+public class TableLabelRangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "label-range");
+
+	/**
+	 * Create the instance of <code>TableLabelRangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableLabelRangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:label-range}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDataCellRangeAddressAttribute</code> , See {@odf.attribute table:data-cell-range-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDataCellRangeAddressAttribute() {
+		TableDataCellRangeAddressAttribute attr = (TableDataCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "data-cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDataCellRangeAddressAttribute</code> , See {@odf.attribute table:data-cell-range-address}
+	 *
+	 * @param tableDataCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableDataCellRangeAddressAttribute(String tableDataCellRangeAddressValue) {
+		TableDataCellRangeAddressAttribute attr = new TableDataCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDataCellRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLabelCellRangeAddressAttribute</code> , See {@odf.attribute table:label-cell-range-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableLabelCellRangeAddressAttribute() {
+		TableLabelCellRangeAddressAttribute attr = (TableLabelCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "label-cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLabelCellRangeAddressAttribute</code> , See {@odf.attribute table:label-cell-range-address}
+	 *
+	 * @param tableLabelCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableLabelCellRangeAddressAttribute(String tableLabelCellRangeAddressValue) {
+		TableLabelCellRangeAddressAttribute attr = new TableLabelCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableLabelCellRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOrientationAttribute</code> , See {@odf.attribute table:orientation}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOrientationAttribute() {
+		TableOrientationAttribute attr = (TableOrientationAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "orientation");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOrientationAttribute</code> , See {@odf.attribute table:orientation}
+	 *
+	 * @param tableOrientationValue   The type is <code>String</code>
+	 */
+	public void setTableOrientationAttribute(String tableOrientationValue) {
+		TableOrientationAttribute attr = new TableOrientationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOrientationValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLabelRangesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLabelRangesElement.java
new file mode 100644
index 0000000..1bd1fd4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLabelRangesElement.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:label-ranges}.
+ *
+ */
+public class TableLabelRangesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "label-ranges");
+
+	/**
+	 * Create the instance of <code>TableLabelRangesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableLabelRangesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:label-ranges}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:label-range}.
+	 *
+	 * @param tableDataCellRangeAddressValue  the <code>String</code> value of <code>TableDataCellRangeAddressAttribute</code>, see {@odf.attribute  table:data-cell-range-address} at specification
+	 * @param tableLabelCellRangeAddressValue  the <code>String</code> value of <code>TableLabelCellRangeAddressAttribute</code>, see {@odf.attribute  table:label-cell-range-address} at specification
+	 * @param tableOrientationValue  the <code>String</code> value of <code>TableOrientationAttribute</code>, see {@odf.attribute  table:orientation} at specification
+	 * @return the element {@odf.element table:label-range}
+	 */
+	 public TableLabelRangeElement newTableLabelRangeElement(String tableDataCellRangeAddressValue, String tableLabelCellRangeAddressValue, String tableOrientationValue) {
+		TableLabelRangeElement tableLabelRange = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLabelRangeElement.class);
+		tableLabelRange.setTableDataCellRangeAddressAttribute(tableDataCellRangeAddressValue);
+		tableLabelRange.setTableLabelCellRangeAddressAttribute(tableLabelCellRangeAddressValue);
+		tableLabelRange.setTableOrientationAttribute(tableOrientationValue);
+		this.appendChild(tableLabelRange);
+		return tableLabelRange;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLastColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLastColumnElement.java
new file mode 100644
index 0000000..6ba5427
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLastColumnElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:last-column}.
+ *
+ */
+public class TableLastColumnElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "last-column");
+
+	/**
+	 * Create the instance of <code>TableLastColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableLastColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:last-column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLastRowElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLastRowElement.java
new file mode 100644
index 0000000..fbb1f27
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableLastRowElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:last-row}.
+ *
+ */
+public class TableLastRowElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "last-row");
+
+	/**
+	 * Create the instance of <code>TableLastRowElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableLastRowElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:last-row}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableMovementCutOffElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableMovementCutOffElement.java
new file mode 100644
index 0000000..dcc4545
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableMovementCutOffElement.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartPositionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:movement-cut-off}.
+ *
+ */
+public class TableMovementCutOffElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "movement-cut-off");
+
+	/**
+	 * Create the instance of <code>TableMovementCutOffElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableMovementCutOffElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:movement-cut-off}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndPositionAttribute</code> , See {@odf.attribute table:end-position}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndPositionAttribute() {
+		TableEndPositionAttribute attr = (TableEndPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndPositionAttribute</code> , See {@odf.attribute table:end-position}
+	 *
+	 * @param tableEndPositionValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndPositionAttribute(Integer tableEndPositionValue) {
+		TableEndPositionAttribute attr = new TableEndPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndPositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTablePositionAttribute() {
+		TablePositionAttribute attr = (TablePositionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePositionAttribute</code> , See {@odf.attribute table:position}
+	 *
+	 * @param tablePositionValue   The type is <code>Integer</code>
+	 */
+	public void setTablePositionAttribute(Integer tablePositionValue) {
+		TablePositionAttribute attr = new TablePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tablePositionValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartPositionAttribute</code> , See {@odf.attribute table:start-position}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartPositionAttribute() {
+		TableStartPositionAttribute attr = (TableStartPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-position");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartPositionAttribute</code> , See {@odf.attribute table:start-position}
+	 *
+	 * @param tableStartPositionValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartPositionAttribute(Integer tableStartPositionValue) {
+		TableStartPositionAttribute attr = new TableStartPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartPositionValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableMovementElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableMovementElement.java
new file mode 100644
index 0000000..8f63eb9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableMovementElement.java
@@ -0,0 +1,210 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAcceptanceStateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRejectingChangeIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:movement}.
+ *
+ */
+public class TableMovementElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "movement");
+
+	/**
+	 * Create the instance of <code>TableMovementElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableMovementElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:movement}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableAcceptanceStateAttribute() {
+		TableAcceptanceStateAttribute attr = (TableAcceptanceStateAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "acceptance-state");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableAcceptanceStateAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAcceptanceStateAttribute</code> , See {@odf.attribute table:acceptance-state}
+	 *
+	 * @param tableAcceptanceStateValue   The type is <code>String</code>
+	 */
+	public void setTableAcceptanceStateAttribute(String tableAcceptanceStateValue) {
+		TableAcceptanceStateAttribute attr = new TableAcceptanceStateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableAcceptanceStateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRejectingChangeIdAttribute() {
+		TableRejectingChangeIdAttribute attr = (TableRejectingChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "rejecting-change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRejectingChangeIdAttribute</code> , See {@odf.attribute table:rejecting-change-id}
+	 *
+	 * @param tableRejectingChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTableRejectingChangeIdAttribute(String tableRejectingChangeIdValue) {
+		TableRejectingChangeIdAttribute attr = new TableRejectingChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRejectingChangeIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:deletions}.
+	 *
+	 * @return the element {@odf.element table:deletions}
+	 */
+	public TableDeletionsElement newTableDeletionsElement() {
+		TableDeletionsElement tableDeletions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDeletionsElement.class);
+		this.appendChild(tableDeletions);
+		return tableDeletions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:dependencies}.
+	 *
+	 * @return the element {@odf.element table:dependencies}
+	 */
+	public TableDependenciesElement newTableDependenciesElement() {
+		TableDependenciesElement tableDependencies = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDependenciesElement.class);
+		this.appendChild(tableDependencies);
+		return tableDependencies;
+	}
+
+	/**
+	 * Create child element {@odf.element table:source-range-address}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:source-range-address}
+	 */
+	public TableSourceRangeAddressElement newTableSourceRangeAddressElement() {
+		TableSourceRangeAddressElement tableSourceRangeAddress = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSourceRangeAddressElement.class);
+		this.appendChild(tableSourceRangeAddress);
+		return tableSourceRangeAddress;
+	}
+
+	/**
+	 * Create child element {@odf.element table:target-range-address}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:target-range-address}
+	 */
+	public TableTargetRangeAddressElement newTableTargetRangeAddressElement() {
+		TableTargetRangeAddressElement tableTargetRangeAddress = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTargetRangeAddressElement.class);
+		this.appendChild(tableTargetRangeAddress);
+		return tableTargetRangeAddress;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedExpressionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedExpressionElement.java
new file mode 100644
index 0000000..138947b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedExpressionElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBaseCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableExpressionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:named-expression}.
+ *
+ */
+public class TableNamedExpressionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "named-expression");
+
+	/**
+	 * Create the instance of <code>TableNamedExpressionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableNamedExpressionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:named-expression}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBaseCellAddressAttribute</code> , See {@odf.attribute table:base-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableBaseCellAddressAttribute() {
+		TableBaseCellAddressAttribute attr = (TableBaseCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "base-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBaseCellAddressAttribute</code> , See {@odf.attribute table:base-cell-address}
+	 *
+	 * @param tableBaseCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableBaseCellAddressAttribute(String tableBaseCellAddressValue) {
+		TableBaseCellAddressAttribute attr = new TableBaseCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableBaseCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableExpressionAttribute</code> , See {@odf.attribute table:expression}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableExpressionAttribute() {
+		TableExpressionAttribute attr = (TableExpressionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "expression");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableExpressionAttribute</code> , See {@odf.attribute table:expression}
+	 *
+	 * @param tableExpressionValue   The type is <code>String</code>
+	 */
+	public void setTableExpressionAttribute(String tableExpressionValue) {
+		TableExpressionAttribute attr = new TableExpressionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableExpressionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedExpressionsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedExpressionsElement.java
new file mode 100644
index 0000000..d66d03c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedExpressionsElement.java
@@ -0,0 +1,101 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:named-expressions}.
+ *
+ */
+public class TableNamedExpressionsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "named-expressions");
+
+	/**
+	 * Create the instance of <code>TableNamedExpressionsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableNamedExpressionsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:named-expressions}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expression}.
+	 *
+	 * @param tableExpressionValue  the <code>String</code> value of <code>TableExpressionAttribute</code>, see {@odf.attribute  table:expression} at specification
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @return the element {@odf.element table:named-expression}
+	 */
+	 public TableNamedExpressionElement newTableNamedExpressionElement(String tableExpressionValue, String tableNameValue) {
+		TableNamedExpressionElement tableNamedExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionElement.class);
+		tableNamedExpression.setTableExpressionAttribute(tableExpressionValue);
+		tableNamedExpression.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableNamedExpression);
+		return tableNamedExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-range}.
+	 *
+	 * @param tableCellRangeAddressValue  the <code>String</code> value of <code>TableCellRangeAddressAttribute</code>, see {@odf.attribute  table:cell-range-address} at specification
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @return the element {@odf.element table:named-range}
+	 */
+	 public TableNamedRangeElement newTableNamedRangeElement(String tableCellRangeAddressValue, String tableNameValue) {
+		TableNamedRangeElement tableNamedRange = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedRangeElement.class);
+		tableNamedRange.setTableCellRangeAddressAttribute(tableCellRangeAddressValue);
+		tableNamedRange.setTableNameAttribute(tableNameValue);
+		this.appendChild(tableNamedRange);
+		return tableNamedRange;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedRangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedRangeElement.java
new file mode 100644
index 0000000..2c414c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNamedRangeElement.java
@@ -0,0 +1,175 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBaseCellAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRangeUsableAsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:named-range}.
+ *
+ */
+public class TableNamedRangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "named-range");
+
+	/**
+	 * Create the instance of <code>TableNamedRangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableNamedRangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:named-range}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBaseCellAddressAttribute</code> , See {@odf.attribute table:base-cell-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableBaseCellAddressAttribute() {
+		TableBaseCellAddressAttribute attr = (TableBaseCellAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "base-cell-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBaseCellAddressAttribute</code> , See {@odf.attribute table:base-cell-address}
+	 *
+	 * @param tableBaseCellAddressValue   The type is <code>String</code>
+	 */
+	public void setTableBaseCellAddressAttribute(String tableBaseCellAddressValue) {
+		TableBaseCellAddressAttribute attr = new TableBaseCellAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableBaseCellAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAddressAttribute() {
+		TableCellRangeAddressAttribute attr = (TableCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @param tableCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAddressAttribute(String tableCellRangeAddressValue) {
+		TableCellRangeAddressAttribute attr = new TableCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRangeUsableAsAttribute</code> , See {@odf.attribute table:range-usable-as}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRangeUsableAsAttribute() {
+		TableRangeUsableAsAttribute attr = (TableRangeUsableAsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "range-usable-as");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableRangeUsableAsAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRangeUsableAsAttribute</code> , See {@odf.attribute table:range-usable-as}
+	 *
+	 * @param tableRangeUsableAsValue   The type is <code>String</code>
+	 */
+	public void setTableRangeUsableAsAttribute(String tableRangeUsableAsValue) {
+		TableRangeUsableAsAttribute attr = new TableRangeUsableAsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRangeUsableAsValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNullDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNullDateElement.java
new file mode 100644
index 0000000..cfe5f06
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableNullDateElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableValueTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:null-date}.
+ *
+ */
+public class TableNullDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "null-date");
+
+	/**
+	 * Create the instance of <code>TableNullDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableNullDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:null-date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDateValueAttribute</code> , See {@odf.attribute table:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDateValueAttribute() {
+		TableDateValueAttribute attr = (TableDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableDateValueAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDateValueAttribute</code> , See {@odf.attribute table:date-value}
+	 *
+	 * @param tableDateValueValue   The type is <code>String</code>
+	 */
+	public void setTableDateValueAttribute(String tableDateValueValue) {
+		TableDateValueAttribute attr = new TableDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableValueTypeAttribute</code> , See {@odf.attribute table:value-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableValueTypeAttribute() {
+		TableValueTypeAttribute attr = (TableValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableValueTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableValueTypeAttribute</code> , See {@odf.attribute table:value-type}
+	 *
+	 * @param tableValueTypeValue   The type is <code>String</code>
+	 */
+	public void setTableValueTypeAttribute(String tableValueTypeValue) {
+		TableValueTypeAttribute attr = new TableValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableValueTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOddColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOddColumnsElement.java
new file mode 100644
index 0000000..e517cb0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOddColumnsElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:odd-columns}.
+ *
+ */
+public class TableOddColumnsElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "odd-columns");
+
+	/**
+	 * Create the instance of <code>TableOddColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableOddColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:odd-columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOddRowsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOddRowsElement.java
new file mode 100644
index 0000000..31f31d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOddRowsElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableParagraphStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:odd-rows}.
+ *
+ */
+public class TableOddRowsElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "odd-rows");
+
+	/**
+	 * Create the instance of <code>TableOddRowsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableOddRowsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:odd-rows}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableParagraphStyleNameAttribute() {
+		TableParagraphStyleNameAttribute attr = (TableParagraphStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "paragraph-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableParagraphStyleNameAttribute</code> , See {@odf.attribute table:paragraph-style-name}
+	 *
+	 * @param tableParagraphStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableParagraphStyleNameAttribute(String tableParagraphStyleNameValue) {
+		TableParagraphStyleNameAttribute attr = new TableParagraphStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableParagraphStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOperationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOperationElement.java
new file mode 100644
index 0000000..937bfa3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableOperationElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIndexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:operation}.
+ *
+ */
+public class TableOperationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "operation");
+
+	/**
+	 * Create the instance of <code>TableOperationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableOperationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:operation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIndexAttribute</code> , See {@odf.attribute table:index}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableIndexAttribute() {
+		TableIndexAttribute attr = (TableIndexAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "index");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIndexAttribute</code> , See {@odf.attribute table:index}
+	 *
+	 * @param tableIndexValue   The type is <code>Integer</code>
+	 */
+	public void setTableIndexAttribute(Integer tableIndexValue) {
+		TableIndexAttribute attr = new TableIndexAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableIndexValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TablePreviousElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TablePreviousElement.java
new file mode 100644
index 0000000..7e728f9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TablePreviousElement.java
@@ -0,0 +1,113 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:previous}.
+ *
+ */
+public class TablePreviousElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "previous");
+
+	/**
+	 * Create the instance of <code>TablePreviousElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TablePreviousElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:previous}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableIdAttribute() {
+		TableIdAttribute attr = (TableIdAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIdAttribute</code> , See {@odf.attribute table:id}
+	 *
+	 * @param tableIdValue   The type is <code>String</code>
+	 */
+	public void setTableIdAttribute(String tableIdValue) {
+		TableIdAttribute attr = new TableIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:change-track-table-cell}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:change-track-table-cell}
+	 */
+	 public TableChangeTrackTableCellElement newTableChangeTrackTableCellElement(double officeValueValue, String officeValueTypeValue) {
+		TableChangeTrackTableCellElement tableChangeTrackTableCell = ((OdfFileDom) this.ownerDocument).newOdfElement(TableChangeTrackTableCellElement.class);
+		tableChangeTrackTableCell.setOfficeValueAttribute(officeValueValue);
+		tableChangeTrackTableCell.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(tableChangeTrackTableCell);
+		return tableChangeTrackTableCell;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableScenarioElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableScenarioElement.java
new file mode 100644
index 0000000..ce29995
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableScenarioElement.java
@@ -0,0 +1,300 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBorderColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCommentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCopyBackAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCopyFormulasAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCopyStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIsActiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableScenarioRangesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:scenario}.
+ *
+ */
+public class TableScenarioElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "scenario");
+
+	/**
+	 * Create the instance of <code>TableScenarioElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableScenarioElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:scenario}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBorderColorAttribute</code> , See {@odf.attribute table:border-color}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableBorderColorAttribute() {
+		TableBorderColorAttribute attr = (TableBorderColorAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "border-color");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBorderColorAttribute</code> , See {@odf.attribute table:border-color}
+	 *
+	 * @param tableBorderColorValue   The type is <code>String</code>
+	 */
+	public void setTableBorderColorAttribute(String tableBorderColorValue) {
+		TableBorderColorAttribute attr = new TableBorderColorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableBorderColorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCommentAttribute</code> , See {@odf.attribute table:comment}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCommentAttribute() {
+		TableCommentAttribute attr = (TableCommentAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "comment");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCommentAttribute</code> , See {@odf.attribute table:comment}
+	 *
+	 * @param tableCommentValue   The type is <code>String</code>
+	 */
+	public void setTableCommentAttribute(String tableCommentValue) {
+		TableCommentAttribute attr = new TableCommentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCommentValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCopyBackAttribute</code> , See {@odf.attribute table:copy-back}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableCopyBackAttribute() {
+		TableCopyBackAttribute attr = (TableCopyBackAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "copy-back");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableCopyBackAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCopyBackAttribute</code> , See {@odf.attribute table:copy-back}
+	 *
+	 * @param tableCopyBackValue   The type is <code>Boolean</code>
+	 */
+	public void setTableCopyBackAttribute(Boolean tableCopyBackValue) {
+		TableCopyBackAttribute attr = new TableCopyBackAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableCopyBackValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCopyFormulasAttribute</code> , See {@odf.attribute table:copy-formulas}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableCopyFormulasAttribute() {
+		TableCopyFormulasAttribute attr = (TableCopyFormulasAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "copy-formulas");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableCopyFormulasAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCopyFormulasAttribute</code> , See {@odf.attribute table:copy-formulas}
+	 *
+	 * @param tableCopyFormulasValue   The type is <code>Boolean</code>
+	 */
+	public void setTableCopyFormulasAttribute(Boolean tableCopyFormulasValue) {
+		TableCopyFormulasAttribute attr = new TableCopyFormulasAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableCopyFormulasValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCopyStylesAttribute</code> , See {@odf.attribute table:copy-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableCopyStylesAttribute() {
+		TableCopyStylesAttribute attr = (TableCopyStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "copy-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableCopyStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCopyStylesAttribute</code> , See {@odf.attribute table:copy-styles}
+	 *
+	 * @param tableCopyStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableCopyStylesAttribute(Boolean tableCopyStylesValue) {
+		TableCopyStylesAttribute attr = new TableCopyStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableCopyStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayBorderAttribute</code> , See {@odf.attribute table:display-border}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayBorderAttribute() {
+		TableDisplayBorderAttribute attr = (TableDisplayBorderAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display-border");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayBorderAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayBorderAttribute</code> , See {@odf.attribute table:display-border}
+	 *
+	 * @param tableDisplayBorderValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayBorderAttribute(Boolean tableDisplayBorderValue) {
+		TableDisplayBorderAttribute attr = new TableDisplayBorderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayBorderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIsActiveAttribute</code> , See {@odf.attribute table:is-active}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableIsActiveAttribute() {
+		TableIsActiveAttribute attr = (TableIsActiveAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "is-active");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIsActiveAttribute</code> , See {@odf.attribute table:is-active}
+	 *
+	 * @param tableIsActiveValue   The type is <code>Boolean</code>
+	 */
+	public void setTableIsActiveAttribute(Boolean tableIsActiveValue) {
+		TableIsActiveAttribute attr = new TableIsActiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableIsActiveValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectedAttribute</code> , See {@odf.attribute table:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableProtectedAttribute() {
+		TableProtectedAttribute attr = (TableProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectedAttribute</code> , See {@odf.attribute table:protected}
+	 *
+	 * @param tableProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTableProtectedAttribute(Boolean tableProtectedValue) {
+		TableProtectedAttribute attr = new TableProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableScenarioRangesAttribute</code> , See {@odf.attribute table:scenario-ranges}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableScenarioRangesAttribute() {
+		TableScenarioRangesAttribute attr = (TableScenarioRangesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "scenario-ranges");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableScenarioRangesAttribute</code> , See {@odf.attribute table:scenario-ranges}
+	 *
+	 * @param tableScenarioRangesValue   The type is <code>String</code>
+	 */
+	public void setTableScenarioRangesAttribute(String tableScenarioRangesValue) {
+		TableScenarioRangesAttribute attr = new TableScenarioRangesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableScenarioRangesValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableShapesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableShapesElement.java
new file mode 100644
index 0000000..f643361
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableShapesElement.java
@@ -0,0 +1,329 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:shapes}.
+ *
+ */
+public class TableShapesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "shapes");
+
+	/**
+	 * Create the instance of <code>TableShapesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableShapesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:shapes}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortByElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortByElement.java
new file mode 100644
index 0000000..d1aef9b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortByElement.java
@@ -0,0 +1,148 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDataTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFieldNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOrderAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:sort-by}.
+ *
+ */
+public class TableSortByElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "sort-by");
+
+	/**
+	 * Create the instance of <code>TableSortByElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSortByElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:sort-by}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDataTypeAttribute</code> , See {@odf.attribute table:data-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDataTypeAttribute() {
+		TableDataTypeAttribute attr = (TableDataTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "data-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableDataTypeAttribute.DEFAULT_VALUE_AUTOMATIC;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDataTypeAttribute</code> , See {@odf.attribute table:data-type}
+	 *
+	 * @param tableDataTypeValue   The type is <code>String</code>
+	 */
+	public void setTableDataTypeAttribute(String tableDataTypeValue) {
+		TableDataTypeAttribute attr = new TableDataTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDataTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFieldNumberAttribute</code> , See {@odf.attribute table:field-number}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableFieldNumberAttribute() {
+		TableFieldNumberAttribute attr = (TableFieldNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "field-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFieldNumberAttribute</code> , See {@odf.attribute table:field-number}
+	 *
+	 * @param tableFieldNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTableFieldNumberAttribute(Integer tableFieldNumberValue) {
+		TableFieldNumberAttribute attr = new TableFieldNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableFieldNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOrderAttribute</code> , See {@odf.attribute table:order}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOrderAttribute() {
+		TableOrderAttribute attr = (TableOrderAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "order");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableOrderAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOrderAttribute</code> , See {@odf.attribute table:order}
+	 *
+	 * @param tableOrderValue   The type is <code>String</code>
+	 */
+	public void setTableOrderAttribute(String tableOrderValue) {
+		TableOrderAttribute attr = new TableOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOrderValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortElement.java
new file mode 100644
index 0000000..c939df3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortElement.java
@@ -0,0 +1,311 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBindStylesToContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCaseSensitiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEmbeddedNumberBehaviorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTargetRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:sort}.
+ *
+ */
+public class TableSortElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "sort");
+
+	/**
+	 * Create the instance of <code>TableSortElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSortElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:sort}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableAlgorithmAttribute</code> , See {@odf.attribute table:algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableAlgorithmAttribute() {
+		TableAlgorithmAttribute attr = (TableAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableAlgorithmAttribute</code> , See {@odf.attribute table:algorithm}
+	 *
+	 * @param tableAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTableAlgorithmAttribute(String tableAlgorithmValue) {
+		TableAlgorithmAttribute attr = new TableAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBindStylesToContentAttribute</code> , See {@odf.attribute table:bind-styles-to-content}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableBindStylesToContentAttribute() {
+		TableBindStylesToContentAttribute attr = (TableBindStylesToContentAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "bind-styles-to-content");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableBindStylesToContentAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBindStylesToContentAttribute</code> , See {@odf.attribute table:bind-styles-to-content}
+	 *
+	 * @param tableBindStylesToContentValue   The type is <code>Boolean</code>
+	 */
+	public void setTableBindStylesToContentAttribute(Boolean tableBindStylesToContentValue) {
+		TableBindStylesToContentAttribute attr = new TableBindStylesToContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableBindStylesToContentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCaseSensitiveAttribute() {
+		TableCaseSensitiveAttribute attr = (TableCaseSensitiveAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "case-sensitive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableCaseSensitiveAttribute.DEFAULT_VALUE_FALSE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @param tableCaseSensitiveValue   The type is <code>String</code>
+	 */
+	public void setTableCaseSensitiveAttribute(String tableCaseSensitiveValue) {
+		TableCaseSensitiveAttribute attr = new TableCaseSensitiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCaseSensitiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCountryAttribute</code> , See {@odf.attribute table:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCountryAttribute() {
+		TableCountryAttribute attr = (TableCountryAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCountryAttribute</code> , See {@odf.attribute table:country}
+	 *
+	 * @param tableCountryValue   The type is <code>String</code>
+	 */
+	public void setTableCountryAttribute(String tableCountryValue) {
+		TableCountryAttribute attr = new TableCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEmbeddedNumberBehaviorAttribute</code> , See {@odf.attribute table:embedded-number-behavior}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableEmbeddedNumberBehaviorAttribute() {
+		TableEmbeddedNumberBehaviorAttribute attr = (TableEmbeddedNumberBehaviorAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "embedded-number-behavior");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableEmbeddedNumberBehaviorAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEmbeddedNumberBehaviorAttribute</code> , See {@odf.attribute table:embedded-number-behavior}
+	 *
+	 * @param tableEmbeddedNumberBehaviorValue   The type is <code>String</code>
+	 */
+	public void setTableEmbeddedNumberBehaviorAttribute(String tableEmbeddedNumberBehaviorValue) {
+		TableEmbeddedNumberBehaviorAttribute attr = new TableEmbeddedNumberBehaviorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableEmbeddedNumberBehaviorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLanguageAttribute</code> , See {@odf.attribute table:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableLanguageAttribute() {
+		TableLanguageAttribute attr = (TableLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLanguageAttribute</code> , See {@odf.attribute table:language}
+	 *
+	 * @param tableLanguageValue   The type is <code>String</code>
+	 */
+	public void setTableLanguageAttribute(String tableLanguageValue) {
+		TableLanguageAttribute attr = new TableLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRfcLanguageTagAttribute</code> , See {@odf.attribute table:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRfcLanguageTagAttribute() {
+		TableRfcLanguageTagAttribute attr = (TableRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRfcLanguageTagAttribute</code> , See {@odf.attribute table:rfc-language-tag}
+	 *
+	 * @param tableRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setTableRfcLanguageTagAttribute(String tableRfcLanguageTagValue) {
+		TableRfcLanguageTagAttribute attr = new TableRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableScriptAttribute</code> , See {@odf.attribute table:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableScriptAttribute() {
+		TableScriptAttribute attr = (TableScriptAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableScriptAttribute</code> , See {@odf.attribute table:script}
+	 *
+	 * @param tableScriptValue   The type is <code>String</code>
+	 */
+	public void setTableScriptAttribute(String tableScriptValue) {
+		TableScriptAttribute attr = new TableScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTargetRangeAddressAttribute() {
+		TableTargetRangeAddressAttribute attr = (TableTargetRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "target-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTargetRangeAddressAttribute</code> , See {@odf.attribute table:target-range-address}
+	 *
+	 * @param tableTargetRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableTargetRangeAddressAttribute(String tableTargetRangeAddressValue) {
+		TableTargetRangeAddressAttribute attr = new TableTargetRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTargetRangeAddressValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:sort-by}.
+	 *
+	 * @param tableFieldNumberValue  the <code>Integer</code> value of <code>TableFieldNumberAttribute</code>, see {@odf.attribute  table:field-number} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:sort-by}
+	 */
+	 public TableSortByElement newTableSortByElement(int tableFieldNumberValue) {
+		TableSortByElement tableSortBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSortByElement.class);
+		tableSortBy.setTableFieldNumberAttribute(tableFieldNumberValue);
+		this.appendChild(tableSortBy);
+		return tableSortBy;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortGroupsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortGroupsElement.java
new file mode 100644
index 0000000..a75b747
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSortGroupsElement.java
@@ -0,0 +1,121 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDataTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableOrderAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:sort-groups}.
+ *
+ */
+public class TableSortGroupsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "sort-groups");
+
+	/**
+	 * Create the instance of <code>TableSortGroupsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSortGroupsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:sort-groups}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDataTypeAttribute</code> , See {@odf.attribute table:data-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDataTypeAttribute() {
+		TableDataTypeAttribute attr = (TableDataTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "data-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableDataTypeAttribute.DEFAULT_VALUE_AUTOMATIC;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDataTypeAttribute</code> , See {@odf.attribute table:data-type}
+	 *
+	 * @param tableDataTypeValue   The type is <code>String</code>
+	 */
+	public void setTableDataTypeAttribute(String tableDataTypeValue) {
+		TableDataTypeAttribute attr = new TableDataTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDataTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableOrderAttribute</code> , See {@odf.attribute table:order}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableOrderAttribute() {
+		TableOrderAttribute attr = (TableOrderAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "order");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableOrderAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableOrderAttribute</code> , See {@odf.attribute table:order}
+	 *
+	 * @param tableOrderValue   The type is <code>String</code>
+	 */
+	public void setTableOrderAttribute(String tableOrderValue) {
+		TableOrderAttribute attr = new TableOrderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableOrderValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceCellRangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceCellRangeElement.java
new file mode 100644
index 0000000..13c2d9f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceCellRangeElement.java
@@ -0,0 +1,109 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCellRangeAddressAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:source-cell-range}.
+ *
+ */
+public class TableSourceCellRangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "source-cell-range");
+
+	/**
+	 * Create the instance of <code>TableSourceCellRangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSourceCellRangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:source-cell-range}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCellRangeAddressAttribute() {
+		TableCellRangeAddressAttribute attr = (TableCellRangeAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "cell-range-address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCellRangeAddressAttribute</code> , See {@odf.attribute table:cell-range-address}
+	 *
+	 * @param tableCellRangeAddressValue   The type is <code>String</code>
+	 */
+	public void setTableCellRangeAddressAttribute(String tableCellRangeAddressValue) {
+		TableCellRangeAddressAttribute attr = new TableCellRangeAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCellRangeAddressValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:filter}.
+	 *
+	 * @return the element {@odf.element table:filter}
+	 */
+	public TableFilterElement newTableFilterElement() {
+		TableFilterElement tableFilter = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFilterElement.class);
+		this.appendChild(tableFilter);
+		return tableFilter;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceRangeAddressElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceRangeAddressElement.java
new file mode 100644
index 0000000..e85e323
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceRangeAddressElement.java
@@ -0,0 +1,296 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:source-range-address}.
+ *
+ */
+public class TableSourceRangeAddressElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "source-range-address");
+
+	/**
+	 * Create the instance of <code>TableSourceRangeAddressElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSourceRangeAddressElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:source-range-address}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableColumnAttribute</code> , See {@odf.attribute table:column}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableColumnAttribute() {
+		TableColumnAttribute attr = (TableColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableColumnAttribute</code> , See {@odf.attribute table:column}
+	 *
+	 * @param tableColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableColumnAttribute(Integer tableColumnValue) {
+		TableColumnAttribute attr = new TableColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndColumnAttribute</code> , See {@odf.attribute table:end-column}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndColumnAttribute() {
+		TableEndColumnAttribute attr = (TableEndColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndColumnAttribute</code> , See {@odf.attribute table:end-column}
+	 *
+	 * @param tableEndColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndColumnAttribute(Integer tableEndColumnValue) {
+		TableEndColumnAttribute attr = new TableEndColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndRowAttribute</code> , See {@odf.attribute table:end-row}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndRowAttribute() {
+		TableEndRowAttribute attr = (TableEndRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndRowAttribute</code> , See {@odf.attribute table:end-row}
+	 *
+	 * @param tableEndRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndRowAttribute(Integer tableEndRowValue) {
+		TableEndRowAttribute attr = new TableEndRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndTableAttribute</code> , See {@odf.attribute table:end-table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndTableAttribute() {
+		TableEndTableAttribute attr = (TableEndTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndTableAttribute</code> , See {@odf.attribute table:end-table}
+	 *
+	 * @param tableEndTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndTableAttribute(Integer tableEndTableValue) {
+		TableEndTableAttribute attr = new TableEndTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndTableValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRowAttribute</code> , See {@odf.attribute table:row}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableRowAttribute() {
+		TableRowAttribute attr = (TableRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRowAttribute</code> , See {@odf.attribute table:row}
+	 *
+	 * @param tableRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableRowAttribute(Integer tableRowValue) {
+		TableRowAttribute attr = new TableRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartColumnAttribute</code> , See {@odf.attribute table:start-column}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartColumnAttribute() {
+		TableStartColumnAttribute attr = (TableStartColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartColumnAttribute</code> , See {@odf.attribute table:start-column}
+	 *
+	 * @param tableStartColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartColumnAttribute(Integer tableStartColumnValue) {
+		TableStartColumnAttribute attr = new TableStartColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartRowAttribute</code> , See {@odf.attribute table:start-row}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartRowAttribute() {
+		TableStartRowAttribute attr = (TableStartRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartRowAttribute</code> , See {@odf.attribute table:start-row}
+	 *
+	 * @param tableStartRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartRowAttribute(Integer tableStartRowValue) {
+		TableStartRowAttribute attr = new TableStartRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartTableAttribute</code> , See {@odf.attribute table:start-table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartTableAttribute() {
+		TableStartTableAttribute attr = (TableStartTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartTableAttribute</code> , See {@odf.attribute table:start-table}
+	 *
+	 * @param tableStartTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartTableAttribute(Integer tableStartTableValue) {
+		TableStartTableAttribute attr = new TableStartTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartTableValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableTableAttribute() {
+		TableTableAttribute attr = (TableTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @param tableTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableTableAttribute(Integer tableTableValue) {
+		TableTableAttribute attr = new TableTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableTableValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceServiceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceServiceElement.java
new file mode 100644
index 0000000..8ff73df
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSourceServiceElement.java
@@ -0,0 +1,202 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableObjectNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePasswordAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableSourceNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUserNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:source-service}.
+ *
+ */
+public class TableSourceServiceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "source-service");
+
+	/**
+	 * Create the instance of <code>TableSourceServiceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSourceServiceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:source-service}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableObjectNameAttribute</code> , See {@odf.attribute table:object-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableObjectNameAttribute() {
+		TableObjectNameAttribute attr = (TableObjectNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "object-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableObjectNameAttribute</code> , See {@odf.attribute table:object-name}
+	 *
+	 * @param tableObjectNameValue   The type is <code>String</code>
+	 */
+	public void setTableObjectNameAttribute(String tableObjectNameValue) {
+		TableObjectNameAttribute attr = new TableObjectNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableObjectNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePasswordAttribute</code> , See {@odf.attribute table:password}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTablePasswordAttribute() {
+		TablePasswordAttribute attr = (TablePasswordAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "password");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePasswordAttribute</code> , See {@odf.attribute table:password}
+	 *
+	 * @param tablePasswordValue   The type is <code>String</code>
+	 */
+	public void setTablePasswordAttribute(String tablePasswordValue) {
+		TablePasswordAttribute attr = new TablePasswordAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tablePasswordValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableSourceNameAttribute</code> , See {@odf.attribute table:source-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableSourceNameAttribute() {
+		TableSourceNameAttribute attr = (TableSourceNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "source-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableSourceNameAttribute</code> , See {@odf.attribute table:source-name}
+	 *
+	 * @param tableSourceNameValue   The type is <code>String</code>
+	 */
+	public void setTableSourceNameAttribute(String tableSourceNameValue) {
+		TableSourceNameAttribute attr = new TableSourceNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableSourceNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUserNameAttribute</code> , See {@odf.attribute table:user-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableUserNameAttribute() {
+		TableUserNameAttribute attr = (TableUserNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "user-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUserNameAttribute</code> , See {@odf.attribute table:user-name}
+	 *
+	 * @param tableUserNameValue   The type is <code>String</code>
+	 */
+	public void setTableUserNameAttribute(String tableUserNameValue) {
+		TableUserNameAttribute attr = new TableUserNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableUserNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalFieldElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalFieldElement.java
new file mode 100644
index 0000000..9ee1135
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalFieldElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFieldNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFunctionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:subtotal-field}.
+ *
+ */
+public class TableSubtotalFieldElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "subtotal-field");
+
+	/**
+	 * Create the instance of <code>TableSubtotalFieldElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSubtotalFieldElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:subtotal-field}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFieldNumberAttribute</code> , See {@odf.attribute table:field-number}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableFieldNumberAttribute() {
+		TableFieldNumberAttribute attr = (TableFieldNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "field-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFieldNumberAttribute</code> , See {@odf.attribute table:field-number}
+	 *
+	 * @param tableFieldNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTableFieldNumberAttribute(Integer tableFieldNumberValue) {
+		TableFieldNumberAttribute attr = new TableFieldNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableFieldNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFunctionAttribute() {
+		TableFunctionAttribute attr = (TableFunctionAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "function");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFunctionAttribute</code> , See {@odf.attribute table:function}
+	 *
+	 * @param tableFunctionValue   The type is <code>String</code>
+	 */
+	public void setTableFunctionAttribute(String tableFunctionValue) {
+		TableFunctionAttribute attr = new TableFunctionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFunctionValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalRuleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalRuleElement.java
new file mode 100644
index 0000000..369bb5a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalRuleElement.java
@@ -0,0 +1,113 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableGroupByFieldNumberAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:subtotal-rule}.
+ *
+ */
+public class TableSubtotalRuleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "subtotal-rule");
+
+	/**
+	 * Create the instance of <code>TableSubtotalRuleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSubtotalRuleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:subtotal-rule}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableGroupByFieldNumberAttribute</code> , See {@odf.attribute table:group-by-field-number}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableGroupByFieldNumberAttribute() {
+		TableGroupByFieldNumberAttribute attr = (TableGroupByFieldNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "group-by-field-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableGroupByFieldNumberAttribute</code> , See {@odf.attribute table:group-by-field-number}
+	 *
+	 * @param tableGroupByFieldNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTableGroupByFieldNumberAttribute(Integer tableGroupByFieldNumberValue) {
+		TableGroupByFieldNumberAttribute attr = new TableGroupByFieldNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableGroupByFieldNumberValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:subtotal-field}.
+	 *
+	 * @param tableFieldNumberValue  the <code>Integer</code> value of <code>TableFieldNumberAttribute</code>, see {@odf.attribute  table:field-number} at specification
+	 * @param tableFunctionValue  the <code>String</code> value of <code>TableFunctionAttribute</code>, see {@odf.attribute  table:function} at specification
+	 * @return the element {@odf.element table:subtotal-field}
+	 */
+	 public TableSubtotalFieldElement newTableSubtotalFieldElement(int tableFieldNumberValue, String tableFunctionValue) {
+		TableSubtotalFieldElement tableSubtotalField = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSubtotalFieldElement.class);
+		tableSubtotalField.setTableFieldNumberAttribute(tableFieldNumberValue);
+		tableSubtotalField.setTableFunctionAttribute(tableFunctionValue);
+		this.appendChild(tableSubtotalField);
+		return tableSubtotalField;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalRulesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalRulesElement.java
new file mode 100644
index 0000000..b1b36f2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableSubtotalRulesElement.java
@@ -0,0 +1,170 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableBindStylesToContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableCaseSensitiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePageBreaksOnGroupChangeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:subtotal-rules}.
+ *
+ */
+public class TableSubtotalRulesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "subtotal-rules");
+
+	/**
+	 * Create the instance of <code>TableSubtotalRulesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableSubtotalRulesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:subtotal-rules}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableBindStylesToContentAttribute</code> , See {@odf.attribute table:bind-styles-to-content}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableBindStylesToContentAttribute() {
+		TableBindStylesToContentAttribute attr = (TableBindStylesToContentAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "bind-styles-to-content");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableBindStylesToContentAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableBindStylesToContentAttribute</code> , See {@odf.attribute table:bind-styles-to-content}
+	 *
+	 * @param tableBindStylesToContentValue   The type is <code>Boolean</code>
+	 */
+	public void setTableBindStylesToContentAttribute(Boolean tableBindStylesToContentValue) {
+		TableBindStylesToContentAttribute attr = new TableBindStylesToContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableBindStylesToContentValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableCaseSensitiveAttribute() {
+		TableCaseSensitiveAttribute attr = (TableCaseSensitiveAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "case-sensitive");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableCaseSensitiveAttribute.DEFAULT_VALUE_FALSE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableCaseSensitiveAttribute</code> , See {@odf.attribute table:case-sensitive}
+	 *
+	 * @param tableCaseSensitiveValue   The type is <code>String</code>
+	 */
+	public void setTableCaseSensitiveAttribute(String tableCaseSensitiveValue) {
+		TableCaseSensitiveAttribute attr = new TableCaseSensitiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableCaseSensitiveValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePageBreaksOnGroupChangeAttribute</code> , See {@odf.attribute table:page-breaks-on-group-change}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTablePageBreaksOnGroupChangeAttribute() {
+		TablePageBreaksOnGroupChangeAttribute attr = (TablePageBreaksOnGroupChangeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "page-breaks-on-group-change");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TablePageBreaksOnGroupChangeAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePageBreaksOnGroupChangeAttribute</code> , See {@odf.attribute table:page-breaks-on-group-change}
+	 *
+	 * @param tablePageBreaksOnGroupChangeValue   The type is <code>Boolean</code>
+	 */
+	public void setTablePageBreaksOnGroupChangeAttribute(Boolean tablePageBreaksOnGroupChangeValue) {
+		TablePageBreaksOnGroupChangeAttribute attr = new TablePageBreaksOnGroupChangeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tablePageBreaksOnGroupChangeValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:sort-groups}.
+	 *
+	 * @return the element {@odf.element table:sort-groups}
+	 */
+	public TableSortGroupsElement newTableSortGroupsElement() {
+		TableSortGroupsElement tableSortGroups = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSortGroupsElement.class);
+		this.appendChild(tableSortGroups);
+		return tableSortGroups;
+	}
+
+	/**
+	 * Create child element {@odf.element table:subtotal-rule}.
+	 *
+	 * @param tableGroupByFieldNumberValue  the <code>Integer</code> value of <code>TableGroupByFieldNumberAttribute</code>, see {@odf.attribute  table:group-by-field-number} at specification
+	 * @return the element {@odf.element table:subtotal-rule}
+	 */
+	 public TableSubtotalRuleElement newTableSubtotalRuleElement(int tableGroupByFieldNumberValue) {
+		TableSubtotalRuleElement tableSubtotalRule = ((OdfFileDom) this.ownerDocument).newOdfElement(TableSubtotalRuleElement.class);
+		tableSubtotalRule.setTableGroupByFieldNumberAttribute(tableGroupByFieldNumberValue);
+		this.appendChild(tableSubtotalRule);
+		return tableSubtotalRule;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableCellElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableCellElement.java
new file mode 100644
index 0000000..87a9d37
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableCellElement.java
@@ -0,0 +1,704 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAlphabeticalIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBibliographyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChangeStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIllustrationIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberedParagraphElement;
+import org.odftoolkit.odfdom.dom.element.text.TextObjectIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableIndexElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserIndexElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberColumnsSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberMatrixColumnsSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberMatrixRowsSpannedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberRowsSpannedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-cell}.
+ *
+ */
+public class TableTableCellElement extends TableTableCellElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-cell");
+
+	/**
+	 * Create the instance of <code>TableTableCellElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableCellElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableCell, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-cell}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberColumnsSpannedAttribute</code> , See {@odf.attribute table:number-columns-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberColumnsSpannedAttribute() {
+		TableNumberColumnsSpannedAttribute attr = (TableNumberColumnsSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-columns-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableNumberColumnsSpannedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberColumnsSpannedAttribute</code> , See {@odf.attribute table:number-columns-spanned}
+	 *
+	 * @param tableNumberColumnsSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberColumnsSpannedAttribute(Integer tableNumberColumnsSpannedValue) {
+		TableNumberColumnsSpannedAttribute attr = new TableNumberColumnsSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberColumnsSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberMatrixColumnsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-columns-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberMatrixColumnsSpannedAttribute() {
+		TableNumberMatrixColumnsSpannedAttribute attr = (TableNumberMatrixColumnsSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-matrix-columns-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberMatrixColumnsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-columns-spanned}
+	 *
+	 * @param tableNumberMatrixColumnsSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberMatrixColumnsSpannedAttribute(Integer tableNumberMatrixColumnsSpannedValue) {
+		TableNumberMatrixColumnsSpannedAttribute attr = new TableNumberMatrixColumnsSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberMatrixColumnsSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberMatrixRowsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-rows-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberMatrixRowsSpannedAttribute() {
+		TableNumberMatrixRowsSpannedAttribute attr = (TableNumberMatrixRowsSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-matrix-rows-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberMatrixRowsSpannedAttribute</code> , See {@odf.attribute table:number-matrix-rows-spanned}
+	 *
+	 * @param tableNumberMatrixRowsSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberMatrixRowsSpannedAttribute(Integer tableNumberMatrixRowsSpannedValue) {
+		TableNumberMatrixRowsSpannedAttribute attr = new TableNumberMatrixRowsSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberMatrixRowsSpannedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberRowsSpannedAttribute</code> , See {@odf.attribute table:number-rows-spanned}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberRowsSpannedAttribute() {
+		TableNumberRowsSpannedAttribute attr = (TableNumberRowsSpannedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-rows-spanned");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableNumberRowsSpannedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberRowsSpannedAttribute</code> , See {@odf.attribute table:number-rows-spanned}
+	 *
+	 * @param tableNumberRowsSpannedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberRowsSpannedAttribute(Integer tableNumberRowsSpannedValue) {
+		TableNumberRowsSpannedAttribute attr = new TableNumberRowsSpannedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberRowsSpannedValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element table:cell-range-source}.
+	 *
+	 * @param tableLastColumnSpannedValue  the <code>Integer</code> value of <code>TableLastColumnSpannedAttribute</code>, see {@odf.attribute  table:last-column-spanned} at specification
+	 * @param tableLastRowSpannedValue  the <code>Integer</code> value of <code>TableLastRowSpannedAttribute</code>, see {@odf.attribute  table:last-row-spanned} at specification
+	 * @param tableNameValue  the <code>String</code> value of <code>TableNameAttribute</code>, see {@odf.attribute  table:name} at specification
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element table:cell-range-source}
+	 */
+	 public TableCellRangeSourceElement newTableCellRangeSourceElement(int tableLastColumnSpannedValue, int tableLastRowSpannedValue, String tableNameValue, String xlinkHrefValue, String xlinkTypeValue) {
+		TableCellRangeSourceElement tableCellRangeSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCellRangeSourceElement.class);
+		tableCellRangeSource.setTableLastColumnSpannedAttribute(tableLastColumnSpannedValue);
+		tableCellRangeSource.setTableLastRowSpannedAttribute(tableLastRowSpannedValue);
+		tableCellRangeSource.setTableNameAttribute(tableNameValue);
+		tableCellRangeSource.setXlinkHrefAttribute(xlinkHrefValue);
+		tableCellRangeSource.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(tableCellRangeSource);
+		return tableCellRangeSource;
+	}
+
+	/**
+	 * Create child element {@odf.element table:detective}.
+	 *
+	 * @return the element {@odf.element table:detective}
+	 */
+	public TableDetectiveElement newTableDetectiveElement() {
+		TableDetectiveElement tableDetective = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDetectiveElement.class);
+		this.appendChild(tableDetective);
+		return tableDetective;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableCellElementBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableCellElementBase.java
new file mode 100644
index 0000000..20ac6b2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableCellElementBase.java
@@ -0,0 +1,526 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableContentValidationNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberColumnsRepeatedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlAboutAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlDatatypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlPropertyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument base element
+ *
+ */
+public abstract class TableTableCellElementBase extends OdfStylableElement {
+
+	/**
+	 * Create the instance of <code>TableTableCellElementBase</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableCellElementBase(OdfFileDom ownerDoc, OdfName elementName, OdfStyleFamily styleFamily, OdfName styleAttrName) {
+		super(ownerDoc, elementName, styleFamily, styleAttrName);
+	}
+
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableContentValidationNameAttribute</code> , See {@odf.attribute table:content-validation-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableContentValidationNameAttribute() {
+		TableContentValidationNameAttribute attr = (TableContentValidationNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "content-validation-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableContentValidationNameAttribute</code> , See {@odf.attribute table:content-validation-name}
+	 *
+	 * @param tableContentValidationNameValue   The type is <code>String</code>
+	 */
+	public void setTableContentValidationNameAttribute(String tableContentValidationNameValue) {
+		TableContentValidationNameAttribute attr = new TableContentValidationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableContentValidationNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFormulaAttribute</code> , See {@odf.attribute table:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFormulaAttribute() {
+		TableFormulaAttribute attr = (TableFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFormulaAttribute</code> , See {@odf.attribute table:formula}
+	 *
+	 * @param tableFormulaValue   The type is <code>String</code>
+	 */
+	public void setTableFormulaAttribute(String tableFormulaValue) {
+		TableFormulaAttribute attr = new TableFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberColumnsRepeatedAttribute</code> , See {@odf.attribute table:number-columns-repeated}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberColumnsRepeatedAttribute() {
+		TableNumberColumnsRepeatedAttribute attr = (TableNumberColumnsRepeatedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-columns-repeated");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableNumberColumnsRepeatedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberColumnsRepeatedAttribute</code> , See {@odf.attribute table:number-columns-repeated}
+	 *
+	 * @param tableNumberColumnsRepeatedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberColumnsRepeatedAttribute(Integer tableNumberColumnsRepeatedValue) {
+		TableNumberColumnsRepeatedAttribute attr = new TableNumberColumnsRepeatedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberColumnsRepeatedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectAttribute</code> , See {@odf.attribute table:protect}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableProtectAttribute() {
+		TableProtectAttribute attr = (TableProtectAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protect");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableProtectAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectAttribute</code> , See {@odf.attribute table:protect}
+	 *
+	 * @param tableProtectValue   The type is <code>Boolean</code>
+	 */
+	public void setTableProtectAttribute(Boolean tableProtectValue) {
+		TableProtectAttribute attr = new TableProtectAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableProtectValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectedAttribute</code> , See {@odf.attribute table:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableProtectedAttribute() {
+		TableProtectedAttribute attr = (TableProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableProtectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectedAttribute</code> , See {@odf.attribute table:protected}
+	 *
+	 * @param tableProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTableProtectedAttribute(Boolean tableProtectedValue) {
+		TableProtectedAttribute attr = new TableProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlAboutAttribute() {
+		XhtmlAboutAttribute attr = (XhtmlAboutAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "about");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @param xhtmlAboutValue   The type is <code>String</code>
+	 */
+	public void setXhtmlAboutAttribute(String xhtmlAboutValue) {
+		XhtmlAboutAttribute attr = new XhtmlAboutAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlAboutValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlContentAttribute() {
+		XhtmlContentAttribute attr = (XhtmlContentAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "content");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @param xhtmlContentValue   The type is <code>String</code>
+	 */
+	public void setXhtmlContentAttribute(String xhtmlContentValue) {
+		XhtmlContentAttribute attr = new XhtmlContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlContentValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlDatatypeAttribute() {
+		XhtmlDatatypeAttribute attr = (XhtmlDatatypeAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "datatype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @param xhtmlDatatypeValue   The type is <code>String</code>
+	 */
+	public void setXhtmlDatatypeAttribute(String xhtmlDatatypeValue) {
+		XhtmlDatatypeAttribute attr = new XhtmlDatatypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlDatatypeValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlPropertyAttribute() {
+		XhtmlPropertyAttribute attr = (XhtmlPropertyAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "property");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @param xhtmlPropertyValue   The type is <code>String</code>
+	 */
+	public void setXhtmlPropertyAttribute(String xhtmlPropertyValue) {
+		XhtmlPropertyAttribute attr = new XhtmlPropertyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlPropertyValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+	
+	/**
+	* Set text content. Only elements which are allowed to have text content offer this method.
+	*/
+	public void setTextContent(String content){
+		super.setTextContent(content);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	protected void onRemoveNode() {
+		super.onRemoveNode();
+		((OdfFileDom) this.ownerDocument).getInContentMetadataCache().remove(this);
+	}
+
+	protected void onInsertNode() {
+		super.onInsertNode();
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnElement.java
new file mode 100644
index 0000000..4d0908b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnElement.java
@@ -0,0 +1,198 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDefaultCellStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberColumnsRepeatedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableVisibilityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-column}.
+ *
+ */
+public class TableTableColumnElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-column");
+
+	/**
+	 * Create the instance of <code>TableTableColumnElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableColumnElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableColumn, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-column}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDefaultCellStyleNameAttribute</code> , See {@odf.attribute table:default-cell-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDefaultCellStyleNameAttribute() {
+		TableDefaultCellStyleNameAttribute attr = (TableDefaultCellStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "default-cell-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDefaultCellStyleNameAttribute</code> , See {@odf.attribute table:default-cell-style-name}
+	 *
+	 * @param tableDefaultCellStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableDefaultCellStyleNameAttribute(String tableDefaultCellStyleNameValue) {
+		TableDefaultCellStyleNameAttribute attr = new TableDefaultCellStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDefaultCellStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberColumnsRepeatedAttribute</code> , See {@odf.attribute table:number-columns-repeated}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberColumnsRepeatedAttribute() {
+		TableNumberColumnsRepeatedAttribute attr = (TableNumberColumnsRepeatedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-columns-repeated");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableNumberColumnsRepeatedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberColumnsRepeatedAttribute</code> , See {@odf.attribute table:number-columns-repeated}
+	 *
+	 * @param tableNumberColumnsRepeatedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberColumnsRepeatedAttribute(Integer tableNumberColumnsRepeatedValue) {
+		TableNumberColumnsRepeatedAttribute attr = new TableNumberColumnsRepeatedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberColumnsRepeatedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableVisibilityAttribute</code> , See {@odf.attribute table:visibility}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableVisibilityAttribute() {
+		TableVisibilityAttribute attr = (TableVisibilityAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "visibility");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableVisibilityAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableVisibilityAttribute</code> , See {@odf.attribute table:visibility}
+	 *
+	 * @param tableVisibilityValue   The type is <code>String</code>
+	 */
+	public void setTableVisibilityAttribute(String tableVisibilityValue) {
+		TableVisibilityAttribute attr = new TableVisibilityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableVisibilityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnGroupElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnGroupElement.java
new file mode 100644
index 0000000..7fd7c21
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnGroupElement.java
@@ -0,0 +1,140 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-column-group}.
+ *
+ */
+public class TableTableColumnGroupElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-column-group");
+
+	/**
+	 * Create the instance of <code>TableTableColumnGroupElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableColumnGroupElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-column-group}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayAttribute() {
+		TableDisplayAttribute attr = (TableDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayAttribute.DEFAULT_VALUE_TRUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @param tableDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayAttribute(Boolean tableDisplayValue) {
+		TableDisplayAttribute attr = new TableDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-column}.
+	 *
+	 * @return the element {@odf.element table:table-column}
+	 */
+	public TableTableColumnElement newTableTableColumnElement() {
+		TableTableColumnElement tableTableColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnElement.class);
+		this.appendChild(tableTableColumn);
+		return tableTableColumn;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-column-group}.
+	 *
+	 * @return the element {@odf.element table:table-column-group}
+	 */
+	public TableTableColumnGroupElement newTableTableColumnGroupElement() {
+		TableTableColumnGroupElement tableTableColumnGroup = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnGroupElement.class);
+		this.appendChild(tableTableColumnGroup);
+		return tableTableColumnGroup;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-columns}.
+	 *
+	 * @return the element {@odf.element table:table-columns}
+	 */
+	public TableTableColumnsElement newTableTableColumnsElement() {
+		TableTableColumnsElement tableTableColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnsElement.class);
+		this.appendChild(tableTableColumns);
+		return tableTableColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-header-columns}.
+	 *
+	 * @return the element {@odf.element table:table-header-columns}
+	 */
+	public TableTableHeaderColumnsElement newTableTableHeaderColumnsElement() {
+		TableTableHeaderColumnsElement tableTableHeaderColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableHeaderColumnsElement.class);
+		this.appendChild(tableTableHeaderColumns);
+		return tableTableHeaderColumns;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnsElement.java
new file mode 100644
index 0000000..2a57e92
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableColumnsElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-columns}.
+ *
+ */
+public class TableTableColumnsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-columns");
+
+	/**
+	 * Create the instance of <code>TableTableColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-column}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:table-column}
+	 */
+	public TableTableColumnElement newTableTableColumnElement() {
+		TableTableColumnElement tableTableColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnElement.class);
+		this.appendChild(tableTableColumn);
+		return tableTableColumn;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableElement.java
new file mode 100644
index 0000000..8c346da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableElement.java
@@ -0,0 +1,683 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDdeSourceElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableIsSubTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePrintAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TablePrintRangesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTemplateNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseBandingColumnsStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseBandingRowsStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseFirstColumnStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseFirstRowStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseLastColumnStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableUseLastRowStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table}.
+ *
+ */
+public class TableTableElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table");
+
+	/**
+	 * Create the instance of <code>TableTableElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Table, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableIsSubTableAttribute</code> , See {@odf.attribute table:is-sub-table}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableIsSubTableAttribute() {
+		TableIsSubTableAttribute attr = (TableIsSubTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "is-sub-table");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableIsSubTableAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableIsSubTableAttribute</code> , See {@odf.attribute table:is-sub-table}
+	 *
+	 * @param tableIsSubTableValue   The type is <code>Boolean</code>
+	 */
+	public void setTableIsSubTableAttribute(Boolean tableIsSubTableValue) {
+		TableIsSubTableAttribute attr = new TableIsSubTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableIsSubTableValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePrintAttribute</code> , See {@odf.attribute table:print}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTablePrintAttribute() {
+		TablePrintAttribute attr = (TablePrintAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "print");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TablePrintAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePrintAttribute</code> , See {@odf.attribute table:print}
+	 *
+	 * @param tablePrintValue   The type is <code>Boolean</code>
+	 */
+	public void setTablePrintAttribute(Boolean tablePrintValue) {
+		TablePrintAttribute attr = new TablePrintAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tablePrintValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TablePrintRangesAttribute</code> , See {@odf.attribute table:print-ranges}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTablePrintRangesAttribute() {
+		TablePrintRangesAttribute attr = (TablePrintRangesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "print-ranges");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TablePrintRangesAttribute</code> , See {@odf.attribute table:print-ranges}
+	 *
+	 * @param tablePrintRangesValue   The type is <code>String</code>
+	 */
+	public void setTablePrintRangesAttribute(String tablePrintRangesValue) {
+		TablePrintRangesAttribute attr = new TablePrintRangesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tablePrintRangesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectedAttribute</code> , See {@odf.attribute table:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableProtectedAttribute() {
+		TableProtectedAttribute attr = (TableProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableProtectedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectedAttribute</code> , See {@odf.attribute table:protected}
+	 *
+	 * @param tableProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTableProtectedAttribute(Boolean tableProtectedValue) {
+		TableProtectedAttribute attr = new TableProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectionKeyAttribute</code> , See {@odf.attribute table:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableProtectionKeyAttribute() {
+		TableProtectionKeyAttribute attr = (TableProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectionKeyAttribute</code> , See {@odf.attribute table:protection-key}
+	 *
+	 * @param tableProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTableProtectionKeyAttribute(String tableProtectionKeyValue) {
+		TableProtectionKeyAttribute attr = new TableProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute table:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableProtectionKeyDigestAlgorithmAttribute() {
+		TableProtectionKeyDigestAlgorithmAttribute attr = (TableProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute table:protection-key-digest-algorithm}
+	 *
+	 * @param tableProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTableProtectionKeyDigestAlgorithmAttribute(String tableProtectionKeyDigestAlgorithmValue) {
+		TableProtectionKeyDigestAlgorithmAttribute attr = new TableProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTemplateNameAttribute</code> , See {@odf.attribute table:template-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTemplateNameAttribute() {
+		TableTemplateNameAttribute attr = (TableTemplateNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "template-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTemplateNameAttribute</code> , See {@odf.attribute table:template-name}
+	 *
+	 * @param tableTemplateNameValue   The type is <code>String</code>
+	 */
+	public void setTableTemplateNameAttribute(String tableTemplateNameValue) {
+		TableTemplateNameAttribute attr = new TableTemplateNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTemplateNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseBandingColumnsStylesAttribute</code> , See {@odf.attribute table:use-banding-columns-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseBandingColumnsStylesAttribute() {
+		TableUseBandingColumnsStylesAttribute attr = (TableUseBandingColumnsStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-banding-columns-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseBandingColumnsStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseBandingColumnsStylesAttribute</code> , See {@odf.attribute table:use-banding-columns-styles}
+	 *
+	 * @param tableUseBandingColumnsStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseBandingColumnsStylesAttribute(Boolean tableUseBandingColumnsStylesValue) {
+		TableUseBandingColumnsStylesAttribute attr = new TableUseBandingColumnsStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseBandingColumnsStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseBandingRowsStylesAttribute</code> , See {@odf.attribute table:use-banding-rows-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseBandingRowsStylesAttribute() {
+		TableUseBandingRowsStylesAttribute attr = (TableUseBandingRowsStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-banding-rows-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseBandingRowsStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseBandingRowsStylesAttribute</code> , See {@odf.attribute table:use-banding-rows-styles}
+	 *
+	 * @param tableUseBandingRowsStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseBandingRowsStylesAttribute(Boolean tableUseBandingRowsStylesValue) {
+		TableUseBandingRowsStylesAttribute attr = new TableUseBandingRowsStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseBandingRowsStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseFirstColumnStylesAttribute</code> , See {@odf.attribute table:use-first-column-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseFirstColumnStylesAttribute() {
+		TableUseFirstColumnStylesAttribute attr = (TableUseFirstColumnStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-first-column-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseFirstColumnStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseFirstColumnStylesAttribute</code> , See {@odf.attribute table:use-first-column-styles}
+	 *
+	 * @param tableUseFirstColumnStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseFirstColumnStylesAttribute(Boolean tableUseFirstColumnStylesValue) {
+		TableUseFirstColumnStylesAttribute attr = new TableUseFirstColumnStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseFirstColumnStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseFirstRowStylesAttribute</code> , See {@odf.attribute table:use-first-row-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseFirstRowStylesAttribute() {
+		TableUseFirstRowStylesAttribute attr = (TableUseFirstRowStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-first-row-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseFirstRowStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseFirstRowStylesAttribute</code> , See {@odf.attribute table:use-first-row-styles}
+	 *
+	 * @param tableUseFirstRowStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseFirstRowStylesAttribute(Boolean tableUseFirstRowStylesValue) {
+		TableUseFirstRowStylesAttribute attr = new TableUseFirstRowStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseFirstRowStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseLastColumnStylesAttribute</code> , See {@odf.attribute table:use-last-column-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseLastColumnStylesAttribute() {
+		TableUseLastColumnStylesAttribute attr = (TableUseLastColumnStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-last-column-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseLastColumnStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseLastColumnStylesAttribute</code> , See {@odf.attribute table:use-last-column-styles}
+	 *
+	 * @param tableUseLastColumnStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseLastColumnStylesAttribute(Boolean tableUseLastColumnStylesValue) {
+		TableUseLastColumnStylesAttribute attr = new TableUseLastColumnStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseLastColumnStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableUseLastRowStylesAttribute</code> , See {@odf.attribute table:use-last-row-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableUseLastRowStylesAttribute() {
+		TableUseLastRowStylesAttribute attr = (TableUseLastRowStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "use-last-row-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableUseLastRowStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableUseLastRowStylesAttribute</code> , See {@odf.attribute table:use-last-row-styles}
+	 *
+	 * @param tableUseLastRowStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableUseLastRowStylesAttribute(Boolean tableUseLastRowStylesValue) {
+		TableUseLastRowStylesAttribute attr = new TableUseLastRowStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableUseLastRowStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:dde-source}.
+	 *
+	 * @param officeDdeApplicationValue  the <code>String</code> value of <code>OfficeDdeApplicationAttribute</code>, see {@odf.attribute  office:dde-application} at specification
+	 * @param officeDdeItemValue  the <code>String</code> value of <code>OfficeDdeItemAttribute</code>, see {@odf.attribute  office:dde-item} at specification
+	 * @param officeDdeTopicValue  the <code>String</code> value of <code>OfficeDdeTopicAttribute</code>, see {@odf.attribute  office:dde-topic} at specification
+	 * @return the element {@odf.element office:dde-source}
+	 */
+	 public OfficeDdeSourceElement newOfficeDdeSourceElement(String officeDdeApplicationValue, String officeDdeItemValue, String officeDdeTopicValue) {
+		OfficeDdeSourceElement officeDdeSource = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDdeSourceElement.class);
+		officeDdeSource.setOfficeDdeApplicationAttribute(officeDdeApplicationValue);
+		officeDdeSource.setOfficeDdeItemAttribute(officeDdeItemValue);
+		officeDdeSource.setOfficeDdeTopicAttribute(officeDdeTopicValue);
+		this.appendChild(officeDdeSource);
+		return officeDdeSource;
+	}
+
+	/**
+	 * Create child element {@odf.element office:forms}.
+	 *
+	 * @return the element {@odf.element office:forms}
+	 */
+	public OfficeFormsElement newOfficeFormsElement() {
+		OfficeFormsElement officeForms = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeFormsElement.class);
+		this.appendChild(officeForms);
+		return officeForms;
+	}
+
+	/**
+	 * Create child element {@odf.element table:desc}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:desc}
+	 */
+	public TableDescElement newTableDescElement() {
+		TableDescElement tableDesc = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDescElement.class);
+		this.appendChild(tableDesc);
+		return tableDesc;
+	}
+
+	/**
+	 * Create child element {@odf.element table:named-expressions}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:named-expressions}
+	 */
+	public TableNamedExpressionsElement newTableNamedExpressionsElement() {
+		TableNamedExpressionsElement tableNamedExpressions = ((OdfFileDom) this.ownerDocument).newOdfElement(TableNamedExpressionsElement.class);
+		this.appendChild(tableNamedExpressions);
+		return tableNamedExpressions;
+	}
+
+	/**
+	 * Create child element {@odf.element table:scenario}.
+	 *
+	 * @param tableIsActiveValue  the <code>Boolean</code> value of <code>TableIsActiveAttribute</code>, see {@odf.attribute  table:is-active} at specification
+	 * @param tableScenarioRangesValue  the <code>String</code> value of <code>TableScenarioRangesAttribute</code>, see {@odf.attribute  table:scenario-ranges} at specification
+	 * @return the element {@odf.element table:scenario}
+	 */
+	 public TableScenarioElement newTableScenarioElement(boolean tableIsActiveValue, String tableScenarioRangesValue) {
+		TableScenarioElement tableScenario = ((OdfFileDom) this.ownerDocument).newOdfElement(TableScenarioElement.class);
+		tableScenario.setTableIsActiveAttribute(tableIsActiveValue);
+		tableScenario.setTableScenarioRangesAttribute(tableScenarioRangesValue);
+		this.appendChild(tableScenario);
+		return tableScenario;
+	}
+
+	/**
+	 * Create child element {@odf.element table:shapes}.
+	 *
+	 * @return the element {@odf.element table:shapes}
+	 */
+	public TableShapesElement newTableShapesElement() {
+		TableShapesElement tableShapes = ((OdfFileDom) this.ownerDocument).newOdfElement(TableShapesElement.class);
+		this.appendChild(tableShapes);
+		return tableShapes;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-column}.
+	 *
+	 * @return the element {@odf.element table:table-column}
+	 */
+	public TableTableColumnElement newTableTableColumnElement() {
+		TableTableColumnElement tableTableColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnElement.class);
+		this.appendChild(tableTableColumn);
+		return tableTableColumn;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-column-group}.
+	 *
+	 * @return the element {@odf.element table:table-column-group}
+	 */
+	public TableTableColumnGroupElement newTableTableColumnGroupElement() {
+		TableTableColumnGroupElement tableTableColumnGroup = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnGroupElement.class);
+		this.appendChild(tableTableColumnGroup);
+		return tableTableColumnGroup;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-columns}.
+	 *
+	 * @return the element {@odf.element table:table-columns}
+	 */
+	public TableTableColumnsElement newTableTableColumnsElement() {
+		TableTableColumnsElement tableTableColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnsElement.class);
+		this.appendChild(tableTableColumns);
+		return tableTableColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-header-columns}.
+	 *
+	 * @return the element {@odf.element table:table-header-columns}
+	 */
+	public TableTableHeaderColumnsElement newTableTableHeaderColumnsElement() {
+		TableTableHeaderColumnsElement tableTableHeaderColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableHeaderColumnsElement.class);
+		this.appendChild(tableTableHeaderColumns);
+		return tableTableHeaderColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-header-rows}.
+	 *
+	 * @return the element {@odf.element table:table-header-rows}
+	 */
+	public TableTableHeaderRowsElement newTableTableHeaderRowsElement() {
+		TableTableHeaderRowsElement tableTableHeaderRows = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableHeaderRowsElement.class);
+		this.appendChild(tableTableHeaderRows);
+		return tableTableHeaderRows;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-row}.
+	 *
+	 * @return the element {@odf.element table:table-row}
+	 */
+	public TableTableRowElement newTableTableRowElement() {
+		TableTableRowElement tableTableRow = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowElement.class);
+		this.appendChild(tableTableRow);
+		return tableTableRow;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-row-group}.
+	 *
+	 * @return the element {@odf.element table:table-row-group}
+	 */
+	public TableTableRowGroupElement newTableTableRowGroupElement() {
+		TableTableRowGroupElement tableTableRowGroup = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowGroupElement.class);
+		this.appendChild(tableTableRowGroup);
+		return tableTableRowGroup;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-rows}.
+	 *
+	 * @return the element {@odf.element table:table-rows}
+	 */
+	public TableTableRowsElement newTableTableRowsElement() {
+		TableTableRowsElement tableTableRows = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowsElement.class);
+		this.appendChild(tableTableRows);
+		return tableTableRows;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-source}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element table:table-source}
+	 */
+	 public TableTableSourceElement newTableTableSourceElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TableTableSourceElement tableTableSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableSourceElement.class);
+		tableTableSource.setXlinkHrefAttribute(xlinkHrefValue);
+		tableTableSource.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(tableTableSource);
+		return tableTableSource;
+	}
+
+	/**
+	 * Create child element {@odf.element table:title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:title}
+	 */
+	public TableTitleElement newTableTitleElement() {
+		TableTitleElement tableTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTitleElement.class);
+		this.appendChild(tableTitle);
+		return tableTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableHeaderColumnsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableHeaderColumnsElement.java
new file mode 100644
index 0000000..574e441
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableHeaderColumnsElement.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-header-columns}.
+ *
+ */
+public class TableTableHeaderColumnsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-header-columns");
+
+	/**
+	 * Create the instance of <code>TableTableHeaderColumnsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableHeaderColumnsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-header-columns}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-column}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:table-column}
+	 */
+	public TableTableColumnElement newTableTableColumnElement() {
+		TableTableColumnElement tableTableColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableColumnElement.class);
+		this.appendChild(tableTableColumn);
+		return tableTableColumn;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableHeaderRowsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableHeaderRowsElement.java
new file mode 100644
index 0000000..a8e3546
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableHeaderRowsElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-header-rows}.
+ *
+ */
+public class TableTableHeaderRowsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-header-rows");
+
+	/**
+	 * Create the instance of <code>TableTableHeaderRowsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableHeaderRowsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-header-rows}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-row}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:table-row}
+	 */
+	public TableTableRowElement newTableTableRowElement() {
+		TableTableRowElement tableTableRow = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowElement.class);
+		this.appendChild(tableTableRow);
+		return tableTableRow;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowElement.java
new file mode 100644
index 0000000..1148a2a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowElement.java
@@ -0,0 +1,228 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDefaultCellStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNumberRowsRepeatedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableVisibilityAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-row}.
+ *
+ */
+public class TableTableRowElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-row");
+
+	/**
+	 * Create the instance of <code>TableTableRowElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableRowElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.TableRow, OdfName.newName(OdfDocumentNamespace.TABLE, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-row}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDefaultCellStyleNameAttribute</code> , See {@odf.attribute table:default-cell-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableDefaultCellStyleNameAttribute() {
+		TableDefaultCellStyleNameAttribute attr = (TableDefaultCellStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "default-cell-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDefaultCellStyleNameAttribute</code> , See {@odf.attribute table:default-cell-style-name}
+	 *
+	 * @param tableDefaultCellStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableDefaultCellStyleNameAttribute(String tableDefaultCellStyleNameValue) {
+		TableDefaultCellStyleNameAttribute attr = new TableDefaultCellStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableDefaultCellStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNumberRowsRepeatedAttribute</code> , See {@odf.attribute table:number-rows-repeated}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableNumberRowsRepeatedAttribute() {
+		TableNumberRowsRepeatedAttribute attr = (TableNumberRowsRepeatedAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "number-rows-repeated");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TableNumberRowsRepeatedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNumberRowsRepeatedAttribute</code> , See {@odf.attribute table:number-rows-repeated}
+	 *
+	 * @param tableNumberRowsRepeatedValue   The type is <code>Integer</code>
+	 */
+	public void setTableNumberRowsRepeatedAttribute(Integer tableNumberRowsRepeatedValue) {
+		TableNumberRowsRepeatedAttribute attr = new TableNumberRowsRepeatedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableNumberRowsRepeatedValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableStyleNameAttribute() {
+		TableStyleNameAttribute attr = (TableStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStyleNameAttribute</code> , See {@odf.attribute table:style-name}
+	 *
+	 * @param tableStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTableStyleNameAttribute(String tableStyleNameValue) {
+		TableStyleNameAttribute attr = new TableStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableVisibilityAttribute</code> , See {@odf.attribute table:visibility}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableVisibilityAttribute() {
+		TableVisibilityAttribute attr = (TableVisibilityAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "visibility");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableVisibilityAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableVisibilityAttribute</code> , See {@odf.attribute table:visibility}
+	 *
+	 * @param tableVisibilityValue   The type is <code>String</code>
+	 */
+	public void setTableVisibilityAttribute(String tableVisibilityValue) {
+		TableVisibilityAttribute attr = new TableVisibilityAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableVisibilityValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:covered-table-cell}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element table:covered-table-cell}
+	 */
+	 public TableCoveredTableCellElement newTableCoveredTableCellElement(double officeValueValue, String officeValueTypeValue) {
+		TableCoveredTableCellElement tableCoveredTableCell = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCoveredTableCellElement.class);
+		tableCoveredTableCell.setOfficeValueAttribute(officeValueValue);
+		tableCoveredTableCell.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(tableCoveredTableCell);
+		return tableCoveredTableCell;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-cell}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element table:table-cell}
+	 */
+	 public TableTableCellElement newTableTableCellElement(double officeValueValue, String officeValueTypeValue) {
+		TableTableCellElement tableTableCell = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableCellElement.class);
+		tableTableCell.setOfficeValueAttribute(officeValueValue);
+		tableTableCell.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(tableTableCell);
+		return tableTableCell;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowGroupElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowGroupElement.java
new file mode 100644
index 0000000..42e1801
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowGroupElement.java
@@ -0,0 +1,152 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.attribute.table.TableDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-row-group}.
+ *
+ */
+public class TableTableRowGroupElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-row-group");
+
+	/**
+	 * Create the instance of <code>TableTableRowGroupElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableRowGroupElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-row-group}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableDisplayAttribute() {
+		TableDisplayAttribute attr = (TableDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "display");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableDisplayAttribute.DEFAULT_VALUE_TRUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableDisplayAttribute</code> , See {@odf.attribute table:display}
+	 *
+	 * @param tableDisplayValue   The type is <code>Boolean</code>
+	 */
+	public void setTableDisplayAttribute(Boolean tableDisplayValue) {
+		TableDisplayAttribute attr = new TableDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableDisplayValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-header-rows}.
+	 *
+	 * @return the element {@odf.element table:table-header-rows}
+	 */
+	public TableTableHeaderRowsElement newTableTableHeaderRowsElement() {
+		TableTableHeaderRowsElement tableTableHeaderRows = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableHeaderRowsElement.class);
+		this.appendChild(tableTableHeaderRows);
+		return tableTableHeaderRows;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-row}.
+	 *
+	 * @return the element {@odf.element table:table-row}
+	 */
+	public TableTableRowElement newTableTableRowElement() {
+		TableTableRowElement tableTableRow = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowElement.class);
+		this.appendChild(tableTableRow);
+		return tableTableRow;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-row-group}.
+	 *
+	 * @return the element {@odf.element table:table-row-group}
+	 */
+	public TableTableRowGroupElement newTableTableRowGroupElement() {
+		TableTableRowGroupElement tableTableRowGroup = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowGroupElement.class);
+		this.appendChild(tableTableRowGroup);
+		return tableTableRowGroup;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-rows}.
+	 *
+	 * @return the element {@odf.element table:table-rows}
+	 */
+	public TableTableRowsElement newTableTableRowsElement() {
+		TableTableRowsElement tableTableRows = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowsElement.class);
+		this.appendChild(tableTableRows);
+		return tableTableRows;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowsElement.java
new file mode 100644
index 0000000..fb8d81d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableRowsElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-rows}.
+ *
+ */
+public class TableTableRowsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-rows");
+
+	/**
+	 * Create the instance of <code>TableTableRowsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableRowsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-rows}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table-row}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:table-row}
+	 */
+	public TableTableRowElement newTableTableRowElement() {
+		TableTableRowElement tableTableRow = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableRowElement.class);
+		this.appendChild(tableTableRow);
+		return tableTableRow;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableSourceElement.java
new file mode 100644
index 0000000..af3d9ee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableSourceElement.java
@@ -0,0 +1,275 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFilterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFilterOptionsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRefreshDelayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-source}.
+ *
+ */
+public class TableTableSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-source");
+
+	/**
+	 * Create the instance of <code>TableTableSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFilterNameAttribute</code> , See {@odf.attribute table:filter-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFilterNameAttribute() {
+		TableFilterNameAttribute attr = (TableFilterNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "filter-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFilterNameAttribute</code> , See {@odf.attribute table:filter-name}
+	 *
+	 * @param tableFilterNameValue   The type is <code>String</code>
+	 */
+	public void setTableFilterNameAttribute(String tableFilterNameValue) {
+		TableFilterNameAttribute attr = new TableFilterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFilterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFilterOptionsAttribute</code> , See {@odf.attribute table:filter-options}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFilterOptionsAttribute() {
+		TableFilterOptionsAttribute attr = (TableFilterOptionsAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "filter-options");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFilterOptionsAttribute</code> , See {@odf.attribute table:filter-options}
+	 *
+	 * @param tableFilterOptionsValue   The type is <code>String</code>
+	 */
+	public void setTableFilterOptionsAttribute(String tableFilterOptionsValue) {
+		TableFilterOptionsAttribute attr = new TableFilterOptionsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFilterOptionsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableModeAttribute</code> , See {@odf.attribute table:mode}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableModeAttribute() {
+		TableModeAttribute attr = (TableModeAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "mode");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TableModeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableModeAttribute</code> , See {@odf.attribute table:mode}
+	 *
+	 * @param tableModeValue   The type is <code>String</code>
+	 */
+	public void setTableModeAttribute(String tableModeValue) {
+		TableModeAttribute attr = new TableModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRefreshDelayAttribute</code> , See {@odf.attribute table:refresh-delay}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableRefreshDelayAttribute() {
+		TableRefreshDelayAttribute attr = (TableRefreshDelayAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "refresh-delay");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRefreshDelayAttribute</code> , See {@odf.attribute table:refresh-delay}
+	 *
+	 * @param tableRefreshDelayValue   The type is <code>String</code>
+	 */
+	public void setTableRefreshDelayAttribute(String tableRefreshDelayValue) {
+		TableRefreshDelayAttribute attr = new TableRefreshDelayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableRefreshDelayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableNameAttribute</code> , See {@odf.attribute table:table-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableTableNameAttribute() {
+		TableTableNameAttribute attr = (TableTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableNameAttribute</code> , See {@odf.attribute table:table-name}
+	 *
+	 * @param tableTableNameValue   The type is <code>String</code>
+	 */
+	public void setTableTableNameAttribute(String tableTableNameValue) {
+		TableTableNameAttribute attr = new TableTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableTemplateElement.java
new file mode 100644
index 0000000..b46c0a8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTableTemplateElement.java
@@ -0,0 +1,358 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFirstRowEndColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableFirstRowStartColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLastRowEndColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableLastRowStartColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:table-template}.
+ *
+ */
+public class TableTableTemplateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "table-template");
+
+	/**
+	 * Create the instance of <code>TableTableTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTableTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:table-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFirstRowEndColumnAttribute</code> , See {@odf.attribute table:first-row-end-column}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFirstRowEndColumnAttribute() {
+		TableFirstRowEndColumnAttribute attr = (TableFirstRowEndColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "first-row-end-column");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFirstRowEndColumnAttribute</code> , See {@odf.attribute table:first-row-end-column}
+	 *
+	 * @param tableFirstRowEndColumnValue   The type is <code>String</code>
+	 */
+	public void setTableFirstRowEndColumnAttribute(String tableFirstRowEndColumnValue) {
+		TableFirstRowEndColumnAttribute attr = new TableFirstRowEndColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFirstRowEndColumnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableFirstRowStartColumnAttribute</code> , See {@odf.attribute table:first-row-start-column}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableFirstRowStartColumnAttribute() {
+		TableFirstRowStartColumnAttribute attr = (TableFirstRowStartColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "first-row-start-column");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableFirstRowStartColumnAttribute</code> , See {@odf.attribute table:first-row-start-column}
+	 *
+	 * @param tableFirstRowStartColumnValue   The type is <code>String</code>
+	 */
+	public void setTableFirstRowStartColumnAttribute(String tableFirstRowStartColumnValue) {
+		TableFirstRowStartColumnAttribute attr = new TableFirstRowStartColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableFirstRowStartColumnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLastRowEndColumnAttribute</code> , See {@odf.attribute table:last-row-end-column}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableLastRowEndColumnAttribute() {
+		TableLastRowEndColumnAttribute attr = (TableLastRowEndColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "last-row-end-column");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLastRowEndColumnAttribute</code> , See {@odf.attribute table:last-row-end-column}
+	 *
+	 * @param tableLastRowEndColumnValue   The type is <code>String</code>
+	 */
+	public void setTableLastRowEndColumnAttribute(String tableLastRowEndColumnValue) {
+		TableLastRowEndColumnAttribute attr = new TableLastRowEndColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableLastRowEndColumnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableLastRowStartColumnAttribute</code> , See {@odf.attribute table:last-row-start-column}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableLastRowStartColumnAttribute() {
+		TableLastRowStartColumnAttribute attr = (TableLastRowStartColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "last-row-start-column");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableLastRowStartColumnAttribute</code> , See {@odf.attribute table:last-row-start-column}
+	 *
+	 * @param tableLastRowStartColumnValue   The type is <code>String</code>
+	 */
+	public void setTableLastRowStartColumnAttribute(String tableLastRowStartColumnValue) {
+		TableLastRowStartColumnAttribute attr = new TableLastRowStartColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableLastRowStartColumnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTableNameAttribute() {
+		TableNameAttribute attr = (TableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableNameAttribute</code> , See {@odf.attribute table:name}
+	 *
+	 * @param tableNameValue   The type is <code>String</code>
+	 */
+	public void setTableNameAttribute(String tableNameValue) {
+		TableNameAttribute attr = new TableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(tableNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element table:background}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:background}
+	 */
+	 public TableBackgroundElement newTableBackgroundElement(String tableStyleNameValue) {
+		TableBackgroundElement tableBackground = ((OdfFileDom) this.ownerDocument).newOdfElement(TableBackgroundElement.class);
+		tableBackground.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableBackground);
+		return tableBackground;
+	}
+
+	/**
+	 * Create child element {@odf.element table:body}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element table:body}
+	 */
+	 public TableBodyElement newTableBodyElement(String tableStyleNameValue) {
+		TableBodyElement tableBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TableBodyElement.class);
+		tableBody.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableBody);
+		return tableBody;
+	}
+
+	/**
+	 * Create child element {@odf.element table:even-columns}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:even-columns}
+	 */
+	 public TableEvenColumnsElement newTableEvenColumnsElement(String tableStyleNameValue) {
+		TableEvenColumnsElement tableEvenColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(TableEvenColumnsElement.class);
+		tableEvenColumns.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableEvenColumns);
+		return tableEvenColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element table:even-rows}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:even-rows}
+	 */
+	 public TableEvenRowsElement newTableEvenRowsElement(String tableStyleNameValue) {
+		TableEvenRowsElement tableEvenRows = ((OdfFileDom) this.ownerDocument).newOdfElement(TableEvenRowsElement.class);
+		tableEvenRows.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableEvenRows);
+		return tableEvenRows;
+	}
+
+	/**
+	 * Create child element {@odf.element table:first-column}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:first-column}
+	 */
+	 public TableFirstColumnElement newTableFirstColumnElement(String tableStyleNameValue) {
+		TableFirstColumnElement tableFirstColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFirstColumnElement.class);
+		tableFirstColumn.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableFirstColumn);
+		return tableFirstColumn;
+	}
+
+	/**
+	 * Create child element {@odf.element table:first-row}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:first-row}
+	 */
+	 public TableFirstRowElement newTableFirstRowElement(String tableStyleNameValue) {
+		TableFirstRowElement tableFirstRow = ((OdfFileDom) this.ownerDocument).newOdfElement(TableFirstRowElement.class);
+		tableFirstRow.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableFirstRow);
+		return tableFirstRow;
+	}
+
+	/**
+	 * Create child element {@odf.element table:last-column}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:last-column}
+	 */
+	 public TableLastColumnElement newTableLastColumnElement(String tableStyleNameValue) {
+		TableLastColumnElement tableLastColumn = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLastColumnElement.class);
+		tableLastColumn.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableLastColumn);
+		return tableLastColumn;
+	}
+
+	/**
+	 * Create child element {@odf.element table:last-row}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:last-row}
+	 */
+	 public TableLastRowElement newTableLastRowElement(String tableStyleNameValue) {
+		TableLastRowElement tableLastRow = ((OdfFileDom) this.ownerDocument).newOdfElement(TableLastRowElement.class);
+		tableLastRow.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableLastRow);
+		return tableLastRow;
+	}
+
+	/**
+	 * Create child element {@odf.element table:odd-columns}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:odd-columns}
+	 */
+	 public TableOddColumnsElement newTableOddColumnsElement(String tableStyleNameValue) {
+		TableOddColumnsElement tableOddColumns = ((OdfFileDom) this.ownerDocument).newOdfElement(TableOddColumnsElement.class);
+		tableOddColumns.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableOddColumns);
+		return tableOddColumns;
+	}
+
+	/**
+	 * Create child element {@odf.element table:odd-rows}.
+	 *
+	 * @param tableStyleNameValue  the <code>String</code> value of <code>TableStyleNameAttribute</code>, see {@odf.attribute  table:style-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element table:odd-rows}
+	 */
+	 public TableOddRowsElement newTableOddRowsElement(String tableStyleNameValue) {
+		TableOddRowsElement tableOddRows = ((OdfFileDom) this.ownerDocument).newOdfElement(TableOddRowsElement.class);
+		tableOddRows.setTableStyleNameAttribute(tableStyleNameValue);
+		this.appendChild(tableOddRows);
+		return tableOddRows;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTargetRangeAddressElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTargetRangeAddressElement.java
new file mode 100644
index 0000000..2d96649
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTargetRangeAddressElement.java
@@ -0,0 +1,296 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableEndTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartColumnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartRowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableStartTableAttribute;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTableAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:target-range-address}.
+ *
+ */
+public class TableTargetRangeAddressElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "target-range-address");
+
+	/**
+	 * Create the instance of <code>TableTargetRangeAddressElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTargetRangeAddressElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:target-range-address}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableColumnAttribute</code> , See {@odf.attribute table:column}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableColumnAttribute() {
+		TableColumnAttribute attr = (TableColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableColumnAttribute</code> , See {@odf.attribute table:column}
+	 *
+	 * @param tableColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableColumnAttribute(Integer tableColumnValue) {
+		TableColumnAttribute attr = new TableColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndColumnAttribute</code> , See {@odf.attribute table:end-column}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndColumnAttribute() {
+		TableEndColumnAttribute attr = (TableEndColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndColumnAttribute</code> , See {@odf.attribute table:end-column}
+	 *
+	 * @param tableEndColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndColumnAttribute(Integer tableEndColumnValue) {
+		TableEndColumnAttribute attr = new TableEndColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndRowAttribute</code> , See {@odf.attribute table:end-row}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndRowAttribute() {
+		TableEndRowAttribute attr = (TableEndRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndRowAttribute</code> , See {@odf.attribute table:end-row}
+	 *
+	 * @param tableEndRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndRowAttribute(Integer tableEndRowValue) {
+		TableEndRowAttribute attr = new TableEndRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableEndTableAttribute</code> , See {@odf.attribute table:end-table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableEndTableAttribute() {
+		TableEndTableAttribute attr = (TableEndTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "end-table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableEndTableAttribute</code> , See {@odf.attribute table:end-table}
+	 *
+	 * @param tableEndTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableEndTableAttribute(Integer tableEndTableValue) {
+		TableEndTableAttribute attr = new TableEndTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableEndTableValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableRowAttribute</code> , See {@odf.attribute table:row}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableRowAttribute() {
+		TableRowAttribute attr = (TableRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableRowAttribute</code> , See {@odf.attribute table:row}
+	 *
+	 * @param tableRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableRowAttribute(Integer tableRowValue) {
+		TableRowAttribute attr = new TableRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartColumnAttribute</code> , See {@odf.attribute table:start-column}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartColumnAttribute() {
+		TableStartColumnAttribute attr = (TableStartColumnAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-column");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartColumnAttribute</code> , See {@odf.attribute table:start-column}
+	 *
+	 * @param tableStartColumnValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartColumnAttribute(Integer tableStartColumnValue) {
+		TableStartColumnAttribute attr = new TableStartColumnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartColumnValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartRowAttribute</code> , See {@odf.attribute table:start-row}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartRowAttribute() {
+		TableStartRowAttribute attr = (TableStartRowAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-row");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartRowAttribute</code> , See {@odf.attribute table:start-row}
+	 *
+	 * @param tableStartRowValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartRowAttribute(Integer tableStartRowValue) {
+		TableStartRowAttribute attr = new TableStartRowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartRowValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableStartTableAttribute</code> , See {@odf.attribute table:start-table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableStartTableAttribute() {
+		TableStartTableAttribute attr = (TableStartTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "start-table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableStartTableAttribute</code> , See {@odf.attribute table:start-table}
+	 *
+	 * @param tableStartTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableStartTableAttribute(Integer tableStartTableValue) {
+		TableStartTableAttribute attr = new TableStartTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableStartTableValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableTableAttribute() {
+		TableTableAttribute attr = (TableTableAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "table");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTableAttribute</code> , See {@odf.attribute table:table}
+	 *
+	 * @param tableTableValue   The type is <code>Integer</code>
+	 */
+	public void setTableTableAttribute(Integer tableTableValue) {
+		TableTableAttribute attr = new TableTableAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(tableTableValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTitleElement.java
new file mode 100644
index 0000000..267d0b2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTitleElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:title}.
+ *
+ */
+public class TableTitleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "title");
+
+	/**
+	 * Create the instance of <code>TableTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTrackedChangesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTrackedChangesElement.java
new file mode 100644
index 0000000..8d29b6b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/table/TableTrackedChangesElement.java
@@ -0,0 +1,156 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.table;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.table.TableTrackChangesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element table:tracked-changes}.
+ *
+ */
+public class TableTrackedChangesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TABLE, "tracked-changes");
+
+	/**
+	 * Create the instance of <code>TableTrackedChangesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TableTrackedChangesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element table:tracked-changes}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TableTrackChangesAttribute</code> , See {@odf.attribute table:track-changes}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTableTrackChangesAttribute() {
+		TableTrackChangesAttribute attr = (TableTrackChangesAttribute) getOdfAttribute(OdfDocumentNamespace.TABLE, "track-changes");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TableTrackChangesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TableTrackChangesAttribute</code> , See {@odf.attribute table:track-changes}
+	 *
+	 * @param tableTrackChangesValue   The type is <code>Boolean</code>
+	 */
+	public void setTableTrackChangesAttribute(Boolean tableTrackChangesValue) {
+		TableTrackChangesAttribute attr = new TableTrackChangesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(tableTrackChangesValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element table:cell-content-change}.
+	 *
+	 * @param tableIdValue  the <code>String</code> value of <code>TableIdAttribute</code>, see {@odf.attribute  table:id} at specification
+	 * @return the element {@odf.element table:cell-content-change}
+	 */
+	 public TableCellContentChangeElement newTableCellContentChangeElement(String tableIdValue) {
+		TableCellContentChangeElement tableCellContentChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TableCellContentChangeElement.class);
+		tableCellContentChange.setTableIdAttribute(tableIdValue);
+		this.appendChild(tableCellContentChange);
+		return tableCellContentChange;
+	}
+
+	/**
+	 * Create child element {@odf.element table:deletion}.
+	 *
+	 * @param tableIdValue  the <code>String</code> value of <code>TableIdAttribute</code>, see {@odf.attribute  table:id} at specification
+	 * @param tablePositionValue  the <code>Integer</code> value of <code>TablePositionAttribute</code>, see {@odf.attribute  table:position} at specification
+	 * @param tableTypeValue  the <code>String</code> value of <code>TableTypeAttribute</code>, see {@odf.attribute  table:type} at specification
+	 * @return the element {@odf.element table:deletion}
+	 */
+	 public TableDeletionElement newTableDeletionElement(String tableIdValue, int tablePositionValue, String tableTypeValue) {
+		TableDeletionElement tableDeletion = ((OdfFileDom) this.ownerDocument).newOdfElement(TableDeletionElement.class);
+		tableDeletion.setTableIdAttribute(tableIdValue);
+		tableDeletion.setTablePositionAttribute(tablePositionValue);
+		tableDeletion.setTableTypeAttribute(tableTypeValue);
+		this.appendChild(tableDeletion);
+		return tableDeletion;
+	}
+
+	/**
+	 * Create child element {@odf.element table:insertion}.
+	 *
+	 * @param tableIdValue  the <code>String</code> value of <code>TableIdAttribute</code>, see {@odf.attribute  table:id} at specification
+	 * @param tablePositionValue  the <code>Integer</code> value of <code>TablePositionAttribute</code>, see {@odf.attribute  table:position} at specification
+	 * @param tableTypeValue  the <code>String</code> value of <code>TableTypeAttribute</code>, see {@odf.attribute  table:type} at specification
+	 * @return the element {@odf.element table:insertion}
+	 */
+	 public TableInsertionElement newTableInsertionElement(String tableIdValue, int tablePositionValue, String tableTypeValue) {
+		TableInsertionElement tableInsertion = ((OdfFileDom) this.ownerDocument).newOdfElement(TableInsertionElement.class);
+		tableInsertion.setTableIdAttribute(tableIdValue);
+		tableInsertion.setTablePositionAttribute(tablePositionValue);
+		tableInsertion.setTableTypeAttribute(tableTypeValue);
+		this.appendChild(tableInsertion);
+		return tableInsertion;
+	}
+
+	/**
+	 * Create child element {@odf.element table:movement}.
+	 *
+	 * @param tableIdValue  the <code>String</code> value of <code>TableIdAttribute</code>, see {@odf.attribute  table:id} at specification
+	 * @return the element {@odf.element table:movement}
+	 */
+	 public TableMovementElement newTableMovementElement(String tableIdValue) {
+		TableMovementElement tableMovement = ((OdfFileDom) this.ownerDocument).newOdfElement(TableMovementElement.class);
+		tableMovement.setTableIdAttribute(tableIdValue);
+		this.appendChild(tableMovement);
+		return tableMovement;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAElement.java
new file mode 100644
index 0000000..ad733a7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAElement.java
@@ -0,0 +1,1920 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTargetFrameNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextVisitedStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:a}.
+ *
+ */
+public class TextAElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "a");
+
+	/**
+	 * Create the instance of <code>TextAElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:a}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTargetFrameNameAttribute() {
+		OfficeTargetFrameNameAttribute attr = (OfficeTargetFrameNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "target-frame-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTargetFrameNameAttribute</code> , See {@odf.attribute office:target-frame-name}
+	 *
+	 * @param officeTargetFrameNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeTargetFrameNameAttribute(String officeTargetFrameNameValue) {
+		OfficeTargetFrameNameAttribute attr = new OfficeTargetFrameNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTargetFrameNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTitleAttribute</code> , See {@odf.attribute office:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTitleAttribute() {
+		OfficeTitleAttribute attr = (OfficeTitleAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTitleAttribute</code> , See {@odf.attribute office:title}
+	 *
+	 * @param officeTitleValue   The type is <code>String</code>
+	 */
+	public void setOfficeTitleAttribute(String officeTitleValue) {
+		OfficeTitleAttribute attr = new OfficeTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextVisitedStyleNameAttribute</code> , See {@odf.attribute text:visited-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextVisitedStyleNameAttribute() {
+		TextVisitedStyleNameAttribute attr = (TextVisitedStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "visited-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextVisitedStyleNameAttribute</code> , See {@odf.attribute text:visited-style-name}
+	 *
+	 * @param textVisitedStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextVisitedStyleNameAttribute(String textVisitedStyleNameValue) {
+		TextVisitedStyleNameAttribute attr = new TextVisitedStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textVisitedStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONREQUEST;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexAutoMarkFileElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexAutoMarkFileElement.java
new file mode 100644
index 0000000..89d9732
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexAutoMarkFileElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index-auto-mark-file}.
+ *
+ */
+public class TextAlphabeticalIndexAutoMarkFileElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index-auto-mark-file");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexAutoMarkFileElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexAutoMarkFileElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index-auto-mark-file}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexElement.java
new file mode 100644
index 0000000..a589c14
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index}.
+ *
+ */
+public class TextAlphabeticalIndexElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-source}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-source}
+	 */
+	public TextAlphabeticalIndexSourceElement newTextAlphabeticalIndexSourceElement() {
+		TextAlphabeticalIndexSourceElement textAlphabeticalIndexSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexSourceElement.class);
+		this.appendChild(textAlphabeticalIndexSource);
+		return textAlphabeticalIndexSource;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexEntryTemplateElement.java
new file mode 100644
index 0000000..c2cdf48
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexEntryTemplateElement.java
@@ -0,0 +1,184 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index-entry-template}.
+ *
+ */
+public class TextAlphabeticalIndexEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index-entry-template");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-chapter}.
+	 *
+	 * @return the element {@odf.element text:index-entry-chapter}
+	 */
+	public TextIndexEntryChapterElement newTextIndexEntryChapterElement() {
+		TextIndexEntryChapterElement textIndexEntryChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryChapterElement.class);
+		this.appendChild(textIndexEntryChapter);
+		return textIndexEntryChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-page-number}.
+	 *
+	 * @return the element {@odf.element text:index-entry-page-number}
+	 */
+	public TextIndexEntryPageNumberElement newTextIndexEntryPageNumberElement() {
+		TextIndexEntryPageNumberElement textIndexEntryPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryPageNumberElement.class);
+		this.appendChild(textIndexEntryPageNumber);
+		return textIndexEntryPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-text}.
+	 *
+	 * @return the element {@odf.element text:index-entry-text}
+	 */
+	public TextIndexEntryTextElement newTextIndexEntryTextElement() {
+		TextIndexEntryTextElement textIndexEntryText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTextElement.class);
+		this.appendChild(textIndexEntryText);
+		return textIndexEntryText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkElement.java
new file mode 100644
index 0000000..98f630f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkElement.java
@@ -0,0 +1,248 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey1PhoneticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey2PhoneticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMainEntryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValuePhoneticAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index-mark}.
+ *
+ */
+public class TextAlphabeticalIndexMarkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index-mark");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexMarkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexMarkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index-mark}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey1Attribute</code> , See {@odf.attribute text:key1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey1Attribute() {
+		TextKey1Attribute attr = (TextKey1Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey1Attribute</code> , See {@odf.attribute text:key1}
+	 *
+	 * @param textKey1Value   The type is <code>String</code>
+	 */
+	public void setTextKey1Attribute(String textKey1Value) {
+		TextKey1Attribute attr = new TextKey1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey1PhoneticAttribute</code> , See {@odf.attribute text:key1-phonetic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey1PhoneticAttribute() {
+		TextKey1PhoneticAttribute attr = (TextKey1PhoneticAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key1-phonetic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey1PhoneticAttribute</code> , See {@odf.attribute text:key1-phonetic}
+	 *
+	 * @param textKey1PhoneticValue   The type is <code>String</code>
+	 */
+	public void setTextKey1PhoneticAttribute(String textKey1PhoneticValue) {
+		TextKey1PhoneticAttribute attr = new TextKey1PhoneticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey1PhoneticValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey2Attribute</code> , See {@odf.attribute text:key2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey2Attribute() {
+		TextKey2Attribute attr = (TextKey2Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey2Attribute</code> , See {@odf.attribute text:key2}
+	 *
+	 * @param textKey2Value   The type is <code>String</code>
+	 */
+	public void setTextKey2Attribute(String textKey2Value) {
+		TextKey2Attribute attr = new TextKey2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey2PhoneticAttribute</code> , See {@odf.attribute text:key2-phonetic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey2PhoneticAttribute() {
+		TextKey2PhoneticAttribute attr = (TextKey2PhoneticAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key2-phonetic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey2PhoneticAttribute</code> , See {@odf.attribute text:key2-phonetic}
+	 *
+	 * @param textKey2PhoneticValue   The type is <code>String</code>
+	 */
+	public void setTextKey2PhoneticAttribute(String textKey2PhoneticValue) {
+		TextKey2PhoneticAttribute attr = new TextKey2PhoneticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey2PhoneticValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMainEntryAttribute</code> , See {@odf.attribute text:main-entry}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextMainEntryAttribute() {
+		TextMainEntryAttribute attr = (TextMainEntryAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "main-entry");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextMainEntryAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMainEntryAttribute</code> , See {@odf.attribute text:main-entry}
+	 *
+	 * @param textMainEntryValue   The type is <code>Boolean</code>
+	 */
+	public void setTextMainEntryAttribute(Boolean textMainEntryValue) {
+		TextMainEntryAttribute attr = new TextMainEntryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textMainEntryValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueAttribute() {
+		TextStringValueAttribute attr = (TextStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * @param textStringValueValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueAttribute(String textStringValueValue) {
+		TextStringValueAttribute attr = new TextStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValuePhoneticAttribute</code> , See {@odf.attribute text:string-value-phonetic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValuePhoneticAttribute() {
+		TextStringValuePhoneticAttribute attr = (TextStringValuePhoneticAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value-phonetic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValuePhoneticAttribute</code> , See {@odf.attribute text:string-value-phonetic}
+	 *
+	 * @param textStringValuePhoneticValue   The type is <code>String</code>
+	 */
+	public void setTextStringValuePhoneticAttribute(String textStringValuePhoneticValue) {
+		TextStringValuePhoneticAttribute attr = new TextStringValuePhoneticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValuePhoneticValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkEndElement.java
new file mode 100644
index 0000000..1975840
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index-mark-end}.
+ *
+ */
+public class TextAlphabeticalIndexMarkEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index-mark-end");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexMarkEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexMarkEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index-mark-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkStartElement.java
new file mode 100644
index 0000000..5eabfaa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexMarkStartElement.java
@@ -0,0 +1,248 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey1PhoneticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKey2PhoneticAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMainEntryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValuePhoneticAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index-mark-start}.
+ *
+ */
+public class TextAlphabeticalIndexMarkStartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index-mark-start");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexMarkStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexMarkStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index-mark-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey1Attribute</code> , See {@odf.attribute text:key1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey1Attribute() {
+		TextKey1Attribute attr = (TextKey1Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey1Attribute</code> , See {@odf.attribute text:key1}
+	 *
+	 * @param textKey1Value   The type is <code>String</code>
+	 */
+	public void setTextKey1Attribute(String textKey1Value) {
+		TextKey1Attribute attr = new TextKey1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey1PhoneticAttribute</code> , See {@odf.attribute text:key1-phonetic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey1PhoneticAttribute() {
+		TextKey1PhoneticAttribute attr = (TextKey1PhoneticAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key1-phonetic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey1PhoneticAttribute</code> , See {@odf.attribute text:key1-phonetic}
+	 *
+	 * @param textKey1PhoneticValue   The type is <code>String</code>
+	 */
+	public void setTextKey1PhoneticAttribute(String textKey1PhoneticValue) {
+		TextKey1PhoneticAttribute attr = new TextKey1PhoneticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey1PhoneticValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey2Attribute</code> , See {@odf.attribute text:key2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey2Attribute() {
+		TextKey2Attribute attr = (TextKey2Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey2Attribute</code> , See {@odf.attribute text:key2}
+	 *
+	 * @param textKey2Value   The type is <code>String</code>
+	 */
+	public void setTextKey2Attribute(String textKey2Value) {
+		TextKey2Attribute attr = new TextKey2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKey2PhoneticAttribute</code> , See {@odf.attribute text:key2-phonetic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKey2PhoneticAttribute() {
+		TextKey2PhoneticAttribute attr = (TextKey2PhoneticAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key2-phonetic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKey2PhoneticAttribute</code> , See {@odf.attribute text:key2-phonetic}
+	 *
+	 * @param textKey2PhoneticValue   The type is <code>String</code>
+	 */
+	public void setTextKey2PhoneticAttribute(String textKey2PhoneticValue) {
+		TextKey2PhoneticAttribute attr = new TextKey2PhoneticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKey2PhoneticValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMainEntryAttribute</code> , See {@odf.attribute text:main-entry}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextMainEntryAttribute() {
+		TextMainEntryAttribute attr = (TextMainEntryAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "main-entry");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextMainEntryAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMainEntryAttribute</code> , See {@odf.attribute text:main-entry}
+	 *
+	 * @param textMainEntryValue   The type is <code>Boolean</code>
+	 */
+	public void setTextMainEntryAttribute(Boolean textMainEntryValue) {
+		TextMainEntryAttribute attr = new TextMainEntryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textMainEntryValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValuePhoneticAttribute</code> , See {@odf.attribute text:string-value-phonetic}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValuePhoneticAttribute() {
+		TextStringValuePhoneticAttribute attr = (TextStringValuePhoneticAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value-phonetic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValuePhoneticAttribute</code> , See {@odf.attribute text:string-value-phonetic}
+	 *
+	 * @param textStringValuePhoneticValue   The type is <code>String</code>
+	 */
+	public void setTextStringValuePhoneticAttribute(String textStringValuePhoneticValue) {
+		TextStringValuePhoneticAttribute attr = new TextStringValuePhoneticAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValuePhoneticValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexSourceElement.java
new file mode 100644
index 0000000..57b577b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAlphabeticalIndexSourceElement.java
@@ -0,0 +1,497 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAlphabeticalSeparatorsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCapitalizeEntriesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCombineEntriesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCombineEntriesWithDashAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCombineEntriesWithPpAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCommaSeparatedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIgnoreCaseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexScopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMainEntryStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRelativeTabStopPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSortAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseKeysAsEntriesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:alphabetical-index-source}.
+ *
+ */
+public class TextAlphabeticalIndexSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "alphabetical-index-source");
+
+	/**
+	 * Create the instance of <code>TextAlphabeticalIndexSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAlphabeticalIndexSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:alphabetical-index-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoCountryAttribute</code> , See {@odf.attribute fo:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoCountryAttribute() {
+		FoCountryAttribute attr = (FoCountryAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoCountryAttribute</code> , See {@odf.attribute fo:country}
+	 *
+	 * @param foCountryValue   The type is <code>String</code>
+	 */
+	public void setFoCountryAttribute(String foCountryValue) {
+		FoCountryAttribute attr = new FoCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoLanguageAttribute</code> , See {@odf.attribute fo:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoLanguageAttribute() {
+		FoLanguageAttribute attr = (FoLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoLanguageAttribute</code> , See {@odf.attribute fo:language}
+	 *
+	 * @param foLanguageValue   The type is <code>String</code>
+	 */
+	public void setFoLanguageAttribute(String foLanguageValue) {
+		FoLanguageAttribute attr = new FoLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoScriptAttribute</code> , See {@odf.attribute fo:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoScriptAttribute() {
+		FoScriptAttribute attr = (FoScriptAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoScriptAttribute</code> , See {@odf.attribute fo:script}
+	 *
+	 * @param foScriptValue   The type is <code>String</code>
+	 */
+	public void setFoScriptAttribute(String foScriptValue) {
+		FoScriptAttribute attr = new FoScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRfcLanguageTagAttribute</code> , See {@odf.attribute style:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRfcLanguageTagAttribute() {
+		StyleRfcLanguageTagAttribute attr = (StyleRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRfcLanguageTagAttribute</code> , See {@odf.attribute style:rfc-language-tag}
+	 *
+	 * @param styleRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setStyleRfcLanguageTagAttribute(String styleRfcLanguageTagValue) {
+		StyleRfcLanguageTagAttribute attr = new StyleRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAlphabeticalSeparatorsAttribute</code> , See {@odf.attribute text:alphabetical-separators}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextAlphabeticalSeparatorsAttribute() {
+		TextAlphabeticalSeparatorsAttribute attr = (TextAlphabeticalSeparatorsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "alphabetical-separators");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextAlphabeticalSeparatorsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAlphabeticalSeparatorsAttribute</code> , See {@odf.attribute text:alphabetical-separators}
+	 *
+	 * @param textAlphabeticalSeparatorsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextAlphabeticalSeparatorsAttribute(Boolean textAlphabeticalSeparatorsValue) {
+		TextAlphabeticalSeparatorsAttribute attr = new TextAlphabeticalSeparatorsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textAlphabeticalSeparatorsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCapitalizeEntriesAttribute</code> , See {@odf.attribute text:capitalize-entries}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCapitalizeEntriesAttribute() {
+		TextCapitalizeEntriesAttribute attr = (TextCapitalizeEntriesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "capitalize-entries");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCapitalizeEntriesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCapitalizeEntriesAttribute</code> , See {@odf.attribute text:capitalize-entries}
+	 *
+	 * @param textCapitalizeEntriesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCapitalizeEntriesAttribute(Boolean textCapitalizeEntriesValue) {
+		TextCapitalizeEntriesAttribute attr = new TextCapitalizeEntriesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCapitalizeEntriesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCombineEntriesAttribute</code> , See {@odf.attribute text:combine-entries}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCombineEntriesAttribute() {
+		TextCombineEntriesAttribute attr = (TextCombineEntriesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "combine-entries");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCombineEntriesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCombineEntriesAttribute</code> , See {@odf.attribute text:combine-entries}
+	 *
+	 * @param textCombineEntriesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCombineEntriesAttribute(Boolean textCombineEntriesValue) {
+		TextCombineEntriesAttribute attr = new TextCombineEntriesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCombineEntriesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCombineEntriesWithDashAttribute</code> , See {@odf.attribute text:combine-entries-with-dash}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCombineEntriesWithDashAttribute() {
+		TextCombineEntriesWithDashAttribute attr = (TextCombineEntriesWithDashAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "combine-entries-with-dash");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCombineEntriesWithDashAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCombineEntriesWithDashAttribute</code> , See {@odf.attribute text:combine-entries-with-dash}
+	 *
+	 * @param textCombineEntriesWithDashValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCombineEntriesWithDashAttribute(Boolean textCombineEntriesWithDashValue) {
+		TextCombineEntriesWithDashAttribute attr = new TextCombineEntriesWithDashAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCombineEntriesWithDashValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCombineEntriesWithPpAttribute</code> , See {@odf.attribute text:combine-entries-with-pp}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCombineEntriesWithPpAttribute() {
+		TextCombineEntriesWithPpAttribute attr = (TextCombineEntriesWithPpAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "combine-entries-with-pp");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCombineEntriesWithPpAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCombineEntriesWithPpAttribute</code> , See {@odf.attribute text:combine-entries-with-pp}
+	 *
+	 * @param textCombineEntriesWithPpValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCombineEntriesWithPpAttribute(Boolean textCombineEntriesWithPpValue) {
+		TextCombineEntriesWithPpAttribute attr = new TextCombineEntriesWithPpAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCombineEntriesWithPpValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCommaSeparatedAttribute</code> , See {@odf.attribute text:comma-separated}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCommaSeparatedAttribute() {
+		TextCommaSeparatedAttribute attr = (TextCommaSeparatedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "comma-separated");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCommaSeparatedAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCommaSeparatedAttribute</code> , See {@odf.attribute text:comma-separated}
+	 *
+	 * @param textCommaSeparatedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCommaSeparatedAttribute(Boolean textCommaSeparatedValue) {
+		TextCommaSeparatedAttribute attr = new TextCommaSeparatedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCommaSeparatedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIgnoreCaseAttribute</code> , See {@odf.attribute text:ignore-case}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextIgnoreCaseAttribute() {
+		TextIgnoreCaseAttribute attr = (TextIgnoreCaseAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "ignore-case");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextIgnoreCaseAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIgnoreCaseAttribute</code> , See {@odf.attribute text:ignore-case}
+	 *
+	 * @param textIgnoreCaseValue   The type is <code>Boolean</code>
+	 */
+	public void setTextIgnoreCaseAttribute(Boolean textIgnoreCaseValue) {
+		TextIgnoreCaseAttribute attr = new TextIgnoreCaseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textIgnoreCaseValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexScopeAttribute() {
+		TextIndexScopeAttribute attr = (TextIndexScopeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-scope");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextIndexScopeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @param textIndexScopeValue   The type is <code>String</code>
+	 */
+	public void setTextIndexScopeAttribute(String textIndexScopeValue) {
+		TextIndexScopeAttribute attr = new TextIndexScopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexScopeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMainEntryStyleNameAttribute</code> , See {@odf.attribute text:main-entry-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextMainEntryStyleNameAttribute() {
+		TextMainEntryStyleNameAttribute attr = (TextMainEntryStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "main-entry-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMainEntryStyleNameAttribute</code> , See {@odf.attribute text:main-entry-style-name}
+	 *
+	 * @param textMainEntryStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextMainEntryStyleNameAttribute(String textMainEntryStyleNameValue) {
+		TextMainEntryStyleNameAttribute attr = new TextMainEntryStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textMainEntryStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRelativeTabStopPositionAttribute() {
+		TextRelativeTabStopPositionAttribute attr = (TextRelativeTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRelativeTabStopPositionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @param textRelativeTabStopPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRelativeTabStopPositionAttribute(Boolean textRelativeTabStopPositionValue) {
+		TextRelativeTabStopPositionAttribute attr = new TextRelativeTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRelativeTabStopPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSortAlgorithmAttribute</code> , See {@odf.attribute text:sort-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSortAlgorithmAttribute() {
+		TextSortAlgorithmAttribute attr = (TextSortAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "sort-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSortAlgorithmAttribute</code> , See {@odf.attribute text:sort-algorithm}
+	 *
+	 * @param textSortAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextSortAlgorithmAttribute(String textSortAlgorithmValue) {
+		TextSortAlgorithmAttribute attr = new TextSortAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSortAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseKeysAsEntriesAttribute</code> , See {@odf.attribute text:use-keys-as-entries}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseKeysAsEntriesAttribute() {
+		TextUseKeysAsEntriesAttribute attr = (TextUseKeysAsEntriesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-keys-as-entries");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseKeysAsEntriesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseKeysAsEntriesAttribute</code> , See {@odf.attribute text:use-keys-as-entries}
+	 *
+	 * @param textUseKeysAsEntriesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseKeysAsEntriesAttribute(Boolean textUseKeysAsEntriesValue) {
+		TextUseKeysAsEntriesAttribute attr = new TextUseKeysAsEntriesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseKeysAsEntriesValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-entry-template}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:alphabetical-index-entry-template}
+	 */
+	 public TextAlphabeticalIndexEntryTemplateElement newTextAlphabeticalIndexEntryTemplateElement(int textOutlineLevelValue, String textStyleNameValue) {
+		TextAlphabeticalIndexEntryTemplateElement textAlphabeticalIndexEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexEntryTemplateElement.class);
+		textAlphabeticalIndexEntryTemplate.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		textAlphabeticalIndexEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textAlphabeticalIndexEntryTemplate);
+		return textAlphabeticalIndexEntryTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAuthorInitialsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAuthorInitialsElement.java
new file mode 100644
index 0000000..fa40e8e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAuthorInitialsElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:author-initials}.
+ *
+ */
+public class TextAuthorInitialsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "author-initials");
+
+	/**
+	 * Create the instance of <code>TextAuthorInitialsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAuthorInitialsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:author-initials}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAuthorNameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAuthorNameElement.java
new file mode 100644
index 0000000..04086a3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextAuthorNameElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:author-name}.
+ *
+ */
+public class TextAuthorNameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "author-name");
+
+	/**
+	 * Create the instance of <code>TextAuthorNameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextAuthorNameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:author-name}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyConfigurationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyConfigurationElement.java
new file mode 100644
index 0000000..968aa6c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyConfigurationElement.java
@@ -0,0 +1,309 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoScriptAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRfcLanguageTagAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNumberedEntriesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextPrefixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSortAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSortByPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSuffixAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bibliography-configuration}.
+ *
+ */
+public class TextBibliographyConfigurationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography-configuration");
+
+	/**
+	 * Create the instance of <code>TextBibliographyConfigurationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographyConfigurationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bibliography-configuration}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoCountryAttribute</code> , See {@odf.attribute fo:country}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoCountryAttribute() {
+		FoCountryAttribute attr = (FoCountryAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "country");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoCountryAttribute</code> , See {@odf.attribute fo:country}
+	 *
+	 * @param foCountryValue   The type is <code>String</code>
+	 */
+	public void setFoCountryAttribute(String foCountryValue) {
+		FoCountryAttribute attr = new FoCountryAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foCountryValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoLanguageAttribute</code> , See {@odf.attribute fo:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoLanguageAttribute() {
+		FoLanguageAttribute attr = (FoLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoLanguageAttribute</code> , See {@odf.attribute fo:language}
+	 *
+	 * @param foLanguageValue   The type is <code>String</code>
+	 */
+	public void setFoLanguageAttribute(String foLanguageValue) {
+		FoLanguageAttribute attr = new FoLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FoScriptAttribute</code> , See {@odf.attribute fo:script}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getFoScriptAttribute() {
+		FoScriptAttribute attr = (FoScriptAttribute) getOdfAttribute(OdfDocumentNamespace.FO, "script");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FoScriptAttribute</code> , See {@odf.attribute fo:script}
+	 *
+	 * @param foScriptValue   The type is <code>String</code>
+	 */
+	public void setFoScriptAttribute(String foScriptValue) {
+		FoScriptAttribute attr = new FoScriptAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(foScriptValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleRfcLanguageTagAttribute</code> , See {@odf.attribute style:rfc-language-tag}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleRfcLanguageTagAttribute() {
+		StyleRfcLanguageTagAttribute attr = (StyleRfcLanguageTagAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "rfc-language-tag");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleRfcLanguageTagAttribute</code> , See {@odf.attribute style:rfc-language-tag}
+	 *
+	 * @param styleRfcLanguageTagValue   The type is <code>String</code>
+	 */
+	public void setStyleRfcLanguageTagAttribute(String styleRfcLanguageTagValue) {
+		StyleRfcLanguageTagAttribute attr = new StyleRfcLanguageTagAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleRfcLanguageTagValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNumberedEntriesAttribute</code> , See {@odf.attribute text:numbered-entries}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextNumberedEntriesAttribute() {
+		TextNumberedEntriesAttribute attr = (TextNumberedEntriesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "numbered-entries");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextNumberedEntriesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNumberedEntriesAttribute</code> , See {@odf.attribute text:numbered-entries}
+	 *
+	 * @param textNumberedEntriesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextNumberedEntriesAttribute(Boolean textNumberedEntriesValue) {
+		TextNumberedEntriesAttribute attr = new TextNumberedEntriesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textNumberedEntriesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextPrefixAttribute</code> , See {@odf.attribute text:prefix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextPrefixAttribute() {
+		TextPrefixAttribute attr = (TextPrefixAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "prefix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextPrefixAttribute</code> , See {@odf.attribute text:prefix}
+	 *
+	 * @param textPrefixValue   The type is <code>String</code>
+	 */
+	public void setTextPrefixAttribute(String textPrefixValue) {
+		TextPrefixAttribute attr = new TextPrefixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textPrefixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSortAlgorithmAttribute</code> , See {@odf.attribute text:sort-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSortAlgorithmAttribute() {
+		TextSortAlgorithmAttribute attr = (TextSortAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "sort-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSortAlgorithmAttribute</code> , See {@odf.attribute text:sort-algorithm}
+	 *
+	 * @param textSortAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextSortAlgorithmAttribute(String textSortAlgorithmValue) {
+		TextSortAlgorithmAttribute attr = new TextSortAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSortAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSortByPositionAttribute</code> , See {@odf.attribute text:sort-by-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextSortByPositionAttribute() {
+		TextSortByPositionAttribute attr = (TextSortByPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "sort-by-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextSortByPositionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSortByPositionAttribute</code> , See {@odf.attribute text:sort-by-position}
+	 *
+	 * @param textSortByPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextSortByPositionAttribute(Boolean textSortByPositionValue) {
+		TextSortByPositionAttribute attr = new TextSortByPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textSortByPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSuffixAttribute</code> , See {@odf.attribute text:suffix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSuffixAttribute() {
+		TextSuffixAttribute attr = (TextSuffixAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "suffix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSuffixAttribute</code> , See {@odf.attribute text:suffix}
+	 *
+	 * @param textSuffixValue   The type is <code>String</code>
+	 */
+	public void setTextSuffixAttribute(String textSuffixValue) {
+		TextSuffixAttribute attr = new TextSuffixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSuffixValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:sort-key}.
+	 *
+	 * @param textKeyValue  the <code>String</code> value of <code>TextKeyAttribute</code>, see {@odf.attribute  text:key} at specification
+	 * @return the element {@odf.element text:sort-key}
+	 */
+	 public TextSortKeyElement newTextSortKeyElement(String textKeyValue) {
+		TextSortKeyElement textSortKey = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSortKeyElement.class);
+		textSortKey.setTextKeyAttribute(textKeyValue);
+		this.appendChild(textSortKey);
+		return textSortKey;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyElement.java
new file mode 100644
index 0000000..8c6104f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bibliography}.
+ *
+ */
+public class TextBibliographyElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography");
+
+	/**
+	 * Create the instance of <code>TextBibliographyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bibliography}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-source}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:bibliography-source}
+	 */
+	public TextBibliographySourceElement newTextBibliographySourceElement() {
+		TextBibliographySourceElement textBibliographySource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographySourceElement.class);
+		this.appendChild(textBibliographySource);
+		return textBibliographySource;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyEntryTemplateElement.java
new file mode 100644
index 0000000..f2de44f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyEntryTemplateElement.java
@@ -0,0 +1,164 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextBibliographyTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bibliography-entry-template}.
+ *
+ */
+public class TextBibliographyEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography-entry-template");
+
+	/**
+	 * Create the instance of <code>TextBibliographyEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographyEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bibliography-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextBibliographyTypeAttribute</code> , See {@odf.attribute text:bibliography-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextBibliographyTypeAttribute() {
+		TextBibliographyTypeAttribute attr = (TextBibliographyTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "bibliography-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextBibliographyTypeAttribute</code> , See {@odf.attribute text:bibliography-type}
+	 *
+	 * @param textBibliographyTypeValue   The type is <code>String</code>
+	 */
+	public void setTextBibliographyTypeAttribute(String textBibliographyTypeValue) {
+		TextBibliographyTypeAttribute attr = new TextBibliographyTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textBibliographyTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-bibliography}.
+	 *
+	 * @param textBibliographyDataFieldValue  the <code>String</code> value of <code>TextBibliographyDataFieldAttribute</code>, see {@odf.attribute  text:bibliography-data-field} at specification
+	 * @return the element {@odf.element text:index-entry-bibliography}
+	 */
+	 public TextIndexEntryBibliographyElement newTextIndexEntryBibliographyElement(String textBibliographyDataFieldValue) {
+		TextIndexEntryBibliographyElement textIndexEntryBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryBibliographyElement.class);
+		textIndexEntryBibliography.setTextBibliographyDataFieldAttribute(textBibliographyDataFieldValue);
+		this.appendChild(textIndexEntryBibliography);
+		return textIndexEntryBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyMarkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyMarkElement.java
new file mode 100644
index 0000000..3d103d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographyMarkElement.java
@@ -0,0 +1,881 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAddressAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnnoteAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAuthorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextBibliographyTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextBooktitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextChapterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCustom1Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCustom2Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCustom3Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCustom4Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCustom5Attribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextEditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextEditorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextHowpublishedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdentifierAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextInstitutionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIsbnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIssnAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextJournalAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMonthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNoteAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOrganizationsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextPagesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextPublisherAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextReportTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSchoolAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSeriesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTitleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUrlAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextVolumeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextYearAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bibliography-mark}.
+ *
+ */
+public class TextBibliographyMarkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography-mark");
+
+	/**
+	 * Create the instance of <code>TextBibliographyMarkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographyMarkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bibliography-mark}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAddressAttribute</code> , See {@odf.attribute text:address}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAddressAttribute() {
+		TextAddressAttribute attr = (TextAddressAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "address");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAddressAttribute</code> , See {@odf.attribute text:address}
+	 *
+	 * @param textAddressValue   The type is <code>String</code>
+	 */
+	public void setTextAddressAttribute(String textAddressValue) {
+		TextAddressAttribute attr = new TextAddressAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAddressValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAnnoteAttribute</code> , See {@odf.attribute text:annote}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAnnoteAttribute() {
+		TextAnnoteAttribute attr = (TextAnnoteAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "annote");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAnnoteAttribute</code> , See {@odf.attribute text:annote}
+	 *
+	 * @param textAnnoteValue   The type is <code>String</code>
+	 */
+	public void setTextAnnoteAttribute(String textAnnoteValue) {
+		TextAnnoteAttribute attr = new TextAnnoteAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAnnoteValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextAuthorAttribute</code> , See {@odf.attribute text:author}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextAuthorAttribute() {
+		TextAuthorAttribute attr = (TextAuthorAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "author");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextAuthorAttribute</code> , See {@odf.attribute text:author}
+	 *
+	 * @param textAuthorValue   The type is <code>String</code>
+	 */
+	public void setTextAuthorAttribute(String textAuthorValue) {
+		TextAuthorAttribute attr = new TextAuthorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textAuthorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextBibliographyTypeAttribute</code> , See {@odf.attribute text:bibliography-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextBibliographyTypeAttribute() {
+		TextBibliographyTypeAttribute attr = (TextBibliographyTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "bibliography-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextBibliographyTypeAttribute</code> , See {@odf.attribute text:bibliography-type}
+	 *
+	 * @param textBibliographyTypeValue   The type is <code>String</code>
+	 */
+	public void setTextBibliographyTypeAttribute(String textBibliographyTypeValue) {
+		TextBibliographyTypeAttribute attr = new TextBibliographyTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textBibliographyTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextBooktitleAttribute</code> , See {@odf.attribute text:booktitle}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextBooktitleAttribute() {
+		TextBooktitleAttribute attr = (TextBooktitleAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "booktitle");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextBooktitleAttribute</code> , See {@odf.attribute text:booktitle}
+	 *
+	 * @param textBooktitleValue   The type is <code>String</code>
+	 */
+	public void setTextBooktitleAttribute(String textBooktitleValue) {
+		TextBooktitleAttribute attr = new TextBooktitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textBooktitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextChapterAttribute</code> , See {@odf.attribute text:chapter}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextChapterAttribute() {
+		TextChapterAttribute attr = (TextChapterAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "chapter");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextChapterAttribute</code> , See {@odf.attribute text:chapter}
+	 *
+	 * @param textChapterValue   The type is <code>String</code>
+	 */
+	public void setTextChapterAttribute(String textChapterValue) {
+		TextChapterAttribute attr = new TextChapterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textChapterValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCustom1Attribute</code> , See {@odf.attribute text:custom1}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCustom1Attribute() {
+		TextCustom1Attribute attr = (TextCustom1Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "custom1");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCustom1Attribute</code> , See {@odf.attribute text:custom1}
+	 *
+	 * @param textCustom1Value   The type is <code>String</code>
+	 */
+	public void setTextCustom1Attribute(String textCustom1Value) {
+		TextCustom1Attribute attr = new TextCustom1Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCustom1Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCustom2Attribute</code> , See {@odf.attribute text:custom2}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCustom2Attribute() {
+		TextCustom2Attribute attr = (TextCustom2Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "custom2");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCustom2Attribute</code> , See {@odf.attribute text:custom2}
+	 *
+	 * @param textCustom2Value   The type is <code>String</code>
+	 */
+	public void setTextCustom2Attribute(String textCustom2Value) {
+		TextCustom2Attribute attr = new TextCustom2Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCustom2Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCustom3Attribute</code> , See {@odf.attribute text:custom3}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCustom3Attribute() {
+		TextCustom3Attribute attr = (TextCustom3Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "custom3");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCustom3Attribute</code> , See {@odf.attribute text:custom3}
+	 *
+	 * @param textCustom3Value   The type is <code>String</code>
+	 */
+	public void setTextCustom3Attribute(String textCustom3Value) {
+		TextCustom3Attribute attr = new TextCustom3Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCustom3Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCustom4Attribute</code> , See {@odf.attribute text:custom4}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCustom4Attribute() {
+		TextCustom4Attribute attr = (TextCustom4Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "custom4");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCustom4Attribute</code> , See {@odf.attribute text:custom4}
+	 *
+	 * @param textCustom4Value   The type is <code>String</code>
+	 */
+	public void setTextCustom4Attribute(String textCustom4Value) {
+		TextCustom4Attribute attr = new TextCustom4Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCustom4Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCustom5Attribute</code> , See {@odf.attribute text:custom5}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCustom5Attribute() {
+		TextCustom5Attribute attr = (TextCustom5Attribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "custom5");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCustom5Attribute</code> , See {@odf.attribute text:custom5}
+	 *
+	 * @param textCustom5Value   The type is <code>String</code>
+	 */
+	public void setTextCustom5Attribute(String textCustom5Value) {
+		TextCustom5Attribute attr = new TextCustom5Attribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCustom5Value);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextEditionAttribute</code> , See {@odf.attribute text:edition}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextEditionAttribute() {
+		TextEditionAttribute attr = (TextEditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "edition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextEditionAttribute</code> , See {@odf.attribute text:edition}
+	 *
+	 * @param textEditionValue   The type is <code>String</code>
+	 */
+	public void setTextEditionAttribute(String textEditionValue) {
+		TextEditionAttribute attr = new TextEditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textEditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextEditorAttribute</code> , See {@odf.attribute text:editor}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextEditorAttribute() {
+		TextEditorAttribute attr = (TextEditorAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "editor");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextEditorAttribute</code> , See {@odf.attribute text:editor}
+	 *
+	 * @param textEditorValue   The type is <code>String</code>
+	 */
+	public void setTextEditorAttribute(String textEditorValue) {
+		TextEditorAttribute attr = new TextEditorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textEditorValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextHowpublishedAttribute</code> , See {@odf.attribute text:howpublished}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextHowpublishedAttribute() {
+		TextHowpublishedAttribute attr = (TextHowpublishedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "howpublished");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextHowpublishedAttribute</code> , See {@odf.attribute text:howpublished}
+	 *
+	 * @param textHowpublishedValue   The type is <code>String</code>
+	 */
+	public void setTextHowpublishedAttribute(String textHowpublishedValue) {
+		TextHowpublishedAttribute attr = new TextHowpublishedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textHowpublishedValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdentifierAttribute</code> , See {@odf.attribute text:identifier}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdentifierAttribute() {
+		TextIdentifierAttribute attr = (TextIdentifierAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "identifier");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdentifierAttribute</code> , See {@odf.attribute text:identifier}
+	 *
+	 * @param textIdentifierValue   The type is <code>String</code>
+	 */
+	public void setTextIdentifierAttribute(String textIdentifierValue) {
+		TextIdentifierAttribute attr = new TextIdentifierAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdentifierValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextInstitutionAttribute</code> , See {@odf.attribute text:institution}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextInstitutionAttribute() {
+		TextInstitutionAttribute attr = (TextInstitutionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "institution");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextInstitutionAttribute</code> , See {@odf.attribute text:institution}
+	 *
+	 * @param textInstitutionValue   The type is <code>String</code>
+	 */
+	public void setTextInstitutionAttribute(String textInstitutionValue) {
+		TextInstitutionAttribute attr = new TextInstitutionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textInstitutionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIsbnAttribute</code> , See {@odf.attribute text:isbn}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIsbnAttribute() {
+		TextIsbnAttribute attr = (TextIsbnAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "isbn");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIsbnAttribute</code> , See {@odf.attribute text:isbn}
+	 *
+	 * @param textIsbnValue   The type is <code>String</code>
+	 */
+	public void setTextIsbnAttribute(String textIsbnValue) {
+		TextIsbnAttribute attr = new TextIsbnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIsbnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIssnAttribute</code> , See {@odf.attribute text:issn}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIssnAttribute() {
+		TextIssnAttribute attr = (TextIssnAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "issn");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIssnAttribute</code> , See {@odf.attribute text:issn}
+	 *
+	 * @param textIssnValue   The type is <code>String</code>
+	 */
+	public void setTextIssnAttribute(String textIssnValue) {
+		TextIssnAttribute attr = new TextIssnAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIssnValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextJournalAttribute</code> , See {@odf.attribute text:journal}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextJournalAttribute() {
+		TextJournalAttribute attr = (TextJournalAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "journal");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextJournalAttribute</code> , See {@odf.attribute text:journal}
+	 *
+	 * @param textJournalValue   The type is <code>String</code>
+	 */
+	public void setTextJournalAttribute(String textJournalValue) {
+		TextJournalAttribute attr = new TextJournalAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textJournalValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMonthAttribute</code> , See {@odf.attribute text:month}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextMonthAttribute() {
+		TextMonthAttribute attr = (TextMonthAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "month");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMonthAttribute</code> , See {@odf.attribute text:month}
+	 *
+	 * @param textMonthValue   The type is <code>String</code>
+	 */
+	public void setTextMonthAttribute(String textMonthValue) {
+		TextMonthAttribute attr = new TextMonthAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textMonthValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNoteAttribute</code> , See {@odf.attribute text:note}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNoteAttribute() {
+		TextNoteAttribute attr = (TextNoteAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "note");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNoteAttribute</code> , See {@odf.attribute text:note}
+	 *
+	 * @param textNoteValue   The type is <code>String</code>
+	 */
+	public void setTextNoteAttribute(String textNoteValue) {
+		TextNoteAttribute attr = new TextNoteAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNoteValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNumberAttribute</code> , See {@odf.attribute text:number}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNumberAttribute() {
+		TextNumberAttribute attr = (TextNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "number");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNumberAttribute</code> , See {@odf.attribute text:number}
+	 *
+	 * @param textNumberValue   The type is <code>String</code>
+	 */
+	public void setTextNumberAttribute(String textNumberValue) {
+		TextNumberAttribute attr = new TextNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNumberValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOrganizationsAttribute</code> , See {@odf.attribute text:organizations}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextOrganizationsAttribute() {
+		TextOrganizationsAttribute attr = (TextOrganizationsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "organizations");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOrganizationsAttribute</code> , See {@odf.attribute text:organizations}
+	 *
+	 * @param textOrganizationsValue   The type is <code>String</code>
+	 */
+	public void setTextOrganizationsAttribute(String textOrganizationsValue) {
+		TextOrganizationsAttribute attr = new TextOrganizationsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textOrganizationsValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextPagesAttribute</code> , See {@odf.attribute text:pages}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextPagesAttribute() {
+		TextPagesAttribute attr = (TextPagesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "pages");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextPagesAttribute</code> , See {@odf.attribute text:pages}
+	 *
+	 * @param textPagesValue   The type is <code>String</code>
+	 */
+	public void setTextPagesAttribute(String textPagesValue) {
+		TextPagesAttribute attr = new TextPagesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textPagesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextPublisherAttribute</code> , See {@odf.attribute text:publisher}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextPublisherAttribute() {
+		TextPublisherAttribute attr = (TextPublisherAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "publisher");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextPublisherAttribute</code> , See {@odf.attribute text:publisher}
+	 *
+	 * @param textPublisherValue   The type is <code>String</code>
+	 */
+	public void setTextPublisherAttribute(String textPublisherValue) {
+		TextPublisherAttribute attr = new TextPublisherAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textPublisherValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextReportTypeAttribute</code> , See {@odf.attribute text:report-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextReportTypeAttribute() {
+		TextReportTypeAttribute attr = (TextReportTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "report-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextReportTypeAttribute</code> , See {@odf.attribute text:report-type}
+	 *
+	 * @param textReportTypeValue   The type is <code>String</code>
+	 */
+	public void setTextReportTypeAttribute(String textReportTypeValue) {
+		TextReportTypeAttribute attr = new TextReportTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textReportTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSchoolAttribute</code> , See {@odf.attribute text:school}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSchoolAttribute() {
+		TextSchoolAttribute attr = (TextSchoolAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "school");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSchoolAttribute</code> , See {@odf.attribute text:school}
+	 *
+	 * @param textSchoolValue   The type is <code>String</code>
+	 */
+	public void setTextSchoolAttribute(String textSchoolValue) {
+		TextSchoolAttribute attr = new TextSchoolAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSchoolValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSeriesAttribute</code> , See {@odf.attribute text:series}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSeriesAttribute() {
+		TextSeriesAttribute attr = (TextSeriesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "series");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSeriesAttribute</code> , See {@odf.attribute text:series}
+	 *
+	 * @param textSeriesValue   The type is <code>String</code>
+	 */
+	public void setTextSeriesAttribute(String textSeriesValue) {
+		TextSeriesAttribute attr = new TextSeriesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSeriesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTitleAttribute</code> , See {@odf.attribute text:title}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTitleAttribute() {
+		TextTitleAttribute attr = (TextTitleAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "title");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTitleAttribute</code> , See {@odf.attribute text:title}
+	 *
+	 * @param textTitleValue   The type is <code>String</code>
+	 */
+	public void setTextTitleAttribute(String textTitleValue) {
+		TextTitleAttribute attr = new TextTitleAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTitleValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUrlAttribute</code> , See {@odf.attribute text:url}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextUrlAttribute() {
+		TextUrlAttribute attr = (TextUrlAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "url");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUrlAttribute</code> , See {@odf.attribute text:url}
+	 *
+	 * @param textUrlValue   The type is <code>String</code>
+	 */
+	public void setTextUrlAttribute(String textUrlValue) {
+		TextUrlAttribute attr = new TextUrlAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textUrlValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextVolumeAttribute</code> , See {@odf.attribute text:volume}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextVolumeAttribute() {
+		TextVolumeAttribute attr = (TextVolumeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "volume");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextVolumeAttribute</code> , See {@odf.attribute text:volume}
+	 *
+	 * @param textVolumeValue   The type is <code>String</code>
+	 */
+	public void setTextVolumeAttribute(String textVolumeValue) {
+		TextVolumeAttribute attr = new TextVolumeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textVolumeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextYearAttribute</code> , See {@odf.attribute text:year}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextYearAttribute() {
+		TextYearAttribute attr = (TextYearAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "year");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextYearAttribute</code> , See {@odf.attribute text:year}
+	 *
+	 * @param textYearValue   The type is <code>String</code>
+	 */
+	public void setTextYearAttribute(String textYearValue) {
+		TextYearAttribute attr = new TextYearAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textYearValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographySourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographySourceElement.java
new file mode 100644
index 0000000..065fe6d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBibliographySourceElement.java
@@ -0,0 +1,97 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bibliography-source}.
+ *
+ */
+public class TextBibliographySourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bibliography-source");
+
+	/**
+	 * Create the instance of <code>TextBibliographySourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBibliographySourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bibliography-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-entry-template}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:bibliography-entry-template}
+	 */
+	 public TextBibliographyEntryTemplateElement newTextBibliographyEntryTemplateElement(String textBibliographyTypeValue, String textStyleNameValue) {
+		TextBibliographyEntryTemplateElement textBibliographyEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyEntryTemplateElement.class);
+		textBibliographyEntryTemplate.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		textBibliographyEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textBibliographyEntryTemplate);
+		return textBibliographyEntryTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkElement.java
new file mode 100644
index 0000000..6595773
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bookmark}.
+ *
+ */
+public class TextBookmarkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bookmark");
+
+	/**
+	 * Create the instance of <code>TextBookmarkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBookmarkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bookmark}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkEndElement.java
new file mode 100644
index 0000000..ab2fa13
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bookmark-end}.
+ *
+ */
+public class TextBookmarkEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bookmark-end");
+
+	/**
+	 * Create the instance of <code>TextBookmarkEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBookmarkEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bookmark-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkRefElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkRefElement.java
new file mode 100644
index 0000000..cf3ff8b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkRefElement.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRefNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextReferenceFormatAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bookmark-ref}.
+ *
+ */
+public class TextBookmarkRefElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bookmark-ref");
+
+	/**
+	 * Create the instance of <code>TextBookmarkRefElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBookmarkRefElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bookmark-ref}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextRefNameAttribute() {
+		TextRefNameAttribute attr = (TextRefNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "ref-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @param textRefNameValue   The type is <code>String</code>
+	 */
+	public void setTextRefNameAttribute(String textRefNameValue) {
+		TextRefNameAttribute attr = new TextRefNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textRefNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextReferenceFormatAttribute() {
+		TextReferenceFormatAttribute attr = (TextReferenceFormatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "reference-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @param textReferenceFormatValue   The type is <code>String</code>
+	 */
+	public void setTextReferenceFormatAttribute(String textReferenceFormatValue) {
+		TextReferenceFormatAttribute attr = new TextReferenceFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textReferenceFormatValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkStartElement.java
new file mode 100644
index 0000000..fefd83b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextBookmarkStartElement.java
@@ -0,0 +1,232 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlAboutAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlDatatypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlPropertyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:bookmark-start}.
+ *
+ */
+public class TextBookmarkStartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "bookmark-start");
+
+	/**
+	 * Create the instance of <code>TextBookmarkStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextBookmarkStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:bookmark-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlAboutAttribute() {
+		XhtmlAboutAttribute attr = (XhtmlAboutAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "about");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @param xhtmlAboutValue   The type is <code>String</code>
+	 */
+	public void setXhtmlAboutAttribute(String xhtmlAboutValue) {
+		XhtmlAboutAttribute attr = new XhtmlAboutAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlAboutValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlContentAttribute() {
+		XhtmlContentAttribute attr = (XhtmlContentAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "content");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @param xhtmlContentValue   The type is <code>String</code>
+	 */
+	public void setXhtmlContentAttribute(String xhtmlContentValue) {
+		XhtmlContentAttribute attr = new XhtmlContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlContentValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlDatatypeAttribute() {
+		XhtmlDatatypeAttribute attr = (XhtmlDatatypeAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "datatype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @param xhtmlDatatypeValue   The type is <code>String</code>
+	 */
+	public void setXhtmlDatatypeAttribute(String xhtmlDatatypeValue) {
+		XhtmlDatatypeAttribute attr = new XhtmlDatatypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlDatatypeValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlPropertyAttribute() {
+		XhtmlPropertyAttribute attr = (XhtmlPropertyAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "property");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @param xhtmlPropertyValue   The type is <code>String</code>
+	 */
+	public void setXhtmlPropertyAttribute(String xhtmlPropertyValue) {
+		XhtmlPropertyAttribute attr = new XhtmlPropertyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlPropertyValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+	/**
+	* Set text content. Only elements which are allowed to have text content offer this method.
+	*/
+	public void setTextContent(String content){
+		super.setTextContent(content);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+	
+	protected void onRemoveNode() {
+		super.onRemoveNode();
+		((OdfFileDom) this.ownerDocument).getInContentMetadataCache().remove(this);
+	}
+
+	protected void onInsertNode() {
+		super.onInsertNode();
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeElement.java
new file mode 100644
index 0000000..5e684f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextChangeIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:change}.
+ *
+ */
+public class TextChangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "change");
+
+	/**
+	 * Create the instance of <code>TextChangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextChangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:change}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextChangeIdAttribute</code> , See {@odf.attribute text:change-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextChangeIdAttribute() {
+		TextChangeIdAttribute attr = (TextChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextChangeIdAttribute</code> , See {@odf.attribute text:change-id}
+	 *
+	 * @param textChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTextChangeIdAttribute(String textChangeIdValue) {
+		TextChangeIdAttribute attr = new TextChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textChangeIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeEndElement.java
new file mode 100644
index 0000000..2461756
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextChangeIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:change-end}.
+ *
+ */
+public class TextChangeEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "change-end");
+
+	/**
+	 * Create the instance of <code>TextChangeEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextChangeEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:change-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextChangeIdAttribute</code> , See {@odf.attribute text:change-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextChangeIdAttribute() {
+		TextChangeIdAttribute attr = (TextChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextChangeIdAttribute</code> , See {@odf.attribute text:change-id}
+	 *
+	 * @param textChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTextChangeIdAttribute(String textChangeIdValue) {
+		TextChangeIdAttribute attr = new TextChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textChangeIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeStartElement.java
new file mode 100644
index 0000000..ea62837
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangeStartElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextChangeIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:change-start}.
+ *
+ */
+public class TextChangeStartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "change-start");
+
+	/**
+	 * Create the instance of <code>TextChangeStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextChangeStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:change-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextChangeIdAttribute</code> , See {@odf.attribute text:change-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextChangeIdAttribute() {
+		TextChangeIdAttribute attr = (TextChangeIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "change-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextChangeIdAttribute</code> , See {@odf.attribute text:change-id}
+	 *
+	 * @param textChangeIdValue   The type is <code>String</code>
+	 */
+	public void setTextChangeIdAttribute(String textChangeIdValue) {
+		TextChangeIdAttribute attr = new TextChangeIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textChangeIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangedRegionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangedRegionElement.java
new file mode 100644
index 0000000..5828dc6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChangedRegionElement.java
@@ -0,0 +1,156 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:changed-region}.
+ *
+ */
+public class TextChangedRegionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "changed-region");
+
+	/**
+	 * Create the instance of <code>TextChangedRegionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextChangedRegionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:changed-region}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:deletion}.
+	 *
+	 * @return the element {@odf.element text:deletion}
+	 */
+	public TextDeletionElement newTextDeletionElement() {
+		TextDeletionElement textDeletion = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDeletionElement.class);
+		this.appendChild(textDeletion);
+		return textDeletion;
+	}
+
+	/**
+	 * Create child element {@odf.element text:format-change}.
+	 *
+	 * @return the element {@odf.element text:format-change}
+	 */
+	public TextFormatChangeElement newTextFormatChangeElement() {
+		TextFormatChangeElement textFormatChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFormatChangeElement.class);
+		this.appendChild(textFormatChange);
+		return textFormatChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:insertion}.
+	 *
+	 * @return the element {@odf.element text:insertion}
+	 */
+	public TextInsertionElement newTextInsertionElement() {
+		TextInsertionElement textInsertion = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInsertionElement.class);
+		this.appendChild(textInsertion);
+		return textInsertion;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChapterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChapterElement.java
new file mode 100644
index 0000000..d9c5155
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextChapterElement.java
@@ -0,0 +1,133 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:chapter}.
+ *
+ */
+public class TextChapterElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "chapter");
+
+	/**
+	 * Create the instance of <code>TextChapterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextChapterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:chapter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCharacterCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCharacterCountElement.java
new file mode 100644
index 0000000..3674747
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCharacterCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:character-count}.
+ *
+ */
+public class TextCharacterCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "character-count");
+
+	/**
+	 * Create the instance of <code>TextCharacterCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextCharacterCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:character-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextConditionalTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextConditionalTextElement.java
new file mode 100644
index 0000000..7bcddc1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextConditionalTextElement.java
@@ -0,0 +1,185 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCurrentValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueIfFalseAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueIfTrueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:conditional-text}.
+ *
+ */
+public class TextConditionalTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "conditional-text");
+
+	/**
+	 * Create the instance of <code>TextConditionalTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextConditionalTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:conditional-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCurrentValueAttribute</code> , See {@odf.attribute text:current-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCurrentValueAttribute() {
+		TextCurrentValueAttribute attr = (TextCurrentValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "current-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCurrentValueAttribute</code> , See {@odf.attribute text:current-value}
+	 *
+	 * @param textCurrentValueValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCurrentValueAttribute(Boolean textCurrentValueValue) {
+		TextCurrentValueAttribute attr = new TextCurrentValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCurrentValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueIfFalseAttribute</code> , See {@odf.attribute text:string-value-if-false}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueIfFalseAttribute() {
+		TextStringValueIfFalseAttribute attr = (TextStringValueIfFalseAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value-if-false");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueIfFalseAttribute</code> , See {@odf.attribute text:string-value-if-false}
+	 *
+	 * @param textStringValueIfFalseValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueIfFalseAttribute(String textStringValueIfFalseValue) {
+		TextStringValueIfFalseAttribute attr = new TextStringValueIfFalseAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueIfFalseValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueIfTrueAttribute</code> , See {@odf.attribute text:string-value-if-true}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueIfTrueAttribute() {
+		TextStringValueIfTrueAttribute attr = (TextStringValueIfTrueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value-if-true");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueIfTrueAttribute</code> , See {@odf.attribute text:string-value-if-true}
+	 *
+	 * @param textStringValueIfTrueValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueIfTrueAttribute(String textStringValueIfTrueValue) {
+		TextStringValueIfTrueAttribute attr = new TextStringValueIfTrueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueIfTrueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreationDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreationDateElement.java
new file mode 100644
index 0000000..73e9e92
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreationDateElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:creation-date}.
+ *
+ */
+public class TextCreationDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "creation-date");
+
+	/**
+	 * Create the instance of <code>TextCreationDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextCreationDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:creation-date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDateValueAttribute() {
+		TextDateValueAttribute attr = (TextDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @param textDateValueValue   The type is <code>String</code>
+	 */
+	public void setTextDateValueAttribute(String textDateValueValue) {
+		TextDateValueAttribute attr = new TextDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreationTimeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreationTimeElement.java
new file mode 100644
index 0000000..5ccb1dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreationTimeElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTimeValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:creation-time}.
+ *
+ */
+public class TextCreationTimeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "creation-time");
+
+	/**
+	 * Create the instance of <code>TextCreationTimeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextCreationTimeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:creation-time}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTimeValueAttribute() {
+		TextTimeValueAttribute attr = (TextTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @param textTimeValueValue   The type is <code>String</code>
+	 */
+	public void setTextTimeValueAttribute(String textTimeValueValue) {
+		TextTimeValueAttribute attr = new TextTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTimeValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreatorElement.java
new file mode 100644
index 0000000..0705759
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextCreatorElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:creator}.
+ *
+ */
+public class TextCreatorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "creator");
+
+	/**
+	 * Create the instance of <code>TextCreatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextCreatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:creator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseDisplayElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseDisplayElement.java
new file mode 100644
index 0000000..e00107d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseDisplayElement.java
@@ -0,0 +1,222 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.form.FormConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextColumnNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:database-display}.
+ *
+ */
+public class TextDatabaseDisplayElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "database-display");
+
+	/**
+	 * Create the instance of <code>TextDatabaseDisplayElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDatabaseDisplayElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:database-display}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextColumnNameAttribute</code> , See {@odf.attribute text:column-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextColumnNameAttribute() {
+		TextColumnNameAttribute attr = (TextColumnNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "column-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextColumnNameAttribute</code> , See {@odf.attribute text:column-name}
+	 *
+	 * @param textColumnNameValue   The type is <code>String</code>
+	 */
+	public void setTextColumnNameAttribute(String textColumnNameValue) {
+		TextColumnNameAttribute attr = new TextColumnNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textColumnNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDatabaseNameAttribute() {
+		TextDatabaseNameAttribute attr = (TextDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @param textDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTextDatabaseNameAttribute(String textDatabaseNameValue) {
+		TextDatabaseNameAttribute attr = new TextDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableNameAttribute() {
+		TextTableNameAttribute attr = (TextTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * @param textTableNameValue   The type is <code>String</code>
+	 */
+	public void setTextTableNameAttribute(String textTableNameValue) {
+		TextTableNameAttribute attr = new TextTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableTypeAttribute() {
+		TextTableTypeAttribute attr = (TextTableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @param textTableTypeValue   The type is <code>String</code>
+	 */
+	public void setTextTableTypeAttribute(String textTableTypeValue) {
+		TextTableTypeAttribute attr = new TextTableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @return the element {@odf.element form:connection-resource}
+	 */
+	 public FormConnectionResourceElement newFormConnectionResourceElement(String xlinkHrefValue) {
+		FormConnectionResourceElement formConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(FormConnectionResourceElement.class);
+		formConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(formConnectionResource);
+		return formConnectionResource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseNameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseNameElement.java
new file mode 100644
index 0000000..705a246
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseNameElement.java
@@ -0,0 +1,170 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.form.FormConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:database-name}.
+ *
+ */
+public class TextDatabaseNameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "database-name");
+
+	/**
+	 * Create the instance of <code>TextDatabaseNameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDatabaseNameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:database-name}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDatabaseNameAttribute() {
+		TextDatabaseNameAttribute attr = (TextDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @param textDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTextDatabaseNameAttribute(String textDatabaseNameValue) {
+		TextDatabaseNameAttribute attr = new TextDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableNameAttribute() {
+		TextTableNameAttribute attr = (TextTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * @param textTableNameValue   The type is <code>String</code>
+	 */
+	public void setTextTableNameAttribute(String textTableNameValue) {
+		TextTableNameAttribute attr = new TextTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableTypeAttribute() {
+		TextTableTypeAttribute attr = (TextTableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @param textTableTypeValue   The type is <code>String</code>
+	 */
+	public void setTextTableTypeAttribute(String textTableTypeValue) {
+		TextTableTypeAttribute attr = new TextTableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @return the element {@odf.element form:connection-resource}
+	 */
+	 public FormConnectionResourceElement newFormConnectionResourceElement(String xlinkHrefValue) {
+		FormConnectionResourceElement formConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(FormConnectionResourceElement.class);
+		formConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(formConnectionResource);
+		return formConnectionResource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseNextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseNextElement.java
new file mode 100644
index 0000000..76a6d06
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseNextElement.java
@@ -0,0 +1,187 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.form.FormConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:database-next}.
+ *
+ */
+public class TextDatabaseNextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "database-next");
+
+	/**
+	 * Create the instance of <code>TextDatabaseNextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDatabaseNextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:database-next}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDatabaseNameAttribute() {
+		TextDatabaseNameAttribute attr = (TextDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @param textDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTextDatabaseNameAttribute(String textDatabaseNameValue) {
+		TextDatabaseNameAttribute attr = new TextDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableNameAttribute() {
+		TextTableNameAttribute attr = (TextTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * @param textTableNameValue   The type is <code>String</code>
+	 */
+	public void setTextTableNameAttribute(String textTableNameValue) {
+		TextTableNameAttribute attr = new TextTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableTypeAttribute() {
+		TextTableTypeAttribute attr = (TextTableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @param textTableTypeValue   The type is <code>String</code>
+	 */
+	public void setTextTableTypeAttribute(String textTableTypeValue) {
+		TextTableTypeAttribute attr = new TextTableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @return the element {@odf.element form:connection-resource}
+	 */
+	 public FormConnectionResourceElement newFormConnectionResourceElement(String xlinkHrefValue) {
+		FormConnectionResourceElement formConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(FormConnectionResourceElement.class);
+		formConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(formConnectionResource);
+		return formConnectionResource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseRowNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseRowNumberElement.java
new file mode 100644
index 0000000..ffe0d11
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseRowNumberElement.java
@@ -0,0 +1,247 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.form.FormConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:database-row-number}.
+ *
+ */
+public class TextDatabaseRowNumberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "database-row-number");
+
+	/**
+	 * Create the instance of <code>TextDatabaseRowNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDatabaseRowNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:database-row-number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDatabaseNameAttribute() {
+		TextDatabaseNameAttribute attr = (TextDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @param textDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTextDatabaseNameAttribute(String textDatabaseNameValue) {
+		TextDatabaseNameAttribute attr = new TextDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableNameAttribute() {
+		TextTableNameAttribute attr = (TextTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * @param textTableNameValue   The type is <code>String</code>
+	 */
+	public void setTextTableNameAttribute(String textTableNameValue) {
+		TextTableNameAttribute attr = new TextTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableTypeAttribute() {
+		TextTableTypeAttribute attr = (TextTableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @param textTableTypeValue   The type is <code>String</code>
+	 */
+	public void setTextTableTypeAttribute(String textTableTypeValue) {
+		TextTableTypeAttribute attr = new TextTableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextValueAttribute</code> , See {@odf.attribute text:value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextValueAttribute() {
+		TextValueAttribute attr = (TextValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextValueAttribute</code> , See {@odf.attribute text:value}
+	 *
+	 * @param textValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextValueAttribute(Integer textValueValue) {
+		TextValueAttribute attr = new TextValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textValueValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element form:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @return the element {@odf.element form:connection-resource}
+	 */
+	 public FormConnectionResourceElement newFormConnectionResourceElement(String xlinkHrefValue) {
+		FormConnectionResourceElement formConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(FormConnectionResourceElement.class);
+		formConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(formConnectionResource);
+		return formConnectionResource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseRowSelectElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseRowSelectElement.java
new file mode 100644
index 0000000..81d314e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDatabaseRowSelectElement.java
@@ -0,0 +1,212 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.form.FormConnectionResourceElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDatabaseNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRowNumberAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTableTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:database-row-select}.
+ *
+ */
+public class TextDatabaseRowSelectElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "database-row-select");
+
+	/**
+	 * Create the instance of <code>TextDatabaseRowSelectElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDatabaseRowSelectElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:database-row-select}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDatabaseNameAttribute() {
+		TextDatabaseNameAttribute attr = (TextDatabaseNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "database-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDatabaseNameAttribute</code> , See {@odf.attribute text:database-name}
+	 *
+	 * @param textDatabaseNameValue   The type is <code>String</code>
+	 */
+	public void setTextDatabaseNameAttribute(String textDatabaseNameValue) {
+		TextDatabaseNameAttribute attr = new TextDatabaseNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDatabaseNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRowNumberAttribute</code> , See {@odf.attribute text:row-number}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextRowNumberAttribute() {
+		TextRowNumberAttribute attr = (TextRowNumberAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "row-number");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRowNumberAttribute</code> , See {@odf.attribute text:row-number}
+	 *
+	 * @param textRowNumberValue   The type is <code>Integer</code>
+	 */
+	public void setTextRowNumberAttribute(Integer textRowNumberValue) {
+		TextRowNumberAttribute attr = new TextRowNumberAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textRowNumberValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableNameAttribute() {
+		TextTableNameAttribute attr = (TextTableNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableNameAttribute</code> , See {@odf.attribute text:table-name}
+	 *
+	 * @param textTableNameValue   The type is <code>String</code>
+	 */
+	public void setTextTableNameAttribute(String textTableNameValue) {
+		TextTableNameAttribute attr = new TextTableNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTableTypeAttribute() {
+		TextTableTypeAttribute attr = (TextTableTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "table-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTableTypeAttribute</code> , See {@odf.attribute text:table-type}
+	 *
+	 * @param textTableTypeValue   The type is <code>String</code>
+	 */
+	public void setTextTableTypeAttribute(String textTableTypeValue) {
+		TextTableTypeAttribute attr = new TextTableTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTableTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element form:connection-resource}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @return the element {@odf.element form:connection-resource}
+	 */
+	 public FormConnectionResourceElement newFormConnectionResourceElement(String xlinkHrefValue) {
+		FormConnectionResourceElement formConnectionResource = ((OdfFileDom) this.ownerDocument).newOdfElement(FormConnectionResourceElement.class);
+		formConnectionResource.setXlinkHrefAttribute(xlinkHrefValue);
+		this.appendChild(formConnectionResource);
+		return formConnectionResource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDateElement.java
new file mode 100644
index 0000000..020eb03
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDateElement.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDateAdjustAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:date}.
+ *
+ */
+public class TextDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "date");
+
+	/**
+	 * Create the instance of <code>TextDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDateAdjustAttribute</code> , See {@odf.attribute text:date-adjust}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDateAdjustAttribute() {
+		TextDateAdjustAttribute attr = (TextDateAdjustAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "date-adjust");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDateAdjustAttribute</code> , See {@odf.attribute text:date-adjust}
+	 *
+	 * @param textDateAdjustValue   The type is <code>String</code>
+	 */
+	public void setTextDateAdjustAttribute(String textDateAdjustValue) {
+		TextDateAdjustAttribute attr = new TextDateAdjustAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDateAdjustValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDateValueAttribute() {
+		TextDateValueAttribute attr = (TextDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @param textDateValueValue   The type is <code>String</code>
+	 */
+	public void setTextDateValueAttribute(String textDateValueValue) {
+		TextDateValueAttribute attr = new TextDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionDeclElement.java
new file mode 100644
index 0000000..837d80c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionDeclElement.java
@@ -0,0 +1,204 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeAutomaticUpdateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDdeApplicationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDdeItemAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDdeTopicAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:dde-connection-decl}.
+ *
+ */
+public class TextDdeConnectionDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "dde-connection-decl");
+
+	/**
+	 * Create the instance of <code>TextDdeConnectionDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDdeConnectionDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:dde-connection-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeAutomaticUpdateAttribute</code> , See {@odf.attribute office:automatic-update}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeAutomaticUpdateAttribute() {
+		OfficeAutomaticUpdateAttribute attr = (OfficeAutomaticUpdateAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "automatic-update");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(OfficeAutomaticUpdateAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeAutomaticUpdateAttribute</code> , See {@odf.attribute office:automatic-update}
+	 *
+	 * @param officeAutomaticUpdateValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeAutomaticUpdateAttribute(Boolean officeAutomaticUpdateValue) {
+		OfficeAutomaticUpdateAttribute attr = new OfficeAutomaticUpdateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeAutomaticUpdateValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDdeApplicationAttribute</code> , See {@odf.attribute office:dde-application}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDdeApplicationAttribute() {
+		OfficeDdeApplicationAttribute attr = (OfficeDdeApplicationAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "dde-application");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDdeApplicationAttribute</code> , See {@odf.attribute office:dde-application}
+	 *
+	 * @param officeDdeApplicationValue   The type is <code>String</code>
+	 */
+	public void setOfficeDdeApplicationAttribute(String officeDdeApplicationValue) {
+		OfficeDdeApplicationAttribute attr = new OfficeDdeApplicationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDdeApplicationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDdeItemAttribute</code> , See {@odf.attribute office:dde-item}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDdeItemAttribute() {
+		OfficeDdeItemAttribute attr = (OfficeDdeItemAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "dde-item");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDdeItemAttribute</code> , See {@odf.attribute office:dde-item}
+	 *
+	 * @param officeDdeItemValue   The type is <code>String</code>
+	 */
+	public void setOfficeDdeItemAttribute(String officeDdeItemValue) {
+		OfficeDdeItemAttribute attr = new OfficeDdeItemAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDdeItemValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDdeTopicAttribute</code> , See {@odf.attribute office:dde-topic}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDdeTopicAttribute() {
+		OfficeDdeTopicAttribute attr = (OfficeDdeTopicAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "dde-topic");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDdeTopicAttribute</code> , See {@odf.attribute office:dde-topic}
+	 *
+	 * @param officeDdeTopicValue   The type is <code>String</code>
+	 */
+	public void setOfficeDdeTopicAttribute(String officeDdeTopicValue) {
+		OfficeDdeTopicAttribute attr = new OfficeDdeTopicAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDdeTopicValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeNameAttribute() {
+		OfficeNameAttribute attr = (OfficeNameAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeNameAttribute</code> , See {@odf.attribute office:name}
+	 *
+	 * @param officeNameValue   The type is <code>String</code>
+	 */
+	public void setOfficeNameAttribute(String officeNameValue) {
+		OfficeNameAttribute attr = new OfficeNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionDeclsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionDeclsElement.java
new file mode 100644
index 0000000..b498124
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionDeclsElement.java
@@ -0,0 +1,90 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:dde-connection-decls}.
+ *
+ */
+public class TextDdeConnectionDeclsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "dde-connection-decls");
+
+	/**
+	 * Create the instance of <code>TextDdeConnectionDeclsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDdeConnectionDeclsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:dde-connection-decls}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection-decl}.
+	 *
+	 * @param officeDdeApplicationValue  the <code>String</code> value of <code>OfficeDdeApplicationAttribute</code>, see {@odf.attribute  office:dde-application} at specification
+	 * @param officeDdeItemValue  the <code>String</code> value of <code>OfficeDdeItemAttribute</code>, see {@odf.attribute  office:dde-item} at specification
+	 * @param officeDdeTopicValue  the <code>String</code> value of <code>OfficeDdeTopicAttribute</code>, see {@odf.attribute  office:dde-topic} at specification
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * @return the element {@odf.element text:dde-connection-decl}
+	 */
+	 public TextDdeConnectionDeclElement newTextDdeConnectionDeclElement(String officeDdeApplicationValue, String officeDdeItemValue, String officeDdeTopicValue, String officeNameValue) {
+		TextDdeConnectionDeclElement textDdeConnectionDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionDeclElement.class);
+		textDdeConnectionDecl.setOfficeDdeApplicationAttribute(officeDdeApplicationValue);
+		textDdeConnectionDecl.setOfficeDdeItemAttribute(officeDdeItemValue);
+		textDdeConnectionDecl.setOfficeDdeTopicAttribute(officeDdeTopicValue);
+		textDdeConnectionDecl.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(textDdeConnectionDecl);
+		return textDdeConnectionDecl;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionElement.java
new file mode 100644
index 0000000..943cc27
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDdeConnectionElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConnectionNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:dde-connection}.
+ *
+ */
+public class TextDdeConnectionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "dde-connection");
+
+	/**
+	 * Create the instance of <code>TextDdeConnectionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDdeConnectionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:dde-connection}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConnectionNameAttribute</code> , See {@odf.attribute text:connection-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConnectionNameAttribute() {
+		TextConnectionNameAttribute attr = (TextConnectionNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "connection-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConnectionNameAttribute</code> , See {@odf.attribute text:connection-name}
+	 *
+	 * @param textConnectionNameValue   The type is <code>String</code>
+	 */
+	public void setTextConnectionNameAttribute(String textConnectionNameValue) {
+		TextConnectionNameAttribute attr = new TextConnectionNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConnectionNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDeletionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDeletionElement.java
new file mode 100644
index 0000000..f37197a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDeletionElement.java
@@ -0,0 +1,557 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:deletion}.
+ *
+ */
+public class TextDeletionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "deletion");
+
+	/**
+	 * Create the instance of <code>TextDeletionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDeletionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:deletion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDescriptionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDescriptionElement.java
new file mode 100644
index 0000000..e4bff60
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextDescriptionElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:description}.
+ *
+ */
+public class TextDescriptionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "description");
+
+	/**
+	 * Create the instance of <code>TextDescriptionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextDescriptionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:description}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextEditingCyclesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextEditingCyclesElement.java
new file mode 100644
index 0000000..c800265
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextEditingCyclesElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:editing-cycles}.
+ *
+ */
+public class TextEditingCyclesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "editing-cycles");
+
+	/**
+	 * Create the instance of <code>TextEditingCyclesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextEditingCyclesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:editing-cycles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextEditingDurationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextEditingDurationElement.java
new file mode 100644
index 0000000..35f5f0c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextEditingDurationElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDurationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:editing-duration}.
+ *
+ */
+public class TextEditingDurationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "editing-duration");
+
+	/**
+	 * Create the instance of <code>TextEditingDurationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextEditingDurationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:editing-duration}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDurationAttribute</code> , See {@odf.attribute text:duration}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDurationAttribute() {
+		TextDurationAttribute attr = (TextDurationAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "duration");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDurationAttribute</code> , See {@odf.attribute text:duration}
+	 *
+	 * @param textDurationValue   The type is <code>String</code>
+	 */
+	public void setTextDurationAttribute(String textDurationValue) {
+		TextDurationAttribute attr = new TextDurationAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDurationValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextExecuteMacroElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextExecuteMacroElement.java
new file mode 100644
index 0000000..91aa41c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextExecuteMacroElement.java
@@ -0,0 +1,116 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeEventListenersElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:execute-macro}.
+ *
+ */
+public class TextExecuteMacroElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "execute-macro");
+
+	/**
+	 * Create the instance of <code>TextExecuteMacroElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextExecuteMacroElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:execute-macro}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:event-listeners}.
+	 *
+	 * @return the element {@odf.element office:event-listeners}
+	 */
+	public OfficeEventListenersElement newOfficeEventListenersElement() {
+		OfficeEventListenersElement officeEventListeners = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeEventListenersElement.class);
+		this.appendChild(officeEventListeners);
+		return officeEventListeners;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextExpressionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextExpressionElement.java
new file mode 100644
index 0000000..c009e85
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextExpressionElement.java
@@ -0,0 +1,333 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFormulaAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:expression}.
+ *
+ */
+public class TextExpressionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "expression");
+
+	/**
+	 * Create the instance of <code>TextExpressionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextExpressionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:expression}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFormulaAttribute() {
+		TextFormulaAttribute attr = (TextFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @param textFormulaValue   The type is <code>String</code>
+	 */
+	public void setTextFormulaAttribute(String textFormulaValue) {
+		TextFormulaAttribute attr = new TextFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFormulaValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextFileNameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextFileNameElement.java
new file mode 100644
index 0000000..9ae6f81
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextFileNameElement.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:file-name}.
+ *
+ */
+public class TextFileNameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "file-name");
+
+	/**
+	 * Create the instance of <code>TextFileNameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextFileNameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:file-name}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextFormatChangeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextFormatChangeElement.java
new file mode 100644
index 0000000..b76b0c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextFormatChangeElement.java
@@ -0,0 +1,85 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:format-change}.
+ *
+ */
+public class TextFormatChangeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "format-change");
+
+	/**
+	 * Create the instance of <code>TextFormatChangeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextFormatChangeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:format-change}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHElement.java
new file mode 100644
index 0000000..a72296d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHElement.java
@@ -0,0 +1,1807 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIsListHeaderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRestartNumberingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:h}.
+ *
+ */
+public class TextHElement extends TextParagraphElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "h");
+
+	/**
+	 * Create the instance of <code>TextHElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextHElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:h}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIsListHeaderAttribute</code> , See {@odf.attribute text:is-list-header}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextIsListHeaderAttribute() {
+		TextIsListHeaderAttribute attr = (TextIsListHeaderAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "is-list-header");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextIsListHeaderAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIsListHeaderAttribute</code> , See {@odf.attribute text:is-list-header}
+	 *
+	 * @param textIsListHeaderValue   The type is <code>Boolean</code>
+	 */
+	public void setTextIsListHeaderAttribute(Boolean textIsListHeaderValue) {
+		TextIsListHeaderAttribute attr = new TextIsListHeaderAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textIsListHeaderValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRestartNumberingAttribute</code> , See {@odf.attribute text:restart-numbering}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRestartNumberingAttribute() {
+		TextRestartNumberingAttribute attr = (TextRestartNumberingAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "restart-numbering");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRestartNumberingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRestartNumberingAttribute</code> , See {@odf.attribute text:restart-numbering}
+	 *
+	 * @param textRestartNumberingValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRestartNumberingAttribute(Boolean textRestartNumberingValue) {
+		TextRestartNumberingAttribute attr = new TextRestartNumberingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRestartNumberingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextStartValueAttribute() {
+		TextStartValueAttribute attr = (TextStartValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @param textStartValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextStartValueAttribute(Integer textStartValueValue) {
+		TextStartValueAttribute attr = new TextStartValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textStartValueValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:a}
+	 */
+	 public TextAElement newTextAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAElement textA = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAElement.class);
+		textA.setXlinkHrefAttribute(xlinkHrefValue);
+		textA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textA);
+		return textA;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:number}.
+	 *
+	 * @return the element {@odf.element text:number}
+	 */
+	public TextNumberElement newTextNumberElement() {
+		TextNumberElement textNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberElement.class);
+		this.appendChild(textNumber);
+		return textNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHiddenParagraphElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHiddenParagraphElement.java
new file mode 100644
index 0000000..910ded1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHiddenParagraphElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIsHiddenAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:hidden-paragraph}.
+ *
+ */
+public class TextHiddenParagraphElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "hidden-paragraph");
+
+	/**
+	 * Create the instance of <code>TextHiddenParagraphElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextHiddenParagraphElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:hidden-paragraph}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIsHiddenAttribute</code> , See {@odf.attribute text:is-hidden}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextIsHiddenAttribute() {
+		TextIsHiddenAttribute attr = (TextIsHiddenAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "is-hidden");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIsHiddenAttribute</code> , See {@odf.attribute text:is-hidden}
+	 *
+	 * @param textIsHiddenValue   The type is <code>Boolean</code>
+	 */
+	public void setTextIsHiddenAttribute(Boolean textIsHiddenValue) {
+		TextIsHiddenAttribute attr = new TextIsHiddenAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textIsHiddenValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHiddenTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHiddenTextElement.java
new file mode 100644
index 0000000..dc845ba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextHiddenTextElement.java
@@ -0,0 +1,158 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIsHiddenAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:hidden-text}.
+ *
+ */
+public class TextHiddenTextElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "hidden-text");
+
+	/**
+	 * Create the instance of <code>TextHiddenTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextHiddenTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:hidden-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIsHiddenAttribute</code> , See {@odf.attribute text:is-hidden}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextIsHiddenAttribute() {
+		TextIsHiddenAttribute attr = (TextIsHiddenAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "is-hidden");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIsHiddenAttribute</code> , See {@odf.attribute text:is-hidden}
+	 *
+	 * @param textIsHiddenValue   The type is <code>Boolean</code>
+	 */
+	public void setTextIsHiddenAttribute(Boolean textIsHiddenValue) {
+		TextIsHiddenAttribute attr = new TextIsHiddenAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textIsHiddenValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueAttribute() {
+		TextStringValueAttribute attr = (TextStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * @param textStringValueValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueAttribute(String textStringValueValue) {
+		TextStringValueAttribute attr = new TextStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexElement.java
new file mode 100644
index 0000000..b48885e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:illustration-index}.
+ *
+ */
+public class TextIllustrationIndexElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "illustration-index");
+
+	/**
+	 * Create the instance of <code>TextIllustrationIndexElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIllustrationIndexElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:illustration-index}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index-source}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:illustration-index-source}
+	 */
+	public TextIllustrationIndexSourceElement newTextIllustrationIndexSourceElement() {
+		TextIllustrationIndexSourceElement textIllustrationIndexSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexSourceElement.class);
+		this.appendChild(textIllustrationIndexSource);
+		return textIllustrationIndexSource;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexEntryTemplateElement.java
new file mode 100644
index 0000000..19d65b4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexEntryTemplateElement.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:illustration-index-entry-template}.
+ *
+ */
+public class TextIllustrationIndexEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "illustration-index-entry-template");
+
+	/**
+	 * Create the instance of <code>TextIllustrationIndexEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIllustrationIndexEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:illustration-index-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-chapter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:index-entry-chapter}
+	 */
+	public TextIndexEntryChapterElement newTextIndexEntryChapterElement() {
+		TextIndexEntryChapterElement textIndexEntryChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryChapterElement.class);
+		this.appendChild(textIndexEntryChapter);
+		return textIndexEntryChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-page-number}.
+	 *
+	 * @return the element {@odf.element text:index-entry-page-number}
+	 */
+	public TextIndexEntryPageNumberElement newTextIndexEntryPageNumberElement() {
+		TextIndexEntryPageNumberElement textIndexEntryPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryPageNumberElement.class);
+		this.appendChild(textIndexEntryPageNumber);
+		return textIndexEntryPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-text}.
+	 *
+	 * @return the element {@odf.element text:index-entry-text}
+	 */
+	public TextIndexEntryTextElement newTextIndexEntryTextElement() {
+		TextIndexEntryTextElement textIndexEntryText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTextElement.class);
+		this.appendChild(textIndexEntryText);
+		return textIndexEntryText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexSourceElement.java
new file mode 100644
index 0000000..da2c282
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIllustrationIndexSourceElement.java
@@ -0,0 +1,220 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCaptionSequenceFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCaptionSequenceNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexScopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRelativeTabStopPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseCaptionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:illustration-index-source}.
+ *
+ */
+public class TextIllustrationIndexSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "illustration-index-source");
+
+	/**
+	 * Create the instance of <code>TextIllustrationIndexSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIllustrationIndexSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:illustration-index-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCaptionSequenceFormatAttribute</code> , See {@odf.attribute text:caption-sequence-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCaptionSequenceFormatAttribute() {
+		TextCaptionSequenceFormatAttribute attr = (TextCaptionSequenceFormatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "caption-sequence-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCaptionSequenceFormatAttribute</code> , See {@odf.attribute text:caption-sequence-format}
+	 *
+	 * @param textCaptionSequenceFormatValue   The type is <code>String</code>
+	 */
+	public void setTextCaptionSequenceFormatAttribute(String textCaptionSequenceFormatValue) {
+		TextCaptionSequenceFormatAttribute attr = new TextCaptionSequenceFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCaptionSequenceFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCaptionSequenceNameAttribute</code> , See {@odf.attribute text:caption-sequence-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCaptionSequenceNameAttribute() {
+		TextCaptionSequenceNameAttribute attr = (TextCaptionSequenceNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "caption-sequence-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCaptionSequenceNameAttribute</code> , See {@odf.attribute text:caption-sequence-name}
+	 *
+	 * @param textCaptionSequenceNameValue   The type is <code>String</code>
+	 */
+	public void setTextCaptionSequenceNameAttribute(String textCaptionSequenceNameValue) {
+		TextCaptionSequenceNameAttribute attr = new TextCaptionSequenceNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCaptionSequenceNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexScopeAttribute() {
+		TextIndexScopeAttribute attr = (TextIndexScopeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-scope");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextIndexScopeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @param textIndexScopeValue   The type is <code>String</code>
+	 */
+	public void setTextIndexScopeAttribute(String textIndexScopeValue) {
+		TextIndexScopeAttribute attr = new TextIndexScopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexScopeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRelativeTabStopPositionAttribute() {
+		TextRelativeTabStopPositionAttribute attr = (TextRelativeTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRelativeTabStopPositionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @param textRelativeTabStopPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRelativeTabStopPositionAttribute(Boolean textRelativeTabStopPositionValue) {
+		TextRelativeTabStopPositionAttribute attr = new TextRelativeTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRelativeTabStopPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseCaptionAttribute</code> , See {@odf.attribute text:use-caption}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseCaptionAttribute() {
+		TextUseCaptionAttribute attr = (TextUseCaptionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-caption");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseCaptionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseCaptionAttribute</code> , See {@odf.attribute text:use-caption}
+	 *
+	 * @param textUseCaptionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseCaptionAttribute(Boolean textUseCaptionValue) {
+		TextUseCaptionAttribute attr = new TextUseCaptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseCaptionValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index-entry-template}.
+	 *
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:illustration-index-entry-template}
+	 */
+	 public TextIllustrationIndexEntryTemplateElement newTextIllustrationIndexEntryTemplateElement(String textStyleNameValue) {
+		TextIllustrationIndexEntryTemplateElement textIllustrationIndexEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexEntryTemplateElement.class);
+		textIllustrationIndexEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textIllustrationIndexEntryTemplate);
+		return textIllustrationIndexEntryTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextImageCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextImageCountElement.java
new file mode 100644
index 0000000..9e2603c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextImageCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:image-count}.
+ *
+ */
+public class TextImageCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "image-count");
+
+	/**
+	 * Create the instance of <code>TextImageCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextImageCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:image-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexBodyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexBodyElement.java
new file mode 100644
index 0000000..655209a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexBodyElement.java
@@ -0,0 +1,556 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-body}.
+ *
+ */
+public class TextIndexBodyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-body");
+
+	/**
+	 * Create the instance of <code>TextIndexBodyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexBodyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-body}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:index-title}
+	 */
+	 public TextIndexTitleElement newTextIndexTitleElement(String textNameValue) {
+		TextIndexTitleElement textIndexTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleElement.class);
+		textIndexTitle.setTextNameAttribute(textNameValue);
+		this.appendChild(textIndexTitle);
+		return textIndexTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryBibliographyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryBibliographyElement.java
new file mode 100644
index 0000000..ed43536
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryBibliographyElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextBibliographyDataFieldAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-bibliography}.
+ *
+ */
+public class TextIndexEntryBibliographyElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-bibliography");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryBibliographyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryBibliographyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-bibliography}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextBibliographyDataFieldAttribute</code> , See {@odf.attribute text:bibliography-data-field}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextBibliographyDataFieldAttribute() {
+		TextBibliographyDataFieldAttribute attr = (TextBibliographyDataFieldAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "bibliography-data-field");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextBibliographyDataFieldAttribute</code> , See {@odf.attribute text:bibliography-data-field}
+	 *
+	 * @param textBibliographyDataFieldValue   The type is <code>String</code>
+	 */
+	public void setTextBibliographyDataFieldAttribute(String textBibliographyDataFieldValue) {
+		TextBibliographyDataFieldAttribute attr = new TextBibliographyDataFieldAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textBibliographyDataFieldValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryChapterElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryChapterElement.java
new file mode 100644
index 0000000..b530c4f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryChapterElement.java
@@ -0,0 +1,148 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-chapter}.
+ *
+ */
+public class TextIndexEntryChapterElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-chapter");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryChapterElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryChapterElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-chapter}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextDisplayAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryLinkEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryLinkEndElement.java
new file mode 100644
index 0000000..40467f1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryLinkEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-link-end}.
+ *
+ */
+public class TextIndexEntryLinkEndElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-link-end");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryLinkEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryLinkEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-link-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryLinkStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryLinkStartElement.java
new file mode 100644
index 0000000..c844001
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryLinkStartElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-link-start}.
+ *
+ */
+public class TextIndexEntryLinkStartElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-link-start");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryLinkStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryLinkStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-link-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryPageNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryPageNumberElement.java
new file mode 100644
index 0000000..53bfdcd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryPageNumberElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-page-number}.
+ *
+ */
+public class TextIndexEntryPageNumberElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-page-number");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryPageNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryPageNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-page-number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntrySpanElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntrySpanElement.java
new file mode 100644
index 0000000..9c503e0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntrySpanElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-span}.
+ *
+ */
+public class TextIndexEntrySpanElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-span");
+
+	/**
+	 * Create the instance of <code>TextIndexEntrySpanElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntrySpanElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-span}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryTabStopElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryTabStopElement.java
new file mode 100644
index 0000000..8583339
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryTabStopElement.java
@@ -0,0 +1,175 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLeaderCharAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-tab-stop}.
+ *
+ */
+public class TextIndexEntryTabStopElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-tab-stop");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryTabStopElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryTabStopElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-tab-stop}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleLeaderCharAttribute</code> , See {@odf.attribute style:leader-char}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleLeaderCharAttribute() {
+		StyleLeaderCharAttribute attr = (StyleLeaderCharAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "leader-char");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleLeaderCharAttribute</code> , See {@odf.attribute style:leader-char}
+	 *
+	 * @param styleLeaderCharValue   The type is <code>String</code>
+	 */
+	public void setStyleLeaderCharAttribute(String styleLeaderCharValue) {
+		StyleLeaderCharAttribute attr = new StyleLeaderCharAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleLeaderCharValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StylePositionAttribute</code> , See {@odf.attribute style:position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStylePositionAttribute() {
+		StylePositionAttribute attr = (StylePositionAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StylePositionAttribute</code> , See {@odf.attribute style:position}
+	 *
+	 * @param stylePositionValue   The type is <code>String</code>
+	 */
+	public void setStylePositionAttribute(String stylePositionValue) {
+		StylePositionAttribute attr = new StylePositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(stylePositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleTypeAttribute</code> , See {@odf.attribute style:type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleTypeAttribute() {
+		StyleTypeAttribute attr = (StyleTypeAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleTypeAttribute</code> , See {@odf.attribute style:type}
+	 *
+	 * @param styleTypeValue   The type is <code>String</code>
+	 */
+	public void setStyleTypeAttribute(String styleTypeValue) {
+		StyleTypeAttribute attr = new StyleTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryTextElement.java
new file mode 100644
index 0000000..d602317
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexEntryTextElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-entry-text}.
+ *
+ */
+public class TextIndexEntryTextElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-entry-text");
+
+	/**
+	 * Create the instance of <code>TextIndexEntryTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexEntryTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-entry-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexSourceStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexSourceStyleElement.java
new file mode 100644
index 0000000..6331b0a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexSourceStyleElement.java
@@ -0,0 +1,100 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-source-style}.
+ *
+ */
+public class TextIndexSourceStyleElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-source-style");
+
+	/**
+	 * Create the instance of <code>TextIndexSourceStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexSourceStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-source-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexSourceStylesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexSourceStylesElement.java
new file mode 100644
index 0000000..03774a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexSourceStylesElement.java
@@ -0,0 +1,111 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-source-styles}.
+ *
+ */
+public class TextIndexSourceStylesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-source-styles");
+
+	/**
+	 * Create the instance of <code>TextIndexSourceStylesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexSourceStylesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-source-styles}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-source-style}.
+	 *
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:index-source-style}
+	 */
+	 public TextIndexSourceStyleElement newTextIndexSourceStyleElement(String textStyleNameValue) {
+		TextIndexSourceStyleElement textIndexSourceStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexSourceStyleElement.class);
+		textIndexSourceStyle.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textIndexSourceStyle);
+		return textIndexSourceStyle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexTitleElement.java
new file mode 100644
index 0000000..74b7c94
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexTitleElement.java
@@ -0,0 +1,710 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-title}.
+ *
+ */
+public class TextIndexTitleElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-title");
+
+	/**
+	 * Create the instance of <code>TextIndexTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:index-title}
+	 */
+	 public TextIndexTitleElement newTextIndexTitleElement(String textNameValue) {
+		TextIndexTitleElement textIndexTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleElement.class);
+		textIndexTitle.setTextNameAttribute(textNameValue);
+		this.appendChild(textIndexTitle);
+		return textIndexTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexTitleTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexTitleTemplateElement.java
new file mode 100644
index 0000000..b6efd05
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextIndexTitleTemplateElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:index-title-template}.
+ *
+ */
+public class TextIndexTitleTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "index-title-template");
+
+	/**
+	 * Create the instance of <code>TextIndexTitleTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextIndexTitleTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:index-title-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextInitialCreatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextInitialCreatorElement.java
new file mode 100644
index 0000000..93035dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextInitialCreatorElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:initial-creator}.
+ *
+ */
+public class TextInitialCreatorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "initial-creator");
+
+	/**
+	 * Create the instance of <code>TextInitialCreatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextInitialCreatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:initial-creator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextInsertionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextInsertionElement.java
new file mode 100644
index 0000000..af52684
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextInsertionElement.java
@@ -0,0 +1,85 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeChangeInfoElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:insertion}.
+ *
+ */
+public class TextInsertionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "insertion");
+
+	/**
+	 * Create the instance of <code>TextInsertionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextInsertionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:insertion}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element office:change-info}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element office:change-info}
+	 */
+	public OfficeChangeInfoElement newOfficeChangeInfoElement() {
+		OfficeChangeInfoElement officeChangeInfo = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeChangeInfoElement.class);
+		this.appendChild(officeChangeInfo);
+		return officeChangeInfo;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextKeywordsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextKeywordsElement.java
new file mode 100644
index 0000000..599ac521
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextKeywordsElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:keywords}.
+ *
+ */
+public class TextKeywordsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "keywords");
+
+	/**
+	 * Create the instance of <code>TextKeywordsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextKeywordsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:keywords}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLineBreakElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLineBreakElement.java
new file mode 100644
index 0000000..7bab270
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLineBreakElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:line-break}.
+ *
+ */
+public class TextLineBreakElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "line-break");
+
+	/**
+	 * Create the instance of <code>TextLineBreakElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextLineBreakElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:line-break}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLinenumberingConfigurationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLinenumberingConfigurationElement.java
new file mode 100644
index 0000000..f176ee3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLinenumberingConfigurationElement.java
@@ -0,0 +1,336 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCountEmptyLinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCountInTextBoxesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIncrementAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNumberLinesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNumberPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOffsetAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRestartOnPageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:linenumbering-configuration}.
+ *
+ */
+public class TextLinenumberingConfigurationElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "linenumbering-configuration");
+
+	/**
+	 * Create the instance of <code>TextLinenumberingConfigurationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextLinenumberingConfigurationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:linenumbering-configuration}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCountEmptyLinesAttribute</code> , See {@odf.attribute text:count-empty-lines}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCountEmptyLinesAttribute() {
+		TextCountEmptyLinesAttribute attr = (TextCountEmptyLinesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "count-empty-lines");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCountEmptyLinesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCountEmptyLinesAttribute</code> , See {@odf.attribute text:count-empty-lines}
+	 *
+	 * @param textCountEmptyLinesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCountEmptyLinesAttribute(Boolean textCountEmptyLinesValue) {
+		TextCountEmptyLinesAttribute attr = new TextCountEmptyLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCountEmptyLinesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCountInTextBoxesAttribute</code> , See {@odf.attribute text:count-in-text-boxes}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCountInTextBoxesAttribute() {
+		TextCountInTextBoxesAttribute attr = (TextCountInTextBoxesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "count-in-text-boxes");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCountInTextBoxesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCountInTextBoxesAttribute</code> , See {@odf.attribute text:count-in-text-boxes}
+	 *
+	 * @param textCountInTextBoxesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCountInTextBoxesAttribute(Boolean textCountInTextBoxesValue) {
+		TextCountInTextBoxesAttribute attr = new TextCountInTextBoxesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCountInTextBoxesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIncrementAttribute</code> , See {@odf.attribute text:increment}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextIncrementAttribute() {
+		TextIncrementAttribute attr = (TextIncrementAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "increment");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIncrementAttribute</code> , See {@odf.attribute text:increment}
+	 *
+	 * @param textIncrementValue   The type is <code>Integer</code>
+	 */
+	public void setTextIncrementAttribute(Integer textIncrementValue) {
+		TextIncrementAttribute attr = new TextIncrementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textIncrementValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNumberLinesAttribute</code> , See {@odf.attribute text:number-lines}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextNumberLinesAttribute() {
+		TextNumberLinesAttribute attr = (TextNumberLinesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "number-lines");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextNumberLinesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNumberLinesAttribute</code> , See {@odf.attribute text:number-lines}
+	 *
+	 * @param textNumberLinesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextNumberLinesAttribute(Boolean textNumberLinesValue) {
+		TextNumberLinesAttribute attr = new TextNumberLinesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textNumberLinesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNumberPositionAttribute</code> , See {@odf.attribute text:number-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNumberPositionAttribute() {
+		TextNumberPositionAttribute attr = (TextNumberPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "number-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextNumberPositionAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNumberPositionAttribute</code> , See {@odf.attribute text:number-position}
+	 *
+	 * @param textNumberPositionValue   The type is <code>String</code>
+	 */
+	public void setTextNumberPositionAttribute(String textNumberPositionValue) {
+		TextNumberPositionAttribute attr = new TextNumberPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNumberPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOffsetAttribute</code> , See {@odf.attribute text:offset}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextOffsetAttribute() {
+		TextOffsetAttribute attr = (TextOffsetAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "offset");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOffsetAttribute</code> , See {@odf.attribute text:offset}
+	 *
+	 * @param textOffsetValue   The type is <code>String</code>
+	 */
+	public void setTextOffsetAttribute(String textOffsetValue) {
+		TextOffsetAttribute attr = new TextOffsetAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textOffsetValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRestartOnPageAttribute</code> , See {@odf.attribute text:restart-on-page}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRestartOnPageAttribute() {
+		TextRestartOnPageAttribute attr = (TextRestartOnPageAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "restart-on-page");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRestartOnPageAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRestartOnPageAttribute</code> , See {@odf.attribute text:restart-on-page}
+	 *
+	 * @param textRestartOnPageValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRestartOnPageAttribute(Boolean textRestartOnPageValue) {
+		TextRestartOnPageAttribute attr = new TextRestartOnPageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRestartOnPageValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:linenumbering-separator}.
+	 *
+	 * @return the element {@odf.element text:linenumbering-separator}
+	 */
+	public TextLinenumberingSeparatorElement newTextLinenumberingSeparatorElement() {
+		TextLinenumberingSeparatorElement textLinenumberingSeparator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLinenumberingSeparatorElement.class);
+		this.appendChild(textLinenumberingSeparator);
+		return textLinenumberingSeparator;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLinenumberingSeparatorElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLinenumberingSeparatorElement.java
new file mode 100644
index 0000000..4991f3b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextLinenumberingSeparatorElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIncrementAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:linenumbering-separator}.
+ *
+ */
+public class TextLinenumberingSeparatorElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "linenumbering-separator");
+
+	/**
+	 * Create the instance of <code>TextLinenumberingSeparatorElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextLinenumberingSeparatorElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:linenumbering-separator}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIncrementAttribute</code> , See {@odf.attribute text:increment}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextIncrementAttribute() {
+		TextIncrementAttribute attr = (TextIncrementAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "increment");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIncrementAttribute</code> , See {@odf.attribute text:increment}
+	 *
+	 * @param textIncrementValue   The type is <code>Integer</code>
+	 */
+	public void setTextIncrementAttribute(Integer textIncrementValue) {
+		TextIncrementAttribute attr = new TextIncrementAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textIncrementValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListElement.java
new file mode 100644
index 0000000..449ec15
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListElement.java
@@ -0,0 +1,193 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextContinueListAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextContinueNumberingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list}.
+ *
+ */
+public class TextListElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list");
+
+	/**
+	 * Create the instance of <code>TextListElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextContinueListAttribute</code> , See {@odf.attribute text:continue-list}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextContinueListAttribute() {
+		TextContinueListAttribute attr = (TextContinueListAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "continue-list");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextContinueListAttribute</code> , See {@odf.attribute text:continue-list}
+	 *
+	 * @param textContinueListValue   The type is <code>String</code>
+	 */
+	public void setTextContinueListAttribute(String textContinueListValue) {
+		TextContinueListAttribute attr = new TextContinueListAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textContinueListValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextContinueNumberingAttribute</code> , See {@odf.attribute text:continue-numbering}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextContinueNumberingAttribute() {
+		TextContinueNumberingAttribute attr = (TextContinueNumberingAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "continue-numbering");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextContinueNumberingAttribute</code> , See {@odf.attribute text:continue-numbering}
+	 *
+	 * @param textContinueNumberingValue   The type is <code>Boolean</code>
+	 */
+	public void setTextContinueNumberingAttribute(Boolean textContinueNumberingValue) {
+		TextContinueNumberingAttribute attr = new TextContinueNumberingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textContinueNumberingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-header}.
+	 *
+	 * @return the element {@odf.element text:list-header}
+	 */
+	public TextListHeaderElement newTextListHeaderElement() {
+		TextListHeaderElement textListHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListHeaderElement.class);
+		this.appendChild(textListHeader);
+		return textListHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-item}.
+	 *
+	 * @return the element {@odf.element text:list-item}
+	 */
+	public TextListItemElement newTextListItemElement() {
+		TextListItemElement textListItem = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListItemElement.class);
+		this.appendChild(textListItem);
+		return textListItem;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListHeaderElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListHeaderElement.java
new file mode 100644
index 0000000..d98d240
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListHeaderElement.java
@@ -0,0 +1,153 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list-header}.
+ *
+ */
+public class TextListHeaderElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-header");
+
+	/**
+	 * Create the instance of <code>TextListHeaderElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListHeaderElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list-header}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:number}.
+	 *
+	 * @return the element {@odf.element text:number}
+	 */
+	public TextNumberElement newTextNumberElement() {
+		TextNumberElement textNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberElement.class);
+		this.appendChild(textNumber);
+		return textNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListItemElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListItemElement.java
new file mode 100644
index 0000000..3751506
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListItemElement.java
@@ -0,0 +1,203 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleOverrideAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list-item}.
+ *
+ */
+public class TextListItemElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-item");
+
+	/**
+	 * Create the instance of <code>TextListItemElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListItemElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list-item}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextStartValueAttribute() {
+		TextStartValueAttribute attr = (TextStartValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @param textStartValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextStartValueAttribute(Integer textStartValueValue) {
+		TextStartValueAttribute attr = new TextStartValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textStartValueValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleOverrideAttribute</code> , See {@odf.attribute text:style-override}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleOverrideAttribute() {
+		TextStyleOverrideAttribute attr = (TextStyleOverrideAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-override");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleOverrideAttribute</code> , See {@odf.attribute text:style-override}
+	 *
+	 * @param textStyleOverrideValue   The type is <code>String</code>
+	 */
+	public void setTextStyleOverrideAttribute(String textStyleOverrideValue) {
+		TextStyleOverrideAttribute attr = new TextStyleOverrideAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleOverrideValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:number}.
+	 *
+	 * @return the element {@odf.element text:number}
+	 */
+	public TextNumberElement newTextNumberElement() {
+		TextNumberElement textNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberElement.class);
+		this.appendChild(textNumber);
+		return textNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleBulletElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleBulletElement.java
new file mode 100644
index 0000000..3302634
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleBulletElement.java
@@ -0,0 +1,224 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumPrefixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumSuffixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextBulletCharAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextBulletRelativeSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list-level-style-bullet}.
+ *
+ */
+public class TextListLevelStyleBulletElement extends TextListLevelStyleElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-level-style-bullet");
+
+	/**
+	 * Create the instance of <code>TextListLevelStyleBulletElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListLevelStyleBulletElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list-level-style-bullet}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumPrefixAttribute() {
+		StyleNumPrefixAttribute attr = (StyleNumPrefixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-prefix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @param styleNumPrefixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumPrefixAttribute(String styleNumPrefixValue) {
+		StyleNumPrefixAttribute attr = new StyleNumPrefixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumPrefixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumSuffixAttribute() {
+		StyleNumSuffixAttribute attr = (StyleNumSuffixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-suffix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @param styleNumSuffixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumSuffixAttribute(String styleNumSuffixValue) {
+		StyleNumSuffixAttribute attr = new StyleNumSuffixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumSuffixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextBulletCharAttribute</code> , See {@odf.attribute text:bullet-char}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextBulletCharAttribute() {
+		TextBulletCharAttribute attr = (TextBulletCharAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "bullet-char");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextBulletCharAttribute</code> , See {@odf.attribute text:bullet-char}
+	 *
+	 * @param textBulletCharValue   The type is <code>String</code>
+	 */
+	public void setTextBulletCharAttribute(String textBulletCharValue) {
+		TextBulletCharAttribute attr = new TextBulletCharAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textBulletCharValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextBulletRelativeSizeAttribute</code> , See {@odf.attribute text:bullet-relative-size}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextBulletRelativeSizeAttribute() {
+		TextBulletRelativeSizeAttribute attr = (TextBulletRelativeSizeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "bullet-relative-size");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextBulletRelativeSizeAttribute</code> , See {@odf.attribute text:bullet-relative-size}
+	 *
+	 * @param textBulletRelativeSizeValue   The type is <code>String</code>
+	 */
+	public void setTextBulletRelativeSizeAttribute(String textBulletRelativeSizeValue) {
+		TextBulletRelativeSizeAttribute attr = new TextBulletRelativeSizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textBulletRelativeSizeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:list-level-properties}.
+	 *
+	 * @return the element {@odf.element style:list-level-properties}
+	 */
+	public StyleListLevelPropertiesElement newStyleListLevelPropertiesElement() {
+		StyleListLevelPropertiesElement styleListLevelProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleListLevelPropertiesElement.class);
+		this.appendChild(styleListLevelProperties);
+		return styleListLevelProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleElementBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleElementBase.java
new file mode 100644
index 0000000..8e5a6da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleElementBase.java
@@ -0,0 +1,79 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLevelAttribute;
+
+/**
+ * DOM implementation of OpenDocument base element
+ *
+ */
+public abstract class TextListLevelStyleElementBase extends OdfStyleBase {
+
+	/**
+	 * Create the instance of <code>TextListLevelStyleElementBase</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListLevelStyleElementBase(OdfFileDom ownerDoc, OdfName elementName) {
+		super(ownerDoc, elementName);
+	}
+
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLevelAttribute</code> , See {@odf.attribute text:level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextLevelAttribute() {
+		TextLevelAttribute attr = (TextLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLevelAttribute</code> , See {@odf.attribute text:level}
+	 *
+	 * @param textLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextLevelAttribute(Integer textLevelValue) {
+		TextLevelAttribute attr = new TextLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textLevelValue.intValue());
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleImageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleImageElement.java
new file mode 100644
index 0000000..bfe1e9b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleImageElement.java
@@ -0,0 +1,195 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBinaryDataElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkActuateAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list-level-style-image}.
+ *
+ */
+public class TextListLevelStyleImageElement extends TextListLevelStyleElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-level-style-image");
+
+	/**
+	 * Create the instance of <code>TextListLevelStyleImageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListLevelStyleImageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list-level-style-image}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkActuateAttribute() {
+		XlinkActuateAttribute attr = (XlinkActuateAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "actuate");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkActuateAttribute.DEFAULT_VALUE_ONLOAD;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkActuateAttribute</code> , See {@odf.attribute xlink:actuate}
+	 *
+	 * @param xlinkActuateValue   The type is <code>String</code>
+	 */
+	public void setXlinkActuateAttribute(String xlinkActuateValue) {
+		XlinkActuateAttribute attr = new XlinkActuateAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkActuateValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element office:binary-data}.
+	 *
+	 * @return the element {@odf.element office:binary-data}
+	 */
+	public OfficeBinaryDataElement newOfficeBinaryDataElement() {
+		OfficeBinaryDataElement officeBinaryData = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeBinaryDataElement.class);
+		this.appendChild(officeBinaryData);
+		return officeBinaryData;
+	}
+
+	/**
+	 * Create child element {@odf.element style:list-level-properties}.
+	 *
+	 * @return the element {@odf.element style:list-level-properties}
+	 */
+	public StyleListLevelPropertiesElement newStyleListLevelPropertiesElement() {
+		StyleListLevelPropertiesElement styleListLevelProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleListLevelPropertiesElement.class);
+		this.appendChild(styleListLevelProperties);
+		return styleListLevelProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleNumberElement.java
new file mode 100644
index 0000000..41791a7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListLevelStyleNumberElement.java
@@ -0,0 +1,274 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumPrefixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumSuffixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayLevelsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list-level-style-number}.
+ *
+ */
+public class TextListLevelStyleNumberElement extends TextListLevelStyleElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-level-style-number");
+
+	/**
+	 * Create the instance of <code>TextListLevelStyleNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListLevelStyleNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list-level-style-number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumPrefixAttribute() {
+		StyleNumPrefixAttribute attr = (StyleNumPrefixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-prefix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @param styleNumPrefixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumPrefixAttribute(String styleNumPrefixValue) {
+		StyleNumPrefixAttribute attr = new StyleNumPrefixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumPrefixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumSuffixAttribute() {
+		StyleNumSuffixAttribute attr = (StyleNumSuffixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-suffix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @param styleNumSuffixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumSuffixAttribute(String styleNumSuffixValue) {
+		StyleNumSuffixAttribute attr = new StyleNumSuffixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumSuffixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayLevelsAttribute</code> , See {@odf.attribute text:display-levels}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextDisplayLevelsAttribute() {
+		TextDisplayLevelsAttribute attr = (TextDisplayLevelsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display-levels");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TextDisplayLevelsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayLevelsAttribute</code> , See {@odf.attribute text:display-levels}
+	 *
+	 * @param textDisplayLevelsValue   The type is <code>Integer</code>
+	 */
+	public void setTextDisplayLevelsAttribute(Integer textDisplayLevelsValue) {
+		TextDisplayLevelsAttribute attr = new TextDisplayLevelsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textDisplayLevelsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextStartValueAttribute() {
+		TextStartValueAttribute attr = (TextStartValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TextStartValueAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @param textStartValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextStartValueAttribute(Integer textStartValueValue) {
+		TextStartValueAttribute attr = new TextStartValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textStartValueValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:list-level-properties}.
+	 *
+	 * @return the element {@odf.element style:list-level-properties}
+	 */
+	public StyleListLevelPropertiesElement newStyleListLevelPropertiesElement() {
+		StyleListLevelPropertiesElement styleListLevelProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleListLevelPropertiesElement.class);
+		this.appendChild(styleListLevelProperties);
+		return styleListLevelProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListStyleElement.java
new file mode 100644
index 0000000..eaedd17
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextListStyleElement.java
@@ -0,0 +1,192 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDisplayNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConsecutiveNumberingAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:list-style}.
+ *
+ */
+public class TextListStyleElement extends OdfStyleBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "list-style");
+
+	/**
+	 * Create the instance of <code>TextListStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextListStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:list-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDisplayNameAttribute() {
+		StyleDisplayNameAttribute attr = (StyleDisplayNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "display-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDisplayNameAttribute</code> , See {@odf.attribute style:display-name}
+	 *
+	 * @param styleDisplayNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDisplayNameAttribute(String styleDisplayNameValue) {
+		StyleDisplayNameAttribute attr = new StyleDisplayNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDisplayNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConsecutiveNumberingAttribute</code> , See {@odf.attribute text:consecutive-numbering}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextConsecutiveNumberingAttribute() {
+		TextConsecutiveNumberingAttribute attr = (TextConsecutiveNumberingAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "consecutive-numbering");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextConsecutiveNumberingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConsecutiveNumberingAttribute</code> , See {@odf.attribute text:consecutive-numbering}
+	 *
+	 * @param textConsecutiveNumberingValue   The type is <code>Boolean</code>
+	 */
+	public void setTextConsecutiveNumberingAttribute(Boolean textConsecutiveNumberingValue) {
+		TextConsecutiveNumberingAttribute attr = new TextConsecutiveNumberingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textConsecutiveNumberingValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-level-style-bullet}.
+	 *
+	 * @param textBulletCharValue  the <code>String</code> value of <code>TextBulletCharAttribute</code>, see {@odf.attribute  text:bullet-char} at specification
+	 * @param textLevelValue  the <code>Integer</code> value of <code>TextLevelAttribute</code>, see {@odf.attribute  text:level} at specification
+	 * @return the element {@odf.element text:list-level-style-bullet}
+	 */
+	 public TextListLevelStyleBulletElement newTextListLevelStyleBulletElement(String textBulletCharValue, int textLevelValue) {
+		TextListLevelStyleBulletElement textListLevelStyleBullet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListLevelStyleBulletElement.class);
+		textListLevelStyleBullet.setTextBulletCharAttribute(textBulletCharValue);
+		textListLevelStyleBullet.setTextLevelAttribute(textLevelValue);
+		this.appendChild(textListLevelStyleBullet);
+		return textListLevelStyleBullet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-level-style-image}.
+	 *
+	 * @param textLevelValue  the <code>Integer</code> value of <code>TextLevelAttribute</code>, see {@odf.attribute  text:level} at specification
+	 * @return the element {@odf.element text:list-level-style-image}
+	 */
+	 public TextListLevelStyleImageElement newTextListLevelStyleImageElement(int textLevelValue) {
+		TextListLevelStyleImageElement textListLevelStyleImage = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListLevelStyleImageElement.class);
+		textListLevelStyleImage.setTextLevelAttribute(textLevelValue);
+		this.appendChild(textListLevelStyleImage);
+		return textListLevelStyleImage;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list-level-style-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textLevelValue  the <code>Integer</code> value of <code>TextLevelAttribute</code>, see {@odf.attribute  text:level} at specification
+	 * @return the element {@odf.element text:list-level-style-number}
+	 */
+	 public TextListLevelStyleNumberElement newTextListLevelStyleNumberElement(String styleNumFormatValue, int textLevelValue) {
+		TextListLevelStyleNumberElement textListLevelStyleNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListLevelStyleNumberElement.class);
+		textListLevelStyleNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textListLevelStyleNumber.setTextLevelAttribute(textLevelValue);
+		this.appendChild(textListLevelStyleNumber);
+		return textListLevelStyleNumber;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMeasureElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMeasureElement.java
new file mode 100644
index 0000000..8f29395
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMeasureElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKindAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:measure}.
+ *
+ */
+public class TextMeasureElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "measure");
+
+	/**
+	 * Create the instance of <code>TextMeasureElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextMeasureElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:measure}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKindAttribute</code> , See {@odf.attribute text:kind}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKindAttribute() {
+		TextKindAttribute attr = (TextKindAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "kind");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKindAttribute</code> , See {@odf.attribute text:kind}
+	 *
+	 * @param textKindValue   The type is <code>String</code>
+	 */
+	public void setTextKindAttribute(String textKindValue) {
+		TextKindAttribute attr = new TextKindAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKindValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMetaElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMetaElement.java
new file mode 100644
index 0000000..12f5ef0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMetaElement.java
@@ -0,0 +1,2079 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlAboutAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlDatatypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlPropertyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:meta}.
+ *
+ */
+public class TextMetaElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "meta");
+
+	/**
+	 * Create the instance of <code>TextMetaElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextMetaElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:meta}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlAboutAttribute() {
+		XhtmlAboutAttribute attr = (XhtmlAboutAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "about");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @param xhtmlAboutValue   The type is <code>String</code>
+	 */
+	public void setXhtmlAboutAttribute(String xhtmlAboutValue) {
+		XhtmlAboutAttribute attr = new XhtmlAboutAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlAboutValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlContentAttribute() {
+		XhtmlContentAttribute attr = (XhtmlContentAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "content");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @param xhtmlContentValue   The type is <code>String</code>
+	 */
+	public void setXhtmlContentAttribute(String xhtmlContentValue) {
+		XhtmlContentAttribute attr = new XhtmlContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlContentValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlDatatypeAttribute() {
+		XhtmlDatatypeAttribute attr = (XhtmlDatatypeAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "datatype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @param xhtmlDatatypeValue   The type is <code>String</code>
+	 */
+	public void setXhtmlDatatypeAttribute(String xhtmlDatatypeValue) {
+		XhtmlDatatypeAttribute attr = new XhtmlDatatypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlDatatypeValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlPropertyAttribute() {
+		XhtmlPropertyAttribute attr = (XhtmlPropertyAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "property");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @param xhtmlPropertyValue   The type is <code>String</code>
+	 */
+	public void setXhtmlPropertyAttribute(String xhtmlPropertyValue) {
+		XhtmlPropertyAttribute attr = new XhtmlPropertyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlPropertyValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:a}
+	 */
+	 public TextAElement newTextAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAElement textA = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAElement.class);
+		textA.setXlinkHrefAttribute(xlinkHrefValue);
+		textA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textA);
+		return textA;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+	
+	/**
+	* Set text content. Only elements which are allowed to have text content offer this method.
+	*/
+	public void setTextContent(String content) {
+		super.setTextContent(content);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	protected void onRemoveNode() {
+		super.onRemoveNode();
+		((OdfFileDom) this.ownerDocument).getInContentMetadataCache().remove(this);
+	}
+
+	protected void onInsertNode() {
+		super.onInsertNode();
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMetaFieldElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMetaFieldElement.java
new file mode 100644
index 0000000..98f8922
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextMetaFieldElement.java
@@ -0,0 +1,1994 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:meta-field}.
+ *
+ */
+public class TextMetaFieldElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "meta-field");
+
+	/**
+	 * Create the instance of <code>TextMetaFieldElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextMetaFieldElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:meta-field}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:a}
+	 */
+	 public TextAElement newTextAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAElement textA = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAElement.class);
+		textA.setXlinkHrefAttribute(xlinkHrefValue);
+		textA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textA);
+		return textA;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextModificationDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextModificationDateElement.java
new file mode 100644
index 0000000..a1c95ab
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextModificationDateElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:modification-date}.
+ *
+ */
+public class TextModificationDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "modification-date");
+
+	/**
+	 * Create the instance of <code>TextModificationDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextModificationDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:modification-date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDateValueAttribute() {
+		TextDateValueAttribute attr = (TextDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @param textDateValueValue   The type is <code>String</code>
+	 */
+	public void setTextDateValueAttribute(String textDateValueValue) {
+		TextDateValueAttribute attr = new TextDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextModificationTimeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextModificationTimeElement.java
new file mode 100644
index 0000000..328ade9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextModificationTimeElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTimeValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:modification-time}.
+ *
+ */
+public class TextModificationTimeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "modification-time");
+
+	/**
+	 * Create the instance of <code>TextModificationTimeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextModificationTimeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:modification-time}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTimeValueAttribute() {
+		TextTimeValueAttribute attr = (TextTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @param textTimeValueValue   The type is <code>String</code>
+	 */
+	public void setTextTimeValueAttribute(String textTimeValueValue) {
+		TextTimeValueAttribute attr = new TextTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTimeValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteBodyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteBodyElement.java
new file mode 100644
index 0000000..4819104
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteBodyElement.java
@@ -0,0 +1,543 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:note-body}.
+ *
+ */
+public class TextNoteBodyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note-body");
+
+	/**
+	 * Create the instance of <code>TextNoteBodyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteBodyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:note-body}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteCitationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteCitationElement.java
new file mode 100644
index 0000000..d462471
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteCitationElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLabelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:note-citation}.
+ *
+ */
+public class TextNoteCitationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note-citation");
+
+	/**
+	 * Create the instance of <code>TextNoteCitationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteCitationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:note-citation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLabelAttribute</code> , See {@odf.attribute text:label}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextLabelAttribute() {
+		TextLabelAttribute attr = (TextLabelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "label");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLabelAttribute</code> , See {@odf.attribute text:label}
+	 *
+	 * @param textLabelValue   The type is <code>String</code>
+	 */
+	public void setTextLabelAttribute(String textLabelValue) {
+		TextLabelAttribute attr = new TextLabelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textLabelValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteContinuationNoticeBackwardElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteContinuationNoticeBackwardElement.java
new file mode 100644
index 0000000..2b28d76
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteContinuationNoticeBackwardElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:note-continuation-notice-backward}.
+ *
+ */
+public class TextNoteContinuationNoticeBackwardElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note-continuation-notice-backward");
+
+	/**
+	 * Create the instance of <code>TextNoteContinuationNoticeBackwardElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteContinuationNoticeBackwardElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:note-continuation-notice-backward}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteContinuationNoticeForwardElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteContinuationNoticeForwardElement.java
new file mode 100644
index 0000000..3c864dc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteContinuationNoticeForwardElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:note-continuation-notice-forward}.
+ *
+ */
+public class TextNoteContinuationNoticeForwardElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note-continuation-notice-forward");
+
+	/**
+	 * Create the instance of <code>TextNoteContinuationNoticeForwardElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteContinuationNoticeForwardElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:note-continuation-notice-forward}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteElement.java
new file mode 100644
index 0000000..a841765
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteElement.java
@@ -0,0 +1,149 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNoteClassAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:note}.
+ *
+ */
+public class TextNoteElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note");
+
+	/**
+	 * Create the instance of <code>TextNoteElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:note}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNoteClassAttribute</code> , See {@odf.attribute text:note-class}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNoteClassAttribute() {
+		TextNoteClassAttribute attr = (TextNoteClassAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "note-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNoteClassAttribute</code> , See {@odf.attribute text:note-class}
+	 *
+	 * @param textNoteClassValue   The type is <code>String</code>
+	 */
+	public void setTextNoteClassAttribute(String textNoteClassValue) {
+		TextNoteClassAttribute attr = new TextNoteClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNoteClassValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:note-body}
+	 */
+	public TextNoteBodyElement newTextNoteBodyElement() {
+		TextNoteBodyElement textNoteBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteBodyElement.class);
+		this.appendChild(textNoteBody);
+		return textNoteBody;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-citation}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:note-citation}
+	 */
+	public TextNoteCitationElement newTextNoteCitationElement() {
+		TextNoteCitationElement textNoteCitation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteCitationElement.class);
+		this.appendChild(textNoteCitation);
+		return textNoteCitation;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteRefElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteRefElement.java
new file mode 100644
index 0000000..9a54b2d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNoteRefElement.java
@@ -0,0 +1,156 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNoteClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRefNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextReferenceFormatAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:note-ref}.
+ *
+ */
+public class TextNoteRefElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "note-ref");
+
+	/**
+	 * Create the instance of <code>TextNoteRefElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNoteRefElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:note-ref}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNoteClassAttribute</code> , See {@odf.attribute text:note-class}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNoteClassAttribute() {
+		TextNoteClassAttribute attr = (TextNoteClassAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "note-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNoteClassAttribute</code> , See {@odf.attribute text:note-class}
+	 *
+	 * @param textNoteClassValue   The type is <code>String</code>
+	 */
+	public void setTextNoteClassAttribute(String textNoteClassValue) {
+		TextNoteClassAttribute attr = new TextNoteClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNoteClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextRefNameAttribute() {
+		TextRefNameAttribute attr = (TextRefNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "ref-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @param textRefNameValue   The type is <code>String</code>
+	 */
+	public void setTextRefNameAttribute(String textRefNameValue) {
+		TextRefNameAttribute attr = new TextRefNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textRefNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextReferenceFormatAttribute() {
+		TextReferenceFormatAttribute attr = (TextReferenceFormatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "reference-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @param textReferenceFormatValue   The type is <code>String</code>
+	 */
+	public void setTextReferenceFormatAttribute(String textReferenceFormatValue) {
+		TextReferenceFormatAttribute attr = new TextReferenceFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textReferenceFormatValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNotesConfigurationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNotesConfigurationElement.java
new file mode 100644
index 0000000..e0e227b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNotesConfigurationElement.java
@@ -0,0 +1,397 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumPrefixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumSuffixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCitationBodyStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCitationStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDefaultStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFootnotesPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMasterPageNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNoteClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartNumberingAtAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:notes-configuration}.
+ *
+ */
+public class TextNotesConfigurationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "notes-configuration");
+
+	/**
+	 * Create the instance of <code>TextNotesConfigurationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNotesConfigurationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:notes-configuration}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumPrefixAttribute() {
+		StyleNumPrefixAttribute attr = (StyleNumPrefixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-prefix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @param styleNumPrefixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumPrefixAttribute(String styleNumPrefixValue) {
+		StyleNumPrefixAttribute attr = new StyleNumPrefixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumPrefixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumSuffixAttribute() {
+		StyleNumSuffixAttribute attr = (StyleNumSuffixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-suffix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @param styleNumSuffixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumSuffixAttribute(String styleNumSuffixValue) {
+		StyleNumSuffixAttribute attr = new StyleNumSuffixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumSuffixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCitationBodyStyleNameAttribute</code> , See {@odf.attribute text:citation-body-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCitationBodyStyleNameAttribute() {
+		TextCitationBodyStyleNameAttribute attr = (TextCitationBodyStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "citation-body-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCitationBodyStyleNameAttribute</code> , See {@odf.attribute text:citation-body-style-name}
+	 *
+	 * @param textCitationBodyStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextCitationBodyStyleNameAttribute(String textCitationBodyStyleNameValue) {
+		TextCitationBodyStyleNameAttribute attr = new TextCitationBodyStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCitationBodyStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCitationStyleNameAttribute</code> , See {@odf.attribute text:citation-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCitationStyleNameAttribute() {
+		TextCitationStyleNameAttribute attr = (TextCitationStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "citation-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCitationStyleNameAttribute</code> , See {@odf.attribute text:citation-style-name}
+	 *
+	 * @param textCitationStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextCitationStyleNameAttribute(String textCitationStyleNameValue) {
+		TextCitationStyleNameAttribute attr = new TextCitationStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCitationStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDefaultStyleNameAttribute</code> , See {@odf.attribute text:default-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDefaultStyleNameAttribute() {
+		TextDefaultStyleNameAttribute attr = (TextDefaultStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "default-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDefaultStyleNameAttribute</code> , See {@odf.attribute text:default-style-name}
+	 *
+	 * @param textDefaultStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextDefaultStyleNameAttribute(String textDefaultStyleNameValue) {
+		TextDefaultStyleNameAttribute attr = new TextDefaultStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDefaultStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFootnotesPositionAttribute</code> , See {@odf.attribute text:footnotes-position}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFootnotesPositionAttribute() {
+		TextFootnotesPositionAttribute attr = (TextFootnotesPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "footnotes-position");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFootnotesPositionAttribute</code> , See {@odf.attribute text:footnotes-position}
+	 *
+	 * @param textFootnotesPositionValue   The type is <code>String</code>
+	 */
+	public void setTextFootnotesPositionAttribute(String textFootnotesPositionValue) {
+		TextFootnotesPositionAttribute attr = new TextFootnotesPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFootnotesPositionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMasterPageNameAttribute</code> , See {@odf.attribute text:master-page-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextMasterPageNameAttribute() {
+		TextMasterPageNameAttribute attr = (TextMasterPageNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "master-page-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMasterPageNameAttribute</code> , See {@odf.attribute text:master-page-name}
+	 *
+	 * @param textMasterPageNameValue   The type is <code>String</code>
+	 */
+	public void setTextMasterPageNameAttribute(String textMasterPageNameValue) {
+		TextMasterPageNameAttribute attr = new TextMasterPageNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textMasterPageNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNoteClassAttribute</code> , See {@odf.attribute text:note-class}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNoteClassAttribute() {
+		TextNoteClassAttribute attr = (TextNoteClassAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "note-class");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNoteClassAttribute</code> , See {@odf.attribute text:note-class}
+	 *
+	 * @param textNoteClassValue   The type is <code>String</code>
+	 */
+	public void setTextNoteClassAttribute(String textNoteClassValue) {
+		TextNoteClassAttribute attr = new TextNoteClassAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNoteClassValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartNumberingAtAttribute</code> , See {@odf.attribute text:start-numbering-at}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStartNumberingAtAttribute() {
+		TextStartNumberingAtAttribute attr = (TextStartNumberingAtAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-numbering-at");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartNumberingAtAttribute</code> , See {@odf.attribute text:start-numbering-at}
+	 *
+	 * @param textStartNumberingAtValue   The type is <code>String</code>
+	 */
+	public void setTextStartNumberingAtAttribute(String textStartNumberingAtValue) {
+		TextStartNumberingAtAttribute attr = new TextStartNumberingAtAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStartNumberingAtValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextStartValueAttribute() {
+		TextStartValueAttribute attr = (TextStartValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TextStartValueAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @param textStartValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextStartValueAttribute(Integer textStartValueValue) {
+		TextStartValueAttribute attr = new TextStartValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textStartValueValue.intValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-continuation-notice-backward}.
+	 *
+	 * @return the element {@odf.element text:note-continuation-notice-backward}
+	 */
+	public TextNoteContinuationNoticeBackwardElement newTextNoteContinuationNoticeBackwardElement() {
+		TextNoteContinuationNoticeBackwardElement textNoteContinuationNoticeBackward = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteContinuationNoticeBackwardElement.class);
+		this.appendChild(textNoteContinuationNoticeBackward);
+		return textNoteContinuationNoticeBackward;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-continuation-notice-forward}.
+	 *
+	 * @return the element {@odf.element text:note-continuation-notice-forward}
+	 */
+	public TextNoteContinuationNoticeForwardElement newTextNoteContinuationNoticeForwardElement() {
+		TextNoteContinuationNoticeForwardElement textNoteContinuationNoticeForward = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteContinuationNoticeForwardElement.class);
+		this.appendChild(textNoteContinuationNoticeForward);
+		return textNoteContinuationNoticeForward;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNumberElement.java
new file mode 100644
index 0000000..09b78bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNumberElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:number}.
+ *
+ */
+public class TextNumberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "number");
+
+	/**
+	 * Create the instance of <code>TextNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNumberedParagraphElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNumberedParagraphElement.java
new file mode 100644
index 0000000..2557eb0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextNumberedParagraphElement.java
@@ -0,0 +1,260 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextContinueNumberingAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextListIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:numbered-paragraph}.
+ *
+ */
+public class TextNumberedParagraphElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "numbered-paragraph");
+
+	/**
+	 * Create the instance of <code>TextNumberedParagraphElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextNumberedParagraphElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.List, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:numbered-paragraph}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextContinueNumberingAttribute</code> , See {@odf.attribute text:continue-numbering}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextContinueNumberingAttribute() {
+		TextContinueNumberingAttribute attr = (TextContinueNumberingAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "continue-numbering");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextContinueNumberingAttribute</code> , See {@odf.attribute text:continue-numbering}
+	 *
+	 * @param textContinueNumberingValue   The type is <code>Boolean</code>
+	 */
+	public void setTextContinueNumberingAttribute(Boolean textContinueNumberingValue) {
+		TextContinueNumberingAttribute attr = new TextContinueNumberingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textContinueNumberingValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLevelAttribute</code> , See {@odf.attribute text:level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextLevelAttribute() {
+		TextLevelAttribute attr = (TextLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TextLevelAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLevelAttribute</code> , See {@odf.attribute text:level}
+	 *
+	 * @param textLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextLevelAttribute(Integer textLevelValue) {
+		TextLevelAttribute attr = new TextLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextListIdAttribute</code> , See {@odf.attribute text:list-id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextListIdAttribute() {
+		TextListIdAttribute attr = (TextListIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "list-id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextListIdAttribute</code> , See {@odf.attribute text:list-id}
+	 *
+	 * @param textListIdValue   The type is <code>String</code>
+	 */
+	public void setTextListIdAttribute(String textListIdValue) {
+		TextListIdAttribute attr = new TextListIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textListIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextStartValueAttribute() {
+		TextStartValueAttribute attr = (TextStartValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @param textStartValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextStartValueAttribute(Integer textStartValueValue) {
+		TextStartValueAttribute attr = new TextStartValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textStartValueValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:number}.
+	 *
+	 * @return the element {@odf.element text:number}
+	 */
+	public TextNumberElement newTextNumberElement() {
+		TextNumberElement textNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberElement.class);
+		this.appendChild(textNumber);
+		return textNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectCountElement.java
new file mode 100644
index 0000000..0a56511
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:object-count}.
+ *
+ */
+public class TextObjectCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "object-count");
+
+	/**
+	 * Create the instance of <code>TextObjectCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextObjectCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:object-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexElement.java
new file mode 100644
index 0000000..8d8b8c5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:object-index}.
+ *
+ */
+public class TextObjectIndexElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "object-index");
+
+	/**
+	 * Create the instance of <code>TextObjectIndexElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextObjectIndexElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:object-index}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index-source}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:object-index-source}
+	 */
+	public TextObjectIndexSourceElement newTextObjectIndexSourceElement() {
+		TextObjectIndexSourceElement textObjectIndexSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexSourceElement.class);
+		this.appendChild(textObjectIndexSource);
+		return textObjectIndexSource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexEntryTemplateElement.java
new file mode 100644
index 0000000..e1781f0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexEntryTemplateElement.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:object-index-entry-template}.
+ *
+ */
+public class TextObjectIndexEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "object-index-entry-template");
+
+	/**
+	 * Create the instance of <code>TextObjectIndexEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextObjectIndexEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:object-index-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-chapter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:index-entry-chapter}
+	 */
+	public TextIndexEntryChapterElement newTextIndexEntryChapterElement() {
+		TextIndexEntryChapterElement textIndexEntryChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryChapterElement.class);
+		this.appendChild(textIndexEntryChapter);
+		return textIndexEntryChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-page-number}.
+	 *
+	 * @return the element {@odf.element text:index-entry-page-number}
+	 */
+	public TextIndexEntryPageNumberElement newTextIndexEntryPageNumberElement() {
+		TextIndexEntryPageNumberElement textIndexEntryPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryPageNumberElement.class);
+		this.appendChild(textIndexEntryPageNumber);
+		return textIndexEntryPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-text}.
+	 *
+	 * @return the element {@odf.element text:index-entry-text}
+	 */
+	public TextIndexEntryTextElement newTextIndexEntryTextElement() {
+		TextIndexEntryTextElement textIndexEntryText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTextElement.class);
+		this.appendChild(textIndexEntryText);
+		return textIndexEntryText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexSourceElement.java
new file mode 100644
index 0000000..8e0fd7a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextObjectIndexSourceElement.java
@@ -0,0 +1,270 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexScopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRelativeTabStopPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseChartObjectsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseDrawObjectsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseMathObjectsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseOtherObjectsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseSpreadsheetObjectsAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:object-index-source}.
+ *
+ */
+public class TextObjectIndexSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "object-index-source");
+
+	/**
+	 * Create the instance of <code>TextObjectIndexSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextObjectIndexSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:object-index-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexScopeAttribute() {
+		TextIndexScopeAttribute attr = (TextIndexScopeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-scope");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextIndexScopeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @param textIndexScopeValue   The type is <code>String</code>
+	 */
+	public void setTextIndexScopeAttribute(String textIndexScopeValue) {
+		TextIndexScopeAttribute attr = new TextIndexScopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexScopeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRelativeTabStopPositionAttribute() {
+		TextRelativeTabStopPositionAttribute attr = (TextRelativeTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRelativeTabStopPositionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @param textRelativeTabStopPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRelativeTabStopPositionAttribute(Boolean textRelativeTabStopPositionValue) {
+		TextRelativeTabStopPositionAttribute attr = new TextRelativeTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRelativeTabStopPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseChartObjectsAttribute</code> , See {@odf.attribute text:use-chart-objects}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseChartObjectsAttribute() {
+		TextUseChartObjectsAttribute attr = (TextUseChartObjectsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-chart-objects");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseChartObjectsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseChartObjectsAttribute</code> , See {@odf.attribute text:use-chart-objects}
+	 *
+	 * @param textUseChartObjectsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseChartObjectsAttribute(Boolean textUseChartObjectsValue) {
+		TextUseChartObjectsAttribute attr = new TextUseChartObjectsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseChartObjectsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseDrawObjectsAttribute</code> , See {@odf.attribute text:use-draw-objects}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseDrawObjectsAttribute() {
+		TextUseDrawObjectsAttribute attr = (TextUseDrawObjectsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-draw-objects");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseDrawObjectsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseDrawObjectsAttribute</code> , See {@odf.attribute text:use-draw-objects}
+	 *
+	 * @param textUseDrawObjectsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseDrawObjectsAttribute(Boolean textUseDrawObjectsValue) {
+		TextUseDrawObjectsAttribute attr = new TextUseDrawObjectsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseDrawObjectsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseMathObjectsAttribute</code> , See {@odf.attribute text:use-math-objects}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseMathObjectsAttribute() {
+		TextUseMathObjectsAttribute attr = (TextUseMathObjectsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-math-objects");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseMathObjectsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseMathObjectsAttribute</code> , See {@odf.attribute text:use-math-objects}
+	 *
+	 * @param textUseMathObjectsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseMathObjectsAttribute(Boolean textUseMathObjectsValue) {
+		TextUseMathObjectsAttribute attr = new TextUseMathObjectsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseMathObjectsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseOtherObjectsAttribute</code> , See {@odf.attribute text:use-other-objects}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseOtherObjectsAttribute() {
+		TextUseOtherObjectsAttribute attr = (TextUseOtherObjectsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-other-objects");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseOtherObjectsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseOtherObjectsAttribute</code> , See {@odf.attribute text:use-other-objects}
+	 *
+	 * @param textUseOtherObjectsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseOtherObjectsAttribute(Boolean textUseOtherObjectsValue) {
+		TextUseOtherObjectsAttribute attr = new TextUseOtherObjectsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseOtherObjectsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseSpreadsheetObjectsAttribute</code> , See {@odf.attribute text:use-spreadsheet-objects}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseSpreadsheetObjectsAttribute() {
+		TextUseSpreadsheetObjectsAttribute attr = (TextUseSpreadsheetObjectsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-spreadsheet-objects");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseSpreadsheetObjectsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseSpreadsheetObjectsAttribute</code> , See {@odf.attribute text:use-spreadsheet-objects}
+	 *
+	 * @param textUseSpreadsheetObjectsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseSpreadsheetObjectsAttribute(Boolean textUseSpreadsheetObjectsValue) {
+		TextUseSpreadsheetObjectsAttribute attr = new TextUseSpreadsheetObjectsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseSpreadsheetObjectsValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index-entry-template}.
+	 *
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:object-index-entry-template}
+	 */
+	 public TextObjectIndexEntryTemplateElement newTextObjectIndexEntryTemplateElement(String textStyleNameValue) {
+		TextObjectIndexEntryTemplateElement textObjectIndexEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexEntryTemplateElement.class);
+		textObjectIndexEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textObjectIndexEntryTemplate);
+		return textObjectIndexEntryTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextOutlineLevelStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextOutlineLevelStyleElement.java
new file mode 100644
index 0000000..ffcb9a6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextOutlineLevelStyleElement.java
@@ -0,0 +1,302 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumPrefixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumSuffixAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayLevelsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStartValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:outline-level-style}.
+ *
+ */
+public class TextOutlineLevelStyleElement extends OdfStyleBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "outline-level-style");
+
+	/**
+	 * Create the instance of <code>TextOutlineLevelStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextOutlineLevelStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:outline-level-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumPrefixAttribute() {
+		StyleNumPrefixAttribute attr = (StyleNumPrefixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-prefix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumPrefixAttribute</code> , See {@odf.attribute style:num-prefix}
+	 *
+	 * @param styleNumPrefixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumPrefixAttribute(String styleNumPrefixValue) {
+		StyleNumPrefixAttribute attr = new StyleNumPrefixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumPrefixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumSuffixAttribute() {
+		StyleNumSuffixAttribute attr = (StyleNumSuffixAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-suffix");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumSuffixAttribute</code> , See {@odf.attribute style:num-suffix}
+	 *
+	 * @param styleNumSuffixValue   The type is <code>String</code>
+	 */
+	public void setStyleNumSuffixAttribute(String styleNumSuffixValue) {
+		StyleNumSuffixAttribute attr = new StyleNumSuffixAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumSuffixValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayLevelsAttribute</code> , See {@odf.attribute text:display-levels}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextDisplayLevelsAttribute() {
+		TextDisplayLevelsAttribute attr = (TextDisplayLevelsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display-levels");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TextDisplayLevelsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayLevelsAttribute</code> , See {@odf.attribute text:display-levels}
+	 *
+	 * @param textDisplayLevelsValue   The type is <code>Integer</code>
+	 */
+	public void setTextDisplayLevelsAttribute(Integer textDisplayLevelsValue) {
+		TextDisplayLevelsAttribute attr = new TextDisplayLevelsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textDisplayLevelsValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextLevelAttribute</code> , See {@odf.attribute text:level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextLevelAttribute() {
+		TextLevelAttribute attr = (TextLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextLevelAttribute</code> , See {@odf.attribute text:level}
+	 *
+	 * @param textLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextLevelAttribute(Integer textLevelValue) {
+		TextLevelAttribute attr = new TextLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextStartValueAttribute() {
+		TextStartValueAttribute attr = (TextStartValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "start-value");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return Integer.valueOf(TextStartValueAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStartValueAttribute</code> , See {@odf.attribute text:start-value}
+	 *
+	 * @param textStartValueValue   The type is <code>Integer</code>
+	 */
+	public void setTextStartValueAttribute(Integer textStartValueValue) {
+		TextStartValueAttribute attr = new TextStartValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textStartValueValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element style:list-level-properties}.
+	 *
+	 * @return the element {@odf.element style:list-level-properties}
+	 */
+	public StyleListLevelPropertiesElement newStyleListLevelPropertiesElement() {
+		StyleListLevelPropertiesElement styleListLevelProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleListLevelPropertiesElement.class);
+		this.appendChild(styleListLevelProperties);
+		return styleListLevelProperties;
+	}
+
+	/**
+	 * Create child element {@odf.element style:text-properties}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @return the element {@odf.element style:text-properties}
+	 */
+	 public StyleTextPropertiesElement newStyleTextPropertiesElement(String textDisplayValue) {
+		StyleTextPropertiesElement styleTextProperties = ((OdfFileDom) this.ownerDocument).newOdfElement(StyleTextPropertiesElement.class);
+		styleTextProperties.setTextDisplayAttribute(textDisplayValue);
+		this.appendChild(styleTextProperties);
+		return styleTextProperties;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextOutlineStyleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextOutlineStyleElement.java
new file mode 100644
index 0000000..ef8c652
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextOutlineStyleElement.java
@@ -0,0 +1,115 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:outline-style}.
+ *
+ */
+public class TextOutlineStyleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "outline-style");
+
+	/**
+	 * Create the instance of <code>TextOutlineStyleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextOutlineStyleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:outline-style}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNameAttribute() {
+		StyleNameAttribute attr = (StyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNameAttribute</code> , See {@odf.attribute style:name}
+	 *
+	 * @param styleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleNameAttribute(String styleNameValue) {
+		StyleNameAttribute attr = new StyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:outline-level-style}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textLevelValue  the <code>Integer</code> value of <code>TextLevelAttribute</code>, see {@odf.attribute  text:level} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:outline-level-style}
+	 */
+	 public TextOutlineLevelStyleElement newTextOutlineLevelStyleElement(String styleNumFormatValue, int textLevelValue) {
+		TextOutlineLevelStyleElement textOutlineLevelStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextOutlineLevelStyleElement.class);
+		textOutlineLevelStyle.setStyleNumFormatAttribute(styleNumFormatValue);
+		textOutlineLevelStyle.setTextLevelAttribute(textLevelValue);
+		this.appendChild(textOutlineLevelStyle);
+		return textOutlineLevelStyle;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPElement.java
new file mode 100644
index 0000000..6ce506c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPElement.java
@@ -0,0 +1,1694 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:p}.
+ *
+ */
+public class TextPElement extends TextParagraphElementBase {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "p");
+
+	/**
+	 * Create the instance of <code>TextPElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:p}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:a}
+	 */
+	 public TextAElement newTextAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAElement textA = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAElement.class);
+		textA.setXlinkHrefAttribute(xlinkHrefValue);
+		textA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textA);
+		return textA;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageContinuationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageContinuationElement.java
new file mode 100644
index 0000000..7ba6bd6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageContinuationElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSelectPageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page-continuation}.
+ *
+ */
+public class TextPageContinuationElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-continuation");
+
+	/**
+	 * Create the instance of <code>TextPageContinuationElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageContinuationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page-continuation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSelectPageAttribute</code> , See {@odf.attribute text:select-page}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSelectPageAttribute() {
+		TextSelectPageAttribute attr = (TextSelectPageAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "select-page");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSelectPageAttribute</code> , See {@odf.attribute text:select-page}
+	 *
+	 * @param textSelectPageValue   The type is <code>String</code>
+	 */
+	public void setTextSelectPageAttribute(String textSelectPageValue) {
+		TextSelectPageAttribute attr = new TextSelectPageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSelectPageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueAttribute() {
+		TextStringValueAttribute attr = (TextStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * @param textStringValueValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueAttribute(String textStringValueValue) {
+		TextStringValueAttribute attr = new TextStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageCountElement.java
new file mode 100644
index 0000000..7d85cc2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page-count}.
+ *
+ */
+public class TextPageCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-count");
+
+	/**
+	 * Create the instance of <code>TextPageCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageElement.java
new file mode 100644
index 0000000..e0a9c9e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextMasterPageNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page}.
+ *
+ */
+public class TextPageElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page");
+
+	/**
+	 * Create the instance of <code>TextPageElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextMasterPageNameAttribute</code> , See {@odf.attribute text:master-page-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextMasterPageNameAttribute() {
+		TextMasterPageNameAttribute attr = (TextMasterPageNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "master-page-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextMasterPageNameAttribute</code> , See {@odf.attribute text:master-page-name}
+	 *
+	 * @param textMasterPageNameValue   The type is <code>String</code>
+	 */
+	public void setTextMasterPageNameAttribute(String textMasterPageNameValue) {
+		TextMasterPageNameAttribute attr = new TextMasterPageNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textMasterPageNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageNumberElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageNumberElement.java
new file mode 100644
index 0000000..9e91472
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageNumberElement.java
@@ -0,0 +1,206 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextPageAdjustAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSelectPageAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page-number}.
+ *
+ */
+public class TextPageNumberElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-number");
+
+	/**
+	 * Create the instance of <code>TextPageNumberElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageNumberElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page-number}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextPageAdjustAttribute</code> , See {@odf.attribute text:page-adjust}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextPageAdjustAttribute() {
+		TextPageAdjustAttribute attr = (TextPageAdjustAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "page-adjust");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextPageAdjustAttribute</code> , See {@odf.attribute text:page-adjust}
+	 *
+	 * @param textPageAdjustValue   The type is <code>Integer</code>
+	 */
+	public void setTextPageAdjustAttribute(Integer textPageAdjustValue) {
+		TextPageAdjustAttribute attr = new TextPageAdjustAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textPageAdjustValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSelectPageAttribute</code> , See {@odf.attribute text:select-page}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSelectPageAttribute() {
+		TextSelectPageAttribute attr = (TextSelectPageAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "select-page");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSelectPageAttribute</code> , See {@odf.attribute text:select-page}
+	 *
+	 * @param textSelectPageValue   The type is <code>String</code>
+	 */
+	public void setTextSelectPageAttribute(String textSelectPageValue) {
+		TextSelectPageAttribute attr = new TextSelectPageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSelectPageValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageSequenceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageSequenceElement.java
new file mode 100644
index 0000000..6fc75f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageSequenceElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page-sequence}.
+ *
+ */
+public class TextPageSequenceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-sequence");
+
+	/**
+	 * Create the instance of <code>TextPageSequenceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageSequenceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page-sequence}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page}.
+	 *
+	 * @param textMasterPageNameValue  the <code>String</code> value of <code>TextMasterPageNameAttribute</code>, see {@odf.attribute  text:master-page-name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:page}
+	 */
+	 public TextPageElement newTextPageElement(String textMasterPageNameValue) {
+		TextPageElement textPage = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageElement.class);
+		textPage.setTextMasterPageNameAttribute(textMasterPageNameValue);
+		this.appendChild(textPage);
+		return textPage;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageVariableGetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageVariableGetElement.java
new file mode 100644
index 0000000..a0337c6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageVariableGetElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page-variable-get}.
+ *
+ */
+public class TextPageVariableGetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-variable-get");
+
+	/**
+	 * Create the instance of <code>TextPageVariableGetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageVariableGetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page-variable-get}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageVariableSetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageVariableSetElement.java
new file mode 100644
index 0000000..7da7557
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPageVariableSetElement.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextActiveAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextPageAdjustAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:page-variable-set}.
+ *
+ */
+public class TextPageVariableSetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "page-variable-set");
+
+	/**
+	 * Create the instance of <code>TextPageVariableSetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPageVariableSetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:page-variable-set}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextActiveAttribute</code> , See {@odf.attribute text:active}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextActiveAttribute() {
+		TextActiveAttribute attr = (TextActiveAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "active");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextActiveAttribute</code> , See {@odf.attribute text:active}
+	 *
+	 * @param textActiveValue   The type is <code>Boolean</code>
+	 */
+	public void setTextActiveAttribute(Boolean textActiveValue) {
+		TextActiveAttribute attr = new TextActiveAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textActiveValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextPageAdjustAttribute</code> , See {@odf.attribute text:page-adjust}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextPageAdjustAttribute() {
+		TextPageAdjustAttribute attr = (TextPageAdjustAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "page-adjust");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextPageAdjustAttribute</code> , See {@odf.attribute text:page-adjust}
+	 *
+	 * @param textPageAdjustValue   The type is <code>Integer</code>
+	 */
+	public void setTextPageAdjustAttribute(Integer textPageAdjustValue) {
+		TextPageAdjustAttribute attr = new TextPageAdjustAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textPageAdjustValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextParagraphCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextParagraphCountElement.java
new file mode 100644
index 0000000..2da3b0e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextParagraphCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:paragraph-count}.
+ *
+ */
+public class TextParagraphCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "paragraph-count");
+
+	/**
+	 * Create the instance of <code>TextParagraphCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextParagraphCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:paragraph-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextParagraphElementBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextParagraphElementBase.java
new file mode 100644
index 0000000..ea2b950
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextParagraphElementBase.java
@@ -0,0 +1,302 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCondStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlAboutAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlContentAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlDatatypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xhtml.XhtmlPropertyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument base element
+ *
+ */
+public abstract class TextParagraphElementBase extends OdfStylableElement {
+
+	/**
+	 * Create the instance of <code>TextParagraphElementBase</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextParagraphElementBase(OdfFileDom ownerDoc, OdfName elementName, OdfStyleFamily styleFamily, OdfName styleAttrName) {
+		super(ownerDoc, elementName, styleFamily, styleAttrName);
+	}
+
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextClassNamesAttribute</code> , See {@odf.attribute text:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextClassNamesAttribute() {
+		TextClassNamesAttribute attr = (TextClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextClassNamesAttribute</code> , See {@odf.attribute text:class-names}
+	 *
+	 * @param textClassNamesValue   The type is <code>String</code>
+	 */
+	public void setTextClassNamesAttribute(String textClassNamesValue) {
+		TextClassNamesAttribute attr = new TextClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCondStyleNameAttribute</code> , See {@odf.attribute text:cond-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCondStyleNameAttribute() {
+		TextCondStyleNameAttribute attr = (TextCondStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "cond-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCondStyleNameAttribute</code> , See {@odf.attribute text:cond-style-name}
+	 *
+	 * @param textCondStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextCondStyleNameAttribute(String textCondStyleNameValue) {
+		TextCondStyleNameAttribute attr = new TextCondStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCondStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlAboutAttribute() {
+		XhtmlAboutAttribute attr = (XhtmlAboutAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "about");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlAboutAttribute</code> , See {@odf.attribute xhtml:about}
+	 *
+	 * @param xhtmlAboutValue   The type is <code>String</code>
+	 */
+	public void setXhtmlAboutAttribute(String xhtmlAboutValue) {
+		XhtmlAboutAttribute attr = new XhtmlAboutAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlAboutValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlContentAttribute() {
+		XhtmlContentAttribute attr = (XhtmlContentAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "content");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlContentAttribute</code> , See {@odf.attribute xhtml:content}
+	 *
+	 * @param xhtmlContentValue   The type is <code>String</code>
+	 */
+	public void setXhtmlContentAttribute(String xhtmlContentValue) {
+		XhtmlContentAttribute attr = new XhtmlContentAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlContentValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlDatatypeAttribute() {
+		XhtmlDatatypeAttribute attr = (XhtmlDatatypeAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "datatype");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlDatatypeAttribute</code> , See {@odf.attribute xhtml:datatype}
+	 *
+	 * @param xhtmlDatatypeValue   The type is <code>String</code>
+	 */
+	public void setXhtmlDatatypeAttribute(String xhtmlDatatypeValue) {
+		XhtmlDatatypeAttribute attr = new XhtmlDatatypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlDatatypeValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXhtmlPropertyAttribute() {
+		XhtmlPropertyAttribute attr = (XhtmlPropertyAttribute) getOdfAttribute(OdfDocumentNamespace.XHTML, "property");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XhtmlPropertyAttribute</code> , See {@odf.attribute xhtml:property}
+	 *
+	 * @param xhtmlPropertyValue   The type is <code>String</code>
+	 */
+	public void setXhtmlPropertyAttribute(String xhtmlPropertyValue) {
+		XhtmlPropertyAttribute attr = new XhtmlPropertyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xhtmlPropertyValue);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+	
+	/**
+	* Set text content. Only elements which are allowed to have text content offer this method.
+	*
+	*/
+	public void setTextContent(String content){
+		super.setTextContent(content);
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+
+	protected void onRemoveNode() {
+		super.onRemoveNode();
+		((OdfFileDom) this.ownerDocument).getInContentMetadataCache().remove(this);
+	}
+
+	protected void onInsertNode() {
+		super.onInsertNode();
+		((OdfFileDom) this.ownerDocument).updateInContentMetadataCache(this);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPlaceholderElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPlaceholderElement.java
new file mode 100644
index 0000000..b45fd1c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPlaceholderElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextPlaceholderTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:placeholder}.
+ *
+ */
+public class TextPlaceholderElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "placeholder");
+
+	/**
+	 * Create the instance of <code>TextPlaceholderElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPlaceholderElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:placeholder}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDescriptionAttribute() {
+		TextDescriptionAttribute attr = (TextDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @param textDescriptionValue   The type is <code>String</code>
+	 */
+	public void setTextDescriptionAttribute(String textDescriptionValue) {
+		TextDescriptionAttribute attr = new TextDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextPlaceholderTypeAttribute</code> , See {@odf.attribute text:placeholder-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextPlaceholderTypeAttribute() {
+		TextPlaceholderTypeAttribute attr = (TextPlaceholderTypeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "placeholder-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextPlaceholderTypeAttribute</code> , See {@odf.attribute text:placeholder-type}
+	 *
+	 * @param textPlaceholderTypeValue   The type is <code>String</code>
+	 */
+	public void setTextPlaceholderTypeAttribute(String textPlaceholderTypeValue) {
+		TextPlaceholderTypeAttribute attr = new TextPlaceholderTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textPlaceholderTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintDateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintDateElement.java
new file mode 100644
index 0000000..f4e586a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintDateElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:print-date}.
+ *
+ */
+public class TextPrintDateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "print-date");
+
+	/**
+	 * Create the instance of <code>TextPrintDateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPrintDateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:print-date}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDateValueAttribute() {
+		TextDateValueAttribute attr = (TextDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDateValueAttribute</code> , See {@odf.attribute text:date-value}
+	 *
+	 * @param textDateValueValue   The type is <code>String</code>
+	 */
+	public void setTextDateValueAttribute(String textDateValueValue) {
+		TextDateValueAttribute attr = new TextDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintTimeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintTimeElement.java
new file mode 100644
index 0000000..826b9bb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintTimeElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTimeValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:print-time}.
+ *
+ */
+public class TextPrintTimeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "print-time");
+
+	/**
+	 * Create the instance of <code>TextPrintTimeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPrintTimeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:print-time}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTimeValueAttribute() {
+		TextTimeValueAttribute attr = (TextTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @param textTimeValueValue   The type is <code>String</code>
+	 */
+	public void setTextTimeValueAttribute(String textTimeValueValue) {
+		TextTimeValueAttribute attr = new TextTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTimeValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintedByElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintedByElement.java
new file mode 100644
index 0000000..c212b7c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextPrintedByElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:printed-by}.
+ *
+ */
+public class TextPrintedByElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "printed-by");
+
+	/**
+	 * Create the instance of <code>TextPrintedByElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextPrintedByElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:printed-by}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkElement.java
new file mode 100644
index 0000000..5d35ea6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:reference-mark}.
+ *
+ */
+public class TextReferenceMarkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "reference-mark");
+
+	/**
+	 * Create the instance of <code>TextReferenceMarkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextReferenceMarkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:reference-mark}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkEndElement.java
new file mode 100644
index 0000000..11bbc12
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:reference-mark-end}.
+ *
+ */
+public class TextReferenceMarkEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "reference-mark-end");
+
+	/**
+	 * Create the instance of <code>TextReferenceMarkEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextReferenceMarkEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:reference-mark-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkStartElement.java
new file mode 100644
index 0000000..84849fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceMarkStartElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:reference-mark-start}.
+ *
+ */
+public class TextReferenceMarkStartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "reference-mark-start");
+
+	/**
+	 * Create the instance of <code>TextReferenceMarkStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextReferenceMarkStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:reference-mark-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceRefElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceRefElement.java
new file mode 100644
index 0000000..fbced5f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextReferenceRefElement.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRefNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextReferenceFormatAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:reference-ref}.
+ *
+ */
+public class TextReferenceRefElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "reference-ref");
+
+	/**
+	 * Create the instance of <code>TextReferenceRefElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextReferenceRefElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:reference-ref}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextRefNameAttribute() {
+		TextRefNameAttribute attr = (TextRefNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "ref-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @param textRefNameValue   The type is <code>String</code>
+	 */
+	public void setTextRefNameAttribute(String textRefNameValue) {
+		TextRefNameAttribute attr = new TextRefNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textRefNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextReferenceFormatAttribute() {
+		TextReferenceFormatAttribute attr = (TextReferenceFormatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "reference-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @param textReferenceFormatValue   The type is <code>String</code>
+	 */
+	public void setTextReferenceFormatAttribute(String textReferenceFormatValue) {
+		TextReferenceFormatAttribute attr = new TextReferenceFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textReferenceFormatValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyBaseElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyBaseElement.java
new file mode 100644
index 0000000..6986df5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyBaseElement.java
@@ -0,0 +1,1692 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:ruby-base}.
+ *
+ */
+public class TextRubyBaseElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "ruby-base");
+
+	/**
+	 * Create the instance of <code>TextRubyBaseElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextRubyBaseElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:ruby-base}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:a}
+	 */
+	 public TextAElement newTextAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAElement textA = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAElement.class);
+		textA.setXlinkHrefAttribute(xlinkHrefValue);
+		textA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textA);
+		return textA;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyElement.java
new file mode 100644
index 0000000..522f14a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyElement.java
@@ -0,0 +1,124 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:ruby}.
+ *
+ */
+public class TextRubyElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "ruby");
+
+	/**
+	 * Create the instance of <code>TextRubyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextRubyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Ruby, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:ruby}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby-base}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:ruby-base}
+	 */
+	public TextRubyBaseElement newTextRubyBaseElement() {
+		TextRubyBaseElement textRubyBase = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyBaseElement.class);
+		this.appendChild(textRubyBase);
+		return textRubyBase;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby-text}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:ruby-text}
+	 */
+	public TextRubyTextElement newTextRubyTextElement() {
+		TextRubyTextElement textRubyText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyTextElement.class);
+		this.appendChild(textRubyText);
+		return textRubyText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyTextElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyTextElement.java
new file mode 100644
index 0000000..8ffdcac
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextRubyTextElement.java
@@ -0,0 +1,106 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:ruby-text}.
+ *
+ */
+public class TextRubyTextElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "ruby-text");
+
+	/**
+	 * Create the instance of <code>TextRubyTextElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextRubyTextElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Ruby, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:ruby-text}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSElement.java
new file mode 100644
index 0000000..ee42d92
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:s}.
+ *
+ */
+public class TextSElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "s");
+
+	/**
+	 * Create the instance of <code>TextSElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:s}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCAttribute</code> , See {@odf.attribute text:c}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextCAttribute() {
+		TextCAttribute attr = (TextCAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "c");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCAttribute</code> , See {@odf.attribute text:c}
+	 *
+	 * @param textCValue   The type is <code>Integer</code>
+	 */
+	public void setTextCAttribute(Integer textCValue) {
+		TextCAttribute attr = new TextCAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textCValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextScriptElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextScriptElement.java
new file mode 100644
index 0000000..c727097
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextScriptElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.script.ScriptLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:script}.
+ *
+ */
+public class TextScriptElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "script");
+
+	/**
+	 * Create the instance of <code>TextScriptElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextScriptElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:script}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ScriptLanguageAttribute</code> , See {@odf.attribute script:language}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getScriptLanguageAttribute() {
+		ScriptLanguageAttribute attr = (ScriptLanguageAttribute) getOdfAttribute(OdfDocumentNamespace.SCRIPT, "language");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ScriptLanguageAttribute</code> , See {@odf.attribute script:language}
+	 *
+	 * @param scriptLanguageValue   The type is <code>String</code>
+	 */
+	public void setScriptLanguageAttribute(String scriptLanguageValue) {
+		ScriptLanguageAttribute attr = new ScriptLanguageAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(scriptLanguageValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSectionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSectionElement.java
new file mode 100644
index 0000000..f7343ee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSectionElement.java
@@ -0,0 +1,778 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDdeSourceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextConditionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:section}.
+ *
+ */
+public class TextSectionElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "section");
+
+	/**
+	 * Create the instance of <code>TextSectionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSectionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:section}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextConditionAttribute() {
+		TextConditionAttribute attr = (TextConditionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "condition");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextConditionAttribute</code> , See {@odf.attribute text:condition}
+	 *
+	 * @param textConditionValue   The type is <code>String</code>
+	 */
+	public void setTextConditionAttribute(String textConditionValue) {
+		TextConditionAttribute attr = new TextConditionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textConditionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:dde-source}.
+	 *
+	 * @param officeDdeApplicationValue  the <code>String</code> value of <code>OfficeDdeApplicationAttribute</code>, see {@odf.attribute  office:dde-application} at specification
+	 * @param officeDdeItemValue  the <code>String</code> value of <code>OfficeDdeItemAttribute</code>, see {@odf.attribute  office:dde-item} at specification
+	 * @param officeDdeTopicValue  the <code>String</code> value of <code>OfficeDdeTopicAttribute</code>, see {@odf.attribute  office:dde-topic} at specification
+	 * @return the element {@odf.element office:dde-source}
+	 */
+	 public OfficeDdeSourceElement newOfficeDdeSourceElement(String officeDdeApplicationValue, String officeDdeItemValue, String officeDdeTopicValue) {
+		OfficeDdeSourceElement officeDdeSource = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeDdeSourceElement.class);
+		officeDdeSource.setOfficeDdeApplicationAttribute(officeDdeApplicationValue);
+		officeDdeSource.setOfficeDdeItemAttribute(officeDdeItemValue);
+		officeDdeSource.setOfficeDdeTopicAttribute(officeDdeTopicValue);
+		this.appendChild(officeDdeSource);
+		return officeDdeSource;
+	}
+
+	/**
+	 * Create child element {@odf.element table:table}.
+	 *
+	 * @return the element {@odf.element table:table}
+	 */
+	public TableTableElement newTableTableElement() {
+		TableTableElement tableTable = ((OdfFileDom) this.ownerDocument).newOdfElement(TableTableElement.class);
+		this.appendChild(tableTable);
+		return tableTable;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:alphabetical-index}
+	 */
+	 public TextAlphabeticalIndexElement newTextAlphabeticalIndexElement(String textNameValue) {
+		TextAlphabeticalIndexElement textAlphabeticalIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexElement.class);
+		textAlphabeticalIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textAlphabeticalIndex);
+		return textAlphabeticalIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bibliography}
+	 */
+	 public TextBibliographyElement newTextBibliographyElement(String textNameValue) {
+		TextBibliographyElement textBibliography = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyElement.class);
+		textBibliography.setTextNameAttribute(textNameValue);
+		this.appendChild(textBibliography);
+		return textBibliography;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:h}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:h}
+	 */
+	 public TextHElement newTextHElement(int textOutlineLevelValue) {
+		TextHElement textH = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHElement.class);
+		textH.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textH);
+		return textH;
+	}
+
+	/**
+	 * Create child element {@odf.element text:illustration-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:illustration-index}
+	 */
+	 public TextIllustrationIndexElement newTextIllustrationIndexElement(String textNameValue) {
+		TextIllustrationIndexElement textIllustrationIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIllustrationIndexElement.class);
+		textIllustrationIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textIllustrationIndex);
+		return textIllustrationIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:list}.
+	 *
+	 * @return the element {@odf.element text:list}
+	 */
+	public TextListElement newTextListElement() {
+		TextListElement textList = ((OdfFileDom) this.ownerDocument).newOdfElement(TextListElement.class);
+		this.appendChild(textList);
+		return textList;
+	}
+
+	/**
+	 * Create child element {@odf.element text:numbered-paragraph}.
+	 *
+	 * @param textListIdValue  the <code>String</code> value of <code>TextListIdAttribute</code>, see {@odf.attribute  text:list-id} at specification
+	 * @return the element {@odf.element text:numbered-paragraph}
+	 */
+	 public TextNumberedParagraphElement newTextNumberedParagraphElement(String textListIdValue) {
+		TextNumberedParagraphElement textNumberedParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNumberedParagraphElement.class);
+		textNumberedParagraph.setTextListIdAttribute(textListIdValue);
+		this.appendChild(textNumberedParagraph);
+		return textNumberedParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:object-index}
+	 */
+	 public TextObjectIndexElement newTextObjectIndexElement(String textNameValue) {
+		TextObjectIndexElement textObjectIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectIndexElement.class);
+		textObjectIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textObjectIndex);
+		return textObjectIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:p}.
+	 *
+	 * @return the element {@odf.element text:p}
+	 */
+	public TextPElement newTextPElement() {
+		TextPElement textP = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPElement.class);
+		this.appendChild(textP);
+		return textP;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:section}
+	 */
+	 public TextSectionElement newTextSectionElement(String textDisplayValue, String textNameValue) {
+		TextSectionElement textSection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionElement.class);
+		textSection.setTextDisplayAttribute(textDisplayValue);
+		textSection.setTextNameAttribute(textNameValue);
+		this.appendChild(textSection);
+		return textSection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:section-source}.
+	 *
+	 * @return the element {@odf.element text:section-source}
+	 */
+	public TextSectionSourceElement newTextSectionSourceElement() {
+		TextSectionSourceElement textSectionSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSectionSourceElement.class);
+		this.appendChild(textSectionSource);
+		return textSectionSource;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-index}
+	 */
+	 public TextTableIndexElement newTextTableIndexElement(String textNameValue) {
+		TextTableIndexElement textTableIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexElement.class);
+		textTableIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableIndex);
+		return textTableIndex;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:table-of-content}
+	 */
+	 public TextTableOfContentElement newTextTableOfContentElement(String textNameValue) {
+		TextTableOfContentElement textTableOfContent = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentElement.class);
+		textTableOfContent.setTextNameAttribute(textNameValue);
+		this.appendChild(textTableOfContent);
+		return textTableOfContent;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-index}
+	 */
+	 public TextUserIndexElement newTextUserIndexElement(String textNameValue) {
+		TextUserIndexElement textUserIndex = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexElement.class);
+		textUserIndex.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserIndex);
+		return textUserIndex;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSectionSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSectionSourceElement.java
new file mode 100644
index 0000000..f137012
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSectionSourceElement.java
@@ -0,0 +1,196 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFilterNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSectionNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkHrefAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkShowAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xlink.XlinkTypeAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:section-source}.
+ *
+ */
+public class TextSectionSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "section-source");
+
+	/**
+	 * Create the instance of <code>TextSectionSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSectionSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:section-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFilterNameAttribute</code> , See {@odf.attribute text:filter-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFilterNameAttribute() {
+		TextFilterNameAttribute attr = (TextFilterNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "filter-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFilterNameAttribute</code> , See {@odf.attribute text:filter-name}
+	 *
+	 * @param textFilterNameValue   The type is <code>String</code>
+	 */
+	public void setTextFilterNameAttribute(String textFilterNameValue) {
+		TextFilterNameAttribute attr = new TextFilterNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFilterNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSectionNameAttribute</code> , See {@odf.attribute text:section-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSectionNameAttribute() {
+		TextSectionNameAttribute attr = (TextSectionNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "section-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSectionNameAttribute</code> , See {@odf.attribute text:section-name}
+	 *
+	 * @param textSectionNameValue   The type is <code>String</code>
+	 */
+	public void setTextSectionNameAttribute(String textSectionNameValue) {
+		TextSectionNameAttribute attr = new TextSectionNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSectionNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkHrefAttribute() {
+		XlinkHrefAttribute attr = (XlinkHrefAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "href");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkHrefAttribute</code> , See {@odf.attribute xlink:href}
+	 *
+	 * @param xlinkHrefValue   The type is <code>String</code>
+	 */
+	public void setXlinkHrefAttribute(String xlinkHrefValue) {
+		XlinkHrefAttribute attr = new XlinkHrefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkHrefValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkShowAttribute() {
+		XlinkShowAttribute attr = (XlinkShowAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "show");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkShowAttribute.DEFAULT_VALUE_EMBED;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkShowAttribute</code> , See {@odf.attribute xlink:show}
+	 *
+	 * @param xlinkShowValue   The type is <code>String</code>
+	 */
+	public void setXlinkShowAttribute(String xlinkShowValue) {
+		XlinkShowAttribute attr = new XlinkShowAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkShowValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXlinkTypeAttribute() {
+		XlinkTypeAttribute attr = (XlinkTypeAttribute) getOdfAttribute(OdfDocumentNamespace.XLINK, "type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return XlinkTypeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XlinkTypeAttribute</code> , See {@odf.attribute xlink:type}
+	 *
+	 * @param xlinkTypeValue   The type is <code>String</code>
+	 */
+	public void setXlinkTypeAttribute(String xlinkTypeValue) {
+		XlinkTypeAttribute attr = new XlinkTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xlinkTypeValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCityElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCityElement.java
new file mode 100644
index 0000000..27376aa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCityElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-city}.
+ *
+ */
+public class TextSenderCityElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-city");
+
+	/**
+	 * Create the instance of <code>TextSenderCityElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderCityElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-city}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCompanyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCompanyElement.java
new file mode 100644
index 0000000..71dcecf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCompanyElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-company}.
+ *
+ */
+public class TextSenderCompanyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-company");
+
+	/**
+	 * Create the instance of <code>TextSenderCompanyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderCompanyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-company}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCountryElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCountryElement.java
new file mode 100644
index 0000000..1bae595
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderCountryElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-country}.
+ *
+ */
+public class TextSenderCountryElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-country");
+
+	/**
+	 * Create the instance of <code>TextSenderCountryElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderCountryElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-country}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderEmailElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderEmailElement.java
new file mode 100644
index 0000000..f55b30d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderEmailElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-email}.
+ *
+ */
+public class TextSenderEmailElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-email");
+
+	/**
+	 * Create the instance of <code>TextSenderEmailElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderEmailElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-email}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderFaxElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderFaxElement.java
new file mode 100644
index 0000000..5811a7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderFaxElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-fax}.
+ *
+ */
+public class TextSenderFaxElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-fax");
+
+	/**
+	 * Create the instance of <code>TextSenderFaxElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderFaxElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-fax}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderFirstnameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderFirstnameElement.java
new file mode 100644
index 0000000..e320459
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderFirstnameElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-firstname}.
+ *
+ */
+public class TextSenderFirstnameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-firstname");
+
+	/**
+	 * Create the instance of <code>TextSenderFirstnameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderFirstnameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-firstname}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderInitialsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderInitialsElement.java
new file mode 100644
index 0000000..0debda1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderInitialsElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-initials}.
+ *
+ */
+public class TextSenderInitialsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-initials");
+
+	/**
+	 * Create the instance of <code>TextSenderInitialsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderInitialsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-initials}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderLastnameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderLastnameElement.java
new file mode 100644
index 0000000..1ba3e2d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderLastnameElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-lastname}.
+ *
+ */
+public class TextSenderLastnameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-lastname");
+
+	/**
+	 * Create the instance of <code>TextSenderLastnameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderLastnameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-lastname}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPhonePrivateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPhonePrivateElement.java
new file mode 100644
index 0000000..7c70b7b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPhonePrivateElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-phone-private}.
+ *
+ */
+public class TextSenderPhonePrivateElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-phone-private");
+
+	/**
+	 * Create the instance of <code>TextSenderPhonePrivateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderPhonePrivateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-phone-private}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPhoneWorkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPhoneWorkElement.java
new file mode 100644
index 0000000..b2f32dd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPhoneWorkElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-phone-work}.
+ *
+ */
+public class TextSenderPhoneWorkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-phone-work");
+
+	/**
+	 * Create the instance of <code>TextSenderPhoneWorkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderPhoneWorkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-phone-work}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPositionElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPositionElement.java
new file mode 100644
index 0000000..edf76e6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPositionElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-position}.
+ *
+ */
+public class TextSenderPositionElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-position");
+
+	/**
+	 * Create the instance of <code>TextSenderPositionElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderPositionElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-position}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPostalCodeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPostalCodeElement.java
new file mode 100644
index 0000000..7ed1a68
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderPostalCodeElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-postal-code}.
+ *
+ */
+public class TextSenderPostalCodeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-postal-code");
+
+	/**
+	 * Create the instance of <code>TextSenderPostalCodeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderPostalCodeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-postal-code}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderStateOrProvinceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderStateOrProvinceElement.java
new file mode 100644
index 0000000..82ff37e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderStateOrProvinceElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-state-or-province}.
+ *
+ */
+public class TextSenderStateOrProvinceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-state-or-province");
+
+	/**
+	 * Create the instance of <code>TextSenderStateOrProvinceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderStateOrProvinceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-state-or-province}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderStreetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderStreetElement.java
new file mode 100644
index 0000000..11d6826
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderStreetElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-street}.
+ *
+ */
+public class TextSenderStreetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-street");
+
+	/**
+	 * Create the instance of <code>TextSenderStreetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderStreetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-street}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderTitleElement.java
new file mode 100644
index 0000000..0c549e2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSenderTitleElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sender-title}.
+ *
+ */
+public class TextSenderTitleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sender-title");
+
+	/**
+	 * Create the instance of <code>TextSenderTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSenderTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sender-title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceDeclElement.java
new file mode 100644
index 0000000..8e1b26b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceDeclElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSeparationCharacterAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sequence-decl}.
+ *
+ */
+public class TextSequenceDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sequence-decl");
+
+	/**
+	 * Create the instance of <code>TextSequenceDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSequenceDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sequence-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayOutlineLevelAttribute</code> , See {@odf.attribute text:display-outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextDisplayOutlineLevelAttribute() {
+		TextDisplayOutlineLevelAttribute attr = (TextDisplayOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display-outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayOutlineLevelAttribute</code> , See {@odf.attribute text:display-outline-level}
+	 *
+	 * @param textDisplayOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextDisplayOutlineLevelAttribute(Integer textDisplayOutlineLevelValue) {
+		TextDisplayOutlineLevelAttribute attr = new TextDisplayOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textDisplayOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSeparationCharacterAttribute</code> , See {@odf.attribute text:separation-character}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextSeparationCharacterAttribute() {
+		TextSeparationCharacterAttribute attr = (TextSeparationCharacterAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "separation-character");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSeparationCharacterAttribute</code> , See {@odf.attribute text:separation-character}
+	 *
+	 * @param textSeparationCharacterValue   The type is <code>String</code>
+	 */
+	public void setTextSeparationCharacterAttribute(String textSeparationCharacterValue) {
+		TextSeparationCharacterAttribute attr = new TextSeparationCharacterAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textSeparationCharacterValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceDeclsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceDeclsElement.java
new file mode 100644
index 0000000..bfff366
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceDeclsElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sequence-decls}.
+ *
+ */
+public class TextSequenceDeclsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sequence-decls");
+
+	/**
+	 * Create the instance of <code>TextSequenceDeclsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSequenceDeclsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sequence-decls}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-decl}.
+	 *
+	 * @param textDisplayOutlineLevelValue  the <code>Integer</code> value of <code>TextDisplayOutlineLevelAttribute</code>, see {@odf.attribute  text:display-outline-level} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:sequence-decl}
+	 */
+	 public TextSequenceDeclElement newTextSequenceDeclElement(int textDisplayOutlineLevelValue, String textNameValue) {
+		TextSequenceDeclElement textSequenceDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceDeclElement.class);
+		textSequenceDecl.setTextDisplayOutlineLevelAttribute(textDisplayOutlineLevelValue);
+		textSequenceDecl.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequenceDecl);
+		return textSequenceDecl;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceElement.java
new file mode 100644
index 0000000..19b1426
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceElement.java
@@ -0,0 +1,208 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRefNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sequence}.
+ *
+ */
+public class TextSequenceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sequence");
+
+	/**
+	 * Create the instance of <code>TextSequenceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSequenceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sequence}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFormulaAttribute() {
+		TextFormulaAttribute attr = (TextFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @param textFormulaValue   The type is <code>String</code>
+	 */
+	public void setTextFormulaAttribute(String textFormulaValue) {
+		TextFormulaAttribute attr = new TextFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextRefNameAttribute() {
+		TextRefNameAttribute attr = (TextRefNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "ref-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @param textRefNameValue   The type is <code>String</code>
+	 */
+	public void setTextRefNameAttribute(String textRefNameValue) {
+		TextRefNameAttribute attr = new TextRefNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textRefNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceRefElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceRefElement.java
new file mode 100644
index 0000000..efbcb17
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSequenceRefElement.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRefNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextReferenceFormatAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sequence-ref}.
+ *
+ */
+public class TextSequenceRefElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sequence-ref");
+
+	/**
+	 * Create the instance of <code>TextSequenceRefElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSequenceRefElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sequence-ref}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextRefNameAttribute() {
+		TextRefNameAttribute attr = (TextRefNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "ref-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRefNameAttribute</code> , See {@odf.attribute text:ref-name}
+	 *
+	 * @param textRefNameValue   The type is <code>String</code>
+	 */
+	public void setTextRefNameAttribute(String textRefNameValue) {
+		TextRefNameAttribute attr = new TextRefNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textRefNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextReferenceFormatAttribute() {
+		TextReferenceFormatAttribute attr = (TextReferenceFormatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "reference-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextReferenceFormatAttribute</code> , See {@odf.attribute text:reference-format}
+	 *
+	 * @param textReferenceFormatValue   The type is <code>String</code>
+	 */
+	public void setTextReferenceFormatAttribute(String textReferenceFormatValue) {
+		TextReferenceFormatAttribute attr = new TextReferenceFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textReferenceFormatValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSheetNameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSheetNameElement.java
new file mode 100644
index 0000000..75c9365
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSheetNameElement.java
@@ -0,0 +1,79 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sheet-name}.
+ *
+ */
+public class TextSheetNameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sheet-name");
+
+	/**
+	 * Create the instance of <code>TextSheetNameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSheetNameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sheet-name}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSoftPageBreakElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSoftPageBreakElement.java
new file mode 100644
index 0000000..56feefb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSoftPageBreakElement.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:soft-page-break}.
+ *
+ */
+public class TextSoftPageBreakElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "soft-page-break");
+
+	/**
+	 * Create the instance of <code>TextSoftPageBreakElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSoftPageBreakElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:soft-page-break}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSortKeyElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSortKeyElement.java
new file mode 100644
index 0000000..8bef7f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSortKeyElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextSortAscendingAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:sort-key}.
+ *
+ */
+public class TextSortKeyElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "sort-key");
+
+	/**
+	 * Create the instance of <code>TextSortKeyElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSortKeyElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:sort-key}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextKeyAttribute</code> , See {@odf.attribute text:key}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextKeyAttribute() {
+		TextKeyAttribute attr = (TextKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextKeyAttribute</code> , See {@odf.attribute text:key}
+	 *
+	 * @param textKeyValue   The type is <code>String</code>
+	 */
+	public void setTextKeyAttribute(String textKeyValue) {
+		TextKeyAttribute attr = new TextKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextSortAscendingAttribute</code> , See {@odf.attribute text:sort-ascending}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextSortAscendingAttribute() {
+		TextSortAscendingAttribute attr = (TextSortAscendingAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "sort-ascending");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextSortAscendingAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextSortAscendingAttribute</code> , See {@odf.attribute text:sort-ascending}
+	 *
+	 * @param textSortAscendingValue   The type is <code>Boolean</code>
+	 */
+	public void setTextSortAscendingAttribute(Boolean textSortAscendingValue) {
+		TextSortAscendingAttribute attr = new TextSortAscendingAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textSortAscendingValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSpanElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSpanElement.java
new file mode 100644
index 0000000..c59766b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSpanElement.java
@@ -0,0 +1,1744 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dSceneElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCaptionElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCircleElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawConnectorElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawCustomShapeElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawEllipseElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMeasureElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPathElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolygonElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPolylineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawRegularPolygonElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationEndElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationDateTimeElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationFooterElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationHeaderElement;
+import org.odftoolkit.odfdom.dom.attribute.text.TextClassNamesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:span}.
+ *
+ */
+public class TextSpanElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "span");
+
+	/**
+	 * Create the instance of <code>TextSpanElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSpanElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Text, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:span}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextClassNamesAttribute</code> , See {@odf.attribute text:class-names}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextClassNamesAttribute() {
+		TextClassNamesAttribute attr = (TextClassNamesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "class-names");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextClassNamesAttribute</code> , See {@odf.attribute text:class-names}
+	 *
+	 * @param textClassNamesValue   The type is <code>String</code>
+	 */
+	public void setTextClassNamesAttribute(String textClassNamesValue) {
+		TextClassNamesAttribute attr = new TextClassNamesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textClassNamesValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element dr3d:scene}.
+	 *
+	 * @return the element {@odf.element dr3d:scene}
+	 */
+	public Dr3dSceneElement newDr3dSceneElement() {
+		Dr3dSceneElement dr3dScene = ((OdfFileDom) this.ownerDocument).newOdfElement(Dr3dSceneElement.class);
+		this.appendChild(dr3dScene);
+		return dr3dScene;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element draw:a}
+	 */
+	 public DrawAElement newDrawAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		DrawAElement drawA = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawAElement.class);
+		drawA.setXlinkHrefAttribute(xlinkHrefValue);
+		drawA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(drawA);
+		return drawA;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:caption}.
+	 *
+	 * @return the element {@odf.element draw:caption}
+	 */
+	public DrawCaptionElement newDrawCaptionElement() {
+		DrawCaptionElement drawCaption = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCaptionElement.class);
+		this.appendChild(drawCaption);
+		return drawCaption;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:circle}.
+	 *
+	 * @return the element {@odf.element draw:circle}
+	 */
+	public DrawCircleElement newDrawCircleElement() {
+		DrawCircleElement drawCircle = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCircleElement.class);
+		this.appendChild(drawCircle);
+		return drawCircle;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:connector}.
+	 *
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:connector}
+	 */
+	 public DrawConnectorElement newDrawConnectorElement(int svgViewBoxValue) {
+		DrawConnectorElement drawConnector = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawConnectorElement.class);
+		drawConnector.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawConnector);
+		return drawConnector;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:control}.
+	 *
+	 * @param drawControlValue  the <code>String</code> value of <code>DrawControlAttribute</code>, see {@odf.attribute  draw:control} at specification
+	 * @return the element {@odf.element draw:control}
+	 */
+	 public DrawControlElement newDrawControlElement(String drawControlValue) {
+		DrawControlElement drawControl = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawControlElement.class);
+		drawControl.setDrawControlAttribute(drawControlValue);
+		this.appendChild(drawControl);
+		return drawControl;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:custom-shape}.
+	 *
+	 * @return the element {@odf.element draw:custom-shape}
+	 */
+	public DrawCustomShapeElement newDrawCustomShapeElement() {
+		DrawCustomShapeElement drawCustomShape = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawCustomShapeElement.class);
+		this.appendChild(drawCustomShape);
+		return drawCustomShape;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:ellipse}.
+	 *
+	 * @return the element {@odf.element draw:ellipse}
+	 */
+	public DrawEllipseElement newDrawEllipseElement() {
+		DrawEllipseElement drawEllipse = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawEllipseElement.class);
+		this.appendChild(drawEllipse);
+		return drawEllipse;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:frame}.
+	 *
+	 * @return the element {@odf.element draw:frame}
+	 */
+	public DrawFrameElement newDrawFrameElement() {
+		DrawFrameElement drawFrame = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawFrameElement.class);
+		this.appendChild(drawFrame);
+		return drawFrame;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:g}.
+	 *
+	 * @return the element {@odf.element draw:g}
+	 */
+	public DrawGElement newDrawGElement() {
+		DrawGElement drawG = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawGElement.class);
+		this.appendChild(drawG);
+		return drawG;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:line}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:line}
+	 */
+	 public DrawLineElement newDrawLineElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawLineElement drawLine = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawLineElement.class);
+		drawLine.setSvgX1Attribute(svgX1Value);
+		drawLine.setSvgX2Attribute(svgX2Value);
+		drawLine.setSvgY1Attribute(svgY1Value);
+		drawLine.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawLine);
+		return drawLine;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:measure}.
+	 *
+	 * @param svgX1Value  the <code>String</code> value of <code>SvgX1Attribute</code>, see {@odf.attribute  svg:x1} at specification
+	 * @param svgX2Value  the <code>String</code> value of <code>SvgX2Attribute</code>, see {@odf.attribute  svg:x2} at specification
+	 * @param svgY1Value  the <code>String</code> value of <code>SvgY1Attribute</code>, see {@odf.attribute  svg:y1} at specification
+	 * @param svgY2Value  the <code>String</code> value of <code>SvgY2Attribute</code>, see {@odf.attribute  svg:y2} at specification
+	 * @return the element {@odf.element draw:measure}
+	 */
+	 public DrawMeasureElement newDrawMeasureElement(String svgX1Value, String svgX2Value, String svgY1Value, String svgY2Value) {
+		DrawMeasureElement drawMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawMeasureElement.class);
+		drawMeasure.setSvgX1Attribute(svgX1Value);
+		drawMeasure.setSvgX2Attribute(svgX2Value);
+		drawMeasure.setSvgY1Attribute(svgY1Value);
+		drawMeasure.setSvgY2Attribute(svgY2Value);
+		this.appendChild(drawMeasure);
+		return drawMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:page-thumbnail}.
+	 *
+	 * @return the element {@odf.element draw:page-thumbnail}
+	 */
+	public DrawPageThumbnailElement newDrawPageThumbnailElement() {
+		DrawPageThumbnailElement drawPageThumbnail = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPageThumbnailElement.class);
+		this.appendChild(drawPageThumbnail);
+		return drawPageThumbnail;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:path}.
+	 *
+	 * @param svgDValue  the <code>String</code> value of <code>SvgDAttribute</code>, see {@odf.attribute  svg:d} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:path}
+	 */
+	 public DrawPathElement newDrawPathElement(String svgDValue, int svgViewBoxValue) {
+		DrawPathElement drawPath = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPathElement.class);
+		drawPath.setSvgDAttribute(svgDValue);
+		drawPath.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPath);
+		return drawPath;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polygon}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polygon}
+	 */
+	 public DrawPolygonElement newDrawPolygonElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolygonElement drawPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolygonElement.class);
+		drawPolygon.setDrawPointsAttribute(drawPointsValue);
+		drawPolygon.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolygon);
+		return drawPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:polyline}.
+	 *
+	 * @param drawPointsValue  the <code>String</code> value of <code>DrawPointsAttribute</code>, see {@odf.attribute  draw:points} at specification
+	 * @param svgViewBoxValue  the <code>Integer</code> value of <code>SvgViewBoxAttribute</code>, see {@odf.attribute  svg:viewBox} at specification
+	 * @return the element {@odf.element draw:polyline}
+	 */
+	 public DrawPolylineElement newDrawPolylineElement(String drawPointsValue, int svgViewBoxValue) {
+		DrawPolylineElement drawPolyline = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawPolylineElement.class);
+		drawPolyline.setDrawPointsAttribute(drawPointsValue);
+		drawPolyline.setSvgViewBoxAttribute(svgViewBoxValue);
+		this.appendChild(drawPolyline);
+		return drawPolyline;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:rect}.
+	 *
+	 * @return the element {@odf.element draw:rect}
+	 */
+	public DrawRectElement newDrawRectElement() {
+		DrawRectElement drawRect = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRectElement.class);
+		this.appendChild(drawRect);
+		return drawRect;
+	}
+
+	/**
+	 * Create child element {@odf.element draw:regular-polygon}.
+	 *
+	 * @param drawConcaveValue  the <code>Boolean</code> value of <code>DrawConcaveAttribute</code>, see {@odf.attribute  draw:concave} at specification
+	 * @param drawCornersValue  the <code>Integer</code> value of <code>DrawCornersAttribute</code>, see {@odf.attribute  draw:corners} at specification
+	 * @return the element {@odf.element draw:regular-polygon}
+	 */
+	 public DrawRegularPolygonElement newDrawRegularPolygonElement(boolean drawConcaveValue, int drawCornersValue) {
+		DrawRegularPolygonElement drawRegularPolygon = ((OdfFileDom) this.ownerDocument).newOdfElement(DrawRegularPolygonElement.class);
+		drawRegularPolygon.setDrawConcaveAttribute(drawConcaveValue);
+		drawRegularPolygon.setDrawCornersAttribute(drawCornersValue);
+		this.appendChild(drawRegularPolygon);
+		return drawRegularPolygon;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation}.
+	 *
+	 * @return the element {@odf.element office:annotation}
+	 */
+	public OfficeAnnotationElement newOfficeAnnotationElement() {
+		OfficeAnnotationElement officeAnnotation = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationElement.class);
+		this.appendChild(officeAnnotation);
+		return officeAnnotation;
+	}
+
+	/**
+	 * Create child element {@odf.element office:annotation-end}.
+	 *
+	 * @param officeNameValue  the <code>String</code> value of <code>OfficeNameAttribute</code>, see {@odf.attribute  office:name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element office:annotation-end}
+	 */
+	 public OfficeAnnotationEndElement newOfficeAnnotationEndElement(String officeNameValue) {
+		OfficeAnnotationEndElement officeAnnotationEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(OfficeAnnotationEndElement.class);
+		officeAnnotationEnd.setOfficeNameAttribute(officeNameValue);
+		this.appendChild(officeAnnotationEnd);
+		return officeAnnotationEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:date-time}.
+	 *
+	 * @return the element {@odf.element presentation:date-time}
+	 */
+	public PresentationDateTimeElement newPresentationDateTimeElement() {
+		PresentationDateTimeElement presentationDateTime = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationDateTimeElement.class);
+		this.appendChild(presentationDateTime);
+		return presentationDateTime;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:footer}.
+	 *
+	 * @return the element {@odf.element presentation:footer}
+	 */
+	public PresentationFooterElement newPresentationFooterElement() {
+		PresentationFooterElement presentationFooter = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationFooterElement.class);
+		this.appendChild(presentationFooter);
+		return presentationFooter;
+	}
+
+	/**
+	 * Create child element {@odf.element presentation:header}.
+	 *
+	 * @return the element {@odf.element presentation:header}
+	 */
+	public PresentationHeaderElement newPresentationHeaderElement() {
+		PresentationHeaderElement presentationHeader = ((OdfFileDom) this.ownerDocument).newOdfElement(PresentationHeaderElement.class);
+		this.appendChild(presentationHeader);
+		return presentationHeader;
+	}
+
+	/**
+	 * Create child element {@odf.element text:a}.
+	 *
+	 * @param xlinkHrefValue  the <code>String</code> value of <code>XlinkHrefAttribute</code>, see {@odf.attribute  xlink:href} at specification
+	 * @param xlinkTypeValue  the <code>String</code> value of <code>XlinkTypeAttribute</code>, see {@odf.attribute  xlink:type} at specification
+	 * @return the element {@odf.element text:a}
+	 */
+	 public TextAElement newTextAElement(String xlinkHrefValue, String xlinkTypeValue) {
+		TextAElement textA = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAElement.class);
+		textA.setXlinkHrefAttribute(xlinkHrefValue);
+		textA.setXlinkTypeAttribute(xlinkTypeValue);
+		this.appendChild(textA);
+		return textA;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark}
+	 */
+	 public TextAlphabeticalIndexMarkElement newTextAlphabeticalIndexMarkElement(String textStringValueValue) {
+		TextAlphabeticalIndexMarkElement textAlphabeticalIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkElement.class);
+		textAlphabeticalIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textAlphabeticalIndexMark);
+		return textAlphabeticalIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-end}
+	 */
+	 public TextAlphabeticalIndexMarkEndElement newTextAlphabeticalIndexMarkEndElement(String textIdValue) {
+		TextAlphabeticalIndexMarkEndElement textAlphabeticalIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkEndElement.class);
+		textAlphabeticalIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkEnd);
+		return textAlphabeticalIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:alphabetical-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:alphabetical-index-mark-start}
+	 */
+	 public TextAlphabeticalIndexMarkStartElement newTextAlphabeticalIndexMarkStartElement(String textIdValue) {
+		TextAlphabeticalIndexMarkStartElement textAlphabeticalIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAlphabeticalIndexMarkStartElement.class);
+		textAlphabeticalIndexMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textAlphabeticalIndexMarkStart);
+		return textAlphabeticalIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-initials}.
+	 *
+	 * @return the element {@odf.element text:author-initials}
+	 */
+	public TextAuthorInitialsElement newTextAuthorInitialsElement() {
+		TextAuthorInitialsElement textAuthorInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorInitialsElement.class);
+		this.appendChild(textAuthorInitials);
+		return textAuthorInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:author-name}.
+	 *
+	 * @return the element {@odf.element text:author-name}
+	 */
+	public TextAuthorNameElement newTextAuthorNameElement() {
+		TextAuthorNameElement textAuthorName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextAuthorNameElement.class);
+		this.appendChild(textAuthorName);
+		return textAuthorName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bibliography-mark}.
+	 *
+	 * @param textBibliographyTypeValue  the <code>String</code> value of <code>TextBibliographyTypeAttribute</code>, see {@odf.attribute  text:bibliography-type} at specification
+	 * @return the element {@odf.element text:bibliography-mark}
+	 */
+	 public TextBibliographyMarkElement newTextBibliographyMarkElement(String textBibliographyTypeValue) {
+		TextBibliographyMarkElement textBibliographyMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBibliographyMarkElement.class);
+		textBibliographyMark.setTextBibliographyTypeAttribute(textBibliographyTypeValue);
+		this.appendChild(textBibliographyMark);
+		return textBibliographyMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark}
+	 */
+	 public TextBookmarkElement newTextBookmarkElement(String textNameValue) {
+		TextBookmarkElement textBookmark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkElement.class);
+		textBookmark.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmark);
+		return textBookmark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-end}
+	 */
+	 public TextBookmarkEndElement newTextBookmarkEndElement(String textNameValue) {
+		TextBookmarkEndElement textBookmarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkEndElement.class);
+		textBookmarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkEnd);
+		return textBookmarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-ref}.
+	 *
+	 * @return the element {@odf.element text:bookmark-ref}
+	 */
+	public TextBookmarkRefElement newTextBookmarkRefElement() {
+		TextBookmarkRefElement textBookmarkRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkRefElement.class);
+		this.appendChild(textBookmarkRef);
+		return textBookmarkRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:bookmark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:bookmark-start}
+	 */
+	 public TextBookmarkStartElement newTextBookmarkStartElement(String textNameValue) {
+		TextBookmarkStartElement textBookmarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextBookmarkStartElement.class);
+		textBookmarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textBookmarkStart);
+		return textBookmarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change}
+	 */
+	 public TextChangeElement newTextChangeElement(String textChangeIdValue) {
+		TextChangeElement textChange = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeElement.class);
+		textChange.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChange);
+		return textChange;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-end}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-end}
+	 */
+	 public TextChangeEndElement newTextChangeEndElement(String textChangeIdValue) {
+		TextChangeEndElement textChangeEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeEndElement.class);
+		textChangeEnd.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeEnd);
+		return textChangeEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:change-start}.
+	 *
+	 * @param textChangeIdValue  the <code>String</code> value of <code>TextChangeIdAttribute</code>, see {@odf.attribute  text:change-id} at specification
+	 * @return the element {@odf.element text:change-start}
+	 */
+	 public TextChangeStartElement newTextChangeStartElement(String textChangeIdValue) {
+		TextChangeStartElement textChangeStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangeStartElement.class);
+		textChangeStart.setTextChangeIdAttribute(textChangeIdValue);
+		this.appendChild(textChangeStart);
+		return textChangeStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:chapter}.
+	 *
+	 * @param textDisplayValue  the <code>String</code> value of <code>TextDisplayAttribute</code>, see {@odf.attribute  text:display} at specification
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:chapter}
+	 */
+	 public TextChapterElement newTextChapterElement(String textDisplayValue, int textOutlineLevelValue) {
+		TextChapterElement textChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChapterElement.class);
+		textChapter.setTextDisplayAttribute(textDisplayValue);
+		textChapter.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textChapter);
+		return textChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:character-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:character-count}
+	 */
+	 public TextCharacterCountElement newTextCharacterCountElement(String styleNumFormatValue) {
+		TextCharacterCountElement textCharacterCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCharacterCountElement.class);
+		textCharacterCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textCharacterCount);
+		return textCharacterCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:conditional-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueIfFalseValue  the <code>String</code> value of <code>TextStringValueIfFalseAttribute</code>, see {@odf.attribute  text:string-value-if-false} at specification
+	 * @param textStringValueIfTrueValue  the <code>String</code> value of <code>TextStringValueIfTrueAttribute</code>, see {@odf.attribute  text:string-value-if-true} at specification
+	 * @return the element {@odf.element text:conditional-text}
+	 */
+	 public TextConditionalTextElement newTextConditionalTextElement(String textConditionValue, String textStringValueIfFalseValue, String textStringValueIfTrueValue) {
+		TextConditionalTextElement textConditionalText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextConditionalTextElement.class);
+		textConditionalText.setTextConditionAttribute(textConditionValue);
+		textConditionalText.setTextStringValueIfFalseAttribute(textStringValueIfFalseValue);
+		textConditionalText.setTextStringValueIfTrueAttribute(textStringValueIfTrueValue);
+		this.appendChild(textConditionalText);
+		return textConditionalText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-date}.
+	 *
+	 * @return the element {@odf.element text:creation-date}
+	 */
+	public TextCreationDateElement newTextCreationDateElement() {
+		TextCreationDateElement textCreationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationDateElement.class);
+		this.appendChild(textCreationDate);
+		return textCreationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creation-time}.
+	 *
+	 * @return the element {@odf.element text:creation-time}
+	 */
+	public TextCreationTimeElement newTextCreationTimeElement() {
+		TextCreationTimeElement textCreationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreationTimeElement.class);
+		this.appendChild(textCreationTime);
+		return textCreationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:creator}.
+	 *
+	 * @return the element {@odf.element text:creator}
+	 */
+	public TextCreatorElement newTextCreatorElement() {
+		TextCreatorElement textCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextCreatorElement.class);
+		this.appendChild(textCreator);
+		return textCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-display}.
+	 *
+	 * @param textColumnNameValue  the <code>String</code> value of <code>TextColumnNameAttribute</code>, see {@odf.attribute  text:column-name} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-display}
+	 */
+	 public TextDatabaseDisplayElement newTextDatabaseDisplayElement(String textColumnNameValue, String textTableNameValue) {
+		TextDatabaseDisplayElement textDatabaseDisplay = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseDisplayElement.class);
+		textDatabaseDisplay.setTextColumnNameAttribute(textColumnNameValue);
+		textDatabaseDisplay.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseDisplay);
+		return textDatabaseDisplay;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-name}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-name}
+	 */
+	 public TextDatabaseNameElement newTextDatabaseNameElement(String textTableNameValue) {
+		TextDatabaseNameElement textDatabaseName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNameElement.class);
+		textDatabaseName.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseName);
+		return textDatabaseName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-next}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-next}
+	 */
+	 public TextDatabaseNextElement newTextDatabaseNextElement(String textTableNameValue) {
+		TextDatabaseNextElement textDatabaseNext = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseNextElement.class);
+		textDatabaseNext.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseNext);
+		return textDatabaseNext;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-number}
+	 */
+	 public TextDatabaseRowNumberElement newTextDatabaseRowNumberElement(String styleNumFormatValue, String textTableNameValue) {
+		TextDatabaseRowNumberElement textDatabaseRowNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowNumberElement.class);
+		textDatabaseRowNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		textDatabaseRowNumber.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowNumber);
+		return textDatabaseRowNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:database-row-select}.
+	 *
+	 * @param textTableNameValue  the <code>String</code> value of <code>TextTableNameAttribute</code>, see {@odf.attribute  text:table-name} at specification
+	 * @return the element {@odf.element text:database-row-select}
+	 */
+	 public TextDatabaseRowSelectElement newTextDatabaseRowSelectElement(String textTableNameValue) {
+		TextDatabaseRowSelectElement textDatabaseRowSelect = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDatabaseRowSelectElement.class);
+		textDatabaseRowSelect.setTextTableNameAttribute(textTableNameValue);
+		this.appendChild(textDatabaseRowSelect);
+		return textDatabaseRowSelect;
+	}
+
+	/**
+	 * Create child element {@odf.element text:date}.
+	 *
+	 * @return the element {@odf.element text:date}
+	 */
+	public TextDateElement newTextDateElement() {
+		TextDateElement textDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDateElement.class);
+		this.appendChild(textDate);
+		return textDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:dde-connection}.
+	 *
+	 * @param textConnectionNameValue  the <code>String</code> value of <code>TextConnectionNameAttribute</code>, see {@odf.attribute  text:connection-name} at specification
+	 * @return the element {@odf.element text:dde-connection}
+	 */
+	 public TextDdeConnectionElement newTextDdeConnectionElement(String textConnectionNameValue) {
+		TextDdeConnectionElement textDdeConnection = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDdeConnectionElement.class);
+		textDdeConnection.setTextConnectionNameAttribute(textConnectionNameValue);
+		this.appendChild(textDdeConnection);
+		return textDdeConnection;
+	}
+
+	/**
+	 * Create child element {@odf.element text:description}.
+	 *
+	 * @return the element {@odf.element text:description}
+	 */
+	public TextDescriptionElement newTextDescriptionElement() {
+		TextDescriptionElement textDescription = ((OdfFileDom) this.ownerDocument).newOdfElement(TextDescriptionElement.class);
+		this.appendChild(textDescription);
+		return textDescription;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-cycles}.
+	 *
+	 * @return the element {@odf.element text:editing-cycles}
+	 */
+	public TextEditingCyclesElement newTextEditingCyclesElement() {
+		TextEditingCyclesElement textEditingCycles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingCyclesElement.class);
+		this.appendChild(textEditingCycles);
+		return textEditingCycles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:editing-duration}.
+	 *
+	 * @return the element {@odf.element text:editing-duration}
+	 */
+	public TextEditingDurationElement newTextEditingDurationElement() {
+		TextEditingDurationElement textEditingDuration = ((OdfFileDom) this.ownerDocument).newOdfElement(TextEditingDurationElement.class);
+		this.appendChild(textEditingDuration);
+		return textEditingDuration;
+	}
+
+	/**
+	 * Create child element {@odf.element text:execute-macro}.
+	 *
+	 * @return the element {@odf.element text:execute-macro}
+	 */
+	public TextExecuteMacroElement newTextExecuteMacroElement() {
+		TextExecuteMacroElement textExecuteMacro = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExecuteMacroElement.class);
+		this.appendChild(textExecuteMacro);
+		return textExecuteMacro;
+	}
+
+	/**
+	 * Create child element {@odf.element text:expression}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @return the element {@odf.element text:expression}
+	 */
+	 public TextExpressionElement newTextExpressionElement(double officeValueValue, String officeValueTypeValue) {
+		TextExpressionElement textExpression = ((OdfFileDom) this.ownerDocument).newOdfElement(TextExpressionElement.class);
+		textExpression.setOfficeValueAttribute(officeValueValue);
+		textExpression.setOfficeValueTypeAttribute(officeValueTypeValue);
+		this.appendChild(textExpression);
+		return textExpression;
+	}
+
+	/**
+	 * Create child element {@odf.element text:file-name}.
+	 *
+	 * @return the element {@odf.element text:file-name}
+	 */
+	public TextFileNameElement newTextFileNameElement() {
+		TextFileNameElement textFileName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextFileNameElement.class);
+		this.appendChild(textFileName);
+		return textFileName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-paragraph}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @return the element {@odf.element text:hidden-paragraph}
+	 */
+	 public TextHiddenParagraphElement newTextHiddenParagraphElement(String textConditionValue) {
+		TextHiddenParagraphElement textHiddenParagraph = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenParagraphElement.class);
+		textHiddenParagraph.setTextConditionAttribute(textConditionValue);
+		this.appendChild(textHiddenParagraph);
+		return textHiddenParagraph;
+	}
+
+	/**
+	 * Create child element {@odf.element text:hidden-text}.
+	 *
+	 * @param textConditionValue  the <code>String</code> value of <code>TextConditionAttribute</code>, see {@odf.attribute  text:condition} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:hidden-text}
+	 */
+	 public TextHiddenTextElement newTextHiddenTextElement(String textConditionValue, String textStringValueValue) {
+		TextHiddenTextElement textHiddenText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextHiddenTextElement.class);
+		textHiddenText.setTextConditionAttribute(textConditionValue);
+		textHiddenText.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textHiddenText);
+		return textHiddenText;
+	}
+
+	/**
+	 * Create child element {@odf.element text:image-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:image-count}
+	 */
+	 public TextImageCountElement newTextImageCountElement(String styleNumFormatValue) {
+		TextImageCountElement textImageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextImageCountElement.class);
+		textImageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textImageCount);
+		return textImageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:initial-creator}.
+	 *
+	 * @return the element {@odf.element text:initial-creator}
+	 */
+	public TextInitialCreatorElement newTextInitialCreatorElement() {
+		TextInitialCreatorElement textInitialCreator = ((OdfFileDom) this.ownerDocument).newOdfElement(TextInitialCreatorElement.class);
+		this.appendChild(textInitialCreator);
+		return textInitialCreator;
+	}
+
+	/**
+	 * Create child element {@odf.element text:keywords}.
+	 *
+	 * @return the element {@odf.element text:keywords}
+	 */
+	public TextKeywordsElement newTextKeywordsElement() {
+		TextKeywordsElement textKeywords = ((OdfFileDom) this.ownerDocument).newOdfElement(TextKeywordsElement.class);
+		this.appendChild(textKeywords);
+		return textKeywords;
+	}
+
+	/**
+	 * Create child element {@odf.element text:line-break}.
+	 *
+	 * @return the element {@odf.element text:line-break}
+	 */
+	public TextLineBreakElement newTextLineBreakElement() {
+		TextLineBreakElement textLineBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextLineBreakElement.class);
+		this.appendChild(textLineBreak);
+		return textLineBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:measure}.
+	 *
+	 * @param textKindValue  the <code>String</code> value of <code>TextKindAttribute</code>, see {@odf.attribute  text:kind} at specification
+	 * @return the element {@odf.element text:measure}
+	 */
+	 public TextMeasureElement newTextMeasureElement(String textKindValue) {
+		TextMeasureElement textMeasure = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMeasureElement.class);
+		textMeasure.setTextKindAttribute(textKindValue);
+		this.appendChild(textMeasure);
+		return textMeasure;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta}
+	 */
+	public TextMetaElement newTextMetaElement() {
+		TextMetaElement textMeta = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaElement.class);
+		this.appendChild(textMeta);
+		return textMeta;
+	}
+
+	/**
+	 * Create child element {@odf.element text:meta-field}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:meta-field}
+	 */
+	 public TextMetaFieldElement newTextMetaFieldElement(String xmlIdValue) {
+		TextMetaFieldElement textMetaField = ((OdfFileDom) this.ownerDocument).newOdfElement(TextMetaFieldElement.class);
+		textMetaField.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textMetaField);
+		return textMetaField;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-date}.
+	 *
+	 * @return the element {@odf.element text:modification-date}
+	 */
+	public TextModificationDateElement newTextModificationDateElement() {
+		TextModificationDateElement textModificationDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationDateElement.class);
+		this.appendChild(textModificationDate);
+		return textModificationDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:modification-time}.
+	 *
+	 * @return the element {@odf.element text:modification-time}
+	 */
+	public TextModificationTimeElement newTextModificationTimeElement() {
+		TextModificationTimeElement textModificationTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextModificationTimeElement.class);
+		this.appendChild(textModificationTime);
+		return textModificationTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note}
+	 */
+	 public TextNoteElement newTextNoteElement(String textNoteClassValue) {
+		TextNoteElement textNote = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteElement.class);
+		textNote.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNote);
+		return textNote;
+	}
+
+	/**
+	 * Create child element {@odf.element text:note-ref}.
+	 *
+	 * @param textNoteClassValue  the <code>String</code> value of <code>TextNoteClassAttribute</code>, see {@odf.attribute  text:note-class} at specification
+	 * @return the element {@odf.element text:note-ref}
+	 */
+	 public TextNoteRefElement newTextNoteRefElement(String textNoteClassValue) {
+		TextNoteRefElement textNoteRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextNoteRefElement.class);
+		textNoteRef.setTextNoteClassAttribute(textNoteClassValue);
+		this.appendChild(textNoteRef);
+		return textNoteRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:object-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:object-count}
+	 */
+	 public TextObjectCountElement newTextObjectCountElement(String styleNumFormatValue) {
+		TextObjectCountElement textObjectCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextObjectCountElement.class);
+		textObjectCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textObjectCount);
+		return textObjectCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-continuation}.
+	 *
+	 * @param textSelectPageValue  the <code>String</code> value of <code>TextSelectPageAttribute</code>, see {@odf.attribute  text:select-page} at specification
+	 * @return the element {@odf.element text:page-continuation}
+	 */
+	 public TextPageContinuationElement newTextPageContinuationElement(String textSelectPageValue) {
+		TextPageContinuationElement textPageContinuation = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageContinuationElement.class);
+		textPageContinuation.setTextSelectPageAttribute(textSelectPageValue);
+		this.appendChild(textPageContinuation);
+		return textPageContinuation;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-count}
+	 */
+	 public TextPageCountElement newTextPageCountElement(String styleNumFormatValue) {
+		TextPageCountElement textPageCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageCountElement.class);
+		textPageCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageCount);
+		return textPageCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-number}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-number}
+	 */
+	 public TextPageNumberElement newTextPageNumberElement(String styleNumFormatValue) {
+		TextPageNumberElement textPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageNumberElement.class);
+		textPageNumber.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageNumber);
+		return textPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-get}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:page-variable-get}
+	 */
+	 public TextPageVariableGetElement newTextPageVariableGetElement(String styleNumFormatValue) {
+		TextPageVariableGetElement textPageVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableGetElement.class);
+		textPageVariableGet.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textPageVariableGet);
+		return textPageVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:page-variable-set}.
+	 *
+	 * @return the element {@odf.element text:page-variable-set}
+	 */
+	public TextPageVariableSetElement newTextPageVariableSetElement() {
+		TextPageVariableSetElement textPageVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPageVariableSetElement.class);
+		this.appendChild(textPageVariableSet);
+		return textPageVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:paragraph-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:paragraph-count}
+	 */
+	 public TextParagraphCountElement newTextParagraphCountElement(String styleNumFormatValue) {
+		TextParagraphCountElement textParagraphCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextParagraphCountElement.class);
+		textParagraphCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textParagraphCount);
+		return textParagraphCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:placeholder}.
+	 *
+	 * @param textPlaceholderTypeValue  the <code>String</code> value of <code>TextPlaceholderTypeAttribute</code>, see {@odf.attribute  text:placeholder-type} at specification
+	 * @return the element {@odf.element text:placeholder}
+	 */
+	 public TextPlaceholderElement newTextPlaceholderElement(String textPlaceholderTypeValue) {
+		TextPlaceholderElement textPlaceholder = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPlaceholderElement.class);
+		textPlaceholder.setTextPlaceholderTypeAttribute(textPlaceholderTypeValue);
+		this.appendChild(textPlaceholder);
+		return textPlaceholder;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-date}.
+	 *
+	 * @return the element {@odf.element text:print-date}
+	 */
+	public TextPrintDateElement newTextPrintDateElement() {
+		TextPrintDateElement textPrintDate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintDateElement.class);
+		this.appendChild(textPrintDate);
+		return textPrintDate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:print-time}.
+	 *
+	 * @return the element {@odf.element text:print-time}
+	 */
+	public TextPrintTimeElement newTextPrintTimeElement() {
+		TextPrintTimeElement textPrintTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintTimeElement.class);
+		this.appendChild(textPrintTime);
+		return textPrintTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:printed-by}.
+	 *
+	 * @return the element {@odf.element text:printed-by}
+	 */
+	public TextPrintedByElement newTextPrintedByElement() {
+		TextPrintedByElement textPrintedBy = ((OdfFileDom) this.ownerDocument).newOdfElement(TextPrintedByElement.class);
+		this.appendChild(textPrintedBy);
+		return textPrintedBy;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark}
+	 */
+	 public TextReferenceMarkElement newTextReferenceMarkElement(String textNameValue) {
+		TextReferenceMarkElement textReferenceMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkElement.class);
+		textReferenceMark.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMark);
+		return textReferenceMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-end}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-end}
+	 */
+	 public TextReferenceMarkEndElement newTextReferenceMarkEndElement(String textNameValue) {
+		TextReferenceMarkEndElement textReferenceMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkEndElement.class);
+		textReferenceMarkEnd.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkEnd);
+		return textReferenceMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-mark-start}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:reference-mark-start}
+	 */
+	 public TextReferenceMarkStartElement newTextReferenceMarkStartElement(String textNameValue) {
+		TextReferenceMarkStartElement textReferenceMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceMarkStartElement.class);
+		textReferenceMarkStart.setTextNameAttribute(textNameValue);
+		this.appendChild(textReferenceMarkStart);
+		return textReferenceMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:reference-ref}.
+	 *
+	 * @return the element {@odf.element text:reference-ref}
+	 */
+	public TextReferenceRefElement newTextReferenceRefElement() {
+		TextReferenceRefElement textReferenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextReferenceRefElement.class);
+		this.appendChild(textReferenceRef);
+		return textReferenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:ruby}.
+	 *
+	 * @return the element {@odf.element text:ruby}
+	 */
+	public TextRubyElement newTextRubyElement() {
+		TextRubyElement textRuby = ((OdfFileDom) this.ownerDocument).newOdfElement(TextRubyElement.class);
+		this.appendChild(textRuby);
+		return textRuby;
+	}
+
+	/**
+	 * Create child element {@odf.element text:s}.
+	 *
+	 * @return the element {@odf.element text:s}
+	 */
+	public TextSElement newTextSElement() {
+		TextSElement textS = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSElement.class);
+		this.appendChild(textS);
+		return textS;
+	}
+
+	/**
+	 * Create child element {@odf.element text:script}.
+	 *
+	 * @return the element {@odf.element text:script}
+	 */
+	public TextScriptElement newTextScriptElement() {
+		TextScriptElement textScript = ((OdfFileDom) this.ownerDocument).newOdfElement(TextScriptElement.class);
+		this.appendChild(textScript);
+		return textScript;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-city}.
+	 *
+	 * @return the element {@odf.element text:sender-city}
+	 */
+	public TextSenderCityElement newTextSenderCityElement() {
+		TextSenderCityElement textSenderCity = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCityElement.class);
+		this.appendChild(textSenderCity);
+		return textSenderCity;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-company}.
+	 *
+	 * @return the element {@odf.element text:sender-company}
+	 */
+	public TextSenderCompanyElement newTextSenderCompanyElement() {
+		TextSenderCompanyElement textSenderCompany = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCompanyElement.class);
+		this.appendChild(textSenderCompany);
+		return textSenderCompany;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-country}.
+	 *
+	 * @return the element {@odf.element text:sender-country}
+	 */
+	public TextSenderCountryElement newTextSenderCountryElement() {
+		TextSenderCountryElement textSenderCountry = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderCountryElement.class);
+		this.appendChild(textSenderCountry);
+		return textSenderCountry;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-email}.
+	 *
+	 * @return the element {@odf.element text:sender-email}
+	 */
+	public TextSenderEmailElement newTextSenderEmailElement() {
+		TextSenderEmailElement textSenderEmail = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderEmailElement.class);
+		this.appendChild(textSenderEmail);
+		return textSenderEmail;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-fax}.
+	 *
+	 * @return the element {@odf.element text:sender-fax}
+	 */
+	public TextSenderFaxElement newTextSenderFaxElement() {
+		TextSenderFaxElement textSenderFax = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFaxElement.class);
+		this.appendChild(textSenderFax);
+		return textSenderFax;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-firstname}.
+	 *
+	 * @return the element {@odf.element text:sender-firstname}
+	 */
+	public TextSenderFirstnameElement newTextSenderFirstnameElement() {
+		TextSenderFirstnameElement textSenderFirstname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderFirstnameElement.class);
+		this.appendChild(textSenderFirstname);
+		return textSenderFirstname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-initials}.
+	 *
+	 * @return the element {@odf.element text:sender-initials}
+	 */
+	public TextSenderInitialsElement newTextSenderInitialsElement() {
+		TextSenderInitialsElement textSenderInitials = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderInitialsElement.class);
+		this.appendChild(textSenderInitials);
+		return textSenderInitials;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-lastname}.
+	 *
+	 * @return the element {@odf.element text:sender-lastname}
+	 */
+	public TextSenderLastnameElement newTextSenderLastnameElement() {
+		TextSenderLastnameElement textSenderLastname = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderLastnameElement.class);
+		this.appendChild(textSenderLastname);
+		return textSenderLastname;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-private}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-private}
+	 */
+	public TextSenderPhonePrivateElement newTextSenderPhonePrivateElement() {
+		TextSenderPhonePrivateElement textSenderPhonePrivate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhonePrivateElement.class);
+		this.appendChild(textSenderPhonePrivate);
+		return textSenderPhonePrivate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-phone-work}.
+	 *
+	 * @return the element {@odf.element text:sender-phone-work}
+	 */
+	public TextSenderPhoneWorkElement newTextSenderPhoneWorkElement() {
+		TextSenderPhoneWorkElement textSenderPhoneWork = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPhoneWorkElement.class);
+		this.appendChild(textSenderPhoneWork);
+		return textSenderPhoneWork;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-position}.
+	 *
+	 * @return the element {@odf.element text:sender-position}
+	 */
+	public TextSenderPositionElement newTextSenderPositionElement() {
+		TextSenderPositionElement textSenderPosition = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPositionElement.class);
+		this.appendChild(textSenderPosition);
+		return textSenderPosition;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-postal-code}.
+	 *
+	 * @return the element {@odf.element text:sender-postal-code}
+	 */
+	public TextSenderPostalCodeElement newTextSenderPostalCodeElement() {
+		TextSenderPostalCodeElement textSenderPostalCode = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderPostalCodeElement.class);
+		this.appendChild(textSenderPostalCode);
+		return textSenderPostalCode;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-state-or-province}.
+	 *
+	 * @return the element {@odf.element text:sender-state-or-province}
+	 */
+	public TextSenderStateOrProvinceElement newTextSenderStateOrProvinceElement() {
+		TextSenderStateOrProvinceElement textSenderStateOrProvince = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStateOrProvinceElement.class);
+		this.appendChild(textSenderStateOrProvince);
+		return textSenderStateOrProvince;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-street}.
+	 *
+	 * @return the element {@odf.element text:sender-street}
+	 */
+	public TextSenderStreetElement newTextSenderStreetElement() {
+		TextSenderStreetElement textSenderStreet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderStreetElement.class);
+		this.appendChild(textSenderStreet);
+		return textSenderStreet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sender-title}.
+	 *
+	 * @return the element {@odf.element text:sender-title}
+	 */
+	public TextSenderTitleElement newTextSenderTitleElement() {
+		TextSenderTitleElement textSenderTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSenderTitleElement.class);
+		this.appendChild(textSenderTitle);
+		return textSenderTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:sequence}
+	 */
+	 public TextSequenceElement newTextSequenceElement(String styleNumFormatValue, String textNameValue) {
+		TextSequenceElement textSequence = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceElement.class);
+		textSequence.setStyleNumFormatAttribute(styleNumFormatValue);
+		textSequence.setTextNameAttribute(textNameValue);
+		this.appendChild(textSequence);
+		return textSequence;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sequence-ref}.
+	 *
+	 * @return the element {@odf.element text:sequence-ref}
+	 */
+	public TextSequenceRefElement newTextSequenceRefElement() {
+		TextSequenceRefElement textSequenceRef = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSequenceRefElement.class);
+		this.appendChild(textSequenceRef);
+		return textSequenceRef;
+	}
+
+	/**
+	 * Create child element {@odf.element text:sheet-name}.
+	 *
+	 * @return the element {@odf.element text:sheet-name}
+	 */
+	public TextSheetNameElement newTextSheetNameElement() {
+		TextSheetNameElement textSheetName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSheetNameElement.class);
+		this.appendChild(textSheetName);
+		return textSheetName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:soft-page-break}.
+	 *
+	 * @return the element {@odf.element text:soft-page-break}
+	 */
+	public TextSoftPageBreakElement newTextSoftPageBreakElement() {
+		TextSoftPageBreakElement textSoftPageBreak = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSoftPageBreakElement.class);
+		this.appendChild(textSoftPageBreak);
+		return textSoftPageBreak;
+	}
+
+	/**
+	 * Create child element {@odf.element text:span}.
+	 *
+	 * @return the element {@odf.element text:span}
+	 */
+	public TextSpanElement newTextSpanElement() {
+		TextSpanElement textSpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSpanElement.class);
+		this.appendChild(textSpan);
+		return textSpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:subject}.
+	 *
+	 * @return the element {@odf.element text:subject}
+	 */
+	public TextSubjectElement newTextSubjectElement() {
+		TextSubjectElement textSubject = ((OdfFileDom) this.ownerDocument).newOdfElement(TextSubjectElement.class);
+		this.appendChild(textSubject);
+		return textSubject;
+	}
+
+	/**
+	 * Create child element {@odf.element text:tab}.
+	 *
+	 * @return the element {@odf.element text:tab}
+	 */
+	public TextTabElement newTextTabElement() {
+		TextTabElement textTab = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTabElement.class);
+		this.appendChild(textTab);
+		return textTab;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:table-count}
+	 */
+	 public TextTableCountElement newTextTableCountElement(String styleNumFormatValue) {
+		TextTableCountElement textTableCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableCountElement.class);
+		textTableCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textTableCount);
+		return textTableCount;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-formula}.
+	 *
+	 * @return the element {@odf.element text:table-formula}
+	 */
+	public TextTableFormulaElement newTextTableFormulaElement() {
+		TextTableFormulaElement textTableFormula = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableFormulaElement.class);
+		this.appendChild(textTableFormula);
+		return textTableFormula;
+	}
+
+	/**
+	 * Create child element {@odf.element text:template-name}.
+	 *
+	 * @return the element {@odf.element text:template-name}
+	 */
+	public TextTemplateNameElement newTextTemplateNameElement() {
+		TextTemplateNameElement textTemplateName = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTemplateNameElement.class);
+		this.appendChild(textTemplateName);
+		return textTemplateName;
+	}
+
+	/**
+	 * Create child element {@odf.element text:text-input}.
+	 *
+	 * @return the element {@odf.element text:text-input}
+	 */
+	public TextTextInputElement newTextTextInputElement() {
+		TextTextInputElement textTextInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTextInputElement.class);
+		this.appendChild(textTextInput);
+		return textTextInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:time}.
+	 *
+	 * @return the element {@odf.element text:time}
+	 */
+	public TextTimeElement newTextTimeElement() {
+		TextTimeElement textTime = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTimeElement.class);
+		this.appendChild(textTime);
+		return textTime;
+	}
+
+	/**
+	 * Create child element {@odf.element text:title}.
+	 *
+	 * @return the element {@odf.element text:title}
+	 */
+	public TextTitleElement newTextTitleElement() {
+		TextTitleElement textTitle = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTitleElement.class);
+		this.appendChild(textTitle);
+		return textTitle;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark}.
+	 *
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:toc-mark}
+	 */
+	 public TextTocMarkElement newTextTocMarkElement(String textStringValueValue) {
+		TextTocMarkElement textTocMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkElement.class);
+		textTocMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textTocMark);
+		return textTocMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-end}
+	 */
+	 public TextTocMarkEndElement newTextTocMarkEndElement(String textIdValue) {
+		TextTocMarkEndElement textTocMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkEndElement.class);
+		textTocMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkEnd);
+		return textTocMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:toc-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:toc-mark-start}
+	 */
+	 public TextTocMarkStartElement newTextTocMarkStartElement(String textIdValue) {
+		TextTocMarkStartElement textTocMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTocMarkStartElement.class);
+		textTocMarkStart.setTextIdAttribute(textIdValue);
+		this.appendChild(textTocMarkStart);
+		return textTocMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-defined}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-defined}
+	 */
+	 public TextUserDefinedElement newTextUserDefinedElement(String textNameValue) {
+		TextUserDefinedElement textUserDefined = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserDefinedElement.class);
+		textUserDefined.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserDefined);
+		return textUserDefined;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-get}
+	 */
+	 public TextUserFieldGetElement newTextUserFieldGetElement(String textNameValue) {
+		TextUserFieldGetElement textUserFieldGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldGetElement.class);
+		textUserFieldGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldGet);
+		return textUserFieldGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-input}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-input}
+	 */
+	 public TextUserFieldInputElement newTextUserFieldInputElement(String textNameValue) {
+		TextUserFieldInputElement textUserFieldInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldInputElement.class);
+		textUserFieldInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldInput);
+		return textUserFieldInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @param textStringValueValue  the <code>String</code> value of <code>TextStringValueAttribute</code>, see {@odf.attribute  text:string-value} at specification
+	 * @return the element {@odf.element text:user-index-mark}
+	 */
+	 public TextUserIndexMarkElement newTextUserIndexMarkElement(String textIndexNameValue, String textStringValueValue) {
+		TextUserIndexMarkElement textUserIndexMark = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkElement.class);
+		textUserIndexMark.setTextIndexNameAttribute(textIndexNameValue);
+		textUserIndexMark.setTextStringValueAttribute(textStringValueValue);
+		this.appendChild(textUserIndexMark);
+		return textUserIndexMark;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-end}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @return the element {@odf.element text:user-index-mark-end}
+	 */
+	 public TextUserIndexMarkEndElement newTextUserIndexMarkEndElement(String textIdValue) {
+		TextUserIndexMarkEndElement textUserIndexMarkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkEndElement.class);
+		textUserIndexMarkEnd.setTextIdAttribute(textIdValue);
+		this.appendChild(textUserIndexMarkEnd);
+		return textUserIndexMarkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-mark-start}.
+	 *
+	 * @param textIdValue  the <code>String</code> value of <code>TextIdAttribute</code>, see {@odf.attribute  text:id} at specification
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * @return the element {@odf.element text:user-index-mark-start}
+	 */
+	 public TextUserIndexMarkStartElement newTextUserIndexMarkStartElement(String textIdValue, String textIndexNameValue) {
+		TextUserIndexMarkStartElement textUserIndexMarkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexMarkStartElement.class);
+		textUserIndexMarkStart.setTextIdAttribute(textIdValue);
+		textUserIndexMarkStart.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexMarkStart);
+		return textUserIndexMarkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-get}.
+	 *
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-get}
+	 */
+	 public TextVariableGetElement newTextVariableGetElement(String textNameValue) {
+		TextVariableGetElement textVariableGet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableGetElement.class);
+		textVariableGet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableGet);
+		return textVariableGet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-input}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-input}
+	 */
+	 public TextVariableInputElement newTextVariableInputElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableInputElement textVariableInput = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableInputElement.class);
+		textVariableInput.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableInput.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableInput);
+		return textVariableInput;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-set}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-set}
+	 */
+	 public TextVariableSetElement newTextVariableSetElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextVariableSetElement textVariableSet = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableSetElement.class);
+		textVariableSet.setOfficeValueAttribute(officeValueValue);
+		textVariableSet.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableSet.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableSet);
+		return textVariableSet;
+	}
+
+	/**
+	 * Create child element {@odf.element text:word-count}.
+	 *
+	 * @param styleNumFormatValue  the <code>String</code> value of <code>StyleNumFormatAttribute</code>, see {@odf.attribute  style:num-format} at specification
+	 * @return the element {@odf.element text:word-count}
+	 */
+	 public TextWordCountElement newTextWordCountElement(String styleNumFormatValue) {
+		TextWordCountElement textWordCount = ((OdfFileDom) this.ownerDocument).newOdfElement(TextWordCountElement.class);
+		textWordCount.setStyleNumFormatAttribute(styleNumFormatValue);
+		this.appendChild(textWordCount);
+		return textWordCount;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSubjectElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSubjectElement.java
new file mode 100644
index 0000000..220be22
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextSubjectElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:subject}.
+ *
+ */
+public class TextSubjectElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "subject");
+
+	/**
+	 * Create the instance of <code>TextSubjectElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextSubjectElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:subject}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTabElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTabElement.java
new file mode 100644
index 0000000..629048d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTabElement.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTabRefAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:tab}.
+ *
+ */
+public class TextTabElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "tab");
+
+	/**
+	 * Create the instance of <code>TextTabElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTabElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:tab}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTabRefAttribute</code> , See {@odf.attribute text:tab-ref}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextTabRefAttribute() {
+		TextTabRefAttribute attr = (TextTabRefAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "tab-ref");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTabRefAttribute</code> , See {@odf.attribute text:tab-ref}
+	 *
+	 * @param textTabRefValue   The type is <code>Integer</code>
+	 */
+	public void setTextTabRefAttribute(Integer textTabRefValue) {
+		TextTabRefAttribute attr = new TextTabRefAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textTabRefValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableCountElement.java
new file mode 100644
index 0000000..10bbc77
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-count}.
+ *
+ */
+public class TextTableCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-count");
+
+	/**
+	 * Create the instance of <code>TextTableCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableFormulaElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableFormulaElement.java
new file mode 100644
index 0000000..8a1d9d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableFormulaElement.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFormulaAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-formula}.
+ *
+ */
+public class TextTableFormulaElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-formula");
+
+	/**
+	 * Create the instance of <code>TextTableFormulaElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableFormulaElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-formula}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFormulaAttribute() {
+		TextFormulaAttribute attr = (TextFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @param textFormulaValue   The type is <code>String</code>
+	 */
+	public void setTextFormulaAttribute(String textFormulaValue) {
+		TextFormulaAttribute attr = new TextFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFormulaValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexElement.java
new file mode 100644
index 0000000..f176da9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-index}.
+ *
+ */
+public class TextTableIndexElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-index");
+
+	/**
+	 * Create the instance of <code>TextTableIndexElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableIndexElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-index}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index-source}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:table-index-source}
+	 */
+	public TextTableIndexSourceElement newTextTableIndexSourceElement() {
+		TextTableIndexSourceElement textTableIndexSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexSourceElement.class);
+		this.appendChild(textTableIndexSource);
+		return textTableIndexSource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexEntryTemplateElement.java
new file mode 100644
index 0000000..b37be24
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexEntryTemplateElement.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-index-entry-template}.
+ *
+ */
+public class TextTableIndexEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-index-entry-template");
+
+	/**
+	 * Create the instance of <code>TextTableIndexEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableIndexEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-index-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-chapter}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * @return the element {@odf.element text:index-entry-chapter}
+	 */
+	public TextIndexEntryChapterElement newTextIndexEntryChapterElement() {
+		TextIndexEntryChapterElement textIndexEntryChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryChapterElement.class);
+		this.appendChild(textIndexEntryChapter);
+		return textIndexEntryChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-page-number}.
+	 *
+	 * @return the element {@odf.element text:index-entry-page-number}
+	 */
+	public TextIndexEntryPageNumberElement newTextIndexEntryPageNumberElement() {
+		TextIndexEntryPageNumberElement textIndexEntryPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryPageNumberElement.class);
+		this.appendChild(textIndexEntryPageNumber);
+		return textIndexEntryPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-text}.
+	 *
+	 * @return the element {@odf.element text:index-entry-text}
+	 */
+	public TextIndexEntryTextElement newTextIndexEntryTextElement() {
+		TextIndexEntryTextElement textIndexEntryText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTextElement.class);
+		this.appendChild(textIndexEntryText);
+		return textIndexEntryText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexSourceElement.java
new file mode 100644
index 0000000..9b2f87f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableIndexSourceElement.java
@@ -0,0 +1,220 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCaptionSequenceFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCaptionSequenceNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexScopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRelativeTabStopPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseCaptionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-index-source}.
+ *
+ */
+public class TextTableIndexSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-index-source");
+
+	/**
+	 * Create the instance of <code>TextTableIndexSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableIndexSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-index-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCaptionSequenceFormatAttribute</code> , See {@odf.attribute text:caption-sequence-format}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCaptionSequenceFormatAttribute() {
+		TextCaptionSequenceFormatAttribute attr = (TextCaptionSequenceFormatAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "caption-sequence-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCaptionSequenceFormatAttribute</code> , See {@odf.attribute text:caption-sequence-format}
+	 *
+	 * @param textCaptionSequenceFormatValue   The type is <code>String</code>
+	 */
+	public void setTextCaptionSequenceFormatAttribute(String textCaptionSequenceFormatValue) {
+		TextCaptionSequenceFormatAttribute attr = new TextCaptionSequenceFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCaptionSequenceFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCaptionSequenceNameAttribute</code> , See {@odf.attribute text:caption-sequence-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextCaptionSequenceNameAttribute() {
+		TextCaptionSequenceNameAttribute attr = (TextCaptionSequenceNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "caption-sequence-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCaptionSequenceNameAttribute</code> , See {@odf.attribute text:caption-sequence-name}
+	 *
+	 * @param textCaptionSequenceNameValue   The type is <code>String</code>
+	 */
+	public void setTextCaptionSequenceNameAttribute(String textCaptionSequenceNameValue) {
+		TextCaptionSequenceNameAttribute attr = new TextCaptionSequenceNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textCaptionSequenceNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexScopeAttribute() {
+		TextIndexScopeAttribute attr = (TextIndexScopeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-scope");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextIndexScopeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @param textIndexScopeValue   The type is <code>String</code>
+	 */
+	public void setTextIndexScopeAttribute(String textIndexScopeValue) {
+		TextIndexScopeAttribute attr = new TextIndexScopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexScopeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRelativeTabStopPositionAttribute() {
+		TextRelativeTabStopPositionAttribute attr = (TextRelativeTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRelativeTabStopPositionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @param textRelativeTabStopPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRelativeTabStopPositionAttribute(Boolean textRelativeTabStopPositionValue) {
+		TextRelativeTabStopPositionAttribute attr = new TextRelativeTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRelativeTabStopPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseCaptionAttribute</code> , See {@odf.attribute text:use-caption}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseCaptionAttribute() {
+		TextUseCaptionAttribute attr = (TextUseCaptionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-caption");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseCaptionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseCaptionAttribute</code> , See {@odf.attribute text:use-caption}
+	 *
+	 * @param textUseCaptionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseCaptionAttribute(Boolean textUseCaptionValue) {
+		TextUseCaptionAttribute attr = new TextUseCaptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseCaptionValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-index-entry-template}.
+	 *
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:table-index-entry-template}
+	 */
+	 public TextTableIndexEntryTemplateElement newTextTableIndexEntryTemplateElement(String textStyleNameValue) {
+		TextTableIndexEntryTemplateElement textTableIndexEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableIndexEntryTemplateElement.class);
+		textTableIndexEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textTableIndexEntryTemplate);
+		return textTableIndexEntryTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentElement.java
new file mode 100644
index 0000000..1bb7abb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentElement.java
@@ -0,0 +1,251 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-of-content}.
+ *
+ */
+public class TextTableOfContentElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-of-content");
+
+	/**
+	 * Create the instance of <code>TextTableOfContentElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableOfContentElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-of-content}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content-source}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:table-of-content-source}
+	 */
+	public TextTableOfContentSourceElement newTextTableOfContentSourceElement() {
+		TextTableOfContentSourceElement textTableOfContentSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentSourceElement.class);
+		this.appendChild(textTableOfContentSource);
+		return textTableOfContentSource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentEntryTemplateElement.java
new file mode 100644
index 0000000..58cec02
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentEntryTemplateElement.java
@@ -0,0 +1,206 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-of-content-entry-template}.
+ *
+ */
+public class TextTableOfContentEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-of-content-entry-template");
+
+	/**
+	 * Create the instance of <code>TextTableOfContentEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableOfContentEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-of-content-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-chapter}.
+	 *
+	 * @return the element {@odf.element text:index-entry-chapter}
+	 */
+	public TextIndexEntryChapterElement newTextIndexEntryChapterElement() {
+		TextIndexEntryChapterElement textIndexEntryChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryChapterElement.class);
+		this.appendChild(textIndexEntryChapter);
+		return textIndexEntryChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-link-end}.
+	 *
+	 * @return the element {@odf.element text:index-entry-link-end}
+	 */
+	public TextIndexEntryLinkEndElement newTextIndexEntryLinkEndElement() {
+		TextIndexEntryLinkEndElement textIndexEntryLinkEnd = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryLinkEndElement.class);
+		this.appendChild(textIndexEntryLinkEnd);
+		return textIndexEntryLinkEnd;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-link-start}.
+	 *
+	 * @return the element {@odf.element text:index-entry-link-start}
+	 */
+	public TextIndexEntryLinkStartElement newTextIndexEntryLinkStartElement() {
+		TextIndexEntryLinkStartElement textIndexEntryLinkStart = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryLinkStartElement.class);
+		this.appendChild(textIndexEntryLinkStart);
+		return textIndexEntryLinkStart;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-page-number}.
+	 *
+	 * @return the element {@odf.element text:index-entry-page-number}
+	 */
+	public TextIndexEntryPageNumberElement newTextIndexEntryPageNumberElement() {
+		TextIndexEntryPageNumberElement textIndexEntryPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryPageNumberElement.class);
+		this.appendChild(textIndexEntryPageNumber);
+		return textIndexEntryPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-text}.
+	 *
+	 * @return the element {@odf.element text:index-entry-text}
+	 */
+	public TextIndexEntryTextElement newTextIndexEntryTextElement() {
+		TextIndexEntryTextElement textIndexEntryText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTextElement.class);
+		this.appendChild(textIndexEntryText);
+		return textIndexEntryText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentSourceElement.java
new file mode 100644
index 0000000..67d027d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTableOfContentSourceElement.java
@@ -0,0 +1,260 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexScopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRelativeTabStopPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseIndexMarksAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseIndexSourceStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseOutlineLevelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:table-of-content-source}.
+ *
+ */
+public class TextTableOfContentSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "table-of-content-source");
+
+	/**
+	 * Create the instance of <code>TextTableOfContentSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTableOfContentSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:table-of-content-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexScopeAttribute() {
+		TextIndexScopeAttribute attr = (TextIndexScopeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-scope");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @param textIndexScopeValue   The type is <code>String</code>
+	 */
+	public void setTextIndexScopeAttribute(String textIndexScopeValue) {
+		TextIndexScopeAttribute attr = new TextIndexScopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexScopeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRelativeTabStopPositionAttribute() {
+		TextRelativeTabStopPositionAttribute attr = (TextRelativeTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @param textRelativeTabStopPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRelativeTabStopPositionAttribute(Boolean textRelativeTabStopPositionValue) {
+		TextRelativeTabStopPositionAttribute attr = new TextRelativeTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRelativeTabStopPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseIndexMarksAttribute</code> , See {@odf.attribute text:use-index-marks}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseIndexMarksAttribute() {
+		TextUseIndexMarksAttribute attr = (TextUseIndexMarksAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-index-marks");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseIndexMarksAttribute</code> , See {@odf.attribute text:use-index-marks}
+	 *
+	 * @param textUseIndexMarksValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseIndexMarksAttribute(Boolean textUseIndexMarksValue) {
+		TextUseIndexMarksAttribute attr = new TextUseIndexMarksAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseIndexMarksValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseIndexSourceStylesAttribute</code> , See {@odf.attribute text:use-index-source-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseIndexSourceStylesAttribute() {
+		TextUseIndexSourceStylesAttribute attr = (TextUseIndexSourceStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-index-source-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseIndexSourceStylesAttribute</code> , See {@odf.attribute text:use-index-source-styles}
+	 *
+	 * @param textUseIndexSourceStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseIndexSourceStylesAttribute(Boolean textUseIndexSourceStylesValue) {
+		TextUseIndexSourceStylesAttribute attr = new TextUseIndexSourceStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseIndexSourceStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseOutlineLevelAttribute</code> , See {@odf.attribute text:use-outline-level}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseOutlineLevelAttribute() {
+		TextUseOutlineLevelAttribute attr = (TextUseOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-outline-level");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseOutlineLevelAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseOutlineLevelAttribute</code> , See {@odf.attribute text:use-outline-level}
+	 *
+	 * @param textUseOutlineLevelValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseOutlineLevelAttribute(Boolean textUseOutlineLevelValue) {
+		TextUseOutlineLevelAttribute attr = new TextUseOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseOutlineLevelValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-source-styles}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:index-source-styles}
+	 */
+	 public TextIndexSourceStylesElement newTextIndexSourceStylesElement(int textOutlineLevelValue) {
+		TextIndexSourceStylesElement textIndexSourceStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexSourceStylesElement.class);
+		textIndexSourceStyles.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textIndexSourceStyles);
+		return textIndexSourceStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:table-of-content-entry-template}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:table-of-content-entry-template}
+	 */
+	 public TextTableOfContentEntryTemplateElement newTextTableOfContentEntryTemplateElement(int textOutlineLevelValue, String textStyleNameValue) {
+		TextTableOfContentEntryTemplateElement textTableOfContentEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextTableOfContentEntryTemplateElement.class);
+		textTableOfContentEntryTemplate.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		textTableOfContentEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textTableOfContentEntryTemplate);
+		return textTableOfContentEntryTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTemplateNameElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTemplateNameElement.java
new file mode 100644
index 0000000..3ba6180
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTemplateNameElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:template-name}.
+ *
+ */
+public class TextTemplateNameElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "template-name");
+
+	/**
+	 * Create the instance of <code>TextTemplateNameElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTemplateNameElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:template-name}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTextInputElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTextInputElement.java
new file mode 100644
index 0000000..e57fb87
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTextInputElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDescriptionAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:text-input}.
+ *
+ */
+public class TextTextInputElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "text-input");
+
+	/**
+	 * Create the instance of <code>TextTextInputElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTextInputElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:text-input}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDescriptionAttribute() {
+		TextDescriptionAttribute attr = (TextDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @param textDescriptionValue   The type is <code>String</code>
+	 */
+	public void setTextDescriptionAttribute(String textDescriptionValue) {
+		TextDescriptionAttribute attr = new TextDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDescriptionValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTimeElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTimeElement.java
new file mode 100644
index 0000000..7735d9e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTimeElement.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTimeAdjustAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTimeValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:time}.
+ *
+ */
+public class TextTimeElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "time");
+
+	/**
+	 * Create the instance of <code>TextTimeElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTimeElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:time}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTimeAdjustAttribute</code> , See {@odf.attribute text:time-adjust}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTimeAdjustAttribute() {
+		TextTimeAdjustAttribute attr = (TextTimeAdjustAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "time-adjust");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTimeAdjustAttribute</code> , See {@odf.attribute text:time-adjust}
+	 *
+	 * @param textTimeAdjustValue   The type is <code>String</code>
+	 */
+	public void setTextTimeAdjustAttribute(String textTimeAdjustValue) {
+		TextTimeAdjustAttribute attr = new TextTimeAdjustAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTimeAdjustValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextTimeValueAttribute() {
+		TextTimeValueAttribute attr = (TextTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTimeValueAttribute</code> , See {@odf.attribute text:time-value}
+	 *
+	 * @param textTimeValueValue   The type is <code>String</code>
+	 */
+	public void setTextTimeValueAttribute(String textTimeValueValue) {
+		TextTimeValueAttribute attr = new TextTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textTimeValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTitleElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTitleElement.java
new file mode 100644
index 0000000..f924405
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTitleElement.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:title}.
+ *
+ */
+public class TextTitleElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "title");
+
+	/**
+	 * Create the instance of <code>TextTitleElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTitleElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:title}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkElement.java
new file mode 100644
index 0000000..913c699
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:toc-mark}.
+ *
+ */
+public class TextTocMarkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "toc-mark");
+
+	/**
+	 * Create the instance of <code>TextTocMarkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTocMarkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:toc-mark}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueAttribute() {
+		TextStringValueAttribute attr = (TextStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * @param textStringValueValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueAttribute(String textStringValueValue) {
+		TextStringValueAttribute attr = new TextStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkEndElement.java
new file mode 100644
index 0000000..87d910c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:toc-mark-end}.
+ *
+ */
+public class TextTocMarkEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "toc-mark-end");
+
+	/**
+	 * Create the instance of <code>TextTocMarkEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTocMarkEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:toc-mark-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkStartElement.java
new file mode 100644
index 0000000..1dcd9c1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTocMarkStartElement.java
@@ -0,0 +1,123 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:toc-mark-start}.
+ *
+ */
+public class TextTocMarkStartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "toc-mark-start");
+
+	/**
+	 * Create the instance of <code>TextTocMarkStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTocMarkStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:toc-mark-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTrackedChangesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTrackedChangesElement.java
new file mode 100644
index 0000000..a83862b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextTrackedChangesElement.java
@@ -0,0 +1,109 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextTrackChangesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:tracked-changes}.
+ *
+ */
+public class TextTrackedChangesElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "tracked-changes");
+
+	/**
+	 * Create the instance of <code>TextTrackedChangesElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextTrackedChangesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:tracked-changes}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextTrackChangesAttribute</code> , See {@odf.attribute text:track-changes}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextTrackChangesAttribute() {
+		TextTrackChangesAttribute attr = (TextTrackChangesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "track-changes");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextTrackChangesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextTrackChangesAttribute</code> , See {@odf.attribute text:track-changes}
+	 *
+	 * @param textTrackChangesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextTrackChangesAttribute(Boolean textTrackChangesValue) {
+		TextTrackChangesAttribute attr = new TextTrackChangesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textTrackChangesValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:changed-region}.
+	 *
+	 * @param xmlIdValue  the <code>String</code> value of <code>XmlIdAttribute</code>, see {@odf.attribute  xml:id} at specification
+	 * @return the element {@odf.element text:changed-region}
+	 */
+	 public TextChangedRegionElement newTextChangedRegionElement(String xmlIdValue) {
+		TextChangedRegionElement textChangedRegion = ((OdfFileDom) this.ownerDocument).newOdfElement(TextChangedRegionElement.class);
+		textChangedRegion.setXmlIdAttribute(xmlIdValue);
+		this.appendChild(textChangedRegion);
+		return textChangedRegion;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserDefinedElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserDefinedElement.java
new file mode 100644
index 0000000..d3091cb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserDefinedElement.java
@@ -0,0 +1,281 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFixedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-defined}.
+ *
+ */
+public class TextUserDefinedElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-defined");
+
+	/**
+	 * Create the instance of <code>TextUserDefinedElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserDefinedElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-defined}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextFixedAttribute() {
+		TextFixedAttribute attr = (TextFixedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "fixed");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFixedAttribute</code> , See {@odf.attribute text:fixed}
+	 *
+	 * @param textFixedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextFixedAttribute(Boolean textFixedValue) {
+		TextFixedAttribute attr = new TextFixedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textFixedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldDeclElement.java
new file mode 100644
index 0000000..88c5f8d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldDeclElement.java
@@ -0,0 +1,302 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-field-decl}.
+ *
+ */
+public class TextUserFieldDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-field-decl");
+
+	/**
+	 * Create the instance of <code>TextUserFieldDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserFieldDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-field-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFormulaAttribute() {
+		TextFormulaAttribute attr = (TextFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @param textFormulaValue   The type is <code>String</code>
+	 */
+	public void setTextFormulaAttribute(String textFormulaValue) {
+		TextFormulaAttribute attr = new TextFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldDeclsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldDeclsElement.java
new file mode 100644
index 0000000..138717f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldDeclsElement.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-field-decls}.
+ *
+ */
+public class TextUserFieldDeclsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-field-decls");
+
+	/**
+	 * Create the instance of <code>TextUserFieldDeclsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserFieldDeclsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-field-decls}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-field-decl}.
+	 *
+	 * @param officeValueValue  the <code>Double</code> value of <code>OfficeValueAttribute</code>, see {@odf.attribute  office:value} at specification
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:user-field-decl}
+	 */
+	 public TextUserFieldDeclElement newTextUserFieldDeclElement(double officeValueValue, String officeValueTypeValue, String textNameValue) {
+		TextUserFieldDeclElement textUserFieldDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserFieldDeclElement.class);
+		textUserFieldDecl.setOfficeValueAttribute(officeValueValue);
+		textUserFieldDecl.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textUserFieldDecl.setTextNameAttribute(textNameValue);
+		this.appendChild(textUserFieldDecl);
+		return textUserFieldDecl;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldGetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldGetElement.java
new file mode 100644
index 0000000..0b915ae
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldGetElement.java
@@ -0,0 +1,156 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-field-get}.
+ *
+ */
+public class TextUserFieldGetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-field-get");
+
+	/**
+	 * Create the instance of <code>TextUserFieldGetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserFieldGetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-field-get}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldInputElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldInputElement.java
new file mode 100644
index 0000000..1da765b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserFieldInputElement.java
@@ -0,0 +1,156 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-field-input}.
+ *
+ */
+public class TextUserFieldInputElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-field-input");
+
+	/**
+	 * Create the instance of <code>TextUserFieldInputElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserFieldInputElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-field-input}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDescriptionAttribute() {
+		TextDescriptionAttribute attr = (TextDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @param textDescriptionValue   The type is <code>String</code>
+	 */
+	public void setTextDescriptionAttribute(String textDescriptionValue) {
+		TextDescriptionAttribute attr = new TextDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexElement.java
new file mode 100644
index 0000000..035da7e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexElement.java
@@ -0,0 +1,253 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectedAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextProtectionKeyDigestAlgorithmAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.xml.XmlIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-index}.
+ *
+ */
+public class TextUserIndexElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-index");
+
+	/**
+	 * Create the instance of <code>TextUserIndexElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserIndexElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Section, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-index}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextProtectedAttribute() {
+		TextProtectedAttribute attr = (TextProtectedAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protected");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectedAttribute</code> , See {@odf.attribute text:protected}
+	 *
+	 * @param textProtectedValue   The type is <code>Boolean</code>
+	 */
+	public void setTextProtectedAttribute(Boolean textProtectedValue) {
+		TextProtectedAttribute attr = new TextProtectedAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textProtectedValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyAttribute() {
+		TextProtectionKeyAttribute attr = (TextProtectionKeyAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyAttribute</code> , See {@odf.attribute text:protection-key}
+	 *
+	 * @param textProtectionKeyValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyAttribute(String textProtectionKeyValue) {
+		TextProtectionKeyAttribute attr = new TextProtectionKeyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextProtectionKeyDigestAlgorithmAttribute() {
+		TextProtectionKeyDigestAlgorithmAttribute attr = (TextProtectionKeyDigestAlgorithmAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "protection-key-digest-algorithm");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextProtectionKeyDigestAlgorithmAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextProtectionKeyDigestAlgorithmAttribute</code> , See {@odf.attribute text:protection-key-digest-algorithm}
+	 *
+	 * @param textProtectionKeyDigestAlgorithmValue   The type is <code>String</code>
+	 */
+	public void setTextProtectionKeyDigestAlgorithmAttribute(String textProtectionKeyDigestAlgorithmValue) {
+		TextProtectionKeyDigestAlgorithmAttribute attr = new TextProtectionKeyDigestAlgorithmAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textProtectionKeyDigestAlgorithmValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getXmlIdAttribute() {
+		XmlIdAttribute attr = (XmlIdAttribute) getOdfAttribute(OdfDocumentNamespace.XML, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>XmlIdAttribute</code> , See {@odf.attribute xml:id}
+	 *
+	 * @param xmlIdValue   The type is <code>String</code>
+	 */
+	public void setXmlIdAttribute(String xmlIdValue) {
+		XmlIdAttribute attr = new XmlIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(xmlIdValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-body}.
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:index-body}
+	 */
+	public TextIndexBodyElement newTextIndexBodyElement() {
+		TextIndexBodyElement textIndexBody = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexBodyElement.class);
+		this.appendChild(textIndexBody);
+		return textIndexBody;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-source}.
+	 *
+	 * @param textIndexNameValue  the <code>String</code> value of <code>TextIndexNameAttribute</code>, see {@odf.attribute  text:index-name} at specification
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element text:user-index-source}
+	 */
+	 public TextUserIndexSourceElement newTextUserIndexSourceElement(String textIndexNameValue) {
+		TextUserIndexSourceElement textUserIndexSource = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexSourceElement.class);
+		textUserIndexSource.setTextIndexNameAttribute(textIndexNameValue);
+		this.appendChild(textUserIndexSource);
+		return textUserIndexSource;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexEntryTemplateElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexEntryTemplateElement.java
new file mode 100644
index 0000000..79f9a33
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexEntryTemplateElement.java
@@ -0,0 +1,184 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStyleNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-index-entry-template}.
+ *
+ */
+public class TextUserIndexEntryTemplateElement extends OdfStylableElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-index-entry-template");
+
+	/**
+	 * Create the instance of <code>TextUserIndexEntryTemplateElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserIndexEntryTemplateElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME, OdfStyleFamily.Paragraph, OdfName.newName(OdfDocumentNamespace.TEXT, "style-name"));
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-index-entry-template}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStyleNameAttribute() {
+		TextStyleNameAttribute attr = (TextStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStyleNameAttribute</code> , See {@odf.attribute text:style-name}
+	 *
+	 * @param textStyleNameValue   The type is <code>String</code>
+	 */
+	public void setTextStyleNameAttribute(String textStyleNameValue) {
+		TextStyleNameAttribute attr = new TextStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStyleNameValue);
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-chapter}.
+	 *
+	 * @return the element {@odf.element text:index-entry-chapter}
+	 */
+	public TextIndexEntryChapterElement newTextIndexEntryChapterElement() {
+		TextIndexEntryChapterElement textIndexEntryChapter = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryChapterElement.class);
+		this.appendChild(textIndexEntryChapter);
+		return textIndexEntryChapter;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-page-number}.
+	 *
+	 * @return the element {@odf.element text:index-entry-page-number}
+	 */
+	public TextIndexEntryPageNumberElement newTextIndexEntryPageNumberElement() {
+		TextIndexEntryPageNumberElement textIndexEntryPageNumber = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryPageNumberElement.class);
+		this.appendChild(textIndexEntryPageNumber);
+		return textIndexEntryPageNumber;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-span}.
+	 *
+	 * @return the element {@odf.element text:index-entry-span}
+	 */
+	public TextIndexEntrySpanElement newTextIndexEntrySpanElement() {
+		TextIndexEntrySpanElement textIndexEntrySpan = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntrySpanElement.class);
+		this.appendChild(textIndexEntrySpan);
+		return textIndexEntrySpan;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-tab-stop}.
+	 *
+	 * @param styleTypeValue  the <code>String</code> value of <code>StyleTypeAttribute</code>, see {@odf.attribute  style:type} at specification
+	 * @return the element {@odf.element text:index-entry-tab-stop}
+	 */
+	 public TextIndexEntryTabStopElement newTextIndexEntryTabStopElement(String styleTypeValue) {
+		TextIndexEntryTabStopElement textIndexEntryTabStop = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTabStopElement.class);
+		textIndexEntryTabStop.setStyleTypeAttribute(styleTypeValue);
+		this.appendChild(textIndexEntryTabStop);
+		return textIndexEntryTabStop;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-entry-text}.
+	 *
+	 * @return the element {@odf.element text:index-entry-text}
+	 */
+	public TextIndexEntryTextElement newTextIndexEntryTextElement() {
+		TextIndexEntryTextElement textIndexEntryText = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexEntryTextElement.class);
+		this.appendChild(textIndexEntryText);
+		return textIndexEntryText;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkElement.java
new file mode 100644
index 0000000..a228deb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextStringValueAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-index-mark}.
+ *
+ */
+public class TextUserIndexMarkElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-index-mark");
+
+	/**
+	 * Create the instance of <code>TextUserIndexMarkElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserIndexMarkElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-index-mark}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexNameAttribute</code> , See {@odf.attribute text:index-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexNameAttribute() {
+		TextIndexNameAttribute attr = (TextIndexNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexNameAttribute</code> , See {@odf.attribute text:index-name}
+	 *
+	 * @param textIndexNameValue   The type is <code>String</code>
+	 */
+	public void setTextIndexNameAttribute(String textIndexNameValue) {
+		TextIndexNameAttribute attr = new TextIndexNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextStringValueAttribute() {
+		TextStringValueAttribute attr = (TextStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextStringValueAttribute</code> , See {@odf.attribute text:string-value}
+	 *
+	 * @param textStringValueValue   The type is <code>String</code>
+	 */
+	public void setTextStringValueAttribute(String textStringValueValue) {
+		TextStringValueAttribute attr = new TextStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textStringValueValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkEndElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkEndElement.java
new file mode 100644
index 0000000..6c70256
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkEndElement.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-index-mark-end}.
+ *
+ */
+public class TextUserIndexMarkEndElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-index-mark-end");
+
+	/**
+	 * Create the instance of <code>TextUserIndexMarkEndElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserIndexMarkEndElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-index-mark-end}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkStartElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkStartElement.java
new file mode 100644
index 0000000..c09aa5d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexMarkStartElement.java
@@ -0,0 +1,150 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIdAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextOutlineLevelAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-index-mark-start}.
+ *
+ */
+public class TextUserIndexMarkStartElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-index-mark-start");
+
+	/**
+	 * Create the instance of <code>TextUserIndexMarkStartElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserIndexMarkStartElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-index-mark-start}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIdAttribute() {
+		TextIdAttribute attr = (TextIdAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "id");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIdAttribute</code> , See {@odf.attribute text:id}
+	 *
+	 * @param textIdValue   The type is <code>String</code>
+	 */
+	public void setTextIdAttribute(String textIdValue) {
+		TextIdAttribute attr = new TextIdAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIdValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexNameAttribute</code> , See {@odf.attribute text:index-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexNameAttribute() {
+		TextIndexNameAttribute attr = (TextIndexNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexNameAttribute</code> , See {@odf.attribute text:index-name}
+	 *
+	 * @param textIndexNameValue   The type is <code>String</code>
+	 */
+	public void setTextIndexNameAttribute(String textIndexNameValue) {
+		TextIndexNameAttribute attr = new TextIndexNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTextOutlineLevelAttribute() {
+		TextOutlineLevelAttribute attr = (TextOutlineLevelAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "outline-level");
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextOutlineLevelAttribute</code> , See {@odf.attribute text:outline-level}
+	 *
+	 * @param textOutlineLevelValue   The type is <code>Integer</code>
+	 */
+	public void setTextOutlineLevelAttribute(Integer textOutlineLevelValue) {
+		TextOutlineLevelAttribute attr = new TextOutlineLevelAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(textOutlineLevelValue.intValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexSourceElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexSourceElement.java
new file mode 100644
index 0000000..ac9205a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextUserIndexSourceElement.java
@@ -0,0 +1,362 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.text.TextCopyOutlineLevelsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextIndexScopeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextRelativeTabStopPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseFloatingFramesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseGraphicsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseIndexMarksAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseIndexSourceStylesAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseObjectsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextUseTablesAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:user-index-source}.
+ *
+ */
+public class TextUserIndexSourceElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "user-index-source");
+
+	/**
+	 * Create the instance of <code>TextUserIndexSourceElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextUserIndexSourceElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:user-index-source}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextCopyOutlineLevelsAttribute</code> , See {@odf.attribute text:copy-outline-levels}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextCopyOutlineLevelsAttribute() {
+		TextCopyOutlineLevelsAttribute attr = (TextCopyOutlineLevelsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "copy-outline-levels");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextCopyOutlineLevelsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextCopyOutlineLevelsAttribute</code> , See {@odf.attribute text:copy-outline-levels}
+	 *
+	 * @param textCopyOutlineLevelsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextCopyOutlineLevelsAttribute(Boolean textCopyOutlineLevelsValue) {
+		TextCopyOutlineLevelsAttribute attr = new TextCopyOutlineLevelsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textCopyOutlineLevelsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexNameAttribute</code> , See {@odf.attribute text:index-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexNameAttribute() {
+		TextIndexNameAttribute attr = (TextIndexNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexNameAttribute</code> , See {@odf.attribute text:index-name}
+	 *
+	 * @param textIndexNameValue   The type is <code>String</code>
+	 */
+	public void setTextIndexNameAttribute(String textIndexNameValue) {
+		TextIndexNameAttribute attr = new TextIndexNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextIndexScopeAttribute() {
+		TextIndexScopeAttribute attr = (TextIndexScopeAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "index-scope");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return TextIndexScopeAttribute.DEFAULT_VALUE;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextIndexScopeAttribute</code> , See {@odf.attribute text:index-scope}
+	 *
+	 * @param textIndexScopeValue   The type is <code>String</code>
+	 */
+	public void setTextIndexScopeAttribute(String textIndexScopeValue) {
+		TextIndexScopeAttribute attr = new TextIndexScopeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textIndexScopeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextRelativeTabStopPositionAttribute() {
+		TextRelativeTabStopPositionAttribute attr = (TextRelativeTabStopPositionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "relative-tab-stop-position");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextRelativeTabStopPositionAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextRelativeTabStopPositionAttribute</code> , See {@odf.attribute text:relative-tab-stop-position}
+	 *
+	 * @param textRelativeTabStopPositionValue   The type is <code>Boolean</code>
+	 */
+	public void setTextRelativeTabStopPositionAttribute(Boolean textRelativeTabStopPositionValue) {
+		TextRelativeTabStopPositionAttribute attr = new TextRelativeTabStopPositionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textRelativeTabStopPositionValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseFloatingFramesAttribute</code> , See {@odf.attribute text:use-floating-frames}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseFloatingFramesAttribute() {
+		TextUseFloatingFramesAttribute attr = (TextUseFloatingFramesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-floating-frames");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseFloatingFramesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseFloatingFramesAttribute</code> , See {@odf.attribute text:use-floating-frames}
+	 *
+	 * @param textUseFloatingFramesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseFloatingFramesAttribute(Boolean textUseFloatingFramesValue) {
+		TextUseFloatingFramesAttribute attr = new TextUseFloatingFramesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseFloatingFramesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseGraphicsAttribute</code> , See {@odf.attribute text:use-graphics}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseGraphicsAttribute() {
+		TextUseGraphicsAttribute attr = (TextUseGraphicsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-graphics");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseGraphicsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseGraphicsAttribute</code> , See {@odf.attribute text:use-graphics}
+	 *
+	 * @param textUseGraphicsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseGraphicsAttribute(Boolean textUseGraphicsValue) {
+		TextUseGraphicsAttribute attr = new TextUseGraphicsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseGraphicsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseIndexMarksAttribute</code> , See {@odf.attribute text:use-index-marks}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseIndexMarksAttribute() {
+		TextUseIndexMarksAttribute attr = (TextUseIndexMarksAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-index-marks");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseIndexMarksAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseIndexMarksAttribute</code> , See {@odf.attribute text:use-index-marks}
+	 *
+	 * @param textUseIndexMarksValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseIndexMarksAttribute(Boolean textUseIndexMarksValue) {
+		TextUseIndexMarksAttribute attr = new TextUseIndexMarksAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseIndexMarksValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseIndexSourceStylesAttribute</code> , See {@odf.attribute text:use-index-source-styles}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseIndexSourceStylesAttribute() {
+		TextUseIndexSourceStylesAttribute attr = (TextUseIndexSourceStylesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-index-source-styles");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseIndexSourceStylesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseIndexSourceStylesAttribute</code> , See {@odf.attribute text:use-index-source-styles}
+	 *
+	 * @param textUseIndexSourceStylesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseIndexSourceStylesAttribute(Boolean textUseIndexSourceStylesValue) {
+		TextUseIndexSourceStylesAttribute attr = new TextUseIndexSourceStylesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseIndexSourceStylesValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseObjectsAttribute</code> , See {@odf.attribute text:use-objects}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseObjectsAttribute() {
+		TextUseObjectsAttribute attr = (TextUseObjectsAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-objects");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseObjectsAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseObjectsAttribute</code> , See {@odf.attribute text:use-objects}
+	 *
+	 * @param textUseObjectsValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseObjectsAttribute(Boolean textUseObjectsValue) {
+		TextUseObjectsAttribute attr = new TextUseObjectsAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseObjectsValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextUseTablesAttribute</code> , See {@odf.attribute text:use-tables}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getTextUseTablesAttribute() {
+		TextUseTablesAttribute attr = (TextUseTablesAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "use-tables");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return Boolean.valueOf(TextUseTablesAttribute.DEFAULT_VALUE);
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextUseTablesAttribute</code> , See {@odf.attribute text:use-tables}
+	 *
+	 * @param textUseTablesValue   The type is <code>Boolean</code>
+	 */
+	public void setTextUseTablesAttribute(Boolean textUseTablesValue) {
+		TextUseTablesAttribute attr = new TextUseTablesAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(textUseTablesValue.booleanValue());
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-source-styles}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @return the element {@odf.element text:index-source-styles}
+	 */
+	 public TextIndexSourceStylesElement newTextIndexSourceStylesElement(int textOutlineLevelValue) {
+		TextIndexSourceStylesElement textIndexSourceStyles = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexSourceStylesElement.class);
+		textIndexSourceStyles.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		this.appendChild(textIndexSourceStyles);
+		return textIndexSourceStyles;
+	}
+
+	/**
+	 * Create child element {@odf.element text:index-title-template}.
+	 *
+	 * @return the element {@odf.element text:index-title-template}
+	 */
+	public TextIndexTitleTemplateElement newTextIndexTitleTemplateElement() {
+		TextIndexTitleTemplateElement textIndexTitleTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextIndexTitleTemplateElement.class);
+		this.appendChild(textIndexTitleTemplate);
+		return textIndexTitleTemplate;
+	}
+
+	/**
+	 * Create child element {@odf.element text:user-index-entry-template}.
+	 *
+	 * @param textOutlineLevelValue  the <code>Integer</code> value of <code>TextOutlineLevelAttribute</code>, see {@odf.attribute  text:outline-level} at specification
+	 * @param textStyleNameValue  the <code>String</code> value of <code>TextStyleNameAttribute</code>, see {@odf.attribute  text:style-name} at specification
+	 * @return the element {@odf.element text:user-index-entry-template}
+	 */
+	 public TextUserIndexEntryTemplateElement newTextUserIndexEntryTemplateElement(int textOutlineLevelValue, String textStyleNameValue) {
+		TextUserIndexEntryTemplateElement textUserIndexEntryTemplate = ((OdfFileDom) this.ownerDocument).newOdfElement(TextUserIndexEntryTemplateElement.class);
+		textUserIndexEntryTemplate.setTextOutlineLevelAttribute(textOutlineLevelValue);
+		textUserIndexEntryTemplate.setTextStyleNameAttribute(textStyleNameValue);
+		this.appendChild(textUserIndexEntryTemplate);
+		return textUserIndexEntryTemplate;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableDeclElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableDeclElement.java
new file mode 100644
index 0000000..f6a75a5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableDeclElement.java
@@ -0,0 +1,125 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:variable-decl}.
+ *
+ */
+public class TextVariableDeclElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "variable-decl");
+
+	/**
+	 * Create the instance of <code>TextVariableDeclElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextVariableDeclElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:variable-decl}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableDeclsElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableDeclsElement.java
new file mode 100644
index 0000000..f3e639e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableDeclsElement.java
@@ -0,0 +1,86 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:variable-decls}.
+ *
+ */
+public class TextVariableDeclsElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "variable-decls");
+
+	/**
+	 * Create the instance of <code>TextVariableDeclsElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextVariableDeclsElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:variable-decls}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Create child element {@odf.element text:variable-decl}.
+	 *
+	 * @param officeValueTypeValue  the <code>String</code> value of <code>OfficeValueTypeAttribute</code>, see {@odf.attribute  office:value-type} at specification
+	 * @param textNameValue  the <code>String</code> value of <code>TextNameAttribute</code>, see {@odf.attribute  text:name} at specification
+	 * @return the element {@odf.element text:variable-decl}
+	 */
+	 public TextVariableDeclElement newTextVariableDeclElement(String officeValueTypeValue, String textNameValue) {
+		TextVariableDeclElement textVariableDecl = ((OdfFileDom) this.ownerDocument).newOdfElement(TextVariableDeclElement.class);
+		textVariableDecl.setOfficeValueTypeAttribute(officeValueTypeValue);
+		textVariableDecl.setTextNameAttribute(textNameValue);
+		this.appendChild(textVariableDecl);
+		return textVariableDecl;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableGetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableGetElement.java
new file mode 100644
index 0000000..312a8d0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableGetElement.java
@@ -0,0 +1,156 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:variable-get}.
+ *
+ */
+public class TextVariableGetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "variable-get");
+
+	/**
+	 * Create the instance of <code>TextVariableGetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextVariableGetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:variable-get}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableInputElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableInputElement.java
new file mode 100644
index 0000000..4849b91
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableInputElement.java
@@ -0,0 +1,208 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDescriptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:variable-input}.
+ *
+ */
+public class TextVariableInputElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "variable-input");
+
+	/**
+	 * Create the instance of <code>TextVariableInputElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextVariableInputElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:variable-input}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDescriptionAttribute() {
+		TextDescriptionAttribute attr = (TextDescriptionAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "description");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDescriptionAttribute</code> , See {@odf.attribute text:description}
+	 *
+	 * @param textDescriptionValue   The type is <code>String</code>
+	 */
+	public void setTextDescriptionAttribute(String textDescriptionValue) {
+		TextDescriptionAttribute attr = new TextDescriptionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDescriptionValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableSetElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableSetElement.java
new file mode 100644
index 0000000..351bc52
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextVariableSetElement.java
@@ -0,0 +1,360 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeBooleanValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeCurrencyAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeDateValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeStringValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeTimeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDataStyleNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextDisplayAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextFormulaAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextNameAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:variable-set}.
+ *
+ */
+public class TextVariableSetElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "variable-set");
+
+	/**
+	 * Create the instance of <code>TextVariableSetElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextVariableSetElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:variable-set}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getOfficeBooleanValueAttribute() {
+		OfficeBooleanValueAttribute attr = (OfficeBooleanValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "boolean-value");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeBooleanValueAttribute</code> , See {@odf.attribute office:boolean-value}
+	 *
+	 * @param officeBooleanValueValue   The type is <code>Boolean</code>
+	 */
+	public void setOfficeBooleanValueAttribute(Boolean officeBooleanValueValue) {
+		OfficeBooleanValueAttribute attr = new OfficeBooleanValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(officeBooleanValueValue.booleanValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeCurrencyAttribute() {
+		OfficeCurrencyAttribute attr = (OfficeCurrencyAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "currency");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeCurrencyAttribute</code> , See {@odf.attribute office:currency}
+	 *
+	 * @param officeCurrencyValue   The type is <code>String</code>
+	 */
+	public void setOfficeCurrencyAttribute(String officeCurrencyValue) {
+		OfficeCurrencyAttribute attr = new OfficeCurrencyAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeCurrencyValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeDateValueAttribute() {
+		OfficeDateValueAttribute attr = (OfficeDateValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "date-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeDateValueAttribute</code> , See {@odf.attribute office:date-value}
+	 *
+	 * @param officeDateValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeDateValueAttribute(String officeDateValueValue) {
+		OfficeDateValueAttribute attr = new OfficeDateValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeDateValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeStringValueAttribute() {
+		OfficeStringValueAttribute attr = (OfficeStringValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "string-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeStringValueAttribute</code> , See {@odf.attribute office:string-value}
+	 *
+	 * @param officeStringValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeStringValueAttribute(String officeStringValueValue) {
+		OfficeStringValueAttribute attr = new OfficeStringValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeStringValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeTimeValueAttribute() {
+		OfficeTimeValueAttribute attr = (OfficeTimeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "time-value");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeTimeValueAttribute</code> , See {@odf.attribute office:time-value}
+	 *
+	 * @param officeTimeValueValue   The type is <code>String</code>
+	 */
+	public void setOfficeTimeValueAttribute(String officeTimeValueValue) {
+		OfficeTimeValueAttribute attr = new OfficeTimeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeTimeValueValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>Double</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Double getOfficeValueAttribute() {
+		OfficeValueAttribute attr = (OfficeValueAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value");
+		if (attr != null) {
+			return Double.valueOf(attr.doubleValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueAttribute</code> , See {@odf.attribute office:value}
+	 *
+	 * @param officeValueValue   The type is <code>Double</code>
+	 */
+	public void setOfficeValueAttribute(Double officeValueValue) {
+		OfficeValueAttribute attr = new OfficeValueAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setDoubleValue(officeValueValue.doubleValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getOfficeValueTypeAttribute() {
+		OfficeValueTypeAttribute attr = (OfficeValueTypeAttribute) getOdfAttribute(OdfDocumentNamespace.OFFICE, "value-type");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>OfficeValueTypeAttribute</code> , See {@odf.attribute office:value-type}
+	 *
+	 * @param officeValueTypeValue   The type is <code>String</code>
+	 */
+	public void setOfficeValueTypeAttribute(String officeValueTypeValue) {
+		OfficeValueTypeAttribute attr = new OfficeValueTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(officeValueTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleDataStyleNameAttribute() {
+		StyleDataStyleNameAttribute attr = (StyleDataStyleNameAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "data-style-name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleDataStyleNameAttribute</code> , See {@odf.attribute style:data-style-name}
+	 *
+	 * @param styleDataStyleNameValue   The type is <code>String</code>
+	 */
+	public void setStyleDataStyleNameAttribute(String styleDataStyleNameValue) {
+		StyleDataStyleNameAttribute attr = new StyleDataStyleNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleDataStyleNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextDisplayAttribute() {
+		TextDisplayAttribute attr = (TextDisplayAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "display");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextDisplayAttribute</code> , See {@odf.attribute text:display}
+	 *
+	 * @param textDisplayValue   The type is <code>String</code>
+	 */
+	public void setTextDisplayAttribute(String textDisplayValue) {
+		TextDisplayAttribute attr = new TextDisplayAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textDisplayValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextFormulaAttribute() {
+		TextFormulaAttribute attr = (TextFormulaAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "formula");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextFormulaAttribute</code> , See {@odf.attribute text:formula}
+	 *
+	 * @param textFormulaValue   The type is <code>String</code>
+	 */
+	public void setTextFormulaAttribute(String textFormulaValue) {
+		TextFormulaAttribute attr = new TextFormulaAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textFormulaValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getTextNameAttribute() {
+		TextNameAttribute attr = (TextNameAttribute) getOdfAttribute(OdfDocumentNamespace.TEXT, "name");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>TextNameAttribute</code> , See {@odf.attribute text:name}
+	 *
+	 * @param textNameValue   The type is <code>String</code>
+	 */
+	public void setTextNameAttribute(String textNameValue) {
+		TextNameAttribute attr = new TextNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(textNameValue);
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextWordCountElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextWordCountElement.java
new file mode 100644
index 0000000..c36e352
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/text/TextWordCountElement.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.text;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumLetterSyncAttribute;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element text:word-count}.
+ *
+ */
+public class TextWordCountElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "word-count");
+
+	/**
+	 * Create the instance of <code>TextWordCountElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public TextWordCountElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element text:word-count}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public String getStyleNumFormatAttribute() {
+		StyleNumFormatAttribute attr = (StyleNumFormatAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-format");
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumFormatAttribute</code> , See {@odf.attribute style:num-format}
+	 *
+	 * @param styleNumFormatValue   The type is <code>String</code>
+	 */
+	public void setStyleNumFormatAttribute(String styleNumFormatValue) {
+		StyleNumFormatAttribute attr = new StyleNumFormatAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(styleNumFormatValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @return - the <code>Boolean</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Boolean getStyleNumLetterSyncAttribute() {
+		StyleNumLetterSyncAttribute attr = (StyleNumLetterSyncAttribute) getOdfAttribute(OdfDocumentNamespace.STYLE, "num-letter-sync");
+		if (attr != null) {
+			return Boolean.valueOf(attr.booleanValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StyleNumLetterSyncAttribute</code> , See {@odf.attribute style:num-letter-sync}
+	 *
+	 * @param styleNumLetterSyncValue   The type is <code>Boolean</code>
+	 */
+	public void setStyleNumLetterSyncAttribute(Boolean styleNumLetterSyncValue) {
+		StyleNumLetterSyncAttribute attr = new StyleNumLetterSyncAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setBooleanValue(styleNumLetterSyncValue.booleanValue());
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/xforms/XformsModelElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/xforms/XformsModelElement.java
new file mode 100644
index 0000000..d8abd3a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/element/xforms/XformsModelElement.java
@@ -0,0 +1,73 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.element.xforms;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.ElementVisitor;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element xforms:model}.
+ *
+ * This class can have any org.w3c.dom.Element child element.
+ * This class can have any org.w3c.dom.Attribute attribute.
+ */
+public class XformsModelElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.XFORMS, "model");
+
+	/**
+	 * Create the instance of <code>XformsModelElement</code>
+	 *
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
+	 */
+	public XformsModelElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element xforms:model}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	@Override
+	public void accept(ElementVisitor visitor) {
+		if (visitor instanceof DefaultElementVisitor) {
+			DefaultElementVisitor defaultVisitor = (DefaultElementVisitor) visitor;
+			defaultVisitor.visit(this);
+		} else {
+			visitor.visit(this);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/rdfa/BookmarkRDFMetadataExtractor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/rdfa/BookmarkRDFMetadataExtractor.java
new file mode 100644
index 0000000..475514c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/rdfa/BookmarkRDFMetadataExtractor.java
@@ -0,0 +1,320 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.rdfa;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.xml.stream.XMLEventFactory;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.StartElement;
+
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkStartElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.rdfa.DOMAttributes;
+import org.odftoolkit.odfdom.pkg.rdfa.JenaSink;
+import org.w3c.dom.Node;
+import org.xml.sax.Attributes;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.rdf.model.Property;
+import com.hp.hpl.jena.rdf.model.Resource;
+
+/**
+ * This is a sub class of <code>DefaultElementVisitor</code>, which is used to
+ * extract metadata from {@odf.element text:bookmark-start} to
+ * {@odf.element text:bookmark-end} pair.
+ */
+public class BookmarkRDFMetadataExtractor extends DefaultElementVisitor {
+
+	protected static final char NewLineChar = '\n';
+	protected static final char TabChar = '\t';
+	private TextBookmarkStartElement bookmarkstart;
+	private boolean found;
+	protected final Map<TextBookmarkStartElement, ExtractorStringBuilder> builderMap;
+	protected final Map<TextBookmarkStartElement, String> stringMap;
+
+	private XMLEventFactory eventFactory = XMLEventFactory.newInstance();
+
+	private JenaSink sink;
+
+	/**
+	 * This class is used to provide the string builder functions to extractor.
+	 * It will automatically process the last NewLineChar.
+	 * 
+	 * @since 0.3.5
+	 */
+	protected static class ExtractorStringBuilder {
+		private StringBuilder mBuilder;
+		private boolean lastAppendNewLine;
+
+		ExtractorStringBuilder() {
+			mBuilder = new StringBuilder();
+			lastAppendNewLine = false;
+		}
+
+		/**
+		 * Append a string
+		 * 
+		 * @param str
+		 *            - the string
+		 */
+		public void append(String str) {
+			mBuilder.append(str);
+		}
+
+		/**
+		 * Append a character
+		 * 
+		 * @param ch
+		 *            - the character
+		 */
+		public void append(char ch) {
+			mBuilder.append(ch);
+		}
+
+		/**
+		 * Append a new line character at the end
+		 */
+		public void appendLine() {
+			mBuilder.append(NewLineChar);
+			lastAppendNewLine = true;
+		}
+
+		/**
+		 * Return the string value.
+		 * <p>
+		 * If the last character is a new line character and is appended with
+		 * appendLine(), the last new line character will be removed.
+		 */
+		public String toString() {
+			if (lastAppendNewLine) {
+				mBuilder.deleteCharAt(mBuilder.length() - 1);
+			}
+			return mBuilder.toString();
+		}
+	}
+
+	/**
+	 * Create a BookmarkRDFMetadataExtractor instance, which RDF metadata
+	 * content of bookmarks can be extracted by
+	 * <code>getBookmarkRDFMetadata()</code>.
+	 * 
+	 * @param element
+	 *            the ODF element whose text will be extracted.
+	 * @return an instance of BookmarkRDFMetadataExtractor
+	 */
+	public static BookmarkRDFMetadataExtractor newBookmarkTextExtractor() {
+		return new BookmarkRDFMetadataExtractor();
+	}
+
+	/**
+	 * Return the RDF metadata of specified ODF element as a Jena Model.
+	 * 
+	 * @return the text content as a string
+	 */
+	public Model getBookmarkRDFMetadata(OdfFileDom dom) {
+		this.bookmarkstart = null;
+		this.found = false;
+		this.sink = dom.getSink();
+		visit(dom.getRootElement());
+		return getModel();
+	}
+
+	public Model getBookmarkRDFMetadata(TextBookmarkStartElement bookmarkstart) {
+		this.bookmarkstart = bookmarkstart;
+		this.found = false;
+		this.sink = ((OdfFileDom) bookmarkstart.getOwnerDocument()).getSink();
+		visit(((OdfFileDom) bookmarkstart.getOwnerDocument()).getRootElement());
+		return getModel();
+	}
+
+	private Model getModel() {
+		Model m = ModelFactory.createDefaultModel();
+		for (Entry<TextBookmarkStartElement, String> entry : stringMap
+				.entrySet()) {
+			String xhtmlAbout = entry.getKey().getXhtmlAboutAttribute();
+			String xhtmlProperty = entry.getKey().getXhtmlPropertyAttribute();
+			String xhtmlContent = entry.getKey().getXhtmlContentAttribute();
+			if (xhtmlAbout != null && xhtmlProperty != null) {
+				String qname = entry.getKey().getNodeName();
+				String namespaceURI = entry.getKey().getNamespaceURI();
+				String localname = entry.getKey().getLocalName();
+				String prefix = (qname.indexOf(':') == -1) ? "" : qname
+						.substring(0, qname.indexOf(':'));
+
+				StartElement e = eventFactory.createStartElement(prefix,
+						namespaceURI, localname,
+						fromAttributes(new DOMAttributes(entry.getKey()
+								.getAttributes())), null, sink.getContext());
+
+				xhtmlAbout = sink.getExtractor().expandSafeCURIE(e, xhtmlAbout,
+						sink.getContext());
+				xhtmlProperty = sink.getExtractor().expandCURIE(e,
+						xhtmlProperty, sink.getContext());
+				Resource s = m.createResource(xhtmlAbout);
+				Property p = m.createProperty(xhtmlProperty);
+				if (xhtmlContent != null) {
+					s.addLiteral(p, xhtmlContent);
+				} else {
+					s.addLiteral(p, entry.getValue());
+				}
+
+			}
+		}
+		return m;
+	}
+
+	private Iterator fromAttributes(Attributes attributes) {
+		List toReturn = new LinkedList();
+
+		for (int i = 0; i < attributes.getLength(); i++) {
+			String qname = attributes.getQName(i);
+			String prefix = qname.contains(":") ? qname.substring(0,
+					qname.indexOf(":")) : "";
+			Attribute attr = eventFactory.createAttribute(prefix,
+					attributes.getURI(i), attributes.getLocalName(i),
+					attributes.getValue(i));
+
+			if (!qname.equals("xmlns") && !qname.startsWith("xmlns:"))
+				toReturn.add(attr);
+		}
+
+		return toReturn.iterator();
+	}
+
+	/**
+	 * Constructor with an ODF element as parameter
+	 * 
+	 * @param element
+	 *            the ODF element whose text would be extracted.
+	 */
+	private BookmarkRDFMetadataExtractor() {
+		builderMap = new HashMap<TextBookmarkStartElement, ExtractorStringBuilder>();
+		stringMap = new HashMap<TextBookmarkStartElement, String>();
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of <code>OdfElement</code>.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.pkg.OdfElement)
+	 */
+	@Override
+	public void visit(OdfElement element) {
+		if (bookmarkstart != null && found) {
+			return;
+		}
+		if (this.bookmarkstart == null) {
+			if (element instanceof TextBookmarkStartElement) {
+				builderMap.put((TextBookmarkStartElement) element,
+						new ExtractorStringBuilder());
+			}
+
+		} else {
+			if (element == bookmarkstart) {
+				builderMap.put((TextBookmarkStartElement) element,
+						new ExtractorStringBuilder());
+			}
+		}
+		appendElementText(element);
+		if (element.getNamespaceURI()
+				.equals(OdfDocumentNamespace.META.getUri())
+				|| element.getNamespaceURI().equals(
+						OdfDocumentNamespace.DC.getUri())) {
+			// textBuilderAppendLine();
+		}
+	}
+
+	/**
+	 * Append the text content of this element to string buffer.
+	 * 
+	 * @param ele
+	 *            the ODF element whose text will be appended.
+	 */
+	private void appendElementText(OdfElement ele) {
+		Node node = ele.getFirstChild();
+		while (node != null) {
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				textBuilderAppend(node.getNodeValue());
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node instanceof TextBookmarkEndElement) {
+					TextBookmarkEndElement end = (TextBookmarkEndElement) node;
+					endBookmark(end);
+				}
+
+				OdfElement element = (OdfElement) node;
+				element.accept(this);
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	private void textBuilderAppendLine() {
+		for (Entry<TextBookmarkStartElement, ExtractorStringBuilder> entry : builderMap
+				.entrySet()) {
+			entry.getValue().appendLine();
+		}
+	}
+
+	private void textBuilderAppend(char ch) {
+		for (Entry<TextBookmarkStartElement, ExtractorStringBuilder> entry : builderMap
+				.entrySet()) {
+			entry.getValue().append(ch);
+		}
+	}
+
+	private void textBuilderAppend(String str) {
+		for (Entry<TextBookmarkStartElement, ExtractorStringBuilder> entry : builderMap
+				.entrySet()) {
+			entry.getValue().append(str);
+		}
+	}
+
+	private void endBookmark(TextBookmarkEndElement end) {
+		TextBookmarkStartElement start = null;
+		for (Entry<TextBookmarkStartElement, ExtractorStringBuilder> entry : builderMap
+				.entrySet()) {
+			if (entry.getKey().getTextNameAttribute()
+					.equals(end.getTextNameAttribute())) {
+				start = entry.getKey();
+				break;
+			}
+		}
+		if (start != null) {
+			stringMap.put(start, builderMap.get(start).toString());
+			builderMap.remove(start);
+			if (bookmarkstart != null) {
+				found = true;
+			}
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/OdfStyleFamily.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/OdfStyleFamily.java
new file mode 100644
index 0000000..912b818
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/OdfStyleFamily.java
@@ -0,0 +1,7672 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.dom.style;
+
+import java.util.Arrays;
+import java.util.Collections;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Map;
+import java.util.HashMap;
+import org.odftoolkit.odfdom.dom.element.style.StyleChartPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDrawingPagePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderFooterPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleRubyPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleSectionPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableRowPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+
+public class OdfStyleFamily implements Comparable<OdfStyleFamily> {
+
+	private String m_name;
+	private Set<OdfStyleProperty> m_properties = new TreeSet<OdfStyleProperty>();
+	private static Map<String, OdfStyleFamily> m_familyByName = new HashMap<String, OdfStyleFamily>();
+
+	public static OdfStyleFamily getByName(String name) {
+		return m_familyByName.get(name);
+	}
+
+	private OdfStyleFamily(String name, OdfStyleProperty[] props) {
+		m_name = name;
+		m_properties.addAll(Arrays.asList(props));
+		m_familyByName.put(name, this);
+	}
+
+	private OdfStyleFamily(String name) {
+		m_name = name;
+		m_familyByName.put(name, this);
+	}
+		
+	public String getName() {
+		return m_name;
+	}
+
+	public int compareTo(OdfStyleFamily o) {
+		return m_name.compareTo(o.toString());
+	}
+
+	public static OdfStyleFamily valueOf(String name) {
+		OdfStyleFamily family = getByName(name);
+		if (family == null) {
+			family = new OdfStyleFamily(name);
+		} 
+		return family;
+	}
+
+	public static String toString(OdfStyleFamily family) {
+		if (family != null) {
+			return family.toString();
+		}
+		else {
+			return new String();
+		}
+	}
+
+	@Override
+	public String toString() {
+		return m_name;
+	}
+
+	public Set<OdfStyleProperty> getProperties() {
+		return Collections.unmodifiableSet(m_properties);
+	}
+
+	public final static OdfStyleFamily Chart = new OdfStyleFamily("chart",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily DrawingPage = new OdfStyleFamily("drawing-page",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Graphic = new OdfStyleFamily("graphic",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Presentation = new OdfStyleFamily("presentation",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Table = new OdfStyleFamily("table",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily TableCell = new OdfStyleFamily("table-cell",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily TableColumn = new OdfStyleFamily("table-column",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily TableRow = new OdfStyleFamily("table-row",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily List = new OdfStyleFamily("list",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Paragraph = new OdfStyleFamily("paragraph",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Ruby = new OdfStyleFamily("ruby",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Section = new OdfStyleFamily("section",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+	public final static OdfStyleFamily Text = new OdfStyleFamily("text",
+			new OdfStyleProperty[]{
+	StyleChartPropertiesElement.AngleOffset,
+	StyleChartPropertiesElement.AutoPosition,
+	StyleChartPropertiesElement.AutoSize,
+	StyleChartPropertiesElement.AxisLabelPosition,
+	StyleChartPropertiesElement.AxisPosition,
+	StyleChartPropertiesElement.ConnectBars,
+	StyleChartPropertiesElement.DataLabelNumber,
+	StyleChartPropertiesElement.DataLabelSymbol,
+	StyleChartPropertiesElement.DataLabelText,
+	StyleChartPropertiesElement.Deep,
+	StyleChartPropertiesElement.DisplayLabel,
+	StyleChartPropertiesElement.ErrorCategory,
+	StyleChartPropertiesElement.ErrorLowerIndicator,
+	StyleChartPropertiesElement.ErrorLowerLimit,
+	StyleChartPropertiesElement.ErrorLowerRange,
+	StyleChartPropertiesElement.ErrorMargin,
+	StyleChartPropertiesElement.ErrorPercentage,
+	StyleChartPropertiesElement.ErrorUpperIndicator,
+	StyleChartPropertiesElement.ErrorUpperLimit,
+	StyleChartPropertiesElement.ErrorUpperRange,
+	StyleChartPropertiesElement.GapWidth,
+	StyleChartPropertiesElement.GroupBarsPerAxis,
+	StyleChartPropertiesElement.HoleSize,
+	StyleChartPropertiesElement.IncludeHiddenCells,
+	StyleChartPropertiesElement.Interpolation,
+	StyleChartPropertiesElement.IntervalMajor,
+	StyleChartPropertiesElement.IntervalMinorDivisor,
+	StyleChartPropertiesElement.JapaneseCandleStick,
+	StyleChartPropertiesElement.LabelArrangement,
+	StyleChartPropertiesElement.LabelPosition,
+	StyleChartPropertiesElement.LabelPositionNegative,
+	StyleChartPropertiesElement.Lines,
+	StyleChartPropertiesElement.LinkDataStyleToSource,
+	StyleChartPropertiesElement.Logarithmic,
+	StyleChartPropertiesElement.Maximum,
+	StyleChartPropertiesElement.MeanValue,
+	StyleChartPropertiesElement.Minimum,
+	StyleChartPropertiesElement.Origin,
+	StyleChartPropertiesElement.Overlap,
+	StyleChartPropertiesElement.Percentage,
+	StyleChartPropertiesElement.PieOffset,
+	StyleChartPropertiesElement.RegressionType,
+	StyleChartPropertiesElement.ReverseDirection,
+	StyleChartPropertiesElement.RightAngledAxes,
+	StyleChartPropertiesElement.ScaleText,
+	StyleChartPropertiesElement.SeriesSource,
+	StyleChartPropertiesElement.SolidType,
+	StyleChartPropertiesElement.SortByXValues,
+	StyleChartPropertiesElement.SplineOrder,
+	StyleChartPropertiesElement.SplineResolution,
+	StyleChartPropertiesElement.Stacked,
+	StyleChartPropertiesElement.SymbolHeight,
+	StyleChartPropertiesElement.SymbolName,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolType,
+	StyleChartPropertiesElement.SymbolWidth,
+	StyleChartPropertiesElement.TextOverlap,
+	StyleChartPropertiesElement.ThreeDimensional,
+	StyleChartPropertiesElement.TickMarkPosition,
+	StyleChartPropertiesElement.TickMarksMajorInner,
+	StyleChartPropertiesElement.TickMarksMajorOuter,
+	StyleChartPropertiesElement.TickMarksMinorInner,
+	StyleChartPropertiesElement.TickMarksMinorOuter,
+	StyleChartPropertiesElement.TreatEmptyCells,
+	StyleChartPropertiesElement.Vertical,
+	StyleChartPropertiesElement.Visible,
+	StyleChartPropertiesElement.Direction,
+	StyleChartPropertiesElement.RotationAngle,
+	StyleChartPropertiesElement.LineBreak,
+	StyleDrawingPagePropertiesElement.BackgroundSize,
+	StyleDrawingPagePropertiesElement.Fill,
+	StyleDrawingPagePropertiesElement.FillColor,
+	StyleDrawingPagePropertiesElement.FillGradientName,
+	StyleDrawingPagePropertiesElement.FillHatchName,
+	StyleDrawingPagePropertiesElement.FillHatchSolid,
+	StyleDrawingPagePropertiesElement.FillImageHeight,
+	StyleDrawingPagePropertiesElement.FillImageName,
+	StyleDrawingPagePropertiesElement.FillImageRefPoint,
+	StyleDrawingPagePropertiesElement.FillImageRefPointX,
+	StyleDrawingPagePropertiesElement.FillImageRefPointY,
+	StyleDrawingPagePropertiesElement.FillImageWidth,
+	StyleDrawingPagePropertiesElement.GradientStepCount,
+	StyleDrawingPagePropertiesElement.Opacity,
+	StyleDrawingPagePropertiesElement.OpacityName,
+	StyleDrawingPagePropertiesElement.SecondaryFillColor,
+	StyleDrawingPagePropertiesElement.TileRepeatOffset,
+	StyleDrawingPagePropertiesElement.BackgroundObjectsVisible,
+	StyleDrawingPagePropertiesElement.BackgroundVisible,
+	StyleDrawingPagePropertiesElement.DisplayDateTime,
+	StyleDrawingPagePropertiesElement.DisplayFooter,
+	StyleDrawingPagePropertiesElement.DisplayHeader,
+	StyleDrawingPagePropertiesElement.DisplayPageNumber,
+	StyleDrawingPagePropertiesElement.Duration,
+	StyleDrawingPagePropertiesElement.TransitionSpeed,
+	StyleDrawingPagePropertiesElement.TransitionStyle,
+	StyleDrawingPagePropertiesElement.TransitionType,
+	StyleDrawingPagePropertiesElement.Visibility,
+	StyleDrawingPagePropertiesElement.Direction,
+	StyleDrawingPagePropertiesElement.FadeColor,
+	StyleDrawingPagePropertiesElement.Subtype,
+	StyleDrawingPagePropertiesElement.Type,
+	StyleDrawingPagePropertiesElement.Repeat,
+	StyleDrawingPagePropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.AmbientColor,
+	StyleGraphicPropertiesElement.BackScale,
+	StyleGraphicPropertiesElement.BackfaceCulling,
+	StyleGraphicPropertiesElement.CloseBack,
+	StyleGraphicPropertiesElement.CloseFront,
+	StyleGraphicPropertiesElement.Depth,
+	StyleGraphicPropertiesElement.DiffuseColor,
+	StyleGraphicPropertiesElement.EdgeRounding,
+	StyleGraphicPropertiesElement.EdgeRoundingMode,
+	StyleGraphicPropertiesElement.EmissiveColor,
+	StyleGraphicPropertiesElement.EndAngle,
+	StyleGraphicPropertiesElement.HorizontalSegments,
+	StyleGraphicPropertiesElement.LightingMode,
+	StyleGraphicPropertiesElement.NormalsDirection,
+	StyleGraphicPropertiesElement.NormalsKind,
+	StyleGraphicPropertiesElement.Dr3dShadow,
+	StyleGraphicPropertiesElement.Shininess,
+	StyleGraphicPropertiesElement.SpecularColor,
+	StyleGraphicPropertiesElement.TextureFilter,
+	StyleGraphicPropertiesElement.TextureGenerationModeX,
+	StyleGraphicPropertiesElement.TextureGenerationModeY,
+	StyleGraphicPropertiesElement.TextureKind,
+	StyleGraphicPropertiesElement.TextureMode,
+	StyleGraphicPropertiesElement.VerticalSegments,
+	StyleGraphicPropertiesElement.AutoGrowHeight,
+	StyleGraphicPropertiesElement.AutoGrowWidth,
+	StyleGraphicPropertiesElement.Blue,
+	StyleGraphicPropertiesElement.CaptionAngle,
+	StyleGraphicPropertiesElement.CaptionAngleType,
+	StyleGraphicPropertiesElement.CaptionEscape,
+	StyleGraphicPropertiesElement.CaptionEscapeDirection,
+	StyleGraphicPropertiesElement.CaptionFitLineLength,
+	StyleGraphicPropertiesElement.CaptionGap,
+	StyleGraphicPropertiesElement.CaptionLineLength,
+	StyleGraphicPropertiesElement.CaptionType,
+	StyleGraphicPropertiesElement.ColorInversion,
+	StyleGraphicPropertiesElement.ColorMode,
+	StyleGraphicPropertiesElement.Contrast,
+	StyleGraphicPropertiesElement.DecimalPlaces,
+	StyleGraphicPropertiesElement.DrawAspect,
+	StyleGraphicPropertiesElement.EndGuide,
+	StyleGraphicPropertiesElement.EndLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.EndLineSpacingVertical,
+	StyleGraphicPropertiesElement.Fill,
+	StyleGraphicPropertiesElement.FillColor,
+	StyleGraphicPropertiesElement.FillGradientName,
+	StyleGraphicPropertiesElement.FillHatchName,
+	StyleGraphicPropertiesElement.FillHatchSolid,
+	StyleGraphicPropertiesElement.FillImageHeight,
+	StyleGraphicPropertiesElement.FillImageName,
+	StyleGraphicPropertiesElement.FillImageRefPoint,
+	StyleGraphicPropertiesElement.FillImageRefPointX,
+	StyleGraphicPropertiesElement.FillImageRefPointY,
+	StyleGraphicPropertiesElement.FillImageWidth,
+	StyleGraphicPropertiesElement.FitToContour,
+	StyleGraphicPropertiesElement.FitToSize,
+	StyleGraphicPropertiesElement.FrameDisplayBorder,
+	StyleGraphicPropertiesElement.FrameDisplayScrollbar,
+	StyleGraphicPropertiesElement.FrameMarginHorizontal,
+	StyleGraphicPropertiesElement.FrameMarginVertical,
+	StyleGraphicPropertiesElement.Gamma,
+	StyleGraphicPropertiesElement.GradientStepCount,
+	StyleGraphicPropertiesElement.Green,
+	StyleGraphicPropertiesElement.GuideDistance,
+	StyleGraphicPropertiesElement.GuideOverhang,
+	StyleGraphicPropertiesElement.ImageOpacity,
+	StyleGraphicPropertiesElement.LineDistance,
+	StyleGraphicPropertiesElement.Luminance,
+	StyleGraphicPropertiesElement.MarkerEnd,
+	StyleGraphicPropertiesElement.MarkerEndCenter,
+	StyleGraphicPropertiesElement.MarkerEndWidth,
+	StyleGraphicPropertiesElement.MarkerStart,
+	StyleGraphicPropertiesElement.MarkerStartCenter,
+	StyleGraphicPropertiesElement.MarkerStartWidth,
+	StyleGraphicPropertiesElement.MeasureAlign,
+	StyleGraphicPropertiesElement.MeasureVerticalAlign,
+	StyleGraphicPropertiesElement.OleDrawAspect,
+	StyleGraphicPropertiesElement.Opacity,
+	StyleGraphicPropertiesElement.OpacityName,
+	StyleGraphicPropertiesElement.Parallel,
+	StyleGraphicPropertiesElement.Placing,
+	StyleGraphicPropertiesElement.Red,
+	StyleGraphicPropertiesElement.SecondaryFillColor,
+	StyleGraphicPropertiesElement.DrawShadow,
+	StyleGraphicPropertiesElement.ShadowColor,
+	StyleGraphicPropertiesElement.ShadowOffsetX,
+	StyleGraphicPropertiesElement.ShadowOffsetY,
+	StyleGraphicPropertiesElement.ShadowOpacity,
+	StyleGraphicPropertiesElement.ShowUnit,
+	StyleGraphicPropertiesElement.StartGuide,
+	StyleGraphicPropertiesElement.StartLineSpacingHorizontal,
+	StyleGraphicPropertiesElement.StartLineSpacingVertical,
+	StyleGraphicPropertiesElement.Stroke,
+	StyleGraphicPropertiesElement.StrokeDash,
+	StyleGraphicPropertiesElement.StrokeDashNames,
+	StyleGraphicPropertiesElement.StrokeLinejoin,
+	StyleGraphicPropertiesElement.SymbolColor,
+	StyleGraphicPropertiesElement.TextareaHorizontalAlign,
+	StyleGraphicPropertiesElement.TextareaVerticalAlign,
+	StyleGraphicPropertiesElement.TileRepeatOffset,
+	StyleGraphicPropertiesElement.Unit,
+	StyleGraphicPropertiesElement.VisibleAreaHeight,
+	StyleGraphicPropertiesElement.VisibleAreaLeft,
+	StyleGraphicPropertiesElement.VisibleAreaTop,
+	StyleGraphicPropertiesElement.VisibleAreaWidth,
+	StyleGraphicPropertiesElement.WrapInfluenceOnPosition,
+	StyleGraphicPropertiesElement.BackgroundColor,
+	StyleGraphicPropertiesElement.Border,
+	StyleGraphicPropertiesElement.BorderBottom,
+	StyleGraphicPropertiesElement.BorderLeft,
+	StyleGraphicPropertiesElement.BorderRight,
+	StyleGraphicPropertiesElement.BorderTop,
+	StyleGraphicPropertiesElement.Clip,
+	StyleGraphicPropertiesElement.Margin,
+	StyleGraphicPropertiesElement.MarginBottom,
+	StyleGraphicPropertiesElement.MarginLeft,
+	StyleGraphicPropertiesElement.MarginRight,
+	StyleGraphicPropertiesElement.MarginTop,
+	StyleGraphicPropertiesElement.MaxHeight,
+	StyleGraphicPropertiesElement.MaxWidth,
+	StyleGraphicPropertiesElement.MinHeight,
+	StyleGraphicPropertiesElement.MinWidth,
+	StyleGraphicPropertiesElement.Padding,
+	StyleGraphicPropertiesElement.PaddingBottom,
+	StyleGraphicPropertiesElement.PaddingLeft,
+	StyleGraphicPropertiesElement.PaddingRight,
+	StyleGraphicPropertiesElement.PaddingTop,
+	StyleGraphicPropertiesElement.WrapOption,
+	StyleGraphicPropertiesElement.BackgroundTransparency,
+	StyleGraphicPropertiesElement.BorderLineWidth,
+	StyleGraphicPropertiesElement.BorderLineWidthBottom,
+	StyleGraphicPropertiesElement.BorderLineWidthLeft,
+	StyleGraphicPropertiesElement.BorderLineWidthRight,
+	StyleGraphicPropertiesElement.BorderLineWidthTop,
+	StyleGraphicPropertiesElement.Editable,
+	StyleGraphicPropertiesElement.FlowWithText,
+	StyleGraphicPropertiesElement.HorizontalPos,
+	StyleGraphicPropertiesElement.HorizontalRel,
+	StyleGraphicPropertiesElement.Mirror,
+	StyleGraphicPropertiesElement.NumberWrappedParagraphs,
+	StyleGraphicPropertiesElement.OverflowBehavior,
+	StyleGraphicPropertiesElement.PrintContent,
+	StyleGraphicPropertiesElement.Protect,
+	StyleGraphicPropertiesElement.RelHeight,
+	StyleGraphicPropertiesElement.RelWidth,
+	StyleGraphicPropertiesElement.Repeat,
+	StyleGraphicPropertiesElement.RunThrough,
+	StyleGraphicPropertiesElement.StyleShadow,
+	StyleGraphicPropertiesElement.ShrinkToFit,
+	StyleGraphicPropertiesElement.VerticalPos,
+	StyleGraphicPropertiesElement.VerticalRel,
+	StyleGraphicPropertiesElement.Wrap,
+	StyleGraphicPropertiesElement.WrapContour,
+	StyleGraphicPropertiesElement.WrapContourMode,
+	StyleGraphicPropertiesElement.WrapDynamicThreshold,
+	StyleGraphicPropertiesElement.WritingMode,
+	StyleGraphicPropertiesElement.FillRule,
+	StyleGraphicPropertiesElement.Height,
+	StyleGraphicPropertiesElement.StrokeColor,
+	StyleGraphicPropertiesElement.StrokeLinecap,
+	StyleGraphicPropertiesElement.StrokeOpacity,
+	StyleGraphicPropertiesElement.StrokeWidth,
+	StyleGraphicPropertiesElement.Width,
+	StyleGraphicPropertiesElement.X,
+	StyleGraphicPropertiesElement.Y,
+	StyleGraphicPropertiesElement.AnchorPageNumber,
+	StyleGraphicPropertiesElement.AnchorType,
+	StyleGraphicPropertiesElement.Animation,
+	StyleGraphicPropertiesElement.AnimationDelay,
+	StyleGraphicPropertiesElement.AnimationDirection,
+	StyleGraphicPropertiesElement.AnimationRepeat,
+	StyleGraphicPropertiesElement.AnimationStartInside,
+	StyleGraphicPropertiesElement.AnimationSteps,
+	StyleGraphicPropertiesElement.AnimationStopInside,
+	StyleHeaderFooterPropertiesElement.BackgroundColor,
+	StyleHeaderFooterPropertiesElement.Border,
+	StyleHeaderFooterPropertiesElement.BorderBottom,
+	StyleHeaderFooterPropertiesElement.BorderLeft,
+	StyleHeaderFooterPropertiesElement.BorderRight,
+	StyleHeaderFooterPropertiesElement.BorderTop,
+	StyleHeaderFooterPropertiesElement.Margin,
+	StyleHeaderFooterPropertiesElement.MarginBottom,
+	StyleHeaderFooterPropertiesElement.MarginLeft,
+	StyleHeaderFooterPropertiesElement.MarginRight,
+	StyleHeaderFooterPropertiesElement.MarginTop,
+	StyleHeaderFooterPropertiesElement.MinHeight,
+	StyleHeaderFooterPropertiesElement.Padding,
+	StyleHeaderFooterPropertiesElement.PaddingBottom,
+	StyleHeaderFooterPropertiesElement.PaddingLeft,
+	StyleHeaderFooterPropertiesElement.PaddingRight,
+	StyleHeaderFooterPropertiesElement.PaddingTop,
+	StyleHeaderFooterPropertiesElement.BorderLineWidth,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthBottom,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthLeft,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthRight,
+	StyleHeaderFooterPropertiesElement.BorderLineWidthTop,
+	StyleHeaderFooterPropertiesElement.DynamicSpacing,
+	StyleHeaderFooterPropertiesElement.Shadow,
+	StyleHeaderFooterPropertiesElement.Height,
+	StyleListLevelPropertiesElement.Height,
+	StyleListLevelPropertiesElement.TextAlign,
+	StyleListLevelPropertiesElement.Width,
+	StyleListLevelPropertiesElement.FontName,
+	StyleListLevelPropertiesElement.VerticalPos,
+	StyleListLevelPropertiesElement.VerticalRel,
+	StyleListLevelPropertiesElement.Y,
+	StyleListLevelPropertiesElement.ListLevelPositionAndSpaceMode,
+	StyleListLevelPropertiesElement.MinLabelDistance,
+	StyleListLevelPropertiesElement.MinLabelWidth,
+	StyleListLevelPropertiesElement.SpaceBefore,
+	StylePageLayoutPropertiesElement.BackgroundColor,
+	StylePageLayoutPropertiesElement.Border,
+	StylePageLayoutPropertiesElement.BorderBottom,
+	StylePageLayoutPropertiesElement.BorderLeft,
+	StylePageLayoutPropertiesElement.BorderRight,
+	StylePageLayoutPropertiesElement.BorderTop,
+	StylePageLayoutPropertiesElement.Margin,
+	StylePageLayoutPropertiesElement.MarginBottom,
+	StylePageLayoutPropertiesElement.MarginLeft,
+	StylePageLayoutPropertiesElement.MarginRight,
+	StylePageLayoutPropertiesElement.MarginTop,
+	StylePageLayoutPropertiesElement.Padding,
+	StylePageLayoutPropertiesElement.PaddingBottom,
+	StylePageLayoutPropertiesElement.PaddingLeft,
+	StylePageLayoutPropertiesElement.PaddingRight,
+	StylePageLayoutPropertiesElement.PaddingTop,
+	StylePageLayoutPropertiesElement.PageHeight,
+	StylePageLayoutPropertiesElement.PageWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidth,
+	StylePageLayoutPropertiesElement.BorderLineWidthBottom,
+	StylePageLayoutPropertiesElement.BorderLineWidthLeft,
+	StylePageLayoutPropertiesElement.BorderLineWidthRight,
+	StylePageLayoutPropertiesElement.BorderLineWidthTop,
+	StylePageLayoutPropertiesElement.FirstPageNumber,
+	StylePageLayoutPropertiesElement.FootnoteMaxHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseHeight,
+	StylePageLayoutPropertiesElement.LayoutGridBaseWidth,
+	StylePageLayoutPropertiesElement.LayoutGridColor,
+	StylePageLayoutPropertiesElement.LayoutGridDisplay,
+	StylePageLayoutPropertiesElement.LayoutGridLines,
+	StylePageLayoutPropertiesElement.LayoutGridMode,
+	StylePageLayoutPropertiesElement.LayoutGridPrint,
+	StylePageLayoutPropertiesElement.LayoutGridRubyBelow,
+	StylePageLayoutPropertiesElement.LayoutGridRubyHeight,
+	StylePageLayoutPropertiesElement.LayoutGridSnapTo,
+	StylePageLayoutPropertiesElement.LayoutGridStandardMode,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumFormat,
+	StylePageLayoutPropertiesElement.NumLetterSync,
+	StylePageLayoutPropertiesElement.NumPrefix,
+	StylePageLayoutPropertiesElement.NumSuffix,
+	StylePageLayoutPropertiesElement.PaperTrayName,
+	StylePageLayoutPropertiesElement.Print,
+	StylePageLayoutPropertiesElement.PrintOrientation,
+	StylePageLayoutPropertiesElement.PrintPageOrder,
+	StylePageLayoutPropertiesElement.RegisterTruthRefStyleName,
+	StylePageLayoutPropertiesElement.ScaleTo,
+	StylePageLayoutPropertiesElement.ScaleToPages,
+	StylePageLayoutPropertiesElement.Shadow,
+	StylePageLayoutPropertiesElement.TableCentering,
+	StylePageLayoutPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.BackgroundColor,
+	StyleParagraphPropertiesElement.Border,
+	StyleParagraphPropertiesElement.BorderBottom,
+	StyleParagraphPropertiesElement.BorderLeft,
+	StyleParagraphPropertiesElement.BorderRight,
+	StyleParagraphPropertiesElement.BorderTop,
+	StyleParagraphPropertiesElement.BreakAfter,
+	StyleParagraphPropertiesElement.BreakBefore,
+	StyleParagraphPropertiesElement.HyphenationKeep,
+	StyleParagraphPropertiesElement.HyphenationLadderCount,
+	StyleParagraphPropertiesElement.KeepTogether,
+	StyleParagraphPropertiesElement.KeepWithNext,
+	StyleParagraphPropertiesElement.LineHeight,
+	StyleParagraphPropertiesElement.Margin,
+	StyleParagraphPropertiesElement.MarginBottom,
+	StyleParagraphPropertiesElement.MarginLeft,
+	StyleParagraphPropertiesElement.MarginRight,
+	StyleParagraphPropertiesElement.MarginTop,
+	StyleParagraphPropertiesElement.Orphans,
+	StyleParagraphPropertiesElement.Padding,
+	StyleParagraphPropertiesElement.PaddingBottom,
+	StyleParagraphPropertiesElement.PaddingLeft,
+	StyleParagraphPropertiesElement.PaddingRight,
+	StyleParagraphPropertiesElement.PaddingTop,
+	StyleParagraphPropertiesElement.TextAlign,
+	StyleParagraphPropertiesElement.TextAlignLast,
+	StyleParagraphPropertiesElement.TextIndent,
+	StyleParagraphPropertiesElement.Widows,
+	StyleParagraphPropertiesElement.AutoTextIndent,
+	StyleParagraphPropertiesElement.BackgroundTransparency,
+	StyleParagraphPropertiesElement.BorderLineWidth,
+	StyleParagraphPropertiesElement.BorderLineWidthBottom,
+	StyleParagraphPropertiesElement.BorderLineWidthLeft,
+	StyleParagraphPropertiesElement.BorderLineWidthRight,
+	StyleParagraphPropertiesElement.BorderLineWidthTop,
+	StyleParagraphPropertiesElement.FontIndependentLineSpacing,
+	StyleParagraphPropertiesElement.JoinBorder,
+	StyleParagraphPropertiesElement.JustifySingleWord,
+	StyleParagraphPropertiesElement.LineBreak,
+	StyleParagraphPropertiesElement.LineHeightAtLeast,
+	StyleParagraphPropertiesElement.LineSpacing,
+	StyleParagraphPropertiesElement.PageNumber,
+	StyleParagraphPropertiesElement.PunctuationWrap,
+	StyleParagraphPropertiesElement.RegisterTrue,
+	StyleParagraphPropertiesElement.Shadow,
+	StyleParagraphPropertiesElement.SnapToLayoutGrid,
+	StyleParagraphPropertiesElement.TabStopDistance,
+	StyleParagraphPropertiesElement.TextAutospace,
+	StyleParagraphPropertiesElement.VerticalAlign,
+	StyleParagraphPropertiesElement.WritingMode,
+	StyleParagraphPropertiesElement.WritingModeAutomatic,
+	StyleParagraphPropertiesElement.LineNumber,
+	StyleParagraphPropertiesElement.NumberLines,
+	StyleRubyPropertiesElement.RubyAlign,
+	StyleRubyPropertiesElement.RubyPosition,
+	StyleSectionPropertiesElement.BackgroundColor,
+	StyleSectionPropertiesElement.MarginLeft,
+	StyleSectionPropertiesElement.MarginRight,
+	StyleSectionPropertiesElement.Editable,
+	StyleSectionPropertiesElement.Protect,
+	StyleSectionPropertiesElement.WritingMode,
+	StyleSectionPropertiesElement.DontBalanceTextColumns,
+	StyleTableCellPropertiesElement.BackgroundColor,
+	StyleTableCellPropertiesElement.Border,
+	StyleTableCellPropertiesElement.BorderBottom,
+	StyleTableCellPropertiesElement.BorderLeft,
+	StyleTableCellPropertiesElement.BorderRight,
+	StyleTableCellPropertiesElement.BorderTop,
+	StyleTableCellPropertiesElement.Padding,
+	StyleTableCellPropertiesElement.PaddingBottom,
+	StyleTableCellPropertiesElement.PaddingLeft,
+	StyleTableCellPropertiesElement.PaddingRight,
+	StyleTableCellPropertiesElement.PaddingTop,
+	StyleTableCellPropertiesElement.WrapOption,
+	StyleTableCellPropertiesElement.BorderLineWidth,
+	StyleTableCellPropertiesElement.BorderLineWidthBottom,
+	StyleTableCellPropertiesElement.BorderLineWidthLeft,
+	StyleTableCellPropertiesElement.BorderLineWidthRight,
+	StyleTableCellPropertiesElement.BorderLineWidthTop,
+	StyleTableCellPropertiesElement.CellProtect,
+	StyleTableCellPropertiesElement.DecimalPlaces,
+	StyleTableCellPropertiesElement.DiagonalBlTr,
+	StyleTableCellPropertiesElement.DiagonalBlTrWidths,
+	StyleTableCellPropertiesElement.DiagonalTlBr,
+	StyleTableCellPropertiesElement.DiagonalTlBrWidths,
+	StyleTableCellPropertiesElement.Direction,
+	StyleTableCellPropertiesElement.GlyphOrientationVertical,
+	StyleTableCellPropertiesElement.PrintContent,
+	StyleTableCellPropertiesElement.RepeatContent,
+	StyleTableCellPropertiesElement.RotationAlign,
+	StyleTableCellPropertiesElement.RotationAngle,
+	StyleTableCellPropertiesElement.Shadow,
+	StyleTableCellPropertiesElement.ShrinkToFit,
+	StyleTableCellPropertiesElement.TextAlignSource,
+	StyleTableCellPropertiesElement.VerticalAlign,
+	StyleTableCellPropertiesElement.WritingMode,
+	StyleTableColumnPropertiesElement.BreakAfter,
+	StyleTableColumnPropertiesElement.BreakBefore,
+	StyleTableColumnPropertiesElement.ColumnWidth,
+	StyleTableColumnPropertiesElement.RelColumnWidth,
+	StyleTableColumnPropertiesElement.UseOptimalColumnWidth,
+	StyleTablePropertiesElement.BackgroundColor,
+	StyleTablePropertiesElement.BreakAfter,
+	StyleTablePropertiesElement.BreakBefore,
+	StyleTablePropertiesElement.KeepWithNext,
+	StyleTablePropertiesElement.Margin,
+	StyleTablePropertiesElement.MarginBottom,
+	StyleTablePropertiesElement.MarginLeft,
+	StyleTablePropertiesElement.MarginRight,
+	StyleTablePropertiesElement.MarginTop,
+	StyleTablePropertiesElement.MayBreakBetweenRows,
+	StyleTablePropertiesElement.PageNumber,
+	StyleTablePropertiesElement.RelWidth,
+	StyleTablePropertiesElement.Shadow,
+	StyleTablePropertiesElement.Width,
+	StyleTablePropertiesElement.WritingMode,
+	StyleTablePropertiesElement.Align,
+	StyleTablePropertiesElement.BorderModel,
+	StyleTablePropertiesElement.Display,
+	StyleTableRowPropertiesElement.BackgroundColor,
+	StyleTableRowPropertiesElement.BreakAfter,
+	StyleTableRowPropertiesElement.BreakBefore,
+	StyleTableRowPropertiesElement.KeepTogether,
+	StyleTableRowPropertiesElement.MinRowHeight,
+	StyleTableRowPropertiesElement.RowHeight,
+	StyleTableRowPropertiesElement.UseOptimalRowHeight,
+	StyleTextPropertiesElement.BackgroundColor,
+	StyleTextPropertiesElement.Color,
+	StyleTextPropertiesElement.Country,
+	StyleTextPropertiesElement.FontFamily,
+	StyleTextPropertiesElement.FontSize,
+	StyleTextPropertiesElement.FontStyle,
+	StyleTextPropertiesElement.FontVariant,
+	StyleTextPropertiesElement.FontWeight,
+	StyleTextPropertiesElement.Hyphenate,
+	StyleTextPropertiesElement.HyphenationPushCharCount,
+	StyleTextPropertiesElement.HyphenationRemainCharCount,
+	StyleTextPropertiesElement.Language,
+	StyleTextPropertiesElement.LetterSpacing,
+	StyleTextPropertiesElement.Script,
+	StyleTextPropertiesElement.TextShadow,
+	StyleTextPropertiesElement.TextTransform,
+	StyleTextPropertiesElement.CountryAsian,
+	StyleTextPropertiesElement.CountryComplex,
+	StyleTextPropertiesElement.FontCharset,
+	StyleTextPropertiesElement.FontCharsetAsian,
+	StyleTextPropertiesElement.FontCharsetComplex,
+	StyleTextPropertiesElement.FontFamilyAsian,
+	StyleTextPropertiesElement.FontFamilyComplex,
+	StyleTextPropertiesElement.FontFamilyGeneric,
+	StyleTextPropertiesElement.FontFamilyGenericAsian,
+	StyleTextPropertiesElement.FontFamilyGenericComplex,
+	StyleTextPropertiesElement.FontName,
+	StyleTextPropertiesElement.FontNameAsian,
+	StyleTextPropertiesElement.FontNameComplex,
+	StyleTextPropertiesElement.FontPitch,
+	StyleTextPropertiesElement.FontPitchAsian,
+	StyleTextPropertiesElement.FontPitchComplex,
+	StyleTextPropertiesElement.FontRelief,
+	StyleTextPropertiesElement.FontSizeAsian,
+	StyleTextPropertiesElement.FontSizeComplex,
+	StyleTextPropertiesElement.FontSizeRel,
+	StyleTextPropertiesElement.FontSizeRelAsian,
+	StyleTextPropertiesElement.FontSizeRelComplex,
+	StyleTextPropertiesElement.FontStyleAsian,
+	StyleTextPropertiesElement.FontStyleComplex,
+	StyleTextPropertiesElement.FontStyleName,
+	StyleTextPropertiesElement.FontStyleNameAsian,
+	StyleTextPropertiesElement.FontStyleNameComplex,
+	StyleTextPropertiesElement.FontWeightAsian,
+	StyleTextPropertiesElement.FontWeightComplex,
+	StyleTextPropertiesElement.LanguageAsian,
+	StyleTextPropertiesElement.LanguageComplex,
+	StyleTextPropertiesElement.LetterKerning,
+	StyleTextPropertiesElement.RfcLanguageTag,
+	StyleTextPropertiesElement.RfcLanguageTagAsian,
+	StyleTextPropertiesElement.RfcLanguageTagComplex,
+	StyleTextPropertiesElement.ScriptAsian,
+	StyleTextPropertiesElement.ScriptComplex,
+	StyleTextPropertiesElement.ScriptType,
+	StyleTextPropertiesElement.TextBlinking,
+	StyleTextPropertiesElement.TextCombine,
+	StyleTextPropertiesElement.TextCombineEndChar,
+	StyleTextPropertiesElement.TextCombineStartChar,
+	StyleTextPropertiesElement.TextEmphasize,
+	StyleTextPropertiesElement.TextLineThroughColor,
+	StyleTextPropertiesElement.TextLineThroughMode,
+	StyleTextPropertiesElement.TextLineThroughStyle,
+	StyleTextPropertiesElement.TextLineThroughText,
+	StyleTextPropertiesElement.TextLineThroughTextStyle,
+	StyleTextPropertiesElement.TextLineThroughType,
+	StyleTextPropertiesElement.TextLineThroughWidth,
+	StyleTextPropertiesElement.TextOutline,
+	StyleTextPropertiesElement.TextOverlineColor,
+	StyleTextPropertiesElement.TextOverlineMode,
+	StyleTextPropertiesElement.TextOverlineStyle,
+	StyleTextPropertiesElement.TextOverlineType,
+	StyleTextPropertiesElement.TextOverlineWidth,
+	StyleTextPropertiesElement.TextPosition,
+	StyleTextPropertiesElement.TextRotationAngle,
+	StyleTextPropertiesElement.TextRotationScale,
+	StyleTextPropertiesElement.TextScale,
+	StyleTextPropertiesElement.TextUnderlineColor,
+	StyleTextPropertiesElement.TextUnderlineMode,
+	StyleTextPropertiesElement.TextUnderlineStyle,
+	StyleTextPropertiesElement.TextUnderlineType,
+	StyleTextPropertiesElement.TextUnderlineWidth,
+	StyleTextPropertiesElement.UseWindowFontColor,
+	StyleTextPropertiesElement.Condition,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	StyleTextPropertiesElement.Display,
+	});
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/OdfStylePropertySet.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/OdfStylePropertySet.java
new file mode 100644
index 0000000..576281e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/OdfStylePropertySet.java
@@ -0,0 +1,83 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.dom.style;
+
+import java.util.Map;
+
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+
+import java.util.Set;
+
+/**
+ *
+ */
+public interface OdfStylePropertySet
+{
+    /** checks if this styleable element or style has this property directly set.
+     * 
+     * @param property is the property to check.
+     * @return true if this property is directly set at this instance or false if not.
+     */
+    public boolean hasProperty( OdfStyleProperty property );
+
+    /** returns the given property from this styleable element or style.
+     * If it is not directly set, the value of this property from a parent style
+     * will be returned.
+     * 
+     * @param property is the property which value will be returned.
+     * @return the value of this property or null if it is not available in this
+     * set or this parents sets.
+     */
+    public String getProperty( OdfStyleProperty property );
+
+    /** removes the given property from this set
+     * 
+     * @param property is the property to be removed
+     */
+    public void removeProperty( OdfStyleProperty property );
+    
+    /** sets a single style property for this element.
+     * 
+     * @param property is the property that you want to set.
+     * @param value is the value the property is set to.
+     */
+    public void setProperty( OdfStyleProperty property, String value );
+
+    /** set more than one property at once.
+     * 
+     * @param properties is a map of properties with values that should be set.
+     */
+    public void setProperties( Map< OdfStyleProperty, String > properties );
+    
+    /** gets more than one property at once
+     * 
+     * @param properties is a set of all properties that should be returned.
+     * @return a map with all asked properties and theire value, if available.
+     */
+    public Map< OdfStyleProperty, String > getProperties( Set< OdfStyleProperty > properties );
+                                    
+    /** 
+     * @return a set with all properties which are specified in the strict odf format.
+     */
+    public Set< OdfStyleProperty > getStrictProperties();     
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfChartProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfChartProperties.java
new file mode 100644
index 0000000..92966d7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfChartProperties.java
@@ -0,0 +1,167 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfChartProperties {
+	public final static OdfStyleProperty AngleOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "angle-offset"));
+	public final static OdfStyleProperty AutoPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "auto-position"));
+	public final static OdfStyleProperty AutoSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "auto-size"));
+	public final static OdfStyleProperty AxisLabelPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "axis-label-position"));
+	public final static OdfStyleProperty AxisPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "axis-position"));
+	public final static OdfStyleProperty ConnectBars =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "connect-bars"));
+	public final static OdfStyleProperty DataLabelNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "data-label-number"));
+	public final static OdfStyleProperty DataLabelSymbol =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "data-label-symbol"));
+	public final static OdfStyleProperty DataLabelText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "data-label-text"));
+	public final static OdfStyleProperty Deep =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "deep"));
+	public final static OdfStyleProperty DisplayLabel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "display-label"));
+	public final static OdfStyleProperty ErrorCategory =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-category"));
+	public final static OdfStyleProperty ErrorLowerIndicator =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-indicator"));
+	public final static OdfStyleProperty ErrorLowerLimit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-limit"));
+	public final static OdfStyleProperty ErrorLowerRange =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-lower-range"));
+	public final static OdfStyleProperty ErrorMargin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-margin"));
+	public final static OdfStyleProperty ErrorPercentage =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-percentage"));
+	public final static OdfStyleProperty ErrorUpperIndicator =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-indicator"));
+	public final static OdfStyleProperty ErrorUpperLimit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-limit"));
+	public final static OdfStyleProperty ErrorUpperRange =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "error-upper-range"));
+	public final static OdfStyleProperty GapWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "gap-width"));
+	public final static OdfStyleProperty GroupBarsPerAxis =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "group-bars-per-axis"));
+	public final static OdfStyleProperty HoleSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "hole-size"));
+	public final static OdfStyleProperty IncludeHiddenCells =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "include-hidden-cells"));
+	public final static OdfStyleProperty Interpolation =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "interpolation"));
+	public final static OdfStyleProperty IntervalMajor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "interval-major"));
+	public final static OdfStyleProperty IntervalMinorDivisor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "interval-minor-divisor"));
+	public final static OdfStyleProperty JapaneseCandleStick =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "japanese-candle-stick"));
+	public final static OdfStyleProperty LabelArrangement =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "label-arrangement"));
+	public final static OdfStyleProperty LabelPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "label-position"));
+	public final static OdfStyleProperty LabelPositionNegative =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "label-position-negative"));
+	public final static OdfStyleProperty Lines =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "lines"));
+	public final static OdfStyleProperty LinkDataStyleToSource =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "link-data-style-to-source"));
+	public final static OdfStyleProperty Logarithmic =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "logarithmic"));
+	public final static OdfStyleProperty Maximum =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "maximum"));
+	public final static OdfStyleProperty MeanValue =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "mean-value"));
+	public final static OdfStyleProperty Minimum =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "minimum"));
+	public final static OdfStyleProperty Origin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "origin"));
+	public final static OdfStyleProperty Overlap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "overlap"));
+	public final static OdfStyleProperty Percentage =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "percentage"));
+	public final static OdfStyleProperty PieOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "pie-offset"));
+	public final static OdfStyleProperty RegressionType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "regression-type"));
+	public final static OdfStyleProperty ReverseDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "reverse-direction"));
+	public final static OdfStyleProperty RightAngledAxes =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "right-angled-axes"));
+	public final static OdfStyleProperty ScaleText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "scale-text"));
+	public final static OdfStyleProperty SeriesSource =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "series-source"));
+	public final static OdfStyleProperty SolidType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "solid-type"));
+	public final static OdfStyleProperty SortByXValues =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "sort-by-x-values"));
+	public final static OdfStyleProperty SplineOrder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "spline-order"));
+	public final static OdfStyleProperty SplineResolution =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "spline-resolution"));
+	public final static OdfStyleProperty Stacked =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "stacked"));
+	public final static OdfStyleProperty SymbolHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-height"));
+	public final static OdfStyleProperty SymbolName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-name"));
+	public final static OdfStyleProperty SymbolType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-type"));
+	public final static OdfStyleProperty SymbolWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "symbol-width"));
+	public final static OdfStyleProperty TextOverlap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "text-overlap"));
+	public final static OdfStyleProperty ThreeDimensional =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "three-dimensional"));
+	public final static OdfStyleProperty TickMarkPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-mark-position"));
+	public final static OdfStyleProperty TickMarksMajorInner =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-major-inner"));
+	public final static OdfStyleProperty TickMarksMajorOuter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-major-outer"));
+	public final static OdfStyleProperty TickMarksMinorInner =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-minor-inner"));
+	public final static OdfStyleProperty TickMarksMinorOuter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "tick-marks-minor-outer"));
+	public final static OdfStyleProperty TreatEmptyCells =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "treat-empty-cells"));
+	public final static OdfStyleProperty Vertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "vertical"));
+	public final static OdfStyleProperty Visible =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.CHART, "visible"));
+	public final static OdfStyleProperty Direction =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "direction"));
+	public final static OdfStyleProperty RotationAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-angle"));
+	public final static OdfStyleProperty LineBreak =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ChartProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "line-break"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfDrawingPageProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfDrawingPageProperties.java
new file mode 100644
index 0000000..b90c2b9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfDrawingPageProperties.java
@@ -0,0 +1,99 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfDrawingPageProperties {
+	public final static OdfStyleProperty BackgroundSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "background-size"));
+	public final static OdfStyleProperty Fill =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill"));
+	public final static OdfStyleProperty FillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-color"));
+	public final static OdfStyleProperty FillGradientName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-gradient-name"));
+	public final static OdfStyleProperty FillHatchName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-name"));
+	public final static OdfStyleProperty FillHatchSolid =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-solid"));
+	public final static OdfStyleProperty FillImageHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-height"));
+	public final static OdfStyleProperty FillImageName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-name"));
+	public final static OdfStyleProperty FillImageRefPoint =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point"));
+	public final static OdfStyleProperty FillImageRefPointX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x"));
+	public final static OdfStyleProperty FillImageRefPointY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y"));
+	public final static OdfStyleProperty FillImageWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-width"));
+	public final static OdfStyleProperty GradientStepCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "gradient-step-count"));
+	public final static OdfStyleProperty Opacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity"));
+	public final static OdfStyleProperty OpacityName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity-name"));
+	public final static OdfStyleProperty SecondaryFillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "secondary-fill-color"));
+	public final static OdfStyleProperty TileRepeatOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "tile-repeat-offset"));
+	public final static OdfStyleProperty BackgroundObjectsVisible =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "background-objects-visible"));
+	public final static OdfStyleProperty BackgroundVisible =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "background-visible"));
+	public final static OdfStyleProperty DisplayDateTime =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-date-time"));
+	public final static OdfStyleProperty DisplayFooter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-footer"));
+	public final static OdfStyleProperty DisplayHeader =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-header"));
+	public final static OdfStyleProperty DisplayPageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "display-page-number"));
+	public final static OdfStyleProperty Duration =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "duration"));
+	public final static OdfStyleProperty TransitionSpeed =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-speed"));
+	public final static OdfStyleProperty TransitionStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-style"));
+	public final static OdfStyleProperty TransitionType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "transition-type"));
+	public final static OdfStyleProperty Visibility =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.PRESENTATION, "visibility"));
+	public final static OdfStyleProperty Direction =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "direction"));
+	public final static OdfStyleProperty FadeColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "fadeColor"));
+	public final static OdfStyleProperty Subtype =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "subtype"));
+	public final static OdfStyleProperty Type =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SMIL, "type"));
+	public final static OdfStyleProperty Repeat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "repeat"));
+	public final static OdfStyleProperty FillRule =
+		OdfStyleProperty.get(OdfStylePropertiesSet.DrawingPageProperties, OdfName.newName(OdfDocumentNamespace.SVG, "fill-rule"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfGraphicProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfGraphicProperties.java
new file mode 100644
index 0000000..9b4301f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfGraphicProperties.java
@@ -0,0 +1,379 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfGraphicProperties {
+	public final static OdfStyleProperty AmbientColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "ambient-color"));
+	public final static OdfStyleProperty BackScale =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "back-scale"));
+	public final static OdfStyleProperty BackfaceCulling =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "backface-culling"));
+	public final static OdfStyleProperty CloseBack =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "close-back"));
+	public final static OdfStyleProperty CloseFront =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "close-front"));
+	public final static OdfStyleProperty Depth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "depth"));
+	public final static OdfStyleProperty DiffuseColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "diffuse-color"));
+	public final static OdfStyleProperty EdgeRounding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "edge-rounding"));
+	public final static OdfStyleProperty EdgeRoundingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "edge-rounding-mode"));
+	public final static OdfStyleProperty EmissiveColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "emissive-color"));
+	public final static OdfStyleProperty EndAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "end-angle"));
+	public final static OdfStyleProperty HorizontalSegments =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "horizontal-segments"));
+	public final static OdfStyleProperty LightingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "lighting-mode"));
+	public final static OdfStyleProperty NormalsDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "normals-direction"));
+	public final static OdfStyleProperty NormalsKind =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "normals-kind"));
+	public final static OdfStyleProperty Dr3dShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "shadow"));
+	public final static OdfStyleProperty Shininess =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "shininess"));
+	public final static OdfStyleProperty SpecularColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "specular-color"));
+	public final static OdfStyleProperty TextureFilter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-filter"));
+	public final static OdfStyleProperty TextureGenerationModeX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-generation-mode-x"));
+	public final static OdfStyleProperty TextureGenerationModeY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-generation-mode-y"));
+	public final static OdfStyleProperty TextureKind =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-kind"));
+	public final static OdfStyleProperty TextureMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "texture-mode"));
+	public final static OdfStyleProperty VerticalSegments =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DR3D, "vertical-segments"));
+	public final static OdfStyleProperty AutoGrowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "auto-grow-height"));
+	public final static OdfStyleProperty AutoGrowWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "auto-grow-width"));
+	public final static OdfStyleProperty Blue =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "blue"));
+	public final static OdfStyleProperty CaptionAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-angle"));
+	public final static OdfStyleProperty CaptionAngleType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-angle-type"));
+	public final static OdfStyleProperty CaptionEscape =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-escape"));
+	public final static OdfStyleProperty CaptionEscapeDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-escape-direction"));
+	public final static OdfStyleProperty CaptionFitLineLength =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-fit-line-length"));
+	public final static OdfStyleProperty CaptionGap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-gap"));
+	public final static OdfStyleProperty CaptionLineLength =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-line-length"));
+	public final static OdfStyleProperty CaptionType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "caption-type"));
+	public final static OdfStyleProperty ColorInversion =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "color-inversion"));
+	public final static OdfStyleProperty ColorMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "color-mode"));
+	public final static OdfStyleProperty Contrast =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "contrast"));
+	public final static OdfStyleProperty DecimalPlaces =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "decimal-places"));
+	public final static OdfStyleProperty DrawAspect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "draw-aspect"));
+	public final static OdfStyleProperty EndGuide =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "end-guide"));
+	public final static OdfStyleProperty EndLineSpacingHorizontal =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "end-line-spacing-horizontal"));
+	public final static OdfStyleProperty EndLineSpacingVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "end-line-spacing-vertical"));
+	public final static OdfStyleProperty Fill =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill"));
+	public final static OdfStyleProperty FillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-color"));
+	public final static OdfStyleProperty FillGradientName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-gradient-name"));
+	public final static OdfStyleProperty FillHatchName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-name"));
+	public final static OdfStyleProperty FillHatchSolid =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-hatch-solid"));
+	public final static OdfStyleProperty FillImageHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-height"));
+	public final static OdfStyleProperty FillImageName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-name"));
+	public final static OdfStyleProperty FillImageRefPoint =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point"));
+	public final static OdfStyleProperty FillImageRefPointX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-x"));
+	public final static OdfStyleProperty FillImageRefPointY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-ref-point-y"));
+	public final static OdfStyleProperty FillImageWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fill-image-width"));
+	public final static OdfStyleProperty FitToContour =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fit-to-contour"));
+	public final static OdfStyleProperty FitToSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "fit-to-size"));
+	public final static OdfStyleProperty FrameDisplayBorder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-display-border"));
+	public final static OdfStyleProperty FrameDisplayScrollbar =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-display-scrollbar"));
+	public final static OdfStyleProperty FrameMarginHorizontal =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-margin-horizontal"));
+	public final static OdfStyleProperty FrameMarginVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "frame-margin-vertical"));
+	public final static OdfStyleProperty Gamma =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "gamma"));
+	public final static OdfStyleProperty GradientStepCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "gradient-step-count"));
+	public final static OdfStyleProperty Green =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "green"));
+	public final static OdfStyleProperty GuideDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "guide-distance"));
+	public final static OdfStyleProperty GuideOverhang =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "guide-overhang"));
+	public final static OdfStyleProperty ImageOpacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "image-opacity"));
+	public final static OdfStyleProperty LineDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "line-distance"));
+	public final static OdfStyleProperty Luminance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "luminance"));
+	public final static OdfStyleProperty MarkerEnd =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end"));
+	public final static OdfStyleProperty MarkerEndCenter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end-center"));
+	public final static OdfStyleProperty MarkerEndWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-end-width"));
+	public final static OdfStyleProperty MarkerStart =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start"));
+	public final static OdfStyleProperty MarkerStartCenter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start-center"));
+	public final static OdfStyleProperty MarkerStartWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "marker-start-width"));
+	public final static OdfStyleProperty MeasureAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "measure-align"));
+	public final static OdfStyleProperty MeasureVerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "measure-vertical-align"));
+	public final static OdfStyleProperty OleDrawAspect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "ole-draw-aspect"));
+	public final static OdfStyleProperty Opacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity"));
+	public final static OdfStyleProperty OpacityName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "opacity-name"));
+	public final static OdfStyleProperty Parallel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "parallel"));
+	public final static OdfStyleProperty Placing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "placing"));
+	public final static OdfStyleProperty Red =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "red"));
+	public final static OdfStyleProperty SecondaryFillColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "secondary-fill-color"));
+	public final static OdfStyleProperty DrawShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow"));
+	public final static OdfStyleProperty ShadowColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-color"));
+	public final static OdfStyleProperty ShadowOffsetX =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-offset-x"));
+	public final static OdfStyleProperty ShadowOffsetY =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-offset-y"));
+	public final static OdfStyleProperty ShadowOpacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "shadow-opacity"));
+	public final static OdfStyleProperty ShowUnit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "show-unit"));
+	public final static OdfStyleProperty StartGuide =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "start-guide"));
+	public final static OdfStyleProperty StartLineSpacingHorizontal =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "start-line-spacing-horizontal"));
+	public final static OdfStyleProperty StartLineSpacingVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "start-line-spacing-vertical"));
+	public final static OdfStyleProperty Stroke =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke"));
+	public final static OdfStyleProperty StrokeDash =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash"));
+	public final static OdfStyleProperty StrokeDashNames =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-dash-names"));
+	public final static OdfStyleProperty StrokeLinejoin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "stroke-linejoin"));
+	public final static OdfStyleProperty SymbolColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "symbol-color"));
+	public final static OdfStyleProperty TextareaHorizontalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "textarea-horizontal-align"));
+	public final static OdfStyleProperty TextareaVerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "textarea-vertical-align"));
+	public final static OdfStyleProperty TileRepeatOffset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "tile-repeat-offset"));
+	public final static OdfStyleProperty Unit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "unit"));
+	public final static OdfStyleProperty VisibleAreaHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-height"));
+	public final static OdfStyleProperty VisibleAreaLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-left"));
+	public final static OdfStyleProperty VisibleAreaTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-top"));
+	public final static OdfStyleProperty VisibleAreaWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "visible-area-width"));
+	public final static OdfStyleProperty WrapInfluenceOnPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.DRAW, "wrap-influence-on-position"));
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+	public final static OdfStyleProperty Clip =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "clip"));
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+	public final static OdfStyleProperty MaxHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "max-height"));
+	public final static OdfStyleProperty MaxWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "max-width"));
+	public final static OdfStyleProperty MinHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "min-height"));
+	public final static OdfStyleProperty MinWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "min-width"));
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+	public final static OdfStyleProperty WrapOption =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.FO, "wrap-option"));
+	public final static OdfStyleProperty BackgroundTransparency =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "background-transparency"));
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+	public final static OdfStyleProperty Editable =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "editable"));
+	public final static OdfStyleProperty FlowWithText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "flow-with-text"));
+	public final static OdfStyleProperty HorizontalPos =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "horizontal-pos"));
+	public final static OdfStyleProperty HorizontalRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "horizontal-rel"));
+	public final static OdfStyleProperty Mirror =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "mirror"));
+	public final static OdfStyleProperty NumberWrappedParagraphs =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "number-wrapped-paragraphs"));
+	public final static OdfStyleProperty OverflowBehavior =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "overflow-behavior"));
+	public final static OdfStyleProperty PrintContent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-content"));
+	public final static OdfStyleProperty Protect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "protect"));
+	public final static OdfStyleProperty RelHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-height"));
+	public final static OdfStyleProperty RelWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-width"));
+	public final static OdfStyleProperty Repeat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "repeat"));
+	public final static OdfStyleProperty RunThrough =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "run-through"));
+	public final static OdfStyleProperty StyleShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+	public final static OdfStyleProperty ShrinkToFit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shrink-to-fit"));
+	public final static OdfStyleProperty VerticalPos =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-pos"));
+	public final static OdfStyleProperty VerticalRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-rel"));
+	public final static OdfStyleProperty Wrap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap"));
+	public final static OdfStyleProperty WrapContour =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-contour"));
+	public final static OdfStyleProperty WrapContourMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-contour-mode"));
+	public final static OdfStyleProperty WrapDynamicThreshold =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "wrap-dynamic-threshold"));
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+	public final static OdfStyleProperty FillRule =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "fill-rule"));
+	public final static OdfStyleProperty Height =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "height"));
+	public final static OdfStyleProperty StrokeColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-color"));
+	public final static OdfStyleProperty StrokeLinecap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-linecap"));
+	public final static OdfStyleProperty StrokeOpacity =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-opacity"));
+	public final static OdfStyleProperty StrokeWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "stroke-width"));
+	public final static OdfStyleProperty Width =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "width"));
+	public final static OdfStyleProperty X =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "x"));
+	public final static OdfStyleProperty Y =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.SVG, "y"));
+	public final static OdfStyleProperty AnchorPageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "anchor-page-number"));
+	public final static OdfStyleProperty AnchorType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "anchor-type"));
+	public final static OdfStyleProperty Animation =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation"));
+	public final static OdfStyleProperty AnimationDelay =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-delay"));
+	public final static OdfStyleProperty AnimationDirection =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-direction"));
+	public final static OdfStyleProperty AnimationRepeat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-repeat"));
+	public final static OdfStyleProperty AnimationStartInside =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-start-inside"));
+	public final static OdfStyleProperty AnimationSteps =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-steps"));
+	public final static OdfStyleProperty AnimationStopInside =
+		OdfStyleProperty.get(OdfStylePropertiesSet.GraphicProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "animation-stop-inside"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfHeaderFooterProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfHeaderFooterProperties.java
new file mode 100644
index 0000000..5cbe884
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfHeaderFooterProperties.java
@@ -0,0 +1,81 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfHeaderFooterProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+	public final static OdfStyleProperty MinHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "min-height"));
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+	public final static OdfStyleProperty DynamicSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "dynamic-spacing"));
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+	public final static OdfStyleProperty Height =
+		OdfStyleProperty.get(OdfStylePropertiesSet.HeaderFooterProperties, OdfName.newName(OdfDocumentNamespace.SVG, "height"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfListLevelProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfListLevelProperties.java
new file mode 100644
index 0000000..1dd8b88
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfListLevelProperties.java
@@ -0,0 +1,53 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfListLevelProperties {
+	public final static OdfStyleProperty Height =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.FO, "height"));
+	public final static OdfStyleProperty TextAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-align"));
+	public final static OdfStyleProperty Width =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.FO, "width"));
+	public final static OdfStyleProperty FontName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name"));
+	public final static OdfStyleProperty VerticalPos =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-pos"));
+	public final static OdfStyleProperty VerticalRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-rel"));
+	public final static OdfStyleProperty Y =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.SVG, "y"));
+	public final static OdfStyleProperty ListLevelPositionAndSpaceMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "list-level-position-and-space-mode"));
+	public final static OdfStyleProperty MinLabelDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "min-label-distance"));
+	public final static OdfStyleProperty MinLabelWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "min-label-width"));
+	public final static OdfStyleProperty SpaceBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ListLevelProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "space-before"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfPageLayoutProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfPageLayoutProperties.java
new file mode 100644
index 0000000..2b867a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfPageLayoutProperties.java
@@ -0,0 +1,131 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfPageLayoutProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+	public final static OdfStyleProperty PageHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "page-height"));
+	public final static OdfStyleProperty PageWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.FO, "page-width"));
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+	public final static OdfStyleProperty FirstPageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "first-page-number"));
+	public final static OdfStyleProperty FootnoteMaxHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "footnote-max-height"));
+	public final static OdfStyleProperty LayoutGridBaseHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-base-height"));
+	public final static OdfStyleProperty LayoutGridBaseWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-base-width"));
+	public final static OdfStyleProperty LayoutGridColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-color"));
+	public final static OdfStyleProperty LayoutGridDisplay =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-display"));
+	public final static OdfStyleProperty LayoutGridLines =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-lines"));
+	public final static OdfStyleProperty LayoutGridMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-mode"));
+	public final static OdfStyleProperty LayoutGridPrint =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-print"));
+	public final static OdfStyleProperty LayoutGridRubyBelow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-ruby-below"));
+	public final static OdfStyleProperty LayoutGridRubyHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-ruby-height"));
+	public final static OdfStyleProperty LayoutGridSnapTo =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-snap-to"));
+	public final static OdfStyleProperty LayoutGridStandardMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "layout-grid-standard-mode"));
+	public final static OdfStyleProperty NumFormat =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-format"));
+	public final static OdfStyleProperty NumLetterSync =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-letter-sync"));
+	public final static OdfStyleProperty NumPrefix =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-prefix"));
+	public final static OdfStyleProperty NumSuffix =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "num-suffix"));
+	public final static OdfStyleProperty PaperTrayName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "paper-tray-name"));
+	public final static OdfStyleProperty Print =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print"));
+	public final static OdfStyleProperty PrintOrientation =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-orientation"));
+	public final static OdfStyleProperty PrintPageOrder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-page-order"));
+	public final static OdfStyleProperty RegisterTruthRefStyleName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "register-truth-ref-style-name"));
+	public final static OdfStyleProperty ScaleTo =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "scale-to"));
+	public final static OdfStyleProperty ScaleToPages =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "scale-to-pages"));
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+	public final static OdfStyleProperty TableCentering =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "table-centering"));
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.PageLayoutProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfParagraphProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfParagraphProperties.java
new file mode 100644
index 0000000..ac5ce7f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfParagraphProperties.java
@@ -0,0 +1,137 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfParagraphProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+	public final static OdfStyleProperty HyphenationKeep =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-keep"));
+	public final static OdfStyleProperty HyphenationLadderCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-ladder-count"));
+	public final static OdfStyleProperty KeepTogether =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-together"));
+	public final static OdfStyleProperty KeepWithNext =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-with-next"));
+	public final static OdfStyleProperty LineHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "line-height"));
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+	public final static OdfStyleProperty Orphans =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "orphans"));
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+	public final static OdfStyleProperty TextAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-align"));
+	public final static OdfStyleProperty TextAlignLast =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-align-last"));
+	public final static OdfStyleProperty TextIndent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-indent"));
+	public final static OdfStyleProperty Widows =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.FO, "widows"));
+	public final static OdfStyleProperty AutoTextIndent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "auto-text-indent"));
+	public final static OdfStyleProperty BackgroundTransparency =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "background-transparency"));
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+	public final static OdfStyleProperty FontIndependentLineSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-independent-line-spacing"));
+	public final static OdfStyleProperty JoinBorder =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "join-border"));
+	public final static OdfStyleProperty JustifySingleWord =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "justify-single-word"));
+	public final static OdfStyleProperty LineBreak =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "line-break"));
+	public final static OdfStyleProperty LineHeightAtLeast =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "line-height-at-least"));
+	public final static OdfStyleProperty LineSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "line-spacing"));
+	public final static OdfStyleProperty PageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "page-number"));
+	public final static OdfStyleProperty PunctuationWrap =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "punctuation-wrap"));
+	public final static OdfStyleProperty RegisterTrue =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "register-true"));
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+	public final static OdfStyleProperty SnapToLayoutGrid =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "snap-to-layout-grid"));
+	public final static OdfStyleProperty TabStopDistance =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "tab-stop-distance"));
+	public final static OdfStyleProperty TextAutospace =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-autospace"));
+	public final static OdfStyleProperty VerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+	public final static OdfStyleProperty WritingModeAutomatic =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode-automatic"));
+	public final static OdfStyleProperty LineNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "line-number"));
+	public final static OdfStyleProperty NumberLines =
+		OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "number-lines"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfRubyProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfRubyProperties.java
new file mode 100644
index 0000000..2260d95
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfRubyProperties.java
@@ -0,0 +1,35 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfRubyProperties {
+	public final static OdfStyleProperty RubyAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.RubyProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-align"));
+	public final static OdfStyleProperty RubyPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.RubyProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-position"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfRubyStyleProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfRubyStyleProperties.java
new file mode 100644
index 0000000..b439c73
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfRubyStyleProperties.java
@@ -0,0 +1,34 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfRubyStyleProperties {
+    public final static OdfStyleProperty RubyAlign = 
+        OdfStyleProperty.get(OdfStylePropertiesSet.RubyProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-align"));
+    public final static OdfStyleProperty RubyPosition = 
+        OdfStyleProperty.get(OdfStylePropertiesSet.RubyProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "ruby-position"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfSectionProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfSectionProperties.java
new file mode 100644
index 0000000..579f258
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfSectionProperties.java
@@ -0,0 +1,45 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfSectionProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+	public final static OdfStyleProperty Editable =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "editable"));
+	public final static OdfStyleProperty Protect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "protect"));
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+	public final static OdfStyleProperty DontBalanceTextColumns =
+		OdfStyleProperty.get(OdfStylePropertiesSet.SectionProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "dont-balance-text-columns"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfStylePropertiesSet.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfStylePropertiesSet.java
new file mode 100644
index 0000000..b44b2b3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfStylePropertiesSet.java
@@ -0,0 +1,54 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE	CODE !!!
+package	org.odftoolkit.odfdom.dom.style.props;
+public enum	OdfStylePropertiesSet {
+	// style-chart-properties-attlist
+	ChartProperties,
+	// style-drawing-page-properties-attlist
+	DrawingPageProperties,
+	// style-graphic-properties-attlist
+	GraphicProperties,
+	// style-header-footer-properties-attlist
+	HeaderFooterProperties,
+	// style-list-level-properties-attlist
+	ListLevelProperties,
+	// style-page-layout-properties-attlist
+	PageLayoutProperties,
+	// style-paragraph-properties-attlist
+	ParagraphProperties,
+	// style-ruby-properties-attlist
+	RubyProperties,
+	// style-section-properties-attlist
+	SectionProperties,
+	// style-table-cell-properties-attlist
+	TableCellProperties,
+	// style-table-column-properties-attlist
+	TableColumnProperties,
+	// style-table-properties-attlist
+	TableProperties,
+	// style-table-row-properties-attlist
+	TableRowProperties,
+	// style-text-properties-attlist
+	TextProperties,
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfStyleProperty.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfStyleProperty.java
new file mode 100644
index 0000000..2b3d65a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfStyleProperty.java
@@ -0,0 +1,143 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.style.props;
+
+import java.util.Iterator;
+import java.util.TreeSet;
+
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Class to represent a odf style attribut. Each instance has a name and belongs
+ * to an ODF style-properties element. 
+ */
+public class OdfStyleProperty implements Comparable<OdfStyleProperty> {
+
+    private OdfStylePropertiesSet m_propSet;
+    private OdfName m_name;
+
+    private OdfStyleProperty(OdfStylePropertiesSet propSet, OdfName name) {
+        m_propSet = propSet;
+        m_name = name;
+    }
+    private static TreeSet<OdfStyleProperty> m_styleProperties = new TreeSet<OdfStyleProperty>();
+
+    /**
+     * Looks if an OdfStyleProperty is already listed in the static sytleProperties set,
+     * otherwise creates a new one.
+     * @param propSet an OdfStylePropertiesSet member
+     * @param name
+     * @return new created or existing OdfStylePorperty
+     */
+     public static OdfStyleProperty get(OdfStylePropertiesSet propSet, OdfName name) {
+        OdfStyleProperty temp = new OdfStyleProperty(propSet, name);
+        //Replacement for (JDK1.6)
+        //OdfStyleProperty result = m_styleProperties.floor(temp);
+
+        Iterator<OdfStyleProperty> iter = m_styleProperties.iterator();
+        OdfStyleProperty result = null;
+
+        //check if key exists 
+        if (!m_styleProperties.contains(temp)) {
+            m_styleProperties.add(temp);
+            return temp;
+        }
+        while (iter.hasNext()) {
+            result = iter.next();
+            if (result.equals(temp)) {
+                return result;
+            }
+        }
+
+        m_styleProperties.add(temp);
+        return temp;
+        
+    }
+
+    /**
+     * 
+     * @return an OdfStylePropertiesSet member 
+     */
+    public OdfStylePropertiesSet getPropertySet() {
+        return m_propSet;
+    }
+
+    /**
+     * 
+     * @return name of OdfStyleProperty instance
+     */
+    public OdfName getName() {
+        return m_name;
+    }
+
+    /** 
+     * @inheritDoc
+     */
+    @Override
+    public String toString() {
+        return m_name.getQName();
+    }
+
+    public OdfStyleProperty copy() {
+        OdfStyleProperty clone = new OdfStyleProperty(m_propSet, m_name);
+        return clone;
+    }
+
+    /** 
+     * @inheritDoc
+     */
+    @Override
+    public int hashCode() {
+        int hash = 3;
+        hash = 83 * hash + (this.m_propSet != null ? this.m_propSet.hashCode() : 0);
+        hash = 83 * hash + (this.m_name != null ? this.m_name.hashCode() : 0);
+        return hash;
+    }
+
+    /** 
+     * @inheritDoc
+     */
+    @Override
+    public boolean equals(Object o) {
+    	if (o instanceof OdfStyleProperty) {
+    		OdfStyleProperty sp = (OdfStyleProperty) o;
+    		return compareTo(sp) == 0;
+    	}
+        return false;
+    }
+
+    public int compareTo(OdfStyleProperty o) {
+        if (!(o instanceof OdfStyleProperty)) {
+            return -1;
+        }
+        OdfStyleProperty prop = o;
+        int c = 0;
+        if ((c = m_propSet.compareTo(prop.m_propSet)) != 0) {
+            return c;
+        }
+        if ((c = m_name.compareTo(prop.m_name)) != 0) {
+            return c;
+        }
+        // all is equal...
+        return 0;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableCellProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableCellProperties.java
new file mode 100644
index 0000000..3e5bd73
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableCellProperties.java
@@ -0,0 +1,99 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfTableCellProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty Border =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border"));
+	public final static OdfStyleProperty BorderBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-bottom"));
+	public final static OdfStyleProperty BorderLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-left"));
+	public final static OdfStyleProperty BorderRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-right"));
+	public final static OdfStyleProperty BorderTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "border-top"));
+	public final static OdfStyleProperty Padding =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding"));
+	public final static OdfStyleProperty PaddingBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-bottom"));
+	public final static OdfStyleProperty PaddingLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-left"));
+	public final static OdfStyleProperty PaddingRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-right"));
+	public final static OdfStyleProperty PaddingTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "padding-top"));
+	public final static OdfStyleProperty WrapOption =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.FO, "wrap-option"));
+	public final static OdfStyleProperty BorderLineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width"));
+	public final static OdfStyleProperty BorderLineWidthBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-bottom"));
+	public final static OdfStyleProperty BorderLineWidthLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-left"));
+	public final static OdfStyleProperty BorderLineWidthRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-right"));
+	public final static OdfStyleProperty BorderLineWidthTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "border-line-width-top"));
+	public final static OdfStyleProperty CellProtect =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "cell-protect"));
+	public final static OdfStyleProperty DecimalPlaces =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "decimal-places"));
+	public final static OdfStyleProperty DiagonalBlTr =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-bl-tr"));
+	public final static OdfStyleProperty DiagonalBlTrWidths =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-bl-tr-widths"));
+	public final static OdfStyleProperty DiagonalTlBr =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-tl-br"));
+	public final static OdfStyleProperty DiagonalTlBrWidths =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "diagonal-tl-br-widths"));
+	public final static OdfStyleProperty Direction =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "direction"));
+	public final static OdfStyleProperty GlyphOrientationVertical =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "glyph-orientation-vertical"));
+	public final static OdfStyleProperty PrintContent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "print-content"));
+	public final static OdfStyleProperty RepeatContent =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "repeat-content"));
+	public final static OdfStyleProperty RotationAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-align"));
+	public final static OdfStyleProperty RotationAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rotation-angle"));
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+	public final static OdfStyleProperty ShrinkToFit =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shrink-to-fit"));
+	public final static OdfStyleProperty TextAlignSource =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-align-source"));
+	public final static OdfStyleProperty VerticalAlign =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableColumnProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableColumnProperties.java
new file mode 100644
index 0000000..25d693c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableColumnProperties.java
@@ -0,0 +1,41 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfTableColumnProperties {
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+	public final static OdfStyleProperty ColumnWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "column-width"));
+	public final static OdfStyleProperty RelColumnWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-column-width"));
+	public final static OdfStyleProperty UseOptimalColumnWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableColumnProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "use-optimal-column-width"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableProperties.java
new file mode 100644
index 0000000..bd1553b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableProperties.java
@@ -0,0 +1,67 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfTableProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+	public final static OdfStyleProperty KeepWithNext =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-with-next"));
+	public final static OdfStyleProperty Margin =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin"));
+	public final static OdfStyleProperty MarginBottom =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-bottom"));
+	public final static OdfStyleProperty MarginLeft =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-left"));
+	public final static OdfStyleProperty MarginRight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-right"));
+	public final static OdfStyleProperty MarginTop =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.FO, "margin-top"));
+	public final static OdfStyleProperty MayBreakBetweenRows =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "may-break-between-rows"));
+	public final static OdfStyleProperty PageNumber =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "page-number"));
+	public final static OdfStyleProperty RelWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rel-width"));
+	public final static OdfStyleProperty Shadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "shadow"));
+	public final static OdfStyleProperty Width =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "width"));
+	public final static OdfStyleProperty WritingMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "writing-mode"));
+	public final static OdfStyleProperty Align =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.TABLE, "align"));
+	public final static OdfStyleProperty BorderModel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.TABLE, "border-model"));
+	public final static OdfStyleProperty Display =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableProperties, OdfName.newName(OdfDocumentNamespace.TABLE, "display"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableRowProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableRowProperties.java
new file mode 100644
index 0000000..6967460
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTableRowProperties.java
@@ -0,0 +1,45 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfTableRowProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty BreakAfter =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-after"));
+	public final static OdfStyleProperty BreakBefore =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "break-before"));
+	public final static OdfStyleProperty KeepTogether =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.FO, "keep-together"));
+	public final static OdfStyleProperty MinRowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "min-row-height"));
+	public final static OdfStyleProperty RowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "row-height"));
+	public final static OdfStyleProperty UseOptimalRowHeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TableRowProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "use-optimal-row-height"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTextProperties.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTextProperties.java
new file mode 100644
index 0000000..8f72aa4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/dom/style/props/OdfTextProperties.java
@@ -0,0 +1,199 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+// !!! GENERATED SOURCE CODE !!!
+package org.odftoolkit.odfdom.dom.style.props;
+
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public interface OdfTextProperties {
+	public final static OdfStyleProperty BackgroundColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "background-color"));
+	public final static OdfStyleProperty Color =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "color"));
+	public final static OdfStyleProperty Country =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "country"));
+	public final static OdfStyleProperty FontFamily =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-family"));
+	public final static OdfStyleProperty FontSize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-size"));
+	public final static OdfStyleProperty FontStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-style"));
+	public final static OdfStyleProperty FontVariant =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-variant"));
+	public final static OdfStyleProperty FontWeight =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "font-weight"));
+	public final static OdfStyleProperty Hyphenate =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenate"));
+	public final static OdfStyleProperty HyphenationPushCharCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-push-char-count"));
+	public final static OdfStyleProperty HyphenationRemainCharCount =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "hyphenation-remain-char-count"));
+	public final static OdfStyleProperty Language =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "language"));
+	public final static OdfStyleProperty LetterSpacing =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "letter-spacing"));
+	public final static OdfStyleProperty Script =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "script"));
+	public final static OdfStyleProperty TextShadow =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-shadow"));
+	public final static OdfStyleProperty TextTransform =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.FO, "text-transform"));
+	public final static OdfStyleProperty CountryAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "country-asian"));
+	public final static OdfStyleProperty CountryComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "country-complex"));
+	public final static OdfStyleProperty FontCharset =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset"));
+	public final static OdfStyleProperty FontCharsetAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset-asian"));
+	public final static OdfStyleProperty FontCharsetComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-charset-complex"));
+	public final static OdfStyleProperty FontFamilyAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-asian"));
+	public final static OdfStyleProperty FontFamilyComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-complex"));
+	public final static OdfStyleProperty FontFamilyGeneric =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic"));
+	public final static OdfStyleProperty FontFamilyGenericAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic-asian"));
+	public final static OdfStyleProperty FontFamilyGenericComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-family-generic-complex"));
+	public final static OdfStyleProperty FontName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name"));
+	public final static OdfStyleProperty FontNameAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name-asian"));
+	public final static OdfStyleProperty FontNameComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-name-complex"));
+	public final static OdfStyleProperty FontPitch =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch"));
+	public final static OdfStyleProperty FontPitchAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch-asian"));
+	public final static OdfStyleProperty FontPitchComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-pitch-complex"));
+	public final static OdfStyleProperty FontRelief =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-relief"));
+	public final static OdfStyleProperty FontSizeAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-asian"));
+	public final static OdfStyleProperty FontSizeComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-complex"));
+	public final static OdfStyleProperty FontSizeRel =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel"));
+	public final static OdfStyleProperty FontSizeRelAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel-asian"));
+	public final static OdfStyleProperty FontSizeRelComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-size-rel-complex"));
+	public final static OdfStyleProperty FontStyleAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-asian"));
+	public final static OdfStyleProperty FontStyleComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-complex"));
+	public final static OdfStyleProperty FontStyleName =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name"));
+	public final static OdfStyleProperty FontStyleNameAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name-asian"));
+	public final static OdfStyleProperty FontStyleNameComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-style-name-complex"));
+	public final static OdfStyleProperty FontWeightAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-weight-asian"));
+	public final static OdfStyleProperty FontWeightComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "font-weight-complex"));
+	public final static OdfStyleProperty LanguageAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "language-asian"));
+	public final static OdfStyleProperty LanguageComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "language-complex"));
+	public final static OdfStyleProperty LetterKerning =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "letter-kerning"));
+	public final static OdfStyleProperty RfcLanguageTag =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag"));
+	public final static OdfStyleProperty RfcLanguageTagAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag-asian"));
+	public final static OdfStyleProperty RfcLanguageTagComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "rfc-language-tag-complex"));
+	public final static OdfStyleProperty ScriptAsian =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "script-asian"));
+	public final static OdfStyleProperty ScriptComplex =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "script-complex"));
+	public final static OdfStyleProperty ScriptType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "script-type"));
+	public final static OdfStyleProperty TextBlinking =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-blinking"));
+	public final static OdfStyleProperty TextCombine =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine"));
+	public final static OdfStyleProperty TextCombineEndChar =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine-end-char"));
+	public final static OdfStyleProperty TextCombineStartChar =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-combine-start-char"));
+	public final static OdfStyleProperty TextEmphasize =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-emphasize"));
+	public final static OdfStyleProperty TextLineThroughColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-color"));
+	public final static OdfStyleProperty TextLineThroughMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-mode"));
+	public final static OdfStyleProperty TextLineThroughStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-style"));
+	public final static OdfStyleProperty TextLineThroughText =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-text"));
+	public final static OdfStyleProperty TextLineThroughTextStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-text-style"));
+	public final static OdfStyleProperty TextLineThroughType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-type"));
+	public final static OdfStyleProperty TextLineThroughWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-line-through-width"));
+	public final static OdfStyleProperty TextOutline =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-outline"));
+	public final static OdfStyleProperty TextOverlineColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-color"));
+	public final static OdfStyleProperty TextOverlineMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-mode"));
+	public final static OdfStyleProperty TextOverlineStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-style"));
+	public final static OdfStyleProperty TextOverlineType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-type"));
+	public final static OdfStyleProperty TextOverlineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-overline-width"));
+	public final static OdfStyleProperty TextPosition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-position"));
+	public final static OdfStyleProperty TextRotationAngle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-rotation-angle"));
+	public final static OdfStyleProperty TextRotationScale =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-rotation-scale"));
+	public final static OdfStyleProperty TextScale =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-scale"));
+	public final static OdfStyleProperty TextUnderlineColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-color"));
+	public final static OdfStyleProperty TextUnderlineMode =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-mode"));
+	public final static OdfStyleProperty TextUnderlineStyle =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-style"));
+	public final static OdfStyleProperty TextUnderlineType =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-type"));
+	public final static OdfStyleProperty TextUnderlineWidth =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "text-underline-width"));
+	public final static OdfStyleProperty UseWindowFontColor =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.STYLE, "use-window-font-color"));
+	public final static OdfStyleProperty Condition =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "condition"));
+	public final static OdfStyleProperty Display =
+		OdfStyleProperty.get(OdfStylePropertiesSet.TextProperties, OdfName.newName(OdfDocumentNamespace.TEXT, "display"));
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/draw/OdfDrawFrame.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/draw/OdfDrawFrame.java
new file mode 100644
index 0000000..aa7537d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/draw/OdfDrawFrame.java
@@ -0,0 +1,49 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.doc.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.draw.Frame} in Simple API.
+ */
+public class OdfDrawFrame extends DrawFrameElement
+{
+
+    // ToDo: OdfMeassure / OdfUnit
+
+	private static final long serialVersionUID = -2260696671403198845L;
+
+	// ToDo - What are mandatory ODF attributes, what are the OOo defaults?
+    // ToDo - mandatory attributes part of the constructor default values should always be set in constructor
+    /** Creates a new instance of this class */
+    public OdfDrawFrame(OdfFileDom ownerDoc) {
+        super(ownerDoc);
+        this.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+    }
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/draw/OdfDrawImage.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/draw/OdfDrawImage.java
new file mode 100644
index 0000000..69711c4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/draw/OdfDrawImage.java
@@ -0,0 +1,320 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.draw;
+
+import java.awt.image.BufferedImage;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.imageio.ImageIO;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.type.AnyURI;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.w3c.dom.NodeList;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.draw.Image} in Simple API.
+ */
+public class OdfDrawImage extends DrawImageElement {
+
+	private static final long serialVersionUID = 8409319888919451149L;
+	private URI mImageURI;
+	// OdfPackage necessary to adapt the manifest referencing the image
+	private OdfPackage mOdfPackage;
+	private OdfSchemaDocument mOdfSchemaDocument;
+	private static final String SLASH = "/";
+
+	/** Creates a new instance of this class
+	 * @param ownerDoc The XML DOM containing the draw:image element
+	 */
+	public OdfDrawImage(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+		mOdfSchemaDocument = (OdfSchemaDocument) ownerDoc.getDocument();
+		mOdfPackage = mOdfSchemaDocument.getPackage();
+	}
+
+	/**
+	 * Return the URI for this image
+	 * @return   the URI of image
+	 */
+	public URI getImageUri() {
+		try {
+			if (mImageURI == null) {
+				mImageURI = new URI(AnyURI.encodePath(this.getXlinkHrefAttribute().toString()));
+			}
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(OdfDrawImage.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return mImageURI;
+	}
+
+	/**
+	 * The image path will be stored as URI of the href attribute
+	 *
+	 * @param packagePath The relative path from the package root to the image
+	 */
+	public void setImagePath(String packagePath) {
+		try {			
+			packagePath = packagePath.replaceFirst(mOdfSchemaDocument.getDocumentPath(), "");
+			URI uri = new URI(AnyURI.encodePath(packagePath).toString());
+			this.setXlinkHrefAttribute(AnyURI.decodePath(uri.toString()));
+			mImageURI = uri;
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(OdfDrawImage.class.getName()).log(Level.SEVERE, null, ex);
+		}
+	}
+
+	/* Helper method */
+	private String getPackagePath(String imageRef) {
+		if (imageRef.contains(SLASH)) {
+			imageRef = imageRef.substring(imageRef.lastIndexOf(SLASH) + 1, imageRef.length());
+		}
+		String packagePath = OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + imageRef;
+		return packagePath = mOdfSchemaDocument.getDocumentPath() + packagePath;
+	}
+
+	/* Helper method */
+	private void configureInsertedImage(String packagePath) throws Exception {
+		// Set path to image attribute
+		setImagePath(packagePath);
+		// Set mandatory attribute xlink:type
+		setXlinkTypeAttribute("simple");
+		// A draw:image is always embedded in a draw:frame
+		InputStream is = mOdfPackage.getInputStream(packagePath);
+		OdfDrawFrame odfFrame = (OdfDrawFrame) this.getParentNode();
+		if (odfFrame != null) {
+			BufferedImage image = ImageIO.read(is);
+			// some image formats like SVG might not be understood by ImageIO			
+			if (image != null)
+			{
+				int height = image.getHeight(null);
+				int width = image.getWidth(null);
+				odfFrame.setSvgHeightAttribute(Length.mapToUnit(String.valueOf(height) + "px", Unit.CENTIMETER));
+				odfFrame.setSvgWidthAttribute(Length.mapToUnit(String.valueOf(width) + "px", Unit.CENTIMETER));
+			}
+		}
+	}
+
+	/**
+	 * Inserts the image file from the URI to the ODF package named similar as in the URI.
+	 * The manifest is adapted using the media type according to the suffix. Existing images are replaced.
+	 * Note: Default image seize will only be set, if the draw:image had been added to its draw:frame prior.
+	 *
+	 * @param imageUri The URI of the image that will be added as stream to the package
+	 *                 in the 'Pictures/' graphic directory with the same image file name as in the URI.
+	 *                 If the imageURI is relativ first the user.dir is taken to make it absolute.
+	 * @return              Returns the package path of the image, which was created based on the given URI.
+	 * @throws Exception    If the image provided by the URI, could not be added as stream to the ODF package.
+	 *
+	 */
+	public String newImage(URI imageUri) throws Exception {
+		String imageRef = imageUri.toString();
+		String mediaType = OdfFileEntry.getMediaTypeString(imageRef);
+		String packagePath = getPackagePath(imageRef);
+		mOdfPackage.insert(imageUri, packagePath, mediaType);
+		configureInsertedImage(packagePath);
+		return packagePath;
+	}
+
+	/**
+	 *
+	 * Inserts the image file from the stream to the ODF package named similar as in the provided path..
+	 * The manifest is adapted using given media type. Existing images are replaced.
+	 * @param is            InputStream to be added to the ODF package
+	 * @param packagePath   Internal path of the image in the package
+	 * @param mediaType     The mediaType of the image.
+	 *                      Can be obtained by the OdfFileEntry class findMediaType(String fileRef).
+	 * @throws Exception    If the given stream could not be added to the ODF package at the packagePatch
+	 */
+	public void newImage(InputStream is, String packagePath, String mediaType) throws Exception {
+		mOdfPackage.insert(is, packagePath, mediaType);
+		configureInsertedImage(packagePath);
+	}
+
+	/**
+	 * The method returns the specific one or more images by image path since the image may be inserted to the document several times.
+	 * @param doc the document the image belongs to
+	 * @param imagePath	the internal package path of the image.
+	 * @return			an Image list that match the given image path
+	 *                  if no images is found under the given path, return an empty list.
+	 */
+	public static List<OdfDrawImage> getImageByPath(OdfSchemaDocument doc, String imagePath) {
+		ArrayList<OdfDrawImage> imageList = new ArrayList<OdfDrawImage>();
+
+		try {
+			NodeList imageNodes = doc.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "image");
+
+			for (int i = 0; i < imageNodes.getLength(); i++) {
+				OdfDrawImage image = (OdfDrawImage) imageNodes.item(i);
+				if (image.getXlinkHrefAttribute().equals(imagePath)) {
+					imageList.add(image);
+				}
+			}
+			if (imageList.size() > 0) {
+				return imageList;
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(OdfDrawImage.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		return imageList;
+	}
+
+	/**
+	 * The method deletes one or more images from image container by image path.
+	 * @param doc the document the image should be deleted from
+	 * @param imagePath	the internal package path of the image.
+	 */
+	public static void deleteImageByPath(OdfSchemaDocument doc, String imagePath) {
+		List<OdfDrawImage> imageList = getImageByPath(doc, imagePath);
+		if (imageList != null) {
+			Iterator<OdfDrawImage> it = imageList.iterator();
+			while (it.hasNext()) {
+				OdfDrawImage image = it.next();
+				//remove the inserted picture
+				String ref = image.getXlinkHrefAttribute().toString();
+				doc.getPackage().remove(ref);
+
+				//remove the draw:frame element in main document
+				if (image.getParentNode() instanceof OdfDrawFrame) {
+					OdfDrawFrame frame = (OdfDrawFrame) image.getParentNode();
+					if (frame.getChildNodes().getLength() == 1) {
+						frame.getParentNode().removeChild(frame);
+					} else {
+						image.getParentNode().removeChild(image);
+					}
+				} else {
+					image.getParentNode().removeChild(image);
+				}
+
+				//remove Pictures/ directory if container does not have images
+				if (getImageCount(doc) == 0) {
+					doc.getPackage().remove(OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH);
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * The method deletes the specified image from image container.
+	 * @param doc the document the image should be deleted from
+	 * @param image  the image which need to be deleted
+	 */
+	public static void deleteImage(OdfSchemaDocument doc, OdfDrawImage image) {
+
+
+		// remove the inserted picture if it does not have reference any more
+		String ref = image.getXlinkHrefAttribute().toString();
+		List<OdfDrawImage> imageList = getImageByPath(doc, ref);
+		if (imageList.size() == 1) {
+			doc.getPackage().remove(ref);
+		}
+
+		// remove the draw:frame element in main document
+		if (image.getParentNode() instanceof OdfDrawFrame) {
+			OdfDrawFrame frame = (OdfDrawFrame) image.getParentNode();
+			if (frame.getChildNodes().getLength() == 1) {
+				frame.getParentNode().removeChild(frame);
+			} else {
+				image.getParentNode().removeChild(image);
+			}
+		} else {
+			image.getParentNode().removeChild(image);
+		}
+
+		// remove Pictures/ directory if container does not have images
+		if (getImageCount(doc) == 0) {
+			doc.getPackage().remove(
+					OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH);
+		}
+
+	}
+
+	/**
+	 * Get the count of image objects in the image container.
+	 * @param doc the document the image should be counted from
+	 * @return			the number of image in this document
+	 *                  if no image is found, return zero
+	 */
+	public static int getImageCount(OdfSchemaDocument doc) {
+		try {
+			NodeList imageNodes = doc.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "image");
+			return imageNodes.getLength();
+		} catch (Exception ex) {
+			Logger.getLogger(OdfDrawImage.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		return 0;
+	}
+
+	/**
+	 * The method return the image list in the image container.
+	 * @param doc  the document the list of images should be returned from
+	 * @return			an image list in this document
+	 *                  if no images is found, return an empty list.
+	 */
+	public static List<OdfDrawImage> getImages(OdfSchemaDocument doc) {
+		ArrayList<OdfDrawImage> imageList = new ArrayList<OdfDrawImage>();
+		try {
+			NodeList imageNodes = doc.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "image");
+			for (int i = 0; i < imageNodes.getLength(); i++) {
+				OdfDrawImage image = (OdfDrawImage) imageNodes.item(i);
+				imageList.add(image);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(OdfDrawImage.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		return imageList;
+	}
+
+	/**
+	 * The method return the set of all the image paths.
+	 * @param doc the document the image path set should be obtained from
+	 * @return			an image path set in this document
+	 */
+	public static Set<String> getImagePathSet(OdfSchemaDocument doc) {
+		Set<String> paths = new HashSet<String>();
+		List<OdfDrawImage> imageList = getImages(doc);
+		Iterator<OdfDrawImage> it = imageList.iterator();
+		while (it.hasNext()) {
+			OdfDrawImage image = it.next();
+			paths.add(image.getXlinkHrefAttribute().toString());
+		}
+		return paths;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberCurrencyStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberCurrencyStyle.java
new file mode 100644
index 0000000..56d297b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberCurrencyStyle.java
@@ -0,0 +1,314 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.number;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencyStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencySymbolElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfNumberCurrencyStyle extends NumberCurrencyStyleElement {
+
+	public OdfNumberCurrencyStyle(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+	}
+
+	public OdfNumberCurrencyStyle(OdfFileDom ownerDoc,
+			String currencySymbol, String format, String styleName) {
+		super(ownerDoc);
+		this.setStyleNameAttribute(styleName);
+		buildFromFormat(currencySymbol, format);
+	}
+
+	/**
+	 * Get the format string that represents this style.
+	 * @return the format string
+	 */
+	public String getFormat() {
+		String result = "";
+		Node m = getFirstChild();
+		while (m != null) {
+			if (m instanceof NumberCurrencySymbolElement) {
+				result += m.getTextContent();
+			} else if (m instanceof NumberNumberElement) {
+				result += getNumberFormat();
+			} else if (m instanceof NumberTextElement) {
+				String textcontent = m.getTextContent();
+				if (textcontent == null || textcontent.length() == 0) {
+					textcontent = " ";
+				}
+				result += textcontent;
+			}
+			m = m.getNextSibling();
+		}
+		return result;
+	}
+
+	public String getNumberFormat() {
+		String result = "";
+		NumberNumberElement number = OdfElement.findFirstChildNode(NumberNumberElement.class, this);
+		boolean isGroup = number.getNumberGroupingAttribute();
+		int decimalPos = (number.getNumberDecimalPlacesAttribute() == null) ? 0
+				: number.getNumberDecimalPlacesAttribute().intValue();
+		int minInt = (number.getNumberMinIntegerDigitsAttribute() == null) ? 1
+				: number.getNumberMinIntegerDigitsAttribute().intValue();
+
+		int i;
+		for (i = 0; i < minInt; i++) {
+			if (((i + 1) % 3) == 0 && isGroup) {
+				result = ",0" + result;
+			} else {
+				result = "0" + result;
+			}
+		}
+		while (isGroup && (result.indexOf(',') == -1)) {
+			if (((i + 1) % 3) == 0 && isGroup) {
+				result = ",#" + result;
+			} else {
+				result = "#" + result;
+			}
+			i++;
+		}
+
+		result = "#" + result;
+		if (decimalPos > 0) {
+			result += ".";
+			for (i = 0; i < decimalPos; i++) {
+				result += "0";
+			}
+		}
+		return result;
+	}
+
+	public String getConditionStyleName(double value) {
+		StyleMapElement map = OdfElement.findFirstChildNode(StyleMapElement.class, this);
+		while (map != null) {
+			String condition = map.getStyleConditionAttribute();
+			if (isTrue(condition, value)) {
+				return map.getStyleApplyStyleNameAttribute();
+			}
+			map = OdfElement.findNextChildNode(StyleMapElement.class, map);
+		}
+		return getStyleNameAttribute();
+	}
+
+	private boolean isTrue(String condition, double value) {
+		double rightOp = getLastNumber(condition);
+		if (condition.indexOf('>') != -1) {
+			if (value > rightOp) {
+				return true;
+			}
+		} else if (condition.indexOf('<') != -1) {
+			if (value < rightOp) {
+				return true;
+			}
+		}
+		if (condition.indexOf('!') != -1) {
+			if (value != rightOp) {
+				return true;
+			}
+		} else if (condition.indexOf('=') != -1) {
+			if (value == rightOp) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private Double getLastNumber(String condition) {
+		String results = "";
+		for (int i = condition.length() - 1; i >= 0; i--) {
+			if (condition.charAt(i) >= '0' && condition.charAt(i) <= '9') {
+				results += condition.charAt(i);
+			} else {
+				break;
+			}
+		}
+		return Double.parseDouble(results);
+	}
+
+	/**
+	 * Creates a &lt;number:date-style&gt; element based upon format.
+	 * @param currencySymbol the string to be placed as the currency symbol
+	 * @param format the currency format string
+	 */
+	public void buildFromFormat(String currencySymbol, String format) {
+		String preMatch;
+		String numberSpec;
+		String postMatch;
+		int pos;
+		char ch;
+		int nDigits;
+
+		Pattern p = Pattern.compile("[#0,.]+");
+		Matcher m;
+		NumberNumberElement number;
+
+		/*
+		 * If there is a numeric specifcation, then split the
+		 * string into the part before the specifier, the specifier
+		 * itself, and then part after the specifier. The parts
+		 * before and after are just text (which may contain the
+		 * currency symbol).
+		 */
+		m = p.matcher(format);
+		if (m.find()) {
+			preMatch = format.substring(0, m.start());
+			numberSpec = format.substring(m.start(), m.end());
+			postMatch = format.substring(m.end());
+
+			processText(preMatch, currencySymbol);
+
+			number = new NumberNumberElement((OdfFileDom) this.getOwnerDocument());
+
+			/* Process part before the decimal point (if any) */
+			nDigits = 0;
+			for (pos = 0; pos < numberSpec.length()
+					&& (ch = numberSpec.charAt(pos)) != '.'; pos++) {
+				if (ch == ',') {
+					number.setNumberGroupingAttribute(new Boolean(true));
+				} else if (ch == '0') {
+					nDigits++;
+				}
+			}
+			number.setNumberMinIntegerDigitsAttribute(nDigits);
+
+			/* Number of decimal places is the length after the decimal */
+			if (pos < numberSpec.length()) {
+				number.setNumberDecimalPlacesAttribute(numberSpec.length() - (pos + 1));
+			}
+			this.appendChild(number);
+
+			processText(postMatch, currencySymbol);
+		}
+	}
+
+	/**
+	 * Process text that may have a currency symbol ($) in it.
+	 * @param text string to be processed
+	 * @param currencySymbol the currency symbol under consideration
+	 */
+	private void processText(String text, String currencySymbol) {
+		OdfFileDom dom = (OdfFileDom) this.getOwnerDocument();
+		int currencyPos = text.indexOf(currencySymbol);
+		if (currencyPos >= 0) {
+			emitText(text.substring(0, currencyPos));
+			NumberCurrencySymbolElement cSymbol = new NumberCurrencySymbolElement(dom);
+			cSymbol.appendChild(dom.createTextNode(currencySymbol));
+			this.appendChild(cSymbol);
+			emitText(text.substring(currencyPos + currencySymbol.length()));
+		} else {
+			emitText(text);
+		}
+	}
+
+	/**
+	 *	Place pending text into a &lt;number:text&gt; element.
+	 * @param textBuffer pending text
+	 */
+	private void emitText(String textBuffer) {
+		NumberTextElement textElement;
+		if (!textBuffer.equals("")) {
+			textElement = new NumberTextElement((OdfFileDom) this.getOwnerDocument());
+			textElement.setTextContent(textBuffer);
+			this.appendChild(textElement);
+		}
+	}
+
+	/**
+	 * Get OdfCurrencySymbol element from this currency style.
+	 * Once you have it, you can add language and country.
+	 * @return an OdfCurrencySymbol element
+	 */
+	public NumberCurrencySymbolElement getCurrencySymbolElement() {
+		NumberCurrencySymbolElement cSymbol = null;
+		NodeList list = this.getElementsByTagNameNS(
+				OdfDocumentNamespace.NUMBER.getUri(), "currency-symbol");
+		if (list.getLength() > 0) {
+			cSymbol = (NumberCurrencySymbolElement) list.item(0);
+		}
+		return cSymbol;
+	}
+
+	/**
+	 * Set language and currency for the currency symbol.
+	 * @param language the language for the country
+	 * @param country the country name
+	 */
+	public void setCurrencyLocale(String language, String country) {
+		NumberCurrencySymbolElement cSymbol = getCurrencySymbolElement();
+		cSymbol.setNumberCountryAttribute(country);
+		cSymbol.setNumberLanguageAttribute(language);
+	}
+
+	/**
+	 * Set language and currency for the currency symbol.
+	 * Argument could be just a language like "el" or a
+	 * language and country like "en-US".
+	 * @param locale string in form language-country or language
+	 */
+	public void setCurrencyLocale(String locale) {
+		NumberCurrencySymbolElement cSymbol = getCurrencySymbolElement();
+		int pos = locale.indexOf('-');
+		if (pos >= 0) {
+			cSymbol.setNumberLanguageAttribute(locale.substring(0, pos));
+			cSymbol.setNumberCountryAttribute(locale.substring(pos + 1));
+		} else {
+			cSymbol.setNumberLanguageAttribute(locale);
+		}
+	}
+
+	/**
+	 * Set &lt;style:map&gt; for positive values to the given style .
+	 * @param mapName the style  to map to
+	 */
+	public void setMapPositive(String mapName) {
+		StyleMapElement map = new StyleMapElement((OdfFileDom) this.getOwnerDocument());
+		map.setStyleApplyStyleNameAttribute(mapName);
+		map.setStyleConditionAttribute("value()>0");
+		this.appendChild(map);
+	}
+
+	/**
+	 * Set &lt;style:map&gt; for negative values to the given style .
+	 * @param mapName the style  to map to
+	 */
+	public void setMapNegative(String mapName) {
+		StyleMapElement map = new StyleMapElement((OdfFileDom) this.getOwnerDocument());
+		map.setStyleApplyStyleNameAttribute(mapName);
+		map.setStyleConditionAttribute("value()<0");
+		this.appendChild(map);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberDateStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberDateStyle.java
new file mode 100644
index 0000000..2ced689
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberDateStyle.java
@@ -0,0 +1,396 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.number;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberFormatSourceAttribute;
+import org.odftoolkit.odfdom.dom.element.number.NumberAmPmElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDateStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDayElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberDayOfWeekElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberEraElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberHoursElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberMinutesElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberMonthElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberQuarterElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberSecondsElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberWeekOfYearElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberYearElement;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ * This class lets you create a date style from a format string.
+ * The format string is given in the same form as Java's
+ * SimpleDateFormat class.
+ *
+ * The characters used are:
+ * <pre>
+G  	Era designator       AD
+y 	Year                 1996; 96
+Q	Quarter in Year      2 -- not in Java; in ODF
+M 	Month in year        July; Jul; 07
+w 	Week in year         27
+W 	Week in month        -- not in ODF
+D 	Day in year          -- not in ODF
+d 	Day in month         10
+F 	Day of week in month -- not in ODF
+E 	Day in week          Tuesday; Tue
+a 	Am/pm marker         PM
+H 	Hour in day (0-23)   0
+k 	Hour in day (1-24)   -- not in ODF
+K 	Hour in am/pm (0-11) -- not in ODF
+h 	Hour in am/pm (1-12) -- depends on AM/PM marker
+m 	Minute in hour       30
+s 	Second in minute     55
+S 	Millisecond          -- not in ODF
+z 	Time zone            -- not in ODF
+Z 	Time zone RFC822     -- not in ODF
+ * </pre>
+ *  The G, E, and y specifiers are in long form if there are more then 3 in a row.
+ *  The Q specifier is in long form if there are more than 2 in a row.
+ *  The d, h, and m specifiers are in long form if there is more than one in a row.
+ */
+public class OdfNumberDateStyle extends NumberDateStyleElement {
+
+	private String styleName;
+	private String calendarName;
+
+	public OdfNumberDateStyle(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+	}
+
+	/** Creates a new instance of DateStyleFromFormat.
+	 * @param ownerDoc document that this format belongs to
+	 * @param format format string for the date/time
+	 * @param styleName name of this style
+	 */
+	public OdfNumberDateStyle(OdfFileDom ownerDoc, String format, String styleName) {
+		this(ownerDoc, format, styleName, null);
+	}
+
+	/** Creates a new instance of DateStyleFromFormat.
+	 * @param ownerDoc document that this format belongs to
+	 * @param format format string for the date/time
+	 * @param styleName name of this style
+	 * @param calendarName name of the calendar this date style belongs to
+	 */
+	public OdfNumberDateStyle(OdfFileDom ownerDoc, String format, String styleName,
+			String calendarName) {
+		super(ownerDoc);
+		this.styleName = styleName;
+		this.calendarName = calendarName;
+		buildFromFormat(format);
+	}
+
+	/**
+	 * Get the format string that represents this style.
+	 * @return the format string
+	 */
+	public String getFormat() {
+		String result = "";
+		NumberAmPmElement ampmEle = OdfElement.findFirstChildNode(NumberAmPmElement.class, this);
+		Node child = this.getFirstChild();
+		while (child != null) {
+			if (child instanceof OdfElement) {
+				if (child instanceof NumberDayElement) {
+					NumberDayElement ele = (NumberDayElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "dd";
+					} else {
+						result += "d";
+					}
+				} else if (child instanceof NumberMonthElement) {
+					NumberMonthElement ele = (NumberMonthElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if (ele.getNumberTextualAttribute().booleanValue()) {
+						if ((numberstyle != null) && numberstyle.equals("long")) {
+							result += "MMMM";
+						} else {
+							result += "MMM";
+						}
+					} else {
+						if ((numberstyle != null) && numberstyle.equals("long")) {
+							result += "MM";
+						} else {
+							result += "M";
+						}
+					}
+				} else if (child instanceof NumberYearElement) {
+					NumberYearElement ele = (NumberYearElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "yyyy";
+					} else {
+						result += "yy";
+					}
+				} else if (child instanceof NumberTextElement) {
+					String content = child.getTextContent();
+					if ((content == null) || (content.equals(""))) {
+						result += " ";
+					} else {
+						result += content;
+					}
+				} else if (child instanceof NumberEraElement) {
+					NumberEraElement ele = (NumberEraElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "GGGG";
+					} else {
+						result += "GG";
+					}
+				} else if (child instanceof NumberHoursElement) {
+					NumberHoursElement ele = (NumberHoursElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if (ampmEle != null) {
+						if ((numberstyle != null) && numberstyle.equals("long")) {
+							result += "hh";
+						} else {
+							result += "h";
+						}
+					} else {
+						if ((numberstyle != null) && numberstyle.equals("long")) {
+							result += "HH";
+						} else {
+							result += "H";
+						}
+					}
+				} else if (child instanceof NumberMinutesElement) {
+					NumberMinutesElement ele = (NumberMinutesElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "mm";
+					} else {
+						result += "m";
+					}
+				} else if (child instanceof NumberSecondsElement) {
+					NumberSecondsElement ele = (NumberSecondsElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "ss";
+					} else {
+						result += "s";
+					}
+				} else if (child instanceof NumberQuarterElement) {
+					NumberQuarterElement ele = (NumberQuarterElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "QQQ";
+					} else {
+						result += "Q";
+					}
+				} else if (child instanceof NumberDayOfWeekElement) {
+					NumberDayOfWeekElement ele = (NumberDayOfWeekElement) child;
+					String numberstyle = ele.getNumberStyleAttribute();
+					if ((numberstyle != null) && numberstyle.equals("long")) {
+						result += "EEEE";
+					} else {
+						result += "EEE";
+					}
+				} else if (child instanceof NumberAmPmElement) {
+					result += "a";
+				}
+			}
+			child = child.getNextSibling();
+		}
+		return result;
+	}
+
+	/**
+	 * Creates a &lt;number:date-style&gt; element based upon format.
+	 * @param format the format string
+	 */
+	public void buildFromFormat(String format) {
+		String actionChars = "GyQMwdEaHhms";
+		int actionCount = 0;
+
+		char ch;
+		String textBuffer = "";
+		boolean endQuote = false;
+
+		int i = 0;
+
+		this.setStyleNameAttribute(styleName);
+		this.setNumberFormatSourceAttribute(NumberFormatSourceAttribute.Value.LANGUAGE.toString());
+
+		while (i < format.length()) {
+			ch = format.charAt(i);
+			if (actionChars.indexOf(ch) >= 0) {
+				appendText(textBuffer);
+				textBuffer = "";
+				actionCount = 0;
+				while (i < format.length() && format.charAt(i) == ch) {
+					actionCount++;
+					i++;
+				}
+				processChar(ch, actionCount);
+			} else if (ch == '\'') {
+				endQuote = false;
+				i++;
+				while (i < format.length() && (!endQuote)) {
+					ch = format.charAt(i);
+					if (ch == '\'') // check to see if this is really the end
+					{
+						if (i + 1 < format.length() && format.charAt(i + 1) == '\'') {
+							i++;
+							textBuffer += "'";
+						} else {
+							endQuote = true;
+						}
+					} else {
+						textBuffer += ch;
+					}
+					i++;
+				}
+			} else {
+				textBuffer += ch;
+				i++;
+			}
+		}
+		appendText(textBuffer);
+	}
+
+	/**
+	 *	Place pending text into a &lt;number:text&gt; element.
+	 * @param textBuffer pending text
+	 */
+	private void appendText(String textBuffer) {
+		NumberTextElement textElement = null;
+		if (!textBuffer.equals("")) {
+			textElement = new NumberTextElement((OdfFileDom) this.getOwnerDocument());
+			textElement.setTextContent(textBuffer);
+			this.appendChild(textElement);
+		}
+	}
+
+	/**
+	 * Process a formatting character.
+	 * These elements are built "by hand" rather than
+	 * @param ch the formatting character to process
+	 * @param count the number of occurrences of this character
+	 */
+	private void processChar(char ch, int count) {
+		OdfFileDom ownerDoc = (OdfFileDom) this.getOwnerDocument();
+		switch (ch) {
+			case 'G':
+				NumberEraElement era =
+						new NumberEraElement(ownerDoc);
+				era.setNumberStyleAttribute(isLongIf(count > 3));
+				if (calendarName != null) {
+					era.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(era);
+				break;
+			case 'y':
+				NumberYearElement year =
+						new NumberYearElement(ownerDoc);
+				year.setNumberStyleAttribute(isLongIf(count > 3));
+				if (calendarName != null) {
+					year.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(year);
+				break;
+			case 'Q':
+				NumberQuarterElement quarter =
+						new NumberQuarterElement(ownerDoc);
+				quarter.setNumberStyleAttribute(isLongIf(count > 2));
+				if (calendarName != null) {
+					quarter.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(quarter);
+				break;
+			case 'M':
+				NumberMonthElement month =
+						new NumberMonthElement(ownerDoc);
+				month.setNumberTextualAttribute(count > 2);
+				month.setNumberStyleAttribute(isLongIf(count % 2 == 0));
+				if (calendarName != null) {
+					month.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(month);
+				break;
+			case 'w':
+				NumberWeekOfYearElement weekOfYear =
+						new NumberWeekOfYearElement(ownerDoc);
+				if (calendarName != null) {
+					weekOfYear.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(weekOfYear);
+				break;
+			case 'd':
+				NumberDayElement day =
+						new NumberDayElement(ownerDoc);
+				day.setNumberStyleAttribute(isLongIf(count > 1));
+				if (calendarName != null) {
+					day.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(day);
+				break;
+			case 'E':
+				NumberDayOfWeekElement dayOfWeek =
+						new NumberDayOfWeekElement(ownerDoc);
+				dayOfWeek.setNumberStyleAttribute(isLongIf(count > 3));
+				if (calendarName != null) {
+					dayOfWeek.setNumberCalendarAttribute(calendarName);
+				}
+				this.appendChild(dayOfWeek);
+				break;
+			case 'a':
+				NumberAmPmElement ampm =
+						new NumberAmPmElement(ownerDoc);
+				this.appendChild(ampm);
+				break;
+			case 'H':
+			case 'h':
+				NumberHoursElement hours =
+						new NumberHoursElement(ownerDoc);
+				hours.setNumberStyleAttribute(isLongIf(count > 1));
+				this.appendChild(hours);
+				break;
+			case 'm':
+				NumberMinutesElement minutes =
+						new NumberMinutesElement(ownerDoc);
+				minutes.setNumberStyleAttribute(isLongIf(count > 1));
+				this.appendChild(minutes);
+				break;
+			case 's':
+				NumberSecondsElement seconds =
+						new NumberSecondsElement(ownerDoc);
+				seconds.setNumberStyleAttribute(isLongIf(count > 1));
+				this.appendChild(seconds);
+				break;
+		}
+	}
+
+	/**
+	 * Add long or short style to an element.
+	 * @param isLong true if this is number:style="long"; false if number:style="short"
+	 * @return the string "long" or "short"
+	 */
+	private String isLongIf(boolean isLong) {
+		return ((isLong) ? "long" : "short");
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberPercentageStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberPercentageStyle.java
new file mode 100644
index 0000000..a743917
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberPercentageStyle.java
@@ -0,0 +1,210 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.number;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberPercentageStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfNumberPercentageStyle extends NumberPercentageStyleElement {
+
+	public OdfNumberPercentageStyle(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+	}
+
+	/**
+	 * Creates a new instance of OdfNumberPercentageStyle.
+	 * @param ownerDoc document that this format belongs to
+	 * @param format format string for the date/time
+	 * @param styleName name of this style
+	 */
+	public OdfNumberPercentageStyle(OdfFileDom ownerDoc, String format, String styleName) {
+		super(ownerDoc);
+		this.setStyleNameAttribute(styleName);
+		buildFromFormat(format);
+	}
+
+	/**
+	 * Get the format string that represents this style.
+	 * @return the format string
+	 */
+	public String getFormat() {
+		String result = "";
+		Node m = getFirstChild();
+		while (m != null) {
+			if (m instanceof NumberNumberElement) {
+				result += getNumberFormat();
+			} else if (m instanceof NumberTextElement) {
+				String textcontent = m.getTextContent();
+				if (textcontent == null || textcontent.length() == 0) {
+					textcontent = " ";
+				}
+				result += textcontent;
+			}
+			m = m.getNextSibling();
+		}
+		return result;
+	}
+
+	public String getNumberFormat() {
+		String result = "";
+		NumberNumberElement number = OdfElement.findFirstChildNode(NumberNumberElement.class, this);
+		boolean isGroup = number.getNumberGroupingAttribute();
+		int decimalPos = (number.getNumberDecimalPlacesAttribute() == null) ? 0
+				: number.getNumberDecimalPlacesAttribute().intValue();
+		int minInt = (number.getNumberMinIntegerDigitsAttribute() == null) ? 1
+				: number.getNumberMinIntegerDigitsAttribute().intValue();
+
+		int i;
+		for (i = 0; i < minInt; i++) {
+			if (((i + 1) % 3) == 0 && isGroup) {
+				result = ",0" + result;
+			} else {
+				result = "0" + result;
+			}
+		}
+		while (isGroup && (result.indexOf(',') == -1)) {
+			if (((i + 1) % 3) == 0 && isGroup) {
+				result = ",#" + result;
+			} else {
+				result = "#" + result;
+			}
+			i++;
+		}
+
+		result = "#" + result;
+		if (decimalPos > 0) {
+			result += ".";
+			for (i = 0; i < decimalPos; i++) {
+				result += "0";
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Creates a &lt;number:number-style&gt; element based upon format.
+	 * @param format the number format string
+	 */
+	public void buildFromFormat(String format) {
+		/*
+		 * Setting ownerDoc won't be necessary once this is folded into
+		 * OdfNumberStyle
+		 */
+		String preMatch;
+		String numberSpec;
+		String postMatch;
+		int pos;
+		char ch;
+		int nDigits;
+
+		Pattern p = Pattern.compile("[#0,.]+");
+		Matcher m;
+		NumberNumberElement number;
+
+		/*
+		 * If there is a numeric specifcation, then split the
+		 * string into the part before the specifier, the specifier
+		 * itself, and then part after the specifier. The parts
+		 * before and after are just text (which may contain the
+		 * currency symbol).
+		 */
+		if (format != null && !format.equals("")) {
+			m = p.matcher(format);
+			if (m.find()) {
+				preMatch = format.substring(0, m.start());
+				numberSpec = format.substring(m.start(), m.end());
+				postMatch = format.substring(m.end());
+
+				emitText(preMatch);
+
+				number = new NumberNumberElement((OdfFileDom) this.getOwnerDocument());
+
+				/* Process part before the decimal point (if any) */
+				nDigits = 0;
+				for (pos = 0; pos < numberSpec.length()
+						&& (ch = numberSpec.charAt(pos)) != '.'; pos++) {
+					if (ch == ',') {
+						number.setNumberGroupingAttribute(new Boolean(true));
+					} else if (ch == '0') {
+						nDigits++;
+					}
+				}
+				number.setNumberMinIntegerDigitsAttribute(nDigits);
+
+				/* Number of decimal places is the length after the decimal */
+				if (pos < numberSpec.length()) {
+					number.setNumberDecimalPlacesAttribute(numberSpec.length() - (pos + 1));
+				}
+				this.appendChild(number);
+
+				emitText(postMatch);
+			}
+		}
+	}
+
+	/**
+	 *	Place pending text into a &lt;number:text&gt; element.
+	 * @param textBuffer pending text
+	 */
+	private void emitText(String textBuffer) {
+		NumberTextElement textElement;
+		if (!textBuffer.equals("")) {
+			textElement = new NumberTextElement((OdfFileDom) this.getOwnerDocument());
+			textElement.setTextContent(textBuffer);
+			this.appendChild(textElement);
+		}
+	}
+
+	/**
+	 * Set &lt;style:map&gt; for positive values to the given style name.
+	 * @param mapName the style name to map to
+	 */
+	public void setMapPositive(String mapName) {
+		StyleMapElement map = new StyleMapElement((OdfFileDom) this.getOwnerDocument());
+		map.setStyleApplyStyleNameAttribute(mapName);
+		map.setStyleConditionAttribute("value()>0");
+		this.appendChild(map);
+	}
+
+	/**
+	 * Set &lt;style:map&gt; for negative values to the given style name.
+	 * @param mapName the style name to map to
+	 */
+	public void setMapNegative(String mapName) {
+		StyleMapElement map = new StyleMapElement((OdfFileDom) this.getOwnerDocument());
+		map.setStyleApplyStyleNameAttribute(mapName);
+		map.setStyleConditionAttribute("value()<0");
+		this.appendChild(map);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberStyle.java
new file mode 100644
index 0000000..f84dedc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberStyle.java
@@ -0,0 +1,211 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.number;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfNumberStyle extends NumberNumberStyleElement {
+
+	public OdfNumberStyle(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+	}
+
+	public OdfNumberStyle(OdfFileDom ownerDoc, String format, String styleName) {
+		super(ownerDoc);
+		this.setStyleNameAttribute(styleName);
+		buildFromFormat(format);
+	}
+
+	/**
+	 * Get the format string that represents this style.
+	 * @return the format string
+	 */
+	public String getFormat() {
+		String result = "";
+		Node m = getFirstChild();
+		while (m != null) {
+			if (m instanceof NumberNumberElement) {
+				result += getNumberFormat();
+			} else if (m instanceof NumberTextElement) {
+				String textcontent = m.getTextContent();
+				if (textcontent == null || textcontent.length() == 0) {
+					textcontent = " ";
+				}
+				result += textcontent;
+			}
+			m = m.getNextSibling();
+		}
+		return result;
+	}
+
+	private String getNumberFormat() {
+		String result = "";
+		NumberNumberElement number = OdfElement.findFirstChildNode(NumberNumberElement.class, this);
+		boolean isGroup = number.getNumberGroupingAttribute();
+		int decimalPos = (number.getNumberDecimalPlacesAttribute() == null) ? 0
+				: number.getNumberDecimalPlacesAttribute().intValue();
+		int minInt = (number.getNumberMinIntegerDigitsAttribute() == null) ? 1
+				: number.getNumberMinIntegerDigitsAttribute().intValue();
+
+		int i;
+		for (i = 0; i < minInt; i++) {
+			if (((i + 1) % 3) == 0 && isGroup) {
+				result = ",0" + result;
+			} else {
+				result = "0" + result;
+			}
+		}
+		while (isGroup && (result.indexOf(',') == -1)) {
+			if (((i + 1) % 3) == 0 && isGroup) {
+				result = ",#" + result;
+			} else {
+				result = "#" + result;
+			}
+			i++;
+		}
+
+		result = "#" + result;
+		if (decimalPos > 0) {
+			result += ".";
+			for (i = 0; i < decimalPos; i++) {
+				result += "0";
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Creates a &lt;number:number-style&gt; element based upon format.
+	 * @param format the number format string
+	 */
+	/**
+	 * Creates a &lt;number:number-style&gt; element based upon format.
+	 * @param format the number format string
+	 */
+	public void buildFromFormat(String format) {
+		/*
+		 * Setting ownerDoc won't be necessary once this is folded into
+		 * OdfNumberStyle
+		 */
+		String preMatch;
+		String numberSpec;
+		String postMatch;
+		int pos;
+		char ch;
+		int nDigits;
+
+		Pattern p = Pattern.compile("[#0,.]+");
+		Matcher m;
+		NumberNumberElement number;
+
+		/*
+		 * If there is a numeric specification, then split the
+		 * string into the part before the specifier, the specifier
+		 * itself, and then part after the specifier. The parts
+		 * before and after are just text (which may contain the
+		 * currency symbol).
+		 */
+		if (format != null && !format.equals("")) {
+			m = p.matcher(format);
+			if (m.find()) {
+				preMatch = format.substring(0, m.start());
+				numberSpec = format.substring(m.start(), m.end());
+				postMatch = format.substring(m.end());
+
+				emitText(preMatch);
+
+				number = new NumberNumberElement((OdfFileDom) this.getOwnerDocument());
+
+				/* Process part before the decimal point (if any) */
+				nDigits = 0;
+				for (pos = 0; pos < numberSpec.length()
+						&& (ch = numberSpec.charAt(pos)) != '.'; pos++) {
+					if (ch == ',') {
+						number.setNumberGroupingAttribute(new Boolean(true));
+					} else if (ch == '0') {
+						nDigits++;
+					}
+				}
+				number.setNumberMinIntegerDigitsAttribute(nDigits);
+
+				/* Number of decimal places is the length after the decimal */
+				if (pos < numberSpec.length()) {
+					number.setNumberDecimalPlacesAttribute(numberSpec.length() - (pos + 1));
+				}
+				if (pos == numberSpec.length()) {
+					number.setNumberDecimalPlacesAttribute(0);
+				}
+				this.appendChild(number);
+
+				emitText(postMatch);
+			}
+		}
+	}
+
+	/**
+	 *	Place pending text into a &lt;number:text&gt; element.
+	 * @param textBuffer pending text
+	 */
+	private void emitText(String textBuffer) {
+		NumberTextElement textElement;
+		if (!textBuffer.equals("")) {
+			textElement = new NumberTextElement((OdfFileDom) this.getOwnerDocument());
+			textElement.setTextContent(textBuffer);
+			this.appendChild(textElement);
+		}
+	}
+
+	/**
+	 * Set &lt;style:map&gt; for positive values to the given style name.
+	 * @param mapName the style name to map to
+	 */
+	public void setMapPositive(String mapName) {
+		StyleMapElement map = new StyleMapElement((OdfFileDom) this.getOwnerDocument());
+		map.setStyleApplyStyleNameAttribute(mapName);
+		map.setStyleConditionAttribute("value()>0");
+		this.appendChild(map);
+	}
+
+	/**
+	 * Set &lt;style:map&gt; for negative values to the given style name.
+	 * @param mapName the style name to map to
+	 */
+	public void setMapNegative(String mapName) {
+		StyleMapElement map = new StyleMapElement((OdfFileDom) this.getOwnerDocument());
+		map.setStyleApplyStyleNameAttribute(mapName);
+		map.setStyleConditionAttribute("value()<0");
+		this.appendChild(map);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberTimeStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberTimeStyle.java
new file mode 100644
index 0000000..9281d60
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/number/OdfNumberTimeStyle.java
@@ -0,0 +1,179 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.number;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.attribute.number.NumberFormatSourceAttribute;
+import org.odftoolkit.odfdom.dom.element.number.NumberAmPmElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberHoursElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberMinutesElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberSecondsElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTimeStyleElement;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ * This class lets you create a date style from a format string.
+ * The format string is given in the same form as Java's
+ * SimpleDateFormat class.
+ *
+ * The characters used are:
+ * <pre>
+a 	Am/pm marker         PM
+H 	Hour in day (0-23)   0
+k 	Hour in day (1-24)   -- not in ODF
+K 	Hour in am/pm (0-11) -- not in ODF
+h 	Hour in am/pm (1-12) -- depends on AM/PM marker
+m 	Minute in hour       30
+s 	Second in minute     55
+S 	Millisecond          -- not in ODF
+z 	Time zone            -- not in ODF
+Z 	Time zone RFC822     -- not in ODF
+ * </pre>
+ */
+public class OdfNumberTimeStyle extends NumberTimeStyleElement {
+
+    public OdfNumberTimeStyle(OdfFileDom ownerDoc) {
+        super(ownerDoc);
+    }
+    private String styleName;
+
+
+    /** Creates a new instance of OdfTimeStyle.
+     * @param ownerDoc document that this format belongs to
+     * @param format format string for the date/time
+     * @param styleName name of this style
+     */
+    public OdfNumberTimeStyle(OdfFileDom ownerDoc, String format, String styleName) {
+        super(ownerDoc);
+        this.styleName = styleName;
+        buildFromFormat(format);
+    }
+
+    /**
+     * Creates a <code>&lt;number:time-style&gt;</code> element based upon format.
+     * @param format the format for the time
+     */
+    public void buildFromFormat(String format) {
+        String actionChars = "GyQMwdEaHhms";
+        int actionCount = 0;
+
+        char ch;
+        String textBuffer = "";
+        boolean endQuote = false;
+
+        int i = 0;
+
+        this.setStyleNameAttribute(styleName);
+        this.setNumberFormatSourceAttribute(NumberFormatSourceAttribute.Value.LANGUAGE.toString());
+
+        while (i < format.length()) {
+            ch = format.charAt(i);
+            if (actionChars.indexOf(ch) >= 0) {
+                appendText(textBuffer);
+                textBuffer = "";
+                actionCount = 0;
+                while (i < format.length() && format.charAt(i) == ch) {
+                    actionCount++;
+                    i++;
+                }
+                processChar(ch, actionCount);
+            } else if (ch == '\'') {
+                endQuote = false;
+                i++;
+                while (i < format.length() && (!endQuote)) {
+                    ch = format.charAt(i);
+                    if (ch == '\'') // check to see if this is really the end
+                    {
+                        if (i + 1 < format.length() && format.charAt(i + 1) == '\'') {
+                            i++;
+                            textBuffer += "'";
+                        } else {
+                            endQuote = true;
+                        }
+                    } else {
+                        textBuffer += ch;
+                    }
+                    i++;
+                }
+            } else {
+                textBuffer += ch;
+                i++;
+            }
+        }
+        appendText(textBuffer);
+    }
+
+    /**
+     *	Place pending text into a &lt;number:text&gt; element.
+     * @param textBuffer pending text
+     */
+    private void appendText(String textBuffer) {
+        NumberTextElement textElement = null;
+        if (!textBuffer.equals("")) {
+            textElement = new NumberTextElement((OdfFileDom) this.getOwnerDocument());
+            textElement.setTextContent(textBuffer);
+            this.appendChild(textElement);
+        }
+    }
+
+    /**
+     * Process a formatting character.
+     * @param ch the formatting character to process
+     * @param count the number of occurrences of this character
+     */
+    private void processChar(char ch, int count) {
+        OdfFileDom ownerDoc = (OdfFileDom) this.getOwnerDocument();
+        switch (ch) {
+            case 'a':
+            	NumberAmPmElement ampm = new NumberAmPmElement(ownerDoc);
+                this.appendChild(ampm);
+                break;
+            case 'H':
+            case 'h':
+            	NumberHoursElement hours = new NumberHoursElement(ownerDoc);
+                hours.setNumberStyleAttribute(isLongIf(count > 1));
+                this.appendChild(hours);
+                break;
+            case 'm':
+                NumberMinutesElement minutes = new NumberMinutesElement(ownerDoc);
+                minutes.setNumberStyleAttribute(isLongIf(count > 1));
+                this.appendChild(minutes);
+                break;
+            case 's':
+                NumberSecondsElement seconds = new NumberSecondsElement(ownerDoc);
+                seconds.setNumberStyleAttribute(isLongIf(count > 1));
+                this.appendChild(seconds);
+                break;
+        }
+    }
+
+     /**
+     * Add long or short style to an element.
+     * @param isLong true if this is number:style="long"; false if number:style="short"
+     * @return the string "long" or "short"
+     */
+    private String isLongIf(boolean isLong) {
+        return ((isLong) ? "long" : "short");
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeAutomaticStyles.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeAutomaticStyles.java
new file mode 100644
index 0000000..f74557c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeAutomaticStyles.java
@@ -0,0 +1,405 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.office;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAutomaticStylesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfOfficeAutomaticStyles extends OfficeAutomaticStylesElement {
+
+	private static final long serialVersionUID = -2925910664631016175L;
+	// styles that are only in OdfAutomaticStyles
+	private HashMap<String, OdfStylePageLayout> mPageLayouts;
+	// styles that are common for OdfStyles and OdfAutomaticStyles
+	private OdfStylesBase mStylesBaseImpl;
+
+	public OdfOfficeAutomaticStyles(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+		mStylesBaseImpl = new OdfStylesBase();
+	}
+
+	/**
+	 * Create an <code>OdfStyle</code> element with style family
+	 *
+	 * @param styleFamily  The <code>OdfStyleFamily</code> element
+	 * @return an <code>OdfStyle</code> element
+	 */
+	public OdfStyle newStyle(OdfStyleFamily styleFamily) {
+		OdfFileDom dom = (OdfFileDom) this.ownerDocument;
+		OdfStyle newStyle = dom.newOdfElement(OdfStyle.class);
+		newStyle.setStyleFamilyAttribute(styleFamily.getName());
+
+		newStyle.setStyleNameAttribute(newUniqueStyleName(styleFamily));
+
+		this.appendChild(newStyle);
+
+		return newStyle;
+	}
+
+	/**
+	 * Create an <code>OdfTextListStyle</code> element
+	 *
+	 * @return an <code>OdfTextListStyle</code> element
+	 */
+	public OdfTextListStyle newListStyle() {
+		OdfFileDom dom = (OdfFileDom) this.ownerDocument;
+		OdfTextListStyle newStyle = dom.newOdfElement(OdfTextListStyle.class);
+
+		newStyle.setStyleNameAttribute(newUniqueStyleName(OdfStyleFamily.List));
+
+		this.appendChild(newStyle);
+
+		return newStyle;
+	}
+
+	/** Returns the <code>OdfStylePageLayout</code> element with the given name.
+	 *
+	 * @param name is the name of the page layout
+	 * @return the page layout or null if there is no such page layout
+	 */
+	public OdfStylePageLayout getPageLayout(String name) {
+		if (mPageLayouts != null) {
+			return mPageLayouts.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Returns the <code>OdfStyleStyle</code> element with the given name and family.
+	 *
+	 * @param name is the name of the style
+	 * @param familyType is the family of the style
+	 * @return the style or null if there is no such style
+	 */
+	public OdfStyle getStyle(String name, OdfStyleFamily familyType) {
+		return mStylesBaseImpl.getStyle(name, familyType);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfStyleStyle</code> elements for the given family.
+	 *
+	 * @param familyType
+	 * @return an iterator for all <code>OdfStyleStyle</code> elements for the given family
+	 */
+	public Iterable<OdfStyle> getStylesForFamily(OdfStyleFamily familyType) {
+		return mStylesBaseImpl.getStylesForFamily(familyType);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfStyleStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfStyleStyle</code> elements
+	 */
+	public Iterable<OdfStyle> getAllStyles() {
+		return mStylesBaseImpl.getAllOdfStyles();
+	}
+
+	/**
+	 * Returns the <code>OdfTextListStyle</code> element with the given name.
+	 *
+	 * @param name is the name of the list style
+	 * @return the list style or null if there is no such list style
+	 */
+	public OdfTextListStyle getListStyle(String name) {
+		return mStylesBaseImpl.getListStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfTextListStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfTextListStyle</code> elements
+	 */
+	public Iterable<OdfTextListStyle> getListStyles() {
+		return mStylesBaseImpl.getListStyles();
+	}
+
+	/**
+	 * Returns the <code>OdfNumberNumberStyle</code> element with the given name.
+	 *
+	 * @param name is the name of the number style
+	 * @return the number style or null if there is no such number style
+	 */
+	public OdfNumberStyle getNumberStyle(String name) {
+		return mStylesBaseImpl.getNumberStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfNumberNumberStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfNumberNumberStyle</code> elements
+	 */
+	public Iterable<OdfNumberStyle> getNumberStyles() {
+		return mStylesBaseImpl.getNumberStyles();
+	}
+
+	/**
+	 * Returns the <code>OdfNumberDateStyle</code> element with the given name.
+	 *
+	 * @param name is the name of the date style
+	 * @return the date style or null if there is no such date style
+	 */
+	public OdfNumberDateStyle getDateStyle(String name) {
+		return mStylesBaseImpl.getDateStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfNumberDateStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfNumberDateStyle</code> elements
+	 */
+	public Iterable<OdfNumberDateStyle> getDateStyles() {
+		return mStylesBaseImpl.getDateStyles();
+	}
+
+	/**
+	 * Returns the <code>OdfNumberPercentageStyle</code> element with the given name.
+	 *
+	 * @param name is the name of the percentage style
+	 * @return the percentage style null if there is no such percentage style
+	 */
+	public OdfNumberPercentageStyle getPercentageStyle(String name) {
+		return mStylesBaseImpl.getPercentageStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfNumberPercentageStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfNumberPercentageStyle</code> elements
+	 */
+	public Iterable<OdfNumberPercentageStyle> getPercentageStyles() {
+		return mStylesBaseImpl.getPercentageStyles();
+	}
+
+	/**
+	 * Returns the <code>OdfNumberCurrencyStyle</code> element with the given name.
+	 *
+	 * @param name is the name of the currency style
+	 * @return the currency style null if there is no such currency style
+	 */
+	public OdfNumberCurrencyStyle getCurrencyStyle(String name) {
+		return mStylesBaseImpl.getCurrencyStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfNumberCurrencyStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfNumberCurrencyStyle</code> elements
+	 */
+	public Iterable<OdfNumberCurrencyStyle> getCurrencyStyles() {
+		return mStylesBaseImpl.getCurrencyStyles();
+	}
+
+	/**
+	 * Returns the <code>OdfNumberTimeStyle</code> element with the given name.
+	 *
+	 * @param name is the name of the time style
+	 * @return the time style null if there is no such time style
+	 */
+	public OdfNumberTimeStyle getTimeStyle(String name) {
+		return mStylesBaseImpl.getTimeStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfNumberTimeStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfNumberTimeStyle</code> elements
+	 */
+	public Iterable<OdfNumberTimeStyle> getTimeStyles() {
+		return mStylesBaseImpl.getTimeStyles();
+	}
+
+	/**
+	 * Returns the <code>NumberBooleanStyleElement</code> element with the given name.
+	 *
+	 * @param name is the name of the boolean style
+	 * @return the boolean style null if there is no such boolean style
+	 */
+	public NumberBooleanStyleElement getBooleanStyle(String name) {
+		return mStylesBaseImpl.getBooleanStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>OdfNumberBooleanStyle</code> elements.
+	 *
+	 * @return an iterator for all <code>OdfNumberBooleanStyle</code> elements
+	 */
+	public Iterable<NumberBooleanStyleElement> getBooleanStyles() {
+		return mStylesBaseImpl.getBooleanStyles();
+	}
+
+	/**
+	 * Returns the <code>NumberTextStyleElement</code> element with the given name.
+	 *
+	 * @param name is the name of the text style
+	 * @return the text style null if there is no such text style
+	 */
+	public NumberTextStyleElement getTextStyle(String name) {
+		return mStylesBaseImpl.getTextStyle(name);
+	}
+
+	/**
+	 * Returns an iterator for all <code>NumberTextStyleElement</code> elements.
+	 *
+	 * @return an iterator for all <code>NumberTextStyleElement</code> elements
+	 */
+	public Iterable<NumberTextStyleElement> getTextStyles() {
+		return mStylesBaseImpl.getTextStyles();
+	}
+
+	@Override
+	protected void onOdfNodeInserted(OdfElement node, Node refNode) {
+		if (node instanceof OdfStylePageLayout) {
+			OdfStylePageLayout pageLayout = (OdfStylePageLayout) node;
+			if (mPageLayouts == null) {
+				mPageLayouts = new HashMap<String, OdfStylePageLayout>();
+			}
+
+			mPageLayouts.put(pageLayout.getStyleNameAttribute(), pageLayout);
+		} else {
+			mStylesBaseImpl.onOdfNodeInserted(node, refNode);
+		}
+	}
+
+	@Override
+	protected void onOdfNodeRemoved(OdfElement node) {
+		if (node instanceof OdfStylePageLayout) {
+			if (mPageLayouts != null) {
+				OdfStylePageLayout pageLayout = (OdfStylePageLayout) node;
+				mPageLayouts.remove(pageLayout.getStyleNameAttribute());
+			}
+		} else {
+			mStylesBaseImpl.onOdfNodeRemoved(node);
+		}
+	}
+
+	/**
+	 * This methods removes all automatic styles that are currently not used by
+	 * any styleable element. Additionally all duplicate automatic styles will
+	 * be removed.
+	 */
+	public void optimize() {
+		Iterator<OdfStyle> iter = mStylesBaseImpl.getAllOdfStyles().iterator();
+		SortedSet<OdfStyle> stylesSet = new TreeSet<OdfStyle>();
+		while (iter.hasNext()) {
+			OdfStyle cur = iter.next();
+
+			// skip styles which are not in use:
+			if (cur.getStyleUserCount() < 1) {
+				continue;
+			}
+
+			SortedSet<OdfStyle> tail = stylesSet.tailSet(cur);
+			OdfStyle found = tail.size() > 0 ? tail.first() : null;
+			if (found != null && found.equals(cur)) {
+				// cur already in set. Replace all usages of cur by found:
+				Iterator<OdfStylableElement> styleUsersIter = cur.getStyleUsers().iterator();
+				ArrayList<OdfStylableElement> styleUsers = new ArrayList<OdfStylableElement>();
+				while (styleUsersIter.hasNext()) {
+					styleUsers.add(styleUsersIter.next());
+				}
+				styleUsersIter = styleUsers.iterator();
+				while (styleUsersIter.hasNext()) {
+					OdfStylableElement elem = styleUsersIter.next();
+					OdfStyle autoStyle = elem.getAutomaticStyle();
+					if (autoStyle != null) {
+						elem.setStyleName(found.getStyleNameAttribute());
+					}
+				}
+			} else {
+				stylesSet.add(cur);
+			}
+		}
+
+		OdfStyle style = OdfElement.findFirstChildNode(OdfStyle.class, this);
+		while (style != null) {
+			OdfStyle nextStyle = OdfElement.findNextChildNode(OdfStyle.class, style);
+			if (style.getStyleUserCount() < 1) {
+				this.removeChild(style);
+			}
+
+			style = nextStyle;
+		}
+	}
+
+	/**
+	 * This method makes the style unique
+	 *
+	 * @param referenceStyle The reference <code>OdfStyle</code> element
+	 * @return an <code>OdfStyle</code> element
+	 */
+	public OdfStyle makeStyleUnique(OdfStyle referenceStyle) {
+		OdfStyle newStyle = null;
+
+		if (referenceStyle.getOwnerDocument() != this.getOwnerDocument()) {
+			// import style from a different dom
+			newStyle = (OdfStyle) this.getOwnerDocument().importNode(referenceStyle, true);
+		} else {
+			// just clone
+			newStyle = (OdfStyle) referenceStyle.cloneNode(true);
+		}
+
+		newStyle.setStyleNameAttribute(newUniqueStyleName(newStyle.getFamily()));
+		appendChild(newStyle);
+
+		return newStyle;
+	}
+
+	private String newUniqueStyleName(OdfStyleFamily styleFamily) {
+		String unique_name;
+
+		if (styleFamily.equals(OdfStyleFamily.List)) {
+			do {
+				unique_name = String.format("l%06x", (int) (Math.random() * 0xffffff));
+			} while (getListStyle(unique_name) != null);
+		} else {
+			do {
+				unique_name = String.format("a%06x", (int) (Math.random() * 0xffffff));
+			} while (getStyle(unique_name, styleFamily) != null);
+		}
+		return unique_name;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeMasterStyles.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeMasterStyles.java
new file mode 100644
index 0000000..57d0220
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeMasterStyles.java
@@ -0,0 +1,131 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+   
+
+package org.odftoolkit.odfdom.incubator.doc.office;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLayerSetElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHandoutMasterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfOfficeMasterStyles extends OfficeMasterStylesElement
+{
+    
+	private static final long serialVersionUID = 6598785919980862801L;
+	private DrawLayerSetElement mLayerSet;
+    private StyleHandoutMasterElement mHandoutMaster;
+    private HashMap< String, StyleMasterPageElement > mMasterPages;
+    
+    public OdfOfficeMasterStyles( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    public StyleHandoutMasterElement getHandoutMaster()
+    {
+        return mHandoutMaster;
+    }
+
+    public DrawLayerSetElement getLayerSet()
+    {
+        return mLayerSet;
+    }
+    
+    public StyleMasterPageElement getMasterPage( String name )
+    {
+        if( mMasterPages != null )
+            return mMasterPages.get(name);
+        else
+            return null;
+    }
+
+    public Iterator< StyleMasterPageElement > getMasterPages()
+    {
+        if( mMasterPages != null )
+            return mMasterPages.values().iterator();
+        else
+            return new ArrayList< StyleMasterPageElement >().iterator();
+    }            
+    
+    /** override this method to get notified about element insertion
+     */
+    @Override
+	protected void onOdfNodeInserted( OdfElement node, Node refNode )
+    {
+        if( node instanceof DrawLayerSetElement )
+        {
+            mLayerSet = (DrawLayerSetElement)node;
+        }
+        else if( node instanceof StyleHandoutMasterElement )
+        {
+            mHandoutMaster = (StyleHandoutMasterElement)node;
+        }
+        else if( node instanceof StyleMasterPageElement )
+        {
+            StyleMasterPageElement masterPage = (StyleMasterPageElement)node;
+            
+            if( mMasterPages == null )
+                mMasterPages = new HashMap< String, StyleMasterPageElement >();
+            
+            mMasterPages.put( masterPage.getStyleNameAttribute(), masterPage );
+        }
+    }
+            
+    /** override this method to get notified about element insertion
+     */
+    @Override
+	protected void onOdfNodeRemoved( OdfElement node )
+    {
+        if( node instanceof DrawLayerSetElement )
+        {
+            if( mLayerSet == (DrawLayerSetElement)node )
+                mLayerSet = null;
+        }
+        else if( node instanceof StyleHandoutMasterElement )
+        {
+            if( mHandoutMaster == (StyleHandoutMasterElement)node )
+                mHandoutMaster = null;
+        }
+        else if( node instanceof StyleMasterPageElement )
+        {
+            if( mMasterPages != null )
+            {
+                StyleMasterPageElement masterPage = (StyleMasterPageElement)node;
+                mMasterPages.remove( masterPage.getStyleNameAttribute() );            
+            }
+        }
+    }    
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeStyles.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeStyles.java
new file mode 100644
index 0000000..6b4a12f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfOfficeStyles.java
@@ -0,0 +1,526 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.office;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGradientElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawHatchElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMarkerElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeStylesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextOutlineStyle;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfOfficeStyles extends OfficeStylesElement {
+
+
+    private static final long serialVersionUID = 700763983193326060L;
+
+    // styles that are only in OdfOfficeStyles
+    private HashMap<OdfStyleFamily, OdfDefaultStyle> mDefaultStyles;
+    private HashMap<String, DrawMarkerElement> mMarker;
+    private HashMap<String, DrawGradientElement> mGradients;
+    private HashMap<String, DrawHatchElement> mHatches;
+    private HashMap<String, DrawFillImageElement> mFillImages;
+    private OdfTextOutlineStyle mOutlineStyle;
+    // styles that are common for OdfOfficeStyles and OdfOfficeAutomaticStyles
+    private OdfStylesBase mStylesBaseImpl;
+
+    public OdfOfficeStyles(OdfFileDom ownerDoc) {
+        super(ownerDoc);
+        mStylesBaseImpl = new OdfStylesBase();
+    }
+    
+    /**
+     * Create an ODF style with style name and family
+     * 
+     * @param name  The style name
+     * @param family The style family
+     * @return  The <code>OdfStyle</code> element
+     */
+    public OdfStyle newStyle(String name, OdfStyleFamily family) {
+        OdfStyle newStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(OdfStyle.class);
+        newStyle.setStyleNameAttribute(name);
+        newStyle.setStyleFamilyAttribute(family.getName());
+        this.appendChild(newStyle);
+        return newStyle;
+    }
+
+    /**
+     * Retrieve or create ODF default style
+     * 
+     * @param family The style family
+     * @return The code>OdfDefaultStyle</code> element
+     */
+    public OdfDefaultStyle getOrCreateDefaultStyle(OdfStyleFamily family) {
+        OdfDefaultStyle style = getDefaultStyle(family);
+        if (style == null) {
+            style = ((OdfFileDom) this.ownerDocument).newOdfElement(OdfDefaultStyle.class);
+            style.setStyleFamilyAttribute(family.getName());
+            this.appendChild(style);
+        }
+        return style;
+    }
+    
+    /**
+     * Create ODF TextListStyle 
+     * 
+     * @param name  The style name
+     * @return The code>OdfTextListStyle</code> element
+     */
+    public OdfTextListStyle newListStyle(String name) {
+        OdfTextListStyle newStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(OdfTextListStyle.class);
+        newStyle.setStyleNameAttribute(name);
+        this.appendChild(newStyle);
+        return newStyle;
+    }
+
+    /**
+     * Retrieve or create ODF OutlineStyle
+     * 
+     * @return The code>OdfTextOutlineStyle</code> element
+     */
+    public OdfTextOutlineStyle getOrCreateOutlineStyle() {
+        if (mOutlineStyle == null) {
+            this.appendChild(((OdfFileDom) this.ownerDocument).newOdfElement(OdfTextOutlineStyle.class));
+        }
+
+        return mOutlineStyle;
+    }
+
+    /** 
+     * Returns the <code>OdfTextOutlineStyle</code> element.
+     *
+     * @return a pointer to the outline stye or null if there is no such element
+     */
+    public OdfTextOutlineStyle getOutlineStyle() {
+        return mOutlineStyle;
+    }
+
+    /** 
+     * Returns the <code>OdfStyleDefaultStyle</code>  element.
+     *
+     * @param familyType is the family for the default style
+     * @return the default style with the given family or null if there is no such default style
+     */
+    public OdfDefaultStyle getDefaultStyle(OdfStyleFamily familyType) {
+        if (mDefaultStyles != null) {
+            return mDefaultStyles.get(familyType);
+        } else {
+            return null;
+        }
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfStyleDefaultStyle</code> elements.
+     *
+     * @return iterator for all <code>OdfStyleDefaultStyle</code> elements
+     */
+    public Iterable<OdfDefaultStyle> getDefaultStyles() {
+        if (mDefaultStyles != null) {
+            return mDefaultStyles.values();
+        } else {
+            return new ArrayList<OdfDefaultStyle>();
+        }
+    }
+
+    /** 
+     * Returns the <code>DrawMarkerElement</code> element with the given name.
+     *
+     * @param name is the name of the marker
+     * @return the marker or null if there is no such marker
+     */
+    public DrawMarkerElement getMarker(String name) {
+        if (mMarker != null) {
+            return mMarker.get(name);
+        } else {
+            return null;
+        }
+    }
+
+    /** 
+     * Returns an iterator for all <code>DrawMarkerElement</code> elements.
+     *
+     * @return an iterator for all <code>DrawMarkerElement</code> elements
+     */
+    public Iterable<DrawMarkerElement> getMarker() {
+        if (mMarker != null) {
+            return mMarker.values();
+        } else {
+            return new ArrayList<DrawMarkerElement>();
+        }
+    }
+
+    /** 
+     * Returns the <code>DrawGradientElement</code> element with the given name.
+     *
+     * @param name is the name of the gradient
+     * @return the gradient or null if there is no such gradient
+     */
+    public DrawGradientElement getGradient(String name) {
+        if (mGradients != null) {
+            return mGradients.get(name);
+        } else {
+            return null;
+        }
+    }
+
+    /** 
+     * Returns an iterator for all <code>DrawGradientElement</code> elements.
+     *
+     * @return an iterator for all <code>DrawGradientElement</code> elements
+     */
+    public Iterable<DrawGradientElement> getGradients() {
+        if (mGradients != null) {
+            return mGradients.values();
+        } else {
+            return new ArrayList<DrawGradientElement>();
+        }
+    }
+
+    /** 
+     * Returns the <code>DrawHatchElement</code> element with the given name.
+     *
+     * @param name is the name of the hatch
+     * @return the hatch or null if there is no such hatch
+     */
+    public DrawHatchElement getHatch(String name) {
+        if (mHatches != null) {
+            return mHatches.get(name);
+        } else {
+            return null;
+        }
+    }
+
+    /** 
+     * Returns an iterator for all <code>DrawHatchElement</code> elements.
+     *
+     * @return an iterator for all <code>DrawHatchElement</code> elements
+     */
+    public Iterable<DrawHatchElement> getHatches() {
+        if (mHatches != null) {
+            return mHatches.values();
+        } else {
+            return new ArrayList<DrawHatchElement>();
+        }
+    }
+
+    /** 
+     * Returns the <code>DrawFillImageElement</code> element with the given name.
+     *
+     * @param name is the name of the fill image
+     * @return the fill image or null if there is no such fill image
+     */
+    public DrawFillImageElement getFillImage(String name) {
+        if (mFillImages != null) {
+            return mFillImages.get(name);
+        } else {
+            return null;
+        }
+    }
+
+    /** 
+     * Returns an iterator for all <code>DrawFillImageElement</code> elements.
+     *
+     * @return an iterator for all <code>DrawFillImageElement</code> elements
+     */
+    public Iterable<DrawFillImageElement> getFillImages() {
+        if (mFillImages != null) {
+            return mFillImages.values();
+        } else {
+            return new ArrayList<DrawFillImageElement>();
+        }
+    }
+
+    /** 
+     * Returns the <code>OdfStyle</code> element with the given name and family.
+     *
+     * @param name is the name of the style
+     * @param familyType is the family of the style
+     * @return the style or null if there is no such style
+     */
+    public OdfStyle getStyle(String name, OdfStyleFamily familyType) {
+        return mStylesBaseImpl.getStyle(name, familyType);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfStyle</code> elements for the given family.
+     *
+     * @param familyType
+     * @return an iterator for all <code>OdfStyle</code> elements for the given family
+     */
+    public Iterable<OdfStyle> getStylesForFamily(OdfStyleFamily familyType) {
+        return mStylesBaseImpl.getStylesForFamily(familyType);
+    }
+
+    /** 
+     * Returns the <code>OdfTextListStyle</code> element with the given name.
+     *
+     * @param name is the name of the list style
+     * @return the list style or null if there is no such list style
+     */
+    public OdfTextListStyle getListStyle(String name) {
+        return mStylesBaseImpl.getListStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfTextListStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfTextListStyle</code> elements
+     */
+    public Iterable<OdfTextListStyle> getListStyles() {
+        return mStylesBaseImpl.getListStyles();
+    }
+
+    /** 
+     * Returns the <code>OdfNumberNumberStyle</code> element with the given name.
+     *
+     * @param name is the name of the number style
+     * @return the number style or null if there is no such number style
+     */
+    public OdfNumberStyle getNumberStyle(String name) {
+        return mStylesBaseImpl.getNumberStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfNumberNumberStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfNumberNumberStyle</code> elements
+     */
+    public Iterable<OdfNumberStyle> getNumberStyles() {
+        return mStylesBaseImpl.getNumberStyles();
+    }
+
+    /** 
+     * Returns the <code>OdfNumberDateStyle</code> element with the given name.
+     *
+     * @param name is the name of the date style
+     * @return the date style or null if there is no such date style
+     */
+    public OdfNumberDateStyle getDateStyle(String name) {
+        return mStylesBaseImpl.getDateStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfNumberDateStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfNumberDateStyle</code> elements
+     */
+    public Iterable<OdfNumberDateStyle> getDateStyles() {
+        return mStylesBaseImpl.getDateStyles();
+    }
+
+    /** 
+     * Returns the <code>OdfNumberPercentageStyle</code> element with the given name.
+     *
+     * @param name is the name of the percentage style
+     * @return the percentage style null if there is no such percentage style
+     */
+    public OdfNumberPercentageStyle getPercentageStyle(String name) {
+        return mStylesBaseImpl.getPercentageStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfNumberPercentageStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfNumberPercentageStyle</code> elements
+     */
+    public Iterable<OdfNumberPercentageStyle> getPercentageStyles() {
+        return mStylesBaseImpl.getPercentageStyles();
+    }
+
+    /** 
+     * Returns the <code>OdfNumberCurrencyStyle</code> element with the given name.
+     *
+     * @param name is the name of the currency style
+     * @return the currency style null if there is no such currency style
+     */
+    public OdfNumberCurrencyStyle getCurrencyStyle(String name) {
+        return mStylesBaseImpl.getCurrencyStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfNumberCurrencyStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfNumberCurrencyStyle</code> elements
+     */
+    public Iterable<OdfNumberCurrencyStyle> getCurrencyStyles() {
+        return mStylesBaseImpl.getCurrencyStyles();
+    }
+
+    /** 
+     * Returns the <code>OdfNumberTimeStyle</code> element with the given name.
+     *
+     * @param name is the name of the time style
+     * @return the time style null if there is no such time style
+     */
+    public OdfNumberTimeStyle getTimeStyle(String name) {
+        return mStylesBaseImpl.getTimeStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfNumberTimeStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfNumberTimeStyle</code> elements
+     */
+    public Iterable<OdfNumberTimeStyle> getTimeStyles() {
+        return mStylesBaseImpl.getTimeStyles();
+    }
+
+    /** 
+     * Returns the <code>NumberBooleanStyleElement</code> element with the given name.
+     *
+     * @param name is the name of the boolean style
+     * @return the boolean style null if there is no such boolean style
+     */
+    public NumberBooleanStyleElement getBooleanStyle(String name) {
+        return mStylesBaseImpl.getBooleanStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>NumberBooleanStyleElement</code> elements.
+     *
+     * @return an iterator for all <code>NumberBooleanStyleElement</code> elements
+     */
+    public Iterable<NumberBooleanStyleElement> getBooleanStyles() {
+        return mStylesBaseImpl.getBooleanStyles();
+    }
+
+    /** 
+     * Returns the <code>OdfNumberTextStyle</code> element with the given name.
+     *
+     * @param name is the name of the text style
+     * @return the text style null if there is no such text style
+     */
+    public NumberTextStyleElement getTextStyle(String name) {
+        return mStylesBaseImpl.getTextStyle(name);
+    }
+
+    /** 
+     * Returns an iterator for all <code>OdfNumberTextStyle</code> elements.
+     *
+     * @return an iterator for all <code>OdfNumberTextStyle</code> elements
+     */
+    public Iterable<NumberTextStyleElement> getTextStyles() {
+        return mStylesBaseImpl.getTextStyles();
+    }
+
+    @Override
+    protected void onOdfNodeInserted(OdfElement node, Node refNode) {
+        if (node instanceof OdfDefaultStyle) {
+            OdfDefaultStyle defaultStyle = (OdfDefaultStyle) node;
+            if (mDefaultStyles == null) {
+                mDefaultStyles = new HashMap<OdfStyleFamily, OdfDefaultStyle>();
+            }
+
+            mDefaultStyles.put(defaultStyle.getFamily(), defaultStyle);
+        } else if (node instanceof DrawMarkerElement) {
+            DrawMarkerElement marker = (DrawMarkerElement) node;
+            if (mMarker == null) {
+                mMarker = new HashMap<String, DrawMarkerElement>();
+            }
+
+            mMarker.put(marker.getDrawNameAttribute(), marker);
+        } else if (node instanceof DrawGradientElement) {
+            DrawGradientElement gradient = (DrawGradientElement) node;
+            if (mGradients == null) {
+                mGradients = new HashMap<String, DrawGradientElement>();
+            }
+
+            mGradients.put(gradient.getDrawNameAttribute(), gradient);
+        } else if (node instanceof DrawHatchElement) {
+            DrawHatchElement hatch = (DrawHatchElement) node;
+            if (mHatches == null) {
+                mHatches = new HashMap<String, DrawHatchElement>();
+            }
+
+            mHatches.put(hatch.getDrawNameAttribute(), hatch);
+        } else if (node instanceof DrawFillImageElement) {
+            DrawFillImageElement fillImage = (DrawFillImageElement) node;
+
+            if (mFillImages == null) {
+                mFillImages = new HashMap<String, DrawFillImageElement>();
+            }
+
+            mFillImages.put(fillImage.getDrawNameAttribute(), fillImage);
+        } else if (node instanceof OdfTextOutlineStyle) {
+            mOutlineStyle = (OdfTextOutlineStyle) node;
+        } else {
+            mStylesBaseImpl.onOdfNodeInserted(node, refNode);
+        }
+    }
+
+    @Override
+    protected void onOdfNodeRemoved(OdfElement node) {
+        if (node instanceof OdfDefaultStyle) {
+            if (mDefaultStyles != null) {
+                OdfDefaultStyle defaultStyle = (OdfDefaultStyle) node;
+                mDefaultStyles.remove(defaultStyle.getFamily());
+            }
+        } else if (node instanceof DrawMarkerElement) {
+            if (mMarker != null) {
+                DrawMarkerElement marker = (DrawMarkerElement) node;
+                mMarker.remove(marker.getDrawNameAttribute());
+            }
+        } else if (node instanceof DrawGradientElement) {
+            if (mGradients != null) {
+                DrawGradientElement gradient = (DrawGradientElement) node;
+                mGradients.remove(gradient.getDrawNameAttribute());
+            }
+        } else if (node instanceof DrawHatchElement) {
+            if (mHatches != null) {
+                DrawHatchElement hatch = (DrawHatchElement) node;
+                mHatches.remove(hatch.getDrawNameAttribute());
+            }
+        } else if (node instanceof DrawFillImageElement) {
+            if (mFillImages != null) {
+                DrawFillImageElement fillImage = (DrawFillImageElement) node;
+                mFillImages.remove(fillImage.getDrawNameAttribute());
+            }
+        } else if (node instanceof OdfTextOutlineStyle) {
+            if (mOutlineStyle == (OdfTextOutlineStyle) node) {
+                mOutlineStyle = null;
+            }
+        } else {
+            mStylesBaseImpl.onOdfNodeRemoved(node);
+        }
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfStylesBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfStylesBase.java
new file mode 100644
index 0000000..dfd9cf0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/office/OdfStylesBase.java
@@ -0,0 +1,374 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.office;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.w3c.dom.Node;
+
+/**
+ * Implements shared functions for OdfAutomaticStyles and OdfStyles.
+ */
+class OdfStylesBase {
+
+	private HashMap<OdfStyleFamily, HashMap<String, OdfStyle>> mStyles;
+	private HashMap<String, OdfTextListStyle> mListStyles;
+	private HashMap<String, OdfNumberStyle> mNumberStyles;
+	private HashMap<String, OdfNumberDateStyle> mDateStyles;
+	private HashMap<String, OdfNumberPercentageStyle> mPercentageStyles;
+	private HashMap<String, OdfNumberCurrencyStyle> mCurrencyStyles;
+	private HashMap<String, OdfNumberTimeStyle> mTimeStyles;
+	private HashMap<String, NumberBooleanStyleElement> mBooleanStyles;
+	private HashMap<String, NumberTextStyleElement> mTextStyles;
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfStyle getStyle(String name, OdfStyleFamily familyType) {
+		if (mStyles != null) {
+			HashMap<String, OdfStyle> familyMap = mStyles.get(familyType);
+			if (familyMap != null) {
+				return familyMap.get(name);
+			}
+		}
+		return null;
+	}
+
+	/** Returns an iterator for all <code>OdfStyle</code> elements.
+	 *
+	 * @return iterator for all <code>OdfStyle</code> elements
+	 */
+	Iterable<OdfStyle> getAllOdfStyles() {
+		ArrayList<OdfStyle> allStyles = new ArrayList<OdfStyle>();
+		if (mStyles != null) {
+			for (OdfStyleFamily family : mStyles.keySet()) {
+				HashMap<String, OdfStyle> familySet = mStyles.get(family);
+				Collection<OdfStyle> familyStyles = familySet.values();
+				allStyles.addAll(familyStyles);
+			}
+		}
+		return allStyles;
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfStyle> getStylesForFamily(OdfStyleFamily familyType) {
+		if (mStyles != null) {
+			HashMap<String, OdfStyle> familyMap = mStyles.get(familyType);
+			if (familyMap != null) {
+				return familyMap.values();
+			}
+		}
+		return new ArrayList<OdfStyle>();
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfTextListStyle getListStyle(String name) {
+		if (mListStyles != null) {
+			return mListStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfTextListStyle> getListStyles() {
+		if (mListStyles != null) {
+			return mListStyles.values();
+		} else {
+			return new ArrayList<OdfTextListStyle>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfNumberStyle getNumberStyle(String name) {
+		if (mNumberStyles != null) {
+			return mNumberStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfNumberStyle> getNumberStyles() {
+		if (mNumberStyles != null) {
+			return mNumberStyles.values();
+		} else {
+			return new ArrayList<OdfNumberStyle>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfNumberDateStyle getDateStyle(String name) {
+		if (mDateStyles != null) {
+			return mDateStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfNumberDateStyle> getDateStyles() {
+		if (mDateStyles != null) {
+			return mDateStyles.values();
+		} else {
+			return new ArrayList<OdfNumberDateStyle>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfNumberPercentageStyle getPercentageStyle(String name) {
+		if (mPercentageStyles != null) {
+			return mPercentageStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfNumberPercentageStyle> getPercentageStyles() {
+		if (mPercentageStyles != null) {
+			return mPercentageStyles.values();
+		} else {
+			return new ArrayList<OdfNumberPercentageStyle>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfNumberCurrencyStyle getCurrencyStyle(String name) {
+		if (mCurrencyStyles != null) {
+			return mCurrencyStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfNumberCurrencyStyle> getCurrencyStyles() {
+		if (mCurrencyStyles != null) {
+			return mCurrencyStyles.values();
+		} else {
+			return new ArrayList<OdfNumberCurrencyStyle>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	OdfNumberTimeStyle getTimeStyle(String name) {
+		if (mTimeStyles != null) {
+			return mTimeStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<OdfNumberTimeStyle> getTimeStyles() {
+		if (mTimeStyles != null) {
+			return mTimeStyles.values();
+		} else {
+			return new ArrayList<OdfNumberTimeStyle>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	NumberBooleanStyleElement getBooleanStyle(String name) {
+		if (mBooleanStyles != null) {
+			return mBooleanStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<NumberBooleanStyleElement> getBooleanStyles() {
+		if (mBooleanStyles != null) {
+			return mBooleanStyles.values();
+		} else {
+			return new ArrayList<NumberBooleanStyleElement>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	NumberTextStyleElement getTextStyle(String name) {
+		if (mTextStyles != null) {
+			return mTextStyles.get(name);
+		} else {
+			return null;
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	Iterable<NumberTextStyleElement> getTextStyles() {
+		if (mTextStyles != null) {
+			return mTextStyles.values();
+		} else {
+			return new ArrayList<NumberTextStyleElement>();
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	void onOdfNodeInserted(OdfElement node, Node refNode) {
+		if (node instanceof OdfStyle) {
+			OdfStyle style = (OdfStyle) node;
+			if (mStyles == null) {
+				mStyles = new HashMap<OdfStyleFamily, HashMap<String, OdfStyle>>();
+			}
+
+			HashMap<String, OdfStyle> familyMap = mStyles.get(style.getFamily());
+			if (familyMap == null) {
+				familyMap = new HashMap<String, OdfStyle>();
+				mStyles.put(style.getFamily(), familyMap);
+			}
+
+			familyMap.put(style.getStyleNameAttribute(), style);
+		} else if (node instanceof OdfTextListStyle) {
+			OdfTextListStyle listStyle = (OdfTextListStyle) node;
+			if (mListStyles == null) {
+				mListStyles = new HashMap<String, OdfTextListStyle>();
+			}
+
+			mListStyles.put(listStyle.getStyleNameAttribute(), listStyle);
+		} else if (node instanceof OdfNumberStyle) {
+			OdfNumberStyle numberStyle = (OdfNumberStyle) node;
+
+			if (mNumberStyles == null) {
+				mNumberStyles = new HashMap<String, OdfNumberStyle>();
+			}
+
+			mNumberStyles.put(numberStyle.getStyleNameAttribute(), numberStyle);
+		} else if (node instanceof OdfNumberDateStyle) {
+			OdfNumberDateStyle dateStyle = (OdfNumberDateStyle) node;
+
+			if (mDateStyles == null) {
+				mDateStyles = new HashMap<String, OdfNumberDateStyle>();
+			}
+
+			mDateStyles.put(dateStyle.getStyleNameAttribute(), dateStyle);
+		} else if (node instanceof OdfNumberPercentageStyle) {
+			OdfNumberPercentageStyle percentageStyle = (OdfNumberPercentageStyle) node;
+
+			if (mPercentageStyles == null) {
+				mPercentageStyles = new HashMap<String, OdfNumberPercentageStyle>();
+			}
+
+			mPercentageStyles.put(percentageStyle.getStyleNameAttribute(), percentageStyle);
+		} else if (node instanceof OdfNumberCurrencyStyle) {
+			OdfNumberCurrencyStyle currencyStyle = (OdfNumberCurrencyStyle) node;
+
+			if (mCurrencyStyles == null) {
+				mCurrencyStyles = new HashMap<String, OdfNumberCurrencyStyle>();
+			}
+
+			mCurrencyStyles.put(currencyStyle.getStyleNameAttribute(), currencyStyle);
+		} else if (node instanceof OdfNumberTimeStyle) {
+			OdfNumberTimeStyle timeStyle = (OdfNumberTimeStyle) node;
+
+			if (mTimeStyles == null) {
+				mTimeStyles = new HashMap<String, OdfNumberTimeStyle>();
+			}
+
+			mTimeStyles.put(timeStyle.getStyleNameAttribute(), timeStyle);
+		} else if (node instanceof NumberBooleanStyleElement) {
+			NumberBooleanStyleElement booleanStyle = (NumberBooleanStyleElement) node;
+
+			if (mBooleanStyles == null) {
+				mBooleanStyles = new HashMap<String, NumberBooleanStyleElement>();
+			}
+
+			mBooleanStyles.put(booleanStyle.getStyleNameAttribute(), booleanStyle);
+		} else if (node instanceof NumberTextStyleElement) {
+			NumberTextStyleElement textStyle = (NumberTextStyleElement) node;
+
+			if (mTextStyles == null) {
+				mTextStyles = new HashMap<String, NumberTextStyleElement>();
+			}
+
+			mTextStyles.put(textStyle.getStyleNameAttribute(), textStyle);
+		}
+	}
+
+	// For documentation see OdfAutomaticStyles or OdfStyles.
+	void onOdfNodeRemoved(OdfElement node) {
+		if (node instanceof OdfStyle) {
+			if (mStyles != null) {
+				OdfStyle style = (OdfStyle) node;
+				HashMap<String, OdfStyle> familyMap = mStyles.get(style.getFamily());
+				if (familyMap != null) {
+					familyMap.remove(style.getStyleNameAttribute());
+					if (familyMap.isEmpty()) {
+						mStyles.remove(style.getFamily());
+					}
+				}
+			}
+		} else if (node instanceof OdfTextListStyle) {
+			if (mListStyles != null) {
+				OdfTextListStyle listStyle = (OdfTextListStyle) node;
+				mListStyles.remove(listStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof OdfNumberStyle) {
+			if (mNumberStyles != null) {
+				OdfNumberStyle numberStyle = (OdfNumberStyle) node;
+				mNumberStyles.remove(numberStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof OdfNumberDateStyle) {
+			if (mDateStyles != null) {
+				OdfNumberDateStyle dateStyle = (OdfNumberDateStyle) node;
+				mDateStyles.remove(dateStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof OdfNumberPercentageStyle) {
+			if (mPercentageStyles != null) {
+				OdfNumberPercentageStyle percentageStyle = (OdfNumberPercentageStyle) node;
+				mPercentageStyles.remove(percentageStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof OdfNumberCurrencyStyle) {
+			if (mCurrencyStyles != null) {
+				OdfNumberCurrencyStyle currencyStyle = (OdfNumberCurrencyStyle) node;
+				mCurrencyStyles.remove(currencyStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof OdfNumberTimeStyle) {
+			if (mTimeStyles != null) {
+				OdfNumberTimeStyle timeStyle = (OdfNumberTimeStyle) node;
+				mTimeStyles.remove(timeStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof NumberBooleanStyleElement) {
+			if (mBooleanStyles != null) {
+				NumberBooleanStyleElement booleanStyle = (NumberBooleanStyleElement) node;
+				mBooleanStyles.remove(booleanStyle.getStyleNameAttribute());
+			}
+		} else if (node instanceof NumberTextStyleElement) {
+			if (mTextStyles != null) {
+				NumberTextStyleElement textStyle = (NumberTextStyleElement) node;
+				mTextStyles.remove(textStyle.getStyleNameAttribute());
+			}
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfDefaultStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfDefaultStyle.java
new file mode 100644
index 0000000..5f567eb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfDefaultStyle.java
@@ -0,0 +1,60 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+
+package org.odftoolkit.odfdom.incubator.doc.style;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleDefaultStyleElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfDefaultStyle extends StyleDefaultStyleElement
+{
+
+	private static final long serialVersionUID = -8824457719103504447L;
+
+	public OdfDefaultStyle( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }
+
+	@Override
+	public OdfStyleFamily getFamily() {
+		String family = getStyleFamilyAttribute();
+		if(family!=null)
+		 return OdfStyleFamily.valueOf( family);
+		else 
+			return null;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfStyle.java
new file mode 100644
index 0000000..8a40069
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfStyle.java
@@ -0,0 +1,64 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.style;
+
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ * 
+ */
+public class OdfStyle extends StyleStyleElement {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1114614579014922410L;
+
+	public OdfStyle(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+	}
+
+	@Override
+	public OdfStyleBase getParentStyle() {
+		String parent = this.getStyleParentStyleNameAttribute();
+		if ((parent != null) && (parent.length() != 0)) {
+			return ((OdfSchemaDocument) mPackageDocument).getDocumentStyles().getStyle(parent, getFamily());
+		} else {
+			return ((OdfSchemaDocument) mPackageDocument).getDocumentStyles().getDefaultStyle(getFamily());
+		}
+	}
+
+	@Override
+	public OdfStyleFamily getFamily() {
+		String family = getStyleFamilyAttribute();
+		if (family != null) {
+			return OdfStyleFamily.valueOf(family);
+		} else {
+			return null;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfStylePageLayout.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfStylePageLayout.java
new file mode 100644
index 0000000..4de2a17
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/style/OdfStylePageLayout.java
@@ -0,0 +1,58 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+ 
+
+package org.odftoolkit.odfdom.incubator.doc.style;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfStylePageLayout extends StylePageLayoutElement
+{
+
+	private static final long serialVersionUID = 4753586841264363188L;
+
+	public OdfStylePageLayout( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }
+
+    @Override
+    public OdfStyleFamily getFamily()
+    {
+        return OdfStyleFamily.List;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfEditableTextExtractor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfEditableTextExtractor.java
new file mode 100644
index 0000000..43800d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfEditableTextExtractor.java
@@ -0,0 +1,197 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+
+import org.odftoolkit.odfdom.doc.table.OdfTable;
+import org.odftoolkit.odfdom.doc.table.OdfTableRow;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfMetaDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMetaElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.w3c.dom.NodeList;
+
+/**
+ * It's a sub class of OdfTextExtractor. It provides a method to return all the text 
+ * that the user can typically edit in a document, including text in cotent.xml, 
+ * header and footer in styles.xml, meta data in meta.xml. 
+ * 
+ * <p>This function can be used by search engine, and text analytic operations. </p> 
+ *
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.EditableTextExtractor} in Simple API.
+ */
+public class OdfEditableTextExtractor extends OdfTextExtractor {
+
+	OdfDocument mDocument = null;
+	OdfElement mElement = null;
+	boolean mIsDocumentExtractor = false;
+
+	/**
+	 * Constructor with an ODF document as a parameter
+	 * @param doc the ODF document whose editable text would be extracted. 
+	 */
+	private OdfEditableTextExtractor(OdfDocument doc) {
+		mTextBuilder = new StringBuilder();
+		mDocument = doc;
+		mIsDocumentExtractor = true;
+	}
+
+	/**
+	 * Constructor with an ODF element as parameter
+	 * @param element the ODF element whose editable text would be extracted. 
+	 */
+	private OdfEditableTextExtractor(OdfElement element) {
+		mTextBuilder = new StringBuilder();
+		mElement = element;
+		mIsDocumentExtractor = false;
+	}
+
+	/**
+	 * An instance of OdfEditableTextExtractor will be created to 
+	 * extract the editable text content of an ODF element.
+	 * @param doc the ODF document whose text will be extracted.
+	 * @return An instance of OdfEditableTextExtractor
+	 */
+	public static OdfEditableTextExtractor newOdfEditableTextExtractor(OdfDocument doc) {
+		return new OdfEditableTextExtractor(doc);
+	}
+
+	/**
+	 * An instance of OdfEditableTextExtractor will be created to 
+	 * extract the editable text content of an ODF element.
+	 * @param element the ODF element whose text will be extracted.
+	 * @return An instance of OdfEditableTextExtractor
+	 */
+	public static OdfEditableTextExtractor newOdfEditableTextExtractor(OdfElement element) {
+		return new OdfEditableTextExtractor(element);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement)
+	 */
+	@Override
+	public void visit(DrawObjectElement element) {
+		String embedDocPath = element.getXlinkHrefAttribute();
+		OdfDocument embedDoc = ((OdfDocument) (((OdfContentDom) element.getOwnerDocument()).getDocument())).loadSubDocument(embedDocPath);
+		if (embedDoc != null) {
+			try {
+				mTextBuilder.append(OdfEditableTextExtractor.newOdfEditableTextExtractor(embedDoc).getText());
+			} catch (Exception e) {
+				Logger.getLogger(OdfEditableTextExtractor.class.getName()).log(Level.SEVERE, null, e);
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement)
+	 */
+	@Override
+	public void visit(TextTrackedChangesElement ele) {
+		return;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextAElement)
+	 */
+	@Override
+	public void visit(TextAElement ele) {
+		String link = ele.getXlinkHrefAttribute();
+		mTextBuilder.append(link);
+		appendElementText(ele);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextTabElement)
+	 */
+	@Override
+	public void visit(TableTableElement ele) {
+		OdfTable table = OdfTable.getInstance(ele);
+		List<OdfTableRow> rowlist = table.getRowList();
+		for (int i = 0; i < rowlist.size(); i++) {
+			OdfTableRow row = rowlist.get(i);
+			for (int j = 0; j < row.getCellCount(); j++) {
+				mTextBuilder.append(row.getCellByIndex(j).getDisplayText()).append(TabChar);
+			}
+			mTextBuilder.append(NewLineChar);
+		}
+	}
+
+	/**
+	 * Return the editable text content as a string
+	 * @return the editable text content as a string
+	 */
+	@Override
+	public String getText() {
+		if (mIsDocumentExtractor) {
+			return getDocumentText();
+		} else {
+			visit(mElement);
+			return mTextBuilder.toString();
+		}
+	}
+
+	private String getDocumentText() {
+		StringBuilder builder = new StringBuilder();
+		try {
+			//Extract text from content.xml
+			OdfEditableTextExtractor contentDomExtractor = newOdfEditableTextExtractor(mDocument.getContentRoot());
+			builder.append(contentDomExtractor.getText());
+
+			//Extract text from style.xml
+			OdfStylesDom styleDom = mDocument.getStylesDom();
+			if (styleDom != null) {
+				StyleMasterPageElement masterpage = null;
+				NodeList list = styleDom.getElementsByTagName("style:master-page");
+				if (list.getLength() > 0) {
+					masterpage = (StyleMasterPageElement) list.item(0);
+				}
+				if (masterpage != null) {
+					builder.append(newOdfEditableTextExtractor(masterpage).getText());
+				}
+			}
+
+			//Extract text from meta.xml
+			OdfMetaDom metaDom = mDocument.getMetaDom();
+			if (metaDom != null) {
+				OdfElement root = metaDom.getRootElement();
+				OfficeMetaElement officemeta = OdfElement.findFirstChildNode(OfficeMetaElement.class, root);
+				if (officemeta != null) {
+					builder.append(newOdfEditableTextExtractor(officemeta).getText());
+				}
+			}
+
+			return builder.toString();
+		} catch (Exception e) {
+			Logger.getLogger(OdfEditableTextExtractor.class.getName()).severe(e.getMessage());
+			return builder.toString();
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextExtractor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextExtractor.java
new file mode 100644
index 0000000..7324e0c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextExtractor.java
@@ -0,0 +1,162 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.w3c.dom.Node;
+
+/**
+ * It's a sub class of DefaultElementVisitor. It provides a method to get the display text
+ * of a single element.
+ * <p> If you pass the content root as the parameter, the whole document content will be 
+ * returned, without any tag information.</p>
+ * <p> It implements part of white space handling fuctions: text:p, text:h, text:s, text:tab, text:linebreak are processed
+ * according to ODF specification.</p>
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.TextExtractor} in Simple API.
+ */
+public class OdfTextExtractor extends DefaultElementVisitor {
+
+	protected StringBuilder mTextBuilder;
+	OdfElement mElement;
+	protected static final char NewLineChar = '\r';
+	protected static final char TabChar = '\t';
+
+	/**
+	 * Default constructor
+	 */
+	protected OdfTextExtractor() {
+	}
+
+	/**
+	 * Constructor with an ODF element as paramter
+	 * @param element the ODF element whose text would be extracted. 
+	 */
+	protected OdfTextExtractor(OdfElement element) {
+		mTextBuilder = new StringBuilder();
+		mElement = element;
+	}
+
+	/**
+	 * Append the text content of this element to string buffer.
+	 * @param ele the ODF element whose text will be appended.
+	 */
+	protected void appendElementText(OdfElement ele) {
+		Node node = ele.getFirstChild();
+
+		while (node != null) {
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				mTextBuilder.append(node.getNodeValue());
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				OdfElement element = (OdfElement) node;
+				element.accept(this);
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/**
+	 * An instance of OdfTextExtractor will be created to 
+	 * extract the text content of an ODF element.
+	 * @param element the ODF element whose text will be extracted.
+	 * @return An instance of OdfTextExtractor
+	 */
+	public static OdfTextExtractor newOdfTextExtractor(OdfElement element) {
+		return new OdfTextExtractor(element);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.pkg.OdfElement)
+	 */
+	@Override
+	public void visit(OdfElement element) {
+		if (element.getNamespaceURI().equals(OdfDocumentNamespace.META.getUri())
+				|| element.getNamespaceURI().equals(OdfDocumentNamespace.DC.getUri())) {
+			mTextBuilder.append(NewLineChar);
+		}
+		appendElementText(element);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextPElement)
+	 */
+	@Override
+	public void visit(TextPElement ele) {
+		mTextBuilder.append(NewLineChar);
+		appendElementText(ele);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextHElement)
+	 */
+	@Override
+	public void visit(TextHElement ele) {
+		mTextBuilder.append(NewLineChar);
+		appendElementText(ele);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextSElement)
+	 */
+	@Override
+	public void visit(TextSElement ele) {
+		Integer count = ele.getTextCAttribute();
+		if (count == null) {
+			count = 1;
+		}
+		for (int i = 0; i < count; i++) {
+			mTextBuilder.append(' ');
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextTabElement)
+	 */
+	@Override
+	public void visit(TextTabElement ele) {
+		mTextBuilder.append(TabChar);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement)
+	 */
+	@Override
+	public void visit(TextLineBreakElement ele) {
+		mTextBuilder.append(NewLineChar);
+		appendElementText(ele);
+	}
+
+	/**
+	 * Return the text content as a string
+	 * @return the text content as a string
+	 */
+	public String getText() {
+		visit(mElement);
+		return mTextBuilder.toString();
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextHeading.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextHeading.java
new file mode 100644
index 0000000..e5c04e8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextHeading.java
@@ -0,0 +1,174 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.text.Paragraph} in Simple API.
+ */
+public class OdfTextHeading extends TextHElement
+{
+	public OdfTextHeading( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+	/** Creates a new instance of this class with the given style name.
+	 * If the style name is null or the null string, no style is added.
+	 */
+	public OdfTextHeading(OdfFileDom ownerDoc, String styleName)
+	{
+		super(ownerDoc);
+		if (styleName != null && (!(styleName.equals(""))))
+        {
+            this.setStyleName(styleName);
+}
+	}
+
+	/**
+	 * Creates an instance of this class with the given styleName and content.
+     * If the style name is null or the null string, no style is added.
+	 * If the content is null or the null string, no content is added.
+	 * @param ownerDoc the owner document DOM
+	 * @param styleName the style:style-name value
+	 * @param content the heading content
+	 */
+	public OdfTextHeading(OdfFileDom ownerDoc,
+			String styleName, String content)
+	{
+		super(ownerDoc);
+		this.addStyledContent(styleName, content);
+	}
+
+	/**
+	 * Add the given content to the paragraph.
+     * If the content is null or the null string, no content is added.
+	 * @param content the heading content
+	 * @return the heading object
+	 */
+	public OdfTextHeading addContent(String content)
+	{
+		if (content != null && !content.equals(""))
+		{
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+		return this;
+	}
+
+    /**
+	 * Add the given content to the heading.
+     * If the content is null or the null string, no content is added.
+	 * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+	 * elements, and multiple blanks to <code>&lt;text:s</code>
+	 * @param content the heading content
+	 * @return the heading object
+	 */
+	public OdfTextHeading addContentWhitespace(String content)
+	{
+		if (content != null && !content.equals(""))
+		{
+			new OdfWhitespaceProcessor().append(this, content);
+		}
+		return this;
+	}
+
+	/**
+	 * Set a heading to have the given styleName and add the given content.
+     * If the style name is null or the null string, no style is added.
+	 * @param styleName the style:style-name value
+	 * @param content the heading content
+	 * @return the heading object
+	 */
+	public OdfTextHeading addStyledContent(String styleName, String content)
+	{
+		if (styleName != null && (!(styleName.equals(""))))
+        {
+            setStyleName(styleName);
+        }
+		return addContent(content);
+	}
+
+	/**
+	 * Set a heading to have the given styleName and add the given content.
+     * If the style name is null or the null string, no style is added.
+	 * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+	 * elements, and multiple blanks to <code>&lt;text:s</code>
+	 * @param styleName the style:style-name value
+	 * @param content the heading content
+	 * @return the heading object
+	 */
+	public OdfTextHeading addStyledContentWhitespace(String styleName, String content)
+	{
+		if (styleName != null && (!(styleName.equals(""))))
+        {
+            setStyleName(styleName);
+        }
+		return addContentWhitespace(content);
+	}
+
+    /**
+	 * Add a span with the given styleName and content to this heading.
+	 * If the style name is null or the null string, no span is added.
+	 * If the content is null or the null string, no span is added.
+	 * @param styleName
+	 * @param content
+	 * @return the heading object
+	 */
+	public OdfTextHeading addStyledSpan(String styleName, String content)
+	{
+		if (styleName != null && !styleName.equals("") &&
+			content != null && !content.equals(""))
+		{
+			this.appendChild(new OdfTextSpan(
+				(OdfFileDom) this.getOwnerDocument(),
+				styleName, content));
+		}
+		return this;
+	}
+    
+	/**
+	 * Add a span with the given styleName and content to this paragraph.
+	 * If the style name is null or the null string, no span is added.
+	 * If the content is null or the null string, no span is added.
+	 * @param styleName
+	 * @param content
+	 * @return the heading object
+	 */
+	public OdfTextHeading addStyledSpanWhitespace(String styleName, String content)
+	{
+		OdfTextSpan span;
+		if (styleName != null && !styleName.equals("") &&
+			content != null && !content.equals(""))
+		{
+			span = new OdfTextSpan((OdfFileDom) this.getOwnerDocument());
+			span.addStyledContentWhitespace(styleName, content);
+			appendChild(span);
+		}
+		return this;
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextList.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextList.java
new file mode 100644
index 0000000..453f753
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextList.java
@@ -0,0 +1,235 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleElementBase;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.text.list.List} in Simple API.
+ */
+public class OdfTextList extends TextListElement {
+
+	/**
+	 * Creates a new instance of OdfList.
+	 * 
+	 * @param ownerDoc
+	 */
+	public OdfTextList(OdfFileDom ownerDoc) {
+		super(ownerDoc);
+	}
+
+	/**
+	 * Creates a new instance of OdfList.
+	 * 
+	 * @param ownerDoc
+	 *            The document to which the list belongs
+	 * @param itemList
+	 *            An array of the list items, each preceded by delimiters that
+	 *            indicate nesting level.
+	 * @param indentDelim
+	 *            The character used as level nesting delimiter.
+	 * @param listStyleName
+	 *            Name to be applied to each <code>text:list</code> element.
+	 */
+	public OdfTextList(OdfFileDom ownerDoc, String[] itemList,
+			char indentDelim, String listStyleName) {
+		super(ownerDoc);
+		OdfTextList[] listArray = new OdfTextList[10];
+		TextListItemElement listItem;
+		OdfTextParagraph para;
+		String item;
+		int level = 0;
+		int lastLevel = 0;
+		int lev; // loop counter
+
+		listArray[0] = this;
+		for (int i = 0; i < itemList.length; i++) {
+			level = 0;
+			item = itemList[i];
+
+			// determine level of indenting by counting delimiters,
+			// then get rid of the delimiters
+			while (level < item.length() && item.charAt(level) == indentDelim) {
+				level++;
+			}
+			item = item.substring(level);
+
+			if (level > lastLevel) // open the sub-levels
+			{
+				for (lev = lastLevel + 1; lev <= level; lev++) {
+					listArray[lev] = new OdfTextList(ownerDoc);
+					listArray[lev].setTextStyleNameAttribute(listStyleName);
+				}
+			} else if (level < lastLevel) // close off the intervening lists
+			{
+				closeLevels(ownerDoc, listArray, lastLevel, level);
+			}
+			// now that we are at the proper level, add the item.
+			listArray[level].setTextStyleNameAttribute(listStyleName);
+			listItem = new TextListItemElement(ownerDoc);
+			para = new OdfTextParagraph(ownerDoc);
+			para.setTextContent(item);
+			listItem.appendChild(para);
+			listArray[level].appendChild(listItem);
+			lastLevel = level;
+		}
+
+		// close off any remaining open lists
+		closeLevels(ownerDoc, listArray, lastLevel, 0);
+	}
+
+	private void closeLevels(OdfFileDom ownerDoc, OdfTextList[] listArray,
+			int fromLevel, int toLevel) {
+		for (int level = fromLevel; level > toLevel; level--) {
+			if (!listArray[level - 1].hasChildNodes()) {
+				/* Force a list item */
+				listArray[level - 1].appendChild(new TextListItemElement(
+						ownerDoc));
+			}
+			listArray[level - 1].getLastChild().appendChild(listArray[level]);
+		}
+	}
+
+	/**
+	 * Retrieves Odf Text List Style
+	 * 
+	 * @return the <code>OdfTextListStyle</code> element
+	 */
+	public OdfTextListStyle getListStyle() {
+		OdfTextListStyle style = null;
+
+		String listName = getTextStyleNameAttribute();
+		if (listName != null && listName.length() > 0) {
+			OdfFileDom fileDom = (OdfFileDom) this.ownerDocument;
+			OdfOfficeAutomaticStyles autoStyles = null;
+			if(fileDom instanceof OdfContentDom){
+				autoStyles = ((OdfContentDom) fileDom).getAutomaticStyles();
+			}else if(fileDom instanceof OdfStylesDom){
+				autoStyles = ((OdfStylesDom) fileDom).getAutomaticStyles();
+			}			
+			if (autoStyles != null) {
+				style = autoStyles.getListStyle(listName);
+			}
+			if (style == null) {
+				OdfOfficeStyles styles = ((OdfSchemaDocument) fileDom.getDocument()).getDocumentStyles();
+				if (styles != null) {
+					style = styles.getListStyle(listName);
+				}
+			}
+		} else {
+			// if no style is specified at this particular list element, we
+			// ask the parent list (if any)
+			OdfTextList parentList = getParentList();
+			if (parentList != null) {
+				style = parentList.getListStyle();
+			}
+		}
+
+		return style;
+	}
+
+	/**
+	 * Retrieves the list level count
+	 * 
+	 * @return the level count
+	 */
+	public int getListLevel() {
+		int level = 1;
+		Node parent = getParentNode();
+		while (parent != null) {
+			if (parent instanceof TextListElement) {
+				level++;
+			}
+			parent = parent.getParentNode();
+		}
+		return level;
+	}
+
+	/**
+	 * Retrieves the List Level Style
+	 * 
+	 * @return the <code>TextListLevelStyleElementBase</code>
+	 */
+	public TextListLevelStyleElementBase getListLevelStyle() {
+		TextListLevelStyleElementBase odfListLevelStyle = null;
+		OdfTextListStyle style = getListStyle();
+		int level = getListLevel();
+		if (style != null) {
+			odfListLevelStyle = style.getLevel(level);
+		} else {
+			Logger.getLogger(OdfTextList.class.getName()).warning(
+					"No ListLevelStyle found!");
+		}
+		return odfListLevelStyle;
+	}
+
+	/**
+	 * Retrieves or create local list style
+	 * 
+	 * @return the <code>OdfTextListStyle</code> element
+	 */
+	public OdfTextListStyle getOrCreateLocalListStyle() {
+		OdfTextListStyle listStyle = getListStyle();
+		if (listStyle == null) {
+			OdfOfficeAutomaticStyles autoStyles = null;
+			OdfFileDom fileDom = ((OdfFileDom) this.ownerDocument);
+			if(fileDom instanceof OdfContentDom){
+				autoStyles = ((OdfContentDom) fileDom).getOrCreateAutomaticStyles();
+			}else if(fileDom instanceof OdfStylesDom){
+				autoStyles = ((OdfStylesDom) fileDom).getOrCreateAutomaticStyles();
+			}	
+			if (autoStyles != null) {
+				listStyle = autoStyles.newListStyle();
+			}
+		}
+		return listStyle;
+	}
+
+	/**
+	 * Retrieves the parent list of text list
+	 * 
+	 * @return The <code>OdfTextList</code>
+	 */
+	public OdfTextList getParentList() {
+		Node parent = getParentNode();
+		while (parent != null) {
+			if (parent instanceof OdfTextList) {
+				return (OdfTextList) parent;
+			}
+			parent = parent.getParentNode();
+		}
+		return null;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleBullet.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleBullet.java
new file mode 100644
index 0000000..ea89fc6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleBullet.java
@@ -0,0 +1,54 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleBulletElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfTextListLevelStyleBullet extends TextListLevelStyleBulletElement
+{
+    
+	public OdfTextListLevelStyleBullet( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    @Override
+    public OdfStyleFamily getFamily()
+    {
+        return OdfStyleFamily.List;
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleImage.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleImage.java
new file mode 100644
index 0000000..84d2018
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleImage.java
@@ -0,0 +1,57 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleImageElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfTextListLevelStyleImage extends TextListLevelStyleImageElement
+{
+    
+	private static final long serialVersionUID = -4812791034437665408L;
+
+	public OdfTextListLevelStyleImage( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    @Override
+    public OdfStyleFamily getFamily()
+    {
+        return OdfStyleFamily.List;
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleNumber.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleNumber.java
new file mode 100644
index 0000000..10b3760
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListLevelStyleNumber.java
@@ -0,0 +1,57 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleNumberElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfTextListLevelStyleNumber extends TextListLevelStyleNumberElement
+{
+ 
+	private static final long serialVersionUID = 5198532536808129901L;
+
+	public OdfTextListLevelStyleNumber( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+    
+    @Override
+    public OdfStyleFamily getFamily()
+    {
+        return OdfStyleFamily.List;
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }    
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListStyle.java
new file mode 100644
index 0000000..b88d7bf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextListStyle.java
@@ -0,0 +1,266 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListStyleElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfListLevelProperties;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ * List styles require a lot of code to create one level at a time.
+ * This class contains constructors that create an entire OdfListStyle
+ * based on a delimited string or an array of strings.
+ * Each item in the string (or array) represents a list level
+ * style for levels 1-10.
+ *
+ * <p>If an item contains <code>1</code>, <code>I</code>,
+ * <code>i</code>, <code>A</code>, or <code>a</code>, then it is presumed
+ * to be a numbering style; otherwise it is a bulleted style.</p>
+ */
+public class OdfTextListStyle extends TextListStyleElement
+{
+   
+	private static final long serialVersionUID = -5493176392198676430L;
+
+	/** Maximum number of levels in a list. */
+	protected static final int MAX_LIST_LEVEL = 10;
+	/** List should show all levels of numbering. */
+	public static final boolean SHOW_ALL_LEVELS = true;
+	/** List should show only one level of numbering. */
+	public static final boolean SHOW_ONE_LEVEL = false;
+
+	public OdfTextListStyle( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+	/**
+	 * Creates an OdfListStyle.
+	 * @param ownerDoc the document that this list style belongs to.
+	 * @param name the name of this list style.
+	 * @param specifiers the string of level specifiers.
+	 * @param delim the delimiter for splitting the string into levels.
+	 * @param spacing a css "length" telling how far to indent each level; also min. label width
+	 * @param showAllLevels true if you want to display all levels of numbering, false otherwise.
+	*/
+	public OdfTextListStyle(OdfFileDom ownerDoc,
+		String name,
+		String specifiers, String delim, String spacing, boolean showAllLevels)
+	{
+		super(ownerDoc);
+		String[] specArray = specifiers.split(delim);
+		newListStyle(name, specArray, spacing, showAllLevels);
+	}
+
+	/**
+	 * Constructor for OdfEasyListStyle.
+	 * @param ownerDoc the document that this list style belongs to.
+	 * @param name the name of this list style.
+	 * @param specArray an array of strings of level specifications.
+	 * @param spacing a css "length" telling how far to indent each level; also min. label width
+	 * @param showAllLevels true if you want to display all levels of numbering, false otherwise.
+	*/
+	public OdfTextListStyle(OdfFileDom ownerDoc,
+		String name,
+		String[] specArray, String spacing, boolean showAllLevels)
+	{
+		super(ownerDoc);
+		newListStyle(name, specArray, spacing, showAllLevels);
+	}
+
+	/** returns the given level or null if it does not exist
+     * 
+     * @param level is the level number that should be returned
+     * @return an instance of TextListLevelStyleImageElement,
+     *         TextListLevelStyleBulletElement, TextListLevelStyleNumberElement or
+     *         null.
+     */
+    public TextListLevelStyleElementBase getLevel(int level )
+    {
+        Node levelElement = this.getFirstChild();
+        
+        while( levelElement != null )
+        {
+            if( levelElement instanceof TextListLevelStyleElementBase )
+            {
+                if( level == 1 ) {
+                    return (TextListLevelStyleElementBase) levelElement;
+                }
+                else {
+                    --level;
+                }
+                
+            }
+            levelElement = levelElement.getNextSibling();
+        }
+        return null;
+    }
+
+    /** always returns the given level with the given class. If that level does
+     *  not exist or has a different class than it is (re)created.
+     * 
+     * @param level is the level number that should be returned
+     * @param clazz is the class of the level, should be
+     *        TextListLevelStyleImageElement, TextListLevelStyleBulletElement or
+     *        TextListLevelStyleNumberElement.
+     * @return
+     *        a list level style with the given level and class
+     */
+    @SuppressWarnings("unchecked")
+    public TextListLevelStyleElementBase getOrCreateListLevel( int level, Class clazz )
+    {
+        TextListLevelStyleElementBase levelStyle = getLevel( level );
+        if( (levelStyle != null) && clazz.isInstance(levelStyle) ) {
+            return levelStyle;
+        }
+        
+        if( levelStyle != null ) {
+            removeChild(levelStyle);
+        }
+        
+        levelStyle = (TextListLevelStyleElementBase)
+                        ((OdfFileDom)this.ownerDocument).newOdfElement(clazz);
+        levelStyle.setTextLevelAttribute(level);
+        appendChild(levelStyle);
+        
+        return levelStyle;
+    }
+    
+    @Override
+    public OdfStyleFamily getFamily()
+    {
+        return OdfStyleFamily.List;
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }
+
+	/**
+	 * Creates the OdfTextListStyle element.
+	 * This is a utility routine called by the constructors.
+	 * @param name the <code>style:name</code> of this list style
+	 * @param specArray specifications for each level of the list
+	 * @param spacing a CSS length that gives the amount of space before
+	 * a label and the minimum label width
+	 * @param showAllLevels if true, display all levels of a numbered list item
+	 */
+	private void newListStyle(String name,
+		String[] specArray, String spacing,
+		boolean showAllLevels)
+	{
+		Pattern numFormatPattern = Pattern.compile("([1IiAa])");
+		Pattern cssLengthPattern = Pattern.compile("([^a-z]+)\\s*([a-z]+)?");
+		String numPrefix = "";
+		String numSuffix = "";
+		String numberFormat = "";
+		Matcher m;
+		double cssLengthNum;
+		String cssLengthUnits;
+		int displayLevels;
+
+		OdfTextListLevelStyleNumber number;
+		OdfTextListLevelStyleBullet bullet;
+		TextListLevelStyleElementBase styleItem;
+
+		this.setStyleNameAttribute(name);
+
+		// split up the spacing into length and units
+		m = cssLengthPattern.matcher(spacing);
+		if (m.find())
+		{
+			try
+			{
+				cssLengthNum = Double.parseDouble(m.group(1));
+			}
+			catch (NumberFormatException oops)
+			{
+				cssLengthNum = 0.0;
+			}
+			cssLengthUnits = (m.group(2) == null) ? "" : m.group(2);
+		}
+		else
+		{
+			cssLengthNum = 0;
+			cssLengthUnits = "";
+		}
+
+
+		for (int i = 0; i < Math.min(specArray.length, MAX_LIST_LEVEL); i++)
+		{
+			specArray[i] = specArray[i].trim();
+			m = numFormatPattern.matcher( specArray[i] );
+			if (m.find())	// if it has 1, I, i, A, or a, it's a numbering style
+			{
+				numberFormat = m.group(1);
+				numPrefix = specArray[i].substring( 0, m.start(1) );
+				numSuffix = specArray[i].substring( m.end(1) );
+				displayLevels = (showAllLevels) ? (i+1) : 1;
+				number = new OdfTextListLevelStyleNumber(
+					(OdfFileDom)this.ownerDocument);
+				number.setStyleNumPrefixAttribute(numPrefix);
+				number.setStyleNumFormatAttribute(numberFormat);
+				number.setStyleNumSuffixAttribute(numSuffix);
+				number.setTextDisplayLevelsAttribute( displayLevels );
+				styleItem = number;
+			}
+			else	// it's a bullet style
+			{
+				bullet = new OdfTextListLevelStyleBullet(
+					(OdfFileDom)this.ownerDocument);
+				bullet.setStyleNumPrefixAttribute("");
+				bullet.setStyleNumSuffixAttribute("");
+				if (!specArray[i].equals(""))
+				{
+					bullet.setTextBulletCharAttribute(specArray[i].substring(0,1));
+				}
+				else
+				{
+					bullet.setTextBulletCharAttribute("");
+				}
+				styleItem = bullet;
+			}
+
+			styleItem.setTextLevelAttribute(i+1);
+			styleItem.setProperty(OdfListLevelProperties.SpaceBefore,
+				Double.toString(cssLengthNum * (i+1)) + cssLengthUnits);
+			styleItem.setProperty(OdfListLevelProperties.MinLabelWidth,
+				Double.toString(cssLengthNum) + cssLengthUnits);
+			this.appendChild(styleItem);
+
+		}
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextOutlineLevelStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextOutlineLevelStyle.java
new file mode 100644
index 0000000..7be15bf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextOutlineLevelStyle.java
@@ -0,0 +1,56 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextOutlineLevelStyleElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfTextOutlineLevelStyle extends TextOutlineLevelStyleElement
+{
+	private static final long serialVersionUID = -4117353513688453621L;
+
+	public OdfTextOutlineLevelStyle( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    @Override
+    public OdfStyleFamily getFamily()
+    {
+        return OdfStyleFamily.List;
+    }
+
+    @Override
+    public OdfStyleBase getParentStyle()
+    {
+        return null;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextOutlineStyle.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextOutlineStyle.java
new file mode 100644
index 0000000..6e84d31
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextOutlineStyle.java
@@ -0,0 +1,85 @@
+
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.text.TextOutlineStyleElement;
+import org.w3c.dom.Node;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ */
+public class OdfTextOutlineStyle extends TextOutlineStyleElement
+{
+	private static final long serialVersionUID = -337172468409606629L;
+
+	public OdfTextOutlineStyle( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+    /**
+     * Retrieves the ODF TextOutlineLevelStyle with level count
+     * 
+     * @param level  The level count
+     * @return The <code>OdfTextOutlineLevelStyle</code>
+     */
+	public OdfTextOutlineLevelStyle getLevel(int level )
+    {
+        Node levelElement = this.getFirstChild();
+
+        while( levelElement != null )
+        {
+            if(levelElement instanceof OdfTextOutlineLevelStyle )
+            {
+                OdfTextOutlineLevelStyle levelStyle = (OdfTextOutlineLevelStyle)levelElement;
+                if( levelStyle.getTextLevelAttribute().intValue() == level ) {
+                    return levelStyle;
+                }
+            }
+            levelElement = levelElement.getNextSibling();
+        }
+        return null;
+    }
+    
+	/**
+	 * Retrieves or create the ODF TextOutlineLevelStyle with level count
+	 * 
+	 * @param level The level count
+	 * @return The <code>OdfTextOutlineLevelStyle</code>
+	 */
+    public OdfTextOutlineLevelStyle getOrCreateLevel(int level)
+    {
+        OdfTextOutlineLevelStyle style = getLevel(level);
+        if( style == null )
+        {
+            style = ((OdfFileDom)this.ownerDocument).newOdfElement(OdfTextOutlineLevelStyle.class);
+            style.setTextLevelAttribute(level);
+            this.appendChild(style);
+        }
+        return style;
+    }
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextParagraph.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextParagraph.java
new file mode 100644
index 0000000..9c6280b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextParagraph.java
@@ -0,0 +1,163 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ *
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.text.Paragraph} in Simple API.
+ */
+public class OdfTextParagraph extends TextPElement {
+
+    /** Creates a new instance of this class */
+    public OdfTextParagraph(OdfFileDom ownerDoc) {
+        super(ownerDoc);
+    }
+
+    /** Creates a new instance of this class with the given style name.
+     * If the style name is null or the null string, no style is added.
+     */
+    public OdfTextParagraph(OdfFileDom ownerDoc, String styleName) {
+        super(ownerDoc);
+        if (styleName != null && (!(styleName.equals("")))) {
+            this.setStyleName(styleName);
+        }
+    }
+
+    /**
+     * Creates an instance of this class with the given styleName and content.
+     * If the style name is null or the null string, no style is added.
+     * If the content is null or the null string, no content is added.
+     * @param ownerDoc the owner document DOM
+     * @param styleName the style:style-name value
+     * @param content the paragraph content
+     */
+    public OdfTextParagraph(OdfFileDom ownerDoc,
+        String styleName, String content) {
+        super(ownerDoc);
+        this.addStyledContent(styleName, content);
+    }
+
+    /**
+     * Add the given content to the paragraph.
+     * If the content is null or the null string, no content is added.
+     * @param content the paragraph content
+     * @return the paragraph object
+     */
+    public OdfTextParagraph addContent(String content) {
+        if (content != null && !content.equals("")) {
+            this.appendChild(this.getOwnerDocument().createTextNode(content));
+        }
+        return this;
+    }
+
+    /**
+     * Add the given content to the paragraph.
+     * If the content is null or the null string, no content is added.
+     * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+     * elements, and multiple blanks to <code>&lt;text:s</code>
+     * @param content the paragraph content
+     * @return the paragraph object
+     */
+    public OdfTextParagraph addContentWhitespace(String content) {
+        if (content != null && !content.equals("")) {
+            new OdfWhitespaceProcessor().append(this, content);
+        }
+        return this;
+    }
+
+    /**
+     * Set a paragraph to have the given styleName and add the given content.
+     * If the style name is null or the null string, no style is added.
+     * If the content is null or the null string, no content is added.
+     * @param styleName the style:style-name value
+     * @param content the paragraph content
+     * @return the paragraph object
+     */
+    public OdfTextParagraph addStyledContent(String styleName, String content) {
+        if (styleName != null && (!(styleName.equals("")))) {
+            setStyleName(styleName);
+        }
+        return addContent(content);
+    }
+
+    /**
+     * Set a paragraph to have the given styleName and add the given content.
+     * If the style name is null or the null string, no style is added.
+     * If the content is null or the null string, no content is added.
+     * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+     * elements, and multiple blanks to <code>&lt;text:s</code>
+     * @param styleName the style:style-name value
+     * @param content the paragraph content
+     * @return the paragraph object
+     */
+    public OdfTextParagraph addStyledContentWhitespace(String styleName,
+        String content) {
+        if (styleName != null && (!(styleName.equals("")))) {
+            setStyleName(styleName);
+        }
+        return addContentWhitespace(content);
+    }
+
+    /**
+     * Add a span with the given styleName and content to this paragraph.
+     * If the style name is null or the null string, no span is added.
+     * If the content is null or the null string, no span is added.
+     * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+     * elements, and multiple blanks to <code>&lt;text:s</code>
+     * @param styleName
+     * @param content
+     * @return the heading object
+     */
+    public OdfTextParagraph addStyledSpan(String styleName, String content) {
+        if (styleName != null && !styleName.equals("") &&
+            content != null && !content.equals("")) {
+            this.appendChild(new OdfTextSpan(
+                (OdfFileDom) this.getOwnerDocument(),
+                styleName, content));
+        }
+        return this;
+    }
+
+    /**
+     * Add a span with the given styleName and content to this paragraph.
+     * If the style name is null or the null string, no span is added.
+     * If the content is null or the null string, no span is added.
+     * @param styleName
+     * @param content
+     * @return the heading object
+     */
+    public OdfTextParagraph addStyledSpanWhitespace(String styleName,
+        String content) {
+        OdfTextSpan span;
+        if (styleName != null && !styleName.equals("") &&
+            content != null && !content.equals("")) {
+            span = new OdfTextSpan((OdfFileDom) this.getOwnerDocument());
+            span.addStyledContentWhitespace(styleName, content);
+            appendChild(span);
+        }
+        return this;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextSpan.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextSpan.java
new file mode 100644
index 0000000..1468946
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfTextSpan.java
@@ -0,0 +1,136 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+
+/**
+ * Convenient functionalty for the parent ODF OpenDocument element
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.text.Span} in Simple API.
+ */
+public class OdfTextSpan extends TextSpanElement
+{
+	public OdfTextSpan( OdfFileDom ownerDoc )
+    {
+        super( ownerDoc );
+    }
+
+	/** Creates a new instance of this class with the given style name.
+	 * If the style name is null or the null string, no style is added.
+     *
+     * @param ownerDoc the XML file the Span belongs to
+     * @param styleName the name of the style to be applied to the span
+     */
+	public OdfTextSpan(OdfFileDom ownerDoc, String styleName)
+	{
+		super(ownerDoc);
+		if (styleName != null && (!(styleName.equals(""))))
+        {
+            this.setStyleName(styleName);
+}
+	}
+
+	/**
+	 * Creates an instance of this class with the given styleName and content.
+     * If the style name is null or the null string, no style is added.
+	 * If the content is null or the null string, no content is added.
+	 * @param ownerDoc the owner document DOM
+	 * @param styleName the style:style-name value
+	 * @param content the span content
+	 */
+	public OdfTextSpan(OdfFileDom ownerDoc,
+			String styleName, String content)
+	{
+		super(ownerDoc);
+		this.addStyledContent(styleName, content);
+	}
+
+	/**
+	 * Add the given content to the paragraph.
+     * If the content is null or the null string, no content is added.
+	 * @param content the span content
+     * @return the span object
+	 */
+	public OdfTextSpan addContent(String content)
+	{
+		if (content != null && !content.equals(""))
+		{
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+		return this;
+	}
+
+   	/**
+	 * Add the given content to the paragraph.
+     * If the content is null or the null string, no content is added.
+	 * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+	 * elements, and multiple blanks to <code>&lt;text:s</code>
+	 * @param content the span content
+     * @return the span object
+	 */
+	public OdfTextSpan addContentWhitespace(String content)
+	{
+		if (content != null && !content.equals(""))
+		{
+			new OdfWhitespaceProcessor().append(this, content);
+		}
+		return this;
+	}
+
+	/**
+	 * Set a span to have the given styleName and add the given content.
+     * If the style name is null or the null string, no style is added.
+	 * @param styleName the style:style-name value
+	 * @param content the span content
+	 * @return the span object
+	 */
+	public OdfTextSpan addStyledContent(String styleName, String content)
+	{
+		if (styleName != null && (!(styleName.equals(""))))
+        {
+            setStyleName(styleName);
+        }
+		return addContent(content);
+	}
+    
+	/**
+	 * Set a span to have the given styleName and add the given content.
+     * If the style name is null or the null string, no style is added.
+	 * Embedded \n are converted to <code>&lt;text:line-break&gt;</code>
+	 * elements, and multiple blanks to <code>&lt;text:s</code>
+	 * @param styleName the style:style-name value
+	 * @param content the span content
+	 * @return the span object
+	 */
+	public OdfTextSpan addStyledContentWhitespace(String styleName, String content)
+	{
+		if (styleName != null && (!(styleName.equals(""))))
+        {
+            setStyleName(styleName);
+        }
+		return addContentWhitespace(content);
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfWhitespaceProcessor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfWhitespaceProcessor.java
new file mode 100644
index 0000000..f992e3d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/doc/text/OdfWhitespaceProcessor.java
@@ -0,0 +1,189 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.doc.text;
+
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * It's a tool class to help process white space.
+ * 
+ * @author J David Eisenberg
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.WhitespaceProcessor} in Simple API.
+ */
+public class OdfWhitespaceProcessor {
+	private int nSpaces;
+	private String partial;
+	private OdfFileDom owner;
+	private Element element;
+
+	public OdfWhitespaceProcessor() {
+
+	}
+
+    /**
+     * Add given text content to an element, handling multiple blanks,
+     * tabs, and newlines properly.
+     * @param element the element to which content is being added
+     * @param content text content including whitespace
+     */
+	public void append(Element element, String content)
+	{
+		int i = 0;
+		char ch;
+
+		this.element = element;
+		partial = "";
+		nSpaces = 0;
+		owner = (OdfFileDom) element.getOwnerDocument();
+
+		for (i = 0; i < content.length(); i++)
+		{
+			ch = content.charAt(i);
+			if (ch == ' ')
+			{
+				if (nSpaces == 0)
+				{
+					partial += " ";
+				}
+				nSpaces++;
+			}
+			else if (ch == '\n')
+			{
+				emitPartial();
+				element.appendChild(new TextLineBreakElement(owner));
+			}
+			else if (ch == '\t')
+			{
+				emitPartial();
+				element.appendChild(new TextTabElement(owner));
+			}
+			else if (ch != '\r')	// ignore DOS half of CR-LF
+			{
+				if (nSpaces > 1)
+				{
+					emitPartial();
+				}
+				partial += ch;
+				nSpaces = 0;
+			}
+		}
+		emitPartial();
+	}
+
+	/*
+	 * Send out any information that has been buffered
+	 */
+	private void emitPartial()
+	{
+		/* send out any partial text */
+		if (!partial.equals(""))
+		{
+			element.appendChild(owner.createTextNode(partial));
+		}
+		/* and any spaces if necessary */
+		if (nSpaces > 1)
+		{
+			TextSElement spaceElement = new TextSElement(owner);
+			spaceElement.setTextCAttribute(new Integer(nSpaces - 1));
+			element.appendChild(spaceElement);
+		}
+		/* and reset all the counters */
+		nSpaces = 0;
+		partial = "";
+	}
+
+    /**
+     * Retrieve the text content of an element.
+     * Recursively retrieves all the text nodes, expanding whitespace where
+     * necessary. Ignores any elements except <code>&lt;text:s&gt;</code>,
+     * <code>&lt;text:line-break&gt;</code> and <code>&lt;text:tab&gt</code>.
+     * @param element an element whose text you want to retrieve
+     * @return the element's text content, with whitespace expanded
+     */
+	public String getText(Node element)
+	{
+		String result = "";
+		int spaceCount;
+		Node node = element.getFirstChild();
+		while (node != null)
+		{
+			if (node.getNodeType() == Node.TEXT_NODE)
+			{
+				result += node.getNodeValue();
+			}
+			else if (node.getNodeType() == Node.ELEMENT_NODE)
+			{
+				if (node.getLocalName().equals("s")) // text:s
+				{
+					try
+					{
+						spaceCount = Integer.parseInt(
+							((Element) node).getAttributeNS(
+							OdfDocumentNamespace.TEXT.getUri(), "c"));
+					}
+					catch(Exception e)
+					{
+						spaceCount = 1;
+					}
+					for (int i = 0; i < spaceCount; i++)
+					{
+						result += " ";
+					}
+				}
+				else if (node.getLocalName().equals("line-break"))
+				{
+					result += "\n";
+				}
+				else if (node.getLocalName().equals("tab"))
+				{
+					result += "\t";
+				}
+				else
+				{
+					result = result + getText(node);
+				}
+			}
+			node = node.getNextSibling();
+		}
+		return result;
+	}
+
+    /**
+     * Append text content to a given element, handling whitespace properly.
+     * This is a static method that creates its own OdfWhitespaceProcessor,
+     * so that you don't have to.
+     * @param element the element to which content is being added
+     * @param content text content including whitespace
+     */
+	public static void appendText(Element element, String content)
+	{
+		OdfWhitespaceProcessor processor = new OdfWhitespaceProcessor();
+		processor.append(element, content);
+	}
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaAutoReload.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaAutoReload.java
new file mode 100644
index 0000000..21b2a21
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaAutoReload.java
@@ -0,0 +1,57 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.meta;
+
+import org.odftoolkit.odfdom.dom.element.meta.MetaAutoReloadElement;
+
+/**
+ * <code>OdfMetaAutoReload</code> feature specifies whether the document is
+ * reloaded or replaced by another document after a certain period of time has
+ * elapsed.
+ * 
+ */
+// TODO: the functions are not completed.
+public class OdfMetaAutoReload {
+
+	private MetaAutoReloadElement mMetaAutoReloadElement;
+
+	/**
+	 * Constructor of <code>OdfMetaAutoReload</code> feature.
+	 * 
+	 * @param element
+	 *            an instance of ODF Element <code>MetaAutoReloadElement</code>
+	 */
+	public OdfMetaAutoReload(MetaAutoReloadElement element) {
+		mMetaAutoReloadElement = element;
+	}
+
+	/**
+	 * Return the instance of ODF Element <codeMetaAutoReloadElement</code>
+	 * which represents this feature.
+	 * 
+	 * @return the instance of ODF Element <code>MetaAutoReloadElement</code>
+	 */
+	public MetaAutoReloadElement getMetaAutoReloadElement() {
+		return mMetaAutoReloadElement;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaDocumentStatistic.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaDocumentStatistic.java
new file mode 100644
index 0000000..3415524
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaDocumentStatistic.java
@@ -0,0 +1,435 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.meta;
+
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+
+/**
+ * <code>OdfMetaDocumentStatistic</code> feature specifies the statistics about
+ * the document.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.meta.DocumentStatistic} in Simple API.
+ */
+public class OdfMetaDocumentStatistic {
+
+	private MetaDocumentStatisticElement mDocStatistic;
+
+	/**
+	 * Constructor of <code>OdfMetaDocumentStatistic</code> feature.
+	 * 
+	 * @param docStatistic
+	 *            the <code>MetaDocumentStatisticElement</code> represent this
+	 *            feature
+	 */
+	public OdfMetaDocumentStatistic(MetaDocumentStatisticElement docStatistic) {
+		this.mDocStatistic = docStatistic;
+	}
+
+	/**
+	 * Get the instance of <code>MetaDocumentStatisticElement</code> which represents this
+	 * feature.
+	 * 
+	 * @return an instance of <code>MetaDocumentStatisticElement</code>
+	 */
+	private MetaDocumentStatisticElement getMetaDocumentStatisticElement() {
+		return mDocStatistic;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaCellCountAttribute</code> , See {@odf.attribute
+	 *  meta:cell-count}.
+	 * 
+	 * @return the number of table cells contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getCellCount() {
+		return mDocStatistic.getMetaCellCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaCellCountAttribute</code> , See {@odf.attribute
+	 *  meta:cell-count}.
+	 * 
+	 * @param cellCount	the number of table cells need to be set
+	 *            
+	 */
+	public void setCellCount(int cellCount) {
+		mDocStatistic.setMetaCellCountAttribute(cellCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaCharacterCountAttribute</code> , See {@odf.attribute
+	 *  meta:character-count}.
+	 * 
+	 * @return the number of characters contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getCharacterCount() {
+		return mDocStatistic.getMetaCharacterCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaCharacterCountAttribute</code> , See {@odf.attribute
+	 *  meta:character-count}.
+	 * 
+	 * @param characterCount	the number of characters need to set
+	 */
+	public void setCharacterCount(Integer characterCount) {
+		mDocStatistic.setMetaCharacterCountAttribute(characterCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaDrawCountAttribute</code> , See {@odf.attribute
+	 *  meta:draw-count}.
+	 * 
+	 * @return the number of all the graphic related element in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getDrawCount() {
+		return mDocStatistic.getMetaDrawCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaDrawCountAttribute</code> , See {@odf.attribute
+	 *  meta:draw-count}.
+	 * 
+	 * @param drawCount	the number of all the graphic related element need to set
+	 */
+	public void setDrawCount(Integer drawCount) {
+		mDocStatistic.setMetaDrawCountAttribute(drawCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaFrameCountAttribute</code> , See {@odf.attribute
+	 *  meta:frame-count}.
+	 * 
+	 * @return the number of <code><draw:frame></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getFrameCount() {
+		return mDocStatistic.getMetaFrameCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaFrameCountAttribute</code> , See {@odf.attribute
+	 *  meta:frame-count}.
+	 * 
+	 * @param frameCount the number of <code><draw:frame></code> element need to set
+	 */
+	public void setFrameCount(Integer frameCount) {
+		mDocStatistic.setMetaFrameCountAttribute(frameCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaImageCountAttribute</code> , See {@odf.attribute
+	 *  meta:image-count}.
+	 * 
+	 * @return the number of <code><draw:image></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getImageCount() {
+		return mDocStatistic.getMetaImageCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaImageCountAttribute</code> , See {@odf.attribute
+	 *  meta:image-count}.
+	 * 
+	 * @param imageCount the number of <code><draw:image></code> element need to set
+	 */
+	public void setImageCount(Integer imageCount) {
+		mDocStatistic.setMetaImageCountAttribute(imageCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaNonWhitespaceCharacterCountAttribute</code> , See
+	 * {@odf.attribute meta:non-whitespace-character-count}.
+	 * 
+	 * @return the number of non-whitespace characters contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getNonWhitespaceCharacterCount() {
+		return mDocStatistic.getMetaNonWhitespaceCharacterCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaNonWhitespaceCharacterCountAttribute</code> , See
+	 * {@odf.attribute meta:non-whitespace-character-count}.
+	 * 
+	 * @param nonWhitespaceCharacterCount	the number of non-whitespace characters need to set
+	 */
+	public void setNonWhitespaceCharacterCount(
+			Integer nonWhitespaceCharacterCount) {
+		mDocStatistic
+				.setMetaNonWhitespaceCharacterCountAttribute(nonWhitespaceCharacterCount);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaObjectCountAttribute</code> , See {@odf.attribute
+	 *  meta:object-count}
+	 * 
+	 * @return the number of <code><draw:object></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getObjectCount() {
+		return mDocStatistic.getMetaObjectCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaObjectCountAttribute</code> , See {@odf.attribute
+	 *  meta:object-count}.
+	 * 
+	 * @param objectCount the number of <code><draw:object></code> element need to set
+	 */
+	public void setObjectCount(Integer objectCount) {
+		mDocStatistic.setMetaObjectCountAttribute(objectCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaOleObjectCountAttribute</code> , See {@odf.attribute
+	 *  meta:ole-object-count}.
+	 * 
+	 * @return the number of <code><draw:object-ole></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getOleObjectCount() {
+		return mDocStatistic.getMetaOleObjectCountAttribute();
+
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaOleObjectCountAttribute</code> , See {@odf.attribute
+	 *  meta:ole-object-count}.
+	 * 
+	 * @param oleObjectCount the number of <code><draw:object-ole></code> element need to set
+	 */
+	public void setOleObjectCount(Integer oleObjectCount) {
+		mDocStatistic.setMetaOleObjectCountAttribute(oleObjectCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaPageCountAttribute</code> , See {@odf.attribute
+	 *  meta:page-count}.
+	 * 
+	 * @return the number of page count contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getPageCount() {
+		return mDocStatistic.getMetaPageCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaPageCountAttribute</code> , See {@odf.attribute
+	 *  meta:page-count}.
+	 * 
+	 * @param pageCount the number of page count need to set
+	 */
+	public void setPageCount(Integer pageCount) {
+		mDocStatistic.setMetaPageCountAttribute(pageCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaParagraphCountAttribute</code> , See {@odf.attribute
+	 *  meta:paragraph-count}.
+	 * 
+	 * @return the number of <code><text:p></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getParagraphCount() {
+		return mDocStatistic.getMetaParagraphCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaParagraphCountAttribute</code> , See {@odf.attribute
+	 *  meta:paragraph-count}.
+	 * 
+	 * @param paragraphCount the number of <code><text:p></code> element need to set
+	 */
+	public void setParagraphCount(Integer paragraphCount) {
+		mDocStatistic.setMetaParagraphCountAttribute(paragraphCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaRowCountAttribute</code> , See {@odf.attribute
+	 * meta:row-count}.
+	 * 
+	 * @return the number of lines contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getRowCount() {
+		return mDocStatistic.getMetaRowCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaRowCountAttribute</code> , See {@odf.attribute
+	 * meta:row-count}.
+	 * 
+	 * @param rowCount the number of lines need to set
+	 */
+	public void setRowCount(Integer rowCount) {
+		mDocStatistic.setMetaRowCountAttribute(rowCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaSentenceCountAttribute</code> , See {@odf.attribute
+	 *  meta:sentence-count}.
+	 * 
+	 * @return the number of sentences contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSentenceCount() {
+		return mDocStatistic.getMetaSentenceCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaSentenceCountAttribute</code> , See {@odf.attribute
+	 *  meta:sentence-count}.
+	 * 
+	 * @param sentenceCount the number of sentences need to set
+	 */
+	public void setSentenceCount(Integer sentenceCount) {
+		mDocStatistic.setMetaSentenceCountAttribute(sentenceCount);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaSyllableCountAttribute</code> , See {@odf.attribute
+	 *  meta:syllable-count}.
+	 * 
+	 * @return the number of syllables contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getSyllableCount() {
+		return mDocStatistic.getMetaSyllableCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaSyllableCountAttribute</code> , See {@odf.attribute
+	 *  meta:syllable-count}.
+	 * 
+	 * @param syllableCount the number of syllables need to set
+	 */
+	public void setSyllableCount(Integer syllableCount) {
+		mDocStatistic.setMetaSyllableCountAttribute(syllableCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaTableCountAttribute</code> , See {@odf.attribute
+	 *  meta:table-count}.
+	 * 
+	 * @return the number of <code><table:table></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getTableCount() {
+		return mDocStatistic.getMetaTableCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaTableCountAttribute</code> , See {@odf.attribute
+	 *  meta:table-count}.
+	 * 
+	 * @param tableCount the number of <code><table:table></code> need to set
+	 */
+	public void setTableCount(Integer tableCount) {
+		mDocStatistic.setMetaTableCountAttribute(tableCount);
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation
+	 * <code>MetaWordCountAttribute</code> , See {@odf.attribute
+	 *  meta:word-count}.
+	 * 
+	 * @return the number of words contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 */
+	public Integer getWordCount() {
+		return mDocStatistic.getMetaWordCountAttribute();
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation
+	 * <code>MetaWordCountAttribute</code> , See {@odf.attribute
+	 *  meta:word-count}.
+	 * 
+	 * @param wordCount the number of words need to set
+	 */
+	public void setWordCount(Integer wordCount) {
+		mDocStatistic.setMetaWordCountAttribute(wordCount);
+
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaHyperlinkBehaviour.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaHyperlinkBehaviour.java
new file mode 100644
index 0000000..a542172
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaHyperlinkBehaviour.java
@@ -0,0 +1,57 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.meta;
+
+import org.odftoolkit.odfdom.dom.element.meta.MetaHyperlinkBehaviourElement;
+
+/**
+ * <code>OdfMetaHyperlinkBehaviour</code> feature specifies default behavior of
+ * hyperlinks in the current document.
+ * 
+ */
+// TODO: the functions are not completed.
+public class OdfMetaHyperlinkBehaviour {
+	private MetaHyperlinkBehaviourElement mMetaHyperlinkBehaviourElement;
+
+	/**
+	 * Constructor of <code>OdfMetaHyperlinkBehaviour</code> feature.
+	 * 
+	 * @param element
+	 *            an instance of ODF Element
+	 *            <code>MetaHyperlinkBehaviourElement</code>.
+	 */
+	public OdfMetaHyperlinkBehaviour(MetaHyperlinkBehaviourElement element) {
+		mMetaHyperlinkBehaviourElement = element;
+	}
+
+	/**
+	 * Return the instance of ODF Element
+	 * <code>MetaHyperlinkBehaviourElement</code>. which represents this feature.
+	 * 
+	 * @return the instance of ODF Element
+	 *         <code>MetaHyperlinkBehaviourElement</code>.
+	 */
+	public MetaHyperlinkBehaviourElement getMetaHyperlinkBehaviourElement() {
+		return mMetaHyperlinkBehaviourElement;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaTemplate.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaTemplate.java
new file mode 100644
index 0000000..4cdac01
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfMetaTemplate.java
@@ -0,0 +1,57 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.meta;
+
+import org.odftoolkit.odfdom.dom.element.meta.MetaTemplateElement;
+
+/**
+ * <code>OdfMetaTemplate</code> feature specified the URL for the document that
+ * was used to create a document.
+ * 
+ */
+
+// TODO: the functions are not completed.
+public class OdfMetaTemplate {
+
+	private MetaTemplateElement mMetaTemplateElement;
+
+	/**
+	 * Constructor of <code>OdfMetaTemplate</code> feature.
+	 * 
+	 * @param element
+	 *            an instance of ODF Element <code>MetaTemplateElement</code>
+	 */
+	public OdfMetaTemplate(MetaTemplateElement element) {
+		mMetaTemplateElement = element;
+	}
+
+	/**
+	 * Return the instance of ODF Element <code>MetaTemplateElement</code> which
+	 * represents this feature.
+	 * 
+	 * @return the instance of ODF Element <code>MetaTemplateElement</code>
+	 */
+	public MetaTemplateElement getMetaTemplateElement() {
+		return mMetaTemplateElement;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfOfficeMeta.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfOfficeMeta.java
new file mode 100644
index 0000000..d4365db
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/meta/OdfOfficeMeta.java
@@ -0,0 +1,1000 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.incubator.meta;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDescriptionElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcLanguageElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcSubjectElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcTitleElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaAutoReloadElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaCreationDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingCyclesElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingDurationElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaGeneratorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaHyperlinkBehaviourElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaInitialCreatorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintedByElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaTemplateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentMetaElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMetaElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.Duration;
+
+/**
+ * <code>OdfOfficeMeta</code> represent the meta data feature in the ODF document.
+ * <p>
+ * It provides convenient method to get meta data info.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.meta.Meta} in Simple API.
+ */
+public class OdfOfficeMeta {
+
+	private OfficeMetaElement mOfficeMetaElement;
+	private boolean mAutomaticUpdate = true;
+
+	/**
+	 * Constructor of <code>OdfOfficeMeta</code> feature.
+	 *
+	 * @param metaDom	the file DOM element of meta.xml
+	 */
+	public OdfOfficeMeta(OdfFileDom metaDom) {
+			OfficeDocumentMetaElement metaEle = OdfElement.findFirstChildNode(OfficeDocumentMetaElement.class, metaDom);
+			mOfficeMetaElement = OdfElement.findFirstChildNode(OfficeMetaElement.class, metaEle);
+	}
+
+	/**
+	 * Get the instance of <code>OfficeMetaElement</code> which represents this feature.
+	 * 
+	 * @return the instance of OfficeMetaElement
+	 */
+	public OfficeMetaElement getOfficeMetaElement() {
+		return mOfficeMetaElement;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaGeneratorElement</code> , See {@odf.element
+	 * meta:generator}.
+	 * 
+	 * @return the generator info of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getGenerator() {
+		MetaGeneratorElement metaGenerator = OdfElement.findFirstChildNode(
+				MetaGeneratorElement.class, mOfficeMetaElement);
+		if (metaGenerator != null) {
+			return metaGenerator.getTextContent();
+		}
+		return null;
+
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaGeneratorElement</code> , See {@odf.element
+	 * meta:generator}.
+	 * 
+	 * @param generator	set the specified document generator. NULL will remove the element from the meta.xml.
+	 */
+	public void setGenerator(String generator) {
+		MetaGeneratorElement metaGeneratorEle = OdfElement.findFirstChildNode(
+				MetaGeneratorElement.class, mOfficeMetaElement);
+		if (generator == null) {
+			if (metaGeneratorEle != null) {
+				mOfficeMetaElement.removeChild(metaGeneratorEle);
+			}
+		} else {
+			if (metaGeneratorEle == null) {
+				metaGeneratorEle = mOfficeMetaElement.newMetaGeneratorElement();
+			}
+			metaGeneratorEle.setTextContent(generator);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>DcTitleElement</code> , See {@odf.element dc:title}.
+	 * 
+	 * @return the title of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getTitle() {
+
+		DcTitleElement titleEle = OdfElement.findFirstChildNode(
+				DcTitleElement.class, mOfficeMetaElement);
+		if (titleEle != null) {
+			return titleEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>DcTitleElement</code> , See {@odf.element dc:title}.
+	 * 
+	 * @param title set the specified document title. NULL will remove the element from the meta.xml.
+	 */
+	public void setTitle(String title) {
+		DcTitleElement titleEle = OdfElement.findFirstChildNode(
+				DcTitleElement.class, mOfficeMetaElement);
+		if (title == null) {
+			if (titleEle != null) {
+				mOfficeMetaElement.removeChild(titleEle);
+			}
+		} else {
+			if (titleEle == null) {
+				titleEle = mOfficeMetaElement.newDcTitleElement();
+			}
+			titleEle.setTextContent(title);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>DcDescriptionElement</code> , See {@odf.element
+	 * dc:description}.
+	 * 
+	 * @return the description of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getDescription() {
+		DcDescriptionElement descEle = OdfElement.findFirstChildNode(
+				DcDescriptionElement.class, mOfficeMetaElement);
+		if (descEle != null) {
+			return descEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>DcDescriptionElement</code> , See {@odf.element
+	 * dc:description}.
+	 * 
+	 * @param description set the specified document description. NULL will remove the element from the meta.xml.
+	 */
+	public void setDescription(String description) {
+		DcDescriptionElement descEle = OdfElement.findFirstChildNode(
+				DcDescriptionElement.class, mOfficeMetaElement);
+		if (description == null) {
+			if (descEle != null) {
+				mOfficeMetaElement.removeChild(descEle);
+			}
+		} else {
+			if (descEle == null) {
+				descEle = mOfficeMetaElement.newDcDescriptionElement();
+			}
+			descEle.setTextContent(description);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>DcSubjectElement</code> , See {@odf.element
+	 * dc:subject}.
+	 * 
+	 * @return the subject of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getSubject() {
+		DcSubjectElement subjectEle = OdfElement.findFirstChildNode(
+				DcSubjectElement.class, mOfficeMetaElement);
+		if (subjectEle != null) {
+			return subjectEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>DcSubjectElement</code> , See {@odf.element
+	 * dc:subject}.
+	 * 
+	 * @param subject set the specified document subject. NULL will remove the element from the meta.xml.
+	 */
+	public void setSubject(String subject) {
+		DcSubjectElement subjectEle = OdfElement.findFirstChildNode(
+				DcSubjectElement.class, mOfficeMetaElement);
+		if (subject == null) {
+			if (subjectEle != null) {
+				mOfficeMetaElement.removeChild(subjectEle);
+			}
+		} else {
+			if (subjectEle == null) {
+				subjectEle = mOfficeMetaElement.newDcSubjectElement();
+			}
+			subjectEle.setTextContent(subject);
+		}
+	}
+
+	/**
+	 * Receives the list value of the ODFDOM element representation
+	 * <code>MetaKeywordElement</code> , See {@odf.element
+	 * meta:keyword}.
+	 * 
+	 * @return the keywords of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public List<String> getKeywords() {
+		List<String> keywords = new ArrayList<String>();
+		MetaKeywordElement keywordEle = OdfElement.findFirstChildNode(
+				MetaKeywordElement.class, mOfficeMetaElement);
+		if (keywordEle != null) {
+			keywords.add(keywordEle.getTextContent());
+			MetaKeywordElement keywordNext;
+			while ((keywordNext = OdfElement.findNextChildNode(
+					MetaKeywordElement.class, keywordEle)) != null) {
+				keywords.add(keywordNext.getTextContent());
+				keywordEle = keywordNext;
+			}
+			return keywords;
+		} else {
+			return null;
+		}
+
+	}
+
+	/**
+	 * Sets the list value of the ODFDOM element representation
+	 * <code>MetaKeywordElement</code> , See {@odf.element
+	 * meta:keyword}.
+	 * 
+	 * @param keyList set the specified list of keywords
+	 */
+	public void setKeywords(List<String> keyList) {
+		MetaKeywordElement keywordEle = OdfElement.findFirstChildNode(
+				MetaKeywordElement.class, mOfficeMetaElement);
+		List<MetaKeywordElement> toBeDeleted = new ArrayList<MetaKeywordElement>();
+		if (keywordEle != null) {
+			MetaKeywordElement keywordTmp;
+			toBeDeleted.add(keywordEle);
+			while ((keywordTmp = OdfElement.findNextChildNode(
+					MetaKeywordElement.class, keywordEle)) != null) {
+				keywordEle = keywordTmp;
+				toBeDeleted.add(keywordTmp);
+			}
+
+		}
+
+		// remove the original
+		for (MetaKeywordElement keyele : toBeDeleted) {
+			mOfficeMetaElement.removeChild(keyele);
+		}
+		// add new
+		for (int i = 0; i < keyList.size(); i++) {
+			MetaKeywordElement keywordElement = mOfficeMetaElement.newMetaKeywordElement();
+			keywordElement.setTextContent(keyList.get(i));
+		}
+
+	}
+
+	/**
+	 * Add the keyword to the current document.
+	 * Create child element {@odf.element meta:keyword}.
+	 * 
+	 * @param keyword	the value of child element {@odf.element
+	 *            meta:keyword}.
+	 */
+	public void addKeyword(String keyword) {
+		MetaKeywordElement keywordElement = mOfficeMetaElement.newMetaKeywordElement();
+		keywordElement.setTextContent(keyword);
+	}
+
+	/**
+	 * Receives the list value of the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> , See {@odf.element
+	 * meta:user-defined}.
+	 * 
+	 * @return get the list of user-defined metadata names;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public List<String> getUserDefinedDataNames() {
+		List<String> definedNames = new ArrayList<String>();
+		MetaUserDefinedElement definedEle = OdfElement.findFirstChildNode(
+				MetaUserDefinedElement.class, mOfficeMetaElement);
+		if (definedEle != null) {
+
+			definedNames.add(definedEle.getMetaNameAttribute());
+			MetaUserDefinedElement definedNext;
+			while ((definedNext = OdfElement.findNextChildNode(
+					MetaUserDefinedElement.class, definedEle)) != null) {
+
+				definedNames.add(definedNext.getMetaNameAttribute());
+
+				definedEle = definedNext;
+			}
+			return definedNames;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name, See {@odf.element
+	 *  meta:user-defined}.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @return	the <code>MetaUserDefinedElement</code> which is identified by the specified name;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public MetaUserDefinedElement getUserDefinedElementByAttributeName(
+			String name) {
+		MetaUserDefinedElement definedEle = OdfElement.findFirstChildNode(
+				MetaUserDefinedElement.class, mOfficeMetaElement);
+		if (definedEle != null) {
+			if (definedEle.getMetaNameAttribute().equals(name)) {
+				return definedEle;
+			}
+			MetaUserDefinedElement definedNext;
+			while ((definedNext = OdfElement.findNextChildNode(
+					MetaUserDefinedElement.class, definedEle)) != null) {
+
+				if (definedNext.getMetaNameAttribute().equals(name)) {
+					return definedNext;
+				}
+
+				definedEle = definedNext;
+			}
+			return null;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name, See {@odf.element
+	 *  meta:user-defined}.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @return the value of the user-defined metadata with the specified name;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getUserDefinedDataValue(String name) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			return definedElement.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Receives the data type of the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name, See {@odf.element
+	 *  meta:user-defined}.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @return the data type of the user-defined metadata with the specified name;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getUserDefinedDataType(String name) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			return definedElement.getMetaValueTypeAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Remove the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name, See {@odf.element
+	 *  meta:user-defined}.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 */
+	public void removeUserDefinedDataByName(String name) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			mOfficeMetaElement.removeChild(definedElement);
+		}
+
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name, See {@odf.element
+	 *  meta:user-defined}.
+	 * 
+	 * @param name	the name need to set for the user-defined metadata
+	 * @param value  the value need to set for the user-defined metadata
+	 */
+	public void setUserDefinedDataValue(String name, String value) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			definedElement.setTextContent(value);
+		}
+	}
+
+	/**
+	 * Sets the data type of the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name, See {@odf.element
+	 *  meta:user-defined}.
+	 * 
+	 * @param name	the name need to set for the user-defined metadata
+	 * @param value  the value need to set for the user-defined metadata
+	 */
+	public void setUserDefinedDataType(String name, String value) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			definedElement.setMetaValueTypeAttribute(value);
+		}
+
+	}
+
+	/**
+	 * Sets the ODFDOM element representation
+	 * <code>MetaUserDefinedElement</code> , See {@odf.element
+	 * meta:user-defined} if the element with the attribute name exists,then
+	 * update;or create a new element if type or value is null,the original will
+	 * not be updated.
+	 * 
+	 * @param name	the name need to set for the user-defined metadata
+	 * @param type	the data type need to set for the user-defined metadata
+	 * @param value	the value need to set for the user-defined metadata
+	 */
+	public void setUserDefinedData(String name, String type, String value) {
+		// test if name exists
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		// if exists, then update,if parameter is null, then don't change
+		if (definedElement != null) {
+			if (type != null) {
+				definedElement.setMetaValueTypeAttribute(type);
+			}
+			if (value != null) {
+				definedElement.setTextContent(value);
+			}
+		} else {
+			// if not exists, add
+			definedElement = mOfficeMetaElement.newMetaUserDefinedElement(name,
+					type);
+			definedElement.setTextContent(value);
+
+		}
+
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaInitialCreatorElement</code> , See {@odf.element
+	 * meta:initial-creator}.
+	 * 
+	 * @return get the initial creator of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getInitialCreator() {
+		MetaInitialCreatorElement iniCreatorEle = OdfElement.findFirstChildNode(MetaInitialCreatorElement.class,
+				mOfficeMetaElement);
+		if (iniCreatorEle != null) {
+			return iniCreatorEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaInitialCreatorElement</code> , See {@odf.element
+	 * meta:initial-creator}.
+	 * 
+	 * @param initialCreator set the specified initial creator. NULL will remove the element from the meta.xml.
+	 */
+	public void setInitialCreator(String initialCreator) {
+		MetaInitialCreatorElement initialCreatorEle = OdfElement.findFirstChildNode(MetaInitialCreatorElement.class,
+				mOfficeMetaElement);
+		if (initialCreator == null) {
+			if (initialCreatorEle != null) {
+				mOfficeMetaElement.removeChild(initialCreatorEle);
+			}
+		} else {
+			if (initialCreatorEle == null) {
+				initialCreatorEle = mOfficeMetaElement.newMetaInitialCreatorElement();
+			}
+			initialCreatorEle.setTextContent(initialCreator);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>DcCreatorElement</code> , See {@odf.element
+	 * dc:creator}
+	 * 
+	 * @return the creator of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getCreator() {
+		DcCreatorElement creatorEle = OdfElement.findFirstChildNode(
+				DcCreatorElement.class, mOfficeMetaElement);
+		if (creatorEle != null) {
+			return creatorEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>DcCreatorElement</code> , See {@odf.element
+	 * dc:creator}.
+	 * 
+	 * @param creator set the specified creator. NULL will remove the element from the meta.xml.
+	 */
+	public void setCreator(String creator) {
+		DcCreatorElement creatorEle = OdfElement.findFirstChildNode(
+				DcCreatorElement.class, mOfficeMetaElement);
+		if (creator == null) {
+			if (creatorEle != null) {
+				mOfficeMetaElement.removeChild(creatorEle);
+			}
+		} else {
+			if (creatorEle == null) {
+				creatorEle = mOfficeMetaElement.newDcCreatorElement();
+			}
+			creatorEle.setTextContent(creator);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaPrintedByElement</code> , See {@odf.element
+	 * meta:printed-by}
+	 * 
+	 * @return the name of the last person who printed the current document;
+	 * <p>
+	 * <code>null</code>, if element is not set
+	 */
+	public String getPrintedBy() {
+		MetaPrintedByElement printedByEle = OdfElement.findFirstChildNode(
+				MetaPrintedByElement.class, mOfficeMetaElement);
+		if (printedByEle != null) {
+			return printedByEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaPrintedByElement</code> , See {@odf.element
+	 * meta:printed-by}.
+	 * 
+	 * @param printedBy	the name need to set for the last person who printed the current document. NULL will remove the element from the meta.xml.
+	 */
+	public void setPrintedBy(String printedBy) {
+		MetaPrintedByElement printedByEle = OdfElement.findFirstChildNode(
+				MetaPrintedByElement.class, mOfficeMetaElement);
+		if (printedBy == null) {
+			if (printedByEle != null) {
+				mOfficeMetaElement.removeChild(printedByEle);
+			}
+		} else {
+			if (printedByEle == null) {
+				printedByEle = mOfficeMetaElement.newMetaPrintedByElement();
+			}
+			printedByEle.setTextContent(printedBy);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaCreationDateElement</code> , See {@odf.element
+	 * meta:creation-date}
+	 * 
+	 * @return the date and time when the document was created initially;
+	 * <p>
+	 * <code>null</code>, if element is not set
+	 */
+	public Calendar getCreationDate() {
+		MetaCreationDateElement creationDateEle = OdfElement.findFirstChildNode(MetaCreationDateElement.class,
+				mOfficeMetaElement);
+		if (creationDateEle != null) {
+			return stringToCalendar(creationDateEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaCreationDateElement</code> , See {@odf.element
+	 * meta:creation-date}.
+	 * 
+	 * @param creationDate	the date and time need to set. NULL will remove the element from the meta.xml.
+	 */
+	public void setCreationDate(Calendar creationDate) {
+		MetaCreationDateElement creationDateEle = OdfElement.findFirstChildNode(MetaCreationDateElement.class,
+				mOfficeMetaElement);
+		if (creationDate == null) {
+			if (creationDateEle != null) {
+				mOfficeMetaElement.removeChild(creationDateEle);
+			}
+		} else {
+			if (creationDateEle == null) {
+				creationDateEle = mOfficeMetaElement.newMetaCreationDateElement();
+			}
+			creationDateEle.setTextContent(calendarToString(creationDate));
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>DcDateElement</code> , See {@odf.element dc:date}.
+	 * 
+	 * @return the date and time when the document was last modified;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public Calendar getDate() {
+		DcDateElement dcDateEle = OdfElement.findFirstChildNode(
+				DcDateElement.class, mOfficeMetaElement);
+		if (dcDateEle != null) {
+			return stringToCalendar(dcDateEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>DcDateElement</code> , See {@odf.element dc:date}.
+	 * 
+	 * @param date	the date and time need to set. NULL will remove the element from the meta.xml.
+	 */
+	public void setDate(Calendar date) {
+		DcDateElement dcDateEle = OdfElement.findFirstChildNode(
+				DcDateElement.class, mOfficeMetaElement);
+		if (date == null) {
+			if (dcDateEle != null) {
+				mOfficeMetaElement.removeChild(dcDateEle);
+			}
+		} else {
+			if (dcDateEle == null) {
+				dcDateEle = mOfficeMetaElement.newDcDateElement();
+			}
+			dcDateEle.setTextContent(calendarToString(date));
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaPrintDateElement</code> , See {@odf.element
+	 * meta:print-date}.
+	 * 
+	 * @return the date and time when the document was last printed;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public Calendar getPrintDate() {
+		MetaPrintDateElement printDateEle = OdfElement.findFirstChildNode(
+				MetaPrintDateElement.class, mOfficeMetaElement);
+		if (printDateEle != null) {
+			return stringToCalendar(printDateEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaPrintDateElement</code> , See {@odf.element
+	 * meta:print-date}.
+	 * 
+	 * @param printDate	the date and time need to set. NULL will remove the element from the meta.xml.
+	 */
+	public void setPrintDate(Calendar printDate) {
+		MetaPrintDateElement printDateEle = OdfElement.findFirstChildNode(
+				MetaPrintDateElement.class, mOfficeMetaElement);
+		if (printDate == null) {
+			if (printDateEle != null) {
+				mOfficeMetaElement.removeChild(printDateEle);
+			}
+		} else {
+			if (printDateEle == null) {
+				printDateEle = mOfficeMetaElement.newMetaPrintDateElement();
+			}
+			printDateEle.setTextContent(calendarToString(printDate));
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>DcLanguageElement</code> , See {@odf.element
+	 * dc:language}.
+	 * 
+	 * @return the default language of the document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public String getLanguage() {
+		DcLanguageElement languageEle = OdfElement.findFirstChildNode(
+				DcLanguageElement.class, mOfficeMetaElement);
+		if (languageEle != null) {
+			return languageEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>DcLanguageElement</code> , See {@odf.element
+	 * dc:language}.
+	 * 
+	 * @param language the default language need to set fo the current document. NULL will remove the element from the meta.xml.
+	 */
+	public void setLanguage(String language) {
+		DcLanguageElement languageEle = OdfElement.findFirstChildNode(
+				DcLanguageElement.class, mOfficeMetaElement);
+		if (language == null) {
+			if (languageEle != null) {
+				mOfficeMetaElement.removeChild(languageEle);
+			}
+		} else {
+			if (languageEle == null) {
+				languageEle = mOfficeMetaElement.newDcLanguageElement();
+			}
+			languageEle.setTextContent(language);
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaEditingCyclesElement</code> , See {@odf.element
+	 * meta:editing-cycles}.
+	 * 
+	 * @return the number of times that the document has been edited;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public Integer getEditingCycles() {
+		MetaEditingCyclesElement editingCyclesEle = OdfElement.findFirstChildNode(MetaEditingCyclesElement.class,
+				mOfficeMetaElement);
+		if (editingCyclesEle != null) {
+			return Integer.valueOf(editingCyclesEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaEditingCyclesElement</code> , See {@odf.element
+	 * meta:editing-cycles}.
+	 * 
+	 * @param editingCycles	set the specified edit times. NULL will remove the element from the meta.xml.
+	 */
+	public void setEditingCycles(Integer editingCycles) {
+		MetaEditingCyclesElement editingCyclesEle = OdfElement.findFirstChildNode(MetaEditingCyclesElement.class,
+				mOfficeMetaElement);
+		if (editingCycles == null) {
+			if (editingCyclesEle != null) {
+				mOfficeMetaElement.removeChild(editingCyclesEle);
+			}
+		} else {
+			if (editingCyclesEle == null) {
+				editingCyclesEle = mOfficeMetaElement.newMetaEditingCyclesElement();
+			}
+			editingCyclesEle.setTextContent(String.valueOf(editingCycles));
+		}
+	}
+
+	/**
+	 * Receives the value of the ODFDOM element representation
+	 * <code>MetaEditingDurationElement</code> , See {@odf.element
+	 *  meta:editing-duration}.
+	 * 
+	 * @return the total time spent editing the document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 */
+	public Duration getEditingDuration() {
+		MetaEditingDurationElement editiingDurationEle = OdfElement.findFirstChildNode(MetaEditingDurationElement.class,
+				mOfficeMetaElement);
+		if (editiingDurationEle != null) {
+			return Duration.valueOf(editiingDurationEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the ODFDOM element representation
+	 * <code>MetaEditingDurationElement</code> , See {@odf.element
+	 *  meta:editing-duration}.
+	 * 
+	 * @param editingDuration the time need to set. NULL will remove the element from the meta.xml.
+	 */
+	public void setEditingDuration(Duration editingDuration) {
+		MetaEditingDurationElement editingDurationEle = OdfElement.findFirstChildNode(MetaEditingDurationElement.class,
+				mOfficeMetaElement);
+		if (editingDuration == null) {
+			if (editingDurationEle != null) {
+				mOfficeMetaElement.removeChild(editingDurationEle);
+			}
+		} else {
+			if (editingDurationEle == null) {
+				editingDurationEle = mOfficeMetaElement.newMetaEditingDurationElement();
+			}
+			editingDurationEle.setTextContent(editingDuration.toString());
+		}
+	}
+
+	/**
+	 * Receives the sub feature of OdfMetaDocumentStatistic.
+	 * 
+	 * @return the statistics about the document which can be represented by 
+	 * <code>OdfMetaDocumentStatistic</code> feature;
+	 * <p>
+	 * <code>null</code>, if the feature is not exist.
+	 */
+	public OdfMetaDocumentStatistic getDocumentStatistic() {
+		MetaDocumentStatisticElement element = getDocumentStatisticElement();
+		if (element != null) {
+			return new OdfMetaDocumentStatistic(element);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the OdfMetaHyperlinkBehaviour feature.
+	 * 
+	 * @return the default behavior of hyperlinks in the current document
+	 * which can be represented by <code>OdfMetaHyperlinkBehaviour</code> feature;
+	 * <p>
+	 * <code>null</code>, if the feature is not exist.
+	 */
+	public OdfMetaHyperlinkBehaviour getHyperlinkBehaviour() {
+		MetaHyperlinkBehaviourElement element = getHyperlinkBehaviourElement();
+		if (element != null) {
+			return new OdfMetaHyperlinkBehaviour(element);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the OdfMetaAutoReload feature.
+	 * 
+	 * @return the information whether the document is reloaded or replaced by another document
+	 * after a certain period of time has elapsed.
+	 * <p>
+	 * It can be represented by <code>OdfMetaAutoReload</code> feature;
+	 * <p>
+	 * <code>null</code>, if the feature is not exist.
+	 */
+	public OdfMetaAutoReload getAutoReload() {
+		MetaAutoReloadElement element = getAutoReloadElement();
+		if (element != null) {
+			return new OdfMetaAutoReload(element);
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the OdfMetaTemplate feature.
+	 * 
+	 * @return the information specified the URL for the document that was used to create a document.
+	 * <p>
+	 * It can be represented by <code>OdfMetaTemplate</code> feature;
+	 * <p>
+	 * <code>null</code>, if the feature is not exist.
+	 */
+	public OdfMetaTemplate getTemplate() {
+		MetaTemplateElement element = getTemplateElement();
+		if (element != null) {
+			return new OdfMetaTemplate(element);
+		} else {
+			return null;
+		}
+	}
+
+	private MetaDocumentStatisticElement getDocumentStatisticElement() {
+		return OdfElement.findFirstChildNode(
+				MetaDocumentStatisticElement.class, mOfficeMetaElement);
+	}
+
+	private MetaHyperlinkBehaviourElement getHyperlinkBehaviourElement() {
+		return OdfElement.findFirstChildNode(
+				MetaHyperlinkBehaviourElement.class, mOfficeMetaElement);
+	}
+
+	private MetaAutoReloadElement getAutoReloadElement() {
+		return OdfElement.findFirstChildNode(MetaAutoReloadElement.class,
+				mOfficeMetaElement);
+	}
+
+	private MetaTemplateElement getTemplateElement() {
+		return OdfElement.findFirstChildNode(MetaTemplateElement.class,
+				mOfficeMetaElement);
+	}
+
+	/**
+	 * Change valid string of calendar to Calendar type.
+	 * 
+	 * @param baseDate the string of a calender
+	 * @return the object of Calender
+	 */
+	private Calendar stringToCalendar(String baseDate) {
+		// Calendar calendar=new GregorianCalendar();
+		Calendar calendar = Calendar.getInstance();
+		Date d1 = null;
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+
+		try {
+			d1 = sdf.parse(baseDate);
+		} catch (Exception e) {
+			// invalid format or null value in meta.xml
+			// d1=new Date();
+		}
+
+		calendar.setTime(d1);
+		return calendar;
+	}
+
+	/**
+	 * Convert a <code>Canlender</code> object to <code>String</code> object.
+	 * @param calendar an instanceof <code>Canlender</code>
+	 * @return the String format(yyyy-MM-dd'T'HH:mm:ss) of Calendar.
+	 */
+	private String calendarToString(Calendar calendar) {
+		return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(calendar.getTime());
+	}
+
+	/**@param enableAutomaticUpdate If the automatic update of metadata is enabled, metadata such as last modified data is set during saving the document.
+	The default is <code>true</code>, disabling the default allows to load and save a document without changing any data.
+	 */
+	public void setAutomaticUpdate(boolean enableAutomaticUpdate) {
+		mAutomaticUpdate = enableAutomaticUpdate;
+	}
+
+	/**@return If the automatic update of metadata is enabled, metadata such as last modified data is set during saving the document.
+	The default is <code>true</code>, disabling the default allows to load and save a document without changing any data. */
+	public boolean hasAutomaticUpdate() {
+		return mAutomaticUpdate;
+	}
+
+	@Override
+	public String toString() {
+		if (mOfficeMetaElement != null) {
+			return mOfficeMetaElement.toString();
+		} else {
+			return null;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/InvalidNavigationException.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/InvalidNavigationException.java
new file mode 100644
index 0000000..51af2b3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/InvalidNavigationException.java
@@ -0,0 +1,43 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+/**
+ * Thrown to indicate that the navigation operation can not be processed on
+ * selections
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.navigation.InvalidNavigationException} in Simple API.
+ */
+public class InvalidNavigationException extends Exception {
+
+	private static final long serialVersionUID = -6139894252732076102L;
+
+	/**
+	 * Constructs a <code>InvalidNavigateOperation</code> with the specified
+	 * detail message.
+	 * 
+	 * @param msg
+	 *            the detail message.
+	 */
+	public InvalidNavigationException(String msg) {
+		super(msg);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/Navigation.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/Navigation.java
new file mode 100644
index 0000000..aa3588b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/Navigation.java
@@ -0,0 +1,147 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import org.w3c.dom.Node;
+
+/**
+ * Abstract class Navigation used to navigate the document
+ * and find the matched element by the user defined conditions
+ *
+ *@deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.navigation.Navigation} in Simple API.
+ */
+public abstract class Navigation {
+
+	/**
+	 * Return true if document still has more matched Selection
+	 * when traversing the document(In other words return true
+	 * if getNextMatchElement() would return an element instance
+	 * rather than return null)
+	 * @return true if document still has more matched Selection,
+	 * and vice versa
+	 *
+	 */
+	abstract public boolean hasNext();
+	//abstract public void gotoPrevious();
+
+	/**
+	 * get the current Selection result
+	 * @return the current Selection result
+	 */
+	abstract public Selection getCurrentItem();
+
+	/**
+	 * check if the element match the user defined condition
+	 * @param element	navigate this element
+	 * @return true if the element match the user defined condition;
+	 * 		   false if not match
+	 *
+	 */
+	abstract public boolean match(Node element);
+
+	/**
+	 * get the next matched element in a whole dom tree
+	 * @param startpoint	navigate from the startpoint
+	 * @return	the next matched element
+	 */
+	protected Node getNextMatchElement(Node startpoint) {
+		Node matchedNode = null;
+		matchedNode = traverseTree(startpoint);
+
+		Node currentpoint = startpoint;
+		while ((matchedNode == null) && (currentpoint != null)) {
+			Node sibling = currentpoint.getNextSibling();
+			if ((sibling != null) &&
+					(sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.ELEMENT_NODE) && (match(sibling))) {
+				matchedNode = sibling;
+			}
+			while ((sibling != null) && (matchedNode == null)) {
+				if ((sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.ELEMENT_NODE)) {
+					matchedNode = traverseTree(sibling);
+				}
+				sibling = sibling.getNextSibling();
+				if (sibling != null && match(sibling)) {
+					matchedNode = sibling;
+				}
+			}
+			currentpoint = currentpoint.getParentNode();
+		}
+
+		return matchedNode;
+	}
+
+	/**
+	 * get the next matched element in a sub tree
+	 * @param startpoint	navigate from the startpoint
+	 * @param root			the root of the sub tree
+	 * @return	the next matched element
+	 */
+	protected Node getNextMatchElementInTree(Node startpoint, Node root) {
+		Node matchedNode = null;
+		matchedNode = traverseTree(startpoint);
+
+		Node currentpoint = startpoint;
+		while ((matchedNode == null) && (currentpoint != root)) {
+			Node sibling = currentpoint.getNextSibling();
+			if ((sibling != null) &&
+					(sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.ELEMENT_NODE) && (match(sibling))) {
+				matchedNode = sibling;
+			}
+			while ((sibling != null) && (matchedNode == null)) {
+				if ((sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.ELEMENT_NODE)) {
+					matchedNode = traverseTree(sibling);
+				}
+				sibling = sibling.getNextSibling();
+				if (sibling != null && match(sibling)) {
+					matchedNode = sibling;
+				}
+			}
+			currentpoint = currentpoint.getParentNode();
+		}
+
+		return matchedNode;
+	}
+
+	private Node traverseTree(Node root) {
+		Node matchedNode = null;
+		if (root == null) {
+			return null;
+		}
+		//if (match(root)) return root;
+
+		Node node = root.getFirstChild();
+		while (node != null) {
+			if ((node.getNodeType() == Node.TEXT_NODE || node.getNodeType() == Node.ELEMENT_NODE)) {
+				if (match(node) == true) {
+					matchedNode = node;
+					break;
+				} else {
+					matchedNode = traverseTree(node);
+					if (matchedNode != null) {
+						break;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+		return matchedNode;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/Selection.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/Selection.java
new file mode 100644
index 0000000..48a7cc5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/Selection.java
@@ -0,0 +1,225 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.util.Hashtable;
+import java.util.Vector;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+/**
+ * Abstract class Selection describe one of the matched results The selection
+ * can be recognized by the container mElement, the start mIndex of the text
+ * content of this mElement and the text content.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.navigation.Selection} in Simple API.
+ */
+public abstract class Selection {
+
+	private OdfElement mElement;
+	private int mIndex;
+
+	/**
+	 * get the container mElement of this selection
+	 * @return the container mElement
+	 */
+	public OdfElement getElement() {
+		return mElement;
+	}
+
+	/**
+	 * get the start mIndex of the text content of the container mElement
+	 * this is only meaningful for TextSelection. other type Selection 
+	 * will return 0.
+	 * @return the start mIndex of the container mElement
+	 */
+	public int getIndex() {
+		return mIndex;
+	}
+
+	/**
+	 * cut the current selection
+	 * @throws InvalidNavigationException 
+	 */
+	abstract public void cut() throws InvalidNavigationException;
+
+	/**
+	 * paste the current selection at front of the specified position selection
+	 * @param positionitem	the position selection
+	 * @throws InvalidNavigationException 
+	 */
+	abstract public void pasteAtFrontOf(Selection positionitem) throws InvalidNavigationException;
+
+	/**
+	 * paste the current selection at end of the specified position selection
+	 * @param positionitem	the position selection
+	 * @throws InvalidNavigationException 
+	 */
+	abstract public void pasteAtEndOf(Selection positionitem) throws InvalidNavigationException;
+
+	/**
+	 * when a selected item has been delete, the selections after this deleted selection should be refresh
+	 * because these selections mIndex will be changed
+	 * @param deleteditem	the deleted selection
+	 */
+	abstract protected void refreshAfterFrontalDelete(Selection deleteditem);
+
+	/**
+	 * when a selected item has been inserted, the selection after the inserted item should be refresh
+	 * because these selections mIndex will be changed
+	 * @param inserteditem	the inserted selection
+	 */
+	abstract protected void refreshAfterFrontalInsert(Selection inserteditem);
+
+	/**
+	 * A quick method to update the mIndex of this selection
+	 * @param offset	the offset that the mIndex should be added
+	 */
+	abstract protected void refresh(int offset);
+
+	/**
+	 * SelectionManager can manage all the selections that are returned to end users.
+	 * This SelectionManager contains a repository of all selections, and will refresh the status/mIndex
+	 * of selections after certain operation.
+	 */
+	static class SelectionManager {
+
+		static private Hashtable<OdfElement, Vector<Selection>> repository = new Hashtable<OdfElement, Vector<Selection>>();
+
+		/**
+		 * Register the selection item
+		 * @param item	the selection item
+		 */
+		static public void registerItem(Selection item) {
+			OdfElement element = item.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				int i = 0;
+				while (i < selections.size()) {
+					if (selections.get(i).getIndex() > item.getIndex()) {
+						selections.insertElementAt(item, i);
+						break;
+					}
+					i++;
+				}
+				if (i == selections.size()) {
+					selections.add(item);
+				}
+			} else {
+				Vector<Selection> al = new Vector<Selection>();
+				al.add(item);
+				repository.put(element, al);
+			}
+		}
+
+		/**
+		 * Refresh the selections in repository after a item is cut.
+		 * @param cutItem	the cut item
+		 */
+		synchronized static public void refreshAfterCut(Selection cutItem) {
+			//travase the whole sub tree
+			OdfElement element = cutItem.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() > cutItem.getIndex()) {
+						selections.get(i).refreshAfterFrontalDelete(cutItem);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Refresh the selections in repository after a pastedAtFrontOf operation is called.
+		 * @param item	the pasted item
+		 * @param positionItem	the position item
+		 */
+		synchronized static public void refreshAfterPasteAtFrontOf(Selection item, Selection positionItem) {
+			//travase the whole sub tree
+			OdfElement element = positionItem.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() >= positionItem.getIndex()) {
+						selections.get(i).refreshAfterFrontalInsert(item);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Refresh the selections in repository after a pastedAtEndOf operation is called.
+		 * @param item	the pasted item
+		 * @param positionItem	the position item
+		 */
+		synchronized static public void refreshAfterPasteAtEndOf(Selection item, Selection positionItem) {
+			OdfElement element = positionItem.getElement();
+			int positionIndex;
+
+			if (positionItem instanceof TextSelection) {
+				positionIndex = positionItem.getIndex() + ((TextSelection) positionItem).getText().length();
+			} else {
+				positionIndex = positionItem.getIndex();
+			}
+
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() >= positionIndex) {
+						selections.get(i).refreshAfterFrontalInsert(item);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Remove the selection from repository.
+		 * @param item	selection item
+		 */
+		static public void unregisterItem(Selection item) {
+			OdfElement element = item.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				selections.remove(item);
+			}
+		}
+
+		/**
+		 * A direct method to update all the selections contained in a mElement after a certain position.
+		 * @param containerElement	the container mElement
+		 * @param offset	the offset
+		 * @param positionIndex	the mIndex of a certain position
+		 */
+		synchronized static public void refresh(OdfElement containerElement, int offset, int positionIndex) {
+			if (repository.containsKey(containerElement)) {
+				Vector<Selection> selections = repository.get(containerElement);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() >= positionIndex) {
+						selections.get(i).refresh(offset);
+					}
+				}
+			}
+		}
+
+		private SelectionManager() {
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextNavigation.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextNavigation.java
new file mode 100644
index 0000000..bf96bc8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextNavigation.java
@@ -0,0 +1,222 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfWhitespaceProcessor;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A derived Navigation class used for navigate the text content
+ * it is used to search the document and find the matched text 
+ * and would return TextSelection instance
+ *
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.navigation.TextNavigation} in Simple API.
+ */
+public class TextNavigation extends Navigation {
+
+	private String mMatchedElementName = "text:p,text:h";
+	private String mPatternText;
+	private OdfTextDocument mTextDocument;
+	private TextSelection mCurrentSelectedItem;
+	private String mCurrentText;
+	private int mCurrentIndex;
+	private boolean mbFinishFindInHeaderFooter;
+
+	/**
+	 * Construct TextNavigation with matched condition and navigation scope
+	 * @param pattern	the matched pattern String
+	 * @param doc	the navigation scope
+	 */
+	public TextNavigation(String pattern, OdfTextDocument doc) {
+		this.mPatternText = pattern;
+		mTextDocument = doc;
+		mCurrentSelectedItem = null;
+		mbFinishFindInHeaderFooter = false;
+	}
+
+	//the matched text might exist in header/footer
+	private TextSelection findInHeaderFooter(TextSelection selected) {
+		OdfFileDom styledom = null;
+		OdfOfficeMasterStyles masterpage = null;
+		OdfElement element = null;
+
+		if (selected != null) {
+			OdfElement containerElement = selected.getContainerElement();
+			int index = selected.getIndex();
+			OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+			String content = textProcessor.getText(containerElement);
+
+			int nextIndex = -1;
+			Pattern pattern = Pattern.compile(mPatternText);
+			Matcher matcher = pattern.matcher(content);
+			//start from the end index of the selected item
+			if (matcher.find(index + selected.getText().length())) {
+				// here just consider \n\r\t occupy one char
+				nextIndex = matcher.start();
+				int eIndex = matcher.end();
+				mCurrentText = content.substring(nextIndex, eIndex);
+			}
+			if (nextIndex != -1) {
+				TextSelection item = new TextSelection(mCurrentText, selected.getContainerElement(), nextIndex);
+				return item;
+			}
+		}
+		try {
+			styledom = mTextDocument.getStylesDom();
+			NodeList list = styledom.getElementsByTagName("office:master-styles");
+			if (styledom == null) {
+				return null;
+			}
+			if (list.getLength() > 0) {
+				masterpage = (OdfOfficeMasterStyles) list.item(0);
+			} else {
+				return null;
+			}
+
+			if (selected == null) {
+				element = (OdfElement) getNextMatchElementInTree(masterpage, masterpage);
+			} else {
+				element = (OdfElement) getNextMatchElementInTree(selected.getContainerElement(), masterpage);
+			}
+
+			if (element != null) {
+				TextSelection item = new TextSelection(mCurrentText, element, mCurrentIndex);
+				return item;
+			} else {
+				return null;
+			}
+
+		} catch (Exception ex) {
+			Logger.getLogger(TextNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		return null;
+	}
+
+	//found the next selection start from the 'selected' TextSelection
+	private TextSelection findnext(TextSelection selected) {
+		if (!mbFinishFindInHeaderFooter) {
+			TextSelection styleselected = findInHeaderFooter(selected);
+			if (styleselected != null) {
+				return styleselected;
+			}
+			selected = null;
+			mbFinishFindInHeaderFooter = true;
+		}
+
+		if (selected == null) {
+			OdfElement element = null;
+			try {
+				element = (OdfElement) getNextMatchElement((Node) mTextDocument.getContentRoot());
+			} catch (Exception ex) {
+				Logger.getLogger(TextNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+
+			}
+			if (element != null) {
+				return new TextSelection(mCurrentText, element, mCurrentIndex);
+			} else {
+				return null;
+			}
+		}
+
+		OdfElement containerElement = selected.getContainerElement();
+		int index = selected.getIndex();
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+		String content = textProcessor.getText(containerElement);
+
+		int nextIndex = -1;
+		Pattern pattern = Pattern.compile(mPatternText);
+		Matcher matcher = pattern.matcher(content);
+		//start from the end index of the selected item
+		if (matcher.find(index + selected.getText().length())) {
+			// here just consider \n\r\t occupy one char
+			nextIndex = matcher.start();
+			int eIndex = matcher.end();
+			mCurrentText = content.substring(nextIndex, eIndex);
+		}
+		if (nextIndex != -1) {
+			TextSelection item = new TextSelection(mCurrentText, selected.getContainerElement(), nextIndex);
+			return item;
+		} else {
+			OdfElement element = (OdfElement) getNextMatchElement((Node) containerElement);
+			if (element != null) {
+				TextSelection item = new TextSelection(mCurrentText, element, mCurrentIndex);
+				return item;
+			} else {
+				return null;
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.incubator.search.Navigation#getCurrentItem()
+	 */
+	@Override
+	public Selection getCurrentItem() {
+		Selection.SelectionManager.registerItem(mCurrentSelectedItem);
+		return mCurrentSelectedItem;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.odfdom.incubator.search.Navigation#hasNext()
+	 */
+	@Override
+	public boolean hasNext() {
+		mCurrentSelectedItem = findnext(mCurrentSelectedItem);
+		return (mCurrentSelectedItem != null);
+	}
+
+	/**
+	 * check if the text content of element match the specified pattern string
+	 * @param element	navigate this element
+	 * @return true if the text content of this element match this pattern; 
+	 * 		   false if not match
+	 */
+	@Override
+	public boolean match(Node element) {
+		if (element instanceof OdfElement) {
+			if (mMatchedElementName.indexOf(element.getNodeName()) != -1) {
+				OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+				String content = textProcessor.getText(element);
+
+				Pattern pattern = Pattern.compile(mPatternText);
+				Matcher matcher = pattern.matcher(content);
+				while (matcher.find()) {
+					// here just consider \n\r\t occupy one char
+					mCurrentIndex = matcher.start();
+					int eIndex = matcher.end();
+					mCurrentText = content.substring(mCurrentIndex, eIndex);
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextSelection.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextSelection.java
new file mode 100644
index 0000000..217c160
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextSelection.java
@@ -0,0 +1,883 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.net.URL;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfWhitespaceProcessor;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * A TextSelection can describe a sub element in a mParagraph element or a mHeading element.
+ * it is recognized by the container element(which type should be OdfTextParagraph or
+ *  OdfTextHeadingt), the start index of the text content of the container element and 
+ *  the text content of this selection.
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.navigation.TextSelection} in Simple API.
+ */
+public class TextSelection extends Selection {
+
+	private String mMatchedText;
+	private OdfTextParagraph mParagraph;
+	private OdfTextHeading mHeading;
+	private int mIndexInContainer;
+	private boolean mIsInserted;
+
+	/**
+	 * Constructor of TextSelection
+	 * @param text				the text content of this TextSelection
+	 * @param containerElement	the mParagraph element or mHeading element that contain this TextSelection
+	 * @param index				the start index of the text content of the container element
+	 * 
+	 */
+	TextSelection(String text, OdfElement containerElement, int index) {
+		mMatchedText = text;
+		if (containerElement instanceof OdfTextParagraph) {
+			mParagraph = (OdfTextParagraph) containerElement;
+		} else if (containerElement instanceof OdfTextHeading) {
+			mHeading = (OdfTextHeading) containerElement;
+		}
+		mIndexInContainer = index;
+	}
+
+	/**
+	 * Get the mParagraph element or mHeading element that contain this TextSelection
+	 * @return OdfElement	the container element
+	 */
+	@Override
+	public OdfElement getElement() {
+		return getContainerElement();
+	}
+
+	/**
+	 * Get the mParagraph element or mHeading element that contain this text
+	 * @return OdfElement
+	 */
+	public OdfElement getContainerElement() {
+		if (mParagraph != null) {
+			return mParagraph;
+		} else {
+			return mHeading;
+		}
+	}
+
+	/**
+	 * Get the start index of the text content of its container element
+	 * @return index	the start index of the text content of its container element
+	 */
+	@Override
+	public int getIndex() {
+		return mIndexInContainer;
+	}
+
+	/**
+	 * Get the text content of this TextSelection 
+	 * @return text	the text content
+	 */
+	public String getText() {
+		return mMatchedText;
+	}
+
+	/*
+	 * Validate if the selection is still available.
+	 * @return true	if the selection is available; false if the selection is not available.
+	 */
+	private boolean validate() {
+		if (getContainerElement() == null) {
+			return false;
+		}
+		OdfElement container = getContainerElement();
+		if (container == null) {
+			return false;
+		}
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+		String content = textProcessor.getText(container);
+		if (content.indexOf(mMatchedText, mIndexInContainer) == mIndexInContainer) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Delete the selection from the document
+	 * the other matched selection in the same container element will be updated automatically
+	 * because the start index of the following selections will be changed when the previous 
+	 * selection has been deleted 
+	 * @throws InvalidNavigationException if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement container = getContainerElement();
+		delete(mIndexInContainer, mMatchedText.length(), container);
+		SelectionManager.refreshAfterCut(this);
+		mMatchedText = "";
+	}
+
+	/**
+	 * Apply a style to the selection so that the text style of this selection 
+	 * will append the specified style
+	 * @param style	the style can be from the current document or user defined
+	 * @throws InvalidNavigationException if the selection is unavailable.
+	 */
+	public void applyStyle(OdfStyleBase style) throws InvalidNavigationException {
+		//append the specified style to the selection
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement parentElement = getContainerElement();
+
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+
+		appendStyle(index, leftLength, parentElement, style);
+
+	}
+
+	/*
+	 * append specified style for a range text of pNode
+	 * from 'fromindex' and cover 'leftLength'
+	 */
+	private void appendStyle(int fromindex, int leftLength, Node pNode, OdfStyleBase style) {
+		if ((fromindex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+
+		while (node != null) {
+			if ((fromindex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node.getLocalName().equals("s")) // text:s
+				{
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = textProcessor.getText((OdfElement) node).length();
+				}
+
+			}
+			if (nodeLength <= fromindex) {
+				fromindex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					node.setNodeValue(value.substring(0, fromindex));
+					int endLength = fromindex + leftLength;
+					int nextLength = value.length() - endLength;
+
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					// init text:a
+					OdfTextSpan textSpan = new OdfTextSpan(
+							(OdfFileDom) node.getOwnerDocument());
+					Node newNode = null;
+					if (nextLength >= 0) {
+						textSpan.setTextContent(value.substring(fromindex,
+								endLength));
+						newNode = node.cloneNode(true);
+						newNode.setNodeValue(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						textSpan.setTextContent(value.substring(fromindex,
+								value.length()));
+						leftLength = endLength - value.length();
+					}
+					textSpan.setProperties(style.getStyleProperties());
+
+					if (nextNode != null) {
+						parNode.insertBefore(textSpan, nextNode);
+						if (newNode != null) {
+							parNode.insertBefore(newNode, nextNode);
+						}
+					} else {
+						parNode.appendChild(textSpan);
+						if (newNode != null) {
+							parNode.appendChild(newNode);
+						}
+					}
+					fromindex = 0;
+					if (nextNode != null) {
+						node = nextNode;
+					} else {
+						node = textSpan;
+					}
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					if (node.getLocalName().equals("s")) // text:s
+					{
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(
+								nodeLength - fromindex));
+						leftLength = leftLength - (nodeLength - fromindex);
+						fromindex = 0;
+
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromindex = 0;
+						leftLength--;
+					} else {
+						appendStyle(fromindex, leftLength, node, style);
+						int length = (fromindex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromindex = 0;
+					}
+
+				}
+
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/**
+	 * Replace the text content of selection with a new string
+	 * 
+	 * @param newText	the replace text String
+	 * @throws InvalidNavigationException if the selection is unavailable.
+	 */
+	public void replaceWith(String newText) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+
+		OdfElement parentElement = getContainerElement();
+
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+		delete(index, leftLength, parentElement);
+		OdfTextSpan textSpan = new OdfTextSpan((OdfFileDom) parentElement.getOwnerDocument());
+		textSpan.addContentWhitespace(newText);
+		/*if (startElement instanceof OdfStyleBase)
+		textSpan.setProperties(((OdfStyleBase) startElement)
+		.getStyleProperties());*/
+		mIsInserted = false;
+		insertSpan(textSpan, index, parentElement);
+		// optimize the parent element
+		optimize(parentElement);
+		int offset = newText.length() - leftLength;
+		SelectionManager.refresh(this.getContainerElement(), offset, index + getText().length());
+		mMatchedText = newText;
+	}
+
+	/**
+	 * Paste this selection just before a specific selection.
+	 * @param positionItem	a selection that is used to point out the position
+	 * @throws InvalidNavigationException if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		int indexOfNew = 0;
+		OdfElement newElement = positionItem.getElement();
+		if (positionItem instanceof TextSelection) {
+			indexOfNew = ((TextSelection) positionItem).getIndex();
+			newElement = ((TextSelection) positionItem).getContainerElement();
+		}
+
+		OdfTextSpan textSpan = getSpan((OdfFileDom) positionItem.getElement().getOwnerDocument());
+		mIsInserted = false;
+		insertSpan(textSpan, indexOfNew, newElement);
+		adjustStyle(newElement, textSpan, null);
+		SelectionManager.refreshAfterPasteAtFrontOf(this, positionItem);
+	}
+
+	/**
+	 * Paste this selection just after a specific selection.
+	 * @param positionItem	a selection that is used to point out the position
+	 * @throws InvalidNavigationException if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		int indexOfNew = 0;//TODO: think about and test if searchitem is a element selection
+		OdfElement newElement = positionItem.getElement();
+		if (positionItem instanceof TextSelection) {
+			indexOfNew = ((TextSelection) positionItem).getIndex() + ((TextSelection) positionItem).getText().length();
+			newElement = ((TextSelection) positionItem).getContainerElement();
+		}
+
+		OdfTextSpan textSpan = getSpan((OdfFileDom) positionItem.getElement().getOwnerDocument());
+
+		mIsInserted = false;
+		insertSpan(textSpan, indexOfNew, newElement);
+		adjustStyle(newElement, textSpan, null);
+		SelectionManager.refreshAfterPasteAtEndOf(this, positionItem);
+	}
+
+	/**
+	 * Add a hypertext reference to the selection
+	 * 
+	 * @param url	the url of the hypertext reference
+	 * @throws InvalidNavigationException if the selection is unavailable.
+	 */
+	public void addHref(URL url) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement parentElement = getContainerElement();
+
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+
+		addHref(index, leftLength, parentElement, url.toString());
+	}
+
+	/*
+	 * add href for a range text of pNode from the 'fromindex' text, and the href will cover
+	 * 'leftLength' text
+	 * 
+	 */
+	private void addHref(int fromindex, int leftLength, Node pNode, String href) {
+		if ((fromindex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+
+		while (node != null) {
+			if ((fromindex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node.getLocalName().equals("s")) // text:s
+				{
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = textProcessor.getText((OdfElement) node).length();
+				}
+
+			}
+			if (nodeLength <= fromindex) {
+				fromindex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					node.setNodeValue(value.substring(0, fromindex));
+					int endLength = fromindex + leftLength;
+					int nextLength = value.length() - endLength;
+
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					// init text:a
+					TextAElement textLink = new TextAElement(
+							(OdfFileDom) node.getOwnerDocument());
+					Node newNode = null;
+					if (nextLength >= 0) {
+						textLink.setTextContent(value.substring(fromindex,
+								endLength));
+						newNode = node.cloneNode(true);
+						newNode.setNodeValue(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						textLink.setTextContent(value.substring(fromindex,
+								value.length()));
+						leftLength = endLength - value.length();
+					}
+					textLink.setXlinkTypeAttribute("simple");
+					textLink.setXlinkHrefAttribute(href);
+
+					if (nextNode != null) {
+						parNode.insertBefore(textLink, nextNode);
+						if (newNode != null) {
+							parNode.insertBefore(newNode, nextNode);
+						}
+					} else {
+						parNode.appendChild(textLink);
+						if (newNode != null) {
+							parNode.appendChild(newNode);
+						}
+					}
+					fromindex = 0;
+					if (nextNode != null) {
+						node = nextNode;
+					} else {
+						node = textLink;
+					}
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					if (node.getLocalName().equals("s")) // text:s
+					{
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(
+								nodeLength - fromindex));
+						leftLength = leftLength - (nodeLength - fromindex);
+						fromindex = 0;
+
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromindex = 0;
+						leftLength--;
+					} else {
+						addHref(fromindex, leftLength, node, href);
+						int length = (fromindex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromindex = 0;
+					}
+
+				}
+
+			}
+			node = node.getNextSibling();
+		}
+	}
+	/*
+	 * delete the pNode from the fromindex text, and delete leftLength text
+	 */
+
+	private void delete(int fromindex, int leftLength, Node pNode) {
+		if ((fromindex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+
+		while (node != null) {
+			if ((fromindex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node.getLocalName().equals("s")) // text:s
+				{
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = textProcessor.getText((OdfElement) node).length();
+				}
+
+			}
+			if (nodeLength <= fromindex) {
+				fromindex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromindex));
+					int endLength = fromindex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromindex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					if (node.getLocalName().equals("s")) // text:s
+					{
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(
+								nodeLength - fromindex));
+						leftLength = leftLength - (nodeLength - fromindex);
+						fromindex = 0;
+
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromindex = 0;
+						leftLength--;
+					} else {
+						delete(fromindex, leftLength, node);
+						int length = (fromindex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromindex = 0;
+					}
+
+				}
+
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	@Override
+	protected void refreshAfterFrontalDelete(Selection deleteItem) {
+		if (deleteItem instanceof TextSelection) {
+			mIndexInContainer -= ((TextSelection) deleteItem).getText().length();
+		}
+	}
+
+	@Override
+	protected void refreshAfterFrontalInsert(Selection pasteItem) {
+		if (pasteItem instanceof TextSelection) {
+			mIndexInContainer += ((TextSelection) pasteItem).getText().length();
+		}
+	}
+
+	@Override
+	protected void refresh(int offset) {
+		mIndexInContainer += offset;
+	}
+
+	/**
+	 * return a String Object representing this selection value
+	 * the text content of the selection, start index in the container element and the
+	 * text content of the container element will be provided
+	 * @return a String representation of the value of this TextSelection
+	 */
+	@Override
+	public String toString() {
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+
+		return "[" + mMatchedText + "] started from " + mIndexInContainer + " in paragraph:" + textProcessor.getText(getContainerElement());
+	}
+
+	// return a new span that cover this selection
+	// and keep the original style of this selection
+	private OdfTextSpan getSpan(OdfFileDom ownerDoc) {
+		OdfElement parentElement = getContainerElement();
+
+		if (parentElement != null) {
+			Node copyParentNode = parentElement.cloneNode(true);
+			if (ownerDoc != parentElement.getOwnerDocument()) {
+				copyParentNode = ownerDoc.adoptNode(copyParentNode);
+			}
+			OdfTextSpan textSpan = new OdfTextSpan(ownerDoc);
+			int sIndex = mIndexInContainer;
+			int eIndex = sIndex + mMatchedText.length();
+			// delete the content except the selection string
+			// delete from the end to start, so that the postion will not be
+			// impact by delete action
+			OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+			delete(eIndex, textProcessor.getText(copyParentNode).length() - eIndex, copyParentNode);
+			delete(0, sIndex, copyParentNode);
+			optimize(copyParentNode);
+			Node childNode = copyParentNode.getFirstChild();
+			while (childNode != null) {
+				textSpan.appendChild(childNode.cloneNode(true));
+				childNode = childNode.getNextSibling();
+			}
+			// apply text style for the textSpan
+			if (copyParentNode instanceof OdfStylableElement) {
+				applyTextStyleProperties(getTextStylePropertiesDeep((OdfStylableElement) copyParentNode),
+						textSpan);
+			}
+			return textSpan;
+		}
+		return null;
+	}
+
+	/*
+	 * optimize the text element by deleting the empty text node
+	 * 
+	 * @param element
+	 */
+	private void optimize(Node pNode) {
+		// check if the text:a can be optimized
+		OdfWhitespaceProcessor textProcess = new OdfWhitespaceProcessor();
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			Node nextNode = node.getNextSibling();
+			//if ((node.getNodeType() == Node.ELEMENT_NODE) && (node.getPrefix().equals("text"))) {
+			if (node instanceof OdfTextSpan) {
+				if (textProcess.getText(node).length() == 0) {
+					node.getParentNode().removeChild(node);
+				} else {
+					optimize(node);
+				}
+			}
+			node = nextNode;
+		}
+	}
+	
+	/*
+	 * apply the styleMap to the toElement
+	 * reserve the style property of toElement if it is also exist in styleMap
+	 */
+
+	private void applyTextStyleProperties(Map<OdfStyleProperty, String> styleMap,
+			OdfStylableElement toElement) {
+		if (styleMap != null) {
+			//preserve the style property of toElement if it is also exist in styleMap
+			OdfStyle resultStyleElement = toElement.getAutomaticStyles().newStyle(
+					OdfStyleFamily.Text);
+
+			for (Map.Entry<OdfStyleProperty, String> entry : styleMap.entrySet()) {
+				if (toElement.hasProperty(entry.getKey())) {
+					resultStyleElement.setProperty(entry.getKey(), toElement.getProperty(entry.getKey()));
+				} else {
+					resultStyleElement.setProperty(entry.getKey(), entry.getValue());
+				}
+			}
+			toElement.setStyleName(resultStyleElement.getStyleNameAttribute());
+		}
+	}
+
+	/*
+	 * insert textSpan into the from index of pNode
+	 */
+	private void insertSpan(OdfTextSpan textSpan, int fromindex, Node pNode) {
+		if (fromindex < 0) {
+			fromindex = 0;
+		}
+		if (fromindex == 0 && mIsInserted) {
+			return;
+		}
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if (fromindex <= 0 && mIsInserted) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+				if ((fromindex != 0) && (nodeLength < fromindex)) {
+					fromindex -= nodeLength;
+				} else {
+					// insert result after node, and insert an new text node
+					// after
+					// the result node
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromindex));
+					// insert the text span in appropriate position
+					node.setNodeValue(buffer.toString());
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+
+					Node newNode = node.cloneNode(true);
+					newNode.setNodeValue(value.substring(fromindex, value.length()));
+					if (nextNode != null) {
+						parNode.insertBefore(textSpan, nextNode);
+						parNode.insertBefore(newNode, nextNode);
+					} else {
+						parNode.appendChild(textSpan);
+						parNode.appendChild(newNode);
+					}
+					mIsInserted = true;
+					return;
+				}
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node.getLocalName().equals("s")) // text:s
+				{
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+					fromindex -= nodeLength;
+
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+					fromindex--;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+					fromindex--;
+				} else {
+					nodeLength = textProcessor.getText(node).length();
+					insertSpan(textSpan, fromindex, node);
+					fromindex -= nodeLength;
+				}
+
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*
+	 * the textSpan must be the child element of parentNode
+	 * this method is used to keep the style of text span when it has been insert into the parentNode
+	 * if we don't deal with the style, the inserted span will also have the style of parentNode
+	 * 
+	 */
+	private void adjustStyle(Node parentNode, OdfTextSpan textSpan, Map<OdfStyleProperty, String> styleMap) {
+		if (parentNode instanceof OdfStylableElement) {
+			OdfStylableElement pStyleNode = (OdfStylableElement) parentNode;
+			if (styleMap == null) {
+				styleMap = getTextStylePropertiesDeep(pStyleNode);
+			}
+			Node node = parentNode.getFirstChild();
+			while (node != null) {
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					if (node.getTextContent().length() > 0) {
+						Node nextNode = node.getNextSibling();
+						OdfTextSpan span = new OdfTextSpan((OdfFileDom) node.getOwnerDocument());
+						span.appendChild(node);
+						if (nextNode != null) {
+							parentNode.insertBefore(span, nextNode);
+						} else {
+							parentNode.appendChild(span);
+						}
+						node = span;
+						applyTextStyleProperties(styleMap, (OdfStylableElement) node);
+					}
+				} else if ((node instanceof OdfStylableElement)) {
+					if (!node.equals(textSpan)) {
+						Map<OdfStyleProperty, String> styles = getTextStylePropertiesDeep(pStyleNode);
+						Map<OdfStyleProperty, String> styles1 = getTextStylePropertiesDeep((OdfStylableElement) node);
+						if (styles == null) {
+							styles = styles1;
+						} else if (styles1 != null) {
+							styles.putAll(styles1);
+						}
+						int comp = node.compareDocumentPosition(textSpan);
+						//if node contains textSpan, then recurse the node
+						if ((comp & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) {
+							adjustStyle(node, textSpan, styles);
+						} else {
+							applyTextStyleProperties(styles, (OdfStylableElement) node);
+						}
+					}
+
+				}
+				node = node.getNextSibling();
+			}
+			//change the parentNode to default style
+			//here we don't know the default style name, so here just
+			//remove the text:style-name attribute
+			pStyleNode.removeAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "style-name");
+		}
+	}
+
+	/*
+	 * get a map containing text properties of the specified styleable element.
+	 * @return  a map of text properties.
+	 */
+	private Map<OdfStyleProperty, String> getTextStyleProperties(OdfStylableElement element) {
+		String styleName = element.getStyleName();
+		OdfStyleBase styleElement = element.getAutomaticStyles().getStyle(
+				styleName, element.getStyleFamily());
+
+		if (styleElement == null) {
+			styleElement = element.getDocumentStyle();
+		}
+		if (styleElement != null) {
+			//check if it is the style:defaut-style
+			if ((styleElement.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties) == null) &&
+					(styleElement.getPropertiesElement(OdfStylePropertiesSet.TextProperties) == null)) {
+				styleElement = ((OdfDocument) ((OdfFileDom) styleElement.getOwnerDocument()).getDocument()).getDocumentStyles().getDefaultStyle(styleElement.getFamily());
+			}
+			TreeMap<OdfStyleProperty, String> result = new TreeMap<OdfStyleProperty, String>();
+			OdfStyleFamily family = OdfStyleFamily.Text;
+			if (family != null) {
+				for (OdfStyleProperty property : family.getProperties()) {
+					if (styleElement.hasProperty(property)) {
+						result.put(property, styleElement.getProperty(property));
+					}
+				}
+			}
+			return result;
+		}
+		return null;
+	}
+
+	/*
+	 * get a map containing text properties of the specified styleable element.
+	 * The map will also include any properties set by parent styles
+	 * @return  a map of text properties.
+	 *
+	 */
+	private Map<OdfStyleProperty, String> getTextStylePropertiesDeep(OdfStylableElement element) {
+		String styleName = element.getStyleName();
+		OdfStyleBase styleElement = element.getAutomaticStyles().getStyle(
+				styleName, element.getStyleFamily());
+
+		if (styleElement == null) {
+			styleElement = element.getDocumentStyle();
+		}
+		TreeMap<OdfStyleProperty, String> result = new TreeMap<OdfStyleProperty, String>();
+		while (styleElement != null) {
+			//check if it is the style:defaut-style
+			if ((styleElement.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties) == null) &&
+					(styleElement.getPropertiesElement(OdfStylePropertiesSet.TextProperties) == null)) {
+				styleElement = ((OdfDocument) ((OdfFileDom) styleElement.getOwnerDocument()).getDocument()).getDocumentStyles().getDefaultStyle(styleElement.getFamily());
+			}
+			OdfStyleFamily family = OdfStyleFamily.Text;
+			if (family != null) {
+				for (OdfStyleProperty property : family.getProperties()) {
+					if (styleElement.hasProperty(property)) {
+						result.put(property, styleElement.getProperty(property));
+					}
+				}
+			}
+			styleElement = styleElement.getParentStyle();
+
+		}
+		return result;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextStyleNavigation.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextStyleNavigation.java
new file mode 100644
index 0000000..f875e32
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/incubator/search/TextStyleNavigation.java
@@ -0,0 +1,305 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A derived Navigation class used for navigate the mText content it is used to
+ * search the document and find the matched style properties and would return
+ * TextSelection instance
+ * 
+ * @deprecated As of release 0.8.8, replaced by {@link org.odftoolkit.simple.common.navigation.TextStyleNavigation} in Simple API.
+ */
+public class TextStyleNavigation extends Navigation {
+
+	private OdfTextDocument mTextDocument;
+	private TextSelection mCurrentSelectedItem;
+	private int mCurrentIndex;
+	private Map<OdfStyleProperty, String> mProps;
+	private String mText;
+	private Node mPhNode;
+	private int mIndex;
+	private Node mNode;
+
+	/**
+	 * Construct TextStyleNavigation with style properties condition and navigation scope
+	 * @param props	the matched style properties conditions
+	 * @param doc	the navigation search scope
+	 */
+	public TextStyleNavigation(Map<OdfStyleProperty, String> props, OdfTextDocument doc) {
+		mTextDocument = doc;
+		mCurrentSelectedItem = null;
+		this.mProps = props;
+	}
+
+	/*
+	 * Find next TextSelection which match specified style
+	 */
+	private TextSelection findnext(TextSelection selected) {
+		OdfElement element = null;
+		if (selected == null) {
+
+			try {
+				mNode = getNextMatchElement((Node) mTextDocument.getContentRoot());
+			} catch (Exception ex) {
+				Logger.getLogger(TextStyleNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+			}
+		} else {
+			try {
+				mNode = getNextMatchElement(mNode);
+			} catch (Exception ex) {
+				Logger.getLogger(TextStyleNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+			}
+		}
+		if (mNode != null) {
+			element = (OdfElement) getPHElement(mNode);
+			TextSelection item = new TextSelection(mText, element, mCurrentIndex);
+			return item;
+		}
+		return null;
+	}
+
+	private Node getPHElement(Node node) {
+
+		//get paragraph or heading element
+		if (node instanceof OdfTextParagraph) {
+			mPhNode = node;
+		} else if (node instanceof OdfTextHeading) {
+			mPhNode = node;
+		} else {
+			getPHElement(node.getParentNode());
+		}
+		return mPhNode;
+	}
+
+	/* (non-Javadoc)
+	 * get current TextSelection
+	 * @see org.odftoolkit.odfdom.incubator.search.Navigation#getCurrentItem()
+	 */
+	@Override
+	public Selection getCurrentItem() {
+		Selection.SelectionManager.registerItem(mCurrentSelectedItem);
+		return mCurrentSelectedItem;
+	}
+
+	/* (non-Javadoc)
+	 * check if has next TextSelection with satisfied style
+	 * @see org.odftoolkit.odfdom.incubator.search.Navigation#hasNext()
+	 */
+	@Override
+	public boolean hasNext() {
+		mCurrentSelectedItem = findnext(mCurrentSelectedItem);
+		return (mCurrentSelectedItem != null);
+	}
+
+	/**
+	 * check if the element has the specified style properties
+	 * @param element	navigate this element
+	 * @return true if this element has the specified style properties
+	 * 		   false if not match
+	 */
+	@Override
+	public boolean match(Node element) {
+		boolean match = false;
+		if (element.getNodeType() == Node.TEXT_NODE && !element.getNodeValue().trim().equals("")) {
+			if (element.getParentNode() instanceof OdfStylableElement) {
+				OdfStylableElement parStyleElement = (OdfStylableElement) element.getParentNode();
+
+				String parStyleName = getStyleName(parStyleElement);
+
+				if (getMatchStyleNames().contains(parStyleName)) {
+					match = true;
+					mText = element.getNodeValue();
+					NodeList nodes = getPHElement(element.getParentNode()).getChildNodes();
+					mIndex = 0;
+					getIndex(nodes, element);
+				}
+			}
+		}
+		return match;
+	}
+
+	private void getIndex(NodeList nodes, Node element) {
+		for (int i = 0; i < nodes.getLength(); i++) {
+			Node node = nodes.item(i);
+			if (node == element) {
+				mCurrentIndex = mIndex;
+				break;
+			} else {
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					mIndex = mIndex + node.getNodeValue().length();
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					if (node.getLocalName().equals("s")) // mText:s
+					{
+						try {
+							mIndex = mIndex + Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "c"));
+						} catch (Exception e) {
+							mIndex++;
+						}
+
+					} else if (node.getLocalName().equals("line-break")) {
+						mIndex++;
+					} else if (node.getLocalName().equals("tab")) {
+						mIndex++;
+					} else {
+						getIndex(node.getChildNodes(), element);
+					}
+				}
+			}
+		}
+	}
+
+	private String getStyleName(OdfStylableElement element) {
+		String stylename = element.getStyleName();
+		if (stylename == null) {
+			if (element.getParentNode() instanceof OdfStylableElement) {
+				getStyleName((OdfStylableElement) element.getParentNode());
+			} else {
+				stylename = "defaultstyle";
+			}
+		}
+		return stylename;
+	}
+
+	private Set<String> getMatchStyleNames() {
+		Set<String> styleNames = new HashSet<String>();
+		String sname;
+		HashMap<String, OdfDefaultStyle> defaultStyles = new HashMap<String, OdfDefaultStyle>();
+		try {
+
+			NodeList defStyleList = mTextDocument.getDocumentStyles().getElementsByTagName("style:default-style");
+			for (int i = 0; i < defStyleList.getLength(); i++) {
+				OdfDefaultStyle defStyle = (OdfDefaultStyle) defStyleList.item(i);
+				defaultStyles.put(defStyle.getFamilyName(), defStyle);
+			}
+
+			NodeList styleList = mTextDocument.getDocumentStyles().getElementsByTagName("style:style");
+			for (int i = 0; i < styleList.getLength(); i++) {
+				OdfStyle sStyle = (OdfStyle) styleList.item(i);
+				//get default properties and style properties
+				Map<OdfStyleProperty, String> map = sStyle.getStylePropertiesDeep();
+				//check if properties include all search properties and value equal
+				Iterator<OdfStyleProperty> pIter = mProps.keySet().iterator();
+				boolean isStyle = false;
+				while (pIter.hasNext()) {
+					isStyle = false;
+					OdfStyleProperty p = pIter.next();
+					if (map.containsKey(p)) {
+						if (map.get(p).equals(mProps.get(p))) {
+							isStyle = true;
+						} else {
+							break;
+						}
+					} else {
+						break;
+					}
+				}
+				//put all match style names
+				if (isStyle) {
+					sname = sStyle.getStyleNameAttribute();
+					//if(sname.contains("default"))sname="defaultstyle";
+					styleNames.add(sname);
+				}
+			}
+			//get all automatic styles
+			Iterator<OdfStyle> cStyles = mTextDocument.getContentDom().getAutomaticStyles().getAllStyles().iterator();
+			while (cStyles.hasNext()) {
+				OdfStyle cStyle = cStyles.next();
+				//get default properties and style properties
+				Map<OdfStyleProperty, String> map = cStyle.getStylePropertiesDeep();
+
+				if (cStyle.getParentStyle() == null) {
+					if (cStyle.getFamilyName().equals("text")) {
+						if (defaultStyles.containsKey("text")) {
+							getTextDefaultProperties("text", defaultStyles, map);
+						} else {
+							getTextDefaultProperties("paragraph", defaultStyles, map);
+						}
+					}
+				}
+
+				//check if the search properties is in properties
+				Iterator<OdfStyleProperty> pIter = mProps.keySet().iterator();
+				boolean isStyle = false;
+				while (pIter.hasNext()) {
+					isStyle = false;
+					OdfStyleProperty p = pIter.next();
+					if (map.containsKey(p)) {
+						if (map.get(p).equals(mProps.get(p))) {
+							isStyle = true;
+						} else {
+							break;
+						}
+					} else {
+						break;
+					}
+				}
+				//put all match style names
+				if (isStyle) {
+					styleNames.add(cStyle.getStyleNameAttribute());
+				}
+			}
+
+		} catch (Exception e1) {
+			Logger.getLogger(TextStyleNavigation.class.getName()).log(Level.SEVERE, e1.getMessage(), e1);
+		}
+		return styleNames;
+	}
+
+	private void getTextDefaultProperties(
+			String familyName,
+			HashMap<String, OdfDefaultStyle> defaultStyles,
+			Map<OdfStyleProperty, String> map) {
+		OdfDefaultStyle defStyle = defaultStyles.get(familyName);
+		if (defStyle != null) {
+			OdfStyleFamily family = defStyle.getFamily();
+			if (family != null) {
+				for (OdfStyleProperty property : family.getProperties()) {
+					if (!map.containsKey(property) && defStyle.hasProperty(property)) {
+						map.put(property, defStyle.getProperty(property));
+					}
+				}
+			}
+		}
+
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/DefaultErrorHandler.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/DefaultErrorHandler.java
new file mode 100644
index 0000000..58f2055
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/DefaultErrorHandler.java
@@ -0,0 +1,52 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.logging.Logger;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+/** Default implementation of the SAX <code>ErrorHandler</code> interface. */
+class DefaultErrorHandler implements ErrorHandler {
+	private static final Logger LOG = Logger.getLogger(DefaultErrorHandler.class.getName());
+
+	/** Triggers an warning. In case an optional ODF conformance was not satisfied.
+	 *  Default handling is to write into Java log using warning level */
+	public void warning(SAXParseException exception) throws SAXException {		
+		LOG.warning(exception.getLocalizedMessage());
+	}
+
+	/** Triggers an error. In case a mandatory ODF conformance was not satisfied.
+	*  Default handling is to write into Java log using severe level */
+	public void error(SAXParseException exception) throws SAXException {		
+		LOG.severe(exception.getLocalizedMessage());
+	}
+	
+	/** Triggers a fatalError. The ODF document can not be loaded due to an error.	 *
+	 *   Default handling is to write into Java log using severe level and to throw a SAXException */
+	public void fatalError(SAXParseException exception) throws SAXException {		
+		LOG.severe(exception.getLocalizedMessage());
+		throw exception;
+	}	
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ElementVisitor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ElementVisitor.java
new file mode 100644
index 0000000..c8e4617
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ElementVisitor.java
@@ -0,0 +1,37 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+/**
+ * 
+ * An interface to visit every odf element, according to Visitor design pattern
+ *
+ */
+public interface ElementVisitor {
+
+	/**
+	 * Visit odf element and process some operations
+	 * 
+	 * @param element ODF element
+	 */
+	public void visit(OdfElement element);
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/MediaType.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/MediaType.java
new file mode 100644
index 0000000..5713639
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/MediaType.java
@@ -0,0 +1,40 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+/**
+ *
+ * MediaType represens the mediatype or MIMETYPE of the file/document.
+ *
+ */
+public interface MediaType {
+
+		/**
+		 * @return the mediatype String of this document
+		 */
+		public String getMediaTypeString();
+
+		/**
+		 * @return the filesuffix of this document
+		 */
+		public String getSuffix();
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/NamespaceName.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/NamespaceName.java
new file mode 100644
index 0000000..35f2e48
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/NamespaceName.java
@@ -0,0 +1,41 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2010 Oracle and/or its affiliates. All rights reserved.ed.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+/**
+ * The NamespaceName interface is being used to provide an easy way to define Namespaces
+ * in a higher layer (e.g. via enum as OdfDocumentNamespace) and access them from a lower layer e.g. constructors of org.odftoolkit.odfdom.pkg.OdfNamespace.
+ */
+public interface NamespaceName {
+
+	/**
+	 * @return the prefix currently related to XML Namespace.
+	 * Note: Even in a single XML file, a user might assign different prefixes to a XML Namespace, different NamespaceNames might exist.
+	 */
+	public String getPrefix();
+
+	/**
+	 * @return the URI identifiying the XML Namespace.
+	 */
+	public String getUri();
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAlienAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAlienAttribute.java
new file mode 100644
index 0000000..99e71d2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAlienAttribute.java
@@ -0,0 +1,65 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.DOMException;
+
+/**
+ * Any attribute within the ODF package that is listed in the ODF schema.
+ * Note: Existence does not imply invalid ODF, as even namespace attributes are not
+ * listed and mapped to an OdfAlienAttribute.
+ */
+public class OdfAlienAttribute extends OdfAttribute {
+
+	private static final long serialVersionUID = 4210521398191729448L;
+
+	/**
+	 * Creates an alien attribute on the XML file
+	 *
+	 * @param ownerDocument the DOM of the XML file within the ODF package
+	 * @param name of the XML attribute to be created
+	 * @throws DOMException thrown for any problem during attribute creation
+	 */
+
+	public OdfAlienAttribute(OdfFileDom ownerDocument,
+            OdfName name) throws DOMException {
+        super(ownerDocument, name.getUri(), name.getQName());
+        ATTRIBUTE_NAME = name;
+    }
+    public final OdfName ATTRIBUTE_NAME;
+
+    @Override
+	public OdfName getOdfName() {
+        return ATTRIBUTE_NAME;
+    }
+
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAlienElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAlienElement.java
new file mode 100644
index 0000000..3f2b5ef
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAlienElement.java
@@ -0,0 +1,45 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.DOMException;
+
+/**
+ * Any element within the ODF package that is listed in the ODF schema.
+ */
+public class OdfAlienElement extends OdfElement {
+
+	private static final long serialVersionUID = 6693153432396354134L;
+
+	public OdfAlienElement(OdfFileDom ownerDocument,
+            OdfName name) throws DOMException {
+        super(ownerDocument, name.getUri(), name.getQName());
+        ELEMENT_NAME = name;
+    }
+    public final OdfName ELEMENT_NAME;
+
+    @Override
+	public OdfName getOdfName() {
+        return ELEMENT_NAME;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAttribute.java
new file mode 100644
index 0000000..c88444e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfAttribute.java
@@ -0,0 +1,75 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import org.apache.xerces.dom.AttrNSImpl;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.DOMException;
+
+/**
+ * Base class for all attributes of the OpenDocument format
+ */
+abstract public class OdfAttribute extends AttrNSImpl {
+
+   /**
+    * Returns the attribute name.
+    *
+    * @return the <code>OdfName</code> for the attribute.
+    */
+   abstract public OdfName getOdfName();
+
+   /** Creates a new instance of OdfAttribute
+    * @param ownerDocument - the document the attribute belongs to
+    * @param namespaceURI - The namespace URI of the attribute to create. When it is null or an empty string, this method behaves like createAttribute.
+    * @param qualifiedName - The qualified name of the attribute to instantiate.
+    * @throws DOMException - if the attribute could not be created
+    */
+   public OdfAttribute(OdfFileDom ownerDocument,
+           String namespaceURI,
+           String qualifiedName) throws DOMException {
+       super(ownerDocument, namespaceURI, qualifiedName);
+   }
+
+   /** Creates a new instance of OdfAttribute
+    * @param ownerDocument - the document the attribute belongs to
+    * @param name - the <code>OdfName</code> representation of the attribute name.
+    * @throws DOMException - if the attribute could not be created
+    */
+   public OdfAttribute(OdfFileDom ownerDocument,
+           OdfName name) throws DOMException {
+       super(ownerDocument, name.getUri(), name.getQName());
+   }
+   
+   /**
+	 * Returns the default value of {@odf.attribute table:number-columns-repeated}.
+	 * 
+	 * @return the default value as String
+	 */
+	abstract public String getDefault();
+
+	/**
+	 * Default value indicator
+	 * 
+	 * @return true if a default exists
+	 */
+	abstract public boolean hasDefault();
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfContainerElementBase.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfContainerElementBase.java
new file mode 100644
index 0000000..8c2f585
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfContainerElementBase.java
@@ -0,0 +1,102 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+//ToDo: Move into tooling package?
+package org.odftoolkit.odfdom.pkg;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Node;
+
+/**
+ * Overwriting the DOM methods for element access, whenever a new ODF element was added triggering
+ * <code>onOdfNodeInserted</code> and when removed a <code>onOdfNodeRemoved.</code>.
+ * Yet not overriding all DOM access methods, esp. not the access on key attributes, eg. @style-name.
+ */
+abstract public class OdfContainerElementBase extends OdfElement {
+
+	private static final long serialVersionUID = 6944696143015713668L;
+	// moved to this class as only used for style handling
+	protected OdfPackageDocument mPackageDocument;
+
+	/** Creates a new instance of OdfElement */
+	public OdfContainerElementBase(OdfFileDom ownerDocument,
+			String namespaceURI,
+			String qualifiedName) throws DOMException {
+		super(ownerDocument, namespaceURI, qualifiedName);
+		if (ownerDocument instanceof OdfContentDom) {
+			ownerDocument = (OdfContentDom) ownerDocument;
+		} else if (ownerDocument instanceof OdfStylesDom) {
+			ownerDocument = (OdfStylesDom) ownerDocument;
+		}
+		mPackageDocument = ownerDocument.getDocument();
+	}
+
+	/** Creates a new instance of OdfElement */
+	public OdfContainerElementBase(OdfFileDom ownerDocument,
+			OdfName aName) throws DOMException {
+		super(ownerDocument, aName.getUri(), aName.getQName());
+	}
+
+	/** override this method to get notified about element insertion
+	 */
+	protected void onOdfNodeInserted(OdfElement node, Node refChild) {
+		throw new UnsupportedOperationException("Not supported yet.");
+	}
+
+	/** override this method to get notified about element insertion
+	 */
+	protected void onOdfNodeRemoved(OdfElement node) {
+		throw new UnsupportedOperationException("Not supported yet.");
+	}
+
+	@Override
+	public Node insertBefore(Node newChild, Node refChild) throws DOMException {
+		Node ret = super.insertBefore(newChild, refChild);
+		if (newChild instanceof OdfElement) {
+			onOdfNodeInserted((OdfElement) newChild, refChild);
+		}
+		return ret;
+	}
+
+	@Override
+	public Node removeChild(Node oldChild) throws DOMException {
+		Node ret = super.removeChild(oldChild);
+		if (oldChild instanceof OdfElement) {
+			onOdfNodeRemoved((OdfElement) oldChild);
+		}
+		return ret;
+	}
+
+	@Override
+	public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
+		Node ret = super.replaceChild(newChild, oldChild);
+
+		if (newChild instanceof OdfElement) {
+			onOdfNodeInserted((OdfElement) newChild, oldChild);
+		}
+		if (oldChild instanceof OdfElement) {
+			onOdfNodeRemoved((OdfElement) oldChild);
+		}
+		return ret;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfDecryptedException.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfDecryptedException.java
new file mode 100644
index 0000000..b7af059
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfDecryptedException.java
@@ -0,0 +1,37 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+/**
+ * This ODF document decryption exception.
+ * 
+ * @since 0.8.9
+ * 
+ */
+public class OdfDecryptedException extends RuntimeException {
+
+	private static final long serialVersionUID = 7657277144612220943L;
+
+	public OdfDecryptedException(String message) {
+		super(message);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfElement.java
new file mode 100644
index 0000000..1195a4a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfElement.java
@@ -0,0 +1,515 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.ArrayList;
+
+import org.apache.xerces.dom.ElementNSImpl;
+import org.apache.xerces.dom.ParentNode;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+abstract public class OdfElement extends ElementNSImpl {
+
+	private static final long serialVersionUID = -4939293285696678939L;
+
+	/** Creates a new instance of OdfElement */
+	public OdfElement(OdfFileDom ownerDocument, String namespaceURI,
+			String qualifiedName) throws DOMException {
+		super(ownerDocument, namespaceURI, qualifiedName);
+	}
+
+	/** Creates a new instance of OdfElement */
+	public OdfElement(OdfFileDom ownerDocument, OdfName aName)
+			throws DOMException {
+		super(ownerDocument, aName.getUri(), aName.getQName());
+	}
+
+	abstract public OdfName getOdfName();
+
+	protected <T extends OdfElement> T getParentAs(Class<T> clazz) {
+		Node parent = getParentNode();
+		if (parent != null && clazz.isInstance(parent)) {
+			return clazz.cast(parent);
+		} else {
+			return null;
+		}
+	}
+
+	protected <T extends OdfElement> T getAncestorAs(Class<T> clazz) {
+		Node node = getParentNode();
+		while (node != null) {
+			if (clazz.isInstance(node)) {
+				return clazz.cast(node);
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	@Override
+	public String toString() {
+		return mapNode(this, new StringBuilder()).toString();
+	}
+
+	/** Only Siblings will be traversed by this method as Children */
+	static private StringBuilder mapNodeTree(Node node, StringBuilder xml) {
+		while (node != null) {
+			// mapping node and this mapping include always all descendants
+			xml = mapNode(node, xml);
+			// next sibling will be mapped to XML
+			node = node.getNextSibling();
+		}
+		return xml;
+	}
+
+	private static StringBuilder mapNode(Node node, StringBuilder xml) {
+		if (node instanceof Element) {
+			xml = mapElementNode(node, xml);
+		} else if (node instanceof Text) {
+			xml = mapTextNode(node, xml);
+		}
+		return xml;
+	}
+
+	private static StringBuilder mapTextNode(Node node, StringBuilder xml) {
+		if (node != null) {
+			xml = xml.append(node.getTextContent());
+		}
+		return xml;
+	}
+
+	private static StringBuilder mapElementNode(Node node, StringBuilder xml) {
+		if (node != null) {
+			xml = xml.append("<");
+			xml = xml.append(node.getNodeName());
+			xml = mapAttributeNode(node, xml);
+			xml = xml.append(">");
+			xml = mapNodeTree(node.getFirstChild(), xml);
+			xml = xml.append("</");
+			xml = xml.append(node.getNodeName());
+			xml = xml.append(">");
+		}
+		return xml;
+	}
+
+	private static StringBuilder mapAttributeNode(Node node, StringBuilder xml) {
+		NamedNodeMap attrs = null;
+		int length;
+		if ((attrs = node.getAttributes()) != null
+				&& (length = attrs.getLength()) > 0) {
+			for (int i = 0; length > i; i++) {
+				xml = xml.append(" ");
+				xml = xml.append(attrs.item(i).getNodeName());
+				xml = xml.append("=\"");
+				xml = xml.append(attrs.item(i).getNodeValue());
+				xml = xml.append("\"");
+			}
+		}
+		return xml;
+	}
+
+	/**
+	 * Set the value of an ODF attribute by <code>OdfName</code>.
+	 * 
+	 * @param name
+	 *            The qualified name of the ODF attribute.
+	 * @param value
+	 *            The value to be set in <code>String</code> form
+	 */
+	public void setOdfAttributeValue(OdfName name, String value) {
+		setAttributeNS(name.getUri(), name.getQName(), value);
+	}
+
+	/**
+	 * Set an ODF attribute to this element
+	 * 
+	 * @param attribute
+	 *            the attribute to be set
+	 */
+	public void setOdfAttribute(OdfAttribute attribute) {
+		setAttributeNodeNS(attribute);
+	}
+
+	/**
+	 * Retrieves a value of an ODF attribute by <code>OdfName</code>.
+	 * 
+	 * @param name
+	 *            The qualified name of the ODF attribute.
+	 * @return The value of the attribute as <code>String</code> or
+	 *         <code>null</code> if the attribute does not exist.
+	 */
+	public String getOdfAttributeValue(OdfName name) {
+		return getAttributeNS(name.getUri(), name.getLocalName());
+	}
+
+	/**
+	 * Retrieves an ODF attribute by <code>OdfName</code>.
+	 * 
+	 * @param name
+	 *            The qualified name of the ODF attribute.
+	 * @return The <code>OdfAttribute</code> or <code>null</code> if the
+	 *         attribute does not exist.
+	 */
+	public OdfAttribute getOdfAttribute(OdfName name) {
+		return (OdfAttribute) getAttributeNodeNS(name.getUri(), name.getLocalName());
+	}
+
+	/**
+	 * Retrieves an ODF attribute by <code>NamespaceName</code>, and local name.
+	 * 
+	 * @param namespace
+	 *            The namespace of the ODF attribute.
+	 * @param localname
+	 *            The local name of the ODF attribute.
+	 * @return The <code>OdfAttribute</code> or <code>null</code> if the
+	 *         attribute does not exist.
+	 */
+	public OdfAttribute getOdfAttribute(NamespaceName namespace, String localname) {
+		return (OdfAttribute) getAttributeNodeNS(namespace.getUri(),
+				localname);
+	}
+
+	/**
+	 * Determines if an ODF attribute exists.
+	 * 
+	 * @param name
+	 *            The qualified name of the ODF attribute.
+	 * @return True if the attribute exists.
+	 */
+	public boolean hasOdfAttribute(OdfName name) {
+		return hasAttributeNS(name.getUri(), name.getLocalName());
+	}
+
+	/**
+	 * returns the first child node that implements the given class.
+	 * 
+	 * @param <T>
+	 *            The type of the ODF element to be found.
+	 * @param clazz
+	 *            is a class that extends OdfElement.
+	 * @param parentNode
+	 *            is the parent O of the children to be found.
+	 * @return the first child node of the given parentNode that is a clazz or
+	 *         null if none is found.
+	 */
+	@SuppressWarnings("unchecked")
+	static public <T extends OdfElement> T findFirstChildNode(Class<T> clazz,
+			Node parentNode) {
+		if (parentNode != null && parentNode instanceof ParentNode) {
+			Node node = ((ParentNode) parentNode).getFirstChild();
+			while ((node != null) && !clazz.isInstance(node)) {
+				node = node.getNextSibling();
+			}
+
+			if (node != null) {
+				return (T) node;
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * returns the first sibling after the given reference node that implements
+	 * the given class.
+	 * 
+	 * @param <T>
+	 *            The type of the ODF element to be found.
+	 * @param clazz
+	 *            is a class that extends OdfElement.
+	 * @param refNode
+	 *            the reference node of the siblings to be found.
+	 * @return the first sibbling of the given reference node that is a clazz or
+	 *         null if none is found.
+	 */
+	@SuppressWarnings("unchecked")
+	static public <T extends OdfElement> T findNextChildNode(Class<T> clazz,
+			Node refNode) {
+		if (refNode != null) {
+			Node node = refNode.getNextSibling();
+			while (node != null && !clazz.isInstance(node)) {
+				node = node.getNextSibling();
+			}
+
+			if (node != null) {
+				return (T) node;
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * returns the first previous sibling before the given reference node that
+	 * implements the given class.
+	 * 
+	 * @param clazz
+	 *            is a class that extends OdfElement.
+	 * @param refNode
+	 *            the reference node which siblings are to be searched.
+	 * @return the first previous sibbling of the given reference node that is a
+	 *         clazz or null if none is found.
+	 */
+	@SuppressWarnings("unchecked")
+	static public <T extends OdfElement> T findPreviousChildNode(
+			Class<T> clazz, Node refNode) {
+		if (refNode != null) {
+			Node node = refNode.getPreviousSibling();
+			while (node != null && !clazz.isInstance(node)) {
+				node = node.getPreviousSibling();
+			}
+
+			if (node != null) {
+				return (T) node;
+			}
+		}
+
+		return null;
+	}
+
+	@Override
+	public Node cloneNode(boolean deep) {
+		OdfElement cloneElement = ((OdfFileDom) this.ownerDocument).newOdfElement(this.getClass());
+
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Node item = attributes.item(i);
+				String qname = null;
+				String prefix = item.getPrefix();
+				if (prefix == null) {
+					qname = item.getLocalName();
+				} else {
+					qname = prefix + ":" + item.getLocalName();
+				}
+				cloneElement.setAttributeNS(item.getNamespaceURI(), qname, item.getNodeValue());
+			}
+		}
+
+		if (deep) {
+			Node childNode = getFirstChild();
+			while (childNode != null) {
+				cloneElement.appendChild(childNode.cloneNode(true));
+				childNode = childNode.getNextSibling();
+			}
+		}
+
+		return cloneElement;
+	}
+
+	/**
+	 * indicates if some other object is equal to this one.
+	 * 
+	 * @param obj
+	 *            - the reference object with which to compare.
+	 * @return true if this object is the same as the obj argument; false
+	 *         otherwise.
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if ((obj == null) || !(obj instanceof OdfElement)) {
+			return false;
+		}
+
+		OdfElement compare = (OdfElement) obj;
+
+		// compare node name
+		if (!localName.equals(compare.localName)) {
+			return false;
+		}
+
+		if (!this.namespaceURI.equals(compare.namespaceURI)) {
+			return false;
+		}
+
+		// compare node attributes
+		if (attributes == compare.attributes) {
+			return true;
+		}
+
+		if ((attributes == null) || (compare.attributes == null)) {
+			return false;
+		}
+
+		int attr_count1 = attributes.getLength();
+		int attr_count2 = compare.attributes.getLength();
+
+		ArrayList<Node> attr1 = new ArrayList<Node>();
+		for (int i = 0; i < attr_count1; i++) {
+			Node node = attributes.item(i);
+			if (node.getNodeValue().length() == 0) {
+				continue;
+			}
+			attr1.add(node);
+		}
+
+		ArrayList<Node> attr2 = new ArrayList<Node>();
+		for (int i = 0; i < attr_count2; i++) {
+			Node node = compare.attributes.item(i);
+			if (node.getNodeValue().length() == 0) {
+				continue;
+			}
+			attr2.add(node);
+		}
+
+		if (attr1.size() != attr2.size()) {
+			return false;
+		}
+
+		for (int i = 0; i < attr1.size(); i++) {
+			Node n1 = attr1.get(i);
+			if (n1.getLocalName().equals("name")
+					&& n1.getNamespaceURI().equals(
+					OdfDocumentNamespace.STYLE.getUri())) {
+				continue; // do not compare style names
+			}
+			Node n2 = null;
+			int j = 0;
+			for (j = 0; j < attr2.size(); j++) {
+				n2 = attr2.get(j);
+				if (n1.getLocalName().equals(n2.getLocalName())
+						&& n1.getNamespaceURI().equals(n2.getNamespaceURI())) {
+					break;
+				}
+			}
+			if (j == attr2.size()) {
+				return false;
+			}
+
+			if (!n1.getTextContent().equals(n2.getTextContent())) {
+				return false;
+			}
+		}
+
+		// now compare child elements
+		NodeList childs1 = this.getChildNodes();
+		NodeList childs2 = compare.getChildNodes();
+
+		int child_count1 = childs1.getLength();
+		int child_count2 = childs2.getLength();
+		if ((child_count1 == 0) && (child_count2 == 0)) {
+			return true;
+		}
+
+		ArrayList<Node> nodes1 = new ArrayList<Node>();
+		for (int i = 0; i < child_count1; i++) {
+			Node node = childs1.item(i);
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				if (node.getNodeValue().trim().length() == 0) {
+					continue; // skip whitespace text nodes
+				}
+			}
+			nodes1.add(node);
+		}
+
+		ArrayList<Node> nodes2 = new ArrayList<Node>();
+		for (int i = 0; i < child_count2; i++) {
+			Node node = childs2.item(i);
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				if (node.getNodeValue().trim().length() == 0) {
+					continue; // skip whitespace text nodes
+				}
+			}
+			nodes2.add(node);
+		}
+
+		if (nodes1.size() != nodes2.size()) {
+			return false;
+		}
+
+		for (int i = 0; i < nodes1.size(); i++) {
+			Node n1 = nodes1.get(i);
+			Node n2 = nodes2.get(i);
+			if (!n1.equals(n2)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	protected void onRemoveNode(Node node) {
+		Node child = node.getFirstChild();
+		while (child != null) {
+			this.onRemoveNode(child);
+			child = child.getNextSibling();
+		}
+
+		if (OdfElement.class.isInstance(node)) {
+			((OdfElement) node).onRemoveNode();
+		}
+	}
+
+	protected void onInsertNode(Node node) {
+		Node child = node.getFirstChild();
+		while (child != null) {
+			this.onInsertNode(child);
+			child = child.getNextSibling();
+		}
+
+		if (OdfElement.class.isInstance(node)) {
+			((OdfElement) node).onInsertNode();
+		}
+	}
+
+	protected void onRemoveNode() {
+	}
+
+	protected void onInsertNode() {
+	}
+
+	@Override
+	public Node insertBefore(Node newChild, Node refChild) throws DOMException {
+		onInsertNode(newChild);
+		return super.insertBefore(newChild, refChild);
+	}
+
+	@Override
+	public Node removeChild(Node oldChild) throws DOMException {
+		onRemoveNode(oldChild);
+		return super.removeChild(oldChild);
+	}
+
+	@Override
+	public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
+		onInsertNode(newChild);
+		onRemoveNode(oldChild);
+		return super.replaceChild(newChild, oldChild);
+	}
+
+	/**
+	 * Accept an visitor instance to allow the visitor to do some operations.
+	 * Refer to visitor design pattern to get a better understanding.
+	 * @param visitor	an instance of DefaultElementVisitor
+	 */
+	public void accept(ElementVisitor visitor) {
+		visitor.visit(this);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfFileDom.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfFileDom.java
new file mode 100644
index 0000000..32c7af2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfFileDom.java
@@ -0,0 +1,712 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.xerces.dom.DocumentImpl;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfMetaDom;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.OdfSettingsDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.rdfa.BookmarkRDFMetadataExtractor;
+import org.odftoolkit.odfdom.pkg.manifest.OdfManifestDom;
+import org.odftoolkit.odfdom.pkg.rdfa.DOMRDFaParser;
+import org.odftoolkit.odfdom.pkg.rdfa.JenaSink;
+import org.odftoolkit.odfdom.pkg.rdfa.MultiContentHandler;
+import org.odftoolkit.odfdom.pkg.rdfa.SAXRDFaParser;
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+
+import com.hp.hpl.jena.rdf.model.Model;
+
+/**
+ * The DOM representation of an XML file within the ODF document.
+ */
+public class OdfFileDom extends DocumentImpl implements NamespaceContext {
+
+	private static final long serialVersionUID = 766167617530147000L;
+	protected String mPackagePath;
+	protected OdfPackageDocument mPackageDocument;
+	protected OdfPackage mPackage;
+	protected XPath mXPath;
+	protected Map<String, String> mUriByPrefix;
+	protected Map<String, String> mPrefixByUri;
+	/** Contains only the duplicate prefix. 
+	 * The primary hold by mPrefixByUri still have to be added
+	 */
+	protected Map<String, Set<String>> mDuplicatePrefixesByUri;
+	/**
+	* The cache of in content metadata: key: a Node in the dom ; value: the
+	* Jena RDF model of triples of the Node
+	*/
+	protected Map<Node, Model> inCententMetadataCache;
+
+	protected JenaSink sink;
+
+	/**
+	 * Creates the DOM representation of an XML file of an Odf document.
+	 * 
+	 * @param packageDocument
+	 *            the document the XML files belongs to
+	 * @param packagePath
+	 *            the internal package path to the XML file
+	 */
+	protected OdfFileDom(OdfPackageDocument packageDocument, String packagePath) {
+		super(false);
+		if (packageDocument != null && packagePath != null) {
+			mPackageDocument = packageDocument;
+			mPackage = packageDocument.getPackage();
+			mPackagePath = packagePath;
+			mUriByPrefix = new HashMap<String, String>();
+			mPrefixByUri = new HashMap<String, String>();
+			mDuplicatePrefixesByUri = new HashMap<String, Set<String>>();
+			inCententMetadataCache = new IdentityHashMap<Node, Model>();
+			initialize();
+			// Register every DOM to OdfPackage,
+			// so a package close might save this DOM (similar as OdfDocumentPackage)
+			this.addDomToCache(mPackage, packagePath);
+		} else {
+			throw new IllegalArgumentException("Arguments are not allowed to be NULL for OdfFileDom constructor!");
+		}
+	}
+
+	/**
+	* Creates the DOM representation of an XML file of an Odf document.
+	*
+	* @param pkg
+	* the package the XML files belongs to
+	* @param packagePath
+	* the internal package path to the XML file
+	*/
+	protected OdfFileDom(OdfPackage pkg, String packagePath) {
+		super(false);
+		if (pkg != null && packagePath != null) {
+			mPackageDocument = null;
+			mPackage = pkg;
+			mPackagePath = packagePath;
+			mUriByPrefix = new HashMap<String, String>();
+			mPrefixByUri = new HashMap<String, String>();
+			mDuplicatePrefixesByUri = new HashMap<String, Set<String>>();
+			inCententMetadataCache = new HashMap<Node, Model>();
+			initialize();
+			// Register every DOM to OdfPackage,
+			// so a package close might save this DOM (similar as
+			// OdfDocumentPackage)
+			addDomToCache(mPackage, packagePath);
+		} else {
+			throw new IllegalArgumentException("Arguments are not allowed to be NULL for OdfFileDom constructor!");
+		}
+	}
+
+	/** 
+	 *Adds the document to the pool of open documents of the package.
+	 *A document of a certain path is opened only once to avoid data duplication.
+	 */
+	private void addDomToCache(OdfPackage pkg, String internalPath) {
+		pkg.cacheDom(this, internalPath);
+	}
+
+	public static OdfFileDom newFileDom(OdfPackageDocument packageDocument, String packagePath) {
+		OdfFileDom newFileDom = null;
+		// before creating a new dom, make sure that there no DOM opened for this file already
+		Document existingDom = packageDocument.getPackage().getCachedDom(packagePath);
+		if (existingDom == null) {
+			// ToDo: bug 264 - register OdfFileDom to this class
+			if (packagePath.equals("content.xml") || packagePath.endsWith("/content.xml")) {
+				newFileDom = new OdfContentDom((OdfSchemaDocument) packageDocument, packagePath);
+			} else if (packagePath.equals("styles.xml") || packagePath.endsWith("/styles.xml")) {
+				newFileDom = new OdfStylesDom((OdfSchemaDocument) packageDocument, packagePath);
+			} else if (packagePath.equals("meta.xml") || packagePath.endsWith("/meta.xml")) {
+				newFileDom = new OdfMetaDom((OdfSchemaDocument) packageDocument, packagePath);
+			} else if (packagePath.equals("settings.xml") || packagePath.endsWith("/settings.xml")) {
+				newFileDom = new OdfSettingsDom((OdfSchemaDocument) packageDocument, packagePath);
+			} else if (packagePath.equals("META-INF/manifest.xml") || packagePath.endsWith("/META-INF/manifest.xml")) {
+				newFileDom = new OdfManifestDom((OdfSchemaDocument) packageDocument, packagePath);
+			} else {
+				newFileDom = new OdfFileDom(packageDocument, packagePath);
+			}
+		} else {
+			if (existingDom instanceof OdfFileDom) {
+				newFileDom = (OdfFileDom) existingDom;
+//ToDO: Issue 264 - Otherwise if NOT an OdfFileDom serialize old DOM AND CREATE A NEW ONE?!
+// Or shall we always reference to the dom, than we can not inherit from Document? Pro/Con?s
+//			}else{
+//				// Create an OdfFileDOM from an existing DOM
+//				newFileDom =
+			}
+
+		}
+		return newFileDom;
+	}
+
+	public static OdfFileDom newFileDom(OdfPackage pkg, String packagePath) {
+		OdfFileDom newFileDom = null;
+		// before creating a new dom, make sure that there no DOM opened for this file already
+		Document existingDom = pkg.getCachedDom(packagePath);
+		if (existingDom == null) {
+			if (packagePath.equals("META-INF/manifest.xml") || packagePath.endsWith("/META-INF/manifest.xml")) {
+				newFileDom = new OdfManifestDom(pkg, packagePath);
+			} else {
+				newFileDom = new OdfFileDom(pkg, packagePath);
+			}
+		} else {
+			if (existingDom instanceof OdfFileDom) {
+				newFileDom = (OdfFileDom) existingDom;
+//ToDO: Issue 264 - Otherwise if NOT an OdfFileDom serialize old DOM AND CREATE A NEW ONE?!
+// Or shall we always reference to the dom, than we can not inherit from Document? Pro/Con?s
+//			}else{
+//				// Create an OdfFileDOM from an existing DOM
+//				newFileDom =
+			}
+
+		}
+		return newFileDom;
+	}
+	
+	protected void initialize() {
+		InputStream fileStream = null;
+		try {
+			fileStream = mPackage.getInputStream(mPackagePath);
+			if (fileStream != null) {
+				XMLReader xmlReader = mPackage.getXMLReader();
+				OdfFileSaxHandler odf = new OdfFileSaxHandler(this);
+				String baseUri = Util.getRDFBaseUri(mPackage.getBaseURI(),mPackagePath);
+				sink = new JenaSink(this);
+				odf.setSink(sink);
+				SAXRDFaParser rdfa = SAXRDFaParser.createInstance(sink);
+				rdfa.setBase(baseUri);
+				// the file is parsed by ODF ContentHandler, and then RDFa ContentHandler
+				MultiContentHandler multi = new MultiContentHandler(odf, rdfa);
+				xmlReader.setContentHandler(multi);
+				InputSource xmlSource = new InputSource(fileStream);
+				xmlReader.parse(xmlSource);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(OdfFileDom.class.getName()).log(Level.SEVERE, null, ex);
+		} finally {
+			try {
+				if (fileStream != null) {
+					fileStream.close();
+				}
+			} catch (IOException ex) {
+				Logger.getLogger(OdfFileDom.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+	}
+
+	/**
+	 * Retrieves the <code>OdfPackageDocument</code> of the XML file.
+	 * A package document is usually represented as a directory with a mediatype.
+	 *
+	 * @return The document holding the XML file.
+	 *
+	 */
+	public OdfPackageDocument getDocument() {
+		return mPackageDocument;
+	}
+
+	/**
+	 * Retrieves the <code>String</code> of Package Path
+	 * 
+	 * @return The path of the XML file relative to the package root
+	 */
+	public String getPackagePath() {
+		return mPackagePath;
+	}
+
+	/**
+	 * Retrieves the ODF root element.
+	 *
+	 * @return The <code>OdfElement</code> being the root of the document.
+	 */
+	public OdfElement getRootElement() {
+		return (OdfElement) getDocumentElement();
+	}
+
+	/**
+	 * Create ODF element with namespace uri and qname
+	 *
+	 * @param name The element name
+	 *
+	 */
+	@Override
+	public OdfElement createElement(String name) throws DOMException {
+		return createElementNS(OdfName.newName(name));
+	}
+
+	/**
+	 * Create ODF element with namespace uri and qname
+	 *
+	 * @param nsuri The namespace uri
+	 * @param qname The element qname
+	 *
+	 */
+	@Override
+	public OdfElement createElementNS(String nsuri, String qname) throws DOMException {
+		return createElementNS(OdfName.newName(nsuri, qname));
+	}
+
+	/**
+	 * Create ODF element with ODF name
+	 * @param name The <code>OdfName</code>
+	 * @return The <code>OdfElement</code>
+	 * @throws DOMException
+	 */
+	public OdfElement createElementNS(OdfName name) throws DOMException {
+		return OdfXMLFactory.newOdfElement(this, name);
+	}
+
+	/**
+	 * Create the ODF attribute with its name
+	 *
+	 * @param name  the attribute qname
+	 * @return The <code>OdfAttribute</code>
+	 * @throws  DOMException
+	 */
+	@Override
+	public OdfAttribute createAttribute(String name) throws DOMException {
+		return createAttributeNS(OdfName.newName(name));
+	}
+
+	/**
+	 * Create the ODF attribute with namespace uri and qname
+	 * 
+	 * @param nsuri  The namespace uri
+	 * @param qname  the attribute qname
+	 * @return The <code>OdfAttribute</code>
+	 * @throws  DOMException
+	 */
+	@Override
+	public OdfAttribute createAttributeNS(String nsuri, String qname) throws DOMException {
+		return createAttributeNS(OdfName.newName(nsuri, qname));
+	}
+
+	/**
+	 * Create the ODF attribute with ODF name
+	 * @param name The <code>OdfName</code>
+	 * @return  The <code>OdfAttribute</code>
+	 * @throws DOMException
+	 */
+	public OdfAttribute createAttributeNS(OdfName name) throws DOMException {
+		return OdfXMLFactory.newOdfAttribute(this, name);
+	}
+
+	@SuppressWarnings("unchecked")
+	public <T extends OdfElement> T newOdfElement(Class<T> clazz) {
+		//return (T) OdfXMLFactory.getNodeFromClass(this, clazz);
+		try {
+			Field fname = clazz.getField("ELEMENT_NAME");
+			OdfName name = (OdfName) fname.get(null);
+			return (T) createElementNS(name);
+		} catch (Exception ex) {
+			if (ex instanceof RuntimeException) {
+				throw (RuntimeException) ex;
+			}
+			return null;
+		}
+	}
+
+	@Override
+	public String toString() {
+		return ((OdfElement) this.getDocumentElement()).toString();
+	}
+
+	// JDK Namespace handling
+	/**
+	 * Create an XPath instance to select one or more nodes from an ODF document.
+	 * Therefore the namespace context is set to the OdfNamespace
+	 * @return an XPath instance with namespace context set to include the standard
+	 * ODFDOM prefixes.
+	 */
+	public XPath getXPath() {
+		if (mXPath == null) {
+			mXPath = XPathFactory.newInstance().newXPath();
+		}
+		return mXPath;
+	}
+
+	/**
+	 * <p>Get Namespace URI bound to a prefix in the current scope (the XML file).</p>
+	 *
+	 * <p>When requesting a Namespace URI by prefix, the following
+	 * table describes the returned Namespace URI value for all
+	 * possible prefix values:</p>
+	 *
+	 * <table border="2" rules="all" cellpadding="4">
+	 *   <thead>
+	 *     <tr>
+	 *       <td align="center" colspan="2">
+	 *         <code>getNamespaceURI(prefix)</code>
+	 *         return value for specified prefixes
+	 *       </td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td>prefix parameter</td>
+	 *       <td>Namespace URI return value</td>
+	 *     </tr>
+	 *   </thead>
+	 *   <tbody>
+	 *     <tr>
+	 *       <td><code>DEFAULT_NS_PREFIX</code> ("")</td>
+	 *       <td>default Namespace URI in the current scope or
+	 *         <code>{@link
+	 *         javax.xml.XMLConstants#NULL_NS_URI XMLConstants.NULL_NS_URI("")}
+	 *         </code>
+	 *         when there is no default Namespace URI in the current scope</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td>bound prefix</td>
+	 *       <td>Namespace URI bound to prefix in current scope</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td>unbound prefix</td>
+	 *       <td>
+	 *         <code>{@link
+	 *         javax.xml.XMLConstants#NULL_NS_URI XMLConstants.NULL_NS_URI("")}
+	 *         </code>
+	 *       </td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>XMLConstants.XML_NS_PREFIX</code> ("xml")</td>
+	 *       <td><code>XMLConstants.XML_NS_URI</code>
+	 *           ("http://www.w3.org/XML/1998/namespace")</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>XMLConstants.XMLNS_ATTRIBUTE</code> ("xmlns")</td>
+	 *       <td><code>XMLConstants.XMLNS_ATTRIBUTE_NS_URI</code>
+	 *         ("http://www.w3.org/2000/xmlns/")</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>null</code></td>
+	 *       <td><code>IllegalArgumentException</code> is thrown</td>
+	 *     </tr>
+	 *    </tbody>
+	 * </table>
+	 *
+	 * @param prefix prefix to look up
+	 *
+	 * @return Namespace URI bound to prefix in the current scope
+	 *
+	 * @throws IllegalArgumentException When <code>prefix</code> is
+	 *   <code>null</code>
+	 */
+	public String getNamespaceURI(String prefix) {
+		String nsURI = null;
+		nsURI = mUriByPrefix.get(prefix);
+		if (nsURI == null) {
+			// look in Duplicate URI prefixes
+			Set<String> urisWithDuplicatePrefixes = this.mDuplicatePrefixesByUri.keySet();
+			for (String aURI : urisWithDuplicatePrefixes) {
+				Set<String> prefixes = this.mDuplicatePrefixesByUri.get(aURI);
+				// check if requested prefix exists in hashset
+				if (prefixes.contains(prefix)) {
+					nsURI = aURI;
+					break;
+				}
+			}
+		}
+		// there is a possibility it still may be null - so we check
+		if (nsURI == null) {
+			nsURI = XMLConstants.NULL_NS_URI;
+		}
+		return nsURI;
+	}
+
+	/**
+	 * <p>Get prefix bound to Namespace URI in the current scope (the XML file).</p>
+	 * <p>Multiple prefixes bound to Namespace URI will be normalized to the first prefix defined.</p>
+	 *
+	 * <p>When requesting a prefix by Namespace URI, the following
+	 * table describes the returned prefix value for all Namespace URI
+	 * values:</p>
+	 *
+	 * <table border="2" rules="all" cellpadding="4">
+	 *   <thead>
+	 *     <tr>
+	 *       <th align="center" colspan="2">
+	 *         <code>getPrefix(namespaceURI)</code> return value for
+	 *         specified Namespace URIs
+	 *       </th>
+	 *     </tr>
+	 *     <tr>
+	 *       <th>Namespace URI parameter</th>
+	 *       <th>prefix value returned</th>
+	 *     </tr>
+	 *   </thead>
+	 *   <tbody>
+	 *     <tr>
+	 *       <td>&lt;default Namespace URI&gt;</td>
+	 *       <td><code>XMLConstants.DEFAULT_NS_PREFIX</code> ("")
+	 *       </td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td>bound Namespace URI</td>
+	 *       <td>prefix bound to Namespace URI in the current scope,
+	 *           if multiple prefixes are bound to the Namespace URI in
+	 *           the current scope, a single arbitrary prefix, whose
+	 *           choice is implementation dependent, is returned</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td>unbound Namespace URI</td>
+	 *       <td><code>null</code></td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>XMLConstants.XML_NS_URI</code>
+	 *           ("http://www.w3.org/XML/1998/namespace")</td>
+	 *       <td><code>XMLConstants.XML_NS_PREFIX</code> ("xml")</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>XMLConstants.XMLNS_ATTRIBUTE_NS_URI</code>
+	 *           ("http://www.w3.org/2000/xmlns/")</td>
+	 *       <td><code>XMLConstants.XMLNS_ATTRIBUTE</code> ("xmlns")</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>null</code></td>
+	 *       <td><code>IllegalArgumentException</code> is thrown</td>
+	 *     </tr>
+	 *   </tbody>
+	 * </table>
+	 *
+	 * @param namespaceURI URI of Namespace to lookup
+	 *
+	 * @return prefix bound to Namespace URI in current context
+	 *
+	 * @throws IllegalArgumentException When <code>namespaceURI</code> is
+	 *   <code>null</code>
+	 */
+	public String getPrefix(String namespaceURI) {
+		return mPrefixByUri.get(namespaceURI);
+	}
+
+	/**
+	 * <p>Get all prefixes bound to a Namespace URI in the current
+	 * scope. (the XML file)</p>
+	 * <p>NOTE: Multiple prefixes bound to a similar Namespace URI will be normalized to the first prefix defined.
+	 * Still the namespace attributes exist in the XML as inner value prefixes might be used.</p>
+	 *
+	 * <p><strong>The <code>Iterator</code> is
+	 * <em>not</em> modifiable.  e.g. the
+	 * <code>remove()</code> method will throw
+	 * <code>UnsupportedOperationException</code>.</strong></p>
+	 *
+	 * <p>When requesting prefixes by Namespace URI, the following
+	 * table describes the returned prefixes value for all Namespace
+	 * URI values:</p>
+	 *
+	 * <table border="2" rules="all" cellpadding="4">
+	 *   <thead>
+	 *     <tr>
+	 *       <th align="center" colspan="2"><code>
+	 *         getPrefixes(namespaceURI)</code> return value for
+	 *         specified Namespace URIs</th>
+	 *     </tr>
+	 *     <tr>
+	 *       <th>Namespace URI parameter</th>
+	 *       <th>prefixes value returned</th>
+	 *     </tr>
+	 *   </thead>
+	 *   <tbody>
+	 *     <tr>
+	 *       <td>bound Namespace URI,
+	 *         including the &lt;default Namespace URI&gt;</td>
+	 *       <td>
+	 *         <code>Iterator</code> over prefixes bound to Namespace URI in
+	 *         the current scope in an arbitrary,
+	 *         <strong>implementation dependent</strong>,
+	 *         order
+	 *       </td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td>unbound Namespace URI</td>
+	 *       <td>empty <code>Iterator</code></td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>XMLConstants.XML_NS_URI</code>
+	 *           ("http://www.w3.org/XML/1998/namespace")</td>
+	 *       <td><code>Iterator</code> with one element set to
+	 *         <code>XMLConstants.XML_NS_PREFIX</code> ("xml")</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>XMLConstants.XMLNS_ATTRIBUTE_NS_URI</code>
+	 *           ("http://www.w3.org/2000/xmlns/")</td>
+	 *       <td><code>Iterator</code> with one element set to
+	 *         <code>XMLConstants.XMLNS_ATTRIBUTE</code> ("xmlns")</td>
+	 *     </tr>
+	 *     <tr>
+	 *       <td><code>null</code></td>
+	 *       <td><code>IllegalArgumentException</code> is thrown</td>
+	 *     </tr>
+	 *   </tbody>
+	 * </table>
+	 *
+	 * @param namespaceURI URI of Namespace to lookup
+	 *
+	 * @return <code>Iterator</code> for all prefixes bound to the
+	 *   Namespace URI in the current scope
+	 *
+	 * @throws IllegalArgumentException When <code>namespaceURI</code> is
+	 *   <code>null</code>
+	 */
+	public Iterator<String> getPrefixes(String namespaceURI) {
+		Set<String> prefixes = mDuplicatePrefixesByUri.get(namespaceURI);
+		if (prefixes == null) {
+			prefixes = new HashSet<String>();
+		}
+		String givenPrefix = mPrefixByUri.get(namespaceURI);
+		if(givenPrefix != null){
+			prefixes.add(givenPrefix);
+		}
+		return prefixes.iterator();
+	}
+
+	/** @return a map of namespaces, where the URI is the key and the prefix is the value */
+	Map<String, String> getMapNamespacePrefixByUri() {
+		return mPrefixByUri;
+	}
+
+	/** Adds a new Namespace to the DOM. Making the prefix usable with JDK <code>XPath</code>.
+	 * All namespace attributes will be written to the root element during later serialization of the DOM by the <code>OdfPackage</code>.
+	 * @param prefix of the namespace to be set to this DOM
+	 * @param uri of the namespace to be set to this DOM
+	 * @return the namespace that was set. If an URI was registered before to the DOM, the previous prefix will be taken.
+	 * In case of a given prefix that was already registered, but related to a new URI, the prefix will be adapted.
+	 * The new prefix receives the suffix '__' plus integer, e.g. "__1" for the first duplicate and "__2" for the second.
+	 */
+	public OdfNamespace setNamespace(String prefix, String uri) {
+		//collision detection, when a new prefix/URI pair exists
+		OdfNamespace newNamespace = null;
+		//Scenario a) the URI already registered, use existing prefix
+		// but save all others for the getPrefixes function. There might be still some
+		// in attribute values using prefixes, that were not exchanged.
+		String existingPrefix = mPrefixByUri.get(uri);
+		if (existingPrefix != null) {
+			//Use the existing prefix of the used URL, neglect the given
+			newNamespace = OdfNamespace.newNamespace(existingPrefix, uri);
+
+			//Add the new prefix to the duplicate prefix map for getPrefixes(String uri)
+			Set<String> prefixes = mDuplicatePrefixesByUri.get(uri);
+			if (prefixes == null) {
+				prefixes = new HashSet<String>();
+				mDuplicatePrefixesByUri.put(uri, prefixes);
+			}
+			prefixes.add(prefix);
+		} else {
+			//Scenario b) the prefix already exists and the URI does not exist
+			String existingURI = mUriByPrefix.get(prefix);
+			if (existingURI != null && !existingURI.equals(uri)) {
+				//Change the prefix appending "__" plus counter.
+				int i = 1;
+				do {
+					int suffixStart = prefix.lastIndexOf("__");
+					if (suffixStart != -1) {
+						prefix = prefix.substring(0, suffixStart);
+					}
+					//users have to take care for their attribute values using namespace prefixes.
+					prefix = prefix + "__" + i;
+					i++;
+					existingURI = mUriByPrefix.get(prefix);
+				} while (existingURI != null && !existingURI.equals(uri));
+			}
+			newNamespace = OdfNamespace.newNamespace(prefix, uri);
+			mPrefixByUri.put(uri, prefix);
+			mUriByPrefix.put(prefix, uri);
+		}
+		// if the file Dom is already associated to parsed XML add the new namespace to the root element
+		Element root = getRootElement();
+		if (root != null) {
+			root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + prefix, uri);
+		}
+		return newNamespace;
+	}
+
+	/** Adds a new Namespace to the DOM. Making the prefix usable with JDK <code>XPath</code>.
+	 * All namespace attributes will be written to the root element during later serialization of the DOM by the <code>OdfPackage</code>.
+	 * @param name the namespace to be set
+	 * @return the namespace that was set. If an URI was registered before to the DOM, the previous prefix will be taken.
+	 * In case of a given prefix that was already registered, but related to a new URI, the prefix will be adapted.
+	 * The new prefix receives the suffix '__' plus integer, e.g. "__1" for the first duplicate and "__2" for the second.
+	 */
+	public OdfNamespace setNamespace(NamespaceName name) {
+		return setNamespace(name.getPrefix(), name.getUri());
+	}
+
+
+	/**
+	* Get in-content metadata cache model
+	*
+	* @return in-content metadata cache model
+	*/
+	public Map<Node, Model> getInContentMetadataCache() {
+		return this.inCententMetadataCache;
+	}
+
+	/**
+	* Update the in content metadata of the node. It should be called whenever
+	* the xhtml:xxx attrbutes values of the node are changed.
+	* @param the node, whose in content metadata will be updated
+	*/
+	public void updateInContentMetadataCache(Node node) {
+		this.getInContentMetadataCache().remove(node);
+		DOMRDFaParser parser = DOMRDFaParser.createInstance(this.sink);
+		String baseUri = Util.getRDFBaseUri(mPackage.getBaseURI(), mPackagePath);
+		parser.setBase(baseUri);
+		parser.parse(node);
+	}
+
+	/**
+	* @return the RDF metadata of all the bookmarks within the dom
+	*/
+	public Model getBookmarkRDFMetadata() {
+		return BookmarkRDFMetadataExtractor.newBookmarkTextExtractor().getBookmarkRDFMetadata(this);
+	}
+
+	/**
+	* The end users needn't to care of this method, which is used by
+	* BookmarkRDFMetadataExtractor
+	* @return the JenaSink
+	*/
+	public JenaSink getSink() {
+		return sink;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfFileSaxHandler.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfFileSaxHandler.java
new file mode 100644
index 0000000..4f4def8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfFileSaxHandler.java
@@ -0,0 +1,175 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.IOException;
+import java.util.Stack;
+import org.odftoolkit.odfdom.pkg.rdfa.JenaSink;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class OdfFileSaxHandler extends DefaultHandler {
+
+	private static final String EMPTY_STRING = "";
+	// the empty XML file to which nodes will be added
+	private OdfFileDom mFileDom;
+	// the context node
+	private Node mNode;        // a stack of sub handlers. handlers will be pushed on the stack whenever
+	// they are required and must pop themselves from the stack when done
+	private Stack<ContentHandler> mHandlerStack = new Stack<ContentHandler>();
+	private StringBuilder mCharsForTextNode = new StringBuilder();
+	private JenaSink sink;
+	
+	OdfFileSaxHandler(Node rootNode) {
+		if (rootNode instanceof OdfFileDom) {
+			mFileDom = (OdfFileDom) rootNode;
+		} else {
+			mFileDom = (OdfFileDom) rootNode.getOwnerDocument();
+		}
+		mNode = rootNode;
+	}
+
+	@Override
+	public void startDocument() throws SAXException {
+	}
+
+	@Override
+	public void endDocument() throws SAXException {
+	}
+
+	@Override
+	public void endElement(String uri, String localName, String qName) throws SAXException {
+		flushTextNode();
+		// pop to the parent node
+		mNode = mNode.getParentNode();
+	}
+
+	@Override
+	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+		flushTextNode();
+		// if there is a specilized handler on the stack, dispatch the event
+		Element element = null;
+		if (uri.equals(EMPTY_STRING) || qName.equals(EMPTY_STRING)) {
+			element = mFileDom.createElement(localName);
+		} else {
+			element = mFileDom.createElementNS(uri, qName);
+		}
+		String attrQname = null;
+		String attrURL = null;
+		OdfAttribute attr = null;
+		for (int i = 0; i < attributes.getLength(); i++) {
+			attrURL = attributes.getURI(i);
+			attrQname = attributes.getQName(i);
+			// if no namespace exists
+			if (attrURL.equals(EMPTY_STRING) || attrQname.equals(EMPTY_STRING)) {
+				// create attribute without prefix
+				attr = mFileDom.createAttribute(attributes.getLocalName(i));
+			} else {
+				if (attrQname.startsWith("xmlns:")) {
+					// in case of xmlns prefix we have to create a new OdfNamespace
+					OdfNamespace namespace = mFileDom.setNamespace(attributes.getLocalName(i), attributes.getValue(i));
+					// if the file Dom is already associated to parsed XML add the new namespace to the root element
+					Element root = mFileDom.getRootElement();
+					if (root == null) {
+						root = element;
+					}
+					root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + namespace.getPrefix(), namespace.getUri());
+				}
+				// create all attributes, even namespace attributes
+				attr = mFileDom.createAttributeNS(attrURL, attrQname);
+			}
+
+			// namespace attributes will not be created and return null
+			if (attr != null) {
+				element.setAttributeNodeNS(attr);
+				// don't exit because of invalid attribute values
+				try {
+					// set Value in the attribute to allow validation in the attribute
+					attr.setValue(attributes.getValue(i));
+				} // if we detect an attribute with invalid value: remove attribute node
+				catch (IllegalArgumentException e) {
+					element.removeAttributeNode(attr);
+				}
+			}
+		}
+		// add the new element as a child of the current context node
+		mNode.appendChild(element);
+		// push the new element as the context node...
+		mNode = element;
+		if (!localName.equals("bookmark-start")){
+			setContextNode(mNode);
+		}
+	}
+
+	/**
+	 * http://xerces.apache.org/xerces2-j/faq-sax.html#faq-2 :
+	 * SAX may deliver contiguous text as multiple calls to characters,
+	 * for reasons having to do with parser efficiency and input buffering.
+	 * It is the programmer's responsibility to deal with that appropriately,
+	 * e.g. by accumulating text until the next non-characters event.
+	 */
+	private void flushTextNode() {
+		if (mCharsForTextNode.length() > 0) {
+			Text text = mFileDom.createTextNode(mCharsForTextNode.toString());
+			mNode.appendChild(text);
+			mCharsForTextNode.setLength(0);
+		}
+	}
+
+	@Override
+	public void characters(char[] ch, int start, int length) throws SAXException {
+		if (!mHandlerStack.empty()) {
+			mHandlerStack.peek().characters(ch, start, length);
+		} else {
+			mCharsForTextNode.append(ch, start, length);
+		}
+	}
+
+	@Override
+	public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException {
+		return super.resolveEntity(publicId, systemId);
+	}
+	
+	/**
+	* Expose the current node to JenaSink to for caching the parsed RDF triples.
+	* @return
+	*/
+	private void setContextNode(Node node){
+		if (this.sink !=null){
+			sink.setContextNode(node);
+		}
+	}
+
+	/**
+	* Set the JenaSink object.
+	* @param sink
+	*/
+	public void setSink(JenaSink sink) {
+		this.sink = sink;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfManifestSaxHandler.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfManifestSaxHandler.java
new file mode 100644
index 0000000..92dad7a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfManifestSaxHandler.java
@@ -0,0 +1,181 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************//*
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.Map;
+import org.odftoolkit.odfdom.pkg.manifest.Algorithm;
+import org.odftoolkit.odfdom.pkg.manifest.EncryptionData;
+import org.odftoolkit.odfdom.pkg.manifest.KeyDerivation;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+class OdfManifestSaxHandler implements ContentHandler {
+
+	private OdfFileEntry _currentFileEntry;
+	private EncryptionData _currentEncryptionData;
+	private OdfPackage mPackage;
+	private static final String EMPTY_STRING = "";
+
+	public OdfManifestSaxHandler(OdfPackage pkg) {
+		mPackage = pkg;
+	}
+
+	*//**
+	 * Receive an object for locating the origin of SAX document events.
+	 *//*
+	public void setDocumentLocator(Locator locator) {
+	}
+
+	*//**
+	 * Receive notification of the beginning of a document.
+	 *//*
+	public void startDocument() throws SAXException {
+	}
+
+	*//**
+	 * Receive notification of the end of a document.
+	 *//*
+	public void endDocument() throws SAXException {
+	}
+
+	*//**
+	 * Begin the scope of a prefix-URI Namespace mapping.
+	 *//*
+	public void startPrefixMapping(String prefix, String uri)
+			throws SAXException {
+	}
+
+	*//**
+	 * End the scope of a prefix-URI mapping.
+	 *//*
+	public void endPrefixMapping(String prefix) throws SAXException {
+	}
+
+	*//**
+	 * Receive notification of the beginning of an element.
+	 *//*
+	public void startElement(String namespaceURI, String localName,
+			String qName, Attributes atts) throws SAXException {
+		Map<String, OdfFileEntry> entries = mPackage.getManifestEntries();
+
+		if (localName.equals("file-entry")) {
+			String path = atts.getValue("manifest:full-path");
+			if (path.equals(EMPTY_STRING)) {
+				if(mPackage.getErrorHandler() != null){
+					mPackage.logValidationError(OdfPackageConstraint.MANIFEST_WITH_EMPTY_PATH, mPackage.getBaseURI());
+				}
+			} 
+			path = OdfPackage.normalizePath(path);
+			_currentFileEntry = entries.get(path);
+			if (_currentFileEntry == null) {
+				_currentFileEntry = new OdfFileEntry();
+			}
+			if (path != null) {
+				entries.put(path, _currentFileEntry);
+			}
+			_currentFileEntry.setPath(atts.getValue("manifest:full-path"));
+			_currentFileEntry.setMediaTypeString(atts.getValue("manifest:media-type"));
+			if (atts.getValue("manifest:size") != null) {
+				try {
+					_currentFileEntry.setSize(Integer.parseInt(atts.getValue("manifest:size")));
+				} catch (NumberFormatException nfe) {
+					throw new SAXException("not a number: "
+							+ atts.getValue("manifest:size") + nfe.getMessage());
+				}
+			}
+		} else if (localName.equals("encryption-data")) {
+			_currentEncryptionData = new EncryptionData();
+			if (_currentFileEntry != null) {
+				_currentEncryptionData.setChecksumType(atts.getValue("manifest:checksum-type"));
+				_currentEncryptionData.setChecksum(atts.getValue("manifest:checksum"));
+				_currentFileEntry.setEncryptionData(_currentEncryptionData);
+			}
+		} else if (localName.equals("algorithm")) {
+			Algorithm algorithm = new Algorithm();
+			algorithm.setName(atts.getValue("manifest:algorithm-name"));
+			algorithm.setInitializationVector(atts.getValue("manifest:initialization-vector"));
+			if (_currentEncryptionData != null) {
+				_currentEncryptionData.setAlgorithm(algorithm);
+			}
+		} else if (localName.equals("key-derivation")) {
+			KeyDerivation keyDerivation = new KeyDerivation();
+			keyDerivation.setName(atts.getValue("manifest:key-derivation-name"));
+			keyDerivation.setSalt(atts.getValue("manifest:salt"));
+			if (atts.getValue("manifest:iteration-count") != null) {
+				try {
+					keyDerivation.setIterationCount(Integer.parseInt(atts.getValue("manifest:iteration-count")));
+				} catch (NumberFormatException nfe) {
+					throw new SAXException("not a number: "
+							+ atts.getValue("manifest:iteration-count"));
+				}
+			}
+			if (_currentEncryptionData != null) {
+				_currentEncryptionData.setKeyDerivation(keyDerivation);
+			}
+		}else if (localName.equals("manifest")) {
+                     mPackage.setManifestVersion(atts.getValue("manifest:version"));
+                }
+
+	}
+
+	*//**
+	 * Receive notification of the end of an element.
+	 *//*
+	public void endElement(String namespaceURI, String localName,
+			String qName) throws SAXException {
+		//ToDo Issue 263: Parsing of Manifest.xml specific part to be added to parser
+		if (localName.equals("encryption-data")) {
+			_currentEncryptionData = null;
+		}
+	}
+
+	*//**
+	 * Receive notification of character data.
+	 *//*
+	public void characters(char[] ch, int start, int length)
+			throws SAXException {
+	}
+
+	*//**
+	 * Receive notification of ignorable whitespace in element content.
+	 *//*
+	public void ignorableWhitespace(char[] ch, int start, int length)
+			throws SAXException {
+	}
+
+	*//**
+	 * Receive notification of a processing instruction.
+	 *//*
+	public void processingInstruction(String target, String data)
+			throws SAXException {
+	}
+
+	*//**
+	 * Receive notification of a skipped entity.
+	 *//*
+	public void skippedEntity(String name) throws SAXException {
+	}
+}
+*/
\ No newline at end of file
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfName.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfName.java
new file mode 100644
index 0000000..91cfa55
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfName.java
@@ -0,0 +1,194 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.HashMap;
+
+/** The class provides a simplified interface for XML names.
+ *  The class defines a name for an XML node. It embraces XML NamespaceURI, XML prefix and XML localname. */
+public class OdfName implements Comparable<OdfName> {
+
+	private OdfNamespace mNS;
+	private String mLocalName;
+	private String mExpandedName; // i.e. {nsURI}localName
+	private static HashMap<String, OdfName> mOdfNames = new HashMap<String, OdfName>();
+
+	private OdfName(OdfNamespace ns, String localname, String expandedName) {
+		mNS = ns;
+		mLocalName = localname;
+		mExpandedName = expandedName;
+	}
+
+	/** Returns the OdfName for the given namespace and name.
+	 *  Creates a new one, if the OdfName was not asked before.
+	 * @param name of the XML node
+	 * @return the OdfName for the given OdfNamesapce and name.
+	 */
+	public static OdfName newName(String name) {
+		return createName(null, name);
+	}
+
+	/** Returns the OdfName for the given namespace and name.
+	 *  Creates a new one, if the OdfName was not asked before.
+	 * @param odfNamespace the namespace of the name to be created
+	 * @param name of the XML node. Can be both local or qualified name.
+	 * @return the OdfName for the given OdfNamesapce and name.
+	 */
+	public static OdfName newName(OdfNamespace odfNamespace, String name) {
+		return createName(odfNamespace, name);
+	}
+
+	/** Returns the OdfName for the given namespace and name.
+	 *  Creates a new one, if the OdfName was not asked before.
+	 * @param namespaceNamed represents a W3C Namespace Name. The interface <code>NamespaceName</code> is often implemented by an enum.
+	 * @param name of the XML node. Can be both local or qualified name.
+	 * @return the OdfName for the given OdfNamesapce and name.
+	 */
+	public static OdfName newName(NamespaceName namespaceNamed, String name) {
+		return createName(OdfNamespace.newNamespace(namespaceNamed), name);
+	}
+
+	public static OdfName newName(String uri, String qname) {
+		String prefix = OdfNamespace.getPrefixPart(qname);
+		String localName = OdfNamespace.getLocalPart(qname);
+		OdfNamespace ns = OdfNamespace.newNamespace(prefix, uri);
+		return createName(ns, localName);
+	}
+
+	private static OdfName createName(OdfNamespace odfNamespace, String name) {
+		int i = 0;
+		if ((i = name.indexOf(':')) >= 0) {
+			name = name.substring(i + 1);
+		}
+		String expandedName = null;
+		// ToDo: Is there need for the prefix? For instance during serialization?
+		if (odfNamespace != null) {
+			StringBuilder b = new StringBuilder();
+			b.append('{');
+			b.append(odfNamespace.toString());
+			b.append('}');
+			b.append(name);
+			expandedName = b.toString();
+		} else {
+			expandedName = name;
+		}
+		// return a similar OdfName if one was already created before..
+		OdfName odfName = mOdfNames.get(expandedName);
+		if (odfName != null) {
+			return odfName;
+		} else {
+			// otherwise create a new OdfName, store it in the map and return it..
+			odfName = new OdfName(odfNamespace, name, expandedName);
+			mOdfNames.put(expandedName, odfName);
+			return odfName;
+		}
+	}
+
+	/** 
+	 * @return the XML Namespace URI, for <text:p> it would be urn:oasis:names:tc:opendocument:xmlns:text:1.0
+	 */
+	public String getUri() {
+		if (mNS == null) {
+			return null;
+		} else {
+			return mNS.getUri();
+		}
+	}
+
+	/**
+	 * @return the XML localname, for <text:p> it would be p.
+	 */
+	public String getLocalName() {
+		return mLocalName;
+	}
+
+	/**
+	 * @return the XML prefix, for <text:p> it would be text.
+	 */
+	public String getPrefix() {
+		String prefix = null;
+		if (mNS != null) {
+			prefix = mNS.getPrefix();
+		}
+		return prefix;
+	}
+
+	/**
+	 * @return the XML QName, the qualified name e.g. for <text:p> it is text:p.
+	 */
+	public String getQName() {
+		if (mNS != null) {
+			return ((mNS.getPrefix() + ":" + mLocalName).intern());
+		} else {
+			return mLocalName;
+		}
+	}
+
+	/**
+	 * @return the OdfName as String, represented by a concatenation of
+	 * XML Namespace URI (within brackets) and local name, as for <text:p> it would be
+	 * {urn:oasis:names:tc:opendocument:xmlns:text:1.0}p
+	 */
+	@Override
+	public String toString() {
+		return mExpandedName;
+	}
+
+	@Override
+	@SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
+	public boolean equals(Object obj) {
+		if (obj != null) {
+			return toString().equals(obj.toString());
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * @param namespaceUri of the XML node to be compared.
+	 * @param name of the XML node to be compared. Can be qualifed name or localname.
+	 * @return true if the given OdfName has the same namespaceURI and localname.
+	 */
+	public boolean equals(String namespaceUri, String name) {
+		if (!mNS.getUri().equals(namespaceUri)) {
+			return false;
+		}
+
+		int beginIndex = name.indexOf(':');
+		if (beginIndex >= 0) {
+			return mLocalName.equals(name.substring(beginIndex + 1));
+		} else {
+			return mLocalName.equals(name);
+		}
+	}
+
+	@Override
+	/** Returns the hashcode of the OdfName */
+	public int hashCode() {
+		return toString().hashCode();
+	}
+
+	/** Compares the by parameter given OdfName with this OdfName  */
+	public int compareTo(OdfName o) {
+		return toString().compareTo(o.toString());
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfNamespace.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfNamespace.java
new file mode 100644
index 0000000..a9dae22
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfNamespace.java
@@ -0,0 +1,162 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Class wrapping the XML Namespace URI and XML Namespace prefix as a single entity.
+ */
+public class OdfNamespace implements Comparable<OdfNamespace>, NamespaceName {
+
+	private static Map<String, OdfNamespace> mNamespacesByURI = new HashMap<String, OdfNamespace>();
+	private String mUri;
+	private String mPrefix;
+
+	private OdfNamespace() {
+	}
+
+	private OdfNamespace(String prefix, String uri) {
+		mUri = uri;
+		mPrefix = prefix;
+	}
+
+	/** Returns the OdfNamespace for the given name.
+	 *  Creates a new one, if the name was not asked before.
+	 * @param name represents a W3C Namespace Name. The interface <code>NamespaceName</code> is often implemented by an enum.
+	 * @return the OdfNamespace for the given name.
+	 */
+	public static OdfNamespace newNamespace(NamespaceName name) {
+		OdfNamespace ns = null;
+		if (name != null) {
+			ns = newNamespace(name.getPrefix(), name.getUri());
+		}
+		return ns;
+	}
+
+	/** Returns the OdfNamespace for the given name.
+	 *  Creates a new one, if the name was not asked before.
+	 * @param uri identifying the namespace.
+	 * @return the namespace.
+	 */
+	public static OdfNamespace newNamespace(String prefix, String uri) {
+		OdfNamespace odfNamespace = null;
+		if (uri != null && uri.length() > 0
+				&& prefix != null && prefix.length() > 0) {
+			odfNamespace = mNamespacesByURI.get(uri);
+			if (odfNamespace == null) {
+				odfNamespace = new OdfNamespace(prefix, uri);
+				mNamespacesByURI.put(uri, odfNamespace);
+			} else {
+				// prefix will be adapted for all OdfNamespaces (last wins)
+				odfNamespace.mPrefix = prefix;
+			}
+		} 
+		return odfNamespace;
+	}
+
+	/** Returns the namespace for the given uri.
+	 * @param uri identifying the namespace.
+	 * @return the namespace identified by the given uri.
+	 */
+	public static OdfNamespace getNamespace(String uri) {
+		OdfNamespace ns = null;
+		if (uri != null) {
+			ns = mNamespacesByURI.get(uri);
+		}
+		return ns;
+	}
+
+	public String getPrefix() {
+		return mPrefix;
+	}
+
+	public String getUri() {
+		return mUri;
+	}
+
+	@Override
+	@SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
+	public boolean equals(Object obj) {
+		if (mUri != null) {
+			return mUri.equals(obj.toString());
+		} else {
+			return mUri == obj;
+		}
+	}
+
+	@Override
+	public int hashCode() {
+		if (mUri != null) {
+			return mUri.hashCode();
+		} else {
+			return 0;
+		}
+	}
+
+	@Override
+	public String toString() {
+		return mUri;
+	}
+
+	/** Splits the XML Qname into the local name and the prefix.
+	 *
+	 * @param qname is the qualified name to be splitted.
+	 * @return an array of two strings containing first the prefix and the second the local part.
+	 * @throws IllegalArgumentException if no qualified name was given.
+	 */
+	public static String[] splitQName(String qname) throws IllegalArgumentException {
+		String localpart = qname;
+		String prefix = null;
+		int colon = qname.indexOf(':');
+		if (colon > 0) {
+			localpart = qname.substring(colon + 1);
+			prefix = qname.substring(0, colon);
+		} else {
+			throw new IllegalArgumentException("A qualified name was required, but '" + qname + "' was given!");
+		}
+		return new String[]{prefix, localpart};
+	}
+
+	/** 
+	 * @param qname is the qualified name to be splitted.
+	 * @return the local name of the XML Qname.
+	 * @throws IllegalArgumentException if no qualified name was given.
+	 */
+	public static String getPrefixPart(String qname) {
+		return splitQName(qname)[0];
+	}
+
+	/**
+	 * @param qname is the qualified name to be splitted.
+	 * @return the prefix of the XML Qname.
+	 * @throws IllegalArgumentException if no qualified name was given.
+	 */
+	public static String getLocalPart(String qname) {
+		return splitQName(qname)[1];
+	}
+
+	public int compareTo(OdfNamespace namespace) {
+		return toString().compareTo(namespace.toString());
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackage.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackage.java
new file mode 100644
index 0000000..0435471
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackage.java
@@ -0,0 +1,2489 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Constructor;
+import java.net.URI;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+import java.util.zip.CRC32;
+import java.util.zip.Deflater;
+import java.util.zip.Inflater;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import javax.crypto.Cipher;
+import javax.crypto.Mac;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+
+import org.apache.xerces.dom.DOMXSImplementationSourceImpl;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfDocument.OdfMediaType;
+import org.odftoolkit.odfdom.pkg.manifest.AlgorithmElement;
+import org.odftoolkit.odfdom.pkg.manifest.EncryptionDataElement;
+import org.odftoolkit.odfdom.pkg.manifest.FileEntryElement;
+import org.odftoolkit.odfdom.pkg.manifest.KeyDerivationElement;
+import org.odftoolkit.odfdom.pkg.manifest.ManifestElement;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.pkg.manifest.OdfManifestDom;
+import org.odftoolkit.odfdom.pkg.manifest.StartKeyGenerationElement;
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+import org.odftoolkit.odfdom.type.Base64Binary;
+import org.w3c.dom.Document;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+
+/**
+ * OdfPackage represents the package view to an OpenDocument document. The
+ * OdfPackage will be created from an ODF document and represents a copy of the
+ * loaded document, where files can be inserted and deleted. The changes take
+ * effect, when the OdfPackage is being made persisted by save().
+ */
+public class OdfPackage implements Closeable {
+	
+	// Static parts of file references
+	private static final String DOUBLE_DOT = "..";
+	private static final String DOT = ".";
+	private static final String SLASH = "/";
+	private static final String COLON = ":";
+	private static final String ENCODED_APOSTROPHE = "&apos;";
+	private static final String ENCODED_QUOTATION = "&quot;";
+	private static final String EMPTY_STRING = "";
+	private static final String XML_MEDIA_TYPE = "text/xml";
+	// Search patterns to be used in RegEx expressions
+	private static final Pattern BACK_SLASH_PATTERN = Pattern.compile("\\\\");
+	private static final Pattern DOUBLE_SLASH_PATTERN = Pattern.compile("//");
+	private static final Pattern QUOTATION_PATTERN = Pattern.compile("\"");
+	private static final Pattern APOSTROPHE_PATTERN = Pattern.compile("'");
+	private static final Pattern CONTROL_CHAR_PATTERN = Pattern.compile("\\p{Cntrl}");
+	private static Set<String> mCompressedFileTypes;
+	// some well known streams inside ODF packages
+	private String mMediaType;
+	private String mBaseURI;
+	private ZipHelper mZipFile;
+	private Resolver mResolver;
+	private Map<String, ZipEntry> mZipEntries;
+	private HashMap<String, ZipEntry> mOriginalZipEntries;
+	private Map<String, OdfFileEntry> mManifestEntries;
+	// All opened documents from the same package are cached (including the root
+	// document)
+	private Map<String, OdfPackageDocument> mPkgDocuments;
+	// Three different incarnations of a package file/data
+	// save() will check 1) mPkgDoms, 2) if not check mMemoryFileCache
+	private HashMap<String, Document> mPkgDoms;
+	private HashMap<String, byte[]> mMemoryFileCache;
+	
+	private ErrorHandler mErrorHandler;
+	private String mManifestVersion;
+	private OdfManifestDom mManifestDom;
+	private String oldPwd;
+	private String newPwd;
+	
+	/* Commonly used files within the ODF Package */
+	public enum OdfFile {
+		
+		/**
+		 * The image directory is not defined by the OpenDocument standard,
+		 * nevertheless the most spread ODF application OpenOffice.org is using
+		 * the directory named "Pictures".
+		 */
+		IMAGE_DIRECTORY("Pictures"),
+		/**
+		 * The "META-INF/manifest.xml" file is defined by the ODF 1.2 part 3
+		 * Package specification. This manifest is the 'content table' of the
+		 * ODF package and describes the file entries of the ZIP including
+		 * directories, but should not contain empty directories.
+		 */
+		MANIFEST("META-INF/manifest.xml"),
+		/**
+		 * The "mimetype" file is defined by the ODF 1.2 part 3 Package
+		 * specification. It contains the mediatype string of the root document
+		 * and must be the first file in the ZIP and must not be compressed.
+		 */
+		MEDIA_TYPE("mimetype");
+		private final String internalPath;
+		
+		OdfFile(String internalPath) {
+			this.internalPath = internalPath;
+		}
+		
+		public String getPath() {
+			return internalPath;
+		}
+	}
+	
+	static {
+		mCompressedFileTypes = new HashSet<String>();
+		String[] typelist = new String[] { "jpg", "gif", "png", "zip", "rar", "jpeg", "mpe", "mpg", "mpeg", "mpeg4", "mp4", "7z", "ari", "arj", "jar", "gz", "tar", "war", "mov", "avi" };
+		mCompressedFileTypes.addAll(Arrays.asList(typelist));
+	}
+	
+	/**
+	 * Creates the ODFPackage as an empty Package.
+	 */
+	private OdfPackage() {
+		mMediaType = null;
+		mResolver = null;
+		mPkgDocuments = new HashMap<String, OdfPackageDocument>();
+		mPkgDoms = new HashMap<String, Document>();
+		mMemoryFileCache = new HashMap<String, byte[]>();
+		mManifestEntries = new HashMap<String, OdfFileEntry>();
+		// specify whether validation should be enabled and what SAX
+		// ErrorHandler should be used.
+		if (mErrorHandler == null) {
+			String errorHandlerProperty = System.getProperty("org.odftoolkit.odfdom.validation");
+			if (errorHandlerProperty != null) {
+				if (errorHandlerProperty.equalsIgnoreCase("true")) {
+					mErrorHandler = new DefaultErrorHandler();
+					Logger.getLogger(OdfPackage.class.getName()).info("Activated validation with default ErrorHandler!");
+				} else {
+					try {
+						Class cl = Class.forName(errorHandlerProperty);
+						Constructor ctor = cl.getDeclaredConstructor(new Class[] {});
+						mErrorHandler = (ErrorHandler) ctor.newInstance();
+						Logger.getLogger(OdfPackage.class.getName()).log(Level.CONFIG, "Activated validation with ErrorHandler:''{0}''!", errorHandlerProperty);
+					} catch (Exception ex) {
+						Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, "Could not initiate validation with the given ErrorHandler: '" + errorHandlerProperty + "'", ex);
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Creates an OdfPackage from the OpenDocument provided by a File.
+	 * <p>
+	 * OdfPackage relies on the file being available for read access over the
+	 * whole lifecycle of OdfPackage.
+	 * </p>
+	 * 
+	 * @param pkgFile
+	 *            - a file representing the ODF document
+	 * @param baseURI
+	 *            defining the base URI of ODF package.
+	 * @param password
+	 *            defining the password of ODF package.
+	 * @param errorHandler
+	 *            - SAX ErrorHandler used for ODF validation
+	 * @see #getErrorHandler
+	 * @throws java.lang.Exception
+	 *             - if the package could not be created
+	 * @see #getErrorHandler*
+	 */
+	private OdfPackage(File pkgFile, String baseURI, String password, ErrorHandler errorHandler) throws Exception {
+		this();
+		mBaseURI = getBaseURLFromFile(pkgFile);
+		mErrorHandler = errorHandler;
+		oldPwd = password;
+		newPwd = oldPwd;
+		mBaseURI = baseURI;
+		
+		InputStream packageStream = new FileInputStream(pkgFile);
+		try {
+			initializeZip(packageStream);
+		} finally {
+			close(packageStream);
+		}
+		
+		// initializeZip(pkgFile);
+	}
+	
+	/**
+	 * Creates an OdfPackage from the OpenDocument provided by a InputStream.
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfPackage, the InputStream is cached. This usually
+	 * takes more time compared to the other constructors.
+	 * </p>
+	 * 
+	 * @param packageStream
+	 *            - an inputStream representing the ODF package
+	 * @param baseURI
+	 *            defining the base URI of ODF package.
+	 * @param password
+	 *            defining the password of ODF package.
+	 * @param errorHandler
+	 *            - SAX ErrorHandler used for ODF validation
+	 * @see #getErrorHandler
+	 * @throws java.lang.Exception
+	 *             - if the package could not be created
+	 * @see #getErrorHandler*
+	 */
+	private OdfPackage(InputStream packageStream, String baseURI, String password, ErrorHandler errorHandler) throws Exception {
+		this(); // calling private constructor
+		mErrorHandler = errorHandler;
+		mBaseURI = baseURI;
+		oldPwd = password;
+		newPwd = oldPwd;
+		initializeZip(packageStream);
+	}
+	
+	/**
+	 * Loads an OdfPackage from the given documentURL.
+	 * <p>
+	 * OdfPackage relies on the file being available for read access over the
+	 * whole lifecycle of OdfPackage.
+	 * </p>
+	 * 
+	 * @param path
+	 *            - the documentURL to the ODF package
+	 * @return the OpenDocument document represented as an OdfPackage
+	 * @throws java.lang.Exception
+	 *             - if the package could not be loaded
+	 */
+	public static OdfPackage loadPackage(String path) throws Exception {
+		File pkgFile = new File(path);
+		return new OdfPackage(pkgFile, getBaseURLFromFile(pkgFile), null, null);
+	}
+	
+	/**
+	 * Loads an OdfPackage from the OpenDocument provided by a File.
+	 * <p>
+	 * OdfPackage relies on the file being available for read access over the
+	 * whole lifecycle of OdfPackage.
+	 * </p>
+	 * 
+	 * @param pkgFile
+	 *            - the ODF Package
+	 * @return the OpenDocument document represented as an OdfPackage
+	 * @throws java.lang.Exception
+	 *             - if the package could not be loaded
+	 */
+	public static OdfPackage loadPackage(File pkgFile) throws Exception {
+		return new OdfPackage(pkgFile, getBaseURLFromFile(pkgFile), null, null);
+	}
+	
+	/**
+	 * Creates an OdfPackage from the given InputStream.
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by OdfPackage, the InputStream is cached. This usually
+	 * takes more time compared to the other loadPackage methods.
+	 * </p>
+	 * 
+	 * @param packageStream
+	 *            - an inputStream representing the ODF package
+	 * @return the OpenDocument document represented as an OdfPackage
+	 * @throws java.lang.Exception
+	 *             - if the package could not be loaded
+	 */
+	public static OdfPackage loadPackage(InputStream packageStream) throws Exception {
+		return new OdfPackage(packageStream, null, null, null);
+	}
+	
+	/**
+	 * Creates an OdfPackage from the given InputStream.
+	 * <p>
+	 * OdfPackage relies on the file being available for read access over the
+	 * whole lifecycle of OdfPackage.
+	 * </p>
+	 * 
+	 * @param packageStream
+	 *            - an inputStream representing the ODF package
+	 * @param baseURI
+	 *            allows to explicitly set the base URI from the document, As
+	 *            the URL can not be derived from a stream. In addition it is
+	 *            possible to set the baseURI to any arbitrary URI, e.g. an URN.
+	 *            One usage of the baseURI to describe the source of validation
+	 *            exception thrown by the ErrorHandler.
+	 * @param errorHandler
+	 *            - SAX ErrorHandler used for ODF validation
+	 * @throws java.lang.Exception
+	 *             - if the package could not be created
+	 * @see #getErrorHandler
+	 */
+	public static OdfPackage loadPackage(InputStream packageStream, String baseURI, ErrorHandler errorHandler) throws Exception {
+		return new OdfPackage(packageStream, baseURI, null, errorHandler);
+	}
+	
+	/**
+	 * Loads an OdfPackage from the given File.
+	 * <p>
+	 * OdfPackage relies on the file being available for read access over the
+	 * whole lifecycle of OdfPackage.
+	 * </p>
+	 * 
+	 * @param pkgFile
+	 *            - the ODF Package. A baseURL is being generated based on its
+	 *            location.
+	 * @param errorHandler
+	 *            - SAX ErrorHandler used for ODF validation.
+	 * @throws java.lang.Exception
+	 *             - if the package could not be created
+	 * @see #getErrorHandler
+	 */
+	public static OdfPackage loadPackage(File pkgFile, ErrorHandler errorHandler) throws Exception {
+		return new OdfPackage(pkgFile, getBaseURLFromFile(pkgFile), null, errorHandler);
+	}
+	
+	/**
+	 * Loads an OdfPackage from the given File.
+	 * <p>
+	 * OdfPackage relies on the file being available for read access over the
+	 * whole lifecycle of OdfPackage.
+	 * </p>
+	 * 
+	 * @param pkgFile
+	 *            - the ODF Package. A baseURL is being generated based on its
+	 *            location.
+	 * @param password
+	 *            - the ODF Package password.
+	 * @param errorHandler
+	 *            - SAX ErrorHandler used for ODF validation.
+	 * @throws java.lang.Exception
+	 *             - if the package could not be created
+	 * @see #getErrorHandler
+	 */
+	public static OdfPackage loadPackage(File pkgFile, String password, ErrorHandler errorHandler) throws Exception {
+		return new OdfPackage(pkgFile, getBaseURLFromFile(pkgFile), password, errorHandler);
+	}
+	
+	// Initialize using memory
+	private void initializeZip(InputStream odfStream) throws Exception {
+		ByteArrayOutputStream tempBuf = new ByteArrayOutputStream();
+		StreamHelper.transformStream(odfStream, tempBuf);
+		byte[] mTempByteBuf = tempBuf.toByteArray();
+		tempBuf.close();
+		if (mTempByteBuf.length < 3) {
+			OdfValidationException ve = new OdfValidationException(OdfPackageConstraint.PACKAGE_IS_NO_ZIP, getBaseURI());
+			if (mErrorHandler != null) {
+				mErrorHandler.fatalError(ve);
+			}
+			throw new IllegalArgumentException(ve);
+		}
+		mZipFile = new ZipHelper(this, mTempByteBuf);
+		readZip();
+	}
+	
+	// // Initialize using ZipFile
+	// private void initializeZip(File pkgFile) throws Exception {
+	// try {
+	// mZipFile = new ZipHelper(this, new ZipFile(pkgFile));
+	// } catch (ZipException ze) {
+	// OdfValidationException ve = new
+	// OdfValidationException(OdfPackageConstraint.PACKAGE_IS_NO_ZIP,
+	// getBaseURI());
+	// if (mErrorHandler != null) {
+	// mErrorHandler.fatalError(ve);
+	// }
+	// throw new IllegalArgumentException(ve);
+	// }
+	// readZip();
+	// }
+	
+	private void readZip() throws Exception {
+		mZipEntries = new HashMap<String, ZipEntry>();
+		String firstEntryName = mZipFile.entriesToMap(mZipEntries);
+		if (mZipEntries.isEmpty()) {
+			OdfValidationException ve = new OdfValidationException(OdfPackageConstraint.PACKAGE_IS_NO_ZIP, getBaseURI());
+			if (mErrorHandler != null) {
+				mErrorHandler.fatalError(ve);
+			}
+			throw new IllegalArgumentException(ve);
+		} else {
+			// initialize the files of the package (fileEnties of Manifest)
+			parseManifest();
+			
+			// initialize the package media type
+			initializeMediaType(firstEntryName);
+			
+			// ToDo: Remove all META-INF/* files from the fileEntries of
+			// Manifest
+			mOriginalZipEntries = new HashMap<String, ZipEntry>();
+			mOriginalZipEntries.putAll(mZipEntries);
+			mZipEntries.remove(OdfPackage.OdfFile.MEDIA_TYPE.getPath());
+			mZipEntries.remove(OdfPackage.OdfFile.MANIFEST.getPath());
+			mZipEntries.remove("META-INF/");
+			if (mErrorHandler != null) {
+				validateManifest();
+			}
+			Iterator<String> zipPaths = mZipEntries.keySet().iterator();
+			while (zipPaths.hasNext()) {
+				String internalPath = zipPaths.next();
+				// every resource aside the /META-INF/manifest.xml (and
+				// META-INF/ directory)
+				// and "mimetype" will be added as fileEntry
+				if (!internalPath.equals(OdfPackage.OdfFile.MANIFEST.getPath()) && !internalPath.equals("META-INF/") && !internalPath.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) {
+					// aside "mediatype" and "META-INF/manifest"
+					// add manifest entry as to be described by a
+					// <manifest:file-entry>
+					ensureFileEntryExistence(internalPath);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Validates if all file entries exist in the ZIP and vice versa
+	 * 
+	 * @throws SAXException
+	 */
+	private void validateManifest() throws SAXException {
+		Set zipPaths = mZipEntries.keySet();
+		Set manifestPaths = mManifestEntries.keySet();
+		Set<String> sharedPaths = new HashSet<String>(zipPaths);
+		sharedPaths.retainAll(manifestPaths);
+		
+		if (sharedPaths.size() < zipPaths.size()) {
+			Set<String> zipPathSuperset = new HashSet<String>(mZipEntries.keySet());
+			zipPathSuperset.removeAll(sharedPaths);
+			Set sortedSet = new TreeSet<String>(zipPathSuperset);
+			Iterator iter = sortedSet.iterator();
+			String documentURL = getBaseURI();
+			String internalPath;
+			while (iter.hasNext()) {
+				internalPath = (String) iter.next();
+				if (!internalPath.endsWith(SLASH)) { // not for directories!
+					logValidationError(OdfPackageConstraint.MANIFEST_DOES_NOT_LIST_FILE, documentURL, internalPath);
+				}
+			}
+		}
+		if (sharedPaths.size() < manifestPaths.size()) {
+			Set<String> zipPathSubset = new HashSet<String>(mManifestEntries.keySet());
+			zipPathSubset.removeAll(sharedPaths);
+			// removing root directory
+			zipPathSubset.remove(SLASH);
+			
+			// No directory are listed in a ZIP removing all directory with
+			// content
+			Iterator<String> manifestOnlyPaths = zipPathSubset.iterator();
+			while (manifestOnlyPaths.hasNext()) {
+				String manifestOnlyPath = manifestOnlyPaths.next();
+				// assumption: all directories end with slash
+				if (manifestOnlyPath.endsWith(SLASH)) {
+					removeDirectory(manifestOnlyPath);
+				} else {
+					// if it is a nonexistent file
+					logValidationError(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, getBaseURI(), manifestOnlyPath);
+					mManifestEntries.remove(manifestOnlyPath);
+				}
+			}
+		}
+		// remove none document directories
+		Iterator<String> sharedPathsIter = sharedPaths.iterator();
+		while (sharedPathsIter.hasNext()) {
+			String sharedPath = sharedPathsIter.next();
+			// assumption: all directories end with slash
+			if (sharedPath.endsWith(SLASH)) {
+				removeDirectory(sharedPath);
+			}
+		}
+	}
+	
+	/**
+	 * Removes directories without a mimetype (all none documents)
+	 * 
+	 * @throws SAXException
+	 */
+	private void removeDirectory(String path) throws SAXException {
+		if (path.endsWith(SLASH)) {
+			// Check if it is a sub-document?
+			// Our assumption: it is a document if it has a mimetype...
+			String dirMimeType = mManifestEntries.get(path).getMediaTypeString();
+			if (dirMimeType == null || EMPTY_STRING.equals(dirMimeType)) {
+				logValidationWarning(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, getBaseURI(), path);
+				OdfFileEntry manifestEntry = mManifestEntries.remove(path);
+				FileEntryElement manifestEle = manifestEntry.getOdfElement();
+				manifestEle.getParentNode().removeChild(manifestEle);
+			}
+		}
+	}
+	
+	/**
+	 * Reads the uncompressed "mimetype" file, which contains the package
+	 * media/mimte type
+	 * 
+	 * @throws SAXException
+	 */
+	private void initializeMediaType(String firstEntryName) throws SAXException {
+		ZipEntry mimetypeEntry = mZipEntries.get(OdfPackage.OdfFile.MEDIA_TYPE.getPath());
+		if (mimetypeEntry != null) {
+			if (mErrorHandler != null) {
+				validateMimeTypeEntry(mimetypeEntry, firstEntryName);
+			}
+			// get mediatype value of the root document/package from the
+			// mediatype file stream
+			String entryMediaType = getMediaTypeFromEntry(mimetypeEntry);
+			// get mediatype value of the root document/package from the
+			// manifest.xml
+			String manifestMediaType = getMediaTypeFromManifest();
+			// if a valid mediatype was set by the "mimetype" file
+			if (entryMediaType != null && !entryMediaType.equals(EMPTY_STRING)) {
+				// the root document's mediatype is taken from the "mimetype"
+				// file
+				mMediaType = entryMediaType;
+				if (mErrorHandler != null) {
+					// if the "mediatype" does exist, the
+					// "/META-INF/manifest.xml" have to contain a MIMETYPE for
+					// the root document);
+					if (manifestMediaType != null && !manifestMediaType.equals(EMPTY_STRING)) {
+						// if the two media-types are inconsistent
+						if (!entryMediaType.equals(manifestMediaType)) {
+							logValidationError(OdfPackageConstraint.MIMETYPE_DIFFERS_FROM_PACKAGE, getBaseURI(), CONTROL_CHAR_PATTERN.matcher(mMediaType).replaceAll(EMPTY_STRING), manifestMediaType);
+						}
+					} else { // if "mimetype" file exists, there have to be a
+								// mimetype in the manifest.xml for the root
+								// document (see ODF 1.2 part 3)
+						logValidationError(OdfPackageConstraint.MIMETYPE_WITHOUT_MANIFEST_MEDIATYPE, getBaseURI(), CONTROL_CHAR_PATTERN.matcher(mMediaType).replaceAll(EMPTY_STRING), manifestMediaType);
+					}
+				}
+			} else { // if there is no media-type was set by the "mimetype" file
+				// try as fall-back the mediatype of the root document from the
+				// manifest.xml
+				if (manifestMediaType != null && !manifestMediaType.equals(EMPTY_STRING)) {
+					// and used as fall-back for the mediatype of the package
+					mMediaType = manifestMediaType;
+				}
+			}
+		} else {
+			String manifestMediaType = getMediaTypeFromManifest();
+			if (manifestMediaType != null && !manifestMediaType.equals(EMPTY_STRING)) {
+				// if not mimetype file exists, the root document mediaType from
+				// the manifest.xml is taken
+				mMediaType = manifestMediaType;
+			}
+			if (mErrorHandler != null) {
+				logValidationWarning(OdfPackageConstraint.MIMETYPE_NOT_IN_PACKAGE, getBaseURI());
+			}
+		}
+	}
+	
+	private void validateMimeTypeEntry(ZipEntry mimetypeEntry, String firstEntryName) throws SAXException {
+		
+		if (mimetypeEntry.getMethod() != ZipEntry.STORED) {
+			logValidationError(OdfPackageConstraint.MIMETYPE_IS_COMPRESSED, getBaseURI());
+		}
+		if (mimetypeEntry.getExtra() != null) {
+			logValidationError(OdfPackageConstraint.MIMETYPE_HAS_EXTRA_FIELD, getBaseURI());
+		}
+		if (!OdfFile.MEDIA_TYPE.getPath().equals(firstEntryName)) {
+			logValidationError(OdfPackageConstraint.MIMETYPE_NOT_FIRST_IN_PACKAGE, getBaseURI());
+		}
+	}
+	
+	/** @returns the media type of the root document from the manifest.xml */
+	private String getMediaTypeFromManifest() {
+		OdfFileEntry rootDocumentEntry = mManifestEntries.get(SLASH);
+		if (rootDocumentEntry != null) {
+			return rootDocumentEntry.getMediaTypeString();
+		} else {
+			return null;
+		}
+	}
+	
+	/** @returns the media type of the root document from the manifest.xml */
+	private String getMediaTypeFromEntry(ZipEntry mimetypeEntry) {
+		String entryMediaType = null;
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		try {
+			StreamHelper.transformStream(mZipFile.getInputStream(mimetypeEntry), out);
+			entryMediaType = new String(out.toByteArray(), 0, out.size(), "UTF-8");
+		} catch (Exception ex) {
+			Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+		} finally {
+			if (out != null) {
+				try {
+					out.close();
+				} catch (IOException ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+				out = null;
+			}
+		}
+		return entryMediaType;
+	}
+	
+	/**
+	 * Insert an Odf document into the package at the given path. The path has
+	 * to be a directory and will receive the MIME type of the
+	 * OdfPackageDocument.
+	 * 
+	 * @param doc
+	 *            the OdfPackageDocument to be inserted.
+	 * @param internalPath
+	 *            path relative to the package root, where the document should
+	 *            be inserted.
+	 */
+	void cacheDocument(OdfPackageDocument doc, String internalPath) {
+		internalPath = normalizeDirectoryPath(internalPath);
+		updateFileEntry(ensureFileEntryExistence(internalPath), doc.getMediaTypeString());
+		mPkgDocuments.put(internalPath, doc);
+	}
+	
+	/**
+	 * Set the baseURI for this ODF package. NOTE: Should only be set during
+	 * saving the package.
+	 * 
+	 * @param baseURI
+	 *            defining the location of the package
+	 */
+	void setBaseURI(String baseURI) {
+		mBaseURI = baseURI;
+	}
+	
+	/**
+	 * @return The URI to the ODF package, usually the URL, where this ODF
+	 *         package is located. If the package has not URI NULL is returned.
+	 *         This is the case if the package was new created without an URI
+	 *         and not saved before.
+	 */
+	public String getBaseURI() {
+		return mBaseURI;
+	}
+	
+	/**
+	 * Returns on ODF documents based a given mediatype.
+	 * 
+	 * @param internalPath
+	 *            path relative to the package root, where the document should
+	 *            be inserted.
+	 * @return The ODF document, which mediatype dependends on the parameter or
+	 *         NULL if media type were not supported.
+	 */
+	public OdfPackageDocument loadDocument(String internalPath) {
+		OdfPackageDocument doc = getCachedDocument(internalPath);
+		if (doc == null) {
+			String mediaTypeString = getMediaTypeString();
+			// ToDo: Issue 265 - Remove dependency to higher layer by factory
+			OdfMediaType odfMediaType = OdfMediaType.getOdfMediaType(mediaTypeString);
+			if (odfMediaType == null) {
+				doc = new OdfPackageDocument(this, internalPath, mediaTypeString);
+			} else {
+				try {
+					String documentMediaType = getMediaTypeString(internalPath);
+					odfMediaType = OdfMediaType.getOdfMediaType(documentMediaType);
+					if (odfMediaType == null) {
+						return null;
+					}
+					// ToDo: Issue 265 - Remove dependency to higher layer by
+					// facotory
+					doc = OdfDocument.loadDocument(this, internalPath);
+				} catch (Exception ex) {
+					Logger.getLogger(OdfPackageDocument.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		}
+		return doc;
+	}
+	
+	/**
+	 * @deprecated This method is only added temporary as workaround for the IBM
+	 *             fork using different DOC classes. Until the registering of
+	 *             DOC documents to the PKG layer has been finished.
+	 * @param internalPath
+	 *            path relative to the package root, where the document should
+	 *            be inserted.
+	 * @return an already open OdfPackageDocument via its path, otherwise NULL.
+	 */
+	@Deprecated
+	public OdfPackageDocument getCachedDocument(String internalPath) {
+		internalPath = normalizeDirectoryPath(internalPath);
+		return mPkgDocuments.get(internalPath);
+	}
+	
+	/**
+	 * @param dom
+	 *            the DOM tree that has been parsed and should be added to the
+	 *            cache.
+	 * @param internalPath
+	 *            path relative to the package root, where the XML of the DOM is
+	 *            located.
+	 * @return an already open OdfPackageDocument via its path, otherwise NULL.
+	 */
+	void cacheDom(Document dom, String internalPath) {
+		internalPath = normalizeFilePath(internalPath);
+		this.insert(dom, internalPath, null);
+	}
+	
+	/**
+	 * @param internalPath
+	 *            path relative to the package root, where the document should
+	 *            be inserted.
+	 * @return an already open W3C XML Documenet via its path, otherwise NULL.
+	 */
+	Document getCachedDom(String internalPath) {
+		internalPath = normalizeFilePath(internalPath);
+		return this.mPkgDoms.get(internalPath);
+	}
+	
+	/**
+	 * @return a map with all open W3C XML documents with their internal package
+	 *         path as key.
+	 */
+	Map<String, Document> getCachedDoms() {
+		return this.mPkgDoms;
+	}
+	
+	/**
+	 * Removes a document from the package via its path. Independent if it was
+	 * already opened or not.
+	 * 
+	 * @param internalPath
+	 *            path relative to the package root, where the document should
+	 *            be removed.
+	 */
+	public void removeDocument(String internalPath) {
+		// Note: the EMPTY String for rrot path will be exchanged to a SLASH
+		internalPath = normalizeDirectoryPath(internalPath);
+		try {
+			// get all files of the package
+			Set<String> allPackageFileNames = getFilePaths();
+			
+			// If the document is the root document
+			// the "/" representing the root document is outside the
+			// manifest.xml in the API an empty path
+			// still normalizeDirectoryPath() already exchanged the EMPTY_STRING
+			// to SLASH
+			if (internalPath.equals(SLASH)) {
+				for (String entryName : allPackageFileNames) {
+					remove(entryName);
+				}
+				remove(SLASH);
+			} else {
+				// remove all the stream of the directory, such as pictures
+				List<String> directoryEntryNames = new ArrayList<String>();
+				for (String entryName : allPackageFileNames) {
+					if (entryName.startsWith(internalPath)) {
+						directoryEntryNames.add(entryName);
+					}
+				}
+				for (String entryName : directoryEntryNames) {
+					remove(entryName);
+				}
+				remove(internalPath);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(OdfPackageDocument.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		
+	}
+	
+	/** @return all currently opened OdfPackageDocument of this OdfPackage */
+	Set<String> getCachedPackageDocuments() {
+		return mPkgDocuments.keySet();
+	}
+	
+	public OdfPackageDocument getRootDocument() {
+		return mPkgDocuments.get(OdfPackageDocument.ROOT_DOCUMENT_PATH);
+	}
+	
+	public OdfManifestDom getManifestDom() {
+		return mManifestDom;
+	}
+	
+	/**
+	 * Get the media type of the ODF file or document (ie. a directory). A
+	 * directory with a mediatype can be loaded as
+	 * <code>OdfPackageDocument</code>. Note: A directoy is represented by in
+	 * the package as directory with media type
+	 * 
+	 * @param internalPath
+	 *            within the package of the file or document.
+	 * @return the mediaType for the resource of the given path
+	 */
+	public String getMediaTypeString(String internalPath) {
+		String mediaType = null;
+		if (internalPath != null) {
+			if (internalPath.equals(EMPTY_STRING) || internalPath.equals(SLASH)) {
+				return mMediaType;
+			} else {
+				mediaType = getMediaTypeFromEntry(normalizePath(internalPath));
+				// if no file was found, look for a normalized directory name
+				if (mediaType == null) {
+					mediaType = getMediaTypeFromEntry(normalizeDirectoryPath(internalPath));
+				}
+			}
+		}
+		return mediaType;
+	}
+	
+	private String getMediaTypeFromEntry(String internalPath) {
+		OdfFileEntry entry = getFileEntry(internalPath);
+		// if the document is not in the package, the return is NULL
+		if (entry != null) {
+			return entry.getMediaTypeString();
+		} else {
+			return null;
+		}
+	}
+	
+	/**
+	 * Get the media type of the ODF package (equal to media type of ODF root
+	 * document)
+	 * 
+	 * @return the mediaType string of this ODF package
+	 */
+	public String getMediaTypeString() {
+		return mMediaType;
+	}
+	
+	/**
+	 * Set the media type of the ODF package (equal to media type of ODF root
+	 * document)
+	 * 
+	 * @param mediaType
+	 *            string of this ODF package
+	 */
+	void setMediaTypeString(String mediaType) {
+		mMediaType = mediaType;
+	}
+	
+	/**
+	 * Get an OdfFileEntry for the internalPath NOTE: This method should be
+	 * better moved to a DOM inherited Manifest class
+	 * 
+	 * @param internalPath
+	 *            The relative package path within the ODF package
+	 * @return The manifest file entry will be returned.
+	 */
+	public OdfFileEntry getFileEntry(String internalPath) {
+		internalPath = normalizeFilePath(internalPath);
+		return mManifestEntries.get(internalPath);
+	}
+	
+	/**
+	 * Get a OdfFileEntries from the manifest file (i.e. /META/manifest.xml")
+	 * 
+	 * @return The paths of the manifest file entries will be returned.
+	 */
+	public Set<String> getFilePaths() {
+		return mManifestEntries.keySet();
+	}
+	
+	/**
+	 * Check existence of a file in the package.
+	 * 
+	 * @param internalPath
+	 *            The relative package documentURL within the ODF package
+	 * @return True if there is an entry and a file for the given documentURL
+	 */
+	public boolean contains(String internalPath) {
+		internalPath = normalizeFilePath(internalPath);
+		return mManifestEntries.containsKey(internalPath);
+	}
+	
+	/**
+	 * Save the package to given documentURL.
+	 * 
+	 * @param odfPath
+	 *            - the path to the ODF package destination
+	 * @throws java.lang.Exception
+	 *             - if the package could not be saved
+	 */
+	public void save(String odfPath) throws Exception {
+		File f = new File(odfPath);
+		save(f);
+	}
+	
+	/**
+	 * Save package to a given File. After saving it is still necessary to close
+	 * the package to have again full access about the file.
+	 * 
+	 * @param pkgFile
+	 *            - the File to save the ODF package to
+	 * @throws java.lang.Exception
+	 *             - if the package could not be saved
+	 */
+	public void save(File pkgFile) throws Exception {
+		String baseURL = getBaseURLFromFile(pkgFile);
+		// if (baseURL.equals(mBaseURI)) {
+		// // save to the same file: cache everything first
+		// // ToDo: (Issue 219 - PackageRefactoring) --maybe it's better to
+		// write to a new file and copy that
+		// // to the original one - would be less memory footprint
+		// cacheContent();
+		// }
+		FileOutputStream fos = new FileOutputStream(pkgFile);
+		save(fos, baseURL);
+	}
+	
+	public void save(OutputStream odfStream) throws Exception {
+		save(odfStream, null);
+	}
+	
+	/**
+	 * Sets the password of this package. if password is not null, package will
+	 * be encrypted when save.
+	 * 
+	 * @param password
+	 *            password
+	 * @since 0.8.9
+	 */
+	public void setPassword(String password) {
+		newPwd = password;
+	}
+	
+	/**
+	 * Save an ODF document to the OutputStream.
+	 * 
+	 * @param odfStream
+	 *            - the OutputStream to insert content to
+	 * @param baseURL
+	 *            defining the location of the package
+	 * @throws java.lang.Exception
+	 *             - if the package could not be saved
+	 */
+	private void save(OutputStream odfStream, String baseURL) throws Exception {
+		// try {
+		mBaseURI = baseURL;
+		OdfFileEntry rootEntry = mManifestEntries.get(SLASH);
+		if (rootEntry == null) {
+			rootEntry = new OdfFileEntry(getManifestDom().getRootElement().newFileEntryElement(SLASH, mMediaType));
+			mManifestEntries.put(SLASH, rootEntry);
+		} else {
+			rootEntry.setMediaTypeString(mMediaType);
+		}
+		ZipOutputStream zos = new ZipOutputStream(odfStream);
+		try {
+			// remove mediatype path and use it as first
+			this.mManifestEntries.remove(OdfFile.MEDIA_TYPE.getPath());
+			Iterator<String> it = mManifestEntries.keySet().iterator();
+			String path = null;
+			boolean isFirstFile = true;
+			CRC32 crc = new CRC32();
+			long modTime = (new java.util.Date()).getTime();
+			byte[] data = null;
+			while (it.hasNext() || isFirstFile) {
+				// try {
+				// ODF requires the "mimetype" file to be at first in the
+				// package
+				if (isFirstFile) {
+					isFirstFile = false;
+					// create "mimetype" from current attribute value
+					data = mMediaType.getBytes("UTF-8");
+					createZipEntry(OdfFile.MEDIA_TYPE.getPath(), data, zos, modTime, crc);
+				} else {
+					path = it.next();
+					// not interested to reuse previous mediaType nor
+					// manifest from ZIP
+					if (!path.endsWith(SLASH) && !path.equals(OdfPackage.OdfFile.MANIFEST.getPath()) && !path.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) {
+						data = getBytes(path);
+						createZipEntry(path, data, zos, modTime, crc);
+					}
+				}
+				data = null;
+				// } catch (IOException ex) {
+				// Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE,
+				// null, ex);
+				// }
+			}
+			// Create "META-INF/" directory
+			createZipEntry("META-INF/", null, zos, modTime, crc);
+			// Create "META-INF/manifest.xml" file
+			data = getBytes(OdfFile.MANIFEST.getPath());
+			createZipEntry(OdfFile.MANIFEST.getPath(), data, zos, modTime, crc);
+		} finally {
+			zos.close();
+		}
+		odfStream.flush();
+		// } catch (IOException ex) {
+		// Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null,
+		// ex);
+		// }
+	}
+	
+	private void createZipEntry(String path, byte[] data, ZipOutputStream zos, long modTime, CRC32 crc) throws IOException {
+		ZipEntry ze = null;
+		// try {
+		ze = mZipEntries.get(path);
+		if (ze == null) {
+			ze = new ZipEntry(path);
+		}
+		ze.setTime(modTime);
+		if (fileNeedsCompression(path)) {
+			ze.setMethod(ZipEntry.DEFLATED);
+		} else {
+			ze.setMethod(ZipEntry.STORED);
+		}
+		crc.reset();
+		if (data != null) {
+			OdfFileEntry fileEntry = mManifestEntries.get(path);
+			// encrypt file
+			if (data.length > 0 && fileNeedsEncryption(path)) {
+				data = encryptData(data, fileEntry);
+				// encrypted file entries shall be flagged as 'STORED'.
+				ze.setMethod(ZipEntry.STORED);
+				// the size of the encrypted file should replace the real
+				// size value.
+				ze.setCompressedSize(data.length);
+			} else {
+				if (fileEntry != null) {
+					fileEntry.setSize(null);
+					FileEntryElement fileEntryEle = fileEntry.getOdfElement();
+					EncryptionDataElement encryptionDataElement = OdfElement.findFirstChildNode(EncryptionDataElement.class, fileEntryEle);
+					while (encryptionDataElement != null) {
+						fileEntryEle.removeChild(encryptionDataElement);
+						encryptionDataElement = OdfElement.findFirstChildNode(EncryptionDataElement.class, fileEntryEle);
+					}
+				}
+				ze.setCompressedSize(-1);
+			}
+			ze.setSize(data.length);
+			crc.update(data);
+			ze.setCrc(crc.getValue());
+		} else {
+			ze.setSize(0);
+			ze.setCrc(0);
+			ze.setCompressedSize(-1);
+		}
+		zos.putNextEntry(ze);
+		if (data != null) {
+			zos.write(data, 0, data.length);
+		}
+		zos.closeEntry();
+		mZipEntries.put(path, ze);
+		// } catch (IOException ex) {
+		// Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null,
+		// ex);
+		// }
+	}
+	
+	/**
+	 * Determines if a file have to be encrypted.
+	 * 
+	 * @param internalPath
+	 *            the file location
+	 * @return true if the file needs encrypted, false, otherwise
+	 */
+	private boolean fileNeedsEncryption(String internalPath) {
+		if (newPwd != null) {
+			// ODF spec does not allow encrytion of "./mimetype" file
+			if (internalPath.endsWith(SLASH) || OdfFile.MANIFEST.getPath().equals(internalPath) || OdfPackage.OdfFile.MEDIA_TYPE.getPath().equals(internalPath)) {
+				return false;
+			}
+			return fileNeedsCompression(internalPath);
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * Determines if a file have to be compressed.
+	 * 
+	 * @param internalPath
+	 *            the file location
+	 * @return true if the file needs compression, false, otherwise
+	 */
+	private boolean fileNeedsCompression(String internalPath) {
+		boolean result = true;
+		
+		// ODF spec does not allow compression of "./mimetype" file
+		if (internalPath.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) {
+			return false;
+		}
+		// see if the file was already compressed
+		if (internalPath.lastIndexOf(".") > 0) {
+			String suffix = internalPath.substring(internalPath.lastIndexOf(".") + 1, internalPath.length());
+			if (mCompressedFileTypes.contains(suffix.toLowerCase())) {
+				result = false;
+			}
+		}
+		return result;
+	}
+	
+	private void close(Closeable closeable) throws SAXException, IOException {
+		if (closeable != null) {
+			try {
+				closeable.close();
+			} catch (IOException ioe) {
+				// Warning only. This is usually just logged.
+				// Allow user to throw an exception all the same
+				handleIOException(ioe, true);
+			}
+		}
+	}
+	
+	private void handleIOException(IOException ex, boolean warningOnly) throws SAXException, IOException {
+		if (mErrorHandler != null) {
+			SAXParseException se = new SAXParseException(ex.getMessage(), null, ex);
+			try {
+				if (warningOnly) {
+					mErrorHandler.warning(se);
+				} else {
+					mErrorHandler.error(se);
+				}
+			} catch (SAXException e1) {
+				if (e1 == se) {
+					throw ex;
+					// We re-throw the original exception if the error handler
+					// just threw the SAXException we gave it.
+				} else {
+					throw e1; // Throw what the error handler threw.
+				}
+			}
+		}
+		throw ex; // No error handler? Just throw the original IOException
+	}
+	
+	/**
+	 * Close the OdfPackage after it is no longer needed. Even after saving it
+	 * is still necessary to close the package to have again full access about
+	 * the file. Closing the OdfPackage will release all temporary created data.
+	 * Do this as the last action to free resources. Closing an already closed
+	 * document has no effect.
+	 */
+	public void close() {
+		if (mZipFile != null) {
+			try {
+				mZipFile.close();
+			} catch (IOException ex) {
+				// log exception and continue
+				Logger.getLogger(OdfPackage.class.getName()).log(Level.INFO, null, ex);
+			}
+		}
+		// release all stuff - this class is impossible to use afterwards
+		mZipFile = null;
+		mMediaType = null;
+		mZipEntries = null;
+		mPkgDoms = null;
+		mMemoryFileCache = null;
+		mManifestEntries = null;
+		mBaseURI = null;
+		mResolver = null;
+	}
+	
+	/**
+	 * Parse the Manifest file
+	 */
+	private void parseManifest() throws Exception {
+		// ToDo: manifest.xml will be held in the future as DOM, now its
+		// being generated for each save()
+		// try {
+		mManifestDom = (OdfManifestDom) OdfFileDom.newFileDom(this, OdfFile.MANIFEST.getPath());
+		ManifestElement manifestEle = mManifestDom.getRootElement();
+		if (manifestEle != null) {
+			setManifestVersion(manifestEle.getVersionAttribute());
+		} else {
+			logValidationError(OdfPackageConstraint.MANIFEST_NOT_IN_PACKAGE, getBaseURI());
+		}
+		Map<String, OdfFileEntry> entries = getManifestEntries();
+		FileEntryElement fileEntryEle = OdfElement.findFirstChildNode(FileEntryElement.class, manifestEle);
+		while (fileEntryEle != null) {
+			String path = fileEntryEle.getFullPathAttribute();
+			if (path.equals(EMPTY_STRING)) {
+				if (getErrorHandler() != null) {
+					logValidationError(OdfPackageConstraint.MANIFEST_WITH_EMPTY_PATH, getBaseURI());
+				}
+			}
+			path = normalizePath(path);
+			OdfFileEntry currentFileEntry = entries.get(path);
+			if (currentFileEntry == null) {
+				currentFileEntry = new OdfFileEntry(fileEntryEle);
+			}
+			if (path != null) {
+				entries.put(path, currentFileEntry);
+			}
+			fileEntryEle = OdfElement.findNextChildNode(FileEntryElement.class, fileEntryEle);
+		}
+		mMemoryFileCache.remove(OdfFile.MANIFEST.getPath());
+		mPkgDoms.put(OdfFile.MANIFEST.getPath(), mManifestDom);
+		// } catch (Exception ex) {
+		// Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null,
+		// ex);
+		// }
+	}
+	
+	XMLReader getXMLReader() throws ParserConfigurationException, SAXException {
+		// create sax parser
+		SAXParserFactory saxFactory = new org.apache.xerces.jaxp.SAXParserFactoryImpl();
+		saxFactory.setNamespaceAware(true);
+		saxFactory.setValidating(false);
+		try {
+			saxFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		
+		SAXParser parser = saxFactory.newSAXParser();
+		XMLReader xmlReader = parser.getXMLReader();
+		// More details at
+		// http://xerces.apache.org/xerces2-j/features.html#namespaces
+		xmlReader.setFeature("http://xml.org/sax/features/namespaces", true);
+		// More details at
+		// http://xerces.apache.org/xerces2-j/features.html#namespace-prefixes
+		xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
+		// More details at
+		// http://xerces.apache.org/xerces2-j/features.html#xmlns-uris
+		xmlReader.setFeature("http://xml.org/sax/features/xmlns-uris", true);
+		return xmlReader;
+	}
+	
+	// Add the given path and all its subdirectories to the internalPath list
+	// to be written later to the manifest
+	private void createSubEntries(String internalPath) {
+		ManifestElement manifestEle = getManifestDom().getRootElement();
+		StringTokenizer tok = new StringTokenizer(internalPath, SLASH);
+		if (tok.countTokens() > 1) {
+			String path = EMPTY_STRING;
+			while (tok.hasMoreTokens()) {
+				String directory = tok.nextToken();
+				// it is a directory, if there are more token
+				if (tok.hasMoreTokens()) {
+					path = path + directory + SLASH;
+					OdfFileEntry fileEntry = mManifestEntries.get(path);
+					if (fileEntry == null) {
+						mManifestEntries.put(path, new OdfFileEntry(manifestEle.newFileEntryElement(path, null)));
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Insert DOM tree into OdfPackage. An existing file will be replaced.
+	 * 
+	 * @param fileDOM
+	 *            - XML DOM tree to be inserted as file.
+	 * @param internalPath
+	 *            - relative documentURL where the DOM tree should be inserted
+	 *            as XML file
+	 * @param mediaType
+	 *            - media type of stream. Set to null if unknown
+	 * @throws java.lang.Exception
+	 *             when the DOM tree could not be inserted
+	 */
+	public void insert(Document fileDOM, String internalPath, String mediaType) {
+		internalPath = normalizeFilePath(internalPath);
+		if (mediaType == null) {
+			mediaType = XML_MEDIA_TYPE;
+		}
+		if (fileDOM == null) {
+			mPkgDoms.remove(internalPath);
+		} else {
+			mPkgDoms.put(internalPath, fileDOM);
+		}
+		if (!internalPath.endsWith(OdfFile.MANIFEST.internalPath)) {
+			updateFileEntry(ensureFileEntryExistence(internalPath), mediaType);
+		}
+		// remove byte array version of new DOM
+		mMemoryFileCache.remove(internalPath);
+	}
+	
+	/**
+	 * Embed an OdfPackageDocument to the current OdfPackage. All the file
+	 * entries of child document will be inserted.
+	 * 
+	 * @param sourceDocument
+	 *            the OdfPackageDocument to be embedded.
+	 * @param internalPath
+	 *            path to the directory the ODF document should be inserted
+	 *            (relative to ODF package root).
+	 */
+	public void insertDocument(OdfPackageDocument sourceDocument, String internalPath) {
+		internalPath = normalizeDirectoryPath(internalPath);
+		// opened DOM of descendant Documents will be flashed to the their pkg
+		flushDoms(sourceDocument);
+		
+		// Gets the OdfDocument's manifest entry info, no matter it is a
+		// independent document or an embeddedDocument.
+		Map<String, OdfFileEntry> entryMapToCopy;
+		if (sourceDocument.isRootDocument()) {
+			entryMapToCopy = sourceDocument.getPackage().getManifestEntries();
+		} else {
+			entryMapToCopy = sourceDocument.getPackage().getSubDirectoryEntries(this, sourceDocument.getDocumentPath());
+		}
+		// insert to package and add it to the Manifest
+		internalPath = sourceDocument.setDocumentPath(internalPath);
+		String documentDirectory = null;
+		if (internalPath.equals(SLASH)) {
+			documentDirectory = EMPTY_STRING;
+		} else {
+			documentDirectory = internalPath;
+		}
+		Set<String> entryNameList = entryMapToCopy.keySet();
+		for (String entryName : entryNameList) {
+			OdfFileEntry entry = entryMapToCopy.get(entryName);
+			if (entry != null) {
+				try {
+					// if entry is a directory (e.g. an ODF document root)
+					if (entryName.endsWith(SLASH)) {
+						// insert directory
+						if (entryName.equals(SLASH)) {
+							insert((byte[]) null, documentDirectory, sourceDocument.getMediaTypeString());
+						} else {
+							insert((byte[]) null, documentDirectory + entry.getPath(), entry.getMediaTypeString());
+						}
+					} else {
+						String packagePath = documentDirectory + entry.getPath();
+						insert(sourceDocument.getPackage().getInputStream(entryName), packagePath, entry.getMediaTypeString());
+					}
+				} catch (Exception ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		}
+		// make sure the media type of embedded Document is right set.
+		ManifestElement manifestEle = mManifestDom.getRootElement();
+		OdfFileEntry embedDocumentRootEntry = new OdfFileEntry(manifestEle.newFileEntryElement(internalPath, sourceDocument.getMediaTypeString()));
+		mManifestEntries.put(internalPath, embedDocumentRootEntry);
+		// the new document will be attached to its new package (it has been
+		// inserted to)
+		sourceDocument.setPackage(this);
+		cacheDocument(sourceDocument, internalPath);
+	}
+	
+	/**
+	 * Insert all open DOMs of XML files beyond parent document to the package.
+	 * The XML files will be updated in the package after calling save.
+	 * 
+	 * @param parentDocument
+	 *            the document, which XML files shall be serialized
+	 */
+	void flushDoms(OdfPackageDocument parentDocument) {
+		OdfPackage pkg = parentDocument.getPackage();
+		if (parentDocument.isRootDocument()) {
+			// for every parsed XML file (DOM)
+			for (String xmlFilePath : pkg.getCachedDoms().keySet()) {
+				// insert it to the package (serializing and caching it till
+				// final save)
+				pkg.insert(pkg.getCachedDom(xmlFilePath), xmlFilePath, "text/xml");
+			}
+		} else {
+			// if not root document, check ..
+			String parentDocumentPath = parentDocument.getDocumentPath();
+			// for every parsed XML file (DOM)
+			for (String xmlFilePath : pkg.getCachedDoms().keySet()) {
+				// if the file is within the given document
+				if (xmlFilePath.startsWith(parentDocumentPath)) {
+					// insert it to the package (serializing and caching it till
+					// final save)
+					pkg.insert(pkg.getCachedDom(xmlFilePath), xmlFilePath, "text/xml");
+				}
+			}
+		}
+	}
+	
+	/** Get all the file entries from a sub directory */
+	private Map<String, OdfFileEntry> getSubDirectoryEntries(OdfPackage destinationPackage, String directory) {
+		directory = normalizeDirectoryPath(directory);
+		Map<String, OdfFileEntry> subEntries = new HashMap<String, OdfFileEntry>();
+		Map<String, OdfFileEntry> allEntries = getManifestEntries();
+		Set<String> rootEntryNameSet = getFilePaths();
+		ManifestElement manifestEle = destinationPackage.getManifestDom().getRootElement();
+		for (String entryName : rootEntryNameSet) {
+			if (entryName.startsWith(directory)) {
+				String newEntryName = entryName.substring(directory.length());
+				if (newEntryName.length() == 0) {
+					newEntryName = SLASH;
+				}
+				OdfFileEntry srcFileEntry = allEntries.get(entryName);
+				OdfFileEntry newFileEntry = new OdfFileEntry(manifestEle.newFileEntryElement(newEntryName, srcFileEntry.getMediaTypeString()));
+				newFileEntry.setEncryptionData(srcFileEntry.getEncryptionData());
+				newFileEntry.setSize(srcFileEntry.getSize());
+				subEntries.put(entryName, newFileEntry);
+			}
+		}
+		return subEntries;
+	}
+	
+	/**
+	 * Method returns the paths of all document within the package.
+	 * 
+	 * @return A set of paths of all documents of the package, including the
+	 *         root document.
+	 */
+	public Set<String> getDocumentPaths() {
+		return getDocumentPaths(null, null);
+	}
+	
+	/**
+	 * Method returns the paths of all document within the package matching the
+	 * given criteria.
+	 * 
+	 * @param mediaTypeString
+	 *            limits the desired set of document paths to documents of the
+	 *            given mediaType
+	 * @return A set of paths of all documents of the package, including the
+	 *         root document, that match the given parameter.
+	 */
+	public Set<String> getDocumentPaths(String mediaTypeString) {
+		return getDocumentPaths(mediaTypeString, null);
+	}
+	
+	/**
+	 * Method returns the paths of all document within the package matching the
+	 * given criteria.
+	 * 
+	 * @param mediaTypeString
+	 *            limits the desired set of document paths to documents of the
+	 *            given mediaType
+	 * @param subDirectory
+	 *            limits the desired set document paths to those documents below
+	 *            of this subdirectory
+	 * @return A set of paths of all documents of the package, including the
+	 *         root document, that match the given parameter.
+	 */
+	Set<String> getDocumentPaths(String mediaTypeString, String subDirectory) {
+		Set<String> innerDocuments = new HashSet<String>();
+		Set<String> packageFilePaths = getFilePaths();
+		// check manifest for current embedded OdfPackageDocuments
+		for (String filePath : packageFilePaths) {
+			// check if a subdirectory was the criteria and if the files are
+			// beyond the given subdirectory
+			if (subDirectory == null || filePath.startsWith(subDirectory) && !filePath.equals(subDirectory)) {
+				// with documentURL is not empty and is a directory (ie. a
+				// potential document)
+				if (filePath.length() > 1 && filePath.endsWith(SLASH)) {
+					String fileMediaType = getFileEntry(filePath).getMediaTypeString();
+					if (fileMediaType != null && !fileMediaType.equals(EMPTY_STRING)) {
+						// check if a certain mediaType was the critera and was
+						// matched
+						if (mediaTypeString == null || mediaTypeString.equals(fileMediaType)) {
+							// only relative path is allowed as path
+							innerDocuments.add(filePath);
+						}
+					}
+				}
+			}
+		}
+		return innerDocuments;
+	}
+	
+	/**
+	 * Adding a manifest:file-entry to be saved in manifest.xml. In addition,
+	 * sub directories will be added as well to the manifest.
+	 */
+	private OdfFileEntry ensureFileEntryExistence(String internalPath) {
+		// if it is NOT the resource "/META-INF/manifest.xml"
+		OdfFileEntry fileEntry = null;
+		if (!OdfFile.MANIFEST.internalPath.equals(internalPath) || !internalPath.equals(EMPTY_STRING)) {
+			if (mManifestEntries == null) {
+				mManifestEntries = new HashMap<String, OdfFileEntry>();
+			}
+			fileEntry = mManifestEntries.get(internalPath);
+			// for every new file entry
+			if (fileEntry == null) {
+				ManifestElement manifestEle = getManifestDom().getRootElement();
+				if (manifestEle == null)
+					return null;
+				fileEntry = new OdfFileEntry(manifestEle.newFileEntryElement(internalPath, ""));
+				mManifestEntries.put(internalPath, fileEntry);
+				// creates recursive file entries for all sub directories
+				createSubEntries(internalPath);
+			}
+		}
+		return fileEntry;
+	}
+	
+	/**
+	 * update file entry setting.
+	 */
+	private void updateFileEntry(OdfFileEntry fileEntry, String mediaType) {
+		// overwrite previous settings
+		fileEntry.setMediaTypeString(mediaType);
+		// reset encryption data (ODFDOM does not support encryption yet)
+		fileEntry.setEncryptionData(null);
+		// reset size to be unset
+		fileEntry.setSize(null);
+	}
+	
+	/**
+	 * Gets org.w3c.dom.Document for XML file contained in package.
+	 * 
+	 * @param internalPath
+	 *            to a file within the Odf Package (eg. content.xml)
+	 * @return an org.w3c.dom.Document
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 */
+	public Document getDom(String internalPath) throws SAXException, ParserConfigurationException, IllegalArgumentException, TransformerConfigurationException, TransformerException, IOException {
+		
+		Document doc = mPkgDoms.get(internalPath);
+		if (doc != null) {
+			return doc;
+		}
+		
+		InputStream is = getInputStream(internalPath);
+		
+		// We depend on Xerces. So we just go ahead and create a Xerces DBF,
+		// without
+		// forcing everything else to do so.
+		DocumentBuilderFactory factory = new org.apache.xerces.jaxp.DocumentBuilderFactoryImpl();
+		factory.setNamespaceAware(true);
+		factory.setValidating(false);
+		
+		DocumentBuilder builder = factory.newDocumentBuilder();
+		builder.setEntityResolver(getEntityResolver());
+		
+		String uri = getBaseURI() + internalPath;
+		
+		if (mErrorHandler != null) {
+			builder.setErrorHandler(mErrorHandler);
+		}
+		
+		InputSource ins = new InputSource(is);
+		ins.setSystemId(uri);
+		
+		doc = builder.parse(ins);
+		
+		if (doc != null) {
+			mPkgDoms.put(internalPath, doc);
+			mMemoryFileCache.remove(internalPath);
+		}
+		return doc;
+	}
+	
+	/**
+	 * Inserts an external file into an OdfPackage. An existing file will be
+	 * replaced.
+	 * 
+	 * @param sourceURI
+	 *            - the source URI to the file to be inserted into the package.
+	 * @param internalPath
+	 *            - relative documentURL where the tree should be inserted as
+	 *            XML file
+	 * @param mediaType
+	 *            - media type of stream. Set to null if unknown
+	 * @throws java.lang.Exception
+	 *             In case the file could not be saved
+	 */
+	public void insert(URI sourceURI, String internalPath, String mediaType) throws Exception {
+		InputStream is = null;
+		if (sourceURI.isAbsolute()) {
+			// if the URI is absolute it can be converted to URL
+			is = sourceURI.toURL().openStream();
+		} else {
+			// otherwise create a file class to open the stream
+			is = new FileInputStream(sourceURI.toString());
+		}
+		insert(is, internalPath, mediaType);
+	}
+	
+	/**
+	 * Inserts InputStream into an OdfPackage. An existing file will be
+	 * replaced.
+	 * 
+	 * @param fileStream
+	 *            - the stream of the file to be inserted into the ODF package.
+	 * @param internalPath
+	 *            - relative documentURL where the tree should be inserted as
+	 *            XML file
+	 * @param mediaType
+	 *            - media type of stream. Set to null if unknown
+	 */
+	public void insert(InputStream fileStream, String internalPath, String mediaType) throws Exception {
+		internalPath = normalizeFilePath(internalPath);
+		if (fileStream == null) {
+			// adding a simple directory without MIMETYPE
+			insert((byte[]) null, internalPath, mediaType);
+		} else {
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			BufferedInputStream bis = null;
+			if (fileStream instanceof BufferedInputStream) {
+				bis = (BufferedInputStream) fileStream;
+			} else {
+				bis = new BufferedInputStream(fileStream);
+			}
+			StreamHelper.transformStream(bis, baos);
+			byte[] data = baos.toByteArray();
+			insert(data, internalPath, mediaType);
+		}
+	}
+	
+	/**
+	 * Inserts a byte array into OdfPackage. An existing file will be replaced.
+	 * If the byte array is NULL a directory with the given mimetype will be
+	 * created.
+	 * 
+	 * @param fileBytes
+	 *            - data of the file stream to be stored in package. If NULL a
+	 *            directory with the given mimetype will be created.
+	 * @param internalPath
+	 *            - path of the file or directory relative to the package root.
+	 * @param mediaTypeString
+	 *            - media type of stream. If unknown null can be used.
+	 */
+	public void insert(byte[] fileBytes, String internalPath, String mediaTypeString) {
+		internalPath = normalizeFilePath(internalPath);
+		if (OdfPackage.OdfFile.MEDIA_TYPE.getPath().equals(internalPath)) {
+			try {
+				setMediaTypeString(new String(fileBytes, "UTF-8"));
+			} catch (UnsupportedEncodingException useEx) {
+				Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, "ODF file could not be created as string!", useEx);
+			}
+			return;
+		}
+		if (fileBytes != null) {
+			mMemoryFileCache.put(internalPath, fileBytes);
+			// as DOM would overwrite data cache, any existing DOM cache will be
+			// deleted
+			if (mPkgDoms.containsKey(internalPath)) {
+				mPkgDoms.remove(internalPath);
+			}
+		}
+		updateFileEntry(ensureFileEntryExistence(internalPath), mediaTypeString);
+	}
+	
+	// changed to package access as the manifest interiors are an implementation
+	// detail
+	Map<String, OdfFileEntry> getManifestEntries() {
+		return mManifestEntries;
+	}
+	
+	/**
+	 * Get package (sub-) content as byte array
+	 * 
+	 * @param internalPath
+	 *            relative documentURL to the package content
+	 * @return the unzipped package content as byte array
+	 * @throws java.lang.Exception
+	 */
+	public byte[] getBytes(String internalPath) {
+		// if path is null or empty return null
+		if (internalPath == null || internalPath.equals(EMPTY_STRING)) {
+			return null;
+		}
+		internalPath = normalizeFilePath(internalPath);
+		byte[] data = null;
+		// if the file is "mimetype"
+		if (internalPath.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) {
+			if (mMediaType == null) {
+				return null;
+			} else {
+				try {
+					data = mMediaType.getBytes("UTF-8");
+				} catch (UnsupportedEncodingException use) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, use);
+					return null;
+				}
+			}
+		} else if (mPkgDoms.get(internalPath) != null) {
+			data = flushDom(mPkgDoms.get(internalPath));
+			mMemoryFileCache.put(internalPath, data);
+			// if the path's file was cached to memory (second high priority)
+		} else if (mManifestEntries.containsKey(internalPath) && mMemoryFileCache.get(internalPath) != null) {
+			data = mMemoryFileCache.get(internalPath);
+			
+			// if the path's file was cached to disc (lowest priority)
+		}
+		// if not available, check if file exists in ZIP
+		if (data == null) {
+			ZipEntry entry = null;
+			if ((entry = mZipEntries.get(internalPath)) != null) {
+				InputStream inputStream = null;
+				try {
+					inputStream = mZipFile.getInputStream(entry);
+					if (inputStream != null) {
+						ByteArrayOutputStream out = new ByteArrayOutputStream();
+						StreamHelper.transformStream(inputStream, out);
+						data = out.toByteArray();
+						// decrypt data as needed
+						if (!(internalPath.equals(OdfFile.MEDIA_TYPE.getPath()) || internalPath.equals(OdfFile.MANIFEST.getPath()))) {
+							OdfFileEntry manifestEntry = getManifestEntries().get(internalPath);
+							EncryptionDataElement encryptionDataElement = manifestEntry.getEncryptionData();
+							if (encryptionDataElement != null) {
+								data = decryptData(data, manifestEntry, encryptionDataElement);
+							}
+						}
+						// store for further usage; do not care about manifest:
+						// that is handled exclusively
+						mMemoryFileCache.put(internalPath, data);
+					}
+				} catch (IOException ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				} finally {
+					try {
+						if (inputStream != null) {
+							inputStream.close();
+						}
+					} catch (IOException ex) {
+						Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+					}
+				}
+			}
+		}
+		return data;
+	}
+	
+	// encrypt data and update manifest.
+	private byte[] encryptData(byte[] data, OdfFileEntry fileEntry) {
+		byte[] encryptedData = null;
+		try {
+			// 1.The original uncompressed, unencrypted size is
+			// contained in the manifest:size.
+			fileEntry.setSize(data.length);
+			
+			// 2.Compress with the "deflate" algorithm
+			Deflater compresser = new Deflater(Deflater.DEFLATED, true);
+			compresser.setInput(data);
+			compresser.finish();
+			byte[] compressedData = new byte[data.length];
+			int compressedDataLength = compresser.deflate(compressedData);
+			
+			// 3. The start key is generated: the byte sequence
+			// representing the password in UTF-8 is used to
+			// generate a 20-byte SHA1 digest.
+			byte[] passBytes = newPwd.getBytes("UTF-8");
+			MessageDigest md = MessageDigest.getInstance("SHA1");
+			passBytes = md.digest(passBytes);
+			// 4. Checksum specifies a digest in BASE64 encoding
+			// that can be used to detect password correctness. The
+			// digest is build from the compressed unencrypted file.
+			md.reset();
+			md.update(compressedData, 0, (compressedDataLength > 1024 ? 1024 : compressedDataLength));
+			byte[] checksumBytes = new byte[20];
+			md.digest(checksumBytes, 0, 20);
+			
+			// 5. For each file, a 16-byte salt is generated by a random
+			// generator.
+			// The salt is a BASE64 encoded binary sequence.
+			SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
+			byte[] salt = new byte[16];
+			secureRandom.nextBytes(salt);
+			
+			// char passChars[] = new String(passBytes, "UTF-8").toCharArray();
+			/*
+			 * char passChars[] = new char[20]; for (int i = 0; i <
+			 * passBytes.length; i++) { passChars[i] = (char)
+			 * ((passBytes[i]+256)%256);
+			 * //System.out.println("passChars[i]:"+passChars
+			 * [i]+", passBytes[i]"+passBytes[i]); } //char passChars[] =
+			 * getChars(passBytes); // 6. The PBKDF2 algorithm based on the
+			 * HMAC-SHA-1 function is used for the key derivation.
+			 * SecretKeyFactory factory =
+			 * SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // 7. The
+			 * salt is used together with the start key to derive a unique
+			 * 128-bit key for each file. // The default iteration count for the
+			 * algorithm is 1024. KeySpec spec = new PBEKeySpec(passChars, salt,
+			 * 1024, 128); SecretKey skey = factory.generateSecret(spec); byte[]
+			 * raw = skey.getEncoded(); // algorithm-name="Blowfish CFB"
+			 * SecretKeySpec skeySpec = new SecretKeySpec(raw, "Blowfish");
+			 */
+			
+			byte[] dk = derivePBKDF2Key(passBytes, salt, 1024, 16);
+			SecretKeySpec key = new SecretKeySpec(dk, "Blowfish");
+			// 8.The files are encrypted: The random number
+			// generator is used to generate the 8-byte initialization vector
+			// for the
+			// algorithm. The derived key is used together with the
+			// initialization
+			// vector to encrypt the file using the Blowfish algorithm in cipher
+			// feedback
+			// CFB mode.
+			Cipher cipher = Cipher.getInstance("Blowfish/CFB/NoPadding");
+			// initialisation-vector specifies the byte-sequence used
+			// as an initialization vector to a encryption algorithm. The
+			// initialization vector is a BASE64 encoded binary sequence.
+			byte[] iv = new byte[8];
+			secureRandom.nextBytes(iv);
+			IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+			cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
+			encryptedData = cipher.doFinal(compressedData, 0, compressedDataLength);
+			
+			// 9.update file entry encryption data.
+			String checksum = new Base64Binary(checksumBytes).toString();
+			FileEntryElement fileEntryElement = fileEntry.getOdfElement();
+			EncryptionDataElement encryptionDataElement = OdfElement.findFirstChildNode(EncryptionDataElement.class, fileEntryElement);
+			if (encryptionDataElement != null) {
+				fileEntryElement.removeChild(encryptionDataElement);
+			}
+			encryptionDataElement = fileEntryElement.newEncryptionDataElement(checksum, "SHA1/1K");
+			String initialisationVector = new Base64Binary(iv).toString();
+			AlgorithmElement algorithmElement = OdfElement.findFirstChildNode(AlgorithmElement.class, encryptionDataElement);
+			if (algorithmElement != null) {
+				encryptionDataElement.removeChild(algorithmElement);
+			}
+			algorithmElement = encryptionDataElement.newAlgorithmElement("Blowfish CFB", initialisationVector);
+			String saltStr = new Base64Binary(salt).toString();
+			KeyDerivationElement keyDerivationElement = OdfElement.findFirstChildNode(KeyDerivationElement.class, encryptionDataElement);
+			if (keyDerivationElement != null) {
+				encryptionDataElement.removeChild(keyDerivationElement);
+			}
+			keyDerivationElement = encryptionDataElement.newKeyDerivationElement(1024, "PBKDF2", saltStr);
+			StartKeyGenerationElement startKeyGenerationElement = OdfElement.findFirstChildNode(StartKeyGenerationElement.class, encryptionDataElement);
+			if (startKeyGenerationElement != null) {
+				encryptionDataElement.removeChild(startKeyGenerationElement);
+			}
+			encryptionDataElement.newStartKeyGenerationElement("SHA1").setKeySizeAttribute(20);
+			
+			// System.out.println("full-path=\""+ path +"\"");
+			// System.out.println("size=\""+ data.length +"\"");
+			// System.out.println("checksum=\""+ checksum +"\"");
+			// System.out.println("compressedData ="+compressedDataLength);
+			
+		} catch (Exception e) {
+			// throws NoSuchAlgorithmException,
+			// InvalidKeySpecException, NoSuchPaddingException,
+			// InvalidKeyException,
+			// InvalidAlgorithmParameterException,
+			// IllegalBlockSizeException, BadPaddingException
+			Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return encryptedData;
+	}
+	
+	private byte[] decryptData(byte[] data, OdfFileEntry manifestEntry, EncryptionDataElement encryptionDataElement) {
+		byte[] decompressData = null;
+		try {
+			KeyDerivationElement keyDerivationElement = OdfElement.findFirstChildNode(KeyDerivationElement.class, encryptionDataElement);
+			AlgorithmElement algorithmElement = OdfElement.findFirstChildNode(AlgorithmElement.class, encryptionDataElement);
+			String saltStr = keyDerivationElement.getSaltAttribute();
+			String ivStr = algorithmElement.getInitialisationVectorAttribute();
+			String checksum = encryptionDataElement.getChecksumAttribute();
+			byte[] salt = Base64Binary.valueOf(saltStr).getBytes();
+			byte[] iv = Base64Binary.valueOf(ivStr).getBytes();
+			byte[] passBytes = oldPwd.getBytes("UTF-8");
+			MessageDigest md = MessageDigest.getInstance("SHA-1");
+			passBytes = md.digest(passBytes);
+			/*
+			 * char passChars[] = new char[passBytes.length]; for(int i = 0;
+			 * i<passBytes.length; i++){ passChars[i] =
+			 * (char)(passBytes[i]|0xFF); } KeySpec spec = new
+			 * PBEKeySpec(passChars, salt, 1024, 128); SecretKeyFactory factory
+			 * = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); SecretKey
+			 * skey = factory.generateSecret(spec); byte[] raw =
+			 * skey.getEncoded(); SecretKeySpec skeySpec = new
+			 * SecretKeySpec(raw, "Blowfish");
+			 */
+			byte[] dk = derivePBKDF2Key(passBytes, salt, 1024, 16);
+			SecretKeySpec key = new SecretKeySpec(dk, "Blowfish");
+			
+			Cipher cipher = Cipher.getInstance("Blowfish/CFB/NoPadding");
+			IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+			cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
+			byte[] decryptedData = cipher.doFinal(data);
+			
+			// valid checksum
+			md.reset();
+			md.update(decryptedData, 0, (decryptedData.length > 1024 ? 1024 : decryptedData.length));
+			byte[] checksumBytes = new byte[20];
+			md.digest(checksumBytes, 0, 20);
+			String newChecksum = new Base64Binary(checksumBytes).toString();
+			if (newChecksum.equals(checksum)) {
+				// decompress the bytes
+				Inflater decompresser = new Inflater(true);
+				decompresser.setInput(decryptedData);
+				decompressData = new byte[manifestEntry.getSize()];
+				decompresser.inflate(decompressData);
+				decompresser.end();
+			} else {
+				throw new OdfDecryptedException("The given password is wrong, please check it.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return decompressData;
+	}
+	
+	// derive PBKDF2Key (reference http://www.ietf.org/rfc/rfc2898.txt)
+	byte[] derivePBKDF2Key(byte[] password, byte[] salt, int iterationCount, int keyLength) throws NoSuchAlgorithmException, InvalidKeyException {
+		SecretKeySpec keyspec = new SecretKeySpec(password, "HmacSHA1");
+		Mac hmac = Mac.getInstance("HmacSHA1");
+		hmac.init(keyspec);
+		// length in octets of HmacSHA1 function output, a positive integer
+		int hmacLen = hmac.getMacLength();
+		// let l be the number of hLen-octet blocks in the derived key, rounding
+		// up,
+		// l = CEIL (dkLen / hLen) Here, CEIL (x) is the smallest integer
+		// greater than, or equal to, x.
+		int l = (keyLength % hmacLen > 0) ? (keyLength / hmacLen + 1) : (keyLength / hmacLen);
+		// let r be the number of octets in the last block: r = dkLen - (l - 1)
+		// * hLen .
+		int r = keyLength - (l - 1) * hmacLen;
+		byte T[] = new byte[l * hmacLen];
+		int offset = 0;
+		// For each block of the derived key apply the function F defined below
+		// to the password P, the salt S, the iteration count c, and
+		// the block index to compute the block:
+		for (int i = 1; i <= l; i++) {
+			byte Ur[] = new byte[hmacLen];
+			byte Ui[] = new byte[salt.length + 4];
+			System.arraycopy(salt, 0, Ui, 0, salt.length);
+			// Here, INT (i) is a four-octet encoding of the integer i, most
+			// significant octet first.
+			Ui[salt.length + 0] = (byte) (i >>> 24);
+			Ui[salt.length + 1] = (byte) (i >>> 16);
+			Ui[salt.length + 2] = (byte) (i >>> 8);
+			Ui[salt.length + 3] = (byte) (i);
+			// U_1 \xor U_2 \xor ... \xor U_c
+			for (int j = 0; j < iterationCount; j++) {
+				Ui = hmac.doFinal(Ui);
+				// XOR
+				for (int k = 0; k < T.length; k++) {
+					Ur[k] ^= Ui[k];
+				}
+			}
+			System.arraycopy(Ur, 0, T, offset, hmacLen);
+			offset += hmacLen;
+		}
+		if (r < hmacLen) {
+			byte DK[] = new byte[keyLength];
+			System.arraycopy(T, 0, DK, 0, keyLength);
+			return DK;
+		}
+		return T;
+	}
+	
+	// Serializes a DOM tree into a byte array.
+	// Providing the counterpart of the generic Namespace handling of
+	// OdfFileDom.
+	private byte[] flushDom(Document dom) {
+		// if it is one of our DOM files we may flush all collected namespaces
+		// to the root element
+		if (dom instanceof OdfFileDom) {
+			OdfFileDom odfDom = (OdfFileDom) dom;
+			Map<String, String> nsByUri = odfDom.getMapNamespacePrefixByUri();
+			OdfElement root = odfDom.getRootElement();
+			if (root != null) {
+				for (Entry<String, String> entry : nsByUri.entrySet()) {
+					root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + entry.getValue(), entry.getKey());
+				}
+			}
+		}
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		DOMXSImplementationSourceImpl dis = new org.apache.xerces.dom.DOMXSImplementationSourceImpl();
+		DOMImplementationLS impl = (DOMImplementationLS) dis.getDOMImplementation("LS");
+		LSSerializer writer = impl.createLSSerializer();
+		LSOutput output = impl.createLSOutput();
+		output.setByteStream(baos);
+		writer.write(dom, output);
+		return baos.toByteArray();
+	}
+	
+	/**
+	 * Get the latest version of package content as InputStream, as it would be
+	 * saved. This might not be the original version once loaded from the
+	 * package.
+	 * 
+	 * @param internalPath
+	 *            of the desired stream.
+	 * @return Inputstream of the ODF file within the package for the given
+	 *         path.
+	 */
+	public InputStream getInputStream(String internalPath) {
+		internalPath = normalizeFilePath(internalPath);
+		// else we always cache here and return a ByteArrayInputStream because
+		// if
+		// we would return ZipFile getInputStream(entry) we would not be
+		// able to read 2 Entries at the same time. This is a limitation of the
+		// ZipFile class.
+		// As it would be quite a common thing to read the content.xml and the
+		// styles.xml
+		// simultanously when using XSLT on OdfPackages we want to circumvent
+		// this limitation
+		byte[] data = getBytes(internalPath);
+		if (data != null && data.length != 0) {
+			ByteArrayInputStream bais = new ByteArrayInputStream(data);
+			return bais;
+		}
+		return null;
+	}
+	
+	/**
+	 * Get the latest version of package content as InputStream, as it would be
+	 * saved. This might not be the original version once loaded from the
+	 * package.
+	 * 
+	 * @param internalPath
+	 *            of the desired stream.
+	 * @param useOriginal
+	 *            true uses the stream as loaded from the ZIP. False will return
+	 *            even modified file content as a stream.
+	 * @return Inputstream of the ODF file within the package for the given
+	 *         path.
+	 */
+	public InputStream getInputStream(String internalPath, boolean useOriginal) {
+		InputStream stream = null;
+		if (useOriginal) {
+			ZipEntry entry = mOriginalZipEntries.get(internalPath);
+			if (entry != null) {
+				try {
+					stream = mZipFile.getInputStream(entry);
+				} catch (IOException ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		} else {
+			stream = getInputStream(internalPath);
+		}
+		return stream;
+	}
+	
+	/**
+	 * Gets the InputStream containing whole OdfPackage.
+	 * 
+	 * @return the ODF package as input stream
+	 * @throws java.lang.Exception
+	 *             - if the package could not be read
+	 */
+	public InputStream getInputStream() throws Exception {
+		final PipedOutputStream os = new PipedOutputStream();
+		final PipedInputStream is = new PipedInputStream();
+		
+		is.connect(os);
+		
+		Thread thread1 = new Thread() {
+			
+			@Override
+			public void run() {
+				try {
+					save(os, mBaseURI);
+				} catch (Exception e) {
+				}
+			}
+		};
+		
+		Thread thread2 = new Thread() {
+			
+			@Override
+			public void run() {
+				try {
+					BufferedInputStream bis = new BufferedInputStream(is, StreamHelper.PAGE_SIZE);
+					BufferedOutputStream bos = new BufferedOutputStream(os, StreamHelper.PAGE_SIZE);
+					StreamHelper.transformStream(bis, bos);
+					is.close();
+					os.close();
+				} catch (Exception ie) {
+				}
+			}
+		};
+		
+		thread1.start();
+		thread2.start();
+		
+		return is;
+	}
+	
+	/**
+	 * Insert the OutputStream for into OdfPackage. An existing file will be
+	 * replaced.
+	 * 
+	 * @param internalPath
+	 *            - relative documentURL where the DOM tree should be inserted
+	 *            as XML file
+	 * @return outputstream for the data of the file to be stored in package
+	 * @throws java.lang.Exception
+	 *             when the DOM tree could not be inserted
+	 */
+	public OutputStream insertOutputStream(String internalPath) throws Exception {
+		return insertOutputStream(internalPath, null);
+	}
+	
+	/**
+	 * Insert the OutputStream - to be filled after method - when stream is
+	 * closed into OdfPackage. An existing file will be replaced.
+	 * 
+	 * @param internalPath
+	 *            - relative documentURL where the DOM tree should be inserted
+	 *            as XML file
+	 * @param mediaType
+	 *            - media type of stream
+	 * @return outputstream for the data of the file to be stored in package
+	 * @throws java.lang.Exception
+	 *             when the DOM tree could not be inserted
+	 */
+	public OutputStream insertOutputStream(String internalPath, String mediaType) throws Exception {
+		internalPath = normalizeFilePath(internalPath);
+		final String fPath = internalPath;
+		final OdfFileEntry fFileEntry = getFileEntry(internalPath);
+		final String fMediaType = mediaType;
+		
+		ByteArrayOutputStream baos = new ByteArrayOutputStream() {
+			
+			@Override
+			public void close() {
+				try {
+					byte[] data = this.toByteArray();
+					if (fMediaType == null || fMediaType.length() == 0) {
+						insert(data, fPath, fFileEntry == null ? null : fFileEntry.getMediaTypeString());
+					} else {
+						insert(data, fPath, fMediaType);
+					}
+					super.close();
+				} catch (Exception ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		};
+		return baos;
+	}
+	
+	/**
+	 * Removes a single file from the package.
+	 * 
+	 * @param internalPath
+	 *            of the file relative to the package root
+	 */
+	public void remove(String internalPath) {
+		internalPath = normalizePath(internalPath);
+		if (mZipEntries != null && mZipEntries.containsKey(internalPath)) {
+			mZipEntries.remove(internalPath);
+		}
+		if (mManifestEntries != null && mManifestEntries.containsKey(internalPath)) {
+			OdfFileEntry manifestEntry = mManifestEntries.remove(internalPath);
+			FileEntryElement manifestEle = manifestEntry.getOdfElement();
+			manifestEle.getParentNode().removeChild(manifestEle);
+		}
+	}
+	
+	/**
+	 * Encoded XML Attributes
+	 */
+	private String encodeXMLAttributes(String attributeValue) {
+		String encodedValue = QUOTATION_PATTERN.matcher(attributeValue).replaceAll(ENCODED_QUOTATION);
+		encodedValue = APOSTROPHE_PATTERN.matcher(encodedValue).replaceAll(ENCODED_APOSTROPHE);
+		return encodedValue;
+	}
+	
+	/**
+	 * Get EntityResolver to be used in XML Parsers which can resolve content
+	 * inside the OdfPackage
+	 * 
+	 * @return a SAX EntityResolver
+	 */
+	public EntityResolver getEntityResolver() {
+		if (mResolver == null) {
+			mResolver = new Resolver(this);
+		}
+		return mResolver;
+	}
+	
+	/**
+	 * Get URIResolver to be used in XSL Transformations which can resolve
+	 * content inside the OdfPackage
+	 * 
+	 * @return a TraX Resolver
+	 */
+	public URIResolver getURIResolver() {
+		if (mResolver == null) {
+			mResolver = new Resolver(this);
+		}
+		return mResolver;
+	}
+	
+	private static String getBaseURLFromFile(File file) throws Exception {
+		String baseURL = Util.toExternalForm(file.getCanonicalFile().toURI());
+		baseURL = BACK_SLASH_PATTERN.matcher(baseURL).replaceAll(SLASH);
+		return baseURL;
+	}
+	
+	/**
+	 * Ensures that the given file path is not null nor empty and not an
+	 * external reference
+	 * <ol>
+	 * <li>All backslashes "\" are exchanged by slashes "/"</li>
+	 * <li>Any substring "/../", "/./" or "//" will be removed</li>
+	 * <li>A prefix "./" and "../" will be removed</li>
+	 * </ol>
+	 * 
+	 * @throws IllegalArgumentException
+	 *             If the path is NULL, empty or an external path (e.g. starting
+	 *             with "../" is given). None relative URLs will NOT throw an
+	 *             exception.
+	 * @return the normalized path or the URL
+	 */
+	static String normalizeFilePath(String internalPath) {
+		if (internalPath.equals(EMPTY_STRING)) {
+			String errMsg = "The internalPath given by parameter is an empty string!";
+			Logger.getLogger(OdfPackage.class.getName()).severe(errMsg);
+			throw new IllegalArgumentException(errMsg);
+		} else {
+			return normalizePath(internalPath);
+		}
+	}
+	
+	/**
+	 * Ensures the given directory path is not null nor an external reference to
+	 * resources outside the package. An empty path and slash "/" are both
+	 * mapped to the root directory/document. NOTE: Although ODF only refer the
+	 * "/" as root, the empty path aligns more adequate with the file system
+	 * concept. To ensure the given directory path within the package can be
+	 * used as a key (is unique for the Package) the path will be normalized.
+	 * 
+	 * @see #normalizeFilePath(String) In addition to the file path
+	 *      normalization a trailing slash will be used for directories.
+	 */
+	static String normalizeDirectoryPath(String directoryPath) {
+		directoryPath = normalizePath(directoryPath);
+		// if not the root document - which is from ODF view a '/' and no
+		// trailing '/'
+		if (!directoryPath.equals(OdfPackageDocument.ROOT_DOCUMENT_PATH) && !directoryPath.endsWith(SLASH)) {
+			// add a trailing slash
+			directoryPath = directoryPath + SLASH;
+		}
+		return directoryPath;
+	}
+	
+	/** Normalizes both directory and file path */
+	static String normalizePath(String path) {
+		if (path == null) {
+			String errMsg = "The internalPath given by parameter is NULL!";
+			Logger.getLogger(OdfPackage.class.getName()).severe(errMsg);
+			throw new IllegalArgumentException(errMsg);
+		} else if (!mightBeExternalReference(path)) {
+			if (path.equals(EMPTY_STRING)) {
+				path = SLASH;
+			} else {
+				// exchange all backslash "\" with a slash "/"
+				if (path.indexOf('\\') != -1) {
+					path = BACK_SLASH_PATTERN.matcher(path).replaceAll(SLASH);
+				}
+				// exchange all double slash "//" with a slash "/"
+				while (path.indexOf("//") != -1) {
+					path = DOUBLE_SLASH_PATTERN.matcher(path).replaceAll(SLASH);
+				}
+				// if directory replacements (e.g. ..) exist, resolve and remove
+				// them
+				if (path.indexOf("/.") != -1 || path.indexOf("./") != -1) {
+					path = removeChangeDirectories(path);
+				}
+			}
+		}
+		return path;
+	}
+	
+	/** Normalizes both directory and file path */
+	private static boolean mightBeExternalReference(String internalPath) {
+		boolean isExternalReference = false;
+		// if the fileReference is a external relative documentURL..
+		if (internalPath.startsWith(DOUBLE_DOT) || // or absolute documentURL
+													// AND not root document
+				internalPath.startsWith(SLASH) && !internalPath.equals(SLASH) || // or
+																					// absolute
+																					// IRI
+				internalPath.contains(COLON)) {
+			isExternalReference = true;
+		}
+		return isExternalReference;
+	}
+	
+	/**
+	 * Resolving the directory replacements (ie. "/../" and "/./") with a slash
+	 * "/"
+	 */
+	private static String removeChangeDirectories(String path) {
+		boolean isDirectory = path.endsWith(SLASH);
+		StringTokenizer tokenizer = new StringTokenizer(path, SLASH);
+		int tokenCount = tokenizer.countTokens();
+		List<String> tokenList = new ArrayList<String>(tokenCount);
+		// add all paths to a list
+		while (tokenizer.hasMoreTokens()) {
+			String token = tokenizer.nextToken();
+			tokenList.add(token);
+		}
+		if (!isDirectory) {
+			String lastPath = tokenList.get(tokenCount - 1);
+			if (lastPath.equals(DOT) || lastPath.equals(DOUBLE_DOT)) {
+				isDirectory = true;
+			}
+		}
+		String currentToken;
+		int removeDirLevel = 0;
+		StringBuilder out = new StringBuilder();
+		// work on the list from back to front
+		for (int i = tokenCount - 1; i >= 0; i--) {
+			currentToken = tokenList.get(i);
+			// every ".." will remove an upcoming path
+			if (currentToken.equals(DOUBLE_DOT)) {
+				removeDirLevel++;
+			} else if (currentToken.equals(DOT)) {
+			} else {
+				// if a path have to be remove, neglect current path
+				if (removeDirLevel > 0) {
+					removeDirLevel--;
+				} else {
+					// add the path segment
+					out.insert(0, SLASH);
+					out.insert(0, currentToken);
+				}
+			}
+		}
+		if (removeDirLevel > 0) {
+			return EMPTY_STRING;
+		} else {
+			if (!isDirectory) {
+				// remove trailing slash /
+				out.deleteCharAt(out.length() - 1);
+			}
+			return out.toString();
+		}
+	}
+	
+	/**
+	 * Checks if the given reference is a reference, which points outside the
+	 * ODF package
+	 * 
+	 * @param internalPath
+	 *            the file reference to be checked
+	 * @return true if the reference is an package external reference
+	 */
+	public static boolean isExternalReference(String internalPath) {
+		if (mightBeExternalReference(internalPath)) {
+			return true;
+		} else {
+			return mightBeExternalReference(normalizePath(internalPath));
+		}
+	}
+	
+	/**
+	 * Allow an application to register an error event handler.
+	 * <p>
+	 * If the application does not register an error handler, all error events
+	 * reported by the ODFDOM (e.g. the SAX Parser) will be silently ignored;
+	 * however, normal processing may not continue. It is highly recommended
+	 * that all ODF applications implement an error handler to avoid unexpected
+	 * bugs.
+	 * </p>
+	 * <p>
+	 * Applications may register a new or different handler in the middle of a
+	 * parse, and the ODFDOM will begin using the new handler immediately.
+	 * </p>
+	 * 
+	 * @param handler
+	 *            The error handler.
+	 * @see #getErrorHandler
+	 */
+	public void setErrorHandler(ErrorHandler handler) {
+		mErrorHandler = handler;
+	}
+	
+	/**
+	 * Return the current error handler used for ODF validation.
+	 * 
+	 * @return The current error handler, or null if none has been registered
+	 *         and validation is disabled.
+	 * @see #setErrorHandler
+	 */
+	public ErrorHandler getErrorHandler() {
+		return mErrorHandler;
+	}
+	
+	void logValidationWarning(ValidationConstraint constraint, String baseURI, Object... o) throws SAXException {
+		// try{
+		if (mErrorHandler == null) {
+			return;
+		}
+		int varCount = 0;
+		if (o != null) {
+			varCount = o.length;
+		}
+		switch (varCount) {
+		case 0:
+			mErrorHandler.warning(new OdfValidationException(constraint, baseURI, o));
+			break;
+		case 1:
+			mErrorHandler.warning(new OdfValidationException(constraint, baseURI, o[0]));
+			break;
+		case 2:
+			mErrorHandler.warning(new OdfValidationException(constraint, baseURI, o[0], o[1]));
+			break;
+		}
+		// } catch (SAXException ex){
+		// Logger.getLogger(OdfPackage.class.getName()).log(Level.WARNING, null,
+		// ex);
+		// }
+	}
+	
+	void logValidationError(ValidationConstraint constraint, String baseURI, Object... o) throws SAXException {
+		// try{
+		if (mErrorHandler == null) {
+			return;
+		}
+		int varCount = 0;
+		if (o != null) {
+			varCount = o.length;
+		}
+		switch (varCount) {
+		case 0:
+			mErrorHandler.error(new OdfValidationException(constraint, baseURI, o));
+			break;
+		case 1:
+			mErrorHandler.error(new OdfValidationException(constraint, baseURI, o[0]));
+			break;
+		case 2:
+			mErrorHandler.error(new OdfValidationException(constraint, baseURI, o[0], o[1]));
+			break;
+		}
+		// } catch (SAXException ex) {
+		// Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null,
+		// ex);
+		// }
+	}
+	
+	/**
+	 * @param odfVersion
+	 *            parsed from the manifest
+	 */
+	void setManifestVersion(String odfVersion) {
+		mManifestVersion = odfVersion;
+	}
+	
+	/**
+	 * @return the ODF version found in the manifest. Meant to be used to reuse
+	 *         when the manifest is recreated
+	 */
+	String getManifestVersion() {
+		return mManifestVersion;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageConstraint.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageConstraint.java
new file mode 100644
index 0000000..fa1086b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageConstraint.java
@@ -0,0 +1,101 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import org.odftoolkit.odfdom.pkg.OdfPackage.OdfFile;
+
+/**
+ * This class is used for validation of the ODF Package.
+ * It contains the constraint messages are taken from the OASIS ODF 1.2 part 3, the ODF package specification.
+ * These messages are used by the <code>ValidationException</code> for ODF validation.
+ * The validation is enabled, when an <code>ErrorHandler</code> was provided to the <code>OdfPackage</code>.
+ */
+public enum OdfPackageConstraint implements ValidationConstraint {
+	// NOTE FOLLOWING CODE CONVENTION:
+	// The first parameter is ALWAYS the source path. The OdfValidationException adds a preceding whitespace in case the source is not null.
+
+	/** In case a ZIP entry is using neither STORED and DEFLATED as compression method.*/
+	PACKAGE_ENTRY_USING_INVALID_COMPRESSION("The compression method of the ZIP entry '%2$s' is not allowed within the%1$s ODF package file!"),
+	/** The ODF package shall contain the \"/META-INF/manifest.xml\" file. */
+	MANIFEST_NOT_IN_PACKAGE("The ODF package%1$s shall contain the '" + OdfFile.MANIFEST.getPath() + "' file!"),
+	/** A directory is not a sub-document and should not be listed in the \"/META-INF/manifest.xml\" file of ODF package. */
+	MANIFEST_LISTS_DIRECTORY("The directory '%2$s' is not a sub-document and should not be listed in the '" + OdfFile.MANIFEST.getPath() + "' file of ODF package%1$s!"),
+	/** A directory is a document and should be listed in the \"/META-INF/manifest.xml\" file of ODF package. */
+	MANIFEST_DOES_NOT_LIST_DIRECTORY("The directory of the sub-document '%2$s' should be listed in the '" + OdfFile.MANIFEST.getPath() + "' file of ODF package%1$s!"),
+	/** A file shall not be listed in the \"/META-INF/manifest.xml\" file as it does not exist in the ODF package. */
+	MANIFEST_LISTS_NONEXISTENT_FILE("The file '%2$s' shall not be listed in the '" + OdfFile.MANIFEST.getPath() + "' file as it does not exist in the ODF package%1$s!"),
+	/** A file shall be listed in the \"/META-INF/manifest.xml\" file as it exists in the ODF package. */
+	MANIFEST_DOES_NOT_LIST_FILE("The file '%2$s' shall be listed in the '" + OdfFile.MANIFEST.getPath() + "' file as it exists in the ODF package%1$s!"),	
+	/** The ODF package contains a \"mediatype\" file, which content differs from the mediatype of the root document!" */
+	MIMETYPE_DIFFERS_FROM_PACKAGE("The ODF package%1$s contains a '" + OdfFile.MEDIA_TYPE.getPath() + "' file containing '%2$s', which differs from the mediatype of the root document '%3$s'!"),
+	/** The ODF package contains a \"mediatype\" file, but no mediatype its root document in the \"/META-INF/manifest.xml\" file of ODF package! */
+	MIMETYPE_WITHOUT_MANIFEST_MEDIATYPE("The ODF package%1$s contains a '" + OdfFile.MEDIA_TYPE.getPath() + "' file containing '%2$s', but no mediatype for its root document in its '" + OdfFile.MANIFEST.getPath() + "'!"),
+	/** The root document shall be listed in the \"/META-INF/manifest.xml\" file using a '/' as path within the ODF package. */
+	MANIFEST_WITH_EMPTY_PATH("The root document shall be listed in the '" + OdfFile.MANIFEST.getPath() + "' file using a '/' as path within the ODF package%1$s!"),
+	/** There shall be no extra field for the \"mediatype\" file of ODF package. */
+	MIMETYPE_HAS_EXTRA_FIELD("There shall be no extra field for the '" + OdfFile.MEDIA_TYPE.getPath() + "' file of ODF package%1$s!"),
+	/** The file \"mediatype\" shall not be compressed in the ODF package. */
+	MIMETYPE_IS_COMPRESSED("The file '" + OdfFile.MEDIA_TYPE.getPath() + "' shall not be compressed in the ODF package%1$s!"),
+	/** The file \"mediatype\" is not the first file in the ODF package. */
+	MIMETYPE_NOT_FIRST_IN_PACKAGE("The file '" + OdfFile.MEDIA_TYPE.getPath() + "' is not the first file in the ODF package%1$s!"),
+	/** The ODF package contains no \"mediatype\" file. */
+	MIMETYPE_NOT_IN_PACKAGE("The ODF package%1$s contains no '" + OdfFile.MEDIA_TYPE.getPath() + "' file!"),
+	/** The ODF package shall be a ZIP file. */
+	PACKAGE_IS_NO_ZIP("The ODF package%1$s shall be a ZIP file!");
+	private final String mMessage;
+
+	/**
+	 * Creates a ODF Package constraint
+	 * @param message of the constraint */
+	OdfPackageConstraint(String message) {
+		mMessage = message;
+	}
+
+	/**
+	 * Creates a localized description of a Constraint.
+	 * Subclasses may override this method in order to produce a
+	 * locale-specific message.  For subclasses that do not override this
+	 * method, the default implementation returns the same result as
+	 * <code>getMessage()</code>.
+	 *
+	 * @return  The localized description of this constraint. */
+	public String getLocalizedMessage() {
+//    FUTURE FEATUE: LOCALIZATION:
+//    =============================
+//    There should be a property files e.g. OdfPackageConstraint_de_DE.properties Sourcecode:
+//    PACKAGE_IS_NO_ZIP=%s muß eine ZIP Datei sein, wie in [ZIP] definiert. Alle Dateien innerhalbe des ZIPS müssen entwder unkomprimiert (STORED) oder komprimiert sein (DEFLATED) und den DEFLATE aloritmus verwenden.
+//    MANIFEST_NOT_IN_PACKAGE=.....
+//    ResourceBundle bundle = ResourceBundle.getBundle(OdfPackageConstraint.class.getName());
+//    return bundle.getString(this.name());
+		return mMessage;
+	}
+
+	/**
+	 * Returns the detail message string of this Constraint.
+	 *
+	 * @return  the detail message string of this <tt>Constraint</tt> instance
+	 *          (which may be <tt>null</tt>).
+	 */
+	public String getMessage() {
+		return mMessage;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageDocument.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageDocument.java
new file mode 100644
index 0000000..bf11a3c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageDocument.java
@@ -0,0 +1,410 @@
+/**
+ * **********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ***********************************************************************
+ */
+package org.odftoolkit.odfdom.pkg;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.util.ResourceUtils;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.transform.Templates;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+
+/**
+ *
+ * The package layer described by the ODF 1.2 Package specification is
+ * independent of the above ODF XML layer described by the ODF 1.2 XML Schema
+ * specification.
+ *
+ * Still the abstract concept of documents exist in the ODF Package layer.
+ */
+public class OdfPackageDocument implements Closeable {
+
+	private static final String TWO_DOTS = "..";
+	private static final String SLASH = "/";
+	private static final String COLON = ":";
+	private static final String EMPTY_STRING = "";
+	/**
+	 * The path of the root document
+	 */
+	protected static final String ROOT_DOCUMENT_PATH = EMPTY_STRING;
+	private Resolver mResolver;
+	/**
+	 * The ODF package containing the document
+	 */
+	protected OdfPackage mPackage;
+	/**
+	 * The internal path to the document relative to the ODF package
+	 */
+	protected String mDocumentPathInPackage;
+	/**
+	 * The mediatype of the ODF package document. Note: Not necessarily an ODF
+	 * XML mediatype as specified in ODF 1.2 part1
+	 */
+	protected String mDocumentMediaType;
+	private static Templates mRdfFileExtractionTemplate;
+
+	/**
+	 * Creates a new OdfPackageDocument.
+	 *
+	 * @param pkg - the ODF Package that contains the document. A baseURL is
+	 * being generated based on its location.
+	 * @param internalPath - the directory path within the package from where
+	 * the document should be loaded.
+	 * @param mediaTypeString - media type of stream. If unknown null can be
+	 * used.
+	 */
+	protected OdfPackageDocument(OdfPackage pkg, String internalPath, String mediaTypeString) {
+		if (pkg != null) {
+			mPackage = pkg;
+			mDocumentPathInPackage = internalPath;
+			this.setMediaTypeString(mediaTypeString);
+			pkg.cacheDocument(this, internalPath);
+		} else {
+			throw new IllegalArgumentException("No Package provided for new document!");
+		}
+	}
+
+	/**
+	 * Loads an OdfPackageDocument from the provided path.
+	 *
+	 * <p>OdfPackageDocument relies on the file being available for read access
+	 * over the whole lifecycle of OdfDocument.</p>
+	 *
+	 * @param documentPath - the path from where the document can be loaded
+	 * @return the OpenDocument from the given path or NULL if the media type is
+	 * not supported by ODFDOM.
+	 * @throws java.lang.Exception - if the document could not be created.
+	 */
+	public static OdfPackageDocument loadDocument(String documentPath) throws Exception {
+		OdfPackage pkg = OdfPackage.loadPackage(documentPath);
+		return pkg.loadDocument(ROOT_DOCUMENT_PATH);
+	}
+
+	/**
+	 * Returns an embedded OdfPackageDocument from the given package path.
+	 *
+	 * @param documentPath to the document within the package. The path is
+	 * relative the current document path.
+	 * @return an embedded OdfPackageDocument
+	 */
+	public OdfPackageDocument loadSubDocument(String documentPath) {
+		String internalPath = this.getDocumentPath() + documentPath;
+		internalPath = OdfPackage.normalizeDirectoryPath(internalPath);
+		return mPackage.loadDocument(internalPath);
+	}
+
+	/**
+	 * @return the mediatype of this document
+	 */
+	public String getMediaTypeString() {
+		return mDocumentMediaType;
+	}
+
+	/**
+	 * @param mediaTypeString for the mediatype of this document
+	 */
+	protected final void setMediaTypeString(String mediaTypeString) {
+		mDocumentMediaType = mediaTypeString;
+		if (isRootDocument()) {
+			mPackage.setMediaTypeString(mediaTypeString);
+		}
+	}
+
+	/**
+	 * Sets the OdfPackage that contains this OdfPackageDocument.
+	 *
+	 * @param pkg the OdfPackage that contains this OdfPackageDocument
+	 */
+	void setPackage(OdfPackage pkg) {
+		mPackage = pkg;
+	}
+
+	/**
+	 * Retreives the OdfPackage for this OdfPackageDocument.
+	 *
+	 * @return the OdfPackage that contains this OdfPackageDocument.
+	 */
+	public OdfPackage getPackage() {
+		return mPackage;
+	}
+
+	/**
+	 * Set the relative path for an embedded ODF document.
+	 *
+	 * @param path to directory of the embedded ODF document (relative to ODF
+	 * package root).
+	 */
+	String setDocumentPath(String path) {
+		mDocumentPathInPackage = normalizeDocumentPath(path);
+		return mDocumentPathInPackage;
+	}
+
+	/**
+	 * Get the relative path for an embedded ODF document.
+	 *
+	 * @return path to the directory of the embedded ODF document (relative to
+	 * ODF package root).
+	 */
+	public String getDocumentPath() {
+		return mDocumentPathInPackage;
+	}
+
+	/**
+	 * Removes an embedded ODF document from the ODF Package. All files within
+	 * the embedded document directory will be removed.
+	 *
+	 * @param internDocumentPath path to the directory of the embedded ODF
+	 * document (always relative to the package path of the current document).
+	 */
+	public void removeDocument(String internDocumentPath) {
+		mPackage.removeDocument(mDocumentPathInPackage + internDocumentPath);
+	}
+
+	/**
+	 * @return true if the document is at the root level of the package
+	 */
+	public boolean isRootDocument() {
+		if (getDocumentPath().equals(ROOT_DOCUMENT_PATH)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Checks if the given reference is a reference, which points outside the
+	 * ODF package Only relative path are allowed with the exception of a single
+	 * slash '/' representing the root document.
+	 *
+	 * @param ref the file reference to be checked
+	 * @return true if the reference is an package external reference
+	 */
+	protected static boolean isExternalReference(String ref) {
+		boolean isExternalReference = false;
+		// if the reference is a external relative filePath..
+		if (ref.startsWith(TWO_DOTS)
+				|| // or absolute filePath AND not root document)
+				ref.startsWith(SLASH) && !ref.equals(SLASH)
+				|| // or absolute IRI
+				ref.contains(COLON)) {
+			isExternalReference = true;
+		}
+		return isExternalReference;
+	}
+
+	/**
+	 * Ensure the document path for is valid and gurantee unique encoding by
+	 * normalizing the path.
+	 *
+	 * @see OdfPackage#normalizeDirectoryPath(java.lang.String)
+	 * @param documentPath the destination directory of the document. The path
+	 * should end with a '/'.
+	 * @return the documentPath after normalization.
+	 */
+	protected static String normalizeDocumentPath(String documentPath) {
+		String dirPath = OdfPackage.normalizeDirectoryPath(documentPath);
+		//package path should not start with '/'.
+		if (dirPath.startsWith(SLASH) && !dirPath.equals(SLASH)) {
+			dirPath = dirPath.substring(1);
+		}
+		return dirPath;
+	}
+
+	/**
+	 * Save the document to given path.
+	 *
+	 * <p>When save the embedded document to a stand alone document, all the
+	 * file entries of the embedded document will be copied to a new document
+	 * package. If the embedded document is outside of the current document
+	 * directory, you have to embed it to the sub directory and refresh the link
+	 * of the embedded document. You should reload it from the given path to get
+	 * the saved embedded document.
+	 *
+	 * @param documentPath - the path to the package document
+	 * @throws java.lang.Exception if the document could not be saved
+	 */
+	public void save(String documentPath) throws Exception {
+		File f = new File(documentPath);
+		save(f);
+	}
+
+	/**
+	 * Save the document to a given file.
+	 *
+	 * <p>If the input file has been cached (this is the case when loading from
+	 * an InputStream), the input file can be overwritten.</p>
+	 *
+	 * <p>Otherwise it's allowed to overwrite the input file as long as the same
+	 * path name is used that was used for loading (no symbolic link foo2.odt
+	 * pointing to the loaded file foo1.odt, no network path X:\foo.odt pointing
+	 * to the loaded file D:\foo.odt).</p>
+	 *
+	 * <p>When saving the embedded document to a stand alone document, all files
+	 * of the embedded document will be copied to a new document package. If the
+	 * embedded document is outside of the current document directory, you have
+	 * to embed it to the sub directory and refresh the link of the embedded
+	 * document. You should reload it from the given file to get the saved
+	 * embedded document.
+	 *
+	 * @param file - the file to save the document
+	 * @throws java.lang.Exception if the document could not be saved
+	 */
+	public void save(File file) throws Exception {
+		mPackage.save(file);
+	}
+
+	/**
+	 * Flush the existing DOM to the document to get in advantage of the recent
+	 * changes from the DOM
+	 */
+	protected void flushDoms() {
+		mPackage.flushDoms(this);
+	}
+
+	/**
+	 * Embed an OdfPackageDocument to the current OdfPackageDocument. All the
+	 * file entries of child document will be embedded as well to the current
+	 * document package.
+	 *
+	 * @param newDocument the OdfPackageDocument to be embedded.
+	 * @param documentPath to the directory the ODF document should be inserted
+	 * (relative to the root of this document).
+	 */
+	public void insertDocument(OdfPackageDocument newDocument, String documentPath) {
+		newDocument.flushDoms();
+		mPackage.insertDocument(newDocument, mDocumentPathInPackage + documentPath);
+	}
+
+	/**
+	 * @param internalPath path to the XML file relative to package root
+	 * @return the typed DOM of the given file
+	 */
+	public OdfFileDom getFileDom(String internalPath) throws Exception {
+		String normalizeDocumentPath = getDocumentPath();
+		if (!isRootDocument()) {
+			normalizeDocumentPath = normalizeDocumentPath(normalizeDocumentPath);
+		}
+		return OdfFileDom.newFileDom(this, normalizeDocumentPath + internalPath);
+	}
+
+	/**
+	 * Get EntityResolver to be used in XML Parsers which can resolve content
+	 * inside the OdfPackage
+	 */
+	EntityResolver getEntityResolver() {
+		if (mResolver == null) {
+			mResolver = new Resolver(mPackage);
+		}
+		return mResolver;
+	}
+
+	/**
+	 * Get URIResolver to be used in XSL Transformations which can resolve
+	 * content inside the OdfPackage
+	 */
+	URIResolver getURIResolver() {
+		if (mResolver == null) {
+			mResolver = new Resolver(mPackage);
+		}
+		return mResolver;
+	}
+
+	/**
+	 * Close the OdfPackageDocument, its OdfPackage and release all temporary
+	 * created data. Acter execution of this method, this class is no longer
+	 * usable. Do this as the last action to free resources. Closing an already
+	 * closed document has no effect.
+	 */
+	public void close() {
+		mPackage.close();
+		// set all member variables explicit to null
+		mPackage = null;
+	}
+
+	/**
+	 * Helper class to receive an ODF document template for new documents from
+	 * the environment (ie. from the JAR via classloader)
+	 */
+	protected static class Resource {
+
+		private String name;
+
+		public Resource(String name) {
+			this.name = name;
+		}
+
+		public InputStream createInputStream() {
+			InputStream in = OdfPackageDocument.class.getResourceAsStream(this.name);
+			if (in == null) {
+				Logger.getLogger(OdfPackageDocument.class.getName()).log(Level.SEVERE, "Could not find resource: {0}", this.name);
+			}
+			return in;
+		}
+	}
+
+	/**
+	 * Extracts RDF Metadata triple from XML files
+	 * 
+	 * @param internalPath path to the XML file relative to package root
+	 * @return RDF Metadata through GRDDL XSLT of given XML file
+	 */
+	public Model getXMLFileMetadata(String internalPath) {
+		Model rdfModel = null;
+		try {
+			ByteArrayOutputStream out = new ByteArrayOutputStream();
+			OdfXMLHelper helper = new OdfXMLHelper();
+			if (mRdfFileExtractionTemplate == null) {
+				String filePath = "file:" + OdfPackageDocument.class.getClassLoader().getResource("grddl/odf2rdf.xsl").getPath();
+				URI uri = new URI(filePath);
+				InputSource inputSource = new InputSource(uri.toString());
+				mRdfFileExtractionTemplate = TransformerFactory.newInstance().newTemplates(new SAXSource(inputSource));
+			}
+			helper.transform(this.getPackage(), internalPath, mRdfFileExtractionTemplate, new StreamResult(out));
+			String RDFBaseUri = Util.getRDFBaseUri(this.getPackage().getBaseURI(), internalPath);
+			rdfModel = ModelFactory.createDefaultModel();
+			rdfModel.read(new InputStreamReader(new ByteArrayInputStream(out.toByteArray()), "utf-8"), RDFBaseUri);
+			// remove the last SLASH at the end of the RDFBaseUri:
+			// test_rdfmeta.odt/ --> test_rdfmeta.odt
+			ResourceUtils.renameResource(rdfModel.getResource(RDFBaseUri), RDFBaseUri.substring(0, RDFBaseUri.length() - 1));
+		} catch (Exception ex) {
+			Logger.getLogger(OdfPackageDocument.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return rdfModel;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfValidationException.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfValidationException.java
new file mode 100644
index 0000000..cfb3ddd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfValidationException.java
@@ -0,0 +1,134 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import org.xml.sax.SAXParseException;
+
+/**
+ * This ODF specific validation exception facilities the usage of a
+ * SAXParseException for none XML validation, used by an
+ * <code>ErrorHandler</code>.
+ */
+public class OdfValidationException extends SAXParseException {
+
+	private ValidationConstraint mConstraint;
+	private static final String NO_SOURCE = "";
+	private static final String SOURCE_PREFIX = " '";
+	private static final String SOURCE_SUFFIX = "'";
+
+	/**
+	 * An OdfValidationException should be used for any validation result
+	 * related to an ODF package. This constructor should only be used for
+	 * SaxParseExceptions unrelated to XML. This constructor sets the public and
+	 * system ID for XML and line and column number of the super class will be
+	 * set to be invalid.
+	 * 
+	 * @param constraint
+	 *            the predefined constant message
+	 */
+	public OdfValidationException(ValidationConstraint constraint) {
+		// The constraint convention is the first parameter to be the sourcePath of the ODF document/package causing the exception
+		super(String.format(constraint.getMessage(), NO_SOURCE), null, null, -1, -1);
+		mConstraint = constraint;
+	}
+
+	/**
+	 * An OdfValidationException should be used for any validation result
+	 * related to an ODF package. This constructor should only be used for
+	 * SaxParseExceptions unrelated to XML. This constructor sets the public and
+	 * system ID for XML and line and column number of the super class will be
+	 * set to be invalid.
+	 * 
+	 * @param constraint
+	 *            the predefined constaint message
+	 * @param sourcePath
+	 *            the source path of the exception. For instance, it might be an
+	 *            ODF package or ODF document.
+	 * @param messageParameters
+	 *            allow the customization of a constraint message with
+	 *            parameters.
+	 */
+	public OdfValidationException(ValidationConstraint constraint, String sourcePath, Object... messageParameters) {
+		// The constraint convention is the first parameter to be the sourcePath of the ODF document/package causing the exception
+		super(formatMessage(constraint, sourcePath, messageParameters), null, null, -1, -1);
+		mConstraint = constraint;
+	}
+
+	/**
+	 * An OdfValidationException should be used for any validation result
+	 * related to an ODF package. This constructor should only be used for
+	 * SaxParseExceptions unrelated to XML. This constructor sets the public and
+	 * system ID for XML and line and column number of the super class will be
+	 * set to be invalid.
+	 * 
+	 * @param e
+	 *            root exception to be embedded
+	 * @param constraint
+	 *            the predefined constant message
+	 * @param sourcePath
+	 *            the source path of the exception. For instance, it might be an
+	 *            ODF package or ODF document.
+	 * @param messageParameters
+	 *            allow the customization of a constraint message with
+	 *            parameters.
+	 */
+	public OdfValidationException(ValidationConstraint constraint, String sourcePath, Exception e, Object... messageParameters) {
+		// The constraint convention is the first parameter to be the sourcePath of the ODF document/package causing the exception
+		super(formatMessage(constraint, sourcePath, messageParameters), null, null, -1, -1, e);
+		mConstraint = constraint;
+	}
+
+	/** @return constraint belonging to this exception */
+	public ValidationConstraint getConstraint() {
+		return mConstraint;
+	}
+
+	private static String formatMessage(ValidationConstraint constraint, String sourcePath, Object... messageParameters) {
+		String formattedString = NO_SOURCE;
+		int varCount = 0;
+		if (messageParameters != null) {
+			varCount = messageParameters.length;
+		}
+		switch (varCount) {
+			case 0:
+				formattedString = String.format(constraint.getMessage(), sourcePath == null || sourcePath.equals(NO_SOURCE) ? NO_SOURCE : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX);
+				break;
+			case 1:
+				formattedString = String.format(constraint.getMessage(), sourcePath == null || sourcePath.equals(NO_SOURCE) ? NO_SOURCE : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX, messageParameters[0]);
+				break;
+			case 2:
+				formattedString = String.format(constraint.getMessage(), sourcePath == null || sourcePath.equals(NO_SOURCE) ? NO_SOURCE : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX, messageParameters[0], messageParameters[1]);
+				break;
+			case 3:
+				formattedString = String.format(constraint.getMessage(), sourcePath == null || sourcePath.equals(NO_SOURCE) ? NO_SOURCE : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX, messageParameters[0], messageParameters[1], messageParameters[2]);
+				break;
+			case 4:
+				formattedString = String.format(constraint.getMessage(), sourcePath == null || sourcePath.equals(NO_SOURCE) ? NO_SOURCE : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX, messageParameters[0], messageParameters[1], messageParameters[2], messageParameters[3]);
+				break;
+			case 5:
+				formattedString = String.format(constraint.getMessage(), sourcePath == null || sourcePath.equals(NO_SOURCE) ? NO_SOURCE : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX, messageParameters[0], messageParameters[1], messageParameters[2], messageParameters[3], messageParameters[4]);
+				break;
+		}
+		return formattedString;
+
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java
new file mode 100644
index 0000000..730026a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLFactory.java
@@ -0,0 +1,301 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.w3c.dom.DOMException;
+
+/** This factory determines what elements are being used in the DOC layer
+ * (ie. the convenient layer).
+ *
+ *  The mapping of ODF element to convenient class can be changed from the user
+ *  during run time.
+ *
+ *  For example, a user might want to create a table always with a certain style or default data and
+ *  might want to overwrite the mapping for <code>{odf.element table:table}</code>, that a different
+ *  class instead of <code>OdfTable</code> is being used.
+ * 
+ */
+public class OdfXMLFactory {
+
+	private static Map<OdfName, Class> mElementTypes = new HashMap<OdfName, Class>();
+	private static Map<OdfName, Class> mAttributeTypes = new HashMap<OdfName, Class>();
+	private static Map<String, String> mElementRenames = new HashMap<String, String>();
+	//a set for the element which need to load class from incubator package.
+	private static Set<String> mIncubatorElements = new HashSet<String>();
+	private static final String LOCAL_NAME_DELIMITER = "-";
+	private static final String ELEMENT_NAME_DELIMITER = ":";
+	private static final String ELEMENT_PACKAGE_NAME = "element";
+	private static final String ATTRIBUTE_PACKAGE_NAME = "attribute";
+
+	static {
+		mElementRenames.put("text:h", "text:heading");
+		mElementRenames.put("text:p", "text:paragraph");
+
+		mIncubatorElements.add("draw:frame");
+		mIncubatorElements.add("draw:image");
+		mIncubatorElements.add("number:currency-style");
+		mIncubatorElements.add("number:date-style");
+		mIncubatorElements.add("number:percentage-style");
+		mIncubatorElements.add("number:number-style");
+		mIncubatorElements.add("number:time-style");
+		mIncubatorElements.add("office:automatic-styles");
+		mIncubatorElements.add("office:master-styles");
+		mIncubatorElements.add("office:styles");
+		mIncubatorElements.add("style:default-style");
+		mIncubatorElements.add("style:style");
+		mIncubatorElements.add("style:page-layout");
+		mIncubatorElements.add("text:h");
+		mIncubatorElements.add("text:list");
+		mIncubatorElements.add("text:list-level-style-bullet");
+		mIncubatorElements.add("text:list-level-style-image");
+		mIncubatorElements.add("text:list-level-style-number");
+		mIncubatorElements.add("text:list-style");
+		mIncubatorElements.add("text:outline-level-style");
+		mIncubatorElements.add("text:outline-style");
+		mIncubatorElements.add("text:p");
+		mIncubatorElements.add("text:span");
+	}
+
+	/** Mapping an ODF element to a new Java DOM element class.
+	 *  Note: There is a default class for each element being generated from the latest ODF schema 
+	 */
+	private static void setOdfElementClass(OdfName odfName, Class className) {
+		mElementTypes.put(odfName, className);
+	}
+
+	/** Mapping an ODF attribute to a new Java DOM attribute class.
+	 *  Note: There is a default class for each element being generated from the latest ODF schema. */
+	private static void setOdfAttributeClass(OdfName odfName, Class className) {
+		mAttributeTypes.put(odfName, className);
+	}
+
+	/**
+	 * @param odfName the name of the ODF attribute the desired DOM class should represent.
+	 * @return the Java DOM attribute class to be mapped to a certain ODF attribute. */
+	private static Class getOdfAttributeClass(OdfName odfName) {
+		return getOdfNodeClass(odfName, ATTRIBUTE_PACKAGE_NAME, mAttributeTypes);
+	}
+
+	/**
+	 * @param odfName the name of the ODF element the desired DOM class should represent.
+	 * @return the Java DOM element class to be mapped to a certain ODF element. */
+	private static Class getOdfElementClass(OdfName odfName) {
+		return getOdfNodeClass(odfName, ELEMENT_PACKAGE_NAME, mElementTypes);
+	}
+
+	private static Class getOdfNodeClass(OdfName odfName, String nodeType, Map<OdfName, Class> classCache) {
+		Class c = null;
+		String className = "";
+		c = classCache.get(odfName);
+		if (c == null) {
+			String prefix = odfName.getPrefix();
+			if (prefix != null && !(nodeType.equals(ATTRIBUTE_PACKAGE_NAME) && prefix.equals("xmlns"))) {
+				String qName = odfName.getQName();
+				String localName = odfName.getLocalName();
+				//judge whether the element need to load class from incubator package.
+				if (mIncubatorElements.contains(qName)) {
+					//judge whether the element need to rename before find class name.
+					if (mElementRenames.containsKey(qName)) {
+						String renameName = mElementRenames.get(qName);
+						StringTokenizer stok = new StringTokenizer(renameName, ELEMENT_NAME_DELIMITER);
+						prefix = stok.nextToken();
+						localName = stok.nextToken();
+					}
+					className = getOdfIncubatorNodeClassName(prefix, localName);
+				} else if ("manifest".equals(prefix)) {
+					className = getOdfPKGNodeClassName(prefix, localName, nodeType);
+				} else {
+					className = getOdfDOMNodeClassName(prefix, localName, nodeType);
+				}
+				try {
+					c = Class.forName(className);
+					classCache.put(odfName, c);
+				} catch (ClassNotFoundException ex) {
+					// all classes are first tring to load and warning is given later
+				} catch (NoClassDefFoundError dex) {
+					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.INFO, "NoClassDefFoundError: " + className, dex.getMessage());
+				}
+			}
+		}
+		return c;
+	}
+
+	private static String getOdfIncubatorNodeClassName(String prefix, String localName) {
+		boolean contains = false;
+		StringBuilder className = new StringBuilder();
+
+		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
+			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
+			while (stok.hasMoreElements()) {
+				String substr = stok.nextToken();
+				if (substr.equals(prefix)) {
+					contains = true;
+				}
+				className = className.append(toUpperCaseFirstCharacter(substr));
+			}
+		} else {
+			className = className.append(toUpperCaseFirstCharacter(localName));
+		}
+		if (!((contains && !localName.endsWith("table"))
+				|| (localName.equals(prefix))
+				|| (localName.startsWith(prefix) && prefix.equals("anim")))) {
+			className = className.insert(0, toUpperCaseFirstCharacter(prefix));
+		}
+		className = className.insert(0, "org.odftoolkit.odfdom.incubator.doc." + prefix + "." + "Odf");
+
+		return className.toString();
+	}
+	
+	private static String getOdfPKGNodeClassName(String prefix, String localName, String nodeType) {
+		StringBuilder className = new StringBuilder("org.odftoolkit.odfdom.pkg." + prefix + ".");
+		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
+			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
+			while (stok.hasMoreElements()) {
+				className = className.append(toUpperCaseFirstCharacter(stok.nextToken()));
+			}
+		} else {
+			className = className.append(toUpperCaseFirstCharacter(localName));
+		}
+		className.append(toUpperCaseFirstCharacter(nodeType));
+		return className.toString();
+	}
+	
+	private static String getOdfDOMNodeClassName(String prefix, String localName, String nodeType) {
+		StringBuilder className = new StringBuilder("org.odftoolkit.odfdom.dom." + nodeType + "." + prefix + ".");
+		className = className.append(toUpperCaseFirstCharacter(prefix));
+		if (localName.indexOf(LOCAL_NAME_DELIMITER) != -1) {
+			StringTokenizer stok = new StringTokenizer(localName, LOCAL_NAME_DELIMITER);
+			while (stok.hasMoreElements()) {
+				className = className.append(toUpperCaseFirstCharacter(stok.nextToken()));
+			}
+		} else {
+			className = className.append(toUpperCaseFirstCharacter(localName));
+		}
+		className.append(toUpperCaseFirstCharacter(nodeType));
+		return className.toString();
+	}
+
+	private static String toUpperCaseFirstCharacter(String token) {
+		return token.substring(0, 1).toUpperCase() + token.substring(1);
+	}
+
+	public static OdfElement newOdfElement(OdfFileDom dom, OdfName name) throws DOMException {
+		OdfElement element = null;
+
+		// lookup registered element class for qname
+		Class elementClass = getOdfElementClass(name);
+
+		// if a class was registered create an instance of that class
+		if (elementClass != null) {
+			element = (OdfElement) getNodeFromClass(dom, elementClass);
+		} else {
+			String oldPrefix = name.getPrefix();
+			if (oldPrefix != null) {
+				// check if the namespace prefix is correct or add potential namespace to DOM
+				OdfName adaptedName = addNamespaceToDom(name, dom);
+				String newPrefix = adaptedName.getPrefix();
+				// in case the prefix was changed as it existed before
+				if (oldPrefix != null && !oldPrefix.equals(newPrefix)
+						// "_1" is the suffix added by OdfFileDom to an existing Namespace
+						&& newPrefix.indexOf("__") == -1) {
+					// look up again if there is a class registered for this prefix
+					element = newOdfElement(dom, adaptedName);
+				} else {
+					element = (OdfElement) new OdfAlienElement(dom, adaptedName);
+					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF element created for {0}", adaptedName.getQName());
+				}
+			} else {
+				element = (OdfElement) new OdfAlienElement(dom, name);
+				Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF element created for {0}", name.getQName());
+			}
+		}
+		return element;
+	}
+
+	public static OdfAttribute newOdfAttribute(OdfFileDom dom, OdfName name) throws DOMException {
+		OdfAttribute attr = null;
+
+		// lookup registered attribute class for qname
+		Class attributeClass = getOdfAttributeClass(name);
+
+		// if a class was registered create an instance of that class
+		if (attributeClass != null) {
+			attr = (OdfAttribute) getNodeFromClass(dom, attributeClass);
+		} else { // in case it is not a default ODF
+			// add a namespace unless it is a xmlns attribute (no attr value to set the uri)
+			String prefix = name.getPrefix();
+			if (prefix != null && !prefix.equals("xmlns")) {
+				// check if the namespace prefix is correct or add potential namespace to DOM
+				OdfName adaptedName = addNamespaceToDom(name, dom);
+				String newPrefix = adaptedName.getPrefix();
+				// in case the prefix was changed as it existed before
+				if (!prefix.equals(newPrefix) && newPrefix.indexOf("__") == -1) {
+					// look up again if there is a class registered for this prefix
+					attr = newOdfAttribute(dom, adaptedName);
+				} else {
+					attr = (OdfAttribute) new OdfAlienAttribute(dom, name);
+					Logger.getLogger(OdfXMLFactory.class.getName()).log(Level.FINE, "None-ODF attribute created for {0}", adaptedName.getQName());
+				}
+			} else {
+				// create an alien attribute for namespace attribute "xmlns:*"
+				attr = (OdfAttribute) new OdfAlienAttribute(dom, name);
+			}
+
+		}
+		return attr;
+	}
+
+	private static OdfName addNamespaceToDom(OdfName name, OdfFileDom dom) {
+		OdfNamespace newNS = dom.setNamespace(name.getPrefix(), name.getUri());
+		return OdfName.newName(newNS, name.getLocalName());
+	}
+
+	/**
+	 * @param dom the XML DOM file where the node should be created on.
+	 * @param nodeClass being an XMLNode the Java class of the instance to be created.
+	 * @return an object instance of the XML node class being provided (usally an attribute or element). */
+	static Object getNodeFromClass(OdfFileDom dom, Class nodeClass) {
+		Object o = null;
+		try {
+			Constructor ctor = nodeClass.getConstructor(new Class[]{OdfFileDom.class});
+			o = ctor.newInstance(new Object[]{dom});
+		} catch (Exception cause) {
+			// an exception at this point is a bug. Throw an Error
+			throw new Error("ODF DOM error in attribute factory", cause);
+		}
+		return o;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLHelper.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLHelper.java
new file mode 100644
index 0000000..9519c5a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfXMLHelper.java
@@ -0,0 +1,377 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+class OdfXMLHelper {
+
+	/**
+	 * create an XMLReader
+	 * with a Resolver set to parse content in a ODF Package
+	 *
+	 * @param pkg the ODF Package
+	 * @return a SAX XMLReader
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public XMLReader newXMLReader(OdfPackage pkg)
+			throws SAXException, ParserConfigurationException {
+		XMLReader xmlReader = pkg.getXMLReader();
+		xmlReader.setEntityResolver(pkg.getEntityResolver());
+		return xmlReader;
+	}
+
+	/**
+	 * use SAX parser to parse content of package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param contentHandler a SAX Content handler to receive SAX Events
+	 * @param errorHandler a SAX Error handler to be called on errors during parsing
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 */
+	public void parse(OdfPackage pkg, String path, ContentHandler contentHandler, ErrorHandler errorHandler)
+			throws SAXException, ParserConfigurationException, IOException, IllegalArgumentException, TransformerConfigurationException, TransformerException {
+
+		InputStream is = null;
+		try {
+			is = pkg.getInputStream(path);
+			XMLReader reader = newXMLReader(pkg);
+
+			String uri = pkg.getBaseURI() + path;
+
+			if (contentHandler != null) {
+				reader.setContentHandler(contentHandler);
+			}
+			if (errorHandler != null) {
+				reader.setErrorHandler(errorHandler);
+			}
+
+			InputSource ins = new InputSource(is);
+			ins.setSystemId(uri);
+
+			reader.parse(ins);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+		} finally {
+			try {
+				is.close();
+			} catch (IOException ex) {
+				Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templatePath a path to a file in the filesystem containing an XSL Template
+	 * @param outPath a path in the filesystem for the output of the XSL Transformation
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, String templatePath, String outPath)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		transform(pkg, path, new File(templatePath), new File(outPath));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templateSource TraX Source of an XSL Transformation Template
+	 * @param outPath path to an output file for the XSL Transformation
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Source templateSource, String outPath)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		transform(pkg, path, templateSource, new File(outPath));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templateSource TraX Source of an XSL Transformation
+	 * @param out an output File
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Source templateSource, File out)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		transform(pkg, path, templateSource, new StreamResult(out));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * insert result back to package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templatePath path inside the filesystem to an XSL template file
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, String templatePath)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+		transform(pkg, path, new File(templatePath));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param template File containing an XSLT Template
+	 * @param out File for the XSLT ouput
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, File template, File out)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		TransformerFactory transformerfactory = TransformerFactory.newInstance();
+
+		Templates templates = transformerfactory.newTemplates(new StreamSource(template));
+		transform(pkg, path, templates, new StreamResult(out));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * insert result back to package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param template a File containing an XSLT Template
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, File template)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		TransformerFactory transformerfactory = TransformerFactory.newInstance();
+
+		Templates templates = transformerfactory.newTemplates(new StreamSource(template));
+		transform(pkg, path, templates);
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templateSource TraX Source of an XSLT Template
+	 * @param result TraX Result of XSL-Tranformation
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Source templateSource, Result result)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException,
+			ParserConfigurationException {
+		TransformerFactory transformerfactory = TransformerFactory.newInstance();
+		transformerfactory.setURIResolver(pkg.getURIResolver());
+
+		Templates templates = transformerfactory.newTemplates(templateSource);
+		transform(pkg, path, templates, result);
+	}
+
+	/**
+	 * Does an XSL-Transformation on content contained in package.<br/><br/>
+	 *
+	 * There are three default parameters provided to the transformation:
+	 * There are three default parameters provided to the transformation:
+	 * <ol>
+	 * <li><b>sourceURL:</b> the URL of the source directory </li>
+	 * <li><b>sourceBaseURL:</b> baseURL of the source file (the package).
+	 * This URL necessary to access any content within the package from the XSLT scripts.
+	 * The relative package path will concatenated after the 'sourceBaseURL'.</li>
+	 * <li><b>targetURL:</b> the URL of the target directory</li>
+	 * <li><b>targetBaseURL:</b>the baseURL of the target file</li>
+	 * </ol>
+	 *
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templates TraX XSLT Template
+	 * @param result TraX XSLT Result
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Templates templates, Result result)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException,
+			ParserConfigurationException {
+		try {
+
+			Source source = null;
+			String uri = pkg.getBaseURI() + path;
+			Document doc = pkg.getDom(path);
+			source = new DOMSource(doc);
+			Transformer transformer = templates.newTransformer();
+			transformer.setURIResolver(pkg.getURIResolver());
+
+			transformer.setParameter("sourceURL", uri);
+			// switch to this, for odf2rdf.xsl grddl transformation
+			transformer.setParameter("sourceBaseURL", Util.getRDFBaseUri(pkg.getBaseURI(), path));
+
+			uri = result.getSystemId();
+			if (uri != null) {
+				transformer.setParameter("targetURL", uri);
+				int i = uri.lastIndexOf('/');
+				if (i > 0) {
+					uri = uri.substring(0, i + 1);
+					transformer.setParameter("targetBaseURL", uri);
+				}
+			}
+			DocumentType doctype = doc.getDoctype();
+			if (doctype != null) {
+				if (doctype.getPublicId() != null) {
+					transformer.setParameter("publicType", doctype.getPublicId());
+				}
+				if (doctype.getSystemId() != null) {
+					transformer.setParameter("systemType", doctype.getSystemId());
+				}
+			}
+
+			transformer.transform(source, result);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * and insert result back to package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templates Trax XSLT Template
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Templates templates)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		Result result = null;
+		ByteArrayOutputStream baos = null;
+
+//		if (pkg.isDomCached(path)) {
+//			result = new DOMResult();
+//		} else {
+			baos = new ByteArrayOutputStream();
+			result = new StreamResult(baos);
+//		}
+
+		transform(pkg, path, templates, result);
+
+//		if (pkg.isDomCached(path)) {
+//			try {
+//				pkg.insert((Document) ((DOMResult) result).getNode(), path, null);
+//			} catch (Exception ex) {
+//				Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+//			}
+//		} else {
+			try {
+				byte[] data = baos.toByteArray();
+				pkg.insert(data, path, "text/xml");
+			} catch (Exception ex) {
+				Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+			}
+//		}
+
+	}
+}
+
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/Resolver.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/Resolver.java
new file mode 100644
index 0000000..9215348
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/Resolver.java
@@ -0,0 +1,171 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.JarURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.stream.StreamSource;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * resolve external entities
+ */
+class Resolver implements EntityResolver, URIResolver {
+
+	private final OdfPackage mPackage;
+
+	/**
+	 * Resolver constructor.
+	 */
+	public Resolver(OdfPackage pkg) {
+		super();
+		mPackage = pkg;
+	}
+
+	/**
+	 * Allow the application to resolve external entities.
+	 *
+	 * The Parser will call this method before opening any external entity except
+	 * the top-level document entity (including the external DTD subset,
+	 * external entities referenced within the DTD, and external entities referenced
+	 * within the document element): the application may request that the parser
+	 * resolve the entity itself, that it use an alternative URI,
+	 * or that it use an entirely different input source.
+	 */
+	public InputSource resolveEntity(String publicId, String systemId)
+			throws SAXException, IOException {
+		// this deactivates the attempt to load the none existent Math DTD once referenced from OOo files
+		if (publicId != null && publicId.startsWith("-//OpenOffice.org//DTD Modified W3C MathML")) {
+			return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes()));
+		}
+		if (systemId != null) {
+			// if the entity to be resolved is the base URI return the package
+			if ((mPackage.getBaseURI() != null) && systemId.startsWith(mPackage.getBaseURI())) {
+				if (systemId.equals(mPackage.getBaseURI())) {
+					InputStream in = null;
+					try {
+						in = mPackage.getInputStream();
+					} catch (Exception e) {
+						throw new SAXException(e);
+					}
+					InputSource ins;
+					ins = new InputSource(in);
+
+					if (ins == null) {
+						return null;
+					}
+					ins.setSystemId(systemId);
+					return ins;
+				} else {
+					// if the reference points into the package (is larger than the base URI)
+					if (systemId.length() > mPackage.getBaseURI().length() + 1) {
+						InputStream in = null;
+						try {
+							String path = systemId.substring(mPackage.getBaseURI().length() + 1);
+							in = mPackage.getInputStream(path);
+							InputSource ins = new InputSource(in);
+							ins.setSystemId(systemId);
+							return ins;
+						} catch (Exception ex) {
+							Logger.getLogger(Resolver.class.getName()).log(Level.SEVERE, null, ex);
+						} finally {
+							try {
+								in.close();
+							} catch (IOException ex) {
+								Logger.getLogger(Resolver.class.getName()).log(Level.SEVERE, null, ex);
+							}
+						}
+					}
+					return null;
+				}
+			} else if (systemId.startsWith("resource:/")) {
+				int i = systemId.indexOf('/');
+				if ((i > 0) && systemId.length() > i + 1) {
+					String res = systemId.substring(i + 1);
+					ClassLoader cl = OdfPackage.class.getClassLoader();
+					InputStream in = cl.getResourceAsStream(res);
+					if (in != null) {
+						InputSource ins = new InputSource(in);
+						ins.setSystemId(systemId);
+						return ins;
+					}
+				}
+				return null;
+			} else if (systemId.startsWith("jar:")) {
+				try {
+					URL url = new URL(systemId);
+					JarURLConnection jarConn = (JarURLConnection) url.openConnection();
+					InputSource ins = new InputSource(jarConn.getInputStream());
+					ins.setSystemId(systemId);
+					return ins;
+				} catch (MalformedURLException ex) {
+					Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		}
+		return null;
+	}
+
+	public Source resolve(String href, String base)
+			throws TransformerException {
+		try {
+			URI uri = null;
+			if (base != null) {
+				URI baseuri = new URI(base);
+				uri = baseuri.resolve(href);
+			} else {
+				uri = new URI(href);
+			}
+
+			InputSource ins = null;
+			try {
+				ins = resolveEntity(null, uri.toString());
+			} catch (Exception e) {
+				throw new TransformerException(e);
+			}
+			if (ins == null) {
+				return null;
+			}
+			InputStream in = ins.getByteStream();
+			StreamSource src = new StreamSource(in);
+			src.setSystemId(uri.toString());
+			return src;
+		} catch (URISyntaxException use) {
+			return null;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/StreamHelper.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/StreamHelper.java
new file mode 100644
index 0000000..d9ec77b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/StreamHelper.java
@@ -0,0 +1,81 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * This class reads from an InputStream and writes to an OutputStream.
+ * No streams will be closed - calling classes must do this.
+ */
+class StreamHelper {
+
+    // 4096 is thought to be the minimum page size for most systems;
+    // change this for optimization
+    public static final int PAGE_SIZE = 4096;
+    private InputStream in;
+    private OutputStream out;
+    private boolean mStreamed;
+
+    /**
+     * Read from the input stream and write to the output. This method
+     * does not close any stream; calling methods must take care of that.
+     * @throws IOException when io error happens
+     */
+    static void transformStream(InputStream in, OutputStream out) throws IOException {
+        StreamHelper s = new StreamHelper(in, out);
+        s.stream();
+    }
+
+    /**
+     * Create a new StreamHelper
+     * @param in the input stream used for reading
+     * @param out the output stream written to
+     */
+    StreamHelper(InputStream in, OutputStream out) {
+        this.in = in;
+        this.out = out;
+        mStreamed = false;
+    }
+
+    /**
+     * Read from the input stream and write to the output. This method can only
+     * be called once. A second call will result in an IOException. This method
+     * does not close any stream; calling methods must take care of that.
+     * @throws IOException when io error happens
+     */
+    void stream() throws IOException {
+        if (mStreamed) throw new IOException();
+        byte[] buf = new byte[PAGE_SIZE];
+        int r = 0;
+        // let npe happen if one of the streams is null
+        while ((r = in.read(buf, 0, PAGE_SIZE)) > -1) {
+            out.write(buf, 0, r);
+        }
+        // free the references
+        in = null;
+        out = null;
+        mStreamed = true;
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ValidationConstraint.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ValidationConstraint.java
new file mode 100644
index 0000000..b3eb571
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ValidationConstraint.java
@@ -0,0 +1,49 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2010 Oracle and/or its affiliates. All rights reserved.ed.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+/**
+ * A <code>ValidationConstraint</code> is used to collect validation conditions and their return messages in case not appliance (invalid condition).
+ */
+public interface ValidationConstraint {
+
+	 /**
+     * Creates a localized description of a Constraint.
+     * Subclasses may override this method in order to produce a
+     * locale-specific message.  For subclasses that do not override this
+     * method, the default implementation returns the same result as
+     * <code>getMessage()</code>.
+     *
+     * @return  The localized description of this constraint. */
+	
+	public String getLocalizedMessage();
+
+
+    /**
+     * Returns the detail message string of this Constraint.
+     *
+     * @return  the detail message string of this <tt>Constraint</tt> instance
+     *          (which may be <tt>null</tt>).
+     */
+	public String getMessage();
+}
+
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ZipHelper.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ZipHelper.java
new file mode 100644
index 0000000..e883150
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/ZipHelper.java
@@ -0,0 +1,154 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+
+class ZipHelper {
+
+	private ZipFile mZipFile = null;
+	private byte[] mZipBuffer = null;
+	private OdfPackage mPackage = null;
+
+	public ZipHelper(OdfPackage pkg, ZipFile zipFile) {
+		mZipFile = zipFile;
+		mZipBuffer = null;
+		mPackage = pkg;
+	}
+
+	public ZipHelper(OdfPackage pkg, byte[] buffer) {
+		mZipBuffer = buffer;
+		mZipFile = null;
+		mPackage = pkg;
+	}
+
+	String entriesToMap(Map<String, ZipEntry> zipEntries) throws IOException, SAXException {
+		String firstEntryName = null;
+		if (mZipFile != null) {
+			Enumeration<? extends ZipEntry> entries = mZipFile.entries();
+			if (entries.hasMoreElements()) {
+				ZipEntry zipEntry = entries.nextElement();
+				if (zipEntry != null) {
+					firstEntryName = zipEntry.getName();
+					addZipEntry(zipEntry, zipEntries);
+					while (entries.hasMoreElements()) {
+						zipEntry = entries.nextElement();
+						addZipEntry(zipEntry, zipEntries);
+					}
+				}
+			}
+		} else {
+			ZipInputStream inputStream = new ZipInputStream(new ByteArrayInputStream(mZipBuffer));
+			if (inputStream.available() == 0) {
+				throw new IllegalArgumentException("Could not unzip the given ODF package!");
+			} else {
+				ZipEntry zipEntry = inputStream.getNextEntry();
+				if (zipEntry != null) {
+					firstEntryName = zipEntry.getName();
+					addZipEntry(zipEntry, zipEntries);
+					while (zipEntry != null) {
+						addZipEntry(zipEntry, zipEntries);
+						try {
+							zipEntry = inputStream.getNextEntry();
+						} catch (java.util.zip.ZipException e) {
+							// JDK 6 -- the try/catch is workaround for a
+							// specific JDK 5 only problem
+							if (!e.getMessage().contains("missing entry name") && !System.getProperty("Java.version").equals("1.5.0")) {
+								Logger.getLogger(ZipHelper.class.getName()).info("ZIP ENTRY not found");
+								throw e;
+							}
+						}
+					}
+				}
+			}
+			inputStream.close();
+		}
+		return firstEntryName;
+	}
+
+	private void addZipEntry(ZipEntry zipEntry, Map<String, ZipEntry> zipEntries) {
+		String filePath = OdfPackage.normalizePath(zipEntry.getName());
+		ErrorHandler errorHandler = mPackage.getErrorHandler();
+		if (errorHandler != null) {
+			try {
+				int zipMethod = zipEntry.getMethod();
+				if (zipMethod != ZipEntry.STORED && zipMethod != ZipEntry.DEFLATED) {
+					mPackage.getErrorHandler().error(
+							new OdfValidationException(OdfPackageConstraint.PACKAGE_ENTRY_USING_INVALID_COMPRESSION, mPackage.getBaseURI(), filePath));
+				}
+			} catch (SAXException ex) {
+				Logger.getLogger(OdfPackage.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		zipEntries.put(filePath, zipEntry);
+	}
+
+	InputStream getInputStream(ZipEntry entry) throws IOException {
+		if (mZipFile != null) {
+			return mZipFile.getInputStream(entry);
+		} else {
+			ZipInputStream inputStream = new ZipInputStream(new ByteArrayInputStream(mZipBuffer));
+			ZipEntry zipEntry = inputStream.getNextEntry();
+			while (zipEntry != null) {
+				if (zipEntry.getName().equalsIgnoreCase(entry.getName())) {
+					return readAsInputStream(inputStream);
+				}
+				zipEntry = inputStream.getNextEntry();
+			}
+			return null;
+		}
+	}
+
+	private InputStream readAsInputStream(ZipInputStream inputStream) throws IOException {
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		if (outputStream != null) {
+			byte[] buf = new byte[4096];
+			int r = 0;
+			while ((r = inputStream.read(buf, 0, 4096)) > -1) {
+				outputStream.write(buf, 0, r);
+			}
+			inputStream.close();
+		}
+		return new ByteArrayInputStream(outputStream.toByteArray());
+
+	}
+
+	void close() throws IOException {
+		if (mZipFile != null) {
+			mZipFile.close();
+		} else {
+			mZipBuffer = null;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java
new file mode 100644
index 0000000..9b4d949
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java
@@ -0,0 +1,103 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+
+/**
+ * DOM 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");
+
+	/**
+	 * Create the instance of <code>DocumentSignaturesElement</code>
+	 *
+	 * @param  ownerDoc The type is <code>OdfFileDom</code>
+	 */
+	public DocumentSignaturesElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return <code>OdfName</code> the name of element {@odf.element dsig:document-signatures}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>VersionAttribute</code> , See {@odf.attribute dsig:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>VersionAttribute</code> , See {@odf.attribute dsig:version}
+	 *
+	 * @param versionValue   The type is <code>String</code>
+	 */
+	public void setVersionAttribute(String versionValue) {
+		VersionAttribute attr = new VersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(versionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element ds:Signature}.
+	 *
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @return the element {@odf.element ds:Signature}
+	 */
+	public SignatureElement newSignatureElement() {
+		SignatureElement signature = ((OdfFileDom) this.ownerDocument).newOdfElement(SignatureElement.class);
+		this.appendChild(signature);
+		return signature;
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java
new file mode 100644
index 0000000..696ae4a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java
@@ -0,0 +1,70 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+
+/**
+ * DOM implementation of OpenDocument element  {@odf.element ds:Signature}.
+ *
+ */
+public class SignatureElement extends OdfElement {
+
+	public static final OdfName ELEMENT_NAME = OdfName.newName("http://www.w3.org/2000/09/xmldsig#", "ds:Signature");
+
+	/**
+	 * Create the instance of <code>SignatureElement</code>
+	 *
+	 * @param  ownerDoc The type is <code>OdfFileDom</code>
+	 */
+	public SignatureElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return <code>OdfName</code> the name of element {@odf.element ds:Signature}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * 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("")) {
+			this.appendChild(this.getOwnerDocument().createTextNode(content));
+		}
+	 }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java
new file mode 100644
index 0000000..32fed37
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java
@@ -0,0 +1,165 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.dsig;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * DOM implementation of OpenDocument attribute  {@odf.attribute dsig:version}.
+ *
+ */
+public class VersionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0", "dsig:version");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute dsig:version}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public VersionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute dsig:version}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute dsig:version}.
+	 */
+	public enum Value {
+		_1_2("1.2") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(Value.enumValueOf(attrValue).toString());
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException(e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return Value.enumValueOf(super.getValue()).toString();
+		} catch (NullPointerException e) {
+			throw new IllegalArgumentException("the value of dsig:version is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute dsig:version}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute dsig:version} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java
new file mode 100644
index 0000000..e70d8b0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java
@@ -0,0 +1,112 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+/**
+ * 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");
+
+	/**
+	 * Create the instance of <code>AlgorithmElement</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public AlgorithmElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:algorithm}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>AlgorithmNameAttribute</code> , See {@odf.attribute manifest:algorithm-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>AlgorithmNameAttribute</code> , See {@odf.attribute manifest:algorithm-name}
+	 *
+	 * @param algorithmNameValue   The type is <code>String</code>
+	 */
+	public void setAlgorithmNameAttribute(String algorithmNameValue) {
+		AlgorithmNameAttribute attr = new AlgorithmNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(algorithmNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>InitialisationVectorAttribute</code> , See {@odf.attribute manifest:initialisation-vector}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>InitialisationVectorAttribute</code> , See {@odf.attribute manifest:initialisation-vector}
+	 *
+	 * @param initialisationVectorValue   The type is <code>String</code>
+	 */
+	public void setInitialisationVectorAttribute(String initialisationVectorValue) {
+		InitialisationVectorAttribute attr = new InitialisationVectorAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(initialisationVectorValue);
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java
new file mode 100644
index 0000000..60c04a3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:algorithm-name}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:algorithm-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public AlgorithmNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:algorithm-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute manifest:algorithm-name}.
+	 */
+	public enum Value {
+		BLOWFISH_CFB("Blowfish CFB") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:algorithm-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:algorithm-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java
new file mode 100644
index 0000000..159bf53
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:checksum}.
+ *
+ */
+public class ChecksumAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:checksum");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:checksum}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChecksumAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:checksum}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of checksum is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:checksum}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:checksum} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java
new file mode 100644
index 0000000..445b1f6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:checksum-type}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:checksum-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public ChecksumTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:checksum-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute manifest:checksum-type}.
+	 */
+	public enum Value {
+		SHA1_1K("SHA1/1K") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:checksum-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:checksum-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
new file mode 100644
index 0000000..977bf9e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
@@ -0,0 +1,167 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+/**
+ * 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");
+
+	/**
+	 * Create the instance of <code>EncryptionDataElement</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public EncryptionDataElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:encryption-data}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChecksumAttribute</code> , See {@odf.attribute manifest:checksum}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChecksumAttribute</code> , See {@odf.attribute manifest:checksum}
+	 *
+	 * @param checksumValue   The type is <code>String</code>
+	 */
+	public void setChecksumAttribute(String checksumValue) {
+		ChecksumAttribute attr = new ChecksumAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(checksumValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>ChecksumTypeAttribute</code> , See {@odf.attribute manifest:checksum-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>ChecksumTypeAttribute</code> , See {@odf.attribute manifest:checksum-type}
+	 *
+	 * @param checksumTypeValue   The type is <code>String</code>
+	 */
+	public void setChecksumTypeAttribute(String checksumTypeValue) {
+		ChecksumTypeAttribute attr = new ChecksumTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(checksumTypeValue);
+	}
+
+	/**
+	 * Create child element {@odf.element manifest:algorithm}.
+	 *
+	 * @param algorithmNameValue  the <code>String</code> value of <code>AlgorithmNameAttribute</code>, see {@odf.attribute  manifest:algorithm-name} at specification
+	 * @param initialisationVectorValue  the <code>String</code> value of <code>InitialisationVectorAttribute</code>, see {@odf.attribute  manifest:initialisation-vector} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @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);
+		this.appendChild(algorithm);
+		return algorithm;
+	}
+
+	/**
+	 * Create child element {@odf.element manifest:key-derivation}.
+	 *
+	 * @param iterationCountValue  the <code>Integer</code> value of <code>IterationCountAttribute</code>, see {@odf.attribute  manifest:iteration-count} at specification
+	 * @param keyDerivationNameValue  the <code>String</code> value of <code>KeyDerivationNameAttribute</code>, see {@odf.attribute  manifest:key-derivation-name} at specification
+	 * @param saltValue  the <code>String</code> value of <code>SaltAttribute</code>, see {@odf.attribute  manifest:salt} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @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;
+	}
+
+	/**
+	 * Create child element {@odf.element manifest:start-key-generation}.
+	 *
+	 * @param startKeyGenerationNameValue  the <code>String</code> value of <code>StartKeyGenerationNameAttribute</code>, see {@odf.attribute  manifest:start-key-generation-name} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @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);
+		this.appendChild(startKeyGeneration);
+		return startKeyGeneration;
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java
new file mode 100644
index 0000000..0962b41
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java
@@ -0,0 +1,201 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+/**
+ * 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");
+
+	/**
+	 * Create the instance of <code>FileEntryElement</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public FileEntryElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:file-entry}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>FullPathAttribute</code> , See {@odf.attribute manifest:full-path}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>FullPathAttribute</code> , See {@odf.attribute manifest:full-path}
+	 *
+	 * @param fullPathValue   The type is <code>String</code>
+	 */
+	public void setFullPathAttribute(String fullPathValue) {
+		FullPathAttribute attr = new FullPathAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(fullPathValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>MediaTypeAttribute</code> , See {@odf.attribute manifest:media-type}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>MediaTypeAttribute</code> , See {@odf.attribute manifest:media-type}
+	 *
+	 * @param mediaTypeValue   The type is <code>String</code>
+	 */
+	public void setMediaTypeAttribute(String mediaTypeValue) {
+		MediaTypeAttribute attr = new MediaTypeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(mediaTypeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>PreferredViewModeAttribute</code> , See {@odf.attribute manifest:preferred-view-mode}
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>PreferredViewModeAttribute</code> , See {@odf.attribute manifest:preferred-view-mode}
+	 *
+	 * @param preferredViewModeValue   The type is <code>String</code>
+	 */
+	public void setPreferredViewModeAttribute(String preferredViewModeValue) {
+		PreferredViewModeAttribute attr = new PreferredViewModeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(preferredViewModeValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SizeAttribute</code> , See {@odf.attribute manifest:size}
+	 *
+	 * @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);
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SizeAttribute</code> , See {@odf.attribute manifest:size}
+	 *
+	 * @param sizeValue   The type is <code>Integer</code>
+	 */
+	public void setSizeAttribute(Integer sizeValue) {
+		SizeAttribute attr = new SizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(sizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>VersionAttribute</code> , See {@odf.attribute manifest:version}
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>VersionAttribute</code> , See {@odf.attribute manifest:version}
+	 *
+	 * @param versionValue   The type is <code>String</code>
+	 */
+	public void setVersionAttribute(String versionValue) {
+		VersionAttribute attr = new VersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(versionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element manifest:encryption-data}.
+	 *
+	 * @param checksumValue  the <code>String</code> value of <code>ChecksumAttribute</code>, see {@odf.attribute  manifest:checksum} at specification
+	 * @param checksumTypeValue  the <code>String</code> value of <code>ChecksumTypeAttribute</code>, see {@odf.attribute  manifest:checksum-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * @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;
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java
new file mode 100644
index 0000000..e21a0f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:full-path}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:full-path}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public FullPathAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:full-path}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of full-path is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:full-path}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:full-path} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java
new file mode 100644
index 0000000..525de5c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:initialisation-vector}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:initialisation-vector}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public InitialisationVectorAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:initialisation-vector}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of initialisation-vector is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:initialisation-vector}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:initialisation-vector} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java
new file mode 100644
index 0000000..6a250b2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java
@@ -0,0 +1,149 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:iteration-count}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:iteration-count}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public IterationCountAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:iteration-count}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of iteration-count is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:iteration-count}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:iteration-count} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java
new file mode 100644
index 0000000..c85ce80
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java
@@ -0,0 +1,162 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+/**
+ * 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");
+
+	/**
+	 * Create the instance of <code>KeyDerivationElement</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public KeyDerivationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:key-derivation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>IterationCountAttribute</code> , See {@odf.attribute manifest:iteration-count}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>IterationCountAttribute</code> , See {@odf.attribute manifest:iteration-count}
+	 *
+	 * @param iterationCountValue   The type is <code>Integer</code>
+	 */
+	public void setIterationCountAttribute(Integer iterationCountValue) {
+		IterationCountAttribute attr = new IterationCountAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(iterationCountValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>KeyDerivationNameAttribute</code> , See {@odf.attribute manifest:key-derivation-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>KeyDerivationNameAttribute</code> , See {@odf.attribute manifest:key-derivation-name}
+	 *
+	 * @param keyDerivationNameValue   The type is <code>String</code>
+	 */
+	public void setKeyDerivationNameAttribute(String keyDerivationNameValue) {
+		KeyDerivationNameAttribute attr = new KeyDerivationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(keyDerivationNameValue);
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>KeySizeAttribute</code> , See {@odf.attribute manifest:key-size}
+	 *
+	 * @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);
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>KeySizeAttribute</code> , See {@odf.attribute manifest:key-size}
+	 *
+	 * @param keySizeValue   The type is <code>Integer</code>
+	 */
+	public void setKeySizeAttribute(Integer keySizeValue) {
+		KeySizeAttribute attr = new KeySizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(keySizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>SaltAttribute</code> , See {@odf.attribute manifest:salt}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>SaltAttribute</code> , See {@odf.attribute manifest:salt}
+	 *
+	 * @param saltValue   The type is <code>String</code>
+	 */
+	public void setSaltAttribute(String saltValue) {
+		SaltAttribute attr = new SaltAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(saltValue);
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java
new file mode 100644
index 0000000..c345d27
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:key-derivation-name}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:key-derivation-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public KeyDerivationNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:key-derivation-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute manifest:key-derivation-name}.
+	 */
+	public enum Value {
+		PBKDF2("PBKDF2") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:key-derivation-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:key-derivation-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java
new file mode 100644
index 0000000..2c1437a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java
@@ -0,0 +1,149 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:key-size}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:key-size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public KeySizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:key-size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of key-size is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:key-size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:key-size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java
new file mode 100644
index 0000000..e8ce4dc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java
@@ -0,0 +1,105 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+/**
+ * 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");
+
+	/**
+	 * Create the instance of <code>ManifestElement</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public ManifestElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:manifest}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>VersionAttribute</code> , See {@odf.attribute manifest:version}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>VersionAttribute</code> , See {@odf.attribute manifest:version}
+	 *
+	 * @param versionValue   The type is <code>String</code>
+	 */
+	public void setVersionAttribute(String versionValue) {
+		VersionAttribute attr = new VersionAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(versionValue);
+	}
+
+	/**
+	 * Create child element {@odf.element manifest:file-entry}.
+	 *
+	 * @param fullPathValue  the <code>String</code> value of <code>FullPathAttribute</code>, see {@odf.attribute  manifest:full-path} at specification
+	 * @param mediaTypeValue  the <code>String</code> value of <code>MediaTypeAttribute</code>, see {@odf.attribute  manifest:media-type} at specification
+	 * Child element is new in Odf 1.2
+	 *
+	 * Child element is mandatory.
+	 *
+	 * @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;
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java
new file mode 100644
index 0000000..c3aab9c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:media-type}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:media-type}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public MediaTypeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:media-type}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of media-type is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:media-type}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:media-type} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfFileEntry.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfFileEntry.java
new file mode 100644
index 0000000..30d336d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfFileEntry.java
@@ -0,0 +1,246 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+public class OdfFileEntry {
+
+	private FileEntryElement mFileEntryElement;
+
+	private static Map<String, String> MEDIA_TYPE_MAP = null;
+	private static final String EMPTY_STRING = "";
+	private static final String DEFAULT_TYPE = "application/octet-stream";
+	private static final String APPLICATION_POSTSCRIPT = "application/postscript";
+	private static final String APPLICATION_RTF = "application/rtf";
+	private static final String APPLICATION_X_TEX = "application/x-tex";
+	private static final String APPLICATION_X_TEXINFO = "application/x-texinfo";
+	private static final String APPLICATION_X_TROFF = "application/x-troff";
+	private static final String AUDIO_BASIC = "audio/basic";
+	private static final String AUDIO_MIDI = "audio/midi";
+	private static final String AUDIO_X_AIFC = "audio/x-aifc";
+	private static final String AUDIO_X_AIFF = "audio/x-aiff";
+	private static final String AUDIO_X_MPEG = "audio/x-mpeg";
+	private static final String AUDIO_X_WAV = "audio/x-wav";
+	private static final String IMAGE_GIF = "image/gif";
+	private static final String IMAGE_IEF = "image/ief";
+	private static final String IMAGE_JPEG = "image/jpeg";
+	private static final String IMAGE_PNG = "image/png";
+	private static final String IMAGE_TIFF = "image/tiff";
+	private static final String IMAGE_X_XWINDOWDUMP = "image/x-xwindowdump";
+	private static final String TEXT_HTML = "text/html";
+	private static final String TEXT_PLAIN = "text/plain";
+	private static final String TEXT_XML = "text/xml";
+	private static final String VIDEO_MEPG = "video/mpeg";
+	private static final String VIDEO_QUICKTIME = "video/quicktime";
+	private static final String VIDEO_X_MSVIDEO = "video/x-msvideo";
+
+	/**
+	 * @param fileEntryElement
+	 *            the OdfElement of the <manifest:file-entry>
+	 */
+	public OdfFileEntry(FileEntryElement fileEntryElement) {
+		mFileEntryElement = fileEntryElement;
+	}
+
+	public void setPath(String path) {
+		mFileEntryElement.setFullPathAttribute(path);
+	}
+
+	public String getPath() {
+		return mFileEntryElement.getFullPathAttribute();
+	}
+
+	/**
+	 * @param mediaType
+	 *            of the file. Use <code>null</code> or an empty string to unset
+	 *            the mediaType to an empty string.
+	 */
+	public void setMediaTypeString(String mediaType) {
+		if (mediaType != null) {
+			mFileEntryElement.setMediaTypeAttribute(mediaType);
+		} else {
+			mFileEntryElement.setMediaTypeAttribute(EMPTY_STRING);
+		}
+	}
+
+	/**
+	 * @return the mediatype of the mandatory &lt;manifest:file-entry&gt;
+	 *         attribute. If no mediatype exists an empty string is returned
+	 */
+	public String getMediaTypeString() {
+		return mFileEntryElement.getMediaTypeAttribute();
+	}
+
+	/**
+	 * Get the media type from the given file reference
+	 * 
+	 * @param fileRef
+	 *            the reference to the file the media type is questioned
+	 * 
+	 * @return the mediaType string of the given file reference
+	 */
+	public static String getMediaTypeString(String fileRef) {
+		String mediaType = null;
+		try {
+			// use 'JavaBeans Activation Framework' if available (as library or
+			// as part of JDK 6)
+			Class<?> mimetypesClass = Class.forName("javax.activation.MimetypesFileTypeMap");
+			Method getContentTypeMethod = mimetypesClass.getMethod("getContentType", String.class);
+			mediaType = (String) getContentTypeMethod.invoke(getContentTypeMethod, fileRef);
+		} catch (Exception e) {
+			// otherwise (JDK 5 without library of 'JavaBeans Activation
+			// Framework')
+			// use local fallback implementation
+			// mLog.fine("Using own mediatype handling as 'JavaBeans Activation Framework' not found: "
+			// + e.getMessage());
+			mediaType = findMediaTypeString(fileRef);
+		}
+		return mediaType;
+	}
+
+	public void setSize(Integer size) {
+		if (size == null) {
+			mFileEntryElement.removeAttributeNS(SizeAttribute.ATTRIBUTE_NAME.getUri(),
+					SizeAttribute.ATTRIBUTE_NAME.getLocalName());
+		} else {
+			mFileEntryElement.setSizeAttribute(size);
+		}
+	}
+
+	/**
+	 * Get the size.
+	 */
+	public Integer getSize() {
+		return mFileEntryElement.getSizeAttribute();
+	}
+
+	public void setEncryptionData(EncryptionDataElement encryptionData) {
+		EncryptionDataElement encryptionDataEle = getEncryptionData();
+		if (encryptionData != null) {
+			if (encryptionDataEle != null) {
+				mFileEntryElement.replaceChild(encryptionData, encryptionDataEle);
+			} else {
+				mFileEntryElement.appendChild(encryptionData);
+			}
+		} else {
+			if (encryptionDataEle != null) {
+				mFileEntryElement.removeChild(encryptionDataEle);
+			}
+		}
+	}
+
+	/** @return null if no encryption data had been set */
+	public EncryptionDataElement getEncryptionData() {
+		return OdfElement.findFirstChildNode(EncryptionDataElement.class, mFileEntryElement);
+	}
+
+	/**
+	 * Gets the OdfElement of this OdfFileEntry.
+	 * 
+	 * @return the OdfElement of this OdfFileEntry.
+	 */
+	public FileEntryElement getOdfElement() {
+		return mFileEntryElement;
+	}
+
+	/**
+	 * Own mediatype functionality which can be removed as soon JDK 6 is base
+	 * line
+	 */
+	private static String findMediaTypeString(String fileRef) {
+		String fileSuffix = null;
+		String mediaType = null;
+
+		int suffixStart = fileRef.lastIndexOf(".");
+		// default mediatype, if no dot exists
+		if (suffixStart < 0) {
+			mediaType = DEFAULT_TYPE;
+		} else {
+			fileSuffix = fileRef.substring(suffixStart + 1);
+			// default mediattype, if the file ends with a dot, the suffix is
+			// empty
+			if (fileSuffix.length() == 0) {
+				mediaType = DEFAULT_TYPE;
+			} else {
+				if (MEDIA_TYPE_MAP == null) {
+					initializeMediaTypeMap();
+				}
+				mediaType = MEDIA_TYPE_MAP.get(fileSuffix.toLowerCase());
+				// default mediatype, if no mediatype for this suffix exists
+				if (mediaType == null) {
+					mediaType = DEFAULT_TYPE;
+				}
+			}
+		}
+		return mediaType;
+	}
+
+	// initializes Map for suffix to media type string mapping
+	private static void initializeMediaTypeMap() {
+		MEDIA_TYPE_MAP = new HashMap<String, String>(39);
+		MEDIA_TYPE_MAP.put("ai", APPLICATION_POSTSCRIPT);
+		MEDIA_TYPE_MAP.put("eps", APPLICATION_POSTSCRIPT);
+		MEDIA_TYPE_MAP.put("ps", APPLICATION_POSTSCRIPT);
+		MEDIA_TYPE_MAP.put("rtf", APPLICATION_RTF);
+		MEDIA_TYPE_MAP.put("tex", APPLICATION_X_TEX);
+		MEDIA_TYPE_MAP.put("texi", APPLICATION_X_TEXINFO);
+		MEDIA_TYPE_MAP.put("texinfo", APPLICATION_X_TEXINFO);
+		MEDIA_TYPE_MAP.put("t", APPLICATION_X_TROFF);
+		MEDIA_TYPE_MAP.put("tr", APPLICATION_X_TROFF);
+		MEDIA_TYPE_MAP.put("roff", APPLICATION_X_TROFF);
+		MEDIA_TYPE_MAP.put("au", AUDIO_BASIC);
+		MEDIA_TYPE_MAP.put("midi", AUDIO_MIDI);
+		MEDIA_TYPE_MAP.put("mid", AUDIO_MIDI);
+		MEDIA_TYPE_MAP.put("aifc", AUDIO_X_AIFC);
+		MEDIA_TYPE_MAP.put("aif", AUDIO_X_AIFF);
+		MEDIA_TYPE_MAP.put("aiff", AUDIO_X_AIFF);
+		MEDIA_TYPE_MAP.put("mpeg", AUDIO_X_MPEG);
+		MEDIA_TYPE_MAP.put("mpg", AUDIO_X_MPEG);
+		MEDIA_TYPE_MAP.put("wav", AUDIO_X_WAV);
+		MEDIA_TYPE_MAP.put("gif", IMAGE_GIF);
+		MEDIA_TYPE_MAP.put("ief", IMAGE_IEF);
+		MEDIA_TYPE_MAP.put("jpeg", IMAGE_JPEG);
+		MEDIA_TYPE_MAP.put("jpg", IMAGE_JPEG);
+		MEDIA_TYPE_MAP.put("jpe", IMAGE_JPEG);
+		MEDIA_TYPE_MAP.put("png", IMAGE_PNG);
+		MEDIA_TYPE_MAP.put("tiff", IMAGE_TIFF);
+		MEDIA_TYPE_MAP.put("tif", IMAGE_TIFF);
+		MEDIA_TYPE_MAP.put("xwd", IMAGE_X_XWINDOWDUMP);
+		MEDIA_TYPE_MAP.put("html", TEXT_HTML);
+		MEDIA_TYPE_MAP.put("htm", TEXT_HTML);
+		MEDIA_TYPE_MAP.put("xhtml", TEXT_HTML);
+		MEDIA_TYPE_MAP.put("txt", TEXT_PLAIN);
+		MEDIA_TYPE_MAP.put("text", TEXT_PLAIN);
+		MEDIA_TYPE_MAP.put("xml", TEXT_XML);
+		MEDIA_TYPE_MAP.put("mpeg", VIDEO_MEPG);
+		MEDIA_TYPE_MAP.put("mpg", VIDEO_MEPG);
+		MEDIA_TYPE_MAP.put("mpe", VIDEO_MEPG);
+		MEDIA_TYPE_MAP.put("qt", VIDEO_QUICKTIME);
+		MEDIA_TYPE_MAP.put("mov", VIDEO_QUICKTIME);
+		MEDIA_TYPE_MAP.put("avi", VIDEO_X_MSVIDEO);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java
new file mode 100644
index 0000000..43d68d9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java
@@ -0,0 +1,104 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.manifest;
+
+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
+	 *            the internal package path to the XML file
+	 */
+	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
+	 *            the internal package path to the XML file
+	 */
+	public OdfManifestDom(OdfPackage pkg, String packagePath) {
+		super(pkg, packagePath);
+	}
+	
+	/**
+	 * Might be used to initialize specific XML Namespace prefixes/URIs for this
+	 * XML file
+	 */
+	@Override
+	protected void initialize() {
+		mUriByPrefix.put("manifest", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0");
+		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>.
+	 */
+	@Override
+	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.
+	 */
+	@Override
+	public XPath getXPath() {
+		if (mXPath == null) {
+			mXPath = XPathFactory.newInstance().newXPath();
+			mXPath.setNamespaceContext(this);
+			mUriByPrefix.put("manifest", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0");
+			mPrefixByUri.put("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest");
+		}
+		return mXPath;
+	}
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java
new file mode 100644
index 0000000..e6cb6af
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:preferred-view-mode}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:preferred-view-mode}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public PreferredViewModeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:preferred-view-mode}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute manifest:preferred-view-mode}.
+	 */
+	public enum Value {
+		EDIT("edit"), PRESENTATION_SLIDE_SHOW("presentation-slide-show"), READ_ONLY("read-only") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:preferred-view-mode}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:preferred-view-mode} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java
new file mode 100644
index 0000000..8dd6016
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java
@@ -0,0 +1,129 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:salt}.
+ *
+ */
+public class SaltAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:salt");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:salt}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SaltAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:salt}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of salt is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:salt}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:salt} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java
new file mode 100644
index 0000000..529f033
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java
@@ -0,0 +1,149 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:size}.
+ *
+ */
+public class SizeAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:size");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:size}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public SizeAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:size}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * @param value The <code>int</code> value of the attribute.
+	 */
+	public void setIntValue(int value) {
+		super.setValue(String.valueOf(value));
+	}
+
+	/**
+	 * @return Returns the <code>int</code> value of the attribute
+	 */
+	public int intValue() {
+		String val = super.getValue();
+		try {
+			return Integer.parseInt(val);
+		} catch (NumberFormatException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		try {
+			super.setValue(attrValue);
+		} catch (NullPointerException e) {
+			// TODO: validation handling/logging
+			throw new IllegalArgumentException(e);
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw (e);
+		}
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		try {
+			return super.getValue();
+		} catch (IllegalArgumentException e) {
+			// TODO: validation handling/logging
+			throw new NumberFormatException("the value of size is not valid");
+		}
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:size}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:size} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java
new file mode 100644
index 0000000..5f37287
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java
@@ -0,0 +1,110 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+/**
+ * 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");
+
+	/**
+	 * Create the instance of <code>StartKeyGenerationElement</code>
+	 *
+	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 */
+	public StartKeyGenerationElement(OdfFileDom ownerDoc) {
+		super(ownerDoc, ELEMENT_NAME);
+	}
+
+	/**
+	 * Get the element name
+	 *
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:start-key-generation}.
+	 */
+	public OdfName getOdfName() {
+		return ELEMENT_NAME;
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>KeySizeAttribute</code> , See {@odf.attribute manifest:key-size}
+	 *
+	 * @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);
+		if (attr != null) {
+			return Integer.valueOf(attr.intValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>KeySizeAttribute</code> , See {@odf.attribute manifest:key-size}
+	 *
+	 * @param keySizeValue   The type is <code>Integer</code>
+	 */
+	public void setKeySizeAttribute(Integer keySizeValue) {
+		KeySizeAttribute attr = new KeySizeAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setIntValue(keySizeValue.intValue());
+	}
+
+	/**
+	 * Receives the value of the ODFDOM attribute representation <code>StartKeyGenerationNameAttribute</code> , See {@odf.attribute manifest:start-key-generation-name}
+	 *
+	 * Attribute is mandatory.
+	 *
+	 * @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);
+		if (attr != null) {
+			return String.valueOf(attr.getValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of ODFDOM attribute representation <code>StartKeyGenerationNameAttribute</code> , See {@odf.attribute manifest:start-key-generation-name}
+	 *
+	 * @param startKeyGenerationNameValue   The type is <code>String</code>
+	 */
+	public void setStartKeyGenerationNameAttribute(String startKeyGenerationNameValue) {
+		StartKeyGenerationNameAttribute attr = new StartKeyGenerationNameAttribute((OdfFileDom) this.ownerDocument);
+		setOdfAttribute(attr);
+		attr.setValue(startKeyGenerationNameValue);
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java
new file mode 100644
index 0000000..4d4687c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:start-key-generation-name}.
+ *
+ */
+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");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:start-key-generation-name}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public StartKeyGenerationNameAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:start-key-generation-name}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute manifest:start-key-generation-name}.
+	 */
+	public enum Value {
+		SHA1("SHA1") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:start-key-generation-name}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:start-key-generation-name} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java
new file mode 100644
index 0000000..c14edde
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java
@@ -0,0 +1,159 @@
+/************************************************************************
+ *
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+/*
+ * This file is automatically generated.
+ * Don't edit manually.
+ */
+package org.odftoolkit.odfdom.pkg.manifest;
+
+import org.odftoolkit.odfdom.pkg.OdfAttribute;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+
+/**
+ * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:version}.
+ *
+ */
+public class VersionAttribute extends OdfAttribute {
+
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:version");
+
+	/**
+	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:version}.
+	 *
+	 * @param ownerDocument       The type is <code>OdfFileDom</code>
+	 */
+	public VersionAttribute(OdfFileDom ownerDocument) {
+		super(ownerDocument, ATTRIBUTE_NAME);
+	}
+
+	/**
+	 * Returns the attribute name.
+	 *
+	 * @return the <code>OdfName</code> for {@odf.attribute manifest:version}.
+	 */
+	@Override
+	public OdfName getOdfName() {
+		return ATTRIBUTE_NAME;
+	}
+
+	/**
+	 * @return Returns the name of this attribute.
+	 */
+	@Override
+	public String getName() {
+		return ATTRIBUTE_NAME.getLocalName();
+	}
+
+	/**
+	 * The value set of {@odf.attribute manifest:version}.
+	 */
+	public enum Value {
+		_1_2("1.2") ;
+
+		private String mValue;
+
+		Value(String value) {
+			mValue = value;
+		}
+
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		public static Value enumValueOf(String value) {
+			for(Value aIter : values()) {
+				if (value.equals(aIter.toString())) {
+				return aIter;
+				}
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * @param attrValue The <code>Enum</code> value of the attribute.
+	 */
+	public void setEnumValue(Value attrValue) {
+		setValue(attrValue.toString());
+	}
+
+	/**
+	 * @return Returns the <code>Enum</code> value of the attribute
+	 */
+	public Value getEnumValue() {
+		return Value.enumValueOf(this.getValue());
+	}
+
+	/**
+	 * @param attrValue The <code>String</code> value of the attribute.
+	 * @throws IllegalArgumentException If the provided attribute value is invalid
+	 */
+	@Override
+	public void setValue(String attrValue) {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		super.setValue(attrValue);
+	}
+
+	/**
+	 * @return Returns the <code>String</code> value of the attribute
+	 */
+	@Override
+	public String getValue() {
+		// Since we have not only enumValues, but also a DataType, we use String as common base and don't validate.
+		return super.getValue();
+	}
+
+	/**
+	 * Returns the default value of {@odf.attribute manifest:version}.
+	 *
+	 * @return the default value as <code>String</code> dependent of its element name
+	 *         return <code>null</code> if the default value does not exist
+	 */
+	@Override
+	public String getDefault() {
+		return null;
+	}
+
+	/**
+	 * Default value indicator. As the attribute default value is dependent from its element, the attribute has only a default, when a parent element exists.
+	 *
+	 * @return <code>true</code> if {@odf.attribute manifest:version} has an element parent
+	 *         otherwise return <code>false</code> as undefined.
+	 */
+	@Override
+	public boolean hasDefault() {
+		return false;
+	}
+
+	/**
+	 * @return Returns whether this attribute is known to be of type ID (i.e. xml:id ?)
+	 */
+	@Override
+	public boolean isId() {
+		return false;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMAttributes.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMAttributes.java
new file mode 100644
index 0000000..70c2d70
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMAttributes.java
@@ -0,0 +1,92 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import org.w3c.dom.NamedNodeMap;
+import org.xml.sax.Attributes;
+
+/**
+ * Simple wrapper class for NamedNodeMap as Attributes
+ */
+public class DOMAttributes implements Attributes{
+	
+	private NamedNodeMap attributes;
+
+	/**
+	 * Class constructor
+	 * 
+	 * @param attributes
+	 */
+	public DOMAttributes(NamedNodeMap attributes) {
+		this.attributes = attributes;
+	}
+	
+
+	public int getLength() {
+		return attributes.getLength();
+	}
+
+	public String getURI(int index) {
+		return attributes.item(index).getNamespaceURI();
+	}
+
+	public String getLocalName(int index) {
+		return attributes.item(index).getLocalName();
+	}
+
+	public String getQName(int index) {
+		return attributes.item(index).getNodeName();
+	}
+
+	public String getType(int index) {
+		throw new RuntimeException("DOMAttributes.getType() is not supported");
+	}
+
+	public String getValue(int index) {
+		return attributes.item(index).getNodeValue();
+	}
+
+	public int getIndex(String uri, String localName) {
+		throw new RuntimeException("DOMAttributes.getIndex(String uri, String localName) is not supported");
+	}
+
+	public int getIndex(String qName) {
+		throw new RuntimeException("DOMAttributes.getIndex(String qName) is not supported");
+	}
+
+	public String getType(String uri, String localName) {
+		throw new RuntimeException("DOMAttributes.getType(String uri, String localName) is not supported");
+	}
+
+	public String getType(String qName) {
+		throw new RuntimeException("DOMAttributes.getType(String qName) is not supported");
+	}
+
+	public String getValue(String uri, String localName) {
+		throw new RuntimeException("DOMAttributes.getValue(String uri, String localName) is not supported");
+	}
+
+	public String getValue(String qName) {
+		throw new RuntimeException("DOMAttributes.getValue(String qName) is not supported");
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMRDFaParser.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMRDFaParser.java
new file mode 100644
index 0000000..889a3d5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/DOMRDFaParser.java
@@ -0,0 +1,92 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import javax.xml.stream.XMLEventFactory;
+import javax.xml.stream.XMLOutputFactory;
+
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkStartElement;
+import org.w3c.dom.Node;
+
+/**
+ * A RDFa parser for DOM
+ * 
+ */
+public class DOMRDFaParser extends RDFaParser {
+
+	public static DOMRDFaParser createInstance(JenaSink sink) {
+		sink.getExtractor().setForSAX(false);
+		return new DOMRDFaParser(sink, XMLOutputFactory.newInstance(),
+				XMLEventFactory.newInstance(), sink.getExtractor());
+	}
+
+	public DOMRDFaParser(JenaSink sink, XMLOutputFactory outputFactory,
+			XMLEventFactory eventFactory, URIExtractor extractor) {
+		super(sink, outputFactory, eventFactory, extractor);
+
+	}
+
+	/**
+	 * Parse the RDFa in-content metadata of the node.
+	 * 
+	 * @param node
+	 */
+	public void parse(Node node) {
+		process(node);
+	}
+
+	private void process(Node node) {
+
+		switch (node.getNodeType()) {
+		case Node.ELEMENT_NODE:
+			if (!(node instanceof TextBookmarkStartElement)) {
+				sink.setContextNode(node);
+			}
+			// Start element
+			beginRDFaElement(node.getNamespaceURI(), node.getLocalName(),
+					node.getNodeName(), new DOMAttributes(node.getAttributes()));
+			// Recurse to child
+//			if (node.hasChildNodes() == true) {
+//				process(node.getFirstChild());
+//			}
+			if (node.hasChildNodes() == true) {
+				Node n = node.getFirstChild();
+				process(n);
+				while (n.getNextSibling()!=null){
+					process(n.getNextSibling());
+					n= n.getNextSibling();
+				}
+			}
+
+			// End element
+			endRDFaElement(node.getNamespaceURI(), node.getLocalName(),
+					node.getNodeName());
+			break;
+		case Node.CDATA_SECTION_NODE:
+		case Node.TEXT_NODE:
+			// Text or CDATA
+			writeCharacters(node.getNodeValue());
+			break;
+		}
+
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/EvalContext.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/EvalContext.java
new file mode 100644
index 0000000..f8b13f8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/EvalContext.java
@@ -0,0 +1,198 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import javax.xml.namespace.NamespaceContext;
+
+/**
+ * EvalContext modified from net.rootdev.javardfa.EvalContext
+ */
+final class EvalContext implements NamespaceContext {
+
+    EvalContext parent;
+    String base;
+    String parentSubject;
+    String parentObject;
+    String language;
+    String vocab;
+    List<String> forwardProperties;
+    List<String> backwardProperties;
+    Map<String, String> xmlnsMap = Collections.EMPTY_MAP;
+    Map<String, String> prefixMap = Collections.EMPTY_MAP;
+
+    protected EvalContext(String base) {
+        super();
+        this.base = base;
+        this.parentSubject = base;
+        this.forwardProperties = new LinkedList<String>();
+        this.backwardProperties = new LinkedList<String>();
+    }
+
+    public EvalContext(EvalContext toCopy) {
+        super();
+        this.base = toCopy.base;
+        this.parentSubject = toCopy.parentSubject;
+        this.parentObject = toCopy.parentObject;
+        this.language = toCopy.language;
+        this.forwardProperties = new LinkedList<String>(toCopy.forwardProperties);
+        this.backwardProperties = new LinkedList<String>(toCopy.backwardProperties);
+        this.parent = toCopy;
+        this.vocab = toCopy.vocab;
+    }
+
+    public void setBase(String abase) {
+        // This is very dodgy. We want to check if ps and po have been changed
+        // from their typical values (base).
+        // Base changing happens very late in the day when we're streaming, and
+        // it is very fiddly to handle
+        boolean setPS = parentSubject == base;
+        boolean setPO = parentObject == base;
+
+        if (abase.contains("#")) {
+            this.base = abase.substring(0, abase.indexOf("#"));
+        } else {
+            this.base = abase;
+        }
+
+        if (setPS) this.parentSubject = base;
+        if (setPO) this.parentObject = base;
+        
+        if (parent != null) {
+            parent.setBase(base);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return
+            String.format("[\n\tBase: %s\n\tPS: %s\n\tPO: %s\n\tlang: %s\n\tIncomplete: -> %s <- %s\n]",
+                base, parentSubject, parentObject, language,
+                forwardProperties.size(), backwardProperties.size()
+                );
+    }
+
+    /**
+     * RDFa 1.1 prefix support
+     * @param prefix Prefix
+     * @param uri URI
+     */
+    public void setPrefix(String prefix, String uri) {
+        if (uri.length() == 0) {
+            uri = base;
+        }
+        if (prefixMap == Collections.EMPTY_MAP) prefixMap = new HashMap<String, String>();
+        prefixMap.put(prefix, uri);
+    }
+
+    /**
+     * RDFa 1.1 prefix support.
+     * @param prefix
+     * @return
+     */
+    public String getURIForPrefix(String prefix) {
+        if (prefixMap.containsKey(prefix)) {
+            return prefixMap.get(prefix);
+        } else if (xmlnsMap.containsKey(prefix)) {
+            return xmlnsMap.get(prefix);
+        } else if (parent != null) {
+            return parent.getURIForPrefix(prefix);
+        } else {
+            return null;
+        }
+    }
+
+    // Namespace methods
+    public void setNamespaceURI(String prefix, String uri) {
+        if (uri.length() == 0) {
+            uri = base;
+        }
+        if (xmlnsMap == Collections.EMPTY_MAP) xmlnsMap = new HashMap<String, String>();
+        xmlnsMap.put(prefix, uri);
+    }
+
+    public String getNamespaceURI(String prefix) {
+        if (xmlnsMap.containsKey(prefix)) {
+            return xmlnsMap.get(prefix);
+        } else if (parent != null) {
+            return parent.getNamespaceURI(prefix);
+        } else {
+            return null;
+        }
+    }
+
+    public String getPrefix(String uri) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    public Iterator getPrefixes(String uri) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+    // I'm not sure about this 1.1 term business. Reuse prefix map
+    public void setTerm(String term, String uri) {
+       setPrefix(term + ":", uri);
+    }
+
+    public String getURIForTerm(String term) {
+        return getURIForPrefix(term + ":");
+    }
+
+    public String getBase() {
+        return base;
+    }
+
+    public String getVocab() {
+        return vocab;
+    }
+}
+
+/*
+ * (c) Copyright 2009 University of Bristol All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. 2. Redistributions in
+ * binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. 3. The name of the author may not
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/JenaSink.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/JenaSink.java
new file mode 100644
index 0000000..6092cee
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/JenaSink.java
@@ -0,0 +1,165 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.rootdev.javardfa.StatementSink;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfFileSaxHandler;
+import org.w3c.dom.Node;
+
+import com.hp.hpl.jena.rdf.model.Literal;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.rdf.model.Property;
+import com.hp.hpl.jena.rdf.model.Resource;
+import com.hp.hpl.jena.shared.PrefixMapping.IllegalPrefixException;
+
+/**
+ * To cache the Jena RDF triples parsed from RDFaParser
+ *
+ */
+public class JenaSink implements StatementSink {
+
+//	private OdfFileSaxHandler odf;
+	private Node contextNode;
+	private OdfFileDom mFileDom;
+    private Map<String, Resource> bnodeLookup;
+    private URIExtractor extractor;
+    private EvalContext context;
+
+    public JenaSink(OdfFileDom mFileDom) {
+		this.mFileDom = mFileDom;
+		this.bnodeLookup = new HashMap<String, Resource>();
+    }
+
+    //@Override
+    public void start() {
+        bnodeLookup = new HashMap<String, Resource>();
+    }
+
+    //@Override
+    public void end() {
+        bnodeLookup = null;
+    }
+
+    //@Override
+    public void addObject(String subject, String predicate, String object) {
+    	Model model =getContextModel();
+        Resource s = getResource(model, subject.trim());
+        Property p = model.createProperty(predicate.trim());
+        Resource o = getResource(model, object.trim());
+        model.add(s, p, o);
+    }
+
+    //@Override
+    public void addLiteral(String subject, String predicate, String lex, String lang, String datatype) {
+    	if (lex.isEmpty()){
+    		return;
+    	}
+    	Model model =getContextModel();
+    	Resource s = getResource(model, subject.trim());
+        Property p = model.createProperty(predicate.trim());
+        Literal o;
+        if (lang == null && datatype == null) {
+            o = model.createLiteral(lex.trim());
+        } else if (lang != null) {
+            o = model.createLiteral(lex.trim(), lang.trim());
+        } else {
+            o = model.createTypedLiteral(lex.trim(), datatype.trim());
+        }
+        model.add(s, p, o);
+    }
+
+    private Resource getResource(Model model, String res) {
+        if (res.startsWith("_:")) {
+            if (bnodeLookup.containsKey(res)) {
+                return bnodeLookup.get(res);
+            }
+            Resource bnode = model.createResource();
+            bnodeLookup.put(res, bnode);
+            return bnode;
+        } else {
+            return model.createResource(res);
+        }
+    }
+
+    public void addPrefix(String prefix, String uri) {
+//    	Model model =getContextModel();
+//        try {
+//            model.setNsPrefix(prefix.trim(), uri.trim());
+//        } catch (IllegalPrefixException e) {
+//        }
+    }
+
+    public void setBase(String base) {}
+    
+	private Model getContextModel() {
+		Map<Node, Model> cache = this.mFileDom.getInContentMetadataCache();
+		Model model = cache.get(contextNode);
+		if (model == null) {
+			model = ModelFactory.createDefaultModel();
+			this.mFileDom.getInContentMetadataCache().put(
+					contextNode, model);
+		}
+		return model;
+	}
+
+	public Node getContextNode() {
+		return contextNode;
+	}
+
+	public void setContextNode(Node contextNode) {
+		this.contextNode = contextNode;
+	}
+
+	public URIExtractor getExtractor() {
+		return extractor;
+	}
+
+	public void setExtractor(URIExtractor extractor) {
+		this.extractor = extractor;
+	}
+
+	public EvalContext getContext() {
+		return context;
+	}
+
+	public void setContext(EvalContext context) {
+		this.context = context;
+	}
+		
+	
+//    // Namespace methods
+//    public void setNamespaceURI(String prefix, String uri) {
+//        if (uri.length() == 0) {
+//            uri = base;
+//        }
+//        if (xmlnsMap == Collections.EMPTY_MAP) xmlnsMap = new HashMap<String, String>();
+//        xmlnsMap.put(prefix, uri);
+//    }
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/MultiContentHandler.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/MultiContentHandler.java
new file mode 100644
index 0000000..186f0de
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/MultiContentHandler.java
@@ -0,0 +1,124 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.ArrayList;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+/**
+ * A proxy for delegating the parsing events to its sub ContentHandler(s).
+ */
+public class MultiContentHandler implements ContentHandler {
+	ArrayList<ContentHandler> subContentHandlers;
+
+	public MultiContentHandler(ContentHandler... subs ) {
+		subContentHandlers = new ArrayList<ContentHandler>();
+		for(ContentHandler sub : subs){
+			subContentHandlers.add(sub);
+		}
+	}
+
+	public void setDocumentLocator(Locator locator) {
+		for(ContentHandler sub: subContentHandlers){
+			sub.setDocumentLocator(locator);
+		}
+
+	}
+
+	public void startDocument() throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.startDocument();
+		}
+
+	}
+
+	public void endDocument() throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.endDocument();
+		}
+
+	}
+
+	public void startPrefixMapping(String prefix, String uri)
+			throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.startPrefixMapping(prefix, uri);
+		}
+
+	}
+
+	public void endPrefixMapping(String prefix) throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.endPrefixMapping(prefix);
+		}
+
+	}
+
+	public void startElement(String uri, String localName, String qName,
+			Attributes atts) throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.startElement(uri, localName, qName, atts);
+		}
+	}
+
+	public void endElement(String uri, String localName, String qName)
+			throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.endElement(uri, localName, qName);
+		}
+
+	}
+
+	public void characters(char[] ch, int start, int length)
+			throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.characters(ch, start, length);
+		}
+
+	}
+
+	public void ignorableWhitespace(char[] ch, int start, int length)
+			throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.ignorableWhitespace(ch, start, length);
+		}
+
+	}
+
+	public void processingInstruction(String target, String data)
+			throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.processingInstruction(target, data);
+		}
+	}
+
+	public void skippedEntity(String name) throws SAXException {
+		for(ContentHandler sub: subContentHandlers){
+			sub.skippedEntity(name);
+		}
+	}
+
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/RDFaParser.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/RDFaParser.java
new file mode 100644
index 0000000..d280a1a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/RDFaParser.java
@@ -0,0 +1,443 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
+
+import net.rootdev.javardfa.Constants;
+import net.rootdev.javardfa.Setting;
+import net.rootdev.javardfa.literal.LiteralCollector;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+
+/**
+ * A RDFa Parser modified from net.rootdev.javardfa.Parser
+ *
+ */
+class RDFaParser extends net.rootdev.javardfa.Parser {
+	
+	boolean ignore = false;
+
+	protected XMLEventFactory eventFactory;
+	protected JenaSink sink;
+	protected Set<Setting> settings;
+	protected LiteralCollector literalCollector;
+	protected URIExtractor extractor;
+	protected Locator locator;
+	protected EvalContext context;
+
+	protected RDFaParser(JenaSink sink, XMLOutputFactory outputFactory,
+			XMLEventFactory eventFactory, URIExtractor extractor) {
+		super(sink);
+		this.sink = sink;
+		this.eventFactory = eventFactory;
+		this.settings = EnumSet.noneOf(Setting.class);
+		this.extractor = extractor;
+
+		this.literalCollector = new LiteralCollector(this, eventFactory,
+				outputFactory);
+
+		extractor.setSettings(settings);
+
+		// Important, although I guess the caller doesn't get total control
+		outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES,
+				true);
+	}
+
+	protected void beginRDFaElement(String arg0, String localname,
+			String qname, Attributes arg3) {
+		if (localname.equals("bookmark-start")) {
+			ignore = true;
+			return;
+		}
+		try {
+			// System.err.println("Start element: " + arg0 + " " + arg1 + " " +
+			// arg2);
+
+			// This is set very late in some html5 cases (not even ready by
+			// document start)
+			if (context == null) {
+				this.setBase(locator.getSystemId());
+			}
+
+			// Dammit, not quite the same as XMLEventFactory
+			String prefix = /* (localname.equals(qname)) */
+			(qname.indexOf(':') == -1) ? "" : qname.substring(0,
+					qname.indexOf(':'));
+			if (settings.contains(Setting.ManualNamespaces)) {
+				getNamespaces(arg3);
+				if (prefix.length() != 0) {
+					arg0 = context.getNamespaceURI(prefix);
+					localname = localname.substring(prefix.length() + 1);
+				}
+			}
+			StartElement e = eventFactory.createStartElement(prefix, arg0,
+					localname, fromAttributes(arg3), null, context);
+
+			if (literalCollector.isCollecting())
+				literalCollector.handleEvent(e);
+
+			// If we are gathering XML we stop parsing
+			if (!literalCollector.isCollectingXML())
+				context = parse(context, e);
+		} catch (XMLStreamException ex) {
+			throw new RuntimeException("Streaming issue", ex);
+		}
+	}
+	
+	protected void endRDFaElement(String arg0, String localname, String qname) {
+		if (localname.equals("bookmark-start")) {
+			ignore = false;
+			return;
+		}
+		if (literalCollector.isCollecting()) {
+			String prefix = (localname.equals(qname)) ? "" : qname.substring(0,
+					qname.indexOf(':'));
+			XMLEvent e = eventFactory.createEndElement(prefix, arg0, localname);
+			literalCollector.handleEvent(e);
+		}
+		// If we aren't collecting an XML literal keep parsing
+		if (!literalCollector.isCollectingXML())
+			context = context.parent;
+	}
+	
+	protected void writeCharacters(String value) {
+		if (!ignore) {
+			if (literalCollector.isCollecting()) {
+				XMLEvent e = eventFactory.createCharacters(value);
+				literalCollector.handleEvent(e);
+			}
+		}
+	}
+	
+	/** 
+	 * Set the base uri of the DOM.
+	 */
+	public void setBase(String base) {	
+		this.context = new EvalContext(base);
+		sink.setBase(context.getBase());
+	}
+
+	protected EvalContext parse(EvalContext context, StartElement element)
+			throws XMLStreamException {
+		boolean skipElement = false;
+		String newSubject = null;
+		String currentObject = null;
+		List<String> forwardProperties = new LinkedList();
+		List<String> backwardProperties = new LinkedList();
+		String currentLanguage = context.language;
+
+		if (settings.contains(Setting.OnePointOne)) {
+
+			if (getAttributeByName(element, Constants.vocab) != null) {
+				context.vocab = getAttributeByName(element, Constants.vocab)
+						.getValue().trim();
+			}
+
+			if (getAttributeByName(element, Constants.prefix) != null) {
+				parsePrefixes(getAttributeByName(element, Constants.prefix)
+						.getValue(), context);
+			}
+		}
+
+		// The xml / html namespace matching is a bit ropey. I wonder if the
+		// html 5
+		// parser has a setting for this?
+		if (settings.contains(Setting.ManualNamespaces)) {
+			if (getAttributeByName(element, Constants.xmllang) != null) {
+				currentLanguage = getAttributeByName(element, Constants.xmllang)
+						.getValue();
+				if (currentLanguage.length() == 0)
+					currentLanguage = null;
+			} else if (getAttributeByName(element, Constants.lang) != null) {
+				currentLanguage = getAttributeByName(element, Constants.lang)
+						.getValue();
+				if (currentLanguage.length() == 0)
+					currentLanguage = null;
+			}
+		} else if (getAttributeByName(element, Constants.xmllangNS) != null) {
+			currentLanguage = getAttributeByName(element, Constants.xmllangNS)
+					.getValue();
+			if (currentLanguage.length() == 0)
+				currentLanguage = null;
+		}
+
+		if (Constants.base.equals(element.getName())
+				&& getAttributeByName(element, Constants.href) != null) {
+			context.setBase(getAttributeByName(element, Constants.href)
+					.getValue());
+			sink.setBase(context.getBase());
+		}
+		if (getAttributeByName(element, Constants.rev) == null
+				&& getAttributeByName(element, Constants.rel) == null) {
+			Attribute nSubj = findAttribute(element, Constants.about);	
+			if (nSubj != null) {
+				newSubject = extractor.getURI(element, nSubj, context);
+			}
+			if (newSubject == null) {
+				if (Constants.body.equals(element.getName())
+						|| Constants.head.equals(element.getName())) {
+					newSubject = context.base;
+				} else if (getAttributeByName(element, Constants.typeof) != null) {
+					newSubject = createBNode();
+				} else {
+					if (context.parentObject != null) {
+						newSubject = context.parentObject;
+					}
+					if (getAttributeByName(element, Constants.property) == null) {
+						skipElement = true;
+					}
+				}
+			}
+		} else {
+			Attribute nSubj = findAttribute(element, Constants.about,
+					Constants.src);
+			if (nSubj != null) {
+				newSubject = extractor.getURI(element, nSubj, context);
+			}
+			if (newSubject == null) {
+				// if element is head or body assume about=""
+				if (Constants.head.equals(element.getName())
+						|| Constants.body.equals(element.getName())) {
+					newSubject = context.base;
+				} else if (getAttributeByName(element, Constants.typeof) != null) {
+					newSubject = createBNode();
+				} else if (context.parentObject != null) {
+					newSubject = context.parentObject;
+				}
+			}
+			Attribute cObj = findAttribute(element, Constants.resource,
+					Constants.href);
+			if (cObj != null) {
+				currentObject = extractor.getURI(element, cObj, context);
+			}
+		}
+
+		if (newSubject != null
+				&& getAttributeByName(element, Constants.typeof) != null) {
+			List<String> types = extractor.getURIs(element,
+					getAttributeByName(element, Constants.typeof), context);
+			for (String type : types) {
+				emitTriples(newSubject, Constants.rdfType, type);
+			}
+		}
+
+
+		if (currentObject != null) {
+			if (getAttributeByName(element, Constants.rel) != null) {
+				emitTriples(newSubject, extractor.getURIs(element,
+						getAttributeByName(element, Constants.rel), context),
+						currentObject);
+			}
+			if (getAttributeByName(element, Constants.rev) != null) {
+				emitTriples(currentObject, extractor.getURIs(element,
+						getAttributeByName(element, Constants.rev), context),
+						newSubject);
+			}
+		} else {
+			if (getAttributeByName(element, Constants.rel) != null) {
+				forwardProperties.addAll(extractor.getURIs(element,
+						getAttributeByName(element, Constants.rel), context));
+			}
+			if (getAttributeByName(element, Constants.rev) != null) {
+				backwardProperties.addAll(extractor.getURIs(element,
+						getAttributeByName(element, Constants.rev), context));
+			}
+			if (!forwardProperties.isEmpty() || !backwardProperties.isEmpty()) {
+				// if predicate present
+				currentObject = createBNode();
+			}
+		}
+
+		// Getting literal values. Complicated!
+		if (getAttributeByName(element, Constants.property) != null) {
+			List<String> props = extractor.getURIs(element,
+					getAttributeByName(element, Constants.property), context);
+			String dt = getDatatype(element);
+			if (getAttributeByName(element, Constants.content) != null) { // The
+																			// easy
+																			// bit
+				String lex = getAttributeByName(element, Constants.content)
+						.getValue();
+				if (dt == null || dt.length() == 0) {
+					emitTriplesPlainLiteral(newSubject, props, lex,
+							currentLanguage);
+				} else {
+					emitTriplesDatatypeLiteral(newSubject, props, lex, dt);
+				}
+			} else {
+				literalCollector
+						.collect(newSubject, props, dt, currentLanguage);
+			}
+		}
+
+		if (!skipElement && newSubject != null) {
+			emitTriples(context.parentSubject, context.forwardProperties,
+					newSubject);
+
+			emitTriples(newSubject, context.backwardProperties,
+					context.parentSubject);
+		}
+
+		EvalContext ec = new EvalContext(context);
+		if (skipElement) {
+			ec.language = currentLanguage;
+		} else {
+			if (newSubject != null) {
+				ec.parentSubject = newSubject;
+			} else {
+				ec.parentSubject = context.parentSubject;
+			}
+
+			if (currentObject != null) {
+				ec.parentObject = currentObject;
+			} else if (newSubject != null) {
+				ec.parentObject = newSubject;
+			} else {
+				ec.parentObject = context.parentSubject;
+			}
+
+			ec.language = currentLanguage;
+			ec.forwardProperties = forwardProperties;
+			ec.backwardProperties = backwardProperties;
+		}
+		return ec;
+	}
+
+	private void getNamespaces(Attributes attrs) {
+		for (int i = 0; i < attrs.getLength(); i++) {
+			String qname = attrs.getQName(i);
+			String prefix = getPrefix(qname);
+			if ("xmlns".equals(prefix)) {
+				String pre = getLocal(prefix, qname);
+				String uri = attrs.getValue(i);
+				if (!settings.contains(Setting.ManualNamespaces)
+						&& pre.contains("_"))
+					continue; // not permitted
+				context.setNamespaceURI(pre, uri);
+				extractor.setNamespaceURI(pre, uri);
+				sink.addPrefix(pre, uri);
+			}
+		}
+	}
+
+	private String getPrefix(String qname) {
+		if (!qname.contains(":")) {
+			return "";
+		}
+		return qname.substring(0, qname.indexOf(":"));
+	}
+
+	private String getLocal(String prefix, String qname) {
+		if (prefix.length() == 0) {
+			return qname;
+		}
+		return qname.substring(prefix.length() + 1);
+	}
+
+	private Iterator fromAttributes(Attributes attributes) {
+		List toReturn = new LinkedList();
+
+		for (int i = 0; i < attributes.getLength(); i++) {
+			String qname = attributes.getQName(i);
+			String prefix = qname.contains(":") ? qname.substring(0,
+					qname.indexOf(":")) : "";
+			Attribute attr = eventFactory.createAttribute(prefix,
+					attributes.getURI(i), attributes.getLocalName(i),
+					attributes.getValue(i));
+
+			if (!qname.equals("xmlns") && !qname.startsWith("xmlns:"))
+				toReturn.add(attr);
+		}
+
+		return toReturn.iterator();
+	}
+
+	private Attribute findAttribute(StartElement element, QName... names) {
+		for (QName aName : names) {
+			Attribute a = getAttributeByName(element, aName);
+			if (a != null) {
+				return a;
+			}
+		}
+		return null;
+	}
+
+	private void parsePrefixes(String value, EvalContext context) {
+		String[] parts = value.split("\\s+");
+		for (int i = 0; i < parts.length; i += 2) {
+			String prefix = parts[i];
+			if (i + 1 < parts.length && prefix.endsWith(":")) {
+				String prefixFix = prefix.substring(0, prefix.length() - 1);
+				context.setPrefix(prefixFix, parts[i + 1]);
+				sink.addPrefix(prefixFix, parts[i + 1]);
+			}
+		}
+	}
+
+	private Attribute getAttributeByName(StartElement element, QName name) {
+		if (name == null || element == null) {
+			return null;
+		}
+		Iterator it = element.getAttributes();
+		while (it.hasNext()) {
+			Attribute at = (Attribute) it.next();
+			if (Util.qNameEquals(at.getName(), name)) {
+				return at;
+			}
+		}
+		return null;
+	}
+
+	int bnodeId = 0;
+
+	private String createBNode() // TODO probably broken? Can you write bnodes
+									// in rdfa directly?
+	{
+		return "_:node" + (bnodeId++);
+	}
+
+	private String getDatatype(StartElement element) {
+		Attribute de = getAttributeByName(element, Constants.datatype);
+		if (de == null) {
+			return null;
+		}
+		String dt = de.getValue();
+		if (dt.length() == 0) {
+			return dt;
+		}
+		return extractor.expandCURIE(element, dt, context);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/SAXRDFaParser.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/SAXRDFaParser.java
new file mode 100644
index 0000000..afecfd0
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/SAXRDFaParser.java
@@ -0,0 +1,169 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
+
+import net.rootdev.javardfa.Constants;
+import net.rootdev.javardfa.Setting;
+import net.rootdev.javardfa.StatementSink;
+import net.rootdev.javardfa.literal.LiteralCollector;
+import net.rootdev.javardfa.uri.IRIResolver;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+/**
+ * A RDFa parser for SAX
+ */
+public class SAXRDFaParser extends RDFaParser {
+	
+
+	public static SAXRDFaParser createInstance(JenaSink sink) {
+		URIExtractor extractor = new URIExtractorImpl(new IRIResolver(), true);
+		sink.setExtractor(extractor);
+		return new SAXRDFaParser(sink, XMLOutputFactory.newInstance(),
+				XMLEventFactory.newInstance(), extractor);
+	}
+
+	private SAXRDFaParser(JenaSink sink, XMLOutputFactory outputFactory,
+			XMLEventFactory eventFactory, URIExtractor extractor) {
+		super(sink, outputFactory, eventFactory, extractor);
+	}
+
+	public void emitTriples(String subj, Collection<String> props, String obj) {
+		for (String prop : props) {
+			sink.addObject(subj, prop, obj);
+		}
+	}
+
+	public void emitTriplesPlainLiteral(String subj, Collection<String> props,
+			String lex, String language) {
+		for (String prop : props) {
+			sink.addLiteral(subj, prop, lex, language, null);
+		}
+	}
+
+	public void emitTriplesDatatypeLiteral(String subj,
+			Collection<String> props, String lex, String datatype) {
+		for (String prop : props) {
+			sink.addLiteral(subj, prop, lex, null, datatype);
+		}
+	}
+
+	public void setDocumentLocator(Locator arg0) {
+		this.locator = arg0;
+		if (locator.getSystemId() != null)
+			this.setBase(arg0.getSystemId());
+	}
+
+	public void startDocument() throws SAXException {
+		sink.start();
+	}
+
+	public void endDocument() throws SAXException {
+		sink.end();
+		sink.setContext(context);
+	}
+
+	public void startPrefixMapping(String arg0, String arg1)
+			throws SAXException {
+		context.setNamespaceURI(arg0, arg1);
+		extractor.setNamespaceURI(arg0, arg1);
+		sink.addPrefix(arg0, arg1);
+	}
+
+	public void endPrefixMapping(String arg0) throws SAXException {
+	}
+
+	public void startElement(String arg0, String localname, String qname,
+			Attributes arg3) throws SAXException {
+		super.beginRDFaElement(arg0, localname, qname, arg3);
+	}
+
+	public void endElement(String arg0, String localname, String qname)
+			throws SAXException {
+		super.endRDFaElement(arg0, localname, qname);
+	}
+
+	public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
+		super.writeCharacters(String.valueOf(arg0, arg1, arg2));
+	}
+
+	public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
+			throws SAXException {
+		// System.err.println("Whitespace...");
+		if (literalCollector.isCollecting()) {
+			XMLEvent e = eventFactory.createIgnorableSpace(String.valueOf(arg0,
+					arg1, arg2));
+			literalCollector.handleEvent(e);
+		}
+	}
+
+	public void processingInstruction(String arg0, String arg1)
+			throws SAXException {
+	}
+
+	public void skippedEntity(String arg0) throws SAXException {
+	}
+
+}
+
+/*
+ * (c) Copyright 2009 University of Bristol All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. 2. Redistributions in
+ * binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. 3. The name of the author may not
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/URIExtractor.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/URIExtractor.java
new file mode 100644
index 0000000..8271488
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/URIExtractor.java
@@ -0,0 +1,77 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.StartElement;
+
+import net.rootdev.javardfa.Setting;
+/**
+ * URIExtractor modified from net.rootdev.javardfa.uri.URIExtractor
+ */
+public interface URIExtractor {
+
+    void setSettings(Set<Setting> settings);
+
+    String expandCURIE(StartElement element, String value, EvalContext context);
+
+    String expandSafeCURIE(StartElement element, String value, EvalContext context);
+
+    String getURI(StartElement element, Attribute attr, EvalContext context);
+
+    List<String> getURIs(StartElement element, Attribute attr, EvalContext context);
+
+    String resolveURI(String uri, EvalContext context);
+    
+    void setForSAX(boolean isForSAX);
+    
+    void setNamespaceURI(String prefix, String namespaceURI);
+}
+
+/*
+ * (c) Copyright 2009 University of Bristol All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. 2. Redistributions in
+ * binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. 3. The name of the author may not
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/URIExtractorImpl.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/URIExtractorImpl.java
new file mode 100644
index 0000000..8d1e2c5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/URIExtractorImpl.java
@@ -0,0 +1,217 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.StartElement;
+
+import net.rootdev.javardfa.Constants;
+import net.rootdev.javardfa.Resolver;
+import net.rootdev.javardfa.Setting;
+
+import org.apache.commons.validator.routines.UrlValidator;
+
+/**
+ * URIExtractorImpl modified from net.rootdev.javardfa.uri.URIExtractor10
+ */
+class URIExtractorImpl implements URIExtractor {
+	private Set<Setting> settings;
+	private final Resolver resolver;
+	private Map<String, String> xmlnsMap = Collections.EMPTY_MAP;
+	private boolean isForSAX;
+	private UrlValidator urlValidator;
+
+	public URIExtractorImpl(Resolver resolver, boolean isForSAX) {
+		this.resolver = resolver;
+		this.isForSAX = isForSAX;
+		this.urlValidator = new UrlValidator();
+	}
+
+	public void setForSAX(boolean isForSAX) {
+		this.isForSAX = isForSAX;
+	}
+
+	public void setSettings(Set<Setting> settings) {
+		this.settings = settings;
+	}
+
+	public String getURI(StartElement element, Attribute attr,
+			EvalContext context) {
+		QName attrName = attr.getName();
+		if (Util.qNameEquals(attrName, Constants.about)) // Safe CURIE or URI
+		{
+			return expandSafeCURIE(element, attr.getValue(), context);
+		}
+		if (Util.qNameEquals(attrName, Constants.datatype)) // A CURIE
+		{
+			return expandCURIE(element, attr.getValue(), context);
+		}
+		throw new RuntimeException("Unexpected attribute: " + attr);
+	}
+
+	private boolean isValidURI(String uri){
+		return this.urlValidator.isValid(uri);
+	}
+	
+	public List<String> getURIs(StartElement element, Attribute attr,
+			EvalContext context) {
+			
+		List<String> uris = new LinkedList<String>();	
+		
+		String[] curies = attr.getValue().split("\\s+");
+		boolean permitReserved = Util
+				.qNameEquals(Constants.rel, attr.getName())
+				|| Util.qNameEquals(Constants.rev, attr.getName());
+		for (String curie : curies) {
+			if (Constants.SpecialRels.contains(curie.toLowerCase())) {
+				if (permitReserved)
+					uris.add("http://www.w3.org/1999/xhtml/vocab#"
+							+ curie.toLowerCase());
+			} else {
+				String uri = expandCURIE(element, curie, context);
+				if (uri != null) {
+					uris.add(uri);
+				}
+			}
+		}
+		return uris;
+	}
+
+	public String expandCURIE(StartElement element, String value,
+			EvalContext context) {
+		
+		if (value.startsWith("_:")) {
+			if (!settings.contains(Setting.ManualNamespaces))
+				return value;
+			if (element.getNamespaceURI("_") == null)
+				return value;
+		}
+		if (settings.contains(Setting.FormMode) && // variable
+				value.startsWith("?")) {
+			return value;
+		}
+		int offset = value.indexOf(":") + 1;
+		if (offset == 0) {
+			return null;
+		}
+		String prefix = value.substring(0, offset - 1);
+		
+
+		// Apparently these are not allowed to expand
+		if ("xml".equals(prefix) || "xmlns".equals(prefix))
+			return null;
+
+		String namespaceURI = null;
+		if (prefix.length() == 0) {
+			namespaceURI = "http://www.w3.org/1999/xhtml/vocab#";
+		} else {
+			namespaceURI = element.getNamespaceURI(prefix);
+			if (isForSAX) {
+				if (namespaceURI != null) {
+					if (xmlnsMap == Collections.EMPTY_MAP)
+						xmlnsMap = new HashMap<String, String>();
+					xmlnsMap.put(prefix, namespaceURI);
+				}
+			} else {
+				if (namespaceURI == null) {
+					namespaceURI = xmlnsMap.get(prefix);
+				}
+			}
+		}
+		if (namespaceURI == null) {
+			return null;
+			// throw new RuntimeException("Unknown prefix: " + prefix);
+		}
+
+		return namespaceURI + value.substring(offset);
+	}
+
+	public String expandSafeCURIE(StartElement element, String value,
+			EvalContext context) {
+		if (value.startsWith("[") && value.endsWith("]")) {
+			return expandCURIE(element, value.substring(1, value.length() - 1),
+					context);
+		} else {
+			if (value.length() == 0) {
+				return context.getBase();
+			}
+
+			if (settings.contains(Setting.FormMode) && value.startsWith("?")) {
+				return value;
+			}
+
+			return resolver.resolve(context.getBase(), value);
+		}
+	}
+
+	public String resolveURI(String uri, EvalContext context) {
+		return resolver.resolve(context.getBase(), uri);
+	}
+
+	public String getNamespaceURI(String prefix) {
+		if (xmlnsMap.containsKey(prefix)) {
+			return xmlnsMap.get(prefix);
+		} else {
+			return null;
+		}
+	}
+	
+	public void setNamespaceURI(String prefix, String namespaceURI){
+		if (xmlnsMap == Collections.EMPTY_MAP)
+			xmlnsMap = new HashMap<String, String>();
+		xmlnsMap.put(prefix, namespaceURI);
+	}
+
+}
+
+/*
+ * (c) Copyright 2009 University of Bristol All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. 2. Redistributions in
+ * binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. 3. The name of the author may not
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/Util.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/Util.java
new file mode 100644
index 0000000..4381fbd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/rdfa/Util.java
@@ -0,0 +1,140 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg.rdfa;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+
+public class Util {
+	
+	private static final String SLASH = "/";
+	
+	/**
+	 * Test whether two QNames are equal to each other. This is a bug fix for
+	 * java-rdfa library. "xhtml:about" and "about" should be considered as
+	 * RDFa, while java-rdfa recognizes only the later one.
+	 * 
+	 * @param at
+	 *            , the QName of an Attribute
+	 * @param name
+	 *            , the QName to be compared
+	 * @return
+	 */
+	public static boolean qNameEquals(QName at, QName name) {
+		if (!name.getNamespaceURI().equals(XMLConstants.DEFAULT_NS_PREFIX)) {
+			if (at.equals(name)) {
+				return true;
+			}
+		} else if (at.getLocalPart().equals(name.getLocalPart())) {
+			return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * Get the RDF base uri of the given internalPath. Note that there would be
+	 * a SLASH at the end of the RDF base uri
+	 * 
+	 * @param pkgBaseUri
+	 *            , the base uri of the package
+	 * @param internalPath
+	 *            , the internalPath relative to the root document
+	 * @return
+	 */
+	public static String getRDFBaseUri(String pkgBaseUri, String internalPath) {
+		String subDirectory = internalPath.lastIndexOf(SLASH) == -1 ? "" : SLASH + internalPath.substring(0, internalPath.lastIndexOf(SLASH));
+		String baseUri = pkgBaseUri + subDirectory + SLASH;
+		return baseUri;
+	}
+	
+	/**
+	 * To test whether the subPath is a sut path of superPath
+	 * 
+	 * @param subPath
+	 *            , an internal path in the ODF package
+	 * @param superPath
+	 *            , an internal path in the ODF package
+	 * @return
+	 */
+	public static boolean isSubPathOf(String subPath, String superPath) {
+		if (superPath == null || subPath == null) {
+			return false;
+		}
+		return SLASH.equals(superPath) || (subPath.length() > superPath.length() && subPath.startsWith(superPath));
+	}
+	
+	/**
+	 * To fix the 3 slashes bug for File URI: For example:
+	 * file:/C:/work/test.txt -> file:///C:/work/test.txt
+	 * 
+	 * @param u - the File URI
+	 * @return the String of the URI
+	 */
+	public static String toExternalForm(URI u) throws URISyntaxException {
+		StringBuilder sb = new StringBuilder();
+		if (u.getScheme() != null) {
+			sb.append(u.getScheme());
+			sb.append(':');
+		}
+		if (u.isOpaque()) {
+			sb.append(u.getSchemeSpecificPart());
+		} else {
+			if (u.getHost() != null) {
+				sb.append("//");
+				if (u.getUserInfo() != null) {
+					sb.append(u.getUserInfo());
+					sb.append('@');
+				}
+				boolean needBrackets = ((u.getHost().indexOf(':') >= 0) && !u.getHost().startsWith("[") && !u.getHost().endsWith("]"));
+				if (needBrackets)
+					sb.append('[');
+				sb.append(u.getHost());
+				if (needBrackets)
+					sb.append(']');
+				if (u.getPort() != -1) {
+					sb.append(':');
+					sb.append(u.getPort());
+				}
+			} else if (u.getRawAuthority() != null) {
+				sb.append("//");
+				sb.append(u.getRawAuthority());
+			} else {
+				sb.append("//");
+			}
+			if (u.getRawPath() != null)
+				sb.append(u.getRawPath());
+			if (u.getRawQuery() != null) {
+				sb.append('?');
+				sb.append(u.getRawQuery());
+			}
+		}
+		if (u.getFragment() != null) {
+			sb.append('#');
+			sb.append(u.getFragment());
+		}		
+		String ret = new URI(sb.toString()).toASCIIString();
+		return ret;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/AnyURI.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/AnyURI.java
new file mode 100644
index 0000000..4ae483e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/AnyURI.java
@@ -0,0 +1,160 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype anyURI} 
+ */
+public class AnyURI implements OdfDataType {
+
+	private URI mURI;
+
+	/**
+	 * Construct an newly AnyURI object that represents the specified URI value
+	 *
+	 * @param uri
+	 *            the value to be represented by the AnyURI Object
+	 * @throws IllegalArgumentException if the given argument is not a valid AnyURI
+	 */
+	public AnyURI(URI uri) throws IllegalArgumentException {
+		if (uri == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for AnyURI");
+		}
+
+		// validate 'anyURI' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#anyURI
+		if (!W3CSchemaType.isValid("anyURI", URITransformer.decodePath(uri.toString()))) {
+			Logger.getLogger(AnyURI.class.getName()).log(Level.SEVERE, "parameter is invalid for datatype AnyURI");
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype anyURI");
+		}
+		mURI = uri;
+	}
+
+	/**
+	 * Returns a String Object representing this AnyURI's value
+	 *
+	 * @return return a string representation of the value of this AnyURI object
+	 */
+	@Override
+	public String toString() {
+		return URITransformer.decodePath(mURI.toString());
+	}
+
+	/**
+	 * Returns an AnyURI instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return an AnyURI instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid AnyURI
+	 */
+	public static AnyURI valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if (stringValue == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for AnyURI");
+		}
+		try {
+			URI uri = new URI(URITransformer.encodePath(stringValue).toString());
+			return new AnyURI(uri);
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(AnyURI.class.getName()).log(Level.SEVERE,
+					"parameter is invalid for datatype anyURI", ex);
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype anyURI");
+		}
+	}
+
+	/**
+	 * get java.net.URI from AnyURI
+	 *
+	 * @return java.net.URI returned from this AnyURI
+	 */
+	public URI getURI() {
+		return mURI;
+	}
+
+	/**
+	 * check if the specified URI instance is a valid {@odf.datatype anyURI} data type
+	 *
+	 * @param uri
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype anyURI} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(URI uri) {
+		boolean isValid = false;
+		if (uri != null) {
+			isValid = W3CSchemaType.isValid("anyURI", uri.toString());
+		}
+		return isValid;
+	}
+
+    /**
+     * Encode path to be used as path component segments in URI.
+     *
+     * <p>Creates a String that can be used as a sequence of one or more
+     * path components in an URI from a path that uses a slash
+     * character as a path separator and where the segements do not use
+     * any URI encoding rules.</p>
+     *
+     * <p>The <b>/</b> characters (delimiting the individual path_segments)
+     * are left unchanged.</p>
+     *
+     * @param path A path that is not using URI encoding rules.
+     * @return A path that is using URI encoding rules.
+     *
+     * @see #decodePath(String)
+     */
+    public static String encodePath(String path) {
+        return URITransformer.encodePath(path);
+    }
+
+    /**
+     * Decode path component segments in URI.
+     *
+     * <p>Creates a path that uses a slash character as a path separator
+     * and where the segments do not use any URI encoding
+     * from a String that is used as a sequence of one or more
+     * path components in an URI where the path segments do use
+     * URI encoding rules.</p>
+     *
+     * <p>The <b>/</b> characters (delimiting the individual path_segments)
+     * are left unchanged.</p>
+     *
+     * @param path A path that is using URI encoding rules.
+     * @return A path that is not using URI encoding rules.
+     *
+     * @see #encodePath(String)
+     *
+     */
+    public static String decodePath(String path) {
+        return URITransformer.decodePath(path);
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Base64Binary.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Base64Binary.java
new file mode 100644
index 0000000..a374563
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Base64Binary.java
@@ -0,0 +1,106 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import org.apache.xerces.impl.dv.util.Base64;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype base64Binary}
+ */
+public class Base64Binary implements OdfDataType {
+
+	private byte[] mByteList;
+
+	/**
+	 * Construct an newly Base64Binary object that represents the specified
+	 * byte[] value
+	 *
+	 * @param bytes
+	 *            the value to be represented by the Base64Binary Object
+	 * @throws NumberFormatException If the parameter is not a valid Base64Binary.
+	 *
+	 */
+	public Base64Binary(byte[] bytes) throws NumberFormatException {
+		if (bytes == null) {
+			throw new NumberFormatException("parameter can not be null for Base64Binary");
+		}
+
+		// validate 'base64Binary' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#base64Binary
+		if (!W3CSchemaType.isValid("base64Binary", Base64.encode(bytes))) {
+			throw new NumberFormatException("parameter is invalid for datatype base64Binary");
+		}
+		mByteList = bytes;
+	}
+
+	/**
+	 * Returns a String Object representing this Base64Binary's value
+	 *
+	 * @return return a string representation of the value of this Base64Binary
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return Base64.encode(mByteList);
+	}
+
+	/**
+	 * Returns a Base64Binary instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Base64Binary instance representing stringValue
+	 * @throws NumberFormatException If the parameter is not a valid Base64Binary.
+	 */
+	public static Base64Binary valueOf(String stringValue)
+			throws NumberFormatException {
+		if (stringValue == null) {
+			throw new NumberFormatException(
+					"parameter can not be null for Base64Binary");
+		}
+		return new Base64Binary(Base64.decode(stringValue));
+	}
+
+	/**
+	 * get byte[] from Base64Binary
+	 *
+	 * @return byte[] returned from this Base64Binary instance
+	 */
+	public byte[] getBytes() {
+		return mByteList;
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype base64Binary} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype base64Binary} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		} else {
+			return W3CSchemaType.isValid("base64Binary", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CURIE.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CURIE.java
new file mode 100644
index 0000000..1733798
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CURIE.java
@@ -0,0 +1,85 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype CURIE}
+ */
+public class CURIE implements OdfDataType {
+
+	private String mCURIE;
+	private static final Pattern curiePattern = Pattern.compile("^(([\\i-[:]][\\c-[:]]*)?:)?.+$");
+	
+	/**
+	 * Construct CURIE by the parsing the given string
+	 *
+	 * @param curie
+	 *            The String to be parsed into CURIE
+	 * @throws IllegalArgumentException if the given argument is not a valid CURIE
+	 */
+	public CURIE(String curie) throws IllegalArgumentException {
+		if (!isValid(curie)){
+			throw new IllegalArgumentException("parameter is invalid for datatype CURIE");
+		}
+		mCURIE = curie;
+	}
+
+	/**
+	 * Returns a String Object representing this CURIE's value
+	 *
+	 * @return return a string representation of the value of this CURIE object
+	 */
+	@Override
+	public String toString() {
+		return mCURIE;
+	}
+
+	/**
+	 * Returns a CURIE instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a CURIE instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid CURIE
+	 */
+	public static CURIE valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new CURIE(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype CURIE} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype CURIE} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!curiePattern.matcher(stringValue).matches() || stringValue.length() < 1)) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CURIEs.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CURIEs.java
new file mode 100644
index 0000000..852a93b
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CURIEs.java
@@ -0,0 +1,128 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype CURIEs}
+ */
+public class CURIEs implements OdfDataType {
+
+	private String mCURIEs;
+
+	/**
+	 * Construct CURIEs by the parsing the given string
+	 *
+	 * @param curies
+	 *            The String to be parsed into CURIEs
+	 * @throws IllegalArgumentException if the given argument is not a valid CURIEs
+	 */
+	public CURIEs(List<CURIE> curies) throws IllegalArgumentException {
+		if ((curies == null) || (curies.size() == 0)) {
+			throw new IllegalArgumentException("parameter can not be null for CURIEs");
+		}
+		StringBuffer aRet = new StringBuffer();
+		Iterator<CURIE> aIter = curies.iterator();
+		while (aIter.hasNext()) {
+			if (aRet.length() > 0) {
+				aRet.append(' ');
+			}
+			String aCurie = aIter.next().toString();
+			aRet.append(aCurie);
+		}
+		mCURIEs = aRet.toString();
+	}
+
+	/**
+	 * Returns a space separated String Object representing this CURIEs's value
+	 *
+	 * @return return a string representation of the value of this CURIEs object
+	 */
+	@Override
+	public String toString() {
+		return mCURIEs;
+	}
+
+	/**
+	 * Returns a CURIEs instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a CURIEs instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid CURIEs
+	 */
+	public static CURIEs valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if ((stringValue == null) || (stringValue.length() == 0)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype CURIEs");
+		}
+
+		List<CURIE> aRet = new ArrayList<CURIE>();
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			aRet.add(new CURIE(names[i]));
+		}
+		return new CURIEs(aRet);
+	}
+
+	/**
+	 * Returns a list of CURIE from the CURIEs Object
+	 *
+	 * @return a list of CURIE
+	 */
+	public List<CURIE> getCURIEList() {
+		List<CURIE> aRet = new ArrayList<CURIE>();
+		String[] names = mCURIEs.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			aRet.add(new CURIE(names[i]));
+		}
+		return aRet;
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype CURIEs} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype CURIEs} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+		if (stringValue.length() == 0) {
+			return false;
+		}
+
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			if (!CURIE.isValid(names[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellAddress.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellAddress.java
new file mode 100644
index 0000000..6bc0804
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellAddress.java
@@ -0,0 +1,89 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype cellAddress}
+ */
+public class CellAddress implements OdfDataType {
+
+	private String mCellAddress;
+	private static final Pattern cellAddressPattern = Pattern.compile("^(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[A-Z]+\\$?[0-9]+$");
+	/**
+	 * Construct CellAddress by the parsing the given string
+	 *
+	 * @param cellAddress
+	 *            The String to be parsed into CellAddress
+	 * @throws IllegalArgumentException if the given argument is not a valid CellAddress
+	 */
+	public CellAddress(String cellAddress) throws IllegalArgumentException {
+		if (!isValid(cellAddress)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype CellAddress");
+		}
+		mCellAddress = cellAddress;
+	}
+
+	// TODO: Should a cell address stay a string?
+	/**
+	 * Returns a String Object representing this CellAddress's value
+	 *
+	 * @return return a string representation of the value of this CellAddress
+	 *         object
+	 */
+	@Override
+	public String toString() {
+
+		return mCellAddress;
+	}
+
+	/**
+	 * Returns a CellAddress instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a CellAddress instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid CellAddress
+	 */
+	public static CellAddress valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new CellAddress(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype cellAddress} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype cellAddress} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!cellAddressPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellRangeAddress.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellRangeAddress.java
new file mode 100644
index 0000000..3385224
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellRangeAddress.java
@@ -0,0 +1,93 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype cellRangeAddress}
+ */
+public class CellRangeAddress implements OdfDataType {
+
+	private String mCellRangeAddress;
+	private static final Pattern cellRangeAddressPattern1 = Pattern.compile("^(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[A-Z]+\\$?[0-9]+(:(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[A-Z]+\\$?[0-9]+)?$");
+	private static final Pattern cellRangeAddressPattern2 = Pattern.compile("^(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[0-9]+:(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[0-9]+$");
+	private static final Pattern cellRangeAddressPattern3 = Pattern.compile("^(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[A-Z]+:(\\$?([^\\. ']+|'([^']|'')+'))?\\.\\$?[A-Z]+$");
+	
+	/**
+	 * Construct CellRangeAddress by the parsing the given string
+	 *
+	 * @param cellRangeAddress
+	 *            The String to be parsed into CellRangeAddress
+	 * @throws IllegalArgumentException if the given argument is not a valid CellRangeAddress
+	 */
+	public CellRangeAddress(String cellRangeAddress)
+			throws IllegalArgumentException {
+		if (!isValid(cellRangeAddress)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype CellRangeAddress");
+		}
+		mCellRangeAddress = cellRangeAddress;
+	}
+
+	// TODO: Should a cell address stay a string?
+	/**
+	 * Returns a String Object representing this CellRangeAddress's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         CellRangeAddress object
+	 */
+	@Override
+	public String toString() {
+		return mCellRangeAddress;
+	}
+
+	/**
+	 * Returns a CellRangeAddress instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a CellRangeAddress instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid CellRangeAddress
+	 */
+	public static CellRangeAddress valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new CellRangeAddress(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype cellRangeAddress} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype cellRangeAddress} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!(cellRangeAddressPattern1.matcher(stringValue).matches() || cellRangeAddressPattern2.matcher(stringValue).matches() ||cellRangeAddressPattern3.matcher(stringValue).matches()))) {
+				return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellRangeAddressList.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellRangeAddressList.java
new file mode 100644
index 0000000..4ec9f61
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CellRangeAddressList.java
@@ -0,0 +1,126 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype cellRangeAddressList}
+ */
+public class CellRangeAddressList implements OdfDataType {
+
+	private String mCellRangeAddressList;
+
+	/**
+	 * Construct CellRangeAddressList by the parsing the given string
+	 *
+	 * @param cellRangeAddressList The String to be parsed into CellRangeAddressList
+	 * @throws IllegalArgumentException if the given argument is not a valid CellRangeAddressList
+	 */
+	public CellRangeAddressList(List<CellRangeAddress> cellRangeAddressList)
+			throws IllegalArgumentException {
+		if (cellRangeAddressList == null) {
+			throw new IllegalArgumentException("parameter can not be null for CellRangeAddressList");
+		}
+
+		StringBuffer aRet = new StringBuffer();
+		Iterator<CellRangeAddress> aIter = cellRangeAddressList.iterator();
+		while (aIter.hasNext()) {
+			if (aRet.length() > 0) {
+				aRet.append(' ');
+			}
+			String aAddress = aIter.next().toString();
+			aRet.append(aAddress);
+		}
+		mCellRangeAddressList = aRet.toString();
+	}
+
+	// TODO: Should a cell address stay a string?
+	/**
+	 * Returns a space separated String Object representing this CellRangeAddressList's value
+	 *
+	 * @return return a string representation of the value of this CellRangeAddressList object
+	 */
+	@Override
+	public String toString() {
+		return mCellRangeAddressList;
+	}
+
+	/**
+	 * Returns a CellRangeAddressList instance representing the specified String value
+	 *
+	 * @param stringValue a String value
+	 * @return return a CellRangeAddressList instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid CellRangeAddressList
+	 */
+	public static CellRangeAddressList valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if (stringValue == null) {
+			throw new IllegalArgumentException("parameter is invalid for datatype CellRangeAddressList");
+		}
+
+		List<CellRangeAddress> aRet = new ArrayList<CellRangeAddress>();
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			aRet.add(new CellRangeAddress(names[i]));
+		}
+		return new CellRangeAddressList(aRet);
+	}
+
+	/**
+	 * Returns a list of CellRangeAddress from the CellRangeAddressList Object
+	 * @return a list of CellRangeAddress
+	 */
+	public List<CellRangeAddress> getCellRangesAddressList() {
+		List<CellRangeAddress> aRet = new ArrayList<CellRangeAddress>();
+		String[] names = mCellRangeAddressList.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			aRet.add(new CellRangeAddress(names[i]));
+		}
+		return aRet;
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype cellRangeAddressList} data type
+	 * @param stringValue the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype cellRangeAddressList} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+		if (stringValue.length() == 0) {
+			return true;
+		}
+
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			if (!CellRangeAddress.isValid(names[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ClipShape.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ClipShape.java
new file mode 100644
index 0000000..2060f2c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ClipShape.java
@@ -0,0 +1,87 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype clipShape}
+ */
+public class ClipShape implements OdfDataType {
+
+	private String mClipShape;
+	private static final Pattern clipShapePattern = Pattern.compile("^rect\\([ ]*((-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)))|(auto))([ ]*,[ ]*((-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))))|(auto)){3}[ ]*\\)$");
+	
+	/**
+	 * Construct ClipShape by the parsing the given string
+	 *
+	 * @param clipShape
+	 *            The String to be parsed into ClipShape
+	 * @throws IllegalArgumentException if the given argument is not a valid ClipShape
+	 */
+	public ClipShape(String clipShape) throws IllegalArgumentException {
+		if (!isValid(clipShape)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype ClipShape");
+		}
+		mClipShape = clipShape;
+	}
+
+	/**
+	 * Returns a String Object representing this ClipShape's value
+	 *
+	 * @return return a string representation of the value of this ClipShape
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mClipShape;
+	}
+
+	/**
+	 * Returns a ClipShape instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a ClipShape instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid ClipShape
+	 */
+	public static ClipShape valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new ClipShape(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype clipShape} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype clipShape} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!clipShapePattern.matcher(stringValue).matches())) {
+				return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Color.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Color.java
new file mode 100644
index 0000000..8dc3ce5
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Color.java
@@ -0,0 +1,438 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype color}
+ * See <a href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">W3C CSS specification</a> for further details.
+ */
+public class Color implements OdfDataType {
+
+	private static final Pattern sixHexRGBPattern = Pattern.compile("^#[0-9a-fA-F]{6}$");
+	private static final Pattern threeHexRGBPattern = Pattern.compile("^#[0-9a-fA-F]{3}$");
+	private static final Map<String, String> labeledColors = new HashMap<String, String>();
+	static {
+		labeledColors.put("aqua", "#00ffff");
+		labeledColors.put("black", "#000000");
+		labeledColors.put("blue", "#0000ff");
+		labeledColors.put("fuchsia", "#ff00ff");
+		labeledColors.put("gray", "#808080");
+		labeledColors.put("green", "#008000");
+		labeledColors.put("lime", "#00ff00");
+		labeledColors.put("maroon", "#800000");
+		labeledColors.put("navy", "#000080");
+		labeledColors.put("olive", "#808000");
+		labeledColors.put("orange", "#ffA500");
+		labeledColors.put("purple", "#800080");
+		labeledColors.put("red", "#ff0000");
+		labeledColors.put("silver", "#c0c0c0");
+		labeledColors.put("teal", "#008080");
+		labeledColors.put("white", "#ffffff");
+		labeledColors.put("yellow", "#ffff00");
+	}
+	private static final String COLOR_PREFIX = "#";
+	
+	private final String mColorAsSixHexRGB;
+	
+	/**
+	* The color aqua in sRGB space.
+	*/
+	public static final Color AQUA = new Color("#00ffff");
+
+
+	/**
+	* The color black in sRGB space.
+	*/
+	public static final Color BLACK = new Color("#000000");
+
+
+	/**
+	* The color blue in sRGB space.
+	*/
+	public static final Color BLUE = new Color("#0000ff");
+
+
+	/**
+	* The color fuchsia in sRGB space.
+	*/
+	public static final Color FUCHSIA = new Color("#ff00ff");
+
+
+	/**
+	* The color gray in sRGB space.
+	*/
+	public static final Color GRAY = new Color("#808080");
+
+
+	/**
+	* The color green in sRGB space.
+	*/
+	public static final Color GREEN = new Color("#008000");
+
+
+	/**
+	* The color lime in sRGB space.
+	*/
+	public static final Color LIME = new Color("#00ff00");
+
+
+	/**
+	* The color maroon in sRGB space.
+	*/
+	public static final Color MAROON = new Color("#800000");
+
+
+	/**
+	* The color navy in sRGB space.
+	*/
+	public static final Color NAVY = new Color("#000080");
+
+
+	/**
+	* The color olive in sRGB space.
+	*/
+	public static final Color OLIVE = new Color("#808000");
+
+
+	/**
+	* The color orange in sRGB space.
+	*/
+	public static final Color ORANGE = new Color("#ffA500");
+
+
+	/**
+	* The color purple in sRGB space.
+	*/
+	public static final Color PURPLE = new Color("#800080");
+
+
+	/**
+	* The color red in sRGB space.
+	*/
+	public static final Color RED = new Color("#ff0000");
+
+
+	/**
+	* The color silver in sRGB space.
+	*/
+	public static final Color SILVER = new Color("#c0c0c0");
+
+
+	/**
+	* The color teal in sRGB space.
+	*/
+	public static final Color TEAL = new Color("#008080");
+
+
+	/**
+	* The color white in sRGB space.
+	*/
+	public static final Color WHITE = new Color("#ffffff");
+
+
+	/**
+	* The color yellow in sRGB space.
+	*/
+	public static final Color YELLOW = new Color("#ffff00");
+
+	
+	/**
+	 * Construct Color by the parsing the given string. The string should be observed sRGB color standard 
+	 * which starts with "#" and following with six numbers or three numbers in Hex format.
+	 * For example, "#FFFFFF" is a valid argument and white color will be constructed. 
+	 * <p>
+	 * For further information on sRGB,
+	 * see <A href="http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html">
+	 * http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html
+	 * </A>.
+	 * 
+	 * @param color  represented using the 3 or 6 HEX sRGB notation.
+	 * @throws IllegalArgumentException  if the given argument is not a valid Color in sRGB HEX notation.
+	 */
+	public Color(String color) {
+		if(!isValid(color)){
+			throw new IllegalArgumentException("parameter is invalid for datatype Color");
+		}
+		if(color.length()==4){
+			mColorAsSixHexRGB = mapColorFromThreeToSixHex(color);
+		}else{
+			mColorAsSixHexRGB = color;
+		}
+	}
+
+	/**
+	 * Construct Color using the specified red, green and blue values in the range (0 - 255).
+	 * 
+	 * @param red  the red component.
+	 * @param green  the green component.
+	 * @param blue  the blue component.
+	 * @throws IllegalArgumentException  if <code>red</code>, <code>green</code> or <code>blue</code> 
+	 *         are outside of the range 0 to 255, inclusive.
+	 */
+	public Color(int red, int green, int blue) {
+		this(mapColorIntegerToString(red, green, blue));
+	}
+	
+	/**
+	 * Construct Color using the specified red, green, and blue values in the range (0.0 - 1.0).
+	 * 
+	 * @param red  the red component
+	 * @param green  the green component
+	 * @param blue  the blue component
+	 * @throws IllegalArgumentException  if <code>red</code>, <code>green</code> or <code>blue</code> are
+	 *             outside of the range 0.0 to 1.0, inclusive.
+	 */
+	public Color(float red, float green, float blue) {
+		this((int) (red * 255 + 0.5), (int) (green * 255 + 0.5), (int) (blue * 255 + 0.5));
+	}
+
+	/**
+	 * Construct Color using {@link java.awt.Color <code>java.awt.Color</code>}.
+	 * 
+	 * @param color the specified {@link java.awt.Color <code>java.awt.Color</code>}.
+	 * @throws IllegalArgumentException  if the given argument is not a valid Color.
+	 * @see java.awt.Color
+	 */
+	public Color(java.awt.Color color) {
+		this(color.getRed(),color.getGreen(),color.getBlue());
+	}
+
+	/**
+	 * Returns the Color in six HEX sRGB notation.
+	 * format.
+	 * 
+	 * @return a six number hexadecimal string representation of the Color
+	 */
+	@Override
+	public String toString() {
+		return mColorAsSixHexRGB;
+	}
+
+	/**
+	 * Returns a Color instance representing the specified String value.
+	 * 
+	 * @param colorValue a six (or three) number hexadecimal string representation of the Color
+	 * @return return a Color instance representing <code>stringValue</code>.
+	 * @throws IllegalArgumentException  if the given argument is not a valid Color.
+	 */
+	public static Color valueOf(String colorValue) {
+		return new Color(colorValue);
+	}
+
+	/**
+	 * Check if the specified String is a valid {@odf.datatype color} data type.
+	 * 
+	 * @param colorValue  a six (or three) number hexadecimal string representation of the Color
+	 * @return true if the value of argument is valid for{@odf.datatype color} data type false otherwise.
+	 */
+	public static boolean isValid(String colorValue) {
+		if ((colorValue == null) || !(threeHexRGBPattern.matcher(colorValue).matches() || sixHexRGBPattern.matcher(colorValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	/**
+	 * Convert RGB color formats to six-digit hex RGB format. 
+	 * 
+	 * The RGB mapping works as follows:	 
+	 * rgb(110%, 0%, 0%)----clipped to rgb(100%,0%,0%), return #ff0000  
+	 * maroon----one of the seventeen fixed labeled numbers, return #800000  
+	 * #ff0000----six-digit notation #rrggbb, returns the input
+	 * #f00----three-digit notation #rgb, return #ff0000
+	 * rgb(255,0,0)----integer range 0 - 255, return #ff0000
+	 * rgb(300,0,0)----clipped to rgb(255,0,0), return #ff0000
+	 * rgb(255,-10,0)----clipped to rgb(255,0,0), return #ff0000 
+	 * 
+	 * @param colorValue  The sRGB color value to be converted.
+	 * @return the converted color.
+	 */
+	public static String toSixDigitHexRGB(String colorValue){
+		if (colorValue == null) {
+			throw new IllegalArgumentException("parameter should not be null.");
+		} else {
+			colorValue = colorValue.toLowerCase().trim();
+			if (sixHexRGBPattern.matcher(colorValue).matches()) {
+				// 6-digit notation #rrggbb - return itself.
+				return colorValue;
+			} else if (threeHexRGBPattern.matcher(colorValue).matches()) {
+				// convert 3-digit notation #rgb.
+				return mapColorFromThreeToSixHex(colorValue);
+			} else if (colorValue.startsWith("rgb")) {
+				colorValue = colorValue.substring(3);
+				colorValue = colorValue.substring(colorValue.indexOf("(") + 1,
+						colorValue.indexOf(")"));
+				String[] rgbValues = colorValue.split(",");
+				if (rgbValues.length == 3) {
+					int r = mapColorValueToInteger(rgbValues[0].trim());
+					int g = mapColorValueToInteger(rgbValues[1].trim());
+					int b = mapColorValueToInteger(rgbValues[2].trim());
+					String rs = Integer.toHexString(r);
+					String gs = Integer.toHexString(g);
+					String bs = Integer.toHexString(b);
+					String hexColor = COLOR_PREFIX;
+					if (r < 16) {
+						hexColor += "0";
+					}
+					hexColor += rs;
+					if (g < 16) {
+						hexColor += "0";
+					}
+					hexColor += gs;
+					if (b < 16) {
+						hexColor += "0";
+					}
+					hexColor += bs;
+					return hexColor;
+				}else{
+					throw new IllegalArgumentException("parameter: "+ colorValue + " can't be converted six-digit hex RGB.");
+				}
+			} else {
+				// convert the seventeen fixed labeled numbers.
+				String hexColor = labeledColors.get(colorValue);
+				if (hexColor != null) {
+					return hexColor;
+				} else {
+					throw new IllegalArgumentException("parameter: "+ colorValue + " can't be converted six-digit hex RGB.");
+				}
+			}
+		}
+	}
+
+	/**
+	 * Return the corresponding {@link java.awt.Color <code>java.awt.Color</code>} instance of the Color data type.
+	 * 
+	 * @return the converted {@link java.awt.Color <code>java.awt.Color</code>} instance..
+	 */
+	public java.awt.Color getAWTColor(){
+		return mapColorToAWTColor(this);
+	}
+	
+	/**
+	 * Map a Color data type to {@link java.awt.Color <code>java.awt.Color</code>}. 
+	 * 
+	 * @param color  The color data type to be mapped..
+	 * @return the converted {@link java.awt.Color <code>java.awt.Color</code>} instance.
+	 */
+	public static java.awt.Color mapColorToAWTColor(Color color) {
+		int rgb = Integer.decode("0x" + color.mColorAsSixHexRGB.substring(1));
+		return new java.awt.Color(rgb);
+	}
+	
+	/**
+	 * Converts Color expressed by red, green and blue values in the range (0 - 255) to 
+	 * a string format which is used in {@odf.datatype color}.
+	 * 
+	 * @param red  the red component.
+	 * @param green  the green component.
+	 * @param blue  the blue component.
+	 * @return the string format color.
+	 */
+	private static String mapColorIntegerToString(int red, int green, int blue) {
+		String rs = Integer.toHexString(red);
+		String gs = Integer.toHexString(green);
+		String bs = Integer.toHexString(blue);
+		String hexColor = COLOR_PREFIX;
+		if (red < 16) {
+			hexColor += "0";
+		}
+		hexColor += rs;
+		if (green < 16) {
+			hexColor += "0";
+		}
+		hexColor += gs;
+		if (blue < 16) {
+			hexColor += "0";
+		}
+		hexColor += bs;
+		return hexColor;
+	}
+	
+	/**
+	 * Converts Color from three-digit to six-digit form. The three-digit (#rgb) is converted into six-digit form (#rrggbb) by replicating digits, 
+	 * not by adding zeros. For example, #fb0 expands to #ffbb00. 
+	 * 	 * 
+	 * @param threeDigitcColor  the three-digit color form.
+	 * @return the six-digit color form.
+	 */
+	private static String mapColorFromThreeToSixHex(String threeDigitcColor) {
+		char[] colorData = threeDigitcColor.toCharArray();
+		char[] sixDigitColor = new char[7];
+		for (int i = 0; i < 7; i++) {
+			sixDigitColor[i] = colorData[(i + 1) / 2];
+		}
+		return new String(sixDigitColor);
+	}
+
+	/** Convert percent string and integer string to integer.
+		value range will be checked and adapted to border (error correction) */
+	private static int mapColorValueToInteger(String colorValue) {
+		if (colorValue.endsWith("%")) {
+			colorValue = colorValue.substring(0, colorValue.indexOf("%"));
+			int value = Integer.parseInt(colorValue);
+			if (value < 0) {
+				value = 0;
+			}
+			if (value > 100) {
+				value = 100;
+			}
+			return 255 * value / 100;
+		} else {
+			int value = Integer.parseInt(colorValue);
+			if (value < 0) {
+				value = 0;
+			}
+			if (value > 255) {
+				value = 255;
+			}
+			return value;
+		}
+	}
+
+        
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final Color other = (Color) obj;
+        if ((this.mColorAsSixHexRGB == null) ? (other.mColorAsSixHexRGB != null) : !this.mColorAsSixHexRGB.equals(other.mColorAsSixHexRGB)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 3;
+        hash = 97 * hash + (this.mColorAsSixHexRGB != null ? this.mColorAsSixHexRGB.hashCode() : 0);
+        return hash;
+    }
+        
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Coordinate.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Coordinate.java
new file mode 100644
index 0000000..9038a6a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Coordinate.java
@@ -0,0 +1,32 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype coordinate}
+ */
+public class Coordinate extends Length {
+
+	public Coordinate(String length) {
+		super(length);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CountryCode.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CountryCode.java
new file mode 100644
index 0000000..a6105c3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/CountryCode.java
@@ -0,0 +1,91 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype countryCode}
+ */
+public class CountryCode implements OdfDataType {
+
+	private String mCountryCode;
+	private static final Pattern countryCodePattern = Pattern.compile("^[A-Za-z0-9]{1,8}$");
+	
+	/**
+	 * Construct CountryCode by the parsing the given string
+	 *
+	 * @param countryCode
+	 *            The String to be parsed into CountryCode
+	 * @throws IllegalArgumentException if the given argument is not a valid CountryCode
+	 */
+	public CountryCode(String countryCode) throws IllegalArgumentException {
+		if (!isValid(countryCode)) {
+			throw new IllegalArgumentException("parameter is invalid for datatype CountryCode");
+		}
+		// validate 'token' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#token
+		if (!W3CSchemaType.isValid("token", countryCode)) {
+			throw new IllegalArgumentException("parameter is invalid for datatype CountryCode");
+		}
+		mCountryCode = countryCode;
+	}
+
+	/**
+	 * Returns a String Object representing this CountryCode's value
+	 *
+	 * @return return a string representation of the value of this CountryCode
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mCountryCode;
+	}
+
+	/**
+	 * Returns a CountryCode instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a CountryCode instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid CountryCode
+	 */
+	public static CountryCode valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new CountryCode(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype countryCode} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype countryCode} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null || !countryCodePattern.matcher(stringValue).matches()) {
+			return false;
+		} else {
+			return W3CSchemaType.isValid("token", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Date.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Date.java
new file mode 100644
index 0000000..cb614df
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Date.java
@@ -0,0 +1,110 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype date}
+ * Details of the type can be found in the <a href="http://www.w3.org/TR/xmlschema-2/#date">W3C XML Schema specification</a>.
+ */
+public class Date implements OdfFieldDataType, OdfDataType {
+
+	private XMLGregorianCalendar mDate;
+
+	/**
+	 * Construct an newly Date object that represents the specified
+	 * XMLGregorianCalendar value
+	 *
+	 * @param date
+	 *            the value to be represented by the Date Object
+	 * @throws IllegalArgumentException if the given argument is not a valid Date
+	 *
+	 */
+	public Date(XMLGregorianCalendar date) throws IllegalArgumentException {
+		if (date == null) {
+			throw new IllegalArgumentException("parameter can not be null for date");
+		}
+		// validate 'date' type which is defined in W3C schema
+		// see http://www.w3.org/TR/xmlschema-2/#date
+		if (!W3CSchemaType.isValid("date", date.toXMLFormat())) {
+			throw new IllegalArgumentException("parameter is invalid for datatype date");
+		}
+		mDate = date;
+	}
+
+	/**
+	 * Returns a String Object representing this Date value
+	 *
+	 * @return return a string representation of the value of this Date object
+	 */
+	@Override
+	public String toString() {
+		return mDate.toXMLFormat();
+	}
+
+	/**
+	 * Returns a Date instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Date instance representing stringValue
+	 * @throws IllegalArgumentException If the stringValue is not a date
+	 */
+	public static Date valueOf(String stringValue) throws IllegalArgumentException {
+		Date date = null;
+		try {
+			DatatypeFactory aFactory = new org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl();
+			date = new Date(aFactory.newXMLGregorianCalendar(stringValue));
+		} catch (Throwable t) {
+			throw new IllegalArgumentException(t);
+		}
+		return date;
+	}
+
+	/**
+	 * Returns the value of this Date object as an XMLGregorianCalendar
+	 *
+	 * @return the XMLGregorianCalendar value of this Date object.
+	 */
+	public XMLGregorianCalendar getXMLGregorianCalendar() {
+		return mDate;
+	}
+
+	/**
+	 * check if the specified XMLGregorianCalendar instance is a valid {@odf.datatype date} data
+	 * type
+	 *
+	 * @param date
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype date} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(XMLGregorianCalendar date) {
+		boolean isDate = false;
+		if (date != null) {
+			isDate = W3CSchemaType.isValid("date", date.toXMLFormat());
+		}
+		return isDate;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/DateOrDateTime.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/DateOrDateTime.java
new file mode 100644
index 0000000..8a6c1c8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/DateOrDateTime.java
@@ -0,0 +1,108 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype dateOrDateTime}
+ */
+public class DateOrDateTime implements OdfDataType {
+
+	private XMLGregorianCalendar mDateOrDateTime;
+
+	/**
+	 * Construct an newly DateOrDateTime object that represents the specified
+	 * XMLGregorianCalendar value
+	 *
+	 * @param dateOrDateTime
+	 *            the value to be represented by the DateOrDateTime Object
+	 * @throws IllegalArgumentException if the given argument is not a valid DateOrDateTime
+	 */
+	public DateOrDateTime(XMLGregorianCalendar dateOrDateTime)
+			throws IllegalArgumentException {
+		if (DateOrDateTime.isValid(dateOrDateTime)) {
+			mDateOrDateTime = dateOrDateTime;
+		} else {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype DateOrDateTime");
+		}
+	}
+
+	/**
+	 * Returns a String Object representing this DateOrDateTime value
+	 *
+	 * @return return a string representation of the value of this
+	 *         DateOrDateTime object
+	 */
+	@Override
+	public String toString() {
+		return mDateOrDateTime.toXMLFormat();
+	}
+
+	/**
+	 * Returns a DateOrDateTime instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a DateOrDateTime instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid DateOrDateTime
+	 */
+	public static DateOrDateTime valueOf(String stringValue)
+			throws IllegalArgumentException {
+		try {
+			DatatypeFactory aFactory = new org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl();
+			return new DateOrDateTime(aFactory.newXMLGregorianCalendar(stringValue));
+		} catch (IllegalArgumentException ex) {
+			Logger.getLogger(DateOrDateTime.class.getName()).log(Level.SEVERE,
+					"parameter is invalid for datatype DateOrDateTime", ex);
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype DateOrDateTime");
+		}
+	}
+
+	/**
+	 * Returns the value of this DateOrDateTime object as an
+	 * XMLGregorianCalendar
+	 *
+	 * @return the XMLGregorianCalendar value of this DateOrDateTime object.
+	 */
+	public XMLGregorianCalendar getXMLGregorianCalendar() {
+		return mDateOrDateTime;
+	}
+
+	/**
+	 * check if the specified XMLGregorianCalendar instance is a valid
+	 * {@odf.datatype dateOrDateTime} data type
+	 *
+	 * @param dateOrDateTime
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype dateOrDateTime} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(XMLGregorianCalendar dateOrDateTime) {
+		return (Date.isValid(dateOrDateTime) || DateTime.isValid(dateOrDateTime));
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/DateTime.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/DateTime.java
new file mode 100644
index 0000000..826a380
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/DateTime.java
@@ -0,0 +1,112 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype dateTime}
+ */
+public class DateTime implements OdfDataType {
+
+	private XMLGregorianCalendar mDateTime;
+
+	/**
+	 * Construct an newly DateTime object that represents the specified
+	 * XMLGregorianCalendar value
+	 *
+	 * @param dateTime
+	 *            the value to be represented by the DateTime Object
+	 * @throws IllegalArgumentException if the given argument is not a valid DateTime
+	 */
+	public DateTime(XMLGregorianCalendar dateTime) throws IllegalArgumentException {
+		if (dateTime == null) {
+			throw new IllegalArgumentException("parameter can not be null for DateTime");
+		}
+		// validate 'dateTime' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#dateTime
+		if (!W3CSchemaType.isValid("dateTime", dateTime.toXMLFormat())) {
+			throw new IllegalArgumentException("parameter is invalid for datatype dateTime");
+		}
+		mDateTime = dateTime;
+	}
+
+	/**
+	 * Returns a String Object representing this DateTime value
+	 *
+	 * @return return a string representation of the value of this DateTime
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mDateTime.toXMLFormat();
+	}
+
+	/**
+	 * Returns a DateTime instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a DateTime instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid DateTime
+	 */
+	public static DateTime valueOf(String stringValue) throws IllegalArgumentException {
+		try {
+			DatatypeFactory aFactory = new org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl();
+			return new DateTime(aFactory.newXMLGregorianCalendar(stringValue));
+		} catch (IllegalArgumentException ex) {
+			Logger.getLogger(DateTime.class.getName()).log(Level.SEVERE,
+					"parameter is invalid for datatype DateTime", ex);
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype DateTime");
+		}
+	}
+
+	/**
+	 * Returns the value of this DateTime object as an XMLGregorianCalendar
+	 *
+	 * @return the XMLGregorianCalendar value of this DateTime object.
+	 */
+	public XMLGregorianCalendar getXMLGregorianCalendar() {
+		return mDateTime;
+	}
+
+	/**
+	 * check if the specified XMLGregorianCalendar instance is a valid {@odf.datatype dateTime} data
+	 * type
+	 *
+	 * @param date
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype dateTime} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(XMLGregorianCalendar date) {
+		if (date == null) {
+			return false;
+		} else {
+			return W3CSchemaType.isValid("dateTime", date.toString());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Distance.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Distance.java
new file mode 100644
index 0000000..988c6fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Distance.java
@@ -0,0 +1,31 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype distance}
+ */
+public class Distance extends Length {
+
+	public Distance(String length) {
+		super(length);
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Duration.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Duration.java
new file mode 100644
index 0000000..fc99691
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Duration.java
@@ -0,0 +1,122 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype duration}
+ */
+public class Duration implements OdfFieldDataType, OdfDataType {
+
+	private javax.xml.datatype.Duration mDurationType;
+
+	/**
+	 * Construct DurationType by the parsing the given string
+	 *
+	 * @param duration	The String to be parsed into DurationType
+	 * @throws IllegalArgumentException if the given argument is not a valid Duration
+	 */
+	public Duration(javax.xml.datatype.Duration duration) throws IllegalArgumentException {
+		if (duration == null) {
+			throw new IllegalArgumentException("parameter can not be null for duration");
+		}
+
+		// validate 'duration' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#duration
+		if (!W3CSchemaType.isValid("duration", duration.toString())) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype duration");
+		}
+		mDurationType = duration;
+	}
+
+	/**
+	 * Returns a String Object representing this DurationType's value
+	 *
+	 * @return return a string representation of the value of this DurationType
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mDurationType.toString();
+	}
+
+	/**
+	 * Returns a DurationType instance representing the specified String value
+	 *
+	 * @param stringValue  a String value
+	 *
+	 * @return return a DurationType instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Duration
+	 */
+	public static Duration valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if (stringValue == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for Duration");
+		}
+
+		try {
+			DatatypeFactory aFactory = DatatypeFactory.newInstance();
+			return new Duration(aFactory.newDuration(stringValue));
+		} catch (DatatypeConfigurationException ex1) {
+			Logger.getLogger(Duration.class.getName()).log(Level.SEVERE,
+					"DatatypeFactory can not be instanced", ex1);
+			return null;
+		} catch (IllegalArgumentException ex2) {
+			Logger.getLogger(Duration.class.getName()).log(Level.SEVERE,
+					"parameter is invalid for datatype Duration", ex2);
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype Duration");
+		}
+	}
+
+	/**
+	 * Returns the value of this DurationType object as an Duration
+	 *
+	 * @return the Duration value of this DurationType object.
+	 */
+	public javax.xml.datatype.Duration getValue() {
+		return mDurationType;
+	}
+
+	/**
+	 * check if the specified Duration instance is a valid {@odf.datatype duration} data type
+	 *
+	 * @param duration  the value to be tested
+	 *
+	 * @return true if the value of argument is valid for {@odf.datatype duration} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(javax.xml.datatype.Duration duration) {
+		boolean isDuration = false;
+		if (duration != null) {
+			isDuration = W3CSchemaType.isValid("duration", duration.toString());
+		}
+		return isDuration;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Formula.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Formula.java
new file mode 100644
index 0000000..b00c988
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Formula.java
@@ -0,0 +1,81 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype formula}
+ */
+public class Formula implements OdfDataType {
+
+	private String mFormula;
+
+	/**
+	 * Construct Formula by the parsing the given string
+	 *
+	 * @param formula  The String to be parsed into Formula
+	 * @throws IllegalArgumentException if the given argument is not a valid Formula
+	 */
+	public Formula(String formula) throws IllegalArgumentException {
+		if (formula == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for Formula");
+		}
+		mFormula = formula;
+	}
+
+	/**
+	 * Returns a String Object representing this Formula's value
+	 *
+	 * @return return a string representation of the value of this Formula
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mFormula;
+	}
+
+	/**
+	 * Returns a Formula instance representing the specified String value
+	 *
+	 * @param stringValue   a String value
+	 * @return return a Formula instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Formula
+	 */
+	public static Formula valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new Formula(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype formula} data type
+	 *
+	 * @param stringValue   the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype formula} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+
+		return true;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ID.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ID.java
new file mode 100644
index 0000000..d2e58f7
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ID.java
@@ -0,0 +1,87 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype ID}
+ */
+public class ID implements OdfDataType {
+
+	private String mId;
+
+	/**
+	 * Construct ID by the parsing the given string
+	 *
+	 * @param id    The String to be parsed into ID
+	 * @throws IllegalArgumentException if the given argument is not a valid ID
+	 */
+	public ID(String id) throws IllegalArgumentException {
+		if (id == null) {
+			throw new IllegalArgumentException("parameter can not be null for ID");
+		}
+
+		// validate 'ID' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#ID
+		if (!W3CSchemaType.isValid("ID", id)) {
+			throw new IllegalArgumentException("parameter is invalid for datatype ID");
+		}
+		mId = id;
+	}
+
+	/**
+	 * Returns a String Object representing this ID's value
+	 *
+	 * @return return a string representation of the value of this ID object
+	 */
+	@Override
+	public String toString() {
+		return mId;
+	}
+
+	/**
+	 * Returns an ID instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return an ID instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid ID
+	 */
+	public static ID valueOf(String stringValue) throws IllegalArgumentException {
+		return new ID(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype ID} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype ID} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return true;
+		} else {
+			return W3CSchemaType.isValid("ID", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/IDREF.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/IDREF.java
new file mode 100644
index 0000000..2eb6dbf
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/IDREF.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype IDREF}
+ */
+public class IDREF implements OdfDataType {
+
+	private String mIdRef;
+
+	/**
+	 * Construct IDREF by the parsing the given string
+	 *
+	 * @param idRef The String to be parsed into IDREF
+	 * @throws IllegalArgumentException if the given argument is not a valid IDREF
+	 */
+	public IDREF(String idRef) throws IllegalArgumentException {
+		if (idRef == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for IDREF");
+		}
+		// validate 'IDREF' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#IDREF
+		if (!W3CSchemaType.isValid("IDREF", idRef)) {
+			throw new IllegalArgumentException("parameter is invalid for datatype IDREF");
+
+		}
+		mIdRef = idRef;
+	}
+
+	/**
+	 * Returns a String Object representing this IDREF's value
+	 *
+	 * @return return a string representation of the value of this IDREF object
+	 */
+	@Override
+	public String toString() {
+		return mIdRef;
+	}
+
+	/**
+	 * Returns an IDREF instance representing the specified String value
+	 *
+	 * @param stringValue a String value
+	 * @throws IllegalArgumentException if the given argument is not a valid IDREF
+	 * @return return an IDREF instance representing stringValue
+	 */
+	public static IDREF valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new IDREF(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype IDREF} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype IDREF} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return true;
+		} else {
+			return W3CSchemaType.isValid("IDREF", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/IDREFS.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/IDREFS.java
new file mode 100644
index 0000000..91dcc06
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/IDREFS.java
@@ -0,0 +1,130 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype IDREFS}
+ */
+public class IDREFS implements OdfDataType {
+
+	private String mIdRefs;
+
+	/**
+	 * Construct IDREFS by the parsing the given IDREF list
+	 *
+	 * @param idRefList
+	 *            The String to be parsed into IDREFS
+	 * @throws IllegalArgumentException if the given argument is not a valid IDREFS
+	 */
+	public IDREFS(List<IDREF> idRefList) throws IllegalArgumentException {
+		if ((idRefList == null) || (idRefList.size() == 0)) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for IDREFS");
+		}
+		StringBuffer aRet = new StringBuffer();
+		Iterator<IDREF> aIter = idRefList.iterator();
+		while (aIter.hasNext()) {
+			if (aRet.length() > 0) {
+				aRet.append(' ');
+			}
+			String styleName = aIter.next().toString();
+			aRet.append(styleName);
+		}
+		mIdRefs = aRet.toString();
+	}
+
+	/**
+	 * Returns a String Object representing this IDREFS's value
+	 *
+	 * @return return a string representation of the value of this IDREFS object
+	 */
+	@Override
+	public String toString() {
+		return mIdRefs;
+	}
+
+	/**
+	 * Returns an IDREFS instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return an IDREFS instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid IDREFS
+	 */
+	public static IDREFS valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if ((stringValue == null) || (stringValue.length() == 0)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype IDREFS");
+		}
+
+		List<IDREF> aRet = new ArrayList<IDREF>();
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			aRet.add(new IDREF(names[i]));
+		}
+		return new IDREFS(aRet);
+	}
+
+	/**
+	 * Returns a list of IDREF from the IDREFS Object
+	 *
+	 * @return a list of IDREF
+	 */
+	public List<IDREF> getIDREFList() {
+		List<IDREF> aRet = new ArrayList<IDREF>();
+		String[] names = mIdRefs.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			aRet.add(new IDREF(names[i]));
+		}
+		return aRet;
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype IDREFS} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype IDREFS} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+		if (stringValue.length() == 0) {
+			return false;
+		}
+
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			if (!IDREF.isValid(names[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Language.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Language.java
new file mode 100644
index 0000000..c71ed1d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Language.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype language}
+ */
+public class Language implements OdfDataType {
+
+	private String mLanguage;
+
+	/**
+	 * Construct Language by the parsing the given string
+	 *
+	 * @param language
+	 *            The String to be parsed into Language
+	 * @throws IllegalArgumentException if the given argument is not a valid Language
+	 */
+	public Language(String language) throws IllegalArgumentException {
+		if (language == null) {
+			throw new IllegalArgumentException("parameter can not be null for Language");
+		}
+		if (!W3CSchemaType.isValid("language", language)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype Language");
+		}
+		mLanguage = language;
+	}
+
+	/**
+	 * Returns a String Object representing this Language's value
+	 *
+	 * @return return a string representation of the value of this Language
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mLanguage;
+	}
+
+	/**
+	 * Returns a Language instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Language instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Language
+	 */
+	public static Language valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new Language(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype language} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype language} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return true;
+		} else {
+			return W3CSchemaType.isValid("language", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/LanguageCode.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/LanguageCode.java
new file mode 100644
index 0000000..2d3b87a
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/LanguageCode.java
@@ -0,0 +1,94 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype languageCode}
+ */
+public class LanguageCode implements OdfDataType {
+
+	private String mLanguageCode;
+	private static final Pattern languageCodePattern = Pattern.compile("^[A-Za-z]{1,8}$");
+	
+	/**
+	 * Construct LanguageCode by the parsing the given string
+	 *
+	 * @param languageCode The String to be parsed into LanguageCode
+	 * @throws IllegalArgumentException if the given argument is not a valid langageCode
+	 */
+	public LanguageCode(String languageCode) throws IllegalArgumentException {
+		if (!isValid(languageCode)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype LanguageCode");
+		}
+
+		// validate 'LanguageCode' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#token
+		if (!W3CSchemaType.isValid("token", languageCode)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype LanguageCode");
+		}
+		mLanguageCode = languageCode;
+	}
+
+	/**
+	 * Returns a String Object representing this LanguageCode's value
+	 *
+	 * @return return a string representation of the value of this LanguageCode
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mLanguageCode;
+	}
+
+	/**
+	 * Returns a LanguageCode instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a LanguageCode instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid LanguageCode
+	 */
+	public static LanguageCode valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new LanguageCode(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype languageCode} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype languageCode} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null || !languageCodePattern.matcher(stringValue).matches()) {
+			return true;
+		} else {
+			return W3CSchemaType.isValid("token", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Length.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Length.java
new file mode 100644
index 0000000..7625e39
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Length.java
@@ -0,0 +1,284 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype length}
+ */
+public class Length implements OdfDataType {
+
+	private static final Logger LOG = Logger.getLogger(Length.class.getName());
+
+	/** Measurement units for ODF datatype length
+	 */
+	public enum Unit {
+//		TWIP(0.0176389241667372, "twip"), // TWentieth of an Inch Point
+
+		POINT(0.352777778, "pt"), // Pica Point
+		PIXEL(0.28, "px"), // Pixel (see http://www.w3.org/TR/2001/REC-xsl-20011015/slice5.html#pixels)
+		//		DIDOT_POINT(0.375972222, "dpt"), // Didot point (or Point typographique) after the French typographer Firmin Didot (1764-1836).
+		MILLIMETER(1.0, "mm"), // see http://www.w3.org/TR/2001/REC-xsl-20011015/sliceD.html#ISO31
+		PICA(4.2176, "pc"), // 1 Inch = 6 Pica = 72 Pica Point
+		CENTIMETER(10.0, "cm"), // see http://www.w3.org/TR/2001/REC-xsl-20011015/sliceD.html#ISO31
+		INCH(25.399, "in");
+//		FEET(304.8, "ft"),
+//		METER(1000.0, "m"),
+//		KILOMETER(1000000.0, "km"),
+//		MILES(1609344.0, "mi");
+		private final double mUnitInMillimiter;
+		private final String mUnitAbbreviation;
+
+		Unit(double unitInMillimiter, String unitAbbreviation) {
+			this.mUnitInMillimiter = unitInMillimiter;
+			this.mUnitAbbreviation = unitAbbreviation;
+		}
+
+		/** 
+		 * @return the lenght of the Unit in Millimeter
+		 */
+		public double unitInMillimiter() {
+			return mUnitInMillimiter;
+		}
+
+		/** @return the abbreviation of the Unit (e.g. cm for Centimeter) */
+		public String abbr() {
+			return mUnitAbbreviation;
+		}
+	}
+	private String mLengthString = null;
+	private static final Pattern lengthPattern = Pattern.compile("^-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))$");
+	
+	/**
+	 * Construct Length by the parsing the given string
+	 *
+	 * @param length
+	 *            The String to be parsed into Length
+	 * @throws NumberFormatException if the given argument is not a valid Length
+	 */
+	public Length(String length) throws NumberFormatException {
+		if (!isValid(length)) {
+			throw new NumberFormatException("parameter is invalid for datatype Length");
+		}
+		mLengthString = length;
+	}
+
+	/**
+	 * Check if the specified String instance is a valid {@odf.datatype length} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype length} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!lengthPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	/**
+	 * Returns the Unit of the given length.
+	 * @param length the <code>Unit</code> should be obtained from
+	 * @return Returns a <code>Unit</code> object representing the specified Length unit.
+	 */
+	public static Unit parseUnit(String length) {
+		Unit lengthUnit = null;
+		if (length == null) {
+			throw new NumberFormatException("The input length should not be null!");
+		} else {
+			boolean identifiedInput = false;
+			for (Unit unit : Unit.values()) {
+				if (length.contains(unit.abbr())) {
+					lengthUnit = unit;
+					identifiedInput = true;
+					break;
+				}
+			}
+			if (!identifiedInput) {
+				throw new NumberFormatException("The input length " + length + " has no valid Unit!");
+			}
+		}
+		return lengthUnit;
+	}
+
+	/**
+	 * Returns the value of the given length as int.
+	 * @param length the <code>int</code> value should be obtained from
+	 * @return Returns a <code>int</code> value representing the specified Length value.
+	 */
+	public static int parseInt(String length) {
+		return (int) parseDouble(length, null);
+	}
+
+	/**
+	 * Returns the value of the given length as int.
+	 * @param length the <code>int</code> value should be obtained from
+	 * @param destinationUnit    The unit to be converted to
+	 * @return Returns a <code>int</code> value representing the specified Length value.
+	 */
+	public static int parseInt(String length, Unit destinationUnit) {
+		return (int) parseDouble(length, destinationUnit);
+	}
+
+	/**
+	 * Returns the value of the given length as long.
+	 * @param length the <code>long</code> value should be obtained from
+	 * @return Returns a <code>long</code> value representing the specified Length value.
+	 */
+	public static long parseLong(String length) {
+		return (long) parseDouble(length, null);
+	}
+
+	/**
+	 * Maps the a length string to a different unit
+	 *
+	 * @param length		     The value to be mapped
+	 * @param destinationUnit    The unit to be converted to
+	 * @return The converted value without unit suffix as Double
+	 */
+	public static long parseLong(String length, Unit destinationUnit) {
+		return (long) parseDouble(length, destinationUnit);
+	}
+
+	/**
+	 * Returns the value of the given length as double.
+	 * @param length the <code>double</code> value should be obtained from
+	 * @return Returns a <code>double</code> value representing the specified Length value.
+	 */
+	public static double parseDouble(String length) {
+		return parseDouble(length, null);
+	}
+
+
+	/**
+	 * Maps the a length string to a different unit
+	 *
+	 * @param length		     The value to be mapped
+	 * @param destinationUnit    The unit to be converted to
+	 * @return The converted value without unit suffix as double
+	 */
+	public static double parseDouble(String length, Unit destinationUnit) {
+		double newValue = 0;
+		if (length != null) {			
+			double roundingFactor = 10000.0;
+			boolean identifiedInput = false;
+
+			for (Unit unit : Unit.values()) {
+				if (length.contains(unit.abbr())) {
+					Double value = Double.valueOf(length.substring(0, length.indexOf(unit.abbr())));
+					// if no destination unit was given the unit remains the same
+					if (destinationUnit != null) {
+						// using roundfactor proved to be more precise when used with Java XSLT processor
+						newValue = Math.round(roundingFactor * value / destinationUnit.unitInMillimiter() * unit.mUnitInMillimiter) / roundingFactor;
+					}else{
+						destinationUnit = unit;
+					}
+					identifiedInput = true;
+					break;
+				}
+			}
+			if (!identifiedInput) {
+				LOG.warning("The unit " + length + " could not be transformed to " + destinationUnit.toString() + "!");
+			}
+		} else {
+			LOG.warning("The input length should not be null!");
+		}
+		return newValue;
+	}
+
+
+	/**
+	 * @param destinationUnit    The unit to be converted to
+	 * @return  The converted value as result
+	 */
+	public String mapToUnit(Unit destinationUnit) {
+		return mapToUnit(mLengthString, destinationUnit);
+	}
+
+	/**
+	 * Maps the a length string to a different unit
+	 *
+	 * @param length		     The value to be mapped
+	 * @param destinationUnit    The unit to be converted to
+	 * @return The converted value with unit suffix as String
+	 */
+	public static String mapToUnit(String length, Unit destinationUnit) {
+	    String newLength = null;
+		double newValue = 0;
+		if (length != null) {
+			double roundingFactor = 10000.0;
+			boolean identifiedInput = false;
+
+			for (Unit unit : Unit.values()) {
+				if (length.contains(unit.abbr())) {
+					Double value = Double.valueOf(length.substring(0, length.indexOf(unit.abbr())));
+					// if no destination unit was given the unit remains the same
+					if (destinationUnit != null) {
+						// using roundfactor proved to be more precise when used with Java XSLT processor
+						newValue = Math.round(roundingFactor * value / destinationUnit.unitInMillimiter() * unit.mUnitInMillimiter) / roundingFactor;
+					}else{
+						destinationUnit = unit;
+					}
+					newLength = String.valueOf(newValue) + destinationUnit.abbr();
+					identifiedInput = true;
+					break;
+				}
+			}
+			if (!identifiedInput) {
+				LOG.warning("The unit " + length + " could not be transformed to " + destinationUnit.toString() + "!");
+			}
+		} else {
+			LOG.warning("The input length should not be null!");
+		}
+		return newLength;
+	}
+
+
+
+	/**
+	 * Returns a Length instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Length instance representing stringValue
+	 * @throws NumberFormatException if the given argument is not a valid Length
+	 */
+	public static Length valueOf(String stringValue)
+			throws NumberFormatException {
+		return new Length(stringValue);
+	}
+
+	/**
+	 * Returns a String Object representing this Length's value
+	 *
+	 * @return return a string representation of the value of this Length object
+	 */
+	@Override
+	public String toString() {
+		return mLengthString;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NCName.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NCName.java
new file mode 100644
index 0000000..eb943da
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NCName.java
@@ -0,0 +1,88 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype NCName}
+ */
+public class NCName implements OdfDataType {
+
+	private String mName;
+
+	/**
+	 * Construct NCName by the parsing the given string
+	 *
+	 * @param name The String to be parsed into NCName
+	 *
+	 * @throws IllegalArgumentException if the given argument is not a valid NCName
+	 */
+	public NCName(String name) throws IllegalArgumentException {
+		if (name == null) {
+			throw new IllegalArgumentException("parameter can not be null for NCName");
+		}
+		// validate 'NCName' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#NCName
+		if (!W3CSchemaType.isValid("NCName", name)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype NCName");
+		}
+		mName = name;
+	}
+
+	/**
+	 * Returns a String Object representing this NCName value
+	 *
+	 * @return return a string representation of the value of this NCName object
+	 */
+	@Override
+	public String toString() {
+		return mName;
+	}
+
+	/**
+	 * Returns a NCName instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a NCName instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid NCName
+	 */
+	public static NCName valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new NCName(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype NCName} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype NCName} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return true;
+		} else {
+			return W3CSchemaType.isValid("NCName", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NamespacedToken.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NamespacedToken.java
new file mode 100644
index 0000000..b2e04d8
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NamespacedToken.java
@@ -0,0 +1,90 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype namespacedToken}
+ */
+public class NamespacedToken implements OdfDataType {
+
+	private String mNamespacedToken;
+	private static final Pattern namespacedTokenPattern = Pattern.compile("^[0-9a-zA-Z_]+:[0-9a-zA-Z._\\-]+$");
+	
+	/**
+	 * Construct NamespacedToken by the parsing the given string
+	 *
+	 * @param namespacedToken
+	 *            The String to be parsed into NamespacedToken
+	 * @throws IllegalArgumentException if the given argument is not a valid NamespacedToken
+	 */
+	public NamespacedToken(String namespacedToken) throws IllegalArgumentException {
+		if (!isValid(namespacedToken)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype NamespacedToken");
+		}
+		mNamespacedToken = namespacedToken;
+	}
+
+	/**
+	 * Returns a String Object representing this NamespacedToken's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         NamespacedToken object
+	 */
+	@Override
+	public String toString() {
+		return mNamespacedToken;
+	}
+
+	/**
+	 * Returns a NamespacedToken instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a NamespacedToken instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid NamespacedToken
+	 */
+	public static NamespacedToken valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new NamespacedToken(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype namespacedToken} data
+	 * type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype namespacedToken} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!namespacedTokenPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeDecimal.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeDecimal.java
new file mode 100644
index 0000000..9da45bc
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeDecimal.java
@@ -0,0 +1,95 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.odfdom.type;
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype nonNegativeDecimal}
+ */
+public class NonNegativeDecimal implements OdfDataType {
+	private double mN;
+
+	/**
+	 * Allocates a NonNegativeDecimal object representing the n argument
+	 * 
+	 * @param n
+	 *            the value of the NonNegativeDecimal
+	 * @throws IllegalArgumentException
+	 *             if the given argument is not a valid NonNegativeDecimal
+	 */
+	public NonNegativeDecimal(double n) throws IllegalArgumentException {
+		if (n < 0)
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype NonNegativeDecimal");
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this NonNegativeDecimal's value
+	 * 
+	 * @return return a string representation of the value of this
+	 *         NonNegativeDecimal object
+	 */
+	@Override
+	public String toString() {
+		return Double.toString(mN);
+	}
+
+	/**
+	 * Returns a NonNegativeDecimal instance representing the specified String
+	 * value
+	 * 
+	 * @param stringValue
+	 *            a String value
+	 * @return return a NonNegativeDecimal instance representing stringValue
+	 * @throws IllegalArgumentException
+	 *             if the given argument is not a valid NonNegativeDecimal
+	 */
+	public static NonNegativeDecimal valueOf(String stringValue)
+			throws IllegalArgumentException {
+		String aTmp = stringValue.trim();
+		double n = Double.valueOf(aTmp);
+		return new NonNegativeDecimal(n);
+	}
+
+	/**
+	 * Returns the value of this NonNegativeDecimal object as a double primitive
+	 * 
+	 * @return the primitive double value of this NonNegativeDecimal object.
+	 */
+	public double doubleValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Double instance is a valid {@odf.datatype nonNegativeDecimal} data
+	 * type
+	 * 
+	 * @param doubleValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype nonNegativeDecimal}
+	 *         data type false otherwise
+	 */
+	public static boolean isValid(Double doubleValue) {
+		if ((doubleValue != null) && (doubleValue.doubleValue() >= 0)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeInteger.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeInteger.java
new file mode 100644
index 0000000..794f404
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeInteger.java
@@ -0,0 +1,100 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype nonNegativeInteger}
+ */
+public class NonNegativeInteger implements OdfDataType {
+
+	private int mN;
+
+	/**
+	 * Allocates a NonNegativeInteger object representing the n argument
+	 *
+	 * @param n
+	 *            the value of the NonNegativeInteger
+	 * @throws NumberFormatException if the given argument is not a valid NonNegativeInteger
+	 */
+	public NonNegativeInteger(int n) throws NumberFormatException {
+		if (n < 0) {
+			throw new NumberFormatException("parameter is invalid for datatype NonNegativeInteger");
+		}
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this NonNegativeInteger's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         NonNegativeInteger object
+	 */
+	@Override
+	public String toString() {
+		return Integer.toString(mN);
+	}
+
+	/**
+	 * Returns a NonNegativeInteger instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a NonNegativeInteger instance representing stringValue
+	 * @throws NumberFormatException if the given argument is not a valid NonNegativeInteger
+	 */
+	public static NonNegativeInteger valueOf(String stringValue)
+			throws NumberFormatException {
+		String aTmp = stringValue.trim();
+		int n = Integer.valueOf(aTmp);
+		return new NonNegativeInteger(n);
+	}
+
+	/**
+	 * Returns the value of this NonNegativeInteger object as a int primitive
+	 *
+	 * @return the primitive int value of this NonNegativeInteger object.
+	 */
+	public int intValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Integer instance is a valid {@odf.datatype nonNegativeInteger}
+	 * data type
+	 *
+	 * @param integerValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype nonNegativeInteger}
+	 *         data type false otherwise
+	 */
+	public static boolean isValid(Integer integerValue) {
+		if (integerValue == null) {
+			return false;
+		}
+		if (integerValue.intValue() < 0) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeLength.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeLength.java
new file mode 100644
index 0000000..577e936
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativeLength.java
@@ -0,0 +1,78 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype nonNegativeLength}
+ */
+public class NonNegativeLength extends Length {
+
+
+	private static final Pattern nonNegativeLengthPattern = Pattern.compile("^?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))$");
+	/**
+	 * Construct NonNegativeLength by the parsing the given string
+	 *
+	 * @param length
+	 *            The String to be parsed into NonNegativeLength
+	 * @throws NumberFormatException if the given argument is not a valid NonNegativeLength
+	 */
+	public NonNegativeLength(String length) throws NumberFormatException {
+		super(length);
+		if (!isValid(length)){
+			throw new NumberFormatException(
+					"parameter is invalid for datatype NonNegativeLength");
+		}
+	}
+
+	/**
+	 * Returns a NonNegativeLength instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a NonNegativeLength instance representing stringValue
+	 * @throws NumberFormatException if the given argument is not a valid NonNegativeLength
+	 */
+	public static NonNegativeLength valueOf(String stringValue)
+			throws NumberFormatException {
+		return new NonNegativeLength(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype nonNegativeLength} data
+	 * type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype nonNegativeLength} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!nonNegativeLengthPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativePixelLength.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativePixelLength.java
new file mode 100644
index 0000000..7612de3
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/NonNegativePixelLength.java
@@ -0,0 +1,88 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype nonNegativePixelLength}
+ */
+public class NonNegativePixelLength extends Length {
+
+	private String mLength;
+	private static final Pattern pixelLengthPattern = Pattern.compile("^([0-9]+(\\.[0-9]*)?|\\.[0-9]+)(px)$");
+
+	/**
+	 * Construct NonNegativePixelLength by the parsing the given string
+	 *
+	 * @param pixelLength
+	 *            The String to be parsed into NonNegativePixelLength
+	 * @throws NumberFormatException if the given argument is not a valid NonNegativePixelLength
+	 */
+	public NonNegativePixelLength(String pixelLength) throws NumberFormatException {
+		super(pixelLength);
+		if (!isValid(pixelLength)) {
+			throw new NumberFormatException("parameter is invalid for datatype NonNegativePixelLength");
+		}
+	}
+
+	/**
+	 * Returns a String Object representing this NonNegativePixelLength's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         NonNegativePixelLength object
+	 */
+	@Override
+	public String toString() {
+		return mLength;
+	}
+
+	/**
+	 * Returns a NonNegativePixelLength instance representing the specified
+	 * String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a NonNegativePixelLength instance representing stringValue
+	 * @throws NumberFormatException if the given argument is not a valid NonNegativePixelLength
+	 */
+	public static NonNegativePixelLength valueOf(String stringValue)
+			throws NumberFormatException {
+		return new NonNegativePixelLength(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype nonNegativePixelLength}
+	 * data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype nonNegativePixelLength}
+	 *         data type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!pixelLengthPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/OdfDataType.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/OdfDataType.java
new file mode 100644
index 0000000..15a534f
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/OdfDataType.java
@@ -0,0 +1,30 @@
+/* 
+Licensed to the Apache 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.
+*/
+
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.odftoolkit.odfdom.type;
+
+/**
+ * An interface marking a data type to be used as an ODF datatype
+ */
+public interface OdfDataType {
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/OdfFieldDataType.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/OdfFieldDataType.java
new file mode 100644
index 0000000..acef160
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/OdfFieldDataType.java
@@ -0,0 +1,30 @@
+/* 
+Licensed to the Apache 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.
+*/
+
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.odftoolkit.odfdom.type;
+
+/**
+ * An interface marking a data type to be used in an ODF field
+ */
+public interface OdfFieldDataType extends OdfDataType {
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Percent.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Percent.java
new file mode 100644
index 0000000..108b1f4
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Percent.java
@@ -0,0 +1,118 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype percent}
+ */
+public class Percent implements OdfFieldDataType, OdfDataType {
+
+	private double mN;
+	private static final Pattern percentPattern = Pattern.compile("^-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)%$");
+	
+	/**
+	 * Allocates a Percent object representing the n argument
+	 *
+	 * @param n
+	 *            the value of the Percent
+	 * @throws IllegalArgumentException if the given argument is not a valid Percent
+	 */
+	public Percent(double n) throws IllegalArgumentException {
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this Percent's value
+	 *
+	 * @return return a string representation of the value of this Percent
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return Double.toString(mN * 100) + "%";
+	}
+
+	/**
+	 * Returns a Percent instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Percent instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Percent
+	 */
+	public static Percent valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if ((stringValue == null) || (stringValue.length() == 0)) {
+			return new Percent(0.0);
+		}
+
+		int n = stringValue.indexOf("%");
+		if (n != -1) {
+			return new Percent(Double.valueOf(stringValue.substring(0, n)).doubleValue() / 100);
+		} else {
+			throw new IllegalArgumentException("parameter is invalid for datatype Percent");
+		}
+	}
+
+	/**
+	 * Returns the value of this Percent object as a double primitive
+	 *
+	 * @return the primitive double value of this Percent object.
+	 */
+	public double doubleValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Double instance is a valid {@odf.datatype percent} data type
+	 *
+	 * @param doubleValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype percent} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(Double doubleValue) {
+		if (doubleValue == null) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+	
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype percent} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype percent} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!percentPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Point3D.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Point3D.java
new file mode 100644
index 0000000..527c328
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Point3D.java
@@ -0,0 +1,87 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype point3D}
+ */
+public class Point3D implements OdfDataType {
+
+	private String mPoint3D;
+	private static final Pattern point3DPattern = Pattern.compile("^\\([ ]*-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))([ ]+-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))){2}[ ]*\\)$");
+	
+
+	/**
+	 * Construct Point3D by the parsing the given string
+	 *
+	 * @param point3D
+	 *            The String to be parsed into Point3D
+	 * @throws IllegalArgumentException if the given argument is not a valid Point3D
+	 */
+	public Point3D(String point3D) throws IllegalArgumentException {
+		if (!isValid(point3D)) {
+			throw new IllegalArgumentException("parameter is invalid for datatype Point3D");
+		}
+		mPoint3D = point3D;
+	}
+
+	/**
+	 * Returns a String Object representing this Point3D's value
+	 *
+	 * @return return a string representation of the value of this Point3D
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mPoint3D;
+	}
+
+	/**
+	 * Returns a Point3D instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Point3D instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Point3D
+	 */
+	public static Point3D valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new Point3D(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype point3D} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype point3D} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!point3DPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Points.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Points.java
new file mode 100644
index 0000000..36e59fd
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Points.java
@@ -0,0 +1,85 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype points}
+ */
+public class Points implements OdfDataType {
+
+	private String mPoints;
+	private static final Pattern pointsPattern = Pattern.compile("^-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*$");
+	
+	/**
+	 * Construct Points by the parsing the given string
+	 *
+	 * @param points The String to be parsed into Points
+	 *
+	 * @throws IllegalArgumentException if the given argument is not a valid Pointes
+	 */
+	public Points(String points) throws IllegalArgumentException {
+		if (!isValid(points)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype Points");
+		}
+		mPoints = points;
+	}
+
+	/**
+	 * Returns a String Object representing this Points's value
+	 *
+	 * @return return a string representation of the value of this Points object
+	 */
+	@Override
+	public String toString() {
+		return mPoints;
+	}
+
+	/**
+	 * Returns a Points instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Points instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Pointes
+	 */
+	public static Points valueOf(String stringValue) throws IllegalArgumentException {
+		return new Points(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype points} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype points} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!pointsPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/PositiveInteger.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/PositiveInteger.java
new file mode 100644
index 0000000..08a38db
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/PositiveInteger.java
@@ -0,0 +1,101 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype positiveInteger}
+ */
+public class PositiveInteger implements OdfDataType {
+
+	int mN;
+
+	/**
+	 * Allocates a PositiveInteger object representing the n argument
+	 *
+	 * @param n
+	 *            the value of the PositiveInteger
+	 * @throws NumberFormatException if the given argument is not a valid PostitiveLength
+	 */
+	public PositiveInteger(int n) throws NumberFormatException {
+		if (n < 1) {
+			throw new NumberFormatException(
+					"parameter is invalid for datatype PositiveInteger");
+		}
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this PositiveInteger's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         PositiveInteger object
+	 */
+	@Override
+	public String toString() {
+		return Integer.toString(mN);
+	}
+
+	/**
+	 * Returns a PositiveInteger instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a PositiveInteger instance representing stringValue
+	 * @throws NumberFormatException if the given argument is not a valid PostitiveLength
+	 */
+	public static PositiveInteger valueOf(String stringValue)
+			throws NumberFormatException {
+		String aTmp = stringValue.trim();
+		int n = Integer.valueOf(aTmp);
+		return new PositiveInteger(n);
+	}
+
+	/**
+	 * Returns the value of this PositiveInteger object as a int primitive
+	 *
+	 * @return the primitive int value of this PositiveInteger object.
+	 */
+	public int intValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Integer instance is a valid {@odf.datatype positiveInteger} data
+	 * type
+	 *
+	 * @param integerValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype positiveInteger} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(Integer integerValue) {
+		if (integerValue == null) {
+			return false;
+		}
+		if (integerValue.intValue() < 1) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/PositiveLength.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/PositiveLength.java
new file mode 100644
index 0000000..fc6da11
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/PositiveLength.java
@@ -0,0 +1,76 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype positiveLength}
+ */
+public class PositiveLength extends Length {
+	private static final Pattern positiveLengthPattern = Pattern.compile("^([0-9]*[1-9][0-9]*(\\.[0-9]*)?|0+\\.[0-9]*[1-9][0-9]*|\\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px))$");
+	
+	/**
+	 * Construct PositiveLength by the parsing the given string
+	 *
+	 * @param length
+	 *            The String to be parsed into PositiveLength
+	 * @throws NumberFormatException if the given argument is not a valid PostitiveLength
+	 */
+	public PositiveLength(String length) throws NumberFormatException {
+		super(length);
+		if (!isValid(length)) {
+			throw new NumberFormatException(
+					"parameter is invalid for datatype PositiveLength");
+		}
+	}
+
+
+	/**
+	 * Returns a PositiveLength instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a PositiveLength instance representing stringValue
+	 * @throws NumberFormatException if the given argument is not a valid PostitiveLength
+	 */
+	public static PositiveLength valueOf(String stringValue)
+			throws NumberFormatException {
+		return new PositiveLength(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype positiveLength} data
+	 * type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype positiveLength} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!positiveLengthPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/RelativeLength.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/RelativeLength.java
new file mode 100644
index 0000000..fd307a9
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/RelativeLength.java
@@ -0,0 +1,89 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype relativeLength}
+ */
+public class RelativeLength implements OdfDataType {
+
+	private String mLength;
+	private static final Pattern relativeLengthPattern = Pattern.compile("^[0-9]+\\*$");
+	
+	/**
+	 * Construct RelativeLength by the parsing the given string
+	 *
+	 * @param length
+	 *            The String to be parsed into RelativeLength
+	 * @throws NumberFormatException if the given argument is not a valid RelativeLength
+	 */
+	public RelativeLength(String length) throws NumberFormatException {
+		if (!isValid(length)) {
+			throw new NumberFormatException(
+					"parameter is invalid for datatype RelativeLength");
+		}
+		mLength = length;
+	}
+
+	/**
+	 * Returns a String Object representing this RelativeLength's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         RelativeLength object
+	 */
+	@Override
+	public String toString() {
+		return mLength;
+	}
+
+	/**
+	 * Returns an RelativeLength instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return an RelativeLength instance representing stringValue
+	 */
+	public static RelativeLength valueOf(String stringValue)
+			throws NumberFormatException {
+		return new RelativeLength(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype relativeLength} data
+	 * type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype relativeLength} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!relativeLengthPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/SafeCURIE.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/SafeCURIE.java
new file mode 100644
index 0000000..4992acb
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/SafeCURIE.java
@@ -0,0 +1,86 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype SafeCURIE}
+ */
+public class SafeCURIE implements OdfDataType {
+
+	private String mCURIE;
+	private static final Pattern safeCURIEPattern = Pattern.compile("^\\[(([\\i-[:]][\\c-[:]]*)?:)?.+\\]$");
+	
+	/**
+	 * Construct SafeCURIE by the parsing the given string
+	 *
+	 * @param curie
+	 *            The String to be parsed into SafeCURIE
+	 * @throws IllegalArgumentException if the given argument is not a valid SafeCURIE
+	 */
+	public SafeCURIE(String curie) throws IllegalArgumentException {
+		if (!isValid(curie)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype SafeCURIE");
+		}
+		mCURIE = curie;
+	}
+
+	/**
+	 * Returns a String Object representing this SafeCURIE's value
+	 *
+	 * @return return a string representation of the value of this SafeCURIE
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mCURIE;
+	}
+
+	/**
+	 * Returns a SafeCURIE instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a SafeCURIE instance representing stringValue
+	 */
+	public static SafeCURIE valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new SafeCURIE(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype SafeCURIE} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype SafeCURIE} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!safeCURIEPattern.matcher(stringValue).matches() || stringValue.length() < 3)) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ScriptCode.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ScriptCode.java
new file mode 100644
index 0000000..8bd1c3d
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ScriptCode.java
@@ -0,0 +1,93 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype scriptCode}
+ */
+public class ScriptCode implements OdfDataType {
+
+    private String mScriptCode;
+    private static final Pattern scriptCodePattern = Pattern.compile("^[A-Za-z0-9]{1,8}$");
+	
+    /**
+     * Construct ScriptCode by the parsing the given string
+     *
+     * @param scriptCode
+     *            The String to be parsed into ScriptCode
+     * @throws IllegalArgumentException if the given argument is not a valid ScriptCode
+     */
+    public ScriptCode(String scriptCode) throws IllegalArgumentException {
+        if (!isValid(scriptCode)) {
+            throw new IllegalArgumentException(
+                    "parameter can not be null for ScriptCode");
+        }
+        // validate 'token' type which is defined in W3C schema
+        // http://www.w3.org/TR/xmlschema-2/#token
+        if (!W3CSchemaType.isValid("token", scriptCode)) {
+            throw new IllegalArgumentException(
+                    "parameter is invalid for datatype ScriptCode");
+        }
+        mScriptCode = scriptCode;
+    }
+
+    /**
+     * Returns a String Object representing this ScriptCode's value
+     *
+     * @return return a string representation of the value of this ScriptCode
+     *         object
+     */
+    @Override
+    public String toString() {
+        return mScriptCode;
+    }
+
+    /**
+     * Returns a ScriptCode instance representing the specified String value
+     *
+     * @param stringValue
+     *            a String value
+     * @return return a ScriptCode instance representing stringValue
+     * @throws IllegalArgumentException if the given argument is not a valid ScriptCode
+     */
+    public static ScriptCode valueOf(String stringValue)
+            throws IllegalArgumentException {
+        return new ScriptCode(stringValue);
+    }
+
+    /**
+     * check if the specified String instance is a valid {@odf.datatype scriptCode} data type
+     *
+     * @param stringValue
+     *            the value to be tested
+     * @return true if the value of argument is valid for {@odf.datatype scriptCode} data type
+     *         false otherwise
+     */
+    public static boolean isValid(String stringValue) {
+        if (stringValue == null || !scriptCodePattern.matcher(stringValue).matches()) {
+            return false;
+        } else {
+            return W3CSchemaType.isValid("token", stringValue);
+        }
+    }
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/SignedZeroToHundredPercent.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/SignedZeroToHundredPercent.java
new file mode 100644
index 0000000..639e66e
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/SignedZeroToHundredPercent.java
@@ -0,0 +1,117 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype signedZeroToHundredPercent}
+ */
+public class SignedZeroToHundredPercent implements OdfDataType{
+	private double mN;
+	private static final Pattern signedZeroToHundredPercentPattern = Pattern.compile("^-?([0-9]?[0-9](\\.[0-9]*)?|100(\\.0*)?|\\.[0-9]+)%$");
+	
+	/**
+	 * Allocates a SignedZeroToHundredPercent object representing the n argument
+	 *
+	 * @param n
+	 *            the value of the SignedZeroToHundredPercent
+	 * @throws IllegalArgumentException if the given argument is not a valid SignedZeroToHundredPercent
+	 */
+	public SignedZeroToHundredPercent(double n) throws IllegalArgumentException {
+		if( n > 1 || n < -1)
+			throw new IllegalArgumentException("parameter is invalid for datatype SignedZeroToHundredPercent");
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this SignedZeroToHundredPercent's value
+	 *
+	 * @return return a string representation of the value of this SignedZeroToHundredPercent
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return Double.toString(mN * 100) + "%";
+	}
+
+	/**
+	 * Returns a SignedZeroToHundredPercent instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a SignedZeroToHundredPercent instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid SignedZeroToHundredPercent
+	 */
+	public static SignedZeroToHundredPercent valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if ((stringValue == null) || (stringValue.length() == 0)) {
+			return new SignedZeroToHundredPercent(0.0);
+		}
+
+		int n = stringValue.indexOf("%");
+		if (n != -1) {
+			return new SignedZeroToHundredPercent(Double.valueOf(stringValue.substring(0, n)).doubleValue() / 100);
+		} else {
+			throw new IllegalArgumentException("parameter is invalid for datatype SignedZeroToHundredPercent");
+		}
+	}
+
+	/**
+	 * Returns the value of this SignedZeroToHundredPercent object as a double primitive
+	 *
+	 * @return the primitive double value of this SignedZeroToHundredPercent object.
+	 */
+	public double doubleValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Double instance is a valid {@odf.datatype signedZeroToHundredPercent} data type
+	 *
+	 * @param doubleValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype signedZeroToHundredPercent} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(Double doubleValue) {
+		if ( (doubleValue != null) && (doubleValue.doubleValue() <= 1) && 
+				(doubleValue.doubleValue() >= -1)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype 'signedZeroToHundredPercent'} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype 'signedZeroToHundredPercent'} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!signedZeroToHundredPercentPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleName.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleName.java
new file mode 100644
index 0000000..107bc11
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleName.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype styleName}
+ */
+public class StyleName implements OdfDataType {
+
+	private String mStyleName;
+
+	/**
+	 * Construct StyleName by the parsing the given string
+	 *
+	 * @param styleName The String to be parsed into StyleName
+	 * @throws IllegalArgumentException If the given StyleName is null or not valid.
+	 */
+	public StyleName(String styleName) throws IllegalArgumentException {
+		if (styleName == null) {
+			throw new IllegalArgumentException("A StyleName have to be set and can not be 'null'!");
+		}
+
+		// validate 'NCName' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#NCName
+		if (W3CSchemaType.isValid("NCName", styleName)) {
+			mStyleName = styleName;
+		} else {
+			throw new IllegalArgumentException("The given StyleName " + styleName + " is invalid!");
+		}
+	}
+
+	/**
+	 * Returns a String Object representing this StyleName's value
+	 *
+	 * @return a string representation of the value of this StyleName object
+	 */
+	@Override
+	public String toString() {
+		return mStyleName;
+	}
+
+	/**
+	 * Returns StyleName which is represented by the specified String value
+	 *
+	 * @param styleName a String value which can construct an StyleName
+	 * @return a String representation of an StyleName instance constructed by
+	 *         styleName
+	 * @throws IllegalArgumentException If the given StyleName is null or not valid.
+	 */
+	public static StyleName valueOf(String styleName) throws IllegalArgumentException {
+		return new StyleName(styleName);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype styleName} data type
+	 *
+	 * @param styleName
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype styleName} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String styleName) {
+		if (styleName == null) {
+			return false;
+		} else {
+			return W3CSchemaType.isValid("NCName", styleName);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleNameRef.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleNameRef.java
new file mode 100644
index 0000000..1e5e368
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleNameRef.java
@@ -0,0 +1,95 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype styleNameRef}
+ */
+public class StyleNameRef implements OdfDataType {
+
+	String mStyleNameRef;
+
+	/**
+	 * Construct StyleNameRef by the parsing the given string
+	 *
+	 * @param styleNameRef The String to be parsed into StyleNameRef
+	 * @throws IllegalArgumentException if the given argument is not a valid StyleNameRef
+	 */
+	public StyleNameRef(String styleNameRef) throws IllegalArgumentException {
+
+		if (styleNameRef == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for StyleNameRef");
+		}
+		if (styleNameRef.length() == 0) {
+			mStyleNameRef = styleNameRef;
+			return;
+		}
+		// validate 'NCName' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#NCName
+		if (!W3CSchemaType.isValid("NCName", styleNameRef)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype StyleNameRef");
+		}
+		mStyleNameRef = styleNameRef;
+	}
+
+	/**
+	 * Returns a String Object representing this StyleNameRef's value
+	 *
+	 * @return return a string representation of the value of this StyleNameRef
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mStyleNameRef;
+	}
+
+	/**
+	 * Returns a StyleNameRef instance representing the specified String value
+	 *
+	 * @param stringValue a String value which can construct an OdfStyleNameRef
+	 * @return a StyleNameRef instance representing stringValue
+	 * @throws IllegalArgumentException
+	 */
+	public static StyleNameRef valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new StyleNameRef(stringValue);
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype styleNameRef} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype styleNameRef} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		} else if (stringValue.length() == 0) {
+			return true;
+		} else {
+			return W3CSchemaType.isValid("NCName", stringValue);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleNameRefs.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleNameRefs.java
new file mode 100644
index 0000000..a4aadba
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/StyleNameRefs.java
@@ -0,0 +1,132 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype styleNameRefs}
+ */
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class StyleNameRefs implements OdfDataType {
+
+	private String mStyleNames;
+
+	/**
+	 * Construct StyleNameRefs by the parsing the given StyleName list
+	 *
+	 * @param styleNames The String to be parsed into StyleNameRefs
+	 *
+	 * @throws IllegalArgumentException if the given argument is not a valid StyleNameRefs
+	 */
+	public StyleNameRefs(List<StyleName> styleNames) throws IllegalArgumentException {
+		if (styleNames == null) {
+			throw new IllegalArgumentException("parameter can not be null for StyleNameRefs");
+		}
+		StringBuffer aRet = new StringBuffer();
+		Iterator<StyleName> aIter = styleNames.iterator();
+		while (aIter.hasNext()) {
+			if (aRet.length() > 0) {
+				aRet.append(' ');
+			}
+			String aStyleName = aIter.next().toString();
+			aRet.append(aStyleName);
+		}
+		mStyleNames = aRet.toString();
+	}
+
+	/**
+	 * Returns a String Object representing this StyleNameRefs's value
+	 *
+	 * @return return a string representation of the value of this StyleNameRefs
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mStyleNames;
+	}
+
+	/**
+	 * Returns a StyleNameRefs instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a StyleNameRefs instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid StyleNameRefs
+	 */
+	public static StyleNameRefs valueOf(String stringValue) throws IllegalArgumentException {
+		if (stringValue == null) {
+			throw new IllegalArgumentException("parameter is invalid for datatype StyleNameRefs");
+		}
+
+		List<StyleName> aRet = new ArrayList<StyleName>();
+		if (stringValue.length() > 0) {
+			String[] names = stringValue.split(" ");
+			for (int i = 0; i < names.length; i++) {
+				aRet.add(new StyleName(names[i]));
+			}
+		}
+		return new StyleNameRefs(aRet);
+	}
+
+	/**
+	 * Returns a list of StyleNameRef from the StyleNameRefs Object
+	 *
+	 * @return a list of StyleNameRef
+	 */
+	public List<StyleName> getStyleNameRefList() {
+		List<StyleName> aRet = new ArrayList<StyleName>();
+		if (mStyleNames.length() > 0) {
+			String[] names = mStyleNames.split(" ");
+			for (int i = 0; i < names.length; i++) {
+				aRet.add(new StyleName(names[i]));
+			}
+		}
+		return aRet;
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype styleNameRefs} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype styleNameRefs} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+		if (stringValue.length() == 0) {
+			return true;
+		}
+
+		String[] names = stringValue.split(" ");
+		for (int i = 0; i < names.length; i++) {
+			if (!StyleNameRef.isValid(names[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TargetFrameName.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TargetFrameName.java
new file mode 100644
index 0000000..e27cd01
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TargetFrameName.java
@@ -0,0 +1,92 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ *This class represents the in OpenDocument format used data type {@odf.datatype targetFrameName}
+ * 
+ */
+public enum TargetFrameName implements OdfDataType {
+
+	_SELF("_self"), _BLANK("_blank"), _PARENT("_parent"), _TOP("_top");
+	private String mValue;
+
+	TargetFrameName(String aValue) {
+		mValue = aValue;
+	}
+
+	/**
+	 *gets the name of this enum.
+	 *
+	 *@return return the name of TargetFrameNameType
+	 */
+	@Override
+	public String toString() {
+		return mValue;
+	}
+
+	/**
+	 *enum to String, gets the name of this enum constant as a string.
+	 *
+	 *@param aEnum
+	 *            the constant of TargetFrameName
+	 *@return return the name of TargetFrameName
+	 */
+	public static String toString(TargetFrameName aEnum) {
+		return aEnum.toString();
+	}
+
+	/**
+	 *String to enum, turns a String into its corresponding enum constant
+	 *
+	 *@param stringValue
+	 *            the name of OdfTargetFrameNameType
+	 *@return return the constant of OdfTargetFrameNameType
+	 */
+	public static TargetFrameName enumValueOf(String stringValue) {
+		for (TargetFrameName aIter : values()) {
+			if (stringValue.equals(aIter.toString())) {
+				return aIter;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype targetFrameName} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype targetFrameName} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+
+		if (TargetFrameName.enumValueOf(stringValue) != null) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TextEncoding.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TextEncoding.java
new file mode 100644
index 0000000..f59a293
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TextEncoding.java
@@ -0,0 +1,87 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype textEncoding}
+ */
+public class TextEncoding implements OdfDataType {
+
+	private String mTextEncoding;
+	private static final Pattern textEncodingPattern = Pattern.compile("^[A-Za-z][A-Za-z0-9._\\-]*$");
+	
+	/**
+	 * Construct TextEncoding by the parsing the given string
+	 *
+	 * @param textEncoding
+	 *            The String to be parsed into TextEncoding
+	 * @throws IllegalArgumentException if the given argument is not a valid TextEncoding
+	 */
+	public TextEncoding(String textEncoding) throws IllegalArgumentException {
+		if (!isValid(textEncoding)) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype TextEncoding");
+		}
+		mTextEncoding = textEncoding;
+	}
+
+	/**
+	 * Returns a String Object representing this TextEncoding's value
+	 *
+	 * @return return a string representation of the value of this TextEncoding
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mTextEncoding;
+	}
+
+	/**
+	 * Returns a TextEncoding instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a TextEncoding instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid TextEncoding
+	 */
+	public static TextEncoding valueOf(String stringValue)
+			throws IllegalArgumentException {
+		return new TextEncoding(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype textEncoding} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype textEncoding} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!textEncodingPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Time.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Time.java
new file mode 100644
index 0000000..89dd18c
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Time.java
@@ -0,0 +1,114 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype time}
+ */
+public class Time implements OdfDataType {
+
+	private XMLGregorianCalendar mTime;
+
+	/**
+	 * Construct an newly Time object that represents the specified
+	 * XMLGregorianCalendar value
+	 *
+	 * @param time
+	 *            the value to be represented by the Time Object
+	 * @throws IllegalArgumentException if the given argument is not a valid Time
+	 */
+	public Time(XMLGregorianCalendar time) throws IllegalArgumentException {
+		if (time == null) {
+			throw new IllegalArgumentException(
+					"parameter can not be null for Time");
+		}
+
+		// validate 'time' type which is defined in W3C schema
+		// http://www.w3.org/TR/xmlschema-2/#time
+		if (!W3CSchemaType.isValid("time", time.toXMLFormat())) {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype Time");
+		}
+		mTime = time;
+	}
+
+	/**
+	 * Returns a String Object representing this Time value
+	 *
+	 * @return return a string representation of the value of this Time object
+	 */
+	@Override
+	public String toString() {
+		return mTime.toXMLFormat();
+	}
+
+	/**
+	 * Returns a Time instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Time instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid Time
+	 */
+	public static Time valueOf(String stringValue) throws IllegalArgumentException {
+		try {
+			DatatypeFactory aFactory = new org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl();
+			return new Time(aFactory.newXMLGregorianCalendar(stringValue));
+		} catch (IllegalArgumentException ex) {
+			Logger.getLogger(Time.class.getName()).log(Level.SEVERE,
+					"parameter is invalid for datatype Time", ex);
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype Time");
+		}
+	}
+
+	/**
+	 * Returns the value of this Time object as an XMLGregorianCalendar
+	 *
+	 * @return the XMLGregorianCalendar value of this Time object.
+	 */
+	public XMLGregorianCalendar getXMLGregorianCalendar() {
+		return mTime;
+	}
+
+	/**
+	 * check if the specified XMLGregorianCalendar instance is a valid {@odf.datatype time} data
+	 * type
+	 *
+	 * @param time
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype time} data type false
+	 *         otherwise
+	 */
+	public static boolean isValid(XMLGregorianCalendar time) {
+		if (time == null) {
+			return false;
+		} else {
+			return W3CSchemaType.isValid("time", time.toXMLFormat());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TimeOrDateTime.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TimeOrDateTime.java
new file mode 100644
index 0000000..abd77e1
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/TimeOrDateTime.java
@@ -0,0 +1,109 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype timeOrDateTime}
+ */
+public class TimeOrDateTime implements OdfDataType {
+
+	private XMLGregorianCalendar mTimeOrDateTime;
+
+	/**
+	 * Construct an newly TimeOrDateTime object that represents the specified
+	 * XMLGregorianCalendar value
+	 *
+	 * @param timeOrDateTime
+	 *            the value to be represented by the TimeOrDateTime Object
+	 * @throws IllegalArgumentException if the given argument is not a valid TimeOrDateTime
+	 *
+	 */
+	public TimeOrDateTime(XMLGregorianCalendar timeOrDateTime)
+			throws IllegalArgumentException {
+		if (TimeOrDateTime.isValid(timeOrDateTime)) {
+			mTimeOrDateTime = timeOrDateTime;
+		} else {
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype TimeorDateTime");
+		}
+	}
+
+	/**
+	 * Returns a String Object representing this TimeOrDateTime value
+	 *
+	 * @return return a string representation of the value of this
+	 *         TimeOrDateTime object
+	 */
+	@Override
+	public String toString() {
+		return mTimeOrDateTime.toXMLFormat();
+	}
+
+	/**
+	 * Returns a TimeOrDateTime instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a TimeOrDateTime instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid TimeOrDateTime
+	 */
+	public static TimeOrDateTime valueOf(String stringValue)
+			throws IllegalArgumentException {
+		try {
+			DatatypeFactory aFactory = new org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl();
+			return new TimeOrDateTime(aFactory.newXMLGregorianCalendar(stringValue));
+		} catch (IllegalArgumentException ex) {
+			Logger.getLogger(TimeOrDateTime.class.getName()).log(Level.SEVERE,
+					"parameter is invalid for datatype TimeOrDateTime", ex);
+			throw new IllegalArgumentException(
+					"parameter is invalid for datatype TimeOrDateTime");
+		}
+	}
+
+	/**
+	 * Returns the value of this TimeOrDateTime object as an
+	 * XMLGregorianCalendar
+	 *
+	 * @return the XMLGregorianCalendar value of this TimeOrDateTime object.
+	 */
+	public XMLGregorianCalendar getXMLGregorianCalendar() {
+		return mTimeOrDateTime;
+	}
+
+	/**
+	 * check if the specified XMLGregorianCalendar instance is a valid
+	 * {@odf.datatype timeOrDateTime} data type
+	 *
+	 * @param timeOrDateTime
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype timeOrDateTime} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(XMLGregorianCalendar timeOrDateTime) {
+		return (Time.isValid(timeOrDateTime) || DateTime.isValid(timeOrDateTime));
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/URITransformer.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/URITransformer.java
new file mode 100644
index 0000000..72aeefa
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/URITransformer.java
@@ -0,0 +1,565 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.io.UnsupportedEncodingException;
+import java.util.BitSet;
+import java.io.ByteArrayOutputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Transformations for transporting URIs in URLs.
+ *
+ * <h4> URIs, URLs, and URNs </h4>
+ *
+ * A URI is a uniform resource <i>identifier</i> while a URL is a uniform
+ * resource <i>locator</i>.  Hence every URL is a URI, abstractly speaking, but
+ * not every URI is a URL.  This is because there is another subcategory of
+ * URIs, uniform resource <i>names</i> (URNs), which name resources but do not
+ * specify how to locate them.  The <tt>mailto</tt>, <tt>news</tt>, and
+ * <tt>isbn</tt> URIs shown above are examples of URNs.
+ *
+ *
+ * <h4>URI syntax and components</h4>
+ *
+ * At the highest level a URI reference (hereinafter simply "URI") in string
+ * form has the syntax
+ *
+ * <blockquote>
+ * [<i>scheme</i><tt><b>:</b></tt><i></i>]<i>scheme-specific-part</i>[<tt><b>#</b></tt><i>fragment</i>]
+ * </blockquote>
+ *
+ * where square brackets [...] delineate optional components and the characters
+ * <tt><b>:</b></tt> and <tt><b>#</b></tt> stand for themselves.
+ *
+ * <p> An <i>absolute</i> URI specifies a scheme; a URI that is not absolute is
+ * said to be <i>relative</i>.  URIs are also classified according to whether
+ * they are <i>opaque</i> or <i>hierarchical</i>.
+ *
+ * <p> An <i>opaque</i> URI is an absolute URI whose scheme-specific part does
+ * not begin with a slash character (<tt>'/'</tt>).  Opaque URIs are not
+ * subject to further parsing.  Some examples of opaque URIs are:
+ *
+ * <blockquote><table cellpadding=0 cellspacing=0>
+ * <tr><td><tt>mailto:java-net@java.sun.com</tt><td></tr>
+ * <tr><td><tt>news:comp.lang.java</tt><td></tr>
+ * <tr><td><tt>urn:isbn:096139210x</td></tr>
+ * </table></blockquote>
+ *
+ * <p> A <i>hierarchical</i> URI is either an absolute URI whose
+ * scheme-specific part begins with a slash character, or a relative URI, that
+ * is, a URI that does not specify a scheme.  Some examples of hierarchical
+ * URIs are:
+ *
+ * <blockquote>
+ * <tt>http://java.sun.com/j2se/1.3/</tt><br>
+ * <tt>docs/guide/collections/designfaq.html#28</tt></br>
+ * <tt>../../../demo/jfc/SwingSet2/src/SwingSet2.java</tt></br>
+ * <tt>file:///~/calendar</tt>
+ * </blockquote>
+ *
+ * <p> A hierarchical URI is subject to further parsing according to the syntax
+ *
+ * <blockquote>
+ * [<i>scheme</i><tt><b>:</b></tt>][<tt><b>//</b></tt><i>authority</i>][<i>path</i>][<tt><b>?</b></tt><i>query</i>][<tt><b>#</b></tt><i>fragment</i>]
+ * </blockquote>
+ *
+ * where the characters <tt><b>:</b></tt>, <tt><b>/</b></tt>,
+ * <tt><b>?</b></tt>, and <tt><b>#</b></tt> stand for themselves.  The
+ * scheme-specific part of a hierarchical URI consists of the characters
+ * between the scheme and fragment components.
+ *
+ * <p> The authority component of a hierarchical URI is, if specified, either
+ * <i>server-based</i> or <i>registry-based</i>.  A server-based authority
+ * parses according to the familiar syntax
+ *
+ * <blockquote>
+ * [<i>user-info</i><tt><b>@</b></tt>]<i>host</i>[<tt><b>:</b></tt><i>port</i>]
+ * </blockquote>
+ *
+ * where the characters <tt><b>@</b></tt> and <tt><b>:</b></tt> stand for
+ * themselves.  Nearly all URI schemes currently in use are server-based.  An
+ * authority component that does not parse in this way is considered to be
+ * registry-based.
+ *
+ * <p> The path component of a hierarchical URI is itself said to be absolute
+ * if it begins with a slash character (<tt>'/'</tt>); otherwise it is
+ * relative.  The path of a hierarchical URI that is either absolute or
+ * specifies an authority is always absolute.
+ *
+ * <p> All told, then, a URI instance has the following nine components:
+ *
+ * <blockquote><table>
+ * <tr><td><i>Component</i></td><td><i>Type</i></td></tr>
+ * <tr><td>scheme</td><td><tt>String</tt></td></tr>
+ * <tr><td>scheme-specific-part&nbsp;&nbsp;&nbsp;&nbsp;</td><td><tt>String</tt></td></tr>
+ * <tr><td>authority</td><td><tt>String</tt></td></tr>
+ * <tr><td>user-info</td><td><tt>String</tt></td></tr>
+ * <tr><td>host</td><td><tt>String</tt></td></tr>
+ * <tr><td>port</td><td><tt>int</tt></td></tr>
+ * <tr><td>path</td><td><tt>String</tt></td></tr>
+ * <tr><td>query</td><td><tt>String</tt></td></tr>
+ * <tr><td>fragment</td><td><tt>String</tt></td></tr>
+ * </table></blockquote>
+ *
+ * In a given instance any particular component is either <i>undefined</i> or
+ * <i>defined</i> with a distinct value.  Undefined string components are
+ * represented by <tt>null</tt>, while undefined integer components are
+ * represented by <tt>-1</tt>.  A string component may be defined to have the
+ * empty string as its value; this is not equivalent to that component being
+ * undefined.
+ *
+ * <p> Whether a particular component is or is not defined in an instance
+ * depends upon the type of the URI being represented.  An absolute URI has a
+ * scheme component.  An opaque URI has a scheme, a scheme-specific part, and
+ * possibly a fragment, but has no other components.  A hierarchical URI always
+ * has a path (though it may be empty) and a scheme-specific-part (which at
+ * least contains the path), and may have any of the other components.  If the
+ * authority component is present and is server-based then the host component
+ * will be defined and the user-information and port components may be defined.
+ * 
+ * See <a href="http://www.isi.edu/in-notes/rfc2396.txt""><i>RFC&nbsp;2396:
+ * Uniform Resource Identifiers (URI): Generic Syntax</i></a>
+ *
+ */
+class URITransformer {
+
+	/**
+	 * Array containing the safe characters set for encoding.
+	 * <p>
+	 * Only the following characters are not encoded:<br>
+	 * A-Z a-z 0-9 : @ & $ - _ . + ! * ' ( ) ,
+	 * </p>
+	 */
+	protected static BitSet safeCharacters;
+
+	static {
+		safeCharacters = new BitSet(256);
+		int i;
+		for (i = 'a'; i <= 'z'; i++) {
+			safeCharacters.set(i);
+		}
+		for (i = 'A'; i <= 'Z'; i++) {
+			safeCharacters.set(i);
+		}
+		for (i = '0'; i <= '9'; i++) {
+			safeCharacters.set(i);
+		}
+		safeCharacters.set('=');
+		safeCharacters.set(':');
+		safeCharacters.set('@');
+		safeCharacters.set('&');
+		safeCharacters.set('$');
+		safeCharacters.set('-');
+		safeCharacters.set('_');
+		safeCharacters.set('.');
+		safeCharacters.set('+');
+		safeCharacters.set('!');
+		safeCharacters.set('*');
+		safeCharacters.set('\'');
+		safeCharacters.set('(');
+		safeCharacters.set(')');
+		safeCharacters.set(',');
+	}
+
+	/**
+	 * Encode path to be used as path component segments in URI.
+	 *
+	 * <p>Creates a String that can be used as a sequence of one or more
+	 * path components in an URI from a path that uses a slash
+	 * character as a path separator and where the segements do not use
+	 * any URI encoding rules.</p>
+	 *
+	 * <p>The <b>/</b> characters (delimiting the individual path_segments)
+	 * are left unchanged.</p>
+	 *
+	 * @param path A path that is not using URI encoding rules.
+	 * @return A path that is using URI encoding rules.
+	 *
+	 * @see #decodePath(String)
+	 */
+	public static String encodePath(String path) {
+		try {
+			StringBuilder pathc = new StringBuilder();
+			byte[] bytes = null;
+			bytes = path.getBytes("UTF-8");
+			for (int i = 0; i < bytes.length; i++) {
+				int v = bytes[i];
+				if (v < 0) {
+					v += 256;
+				}
+				if (v > 0 && v < 256 && safeCharacters.get(v)) {
+					pathc.append((char) v);
+				} else if ((char) v == '/') {
+					pathc.append((char) v);
+				} else {
+					pathc.append("%" + Integer.toHexString(v));
+				}
+			}
+			path = pathc.toString();
+		} catch (UnsupportedEncodingException ex) {
+			Logger.getLogger(URITransformer.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return path;
+	}
+
+	/**
+	 * Decode path component segments in URI.
+	 *
+	 * <p>Creates a path that uses a slash character as a path separator
+	 * and where the segments do not use any URI encoding
+	 * from a String that is used as a sequence of one or more
+	 * path components in an URI where the path segments do use
+	 * URI encoding rules.</p>
+	 *
+	 * <p>The <b>/</b> characters (delimiting the individual path_segments)
+	 * are left unchanged.</p>
+	 *
+	 * @param path A path that is using URI encoding rules.
+	 * @return A path that is not using URI encoding rules.
+	 *
+	 * @see #encodePath(String)
+	 *
+	 */
+	public static String decodePath(String path) {
+		String pathc = path;
+		StringBuilder uri = new StringBuilder();
+
+		int j = pathc.indexOf('%', 0);
+		int l = pathc.length();
+
+		ByteArrayOutputStream ba = new ByteArrayOutputStream();
+		byte[] b = {0};
+		while (j != -1) {
+			if (j + 3 <= l) {
+				try {
+					b = pathc.substring(0, j).getBytes("UTF-8");
+					ba.write(b, 0, b.length);
+				} catch (java.io.UnsupportedEncodingException e) {
+				}
+				String hex = pathc.substring(j + 1, j + 3);
+				try {
+					int n = Integer.parseInt(hex, 16);
+					ba.write(n);
+				} catch (NumberFormatException e) {
+					String tmp = "=" + hex;
+					try {
+						b = tmp.getBytes("UTF-8");
+					} catch (java.io.UnsupportedEncodingException e2) {
+					}
+					ba.write(b, 0, b.length);
+				}
+				pathc = pathc.substring(j + 3);
+				l = pathc.length();
+				j = pathc.indexOf('%', 0);
+			} else {
+				j = -1;
+			}
+		}
+		try {
+			uri.append(new String(ba.toByteArray(), "UTF-8"));
+		} catch (java.io.UnsupportedEncodingException e2) {
+		}
+
+		uri.append(pathc);
+
+		return uri.toString();
+	}
+
+	/**
+	 * Extract URI from a path.
+	 *
+	 * <p>Transforms a path that was created with the
+	 * {@link #uri2path(String)} method back to an URI.</p>
+	 *
+	 * <p>This method does try to cope with an erroneous
+	 * input parameter but the result returned in such a case is not
+	 * guaranteed to be a valid URI.</p>
+	 *
+	 * @param path the path that contains the URI information
+	 * @return a String representing a URI
+	 *
+	 * @see #uri2path(String)
+	 */
+	public static String path2uri(String path) {
+
+		if (path == null) {
+			return null;
+		}
+		StringBuilder uri = new StringBuilder();
+		String npath;
+		// ignore leading slash
+		if (path.startsWith("/")) {
+			npath = path.substring(1);
+		} else {
+			npath = path;
+		}
+
+		int l = npath.length();
+
+		int i = npath.indexOf('/');
+		if (i == -1) {
+			if (npath.equals("")) {
+				return npath;
+			}
+			return npath + "://";
+		}
+
+		String rpath = "";
+		boolean bauth = true;
+
+		if (i == 0) {
+			uri.append("/");
+		} else {
+
+			String scheme;
+			if (i == l) {
+				return npath + "://";
+			}
+			scheme = npath.substring(0, i) + ":";
+			if (i + 4 <= l) {
+				String hier = npath.substring(i + 1, i + 4);
+				if (hier.startsWith("==0/")) {
+					i += 5;
+				} else if (hier.startsWith("==0")) {
+					i += 4;
+				} else if (hier.startsWith("==1")) {
+					bauth = false;
+					scheme += "";
+					i += 3;
+				} else if (hier.startsWith("==2")) {
+					scheme += "//";
+					i += 3;
+					bauth = false;
+				} else {
+					scheme += "//";
+				}
+
+			}
+			uri.append(scheme);
+		}
+
+
+		int j = -1;
+		String auth = "";
+
+		if (bauth) {
+			if (rpath.equals("")) {
+				if (i + 1 <= l) {
+					j = npath.indexOf('/', i + 1);
+				}
+
+				if (j == -1) {
+					j = l;
+				} else {
+					rpath = npath.substring(j);
+				}
+				if (i + 1 <= l) {
+					auth = npath.substring(i + 1, j);
+				} else {
+					auth = "";
+				}
+			} else {
+				if (i + 1 <= l) {
+					rpath = rpath + npath.substring(i + 1);
+				} else {
+					rpath = "";
+				}
+			}
+
+			j = auth.indexOf('=', 0);
+			l = auth.length();
+
+			ByteArrayOutputStream ba = new ByteArrayOutputStream();
+			byte[] b = {0};
+			while (j != -1) {
+				if (j + 3 <= l) {
+					try {
+						b = auth.substring(0, j).getBytes("UTF-8");
+						ba.write(b, 0, b.length);
+					} catch (java.io.UnsupportedEncodingException e) {
+					}
+					String hex = auth.substring(j + 1, j + 3);
+					try {
+						int n = Integer.parseInt(hex, 16);
+						ba.write(n);
+					} catch (NumberFormatException e) {
+						String tmp = "=" + hex;
+						try {
+							b = tmp.getBytes("UTF-8");
+						} catch (java.io.UnsupportedEncodingException e2) {
+						}
+						ba.write(b, 0, b.length);
+					}
+					auth = auth.substring(j + 3);
+					l = auth.length();
+					j = auth.indexOf('=', 0);
+				} else {
+					j = -1;
+				}
+			}
+			try {
+				uri.append(new String(ba.toByteArray(), "UTF-8"));
+			} catch (java.io.UnsupportedEncodingException e2) {
+			}
+			uri.append(auth);
+
+		} else {
+			if (i + 1 <= l) {
+				rpath = npath.substring(i + 1); // empty authority
+			} else {
+				rpath = "";
+			}
+		}
+
+		uri.append(encodePath(rpath));
+
+		return uri.toString();
+	}
+
+	/**
+	 * Embed URI into path.
+	 *
+	 * <h4>Opaque URIs</h4>
+	 *
+	 * Opaque URIs are mapped to a <i>path</i> of the form
+	 * &lt;<b>/</b> <i>scheme</i> <b>/==0/</b> <i>opaque_part'</i>&gt;.</p>
+	 * </p>
+	 * <p>The mapping from <i>opaque_part</i> to <i>opaque_part'</i>
+	 * works as follows:(*)<p>
+	 *
+	 * <p>Octets from the set <b>A-Z a-z 0-9 : @ & $ - _ . + ! * ' ( ) ,</b>
+	 * are left unchanged.</p>
+	 *
+	 * <p>Other octest are replaced with <b>=</b> followed by two hex digits
+	 * that represent the octet's numerical value.</p>
+	 *
+	 * <h4>Hierarchical URIs without an <i>authority</i> component</h4>
+	 *
+	 * <p>Hierarchical URIs without an <i>authority</i> component
+	 * are mapped to a <i>path</i> of the form
+	 * &lt;<b>/</b> <i>scheme</i> <b>/==1</b> <i>abs_path</i>' [<b>?</b>
+	 * <i>query</i>]&gt;.</p>
+	 *
+	 * <p>If <i>abs_path</i> is empty, it is left unchanged.</p>
+	 *
+	 * <p>If <i>abs_path</i> is non-empty, it is decoded with
+	 * the {@link #decodePath(String)} method.</p>
+	 *
+	 * <p>A non-empty path_segment is left unchanged.</p>
+	 *
+	 * <h4>Hierarchical URIs with an <i>authority</i> component</h4>
+	 * <p>Hierarchical URIs with an <i>authority</i> component
+	 * <b>?</b> query]&gt; are mapped to a <i>path</i> of the
+	 * form &lt;<b>/</b> <i>scheme</i> <b>/</b> <i>authority'</i>
+	 * <i>abs_path'</i> [<b>?</b><i>query</i>]&gt;.</p>
+	 *
+	 * <p>If <i>authority</i> is empty, it is mapped to
+	 * <b>==2</b>. This eliminates
+	 * problems if the servlet container drops final slashes
+	 * from <i>paths</i> or cannot handle empty segments
+	 * within <i>paths.</i></p>
+	 *
+	 * <p>The mapping from <i>abs_path</i> to <i>abs_path'</i>
+	 * works as follows:</p>
+	 *
+	 * </p>
+	 * <p>If <i>authority</i> is non-empty, it is mapped as described
+	 * for the <i>opaque_part</i> above.</p>
+	 *
+	 * <p>The mapping from <i>abs_path</i> to <i>abs_path'</i>
+	 * works as follows:</p>
+	 *
+	 * <p>If <i>abs_path</i> is empty, it is left unchanged.</p>
+	 *
+	 * <p>If <i>abs_path</i> is non-empty, it is decoded with
+	 * the {@link #decodePath(String)} method.</p>
+	 *
+	 * @see #path2uri(String)
+	 */
+	public static String uri2path(String uri) {
+		if (uri == null) {
+			return null;
+		}
+		StringBuilder path = new StringBuilder();
+		int i = uri.indexOf(":");
+		if (i == -1) {
+			return uri;
+		}
+		int l = uri.length();
+
+		path.append(uri.substring(0, i)).append("/");
+
+		int sc = 0;
+		if ((i + 3 <= l) && uri.substring(i + 1, i + 3).equals("//")) {
+			i += 3;
+			sc = 2;
+		} else if ((i + 2 <= l) && uri.substring(i + 1, i + 2).equals("/")) {
+			i += 2;
+			sc = 1;
+		} else {
+			i++;
+		}
+
+		int j = uri.indexOf('/', i);
+		String ruri = "";
+		if (j == -1) {
+			j = l;
+			ruri = "";
+		} else {
+			ruri = uri.substring(j);
+		}
+		String auth = uri.substring(i, j);
+
+		if (sc == 2 && auth.length() == 0) {
+			path.append("==2");
+		} else if (sc == 1) {
+			path.append("==1/");
+		} else if (sc == 0) {
+			path.append("==0/");
+		}
+
+		byte[] bytes = null;
+		try {
+			bytes = auth.getBytes("UTF-8");
+		} catch (java.io.UnsupportedEncodingException e) {
+		}
+		for (i = 0; i < bytes.length; i++) {
+			int v = bytes[i];
+			if (v < 0) {
+				v += 256;
+			}
+			if (v > 0 && v < 256 && safeCharacters.get(v)) {
+				path.append((char) v);
+			} else {
+				path.append("=" + Integer.toHexString(v));
+			}
+		}
+
+		path.append(decodePath(ruri));
+		return path.toString();
+	}
+
+	private URITransformer() {
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/URIorSafeCURIE.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/URIorSafeCURIE.java
new file mode 100644
index 0000000..cf80107
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/URIorSafeCURIE.java
@@ -0,0 +1,178 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.net.URI;
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype URIorSafeCURIE}
+ *  This value type stores either an anyURI or a SafeCURIE
+ */
+public class URIorSafeCURIE implements OdfDataType {
+
+	private String mURIorSafeCURIE;
+	private Object mValue;
+	private static final Pattern uRIorSafeCURIEPattern = Pattern.compile("^\\[(([\\i-[:]][\\c-[:]]*)?:)?.+\\]$");
+	
+	/**
+	 * Construct URIorSafeCURIE without the initialized value
+	 */
+	public URIorSafeCURIE() {
+		mValue = null;
+	}
+
+	/**
+	 * Copy Construct URIorSafeCURIE with the same value of val
+	 *
+	 * @param val
+	 *            the copied URIorSafeCURIE object
+	 * @throws IllegalArgumentException if the given argument is not a valid URIorSaveCURIE
+	 */
+	public URIorSafeCURIE(URIorSafeCURIE val) {
+		if (val == null) {
+			throw new IllegalArgumentException("parameter can not be null for URIorSafeCURIE");
+		}
+
+		if (val.isSafeCURIE()) {
+			mURIorSafeCURIE = val.getSafeCURIE();
+		} else {
+			mURIorSafeCURIE = (new AnyURI(val.getAnyURI())).toString();
+		}
+	}
+
+	/**
+	 * set uri value for URIorSafeCURIE Object
+	 *
+	 * @param uri
+	 *            the anyURI value which is set to URIorSafeCURIE Object
+	 */
+	public void setAnyURI(URI uri) {
+		mValue = new AnyURI(uri);
+	}
+
+	/**
+	 * set String value for URIorSafeCURIE Object
+	 *
+	 * @param curie
+	 *            the SafeCURIE value which is set to URIorSafeCURIE Object
+	 */
+	public void setSafeCURIE(String curie) {
+		mValue = new SafeCURIE(curie);
+	}
+
+	/**
+	 * get the internal value type of URIorSafeCURIE Object
+	 *
+	 * @return true if the internal value type is anyURI false if the internal
+	 *         value type is SafeCURIE
+	 */
+	public boolean isSafeCURIE() {
+		return (mValue != null) && mValue instanceof SafeCURIE;
+	}
+
+	/**
+	 * get the anyURI value of this URIorSafeCURIE Object
+	 *
+	 * @return the anyURI value of this URIorSafeCURIE Object
+	 */
+	public URI getAnyURI() {
+		if (isSafeCURIE()) {
+			throw new IllegalArgumentException("I do not have a AnyURI value");
+		} else if (mValue != null) {
+			return ((AnyURI) mValue).getURI();
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * get the SafeCURIE value of this URIorSafeCURIE Object
+	 *
+	 * @return the SafeCURIE value of this URIorSafeCURIE Object
+	 */
+	public String getSafeCURIE() {
+		if (isSafeCURIE()) {
+			return ((SafeCURIE) mValue).toString();
+		} else {
+			throw new IllegalArgumentException(
+					"I do not have a SafeCURIE value");
+		}
+	}
+
+	/**
+	 * Returns a String Object representing this URIorSafeCURIE's value
+	 *
+	 * @return return a string representation of the value of this
+	 *         URIorSafeCURIE object
+	 */
+	@Override
+	public String toString() {
+		return mURIorSafeCURIE;
+	}
+
+	/**
+	 * Returns an URIorSafeCURIE instance representing the specified String
+	 * value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return an URIorSafeCURIE instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid URIorSaveCURIE
+	 */
+	public static URIorSafeCURIE valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if (stringValue == null) {
+			throw new IllegalArgumentException("parameter can not be null for URIorSafeCURIE");
+		}
+		URIorSafeCURIE aRet = new URIorSafeCURIE();
+		if ((uRIorSafeCURIEPattern.matcher(stringValue).matches()) && (stringValue.length() >= 3)) {
+			aRet.setSafeCURIE(stringValue);
+		} else {
+			AnyURI aAnyURI = AnyURI.valueOf(stringValue);
+			if (aAnyURI != null) {
+				aRet.setAnyURI(aAnyURI.getURI());
+			} else {
+				throw new IllegalArgumentException("parameter is invalid for datatype URIorSafeCURIE");
+			}
+		}
+		return aRet;
+	}
+
+	/**
+	 * check if the specified XMLGregorianCalendar {@odf.datatype URIorSafeCURIE} is a valid
+	 * URIorSafeCURIE data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype URIorSafeCURIE} data
+	 *         type false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (SafeCURIE.isValid(stringValue)) {
+			return true;
+		} else if (AnyURI.valueOf(stringValue) != null) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ValueType.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ValueType.java
new file mode 100644
index 0000000..3527278
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ValueType.java
@@ -0,0 +1,92 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype valueType}
+ * 
+ */
+public enum ValueType implements OdfDataType {
+
+	STRING("string"), TIME("time"), CURRENCY("currency"), FLOAT("float"), DATE(
+	"date"), BOOLEAN("boolean"), PERCENTAGE("percentage");
+	private String mValue;
+
+	ValueType(String aValue) {
+		mValue = aValue;
+	}
+
+	/**
+	 *gets the name of this enum.
+	 *
+	 *@return return the name of ValueType
+	 */
+	@Override
+	public String toString() {
+		return mValue;
+	}
+
+	/**
+	 *enum to String, gets the name of this enum constant as a string.
+	 *
+	 *@param aEnum  the constant of ValueType
+	 *@return return the name of ValueType
+	 */
+	public static String toString(ValueType aEnum) {
+		return aEnum.toString();
+	}
+
+	/**
+	 *String to enum, turns a String into its corresponding enum constant
+	 *
+	 *@param stringValue
+	 *            the name of ValueType
+	 *@return return the constant of ValueType
+	 */
+	public static ValueType enumValueOf(String stringValue) {
+		for (ValueType aIter : values()) {
+			if (stringValue.equals(aIter.toString())) {
+				return aIter;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * check if the specified String is a valid {@odf.datatype valueType} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype valueType} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if (stringValue == null) {
+			return false;
+		}
+
+		if (ValueType.enumValueOf(stringValue) != null) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Vector3D.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Vector3D.java
new file mode 100644
index 0000000..bf12575
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/Vector3D.java
@@ -0,0 +1,83 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype vector3D}
+ */
+public class Vector3D implements OdfDataType {
+
+	private String mVector3D;
+	private static final Pattern vector3DPattern = Pattern.compile("^\\([ ]*-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([ ]+-?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)){2}[ ]*\\)$");
+	
+	/**
+	 * Construct Vector3D by the parsing the given string
+	 *
+	 * @param vector3D
+	 *            The String to be parsed into Vector3D
+	 */
+	public Vector3D(String vector3D) {
+		if (!isValid(vector3D)) {
+			throw new IllegalArgumentException("parameter is invalid for datatype Vector3D");
+		}
+		mVector3D = vector3D;
+	}
+
+	/**
+	 * Returns a String Object representing this Vector3D's value
+	 *
+	 * @return return a string representation of the value of this Vector3D
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return mVector3D;
+	}
+
+	/**
+	 * Returns a Vector3D instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a Vector3D instance representing stringValue
+	 */
+	public static Vector3D valueOf(String stringValue) {
+		return new Vector3D(stringValue);
+	}
+
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype vector3D} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype vector3D} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!vector3DPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/W3CSchemaType.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/W3CSchemaType.java
new file mode 100644
index 0000000..cc6e3c6
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/W3CSchemaType.java
@@ -0,0 +1,57 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
+import org.apache.xerces.impl.dv.SchemaDVFactory;
+import org.apache.xerces.impl.dv.ValidatedInfo;
+import org.apache.xerces.impl.dv.XSSimpleType;
+import org.apache.xerces.impl.validation.ValidationState;
+
+/** This class validates string to be valid W3C schema data types.
+In general it takes advantage of already existing underlying parser functionality and encapsulates it */
+class W3CSchemaType {
+	// validate the content by the dataType which is defined in XML schema
+
+	static boolean isValid(String dataType, String content) {
+		boolean isValid = false;
+		try {
+			// SchemaDVFactory / Enumeration Dataype
+			XSSimpleType simpleType = SchemaDVFactory.getInstance().getBuiltInType(dataType);
+			if (simpleType != null) {
+				simpleType.validate(content, new ValidationState(), new ValidatedInfo());
+				isValid = true; //Xerces docu is a little weak, we assume it works this way
+			} else {
+				throw new IllegalArgumentException("Datatype " + dataType + " does not exist!");
+			}
+		} catch (InvalidDatatypeValueException e) {
+			isValid = false;
+			Logger.getLogger(W3CSchemaType.class.getName()).log(Level.FINE, content + "is not of datatype " + dataType + "!", e);
+		}
+		return isValid;
+	}
+
+	private W3CSchemaType() {
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ZeroToHundredPercent.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ZeroToHundredPercent.java
new file mode 100644
index 0000000..e264d59
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ZeroToHundredPercent.java
@@ -0,0 +1,117 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.odftoolkit.odfdom.type;
+
+import java.util.regex.Pattern;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype zeroToHundredPercent}
+ */
+public class ZeroToHundredPercent implements OdfDataType{
+	private double mN;
+	private static final Pattern zeroToHundredPercentPattern = Pattern.compile("^([0-9]?[0-9](\\.[0-9]*)?|100(\\.0*)?|\\.[0-9]+)%$");
+	
+	/**
+	 * Allocates a ZeroToHundredPercent object representing the n argument
+	 *
+	 * @param n
+	 *            the value of the ZeroToHundredPercent
+	 * @throws IllegalArgumentException if the given argument is not a valid ZeroToHundredPercent
+	 */
+	public ZeroToHundredPercent(double n) throws IllegalArgumentException {
+		if( n > 1 || n < 0)
+			throw new IllegalArgumentException("parameter is invalid for datatype ZeroToHundredPercent");
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this ZeroToHundredPercent's value
+	 *
+	 * @return return a string representation of the value of this ZeroToHundredPercent
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return Double.toString(mN * 100) + "%";
+	}
+
+	/**
+	 * Returns a ZeroToHundredPercent instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a ZeroToHundredPercent instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid ZeroToHundredPercent
+	 */
+	public static ZeroToHundredPercent valueOf(String stringValue)
+			throws IllegalArgumentException {
+		if ((stringValue == null) || (stringValue.length() == 0)) {
+			return new ZeroToHundredPercent(0.0);
+		}
+
+		int n = stringValue.indexOf("%");
+		if (n != -1) {
+			return new ZeroToHundredPercent(Double.valueOf(stringValue.substring(0, n)).doubleValue() / 100);
+		} else {
+			throw new IllegalArgumentException("parameter is invalid for datatype ZeroToHundredPercent");
+		}
+	}
+
+	/**
+	 * Returns the value of this ZeroToHundredPercent object as a double primitive
+	 *
+	 * @return the primitive double value of this ZeroToHundredPercent object.
+	 */
+	public double doubleValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Double instance is a valid {@odf.datatype zeroToHundredPercent} data type
+	 *
+	 * @param doubleValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype zeroToHundredPercent} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(Double doubleValue) {
+		if ( (doubleValue != null) && (doubleValue.doubleValue() <= 1) && 
+				(doubleValue.doubleValue() >= 0)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * check if the specified String instance is a valid {@odf.datatype zeroToHundredPercent} data type
+	 *
+	 * @param stringValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype zeroToHundredPercent} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(String stringValue) {
+		if ((stringValue == null) || (!zeroToHundredPercentPattern.matcher(stringValue).matches())) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ZeroToOneDecimal.java b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ZeroToOneDecimal.java
new file mode 100644
index 0000000..41272e2
--- /dev/null
+++ b/trunk/odfdom/src/main/java/org/odftoolkit/odfdom/type/ZeroToOneDecimal.java
@@ -0,0 +1,91 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.odftoolkit.odfdom.type;
+
+/**
+ * This class represents the in OpenDocument format used data type {@odf.datatype zeroToOneDecimal}
+ */
+public class ZeroToOneDecimal implements OdfDataType{
+	private double mN;
+	
+	/**
+	 * Allocates a ZeroToOneDecimal object representing the n argument
+	 *
+	 * @param n
+	 *            the value of the ZeroToOneDecimal
+	 * @throws IllegalArgumentException if the given argument is not a valid ZeroToOneDecimal
+	 */
+	public ZeroToOneDecimal(double n) throws IllegalArgumentException {
+		if( n > 1 || n < 0)
+			throw new IllegalArgumentException("parameter is invalid for datatype ZeroToOneDecimal");
+		mN = n;
+	}
+
+	/**
+	 * Returns a String Object representing this ZeroToOneDecimal's value
+	 *
+	 * @return return a string representation of the value of this ZeroToOneDecimal
+	 *         object
+	 */
+	@Override
+	public String toString() {
+		return Double.toString(mN);
+	}
+
+	/**
+	 * Returns a ZeroToOneDecimal instance representing the specified String value
+	 *
+	 * @param stringValue
+	 *            a String value
+	 * @return return a ZeroToOneDecimal instance representing stringValue
+	 * @throws IllegalArgumentException if the given argument is not a valid ZeroToOneDecimal
+	 */
+	public static ZeroToOneDecimal valueOf(String stringValue)
+			throws IllegalArgumentException {
+		String aTmp = stringValue.trim();
+		double n = Double.valueOf(aTmp);
+		return new ZeroToOneDecimal(n);
+	}
+
+	/**
+	 * Returns the value of this ZeroToOneDecimal object as a double primitive
+	 *
+	 * @return the primitive double value of this ZeroToOneDecimal object.
+	 */
+	public double doubleValue() {
+		return mN;
+	}
+
+	/**
+	 * check if the specified Double instance is a valid {@odf.datatype zeroToOneDecimal} data type
+	 *
+	 * @param doubleValue
+	 *            the value to be tested
+	 * @return true if the value of argument is valid for {@odf.datatype zeroToOneDecimal} data type
+	 *         false otherwise
+	 */
+	public static boolean isValid(Double doubleValue) {
+		if ( (doubleValue != null) && (doubleValue.doubleValue() <= 1) && 
+				(doubleValue.doubleValue() >= 0)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A0000009122A8E996.png b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A0000009122A8E996.png
new file mode 100644
index 0000000..d7b8534
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A0000009122A8E996.png
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A03132DB2D.png b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A03132DB2D.png
new file mode 100644
index 0000000..1b52f58
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A03132DB2D.png
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A052ACB0F4.png b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A052ACB0F4.png
new file mode 100644
index 0000000..a746b17
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A052ACB0F4.png
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A0BDF285E0.png b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A0BDF285E0.png
new file mode 100644
index 0000000..8726748
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/100000000000009A000000A0BDF285E0.png
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/100000000000011C0000004AA64D38BB.gif b/trunk/odfdom/src/main/javadoc/doc-files/100000000000011C0000004AA64D38BB.gif
new file mode 100644
index 0000000..338ec1f
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/100000000000011C0000004AA64D38BB.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000000000001D800000075C6C51876.png b/trunk/odfdom/src/main/javadoc/doc-files/10000000000001D800000075C6C51876.png
new file mode 100644
index 0000000..db98b35
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000000000001D800000075C6C51876.png
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/100002000000000A0000000ADDA84F49.gif b/trunk/odfdom/src/main/javadoc/doc-files/100002000000000A0000000ADDA84F49.gif
new file mode 100644
index 0000000..dc7c020
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/100002000000000A0000000ADDA84F49.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BD000000BD0362D7E7.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BD000000BD0362D7E7.gif
new file mode 100644
index 0000000..520b12e
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BD000000BD0362D7E7.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BD000000BDC014E7D1.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BD000000BDC014E7D1.gif
new file mode 100644
index 0000000..d89a33f
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BD000000BDC014E7D1.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE145B66A3.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE145B66A3.gif
new file mode 100644
index 0000000..c0712f3
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE145B66A3.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE25E7F573.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE25E7F573.gif
new file mode 100644
index 0000000..7155d81
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE25E7F573.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE348BB081.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE348BB081.gif
new file mode 100644
index 0000000..50ba350
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE348BB081.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE4F61FAAA.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE4F61FAAA.gif
new file mode 100644
index 0000000..1afb656
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE4F61FAAA.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE99314183.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE99314183.gif
new file mode 100644
index 0000000..744d026
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BE99314183.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEB3958805.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEB3958805.gif
new file mode 100644
index 0000000..48d53f3
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEB3958805.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEC7C6AB3C.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEC7C6AB3C.gif
new file mode 100644
index 0000000..f6be897
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEC7C6AB3C.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BED3754382.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BED3754382.gif
new file mode 100644
index 0000000..f51175f
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BED3754382.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEE615D9E6.gif b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEE615D9E6.gif
new file mode 100644
index 0000000..6ed8a9a
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/10000200000000BE000000BEE615D9E6.gif
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/800px-Table_fruits_diagramm.jpg b/trunk/odfdom/src/main/javadoc/doc-files/800px-Table_fruits_diagramm.jpg
new file mode 100644
index 0000000..cc5ee10
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/800px-Table_fruits_diagramm.jpg
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/FruitTable_code.jpg b/trunk/odfdom/src/main/javadoc/doc-files/FruitTable_code.jpg
new file mode 100644
index 0000000..a336dd1
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/FruitTable_code.jpg
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/ODFDOM-Layered-Model.png b/trunk/odfdom/src/main/javadoc/doc-files/ODFDOM-Layered-Model.png
new file mode 100644
index 0000000..c604de3
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/ODFDOM-Layered-Model.png
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/ODF_Package.jpg b/trunk/odfdom/src/main/javadoc/doc-files/ODF_Package.jpg
new file mode 100644
index 0000000..3ff19a7
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/ODF_Package.jpg
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/OpenDocument-v1.2-part1.html b/trunk/odfdom/src/main/javadoc/doc-files/OpenDocument-v1.2-part1.html
new file mode 100644
index 0000000..f2f9370
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/OpenDocument-v1.2-part1.html
@@ -0,0 +1,387 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html
+  PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><base href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html" /><title xml:lang="en-US">OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 1: OpenDocument Schema</title><meta name="DCTERMS.title" content="OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 1: OpenDocument Schema" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2003-02-05T12:39:40" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.contributor" content="Paul Knight"/><meta name="DCTERMS.modified" content="2011-06-09T14:00:54.45" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="Printed by &#34;Patrick Durusau&#34;[dc:publisher] on &#34;2010-05-10T17:30:54&#34;[dc:date] in &#34;en-US&#34;[dc:language]" xml:lang="en-US"/><meta name="DCTERMS.subject" content=", OASIS, OpenDocument, ODF" xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
+	@page {  }
+	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
+	td, th { vertical-align:top; font-size:12pt;}
+	h1, h2, h3, h4, h5, h6 { clear:both }
+	ol, ul { margin:0; padding:0;}
+	li { list-style: none; margin:0; padding:0;}
+	<!-- "li span.odfLiEnd" - IE 7 issue-->
+	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
+	span.footnodeNumber { padding-right:1em; }
+	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
+	* { margin:0;}
+	.Formula { font-size:12pt; writing-mode:lr-tb; vertical-align:top; }
+	.fr1 { font-size:12pt; text-align:center; vertical-align:top; writing-mode:lr-tb; }
+	.fr2 { font-size:12pt; text-align:right; vertical-align:top; writing-mode:lr-tb; margin-left:0.0783in; margin-right:0.0783in; margin-top:0.0783in; margin-bottom:0.0783in; padding:0in; border-style:none; }
+	.fr3 { font-size:12pt; text-align:right; vertical-align:top; writing-mode:lr-tb; margin-left:0.0783in; margin-right:0.0783in; margin-top:0.0783in; margin-bottom:0.0783in; }
+	.fr4 { font-size:12pt; text-align:left; vertical-align:top; writing-mode:lr-tb; }
+	.fr5 { font-size:12pt; text-align:center; vertical-align:top; writing-mode:lr-tb; }
+	.fr6 { font-size:12pt; vertical-align:top; writing-mode:lr-tb; margin-left:0in; margin-right:0in; margin-top:0in; margin-bottom:0in; padding:0in; border-style:none; }
+	.fr7 { font-size:12pt; vertical-align:middle; writing-mode:lr-tb; }
+	.gr1 { font-size:12pt; writing-mode:lr-tb; vertical-align:middle; }
+	.gr2 { font-size:12pt; writing-mode:lr-tb; vertical-align:middle; }
+	.Appendix_20_Heading_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1945in; padding-left:0in; padding-right:0in; padding-top:0.0835in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in;  border-bottom-style:none; }
+	.Appendix_20_Heading { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in; padding-top:0.1945in;  border-top-style:none; border-bottom-style:none; }
+	.Appendix_20_Heading_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.1945in; margin-left:0in; margin-right:0in; padding-bottom:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1945in;  border-top-style:none;}
+	.Appendix_20_Heading_20_1_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1945in; padding-left:0in; padding-right:0in; padding-top:0.0835in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in;  border-bottom-style:none; }
+	.Appendix_20_Heading_20_1 { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in; padding-top:0.1945in;  border-top-style:none; border-bottom-style:none; }
+	.Appendix_20_Heading_20_1_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.1945in; margin-left:0in; margin-right:0in; padding-bottom:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1945in;  border-top-style:none;}
+	.Appendix_20_Heading_20_2_borderStart { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Appendix_20_Heading_20_2 { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Appendix_20_Heading_20_2_borderEnd { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Appendix_20_Heading_20_3 { color:#000099; font-size:13pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; margin-top:0.1665in; text-indent:0in; font-family:Arial; writing-mode:page; }
+	.Attribute_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Attribute_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Attribute_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Attribute_20_Value_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Attribute_20_Value_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Attribute_20_Value_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Bibliography_20_1_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; background-color:transparent; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Bibliography_20_1 { font-size:10pt; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; background-color:transparent; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Bibliography_20_1_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; background-color:transparent; padding-top:0.0555in;  border-top-style:none;}
+	.Child_20_Element_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Child_20_Element_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Child_20_Element_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Code_borderStart { font-size:9pt; margin-top:0in; font-family:Courier New; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; background-color:#d9d9d9; padding-left:0in; padding-right:0in; padding-top:0.0417in; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; padding-bottom:0in;  border-bottom-style:none; }
+	.Code { font-size:9pt; font-family:Courier New; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; background-color:#d9d9d9; padding-left:0in; padding-right:0in; border-left-style:none; border-right-style:none; padding-bottom:0in; padding-top:0in;  border-top-style:none; border-bottom-style:none; }
+	.Code_borderEnd { font-size:9pt; margin-bottom:0in; font-family:Courier New; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; background-color:#d9d9d9; padding-left:0in; padding-right:0in; padding-bottom:0.0417in; border-left-style:none; border-right-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; padding-top:0in;  border-top-style:none;}
+	.Contents_20_1 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; }
+	.Contents_20_10 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:1.7689in; margin-right:0in; text-indent:0in; }
+	.Contents_20_2 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; margin-left:0.1665in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_3 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; margin-left:0.3335in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_4 { font-size:9pt; margin-bottom:0.0417in; margin-left:0.5in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Contents_20_5 { font-size:9pt; margin-bottom:0.0417in; margin-left:0.6665in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Contents_20_6 { font-size:9pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:0.8335in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_7 { font-size:10pt; margin-bottom:0.0835in; margin-top:0in; font-family:Arial; writing-mode:page; margin-left:1in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_8 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:1.3756in; margin-right:0in; text-indent:0in; }
+	.Contents_20_9 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:1.572in; margin-right:0in; text-indent:0in; }
+	.Contents_20_Heading { color:#000099; font-size:16pt; font-weight:bold; margin-bottom:0.0835in; margin-top:0.1665in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; }
+	.Contributor { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0in; margin-left:0.5in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Default_20_Value_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:transparent; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Default_20_Value { font-size:10pt; font-family:Arial; writing-mode:page; background-color:transparent; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Default_20_Value_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:transparent; padding-top:0.0555in;  border-top-style:none;}
+	.Example_borderStart { background-color:#e6e6e6; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; font-size:9pt; margin-left:0.3937in; margin-right:0in; margin-top:0in; padding-left:0in; padding-right:0in; padding-top:0.0417in; text-indent:0in; font-family:Courier New; writing-mode:page; padding:0.0193in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0in;  border-bottom-style:none; }
+	.Example { background-color:#e6e6e6; border-left-style:none; border-right-style:none; font-size:9pt; margin-left:0.3937in; margin-right:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Courier New; writing-mode:page; padding:0.0193in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0in; padding-top:0in;  border-top-style:none; border-bottom-style:none; }
+	.Example_borderEnd { background-color:#e6e6e6; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; border-left-style:none; border-right-style:none; font-size:9pt; margin-bottom:0in; margin-left:0.3937in; margin-right:0in; padding-bottom:0.0417in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Courier New; writing-mode:page; padding:0.0193in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0in;  border-top-style:none;}
+	.Example_20_Text_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:transparent; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Example_20_Text { font-size:10pt; font-family:Arial; writing-mode:page; background-color:transparent; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Example_20_Text_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:transparent; padding-top:0.0555in;  border-top-style:none;}
+	.Figure { font-size:10pt; font-style:italic; margin-bottom:0.0835in; margin-top:0.0835in; text-align:center ! important; font-family:Arial; writing-mode:page; }
+	.Heading_20_1_borderStart { color:#000099; font-size:18pt; font-weight:bold; margin-top:0.3335in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding-left:0in; padding-right:0in; padding-top:0.0835in; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Heading_20_1 { color:#000099; font-size:18pt; font-weight:bold; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding-left:0in; padding-right:0in; border-left-style:none; border-right-style:none; padding-bottom:0.0835in; padding-top:0.3335in;  border-top-style:none; border-bottom-style:none; }
+	.Heading_20_1_borderEnd { color:#000099; font-size:18pt; font-weight:bold; margin-bottom:0.0835in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding-left:0in; padding-right:0in; padding-bottom:0in; border-left-style:none; border-right-style:none; border-bottom-style:none; padding-top:0.3335in;  border-top-style:none;}
+	.Heading_20_2_borderStart { color:#000099; font-size:14pt; font-weight:bold; margin-top:0.1665in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding:0in; border-style:none; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Heading_20_2 { color:#000099; font-size:14pt; font-weight:bold; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding:0in; border-style:none; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Heading_20_2_borderEnd { color:#000099; font-size:14pt; font-weight:bold; margin-bottom:0.0835in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding:0in; border-style:none; padding-top:0.1665in;  border-top-style:none;}
+	.Heading_20_3 { color:#000099; font-size:13pt; font-weight:bold; margin-bottom:0.0835in; margin-top:0.1665in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; }
+	.Heading_20_4 { color:#000099; font-size:12pt; font-weight:bold; margin-bottom:0.0835in; margin-top:0.1665in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; }
+	.Note { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P1_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-top:0.1665in; padding-left:0in; padding-right:0in; padding-top:0.0138in; font-family:Arial; writing-mode:page; padding-bottom:0.25in;  border-bottom-style:none; }
+	.P1 { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-bottom:0.25in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.P1_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.25in; padding-bottom:0in; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.P10 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; }
+	.P11 { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0555in; margin-left:0.5in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P12 { color:#000000; font-size:10pt; font-weight:bold; margin-bottom:0.0555in; margin-left:0.5in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; letter-spacing:normal; font-style:normal; }
+	.P13 { color:#333399; font-size:12pt; font-weight:bold; margin-bottom:0in; margin-top:0.0835in; font-family:Arial; writing-mode:page; }
+	.P14 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P15 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P16 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P17 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P18 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P19 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P2_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-top:0.1665in; padding-left:0in; padding-right:0in; padding-top:0.0138in; font-family:Arial; writing-mode:page; padding-bottom:0.25in;  border-bottom-style:none; }
+	.P2 { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-bottom:0.25in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.P2_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.25in; padding-bottom:0in; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.P20 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; text-align:center ! important; }
+	.P21 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; text-align:left ! important; }
+	.P22 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; text-align:center ! important; font-style:italic; }
+	.P23 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; font-style:normal; }
+	.P24 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:0.0327in; margin-right:0in; text-indent:0in; }
+	.P25 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P26 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P27 { font-size:24pt; font-family:Thorndale; writing-mode:page; margin-left:0in; margin-right:0in; margin-top:0in; margin-bottom:0in; line-height:100%; text-align:center ! important; text-indent:0in; font-style:normal; text-shadow:none; text-decoration:none ! important; font-weight:normal; }
+	.P3 { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0547in; margin-left:0in; margin-right:0in; margin-top:0.0547in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P4 { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0555in; margin-left:0.7457in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P5 { color:#333399; font-size:10pt; font-weight:bold; margin-bottom:0in; margin-top:0.0835in; font-family:Arial; writing-mode:page; margin-left:0.7457in; margin-right:0in; text-indent:0.0008in; }
+	.P6_borderStart { background-color:transparent; font-size:10pt; margin-left:0in; margin-right:0in; margin-top:0.0555in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.P6 { background-color:transparent; font-size:10pt; margin-left:0in; margin-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.P6_borderEnd { background-color:transparent; font-size:10pt; margin-bottom:0.0555in; margin-left:0in; margin-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.0555in;  border-top-style:none;}
+	.P7 { font-size:9pt; margin-bottom:0.0417in; margin-left:0.5in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P8 { font-size:10pt; margin-bottom:0.0417in; margin-left:0.3335in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P9 { font-size:10pt; margin-bottom:0.0417in; margin-left:0.1665in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Parent_20_Element_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Parent_20_Element_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Parent_20_Element_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Standard { font-size:10pt; font-family:Arial; writing-mode:page; margin-top:0.0555in; margin-bottom:0.0555in; }
+	.Subtitle_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-top:0.1665in; padding-left:0in; padding-right:0in; padding-top:0.0138in; font-family:Arial; writing-mode:page; padding-bottom:0.25in;  border-bottom-style:none; }
+	.Subtitle { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-bottom:0.25in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Subtitle_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.25in; padding-bottom:0in; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Table { font-size:10pt; font-style:italic; margin-bottom:0.0835in; margin-top:0.0835in; text-align:center ! important; font-family:Arial; writing-mode:page; }
+	.Table_20_Contents { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.Table_20_Contents_20_Centered { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; text-align:center ! important; }
+	.Table_20_Heading { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; text-align:center ! important; font-style:italic; font-weight:bold; }
+	.Text_20_body { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.Title_borderStart { font-size:24pt; margin-top:0.1665in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; padding-top:0.0138in; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-weight:bold; padding-bottom:0.1665in;  border-bottom-style:none; }
+	.Title { font-size:24pt; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; border-left-style:none; border-right-style:none; color:#333399; font-weight:bold; padding-bottom:0.1665in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Title_borderEnd { font-size:24pt; margin-bottom:0.1665in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; padding-bottom:0in; border-left-style:none; border-right-style:none; border-bottom-style:none; color:#333399; font-weight:bold; padding-top:0.1665in;  border-top-style:none;}
+	.Title_20_page_20_info { font-size:10pt; margin-bottom:0in; margin-top:0.0835in; font-family:Arial; writing-mode:page; color:#333399; font-weight:bold; }
+	.Title_20_page_20_info_20_description { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0555in; margin-top:0in; font-family:Arial; writing-mode:page; margin-left:0.5in; margin-right:0in; text-indent:0.0008in; }
+	.Sect1 { background-color:transparent; }
+	.ChartClassExamples { width:6.0014in; float:none; }
+	.FormControlEventNames { width:6in; float:none; }
+	.NamespaceTable { width:6in; float:none; }
+	.NamespaceTable2 { width:6.0104in; margin-left:-0.0097in; margin-right:0.0007in; float:none; }
+	.RecommendedMIMETypes { width:6in; float:none; }
+	.RegisteredMIMETypes { width:6in; float:none; }
+	.SpecialUnicodeharacters { width:3.6771in; float:none; }
+	.Tabelle1 { width:5.984in; margin-left:0in; margin-right:0.0174in; float:none; }
+	.Table1 { width:6in; margin-top:0in; margin-bottom:0.0549in; float:none; }
+	.Table10 { width:6in; float:none; }
+	.Table11 { width:6in; float:none; }
+	.Table12 { width:6.0014in; float:none; }
+	.Table13 { width:6in; float:none; }
+	.Table14 { width:6in; float:none; }
+	.Table15 { width:6in; float:none; }
+	.Table16 { width:6in; float:none; }
+	.Table17 { width:4.7208in; margin-top:0in; margin-bottom:0.0514in; float:none; }
+	.Table18 { width:6in; float:none; }
+	.Table19 { width:6in; float:none; }
+	.Table2 { width:4.7208in; margin-top:0in; margin-bottom:0.0514in; float:none; }
+	.Table3 { width:4.9688in; float:none; }
+	.Table4 { width:6in; float:none; }
+	.Table5 { width:6in; float:none; }
+	.Table6 { width:6in; float:none; }
+	.Table7 { width:6in; float:none; }
+	.Table8 { width:6in; float:none; background-color:transparent; }
+	.Table9 { width:6in; float:none; }
+	.ChartClassExamples_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.ChartClassExamples_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.ChartClassExamples_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.ChartClassExamples_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.FormControlEventNames_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.FormControlEventNames_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.FormControlEventNames_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.FormControlEventNames_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable_A1 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable_A2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable_C1 { background-color:transparent; padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.NamespaceTable_C2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable2_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable2_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable2_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.NamespaceTable2_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.RecommendedMIMETypes_A1 { padding:0.0201in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.RecommendedMIMETypes_A2 { padding:0.0201in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.RecommendedMIMETypes_C1 { padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.RecommendedMIMETypes_C2 { padding:0.0201in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.RegisteredMIMETypes_A1 { padding:0.0201in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.RegisteredMIMETypes_A2 { padding:0.0201in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.RegisteredMIMETypes_C1 { padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.RegisteredMIMETypes_C2 { padding:0.0201in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.SpecialUnicodeharacters_A1 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.SpecialUnicodeharacters_A2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.SpecialUnicodeharacters_B1 { background-color:transparent; padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.SpecialUnicodeharacters_B2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Tabelle1_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Tabelle1_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Tabelle1_B1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Tabelle1_B2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table1_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table1_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table1_D1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table1_D2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table10_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table10_B1_1_1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table10_B1_1_2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table10_B1_5_2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table11_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table11_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table11_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table11_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table12_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table12_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table12_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table12_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table12_C4 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table12_C8 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table13_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table13_B1_1_1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table13_B1_1_2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table13_B1_5_2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table14_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table14_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table14_I1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table14_I2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table15_A1 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table15_A2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table15_C1 { background-color:transparent; padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table15_C2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table16_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table16_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table16_D1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table16_D2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table17_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table17_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table17_B1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table17_B2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table18_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table18_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table18_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table18_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table19_A1 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table19_A2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table19_C1 { background-color:transparent; padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table19_C2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table2_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table2_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table2_B1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table2_B2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table3_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table3_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table3_B1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table3_B2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table4_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table4_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table4_D1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table4_D2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table5_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table5_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table5_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table5_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table6_A1 { padding:0.0417in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table6_A2 { padding:0.0417in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table6_D1 { padding:0.0417in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table6_D2 { padding:0.0417in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table7_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table7_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table7_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table7_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table8_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table8_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table8_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table8_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table9_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table9_B1_1_1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table9_B1_1_2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table9_B1_5_2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.ChartClassExamples_A { width:2.0007in; }
+	.FormControlEventNames_A { width:1.8118in; }
+	.FormControlEventNames_B { width:1.2188in; }
+	.FormControlEventNames_C { width:2.9694in; }
+	.NamespaceTable_A { width:0.8632in; }
+	.NamespaceTable_B { width:2.4382in; }
+	.NamespaceTable_C { width:2.6986in; }
+	.NamespaceTable2_A { width:0.875in; }
+	.NamespaceTable2_B { width:2.4375in; }
+	.NamespaceTable2_C { width:2.6979in; }
+	.RecommendedMIMETypes_A { width:3.8632in; }
+	.RecommendedMIMETypes_B { width:0.3243in; }
+	.RecommendedMIMETypes_C { width:1.8125in; }
+	.RegisteredMIMETypes_A { width:3.8743in; }
+	.RegisteredMIMETypes_B { width:0.3236in; }
+	.RegisteredMIMETypes_C { width:1.8021in; }
+	.SpecialUnicodeharacters_A { width:2.2in; }
+	.SpecialUnicodeharacters_B { width:1.4771in; }
+	.Tabelle1_A { width:5.0535in; }
+	.Tabelle1_B { width:0.9306in; }
+	.Table1_A { width:0.7813in; }
+	.Table1_B { width:0.7063in; }
+	.Table1_C { width:1.5722in; }
+	.Table1_D { width:2.9403in; }
+	.Table10_A { width:1.2354in; }
+	.Table10_B { width:0.9535in; }
+	.Table10_F { width:0.9507in; }
+	.Table11_A { width:1.3785in; }
+	.Table11_B { width:2.0201in; }
+	.Table11_C { width:2.6014in; }
+	.Table12_A { width:2in; }
+	.Table12_B { width:2.0014in; }
+	.Table12_C { width:2in; }
+	.Table13_A { width:1.2604in; }
+	.Table13_B { width:0.9278in; }
+	.Table13_C { width:0.9528in; }
+	.Table13_F { width:0.9535in; }
+	.Table14_A { width:2.3313in; }
+	.Table14_B { width:0.4715in; }
+	.Table14_C { width:0.4035in; }
+	.Table14_I { width:0.4361in; }
+	.Table15_A { width:0.8632in; }
+	.Table15_B { width:2.4382in; }
+	.Table15_C { width:2.6986in; }
+	.Table16_A { width:1.2431in; }
+	.Table16_B { width:1.7361in; }
+	.Table16_C { width:1.7069in; }
+	.Table16_D { width:1.3139in; }
+	.Table17_A { width:0.709in; }
+	.Table17_B { width:4.0118in; }
+	.Table18_A { width:0.8646in; }
+	.Table18_B { width:2.4368in; }
+	.Table18_C { width:2.6986in; }
+	.Table19_A { width:0.8632in; }
+	.Table19_B { width:2.4382in; }
+	.Table19_C { width:2.6986in; }
+	.Table2_A { width:0.709in; }
+	.Table2_B { width:4.0118in; }
+	.Table3_A { width:0.7285in; }
+	.Table3_B { width:4.2403in; }
+	.Table4_A { width:1.2431in; }
+	.Table4_B { width:1.7361in; }
+	.Table4_C { width:1.7069in; }
+	.Table4_D { width:1.3139in; }
+	.Table5_A { width:0.8646in; }
+	.Table5_B { width:2.4368in; }
+	.Table5_C { width:2.6986in; }
+	.Table6_A { width:0.9174in; }
+	.Table6_B { width:1.759in; }
+	.Table6_C { width:2.1569in; }
+	.Table6_D { width:1.1667in; }
+	.Table7_A { width:1.8014in; }
+	.Table7_B { width:1.2188in; }
+	.Table7_C { width:2.9799in; }
+	.Table8_A { width:0.7799in; }
+	.Table8_B { width:0.6139in; }
+	.Table8_C { width:4.6063in; }
+	.Table9_A { width:1.2354in; }
+	.Table9_B { width:0.9535in; }
+	.Table9_F { width:0.9507in; }
+	.Alien_20_Attribute { font-family:Courier New; background-color:transparent; }
+	.Alien_20_Attribute_20_Value { font-family:Courier New; }
+	.Alien_20_Element { font-family:Courier New; background-color:transparent; }
+	.Attribute { font-family:Courier New; font-size:10pt; background-color:transparent; }
+	.Attribute_20_Value { font-family:Courier New; font-size:10pt; background-color:transparent; }
+	.Attribute_20_Value_20_Fragment { font-family:Courier New; background-color:transparent; }
+	.Attribute_20_Value_20_Instance { font-family:Courier New; }
+	.Attribute_20_Value_20_Param { background-color:transparent; font-size:10pt; font-family:Courier New; font-style:italic; }
+	.Datatype { font-family:Courier New; }
+	.Def { font-style:italic; background-color:transparent; }
+	.Element { font-family:Courier New; font-size:10pt; background-color:transparent; }
+	.Emphasis { font-style:italic; background-color:transparent; }
+	.Example { font-family:Courier New; font-weight:normal; }
+	.Example_20_Label { background-color:transparent; font-weight:bold; }
+	.Formula { font-style:italic; }
+	.Formula_20_Super { font-style:italic; vertical-align:super; font-size:58%;}
+	.Furmula_20_Sub { font-style:italic; vertical-align:sub; font-size:58%;}
+	.ISO_20_Keyword { background-color:transparent; }
+	.Keyword { background-color:transparent; font-size:10pt; font-family:Courier New; }
+	.Label { font-weight:bold; background-color:transparent; }
+	.Misc_20_Source { font-family:Courier New; background-color:transparent; }
+	.Note_20_Label { background-color:transparent; font-weight:bold; }
+	.OWL_20_Class { font-family:Courier New; }
+	.OWL_20_Property { font-family:Courier New; }
+	.Source_20_Text { font-family:Courier New; }
+	.Strong_20_Emphasis { font-weight:bold; background-color:transparent; }
+	.T1 { font-family:Courier New; font-size:10pt; }
+	.T2 { font-family:Arial; font-size:10pt; }
+	.T3 { font-style:italic; }
+	.T4 { font-style:normal; }
+	.T5 { font-weight:normal; }
+	.T6 { color:#000000; font-family:Arial; letter-spacing:normal; font-style:normal; font-weight:normal; }
+	.T7 { color:#000000; font-family:Arial; letter-spacing:normal; font-style:normal; font-weight:normal; }
+	.T8 { color:#000000; font-family:Arial; letter-spacing:normal; font-style:italic; font-weight:normal; }
+	.T9 { color:#0000ff; font-family:Arial; letter-spacing:normal; font-style:normal; text-decoration:none ! important; font-weight:normal; }
+	<!-- ODF styles with no properties representable as CSS -->
+	.Sect2 .SpecialUnicodeharacters.1 .Definition { }
+	</style></head><body dir="ltr" style="max-width:8.5in;margin-top:1in; margin-bottom:0.4925in; margin-left:1.2492in; margin-right:1.2492in; "><div class="P3"><!--Next 'div' is a draw:frame.--><div style="height:0.628in;width:2.4075in; padding:0; " class="fr4" id="OASISLogo"><img style="height:1.5951cm;width:6.1151cm;" alt="" src="./Pictures/100000000000011C0000004AA64D38BB.gif"/></div></div><p class="Title_borderStart">Open Document Format for Office Applications (OpenDocument) Version 1.2</p><p class="Subtitle">Part 1: OpenDocument Schema</p><p class="Subtitle">OASIS Standard</p><p class="Subtitle_borderEnd">29 September 2011</p><p class="P13">Specification URIs:</p><p class="Title_20_page_20_info">This version:</p><p class="Title_20_page_20_info_20_description"><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.odt">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.odt</a> (Authoritative)<br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.pdf">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.pdf</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html</a></p><p class="Title_20_page_20_info">Previous version:</p><p class="Title_20_page_20_info_20_description"><a href="http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part1.odt">http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part1.odt</a>       (Authoritative)<br/><a href="http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part1.pdf">http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part1.pdf</a><br/><a href="http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part1.html">http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part1.html</a></p><p class="Title_20_page_20_info">Latest version:</p><p class="Title_20_page_20_info_20_description"><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.odt">http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.odt</a> (Authoritative)<a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html"><br/></a><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.pdf">http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.pdf</a><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html"><br/></a><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html">http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html</a></p><p class="Title_20_page_20_info">Technical Committee:</p><p class="Title_20_page_20_info_20_description"><a href="http://www.oasis-open.org/committees/office/">OASIS Open Document Format for Office Applications (OpenDocument) TC</a></p><p class="Title_20_page_20_info">Chairs:</p><p class="Title_20_page_20_info_20_description"><a href="mailto:robert_weir@us.ibm.com">Rob Weir</a>, <a href="http://www.ibm.com/">IBM</a><br/><a href="mailto:michael.brauer@oracle.com">Michael Brauer</a>, <a href="http://www.oracle.com/">Oracle Corporation</a></p><p class="Title_20_page_20_info">Editors:</p><p class="Contributor"><a href="mailto:patrick@durusau.net">Patrick Durusau</a> </p><p class="Contributor"><a href="mailto:michael.brauer@oracle.com">Michael Brauer</a>, <a href="http://www.oracle.com/">Oracle Corporation</a></p><p class="Title_20_page_20_info"><a id="Related_Work"/>Related work:</p><p class="Title_20_page_20_info_20_description">This document is part of the <a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.odt">OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 </a>specification.</p><p class="Title_20_page_20_info_20_description">The OpenDocument v1.2 specification has these parts:</p><p class="P4"><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.odt">OpenDocument v1.2 part 1: OpenDocument Schema (this part)</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.odt">OpenDocument v1.2 part 2: Recalculated Formula (OpenFormula) Format</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.odt">OpenDocument v1.2 part 3: Packages</a></p><p class="Title_20_page_20_info_20_description">OpenDocument v1.2 part 1 defines these schemas and ontologies:</p><p class="P5"><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-schema.rng"><span class="T5">OpenDocument v1.2 Relax NG Schema</span></a><span class="T5"><br/></span><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-metadata.owl"><span class="T5">OpenDocument v1.2 Metadata Manifest Ontology</span></a></p><p class="Title_20_page_20_info">Declared XML namespaces:</p><p class="Title_20_page_20_info_20_description">urn:oasis:names:tc:opendocument:xmlns:animation:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:chart:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:config:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:database:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:drawing:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:form:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:manifest:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:meta:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:data style:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:office:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:presentation:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:script:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:table:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:text:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:style:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:of:1.2<br/><a href="http://docs.oasis-open.org/ns/office/1.2/meta/odf#">http://docs.oasis-open.org/ns/office/1.2/meta/odf#</a></p><p class="Title_20_page_20_info">Abstract:</p><p class="Title_20_page_20_info_20_description">This document is part of the Open Document Format for Office Applications (OpenDocument) Version 1.2 specification.</p><p class="Title_20_page_20_info_20_description">It defines an XML schema for office applications and its semantics. The schema is suitable for office documents, including text documents, spreadsheets, charts and graphical documents like drawings or presentations, but is not restricted to these kinds of documents.</p><p class="Title_20_page_20_info">Status:</p><p class="P11">This document was last revised or approved by the OASIS Open Document Format for Office Applications (OpenDocument) TC on the above date. The level of approval is also listed above. Check the "Latest version" location noted above for possible later revisions of this document.</p><p class="Title_20_page_20_info_20_description"><span class="T6">Technical Committee members should send comments on this specification to the Technical Committee’s email list. Others should send comments to the Technical Committee by using the “</span><a href="http://www.oasis-open.org/committees/comments/form.php?wg_abbrev=office"><span class="T9">Send A Comment</span></a><span class="T6">” button on the Technical Committee’s web page at </span><a href="http://www.oasis-open.org/committees/office/"><span class="T9">http://www.oasis-open.org/committees/office/</span></a><span class="T6">.</span></p><p class="Title_20_page_20_info_20_description"><span class="T6">For information on whether any patents have been disclosed that may be essential to implementing this specification, and any offers of patent licensing terms, please refer to </span><span class="T6">the Intellectual Property Rights section of the Technical Committee web page (</span><a href="http://www.oasis-open.org/committees/office/ipr.php"><span class="T9">http://www.oasis-open.org/committees/office/ipr.php</span></a><span class="T6">).</span></p><p class="Title_20_page_20_info">Citation format:</p><p class="Title_20_page_20_info_20_description">When referencing this specification the following citation format should be used:</p><p class="P12">OpenDocument-v1.2-part1</p><p class="Title_20_page_20_info_20_description"><span class="T8">Open Document Format for Office Applications (</span><span class="T8">OpenDocument</span><span class="T8">) Version </span><span class="T8">1.2</span><span class="T8"/><span class="T8"> Part </span><span class="T8">1</span><span class="T8">: </span><span class="T8">OpenDocument</span><span class="T8"> Schema. </span><span class="T7">29 September 2011. OASIS Standard. </span><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html</a></p><p class="P2">Notices</p><p class="Text_20_body">Copyright © OASIS Open 2002–2011. All Rights Reserved.</p><p class="Text_20_body">All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full <a href="http://www.oasis-open.org/who/intellectualproperty.php">Policy</a> may be found at the OASIS website.</p><p class="Text_20_body">This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to OASIS, except as needed for the purpose of developing any document or deliverable produced by an OASIS Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English.</p><p class="Text_20_body">The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns.</p><p class="Text_20_body">This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.</p><p class="Text_20_body">OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Committee Specification or OASIS Standard, to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this specification.</p><p class="Text_20_body">OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this specification by a patent holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this specification. OASIS may include such claims on its website, but disclaims any obligation to do so.</p><p class="Text_20_body">OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Committee Specification or OASIS Standard, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.</p><p class="Text_20_body">The names "OASIS", “OpenDocument”, “Open Document Format”, and “ODF” are trademarks of <a href="http://www.oasis-open.org/">OASIS</a>, the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see <a href="http://www.oasis-open.org/who/trademark.php">http://www.oasis-open.org/who/trademark.php</a> for above guidance.</p><p class="P1">Table of Contents</p><table border="0" cellspacing="0" cellpadding="0" class="Sect1"><colgroup/><tr><td><p class="P10"><a href="#__RefHeading__1414978_253892949">1 Introduction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1414980_253892949">1.1 Introduction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1414982_253892949">1.2 Terminology</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1414984_253892949">1.3 Normative References</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1414986_253892949">1.4 Non Normative References</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1414988_253892949">1.5 Namespaces</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__440342_826425813">2 OpenDocument Documents, Consumers and Producers</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1718302_1219268628">2.1 Introduction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__440344_826425813">2.2 Documents</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440346_826425813">2.2.1 OpenDocument Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440348_826425813">2.2.2 OpenDocument Extended Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440350_826425813">2.2.3 OpenDocument Text Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440352_826425813">2.2.4 OpenDocument Spreadsheet Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440354_826425813">2.2.5 OpenDocument Drawing Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440356_826425813">2.2.6 OpenDocument Presentation Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440358_826425813">2.2.7 OpenDocument Chart Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440360_826425813">2.2.8 OpenDocument Image Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440362_826425813">2.2.9 OpenDocument Formula Document</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440364_826425813">2.2.10 OpenDocument Database Front End Document</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420376_2538929491">2.3 Producers</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440366_826425813">2.3.1 OpenDocument Producer</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__440368_826425813">2.3.2 OpenDocument Extended Producer</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420382_2538929491">2.4 Consumer</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__440370_826425813">3 Document Structure</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1414994_253892949">3.1 Document Representation </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1414996_253892949">3.1.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1414998_253892949">3.1.2 &lt;office:document&gt;(Single OpenDocument XML Files)</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415000_253892949">3.1.3 Package OpenDocument Files</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415002_253892949">3.1.3.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415004_253892949">3.1.3.2 &lt;office:document-content&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415006_253892949">3.1.3.3 &lt;office:document-styles&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415008_253892949">3.1.3.4 &lt;office:document-meta&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415010_253892949">3.1.3.5 &lt;office:document-settings&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415012_253892949">3.1.4 Summary of Document Representation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415014_253892949">3.2 &lt;office:meta&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415016_253892949">3.3 &lt;office:body&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415018_253892949">3.4 &lt;office:text&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415020_253892949">3.5 &lt;office:drawing&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415022_253892949">3.6 &lt;office:presentation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415024_253892949">3.7 &lt;office:spreadsheet&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415026_253892949">3.8 &lt;office:chart&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415028_253892949">3.9 &lt;office:image&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415030_253892949">3.10 &lt;office:settings&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415032_253892949">3.10.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415034_253892949">3.10.2 &lt;config:config-item-set&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415036_253892949">3.10.3 &lt;config:config-item&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415038_253892949">3.10.4 &lt;config:config-item-map-indexed&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415040_253892949">3.10.5 &lt;config:config-item-map-entry&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415042_253892949">3.10.6 &lt;config:config-item-map-named&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415044_253892949">3.11 Cursor Position Setting</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415046_253892949">3.12 &lt;office:scripts&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415048_253892949">3.13 &lt;office:script&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415050_253892949">3.14 &lt;office:font-face-decls&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415052_253892949">3.15 Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415054_253892949">3.15.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415056_253892949">3.15.2 &lt;office:styles&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415058_253892949">3.15.3 &lt;office:automatic-styles&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415060_253892949">3.15.4 &lt;office:master-styles&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415062_253892949">3.16 Document Signatures</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__440372_826425813">3.17 Foreign Elements and Attributes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420346_2538929491">3.18 White Space Processing and EOL Handling</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420348_2538929491">3.19 MIME Types and File Name Extensions</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415064_253892949">4 Metadata</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415066_253892949">4.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415068_253892949">4.2 RDF Metadata</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415070_253892949">4.2.1 In Content Metadata (RDFa)</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415072_253892949">4.2.2 manifest.rdf</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415074_253892949">4.2.2.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415076_253892949">4.2.2.2 odf:ContentFile</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415078_253892949">4.2.2.3 odf:StylesFile</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415080_253892949">4.2.2.4 odf:Element</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415082_253892949">4.2.2.5 odf:prefix</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415084_253892949">4.2.2.6 odf:suffix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415086_253892949">4.3 Non-RDF Metadata</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415088_253892949">4.3.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415090_253892949">4.3.2 Pre-Defined Metadata Elements</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415092_253892949">4.3.2.1 &lt;meta:generator&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415094_253892949">4.3.2.2 &lt;dc:title&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415096_253892949">4.3.2.3 &lt;dc:description&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415098_253892949">4.3.2.4 &lt;dc:subject&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415100_253892949">4.3.2.5 &lt;meta:keyword&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415102_253892949">4.3.2.6 &lt;meta:initial-creator&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415104_253892949">4.3.2.7 &lt;dc:creator&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415106_253892949">4.3.2.8 &lt;meta:printed-by&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415108_253892949">4.3.2.9 &lt;meta:creation-date&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415110_253892949">4.3.2.10 &lt;dc:date&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415112_253892949">4.3.2.11 &lt;meta:print-date&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415114_253892949">4.3.2.12 &lt;meta:template&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415116_253892949">4.3.2.13 &lt;meta:auto-reload&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415118_253892949">4.3.2.14 &lt;meta:hyperlink-behaviour&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415120_253892949">4.3.2.15 &lt;dc:language&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415122_253892949">4.3.2.16 &lt;meta:editing-cycles&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415124_253892949">4.3.2.17 &lt;meta:editing-duration&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415126_253892949">4.3.2.18 &lt;meta:document-statistic&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415128_253892949">4.3.3 &lt;meta:user-defined&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415130_253892949">5 Text Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415132_253892949">5.1 Headings, Paragraphs and Basic Text Structure</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415134_253892949">5.1.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415136_253892949">5.1.2 &lt;text:h&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415138_253892949">5.1.3 &lt;text:p&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415140_253892949">5.2 &lt;text:page-sequence&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415142_253892949">5.2.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415144_253892949">5.2.2 &lt;text:page&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415146_253892949">5.3 Lists</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415148_253892949">5.3.1 &lt;text:list&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415150_253892949">5.3.2 Default List Style </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415152_253892949">5.3.3 &lt;text:list-header&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415154_253892949">5.3.4 &lt;text:list-item&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415156_253892949">5.3.5 List Item Style Rules</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415158_253892949">5.3.6 &lt;text:numbered-paragraph&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415160_253892949">5.3.7 Numbered Paragraph Style Rules</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415162_253892949">5.4 &lt;text:section&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415164_253892949">5.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415166_253892949">5.4.2 &lt;text:section-source&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415168_253892949">5.5 Change Tracking</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415170_253892949">5.5.1 &lt;text:tracked-changes&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415172_253892949">5.5.2 &lt;text:changed-region&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415174_253892949">5.5.3 &lt;text:insertion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415176_253892949">5.5.4 &lt;text:deletion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415178_253892949">5.5.5 &lt;text:format-change&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415180_253892949">5.5.6 &lt;office:change-info&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415182_253892949">5.5.7 Change Marks</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__440374_826425813">5.5.7.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415184_253892949">5.5.7.2 &lt;text:change-start&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415186_253892949">5.5.7.3 &lt;text:change-end&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415188_253892949">5.5.7.4 &lt;text:change&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415190_253892949">5.6 &lt;text:soft-page-break&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415192_253892949">5.7 Document Declarations</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415194_253892949">6 Paragraph Elements Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415196_253892949">6.1 Basic Text Content</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415198_253892949">6.1.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415200_253892949">6.1.2 White Space Characters</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415202_253892949">6.1.3 &lt;text:s&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415204_253892949">6.1.4 &lt;text:tab&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415206_253892949">6.1.5 &lt;text:line-break&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415208_253892949">6.1.6 Soft Hyphens, Hyphens, and Non-breaking Spaces</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415210_253892949">6.1.7 &lt;text:span&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415212_253892949">6.1.8 &lt;text:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415214_253892949">6.1.9 &lt;text:meta&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415216_253892949">6.1.10 &lt;text:number&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415218_253892949">6.2 Bookmarks and References</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415220_253892949">6.2.1 Bookmarks</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415222_253892949">6.2.1.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415224_253892949">6.2.1.2 &lt;text:bookmark&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415226_253892949">6.2.1.3 &lt;text:bookmark-start&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415228_253892949">6.2.1.4 &lt;text:bookmark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415230_253892949">6.2.2 References</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415232_253892949">6.2.2.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415234_253892949">6.2.2.2 &lt;text:reference-mark&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415236_253892949">6.2.2.3 &lt;text:reference-mark-start&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415238_253892949">6.2.2.4 &lt;text:reference-mark-end&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415240_253892949">6.3 Notes</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415242_253892949">6.3.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415244_253892949">6.3.2 &lt;text:note&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415246_253892949">6.3.3 &lt;text:note-citation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415248_253892949">6.3.4 &lt;text:note-body&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415250_253892949">6.4 &lt;text:ruby&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415252_253892949">6.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415254_253892949">6.4.2 &lt;text:ruby-base&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415256_253892949">6.4.3 &lt;text:ruby-text&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415258_253892949">7 Text Fields</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415260_253892949">7.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415262_253892949">7.2 Common Characteristics of Field Elements</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415264_253892949">7.3 Document Fields</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415266_253892949">7.3.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415268_253892949">7.3.2 &lt;text:date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415270_253892949">7.3.3 &lt;text:time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415272_253892949">7.3.4 &lt;text:page-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415274_253892949">7.3.5 &lt;text:page-continuation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415276_253892949">7.3.6 Subsequent Author Fields</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415278_253892949">7.3.6.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415280_253892949">7.3.6.2 &lt;text:sender-firstname&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415282_253892949">7.3.6.3 &lt;text:sender-lastname&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415284_253892949">7.3.6.4 &lt;text:sender-initials&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415286_253892949">7.3.6.5 &lt;text:sender-title&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415288_253892949">7.3.6.6 &lt;text:sender-position&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415290_253892949">7.3.6.7 &lt;text:sender-email&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415292_253892949">7.3.6.8 &lt;text:sender-phone-private&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415294_253892949">7.3.6.9 &lt;text:sender-fax&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415296_253892949">7.3.6.10 &lt;text:sender-company&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415298_253892949">7.3.6.11 &lt;text:sender-phone-work&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415300_253892949">7.3.6.12 &lt;text:sender-street&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415302_253892949">7.3.6.13 &lt;text:sender-city&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415304_253892949">7.3.6.14 &lt;text:sender-postal-code&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415306_253892949">7.3.6.15 &lt;text:sender-country&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415308_253892949">7.3.6.16 &lt;text:sender-state-or-province&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415310_253892949">7.3.7 Author Fields</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415312_253892949">7.3.7.1 &lt;text:author-name&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415314_253892949">7.3.7.2 &lt;text:author-initials&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415316_253892949">7.3.8 &lt;text:chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415318_253892949">7.3.9 &lt;text:file-name&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415320_253892949">7.3.10 &lt;text:template-name&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415322_253892949">7.3.11 &lt;text:sheet-name&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415324_253892949">7.4 Variable Fields</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415326_253892949">7.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415328_253892949">7.4.2 &lt;text:variable-decls&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415330_253892949">7.4.3 &lt;text:variable-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415332_253892949">7.4.4 &lt;text:variable-set&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415334_253892949">7.4.5 &lt;text:variable-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415336_253892949">7.4.6 &lt;text:variable-input&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415338_253892949">7.4.7 &lt;text:user-field-decls&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415340_253892949">7.4.8 &lt;text:user-field-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415342_253892949">7.4.9 &lt;text:user-field-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415344_253892949">7.4.10 &lt;text:user-field-input&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415346_253892949">7.4.11 &lt;text:sequence-decls&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415348_253892949">7.4.12 &lt;text:sequence-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415350_253892949">7.4.13 &lt;text:sequence&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415352_253892949">7.4.14 &lt;text:expression&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415354_253892949">7.4.15 &lt;text:text-input&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415356_253892949">7.5 Metadata Fields</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415358_253892949">7.5.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415360_253892949">7.5.2 &lt;text:initial-creator&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415362_253892949">7.5.3 &lt;text:creation-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415364_253892949">7.5.4 &lt;text:creation-time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415366_253892949">7.5.5 &lt;text:description&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415368_253892949">7.5.6 &lt;text:user-defined&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415370_253892949">7.5.7 &lt;text:print-time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415372_253892949">7.5.8 &lt;text:print-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415374_253892949">7.5.9 &lt;text:printed-by&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415376_253892949">7.5.10 &lt;text:title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415378_253892949">7.5.11 &lt;text:subject&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415380_253892949">7.5.12 &lt;text:keywords&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415382_253892949">7.5.13 &lt;text:editing-cycles&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415384_253892949">7.5.14 &lt;text:editing-duration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415386_253892949">7.5.15 &lt;text:modification-time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415388_253892949">7.5.16 &lt;text:modification-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415390_253892949">7.5.17 &lt;text:creator&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415392_253892949">7.5.18 Document Statistics Fields</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415394_253892949">7.5.18.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415396_253892949">7.5.18.2 &lt;text:page-count&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415398_253892949">7.5.18.3 &lt;text:paragraph-count&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415400_253892949">7.5.18.4 &lt;text:word-count&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415402_253892949">7.5.18.5 &lt;text:character-count&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415404_253892949">7.5.18.6 &lt;text:table-count&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415406_253892949">7.5.18.7 &lt;text:image-count&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415408_253892949">7.5.18.8 &lt;text:object-count&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415410_253892949">7.5.19 &lt;text:meta-field&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415412_253892949">7.6 Database Fields</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415414_253892949">7.6.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415416_253892949">7.6.2 &lt;form:connection-resource&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415418_253892949">7.6.3 &lt;text:database-display&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415420_253892949">7.6.4 &lt;text:database-next&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415422_253892949">7.6.5 &lt;text:database-row-select&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415424_253892949">7.6.6 &lt;text:database-row-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415426_253892949">7.6.7 &lt;text:database-name&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415428_253892949">7.7 More Fields</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415430_253892949">7.7.1 Page Variable Fields</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415432_253892949">7.7.1.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415434_253892949">7.7.1.2 &lt;text:page-variable-set&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415436_253892949">7.7.1.3 &lt;text:page-variable-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415438_253892949">7.7.2 &lt;text:placeholder&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415440_253892949">7.7.3 &lt;text:conditional-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415442_253892949">7.7.4 &lt;text:hidden-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415444_253892949">7.7.5 &lt;text:reference-ref&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415446_253892949">7.7.6 &lt;text:bookmark-ref&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415448_253892949">7.7.7 &lt;text:note-ref&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415450_253892949">7.7.8 &lt;text:sequence-ref&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415452_253892949">7.7.9 &lt;text:script&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415454_253892949">7.7.10 &lt;text:execute-macro&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415456_253892949">7.7.11 &lt;text:hidden-paragraph&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415458_253892949">7.7.12 &lt;text:dde-connection&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415460_253892949">7.7.13 &lt;text:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415462_253892949">7.7.14 &lt;text:table-formula&gt; (deprecated)</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415464_253892949">8 Text Indexes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415466_253892949">8.1 Index Marks</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415468_253892949">8.1.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415470_253892949">8.1.2 &lt;text:toc-mark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415472_253892949">8.1.3 &lt;text:toc-mark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415474_253892949">8.1.4 &lt;text:toc-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415476_253892949">8.1.5 &lt;text:user-index-mark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415478_253892949">8.1.6 &lt;text:user-index-mark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415480_253892949">8.1.7 &lt;text:user-index-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415482_253892949">8.1.8 &lt;text:alphabetical-index-mark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415484_253892949">8.1.9 &lt;text:alphabetical-index-mark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415486_253892949">8.1.10 &lt;text:alphabetical-index-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415488_253892949">8.1.11 &lt;text:bibliography-mark&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415490_253892949">8.2 Index Structure</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415492_253892949">8.2.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415494_253892949">8.2.2 &lt;text:index-body&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415496_253892949">8.2.3 &lt;text:index-title&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415498_253892949">8.3 &lt;text:table-of-content&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415500_253892949">8.3.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415502_253892949">8.3.2 &lt;text:table-of-content-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415504_253892949">8.3.3 &lt;text:table-of-content-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415506_253892949">8.4 &lt;text:illustration-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415508_253892949">8.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415510_253892949">8.4.2 &lt;text:illustration-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415512_253892949">8.4.3 &lt;text:illustration-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415514_253892949">8.5 &lt;text:table-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415516_253892949">8.5.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415518_253892949">8.5.2 &lt;text:table-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415520_253892949">8.5.3 &lt;text:table-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415522_253892949">8.6 &lt;text:object-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415524_253892949">8.6.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415526_253892949">8.6.2 &lt;text:object-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415528_253892949">8.6.3 &lt;text:object-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415530_253892949">8.7 &lt;text:user-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415532_253892949">8.7.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415534_253892949">8.7.2 &lt;text:user-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415536_253892949">8.7.3 &lt;text:user-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415538_253892949">8.8 &lt;text:alphabetical-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415540_253892949">8.8.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415542_253892949">8.8.2 &lt;text:alphabetical-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415544_253892949">8.8.3 &lt;text:alphabetical-index-auto-mark-file&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415546_253892949">8.8.4 &lt;text:alphabetical-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415548_253892949">8.9 &lt;text:bibliography&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415550_253892949">8.9.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415552_253892949">8.9.2 &lt;text:bibliography-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415554_253892949">8.9.3 &lt;text:bibliography-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415556_253892949">8.10 &lt;text:index-source-styles&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415558_253892949">8.11 &lt;text:index-source-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415560_253892949">8.12 &lt;text:index-title-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415562_253892949">8.13 Index Template Entries</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415564_253892949">8.13.1 &lt;text:index-entry-chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415566_253892949">8.13.2 &lt;text:index-entry-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415568_253892949">8.13.3 &lt;text:index-entry-page-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415570_253892949">8.13.4 &lt;text:index-entry-span&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415572_253892949">8.13.5 &lt;text:index-entry-bibliography&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415574_253892949">8.13.6 &lt;text:index-entry-tab-stop&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415576_253892949">8.13.7 &lt;text:index-entry-link-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415578_253892949">8.13.8 &lt;text:index-entry-link-end&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415580_253892949">9 Tables</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415582_253892949">9.1 Basic Tables</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415584_253892949">9.1.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415586_253892949">9.1.2 &lt;table:table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415588_253892949">9.1.3 &lt;table:table-row&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415590_253892949">9.1.4 &lt;table:table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415592_253892949">9.1.5 &lt;table:covered-table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415594_253892949">9.1.6 &lt;table:table-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415596_253892949">9.1.7 &lt;table:table-header-rows&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415598_253892949">9.1.8 &lt;table:table-rows&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415600_253892949">9.1.9 &lt;table:table-row-group&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415602_253892949">9.1.10 &lt;table:table-column-group&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415604_253892949">9.1.11 &lt;table:table-header-columns&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415606_253892949">9.1.12 &lt;table:table-columns&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415608_253892949">9.1.13 &lt;table:title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415610_253892949">9.1.14 &lt;table:desc&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415612_253892949">9.2 Advanced Tables</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415614_253892949">9.2.1 Referencing Table Cells</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415616_253892949">9.2.2 Absolute and relative cell addressing</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415618_253892949">9.2.3 Cell Range Address</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415620_253892949">9.2.4 Column and Row Range Addresses</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415622_253892949">9.2.5 Cell Range Address List</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415624_253892949">9.2.6 &lt;table:table-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415626_253892949">9.2.7 &lt;table:scenario&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415628_253892949">9.2.8 &lt;table:shapes&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415630_253892949">9.3 Advanced Table Cells</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415632_253892949">9.3.1 &lt;table:cell-range-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415634_253892949">9.3.2 &lt;table:detective&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415636_253892949">9.3.3 &lt;table:operation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415638_253892949">9.3.4 &lt;table:highlighted-range&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415640_253892949">9.4 Spreadsheet Document Content</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415642_253892949">9.4.1 &lt;table:calculation-settings&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415644_253892949">9.4.2 &lt;table:null-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415646_253892949">9.4.3 &lt;table:iteration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415648_253892949">9.4.4 &lt;table:content-validations&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415650_253892949">9.4.5 &lt;table:content-validation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415652_253892949">9.4.6 &lt;table:help-message&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415654_253892949">9.4.7 &lt;table:error-message&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415656_253892949">9.4.8 &lt;table:error-macro&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415658_253892949">9.4.9 &lt;table:label-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415660_253892949">9.4.10 &lt;table:label-ranges&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415662_253892949">9.4.11 &lt;table:named-expressions&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415664_253892949">9.4.12 &lt;table:named-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415666_253892949">9.4.13 &lt;table:named-expression&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415668_253892949">9.4.14 &lt;table:database-ranges&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415670_253892949">9.4.15 &lt;table:database-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415672_253892949">9.4.16 &lt;table:database-source-sql&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415674_253892949">9.4.17 &lt;table:database-source-table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415676_253892949">9.4.18 &lt;table:database-source-query&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415678_253892949">9.4.19 &lt;table:sort&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415680_253892949">9.4.20 &lt;table:sort-by&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415682_253892949">9.4.21 &lt;table:subtotal-rules&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415684_253892949">9.4.22 &lt;table:sort-groups&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415686_253892949">9.4.23 &lt;table:subtotal-rule&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415688_253892949">9.4.24 &lt;table:subtotal-field&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415690_253892949">9.5 Filters</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415692_253892949">9.5.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415694_253892949">9.5.2 &lt;table:filter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415696_253892949">9.5.3 &lt;table:filter-and&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415698_253892949">9.5.4 &lt;table:filter-or&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415700_253892949">9.5.5 &lt;table:filter-condition&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415702_253892949">9.5.6 &lt;table:filter-set-item&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415704_253892949">9.6 Data Pilot Tables</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415706_253892949">9.6.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415708_253892949">9.6.2 &lt;table:data-pilot-tables&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415710_253892949">9.6.3 &lt;table:data-pilot-table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415712_253892949">9.6.4 Data Pilot Table Source</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415714_253892949">9.6.5 &lt;table:source-cell-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415716_253892949">9.6.6 &lt;table:source-service&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415718_253892949">9.6.7 &lt;table:data-pilot-field&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415720_253892949">9.6.8 &lt;table:data-pilot-level&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415722_253892949">9.6.9 &lt;table:data-pilot-subtotals&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415724_253892949">9.6.10 &lt;table:data-pilot-subtotal&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415726_253892949">9.6.11 &lt;table:data-pilot-members&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415728_253892949">9.6.12 &lt;table:data-pilot-member&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415730_253892949">9.6.13 &lt;table:data-pilot-display-info&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415732_253892949">9.6.14 &lt;table:data-pilot-sort-info&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415734_253892949">9.6.15 &lt;table:data-pilot-layout-info&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415736_253892949">9.6.16 &lt;table:data-pilot-field-reference&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415738_253892949">9.6.17 &lt;table:data-pilot-groups&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415740_253892949">9.6.18 &lt;table:data-pilot-group&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415742_253892949">9.6.19 &lt;table:data-pilot-group-member&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415744_253892949">9.7 &lt;table:consolidation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415746_253892949">9.8 &lt;table:dde-links&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415748_253892949">9.9 Change Tracking in Spreadsheets</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415750_253892949">9.9.1 General </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415752_253892949">9.9.2 &lt;table:tracked-changes&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415754_253892949">9.9.3 &lt;table:insertion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415756_253892949">9.9.4 &lt;table:dependencies&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415758_253892949">9.9.5 &lt;table:dependency&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415760_253892949">9.9.6 &lt;table:deletions&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415762_253892949">9.9.7 &lt;table:cell-content-deletion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415764_253892949">9.9.8 &lt;table:change-deletion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415766_253892949">9.9.9 &lt;table:deletion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415768_253892949">9.9.10 &lt;table:cut-offs&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415770_253892949">9.9.11 &lt;table:insertion-cut-off&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415772_253892949">9.9.12 &lt;table:movement-cut-off&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415774_253892949">9.9.13 &lt;table:movement&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415776_253892949">9.9.14 &lt;table:source-range-address&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415778_253892949">9.9.15 &lt;table:target-range-address&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415780_253892949">9.9.16 &lt;table:change-track-table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415782_253892949">9.9.17 &lt;table:cell-content-change&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415784_253892949">9.9.18 &lt;table:cell-address&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415786_253892949">9.9.19 &lt;table:previous&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415788_253892949">10 Graphic Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415790_253892949">10.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415792_253892949">10.2 Enhanced Page Features for Graphical Applications</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415794_253892949">10.2.1 &lt;style:handout-master&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415796_253892949">10.2.2 &lt;draw:layer-set&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415798_253892949">10.2.3 &lt;draw:layer&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415800_253892949">10.2.4 &lt;draw:page&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415802_253892949">10.2.5 &lt;draw:equation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415804_253892949">10.3 Drawing Shapes</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415806_253892949">10.3.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415808_253892949">10.3.2 &lt;draw:rect&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415810_253892949">10.3.3 &lt;draw:line&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415812_253892949">10.3.4 &lt;draw:polyline&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415814_253892949">10.3.5 &lt;draw:polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415816_253892949">10.3.6 &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415818_253892949">10.3.7 &lt;draw:path&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415820_253892949">10.3.8 &lt;draw:circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415822_253892949">10.3.9 &lt;draw:ellipse&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415824_253892949">10.3.10 &lt;draw:connector&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415826_253892949">10.3.11 &lt;draw:caption&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415828_253892949">10.3.12 &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415830_253892949">10.3.13 &lt;draw:control&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415832_253892949">10.3.14 &lt;draw:page-thumbnail&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415834_253892949">10.3.15 &lt;draw:g&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415836_253892949">10.3.16 &lt;draw:glue-point&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415838_253892949">10.3.17 &lt;svg:title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415840_253892949">10.3.18 &lt;svg:desc&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415842_253892949">10.3.19 &lt;office:event-listeners&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415844_253892949">10.4 Frames</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415846_253892949">10.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415848_253892949">10.4.2 &lt;draw:frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415850_253892949">10.4.3 &lt;draw:text-box&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415852_253892949">10.4.4 &lt;draw:image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415854_253892949">10.4.5 &lt;office:binary-data&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415856_253892949">10.4.6 Objects</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415858_253892949">10.4.6.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415860_253892949">10.4.6.2 &lt;draw:object&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415862_253892949">10.4.6.3 &lt;draw:object-ole&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415864_253892949">10.4.7 &lt;draw:applet&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415866_253892949">10.4.8 &lt;draw:plugin&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415868_253892949">10.4.9 &lt;draw:param&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415870_253892949">10.4.10 &lt;draw:floating-frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415872_253892949">10.4.11 Contours</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415874_253892949">10.4.11.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415876_253892949">10.4.11.2 &lt;draw:contour-polygon&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415878_253892949">10.4.11.3 &lt;draw:contour-path&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415880_253892949">10.4.12 &lt;draw:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415882_253892949">10.4.13 Client Side Image Maps</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415884_253892949">10.4.13.1 General</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415886_253892949">10.4.13.2 &lt;draw:image-map&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415888_253892949">10.4.13.3 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415890_253892949">10.4.13.4 &lt;draw:area-circle&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415892_253892949">10.4.13.5 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415894_253892949">10.5 3D Shapes</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718304_1219268628">10.5.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415896_253892949">10.5.2 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415898_253892949">10.5.3 &lt;dr3d:light&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415900_253892949">10.5.4 &lt;dr3d:cube&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415902_253892949">10.5.5 &lt;dr3d:sphere&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415904_253892949">10.5.6 &lt;dr3d:extrude&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415906_253892949">10.5.7 &lt;dr3d:rotate&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415908_253892949">10.6 Custom Shape</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415910_253892949">10.6.1 &lt;draw:custom-shape&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415912_253892949">10.6.2 &lt;draw:enhanced-geometry&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415914_253892949">10.6.3 &lt;draw:handle&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415916_253892949">10.7 Presentation Shapes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415918_253892949">10.8 Presentation Animations</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415920_253892949">10.8.1 &lt;presentation:animations&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415922_253892949">10.8.2 &lt;presentation:sound&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415924_253892949">10.8.3 &lt;presentation:show-shape&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415926_253892949">10.8.4 &lt;presentation:show-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415928_253892949">10.8.5 &lt;presentation:hide-shape&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415930_253892949">10.8.6 &lt;presentation:hide-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415932_253892949">10.8.7 &lt;presentation:dim&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415934_253892949">10.8.8 &lt;presentation:play&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415936_253892949">10.8.9 &lt;presentation:animation-group&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415938_253892949">10.9 SMIL Presentation Animations</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415940_253892949">10.9.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415942_253892949">10.9.2 &lt;presentation:event-listener&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415944_253892949">10.9.3 Presentation Document Content</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415946_253892949">10.9.3.1 &lt;presentation:header&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415948_253892949">10.9.3.2 &lt;presentation:header-decl&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415950_253892949">10.9.3.3 &lt;presentation:footer&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415952_253892949">10.9.3.4 &lt;presentation:footer-decl&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415954_253892949">10.9.3.5 &lt;presentation:date-time&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415956_253892949">10.9.3.6 &lt;presentation:date-time-decl&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415958_253892949">10.9.3.7 &lt;presentation:settings&gt;</a></p></td></tr><tr><td><p class="P7"><a href="#__RefHeading__1415960_253892949">10.9.3.8 &lt;presentation:show&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1415962_253892949">11 Chart Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415964_253892949">11.1 &lt;chart:chart&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415966_253892949">11.2 Title, Subtitle and Footer</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415968_253892949">11.2.1 &lt;chart:title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415970_253892949">11.2.2 &lt;chart:subtitle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1415972_253892949">11.2.3 &lt;chart:footer&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415974_253892949">11.3 &lt;chart:legend&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415976_253892949">11.4 &lt;chart:plot-area&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415978_253892949">11.5 3D Plot Area</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415980_253892949">11.6 &lt;chart:wall&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415982_253892949">11.7 &lt;chart:floor&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415984_253892949">11.8 &lt;chart:axis&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415986_253892949">11.9 &lt;chart:categories&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415988_253892949">11.10 &lt;chart:grid&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415990_253892949">11.11 &lt;chart:series&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415992_253892949">11.12 &lt;chart:domain&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415994_253892949">11.13 &lt;chart:data-point&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415996_253892949">11.14 &lt;chart:data-label&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1415998_253892949">11.15 &lt;chart:mean-value&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416000_253892949">11.16 &lt;chart:error-indicator&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416002_253892949">11.17 &lt;chart:regression-curve&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416004_253892949">11.18 &lt;chart:equation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416006_253892949">11.19 &lt;chart:stock-gain-marker&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416008_253892949">11.20 &lt;chart:stock-loss-marker&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416010_253892949">11.21 &lt;chart:stock-range-line&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416012_253892949">12 Database Front-end Document Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416014_253892949">12.1 &lt;office:database&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416016_253892949">12.2 &lt;db:data-source&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416018_253892949">12.3 &lt;db:connection-data&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416020_253892949">12.4 &lt;db:database-description&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416022_253892949">12.5 &lt;db:file-based-database&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416024_253892949">12.6 &lt;db:server-database&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416026_253892949">12.7 &lt;db:connection-resource&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416028_253892949">12.8 &lt;db:login&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416030_253892949">12.9 &lt;db:driver-settings&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416032_253892949">12.10 &lt;db:auto-increment&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416034_253892949">12.11 &lt;db:delimiter&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416036_253892949">12.12 &lt;db:character-set&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416038_253892949">12.13 &lt;db:table-settings&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416040_253892949">12.14 &lt;db:table-setting&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416042_253892949">12.15 &lt;db:application-connection-settings&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416044_253892949">12.16 &lt;db:table-filter&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416046_253892949">12.17 &lt;db:table-include-filter&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416048_253892949">12.18 &lt;db:table-exclude-filter&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416050_253892949">12.19 &lt;db:table-filter-pattern&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416052_253892949">12.20 &lt;db:table-type-filter&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416054_253892949">12.21 &lt;db:table-type&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416056_253892949">12.22 &lt;db:data-source-settings&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416058_253892949">12.23 &lt;db:data-source-setting&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416060_253892949">12.24 &lt;db:data-source-setting-value&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416062_253892949">12.25 Forms and Reports</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416064_253892949">12.25.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416066_253892949">12.25.2 &lt;db:forms&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416068_253892949">12.25.3 &lt;db:reports&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416070_253892949">12.25.4 &lt;db:component-collection&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416072_253892949">12.25.5 &lt;db:component&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416074_253892949">12.26 &lt;db:queries&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416076_253892949">12.27 &lt;db:query-collection&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416078_253892949">12.28 &lt;db:query&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416080_253892949">12.29 &lt;db:order-statement&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416082_253892949">12.30 &lt;db:filter-statement&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416084_253892949">12.31 &lt;db:update-table&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416086_253892949">12.32 &lt;db:table-representations&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416088_253892949">12.33 &lt;db:table-representation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416090_253892949">12.34 &lt;db:columns&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416092_253892949">12.35 &lt;db:column&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416094_253892949">12.36 &lt;db:schema-definition&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416096_253892949">12.37 &lt;db:table-definitions&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416098_253892949">12.38 &lt;db:table-definition&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416100_253892949">12.39 &lt;db:column-definitions&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416102_253892949">12.40 &lt;db:column-definition&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416104_253892949">12.41 &lt;db:keys&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416106_253892949">12.42 &lt;db:key&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416108_253892949">12.43 &lt;db:key-columns&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416110_253892949">12.44 &lt;db:key-column&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416112_253892949">12.45 &lt;db:indices&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416114_253892949">12.46 &lt;db:index&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416116_253892949">12.47 &lt;db:index-columns&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416118_253892949">12.48 &lt;db:index-column&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416120_253892949">13 Form Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416122_253892949">13.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416124_253892949">13.2 &lt;office:forms&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416126_253892949">13.3 &lt;form:form&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416128_253892949">13.4 &lt;xforms:model&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416130_253892949">13.5 Controls</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416132_253892949">13.5.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416134_253892949">13.5.2 &lt;form:text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416136_253892949">13.5.3 &lt;form:textarea&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416138_253892949">13.5.4 &lt;form:password&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416140_253892949">13.5.5 &lt;form:file&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416142_253892949">13.5.6 &lt;form:formatted-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416144_253892949">13.5.7 &lt;form:number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416146_253892949">13.5.8 &lt;form:date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416148_253892949">13.5.9 &lt;form:time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416150_253892949">13.5.10 &lt;form:fixed-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416152_253892949">13.5.11 &lt;form:combobox&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416154_253892949">13.5.12 &lt;form:item&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416156_253892949">13.5.13 &lt;form:listbox&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416158_253892949">13.5.14 &lt;form:option&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416160_253892949">13.5.15 &lt;form:button&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416162_253892949">13.5.16 &lt;form:image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416164_253892949">13.5.17 &lt;form:checkbox&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416166_253892949">13.5.18 &lt;form:radio&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416168_253892949">13.5.19 &lt;form:frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416170_253892949">13.5.20 &lt;form:image-frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416172_253892949">13.5.21 &lt;form:hidden&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416174_253892949">13.5.22 &lt;form:grid&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416176_253892949">13.5.23 &lt;form:column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416178_253892949">13.5.24 &lt;form:value-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416180_253892949">13.5.25 &lt;form:generic-control&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416182_253892949">13.6 Event Listeners</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416184_253892949">13.7 &lt;form:properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416186_253892949">13.8 &lt;form:property&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416188_253892949">13.9 &lt;form:list-property&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416190_253892949">13.10 &lt;form:list-value&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416192_253892949">14 Common Content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416194_253892949">14.1 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416196_253892949">14.2 &lt;office:annotation-end&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416198_253892949">14.3 &lt;meta:date-string&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416202_253892949">14.4 Event Listener Tables</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416204_253892949">14.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416206_253892949">14.4.2 &lt;script:event-listener&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416208_253892949">14.4.3 Event Types</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416210_253892949">14.4.4 Macro Name and Location</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416212_253892949">14.5 &lt;math:math&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416214_253892949">14.6 DDE Connections</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416216_253892949">14.6.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416220_253892949">14.6.2 &lt;text:dde-connection-decls&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416222_253892949">14.6.3 &lt;text:dde-connection-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416224_253892949">14.6.4 &lt;table:dde-link&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416226_253892949">14.6.5 &lt;office:dde-source&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416228_253892949">15 SMIL Animations</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416230_253892949">15.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416232_253892949">15.2 Basic Animation Elements</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416234_253892949">15.2.1 General </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416236_253892949">15.2.2 &lt;anim:animate&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416238_253892949">15.2.3 &lt;anim:animateTransform&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416240_253892949">15.2.4 &lt;anim:set&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416242_253892949">15.2.5 &lt;anim:animateMotion&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416244_253892949">15.2.6 &lt;anim:animateColor&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416246_253892949">15.2.7 &lt;anim:transitionFilter&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416248_253892949">15.3 Animation Model Attributes</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416250_253892949">15.3.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416252_253892949">15.3.2 Simple Animation Functions</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416254_253892949">15.4 Animation Timing</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416256_253892949">15.4.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416258_253892949">15.4.2 &lt;anim:par&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416260_253892949">15.4.3 &lt;anim:seq&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416262_253892949">15.4.4 &lt;anim:iterate&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416264_253892949">15.5 &lt;anim:audio&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416266_253892949">15.6 Animation Command Elements</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416268_253892949">15.6.1 &lt;anim:command&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416270_253892949">15.6.2 &lt;anim:param&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416272_253892949">16 Styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416274_253892949">16.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416276_253892949">16.2 &lt;style:style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416278_253892949">16.3 &lt;style:map&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416280_253892949">16.4 &lt;style:default-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416282_253892949">16.5 &lt;style:page-layout&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416284_253892949">16.6 &lt;style:header-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416286_253892949">16.7 &lt;style:footer-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416288_253892949">16.8 &lt;style:default-page-layout&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416290_253892949">16.9 &lt;style:master-page&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416292_253892949">16.10 &lt;style:header&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416294_253892949">16.11 &lt;style:footer&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416296_253892949">16.12 &lt;style:header-left&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416298_253892949">16.13 &lt;style:footer-left&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416300_253892949">16.14 &lt;style:region-left&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416302_253892949">16.15 &lt;style:region-center&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416304_253892949">16.16 &lt;style:region-right&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416306_253892949">16.17 &lt;presentation:notes&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416308_253892949">16.18 &lt;table:table-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416310_253892949">16.19 Cell Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416312_253892949">16.19.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416314_253892949">16.19.2 &lt;table:first-row&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416316_253892949">16.19.3 &lt;table:last-row&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416318_253892949">16.19.4 &lt;table:first-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416320_253892949">16.19.5 &lt;table:last-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416322_253892949">16.19.6 &lt;table:body&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416324_253892949">16.19.7 &lt;table:even-rows&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416326_253892949">16.19.8 &lt;table:odd-rows&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416328_253892949">16.19.9 &lt;table:even-columns&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416330_253892949">16.19.10 &lt;table:odd-columns&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416332_253892949">16.20 &lt;table:background&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416334_253892949">16.21 &lt;style:font-face&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416336_253892949">16.22 &lt;svg:font-face-src&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416338_253892949">16.23 &lt;svg:font-face-name&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416340_253892949">16.24 &lt;svg:font-face-uri&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416342_253892949">16.25 &lt;svg:definition-src&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416344_253892949">16.26 &lt;svg:font-face-format&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416346_253892949">16.27 Data Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416348_253892949">16.27.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416350_253892949">16.27.2 &lt;number:number-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416352_253892949">16.27.3 &lt;number:number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416354_253892949">16.27.4 &lt;number:embedded-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416356_253892949">16.27.5 &lt;number:scientific-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416358_253892949">16.27.6 &lt;number:fraction&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416360_253892949">16.27.7 &lt;number:currency-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416362_253892949">16.27.8 &lt;number:currency-symbol&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416364_253892949">16.27.9 &lt;number:percentage-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416366_253892949">16.27.10 &lt;number:date-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416368_253892949">16.27.11 &lt;number:day&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416370_253892949">16.27.12 &lt;number:month&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416372_253892949">16.27.13 &lt;number:year&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416374_253892949">16.27.14 &lt;number:era&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416376_253892949">16.27.15 &lt;number:day-of-week&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416378_253892949">16.27.16 &lt;number:week-of-year&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416380_253892949">16.27.17 &lt;number:quarter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416382_253892949">16.27.18 &lt;number:time-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416384_253892949">16.27.19 &lt;number:hours&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416386_253892949">16.27.20 &lt;number:minutes&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416388_253892949">16.27.21 &lt;number:seconds&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416390_253892949">16.27.22 &lt;number:am-pm&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416392_253892949">16.27.23 &lt;number:boolean-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416394_253892949">16.27.24 &lt;number:boolean&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416396_253892949">16.27.25 &lt;number:text-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416398_253892949">16.27.26 &lt;number:text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416400_253892949">16.27.27 &lt;number:text-content&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416402_253892949">16.27.28 &lt;style:text-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416404_253892949">16.28 Text Style Families</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416406_253892949">16.28.1 Text Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416408_253892949">16.28.2 Paragraph Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416410_253892949">16.28.3 Section Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416412_253892949">16.28.4 Ruby Styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416414_253892949">16.29 Enhanced Text Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416416_253892949">16.29.1 &lt;text:linenumbering-configuration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416418_253892949">16.29.2 &lt;text:linenumbering-separator&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416420_253892949">16.29.3 &lt;text:notes-configuration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416422_253892949">16.29.4 &lt;text:note-continuation-notice-forward&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416424_253892949">16.29.5 &lt;text:note-continuation-notice-backward&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416426_253892949">16.29.6 &lt;text:bibliography-configuration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416428_253892949">16.29.7 &lt;text:sort-key&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416430_253892949">16.30 &lt;text:list-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416432_253892949">16.31 &lt;text:list-level-style-bullet&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416434_253892949">16.32 &lt;text:list-level-style-number&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416436_253892949">16.33 &lt;text:list-level-style-image&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416438_253892949">16.34 &lt;text:outline-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416440_253892949">16.35 &lt;text:outline-level-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416442_253892949">16.36 Table Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416444_253892949">16.36.1 Table Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416446_253892949">16.36.2 Table Column Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416448_253892949">16.36.3 Table Row Styles</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416450_253892949">16.36.4 Table Cell Styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416452_253892949">16.37 Graphic Styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416454_253892949">16.38 Presentation Styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416456_253892949">16.39 Drawing Page Style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416458_253892949">16.40 Enhanced Graphic Style Elements</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416460_253892949">16.40.1 &lt;draw:gradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416462_253892949">16.40.2 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416464_253892949">16.40.3 &lt;svg:radialGradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416466_253892949">16.40.4 &lt;svg:stop&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416468_253892949">16.40.5 &lt;draw:hatch&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416470_253892949">16.40.6 &lt;draw:fill-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416472_253892949">16.40.7 &lt;draw:opacity&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416474_253892949">16.40.8 &lt;draw:marker&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416476_253892949">16.40.9 &lt;draw:stroke-dash&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416478_253892949">16.41 &lt;style:presentation-page-layout&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416480_253892949">16.42 &lt;presentation:placeholder&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416482_253892949">16.43 Chart Styles</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__35406978">17 Formatting Elements</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416484_253892949">17.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416486_253892949">17.2 &lt;style:page-layout-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416488_253892949">17.3 &lt;style:background-image&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416490_253892949">17.4 &lt;style:footnote-sep&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416492_253892949">17.5 &lt;style:header-footer-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416494_253892949">17.6 &lt;style:paragraph-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416496_253892949">17.7 &lt;style:tab-stops&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416498_253892949">17.8 &lt;style:tab-stop&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416500_253892949">17.9 &lt;style:drop-cap&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416502_253892949">17.10 &lt;style:ruby-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416504_253892949">17.11 &lt;style:section-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416506_253892949">17.12 &lt;style:columns&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416508_253892949">17.13 &lt;style:column&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416510_253892949">17.14 &lt;style:column-sep&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416512_253892949">17.15 &lt;style:table-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416514_253892949">17.16 &lt;style:table-column-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416516_253892949">17.17 &lt;style:table-row-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416518_253892949">17.18 &lt;style:table-cell-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416520_253892949">17.19 &lt;style:list-level-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416522_253892949">17.20 &lt;style:list-level-label-alignment&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416524_253892949">17.21 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416526_253892949">17.22 &lt;style:chart-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416528_253892949">17.23 &lt;chart:symbol-image&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416530_253892949">17.24 &lt;chart:label-separator&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416532_253892949">17.25 &lt;style:drawing-page-properties&gt;</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416534_253892949">18 Datatypes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416536_253892949">18.1 Introduction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__30241806">18.2 W3C Schema Datatypes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416538_253892949">18.3 Other Datatypes</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416540_253892949">18.3.1 angle</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718306_1219268628">18.3.2 anyIRI </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416542_253892949">18.3.3 boolean</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416544_253892949">18.3.4 cellAddress</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416546_253892949">18.3.5 cellRangeAddress</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416548_253892949">18.3.6 cellRangeAddressList</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416550_253892949">18.3.7 character</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416552_253892949">18.3.8 clipShape</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416554_253892949">18.3.9 color</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416556_253892949">18.3.10 coordinate</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416558_253892949">18.3.11 countryCode</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416560_253892949">18.3.12 CURIE</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416562_253892949">18.3.13 CURIEs</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416564_253892949">18.3.14 dateOrDateTime</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416566_253892949">18.3.15 distance</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416570_253892949">18.3.16 language</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416572_253892949">18.3.17 languageCode</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416574_253892949">18.3.18 length</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416576_253892949">18.3.19 namespacedToken</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416578_253892949">18.3.20 nonNegativeLength</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416580_253892949">18.3.21 nonNegativePixelLength</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416582_253892949">18.3.22 pathData</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416584_253892949">18.3.23 percent</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416586_253892949">18.3.24 point3D</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416588_253892949">18.3.25 points</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416590_253892949">18.3.26 positiveLength</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416592_253892949">18.3.27 relativeLength</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416594_253892949">18.3.28 safeCURIE</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416596_253892949">18.3.29 scriptCode</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416598_253892949">18.3.30 signedZeroToHundredPercent</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416600_253892949">18.3.31 styleName</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416602_253892949">18.3.32 styleNameRef</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416604_253892949">18.3.33 styleNameRefs</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416606_253892949">18.3.34 targetFrameName</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416608_253892949">18.3.35 textEncoding</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416610_253892949">18.3.36 timeOrDateTime</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416612_253892949">18.3.37 URIorSafeCURIE</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416614_253892949">18.3.38 valueType</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416616_253892949">18.3.39 variableName</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416618_253892949">18.3.40 vector3D</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416620_253892949">18.3.41 zeroToHundredPercent</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1416622_253892949">19 General Attributes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416624_253892949">19.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416626_253892949">19.2 anim:color-interpolation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416628_253892949">19.3 anim:color-interpolation-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416630_253892949">19.4 anim:audio-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416632_253892949">19.5 anim:command</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416634_253892949">19.6 anim:formula</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416636_253892949">19.7 anim:id (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416638_253892949">19.8 anim:iterate-interval</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416640_253892949">19.9 anim:iterate-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416642_253892949">19.10 anim:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416644_253892949">19.11 anim:sub-item</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416646_253892949">19.12 anim:value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416648_253892949">19.13 chart:attached-axis</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416650_253892949">19.14 chart:automatic-content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416652_253892949">19.15 chart:class</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416654_253892949">19.15.1 &lt;chart:chart&gt;, &lt;chart:series&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416656_253892949">19.15.2 &lt;chart:grid&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416658_253892949">19.16 chart:column-mapping (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416660_253892949">19.17 chart:data-source-has-labels (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416662_253892949">19.18 chart:dimension</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416664_253892949">19.19 chart:display-equation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416666_253892949">19.20 chart:display-r-square</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416672_253892949">19.21 chart:label-cell-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416674_253892949">19.22 chart:legend-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416676_253892949">19.23 chart:legend-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416678_253892949">19.24 chart:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416680_253892949">19.25 chart:repeated</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416682_253892949">19.26 chart:row-mapping (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416684_253892949">19.27 chart:style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416686_253892949">19.28 chart:values-cell-range-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416688_253892949">19.29 config:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416690_253892949">19.30 config:type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416692_253892949">19.31 db:additional-column-statement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416694_253892949">19.32 db:append-table-alias-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416696_253892949">19.33 db:apply-command</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416698_253892949">19.34 db:as-template</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416700_253892949">19.35 db:base-dn</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416702_253892949">19.36 db:boolean-comparison-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416704_253892949">19.37 db:catalog-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416706_253892949">19.38 db:command</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416708_253892949">19.39 db:data-source-setting-is-list</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416710_253892949">19.40 db:data-source-setting-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416712_253892949">19.41 db:data-source-setting-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416714_253892949">19.42 db:data-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416716_253892949">19.43 db:database-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416718_253892949">19.44 db:decimal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416720_253892949">19.45 db:default-cell-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416722_253892949">19.46 db:default-row-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416724_253892949">19.47 db:delete-rule</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416726_253892949">19.48 db:description</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416728_253892949">19.49 db:enable-sql92-check</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416730_253892949">19.50 db:encoding</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416732_253892949">19.51 db:escape-processing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416734_253892949">19.52 db:extension</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416736_253892949">19.53 db:field</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416738_253892949">19.54 db:hostname</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416740_253892949">19.55 db:ignore-driver-privileges</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416742_253892949">19.56 db:is-ascending</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416744_253892949">19.57 db:is-autoincrement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416746_253892949">19.58 db:is-clustered</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416748_253892949">19.59 db:is-empty-allowed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416750_253892949">19.60 db:is-first-row-header-line</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416752_253892949">19.61 db:login-timeout</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416754_253892949">19.62 db:is-nullable</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416756_253892949">19.63 db:is-password-required</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416758_253892949">19.64 db:is-unique</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416760_253892949">19.65 db:precision</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416762_253892949">19.66 db:is-table-name-length-limited</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416764_253892949">19.67 db:local-socket</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416766_253892949">19.68 db:max-row-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416768_253892949">19.69 db:media-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416770_253892949">19.70 db:name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416772_253892949">19.70.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416774_253892949">19.70.2 &lt;db:column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416776_253892949">19.70.3 &lt;db:column-definition&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416778_253892949">19.70.4 &lt;db:component&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416780_253892949">19.70.5 &lt;db:component-collection&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416782_253892949">19.70.6 &lt;db:index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416784_253892949">19.70.7 &lt;db:index-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416786_253892949">19.70.8 &lt;db:key&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416788_253892949">19.70.9 &lt;db:key-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416790_253892949">19.70.10 &lt;db:query&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416792_253892949">19.70.11 &lt;db:query-collection&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416794_253892949">19.70.12 &lt;db:table-definition&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416796_253892949">19.70.13 &lt;db:table-representation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416798_253892949">19.70.14 &lt;db:update-table&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416800_253892949">19.71 db:parameter-name-substitution</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416802_253892949">19.72 db:port</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416804_253892949">19.73 db:referenced-table-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416806_253892949">19.74 db:related-column-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416808_253892949">19.75 db:row-retrieving-statement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416810_253892949">19.76 db:scale</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416812_253892949">19.77 db:schema-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416814_253892949">19.78 db:show-deleted</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416816_253892949">19.79 db:string</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416818_253892949">19.80 db:style-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416820_253892949">19.80.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416822_253892949">19.80.2 &lt;db:column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416824_253892949">19.80.3 &lt;db:query&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416826_253892949">19.80.4 &lt;db:table-representation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416828_253892949">19.81 db:suppress-version-columns</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416830_253892949">19.82 db:system-driver-settings</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416832_253892949">19.83 db:thousand</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416834_253892949">19.84 db:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416836_253892949">19.85 db:type</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416838_253892949">19.85.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416840_253892949">19.85.2 &lt;db:key&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416842_253892949">19.85.3 &lt;db:server-database&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416844_253892949">19.85.4 &lt;db:table-definition&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416846_253892949">19.86 db:type-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416848_253892949">19.87 db:update-rule</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416850_253892949">19.88 db:use-catalog</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416852_253892949">19.89 db:use-system-user</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416854_253892949">19.90 db:user-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416856_253892949">19.91 db:visible</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416858_253892949">19.92 dr3d:ambient-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416860_253892949">19.93 dr3d:center</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416862_253892949">19.94 dr3d:diffuse-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416864_253892949">19.95 dr3d:direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416866_253892949">19.96 dr3d:distance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416868_253892949">19.97 dr3d:enabled</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416870_253892949">19.98 dr3d:focal-length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416872_253892949">19.99 dr3d:lighting-mode</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416874_253892949">19.99.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416876_253892949">19.99.2 &lt;chart:plot-area&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416878_253892949">19.99.3 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416880_253892949">19.100 dr3d:max-edge </a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416882_253892949">19.101 dr3d:min-edge</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416884_253892949">19.102 dr3d:projection</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416886_253892949">19.103 dr3d:shade-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416888_253892949">19.104 dr3d:shadow-slant</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416890_253892949">19.105 dr3d:size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416892_253892949">19.106 dr3d:specular</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416894_253892949">19.107 dr3d:transform</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416896_253892949">19.108 dr3d:vpn</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416898_253892949">19.109 dr3d:vrp</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416900_253892949">19.110 dr3d:vup</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416902_253892949">19.111 draw:align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416904_253892949">19.112 draw:angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416906_253892949">19.113 draw:archive</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416908_253892949">19.114 draw:border</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416910_253892949">19.115 draw:caption-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416912_253892949">19.116 draw:caption-point-x</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416914_253892949">19.117 draw:caption-point-y</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416916_253892949">19.118 draw:chain-next-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416918_253892949">19.119 draw:class-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416920_253892949">19.120 draw:class-names</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416922_253892949">19.121 draw:code</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416924_253892949">19.122 draw:color</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416926_253892949">19.122.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416928_253892949">19.122.2 &lt;draw:hatch&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416930_253892949">19.122.3 &lt;presentation:dim&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416932_253892949">19.123 draw:concave</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416934_253892949">19.124 draw:concentric-gradient-fill-allowed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416936_253892949">19.125 draw:control</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416938_253892949">19.126 draw:copy-of</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416940_253892949">19.127 draw:corner-radius</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416942_253892949">19.128 draw:corners</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416944_253892949">19.129 draw:cx</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416946_253892949">19.130 draw:cy</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416948_253892949">19.131 draw:data</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416950_253892949">19.132 draw:display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416952_253892949">19.133 draw:display-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416954_253892949">19.133.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416956_253892949">19.133.2 &lt;draw:fill-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416958_253892949">19.133.3 &lt;draw:gradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416960_253892949">19.133.4 &lt;draw:hatch&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416962_253892949">19.133.5 &lt;draw:marker&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416964_253892949">19.133.6 &lt;draw:opacity&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416966_253892949">19.133.7 &lt;draw:stroke-dash&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416968_253892949">19.133.8 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416970_253892949">19.133.9 &lt;svg:radialGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416972_253892949">19.134 draw:distance</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416974_253892949">19.134.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416976_253892949">19.134.2 &lt;draw:hatch&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1416978_253892949">19.134.3 &lt;draw:stroke-dash&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416980_253892949">19.135 draw:dots1</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416982_253892949">19.136 draw:dots1-length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416984_253892949">19.137 draw:dots2</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416986_253892949">19.138 draw:dots2-length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416988_253892949">19.139 draw:end</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416990_253892949">19.140 draw:end-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416992_253892949">19.141 draw:end-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416994_253892949">19.142 draw:end-glue-point</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416996_253892949">19.143 draw:end-intensity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1416998_253892949">19.144 draw:end-shape</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417000_253892949">19.145 draw:enhanced-path</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417002_253892949">19.146 draw:engine</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417004_253892949">19.147 draw:escape-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417006_253892949">19.148 draw:extrusion</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417008_253892949">19.149 draw:extrusion-allowed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417010_253892949">19.150 draw:extrusion-brightness</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417012_253892949">19.151 draw:extrusion-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417014_253892949">19.152 draw:extrusion-depth</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417016_253892949">19.153 draw:extrusion-diffusion</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417018_253892949">19.154 draw:extrusion-first-light-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417020_253892949">19.155 draw:extrusion-first-light-harsh</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417022_253892949">19.156 draw:extrusion-first-light-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417024_253892949">19.157 draw:extrusion-light-face</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417026_253892949">19.158 draw:extrusion-metal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417028_253892949">19.159 draw:extrusion-number-of-line-segments</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417030_253892949">19.160 draw:extrusion-origin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417032_253892949">19.161 draw:extrusion-rotation-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417034_253892949">19.162 draw:extrusion-rotation-center</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417036_253892949">19.163 draw:extrusion-second-light-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417038_253892949">19.164 draw:extrusion-second-light-harsh</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417040_253892949">19.165 draw:extrusion-second-light-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417042_253892949">19.166 draw:extrusion-shininess</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417044_253892949">19.167 draw:extrusion-skew</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417046_253892949">19.168 draw:extrusion-specularity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417048_253892949">19.169 draw:extrusion-viewpoint</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417050_253892949">19.170 draw:filter-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417052_253892949">19.171 draw:formula</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417054_253892949">19.172 draw:frame-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417056_253892949">19.173 draw:glue-point-leaving-directions</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417058_253892949">19.174 draw:glue-point-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417060_253892949">19.175 draw:glue-points</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417062_253892949">19.176 draw:handle-mirror-horizontal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417064_253892949">19.177 draw:handle-mirror-vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417066_253892949">19.178 draw:handle-polar</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417068_253892949">19.179 draw:handle-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417070_253892949">19.180 draw:handle-radius-range-maximum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417072_253892949">19.181 draw:handle-radius-range-minimum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417074_253892949">19.182 draw:handle-range-x-maximum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417076_253892949">19.183 draw:handle-range-x-minimum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417078_253892949">19.184 draw:handle-range-y-maximum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417080_253892949">19.185 draw:handle-range-y-minimum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417082_253892949">19.186 draw:handle-switched</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417084_253892949">19.187 draw:id</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417086_253892949">19.187.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417088_253892949">19.187.2 &lt;draw:glue-point&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417090_253892949">19.187.3 &lt;dr3d:cube&gt;, &lt;dr3d:extrude&gt;, &lt;dr3d:rotate&gt;, &lt;dr3d:scene&gt;, &lt;dr3d:sphere&gt;, &lt;draw:caption&gt;, &lt;draw:circle&gt;, &lt;draw:connector&gt;, &lt;draw:control&gt;, &lt;draw:custom-shape&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:g&gt;, &lt;draw:line&gt;, &lt;draw:measure&gt;, &lt;draw:page&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:rect&gt;, &lt;draw:regular-polygon&gt; and &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417092_253892949">19.188 draw:kind</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417094_253892949">19.189 draw:layer</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417096_253892949">19.190 draw:line-skew</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417098_253892949">19.191 draw:mime-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417100_253892949">19.192 draw:mirror-horizontal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417102_253892949">19.193 draw:mirror-vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417104_253892949">19.194 draw:master-page-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417106_253892949">19.195 draw:may-script</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417108_253892949">19.196 draw:modifiers</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417110_253892949">19.197 draw:name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417112_253892949">19.197.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417114_253892949">19.197.2 &lt;draw:caption&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417116_253892949">19.197.3 &lt;draw:circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417118_253892949">19.197.4 &lt;draw:connector&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417120_253892949">19.197.5 &lt;draw:control&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417122_253892949">19.197.6 &lt;draw:custom-shape&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417124_253892949">19.197.7 &lt;draw:ellipse&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417126_253892949">19.197.8 &lt;draw:equation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417128_253892949">19.197.9 &lt;draw:fill-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417130_253892949">19.197.10 &lt;draw:frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417132_253892949">19.197.11 &lt;draw:g&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417134_253892949">19.197.12 &lt;draw:gradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417136_253892949">19.197.13 &lt;draw:hatch&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417138_253892949">19.197.14 &lt;draw:layer&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417140_253892949">19.197.15 &lt;draw:line&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417142_253892949">19.197.16 &lt;draw:marker&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417144_253892949">19.197.17 &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417146_253892949">19.197.18 &lt;draw:opacity&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417148_253892949">19.197.19 &lt;draw:page&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417150_253892949">19.197.20 &lt;draw:page-thumbnail&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417152_253892949">19.197.21 &lt;draw:param&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417154_253892949">19.197.22 &lt;draw:path&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417156_253892949">19.197.23 &lt;draw:polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417158_253892949">19.197.24 &lt;draw:polyline&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417160_253892949">19.197.25 &lt;draw:rect&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417162_253892949">19.197.26 &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417164_253892949">19.197.27 &lt;draw:stroke-dash&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417166_253892949">19.197.28 &lt;office:annotation&gt; (deprecated)</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417168_253892949">19.197.29 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417170_253892949">19.197.30 &lt;svg:radialGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417172_253892949">19.198 draw:nav-order</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417174_253892949">19.199 draw:nohref</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417176_253892949">19.200 draw:notify-on-update-of-ranges</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417178_253892949">19.201 draw:object</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417180_253892949">19.202 draw:opacity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417182_253892949">19.203 draw:page-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417184_253892949">19.204 draw:path-stretchpoint-x</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417186_253892949">19.205 draw:path-stretchpoint-y</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417188_253892949">19.206 draw:points</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417190_253892949">19.207 draw:protected</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417192_253892949">19.208 draw:recreate-on-edit</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417194_253892949">19.209 draw:rotation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417196_253892949">19.210 draw:shape-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417198_253892949">19.211 draw:sharpness</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417200_253892949">19.212 draw:start</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417202_253892949">19.213 draw:start-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417204_253892949">19.214 draw:start-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417206_253892949">19.215 draw:start-glue-point</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417208_253892949">19.216 draw:start-intensity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417210_253892949">19.217 draw:start-shape</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417212_253892949">19.218 draw:style</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417214_253892949">19.218.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417216_253892949">19.218.2 &lt;draw:gradient&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417218_253892949">19.218.3 &lt;draw:hatch&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417220_253892949">19.218.4 &lt;draw:opacity&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417222_253892949">19.218.5 &lt;draw:stroke-dash&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417224_253892949">19.219 draw:style-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417226_253892949">19.219.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417228_253892949">19.219.2 &lt;dr3d:cube&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417230_253892949">19.219.3 &lt;dr3d:extrude&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417232_253892949">19.219.4 &lt;dr3d:rotate&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417234_253892949">19.219.5 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417236_253892949">19.219.6 &lt;dr3d:sphere&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417238_253892949">19.219.7 &lt;draw:caption&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417240_253892949">19.219.8 &lt;draw:circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417242_253892949">19.219.9 &lt;draw:connector&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417244_253892949">19.219.10 &lt;draw:control&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417246_253892949">19.219.11 &lt;draw:custom-shape&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417248_253892949">19.219.12 &lt;draw:ellipse&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417250_253892949">19.219.13 &lt;draw:frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417252_253892949">19.219.14 &lt;draw:g&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417254_253892949">19.219.15 &lt;draw:line&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417256_253892949">19.219.16 &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417258_253892949">19.219.17 &lt;draw:page&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417260_253892949">19.219.18 &lt;draw:page-thumbnail&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417262_253892949">19.219.19 &lt;draw:path&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417264_253892949">19.219.20 &lt;draw:polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417266_253892949">19.219.21 &lt;draw:polyline&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417268_253892949">19.219.22 &lt;draw:rect&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417270_253892949">19.219.23 &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417272_253892949">19.219.24 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417274_253892949">19.219.25 &lt;presentation:notes&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417276_253892949">19.219.26 &lt;style:handout-master&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417278_253892949">19.219.27 &lt;style:master-page&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417280_253892949">19.220 draw:text-areas</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417282_253892949">19.221 draw:text-path</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417284_253892949">19.222 draw:text-path-allowed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417286_253892949">19.223 draw:text-path-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417288_253892949">19.224 draw:text-path-same-letter-heights</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417290_253892949">19.225 draw:text-path-scale</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417292_253892949">19.226 draw:text-rotate-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417294_253892949">19.227 draw:text-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417296_253892949">19.228 draw:transform</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417298_253892949">19.229 draw:type</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417300_253892949">19.229.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417302_253892949">19.229.2 &lt;draw:connector&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417304_253892949">19.229.3 &lt;draw:enhanced-geometry&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417306_253892949">19.230 draw:value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417308_253892949">19.231 draw:z-index</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417310_253892949">19.232 fo:column-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417312_253892949">19.233 fo:column-gap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417314_253892949">19.234 fo:country</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417316_253892949">19.234.1 &lt;text:alphabetical-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417318_253892949">19.234.2 &lt;text:bibliography-configuration&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417320_253892949">19.235 fo:end-indent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417322_253892949">19.236 fo:language</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417324_253892949">19.236.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417326_253892949">19.236.2 &lt;text:alphabetical-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417328_253892949">19.236.3 &lt;text:bibliography-configuration&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417330_253892949">19.237 fo:margin-left</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417332_253892949">19.238 fo:max-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417334_253892949">19.239 fo:max-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417336_253892949">19.240 fo:min-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417338_253892949">19.241 fo:min-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417340_253892949">19.242 fo:script</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417342_253892949">19.242.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417344_253892949">19.242.2 &lt;text:alphabetical-index-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417346_253892949">19.242.3 &lt;text:bibliography-configuration&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417348_253892949">19.243 fo:space-after</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417350_253892949">19.244 fo:space-before</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417352_253892949">19.245 fo:start-indent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417354_253892949">19.246 fo:text-indent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417356_253892949">19.247 form:allow-deletes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417358_253892949">19.248 form:allow-inserts</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417360_253892949">19.249 form:allow-updates</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417362_253892949">19.250 form:apply-design-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417364_253892949">19.251 form:apply-filter</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417366_253892949">19.252 form:auto-complete</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417368_253892949">19.253 form:automatic-focus</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417370_253892949">19.254 form:bound-column</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417372_253892949">19.255 form:button-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417374_253892949">19.256 form:command</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417376_253892949">19.257 form:command-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417378_253892949">19.258 form:control-implementation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417380_253892949">19.259 form:convert-empty-to-null</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417382_253892949">19.260 form:current-selected</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417384_253892949">19.261 form:current-state</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417386_253892949">19.262 form:current-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417388_253892949">19.263 form:data-field</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417390_253892949">19.264 form:datasource</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417392_253892949">19.265 form:default-button</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417394_253892949">19.266 form:delay-for-repeat</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417396_253892949">19.267 form:detail-fields</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417398_253892949">19.268 form:disabled</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417400_253892949">19.269 form:dropdown</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417402_253892949">19.270 form:echo-char</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417404_253892949">19.271 form:enctype</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417406_253892949">19.272 form:escape-processing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417408_253892949">19.273 form:filter</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417410_253892949">19.274 form:focus-on-click</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417412_253892949">19.275 form:for</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417414_253892949">19.276 form:id (deprecated) </a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417416_253892949">19.277 form:ignore-result</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417418_253892949">19.278 form:image-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417420_253892949">19.279 form:image-data</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417422_253892949">19.280 form:image-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417424_253892949">19.281 form:is-tristate</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417426_253892949">19.282 form:label</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417428_253892949">19.283 form:linked-cell</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417430_253892949">19.284 form:list-linkage-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417432_253892949">19.285 form:list-source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417434_253892949">19.286 form:list-source-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417436_253892949">19.287 form:master-fields</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417438_253892949">19.288 form:max-length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417440_253892949">19.289 form:max-value</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718308_1219268628">19.289.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718310_1219268628">19.289.2 &lt;form:date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718312_1219268628">19.289.3 &lt;form:formatted-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718314_1219268628">19.289.4 &lt;form:number&gt; and &lt;form:value-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718316_1219268628">19.289.5 &lt;form:time&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417442_253892949">19.290 form:min-value</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718318_1219268628">19.290.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718320_1219268628">19.290.2 &lt;form:date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718322_1219268628">19.290.3 &lt;form:formatted-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718324_1219268628">19.290.4 &lt;form:number&gt; and &lt;form:value-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718326_1219268628">19.290.5 &lt;form:time&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417444_253892949">19.291 form:method</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417446_253892949">19.292 form:multi-line</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417448_253892949">19.293 form:multiple</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417450_253892949">19.294 form:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417452_253892949">19.295 form:navigation-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417454_253892949">19.296 form:order</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417456_253892949">19.297 form:orientation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417458_253892949">19.298 form:page-step-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417460_253892949">19.299 form:printable</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417462_253892949">19.300 form:property-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417464_253892949">19.301 form:readonly</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417466_253892949">19.302 form:repeat</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417468_253892949">19.303 form:selected</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417470_253892949">19.304 form:size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417472_253892949">19.305 form:source-cell-range</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417474_253892949">19.306 form:spin-button</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417476_253892949">19.307 form:state</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417478_253892949">19.308 form:step-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417480_253892949">19.309 form:tab-cycle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417482_253892949">19.310 form:tab-index</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417484_253892949">19.311 form:tab-stop</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417486_253892949">19.312 form:text-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417488_253892949">19.313 form:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417490_253892949">19.314 form:toggle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417492_253892949">19.315 form:validation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417494_253892949">19.316 form:value</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718328_1219268628">19.316.1 General </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718330_1219268628">19.316.2 &lt;form:button&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718332_1219268628">19.316.3 &lt;form:date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718334_1219268628">19.316.4 &lt;form:number&gt; and &lt;form:value-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718336_1219268628">19.316.5 &lt;form:checkbox&gt;, &lt;form:combobox&gt;, &lt;form:file&gt;, &lt;form:formatted-text&gt;, &lt;form:hidden&gt;, &lt;form:image&gt;, &lt;form:option&gt;, &lt;form:password&gt;, &lt;form:radio&gt;, &lt;form:text&gt;, &lt;form:textarea&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718338_1219268628">19.316.6 &lt;form:time&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417496_253892949">19.317 form:visual-effect</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417498_253892949">19.318 form:xforms-list-source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417500_253892949">19.319 form:xforms-submission</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417502_253892949">19.320 grddl:transformation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417504_253892949">19.321 meta:cell-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417506_253892949">19.322 meta:character-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417508_253892949">19.323 meta:date</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417510_253892949">19.324 meta:delay</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417512_253892949">19.325 meta:draw-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417514_253892949">19.326 meta:frame-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417516_253892949">19.327 meta:image-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417518_253892949">19.328 meta:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417520_253892949">19.329 meta:non-whitespace-character-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417522_253892949">19.330 meta:object-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417524_253892949">19.331 meta:ole-object-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417526_253892949">19.332 meta:page-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417528_253892949">19.333 meta:paragraph-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417530_253892949">19.334 meta:row-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417532_253892949">19.335 meta:sentence-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417534_253892949">19.336 meta:syllable-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417536_253892949">19.337 meta:table-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417538_253892949">19.338 meta:value-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417540_253892949">19.339 meta:word-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417542_253892949">19.340 number:automatic-order</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417544_253892949">19.341 number:calendar</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417546_253892949">19.342 number:country</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417548_253892949">19.343 number:decimal-places</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417550_253892949">19.343.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417552_253892949">19.343.2 &lt;number:number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417554_253892949">19.343.3 &lt;number:seconds&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417556_253892949">19.343.4 &lt;number:scientific-number&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417558_253892949">19.344 number:decimal-replacement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417560_253892949">19.345 number:denominator-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417562_253892949">19.346 number:display-factor</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417564_253892949">19.347 number:format-source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417566_253892949">19.348 number:grouping</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417568_253892949">19.349 number:language</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417570_253892949">19.350 number:min-denominator-digits</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417572_253892949">19.351 number:min-exponent-digits</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417574_253892949">19.352 number:min-integer-digits</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417576_253892949">19.353 number:min-numerator-digits</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417578_253892949">19.354 number:position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417580_253892949">19.355 number:possessive-form</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417582_253892949">19.356 number:rfc-language-tag</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417584_253892949">19.357 number:script</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417586_253892949">19.358 number:style</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417588_253892949">19.358.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417590_253892949">19.358.2 &lt;number:day&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417592_253892949">19.358.3 &lt;number:day-of-week&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417594_253892949">19.358.4 &lt;number:era&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417596_253892949">19.358.5 &lt;number:hours&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417598_253892949">19.358.6 &lt;number:minutes&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417600_253892949">19.358.7 &lt;number:month&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417602_253892949">19.358.8 &lt;number:quarter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417604_253892949">19.358.9 &lt;number:seconds&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417606_253892949">19.358.10 &lt;number:year&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417608_253892949">19.359 number:textual</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417610_253892949">19.360 number:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417612_253892949">19.361 number:transliteration-country</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417614_253892949">19.362 number:transliteration-format</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417616_253892949">19.363 number:transliteration-language</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417618_253892949">19.364 number:transliteration-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417620_253892949">19.365 number:truncate-on-overflow</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417622_253892949">19.366 office:automatic-update</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417624_253892949">19.367 office:boolean-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417626_253892949">19.368 office:conversion-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417628_253892949">19.369 office:currency</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417630_253892949">19.370 office:date-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417632_253892949">19.371 office:dde-application</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417634_253892949">19.372 office:dde-item</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417636_253892949">19.373 office:dde-topic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417638_253892949">19.374 office:display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417640_253892949">19.375 office:mimetype</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417642_253892949">19.376 office:name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417644_253892949">19.376.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417646_253892949">19.376.2 &lt;draw:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417648_253892949">19.376.3 &lt;draw:area-circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417650_253892949">19.376.4 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417652_253892949">19.376.5 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417654_253892949">19.376.6 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417656_253892949">19.376.7 &lt;office:annotation-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417658_253892949">19.376.8 &lt;office:dde-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417660_253892949">19.376.9 &lt;text:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417662_253892949">19.376.10 &lt;text:dde-connection-decl&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417664_253892949">19.377 office:process-content (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417666_253892949">19.378 office:server-map</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417668_253892949">19.379 office:string-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417670_253892949">19.380 office:target-frame</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417672_253892949">19.381 office:target-frame-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417674_253892949">19.382 office:time-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417676_253892949">19.383 office:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417678_253892949">19.384 office:value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417680_253892949">19.385 office:value-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417682_253892949">19.386 office:version</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417684_253892949">19.387 presentation:action</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417686_253892949">19.388 presentation:animations</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417688_253892949">19.389 presentation:class</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417690_253892949">19.390 presentation:class-names</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417692_253892949">19.391 presentation:delay</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417694_253892949">19.392 presentation:direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417696_253892949">19.393 presentation:endless</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417698_253892949">19.394 presentation:effect</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417700_253892949">19.395 presentation:force-manual</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417702_253892949">19.396 presentation:full-screen</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417704_253892949">19.397 presentation:group-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417706_253892949">19.398 presentation:master-element</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417708_253892949">19.399 presentation:mouse-as-pen</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417710_253892949">19.400 presentation:mouse-visible</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417712_253892949">19.401 presentation:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417714_253892949">19.402 presentation:node-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417716_253892949">19.403 presentation:object</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417718_253892949">19.404 presentation:pages</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417720_253892949">19.405 presentation:path-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417722_253892949">19.406 presentation:pause</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417724_253892949">19.407 presentation:placeholder</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417726_253892949">19.408 presentation:play-full</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417728_253892949">19.409 presentation:presentation-page-layout-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417730_253892949">19.410 presentation:preset-class</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417732_253892949">19.411 presentation:preset-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417734_253892949">19.412 presentation:preset-sub-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417736_253892949">19.413 presentation:show</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417738_253892949">19.414 presentation:show-end-of-presentation-slide</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417740_253892949">19.415 presentation:show-logo</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417742_253892949">19.416 presentation:source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417744_253892949">19.417 presentation:speed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417746_253892949">19.418 presentation:start-scale</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417748_253892949">19.419 presentation:start-page</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417750_253892949">19.420 presentation:start-with-navigator</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417752_253892949">19.421 presentation:stay-on-top</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417754_253892949">19.422 presentation:style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417756_253892949">19.423 presentation:transition-on-click</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417758_253892949">19.424 presentation:use-date-time-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417760_253892949">19.425 presentation:use-footer-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417762_253892949">19.426 presentation:use-header-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417764_253892949">19.427 presentation:user-transformed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417766_253892949">19.428 presentation:verb</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417768_253892949">19.429 script:event-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417770_253892949">19.430 script:language</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417772_253892949">19.431 script:macro-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417774_253892949">19.432 smil:accelerate</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417776_253892949">19.433 smil:accumulate</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417778_253892949">19.434 smil:additive</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417780_253892949">19.435 smil:attributeName</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417782_253892949">19.436 smil:autoReverse</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417784_253892949">19.437 smil:begin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417786_253892949">19.438 smil:by</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417788_253892949">19.439 smil:calcMode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417790_253892949">19.440 smil:decelerate</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417792_253892949">19.441 smil:direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417794_253892949">19.442 smil:dur</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417796_253892949">19.443 smil:end</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417798_253892949">19.444 smil:endsync</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417800_253892949">19.445 smil:fadeColor</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417802_253892949">19.446 smil:fill</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417804_253892949">19.447 smil:fillDefault</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417806_253892949">19.448 smil:from</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417808_253892949">19.449 smil:keySplines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417810_253892949">19.450 smil:keyTimes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417812_253892949">19.451 smil:mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417814_253892949">19.452 smil:repeatCount</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417816_253892949">19.453 smil:repeatDur</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417818_253892949">19.454 smil:restart</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417820_253892949">19.455 smil:restartDefault</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417822_253892949">19.456 smil:subtype</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417824_253892949">19.457 smil:targetElement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417826_253892949">19.458 smil:to</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417828_253892949">19.459 smil:type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417830_253892949">19.460 smil:values</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417832_253892949">19.461 style:adjustment</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417834_253892949">19.462 style:apply-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417836_253892949">19.463 style:auto-update</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417838_253892949">19.464 style:base-cell-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417840_253892949">19.465 style:char</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417842_253892949">19.466 style:class</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417844_253892949">19.467 style:color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417846_253892949">19.468 style:condition</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417848_253892949">19.469 style:data-style-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417850_253892949">19.469.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417852_253892949">19.469.2 &lt;presentation:date-time-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417854_253892949">19.469.3 &lt;style:style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417856_253892949">19.469.4 &lt;text:creation-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417858_253892949">19.469.5 &lt;text:creation-time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417860_253892949">19.469.6 &lt;text:database-display&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417862_253892949">19.469.7 &lt;text:date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417864_253892949">19.469.8 &lt;text:editing-duration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417866_253892949">19.469.9 &lt;text:expression&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417868_253892949">19.469.10 &lt;text:meta-field&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417870_253892949">19.469.11 &lt;text:modification-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417872_253892949">19.469.12 &lt;text:modification-time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417874_253892949">19.469.13 &lt;text:print-date&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417876_253892949">19.469.14 &lt;text:print-time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417878_253892949">19.469.15 &lt;text:table-formula&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417880_253892949">19.469.16 &lt;text:time&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417882_253892949">19.469.17 &lt;text:user-defined&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417884_253892949">19.469.18 &lt;text:user-field-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417886_253892949">19.469.19 &lt;text:user-field-input&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417888_253892949">19.469.20 &lt;text:variable-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417890_253892949">19.469.21 &lt;text:variable-input&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417892_253892949">19.469.22 &lt;text:variable-set&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417894_253892949">19.470 style:default-outline-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417896_253892949">19.471 style:display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417898_253892949">19.472 style:display-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417900_253892949">19.473 style:distance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417902_253892949">19.474 style:distance-before-sep</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417904_253892949">19.475 style:distance-after-sep</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417906_253892949">19.476 style:family</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417908_253892949">19.477 style:filter-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417910_253892949">19.478 style:font-adornments</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417912_253892949">19.479 style:font-charset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417914_253892949">19.480 style:font-family-generic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417916_253892949">19.481 style:font-pitch</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417918_253892949">19.482 style:height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417920_253892949">19.483 style:leader-char</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417922_253892949">19.484 style:leader-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417924_253892949">19.485 style:leader-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417926_253892949">19.486 style:leader-text</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417928_253892949">19.487 style:leader-text-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417930_253892949">19.488 style:leader-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417932_253892949">19.489 style:leader-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417934_253892949">19.490 style:legend-expansion</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417936_253892949">19.491 style:legend-expansion-aspect-ratio</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417938_253892949">19.492 style:length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417940_253892949">19.493 style:line-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417942_253892949">19.494 style:lines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417944_253892949">19.495 style:list-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417946_253892949">19.496 style:list-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417948_253892949">19.497 style:master-page-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417950_253892949">19.498 style:name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417952_253892949">19.498.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417954_253892949">19.498.2 &lt;number:boolean-style&gt;, &lt;number:currency-style&gt;, &lt;number:date-style&gt;, &lt;number:number-style&gt;, &lt;number:percentage-style&gt;, &lt;number:text-style&gt;, &lt;number:time-style&gt;, &lt;style:master-page&gt;, &lt;style:page-layout&gt;, &lt;style:presentation-page-layout&gt;, &lt;style:style&gt;, &lt;text:list-style&gt;, &lt;text:outline-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417956_253892949">19.498.3 &lt;style:font-face&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417958_253892949">19.499 style:next-style-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417960_253892949">19.499.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417962_253892949">19.499.2 &lt;style:master-page&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417964_253892949">19.499.3 &lt;style:style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417966_253892949">19.500 style:num-format</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417968_253892949">19.501 style:num-letter-sync</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417970_253892949">19.502 style:num-prefix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417972_253892949">19.503 style:num-suffix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417974_253892949">19.504 style:page-layout-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417976_253892949">19.505 style:page-usage</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417978_253892949">19.506 style:parent-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417980_253892949">19.507 style:percentage-data-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417982_253892949">19.508 style:position</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417984_253892949">19.508.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417986_253892949">19.508.2 &lt;style:background-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417988_253892949">19.508.3 &lt;style:tab-stop&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417990_253892949">19.508.4 &lt;text:index-entry-tab-stop&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417992_253892949">19.509 style:rel-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1417994_253892949">19.510 style:rel-width</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417996_253892949">19.510.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1417998_253892949">19.510.2 &lt;draw:frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418000_253892949">19.510.3 &lt;style:column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418002_253892949">19.510.4 &lt;style:footnote-sep&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418004_253892949">19.511 style:repeat</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418006_253892949">19.512 style:rfc-language-tag</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418008_253892949">19.513 style:style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418010_253892949">19.514 style:style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418012_253892949">19.515 style:type</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418014_253892949">19.515.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418016_253892949">19.515.2 &lt;text:index-entry-tab-stop&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418018_253892949">19.515.3 &lt;style:tab-stop&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418020_253892949">19.516 style:vertical-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418022_253892949">19.517 style:volatile</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418024_253892949">19.518 style:width</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418026_253892949">19.518.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418028_253892949">19.518.2 &lt;style:column-sep&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418030_253892949">19.518.3 &lt;style:footnote-sep&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418032_253892949">19.519 svg:accent-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418034_253892949">19.520 svg:alphabetic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418036_253892949">19.521 svg:ascent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418038_253892949">19.522 svg:bbox</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418040_253892949">19.523 svg:cap-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418042_253892949">19.524 svg:cx</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418044_253892949">19.524.1 &lt;draw:area-circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418046_253892949">19.524.2 &lt;draw:circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418048_253892949">19.524.3 &lt;draw:ellipse&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418050_253892949">19.524.4 &lt;svg:radialGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418052_253892949">19.525 svg:cy</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418054_253892949">19.525.1 &lt;draw:area-circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418056_253892949">19.525.2 &lt;draw:circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418058_253892949">19.525.3 &lt;draw:ellipse&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418060_253892949">19.525.4 &lt;svg:radialGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418062_253892949">19.526 svg:d</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418064_253892949">19.527 svg:descent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418066_253892949">19.528 svg:font-family</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418068_253892949">19.529 svg:font-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418070_253892949">19.530 svg:font-stretch</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418072_253892949">19.531 svg:font-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418074_253892949">19.532 svg:font-variant</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418076_253892949">19.533 svg:font-weight</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418078_253892949">19.534 svg:fx</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418080_253892949">19.535 svg:fy</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418082_253892949">19.536 svg:gradientTransform</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418084_253892949">19.537 svg:gradientUnits</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418086_253892949">19.538 svg:hanging</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418088_253892949">19.539 svg:height</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418090_253892949">19.539.1 &lt;chart:chart&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418092_253892949">19.539.2 &lt;chart:plot-area&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418094_253892949">19.539.3 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418096_253892949">19.539.4 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418098_253892949">19.539.5 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418100_253892949">19.539.6 &lt;draw:contour-polygon&gt;, &lt;draw:contour-path&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418102_253892949">19.539.7 &lt;draw:fill-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418104_253892949">19.539.8 &lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418106_253892949">19.539.9 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418108_253892949">19.539.10 &lt;presentation:placeholder&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418110_253892949">19.540 svg:ideographic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418112_253892949">19.541 svg:mathematical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418114_253892949">19.542 svg:name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418116_253892949">19.543 svg:offset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418118_253892949">19.544 svg:origin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418120_253892949">19.545 svg:overline-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418122_253892949">19.546 svg:overline-thickness</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418124_253892949">19.547 svg:panose-1</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418126_253892949">19.548 svg:path</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418128_253892949">19.549 svg:r</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418130_253892949">19.549.1 &lt;draw:area-circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418132_253892949">19.549.2 &lt;draw:circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418134_253892949">19.549.3 &lt;svg:radialGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418136_253892949">19.550 svg:rx</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418138_253892949">19.551 svg:ry</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418140_253892949">19.552 svg:slope</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418142_253892949">19.553 svg:spreadMethod</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418144_253892949">19.554 svg:stemh</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418146_253892949">19.555 svg:stemv</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418148_253892949">19.556 svg:stop-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418150_253892949">19.557 svg:stop-opacity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418152_253892949">19.558 svg:strikethrough-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418154_253892949">19.559 svg:strikethrough-thickness</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418156_253892949">19.560 svg:string</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418158_253892949">19.561 svg:type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418160_253892949">19.562 svg:underline-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418162_253892949">19.563 svg:underline-thickness</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418164_253892949">19.564 svg:unicode-range</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418166_253892949">19.565 svg:units-per-em</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418168_253892949">19.566 svg:v-alphabetic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418170_253892949">19.567 svg:v-hanging</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418172_253892949">19.568 svg:v-ideographic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418174_253892949">19.569 svg:v-mathematical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418176_253892949">19.570 svg:viewBox</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418178_253892949">19.571 svg:width</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418180_253892949">19.571.1 &lt;chart:chart&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418182_253892949">19.571.2 &lt;chart:floor&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418184_253892949">19.571.3 &lt;chart:plot-area&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418186_253892949">19.571.4 &lt;chart:wall&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418188_253892949">19.571.5 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418190_253892949">19.571.6 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418192_253892949">19.571.7 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418194_253892949">19.571.8 &lt;draw:contour-polygon&gt;, &lt;draw:contour-path&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418196_253892949">19.571.9 &lt;draw:fill-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418198_253892949">19.571.10 &lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418200_253892949">19.571.11 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418202_253892949">19.571.12 &lt;presentation:placeholder&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418204_253892949">19.572 svg:widths</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418206_253892949">19.573 svg:x</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418208_253892949">19.573.1 &lt;chart:data-label&gt;, &lt;chart:equation&gt;, &lt;chart:footer&gt;, &lt;chart:legend&gt;, &lt;chart:plot-area&gt;, &lt;chart:subtitle&gt;, &lt;chart:title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418210_253892949">19.573.2 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418212_253892949">19.573.3 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418214_253892949">19.573.4 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418216_253892949">19.573.5 &lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418218_253892949">19.573.6 &lt;draw:glue-point&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418220_253892949">19.573.7 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418222_253892949">19.573.8 &lt;presentation:placeholder&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418224_253892949">19.574 svg:x1</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418226_253892949">19.574.1 &lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418228_253892949">19.574.2 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418230_253892949">19.575 svg:x2 </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418232_253892949">19.575.1 &lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418234_253892949">19.575.2 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418236_253892949">19.576 svg:x-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418238_253892949">19.577 svg:y</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418240_253892949">19.577.1 &lt;chart:data-label&gt;, &lt;chart:equation&gt;, &lt;chart:footer&gt;, &lt;chart:legend&gt;, &lt;chart:plot-area&gt;, &lt;chart:subtitle&gt;, &lt;chart:title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418242_253892949">19.577.2 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418244_253892949">19.577.3 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418246_253892949">19.577.4 &lt;dr3d:scene&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418248_253892949">19.577.5 &lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:g&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418250_253892949">19.577.6 &lt;draw:glue-point&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418252_253892949">19.577.7 &lt;office:annotation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418254_253892949">19.577.8 &lt;presentation:placeholder&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418256_253892949">19.578 svg:y1</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418258_253892949">19.578.1 &lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418260_253892949">19.578.2 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418262_253892949">19.579 svg:y2</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418264_253892949">19.579.1 &lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418266_253892949">19.579.2 &lt;svg:linearGradient&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418268_253892949">19.580 table:acceptance-state</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418270_253892949">19.581 table:algorithm</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418272_253892949">19.582 table:add-empty-lines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418274_253892949">19.583 table:allow-empty-cell</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418276_253892949">19.584 table:application-data</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418278_253892949">19.585 table:automatic-find-labels</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418280_253892949">19.586 table:base-cell-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418282_253892949">19.587 table:bind-styles-to-content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418284_253892949">19.588 table:border-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418286_253892949">19.589 table:buttons</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418288_253892949">19.590 table:case-sensitive</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418290_253892949">19.591 table:cell-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418292_253892949">19.592 table:cell-range</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418294_253892949">19.593 table:cell-range-address</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418296_253892949">19.593.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418298_253892949">19.593.2 &lt;chart:categories&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418300_253892949">19.593.3 &lt;chart:domain&gt; - bubble</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418302_253892949">19.593.4 &lt;chart:domain&gt;- scatter</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1718340_1219268628">19.593.5 &lt;chart:domain&gt; - surface</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418304_253892949">19.593.6 &lt;chart:plot-area&gt; (deprecated)</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418306_253892949">19.593.7 &lt;table:highlighted-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418308_253892949">19.593.8 &lt;table:named-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418310_253892949">19.593.9 &lt;table:source-cell-range&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418312_253892949">19.594 table:column</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418314_253892949">19.595 table:comment</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418316_253892949">19.596 table:condition</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418318_253892949">19.597 table:condition-source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418320_253892949">19.598 table:condition-source-range-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418322_253892949">19.599 table:contains-error</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418324_253892949">19.600 table:contains-header</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418326_253892949">19.601 table:content-validation-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418328_253892949">19.602 table:copy-back</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418330_253892949">19.603 table:copy-formulas</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418332_253892949">19.604 table:copy-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418334_253892949">19.605 table:count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418336_253892949">19.606 table:country</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418338_253892949">19.607 table:data-field</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418340_253892949">19.608 table:data-cell-range-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418342_253892949">19.609 table:database-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418344_253892949">19.610 table:database-table-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418346_253892949">19.611 table:data-type</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418348_253892949">19.611.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418350_253892949">19.611.2 &lt;table:filter-condition&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418352_253892949">19.611.3 &lt;table:sort-by&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418354_253892949">19.611.4 &lt;table:sort-groups&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418356_253892949">19.612 table:date-end</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418358_253892949">19.613 table:date-start</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418360_253892949">19.614 table:date-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418362_253892949">19.615 table:default-cell-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418364_253892949">19.616 table:direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418366_253892949">19.617 table:display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418368_253892949">19.618 table:display-border</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418370_253892949">19.619 table:display-duplicates</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418372_253892949">19.620 table:display-filter-buttons</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418374_253892949">19.621 table:display-list</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418376_253892949">19.622 table:display-member-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418378_253892949">19.623 table:drill-down-on-double-click</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418380_253892949">19.624 table:embedded-number-behavior</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418382_253892949">19.625 table:enabled</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418384_253892949">19.626 table:end</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418386_253892949">19.627 table:end-cell-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418388_253892949">19.628 table:end-column</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418390_253892949">19.629 table:end-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418392_253892949">19.630 table:end-row</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418394_253892949">19.631 table:end-table</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418396_253892949">19.632 table:end-x </a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418398_253892949">19.633 table:end-y</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418400_253892949">19.634 table:execute</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418402_253892949">19.635 table:expression</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418404_253892949">19.636 table:field-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418406_253892949">19.637 table:field-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418408_253892949">19.638 table:filter-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418410_253892949">19.639 table:filter-options</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418412_253892949">19.640 table:first-row-end-column (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418414_253892949">19.641 table:first-row-start-column (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418416_253892949">19.642 table:formula</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418418_253892949">19.643 table:function</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418420_253892949">19.643.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418422_253892949">19.643.2 &lt;table:consolidation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418424_253892949">19.643.3 &lt;table:data-pilot-field&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418426_253892949">19.643.4 &lt;table:data-pilot-subtotal&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418428_253892949">19.643.5 &lt;table:subtotal-field&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418430_253892949">19.644 table:grand-total</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418432_253892949">19.645 table:group-by-field-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418434_253892949">19.646 table:grouped-by</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418436_253892949">19.647 table:has-persistent-data</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418438_253892949">19.648 table:id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418440_253892949">19.649 table:identify-categories</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418442_253892949">19.650 table:ignore-empty-rows</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418444_253892949">19.651 table:index</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418446_253892949">19.652 table:is-active</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418448_253892949">19.653 table:is-data-layout-field</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418450_253892949">19.654 table:is-selection</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418452_253892949">19.655 table:is-sub-table</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418454_253892949">19.656 table:label-cell-range-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418456_253892949">19.657 table:language</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418458_253892949">19.658 table:last-column-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418460_253892949">19.659 table:last-row-end-column (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418462_253892949">19.660 table:last-row-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418464_253892949">19.661 table:last-row-start-column (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418466_253892949">19.662 table:layout-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418468_253892949">19.663 table:link-to-source-data</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418470_253892949">19.664 table:marked-invalid</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418472_253892949">19.665 table:matrix-covered</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418474_253892949">19.666 table:maximum-difference</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418476_253892949">19.667 table:member-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418478_253892949">19.668 table:member-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418480_253892949">19.669 table:member-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418482_253892949">19.670 table:message-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418484_253892949">19.671 table:mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418486_253892949">19.672 table:multi-deletion-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418488_253892949">19.673 table:name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418490_253892949">19.673.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418492_253892949">19.673.2 &lt;table:cell-range-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418494_253892949">19.673.3 &lt;table:content-validation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418496_253892949">19.673.4 &lt;table:data-pilot-group&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418498_253892949">19.673.5 &lt;table:data-pilot-group-member&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418500_253892949">19.673.6 &lt;table:data-pilot-member&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418502_253892949">19.673.7 &lt;table:data-pilot-table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418504_253892949">19.673.8 &lt;table:database-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418506_253892949">19.673.9 &lt;table:named-expression&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418508_253892949">19.673.10 &lt;table:named-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418510_253892949">19.673.11 &lt;table:operation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418512_253892949">19.673.12 &lt;table:source-service&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418514_253892949">19.673.13 &lt;table:table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418516_253892949">19.673.14 &lt;table:table-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418518_253892949">19.674 table:null-year</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418520_253892949">19.675 table:number-columns-repeated</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418522_253892949">19.675.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418524_253892949">19.675.2 &lt;table:covered-table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418526_253892949">19.675.3 &lt;table:table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418528_253892949">19.675.4 &lt;table:table-column&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418530_253892949">19.676 table:number-columns-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418532_253892949">19.677 table:number-rows-repeated</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418534_253892949">19.678 table:number-rows-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418536_253892949">19.679 table:number-matrix-columns-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418538_253892949">19.680 table:number-matrix-rows-spanned</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418540_253892949">19.681 table:object-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418542_253892949">19.682 table:on-update-keep-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418544_253892949">19.683 table:on-update-keep-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418546_253892949">19.684 table:operator</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418548_253892949">19.685 table:order</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418550_253892949">19.686 table:orientation</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418552_253892949">19.686.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418554_253892949">19.686.2 &lt;table:data-pilot-field&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418556_253892949">19.686.3 &lt;table:database-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418558_253892949">19.686.4 &lt;table:label-range&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418560_253892949">19.687 table:page-breaks-on-group-change</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418562_253892949">19.688 table:paragraph-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418564_253892949">19.689 table:parse-sql-statement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418566_253892949">19.690 table:password</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418568_253892949">19.691 table:position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418570_253892949">19.692 table:precision-as-shown</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418572_253892949">19.693 table:print</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418574_253892949">19.694 table:print-ranges</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418576_253892949">19.695 table:protect (deprecated) </a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418578_253892949">19.696 table:protected</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418580_253892949">19.696.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418582_253892949">19.696.2 &lt;table:covered-table-cell&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418584_253892949">19.696.3 &lt;table:scenario&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418586_253892949">19.696.4 &lt;table:table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418588_253892949">19.696.5 &lt;table:table-cell&gt; </a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418590_253892949">19.697 table:protection-key</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418592_253892949">19.698 table:protection-key-digest-algorithm</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418594_253892949">19.699 table:query-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418596_253892949">19.700 table:range-usable-as</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418598_253892949">19.701 table:refresh-delay</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418600_253892949">19.702 table:rejecting-change-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418602_253892949">19.703 table:rfc-language-tag</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418604_253892949">19.704 table:row</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418606_253892949">19.705 table:scenario-ranges</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418608_253892949">19.706 table:script</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418610_253892949">19.707 table:search-criteria-must-apply-to-whole-cell</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418612_253892949">19.708 table:selected-page</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418614_253892949">19.709 table:show-details</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418616_253892949">19.710 table:show-empty</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418618_253892949">19.711 table:show-filter-button</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418620_253892949">19.712 table:sort-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418622_253892949">19.713 table:source-cell-range-addresses</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418624_253892949">19.714 table:source-field-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418626_253892949">19.715 table:source-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418628_253892949">19.716 table:sql-statement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418630_253892949">19.717 table:start</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418632_253892949">19.718 table:start-column</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418634_253892949">19.719 table:start-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418636_253892949">19.720 table:start-row</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418638_253892949">19.721 table:start-table</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418640_253892949">19.722 table:status</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418642_253892949">19.723 table:step</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418644_253892949">19.724 table:steps</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418646_253892949">19.725 table:structure-protected</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418648_253892949">19.726 table:style-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418650_253892949">19.726.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418652_253892949">19.726.2 &lt;table:background&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418654_253892949">19.726.3 &lt;table:body&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418656_253892949">19.726.4 &lt;table:covered-table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418658_253892949">19.726.5 &lt;table:even-columns&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418660_253892949">19.726.6 &lt;table:even-rows&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418662_253892949">19.726.7 &lt;table:first-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418664_253892949">19.726.8 &lt;table:first-row&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418666_253892949">19.726.9 &lt;table:last-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418668_253892949">19.726.10 &lt;table:last-row&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418670_253892949">19.726.11 &lt;table:odd-columns&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418672_253892949">19.726.12 &lt;table:odd-rows&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418674_253892949">19.726.13 &lt;table:table-cell&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418676_253892949">19.726.14 &lt;table:table-column&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418678_253892949">19.726.15 &lt;table:table-row&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418680_253892949">19.726.16 &lt;table:table&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418682_253892949">19.727 table:table</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418684_253892949">19.728 table:table-background</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418686_253892949">19.729 table:table-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418688_253892949">19.730 table:target-cell-address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418690_253892949">19.731 table:target-range-address</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418692_253892949">19.731.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418694_253892949">19.731.2 &lt;table:data-pilot-table&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418696_253892949">19.731.3 &lt;table:database-range&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418698_253892949">19.731.4 &lt;table:filter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418700_253892949">19.731.5 &lt;table:sort&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418702_253892949">19.732 table:template-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418704_253892949">19.733 table:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418706_253892949">19.734 table:track-changes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418708_253892949">19.735 table:type</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418710_253892949">19.735.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418712_253892949">19.735.2 &lt;table:data-pilot-field-reference&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418714_253892949">19.735.3 &lt;table:deletion&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418716_253892949">19.735.4 &lt;table:insertion&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418718_253892949">19.736 table:use-banding-columns-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418720_253892949">19.737 table:use-banding-rows-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418722_253892949">19.738 table:use-first-column-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418724_253892949">19.739 table:use-first-row-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418726_253892949">19.740 table:use-last-column-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418728_253892949">19.741 table:use-last-row-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418730_253892949">19.742 table:use-labels</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418732_253892949">19.743 table:use-regular-expressions</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418734_253892949">19.744 table:use-wildcards</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418736_253892949">19.745 table:used-hierarchy</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418738_253892949">19.746 table:user-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418740_253892949">19.747 table:value</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418742_253892949">19.747.1 &lt;table:filter-condition&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418744_253892949">19.747.2 &lt;table:filter-set-item&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418746_253892949">19.748 table:value-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418748_253892949">19.749 table:visibility</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418750_253892949">19.750 text:active</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418752_253892949">19.751 text:address</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418754_253892949">19.752 text:alphabetical-separators</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418756_253892949">19.753 text:anchor-page-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418758_253892949">19.754 text:anchor-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418760_253892949">19.755 text:annote</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418762_253892949">19.756 text:author</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418764_253892949">19.757 text:bibliography-data-field</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418766_253892949">19.758 text:bibliography-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418768_253892949">19.759 text:booktitle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418770_253892949">19.760 text:bullet-char</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418772_253892949">19.761 text:bullet-relative-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418774_253892949">19.762 text:capitalize-entries</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418776_253892949">19.763 text:c</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418778_253892949">19.764 text:caption-sequence-format</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418780_253892949">19.765 text:caption-sequence-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418782_253892949">19.766 text:change-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418784_253892949">19.767 text:chapter</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418786_253892949">19.768 text:citation-body-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418788_253892949">19.769 text:citation-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418790_253892949">19.770 text:class-names</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418792_253892949">19.770.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418794_253892949">19.770.2 &lt;text:h&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418796_253892949">19.770.3 &lt;text:p&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418798_253892949">19.770.4 &lt;text:span&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418800_253892949">19.771 text:column-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418802_253892949">19.772 text:combine-entries</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418804_253892949">19.773 text:combine-entries-with-dash</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418806_253892949">19.774 text:combine-entries-with-pp</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418808_253892949">19.775 text:comma-separated</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418810_253892949">19.776 text:cond-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418812_253892949">19.777 text:condition</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418814_253892949">19.777.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418816_253892949">19.777.2 &lt;text:conditional-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418818_253892949">19.777.3 &lt;text:database-next&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418820_253892949">19.777.4 &lt;text:database-row-select&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418822_253892949">19.777.5 &lt;text:hidden-paragraph&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418824_253892949">19.777.6 &lt;text:hidden-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418826_253892949">19.777.7 &lt;text:section&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418828_253892949">19.778 text:connection-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418830_253892949">19.779 text:consecutive-numbering</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418832_253892949">19.780 text:continue-list</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418834_253892949">19.781 text:continue-numbering</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418836_253892949">19.782 text:copy-outline-levels</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418838_253892949">19.783 text:count-empty-lines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418840_253892949">19.784 text:count-in-text-boxes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418842_253892949">19.785 text:current-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418844_253892949">19.786 text:custom1</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418846_253892949">19.787 text:custom2</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418848_253892949">19.788 text:custom3</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418850_253892949">19.789 text:custom4</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418852_253892949">19.790 text:custom5</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418854_253892949">19.791 text:database-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418856_253892949">19.792 text:date-adjust</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418858_253892949">19.793 text:date-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418860_253892949">19.794 text:default-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418862_253892949">19.795 text:description</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418864_253892949">19.796 text:display</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418866_253892949">19.796.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418868_253892949">19.796.2 &lt;text:chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418870_253892949">19.796.3 &lt;text:expression&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418872_253892949">19.796.4 &lt;text:file-name&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418874_253892949">19.796.5 &lt;text:index-entry-chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418876_253892949">19.796.6 &lt;text:section&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418878_253892949">19.796.7 &lt;text:table-formula&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418880_253892949">19.796.8 &lt;text:template-name&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418882_253892949">19.796.9 &lt;text:user-field-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418884_253892949">19.796.10 &lt;text:variable-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418886_253892949">19.796.11 &lt;text:variable-input&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418888_253892949">19.796.12 &lt;text:variable-set&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418890_253892949">19.797 text:display-levels</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418892_253892949">19.798 text:display-outline-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418894_253892949">19.799 text:duration</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418896_253892949">19.800 text:edition</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418898_253892949">19.801 text:editor</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418900_253892949">19.802 text:filter-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418902_253892949">19.803 text:fixed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418904_253892949">19.804 text:footnotes-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418906_253892949">19.805 text:formula</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418908_253892949">19.806 text:global (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418910_253892949">19.807 text:howpublished</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418912_253892949">19.808 text:increment</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418914_253892949">19.809 text:id</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418916_253892949">19.809.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418918_253892949">19.809.2 &lt;draw:text-box&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418920_253892949">19.809.3 &lt;text:alphabetical-index-mark-end&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418922_253892949">19.809.4 &lt;text:alphabetical-index-mark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418924_253892949">19.809.5 &lt;text:changed-region&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418926_253892949">19.809.6 &lt;text:h&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418928_253892949">19.809.7 &lt;text:note&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418930_253892949">19.809.8 &lt;text:p&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418932_253892949">19.809.9 &lt;text:toc-mark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418934_253892949">19.809.10 &lt;text:toc-mark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418936_253892949">19.809.11 &lt;text:user-index-mark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418938_253892949">19.809.12 &lt;text:user-index-mark-start&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418940_253892949">19.810 text:identifier</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418942_253892949">19.811 text:index-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418944_253892949">19.812 text:index-scope</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418946_253892949">19.813 text:ignore-case</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418948_253892949">19.814 text:institution</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418950_253892949">19.815 text:is-hidden</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418952_253892949">19.816 text:is-list-header</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418954_253892949">19.817 text:isbn</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418956_253892949">19.818 text:issn</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418958_253892949">19.819 text:journal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418960_253892949">19.820 text:key</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418962_253892949">19.821 text:key1</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418964_253892949">19.822 text:key2</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418966_253892949">19.823 text:key1-phonetic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418968_253892949">19.824 text:key2-phonetic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418970_253892949">19.825 text:kind</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418972_253892949">19.826 text:label</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418974_253892949">19.827 text:label-followed-by</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418976_253892949">19.828 text:level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418978_253892949">19.829 text:list-id</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418980_253892949">19.830 text:list-tab-stop-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418982_253892949">19.831 text:main-entry</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418984_253892949">19.832 text:main-entry-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418986_253892949">19.833 text:master-page-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418988_253892949">19.834 text:month</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1418990_253892949">19.835 text:name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418992_253892949">19.835.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418994_253892949">19.835.2 &lt;text:alphabetical-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418996_253892949">19.835.3 &lt;text:bibliography&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1418998_253892949">19.835.4 &lt;text:bookmark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419000_253892949">19.835.5 &lt;text:bookmark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419002_253892949">19.835.6 &lt;text:bookmark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419004_253892949">19.835.7 &lt;text:execute-macro&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419006_253892949">19.835.8 &lt;text:illustration-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419008_253892949">19.835.9 &lt;text:index-title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419010_253892949">19.835.10 &lt;text:object-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419012_253892949">19.835.11 &lt;text:reference-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419014_253892949">19.835.12 &lt;text:reference-mark-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419016_253892949">19.835.13 &lt;text:reference-mark-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419018_253892949">19.835.14 &lt;text:section&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419020_253892949">19.835.15 &lt;text:sequence&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419022_253892949">19.835.16 &lt;text:sequence-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419024_253892949">19.835.17 &lt;text:table-of-content&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419026_253892949">19.835.18 &lt;text:table-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419028_253892949">19.835.19 &lt;text:user-defined&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419030_253892949">19.835.20 &lt;text:user-field-decl&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419032_253892949">19.835.21 &lt;text:user-field-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419034_253892949">19.835.22 &lt;text:user-field-input&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419036_253892949">19.835.23 &lt;text:user-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419038_253892949">19.835.24 &lt;text:variable-set&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419040_253892949">19.835.25 &lt;text:variable-decl&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419042_253892949">19.835.26 &lt;text:variable-get&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419044_253892949">19.835.27 &lt;text:variable-input&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419046_253892949">19.836 text:note</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419048_253892949">19.837 text:note-class</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419050_253892949">19.838 text:number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419052_253892949">19.839 text:number-lines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419054_253892949">19.840 text:number-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419056_253892949">19.841 text:numbered-entries</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419058_253892949">19.842 text:offset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419060_253892949">19.843 text:organizations</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419062_253892949">19.844 text:outline-level</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419064_253892949">19.844.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419066_253892949">19.844.2 &lt;text:alphabetical-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419068_253892949">19.844.3 &lt;text:chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419070_253892949">19.844.4 &lt;text:h&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419072_253892949">19.844.5 &lt;text:index-entry-chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419074_253892949">19.844.6 &lt;text:index-source-styles&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419076_253892949">19.844.7 &lt;text:user-index-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419078_253892949">19.844.8 &lt;text:table-of-content-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419080_253892949">19.844.9 &lt;text:table-of-content-source&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419082_253892949">19.844.10 &lt;text:toc-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419084_253892949">19.844.11 &lt;text:toc-mark-start&gt; </a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419086_253892949">19.844.12 &lt;text:user-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419088_253892949">19.844.13 &lt;text:user-index-mark-start&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419090_253892949">19.845 text:page-adjust</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419092_253892949">19.845.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419094_253892949">19.845.2 &lt;text:page-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419096_253892949">19.845.3 &lt;text:page-variable-set&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419098_253892949">19.846 text:pages</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419100_253892949">19.847 text:placeholder-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419102_253892949">19.848 text:prefix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419104_253892949">19.849 text:protected</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419106_253892949">19.850 text:protection-key</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419108_253892949">19.851 text:protection-key-digest-algorithm</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419110_253892949">19.852 text:publisher</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419112_253892949">19.853 text:ref-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419114_253892949">19.853.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419116_253892949">19.853.2 &lt;text:bookmark-ref&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419118_253892949">19.853.3 &lt;text:note-ref&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419120_253892949">19.853.4 &lt;text:reference-ref&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419122_253892949">19.853.5 &lt;text:sequence&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419124_253892949">19.853.6 &lt;text:sequence-ref&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419126_253892949">19.854 text:reference-format</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419128_253892949">19.855 text:relative-tab-stop-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419130_253892949">19.856 text:report-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419132_253892949">19.857 text:restart-numbering</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419134_253892949">19.858 text:restart-on-page</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419136_253892949">19.859 text:row-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419138_253892949">19.860 text:school</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419140_253892949">19.861 text:section-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419142_253892949">19.862 text:series</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419144_253892949">19.863 text:select-page</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419146_253892949">19.863.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419148_253892949">19.863.2 &lt;text:page-continuation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419150_253892949">19.863.3 &lt;text:page-number&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419152_253892949">19.864 text:separation-character</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419154_253892949">19.865 text:sort-algorithm</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419156_253892949">19.866 text:sort-ascending</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419158_253892949">19.867 text:sort-by-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419160_253892949">19.868 text:start-value</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419162_253892949">19.868.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419164_253892949">19.868.2 &lt;text:h&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419166_253892949">19.868.3 &lt;text:list-item&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419168_253892949">19.868.4 &lt;text:list-level-style-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419170_253892949">19.868.5 &lt;text:notes-configuration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419172_253892949">19.868.6 &lt;text:numbered-paragraph&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419174_253892949">19.868.7 &lt;text:outline-level-style&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419176_253892949">19.869 text:start-numbering-at</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419178_253892949">19.870 text:string-value-phonetic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419180_253892949">19.871 text:string-value</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419182_253892949">19.871.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419184_253892949">19.871.2 &lt;text:alphabetical-index-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419186_253892949">19.871.3 &lt;text:hidden-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419188_253892949">19.871.4 &lt;text:page-continuation&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419190_253892949">19.871.5 &lt;text:toc-mark&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419192_253892949">19.871.6 &lt;text:user-index-mark&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419194_253892949">19.872 text:string-value-if-false</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419196_253892949">19.873 text:string-value-if-true</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419198_253892949">19.874 text:style-name</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419200_253892949">19.874.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419202_253892949">19.874.2 &lt;text:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419204_253892949">19.874.3 &lt;text:alphabetical-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419206_253892949">19.874.4 &lt;text:alphabetical-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419208_253892949">19.874.5 &lt;text:bibliography&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419210_253892949">19.874.6 &lt;text:bibliography-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419212_253892949">19.874.7 &lt;text:h&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419214_253892949">19.874.8 &lt;text:illustration-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419216_253892949">19.874.9 &lt;text:illustration-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419218_253892949">19.874.10 &lt;text:index-entry-bibliography&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419220_253892949">19.874.11 &lt;text:index-entry-chapter&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419222_253892949">19.874.12 &lt;text:index-entry-link-end&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419224_253892949">19.874.13 &lt;text:index-entry-link-start&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419226_253892949">19.874.14 &lt;text:index-entry-page-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419228_253892949">19.874.15 &lt;text:index-entry-span&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419230_253892949">19.874.16 &lt;text:index-entry-tab-stop&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419232_253892949">19.874.17 &lt;text:index-entry-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419234_253892949">19.874.18 &lt;text:index-source-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419236_253892949">19.874.19 &lt;text:index-title&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419238_253892949">19.874.20 &lt;text:index-title-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419240_253892949">19.874.21 &lt;text:linenumbering-configuration&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419242_253892949">19.874.22 &lt;text:list&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419244_253892949">19.874.23 &lt;text:list-level-style-number&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419246_253892949">19.874.24 &lt;text:list-level-style-bullet&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419248_253892949">19.874.25 &lt;text:numbered-paragraph&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419250_253892949">19.874.26 &lt;text:object-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419252_253892949">19.874.27 &lt;text:object-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419254_253892949">19.874.28 &lt;text:outline-level-style&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419256_253892949">19.874.29 &lt;text:p&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419258_253892949">19.874.30 &lt;text:ruby&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419260_253892949">19.874.31 &lt;text:ruby-text&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419262_253892949">19.874.32 &lt;text:section&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419264_253892949">19.874.33 &lt;text:span&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419266_253892949">19.874.34 &lt;text:table-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419268_253892949">19.874.35 &lt;text:table-of-content&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419270_253892949">19.874.36 &lt;text:table-of-content-entry-template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419272_253892949">19.874.37 &lt;text:table-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419274_253892949">19.874.38 &lt;text:user-index&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419276_253892949">19.874.39 &lt;text:user-index-entry-template&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419278_253892949">19.875 text:style-override</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419280_253892949">19.876 text:suffix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419282_253892949">19.877 text:tab-ref</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419284_253892949">19.878 text:table-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419286_253892949">19.879 text:table-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419288_253892949">19.880 text:time-adjust</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419290_253892949">19.881 text:time-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419292_253892949">19.882 text:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419294_253892949">19.883 text:track-changes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419296_253892949">19.884 text:url</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419298_253892949">19.885 text:use-caption</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419300_253892949">19.886 text:use-chart-objects</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419302_253892949">19.887 text:use-draw-objects</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419304_253892949">19.888 text:use-floating-frames</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419306_253892949">19.889 text:use-graphics</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419308_253892949">19.890 text:use-index-marks</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419310_253892949">19.891 text:use-index-source-styles</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419312_253892949">19.892 text:use-keys-as-entries</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419314_253892949">19.893 text:use-math-objects</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419316_253892949">19.894 text:use-objects</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419318_253892949">19.895 text:use-other-objects</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419320_253892949">19.896 text:use-outline-level</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419322_253892949">19.897 text:use-soft-page-breaks</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419324_253892949">19.898 text:use-spreadsheet-objects</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419326_253892949">19.899 text:use-tables</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419328_253892949">19.900 text:value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419330_253892949">19.901 text:visited-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419332_253892949">19.902 text:volume</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419334_253892949">19.903 text:year</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419336_253892949">19.904 xforms:bind</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419338_253892949">19.905 xhtml:about</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419340_253892949">19.906 xhtml:content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419342_253892949">19.907 xhtml:datatype</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419344_253892949">19.908 xhtml:property</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419346_253892949">19.909 xlink:actuate</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419348_253892949">19.910 xlink:href</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419350_253892949">19.910.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419352_253892949">19.910.2 &lt;anim:audio&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419354_253892949">19.910.3 &lt;chart:chart&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419356_253892949">19.910.4 &lt;chart:symbol-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419358_253892949">19.910.5 &lt;db:component&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419360_253892949">19.910.6 &lt;db:connection-resource&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419362_253892949">19.910.7 &lt;db:file-based-database&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419364_253892949">19.910.8 &lt;draw:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419366_253892949">19.910.9 &lt;draw:applet&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419368_253892949">19.910.10 &lt;draw:area-circle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419370_253892949">19.910.11 &lt;draw:area-polygon&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419372_253892949">19.910.12 &lt;draw:area-rectangle&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419374_253892949">19.910.13 &lt;draw:fill-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419376_253892949">19.910.14 &lt;draw:floating-frame&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419378_253892949">19.910.15 &lt;draw:image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419380_253892949">19.910.16 &lt;draw:object&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419382_253892949">19.910.17 &lt;draw:object-ole&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419384_253892949">19.910.18 &lt;draw:plugin&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419386_253892949">19.910.19 &lt;form:button&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419388_253892949">19.910.20 &lt;form:connection-resource&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419390_253892949">19.910.21 &lt;form:image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419392_253892949">19.910.22 &lt;form:form&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419394_253892949">19.910.23 &lt;meta:auto-reload&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419396_253892949">19.910.24 &lt;meta:template&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419398_253892949">19.910.25 &lt;presentation:event-listener&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419400_253892949">19.910.26 &lt;presentation:sound&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419402_253892949">19.910.27 &lt;script:event-listener&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419404_253892949">19.910.28 &lt;style:background-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419406_253892949">19.910.29 &lt;svg:definition-src&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419408_253892949">19.910.30 &lt;svg:font-face-uri&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419410_253892949">19.910.31 &lt;table:cell-range-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419412_253892949">19.910.32 &lt;table:table-source&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419414_253892949">19.910.33 &lt;text:a&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419416_253892949">19.910.34 &lt;text:alphabetical-index-auto-mark-file&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419418_253892949">19.910.35 &lt;text:list-level-style-image&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419420_253892949">19.910.36 &lt;text:script&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419422_253892949">19.910.37 &lt;text:section-source&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419424_253892949">19.911 xlink:show</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419426_253892949">19.912 xlink:title</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419428_253892949">19.913 xlink:type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419430_253892949">19.914 xml:id</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1419432_253892949">20 Formatting Attributes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419434_253892949">20.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419436_253892949">20.2 chart:angle-offset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419438_253892949">20.3 chart:auto-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419440_253892949">20.4 chart:auto-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419442_253892949">20.5 chart:axis-label-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419444_253892949">20.6 chart:axis-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419446_253892949">20.7 chart:connect-bars</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419448_253892949">20.8 chart:data-label-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419450_253892949">20.9 chart:data-label-symbol</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419452_253892949">20.10 chart:data-label-text</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419454_253892949">20.11 chart:deep</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419456_253892949">20.12 chart:display-label</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419458_253892949">20.13 chart:error-category</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419460_253892949">20.14 chart:error-lower-indicator</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419462_253892949">20.15 chart:error-lower-limit</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1718342_1219268628">20.16 chart:error-lower-range</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419464_253892949">20.17 chart:error-margin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419466_253892949">20.18 chart:error-percentage</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419468_253892949">20.19 chart:error-upper-indicator</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419470_253892949">20.20 chart:error-upper-limit</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1718344_1219268628">20.21 chart:error-upper-range</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419472_253892949">20.22 chart:gap-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419474_253892949">20.23 chart:group-bars-per-axis</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419476_253892949">20.24 chart:hole-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419478_253892949">20.25 chart:include-hidden-cells</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419480_253892949">20.26 chart:interpolation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419482_253892949">20.27 chart:interval-major</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419484_253892949">20.28 chart:interval-minor-divisor</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419486_253892949">20.29 chart:japanese-candle-stick</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419488_253892949">20.30 chart:label-arrangement</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419490_253892949">20.31 chart:label-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419492_253892949">20.32 chart:label-position-negative</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419494_253892949">20.33 chart:lines (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419496_253892949">20.34 chart:link-data-style-to-source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419498_253892949">20.35 chart:logarithmic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419500_253892949">20.36 chart:maximum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419502_253892949">20.37 chart:mean-value</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419504_253892949">20.38 chart:minimum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419506_253892949">20.39 chart:origin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419508_253892949">20.40 chart:overlap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419510_253892949">20.41 chart:pie-offset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419512_253892949">20.42 chart:percentage</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419514_253892949">20.43 chart:regression-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419516_253892949">20.44 chart:reverse-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419518_253892949">20.45 chart:right-angled-axes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419520_253892949">20.46 chart:scale-text</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419522_253892949">20.47 chart:series-source (deprecated)</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419524_253892949">20.48 chart:sort-by-x-values</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419526_253892949">20.49 chart:solid-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419528_253892949">20.50 chart:spline-order</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419530_253892949">20.51 chart:spline-resolution</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419532_253892949">20.52 chart:stacked</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419534_253892949">20.53 chart:symbol-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419536_253892949">20.54 chart:symbol-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419538_253892949">20.55 chart:symbol-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419540_253892949">20.56 chart:symbol-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419542_253892949">20.57 chart:text-overlap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419544_253892949">20.58 chart:three-dimensional</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419546_253892949">20.59 chart:tick-marks-major-inner</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419548_253892949">20.60 chart:tick-marks-major-outer</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419550_253892949">20.61 chart:tick-marks-minor-inner</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419552_253892949">20.62 chart:tick-marks-minor-outer</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419554_253892949">20.63 chart:tick-mark-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419556_253892949">20.64 chart:treat-empty-cells</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419558_253892949">20.65 chart:vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419560_253892949">20.66 chart:visible</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419562_253892949">20.67 dr3d:ambient-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419564_253892949">20.68 dr3d:back-scale</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419566_253892949">20.69 dr3d:backface-culling</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419568_253892949">20.70 dr3d:close-back</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419570_253892949">20.71 dr3d:close-front</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419572_253892949">20.72 dr3d:depth</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419574_253892949">20.73 dr3d:diffuse-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419576_253892949">20.74 dr3d:edge-rounding</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419578_253892949">20.75 dr3d:edge-rounding-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419580_253892949">20.76 dr3d:emissive-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419582_253892949">20.77 dr3d:end-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419584_253892949">20.78 dr3d:horizontal-segments</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419586_253892949">20.79 dr3d:lighting-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419588_253892949">20.80 dr3d:normals-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419590_253892949">20.81 dr3d:normals-kind</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419592_253892949">20.82 dr3d:shadow</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419594_253892949">20.83 dr3d:shininess</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419596_253892949">20.84 dr3d:specular-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419598_253892949">20.85 dr3d:texture-filter</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419600_253892949">20.86 dr3d:texture-kind</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419602_253892949">20.87 dr3d:texture-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419604_253892949">20.88 dr3d:texture-generation-mode-x</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419606_253892949">20.89 dr3d:texture-generation-mode-y</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419608_253892949">20.90 dr3d:vertical-segments</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419610_253892949">20.91 draw:auto-grow-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419612_253892949">20.92 draw:auto-grow-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419614_253892949">20.93 draw:background-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419616_253892949">20.94 draw:blue</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419618_253892949">20.95 draw:caption-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419620_253892949">20.96 draw:caption-angle-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419622_253892949">20.97 draw:caption-escape</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419624_253892949">20.98 draw:caption-escape-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419626_253892949">20.99 draw:caption-fit-line-length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419628_253892949">20.100 draw:caption-gap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419630_253892949">20.101 draw:caption-line-length</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419632_253892949">20.102 draw:caption-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419634_253892949">20.103 draw:color-inversion</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419636_253892949">20.104 draw:color-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419638_253892949">20.105 draw:contrast</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419640_253892949">20.106 draw:decimal-places</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419642_253892949">20.107 draw:draw-aspect</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419644_253892949">20.108 draw:end-guide</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419646_253892949">20.109 draw:end-line-spacing-horizontal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419648_253892949">20.110 draw:end-line-spacing-vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419650_253892949">20.111 draw:fill</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419652_253892949">20.112 draw:fill-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419654_253892949">20.113 draw:fill-gradient-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419656_253892949">20.114 draw:fill-hatch-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419658_253892949">20.115 draw:fill-hatch-solid</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419660_253892949">20.116 draw:fill-image-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419662_253892949">20.117 draw:fill-image-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419664_253892949">20.118 draw:fill-image-ref-point</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419666_253892949">20.119 draw:fill-image-ref-point-x</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419668_253892949">20.120 draw:fill-image-ref-point-y</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419670_253892949">20.121 draw:fill-image-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419672_253892949">20.122 draw:fit-to-contour</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419674_253892949">20.123 draw:fit-to-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419676_253892949">20.124 draw:frame-display-border</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419678_253892949">20.125 draw:frame-margin-horizontal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419680_253892949">20.126 draw:frame-display-scrollbar</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419682_253892949">20.127 draw:frame-margin-vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419684_253892949">20.128 draw:gamma</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419686_253892949">20.129 draw:green</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419688_253892949">20.130 draw:gradient-step-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419690_253892949">20.131 draw:guide-distance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419692_253892949">20.132 draw:guide-overhang</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419694_253892949">20.133 draw:image-opacity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419696_253892949">20.134 draw:line-distance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419698_253892949">20.135 draw:luminance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419700_253892949">20.136 draw:marker-end</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419702_253892949">20.137 draw:marker-end-center</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419704_253892949">20.138 draw:marker-end-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419706_253892949">20.139 draw:marker-start</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419708_253892949">20.140 draw:marker-start-center</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419710_253892949">20.141 draw:marker-start-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419712_253892949">20.142 draw:measure-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419714_253892949">20.143 draw:measure-vertical-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419716_253892949">20.144 draw:ole-draw-aspect (deprecated) </a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419718_253892949">20.145 draw:opacity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419720_253892949">20.146 draw:opacity-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419722_253892949">20.147 draw:parallel</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419724_253892949">20.148 draw:placing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419726_253892949">20.149 draw:red</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419728_253892949">20.150 draw:secondary-fill-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419730_253892949">20.151 draw:shadow</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419732_253892949">20.152 draw:shadow-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419734_253892949">20.153 draw:shadow-offset-x</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419736_253892949">20.154 draw:shadow-offset-y</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419738_253892949">20.155 draw:shadow-opacity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419740_253892949">20.156 draw:show-unit</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419742_253892949">20.157 draw:start-guide</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419744_253892949">20.158 draw:start-line-spacing-horizontal</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419746_253892949">20.159 draw:start-line-spacing-vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419748_253892949">20.160 draw:stroke</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419750_253892949">20.161 draw:stroke-dash</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419752_253892949">20.162 draw:stroke-dash-names</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419754_253892949">20.163 draw:stroke-linejoin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419756_253892949">20.164 svg:stroke-linecap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419758_253892949">20.165 draw:symbol-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419760_253892949">20.166 draw:textarea-horizontal-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419762_253892949">20.167 draw:textarea-vertical-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419764_253892949">20.168 draw:tile-repeat-offset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419766_253892949">20.169 draw:visible-area-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419768_253892949">20.170 draw:visible-area-left</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419770_253892949">20.171 draw:visible-area-top</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419772_253892949">20.172 draw:visible-area-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419774_253892949">20.173 draw:unit</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419776_253892949">20.174 draw:wrap-influence-on-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419778_253892949">20.175 fo:background-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419780_253892949">20.176 fo Border Properties</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419782_253892949">20.176.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419784_253892949">20.176.2 fo:border</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419786_253892949">20.176.3 fo:border-bottom</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419788_253892949">20.176.4 fo:border-left</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419790_253892949">20.176.5 fo:border-right</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419792_253892949">20.176.6 fo:border-top</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419794_253892949">20.177 fo:break-after</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419796_253892949">20.178 fo:break-before</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419798_253892949">20.179 fo:clip</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419800_253892949">20.180 fo:color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419802_253892949">20.181 fo:country</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419804_253892949">20.182 fo:font-family</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419806_253892949">20.183 fo:font-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419808_253892949">20.184 fo:font-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419810_253892949">20.185 fo:font-variant</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419812_253892949">20.186 fo:font-weight</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419814_253892949">20.187 fo:height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419816_253892949">20.188 fo:hyphenate</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419818_253892949">20.189 fo:hyphenation-keep</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419820_253892949">20.190 fo:hyphenation-ladder-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419822_253892949">20.191 fo:hyphenation-push-char-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419824_253892949">20.192 fo:hyphenation-remain-char-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419826_253892949">20.193 fo:keep-together</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419828_253892949">20.194 fo:keep-with-next</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419830_253892949">20.195 fo:language</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419832_253892949">20.196 fo:letter-spacing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419834_253892949">20.197 fo:line-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419836_253892949">20.198 fo:margin</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419838_253892949">20.199 fo:margin-bottom</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419840_253892949">20.200 fo:margin-left</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419842_253892949">20.201 fo:margin-right</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419844_253892949">20.202 fo:margin-top</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419846_253892949">20.203 fo:max-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419848_253892949">20.204 fo:max-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419850_253892949">20.205 fo:min-height</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419852_253892949">20.205.1 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419854_253892949">20.205.2 &lt;style:header-footer-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419856_253892949">20.206 fo:min-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419858_253892949">20.207 fo:orphans</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419860_253892949">20.208 fo:page-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419862_253892949">20.209 fo:page-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419864_253892949">20.210 fo:padding</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419866_253892949">20.211 fo:padding-bottom</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419868_253892949">20.212 fo:padding-left</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419870_253892949">20.213 fo:padding-right</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419872_253892949">20.214 fo:padding-top</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419874_253892949">20.215 fo:script</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419876_253892949">20.216 fo:text-align</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419878_253892949">20.216.1 &lt;style:paragraph-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1419880_253892949">20.216.2 &lt;style:list-level-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419882_253892949">20.217 fo:text-align-last</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419884_253892949">20.218 fo:text-indent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419886_253892949">20.219 fo:text-shadow</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419888_253892949">20.220 fo:text-transform</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419890_253892949">20.221 fo:widows</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419892_253892949">20.222 fo:width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419894_253892949">20.223 fo:wrap-option</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419896_253892949">20.224 presentation:background-objects-visible</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419898_253892949">20.225 presentation:background-visible</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419900_253892949">20.226 presentation:display-date-time</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419902_253892949">20.227 presentation:display-footer</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419904_253892949">20.228 presentation:display-header</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419906_253892949">20.229 presentation:display-page-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419908_253892949">20.230 presentation:duration</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419910_253892949">20.231 presentation:transition-speed</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419912_253892949">20.232 presentation:transition-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419914_253892949">20.233 presentation:transition-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419916_253892949">20.234 presentation:visibility</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419918_253892949">20.235 smil:direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419920_253892949">20.236 smil:fadeColor</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419922_253892949">20.237 smil:subtype</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419924_253892949">20.238 smil:type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419926_253892949">20.239 style:auto-text-indent</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419928_253892949">20.240 style:background-transparency</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419930_253892949">20.241 style:border-line-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419932_253892949">20.242 style:border-line-width-bottom</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419934_253892949">20.243 style:border-line-width-left</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419936_253892949">20.244 style:border-line-width-right</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419938_253892949">20.245 style:border-line-width-top</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419940_253892949">20.246 style:cell-protect</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419942_253892949">20.247 style:column-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419944_253892949">20.248 style:country-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419946_253892949">20.249 style:country-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419948_253892949">20.250 style:decimal-places</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419950_253892949">20.251 style:diagonal-bl-tr</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419952_253892949">20.252 style:diagonal-bl-tr-widths</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419954_253892949">20.253 style:diagonal-tl-br</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419956_253892949">20.254 style:diagonal-tl-br-widths</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419958_253892949">20.255 style:direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419960_253892949">20.256 style:dynamic-spacing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419962_253892949">20.257 style:editable</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419964_253892949">20.258 style:first-page-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419966_253892949">20.259 style:flow-with-text</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419968_253892949">20.260 style:font-charset</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419970_253892949">20.261 style:font-charset-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419972_253892949">20.262 style:font-charset-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419974_253892949">20.263 style:font-family-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419976_253892949">20.264 style:font-family-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419978_253892949">20.265 style:font-family-generic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419980_253892949">20.266 style:font-family-generic-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419982_253892949">20.267 style:font-family-generic-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419984_253892949">20.268 style:font-independent-line-spacing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419986_253892949">20.269 style:font-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419988_253892949">20.270 style:font-name-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419990_253892949">20.271 style:font-name-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419992_253892949">20.272 style:font-pitch</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419994_253892949">20.273 style:font-pitch-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419996_253892949">20.274 style:font-pitch-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1419998_253892949">20.275 style:font-relief</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420000_253892949">20.276 style:font-size-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420002_253892949">20.277 style:font-size-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420004_253892949">20.278 style:font-size-rel</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420006_253892949">20.279 style:font-size-rel-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420008_253892949">20.280 style:font-size-rel-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420010_253892949">20.281 style:font-style-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420012_253892949">20.282 style:font-style-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420014_253892949">20.283 style:font-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420016_253892949">20.284 style:font-style-name-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420018_253892949">20.285 style:font-style-name-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420020_253892949">20.286 style:font-weight-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420022_253892949">20.287 style:font-weight-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420024_253892949">20.288 style:footnote-max-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420026_253892949">20.289 style:glyph-orientation-vertical</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420028_253892949">20.290 style:horizontal-pos</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420030_253892949">20.291 style:horizontal-rel</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420032_253892949">20.292 style:join-border</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420034_253892949">20.293 style:justify-single-word</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420036_253892949">20.294 style:language-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420038_253892949">20.295 style:language-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420040_253892949">20.296 style:layout-grid-base-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420042_253892949">20.297 style:layout-grid-base-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420044_253892949">20.298 style:layout-grid-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420046_253892949">20.299 style:layout-grid-display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420048_253892949">20.300 style:layout-grid-lines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420050_253892949">20.301 style:layout-grid-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420052_253892949">20.302 style:layout-grid-print</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420054_253892949">20.303 style:layout-grid-ruby-below</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420056_253892949">20.304 style:layout-grid-ruby-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420058_253892949">20.305 style:layout-grid-snap-to</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420060_253892949">20.306 style:layout-grid-standard-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420062_253892949">20.307 style:line-break</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420064_253892949">20.308 style:letter-kerning</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420066_253892949">20.309 style:line-height-at-least</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420068_253892949">20.310 style:line-spacing</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420070_253892949">20.311 style:may-break-between-rows</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420072_253892949">20.312 style:min-row-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420074_253892949">20.313 style:mirror</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420076_253892949">20.314 style:num-format</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420078_253892949">20.315 style:num-letter-sync</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420080_253892949">20.316 style:num-prefix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420082_253892949">20.317 style:num-suffix</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420084_253892949">20.318 style:number-wrapped-paragraphs</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420086_253892949">20.319 style:overflow-behavior</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420088_253892949">20.320 style:page-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420090_253892949">20.321 style:paper-tray-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420092_253892949">20.322 style:print</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420094_253892949">20.323 style:print-content</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420096_253892949">20.323.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420098_253892949">20.323.2 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420100_253892949">20.323.3 &lt;style:table-cell-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420102_253892949">20.324 style:print-page-order</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420104_253892949">20.325 style:print-orientation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420106_253892949">20.326 style:protect</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420108_253892949">20.326.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420110_253892949">20.326.2 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420112_253892949">20.326.3 &lt;style:section-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420114_253892949">20.327 style:punctuation-wrap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420116_253892949">20.328 style:register-true</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420118_253892949">20.329 style:register-truth-ref-style-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420120_253892949">20.330 style:rel-column-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420122_253892949">20.331 style:rel-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420124_253892949">20.332 style:rel-width</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420126_253892949">20.332.1 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420128_253892949">20.332.2 &lt;style:table-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420130_253892949">20.333 style:repeat</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420132_253892949">20.334 style:repeat-content</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420134_253892949">20.335 style:rfc-language-tag</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420136_253892949">20.336 style:rfc-language-tag-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420138_253892949">20.337 style:rfc-language-tag-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420140_253892949">20.338 style:rotation-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420142_253892949">20.339 style:rotation-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420144_253892949">20.340 style:row-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420146_253892949">20.341 style:ruby-align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420148_253892949">20.342 style:ruby-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420150_253892949">20.343 style:run-through</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420152_253892949">20.344 style:scale-to</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420154_253892949">20.345 style:scale-to-pages</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420156_253892949">20.346 style:script-asian</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420158_253892949">20.347 style:script-complex</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420160_253892949">20.348 style:script-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420162_253892949">20.349 style:shadow</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420164_253892949">20.350 style:shrink-to-fit</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420166_253892949">20.351 style:snap-to-layout-grid</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420168_253892949">20.352 style:tab-stop-distance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420170_253892949">20.353 style:table-centering</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420172_253892949">20.354 style:text-align-source</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420174_253892949">20.355 style:text-autospace</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420176_253892949">20.356 style:text-blinking</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420178_253892949">20.357 style:text-combine</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420180_253892949">20.358 style:text-combine-start-char</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420182_253892949">20.359 style:text-combine-end-char</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420184_253892949">20.360 style:text-emphasize</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420186_253892949">20.361 style:text-line-through-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420188_253892949">20.362 style:text-line-through-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420190_253892949">20.363 style:text-line-through-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420192_253892949">20.364 style:text-line-through-text</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420194_253892949">20.365 style:text-line-through-text-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420196_253892949">20.366 style:text-line-through-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420198_253892949">20.367 style:text-line-through-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420200_253892949">20.368 style:text-outline</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420202_253892949">20.369 style:text-overline-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420204_253892949">20.370 style:text-overline-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420206_253892949">20.371 style:text-overline-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420208_253892949">20.372 style:text-overline-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420210_253892949">20.373 style:text-overline-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420212_253892949">20.374 style:text-position</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420214_253892949">20.375 style:text-rotation-angle</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420216_253892949">20.376 style:text-rotation-scale</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420218_253892949">20.377 style:text-scale</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420220_253892949">20.378 style:text-underline-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420222_253892949">20.379 style:text-underline-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420224_253892949">20.380 style:text-underline-style</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420226_253892949">20.381 style:text-underline-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420228_253892949">20.382 style:text-underline-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420230_253892949">20.383 style:use-optimal-column-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420232_253892949">20.384 style:use-optimal-row-height</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420234_253892949">20.385 style:use-window-font-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420236_253892949">20.386 style:vertical-align</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420238_253892949">20.386.1 &lt;style:paragraph-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420240_253892949">20.386.2 &lt;style:table-cell-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420242_253892949">20.387 style:vertical-pos</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420244_253892949">20.388 style:vertical-rel</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420246_253892949">20.389 style:width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420248_253892949">20.390 style:wrap</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420250_253892949">20.391 style:wrap-contour</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420252_253892949">20.392 style:wrap-contour-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420254_253892949">20.393 style:wrap-dynamic-threshold</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420256_253892949">20.394 style:writing-mode</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420258_253892949">20.394.1 General</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420260_253892949">20.394.2 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420262_253892949">20.394.3 &lt;style:page-layout-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420264_253892949">20.394.4 &lt;style:paragraph-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420266_253892949">20.394.5 &lt;style:section-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420268_253892949">20.394.6 &lt;style:table-cell-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420270_253892949">20.394.7 &lt;style:table-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420272_253892949">20.395 style:writing-mode-automatic</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420274_253892949">20.396 svg:fill-rule</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420276_253892949">20.397 svg:height</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420278_253892949">20.397.1 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420280_253892949">20.397.2 &lt;style:header-footer-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420282_253892949">20.398 svg:stroke-color</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420284_253892949">20.399 svg:stroke-opacity</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420286_253892949">20.400 svg:stroke-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420288_253892949">20.401 svg:x</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420290_253892949">20.402 svg:y</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420292_253892949">20.402.1 &lt;style:graphic-properties&gt;</a></p></td></tr><tr><td><p class="P8"><a href="#__RefHeading__1420294_253892949">20.402.2 &lt;style:list-level-properties&gt;</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420296_253892949">20.403 svg:width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420298_253892949">20.404 table:align</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420300_253892949">20.405 table:border-model</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420302_253892949">20.406 table:display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420304_253892949">20.407 text:anchor-page-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420306_253892949">20.408 text:anchor-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420308_253892949">20.409 text:animation</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420310_253892949">20.410 text:animation-delay</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420312_253892949">20.411 text:animation-direction</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420314_253892949">20.412 text:animation-repeat</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420316_253892949">20.413 text:animation-start-inside</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420318_253892949">20.414 text:animation-steps</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420320_253892949">20.415 text:animation-stop-inside</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420322_253892949">20.416 text:condition</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420324_253892949">20.417 text:display</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420326_253892949">20.418 text:dont-balance-text-columns</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420328_253892949">20.419 text:line-break</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420330_253892949">20.420 text:line-number</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420332_253892949">20.421 text:list-level-position-and-space-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420334_253892949">20.422 text:min-label-distance</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420336_253892949">20.423 text:min-label-width</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420338_253892949">20.424 text:number-lines</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__1420340_253892949">20.425 text:space-before</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420384_253892949">Appendix A. OpenDocument Relax NG Schema</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420386_253892949">Appendix B. OpenDocument Metadata Manifest Ontology</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420388_253892949">Appendix C. MIME Types and File Name Extensions (Non Normative)</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__440376_826425813">Appendix D. Accessibility Guidelines (Non Normative)</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420390_253892949">D.1. Title, Description and Caption of Graphical Elements</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420392_253892949">D.1.1. Guidance for authors</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420394_253892949">D.1.2. Authoring tool responsibility for presenting and prompting for the &lt;svg:title&gt; and &lt;svg:desc&gt; elements</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420396_253892949">D.2. Hyperlink Titles</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420398_253892949">D.3. Tables in Presentations</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420400_253892949">D.4. Further Guidelines</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420402_253892949">Appendix E. Bidirectional (BiDi) Scripts,Numeric Digits Presentation and Calendars (Non Normative)</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420404_253892949">E.1. Paragraph and Layout Direction</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420406_253892949">E.2. Numeric Digits Presentation and Calendars</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420408_253892949">Appendix F. Recommended Usage of SMIL</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420410_253892949">F.1. Slide Animation</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420412_253892949">F.2. Main Sequence</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420414_253892949">F.3. Interactive Sequence</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420416_253892949">Appendix G. Changes From Previous Specification Versions (Non Normative)</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__1420418_253892949">G.1. Changes from “Open Document Format for Office Applications (OpenDocument) v1.1”</a></p></td></tr></table><h1 class="Heading_20_1"><a id="a1Introduction"><span style="margin-right:0.127cm;">1</span></a><a id="__RefHeading__1414978_253892949"/><a id="Introduction"/>Introduction</h1><h2 class="Heading_20_2"><a id="a1_1Introduction"><span style="margin-right:0.127cm;">1.1</span></a><a id="__RefHeading__1414980_253892949"/>Introduction</h2><p class="Text_20_body">This document is part of the Open Document Format for Office Applications (OpenDocument) Version 1.2 specification. It defines an XML schema for office documents. Office documents includes text documents, spreadsheets, charts and graphical documents like drawings or presentations, but is not restricted to these kinds of documents.</p><p class="Text_20_body">The XML schema for OpenDocument is designed so that documents valid to it can be transformed using XSLT and processing with XML-based tools.</p><h2 class="Heading_20_2"><a id="a1_2Terminology"><span style="margin-right:0.127cm;">1.2</span></a><a id="__RefHeading__1414982_253892949"/>Terminology</h2><p class="Text_20_body">All text is normative unless otherwise labeled.</p><p class="Text_20_body">Text with a gray background color which is contained in boxes is informative. It lists the XML element-element and element-attribute relations for cross reference purposes.</p><p class="Text_20_body">Within the normative text of this specification, the terms "<span class="ISO_20_Keyword">shall</span>", "<span class="ISO_20_Keyword">shall not</span>", "<span class="ISO_20_Keyword">should</span>", "<span class="ISO_20_Keyword">should not</span>", "<span class="ISO_20_Keyword">may</span>" and “need not” are to be interpreted as described in Annex H of <a title="Rules for the structure and drafting of International Standards">[ISO/IEC Directives]</a>.</p><p class="Text_20_body">Within this specification,  attributes and elements are marked as deprecated. Attributes and elements marked as deprecated should not be used any longer, and may be removed from future versions of the specification.</p><p class="Text_20_body">XML Element, attribute names, attribute value types, and attribute values appear in <span class="Source_20_Text">monospace</span> font.</p><p class="Text_20_body">This standard, for illustrative purposes, describes functionality using terminology common in desktop computing environments that contain a display terminal, keyboard and mouse, attached to a computer hosting an operating system with a graphical user interface which includes user interface controls such as input controls, command buttons, selection boxes, etc.</p><p class="Text_20_body">This standard is not limited to such environments. This format can be used by alternative computing environments, with other form factors, non-GUI consumers and producers, assistive technologies, using analogous user interface operations.</p><p class="Text_20_body">Implementation-defined is used in this standard for values or processing that may differ between ODF implementations, but is required to be specified by the implementor for each particular ODF-implementation. </p><p class="Text_20_body">Implementation-dependent is used in this standard for values or processing that may differ between ODF implementations, but is not required to be specified by the implementor for each particular ODF-implementation. </p><h2 class="Heading_20_2"><a id="a1_3Normative_References"><span style="margin-right:0.127cm;">1.3</span></a><a id="__RefHeading__1414984_253892949"/>Normative References</h2><p class="P6_borderStart">[<span class="Strong_20_Emphasis">CSS2</span>]        Bert Bos, Håkon Wium Lie, Chris Lilley, Ian Jacobs, <span class="Emphasis">Cascading Style Sheets, level 2</span>, <a href="http://www.w3.org/TR/1998/REC-CSS2-19980512">http://www.w3.org/TR/1998/REC-CSS2-19980512</a>, W3C, 1998.</p><p class="P6">[<span class="Strong_20_Emphasis">DCMI</span>]        <span class="Emphasis">Dublin Core Metadata Element Set, Version 1.1: Reference Description</span>, <a href="http://www.dublincore.org/documents/2008/01/14/dces/">http://www.dublincore.org/documents/2008/01/14/dces/</a>, Dublin Core Metadata Initiative, 2003.</p><p class="P6">[<span class="Strong_20_Emphasis">DOMEvents2</span>]        Tom Pixley, <span class="Emphasis">Document Object Model (DOM) Level 2 Events Specification</span>, <a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113">http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113</a>, W3C, 2000.</p><p class="P6">[<span class="Strong_20_Emphasis">GRDDL</span>]        Don Conolly, <span class="Emphasis">Gleaning Resource Descriptions from Dialects of Languages (GRDDL)</span>, <a href="http://www.w3.org/TR/2007/REC-grddl-20070911/">http://www.w3.org/TR/2007/REC-grddl-20070911/</a>, W3C, 2007.</p><p class="P6">[<span class="Strong_20_Emphasis">HTML4</span>]        Dave Raggett, Arnaud Le Hors, Ian Jacobs, <span class="Emphasis">HTML 4.01 Specification</span>, <a href="http://www.w3.org/TR/1999/REC-html401-19991224">http://www.w3.org/TR/1999/REC-html401-19991224</a>, W3C, 1999.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO/IEC Directives</span>]        ISO/IEC Directives, Part 2 (Fifth Edition) <span class="Emphasis">Rules for the structure and drafting of International Standards</span>, International Organization for Standardization and International Electrotechnical Commission, 2004.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO15924</span>]        ISO 15924:2004 <span class="Emphasis">Information and documentation -- Codes for the representation of names of scripts</span>, International Organization for Standardization and International Electrotechnical Commission, 2004.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO3166-1</span>]        ISO 3166-1:2006/Cor 1:2007   <span class="Emphasis">Codes for the representation of names of countries and their subdivisions -- Part 1: Country codes</span>, International Organization for Standardization and International Electrotechnical Commission, 2007.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO3166-2</span>]        ISO 3166-2:2007 <span class="Emphasis">Codes for the representation of names of countries and their subdivisions -- Part 2: Country subdivision code</span>, International Organization for Standardization and International Electrotechnical Commission, 2007.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO3166-3</span>]        ISO 3166-3:1999 <span class="Emphasis">Codes for the representation of names of countries and their subdivisions -- Part 3: Code for formerly used names of countries</span>, International Organization for Standardization and International Electrotechnical Commission, 1999.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO639-1</span>]        ISO 639-1:2002 <span class="Emphasis">Codes for the representation of names of languages -- Part 1: Alpha-2 code</span>, International Organization for Standardization and International Electrotechnical Commission, 2002.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO639-2</span>]        ISO 639-2:1998 <span class="Emphasis">Codes for the representation of names of languages -- Part 2: Alpha-3 code</span>, International Organization for Standardization and International Electrotechnical Commission, 1998.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO639-3</span>]        ISO 639-3:2007 <span class="Emphasis">Codes for the representation of names of languages -- Part 3: Alpha-3 code for comprehensive coverage of languages</span>, International Organization for Standardization and International Electrotechnical Commission, 2007.</p><p class="P6">[<span class="Strong_20_Emphasis">ISO8601</span>]        ISO 8601:2004 <span class="Emphasis">Data elements and interchange formats -- Information interchange -- Representation of dates and times</span>, International Organization for Standardization and International Electrotechnical Commission, 2004.</p><p class="P6">[<span class="Strong_20_Emphasis">JIS X 0301</span>]        JIS X 0301:2002 <span class="Emphasis">Data elements and interchange formats -- Information interchange -- Representation of dates and times</span>, Japanese Standards Association, 2002.</p><p class="P6">[<span class="Strong_20_Emphasis">MathML</span>]        David Carlisle, Patrick Ion, Robert Miner, Nico Poppelier, <span class="Emphasis">Mathematical Markup Language (MathML) Version 2.0 (Second Edition)</span>, <a href="http://www.w3.org/TR/2003/REC-MathML2-20031021/">http://www.w3.org/TR/2003/REC-MathML2-20031021/</a>, W3C, 2003.</p><p class="P6">[<span class="Strong_20_Emphasis">OLE</span>]         Kraig Brockschmidt, Inside OLE, Microsoft Press, 1995, ISBN: 1-55615-843-2</p><p class="P6">[<span class="Strong_20_Emphasis">OWL</span>]        Deborah L. McGuinness, Frank van Harmelen, <span class="Emphasis">OWL Web Ontology Language Overview</span>, <a href="http://www.w3.org/TR/2004/REC-owl-features-20040210/">http://www.w3.org/TR/2004/REC-owl-features-20040210/</a>, W3C, 2004.</p><p class="P6">[<span class="Strong_20_Emphasis">RDF-CONCEPTS</span>]        Graham Klyne, Jeremy J. Carroll, Brian McBride, <span class="Emphasis">Resource Description Framework (RDF): Concepts and Abstract Syntax</span>, <a href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/</a>, W3C, 2004.</p><p class="P6">[<span class="Strong_20_Emphasis">RDFa</span>]        Ben Adida, Mark Birbeck, Shane McCarron, Steven Pemberton, <span class="Emphasis">RDFa in XHTML: Syntax and Processing</span>, <a href="http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014">http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014</a>, W3C, 2008.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC2045</span>]        N. Freed and N. Borenstein, <span class="Emphasis">Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</span>, <a href="http://www.ietf.org/rfc/rfc2045.txt">http://www.ietf.org/rfc/rfc2045.txt</a>, IETF, 1996.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC2616</span>]        R. Fielding, et al., <span class="Emphasis"> Hypertext Transfer Protocol -- HTTP/1.1</span>, <a href="http://www.ietf.org/rfc/rfc2616.txt">http://www.ietf.org/rfc/rfc2616.txt</a>, IETF, 1999.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC3987</span>]        M. Duerst, M. Suignard, <span class="Emphasis">Internationalized Resource Identifiers (IRIs)</span>, <a href="http://www.ietf.org/rfc/rfc3987.txt">http://www.ietf.org/rfc/rfc3987.txt</a>, IETF, 2005.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC4288</span>]        N. Freed, J. Klensin, <span class="Emphasis">Media Type Specifications and Registration Procedures</span>, <a href="http://www.ietf.org/rfc/rfc4288.txt">http://www.ietf.org/rfc/rfc4288.txt</a>, IETF, 2005.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC4514</span>]        K. Zeilenga, <span class="Emphasis">Lightweight Directory Access Protocol (LDAP): String Representation of Distinguished Names</span>, <a href="http://tools.ietf.org/html/rfc4514">http://tools.ietf.org/html/rfc4514</a>, IETF, 2006.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC5646</span>]        A. Phillips, M. Davis, <span class="Emphasis">Tags for Identifying Languages</span>, <a href="http://www.ietf.org/rfc/rfc5646.txt">http://www.ietf.org/rfc/rfc5646.txt</a>, IETF, 2009.</p><p class="P6">[<span class="Strong_20_Emphasis">RNG</span>]        ISO/IEC 19757-2 <span class="Emphasis">Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG</span>, International Organization for Standardization and International Electrotechnical Commission, 2003.</p><p class="P6">[<span class="Strong_20_Emphasis">SMIL20</span>]        Jeff Ayars, etc al., <span class="Emphasis">Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]</span>, <a href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">http://www.w3.org/TR/2005/REC-SMIL2-20050107/</a>, W3C, 2001.</p><p class="P6">[<span class="Strong_20_Emphasis">SQL</span>]        ISO/IEC 9075-1:2008 <span class="Emphasis">Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)</span>, International Organization for Standardization and International Electrotechnical Commission, 2008.</p><p class="P6">[<span class="Strong_20_Emphasis">SVG</span>]        Jon Ferraiolo, 藤沢 淳 (FUJISAWA Jun), Dean Jackson, <span class="Emphasis">Scalable Vector Graphics (SVG) 1.1</span>, <a href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">http://www.w3.org/TR/2003/REC-SVG11-20030114/</a>, W3C, 2003.</p><p class="P6">[<span class="Strong_20_Emphasis">UNICODE</span>]        The Unicode Consortium. The Unicode Standard, Version 5.2.0, defined by: <span class="Emphasis">The Unicode Standard, Version 5.2</span> (Boston, MA, Addison-Wesley, 2009. ISBN 978-1-936213-00-9).</p><p class="P6">[<span class="Strong_20_Emphasis">UTR18</span>]<span class="Emphasis">        </span> Mark Davis, Andy Heninger, <span class="Emphasis">Unicode Regular Expressions</span>, Unicode Technical Report #18, <a href="http://www.unicode.org/reports/tr18/tr18-13.html">http://www.unicode.org/reports/tr18/tr18-13.html</a>, 2008.</p><p class="P6">[<span class="Strong_20_Emphasis">Variability</span>]        Dominique Hazaël-Massieux, Lynne Rosenthal, <span class="Emphasis">Variability in Specifications</span>, <a href="http://www.w3.org/TR/2005/NOTE-spec-variability-20050831/">http://www.w3.org/TR/2005/NOTE-spec-variability-20050831/</a>, W3C, 2005.</p><p class="P6">[<span class="Strong_20_Emphasis">XForms</span>]        John M. Boyer, <span class="Emphasis">XForms 1.0 (Third Edition)</span>, <a href="http://www.w3.org/TR/2007/REC-xforms-20071029/">http://www.w3.org/TR/2007/REC-xforms-20071029/</a>, W3C, 2007.</p><p class="P6">[<span class="Strong_20_Emphasis">XLink</span>]        Steve DeRose, Eve Maler, David Orchard, <span class="Emphasis">XML Linking Language (XLink) Version 1.0</span>, <a href="http://www.w3.org/TR/2001/REC-xlink-20010627/">http://www.w3.org/TR/2001/REC-xlink-20010627/</a>, W3C, 2001.</p><p class="P6">[<span class="Strong_20_Emphasis">XML-ID</span>]        Jonathan Marsh, Daniel Veillard, Norman Walsh, <span class="Emphasis">xml:id Version 1.0</span>, <a href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">http://www.w3.org/TR/2005/REC-xml-id-20050909/</a>, W3C, 2005.</p><p class="P6">[<span class="Strong_20_Emphasis">xml-names</span>]        Tim Bray rt al., <span class="Emphasis">Namespaces in XML 1.0 (Second Edition)</span>, <a href="http://www.w3.org/TR/2006/REC-xml-names-20060816">http://www.w3.org/TR/2006/REC-xml-names-20060816</a>, W3C, 2006.</p><p class="P6">[<span class="Strong_20_Emphasis">XML1.0</span>]        Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler, François Yergeau , <span class="Emphasis">Extensible Markup Language (XML) 1.0 (Fourth Edition)</span>, <a href="http://www.w3.org/TR/2006/REC-xml-20060816/">http://www.w3.org/TR/2006/REC-xml-20060816/</a>, W3C, 2006.</p><p class="P6">[<span class="Strong_20_Emphasis">xmlenc-core</span>]        Donald Eastlake, Joseph Reagle, <span class="Emphasis">XML Encryption Syntax and Processing</span>, <a href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/</a>, W3C, 2002.</p><p class="P6">[<span class="Strong_20_Emphasis">xmlschema-2</span>]        Paul V. Biron, Ashok Malhotra, <span class="Emphasis">XML Schema Part 2: Datatypes Second Edition</span>, <a href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/</a>, W3C, 2004.</p><p class="P6">[<span class="Strong_20_Emphasis">XPath</span>]        James Clark, Steve DeRose, <span class="Emphasis">XML Path Language (XPath) Version 1.0</span>, <a href="http://www.w3.org/TR/1999/REC-xpath-19991116">http://www.w3.org/TR/1999/REC-xpath-19991116</a>, W3C, 1999.</p><p class="P6_borderEnd">[<span class="Strong_20_Emphasis">XSL</span>]        Sharon Adler, et al., <span class="Emphasis">Extensible Stylesheet Language (XSL)</span>, <a href="http://www.w3.org/TR/2001/REC-xsl-20011015/">http://www.w3.org/TR/2001/REC-xsl-20011015/</a>, W3C, 2001.</p><h2 class="Heading_20_2"><a id="a1_4Non_Normative_References"><span style="margin-right:0.127cm;">1.4</span></a><a id="__RefHeading__1414986_253892949"/>Non Normative References</h2><p class="P6_borderStart"><span class="Strong_20_Emphasis">[BibTeXing]</span>        Oren Patashnik, <span class="Emphasis">BIBT E Xing</span>, <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.6093">http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.6093</a>, 1988</p><p class="P6">[<span class="Strong_20_Emphasis">CSS3Text</span>]        Michel Suignard, <span class="Emphasis">CSS3 Text Module</span>, <a href="http://www.w3.org/TR/2003/CR-css3-text-20030514">http://www.w3.org/TR/2003/CR-css3-text-20030514</a>, W3C, 2003.</p><p class="P6">[<span class="Strong_20_Emphasis">DAISY</span>]        <span class="Emphasis">ANSI/NISO Z39.86-2005 Specifications for the Digital Talking Book</span>, <a href="http://www.niso.org/standards/resources/Z39-86-2005.html">http://www.niso.org/standards/resources/Z39-86-2005.html</a>, 2005.</p><p class="P6">[<span class="Strong_20_Emphasis">MIMETYPES</span>]        <span class="Emphasis">MIME Media Types</span>, <a href="http://www.iana.org/assignments/media-types/">http://www.iana.org/assignments/media-types/</a>, IANA.</p><p class="P6">[<span class="Strong_20_Emphasis">ODF10</span>]        OASIS Standard, <span class="Emphasis">Open Document Format for Office Applications (OpenDocument) v1.0</span>, May 2005, <a href="http://docs.oasis-open.org/office/v1.0/OpenDocument-v1.0-os.pdf">http://docs.oasis-open.org/office/v1.0/OpenDocument-v1.0-os.pdf</a>.</p><p class="P6">[<span class="Strong_20_Emphasis">ODF11</span>]        OASIS Standard, <span class="Emphasis">Open Document Format for Office Applications (OpenDocument) v1.1</span>, February 2007, <a href="http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.pdf">http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.pdf</a>.</p><p class="P6">[<span class="Strong_20_Emphasis">PNG</span>]        David Duce, <span class="Emphasis">Portable Network Graphics (PNG) Specification (Second Edition)</span>, <a href="http://www.w3.org/TR/2003/REC-PNG-20031110">http://www.w3.org/TR/2003/REC-PNG-20031110</a>, W3C, 2003.</p><p class="P6">[<span class="Strong_20_Emphasis">RFC3066</span>]        H. Alvestrand, <span class="Emphasis">Tags for the Identification of Languages</span>, <a href="http://www.ietf.org/rfc/rfc3066.txt">http://www.ietf.org/rfc/rfc3066.txt</a>, IETF, 2001.</p><p class="P6">[<span class="Strong_20_Emphasis">UAX9</span>]<span class="Emphasis">        </span>Mark Davis, <span class="Emphasis">The Bidirectional Algorithm</span>, Unicode Standard Annex #9, <a href="http://www.unicode.org/reports/tr9/tr9-15.html">http://www.unicode.org/reports/tr9/tr9-15.html</a>, 2005.</p><p class="P6">[<span class="Strong_20_Emphasis">UTR20</span>]<span class="Emphasis">        </span>Martin Dürst and Asmus Freytag, <span class="Emphasis">Unicode in XML and other Markup Languages</span>, Unicode Technical Report #20, <a href="http://www.unicode.org/reports/tr20/tr20-7.html">http://www.unicode.org/reports/tr20/tr20-7.html</a>, 2003.</p><p class="P6_borderEnd">[<span class="Strong_20_Emphasis">XSLT</span>]        James Clark, <span class="Emphasis">XSL Transformations (XSLT) Version 1.0</span>, <a href="http://www.w3.org/TR/1999/REC-xslt-19991116">http://www.w3.org/TR/1999/REC-xslt-19991116</a>, W3C, 1999.</p><h2 class="Heading_20_2"><a id="a1_5Namespaces"><span style="margin-right:0.127cm;">1.5</span></a><a id="__RefHeading__1414988_253892949"/><a id="Namespaces"/>Namespaces</h2><p class="Text_20_body">The namespaces used or defined by OpenDocument are listed in tables 1-4. </p><p class="Note"><span class="Note_20_Label">Note:</span> The defined XML namespaces conform to the <span class="Emphasis">Namespaces in XML</span> specification <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.</p><p class="Text_20_body">This specification uses the prefixes defined in tables 1 and 2 when referring to elements and attributes in this specification. However, implementors may use any prefix, provided that there is a namespace declaration that binds the prefix to the IRI of the corresponding namespace.</p><p class="Table">Table <a id="refTable0"/>1 - XML Namespaces defined by the OpenDocument schema</p><table border="0" cellspacing="0" cellpadding="0" class="NamespaceTable"><colgroup><col width="96"/><col width="271"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Text_20_body">anim</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Text_20_body">Elements and attributes that describe animation content.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>animation:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">chart</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe chart content.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>chart:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">config</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe application specific settings.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>config:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Text_20_body">db</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Text_20_body">For elements and attributes that describe database specific objects.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>database:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">dr3d</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe 3D graphic content.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>dr3d:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">draw</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe graphic content.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>drawing:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">form</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe forms and controls.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>form:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">manifest</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attribute contained in the package manifest.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>manifest:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">meta</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe meta information.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>meta:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">number</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe data style information.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>datastyle:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">office</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">All common pieces of information that are not contained in another, more specific namespace.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>office:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">presentation</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe presentation content.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>presentation:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">script</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that represent scripts or events.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>script:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">table</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that may occur within spreadsheets or within table definitions of a text document.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>table:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">text</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that may occur within text documents and text parts of other document types.,</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>text:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">style</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attributes that describe the style and inheritance model used by the OpenDocument format. </p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>style:1.0</p></td></tr></table><p class="Table">Table <a id="refTable1"/>2 - XML Namespaces defined by the OpenDocument metadata manifest ontology</p><table border="0" cellspacing="0" cellpadding="0" class="Table15"><colgroup><col width="96"/><col width="271"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8632in; " class="Table15_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4382in; " class="Table15_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="Table15_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="Table15_A2"><p class="Table_20_Contents">odf</p></td><td style="text-align:left;width:2.4382in; " class="Table15_A2"><p class="Table_20_Contents">RDF node property and node elements for OpenDocument package entities</p></td><td style="text-align:left;width:2.6986in; " class="Table15_C2"><p class="Text_20_body">http://docs.oasis-open.org/ns/office/1.2/meta/odf#</p></td></tr></table><p class="Table">Table <a id="refTable2"/>3 - XML Namespaces defined by the OpenDocument schema that include elements and attributes that are compatible to elements and attributes of other standards.</p><table border="0" cellspacing="0" cellpadding="0" class="NamespaceTable2"><colgroup><col width="97"/><col width="271"/><col width="299"/></colgroup><tr><td style="text-align:left;width:0.875in; " class="NamespaceTable2_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4375in; " class="NamespaceTable2_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6979in; " class="NamespaceTable2_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.875in; " class="NamespaceTable2_A2"><p class="Table_20_Contents">fo</p></td><td style="text-align:left;width:2.4375in; " class="NamespaceTable2_A2"><p class="Table_20_Contents">Attributes that are compatible to attributes defined in <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p></td><td style="text-align:left;width:2.6979in; " class="NamespaceTable2_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>xsl-fo-compatible:1.0</p></td></tr><tr><td style="text-align:left;width:0.875in; " class="NamespaceTable2_A2"><p class="Table_20_Contents">svg</p></td><td style="text-align:left;width:2.4375in; " class="NamespaceTable2_A2"><p class="Table_20_Contents">Elements and attributes that are compatible to elements or attributes defined in <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p></td><td style="text-align:left;width:2.6979in; " class="NamespaceTable2_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>svg-compatible:1.0</p></td></tr><tr><td style="text-align:left;width:0.875in; " class="NamespaceTable2_A2"><p class="Text_20_body">smil</p></td><td style="text-align:left;width:2.4375in; " class="NamespaceTable2_A2"><p class="Text_20_body">Attributes that are compatible to attributes defined in <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p></td><td style="text-align:left;width:2.6979in; " class="NamespaceTable2_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>smil-compatible:1.0</p></td></tr></table><p class="Table">Table <a id="refTable3"/>4 - XML Namespaces used by the OpenDocument schema</p><table border="0" cellspacing="0" cellpadding="0" class="Table5"><colgroup><col width="96"/><col width="270"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8646in; " class="Table5_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4368in; " class="Table5_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table5_A2"><p class="Table_20_Contents">dc</p></td><td style="text-align:left;width:2.4368in; " class="Table5_A2"><p class="Table_20_Contents">The Dublin Core Namespace (see <a title="Dublin Core Metadata Element Set, Version 1.1: Reference Description" href="http://www.dublincore.org/documents/2008/01/14/dces/">[DCMI]</a>).</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C2"><p class="Table_20_Contents">http://purl.org/dc/elements/1.1/</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table5_A2"><p class="Table_20_Contents">math</p></td><td style="text-align:left;width:2.4368in; " class="Table5_A2"><p class="Table_20_Contents">MathML Namespace (see <a title="Mathematical Markup Language (MathML) Version 2.0 (Second Edition)" href="http://www.w3.org/TR/2003/REC-MathML2-20031021/">[MathML]</a>)</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C2"><p class="Table_20_Contents">http://www.w3.org/1998/Math/MathML</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table5_A2"><p class="Text_20_body">xforms</p></td><td style="text-align:left;width:2.4368in; " class="Table5_A2"><p class="Text_20_body">The XForms namespace (see <a title="XForms 1.0 (Third Edition)" href="http://www.w3.org/TR/2007/REC-xforms-20071029/">[XForms]</a>).</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C2"><p class="Text_20_body">http://www.w3.org/2002/xforms</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table5_A2"><p class="Table_20_Contents">xlink</p></td><td style="text-align:left;width:2.4368in; " class="Table5_A2"><p class="Table_20_Contents">The XLink namespace (see <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a>).</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C2"><p class="Table_20_Contents">http://www.w3.org/1999/xlink</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table5_A2"><p class="Text_20_body">xhtml</p></td><td style="text-align:left;width:2.4368in; " class="Table5_A2"><p class="Text_20_body">RDFa attributes (see <a title="RDFa in XHTML: Syntax and Processing" href="http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014">[RDFa]</a>).</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C2"><p class="Text_20_body">http://www.w3.org/1999/xhtml</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table5_A2"><p class="Text_20_body">grddl </p></td><td style="text-align:left;width:2.4368in; " class="Table5_A2"><p class="Text_20_body">GRDDL attributes (see <a title="Gleaning Resource Descriptions from Dialects of Languages (GRDDL)" href="http://www.w3.org/TR/2007/REC-grddl-20070911/">[GRDDL]</a>)</p></td><td style="text-align:left;width:2.6986in; " class="Table5_C2"><p class="Text_20_body">http://www.w3.org/2003/g/data-view# </p></td></tr></table><p class="Table">Table <a id="refTable4"/>5 - XML Namespaces defined by the OpenDocument metadata manifest ontology</p><table border="0" cellspacing="0" cellpadding="0" class="Table19"><colgroup><col width="96"/><col width="271"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8632in; " class="Table19_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4382in; " class="Table19_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="Table19_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="Table19_A2"><p class="Table_20_Contents">pkg</p></td><td style="text-align:left;width:2.4382in; " class="Table19_A2"><p class="Table_20_Contents">OWL classes and properties contained in metadata manifest files.</p></td><td style="text-align:left;width:2.6986in; " class="Table19_C2"><p class="Text_20_body">http://docs.oasis-open.org/ns/office/1.2/meta/pkg#</p></td></tr></table><p class="Table">Table <a id="refTable5"/>6 - Other XML Namespaces defined by this specification</p><table border="0" cellspacing="0" cellpadding="0" class="Table18"><colgroup><col width="96"/><col width="270"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8646in; " class="Table18_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4368in; " class="Table18_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="Table18_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table18_A2"><p class="Table_20_Contents">of</p></td><td style="text-align:left;width:2.4368in; " class="Table18_A2"><p class="Table_20_Contents">Namespace for formulas defined by part 2 of this specification that occur in attribute values. </p></td><td style="text-align:left;width:2.6986in; " class="Table18_C2"><p class="Table_20_Contents">urn:oasis:names:tc:opendocument:xmlns:of:1.2 </p></td></tr></table><h1 class="Heading_20_1"><a id="a2OpenDocument_Documents__Consumers_and_Producers"><span style="margin-right:0.127cm;">2</span></a><a id="__RefHeading__440342_826425813"/>OpenDocument Documents, Consumers and Producers</h1><h2 class="Heading_20_2"><a id="a2_1Introduction"><span style="margin-right:0.127cm;">2.1</span></a><a id="__RefHeading__1718302_1219268628"/>Introduction</h2><p class="Text_20_body">The OpenDocument specification defines conformance for documents, consumers, and producers, with two conformance classes called conforming and extended conforming. It further defines conforming text, spreadsheet, drawing, presentation, chart, image, formula and database front end documents. This chapter defines the basic requirements for the individual conformance targets. </p><h2 class="Heading_20_2"><a id="a2_2Documents"><span style="margin-right:0.127cm;">2.2</span></a><a id="__RefHeading__440344_826425813"/>Documents</h2><h3 class="Heading_20_3"><a id="a2_2_1OpenDocument_Document"><span style="margin-right:0.127cm;">2.2.1</span></a><a id="__RefHeading__440346_826425813"/><a id="OpenDocument_Document"/>OpenDocument Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument</span><span class="Definition"> </span><span class="Def">document</span> <span class="ISO_20_Keyword">shall</span> meet the following requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>If the document is an OpenDocument package, then <span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">A.1)</span>it <span class="ISO_20_Keyword">shall</span> be a conforming OpenDocument package (C19), and<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">A.2)</span>the package <span class="ISO_20_Keyword">shall</span> contain at least one of the following files: content.xml and styles.xml. It <span class="ISO_20_Keyword">may</span> contain additional files, including files named settings.xml and meta.xml.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package, then the following requirements <span class="ISO_20_Keyword">shall</span> be met for its contained files named content.xml, styles.xml, settings.xml and meta.xml, if present:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.1)</span>The files <span class="ISO_20_Keyword">shall</span> be well formed XML documents with respect to the XML 1.0 <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a> specification.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2)</span>The XML root elements of the files <span class="ISO_20_Keyword">shall</span> be <span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:1cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2.1)</span><span class="Element">&lt;office:document-content&gt;</span> or <span class="Element">&lt;math:math&gt;</span> for files named content.xml,<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:1cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2.2)</span><span class="Element">&lt;office:document-styles&gt;</span> for files named styles.xml,<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:1cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2.3)</span><span class="Element">&lt;office:document-meta&gt;</span> for files named meta.xml,<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:1cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2.4)</span><span class="Element">&lt;office:document-settings&gt;</span> for files named settings.xml.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.3)</span>If the XML root element of a file is <span class="Element">&lt;office:document-content&gt;</span>, <span class="Element">&lt;office:document-styles&gt;</span>, <span class="Element">&lt;office:document-meta&gt;</span> or <span class="Element">&lt;office:document-settings&gt;</span>, then the XML file <span class="ISO_20_Keyword">shall</span> be valid with respect to the schema defined in appendix A.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.4)</span>If the XML root element of a file is <span class="Element">&lt;math:math&gt;</span>, then the XML file <span class="ISO_20_Keyword">shall </span>be valid with respect to the MathML 2.0 <a title="Mathematical Markup Language (MathML) Version 2.0 (Second Edition)" href="http://www.w3.org/TR/2003/REC-MathML2-20031021/">[MathML]</a> schema.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>If the document is a single XML file, then <span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">C.1)</span>the file <span class="ISO_20_Keyword">shall</span> be a well formed XML document with respect to the XML 1.0 <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a> specification<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">C.2)</span>the XML root element of the file <span class="ISO_20_Keyword">shall</span> be <span class="Element">&lt;office:document&gt;</span>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">C.3)</span>the XML file <span class="ISO_20_Keyword">shall</span> be valid with respect to the schema defined in appendix A.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">D)</span><a id="__DdeLink__219857_16104159831"/>The files contained in a package listed in B) or the single file listed in C) meet the following requirements:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">D.1)</span>They <span class="ISO_20_Keyword">shall</span> be namespace-well-formed with regard to the XML Namespaces specification <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">D.2)</span>They <span class="ISO_20_Keyword">shall</span> conform to the xml-id specification <a title="xml:id Version 1.0" href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">[XML-ID]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">D.3)</span>If a <span class="Attribute">style:condition</span>, <span class="Attribute">table:condition</span>, <span class="Attribute">table:expression</span>, <span class="Attribute">table:formula</span> or <span class="Attribute">text:formula</span> attribute value begins with a namespace prefix bound to namespace "urn:oasis:names:tc:opendocument:xmlns:of:1.2," the syntax and semantics of the attribute value portions that are expressions determined by the prefix shall conform to part 2 of this specification. If a namespace prefix is omitted at the beginning of the attribute value, the attribute value portions that are expressions determined by a prefix shall conform as if there were a prefix bound to namespace "urn:oasis:names:tc:opendocument:xmlns:of:1.2".<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">E)</span>It shall conform to one of: (C3) OpenDocument Text Document, (C4) OpenDocument Spreadsheet Document, (C5) OpenDocument Drawing Document, (C6) OpenDocument Presentation Document, (C7) OpenDocument Chart Document, (C8) OpenDocument Image Document, (C9) OpenDocument Formula Document, (C10) OpenDocument Database Front End Document. <span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_2OpenDocument_Extended_Document"><span style="margin-right:0.127cm;">2.2.2</span></a><a id="__RefHeading__440348_826425813"/>OpenDocument Extended Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument extended document</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a conforming document listed in <a href="#OpenDocument_Document">2.2.1</a> except A.1), B.3), C.3) and E) and <span class="ISO_20_Keyword">shall</span> meet the following requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>If the document is an OpenDocument package, then it shall be a conforming ODF extended package (C20) <span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package, then the following requirement <span class="ISO_20_Keyword">shall</span> be met for its contained files named content.xml, styles.xml, settings.xml and meta.xml, if present:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.1)</span>If the XML root element of a file is <span class="Element">&lt;office:document-content&gt;</span>, <span class="Element">&lt;office:document-styles&gt;</span>, <span class="Element">&lt;office:document-meta&gt;</span> or <span class="Element">&lt;office:document-settings&gt;</span>, then the XML file <span class="ISO_20_Keyword">shall</span> be valid with respect to the schema defined in appendix A, after the following processing of foreign elements has taken place:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:1cm;"><span style="display:block;float:left;min-width:0.1011cm">B.1.1)</span>Foreign elements and attributes, as defined in section 3.17 have been removed.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:1cm;"><span style="display:block;float:left;min-width:0.1011cm">B.1.2)</span>The content of foreign elements has been processed as defined in section 3.17.<span class="odfLiEnd"/> </p></li></ol></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>If the document is a single XML file, then the XML files <span class="ISO_20_Keyword">shall</span> be valid with respect to the schema defined in appendix A, after processing of foreign elements as defined in B1) has taken place.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_3OpenDocument_Text_Document"><span style="margin-right:0.127cm;">2.2.3</span></a><a id="__RefHeading__440350_826425813"/>OpenDocument Text Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Text document</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element <span class="ISO_20_Keyword">shall</span> have an <span class="Attribute">office:mimetype</span> attribute with one of these values: "application/vnd.oasis.opendocument.text", "application/vnd.oasis.opendocument.text-template" or "application/vnd.oasis.opendocument.text-master".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it <span class="ISO_20_Keyword">shall</span> contain a file named mimetype containing one of these strings: "application/vnd.oasis.opendocument.text", "application/vnd.oasis.opendocument.text-template" or "application/vnd.oasis.opendocument.text-master".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element <span class="ISO_20_Keyword">shall</span> have the child element <span class="Element">&lt;office:text&gt;</span>.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_4OpenDocument_Spreadsheet_Document"><span style="margin-right:0.127cm;">2.2.4</span></a><a id="__RefHeading__440352_826425813"/>OpenDocument Spreadsheet Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Spreadsheet document</span> shall meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element <span class="ISO_20_Keyword">shall</span> have an <span class="Attribute">office:mimetype</span> attribute with one of these values: "application/vnd.oasis.opendocument.spreadsheet" or "application/vnd.oasis.opendocument.spreadsheet-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it <span class="ISO_20_Keyword">shall</span> contain a file named mimetype containing one of these strings: "application/vnd.oasis.opendocument.spreadsheet" or "application/vnd.oasis.opendocument.spreadsheet-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element <span class="ISO_20_Keyword">shall</span> have the child element <span class="Element">&lt;office:spreadsheet&gt;</span>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">D)</span>All namespace prefixes used in the values of <span class="Attribute">table:formula</span> attributes values <span class="ISO_20_Keyword">shall</span> be bound to the "urn:oasis:names:tc:opendocument:xmlns:of:1.2 " namespace.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">E)</span>All <span class="Attribute">table:formula</span> attribute values <span class="ISO_20_Keyword">shall</span> be a conforming OpenDocument Formula expression (C15).<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_5OpenDocument_Drawing_Document"><span style="margin-right:0.127cm;">2.2.5</span></a><a id="__RefHeading__440354_826425813"/>OpenDocument Drawing Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Drawing document</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element shall have an <span class="Attribute">office:mimetype</span> attribute with one of these values: "application.vnd.oasis.opendocument.graphics" or "application/vnd.oasis.opendocument.graphic-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it <span class="ISO_20_Keyword">shall</span> contain a file named mimetype containing one of these strings: "application.vnd.oasis.opendocument.graphics" or "application/vnd.oasis.opendocument.graphic-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element shall have the child element <span class="Element">&lt;office:drawing&gt;</span>.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_6OpenDocument_Presentation_Document"><span style="margin-right:0.127cm;">2.2.6</span></a><a id="__RefHeading__440356_826425813"/>OpenDocument Presentation Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Presentation document</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element <span class="ISO_20_Keyword">shall</span> have an <span class="Attribute">office:mimetype</span> attribute with one of these values: "application/vnd.oasis.opendocument.presentation" or "application/vnd.oasis.opendocument.presentation-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it <span class="ISO_20_Keyword">shall</span> contain a file named mimetype containing one of these strings: "application/vnd.oasis.opendocument.presentation" or "application/vnd.oasis.opendocument.presentation-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element <span class="ISO_20_Keyword">shall</span> have the child element <span class="Element">&lt;office:presentation&gt;</span>.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_7OpenDocument_Chart_Document"><span style="margin-right:0.127cm;">2.2.7</span></a><a id="__RefHeading__440358_826425813"/>OpenDocument Chart Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Chart document</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element <span class="ISO_20_Keyword">shall</span> have an <span class="Attribute">office:mimetype</span> attribute with one of these values: "application/vnd.oasis.opendocument.chart" or "application/vnd.oasis.opendocument.chart-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it <span class="ISO_20_Keyword">shall</span> contain a file named mimetype containing one of these strings: "application/vnd.oasis.opendocument.chart" or "application/vnd.oasis.opendocument.chart-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element <span class="ISO_20_Keyword">shall</span> have the child element <span class="Element">&lt;office:chart&gt;</span>.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_8OpenDocument_Image_Document"><span style="margin-right:0.127cm;">2.2.8</span></a><a id="__RefHeading__440360_826425813"/>OpenDocument Image Document</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Image document</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element <span class="ISO_20_Keyword">shall</span> have an <span class="Attribute">office:mimetype</span> attribute with one of these values: "application/vnd.oasis.opendocument.image" or "application/vnd.oasis.opendocument.image-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it <span class="ISO_20_Keyword">shall</span> contain a file named mimetype containing one of these strings: "application/vnd.oasis.opendocument.image" or "application/vnd.oasis.opendocument.image-template".<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element <span class="ISO_20_Keyword">shall</span> have the child element <span class="Element">&lt;office:image&gt;</span>.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_9OpenDocument_Formula_Document"><span style="margin-right:0.127cm;">2.2.9</span></a><a id="__RefHeading__440362_826425813"/>OpenDocument Formula Document</h3><p class="Text_20_body">An <span class="Def">OpenDocument Formula document</span> shall meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements: </p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>If the document is an OpenDocument package. The OpenDocument package shall contain a file named mimetype with content being the string "application/vnd.oasis.opendocument.formula". <span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>The package "content.xml" file shall have a <span class="Element">&lt;math:math&gt;</span> root element. <span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_2_10OpenDocument_Database_Front_End_Document"><span style="margin-right:0.127cm;">2.2.10</span></a><a id="__RefHeading__440364_826425813"/>OpenDocument Database Front End Document</h3><p class="Text_20_body">An <span class="Def">OpenDocument Database Front End document</span> shall meet all requirements of a Conforming OpenDocument Document, as well as the following additional requirements: </p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>The <span class="Element">&lt;office:document&gt;</span> element shall have an <span class="Attribute">office:mimetype</span> attribute with the value "application/vnd.oasis.opendocument.base". <span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>If the document is an OpenDocument package then it shall contain a file named mimetype containing the string " application/vnd.oasis.opendocument.base". <span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>The <span class="Element">&lt;office:body&gt;</span> element shall have the child element <span class="Element">&lt;office:database&gt;</span>. <span class="odfLiEnd"/> </p></li></ol><h2 class="Heading_20_2"><a id="a2_3Producers"><span style="margin-right:0.127cm;">2.3</span></a><a id="__RefHeading__1420376_2538929491"/>Producers</h2><h3 class="Heading_20_3"><a id="a2_3_1OpenDocument_Producer"><span style="margin-right:0.127cm;">2.3.1</span></a><a id="__RefHeading__440366_826425813"/>OpenDocument Producer</h3><p class="Text_20_body">An<span class="Def"> </span><span class="Def">OpenDocument producer</span> is a program that creates at least one conforming OpenDocument document, and that meets the following additional requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>It <span class="ISO_20_Keyword">may</span> produce conforming OpenDocument extended documents, but it <span class="ISO_20_Keyword">shall</span> have a mode of operation where all OpenDocument documents that are created are conforming OpenDocument documents.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>It <span class="ISO_20_Keyword">shall</span> be accompanied by a document that defines all implementation-defined values used by the OpenDocument producer.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_3_2OpenDocument_Extended_Producer"><span style="margin-right:0.127cm;">2.3.2</span></a><a id="__RefHeading__440368_826425813"/>OpenDocument Extended Producer</h3><p class="Text_20_body">An<span class="Def"> OpenDocument extended producer</span> is a program that creates at least one conforming OpenDocument extended document, and that meets the following additional requirements:</p><ol><li><p class="P15" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>It <span class="ISO_20_Keyword">shall</span> be accompanied by a document that defines all implementation-defined values used by the OpenDocument extended producer.<span class="odfLiEnd"/> </p></li><li><p class="P15" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>It <span class="ISO_20_Keyword">should</span> be accompanied by a document that defines all foreign elements and attributes used by the OpenDocument extended producer.<span class="odfLiEnd"/> </p></li></ol><h2 class="Heading_20_2"><a id="a2_4Consumer"><span style="margin-right:0.127cm;">2.4</span></a><a id="__RefHeading__1420382_2538929491"/>Consumer</h2><p class="Text_20_body">An <span class="Def">OpenDocument consumer</span> is a program that can parse and interpret OpenDocument documents according to the semantics defined by this specification, and that meets the following additional requirements:</p><ol><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>It <span class="ISO_20_Keyword">shall</span> be able to parse and interpret OpenDocument documents of one or more of the document types defined by this specification (see <a href="#element-office_body">3.3</a>) any of which are represented in packages, but it <span class="ISO_20_Keyword">need not</span> interpret the semantics of all elements, attributes and attribute values.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>It <span class="ISO_20_Keyword">may</span> be able to parse and interpret OpenDocument documents stored as single XML document, but it <span class="ISO_20_Keyword">need not</span> interpret the semantics of all elements, attributes and attribute values.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>It <span class="ISO_20_Keyword">shall</span> interpret those elements and attributes it does interpret consistent with the semantics defined for the element or attribute by this specification.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">D)</span>It <span class="ISO_20_Keyword">should</span> be able to parse and interpret conforming OpenDocument extended documents, but it <span class="ISO_20_Keyword">need not</span> interpret the semantics of all elements, attributes and attribute values.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">E)</span>The XML parser used to parse the files contained in a package listed in <a href="#OpenDocument_Document">2.2.1</a>, item B) or the single document listed in <a href="#OpenDocument_Document">2.2.1</a>, item C) meets the following requirements:<span class="odfLiEnd"/> </p><ol><li><p class="P16" style="margin-left:0.635cm;"><span style="display:block;float:left;min-width:0.1011cm">E.1)</span>It <span class="ISO_20_Keyword">shall </span>be a nonvalidating XML processor with regard to the XML 1.0 specification <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0.635cm;"><span style="display:block;float:left;min-width:0.1011cm">E.2)</span>It <span class="ISO_20_Keyword">shall </span>be and be a conforming processor with regard to the XML Namespaces specification <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0.635cm;"><span style="display:block;float:left;min-width:0.1011cm">E.3)</span>It <span class="ISO_20_Keyword">shall</span> conform to the xml-id specification <a title="xml:id Version 1.0" href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">[XML-ID]</a>.<span class="odfLiEnd"/> </p></li></ol></li></ol><h1 class="Heading_20_1"><a id="a3Document_Structure"><span style="margin-right:0.127cm;">3</span></a><a id="__RefHeading__440370_826425813"/><a id="Document_Structure"/>Document Structure</h1><h2 class="Heading_20_2"><a id="a3_1Document_Representation"><span style="margin-right:0.127cm;">3.1</span></a><a id="__RefHeading__1414994_253892949"/>Document Representation </h2><h3 class="Heading_20_3"><a id="a3_1_1General"><span style="margin-right:0.127cm;">3.1.1</span></a><a id="__RefHeading__1414996_253892949"/>General</h3><p class="Text_20_body">OpenDocument defines two methods of document representation:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A single XML document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A collection of files within a package (see OpenDocument specification part 3), each of which stores a part of a complete document.<span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a3_1_2_office_document__Single_OpenDocument_XML_Files_"><span style="margin-right:0.127cm;">3.1.2</span></a><a id="__RefHeading__1414998_253892949"/><a id="element-office_document"/>&lt;office:document&gt;(Single OpenDocument XML Files)</h3><p class="Text_20_body">The <span class="Element">&lt;office:document&gt;</span> element is the root element of a document in OpenDocument format which is represented as a single XML document. It contains the entire document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:document&gt;</span> element is a root element.</p><p class="Parent_20_Element_20_List">The <span class="Element">&lt;office:document&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a> and <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:document&gt;</span> element has the following attributes: <span class="Attribute">grddl:transformation</span> <a href="#attribute-grddl_transformation">19.320</a>, <span class="Attribute">office:mimetype</span> <a href="#attribute-office_mimetype">19.375</a> and <span class="Attribute">office:version</span> <a href="#attribute-office_version">19.386</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:document&gt;</span> element has the following child elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a>, <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>, <span class="Element">&lt;office:font-face-decls&gt;</span> <a href="#element-office_font-face-decls">3.14</a>, <span class="Element">&lt;office:master-styles&gt;</span> <a href="#element-office_master-styles">3.15.4</a>, <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>, <span class="Element">&lt;office:scripts&gt;</span> <a href="#element-office_scripts">3.12</a>, <span class="Element">&lt;office:settings&gt;</span> <a href="#element-office_settings">3.10</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><h3 class="Heading_20_3"><a id="a3_1_3Package_OpenDocument_Files"><span style="margin-right:0.127cm;">3.1.3</span></a><a id="__RefHeading__1415000_253892949"/><a id="Package_OpenDocument_Files"/>Package OpenDocument Files</h3><h4 class="Heading_20_4"><a id="a3_1_3_1General"><span style="margin-right:0.127cm;">3.1.3.1</span></a><a id="__RefHeading__1415002_253892949"/>General</h4><p class="Text_20_body">When an OpenDocument document is represented as a package, there are four root elements, <span class="Element">&lt;office:document-content&gt;</span>, <span class="Element">&lt;office:document-styles&gt;</span>, <span class="Element">&lt;office:document-meta&gt;</span>, and, <span class="Element">&lt;office:document-settings&gt;</span>, each stored as a separate file.</p><p class="Text_20_body">A package may also contain image files, embedded objects and implementation-dependent files.</p><h4 class="Heading_20_4"><a id="a3_1_3_2_office_document-content_"><span style="margin-right:0.127cm;">3.1.3.2</span></a><a id="__RefHeading__1415004_253892949"/><a id="element-office_document-content"/>&lt;office:document-content&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;office:document-content&gt;</span> root element contains document content and automatic styles used in a document. The file within the package for the <span class="Element">&lt;office:document-content&gt;</span> element is content.xml. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:document-content&gt;</span> element is a root element.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:document-content&gt;</span> element has the following attributes: <span class="Attribute">grddl:transformation</span> <a href="#attribute-grddl_transformation">19.320</a> and <span class="Attribute">office:version</span> <a href="#attribute-office_version">19.386</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:document-content&gt;</span> element has the following child elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a>, <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>, <span class="Element">&lt;office:font-face-decls&gt;</span> <a href="#element-office_font-face-decls">3.14</a> and <span class="Element">&lt;office:scripts&gt;</span> <a href="#element-office_scripts">3.12</a>.</p><h4 class="Heading_20_4"><a id="a3_1_3_3_office_document-styles_"><span style="margin-right:0.127cm;">3.1.3.3</span></a><a id="__RefHeading__1415006_253892949"/><a id="element-office_document-styles"/>&lt;office:document-styles&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;office:document-styles&gt;</span> root element contains styles used in document content and automatic styles used in styles. The file within the package for the <span class="Element">&lt;office:document-styles&gt;</span> element is styles.xml.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:document-styles&gt;</span> element is a root element.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:document-styles&gt;</span> element has the following attributes: <span class="Attribute">grddl:transformation</span> <a href="#attribute-grddl_transformation">19.320</a> and <span class="Attribute">office:version</span> <a href="#attribute-office_version">19.386</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:document-styles&gt;</span> element has the following child elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a>, <span class="Element">&lt;office:font-face-decls&gt;</span> <a href="#element-office_font-face-decls">3.14</a>, <span class="Element">&lt;office:master-styles&gt;</span> <a href="#element-office_master-styles">3.15.4</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><h4 class="Heading_20_4"><a id="a3_1_3_4_office_document-meta_"><span style="margin-right:0.127cm;">3.1.3.4</span></a><a id="__RefHeading__1415008_253892949"/><a id="element-office_document-meta"/>&lt;office:document-meta&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;office:document-meta&gt;</span> root element contains document metadata elements. The file within the package for the <span class="Element">&lt;office:document-meta&gt;</span> element is meta.xml.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:document-meta&gt;</span> element is a root element.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:document-meta&gt;</span> element has the following attributes: <span class="Attribute">grddl:transformation</span> <a href="#attribute-grddl_transformation">19.320</a> and <span class="Attribute">office:version</span> <a href="#attribute-office_version">19.386</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:document-meta&gt;</span> element has the following child element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><h4 class="Heading_20_4"><a id="a3_1_3_5_office_document-settings_"><span style="margin-right:0.127cm;">3.1.3.5</span></a><a id="__RefHeading__1415010_253892949"/><a id="element-office_document-settings"/>&lt;office:document-settings&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;office:document-settings&gt;</span> root element contains implementation-dependent settings. The file within the package for the <span class="Element">&lt;office:document-settings&gt;</span> element is settings.xml. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:document-settings&gt;</span> element is a root element.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:document-settings&gt;</span> element has the following attributes: <span class="Attribute">grddl:transformation</span> <a href="#attribute-grddl_transformation">19.320</a> and <span class="Attribute">office:version</span> <a href="#attribute-office_version">19.386</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:document-settings&gt;</span> element has the following child element: <span class="Element">&lt;office:settings&gt;</span> <a href="#element-office_settings">3.10</a>.</p><h3 class="Heading_20_3"><a id="a3_1_4Summary_of_Document_Representation"><span style="margin-right:0.127cm;">3.1.4</span></a><a id="__RefHeading__1415012_253892949"/>Summary of Document Representation</h3><p class="Text_20_body">The models for representing an OpenDocument file are summarized in Table <a href="#refTable6">7</a>. </p><p class="Table">Table <a id="refTable6"/>7 - Root element content models</p><table border="0" cellspacing="0" cellpadding="0" class="Table14"><colgroup><col width="259"/><col width="52"/><col width="45"/><col width="52"/><col width="52"/><col width="52"/><col width="52"/><col width="52"/><col width="48"/></colgroup><tr><td style="text-align:left;width:2.3313in; " class="Table14_A1"><p class="Table_20_Heading">Root Element</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:meta&gt;</span></p></td><td style="text-align:left;width:0.4035in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:settings&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:scripts&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:font-face-decls&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:styles&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:automatic-styles&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A1"><p class="Table_20_Heading"><span class="Element">&lt;office:master-styles&gt;</span></p></td><td style="text-align:left;width:0.4361in; " class="Table14_I1"><p class="Table_20_Heading"><span class="Element">&lt;office:body&gt;</span></p></td></tr><tr><td style="text-align:left;width:2.3313in; " class="Table14_A2"><p class="Table_20_Contents"><span class="Element">&lt;office:document&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4035in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4361in; " class="Table14_I2"><p class="Table_20_Contents_20_Centered">X</p></td></tr><tr><td style="text-align:left;width:2.3313in; " class="Table14_A2"><p class="Table_20_Contents"><span class="Element">&lt;office:document-content&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4035in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4361in; " class="Table14_I2"><p class="Table_20_Contents_20_Centered">X</p></td></tr><tr><td style="text-align:left;width:2.3313in; " class="Table14_A2"><p class="Table_20_Contents"><span class="Element">&lt;office:document-styles&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4035in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4361in; " class="Table14_I2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:2.3313in; " class="Table14_A2"><p class="Table_20_Contents"><span class="Element">&lt;office:document-meta&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4035in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4361in; " class="Table14_I2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:2.3313in; " class="Table14_A2"><p class="Table_20_Contents"><span class="Element">&lt;office:document-settings&gt;</span></p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4035in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4715in; " class="Table14_A2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.4361in; " class="Table14_I2"><p class="Table_20_Contents_20_Centered"> </p></td></tr></table><h2 class="Heading_20_2"><a id="a3_2_office_meta_"><span style="margin-right:0.127cm;">3.2</span></a><a id="__RefHeading__1415014_253892949"/><a id="element-office_meta"/>&lt;office:meta&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:meta&gt;</span> element contains metadata elements for a document that are not specified by a manifest.rdf file. <a href="#manifest_rdf">4.2.2</a></p><p class="Text_20_body">All the child elements of an <span class="Element">&lt;office:meta&gt;</span> element contain metadata about a document as a whole.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:meta&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a> and <span class="Element">&lt;office:document-meta&gt;</span> <a href="#element-office_document-meta">3.1.3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:meta&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:meta&gt;</span> element has the following child elements: <span class="Element">&lt;dc:creator&gt;</span> <a href="#element-dc_creator">4.3.2.7</a>, <span class="Element">&lt;dc:date&gt;</span> <a href="#element-dc_date">4.3.2.10</a>, <span class="Element">&lt;dc:description&gt;</span> <a href="#element-dc_description">4.3.2.3</a>, <span class="Element">&lt;dc:language&gt;</span> <a href="#element-dc_language">4.3.2.15</a>, <span class="Element">&lt;dc:subject&gt;</span> <a href="#element-dc_subject">4.3.2.4</a>, <span class="Element">&lt;dc:title&gt;</span> <a href="#element-dc_title">4.3.2.2</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;meta:creation-date&gt;</span> <a href="#element-meta_creation-date">4.3.2.9</a>, <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>, <span class="Element">&lt;meta:editing-cycles&gt;</span> <a href="#element-meta_editing-cycles">4.3.2.16</a>, <span class="Element">&lt;meta:editing-duration&gt;</span> <a href="#element-meta_editing-duration">4.3.2.17</a>, <span class="Element">&lt;meta:generator&gt;</span> <a href="#element-meta_generator">4.3.2.1</a>, <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> <a href="#element-meta_hyperlink-behaviour">4.3.2.14</a>, <span class="Element">&lt;meta:initial-creator&gt;</span> <a href="#element-meta_initial-creator">4.3.2.6</a>, <span class="Element">&lt;meta:keyword&gt;</span> <a href="#element-meta_keyword">4.3.2.5</a>, <span class="Element">&lt;meta:print-date&gt;</span> <a href="#element-meta_print-date">4.3.2.11</a>, <span class="Element">&lt;meta:printed-by&gt;</span> <a href="#element-meta_printed-by">4.3.2.8</a>, <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a> and <span class="Element">&lt;meta:user-defined&gt;</span> <a href="#element-meta_user-defined">4.3.3</a>.</p><h2 class="Heading_20_2"><a id="a3_3_office_body_"><span style="margin-right:0.127cm;">3.3</span></a><a id="__RefHeading__1415016_253892949"/><a id="element-office_body"/>&lt;office:body&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:body&gt;</span> element contains the elements that represent the content of a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:body&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a> and <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:body&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:body&gt;</span> element has the following child elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:image&gt;</span> <a href="#element-office_image">3.9</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><h2 class="Heading_20_2"><a id="a3_4_office_text_"><span style="margin-right:0.127cm;">3.4</span></a><a id="__RefHeading__1415018_253892949"/><a id="element-office_text"/>&lt;office:text&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:text&gt;</span> element represents the content of a text document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:text&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:text&gt;</span> element has the following attributes: <span class="Attribute">text:global</span> <a href="#attribute-text_global">19.806</a> and <span class="Attribute">text:use-soft-page-breaks</span> <a href="#attribute-text_use-soft-page-breaks">19.897</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:text&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>, <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>, <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>, <span class="Element">&lt;table:content-validations&gt;</span> <a href="#element-table_content-validations">9.4.4</a>, <span class="Element">&lt;table:database-ranges&gt;</span> <a href="#element-table_database-ranges">9.4.14</a>, <span class="Element">&lt;table:data-pilot-tables&gt;</span> <a href="#element-table_data-pilot-tables">9.6.2</a>, <span class="Element">&lt;table:dde-links&gt;</span> <a href="#element-table_dde-links">9.8</a>, <span class="Element">&lt;table:label-ranges&gt;</span> <a href="#element-table_label-ranges">9.4.10</a>, <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:page-sequence&gt;</span> <a href="#element-text_page-sequence">5.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>, <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a>, <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a3_5_office_drawing_"><span style="margin-right:0.127cm;">3.5</span></a><a id="__RefHeading__1415020_253892949"/><a id="element-office_drawing"/>&lt;office:drawing&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:drawing&gt;</span> element represents a drawing document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:drawing&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:drawing&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:drawing&gt;</span> element has the following child elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>, <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>, <span class="Element">&lt;table:content-validations&gt;</span> <a href="#element-table_content-validations">9.4.4</a>, <span class="Element">&lt;table:database-ranges&gt;</span> <a href="#element-table_database-ranges">9.4.14</a>, <span class="Element">&lt;table:data-pilot-tables&gt;</span> <a href="#element-table_data-pilot-tables">9.6.2</a>, <span class="Element">&lt;table:dde-links&gt;</span> <a href="#element-table_dde-links">9.8</a>, <span class="Element">&lt;table:label-ranges&gt;</span> <a href="#element-table_label-ranges">9.4.10</a>, <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a3_6_office_presentation_"><span style="margin-right:0.127cm;">3.6</span></a><a id="__RefHeading__1415022_253892949"/><a id="element-office_presentation"/>&lt;office:presentation&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:presentation&gt;</span> element represents a presentation document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:presentation&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:presentation&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:presentation&gt;</span> element has the following child elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;presentation:date-time-decl&gt;</span> <a href="#element-presentation_date-time-decl">10.9.3.6</a>, <span class="Element">&lt;presentation:footer-decl&gt;</span> <a href="#element-presentation_footer-decl">10.9.3.4</a>, <span class="Element">&lt;presentation:header-decl&gt;</span> <a href="#element-presentation_header-decl">10.9.3.2</a>, <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>, <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>, <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>, <span class="Element">&lt;table:content-validations&gt;</span> <a href="#element-table_content-validations">9.4.4</a>, <span class="Element">&lt;table:database-ranges&gt;</span> <a href="#element-table_database-ranges">9.4.14</a>, <span class="Element">&lt;table:data-pilot-tables&gt;</span> <a href="#element-table_data-pilot-tables">9.6.2</a>, <span class="Element">&lt;table:dde-links&gt;</span> <a href="#element-table_dde-links">9.8</a>, <span class="Element">&lt;table:label-ranges&gt;</span> <a href="#element-table_label-ranges">9.4.10</a>, <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a3_7_office_spreadsheet_"><span style="margin-right:0.127cm;">3.7</span></a><a id="__RefHeading__1415024_253892949"/><a id="element-office_spreadsheet"/>&lt;office:spreadsheet&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:spreadsheet&gt;</span> element represents a spreadsheet document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:spreadsheet&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:spreadsheet&gt;</span> element has the following attributes: <span class="Attribute">table:protection-key</span> <a href="#attribute-table_protection-key">19.697</a>, <span class="Attribute">table:protection-key-digest-algorithm</span> <a href="#attribute-table_protection-key-digest-algorithm">19.698</a> and <span class="Attribute">table:structure-protected</span> <a href="#attribute-table_structure-protected">19.725</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:spreadsheet&gt;</span> element has the following child elements: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>, <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>, <span class="Element">&lt;table:content-validations&gt;</span> <a href="#element-table_content-validations">9.4.4</a>, <span class="Element">&lt;table:database-ranges&gt;</span> <a href="#element-table_database-ranges">9.4.14</a>, <span class="Element">&lt;table:data-pilot-tables&gt;</span> <a href="#element-table_data-pilot-tables">9.6.2</a>, <span class="Element">&lt;table:dde-links&gt;</span> <a href="#element-table_dde-links">9.8</a>, <span class="Element">&lt;table:label-ranges&gt;</span> <a href="#element-table_label-ranges">9.4.10</a>, <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;table:tracked-changes&gt;</span> <a href="#element-table_tracked-changes">9.9.2</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a3_8_office_chart_"><span style="margin-right:0.127cm;">3.8</span></a><a id="__RefHeading__1415026_253892949"/><a id="element-office_chart"/>&lt;office:chart&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:chart&gt;</span> element represents a chart document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:chart&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:chart&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:chart&gt;</span> element has the following child elements: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>, <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>, <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>, <span class="Element">&lt;table:content-validations&gt;</span> <a href="#element-table_content-validations">9.4.4</a>, <span class="Element">&lt;table:database-ranges&gt;</span> <a href="#element-table_database-ranges">9.4.14</a>, <span class="Element">&lt;table:data-pilot-tables&gt;</span> <a href="#element-table_data-pilot-tables">9.6.2</a>, <span class="Element">&lt;table:dde-links&gt;</span> <a href="#element-table_dde-links">9.8</a>, <span class="Element">&lt;table:label-ranges&gt;</span> <a href="#element-table_label-ranges">9.4.10</a>, <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a3_9_office_image_"><span style="margin-right:0.127cm;">3.9</span></a><a id="__RefHeading__1415028_253892949"/><a id="element-office_image"/>&lt;office:image&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:image&gt;</span> element represents an image document. </p><p class="Text_20_body">The <span class="Element">&lt;office:image&gt;</span> element contains a <span class="Element">&lt;draw:frame&gt;</span> element which shall contain a single <span class="Element">&lt;draw:image&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:image&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:image&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:image&gt;</span> element has the following child element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><h2 class="Heading_20_2"><a id="a3_10_office_settings_"><span style="margin-right:0.127cm;">3.10</span></a><a id="__RefHeading__1415030_253892949"/><a id="element-office_settings"/>&lt;office:settings&gt;</h2><h3 class="Heading_20_3"><a id="a3_10_1General"><span style="margin-right:0.127cm;">3.10.1</span></a><a id="__RefHeading__1415032_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;office:settings&gt;</span> element contains one or more <span class="Element">&lt;config:config-item-set&gt;</span> elements, each of which represents a set of application settings.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:settings&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a> and <span class="Element">&lt;office:document-settings&gt;</span> <a href="#element-office_document-settings">3.1.3.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:settings&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:settings&gt;</span> element has the following child element: <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><h3 class="Heading_20_3"><a id="a3_10_2_config_config-item-set_"><span style="margin-right:0.127cm;">3.10.2</span></a><a id="__RefHeading__1415034_253892949"/><a id="element-config_config-item-set"/>&lt;config:config-item-set&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;config:config-item-set&gt;</span> element is a container element for application setting elements. Setting child elements may occur in any order.</p><p class="Text_20_body">An ODF Consumer shall use application settings to alter application behavior only within the dimensions of variability permitted by this standard.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;config:config-item-set&gt;</span> element is usable within the following elements: <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a>, <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a> and <span class="Element">&lt;office:settings&gt;</span> <a href="#element-office_settings">3.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;config:config-item-set&gt;</span> element has the following attribute: <span class="Attribute">config:name</span> <a href="#attribute-config_name">19.29</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;config:config-item-set&gt;</span> element has the following child elements: <span class="Element">&lt;config:config-item&gt;</span> <a href="#element-config_config-item">3.10.3</a>, <span class="Element">&lt;config:config-item-map-indexed&gt;</span> <a href="#element-config_config-item-map-indexed">3.10.4</a>, <span class="Element">&lt;config:config-item-map-named&gt;</span> <a href="#element-config_config-item-map-named">3.10.6</a> and <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><h3 class="Heading_20_3"><a id="a3_10_3_config_config-item_"><span style="margin-right:0.127cm;">3.10.3</span></a><a id="__RefHeading__1415036_253892949"/><a id="element-config_config-item"/>&lt;config:config-item&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;config:config-item&gt;</span> element contains the value of an application setting whose name is specified by its <span class="Attribute">config:name</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;config:config-item&gt;</span> element is usable within the following elements: <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a> and <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;config:config-item&gt;</span> element has the following attributes: <span class="Attribute">config:name</span> <a href="#attribute-config_name">19.29</a> and <span class="Attribute">config:type</span> <a href="#attribute-config_type">19.30</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;config:config-item&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;config:config-item&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a3_10_4_config_config-item-map-indexed_"><span style="margin-right:0.127cm;">3.10.4</span></a><a id="__RefHeading__1415038_253892949"/><a id="element-config_config-item-map-indexed"/>&lt;config:config-item-map-indexed&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;config:config-item-map-indexed&gt;</span> element is a container element for ordered sequences of application settings. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;config:config-item-map-indexed&gt;</span> element is usable within the following elements: <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a> and <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;config:config-item-map-indexed&gt;</span> element has the following attribute: <span class="Attribute">config:name</span> <a href="#attribute-config_name">19.29</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;config:config-item-map-indexed&gt;</span> element has the following child element: <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a>.</p><h3 class="Heading_20_3"><a id="a3_10_5_config_config-item-map-entry_"><span style="margin-right:0.127cm;">3.10.5</span></a><a id="__RefHeading__1415040_253892949"/><a id="element-config_config-item-map-entry"/>&lt;config:config-item-map-entry&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;config:config-item-map-entry&gt;</span> element represents a single setting in a sequence of settings. The setting itself is defined by the child element of <span class="Element">&lt;config:config-item-map-entry&gt;</span>, and may be a single value, a set of settings, or a sequence of settings. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;config:config-item-map-entry&gt;</span> element is usable within the following elements: <span class="Element">&lt;config:config-item-map-indexed&gt;</span> <a href="#element-config_config-item-map-indexed">3.10.4</a> and <span class="Element">&lt;config:config-item-map-named&gt;</span> <a href="#element-config_config-item-map-named">3.10.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;config:config-item-map-entry&gt;</span> element has the following attribute: <span class="Attribute">config:name</span> <a href="#attribute-config_name">19.29</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;config:config-item-map-entry&gt;</span> element has the following child elements: <span class="Element">&lt;config:config-item&gt;</span> <a href="#element-config_config-item">3.10.3</a>, <span class="Element">&lt;config:config-item-map-indexed&gt;</span> <a href="#element-config_config-item-map-indexed">3.10.4</a>, <span class="Element">&lt;config:config-item-map-named&gt;</span> <a href="#element-config_config-item-map-named">3.10.6</a> and <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><h3 class="Heading_20_3"><a id="a3_10_6_config_config-item-map-named_"><span style="margin-right:0.127cm;">3.10.6</span></a><a id="__RefHeading__1415042_253892949"/><a id="element-config_config-item-map-named"/>&lt;config:config-item-map-named&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;config:config-item-map-named&gt;</span> element contains a sequence of application setting elements. Each sequence is identified by the value of its <span class="Attribute">config:name</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;config:config-item-map-named&gt;</span> element is usable within the following elements: <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a> and <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;config:config-item-map-named&gt;</span> element has the following attribute: <span class="Attribute">config:name</span> <a href="#attribute-config_name">19.29</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;config:config-item-map-named&gt;</span> element has the following child element: <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a>.</p><h2 class="Heading_20_2"><a id="a3_11Cursor_Position_Setting"><span style="margin-right:0.127cm;">3.11</span></a><a id="__RefHeading__1415044_253892949"/>Cursor Position Setting</h2><p class="Text_20_body">To represent a text cursor position within a document, a processing instruction with <span class="Misc_20_Source">PITarget</span> <span class="Misc_20_Source">opendocument</span> (see §2.6 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>) <span class="ISO_20_Keyword">should</span> be used. The name of the cursor position processing instruction, <span class="Misc_20_Source">cursor-position</span>, <span class="ISO_20_Keyword">shall</span> follow the <span class="Misc_20_Source">PITarget</span> <span class="Misc_20_Source">opendocument</span>. The processing instruction may have arbitrary implementation-defined attributes.</p><p class="Note"><span class="Note_20_Label">Note:</span> Where a text cursor position is not sufficient to recreate a document view, producers may use arbitrary document specific settings in addition to a cursor position processing instruction. </p><h2 class="Heading_20_2"><a id="a3_12_office_scripts_"><span style="margin-right:0.127cm;">3.12</span></a><a id="__RefHeading__1415046_253892949"/><a id="element-office_scripts"/>&lt;office:scripts&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:scripts&gt;</span> element contains all the <span class="Element">&lt;office:script&gt;</span> elements for a document. </p><p class="Text_20_body">Each <span class="Element">&lt;office:script&gt;</span> element contains a script. A document may contain scripts in different scripting languages.</p><p class="Note"><span class="Note_20_Label">Note:</span> Scripts need not use XML document models.</p><p class="Text_20_body">The <span class="Element">&lt;office:scripts&gt;</span> element may also contain <span class="Element">&lt;office:event-listeners&gt;</span> elements which contain the events assigned to the document itself. <a href="#element-script_event-listener">14.4.2</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:scripts&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a> and <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:scripts&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:scripts&gt;</span> element has the following child elements: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a> and <span class="Element">&lt;office:script&gt;</span> <a href="#element-office_script">3.13</a>.</p><h2 class="Heading_20_2"><a id="a3_13_office_script_"><span style="margin-right:0.127cm;">3.13</span></a><a id="__RefHeading__1415048_253892949"/><a id="element-office_script"/>&lt;office:script&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:script&gt;</span> element contains a script.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:script&gt;</span> element is usable within the following element: <span class="Element">&lt;office:scripts&gt;</span> <a href="#element-office_scripts">3.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:script&gt;</span> element has the following attribute: <span class="Attribute">script:language</span> <a href="#attribute-script_language">19.430</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:script&gt;</span> element has mixed content where arbitrary child elements are permitted.</p><p class="Note"><span class="Note_20_Label">Note:</span> In most situations, the element contains the source code of the script, but it may also contain a compiled version of the script or a link to external script code.</p><h2 class="Heading_20_2"><a id="a3_14_office_font-face-decls_"><span style="margin-right:0.127cm;">3.14</span></a><a id="__RefHeading__1415050_253892949"/><a id="element-office_font-face-decls"/>&lt;office:font-face-decls&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:font-face-decls&gt;</span> element contains all the font face declarations (<span class="Element">&lt;style:font-face&gt;</span> elements) for a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:font-face-decls&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>, <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:font-face-decls&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:font-face-decls&gt;</span> element has the following child element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><h2 class="Heading_20_2"><a id="a3_15Styles"><span style="margin-right:0.127cm;">3.15</span></a><a id="__RefHeading__1415052_253892949"/>Styles</h2><h3 class="Heading_20_3"><a id="a3_15_1General"><span style="margin-right:0.127cm;">3.15.1</span></a><a id="__RefHeading__1415054_253892949"/>General</h3><p class="Text_20_body">Styles for a document are defined in container elements according to their type: common, automatic and master. </p><p class="Text_20_body">Page layouts and styles are defined by <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout-properties">17.2</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a> elements, respectively. </p><h3 class="Heading_20_3"><a id="a3_15_2_office_styles_"><span style="margin-right:0.127cm;">3.15.2</span></a><a id="__RefHeading__1415056_253892949"/><a id="element-office_styles"/>&lt;office:styles&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:styles&gt;</span> element contains common styles used in a document. A common style is a style chosen by a user for a document or portion thereof.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:styles&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:styles&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:styles&gt;</span> element has the following child elements: <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>, <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>, <span class="Element">&lt;draw:marker&gt;</span> <a href="#element-draw_marker">16.40.8</a>, <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>, <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>, <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>, <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>, <span class="Element">&lt;style:default-page-layout&gt;</span> <a href="#element-style_default-page-layout">16.8</a>, <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a>, <span class="Element">&lt;style:presentation-page-layout&gt;</span> <a href="#element-style_presentation-page-layout">16.41</a>, <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>, <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>, <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>, <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>, <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>, <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>, <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>, <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a> and <span class="Element">&lt;text:outline-style&gt;</span> <a href="#element-text_outline-style">16.34</a>.</p><h3 class="Heading_20_3"><a id="a3_15_3_office_automatic-styles_"><span style="margin-right:0.127cm;">3.15.3</span></a><a id="__RefHeading__1415058_253892949"/><a id="element-office_automatic-styles"/>&lt;office:automatic-styles&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:automatic-styles&gt;</span> element contains automatic styles used in a document. </p><p class="Text_20_body">An automatic style is one contains formatting properties that are considered to be properties of the object to which the style is assigned. </p><p class="Note"><span class="Note_20_Label">Note:</span> Common and automatic styles behave differently in OpenDocument editing consumers. Common styles are presented to the user as a named set of formatting properties. The formatting properties of an automatic style are presented to a user as properties of the object to which the style is applied. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:automatic-styles&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>, <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:automatic-styles&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:automatic-styles&gt;</span> element has the following child elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>, <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>, <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout">16.5</a>, <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a> and <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><h3 class="Heading_20_3"><a id="a3_15_4_office_master-styles_"><span style="margin-right:0.127cm;">3.15.4</span></a><a id="__RefHeading__1415060_253892949"/><a id="element-office_master-styles"/>&lt;office:master-styles&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:master-styles&gt;</span> element contains master styles that are used in a document. A master style contains formatting and other content that is displayed with document content when the style is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:master-styles&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:master-styles&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:master-styles&gt;</span> element has the following child elements: <span class="Element">&lt;draw:layer-set&gt;</span> <a href="#element-draw_layer-set">10.2.2</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><h2 class="Heading_20_2"><a id="a3_16Document_Signatures"><span style="margin-right:0.127cm;">3.16</span></a><a id="__RefHeading__1415062_253892949"/>Document Signatures</h2><p class="Text_20_body">An OpenDocument document that is stored in a package may have one or more digital signatures applied to the package.</p><p class="Text_20_body">Document signatures shall be stored in a file called META-INF/documentsignatures.xml in the package as described in section 3.5 of the OpenDocument specification part 3. Document signatures shall contain a <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element for each file within the package, with the exception that <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> elements for the META-INF/documentsignatures.xml file containing the signature, and any files contained in the package whose relative path starts with "external-data/" should be omitted.</p><p class="Text_20_body">Signatures other than document signatures are implementation-defined.</p><p class="Text_20_body"> </p><h2 class="Heading_20_2"><a id="a3_17Foreign_Elements_and_Attributes"><span style="margin-right:0.127cm;">3.17</span></a><a id="__RefNumPara__623372_981565270"/><a id="__RefHeading__440372_826425813"/><a id="ForeignElementsAndAttributes"/>Foreign Elements and Attributes</h2><p class="Text_20_body">OpenDocument extended documents <span class="ISO_20_Keyword">may</span> contain elements and attributes not defined by the OpenDocument schema. Elements and attributes not defined by the OpenDocument schema are called <span class="Def">foreign elements</span> and <span class="Def">attributes</span>. Foreign elements and attributes <span class="ISO_20_Keyword">shall</span> not be associated with a namespace that is listed in tables 1, 2 or 3 of section <a href="#Namespaces">1.5</a>.</p><p class="Text_20_body">If a foreign element has a <span class="Element">&lt;text:h&gt;</span> or <span class="Element">&lt;text:p&gt;</span> ancestor element, and is a child element of an element for which the OpenDocument schema permits the inclusion of character data, and if the OpenDocument schema permits the inclusion of character data for all its ancestors up to the <span class="Element">&lt;text:p&gt;</span> or <span class="Element">&lt;text:h&gt;</span> element ancestor element, then the element's content <span class="ISO_20_Keyword">may</span> be interpreted by conforming OpenDocument consumers, and the document itself <span class="ISO_20_Keyword">shall</span> be valid against the OpenDocument schema as if the foreign element's start- and end-tags or its empty-element-tag are removed.</p><p class="Text_20_body">For a foreign element that occurs at another location, conforming consumers <span class="ISO_20_Keyword">should not</span> interpret the element's content, but <span class="ISO_20_Keyword">may</span> preserve its content.</p><p class="Text_20_body">Foreign elements may have an <span class="Attribute">office:process-content</span> attribute <a href="#attribute-office_process-content">19.377</a> attached which controls the processing of the element content. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> In OpenDocument 1.0 and 1.1, the content of foreign elements should be processed unless there was an <span class="Attribute">office:process-content</span> attribute with value <span class="Attribute_20_Value">false</span>.</p><p class="Text_20_body">Conforming extended producers <span class="ISO_20_Keyword">should</span> <span class="ISO_20_Keyword">not</span> use foreign elements and attributes for features defined in the OpenDocument specification.</p><p class="Text_20_body">A conforming consumer that encounters an OpenDocument defined attribute that has a value that is not defined by OpenDocument, then it should: </p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>If the attribute has a specified default value, use its default value, or <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>If the attribute does not have a specified default value, ignore the attribute. <span class="odfLiEnd"/> </p></li></ol><h2 class="Heading_20_2"><a id="a3_18White_Space_Processing_and_EOL_Handling"><span style="margin-right:0.127cm;">3.18</span></a><a id="__RefHeading__1420346_2538929491"/>White Space Processing and EOL Handling</h2><p class="Text_20_body">ODF processing of whitespace characters is in conformance with the provisions of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>.</p><p class="Text_20_body">In addition, OpenDocument Consumers shall ignore all element children (<a title="Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG" href="http://oasis-open.org/committees/relax-ng/spec-20011203.html">[RNG]</a> section 5, Data Model) of elements defined in this specification that are strings consisting entirely of whitespace characters and which do not satisfy a pattern of the OpenDocument schema definition for the element.</p><p class="Text_20_body">Additional treatment of occurrences of whitespace characters depends on the provisions for specific elements, attributes, and their datatypes in this specification. </p><p class="Note"><span class="Note_20_Label">Note</span>: There are special OpenDocument rules for the reduction of whitespace sequences to single space characters in the text obtained from <span class="Element">&lt;text:p&gt;</span>, <span class="Element">&lt;text:h&gt;</span> and their element children. <a href="#White-space_Characters">6.1.2</a></p><h2 class="Heading_20_2"><a id="a3_19MIME_Types_and_File_Name_Extensions"><span style="margin-right:0.127cm;">3.19</span></a><a id="__RefHeading__1420348_2538929491"/>MIME Types and File Name Extensions</h2><p class="Text_20_body">Appendix C contains a list of MIME types and file name extensions to be used for office documents that conform to this specification and that are contained in a package. See <a href="#Package_OpenDocument_Files">3.1.3</a>.</p><p class="Text_20_body">Office documents that conform to this specification but are not contained in a package <span class="ISO_20_Keyword">should</span> use the MIME type <span class="Source_20_Text">text/xml</span>.</p><p class="Text_20_body">Only MIME types and extensions that have been registered according to <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a> <span class="ISO_20_Keyword">should</span> used for office documents that conform to this specification. The MIME types and extensions listed in appendix C <span class="ISO_20_Keyword">should</span> be used where appropriate.</p><h1 class="Heading_20_1"><a id="a4Metadata"><span style="margin-right:0.127cm;">4</span></a><a id="__RefHeading__1415064_253892949"/>Metadata</h1><h2 class="Heading_20_2"><a id="a4_1General"><span style="margin-right:0.127cm;">4.1</span></a><a id="__RefHeading__1415066_253892949"/>General</h2><p class="Text_20_body">Metadata is general information about a document or its content.</p><p class="Text_20_body">OpenDocument supports five types of metadata:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>RDF metadata describing documents or the content of identifiable OpenDocument elements. <a href="#manifest_rdf">4.2.2</a><span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>Text content being used as RDF metadata. <a href="#InContentMetadata">4.2.1</a> <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">3)</span>Pre-defined metadata (meta.xml). <a href="#Pre-DefinedMetadata">4.3.2</a><span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">4)</span>User-defined metadata (using the <span class="Element">&lt;meta:user-defined&gt;</span> element). <a href="#UserDefinedMetadata">4.3.3</a><span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">5)</span>Custom metadata (custom XML elements within meta.xml). <a href="#CustomMetadataElements">4.3.1</a><span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">Pre-defined and user-defined metadata are both stored in the metadata <span class="Element">&lt;office:meta&gt;</span> element. The elements representing this metadata may be omitted or occur multiple times. The updating of multiple instances of the same metadata elements is implementation-dependent.</p><h2 class="Heading_20_2"><a id="a4_2RDF_Metadata"><span style="margin-right:0.127cm;">4.2</span></a><a id="__RefHeading__1415068_253892949"/><a id="RDFMetadata"/>RDF Metadata</h2><h3 class="Heading_20_3"><a id="a4_2_1In_Content_Metadata__RDFa_"><span style="margin-right:0.127cm;">4.2.1</span></a><a id="__RefHeading__1415070_253892949"/><a id="InContentMetadata"/>In Content Metadata (RDFa)</h3><p class="Text_20_body">Metadata in OpenDocument documents may be expressed using the model of the W3C Resource Description Framework <a title="Resource Description Framework (RDF): Concepts and Abstract Syntax" href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">[RDF-CONCEPTS]</a>.</p><p class="Text_20_body">In addition to the mechanism defined in Part 3 of this specification RDF metadata can be attached to elements in the "content.xml" and "styles.xml" file. Elements supporting this type of metadata have the following attributes: <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, and <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>. When metadata is added using these attributes, it is referred to as in content metadata. If "content.xml" and "styles.xml" files contain in content metadata they shall be listed in the package's "manifest.rdf" file. </p><h3 class="Heading_20_3"><a id="a4_2_2manifest_rdf"><span style="margin-right:0.127cm;">4.2.2</span></a><a id="__RefHeading__1415072_253892949"/><a id="manifest_rdf"/>manifest.rdf</h3><h4 class="Heading_20_4"><a id="a4_2_2_1General"><span style="margin-right:0.127cm;">4.2.2.1</span></a><a id="__RefHeading__1415074_253892949"/>General</h4><p class="Text_20_body">The OpenDocument document contains a metadata manifest, as defined in Part 3 of this specification. The <a title="OWL Web Ontology Language Overview" href="http://www.w3.org/TR/2004/REC-owl-features-20040210/">[OWL]</a> Metadata Manifest Description ontology defined in Part <a id="DDE_LINK110"/>3 is extended with additional properties and classes in appendix B. The following OWL classes and properties are defined.</p><h4 class="Heading_20_4"><a id="a4_2_2_2odf_ContentFile"><span style="margin-right:0.127cm;">4.2.2.2</span></a><a id="__RefHeading__1415076_253892949"/>odf:ContentFile</h4><p class="Text_20_body">An instance of the <span class="OWL_20_Class">odf:ContentFile</span> class represents a content.xml file.</p><p class="Text_20_body">The <span class="OWL_20_Class">odf:ContentFile</span> class is a subclass of <span class="OWL_20_Class">pkg:File</span>.</p><h4 class="Heading_20_4"><a id="a4_2_2_3odf_StylesFile"><span style="margin-right:0.127cm;">4.2.2.3</span></a><a id="__RefHeading__1415078_253892949"/>odf:StylesFile</h4><p class="Text_20_body">An instance of the <span class="OWL_20_Class">odf:StylesFile</span> class represents a styles.xml file.</p><p class="Text_20_body">The <span class="OWL_20_Class">odf:StylesFile</span> class is a subclass of <span class="OWL_20_Class">pkg:File</span></p><h4 class="Heading_20_4"><a id="a4_2_2_4odf_Element"><span style="margin-right:0.127cm;">4.2.2.4</span></a><a id="__RefHeading__1415080_253892949"/><a id="owlclass-odf_Element"/>odf:Element</h4><p class="Text_20_body">An instance of the <span class="OWL_20_Class">odf:Element</span> class represents an OpenDocument XML element in a content.xml or styles.xml file. It is a subclass of the <span class="OWL_20_Class">pkg:Element</span> class, which represents any XML element in the OpenDocument package.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> One or more <span class="OWL_20_Property">rdf:type</span> properties specify the metadata type of an <span class="OWL_20_Class">odf:Element</span>.</p><p class="Text_20_body">Every XML element that is defined by this specification and has an attribute of type ID may be described using an OWL class. The IRI of an OWL class for an element is the concatenation of the element's QName namespace IRI and its local name part. These classes are subclasses of <span class="OWL_20_Class">odf:Element</span>. </p><p class="Text_20_body">The following properties are defined for the subclass describing a <span class="Element">&lt;text:meta-field&gt;</span> element (<span class="OWL_20_Class">urn:oasis:names:tc:opendocument:xmlns:text:1.0meta-field</span>) : <span class="OWL_20_Property">odf:prefix</span> <a href="#owlproperty-odf_prefix">4.2.2.5</a> and <span class="OWL_20_Property">odf:suffix</span> <a href="#owlproperty-odf_suffix">4.2.2.6</a>.</p><h4 class="Heading_20_4"><a id="a4_2_2_5odf_prefix"><span style="margin-right:0.127cm;">4.2.2.5</span></a><a id="__RefHeading__1415082_253892949"/><a id="owlproperty-odf_prefix"/>odf:prefix</h4><p class="Text_20_body">The <span class="OWL_20_Property">odf:prefix</span> property defines the prefix content of a <span class="Element">&lt;text:meta-field&gt;</span> field<a id="DDE_LINK16"/> <a href="#element-text_meta-field">7.5.19</a>.</p><p class="Text_20_body">This property can be used with the following class: <span class="OWL_20_Class">urn:oasis:names:tc:opendocument:xmlns:text:1.0meta-field</span> <a href="#owlclass-odf_Element">4.2.2.4</a>.</p><h4 class="Heading_20_4"><a id="a4_2_2_6odf_suffix"><span style="margin-right:0.127cm;">4.2.2.6</span></a><a id="__RefHeading__1415084_253892949"/><a id="owlproperty-odf_suffix"/>odf:suffix</h4><p class="Text_20_body">The <span class="OWL_20_Property">odf:suffix</span> property defines the suffix content of a <span class="Element">&lt;text:meta-field&gt;</span> field <a href="#element-text_meta-field">7.5.19</a>.</p><p class="Text_20_body">This property can be used with the following class: <span class="OWL_20_Class">urn:oasis:names:tc:opendocument:xmlns:text:1.0meta-field</span> <a href="#owlclass-odf_Element">4.2.2.4</a>.</p><h2 class="Heading_20_2"><a id="a4_3Non-RDF_Metadata"><span style="margin-right:0.127cm;">4.3</span></a><a id="__RefHeading__1415086_253892949"/>Non-RDF Metadata</h2><h3 class="Heading_20_3"><a id="a4_3_1General"><span style="margin-right:0.127cm;">4.3.1</span></a><a id="__RefHeading__1415088_253892949"/><a id="CustomMetadataElements"/>General</h3><p class="Text_20_body">Non-RDF metadata in OpenDocument is composed of pre-defined metadata elements, user defined metadata elements, and custom metadata elements.</p><p class="Text_20_body">The pre-defined metadata elements have defined semantics. They <span class="ISO_20_Keyword">should</span> be processed by consumers and updated by producers. They can be referenced from within the document using text fields.</p><p class="Text_20_body">The pre-defined metadata elements borrow heavily upon the metadata standards developed by the Dublin Core Metadata Initiative (http://www.dublincore.org). Metadata elements drawn directly from the Dublin Core work are in the http://purl.org/dc/elements/1.1 namespace.   “</p><p class="Text_20_body">User-defined metadata specifies a triplet of name, type, and value. Consumers can present these values to the user. </p><p class="Text_20_body">Custom metadata elements are arbitrary elements inside an <span class="Element">&lt;office:meta&gt;</span> element. The semantics of custom metadata elements is implementation-defined.</p><p class="Text_20_body">Custom metadata elements shall only occur in OpenDocument extended documents. The use of custom metadata is deprecated in favor of RDF/XML based metadata.</p><p class="Note"><span class="Note_20_Label">Note:</span> Consumers need not process custom metadata other than to preserve it when editing a document. </p><h3 class="Heading_20_3"><a id="a4_3_2Pre-Defined_Metadata_Elements"><span style="margin-right:0.127cm;">4.3.2</span></a><a id="__RefHeading__1415090_253892949"/><a id="Pre-DefinedMetadata"/>Pre-Defined Metadata Elements</h3><h4 class="Heading_20_4"><a id="a4_3_2_1_meta_generator_"><span style="margin-right:0.127cm;">4.3.2.1</span></a><a id="__RefHeading__1415092_253892949"/><a id="element-meta_generator"/>&lt;meta:generator&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:generator&gt;</span> element contains a string that identifies the OpenDocument producer that was used to create or last modify the document. This string <span class="ISO_20_Keyword">should</span> match the definition for user-agents in the HTTP protocol as specified in section 14.43 of <a title=" Hypertext Transfer Protocol -- HTTP/1.1" href="http://www.ietf.org/rfc/rfc2616.txt">[RFC2616]</a>. The generator string <span class="ISO_20_Keyword">should</span> allow OpenDocument consumers to distinguish between all released versions of a producer.</p><p class="Note"><span class="Note_20_Label">Note:</span> Release versions of a producer could be distinguished based on build ids or patch level information.</p><p class="Text_20_body">If an OpenDocument producer that creates a document cannot provide an identifier string, the producer <span class="ISO_20_Keyword">shall not </span>export this element. If a producer stores a modified document created by another producer cannot provide a unique identifier, it <span class="ISO_20_Keyword">shall not</span> export the original identifier belonging to the producer that created the document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:generator&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:generator&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:generator&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:generator&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_2_dc_title_"><span style="margin-right:0.127cm;">4.3.2.2</span></a><a id="__RefHeading__1415094_253892949"/><a id="element-dc_title"/>&lt;dc:title&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;dc:title&gt;</span> element specifies the title of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dc:title&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dc:title&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;dc:title&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dc:title&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_3_dc_description_"><span style="margin-right:0.127cm;">4.3.2.3</span></a><a id="__RefHeading__1415096_253892949"/><a id="element-dc_description"/>&lt;dc:description&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;dc:description&gt;</span> element contains a description of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dc:description&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dc:description&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;dc:description&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dc:description&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_4_dc_subject_"><span style="margin-right:0.127cm;">4.3.2.4</span></a><a id="__RefHeading__1415098_253892949"/><a id="element-dc_subject"/>&lt;dc:subject&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;dc:subject&gt;</span> element specifies the subject of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dc:subject&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dc:subject&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;dc:subject&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dc:subject&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_5_meta_keyword_"><span style="margin-right:0.127cm;">4.3.2.5</span></a><a id="__RefHeading__1415100_253892949"/><a id="element-meta_keyword"/>&lt;meta:keyword&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:keyword&gt;</span> element contains a keyword pertaining to a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:keyword&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:keyword&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:keyword&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:keyword&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_6_meta_initial-creator_"><span style="margin-right:0.127cm;">4.3.2.6</span></a><a id="__RefHeading__1415102_253892949"/><a id="element-meta_initial-creator"/>&lt;meta:initial-creator&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:initial-creator&gt;</span> element specifies the name of the initial creator of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:initial-creator&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:initial-creator&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:initial-creator&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:initial-creator&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_7_dc_creator_"><span style="margin-right:0.127cm;">4.3.2.7</span></a><a id="__RefHeading__1415104_253892949"/><a id="element-dc_creator"/>&lt;dc:creator&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;dc:creator&gt;</span> element specifies the name of the person who last modified a document (<span class="Element">&lt;office:meta&gt;</span>), who created an annotation (<span class="Element">&lt;office:annotation&gt;</span>), who authored a change (<span class="Element">&lt;office:change-info&gt;</span>). </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dc:creator&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a> and <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dc:creator&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;dc:creator&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dc:creator&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_8_meta_printed-by_"><span style="margin-right:0.127cm;">4.3.2.8</span></a><a id="__RefHeading__1415106_253892949"/><a id="element-meta_printed-by"/>&lt;meta:printed-by&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:printed-by&gt;</span> element specifies the name of the last person who printed a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:printed-by&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:printed-by&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:printed-by&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:printed-by&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_9_meta_creation-date_"><span style="margin-right:0.127cm;">4.3.2.9</span></a><a id="__RefHeading__1415108_253892949"/><a id="element-meta_creation-date"/>&lt;meta:creation-date&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:creation-date&gt;</span> element specifies the date and time when a document was created.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:creation-date&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:creation-date&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:creation-date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:creation-date&gt;</span> element has content of data type <span class="Datatype">dateTime</span> <a href="#datatype-dateTime">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_10_dc_date_"><span style="margin-right:0.127cm;">4.3.2.10</span></a><a id="__RefHeading__1415110_253892949"/><a id="element-dc_date"/>&lt;dc:date&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;dc:date&gt;</span> element specifies the date and time when the document was last modified (<span class="Element">&lt;office:meta&gt;</span>), when an annotation was created (<span class="Element">&lt;office:annotation&gt;</span>), when a change was made (<span class="Element">&lt;office:change-info&gt;</span>).</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dc:date&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a> and <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dc:date&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;dc:date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dc:date&gt;</span> element has content of data type <span class="Datatype">dateTime</span> <a href="#datatype-dateTime">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_11_meta_print-date_"><span style="margin-right:0.127cm;">4.3.2.11</span></a><a id="__RefHeading__1415112_253892949"/><a id="element-meta_print-date"/>&lt;meta:print-date&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:print-date&gt;</span> element specifies the date and time when a document was last printed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:print-date&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:print-date&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:print-date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:print-date&gt;</span> element has content of data type <span class="Datatype">dateTime</span> <a href="#datatype-dateTime">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_12_meta_template_"><span style="margin-right:0.127cm;">4.3.2.12</span></a><a id="__RefHeading__1415114_253892949"/><a id="element-meta_template"/>&lt;meta:template&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:template&gt;</span> element specifies a IRI for the document template that was used to create a document. The IRI is specified as an Xlink. See <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:template&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:template&gt;</span> element has the following attributes: <span class="Attribute">meta:date</span> <a href="#attribute-meta_date">19.323</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-meta_template">19.910.24</a>, <span class="Attribute">xlink:title</span> <a href="#attribute-xlink_title">19.912</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:template&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a4_3_2_13_meta_auto-reload_"><span style="margin-right:0.127cm;">4.3.2.13</span></a><a id="__RefHeading__1415116_253892949"/><a id="element-meta_auto-reload"/>&lt;meta:auto-reload&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:auto-reload&gt;</span> element specifies whether a document is reloaded or replaced by another document after a specified period of time has elapsed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:auto-reload&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:auto-reload&gt;</span> element has the following attributes: <span class="Attribute">meta:delay</span> <a href="#attribute-meta_delay">19.324</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-meta_auto-reload">19.910.23</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:auto-reload&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a4_3_2_14_meta_hyperlink-behaviour_"><span style="margin-right:0.127cm;">4.3.2.14</span></a><a id="__RefHeading__1415118_253892949"/><a id="element-meta_hyperlink-behaviour"/>&lt;meta:hyperlink-behaviour&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> element specifies the default behavior for hyperlinks in a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> element has the following attributes: <span class="Attribute">office:target-frame-name</span> <a href="#attribute-office_target-frame-name">19.381</a> and <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a4_3_2_15_dc_language_"><span style="margin-right:0.127cm;">4.3.2.15</span></a><a id="__RefHeading__1415120_253892949"/><a id="element-dc_language"/>&lt;dc:language&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;dc:language&gt;</span> element specifies the default language of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dc:language&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dc:language&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;dc:language&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dc:language&gt;</span> element has content of data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_16_meta_editing-cycles_"><span style="margin-right:0.127cm;">4.3.2.16</span></a><a id="__RefHeading__1415122_253892949"/><a id="element-meta_editing-cycles"/>&lt;meta:editing-cycles&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:editing-cycles&gt;</span> element specifies the number of times a document has been edited. When a document is created, this value is set to 1. Each time a document is saved, the editing-cycles number is incremented by 1.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:editing-cycles&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:editing-cycles&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:editing-cycles&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:editing-cycles&gt;</span> element has content of data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_17_meta_editing-duration_"><span style="margin-right:0.127cm;">4.3.2.17</span></a><a id="__RefHeading__1415124_253892949"/><a id="element-meta_editing-duration"/>&lt;meta:editing-duration&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:editing-duration&gt;</span> element specifies the total time spent editing a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:editing-duration&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:editing-duration&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:editing-duration&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:editing-duration&gt;</span> element has content of data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h4 class="Heading_20_4"><a id="a4_3_2_18_meta_document-statistic_"><span style="margin-right:0.127cm;">4.3.2.18</span></a><a id="__RefHeading__1415126_253892949"/><a id="element-meta_document-statistic"/>&lt;meta:document-statistic&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;meta:document-statistic&gt;</span> element represents statistics about a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:document-statistic&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:document-statistic&gt;</span> element has the following attributes: <span class="Attribute">meta:cell-count</span> <a href="#attribute-meta_cell-count">19.321</a>, <span class="Attribute">meta:character-count</span> <a href="#attribute-meta_character-count">19.322</a>, <span class="Attribute">meta:draw-count</span> <a href="#attribute-meta_draw-count">19.325</a>, <span class="Attribute">meta:frame-count</span> <a href="#attribute-meta_frame-count">19.326</a>, <span class="Attribute">meta:image-count</span> <a href="#attribute-meta_image-count">19.327</a>, <span class="Attribute">meta:non-whitespace-character-count</span> <a href="#attribute-meta_non-whitespace-character-count">19.329</a>, <span class="Attribute">meta:object-count</span> <a href="#attribute-meta_object-count">19.330</a>, <span class="Attribute">meta:ole-object-count</span> <a href="#attribute-meta_ole-object-count">19.331</a>, <span class="Attribute">meta:page-count</span> <a href="#attribute-meta_page-count">19.332</a>, <span class="Attribute">meta:paragraph-count</span> <a href="#attribute-meta_paragraph-count">19.333</a>, <span class="Attribute">meta:row-count</span> <a href="#attribute-meta_row-count">19.334</a>, <span class="Attribute">meta:sentence-count</span> <a href="#attribute-meta_sentence-count">19.335</a>, <span class="Attribute">meta:syllable-count</span> <a href="#attribute-meta_syllable-count">19.336</a>, <span class="Attribute">meta:table-count</span> <a href="#attribute-meta_table-count">19.337</a> and <span class="Attribute">meta:word-count</span> <a href="#attribute-meta_word-count">19.339</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:document-statistic&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a4_3_3_meta_user-defined_"><span style="margin-right:0.127cm;">4.3.3</span></a><a id="__RefHeading__1415128_253892949"/><a id="element-meta_user-defined"/><a id="UserDefinedMetadata"/>&lt;meta:user-defined&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;meta:user-defined&gt;</span> element specifies any additional user-defined metadata for a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:user-defined&gt;</span> element is usable within the following element: <span class="Element">&lt;office:meta&gt;</span> <a href="#element-office_meta">3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:user-defined&gt;</span> element has the following attributes: <span class="Attribute">meta:name</span> <a href="#attribute-meta_name">19.328</a>, <span class="Attribute">meta:value-type</span> <a href="#attribute-meta_value-type">19.338</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:user-defined&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:user-defined&gt;</span> element has character data content, or depending on the value of the <span class="Attribute">meta:value-type</span> attribute content of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>, <span class="Datatype">date</span> <a href="#datatype-date">18.2</a>, <span class="Datatype">dateTime</span> <a href="#datatype-dateTime">18.2</a>, <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>, <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a> or <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h1 class="Heading_20_1"><a id="a5Text_Content"><span style="margin-right:0.127cm;">5</span></a><a id="__RefHeading__1415130_253892949"/><a id="Text_Content"/>Text Content</h1><h2 class="Heading_20_2"><a id="a5_1Headings__Paragraphs_and_Basic_Text_Structure"><span style="margin-right:0.127cm;">5.1</span></a><a id="__RefHeading__1415132_253892949"/>Headings, Paragraphs and Basic Text Structure</h2><h3 class="Heading_20_3"><a id="a5_1_1General"><span style="margin-right:0.127cm;">5.1.1</span></a><a id="__RefHeading__1415134_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:h&gt;</span> and <span class="Element">&lt;text:p&gt;</span> elements represent headings and paragraphs, respectively. </p><p class="Text_20_body">Headings and paragraphs are collectively referred to as <span class="Def">paragraph elements</span>.</p><h3 class="Heading_20_3"><a id="a5_1_2_text_h_"><span style="margin-right:0.127cm;">5.1.2</span></a><a id="__RefHeading__1415136_253892949"/><a id="element-text_h"/>&lt;text:h&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:h&gt;</span> element represents a heading in a document. Headings define the division structure for a document. A chapter or section begins with a heading and extends to the next heading at the same or higher level.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:h&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a>, <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:h&gt;</span> element has the following attributes: <span class="Attribute">text:class-names</span> <a href="#attribute-text_class-names_element-text_h">19.770.2</a>, <span class="Attribute">text:cond-style-name</span> <a href="#attribute-text_cond-style-name">19.776</a>, <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_h">19.809.6</a>, <span class="Attribute">text:is-list-header</span> <a href="#attribute-text_is-list-header">19.816</a>, <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_h">19.844.4</a>, <span class="Attribute">text:restart-numbering</span> <a href="#attribute-text_restart-numbering">19.857</a>, <span class="Attribute">text:start-value</span> <a href="#attribute-text_start-value_element-text_h">19.868.2</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_h">19.874.7</a>, <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:h&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;presentation:date-time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-</span><span class="Element">macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-</span><span class="Element">paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:number&gt;</span> <a href="#element-text_number">6.1.10</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:h&gt;</span> element has mixed content.</p><h3 class="Heading_20_3"><a id="a5_1_3_text_p_"><span style="margin-right:0.127cm;">5.1.3</span></a><a id="__RefHeading__1415138_253892949"/><a id="element-text_p"/>&lt;text:p&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:p&gt;</span> element represents a paragraph, which is the basic unit of text in an OpenDocument file.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:p&gt;</span> element is usable within the following elements: <span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a>, <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>, <span class="Element">&lt;chart:footer&gt;</span> <a href="#element-chart_footer">11.2.3</a>, <span class="Element">&lt;chart:label-separator&gt;</span> <a href="#element-chart_label-separator">17.24</a>, <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>, <span class="Element">&lt;chart:subtitle&gt;</span> <a href="#element-chart_subtitle">11.2.2</a>, <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;style:region-center&gt;</span> <a href="#element-style_region-center">16.15</a>, <span class="Element">&lt;style:region-left&gt;</span> <a href="#element-style_region-left">16.14</a>, <span class="Element">&lt;style:region-right&gt;</span> <a href="#element-style_region-right">16.16</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:error-message&gt;</span> <a href="#element-table_error-message">9.4.7</a>, <span class="Element">&lt;table:help-message&gt;</span> <a href="#element-table_help-message">9.4.6</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a>, <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:p&gt;</span> element has the following attributes: <span class="Attribute">text:class-names</span> <a href="#attribute-text_class-names_element-text_p">19.770.3</a>, <span class="Attribute">text:cond-style-name</span> <a href="#attribute-text_cond-style-name">19.776</a>, <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_p">19.809.8</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_p">19.874.29</a>, <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:p&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;presentation:date-time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:p&gt;</span> element has mixed content.</p><h2 class="Heading_20_2"><a id="a5_2_text_page-sequence_"><span style="margin-right:0.127cm;">5.2</span></a><a id="__RefHeading__1415140_253892949"/><a id="element-text_page-sequence"/>&lt;text:page-sequence&gt;</h2><h3 class="Heading_20_3"><a id="a5_2_1General"><span style="margin-right:0.127cm;">5.2.1</span></a><a id="__RefHeading__1415142_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:page-sequence&gt;</span> element contains at least one <span class="Element">&lt;text:page&gt;</span> element. If there is more than one <span class="Element">&lt;text:page&gt;</span> element, the <span class="Attribute">text:master-page-name</span> attribute of the first <span class="Element">&lt;text:page&gt;</span> element specifies the default master style for a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page-sequence&gt;</span> element is usable within the following element: <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page-sequence&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page-sequence&gt;</span> element has the following child element: <span class="Element">&lt;text:page&gt;</span> <a href="#element-text_page">5.2.2</a>.</p><h3 class="Heading_20_3"><a id="a5_2_2_text_page_"><span style="margin-right:0.127cm;">5.2.2</span></a><a id="__RefHeading__1415144_253892949"/><a id="element-text_page"/>&lt;text:page&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:page&gt;</span> element represents a page in a <span class="Element">&lt;text:page-sequence&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page&gt;</span> element is usable within the following element: <span class="Element">&lt;text:page-sequence&gt;</span> <a href="#element-text_page-sequence">5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page&gt;</span> element has the following attribute: <span class="Attribute">text:master-page-name</span> <a href="#attribute-text_master-page-name">19.833</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a5_3Lists"><span style="margin-right:0.127cm;">5.3</span></a><a id="__RefHeading__1415146_253892949"/><a id="List"/>Lists</h2><h3 class="Heading_20_3"><a id="a5_3_1_text_list_"><span style="margin-right:0.127cm;">5.3.1</span></a><a id="__RefHeading__1415148_253892949"/><a id="element-text_list"/>&lt;text:list&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:list&gt;</span> element represents a list. It may contain a <span class="Element">&lt;text:list-header&gt;</span> element, followed by any number of <span class="Element">&lt;text:list-item&gt;</span> elements. </p><p class="Text_20_body">Lists may be numbered. The numbering may be restarted with a specific numbering at each list item. Lists may also continue numbering from other lists in order to merge lists into a single, discontinuous list. Whether list numbering is displayed or not depends on the list style being used.</p><p class="Text_20_body">Every list has a list level, which is determined by the nesting of the <span class="Element">&lt;text:list&gt;</span> element that represents that list. If a list is not contained in another list, its list level is 1. If a list is contained within another list, the list level of the contained list is the list level of the list in which it is contained incremented by one. If a list is contained in a table cell or text box, its list level returns to 1, even if the table or text box is nested in another list. </p><p class="Text_20_body">Every list with a list level of 1 defines a list and the counter domain for its list items and any sub list of that list. Each sub list starts a counter for its list items and any sub list it may contain. </p><p class="Text_20_body">Every list, including sub lists, may have a list style which is applied to its list items and sub lists. A list style specified for a sub list overrides the list style specified for the list in which the sub list is contained.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a>, <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list&gt;</span> element has the following attributes: <span class="Attribute">text:continue-list</span> <a href="#attribute-text_continue-list">19.780</a>, <span class="Attribute">text:continue-numbering</span> <a href="#attribute-text_continue-numbering">19.781</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_list">19.874.22</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list&gt;</span> element has the following child elements: <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a> and <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>.</p><h3 class="Heading_20_3"><a id="a5_3_2Default_List_Style"><span style="margin-right:0.127cm;">5.3.2</span></a><a id="__RefHeading__1415150_253892949"/><a id="ListDefaultStyle"/>Default List Style </h3><p class="Text_20_body">If a list does not have a <span class="Attribute">style:name</span> attribute and therefore no list style is specified, one of the following actions is taken:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the list is contained in another list, the list style defaults to the style of the surrounding list.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If there is no list style specified for the surrounding list, but the list contains paragraphs that have paragraph styles attached that specify a list style, that list style is used. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>An implementation-dependent default is applied to the list. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">To determine which formatting properties are applied to a list, the list level and its style name are taken into account. <a href="#element-text_list-style">16.30</a>.</p><h3 class="Heading_20_3"><a id="a5_3_3_text_list-header_"><span style="margin-right:0.127cm;">5.3.3</span></a><a id="__RefHeading__1415152_253892949"/><a id="element-text_list-header"/>&lt;text:list-header&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:list-header&gt;</span> element represents a list header and is a type of list item. It contains one or more paragraphs that are displayed before a list. The paragraphs are formatted as list items but they do not have a preceding number or bullet.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list-header&gt;</span> element is usable within the following element: <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list-header&gt;</span> element has the following attribute: <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list-header&gt;</span> element has the following child elements: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:number&gt;</span> <a href="#element-text_number">6.1.10</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a> and <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>.</p><h3 class="Heading_20_3"><a id="a5_3_4_text_list-item_"><span style="margin-right:0.127cm;">5.3.4</span></a><a id="__RefHeading__1415154_253892949"/><a id="element-text_list-item"/>&lt;text:list-item&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:list-item&gt;</span> element represents an item in a list.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list-item&gt;</span> element is usable within the following element: <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list-item&gt;</span> element has the following attributes: <span class="Attribute">text:start-value</span> <a href="#attribute-text_start-value_element-text_list-item">19.868.3</a>, <span class="Attribute">text:style-override</span> <a href="#attribute-text_style-override">19.875</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list-item&gt;</span> element has the following child elements: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:number&gt;</span> <a href="#element-text_number">6.1.10</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a> and <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>.</p><h3 class="Heading_20_3"><a id="a5_3_5List_Item_Style_Rules"><span style="margin-right:0.127cm;">5.3.5</span></a><a id="__RefHeading__1415156_253892949"/><a id="ListItemStyleRules"/>List Item Style Rules</h3><p class="Text_20_body">The first line in a list item is preceded by a bullet or number, depending on the list style assigned to the list. If a list item starts another list and does not contain any text, no bullet or number is displayed.</p><p class="Text_20_body">The list style which is applied to a list need not contain a list level style for the list level the list item specifies. The following rules are applied to determine the list level style in this case</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the list is contained in another list, the list level style defined in the list style which is applied to the surrounding list for the level of the item is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the list is not contained in another list or if no list level style is not defined by any of the list styles assigned to surrounding lists, the list level style defined by the default list style is used See <a href="#ListDefaultStyle">5.3.2</a>.<span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a5_3_6_text_numbered-paragraph_"><span style="margin-right:0.127cm;">5.3.6</span></a><a id="__RefHeading__1415158_253892949"/><a id="element-text_numbered-paragraph"/>&lt;text:numbered-paragraph&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:numbered-paragraph&gt;</span> element numbers an individual paragraph, as if it was part of a list at a specified level.</p><p class="Note"><span class="Note_20_Label">Note: </span>Numbered paragraphs form an equivalent, alternative way of specifying lists. A list in <span class="Element">&lt;text:list&gt;</span> representation can be converted into a list in <span class="Element">&lt;text:numbered-paragraph&gt;</span> representation and vice versa.</p><p class="Text_20_body">A numbered paragraph can be assigned a list level. A numbered paragraph is equivalent to a list nested to the given level, containing one list item with one paragraph. If no level is given, the numbered paragraph is interpreted as being on level 1.</p><p class="Text_20_body">If a list style is not specified for a numbered paragraph, the list style of the previous numbered paragraph in the same sublist is used. If this paragraph is the first in the sublist, the list style of the previous paragraph in the higher list level is used. If there is no specified list style, the default list style is applied. <a href="#ListDefaultStyle">5.3.2</a></p><p class="Text_20_body">If a list level style is missing in the applied list style of a numbered paragraph, the same rules are applied to determine this list level style as for list items.</p><p class="Text_20_body">The text of a formatted number can be included in a <span class="Element">&lt;text:number&gt;</span> element.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> This text can be used by consumers that do not support numbering.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:numbered-paragraph&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:numbered-paragraph&gt;</span> element has the following attributes: <span class="Attribute">text:continue-numbering</span> <a href="#attribute-text_continue-numbering">19.781</a>, <span class="Attribute">text:level</span> <a href="#attribute-text_level">19.828</a>, <span class="Attribute">text:list-id</span> <a href="#attribute-text_list-id">19.829</a>, <span class="Attribute">text:start-value</span> <a href="#attribute-text_start-value_element-text_numbered-paragraph">19.868.6</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_numbered-paragraph">19.874.25</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:numbered-paragraph&gt;</span> element has the following child elements: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:number&gt;</span> <a href="#element-text_number">6.1.10</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a5_3_7Numbered_Paragraph_Style_Rules"><span style="margin-right:0.127cm;">5.3.7</span></a><a id="__RefHeading__1415160_253892949"/>Numbered Paragraph Style Rules</h3><p class="Text_20_body">If a list style is not specified for a numbered paragraph, the list style of the previous numbered paragraph in the same list is used. If this paragraph is the first in the list, the list style of the previous numbered paragraph in a higher list level is used. If there is no specified style available, the default style is applied. <a href="#ListDefaultStyle">5.3.2</a></p><p class="Text_20_body">If a list level style is missing in the applied list style of a numbered paragraph, the rules for styles on list items are applied. <a href="#ListItemStyleRules">5.3.5</a></p><h2 class="Heading_20_2"><a id="a5_4_text_section_"><span style="margin-right:0.127cm;">5.4</span></a><a id="__RefHeading__1415162_253892949"/><a id="element-text_section"/>&lt;text:section&gt;</h2><h3 class="Heading_20_3"><a id="a5_4_1General"><span style="margin-right:0.127cm;">5.4.1</span></a><a id="__RefHeading__1415164_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:section&gt;</span> element represents a named region of content in a document. </p><p class="Text_20_body">Sections specify formatting properties for a region of text or  text that is automatically acquired from an external data source or document, or another text section.</p><p class="Text_20_body">Sections support two ways of linking to external content. If a section is linked to another document, the link can be through one of the following:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A resource identified by an XLink, represented by a <span class="Element">&lt;text:section-source&gt;</span> element<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Dynamic Data Exchange (DDE), represented by a <span class="Element">&lt;office:dde-source&gt;</span> element<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Element">&lt;text:section-source&gt;</span> or <span class="Element">&lt;office:dde-source&gt;</span> elements occur only in the alternative and then as the first child element of a <span class="Element">&lt;text:section&gt;</span> element. </p><p class="Text_20_body">A section that links to external content should contain a full representation of the external content that appears in the section. </p><p class="Text_20_body">Linked external content may have an arbitrary file format. Consumers may process links to external content *and the external content itself to update the content that appears in a section. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:section&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:section&gt;</span> element has the following attributes: <span class="Attribute">text:condition</span> <a href="#attribute-text_condition_element-text_section">19.777.7</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_section">19.796.6</a>, <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_section">19.835.14</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_section">19.874.32</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:section&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a>, <span class="Element">&lt;text:soft-</span><span class="Element">page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h3 class="Heading_20_3"><a id="a5_4_2_text_section-source_"><span style="margin-right:0.127cm;">5.4.2</span></a><a id="__RefHeading__1415166_253892949"/><a id="element-text_section-source"/>&lt;text:section-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:section-source&gt;</span> element indicates that a section is a linked section.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:section-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:section-source&gt;</span> element has the following attributes: <span class="Attribute">text:filter-name</span> <a href="#attribute-text_filter-name">19.802</a>, <span class="Attribute">text:section-name</span> <a href="#attribute-text_section-name">19.861</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-text_section-source">19.910.37</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:section-source&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a5_5Change_Tracking"><span style="margin-right:0.127cm;">5.5</span></a><a id="__RefHeading__1415168_253892949"/><a id="TextChangeTracking"/>Change Tracking</h2><h3 class="Heading_20_3"><a id="a5_5_1_text_tracked-changes_"><span style="margin-right:0.127cm;">5.5.1</span></a><a id="__RefHeading__1415170_253892949"/><a id="element-text_tracked-changes"/>&lt;text:tracked-changes&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:tracked-changes&gt;</span> element acts as a container for <span class="Element">&lt;text:changed-region&gt;</span> elements that represent changes in a certain scope of an OpenDocument document. This scope is the element in which the <span class="Element">&lt;text:tracked-changes&gt;</span> element occurs. Changes in this scope shall be tracked by <span class="Element">&lt;text:changed-region&gt;</span> elements contained in the <span class="Element">&lt;text:tracked-changes&gt;</span> element in this scope.</p><p class="Text_20_body">If a <span class="Element">&lt;text:tracked-changes&gt;</span> element is absent, there are no tracked changes in the corresponding scope. In this case, all change mark elements (<a href="#a_5_5_7change-marks">5.5.7</a>) in this scope shall be ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:tracked-changes&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:tracked-changes&gt;</span> element has the following attribute: <span class="Attribute">text:track-changes</span> <a href="#attribute-text_track-changes">19.883</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:tracked-changes&gt;</span> element has the following child element: <span class="Element">&lt;text:changed-region&gt;</span> <a href="#element-text_changed-region">5.5.2</a>.</p><h3 class="Heading_20_3"><a id="a5_5_2_text_changed-region_"><span style="margin-right:0.127cm;">5.5.2</span></a><a id="__RefHeading__1415172_253892949"/><a id="element-text_changed-region"/>&lt;text:changed-region&gt;</h3><p class="Text_20_body">Each <span class="Element">&lt;text:changed-region&gt;</span> element contains a single element, one of <span class="Element">&lt;text:insertion&gt;</span>, <span class="Element">&lt;text:deletion&gt;</span>, or <span class="Element">&lt;text:format-change&gt;</span> that corresponds to a change being tracked within the scope of the <span class="Element">&lt;text:tracked-changes&gt;</span> element that contains the <span class="Element">&lt;text:changed-region&gt;</span> instance. </p><p class="Text_20_body">The <span class="Attribute">xml:id</span> attribute of the <span class="Element">&lt;text:changed-region&gt;</span> is referenced from the <span class="Element">&lt;text:change&gt;</span>, <span class="Element">&lt;text:change-start&gt;</span> and <span class="Element">&lt;text:change-end&gt;</span> elements that identify where the change applies to markup in the scope of the <span class="Element">&lt;text:tracked-changes&gt;</span> element.</p><p class="Text_20_body">A <span class="Element">&lt;text:changed-region&gt;</span> can be referenced by more than one change, but the corresponding referencing change mark elements shall be of the same change type - insertion, format change or deletion.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:changed-region&gt;</span> element is usable within the following element: <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:changed-region&gt;</span> element has the following attributes: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_changed-region">19.809.5</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:changed-region&gt;</span> element has the following child elements: <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:format-change&gt;</span> <a href="#element-text_format-change">5.5.5</a> and <span class="Element">&lt;text:insertion&gt;</span> <a href="#element-text_insertion">5.5.3</a>.</p><h3 class="Heading_20_3"><a id="a5_5_3_text_insertion_"><span style="margin-right:0.127cm;">5.5.3</span></a><a id="__RefHeading__1415174_253892949"/><a id="element-text_insertion"/>&lt;text:insertion&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:insertion&gt;</span> element contains the information that identifies the person responsible for a change and the date of that change. This information may also contain one or more <span class="Element">&lt;text:p&gt;</span> elements which contains a comment on the insertion. </p><p class="Text_20_body">The <span class="Element">&lt;text:insertion&gt;</span> element's parent <span class="Element">&lt;text:changed-region&gt;</span> element has an <span class="Attribute">xml:id</span> or <span class="Attribute">text:id</span> attribute, the value of which binds that parent element to the <span class="Attribute">text:change-id</span> attribute on the <span class="Element">&lt;text:change-start&gt;</span> and <span class="Element">&lt;text:change-end&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:insertion&gt;</span> element is usable within the following element: <span class="Element">&lt;text:changed-region&gt;</span> <a href="#element-text_changed-region">5.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:insertion&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:insertion&gt;</span> element has the following child element: <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>.</p><h3 class="Heading_20_3"><a id="a5_5_4_text_deletion_"><span style="margin-right:0.127cm;">5.5.4</span></a><a id="__RefHeading__1415176_253892949"/><a id="element-text_deletion"/>&lt;text:deletion&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:deletion&gt;</span> element contains information that identifies the person responsible for a deletion and the date of that deletion. This information may also contain one or more <span class="Element">&lt;text:p&gt;</span> elements which contains a comment on the deletion. The <span class="Element">&lt;text:deletion&gt;</span> element may also contain content that was deleted while change tracking was enabled. The position where the text was deleted is marked by a <span class="Element">&lt;text:change&gt;</span> element.</p><p class="Text_20_body">Deleted text is contained in a paragraph element. To reconstruct the original text, the paragraph containing the deleted text is merged with its surrounding paragraph or heading element.</p><p class="Text_20_body">To reconstruct the text before a deletion took place:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the change mark is inside a paragraph, insert the content that was deleted, but remove all leading start tags up to and including the first <span class="Element">&lt;text:p&gt;</span> element and all trailing end tags up to and including the last <span class="Source_20_Text">&lt;/text:p&gt;</span> or <span class="Source_20_Text">&lt;/text:h&gt;</span> element. If the last trailing element is a <span class="Source_20_Text">&lt;/text:h&gt;</span>, change the end tag <span class="Source_20_Text">&lt;/text:p&gt;</span> following this insertion to a <span class="Source_20_Text">&lt;/text:h&gt;</span> element. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the change mark is inside a heading, insert the content that was deleted, but remove all leading start tags up to and including the first <span class="Element">&lt;text:h&gt;</span> element and all trailing end tags up to and including the last <span class="Source_20_Text">&lt;/text:h&gt;</span> or <span class="Source_20_Text">&lt;/text:p&gt;</span> element. If the last trailing element is a <span class="Source_20_Text">&lt;/text:p&gt;</span>, change the end tag <span class="Source_20_Text">&lt;/text:h&gt;</span> following this insertion to a <span class="Source_20_Text">&lt;/text:p&gt;</span> element. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Otherwise, copy the text content of the <span class="Element">&lt;text:deletion&gt;</span> element in place of the change mark.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:deletion&gt;</span> element is usable within the following element: <span class="Element">&lt;text:changed-region&gt;</span> <a href="#element-text_changed-region">5.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:deletion&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:deletion&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h3 class="Heading_20_3"><a id="a5_5_5_text_format-change_"><span style="margin-right:0.127cm;">5.5.5</span></a><a id="__RefHeading__1415178_253892949"/><a id="element-text_format-change"/>&lt;text:format-change&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:format-change&gt;</span> element represents any change in formatting attributes. The region where the change took place is marked by <span class="Element">&lt;text:change-start&gt;</span>, <span class="Element">&lt;text:change-end&gt;</span> or <span class="Element">&lt;text:change&gt;</span> elements. </p><p class="Note"><span class="Note_20_Label">Note:</span> This element does not contain formatting changes that have taken place.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:format-change&gt;</span> element is usable within the following element: <span class="Element">&lt;text:changed-region&gt;</span> <a href="#element-text_changed-region">5.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:format-change&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:format-change&gt;</span> element has the following child element: <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>.</p><h3 class="Heading_20_3"><a id="a5_5_6_office_change-info_"><span style="margin-right:0.127cm;">5.5.6</span></a><a id="__RefHeading__1415180_253892949"/><a id="element-office_change-info"/>&lt;office:change-info&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:change-info&gt;</span> element represents who made a change and when. It may also contain a comment (one or more <span class="Element">&lt;text:p&gt;</span> elements) on the change.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:change-info&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a>, <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:format-change&gt;</span> <a href="#element-text_format-change">5.5.5</a> and <span class="Element">&lt;text:insertion&gt;</span> <a href="#element-text_insertion">5.5.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:change-info&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:change-info&gt;</span> element has the following child elements: <span class="Element">&lt;dc:creator&gt;</span> <a href="#element-dc_creator">4.3.2.7</a>, <span class="Element">&lt;dc:date&gt;</span> <a href="#element-dc_date">4.3.2.10</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a5_5_7Change_Marks"><span style="margin-right:0.127cm;">5.5.7</span></a><a id="__RefHeading__1415182_253892949"/><a id="a_5_5_7change-marks"/>Change Marks</h3><h4 class="Heading_20_4"><a id="a5_5_7_1General"><span style="margin-right:0.127cm;">5.5.7.1</span></a><a id="__RefHeading__440374_826425813"/>General</h4><p class="Text_20_body">The change mark elements mark start, end and positions in a text where a change has occurred. </p><p class="Text_20_body">These elements use the <span class="Attribute">text:change-id</span> attribute to link to <span class="Element">&lt;text:changed-region&gt;</span> elements that contain the change information. </p><h4 class="Heading_20_4"><a id="a5_5_7_2_text_change-start_"><span style="margin-right:0.127cm;">5.5.7.2</span></a><a id="__RefHeading__1415184_253892949"/><a id="element-text_change-start"/>&lt;text:change-start&gt;</h4><p class="Text_20_body"> The <span class="Element">&lt;text:change-start&gt;</span> element marks the start of a region with content where text has been inserted or the format has been changed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:change-start&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:change-start&gt;</span> element has the following attribute: <span class="Attribute">text:change-id</span> <a href="#attribute-text_change-id">19.766</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:change-start&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a5_5_7_3_text_change-end_"><span style="margin-right:0.127cm;">5.5.7.3</span></a><a id="__RefHeading__1415186_253892949"/><a id="element-text_change-end"/>&lt;text:change-end&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:change-end&gt;</span> element marks the end of a region with content where text has been inserted or the format has been changed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:change-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:change-end&gt;</span> element has the following attribute: <span class="Attribute">text:change-id</span> <a href="#attribute-text_change-id">19.766</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:change-end&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a5_5_7_4_text_change_"><span style="margin-right:0.127cm;">5.5.7.4</span></a><a id="__RefHeading__1415188_253892949"/><a id="element-text_change"/>&lt;text:change&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:change&gt;</span> element marks a position in an empty region where text has been deleted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:change&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:change&gt;</span> element has the following attribute: <span class="Attribute">text:change-id</span> <a href="#attribute-text_change-id">19.766</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:change&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a5_6_text_soft-page-break_"><span style="margin-right:0.127cm;">5.6</span></a><a id="__RefHeading__1415190_253892949"/><a id="element-text_soft-page-break"/>&lt;text:soft-page-break&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:soft-page-break&gt;</span> element represents a soft page break within or between paragraph elements.</p><p class="Text_20_body">As a child element of a <span class="Element">&lt;table:table&gt;</span> element it represents a soft page break between two table rows. It may appear in front of a <span class="Element">&lt;table:table-row&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:soft-page-break&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;table:table-header-rows&gt;</span> <a href="#element-table_table-header-rows">9.1.7</a>, <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>, <span class="Element">&lt;table:table-rows&gt;</span> <a href="#element-table_table-rows">9.1.8</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a>, <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:soft-page-break&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:soft-page-break&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a5_7Document_Declarations"><span style="margin-right:0.127cm;">5.7</span></a><a id="__RefHeading__1415192_253892949"/>Document Declarations</h2><p class="Text_20_body">The following declaration elements appear before the main content element of a document: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:variable-decl&gt;</span> – declarations for variable fields. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:user-field-decl&gt;</span> – declarations for user-defined fields. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:sequence-decl&gt;</span> – declarations for sequence fields.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:dde-connection&gt;</span> – declarations for DDE fields and DDE sections.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> – declaration for generation of alphabetical indexes. <span class="odfLiEnd"/> </p></li></ul><h1 class="Heading_20_1"><a id="a6Paragraph_Elements_Content"><span style="margin-right:0.127cm;">6</span></a><a id="__RefHeading__1415194_253892949"/><a id="Paragarph_Content"/>Paragraph Elements Content</h1><h2 class="Heading_20_2"><a id="a6_1Basic_Text_Content"><span style="margin-right:0.127cm;">6.1</span></a><a id="__RefHeading__1415196_253892949"/>Basic Text Content</h2><h3 class="Heading_20_3"><a id="a6_1_1General"><span style="margin-right:0.127cm;">6.1.1</span></a><a id="__RefHeading__1415198_253892949"/><a id="character-content"/>General</h3><p class="Text_20_body">The paragraph elements <span class="Element">&lt;text:p&gt;</span> and <span class="Element">&lt;text:h&gt;</span> and their descendant elements contain the text content of any document. The <span class="Def">character content</span> of a paragraph consists of the character data of the paragraph element and the character data of its descendant elements concatenated in document order, with the following exceptions:</p><p class="Text_20_body"> Character data contained in the following elements or their descendant elements are not included in the character content of a paragraph:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:note-body&gt;</span>. <a href="#element-text_note-body">6.3.4</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:ruby-text&gt;</span>. <a href="#element-text_meta-field">7.5.19</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;office:annotation&gt;</span>. <a href="#element-office_annotation">14.1</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Drawing shape and frame elements defined in sections <a href="#drawing_shapes_section">10.3</a>, <a href="#Frames">10.4</a>, <a href="#a_3D_Shapes">10.5</a> and <a href="#Custom_Shape">10.6</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"><span class="Note_20_Label">Note:</span> This should significantly ease transformations into other formats, since transformations need not interpret most of the descendant elements of a paragraph element to obtain the character content of a paragraph.</p><p class="Text_20_body">The phrase "document order" when used with reference to an OpenDocument document instance is defined by Section 5.0 Data Model <a title="XML Path Language (XPath) Version 1.0" href="http://www.w3.org/TR/1999/REC-xpath-19991116">[XPath]</a>. </p><h3 class="Heading_20_3"><a id="a6_1_2White_Space_Characters"><span style="margin-right:0.127cm;">6.1.2</span></a><a id="__RefHeading__1415200_253892949"/><a id="White-space_Characters"/>White Space Characters</h3><p class="Text_20_body">Consumers shall collapse white space characters that occur in </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a <span class="Element">&lt;text:p&gt;</span> or <span class="Element">&lt;text:h&gt;</span> element (so called paragraph elements), and <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>in their descendant elements, if the OpenDocument schema permits the inclusion of character data for the element itself and all its ancestor elements up to the paragraph element.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Collapsing white space characters is defined by the following algorithm:</p><ol><li><p class="P19" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">1)</span>The following <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters are replaced by a “ “ (U+0020, SPACE) character:<span class="odfLiEnd"/> </p><ul><li><p class="P19" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:1cm"></span>HORIZONTAL TABULATION (U+0009)<span class="odfLiEnd"/> </p></li><li><p class="P19" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:1cm"></span>CARRIAGE RETURN (U+000D)<span class="odfLiEnd"/> </p></li><li><p class="P19" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:1cm"></span>LINE FEED (U+000A)<span class="odfLiEnd"/> </p></li></ul></li><li><p class="P19" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">2)</span>The character data of the paragraph element and of all descendant elements for which the OpenDocument schema permits the inclusion of character data for the element itself and all its ancestor elements up to the paragraph element, is concatenated in document order.<span class="odfLiEnd"/> </p></li><li><p class="P19" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">3)</span>Leading “ “ (U+0020, SPACE) characters at the start of the resulting text and trailing SPACE characters at the end of the resulting text are removed.<span class="odfLiEnd"/> </p></li><li><p class="P19" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">4)</span>Sequences of “ “ (U+0020, SPACE) characters are replaced by a single “ “ (U+0020, SPACE) character. <span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a6_1_3_text_s_"><span style="margin-right:0.127cm;">6.1.3</span></a><a id="__RefHeading__1415202_253892949"/><a id="element-text_s"/>&lt;text:s&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:s&gt;</span> element is used to represent the <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character “ “ (U+0020, SPACE).</p><p class="Text_20_body">This element shall be used to represent the second and all following “ “ (U+0020, SPACE) characters in a sequence of “ “ (U+0020, SPACE) characters.</p><p class="Note"><span class="Note_20_Label">Note:</span> It is not an error if the character preceding the element is not a white space character, but it is good practice to use this element only for the second and all following “ “ (U+0020, SPACE) characters in a sequence. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:s&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:s&gt;</span> element has the following attribute: <span class="Attribute">text:c</span> <a href="#attribute-text_c">19.763</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:s&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a6_1_4_text_tab_"><span style="margin-right:0.127cm;">6.1.4</span></a><a id="__RefHeading__1415204_253892949"/><a id="element-text_tab"/><a id="Tab_Character"/>&lt;text:tab&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:tab&gt;</span> element represents the <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> tab character (HORIZONTAL TABULATION, U+0009). A <span class="Element">&lt;text:tab&gt;</span> element specifies that content immediately following it should begin at the next tab stop.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:tab&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:tab&gt;</span> element has the following attribute: <span class="Attribute">text:tab-ref</span> <a href="#attribute-text_tab-ref">19.877</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:tab&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a6_1_5_text_line-break_"><span style="margin-right:0.127cm;">6.1.5</span></a><a id="__RefHeading__1415206_253892949"/><a id="element-text_line-break"/>&lt;text:line-break&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:line-break&gt;</span> element represents a line break.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:line-break&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:line-break&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:line-break&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a6_1_6Soft_Hyphens__Hyphens__and_Non-breaking_Spaces"><span style="margin-right:0.127cm;">6.1.6</span></a><a id="__RefHeading__1415208_253892949"/>Soft Hyphens, Hyphens, and Non-breaking Spaces</h3><p class="Text_20_body">Soft hyphens, hyphens, and non-breaking blanks are represented by <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters.</p><p class="Table">Table <a id="refTable7"/>8 - Unicode characters</p><table border="0" cellspacing="0" cellpadding="0" class="SpecialUnicodeharacters"><colgroup><col width="244"/><col width="164"/></colgroup><tr class="SpecialUnicodeharacters1"><td style="text-align:left;width:2.2in; " class="SpecialUnicodeharacters_A1"><p class="Table_20_Heading">The <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character...</p></td><td style="text-align:left;width:1.4771in; " class="SpecialUnicodeharacters_B1"><p class="Table_20_Heading">Represents...</p></td></tr><tr><td style="text-align:left;width:2.2in; " class="SpecialUnicodeharacters_A2"><p class="Table_20_Contents">SOFT HYPHEN (U+00AD)</p></td><td style="text-align:left;width:1.4771in; " class="SpecialUnicodeharacters_B2"><p class="Table_20_Contents">soft hyphens</p></td></tr><tr class="SpecialUnicodeharacters1"><td style="text-align:left;width:2.2in; " class="SpecialUnicodeharacters_A2"><p class="Table_20_Contents">NON-BREAKING HYPHEN (U+2011)</p></td><td style="text-align:left;width:1.4771in; " class="SpecialUnicodeharacters_B2"><p class="Table_20_Contents">non-breaking hyphens</p></td></tr><tr class="SpecialUnicodeharacters1"><td style="text-align:left;width:2.2in; " class="SpecialUnicodeharacters_A2"><p class="Table_20_Contents">NO-BREAK SPACE (U+00A0)</p></td><td style="text-align:left;width:1.4771in; " class="SpecialUnicodeharacters_B2"><p class="Table_20_Contents">non-breaking spaces</p></td></tr></table><h3 class="Heading_20_3"><a id="a6_1_7_text_span_"><span style="margin-right:0.127cm;">6.1.7</span></a><a id="__RefHeading__1415210_253892949"/><a id="element-text_span"/>&lt;text:span&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:span&gt;</span> element represents the application of a style to the character data of a portion of text. The content of this element is the text which uses that text style.</p><p class="Text_20_body">The <span class="Element">&lt;text:span&gt;</span> element can be nested.</p><p class="Text_20_body">White space characters contained in this element are collapsed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:span&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:span&gt;</span> element has the following attributes: <span class="Attribute">text:class-names</span> <a href="#attribute-text_class-names_element-text_span">19.770.4</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_span">19.874.33</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:span&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;presentation:date-time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-</span><span class="Element">country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:span&gt;</span> element has mixed content.</p><h3 class="Heading_20_3"><a id="a6_1_8_text_a_"><span style="margin-right:0.127cm;">6.1.8</span></a><a id="__RefHeading__1415212_253892949"/><a id="element-text_a"/>&lt;text:a&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:a&gt;</span> element represents a hyperlink.</p><p class="Text_20_body">The anchor of a hyperlink is composed of the character data contained by the <span class="Element">&lt;text:a&gt;</span> element and any of its descendant elements which constitute the character data of the paragraph which contains the <span class="Element">&lt;text:a&gt;</span> element. <a href="#character-content">6.1.1</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:a&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:a&gt;</span> element has the following attributes: <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-text_a">19.376.9</a>, <span class="Attribute">office:target-frame-name</span> <a href="#attribute-office_target-frame-name">19.381</a>, <span class="Attribute">office:title</span> <a href="#attribute-office_title">19.383</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_a">19.874.2</a>, <span class="Attribute">text:visited-style-name</span> <a href="#attribute-text_visited-style-name">19.901</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-text_a">19.910.33</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:a&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;presentation:date-time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-</span><span class="Element">next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-</span><span class="Element">macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-</span><span class="Element">paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:a&gt;</span> element has mixed content.</p><h3 class="Heading_20_3"><a id="a6_1_9_text_meta_"><span style="margin-right:0.127cm;">6.1.9</span></a><a id="__RefHeading__1415214_253892949"/><a id="element-text_meta"/>&lt;text:meta&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:meta&gt;</span> element represents portions of text that have in content metadata attached. See <a href="#attribute-xhtml_about">19.905</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:meta&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:meta&gt;</span> element has the following attributes: <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:meta&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;presentation:date-</span><span class="Element">time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:meta&gt;</span> element has mixed content.</p><h3 class="Heading_20_3"><a id="a6_1_10_text_number_"><span style="margin-right:0.127cm;">6.1.10</span></a><a id="__RefHeading__1415216_253892949"/><a id="element-text_number"/>&lt;text:number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:number&gt;</span> element contains the text of a formatted number which is present when a list style is applied to an element whose corresponding list level style specifies that the list label is a number. This text may be used by consumers that do not support the automatic generation of numbering but should be ignored by consumers that do support it. </p><p class="Text_20_body">This element has no attributes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:number&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a>, <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a> and <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:number&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:number&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:number&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a6_2Bookmarks_and_References"><span style="margin-right:0.127cm;">6.2</span></a><a id="__RefHeading__1415218_253892949"/>Bookmarks and References</h2><h3 class="Heading_20_3"><a id="a6_2_1Bookmarks"><span style="margin-right:0.127cm;">6.2.1</span></a><a id="__RefHeading__1415220_253892949"/>Bookmarks</h3><h4 class="Heading_20_4"><a id="a6_2_1_1General"><span style="margin-right:0.127cm;">6.2.1.1</span></a><a id="__RefHeading__1415222_253892949"/>General</h4><p class="Text_20_body">Bookmarks can either mark a text position or a text range. A text position is a position inside the text content of a document. A text range starts at any text position and ends at another text position.</p><p class="Text_20_body">Bookmarks which mark a text range support overlapping references. </p><h4 class="Heading_20_4"><a id="a6_2_1_2_text_bookmark_"><span style="margin-right:0.127cm;">6.2.1.2</span></a><a id="__RefHeading__1415224_253892949"/><a id="element-text_bookmark"/>&lt;text:bookmark&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:bookmark&gt;</span> element marks a text position. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bookmark&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bookmark&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_bookmark">19.835.4</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bookmark&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a6_2_1_3_text_bookmark-start_"><span style="margin-right:0.127cm;">6.2.1.3</span></a><a id="__RefHeading__1415226_253892949"/><a id="element-text_bookmark-start"/>&lt;text:bookmark-start&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:bookmark-start&gt;</span> element marks the start position of a bookmark in a text range.</p><p class="Text_20_body">For every <span class="Element">&lt;text:bookmark-start&gt;</span> element, there shall be a <span class="Element">&lt;text:bookmark-end&gt;</span> element in the same document using the same value for the <span class="Attribute">text:name</span> attribute. Every <span class="Element">&lt;text:bookmark-start&gt;</span> element shall precede the <span class="Element">&lt;text:bookmark-end&gt;</span> element with the same value for its <span class="Attribute">text:name</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bookmark-start&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bookmark-start&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_bookmark-start">19.835.6</a>, <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bookmark-start&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a6_2_1_4_text_bookmark-end_"><span style="margin-right:0.127cm;">6.2.1.4</span></a><a id="__RefHeading__1415228_253892949"/><a id="element-text_bookmark-end"/>&lt;text:bookmark-end&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:bookmark-end&gt;</span> element marks the end position of a bookmark in a text range.</p><p class="Text_20_body">For every <span class="Element">&lt;text:bookmark-end&gt;</span> element, there shall be a preceding <span class="Element">&lt;text:bookmark-start&gt;</span> element in the same document using the same value for the <span class="Attribute">text:name</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bookmark-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bookmark-end&gt;</span> element has the following attribute: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_bookmark-end">19.835.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bookmark-end&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a6_2_2References"><span style="margin-right:0.127cm;">6.2.2</span></a><a id="__RefHeading__1415230_253892949"/><a id="Reference_Marks"/>References</h3><h4 class="Heading_20_4"><a id="a6_2_2_1General"><span style="margin-right:0.127cm;">6.2.2.1</span></a><a id="__RefHeading__1415232_253892949"/>General</h4><p class="Text_20_body">There are two types of reference marks:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A point reference<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>A point reference marks a position in text and is represented by a single <span class="Element">&lt;text:reference-mark&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A range reference<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>A range reference marks a range of characters in text and is represented by two elements; a <span class="Element">&lt;text:reference-mark-start&gt;</span> element to mark the start of the range and a following <span class="Element">&lt;text:reference-mark-end&gt;</span> element to mark the end of the range.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Every reference is identified by the value of its <span class="Attribute">text:name</span> attribute, which shall be unique. In a range reference, the start and end elements shall use the same attribute value.</p><p class="Text_20_body">Range references support overlapping references. </p><h4 class="Heading_20_4"><a id="a6_2_2_2_text_reference-mark_"><span style="margin-right:0.127cm;">6.2.2.2</span></a><a id="__RefHeading__1415234_253892949"/><a id="element-text_reference-mark"/>&lt;text:reference-mark&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:reference-mark&gt;</span> element represents a point reference.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:reference-mark&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:reference-mark&gt;</span> element has the following attribute: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_reference-mark">19.835.11</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:reference-mark&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a6_2_2_3_text_reference-mark-start_"><span style="margin-right:0.127cm;">6.2.2.3</span></a><a id="__RefHeading__1415236_253892949"/><a id="element-text_reference-mark-start"/>&lt;text:reference-mark-start&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:reference-mark-start&gt;</span> element represent the start of a range reference.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:reference-mark-start&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:reference-mark-start&gt;</span> element has the following attribute: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_reference-mark-start">19.835.13</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:reference-mark-start&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a6_2_2_4_text_reference-mark-end_"><span style="margin-right:0.127cm;">6.2.2.4</span></a><a id="__RefHeading__1415238_253892949"/><a id="element-text_reference-mark-end"/>&lt;text:reference-mark-end&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:reference-mark-end&gt;</span> element represent the end of a range reference.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:reference-mark-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:reference-mark-end&gt;</span> element has the following attribute: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_reference-mark-end">19.835.12</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:reference-mark-end&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a6_3Notes"><span style="margin-right:0.127cm;">6.3</span></a><a id="__RefHeading__1415240_253892949"/><a id="text-notes"/>Notes</h2><h3 class="Heading_20_3"><a id="a6_3_1General"><span style="margin-right:0.127cm;">6.3.1</span></a><a id="__RefHeading__1415242_253892949"/>General</h3><p class="Text_20_body">Notes consist of a <span class="Element">&lt;text:note&gt;</span> element which occurs in the text stream at the position to which the note is anchored. The numbering and rendering of notes is specified by a <span class="Element">&lt;text:notes-configuration&gt;</span> element, which occurs inside an <span class="Element">&lt;office:styles&gt;</span> element.</p><h3 class="Heading_20_3"><a id="a6_3_2_text_note_"><span style="margin-right:0.127cm;">6.3.2</span></a><a id="__RefHeading__1415244_253892949"/><a id="element-text_note"/>&lt;text:note&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:note&gt;</span> element represents text notes which are attached to a text position.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:note&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:note&gt;</span> element has the following attributes: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_note">19.809.7</a> and <span class="Attribute">text:note-class</span> <a href="#attribute-text_note-class">19.837</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:note&gt;</span> element has the following child elements: <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:note-citation&gt;</span> <a href="#element-text_note-citation">6.3.3</a>.</p><h3 class="Heading_20_3"><a id="a6_3_3_text_note-citation_"><span style="margin-right:0.127cm;">6.3.3</span></a><a id="__RefHeading__1415246_253892949"/><a id="element-text_note-citation"/>&lt;text:note-citation&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:note-citation&gt;</span> element contains a citation, either as a formatted number or a string.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:note-citation&gt;</span> element is usable within the following element: <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:note-citation&gt;</span> element has the following attribute: <span class="Attribute">text:label</span> <a href="#attribute-text_label">19.826</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:note-citation&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:note-citation&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a6_3_4_text_note-body_"><span style="margin-right:0.127cm;">6.3.4</span></a><a id="__RefHeading__1415248_253892949"/><a id="element-text_note-body"/>&lt;text:note-body&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:note-body&gt;</span> element contains the content of a note. It does not have any attributes.</p><p class="Note"><span class="Note_20_Label">Note:</span> The schema allows for the inclusion of notes into the note body. While this may be reasonable for note types, it is not reasonable for footnotes and endnotes. Conforming consumers need not support notes inside notes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:note-body&gt;</span> element is usable within the following element: <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:note-body&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:note-body&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h2 class="Heading_20_2"><a id="a6_4_text_ruby_"><span style="margin-right:0.127cm;">6.4</span></a><a id="__RefHeading__1415250_253892949"/><a id="element-text_ruby"/>&lt;text:ruby&gt;</h2><h3 class="Heading_20_3"><a id="a6_4_1General"><span style="margin-right:0.127cm;">6.4.1</span></a><a id="__RefHeading__1415252_253892949"/>General</h3><p class="Text_20_body">A ruby is additional text that is displayed above or below a base text. The purpose of a ruby is to annotate a base text or provide information about its pronunciation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:ruby&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:ruby&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_ruby">19.874.30</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:ruby&gt;</span> element has the following child elements: <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:ruby-text&gt;</span> <a href="#element-text_ruby-text">6.4.3</a>.</p><h3 class="Heading_20_3"><a id="a6_4_2_text_ruby-base_"><span style="margin-right:0.127cm;">6.4.2</span></a><a id="__RefHeading__1415254_253892949"/><a id="element-text_ruby-base"/>&lt;text:ruby-base&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:ruby-base&gt;</span> element contains the text that is to be annotated. It contains any paragraph element content, like text spans. The element's <span class="Attribute">text:style-name</span> attribute references a ruby style that specifies formatting attributes of the ruby.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:ruby-base&gt;</span> element is usable within the following element: <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:ruby-base&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:ruby-base&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;presentation:date-time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:ruby-base&gt;</span> element has mixed content.</p><h3 class="Heading_20_3"><a id="a6_4_3_text_ruby-text_"><span style="margin-right:0.127cm;">6.4.3</span></a><a id="__RefHeading__1415256_253892949"/><a id="element-text_ruby-text"/>&lt;text:ruby-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:ruby-text&gt;</span> element contains an annotation text. It may contain only plain text. The element's <span class="Attribute">text:style-name</span> attribute references a text style that specifies further formatting attributes used for the annotation text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:ruby-text&gt;</span> element is usable within the following element: <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:ruby-text&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_ruby-text">19.874.31</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:ruby-text&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:ruby-text&gt;</span> element has character data content.</p><h1 class="Heading_20_1"><a id="a7Text_Fields"><span style="margin-right:0.127cm;">7</span></a><a id="__RefHeading__1415258_253892949"/><a id="Text_Fields"/>Text Fields</h1><h2 class="Heading_20_2"><a id="a7_1General"><span style="margin-right:0.127cm;">7.1</span></a><a id="__RefHeading__1415260_253892949"/>General</h2><p class="Text_20_body">OpenDocument text documents or OpenDocument text content embedded in other types of documents may contain variable text elements called fields. Fields are commonly used for:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Page numbers<br/><span style="margin-left:0.6401cm"/>A page number field displays the number of the page on which it appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Creation dates<br/><span style="margin-left:0.6401cm"/>A creation date field displays the date on which a document was created.<span class="odfLiEnd"/> </p></li></ul><h2 class="Heading_20_2"><a id="a7_2Common_Characteristics_of_Field_Elements"><span style="margin-right:0.127cm;">7.2</span></a><a id="__RefHeading__1415262_253892949"/>Common Characteristics of Field Elements</h2><p class="Text_20_body">Each field type is represented by a corresponding element type. The content of an element is a textual representation of the current field value as it would be displayed or printed. </p><p class="Text_20_body">The value of a field is stored in an attribute. Storage of the value enables recalculation of the presentation of a field. </p><p class="Note"><span class="Note_20_Label">Note</span>: For string values, if a value is identical to a presentation, the value attribute can be omitted to avoid duplicate storage of information.</p><p class="Text_20_body">The presentation of information in a field is determined by the style applied to the field. </p><h2 class="Heading_20_2"><a id="a7_3Document_Fields"><span style="margin-right:0.127cm;">7.3</span></a><a id="__RefHeading__1415264_253892949"/>Document Fields</h2><h3 class="Heading_20_3"><a id="a7_3_1General"><span style="margin-right:0.127cm;">7.3.1</span></a><a id="__RefHeading__1415266_253892949"/>General</h3><p class="Text_20_body">OpenDocument fields display information about the current document or about a specific part of the current document.,</p><h3 class="Heading_20_3"><a id="a7_3_2_text_date_"><span style="margin-right:0.127cm;">7.3.2</span></a><a id="__RefHeading__1415268_253892949"/><a id="element-text_date"/>&lt;text:date&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:date&gt;</span> element displays a date, by default this is the current date. The date can be adjusted to display a date other than the current date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:date&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:date&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_date">19.469.7</a>, <span class="Attribute">text:date-adjust</span> <a href="#attribute-text_date-adjust">19.792</a>, <span class="Attribute">text:date-value</span> <a href="#attribute-text_date-value">19.793</a> and <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:date&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_3_text_time_"><span style="margin-right:0.127cm;">7.3.3</span></a><a id="__RefHeading__1415270_253892949"/><a id="element-text_time"/>&lt;text:time&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:time&gt;</span> element displays a time, by default this is the current time.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:time&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:time&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_time">19.469.16</a>, <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>, <span class="Attribute">text:time-adjust</span> <a href="#attribute-text_time-adjust">19.880</a> and <span class="Attribute">text:time-value</span> <a href="#attribute-text_time-value">19.881</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:time&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:time&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_4_text_page-number_"><span style="margin-right:0.127cm;">7.3.4</span></a><a id="__RefHeading__1415272_253892949"/><a id="element-text_page-number"/>&lt;text:page-number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:page-number&gt;</span> element displays the current page number.</p><p class="Text_20_body">If a number style is not specified for page numbers, the default is the number style of the current page style. </p><p class="Note"><span class="Note_20_Label">Note:</span> The <span class="Element">&lt;text:page-count&gt;</span> element displays the total number of pages in a document. <a href="#element-text_page-count">7.5.18.2</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page-number&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page-number&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>, <span class="Attribute">text:page-adjust</span> <a href="#attribute-text_page-adjust_element-text_page-number">19.845.2</a> and <span class="Attribute">text:select-page</span> <a href="#attribute-text_select-page_element-text_page-number">19.863.3</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:page-number&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page-number&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_5_text_page-continuation_"><span style="margin-right:0.127cm;">7.3.5</span></a><a id="__RefHeading__1415274_253892949"/><a id="element-text_page-continuation"/>&lt;text:page-continuation&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:page-continuation&gt;</span> element displays a continuation reminder printed at the bottom of the page in addition to the page number.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page-continuation&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page-continuation&gt;</span> element has the following attributes: <span class="Attribute">text:select-page</span> <a href="#attribute-text_select-page_element-text_page-continuation">19.863.2</a> and <span class="Attribute">text:string-value</span> <a href="#attribute-text_string-value_element-text_page-continuation">19.871.4</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:page-continuation&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page-continuation&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_6Subsequent_Author_Fields"><span style="margin-right:0.127cm;">7.3.6</span></a><a id="__RefHeading__1415276_253892949"/>Subsequent Author Fields</h3><h4 class="Heading_20_4"><a id="a7_3_6_1General"><span style="margin-right:0.127cm;">7.3.6.1</span></a><a id="__RefHeading__1415278_253892949"/>General</h4><p class="Text_20_body">Subsequent author fields capture information about second and following authors for a document. </p><p class="Note"><span class="Note_20_Label">Note:</span> In OpenDocument 1.0/1.1, these fields were referenced as “sender” fields and that terminology still appears in the names of these elements. </p><p class="Text_20_body">If a subsequent author field is marked fixed using the <span class="Attribute">text:fixed</span> attribute, the original information in that field is preserved. <a href="#attribute-text_fixed">19.803</a> Otherwise, the information is updated each time the file is edited.</p><h4 class="Heading_20_4"><a id="a7_3_6_2_text_sender-firstname_"><span style="margin-right:0.127cm;">7.3.6.2</span></a><a id="__RefHeading__1415280_253892949"/><a id="element-text_sender-firstname"/>&lt;text:sender-firstname&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-firstname&gt;</span> element represents the first name of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-firstname&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-firstname&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-firstname&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-firstname&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_3_text_sender-lastname_"><span style="margin-right:0.127cm;">7.3.6.3</span></a><a id="__RefHeading__1415282_253892949"/><a id="element-text_sender-lastname"/>&lt;text:sender-lastname&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-lastname&gt;</span> element represents the last name of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-lastname&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-lastname&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-lastname&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-lastname&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_4_text_sender-initials_"><span style="margin-right:0.127cm;">7.3.6.4</span></a><a id="__RefHeading__1415284_253892949"/><a id="element-text_sender-initials"/>&lt;text:sender-initials&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-initials&gt;</span> element represents the initials of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-initials&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-initials&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-initials&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-initials&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_5_text_sender-title_"><span style="margin-right:0.127cm;">7.3.6.5</span></a><a id="__RefHeading__1415286_253892949"/><a id="element-text_sender-title"/>&lt;text:sender-title&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-title&gt;</span> element represents the title of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-title&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-title&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-title&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-title&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_6_text_sender-position_"><span style="margin-right:0.127cm;">7.3.6.6</span></a><a id="__RefHeading__1415288_253892949"/><a id="element-text_sender-position"/>&lt;text:sender-position&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-position&gt;</span> element represents the position of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-position&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-position&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-position&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-position&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_7_text_sender-email_"><span style="margin-right:0.127cm;">7.3.6.7</span></a><a id="__RefHeading__1415290_253892949"/><a id="element-text_sender-email"/>&lt;text:sender-email&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-email&gt;</span> element represents the email address of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-email&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-email&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-email&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-email&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_8_text_sender-phone-private_"><span style="margin-right:0.127cm;">7.3.6.8</span></a><a id="__RefHeading__1415292_253892949"/><a id="element-text_sender-phone-private"/>&lt;text:sender-phone-private&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-phone-private&gt;</span> element represents the private telephone number of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-phone-private&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-phone-private&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-phone-private&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-phone-private&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_9_text_sender-fax_"><span style="margin-right:0.127cm;">7.3.6.9</span></a><a id="__RefHeading__1415294_253892949"/><a id="element-text_sender-fax"/>&lt;text:sender-fax&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-fax&gt;</span> element represents the facsimile number of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-fax&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-fax&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-fax&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-fax&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_10_text_sender-company_"><span style="margin-right:0.127cm;">7.3.6.10</span></a><a id="__RefHeading__1415296_253892949"/><a id="element-text_sender-company"/>&lt;text:sender-company&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-company&gt;</span> element represents the name of the company that employs a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-company&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-company&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-company&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-company&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_11_text_sender-phone-work_"><span style="margin-right:0.127cm;">7.3.6.11</span></a><a id="__RefHeading__1415298_253892949"/><a id="element-text_sender-phone-work"/>&lt;text:sender-phone-work&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-phone-work&gt;</span> element represents the office telephone number of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-phone-work&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-phone-work&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-phone-work&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-phone-work&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_12_text_sender-street_"><span style="margin-right:0.127cm;">7.3.6.12</span></a><a id="__RefHeading__1415300_253892949"/><a id="element-text_sender-street"/>&lt;text:sender-street&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-street&gt;</span> element represents the street address of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-street&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-street&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-street&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-street&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_13_text_sender-city_"><span style="margin-right:0.127cm;">7.3.6.13</span></a><a id="__RefHeading__1415302_253892949"/><a id="element-text_sender-city"/>&lt;text:sender-city&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-city&gt;</span> element represents the city name of the address of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-city&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-city&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-city&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-city&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_14_text_sender-postal-code_"><span style="margin-right:0.127cm;">7.3.6.14</span></a><a id="__RefHeading__1415304_253892949"/><a id="element-text_sender-postal-code"/>&lt;text:sender-postal-code&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-postal-code&gt;</span> element represents the postal code of the address of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-postal-code&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-postal-code&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-postal-code&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-postal-code&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_15_text_sender-country_"><span style="margin-right:0.127cm;">7.3.6.15</span></a><a id="__RefHeading__1415306_253892949"/><a id="element-text_sender-country"/>&lt;text:sender-country&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-country&gt;</span> element represents the country name of the address of a subsequent author.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-country&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-country&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-country&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-country&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_6_16_text_sender-state-or-province_"><span style="margin-right:0.127cm;">7.3.6.16</span></a><a id="__RefHeading__1415308_253892949"/><a id="element-text_sender-state-or-province"/>&lt;text:sender-state-or-province&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:sender-state-or-province&gt;</span> element represents the state or province name of the address of a subsequent author, if applicable.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sender-state-or-province&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sender-state-or-province&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sender-state-or-province&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sender-state-or-province&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_7Author_Fields"><span style="margin-right:0.127cm;">7.3.7</span></a><a id="__RefHeading__1415310_253892949"/>Author Fields</h3><h4 class="Heading_20_4"><a id="a7_3_7_1_text_author-name_"><span style="margin-right:0.127cm;">7.3.7.1</span></a><a id="__RefHeading__1415312_253892949"/><a id="element-text_author-name"/>&lt;text:author-name&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:author-name&gt;</span> element represents the full name of the author of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:author-name&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:author-name&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:author-name&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:author-name&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_3_7_2_text_author-initials_"><span style="margin-right:0.127cm;">7.3.7.2</span></a><a id="__RefHeading__1415314_253892949"/><a id="element-text_author-initials"/>&lt;text:author-initials&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:author-initials&gt;</span> element represents the initials of the author of a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:author-initials&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:author-initials&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:author-initials&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:author-initials&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_8_text_chapter_"><span style="margin-right:0.127cm;">7.3.8</span></a><a id="__RefHeading__1415316_253892949"/><a id="element-text_chapter"/>&lt;text:chapter&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:chapter&gt;</span> element represents a field that displays one of the following:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The name of the current chapter<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The number of the current chapter<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Both the name and number of the current chapter<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If this element is placed inside a header or footer, it displays the current chapter name or number on every page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:chapter&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:chapter&gt;</span> element has the following attributes: <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_chapter">19.796.2</a> and <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_chapter">19.844.3</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:chapter&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:chapter&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_9_text_file-name_"><span style="margin-right:0.127cm;">7.3.9</span></a><a id="__RefHeading__1415318_253892949"/><a id="element-text_file-name"/>&lt;text:file-name&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:file-name&gt;</span> element represents a field that displays the name of a file that is being edited.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:file-name&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:file-name&gt;</span> element has the following attributes: <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_file-name">19.796.4</a> and <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:file-name&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:file-name&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_10_text_template-name_"><span style="margin-right:0.127cm;">7.3.10</span></a><a id="__RefHeading__1415320_253892949"/><a id="element-text_template-name"/>&lt;text:template-name&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:template-name&gt;</span> element represents a field that displays information about the document template in use.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:template-name&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:template-name&gt;</span> element has the following attribute: <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_template-name">19.796.8</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:template-name&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:template-name&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_3_11_text_sheet-name_"><span style="margin-right:0.127cm;">7.3.11</span></a><a id="__RefHeading__1415322_253892949"/><a id="element-text_sheet-name"/>&lt;text:sheet-name&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:sheet-name&gt;</span> element displays represents the name of a sheet that is currently being edited in a Spreadsheet document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sheet-name&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sheet-name&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sheet-name&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sheet-name&gt;</span> element has character data content.</p><h2 class="Heading_20_2"><a id="a7_4Variable_Fields"><span style="margin-right:0.127cm;">7.4</span></a><a id="__RefHeading__1415324_253892949"/>Variable Fields</h2><h3 class="Heading_20_3"><a id="a7_4_1General"><span style="margin-right:0.127cm;">7.4.1</span></a><a id="__RefHeading__1415326_253892949"/>General</h3><p class="Text_20_body">OpenDocument documents can contain variables, which are processed or displayed using variable fields. In an OpenDocument file, variable declarations shall precede in document order any use of those variable declarations. </p><p class="Text_20_body">There are three types of variables:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Strong_20_Emphasis">Simple variables</span><span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Simple variables, or variables, can take different values at different positions in a document. Simple variables can be set using either setter or input fields. Setter fields contain an expression, which is used to compute the new value of the variable. Input fields prompt the user for the new value. <span class="odfLiEnd"/> </p><p class="P25" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span><span class="Note_20_Label">Note: </span>Simple variables can be used to display different text in recurring elements, such as headers or footers.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Strong_20_Emphasis">User variables</span><span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span> If a user variable is set anywhere within the document, all fields in a document that display that user variable have the same value.  The value of the user variable can only be set after the variable is declared.<span class="odfLiEnd"/> </p><p class="P25" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span><span class="Note_20_Label">Note:</span> In a consumer's user interface, a user variable can be set at any occurrence of a user field, or by using user variable input fields.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Strong_20_Emphasis">Sequence variables</span><span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Sequence variables are used to number items in an OpenDocument text document<span class="odfLiEnd"/> </p><p class="P25" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span><span class="Note_20_Label">Note:</span> Sequence variables can be used to number images or tables in a text.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value of a sequence variable is initialized to 0 (zero) by its declaration. </p><p class="Text_20_body">Variables shall be declared before they can be used. The OpenDocument elements for declaring variables are described in sections <a href="#element-text_variable-decl">7.4.3</a>, <a href="#element-text_user-field-decl">7.4.8</a> and <a href="#element-text_sequence-decl">7.4.12</a>.</p><p class="Text_20_body">The display of variables is determined by styles which are specified by the element that defines the variable.</p><h3 class="Heading_20_3"><a id="a7_4_2_text_variable-decls_"><span style="margin-right:0.127cm;">7.4.2</span></a><a id="__RefHeading__1415328_253892949"/><a id="element-text_variable-decls"/>&lt;text:variable-decls&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:variable-decls&gt;</span> element is a container for <span class="Element">&lt;text:variable-decl&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:variable-decls&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:variable-decls&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:variable-decls&gt;</span> element has the following child element: <span class="Element">&lt;text:variable-decl&gt;</span> <a href="#element-text_variable-decl">7.4.3</a>.</p><h3 class="Heading_20_3"><a id="a7_4_3_text_variable-decl_"><span style="margin-right:0.127cm;">7.4.3</span></a><a id="__RefHeading__1415330_253892949"/><a id="element-text_variable-decl"/>&lt;text:variable-decl&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:variable-decl&gt;</span> element is used to declare simple variables. This element specifies the name and the value type of a variable.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:variable-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:variable-decl&gt;</span> element has the following attributes: <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_variable-decl">19.835.25</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:variable-decl&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a7_4_4_text_variable-set_"><span style="margin-right:0.127cm;">7.4.4</span></a><a id="__RefHeading__1415332_253892949"/><a id="element-text_variable-set"/>&lt;text:variable-set&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:variable-set&gt;</span> element represents a simple variable. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:variable-set&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:variable-set&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_variable-set">19.469.22</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_variable-set">19.796.12</a>, <span class="Attribute">text:formula</span> <a href="#attribute-text_formula">19.805</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_variable-set">19.835.24</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:variable-set&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:variable-set&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_5_text_variable-get_"><span style="margin-right:0.127cm;">7.4.5</span></a><a id="__RefHeading__1415334_253892949"/><a id="element-text_variable-get"/>&lt;text:variable-get&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:variable-get&gt;</span> element sets the display of the value of a simple variable. The value of this element is the value of the last preceding <span class="Element">&lt;text:variable-set&gt;</span> element with an identical value for its <span class="Attribute">text:name</span> attribute.</p><p class="Text_20_body">If there is no preceding <span class="Element">&lt;text:variable-set&gt;</span> element with an identical value for its <span class="Attribute">text:name</span> attribute the value of a <span class="Element">&lt;text:variable-get&gt;</span> field is undefined. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:variable-get&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:variable-get&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_variable-get">19.469.20</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_variable-get">19.796.10</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_variable-get">19.835.26</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:variable-get&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:variable-get&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_6_text_variable-input_"><span style="margin-right:0.127cm;">7.4.6</span></a><a id="__RefHeading__1415336_253892949"/><a id="element-text_variable-input"/>&lt;text:variable-input&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:variable-input&gt;</span> element represents user supplied variable values. This element can be empty if its <span class="Attribute">text:display</span> attribute is set to <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:variable-input&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:variable-input&gt;</span> element has the following attributes: <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_variable-input">19.469.21</a>, <span class="Attribute">text:description</span> <a href="#attribute-text_description">19.795</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_variable-input">19.796.11</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_variable-input">19.835.27</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:variable-input&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:variable-input&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_7_text_user-field-decls_"><span style="margin-right:0.127cm;">7.4.7</span></a><a id="__RefHeading__1415338_253892949"/><a id="element-text_user-field-decls"/>&lt;text:user-field-decls&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-field-decls&gt;</span> element is a container for <span class="Element">&lt;text:user-field-decl&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-field-decls&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-field-decls&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-field-decls&gt;</span> element has the following child element: <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a>.</p><h3 class="Heading_20_3"><a id="a7_4_8_text_user-field-decl_"><span style="margin-right:0.127cm;">7.4.8</span></a><a id="__RefHeading__1415340_253892949"/><a id="element-text_user-field-decl"/>&lt;text:user-field-decl&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-field-decl&gt;</span> element is used to specify user variable values that are displayed using the <span class="Element">&lt;text:user-field-get&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-field-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-field-decl&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">text:formula</span> <a href="#attribute-text_formula">19.805</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_user-field-decl">19.835.20</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-field-decl&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a7_4_9_text_user-field-get_"><span style="margin-right:0.127cm;">7.4.9</span></a><a id="__RefHeading__1415342_253892949"/><a id="element-text_user-field-get"/>&lt;text:user-field-get&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-field-get&gt;</span> element displays the content of a user variable. The value of this element is the value of a <span class="Element">&lt;text:user-field-decl&gt;</span> element with a <span class="Attribute">text:name</span> attribute value that matches the <span class="Attribute">text:name</span> attribute of this element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-field-get&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-field-get&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_user-field-get">19.469.18</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_user-field-get">19.796.9</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_user-field-get">19.835.21</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:user-field-get&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-field-get&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_10_text_user-field-input_"><span style="margin-right:0.127cm;">7.4.10</span></a><a id="__RefHeading__1415344_253892949"/><a id="element-text_user-field-input"/>&lt;text:user-field-input&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-field-input&gt;</span> element is an alternative method of displaying user variables. The value of this element is the value of a <span class="Element">&lt;text:user-field-decl&gt;</span> element with a <span class="Attribute">text:name</span> attribute value that matches the <span class="Attribute">text:name</span> attribute of this element.</p><p class="Text_20_body">This element can be empty if the <span class="Attribute">text:display</span> attribute is set to <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-field-input&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-field-input&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_user-field-input">19.469.19</a>, <span class="Attribute">text:description</span> <a href="#attribute-text_description">19.795</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_user-field-input">19.835.22</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:user-field-input&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-field-input&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_11_text_sequence-decls_"><span style="margin-right:0.127cm;">7.4.11</span></a><a id="__RefHeading__1415346_253892949"/><a id="element-text_sequence-decls"/>&lt;text:sequence-decls&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:sequence-decls&gt;</span> element is a container for <span class="Element">&lt;text:sequence-decl&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sequence-decls&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sequence-decls&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sequence-decls&gt;</span> element has the following child element: <span class="Element">&lt;text:sequence-decl&gt;</span> <a href="#element-text_sequence-decl">7.4.12</a>.</p><h3 class="Heading_20_3"><a id="a7_4_12_text_sequence-decl_"><span style="margin-right:0.127cm;">7.4.12</span></a><a id="__RefHeading__1415348_253892949"/><a id="element-text_sequence-decl"/>&lt;text:sequence-decl&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:sequence-decl&gt;</span> element is used to declare sequence variables used to number items within an OpenDocument text document. </p><p class="Note"><span class="Note_20_Label">Note: </span>Sequence variables are commonly used for sequential numbering. However, expression formulas can be included in sequence fields to support more advanced sequences.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sequence-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sequence-decl&gt;</span> element has the following attributes: <span class="Attribute">text:display-outline-level</span> <a href="#attribute-text_display-outline-level">19.798</a>, <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_sequence-decl">19.835.16</a> and <span class="Attribute">text:separation-character</span> <a href="#attribute-text_separation-character">19.864</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sequence-decl&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a7_4_13_text_sequence_"><span style="margin-right:0.127cm;">7.4.13</span></a><a id="__RefHeading__1415350_253892949"/><a id="element-text_sequence"/>&lt;text:sequence&gt;</h3><p class="Text_20_body">A <span class="Element">&lt;text:sequence&gt;</span> element specifies a sequence field.</p><p class="Text_20_body">A sequence field changes the value of a sequence variable by a specified formula and displays the changed value of the sequence variable in a specified format. </p><p class="Note"><span class="Note_20_Label">Note:</span> Sequence variables and fields are used to number repeating document elements such as pages, tables or images. In such cases, the formula could be: "sequenceVariableName + 1." A sequence variable can be set to a specific value or not changed at all.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sequence&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sequence&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">text:formula</span> <a href="#attribute-text_formula">19.805</a>, <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_sequence">19.835.15</a> and <span class="Attribute">text:ref-name</span> <a href="#attribute-text_ref-name_element-text_sequence">19.853.5</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sequence&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sequence&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_14_text_expression_"><span style="margin-right:0.127cm;">7.4.14</span></a><a id="__RefHeading__1415352_253892949"/><a id="element-text_expression"/>&lt;text:expression&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:expression&gt;</span> element represents expressions that are evaluated and the resulting value displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:expression&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:expression&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_expression">19.469.9</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_expression">19.796.3</a> and <span class="Attribute">text:formula</span> <a href="#attribute-text_formula">19.805</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:expression&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:expression&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_4_15_text_text-input_"><span style="margin-right:0.127cm;">7.4.15</span></a><a id="__RefHeading__1415354_253892949"/><a id="element-text_text-input"/>&lt;text:text-input&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:text-input&gt;</span> element is a text input field. A text input field is used in a user interface to prompt a user to input text. This text is stored and displayed as the content of this element until it is replaced by a user.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:text-input&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:text-input&gt;</span> element has the following attribute: <span class="Attribute">text:description</span> <a href="#attribute-text_description">19.795</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:text-input&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:text-input&gt;</span> element has character data content.</p><h2 class="Heading_20_2"><a id="a7_5Metadata_Fields"><span style="margin-right:0.127cm;">7.5</span></a><a id="__RefHeading__1415356_253892949"/>Metadata Fields</h2><h3 class="Heading_20_3"><a id="a7_5_1General"><span style="margin-right:0.127cm;">7.5.1</span></a><a id="__RefHeading__1415358_253892949"/>General</h3><p class="Text_20_body">Metadata field elements display meta information about a document.</p><p class="Text_20_body">All metadata field elements can be marked as fixed using the <span class="Attribute">text:fixed</span> attribute. <a href="#attribute-text_fixed">19.803</a></p><h3 class="Heading_20_3"><a id="a7_5_2_text_initial-creator_"><span style="margin-right:0.127cm;">7.5.2</span></a><a id="__RefHeading__1415360_253892949"/><a id="element-text_initial-creator"/>&lt;text:initial-creator&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:initial-creator&gt;</span> element displays the value contained by the <span class="Element">&lt;meta:initial-creator&gt;</span> element of a document. <a href="#element-meta_initial-creator">4.3.2.6</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:initial-creator&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:initial-creator&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:initial-creator&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:initial-creator&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_3_text_creation-date_"><span style="margin-right:0.127cm;">7.5.3</span></a><a id="__RefHeading__1415362_253892949"/><a id="element-text_creation-date"/>&lt;text:creation-date&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:creation-date&gt;</span> element displays the value contained by the <span class="Element">&lt;meta:creation-date&gt;</span> element of a document. <a href="#element-meta_creation-date">4.3.2.9</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:creation-date&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:creation-date&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_creation-date">19.469.4</a>, <span class="Attribute">text:date-value</span> <a href="#attribute-text_date-value">19.793</a> and <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:creation-date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:creation-date&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_4_text_creation-time_"><span style="margin-right:0.127cm;">7.5.4</span></a><a id="__RefHeading__1415364_253892949"/><a id="element-text_creation-time"/>&lt;text:creation-time&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:creation-time&gt;</span> element represents the time at which a document was created.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:creation-time&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:creation-time&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_creation-time">19.469.5</a>, <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a> and <span class="Attribute">text:time-value</span> <a href="#attribute-text_time-value">19.881</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:creation-time&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:creation-time&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_5_text_description_"><span style="margin-right:0.127cm;">7.5.5</span></a><a id="__RefHeading__1415366_253892949"/><a id="element-text_description"/>&lt;text:description&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:description&gt;</span> element displays the content contained by the <span class="Element">&lt;dc:description&gt;</span> element of a document. <a href="#element-dc_description">4.3.2.3</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:description&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:description&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:description&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:description&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_6_text_user-defined_"><span style="margin-right:0.127cm;">7.5.6</span></a><a id="__RefHeading__1415368_253892949"/><a id="element-text_user-defined"/>&lt;text:user-defined&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-defined&gt;</span> element displays the value contained by a <span class="Element">&lt;meta:user-defined&gt;</span> element of a document. <a href="#element-meta_user-defined">4.3.3</a></p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The link between a <span class="Element">&lt;text:user-defined&gt;</span> element and a <span class="Element">&lt;meta:user-defined&gt;</span> element is established by the <span class="Attribute">text:name</span> and <span class="Attribute">meta:name</span> attributes, respectively, containing the same value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-defined&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-defined&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_user-defined">19.469.17</a>, <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a> and <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_user-defined">19.835.19</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:user-defined&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-defined&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_7_text_print-time_"><span style="margin-right:0.127cm;">7.5.7</span></a><a id="__RefHeading__1415370_253892949"/><a id="element-text_print-time"/>&lt;text:print-time&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:print-time&gt;</span> element represents the time at which a document was last printed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:print-time&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:print-time&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_print-time">19.469.14</a>, <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a> and <span class="Attribute">text:time-value</span> <a href="#attribute-text_time-value">19.881</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:print-time&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:print-time&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_8_text_print-date_"><span style="margin-right:0.127cm;">7.5.8</span></a><a id="__RefHeading__1415372_253892949"/><a id="element-text_print-date"/>&lt;text:print-date&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:print-date&gt;</span> element displays the value contained by the <span class="Element">&lt;meta:print-date&gt;</span> element of a document. <a href="#element-meta_print-date">4.3.2.11</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:print-date&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:print-date&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_print-date">19.469.13</a>, <span class="Attribute">text:date-value</span> <a href="#attribute-text_date-value">19.793</a> and <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:print-date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:print-date&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_9_text_printed-by_"><span style="margin-right:0.127cm;">7.5.9</span></a><a id="__RefHeading__1415374_253892949"/><a id="element-text_printed-by"/>&lt;text:printed-by&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:printed-by&gt;</span> element displays the value contained by the <span class="Element">&lt;meta:printed-by&gt;</span> element of a document. <a href="#element-meta_printed-by">4.3.2.8</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:printed-by&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:printed-by&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:printed-by&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:printed-by&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_10_text_title_"><span style="margin-right:0.127cm;">7.5.10</span></a><a id="__RefHeading__1415376_253892949"/><a id="element-text_title"/>&lt;text:title&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:title&gt;</span> element displays the value contained by the <span class="Element">&lt;dc:title&gt;</span> element of a document. <a href="#element-dc_title">4.3.2.2</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:title&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:title&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:title&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:title&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_11_text_subject_"><span style="margin-right:0.127cm;">7.5.11</span></a><a id="__RefHeading__1415378_253892949"/><a id="element-text_subject"/>&lt;text:subject&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:subject&gt;</span> element displays the values contained by the <span class="Element">&lt;dc:subject&gt;</span> element of a document. <a href="#element-dc_subject">4.3.2.4</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:subject&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:subject&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:subject&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:subject&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_12_text_keywords_"><span style="margin-right:0.127cm;">7.5.12</span></a><a id="__RefHeading__1415380_253892949"/><a id="element-text_keywords"/>&lt;text:keywords&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:keywords&gt;</span> element displays a list of keywords contained in the <span class="Element">&lt;meta:keyword&gt;</span> elements of a document. </p><p class="Text_20_body">The format of a list of keywords is implementation-dependent. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:keywords&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:keywords&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:keywords&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:keywords&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_13_text_editing-cycles_"><span style="margin-right:0.127cm;">7.5.13</span></a><a id="__RefHeading__1415382_253892949"/><a id="element-text_editing-cycles"/>&lt;text:editing-cycles&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:editing-cycles&gt;</span> element displays the value contained by the <span class="Element">&lt;meta:editing-cycles&gt;</span> element of a document. <a href="#element-meta_editing-cycles">4.3.2.16</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:editing-cycles&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:editing-cycles&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:editing-cycles&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:editing-cycles&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_14_text_editing-duration_"><span style="margin-right:0.127cm;">7.5.14</span></a><a id="__RefHeading__1415384_253892949"/><a id="element-text_editing-duration"/>&lt;text:editing-duration&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:editing-duration&gt;</span> element displays the value contained by the <span class="Element">&lt;meta:editing-duration&gt;</span> element of a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:editing-duration&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:editing-duration&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_editing-duration">19.469.8</a>, <span class="Attribute">text:duration</span> <a href="#attribute-text_duration">19.799</a> and <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:editing-duration&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:editing-duration&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_15_text_modification-time_"><span style="margin-right:0.127cm;">7.5.15</span></a><a id="__RefHeading__1415386_253892949"/><a id="element-text_modification-time"/>&lt;text:modification-time&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:modification-time&gt;</span> element represents the time at which a document was last modified.</p><p class="Text_20_body">This element displays the time information portion of the value of the <span class="Element">&lt;dc:date&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:modification-time&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:modification-time&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_modification-time">19.469.12</a>, <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a> and <span class="Attribute">text:time-value</span> <a href="#attribute-text_time-value">19.881</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:modification-time&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:modification-time&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_16_text_modification-date_"><span style="margin-right:0.127cm;">7.5.16</span></a><a id="__RefHeading__1415388_253892949"/><a id="element-text_modification-date"/>&lt;text:modification-date&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:modification-date&gt;</span> element displays the value contained by the <span class="Element">&lt;dc:date&gt;</span> element of a document. <a href="#element-dc_date">4.3.2.10</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:modification-date&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:modification-date&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_modification-date">19.469.11</a>, <span class="Attribute">text:date-value</span> <a href="#attribute-text_date-value">19.793</a> and <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:modification-date&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:modification-date&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_17_text_creator_"><span style="margin-right:0.127cm;">7.5.17</span></a><a id="__RefHeading__1415390_253892949"/><a id="element-text_creator"/>&lt;text:creator&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:creator&gt;</span> element displays the value contained by the <span class="Element">&lt;dc:creator&gt;</span> element of a document. <a href="#element-dc_creator">4.3.2.7</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:creator&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:creator&gt;</span> element has the following attribute: <span class="Attribute">text:fixed</span> <a href="#attribute-text_fixed">19.803</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:creator&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:creator&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_18Document_Statistics_Fields"><span style="margin-right:0.127cm;">7.5.18</span></a><a id="__RefHeading__1415392_253892949"/><a id="Document_Statistics_Fields"/>Document Statistics Fields</h3><h4 class="Heading_20_4"><a id="a7_5_18_1General"><span style="margin-right:0.127cm;">7.5.18.1</span></a><a id="__RefHeading__1415394_253892949"/>General</h4><p class="Text_20_body">The contents of <span class="Element">&lt;text:word-count&gt;</span> and <span class="Element">&lt;text:character-count&gt;</span> elements are locale specific and are not defined by OpenDocument. </p><h4 class="Heading_20_4"><a id="a7_5_18_2_text_page-count_"><span style="margin-right:0.127cm;">7.5.18.2</span></a><a id="__RefHeading__1415396_253892949"/><a id="element-text_page-count"/>&lt;text:page-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:page-count&gt;</span> element displays the value of the <span class="Attribute">meta:page-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_page-count">19.332</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:page-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page-count&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_5_18_3_text_paragraph-count_"><span style="margin-right:0.127cm;">7.5.18.3</span></a><a id="__RefHeading__1415398_253892949"/><a id="element-text_paragraph-count"/>&lt;text:paragraph-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:paragraph-count&gt;</span> element displays the value of the <span class="Attribute">meta:paragraph-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_paragraph-count">19.333</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:paragraph-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:paragraph-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:paragraph-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:paragraph-count&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_5_18_4_text_word-count_"><span style="margin-right:0.127cm;">7.5.18.4</span></a><a id="__RefHeading__1415400_253892949"/><a id="element-text_word-count"/>&lt;text:word-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:word-count&gt;</span> element displays the value of the <span class="Attribute">meta:word-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_word-count">19.339</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:word-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:word-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:word-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:word-count&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_5_18_5_text_character-count_"><span style="margin-right:0.127cm;">7.5.18.5</span></a><a id="__RefHeading__1415402_253892949"/><a id="element-text_character-count"/>&lt;text:character-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:character-count&gt;</span> element displays the value of the <span class="Attribute">meta:character-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_character-count">19.322</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:character-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:character-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:character-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:character-count&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_5_18_6_text_table-count_"><span style="margin-right:0.127cm;">7.5.18.6</span></a><a id="__RefHeading__1415404_253892949"/><a id="element-text_table-count"/>&lt;text:table-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:table-count&gt;</span> element displays the value of the <span class="Attribute">meta:table-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_table-count">19.337</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:table-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-count&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_5_18_7_text_image-count_"><span style="margin-right:0.127cm;">7.5.18.7</span></a><a id="__RefHeading__1415406_253892949"/><a id="element-text_image-count"/>&lt;text:image-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:image-count&gt;</span> element displays the value of the <span class="Attribute">meta:image-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_image-count">19.327</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:image-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:image-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:image-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:image-count&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_5_18_8_text_object-count_"><span style="margin-right:0.127cm;">7.5.18.8</span></a><a id="__RefHeading__1415408_253892949"/><a id="element-text_object-count"/>&lt;text:object-count&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:object-count&gt;</span> element displays the value of the <span class="Attribute">meta:object-count</span> attribute of the <span class="Element">&lt;meta:document-statistic&gt;</span> element of a document. <a href="#attribute-meta_object-count">19.330</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:object-count&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:object-count&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:object-count&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:object-count&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_5_19_text_meta-field_"><span style="margin-right:0.127cm;">7.5.19</span></a><a id="__RefHeading__1415410_253892949"/><a id="element-text_meta-field"/>&lt;text:meta-field&gt;</h3><p class="Text_20_body"> </p><p class="Text_20_body">The <span class="Element">&lt;text:meta-field&gt;</span> element represents content from a metadata source. The mixed content of this element should be generated from the metadata source. The source of the metadata and the means of generation of the mixed content is implementation-dependent. The <span class="Element">&lt;text:meta-field&gt;</span> element may contain any paragraph content. </p><p class="Note"><span class="Note_20_Label">Note</span>: Alterations of the element's mixed content may be lost if the mixed content is subsequently refreshed from a metadata source.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:meta-field&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:meta-field&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_meta-field">19.469.10</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:meta-field&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>, <span class="Element">&lt;presentation:date-time&gt;</span> <a href="#element-presentation_date-time">10.9.3.5</a>, <span class="Element">&lt;presentation:footer&gt;</span> <a href="#element-presentation_footer">10.9.3.3</a>, <span class="Element">&lt;presentation:header&gt;</span> <a href="#element-presentation_header">10.9.3.1</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>, <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>, <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>, <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>, <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>, <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:line-break&gt;</span> <a href="#element-text_line-break">6.1.5</a>, <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>, <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>, <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>, <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>, <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-</span><span class="Element">country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-</span><span class="Element">work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>, <span class="Element">&lt;text:sheet-name&gt;</span> <a href="#element-text_sheet-name">7.3.11</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a>, <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>, <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>, <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>, <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>, <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>, <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:meta-field&gt;</span> element has mixed content.</p><h2 class="Heading_20_2"><a id="a7_6Database_Fields"><span style="margin-right:0.127cm;">7.6</span></a><a id="__RefHeading__1415412_253892949"/>Database Fields</h2><h3 class="Heading_20_3"><a id="a7_6_1General"><span style="margin-right:0.127cm;">7.6.1</span></a><a id="__RefHeading__1415414_253892949"/>General</h3><p class="Text_20_body">Documents can reference databases and display database information as text content. To display database information, the OpenDocument schema uses a group of text fields, collectively called database fields. Consumers may use database tables from SQL servers, therefore database fields can be used to access any SQL database, provided that the appropriate drivers are available.</p><p class="Text_20_body">A database may contain the following components:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Tables, which store data.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Queries, which extract a subset of data from one or more tables.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Forms, which present data. <a href="#element-db_forms">12.25.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Reports, which summarize database content. <a href="#element-db_reports">12.25.3</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Database fields operate on a set of database rows, the so called <span class="Def">current selection</span>, which is either a database table, or the result of a database query. The current selection is determined by the data source information that is contained in database fields. The current selection is retrieved once per document and data source, regardless of the number of database fields that are associated with a data source.</p><p class="Text_20_body">Database fields display data contained in a particular database row within the current selection. The row within the current selection is controlled by database fields and is known as the current row.</p><h3 class="Heading_20_3"><a id="a7_6_2_form_connection-resource_"><span style="margin-right:0.127cm;">7.6.2</span></a><a id="__RefHeading__1415416_253892949"/><a id="element-form_connection-resource"/>&lt;form:connection-resource&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:connection-resource&gt;</span> element specifies a source database.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:connection-resource&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a> and <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:connection-resource&gt;</span> element has the following attribute: <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-form_connection-resource">19.910.20</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:connection-resource&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a7_6_3_text_database-display_"><span style="margin-right:0.127cm;">7.6.3</span></a><a id="__RefHeading__1415418_253892949"/><a id="element-text_database-display"/>&lt;text:database-display&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:database-display&gt;</span> element represents data from the current database row.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:database-display&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:database-display&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_database-display">19.469.6</a>, <span class="Attribute">text:column-name</span> <a href="#attribute-text_column-name">19.771</a>, <span class="Attribute">text:database-name</span> <a href="#attribute-text_database-name">19.791</a>, <span class="Attribute">text:table-name</span> <a href="#attribute-text_table-name">19.878</a> and <span class="Attribute">text:table-type</span> <a href="#attribute-text_table-type">19.879</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:database-display&gt;</span> element has the following child element: <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:database-display&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_6_4_text_database-next_"><span style="margin-right:0.127cm;">7.6.4</span></a><a id="__RefHeading__1415420_253892949"/><a id="element-text_database-next"/>&lt;text:database-next&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:database-next&gt;</span> element selects the database row following the one currently displayed in a <span class="Element">&lt;text:database-display&gt;</span> field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:database-next&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:database-next&gt;</span> element has the following attributes: <span class="Attribute">text:condition</span> <a href="#attribute-text_condition_element-text_database-next">19.777.3</a>, <span class="Attribute">text:database-name</span> <a href="#attribute-text_database-name">19.791</a>, <span class="Attribute">text:table-name</span> <a href="#attribute-text_table-name">19.878</a> and <span class="Attribute">text:table-type</span> <a href="#attribute-text_table-type">19.879</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:database-next&gt;</span> element has the following child element: <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>.</p><h3 class="Heading_20_3"><a id="a7_6_5_text_database-row-select_"><span style="margin-right:0.127cm;">7.6.5</span></a><a id="__RefHeading__1415422_253892949"/><a id="element-text_database-row-select"/>&lt;text:database-row-select&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:database-row-select&gt;</span> element selects a specific row from a current selection.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:database-row-select&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:database-row-select&gt;</span> element has the following attributes: <span class="Attribute">text:condition</span> <a href="#attribute-text_condition_element-text_database-row-select">19.777.4</a>, <span class="Attribute">text:database-name</span> <a href="#attribute-text_database-name">19.791</a>, <span class="Attribute">text:row-number</span> <a href="#attribute-text_row-number">19.859</a>, <span class="Attribute">text:table-name</span> <a href="#attribute-text_table-name">19.878</a> and <span class="Attribute">text:table-type</span> <a href="#attribute-text_table-type">19.879</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:database-row-select&gt;</span> element has the following child element: <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>.</p><h3 class="Heading_20_3"><a id="a7_6_6_text_database-row-number_"><span style="margin-right:0.127cm;">7.6.6</span></a><a id="__RefHeading__1415424_253892949"/><a id="element-text_database-row-number"/>&lt;text:database-row-number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:database-row-number&gt;</span> element displays the current row number for a given table. The element displays the row number from a database and not the row number of a current selection that is used as an attribute value in the <span class="Element">&lt;text:database-row-select&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:database-row-number&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:database-row-number&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">text:database-name</span> <a href="#attribute-text_database-name">19.791</a>, <span class="Attribute">text:table-name</span> <a href="#attribute-text_table-name">19.878</a>, <span class="Attribute">text:table-type</span> <a href="#attribute-text_table-type">19.879</a> and <span class="Attribute">text:value</span> <a href="#attribute-text_value">19.900</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:database-row-number&gt;</span> element has the following child element: <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:database-row-number&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_6_7_text_database-name_"><span style="margin-right:0.127cm;">7.6.7</span></a><a id="__RefHeading__1415426_253892949"/><a id="element-text_database-name"/>&lt;text:database-name&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:database-name&gt;</span> element displays the database and table name of the last used table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:database-name&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:database-name&gt;</span> element has the following attributes: <span class="Attribute">text:database-name</span> <a href="#attribute-text_database-name">19.791</a>, <span class="Attribute">text:table-name</span> <a href="#attribute-text_table-name">19.878</a> and <span class="Attribute">text:table-type</span> <a href="#attribute-text_table-type">19.879</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:database-name&gt;</span> element has the following child element: <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:database-name&gt;</span> element has character data content.</p><h2 class="Heading_20_2"><a id="a7_7More_Fields"><span style="margin-right:0.127cm;">7.7</span></a><a id="__RefHeading__1415428_253892949"/>More Fields</h2><h3 class="Heading_20_3"><a id="a7_7_1Page_Variable_Fields"><span style="margin-right:0.127cm;">7.7.1</span></a><a id="__RefHeading__1415430_253892949"/>Page Variable Fields</h3><h4 class="Heading_20_4"><a id="a7_7_1_1General"><span style="margin-right:0.127cm;">7.7.1.1</span></a><a id="__RefHeading__1415432_253892949"/>General</h4><p class="Text_20_body">Page variables enable an alternative page numbering to be defined for documents. There is only one page variable, and it is set by any set page variable field in the document. The calculation of a page variable is controlled by the <span class="Attribute">text:active</span> attribute</p><h4 class="Heading_20_4"><a id="a7_7_1_2_text_page-variable-set_"><span style="margin-right:0.127cm;">7.7.1.2</span></a><a id="__RefHeading__1415434_253892949"/><a id="element-text_page-variable-set"/>&lt;text:page-variable-set&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:page-variable-set&gt;</span> element is used to set a page variable.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page-variable-set&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page-variable-set&gt;</span> element has the following attributes: <span class="Attribute">text:active</span> <a href="#attribute-text_active">19.750</a> and <span class="Attribute">text:page-adjust</span> <a href="#attribute-text_page-adjust_element-text_page-variable-set">19.845.3</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:page-variable-set&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page-variable-set&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a7_7_1_3_text_page-variable-get_"><span style="margin-right:0.127cm;">7.7.1.3</span></a><a id="__RefHeading__1415436_253892949"/><a id="element-text_page-variable-get"/>&lt;text:page-variable-get&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;text:page-variable-get&gt;</span> element displays the value of a page variable.</p><p class="Text_20_body">If the <span class="Attribute">text:active</span> attribute <a href="#attribute-text_active">19.750</a>, has the value of <span class="Attribute_20_Value">false</span>, the <span class="Element">&lt;text:page-variable-get&gt;</span> element will have no display for that page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:page-variable-get&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:page-variable-get&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a> and <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:page-variable-get&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:page-variable-get&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_2_text_placeholder_"><span style="margin-right:0.127cm;">7.7.2</span></a><a id="__RefHeading__1415438_253892949"/><a id="element-text_placeholder"/>&lt;text:placeholder&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:placeholder&gt;</span> element is a placeholder  for replacement by content of a particular type as specified in the mandatory <span class="Attribute">text:placeholder-type</span> attribute.</p><p class="Text_20_body">OpenDocument Consumers that support the <span class="Element">&lt;text:placeholder&gt;</span> element shall use the <span class="Attribute">text:description</span> attribute value in presenting the placeholder with its text content and in a manner that indicates it is for replacement by content of the specified type.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:placeholder&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:placeholder&gt;</span> element has the following attributes: <span class="Attribute">text:description</span> <a href="#attribute-text_description">19.795</a> and <span class="Attribute">text:placeholder-type</span> <a href="#attribute-text_placeholder-type">19.847</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:placeholder&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:placeholder&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_3_text_conditional-text_"><span style="margin-right:0.127cm;">7.7.3</span></a><a id="__RefHeading__1415440_253892949"/><a id="element-text_conditional-text"/>&lt;text:conditional-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:conditional-text&gt;</span> element specifies a condition for display of one text string or another. If the condition is <span class="Attribute_20_Value">true</span>, one of the text strings is displayed. If the condition is <span class="Attribute_20_Value">false</span>, the other text string is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:conditional-text&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:conditional-text&gt;</span> element has the following attributes: <span class="Attribute">text:condition</span> <a href="#attribute-text_condition_element-text_conditional-text">19.777.2</a>, <span class="Attribute">text:current-value</span> <a href="#attribute-text_current-value">19.785</a>, <span class="Attribute">text:string-value-if-false</span> <a href="#attribute-text_string-value-if-false">19.872</a> and <span class="Attribute">text:string-value-if-true</span> <a href="#attribute-text_string-value-if-true">19.873</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:conditional-text&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:conditional-text&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_4_text_hidden-text_"><span style="margin-right:0.127cm;">7.7.4</span></a><a id="__RefHeading__1415442_253892949"/><a id="element-text_hidden-text"/>&lt;text:hidden-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:hidden-text&gt;</span> element hides the text it contains when a specified condition is true. If its <span class="Attribute">text:condition</span> attribute is missing or evaluates to false, the text content is displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:hidden-text&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:hidden-text&gt;</span> element has the following attributes: <span class="Attribute">text:condition</span> <a href="#attribute-text_condition_element-text_hidden-text">19.777.6</a>, <span class="Attribute">text:is-hidden</span> <a href="#attribute-text_is-hidden">19.815</a> and <span class="Attribute">text:string-value</span> <a href="#attribute-text_string-value_element-text_hidden-text">19.871.3</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:hidden-text&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:hidden-text&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_5_text_reference-ref_"><span style="margin-right:0.127cm;">7.7.5</span></a><a id="__RefHeading__1415444_253892949"/><a id="element-text_reference-ref"/><a id="Reference_Fields"/>&lt;text:reference-ref&gt; </h3><p class="Text_20_body">The <span class="Element">&lt;text:reference-ref&gt;</span> element represents a field that references a <span class="Element">&lt;text:reference-mark-start&gt;</span> or <span class="Element">&lt;text:reference-mark&gt;</span> element. Its <span class="Attribute">text:reference-format</span> attribute specifies what is displayed from the referenced element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:reference-ref&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:reference-ref&gt;</span> element has the following attributes: <span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> and <span class="Attribute">text:ref-name</span> <a href="#attribute-text_ref-name_element-text_reference-ref">19.853.4</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:reference-ref&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:reference-ref&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_6_text_bookmark-ref_"><span style="margin-right:0.127cm;">7.7.6</span></a><a id="__RefHeading__1415446_253892949"/><a id="element-text_bookmark-ref"/>&lt;text:bookmark-ref&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:bookmark-ref&gt;</span> element represents a field that references a <span class="Element">&lt;text:bookmark-start&gt;</span> or <span class="Element">&lt;text:bookmark&gt;</span> element. Its <span class="Attribute">text:reference-format</span> attribute specifies what is displayed from the referenced element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bookmark-ref&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bookmark-ref&gt;</span> element has the following attributes: <span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> and <span class="Attribute">text:ref-name</span> <a href="#attribute-text_ref-name_element-text_bookmark-ref">19.853.2</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:bookmark-ref&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bookmark-ref&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_7_text_note-ref_"><span style="margin-right:0.127cm;">7.7.7</span></a><a id="__RefHeading__1415448_253892949"/><a id="element-text_note-ref"/>&lt;text:note-ref&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:note-ref&gt;</span> element represents a field that references a <span class="Element">&lt;text:note&gt;</span> element. Its <span class="Attribute">text:reference-format</span> attribute specifies what is displayed from the referenced element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:note-ref&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:note-ref&gt;</span> element has the following attributes: <span class="Attribute">text:note-class</span> <a href="#attribute-text_note-class">19.837</a>, <span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> and <span class="Attribute">text:ref-name</span> <a href="#attribute-text_ref-name_element-text_note-ref">19.853.3</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:note-ref&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:note-ref&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_8_text_sequence-ref_"><span style="margin-right:0.127cm;">7.7.8</span></a><a id="__RefHeading__1415450_253892949"/><a id="element-text_sequence-ref"/>&lt;text:sequence-ref&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:sequence-ref&gt;</span> element represents a field that references a <span class="Element">&lt;text:sequence&gt;</span> element. Its <span class="Attribute">text:reference-format</span> attribute specifies what is displayed from the referenced element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sequence-ref&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sequence-ref&gt;</span> element has the following attributes: <span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> and <span class="Attribute">text:ref-name</span> <a href="#attribute-text_ref-name_element-text_sequence-ref">19.853.6</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:sequence-ref&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sequence-ref&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_9_text_script_"><span style="margin-right:0.127cm;">7.7.9</span></a><a id="__RefHeading__1415452_253892949"/><a id="element-text_script"/>&lt;text:script&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:script&gt;</span> element represents a field that stores scripts or sections of scripts.</p><p class="Note"><span class="Note_20_Label">Note:</span> The primary purpose of this field is to provide an equivalent to the <span class="Source_20_Text">&lt;script&gt;</span> element in <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>, so that the content of a <span class="Source_20_Text">&lt;script&gt;</span> element in HTML can be imported, edited, and exported using office application software.</p><p class="Text_20_body">The source code for the script can be stored in one of the following ways:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The <span class="Element">&lt;text:script&gt;</span> element contains the source code.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The source code is stored in an external file. The <span class="Attribute">xlink:href</span> attribute specifies the location of the source file.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The element shall have either an <span class="Attribute">xlink:href</span> attribute or content, but not both.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:script&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:script&gt;</span> element has the following attributes: <span class="Attribute">script:language</span> <a href="#attribute-script_language">19.430</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-text_script">19.910.36</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:script&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:script&gt;</span> element has character data content. Character data content is only permitted if a <span class="Attribute">xlink:href</span> attribute is not present.</p><h3 class="Heading_20_3"><a id="a7_7_10_text_execute-macro_"><span style="margin-right:0.127cm;">7.7.10</span></a><a id="__RefHeading__1415454_253892949"/><a id="element-text_execute-macro"/>&lt;text:execute-macro&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:execute-macro&gt;</span> element represents a field that contains the name of a macro that is executed when the field is activated. The element may contain a text description of the macro. The name of the macro to be executed is specified by the <span class="Attribute">text:name</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:execute-macro&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:execute-macro&gt;</span> element has the following attribute: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_execute-macro">19.835.7</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:execute-macro&gt;</span> element has the following child element: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:execute-macro&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_11_text_hidden-paragraph_"><span style="margin-right:0.127cm;">7.7.11</span></a><a id="__RefHeading__1415456_253892949"/><a id="element-text_hidden-paragraph"/>&lt;text:hidden-paragraph&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:hidden-paragraph&gt;</span> element is a field that represents a condition. If the condition evaluates to <span class="Datatype">false</span>, the paragraph where this element appears is displayed unless the paragraph is enclosed in any other hiding element. If the condition evaluates to <span class="Datatype">true</span>, the paragraph is hidden unless the paragraph contains another <span class="Element">&lt;text:hidden-paragraph&gt;</span> element whose condition evaluates to <span class="Datatype">false</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:hidden-paragraph&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:hidden-paragraph&gt;</span> element has the following attributes: <span class="Attribute">text:condition</span> <a href="#attribute-text_condition_element-text_hidden-paragraph">19.777.5</a> and <span class="Attribute">text:is-hidden</span> <a href="#attribute-text_is-hidden">19.815</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:hidden-paragraph&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:hidden-paragraph&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_12_text_dde-connection_"><span style="margin-right:0.127cm;">7.7.12</span></a><a id="__RefHeading__1415458_253892949"/><a id="element-text_dde-connection"/>&lt;text:dde-connection&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:dde-connection&gt;</span> element represents a field that is information from a DDE connection. The content of this field is the last data that was received from a DDE connection. This is used as the content of this field if the DDE connection cannot be accessed.</p><p class="Text_20_body">See <a href="#DDE_Connections">14.6</a> for the use of DDE connections.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:dde-connection&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:dde-connection&gt;</span> element has the following attribute: <span class="Attribute">text:connection-name</span> <a href="#attribute-text_connection-name">19.778</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:dde-connection&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:dde-connection&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_13_text_measure_"><span style="margin-right:0.127cm;">7.7.13</span></a><a id="__RefHeading__1415460_253892949"/><a id="element-text_measure"/>&lt;text:measure&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:measure&gt;</span> element represents a field that displays measure text. It can only be used within text that is contained in measure drawing objects.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:measure&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:measure&gt;</span> element has the following attribute: <span class="Attribute">text:kind</span> <a href="#attribute-text_kind">19.825</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:measure&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:measure&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a7_7_14_text_table-formula___deprecated_"><span style="margin-right:0.127cm;">7.7.14</span></a><a id="__RefHeading__1415462_253892949"/><a id="element-text_table-formula"/>&lt;text:table-formula&gt; (deprecated)</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-formula&gt;</span> element field is deprecated. It stores a formula to be used in tables.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-formula&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-formula&gt;</span> element has the following attributes: <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-text_table-formula">19.469.15</a>, <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_table-formula">19.796.7</a> and <span class="Attribute">text:formula</span> <a href="#attribute-text_formula">19.805</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:table-formula&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-formula&gt;</span> element has character data content.</p><h1 class="Heading_20_1"><a id="a8Text_Indexes"><span style="margin-right:0.127cm;">8</span></a><a id="__RefHeading__1415464_253892949"/><a id="Text_Indices"/>Text Indexes</h1><h2 class="Heading_20_2"><a id="a8_1Index_Marks"><span style="margin-right:0.127cm;">8.1</span></a><a id="__RefHeading__1415466_253892949"/>Index Marks</h2><h3 class="Heading_20_3"><a id="a8_1_1General"><span style="margin-right:0.127cm;">8.1.1</span></a><a id="__RefHeading__1415468_253892949"/>General</h3><p class="Text_20_body">OpenDocument text documents may contain automatically generated indexes. An index contains a sorted list of items of a specified type, where the sorting and the type of items are determined by the type of index.</p><p class="Text_20_body">There are three types of index marks that correspond to the three types of index that make use of index marks. The three types of index marks are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Table of contents index marks<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>User-defined index marks<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Alphabetical index marks<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The rules for index marks are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Index marks are represented by start and end elements or by non-enclosing index point elements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Start and end index elements use the <span class="Attribute">text:id</span> attribute to match start and end elements for an index mark.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Start and end index elements shall be contained in the same paragraph, with the start element occurring first in document order.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The attributes associated with an index mark are attached to the start element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The text between the start and end index elements is the text of the index entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Index marks can overlap.<span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a8_1_2_text_toc-mark-start_"><span style="margin-right:0.127cm;">8.1.2</span></a><a id="__RefHeading__1415470_253892949"/><a id="element-text_toc-mark-start"/>&lt;text:toc-mark-start&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:toc-mark-start&gt;</span> element marks the start of a table of contents index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:toc-mark-start&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:toc-mark-start&gt;</span> element has the following attributes: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_toc-mark-start">19.809.10</a> and <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_toc-mark-start">19.844.11</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:toc-mark-start&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_3_text_toc-mark-end_"><span style="margin-right:0.127cm;">8.1.3</span></a><a id="__RefHeading__1415472_253892949"/><a id="element-text_toc-mark-end"/>&lt;text:toc-mark-end&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:toc-mark-end&gt;</span> element marks the end of a table of contents index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:toc-mark-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:toc-mark-end&gt;</span> element has the following attribute: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_toc-mark-end">19.809.9</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:toc-mark-end&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_4_text_toc-mark_"><span style="margin-right:0.127cm;">8.1.4</span></a><a id="__RefHeading__1415474_253892949"/><a id="element-text_toc-mark"/>&lt;text:toc-mark&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:toc-mark&gt;</span> element represents a table of content index mark that does not enclose content. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:toc-mark&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:toc-mark&gt;</span> element has the following attributes: <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_toc-mark">19.844.10</a> and <span class="Attribute">text:string-value</span> <a href="#attribute-text_string-value_element-text_toc-mark">19.871.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:toc-mark&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_5_text_user-index-mark-start_"><span style="margin-right:0.127cm;">8.1.5</span></a><a id="__RefHeading__1415476_253892949"/><a id="element-text_user-index-mark-start"/>&lt;text:user-index-mark-start&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index-mark-start&gt;</span> element marks the start of a user-defined index entry. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-index-mark-start&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-index-mark-start&gt;</span> element has the following attributes: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_user-index-mark-start">19.809.12</a>, <span class="Attribute">text:index-name</span> <a href="#attribute-text_index-name">19.811</a> and <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_user-index-mark-start">19.844.13</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-index-mark-start&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_6_text_user-index-mark-end_"><span style="margin-right:0.127cm;">8.1.6</span></a><a id="__RefHeading__1415478_253892949"/><a id="element-text_user-index-mark-end"/>&lt;text:user-index-mark-end&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index-mark-end&gt;</span> element marks the end of the user-defined index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-index-mark-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-index-mark-end&gt;</span> element has the following attribute: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_user-index-mark-end">19.809.11</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-index-mark-end&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_7_text_user-index-mark_"><span style="margin-right:0.127cm;">8.1.7</span></a><a id="__RefHeading__1415480_253892949"/><a id="element-text_user-index-mark"/>&lt;text:user-index-mark&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index-mark&gt;</span> element represents a user defined index mark that does not enclose content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-index-mark&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-index-mark&gt;</span> element has the following attributes: <span class="Attribute">text:index-name</span> <a href="#attribute-text_index-name">19.811</a>, <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_user-index-mark">19.844.7</a> and <span class="Attribute">text:string-value</span> <a href="#attribute-text_string-value_element-text_user-index-mark">19.871.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-index-mark&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_8_text_alphabetical-index-mark-start_"><span style="margin-right:0.127cm;">8.1.8</span></a><a id="__RefHeading__1415482_253892949"/><a id="element-text_alphabetical-index-mark-start"/>&lt;text:alphabetical-index-mark-start&gt;</h3><p class="Text_20_body">The <a id="__DdeLink__648046_1871070752"/><span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> element marks the start of an alphabetical index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> element has the following attributes: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_alphabetical-index-mark-start">19.809.4</a>, <span class="Attribute">text:key1</span> <a href="#attribute-text_key1">19.821</a>, <span class="Attribute">text:key1-phonetic</span> <a href="#attribute-text_key1-phonetic">19.823</a>, <span class="Attribute">text:key2</span> <a href="#attribute-text_key2">19.822</a>, <span class="Attribute">text:key2-phonetic</span> <a href="#attribute-text_key2-phonetic">19.824</a>, <span class="Attribute">text:main-entry</span> <a href="#attribute-text_main-entry">19.831</a> and <span class="Attribute">text:string-value-phonetic</span> <a href="#attribute-text_string-value-phonetic">19.870</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_9_text_alphabetical-index-mark-end_"><span style="margin-right:0.127cm;">8.1.9</span></a><a id="__RefHeading__1415484_253892949"/><a id="element-text_alphabetical-index-mark-end"/>&lt;text:alphabetical-index-mark-end&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> element marks the end of an alphabetical index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> element has the following attribute: <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-text_alphabetical-index-mark-end">19.809.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_10_text_alphabetical-index-mark_"><span style="margin-right:0.127cm;">8.1.10</span></a><a id="__RefHeading__1415486_253892949"/><a id="element-text_alphabetical-index-mark"/>&lt;text:alphabetical-index-mark&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index-mark&gt;</span> element represents a user defined index mark that does not enclose content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> element has the following attributes: <span class="Attribute">text:key1</span> <a href="#attribute-text_key1">19.821</a>, <span class="Attribute">text:key1-phonetic</span> <a href="#attribute-text_key1-phonetic">19.823</a>, <span class="Attribute">text:key2</span> <a href="#attribute-text_key2">19.822</a>, <span class="Attribute">text:key2-phonetic</span> <a href="#attribute-text_key2-phonetic">19.824</a>, <span class="Attribute">text:main-entry</span> <a href="#attribute-text_main-entry">19.831</a>, <span class="Attribute">text:string-value</span> <a href="#attribute-text_string-value_element-text_alphabetical-index-mark">19.871.2</a> and <span class="Attribute">text:string-value-phonetic</span> <a href="#attribute-text_string-value-phonetic">19.870</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_1_11_text_bibliography-mark_"><span style="margin-right:0.127cm;">8.1.11</span></a><a id="__RefHeading__1415488_253892949"/><a id="element-text_bibliography-mark"/>&lt;text:bibliography-mark&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:bibliography-mark&gt;</span> element contains the text and information for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bibliography-mark&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bibliography-mark&gt;</span> element has the following attributes: <span class="Attribute">text:address</span> <a href="#attribute-text_address">19.751</a>, <span class="Attribute">text:annote</span> <a href="#attribute-text_annote">19.755</a>, <span class="Attribute">text:author</span> <a href="#attribute-text_author">19.756</a>, <span class="Attribute">text:bibliography-type</span> <a href="#attribute-text_bibliography-type">19.758</a>, <span class="Attribute">text:booktitle</span> <a href="#attribute-text_booktitle">19.759</a>, <span class="Attribute">text:chapter</span> <a href="#attribute-text_chapter">19.767</a>, <span class="Attribute">text:custom1</span> <a href="#attribute-text_custom1">19.786</a>, <span class="Attribute">text:custom2</span> <a href="#attribute-text_custom2">19.787</a>, <span class="Attribute">text:custom3</span> <a href="#attribute-text_custom3">19.788</a>, <span class="Attribute">text:custom4</span> <a href="#attribute-text_custom4">19.789</a>, <span class="Attribute">text:custom5</span> <a href="#attribute-text_custom5">19.790</a>, <span class="Attribute">text:edition</span> <a href="#attribute-text_edition">19.800</a>, <span class="Attribute">text:editor</span> <a href="#attribute-text_editor">19.801</a>, <span class="Attribute">text:howpublished</span> <a href="#attribute-text_howpublished">19.807</a>, <span class="Attribute">text:identifier</span> <a href="#attribute-text_identifier">19.810</a>, <span class="Attribute">text:institution</span> <a href="#attribute-text_institution">19.814</a>, <span class="Attribute">text:isbn</span> <a href="#attribute-text_isbn">19.817</a>, <span class="Attribute">text:issn</span> <a href="#attribute-text_issn">19.818</a>, <span class="Attribute">text:journal</span> <a href="#attribute-text_journal">19.819</a>, <span class="Attribute">text:month</span> <a href="#attribute-text_month">19.834</a>, <span class="Attribute">text:note</span> <a href="#attribute-text_note">19.836</a>, <span class="Attribute">text:number</span> <a href="#attribute-text_number">19.838</a>, <span class="Attribute">text:organizations</span> <a href="#attribute-text_organizations">19.843</a>, <span class="Attribute">text:pages</span> <a href="#attribute-text_pages">19.846</a>, <span class="Attribute">text:publisher</span> <a href="#attribute-text_publisher">19.852</a>, <span class="Attribute">text:report-type</span> <a href="#attribute-text_report-type">19.856</a>, <span class="Attribute">text:school</span> <a href="#attribute-text_school">19.860</a>, <span class="Attribute">text:series</span> <a href="#attribute-text_series">19.862</a>, <span class="Attribute">text:title</span> <a href="#attribute-text_title">19.882</a>, <span class="Attribute">text:url</span> <a href="#attribute-text_url">19.884</a>, <span class="Attribute">text:volume</span> <a href="#attribute-text_volume">19.902</a> and <span class="Attribute">text:year</span> <a href="#attribute-text_year">19.903</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:bibliography-mark&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bibliography-mark&gt;</span> element has character data content.</p><h2 class="Heading_20_2"><a id="a8_2Index_Structure"><span style="margin-right:0.127cm;">8.2</span></a><a id="__RefHeading__1415490_253892949"/>Index Structure</h2><h3 class="Heading_20_3"><a id="a8_2_1General"><span style="margin-right:0.127cm;">8.2.1</span></a><a id="__RefHeading__1415492_253892949"/>General</h3><p class="Text_20_body">An index consists of two parts: the index source, and the index body. </p><p class="Text_20_body">The index source is specific to the type of index it is being used for. It contains the information necessary to generate the index content. </p><h3 class="Heading_20_3"><a id="a8_2_2_text_index-body_"><span style="margin-right:0.127cm;">8.2.2</span></a><a id="__RefHeading__1415494_253892949"/><a id="element-text_index-body"/>&lt;text:index-body&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-body&gt;</span> element contains an index.</p><p class="Text_20_body">The <span class="Element">&lt;text:index-body&gt;</span> element is used for all types of indexes. It contains the index content generated to form the index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-body&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-body&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-body&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h3 class="Heading_20_3"><a id="a8_2_3_text_index-title_"><span style="margin-right:0.127cm;">8.2.3</span></a><a id="__RefHeading__1415496_253892949"/><a id="element-text_index-title"/>&lt;text:index-title&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-title&gt;</span> element contains the title of an index. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-title&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a> and <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-title&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_index-title">19.835.9</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-title">19.874.19</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-title&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h2 class="Heading_20_2"><a id="a8_3_text_table-of-content_"><span style="margin-right:0.127cm;">8.3</span></a><a id="__RefHeading__1415498_253892949"/><a id="element-text_table-of-content"/>&lt;text:table-of-content&gt;</h2><h3 class="Heading_20_3"><a id="a8_3_1General"><span style="margin-right:0.127cm;">8.3.1</span></a><a id="__RefHeading__1415500_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-of-content&gt;</span> element represents a table of contents for a document. </p><p class="Text_20_body">The items that can be listed in a table of contents are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Headings (as defined by the outline structure of the document), up to a selected level.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Table of contents index marks.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Paragraphs formatted with specified paragraph styles.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note</span>: Paragraphs may be selected for inclusion in a table of contents based on their styles. Selection is based on a paragraph's style matching a style specified by the <span class="Element">&lt;text:index-source-styles&gt;</span> child element of a <span class="Element">&lt;text:table-of-content-source&gt;</span> child element of a <span class="Element">&lt;text:table-of-content&gt;</span> element, when the <span class="Attribute">text:use-index-source-styles</span> attribute of the child <span class="Element">&lt;text:index-source-styles&gt;</span> element has the value <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-of-content&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-</span><span class="Element">left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-of-content&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_table-of-content">19.835.17</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_table-of-content">19.874.35</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-of-content&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a> and <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a>.</p><h3 class="Heading_20_3"><a id="a8_3_2_text_table-of-content-source_"><span style="margin-right:0.127cm;">8.3.2</span></a><a id="__RefHeading__1415502_253892949"/><a id="element-text_table-of-content-source"/>&lt;text:table-of-content-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-of-content-source&gt;</span> element specifies how a table of contents is generated. It also specifies the styles to be applied to index entries.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-of-content-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-of-content-source&gt;</span> element has the following attributes: <span class="Attribute">text:index-scope</span> <a href="#attribute-text_index-scope">19.812</a>, <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_table-of-content-source">19.844.9</a>, <span class="Attribute">text:relative-tab-stop-position</span> <a href="#attribute-text_relative-tab-stop-position">19.855</a>, <span class="Attribute">text:use-index-marks</span> <a href="#attribute-text_use-index-marks">19.890</a>, <span class="Attribute">text:use-index-source-styles</span> <a href="#attribute-text_use-index-source-styles">19.891</a> and <span class="Attribute">text:use-outline-level</span> <a href="#attribute-text_use-outline-level">19.896</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-of-content-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-source-styles&gt;</span> <a href="#element-text_index-source-styles">8.10</a>, <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a> and <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a>.</p><h3 class="Heading_20_3"><a id="a8_3_3_text_table-of-content-entry-template_"><span style="margin-right:0.127cm;">8.3.3</span></a><a id="__RefHeading__1415504_253892949"/><a id="element-text_table-of-content-entry-template"/>&lt;text:table-of-content-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> element specifies the format of an index entry for a specified outline level. </p><p class="Text_20_body">For each <span class="Element">&lt;text:table-of-content-source&gt;</span> element, there shall not be more than one <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> for a specified outline level. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> element has the following attributes: <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_table-of-content-entry-template">19.844.8</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_table-of-content-entry-template">19.874.36</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>, <span class="Element">&lt;text:index-entry-link-end&gt;</span> <a href="#element-text_index-entry-link-end">8.13.8</a>, <span class="Element">&lt;text:index-entry-link-start&gt;</span> <a href="#element-text_index-entry-link-start">8.13.7</a>, <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>, <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a> and <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><h2 class="Heading_20_2"><a id="a8_4_text_illustration-index_"><span style="margin-right:0.127cm;">8.4</span></a><a id="__RefHeading__1415506_253892949"/><a id="element-text_illustration-index"/>&lt;text:illustration-index&gt;</h2><h3 class="Heading_20_3"><a id="a8_4_1General"><span style="margin-right:0.127cm;">8.4.1</span></a><a id="__RefHeading__1415508_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:illustration-index&gt;</span> element represents an index of the images and graphics in a current document or chapter. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:illustration-index&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:illustration-index&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_illustration-index">19.835.8</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_illustration-index">19.874.8</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:illustration-index&gt;</span> element has the following child elements: <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a> and <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>.</p><h3 class="Heading_20_3"><a id="a8_4_2_text_illustration-index-source_"><span style="margin-right:0.127cm;">8.4.2</span></a><a id="__RefHeading__1415510_253892949"/><a id="element-text_illustration-index-source"/>&lt;text:illustration-index-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:illustration-index-source&gt;</span> element specifies how an index of illustrations is generated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:illustration-index-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:illustration-index-source&gt;</span> element has the following attributes: <span class="Attribute">text:caption-sequence-format</span> <a href="#attribute-text_caption-sequence-format">19.764</a>, <span class="Attribute">text:caption-sequence-name</span> <a href="#attribute-text_caption-sequence-name">19.765</a>, <span class="Attribute">text:index-scope</span> <a href="#attribute-text_index-scope">19.812</a>, <span class="Attribute">text:relative-tab-stop-position</span> <a href="#attribute-text_relative-tab-stop-position">19.855</a> and <span class="Attribute">text:use-caption</span> <a href="#attribute-text_use-caption">19.885</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:illustration-index-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a> and <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a>.</p><h3 class="Heading_20_3"><a id="a8_4_3_text_illustration-index-entry-template_"><span style="margin-right:0.127cm;">8.4.3</span></a><a id="__RefHeading__1415512_253892949"/><a id="element-text_illustration-index-entry-template"/>&lt;text:illustration-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> element specifies the format of an index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_illustration-index-entry-template">19.874.9</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>, <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>, <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a> and <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><h2 class="Heading_20_2"><a id="a8_5_text_table-index_"><span style="margin-right:0.127cm;">8.5</span></a><a id="__RefHeading__1415514_253892949"/><a id="element-text_table-index"/>&lt;text:table-index&gt;</h2><h3 class="Heading_20_3"><a id="a8_5_1General"><span style="margin-right:0.127cm;">8.5.1</span></a><a id="__RefHeading__1415516_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-index&gt;</span> element represents an index of the tables in a document or chapter.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-index&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-index&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_table-index">19.835.18</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_table-index">19.874.37</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-index&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a> and <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>.</p><h3 class="Heading_20_3"><a id="a8_5_2_text_table-index-source_"><span style="margin-right:0.127cm;">8.5.2</span></a><a id="__RefHeading__1415518_253892949"/><a id="element-text_table-index-source"/>&lt;text:table-index-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-index-source&gt;</span> element specifies how an index of tables is generated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-index-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-index-source&gt;</span> element has the following attributes: <span class="Attribute">text:caption-sequence-format</span> <a href="#attribute-text_caption-sequence-format">19.764</a>, <span class="Attribute">text:caption-sequence-name</span> <a href="#attribute-text_caption-sequence-name">19.765</a>, <span class="Attribute">text:index-scope</span> <a href="#attribute-text_index-scope">19.812</a>, <span class="Attribute">text:relative-tab-stop-position</span> <a href="#attribute-text_relative-tab-stop-position">19.855</a> and <span class="Attribute">text:use-caption</span> <a href="#attribute-text_use-caption">19.885</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-index-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a> and <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>.</p><h3 class="Heading_20_3"><a id="a8_5_3_text_table-index-entry-template_"><span style="margin-right:0.127cm;">8.5.3</span></a><a id="__RefHeading__1415520_253892949"/><a id="element-text_table-index-entry-template"/>&lt;text:table-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:table-index-entry-template&gt;</span> element specifies the format of an index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:table-index-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:table-index-entry-template&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_table-index-entry-template">19.874.34</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:table-index-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>, <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>, <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a> and <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><h2 class="Heading_20_2"><a id="a8_6_text_object-index_"><span style="margin-right:0.127cm;">8.6</span></a><a id="__RefHeading__1415522_253892949"/><a id="element-text_object-index"/>&lt;text:object-index&gt;</h2><h3 class="Heading_20_3"><a id="a8_6_1General"><span style="margin-right:0.127cm;">8.6.1</span></a><a id="__RefHeading__1415524_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:object-index&gt;</span> element represents an index of the objects in a document or chapter. The types of objects that should be included in the index are defined by the <span class="Element">&lt;text:object-index-source&gt;</span> element. <a href="#element-text_object-index-source">8.6.2</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:object-index&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:object-index&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_object-index">19.835.10</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_object-index">19.874.26</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:object-index&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a> and <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><h3 class="Heading_20_3"><a id="a8_6_2_text_object-index-source_"><span style="margin-right:0.127cm;">8.6.2</span></a><a id="__RefHeading__1415526_253892949"/><a id="element-text_object-index-source"/>&lt;text:object-index-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:object-index-source&gt;</span> element specifies which object types to include in the index of objects. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:object-index-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:object-index-source&gt;</span> element has the following attributes: <span class="Attribute">text:index-scope</span> <a href="#attribute-text_index-scope">19.812</a>, <span class="Attribute">text:relative-tab-stop-position</span> <a href="#attribute-text_relative-tab-stop-position">19.855</a>, <span class="Attribute">text:use-chart-objects</span> <a href="#attribute-text_use-chart-objects">19.886</a>, <span class="Attribute">text:use-draw-objects</span> <a href="#attribute-text_use-draw-objects">19.887</a>, <span class="Attribute">text:use-math-objects</span> <a href="#attribute-text_use-math-objects">19.893</a>, <span class="Attribute">text:use-other-objects</span> <a href="#attribute-text_use-other-objects">19.895</a> and <span class="Attribute">text:use-spreadsheet-objects</span> <a href="#attribute-text_use-spreadsheet-objects">19.898</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:object-index-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a> and <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>.</p><h3 class="Heading_20_3"><a id="a8_6_3_text_object-index-entry-template_"><span style="margin-right:0.127cm;">8.6.3</span></a><a id="__RefHeading__1415528_253892949"/><a id="element-text_object-index-entry-template"/>&lt;text:object-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:object-index-entry-template&gt;</span> element specifies the format of an index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:object-index-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:object-index-entry-template&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_object-index-entry-template">19.874.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:object-index-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>, <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>, <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a> and <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><h2 class="Heading_20_2"><a id="a8_7_text_user-index_"><span style="margin-right:0.127cm;">8.7</span></a><a id="__RefHeading__1415530_253892949"/><a id="element-text_user-index"/>&lt;text:user-index&gt;</h2><h3 class="Heading_20_3"><a id="a8_7_1General"><span style="margin-right:0.127cm;">8.7.1</span></a><a id="__RefHeading__1415532_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index&gt;</span> element represents a user-defined index. A user-defined index may include entries from the following sources:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Index marks<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Paragraphs formatted using specified paragraph styles<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Tables, images, or objects<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Text frames<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-index&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-index&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_user-index">19.835.23</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_user-index">19.874.38</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-index&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><h3 class="Heading_20_3"><a id="a8_7_2_text_user-index-source_"><span style="margin-right:0.127cm;">8.7.2</span></a><a id="__RefHeading__1415534_253892949"/><a id="element-text_user-index-source"/>&lt;text:user-index-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index-source&gt;</span> element defines the generation of user defined indexes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-index-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-index-source&gt;</span> element has the following attributes: <span class="Attribute">text:copy-outline-levels</span> <a href="#attribute-text_copy-outline-levels">19.782</a>, <span class="Attribute">text:index-name</span> <a href="#attribute-text_index-name">19.811</a>, <span class="Attribute">text:index-scope</span> <a href="#attribute-text_index-scope">19.812</a>, <span class="Attribute">text:relative-tab-stop-position</span> <a href="#attribute-text_relative-tab-stop-position">19.855</a>, <span class="Attribute">text:use-floating-frames</span> <a href="#attribute-text_use-floating-frames">19.888</a>, <span class="Attribute">text:use-graphics</span> <a href="#attribute-text_use-graphics">19.889</a>, <span class="Attribute">text:use-index-marks</span> <a href="#attribute-text_use-index-marks">19.890</a>, <span class="Attribute">text:use-index-source-styles</span> <a href="#attribute-text_use-index-source-styles">19.891</a>, <span class="Attribute">text:use-objects</span> <a href="#attribute-text_use-objects">19.894</a> and <span class="Attribute">text:use-tables</span> <a href="#attribute-text_use-tables">19.899</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-index-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-source-styles&gt;</span> <a href="#element-text_index-source-styles">8.10</a>, <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a> and <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><h3 class="Heading_20_3"><a id="a8_7_3_text_user-index-entry-template_"><span style="margin-right:0.127cm;">8.7.3</span></a><a id="__RefHeading__1415536_253892949"/><a id="element-text_user-index-entry-template"/>&lt;text:user-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:user-index-entry-template&gt;</span> element contains entry elements for chapter number, page number, entry text, text spans, and tab stops.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:user-index-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:user-index-entry-template&gt;</span> element has the following attributes: <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_user-index-entry-template">19.844.12</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_user-index-entry-template">19.874.39</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:user-index-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>, <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>, <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a> and <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><h2 class="Heading_20_2"><a id="a8_8_text_alphabetical-index_"><span style="margin-right:0.127cm;">8.8</span></a><a id="__RefHeading__1415538_253892949"/><a id="element-text_alphabetical-index"/>&lt;text:alphabetical-index&gt;</h2><h3 class="Heading_20_3"><a id="a8_8_1General"><span style="margin-right:0.127cm;">8.8.1</span></a><a id="__RefHeading__1415540_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:alphabetical-index&gt;</span> element represents an index which is based on alphabetical index marks. The entries in an alphabetical index are sorted.</p><p class="Note"><span class="Note_20_Label">Note:</span> Sort orders are locale specific.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-</span><span class="Element">body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_alphabetical-index">19.835.2</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_alphabetical-index">19.874.3</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index&gt;</span> element has the following child elements: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a> and <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>.</p><h3 class="Heading_20_3"><a id="a8_8_2_text_alphabetical-index-source_"><span style="margin-right:0.127cm;">8.8.2</span></a><a id="__RefHeading__1415542_253892949"/><a id="element-text_alphabetical-index-source"/>&lt;text:alphabetical-index-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:alphabetical-index-source&gt;</span> element specifies how an alphabetical index is generated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index-source&gt;</span> element has the following attributes: <span class="Attribute">fo:country</span> <a href="#attribute-fo_country_element-text_alphabetical-index-source">19.234.1</a>, <span class="Attribute">fo:language</span> <a href="#attribute-fo_language_element-text_alphabetical-index-source">19.236.2</a>, <span class="Attribute">fo:script</span> <a href="#attribute-fo_script_element-text_alphabetical-index-source">19.242.2</a>, <span class="Attribute">style:rfc-language-tag</span> <a href="#attribute-style_rfc-language-tag">19.512</a>, <span class="Attribute">text:alphabetical-separators</span> <a href="#attribute-text_alphabetical-separators">19.752</a>, <span class="Attribute">text:capitalize-entries</span> <a href="#attribute-text_capitalize-entries">19.762</a>, <span class="Attribute">text:combine-entries</span> <a href="#attribute-text_combine-entries">19.772</a>, <span class="Attribute">text:combine-entries-with-dash</span> <a href="#attribute-text_combine-entries-with-dash">19.773</a>, <span class="Attribute">text:combine-entries-with-pp</span> <a href="#attribute-text_combine-entries-with-pp">19.774</a>, <span class="Attribute">text:comma-separated</span> <a href="#attribute-text_comma-separated">19.775</a>, <span class="Attribute">text:ignore-case</span> <a href="#attribute-text_ignore-case">19.813</a>, <span class="Attribute">text:index-scope</span> <a href="#attribute-text_index-scope">19.812</a>, <span class="Attribute">text:main-entry-style-name</span> <a href="#attribute-text_main-entry-style-name">19.832</a>, <span class="Attribute">text:relative-tab-stop-position</span> <a href="#attribute-text_relative-tab-stop-position">19.855</a>, <span class="Attribute">text:sort-algorithm</span> <a href="#attribute-text_sort-algorithm">19.865</a> and <span class="Attribute">text:use-keys-as-entries</span> <a href="#attribute-text_use-keys-as-entries">19.892</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a> and <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a>.</p><h3 class="Heading_20_3"><a id="a8_8_3_text_alphabetical-index-auto-mark-file_"><span style="margin-right:0.127cm;">8.8.3</span></a><a id="__RefHeading__1415544_253892949"/><a id="element-text_alphabetical-index-auto-mark-file"/>&lt;text:alphabetical-index-auto-mark-file&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> element specifies an auto mark file. An auto mark file is a file that defines a list of terms that may be used by consumers to automatically insert alphabetical index marks (see <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>, <a href="#element-text_alphabetical-index-mark">8.1.10</a>).</p><p class="Text_20_body">The format of an index mark file is implementation-defined. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> element has the following attributes: <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-text_alphabetical-index-auto-mark-file">19.910.34</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_8_4_text_alphabetical-index-entry-template_"><span style="margin-right:0.127cm;">8.8.4</span></a><a id="__RefHeading__1415546_253892949"/><a id="element-text_alphabetical-index-entry-template"/>&lt;text:alphabetical-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> element specifies the format of an alphabetical index entry. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> element has the following attributes: <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_alphabetical-index-entry-template">19.844.2</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_alphabetical-index-entry-template">19.874.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>, <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>, <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a> and <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><h2 class="Heading_20_2"><a id="a8_9_text_bibliography_"><span style="margin-right:0.127cm;">8.9</span></a><a id="__RefHeading__1415548_253892949"/><a id="element-text_bibliography"/>&lt;text:bibliography&gt;</h2><h3 class="Heading_20_3"><a id="a8_9_1General"><span style="margin-right:0.127cm;">8.9.1</span></a><a id="__RefHeading__1415550_253892949"/>General</h3><p class="Text_20_body">The <span class="Element">&lt;text:bibliography&gt;</span> element represents a bibliography constructed from bibliography index marks.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bibliography&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bibliography&gt;</span> element has the following attributes: <span class="Attribute">text:name</span> <a href="#attribute-text_name_element-text_bibliography">19.835.3</a>, <span class="Attribute">text:protected</span> <a href="#attribute-text_protected">19.849</a>, <span class="Attribute">text:protection-key</span> <a href="#attribute-text_protection-key">19.850</a>, <span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>, <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_bibliography">19.874.5</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bibliography&gt;</span> element has the following child elements: <span class="Element">&lt;text:bibliography-source&gt;</span> <a href="#element-text_bibliography-source">8.9.2</a> and <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>.</p><h3 class="Heading_20_3"><a id="a8_9_2_text_bibliography-source_"><span style="margin-right:0.127cm;">8.9.2</span></a><a id="__RefHeading__1415552_253892949"/><a id="element-text_bibliography-source"/>&lt;text:bibliography-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:bibliography-source&gt;</span> element specifies how a bibliography is generated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bibliography-source&gt;</span> element is usable within the following element: <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bibliography-source&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bibliography-source&gt;</span> element has the following child elements: <span class="Element">&lt;text:bibliography-entry-template&gt;</span> <a href="#element-text_bibliography-entry-template">8.9.3</a> and <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a>.</p><h3 class="Heading_20_3"><a id="a8_9_3_text_bibliography-entry-template_"><span style="margin-right:0.127cm;">8.9.3</span></a><a id="__RefHeading__1415554_253892949"/><a id="element-text_bibliography-entry-template"/>&lt;text:bibliography-entry-template&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:bibliography-entry-template&gt;</span> element specifies the formatting for a bibliographic entry. </p><p class="Text_20_body">There shall be no more than one <span class="Element">&lt;text:bibliography-entry-template&gt;</span> element for each type of entry within any <span class="Element">&lt;text:bibliography-source&gt;</span> element. <a href="#element-text_bibliography-source">8.9.2</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bibliography-entry-template&gt;</span> element is usable within the following element: <span class="Element">&lt;text:bibliography-source&gt;</span> <a href="#element-text_bibliography-source">8.9.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bibliography-entry-template&gt;</span> element has the following attributes: <span class="Attribute">text:bibliography-type</span> <a href="#attribute-text_bibliography-type">19.758</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_bibliography-entry-template">19.874.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bibliography-entry-template&gt;</span> element has the following child elements: <span class="Element">&lt;text:index-entry-bibliography&gt;</span> <a href="#element-text_index-entry-bibliography">8.13.5</a>, <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a> and <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a>.</p><h2 class="Heading_20_2"><a id="a8_10_text_index-source-styles_"><span style="margin-right:0.127cm;">8.10</span></a><a id="__RefHeading__1415556_253892949"/><a id="element-text_index-source-styles"/>&lt;text:index-source-styles&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:index-source-styles&gt;</span> element contains all of the <span class="Element">&lt;text:index-source-style&gt;</span> elements for a specified outline level. There can only be one <span class="Element">&lt;text:index-source-styles&gt;</span> element for each outline level.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-source-styles&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-source-styles&gt;</span> element has the following attribute: <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_index-source-styles">19.844.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-source-styles&gt;</span> element has the following child element: <span class="Element">&lt;text:index-source-style&gt;</span> <a href="#element-text_index-source-style">8.11</a>.</p><h2 class="Heading_20_2"><a id="a8_11_text_index-source-style_"><span style="margin-right:0.127cm;">8.11</span></a><a id="__RefHeading__1415558_253892949"/><a id="element-text_index-source-style"/>&lt;text:index-source-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:index-source-style&gt;</span> element specifies the name of a style or a class. Paragraphs formatted using that style or class are included in the index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-source-style&gt;</span> element is usable within the following element: <span class="Element">&lt;text:index-source-styles&gt;</span> <a href="#element-text_index-source-styles">8.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-source-style&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-source-style">19.874.18</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-source-style&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a8_12_text_index-title-template_"><span style="margin-right:0.127cm;">8.12</span></a><a id="__RefHeading__1415560_253892949"/><a id="element-text_index-title-template"/>&lt;text:index-title-template&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:index-title-template&gt;</span> element specifies the style and content of the index title. There can only be one <span class="Element">&lt;text:index-title-template&gt;</span> element contained in a <span class="Element">&lt;text:table-of-content-source&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-title-template&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>, <span class="Element">&lt;text:bibliography-source&gt;</span> <a href="#element-text_bibliography-source">8.9.2</a>, <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a>, <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>, <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>, <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-title-template&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-title-template">19.874.20</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:index-title-template&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-title-template&gt;</span> element has character data content.</p><h2 class="Heading_20_2"><a id="a8_13Index_Template_Entries"><span style="margin-right:0.127cm;">8.13</span></a><a id="__RefHeading__1415562_253892949"/><a id="Index_Template_Entries"/>Index Template Entries</h2><h3 class="Heading_20_3"><a id="a8_13_1_text_index-entry-chapter_"><span style="margin-right:0.127cm;">8.13.1</span></a><a id="__RefHeading__1415564_253892949"/><a id="element-text_index-entry-chapter"/>&lt;text:index-entry-chapter&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-chapter&gt;</span> element represents the chapter number where an index entry is located. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-chapter&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>, <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a>, <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>, <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>, <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a> and <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-chapter&gt;</span> element has the following attributes: <span class="Attribute">text:display</span> <a href="#attribute-text_display_element-text_index-entry-chapter">19.796.5</a>, <span class="Attribute">text:outline-level</span> <a href="#attribute-text_outline-level_element-text_index-entry-chapter">19.844.5</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-chapter">19.874.11</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-chapter&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_13_2_text_index-entry-text_"><span style="margin-right:0.127cm;">8.13.2</span></a><a id="__RefHeading__1415566_253892949"/><a id="element-text_index-entry-text"/>&lt;text:index-entry-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-text&gt;</span> element contains the text of an index entry. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-text&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>, <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a>, <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>, <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>, <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a> and <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-text&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-text">19.874.17</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-text&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_13_3_text_index-entry-page-number_"><span style="margin-right:0.127cm;">8.13.3</span></a><a id="__RefHeading__1415568_253892949"/><a id="element-text_index-entry-page-number"/>&lt;text:index-entry-page-number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-page-number&gt;</span> element represents the number of the chapter where an index entry is located. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-page-number&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>, <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a>, <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>, <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>, <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a> and <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-page-number&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-page-number">19.874.14</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-page-number&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_13_4_text_index-entry-span_"><span style="margin-right:0.127cm;">8.13.4</span></a><a id="__RefHeading__1415570_253892949"/><a id="element-text_index-entry-span"/>&lt;text:index-entry-span&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-span&gt;</span> element represents a fixed string within an index entry. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-span&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>, <span class="Element">&lt;text:bibliography-entry-</span><span class="Element">template&gt;</span> <a href="#element-text_bibliography-entry-template">8.9.3</a>, <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a>, <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>, <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>, <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a> and <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-span&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-span">19.874.15</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:index-entry-span&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-span&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a8_13_5_text_index-entry-bibliography_"><span style="margin-right:0.127cm;">8.13.5</span></a><a id="__RefHeading__1415572_253892949"/><a id="element-text_index-entry-bibliography"/>&lt;text:index-entry-bibliography&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-bibliography&gt;</span> element specifies the field of a bibliographic entry that will be displayed in an index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-bibliography&gt;</span> element is usable within the following element: <span class="Element">&lt;text:bibliography-entry-template&gt;</span> <a href="#element-text_bibliography-entry-template">8.9.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-bibliography&gt;</span> element has the following attributes: <span class="Attribute">text:bibliography-data-field</span> <a href="#attribute-text_bibliography-data-field">19.757</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-bibliography">19.874.10</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-bibliography&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_13_6_text_index-entry-tab-stop_"><span style="margin-right:0.127cm;">8.13.6</span></a><a id="__RefHeading__1415574_253892949"/><a id="element-text_index-entry-tab-stop"/>&lt;text:index-entry-tab-stop&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> element represents a tab stop within an index entry. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>, <span class="Element">&lt;text:bibliography-entry-template&gt;</span> <a href="#element-text_bibliography-entry-template">8.9.3</a>, <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a>, <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>, <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>, <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a> and <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> element has the following attributes: <span class="Attribute">style:leader-char</span> <a href="#attribute-style_leader-char">19.483</a>, <span class="Attribute">style:position</span> <a href="#attribute-style_position_element-text_index-entry-tab-stop">19.508.4</a>, <span class="Attribute">style:type</span> <a href="#attribute-style_type_element-text_index-entry-tab-stop">19.515.2</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-tab-stop">19.874.16</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_13_7_text_index-entry-link-start_"><span style="margin-right:0.127cm;">8.13.7</span></a><a id="__RefHeading__1415576_253892949"/><a id="element-text_index-entry-link-start"/>&lt;text:index-entry-link-start&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-link-start&gt;</span> element represents the start of a hyperlink index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-link-start&gt;</span> element is usable within the following element: <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-link-start&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-link-start">19.874.13</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-link-start&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a8_13_8_text_index-entry-link-end_"><span style="margin-right:0.127cm;">8.13.8</span></a><a id="__RefHeading__1415578_253892949"/><a id="element-text_index-entry-link-end"/>&lt;text:index-entry-link-end&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:index-entry-link-end&gt;</span> element represents the end of a hyperlink index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:index-entry-link-end&gt;</span> element is usable within the following element: <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:index-entry-link-end&gt;</span> element has the following attribute: <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_index-entry-link-end">19.874.12</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:index-entry-link-end&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a9Tables"><span style="margin-right:0.127cm;">9</span></a><a id="__RefHeading__1415580_253892949"/><a id="Table_Content"/>Tables</h1><h2 class="Heading_20_2"><a id="a9_1Basic_Tables"><span style="margin-right:0.127cm;">9.1</span></a><a id="__RefHeading__1415582_253892949"/>Basic Tables</h2><h3 class="Heading_20_3"><a id="a9_1_1General"><span style="margin-right:0.127cm;">9.1.1</span></a><a id="__RefHeading__1415584_253892949"/>General</h3><p class="Text_20_body">The representation of tables is based on the concept of grids of rows and columns. In markup, rows are partitioned into table cells. Columns are implied by taking together all cells with the same position within the rows. </p><p class="Text_20_body">Rows and columns appear in <span class="Def">row groups</span> and <span class="Def">column groups</span>. These groups specify whether to repeat a row or column on the next page.</p><p class="Note"><span class="Note_20_Label">Note:</span> There is only one model for tables, although tables, such as for spreadsheets, may have additional capabilities when compared to tables in text documents.</p><p class="Text_20_body">Tables may be nested, that is, tables may occur within tables.</p><h3 class="Heading_20_3"><a id="a9_1_2_table_table_"><span style="margin-right:0.127cm;">9.1.2</span></a><a id="__RefHeading__1415586_253892949"/><a id="element-table_table"/>&lt;table:table&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table&gt;</span> element is the root element for a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table&gt;</span> element is usable within the following elements: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a>, <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:dde-link&gt;</span> <a href="#element-table_dde-link">14.6.4</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table&gt;</span> element has the following attributes: <span class="Attribute">table:is-sub-table</span> <a href="#attribute-table_is-sub-table">19.655</a>, <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_table">19.673.13</a>, <span class="Attribute">table:print</span> <a href="#attribute-table_print">19.693</a>, <span class="Attribute">table:print-ranges</span> <a href="#attribute-table_print-ranges">19.694</a>, <span class="Attribute">table:protected</span> <a href="#attribute-table_protected_element-table_table">19.696.4</a>, <span class="Attribute">table:protection-key</span> <a href="#attribute-table_protection-key">19.697</a>, <span class="Attribute">table:protection-key-digest-algorithm</span> <a href="#attribute-table_protection-key-digest-algorithm">19.698</a>, <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_table">19.726.16</a>, <span class="Attribute">table:template-name</span> <a href="#attribute-table_template-name">19.732</a>, <span class="Attribute">table:use-banding-columns-styles</span> <a href="#attribute-table_use-banding-columns-styles">19.736</a>, <span class="Attribute">table:use-banding-rows-styles</span> <a href="#attribute-table_use-banding-rows-styles">19.737</a>, <span class="Attribute">table:use-first-column-styles</span> <a href="#attribute-table_use-first-column-styles">19.738</a>, <span class="Attribute">table:use-first-row-styles</span> <a href="#attribute-table_use-first-row-styles">19.739</a>, <span class="Attribute">table:use-last-column-styles</span> <a href="#attribute-table_use-last-column-styles">19.740</a>, <span class="Attribute">table:use-last-row-styles</span> <a href="#attribute-table_use-last-row-styles">19.741</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table&gt;</span> element has the following child elements: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a>, <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>, <span class="Element">&lt;table:desc&gt;</span> <a href="#element-table_desc">9.1.14</a>, <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>, <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>, <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a>, <span class="Element">&lt;table:table-columns&gt;</span> <a href="#element-table_table-columns">9.1.12</a>, <span class="Element">&lt;table:table-header-columns&gt;</span> <a href="#element-table_table-header-columns">9.1.11</a>, <span class="Element">&lt;table:table-header-rows&gt;</span> <a href="#element-table_table-header-rows">9.1.7</a>, <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>, <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>, <span class="Element">&lt;table:table-rows&gt;</span> <a href="#element-table_table-rows">9.1.8</a>, <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>, <span class="Element">&lt;table:title&gt;</span> <a href="#element-table_title">9.1.13</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>.</p><h3 class="Heading_20_3"><a id="a9_1_3_table_table-row_"><span style="margin-right:0.127cm;">9.1.3</span></a><a id="__RefHeading__1415588_253892949"/><a id="element-table_table-row"/>&lt;table:table-row&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-row&gt;</span> element represents a row in a table. It contains elements that specify the cells of the table row.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-row&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;table:table-header-rows&gt;</span> <a href="#element-table_table-header-rows">9.1.7</a>, <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a> and <span class="Element">&lt;table:table-rows&gt;</span> <a href="#element-table_table-rows">9.1.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-row&gt;</span> element has the following attributes: <span class="Attribute">table:default-cell-style-name</span> <a href="#attribute-table_default-cell-style-name">19.615</a>, <span class="Attribute">table:number-rows-repeated</span> <a href="#attribute-table_number-rows-repeated">19.677</a>, <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_table-row">19.726.15</a>, <span class="Attribute">table:visibility</span> <a href="#attribute-table_visibility">19.749</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-row&gt;</span> element has the following child elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><h3 class="Heading_20_3"><a id="a9_1_4_table_table-cell_"><span style="margin-right:0.127cm;">9.1.4</span></a><a id="__RefHeading__1415590_253892949"/><a id="element-table_table-cell"/>&lt;table:table-cell&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-cell&gt;</span> element represents a table cell. It is contained in a table row element. A table cell can contain paragraphs and other text content as well as sub tables. Table cells may span multiple columns and rows. Table cells may be empty.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-cell&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-cell&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">table:content-validation-name</span> <a href="#attribute-table_content-validation-name">19.601</a>, <span class="Attribute">table:formula</span> <a href="#attribute-table_formula">19.642</a>, <span class="Attribute">table:number-columns-repeated</span> <a href="#attribute-table_number-columns-repeated_element-table_table-cell">19.675.3</a>, <span class="Attribute">table:number-columns-spanned</span> <a href="#attribute-table_number-columns-spanned">19.676</a>, <span class="Attribute">table:number-matrix-columns-spanned</span> <a href="#attribute-table_number-matrix-columns-spanned">19.679</a>, <span class="Attribute">table:number-matrix-rows-spanned</span> <a href="#attribute-table_number-matrix-rows-spanned">19.680</a>, <span class="Attribute">table:number-rows-spanned</span> <a href="#attribute-table_number-rows-spanned">19.678</a>, <span class="Attribute">table:protect</span> <a href="#attribute-table_protect">19.695</a>, <span class="Attribute">table:protected</span> <a href="#attribute-table_protected_element-table_table-cell">19.696.5</a>, <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_table-cell">19.726.13</a>, <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-cell&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:detective&gt;</span> <a href="#element-table_detective">9.3.2</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h3 class="Heading_20_3"><a id="a9_1_5_table_covered-table-cell_"><span style="margin-right:0.127cm;">9.1.5</span></a><a id="__RefHeading__1415592_253892949"/><a id="element-table_covered-table-cell"/>&lt;table:covered-table-cell&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:covered-table-cell&gt;</span> element represents cells that are covered by a <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a> element that spans multiple columns or rows. The <span class="Element">&lt;table:covered-table-cell&gt;</span> elements occupy the same position in document order as the cells spanned. There is one <span class="Element">&lt;table:covered-table-cell&gt;</span> element for each cell that is spanned. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:covered-table-cell&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:covered-table-cell&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">table:content-validation-name</span> <a href="#attribute-table_content-validation-name">19.601</a>, <span class="Attribute">table:formula</span> <a href="#attribute-table_formula">19.642</a>, <span class="Attribute">table:number-columns-repeated</span> <a href="#attribute-table_number-columns-repeated_element-table_covered-table-cell">19.675.2</a>, <span class="Attribute">table:protect</span> <a href="#attribute-table_protect">19.695</a>, <span class="Attribute">table:protected</span> <a href="#attribute-table_protected_element-table_covered-table-cell">19.696.2</a>, <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_covered-table-cell">19.726.4</a>, <span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a>, <span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a>, <span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a>, <span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:covered-table-cell&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:detective&gt;</span> <a href="#element-table_detective">9.3.2</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h3 class="Heading_20_3"><a id="a9_1_6_table_table-column_"><span style="margin-right:0.127cm;">9.1.6</span></a><a id="__RefHeading__1415594_253892949"/><a id="element-table_table-column"/>&lt;table:table-column&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-column&gt;</span> element specifies properties for one or more adjacent columns in a table. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-column&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a>, <span class="Element">&lt;table:table-columns&gt;</span> <a href="#element-table_table-columns">9.1.12</a> and <span class="Element">&lt;table:table-header-columns&gt;</span> <a href="#element-table_table-header-columns">9.1.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-column&gt;</span> element has the following attributes: <span class="Attribute">table:default-cell-style-name</span> <a href="#attribute-table_default-cell-style-name">19.615</a>, <span class="Attribute">table:number-columns-repeated</span> <a href="#attribute-table_number-columns-repeated_element-table_table-column">19.675.4</a>, <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_table-column">19.726.14</a>, <span class="Attribute">table:visibility</span> <a href="#attribute-table_visibility">19.749</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-column&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_1_7_table_table-header-rows_"><span style="margin-right:0.127cm;">9.1.7</span></a><a id="__RefHeading__1415596_253892949"/><a id="element-table_table-header-rows"/>&lt;table:table-header-rows&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-header-rows&gt;</span> element represents row headers in a table. It is composed of adjacent <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a> elements. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Use of the <span class="Element">&lt;table:table-header-rows&gt;</span> element increases accessibility. The use of styles to designate row headers diminishes accessibility. </p><p class="Text_20_body">If a table does not fit on a single page, table rows that are included in a <span class="Element">&lt;table:table-header-rows&gt;</span> element are automatically repeated on every page. </p><p class="Text_20_body">A table shall not contain more than one <span class="Element">&lt;table:table-header-rows&gt;</span> element, except that the table contains grouped rows defined by one or more <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a> elements. In this case, the table and each distinct group may contain one <span class="Element">&lt;table:table-header-rows&gt;</span> element, if and only if the table rows contained in the <span class="Element">&lt;table:table-header-rows&gt;</span> elements are adjacent.</p><p class="Text_20_body">Consumers that do not support header rows shall process header rows as non-header rows.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-header-rows&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-header-rows&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-header-rows&gt;</span> element has the following child elements: <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a> and <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>.</p><h3 class="Heading_20_3"><a id="a9_1_8_table_table-rows_"><span style="margin-right:0.127cm;">9.1.8</span></a><a id="__RefHeading__1415598_253892949"/><a id="element-table_table-rows"/>&lt;table:table-rows&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-rows&gt;</span> element contains groups of <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a> elements that do not repeat when a table spans more than one page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-rows&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-rows&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-rows&gt;</span> element has the following child elements: <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a> and <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>.</p><h3 class="Heading_20_3"><a id="a9_1_9_table_table-row-group_"><span style="margin-right:0.127cm;">9.1.9</span></a><a id="__RefHeading__1415600_253892949"/><a id="element-table_table-row-group"/>&lt;table:table-row-group&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-row-group&gt;</span> element groups adjacent table rows that do not appear as table headers. Every group can contain a new group, rows, and row headers. A row group can be visible or hidden. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-row-group&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-row-group&gt;</span> element has the following attribute: <span class="Attribute">table:display</span> <a href="#attribute-table_display">19.617</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-row-group&gt;</span> element has the following child elements: <span class="Element">&lt;table:table-header-rows&gt;</span> <a href="#element-table_table-header-rows">9.1.7</a>, <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>, <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>, <span class="Element">&lt;table:table-rows&gt;</span> <a href="#element-table_table-rows">9.1.8</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>.</p><h3 class="Heading_20_3"><a id="a9_1_10_table_table-column-group_"><span style="margin-right:0.127cm;">9.1.10</span></a><a id="__RefHeading__1415602_253892949"/><a id="element-table_table-column-group"/>&lt;table:table-column-group&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-column-group&gt;</span> element groups adjacent table columns. Every group can contain a new group, columns, and column headers. A column group can be visible or hidden. </p><p class="Text_20_body">If a set of header columns and a column group overlap, the header column group breaks the column header set. That is, the <span class="Element">&lt;table:table-column-group&gt;</span> may contain <span class="Element">&lt;table:table-header-columns&gt;</span> elements, but not vice versa.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-column-group&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-column-group&gt;</span> element has the following attribute: <span class="Attribute">table:display</span> <a href="#attribute-table_display">19.617</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-column-group&gt;</span> element has the following child elements: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>, <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a>, <span class="Element">&lt;table:table-columns&gt;</span> <a href="#element-table_table-columns">9.1.12</a>, <span class="Element">&lt;table:table-header-columns&gt;</span> <a href="#element-table_table-header-columns">9.1.11</a>.</p><h3 class="Heading_20_3"><a id="a9_1_11_table_table-header-columns_"><span style="margin-right:0.127cm;">9.1.11</span></a><a id="__RefHeading__1415604_253892949"/><a id="element-table_table-header-columns"/>&lt;table:table-header-columns&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-header-columns&gt;</span> element represents column headers in a table. It is composed of adjacent <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a> elements.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Use of the <span class="Element">&lt;table:table-header-columns&gt;</span> element increases accessibility The use of styles to designate column headers diminishes accessibility.</p><p class="Text_20_body">If a table does not fit on a single page, table columns that are included in a <span class="Element">&lt;table:table-header-columns&gt;</span> element are automatically repeated on every page. </p><p class="Text_20_body">A table shall not contain more than one <span class="Element">&lt;table:table-header-columns&gt;</span> element, except that the table contains grouped rows defined by one or more <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a> elements. In this case, the table and each distinct group may contain one <span class="Element">&lt;table:table-header-columns&gt;</span> element, if and only if the table columns contained in the <span class="Element">&lt;table:table-header-columns&gt;</span> elements are adjacent. </p><p class="Text_20_body">Consumers that do not support header columns shall process header column as non header columns .</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-header-columns&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-header-columns&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-header-columns&gt;</span> element has the following child element: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>.</p><h3 class="Heading_20_3"><a id="a9_1_12_table_table-columns_"><span style="margin-right:0.127cm;">9.1.12</span></a><a id="__RefHeading__1415606_253892949"/><a id="element-table_table-columns"/>&lt;table:table-columns&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-columns&gt;</span> element contains groups of <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a> elements that do not repeat when a table spans more than one page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-columns&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-columns&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-columns&gt;</span> element has the following child element: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>.</p><h3 class="Heading_20_3"><a id="a9_1_13_table_title_"><span style="margin-right:0.127cm;">9.1.13</span></a><a id="__RefHeading__1415608_253892949"/><a id="element-table_title"/>&lt;table:title&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:title&gt;</span> element specifies a title for a table. The element <span class="ISO_20_Keyword">shall not</span> be used if the parent <span class="Element">&lt;table:table&gt;</span> element is contained within a <span class="Element">&lt;draw:frame&gt;</span> element. In that case, the table's title is specified the by <span class="Element">&lt;svg:title&gt;</span> child element of <span class="Element">&lt;draw:frame&gt;</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:title&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:title&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;table:title&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:title&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a9_1_14_table_desc_"><span style="margin-right:0.127cm;">9.1.14</span></a><a id="__RefHeading__1415610_253892949"/><a id="element-table_desc"/>&lt;table:desc&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:desc&gt;</span> element specifies a prose description of a table that may be used to support accessibility. See appendix D The element <span class="ISO_20_Keyword">shall not</span> be used if the parent <span class="Element">&lt;table:table&gt;</span> element is contained within a <span class="Element">&lt;draw:frame&gt;</span> element. In that case, the table's description is specified the by <span class="Element">&lt;svg:desc&gt;</span> child element of <span class="Element">&lt;draw:frame&gt;</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:desc&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:desc&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;table:desc&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:desc&gt;</span> element has character data content.</p><h2 class="Heading_20_2"><a id="a9_2Advanced_Tables"><span style="margin-right:0.127cm;">9.2</span></a><a id="__RefHeading__1415612_253892949"/>Advanced Tables</h2><h3 class="Heading_20_3"><a id="a9_2_1Referencing_Table_Cells"><span style="margin-right:0.127cm;">9.2.1</span></a><a id="__RefHeading__1415614_253892949"/><a id="Referencing_Table_Cells"/>Referencing Table Cells</h3><p class="Text_20_body">To reference cells in a table, cell addresses are used. Cell addresses are constructed as follows:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>The name of the table.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>A dot “.” (U+002E, FULL STOP).<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">3)</span>An alphabetic value representing the column. The letter A represents column 1, B represents column 2, and so on. AA represents column 27, AB represents column 28, and so on.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">4)</span>A numeric value representing the row. The number 1 represents the first row, the number 2 represents the second row, and so on.<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">This means that A1 represents the cell in column 1 and row 1. B1 represents the cell in column 2 and row 1. A2 represents the cell in column 1 and row 2.</p><p class="Text_20_body">The structure of the address of a cell in a subtable is as follows:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>The address of the cell that contains the subtable.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>A dot “.” (U+002E, FULL STOP).<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">3)</span>The address of the cell in the subtable.<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">If the name of the table contains blanks, dots “.” (U+002E, FULL STOP) or apostrophes “'” (U+0027, APOSTROPHE), the name shall be quoted with apostrophes “'” (U+0027, APOSTROPHE). Any apostrophes in the name shall be escaped by doubling the”'”( U+0027, APOSTROPHE) character.</p><p class="Text_20_body">The behavior of a consumer when a cell is referenced but not declared is implementation-dependent <a id="DDE_LINK99"/></p><h3 class="Heading_20_3"><a id="a9_2_2Absolute_and_relative_cell_addressing"><span style="margin-right:0.127cm;">9.2.2</span></a><a id="__RefHeading__1415616_253892949"/><a id="Cell_address"/>Absolute and relative cell addressing</h3><p class="Text_20_body">Cells can be referenced by using either absolute addresses or relative addresses. When an operation is performed on a table cell absolute cell references do not change. Relative cell references are adapted to the address of the target cell of a copy operation.</p><p class="Text_20_body">To create an absolute address, a dollar sign “$” (U+0024, DOLLAR SIGN) shall be placed before each table name, column reference, and row reference. Absolute and relative references may be mixed within a single cell address. Absolute addresses shall contain a table name. </p><p class="Text_20_body">When differentiation between absolute and relative addresses is not necessary, the dollar signs in absolute addresses may be omitted.</p><h3 class="Heading_20_3"><a id="a9_2_3Cell_Range_Address"><span style="margin-right:0.127cm;">9.2.3</span></a><a id="__RefHeading__1415618_253892949"/><a id="CellRangeAddress"/>Cell Range Address</h3><p class="Text_20_body">A cell range is a number of adjacent cells forming a rectangular shape. The rectangle stretches from the cell on the logical top left to the cell on the logical bottom right. </p><p class="Text_20_body">A cell range address references a cell range. A cell range address consists of:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>The address of the cell at the top left of the range.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>A colon “:” (U+003A, COLON).<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">3)</span>The address of the cell at the bottom right of the range.<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The smallest range is a single cell. The range address of a single cell is the same as the cell address.</p><h3 class="Heading_20_3"><a id="a9_2_4Column_and_Row_Range_Addresses"><span style="margin-right:0.127cm;">9.2.4</span></a><a id="__RefHeading__1415620_253892949"/>Column and Row Range Addresses</h3><p class="Text_20_body">Column and row addresses are cell range addresses that reference entire rows or columns. </p><p class="Text_20_body">The syntax of a row address is the same as a cell address, except the alphabetic values that indicate the column are omitted. </p><p class="Text_20_body">The syntax of a column address is the same as a cell address, except the numeric values that indicate the row are omitted.</p><h3 class="Heading_20_3"><a id="a9_2_5Cell_Range_Address_List"><span style="margin-right:0.127cm;">9.2.5</span></a><a id="__RefHeading__1415622_253892949"/><a id="CellRangeAddressList"/>Cell Range Address List</h3><p class="Text_20_body">A cell range address list is a list of cell range addresses and cell addresses. Each item in the list is separated by white space. If any table name used in the list contains a “ “ (U+0020, SPACE) character, the table name is quoted within apostrophes “'” ( U+0027, APOSTROPHE).</p><h3 class="Heading_20_3"><a id="a9_2_6_table_table-source_"><span style="margin-right:0.127cm;">9.2.6</span></a><a id="__RefHeading__1415624_253892949"/><a id="element-table_table-source"/>&lt;table:table-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:table-source&gt;</span> element represents a link to a table that provides a source for a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-source&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-source&gt;</span> element has the following attributes: <span class="Attribute">table:filter-name</span> <a href="#attribute-table_filter-name">19.638</a>, <span class="Attribute">table:filter-options</span> <a href="#attribute-table_filter-options">19.639</a>, <span class="Attribute">table:mode</span> <a href="#attribute-table_mode">19.671</a>, <span class="Attribute">table:refresh-delay</span> <a href="#attribute-table_refresh-delay">19.701</a>, <span class="Attribute">table:table-name</span> <a href="#attribute-table_table-name">19.729</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-table_table-source">19.910.32</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-source&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_2_7_table_scenario_"><span style="margin-right:0.127cm;">9.2.7</span></a><a id="__RefHeading__1415626_253892949"/><a id="element-table_scenario"/>&lt;table:scenario&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:scenario&gt;</span> element defines a scenario for display on a table. A table represented by a <span class="Element">&lt;table:table&gt;</span> element which contains a <span class="Element">&lt;table:scenario&gt;</span> child element is called a scenario table. </p><p class="Text_20_body">A scenario is one or more cell ranges of a table whose contents replaces the contents of the cell ranges in the nearest non-scenario table preceding the scenario table in document order. If multiple scenarios are defined for a cell range, an user may choose between the scenarios. The names of the scenarios are the same as the names of tables which contain the <span class="Element">&lt;table:scenario&gt;</span> elements. </p><p class="Text_20_body">Display of the border of a scenario table is controlled by its <span class="Attribute">table:display-border</span> attribute.<a href="#attribute-table_display-border">19.618</a> </p><p class="Note"><span class="Note_20_Label">Note:</span> Display of the border of a scenario is the only visible indication that the displayed data is the result of the application of a scenario to the data in the table.</p><p class="Text_20_body">Only one scenario table can be applied to a range at one time.</p><p class="Note"><span class="Note_20_Label">Note:</span> A table can have multiple scenarios applied to it so long as the ranges of application do not overlap.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:scenario&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:scenario&gt;</span> element has the following attributes: <span class="Attribute">table:border-color</span> <a href="#attribute-table_border-color">19.588</a>, <span class="Attribute">table:comment</span> <a href="#attribute-table_comment">19.595</a>, <span class="Attribute">table:copy-back</span> <a href="#attribute-table_copy-back">19.602</a>, <span class="Attribute">table:copy-formulas</span> <a href="#attribute-table_copy-formulas">19.603</a>, <span class="Attribute">table:copy-styles</span> <a href="#attribute-table_copy-styles">19.604</a>, <span class="Attribute">table:display-border</span> <a href="#attribute-table_display-border">19.618</a>, <span class="Attribute">table:is-active</span> <a href="#attribute-table_is-active">19.652</a>, <span class="Attribute">table:protected</span> <a href="#attribute-table_protected_element-table_scenario">19.696.3</a> and <span class="Attribute">table:scenario-ranges</span> <a href="#attribute-table_scenario-ranges">19.705</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:scenario&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_2_8_table_shapes_"><span style="margin-right:0.127cm;">9.2.8</span></a><a id="__RefHeading__1415628_253892949"/><a id="element-table_shapes"/>&lt;table:shapes&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:shapes&gt;</span> element contains all the elements that represent graphic shapes that are anchored on a table where this element occurs.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:shapes&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:shapes&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:shapes&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><h2 class="Heading_20_2"><a id="a9_3Advanced_Table_Cells"><span style="margin-right:0.127cm;">9.3</span></a><a id="__RefHeading__1415630_253892949"/>Advanced Table Cells</h2><h3 class="Heading_20_3"><a id="a9_3_1_table_cell-range-source_"><span style="margin-right:0.127cm;">9.3.1</span></a><a id="__RefHeading__1415632_253892949"/><a id="element-table_cell-range-source"/>&lt;table:cell-range-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:cell-range-source&gt;</span> element represents a database range or named range of another file in a cell range. The first cell in the cell range contains this element. A cell range can be linked to a database range or named range of another file.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:cell-range-source&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:cell-range-source&gt;</span> element has the following attributes: <span class="Attribute">table:filter-name</span> <a href="#attribute-table_filter-name">19.638</a>, <span class="Attribute">table:filter-options</span> <a href="#attribute-table_filter-options">19.639</a>, <span class="Attribute">table:last-column-spanned</span> <a href="#attribute-table_last-column-spanned">19.658</a>, <span class="Attribute">table:last-row-spanned</span> <a href="#attribute-table_last-row-spanned">19.660</a>, <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_cell-range-source">19.673.2</a>, <span class="Attribute">table:refresh-delay</span> <a href="#attribute-table_refresh-delay">19.701</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-table_cell-range-source">19.910.31</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:cell-range-source&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_3_2_table_detective_"><span style="margin-right:0.127cm;">9.3.2</span></a><a id="__RefHeading__1415634_253892949"/><a id="element-table_detective"/>&lt;table:detective&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:detective&gt;</span> element is a container for <span class="Element">&lt;table:operation&gt;</span> <a href="#element-table_operation">9.3.3</a> and <span class="Element">&lt;table:highlighted-range&gt;</span> <a href="#element-table_highlighted-range">9.3.4</a> elements, providing information about what relationships between the current cell and other cells are revealed in the presentation of the table.  </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:detective&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:detective&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:detective&gt;</span> element has the following child elements: <span class="Element">&lt;table:highlighted-range&gt;</span> <a href="#element-table_highlighted-range">9.3.4</a> and <span class="Element">&lt;table:operation&gt;</span> <a href="#element-table_operation">9.3.3</a>.</p><h3 class="Heading_20_3"><a id="a9_3_3_table_operation_"><span style="margin-right:0.127cm;">9.3.3</span></a><a id="__RefHeading__1415636_253892949"/><a id="element-table_operation"/>&lt;table:operation&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:operation&gt;</span> element specifies the name of a detective operation that leads to the discovery of relationships between cells (<span class="Attribute">table:name</span>, <a href="#attribute-table_name">19.673</a>) and the order in which those operations are applied (<span class="Attribute">table:index</span>, <a href="#attribute-table_index">19.651</a>).Once relationships between cells have been discovered, those cells are highlighted to show those relationships.</p><p class="Note"><span class="Note_20_Label">Note: </span>A single cell may be the subject of one or more detective operations.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:operation&gt;</span> element is usable within the following element: <span class="Element">&lt;table:detective&gt;</span> <a href="#element-table_detective">9.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:operation&gt;</span> element has the following attributes: <span class="Attribute">table:index</span> <a href="#attribute-table_index">19.651</a> and <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_operation">19.673.11</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:operation&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_3_4_table_highlighted-range_"><span style="margin-right:0.127cm;">9.3.4</span></a><a id="__RefHeading__1415638_253892949"/><a id="element-table_highlighted-range"/>&lt;table:highlighted-range&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:highlighted-range&gt;</span> element specifies a cell range that is highlighted in the UI either because of detective operations defined by a <span class="Element">&lt;table:operation&gt;</span> element or because it contains an error or invalid data.</p><p class="Text_20_body">The nature of the highlighting is implementation dependent.</p><p class="Text_20_body"> This element represents the state of the document at the time the detective operations or error conditions were calculated. It need not accurately represent the current state of the document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:highlighted-range&gt;</span> element is usable within the following element: <span class="Element">&lt;table:detective&gt;</span> <a href="#element-table_detective">9.3.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:highlighted-range&gt;</span> element has the following attributes: <span class="Attribute">table:cell-range-address</span> <a href="#attribute-table_cell-range-address_element-table_highlighted-range">19.593.7</a>, <span class="Attribute">table:contains-error</span> <a href="#attribute-table_contains-error">19.599</a>, <span class="Attribute">table:direction</span> <a href="#attribute-table_direction">19.616</a> and <span class="Attribute">table:marked-invalid</span> <a href="#attribute-table_marked-invalid">19.664</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:highlighted-range&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a9_4Spreadsheet_Document_Content"><span style="margin-right:0.127cm;">9.4</span></a><a id="__RefHeading__1415640_253892949"/><a id="Columns__new_ref_"/>Spreadsheet Document Content</h2><h3 class="Heading_20_3"><a id="a9_4_1_table_calculation-settings_"><span style="margin-right:0.127cm;">9.4.1</span></a><a id="__RefHeading__1415642_253892949"/><a id="element-table_calculation-settings"/>&lt;table:calculation-settings&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:calculation-settings&gt;</span> element is a container for settings that affect the calculation of formula.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:calculation-settings&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:calculation-settings&gt;</span> element has the following attributes: <span class="Attribute">table:automatic-find-labels</span> <a href="#attribute-table_automatic-find-labels">19.585</a>, <span class="Attribute">table:case-sensitive</span> <a href="#attribute-table_case-sensitive">19.590</a>, <span class="Attribute">table:null-year</span> <a href="#attribute-table_null-year">19.674</a>, <span class="Attribute">table:precision-as-shown</span> <a href="#attribute-table_precision-as-shown">19.692</a>, <span class="Attribute">table:search-criteria-must-apply-to-whole-cell</span> <a href="#attribute-table_search-criteria-must-apply-to-whole-cell">19.707</a>, <span class="Attribute">table:use-regular-expressions</span> <a href="#attribute-table_use-regular-expressions">19.743</a> and <span class="Attribute">table:use-wildcards</span> <a href="#attribute-table_use-wildcards">19.744</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:calculation-settings&gt;</span> element has the following child elements: <span class="Element">&lt;table:iteration&gt;</span> <a href="#element-table_iteration">9.4.3</a> and <span class="Element">&lt;table:null-date&gt;</span> <a href="#element-table_null-date">9.4.2</a>.</p><h3 class="Heading_20_3"><a id="a9_4_2_table_null-date_"><span style="margin-right:0.127cm;">9.4.2</span></a><a id="__RefHeading__1415644_253892949"/><a id="element-table_null-date"/>&lt;table:null-date&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:null-date&gt;</span> element specifies the null date for a spreadsheet document. The null date is the date that results in the value “0” if a date value is converted into a numeric value. The null date is specified in the element's <span class="Attribute">table:date-value</span> attribute. </p><p class="Note"><span class="Note_20_Label">Note: </span>Commonly used values are <span class="Attribute_20_Value_20_Instance">1899-12-30</span>, <span class="Attribute_20_Value_20_Instance">1900-01-01</span>, and <span class="Attribute_20_Value_20_Instance">1904-01-01</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:null-date&gt;</span> element is usable within the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:null-date&gt;</span> element has the following attributes: <span class="Attribute">table:date-value</span> <a href="#attribute-table_date-value">19.614</a> and <span class="Attribute">table:value-type</span> <a href="#attribute-table_value-type">19.748</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:null-date&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_3_table_iteration_"><span style="margin-right:0.127cm;">9.4.3</span></a><a id="__RefHeading__1415646_253892949"/><a id="element-table_iteration"/>&lt;table:iteration&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:iteration&gt;</span> element enables formulas with iterative (or cyclic) references to be calculated after a specific number of iterations. If iterative calculations are not enabled, a formula expression containing a cyclic cell reference returns an error. </p><p class="Text_20_body">If the <span class="Attribute">table:status</span> attribute has the value <span class="Attribute_20_Value">enable</span> and iterating through the cyclic dependencies does not deliver a result that satisfies the condition specified by the <span class="Attribute">table:maximum-</span><span class="Attribute">difference</span> attribute within a number of iterations specified by the <span class="Attribute">table:steps</span> attribute for all cells in the cyclic dependencies, an error is returned. </p><p class="Text_20_body"> </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:iteration&gt;</span> element is usable within the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:iteration&gt;</span> element has the following attributes: <span class="Attribute">table:maximum-difference</span> <a href="#attribute-table_maximum-difference">19.666</a>, <span class="Attribute">table:status</span> <a href="#attribute-table_status">19.722</a> and <span class="Attribute">table:steps</span> <a href="#attribute-table_steps">19.724</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:iteration&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_4_table_content-validations_"><span style="margin-right:0.127cm;">9.4.4</span></a><a id="__RefHeading__1415648_253892949"/><a id="element-table_content-validations"/>&lt;table:content-validations&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:content-validations&gt;</span> element contains all the validation rules for the content of table cells.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:content-validations&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:content-validations&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:content-validations&gt;</span> element has the following child element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><h3 class="Heading_20_3"><a id="a9_4_5_table_content-validation_"><span style="margin-right:0.127cm;">9.4.5</span></a><a id="__RefHeading__1415650_253892949"/><a id="element-table_content-validation"/>&lt;table:content-validation&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:content-validation&gt;</span> element specifies a validation rule for table cell content. </p><p class="Text_20_body">The names of validation rules are stored in the <span class="Attribute">table:name</span> attribute of a <span class="Element">&lt;table:content-validation&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:content-validation&gt;</span> element is usable within the following element: <span class="Element">&lt;table:content-validations&gt;</span> <a href="#element-table_content-validations">9.4.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:content-validation&gt;</span> element has the following attributes: <span class="Attribute">table:allow-empty-cell</span> <a href="#attribute-table_allow-empty-cell">19.583</a>, <span class="Attribute">table:base-cell-address</span> <a href="#attribute-table_base-cell-address">19.586</a>, <span class="Attribute">table:condition</span> <a href="#attribute-table_condition">19.596</a>, <span class="Attribute">table:display-list</span> <a href="#attribute-table_display-list">19.621</a> and <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_content-validation">19.673.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:content-validation&gt;</span> element has the following child elements: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;table:error-macro&gt;</span> <a href="#element-table_error-macro">9.4.8</a>, <span class="Element">&lt;table:error-message&gt;</span> <a href="#element-table_error-message">9.4.7</a> and <span class="Element">&lt;table:help-message&gt;</span> <a href="#element-table_help-message">9.4.6</a>.</p><h3 class="Heading_20_3"><a id="a9_4_6_table_help-message_"><span style="margin-right:0.127cm;">9.4.6</span></a><a id="__RefHeading__1415652_253892949"/><a id="element-table_help-message"/>&lt;table:help-message&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:help-message&gt;</span> element specifies a message to display if a user selects a cell.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:help-message&gt;</span> element is usable within the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:help-message&gt;</span> element has the following attributes: <span class="Attribute">table:display</span> <a href="#attribute-table_display">19.617</a> and <span class="Attribute">table:title</span> <a href="#attribute-table_title">19.733</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:help-message&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a9_4_7_table_error-message_"><span style="margin-right:0.127cm;">9.4.7</span></a><a id="__RefHeading__1415654_253892949"/><a id="element-table_error-message"/>&lt;table:error-message&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:error-message&gt;</span> element specifies a message to display if a user tries to enter invalid content into a cell. That is when a validation rule's condition evaluates to “false” on the content the user attempts to enter.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:error-message&gt;</span> element is usable within the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:error-message&gt;</span> element has the following attributes: <span class="Attribute">table:display</span> <a href="#attribute-table_display">19.617</a>, <span class="Attribute">table:message-type</span> <a href="#attribute-table_message-type">19.670</a> and <span class="Attribute">table:title</span> <a href="#attribute-table_title">19.733</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:error-message&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a9_4_8_table_error-macro_"><span style="margin-right:0.127cm;">9.4.8</span></a><a id="__RefHeading__1415656_253892949"/><a id="element-table_error-macro"/>&lt;table:error-macro&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:error-macro&gt;</span> element specifies if a macro should be executed upon an attempt to enter invalid content. </p><p class="Text_20_body">A macro is specified by an <span class="Element">&lt;office:event-listeners&gt;</span> element. <a href="#Event_Tables">14.4</a> The event name shall be one that specifies an event that is called on invalid user input.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:error-macro&gt;</span> element is usable within the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:error-macro&gt;</span> element has the following attribute: <span class="Attribute">table:execute</span> <a href="#attribute-table_execute">19.634</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:error-macro&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_9_table_label-range_"><span style="margin-right:0.127cm;">9.4.9</span></a><a id="__RefHeading__1415658_253892949"/><a id="element-table_label-range"/>&lt;table:label-range&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:label-range&gt;</span> element specifies a label cell range which contain labels, and a data cell range which specifies the rows or columns whose content is referenced by the labels. </p><p class="Text_20_body">There are two types of label ranges: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Label ranges for columns.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Label ranges for rows.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Data and label ranges should match in both height and vertical position for row orientation, or in both width and horizontal position for column orientation. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:label-range&gt;</span> element is usable within the following element: <span class="Element">&lt;table:label-ranges&gt;</span> <a href="#element-table_label-ranges">9.4.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:label-range&gt;</span> element has the following attributes: <span class="Attribute">table:data-cell-range-address</span> <a href="#attribute-table_data-cell-range-address">19.608</a>, <span class="Attribute">table:label-cell-range-address</span> <a href="#attribute-table_label-cell-range-address">19.656</a> and <span class="Attribute">table:orientation</span> <a href="#attribute-table_orientation_element-table_label-range">19.686.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:label-range&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_10_table_label-ranges_"><span style="margin-right:0.127cm;">9.4.10</span></a><a id="__RefHeading__1415660_253892949"/><a id="element-table_label-ranges"/>&lt;table:label-ranges&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:label-ranges&gt;</span> element contains all the <span class="Element">&lt;table:label-range&gt;</span> elements in a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:label-ranges&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:label-ranges&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:label-ranges&gt;</span> element has the following child element: <span class="Element">&lt;table:label-range&gt;</span> <a href="#element-table_label-range">9.4.9</a>.</p><h3 class="Heading_20_3"><a id="a9_4_11_table_named-expressions_"><span style="margin-right:0.127cm;">9.4.11</span></a><a id="__RefHeading__1415662_253892949"/><a id="element-table_named-expressions"/>&lt;table:named-expressions&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:named-expressions&gt;</span> element contains assignments of names to expressions.</p><p class="Text_20_body">The following expressions may have names:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>cell ranges.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Other expressions.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If the <span class="Element">&lt;table:named-expressions&gt;</span> element is used with a <span class="Element">&lt;table:table&gt;</span> element, the scope of the named expressions are local to that table element.  </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:named-expressions&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:named-expressions&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:named-expressions&gt;</span> element has the following child elements: <span class="Element">&lt;table:named-expression&gt;</span> <a href="#element-table_named-expression">9.4.13</a> and <span class="Element">&lt;table:named-range&gt;</span> <a href="#element-table_named-range">9.4.12</a>.</p><h3 class="Heading_20_3"><a id="a9_4_12_table_named-range_"><span style="margin-right:0.127cm;">9.4.12</span></a><a id="__RefHeading__1415664_253892949"/><a id="element-table_named-range"/>&lt;table:named-range&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:named-range&gt;</span> element specifies a cell range that has a name assigned. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:named-range&gt;</span> element is usable within the following element: <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:named-range&gt;</span> element has the following attributes: <span class="Attribute">table:base-cell-address</span> <a href="#attribute-table_base-cell-address">19.586</a>, <span class="Attribute">table:cell-range-address</span> <a href="#attribute-table_cell-range-address_element-table_named-range">19.593.8</a>, <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_named-range">19.673.10</a> and <span class="Attribute">table:range-usable-as</span> <a href="#attribute-table_range-usable-as">19.700</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:named-range&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_13_table_named-expression_"><span style="margin-right:0.127cm;">9.4.13</span></a><a id="__RefHeading__1415666_253892949"/><a id="element-table_named-expression"/>&lt;table:named-expression&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:named-expression&gt;</span> element represents an expression with a name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:named-expression&gt;</span> element is usable within the following element: <span class="Element">&lt;table:named-expressions&gt;</span> <a href="#element-table_named-expressions">9.4.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:named-expression&gt;</span> element has the following attributes: <span class="Attribute">table:base-cell-address</span> <a href="#attribute-table_base-cell-address">19.586</a>, <span class="Attribute">table:expression</span> <a href="#attribute-table_expression">19.635</a> and <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_named-expression">19.673.9</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:named-expression&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_14_table_database-ranges_"><span style="margin-right:0.127cm;">9.4.14</span></a><a id="__RefHeading__1415668_253892949"/><a id="element-table_database-ranges"/>&lt;table:database-ranges&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:database-ranges&gt;</span> element contains all the <span class="Element">&lt;table:database-range&gt;</span> elements in a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:database-ranges&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:database-ranges&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:database-ranges&gt;</span> element has the following child element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><h3 class="Heading_20_3"><a id="a9_4_15_table_database-range_"><span style="margin-right:0.127cm;">9.4.15</span></a><a id="__RefHeading__1415670_253892949"/><a id="element-table_database-range"/>&lt;table:database-range&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:database-range&gt;</span> element defines a single database range. A database range is a named area in a table upon which database operations are performed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:database-range&gt;</span> element is usable within the following element: <span class="Element">&lt;table:database-ranges&gt;</span> <a href="#element-table_database-ranges">9.4.14</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:database-range&gt;</span> element has the following attributes: <span class="Attribute">table:contains-header</span> <a href="#attribute-table_contains-header">19.600</a>, <span class="Attribute">table:display-filter-buttons</span> <a href="#attribute-table_display-filter-buttons">19.620</a>, <span class="Attribute">table:has-persistent-data</span> <a href="#attribute-table_has-persistent-data">19.647</a>, <span class="Attribute">table:is-selection</span> <a href="#attribute-table_is-selection">19.654</a>, <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_database-range">19.673.8</a>, <span class="Attribute">table:on-update-keep-size</span> <a href="#attribute-table_on-update-keep-size">19.682</a>, <span class="Attribute">table:on-update-keep-styles</span> <a href="#attribute-table_on-update-keep-styles">19.683</a>, <span class="Attribute">table:orientation</span> <a href="#attribute-table_orientation_element-table_database-range">19.686.3</a>, <span class="Attribute">table:refresh-delay</span> <a href="#attribute-table_refresh-delay">19.701</a> and <span class="Attribute">table:target-range-address</span> <a href="#attribute-table_target-range-address_element-table_database-range">19.731.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:database-range&gt;</span> element has the following child elements: <span class="Element">&lt;table:database-source-query&gt;</span> <a href="#element-table_database-source-query">9.4.18</a>, <span class="Element">&lt;table:database-source-sql&gt;</span> <a href="#element-table_database-source-sql">9.4.16</a>, <span class="Element">&lt;table:database-source-table&gt;</span> <a href="#element-table_database-source-table">9.4.17</a>, <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>, <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a> and <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a>.</p><h3 class="Heading_20_3"><a id="a9_4_16_table_database-source-sql_"><span style="margin-right:0.127cm;">9.4.16</span></a><a id="__RefHeading__1415672_253892949"/><a id="element-table_database-source-sql"/>&lt;table:database-source-sql&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:database-source-sql&gt;</span> element specifies an <a title="Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38640">[SQL]</a> database that contains the source data of a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:database-source-sql&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a> and <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:database-source-sql&gt;</span> element has the following attributes: <span class="Attribute">table:database-name</span> <a href="#attribute-table_database-name">19.609</a>, <span class="Attribute">table:parse-sql-statement</span> <a href="#attribute-table_parse-sql-statement">19.689</a> and <span class="Attribute">table:sql-statement</span> <a href="#attribute-table_sql-statement">19.716</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:database-source-sql&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_17_table_database-source-table_"><span style="margin-right:0.127cm;">9.4.17</span></a><a id="__RefHeading__1415674_253892949"/><a id="element-table_database-source-table"/>&lt;table:database-source-table&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:database-source-table&gt;</span> element specifies the database and table that acts as the source data for a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:database-source-table&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a> and <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:database-source-table&gt;</span> element has the following attributes: <span class="Attribute">table:database-name</span> <a href="#attribute-table_database-name">19.609</a> and <span class="Attribute">table:database-table-name</span> <a href="#attribute-table_database-table-name">19.610</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:database-source-table&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_18_table_database-source-query_"><span style="margin-right:0.127cm;">9.4.18</span></a><a id="__RefHeading__1415676_253892949"/><a id="element-table_database-source-query"/>&lt;table:database-source-query&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:database-source-query&gt;</span> element specifies the query that produces the source data for a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:database-source-query&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a> and <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:database-source-query&gt;</span> element has the following attributes: <span class="Attribute">table:database-name</span> <a href="#attribute-table_database-name">19.609</a> and <span class="Attribute">table:query-name</span> <a href="#attribute-table_query-name">19.699</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:database-source-query&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_19_table_sort_"><span style="margin-right:0.127cm;">9.4.19</span></a><a id="__RefHeading__1415678_253892949"/><a id="element-table_sort"/>&lt;table:sort&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:sort&gt;</span> element <span class="Element">&lt;table:sort&gt;</span> specifies the sort keys to be applied to a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:sort&gt;</span> element is usable within the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:sort&gt;</span> element has the following attributes: <span class="Attribute">table:algorithm</span> <a href="#attribute-table_algorithm">19.581</a>, <span class="Attribute">table:bind-styles-to-content</span> <a href="#attribute-table_bind-styles-to-content">19.587</a>, <span class="Attribute">table:case-sensitive</span> <a href="#attribute-table_case-sensitive">19.590</a>, <span class="Attribute">table:country</span> <a href="#attribute-table_country">19.606</a>, <span class="Attribute">table:embedded-number-behavior</span> <a href="#attribute-table_embedded-number-behavior">19.624</a>, <span class="Attribute">table:language</span> <a href="#attribute-table_language">19.657</a>, <span class="Attribute">table:rfc-language-tag</span> <a href="#attribute-table_rfc-language-tag">19.703</a>, <span class="Attribute">table:script</span> <a href="#attribute-table_script">19.706</a> and <span class="Attribute">table:target-range-address</span> <a href="#attribute-table_target-range-address_element-table_sort">19.731.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:sort&gt;</span> element has the following child element: <span class="Element">&lt;table:sort-by&gt;</span> <a href="#element-table_sort-by">9.4.20</a>.</p><h3 class="Heading_20_3"><a id="a9_4_20_table_sort-by_"><span style="margin-right:0.127cm;">9.4.20</span></a><a id="__RefHeading__1415680_253892949"/><a id="element-table_sort-by"/>&lt;table:sort-by&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:sort-by&gt;</span> element specifies a key or field to sort, the data type of this field, and how to sort it for a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:sort-by&gt;</span> element is usable within the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:sort-by&gt;</span> element has the following attributes: <span class="Attribute">table:data-type</span> <a href="#attribute-table_data-type_element-table_sort-by">19.611.3</a>, <span class="Attribute">table:field-number</span> <a href="#attribute-table_field-number">19.637</a> and <span class="Attribute">table:order</span> <a href="#attribute-table_order">19.685</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:sort-by&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_21_table_subtotal-rules_"><span style="margin-right:0.127cm;">9.4.21</span></a><a id="__RefHeading__1415682_253892949"/><a id="element-table_subtotal-rules"/>&lt;table:subtotal-rules&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:subtotal-rules&gt;</span> element is a container for <span class="Element">&lt;table:subtotal-rule&gt;</span> elements which specify the calculation of provisional results (called subtotals) for a database range. Cells of the same field form a group. A provisional result is calculated and display at the end of each group. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:subtotal-rules&gt;</span> element is usable within the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:subtotal-rules&gt;</span> element has the following attributes: <span class="Attribute">table:bind-styles-to-content</span> <a href="#attribute-table_bind-styles-to-content">19.587</a>, <span class="Attribute">table:case-sensitive</span> <a href="#attribute-table_case-sensitive">19.590</a> and <span class="Attribute">table:page-breaks-on-group-change</span> <a href="#attribute-table_page-breaks-on-group-change">19.687</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:subtotal-rules&gt;</span> element has the following child elements: <span class="Element">&lt;table:sort-groups&gt;</span> <a href="#element-table_sort-groups">9.4.22</a> and <span class="Element">&lt;table:subtotal-rule&gt;</span> <a href="#element-table_subtotal-rule">9.4.23</a>.</p><h3 class="Heading_20_3"><a id="a9_4_22_table_sort-groups_"><span style="margin-right:0.127cm;">9.4.22</span></a><a id="__RefHeading__1415684_253892949"/><a id="element-table_sort-groups"/>&lt;table:sort-groups&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:sort-groups&gt;</span> element specifies a sort order for columns or rows of a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:sort-groups&gt;</span> element is usable within the following element: <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:sort-groups&gt;</span> element has the following attributes: <span class="Attribute">table:data-type</span> <a href="#attribute-table_data-type_element-table_sort-groups">19.611.4</a> and <span class="Attribute">table:order</span> <a href="#attribute-table_order">19.685</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:sort-groups&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_4_23_table_subtotal-rule_"><span style="margin-right:0.127cm;">9.4.23</span></a><a id="__RefHeading__1415686_253892949"/><a id="element-table_subtotal-rule"/>&lt;table:subtotal-rule&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:subtotal-rule&gt;</span> element specifies the calculation of subtotals for a row or column. As the container element for <span class="Element">&lt;table:subtotal-field&gt;</span>, the calculation specified by this element may use provisional results in its calculation. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:subtotal-rule&gt;</span> element is usable within the following element: <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:subtotal-rule&gt;</span> element has the following attribute: <span class="Attribute">table:group-by-field-number</span> <a href="#attribute-table_group-by-field-number">19.645</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:subtotal-rule&gt;</span> element has the following child element: <span class="Element">&lt;table:subtotal-field&gt;</span> <a href="#element-table_subtotal-field">9.4.24</a>.</p><h3 class="Heading_20_3"><a id="a9_4_24_table_subtotal-field_"><span style="margin-right:0.127cm;">9.4.24</span></a><a id="__RefHeading__1415688_253892949"/><a id="element-table_subtotal-field"/>&lt;table:subtotal-field&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:subtotal-field&gt;</span> element specifies the field number and the function that is applied to the content of that field to calculate a provisional result.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:subtotal-field&gt;</span> element is usable within the following element: <span class="Element">&lt;table:subtotal-rule&gt;</span> <a href="#element-table_subtotal-rule">9.4.23</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:subtotal-field&gt;</span> element has the following attributes: <span class="Attribute">table:field-number</span> <a href="#attribute-table_field-number">19.637</a> and <span class="Attribute">table:function</span> <a href="#attribute-table_function_element-table_subtotal-field">19.643.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:subtotal-field&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a9_5Filters"><span style="margin-right:0.127cm;">9.5</span></a><a id="__RefHeading__1415690_253892949"/><a id="Database_Ranges"/>Filters</h2><h3 class="Heading_20_3"><a id="a9_5_1General"><span style="margin-right:0.127cm;">9.5.1</span></a><a id="__RefHeading__1415692_253892949"/>General</h3><p class="Text_20_body">Filter element specify conditions that if not met, render portions of a table invisible. </p><h3 class="Heading_20_3"><a id="a9_5_2_table_filter_"><span style="margin-right:0.127cm;">9.5.2</span></a><a id="__RefHeading__1415694_253892949"/><a id="element-table_filter"/>&lt;table:filter&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:filter&gt;</span> element is a container for elements that specify filters for data contained in database ranges or data pilot tables. The filters are applied to all rows in the database range or the data pilot table. Rows where one or more filter conditions do not evaluate to <span class="Attribute_20_Value">true</span> are made invisible.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:filter&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a> and <span class="Element">&lt;table:source-cell-range&gt;</span> <a href="#element-table_source-cell-range">9.6.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:filter&gt;</span> element has the following attributes: <span class="Attribute">table:condition-source</span> <a href="#attribute-table_condition-source">19.597</a>, <span class="Attribute">table:condition-source-range-address</span> <a href="#attribute-table_condition-source-range-address">19.598</a>, <span class="Attribute">table:display-duplicates</span> <a href="#attribute-table_display-duplicates">19.619</a> and <span class="Attribute">table:target-range-address</span> <a href="#attribute-table_target-range-address_element-table_filter">19.731.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:filter&gt;</span> element has the following child elements: <span class="Element">&lt;table:filter-and&gt;</span> <a href="#element-table_filter-and">9.5.3</a>, <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a> and <span class="Element">&lt;table:filter-or&gt;</span> <a href="#element-table_filter-or">9.5.4</a>.</p><h3 class="Heading_20_3"><a id="a9_5_3_table_filter-and_"><span style="margin-right:0.127cm;">9.5.3</span></a><a id="__RefHeading__1415696_253892949"/><a id="element-table_filter-and"/>&lt;table:filter-and&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:filter-and&gt;</span> element specifies that the logical operator AND is applied to conditions specified by the child elements of this element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:filter-and&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a> and <span class="Element">&lt;table:filter-or&gt;</span> <a href="#element-table_filter-or">9.5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:filter-and&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:filter-and&gt;</span> element has the following child elements: <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a> and <span class="Element">&lt;table:filter-or&gt;</span> <a href="#element-table_filter-or">9.5.4</a>.</p><h3 class="Heading_20_3"><a id="a9_5_4_table_filter-or_"><span style="margin-right:0.127cm;">9.5.4</span></a><a id="__RefHeading__1415698_253892949"/><a id="element-table_filter-or"/>&lt;table:filter-or&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:filter-or&gt;</span> element specifies that the logical operator OR is applied to conditions specified by the child elements of this element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:filter-or&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a> and <span class="Element">&lt;table:filter-and&gt;</span> <a href="#element-table_filter-and">9.5.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:filter-or&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:filter-or&gt;</span> element has the following child elements: <span class="Element">&lt;table:filter-and&gt;</span> <a href="#element-table_filter-and">9.5.3</a> and <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>.</p><h3 class="Heading_20_3"><a id="a9_5_5_table_filter-condition_"><span style="margin-right:0.127cm;">9.5.5</span></a><a id="__RefHeading__1415700_253892949"/><a id="element-table_filter-condition"/>&lt;table:filter-condition&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:filter-condition&gt;</span> element specifies a single condition to apply in a filter operation.</p><p class="Text_20_body">The filter condition is either specified</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>by the <span class="Attribute">table:operator</span> <a href="#attribute-table_operator">19.684</a>, <span class="Attribute">table:value</span> <a href="#attribute-table_value">19.747</a> and <span class="Attribute">table:data-type</span> <a href="#attribute-table_data-type">19.611</a> attributes or<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a set of <span class="Element">&lt;table:filter-set-item&gt;</span> <a href="#element-table_filter-set-item">9.5.6</a> child elements as a set of values. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If one or more of <span class="Element">&lt;table:filter-set-item&gt;</span> elements are present as children of the <span class="Element">&lt;table:filter-condition&gt;</span> element, the <span class="Attribute">table:operator</span>, <span class="Attribute">table:value</span> and <span class="Attribute">table:data-type</span> attributes are ignored.</p><p class="Text_20_body"><span class="Label">Note:</span> To improve backward compatibility with OpenDocument 1.1 documents, the following attributes should have these values if <span class="Element">&lt;table:filter-set-item&gt;</span> elements are included: <span class="Attribute">table:operator</span>: "<span class="Attribute_20_Value_20_Instance">=</span>", <span class="Attribute">table:value</span>: value of the first <span class="Element">&lt;table:filter-set-item&gt;</span> child element, <span class="Attribute">table:data-type</span>: "<span class="Attribute_20_Value">text</span>".</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:filter-condition&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>, <span class="Element">&lt;table:filter-and&gt;</span> <a href="#element-table_filter-and">9.5.3</a> and <span class="Element">&lt;table:filter-or&gt;</span> <a href="#element-table_filter-or">9.5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:filter-condition&gt;</span> element has the following attributes: <span class="Attribute">table:case-sensitive</span> <a href="#attribute-table_case-sensitive">19.590</a>, <span class="Attribute">table:data-type</span> <a href="#attribute-table_data-type_element-table_filter-condition">19.611.2</a>, <span class="Attribute">table:field-number</span> <a href="#attribute-table_field-number">19.637</a>, <span class="Attribute">table:operator</span> <a href="#attribute-table_operator">19.684</a> and <span class="Attribute">table:value</span> <a href="#attribute-table_value_element-table_filter-condition">19.747.1</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:filter-condition&gt;</span> element has the following child element: <span class="Element">&lt;table:filter-set-item&gt;</span> <a href="#element-table_filter-set-item">9.5.6</a>.</p><h3 class="Heading_20_3"><a id="a9_5_6_table_filter-set-item_"><span style="margin-right:0.127cm;">9.5.6</span></a><a id="__RefHeading__1415702_253892949"/><a id="element-table_filter-set-item"/>&lt;table:filter-set-item&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:filter-set-item&gt;</span> element specifies a single value used in a filter condition where the <span class="Attribute">table:operator</span> attribute is set to "<span class="Attribute_20_Value_20_Instance">=</span>", and the <span class="Attribute">table:data-type</span> attribute to <span class="Attribute_20_Value">text</span>. The filter sub condition in which the element is included evaluates to true for a specified cell, if, and only if, the value of the cell is equal to one of the values in the set specified by be <span class="Element">&lt;table:filter&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:filter-set-item&gt;</span> element is usable within the following element: <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:filter-set-item&gt;</span> element has the following attribute: <span class="Attribute">table:value</span> <a href="#attribute-table_value_element-table_filter-set-item">19.747.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:filter-set-item&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a9_6Data_Pilot_Tables"><span style="margin-right:0.127cm;">9.6</span></a><a id="__RefHeading__1415704_253892949"/>Data Pilot Tables</h2><h3 class="Heading_20_3"><a id="a9_6_1General"><span style="margin-right:0.127cm;">9.6.1</span></a><a id="__RefHeading__1415706_253892949"/>General</h3><p class="Text_20_body">Data pilot tables enable users to rearrange data from data sources so as to create new relationships between data elements or to view data from a variety of perspectives. This is in contrast to scenario tables <a href="#element-table_scenario">9.2.7</a>, where the data elements remain fixed but the values and operations on them are varied to illustrate different outcomes.</p><p class="Text_20_body">The behavior of a data pilot table is specified by fields, where each field has a name and an orientation. The category columns are specified by fields with the orientation “row” or “column” and data columns are specified by fields that have the orientation “data”.</p><p class="Text_20_body">A third type of fields are data layout fields. Data layout fields are not connected to a column in the source table, but are used to change the layout of the data pilot table.</p><p class="Text_20_body">The order in which fields are specified determines the order in which the data of category columns are grouped and results are displayed.</p><h3 class="Heading_20_3"><a id="a9_6_2_table_data-pilot-tables_"><span style="margin-right:0.127cm;">9.6.2</span></a><a id="__RefHeading__1415708_253892949"/><a id="element-table_data-pilot-tables"/>&lt;table:data-pilot-tables&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-tables&gt;</span> element contains all the data pilot tables within a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-tables&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-tables&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-tables&gt;</span> element has the following child element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><h3 class="Heading_20_3"><a id="a9_6_3_table_data-pilot-table_"><span style="margin-right:0.127cm;">9.6.3</span></a><a id="__RefHeading__1415710_253892949"/><a id="element-table_data-pilot-table"/>&lt;table:data-pilot-table&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-table&gt;</span> element contains the elements that define the sources of a data pilot table. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-table&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-tables&gt;</span> <a href="#element-table_data-pilot-tables">9.6.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-table&gt;</span> element has the following attributes: <span class="Attribute">table:application-data</span> <a href="#attribute-table_application-data">19.584</a>, <span class="Attribute">table:buttons</span> <a href="#attribute-table_buttons">19.589</a>, <span class="Attribute">table:drill-down-on-double-click</span> <a href="#attribute-table_drill-down-on-double-click">19.623</a>, <span class="Attribute">table:grand-total</span> <a href="#attribute-table_grand-total">19.644</a>, <span class="Attribute">table:identify-categories</span> <a href="#attribute-table_identify-categories">19.649</a>, <span class="Attribute">table:ignore-empty-rows</span> <a href="#attribute-table_ignore-empty-rows">19.650</a>, <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_data-pilot-table">19.673.7</a>, <span class="Attribute">table:show-filter-button</span> <a href="#attribute-table_show-filter-button">19.711</a> and <span class="Attribute">table:target-range-address</span> <a href="#attribute-table_target-range-address_element-table_data-pilot-table">19.731.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-table&gt;</span> element has the following child elements: <span class="Element">&lt;table:database-source-query&gt;</span> <a href="#element-table_database-source-query">9.4.18</a>, <span class="Element">&lt;table:database-source-sql&gt;</span> <a href="#element-table_database-source-sql">9.4.16</a>, <span class="Element">&lt;table:database-source-table&gt;</span> <a href="#element-table_database-source-table">9.4.17</a>, <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>, <span class="Element">&lt;table:source-cell-range&gt;</span> <a href="#element-table_source-cell-range">9.6.5</a> and <span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a>.</p><h3 class="Heading_20_3"><a id="a9_6_4Data_Pilot_Table_Source"><span style="margin-right:0.127cm;">9.6.4</span></a><a id="__RefHeading__1415712_253892949"/>Data Pilot Table Source</h3><p class="Text_20_body">The source of a data pilot table is specified by one of the following elements: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:database-source-query&gt;</span> <a href="#element-table_database-source-query">9.4.18</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:database-source-sql&gt;</span> <a href="#element-table_database-source-sql">9.4.16</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:database-source-table&gt;</span> <a href="#element-table_database-source-table">9.4.17</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:source-cell-range&gt;</span> <a href="#element-table_source-cell-range">9.6.5</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a><span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a9_6_5_table_source-cell-range_"><span style="margin-right:0.127cm;">9.6.5</span></a><a id="__RefHeading__1415714_253892949"/><a id="element-table_source-cell-range"/>&lt;table:source-cell-range&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:source-cell-range&gt;</span> element specifies a cell range as a source of data for a data pilot table. A filter may be specified by a <span class="Element">&lt;table:filter&gt;</span> child element that is applied prior to return of data to a data pilot table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:source-cell-range&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:source-cell-range&gt;</span> element has the following attribute: <span class="Attribute">table:cell-range-address</span> <a href="#attribute-table_cell-range-address_element-table_source-cell-range">19.593.9</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:source-cell-range&gt;</span> element has the following child element: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>.</p><h3 class="Heading_20_3"><a id="a9_6_6_table_source-service_"><span style="margin-right:0.127cm;">9.6.6</span></a><a id="__RefHeading__1415716_253892949"/><a id="element-table_source-service"/>&lt;table:source-service&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:source-service&gt;</span> element specifies a service that returns data to a data pilot table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:source-service&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:source-service&gt;</span> element has the following attributes: <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_source-service">19.673.12</a>, <span class="Attribute">table:object-name</span> <a href="#attribute-table_object-name">19.681</a>, <span class="Attribute">table:password</span> <a href="#attribute-table_password">19.690</a>, <span class="Attribute">table:source-name</span> <a href="#attribute-table_source-name">19.715</a> and <span class="Attribute">table:user-name</span> <a href="#attribute-table_user-name">19.746</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:source-service&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_7_table_data-pilot-field_"><span style="margin-right:0.127cm;">9.6.7</span></a><a id="__RefHeading__1415718_253892949"/><a id="element-table_data-pilot-field"/>&lt;table:data-pilot-field&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-field&gt;</span> element specifies a field for a data pilot table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-field&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-field&gt;</span> element has the following attributes: <span class="Attribute">table:function</span> <a href="#attribute-table_function_element-table_data-pilot-field">19.643.3</a>, <span class="Attribute">table:is-data-layout-field</span> <a href="#attribute-table_is-data-layout-field">19.653</a>, <span class="Attribute">table:orientation</span> <a href="#attribute-table_orientation_element-table_data-pilot-field">19.686.2</a>, <span class="Attribute">table:selected-page</span> <a href="#attribute-table_selected-page">19.708</a>, <span class="Attribute">table:source-field-name</span> <a href="#attribute-table_source-field-name">19.714</a> and <span class="Attribute">table:used-hierarchy</span> <a href="#attribute-table_used-hierarchy">19.745</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-field&gt;</span> element has the following child elements: <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> <a href="#element-table_data-pilot-field-reference">9.6.16</a>, <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a> and <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><h3 class="Heading_20_3"><a id="a9_6_8_table_data-pilot-level_"><span style="margin-right:0.127cm;">9.6.8</span></a><a id="__RefHeading__1415720_253892949"/><a id="element-table_data-pilot-level"/>&lt;table:data-pilot-level&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-level&gt;</span> element acts as a container for elements that specify addition information about a data pilot field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-level&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-level&gt;</span> element has the following attribute: <span class="Attribute">table:show-empty</span> <a href="#attribute-table_show-empty">19.710</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-level&gt;</span> element has the following child elements: <span class="Element">&lt;table:data-pilot-display-info&gt;</span> <a href="#element-table_data-pilot-display-info">9.6.13</a>, <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> <a href="#element-table_data-pilot-layout-info">9.6.15</a>, <span class="Element">&lt;table:data-pilot-members&gt;</span> <a href="#element-table_data-pilot-members">9.6.11</a>, <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> <a href="#element-table_data-pilot-sort-info">9.6.14</a> and <span class="Element">&lt;table:data-pilot-subtotals&gt;</span> <a href="#element-table_data-pilot-subtotals">9.6.9</a>.</p><h3 class="Heading_20_3"><a id="a9_6_9_table_data-pilot-subtotals_"><span style="margin-right:0.127cm;">9.6.9</span></a><a id="__RefHeading__1415722_253892949"/><a id="element-table_data-pilot-subtotals"/>&lt;table:data-pilot-subtotals&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-subtotals&gt;</span> element contains the <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> elements for a data pilot table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-subtotals&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-subtotals&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-subtotals&gt;</span> element has the following child element: <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> <a href="#element-table_data-pilot-subtotal">9.6.10</a>.</p><h3 class="Heading_20_3"><a id="a9_6_10_table_data-pilot-subtotal_"><span style="margin-right:0.127cm;">9.6.10</span></a><a id="__RefHeading__1415724_253892949"/><a id="element-table_data-pilot-subtotal"/>&lt;table:data-pilot-subtotal&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> element contains the results of a single subtotal calculation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-subtotals&gt;</span> <a href="#element-table_data-pilot-subtotals">9.6.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> element has the following attribute: <span class="Attribute">table:function</span> <a href="#attribute-table_function_element-table_data-pilot-subtotal">19.643.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_11_table_data-pilot-members_"><span style="margin-right:0.127cm;">9.6.11</span></a><a id="__RefHeading__1415726_253892949"/><a id="element-table_data-pilot-members"/>&lt;table:data-pilot-members&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-members&gt;</span> element specifies whether category columns in data pilot tables or information for category columns is displayed or not.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-members&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-members&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-members&gt;</span> element has the following child element: <span class="Element">&lt;table:data-pilot-member&gt;</span> <a href="#element-table_data-pilot-member">9.6.12</a>.</p><h3 class="Heading_20_3"><a id="a9_6_12_table_data-pilot-member_"><span style="margin-right:0.127cm;">9.6.12</span></a><a id="__RefHeading__1415728_253892949"/><a id="element-table_data-pilot-member"/>&lt;table:data-pilot-member&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-member&gt;</span> element specifies what information is displayed for a member.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-member&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-members&gt;</span> <a href="#element-table_data-pilot-members">9.6.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-member&gt;</span> element has the following attributes: <span class="Attribute">table:display</span> <a href="#attribute-table_display">19.617</a>, <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_data-pilot-member">19.673.6</a> and <span class="Attribute">table:show-details</span> <a href="#attribute-table_show-details">19.709</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-member&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_13_table_data-pilot-display-info_"><span style="margin-right:0.127cm;">9.6.13</span></a><a id="__RefHeading__1415730_253892949"/><a id="element-table_data-pilot-display-info"/>&lt;table:data-pilot-display-info&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element restricts the number rows that are displayed for a category column to a specific number of values of a data field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element has the following attributes: <span class="Attribute">table:data-field</span> <a href="#attribute-table_data-field">19.607</a>, <span class="Attribute">table:display-member-mode</span> <a href="#attribute-table_display-member-mode">19.622</a>, <span class="Attribute">table:enabled</span> <a href="#attribute-table_enabled">19.625</a> and <span class="Attribute">table:member-count</span> <a href="#attribute-table_member-count">19.667</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_14_table_data-pilot-sort-info_"><span style="margin-right:0.127cm;">9.6.14</span></a><a id="__RefHeading__1415732_253892949"/><a id="element-table_data-pilot-sort-info"/>&lt;table:data-pilot-sort-info&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> element specifies how the members of a category column are sorted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> element has the following attributes: <span class="Attribute">table:data-field</span> <a href="#attribute-table_data-field">19.607</a>, <span class="Attribute">table:order</span> <a href="#attribute-table_order">19.685</a>, <span class="Attribute">table:sort-mode</span> <a href="#attribute-table_sort-mode">19.712</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_15_table_data-pilot-layout-info_"><span style="margin-right:0.127cm;">9.6.15</span></a><a id="__RefHeading__1415734_253892949"/><a id="element-table_data-pilot-layout-info"/>&lt;table:data-pilot-layout-info&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> element specifies how to layout a field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> element has the following attributes: <span class="Attribute">table:add-empty-lines</span> <a href="#attribute-table_add-empty-lines">19.582</a> and <span class="Attribute">table:layout-mode</span> <a href="#attribute-table_layout-mode">19.662</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_16_table_data-pilot-field-reference_"><span style="margin-right:0.127cm;">9.6.16</span></a><a id="__RefHeading__1415736_253892949"/><a id="element-table_data-pilot-field-reference"/>&lt;table:data-pilot-field-reference&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> element specifies data which can be used to modify the displayed values of data fields.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> element has the following attributes: <span class="Attribute">table:field-name</span> <a href="#attribute-table_field-name">19.636</a>, <span class="Attribute">table:member-name</span> <a href="#attribute-table_member-name">19.668</a>, <span class="Attribute">table:member-type</span> <a href="#attribute-table_member-type">19.669</a> and <span class="Attribute">table:type</span> <a href="#attribute-table_type_element-table_data-pilot-field-reference">19.735.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_6_17_table_data-pilot-groups_"><span style="margin-right:0.127cm;">9.6.17</span></a><a id="__RefHeading__1415738_253892949"/><a id="element-table_data-pilot-groups"/>&lt;table:data-pilot-groups&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-groups&gt;</span> element specifies that a data pilot field is a group field. A group field allows grouping of other fields.</p><p class="Text_20_body">Grouping may also take place for numeric or date values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-groups&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-groups&gt;</span> element has the following attributes: <span class="Attribute">table:date-end</span> <a href="#attribute-table_date-end">19.612</a>, <span class="Attribute">table:date-start</span> <a href="#attribute-table_date-start">19.613</a>, <span class="Attribute">table:end</span> <a href="#attribute-table_end">19.626</a>, <span class="Attribute">table:grouped-by</span> <a href="#attribute-table_grouped-by">19.646</a>, <span class="Attribute">table:source-field-name</span> <a href="#attribute-table_source-field-name">19.714</a>, <span class="Attribute">table:start</span> <a href="#attribute-table_start">19.717</a> and <span class="Attribute">table:step</span> <a href="#attribute-table_step">19.723</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-groups&gt;</span> element has the following child element: <span class="Element">&lt;table:data-pilot-group&gt;</span> <a href="#element-table_data-pilot-group">9.6.18</a>.</p><h3 class="Heading_20_3"><a id="a9_6_18_table_data-pilot-group_"><span style="margin-right:0.127cm;">9.6.18</span></a><a id="__RefHeading__1415740_253892949"/><a id="element-table_data-pilot-group"/>&lt;table:data-pilot-group&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-group&gt;</span> element specifies names of groups if grouping takes place by specifying the member names.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-group&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-group&gt;</span> element has the following attribute: <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_data-pilot-group">19.673.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-group&gt;</span> element has the following child element: <span class="Element">&lt;table:data-pilot-group-member&gt;</span> <a href="#element-table_data-pilot-group-member">9.6.19</a>.</p><h3 class="Heading_20_3"><a id="a9_6_19_table_data-pilot-group-member_"><span style="margin-right:0.127cm;">9.6.19</span></a><a id="__RefHeading__1415742_253892949"/><a id="element-table_data-pilot-group-member"/>&lt;table:data-pilot-group-member&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:data-pilot-group-member&gt;</span> element specifies the name of a single group member.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:data-pilot-group-member&gt;</span> element is usable within the following element: <span class="Element">&lt;table:data-pilot-group&gt;</span> <a href="#element-table_data-pilot-group">9.6.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:data-pilot-group-member&gt;</span> element has the following attribute: <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_data-pilot-group-member">19.673.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:data-pilot-group-member&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a9_7_table_consolidation_"><span style="margin-right:0.127cm;">9.7</span></a><a id="__RefHeading__1415744_253892949"/><a id="element-table_consolidation"/>&lt;table:consolidation&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;table:consolidation&gt;</span> element defines the consolidation of data from multiple table ranges. Consolidation means that a new table range is filled with values calculated by applying a mathematical function to all cells in the source table ranges that have the same relative address within these ranges. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:consolidation&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:consolidation&gt;</span> element has the following attributes: <span class="Attribute">table:function</span> <a href="#attribute-table_function_element-table_consolidation">19.643.2</a>, <span class="Attribute">table:link-to-source-data</span> <a href="#attribute-table_link-to-source-data">19.663</a>, <span class="Attribute">table:source-cell-range-addresses</span> <a href="#attribute-table_source-cell-range-addresses">19.713</a>, <span class="Attribute">table:target-cell-address</span> <a href="#attribute-table_target-cell-address">19.730</a> and <span class="Attribute">table:use-labels</span> <a href="#attribute-table_use-labels">19.742</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:consolidation&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a9_8_table_dde-links_"><span style="margin-right:0.127cm;">9.8</span></a><a id="__RefHeading__1415746_253892949"/><a id="element-table_dde-links"/>&lt;table:dde-links&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;table:dde-links&gt;</span> container element stores all DDE links for use in spreadsheet formulas. Every link contains the DDE Source and the data of the last connection.</p><p class="Text_20_body">See <a href="#DDE_Connections">14.6</a> for the use of DDE connections.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:dde-links&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:dde-links&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:dde-links&gt;</span> element has the following child element: <span class="Element">&lt;table:dde-link&gt;</span> <a href="#element-table_dde-link">14.6.4</a>.</p><h2 class="Heading_20_2"><a id="a9_9Change_Tracking_in_Spreadsheets"><span style="margin-right:0.127cm;">9.9</span></a><a id="__RefHeading__1415748_253892949"/>Change Tracking in Spreadsheets</h2><h3 class="Heading_20_3"><a id="a9_9_1General"><span style="margin-right:0.127cm;">9.9.1</span></a><a id="__RefHeading__1415750_253892949"/>General </h3><p class="Text_20_body">All changes that have been applied to a spreadsheet document are stored in a list. The list contains an element for each change made to the table. </p><h3 class="Heading_20_3"><a id="a9_9_2_table_tracked-changes_"><span style="margin-right:0.127cm;">9.9.2</span></a><a id="__RefHeading__1415752_253892949"/><a id="element-table_tracked-changes"/>&lt;table:tracked-changes&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:tracked-changes&gt;</span> element is a container for tracked changes of a spreadsheet. Its presence further enables change tracking for a spreadsheet.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:tracked-changes&gt;</span> element is usable within the following element: <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:tracked-changes&gt;</span> element has the following attribute: <span class="Attribute">table:track-changes</span> <a href="#attribute-table_track-changes">19.734</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:tracked-changes&gt;</span> element has the following child elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a> and <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><h3 class="Heading_20_3"><a id="a9_9_3_table_insertion_"><span style="margin-right:0.127cm;">9.9.3</span></a><a id="__RefHeading__1415754_253892949"/><a id="element-table_insertion"/>&lt;table:insertion&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:insertion&gt;</span> element contains the information that identifies any insertion of content. This content can be one or more rows, one or more columns, or a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:insertion&gt;</span> element is usable within the following element: <span class="Element">&lt;table:tracked-changes&gt;</span> <a href="#element-table_tracked-changes">9.9.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:insertion&gt;</span> element has the following attributes: <span class="Attribute">table:acceptance-state</span> <a href="#attribute-table_acceptance-state">19.580</a>, <span class="Attribute">table:count</span> <a href="#attribute-table_count">19.605</a>, <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a>, <span class="Attribute">table:position</span> <a href="#attribute-table_position">19.691</a>, <span class="Attribute">table:rejecting-change-id</span> <a href="#attribute-table_rejecting-change-id">19.702</a>, <span class="Attribute">table:table</span> <a href="#attribute-table_table">19.727</a> and <span class="Attribute">table:type</span> <a href="#attribute-table_type_element-table_insertion">19.735.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:insertion&gt;</span> element has the following child elements: <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>, <span class="Element">&lt;table:deletions&gt;</span> <a href="#element-table_deletions">9.9.6</a> and <span class="Element">&lt;table:dependencies&gt;</span> <a href="#element-table_dependencies">9.9.4</a>.</p><h3 class="Heading_20_3"><a id="a9_9_4_table_dependencies_"><span style="margin-right:0.127cm;">9.9.4</span></a><a id="__RefHeading__1415756_253892949"/><a id="element-table_dependencies"/>&lt;table:dependencies&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:dependencies&gt;</span> element contains the information on which other tracked changes a tracked change depends. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:dependencies&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a> and <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:dependencies&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:dependencies&gt;</span> element has the following child element: <span class="Element">&lt;table:dependency&gt;</span> <a href="#element-table_dependency">9.9.5</a>.</p><h3 class="Heading_20_3"><a id="a9_9_5_table_dependency_"><span style="margin-right:0.127cm;">9.9.5</span></a><a id="__RefHeading__1415758_253892949"/><a id="element-table_dependency"/>&lt;table:dependency&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:dependency&gt;</span> element contains the information about one change action on which its parent element depends. The change action on which the current change depends is referenced by its <span class="Attribute">table:id</span> attribute</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:dependency&gt;</span> element is usable within the following element: <span class="Element">&lt;table:dependencies&gt;</span> <a href="#element-table_dependencies">9.9.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:dependency&gt;</span> element has the following attribute: <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:dependency&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_6_table_deletions_"><span style="margin-right:0.127cm;">9.9.6</span></a><a id="__RefHeading__1415760_253892949"/><a id="element-table_deletions"/>&lt;table:deletions&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:deletions&gt;</span> element contains all deletions which are performed while tracking a single change to a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:deletions&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a> and <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:deletions&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:deletions&gt;</span> element has the following child elements: <span class="Element">&lt;table:cell-content-deletion&gt;</span> <a href="#element-table_cell-content-deletion">9.9.7</a> and <span class="Element">&lt;table:change-deletion&gt;</span> <a href="#element-table_change-deletion">9.9.8</a>.</p><h3 class="Heading_20_3"><a id="a9_9_7_table_cell-content-deletion_"><span style="margin-right:0.127cm;">9.9.7</span></a><a id="__RefHeading__1415762_253892949"/><a id="element-table_cell-content-deletion"/>&lt;table:cell-content-deletion&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:cell-content-deletion&gt;</span> element specifies that a cell content has been deleted. It contains the address of the effected cell and its former content. If a <span class="Attribute">table:id</span> attribute is present, it specifies the id of a previously tracked change for the cell that gets deleted by the current change.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:cell-content-deletion&gt;</span> element is usable within the following element: <span class="Element">&lt;table:deletions&gt;</span> <a href="#element-table_deletions">9.9.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:cell-content-deletion&gt;</span> element has the following attribute: <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:cell-content-deletion&gt;</span> element has the following child elements: <span class="Element">&lt;table:cell-address&gt;</span> <a href="#element-table_cell-address">9.9.18</a> and <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>.</p><h3 class="Heading_20_3"><a id="a9_9_8_table_change-deletion_"><span style="margin-right:0.127cm;">9.9.8</span></a><a id="__RefHeading__1415764_253892949"/><a id="element-table_change-deletion"/>&lt;table:change-deletion&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:change-deletion&gt;</span> element specifies the value of the <span class="Attribute">table:id</span> of a previously tracked change that is deleted by the current change.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:change-deletion&gt;</span> element is usable within the following element: <span class="Element">&lt;table:deletions&gt;</span> <a href="#element-table_deletions">9.9.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:change-deletion&gt;</span> element has the following attribute: <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:change-deletion&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_9_table_deletion_"><span style="margin-right:0.127cm;">9.9.9</span></a><a id="__RefHeading__1415766_253892949"/><a id="element-table_deletion"/>&lt;table:deletion&gt;</h3><p class="Text_20_body">A <span class="Element">&lt;table:deletion&gt;</span> element contains content that was deleted while change tracking was enabled. The content of a cell that was deleted is contained in either a <span class="Element">&lt;table:dependencies&gt;</span>, or a <span class="Element">&lt;table:deletions&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:deletion&gt;</span> element is usable within the following element: <span class="Element">&lt;table:tracked-changes&gt;</span> <a href="#element-table_tracked-changes">9.9.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:deletion&gt;</span> element has the following attributes: <span class="Attribute">table:acceptance-state</span> <a href="#attribute-table_acceptance-state">19.580</a>, <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a>, <span class="Attribute">table:multi-deletion-spanned</span> <a href="#attribute-table_multi-deletion-spanned">19.672</a>, <span class="Attribute">table:position</span> <a href="#attribute-table_position">19.691</a>, <span class="Attribute">table:rejecting-change-id</span> <a href="#attribute-table_rejecting-change-id">19.702</a>, <span class="Attribute">table:table</span> <a href="#attribute-table_table">19.727</a> and <span class="Attribute">table:type</span> <a href="#attribute-table_type_element-table_deletion">19.735.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:deletion&gt;</span> element has the following child elements: <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>, <span class="Element">&lt;table:cut-offs&gt;</span> <a href="#element-table_cut-offs">9.9.10</a>, <span class="Element">&lt;table:deletions&gt;</span> <a href="#element-table_deletions">9.9.6</a> and <span class="Element">&lt;table:dependencies&gt;</span> <a href="#element-table_dependencies">9.9.4</a>.</p><h3 class="Heading_20_3"><a id="a9_9_10_table_cut-offs_"><span style="margin-right:0.127cm;">9.9.10</span></a><a id="__RefHeading__1415768_253892949"/><a id="element-table_cut-offs"/>&lt;table:cut-offs&gt;</h3><p class="Text_20_body">A <span class="Element">&lt;table:cut-offs&gt;</span> element contains elements that specify the location of tracked but deleted insertions or movements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:cut-offs&gt;</span> element is usable within the following element: <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:cut-offs&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:cut-offs&gt;</span> element has the following child elements: <span class="Element">&lt;table:insertion-cut-off&gt;</span> <a href="#element-table_insertion-cut-off">9.9.11</a>, <span class="Element">&lt;table:movement-cut-off&gt;</span> <a href="#element-table_movement-cut-off">9.9.12</a>.</p><h3 class="Heading_20_3"><a id="a9_9_11_table_insertion-cut-off_"><span style="margin-right:0.127cm;">9.9.11</span></a><a id="__RefHeading__1415770_253892949"/><a id="element-table_insertion-cut-off"/>&lt;table:insertion-cut-off&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:insertion-cut-off&gt;</span> element specifies where an insertion was deleted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:insertion-cut-off&gt;</span> element is usable within the following element: <span class="Element">&lt;table:cut-offs&gt;</span> <a href="#element-table_cut-offs">9.9.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:insertion-cut-off&gt;</span> element has the following attributes: <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a> and <span class="Attribute">table:position</span> <a href="#attribute-table_position">19.691</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:insertion-cut-off&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_12_table_movement-cut-off_"><span style="margin-right:0.127cm;">9.9.12</span></a><a id="__RefHeading__1415772_253892949"/><a id="element-table_movement-cut-off"/>&lt;table:movement-cut-off&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:movement-cut-off&gt;</span> element specifies the deletion of a movement.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:movement-cut-off&gt;</span> element is usable within the following element: <span class="Element">&lt;table:cut-offs&gt;</span> <a href="#element-table_cut-offs">9.9.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:movement-cut-off&gt;</span> element has the following attributes: <span class="Attribute">table:end-position</span> <a href="#attribute-table_end-position">19.629</a>, <span class="Attribute">table:position</span> <a href="#attribute-table_position">19.691</a> and <span class="Attribute">table:start-position</span> <a href="#attribute-table_start-position">19.719</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:movement-cut-off&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_13_table_movement_"><span style="margin-right:0.127cm;">9.9.13</span></a><a id="__RefHeading__1415774_253892949"/><a id="element-table_movement"/>&lt;table:movement&gt;</h3><p class="Text_20_body">A <span class="Element">&lt;table:movement&gt;</span> element specifies the information that identifies movement of content. This content can be a cell content or a cell range content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:movement&gt;</span> element is usable within the following element: <span class="Element">&lt;table:tracked-changes&gt;</span> <a href="#element-table_tracked-changes">9.9.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:movement&gt;</span> element has the following attributes: <span class="Attribute">table:acceptance-state</span> <a href="#attribute-table_acceptance-state">19.580</a>, <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a> and <span class="Attribute">table:rejecting-change-id</span> <a href="#attribute-table_rejecting-change-id">19.702</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:movement&gt;</span> element has the following child elements: <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>, <span class="Element">&lt;table:deletions&gt;</span> <a href="#element-table_deletions">9.9.6</a>, <span class="Element">&lt;table:dependencies&gt;</span> <a href="#element-table_dependencies">9.9.4</a>, <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><h3 class="Heading_20_3"><a id="a9_9_14_table_source-range-address_"><span style="margin-right:0.127cm;">9.9.14</span></a><a id="__RefHeading__1415776_253892949"/><a id="element-table_source-range-address"/>&lt;table:source-range-address&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:source-range-address&gt;</span> element specifies the source or cell range address of a movement.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:source-range-address&gt;</span> element is usable within the following element: <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:source-range-address&gt;</span> element has the following attributes: <span class="Attribute">table:column</span> <a href="#attribute-table_column">19.594</a>, <span class="Attribute">table:end-column</span> <a href="#attribute-table_end-column">19.628</a>, <span class="Attribute">table:end-row</span> <a href="#attribute-table_end-row">19.630</a>, <span class="Attribute">table:end-table</span> <a href="#attribute-table_end-table">19.631</a>, <span class="Attribute">table:row</span> <a href="#attribute-table_row">19.704</a>, <span class="Attribute">table:start-column</span> <a href="#attribute-table_start-column">19.718</a>, <span class="Attribute">table:start-row</span> <a href="#attribute-table_start-row">19.720</a>, <span class="Attribute">table:start-table</span> <a href="#attribute-table_start-table">19.721</a> and <span class="Attribute">table:table</span> <a href="#attribute-table_table">19.727</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:source-range-address&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_15_table_target-range-address_"><span style="margin-right:0.127cm;">9.9.15</span></a><a id="__RefHeading__1415778_253892949"/><a id="element-table_target-range-address"/>&lt;table:target-range-address&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:target-range-address&gt;</span> element specifies the target cell address or cell range address of a movement.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:target-range-address&gt;</span> element is usable within the following element: <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:target-range-address&gt;</span> element has the following attributes: <span class="Attribute">table:column</span> <a href="#attribute-table_column">19.594</a>, <span class="Attribute">table:end-column</span> <a href="#attribute-table_end-column">19.628</a>, <span class="Attribute">table:end-row</span> <a href="#attribute-table_end-row">19.630</a>, <span class="Attribute">table:end-table</span> <a href="#attribute-table_end-table">19.631</a>, <span class="Attribute">table:row</span> <a href="#attribute-table_row">19.704</a>, <span class="Attribute">table:start-column</span> <a href="#attribute-table_start-column">19.718</a>, <span class="Attribute">table:start-row</span> <a href="#attribute-table_start-row">19.720</a>, <span class="Attribute">table:start-table</span> <a href="#attribute-table_start-table">19.721</a> and <span class="Attribute">table:table</span> <a href="#attribute-table_table">19.727</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:target-range-address&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_16_table_change-track-table-cell_"><span style="margin-right:0.127cm;">9.9.16</span></a><a id="__RefHeading__1415780_253892949"/><a id="element-table_change-track-table-cell"/>&lt;table:change-track-table-cell&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:change-track-table-cell&gt;</span> element specifies the information that tracks changes to a table cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:change-track-table-cell&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:cell-content-deletion&gt;</span> <a href="#element-table_cell-content-deletion">9.9.7</a> and <span class="Element">&lt;table:previous&gt;</span> <a href="#element-table_previous">9.9.19</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:change-track-table-cell&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>, <span class="Attribute">table:cell-address</span> <a href="#attribute-table_cell-address">19.591</a>, <span class="Attribute">table:formula</span> <a href="#attribute-table_formula">19.642</a>, <span class="Attribute">table:matrix-covered</span> <a href="#attribute-table_matrix-covered">19.665</a>, <span class="Attribute">table:number-matrix-columns-spanned</span> <a href="#attribute-table_number-matrix-columns-spanned">19.679</a> and <span class="Attribute">table:number-matrix-rows-spanned</span> <a href="#attribute-table_number-matrix-rows-spanned">19.680</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:change-track-table-cell&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a9_9_17_table_cell-content-change_"><span style="margin-right:0.127cm;">9.9.17</span></a><a id="__RefHeading__1415782_253892949"/><a id="element-table_cell-content-change"/>&lt;table:cell-content-change&gt;</h3><p class="Text_20_body">A <span class="Element">&lt;table:cell-content-change&gt;</span> element specifies the information that identifies changes of the cell content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:cell-content-change&gt;</span> element is usable within the following element: <span class="Element">&lt;table:tracked-changes&gt;</span> <a href="#element-table_tracked-changes">9.9.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:cell-content-change&gt;</span> element has the following attributes: <span class="Attribute">table:acceptance-state</span> <a href="#attribute-table_acceptance-state">19.580</a>, <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a> and <span class="Attribute">table:rejecting-change-id</span> <a href="#attribute-table_rejecting-change-id">19.702</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:cell-content-change&gt;</span> element has the following child elements: <span class="Element">&lt;office:change-info&gt;</span> <a href="#element-office_change-info">5.5.6</a>, <span class="Element">&lt;table:cell-address&gt;</span> <a href="#element-table_cell-address">9.9.18</a>, <span class="Element">&lt;table:deletions&gt;</span> <a href="#element-table_deletions">9.9.6</a>, <span class="Element">&lt;table:dependencies&gt;</span> <a href="#element-table_dependencies">9.9.4</a> and <span class="Element">&lt;table:previous&gt;</span> <a href="#element-table_previous">9.9.19</a>.</p><h3 class="Heading_20_3"><a id="a9_9_18_table_cell-address_"><span style="margin-right:0.127cm;">9.9.18</span></a><a id="__RefHeading__1415784_253892949"/><a id="element-table_cell-address"/>&lt;table:cell-address&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:cell-address&gt;</span> element contains the address of a cell that has changed. Unlike other cell addresses, the cell address consists of the row, column and table number of the cell. This allows specifying addresses that are outside a valid cell address range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:cell-address&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a> and <span class="Element">&lt;table:cell-content-deletion&gt;</span> <a href="#element-table_cell-content-deletion">9.9.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:cell-address&gt;</span> element has the following attributes: <span class="Attribute">table:column</span> <a href="#attribute-table_column">19.594</a>, <span class="Attribute">table:row</span> <a href="#attribute-table_row">19.704</a> and <span class="Attribute">table:table</span> <a href="#attribute-table_table">19.727</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:cell-address&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a9_9_19_table_previous_"><span style="margin-right:0.127cm;">9.9.19</span></a><a id="__RefHeading__1415786_253892949"/><a id="element-table_previous"/>&lt;table:previous&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:previous&gt;</span> element contains the previous cell content which is overwritten by the current change. If a <span class="Attribute">table:id</span> attribute is present, it specifies the id of a previously tracked change for the cell that is changed again by the current change.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:previous&gt;</span> element is usable within the following element: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:previous&gt;</span> element has the following attribute: <span class="Attribute">table:id</span> <a href="#attribute-table_id">19.648</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:previous&gt;</span> element has the following child element: <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>.</p><h1 class="Heading_20_1"><a id="a10Graphic_Content"><span style="margin-right:0.127cm;">10</span></a><a id="__RefHeading__1415788_253892949"/><a id="Graphic_Content_Content"/>Graphic Content</h1><h2 class="Heading_20_2"><a id="a10_1General"><span style="margin-right:0.127cm;">10.1</span></a><a id="__RefHeading__1415790_253892949"/>General</h2><p class="Text_20_body">This chapter specifies the elements that represent graphic objects and elements used in the representation of graphical objects. </p><h2 class="Heading_20_2"><a id="a10_2Enhanced_Page_Features_for_Graphical_Applications"><span style="margin-right:0.127cm;">10.2</span></a><a id="__RefHeading__1415792_253892949"/>Enhanced Page Features for Graphical Applications</h2><h3 class="Heading_20_3"><a id="a10_2_1_style_handout-master_"><span style="margin-right:0.127cm;">10.2.1</span></a><a id="__RefHeading__1415794_253892949"/><a id="element-style_handout-master"/>&lt;style:handout-master&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;style:handout-master&gt;</span> element represents a template for the generation of handout pages.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:handout-master&gt;</span> element is usable within the following element: <span class="Element">&lt;office:master-styles&gt;</span> <a href="#element-office_master-styles">3.15.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:handout-master&gt;</span> element has the following attributes: <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-style_handout-master">19.219.26</a>, <span class="Attribute">presentation:presentation-page-layout-name</span> <a href="#attribute-presentation_presentation-page-layout-name">19.409</a>, <span class="Attribute">presentation:use-date-time-name</span> <a href="#attribute-presentation_use-date-time-name">19.424</a>, <span class="Attribute">presentation:use-footer-name</span> <a href="#attribute-presentation_use-footer-name">19.425</a>, <span class="Attribute">presentation:use-header-name</span> <a href="#attribute-presentation_use-header-name">19.426</a> and <span class="Attribute">style:page-layout-name</span> <a href="#attribute-style_page-layout-name">19.504</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:handout-master&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><h3 class="Heading_20_3"><a id="a10_2_2_draw_layer-set_"><span style="margin-right:0.127cm;">10.2.2</span></a><a id="__RefHeading__1415796_253892949"/><a id="element-draw_layer-set"/>&lt;draw:layer-set&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:layer-set&gt;</span> element defines a set of layers. If placed inside a <span class="Element">&lt;style:master-page&gt;</span> or <span class="Element">&lt;draw:page&gt;</span> element it defines a set of layers for that page. If placed inside the <span class="Element">&lt;office:master-styles&gt;</span> element it defines a set of layers for all pages that do not have their own set of layers.</p><p class="Text_20_body">Layers group drawing objects. Assigning a shape to a layer does not change its rendering order as defined by its <span class="Attribute">draw:z-index</span> attribute. <a href="#attribute-draw_z-index">19.231</a></p><p class="Text_20_body">The <span class="Element">&lt;draw:layer-set&gt;</span> schema element contains a set of <span class="Element">&lt;draw:layer&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:layer-set&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;office:master-styles&gt;</span> <a href="#element-office_master-styles">3.15.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:layer-set&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:layer-set&gt;</span> element has the following child element: <span class="Element">&lt;draw:layer&gt;</span> <a href="#element-draw_layer">10.2.3</a>.</p><h3 class="Heading_20_3"><a id="a10_2_3_draw_layer_"><span style="margin-right:0.127cm;">10.2.3</span></a><a id="__RefHeading__1415798_253892949"/><a id="element-draw_layer"/>&lt;draw:layer&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:layer&gt;</span> element defines a single layer. Layers group drawing objects. </p><p class="Text_20_body"> Each drawing object inside a drawing or presentation document can be assigned to a layer. Each object that is assigned to a layer inherits the settings of that layer. Drawing objects may be assigned to these layers by the value of their <span class="Attribute">draw:layer</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:layer&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:layer-set&gt;</span> <a href="#element-draw_layer-set">10.2.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:layer&gt;</span> element has the following attributes: <span class="Attribute">draw:display</span> <a href="#attribute-draw_display">19.132</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_layer">19.197.14</a> and <span class="Attribute">draw:protected</span> <a href="#attribute-draw_protected">19.207</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:layer&gt;</span> element has the following child elements: <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h3 class="Heading_20_3"><a id="a10_2_4_draw_page_"><span style="margin-right:0.127cm;">10.2.4</span></a><a id="__RefHeading__1415800_253892949"/><a id="element-draw_page"/>&lt;draw:page&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:page&gt;</span> element is a container for content in a drawing or presentation document. This element is used for the following:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Layers <a href="#element-draw_layer-set">10.2.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Forms <a href="#element-office_forms">13.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Drawing Objects <a href="#drawing_shapes_section">10.3</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Frames <a href="#Frames">10.4</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Presentation Animations <a href="#SMIL_Pres_Anim">10.9</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Presentation Notes <a href="#element-presentation_notes">16.17</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:page&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a> and <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:page&gt;</span> element has the following attributes: <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_page">19.187.3</a>, <span class="Attribute">draw:master-page-name</span> <a href="#attribute-draw_master-page-name">19.194</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_page">19.197.19</a>, <span class="Attribute">draw:nav-order</span> <a href="#attribute-draw_nav-order">19.198</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_page">19.219.17</a>, <span class="Attribute">presentation:presentation-page-layout-name</span> <a href="#attribute-presentation_presentation-page-layout-name">19.409</a>, <span class="Attribute">presentation:use-date-time-name</span> <a href="#attribute-presentation_use-date-time-name">19.424</a>, <span class="Attribute">presentation:use-footer-name</span> <a href="#attribute-presentation_use-footer-name">19.425</a>, <span class="Attribute">presentation:use-header-name</span> <a href="#attribute-presentation_use-header-name">19.426</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:page&gt;</span> element has the following child elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a>, <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:layer-set&gt;</span> <a href="#element-draw_layer-set">10.2.2</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>, <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h3 class="Heading_20_3"><a id="a10_2_5_draw_equation_"><span style="margin-right:0.127cm;">10.2.5</span></a><a id="__RefHeading__1415802_253892949"/><a id="element-draw_equation"/>&lt;draw:equation&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:equation&gt;</span> element specifies a formula for the calculation of a value and the name by which that formula can be referenced.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:equation&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:equation&gt;</span> element has the following attributes: <span class="Attribute">draw:formula</span> <a href="#attribute-draw_formula">19.171</a> and <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_equation">19.197.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:equation&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a10_3Drawing_Shapes"><span style="margin-right:0.127cm;">10.3</span></a><a id="__RefHeading__1415804_253892949"/><a id="drawing_shapes_section"/>Drawing Shapes</h2><h3 class="Heading_20_3"><a id="a10_3_1General"><span style="margin-right:0.127cm;">10.3.1</span></a><a id="__RefHeading__1415806_253892949"/>General</h3><p class="Text_20_body">This section defines graphical objects that may occur within all types of documents.</p><h3 class="Heading_20_3"><a id="a10_3_2_draw_rect_"><span style="margin-right:0.127cm;">10.3.2</span></a><a id="__RefHeading__1415808_253892949"/><a id="element-draw_rect"/>&lt;draw:rect&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:rect&gt;</span> element represents a rectangular drawing shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:rect&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:rect&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:corner-radius</span> <a href="#attribute-draw_corner-radius">19.127</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_rect">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_rect">19.197.25</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_rect">19.219.22</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_rect">19.539.8</a>, <span class="Attribute">svg:rx</span> <a href="#attribute-svg_rx">19.550</a>, <span class="Attribute">svg:ry</span> <a href="#attribute-svg_ry">19.551</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_rect">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_rect">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_rect">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:rect&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_3_draw_line_"><span style="margin-right:0.127cm;">10.3.3</span></a><a id="__RefHeading__1415810_253892949"/><a id="element-draw_line"/>&lt;draw:line&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:line&gt;</span> element represents a line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:line&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-</span><span class="Element">page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:line&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_line">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_line">19.197.15</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_line">19.219.15</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:x1</span> <a href="#attribute-svg_x1_element-draw_line">19.574.1</a>, <span class="Attribute">svg:x2</span> <a href="#attribute-svg_x2_element-draw_line">19.575.1</a>, <span class="Attribute">svg:y1</span> <a href="#attribute-svg_y1_element-draw_line">19.578.1</a>, <span class="Attribute">svg:y2</span> <a href="#attribute-svg_y2_element-draw_line">19.579.1</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:line&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_4_draw_polyline_"><span style="margin-right:0.127cm;">10.3.4</span></a><a id="__RefHeading__1415812_253892949"/><a id="element-draw_polyline"/>&lt;draw:polyline&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:polyline&gt;</span> element represents a polyline drawing shape.</p><p class="Text_20_body">Consumers may ignore <span class="Attribute">svg:height</span> and <span class="Attribute">svg:width</span> attributes, and determine the size of a shape from the polygon vertices.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:polyline&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:polyline&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_polyline">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_polyline">19.197.24</a>, <span class="Attribute">draw:points</span> <a href="#attribute-draw_points">19.206</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_polyline">19.219.21</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_polyline">19.539.8</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_polyline">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_polyline">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_polyline">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:polyline&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_5_draw_polygon_"><span style="margin-right:0.127cm;">10.3.5</span></a><a id="__RefHeading__1415814_253892949"/><a id="element-draw_polygon"/>&lt;draw:polygon&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:polygon&gt;</span> element represents a polygon. A polygon is a closed set of straight lines.</p><p class="Text_20_body">Consumers may ignore <span class="Attribute">svg:height</span> and <span class="Attribute">svg:width</span> attributes, and determine the size of a shape from the polygon vertices.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:polygon&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:polygon&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_polygon">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_polygon">19.197.23</a>, <span class="Attribute">draw:points</span> <a href="#attribute-draw_points">19.206</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_polygon">19.219.20</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_polygon">19.539.8</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_polygon">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_polygon">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_polygon">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:polygon&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_6_draw_regular-polygon_"><span style="margin-right:0.127cm;">10.3.6</span></a><a id="__RefHeading__1415816_253892949"/><a id="element-draw_regular-polygon"/>&lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:regular-polygon&gt;</span> element represents a regular polygon. A regular polygon is a polygon that is specified by its number of edges (that is equal to the number of its corners), rather than by arbitrary points.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:regular-polygon&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:regular-polygon&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:concave</span> <a href="#attribute-draw_concave">19.123</a>, <span class="Attribute">draw:corners</span> <a href="#attribute-draw_corners">19.128</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_regular-polygon">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_regular-polygon">19.197.26</a>, <span class="Attribute">draw:sharpness</span> <a href="#attribute-draw_sharpness">19.211</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_regular-polygon">19.219.23</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_regular-polygon">19.539.8</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_regular-polygon">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_regular-polygon">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_regular-polygon">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:regular-polygon&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_7_draw_path_"><span style="margin-right:0.127cm;">10.3.7</span></a><a id="__RefHeading__1415818_253892949"/><a id="element-draw_path"/>&lt;draw:path&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:path&gt;</span> element represents a path. A path is a shape with a user-defined outline. The outline is defined by the <span class="Attribute">svg:d</span> attribute. <a href="#attribute-svg_d">19.526</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:path&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:path&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_path">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_path">19.197.22</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_path">19.219.19</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_path">19.539.8</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_path">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_path">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_path">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:path&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_8_draw_circle_"><span style="margin-right:0.127cm;">10.3.8</span></a><a id="__RefHeading__1415820_253892949"/><a id="element-draw_circle"/>&lt;draw:circle&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:circle&gt;</span> element represents a circular drawing shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:circle&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:circle&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:end-angle</span> <a href="#attribute-draw_end-angle">19.140</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_circle">19.187.3</a>, <span class="Attribute">draw:kind</span> <a href="#attribute-draw_kind">19.188</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_circle">19.197.3</a>, <span class="Attribute">draw:start-angle</span> <a href="#attribute-draw_start-angle">19.213</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_circle">19.219.8</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:cx</span> <a href="#attribute-svg_cx_element-draw_circle">19.524.2</a>, <span class="Attribute">svg:cy</span> <a href="#attribute-svg_cy_element-draw_circle">19.525.2</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_circle">19.539.8</a>, <span class="Attribute">svg:r</span> <a href="#attribute-svg_r_element-draw_circle">19.549.2</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_circle">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_circle">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_circle">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:circle&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_9_draw_ellipse_"><span style="margin-right:0.127cm;">10.3.9</span></a><a id="__RefHeading__1415822_253892949"/><a id="element-draw_ellipse"/>&lt;draw:ellipse&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:ellipse&gt;</span> element represents an ellipse.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:ellipse&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:ellipse&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:end-angle</span> <a href="#attribute-draw_end-angle">19.140</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_ellipse">19.187.3</a>, <span class="Attribute">draw:kind</span> <a href="#attribute-draw_kind">19.188</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_ellipse">19.197.7</a>, <span class="Attribute">draw:start-angle</span> <a href="#attribute-draw_start-angle">19.213</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_ellipse">19.219.12</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:cx</span> <a href="#attribute-svg_cx_element-draw_ellipse">19.524.3</a>, <span class="Attribute">svg:cy</span> <a href="#attribute-svg_cy_element-draw_ellipse">19.525.3</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_ellipse">19.539.8</a>, <span class="Attribute">svg:rx</span> <a href="#attribute-svg_rx">19.550</a>, <span class="Attribute">svg:ry</span> <a href="#attribute-svg_ry">19.551</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_ellipse">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_ellipse">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_ellipse">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:ellipse&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_10_draw_connector_"><span style="margin-right:0.127cm;">10.3.10</span></a><a id="__RefHeading__1415824_253892949"/><a id="element-draw_connector"/>&lt;draw:connector&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:connector&gt;</span> element represents a connected set of one or more lines that visually connects a start and an end point. </p><p class="Text_20_body">Start and/or end points can be defined by references to glue points <a href="#element-draw_glue-point">10.3.16</a> or as absolute positions.  The connector's geometric path is defined by the <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a> attribute. Consumers may also compute the connector's geometric path considering the <span class="Attribute">draw:type</span> <a href="#attribute-draw_type_element-draw_connector">19.229.2</a> and <span class="Attribute">draw:line-skew</span> <a href="#attribute-draw_line-skew">19.190</a> attributes, and the formatting properties defined for connectors.</p><p class="Note">If the <span class="Attribute">svg:d</span> attribute is not present, the connector's geometric path is implementation-dependent. Producers should export the connector's geometric path using the <span class="Attribute">svg:d</span> attribute.</p><p class="Note"><span class="Note_20_Label">Note:</span> This assists consumers that are not capable of computing a connector path.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:connector&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:connector&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:end-glue-point</span> <a href="#attribute-draw_end-glue-point">19.142</a>, <span class="Attribute">draw:end-shape</span> <a href="#attribute-draw_end-shape">19.144</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_connector">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:line-skew</span> <a href="#attribute-draw_line-skew">19.190</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_connector">19.197.4</a>, <span class="Attribute">draw:start-glue-point</span> <a href="#attribute-draw_start-glue-point">19.215</a>, <span class="Attribute">draw:start-shape</span> <a href="#attribute-draw_start-shape">19.217</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_connector">19.219.9</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:type</span> <a href="#attribute-draw_type_element-draw_connector">19.229.2</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>, <span class="Attribute">svg:x1</span> <a href="#attribute-svg_x1_element-draw_connector">19.574.1</a>, <span class="Attribute">svg:x2</span> <a href="#attribute-svg_x2_element-draw_connector">19.575.1</a>, <span class="Attribute">svg:y1</span> <a href="#attribute-svg_y1_element-draw_connector">19.578.1</a>, <span class="Attribute">svg:y2</span> <a href="#attribute-svg_y2_element-draw_connector">19.579.1</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:connector&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_11_draw_caption_"><span style="margin-right:0.127cm;">10.3.11</span></a><a id="__RefHeading__1415826_253892949"/><a id="element-draw_caption"/>&lt;draw:caption&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:caption&gt;</span> element represents a description attached to a fixed point. It consists of rectangular drawing shape with an additional set of connected lines that connect the rectangle with the fixed point.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:caption&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:caption&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:caption-point-x</span> <a href="#attribute-draw_caption-point-x">19.116</a>, <span class="Attribute">draw:caption-point-y</span> <a href="#attribute-draw_caption-point-y">19.117</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:corner-radius</span> <a href="#attribute-draw_corner-radius">19.127</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_caption">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_caption">19.197.2</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_caption">19.219.7</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_caption">19.539.8</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_caption">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_caption">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_caption">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:caption&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_12_draw_measure_"><span style="margin-right:0.127cm;">10.3.12</span></a><a id="__RefHeading__1415828_253892949"/><a id="element-draw_measure"/>&lt;draw:measure&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:measure&gt;</span> element represents a shape that is used to measure distances in drawings.</p><p class="Text_20_body">A measure shape consists of two parallel lines, called <span class="Def">extension lines</span>, and a line perpendicular to the extension lines, called a <span class="Def">dimension line</span>. The dimension line has arrows at its endpoints. It is displayed between the extension lines and terminated by them. </p><p class="Text_20_body">The positions of extension lines and the dimension line are determined by two reference points, called <span class="Def">start</span> and <span class="Def">end reference points</span>.</p><p class="Text_20_body">The <span class="Attribute">draw:line-distance</span> style attribute defines the distance between the (virtual) line between the reference points, called <span class="Def">reference line</span>, and the dimension line. The <span class="Attribute">draw:placing</span> style attributes defines if the measure shape is placed above or below the reference line.</p><p class="Text_20_body">The start reference point is defined by the attributes <span class="Attribute">svg:x1</span> and <span class="Attribute">svg:y1</span> </p><p class="Text_20_body">The first extension line is drawn on a line as defined by the vector from the start reference point to the start point of the dimension line. The extension line will start along this vector at a distance from the start reference point that is defined by the <span class="Attribute">draw:guide-distance</span> style attribute minus the value of <span class="Attribute">draw:start-guide</span> style attribute.</p><p class="Text_20_body">The end reference point is defined by the attributes <span class="Attribute">svg:x2</span>, and <span class="Attribute">svg:y2</span>. </p><p class="Text_20_body">The second extension line is drawn on a line as defined by the vector from the end reference point to the end point of the dimension line. The extension line will start along this vector at the distance from the end reference point that is defined by the <span class="Attribute">draw:guide-distance</span> style attribute minus the value of <span class="Attribute">draw:end-guide</span> style attribute.</p><p class="Text_20_body">The end points of the extension lines are at the distance defined by the <span class="Attribute">draw:guide-overhang</span> style attribute after the intersection with the dimension line. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:measure&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:measure&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_measure">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_measure">19.197.17</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_measure">19.219.16</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:x1</span> <a href="#attribute-svg_x1_element-draw_measure">19.574.1</a>, <span class="Attribute">svg:x2</span> <a href="#attribute-svg_x2_element-draw_measure">19.575.1</a>, <span class="Attribute">svg:y1</span> <a href="#attribute-svg_y1_element-draw_measure">19.578.1</a>, <span class="Attribute">svg:y2</span> <a href="#attribute-svg_y2_element-draw_measure">19.579.1</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:measure&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_3_13_draw_control_"><span style="margin-right:0.127cm;">10.3.13</span></a><a id="__RefHeading__1415830_253892949"/><a id="element-draw_control"/>&lt;draw:control&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:control&gt;</span> element represents a shape that is linked to a control inside an <span class="Element">&lt;office:forms&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:control&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:control&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:control</span> <a href="#attribute-draw_control">19.125</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_control">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_control">19.197.5</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_control">19.219.10</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_control">19.539.8</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_control">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_control">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_control">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:control&gt;</span> element has the following child elements: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h3 class="Heading_20_3"><a id="a10_3_14_draw_page-thumbnail_"><span style="margin-right:0.127cm;">10.3.14</span></a><a id="__RefHeading__1415832_253892949"/><a id="element-draw_page-thumbnail"/>&lt;draw:page-thumbnail&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:page-thumbnail&gt;</span> element represents a rectangular area that displays the thumbnail of a drawing page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:page-thumbnail&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:page-thumbnail&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_page-thumbnail">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_page-thumbnail">19.197.20</a>, <span class="Attribute">draw:page-number</span> <a href="#attribute-draw_page-number">19.203</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_page-thumbnail">19.219.18</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class</span> <a href="#attribute-presentation_class">19.389</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:placeholder</span> <a href="#attribute-presentation_placeholder">19.407</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">presentation:user-transformed</span> <a href="#attribute-presentation_user-transformed">19.427</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_page-thumbnail">19.539.8</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_page-thumbnail">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_page-thumbnail">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_page-thumbnail">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:page-thumbnail&gt;</span> element has the following child elements: <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h3 class="Heading_20_3"><a id="a10_3_15_draw_g_"><span style="margin-right:0.127cm;">10.3.15</span></a><a id="__RefHeading__1415834_253892949"/><a id="element-draw_g"/>&lt;draw:g&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:g&gt;</span> element represents a group of drawing shapes.</p><p class="Text_20_body">Drawing shapes contained by a <span class="Element">&lt;draw:g&gt;</span> element that is itself contained by a <span class="Element">&lt;draw:a&gt;</span> element, act as hyperlinks using the <span class="Attribute">xlink:href</span> attribute of the containing <span class="Element">&lt;draw:a&gt;</span> element. If the included drawing shapes are themselves contained within <span class="Element">&lt;draw:a&gt;</span> elements, then the <span class="Attribute">xlink:href</span> attributes of those <span class="Element">&lt;draw:a&gt;</span> elements act as the hyperlink information for the shapes they contain.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:g&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:g&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_g">19.187.3</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_g">19.197.11</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_g">19.219.14</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_g">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:g&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h3 class="Heading_20_3"><a id="a10_3_16_draw_glue-point_"><span style="margin-right:0.127cm;">10.3.16</span></a><a id="__RefHeading__1415836_253892949"/><a id="element-draw_glue-point"/>&lt;draw:glue-point&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:glue-point&gt;</span> element specifies a point in the area of a drawing object to which a connector shape can connect. All drawing objects have four standard glue points located at the center of the four edges of the object's bounding box. Additional glue points may be added to a drawing object by inserting one or more <span class="Element">&lt;draw:glue-point&gt;</span> elements into a drawing object element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:glue-point&gt;</span> element is usable within the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:glue-point&gt;</span> element has the following attributes: <span class="Attribute">draw:align</span> <a href="#attribute-draw_align">19.111</a>, <span class="Attribute">draw:escape-direction</span> <a href="#attribute-draw_escape-direction">19.147</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_glue-point">19.187.2</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_glue-point">19.573.6</a> and <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_glue-point">19.577.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:glue-point&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_3_17_svg_title_"><span style="margin-right:0.127cm;">10.3.17</span></a><a id="__RefHeading__1415838_253892949"/><a id="element-svg_title"/>&lt;svg:title&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;svg:title&gt;</span> element specifies a name for a graphic object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:title&gt;</span> element is usable within the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:layer&gt;</span> <a href="#element-draw_layer">10.2.3</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:page-</span><span class="Element">thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:title&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;svg:title&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:title&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a10_3_18_svg_desc_"><span style="margin-right:0.127cm;">10.3.18</span></a><a id="__RefHeading__1415840_253892949"/><a id="element-svg_desc"/>&lt;svg:desc&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;svg:desc&gt;</span> element specifies a prose description of a graphic object that may be used to support accessibility. See appendix D.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:desc&gt;</span> element is usable within the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:layer&gt;</span> <a href="#element-draw_layer">10.2.3</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:desc&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;svg:desc&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:desc&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a10_3_19_office_event-listeners_"><span style="margin-right:0.127cm;">10.3.19</span></a><a id="__RefHeading__1415842_253892949"/><a id="element-office_event-listeners"/>&lt;office:event-listeners&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:event-listeners&gt;</span> element represents the attachment of an event listener to a drawing shape. See <a href="#Event_Tables">14.4</a>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:event-listeners&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>, <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>, <span class="Element">&lt;office:scripts&gt;</span> <a href="#element-office_scripts">3.12</a>, <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a> and <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:event-listeners&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:event-listeners&gt;</span> element has the following child elements: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a> and <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>.</p><h2 class="Heading_20_2"><a id="a10_4Frames"><span style="margin-right:0.127cm;">10.4</span></a><a id="__RefHeading__1415844_253892949"/><a id="Frames"/>Frames</h2><h3 class="Heading_20_3"><a id="a10_4_1General"><span style="margin-right:0.127cm;">10.4.1</span></a><a id="__RefHeading__1415846_253892949"/>General</h3><p class="Text_20_body">A frame is a container for enhanced content like text boxes, images or objects. A frame may contain multiple renditions of content. A consumer may choose the representation that it supports best.</p><p class="Text_20_body">Multiple representations may share <span class="Element">&lt;svg:desc&gt;</span> and <span class="Element">&lt;svg:title&gt;</span> elements.</p><p class="Text_20_body">Each child element of a frame is a different representation of the same content. The order of content elements reflects the document author's preference for rendering, with the first child element being preferred. That means that consumers should render the first child element that they support. A frame may contain multiple content elements, but shall contain at least one content element. </p><p class="Text_20_body">Within text documents, frames are also used to position content outside the default text flow of a document.</p><h3 class="Heading_20_3"><a id="a10_4_2_draw_frame_"><span style="margin-right:0.127cm;">10.4.2</span></a><a id="__RefHeading__1415848_253892949"/><a id="element-draw_frame"/>&lt;draw:frame&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:frame&gt;</span> element represents a frame and serves as the container for elements that may occur in a frame. </p><p class="Text_20_body">Frame formatting properties are stored in styles belonging to the <span class="Attribute_20_Value">graphic</span> family.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:frame&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:image&gt;</span> <a href="#element-office_image">3.9</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:frame&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:copy-of</span> <a href="#attribute-draw_copy-of">19.126</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_frame">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_frame">19.197.10</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_frame">19.219.13</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class</span> <a href="#attribute-presentation_class">19.389</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:placeholder</span> <a href="#attribute-presentation_placeholder">19.407</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">presentation:user-transformed</span> <a href="#attribute-presentation_user-transformed">19.427</a>, <span class="Attribute">style:rel-height</span> <a href="#attribute-style_rel-height">19.509</a>, <span class="Attribute">style:rel-width</span> <a href="#attribute-style_rel-width_element-draw_frame">19.510.2</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_frame">19.539.8</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_frame">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_frame">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_frame">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:frame&gt;</span> element has the following child elements: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:contour-path&gt;</span> <a href="#element-draw_contour-path">10.4.11.3</a>, <span class="Element">&lt;draw:contour-polygon&gt;</span> <a href="#element-draw_contour-polygon">10.4.11.2</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:image-map&gt;</span> <a href="#element-draw_image-map">10.4.13.2</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><h3 class="Heading_20_3"><a id="a10_4_3_draw_text-box_"><span style="margin-right:0.127cm;">10.4.3</span></a><a id="__RefHeading__1415850_253892949"/><a id="element-draw_text-box"/>&lt;draw:text-box&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:text-box&gt;</span> element represents a text box. This element may be used to place text in a container that is outside of the flow of the document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:text-box&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:text-box&gt;</span> element has the following attributes: <span class="Attribute">draw:chain-next-name</span> <a href="#attribute-draw_chain-next-name">19.118</a>, <span class="Attribute">draw:corner-radius</span> <a href="#attribute-draw_corner-radius">19.127</a>, <span class="Attribute">fo:max-height</span> <a href="#attribute-fo_max-height">19.238</a>, <span class="Attribute">fo:max-width</span> <a href="#attribute-fo_max-width">19.239</a>, <span class="Attribute">fo:min-height</span> <a href="#attribute-fo_min-height">19.240</a>, <span class="Attribute">fo:min-width</span> <a href="#attribute-fo_min-width">19.241</a>, <span class="Attribute">text:id</span> <a href="#attribute-text_id_element-draw_text-box">19.809.2</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:text-box&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:soft-page-break&gt;</span> <a href="#element-text_soft-page-break">5.6</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><h3 class="Heading_20_3"><a id="a10_4_4_draw_image_"><span style="margin-right:0.127cm;">10.4.4</span></a><a id="__RefHeading__1415852_253892949"/><a id="element-draw_image"/>&lt;draw:image&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:image&gt;</span> element represents an image. An image can be either:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A link to an external resource<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">or</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Embedded in the document<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> While the image data may have an arbitrary format, vector graphics should be stored in the <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> format and bitmap graphics in the <a title="Portable Network Graphics (PNG) Specification (Second Edition)" href="http://www.w3.org/TR/2003/REC-PNG-20031110">[PNG]</a> format.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:image&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:image&gt;</span> element has the following attributes: <span class="Attribute">draw:filter-name</span> <a href="#attribute-draw_filter-name">19.170</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_image">19.910.15</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:image&gt;</span> element has the following child elements: <span class="Element">&lt;office:binary-data&gt;</span> <a href="#element-office_binary-data">10.4.5</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_4_5_office_binary-data_"><span style="margin-right:0.127cm;">10.4.5</span></a><a id="__RefHeading__1415854_253892949"/><a id="element-office_binary-data"/>&lt;office:binary-data&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:binary-data&gt;</span> element contains image data in BASE64 encoding (as defined in <a title="Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies" href="http://www.ietf.org/rfc/rfc2045.txt">[RFC2045]</a>). If this element is present, an <span class="Attribute">xlink:href</span> attribute in its parent element shall be ignored. </p><p class="Note"><span class="Note_20_Label">Note</span>: The image data may be in an arbitrary data format. Consumers have to analyze the image data to determine the data format that is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:binary-data&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a> and <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:binary-data&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;office:binary-data&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:binary-data&gt;</span> element has content of data type <span class="Datatype">base64Binary</span> <a href="#datatype-base64Binary">18.2</a>.</p><h3 class="Heading_20_3"><a id="a10_4_6Objects"><span style="margin-right:0.127cm;">10.4.6</span></a><a id="__RefHeading__1415856_253892949"/>Objects</h3><h4 class="Heading_20_4"><a id="a10_4_6_1General"><span style="margin-right:0.127cm;">10.4.6.1</span></a><a id="__RefHeading__1415858_253892949"/>General</h4><p class="Text_20_body">A document in OpenDocument format can contain two types of embedded objects, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Objects that have an OpenDocument representation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Objects that do not have an OpenDocument representation.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"><span class="Example_20_Label">Note:</span> OLE objects are an example of objects without an OpenDocument representation. See <a title="Inside OLE">[OLE]</a>.</p><h4 class="Heading_20_4"><a id="a10_4_6_2_draw_object_"><span style="margin-right:0.127cm;">10.4.6.2</span></a><a id="__RefHeading__1415860_253892949"/><a id="element-draw_object"/>&lt;draw:object&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:object&gt;</span> element represents objects that have a OpenDocument representation.</p><p class="Text_20_body">Objects with an OpenDocument representation can either be: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in the same package as a document, in which case the Object is a sub document within the package. The <span class="Attribute">xlink:href</span> attribute of this element references that folder. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in a separate OpenDocument document instance. The <span class="Attribute">xlink:href</span> attribute of this element references that document's package. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in a child <span class="Element">&lt;office:document&gt;</span> element of this element. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in a child <span class="Element">&lt;math:math&gt;</span> element of this element. <span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> An image representation of an object should be included in a frame in addition to the object itself.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:object&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:object&gt;</span> element has the following attributes: <span class="Attribute">draw:notify-on-update-of-ranges</span> <a href="#attribute-draw_notify-on-update-of-ranges">19.200</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_object">19.910.16</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:object&gt;</span> element has the following child elements: <span class="Element">&lt;math:math&gt;</span> <a href="#element-math_math">14.5</a> and <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>.</p><h4 class="Heading_20_4"><a id="a10_4_6_3_draw_object-ole_"><span style="margin-right:0.127cm;">10.4.6.3</span></a><a id="__RefHeading__1415862_253892949"/><a id="element-draw_object-ole"/>&lt;draw:object-ole&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:object-ole&gt;</span> element represents objects that do not have an OpenDocument representation. </p><p class="Text_20_body">Objects without an OpenDocument representation can either be: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in the same package as a document, in which case it is contained in a file within the package. The <span class="Attribute">xlink:href</span> attribute of this element references that file. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in a separate file. The <span class="Attribute">xlink:href</span> attribute of this element references that file.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Contained in a child <span class="Element">&lt;office:binary-data&gt;</span> element of this element. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:object-ole&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:object-ole&gt;</span> element has the following attributes: <span class="Attribute">draw:class-id</span> <a href="#attribute-draw_class-id">19.119</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_object-ole">19.910.17</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:object-ole&gt;</span> element has the following child element: <span class="Element">&lt;office:binary-data&gt;</span> <a href="#element-office_binary-data">10.4.5</a>.</p><h3 class="Heading_20_3"><a id="a10_4_7_draw_applet_"><span style="margin-right:0.127cm;">10.4.7</span></a><a id="__RefHeading__1415864_253892949"/><a id="element-draw_applet"/>&lt;draw:applet&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:applet&gt;</span> element represents an applet that is embedded in a document. Its semantics are the same as the <span class="Alien_20_Element">&lt;applet&gt;</span> element in HTML. §13.4 of <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>. This element shall have either a <span class="Attribute">draw:code</span> or <span class="Attribute">draw:object</span> attribute.</p><p class="Text_20_body">The applet name, width, height, margins, title and description are specified by the <span class="Element">&lt;draw:applet&gt;</span> element's <span class="Element">&lt;draw:frame&gt;</span> parent element. The <span class="Element">&lt;draw:applet&gt;</span> element does not support character data content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:applet&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:applet&gt;</span> element has the following attributes: <span class="Attribute">draw:archive</span> <a href="#attribute-draw_archive">19.113</a>, <span class="Attribute">draw:code</span> <a href="#attribute-draw_code">19.121</a>, <span class="Attribute">draw:may-script</span> <a href="#attribute-draw_may-script">19.195</a>, <span class="Attribute">draw:object</span> <a href="#attribute-draw_object">19.201</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_applet">19.910.9</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:applet&gt;</span> element has the following child element: <span class="Element">&lt;draw:param&gt;</span> <a href="#element-draw_param">10.4.9</a>.</p><h3 class="Heading_20_3"><a id="a10_4_8_draw_plugin_"><span style="margin-right:0.127cm;">10.4.8</span></a><a id="__RefHeading__1415866_253892949"/><a id="element-draw_plugin"/>&lt;draw:plugin&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:plugin&gt;</span> element represents an external application that processes data with a specified media-type.</p><p class="Text_20_body">How OpenDocument consumers interact with external applications is not defined by this specification.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Consumers are responsible for any and all security issues that may arise from interaction with an external application referenced by a <span class="Element">&lt;draw:plugin&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:plugin&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:plugin&gt;</span> element has the following attributes: <span class="Attribute">draw:mime-type</span> <a href="#attribute-draw_mime-type">19.191</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_plugin">19.910.18</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:plugin&gt;</span> element has the following child element: <span class="Element">&lt;draw:param&gt;</span> <a href="#element-draw_param">10.4.9</a>.</p><h3 class="Heading_20_3"><a id="a10_4_9_draw_param_"><span style="margin-right:0.127cm;">10.4.9</span></a><a id="__RefHeading__1415868_253892949"/><a id="element-draw_param"/>&lt;draw:param&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:param&gt;</span> element contains parameters that are passed to an applet or plugin when they are initialized.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:param&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a> and <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:param&gt;</span> element has the following attributes: <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_param">19.197.21</a> and <span class="Attribute">draw:value</span> <a href="#attribute-draw_value">19.230</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:param&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_4_10_draw_floating-frame_"><span style="margin-right:0.127cm;">10.4.10</span></a><a id="__RefHeading__1415870_253892949"/><a id="element-draw_floating-frame"/>&lt;draw:floating-frame&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:floating-frame&gt;</span> element represents a frame that is embedded in a document.</p><p class="Text_20_body">Floating frames cannot be transformed as described in section <a href="#attribute-draw_transform">19.228</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:floating-frame&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:floating-frame&gt;</span> element has the following attributes: <span class="Attribute">draw:frame-name</span> <a href="#attribute-draw_frame-name">19.172</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_floating-frame">19.910.14</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:floating-frame&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_4_11Contours"><span style="margin-right:0.127cm;">10.4.11</span></a><a id="__RefHeading__1415872_253892949"/><a id="draw-contours"/>Contours</h3><h4 class="Heading_20_4"><a id="a10_4_11_1General"><span style="margin-right:0.127cm;">10.4.11.1</span></a><a id="__RefHeading__1415874_253892949"/>General</h4><p class="Text_20_body">The <span class="Element">&lt;draw:contour-polygon&gt;</span> and <span class="Element">&lt;draw:contour-path&gt;</span> elements are used to specify contours to be applied to object or images.</p><p class="Text_20_body">Consumers should support pixel lengths for the <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attributes of the <span class="Element">&lt;draw:contour-polygon&gt;</span> and <span class="Element">&lt;draw:contour-path&gt;</span> elements.</p><p class="Note"><span class="Note_20_Label">Note</span>: A contour of an object or image establishes an outer boundary around an object or image. One use would be the wrapping of text around a contour specified for an image, if <span class="Attribute">style:wrap-contour</span>=”<span class="Attribute_20_Value">true</span>” and a contour is specified.</p><h4 class="Heading_20_4"><a id="a10_4_11_2_draw_contour-polygon_"><span style="margin-right:0.127cm;">10.4.11.2</span></a><a id="__RefHeading__1415876_253892949"/><a id="element-draw_contour-polygon"/>&lt;draw:contour-polygon&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:contour-polygon&gt;</span> element specifies a contour using a polygon. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:contour-polygon&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:contour-polygon&gt;</span> element has the following attributes: <span class="Attribute">draw:points</span> <a href="#attribute-draw_points">19.206</a>, <span class="Attribute">draw:recreate-on-edit</span> <a href="#attribute-draw_recreate-on-edit">19.208</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_contour-polygon">19.539.6</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a> and <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_contour-polygon">19.571.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:contour-polygon&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a10_4_11_3_draw_contour-path_"><span style="margin-right:0.127cm;">10.4.11.3</span></a><a id="__RefHeading__1415878_253892949"/><a id="element-draw_contour-path"/>&lt;draw:contour-path&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:contour-path&gt;</span> element specifies a contour using a path. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:contour-path&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:contour-path&gt;</span> element has the following attributes: <span class="Attribute">draw:recreate-on-edit</span> <a href="#attribute-draw_recreate-on-edit">19.208</a>, <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_contour-path">19.539.6</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a> and <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_contour-path">19.571.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:contour-path&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_4_12_draw_a_"><span style="margin-right:0.127cm;">10.4.12</span></a><a id="__RefHeading__1415880_253892949"/><a id="element-draw_a"/>&lt;draw:a&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:a&gt;</span> element enables both frames and drawing shapes to act as hyperlinks. </p><p class="Text_20_body">The <span class="Element">&lt;draw:a&gt;</span> element contains a drawing shape that should behave as a hyperlink.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:a&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:a&gt;</span> element has the following attributes: <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-draw_a">19.376.2</a>, <span class="Attribute">office:server-map</span> <a href="#attribute-office_server-map">19.378</a>, <span class="Attribute">office:target-frame-name</span> <a href="#attribute-office_target-frame-name">19.381</a>, <span class="Attribute">office:title</span> <a href="#attribute-office_title">19.383</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_a">19.910.8</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:a&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><h3 class="Heading_20_3"><a id="a10_4_13Client_Side_Image_Maps"><span style="margin-right:0.127cm;">10.4.13</span></a><a id="__RefHeading__1415882_253892949"/><a id="Image_Map"/>Client Side Image Maps</h3><h4 class="Heading_20_4"><a id="a10_4_13_1General"><span style="margin-right:0.127cm;">10.4.13.1</span></a><a id="__RefHeading__1415884_253892949"/>General</h4><p class="Text_20_body">An client side image map is a collection of hyperlinks that are associated with graphic elements. The image map is a sequence of image map elements. Each image map element associates a hyperlink with an area. The area can be a rectangle, circle or polygon.</p><h4 class="Heading_20_4"><a id="a10_4_13_2_draw_image-map_"><span style="margin-right:0.127cm;">10.4.13.2</span></a><a id="__RefHeading__1415886_253892949"/><a id="element-draw_image-map"/>&lt;draw:image-map&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:image-map&gt;</span> element represents an image map.</p><p class="Text_20_body">Image map elements are specified as absolute positions relative to the original size of its associated graphical element. OpenDocument consumer shall scale the image map to match the current size of the image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:image-map&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:image-map&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:image-map&gt;</span> element has the following child elements: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a> and <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><h4 class="Heading_20_4"><a id="a10_4_13_3_draw_area-rectangle_"><span style="margin-right:0.127cm;">10.4.13.3</span></a><a id="__RefHeading__1415888_253892949"/><a id="element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:area-rectangle&gt;</span> element specifies a rectangular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:area-rectangle&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:image-map&gt;</span> <a href="#element-draw_image-map">10.4.13.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:area-rectangle&gt;</span> element has the following attributes: <span class="Attribute">draw:nohref</span> <a href="#attribute-draw_nohref">19.199</a>, <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-draw_area-rectangle">19.376.4</a>, <span class="Attribute">office:target-frame-name</span> <a href="#attribute-office_target-frame-name">19.381</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_area-rectangle">19.539.5</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_area-rectangle">19.571.7</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_area-rectangle">19.573.3</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_area-rectangle">19.577.3</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_area-rectangle">19.910.12</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:area-rectangle&gt;</span> element has the following child elements: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h4 class="Heading_20_4"><a id="a10_4_13_4_draw_area-circle_"><span style="margin-right:0.127cm;">10.4.13.4</span></a><a id="__RefHeading__1415890_253892949"/><a id="element-draw_area-circle"/>&lt;draw:area-circle&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:area-circle&gt;</span> element represents a circular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:area-circle&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:image-map&gt;</span> <a href="#element-draw_image-map">10.4.13.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:area-circle&gt;</span> element has the following attributes: <span class="Attribute">draw:nohref</span> <a href="#attribute-draw_nohref">19.199</a>, <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-draw_area-circle">19.376.3</a>, <span class="Attribute">office:target-frame-name</span> <a href="#attribute-office_target-frame-name">19.381</a>, <span class="Attribute">svg:cx</span> <a href="#attribute-svg_cx_element-draw_area-circle">19.524.1</a>, <span class="Attribute">svg:cy</span> <a href="#attribute-svg_cy_element-draw_area-circle">19.525.1</a>, <span class="Attribute">svg:r</span> <a href="#attribute-svg_r_element-draw_area-circle">19.549.1</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_area-circle">19.910.10</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:area-circle&gt;</span> element has the following child elements: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h4 class="Heading_20_4"><a id="a10_4_13_5_draw_area-polygon_"><span style="margin-right:0.127cm;">10.4.13.5</span></a><a id="__RefHeading__1415892_253892949"/><a id="element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;draw:area-polygon&gt;</span> element specifies a polygonal image map area. A polygonal image map area has the following components:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A bounding box.<br/><span style="margin-left:0.6401cm"/>The bounding box establishes the reference frame for the view box and the polygon point sequence. The reference frame enables the coordinates to be translated into absolute coordinates.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A view box.<br/><span style="margin-left:0.6401cm"/>The view box attribute establishes a coordinate system for the point sequence. The view box avoids the need to record every point of the point sequence as absolute coordinates with length and unit of measurement.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A sequence of points in view box-coordinates in the <span class="Attribute">draw:points</span> attribute.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> For more information about how to represent polygons, see <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:area-polygon&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:image-map&gt;</span> <a href="#element-draw_image-map">10.4.13.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:area-polygon&gt;</span> element has the following attributes: <span class="Attribute">draw:nohref</span> <a href="#attribute-draw_nohref">19.199</a>, <span class="Attribute">draw:points</span> <a href="#attribute-draw_points">19.206</a>, <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-draw_area-polygon">19.376.5</a>, <span class="Attribute">office:target-frame-name</span> <a href="#attribute-office_target-frame-name">19.381</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_area-polygon">19.539.4</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_area-polygon">19.571.6</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_area-polygon">19.573.2</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_area-polygon">19.577.2</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_area-polygon">19.910.11</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:area-polygon&gt;</span> element has the following child elements: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h2 class="Heading_20_2"><a id="a10_53D_Shapes"><span style="margin-right:0.127cm;">10.5</span></a><a id="__RefHeading__1415894_253892949"/><a id="a_3D_Shapes"/>3D Shapes</h2><h3 class="Heading_20_3"><a id="a10_5_1General"><span style="margin-right:0.127cm;">10.5.1</span></a><a id="__RefHeading__1718304_1219268628"/>General</h3><p class="Standard">3D shapes are used to define three-dimensional coordinate systems and geometrical figures within them. All OpenDocument 3D coordinate systems are right-handed. Geometry is represented by a tree of scenes. Each scene may contain zero or more 3D shapes, with a scene being a special case of shape. The root scene defines the world coordinate system. Each 3D shape may define a local coordinate system relative to its parent 3D scene.</p><h3 class="Heading_20_3"><a id="a10_5_2_dr3d_scene_"><span style="margin-right:0.127cm;">10.5.2</span></a><a id="__RefHeading__1415896_253892949"/><a id="element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;dr3d:scene&gt;</span> element is the only element that can contain three-dimensional shapes. Like the <span class="Element">&lt;draw:g&gt;</span> element it groups shapes, but it also defines the projection, lighting, and other rendering details for the shapes inside the scene.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dr3d:scene&gt;</span> element is usable within the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dr3d:scene&gt;</span> element has the following attributes: <span class="Attribute">dr3d:ambient-color</span> <a href="#attribute-dr3d_ambient-color">19.92</a>, <span class="Attribute">dr3d:distance</span> <a href="#attribute-dr3d_distance">19.96</a>, <span class="Attribute">dr3d:focal-length</span> <a href="#attribute-dr3d_focal-length">19.98</a>, <span class="Attribute">dr3d:lighting-mode</span> <a href="#attribute-dr3d_lighting-mode_element-dr3d_scene">19.99.3</a>, <span class="Attribute">dr3d:projection</span> <a href="#attribute-dr3d_projection">19.102</a>, <span class="Attribute">dr3d:shade-mode</span> <a href="#attribute-dr3d_shade-mode">19.103</a>, <span class="Attribute">dr3d:shadow-slant</span> <a href="#attribute-dr3d_shadow-slant">19.104</a>, <span class="Attribute">dr3d:transform</span> <a href="#attribute-dr3d_transform">19.107</a>, <span class="Attribute">dr3d:vpn</span> <a href="#attribute-dr3d_vpn">19.108</a>, <span class="Attribute">dr3d:vrp</span> <a href="#attribute-dr3d_vrp">19.109</a>, <span class="Attribute">dr3d:vup</span> <a href="#attribute-dr3d_vup">19.110</a>, <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-dr3d_scene">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-dr3d_scene">19.219.5</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-dr3d_scene">19.539.3</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-dr3d_scene">19.571.5</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-dr3d_scene">19.573.4</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-dr3d_scene">19.577.4</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dr3d:scene&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:light&gt;</span> <a href="#element-dr3d_light">10.5.3</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a> and <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>.</p><h3 class="Heading_20_3"><a id="a10_5_3_dr3d_light_"><span style="margin-right:0.127cm;">10.5.3</span></a><a id="__RefHeading__1415898_253892949"/><a id="element-dr3d_light"/>&lt;dr3d:light&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;dr3d:light&gt;</span> element represents a light inside a scene.</p><p class="Note"><span class="Note_20_Label">Note:</span> There may be several lights, but consumers may limit the number of lights per scene to 8. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dr3d:light&gt;</span> element is usable within the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dr3d:light&gt;</span> element has the following attributes: <span class="Attribute">dr3d:diffuse-color</span> <a href="#attribute-dr3d_diffuse-color">19.94</a>, <span class="Attribute">dr3d:direction</span> <a href="#attribute-dr3d_direction">19.95</a>, <span class="Attribute">dr3d:enabled</span> <a href="#attribute-dr3d_enabled">19.97</a> and <span class="Attribute">dr3d:specular</span> <a href="#attribute-dr3d_specular">19.106</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dr3d:light&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_5_4_dr3d_cube_"><span style="margin-right:0.127cm;">10.5.4</span></a><a id="__RefHeading__1415900_253892949"/><a id="element-dr3d_cube"/>&lt;dr3d:cube&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;dr3d:cube&gt;</span> element represents a three-dimensional cube shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dr3d:cube&gt;</span> element is usable within the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dr3d:cube&gt;</span> element has the following attributes: <span class="Attribute">dr3d:max-edge</span> <a href="#attribute-dr3d_max-edge">19.100</a>, <span class="Attribute">dr3d:min-edge</span> <a href="#attribute-dr3d_min-edge">19.101</a>, <span class="Attribute">dr3d:transform</span> <a href="#attribute-dr3d_transform">19.107</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-dr3d_cube">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-dr3d_cube">19.219.2</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dr3d:cube&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_5_5_dr3d_sphere_"><span style="margin-right:0.127cm;">10.5.5</span></a><a id="__RefHeading__1415902_253892949"/><a id="element-dr3d_sphere"/>&lt;dr3d:sphere&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;dr3d:sphere&gt;</span> element represents a three-dimensional sphere shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dr3d:sphere&gt;</span> element is usable within the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dr3d:sphere&gt;</span> element has the following attributes: <span class="Attribute">dr3d:center</span> <a href="#attribute-dr3d_center">19.93</a>, <span class="Attribute">dr3d:size</span> <a href="#attribute-dr3d_size">19.105</a>, <span class="Attribute">dr3d:transform</span> <a href="#attribute-dr3d_transform">19.107</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-dr3d_sphere">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-dr3d_sphere">19.219.6</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dr3d:sphere&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_5_6_dr3d_extrude_"><span style="margin-right:0.127cm;">10.5.6</span></a><a id="__RefHeading__1415904_253892949"/><a id="element-dr3d_extrude"/>&lt;dr3d:extrude&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;dr3d:extrude&gt;</span> element represents a three-dimensional extruded object based on the given polygon. The 3D geometry is formed by extruding a polygon perpendicular to the plane of the given polygon by a depth (see <span class="Attribute">dr3d:depth</span>, <a href="#property-dr3d_depth">20.72</a>), creating a front face, a back face and side faces. The side faces are formed by connecting all corresponding single edges of the front and back faces. When no depth is given, the polygon forms a shape without depth. The closing of the front face depends on the value of the <span class="Attribute">dr3d:close-front</span> attribute <a href="#property-dr3d_close-front">20.71</a>. The closing of the back face depends on the value of the <span class="Attribute">dr3d:close-back</span> attribute <a href="#property-dr3d_close-back">20.70</a>. The size of the back face can be relative to the size of the front face when the <span class="Attribute">dr3d:back-scale</span> attribute is used. The side faces defined by the extrusion of the shape are always closed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dr3d:extrude&gt;</span> element is usable within the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dr3d:extrude&gt;</span> element has the following attributes: <span class="Attribute">dr3d:transform</span> <a href="#attribute-dr3d_transform">19.107</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-dr3d_extrude">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-dr3d_extrude">19.219.3</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dr3d:extrude&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_5_7_dr3d_rotate_"><span style="margin-right:0.127cm;">10.5.7</span></a><a id="__RefHeading__1415906_253892949"/><a id="element-dr3d_rotate"/>&lt;dr3d:rotate&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;dr3d:rotate&gt;</span> element represents a three-dimensional rotation shape based on the given polygon. The 3D geometry is defined by rotating the XY-plane with the polygon around the Y-axis of the local coordinate system.  This rotation is linearly interpolated in the given number of steps (<span class="Attribute">dr3d:horizontal-segments</span> <a href="#property-dr3d_horizontal-segments">20.78</a>) around the given angle (<span class="Attribute">dr3d:end-angle</span> <a href="#property-dr3d_end-angle">20.77</a>). The side faces are formed by connecting all corresponding single edges of a neighboring pairs of rotated polygons. By default, the rotation uses a full rotation (360 degrees, <span class="Attribute">dr3d:end-angle</span> attribute <a href="#property-dr3d_end-angle">20.77</a>). In that case the 3D geometry is implicitly closed and no front face or back face is created (unless they are of different sizes). If the rotation is different, a front face is created using the first, unrotated polygon and a back face is created using the last rotated polygon. The closing of a front face also depends on the value of the <span class="Attribute">dr3d:close-front</span> attribute <a href="#property-dr3d_close-front">20.71</a> and the closing of a back face on the value of the <span class="Attribute">dr3d:close-back</span> <a href="#property-dr3d_close-back">20.70</a> attribute. The size of the back face can be different than the size of the front face when the <span class="Attribute">dr3d:back-scale</span> attribute <a href="#property-dr3d_back-scale">20.68</a> is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;dr3d:rotate&gt;</span> element is usable within the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;dr3d:rotate&gt;</span> element has the following attributes: <span class="Attribute">dr3d:transform</span> <a href="#attribute-dr3d_transform">19.107</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-dr3d_rotate">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-dr3d_rotate">19.219.4</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a>, <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;dr3d:rotate&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a10_6Custom_Shape"><span style="margin-right:0.127cm;">10.6</span></a><a id="__RefHeading__1415908_253892949"/><a id="Custom_Shape"/>Custom Shape</h2><h3 class="Heading_20_3"><a id="a10_6_1_draw_custom-shape_"><span style="margin-right:0.127cm;">10.6.1</span></a><a id="__RefHeading__1415910_253892949"/><a id="element-draw_custom-shape"/>&lt;draw:custom-shape&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:custom-shape&gt;</span> element represents a complex figure. It supports font geometry effects and extrusion. A custom shape may have a geometry that influences its shape. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:custom-shape&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:shapes&gt;</span> <a href="#element-table_shapes">9.2.8</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:deletion&gt;</span> <a href="#element-text_deletion">5.5.4</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:index-body&gt;</span> <a href="#element-text_index-body">8.2.2</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:note-body&gt;</span> <a href="#element-text_note-body">6.3.4</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:custom-shape&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-id</span> <a href="#attribute-draw_caption-id">19.115</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:data</span> <a href="#attribute-draw_data">19.131</a>, <span class="Attribute">draw:engine</span> <a href="#attribute-draw_engine">19.146</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-draw_custom-shape">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_custom-shape">19.197.6</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-draw_custom-shape">19.219.11</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_custom-shape">19.539.8</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_custom-shape">19.571.10</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-draw_custom-shape">19.573.5</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-draw_custom-shape">19.577.5</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:custom-shape&gt;</span> element has the following child elements: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>, <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>, <span class="Element">&lt;svg:desc&gt;</span> <a href="#element-svg_desc">10.3.18</a>, <span class="Element">&lt;svg:title&gt;</span> <a href="#element-svg_title">10.3.17</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a10_6_2_draw_enhanced-geometry_"><span style="margin-right:0.127cm;">10.6.2</span></a><a id="__RefHeading__1415912_253892949"/><a id="element-draw_enhanced-geometry"/>&lt;draw:enhanced-geometry&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:enhanced-geometry&gt;</span> element contains the geometry for a <span class="Element">&lt;draw:custom-shape&gt;</span> element if its <span class="Attribute">draw:engine</span> attribute has been omitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:enhanced-geometry&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:enhanced-geometry&gt;</span> element has the following attributes: <span class="Attribute">dr3d:projection</span> <a href="#attribute-dr3d_projection">19.102</a>, <span class="Attribute">dr3d:shade-mode</span> <a href="#attribute-dr3d_shade-mode">19.103</a>, <span class="Attribute">draw:concentric-gradient-fill-allowed</span> <a href="#attribute-draw_concentric-gradient-fill-allowed">19.124</a>, <span class="Attribute">draw:enhanced-path</span> <a href="#attribute-draw_enhanced-path">19.145</a>, <span class="Attribute">draw:extrusion</span> <a href="#attribute-draw_extrusion">19.148</a>, <span class="Attribute">draw:extrusion-allowed</span> <a href="#attribute-draw_extrusion-allowed">19.149</a>, <span class="Attribute">draw:extrusion-brightness</span> <a href="#attribute-draw_extrusion-brightness">19.150</a>, <span class="Attribute">draw:extrusion-color</span> <a href="#attribute-draw_extrusion-color">19.151</a>, <span class="Attribute">draw:extrusion-depth</span> <a href="#attribute-draw_extrusion-depth">19.152</a>, <span class="Attribute">draw:extrusion-diffusion</span> <a href="#attribute-draw_extrusion-diffusion">19.153</a>, <span class="Attribute">draw:extrusion-first-light-direction</span> <a href="#attribute-draw_extrusion-first-light-direction">19.154</a>, <span class="Attribute">draw:extrusion-first-light-harsh</span> <a href="#attribute-draw_extrusion-first-light-harsh">19.155</a>, <span class="Attribute">draw:extrusion-first-light-level</span> <a href="#attribute-draw_extrusion-first-light-level">19.156</a>, <span class="Attribute">draw:extrusion-light-face</span> <a href="#attribute-draw_extrusion-light-face">19.157</a>, <span class="Attribute">draw:extrusion-metal</span> <a href="#attribute-draw_extrusion-metal">19.158</a>, <span class="Attribute">draw:extrusion-number-of-line-</span><span class="Attribute">segments</span> <a href="#attribute-draw_extrusion-number-of-line-segments">19.159</a>, <span class="Attribute">draw:extrusion-origin</span> <a href="#attribute-draw_extrusion-origin">19.160</a>, <span class="Attribute">draw:extrusion-rotation-angle</span> <a href="#attribute-draw_extrusion-rotation-angle">19.161</a>, <span class="Attribute">draw:extrusion-rotation-center</span> <a href="#attribute-draw_extrusion-rotation-center">19.162</a>, <span class="Attribute">draw:extrusion-second-light-direction</span> <a href="#attribute-draw_extrusion-second-light-direction">19.163</a>, <span class="Attribute">draw:extrusion-second-light-harsh</span> <a href="#attribute-draw_extrusion-second-light-harsh">19.164</a>, <span class="Attribute">draw:extrusion-second-light-level</span> <a href="#attribute-draw_extrusion-second-light-level">19.165</a>, <span class="Attribute">draw:extrusion-shininess</span> <a href="#attribute-draw_extrusion-shininess">19.166</a>, <span class="Attribute">draw:extrusion-skew</span> <a href="#attribute-draw_extrusion-skew">19.167</a>, <span class="Attribute">draw:extrusion-specularity</span> <a href="#attribute-draw_extrusion-specularity">19.168</a>, <span class="Attribute">draw:extrusion-viewpoint</span> <a href="#attribute-draw_extrusion-viewpoint">19.169</a>, <span class="Attribute">draw:glue-point-leaving-directions</span> <a href="#attribute-draw_glue-point-leaving-directions">19.173</a>, <span class="Attribute">draw:glue-points</span> <a href="#attribute-draw_glue-points">19.175</a>, <span class="Attribute">draw:glue-point-type</span> <a href="#attribute-draw_glue-point-type">19.174</a>, <span class="Attribute">draw:mirror-horizontal</span> <a href="#attribute-draw_mirror-horizontal">19.192</a>, <span class="Attribute">draw:mirror-vertical</span> <a href="#attribute-draw_mirror-vertical">19.193</a>, <span class="Attribute">draw:modifiers</span> <a href="#attribute-draw_modifiers">19.196</a>, <span class="Attribute">draw:path-stretchpoint-x</span> <a href="#attribute-draw_path-stretchpoint-x">19.204</a>, <span class="Attribute">draw:path-stretchpoint-y</span> <a href="#attribute-draw_path-stretchpoint-y">19.205</a>, <span class="Attribute">draw:text-areas</span> <a href="#attribute-draw_text-areas">19.220</a>, <span class="Attribute">draw:text-path</span> <a href="#attribute-draw_text-path">19.221</a>, <span class="Attribute">draw:text-path-allowed</span> <a href="#attribute-draw_text-path-allowed">19.222</a>, <span class="Attribute">draw:text-path-mode</span> <a href="#attribute-draw_text-path-mode">19.223</a>, <span class="Attribute">draw:text-path-same-letter-heights</span> <a href="#attribute-draw_text-path-same-letter-heights">19.224</a>, <span class="Attribute">draw:text-path-scale</span> <a href="#attribute-draw_text-path-scale">19.225</a>, <span class="Attribute">draw:text-rotate-angle</span> <a href="#attribute-draw_text-rotate-angle">19.226</a>, <span class="Attribute">draw:type</span> <a href="#attribute-draw_type_element-draw_enhanced-geometry">19.229.3</a> and <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:enhanced-geometry&gt;</span> element has the following child elements: <span class="Element">&lt;draw:equation&gt;</span> <a href="#element-draw_equation">10.2.5</a> and <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><h3 class="Heading_20_3"><a id="a10_6_3_draw_handle_"><span style="margin-right:0.127cm;">10.6.3</span></a><a id="__RefHeading__1415914_253892949"/><a id="element-draw_handle"/>&lt;draw:handle&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:handle&gt;</span> element represents a single interaction handle for a drawing shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:handle&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:handle&gt;</span> element has the following attributes: <span class="Attribute">draw:handle-mirror-horizontal</span> <a href="#attribute-draw_handle-mirror-horizontal">19.176</a>, <span class="Attribute">draw:handle-mirror-vertical</span> <a href="#attribute-draw_handle-mirror-vertical">19.177</a>, <span class="Attribute">draw:handle-polar</span> <a href="#attribute-draw_handle-polar">19.178</a>, <span class="Attribute">draw:handle-position</span> <a href="#attribute-draw_handle-position">19.179</a>, <span class="Attribute">draw:handle-radius-range-maximum</span> <a href="#attribute-draw_handle-radius-range-maximum">19.180</a>, <span class="Attribute">draw:handle-radius-range-minimum</span> <a href="#attribute-draw_handle-radius-range-minimum">19.181</a>, <span class="Attribute">draw:handle-range-x-maximum</span> <a href="#attribute-draw_handle-range-x-maximum">19.182</a>, <span class="Attribute">draw:handle-range-x-minimum</span> <a href="#attribute-draw_handle-range-x-minimum">19.183</a>, <span class="Attribute">draw:handle-range-y-maximum</span> <a href="#attribute-draw_handle-range-y-maximum">19.184</a>, <span class="Attribute">draw:handle-range-y-minimum</span> <a href="#attribute-draw_handle-range-y-minimum">19.185</a> and <span class="Attribute">draw:handle-switched</span> <a href="#attribute-draw_handle-switched">19.186</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:handle&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a10_7Presentation_Shapes"><span style="margin-right:0.127cm;">10.7</span></a><a id="__RefHeading__1415916_253892949"/>Presentation Shapes</h2><p class="Text_20_body">Presentation shapes are shapes on a draw page that are part of a presentation page layout.<a href="#element-style_presentation-page-layout">16.41</a> They use styles with a style family value of <span class="Attribute_20_Value">presentation</span>, unlike drawing shapes which use styles with a style family value of <span class="Attribute_20_Value">graphic</span>. Presentation shapes can be empty, acting only as placeholders. If a draw page's presentation layout is changed, all presentation shapes contained in that draw page are adapted automatically.</p><p class="Text_20_body">Standard drawing shapes can also be used in presentations. The <span class="Attribute">presentation:class</span> attribute distinguishes presentation shapes from drawing shapes. Unlike presentation shapes, standard drawing shapes are not adapted if the presentation page layout is changed.</p><h2 class="Heading_20_2"><a id="a10_8Presentation_Animations"><span style="margin-right:0.127cm;">10.8</span></a><a id="__RefHeading__1415918_253892949"/>Presentation Animations</h2><h3 class="Heading_20_3"><a id="a10_8_1_presentation_animations_"><span style="margin-right:0.127cm;">10.8.1</span></a><a id="__RefHeading__1415920_253892949"/><a id="element-presentation_animations"/>&lt;presentation:animations&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:animations&gt;</span> element is a container for animation effects. Animation effects are executed when a page represented by a <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> element containing this element is displayed.</p><p class="Text_20_body">A single shape may be the subject of multiple effects. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:animations&gt;</span> element is usable within the following element: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:animations&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:animations&gt;</span> element has the following child elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a>, <span class="Element">&lt;presentation:dim&gt;</span> <a href="#element-presentation_dim">10.8.7</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:play&gt;</span> <a href="#element-presentation_play">10.8.8</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><h3 class="Heading_20_3"><a id="a10_8_2_presentation_sound_"><span style="margin-right:0.127cm;">10.8.2</span></a><a id="__RefHeading__1415922_253892949"/><a id="element-presentation_sound"/>&lt;presentation:sound&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:sound&gt;</span> element represents a sound.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:sound&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:dim&gt;</span> <a href="#element-presentation_dim">10.8.7</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a>, <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a> and <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:sound&gt;</span> element has the following attributes: <span class="Attribute">presentation:play-full</span> <a href="#attribute-presentation_play-full">19.408</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-presentation_sound">19.910.26</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:sound&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_8_3_presentation_show-shape_"><span style="margin-right:0.127cm;">10.8.3</span></a><a id="__RefHeading__1415924_253892949"/><a id="element-presentation_show-shape"/>&lt;presentation:show-shape&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:show-shape&gt;</span> element specifies when and how a shape becomes visible. Prior to execution of the effect defined by this element the shape containing it is invisible.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:show-shape&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a> and <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:show-shape&gt;</span> element has the following attributes: <span class="Attribute">draw:shape-id</span> <a href="#attribute-draw_shape-id">19.210</a>, <span class="Attribute">presentation:delay</span> <a href="#attribute-presentation_delay">19.391</a>, <span class="Attribute">presentation:direction</span> <a href="#attribute-presentation_direction">19.392</a>, <span class="Attribute">presentation:effect</span> <a href="#attribute-presentation_effect">19.394</a>, <span class="Attribute">presentation:path-id</span> <a href="#attribute-presentation_path-id">19.405</a>, <span class="Attribute">presentation:speed</span> <a href="#attribute-presentation_speed">19.417</a> and <span class="Attribute">presentation:start-scale</span> <a href="#attribute-presentation_start-scale">19.418</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:show-shape&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h3 class="Heading_20_3"><a id="a10_8_4_presentation_show-text_"><span style="margin-right:0.127cm;">10.8.4</span></a><a id="__RefHeading__1415926_253892949"/><a id="element-presentation_show-text"/>&lt;presentation:show-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:show-text&gt;</span> element defines an effect that makes text within a shape visible. Prior to execution of the effect defined by this element the shape and the text it contains are invisible. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:show-text&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a> and <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:show-text&gt;</span> element has the following attributes: <span class="Attribute">draw:shape-id</span> <a href="#attribute-draw_shape-id">19.210</a>, <span class="Attribute">presentation:delay</span> <a href="#attribute-presentation_delay">19.391</a>, <span class="Attribute">presentation:direction</span> <a href="#attribute-presentation_direction">19.392</a>, <span class="Attribute">presentation:effect</span> <a href="#attribute-presentation_effect">19.394</a>, <span class="Attribute">presentation:path-id</span> <a href="#attribute-presentation_path-id">19.405</a>, <span class="Attribute">presentation:speed</span> <a href="#attribute-presentation_speed">19.417</a> and <span class="Attribute">presentation:start-scale</span> <a href="#attribute-presentation_start-scale">19.418</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:show-text&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h3 class="Heading_20_3"><a id="a10_8_5_presentation_hide-shape_"><span style="margin-right:0.127cm;">10.8.5</span></a><a id="__RefHeading__1415928_253892949"/><a id="element-presentation_hide-shape"/>&lt;presentation:hide-shape&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:hide-shape&gt;</span> element specifies that a shape is invisible.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:hide-shape&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a> and <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:hide-shape&gt;</span> element has the following attributes: <span class="Attribute">draw:shape-id</span> <a href="#attribute-draw_shape-id">19.210</a>, <span class="Attribute">presentation:delay</span> <a href="#attribute-presentation_delay">19.391</a>, <span class="Attribute">presentation:direction</span> <a href="#attribute-presentation_direction">19.392</a>, <span class="Attribute">presentation:effect</span> <a href="#attribute-presentation_effect">19.394</a>, <span class="Attribute">presentation:path-id</span> <a href="#attribute-presentation_path-id">19.405</a>, <span class="Attribute">presentation:speed</span> <a href="#attribute-presentation_speed">19.417</a> and <span class="Attribute">presentation:start-scale</span> <a href="#attribute-presentation_start-scale">19.418</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:hide-shape&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h3 class="Heading_20_3"><a id="a10_8_6_presentation_hide-text_"><span style="margin-right:0.127cm;">10.8.6</span></a><a id="__RefHeading__1415930_253892949"/><a id="element-presentation_hide-text"/>&lt;presentation:hide-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:hide-text&gt;</span> element specifies an effect that makes text within a shape visible. Prior to execution of the effect specified by this element, the text contained inside a shape is invisible. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:hide-text&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a> and <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:hide-text&gt;</span> element has the following attributes: <span class="Attribute">draw:shape-id</span> <a href="#attribute-draw_shape-id">19.210</a>, <span class="Attribute">presentation:delay</span> <a href="#attribute-presentation_delay">19.391</a>, <span class="Attribute">presentation:direction</span> <a href="#attribute-presentation_direction">19.392</a>, <span class="Attribute">presentation:effect</span> <a href="#attribute-presentation_effect">19.394</a>, <span class="Attribute">presentation:path-id</span> <a href="#attribute-presentation_path-id">19.405</a>, <span class="Attribute">presentation:speed</span> <a href="#attribute-presentation_speed">19.417</a> and <span class="Attribute">presentation:start-scale</span> <a href="#attribute-presentation_start-scale">19.418</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:hide-text&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h3 class="Heading_20_3"><a id="a10_8_7_presentation_dim_"><span style="margin-right:0.127cm;">10.8.7</span></a><a id="__RefHeading__1415932_253892949"/><a id="element-presentation_dim"/>&lt;presentation:dim&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:dim&gt;</span> element specifies a fill color for a shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:dim&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a> and <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:dim&gt;</span> element has the following attributes: <span class="Attribute">draw:color</span> <a href="#attribute-draw_color_element-presentation_dim">19.122.3</a> and <span class="Attribute">draw:shape-id</span> <a href="#attribute-draw_shape-id">19.210</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:dim&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h3 class="Heading_20_3"><a id="a10_8_8_presentation_play_"><span style="margin-right:0.127cm;">10.8.8</span></a><a id="__RefHeading__1415934_253892949"/><a id="element-presentation_play"/>&lt;presentation:play&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:play&gt;</span> element specifies the presentation speed of animation of a shape. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:play&gt;</span> element is usable within the following elements: <span class="Element">&lt;presentation:animation-group&gt;</span> <a href="#element-presentation_animation-group">10.8.9</a> and <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:play&gt;</span> element has the following attributes: <span class="Attribute">draw:shape-id</span> <a href="#attribute-draw_shape-id">19.210</a> and <span class="Attribute">presentation:speed</span> <a href="#attribute-presentation_speed">19.417</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:play&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a10_8_9_presentation_animation-group_"><span style="margin-right:0.127cm;">10.8.9</span></a><a id="__RefHeading__1415936_253892949"/><a id="element-presentation_animation-group"/>&lt;presentation:animation-group&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;presentation:animation-group&gt;</span> element contains elements that specify multiple animation effects. Containment results in all effects occurring at the same time. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:animation-group&gt;</span> element is usable within the following element: <span class="Element">&lt;presentation:animations&gt;</span> <a href="#element-presentation_animations">10.8.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:animation-group&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:animation-group&gt;</span> element has the following child elements: <span class="Element">&lt;presentation:dim&gt;</span> <a href="#element-presentation_dim">10.8.7</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:play&gt;</span> <a href="#element-presentation_play">10.8.8</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><h2 class="Heading_20_2"><a id="a10_9SMIL_Presentation_Animations"><span style="margin-right:0.127cm;">10.9</span></a><a id="__RefHeading__1415938_253892949"/><a id="SMIL_Pres_Anim"/>SMIL Presentation Animations</h2><h3 class="Heading_20_3"><a id="a10_9_1General"><span style="margin-right:0.127cm;">10.9.1</span></a><a id="__RefHeading__1415940_253892949"/>General</h3><p class="Text_20_body">SMIL based shape animations are specified for presentation documents. This type of animation can be used instead of that specified by <span class="Element">&lt;presentation:animations&gt;</span> elements if one of the following items is required:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Multiple animations per shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A mixture of animations starting on user interaction and starting automatically per page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Multiple animations running at the same time.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Additional effects ”programmed” in XML by combining animation elements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Document transformations to SVG.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">An <span class="Def">effect</span> is a combination of one or more animation elements that animate a single shape and or a shape's paragraphs.</p><h3 class="Heading_20_3"><a id="a10_9_2_presentation_event-listener_"><span style="margin-right:0.127cm;">10.9.2</span></a><a id="__RefHeading__1415942_253892949"/><a id="element-presentation_event-listener"/>&lt;presentation:event-listener&gt; </h3><p class="Text_20_body">The <span class="Element">&lt;presentation:event-listener&gt;</span> element defines the trigger for a presentation event.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:event-listener&gt;</span> element is usable within the following element: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:event-listener&gt;</span> element has the following attributes: <span class="Attribute">presentation:action</span> <a href="#attribute-presentation_action">19.387</a>, <span class="Attribute">presentation:direction</span> <a href="#attribute-presentation_direction">19.392</a>, <span class="Attribute">presentation:effect</span> <a href="#attribute-presentation_effect">19.394</a>, <span class="Attribute">presentation:speed</span> <a href="#attribute-presentation_speed">19.417</a>, <span class="Attribute">presentation:start-scale</span> <a href="#attribute-presentation_start-scale">19.418</a>, <span class="Attribute">presentation:verb</span> <a href="#attribute-presentation_verb">19.428</a>, <span class="Attribute">script:event-name</span> <a href="#attribute-script_event-name">19.429</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-presentation_event-listener">19.910.25</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:event-listener&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h3 class="Heading_20_3"><a id="a10_9_3Presentation_Document_Content"><span style="margin-right:0.127cm;">10.9.3</span></a><a id="__RefHeading__1415944_253892949"/>Presentation Document Content</h3><h4 class="Heading_20_4"><a id="a10_9_3_1_presentation_header_"><span style="margin-right:0.127cm;">10.9.3.1</span></a><a id="__RefHeading__1415946_253892949"/><a id="element-presentation_header"/>&lt;presentation:header&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:header&gt;</span> element defines a field that contains a header for a presentation. Which header field declaration is used is specified by the <span class="Attribute">presentation:use-header-name</span> attribute of the draw page where the field occurs. In a presentation shape inside a master page <a href="#attribute-presentation_class">19.389</a>, the <span class="Attribute">presentation:use-header-name</span> attribute of the <span class="Element">&lt;draw:page&gt;</span> element for which the drawing shape is displayed is used. </p><p class="Note"><span class="Note_20_Label">Note: </span>This field is mainly used inside master pages. Since its value may differ for the individual drawing pages that make use of a master page, the current field value is not available.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:header&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:header&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:header&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a10_9_3_2_presentation_header-decl_"><span style="margin-right:0.127cm;">10.9.3.2</span></a><a id="__RefHeading__1415948_253892949"/><a id="element-presentation_header-decl"/>&lt;presentation:header-decl&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:header-decl&gt;</span> element specifies the text of a header field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:header-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:header-decl&gt;</span> element has the following attribute: <span class="Attribute">presentation:name</span> <a href="#attribute-presentation_name">19.401</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;presentation:header-decl&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:header-decl&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a10_9_3_3_presentation_footer_"><span style="margin-right:0.127cm;">10.9.3.3</span></a><a id="__RefHeading__1415950_253892949"/><a id="element-presentation_footer"/>&lt;presentation:footer&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:footer&gt;</span> element defines a field that contains a footer for a presentation. Footer fields display a footer text specified in a footer field declaration. See <a href="#element-presentation_footer-decl">10.9.3.4</a>. Which footer field declaration is used is specified by the <span class="Attribute">presentation:use-footer-name</span> attribute of the draw page where the field occurs. In a presentation drawing shape inside a master page <a href="#attribute-presentation_class">19.389</a>, the <span class="Attribute">presentation:use-footer-name</span> attribute of the <span class="Element">&lt;draw:page&gt;</span> for which the drawing shape is displayed is used.</p><p class="Note"><span class="Note_20_Label">Note:</span> This field is mainly used inside master pages. Since its value may differ for the individual drawing pages that make use of a master page, the current field value is not available.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:footer&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:footer&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:footer&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a10_9_3_4_presentation_footer-decl_"><span style="margin-right:0.127cm;">10.9.3.4</span></a><a id="__RefHeading__1415952_253892949"/><a id="element-presentation_footer-decl"/>&lt;presentation:footer-decl&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:footer-decl&gt;</span> element specifies the text of a footer field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:footer-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:footer-decl&gt;</span> element has the following attribute: <span class="Attribute">presentation:name</span> <a href="#attribute-presentation_name">19.401</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;presentation:footer-decl&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:footer-decl&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a10_9_3_5_presentation_date-time_"><span style="margin-right:0.127cm;">10.9.3.5</span></a><a id="__RefHeading__1415954_253892949"/><a id="element-presentation_date-time"/>&lt;presentation:date-time&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:date-time&gt;</span> element defines a field that contains the date/time text for a presentation. Date and time fields display a date/time text as specified in the date/time field declaration. See <a href="#element-presentation_date-time-decl">10.9.3.6</a>. Which date-time field declaration is used is specified by the <span class="Attribute">presentation:use-date-time-name</span> attribute of the draw page where the field occurs. In a presentation drawing shape inside a master page <a href="#attribute-presentation_class">19.389</a>, the <span class="Attribute">presentation:use-date-time-name</span> attribute of the drawing page for which the drawing shape is displayed is used. </p><p class="Note"><span class="Note_20_Label">Note:</span> This field is mainly used inside master pages. Since its value may differ for the individual drawing pages that make use of a master page, the current field value is not available.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:date-time&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:date-time&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:date-time&gt;</span> element has no child elements.</p><h4 class="Heading_20_4"><a id="a10_9_3_6_presentation_date-time-decl_"><span style="margin-right:0.127cm;">10.9.3.6</span></a><a id="__RefHeading__1415956_253892949"/><a id="element-presentation_date-time-decl"/>&lt;presentation:date-time-decl&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:date-time-decl&gt;</span> element specifies the text of a date-time field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:date-time-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:date-time-decl&gt;</span> element has the following attributes: <span class="Attribute">presentation:name</span> <a href="#attribute-presentation_name">19.401</a>, <span class="Attribute">presentation:source</span> <a href="#attribute-presentation_source">19.416</a> and <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-presentation_date-time-decl">19.469.2</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;presentation:date-time-decl&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:date-time-decl&gt;</span> element has character data content.</p><h4 class="Heading_20_4"><a id="a10_9_3_7_presentation_settings_"><span style="margin-right:0.127cm;">10.9.3.7</span></a><a id="__RefHeading__1415958_253892949"/><a id="element-presentation_settings"/>&lt;presentation:settings&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:settings&gt;</span> element is a container for the settings for a presentation in a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:settings&gt;</span> element is usable within the following element: <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:settings&gt;</span> element has the following attributes: <span class="Attribute">presentation:animations</span> <a href="#attribute-presentation_animations">19.388</a>, <span class="Attribute">presentation:endless</span> <a href="#attribute-presentation_endless">19.393</a>, <span class="Attribute">presentation:force-manual</span> <a href="#attribute-presentation_force-manual">19.395</a>, <span class="Attribute">presentation:full-screen</span> <a href="#attribute-presentation_full-screen">19.396</a>, <span class="Attribute">presentation:mouse-as-pen</span> <a href="#attribute-presentation_mouse-as-pen">19.399</a>, <span class="Attribute">presentation:mouse-visible</span> <a href="#attribute-presentation_mouse-visible">19.400</a>, <span class="Attribute">presentation:pause</span> <a href="#attribute-presentation_pause">19.406</a>, <span class="Attribute">presentation:show</span> <a href="#attribute-presentation_show">19.413</a>, <span class="Attribute">presentation:show-end-of-presentation-slide</span> <a href="#attribute-presentation_show-end-of-presentation-slide">19.414</a>, <span class="Attribute">presentation:show-logo</span> <a href="#attribute-presentation_show-logo">19.415</a>, <span class="Attribute">presentation:start-page</span> <a href="#attribute-presentation_start-page">19.419</a>, <span class="Attribute">presentation:start-with-navigator</span> <a href="#attribute-presentation_start-with-navigator">19.420</a>, <span class="Attribute">presentation:stay-on-top</span> <a href="#attribute-presentation_stay-on-top">19.421</a> and <span class="Attribute">presentation:transition-on-click</span> <a href="#attribute-presentation_transition-on-click">19.423</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:settings&gt;</span> element has the following child element: <span class="Element">&lt;presentation:show&gt;</span> <a href="#element-presentation_show">10.9.3.8</a>.</p><h4 class="Heading_20_4"><a id="a10_9_3_8_presentation_show_"><span style="margin-right:0.127cm;">10.9.3.8</span></a><a id="__RefHeading__1415960_253892949"/><a id="element-presentation_show"/>&lt;presentation:show&gt;</h4><p class="Text_20_body">The <span class="Element">&lt;presentation:show&gt;</span> element specifies the order in which pages are displayed during a presentation. </p><p class="Note"><span class="Note_20_Label">Note:</span> The order of pages can be used to omit or repeat pages in a presentation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:show&gt;</span> element is usable within the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:show&gt;</span> element has the following attributes: <span class="Attribute">presentation:name</span> <a href="#attribute-presentation_name">19.401</a> and <span class="Attribute">presentation:pages</span> <a href="#attribute-presentation_pages">19.404</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:show&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a11Chart_Content"><span style="margin-right:0.127cm;">11</span></a><a id="__RefHeading__1415962_253892949"/><a id="Chart_Content"/>Chart Content</h1><h2 class="Heading_20_2"><a id="a11_1_chart_chart_"><span style="margin-right:0.127cm;">11.1</span></a><a id="__RefHeading__1415964_253892949"/><a id="element-chart_chart"/>&lt;chart:chart&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:chart&gt;</span> element represents a chart. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:chart&gt;</span> element is usable within the following element: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:chart&gt;</span> element has the following attributes: <span class="Attribute">chart:class</span> <a href="#attribute-chart_class_element-chart_chart">19.15.1</a>, <span class="Attribute">chart:column-mapping</span> <a href="#attribute-chart_column-mapping">19.16</a>, <span class="Attribute">chart:row-mapping</span> <a href="#attribute-chart_row-mapping">19.26</a>, <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-chart_chart">19.539.1</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-chart_chart">19.571.1</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-chart_chart">19.910.3</a>, <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:chart&gt;</span> element has the following child elements: <span class="Element">&lt;chart:footer&gt;</span> <a href="#element-chart_footer">11.2.3</a>, <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>, <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;chart:subtitle&gt;</span> <a href="#element-chart_subtitle">11.2.2</a>, <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><h2 class="Heading_20_2"><a id="a11_2Title__Subtitle_and_Footer"><span style="margin-right:0.127cm;">11.2</span></a><a id="__RefHeading__1415966_253892949"/>Title, Subtitle and Footer</h2><h3 class="Heading_20_3"><a id="a11_2_1_chart_title_"><span style="margin-right:0.127cm;">11.2.1</span></a><a id="__RefHeading__1415968_253892949"/><a id="element-chart_title"/>&lt;chart:title&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;chart:title&gt;</span> element represents a title in a chart document. </p><p class="Text_20_body">The text of a title is specified by a child <span class="Element">&lt;text:p&gt;</span> element or a <span class="Attribute">table:cell-range</span> attribute. If a child <span class="Element">&lt;text:p&gt;</span> element and a <span class="Attribute">table:cell-range</span> attribute are both present, the text specified by the <span class="Attribute">table:cell-range</span> attribute is used as the title. By default, the content of a child <span class="Element">&lt;text:p&gt;</span> element is displayed as the title. </p><p class="Text_20_body">This element can also be a sub-element of <span class="Element">&lt;chart:axis&gt;</span>. <a href="#element-chart_axis">11.8</a> In that case the title is displayed beside the axis specified by the <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:title&gt;</span> element is usable within the following elements: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a> and <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:title&gt;</span> element has the following attributes: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_title">19.573.1</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_title">19.577.1</a> and <span class="Attribute">table:cell-range</span> <a href="#attribute-table_cell-range">19.592</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:title&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a11_2_2_chart_subtitle_"><span style="margin-right:0.127cm;">11.2.2</span></a><a id="__RefHeading__1415970_253892949"/><a id="element-chart_subtitle"/>&lt;chart:subtitle&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;chart:subtitle&gt;</span> element represents a subtitle for a chart.</p><p class="Text_20_body">The text of a subtitle is specified by a child <span class="Element">&lt;text:p&gt;</span> element or a <span class="Attribute">table:cell-range</span> attribute. If a child <span class="Element">&lt;text:p&gt;</span> element and a <span class="Attribute">table:cell-range</span> attribute are both present, the text specified by the <span class="Attribute">table:cell-range</span> attribute is used as the subtitle. By default, the content of a child <span class="Element">&lt;text:p&gt;</span> element is displayed as the title. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:subtitle&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:subtitle&gt;</span> element has the following attributes: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_subtitle">19.573.1</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_subtitle">19.577.1</a> and <span class="Attribute">table:cell-range</span> <a href="#attribute-table_cell-range">19.592</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:subtitle&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a11_2_3_chart_footer_"><span style="margin-right:0.127cm;">11.2.3</span></a><a id="__RefHeading__1415972_253892949"/><a id="element-chart_footer"/>&lt;chart:footer&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;chart:footer&gt;</span> element represents a footer below a chart's plot area.</p><p class="Text_20_body">The text of a footer is specified by a child <span class="Element">&lt;text:p&gt;</span> element or a <span class="Attribute">table:cell-range</span> attribute. If a child <span class="Element">&lt;text:p&gt;</span> element and a <span class="Attribute">table:cell-range</span> attribute are both present, the text specified by the <span class="Attribute">table:cell-range</span> attribute is used as the footer. By default, the content of a child <span class="Element">&lt;text:p&gt;</span> element is displayed as the footer. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:footer&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:footer&gt;</span> element has the following attributes: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_footer">19.573.1</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_footer">19.577.1</a> and <span class="Attribute">table:cell-range</span> <a href="#attribute-table_cell-range">19.592</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:footer&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a11_3_chart_legend_"><span style="margin-right:0.127cm;">11.3</span></a><a id="__RefHeading__1415974_253892949"/><a id="element-chart_legend"/>&lt;chart:legend&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:legend&gt;</span> element represents a legend for a chart. If there is no <span class="Element">&lt;chart:legend&gt;</span> element for a chart, no legend is displayed. </p><p class="Text_20_body">A legend contains a list of legend entries. Each entry consists of a graphical entry key and an entry text. </p><p class="Text_20_body">For circle and ring charts each legend entry represents an individual data point of the first series. The graphical entry key represents the visual appearance of a data point while the entry text is the category of the point.</p><p class="Text_20_body"> The categories to use are given as a list of labels defined by the <span class="Element">&lt;chart:categories&gt;</span> element at the x-axis. They are paired with matching data points in the order in which they appear. </p><p class="Text_20_body">For surface charts each graphic entry key represents the graphical appearance of the surface within a major interval of the altitude axis and the entry text represents the value range of that interval.</p><p class="Text_20_body">For all other chart types the legend entries represent the series of the chart. The graphical entry keys represent the visual appearance of each series while the entry texts contain the names of the series. </p><p class="Text_20_body">The legend may include additional entries for regression-curves and mean-value lines. </p><p class="Text_20_body">The <span class="Element">&lt;chart:legend&gt;</span> element may contain a <span class="Element">&lt;text:p&gt;</span> element. If present, it defines a title for the legend.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:legend&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:legend&gt;</span> element has the following attributes: <span class="Attribute">chart:legend-align</span> <a href="#attribute-chart_legend-align">19.22</a>, <span class="Attribute">chart:legend-position</span> <a href="#attribute-chart_legend-position">19.23</a>, <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">style:legend-expansion</span> <a href="#attribute-style_legend-expansion">19.490</a>, <span class="Attribute">style:legend-expansion-aspect-ratio</span> <a href="#attribute-style_legend-expansion-aspect-ratio">19.491</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_legend">19.573.1</a> and <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_legend">19.577.1</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:legend&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a11_4_chart_plot-area_"><span style="margin-right:0.127cm;">11.4</span></a><a id="__RefHeading__1415976_253892949"/><a id="element-chart_plot-area"/>&lt;chart:plot-area&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:plot-area&gt;</span> element represents a coordinate system in which data is plotted including defined axes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:plot-area&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:plot-area&gt;</span> element has the following attributes: <span class="Attribute">chart:data-source-has-labels</span> <a href="#attribute-chart_data-source-has-labels">19.17</a>, <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">dr3d:ambient-color</span> <a href="#attribute-dr3d_ambient-color">19.92</a>, <span class="Attribute">dr3d:distance</span> <a href="#attribute-dr3d_distance">19.96</a>, <span class="Attribute">dr3d:focal-length</span> <a href="#attribute-dr3d_focal-length">19.98</a>, <span class="Attribute">dr3d:lighting-mode</span> <a href="#attribute-dr3d_lighting-mode_element-chart_plot-area">19.99.2</a>, <span class="Attribute">dr3d:projection</span> <a href="#attribute-dr3d_projection">19.102</a>, <span class="Attribute">dr3d:shade-mode</span> <a href="#attribute-dr3d_shade-mode">19.103</a>, <span class="Attribute">dr3d:shadow-slant</span> <a href="#attribute-dr3d_shadow-slant">19.104</a>, <span class="Attribute">dr3d:transform</span> <a href="#attribute-dr3d_transform">19.107</a>, <span class="Attribute">dr3d:vpn</span> <a href="#attribute-dr3d_vpn">19.108</a>, <span class="Attribute">dr3d:vrp</span> <a href="#attribute-dr3d_vrp">19.109</a>, <span class="Attribute">dr3d:vup</span> <a href="#attribute-dr3d_vup">19.110</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-chart_plot-area">19.539.2</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-chart_plot-area">19.571.3</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_plot-area">19.573.1</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_plot-area">19.577.1</a>, <span class="Attribute">table:cell-range-address</span> <a href="#attribute-table_cell-range-address_element-chart_plot-area">19.593.6</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:plot-area&gt;</span> element has the following child elements: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a>, <span class="Element">&lt;chart:floor&gt;</span> <a href="#element-chart_floor">11.7</a>, <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>, <span class="Element">&lt;chart:stock-gain-marker&gt;</span> <a href="#element-chart_stock-gain-marker">11.19</a>, <span class="Element">&lt;chart:stock-loss-marker&gt;</span> <a href="#element-chart_stock-loss-marker">11.20</a>, <span class="Element">&lt;chart:stock-range-line&gt;</span> <a href="#element-chart_stock-range-line">11.21</a>, <span class="Element">&lt;chart:wall&gt;</span> <a href="#element-chart_wall">11.6</a> and <span class="Element">&lt;dr3d:light&gt;</span> <a href="#element-dr3d_light">10.5.3</a>.</p><h2 class="Heading_20_2"><a id="a11_53D_Plot_Area"><span style="margin-right:0.127cm;">11.5</span></a><a id="__RefHeading__1415978_253892949"/>3D Plot Area</h2><p class="Text_20_body">The plot area may be displayed as an 3D scene as specified in section <a href="#element-dr3d_scene">10.5.2</a>. All 3D attributes that can be applied to the <span class="Element">&lt;dr3d:scene&gt;</span> element can be applied to the <span class="Element">&lt;chart:plot-area&gt;</span> element. This includes the <span class="Attribute">dr3d:transform</span> attribute that specifies the rotation of the three-dimensional plot area. <a href="#element-dr3d_scene">10.5.2</a> The <span class="Element">&lt;chart:plot-area&gt;</span> element may contain a <span class="Element">&lt;dr3d:light&gt;</span> element as specified in section <a href="#element-dr3d_light">10.5.3</a>.</p><h2 class="Heading_20_2"><a id="a11_6_chart_wall_"><span style="margin-right:0.127cm;">11.6</span></a><a id="__RefHeading__1415980_253892949"/><a id="element-chart_wall"/>&lt;chart:wall&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:wall&gt;</span> element specifies the wall of a chart. For two-dimensional charts, the wall spans the entire plot area. For three-dimensional charts, the wall consists of two perpendicular rectangles.</p><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute specifies the thickness of a wall for three-dimensional charts.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:wall&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:wall&gt;</span> element has the following attributes: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a> and <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-chart_wall">19.571.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:wall&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_7_chart_floor_"><span style="margin-right:0.127cm;">11.7</span></a><a id="__RefHeading__1415982_253892949"/><a id="element-chart_floor"/>&lt;chart:floor&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:floor&gt;</span> element specifies the floor of a chart. For three-dimensional charts, the <span class="Element">&lt;chart:floor&gt;</span> element shall be present in addition to the <span class="Element">&lt;chart:wall&gt;</span> element. </p><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute specifies the thickness of the floor.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:floor&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:floor&gt;</span> element has the following attributes: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a> and <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-chart_floor">19.571.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:floor&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_8_chart_axis_"><span style="margin-right:0.127cm;">11.8</span></a><a id="__RefHeading__1415984_253892949"/><a id="element-chart_axis"/>&lt;chart:axis&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:axis&gt;</span> element specifies an axis for a chart.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:axis&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:axis&gt;</span> element has the following attributes: <span class="Attribute">chart:dimension</span> <a href="#attribute-chart_dimension">19.18</a>, <span class="Attribute">chart:name</span> <a href="#attribute-chart_name">19.24</a> and <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:axis&gt;</span> element has the following child elements: <span class="Element">&lt;chart:categories&gt;</span> <a href="#element-chart_categories">11.9</a>, <span class="Element">&lt;chart:grid&gt;</span> <a href="#element-chart_grid">11.10</a> and <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a>.</p><h2 class="Heading_20_2"><a id="a11_9_chart_categories_"><span style="margin-right:0.127cm;">11.9</span></a><a id="__RefHeading__1415986_253892949"/><a id="element-chart_categories"/>&lt;chart:categories&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:categories&gt;</span> element represents labels that are displayed on a category-axis.</p><p class="Text_20_body">This element may have a <span class="Attribute">table:cell-range-address</span> attribute that specifies a range from which category labels are taken. If this attribute or the <span class="Element">&lt;chart:categories&gt;</span> element itself is omitted, the <span class="Attribute">chart:data-source-has-labels</span> attribute of the <span class="Element">&lt;chart:plot-area&gt;</span> element should be evaluated for labels to display on a category-axis.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:categories&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:categories&gt;</span> element has the following attribute: <span class="Attribute">table:cell-range-address</span> <a href="#attribute-table_cell-range-address_element-chart_categories">19.593.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:categories&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_10_chart_grid_"><span style="margin-right:0.127cm;">11.10</span></a><a id="__RefHeading__1415988_253892949"/><a id="element-chart_grid"/>&lt;chart:grid&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:grid&gt;</span> element specifies a grid for an axis. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:grid&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:grid&gt;</span> element has the following attributes: <span class="Attribute">chart:class</span> <a href="#attribute-chart_class_element-chart_grid">19.15.2</a> and <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:grid&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_11_chart_series_"><span style="margin-right:0.127cm;">11.11</span></a><a id="__RefHeading__1415990_253892949"/><a id="element-chart_series"/>&lt;chart:series&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:series&gt;</span> element represents a data series in a chart. If the chart requires more input data, like it is the case for scatter and bubble charts, <span class="Element">&lt;chart:domain&gt;</span> sub-elements shall be defined that contain the cell range addresses of the corresponding data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:series&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:series&gt;</span> element has the following attributes: <span class="Attribute">chart:attached-axis</span> <a href="#attribute-chart_attached-axis">19.13</a>, <span class="Attribute">chart:class</span> <a href="#attribute-chart_class_element-chart_series">19.15.1</a>, <span class="Attribute">chart:label-cell-address</span> <a href="#attribute-chart_label-cell-address">19.21</a>, <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">chart:values-cell-range-address</span> <a href="#attribute-chart_values-cell-range-address">19.28</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:series&gt;</span> element has the following child elements: <span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a>, <span class="Element">&lt;chart:data-point&gt;</span> <a href="#element-chart_data-point">11.13</a>, <span class="Element">&lt;chart:domain&gt;</span> <a href="#element-chart_domain">11.12</a>, <span class="Element">&lt;chart:error-indicator&gt;</span> <a href="#element-chart_error-indicator">11.16</a>, <span class="Element">&lt;chart:mean-value&gt;</span> <a href="#element-chart_mean-value">11.15</a> and <span class="Element">&lt;chart:regression-curve&gt;</span> <a href="#element-chart_regression-curve">11.17</a>.</p><h2 class="Heading_20_2"><a id="a11_12_chart_domain_"><span style="margin-right:0.127cm;">11.12</span></a><a id="__RefHeading__1415992_253892949"/><a id="element-chart_domain"/>&lt;chart:domain&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:domain&gt;</span> element specifies coordinate values required by particular chart types.</p><p class="Text_20_body">For scatter charts, one <span class="Element">&lt;chart:domain&gt;</span> element shall exist. Its <span class="Attribute">table:cell-range-address</span> attribute references the x-coordinate values for the scatter chart.</p><p class="Text_20_body">For bubble charts, two <span class="Element">&lt;chart:domain&gt;</span> elements shall exist. The values for the y-coordinates are given by the first <span class="Element">&lt;chart:domain&gt;</span> element. The values for the x-coordinates are given by the second <span class="Element">&lt;chart:domain&gt;</span> element.</p><p class="Text_20_body">For surface charts, up to two <span class="Element">&lt;chart:domain&gt;</span> elements are allowed to exist. The values for the y-coordinates are given by the first <span class="Element">&lt;chart:domain&gt;</span> element. The values for the x-coordinates are given by the second <span class="Element">&lt;chart:domain&gt;</span> element. </p><p class="Text_20_body">At least one <span class="Element">&lt;chart:series&gt;</span> element of a given <span class="Attribute">chart:class</span> shall have the necessary number of <span class="Element">&lt;chart:domain&gt;</span> sub-elements. All other <span class="Element">&lt;chart:series&gt;</span> elements with the same <span class="Attribute">chart:class</span> may omit the <span class="Element">&lt;chart:domain&gt;</span> sub-elements and use the previously defined values for that type of chart. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:domain&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:domain&gt;</span> element has the following attribute: <span class="Attribute">table:cell-range-address</span> <a href="#attribute-table_cell-range-address_element-chart_domain">19.593.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:domain&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_13_chart_data-point_"><span style="margin-right:0.127cm;">11.13</span></a><a id="__RefHeading__1415994_253892949"/><a id="element-chart_data-point"/>&lt;chart:data-point&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:data-point&gt;</span> element specifies a style for a single data point in a data series.</p><p class="Note"><span class="Note_20_Label">Note:</span> This element can be used if a single data point has a special or distinct appearance.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:data-point&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:data-point&gt;</span> element has the following attributes: <span class="Attribute">chart:repeated</span> <a href="#attribute-chart_repeated">19.25</a>, <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:data-point&gt;</span> element has the following child element: <span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a>.</p><h2 class="Heading_20_2"><a id="a11_14_chart_data-label_"><span style="margin-right:0.127cm;">11.14</span></a><a id="__RefHeading__1415996_253892949"/><a id="element-chart_data-label"/>&lt;chart:data-label&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:data-label&gt;</span> element represents the data label of a data point. </p><p class="Text_20_body">The <span class="Element">&lt;chart:data-label&gt;</span> element can also be a sub-element of a data series. In that case, the data label serves as default for all the data points of this series.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:data-label&gt;</span> element is usable within the following elements: <span class="Element">&lt;chart:data-point&gt;</span> <a href="#element-chart_data-point">11.13</a> and <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:data-label&gt;</span> element has the following attributes: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_data-label">19.573.1</a> and <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_data-label">19.577.1</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:data-label&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a11_15_chart_mean-value_"><span style="margin-right:0.127cm;">11.15</span></a><a id="__RefHeading__1415998_253892949"/><a id="element-chart_mean-value"/>&lt;chart:mean-value&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:mean-value&gt;</span> element specifies a style for a mean-value line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:mean-value&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:mean-value&gt;</span> element has the following attribute: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:mean-value&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_16_chart_error-indicator_"><span style="margin-right:0.127cm;">11.16</span></a><a id="__RefHeading__1416000_253892949"/><a id="element-chart_error-indicator"/>&lt;chart:error-indicator&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:error-indicator&gt;</span> element specifies a style for error-indicators.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:error-indicator&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:error-indicator&gt;</span> element has the following attributes: <span class="Attribute">chart:dimension</span> <a href="#attribute-chart_dimension">19.18</a> and <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:error-indicator&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_17_chart_regression-curve_"><span style="margin-right:0.127cm;">11.17</span></a><a id="__RefHeading__1416002_253892949"/><a id="element-chart_regression-curve"/>&lt;chart:regression-curve&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:regression-curve&gt;</span> element specifies the properties of regression-lines.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:regression-curve&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:regression-curve&gt;</span> element has the following attribute: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:regression-curve&gt;</span> element has the following child element: <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>.</p><h2 class="Heading_20_2"><a id="a11_18_chart_equation_"><span style="margin-right:0.127cm;">11.18</span></a><a id="__RefHeading__1416004_253892949"/><a id="element-chart_equation"/>&lt;chart:equation&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:equation&gt;</span> element represents the equation for a containing regression curve. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:equation&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:regression-curve&gt;</span> <a href="#element-chart_regression-curve">11.17</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:equation&gt;</span> element has the following attributes: <span class="Attribute">chart:automatic-content</span> <a href="#attribute-chart_automatic-content">19.14</a>, <span class="Attribute">chart:display-equation</span> <a href="#attribute-chart_display-equation">19.19</a>, <span class="Attribute">chart:display-r-square</span> <a href="#attribute-chart_display-r-square">19.20</a>, <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-chart_equation">19.573.1</a> and <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-chart_equation">19.577.1</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:equation&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a11_19_chart_stock-gain-marker_"><span style="margin-right:0.127cm;">11.19</span></a><a id="__RefHeading__1416006_253892949"/><a id="element-chart_stock-gain-marker"/>&lt;chart:stock-gain-marker&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:stock-gain-marker&gt;</span> element specifies a style for candlestick-bars in a stock chart that have a higher closing value than opening value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:stock-gain-marker&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:stock-gain-marker&gt;</span> element has the following attribute: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:stock-gain-marker&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_20_chart_stock-loss-marker_"><span style="margin-right:0.127cm;">11.20</span></a><a id="__RefHeading__1416008_253892949"/><a id="element-chart_stock-loss-marker"/>&lt;chart:stock-loss-marker&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:stock-loss-marker&gt;</span> element specifies the style for candlestick-bars in a stock chart that have a lower closing value than opening value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:stock-loss-marker&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:stock-loss-marker&gt;</span> element has the following attribute: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:stock-loss-marker&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a11_21_chart_stock-range-line_"><span style="margin-right:0.127cm;">11.21</span></a><a id="__RefHeading__1416010_253892949"/><a id="element-chart_stock-range-line"/>&lt;chart:stock-range-line&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:stock-range-line&gt;</span> element specifies a style for the range-lines in a stock chart. A range-line is a line connecting the minimum value with the maximum value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:stock-range-line&gt;</span> element is usable within the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:stock-range-line&gt;</span> element has the following attribute: <span class="Attribute">chart:style-name</span> <a href="#attribute-chart_style-name">19.27</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:stock-range-line&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a12Database_Front-end_Document_Content"><span style="margin-right:0.127cm;">12</span></a><a id="__RefHeading__1416012_253892949"/>Database Front-end Document Content</h1><h2 class="Heading_20_2"><a id="a12_1_office_database_"><span style="margin-right:0.127cm;">12.1</span></a><a id="__RefHeading__1416014_253892949"/><a id="element-office_database"/>&lt;office:database&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;office:database&gt;</span> element is a container of database elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:database&gt;</span> element is usable within the following element: <span class="Element">&lt;office:body&gt;</span> <a href="#element-office_body">3.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:database&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:database&gt;</span> element has the following child elements: <span class="Element">&lt;db:data-source&gt;</span> <a href="#element-db_data-source">12.2</a>, <span class="Element">&lt;db:forms&gt;</span> <a href="#element-db_forms">12.25.2</a>, <span class="Element">&lt;db:queries&gt;</span> <a href="#element-db_queries">12.26</a>, <span class="Element">&lt;db:reports&gt;</span> <a href="#element-db_reports">12.25.3</a>, <span class="Element">&lt;db:schema-definition&gt;</span> <a href="#element-db_schema-definition">12.36</a> and <span class="Element">&lt;db:table-representations&gt;</span> <a href="#element-db_table-representations">12.32</a>.</p><h2 class="Heading_20_2"><a id="a12_2_db_data-source_"><span style="margin-right:0.127cm;">12.2</span></a><a id="__RefHeading__1416016_253892949"/><a id="element-db_data-source"/>&lt;db:data-source&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;db:data-source&gt;</span> element is a container for data source specific elements that are needed to create a connection to a database.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:data-source&gt;</span> element is usable within the following element: <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:data-source&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:data-source&gt;</span> element has the following child elements: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>, <span class="Element">&lt;db:connection-data&gt;</span> <a href="#element-db_connection-data">12.3</a> and <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a>.</p><h2 class="Heading_20_2"><a id="a12_3_db_connection-data_"><span style="margin-right:0.127cm;">12.3</span></a><a id="__RefHeading__1416018_253892949"/><a id="element-db_connection-data"/>&lt;db:connection-data&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:connection-data&gt;</span> element specifies the information necessary to connect to a database.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:connection-data&gt;</span> element is usable within the following element: <span class="Element">&lt;db:data-source&gt;</span> <a href="#element-db_data-source">12.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:connection-data&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:connection-data&gt;</span> element has the following child elements: <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;db:database-description&gt;</span> <a href="#element-db_database-description">12.4</a> and <span class="Element">&lt;db:login&gt;</span> <a href="#element-db_login">12.8</a>.</p><h2 class="Heading_20_2"><a id="a12_4_db_database-description_"><span style="margin-right:0.127cm;">12.4</span></a><a id="__RefHeading__1416020_253892949"/><a id="element-db_database-description"/>&lt;db:database-description&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:database-description&gt;</span> element specifies a database resource by its type and access parameters.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:database-description&gt;</span> element is usable within the following element: <span class="Element">&lt;db:connection-data&gt;</span> <a href="#element-db_connection-data">12.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:database-description&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:database-description&gt;</span> element has the following child elements: <span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a> and <span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a>.</p><h2 class="Heading_20_2"><a id="a12_5_db_file-based-database_"><span style="margin-right:0.127cm;">12.5</span></a><a id="__RefHeading__1416022_253892949"/><a id="element-db_file-based-database"/>&lt;db:file-based-database&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:file-based-database&gt;</span> element specifies a database which is composed of one or more files in an arbitrary file system.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:file-based-database&gt;</span> element is usable within the following element: <span class="Element">&lt;db:database-description&gt;</span> <a href="#element-db_database-description">12.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:file-based-database&gt;</span> element has the following attributes: <span class="Attribute">db:extension</span> <a href="#attribute-db_extension">19.52</a>, <span class="Attribute">db:media-type</span> <a href="#attribute-db_media-type">19.69</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-db_file-based-database">19.910.7</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:file-based-database&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_6_db_server-database_"><span style="margin-right:0.127cm;">12.6</span></a><a id="__RefHeading__1416024_253892949"/><a id="element-db_server-database"/>&lt;db:server-database&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:server-database&gt;</span> element specifies connection information for a server-based database. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:server-database&gt;</span> element is usable within the following element: <span class="Element">&lt;db:database-description&gt;</span> <a href="#element-db_database-description">12.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:server-database&gt;</span> element has the following attributes: <span class="Attribute">db:database-name</span> <a href="#attribute-db_database-name">19.43</a>, <span class="Attribute">db:hostname</span> <a href="#attribute-db_hostname">19.54</a>, <span class="Attribute">db:local-socket</span> <a href="#attribute-db_local-socket">19.67</a>, <span class="Attribute">db:port</span> <a href="#attribute-db_port">19.72</a> and <span class="Attribute">db:type</span> <a href="#attribute-db_type_element-db_server-database">19.85.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:server-database&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_7_db_connection-resource_"><span style="margin-right:0.127cm;">12.7</span></a><a id="__RefHeading__1416026_253892949"/><a id="element-db_connection-resource"/>&lt;db:connection-resource&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:connection-resource&gt;</span> element specifies a database connection by an IRI.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:connection-resource&gt;</span> element is usable within the following element: <span class="Element">&lt;db:connection-data&gt;</span> <a href="#element-db_connection-data">12.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:connection-resource&gt;</span> element has the following attributes: <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-db_connection-resource">19.910.6</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:connection-resource&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_8_db_login_"><span style="margin-right:0.127cm;">12.8</span></a><a id="__RefHeading__1416028_253892949"/><a id="element-db_login"/>&lt;db:login&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:login&gt;</span> element specifies the information needed to establish a connection to a database.</p><p class="Note"><span class="Note_20_Label">Note:</span> For security reasons, the <span class="Element">&lt;db:login&gt;</span> element does not have an attribute to store a password that may be required to establish a connection. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:login&gt;</span> element is usable within the following element: <span class="Element">&lt;db:connection-data&gt;</span> <a href="#element-db_connection-data">12.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:login&gt;</span> element has the following attributes: <span class="Attribute">db:is-password-required</span> <a href="#attribute-db_is-password-required">19.63</a>, <span class="Attribute">db:login-timeout</span> <a href="#attribute-db_login-timeout">19.61</a>, <span class="Attribute">db:user-name</span> <a href="#attribute-db_user-name">19.90</a> and <span class="Attribute">db:use-system-user</span> <a href="#attribute-db_use-system-user">19.89</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:login&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_9_db_driver-settings_"><span style="margin-right:0.127cm;">12.9</span></a><a id="__RefHeading__1416030_253892949"/><a id="element-db_driver-settings"/>&lt;db:driver-settings&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:driver-settings&gt;</span> element specifies settings for a driver establishing the database connection.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:driver-settings&gt;</span> element is usable within the following element: <span class="Element">&lt;db:data-source&gt;</span> <a href="#element-db_data-source">12.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:driver-settings&gt;</span> element has the following attributes: <span class="Attribute">db:base-dn</span> <a href="#attribute-db_base-dn">19.35</a>, <span class="Attribute">db:is-first-row-header-line</span> <a href="#attribute-db_is-first-row-header-line">19.60</a>, <span class="Attribute">db:parameter-name-substitution</span> <a href="#attribute-db_parameter-name-substitution">19.71</a>, <span class="Attribute">db:show-deleted</span> <a href="#attribute-db_show-deleted">19.78</a> and <span class="Attribute">db:system-driver-settings</span> <a href="#attribute-db_system-driver-settings">19.82</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:driver-settings&gt;</span> element has the following child elements: <span class="Element">&lt;db:auto-increment&gt;</span> <a href="#element-db_auto-increment">12.10</a>, <span class="Element">&lt;db:character-set&gt;</span> <a href="#element-db_character-set">12.12</a>, <span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a> and <span class="Element">&lt;db:table-settings&gt;</span> <a href="#element-db_table-settings">12.13</a>.</p><h2 class="Heading_20_2"><a id="a12_10_db_auto-increment_"><span style="margin-right:0.127cm;">12.10</span></a><a id="__RefHeading__1416032_253892949"/><a id="element-db_auto-increment"/>&lt;db:auto-increment&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:auto-increment&gt;</span> element specifies SQL statements to retrieve auto-generated row values and to set AUTO_INCREMENT values for columns. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:auto-increment&gt;</span> element is usable within the following element: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:auto-increment&gt;</span> element has the following attributes: <span class="Attribute">db:additional-column-statement</span> <a href="#attribute-db_additional-column-statement">19.31</a> and <span class="Attribute">db:row-retrieving-statement</span> <a href="#attribute-db_row-retrieving-statement">19.75</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:auto-increment&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_11_db_delimiter_"><span style="margin-right:0.127cm;">12.11</span></a><a id="__RefHeading__1416034_253892949"/><a id="element-db_delimiter"/>&lt;db:delimiter&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:delimiter&gt;</span> element defines a delimiter for parsing data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:delimiter&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a> and <span class="Element">&lt;db:table-setting&gt;</span> <a href="#element-db_table-setting">12.14</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:delimiter&gt;</span> element has the following attributes: <span class="Attribute">db:decimal</span> <a href="#attribute-db_decimal">19.44</a>, <span class="Attribute">db:field</span> <a href="#attribute-db_field">19.53</a>, <span class="Attribute">db:string</span> <a href="#attribute-db_string">19.79</a> and <span class="Attribute">db:thousand</span> <a href="#attribute-db_thousand">19.83</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:delimiter&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_12_db_character-set_"><span style="margin-right:0.127cm;">12.12</span></a><a id="__RefHeading__1416036_253892949"/><a id="element-db_character-set"/>&lt;db:character-set&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:character-set&gt;</span> element defines the text encoding that is used to transform string data obtained from a database.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:character-set&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a> and <span class="Element">&lt;db:table-setting&gt;</span> <a href="#element-db_table-setting">12.14</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:character-set&gt;</span> element has the following attribute: <span class="Attribute">db:encoding</span> <a href="#attribute-db_encoding">19.50</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:character-set&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_13_db_table-settings_"><span style="margin-right:0.127cm;">12.13</span></a><a id="__RefHeading__1416038_253892949"/><a id="element-db_table-settings"/>&lt;db:table-settings&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-settings&gt;</span> element is a container for <span class="Element">&lt;db:table-setting&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-settings&gt;</span> element is usable within the following element: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-settings&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-settings&gt;</span> element has the following child element: <span class="Element">&lt;db:table-setting&gt;</span> <a href="#element-db_table-setting">12.14</a>.</p><h2 class="Heading_20_2"><a id="a12_14_db_table-setting_"><span style="margin-right:0.127cm;">12.14</span></a><a id="__RefHeading__1416040_253892949"/><a id="element-db_table-setting"/>&lt;db:table-setting&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-setting&gt;</span> element specifies driver-level settings which are used by a database driver for defining a single database table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-setting&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-settings&gt;</span> <a href="#element-db_table-settings">12.13</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-setting&gt;</span> element has the following attributes: <span class="Attribute">db:is-first-row-header-line</span> <a href="#attribute-db_is-first-row-header-line">19.60</a> and <span class="Attribute">db:show-deleted</span> <a href="#attribute-db_show-deleted">19.78</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-setting&gt;</span> element has the following child elements: <span class="Element">&lt;db:character-set&gt;</span> <a href="#element-db_character-set">12.12</a> and <span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a>.</p><h2 class="Heading_20_2"><a id="a12_15_db_application-connection-settings_"><span style="margin-right:0.127cm;">12.15</span></a><a id="__RefHeading__1416042_253892949"/><a id="element-db_application-connection-settings"/>&lt;db:application-connection-settings&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:application-connection-settings&gt;</span> element specifies settings which define how a consumer uses a database connection.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:application-connection-settings&gt;</span> element is usable within the following element: <span class="Element">&lt;db:data-source&gt;</span> <a href="#element-db_data-source">12.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:application-connection-settings&gt;</span> element has the following attributes: <span class="Attribute">db:append-table-alias-name</span> <a href="#attribute-db_append-table-alias-name">19.32</a>, <span class="Attribute">db:boolean-comparison-mode</span> <a href="#attribute-db_boolean-comparison-mode">19.36</a>, <span class="Attribute">db:enable-sql92-check</span> <a href="#attribute-db_enable-sql92-check">19.49</a>, <span class="Attribute">db:ignore-driver-privileges</span> <a href="#attribute-db_ignore-driver-privileges">19.55</a>, <span class="Attribute">db:is-table-name-length-limited</span> <a href="#attribute-db_is-table-name-length-limited">19.66</a>, <span class="Attribute">db:max-row-count</span> <a href="#attribute-db_max-row-count">19.68</a>, <span class="Attribute">db:suppress-version-columns</span> <a href="#attribute-db_suppress-version-columns">19.81</a> and <span class="Attribute">db:use-catalog</span> <a href="#attribute-db_use-catalog">19.88</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:application-connection-settings&gt;</span> element has the following child elements: <span class="Element">&lt;db:data-source-settings&gt;</span> <a href="#element-db_data-source-settings">12.22</a>, <span class="Element">&lt;db:table-filter&gt;</span> <a href="#element-db_table-filter">12.16</a> and <span class="Element">&lt;db:table-type-filter&gt;</span> <a href="#element-db_table-type-filter">12.20</a>.</p><h2 class="Heading_20_2"><a id="a12_16_db_table-filter_"><span style="margin-right:0.127cm;">12.16</span></a><a id="__RefHeading__1416044_253892949"/><a id="element-db_table-filter"/>&lt;db:table-filter&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;db:table-filter&gt;</span> element defines a list of filter patterns which are applied on the table names returned by a database. Only tables which match at least one include filter, and do not match any exclude filter, will be displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-filter&gt;</span> element is usable within the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-filter&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-filter&gt;</span> element has the following child elements: <span class="Element">&lt;db:table-exclude-filter&gt;</span> <a href="#element-db_table-exclude-filter">12.18</a> and <span class="Element">&lt;db:table-include-filter&gt;</span> <a href="#element-db_table-include-filter">12.17</a>.</p><h2 class="Heading_20_2"><a id="a12_17_db_table-include-filter_"><span style="margin-right:0.127cm;">12.17</span></a><a id="__RefHeading__1416046_253892949"/><a id="element-db_table-include-filter"/>&lt;db:table-include-filter&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-include-filter&gt;</span> element specifies a list of filter patterns which determine inclusion of tables in a consumer's table display.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-include-filter&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-filter&gt;</span> <a href="#element-db_table-filter">12.16</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-include-filter&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-include-filter&gt;</span> element has the following child element: <span class="Element">&lt;db:table-filter-pattern&gt;</span> <a href="#element-db_table-filter-pattern">12.19</a>.</p><h2 class="Heading_20_2"><a id="a12_18_db_table-exclude-filter_"><span style="margin-right:0.127cm;">12.18</span></a><a id="__RefHeading__1416048_253892949"/><a id="element-db_table-exclude-filter"/>&lt;db:table-exclude-filter&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-exclude-filter&gt;</span> element specifies a list of filter patterns which determine exclusion of tables in a consumer's table display.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-exclude-filter&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-filter&gt;</span> <a href="#element-db_table-filter">12.16</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-exclude-filter&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-exclude-filter&gt;</span> element has the following child element: <span class="Element">&lt;db:table-filter-pattern&gt;</span> <a href="#element-db_table-filter-pattern">12.19</a>.</p><h2 class="Heading_20_2"><a id="a12_19_db_table-filter-pattern_"><span style="margin-right:0.127cm;">12.19</span></a><a id="__RefHeading__1416050_253892949"/><a id="element-db_table-filter-pattern"/>&lt;db:table-filter-pattern&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-filter-pattern&gt;</span> element specifies a filter pattern. </p><p class="Text_20_body"><span class="Note_20_Label">T</span>he “%” (U+0025. PERCENT SIGN) character is used as wildcard.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-filter-pattern&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:table-exclude-filter&gt;</span> <a href="#element-db_table-exclude-filter">12.18</a> and <span class="Element">&lt;db:table-include-filter&gt;</span> <a href="#element-db_table-include-filter">12.17</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-filter-pattern&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;db:table-filter-pattern&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-filter-pattern&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a12_20_db_table-type-filter_"><span style="margin-right:0.127cm;">12.20</span></a><a id="__RefHeading__1416052_253892949"/><a id="element-db_table-type-filter"/>&lt;db:table-type-filter&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;db:table-type-filter&gt;</span> element defines a list of table types which a database uses to filter tables. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-type-filter&gt;</span> element is usable within the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-type-filter&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-type-filter&gt;</span> element has the following child element: <span class="Element">&lt;db:table-type&gt;</span> <a href="#element-db_table-type">12.21</a>.</p><h2 class="Heading_20_2"><a id="a12_21_db_table-type_"><span style="margin-right:0.127cm;">12.21</span></a><a id="__RefHeading__1416054_253892949"/><a id="element-db_table-type"/>&lt;db:table-type&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-type&gt;</span> element specifies a table type. </p><p class="Note"><span class="Note_20_Label">Note: </span>Table types are database specific.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-type&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-type-filter&gt;</span> <a href="#element-db_table-type-filter">12.20</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-type&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;db:table-type&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-type&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a12_22_db_data-source-settings_"><span style="margin-right:0.127cm;">12.22</span></a><a id="__RefHeading__1416056_253892949"/><a id="element-db_data-source-settings"/>&lt;db:data-source-settings&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:data-source-settings&gt;</span> element is a container element for <span class="Element">&lt;db:data-source-setting&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:data-source-settings&gt;</span> element is usable within the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:data-source-settings&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:data-source-settings&gt;</span> element has the following child element: <span class="Element">&lt;db:data-source-setting&gt;</span> <a href="#element-db_data-source-setting">12.23</a>.</p><h2 class="Heading_20_2"><a id="a12_23_db_data-source-setting_"><span style="margin-right:0.127cm;">12.23</span></a><a id="__RefHeading__1416058_253892949"/><a id="element-db_data-source-setting"/>&lt;db:data-source-setting&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:data-source-setting&gt;</span> element specifies the name of a data-source-setting, a data-source-setting type, and whether a data-source-setting contains a list of data or single data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:data-source-setting&gt;</span> element is usable within the following element: <span class="Element">&lt;db:data-source-settings&gt;</span> <a href="#element-db_data-source-settings">12.22</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:data-source-setting&gt;</span> element has the following attributes: <span class="Attribute">db:data-source-setting-is-list</span> <a href="#attribute-db_data-source-setting-is-list">19.39</a>, <span class="Attribute">db:data-source-setting-name</span> <a href="#attribute-db_data-source-setting-name">19.40</a> and <span class="Attribute">db:data-source-setting-type</span> <a href="#attribute-db_data-source-setting-type">19.41</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:data-source-setting&gt;</span> element has the following child element: <span class="Element">&lt;db:data-source-setting-value&gt;</span> <a href="#element-db_data-source-setting-value">12.24</a>.</p><h2 class="Heading_20_2"><a id="a12_24_db_data-source-setting-value_"><span style="margin-right:0.127cm;">12.24</span></a><a id="__RefHeading__1416060_253892949"/><a id="element-db_data-source-setting-value"/>&lt;db:data-source-setting-value&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:data-source-setting-value&gt;</span> element specifies the content of a data-source-setting.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:data-source-setting-value&gt;</span> element is usable within the following element: <span class="Element">&lt;db:data-source-setting&gt;</span> <a href="#element-db_data-source-setting">12.23</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:data-source-setting-value&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;db:data-source-setting-value&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:data-source-setting-value&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a12_25Forms_and_Reports"><span style="margin-right:0.127cm;">12.25</span></a><a id="__RefHeading__1416062_253892949"/>Forms and Reports</h2><h3 class="Heading_20_3"><a id="a12_25_1General"><span style="margin-right:0.127cm;">12.25.1</span></a><a id="__RefHeading__1416064_253892949"/>General</h3><p class="Text_20_body">Database documents can contain forms and reports as sub documents. They're included in database front end documents by XLinks. Alternatively, the content of sub documents may be included in the <span class="Element">&lt;db:component&gt;</span> elements as child elements.</p><h3 class="Heading_20_3"><a id="a12_25_2_db_forms_"><span style="margin-right:0.127cm;">12.25.2</span></a><a id="__RefHeading__1416066_253892949"/><a id="element-db_forms"/>&lt;db:forms&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;db:forms&gt;</span> element may contain <span class="Element">&lt;db:component&gt;</span> or <span class="Element">&lt;db:component-collection&gt;</span> elements or both. It specifies a list of form documents and sub collections. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:forms&gt;</span> element is usable within the following element: <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:forms&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:forms&gt;</span> element has the following child elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a> and <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>.</p><h3 class="Heading_20_3"><a id="a12_25_3_db_reports_"><span style="margin-right:0.127cm;">12.25.3</span></a><a id="__RefHeading__1416068_253892949"/><a id="element-db_reports"/>&lt;db:reports&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;db:reports&gt;</span> element may contain <span class="Element">&lt;db:component&gt;</span> or <span class="Element">&lt;db:component-collection&gt;</span> elements or both.  It specifies a list of report documents and sub collections. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:reports&gt;</span> element is usable within the following element: <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:reports&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:reports&gt;</span> element has the following child elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a> and <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>.</p><h3 class="Heading_20_3"><a id="a12_25_4_db_component-collection_"><span style="margin-right:0.127cm;">12.25.4</span></a><a id="__RefHeading__1416070_253892949"/><a id="element-db_component-collection"/>&lt;db:component-collection&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;db:component-collection&gt;</span> element specifies a collection of <span class="Element">&lt;db:component&gt;</span> elements and <span class="Element">&lt;db:component-collection&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:component-collection&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>, <span class="Element">&lt;db:forms&gt;</span> <a href="#element-db_forms">12.25.2</a> and <span class="Element">&lt;db:reports&gt;</span> <a href="#element-db_reports">12.25.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:component-collection&gt;</span> element has the following attributes: <span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_component-collection">19.70.5</a> and <span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:component-collection&gt;</span> element has the following child elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a> and <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>.</p><h3 class="Heading_20_3"><a id="a12_25_5_db_component_"><span style="margin-right:0.127cm;">12.25.5</span></a><a id="__RefHeading__1416072_253892949"/><a id="element-db_component"/>&lt;db:component&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;db:component&gt;</span> element specifies a database component which can be either a form or a report.</p><p class="Text_20_body">A database component is either referenced using the <span class="Attribute">xlink:href</span> attribute or it is contained in a child <span class="Element">&lt;office:document&gt;</span> or <span class="Element">&lt;math:math&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:component&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>, <span class="Element">&lt;db:forms&gt;</span> <a href="#element-db_forms">12.25.2</a> and <span class="Element">&lt;db:reports&gt;</span> <a href="#element-db_reports">12.25.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:component&gt;</span> element has the following attributes: <span class="Attribute">db:as-template</span> <a href="#attribute-db_as-template">19.34</a>, <span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_component">19.70.4</a>, <span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-db_component">19.910.5</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:component&gt;</span> element has the following child elements: <span class="Element">&lt;math:math&gt;</span> <a href="#element-math_math">14.5</a> and <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>.</p><h2 class="Heading_20_2"><a id="a12_26_db_queries_"><span style="margin-right:0.127cm;">12.26</span></a><a id="__RefHeading__1416074_253892949"/><a id="element-db_queries"/>&lt;db:queries&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:queries&gt;</span> element may contain <span class="Element">&lt;db:query&gt;</span> or <span class="Element">&lt;db:query-collection&gt;</span> elements or both.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:queries&gt;</span> element is usable within the following element: <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:queries&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:queries&gt;</span> element has the following child elements: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a> and <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a>.</p><h2 class="Heading_20_2"><a id="a12_27_db_query-collection_"><span style="margin-right:0.127cm;">12.27</span></a><a id="__RefHeading__1416076_253892949"/><a id="element-db_query-collection"/>&lt;db:query-collection&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:query-collection&gt;</span> element may contain <span class="Element">&lt;db:query&gt;</span> or <span class="Element">&lt;db:query-collection&gt;</span> elements or both.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:query-collection&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:queries&gt;</span> <a href="#element-db_queries">12.26</a> and <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:query-collection&gt;</span> element has the following attributes: <span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_query-collection">19.70.11</a> and <span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:query-collection&gt;</span> element has the following child elements: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a> and <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a>.</p><h2 class="Heading_20_2"><a id="a12_28_db_query_"><span style="margin-right:0.127cm;">12.28</span></a><a id="__RefHeading__1416078_253892949"/><a id="element-db_query"/>&lt;db:query&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:query&gt;</span> element specifies a database query.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:query&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:queries&gt;</span> <a href="#element-db_queries">12.26</a> and <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:query&gt;</span> element has the following attributes: <span class="Attribute">db:command</span> <a href="#attribute-db_command">19.38</a>, <span class="Attribute">db:default-row-style-name</span> <a href="#attribute-db_default-row-style-name">19.46</a>, <span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a>, <span class="Attribute">db:escape-processing</span> <a href="#attribute-db_escape-processing">19.51</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_query">19.70.10</a>, <span class="Attribute">db:style-name</span> <a href="#attribute-db_style-name_element-db_query">19.80.3</a> and <span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:query&gt;</span> element has the following child elements: <span class="Element">&lt;db:columns&gt;</span> <a href="#element-db_columns">12.34</a>, <span class="Element">&lt;db:filter-statement&gt;</span> <a href="#element-db_filter-statement">12.30</a>, <span class="Element">&lt;db:order-statement&gt;</span> <a href="#element-db_order-statement">12.29</a> and <span class="Element">&lt;db:update-table&gt;</span> <a href="#element-db_update-table">12.31</a>.</p><h2 class="Heading_20_2"><a id="a12_29_db_order-statement_"><span style="margin-right:0.127cm;">12.29</span></a><a id="__RefHeading__1416080_253892949"/><a id="element-db_order-statement"/>&lt;db:order-statement&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:order-statement&gt;</span> element specifies a sort ("ORDER BY") SQL clause which is to be applied on top of another SQL statement producing a result set.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:order-statement&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a> and <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:order-statement&gt;</span> element has the following attributes: <span class="Attribute">db:apply-command</span> <a href="#attribute-db_apply-command">19.33</a> and <span class="Attribute">db:command</span> <a href="#attribute-db_command">19.38</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:order-statement&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_30_db_filter-statement_"><span style="margin-right:0.127cm;">12.30</span></a><a id="__RefHeading__1416082_253892949"/><a id="element-db_filter-statement"/>&lt;db:filter-statement&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:filter-statement&gt;</span> element specifies a filter ("WHERE") SQL clause which is to be applied on top of another SQL-statement producing a result set.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:filter-statement&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a> and <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:filter-statement&gt;</span> element has the following attributes: <span class="Attribute">db:apply-command</span> <a href="#attribute-db_apply-command">19.33</a> and <span class="Attribute">db:command</span> <a href="#attribute-db_command">19.38</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:filter-statement&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_31_db_update-table_"><span style="margin-right:0.127cm;">12.31</span></a><a id="__RefHeading__1416084_253892949"/><a id="element-db_update-table"/>&lt;db:update-table&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:update-table&gt;</span> element specifies the name of the table which will be updated when an UPDATE, INSERT or DELETE SQL statement is executed. It defines the table which should be updated when the select statement contains more than one table. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:update-table&gt;</span> element is usable within the following element: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:update-table&gt;</span> element has the following attributes: <span class="Attribute">db:catalog-name</span> <a href="#attribute-db_catalog-name">19.37</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_update-table">19.70.14</a> and <span class="Attribute">db:schema-name</span> <a href="#attribute-db_schema-name">19.77</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:update-table&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_32_db_table-representations_"><span style="margin-right:0.127cm;">12.32</span></a><a id="__RefHeading__1416086_253892949"/><a id="element-db_table-representations"/>&lt;db:table-representations&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-representations&gt;</span> element specifies a collection of tables.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-representations&gt;</span> element is usable within the following element: <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-representations&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-representations&gt;</span> element has the following child element: <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><h2 class="Heading_20_2"><a id="a12_33_db_table-representation_"><span style="margin-right:0.127cm;">12.33</span></a><a id="__RefHeading__1416088_253892949"/><a id="element-db_table-representation"/>&lt;db:table-representation&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;db:table-representation&gt;</span> element specifies how a consumer displays a table to the user.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-representation&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-representations&gt;</span> <a href="#element-db_table-representations">12.32</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-representation&gt;</span> element has the following attributes: <span class="Attribute">db:catalog-name</span> <a href="#attribute-db_catalog-name">19.37</a>, <span class="Attribute">db:default-row-style-name</span> <a href="#attribute-db_default-row-style-name">19.46</a>, <span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_table-representation">19.70.13</a>, <span class="Attribute">db:schema-name</span> <a href="#attribute-db_schema-name">19.77</a>, <span class="Attribute">db:style-name</span> <a href="#attribute-db_style-name_element-db_table-representation">19.80.4</a> and <span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-representation&gt;</span> element has the following child elements: <span class="Element">&lt;db:columns&gt;</span> <a href="#element-db_columns">12.34</a>, <span class="Element">&lt;db:filter-statement&gt;</span> <a href="#element-db_filter-statement">12.30</a> and <span class="Element">&lt;db:order-statement&gt;</span> <a href="#element-db_order-statement">12.29</a>.</p><h2 class="Heading_20_2"><a id="a12_34_db_columns_"><span style="margin-right:0.127cm;">12.34</span></a><a id="__RefHeading__1416090_253892949"/><a id="element-db_columns"/>&lt;db:columns&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:columns&gt;</span> element is a collection of <span class="Element">&lt;db:column&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:columns&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a> and <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:columns&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:columns&gt;</span> element has the following child element: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>.</p><h2 class="Heading_20_2"><a id="a12_35_db_column_"><span style="margin-right:0.127cm;">12.35</span></a><a id="__RefHeading__1416092_253892949"/><a id="element-db_column"/>&lt;db:column&gt;</h2><p class="Text_20_body"><a id="__DdeLink__280214_1363921367"/>The <span class="Element">&lt;db:column&gt;</span> element specifies settings for a column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:column&gt;</span> element is usable within the following element: <span class="Element">&lt;db:columns&gt;</span> <a href="#element-db_columns">12.34</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:column&gt;</span> element has the following attributes: <span class="Attribute">db:default-cell-style-name</span> <a href="#attribute-db_default-cell-style-name">19.45</a>, <span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_column">19.70.2</a>, <span class="Attribute">db:style-name</span> <a href="#attribute-db_style-name_element-db_column">19.80.2</a>, <span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a>, <span class="Attribute">db:visible</span> <a href="#attribute-db_visible">19.91</a>, <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:column&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_36_db_schema-definition_"><span style="margin-right:0.127cm;">12.36</span></a><a id="__RefHeading__1416094_253892949"/><a id="element-db_schema-definition"/>&lt;db:schema-definition&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:schema-definition&gt;</span> element specifies a database schema. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:schema-definition&gt;</span> element is usable within the following element: <span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:schema-definition&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:schema-definition&gt;</span> element has the following child element: <span class="Element">&lt;db:table-definitions&gt;</span> <a href="#element-db_table-definitions">12.37</a>.</p><h2 class="Heading_20_2"><a id="a12_37_db_table-definitions_"><span style="margin-right:0.127cm;">12.37</span></a><a id="__RefHeading__1416096_253892949"/><a id="element-db_table-definitions"/>&lt;db:table-definitions&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-definitions&gt;</span> element is a container for multiple <span class="Element">&lt;db:table-definition&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-definitions&gt;</span> element is usable within the following element: <span class="Element">&lt;db:schema-definition&gt;</span> <a href="#element-db_schema-definition">12.36</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-definitions&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-definitions&gt;</span> element has the following child element: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>.</p><h2 class="Heading_20_2"><a id="a12_38_db_table-definition_"><span style="margin-right:0.127cm;">12.38</span></a><a id="__RefHeading__1416098_253892949"/><a id="element-db_table-definition"/>&lt;db:table-definition&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:table-definition&gt;</span> element specifies the schema of a single table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:table-definition&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-definitions&gt;</span> <a href="#element-db_table-definitions">12.37</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:table-definition&gt;</span> element has the following attributes: <span class="Attribute">db:catalog-name</span> <a href="#attribute-db_catalog-name">19.37</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_table-definition">19.70.12</a>, <span class="Attribute">db:schema-name</span> <a href="#attribute-db_schema-name">19.77</a> and <span class="Attribute">db:type</span> <a href="#attribute-db_type_element-db_table-definition">19.85.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:table-definition&gt;</span> element has the following child elements: <span class="Element">&lt;db:column-definitions&gt;</span> <a href="#element-db_column-definitions">12.39</a>, <span class="Element">&lt;db:indices&gt;</span> <a href="#element-db_indices">12.45</a> and <span class="Element">&lt;db:keys&gt;</span> <a href="#element-db_keys">12.41</a>.</p><h2 class="Heading_20_2"><a id="a12_39_db_column-definitions_"><span style="margin-right:0.127cm;">12.39</span></a><a id="__RefHeading__1416100_253892949"/><a id="element-db_column-definitions"/>&lt;db:column-definitions&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:column-definitions&gt;</span> element is a container for <span class="Element">&lt;db:column-definition&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:column-definitions&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:column-definitions&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:column-definitions&gt;</span> element has the following child element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><h2 class="Heading_20_2"><a id="a12_40_db_column-definition_"><span style="margin-right:0.127cm;">12.40</span></a><a id="__RefHeading__1416102_253892949"/><a id="element-db_column-definition"/>&lt;db:column-definition&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:column-definition&gt;</span> element defines a table column. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:column-definition&gt;</span> element is usable within the following element: <span class="Element">&lt;db:column-definitions&gt;</span> <a href="#element-db_column-definitions">12.39</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:column-definition&gt;</span> element has the following attributes: <span class="Attribute">db:data-type</span> <a href="#attribute-db_data-type">19.42</a>, <span class="Attribute">db:is-autoincrement</span> <a href="#attribute-db_is-autoincrement">19.57</a>, <span class="Attribute">db:is-empty-allowed</span> <a href="#attribute-db_is-empty-allowed">19.59</a>, <span class="Attribute">db:is-nullable</span> <a href="#attribute-db_is-nullable">19.62</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_column-definition">19.70.3</a>, <span class="Attribute">db:precision</span> <a href="#attribute-db_precision">19.65</a>, <span class="Attribute">db:scale</span> <a href="#attribute-db_scale">19.76</a>, <span class="Attribute">db:type-name</span> <a href="#attribute-db_type-name">19.86</a>, <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:column-definition&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_41_db_keys_"><span style="margin-right:0.127cm;">12.41</span></a><a id="__RefHeading__1416104_253892949"/><a id="element-db_keys"/>&lt;db:keys&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:keys&gt;</span> element is a container for one or more <span class="Element">&lt;db:key&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:keys&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:keys&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:keys&gt;</span> element has the following child element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><h2 class="Heading_20_2"><a id="a12_42_db_key_"><span style="margin-right:0.127cm;">12.42</span></a><a id="__RefHeading__1416106_253892949"/><a id="element-db_key"/>&lt;db:key&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:key&gt;</span> element specifies a key for a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:key&gt;</span> element is usable within the following element: <span class="Element">&lt;db:keys&gt;</span> <a href="#element-db_keys">12.41</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:key&gt;</span> element has the following attributes: <span class="Attribute">db:delete-rule</span> <a href="#attribute-db_delete-rule">19.47</a>, <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_key">19.70.8</a>, <span class="Attribute">db:referenced-table-name</span> <a href="#attribute-db_referenced-table-name">19.73</a>, <span class="Attribute">db:type</span> <a href="#attribute-db_type_element-db_key">19.85.2</a> and <span class="Attribute">db:update-rule</span> <a href="#attribute-db_update-rule">19.87</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:key&gt;</span> element has the following child element: <span class="Element">&lt;db:key-columns&gt;</span> <a href="#element-db_key-columns">12.43</a>.</p><h2 class="Heading_20_2"><a id="a12_43_db_key-columns_"><span style="margin-right:0.127cm;">12.43</span></a><a id="__RefHeading__1416108_253892949"/><a id="element-db_key-columns"/>&lt;db:key-columns&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:key-columns&gt;</span> element specifies the columns of a key.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:key-columns&gt;</span> element is usable within the following element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:key-columns&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:key-columns&gt;</span> element has the following child element: <span class="Element">&lt;db:key-column&gt;</span> <a href="#element-db_key-column">12.44</a>.</p><h2 class="Heading_20_2"><a id="a12_44_db_key-column_"><span style="margin-right:0.127cm;">12.44</span></a><a id="__RefHeading__1416110_253892949"/><a id="element-db_key-column"/>&lt;db:key-column&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:key-column&gt;</span> element specifies a description of a column of a table key</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:key-column&gt;</span> element is usable within the following element: <span class="Element">&lt;db:key-columns&gt;</span> <a href="#element-db_key-columns">12.43</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:key-column&gt;</span> element has the following attributes: <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_key-column">19.70.9</a> and <span class="Attribute">db:related-column-name</span> <a href="#attribute-db_related-column-name">19.74</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:key-column&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a12_45_db_indices_"><span style="margin-right:0.127cm;">12.45</span></a><a id="__RefHeading__1416112_253892949"/><a id="element-db_indices"/>&lt;db:indices&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:indices&gt;</span> element defines the indexes of a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:indices&gt;</span> element is usable within the following element: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:indices&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:indices&gt;</span> element has the following child element: <span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a>.</p><h2 class="Heading_20_2"><a id="a12_46_db_index_"><span style="margin-right:0.127cm;">12.46</span></a><a id="__RefHeading__1416114_253892949"/><a id="element-db_index"/>&lt;db:index&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:index&gt;</span> element defines the types of indexes of a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:index&gt;</span> element is usable within the following element: <span class="Element">&lt;db:indices&gt;</span> <a href="#element-db_indices">12.45</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:index&gt;</span> element has the following attributes: <span class="Attribute">db:catalog-name</span> <a href="#attribute-db_catalog-name">19.37</a>, <span class="Attribute">db:is-clustered</span> <a href="#attribute-db_is-clustered">19.58</a>, <span class="Attribute">db:is-unique</span> <a href="#attribute-db_is-unique">19.64</a> and <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_index">19.70.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:index&gt;</span> element has the following child element: <span class="Element">&lt;db:index-columns&gt;</span> <a href="#element-db_index-columns">12.47</a>.</p><h2 class="Heading_20_2"><a id="a12_47_db_index-columns_"><span style="margin-right:0.127cm;">12.47</span></a><a id="__RefHeading__1416116_253892949"/><a id="element-db_index-columns"/>&lt;db:index-columns&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:index-columns&gt;</span> element specifies the columns of an index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:index-columns&gt;</span> element is usable within the following element: <span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:index-columns&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:index-columns&gt;</span> element has the following child element: <span class="Element">&lt;db:index-column&gt;</span> <a href="#element-db_index-column">12.48</a>.</p><h2 class="Heading_20_2"><a id="a12_48_db_index-column_"><span style="margin-right:0.127cm;">12.48</span></a><a id="__RefHeading__1416118_253892949"/><a id="element-db_index-column"/>&lt;db:index-column&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;db:index-column&gt;</span> element specifies the description of a column of a table index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;db:index-column&gt;</span> element is usable within the following element: <span class="Element">&lt;db:index-columns&gt;</span> <a href="#element-db_index-columns">12.47</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;db:index-column&gt;</span> element has the following attributes: <span class="Attribute">db:is-ascending</span> <a href="#attribute-db_is-ascending">19.56</a> and <span class="Attribute">db:name</span> <a href="#attribute-db_name_element-db_index-column">19.70.7</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;db:index-column&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a13Form_Content"><span style="margin-right:0.127cm;">13</span></a><a id="__RefHeading__1416120_253892949"/><a id="Form_Content"/>Form Content</h1><h2 class="Heading_20_2"><a id="a13_1General"><span style="margin-right:0.127cm;">13.1</span></a><a id="__RefHeading__1416122_253892949"/><a id="data-aware"/>General</h2><p class="Text_20_body">A form is a container for user interface controls. </p><p class="Note"><span class="Note_20_Label">Note: </span>Buttons, text boxes, check boxes, and drop-down lists are user interface controls that can be contained in a form. </p><p class="Text_20_body">In the OpenDocument format, the following rules apply to user interface controls and forms:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>All controls shall be located in a form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>All controls that are not hidden are assigned an absolute or relative position. These visual aspects of a control are represented by drawing shapes that contain a reference to the control.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Forms may be nested. The containing form provides a context for the contained form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Forms are not connected with the text flow and layout of a document. This does not apply to controls.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Forms can be data-aware. A form is data-aware if the values subject to its controls are populated from and updated to a database.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Form behavior is defined for submission and connection to a data source only for forms defined by a <span class="Element">&lt;form:form&gt;</span> element.</p><p class="Text_20_body">The result set of values subject to the controls of the form is defined by the <span class="Attribute">form:datasource</span>, <span class="Attribute">form:command</span>, and <span class="Attribute">form:command-type</span> attributes. At any point in time, only one row of the result set is subject to the forms controls. </p><p class="Text_20_body">Form behavior is not defined for forms defined by a <span class="Element">&lt;xforms:model&gt;</span> element.</p><h2 class="Heading_20_2"><a id="a13_2_office_forms_"><span style="margin-right:0.127cm;">13.2</span></a><a id="__RefHeading__1416124_253892949"/><a id="element-office_forms"/>&lt;office:forms&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:forms&gt;</span> element is a container for <span class="Element">&lt;form:form&gt;</span> or <span class="Element">&lt;xforms:model&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:forms&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:forms&gt;</span> element has the following attributes: <span class="Attribute">form:apply-design-mode</span> <a href="#attribute-form_apply-design-mode">19.250</a> and <span class="Attribute">form:automatic-focus</span> <a href="#attribute-form_automatic-focus">19.253</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:forms&gt;</span> element has the following child elements: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a> and <span class="Element">&lt;xforms:model&gt;</span> <a href="#element-xforms_model">13.4</a>.</p><h2 class="Heading_20_2"><a id="a13_3_form_form_"><span style="margin-right:0.127cm;">13.3</span></a><a id="__RefHeading__1416126_253892949"/><a id="element-form_form"/>&lt;form:form&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;form:form&gt;</span> element specifies a user interface form and defines the contents and properties of the form.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:form&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a> and <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:form&gt;</span> element has the following attributes: <span class="Attribute">form:allow-deletes</span> <a href="#attribute-form_allow-deletes">19.247</a>, <span class="Attribute">form:allow-inserts</span> <a href="#attribute-form_allow-inserts">19.248</a>, <span class="Attribute">form:allow-updates</span> <a href="#attribute-form_allow-updates">19.249</a>, <span class="Attribute">form:apply-filter</span> <a href="#attribute-form_apply-filter">19.251</a>, <span class="Attribute">form:command</span> <a href="#attribute-form_command">19.256</a>, <span class="Attribute">form:command-type</span> <a href="#attribute-form_command-type">19.257</a>, <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:datasource</span> <a href="#attribute-form_datasource">19.264</a>, <span class="Attribute">form:detail-fields</span> <a href="#attribute-form_detail-fields">19.267</a>, <span class="Attribute">form:enctype</span> <a href="#attribute-form_enctype">19.271</a>, <span class="Attribute">form:escape-processing</span> <a href="#attribute-form_escape-processing">19.272</a>, <span class="Attribute">form:filter</span> <a href="#attribute-form_filter">19.273</a>, <span class="Attribute">form:ignore-result</span> <a href="#attribute-form_ignore-result">19.277</a>, <span class="Attribute">form:master-fields</span> <a href="#attribute-form_master-fields">19.287</a>, <span class="Attribute">form:method</span> <a href="#attribute-form_method">19.291</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:navigation-mode</span> <a href="#attribute-form_navigation-mode">19.295</a>, <span class="Attribute">form:order</span> <a href="#attribute-form_order">19.296</a>, <span class="Attribute">form:tab-cycle</span> <a href="#attribute-form_tab-cycle">19.309</a>, <span class="Attribute">office:target-frame</span> <a href="#attribute-office_target-frame">19.380</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-form_form">19.910.22</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:form&gt;</span> element has the following child elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>, <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h2 class="Heading_20_2"><a id="a13_4_xforms_model_"><span style="margin-right:0.127cm;">13.4</span></a><a id="__RefHeading__1416128_253892949"/><a id="XForms_Model"/><a id="XForms"/><a id="element-xforms_model"/>&lt;xforms:model&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;xforms:model&gt;</span> element is imported from <a title="XForms 1.0 (Third Edition)" href="http://www.w3.org/TR/2007/REC-xforms-20071029/">[XForms]</a> and is embedded in the <span class="Element">&lt;office:forms&gt;</span> element. XForms consists of two major parts, the XForms model which contains the form logic plus form data, and XForms controls, which can be bound to a data model. </p><p class="Text_20_body">Controls defined by OpenDocument (see <a href="#Controls">13.5</a>) may be bound to an XForms model by an <span class="Attribute">xforms:bind</span> attribute.</p><p class="Text_20_body">The <span class="Element">&lt;xforms:model</span><span class="Element">&gt;</span> element has the attributes and content defined in §3.3.1 of <a title="XForms 1.0 (Third Edition)" href="http://www.w3.org/TR/2007/REC-xforms-20071029/">[XForms]</a>.</p><p class="Parent_20_Element_20_List">The <span class="Element">&lt;xforms:model&gt;</span> element is usable within the following element: <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>.</p><h2 class="Heading_20_2"><a id="a13_5Controls"><span style="margin-right:0.127cm;">13.5</span></a><a id="__RefHeading__1416130_253892949"/><a id="Controls"/>Controls</h2><h3 class="Heading_20_3"><a id="a13_5_1General"><span style="margin-right:0.127cm;">13.5.1</span></a><a id="__RefHeading__1416132_253892949"/>General</h3><p class="Text_20_body">Controls are used to interact with forms. Each control in a form is identified by a name. The name of a control need not be unique in a form.</p><p class="Text_20_body">Controls are connected to the surrounding document (and its text flow, if applicable) by binding them to a shape that acts as a placeholder for the control. <a href="#element-draw_control">10.3.13</a></p><p class="Text_20_body">In addition to the attributes defined in this standard, controls may have implementation-dependent attributes. Those attributes are stored in a <span class="Element">&lt;form:properties&gt;</span> element in each control. Control events are specified in a <span class="Element">&lt;office:event-listeners&gt;</span> element.</p><h3 class="Heading_20_3"><a id="a13_5_2_form_text_"><span style="margin-right:0.127cm;">13.5.2</span></a><a id="__RefHeading__1416134_253892949"/><a id="element-form_text"/>&lt;form:text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:text&gt;</span> element defines a control for displaying and inputting text on a single line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:text&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:text&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_text">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:text&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_3_form_textarea_"><span style="margin-right:0.127cm;">13.5.3</span></a><a id="__RefHeading__1416136_253892949"/><a id="element-form_textarea"/>&lt;form:textarea&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:textarea&gt;</span> element defines a control for displaying and inputting text on multiple lines.</p><p class="Text_20_body">The <span class="Element">&lt;form:textarea&gt;</span> element may be used with plain text values (specified by the <span class="Attribute">form:current-value</span> attribute) as well as with formatted text (specified as paragraph content). If both a <span class="Attribute">form:current-value</span> attribute and one or more <span class="Element">&lt;text:p&gt;</span> elements are present,  , it is implementation dependent which text is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:textarea&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:textarea&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_textarea">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:textarea&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a>, <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h3 class="Heading_20_3"><a id="a13_5_4_form_password_"><span style="margin-right:0.127cm;">13.5.4</span></a><a id="__RefHeading__1416138_253892949"/><a id="element-form_password"/>&lt;form:password&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:password&gt;</span> element defines a control that hides text a user inputs using an echo character.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:password&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:password&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:echo-char</span> <a href="#attribute-form_echo-char">19.270</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_password">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:password&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_5_form_file_"><span style="margin-right:0.127cm;">13.5.5</span></a><a id="__RefHeading__1416140_253892949"/><a id="element-form_file"/>&lt;form:file&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:file&gt;</span> element defines a control for selecting a file.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:file&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:file&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_file">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:file&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_6_form_formatted-text_"><span style="margin-right:0.127cm;">13.5.6</span></a><a id="__RefHeading__1416142_253892949"/><a id="element-form_formatted-text"/>&lt;form:formatted-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:formatted-text&gt;</span> element defines a control for inputting text, which follows the format defined by a data style that is assigned to the control's graphical shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:formatted-text&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:formatted-text&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:delay-for-repeat</span> <a href="#attribute-form_delay-for-repeat">19.266</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:max-value</span> <a href="#attribute-form_max-value_element-form_formatted-text">19.289.3</a>, <span class="Attribute">form:min-value</span> <a href="#attribute-form_min-value_element-form_formatted-text">19.290.3</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a>, <span class="Attribute">form:spin-button</span> <a href="#attribute-form_spin-button">19.306</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:validation</span> <a href="#attribute-form_validation">19.315</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_formatted-text">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:formatted-text&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_7_form_number_"><span style="margin-right:0.127cm;">13.5.7</span></a><a id="__RefHeading__1416144_253892949"/><a id="element-form_number"/>&lt;form:number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:number&gt;</span> element defines a control which allows the user to enter a floating point number. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:number&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:number&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:delay-for-repeat</span> <a href="#attribute-form_delay-for-repeat">19.266</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:max-value</span> <a href="#attribute-form_max-value_element-form_number">19.289.4</a>, <span class="Attribute">form:min-value</span> <a href="#attribute-form_min-value_element-form_number">19.290.4</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a>, <span class="Attribute">form:spin-button</span> <a href="#attribute-form_spin-button">19.306</a>, <span class="Attribute">form:tab-</span><span class="Attribute">index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_number">19.316.4</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:number&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_8_form_date_"><span style="margin-right:0.127cm;">13.5.8</span></a><a id="__RefHeading__1416146_253892949"/><a id="element-form_date"/>&lt;form:date&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:date&gt;</span> element defines a control for inputting date data. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:date&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:date&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:delay-for-repeat</span> <a href="#attribute-form_delay-for-repeat">19.266</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:max-value</span> <a href="#attribute-form_max-value_element-form_date">19.289.2</a>, <span class="Attribute">form:min-value</span> <a href="#attribute-form_min-value_element-form_date">19.290.2</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a>, <span class="Attribute">form:spin-button</span> <a href="#attribute-form_spin-button">19.306</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_date">19.316.3</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:date&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_9_form_time_"><span style="margin-right:0.127cm;">13.5.9</span></a><a id="__RefHeading__1416148_253892949"/><a id="element-form_time"/>&lt;form:time&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:time&gt;</span> element defines a control for inputting time data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:time&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:time&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:delay-for-repeat</span> <a href="#attribute-form_delay-for-repeat">19.266</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:max-value</span> <a href="#attribute-form_max-value_element-form_time">19.289.5</a>, <span class="Attribute">form:min-value</span> <a href="#attribute-form_min-value_element-form_time">19.290.5</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a>, <span class="Attribute">form:spin-button</span> <a href="#attribute-form_spin-button">19.306</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_time">19.316.6</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:time&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_10_form_fixed-text_"><span style="margin-right:0.127cm;">13.5.10</span></a><a id="__RefHeading__1416150_253892949"/><a id="element-form_fixed-text"/>&lt;form:fixed-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:fixed-text&gt;</span> element defines a control which attaches additional information to controls, or displays information. Only one label may be associated with a control.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:fixed-text&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:fixed-text&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:for</span> <a href="#attribute-form_for">19.275</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:multi-line</span> <a href="#attribute-form_multi-line">19.292</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:fixed-text&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_11_form_combobox_"><span style="margin-right:0.127cm;">13.5.11</span></a><a id="__RefHeading__1416152_253892949"/><a id="element-form_combobox"/>&lt;form:combobox&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:combobox&gt;</span> element defines a control which allows displaying and editing of text, and contains a list of possible values for that text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:combobox&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:combobox&gt;</span> element has the following attributes: <span class="Attribute">form:auto-complete</span> <a href="#attribute-form_auto-complete">19.252</a>, <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:convert-empty-to-null</span> <a href="#attribute-form_convert-empty-to-null">19.259</a>, <span class="Attribute">form:current-value</span> <a href="#attribute-form_current-value">19.262</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:dropdown</span> <a href="#attribute-form_dropdown">19.269</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:list-source</span> <a href="#attribute-form_list-source">19.285</a>, <span class="Attribute">form:list-source-type</span> <a href="#attribute-form_list-source-type">19.286</a>, <span class="Attribute">form:max-length</span> <a href="#attribute-form_max-length">19.288</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:size</span> <a href="#attribute-form_size">19.304</a>, <span class="Attribute">form:source-cell-range</span> <a href="#attribute-form_source-cell-range">19.305</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_combobox">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:combobox&gt;</span> element has the following child elements: <span class="Element">&lt;form:item&gt;</span> <a href="#element-form_item">13.5.12</a>, <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_12_form_item_"><span style="margin-right:0.127cm;">13.5.12</span></a><a id="__RefHeading__1416154_253892949"/><a id="element-form_item"/>&lt;form:item&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:item&gt;</span> element defines a list item for a <span class="Element">&lt;form:combobox&gt;</span> control.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:item&gt;</span> element is usable within the following element: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:item&gt;</span> element has the following attribute: <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;form:item&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:item&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a13_5_13_form_listbox_"><span style="margin-right:0.127cm;">13.5.13</span></a><a id="__RefHeading__1416156_253892949"/><a id="element-form_listbox"/>&lt;form:listbox&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:listbox&gt;</span> element defines an input control that allows a user to select one or more items from a list. It is an alternative representation for a group of radio buttons.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:listbox&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:listbox&gt;</span> element has the following attributes: <span class="Attribute">form:bound-column</span> <a href="#attribute-form_bound-column">19.254</a>, <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:dropdown</span> <a href="#attribute-form_dropdown">19.269</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:list-linkage-type</span> <a href="#attribute-form_list-linkage-type">19.284</a>, <span class="Attribute">form:list-source</span> <a href="#attribute-form_list-source">19.285</a>, <span class="Attribute">form:list-source-type</span> <a href="#attribute-form_list-source-type">19.286</a>, <span class="Attribute">form:multiple</span> <a href="#attribute-form_multiple">19.293</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:size</span> <a href="#attribute-form_size">19.304</a>, <span class="Attribute">form:source-cell-range</span> <a href="#attribute-form_source-cell-range">19.305</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:xforms-list-source</span> <a href="#attribute-form_xforms-list-source">19.318</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:listbox&gt;</span> element has the following child elements: <span class="Element">&lt;form:option&gt;</span> <a href="#element-form_option">13.5.14</a>, <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_14_form_option_"><span style="margin-right:0.127cm;">13.5.14</span></a><a id="__RefHeading__1416158_253892949"/><a id="element-form_option"/>&lt;form:option&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:option&gt;</span> element defines a list item for a <span class="Element">&lt;form:listbox&gt;</span> control.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:option&gt;</span> element is usable within the following element: <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:option&gt;</span> element has the following attributes: <span class="Attribute">form:current-selected</span> <a href="#attribute-form_current-selected">19.260</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:selected</span> <a href="#attribute-form_selected">19.303</a> and <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_option">19.316.5</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;form:option&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:option&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a13_5_15_form_button_"><span style="margin-right:0.127cm;">13.5.15</span></a><a id="__RefHeading__1416160_253892949"/><a id="element-form_button"/>&lt;form:button&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:button&gt;</span> element defines a button.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:button&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:button&gt;</span> element has the following attributes: <span class="Attribute">form:button-type</span> <a href="#attribute-form_button-type">19.255</a>, <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:default-button</span> <a href="#attribute-form_default-button">19.265</a>, <span class="Attribute">form:delay-for-repeat</span> <a href="#attribute-form_delay-for-repeat">19.266</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:focus-on-click</span> <a href="#attribute-form_focus-on-click">19.274</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:image-align</span> <a href="#attribute-form_image-align">19.278</a>, <span class="Attribute">form:image-data</span> <a href="#attribute-form_image-data">19.279</a>, <span class="Attribute">form:image-position</span> <a href="#attribute-form_image-position">19.280</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:toggle</span> <a href="#attribute-form_toggle">19.314</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_button">19.316.2</a>, <span class="Attribute">form:xforms-submission</span> <a href="#attribute-form_xforms-submission">19.319</a>, <span class="Attribute">office:target-frame</span> <a href="#attribute-office_target-frame">19.380</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-form_button">19.910.19</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:button&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_16_form_image_"><span style="margin-right:0.127cm;">13.5.16</span></a><a id="__RefHeading__1416162_253892949"/><a id="element-form_image"/>&lt;form:image&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:image&gt;</span> element defines a graphical button control.</p><p class="Note"><span class="Note_20_Label">Note:</span> HTML 4.01 only allows the button type to be “submit” for an image button. In OpenDocument, an image button can be of any type.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:image&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:image&gt;</span> element has the following attributes: <span class="Attribute">form:button-type</span> <a href="#attribute-form_button-type">19.255</a>, <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:image-data</span> <a href="#attribute-form_image-data">19.279</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_image">19.316.5</a>, <span class="Attribute">office:target-frame</span> <a href="#attribute-office_target-frame">19.380</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-form_image">19.910.21</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:image&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_17_form_checkbox_"><span style="margin-right:0.127cm;">13.5.17</span></a><a id="__RefHeading__1416164_253892949"/><a id="element-form_checkbox"/>&lt;form:checkbox&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:checkbox&gt;</span> element defines an on/off control. The control is on when the value of the <span class="Attribute">form:current-state</span> attribute associated with the control element is <span class="Attribute_20_Value">checked</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:checkbox&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a> and <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:checkbox&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:current-state</span> <a href="#attribute-form_current-state">19.261</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:image-align</span> <a href="#attribute-form_image-align">19.278</a>, <span class="Attribute">form:image-position</span> <a href="#attribute-form_image-position">19.280</a>, <span class="Attribute">form:is-tristate</span> <a href="#attribute-form_is-tristate">19.281</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:state</span> <a href="#attribute-form_state">19.307</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_checkbox">19.316.5</a>, <span class="Attribute">form:visual-effect</span> <a href="#attribute-form_visual-effect">19.317</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:checkbox&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_18_form_radio_"><span style="margin-right:0.127cm;">13.5.18</span></a><a id="__RefHeading__1416166_253892949"/><a id="element-form_radio"/>&lt;form:radio&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:radio&gt;</span> element defines a control which acts like a check box except that when multiple radio buttons belong to the same group they are mutually exclusive. When one button is on, all of the other buttons with the same name are off. If no radio button is defined to be initially on, it is undefined which radio button is initially on.</p><p class="Text_20_body">Radio buttons are defined to belong to the same group if they have the same control name, as specified by their <span class="Attribute">form:name</span> attribute. </p><p class="Text_20_body">If a group of radio buttons is bound to one database field, and a user selects any given button, the reference value of the selected radio button is written into its database field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:radio&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:radio&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:current-selected</span> <a href="#attribute-form_current-selected">19.260</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:image-align</span> <a href="#attribute-form_image-align">19.278</a>, <span class="Attribute">form:image-position</span> <a href="#attribute-form_image-position">19.280</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:selected</span> <a href="#attribute-form_selected">19.303</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_radio">19.316.5</a>, <span class="Attribute">form:visual-effect</span> <a href="#attribute-form_visual-effect">19.317</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:radio&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_19_form_frame_"><span style="margin-right:0.127cm;">13.5.19</span></a><a id="__RefHeading__1416168_253892949"/><a id="element-form_frame"/>&lt;form:frame&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:frame&gt;</span> element defines a frame in which controls may be visually arranged.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:frame&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:frame&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:for</span> <a href="#attribute-form_for">19.275</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:frame&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_20_form_image-frame_"><span style="margin-right:0.127cm;">13.5.20</span></a><a id="__RefHeading__1416170_253892949"/><a id="element-form_image-frame"/>&lt;form:image-frame&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:image-frame&gt;</span> element defines a graphical control. The control displays an image, whose location is described in the control.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:image-frame&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:image-frame&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:data-field</span> <a href="#attribute-form_data-field">19.263</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:image-data</span> <a href="#attribute-form_image-data">19.279</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:readonly</span> <a href="#attribute-form_readonly">19.301</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:image-frame&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_21_form_hidden_"><span style="margin-right:0.127cm;">13.5.21</span></a><a id="__RefHeading__1416172_253892949"/><a id="element-form_hidden"/>&lt;form:hidden&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:hidden&gt;</span> element defines a control that does not have a visual representation. </p><p class="Note"><span class="Note_20_Label">Note:</span> A control without visual representation can be used for information not displayed to the user but is submitted as part of a form.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:hidden&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:hidden&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_hidden">19.316.5</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:hidden&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_22_form_grid_"><span style="margin-right:0.127cm;">13.5.22</span></a><a id="__RefHeading__1416174_253892949"/><a id="element-form_grid"/>&lt;form:grid&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:grid&gt;</span> element defines a control that displays table data.</p><p class="Text_20_body">Each column in the grid is specified by a <span class="Element">&lt;form:column&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:grid&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:grid&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:grid&gt;</span> element has the following child elements: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a>, <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_23_form_column_"><span style="margin-right:0.127cm;">13.5.23</span></a><a id="__RefHeading__1416176_253892949"/><a id="element-form_column"/>&lt;form:column&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:column&gt;</span> element defines a column in a grid control.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:column&gt;</span> element is usable within the following element: <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:column&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:label</span> <a href="#attribute-form_label">19.282</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a> and <span class="Attribute">form:text-style-name</span> <a href="#attribute-form_text-style-name">19.312</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:column&gt;</span> element has the following child elements: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><h3 class="Heading_20_3"><a id="a13_5_24_form_value-range_"><span style="margin-right:0.127cm;">13.5.24</span></a><a id="__RefHeading__1416178_253892949"/><a id="element-form_value-range"/>&lt;form:value-range&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:value-range&gt;</span> element defines a control which allows the user to select a value from a number range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:value-range&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:value-range&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:delay-for-repeat</span> <a href="#attribute-form_delay-for-repeat">19.266</a>, <span class="Attribute">form:disabled</span> <a href="#attribute-form_disabled">19.268</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a>, <span class="Attribute">form:max-value</span> <a href="#attribute-form_max-value_element-form_value-range">19.289.4</a>, <span class="Attribute">form:min-value</span> <a href="#attribute-form_min-value_element-form_value-range">19.290.4</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">form:orientation</span> <a href="#attribute-form_orientation">19.297</a>, <span class="Attribute">form:page-step-size</span> <a href="#attribute-form_page-step-size">19.298</a>, <span class="Attribute">form:printable</span> <a href="#attribute-form_printable">19.299</a>, <span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a>, <span class="Attribute">form:step-size</span> <a href="#attribute-form_step-size">19.308</a>, <span class="Attribute">form:tab-index</span> <a href="#attribute-form_tab-index">19.310</a>, <span class="Attribute">form:tab-stop</span> <a href="#attribute-form_tab-stop">19.311</a>, <span class="Attribute">form:title</span> <a href="#attribute-form_title">19.313</a>, <span class="Attribute">form:value</span> <a href="#attribute-form_value_element-form_value-range">19.316.4</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:value-range&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h3 class="Heading_20_3"><a id="a13_5_25_form_generic-control_"><span style="margin-right:0.127cm;">13.5.25</span></a><a id="__RefHeading__1416180_253892949"/><a id="element-form_generic-control"/>&lt;form:generic-control&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;form:generic-control&gt;</span> element defines an implementation-defined placeholder for a generic control. The generic control can contain any properties and any events.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:generic-control&gt;</span> element is usable within the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:generic-control&gt;</span> element has the following attributes: <span class="Attribute">form:control-implementation</span> <a href="#attribute-form_control-implementation">19.258</a>, <span class="Attribute">form:id</span> <a href="#attribute-form_id">19.276</a>, <span class="Attribute">form:name</span> <a href="#attribute-form_name">19.294</a>, <span class="Attribute">xforms:bind</span> <a href="#attribute-xforms_bind">19.904</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:generic-control&gt;</span> element has the following child elements: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a> and <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><h2 class="Heading_20_2"><a id="a13_6Event_Listeners"><span style="margin-right:0.127cm;">13.6</span></a><a id="__RefHeading__1416182_253892949"/><a id="Events_section"/>Event Listeners</h2><p class="Text_20_body">Forms and form controls may have event listeners attached. The event listeners that are attached to a control are represented by an event listener element as described in section <a href="#Event_Tables">14.4</a>. This element is contained within form or form control elements.,</p><p class="Text_20_body">Section <a href="#attribute-script_event-name">19.429</a> contains guidelines for event names that may be used within forms and form controls. In addition to those, the events listed in Table <a href="#refTable8">9</a> may be used in forms and form controls.</p><p class="Table">Table <a id="refTable8"/>9 - Form control event names</p><table border="0" cellspacing="0" cellpadding="0" class="FormControlEventNames"><colgroup><col width="201"/><col width="135"/><col width="330"/></colgroup><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A1"><p class="Table_20_Heading">Value of <span class="Attribute">script:event-name</span> Attribute</p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A1"><p class="Table_20_Heading">Applies To</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C1"><p class="Table_20_Heading">Description of Event</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:approveaction</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Button or image.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs before an “on perform action” event takes place. Allows a user to veto an action.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:performaction</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Button or image.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when the control action is to be performed. The common interpretation of this event is “pressing the button”.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:textchange</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">All controls that allow text input.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a user changes the text in a control.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:itemstatechange</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Check box or radio button.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when the state of a check box or radio button changes.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:mousedrag</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">All controls.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a user presses and holds one of the mouse buttons and moves the mouse pointer onto a control.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:approvereset</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">same objects as for <span class="Attribute_20_Value_20_Instance">form:on-reset</span></p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs before an “on-reset” event takes place. Allows a user to veto a reset event.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:approveupdate</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">All controls that can be bound to a database field, that is controls that contain the data-field attribute.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs before an “on update” event takes place. Allows a user to veto an update.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:update</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">All controls that can be bound to a database field, that is controls that contain the data-field attribute.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when the content of a control that is bound to a database field is committed.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:load</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a form establishes a connection to the data source.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:startreload</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a form is about to refresh a data source connection.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:reload</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a form has refreshed a data source connection.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:startunload</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a form is about to drop a data source connection.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:unload</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a form has dropped a data source connection.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:confirmdelete</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a user is about to delete a record.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:approverowchang</span><span class="Attribute_20_Value_20_Instance">e</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs before an “on row change” event takes place. Allows a user to veto a change.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:rowchange</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs after changes to a row are complete.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:approvecursormove</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs before a form is moved to another row. Allows a user to veto a move.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:cursormove</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs after a form is moved to another row.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:supplyparameter</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a form asks for parameters to connect to a data source.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">form:error</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Table_20_Contents">Forms, combo boxes and list boxes.</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Table_20_Contents">Occurs when a database-related error occurs.</p></td></tr><tr><td style="text-align:left;width:1.8118in; " class="FormControlEventNames_A2"><p class="Text_20_body"><span class="Attribute_20_Value_20_Instance">form:adjust</span></p></td><td style="text-align:left;width:1.2188in; " class="FormControlEventNames_A2"><p class="Text_20_body">Value Range</p></td><td style="text-align:left;width:2.9694in; " class="FormControlEventNames_C2"><p class="Text_20_body">Occurs when the value of a Value Range element has been adjusted.</p></td></tr></table><h2 class="Heading_20_2"><a id="a13_7_form_properties_"><span style="margin-right:0.127cm;">13.7</span></a><a id="__RefHeading__1416184_253892949"/><a id="element-form_properties"/>&lt;form:properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;form:properties&gt;</span> element is a container for <span class="Element">&lt;form:property&gt;</span> and <span class="Element">&lt;form:list-property&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:properties&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:properties&gt;</span> element has the following child elements: <span class="Element">&lt;form:list-property&gt;</span> <a href="#element-form_list-property">13.9</a> and <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>.</p><h2 class="Heading_20_2"><a id="a13_8_form_property_"><span style="margin-right:0.127cm;">13.8</span></a><a id="__RefHeading__1416186_253892949"/><a id="element-form_property"/>&lt;form:property&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;form:property&gt;</span> element defines the name, type and value of a property.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:property&gt;</span> element is usable within the following element: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:property&gt;</span> element has the following attributes: <span class="Attribute">form:property-name</span> <a href="#attribute-form_property-name">19.300</a>, <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:property&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a13_9_form_list-property_"><span style="margin-right:0.127cm;">13.9</span></a><a id="__RefHeading__1416188_253892949"/><a id="element-form_list-property"/>&lt;form:list-property&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;form:list-property&gt;</span> element container for <span class="Element">&lt;form:list-value&gt;</span> elements. </p><p class="Text_20_body">The <span class="Element">&lt;form:list-property&gt;</span> element has an <span class="Attribute">office:value-type</span> attribute (<a href="#attribute-office_value-type">19.385</a>) that acts as a constraint on the attributes that may appear on its child <span class="Element">&lt;form:list-value&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:list-property&gt;</span> element is usable within the following element: <span class="Element">&lt;form:properties&gt;</span> <a href="#element-form_properties">13.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:list-property&gt;</span> element has the following attributes: <span class="Attribute">form:property-name</span> <a href="#attribute-form_property-name">19.300</a>, <span class="Attribute">office:value-type</span> <a href="#attribute-office_value-type">19.385</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:list-property&gt;</span> element has the following child elements: <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>.</p><h2 class="Heading_20_2"><a id="a13_10_form_list-value_"><span style="margin-right:0.127cm;">13.10</span></a><a id="__RefHeading__1416190_253892949"/><a id="element-form_list-value"/>&lt;form:list-value&gt;</h2><p class="Text_20_body">The list value element contains value attributes for the value type given in the containing <span class="Element">&lt;form:list-property&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;form:list-value&gt;</span> element is usable within the following element: <span class="Element">&lt;form:list-property&gt;</span> <a href="#element-form_list-property">13.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;form:list-value&gt;</span> element has the following attributes: <span class="Attribute">office:boolean-value</span> <a href="#attribute-office_boolean-value">19.367</a>, <span class="Attribute">office:currency</span> <a href="#attribute-office_currency">19.369</a>, <span class="Attribute">office:date-value</span> <a href="#attribute-office_date-value">19.370</a>, <span class="Attribute">office:string-value</span> <a href="#attribute-office_string-value">19.379</a>, <span class="Attribute">office:time-value</span> <a href="#attribute-office_time-value">19.382</a>, <span class="Attribute">office:value</span> <a href="#attribute-office_value">19.384</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;form:list-value&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a14Common_Content"><span style="margin-right:0.127cm;">14</span></a><a id="__RefHeading__1416192_253892949"/><a id="Common_Content"/>Common Content</h1><h2 class="Heading_20_2"><a id="a14_1_office_annotation_"><span style="margin-right:0.127cm;">14.1</span></a><a id="__RefHeading__1416194_253892949"/><a id="element-office_annotation"/>&lt;office:annotation&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:annotation&gt;</span> element specifies an OpenDocument annotation. The annotation's text is contained in <span class="Element">&lt;text:p&gt;</span> and <span class="Element">&lt;text:list&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:annotation&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:annotation&gt;</span> element has the following attributes: <span class="Attribute">draw:caption-point-x</span> <a href="#attribute-draw_caption-point-x">19.116</a>, <span class="Attribute">draw:caption-point-y</span> <a href="#attribute-draw_caption-point-y">19.117</a>, <span class="Attribute">draw:class-names</span> <a href="#attribute-draw_class-names">19.120</a>, <span class="Attribute">draw:corner-radius</span> <a href="#attribute-draw_corner-radius">19.127</a>, <span class="Attribute">draw:id</span> <a href="#attribute-draw_id_element-office_annotation">19.187.3</a>, <span class="Attribute">draw:layer</span> <a href="#attribute-draw_layer">19.189</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-office_annotation">19.197.28</a>, <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-office_annotation">19.219.24</a>, <span class="Attribute">draw:text-style-name</span> <a href="#attribute-draw_text-style-name">19.227</a>, <span class="Attribute">draw:transform</span> <a href="#attribute-draw_transform">19.228</a>, <span class="Attribute">draw:z-index</span> <a href="#attribute-draw_z-index">19.231</a>, <span class="Attribute">office:display</span> <a href="#attribute-office_display">19.374</a>, <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-office_annotation">19.376.6</a>, <span class="Attribute">presentation:class-names</span> <a href="#attribute-presentation_class-names">19.390</a>, <span class="Attribute">presentation:style-name</span> <a href="#attribute-presentation_style-name">19.422</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-office_annotation">19.539.9</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-office_annotation">19.571.11</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-office_annotation">19.573.7</a>, <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-office_annotation">19.577.7</a>, <span class="Attribute">table:end-cell-address</span> <a href="#attribute-table_end-cell-address">19.627</a>, <span class="Attribute">table:end-x</span> <a href="#attribute-table_end-x">19.632</a>, <span class="Attribute">table:end-y</span> <a href="#attribute-table_end-y">19.633</a>, <span class="Attribute">table:table-background</span> <a href="#attribute-table_table-background">19.728</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#attribute-text_anchor-page-number">19.753</a>, <span class="Attribute">text:anchor-type</span> <a href="#attribute-text_anchor-type">19.754</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:annotation&gt;</span> element has the following child elements: <span class="Element">&lt;dc:creator&gt;</span> <a href="#element-dc_creator">4.3.2.7</a>, <span class="Element">&lt;dc:date&gt;</span> <a href="#element-dc_date">4.3.2.10</a>, <span class="Element">&lt;meta:date-string&gt;</span> <a href="#element-meta_date-string">14.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a14_2_office_annotation-end_"><span style="margin-right:0.127cm;">14.2</span></a><a id="__RefHeading__1416196_253892949"/><a id="element-office_annotation-end"/>&lt;office:annotation-end&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;office:annotation-end&gt;</span> element may be used to define the end of a text range of document content that spans element boundaries. In that case, an <span class="Element">&lt;office:annotation&gt;</span> element shall precede the <span class="Element">&lt;office:annotation-end&gt;</span> element. Both elements shall have the same value for their <span class="Attribute">office:name</span> attribute.</p><p class="Text_20_body">The <span class="Element">&lt;office:annotation-end&gt;</span> element shall be preceded by an <span class="Element">&lt;office:annotation&gt;</span> element that has the same value for its <span class="Attribute">office:name</span> attribute as the <span class="Element">&lt;office:annotation-end&gt;</span> element.</p><p class="Text_20_body">An <span class="Element">&lt;office:annotation-end&gt;</span> element without a preceding <span class="Element">&lt;office:annotation&gt;</span> element that has the same name assigned is ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:annotation-end&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:ruby-base&gt;</span> <a href="#element-text_ruby-base">6.4.2</a> and <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:annotation-end&gt;</span> element has the following attribute: <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-office_annotation-end">19.376.7</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:annotation-end&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a14_3_meta_date-string_"><span style="margin-right:0.127cm;">14.3</span></a><a id="__RefHeading__1416198_253892949"/><a id="element-meta_date-string"/>&lt;meta:date-string&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;meta:date-string&gt;</span> element contains a date that is of type string and not a date type. This value is used only for display as entered. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;meta:date-string&gt;</span> element is usable within the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;meta:date-string&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;meta:date-string&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;meta:date-string&gt;</span> element has content of data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a14_4Event_Listener_Tables"><span style="margin-right:0.127cm;">14.4</span></a><a id="__RefHeading__1416202_253892949"/><a id="Event_Tables"/>Event Listener Tables</h2><h3 class="Heading_20_3"><a id="a14_4_1General"><span style="margin-right:0.127cm;">14.4.1</span></a><a id="__RefHeading__1416204_253892949"/>General</h3><p class="Text_20_body">Controls, images, text boxes, or an entire document can support events. An event binds the occurrence of a condition to an action that is executed if the condition arises.</p><p class="Text_20_body">Events are represented as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>All of the event elements that are associated with an object are located in an <span class="Element">&lt;office:event-listeners&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Each event-to-action association is recorded in one child element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Depending on the type of action that the event triggers, the following child elements are used:<span class="odfLiEnd"/> </p><ul><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a> element represents events that are bound to a macro or script.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a> element represents events that are bound to an action that is specific to a presentation.<span class="odfLiEnd"/> </p></li></ul></li></ul><h3 class="Heading_20_3"><a id="a14_4_2_script_event-listener_"><span style="margin-right:0.127cm;">14.4.2</span></a><a id="__RefHeading__1416206_253892949"/><a id="element-script_event-listener"/>&lt;script:event-listener&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;script:event-listener&gt;</span> element binds an event to a macro.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;script:event-listener&gt;</span> element is usable within the following element: <span class="Element">&lt;office:event-listeners&gt;</span> <a href="#element-office_event-listeners">10.3.19</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;script:event-listener&gt;</span> element has the following attributes: <span class="Attribute">script:event-name</span> <a href="#attribute-script_event-name">19.429</a>, <span class="Attribute">script:language</span> <a href="#attribute-script_language">19.430</a>, <span class="Attribute">script:macro-name</span> <a href="#attribute-script_macro-name">19.431</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-script_event-listener">19.910.27</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;script:event-listener&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a14_4_3Event_Types"><span style="margin-right:0.127cm;">14.4.3</span></a><a id="__RefHeading__1416208_253892949"/>Event Types</h3><p class="Text_20_body">Event types are implementation-defined. See <a href="#attribute-script_event-name">19.429</a>.</p><h3 class="Heading_20_3"><a id="a14_4_4Macro_Name_and_Location"><span style="margin-right:0.127cm;">14.4.4</span></a><a id="__RefHeading__1416210_253892949"/>Macro Name and Location</h3><p class="Text_20_body">Macro code for an event may be specified by either an <span class="Attribute">xlink:href</span> attribute as an IRI, or a <span class="Attribute">script:macro-name</span> attribute by name. Macro names and applicable IRI schemes are script language dependent. </p><h2 class="Heading_20_2"><a id="a14_5_math_math_"><span style="margin-right:0.127cm;">14.5</span></a><a id="__RefHeading__1416212_253892949"/><a id="element-math_math"/><a id="math_math"/>&lt;math:math&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;math:math&gt;</span> element serves as a container for content defined by the MathML 2.0 standard. See <a title="Mathematical Markup Language (MathML) Version 2.0 (Second Edition)" href="http://www.w3.org/TR/2003/REC-MathML2-20031021/">[MathML]</a>.</p><p class="Parent_20_Element_20_List">The <span class="Element">&lt;math:math&gt;</span> element is usable within the following elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a> and <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>.</p><h2 class="Heading_20_2"><a id="a14_6DDE_Connections"><span style="margin-right:0.127cm;">14.6</span></a><a id="__RefHeading__1416214_253892949"/><a id="DDE_Connections"/>DDE Connections</h2><h3 class="Heading_20_3"><a id="a14_6_1General"><span style="margin-right:0.127cm;">14.6.1</span></a><a id="__RefHeading__1416216_253892949"/>General</h3><p class="Text_20_body">A Dynamic Data Exchange (DDE) connection consists of parameters for a DDE target application, a file name, and a command string. A DDE connection also takes a parameter that specifies whether it will be updated automatically or only on the user's request. Every DDE connection shall be named.</p><p class="Text_20_body">All elements making use of DDE connections shall contain their content (or its presentation), so that documents using DDE can still be properly displayed on machines which do not support the DDE mechanism, or where the DDE target is not available. Consumers should preserve the DDE connection information even if they cannot make use of it.</p><p class="Note"><span class="Note_20_Label">Note:</span> DDE only is available on some operating systems. In order to create portable documents, authors are advised to use this feature in their documents with great care.</p><h3 class="Heading_20_3"><a id="a14_6_2_text_dde-connection-decls_"><span style="margin-right:0.127cm;">14.6.2</span></a><a id="__RefHeading__1416220_253892949"/><a id="element-text_dde-connection-decls"/>&lt;text:dde-connection-decls&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:dde-connection-decls&gt;</span> element is a container element for <span class="Element">&lt;text:dde-connection-decl&gt;</span> elements in text documents.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:dde-connection-decls&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:chart&gt;</span> <a href="#element-office_chart">3.8</a>, <span class="Element">&lt;office:drawing&gt;</span> <a href="#element-office_drawing">3.5</a>, <span class="Element">&lt;office:presentation&gt;</span> <a href="#element-office_presentation">3.6</a>, <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>, <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:dde-connection-decls&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:dde-connection-decls&gt;</span> element has the following child element: <span class="Element">&lt;text:dde-connection-decl&gt;</span> <a href="#element-text_dde-connection-decl">14.6.3</a>.</p><h3 class="Heading_20_3"><a id="a14_6_3_text_dde-connection-decl_"><span style="margin-right:0.127cm;">14.6.3</span></a><a id="__RefHeading__1416222_253892949"/><a id="element-text_dde-connection-decl"/>&lt;text:dde-connection-decl&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:dde-connection-decl&gt;</span> element defines a DDE connection for use in DDE text fields. Multiple DDE fields can refer to one DDE connection by using the same name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:dde-connection-decl&gt;</span> element is usable within the following element: <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:dde-connection-decl&gt;</span> element has the following attributes: <span class="Attribute">office:automatic-update</span> <a href="#attribute-office_automatic-update">19.366</a>, <span class="Attribute">office:dde-application</span> <a href="#attribute-office_dde-application">19.371</a>, <span class="Attribute">office:dde-item</span> <a href="#attribute-office_dde-item">19.372</a>, <span class="Attribute">office:dde-topic</span> <a href="#attribute-office_dde-topic">19.373</a> and <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-text_dde-connection-decl">19.376.10</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:dde-connection-decl&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a14_6_4_table_dde-link_"><span style="margin-right:0.127cm;">14.6.4</span></a><a id="__RefHeading__1416224_253892949"/><a id="element-table_dde-link"/>&lt;table:dde-link&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:dde-link&gt;</span> element contains DDE source data for use in spreadsheet formulas. It contains a <span class="Element">&lt;office:dde-source&gt;</span> element and a simple table element that may be used to cache the data of a DDE source. The table does not need a name and does not contain style information. Only the data contained in the cell attributes is used. The cells themselves remain empty.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:dde-link&gt;</span> element is usable within the following element: <span class="Element">&lt;table:dde-links&gt;</span> <a href="#element-table_dde-links">9.8</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:dde-link&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:dde-link&gt;</span> element has the following child elements: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><h3 class="Heading_20_3"><a id="a14_6_5_office_dde-source_"><span style="margin-right:0.127cm;">14.6.5</span></a><a id="__RefHeading__1416226_253892949"/><a id="element-office_dde-source"/>&lt;office:dde-source&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;office:dde-source&gt;</span> element defines a DDE connection. </p><p class="Text_20_body">If the element is a child element of a <span class="Element">&lt;table:table&gt;</span> element, the <span class="Element">&lt;office:dde-source&gt;</span> element specifies that the table is linked through DDE along the connection data. </p><p class="Text_20_body">If the element is a child element of a <span class="Element">&lt;text:section&gt;</span> element, the <span class="Element">&lt;office:dde-source&gt;</span> element specifies that the text section is linked through DDE along the connection data. </p><p class="Text_20_body">If the element is a child element of a <span class="Element">&lt;table:dde-link&gt;</span> element, the <span class="Element">&lt;office:dde-source&gt;</span> element specifies the connection data for a DDE link that can be used in spreadsheet formulas. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;office:dde-source&gt;</span> element is usable within the following elements: <span class="Element">&lt;table:dde-link&gt;</span> <a href="#element-table_dde-link">14.6.4</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> and <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;office:dde-source&gt;</span> element has the following attributes: <span class="Attribute">office:automatic-update</span> <a href="#attribute-office_automatic-update">19.366</a>, <span class="Attribute">office:conversion-mode</span> <a href="#attribute-office_conversion-mode">19.368</a>, <span class="Attribute">office:dde-application</span> <a href="#attribute-office_dde-application">19.371</a>, <span class="Attribute">office:dde-item</span> <a href="#attribute-office_dde-item">19.372</a>, <span class="Attribute">office:dde-topic</span> <a href="#attribute-office_dde-topic">19.373</a> and <span class="Attribute">office:name</span> <a href="#attribute-office_name_element-office_dde-source">19.376.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;office:dde-source&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a15SMIL_Animations"><span style="margin-right:0.127cm;">15</span></a><a id="__RefHeading__1416228_253892949"/><a id="SMIL_Animations"/>SMIL Animations</h1><h2 class="Heading_20_2"><a id="a15_1General"><span style="margin-right:0.127cm;">15.1</span></a><a id="__RefHeading__1416230_253892949"/>General</h2><p class="Text_20_body">This section specifies <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> based elements and attributes that can be used within the OpenDocument format for animation effects.</p><h2 class="Heading_20_2"><a id="a15_2Basic_Animation_Elements"><span style="margin-right:0.127cm;">15.2</span></a><a id="__RefHeading__1416232_253892949"/><a id="Basic_Animation_Elements"/>Basic Animation Elements</h2><h3 class="Heading_20_3"><a id="a15_2_1General"><span style="margin-right:0.127cm;">15.2.1</span></a><a id="__RefHeading__1416234_253892949"/>General </h3><p class="Text_20_body">The animation elements are based upon §3.5 and §12.5 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>, and section §19.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><h3 class="Heading_20_3"><a id="a15_2_2_anim_animate_"><span style="margin-right:0.127cm;">15.2.2</span></a><a id="__RefHeading__1416236_253892949"/><a id="element-anim_animate"/>&lt;anim:animate&gt;</h3><p class="Text_20_body"> See §3.5.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:animate&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:animate&gt;</span> element has the following attributes: <span class="Attribute">anim:formula</span> <a href="#attribute-anim_formula">19.6</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:accumulate</span> <a href="#attribute-smil_accumulate">19.433</a>, <span class="Attribute">smil:additive</span> <a href="#attribute-smil_additive">19.434</a>, <span class="Attribute">smil:attributeName</span> <a href="#attribute-smil_attributeName">19.435</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:by</span> <a href="#attribute-smil_by">19.438</a>, <span class="Attribute">smil:calcMode</span> <a href="#attribute-smil_calcMode">19.439</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:from</span> <a href="#attribute-smil_from">19.448</a>, <span class="Attribute">smil:keySplines</span> <a href="#attribute-smil_keySplines">19.449</a>, <span class="Attribute">smil:keyTimes</span> <a href="#attribute-smil_keyTimes">19.450</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a>, <span class="Attribute">smil:to</span> <a href="#attribute-smil_to">19.458</a> and <span class="Attribute">smil:values</span> <a href="#attribute-smil_values">19.460</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:animate&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a15_2_3_anim_animateTransform_"><span style="margin-right:0.127cm;">15.2.3</span></a><a id="__RefHeading__1416238_253892949"/><a id="element-anim_animateTransform"/>&lt;anim:animateTransform&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:animateTransform&gt;</span> element defines the transformation of an animation. It is based on the <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> <span class="Alien_20_Element">&lt;svg:animateTransform&gt;</span> element. See §19.2.14 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:animateTransform&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:animateTransform&gt;</span> element has the following attributes: <span class="Attribute">anim:formula</span> <a href="#attribute-anim_formula">19.6</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:accumulate</span> <a href="#attribute-smil_accumulate">19.433</a>, <span class="Attribute">smil:additive</span> <a href="#attribute-smil_additive">19.434</a>, <span class="Attribute">smil:attributeName</span> <a href="#attribute-smil_attributeName">19.435</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:by</span> <a href="#attribute-smil_by">19.438</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:from</span> <a href="#attribute-smil_from">19.448</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a>, <span class="Attribute">smil:to</span> <a href="#attribute-smil_to">19.458</a>, <span class="Attribute">smil:values</span> <a href="#attribute-smil_values">19.460</a> and <span class="Attribute">svg:type</span> <a href="#attribute-svg_type">19.561</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:animateTransform&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a15_2_4_anim_set_"><span style="margin-right:0.127cm;">15.2.4</span></a><a id="__RefHeading__1416240_253892949"/><a id="element-anim_set"/>&lt;anim:set&gt;</h3><p class="Text_20_body">See §3.5.2 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:set&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:set&gt;</span> element has the following attributes: <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:accumulate</span> <a href="#attribute-smil_accumulate">19.433</a>, <span class="Attribute">smil:additive</span> <a href="#attribute-smil_additive">19.434</a>, <span class="Attribute">smil:attributeName</span> <a href="#attribute-smil_attributeName">19.435</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a> and <span class="Attribute">smil:to</span> <a href="#attribute-smil_to">19.458</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:set&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a15_2_5_anim_animateMotion_"><span style="margin-right:0.127cm;">15.2.5</span></a><a id="__RefHeading__1416242_253892949"/><a id="element-anim_animateMotion"/>&lt;anim:animateMotion&gt;</h3><p class="Text_20_body"> See §19.2.12 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> and §3.5.3 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:animateMotion&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:animateMotion&gt;</span> element has the following attributes: <span class="Attribute">anim:formula</span> <a href="#attribute-anim_formula">19.6</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:accumulate</span> <a href="#attribute-smil_accumulate">19.433</a>, <span class="Attribute">smil:additive</span> <a href="#attribute-smil_additive">19.434</a>, <span class="Attribute">smil:attributeName</span> <a href="#attribute-smil_attributeName">19.435</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:by</span> <a href="#attribute-smil_by">19.438</a>, <span class="Attribute">smil:calcMode</span> <a href="#attribute-smil_calcMode">19.439</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:from</span> <a href="#attribute-smil_from">19.448</a>, <span class="Attribute">smil:keySplines</span> <a href="#attribute-smil_keySplines">19.449</a>, <span class="Attribute">smil:keyTimes</span> <a href="#attribute-smil_keyTimes">19.450</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a>, <span class="Attribute">smil:to</span> <a href="#attribute-smil_to">19.458</a>, <span class="Attribute">smil:values</span> <a href="#attribute-smil_values">19.460</a>, <span class="Attribute">svg:origin</span> <a href="#attribute-svg_origin">19.544</a> and <span class="Attribute">svg:path</span> <a href="#attribute-svg_path">19.548</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:animateMotion&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a15_2_6_anim_animateColor_"><span style="margin-right:0.127cm;">15.2.6</span></a><a id="__RefHeading__1416244_253892949"/><a id="element-anim_animateColor"/>&lt;anim:animateColor&gt;</h3><p class="Text_20_body">See §3.5.4 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:animateColor&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:animateColor&gt;</span> element has the following attributes: <span class="Attribute">anim:color-interpolation</span> <a href="#attribute-anim_color-interpolation">19.2</a>, <span class="Attribute">anim:color-interpolation-direction</span> <a href="#attribute-anim_color-interpolation-direction">19.3</a>, <span class="Attribute">anim:formula</span> <a href="#attribute-anim_formula">19.6</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:accumulate</span> <a href="#attribute-smil_accumulate">19.433</a>, <span class="Attribute">smil:additive</span> <a href="#attribute-smil_additive">19.434</a>, <span class="Attribute">smil:attributeName</span> <a href="#attribute-smil_attributeName">19.435</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:by</span> <a href="#attribute-smil_by">19.438</a>, <span class="Attribute">smil:calcMode</span> <a href="#attribute-smil_calcMode">19.439</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:from</span> <a href="#attribute-smil_from">19.448</a>, <span class="Attribute">smil:keySplines</span> <a href="#attribute-smil_keySplines">19.449</a>, <span class="Attribute">smil:keyTimes</span> <a href="#attribute-smil_keyTimes">19.450</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a>, <span class="Attribute">smil:to</span> <a href="#attribute-smil_to">19.458</a> and <span class="Attribute">smil:values</span> <a href="#attribute-smil_values">19.460</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:animateColor&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a15_2_7_anim_transitionFilter_"><span style="margin-right:0.127cm;">15.2.7</span></a><a id="__RefHeading__1416246_253892949"/><a id="element-anim_transitionFilter"/>&lt;anim:transitionFilter&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:transitionFilter&gt;</span> element is based on the <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> <span class="Alien_20_Element">&lt;smil:transitionFilter&gt;</span> element. See §12.5.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:transitionFilter&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:transitionFilter&gt;</span> element has the following attributes: <span class="Attribute">anim:formula</span> <a href="#attribute-anim_formula">19.6</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:accumulate</span> <a href="#attribute-smil_accumulate">19.433</a>, <span class="Attribute">smil:additive</span> <a href="#attribute-smil_additive">19.434</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:by</span> <a href="#attribute-smil_by">19.438</a>, <span class="Attribute">smil:calcMode</span> <a href="#attribute-smil_calcMode">19.439</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:direction</span> <a href="#attribute-smil_direction">19.441</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fadeColor</span> <a href="#attribute-smil_fadeColor">19.445</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:from</span> <a href="#attribute-smil_from">19.448</a>, <span class="Attribute">smil:mode</span> <a href="#attribute-smil_mode">19.451</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:subtype</span> <a href="#attribute-smil_subtype">19.456</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a>, <span class="Attribute">smil:to</span> <a href="#attribute-smil_to">19.458</a>, <span class="Attribute">smil:type</span> <a href="#attribute-smil_type">19.459</a> and <span class="Attribute">smil:values</span> <a href="#attribute-smil_values">19.460</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:transitionFilter&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a15_3Animation_Model_Attributes"><span style="margin-right:0.127cm;">15.3</span></a><a id="__RefHeading__1416248_253892949"/>Animation Model Attributes</h2><h3 class="Heading_20_3"><a id="a15_3_1General"><span style="margin-right:0.127cm;">15.3.1</span></a><a id="__RefHeading__1416250_253892949"/>General</h3><p class="Text_20_body">The animation model uses the same concepts and syntax as specified in §3 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><h3 class="Heading_20_3"><a id="a15_3_2Simple_Animation_Functions"><span style="margin-right:0.127cm;">15.3.2</span></a><a id="__RefHeading__1416252_253892949"/><a id="Simple_Animation_Functions"/>Simple Animation Functions</h3><p class="Text_20_body">Simplified animations can be specified using the <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> <span class="Attribute">smil:from</span>, <span class="Attribute">smil:to</span> and <span class="Attribute">smil:by</span> attributes. See §3.4.4 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><h2 class="Heading_20_2"><a id="a15_4Animation_Timing"><span style="margin-right:0.127cm;">15.4</span></a><a id="__RefHeading__1416254_253892949"/><a id="SMIL_Timing"/>Animation Timing</h2><h3 class="Heading_20_3"><a id="a15_4_1General"><span style="margin-right:0.127cm;">15.4.1</span></a><a id="__RefHeading__1416256_253892949"/>General</h3><p class="Text_20_body">Animation timing uses the same concepts and syntax as specified in §10 and §11 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><h3 class="Heading_20_3"><a id="a15_4_2_anim_par_"><span style="margin-right:0.127cm;">15.4.2</span></a><a id="__RefHeading__1416258_253892949"/><a id="element-anim_par"/>&lt;anim:par&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:par&gt;</span> element is a container of child animation nodes that have a common starting point.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:par&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:par&gt;</span> element has the following attributes: <span class="Attribute">anim:id</span> <a href="#attribute-anim_id">19.7</a>, <span class="Attribute">presentation:group-id</span> <a href="#attribute-presentation_group-id">19.397</a>, <span class="Attribute">presentation:master-element</span> <a href="#attribute-presentation_master-element">19.398</a>, <span class="Attribute">presentation:node-type</span> <a href="#attribute-presentation_node-type">19.402</a>, <span class="Attribute">presentation:preset-class</span> <a href="#attribute-presentation_preset-class">19.410</a>, <span class="Attribute">presentation:preset-id</span> <a href="#attribute-presentation_preset-id">19.411</a>, <span class="Attribute">presentation:preset-sub-type</span> <a href="#attribute-presentation_preset-sub-type">19.412</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:endsync</span> <a href="#attribute-smil_endsync">19.444</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:par&gt;</span> element has the following child elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><h3 class="Heading_20_3"><a id="a15_4_3_anim_seq_"><span style="margin-right:0.127cm;">15.4.3</span></a><a id="__RefHeading__1416260_253892949"/><a id="element-anim_seq"/>&lt;anim:seq&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:seq&gt;</span> element is a container for child animation nodes that start in a sequential fashion.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:seq&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:seq&gt;</span> element has the following attributes: <span class="Attribute">anim:id</span> <a href="#attribute-anim_id">19.7</a>, <span class="Attribute">presentation:group-id</span> <a href="#attribute-presentation_group-id">19.397</a>, <span class="Attribute">presentation:master-element</span> <a href="#attribute-presentation_master-element">19.398</a>, <span class="Attribute">presentation:node-type</span> <a href="#attribute-presentation_node-type">19.402</a>, <span class="Attribute">presentation:preset-class</span> <a href="#attribute-presentation_preset-class">19.410</a>, <span class="Attribute">presentation:preset-id</span> <a href="#attribute-presentation_preset-id">19.411</a>, <span class="Attribute">presentation:preset-sub-type</span> <a href="#attribute-presentation_preset-sub-type">19.412</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:endsync</span> <a href="#attribute-smil_endsync">19.444</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:seq&gt;</span> element has the following child elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><h3 class="Heading_20_3"><a id="a15_4_4_anim_iterate_"><span style="margin-right:0.127cm;">15.4.4</span></a><a id="__RefHeading__1416262_253892949"/><a id="element-anim_iterate"/>&lt;anim:iterate&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:iterate&gt;</span> element defines a parallel time container. The animation effects are applied to the child objects of the target element. The effects for each child object are started one after another, where the delay between the start of the effects of two subsequent children is specified by the <span class="Attribute">anim:iterate-interval</span> attribute. <a href="#attribute-anim_iterate-interval">19.8</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:iterate&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:iterate&gt;</span> element has the following attributes: <span class="Attribute">anim:id</span> <a href="#attribute-anim_id">19.7</a>, <span class="Attribute">anim:iterate-interval</span> <a href="#attribute-anim_iterate-interval">19.8</a>, <span class="Attribute">anim:iterate-type</span> <a href="#attribute-anim_iterate-type">19.9</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">presentation:group-id</span> <a href="#attribute-presentation_group-id">19.397</a>, <span class="Attribute">presentation:master-element</span> <a href="#attribute-presentation_master-element">19.398</a>, <span class="Attribute">presentation:node-type</span> <a href="#attribute-presentation_node-type">19.402</a>, <span class="Attribute">presentation:preset-class</span> <a href="#attribute-presentation_preset-class">19.410</a>, <span class="Attribute">presentation:preset-id</span> <a href="#attribute-presentation_preset-id">19.411</a>, <span class="Attribute">presentation:preset-sub-type</span> <a href="#attribute-presentation_preset-sub-type">19.412</a>, <span class="Attribute">smil:accelerate</span> <a href="#attribute-smil_accelerate">19.432</a>, <span class="Attribute">smil:autoReverse</span> <a href="#attribute-smil_autoReverse">19.436</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:decelerate</span> <a href="#attribute-smil_decelerate">19.440</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:endsync</span> <a href="#attribute-smil_endsync">19.444</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:iterate&gt;</span> element has the following child elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><h2 class="Heading_20_2"><a id="a15_5_anim_audio_"><span style="margin-right:0.127cm;">15.5</span></a><a id="__RefHeading__1416264_253892949"/><a id="element-anim_audio"/>&lt;anim:audio&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;anim:audio&gt;</span> element is based on the <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> <span class="Alien_20_Element">&lt;smil:audio&gt;</span> element. It specifies the playback of audio streams during an animation. See §7.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:audio&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:audio&gt;</span> element has the following attributes: <span class="Attribute">anim:audio-level</span> <a href="#attribute-anim_audio-level">19.4</a>, <span class="Attribute">anim:id</span> <a href="#attribute-anim_id">19.7</a>, <span class="Attribute">presentation:group-id</span> <a href="#attribute-presentation_group-id">19.397</a>, <span class="Attribute">presentation:master-element</span> <a href="#attribute-presentation_master-element">19.398</a>, <span class="Attribute">presentation:node-type</span> <a href="#attribute-presentation_node-type">19.402</a>, <span class="Attribute">presentation:preset-class</span> <a href="#attribute-presentation_preset-class">19.410</a>, <span class="Attribute">presentation:preset-id</span> <a href="#attribute-presentation_preset-id">19.411</a>, <span class="Attribute">presentation:preset-sub-type</span> <a href="#attribute-presentation_preset-sub-type">19.412</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:dur</span> <a href="#attribute-smil_dur">19.442</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:fill</span> <a href="#attribute-smil_fill">19.446</a>, <span class="Attribute">smil:fillDefault</span> <a href="#attribute-smil_fillDefault">19.447</a>, <span class="Attribute">smil:repeatCount</span> <a href="#attribute-smil_repeatCount">19.452</a>, <span class="Attribute">smil:repeatDur</span> <a href="#attribute-smil_repeatDur">19.453</a>, <span class="Attribute">smil:restart</span> <a href="#attribute-smil_restart">19.454</a>, <span class="Attribute">smil:restartDefault</span> <a href="#attribute-smil_restartDefault">19.455</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-anim_audio">19.910.2</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:audio&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a15_6Animation_Command_Elements"><span style="margin-right:0.127cm;">15.6</span></a><a id="__RefHeading__1416266_253892949"/><a id="SMIL_Special"/>Animation Command Elements</h2><h3 class="Heading_20_3"><a id="a15_6_1_anim_command_"><span style="margin-right:0.127cm;">15.6.1</span></a><a id="__RefHeading__1416268_253892949"/><a id="element-anim_command"/>&lt;anim:command&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:command&gt;</span> element specifies an animation command. </p><p class="Note"><span class="Note_20_Label">Note:</span> See <a href="#attribute-anim_command">19.5</a> for details about the element's usage in presentation documents.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:command&gt;</span> element is usable within the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:command&gt;</span> element has the following attributes: <span class="Attribute">anim:command</span> <a href="#attribute-anim_command">19.5</a>, <span class="Attribute">anim:id</span> <a href="#attribute-anim_id">19.7</a>, <span class="Attribute">anim:sub-item</span> <a href="#attribute-anim_sub-item">19.11</a>, <span class="Attribute">presentation:group-id</span> <a href="#attribute-presentation_group-id">19.397</a>, <span class="Attribute">presentation:master-element</span> <a href="#attribute-presentation_master-element">19.398</a>, <span class="Attribute">presentation:node-type</span> <a href="#attribute-presentation_node-type">19.402</a>, <span class="Attribute">presentation:preset-class</span> <a href="#attribute-presentation_preset-class">19.410</a>, <span class="Attribute">presentation:preset-id</span> <a href="#attribute-presentation_preset-id">19.411</a>, <span class="Attribute">presentation:preset-sub-type</span> <a href="#attribute-presentation_preset-sub-type">19.412</a>, <span class="Attribute">smil:begin</span> <a href="#attribute-smil_begin">19.437</a>, <span class="Attribute">smil:end</span> <a href="#attribute-smil_end">19.443</a>, <span class="Attribute">smil:targetElement</span> <a href="#attribute-smil_targetElement">19.457</a> and <span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:command&gt;</span> element has the following child element: <span class="Element">&lt;anim:param&gt;</span> <a href="#element-anim_param">15.6.2</a>.</p><h3 class="Heading_20_3"><a id="a15_6_2_anim_param_"><span style="margin-right:0.127cm;">15.6.2</span></a><a id="__RefHeading__1416270_253892949"/><a id="element-anim_param"/>&lt;anim:param&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;anim:param&gt;</span> element specifies a parameter for an <span class="Element">&lt;anim:command&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;anim:param&gt;</span> element is usable within the following element: <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;anim:param&gt;</span> element has the following attributes: <span class="Attribute">anim:name</span> <a href="#attribute-anim_name">19.10</a> and <span class="Attribute">anim:value</span> <a href="#attribute-anim_value">19.12</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;anim:param&gt;</span> element has no child elements.</p><h1 class="Heading_20_1"><a id="a16Styles"><span style="margin-right:0.127cm;">16</span></a><a id="__RefHeading__1416272_253892949"/><a id="Styles"/>Styles</h1><h2 class="Heading_20_2"><a id="a16_1General"><span style="margin-right:0.127cm;">16.1</span></a><a id="__RefHeading__1416274_253892949"/>General</h2><p class="Text_20_body">Objects in an office document may have formatting properties. A formatting property influences the visual representation of an object.</p><p class="Text_20_body">In the OpenDocument format, formatting properties are stored in styles. </p><p class="Text_20_body">There are two reasons for using styles to store formatting properties:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>Format information is separated from document content.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>Styles enable consistent formatting and changing of formatting for objects subject to styles. <span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">Styles and font face declarations are referenced by their <span class="Attribute">style:name</span> attribute. A referenced style or font face declaration should be defined in the same file as the reference, or in styles.xml. </p><h2 class="Heading_20_2"><a id="a16_2_style_style_"><span style="margin-right:0.127cm;">16.2</span></a><a id="__RefHeading__1416276_253892949"/><a id="element-style_style"/>&lt;style:style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:style&gt;</span> element represents styles.</p><p class="Text_20_body">Styles defined by the <span class="Element">&lt;style:style&gt;</span> element use a hierarchical style model. The <span class="Element">&lt;style:style&gt;</span> element supports inheritance of formatting properties by a style from its parent style. A parent style is specified by the <span class="Attribute">style:parent-style-name</span> attribute on a <span class="Element">&lt;style:style&gt;</span> element. </p><p class="Text_20_body">The determination of the value of a formatting property begins with any style that is specified by an element. If the formatting property is present in that style, its value is used.</p><p class="Text_20_body">If that style does not specify a value for that formatting property and it has a parent style, the value of the formatting element is taken from the parent style, if present.</p><p class="Text_20_body">If the parent style does not have a value for the formatting property, the search for the formatting property value continues up parent styles until either the formatting property has been found or a style is found with no parent style.</p><p class="Text_20_body">If a search of the parent styles of a style does not result in a value for a formatting property, the determination of its value depends on the style family and the element to which a style is applied.</p><p class="Text_20_body">For styles with family <span class="Attribute_20_Value">text</span> which are applied to elements which are contained in another element that specifies a style with family <span class="Attribute_20_Value">text</span>, the search continues within the <span class="Attribute_20_Value">text</span> style that is applied to the nearest ancestor element that specifies a style with family <span class="Attribute_20_Value">text</span>, and continues in its parent styles. </p><p class="Text_20_body">For styles with family <span class="Attribute_20_Value">text</span> which are applied to elements which are contained in a paragraph element <a href="#character-content">6.1.1</a>, the search continues within the <span class="Attribute_20_Value">paragraph</span> style that is applied to the paragraph element, and continues in its parent styles. </p><p class="Text_20_body">For styles with family <span class="Attribute_20_Value">paragraph</span> which are applied to paragraph elements which are contained in a drawing shape or a chart element, the search continues within the <span class="Attribute_20_Value">graphic</span>, <span class="Attribute_20_Value">presentation</span> or <span class="Attribute_20_Value">chart</span> style that is applied to the drawing object or chart element, and continues in its parent styles.</p><p class="Text_20_body">For styles with family <span class="Attribute_20_Value">paragraph</span> which are applied to paragraph elements which are contained in a table cell, the search continues within the <span class="Attribute_20_Value">table-cell</span> style that is applied to the table-cell, and continues in its parent  styles. If a value for the formatting property has not been found, the search continues as defined for styles with family <span class="Attribute_20_Value">table-cell</span>. </p><p class="Text_20_body">For styles with family <span class="Attribute_20_Value">table-cell</span> which are applied to a table cell, the search continues with the style specified by the <span class="Attribute">table:default-cell-style-name</span> attribute <a href="#attribute-table_default-cell-style-name">19.615</a> of the table cell's <span class="Element">&lt;table:table-row&gt;</span> parent element, if present, and then with the style specified by the <span class="Attribute">table:default-cell-style-name</span> attribute of the <span class="Element">&lt;table:table-column&gt;</span> element associated with the table cell. </p><p class="Text_20_body">In all other cases, or if a value for the formatting property has not been found by any of the family specific rules, a default style <a href="#element-style_default-style">16.4</a> that has the same family as the style initially declared sets the value. If there is no value specified in that default style, an implementation-dependent value is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:style&gt;</span> element has the following attributes: <span class="Attribute">style:auto-update</span> <a href="#attribute-style_auto-update">19.463</a>, <span class="Attribute">style:class</span> <a href="#attribute-style_class">19.466</a>, <span class="Attribute">style:data-style-name</span> <a href="#attribute-style_data-style-name_element-style_style">19.469.3</a>, <span class="Attribute">style:default-outline-level</span> <a href="#attribute-style_default-outline-level">19.470</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:family</span> <a href="#attribute-style_family">19.476</a>, <span class="Attribute">style:list-level</span> <a href="#attribute-style_list-level">19.495</a>, <span class="Attribute">style:list-style-name</span> <a href="#attribute-style_list-style-name">19.496</a>, <span class="Attribute">style:master-page-name</span> <a href="#attribute-style_master-page-name">19.497</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-style_style">19.498.2</a>, <span class="Attribute">style:next-style-name</span> <a href="#attribute-style_next-style-name_element-style_style">19.499.3</a>, <span class="Attribute">style:parent-style-name</span> <a href="#attribute-style_parent-style-name">19.506</a> and <span class="Attribute">style:percentage-data-style-name</span> <a href="#attribute-style_percentage-data-style-name">19.507</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:style&gt;</span> element has the following child elements: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>, <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>, <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:ruby-properties&gt;</span> <a href="#element-style_ruby-properties">17.10</a>, <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>, <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>, <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>, <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>, <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>, <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h2 class="Heading_20_2"><a id="a16_3_style_map_"><span style="margin-right:0.127cm;">16.3</span></a><a id="__RefHeading__1416278_253892949"/><a id="element-style_map"/>&lt;style:map&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:map&gt;</span> element represents a condition, which if met, results in the mapping of a style. A style that contains one or more mappings is called a conditional style. Each condition is represented by a unique <span class="Element">&lt;style:map&gt;</span> element.</p><p class="Text_20_body">Conditional styles are supported by:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>paragraph styles contained in text documents<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>table cell styles contained in spreadsheets<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>data styles<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:map&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>, <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:map&gt;</span> element has the following attributes: <span class="Attribute">style:apply-style-name</span> <a href="#attribute-style_apply-style-name">19.462</a>, <span class="Attribute">style:base-cell-address</span> <a href="#attribute-style_base-cell-address">19.464</a> and <span class="Attribute">style:condition</span> <a href="#attribute-style_condition">19.468</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:map&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_4_style_default-style_"><span style="margin-right:0.127cm;">16.4</span></a><a id="__RefHeading__1416280_253892949"/><a id="element-style_default-style"/>&lt;style:default-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:default-style&gt;</span> element represents default styles. A default style specifies default formatting properties for a style family. These defaults are used if a formatting property is neither specified by an automatic nor a common style. Default styles exist for all style families that are represented by the <span class="Element">&lt;style:style&gt;</span> element specified by the <span class="Attribute">style:family</span> attribute <a href="#attribute-style_family">19.476</a>.</p><p class="Text_20_body">An OpenDocument document should contain the default styles of the style families for which are used in common or automatic styles in the document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:default-style&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:default-style&gt;</span> element has the following attributes: <span class="Attribute">style:family</span> <a href="#attribute-style_family">19.476</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:default-style&gt;</span> element has the following child elements: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>, <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>, <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:ruby-properties&gt;</span> <a href="#element-style_ruby-properties">17.10</a>, <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>, <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>, <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>, <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>, <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>, <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h2 class="Heading_20_2"><a id="a16_5_style_page-layout_"><span style="margin-right:0.127cm;">16.5</span></a><a id="__RefHeading__1416282_253892949"/><a id="element-style_page-layout"/>&lt;style:page-layout&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:page-layout&gt;</span> element represents the styles that specify the formatting properties of a page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:page-layout&gt;</span> element is usable within the following element: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:page-layout&gt;</span> element has the following attributes: <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-style_page-layout">19.498.2</a> and <span class="Attribute">style:page-usage</span> <a href="#attribute-style_page-usage">19.505</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:page-layout&gt;</span> element has the following child elements: <span class="Element">&lt;style:footer-style&gt;</span> <a href="#element-style_footer-style">16.7</a>, <span class="Element">&lt;style:header-style&gt;</span> <a href="#element-style_header-style">16.6</a> and <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><h2 class="Heading_20_2"><a id="a16_6_style_header-style_"><span style="margin-right:0.127cm;">16.6</span></a><a id="__RefHeading__1416284_253892949"/><a id="element-style_header-style"/>&lt;style:header-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:header-style&gt;</span> element specifies the formatting properties for a header element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:header-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-page-layout&gt;</span> <a href="#element-style_default-page-layout">16.8</a> and <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout">16.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:header-style&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:header-style&gt;</span> element has the following child element: <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>.</p><h2 class="Heading_20_2"><a id="a16_7_style_footer-style_"><span style="margin-right:0.127cm;">16.7</span></a><a id="__RefHeading__1416286_253892949"/><a id="element-style_footer-style"/>&lt;style:footer-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:footer-style&gt;</span> element specifies the formatting properties for a footer element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:footer-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-page-layout&gt;</span> <a href="#element-style_default-page-layout">16.8</a> and <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout">16.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:footer-style&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:footer-style&gt;</span> element has the following child element: <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>.</p><h2 class="Heading_20_2"><a id="a16_8_style_default-page-layout_"><span style="margin-right:0.127cm;">16.8</span></a><a id="__RefHeading__1416288_253892949"/><a id="element-style_default-page-layout"/>&lt;style:default-page-layout&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:default-page-layout&gt;</span> element specifies default formatting properties for page layouts. These defaults are used if a formatting property is not specified in a <span class="Element">&lt;style:page-layout-properties&gt;</span> element. <a href="#element-style_page-layout-properties">17.2</a> </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:default-page-layout&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:default-page-layout&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:default-page-layout&gt;</span> element has the following child elements: <span class="Element">&lt;style:footer-style&gt;</span> <a href="#element-style_footer-style">16.7</a>, <span class="Element">&lt;style:header-style&gt;</span> <a href="#element-style_header-style">16.6</a> and <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><h2 class="Heading_20_2"><a id="a16_9_style_master-page_"><span style="margin-right:0.127cm;">16.9</span></a><a id="__RefHeading__1416290_253892949"/><a id="element-style_master-page"/>&lt;style:master-page&gt;</h2><p class="Text_20_body">In text and spreadsheet documents, the <span class="Element">&lt;style:master-page&gt;</span> element contains the content of headers and footers. For these types of documents, consumers may generate a sequence of pages by making use of a single master page or a set of master pages.</p><p class="Text_20_body">In drawing and presentation documents, the <span class="Element">&lt;style:master-page&gt;</span> element is used to define master pages as common backgrounds for drawing pages. Each drawing page is directly linked to one master page, which is specified by the <span class="Attribute">draw:master-page-name</span> attribute of the drawing pages style.</p><p class="Text_20_body">Master pages are contained in the <span class="Element">&lt;office:master-styles&gt;</span> element.</p><p class="Text_20_body">All documents shall contain at least one master page element.</p><p class="Text_20_body">If a text or spreadsheet document is displayed in a paged layout, master pages are used to generate a sequence of pages containing the document content. When a page is created, an empty page is generated with the properties of the master page and the static content of the master page. The body of the page is then filled with content. A single master pages can be used to created multiple pages within a document.</p><p class="Text_20_body">In text and spreadsheet documents, a master page can be assigned to paragraph and table styles using a <span class="Attribute">style:master-page-name</span> attribute. Each time the paragraph or table style is applied to text, a page break is inserted before the paragraph or table. A page that starts at the page break position uses the specified master page.</p><p class="Text_20_body">In drawings and presentations, master pages can be assigned to drawing pages using a <span class="Attribute">style:parent-style-name</span> attribute.</p><p class="Note"><span class="Note_20_Label">Note:</span> The OpenDocument paging methodology differs significantly from the methodology used in <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. In XSL, headers and footers are contained within page sequences that also contain the document content. In the OpenDocument format, headers and footers are contained in page styles. With either approach, the content of headers and footers can be changed or omitted without affecting the document content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:master-page&gt;</span> element is usable within the following element: <span class="Element">&lt;office:master-styles&gt;</span> <a href="#element-office_master-styles">3.15.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:master-page&gt;</span> element has the following attributes: <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-style_master-page">19.219.27</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-style_master-page">19.498.2</a>, <span class="Attribute">style:next-style-name</span> <a href="#attribute-style_next-style-name_element-style_master-page">19.499.2</a> and <span class="Attribute">style:page-layout-name</span> <a href="#attribute-style_page-layout-name">19.504</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:master-page&gt;</span> element has the following child elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a>, <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:layer-set&gt;</span> <a href="#element-draw_layer-set">10.2.2</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><h2 class="Heading_20_2"><a id="a16_10_style_header_"><span style="margin-right:0.127cm;">16.10</span></a><a id="__RefHeading__1416292_253892949"/><a id="element-style_header"/>&lt;style:header&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:header&gt;</span> element represents the content of a header in a <span class="Element">&lt;style:master-page&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:header&gt;</span> element is usable within the following element: <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:header&gt;</span> element has the following attribute: <span class="Attribute">style:display</span> <a href="#attribute-style_display">19.471</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:header&gt;</span> element has the following child elements: <span class="Element">&lt;style:region-center&gt;</span> <a href="#element-style_region-center">16.15</a>, <span class="Element">&lt;style:region-left&gt;</span> <a href="#element-style_region-left">16.14</a>, <span class="Element">&lt;style:region-right&gt;</span> <a href="#element-style_region-right">16.16</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>, <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a>, <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a16_11_style_footer_"><span style="margin-right:0.127cm;">16.11</span></a><a id="__RefHeading__1416294_253892949"/><a id="element-style_footer"/>&lt;style:footer&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:footer&gt;</span> element represents the content of a footer in a <span class="Element">&lt;style:master-page&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:footer&gt;</span> element is usable within the following element: <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:footer&gt;</span> element has the following attribute: <span class="Attribute">style:display</span> <a href="#attribute-style_display">19.471</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:footer&gt;</span> element has the following child elements: <span class="Element">&lt;style:region-center&gt;</span> <a href="#element-style_region-center">16.15</a>, <span class="Element">&lt;style:region-left&gt;</span> <a href="#element-style_region-left">16.14</a>, <span class="Element">&lt;style:region-right&gt;</span> <a href="#element-style_region-right">16.16</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-</span><span class="Element">file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>, <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a>, <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a16_12_style_header-left_"><span style="margin-right:0.127cm;">16.12</span></a><a id="__RefHeading__1416296_253892949"/><a id="element-style_header-left"/>&lt;style:header-left&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:header-left&gt;</span> element represents the content for a header for a left page, if different from the right page in a <span class="Element">&lt;style:master-page&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:header-left&gt;</span> element is usable within the following element: <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:header-left&gt;</span> element has the following attribute: <span class="Attribute">style:display</span> <a href="#attribute-style_display">19.471</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:header-left&gt;</span> element has the following child elements: <span class="Element">&lt;style:region-center&gt;</span> <a href="#element-style_region-center">16.15</a>, <span class="Element">&lt;style:region-left&gt;</span> <a href="#element-style_region-left">16.14</a>, <span class="Element">&lt;style:region-right&gt;</span> <a href="#element-style_region-right">16.16</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>, <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a>, <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a16_13_style_footer-left_"><span style="margin-right:0.127cm;">16.13</span></a><a id="__RefHeading__1416298_253892949"/><a id="element-style_footer-left"/>&lt;style:footer-left&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:footer-left&gt;</span> element represents the content for a footer for a left page, if different from the right page for a <span class="Element">&lt;style:master-page&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:footer-left&gt;</span> element is usable within the following element: <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:footer-left&gt;</span> element has the following attribute: <span class="Attribute">style:display</span> <a href="#attribute-style_display">19.471</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:footer-left&gt;</span> element has the following child elements: <span class="Element">&lt;style:region-center&gt;</span> <a href="#element-style_region-center">16.15</a>, <span class="Element">&lt;style:region-left&gt;</span> <a href="#element-style_region-left">16.14</a>, <span class="Element">&lt;style:region-right&gt;</span> <a href="#element-style_region-right">16.16</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a>, <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>, <span class="Element">&lt;text:dde-connection-decls&gt;</span> <a href="#element-text_dde-connection-decls">14.6.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:sequence-decls&gt;</span> <a href="#element-text_sequence-decls">7.4.11</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>, <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>, <span class="Element">&lt;text:user-field-decls&gt;</span> <a href="#element-text_user-field-decls">7.4.7</a>, <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a> and <span class="Element">&lt;text:variable-decls&gt;</span> <a href="#element-text_variable-decls">7.4.2</a>.</p><h2 class="Heading_20_2"><a id="a16_14_style_region-left_"><span style="margin-right:0.127cm;">16.14</span></a><a id="__RefHeading__1416300_253892949"/><a id="element-style_region-left"/>&lt;style:region-left&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:region-left&gt;</span> element specifies a left-aligned portion of a header or footer. That region may contain a sequence of <span class="Element">&lt;text:p&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:region-left&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:region-left&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:region-left&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a16_15_style_region-center_"><span style="margin-right:0.127cm;">16.15</span></a><a id="__RefHeading__1416302_253892949"/><a id="element-style_region-center"/>&lt;style:region-center&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:region-center&gt;</span> element specifies a center-aligned portion of a header or footer. That region may contain a sequence of <span class="Element">&lt;text:p&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:region-center&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:region-center&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:region-center&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a16_16_style_region-right_"><span style="margin-right:0.127cm;">16.16</span></a><a id="__RefHeading__1416304_253892949"/><a id="element-style_region-right"/>&lt;style:region-right&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:region-right&gt;</span> element specifies a right-aligned portion of a header or footer. That region may contain a sequence of <span class="Element">&lt;text:p&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:region-right&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:region-right&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:region-right&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a16_17_presentation_notes_"><span style="margin-right:0.127cm;">16.17</span></a><a id="__RefHeading__1416306_253892949"/><a id="element-presentation_notes"/>&lt;presentation:notes&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;presentation:notes&gt;</span> element defines a notes page. A notes page contains a preview of a drawing page and additional graphic shapes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:notes&gt;</span> element is usable within the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:notes&gt;</span> element has the following attributes: <span class="Attribute">draw:style-name</span> <a href="#attribute-draw_style-name_element-presentation_notes">19.219.25</a>, <span class="Attribute">presentation:use-date-time-name</span> <a href="#attribute-presentation_use-date-time-name">19.424</a>, <span class="Attribute">presentation:use-footer-</span><span class="Attribute">name</span> <a href="#attribute-presentation_use-footer-name">19.425</a>, <span class="Attribute">presentation:use-header-name</span> <a href="#attribute-presentation_use-header-name">19.426</a> and <span class="Attribute">style:page-layout-name</span> <a href="#attribute-style_page-layout-name">19.504</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:notes&gt;</span> element has the following child elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>.</p><h2 class="Heading_20_2"><a id="a16_18_table_table-template_"><span style="margin-right:0.127cm;">16.18</span></a><a id="__RefHeading__1416308_253892949"/><a id="element-table_table-template"/>&lt;table:table-template&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;table:table-template&gt;</span> element represents a set of references to table cell styles that specify the formatting to be used when creating a table.</p><p class="Text_20_body">If more than one table cell style reference is applicable to a cell, the first style that is applicable is chosen in the following order:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>First Column <span class="Element">&lt;table:first-column&gt;</span> <a href="#element-table_first-column">16.19.4</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Last Column <span class="Element">&lt;</span><span class="Element">table:last-column&gt;</span> <a href="#element-table_last-column">16.19.5</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>First Row <span class="Element">&lt;table:first-row&gt;</span> <a href="#element-table_first-row">16.19.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Last Row <span class="Element">&lt;table:last-row&gt;</span> <a href="#element-table_last-row">16.19.3</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Even rows <span class="Element">&lt;table:even-rows&gt;</span> <a href="#element-table_even-rows">16.19.7</a>, odd rows <span class="Element">&lt;table:odd-rows&gt;</span> <a href="#element-table_odd-rows">16.19.8</a> (Banded Rows)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Even columns <span class="Element">&lt;table:even-columns&gt;</span> <a href="#element-table_even-columns">16.19.9</a>, odd columns <span class="Element">&lt;table:odd-columns&gt;</span> <a href="#element-table_odd-columns">16.19.10</a> (Banded Columns)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Body <span class="Element">&lt;table:body&gt;</span> <a href="#element-table_body">16.19.6</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Table templates are contained in a <span class="Element">&lt;office:styles&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:table-template&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:table-template&gt;</span> element has the following attributes: <span class="Attribute">table:first-row-end-column</span> <a href="#attribute-table_first-row-end-column">19.640</a>, <span class="Attribute">table:first-row-start-column</span> <a href="#attribute-table_first-row-start-column">19.641</a>, <span class="Attribute">table:last-row-end-column</span> <a href="#attribute-table_last-row-end-column">19.659</a>, <span class="Attribute">table:last-row-start-column</span> <a href="#attribute-table_last-row-start-column">19.661</a> and <span class="Attribute">table:name</span> <a href="#attribute-table_name_element-table_table-template">19.673.14</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:table-template&gt;</span> element has the following child elements: <span class="Element">&lt;table:background&gt;</span> <a href="#element-table_background">16.20</a>, <span class="Element">&lt;table:body&gt;</span> <a href="#element-table_body">16.19.6</a>, <span class="Element">&lt;table:even-columns&gt;</span> <a href="#element-table_even-columns">16.19.9</a>, <span class="Element">&lt;table:even-rows&gt;</span> <a href="#element-table_even-rows">16.19.7</a>, <span class="Element">&lt;table:first-column&gt;</span> <a href="#element-table_first-column">16.19.4</a>, <span class="Element">&lt;table:first-row&gt;</span> <a href="#element-table_first-row">16.19.2</a>, <span class="Element">&lt;table:last-column&gt;</span> <a href="#element-table_last-column">16.19.5</a>, <span class="Element">&lt;table:last-row&gt;</span> <a href="#element-table_last-row">16.19.3</a>, <span class="Element">&lt;table:odd-columns&gt;</span> <a href="#element-table_odd-columns">16.19.10</a> and <span class="Element">&lt;table:odd-rows&gt;</span> <a href="#element-table_odd-rows">16.19.8</a>.</p><h2 class="Heading_20_2"><a id="a16_19Cell_Styles"><span style="margin-right:0.127cm;">16.19</span></a><a id="__RefHeading__1416310_253892949"/>Cell Styles</h2><h3 class="Heading_20_3"><a id="a16_19_1General"><span style="margin-right:0.127cm;">16.19.1</span></a><a id="__RefHeading__1416312_253892949"/>General</h3><p class="Text_20_body">The cell styles applied in a table are based on the position of cells in a table. </p><h3 class="Heading_20_3"><a id="a16_19_2_table_first-row_"><span style="margin-right:0.127cm;">16.19.2</span></a><a id="__RefHeading__1416314_253892949"/><a id="element-table_first-row"/><a id="table_template_row_and_column_styles"/>&lt;table:first-row&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:first-row&gt;</span> element specifies a cell style that shall be applied to the first row of a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:first-row&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:first-row&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_first-row">19.726.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:first-row&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_3_table_last-row_"><span style="margin-right:0.127cm;">16.19.3</span></a><a id="__RefHeading__1416316_253892949"/><a id="element-table_last-row"/>&lt;table:last-row&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:last-row&gt;</span> element specifies a cell style that shall be applied to the last row of a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:last-row&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:last-row&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_last-row">19.726.10</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:last-row&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_4_table_first-column_"><span style="margin-right:0.127cm;">16.19.4</span></a><a id="__RefHeading__1416318_253892949"/><a id="element-table_first-column"/>&lt;table:first-column&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:first-column&gt;</span> element specifies a cell style that shall be applied to the first table column in a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:first-column&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:first-column&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_first-column">19.726.7</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:first-column&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_5_table_last-column_"><span style="margin-right:0.127cm;">16.19.5</span></a><a id="__RefHeading__1416320_253892949"/><a id="element-table_last-column"/>&lt;table:last-column&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:last-column&gt;</span> element specifies a cell style that shall be applied to the last table column in a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:last-column&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:last-column&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_last-column">19.726.9</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:last-column&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_6_table_body_"><span style="margin-right:0.127cm;">16.19.6</span></a><a id="__RefHeading__1416322_253892949"/><a id="element-table_body"/>&lt;table:body&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:body&gt;</span> element specifies styles for cells that are not governed by other specified styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:body&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:body&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_body">19.726.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:body&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_7_table_even-rows_"><span style="margin-right:0.127cm;">16.19.7</span></a><a id="__RefHeading__1416324_253892949"/><a id="element-table_even-rows"/>&lt;table:even-rows&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:even-rows&gt;</span> element specifies styles to be applied to even rows in a table. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:even-rows&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:even-rows&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_even-rows">19.726.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:even-rows&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_8_table_odd-rows_"><span style="margin-right:0.127cm;">16.19.8</span></a><a id="__RefHeading__1416326_253892949"/><a id="element-table_odd-rows"/>&lt;table:odd-rows&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:odd-rows&gt;</span> element specifies styles to be applied to odd rows in a table. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:odd-rows&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:odd-rows&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_odd-rows">19.726.12</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:odd-rows&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_9_table_even-columns_"><span style="margin-right:0.127cm;">16.19.9</span></a><a id="__RefHeading__1416328_253892949"/><a id="element-table_even-columns"/>&lt;table:even-columns&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:even-columns&gt;</span> element specifies styles to be applied to even columns in a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:even-columns&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:even-columns&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_even-columns">19.726.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:even-columns&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_19_10_table_odd-columns_"><span style="margin-right:0.127cm;">16.19.10</span></a><a id="__RefHeading__1416330_253892949"/><a id="element-table_odd-columns"/>&lt;table:odd-columns&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;table:odd-columns&gt;</span> element specifies styles to be applied to odd columns in a table. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:odd-columns&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:odd-columns&gt;</span> element has the following attributes: <span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a> and <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_odd-columns">19.726.11</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:odd-columns&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_20_table_background_"><span style="margin-right:0.127cm;">16.20</span></a><a id="__RefHeading__1416332_253892949"/><a id="element-table_background"/>&lt;table:background&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;table:background&gt;</span> element specifies a table style that provides a background to a table that is visible if all or part of the table is transparent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;table:background&gt;</span> element is usable within the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;table:background&gt;</span> element has the following attribute: <span class="Attribute">table:style-name</span> <a href="#attribute-table_style-name_element-table_background">19.726.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;table:background&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_21_style_font-face_"><span style="margin-right:0.127cm;">16.21</span></a><a id="__RefHeading__1416334_253892949"/><a id="element-style_font-face"/>&lt;style:font-face&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:font-face&gt;</span> element represents a font face declaration which documents the properties of a font used in a document.</p><p class="Text_20_body">OpenDocument font face declarations directly correspond to the <span class="Misc_20_Source">@font-face</span> font description of <a title="Cascading Style Sheets, level 2" href="http://www.w3.org/TR/1998/REC-CSS2-19980512">[CSS2]</a> (see §15.3.1) and the <span class="Alien_20_Element">&lt;font-face&gt;</span> element of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> (see §20.8.3).</p><p class="Text_20_body">OpenDocument font face declarations may have an unique name. This name can be used inside styles (as an attribute of <span class="Element">&lt;style:text-properties&gt;</span> element) as value of the <span class="Attribute">style:font-name</span> attribute to select a font face declaration. If a font face declaration is referenced by name, the font matching algorithms for selecting a font declaration based on the font-family, font-style, font-variant, font-weight and font-size descriptors are not used but the referenced font face declaration is used directly. (See §15.5 <a title="Cascading Style Sheets, level 2" href="http://www.w3.org/TR/1998/REC-CSS2-19980512">[CSS2]</a>)</p><p class="Text_20_body">Consumers should implement the CSS2 font matching algorithm with the OpenDocument font face extensions. They may implement variations of the CSS2 font matching algorithm. They may implement a font matching based only on the font face declarations, that is, a font matching that is not applied to every character independently but only once for each font face declaration. (See §15.5 <a title="Cascading Style Sheets, level 2" href="http://www.w3.org/TR/1998/REC-CSS2-19980512">[CSS2]</a>)</p><p class="Text_20_body">Font face declarations support the font descriptor attributes and elements described in §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:font-face&gt;</span> element is usable within the following element: <span class="Element">&lt;office:font-face-decls&gt;</span> <a href="#element-office_font-face-decls">3.14</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:font-face&gt;</span> element has the following attributes: <span class="Attribute">style:font-adornments</span> <a href="#attribute-style_font-adornments">19.478</a>, <span class="Attribute">style:font-charset</span> <a href="#attribute-style_font-charset">19.479</a>, <span class="Attribute">style:font-family-generic</span> <a href="#attribute-style_font-family-generic">19.480</a>, <span class="Attribute">style:font-pitch</span> <a href="#attribute-style_font-pitch">19.481</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-style_font-face">19.498.3</a>, <span class="Attribute">svg:accent-height</span> <a href="#attribute-svg_accent-height">19.519</a>, <span class="Attribute">svg:alphabetic</span> <a href="#attribute-svg_alphabetic">19.520</a>, <span class="Attribute">svg:ascent</span> <a href="#attribute-svg_ascent">19.521</a>, <span class="Attribute">svg:bbox</span> <a href="#attribute-svg_bbox">19.522</a>, <span class="Attribute">svg:cap-height</span> <a href="#attribute-svg_cap-height">19.523</a>, <span class="Attribute">svg:descent</span> <a href="#attribute-svg_descent">19.527</a>, <span class="Attribute">svg:font-family</span> <a href="#attribute-svg_font-family">19.528</a>, <span class="Attribute">svg:font-size</span> <a href="#attribute-svg_font-size">19.529</a>, <span class="Attribute">svg:font-stretch</span> <a href="#attribute-svg_font-stretch">19.530</a>, <span class="Attribute">svg:font-style</span> <a href="#attribute-svg_font-style">19.531</a>, <span class="Attribute">svg:font-variant</span> <a href="#attribute-svg_font-variant">19.532</a>, <span class="Attribute">svg:font-weight</span> <a href="#attribute-svg_font-weight">19.533</a>, <span class="Attribute">svg:hanging</span> <a href="#attribute-svg_hanging">19.538</a>, <span class="Attribute">svg:ideographic</span> <a href="#attribute-svg_ideographic">19.540</a>, <span class="Attribute">svg:mathematical</span> <a href="#attribute-svg_mathematical">19.541</a>, <span class="Attribute">svg:overline-position</span> <a href="#attribute-svg_overline-position">19.545</a>, <span class="Attribute">svg:overline-</span><span class="Attribute">thickness</span> <a href="#attribute-svg_overline-thickness">19.546</a>, <span class="Attribute">svg:panose-1</span> <a href="#attribute-svg_panose-1">19.547</a>, <span class="Attribute">svg:slope</span> <a href="#attribute-svg_slope">19.552</a>, <span class="Attribute">svg:stemh</span> <a href="#attribute-svg_stemh">19.554</a>, <span class="Attribute">svg:stemv</span> <a href="#attribute-svg_stemv">19.555</a>, <span class="Attribute">svg:strikethrough-position</span> <a href="#attribute-svg_strikethrough-position">19.558</a>, <span class="Attribute">svg:strikethrough-thickness</span> <a href="#attribute-svg_strikethrough-thickness">19.559</a>, <span class="Attribute">svg:underline-position</span> <a href="#attribute-svg_underline-position">19.562</a>, <span class="Attribute">svg:underline-thickness</span> <a href="#attribute-svg_underline-thickness">19.563</a>, <span class="Attribute">svg:unicode-range</span> <a href="#attribute-svg_unicode-range">19.564</a>, <span class="Attribute">svg:units-per-em</span> <a href="#attribute-svg_units-per-em">19.565</a>, <span class="Attribute">svg:v-alphabetic</span> <a href="#attribute-svg_v-alphabetic">19.566</a>, <span class="Attribute">svg:v-hanging</span> <a href="#attribute-svg_v-hanging">19.567</a>, <span class="Attribute">svg:v-ideographic</span> <a href="#attribute-svg_v-ideographic">19.568</a>, <span class="Attribute">svg:v-mathematical</span> <a href="#attribute-svg_v-mathematical">19.569</a>, <span class="Attribute">svg:widths</span> <a href="#attribute-svg_widths">19.572</a> and <span class="Attribute">svg:x-height</span> <a href="#attribute-svg_x-height">19.576</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:font-face&gt;</span> element has the following child elements: <span class="Element">&lt;svg:definition-src&gt;</span> <a href="#element-svg_definition-src">16.25</a> and <span class="Element">&lt;svg:font-face-src&gt;</span> <a href="#element-svg_font-face-src">16.22</a>.</p><h2 class="Heading_20_2"><a id="a16_22_svg_font-face-src_"><span style="margin-right:0.127cm;">16.22</span></a><a id="__RefHeading__1416336_253892949"/><a id="element-svg_font-face-src"/>&lt;svg:font-face-src&gt;</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:font-face-src&gt;</span> element is usable within the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:font-face-src&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:font-face-src&gt;</span> element has the following child elements: <span class="Element">&lt;svg:font-face-name&gt;</span> <a href="#element-svg_font-face-name">16.23</a> and <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>.</p><h2 class="Heading_20_2"><a id="a16_23_svg_font-face-name_"><span style="margin-right:0.127cm;">16.23</span></a><a id="__RefHeading__1416338_253892949"/><a id="element-svg_font-face-name"/>&lt;svg:font-face-name&gt;</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:font-face-name&gt;</span> element is usable within the following element: <span class="Element">&lt;svg:font-face-src&gt;</span> <a href="#element-svg_font-face-src">16.22</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:font-face-name&gt;</span> element has the following attribute: <span class="Attribute">svg:name</span> <a href="#attribute-svg_name">19.542</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:font-face-name&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_24_svg_font-face-uri_"><span style="margin-right:0.127cm;">16.24</span></a><a id="__RefHeading__1416340_253892949"/><a id="element-svg_font-face-uri"/>&lt;svg:font-face-uri&gt;</h2><p class="Text_20_body">See § 20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:font-face-uri&gt;</span> element is usable within the following element: <span class="Element">&lt;svg:font-face-src&gt;</span> <a href="#element-svg_font-face-src">16.22</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:font-face-uri&gt;</span> element has the following attributes: <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-svg_font-face-uri">19.910.30</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:font-face-uri&gt;</span> element has the following child element: <span class="Element">&lt;svg:font-face-format&gt;</span> <a href="#element-svg_font-face-format">16.26</a>.</p><h2 class="Heading_20_2"><a id="a16_25_svg_definition-src_"><span style="margin-right:0.127cm;">16.25</span></a><a id="__RefHeading__1416342_253892949"/><a id="element-svg_definition-src"/>&lt;svg:definition-src&gt;</h2><p class="Text_20_body">See § 20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:definition-src&gt;</span> element is usable within the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:definition-src&gt;</span> element has the following attributes: <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-svg_definition-src">19.910.29</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:definition-src&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_26_svg_font-face-format_"><span style="margin-right:0.127cm;">16.26</span></a><a id="__RefHeading__1416344_253892949"/><a id="element-svg_font-face-format"/>&lt;svg:font-face-format&gt;</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:font-face-format&gt;</span> element is usable within the following element: <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:font-face-format&gt;</span> element has the following attribute: <span class="Attribute">svg:string</span> <a href="#attribute-svg_string">19.560</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:font-face-format&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_27Data_Styles"><span style="margin-right:0.127cm;">16.27</span></a><a id="__RefHeading__1416346_253892949"/><a id="Data_Style"/>Data Styles</h2><h3 class="Heading_20_3"><a id="a16_27_1General"><span style="margin-right:0.127cm;">16.27.1</span></a><a id="__RefHeading__1416348_253892949"/>General</h3><p class="Text_20_body">Data styles specify the styles to be applied to defined data types for display.</p><p class="Text_20_body">Data styles shall not specify two <span class="Element">&lt;number:text&gt;</span> elements in sequence as part of a data style.</p><h3 class="Heading_20_3"><a id="a16_27_2_number_number-style_"><span style="margin-right:0.127cm;">16.27.2</span></a><a id="__RefHeading__1416350_253892949"/><a id="element-number_number-style"/>&lt;number:number-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:number-style&gt;</span> element is a container for elements that define a style for decimal numbers.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:number-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:number-style&gt;</span> element has the following attributes: <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_number-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:number-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:fraction&gt;</span> <a href="#element-number_fraction">16.27.6</a>, <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>, <span class="Element">&lt;number:scientific-number&gt;</span> <a href="#element-number_scientific-number">16.27.5</a>, <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_3_number_number_"><span style="margin-right:0.127cm;">16.27.3</span></a><a id="__RefHeading__1416352_253892949"/><a id="element-number_number"/>&lt;number:number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:number&gt;</span> element specifies the display formatting properties for a decimal number.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:number&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a> and <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:number&gt;</span> element has the following attributes: <span class="Attribute">number:decimal-places</span> <a href="#attribute-number_decimal-places_element-number_number">19.343.2</a>, <span class="Attribute">number:decimal-replacement</span> <a href="#attribute-number_decimal-replacement">19.344</a>, <span class="Attribute">number:display-factor</span> <a href="#attribute-number_display-factor">19.346</a>, <span class="Attribute">number:grouping</span> <a href="#attribute-number_grouping">19.348</a> and <span class="Attribute">number:min-integer-digits</span> <a href="#attribute-number_min-integer-digits">19.352</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:number&gt;</span> element has the following child element: <span class="Element">&lt;number:embedded-text&gt;</span> <a href="#element-number_embedded-text">16.27.4</a>.</p><h3 class="Heading_20_3"><a id="a16_27_4_number_embedded-text_"><span style="margin-right:0.127cm;">16.27.4</span></a><a id="__RefHeading__1416354_253892949"/><a id="element-number_embedded-text"/>&lt;number:embedded-text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:embedded-text&gt;</span> element specifies text that is displayed at one specific position within a number.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:embedded-text&gt;</span> element is usable within the following element: <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:embedded-text&gt;</span> element has the following attribute: <span class="Attribute">number:position</span> <a href="#attribute-number_position">19.354</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;number:embedded-text&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:embedded-text&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a16_27_5_number_scientific-number_"><span style="margin-right:0.127cm;">16.27.5</span></a><a id="__RefHeading__1416356_253892949"/><a id="element-number_scientific-number"/>&lt;number:scientific-number&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:scientific-number&gt;</span> element specifies the display formatting properties for a number style that should be displayed in scientific format.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:scientific-number&gt;</span> element is usable within the following element: <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:scientific-number&gt;</span> element has the following attributes: <span class="Attribute">number:decimal-places</span> <a href="#attribute-number_decimal-places_element-number_scientific-number">19.343.4</a>, <span class="Attribute">number:grouping</span> <a href="#attribute-number_grouping">19.348</a>, <span class="Attribute">number:min-exponent-digits</span> <a href="#attribute-number_min-exponent-digits">19.351</a> and <span class="Attribute">number:min-integer-digits</span> <a href="#attribute-number_min-integer-digits">19.352</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:scientific-number&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_6_number_fraction_"><span style="margin-right:0.127cm;">16.27.6</span></a><a id="__RefHeading__1416358_253892949"/><a id="element-number_fraction"/>&lt;number:fraction&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:fraction&gt;</span> element specifies the display formatting properties for a number style that should be displayed as a fraction.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:fraction&gt;</span> element is usable within the following element: <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:fraction&gt;</span> element has the following attributes: <span class="Attribute">number:denominator-value</span> <a href="#attribute-number_denominator-value">19.345</a>, <span class="Attribute">number:grouping</span> <a href="#attribute-number_grouping">19.348</a>, <span class="Attribute">number:min-denominator-digits</span> <a href="#attribute-number_min-denominator-digits">19.350</a>, <span class="Attribute">number:min-integer-digits</span> <a href="#attribute-number_min-integer-digits">19.352</a> and <span class="Attribute">number:min-numerator-digits</span> <a href="#attribute-number_min-numerator-digits">19.353</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:fraction&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_7_number_currency-style_"><span style="margin-right:0.127cm;">16.27.7</span></a><a id="__RefHeading__1416360_253892949"/><a id="element-number_currency-style"/>&lt;number:currency-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:currency-style&gt;</span> element specifies the style for currency values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:currency-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:currency-style&gt;</span> element has the following attributes: <span class="Attribute">number:automatic-order</span> <a href="#attribute-number_automatic-order">19.340</a>, <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_currency-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:currency-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:currency-symbol&gt;</span> <a href="#element-number_currency-symbol">16.27.8</a>, <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>, <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_8_number_currency-symbol_"><span style="margin-right:0.127cm;">16.27.8</span></a><a id="__RefHeading__1416362_253892949"/><a id="element-number_currency-symbol"/>&lt;number:currency-symbol&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:currency-symbol&gt;</span> element specifies whether a currency symbol is displayed in a currency style.</p><p class="Text_20_body">The content of this element is the text that is displayed as the currency symbol. If the element is empty or contains white space characters only, the default currency symbol for the currency style or the language and country of the currency style is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:currency-symbol&gt;</span> element is usable within the following element: <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:currency-symbol&gt;</span> element has the following attributes: <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a> and <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;number:currency-symbol&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:currency-symbol&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a16_27_9_number_percentage-style_"><span style="margin-right:0.127cm;">16.27.9</span></a><a id="__RefHeading__1416364_253892949"/><a id="element-number_percentage-style"/>&lt;number:percentage-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:percentage-style&gt;</span> element specifies the style for percentage values.</p><p class="Text_20_body">A <span class="Element">&lt;number:percentage-style&gt;</span> element should have <span class="Element">&lt;number:text&gt;</span> child element whose character data contains a “%” (U+0025, PERCENT SIGN) character.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:percentage-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:percentage-style&gt;</span> element has the following attributes: <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_percentage-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:percentage-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>, <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_10_number_date-style_"><span style="margin-right:0.127cm;">16.27.10</span></a><a id="__RefHeading__1416366_253892949"/><a id="element-number_date-style"/>&lt;number:date-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:date-style&gt;</span> element specifies a style for date values.</p><p class="Text_20_body">This element can contain <span class="Emphasis">one</span> instance of each of the following elements: <span class="Element">&lt;number:day&gt;</span>, <span class="Element">&lt;number:month&gt;</span>, <span class="Element">&lt;number:year&gt;</span>, <span class="Element">&lt;number:era&gt;</span>, <span class="Element">&lt;number:day-of-week&gt;</span>, <span class="Element">&lt;number:week-of-year&gt;</span>, <span class="Element">&lt;number:quarter&gt;</span>, <span class="Element">&lt;number:hours&gt;</span>, <span class="Element">&lt;number:minutes&gt;</span>, <span class="Element">&lt;number:seconds&gt;</span>, and <span class="Element">&lt;number:am-pm&gt;</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:date-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:date-style&gt;</span> element has the following attributes: <span class="Attribute">number:automatic-order</span> <a href="#attribute-number_automatic-order">19.340</a>, <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:format-source</span> <a href="#attribute-number_format-source">19.347</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_date-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:date-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:am-pm&gt;</span> <a href="#element-number_am-pm">16.27.22</a>, <span class="Element">&lt;number:day&gt;</span> <a href="#element-number_day">16.27.11</a>, <span class="Element">&lt;number:day-of-week&gt;</span> <a href="#element-number_day-of-week">16.27.15</a>, <span class="Element">&lt;number:era&gt;</span> <a href="#element-number_era">16.27.14</a>, <span class="Element">&lt;number:hours&gt;</span> <a href="#element-number_hours">16.27.19</a>, <span class="Element">&lt;number:minutes&gt;</span> <a href="#element-number_minutes">16.27.20</a>, <span class="Element">&lt;number:month&gt;</span> <a href="#element-number_month">16.27.12</a>, <span class="Element">&lt;number:quarter&gt;</span> <a href="#element-number_quarter">16.27.17</a>, <span class="Element">&lt;number:seconds&gt;</span> <a href="#element-number_seconds">16.27.21</a>, <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;number:week-of-year&gt;</span> <a href="#element-number_week-of-year">16.27.16</a>, <span class="Element">&lt;number:year&gt;</span> <a href="#element-number_year">16.27.13</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_11_number_day_"><span style="margin-right:0.127cm;">16.27.11</span></a><a id="__RefHeading__1416368_253892949"/><a id="element-number_day"/>&lt;number:day&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:day&gt;</span> element specifies a day of a month in a date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:day&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:day&gt;</span> element has the following attributes: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a> and <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_day">19.358.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:day&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_12_number_month_"><span style="margin-right:0.127cm;">16.27.12</span></a><a id="__RefHeading__1416370_253892949"/><a id="element-number_month"/>&lt;number:month&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:month&gt;</span> element specifies a month in a date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:month&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:month&gt;</span> element has the following attributes: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a>, <span class="Attribute">number:possessive-form</span> <a href="#attribute-number_possessive-form">19.355</a>, <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_month">19.358.7</a> and <span class="Attribute">number:textual</span> <a href="#attribute-number_textual">19.359</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:month&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_13_number_year_"><span style="margin-right:0.127cm;">16.27.13</span></a><a id="__RefHeading__1416372_253892949"/><a id="element-number_year"/>&lt;number:year&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:year&gt;</span> element specifies a year in a date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:year&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:year&gt;</span> element has the following attributes: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a> and <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_year">19.358.10</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:year&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_14_number_era_"><span style="margin-right:0.127cm;">16.27.14</span></a><a id="__RefHeading__1416374_253892949"/><a id="element-number_era"/>&lt;number:era&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:era&gt;</span> element specifies an era in which a year is counted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:era&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:era&gt;</span> element has the following attributes: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a> and <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_era">19.358.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:era&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_15_number_day-of-week_"><span style="margin-right:0.127cm;">16.27.15</span></a><a id="__RefHeading__1416376_253892949"/><a id="element-number_day-of-week"/>&lt;number:day-of-week&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:day-of-week&gt;</span> element specifies a day of a week in a date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:day-of-week&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:day-of-week&gt;</span> element has the following attributes: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a> and <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_day-of-week">19.358.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:day-of-week&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_16_number_week-of-year_"><span style="margin-right:0.127cm;">16.27.16</span></a><a id="__RefHeading__1416378_253892949"/><a id="element-number_week-of-year"/>&lt;number:week-of-year&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:week-of-year&gt;</span> element specifies a week of a year in a date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:week-of-year&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:week-of-year&gt;</span> element has the following attribute: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:week-of-year&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_17_number_quarter_"><span style="margin-right:0.127cm;">16.27.17</span></a><a id="__RefHeading__1416380_253892949"/><a id="element-number_quarter"/>&lt;number:quarter&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:quarter&gt;</span> element specifies a quarter of the year in a date.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:quarter&gt;</span> element is usable within the following element: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:quarter&gt;</span> element has the following attributes: <span class="Attribute">number:calendar</span> <a href="#attribute-number_calendar">19.341</a> and <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_quarter">19.358.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:quarter&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_18_number_time-style_"><span style="margin-right:0.127cm;">16.27.18</span></a><a id="__RefHeading__1416382_253892949"/><a id="element-number_time-style"/>&lt;number:time-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:time-style&gt;</span> element specifies a style for time values.</p><p class="Text_20_body">This element can contain <span class="Emphasis">one</span> instance of any of the following elements: <span class="Element">&lt;number:hours&gt;</span>, <span class="Element">&lt;number:minutes&gt;</span>, <span class="Element">&lt;number:seconds&gt;</span> and <span class="Element">&lt;number:am-pm&gt;</span>.</p><p class="Text_20_body">The <span class="Element">&lt;number:time-style&gt;</span> element can also contain <span class="Element">&lt;number:text&gt;</span> elements, which display additional text. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:time-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:time-style&gt;</span> element has the following attributes: <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:format-source</span> <a href="#attribute-number_format-source">19.347</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">number:truncate-on-overflow</span> <a href="#attribute-number_truncate-on-overflow">19.365</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_time-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:time-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:am-pm&gt;</span> <a href="#element-number_am-pm">16.27.22</a>, <span class="Element">&lt;number:hours&gt;</span> <a href="#element-number_hours">16.27.19</a>, <span class="Element">&lt;number:minutes&gt;</span> <a href="#element-number_minutes">16.27.20</a>, <span class="Element">&lt;number:seconds&gt;</span> <a href="#element-number_seconds">16.27.21</a>, <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_19_number_hours_"><span style="margin-right:0.127cm;">16.27.19</span></a><a id="__RefHeading__1416384_253892949"/><a id="element-number_hours"/>&lt;number:hours&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:hours&gt;</span> element specifies whether hours are displayed as part of a date or time.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:hours&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:hours&gt;</span> element has the following attribute: <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_hours">19.358.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:hours&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_20_number_minutes_"><span style="margin-right:0.127cm;">16.27.20</span></a><a id="__RefHeading__1416386_253892949"/><a id="element-number_minutes"/>&lt;number:minutes&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:minutes&gt;</span> element specifies whether minutes are displayed as part of a date or time.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:minutes&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:minutes&gt;</span> element has the following attribute: <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_minutes">19.358.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:minutes&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_21_number_seconds_"><span style="margin-right:0.127cm;">16.27.21</span></a><a id="__RefHeading__1416388_253892949"/><a id="element-number_seconds"/>&lt;number:seconds&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:seconds&gt;</span> element specifies whether seconds are displayed as part of a date or time.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:seconds&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:seconds&gt;</span> element has the following attributes: <span class="Attribute">number:decimal-places</span> <a href="#attribute-number_decimal-places_element-number_seconds">19.343.3</a> and <span class="Attribute">number:style</span> <a href="#attribute-number_style_element-number_seconds">19.358.9</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:seconds&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_22_number_am-pm_"><span style="margin-right:0.127cm;">16.27.22</span></a><a id="__RefHeading__1416390_253892949"/><a id="element-number_am-pm"/>&lt;number:am-pm&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:am-pm&gt;</span> element specifies whether AM/PM is included as part of a date or time.</p><p class="Text_20_body">If a <span class="Element">&lt;number:am-pm&gt;</span> element is contained in a date or time style, hours are displayed using values from <span class="Attribute_20_Value_20_Instance">1</span> to <span class="Attribute_20_Value_20_Instance">12</span> only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:am-pm&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:am-pm&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:am-pm&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_23_number_boolean-style_"><span style="margin-right:0.127cm;">16.27.23</span></a><a id="__RefHeading__1416392_253892949"/><a id="element-number_boolean-style"/>&lt;number:boolean-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:boolean-style&gt;</span> element defines a style for Boolean values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:boolean-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:boolean-style&gt;</span> element has the following attributes: <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_boolean-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:boolean-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:boolean&gt;</span> <a href="#element-number_boolean">16.27.24</a>, <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_24_number_boolean_"><span style="margin-right:0.127cm;">16.27.24</span></a><a id="__RefHeading__1416394_253892949"/><a id="element-number_boolean"/>&lt;number:boolean&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:boolean&gt;</span> element marks the position of the Boolean value of a Boolean style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:boolean&gt;</span> element is usable within the following element: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:boolean&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:boolean&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_25_number_text-style_"><span style="margin-right:0.127cm;">16.27.25</span></a><a id="__RefHeading__1416396_253892949"/><a id="element-number_text-style"/>&lt;number:text-style&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:text-style&gt;</span> element defines a style for displaying text.</p><p class="Text_20_body">It can also contain <span class="Element">&lt;number:text&gt;</span> elements, which display additional text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:text-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:text-style&gt;</span> element has the following attributes: <span class="Attribute">number:country</span> <a href="#attribute-number_country">19.342</a>, <span class="Attribute">number:language</span> <a href="#attribute-number_language">19.349</a>, <span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a>, <span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a>, <span class="Attribute">number:title</span> <a href="#attribute-number_title">19.360</a>, <span class="Attribute">number:transliteration-country</span> <a href="#attribute-number_transliteration-country">19.361</a>, <span class="Attribute">number:transliteration-format</span> <a href="#attribute-number_transliteration-format">19.362</a>, <span class="Attribute">number:transliteration-language</span> <a href="#attribute-number_transliteration-language">19.363</a>, <span class="Attribute">number:transliteration-style</span> <a href="#attribute-number_transliteration-style">19.364</a>, <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-number_text-style">19.498.2</a> and <span class="Attribute">style:volatile</span> <a href="#attribute-style_volatile">19.517</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:text-style&gt;</span> element has the following child elements: <span class="Element">&lt;number:text&gt;</span> <a href="#element-number_text">16.27.26</a>, <span class="Element">&lt;number:text-content&gt;</span> <a href="#element-number_text-content">16.27.27</a>, <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h3 class="Heading_20_3"><a id="a16_27_26_number_text_"><span style="margin-right:0.127cm;">16.27.26</span></a><a id="__RefHeading__1416398_253892949"/><a id="element-number_text"/>&lt;number:text&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:text&gt;</span> element contains any fixed text for a data style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:text&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:text&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;number:text&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:text&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a16_27_27_number_text-content_"><span style="margin-right:0.127cm;">16.27.27</span></a><a id="__RefHeading__1416400_253892949"/><a id="element-number_text-content"/>&lt;number:text-content&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;number:text-content&gt;</span> element marks the position of variable text content of a text style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;number:text-content&gt;</span> element is usable within the following element: <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;number:text-content&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;number:text-content&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_27_28_style_text-properties_"><span style="margin-right:0.127cm;">16.27.28</span></a><a id="__RefHeading__1416402_253892949"/><a id="element-style_text-properties"/>&lt;style:text-properties&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;style:text-properties&gt;</span> element specifies formatting properties for text.</p><p class="Text_20_body">It also specifies the formatting properties for a section. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:text-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>, <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>, <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a>, <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>, <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>, <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a> and <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:text-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:color</span> <a href="#property-fo_color">20.180</a>, <span class="Attribute">fo:country</span> <a href="#property-fo_country">20.181</a>, <span class="Attribute">fo:font-family</span> <a href="#property-fo_font-family">20.182</a>, <span class="Attribute">fo:font-size</span> <a href="#property-fo_font-size">20.183</a>, <span class="Attribute">fo:font-style</span> <a href="#property-fo_font-style">20.184</a>, <span class="Attribute">fo:font-variant</span> <a href="#property-fo_font-variant">20.185</a>, <span class="Attribute">fo:font-weight</span> <a href="#property-fo_font-weight">20.186</a>, <span class="Attribute">fo:hyphenate</span> <a href="#property-fo_hyphenate">20.188</a>, <span class="Attribute">fo:hyphenation-push-char-count</span> <a href="#property-fo_hyphenation-push-char-count">20.191</a>, <span class="Attribute">fo:hyphenation-remain-char-count</span> <a href="#property-fo_hyphenation-remain-char-count">20.192</a>, <span class="Attribute">fo:language</span> <a href="#property-fo_language">20.195</a>, <span class="Attribute">fo:letter-spacing</span> <a href="#property-fo_letter-spacing">20.196</a>, <span class="Attribute">fo:script</span> <a href="#property-fo_script">20.215</a>, <span class="Attribute">fo:text-shadow</span> <a href="#property-fo_text-shadow">20.219</a>, <span class="Attribute">fo:text-transform</span> <a href="#property-fo_text-transform">20.220</a>, <span class="Attribute">style:country-asian</span> <a href="#property-style_country-asian">20.248</a>, <span class="Attribute">style:country-complex</span> <a href="#property-style_country-complex">20.249</a>, <span class="Attribute">style:font-charset</span> <a href="#property-style_font-charset">20.260</a>, <span class="Attribute">style:font-charset-asian</span> <a href="#property-style_font-charset-asian">20.261</a>, <span class="Attribute">style:font-charset-complex</span> <a href="#property-style_font-charset-complex">20.262</a>, <span class="Attribute">style:font-family-asian</span> <a href="#property-style_font-family-asian">20.263</a>, <span class="Attribute">style:font-family-complex</span> <a href="#property-style_font-family-complex">20.264</a>, <span class="Attribute">style:font-family-generic</span> <a href="#property-style_font-family-generic">20.265</a>, <span class="Attribute">style:font-family-generic-asian</span> <a href="#property-style_font-family-generic-asian">20.266</a>, <span class="Attribute">style:font-family-generic-complex</span> <a href="#property-style_font-family-generic-complex">20.267</a>, <span class="Attribute">style:font-name</span> <a href="#property-style_font-name">20.269</a>, <span class="Attribute">style:font-name-asian</span> <a href="#property-style_font-name-asian">20.270</a>, <span class="Attribute">style:font-name-complex</span> <a href="#property-style_font-name-complex">20.271</a>, <span class="Attribute">style:font-pitch</span> <a href="#property-style_font-pitch">20.272</a>, <span class="Attribute">style:font-pitch-asian</span> <a href="#property-style_font-pitch-asian">20.273</a>, <span class="Attribute">style:font-pitch-complex</span> <a href="#property-style_font-pitch-complex">20.274</a>, <span class="Attribute">style:font-relief</span> <a href="#property-style_font-relief">20.275</a>, <span class="Attribute">style:font-size-asian</span> <a href="#property-style_font-size-asian">20.276</a>, <span class="Attribute">style:font-size-complex</span> <a href="#property-style_font-size-complex">20.277</a>, <span class="Attribute">style:font-size-rel</span> <a href="#property-style_font-size-rel">20.278</a>, <span class="Attribute">style:font-size-rel-asian</span> <a href="#property-style_font-size-rel-asian">20.279</a>, <span class="Attribute">style:font-size-rel-complex</span> <a href="#property-style_font-size-rel-complex">20.280</a>, <span class="Attribute">style:font-style-asian</span> <a href="#property-style_font-style-asian">20.281</a>, <span class="Attribute">style:font-style-complex</span> <a href="#property-style_font-style-complex">20.282</a>, <span class="Attribute">style:font-style-name</span> <a href="#property-style_font-style-name">20.283</a>, <span class="Attribute">style:font-style-name-asian</span> <a href="#property-style_font-style-name-asian">20.284</a>, <span class="Attribute">style:font-style-name-complex</span> <a href="#property-style_font-style-name-complex">20.285</a>, <span class="Attribute">style:font-weight-asian</span> <a href="#property-style_font-weight-asian">20.286</a>, <span class="Attribute">style:font-weight-complex</span> <a href="#property-style_font-weight-complex">20.287</a>, <span class="Attribute">style:language-asian</span> <a href="#property-style_language-asian">20.294</a>, <span class="Attribute">style:language-complex</span> <a href="#property-style_language-complex">20.295</a>, <span class="Attribute">style:letter-kerning</span> <a href="#property-style_letter-kerning">20.308</a>, <span class="Attribute">style:rfc-language-tag</span> <a href="#property-style_rfc-language-tag">20.335</a>, <span class="Attribute">style:rfc-language-tag-asian</span> <a href="#property-style_rfc-language-tag-asian">20.336</a>, <span class="Attribute">style:rfc-language-tag-complex</span> <a href="#property-style_rfc-language-tag-complex">20.337</a>, <span class="Attribute">style:script-asian</span> <a href="#property-style_script-asian">20.346</a>, <span class="Attribute">style:script-complex</span> <a href="#property-style_script-complex">20.347</a>, <span class="Attribute">style:script-type</span> <a href="#property-style_script-type">20.348</a>, <span class="Attribute">style:text-blinking</span> <a href="#property-style_text-blinking">20.356</a>, <span class="Attribute">style:text-combine</span> <a href="#property-style_text-combine">20.357</a>, <span class="Attribute">style:text-combine-end-char</span> <a href="#property-style_text-combine-end-char">20.359</a>, <span class="Attribute">style:text-combine-start-char</span> <a href="#property-style_text-combine-start-char">20.358</a>, <span class="Attribute">style:text-emphasize</span> <a href="#property-style_text-emphasize">20.360</a>, <span class="Attribute">style:text-line-through-color</span> <a href="#property-style_text-line-through-color">20.361</a>, <span class="Attribute">style:text-line-through-mode</span> <a href="#property-style_text-line-through-mode">20.362</a>, <span class="Attribute">style:text-line-through-style</span> <a href="#property-style_text-line-through-style">20.363</a>, <span class="Attribute">style:text-line-through-text</span> <a href="#property-style_text-line-through-text">20.364</a>, <span class="Attribute">style:text-line-through-text-style</span> <a href="#property-style_text-line-through-text-style">20.365</a>, <span class="Attribute">style:text-line-through-type</span> <a href="#property-style_text-line-through-type">20.366</a>, <span class="Attribute">style:text-line-through-width</span> <a href="#property-style_text-line-through-width">20.367</a>, <span class="Attribute">style:text-outline</span> <a href="#property-style_text-outline">20.368</a>, <span class="Attribute">style:text-overline-color</span> <a href="#property-style_text-overline-color">20.369</a>, <span class="Attribute">style:text-overline-mode</span> <a href="#property-style_text-overline-mode">20.370</a>, <span class="Attribute">style:text-overline-style</span> <a href="#property-style_text-overline-style">20.371</a>, <span class="Attribute">style:text-overline-type</span> <a href="#property-style_text-overline-type">20.372</a>, <span class="Attribute">style:text-overline-width</span> <a href="#property-style_text-overline-width">20.373</a>, <span class="Attribute">style:text-position</span> <a href="#property-style_text-position">20.374</a>, <span class="Attribute">style:text-rotation-angle</span> <a href="#property-style_text-rotation-angle">20.375</a>, <span class="Attribute">style:text-rotation-scale</span> <a href="#property-style_text-rotation-scale">20.376</a>, <span class="Attribute">style:text-scale</span> <a href="#property-style_text-scale">20.377</a>, <span class="Attribute">style:text-underline-color</span> <a href="#property-style_text-underline-color">20.378</a>, <span class="Attribute">style:text-underline-mode</span> <a href="#property-style_text-underline-mode">20.379</a>, <span class="Attribute">style:text-underline-style</span> <a href="#property-style_text-underline-style">20.380</a>, <span class="Attribute">style:text-underline-type</span> <a href="#property-style_text-underline-type">20.381</a>, <span class="Attribute">style:text-underline-width</span> <a href="#property-style_text-underline-width">20.382</a>, <span class="Attribute">style:use-window-font-color</span> <a href="#property-style_use-window-font-color">20.385</a>, <span class="Attribute">text:condition</span> <a href="#property-text_condition">20.416</a>, <span class="Attribute">text:display</span> <a href="#property-text_display">20.417</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:text-properties&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_28Text_Style_Families"><span style="margin-right:0.127cm;">16.28</span></a><a id="__RefHeading__1416404_253892949"/>Text Style Families</h2><h3 class="Heading_20_3"><a id="a16_28_1Text_Styles"><span style="margin-right:0.127cm;">16.28.1</span></a><a id="__RefHeading__1416406_253892949"/>Text Styles</h3><p class="Text_20_body">Text styles are represented by <span class="Element">&lt;style:style&gt;</span> elements whose <span class="Attribute">style:family</span> attribute has the value <span class="Attribute_20_Value">text</span>. </p><h3 class="Heading_20_3"><a id="a16_28_2Paragraph_Styles"><span style="margin-right:0.127cm;">16.28.2</span></a><a id="__RefHeading__1416408_253892949"/>Paragraph Styles</h3><p class="Text_20_body">Paragraph styles are represented by <span class="Element">&lt;style:style&gt;</span> elements whose <span class="Attribute">style:family</span> attribute has the value <span class="Attribute_20_Value">paragraph</span>. </p><p class="Text_20_body">In addition to paragraph properties, paragraph styles may define text properties. These are applied to the character content of the paragraph unless they are overwritten by a text style that is specified by any of the descendant elements of the paragraph element.</p><h3 class="Heading_20_3"><a id="a16_28_3Section_Styles"><span style="margin-right:0.127cm;">16.28.3</span></a><a id="__RefHeading__1416410_253892949"/>Section Styles</h3><p class="Text_20_body">Section styles are represented by <span class="Element">&lt;style:style&gt;</span> elements whose <span class="Attribute">style:family</span> attribute has the value <span class="Attribute_20_Value">section</span>. </p><h3 class="Heading_20_3"><a id="a16_28_4Ruby_Styles"><span style="margin-right:0.127cm;">16.28.4</span></a><a id="__RefHeading__1416412_253892949"/>Ruby Styles</h3><p class="Text_20_body">Ruby styles are represented by <span class="Element">&lt;style:style&gt;</span> elements whose <span class="Attribute">style:family</span> attribute has the value <span class="Attribute_20_Value">ruby</span>. </p><h2 class="Heading_20_2"><a id="a16_29Enhanced_Text_Styles"><span style="margin-right:0.127cm;">16.29</span></a><a id="__RefHeading__1416414_253892949"/>Enhanced Text Styles</h2><h3 class="Heading_20_3"><a id="a16_29_1_text_linenumbering-configuration_"><span style="margin-right:0.127cm;">16.29.1</span></a><a id="__RefHeading__1416416_253892949"/><a id="element-text_linenumbering-configuration"/>&lt;text:linenumbering-configuration&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:linenumbering-configuration&gt;</span> element specifies line numbering within the <span class="Element">&lt;office:styles&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:linenumbering-configuration&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:linenumbering-configuration&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">text:count-empty-lines</span> <a href="#attribute-text_count-empty-lines">19.783</a>, <span class="Attribute">text:count-in-text-boxes</span> <a href="#attribute-text_count-in-text-boxes">19.784</a>, <span class="Attribute">text:increment</span> <a href="#attribute-text_increment">19.808</a>, <span class="Attribute">text:number-lines</span> <a href="#attribute-text_number-lines">19.839</a>, <span class="Attribute">text:number-position</span> <a href="#attribute-text_number-position">19.840</a>, <span class="Attribute">text:offset</span> <a href="#attribute-text_offset">19.842</a>, <span class="Attribute">text:restart-on-page</span> <a href="#attribute-text_restart-on-page">19.858</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_linenumbering-configuration">19.874.21</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:linenumbering-configuration&gt;</span> element has the following child element: <span class="Element">&lt;text:linenumbering-separator&gt;</span> <a href="#element-text_linenumbering-separator">16.29.2</a>.</p><h3 class="Heading_20_3"><a id="a16_29_2_text_linenumbering-separator_"><span style="margin-right:0.127cm;">16.29.2</span></a><a id="__RefHeading__1416418_253892949"/><a id="element-text_linenumbering-separator"/>&lt;text:linenumbering-separator&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:linenumbering-separator&gt;</span> element contains the text that is displayed as a separator. A separator is text that is displayed instead of a line number for lines where no number is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:linenumbering-separator&gt;</span> element is usable within the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:linenumbering-separator&gt;</span> element has the following attribute: <span class="Attribute">text:increment</span> <a href="#attribute-text_increment">19.808</a>.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:linenumbering-separator&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:linenumbering-separator&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a16_29_3_text_notes-configuration_"><span style="margin-right:0.127cm;">16.29.3</span></a><a id="__RefHeading__1416420_253892949"/><a id="element-text_notes-configuration"/>&lt;text:notes-configuration&gt;</h3><p class="Text_20_body">A <span class="Element">&lt;text:notes-configuration&gt;</span> element specifies values for each note class used in a document. If there is no note configuration element, an implementation-defined default note configuration is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:notes-configuration&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a> and <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:notes-configuration&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a>, <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, <span class="Attribute">text:citation-body-style-name</span> <a href="#attribute-text_citation-body-style-name">19.768</a>, <span class="Attribute">text:citation-style-name</span> <a href="#attribute-text_citation-style-name">19.769</a>, <span class="Attribute">text:default-style-name</span> <a href="#attribute-text_default-style-name">19.794</a>, <span class="Attribute">text:footnotes-position</span> <a href="#attribute-text_footnotes-position">19.804</a>, <span class="Attribute">text:master-page-name</span> <a href="#attribute-text_master-page-name">19.833</a>, <span class="Attribute">text:note-class</span> <a href="#attribute-text_note-class">19.837</a>, <span class="Attribute">text:start-numbering-at</span> <a href="#attribute-text_start-numbering-at">19.869</a> and <span class="Attribute">text:start-value</span> <a href="#attribute-text_start-value_element-text_notes-configuration">19.868.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:notes-configuration&gt;</span> element has the following child elements: <span class="Element">&lt;text:note-continuation-notice-backward&gt;</span> <a href="#element-text_note-continuation-notice-backward">16.29.5</a> and <span class="Element">&lt;text:note-continuation-notice-forward&gt;</span> <a href="#element-text_note-continuation-notice-forward">16.29.4</a>.</p><h3 class="Heading_20_3"><a id="a16_29_4_text_note-continuation-notice-forward_"><span style="margin-right:0.127cm;">16.29.4</span></a><a id="__RefHeading__1416422_253892949"/><a id="element-text_note-continuation-notice-forward"/>&lt;text:note-continuation-notice-forward&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:note-continuation-notice-forward&gt;</span> elements specifies the text that is displayed at the end of a footnote that is continued on the next page</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:note-continuation-notice-forward&gt;</span> element is usable within the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:note-continuation-notice-forward&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:note-continuation-notice-forward&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:note-continuation-notice-forward&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a16_29_5_text_note-continuation-notice-backward_"><span style="margin-right:0.127cm;">16.29.5</span></a><a id="__RefHeading__1416424_253892949"/><a id="element-text_note-continuation-notice-backward"/>&lt;text:note-continuation-notice-backward&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:note-continuation-notice-backward&gt;</span> elements specifies the text that is displayed before continued text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:note-continuation-notice-backward&gt;</span> element is usable within the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:note-continuation-notice-backward&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List">The <span class="Element">&lt;text:note-continuation-notice-backward&gt;</span> element has no child elements.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:note-continuation-notice-backward&gt;</span> element has character data content.</p><h3 class="Heading_20_3"><a id="a16_29_6_text_bibliography-configuration_"><span style="margin-right:0.127cm;">16.29.6</span></a><a id="__RefHeading__1416426_253892949"/><a id="element-text_bibliography-configuration"/>&lt;text:bibliography-configuration&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:bibliography-configuration&gt;</span> element specifies how bibliography entries are displayed in-line, and how they are displayed in a bibliography index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:bibliography-configuration&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:bibliography-configuration&gt;</span> element has the following attributes: <span class="Attribute">fo:country</span> <a href="#attribute-fo_country_element-text_bibliography-configuration">19.234.2</a>, <span class="Attribute">fo:language</span> <a href="#attribute-fo_language_element-text_bibliography-configuration">19.236.3</a>, <span class="Attribute">fo:script</span> <a href="#attribute-fo_script_element-text_bibliography-configuration">19.242.3</a>, <span class="Attribute">style:rfc-language-tag</span> <a href="#attribute-style_rfc-language-tag">19.512</a>, <span class="Attribute">text:numbered-entries</span> <a href="#attribute-text_numbered-entries">19.841</a>, <span class="Attribute">text:prefix</span> <a href="#attribute-text_prefix">19.848</a>, <span class="Attribute">text:sort-algorithm</span> <a href="#attribute-text_sort-algorithm">19.865</a>, <span class="Attribute">text:sort-by-position</span> <a href="#attribute-text_sort-by-position">19.867</a> and <span class="Attribute">text:suffix</span> <a href="#attribute-text_suffix">19.876</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:bibliography-configuration&gt;</span> element has the following child element: <span class="Element">&lt;text:sort-key&gt;</span> <a href="#element-text_sort-key">16.29.7</a>.</p><h3 class="Heading_20_3"><a id="a16_29_7_text_sort-key_"><span style="margin-right:0.127cm;">16.29.7</span></a><a id="__RefHeading__1416428_253892949"/><a id="element-text_sort-key"/>&lt;text:sort-key&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;text:sort-key&gt;</span> element specifies a single sort key if bibliography entries are not displayed in document order.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:sort-key&gt;</span> element is usable within the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:sort-key&gt;</span> element has the following attributes: <span class="Attribute">text:key</span> <a href="#attribute-text_key">19.820</a> and <span class="Attribute">text:sort-ascending</span> <a href="#attribute-text_sort-ascending">19.866</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:sort-key&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_30_text_list-style_"><span style="margin-right:0.127cm;">16.30</span></a><a id="__RefHeading__1416430_253892949"/><a id="element-text_list-style"/>&lt;text:list-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:list-style&gt;</span> element contains a set of style elements for each list level, which are called <span class="Def">list level styles</span>. There are three different list level style elements, depending on whether a list level is to have a list label containing the list numbering, a bullet, or an image.</p><p class="Text_20_body">If a list style is applied to a list but does not contain a list level specification for a specific level, the list level style of the next lower level is used. If no specific list level style has been defined, an implementation-dependent default style is used.</p><p class="Text_20_body"><span class="Element">&lt;text:list-style&gt;</span> elements may occur in the <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a> and <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a> elements, but they may also occur within the <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.elements of graphic styles.</p><p class="Text_20_body">Including a list style element into a graphic style has the same semantics as adding a <span class="Attribute">style:list-style-name</span> attribute ( <a href="#attribute-style_list-style-name">19.496</a>) to the style that references a list style that is declared outside a graphic style. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The inclusion of a list style element is needed in cases where a common graphic style should be associated with an automatic list style.</p><p class="Text_20_body">List styles contained in a graphic style can be referenced by other graphic styles using the <span class="Attribute">style:list-style-name</span> attribute. Their names are not displayed in the user interface, even if the graphic style that contains it is a common style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list-style&gt;</span> element is usable within the following elements: <span class="Element">&lt;office:automatic-styles&gt;</span> <a href="#element-office_automatic-styles">3.15.3</a>, <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list-style&gt;</span> element has the following attributes: <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a>, <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-text_list-style">19.498.2</a> and <span class="Attribute">text:consecutive-numbering</span> <a href="#attribute-text_consecutive-numbering">19.779</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list-style&gt;</span> element has the following child elements: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a> and <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>.</p><h2 class="Heading_20_2"><a id="a16_31_text_list-level-style-bullet_"><span style="margin-right:0.127cm;">16.31</span></a><a id="__RefHeading__1416432_253892949"/><a id="element-text_list-level-style-bullet"/>&lt;text:list-level-style-bullet&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;text:list-level-style-bullet&gt;</span> element specifies a list style where list items are preceded by bullets.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list-level-style-bullet&gt;</span> element is usable within the following element: <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list-level-style-bullet&gt;</span> element has the following attributes: <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a>, <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, <span class="Attribute">text:bullet-char</span> <a href="#attribute-text_bullet-char">19.760</a>, <span class="Attribute">text:bullet-relative-size</span> <a href="#attribute-text_bullet-relative-size">19.761</a>, <span class="Attribute">text:level</span> <a href="#attribute-text_level">19.828</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_list-level-style-bullet">19.874.24</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list-level-style-bullet&gt;</span> element has the following child elements: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h2 class="Heading_20_2"><a id="a16_32_text_list-level-style-number_"><span style="margin-right:0.127cm;">16.32</span></a><a id="__RefHeading__1416434_253892949"/><a id="element-text_list-level-style-number"/>&lt;text:list-level-style-number&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;text:list-level-style-number&gt;</span> specifies a list style where list items are preceded by numbers.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list-level-style-number&gt;</span> element is usable within the following element: <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list-level-style-number&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a>, <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, <span class="Attribute">text:display-levels</span> <a href="#attribute-text_display-levels">19.797</a>, <span class="Attribute">text:level</span> <a href="#attribute-text_level">19.828</a>, <span class="Attribute">text:start-value</span> <a href="#attribute-text_start-value_element-text_list-level-style-number">19.868.4</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_list-level-style-number">19.874.23</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list-level-style-number&gt;</span> element has the following child elements: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h2 class="Heading_20_2"><a id="a16_33_text_list-level-style-image_"><span style="margin-right:0.127cm;">16.33</span></a><a id="__RefHeading__1416436_253892949"/><a id="element-text_list-level-style-image"/>&lt;text:list-level-style-image&gt;</h2><p class="Text_20_body">A <span class="Element">&lt;text:list-level-style-image&gt;</span> specifies a list style where list items are preceded by images. This element can be an <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a> and can only be contained in list style elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:list-level-style-image&gt;</span> element is usable within the following element: <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:list-level-style-image&gt;</span> element has the following attributes: <span class="Attribute">text:level</span> <a href="#attribute-text_level">19.828</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-text_list-level-style-image">19.910.35</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:list-level-style-image&gt;</span> element has the following child elements: <span class="Element">&lt;office:binary-data&gt;</span> <a href="#element-office_binary-data">10.4.5</a> and <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><h2 class="Heading_20_2"><a id="a16_34_text_outline-style_"><span style="margin-right:0.127cm;">16.34</span></a><a id="__RefHeading__1416438_253892949"/><a id="element-text_outline-style"/>&lt;text:outline-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:outline-style&gt;</span> element contains the elements that specify a style for each outline level.</p><p class="Text_20_body">An outline style is a list style that is applied to all headings within a text document where the heading's paragraph style does not define a list style to use itself.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:outline-style&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:outline-style&gt;</span> element has the following attribute: <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-text_outline-style">19.498.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:outline-style&gt;</span> element has the following child element: <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><h2 class="Heading_20_2"><a id="a16_35_text_outline-level-style_"><span style="margin-right:0.127cm;">16.35</span></a><a id="__RefHeading__1416440_253892949"/><a id="element-text_outline-level-style"/>&lt;text:outline-level-style&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;text:outline-level-style&gt;</span> element specifies a style for each outline level.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;text:outline-level-style&gt;</span> element is usable within the following element: <span class="Element">&lt;text:outline-style&gt;</span> <a href="#element-text_outline-style">16.34</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;text:outline-level-style&gt;</span> element has the following attributes: <span class="Attribute">style:num-format</span> <a href="#attribute-style_num-format">19.500</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#attribute-style_num-letter-sync">19.501</a>, <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a>, <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, <span class="Attribute">text:display-levels</span> <a href="#attribute-text_display-levels">19.797</a>, <span class="Attribute">text:level</span> <a href="#attribute-text_level">19.828</a>, <span class="Attribute">text:start-value</span> <a href="#attribute-text_start-value_element-text_outline-level-style">19.868.7</a> and <span class="Attribute">text:style-name</span> <a href="#attribute-text_style-name_element-text_outline-level-style">19.874.28</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;text:outline-level-style&gt;</span> element has the following child elements: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><h2 class="Heading_20_2"><a id="a16_36Table_Styles"><span style="margin-right:0.127cm;">16.36</span></a><a id="__RefHeading__1416442_253892949"/>Table Styles</h2><h3 class="Heading_20_3"><a id="a16_36_1Table_Styles"><span style="margin-right:0.127cm;">16.36.1</span></a><a id="__RefHeading__1416444_253892949"/><a id="Table_Styles"/>Table Styles</h3><p class="Text_20_body">Table styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">table</span>. </p><h3 class="Heading_20_3"><a id="a16_36_2Table_Column_Styles"><span style="margin-right:0.127cm;">16.36.2</span></a><a id="__RefHeading__1416446_253892949"/><a id="Table_Column_Styles"/>Table Column Styles</h3><p class="Text_20_body">Table column styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">table-column</span>. </p><h3 class="Heading_20_3"><a id="a16_36_3Table_Row_Styles"><span style="margin-right:0.127cm;">16.36.3</span></a><a id="__RefHeading__1416448_253892949"/><a id="Table_Row_Styles"/>Table Row Styles</h3><p class="Text_20_body">Table row styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">table-row</span>. </p><h3 class="Heading_20_3"><a id="a16_36_4Table_Cell_Styles"><span style="margin-right:0.127cm;">16.36.4</span></a><a id="__RefHeading__1416450_253892949"/><a id="Table_Cell_Styles"/>Table Cell Styles</h3><p class="Text_20_body">Table cell styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">table-cell</span>.</p><p class="Text_20_body">In addition to table cell properties, table cell styles may define paragraph and text properties. These are applied to paragraphs contained in a table cell unless they are overwritten by paragraph styles that are specified by the paragraph elements themselves. </p><h2 class="Heading_20_2"><a id="a16_37Graphic_Styles"><span style="margin-right:0.127cm;">16.37</span></a><a id="__RefHeading__1416452_253892949"/>Graphic Styles</h2><p class="Text_20_body">Graphic styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">graphic</span>.</p><p class="Text_20_body">In addition to graphic properties, graphic styles may define paragraph and text properties. These are applied to paragraphs contained in drawing objects unless they are overwritten by paragraph styles that are specified by the paragraph elements themselves. </p><h2 class="Heading_20_2"><a id="a16_38Presentation_Styles"><span style="margin-right:0.127cm;">16.38</span></a><a id="__RefHeading__1416454_253892949"/>Presentation Styles</h2><p class="Text_20_body">Presentation styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">presentation</span>.</p><p class="Text_20_body">In addition to graphic properties, presentation styles may define paragraph and text properties. These are applied to paragraphs contained in drawing objects unless they are overwritten by paragraph styles that are specified by the paragraph elements themselves. </p><h2 class="Heading_20_2"><a id="a16_39Drawing_Page_Style"><span style="margin-right:0.127cm;">16.39</span></a><a id="__RefHeading__1416456_253892949"/><a id="Drawing_Page_Style"/>Drawing Page Style</h2><p class="Text_20_body">A drawing page style is a <span class="Element">&lt;style:style&gt;</span> element with family <span class="Attribute_20_Value">drawing-page</span>. </p><p class="Text_20_body">Within drawing and presentation documents, drawing page styles can be used to change the background of a draw page. If a background is set with the help of a drawing page style, it overrides the background of the master page that is assigned to the draw page, but not the shapes that are on the master page.</p><p class="Text_20_body">Within presentation documents, the draw page style may contain presentation formatting properties.</p><h2 class="Heading_20_2"><a id="a16_40Enhanced_Graphic_Style_Elements"><span style="margin-right:0.127cm;">16.40</span></a><a id="__RefHeading__1416458_253892949"/>Enhanced Graphic Style Elements</h2><h3 class="Heading_20_3"><a id="a16_40_1_draw_gradient_"><span style="margin-right:0.127cm;">16.40.1</span></a><a id="__RefHeading__1416460_253892949"/><a id="element-draw_gradient"/>&lt;draw:gradient&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:gradient&gt;</span> element defines a gradient for filling a drawing object. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:gradient&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:gradient&gt;</span> element has the following attributes: <span class="Attribute">draw:angle</span> <a href="#attribute-draw_angle">19.112</a>, <span class="Attribute">draw:border</span> <a href="#attribute-draw_border">19.114</a>, <span class="Attribute">draw:cx</span> <a href="#attribute-draw_cx">19.129</a>, <span class="Attribute">draw:cy</span> <a href="#attribute-draw_cy">19.130</a>, <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-draw_gradient">19.133.3</a>, <span class="Attribute">draw:end-color</span> <a href="#attribute-draw_end-color">19.141</a>, <span class="Attribute">draw:end-intensity</span> <a href="#attribute-draw_end-intensity">19.143</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_gradient">19.197.12</a>, <span class="Attribute">draw:start-color</span> <a href="#attribute-draw_start-color">19.214</a>, <span class="Attribute">draw:start-intensity</span> <a href="#attribute-draw_start-intensity">19.216</a> and <span class="Attribute">draw:style</span> <a href="#attribute-draw_style_element-draw_gradient">19.218.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:gradient&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_40_2_svg_linearGradient_"><span style="margin-right:0.127cm;">16.40.2</span></a><a id="__RefHeading__1416462_253892949"/><a id="element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;svg:linearGradient&gt;</span> element as specified in §13.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> can used in documents in OpenDocument format subject to the following rules:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The gradient shall have a name. It is specified by the <span class="Attribute">draw:name</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Only the <span class="Attribute">svg:gradientTransform</span>, <span class="Attribute">svg:x1</span>, <span class="Attribute">svg:y1</span>, <span class="Attribute">svg:x2</span>, <span class="Attribute">svg:y2</span> and <span class="Attribute">svg:spreadMethod</span> attributes are evaluated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The gradient shall be calculated as having a <span class="Attribute">svg:gradientUnits</span> attribute of <span class="Attribute_20_Value">objectBoundingBox</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The only child element that is evaluated is <span class="Element">&lt;svg:stop&gt;</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>For <span class="Element">&lt;svg:stop&gt;</span>, only the <span class="Attribute">svg:offset</span>, <span class="Attribute">svg:stop-color</span> and <span class="Attribute">svg:stop-opacity</span> attributes are evaluated.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:linearGradient&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:linearGradient&gt;</span> element has the following attributes: <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-svg_linearGradient">19.133.8</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-svg_linearGradient">19.197.29</a>, <span class="Attribute">svg:gradientTransform</span> <a href="#attribute-svg_gradientTransform">19.536</a>, <span class="Attribute">svg:gradientUnits</span> <a href="#attribute-svg_gradientUnits">19.537</a>, <span class="Attribute">svg:spreadMethod</span> <a href="#attribute-svg_spreadMethod">19.553</a>, <span class="Attribute">svg:x1</span> <a href="#attribute-svg_x1_element-svg_linearGradient">19.574.2</a>, <span class="Attribute">svg:x2</span> <a href="#attribute-svg_x2_element-svg_linearGradient">19.575.2</a>, <span class="Attribute">svg:y1</span> <a href="#attribute-svg_y1_element-svg_linearGradient">19.578.2</a> and <span class="Attribute">svg:y2</span> <a href="#attribute-svg_y2_element-svg_linearGradient">19.579.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:linearGradient&gt;</span> element has the following child element: <span class="Element">&lt;svg:stop&gt;</span> <a href="#element-svg_stop">16.40.4</a>.</p><h3 class="Heading_20_3"><a id="a16_40_3_svg_radialGradient_"><span style="margin-right:0.127cm;">16.40.3</span></a><a id="__RefHeading__1416464_253892949"/><a id="element-svg_radialGradient"/>&lt;svg:radialGradient&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;svg:radialGradient&gt;</span> element as specified in §13.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> can used in documents in OpenDocument format subject to the following rules:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The gradient shall have a name. It is specified by the <span class="Attribute">draw:name</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>For <span class="Element">&lt;svg:radialGradient&gt;</span>, only the <span class="Attribute">svg:gradientTransform</span>, <span class="Attribute">svg:cx</span>, <span class="Attribute">svg:cy</span>, <span class="Attribute">svg:r</span>, <span class="Attribute">svg:fx</span>, <span class="Attribute">svg:fy</span> and <span class="Attribute">svg:spreadMethod</span> attributes are evaluated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The gradient shall be calculated as having a <span class="Attribute">svg:gradientUnits</span> attribute of <span class="Attribute_20_Value">objectBoundingBox</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The only child element that is evaluated is <span class="Element">&lt;svg:stop&gt;</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>For <span class="Element">&lt;svg:stop&gt;</span>, only the <span class="Attribute">svg:offset</span>, <span class="Attribute">svg:stop-color</span> and <span class="Attribute">svg:stop-opacity</span> attributes are evaluated.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:radialGradient&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:radialGradient&gt;</span> element has the following attributes: <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-svg_radialGradient">19.133.9</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-svg_radialGradient">19.197.30</a>, <span class="Attribute">svg:cx</span> <a href="#attribute-svg_cx_element-svg_radialGradient">19.524.4</a>, <span class="Attribute">svg:cy</span> <a href="#attribute-svg_cy_element-svg_radialGradient">19.525.4</a>, <span class="Attribute">svg:fx</span> <a href="#attribute-svg_fx">19.534</a>, <span class="Attribute">svg:fy</span> <a href="#attribute-svg_fy">19.535</a>, <span class="Attribute">svg:gradientTransform</span> <a href="#attribute-svg_gradientTransform">19.536</a>, <span class="Attribute">svg:gradientUnits</span> <a href="#attribute-svg_gradientUnits">19.537</a>, <span class="Attribute">svg:r</span> <a href="#attribute-svg_r_element-svg_radialGradient">19.549.3</a> and <span class="Attribute">svg:spreadMethod</span> <a href="#attribute-svg_spreadMethod">19.553</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:radialGradient&gt;</span> element has the following child element: <span class="Element">&lt;svg:stop&gt;</span> <a href="#element-svg_stop">16.40.4</a>.</p><h3 class="Heading_20_3"><a id="a16_40_4_svg_stop_"><span style="margin-right:0.127cm;">16.40.4</span></a><a id="__RefHeading__1416466_253892949"/><a id="element-svg_stop"/>&lt;svg:stop&gt;</h3><p class="Text_20_body">See §13.2.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;svg:stop&gt;</span> element is usable within the following elements: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> and <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;svg:stop&gt;</span> element has the following attributes: <span class="Attribute">svg:offset</span> <a href="#attribute-svg_offset">19.543</a>, <span class="Attribute">svg:stop-color</span> <a href="#attribute-svg_stop-color">19.556</a> and <span class="Attribute">svg:stop-opacity</span> <a href="#attribute-svg_stop-opacity">19.557</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;svg:stop&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_40_5_draw_hatch_"><span style="margin-right:0.127cm;">16.40.5</span></a><a id="__RefHeading__1416468_253892949"/><a id="element-draw_hatch"/>&lt;draw:hatch&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:hatch&gt;</span> element defines a hatch for filling graphic objects. A hatch is a simple pattern of straight lines that is repeated in the fill area. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:hatch&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:hatch&gt;</span> element has the following attributes: <span class="Attribute">draw:color</span> <a href="#attribute-draw_color_element-draw_hatch">19.122.2</a>, <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-draw_hatch">19.133.4</a>, <span class="Attribute">draw:distance</span> <a href="#attribute-draw_distance_element-draw_hatch">19.134.2</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_hatch">19.197.13</a>, <span class="Attribute">draw:rotation</span> <a href="#attribute-draw_rotation">19.209</a> and <span class="Attribute">draw:style</span> <a href="#attribute-draw_style_element-draw_hatch">19.218.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:hatch&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_40_6_draw_fill-image_"><span style="margin-right:0.127cm;">16.40.6</span></a><a id="__RefHeading__1416470_253892949"/><a id="element-draw_fill-image"/>&lt;draw:fill-image&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:fill-image&gt;</span> element specifies a link to a bitmap resource. Fill image are not available as automatic styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:fill-image&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:fill-image&gt;</span> element has the following attributes: <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-draw_fill-image">19.133.2</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_fill-image">19.197.9</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-draw_fill-image">19.539.7</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-draw_fill-image">19.571.9</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-draw_fill-image">19.910.13</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:fill-image&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_40_7_draw_opacity_"><span style="margin-right:0.127cm;">16.40.7</span></a><a id="__RefHeading__1416472_253892949"/><a id="element-draw_opacity"/>&lt;draw:opacity&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:opacity&gt;</span> element specifies an opacity gradient for a graphic object. An opacity gradient interpolates opacity. Opacity gradients are not available as automatic styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:opacity&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:opacity&gt;</span> element has the following attributes: <span class="Attribute">draw:angle</span> <a href="#attribute-draw_angle">19.112</a>, <span class="Attribute">draw:border</span> <a href="#attribute-draw_border">19.114</a>, <span class="Attribute">draw:cx</span> <a href="#attribute-draw_cx">19.129</a>, <span class="Attribute">draw:cy</span> <a href="#attribute-draw_cy">19.130</a>, <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-draw_opacity">19.133.6</a>, <span class="Attribute">draw:end</span> <a href="#attribute-draw_end">19.139</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_opacity">19.197.18</a>, <span class="Attribute">draw:start</span> <a href="#attribute-draw_start">19.212</a> and <span class="Attribute">draw:style</span> <a href="#attribute-draw_style_element-draw_opacity">19.218.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:opacity&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_40_8_draw_marker_"><span style="margin-right:0.127cm;">16.40.8</span></a><a id="__RefHeading__1416474_253892949"/><a id="element-draw_marker"/>&lt;draw:marker&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:marker&gt;</span> element represents a marker, which is used to draw polygons at the start or end point of a stroke depending on whether it is referenced by a <span class="Attribute">draw:marker-start</span> or <span class="Attribute">draw:marker-end</span> attribute. </p><p class="Text_20_body">Marker geometry is defined by a <span class="Attribute">svg:d</span> attribute. </p><p class="Note"><span class="Note_20_Label">Note</span>: The marker geometry could be imagined as an arrow whose vertex points upwards. </p><p class="Text_20_body">When the marker is painted, its geometry is first mapped to the stroke start or end point as follows: </p><p class="Text_20_body">If a marker is referenced by a <span class="Attribute">draw:marker-start</span> attribute, the marker geometry is scaled so that its width equals the width specified by <span class="Attribute">draw:marker-start-width</span> attribute. If the marker is referenced by a <span class="Attribute">draw:marker-end</span> attribute, the marker geometry is scaled so that its width equals the width specified by <span class="Attribute">draw:marker-end-width</span> attribute. The aspect ratio of the geometry is in both cases kept. </p><p class="Text_20_body">The geometry is horizontally centered. It is vertically positioned relative to an offset value which is specified by a <span class="Attribute">draw:marker-start-center</span> attribute for markers referenced by a <span class="Attribute">draw:marker-start</span> attribute, and by the <span class="Attribute">draw:marker-end-center</span> attribute for markers referenced by a <span class="Attribute">draw:marker-end</span> attribute. The attribute value <span class="Attribute_20_Value">true</span> defines an offset of 0.5 and the attribute value <span class="Attribute_20_Value">false</span> defines an offset of 0.3, which is also the default value. The offset specifies the marker's vertical position in a range from 0.0 to 1.0, where the value 0.0 means the geometry's bottom bound is aligned to the X axis of the local coordinate system of the marker geometry, and where the value 1.0 means the top bound to be aligned to the X axis of the local coordinate system of the marker geometry. </p><p class="Text_20_body">If the marker referenced by a <span class="Attribute">draw:marker-start</span> attribute, the marker geometry is then rotated so that the Y axis is aligned with the direction of the stroke in the start/end point direction. It is painted to the stroke so that the origin of the coordinate system of the mapped marker geometry is positioned at the start point's position.</p><p class="Text_20_body">If the marker is referenced by a <span class="Attribute">draw:marker-end</span> attribute, the marker geometry is then rotated so that the X axis is aligned with the direction of the stroke in the end/start point direction. It is pointed to the stroke so that the origin of the coordinate system of the mapped marker geometry is positioned at the end point's position.</p><p class="Text_20_body">Markers are not available as automatic styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:marker&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:marker&gt;</span> element has the following attributes: <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-draw_marker">19.133.5</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_marker">19.197.16</a>, <span class="Attribute">svg:d</span> <a href="#attribute-svg_d">19.526</a> and <span class="Attribute">svg:viewBox</span> <a href="#attribute-svg_viewBox">19.570</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:marker&gt;</span> element has no child elements.</p><h3 class="Heading_20_3"><a id="a16_40_9_draw_stroke-dash_"><span style="margin-right:0.127cm;">16.40.9</span></a><a id="__RefHeading__1416476_253892949"/><a id="element-draw_stroke-dash"/>&lt;draw:stroke-dash&gt;</h3><p class="Text_20_body">The <span class="Element">&lt;draw:stroke-dash&gt;</span> element represents a dash style that can be used to render strokes of shapes. Dash styles are not available as automatic styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;draw:stroke-dash&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;draw:stroke-dash&gt;</span> element has the following attributes: <span class="Attribute">draw:display-name</span> <a href="#attribute-draw_display-name_element-draw_stroke-dash">19.133.7</a>, <span class="Attribute">draw:distance</span> <a href="#attribute-draw_distance_element-draw_stroke-dash">19.134.3</a>, <span class="Attribute">draw:dots1</span> <a href="#attribute-draw_dots1">19.135</a>, <span class="Attribute">draw:dots1-length</span> <a href="#attribute-draw_dots1-length">19.136</a>, <span class="Attribute">draw:dots2</span> <a href="#attribute-draw_dots2">19.137</a>, <span class="Attribute">draw:dots2-length</span> <a href="#attribute-draw_dots2-length">19.138</a>, <span class="Attribute">draw:name</span> <a href="#attribute-draw_name_element-draw_stroke-dash">19.197.27</a> and <span class="Attribute">draw:style</span> <a href="#attribute-draw_style_element-draw_stroke-dash">19.218.5</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;draw:stroke-dash&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_41_style_presentation-page-layout_"><span style="margin-right:0.127cm;">16.41</span></a><a id="__RefHeading__1416478_253892949"/><a id="element-style_presentation-page-layout"/>&lt;style:presentation-page-layout&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:presentation-page-layout&gt;</span> element is a container <span class="Element">&lt;presentation:placeholder&gt;</span> elements. These placeholders are used as templates for creating new presentation objects and to mark the size and position of an object if the presentation page layout of a drawing page is changed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:presentation-page-layout&gt;</span> element is usable within the following element: <span class="Element">&lt;office:styles&gt;</span> <a href="#element-office_styles">3.15.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:presentation-page-layout&gt;</span> element has the following attributes: <span class="Attribute">style:display-name</span> <a href="#attribute-style_display-name">19.472</a> and <span class="Attribute">style:name</span> <a href="#attribute-style_name_element-style_presentation-page-layout">19.498.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:presentation-page-layout&gt;</span> element has the following child element: <span class="Element">&lt;presentation:placeholder&gt;</span> <a href="#element-presentation_placeholder">16.42</a>.</p><h2 class="Heading_20_2"><a id="a16_42_presentation_placeholder_"><span style="margin-right:0.127cm;">16.42</span></a><a id="__RefHeading__1416480_253892949"/><a id="element-presentation_placeholder"/>&lt;presentation:placeholder&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;presentation:placeholder&gt;</span> element specifies a placeholder for presentation objects.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;presentation:placeholder&gt;</span> element is usable within the following element: <span class="Element">&lt;style:presentation-page-layout&gt;</span> <a href="#element-style_presentation-page-layout">16.41</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;presentation:placeholder&gt;</span> element has the following attributes: <span class="Attribute">presentation:object</span> <a href="#attribute-presentation_object">19.403</a>, <span class="Attribute">svg:height</span> <a href="#attribute-svg_height_element-presentation_placeholder">19.539.10</a>, <span class="Attribute">svg:width</span> <a href="#attribute-svg_width_element-presentation_placeholder">19.571.12</a>, <span class="Attribute">svg:x</span> <a href="#attribute-svg_x_element-presentation_placeholder">19.573.8</a> and <span class="Attribute">svg:y</span> <a href="#attribute-svg_y_element-presentation_placeholder">19.577.8</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;presentation:placeholder&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a16_43Chart_Styles"><span style="margin-right:0.127cm;">16.43</span></a><a id="__RefHeading__1416482_253892949"/><a id="Chart_Styles"/>Chart Styles</h2><p class="Text_20_body">Chart styles are <span class="Element">&lt;style:style&gt;</span> elements that have the family <span class="Attribute_20_Value">chart</span>.</p><p class="Text_20_body">There are two style inheritance models at work with chart styles. The first model, is standard style inheritance as described in <span class="Element">&lt;style:style&gt;</span>. <a href="#element-style_style">16.2</a> The second model is inheritance between elements representing parts of a chart.</p><p class="Text_20_body">If an attribute is not specified with a chart style on a <span class="Element">&lt;chart:data-point&gt;</span> element, the specification of that attribute on its parent <span class="Element">&lt;chart:series&gt;</span> element is used. If the attribute is not specified on the parent <span class="Element">&lt;chart:series&gt;</span> element, then the specification of that attribute on its ancestor <span class="Element">&lt;chart:plot-area&gt;</span> element is used. </p><p class="Text_20_body">Chart styles may define paragraph and text properties. These are applied to paragraphs contained in chart elements unless they are over-ridden by paragraph styles that are specified by the paragraph elements themselves. </p><h1 class="Heading_20_1"><a id="a17Formatting_Elements"><span style="margin-right:0.127cm;">17</span></a><a id="__RefHeading__35406978"/><a id="Formatting_Properties"/>Formatting Elements</h1><h2 class="Heading_20_2"><a id="a17_1General"><span style="margin-right:0.127cm;">17.1</span></a><a id="__RefHeading__1416484_253892949"/>General</h2><p class="Text_20_body">A document can contain multiple style elements. Formatting properties are attributes and child elements of formatting properties elements, which are described in this chapter, and which are child elements of style elements. This container relationship means:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Formatting properties can be addressed by <a title="Cascading Style Sheets, level 2" href="http://www.w3.org/TR/1998/REC-CSS2-19980512">[CSS2]</a> or <a title="XSL Transformations (XSLT) Version 1.0" href="http://www.w3.org/TR/1999/REC-xslt-19991116">[XSLT]</a> stylesheets regardless of the style type.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Styles may contain additional information that is not defined by formatting properties.<span class="odfLiEnd"/> </p></li></ul><h2 class="Heading_20_2"><a id="a17_2_style_page-layout-properties_"><span style="margin-right:0.127cm;">17.2</span></a><a id="__RefHeading__1416486_253892949"/><a id="element-style_page-layout-properties"/>&lt;style:page-layout-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:page-layout-properties&gt;</span> element acts as a container for attributes and elements that define a page layout.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:page-layout-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-page-layout&gt;</span> <a href="#element-style_default-page-layout">16.8</a> and <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout">16.5</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:page-layout-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:border</span> <a href="#property-fo_border">20.176.2</a>, <span class="Attribute">fo:border-bottom</span> <a href="#property-fo_border-bottom">20.176.3</a>, <span class="Attribute">fo:border-left</span> <a href="#property-fo_border-left">20.176.4</a>, <span class="Attribute">fo:border-right</span> <a href="#property-fo_border-right">20.176.5</a>, <span class="Attribute">fo:border-top</span> <a href="#property-fo_border-top">20.176.6</a>, <span class="Attribute">fo:margin</span> <a href="#property-fo_margin">20.198</a>, <span class="Attribute">fo:margin-bottom</span> <a href="#property-fo_margin-bottom">20.199</a>, <span class="Attribute">fo:margin-left</span> <a href="#property-fo_margin-left">20.200</a>, <span class="Attribute">fo:margin-right</span> <a href="#property-fo_margin-right">20.201</a>, <span class="Attribute">fo:margin-top</span> <a href="#property-fo_margin-top">20.202</a>, <span class="Attribute">fo:padding</span> <a href="#property-fo_padding">20.210</a>, <span class="Attribute">fo:padding-bottom</span> <a href="#property-fo_padding-bottom">20.211</a>, <span class="Attribute">fo:padding-left</span> <a href="#property-fo_padding-left">20.212</a>, <span class="Attribute">fo:padding-right</span> <a href="#property-fo_padding-right">20.213</a>, <span class="Attribute">fo:padding-top</span> <a href="#property-fo_padding-top">20.214</a>, <span class="Attribute">fo:page-height</span> <a href="#property-fo_page-height">20.208</a>, <span class="Attribute">fo:page-width</span> <a href="#property-fo_page-width">20.209</a>, <span class="Attribute">style:border-line-width</span> <a href="#property-style_border-line-width">20.241</a>, <span class="Attribute">style:border-line-width-bottom</span> <a href="#property-style_border-line-width-bottom">20.242</a>, <span class="Attribute">style:border-line-width-left</span> <a href="#property-style_border-line-width-left">20.243</a>, <span class="Attribute">style:border-line-width-right</span> <a href="#property-style_border-line-width-right">20.244</a>, <span class="Attribute">style:border-line-width-top</span> <a href="#property-style_border-line-width-top">20.245</a>, <span class="Attribute">style:first-page-number</span> <a href="#property-style_first-page-number">20.258</a>, <span class="Attribute">style:footnote-max-height</span> <a href="#property-style_footnote-max-height">20.288</a>, <span class="Attribute">style:layout-grid-base-height</span> <a href="#property-style_layout-grid-base-height">20.296</a>, <span class="Attribute">style:layout-grid-base-width</span> <a href="#property-style_layout-grid-base-width">20.297</a>, <span class="Attribute">style:layout-grid-color</span> <a href="#property-style_layout-grid-color">20.298</a>, <span class="Attribute">style:layout-grid-display</span> <a href="#property-style_layout-grid-display">20.299</a>, <span class="Attribute">style:layout-grid-lines</span> <a href="#property-style_layout-grid-lines">20.300</a>, <span class="Attribute">style:layout-grid-mode</span> <a href="#property-style_layout-grid-mode">20.301</a>, <span class="Attribute">style:layout-grid-print</span> <a href="#property-style_layout-grid-print">20.302</a>, <span class="Attribute">style:layout-grid-ruby-below</span> <a href="#property-style_layout-grid-ruby-below">20.303</a>, <span class="Attribute">style:layout-grid-ruby-height</span> <a href="#property-style_layout-grid-ruby-height">20.304</a>, <span class="Attribute">style:layout-grid-snap-to</span> <a href="#property-style_layout-grid-snap-to">20.305</a>, <span class="Attribute">style:layout-grid-standard-mode</span> <a href="#property-style_layout-grid-standard-mode">20.306</a>, <span class="Attribute">style:num-format</span> <a href="#property-style_num-format">20.314</a>, <span class="Attribute">style:num-letter-sync</span> <a href="#property-style_num-letter-sync">20.315</a>, <span class="Attribute">style:num-prefix</span> <a href="#property-style_num-prefix">20.316</a>, <span class="Attribute">style:num-suffix</span> <a href="#property-style_num-suffix">20.317</a>, <span class="Attribute">style:paper-tray-name</span> <a href="#property-style_paper-tray-name">20.321</a>, <span class="Attribute">style:print</span> <a href="#property-style_print">20.322</a>, <span class="Attribute">style:print-orientation</span> <a href="#property-style_print-orientation">20.325</a>, <span class="Attribute">style:print-page-order</span> <a href="#property-style_print-page-order">20.324</a>, <span class="Attribute">style:register-truth-ref-style-name</span> <a href="#property-style_register-truth-ref-style-name">20.329</a>, <span class="Attribute">style:scale-to</span> <a href="#property-style_scale-to">20.344</a>, <span class="Attribute">style:scale-to-pages</span> <a href="#property-style_scale-to-pages">20.345</a>, <span class="Attribute">style:shadow</span> <a href="#property-style_shadow">20.349</a>, <span class="Attribute">style:table-centering</span> <a href="#property-style_table-centering">20.353</a> and <span class="Attribute">style:writing-mode</span> <a href="#property-style_writing-mode_element-style_page-layout-properties">20.394.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:page-layout-properties&gt;</span> element has the following child elements: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a> and <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><h2 class="Heading_20_2"><a id="a17_3_style_background-image_"><span style="margin-right:0.127cm;">17.3</span></a><a id="__RefHeading__1416488_253892949"/><a id="element-style_background-image"/>&lt;style:background-image&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:background-image&gt;</span> element specifies an image as a background.</p><p class="Text_20_body">If the <span class="Element">&lt;style:background-image&gt;</span> element is empty and if there is no color specified by an <span class="Attribute">fo:background-color</span> element in the same formatting properties element, the background color is set to transparent.</p><p class="Note"><span class="Note_20_Label">Note:</span> The <span class="Attribute">fo:background</span><span class="Attribute">-color</span> property also sets a background attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:background-image&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>, <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>, <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a> and <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:background-image&gt;</span> element has the following attributes: <span class="Attribute">draw:opacity</span> <a href="#attribute-draw_opacity">19.202</a>, <span class="Attribute">style:filter-name</span> <a href="#attribute-style_filter-name">19.477</a>, <span class="Attribute">style:position</span> <a href="#attribute-style_position_element-style_background-image">19.508.2</a>, <span class="Attribute">style:repeat</span> <a href="#attribute-style_repeat">19.511</a>, <span class="Attribute">xlink:actuate</span> <a href="#attribute-xlink_actuate">19.909</a>, <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-style_background-image">19.910.28</a>, <span class="Attribute">xlink:show</span> <a href="#attribute-xlink_show">19.911</a> and <span class="Attribute">xlink:type</span> <a href="#attribute-xlink_type">19.913</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:background-image&gt;</span> element has the following child element: <span class="Element">&lt;office:binary-data&gt;</span> <a href="#element-office_binary-data">10.4.5</a>.</p><h2 class="Heading_20_2"><a id="a17_4_style_footnote-sep_"><span style="margin-right:0.127cm;">17.4</span></a><a id="__RefHeading__1416490_253892949"/><a id="element-style_footnote-sep"/>&lt;style:footnote-sep&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:footnote-sep&gt;</span> element specifies the line that separates a footnote area from a body text area on a page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:footnote-sep&gt;</span> element is usable within the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:footnote-sep&gt;</span> element has the following attributes: <span class="Attribute">style:adjustment</span> <a href="#attribute-style_adjustment">19.461</a>, <span class="Attribute">style:color</span> <a href="#attribute-style_color">19.467</a>, <span class="Attribute">style:distance-after-sep</span> <a href="#attribute-style_distance-after-sep">19.475</a>, <span class="Attribute">style:distance-before-sep</span> <a href="#attribute-style_distance-before-sep">19.474</a>, <span class="Attribute">style:line-style</span> <a href="#attribute-style_line-style">19.493</a>, <span class="Attribute">style:rel-width</span> <a href="#attribute-style_rel-width_element-style_footnote-sep">19.510.4</a> and <span class="Attribute">style:width</span> <a href="#attribute-style_width_element-style_footnote-sep">19.518.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:footnote-sep&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_5_style_header-footer-properties_"><span style="margin-right:0.127cm;">17.5</span></a><a id="__RefHeading__1416492_253892949"/><a id="element-style_header-footer-properties"/>&lt;style:header-footer-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:header-footer-properties&gt;</span> element specifies formatting properties for both headers and footers.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:header-footer-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:footer-style&gt;</span> <a href="#element-style_footer-style">16.7</a> and <span class="Element">&lt;style:header-style&gt;</span> <a href="#element-style_header-style">16.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:header-footer-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:border</span> <a href="#property-fo_border">20.176.2</a>, <span class="Attribute">fo:border-bottom</span> <a href="#property-fo_border-bottom">20.176.3</a>, <span class="Attribute">fo:border-left</span> <a href="#property-fo_border-left">20.176.4</a>, <span class="Attribute">fo:border-right</span> <a href="#property-fo_border-right">20.176.5</a>, <span class="Attribute">fo:border-top</span> <a href="#property-fo_border-top">20.176.6</a>, <span class="Attribute">fo:margin</span> <a href="#property-fo_margin">20.198</a>, <span class="Attribute">fo:margin-bottom</span> <a href="#property-fo_margin-bottom">20.199</a>, <span class="Attribute">fo:margin-left</span> <a href="#property-fo_margin-left">20.200</a>, <span class="Attribute">fo:margin-right</span> <a href="#property-fo_margin-right">20.201</a>, <span class="Attribute">fo:margin-top</span> <a href="#property-fo_margin-top">20.202</a>, <span class="Attribute">fo:min-height</span> <a href="#property-fo_min-height_element-style_header-footer-properties">20.205.2</a>, <span class="Attribute">fo:padding</span> <a href="#property-fo_padding">20.210</a>, <span class="Attribute">fo:padding-bottom</span> <a href="#property-fo_padding-bottom">20.211</a>, <span class="Attribute">fo:padding-left</span> <a href="#property-fo_padding-left">20.212</a>, <span class="Attribute">fo:padding-right</span> <a href="#property-fo_padding-right">20.213</a>, <span class="Attribute">fo:padding-top</span> <a href="#property-fo_padding-top">20.214</a>, <span class="Attribute">style:border-line-width</span> <a href="#property-style_border-line-width">20.241</a>, <span class="Attribute">style:border-line-width-bottom</span> <a href="#property-style_border-line-width-bottom">20.242</a>, <span class="Attribute">style:border-line-width-left</span> <a href="#property-style_border-line-width-left">20.243</a>, <span class="Attribute">style:border-line-width-right</span> <a href="#property-style_border-line-width-right">20.244</a>, <span class="Attribute">style:border-line-width-top</span> <a href="#property-style_border-line-width-top">20.245</a>, <span class="Attribute">style:dynamic-spacing</span> <a href="#property-style_dynamic-spacing">20.256</a>, <span class="Attribute">style:shadow</span> <a href="#property-style_shadow">20.349</a> and <span class="Attribute">svg:height</span> <a href="#property-svg_height_element-style_header-footer-properties">20.397.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:header-footer-properties&gt;</span> element has the following child element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><h2 class="Heading_20_2"><a id="a17_6_style_paragraph-properties_"><span style="margin-right:0.127cm;">17.6</span></a><a id="__RefHeading__1416494_253892949"/><a id="element-style_paragraph-properties"/>&lt;style:paragraph-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:paragraph-properties&gt;</span> element specifies formatting properties for paragraphs.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:paragraph-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:paragraph-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:border</span> <a href="#property-fo_border">20.176.2</a>, <span class="Attribute">fo:border-bottom</span> <a href="#property-fo_border-bottom">20.176.3</a>, <span class="Attribute">fo:border-left</span> <a href="#property-fo_border-left">20.176.4</a>, <span class="Attribute">fo:border-right</span> <a href="#property-fo_border-right">20.176.5</a>, <span class="Attribute">fo:border-top</span> <a href="#property-fo_border-top">20.176.6</a>, <span class="Attribute">fo:break-after</span> <a href="#property-fo_break-after">20.177</a>, <span class="Attribute">fo:break-before</span> <a href="#property-fo_break-before">20.178</a>, <span class="Attribute">fo:hyphenation-keep</span> <a href="#property-fo_hyphenation-keep">20.189</a>, <span class="Attribute">fo:hyphenation-ladder-count</span> <a href="#property-fo_hyphenation-ladder-count">20.190</a>, <span class="Attribute">fo:keep-together</span> <a href="#property-fo_keep-together">20.193</a>, <span class="Attribute">fo:keep-with-next</span> <a href="#property-fo_keep-with-next">20.194</a>, <span class="Attribute">fo:line-height</span> <a href="#property-fo_line-height">20.197</a>, <span class="Attribute">fo:margin</span> <a href="#property-fo_margin">20.198</a>, <span class="Attribute">fo:margin-bottom</span> <a href="#property-fo_margin-bottom">20.199</a>, <span class="Attribute">fo:margin-left</span> <a href="#property-fo_margin-left">20.200</a>, <span class="Attribute">fo:margin-right</span> <a href="#property-fo_margin-right">20.201</a>, <span class="Attribute">fo:margin-top</span> <a href="#property-fo_margin-top">20.202</a>, <span class="Attribute">fo:orphans</span> <a href="#property-fo_orphans">20.207</a>, <span class="Attribute">fo:padding</span> <a href="#property-fo_padding">20.210</a>, <span class="Attribute">fo:padding-bottom</span> <a href="#property-fo_padding-bottom">20.211</a>, <span class="Attribute">fo:padding-left</span> <a href="#property-fo_padding-left">20.212</a>, <span class="Attribute">fo:padding-right</span> <a href="#property-fo_padding-right">20.213</a>, <span class="Attribute">fo:padding-top</span> <a href="#property-fo_padding-top">20.214</a>, <span class="Attribute">fo:text-align</span> <a href="#property-fo_text-align_element-style_paragraph-properties">20.216.1</a>, <span class="Attribute">fo:text-align-last</span> <a href="#property-fo_text-align-last">20.217</a>, <span class="Attribute">fo:text-indent</span> <a href="#property-fo_text-indent">20.218</a>, <span class="Attribute">fo:widows</span> <a href="#property-fo_widows">20.221</a>, <span class="Attribute">style:auto-text-indent</span> <a href="#property-style_auto-text-indent">20.239</a>, <span class="Attribute">style:background-transparency</span> <a href="#property-style_background-transparency">20.240</a>, <span class="Attribute">style:border-line-width</span> <a href="#property-style_border-line-width">20.241</a>, <span class="Attribute">style:border-line-width-bottom</span> <a href="#property-style_border-line-width-bottom">20.242</a>, <span class="Attribute">style:border-line-width-left</span> <a href="#property-style_border-line-width-left">20.243</a>, <span class="Attribute">style:border-line-width-right</span> <a href="#property-style_border-line-width-right">20.244</a>, <span class="Attribute">style:border-line-width-top</span> <a href="#property-style_border-line-width-top">20.245</a>, <span class="Attribute">style:font-independent-line-spacing</span> <a href="#property-style_font-independent-line-spacing">20.268</a>, <span class="Attribute">style:join-border</span> <a href="#property-style_join-border">20.292</a>, <span class="Attribute">style:justify-single-word</span> <a href="#property-style_justify-single-word">20.293</a>, <span class="Attribute">style:line-break</span> <a href="#property-style_line-break">20.307</a>, <span class="Attribute">style:line-height-at-least</span> <a href="#property-style_line-height-at-least">20.309</a>, <span class="Attribute">style:line-spacing</span> <a href="#property-style_line-spacing">20.310</a>, <span class="Attribute">style:page-number</span> <a href="#property-style_page-number">20.320</a>, <span class="Attribute">style:punctuation-wrap</span> <a href="#property-style_punctuation-wrap">20.327</a>, <span class="Attribute">style:register-true</span> <a href="#property-style_register-true">20.328</a>, <span class="Attribute">style:shadow</span> <a href="#property-style_shadow">20.349</a>, <span class="Attribute">style:snap-to-layout-grid</span> <a href="#property-style_snap-to-layout-grid">20.351</a>, <span class="Attribute">style:tab-stop-distance</span> <a href="#property-style_tab-stop-distance">20.352</a>, <span class="Attribute">style:text-autospace</span> <a href="#property-style_text-autospace">20.355</a>, <span class="Attribute">style:vertical-align</span> <a href="#property-style_vertical-align_element-style_paragraph-properties">20.386.1</a>, <span class="Attribute">style:writing-mode</span> <a href="#property-style_writing-mode_element-style_paragraph-properties">20.394.4</a>, <span class="Attribute">style:writing-mode-automatic</span> <a href="#property-style_writing-mode-automatic">20.395</a>, <span class="Attribute">text:line-number</span> <a href="#property-text_line-number">20.420</a> and <span class="Attribute">text:number-lines</span> <a href="#property-text_number-lines">20.424</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:paragraph-properties&gt;</span> element has the following child elements: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;style:drop-cap&gt;</span> <a href="#element-style_drop-cap">17.9</a> and <span class="Element">&lt;style:tab-stops&gt;</span> <a href="#element-style_tab-stops">17.7</a>.</p><h2 class="Heading_20_2"><a id="a17_7_style_tab-stops_"><span style="margin-right:0.127cm;">17.7</span></a><a id="__RefHeading__1416496_253892949"/><a id="element-style_tab-stops"/>&lt;style:tab-stops&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:tab-stops&gt;</span> element is a container for <span class="Element">&lt;style:tab-stop&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:tab-stops&gt;</span> element is usable within the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:tab-stops&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:tab-stops&gt;</span> element has the following child element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><h2 class="Heading_20_2"><a id="a17_8_style_tab-stop_"><span style="margin-right:0.127cm;">17.8</span></a><a id="__RefHeading__1416498_253892949"/><a id="element-style_tab-stop"/>&lt;style:tab-stop&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:tab-stop&gt;</span> element defines a tab stop.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:tab-stop&gt;</span> element is usable within the following element: <span class="Element">&lt;style:tab-stops&gt;</span> <a href="#element-style_tab-stops">17.7</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:tab-stop&gt;</span> element has the following attributes: <span class="Attribute">style:char</span> <a href="#attribute-style_char">19.465</a>, <span class="Attribute">style:leader-color</span> <a href="#attribute-style_leader-color">19.484</a>, <span class="Attribute">style:leader-style</span> <a href="#attribute-style_leader-style">19.485</a>, <span class="Attribute">style:leader-text</span> <a href="#attribute-style_leader-text">19.486</a>, <span class="Attribute">style:leader-text-style</span> <a href="#attribute-style_leader-text-style">19.487</a>, <span class="Attribute">style:leader-type</span> <a href="#attribute-style_leader-type">19.488</a>, <span class="Attribute">style:leader-width</span> <a href="#attribute-style_leader-width">19.489</a>, <span class="Attribute">style:position</span> <a href="#attribute-style_position_element-style_tab-stop">19.508.3</a>, <span class="Attribute">style:type</span> <a href="#attribute-style_type_element-style_tab-stop">19.515.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:tab-stop&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_9_style_drop-cap_"><span style="margin-right:0.127cm;">17.9</span></a><a id="__RefHeading__1416500_253892949"/><a id="element-style_drop-cap"/>&lt;style:drop-cap&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:drop-cap&gt;</span> element specifies if the first character or more of a paragraph is displayed in a larger font, that spans multiple lines. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:drop-cap&gt;</span> element is usable within the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:drop-cap&gt;</span> element has the following attributes: <span class="Attribute">style:distance</span> <a href="#attribute-style_distance">19.473</a>, <span class="Attribute">style:length</span> <a href="#attribute-style_length">19.492</a>, <span class="Attribute">style:lines</span> <a href="#attribute-style_lines">19.494</a> and <span class="Attribute">style:style-name</span> <a href="#attribute-style_style-name">19.514</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:drop-cap&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_10_style_ruby-properties_"><span style="margin-right:0.127cm;">17.10</span></a><a id="__RefHeading__1416502_253892949"/><a id="element-style_ruby-properties"/>&lt;style:ruby-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:ruby-properties&gt;</span> element specifies formatting properties for ruby elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:ruby-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:ruby-properties&gt;</span> element has the following attributes: <span class="Attribute">style:ruby-align</span> <a href="#property-style_ruby-align">20.341</a> and <span class="Attribute">style:ruby-position</span> <a href="#property-style_ruby-position">20.342</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:ruby-properties&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_11_style_section-properties_"><span style="margin-right:0.127cm;">17.11</span></a><a id="__RefHeading__1416504_253892949"/><a id="element-style_section-properties"/>&lt;style:section-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:section-properties&gt;</span> element defined the formatting properties used by section styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:section-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:section-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:margin-left</span> <a href="#property-fo_margin-left">20.200</a>, <span class="Attribute">fo:margin-right</span> <a href="#property-fo_margin-right">20.201</a>, <span class="Attribute">style:editable</span> <a href="#property-style_editable">20.257</a>, <span class="Attribute">style:protect</span> <a href="#property-style_protect_element-style_section-properties">20.326.3</a>, <span class="Attribute">style:writing-mode</span> <a href="#property-style_writing-mode_element-style_section-properties">20.394.5</a> and <span class="Attribute">text:dont-balance-text-columns</span> <a href="#property-text_dont-balance-text-columns">20.418</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:section-properties&gt;</span> element has the following child elements: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a> and <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><h2 class="Heading_20_2"><a id="a17_12_style_columns_"><span style="margin-right:0.127cm;">17.12</span></a><a id="__RefHeading__1416506_253892949"/><a id="element-style_columns"/>&lt;style:columns&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:columns&gt;</span> element specifies the formatting properties of columns by its attributes and its child elements. If it does not contain any column formatting properties, all columns are assigned the same width.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:columns&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a> and <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:columns&gt;</span> element has the following attributes: <span class="Attribute">fo:column-count</span> <a href="#attribute-fo_column-count">19.232</a> and <span class="Attribute">fo:column-gap</span> <a href="#attribute-fo_column-gap">19.233</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:columns&gt;</span> element has the following child elements: <span class="Element">&lt;style:column&gt;</span> <a href="#element-style_column">17.13</a> and <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a>.</p><h2 class="Heading_20_2"><a id="a17_13_style_column_"><span style="margin-right:0.127cm;">17.13</span></a><a id="__RefHeading__1416508_253892949"/><a id="element-style_column"/>&lt;style:column&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:column&gt;</span> element specifies formatting properties for a column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:column&gt;</span> element is usable within the following element: <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:column&gt;</span> element has the following attributes: <span class="Attribute">fo:end-indent</span> <a href="#attribute-fo_end-indent">19.235</a>, <span class="Attribute">fo:space-after</span> <a href="#attribute-fo_space-after">19.243</a>, <span class="Attribute">fo:space-before</span> <a href="#attribute-fo_space-before">19.244</a>, <span class="Attribute">fo:start-indent</span> <a href="#attribute-fo_start-indent">19.245</a> and <span class="Attribute">style:rel-width</span> <a href="#attribute-style_rel-width_element-style_column">19.510.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:column&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_14_style_column-sep_"><span style="margin-right:0.127cm;">17.14</span></a><a id="__RefHeading__1416510_253892949"/><a id="element-style_column-sep"/>&lt;style:column-sep&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:column-sep&gt;</span> element specifies a separator line between columns. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:column-sep&gt;</span> element is usable within the following element: <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:column-sep&gt;</span> element has the following attributes: <span class="Attribute">style:color</span> <a href="#attribute-style_color">19.467</a>, <span class="Attribute">style:height</span> <a href="#attribute-style_height">19.482</a>, <span class="Attribute">style:style</span> <a href="#attribute-style_style">19.513</a>, <span class="Attribute">style:vertical-align</span> <a href="#attribute-style_vertical-align">19.516</a> and <span class="Attribute">style:width</span> <a href="#attribute-style_width_element-style_column-sep">19.518.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:column-sep&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_15_style_table-properties_"><span style="margin-right:0.127cm;">17.15</span></a><a id="__RefHeading__1416512_253892949"/><a id="element-style_table-properties"/><a id="Table_Formatting_Properties"/>&lt;style:table-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:table-properties&gt;</span> element specifies formatting properties for tables. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:table-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:table-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:break-after</span> <a href="#property-fo_break-after">20.177</a>, <span class="Attribute">fo:break-before</span> <a href="#property-fo_break-before">20.178</a>, <span class="Attribute">fo:keep-with-next</span> <a href="#property-fo_keep-with-next">20.194</a>, <span class="Attribute">fo:margin</span> <a href="#property-fo_margin">20.198</a>, <span class="Attribute">fo:margin-bottom</span> <a href="#property-fo_margin-bottom">20.199</a>, <span class="Attribute">fo:margin-left</span> <a href="#property-fo_margin-left">20.200</a>, <span class="Attribute">fo:margin-right</span> <a href="#property-fo_margin-right">20.201</a>, <span class="Attribute">fo:margin-top</span> <a href="#property-fo_margin-top">20.202</a>, <span class="Attribute">style:may-break-between-rows</span> <a href="#property-style_may-break-between-rows">20.311</a>, <span class="Attribute">style:page-number</span> <a href="#property-style_page-number">20.320</a>, <span class="Attribute">style:rel-width</span> <a href="#property-style_rel-width_element-style_table-properties">20.332.2</a>, <span class="Attribute">style:shadow</span> <a href="#property-style_shadow">20.349</a>, <span class="Attribute">style:width</span> <a href="#property-style_width">20.389</a>, <span class="Attribute">style:writing-mode</span> <a href="#property-style_writing-mode_element-style_table-properties">20.394.7</a>, <span class="Attribute">table:align</span> <a href="#property-table_align">20.404</a>, <span class="Attribute">table:border-model</span> <a href="#property-table_border-model">20.405</a> and <span class="Attribute">table:display</span> <a href="#property-table_display">20.406</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:table-properties&gt;</span> element has the following child element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><h2 class="Heading_20_2"><a id="a17_16_style_table-column-properties_"><span style="margin-right:0.127cm;">17.16</span></a><a id="__RefHeading__1416514_253892949"/><a id="element-style_table-column-properties"/>&lt;style:table-column-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:table-column-properties&gt;</span> element specifies formatting properties for table columns.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:table-column-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:table-column-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:break-after</span> <a href="#property-fo_break-after">20.177</a>, <span class="Attribute">fo:break-before</span> <a href="#property-fo_break-before">20.178</a>, <span class="Attribute">style:column-width</span> <a href="#property-style_column-width">20.247</a>, <span class="Attribute">style:rel-column-width</span> <a href="#property-style_rel-column-width">20.330</a> and <span class="Attribute">style:use-optimal-column-width</span> <a href="#property-style_use-optimal-column-width">20.383</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:table-column-properties&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_17_style_table-row-properties_"><span style="margin-right:0.127cm;">17.17</span></a><a id="__RefHeading__1416516_253892949"/><a id="element-style_table-row-properties"/>&lt;style:table-row-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:table-row-properties&gt;</span> element specifies formatting properties for table rows.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:table-row-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:table-row-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:break-after</span> <a href="#property-fo_break-after">20.177</a>, <span class="Attribute">fo:break-before</span> <a href="#property-fo_break-before">20.178</a>, <span class="Attribute">fo:keep-together</span> <a href="#property-fo_keep-together">20.193</a>, <span class="Attribute">style:min-row-height</span> <a href="#property-style_min-row-height">20.312</a>, <span class="Attribute">style:row-height</span> <a href="#property-style_row-height">20.340</a> and <span class="Attribute">style:use-optimal-row-height</span> <a href="#property-style_use-optimal-row-height">20.384</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:table-row-properties&gt;</span> element has the following child element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><h2 class="Heading_20_2"><a id="a17_18_style_table-cell-properties_"><span style="margin-right:0.127cm;">17.18</span></a><a id="__RefHeading__1416518_253892949"/><a id="element-style_table-cell-properties"/>&lt;style:table-cell-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:table-cell-properties&gt;</span> element specifies formatting properties for cells.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:table-cell-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:table-cell-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:border</span> <a href="#property-fo_border">20.176.2</a>, <span class="Attribute">fo:border-bottom</span> <a href="#property-fo_border-bottom">20.176.3</a>, <span class="Attribute">fo:border-left</span> <a href="#property-fo_border-left">20.176.4</a>, <span class="Attribute">fo:border-right</span> <a href="#property-fo_border-right">20.176.5</a>, <span class="Attribute">fo:border-top</span> <a href="#property-fo_border-top">20.176.6</a>, <span class="Attribute">fo:padding</span> <a href="#property-fo_padding">20.210</a>, <span class="Attribute">fo:padding-bottom</span> <a href="#property-fo_padding-bottom">20.211</a>, <span class="Attribute">fo:padding-left</span> <a href="#property-fo_padding-left">20.212</a>, <span class="Attribute">fo:padding-right</span> <a href="#property-fo_padding-right">20.213</a>, <span class="Attribute">fo:padding-top</span> <a href="#property-fo_padding-top">20.214</a>, <span class="Attribute">fo:wrap-option</span> <a href="#property-fo_wrap-option">20.223</a>, <span class="Attribute">style:border-line-width</span> <a href="#property-style_border-line-width">20.241</a>, <span class="Attribute">style:border-line-width-bottom</span> <a href="#property-style_border-line-width-bottom">20.242</a>, <span class="Attribute">style:border-line-width-left</span> <a href="#property-style_border-line-width-left">20.243</a>, <span class="Attribute">style:border-line-width-right</span> <a href="#property-style_border-line-width-right">20.244</a>, <span class="Attribute">style:border-line-width-top</span> <a href="#property-style_border-line-width-top">20.245</a>, <span class="Attribute">style:cell-protect</span> <a href="#property-style_cell-protect">20.246</a>, <span class="Attribute">style:decimal-places</span> <a href="#property-style_decimal-places">20.250</a>, <span class="Attribute">style:diagonal-bl-tr</span> <a href="#property-style_diagonal-bl-tr">20.251</a>, <span class="Attribute">style:diagonal-bl-tr-widths</span> <a href="#property-style_diagonal-bl-tr-widths">20.252</a>, <span class="Attribute">style:diagonal-tl-br</span> <a href="#property-style_diagonal-tl-br">20.253</a>, <span class="Attribute">style:diagonal-tl-br-widths</span> <a href="#property-style_diagonal-tl-br-widths">20.254</a>, <span class="Attribute">style:direction</span> <a href="#property-style_direction">20.255</a>, <span class="Attribute">style:glyph-orientation-vertical</span> <a href="#property-style_glyph-orientation-vertical">20.289</a>, <span class="Attribute">style:print-content</span> <a href="#property-style_print-content_element-style_table-cell-properties">20.323.3</a>, <span class="Attribute">style:repeat-content</span> <a href="#property-style_repeat-content">20.334</a>, <span class="Attribute">style:rotation-</span><span class="Attribute">align</span> <a href="#property-style_rotation-align">20.338</a>, <span class="Attribute">style:rotation-angle</span> <a href="#property-style_rotation-angle">20.339</a>, <span class="Attribute">style:shadow</span> <a href="#property-style_shadow">20.349</a>, <span class="Attribute">style:shrink-to-fit</span> <a href="#property-style_shrink-to-fit">20.350</a>, <span class="Attribute">style:text-align-source</span> <a href="#property-style_text-align-source">20.354</a>, <span class="Attribute">style:vertical-align</span> <a href="#property-style_vertical-align_element-style_table-cell-properties">20.386.2</a> and <span class="Attribute">style:writing-mode</span> <a href="#property-style_writing-mode_element-style_table-cell-properties">20.394.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:table-cell-properties&gt;</span> element has the following child element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><h2 class="Heading_20_2"><a id="a17_19_style_list-level-properties_"><span style="margin-right:0.127cm;">17.19</span></a><a id="__RefHeading__1416520_253892949"/><a id="element-style_list-level-properties"/><a id="List_Level_Style_Properties"/>&lt;style:list-level-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:list-level-properties&gt;</span> element specifies formatting properties for a list level.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:list-level-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>, <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a> and <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:list-level-properties&gt;</span> element has the following attributes: <span class="Attribute">fo:height</span> <a href="#property-fo_height">20.187</a>, <span class="Attribute">fo:text-align</span> <a href="#property-fo_text-align_element-style_list-level-properties">20.216.2</a>, <span class="Attribute">fo:width</span> <a href="#property-fo_width">20.222</a>, <span class="Attribute">style:font-name</span> <a href="#property-style_font-name">20.269</a>, <span class="Attribute">style:vertical-pos</span> <a href="#property-style_vertical-pos">20.387</a>, <span class="Attribute">style:vertical-rel</span> <a href="#property-style_vertical-rel">20.388</a>, <span class="Attribute">svg:y</span> <a href="#property-svg_y_element-style_list-level-properties">20.402.2</a>, <span class="Attribute">text:list-level-position-and-space-mode</span> <a href="#property-text_list-level-position-and-space-mode">20.421</a>, <span class="Attribute">text:min-label-distance</span> <a href="#property-text_min-label-distance">20.422</a>, <span class="Attribute">text:min-label-width</span> <a href="#property-text_min-label-width">20.423</a> and <span class="Attribute">text:space-before</span> <a href="#property-text_space-before">20.425</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:list-level-properties&gt;</span> element has the following child element: <span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a>.</p><h2 class="Heading_20_2"><a id="a17_20_style_list-level-label-alignment_"><span style="margin-right:0.127cm;">17.20</span></a><a id="__RefHeading__1416522_253892949"/><a id="element-style_list-level-label-alignment"/>&lt;style:list-level-label-alignment&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:list-level-label-alignment&gt;</span> element specifies the position and spacing of a list label and its list item.</p><p class="Text_20_body">The element will be evaluated only if the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute has the value <span class="Attribute_20_Value">label-alignment</span>. </p><p class="Text_20_body">The <span class="Attribute">fo:text-indent</span> and <span class="Attribute">fo:margin-left</span> attributes specify the indent and margin for the text lines of a list item. The text lines of a list item contains the list level properties specific content and the text of the paragraph inside the list item. The value <span class="Attribute">fo:text-indent</span> + <span class="Attribute">fo:margin-left</span> specifies the indent of the first text line of the list item. This position is also the alignment position for the list label, because the value of <span class="Attribute">text:min-label-width</span> is treated as 0. <a href="#attribute-fo_text-indent">19.246</a>, <a href="#property-text_list-level-position-and-space-mode">20.421</a></p><p class="Text_20_body">The <span class="Attribute">fo:text-indent</span> and <span class="Attribute">fo:margin-left</span> attributes are evaluated only for paragraphs inside list items whose paragraph styles do not specify them. If one of the two properties, or both, are specified by the paragraph style, the text indent and/or left margin are taken from the paragraph style. In this case the paragraph style's properties are used to determine the indent and margin for the text lines and thus also the alignment position.</p><p class="Text_20_body">  </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:list-level-label-alignment&gt;</span> element is usable within the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:list-level-label-alignment&gt;</span> element has the following attributes: <span class="Attribute">fo:margin-left</span> <a href="#attribute-fo_margin-left">19.237</a>, <span class="Attribute">fo:text-indent</span> <a href="#attribute-fo_text-indent">19.246</a>, <span class="Attribute">text:label-followed-by</span> <a href="#attribute-text_label-followed-by">19.827</a> and <span class="Attribute">text:list-tab-stop-position</span> <a href="#attribute-text_list-tab-stop-position">19.830</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:list-level-label-alignment&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_21_style_graphic-properties_"><span style="margin-right:0.127cm;">17.21</span></a><a id="__RefHeading__1416524_253892949"/><a id="element-style_graphic-properties"/><a id="DDE_LINK11"/>&lt;style:graphic-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:graphic-properties&gt;</span> element specifies formatting properties for chart, draw, graphic, and frame elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:graphic-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:graphic-properties&gt;</span> element has the following attributes: <span class="Attribute">dr3d:ambient-color</span> <a href="#property-dr3d_ambient-color">20.67</a>, <span class="Attribute">dr3d:backface-culling</span> <a href="#property-dr3d_backface-culling">20.69</a>, <span class="Attribute">dr3d:back-scale</span> <a href="#property-dr3d_back-scale">20.68</a>, <span class="Attribute">dr3d:close-back</span> <a href="#property-dr3d_close-back">20.70</a>, <span class="Attribute">dr3d:close-front</span> <a href="#property-dr3d_close-front">20.71</a>, <span class="Attribute">dr3d:depth</span> <a href="#property-dr3d_depth">20.72</a>, <span class="Attribute">dr3d:diffuse-color</span> <a href="#property-dr3d_diffuse-color">20.73</a>, <span class="Attribute">dr3d:edge-rounding</span> <a href="#property-dr3d_edge-rounding">20.74</a>, <span class="Attribute">dr3d:edge-rounding-mode</span> <a href="#property-dr3d_edge-rounding-mode">20.75</a>, <span class="Attribute">dr3d:emissive-color</span> <a href="#property-dr3d_emissive-color">20.76</a>, <span class="Attribute">dr3d:end-angle</span> <a href="#property-dr3d_end-angle">20.77</a>, <span class="Attribute">dr3d:horizontal-segments</span> <a href="#property-dr3d_horizontal-segments">20.78</a>, <span class="Attribute">dr3d:lighting-mode</span> <a href="#property-dr3d_lighting-mode">20.79</a>, <span class="Attribute">dr3d:normals-direction</span> <a href="#property-dr3d_normals-direction">20.80</a>, <span class="Attribute">dr3d:normals-kind</span> <a href="#property-dr3d_normals-kind">20.81</a>, <span class="Attribute">dr3d:shadow</span> <a href="#property-dr3d_shadow">20.82</a>, <span class="Attribute">dr3d:shininess</span> <a href="#property-dr3d_shininess">20.83</a>, <span class="Attribute">dr3d:specular-color</span> <a href="#property-dr3d_specular-color">20.84</a>, <span class="Attribute">dr3d:texture-filter</span> <a href="#property-dr3d_texture-filter">20.85</a>, <span class="Attribute">dr3d:texture-generation-mode-x</span> <a href="#property-dr3d_texture-generation-mode-x">20.88</a>, <span class="Attribute">dr3d:texture-generation-mode-y</span> <a href="#property-dr3d_texture-generation-mode-y">20.89</a>, <span class="Attribute">dr3d:texture-kind</span> <a href="#property-dr3d_texture-kind">20.86</a>, <span class="Attribute">dr3d:texture-mode</span> <a href="#property-dr3d_texture-mode">20.87</a>, <span class="Attribute">dr3d:vertical-segments</span> <a href="#property-dr3d_vertical-segments">20.90</a>, <span class="Attribute">draw:auto-grow-height</span> <a href="#property-draw_auto-grow-height">20.91</a>, <span class="Attribute">draw:auto-grow-width</span> <a href="#property-draw_auto-grow-width">20.92</a>, <span class="Attribute">draw:blue</span> <a href="#property-draw_blue">20.94</a>, <span class="Attribute">draw:caption-angle</span> <a href="#property-draw_caption-angle">20.95</a>, <span class="Attribute">draw:caption-angle-type</span> <a href="#property-draw_caption-angle-type">20.96</a>, <span class="Attribute">draw:caption-escape</span> <a href="#property-draw_caption-escape">20.97</a>, <span class="Attribute">draw:caption-escape-direction</span> <a href="#property-draw_caption-escape-direction">20.98</a>, <span class="Attribute">draw:caption-fit-line-length</span> <a href="#property-draw_caption-fit-line-length">20.99</a>, <span class="Attribute">draw:caption-gap</span> <a href="#property-draw_caption-gap">20.100</a>, <span class="Attribute">draw:caption-line-length</span> <a href="#property-draw_caption-line-length">20.101</a>, <span class="Attribute">draw:caption-type</span> <a href="#property-draw_caption-type">20.102</a>, <span class="Attribute">draw:color-inversion</span> <a href="#property-draw_color-inversion">20.103</a>, <span class="Attribute">draw:color-mode</span> <a href="#property-draw_color-mode">20.104</a>, <span class="Attribute">draw:contrast</span> <a href="#property-draw_contrast">20.105</a>, <span class="Attribute">draw:decimal-places</span> <a href="#property-draw_decimal-places">20.106</a>, <span class="Attribute">draw:draw-aspect</span> <a href="#property-draw_draw-aspect">20.107</a>, <span class="Attribute">draw:end-guide</span> <a href="#property-draw_end-guide">20.108</a>, <span class="Attribute">draw:end-line-spacing-horizontal</span> <a href="#property-draw_end-line-spacing-horizontal">20.109</a>, <span class="Attribute">draw:end-line-spacing-vertical</span> <a href="#property-draw_end-line-spacing-vertical">20.110</a>, <span class="Attribute">draw:fill</span> <a href="#property-draw_fill">20.111</a>, <span class="Attribute">draw:fill-color</span> <a href="#property-draw_fill-color">20.112</a>, <span class="Attribute">draw:fill-gradient-name</span> <a href="#property-draw_fill-gradient-name">20.113</a>, <span class="Attribute">draw:fill-hatch-name</span> <a href="#property-draw_fill-hatch-name">20.114</a>, <span class="Attribute">draw:fill-hatch-solid</span> <a href="#property-draw_fill-hatch-solid">20.115</a>, <span class="Attribute">draw:fill-image-height</span> <a href="#property-draw_fill-image-height">20.116</a>, <span class="Attribute">draw:fill-image-name</span> <a href="#property-draw_fill-image-name">20.117</a>, <span class="Attribute">draw:fill-image-ref-point</span> <a href="#property-draw_fill-image-ref-point">20.118</a>, <span class="Attribute">draw:fill-image-ref-point-x</span> <a href="#property-draw_fill-image-ref-point-x">20.119</a>, <span class="Attribute">draw:fill-image-ref-point-y</span> <a href="#property-draw_fill-image-ref-point-y">20.120</a>, <span class="Attribute">draw:fill-image-width</span> <a href="#property-draw_fill-image-width">20.121</a>, <span class="Attribute">draw:fit-to-contour</span> <a href="#property-draw_fit-to-contour">20.122</a>, <span class="Attribute">draw:fit-to-size</span> <a href="#property-draw_fit-to-size">20.123</a>, <span class="Attribute">draw:frame-display-border</span> <a href="#property-draw_frame-display-border">20.124</a>, <span class="Attribute">draw:frame-display-scrollbar</span> <a href="#property-draw_frame-display-scrollbar">20.126</a>, <span class="Attribute">draw:frame-margin-horizontal</span> <a href="#property-draw_frame-margin-horizontal">20.125</a>, <span class="Attribute">draw:frame-margin-vertical</span> <a href="#property-draw_frame-margin-vertical">20.127</a>, <span class="Attribute">draw:gamma</span> <a href="#property-draw_gamma">20.128</a>, <span class="Attribute">draw:gradient-step-count</span> <a href="#property-draw_gradient-step-count">20.130</a>, <span class="Attribute">draw:green</span> <a href="#property-draw_green">20.129</a>, <span class="Attribute">draw:guide-distance</span> <a href="#property-draw_guide-distance">20.131</a>, <span class="Attribute">draw:guide-overhang</span> <a href="#property-draw_guide-overhang">20.132</a>, <span class="Attribute">draw:image-opacity</span> <a href="#property-draw_image-opacity">20.133</a>, <span class="Attribute">draw:line-distance</span> <a href="#property-draw_line-distance">20.134</a>, <span class="Attribute">draw:luminance</span> <a href="#property-draw_luminance">20.135</a>, <span class="Attribute">draw:marker-end</span> <a href="#property-draw_marker-end">20.136</a>, <span class="Attribute">draw:marker-end-center</span> <a href="#property-draw_marker-end-center">20.137</a>, <span class="Attribute">draw:marker-end-width</span> <a href="#property-draw_marker-end-width">20.138</a>, <span class="Attribute">draw:marker-start</span> <a href="#property-draw_marker-start">20.139</a>, <span class="Attribute">draw:marker-start-center</span> <a href="#property-draw_marker-start-center">20.140</a>, <span class="Attribute">draw:marker-start-width</span> <a href="#property-draw_marker-start-width">20.141</a>, <span class="Attribute">draw:measure-align</span> <a href="#property-draw_measure-align">20.142</a>, <span class="Attribute">draw:measure-vertical-align</span> <a href="#property-draw_measure-vertical-align">20.143</a>, <span class="Attribute">draw:ole-draw-aspect</span> <a href="#property-draw_ole-draw-aspect">20.144</a>, <span class="Attribute">draw:opacity</span> <a href="#property-draw_opacity">20.145</a>, <span class="Attribute">draw:opacity-name</span> <a href="#property-draw_opacity-name">20.146</a>, <span class="Attribute">draw:parallel</span> <a href="#property-draw_parallel">20.147</a>, <span class="Attribute">draw:placing</span> <a href="#property-draw_placing">20.148</a>, <span class="Attribute">draw:red</span> <a href="#property-draw_red">20.149</a>, <span class="Attribute">draw:secondary-fill-color</span> <a href="#property-draw_secondary-fill-color">20.150</a>, <span class="Attribute">draw:shadow</span> <a href="#property-draw_shadow">20.151</a>, <span class="Attribute">draw:shadow-color</span> <a href="#property-draw_shadow-color">20.152</a>, <span class="Attribute">draw:shadow-offset-x</span> <a href="#property-draw_shadow-offset-x">20.153</a>, <span class="Attribute">draw:shadow-offset-y</span> <a href="#property-draw_shadow-offset-y">20.154</a>, <span class="Attribute">draw:shadow-opacity</span> <a href="#property-draw_shadow-opacity">20.155</a>, <span class="Attribute">draw:show-unit</span> <a href="#property-draw_show-unit">20.156</a>, <span class="Attribute">draw:start-guide</span> <a href="#property-draw_start-guide">20.157</a>, <span class="Attribute">draw:start-line-spacing-horizontal</span> <a href="#property-draw_start-line-spacing-horizontal">20.158</a>, <span class="Attribute">draw:start-line-spacing-vertical</span> <a href="#property-draw_start-line-spacing-vertical">20.159</a>, <span class="Attribute">draw:stroke</span> <a href="#property-draw_stroke">20.160</a>, <span class="Attribute">draw:stroke-dash</span> <a href="#property-draw_stroke-dash">20.161</a>, <span class="Attribute">draw:stroke-dash-names</span> <a href="#property-draw_stroke-dash-names">20.162</a>, <span class="Attribute">draw:stroke-linejoin</span> <a href="#property-draw_stroke-linejoin">20.163</a>, <span class="Attribute">draw:symbol-color</span> <a href="#property-draw_symbol-color">20.165</a>, <span class="Attribute">draw:textarea-horizontal-align</span> <a href="#property-draw_textarea-horizontal-align">20.166</a>, <span class="Attribute">draw:textarea-vertical-align</span> <a href="#property-draw_textarea-vertical-align">20.167</a>, <span class="Attribute">draw:tile-repeat-offset</span> <a href="#property-draw_tile-repeat-offset">20.168</a>, <span class="Attribute">draw:unit</span> <a href="#property-draw_unit">20.173</a>, <span class="Attribute">draw:visible-area-height</span> <a href="#property-draw_visible-area-height">20.169</a>, <span class="Attribute">draw:visible-area-left</span> <a href="#property-draw_visible-area-left">20.170</a>, <span class="Attribute">draw:visible-area-top</span> <a href="#property-draw_visible-area-top">20.171</a>, <span class="Attribute">draw:visible-area-width</span> <a href="#property-draw_visible-area-width">20.172</a>, <span class="Attribute">draw:wrap-influence-on-position</span> <a href="#property-draw_wrap-influence-on-position">20.174</a>, <span class="Attribute">fo:background-color</span> <a href="#property-fo_background-color">20.175</a>, <span class="Attribute">fo:border</span> <a href="#property-fo_border">20.176.2</a>, <span class="Attribute">fo:border-bottom</span> <a href="#property-fo_border-bottom">20.176.3</a>, <span class="Attribute">fo:border-left</span> <a href="#property-fo_border-left">20.176.4</a>, <span class="Attribute">fo:border-right</span> <a href="#property-fo_border-right">20.176.5</a>, <span class="Attribute">fo:border-top</span> <a href="#property-fo_border-top">20.176.6</a>, <span class="Attribute">fo:clip</span> <a href="#property-fo_clip">20.179</a>, <span class="Attribute">fo:margin</span> <a href="#property-fo_margin">20.198</a>, <span class="Attribute">fo:margin-bottom</span> <a href="#property-fo_margin-bottom">20.199</a>, <span class="Attribute">fo:margin-left</span> <a href="#property-fo_margin-left">20.200</a>, <span class="Attribute">fo:margin-</span><span class="Attribute">right</span> <a href="#property-fo_margin-right">20.201</a>, <span class="Attribute">fo:margin-top</span> <a href="#property-fo_margin-top">20.202</a>, <span class="Attribute">fo:max-height</span> <a href="#property-fo_max-height">20.203</a>, <span class="Attribute">fo:max-width</span> <a href="#property-fo_max-width">20.204</a>, <span class="Attribute">fo:min-height</span> <a href="#property-fo_min-height_element-style_graphic-properties">20.205.1</a>, <span class="Attribute">fo:min-width</span> <a href="#property-fo_min-width">20.206</a>, <span class="Attribute">fo:padding</span> <a href="#property-fo_padding">20.210</a>, <span class="Attribute">fo:padding-bottom</span> <a href="#property-fo_padding-bottom">20.211</a>, <span class="Attribute">fo:padding-left</span> <a href="#property-fo_padding-left">20.212</a>, <span class="Attribute">fo:padding-right</span> <a href="#property-fo_padding-right">20.213</a>, <span class="Attribute">fo:padding-top</span> <a href="#property-fo_padding-top">20.214</a>, <span class="Attribute">fo:wrap-option</span> <a href="#property-fo_wrap-option">20.223</a>, <span class="Attribute">style:background-transparency</span> <a href="#property-style_background-transparency">20.240</a>, <span class="Attribute">style:border-line-width</span> <a href="#property-style_border-line-width">20.241</a>, <span class="Attribute">style:border-line-width-bottom</span> <a href="#property-style_border-line-width-bottom">20.242</a>, <span class="Attribute">style:border-line-width-left</span> <a href="#property-style_border-line-width-left">20.243</a>, <span class="Attribute">style:border-line-width-right</span> <a href="#property-style_border-line-width-right">20.244</a>, <span class="Attribute">style:border-line-width-top</span> <a href="#property-style_border-line-width-top">20.245</a>, <span class="Attribute">style:editable</span> <a href="#property-style_editable">20.257</a>, <span class="Attribute">style:flow-with-text</span> <a href="#property-style_flow-with-text">20.259</a>, <span class="Attribute">style:horizontal-pos</span> <a href="#property-style_horizontal-pos">20.290</a>, <span class="Attribute">style:horizontal-rel</span> <a href="#property-style_horizontal-rel">20.291</a>, <span class="Attribute">style:mirror</span> <a href="#property-style_mirror">20.313</a>, <span class="Attribute">style:number-wrapped-paragraphs</span> <a href="#property-style_number-wrapped-paragraphs">20.318</a>, <span class="Attribute">style:overflow-behavior</span> <a href="#property-style_overflow-behavior">20.319</a>, <span class="Attribute">style:print-content</span> <a href="#property-style_print-content_element-style_graphic-properties">20.323.2</a>, <span class="Attribute">style:protect</span> <a href="#property-style_protect_element-style_graphic-properties">20.326.2</a>, <span class="Attribute">style:rel-height</span> <a href="#property-style_rel-height">20.331</a>, <span class="Attribute">style:rel-width</span> <a href="#property-style_rel-width_element-style_graphic-properties">20.332.1</a>, <span class="Attribute">style:repeat</span> <a href="#property-style_repeat">20.333</a>, <span class="Attribute">style:run-through</span> <a href="#property-style_run-through">20.343</a>, <span class="Attribute">style:shadow</span> <a href="#property-style_shadow">20.349</a>, <span class="Attribute">style:shrink-to-fit</span> <a href="#property-style_shrink-to-fit">20.350</a>, <span class="Attribute">style:vertical-pos</span> <a href="#property-style_vertical-pos">20.387</a>, <span class="Attribute">style:vertical-rel</span> <a href="#property-style_vertical-rel">20.388</a>, <span class="Attribute">style:wrap</span> <a href="#property-style_wrap">20.390</a>, <span class="Attribute">style:wrap-contour</span> <a href="#property-style_wrap-contour">20.391</a>, <span class="Attribute">style:wrap-contour-mode</span> <a href="#property-style_wrap-contour-mode">20.392</a>, <span class="Attribute">style:wrap-dynamic-threshold</span> <a href="#property-style_wrap-dynamic-threshold">20.393</a>, <span class="Attribute">style:writing-mode</span> <a href="#property-style_writing-mode_element-style_graphic-properties">20.394.2</a>, <span class="Attribute">svg:fill-rule</span> <a href="#property-svg_fill-rule">20.396</a>, <span class="Attribute">svg:height</span> <a href="#property-svg_height_element-style_graphic-properties">20.397.1</a>, <span class="Attribute">svg:stroke-color</span> <a href="#property-svg_stroke-color">20.398</a>, <span class="Attribute">svg:stroke-linecap</span> <a href="#property-svg_stroke-linecap">20.164</a>, <span class="Attribute">svg:stroke-opacity</span> <a href="#property-svg_stroke-opacity">20.399</a>, <span class="Attribute">svg:stroke-width</span> <a href="#property-svg_stroke-width">20.400</a>, <span class="Attribute">svg:width</span> <a href="#property-svg_width">20.403</a>, <span class="Attribute">svg:x</span> <a href="#property-svg_x">20.401</a>, <span class="Attribute">svg:y</span> <a href="#property-svg_y_element-style_graphic-properties">20.402.1</a>, <span class="Attribute">text:anchor-page-number</span> <a href="#property-text_anchor-page-number">20.407</a>, <span class="Attribute">text:anchor-type</span> <a href="#property-text_anchor-type">20.408</a>, <span class="Attribute">text:animation</span> <a href="#property-text_animation">20.409</a>, <span class="Attribute">text:animation-delay</span> <a href="#property-text_animation-delay">20.410</a>, <span class="Attribute">text:animation-direction</span> <a href="#property-text_animation-direction">20.411</a>, <span class="Attribute">text:animation-repeat</span> <a href="#property-text_animation-repeat">20.412</a>, <span class="Attribute">text:animation-start-inside</span> <a href="#property-text_animation-start-inside">20.413</a>, <span class="Attribute">text:animation-steps</span> <a href="#property-text_animation-steps">20.414</a> and <span class="Attribute">text:animation-stop-inside</span> <a href="#property-text_animation-stop-inside">20.415</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:graphic-properties&gt;</span> element has the following child elements: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a> and <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><h2 class="Heading_20_2"><a id="a17_22_style_chart-properties_"><span style="margin-right:0.127cm;">17.22</span></a><a id="__RefHeading__1416526_253892949"/><a id="element-style_chart-properties"/><a id="Chart_Properties"/>&lt;style:chart-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:chart-properties&gt;</span> element specifies formatting properties for charts.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:chart-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:chart-properties&gt;</span> element has the following attributes: <span class="Attribute">chart:angle-offset</span> <a href="#property-chart_angle-offset">20.2</a>, <span class="Attribute">chart:auto-position</span> <a href="#property-chart_auto-position">20.3</a>, <span class="Attribute">chart:auto-size</span> <a href="#property-chart_auto-size">20.4</a>, <span class="Attribute">chart:axis-label-position</span> <a href="#property-chart_axis-label-position">20.5</a>, <span class="Attribute">chart:axis-position</span> <a href="#property-chart_axis-position">20.6</a>, <span class="Attribute">chart:connect-bars</span> <a href="#property-chart_connect-bars">20.7</a>, <span class="Attribute">chart:data-label-number</span> <a href="#property-chart_data-label-number">20.8</a>, <span class="Attribute">chart:data-label-symbol</span> <a href="#property-chart_data-label-symbol">20.9</a>, <span class="Attribute">chart:data-label-text</span> <a href="#property-chart_data-label-text">20.10</a>, <span class="Attribute">chart:deep</span> <a href="#property-chart_deep">20.11</a>, <span class="Attribute">chart:display-label</span> <a href="#property-chart_display-label">20.12</a>, <span class="Attribute">chart:error-category</span> <a href="#property-chart_error-category">20.13</a>, <span class="Attribute">chart:error-lower-indicator</span> <a href="#property-chart_error-lower-indicator">20.14</a>, <span class="Attribute">chart:error-lower-limit</span> <a href="#property-chart_error-lower-limit">20.15</a>, <span class="Attribute">chart:error-lower-range</span> <a href="#property-chart_error-lower-range">20.16</a>, <span class="Attribute">chart:error-margin</span> <a href="#property-chart_error-margin">20.17</a>, <span class="Attribute">chart:error-percentage</span> <a href="#property-chart_error-percentage">20.18</a>, <span class="Attribute">chart:error-upper-indicator</span> <a href="#property-chart_error-upper-indicator">20.19</a>, <span class="Attribute">chart:error-upper-limit</span> <a href="#property-chart_error-upper-limit">20.20</a>, <span class="Attribute">chart:error-upper-range</span> <a href="#property-chart_error-upper-range">20.21</a>, <span class="Attribute">chart:gap-width</span> <a href="#property-chart_gap-width">20.22</a>, <span class="Attribute">chart:group-bars-per-axis</span> <a href="#property-chart_group-bars-per-axis">20.23</a>, <span class="Attribute">chart:hole-size</span> <a href="#property-chart_hole-size">20.24</a>, <span class="Attribute">chart:include-hidden-cells</span> <a href="#property-chart_include-hidden-cells">20.25</a>, <span class="Attribute">chart:interpolation</span> <a href="#property-chart_interpolation">20.26</a>, <span class="Attribute">chart:interval-major</span> <a href="#property-chart_interval-major">20.27</a>, <span class="Attribute">chart:interval-minor-divisor</span> <a href="#property-chart_interval-minor-divisor">20.28</a>, <span class="Attribute">chart:japanese-candle-stick</span> <a href="#property-chart_japanese-candle-stick">20.29</a>, <span class="Attribute">chart:label-arrangement</span> <a href="#property-chart_label-arrangement">20.30</a>, <span class="Attribute">chart:label-position</span> <a href="#property-chart_label-position">20.31</a>, <span class="Attribute">chart:label-position-negative</span> <a href="#property-chart_label-position-negative">20.32</a>, <span class="Attribute">chart:lines</span> <a href="#property-chart_lines">20.33</a>, <span class="Attribute">chart:link-data-style-to-source</span> <a href="#property-chart_link-data-style-to-source">20.34</a>, <span class="Attribute">chart:logarithmic</span> <a href="#property-chart_logarithmic">20.35</a>, <span class="Attribute">chart:maximum</span> <a href="#property-chart_maximum">20.36</a>, <span class="Attribute">chart:mean-value</span> <a href="#property-chart_mean-value">20.37</a>, <span class="Attribute">chart:minimum</span> <a href="#property-chart_minimum">20.38</a>, <span class="Attribute">chart:origin</span> <a href="#property-chart_origin">20.39</a>, <span class="Attribute">chart:overlap</span> <a href="#property-chart_overlap">20.40</a>, <span class="Attribute">chart:percentage</span> <a href="#property-chart_percentage">20.42</a>, <span class="Attribute">chart:pie-offset</span> <a href="#property-chart_pie-offset">20.41</a>, <span class="Attribute">chart:regression-type</span> <a href="#property-chart_regression-type">20.43</a>, <span class="Attribute">chart:reverse-direction</span> <a href="#property-chart_reverse-direction">20.44</a>, <span class="Attribute">chart:right-angled-axes</span> <a href="#property-chart_right-angled-axes">20.45</a>, <span class="Attribute">chart:scale-text</span> <a href="#property-chart_scale-text">20.46</a>, <span class="Attribute">chart:series-source</span> <a href="#property-chart_series-source">20.47</a>, <span class="Attribute">chart:solid-type</span> <a href="#property-chart_solid-type">20.49</a>, <span class="Attribute">chart:sort-by-x-values</span> <a href="#property-chart_sort-by-x-values">20.48</a>, <span class="Attribute">chart:spline-order</span> <a href="#property-chart_spline-order">20.50</a>, <span class="Attribute">chart:spline-resolution</span> <a href="#property-chart_spline-resolution">20.51</a>, <span class="Attribute">chart:stacked</span> <a href="#property-chart_stacked">20.52</a>, <span class="Attribute">chart:symbol-</span><span class="Attribute">height</span> <a href="#property-chart_symbol-height">20.53</a>, <span class="Attribute">chart:symbol-name</span> <a href="#property-chart_symbol-name">20.54</a>, <span class="Attribute">chart:symbol-type</span> <a href="#property-chart_symbol-type">20.55</a>, <span class="Attribute">chart:symbol-width</span> <a href="#property-chart_symbol-width">20.56</a>, <span class="Attribute">chart:text-overlap</span> <a href="#property-chart_text-overlap">20.57</a>, <span class="Attribute">chart:three-dimensional</span> <a href="#property-chart_three-dimensional">20.58</a>, <span class="Attribute">chart:tick-mark-position</span> <a href="#property-chart_tick-mark-position">20.63</a>, <span class="Attribute">chart:tick-marks-major-inner</span> <a href="#property-chart_tick-marks-major-inner">20.59</a>, <span class="Attribute">chart:tick-marks-major-outer</span> <a href="#property-chart_tick-marks-major-outer">20.60</a>, <span class="Attribute">chart:tick-marks-minor-inner</span> <a href="#property-chart_tick-marks-minor-inner">20.61</a>, <span class="Attribute">chart:tick-marks-minor-outer</span> <a href="#property-chart_tick-marks-minor-outer">20.62</a>, <span class="Attribute">chart:treat-empty-cells</span> <a href="#property-chart_treat-empty-cells">20.64</a>, <span class="Attribute">chart:vertical</span> <a href="#property-chart_vertical">20.65</a>, <span class="Attribute">chart:visible</span> <a href="#property-chart_visible">20.66</a>, <span class="Attribute">style:direction</span> <a href="#property-style_direction">20.255</a>, <span class="Attribute">style:rotation-angle</span> <a href="#property-style_rotation-angle">20.339</a> and <span class="Attribute">text:line-break</span> <a href="#property-text_line-break">20.419</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:chart-properties&gt;</span> element has the following child elements: <span class="Element">&lt;chart:label-separator&gt;</span> <a href="#element-chart_label-separator">17.24</a> and <span class="Element">&lt;chart:symbol-image&gt;</span> <a href="#element-chart_symbol-image">17.23</a>.</p><h2 class="Heading_20_2"><a id="a17_23_chart_symbol-image_"><span style="margin-right:0.127cm;">17.23</span></a><a id="__RefHeading__1416528_253892949"/><a id="element-chart_symbol-image"/>&lt;chart:symbol-image&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:symbol-image&gt;</span> element specifies an image to be used for a data point in a chart.</p><p class="Text_20_body">This element should be used only together with a <span class="Attribute">chart:symbol-type</span> attribute and only when that attribute has the value <span class="Attribute_20_Value">image</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:symbol-image&gt;</span> element is usable within the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:symbol-image&gt;</span> element has the following attribute: <span class="Attribute">xlink:href</span> <a href="#attribute-xlink_href_element-chart_symbol-image">19.910.4</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:symbol-image&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a17_24_chart_label-separator_"><span style="margin-right:0.127cm;">17.24</span></a><a id="__RefHeading__1416530_253892949"/><a id="element-chart_label-separator"/>&lt;chart:label-separator&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;chart:label-separator&gt;</span> element specifies text that is used for separating different parts of a textual data label. These parts can be the value as number, the value as a percentage (<a href="#property-chart_data-label-number">20.8</a>), and the label text (<a href="#property-chart_data-label-text">20.10</a>).</p><p class="Text_20_body">If the <span class="Element">&lt;chart:label-separator&gt;</span> element is omitted, the default value is a space character “ “ (U+0020, SPACE).</p><p class="Text_20_body">This element should be used within chart styles that are applied to <span class="Element">&lt;chart:data-label&gt;</span>, <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Text_20_body">If a separator is not specified by this element in a chart style applied to a <span class="Element">&lt;chart:data-label&gt;</span> element, the separator specified with a chart style applied to a parent element is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;chart:label-separator&gt;</span> element is usable within the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;chart:label-separator&gt;</span> element has no attributes.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;chart:label-separator&gt;</span> element has the following child element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><h2 class="Heading_20_2"><a id="a17_25_style_drawing-page-properties_"><span style="margin-right:0.127cm;">17.25</span></a><a id="__RefHeading__1416532_253892949"/><a id="Presentation_Page_Attributes"/><a id="element-style_drawing-page-properties"/>&lt;style:drawing-page-properties&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;style:drawing-page-properties&gt;</span> element specifies formatting that can be applied to a <span class="Element">&lt;draw:page&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;style:drawing-page-properties&gt;</span> element is usable within the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;style:drawing-page-properties&gt;</span> element has the following attributes: <span class="Attribute">draw:background-size</span> <a href="#property-draw_background-size">20.93</a>, <span class="Attribute">draw:fill</span> <a href="#property-draw_fill">20.111</a>, <span class="Attribute">draw:fill-color</span> <a href="#property-draw_fill-color">20.112</a>, <span class="Attribute">draw:fill-gradient-name</span> <a href="#property-draw_fill-gradient-name">20.113</a>, <span class="Attribute">draw:fill-hatch-name</span> <a href="#property-draw_fill-hatch-name">20.114</a>, <span class="Attribute">draw:fill-hatch-solid</span> <a href="#property-draw_fill-hatch-solid">20.115</a>, <span class="Attribute">draw:fill-image-height</span> <a href="#property-draw_fill-image-height">20.116</a>, <span class="Attribute">draw:fill-image-name</span> <a href="#property-draw_fill-image-name">20.117</a>, <span class="Attribute">draw:fill-image-ref-point</span> <a href="#property-draw_fill-image-ref-point">20.118</a>, <span class="Attribute">draw:fill-image-ref-point-x</span> <a href="#property-draw_fill-image-ref-point-x">20.119</a>, <span class="Attribute">draw:fill-image-ref-point-y</span> <a href="#property-draw_fill-image-ref-point-y">20.120</a>, <span class="Attribute">draw:fill-image-width</span> <a href="#property-draw_fill-image-width">20.121</a>, <span class="Attribute">draw:gradient-step-count</span> <a href="#property-draw_gradient-step-count">20.130</a>, <span class="Attribute">draw:opacity</span> <a href="#property-draw_opacity">20.145</a>, <span class="Attribute">draw:opacity-name</span> <a href="#property-draw_opacity-name">20.146</a>, <span class="Attribute">draw:secondary-fill-color</span> <a href="#property-draw_secondary-fill-color">20.150</a>, <span class="Attribute">draw:tile-repeat-offset</span> <a href="#property-draw_tile-repeat-offset">20.168</a>, <span class="Attribute">presentation:background-objects-visible</span> <a href="#property-presentation_background-objects-visible">20.224</a>, <span class="Attribute">presentation:background-visible</span> <a href="#property-presentation_background-visible">20.225</a>, <span class="Attribute">presentation:display-date-time</span> <a href="#property-presentation_display-date-time">20.226</a>, <span class="Attribute">presentation:display-footer</span> <a href="#property-presentation_display-footer">20.227</a>, <span class="Attribute">presentation:display-header</span> <a href="#property-presentation_display-header">20.228</a>, <span class="Attribute">presentation:display-page-number</span> <a href="#property-presentation_display-page-number">20.229</a>, <span class="Attribute">presentation:duration</span> <a href="#property-presentation_duration">20.230</a>, <span class="Attribute">presentation:transition-speed</span> <a href="#property-presentation_transition-speed">20.231</a>, <span class="Attribute">presentation:transition-style</span> <a href="#property-presentation_transition-style">20.232</a>, <span class="Attribute">presentation:transition-</span><span class="Attribute">type</span> <a href="#property-presentation_transition-type">20.233</a>, <span class="Attribute">presentation:visibility</span> <a href="#property-presentation_visibility">20.234</a>, <span class="Attribute">smil:direction</span> <a href="#property-smil_direction">20.235</a>, <span class="Attribute">smil:fadeColor</span> <a href="#property-smil_fadeColor">20.236</a>, <span class="Attribute">smil:subtype</span> <a href="#property-smil_subtype">20.237</a>, <span class="Attribute">smil:type</span> <a href="#property-smil_type">20.238</a>, <span class="Attribute">style:repeat</span> <a href="#property-style_repeat">20.333</a> and <span class="Attribute">svg:fill-rule</span> <a href="#property-svg_fill-rule">20.396</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;style:drawing-page-properties&gt;</span> element has the following child element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><h1 class="Heading_20_1"><a id="a18Datatypes"><span style="margin-right:0.127cm;">18</span></a><a id="__RefHeading__1416534_253892949"/>Datatypes</h1><h2 class="Heading_20_2"><a id="a18_1Introduction"><span style="margin-right:0.127cm;">18.1</span></a><a id="__RefHeading__1416536_253892949"/>Introduction</h2><p class="Text_20_body">The values of attributes and elements have datatypes. This specification defines datatypes for values of elements and attributes of OpenDocument documents. </p><p class="Note"><span class="Note_20_Label">Note:</span> This specification and the schema make reference to other specifications for some datatype definitions. Some datatypes introduced here may be specializations of other datatypes defined here or in other specifications. </p><p class="Text_20_body"> </p><h2 class="Heading_20_2"><a id="a18_2W3C_Schema_Datatypes"><span style="margin-right:0.127cm;">18.2</span></a><a id="__RefHeading__30241806"/>W3C Schema Datatypes</h2><p class="Text_20_body">The following <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> datatypes are used in this specification:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-string"/>string<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-date"/>date<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-time"/>time<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-dateTime"/>dateTime<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-decimal"/>decimal<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-duration"/>duration<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-int"/>int <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-integer"/>integer<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-nonNegativeInteger"/>nonNegativeInteger<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-positiveInteger"/>positiveInteger<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-double"/>double<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-long"/>long<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-short"/>short<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-base64Binary"/>base64Binary<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-ID"/>ID<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-IDREF"/>IDREF<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-IDREFS"/>IDREFS<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="datatype-NCName"/>NCName<span class="odfLiEnd"/> </p></li></ul><h2 class="Heading_20_2"><a id="a18_3Other_Datatypes"><span style="margin-right:0.127cm;">18.3</span></a><a id="__RefHeading__1416538_253892949"/>Other Datatypes</h2><h3 class="Heading_20_3"><a id="a18_3_1angle"><span style="margin-right:0.127cm;">18.3.1</span></a><a id="__RefHeading__1416540_253892949"/><a id="datatype-angle"/>angle</h3><p class="Text_20_body">An angle, as defined in §4.1 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. An angle is a double value that may be followed immediately by one of the following angle unit identifiers: <span class="Attribute_20_Value_20_Fragment">deg</span> (degrees), <span class="Attribute_20_Value_20_Fragment">grad</span> (gradiants) or <span class="Attribute_20_Value_20_Fragment">rad</span> (radians). If no unit identifier is specified, the value is assumed to be in degrees.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> OpenDocument v1.1 did not support angle specifications that contain an angle unit identifier.  Angle unit identifiers should be omitted for compatibility with OpenDocument v1.1.</p><h3 class="Heading_20_3"><a id="a18_3_2anyIRI"><span style="margin-right:0.127cm;">18.3.2</span></a><a id="__RefHeading__1718306_1219268628"/><a id="datatype-anyIRI"/>anyIRI </h3><p class="Text_20_body">An IRI-reference as defined in <a title="Internationalized Resource Identifiers (IRIs)" href="http://www.ietf.org/rfc/rfc3987.txt">[RFC3987]</a>, expressed in an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> anyURI. </p><p class="Note"><span class="Note_20_Label">Note</span>: The procedure for resolution of anyIRI values that are not IRI values is undefined.</p><h3 class="Heading_20_3"><a id="a18_3_3boolean"><span style="margin-right:0.127cm;">18.3.3</span></a><a id="__RefHeading__1416542_253892949"/><a id="datatype-boolean"/>boolean</h3><p class="Text_20_body">A Boolean value may have either of the values <span class="Source_20_Text">true</span> or <span class="Source_20_Text">false</span>.</p><h3 class="Heading_20_3"><a id="a18_3_4cellAddress"><span style="margin-right:0.127cm;">18.3.4</span></a><a id="__RefHeading__1416544_253892949"/><a id="datatype-cellAddress"/>cellAddress</h3><p class="Text_20_body">A cell address as specified in <a href="#Referencing_Table_Cells">9.2.1</a>.</p><h3 class="Heading_20_3"><a id="a18_3_5cellRangeAddress"><span style="margin-right:0.127cm;">18.3.5</span></a><a id="__RefHeading__1416546_253892949"/><a id="datatype-cellRangeAddress"/>cellRangeAddress</h3><p class="Text_20_body">A cell range address as specified in <a href="#CellRangeAddress">9.2.3</a>.</p><h3 class="Heading_20_3"><a id="a18_3_6cellRangeAddressList"><span style="margin-right:0.127cm;">18.3.6</span></a><a id="__RefHeading__1416548_253892949"/><a id="datatype-cellRangeAddressList"/>cellRangeAddressList</h3><p class="Text_20_body">A cell range address list as specified in <a href="#CellRangeAddressList">9.2.5</a>.</p><h3 class="Heading_20_3"><a id="a18_3_7character"><span style="margin-right:0.127cm;">18.3.7</span></a><a id="__RefHeading__1416550_253892949"/><a id="datatype-character"/>character</h3><p class="Text_20_body">A character value is a string with only one character.</p><h3 class="Heading_20_3"><a id="a18_3_8clipShape"><span style="margin-right:0.127cm;">18.3.8</span></a><a id="__RefHeading__1416552_253892949"/><a id="datatype-clipShape"/>clipShape</h3><p class="Text_20_body">A clip shape as defined in §7.20.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. Offsets shall not be specified using the units <span class="Attribute_20_Value_20_Fragment">em</span> and <span class="Attribute_20_Value_20_Fragment">px</span>. </p><h3 class="Heading_20_3"><a id="a18_3_9color"><span style="margin-right:0.127cm;">18.3.9</span></a><a id="__RefHeading__1416554_253892949"/><a id="datatype-color"/>color</h3><p class="Text_20_body">A RGB color in conformance with §5.9.11 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>, that is a RGB color in notation “#rrggbb”, where rr, gg and bb are 8-bit hexadecimal digits.</p><h3 class="Heading_20_3"><a id="a18_3_10coordinate"><span style="margin-right:0.127cm;">18.3.10</span></a><a id="__RefHeading__1416556_253892949"/><a id="datatype-coordinate"/>coordinate</h3><p class="Text_20_body">A coordinate represents a length in a coordinate system. It specifies the distance from the origin of the coordinate system along the relevant axis.</p><h3 class="Heading_20_3"><a id="a18_3_11countryCode"><span style="margin-right:0.127cm;">18.3.11</span></a><a id="__RefHeading__1416558_253892949"/><a id="datatype-countryCode"/>countryCode</h3><p class="Text_20_body">A country code is a value that conforms to ISO 3166 (<a title="Codes for the representation of names of countries and their subdivisions -- Part 1: Country codes" href="International Organization for Standardization">[ISO3166-1]</a>, <a title="Codes for the representation of names of countries and their subdivisions -- Part 2: Country subdivision code" href="International Organization for Standardization">[ISO3166-2]</a>, <a title="Codes for the representation of names of countries and their subdivisions -- Part 3: Code for formerly used names of countries" href="International Organization for Standardization">[ISO3166-3]</a>, or their successors, and further parts). </p><p class="Text_20_body">See §2.2.4 Region Subtag of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><h3 class="Heading_20_3"><a id="a18_3_12CURIE"><span style="margin-right:0.127cm;">18.3.12</span></a><a id="__RefHeading__1416560_253892949"/><a id="datatype-CURIE"/>CURIE</h3><p class="Text_20_body">A CURIE, as described in §7 of <a title="RDFa in XHTML: Syntax and Processing" href="http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014">[RDFa]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_13CURIEs"><span style="margin-right:0.127cm;">18.3.13</span></a><a id="__RefHeading__1416562_253892949"/><a id="datatype-CURIEs"/>CURIEs</h3><p class="Text_20_body">A list of CURIEs, as described in §7 of <a title="RDFa in XHTML: Syntax and Processing" href="http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014">[RDFa]</a>, separated by whitespaces.</p><h3 class="Heading_20_3"><a id="a18_3_14dateOrDateTime"><span style="margin-right:0.127cm;">18.3.14</span></a><a id="__RefHeading__1416564_253892949"/><a id="datatype-dateOrDateTime"/>dateOrDateTime</h3><p class="Text_20_body">A dateOrDateTime value is either an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> date value or an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> dateTime value.</p><h3 class="Heading_20_3"><a id="a18_3_15distance"><span style="margin-right:0.127cm;">18.3.15</span></a><a id="__RefHeading__1416566_253892949"/><a id="datatype-distance"/>distance</h3><p class="Text_20_body">The length between two points.</p><h3 class="Heading_20_3"><a id="a18_3_16language"><span style="margin-right:0.127cm;">18.3.16</span></a><a id="__RefHeading__1416570_253892949"/><a id="datatype-language"/>language</h3><p class="Text_20_body">A language is a natural language identifier as defined by <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successor. The lexical space is the same as the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> language data type.</p><p class="Text_20_body"><span class="Note_20_Label">Note 1:</span> The language datatype is the same as the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> language datatype, except that its value range is not restricted to values of <a title="Tags for the Identification of Languages" href="http://www.ietf.org/rfc/rfc3066.txt">[RFC3066]</a>, but follows the syntax of the <span class="Alien_20_Attribute">xml:lang</span> attribute. See §2.12 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_17languageCode"><span style="margin-right:0.127cm;">18.3.17</span></a><a id="__RefHeading__1416572_253892949"/><a id="datatype-languageCode"/>languageCode</h3><p class="Text_20_body">A language code is a value that conforms to ISO 639 (<a title="Codes for the representation of names of languages -- Part 1: Alpha-2 code" href="International Organization for Standardization">[ISO639-1]</a>, <a title="Codes for the representation of names of languages -- Part 2: Alpha-3 code" href="International Organization for Standardization">[ISO639-2]</a>, <a title="Codes for the representation of names of languages -- Part 3: Alpha-3 code for comprehensive coverage of languages" href="International Organization for Standardization">[ISO639-3]</a> or their successors, and further parts). </p><p class="Text_20_body">See §2.2.1 Primary Language Subtag of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><h3 class="Heading_20_3"><a id="a18_3_18length"><span style="margin-right:0.127cm;">18.3.18</span></a><a id="__RefHeading__1416574_253892949"/><a id="datatype-length"/>length</h3><p class="Text_20_body">A (positive or negative) length, consisting of magnitude and unit, in conformance with the Units of Measure defined in §5.9.13 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. </p><h3 class="Heading_20_3"><a id="a18_3_19namespacedToken"><span style="margin-right:0.127cm;">18.3.19</span></a><a id="__RefHeading__1416576_253892949"/><a id="datatype-namespacedToken"/>namespacedToken</h3><p class="Text_20_body">A namespaced token is an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> QName that matches the definition of PrefixedName in §4 of <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_20nonNegativeLength"><span style="margin-right:0.127cm;">18.3.20</span></a><a id="__RefHeading__1416578_253892949"/><a id="datatype-nonNegativeLength"/>nonNegativeLength</h3><p class="Text_20_body">A measurement with a value that shall be zero or positive.</p><h3 class="Heading_20_3"><a id="a18_3_21nonNegativePixelLength"><span style="margin-right:0.127cm;">18.3.21</span></a><a id="__RefHeading__1416580_253892949"/><a id="datatype-nonNegativePixelLength"/><a id="DDE_LINK2311"/>nonNegativePixelLength</h3><p class="Text_20_body">A non-negative measurement that shall have the unit <span class="Attribute_20_Value_20_Fragment">px</span> (pixels).</p><h3 class="Heading_20_3"><a id="a18_3_22pathData"><span style="margin-right:0.127cm;">18.3.22</span></a><a id="__RefHeading__1416582_253892949"/><a id="datatype-pathData"/>pathData</h3><p class="Text_20_body">Path data as described in §8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. Attribute values of this data type <span class="ISO_20_Keyword">shall</span> match the BNF grammar for SVG path data in §8.3.9 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_23percent"><span style="margin-right:0.127cm;">18.3.23</span></a><a id="__RefHeading__1416584_253892949"/><a id="datatype-percent"/>percent</h3><p class="Text_20_body">(Positive or negative) percentage values in conformance with §5.9.11 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_24point3D"><span style="margin-right:0.127cm;">18.3.24</span></a><a id="__RefHeading__1416586_253892949"/><a id="datatype-point3D"/>point3D</h3><p class="Text_20_body">A 3D point. The syntax of a 3D point is the same as that of a <span class="Misc_20_Source">vector3D</span>, except that each coordinate is shall be followed by a unit.</p><h3 class="Heading_20_3"><a id="a18_3_25points"><span style="margin-right:0.127cm;">18.3.25</span></a><a id="__RefHeading__1416588_253892949"/><a id="datatype-points"/>points</h3><p class="Text_20_body">A sequence of points. Each point consists of two integer coordinates separated by a comma “,” (U+002C, COMMA). The points are separated by white space.</p><h3 class="Heading_20_3"><a id="a18_3_26positiveLength"><span style="margin-right:0.127cm;">18.3.26</span></a><a id="__RefHeading__1416590_253892949"/><a id="datatype-positiveLength"/>positiveLength</h3><p class="Text_20_body">A measurement with a value that shall be positive.</p><h3 class="Heading_20_3"><a id="a18_3_27relativeLength"><span style="margin-right:0.127cm;">18.3.27</span></a><a id="__RefHeading__1416592_253892949"/><a id="datatype-relativeLength"/>relativeLength</h3><p class="Text_20_body">A relative length is a positive integer, followed by a ”*” (U+002A, ASTERISK) character.</p><h3 class="Heading_20_3"><a id="a18_3_28safeCURIE"><span style="margin-right:0.127cm;">18.3.28</span></a><a id="__RefHeading__1416594_253892949"/><a id="datatype-safeCURIE"/>safeCURIE</h3><p class="Text_20_body">A safe CURIE, as described in §7 of <a title="RDFa in XHTML: Syntax and Processing" href="http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014">[RDFa]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_29scriptCode"><span style="margin-right:0.127cm;">18.3.29</span></a><a id="__RefHeading__1416596_253892949"/><a id="datatype-scriptCode"/>scriptCode</h3><p class="Text_20_body">A script code conforming to <a title="Information and documentation -- Codes for the representation of names of scripts" href="International Organization for Standardization">[ISO15924]</a>, or its successors. See §2.2.3 Script Subtag of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><h3 class="Heading_20_3"><a id="a18_3_30signedZeroToHundredPercent"><span style="margin-right:0.127cm;">18.3.30</span></a><a id="__RefHeading__1416598_253892949"/><a id="datatype-signedZeroToHundredPercent"/>signedZeroToHundredPercent</h3><p class="Text_20_body">Percentage values in the range [-100%,100%] in conformance with §5.9.11 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. </p><h3 class="Heading_20_3"><a id="a18_3_31styleName"><span style="margin-right:0.127cm;">18.3.31</span></a><a id="__RefHeading__1416600_253892949"/><a id="datatype-styleName"/>styleName</h3><p class="Text_20_body">A NCName as specified in <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> that is the name of a style.</p><h3 class="Heading_20_3"><a id="a18_3_32styleNameRef"><span style="margin-right:0.127cm;">18.3.32</span></a><a id="__RefHeading__1416602_253892949"/><a id="datatype-styleNameRef"/>styleNameRef</h3><p class="Text_20_body">A NCName as specified in <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> that is the name of a referenced style, or an empty value.</p><h3 class="Heading_20_3"><a id="a18_3_33styleNameRefs"><span style="margin-right:0.127cm;">18.3.33</span></a><a id="__RefHeading__1416604_253892949"/><a id="datatype-styleNameRefs"/>styleNameRefs</h3><p class="Text_20_body">A white space separated list of NCNames as specified in <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> that are the names of a styles.</p><h3 class="Heading_20_3"><a id="a18_3_34targetFrameName"><span style="margin-right:0.127cm;">18.3.34</span></a><a id="__RefHeading__1416606_253892949"/><a id="datatype-targetFrameName"/>targetFrameName</h3><p class="Text_20_body">The name of a target frame in conformance with §6.16 of <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_35textEncoding"><span style="margin-right:0.127cm;">18.3.35</span></a><a id="__RefHeading__1416608_253892949"/><a id="datatype-textEncoding"/>textEncoding</h3><p class="Text_20_body">A character encoding in the notation described in the §4.3.3 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>, or the value <span class="Attribute_20_Value_20_Instance">x-symbol</span>. The value is <span class="Attribute_20_Value_20_Instance">x-symbol</span> means that the character encoding is not enumerated by §4.3.3 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_36timeOrDateTime"><span style="margin-right:0.127cm;">18.3.36</span></a><a id="__RefHeading__1416610_253892949"/><a id="datatype-timeOrDateTime"/>timeOrDateTime</h3><p class="Text_20_body">A timeOrDateTime value is either an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> time or an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> dateTime value.</p><h3 class="Heading_20_3"><a id="a18_3_37URIorSafeCURIE"><span style="margin-right:0.127cm;">18.3.37</span></a><a id="__RefHeading__1416612_253892949"/><a id="datatype-URIorSafeCURIE"/>URIorSafeCURIE</h3><p class="Text_20_body">An IRI or a safe CURIE, as described in §7 of <a title="RDFa in XHTML: Syntax and Processing" href="http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014">[RDFa]</a>.</p><h3 class="Heading_20_3"><a id="a18_3_38valueType"><span style="margin-right:0.127cm;">18.3.38</span></a><a id="__RefHeading__1416614_253892949"/><a id="datatype-valueType"/>valueType</h3><p class="Text_20_body">A list of value types.,</p><h3 class="Heading_20_3"><a id="a18_3_39variableName"><span style="margin-right:0.127cm;">18.3.39</span></a><a id="__RefHeading__1416616_253892949"/><a id="datatype-variableName"/>variableName</h3><p class="Text_20_body">A string specifying the name of a variable</p><h3 class="Heading_20_3"><a id="a18_3_40vector3D"><span style="margin-right:0.127cm;">18.3.40</span></a><a id="__RefHeading__1416618_253892949"/><a id="datatype-vector3D"/>vector3D</h3><p class="Text_20_body">A 3-element vector that is represented by floating point x, y, z coordinates. The format of a vector3D value is whitespace separated tokens in the order x, y, and z, and that expression starts with "(" (LEFT PARENTHESIS U+0028) and ends with ")" (RIGHT PARENTHESIS U+0029). If this value represents a normal, then it should be normalized.</p><h3 class="Heading_20_3"><a id="a18_3_41zeroToHundredPercent"><span style="margin-right:0.127cm;">18.3.41</span></a><a id="__RefHeading__1416620_253892949"/><a id="datatype-zeroToHundredPercent"/>zeroToHundredPercent</h3><p class="Text_20_body">Percentage values in the range [0%,100%] in conformance with §5.9.11 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><h1 class="Heading_20_1"><a id="a19General_Attributes"><span style="margin-right:0.127cm;">19</span></a><a id="__RefHeading__1416622_253892949"/><a id="General_Attributes"/>General Attributes</h1><h2 class="Heading_20_2"><a id="a19_1General"><span style="margin-right:0.127cm;">19.1</span></a><a id="__RefHeading__1416624_253892949"/>General</h2><p class="Text_20_body">Attributes for elements defined by OpenDocument are divided between those used by structural elements (<a href="#General_Attributes">19</a>) versus those used by <span class="Alien_20_Element">&lt;style:*-properties&gt;</span> elements (<a href="#Formatting_Attributes">20</a>).</p><p class="Text_20_body">Attributes have <span class="Def">default values</span> defined by this standard. When any element appears in a document instance without such an attribute, consumers <span class="ISO_20_Keyword">should</span> behave as if the attribute is present with the defined default value.</p><h2 class="Heading_20_2"><a id="a19_2anim_color-interpolation"><span style="margin-right:0.127cm;">19.2</span></a><a id="__RefHeading__1416626_253892949"/><a id="attribute-anim_color-interpolation"/>anim:color-interpolation</h2><p class="Text_20_body">The <span class="Attribute">anim:color-interpolation</span> attribute specifies the color space that is used for color interpolation.</p><p class="Text_20_body">The defined values for the <span class="Attribute">anim:color-interpolation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hsl</span>: HSL (hue, saturation, lightness) color model.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">gb</span>: RGB (red, green, blue) color model.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">rgb</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">anim:color-interpolation</span> attribute is usable with the following element: <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">anim:color-interpolation</span> attribute are <span class="Attribute_20_Value">rgb</span> or <span class="Attribute_20_Value">hsl</span>.</p><h2 class="Heading_20_2"><a id="a19_3anim_color-interpolation-direction"><span style="margin-right:0.127cm;">19.3</span></a><a id="__RefHeading__1416628_253892949"/><a id="attribute-anim_color-interpolation-direction"/>anim:color-interpolation-direction</h2><p class="Text_20_body">The <span class="Attribute">anim:color-interpolation-direction</span> attribute specifies the direction that is used for color interpolation. This is only valid for the HSL color space.</p><p class="Text_20_body">The defined values for the <span class="Attribute">anim:color-interpolation-direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">clockwise</span>: color interpolation proceeds in a clockwise direction.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">ounterclockwise</span>: color interpolation proceeds in a counterclockwise direction.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">clockwise</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">anim:color-interpolation-direction</span> attribute is usable with the following element: <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">anim:color-interpolation-direction</span> attribute are <span class="Attribute_20_Value">clockwise</span> or <span class="Attribute_20_Value">counter-clockwise</span>.</p><h2 class="Heading_20_2"><a id="a19_4anim_audio-level"><span style="margin-right:0.127cm;">19.4</span></a><a id="__RefHeading__1416630_253892949"/><a id="attribute-anim_audio-level"/>anim:audio-level</h2><p class="Text_20_body">The <span class="Attribute">anim:audio-level</span> attribute specifies the audio volume during a playback. </p><p class="Text_20_body">The defined value range for the <span class="Attribute">anim:audio-level</span> attribute is a rational number between <span class="Attribute_20_Value_20_Instance">0</span> (inaudible) and <span class="Attribute_20_Value_20_Instance">1</span> (system volume), inclusive. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:audio-level</span> attribute is usable with the following element: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:audio-level</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_5anim_command"><span style="margin-right:0.127cm;">19.5</span></a><a id="__RefHeading__1416632_253892949"/><a id="attribute-anim_command"/>anim:command</h2><p class="Text_20_body">The <span class="Attribute">anim:command</span> attribute specifies an animation command.</p><p class="Text_20_body">The defined values for the <span class="Attribute">anim:command</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">custom</span>: the command is user defined.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">verb</span>: the command targets an embedded <a title="Inside OLE">[OLE]</a> object. <a href="#element-draw_object-ole">10.4.6.3</a>. The parameter <span class="Attribute_20_Value_20_Instance">verb</span> is the verb number executed at the embedded object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">play</span>: the command targets a media shape and starts its playback. The parameter <span class="Attribute_20_Value_20_Instance">media-time</span> defines the playback start time in seconds. If this parameter is not set, playback starts at the last position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">toggle-pause</span>: the command targets a media shape and toggles its playback state from play to paused or from paused to play.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">stop</span>: the command targets a media shape and stops its playback.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">stop-audio</span>: the command has no target and stops all running audio playback.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If the value of the <span class="Attribute">anim:command</span> attribute is <span class="Attribute_20_Value_20_Instance">custom</span>, then there shall be a <span class="Element">&lt;anim:param&gt;</span> child element whose <span class="Attribute">anim:name</span> attribute and <span class="Attribute">anim:value</span> attribute values are user defined.</p><p class="Text_20_body">If the value of the <span class="Attribute">anim:command</span> attribute is <span class="Attribute_20_Value_20_Instance">verb</span>, then there shall be a <span class="Element">&lt;anim:param&gt;</span> child element whose <span class="Attribute">anim:name</span> attribute value is <span class="Attribute_20_Value_20_Instance">verb</span> and whose <span class="Attribute">anim:value</span> attribute value contains the verb number. </p><p class="Text_20_body">If the value of the <span class="Attribute">anim:command</span> attribute is <span class="Attribute_20_Value_20_Instance">play</span>, then there shall be a <span class="Element">&lt;anim:param&gt;</span> child element whose <span class="Attribute">anim:name</span> attribute value is <span class="Attribute_20_Value_20_Instance">play</span> and whose <span class="Attribute">anim:value</span> attribute value contains a value expressed in seconds. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:command</span> attribute is usable with the following element: <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:command</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_6anim_formula"><span style="margin-right:0.127cm;">19.6</span></a><a id="__RefHeading__1416634_253892949"/><a id="attribute-anim_formula"/>anim:formula</h2><p class="Text_20_body">The <span class="Attribute">anim:formula</span> attribute specifies a formula used in an animation function. </p><p class="Text_20_body">The following is the minimum supported grammar:</p><p class="Code_borderStart">formula::= additive_expression</p><p class="Code"/><p class="Code">identifier::= '$' | 'pi' | 'e' | 'x' | 'y' | 'width' | 'height'</p><p class="Code">function::= 'abs'|'sqrt'|'sin'|'cos'|'tan'|'atan'|'acos'|'asin'|'exp'|'log'</p><p class="Code">binary_function::= 'min'|'max'</p><p class="Code">basic_expression::= number</p><p class="Code">    | identifier</p><p class="Code">    | unary_function S* '(' S* additive_expression S* ')'</p><p class="Code">    | binary_function S* '(' S* additive_expression S* ','     S*additive_expression S* ')'</p><p class="Code">    | '(' S* additive_expression S* ')'</p><p class="Code"/><p class="Code">unary_expression::= '-' S* basic_expression | basic_expression</p><p class="Code">multiplicative_expression::= unary_expression ( ( S* '*' S* unary_expression )</p><p class="Code">    | ( S* '/' S* unary_expression ) )*</p><p class="Code">additive_expression::= multiplicative_expression ( ( S* '+' S* multiplicative_expression )</p><p class="Code">    | ( S* '-' S* multiplicative_expression ) )*</p><p class="Code">number::= sign? integer | sign? Floating-point-constant</p><p class="Code">floating-point-constant::= fractional-constant exponent? | integer exponent</p><p class="Code">fractional-constant::= integer? '.' integer | integer '.'</p><p class="Code">exponent::= ( 'e' | 'E' ) sign? Integer</p><p class="Code">sign::= '+' | '-'</p><p class="Code">integer::= [0-9]+</p><p class="Code_borderEnd">S::= (#x20 | #x9)</p><p class="Text_20_body">The defined identifiers for the <span class="Attribute">anim:formula</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">"$"</span> (U+0024, DOLLAR SIGN): The identifier ”$” is replaced by a value between 0 and 1 (inclusive) that represents a proportional offset into an animation element's duration. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">pi</span>: The Pi constant. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">When the <span class="Attribute">anim:formula</span> attribute appears on a descendant element of <span class="Element">&lt;office:presentation&gt;</span>, it may use the following additional identifiers:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">e</span>: the Euler constant.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">x</span>: the animated elements left edge in screen space where 0 is the left edge of the screen and 1 is the right edge.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">y</span>: the animated elements top edge in screen space, where 0 is the top edge of the screen and 1 is the bottom edge.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">width</span>: the animated elements width in screen space, where 0 is no width and 1 is the screen's width.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">height</span>: the animated elements height in screen space, where 0 is no height and 1 is the screen's height.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If an <span class="Attribute">anim:formula</span> attribute is given, it overrides the <span class="Attribute">smil:values</span>, <span class="Attribute">smil:to</span>, <span class="Attribute">smil:from</span> and <span class="Attribute">smil:by</span> attributes as specified in <a href="#Simple_Animation_Functions">15.3.2</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:formula</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:formula</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_7anim_id__deprecated_"><span style="margin-right:0.127cm;">19.7</span></a><a id="__RefHeading__1416636_253892949"/><a id="attribute-anim_id"/>anim:id (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">anim:id</span> attribute specifies an identifier to an animation element.</p><p class="Text_20_body">OpenDocument consumers shall ignore an <span class="Attribute">anim:id</span> attribute if it occurs on an element with an <span class="Attribute">xml:id</span> attribute value. </p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">anim:id</span> attributes for elements in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body"> The value of an <span class="Attribute">anim:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same element. </p><p class="Text_20_body">The <span class="Attribute">anim:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:id</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_8anim_iterate-interval"><span style="margin-right:0.127cm;">19.8</span></a><a id="__RefHeading__1416638_253892949"/><a id="attribute-anim_iterate-interval"/>anim:iterate-interval</h2><p class="Text_20_body">The <span class="Attribute">anim:iterate-interval</span> attribute specifies the time interval between effects that are children of <span class="Element">&lt;anim:iterate&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:iterate-interval</span> attribute is usable with the following element: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:iterate-interval</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_9anim_iterate-type"><span style="margin-right:0.127cm;">19.9</span></a><a id="__RefHeading__1416640_253892949"/><a id="attribute-anim_iterate-type"/>anim:iterate-type</h2><p class="Text_20_body">The <span class="Attribute">anim:iterate-type</span> attribute of a <span class="Element">&lt;anim:iterate&gt;</span> element specifies the iteration of child elements.</p><p class="Text_20_body">The defined values for the <span class="Attribute">anim:iterate-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">by-letter</span>: the target shape or paragraph is iterated by letters.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">by-paragraph</span>: the target shape is iterated by paragraphs.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">by-word</span>: the target shape or paragraph is iterated by words.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:iterate-type</span> attribute is usable with the following element: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:iterate-type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_10anim_name"><span style="margin-right:0.127cm;">19.10</span></a><a id="__RefHeading__1416642_253892949"/><a id="attribute-anim_name"/>anim:name</h2><p class="Text_20_body">The <span class="Attribute">anim:name</span> attribute specifies the name of a parameter for an <span class="Element">&lt;anim:command&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:name</span> attribute is usable with the following element: <span class="Element">&lt;anim:param&gt;</span> <a href="#element-anim_param">15.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_11anim_sub-item"><span style="margin-right:0.127cm;">19.11</span></a><a id="__RefHeading__1416644_253892949"/><a id="attribute-anim_sub-item"/>anim:sub-item</h2><p class="Text_20_body">The <span class="Attribute">anim:sub-item</span> attribute specifies components of a target element for application of animation effects. </p><p class="Text_20_body">The defined values for the <span class="Attribute">anim:sub-item</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">background</span>: animates only a shape's background and not its text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">text</span>: animates only the text of a shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">whole</span>: animates both a shape and its text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:sub-item</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:sub-item</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_12anim_value"><span style="margin-right:0.127cm;">19.12</span></a><a id="__RefHeading__1416646_253892949"/><a id="attribute-anim_value"/>anim:value</h2><p class="Text_20_body">The <span class="Attribute">anim:value</span> attribute specifies the value of a parameter for an <span class="Element">&lt;anim:command&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">anim:value</span> attribute is usable with the following element: <span class="Element">&lt;anim:param&gt;</span> <a href="#element-anim_param">15.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">anim:value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_13chart_attached-axis"><span style="margin-right:0.127cm;">19.13</span></a><a id="__RefHeading__1416648_253892949"/><a id="attribute-chart_attached-axis"/>chart:attached-axis</h2><p class="Text_20_body">The <span class="Attribute">chart:attached-axis</span> attribute specifies an axis to be used with a series. The value shall be the name of an axis as defined with the <span class="Attribute">chart:name</span> attribute on a <span class="Element">&lt;chart:axis&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:attached-axis</span> attribute is usable with the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:attached-axis</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_14chart_automatic-content"><span style="margin-right:0.127cm;">19.14</span></a><a id="__RefHeading__1416650_253892949"/><a id="attribute-chart_automatic-content"/>chart:automatic-content</h2><p class="Text_20_body">The <span class="Attribute">chart:automatic-content</span> attribute specifies if an equation to be displayed should be calculated automatically or if text given within a <span class="Element">&lt;text:p&gt;</span> element should be used instead.</p><p class="Text_20_body">If no <span class="Element">&lt;text:p&gt;</span> element is provided, the <span class="Attribute">chart:automatic-content</span> attribute is assumed to be <span class="Attribute_20_Value">true</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:automatic-content</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the text within a <span class="Element">&lt;text:p&gt;</span> element is displayed. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: an equation is calculated and displayed automatically.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">chart:automatic-content</span> attribute is usable with the following element: <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:automatic-content</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_15chart_class"><span style="margin-right:0.127cm;">19.15</span></a><a id="__RefHeading__1416652_253892949"/><a id="attribute-chart_class"/>chart:class</h2><h3 class="Heading_20_3"><a id="a19_15_1_chart_chart____chart_series_"><span style="margin-right:0.127cm;">19.15.1</span></a><a id="__RefHeading__1416654_253892949"/><a id="attribute-chart_class_element-chart_chart"/><a id="attribute-chart_class_element-chart_series"/>&lt;chart:chart&gt;, &lt;chart:series&gt;</h3><p class="Text_20_body">The <span class="Attribute">chart:class</span> attribute specifies a chart type. The value is a namespaced token. The values for the predefined chart types are defined within the chart namespace ( urn:oasis:names:tc:opendocument:xmlns:chart:1.0).</p><p class="Text_20_body">The term <span class="Def">line attributes</span> is used in defining <span class="Attribute">chart:class</span> values to refer to the attributes of the <span class="Element">&lt;style:graphic-properties&gt;</span> element within a chart style: <span class="Attribute">draw:stroke</span>, <span class="Attribute">svg:stroke-color</span>, <span class="Attribute">svg:stroke-width</span>, <span class="Attribute">svg:stroke-opacity</span>, <span class="Attribute">draw:stroke-dash</span> and <span class="Attribute">draw:stroke-linejoin</span>.</p><p class="Text_20_body">The term <span class="Def">fill attributes</span> is used in defining <span class="Attribute">chart:class</span> values to refer to the attributes of the <span class="Element">&lt;style:graphic-properties&gt;</span> element within a chart style: <span class="Attribute">draw:fill</span>, <span class="Attribute">draw:fill-color</span>, <span class="Attribute">draw:fill-gradient-name</span>, <span class="Attribute">draw:gradient-step-count</span>, <span class="Attribute">draw:fill-hatch-name</span>, <span class="Attribute">draw:fill-hatch-solid</span>, <span class="Attribute">draw:fill-image-name</span>, <span class="Attribute">style:repeat</span>, <span class="Attribute">draw:fill-image-height</span>, <span class="Attribute">draw:fill-image-width</span>, <span class="Attribute">draw:fill-image-ref-point</span>, <span class="Attribute">draw:fill-image-ref-point-x</span>, <span class="Attribute">draw:fill-image-ref-point-y</span>, <span class="Attribute">draw:tile-repeat-offset</span>, <span class="Attribute">draw:opacity</span> and <span class="Attribute">draw:opacity-name</span>. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:class</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:area</span> –The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as y-coordinates within a Cartesian coordinate system with horizontal x-axis and vertical y-axis. The accessory x-coordinates are generated from the positions in the y-value sequence starting with 1.0. The first y value gets an x value 1.0. The second y value is associated with an x value of 2.0 and so forth. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" a left handed three-dimensional Cartesian coordinate system is used with horizontal x-axis and vertical y-axis (prior to any 3D scene transformations). <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:deep</span>="<span class="Attribute_20_Value">true</span>" the z-coordinates are generated from the order of the series elements starting with 1.0. The first series has an associated z-coordinate of 1.0. The second series has a z-coordinate 2.0 and so forth. The series names are used as labels at the z-axis.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The area in the xy-pane between the data points and the x-axis is filled (chart:origin <a href="#property-chart_origin">20.39</a>). <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:stacked</span>="<span class="Attribute_20_Value">true</span>" the area between a series and the previous series is filled. The filling is done as indicated by the fill attributes of the series. A border is drawn as specified by the line attributes of the series. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:bar</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as y-coordinates within a Cartesian coordinate system with horizontal x-axis and vertical y-axis. The accessory x-coordinates are generated from the positions in the y-value sequence starting with 1.0. The first y value gets an x value 1.0. The second y value is associated with an x value of 2.0 and so forth. The <span class="Element">&lt;chart:categories&gt;</span> element&gt; can be used to define labels for the x-axis. Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" a left handed three-dimensional Cartesian coordinate system is used with horizontal x-axis and vertical y-axis (prior to any 3D scene transformations).<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:deep</span>="<span class="Attribute_20_Value">true</span>" the z-coordinates are generated from the order of the series elements starting with 1.0. The first series has an associated z-coordinate of 1.0. The second series has a z-coordinate 2.0 and so forth. The series names are used as labels at the z-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Bars are displayed for each data point starting at the x-axis and ending at the indicated y-coordinate (see <span class="Attribute">chart:origin</span> for more details). In case of <span class="Attribute">chart:stacked</span>="<span class="Attribute_20_Value">true</span>" the bar starts at the previous series instead of the x-axis. The width and exact position of the bars along the x-axis is influenced by the attributes <span class="Attribute">chart:gap-width</span>, <span class="Attribute">chart:overlap</span>, <span class="Attribute">chart:group-bars-per-axis</span>, <span class="Attribute">chart:stacked</span> and <span class="Attribute">chart:percentage</span>. In case of <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">false</span>" the bars are simple rectangles. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" the shape of the bars are defined by a <span class="Attribute">chart:solid-type</span> attribute. A <span class="Attribute">chart:vertical</span> attribute indicates whether the positions of x- and y-axis should be swapped, resulting in a horizontal y-axis and vertical x-axis. The bars are filled as indicated by the fill attributes of the series and points. A border is drawn as specified by the line attributes. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:bubble</span> – Circles(bubbles) with different sizes are displayed in a Cartesian coordinate system with horizontal x-axis and vertical y-axis. The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as relative bubble area. The values for the y-coordinates are given by the first <span class="Element">&lt;chart:domain&gt;</span> element. The values for the x-coordinates are given by the second <span class="Element">&lt;chart:domain&gt;</span> element. The bubbles are filled as indicated by the fill attributes of the series and points. A border is drawn as specified by the line attributes. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:circle</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are displayed as pie chart. For a value sequence a circle is divided into sectors, the angle of a sector represents the relative weight of a value. Only one series can be displayed with this chart type. By default, the segments are arranged counter clockwise starting at 12 o'clock. To arrange the segments in clockwise order the attribute <span class="Attribute">chart:reverse-direction</span> at the y-axis is set to true. The <span class="Attribute">chart:angle-offset</span> attribute is used to rotate the pie. The <span class="Element">&lt;chart:categories&gt;</span> element at the x-axis can be used to define categories for the data points. The segments are filled as indicated by the fill attributes of the series and points. A border is drawn as specified by the line attributes. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:filled-radar</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as radius-coordinates within a counter clockwise polar coordinate system. The angle axis starts at 12 o'clock. The axis element with <span class="Attribute">chart:dimension</span>="<span class="Attribute_20_Value">y</span>" is interpreted as radius axis. The axis element with <span class="Attribute">chart:dimension</span>="<span class="Attribute_20_Value">x</span>" is interpreted as angle axis. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. The x-coordinates are generated from the positions in the value sequence starting with 1.0. First value gets an x value 1.0. The second value is associated with an x value of 2.0 and so forth. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The area surrounded by the data points is filled as indicated by the fill attributes of the series. In case of <span class="Attribute">chart:stacked</span>="<span class="Attribute_20_Value">true</span>" the area between a series and the previous series is filled instead. A border is drawn as specified by the line attributes. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:gantt</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute of two <span class="Element">&lt;chart:series&gt;</span> (marked as being of type <span class="Attribute_20_Value_20_Instance">chart:gantt</span>) are interpreted <br/><span style="margin-left:0.6401cm"/>together to form the start and end values (in this order) in a gantt chart. Start and end values are displayed at the y-axis in a Cartesian coordinate system with horizontal x-axis and vertical y-axis. The accessory x-coordinates are generated from the positions in the y-value sequence starting with 1.0. The first y value gets an x value 1.0. The second y value is associated with an x value of 2.0 and so forth. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>For each x-coordinate, a bar is displayed, starting at the start value and ending at the end value. The fill and line attributes of the series and points specify how the bars are to be displayed. If the end value is greater than or equal to the start value the style of the first series, shall be used. If the end value is smaller than the start value, the styles of the second series shall be used. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:line</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as y-coordinates within a Cartesian coordinate system with horizontal x-axis and vertical y-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The accessory x-coordinates are generated from the positions in the y-value sequence starting with 1.0. The first y value gets an x value 1.0. The second y value is associated with an x value of 2.0 and so forth. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" a left handed three-dimensional Cartesian coordinate system is used with horizontal x-axis and vertical y-axis (prior to any 3D scene transformations). <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:deep</span>="<span class="Attribute_20_Value">true</span>" the z-coordinates are generated from the order of the series elements starting with 1.0. The first series has an associated z-coordinate of 1.0. The second series has a z-coordinate 2.0 and so forth. The series names are used as labels at the z-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">false</span>" the data points are connected with a line as specified by the line attributes of the series. By default a solid line is drawn. If symbols should be used for the data points this shall be specified with the <span class="Attribute">chart:symbol-type</span> attribute. The fill attributes of the series and data points specify how the symbols are filled. By default. the symbols are filled solid with the same color as the connecting line. In case no line color is given but a fill color, the line uses the fill color. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" no symbols are shown. The data points are connected with a line that is extruded in z direction. The extruded line is filled as specified by the fill attributes of the series. A border is drawn as specified by the line attributes. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The attribute <span class="Attribute">chart:interpolation</span> within the chart style at the plot-area specifies which type of interpolation is used while connecting the points with lines. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:radar</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as radius-coordinates within a counter clockwise polar coordinate system. The angle axis starts at 12 o'clock. The axis element with <span class="Attribute">chart:dimension</span>="<span class="Attribute_20_Value">y</span>" is interpreted as radius axis. The axis element with <span class="Attribute">chart:dimension</span>="<span class="Attribute_20_Value">x</span>" is interpreted as angle axis. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. The x-coordinates are generated from the positions in the value sequence starting with 1.0. First value gets an x value 1.0. The second value is associated with an x value of 2.0 and so forth. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The data points are connected with a line as specified by the line attributes of the series. By default a solid line is drawn. If symbols should be used for the data points this shall be specified with the <span class="Attribute">chart:symbol-type</span> attribute. The fill attributes of the series and data points specify how the symbols are filled. By default, the symbols are filled solid with the same color as the connecting line. In case no line color is given but a fill color, the line uses the fill color. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:ring</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are displayed as one ring in a donut chart. For a given value sequence, the ring is divided into sectors, the angle of a sector represents the relative weight of a value. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>By default, segments are arranged counter clockwise starting at 12 o'clock. To arrange the segments in clockwise order the attribute <span class="Attribute">chart:reverse-direction</span> at the y-axis is set to "<span class="Attribute_20_Value">true</span>". The <span class="Attribute">chart:angle-offset</span> attribute is used to rotate the donut. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>By default, the first series of class ring forms the inner ring and the last series forms the outermost ring. To arrange the rings in opposite order the attribute <span class="Attribute">chart:reverse-direction</span> is set to "<span class="Attribute_20_Value">true</span>" at the x-axis. The attribute <span class="Attribute">chart:hole-size</span> is used to influence the inner hole size. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The <span class="Element">&lt;chart:categories&gt;</span> element at the x-axis can be used to define categories for the data points. The segments are filled as specified by the fill attributes of the series and points. A border is drawn around a segment as specified by the line attributes. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:scatter</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on a <span class="Element">&lt;chart:series&gt;</span> element are interpreted as y-coordinates within a Cartesian coordinate system with horizontal x-axis and vertical y-axis. The values for the x-coordinates are given by the first <span class="Element">&lt;chart:domain&gt;</span> element. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" a left handed three-dimensional Cartesian coordinate system is used with horizontal x-axis and vertical y-axis (prior to any 3D scene transformations). <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:deep</span>="<span class="Attribute_20_Value">true</span>" the z-coordinates are generated from the order of the series elements starting with 1.0. The first series has an associated z-coordinate of 1.0. The second series has a z-coordinate 2.0 and so forth. The series names are used as labels at the z-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">false</span>" the data points are connected with a line as specified by the line attributes of the series. By default a solid line is drawn. If symbols should be used for the data points this shall be specified with the <span class="Attribute">chart:symbol-type</span> attribute. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The fill attributes of the series and data points specify how the symbols are filled. By default the symbols are filled solid with the same color as the connecting line. In case no line color is given but a fill color, the line uses the fill color. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" no symbols are shown. The data points are connected with a line that is extruded in z direction. The extruded line is filled as specified by the fill attributes of the series. A border is drawn as specified by the line attributes. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The attribute <span class="Attribute">chart:interpolation</span> within the chart style at the plot-area specifies which type of interpolation is used while connecting the points with lines. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:stock</span> – The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on up to four <span class="Element">&lt;chart:series&gt;</span> (marked as being of type <span class="Attribute_20_Value_20_Instance">chart:stock</span>) are interpreted together to form the opening, minimum, maximum and closing (in this order) values of a stock symbol displayed at the y scale in a Cartesian coordinate system with horizontal x-axis and vertical y-axis. If only three series are given, the values are interpreted as minimum, maximum and closing values (in this order). The accessory x-coordinates are generated from the positions in the y-value sequence starting with 1.0. The first y value gets an x value 1.0. The second y value is associated with an x value of 2.0 and so forth. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>For each x-coordinate, the minimum and maximum y-values are connected with a line. The line style is specified with element <span class="Element">&lt;chart:stock-range-line&gt;</span>. The <span class="Attribute">chart:japanese-candle-stick</span> attribute specifies the display of opening and closing values in a stock chart. In case of <span class="Attribute">chart:japanese-candle-stick</span>="<span class="Attribute_20_Value">false</span>" opening and closing values are displayed as left and right tick-lines in the same style as the line connecting minimum and maximum value. This is the default. Only in case of <span class="Attribute">chart:japanese-candle-stick</span>="<span class="Attribute_20_Value">true</span>" a bar is drawn from opening to closing value. The styles to use for those bars are defined with elements <span class="Element">&lt;chart:stock-gain-marker&gt;</span> and <span class="Element">&lt;chart:stock-loss-marker&gt;</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">chart:surface</span> – Depending on the size of the range specified by <span class="Attribute">chart:values-cell-range-address</span> attribute of the first <span class="Element">&lt;chart:series&gt;</span> element one of two types of surfaces is rendered:<span class="odfLiEnd"/> </p><ul><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the <span class="Attribute">chart:value</span><span class="Attribute">s</span><span class="Attribute">-cell-range-address</span> attribute of the first <span class="Element">&lt;char</span><span class="Element">t:series&gt;</span> element specifies a range with more than one row and more than one column, the first version of a surface chart is rendered:<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The value in the ith column and jth row of the cell range given by the <span class="Attribute">chart:values-cell-range-address</span> attribute of the <span class="Element">&lt;chart:series&gt;</span> element (marked as being of type <span class="Attribute_20_Value_20_Instance">chart:surface</span>) is the altitude corresponding to the x-value i and the y-value j unless <span class="Element">&lt;chart:domain&gt;</span> elements are contained in the <span class="Element">&lt;chart:series&gt;</span> element. <span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>If <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" a surface chart is displayed in a right-handed three-dimensional Cartesian coordinate system with horizontal x-axis (from left to right), a perspective y-axis running from the front to the right rear and a vertical z-axis (prior to any 3D scene transformation). The altitude values are displayed on the z-axis in this case. The surface is displayed as specified by the line and fill attributes of the first series. Furthermore the <span class="Element">&lt;chart:data-point&gt;</span> elements of the series can be used to specify differing fill and line styles for the different altitude intervals. The surface within the first major interval (starting at lower values) is displayed with the line and fill attributes of the first data-point, within the second major interval the surface is displayed with the line and fill attributes of the second data-point and so on.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">false</span>" a contour plot is displayed in a 2 dimensional Cartesian coordinate system with horizontal x-axis and vertical y-axis. An axis element with <span class="Attribute">chart:dimension</span>="<span class="Attribute_20_Value">z</span>" is used to define the range and segmentation of the displayed altitude values. Contour lines are drawn along lines of equal altitude specified by the major interval of the z-axis. The area between the contour lines can be filled. The line and fill style is specified by the line and fill attributes of the series. Furthermore the <span class="Element">&lt;chart:data-point&gt;</span> elements of the series can be used to specify differing line and fill attributes for the different altitude intervals. The contour line and area belonging to the first major interval is displayed with the line and fill attributes of the first data-point, the contour line and area belonging to the second interval is displayed as specified by the line and fill attributes of the second data-point and so on.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>In both cases two <span class="Element">&lt;chart:domain&gt;</span> elements may be used to specify the y-values and x-values to be used (<a href="#attribute-table_cell-range-address_element-chart_domain_value_chart_surface">19.593.5</a>). In this case the jth value of the <span class="Attribute">table:cell-range-address</span> attribute of the first <span class="Element">&lt;chart:domain&gt;</span> element specifies the y-values used for the values in the jth row of the cell range given by the <span class="Attribute">chart:values-cell-range-address</span> attribute of the <span class="Element">&lt;chart:series&gt;</span> element and the ith value of the <span class="Attribute">table:cell-range-address</span> attribute of the second <span class="Element">&lt;chart:domain&gt;</span> element specifies the x-values used for the values in the ith column.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The attribute <span class="Attribute">chart:deep</span> shall be false. Multiple <span class="Element">&lt;chart:series&gt;</span> elements of type <span class="Attribute_20_Value_20_Instance">chart:surface</span> will result in multiple surfaces being rendered. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the <span class="Attribute">chart:values-cell-range-address</span> attribute of the first <span class="Element">&lt;chart:series&gt;</span> element specifies a range with a single row or with a single column the second version of a surface chart is rendered:<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The values given by a <span class="Attribute">chart:values-cell-range-address</span> attribute on multiple <span class="Element">&lt;chart:series&gt;</span> elements (marked as being of type <span class="Attribute_20_Value_20_Instance">chart:surface</span>) are interpreted as altitudes at specific grid locations.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">true</span>" a surface chart is displayed in a left handed three-dimensional Cartesian coordinate system with horizontal x-axis and vertical y-axis (prior to any 3D scene transformation). The altitude values are displayed on the y-axis in this case. The attribute <span class="Attribute">chart:deep</span> shall be true. The accessory x-coordinates are generated from the positions in the altitude -value sequence starting with 1.0. The first altitude value in each series gets an x value 1.0. The second altitude value is associated with an x value of 2.0 and so forth. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. The z-coordinates are generated from the order of the series elements starting with 1.0. The first series marked as being of type surface gets an associated z-coordinate of 1.0. The second series marked as being of type surface gets a z-coordinate 2.0 and so forth. The series names are used as labels at the z-axis. The surface is displayed as specified by the line and fill attributes of the first series. Furthermore the <span class="Element">&lt;chart:data-point&gt;</span> elements of the first series can be used to specify differing fill and line styles for the different altitude intervals. The surface within the first major interval (starting at lower values) is displayed with the line and fill attributes of the first data-point, within the second major interval the surface is displayed with the line and fill attributes of the second data-point and so on.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Where <span class="Attribute">chart:three-dimensional</span>="<span class="Attribute_20_Value">false</span>" a contour plot is displayed in a 2 dimensional Cartesian coordinate system with horizontal x-axis and vertical y-axis. The x-coordinates are generated from the positions in the altitude -value sequence starting with 1.0. The <span class="Element">&lt;chart:categories&gt;</span> element can be used to define labels for the x-axis. The y-coordinates are generated from the order of the series elements starting with 1.0. The series names are used as labels at the y-axis. A third axis element with <span class="Attribute">chart:dimension</span>="<span class="Attribute_20_Value">z</span>" is used to define the range and segmentation of the displayed altitude values. Contour lines are drawn along lines of equal altitude specified by the major interval of the z-axis. The area between the contour lines can be filled. The line and fill style is specified by the line and fill attributes of the first series. Furthermore the <span class="Element">&lt;chart:data-point&gt;</span> elements of the first series can be used to specify differing line and fill attributes for the different altitude intervals. The contour line and area belonging to the first major interval is displayed with the line and fill attributes of the first data-point, the contour line and area belonging to the second interval is displayed as specified by the line and fill attributes of the second data-point and so on. <span class="odfLiEnd"/> </p></li></ul></li></ul><p class="Text_20_body">Additional chart types may be supported by using a different namespace.</p><p class="Text_20_body">A <span class="Attribute">chart:class</span> attribute for a <span class="Element">&lt;chart:series&gt;</span> element overrides the <span class="Attribute">chart:class</span> attribute for the entire chart. </p><p class="Note"><span class="Note_20_Label">Note:</span> The following table shows examples for the pre-defined chart types. Those charts that use one or two data series use two data series with the values 1;2;3;4 and 1;4;9;16 and the labels a;b;c;d. Those chart types that use more than two data series (stock and bubble) use the data series 1;2;3;4 and multiples thereof. The radar chart uses two data series with five data points.</p><table border="0" cellspacing="0" cellpadding="0" class="ChartClassExamples"><colgroup><col width="222"/><col width="222"/><col width="222"/></colgroup><tr><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A1"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik2"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BEB3958805.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:line</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A1"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik21"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BE348BB081.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:area</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_C1"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.9228in;width:1.9228in; padding:0; " class="fr5" id="Grafik3"><img style="height:4.8839cm;width:4.8839cm;" alt="" src="./Pictures/10000200000000BE000000BE25E7F573.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:circle</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td></tr><tr><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik4"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BE4F61FAAA.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:ring</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik5"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BED3754382.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:scatter</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_C2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.9228in;width:1.9228in; padding:0; " class="fr5" id="Grafik6"><img style="height:4.8839cm;width:4.8839cm;" alt="" src="./Pictures/10000200000000BE000000BEC7C6AB3C.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:radar</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td></tr><tr><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik7"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BE99314183.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:bar</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik8"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BE145B66A3.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:stock</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_C2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.9228in;width:1.9228in; padding:0; " class="fr5" id="Grafik9"><img style="height:4.8839cm;width:4.8839cm;" alt="" src="./Pictures/10000200000000BD000000BDC014E7D1.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:bubble</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td></tr><tr><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik10"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BD000000BD0362D7E7.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:surface</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_A2"><!--Next 'div' was a 'text:p'.--><div class="Note"> <!--Next 'div' is a draw:frame.--><div style="height:1.922in;width:1.922in; padding:0; " class="fr5" id="Grafik11"><img style="height:4.8819cm;width:4.8819cm;" alt="" src="./Pictures/10000200000000BE000000BEE615D9E6.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"><span class="Strong_20_Emphasis">chart:gantt</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></td><td style="text-align:left;width:2.0007in; " class="ChartClassExamples_C2"><p class="Note"><span class="Strong_20_Emphasis"/></p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:class</span> attribute is usable with the following elements: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a> and <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:class</span> attribute has the data type <span class="Datatype">namespacedToken</span> <a href="#datatype-namespacedToken">18.3.19</a>.</p><h3 class="Heading_20_3"><a id="a19_15_2_chart_grid_"><span style="margin-right:0.127cm;">19.15.2</span></a><a id="__RefHeading__1416656_253892949"/><a id="attribute-chart_class_element-chart_grid"/>&lt;chart:grid&gt;</h3><p class="Text_20_body">The <span class="Attribute">chart:class</span> attribute of a <span class="Element">&lt;chart:grid&gt;</span> element specifies whether major or minor tick marks are used on a grid. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:class</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">major</span>: major tick marks are extended to grid lines.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">minor</span>: minor tick marks are extended to grid lines.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;chart:grid&gt;</span> <a href="#element-chart_grid">11.10</a> element the default value for this attribute is <span class="Attribute_20_Value">major</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">chart:class</span> attribute is usable with the following element: <span class="Element">&lt;chart:grid&gt;</span> <a href="#element-chart_grid">11.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:class</span> attribute are <span class="Attribute_20_Value">major</span> or <span class="Attribute_20_Value">minor</span>.</p><h2 class="Heading_20_2"><a id="a19_16chart_column-mapping__deprecated_"><span style="margin-right:0.127cm;">19.16</span></a><a id="__RefHeading__1416658_253892949"/><a id="attribute-chart_column-mapping"/>chart:column-mapping (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">chart:column-mapping</span> attribute is deprecated. It specifies a list of indexes of series. The numbers define a reordering of data that comes from a container document that provides the data for the chart. The numbering begins with 1. A list of ascending numbers beginning with 1 has no effect. To exchange two series, their numbers shall be exchanged in the list.</p><p class="Text_20_body">The <span class="Attribute">chart:column-mapping</span> and <span class="Attribute">chart:row-mapping</span> <a href="#attribute-chart_row-mapping">19.26</a> attributes shall not be used simultaneously.</p><p class="Note"><span class="Note_20_Label">Note:</span> Instead of using the deprecated <span class="Attribute">chart:column-mapping</span> attribute, <span class="Element">&lt;chart:series&gt;</span> elements may be reordered and specific cell ranges may be assigned to them using the <span class="Attribute">chart:values-cell-range-address</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:column-mapping</span> attribute is usable with the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:column-mapping</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_17chart_data-source-has-labels__deprecated_"><span style="margin-right:0.127cm;">19.17</span></a><a id="__RefHeading__1416660_253892949"/><a id="attribute-chart_data-source-has-labels"/>chart:data-source-has-labels (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">chart:data-source-has-labels</span> attribute specifies whether a chart's source range (as given within <span class="Attribute">table:cell-range-address</span> attribute on a <span class="Element">&lt;chart:plot-area&gt;</span> element) contain labels.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:data-source-has-labels</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">both</span>: first row and column of a chart's source range both contain labels.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: first column of a chart's source range contains labels.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: neither the first row nor the first column of a chart's source range contains labels.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: first row of a chart's source range contains labels.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">chart:data-source-has-labels</span> attribute is usable with the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:data-source-has-labels</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">row</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">both</span>.</p><h2 class="Heading_20_2"><a id="a19_18chart_dimension"><span style="margin-right:0.127cm;">19.18</span></a><a id="__RefHeading__1416662_253892949"/><a id="attribute-chart_dimension"/>chart:dimension</h2><p class="Text_20_body">The <span class="Attribute">chart:dimension</span> attribute specifies a dimension in a coordinate system.</p><p class="Text_20_body">For charts with less than three axes the <span class="Attribute">chart:dimension</span> attribute may appear with values for the x-axis and y-axis only. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:dimension</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">x</span>: dimension represented by the x-axis of a chart.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">y</span>: dimension represented by the y-axis of a chart.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">z</span>: dimension represented by the z-axis of a chart. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:dimension</span> attribute is usable with the following elements: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a> and <span class="Element">&lt;chart:error-indicator&gt;</span> <a href="#element-chart_error-indicator">11.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:dimension</span> attribute are <span class="Attribute_20_Value">x</span>, <span class="Attribute_20_Value">y</span> or <span class="Attribute_20_Value">z</span>.</p><h2 class="Heading_20_2"><a id="a19_19chart_display-equation"><span style="margin-right:0.127cm;">19.19</span></a><a id="__RefHeading__1416664_253892949"/><a id="attribute-chart_display-equation"/>chart:display-equation</h2><p class="Text_20_body">The <span class="Attribute">chart:display-equation</span> attribute specifies whether the equation itself should be displayed or not. It is only evaluated if the value of the <span class="Attribute">chart:automatic-content</span> attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:display-equation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the equation is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the equation is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">chart:display-equation</span> attribute is usable with the following element: <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:display-equation</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_20chart_display-r-square"><span style="margin-right:0.127cm;">19.20</span></a><a id="__RefHeading__1416666_253892949"/><a id="attribute-chart_display-r-square"/>chart:display-r-square</h2><p class="Text_20_body">The <span class="Attribute">chart:display-r-square</span> attribute specifies whether an R-square value should be displayed or not. It is only evaluated if the value of the <span class="Attribute">chart:automatic-content</span> attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:display-r-square</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: R-square value is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: R-square value is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">chart:display-r-square</span> attribute is usable with the following element: <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:display-r-square</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_21chart_label-cell-address"><span style="margin-right:0.127cm;">19.21</span></a><a id="__RefHeading__1416672_253892949"/><a id="attribute-chart_label-cell-address"/>chart:label-cell-address</h2><p class="Text_20_body">The <span class="Attribute">chart:label-cell-address</span> attribute specifies a cell range list that contains the name for a series.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:label-cell-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:label-cell-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_22chart_legend-align"><span style="margin-right:0.127cm;">19.22</span></a><a id="__RefHeading__1416674_253892949"/><a id="attribute-chart_legend-align"/>chart:legend-align</h2><p class="Text_20_body">The <span class="Attribute">chart:legend-align</span> attribute specifies the alignment of a legend with the plot area. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:legend-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: legend is aligned at the center of the plot-area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">end</span>: legend is aligned at the end of the plot-area (which is right or bottom).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">start</span>: legend is aligned at the beginning of the plot-area (which is left or top).<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> This attribute can be used when the <span class="Attribute">chart:legend-position</span> attribute has one of the following values: start, end, top, bottom.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:legend-align</span> attribute is usable with the following element: <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:legend-align</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">end</span>.</p><h2 class="Heading_20_2"><a id="a19_23chart_legend-position"><span style="margin-right:0.127cm;">19.23</span></a><a id="__RefHeading__1416676_253892949"/><a id="attribute-chart_legend-position"/>chart:legend-position</h2><p class="Text_20_body">The <span class="Attribute">chart:legend-position</span> attribute specifies the placement of a legend.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:legend-position</span> attribute to specify the location of a legend in one of the corners of a chart outside the plot area are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-end</span>: place legend in the bottom right corner.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-start</span>: place the legend in the bottom left corner.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top-end</span>: place legend in the top right corner.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top-start</span>: place legend in the top left corner.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The defined values for the <span class="Attribute">chart:legend-position</span> attribute to specify the location of a legend next to the plot area are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: place legend below the plot area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">end</span>: place legend on the right side of the plot area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">start</span>: place legend on the left side of the plot area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: place legend above the plot area.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The legend position can also be given in absolute coordinates with <span class="Attribute">svg:x</span> and <span class="Attribute">svg:y</span> attributes, as with any drawing object. If both absolute coordinates and the legend-position attribute are given, the legend-position attribute shall be used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:legend-position</span> attribute is usable with the following element: <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:legend-position</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">end</span>, <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">bottom</span>, <span class="Attribute_20_Value">top-start</span>, <span class="Attribute_20_Value">bottom-start</span>, <span class="Attribute_20_Value">top-end</span> or <span class="Attribute_20_Value">bottom-end</span>.</p><h2 class="Heading_20_2"><a id="a19_24chart_name"><span style="margin-right:0.127cm;">19.24</span></a><a id="__RefHeading__1416678_253892949"/><a id="attribute-chart_name"/>chart:name</h2><p class="Text_20_body">The <span class="Attribute">chart:name</span> attribute specifies a name for an axis.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The value of a <span class="Attribute">chart:name</span> attribute can be used to reference an axis.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:name</span> attribute is usable with the following element: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_25chart_repeated"><span style="margin-right:0.127cm;">19.25</span></a><a id="__RefHeading__1416680_253892949"/><a id="attribute-chart_repeated"/>chart:repeated</h2><p class="Text_20_body">The <span class="Attribute">chart:repeated</span> attribute specifies how many consecutive data points have the same style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:repeated</span> attribute is usable with the following element: <span class="Element">&lt;chart:data-point&gt;</span> <a href="#element-chart_data-point">11.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:repeated</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_26chart_row-mapping__deprecated_"><span style="margin-right:0.127cm;">19.26</span></a><a id="__RefHeading__1416682_253892949"/><a id="attribute-chart_row-mapping"/>chart:row-mapping (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">chart:row-mapping</span> attribute specifies a list of indexes of series. The numbers define a reordering of data that comes from a container document that provides the data for the chart. The numbering begins with 1. A list of ascending numbers beginning with 1 has no effect. To exchange two series, their numbers shall be exchanged in the list.</p><p class="Text_20_body">The <span class="Attribute">chart:row-mapping</span> and <span class="Attribute">chart:column-mapping</span> <a href="#attribute-chart_column-mapping">19.16</a> attributes shall not be used simultaneously.</p><p class="Note"><span class="Note_20_Label">Note:</span> Instead of using the deprecated <span class="Attribute">chart:row-mapping</span> attribute, <span class="Element">&lt;chart:series&gt;</span> elements may be reordered and specific cell ranges may be assigned to them using the <span class="Attribute">chart:values-cell-range-address</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:row-mapping</span> attribute is usable with the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:row-mapping</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_27chart_style-name"><span style="margin-right:0.127cm;">19.27</span></a><a id="__RefHeading__1416684_253892949"/><a id="attribute-chart_style-name"/>chart:style-name</h2><p class="Text_20_body">The <span class="Attribute">chart:style-name</span> attribute references a chart style by its name.<a href="#attribute-style_name">19.498</a> </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:style-name</span> attribute is usable with the following elements: <span class="Element">&lt;chart:axis&gt;</span> <a href="#element-chart_axis">11.8</a>, <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>, <span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a>, <span class="Element">&lt;chart:data-point&gt;</span> <a href="#element-chart_data-point">11.13</a>, <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>, <span class="Element">&lt;chart:error-indicator&gt;</span> <a href="#element-chart_error-indicator">11.16</a>, <span class="Element">&lt;chart:floor&gt;</span> <a href="#element-chart_floor">11.7</a>, <span class="Element">&lt;chart:footer&gt;</span> <a href="#element-chart_footer">11.2.3</a>, <span class="Element">&lt;chart:grid&gt;</span> <a href="#element-chart_grid">11.10</a>, <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>, <span class="Element">&lt;chart:mean-value&gt;</span> <a href="#element-chart_mean-value">11.15</a>, <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;chart:regression-curve&gt;</span> <a href="#element-chart_regression-curve">11.17</a>, <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>, <span class="Element">&lt;chart:stock-gain-marker&gt;</span> <a href="#element-chart_stock-gain-marker">11.19</a>, <span class="Element">&lt;chart:stock-loss-marker&gt;</span> <a href="#element-chart_stock-loss-marker">11.20</a>, <span class="Element">&lt;chart:stock-range-line&gt;</span> <a href="#element-chart_stock-range-line">11.21</a>, <span class="Element">&lt;chart:subtitle&gt;</span> <a href="#element-chart_subtitle">11.2.2</a>, <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a> and <span class="Element">&lt;chart:wall&gt;</span> <a href="#element-chart_wall">11.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_28chart_values-cell-range-address"><span style="margin-right:0.127cm;">19.28</span></a><a id="__RefHeading__1416686_253892949"/><a id="attribute-chart_values-cell-range-address"/>chart:values-cell-range-address</h2><p class="Text_20_body"> The <span class="Attribute">chart:values-cell-range-address</span> attribute specifies a cell range that contains the values for a data series. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:values-cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:values-cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_29config_name"><span style="margin-right:0.127cm;">19.29</span></a><a id="__RefHeading__1416688_253892949"/><a id="attribute-config_name"/>config:name</h2><p class="Text_20_body">The <span class="Attribute">config:name</span> attribute specifies a name of an application setting, an application setting sequence, or an application setting container.</p><p class="Text_20_body">For <span class="Element">&lt;config:config-item-set&gt;</span> elements that are children of <span class="Element">&lt;office:settings&gt;</span> elements, the name shall begin with a namespace prefix followed by a “:” (U+003A, COLON). The XML namespace bound to the prefix identifies the implementation that defines the name of a setting.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">config:name</span> attribute is usable with the following elements: <span class="Element">&lt;config:config-item&gt;</span> <a href="#element-config_config-item">3.10.3</a>, <span class="Element">&lt;config:config-item-map-entry&gt;</span> <a href="#element-config_config-item-map-entry">3.10.5</a>, <span class="Element">&lt;config:config-item-map-indexed&gt;</span> <a href="#element-config_config-item-map-indexed">3.10.4</a>, <span class="Element">&lt;config:config-item-map-named&gt;</span> <a href="#element-config_config-item-map-named">3.10.6</a> and <span class="Element">&lt;config:config-item-set&gt;</span> <a href="#element-config_config-item-set">3.10.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">config:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_30config_type"><span style="margin-right:0.127cm;">19.30</span></a><a id="__RefHeading__1416690_253892949"/><a id="attribute-config_type"/>config:type</h2><p class="Text_20_body">The <span class="Attribute">config:type</span> attribute specifies a data type for a setting.</p><p class="Text_20_body">The defined values for the <span class="Attribute">config:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">base64Binary</span>: <a href="#datatype-base64Binary">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">boolean</span>: <a href="#datatype-boolean">18.3.3</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">datetime</span>: <a href="#datatype-dateTime">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: <a href="#datatype-double">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">int</span>: <a href="#datatype-integer">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: <a href="#datatype-long">18.2</a> .<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: <a href="#datatype-short">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">string</span>: <a href="#datatype-string">18.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">config:type</span> attribute is usable with the following element: <span class="Element">&lt;config:config-item&gt;</span> <a href="#element-config_config-item">3.10.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">config:type</span> attribute are <span class="Attribute_20_Value">boolean</span>, <span class="Attribute_20_Value">short</span>, <span class="Attribute_20_Value">int</span>, <span class="Attribute_20_Value">long</span>, <span class="Attribute_20_Value">double</span>, <span class="Attribute_20_Value">string</span>, <span class="Attribute_20_Value">datetime</span> or <span class="Attribute_20_Value">base64Binary</span>.</p><h2 class="Heading_20_2"><a id="a19_31db_additional-column-statement"><span style="margin-right:0.127cm;">19.31</span></a><a id="__RefHeading__1416692_253892949"/><a id="attribute-db_additional-column-statement"/>db:additional-column-statement</h2><p class="Text_20_body">The <span class="Attribute">db:additional-column-statement</span> attribute specifies the auto-increment keyword of an SQL create statement and any start value. </p><p class="Note"><span class="Note_20_Label">Note:</span> The auto increment keyword, optional start value and the format of the string specifying them are database specific. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:additional-column-statement</span> attribute is usable with the following element: <span class="Element">&lt;db:auto-increment&gt;</span> <a href="#element-db_auto-increment">12.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:additional-column-statement</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_32db_append-table-alias-name"><span style="margin-right:0.127cm;">19.32</span></a><a id="__RefHeading__1416694_253892949"/><a id="attribute-db_append-table-alias-name"/>db:append-table-alias-name</h2><p class="Text_20_body">The <span class="Attribute">db:append-table-alias-name</span> attribute specifies that a table alias name should be appended when creating an SQL query.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:append-table-alias-name</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table alias name is not appended to a query when creating an SQL query.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table alias name is appended to a query when creating an SQL query.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:append-table-alias-name</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:append-table-alias-name</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_33db_apply-command"><span style="margin-right:0.127cm;">19.33</span></a><a id="__RefHeading__1416696_253892949"/><a id="attribute-db_apply-command"/>db:apply-command</h2><p class="Text_20_body">The <span class="Attribute">db:apply-command</span> attribute specifies whether an SQL clause specified by a <span class="Attribute">db:command</span> attribute should be appended to an underlying statement.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:apply-command</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: an SQL clause specified by a <span class="Attribute">db:command</span> will not be appended to an underlying statement.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: an SQL clause specified by a <span class="Attribute">db:command</span> attribute will be appended to an underlying statement.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:apply-command</span> attribute is usable with the following elements: <span class="Element">&lt;db:filter-statement&gt;</span> <a href="#element-db_filter-statement">12.30</a> and <span class="Element">&lt;db:order-statement&gt;</span> <a href="#element-db_order-statement">12.29</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:apply-command</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_34db_as-template"><span style="margin-right:0.127cm;">19.34</span></a><a id="__RefHeading__1416698_253892949"/><a id="attribute-db_as-template"/>db:as-template</h2><p class="Text_20_body">The <span class="Attribute">db:as-template</span> attribute specifies that a document is used as a template for a table structure to be created inside a database.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:as-template</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: document is not used as a template.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: document is used as a template.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:as-template</span> attribute is usable with the following element: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:as-template</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_35db_base-dn"><span style="margin-right:0.127cm;">19.35</span></a><a id="__RefHeading__1416700_253892949"/><a id="attribute-db_base-dn"/>db:base-dn</h2><p class="Text_20_body">The <span class="Attribute">db:base-dn</span> attribute specifies a base DN for data that is retrieved using LDAP. <a title="Lightweight Directory Access Protocol (LDAP): String Representation of Distinguished Names" href="http://tools.ietf.org/html/rfc4514">[RFC4514]</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:base-dn</span> attribute is usable with the following element: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:base-dn</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_36db_boolean-comparison-mode"><span style="margin-right:0.127cm;">19.36</span></a><a id="__RefHeading__1416702_253892949"/><a id="attribute-db_boolean-comparison-mode"/>db:boolean-comparison-mode</h2><p class="Text_20_body">The <span class="Attribute">db:boolean-comparison-mode</span> attribute specifies a comparison mode used for Boolean values in SQL SELECT statements. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:boolean-comparison-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">equal-boolean</span>: “= TRUE" will be used for true and “= FALSE" for false.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">qual-integer</span>: “= 1" will be used for true and “= 0" for false.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">qual-use-only-zero</span>: “NOT ($value = 0 or $value IS NULL)" will be used for true and “= 0" for false.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span><span class="Attribute_20_Value">s-boolean</span>: “IS TRUE" will be used for true and “IS FALSE" for false.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">equal-integer</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:boolean-comparison-mode</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:boolean-comparison-mode</span> attribute are <span class="Attribute_20_Value">equal-integer</span>, <span class="Attribute_20_Value">is-boolean</span>, <span class="Attribute_20_Value">equal-boolean</span> or <span class="Attribute_20_Value">equal-use-only-zero</span>.</p><h2 class="Heading_20_2"><a id="a19_37db_catalog-name"><span style="margin-right:0.127cm;">19.37</span></a><a id="__RefHeading__1416704_253892949"/><a id="attribute-db_catalog-name"/>db:catalog-name</h2><p class="Text_20_body">The <span class="Attribute">db:catalog-name</span> attribute specifies the catalog part of a full qualified SQL table name or index name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:catalog-name</span> attribute is usable with the following elements: <span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a>, <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>, <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a> and <span class="Element">&lt;db:update-table&gt;</span> <a href="#element-db_update-table">12.31</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:catalog-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_38db_command"><span style="margin-right:0.127cm;">19.38</span></a><a id="__RefHeading__1416706_253892949"/><a id="attribute-db_command"/>db:command</h2><p class="Text_20_body">The <span class="Attribute">db:command</span> attribute specifies an SQL select, order or filter clause that is used as part of a SELECT statement.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:command</span> attribute is usable with the following elements: <span class="Element">&lt;db:filter-statement&gt;</span> <a href="#element-db_filter-statement">12.30</a>, <span class="Element">&lt;db:order-statement&gt;</span> <a href="#element-db_order-statement">12.29</a> and <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:command</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_39db_data-source-setting-is-list"><span style="margin-right:0.127cm;">19.39</span></a><a id="__RefHeading__1416708_253892949"/><a id="attribute-db_data-source-setting-is-list"/>db:data-source-setting-is-list</h2><p class="Text_20_body">The <span class="Attribute">db:data-source-setting-is-list</span> attribute specifies whether a <span class="Element">&lt;db:data-source-setting&gt;</span> element contains a list of <span class="Element">&lt;db:data-source-setting-value&gt;</span> elements.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:data-source-setting-is-list</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: <span class="Element">&lt;db:data-source-settings&gt;</span> element should not contain a list of <span class="Element">&lt;db:data-source-setting-value&gt;</span> elements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: <span class="Element">&lt;db:data-source-settings&gt;</span> element should contain a list of <span class="Element">&lt;db:data-source-setting-value&gt;</span> elements.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:data-source-setting-is-list</span> attribute is usable with the following element: <span class="Element">&lt;db:data-source-setting&gt;</span> <a href="#element-db_data-source-setting">12.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:data-source-setting-is-list</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_40db_data-source-setting-name"><span style="margin-right:0.127cm;">19.40</span></a><a id="__RefHeading__1416710_253892949"/><a id="attribute-db_data-source-setting-name"/>db:data-source-setting-name</h2><p class="Text_20_body">The <span class="Attribute">db:data-source-setting-name</span> attribute specifies a name for a <span class="Element">&lt;db:data-source-setting&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:data-source-setting-name</span> attribute is usable with the following element: <span class="Element">&lt;db:data-source-setting&gt;</span> <a href="#element-db_data-source-setting">12.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:data-source-setting-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_41db_data-source-setting-type"><span style="margin-right:0.127cm;">19.41</span></a><a id="__RefHeading__1416712_253892949"/><a id="attribute-db_data-source-setting-type"/>db:data-source-setting-type</h2><p class="Text_20_body">The <span class="Attribute">db:data-source-setting-type</span> attribute specifies a data type for a data-source-setting value.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:data-source-setting-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">boolean</span>: <a href="#datatype-boolean">18.3.3</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: <a href="#datatype-double">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">int</span>: <a href="#datatype-integer">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: defined by <a title="Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38640">[SQL]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">string</span>: <a href="#datatype-string">18.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:data-source-setting-type</span> attribute is usable with the following element: <span class="Element">&lt;db:data-source-setting&gt;</span> <a href="#element-db_data-source-setting">12.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:data-source-setting-type</span> attribute are <span class="Attribute_20_Value">boolean</span>, <span class="Attribute_20_Value">short</span>, <span class="Attribute_20_Value">int</span>, <span class="Attribute_20_Value">long</span>, <span class="Attribute_20_Value">double</span> or <span class="Attribute_20_Value">string</span>.</p><h2 class="Heading_20_2"><a id="a19_42db_data-type"><span style="margin-right:0.127cm;">19.42</span></a><a id="__RefHeading__1416714_253892949"/><a id="attribute-db_data-type"/>db:data-type</h2><p class="Text_20_body">The <span class="Attribute">db:data-type</span> attribute specifies an SQL data type for a column.</p><p class="Text_20_body">The values accepted by <span class="Attribute">db:data-type</span> are defined by <a title="Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38640">[SQL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:data-type</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:data-type</span> attribute are <span class="Attribute_20_Value">bit</span>, <span class="Attribute_20_Value">boolean</span>, <span class="Attribute_20_Value">tinyint</span>, <span class="Attribute_20_Value">smallint</span>, <span class="Attribute_20_Value">integer</span>, <span class="Attribute_20_Value">bigint</span>, <span class="Attribute_20_Value">float</span>, <span class="Attribute_20_Value">real</span>, <span class="Attribute_20_Value">double</span>, <span class="Attribute_20_Value">numeric</span>, <span class="Attribute_20_Value">decimal</span>, <span class="Attribute_20_Value">char</span>, <span class="Attribute_20_Value">varchar</span>, <span class="Attribute_20_Value">longvarchar</span>, <span class="Attribute_20_Value">date</span>, <span class="Attribute_20_Value">time</span>, <span class="Attribute_20_Value">timestmp</span>, <span class="Attribute_20_Value">binary</span>, <span class="Attribute_20_Value">varbinary</span>, <span class="Attribute_20_Value">longvarbinary</span>, <span class="Attribute_20_Value">sqlnull</span>, <span class="Attribute_20_Value">other</span>, <span class="Attribute_20_Value">object</span>, <span class="Attribute_20_Value">distinct</span>, <span class="Attribute_20_Value">struct</span>, <span class="Attribute_20_Value">array</span>, <span class="Attribute_20_Value">blob</span>, <span class="Attribute_20_Value">clob</span> or <span class="Attribute_20_Value">ref</span>.</p><h2 class="Heading_20_2"><a id="a19_43db_database-name"><span style="margin-right:0.127cm;">19.43</span></a><a id="__RefHeading__1416716_253892949"/><a id="attribute-db_database-name"/>db:database-name</h2><p class="Text_20_body">The <span class="Attribute">db:database-name</span> attribute specifies the database for a connection if the database type supports multiple logical databases per server.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:database-name</span> attribute is usable with the following element: <span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:database-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_44db_decimal"><span style="margin-right:0.127cm;">19.44</span></a><a id="__RefHeading__1416718_253892949"/><a id="attribute-db_decimal"/>db:decimal</h2><p class="Text_20_body">The <span class="Attribute">db:decimal</span> attribute specifies a decimal separator for numeric fields.</p><p class="Default_20_Value_borderStart">The default value for this attribute is “<span class="Attribute_20_Value_20_Instance">.</span>” (U+002E, FULL STOP).</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:decimal</span> attribute is usable with the following element: <span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:decimal</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_45db_default-cell-style-name"><span style="margin-right:0.127cm;">19.45</span></a><a id="__RefHeading__1416720_253892949"/><a id="attribute-db_default-cell-style-name"/>db:default-cell-style-name</h2><p class="Text_20_body">The <span class="Attribute">db:default-cell-style-name</span> attribute specifies a default cell style. This style is applied to all cells in a column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:default-cell-style-name</span> attribute is usable with the following element: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:default-cell-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_46db_default-row-style-name"><span style="margin-right:0.127cm;">19.46</span></a><a id="__RefHeading__1416722_253892949"/><a id="attribute-db_default-row-style-name"/>db:default-row-style-name</h2><p class="Text_20_body">The <span class="Attribute">db:default-row-style-name</span> attribute specifies a default row style. This style is applied to all rows in a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:default-row-style-name</span> attribute is usable with the following elements: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a> and <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:default-row-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_47db_delete-rule"><span style="margin-right:0.127cm;">19.47</span></a><a id="__RefHeading__1416724_253892949"/><a id="attribute-db_delete-rule"/>db:delete-rule</h2><p class="Text_20_body">The <span class="Attribute">db:delete-rule</span> attribute specifies a rule that is applied for deleting records from a table. It is used only with foreign keys.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:delete-rule</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cascade</span>: when the primary key is deleted, rows that imported that key are deleted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no-action</span>: indicates that if the primary key has been imported, it cannot be deleted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">restrict</span>: a primary key shall not be deleted if it has been imported by another table as a foreign key.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">set-default</span>: when the primary key is deleted, the foreign key (imported key) is set to the default value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">set-null</span>: when the primary key is deleted, the foreign key (imported key) is changed to NULL.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">no-action</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:delete-rule</span> attribute is usable with the following element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:delete-rule</span> attribute are <span class="Attribute_20_Value">cascade</span>, <span class="Attribute_20_Value">restrict</span>, <span class="Attribute_20_Value">set-null</span>, <span class="Attribute_20_Value">no-action</span> or <span class="Attribute_20_Value">set-default</span>.</p><h2 class="Heading_20_2"><a id="a19_48db_description"><span style="margin-right:0.127cm;">19.48</span></a><a id="__RefHeading__1416726_253892949"/><a id="attribute-db_description"/>db:description</h2><p class="Text_20_body">The <span class="Attribute">db:description</span> attribute specifies a description of a database object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:description</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>, <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>, <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>, <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a> and <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:description</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_49db_enable-sql92-check"><span style="margin-right:0.127cm;">19.49</span></a><a id="__RefHeading__1416728_253892949"/><a id="attribute-db_enable-sql92-check"/>db:enable-sql92-check</h2><p class="Text_20_body">The <span class="Attribute">db:enable-sql92-check</span> attribute specifies whether the names of tables, views, columns, and queries may contain characters defined by the <a title="Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38640">[SQL]</a> feature F392.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:enable-sql92-check</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumers should permit characters defined by the <a title="Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38640">[SQL]</a> feature F392 for new or changed names of tables, views, columns, and queries. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumers should not permit characters defined by the <a title="Information Technology -- Database Language -- SQL -- Part 2: Foundation (SQL/Foundation)" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38640">[SQL]</a> feature F392 for new or changed names of tables, views, columns, and queries. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:enable-sql92-check</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:enable-sql92-check</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_50db_encoding"><span style="margin-right:0.127cm;">19.50</span></a><a id="__RefHeading__1416730_253892949"/><a id="attribute-db_encoding"/>db:encoding</h2><p class="Text_20_body">The <span class="Attribute">db:encoding</span> attribute specifies a text encoding for string data.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">utf-8</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:encoding</span> attribute is usable with the following element: <span class="Element">&lt;db:character-set&gt;</span> <a href="#element-db_character-set">12.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:encoding</span> attribute has the data type <span class="Datatype">textEncoding</span> <a href="#datatype-textEncoding">18.3.35</a>.</p><h2 class="Heading_20_2"><a id="a19_51db_escape-processing"><span style="margin-right:0.127cm;">19.51</span></a><a id="__RefHeading__1416732_253892949"/><a id="attribute-db_escape-processing"/>db:escape-processing</h2><p class="Text_20_body">The <span class="Attribute">db:escape-processing</span> attribute specifies whether escape processing for a query is used or not. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:escape-processing</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumer should pass a query statement to the database driver without interpreting it itself.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumer may pass a query statement to a database driver after interpreting it itself. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:escape-processing</span> attribute is usable with the following element: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:escape-processing</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_52db_extension"><span style="margin-right:0.127cm;">19.52</span></a><a id="__RefHeading__1416734_253892949"/><a id="attribute-db_extension"/>db:extension</h2><p class="Text_20_body">The <span class="Attribute">db:extension</span> attribute of a <span class="Element">&lt;db:file-based-database&gt;</span> element specifies a file name extension for files which are used as tables.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:extension</span> attribute is usable with the following element: <span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:extension</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_53db_field"><span style="margin-right:0.127cm;">19.53</span></a><a id="__RefHeading__1416736_253892949"/><a id="attribute-db_field"/>db:field</h2><p class="Text_20_body">The <span class="Attribute">db:field</span> attribute specifies a separator for database fields.</p><p class="Default_20_Value_borderStart">The default value for this attribute is “<span class="Attribute_20_Value_20_Instance">;</span>” (U+003B, SEMICOLON).</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:field</span> attribute is usable with the following element: <span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:field</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_54db_hostname"><span style="margin-right:0.127cm;">19.54</span></a><a id="__RefHeading__1416738_253892949"/><a id="attribute-db_hostname"/>db:hostname</h2><p class="Text_20_body">The <span class="Attribute">db:hostname</span> attribute specifies the name of a server for a server-based database. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:hostname</span> attribute is usable with the following element: <span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:hostname</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_55db_ignore-driver-privileges"><span style="margin-right:0.127cm;">19.55</span></a><a id="__RefHeading__1416740_253892949"/><a id="attribute-db_ignore-driver-privileges"/>db:ignore-driver-privileges</h2><p class="Text_20_body">The <span class="Attribute">db:ignore-driver-privileges</span> attribute specifies whether privileges returned by a database driver should be ignored. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:ignore-driver-privileges</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: privileges returned by a database driver should not be ignored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: privileges returned by a database driver should be ignored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:ignore-driver-privileges</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:ignore-driver-privileges</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_56db_is-ascending"><span style="margin-right:0.127cm;">19.56</span></a><a id="__RefHeading__1416742_253892949"/><a id="attribute-db_is-ascending"/>db:is-ascending</h2><p class="Text_20_body">The <span class="Attribute">db:is-ascending</span> attribute specifies that a column is to be sorted in ascending order. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-ascending</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: column is not sorted in ascending order.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: column is sorted in ascending order.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:is-ascending</span> attribute is usable with the following element: <span class="Element">&lt;db:index-column&gt;</span> <a href="#element-db_index-column">12.48</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-ascending</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_57db_is-autoincrement"><span style="margin-right:0.127cm;">19.57</span></a><a id="__RefHeading__1416744_253892949"/><a id="attribute-db_is-autoincrement"/>db:is-autoincrement</h2><p class="Text_20_body">The <span class="Attribute">db:is-autoincrement</span> attribute specifies whether a column is automatically numbered.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-autoincrement</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: column is not automatically numbered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: column is automatically numbered.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:is-autoincrement</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-autoincrement</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_58db_is-clustered"><span style="margin-right:0.127cm;">19.58</span></a><a id="__RefHeading__1416746_253892949"/><a id="attribute-db_is-clustered"/>db:is-clustered</h2><p class="Text_20_body">The <span class="Attribute">db:is-clustered</span> attribute specifies that an index is clustered.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-clustered</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: index is not clustered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: index is clustered.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:is-clustered</span> attribute is usable with the following element: <span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-clustered</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_59db_is-empty-allowed"><span style="margin-right:0.127cm;">19.59</span></a><a id="__RefHeading__1416748_253892949"/><a id="attribute-db_is-empty-allowed"/>db:is-empty-allowed</h2><p class="Text_20_body">The <span class="Attribute">db:is-empty-allowed</span> attribute specifies whether a column may contain empty values. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-empty-allowed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: column shall not contain empty values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: column may contain empty values.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:is-empty-allowed</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-empty-allowed</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_60db_is-first-row-header-line"><span style="margin-right:0.127cm;">19.60</span></a><a id="__RefHeading__1416750_253892949"/><a id="attribute-db_is-first-row-header-line"/>db:is-first-row-header-line</h2><p class="Text_20_body">The <span class="Attribute">db:is-first-row-header-line</span> attribute specifies whether the first row in a text file, which is interpreted as table of a file-based database, is used to define the columns of a table.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-first-row-header-line</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: first row of text file does not define columns of a table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: first row of text file does define columns of a table.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:is-first-row-header-line</span> attribute is usable with the following elements: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a> and <span class="Element">&lt;db:table-setting&gt;</span> <a href="#element-db_table-setting">12.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-first-row-header-line</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_61db_login-timeout"><span style="margin-right:0.127cm;">19.61</span></a><a id="__RefHeading__1416752_253892949"/><a id="attribute-db_login-timeout"/>db:login-timeout</h2><p class="Text_20_body">The <span class="Attribute">db:login-timeout</span> attribute indicates a default time-out to be used when establishing a connection for this data source. If the attribute is not present, then default time-out is specified by the database server. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:login-timeout</span> attribute is usable with the following element: <span class="Element">&lt;db:login&gt;</span> <a href="#element-db_login">12.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:login-timeout</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_62db_is-nullable"><span style="margin-right:0.127cm;">19.62</span></a><a id="__RefHeading__1416754_253892949"/><a id="attribute-db_is-nullable"/>db:is-nullable</h2><p class="Text_20_body">The <span class="Attribute">db:is-nullable</span> attribute specifies the nullability of values in a column.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-nullable</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no-nulls</span>: null values should not appear in a column.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">nullable</span>: null values may appear in a column.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:is-nullable</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:is-nullable</span> attribute are <span class="Attribute_20_Value">no-nulls</span> or <span class="Attribute_20_Value">nullable</span>.</p><h2 class="Heading_20_2"><a id="a19_63db_is-password-required"><span style="margin-right:0.127cm;">19.63</span></a><a id="__RefHeading__1416756_253892949"/><a id="attribute-db_is-password-required"/>db:is-password-required</h2><p class="Text_20_body">The <span class="Attribute">db:is-password-required</span> attribute specifies if a password is always necessary when establishing a connection for a data source.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-password-required</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: password should not be required for a connection to data source.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: password should be required for a connection to data source.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:is-password-required</span> attribute is usable with the following element: <span class="Element">&lt;db:login&gt;</span> <a href="#element-db_login">12.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-password-required</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_64db_is-unique"><span style="margin-right:0.127cm;">19.64</span></a><a id="__RefHeading__1416758_253892949"/><a id="attribute-db_is-unique"/>db:is-unique</h2><p class="Text_20_body">The <span class="Attribute">db:is-unique</span> attribute specifies an index shall have unique values.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-unique</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: index should not require unique values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: index shall have unique values.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:is-unique</span> attribute is usable with the following element: <span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-unique</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_65db_precision"><span style="margin-right:0.127cm;">19.65</span></a><a id="__RefHeading__1416760_253892949"/><a id="attribute-db_precision"/>db:precision</h2><p class="Text_20_body">The <span class="Attribute">db:precision</span> attribute specifies a column's number of decimal digits.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:precision</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:precision</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_66db_is-table-name-length-limited"><span style="margin-right:0.127cm;">19.66</span></a><a id="__RefHeading__1416762_253892949"/><a id="attribute-db_is-table-name-length-limited"/>db:is-table-name-length-limited</h2><p class="Text_20_body">The <span class="Attribute">db:is-table-name-length-limited</span> attribute specifies whether table names are limited to eight characters or fewer characters.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:is-table-name-length-limited</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: tables names may exceed eight characters in length.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table names shall not be greater than eight characters in length.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:is-table-name-length-limited</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:is-table-name-length-limited</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_67db_local-socket"><span style="margin-right:0.127cm;">19.67</span></a><a id="__RefHeading__1416764_253892949"/><a id="attribute-db_local-socket"/>db:local-socket</h2><p class="Text_20_body">The <span class="Attribute">db:local-socket</span> attribute specifies local socket on which a server database is running and accepting connections. The server's local socket filename is used for connecting to a server database when it is running locally. </p><p class="Text_20_body">If <span class="Attribute">db:local-socket</span> is present but empty, consumers should use the default local socket for the database type in question.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:local-socket</span> attribute is usable with the following element: <span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:local-socket</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_68db_max-row-count"><span style="margin-right:0.127cm;">19.68</span></a><a id="__RefHeading__1416766_253892949"/><a id="attribute-db_max-row-count"/>db:max-row-count</h2><p class="Text_20_body">The <span class="Attribute">db:max-row-count</span> attribute specifies the maximum number of rows that should be returned in a result set.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:max-row-count</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:max-row-count</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_69db_media-type"><span style="margin-right:0.127cm;">19.69</span></a><a id="__RefHeading__1416768_253892949"/><a id="attribute-db_media-type"/>db:media-type</h2><p class="Text_20_body">The <span class="Attribute">db:media-type</span> attribute of a <span class="Element">&lt;db:file-based-database&gt;</span> element specifies the type of the file(s) that comprise a database. If the database consists of multiple files of different types which all are required for it to be operational, this attribute specifies the type of the file l to by the <span class="Attribute">xlink:href</span> attribute on the <span class="Element">&lt;db:file-based-database&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:media-type</span> attribute is usable with the following element: <span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:media-type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_70db_name"><span style="margin-right:0.127cm;">19.70</span></a><a id="__RefHeading__1416770_253892949"/><a id="attribute-db_name"/>db:name</h2><h3 class="Heading_20_3"><a id="a19_70_1General"><span style="margin-right:0.127cm;">19.70.1</span></a><a id="__RefHeading__1416772_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies a name of a database or component of a database.</p><h3 class="Heading_20_3"><a id="a19_70_2_db_column_"><span style="margin-right:0.127cm;">19.70.2</span></a><a id="__RefHeading__1416774_253892949"/><a id="attribute-db_name_element-db_column"/>&lt;db:column&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute value specifies the name of a column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_3_db_column-definition_"><span style="margin-right:0.127cm;">19.70.3</span></a><a id="__RefHeading__1416776_253892949"/><a id="attribute-db_name_element-db_column-definition"/>&lt;db:column-definition&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_4_db_component_"><span style="margin-right:0.127cm;">19.70.4</span></a><a id="__RefHeading__1416778_253892949"/><a id="attribute-db_name_element-db_component"/>&lt;db:component&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a database component.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_5_db_component-collection_"><span style="margin-right:0.127cm;">19.70.5</span></a><a id="__RefHeading__1416780_253892949"/><a id="attribute-db_name_element-db_component-collection"/>&lt;db:component-collection&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a collection of <span class="Element">&lt;db:component&gt;</span> and <span class="Element">&lt;db:component-collection&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_6_db_index_"><span style="margin-right:0.127cm;">19.70.6</span></a><a id="__RefHeading__1416782_253892949"/><a id="attribute-db_name_element-db_index"/>&lt;db:index&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute value specifies the name of an index. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_7_db_index-column_"><span style="margin-right:0.127cm;">19.70.7</span></a><a id="__RefHeading__1416784_253892949"/><a id="attribute-db_name_element-db_index-column"/>&lt;db:index-column&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute value specifies the name of an index column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:index-column&gt;</span> <a href="#element-db_index-column">12.48</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_8_db_key_"><span style="margin-right:0.127cm;">19.70.8</span></a><a id="__RefHeading__1416786_253892949"/><a id="attribute-db_name_element-db_key"/>&lt;db:key&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute value specifies the name of a key. If the key is not a primary key, the <span class="Attribute">db:name</span> attribute with a value shall appear on the <span class="Element">&lt;db:key&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_9_db_key-column_"><span style="margin-right:0.127cm;">19.70.9</span></a><a id="__RefHeading__1416788_253892949"/><a id="attribute-db_name_element-db_key-column"/>&lt;db:key-column&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a <span class="Element">&lt;db:key-column&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:key-column&gt;</span> <a href="#element-db_key-column">12.44</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_10_db_query_"><span style="margin-right:0.127cm;">19.70.10</span></a><a id="__RefHeading__1416790_253892949"/><a id="attribute-db_name_element-db_query"/>&lt;db:query&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a <span class="Element">&lt;db:query&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_11_db_query-collection_"><span style="margin-right:0.127cm;">19.70.11</span></a><a id="__RefHeading__1416792_253892949"/><a id="attribute-db_name_element-db_query-collection"/>&lt;db:query-collection&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a collection of <span class="Element">&lt;db:query&gt;</span> and <span class="Element">&lt;db:query-collection&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_12_db_table-definition_"><span style="margin-right:0.127cm;">19.70.12</span></a><a id="__RefHeading__1416794_253892949"/><a id="attribute-db_name_element-db_table-definition"/>&lt;db:table-definition&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a schema for a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_13_db_table-representation_"><span style="margin-right:0.127cm;">19.70.13</span></a><a id="__RefHeading__1416796_253892949"/><a id="attribute-db_name_element-db_table-representation"/>&lt;db:table-representation&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute value specifies the name of a table. Fully identifying a table in a database may require values from the <span class="Attribute">db:catalog-name</span> and <span class="Attribute">db:schema-name</span> attributes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_70_14_db_update-table_"><span style="margin-right:0.127cm;">19.70.14</span></a><a id="__RefHeading__1416798_253892949"/><a id="attribute-db_name_element-db_update-table"/>&lt;db:update-table&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:name</span> attribute specifies the name of a <span class="Element">&lt;db:update-table&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:name</span> attribute is usable with the following element: <span class="Element">&lt;db:update-table&gt;</span> <a href="#element-db_update-table">12.31</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_71db_parameter-name-substitution"><span style="margin-right:0.127cm;">19.71</span></a><a id="__RefHeading__1416800_253892949"/><a id="attribute-db_parameter-name-substitution"/>db:parameter-name-substitution</h2><p class="Text_20_body">The <span class="Attribute">db:parameter-name-substitution</span> attribute specifies that parameter names shall be replaced with a ”?” (U+003F, QUESTION MARK). </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:parameter-name-substitution</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: parameters names may be replaced by a ”?”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: parameters names shall be replaced by a “?”.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:parameter-name-substitution</span> attribute is usable with the following element: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:parameter-name-substitution</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_72db_port"><span style="margin-right:0.127cm;">19.72</span></a><a id="__RefHeading__1416802_253892949"/><a id="attribute-db_port"/>db:port</h2><p class="Text_20_body">The <span class="Attribute">db:port</span> attribute specifies the port on which a server database is accepting connections. If no port is present, consumers should use the default port for the database type in question.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:port</span> attribute is usable with the following element: <span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:port</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_73db_referenced-table-name"><span style="margin-right:0.127cm;">19.73</span></a><a id="__RefHeading__1416804_253892949"/><a id="attribute-db_referenced-table-name"/>db:referenced-table-name</h2><p class="Text_20_body">The <span class="Attribute">db:referenced-table-name</span> attribute specifies the name of a referenced table. It is only used with foreign keys.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:referenced-table-name</span> attribute is usable with the following element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:referenced-table-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_74db_related-column-name"><span style="margin-right:0.127cm;">19.74</span></a><a id="__RefHeading__1416806_253892949"/><a id="attribute-db_related-column-name"/>db:related-column-name</h2><p class="Text_20_body">The <span class="Attribute">db:related-column-name</span> attribute specifies the name of a reference column out of the referenced table. It is used only with foreign keys.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:related-column-name</span> attribute is usable with the following element: <span class="Element">&lt;db:key-column&gt;</span> <a href="#element-db_key-column">12.44</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:related-column-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_75db_row-retrieving-statement"><span style="margin-right:0.127cm;">19.75</span></a><a id="__RefHeading__1416808_253892949"/><a id="attribute-db_row-retrieving-statement"/>db:row-retrieving-statement</h2><p class="Text_20_body">The <span class="Attribute">db:row-retrieving-statement</span> attribute specifies an SQL statement, which is executed to retrieve auto generated values after inserting a new row.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:row-retrieving-statement</span> attribute is usable with the following element: <span class="Element">&lt;db:auto-increment&gt;</span> <a href="#element-db_auto-increment">12.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:row-retrieving-statement</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_76db_scale"><span style="margin-right:0.127cm;">19.76</span></a><a id="__RefHeading__1416810_253892949"/><a id="attribute-db_scale"/>db:scale</h2><p class="Text_20_body">The <span class="Attribute">db:scale</span> attribute specifies a column's number of digits to the right of the decimal point.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:scale</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:scale</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_77db_schema-name"><span style="margin-right:0.127cm;">19.77</span></a><a id="__RefHeading__1416812_253892949"/><a id="attribute-db_schema-name"/>db:schema-name</h2><p class="Text_20_body">The <span class="Attribute">db:schema-name</span> attribute specifies the name of a schema.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:schema-name</span> attribute is usable with the following elements: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>, <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a> and <span class="Element">&lt;db:update-table&gt;</span> <a href="#element-db_update-table">12.31</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:schema-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_78db_show-deleted"><span style="margin-right:0.127cm;">19.78</span></a><a id="__RefHeading__1416814_253892949"/><a id="attribute-db_show-deleted"/>db:show-deleted</h2><p class="Text_20_body">The <span class="Attribute">db:show-deleted</span> attribute specifies that deleted records should be included in result sets.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:show-deleted</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: deleted records not included in result sets.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: deleted records included in result sets. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:show-deleted</span> attribute is usable with the following elements: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a> and <span class="Element">&lt;db:table-setting&gt;</span> <a href="#element-db_table-setting">12.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:show-deleted</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_79db_string"><span style="margin-right:0.127cm;">19.79</span></a><a id="__RefHeading__1416816_253892949"/><a id="attribute-db_string"/>db:string</h2><p class="Text_20_body">The <span class="Attribute">db:string</span> attribute specifies a separator for strings.</p><p class="Default_20_Value_borderStart">The default value for this attribute is "<span class="Attribute_20_Value_20_Instance">.</span>" (U+002E, FULL STOP).</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:string</span> attribute is usable with the following element: <span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:string</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_80db_style-name"><span style="margin-right:0.127cm;">19.80</span></a><a id="__RefHeading__1416818_253892949"/><a id="attribute-db_style-name"/>db:style-name</h2><h3 class="Heading_20_3"><a id="a19_80_1General"><span style="margin-right:0.127cm;">19.80.1</span></a><a id="__RefHeading__1416820_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">db:style-name</span> attribute specifies a style name of a style family for the element upon which it appears. </p><h3 class="Heading_20_3"><a id="a19_80_2_db_column_"><span style="margin-right:0.127cm;">19.80.2</span></a><a id="__RefHeading__1416822_253892949"/><a id="attribute-db_style-name_element-db_column"/>&lt;db:column&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:style-name</span> attribute value specifies the name of a style of the family <span class="Attribute_20_Value">table-column</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:style-name</span> attribute is usable with the following element: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_80_3_db_query_"><span style="margin-right:0.127cm;">19.80.3</span></a><a id="__RefHeading__1416824_253892949"/><a id="attribute-db_style-name_element-db_query"/>&lt;db:query&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:style-name</span> attribute value specifies the name of a style of the family <span class="Attribute_20_Value">table</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:style-name</span> attribute is usable with the following element: <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_80_4_db_table-representation_"><span style="margin-right:0.127cm;">19.80.4</span></a><a id="__RefHeading__1416826_253892949"/><a id="attribute-db_style-name_element-db_table-representation"/>&lt;db:table-representation&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:style-name</span> attribute value specifies the name of a style of the family <span class="Attribute_20_Value">table</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:style-name</span> attribute is usable with the following element: <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_81db_suppress-version-columns"><span style="margin-right:0.127cm;">19.81</span></a><a id="__RefHeading__1416828_253892949"/><a id="attribute-db_suppress-version-columns"/>db:suppress-version-columns</h2><p class="Text_20_body">The <span class="Attribute">db:suppress-version-columns</span> attribute specifies that version columns, columns that are used for versioning row content, should be suppressed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:suppress-version-columns</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: version columns are not suppressed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: version columns should be suppressed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:suppress-version-columns</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:suppress-version-columns</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_82db_system-driver-settings"><span style="margin-right:0.127cm;">19.82</span></a><a id="__RefHeading__1416830_253892949"/><a id="attribute-db_system-driver-settings"/>db:system-driver-settings</h2><p class="Text_20_body">The <span class="Attribute">db:system-driver-settings</span> attribute specifies system specific options for a connection.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:system-driver-settings</span> attribute is usable with the following element: <span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:system-driver-settings</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_83db_thousand"><span style="margin-right:0.127cm;">19.83</span></a><a id="__RefHeading__1416832_253892949"/><a id="attribute-db_thousand"/>db:thousand</h2><p class="Text_20_body">The <span class="Attribute">db:thousand</span> attribute specifies a thousand separator of numeric fields.</p><p class="Default_20_Value_borderStart">The default value for this attribute is “<span class="Attribute_20_Value_20_Instance">,</span>” (U+002C, COMMA).</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:thousand</span> attribute is usable with the following element: <span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:thousand</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_84db_title"><span style="margin-right:0.127cm;">19.84</span></a><a id="__RefHeading__1416834_253892949"/><a id="attribute-db_title"/>db:title</h2><p class="Text_20_body">The <span class="Attribute">db:title</span> attribute specifies a human-readable title of an object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:title</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>, <span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a>, <span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a>, <span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a> and <span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_85db_type"><span style="margin-right:0.127cm;">19.85</span></a><a id="__RefHeading__1416836_253892949"/><a id="attribute-db_type"/>db:type</h2><h3 class="Heading_20_3"><a id="a19_85_1General"><span style="margin-right:0.127cm;">19.85.1</span></a><a id="__RefHeading__1416838_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">db:type</span> attribute specifies a type for keys, databases, or tables, depending upon the element where it occurs.</p><h3 class="Heading_20_3"><a id="a19_85_2_db_key_"><span style="margin-right:0.127cm;">19.85.2</span></a><a id="__RefHeading__1416840_253892949"/><a id="attribute-db_type_element-db_key"/>&lt;db:key&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:type</span> attribute specifies the type of a key. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">foreign</span>: a foreign key is a tuple of values in a database record that points to a key of a record in another table. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">primary</span>: a primary key is a tuple of values that can be used to identify a row in a table. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unique</span>: a unique key specifies that the value of the key is unique but may be the NULL value.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:type</span> attribute is usable with the following element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:type</span> attribute are <span class="Attribute_20_Value">primary</span>, <span class="Attribute_20_Value">unique</span> or <span class="Attribute_20_Value">foreign</span>.</p><h3 class="Heading_20_3"><a id="a19_85_3_db_server-database_"><span style="margin-right:0.127cm;">19.85.3</span></a><a id="__RefHeading__1416842_253892949"/><a id="attribute-db_type_element-db_server-database"/>&lt;db:server-database&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:type</span> attribute specifies the type of a database. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:type</span> attribute is usable with the following element: <span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:type</span> attribute has the data type <span class="Datatype">namespacedToken</span> <a href="#datatype-namespacedToken">18.3.19</a>.</p><h3 class="Heading_20_3"><a id="a19_85_4_db_table-definition_"><span style="margin-right:0.127cm;">19.85.4</span></a><a id="__RefHeading__1416844_253892949"/><a id="attribute-db_type_element-db_table-definition"/>&lt;db:table-definition&gt;</h3><p class="Text_20_body">The <span class="Attribute">db:type</span> attribute specifies the type of a table. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">system table</span>: a table used by a database for administration.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">table</span>: a table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">view</span>: a table that is a view of another table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Implementation-defined values<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:type</span> attribute is usable with the following element: <span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_86db_type-name"><span style="margin-right:0.127cm;">19.86</span></a><a id="__RefHeading__1416846_253892949"/><a id="attribute-db_type-name"/>db:type-name</h2><p class="Text_20_body">The <span class="Attribute">db:type-name</span> attribute specifies a database dependent type name of a database column. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:type-name</span> attribute is usable with the following element: <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:type-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_87db_update-rule"><span style="margin-right:0.127cm;">19.87</span></a><a id="__RefHeading__1416848_253892949"/><a id="attribute-db_update-rule"/>db:update-rule</h2><p class="Text_20_body">The <span class="Attribute">db:update-rule</span> attribute specifies a rule that is applied for updating records in a table. It is only used for foreign keys. </p><p class="Text_20_body">The defined values for the <span class="Attribute">db:update-rule</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cascade</span>: when the primary key is updated, the foreign key (imported key) is changed to the same value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">restrict</span>: a primary key shall not be updated if it has been imported by another table as a foreign key.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no-action</span>: if the primary key has been imported, it cannot be updated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">set-default</span>: when the primary key is updated, the foreign key (imported key) is set to the default value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">set-null</span>: when the primary key is updated, the foreign key (imported key) is changed to NULL.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">no-action</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:update-rule</span> attribute is usable with the following element: <span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">db:update-rule</span> attribute are <span class="Attribute_20_Value">cascade</span>, <span class="Attribute_20_Value">restrict</span>, <span class="Attribute_20_Value">set-null</span>, <span class="Attribute_20_Value">no-action</span> or <span class="Attribute_20_Value">set-default</span>.</p><h2 class="Heading_20_2"><a id="a19_88db_use-catalog"><span style="margin-right:0.127cm;">19.88</span></a><a id="__RefHeading__1416850_253892949"/><a id="attribute-db_use-catalog"/>db:use-catalog</h2><p class="Text_20_body">The <span class="Attribute">db:use-catalog</span> attribute specifies that a catalog name should be used to reference a table in SQL statements.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:use-catalog</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: catalog name is not use to reference a table in SQL statements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: catalog name should be used to reference a table in SQL statements.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:use-catalog</span> attribute is usable with the following element: <span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:use-catalog</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_89db_use-system-user"><span style="margin-right:0.127cm;">19.89</span></a><a id="__RefHeading__1416852_253892949"/><a id="attribute-db_use-system-user"/>db:use-system-user</h2><p class="Text_20_body">The <span class="Attribute">db:use-system-user</span> attribute specifies that the name of a user as logged in to the client operating system is used.</p><p class="Text_20_body">If <span class="Attribute">db:use-system-user</span> and <span class="Attribute">db:user-name</span> attributes are omitted and the server requires a user name, the user is prompted to enter a name.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:use-system-user</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: name of user logged into client operating system is not used for login.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: name of user logged into client operating system is used for login.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:use-system-user</span> attribute is usable with the following element: <span class="Element">&lt;db:login&gt;</span> <a href="#element-db_login">12.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:use-system-user</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_90db_user-name"><span style="margin-right:0.127cm;">19.90</span></a><a id="__RefHeading__1416854_253892949"/><a id="attribute-db_user-name"/>db:user-name</h2><p class="Text_20_body">The <span class="Attribute">db:user-name</span> attribute specifies a user name for authentication upon creating a connection to a database.</p><p class="Text_20_body">If <span class="Attribute">db:user-name</span> and <span class="Attribute">db:use-system-user</span> attributes are omitted and the server requires a user name, the user is prompted to enter a name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">db:user-name</span> attribute is usable with the following element: <span class="Element">&lt;db:login&gt;</span> <a href="#element-db_login">12.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:user-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_91db_visible"><span style="margin-right:0.127cm;">19.91</span></a><a id="__RefHeading__1416856_253892949"/><a id="attribute-db_visible"/>db:visible</h2><p class="Text_20_body">The <span class="Attribute">db:visible</span> attribute specifies whether a column appears in a table grid view.</p><p class="Text_20_body">The defined values for the <span class="Attribute">db:visible</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: column does not appear in a table grid view.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: column appears in a table grid view.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">db:visible</span> attribute is usable with the following element: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">db:visible</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_92dr3d_ambient-color"><span style="margin-right:0.127cm;">19.92</span></a><a id="__RefHeading__1416858_253892949"/><a id="attribute-dr3d_ambient-color"/>dr3d:ambient-color</h2><p class="Text_20_body">The <span class="Attribute">dr3d:ambient-color</span> attribute specifies a color for ambient light. </p><p class="Note"><span class="Note_20_Label">Note: </span>Ambient light is light that seems to come from all directions.</p><p class="Text_20_body">The <span class="Attribute">dr3d:ambient-color</span> attribute, along with dr3d:diffuse-color, <span class="Attribute">dr3d:emissive-color</span>, and <span class="Attribute">dr3d:specular-color</span> specifies the four colors that define the color of a material.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:ambient-color</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:ambient-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_93dr3d_center"><span style="margin-right:0.127cm;">19.93</span></a><a id="__RefHeading__1416860_253892949"/><a id="attribute-dr3d_center"/>dr3d:center</h2><p class="Text_20_body">The <span class="Attribute">dr3d:center</span> attribute specifies the center of a sphere in a three-dimensional space.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:center</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:center</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_94dr3d_diffuse-color"><span style="margin-right:0.127cm;">19.94</span></a><a id="__RefHeading__1416862_253892949"/><a id="attribute-dr3d_diffuse-color"/>dr3d:diffuse-color</h2><p class="Text_20_body">The <span class="Attribute">dr3d:diffuse-color</span> attribute specifies the base color that a light is emitting.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:diffuse-color</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:light&gt;</span> <a href="#element-dr3d_light">10.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:diffuse-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_95dr3d_direction"><span style="margin-right:0.127cm;">19.95</span></a><a id="__RefHeading__1416864_253892949"/><a id="attribute-dr3d_direction"/>dr3d:direction</h2><p class="Text_20_body">The <span class="Attribute">dr3d:direction</span> attribute specifies the direction in which light is emitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:direction</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:light&gt;</span> <a href="#element-dr3d_light">10.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:direction</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_96dr3d_distance"><span style="margin-right:0.127cm;">19.96</span></a><a id="__RefHeading__1416866_253892949"/><a id="attribute-dr3d_distance"/>dr3d:distance</h2><p class="Text_20_body">The <span class="Attribute">dr3d:distance</span> attribute specifies the distance between a camera and an object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:distance</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:distance</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_97dr3d_enabled"><span style="margin-right:0.127cm;">19.97</span></a><a id="__RefHeading__1416868_253892949"/><a id="attribute-dr3d_enabled"/>dr3d:enabled</h2><p class="Text_20_body">The <span class="Attribute">dr3d:enabled</span> attribute specifies if a light is enabled. If a light is not enabled, it does not emit any light.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:enabled</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: light is not enabled.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: light is enabled.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:enabled</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:light&gt;</span> <a href="#element-dr3d_light">10.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:enabled</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_98dr3d_focal-length"><span style="margin-right:0.127cm;">19.98</span></a><a id="__RefHeading__1416870_253892949"/><a id="attribute-dr3d_focal-length"/>dr3d:focal-length</h2><p class="Text_20_body">The <span class="Attribute">dr3d:focal-length</span> attribute specifies the focal length of a virtual camera in a scene.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:focal-length</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:focal-length</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_99dr3d_lighting-mode"><span style="margin-right:0.127cm;">19.99</span></a><a id="__RefHeading__1416872_253892949"/><a id="attribute-dr3d_lighting-mode"/>dr3d:lighting-mode</h2><h3 class="Heading_20_3"><a id="a19_99_1General"><span style="margin-right:0.127cm;">19.99.1</span></a><a id="__RefHeading__1416874_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">dr3d:lighting-mode</span> attribute specifies the use of lighting in three-dimensional scenes</p><p class="Note"><span class="Note_20_Label">Note</span>: The <span class="Attribute">dr3d:lighting-mode</span> attribute is also defined for 3D objects. <a href="#property-dr3d_lighting-mode">20.79</a></p><h3 class="Heading_20_3"><a id="a19_99_2_chart_plot-area_"><span style="margin-right:0.127cm;">19.99.2</span></a><a id="__RefHeading__1416876_253892949"/><a id="attribute-dr3d_lighting-mode_element-chart_plot-area"/>&lt;chart:plot-area&gt;</h3><p class="Text_20_body">The <span class="Attribute">dr3d:lighting-mode</span> attribute specifies whether lighting is used in a three-dimensional chart.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:lighting-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: lighting is not used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: lighting is used.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:lighting-mode</span> attribute is usable with the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:lighting-mode</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h3 class="Heading_20_3"><a id="a19_99_3_dr3d_scene_"><span style="margin-right:0.127cm;">19.99.3</span></a><a id="__RefHeading__1416878_253892949"/><a id="attribute-dr3d_lighting-mode_element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">The <span class="Attribute">dr3d:lighting-mode</span> attribute specifies whether lighting is used in a three-dimensional scene.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:lighting-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: lighting is not used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: lighting is used.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:lighting-mode</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:lighting-mode</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_100dr3d_max-edge"><span style="margin-right:0.127cm;">19.100</span></a><a id="__RefHeading__1416880_253892949"/><a id="attribute-dr3d_max-edge"/>dr3d:max-edge </h2><p class="Text_20_body">The <span class="Attribute">dr3d:max-edge</span> attribute specifies the maximum x, y and z coordinate values for a cube. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:max-edge</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:max-edge</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_101dr3d_min-edge"><span style="margin-right:0.127cm;">19.101</span></a><a id="__RefHeading__1416882_253892949"/><a id="attribute-dr3d_min-edge"/>dr3d:min-edge</h2><p class="Text_20_body">The <span class="Attribute">dr3d:min-edge</span> attribute specifies the minimum x, y and z coordinate values for a cube. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:min-edge</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:min-edge</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_102dr3d_projection"><span style="margin-right:0.127cm;">19.102</span></a><a id="__RefHeading__1416884_253892949"/><a id="attribute-dr3d_projection"/>dr3d:projection</h2><p class="Text_20_body">The <span class="Attribute">dr3d:projection</span> attribute specifies a projection mode.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:projection</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">parallel</span>: distance from the center of projection to the projection plane is infinite.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">erspective</span>: distance from the center of projection to the projection plane is finite.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a> element the default value for this attribute is <span class="Attribute_20_Value">parallel</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">dr3d:projection</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a> and <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:projection</span> attribute are <span class="Attribute_20_Value">parallel</span> or <span class="Attribute_20_Value">perspective</span>.</p><h2 class="Heading_20_2"><a id="a19_103dr3d_shade-mode"><span style="margin-right:0.127cm;">19.103</span></a><a id="__RefHeading__1416886_253892949"/><a id="attribute-dr3d_shade-mode"/>dr3d:shade-mode</h2><p class="Text_20_body">The <span class="Attribute">dr3d:shade-mode</span> attribute specifies how lighting is calculated for rendered surfaces.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:shade-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">draft</span>: surfaces are not lit and drawn as wireframe only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">flat</span>: lighting is calculated by one surface normal.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">gouraud</span>: lighting is calculated by interpolating the color calculated with the surface normals at each edge.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">phong</span>: lighting is calculated by interpolating the surface normals over the surface.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a> element the default value for this attribute is <span class="Attribute_20_Value">flat</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">dr3d:shade-mode</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a> and <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:shade-mode</span> attribute are <span class="Attribute_20_Value">flat</span>, <span class="Attribute_20_Value">phong</span>, <span class="Attribute_20_Value">gouraud</span> or <span class="Attribute_20_Value">draft</span>.</p><h2 class="Heading_20_2"><a id="a19_104dr3d_shadow-slant"><span style="margin-right:0.127cm;">19.104</span></a><a id="__RefHeading__1416888_253892949"/><a id="attribute-dr3d_shadow-slant"/>dr3d:shadow-slant</h2><p class="Text_20_body">The <span class="Attribute">dr3d:shadow-slant</span> attribute specifies an angle from a three-dimensional scene to a virtual paper on which a shadow is cast. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:shadow-slant</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:shadow-slant</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_105dr3d_size"><span style="margin-right:0.127cm;">19.105</span></a><a id="__RefHeading__1416890_253892949"/><a id="attribute-dr3d_size"/>dr3d:size</h2><p class="Text_20_body">The <span class="Attribute">dr3d:size</span> attribute specifies the size of a sphere in a three-dimensional space.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:size</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:size</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_106dr3d_specular"><span style="margin-right:0.127cm;">19.106</span></a><a id="__RefHeading__1416892_253892949"/><a id="attribute-dr3d_specular"/>dr3d:specular</h2><p class="Text_20_body">The <span class="Attribute">dr3d:specular</span> attribute specifies whether a light causes a specular reflection on objects. consumers may evaluate this attribute only for the first light in a scene.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:specular</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: light does not cause specular reflection.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: light does cause specular reflection.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:specular</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:light&gt;</span> <a href="#element-dr3d_light">10.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:specular</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_107dr3d_transform"><span style="margin-right:0.127cm;">19.107</span></a><a id="__RefHeading__1416894_253892949"/><a id="attribute-dr3d_transform"/>dr3d:transform</h2><p class="Text_20_body">The <span class="Attribute">dr3d:transform</span> attribute specifies a list of transform definitions, which are applied in the order provided. The individual transform definitions are separated by white space. </p><p class="Text_20_body">The defined transforms are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">matrix(</span><span class="Attribute_20_Value_20_Param">&lt;a&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;b&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;c&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;d&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;e&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;f&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;g&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;h&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;i&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;j&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;k&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;l&gt;</span><span class="Attribute_20_Value_20_Instance">)</span>: specifies a transformation in the form of a transformation matrix of twelve values. The values describe a standard 4x3 homogeneous transformation matrix in column-major order, where the right column (&lt;j&gt;, &lt;k&gt;, &lt;l&gt;) describes the translation. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">rotatex(</span><span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span><span class="Attribute_20_Value_20_Instance">)</span>: specifies a rotation by <span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span> degrees along the x-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">rotatey(</span><span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span><span class="Attribute_20_Value_20_Instance">)</span>: specifies a rotation by <span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span> degrees along the y-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">rotatez(</span><span class="Attribute_20_Value_20_Param">&lt;rotate-angle</span>&gt;<span class="Attribute_20_Value_20_Instance">)</span>: specifies a rotation by <span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span> degrees along the z-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">scale(</span><span class="Attribute_20_Value_20_Param">&lt;sx&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;sy&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;sz&gt;</span><span class="Attribute_20_Value_20_Instance">)</span>: specifies a scale operation by <span class="Attribute_20_Value_20_Param">sx</span>, <span class="Attribute_20_Value_20_Param">sy</span> and <span class="Attribute_20_Value_20_Param">sz</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">translate(</span><span class="Attribute_20_Value_20_Param">&lt;tx&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;ty&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;tz</span>&gt;<span class="Attribute_20_Value_20_Instance">)</span>: specifies a translation by <span class="Attribute_20_Value_20_Param">tx</span>, <span class="Attribute_20_Value_20_Param">ty</span> and <span class="Attribute_20_Value_20_Param">tz</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:transform</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a> and <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:transform</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_108dr3d_vpn"><span style="margin-right:0.127cm;">19.108</span></a><a id="__RefHeading__1416896_253892949"/><a id="attribute-dr3d_vpn"/>dr3d:vpn</h2><p class="Text_20_body">The <span class="Attribute">dr3d:vpn</span> attribute specifies a pointer towards projected objects.</p><p class="Text_20_body">With the <span class="Attribute">dr3d:vrp</span> and <span class="Attribute">dr3d:vup</span> attributes, the <span class="Attribute">dr3d:vpn</span> attribute specifies a viewing volume. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:vpn</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:vpn</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_109dr3d_vrp"><span style="margin-right:0.127cm;">19.109</span></a><a id="__RefHeading__1416898_253892949"/><a id="attribute-dr3d_vrp"/>dr3d:vrp</h2><p class="Text_20_body">The <span class="Attribute">dr3d:vrp</span> attribute specifies an origin.</p><p class="Text_20_body">With the <span class="Attribute">dr3d:vpn</span> and <span class="Attribute">dr3d:vup</span> attributes, the <span class="Attribute">dr3d:vrp</span> attribute specifies a viewing volume.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:vrp</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:vrp</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_110dr3d_vup"><span style="margin-right:0.127cm;">19.110</span></a><a id="__RefHeading__1416900_253892949"/><a id="attribute-dr3d_vup"/>dr3d:vup</h2><p class="Text_20_body">The <span class="Attribute">dr3d:vup</span> attribute specifies an up vector. </p><p class="Text_20_body">With the <span class="Attribute">dr3d:vpn</span> and <span class="Attribute">dr3d:vrp</span> attributes, the <span class="Attribute">dr3d:vup</span> attribute specifies a viewing volume.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:vup</span> attribute is usable with the following elements: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a> and <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:vup</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_111draw_align"><span style="margin-right:0.127cm;">19.111</span></a><a id="__RefHeading__1416902_253892949"/><a id="attribute-draw_align"/>draw:align</h2><p class="Text_20_body">The <span class="Attribute">draw:align</span> attribute specifies the shape edge where a glue point is positioned.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-left</span>: The position of the glue point is specified relative to the bottom-left corner of the shape's bounding box. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">ottom-right</span>: The position of the glue point is specified relative to the bottom-right corner of the shape's bounding box. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">enter</span>: The position of the glue point is specified relative to the center of the shape's bounding box. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: The position of the glue point is specified relative to the right of the shape's bounding box. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op</span>: The position of the glue point is specified relative to the top of the shape's bounding box. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op-right</span>: The position of the glue point is specified relative to the top-right corner of the shape's bounding box. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op-left</span>: The position of the glue point is specified relative to the top-left corner of the shape's bounding box. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:align</span> attribute is usable with the following element: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:align</span> attribute are <span class="Attribute_20_Value">top-left</span>, <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">top-right</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">bottom-left</span> or <span class="Attribute_20_Value">bottom-right</span>.</p><h2 class="Heading_20_2"><a id="a19_112draw_angle"><span style="margin-right:0.127cm;">19.112</span></a><a id="__RefHeading__1416904_253892949"/><a id="attribute-draw_angle"/>draw:angle</h2><p class="Text_20_body">The <span class="Attribute">draw:angle</span> attribute specifies an angle that rotates the axis at which the gradient values are interpolated. This attribute is ignored for radial style gradients. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:angle</span> attribute is usable with the following elements: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a> and <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_113draw_archive"><span style="margin-right:0.127cm;">19.113</span></a><a id="__RefHeading__1416906_253892949"/><a id="attribute-draw_archive"/>draw:archive</h2><p class="Text_20_body">The <span class="Attribute">draw:archive</span> attribute is equivalent to the archive attribute of an <span class="Alien_20_Element">&lt;applet&gt;</span> element in HTML. See. §13.4 of <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:archive</span> attribute is usable with the following element: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:archive</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_114draw_border"><span style="margin-right:0.127cm;">19.114</span></a><a id="__RefHeading__1416908_253892949"/><a id="attribute-draw_border"/>draw:border</h2><p class="Text_20_body">The <span class="Attribute">draw:border</span> attribute specifies a percentage value that is used to scale a border area which is filled by a solid color. </p><p class="Text_20_body">For linear, square, rectangle, radial and elliptical gradients the start color is used. For axial gradients, the end color is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:border</span> attribute is usable with the following elements: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a> and <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:border</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_115draw_caption-id"><span style="margin-right:0.127cm;">19.115</span></a><a id="__RefHeading__1416910_253892949"/><a id="attribute-draw_caption-id"/>draw:caption-id</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-id</span> attribute establishes a relationship between a drawing shape and its caption. It takes a value of type IDREF. The value for the <span class="Attribute">draw:caption-id</span> attribute is the target ID assigned to the <span class="Element">&lt;draw:text-box&gt;</span> element (see <a href="#element-draw_text-box">10.4.3</a>) that contains the caption.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> When a caption is assigned to a drawing shape, an id shall be assigned to the element containing the text used to caption a drawing shape. Removing the caption should result in removing the <span class="Attribute">draw:caption-id</span> attribute of the drawing shape that was being captioned.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-id</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-id</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_116draw_caption-point-x"><span style="margin-right:0.127cm;">19.116</span></a><a id="__RefHeading__1416912_253892949"/><a id="attribute-draw_caption-point-x"/>draw:caption-point-x</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-point-x</span> attribute, along with the <span class="Attribute">draw:caption-point-y</span> specifies the position of a point that is captioned. A set of lines are rendered to that point from the caption area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-point-x</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-point-x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h2 class="Heading_20_2"><a id="a19_117draw_caption-point-y"><span style="margin-right:0.127cm;">19.117</span></a><a id="__RefHeading__1416914_253892949"/><a id="attribute-draw_caption-point-y"/>draw:caption-point-y</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-point-y</span> attribute, along with the <span class="Attribute">draw:caption-point-x</span> specifies the position of a point that is captioned. A set of lines are rendered to that point from the caption area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-point-y</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-point-y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h2 class="Heading_20_2"><a id="a19_118draw_chain-next-name"><span style="margin-right:0.127cm;">19.118</span></a><a id="__RefHeading__1416916_253892949"/><a id="attribute-draw_chain-next-name"/>draw:chain-next-name</h2><p class="Text_20_body">The <span class="Attribute">draw:chain-next-name</span> attribute specifies a name that is used to chain text boxes together for cases where the content of a text box exceeds its capacity. The content flows into the next text box in the chain. The value of this attribute is the name of the next text box in the chain.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:chain-next-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:chain-next-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_119draw_class-id"><span style="margin-right:0.127cm;">19.119</span></a><a id="__RefHeading__1416918_253892949"/><a id="attribute-draw_class-id"/>draw:class-id</h2><p class="Text_20_body">The <span class="Attribute">draw:class-id</span> attribute specifies the OLE class id of an object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:class-id</span> attribute is usable with the following element: <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:class-id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_120draw_class-names"><span style="margin-right:0.127cm;">19.120</span></a><a id="__RefHeading__1416920_253892949"/><a id="attribute-draw_class-names"/>draw:class-names</h2><p class="Text_20_body">The <span class="Attribute">draw:class-names</span> attribute specifies a white space separated list of styles with the family value of graphic. The referenced styles are applied in the order they are contained in the list. </p><p class="Text_20_body">If both <span class="Attribute">draw:style-name</span> and <span class="Attribute">draw:class-names</span> are present, the style referenced by the <span class="Attribute">draw:style-name</span> attribute is applied before the styles referenced by the <span class="Attribute">draw:class-names</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:class-names</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:class-names</span> attribute has the data type <span class="Datatype">styleNameRefs</span> <a href="#datatype-styleNameRefs">18.3.33</a>.</p><h2 class="Heading_20_2"><a id="a19_121draw_code"><span style="margin-right:0.127cm;">19.121</span></a><a id="__RefHeading__1416922_253892949"/><a id="attribute-draw_code"/>draw:code</h2><p class="Text_20_body">The <span class="Attribute">draw:code</span> attribute is equivalent to the code attribute of an <span class="Alien_20_Element">&lt;applet&gt;</span> element in HTML. See. §13.4 of <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:code</span> attribute is usable with the following element: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:code</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_122draw_color"><span style="margin-right:0.127cm;">19.122</span></a><a id="__RefHeading__1416924_253892949"/><a id="attribute-draw_color"/>draw:color</h2><h3 class="Heading_20_3"><a id="a19_122_1General"><span style="margin-right:0.127cm;">19.122.1</span></a><a id="__RefHeading__1416926_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:color</span> attribute specifies different colors depending upon the element where it appears. </p><h3 class="Heading_20_3"><a id="a19_122_2_draw_hatch_"><span style="margin-right:0.127cm;">19.122.2</span></a><a id="__RefHeading__1416928_253892949"/><a id="attribute-draw_color_element-draw_hatch"/>&lt;draw:hatch&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:color</span> attribute specifies the color of hatch lines.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:color</span> attribute is usable with the following element: <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h3 class="Heading_20_3"><a id="a19_122_3_presentation_dim_"><span style="margin-right:0.127cm;">19.122.3</span></a><a id="__RefHeading__1416930_253892949"/><a id="attribute-draw_color_element-presentation_dim"/>&lt;presentation:dim&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:color</span> attribute specifies the color of that is used to fill a shape when the shape is dimmed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:color</span> attribute is usable with the following element: <span class="Element">&lt;presentation:dim&gt;</span> <a href="#element-presentation_dim">10.8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_123draw_concave"><span style="margin-right:0.127cm;">19.123</span></a><a id="__RefHeading__1416932_253892949"/><a id="attribute-draw_concave"/>draw:concave</h2><p class="Text_20_body">The <span class="Attribute">draw:concave</span> attribute specifies whether a regular polygon is convex or concave.  For a concave regular polygon the <span class="Attribute">draw:sharpness</span> attribute shall be specified in addition to the <span class="Attribute">draw:concave</span> attribute. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:concave</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: polygon is convex.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: polygon is concave.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:concave</span> attribute is usable with the following element: <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:concave</span> attribute are <span class="Attribute_20_Value">false</span> or <span class="Attribute_20_Value">true</span>.</p><h2 class="Heading_20_2"><a id="a19_124draw_concentric-gradient-fill-allowed"><span style="margin-right:0.127cm;">19.124</span></a><a id="__RefHeading__1416934_253892949"/><a id="attribute-draw_concentric-gradient-fill-allowed"/>draw:concentric-gradient-fill-allowed</h2><p class="Text_20_body">The <span class="Source_20_Text">draw:concentric-gradient-fill-allowed</span> attribute specifies the rendering of a shape with a concentric gradient that uses a custom shape path. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:concentric-gradient-fill-allowed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the rendering of a shape with a concentric gradient that does not use a custom shape path. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the rendering of a shape with a concentric gradient that does use a custom shape path. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:concentric-gradient-fill-allowed</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:concentric-gradient-fill-allowed</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_125draw_control"><span style="margin-right:0.127cm;">19.125</span></a><a id="__RefHeading__1416936_253892949"/><a id="attribute-draw_control"/>draw:control</h2><p class="Text_20_body">The <span class="Attribute">draw:control</span> attribute specifies a control within a form that is linked to the control shape by its ID.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:control</span> attribute is usable with the following element: <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:control</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_126draw_copy-of"><span style="margin-right:0.127cm;">19.126</span></a><a id="__RefHeading__1416938_253892949"/><a id="attribute-draw_copy-of"/>draw:copy-of</h2><p class="Text_20_body">The <span class="Attribute">draw:copy-of</span> attribute specifies that a frame displays the contents of another frame. This does not effect style and position information. The style and position information of the frame with the <span class="Attribute">draw:copy-of</span> attribute is used to render the copied contents.</p><p class="Note"><span class="Note_20_Label">Note:</span> Multiple frames can be set to display the exact same underlying data: for instance for a company logo, that shall appear somewhere on every page, without being part of a header or footer.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:copy-of</span> attribute is usable with the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:copy-of</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_127draw_corner-radius"><span style="margin-right:0.127cm;">19.127</span></a><a id="__RefHeading__1416940_253892949"/><a id="attribute-draw_corner-radius"/>draw:corner-radius</h2><p class="Text_20_body">The <span class="Attribute">draw:corner-radius</span> attribute specifies the radius of the circle used to round off the corners of a caption <span class="Element">&lt;draw:caption&gt;</span>, rectangle <span class="Element">&lt;draw:rect&gt;</span>, or a text-box <span class="Element">&lt;draw:text-box&gt;</span>.</p><p class="Text_20_body">The <span class="Attribute">svg:rx</span> and <span class="Attribute">svg:ry</span> attributes can also be used to round off the corners of a rectangle <span class="Element">&lt;draw:rect&gt;</span>.</p><p class="Text_20_body">If <span class="Attribute">svg:rx</span> and/or <span class="Attribute">svg:ry</span> and draw:corner-radius attributes are present on an element, the <span class="Attribute">svg:rx</span> and <span class="Attribute">svg:ry</span> attributes control the rounding applied to the shape defined by the element. If one or both of <span class="Attribute">svg:rx</span> and <span class="Attribute">svg:ry</span> attributes are present, any <span class="Attribute">draw:corner-radius</span> attribute is ignored. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:corner-radius</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:corner-radius</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a19_128draw_corners"><span style="margin-right:0.127cm;">19.128</span></a><a id="__RefHeading__1416942_253892949"/><a id="attribute-draw_corners"/>draw:corners</h2><p class="Text_20_body">The <span class="Attribute">draw:corners</span> attribute specifies the number of polygon corners on a polygon shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:corners</span> attribute is usable with the following element: <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:corners</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_129draw_cx"><span style="margin-right:0.127cm;">19.129</span></a><a id="__RefHeading__1416944_253892949"/><a id="attribute-draw_cx"/>draw:cx</h2><p class="Text_20_body">The <span class="Attribute">draw:cx</span> attribute, along with the <span class="Attribute">draw:cy</span> attribute, specifies the center of the geometry that is used for a gradient, if the gradient style is <span class="Attribute_20_Value">ellipsoid</span>, <span class="Attribute_20_Value">radial</span>, <span class="Attribute_20_Value">rectangular</span>, or <span class="Attribute_20_Value">square</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:cx</span> attribute is usable with the following elements: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a> and <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:cx</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_130draw_cy"><span style="margin-right:0.127cm;">19.130</span></a><a id="__RefHeading__1416946_253892949"/><a id="attribute-draw_cy"/>draw:cy</h2><p class="Text_20_body">The <span class="Attribute">draw:cy</span> attribute, along with the <span class="Attribute">draw:cx</span> attribute, specifies the center of the geometry that is used for a gradient, if the gradient style is <span class="Attribute_20_Value">ellipsoid</span>, <span class="Attribute_20_Value">radial</span>, <span class="Attribute_20_Value">rectangular</span>, or <span class="Attribute_20_Value">square</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:cy</span> attribute is usable with the following elements: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a> and <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:cy</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_131draw_data"><span style="margin-right:0.127cm;">19.131</span></a><a id="__RefHeading__1416948_253892949"/><a id="attribute-draw_data"/>draw:data</h2><p class="Text_20_body">The <span class="Attribute">draw:data</span> attribute specifies rendering engine specific data for a custom shape. This attribute is only evaluated if a rendering engine is specified by the <span class="Attribute">draw:engine</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:data</span> attribute is usable with the following element: <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:data</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_132draw_display"><span style="margin-right:0.127cm;">19.132</span></a><a id="__RefHeading__1416950_253892949"/><a id="attribute-draw_display"/>draw:display</h2><p class="Text_20_body">The <span class="Attribute">draw:display</span> attribute specifies the visibility of drawing objects contained in a layer for display or printing.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">always</span>: drawing objects are visible on screen and in printed output.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: drawing objects are not visible on screen or in printed output.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">printer</span>: drawing objects are visible in printed output but not on screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">screen</span>: drawing objects are visible on screen but not in printed output.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">always</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:display</span> attribute is usable with the following element: <span class="Element">&lt;draw:layer&gt;</span> <a href="#element-draw_layer">10.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:display</span> attribute are <span class="Attribute_20_Value">always</span>, <span class="Attribute_20_Value">screen</span>, <span class="Attribute_20_Value">printer</span> or <span class="Attribute_20_Value">none</span>.</p><h2 class="Heading_20_2"><a id="a19_133draw_display-name"><span style="margin-right:0.127cm;">19.133</span></a><a id="__RefHeading__1416952_253892949"/><a id="attribute-draw_display-name"/>draw:display-name</h2><h3 class="Heading_20_3"><a id="a19_133_1General"><span style="margin-right:0.127cm;">19.133.1</span></a><a id="__RefHeading__1416954_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies a name as it should appear in the user interface.  If this attribute is not present, the display name is the same as the internal name.</p><h3 class="Heading_20_3"><a id="a19_133_2_draw_fill-image_"><span style="margin-right:0.127cm;">19.133.2</span></a><a id="__RefHeading__1416956_253892949"/><a id="attribute-draw_display-name_element-draw_fill-image"/>&lt;draw:fill-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a fill image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_3_draw_gradient_"><span style="margin-right:0.127cm;">19.133.3</span></a><a id="__RefHeading__1416958_253892949"/><a id="attribute-draw_display-name_element-draw_gradient"/>&lt;draw:gradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a gradient.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_4_draw_hatch_"><span style="margin-right:0.127cm;">19.133.4</span></a><a id="__RefHeading__1416960_253892949"/><a id="attribute-draw_display-name_element-draw_hatch"/>&lt;draw:hatch&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a hatch style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_5_draw_marker_"><span style="margin-right:0.127cm;">19.133.5</span></a><a id="__RefHeading__1416962_253892949"/><a id="attribute-draw_display-name_element-draw_marker"/>&lt;draw:marker&gt; </h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a marker.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:marker&gt;</span> <a href="#element-draw_marker">16.40.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_6_draw_opacity_"><span style="margin-right:0.127cm;">19.133.6</span></a><a id="__RefHeading__1416964_253892949"/><a id="attribute-draw_display-name_element-draw_opacity"/>&lt;draw:opacity&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of an opacity gradient.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_7_draw_stroke-dash_"><span style="margin-right:0.127cm;">19.133.7</span></a><a id="__RefHeading__1416966_253892949"/><a id="attribute-draw_display-name_element-draw_stroke-dash"/>&lt;draw:stroke-dash&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a dash style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_8_svg_linearGradient_"><span style="margin-right:0.127cm;">19.133.8</span></a><a id="__RefHeading__1416968_253892949"/><a id="attribute-draw_display-name_element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a gradient. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_133_9_svg_radialGradient_"><span style="margin-right:0.127cm;">19.133.9</span></a><a id="__RefHeading__1416970_253892949"/><a id="attribute-draw_display-name_element-svg_radialGradient"/>&lt;svg:radialGradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:display-name</span> attribute specifies the name of a gradient. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:display-name</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_134draw_distance"><span style="margin-right:0.127cm;">19.134</span></a><a id="__RefHeading__1416972_253892949"/><a id="attribute-draw_distance"/>draw:distance</h2><h3 class="Heading_20_3"><a id="a19_134_1General"><span style="margin-right:0.127cm;">19.134.1</span></a><a id="__RefHeading__1416974_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:distance</span> attribute specifies distances.</p><h3 class="Heading_20_3"><a id="a19_134_2_draw_hatch_"><span style="margin-right:0.127cm;">19.134.2</span></a><a id="__RefHeading__1416976_253892949"/><a id="attribute-draw_distance_element-draw_hatch"/>&lt;draw:hatch&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:distance</span> attribute specifies the distance between two hatch lines. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:distance</span> attribute is usable with the following element: <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:distance</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_134_3_draw_stroke-dash_"><span style="margin-right:0.127cm;">19.134.3</span></a><a id="__RefHeading__1416978_253892949"/><a id="attribute-draw_distance_element-draw_stroke-dash"/>&lt;draw:stroke-dash&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:distance</span> attribute specifies the distance between the dashes of a stroke. </p><p class="Text_20_body">The value of the attribute may be an absolute length or a percentage value. Percentage values are relative to the width of the stroke as defined by the <span class="Attribute">svg:stroke-width</span> attribute. <a id="DDE_LINK22"/><a href="#property-svg_stroke-width">20.400</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:distance</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:distance</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_135draw_dots1"><span style="margin-right:0.127cm;">19.135</span></a><a id="__RefHeading__1416980_253892949"/><a id="attribute-draw_dots1"/>draw:dots1</h2><p class="Text_20_body">The <span class="Attribute">draw:dots1</span> attribute specifies the number of dashes for the first sequence in an alternating sequence of dots. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:dots1</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:dots1</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_136draw_dots1-length"><span style="margin-right:0.127cm;">19.136</span></a><a id="__RefHeading__1416982_253892949"/><a id="attribute-draw_dots1-length"/>draw:dots1-length</h2><p class="Text_20_body">The <span class="Attribute">draw:dots1-length</span> attributes specifies the length of the dashes in the sequence specified by <span class="Attribute">draw:dots1</span>. </p><p class="Text_20_body">The value of the attribute may be an absolute length or a percentage value. Percentage values are relative to the width of the stroke as defined by the <span class="Attribute">svg:stroke-width</span> attribute. <a href="#property-svg_stroke-width">20.400</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:dots1-length</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:dots1-length</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_137draw_dots2"><span style="margin-right:0.127cm;">19.137</span></a><a id="__RefHeading__1416984_253892949"/><a id="attribute-draw_dots2"/>draw:dots2</h2><p class="Text_20_body">The <span class="Attribute">draw:dots2</span> attribute specifies the number of dashes for the second sequence in an alternating sequence of dots. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:dots2</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:dots2</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_138draw_dots2-length"><span style="margin-right:0.127cm;">19.138</span></a><a id="__RefHeading__1416986_253892949"/><a id="attribute-draw_dots2-length"/>draw:dots2-length</h2><p class="Text_20_body">The <span class="Attribute">draw:dots2-length</span> attributes specifies the length of the dashes in the sequence specified by <span class="Attribute">draw:dots2</span>. </p><p class="Text_20_body">The value of the attribute may be an absolute length or a percentage value. Percentage values relative to the width of the stroke as defined by the <span class="Attribute">svg:stroke-width</span> attribute. <a href="#property-svg_stroke-width">20.400</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:dots2-length</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:dots2-length</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_139draw_end"><span style="margin-right:0.127cm;">19.139</span></a><a id="__RefHeading__1416988_253892949"/><a id="attribute-draw_end"/>draw:end</h2><p class="Text_20_body">The <span class="Attribute">draw:end</span> attributes specifies the end value for the <span class="Element">&lt;draw:opacity&gt;</span> element, which interpolates between the value of this attribute and <span class="Attribute">draw:start</span>. The defined value range for the <span class="Attribute">draw:end</span> attribute is 0% to 100%, where 0% is transparent and 100% is opaque.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end</span> attribute is usable with the following element: <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_140draw_end-angle"><span style="margin-right:0.127cm;">19.140</span></a><a id="__RefHeading__1416990_253892949"/><a id="attribute-draw_end-angle"/>draw:end-angle</h2><p class="Text_20_body">The <span class="Attribute">draw:end-angle</span> attribute specifies the end angle of an arc, cut, or section for circles where the <span class="Attribute">draw:kind</span> attribute value is <span class="Attribute_20_Value">arc</span>, <span class="Attribute_20_Value">cut</span>, or <span class="Attribute_20_Value">section</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-angle</span> attribute is usable with the following elements: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a> and <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_141draw_end-color"><span style="margin-right:0.127cm;">19.141</span></a><a id="__RefHeading__1416992_253892949"/><a id="attribute-draw_end-color"/>draw:end-color</h2><p class="Text_20_body">The <span class="Attribute">draw:end-color</span> attribute specifies the end value for the <span class="Element">&lt;draw:gradient&gt;</span> element, which interpolates between the value of this attribute and <span class="Attribute">draw:start-color</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-color</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_142draw_end-glue-point"><span style="margin-right:0.127cm;">19.142</span></a><a id="__RefHeading__1416994_253892949"/><a id="attribute-draw_end-glue-point"/>draw:end-glue-point</h2><p class="Text_20_body">The <span class="Attribute">draw:end-glue-point</span> attribute identifies the glue point in a shape where a connector ends by its number. See <a href="#element-draw_glue-point">10.3.16</a>. Glue point numbers are defined by the <span class="Attribute">draw:id</span> attributes of the glue point elements <span class="Element">&lt;draw:glue-point&gt;</span>. See <a href="#attribute-draw_id">19.187</a>.</p><p class="Text_20_body">If the connector is not connected to a shape, this attribute is ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-glue-point</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-glue-point</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_143draw_end-intensity"><span style="margin-right:0.127cm;">19.143</span></a><a id="__RefHeading__1416996_253892949"/><a id="attribute-draw_end-intensity"/>draw:end-intensity</h2><p class="Text_20_body">The <span class="Attribute">draw:end-intensity</span> attribute specifies the intensity of the gradient's end color as a percentage value. If it is not specified, the color is used at 100% intensity. The defined value range for the <span class="Attribute">draw:end-intensity</span> attribute is 0% to 100%, </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-intensity</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-intensity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_144draw_end-shape"><span style="margin-right:0.127cm;">19.144</span></a><a id="__RefHeading__1416998_253892949"/><a id="attribute-draw_end-shape"/>draw:end-shape</h2><p class="Text_20_body">The <span class="Attribute">draw:end-shape</span> attribute specifies a drawing shape to which the end of a connector is connected by its ID.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-shape</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-shape</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_145draw_enhanced-path"><span style="margin-right:0.127cm;">19.145</span></a><a id="__RefHeading__1417000_253892949"/><a id="attribute-draw_enhanced-path"/>draw:enhanced-path</h2><p class="Text_20_body">The <span class="Attribute">draw:enhanced-path</span> attribute specifies a path that is the outline of a shape. </p><p class="Text_20_body">The syntax of a value for a <span class="Attribute">draw:enhanced-path</span> attribute is defined as:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Commands are expressed as one character. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Commands are followed by parameters.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Commands and parameters are delimited by white space characters. Parameters may also be delimited by comma “,” (U+002C, COMMA) characters.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>White space and commas may be eliminated if they are not necessary to identify individual commands or parameters. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If a command is repeated multiple times, all repeated command characters except the first one may be omitted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The decimal delimiter is the ”.” (U+002E, FULL STOP) character. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">A parameter in the value of a <span class="Attribute">draw:enhanced-path</span> attribute may be:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>An integer value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>An integer value preceded by a “$” (U+0024, DOLLAR SIGN) character. Such a value is an index to a <span class="Attribute">draw:modifiers</span> attribute on the element where the <span class="Attribute">draw:enhanced-path</span> attribute appears. The corresponding modifier value is used as a parameter value. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A floating point value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A formula name, preceded by a “?” (U+003F, QUESTION MARK) character. The result of the value of the <span class="Attribute">draw:formula</span> attribute of the <span class="Element">&lt;draw:equation&gt;</span> child element of the <span class="Element">&lt;draw:enhanced-geometry&gt;</span> element on which the <span class="Attribute">draw:enhanced-path</span> attribute appears is used as the parameter value. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The syntax used in Table <a href="#refTable9">10</a> for parameters is: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>(): grouping of parameters.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>+: 1 or more of the given parameter(s) shall be present.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The following commands are defined:</p><p class="Table">Table <a id="refTable9"/>10 - Enhanced path commands</p><table border="0" cellspacing="0" cellpadding="0" class="Table1"><colgroup><col width="87"/><col width="78"/><col width="175"/><col width="326"/></colgroup><tr><td style="text-align:left;width:0.7813in; " class="Table1_A1"><p class="Table_20_Heading">Command</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A1"><p class="Table_20_Heading">Name</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A1"><p class="Table_20_Heading">Parameters</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D1"><p class="Table_20_Heading">Description</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">A</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">arcto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x1 y1 x2 y2 x3 y3 x4 y4) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">(x1, y1) and (x2, y2) define the bounding box of a ellipse. A line is then drawn from the current point to the start angle of the arc that is specified by the radial vector of point (x3, y3) and then counter clockwise to the end-angle that is specified by point (x4, y4).</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">B</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">arc</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x1 y1 x2 y2 x3 y3 x4 y4) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">The same as the “A” command, except that a implied moveto to the starting point is done.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">C</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">curveto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x1 y1 x2 y2 x y) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Draws a cubic Bézier curve from the current point to (x,y) using (x1,y1) as the control point at the beginning of the curve and (x2,y2) as the control point at the end of the curve.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">F</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">nofill</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(none)</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Specifies that the current set of sub-paths will not be filled.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">L</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">lineto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x y) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Draws a line from the current point to (x, y). If followed by multiple coordinate pairs, they are all interpreted as lineto.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">M</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">moveto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x y) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Start a new sub-path at the given (x,y) coordinate. If a moveto is followed by multiple pairs of coordinates, they are treated as lineto.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">N</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">endpath</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(none)</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Ends the current set of sub-paths. The sub-paths will be filled by using the “even-odd” filling rule. Other following subpaths will be filled independently.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">Q</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">quadratic­curveto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x1 y1 x y)+</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Draws a quadratic Bézier curve from the current point to (x, y) using (x1, y1) as the control point. (x, y) becomes the new current point at the end of the command.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">S</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">nostroke</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(none)</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Specifies that the current set of sub-paths will not be stroked.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">T</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">angle­ellipseto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x y w h t0 t1) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Draws a segment of an ellipse. The ellipse is specified by the center(x, y), the size(w, h) and the start-angle t0 in degrees and end-angle t1 in degrees. The segment is drawn clockwise.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">U</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">angle­ellipse</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x y w h t0 t1) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">The same as the “T” command, except that a implied moveto to the starting point is done.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">V</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">clockwise­arc</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x1 y1 x2 y2 x3 y3 x y)+</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">The same as the “A” command, except that a implied moveto to the starting point is done and the arc is drawn clockwise.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">W</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">clockwise­arcto</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x1 y1 x2 y2 x3 y3 x y) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">The same as the “A” command except, that the arc is drawn clockwise.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">X</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">elliptical­quatrantx</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x y) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Draws a quarter ellipse, whose initial segment is tangential to the x-axis from the current point to (x, y). For each additional quarter ellipse command, the axis to which the segment is tangential to switches from x to y and from y to x.</p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">Y</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">elliptical­quadranty</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(x y) +</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Draws a quarter ellipse, whose initial segment is tangential to the y-axis from the current point to (x, y). For each additional quarter ellipse command, the axis to which the segment is tangential to switches from y to x and from x to y </p></td></tr><tr><td style="text-align:left;width:0.7813in; " class="Table1_A2"><p class="Table_20_Contents">Z</p></td><td style="text-align:left;width:0.7063in; " class="Table1_A2"><p class="Table_20_Contents">closepath</p></td><td style="text-align:left;width:1.5722in; " class="Table1_A2"><p class="Table_20_Contents">(none)</p></td><td style="text-align:left;width:2.9403in; " class="Table1_D2"><p class="Table_20_Contents">Close the current sub-path by drawing a straight line from the current point to current sub-path's initial point.</p></td></tr></table><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The value of the <span class="Attribute">draw:enhanced-path</span> attribute is based upon <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> §8.3.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:enhanced-path</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:enhanced-path</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_146draw_engine"><span style="margin-right:0.127cm;">19.146</span></a><a id="__RefHeading__1417002_253892949"/><a id="attribute-draw_engine"/>draw:engine</h2><p class="Text_20_body">The <span class="Attribute">draw:engine</span> attribute specifies the name of a specific rendering engine that can be used to render a custom shape. </p><p class="Text_20_body">The value of the <span class="Attribute">draw:engine</span> attribute shall not influence the geometry of a shape. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:engine</span> attribute is usable with the following element: <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:engine</span> attribute has the data type <span class="Datatype">namespacedToken</span> <a href="#datatype-namespacedToken">18.3.19</a>.</p><h2 class="Heading_20_2"><a id="a19_147draw_escape-direction"><span style="margin-right:0.127cm;">19.147</span></a><a id="__RefHeading__1417004_253892949"/><a id="attribute-draw_escape-direction"/>draw:escape-direction</h2><p class="Text_20_body">The <span class="Attribute">draw:escape-direction</span> attribute specifies the direction in which a connection line leaves a drawing object if a connector connects to a glue point. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:escape-direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the connection line may leave in all four directions from a drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">down</span>: the connection line leave down from a drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal</span>: the connection line may leave to the left or to the right of a drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: the connection line leaves to the left of a drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: the connection line leaves to the right of a drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">up</span>: the connection line leaves up from a drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: the connection line may leave up or down from a drawing object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:escape-direction</span> attribute is usable with the following element: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:escape-direction</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">up</span>, <span class="Attribute_20_Value">down</span>, <span class="Attribute_20_Value">horizontal</span> or <span class="Attribute_20_Value">vertical</span>.</p><h2 class="Heading_20_2"><a id="a19_148draw_extrusion"><span style="margin-right:0.127cm;">19.148</span></a><a id="__RefHeading__1417006_253892949"/><a id="attribute-draw_extrusion"/>draw:extrusion</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion</span> attribute specifies if an extrusion is displayed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: extrusion is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: extrusion is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_149draw_extrusion-allowed"><span style="margin-right:0.127cm;">19.149</span></a><a id="__RefHeading__1417008_253892949"/><a id="attribute-draw_extrusion-allowed"/>draw:extrusion-allowed</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-allowed</span> attribute specifies whether a shape can be rendered as extrusion object.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion-allowed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: shape is cannot be rendered as an extrusion object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: shape can be rendered as an extrusion object.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-allowed</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-allowed</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_150draw_extrusion-brightness"><span style="margin-right:0.127cm;">19.150</span></a><a id="__RefHeading__1417010_253892949"/><a id="attribute-draw_extrusion-brightness"/>draw:extrusion-brightness</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-brightness</span> attribute specifies the brightness of a scene.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">33%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-brightness</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-brightness</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_151draw_extrusion-color"><span style="margin-right:0.127cm;">19.151</span></a><a id="__RefHeading__1417012_253892949"/><a id="attribute-draw_extrusion-color"/>draw:extrusion-color</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-color</span> attribute specifies if an extrusion color is used. The extrusion color is defined by the <span class="Attribute">draw:secondary-fill-color</span> attribute specified in a custom shape's graphic style.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion-color</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: extrusion color is not used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: extrusion color is used.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-color</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-color</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_152draw_extrusion-depth"><span style="margin-right:0.127cm;">19.152</span></a><a id="__RefHeading__1417014_253892949"/><a id="attribute-draw_extrusion-depth"/>draw:extrusion-depth</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-depth</span> attribute specifies the depth of an extrusion. It takes two white space separated values. The first value specifies the depth of the extrusion in units, the second value specifies the fraction of the extrusion that lies before a shape. The second value shall be in the range [0,1]. A value of 0 is the default.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">36pt 0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-depth</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-depth</span> attribute has two white space separated values. The first value is of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>. The second value is of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_153draw_extrusion-diffusion"><span style="margin-right:0.127cm;">19.153</span></a><a id="__RefHeading__1417016_253892949"/><a id="attribute-draw_extrusion-diffusion"/>draw:extrusion-diffusion</h2><p class="Text_20_body"> The <span class="Attribute">draw:extrusion-diffusion</span> attribute specifies the amount of diffusion reflected by a shape.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-diffusion</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-diffusion</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_154draw_extrusion-first-light-direction"><span style="margin-right:0.127cm;">19.154</span></a><a id="__RefHeading__1417018_253892949"/><a id="attribute-draw_extrusion-first-light-direction"/>draw:extrusion-first-light-direction</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-first-light-direction</span> attribute specifies the direction of the first light.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">(5 0 1)</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-first-light-direction</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-first-light-direction</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_155draw_extrusion-first-light-harsh"><span style="margin-right:0.127cm;">19.155</span></a><a id="__RefHeading__1417020_253892949"/><a id="attribute-draw_extrusion-first-light-harsh"/>draw:extrusion-first-light-harsh</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-first-light-harsh</span> attribute specifies if the first light is harsh.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion-first-light-harsh</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the light is not harsh. The means by which the light is softened is implementation-defined.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the light is harsh. The light is an undiffused point source.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-first-light-harsh</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-first-light-harsh</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_156draw_extrusion-first-light-level"><span style="margin-right:0.127cm;">19.156</span></a><a id="__RefHeading__1417022_253892949"/><a id="attribute-draw_extrusion-first-light-level"/>draw:extrusion-first-light-level</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-first-light-level</span> attribute specifies the intensity of the first light.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">66%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-first-light-level</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-first-light-level</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_157draw_extrusion-light-face"><span style="margin-right:0.127cm;">19.157</span></a><a id="__RefHeading__1417024_253892949"/><a id="attribute-draw_extrusion-light-face"/>draw:extrusion-light-face</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-light-face</span> attribute specifies if the front face of an extrusion responds to lighting changes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion-light-face</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: front face of extrusion does not respond to lighting changes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: front face of extrusion responds to lighting changes.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-light-face</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-light-face</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_158draw_extrusion-metal"><span style="margin-right:0.127cm;">19.158</span></a><a id="__RefHeading__1417026_253892949"/><a id="attribute-draw_extrusion-metal"/>draw:extrusion-metal</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-metal</span> attribute specifies the shading of an extruded shape.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion-metal</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the specular color for the shading of an extruded shape is white.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the specular color for the shading of an extruded shape is gray (red green and blue value of 200) instead of white and 15% is added to the specularity.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-metal</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-metal</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_159draw_extrusion-number-of-line-segments"><span style="margin-right:0.127cm;">19.159</span></a><a id="__RefHeading__1417028_253892949"/><a id="attribute-draw_extrusion-number-of-line-segments"/>draw:extrusion-number-of-line-segments</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-number-of-line-segments</span> attribute specifies the number of line segments that should be used to display curved surfaces.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">30</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-number-of-line-segments</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-number-of-line-segments</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_160draw_extrusion-origin"><span style="margin-right:0.127cm;">19.160</span></a><a id="__RefHeading__1417030_253892949"/><a id="attribute-draw_extrusion-origin"/>draw:extrusion-origin</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-origin</span> attribute specifies the point of origin of a shape within its bounding box in shape size fractions. The value of the <span class="Attribute">draw:extrusion-origin</span> attribute consists of two parameters separated by white space.</p><p class="Text_20_body">The first parameter represents the horizontal origin of a shape. </p><p class="Text_20_body">The defined values for the first parameter of the <span class="Attribute">draw:extrusion-origin</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">-0.5</span>: represents the left side of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">0</span>: represents the center of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">0.5</span>: represents the right side of the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The second parameter represents the vertical origin of a shape. </p><p class="Text_20_body">The defined values for the second parameter of the <span class="Attribute">draw:extrusion-origin</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">-0.5</span>: represents the top side of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">0</span>: represents the center of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">0.5</span>: represents the bottom side of the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0.5 -0.5</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-origin</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-origin</span> attribute has two white space separated values. The first value is a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a> in the range [<span class="Attribute_20_Value">-0.5</span>,<span class="Attribute_20_Value">0.5</span>]. The second value is a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a> in the range [<span class="Attribute_20_Value">-0.5</span>,<span class="Attribute_20_Value">0.5</span>].</p><h2 class="Heading_20_2"><a id="a19_161draw_extrusion-rotation-angle"><span style="margin-right:0.127cm;">19.161</span></a><a id="__RefHeading__1417032_253892949"/><a id="attribute-draw_extrusion-rotation-angle"/>draw:extrusion-rotation-angle</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-rotation-angle</span> attribute specifies rotation about an x-axis and y-axis. The values are separated by a white space. The first angle specifies rotation on the x-axis and the second angle specifies rotation on the y-axis. z-axis is specified by the <span class="Attribute">draw:transform</span> attribute on the <span class="Element">&lt;draw:custom-shape&gt;</span> element.</p><p class="Text_20_body">The order of the rotation is: z-axis, y-axis and then x-axis.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0 0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-rotation-angle</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-rotation-angle</span> attribute has two white space separated values. The first value is of type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>. The second value is of type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_162draw_extrusion-rotation-center"><span style="margin-right:0.127cm;">19.162</span></a><a id="__RefHeading__1417034_253892949"/><a id="attribute-draw_extrusion-rotation-center"/>draw:extrusion-rotation-center</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-rotation-center</span> attribute specifies the position of a rotation center in shape size fractions. If the <span class="Attribute">draw:extrusion-rotation-center</span> attribute is omitted, the geometric center of the shape is used as the rotation center.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:extrusion-rotation-center</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-rotation-center</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_163draw_extrusion-second-light-direction"><span style="margin-right:0.127cm;">19.163</span></a><a id="__RefHeading__1417036_253892949"/><a id="attribute-draw_extrusion-second-light-direction"/>draw:extrusion-second-light-direction</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-second-light-direction</span> attribute specifies the direction of a second light.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">(-5 0 1)</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-second-light-direction</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-second-light-direction</span> attribute has the data type <span class="Datatype">vector3D</span> <a href="#datatype-vector3D">18.3.40</a>.</p><h2 class="Heading_20_2"><a id="a19_164draw_extrusion-second-light-harsh"><span style="margin-right:0.127cm;">19.164</span></a><a id="__RefHeading__1417038_253892949"/><a id="attribute-draw_extrusion-second-light-harsh"/>draw:extrusion-second-light-harsh</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-second-light-harsh</span> attribute specifies if a second light is harsh.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:extrusion-second-light-harsh</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the light is not harsh. The means by which the light is softened is implementation-defined.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the light is harsh. The light is an undiffused point source.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-second-light-harsh</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-second-light-harsh</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_165draw_extrusion-second-light-level"><span style="margin-right:0.127cm;">19.165</span></a><a id="__RefHeading__1417040_253892949"/><a id="attribute-draw_extrusion-second-light-level"/>draw:extrusion-second-light-level</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-second-light-level</span> attribute specifies the intensity of a second light.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">66%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-second-light-level</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-second-light-level</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_166draw_extrusion-shininess"><span style="margin-right:0.127cm;">19.166</span></a><a id="__RefHeading__1417042_253892949"/><a id="attribute-draw_extrusion-shininess"/>draw:extrusion-shininess</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-shininess</span> attribute specifies the reflectivity of a mirror.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">50%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-shininess</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-shininess</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_167draw_extrusion-skew"><span style="margin-right:0.127cm;">19.167</span></a><a id="__RefHeading__1417044_253892949"/><a id="attribute-draw_extrusion-skew"/>draw:extrusion-skew</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-skew</span> attribute specifies the skew amount and skew angle of an extrusion. Skew settings are only applied if the <span class="Attribute">dr3d:projection</span> attribute on the same element has the value <span class="Attribute_20_Value">parallel</span>.</p><p class="Text_20_body">The attribute value is a white space separated number and angle. The first value defines the skew amount in percent, the second value defines the skew angle.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">50 45</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-skew</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-skew</span> attribute has two white space separated values. The first value is of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>. The second value is of type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_168draw_extrusion-specularity"><span style="margin-right:0.127cm;">19.168</span></a><a id="__RefHeading__1417046_253892949"/><a id="attribute-draw_extrusion-specularity"/>draw:extrusion-specularity</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-specularity</span> attribute specifies the specularity of an extrusion object.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-specularity</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-specularity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_169draw_extrusion-viewpoint"><span style="margin-right:0.127cm;">19.169</span></a><a id="__RefHeading__1417048_253892949"/><a id="attribute-draw_extrusion-viewpoint"/>draw:extrusion-viewpoint</h2><p class="Text_20_body">The <span class="Attribute">draw:extrusion-viewpoint</span> attribute specifies the viewpoint of an observer as an 3D point. </p><p class="Default_20_Value_borderStart">The default value for this attribute is (<span class="Attribute_20_Value_20_Instance">3.5cm -3.5cm 25cm</span><span class="Attribute_20_Value_20_Instance">)</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:extrusion-viewpoint</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:extrusion-viewpoint</span> attribute has the data type <span class="Datatype">point3D</span> <a href="#datatype-point3D">18.3.24</a>.</p><h2 class="Heading_20_2"><a id="a19_170draw_filter-name"><span style="margin-right:0.127cm;">19.170</span></a><a id="__RefHeading__1417050_253892949"/><a id="attribute-draw_filter-name"/>draw:filter-name</h2><p class="Text_20_body">The <span class="Attribute">draw:filter-name</span> attribute specifies the implementation-dependent filter name that has been used to load an image into the document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:filter-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:filter-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_171draw_formula"><span style="margin-right:0.127cm;">19.171</span></a><a id="__RefHeading__1417052_253892949"/><a id="attribute-draw_formula"/>draw:formula</h2><p class="Text_20_body">The <span class="Attribute">draw:formula</span> attribute specifies an equation that should be used to evaluate a value. A formula can make use of other formulas or modifier values by function and or modifier reference.</p><p class="Text_20_body">The value of a <span class="Attribute">draw:formula</span> attribute can have one of the following parameters:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A "?" (U+003F, QUESTION MARK) is used to mark the beginning of a formula name. The result of the <span class="Element">&lt;draw:equation&gt;</span> element's <span class="Attribute">draw:formula</span> attribute whose <span class="Attribute">draw:name</span> attribute is the formula name used as the value. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If ”$” (U+0024) precedes an integer value, the value is an index to a <span class="Attribute">draw:modifiers</span> attribute. The corresponding modifier value is used as value. <span class="odfLiEnd"/> </p></li></ul><p class="Code_borderStart">formula::=additive_expression</p><p class="Code"/><p class="Code">identifier::= 'pi' | 'left' | 'top' | 'right' | 'bottom' | 'xstretch'</p><p class="Code">    | 'ystretch' | 'hasstroke' | 'hasfill' | 'width' | 'height' | 'logwidth'</p><p class="Code">    | 'logheight'</p><p class="Code">unary_function::= 'abs' | 'sqrt' | 'sin' | 'cos' | 'tan' | 'atan'</p><p class="Code">binary_function::= 'min' | 'max' | 'atan2'</p><p class="Code">ternary_function::= 'if'</p><p class="Code">basic_expression::= number</p><p class="Code">    | identifier</p><p class="Code">    | function_reference</p><p class="Code">    | modifier_reference</p><p class="Code">    | unary_function S* '(' S* additive_expression S* ')'</p><p class="Code">    | binary_function S* '(' S* additive_expression S* ',' S*</p><p class="Code">        additive_expression S* ')'</p><p class="Code">    | ternary_function S* '(' S* additive_expression S* ',' S*</p><p class="Code">        additive_expression S* ',' S* additive_expression S* ')'</p><p class="Code">    | '(' S* additive_expression S* ')'</p><p class="Code">unary_expression::= '-' S* basic_expression | basic_expression</p><p class="Code">multiplicative_expression::= unary_expression     ( ( S* '*' S* unary_expression )</p><p class="Code">    | ( S* '/' S* unary_expression ) )*</p><p class="Code">additive_expression::= multiplicative_expression</p><p class="Code">    ( ( S* '+' S* multiplicative_expression )</p><p class="Code">    | ( S* '-' S* multiplicative_expression ) )*</p><p class="Code">number::= sign? Integer | sign? Floating-point-constant</p><p class="Code">function_reference::= "?" name</p><p class="Code">modifier_reference::= "$" integer</p><p class="Code">floating-point-constant::= fractional-constant exponent? | integer exponent</p><p class="Code">fractional-constant::= integer? '.' integer | integer '.'</p><p class="Code">exponent::= ( 'e' | 'E' ) sign? Integer</p><p class="Code">sign::= '+' | '-'</p><p class="Code">name::= [^#x20#x9]+</p><p class="Code">integer::= [0-9]+</p><p class="Code_borderEnd">S::= (#x20 | #x9)</p><p class="Table">Table <a id="refTable10"/>11 - Enhanced geometry equation identifiers</p><table border="0" cellspacing="0" cellpadding="0" class="Table2"><colgroup><col width="79"/><col width="445"/></colgroup><tr><td style="text-align:left;width:0.709in; " class="Table2_A1"><p class="Table_20_Heading">Identifier</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B1"><p class="Table_20_Heading">Description</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">bottom</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The bottom position the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">hasfill</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">If the shape has a fill style, a value of 1 is used.If the shape has a fill style, a value of 1 is used. If the shape has no fill style, a value of 0 is used. </p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">hasstroke</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">If the shape has a line style, a value of 1 is used. If the shape has a line style, a value of 1 is used. If the shape has no line style, a value of 0 is used. </p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">height</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The height of the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">left</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The left position of the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">logheight</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The height of the <span class="Attribute">svg:viewBox</span> attribute in 1/100th mm is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">logwidth</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The width of the <span class="Attribute">svg:viewBox</span> attribute in 1/100th mm is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">right</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The right position the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">top</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The top position the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">width</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The width of the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">xstretch</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The value of the <span class="Attribute">draw:path-stretchpoint-x</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table2_A2"><p class="Table_20_Contents">ystretch</p></td><td style="text-align:left;width:4.0118in; " class="Table2_B2"><p class="Text_20_body">The value of the <span class="Attribute">draw:path-stretchpoint-y</span> attribute is used.</p></td></tr></table><p class="Table">Table <a id="refTable11"/>12 - Functions Used in <span class="Attribute">draw:formula</span></p><table border="0" cellspacing="0" cellpadding="0" class="Table17"><colgroup><col width="79"/><col width="445"/></colgroup><tr><td style="text-align:left;width:0.709in; " class="Table17_A1"><p class="Table_20_Heading">Function </p></td><td style="text-align:left;width:4.0118in; " class="Table17_B1"><p class="Table_20_Heading">Description</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">abs(n)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the absolute value of n</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">sqrt(n)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the positive square root of n</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">sin(n)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the trigonometric sine of n, where n is an angle specified in degrees</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">cos(n)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the trigonometric cosine of n, where n is an angle specified in degrees</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">tan(n)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the trigonometric tangent of n, where n is an angle specified in degrees</p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">atan(n)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the arc tangent of n in degrees </p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">min(x,y)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the smaller of two values </p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">max(x,y)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the greater of two values </p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">atan2(x,y)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">returns the angle in degrees of the vector (x,y) with the x-axis </p></td></tr><tr><td style="text-align:left;width:0.709in; " class="Table17_A2"><p class="Table_20_Contents">if(c,x,y)</p></td><td style="text-align:left;width:4.0118in; " class="Table17_B2"><p class="Text_20_body">conditional testing: if c is greater than zero then the result of evaluating x is returned, otherwise the result of evaluating y is returned. </p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:formula</span> attribute is usable with the following element: <span class="Element">&lt;draw:equation&gt;</span> <a href="#element-draw_equation">10.2.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:formula</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_172draw_frame-name"><span style="margin-right:0.127cm;">19.172</span></a><a id="__RefHeading__1417054_253892949"/><a id="attribute-draw_frame-name"/>draw:frame-name</h2><p class="Text_20_body">The <span class="Attribute">draw:frame-name</span> attribute specifies the name of a frame. The name of a frame can be used as a target by hyperlinks.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:frame-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:frame-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_173draw_glue-point-leaving-directions"><span style="margin-right:0.127cm;">19.173</span></a><a id="__RefHeading__1417056_253892949"/><a id="attribute-draw_glue-point-leaving-directions"/>draw:glue-point-leaving-directions</h2><p class="Text_20_body">The <span class="Attribute">draw:glue-point-leaving-directions</span> attribute specifies a comma “,” (U+002C, COMMA) separated list of angles. The angles are listed in the same order as the glue-points specified in the <span class="Attribute">draw:glue-points</span> attribute. <a href="#attribute-draw_glue-points">19.175</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:glue-point-leaving-directions</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:glue-point-leaving-directions</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_174draw_glue-point-type"><span style="margin-right:0.127cm;">19.174</span></a><a id="__RefHeading__1417058_253892949"/><a id="attribute-draw_glue-point-type"/>draw:glue-point-type</h2><p class="Text_20_body">The <span class="Attribute">draw:glue-point-type</span> attribute specifies a glue-point type. If the <span class="Attribute">draw:glue-points</span> attribute has a value, this attribute is ignored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:</span><span class="Attribute">glue-point-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: there are no glue points, including default glue points.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">rectangle</span>: the middle of each side of the shape bound rectangle specifies an object specific glue point<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">segments</span>: a connector will connect with each point of the <span class="Attribute">draw:enhanced-path</span> attribute.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:glue-point-type</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:glue-point-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">segments</span> or <span class="Attribute_20_Value">rectangle</span>.</p><h2 class="Heading_20_2"><a id="a19_175draw_glue-points"><span style="margin-right:0.127cm;">19.175</span></a><a id="__RefHeading__1417060_253892949"/><a id="attribute-draw_glue-points"/>draw:glue-points</h2><p class="Text_20_body">The <span class="Attribute">draw:glue-points</span> attribute specifies a list of object defined glue points. Unlike the user defined glue points which are defined by the <span class="Element">&lt;draw:glue-point&gt;</span> sub-element, the position of an object defined glue point can be defined using equations and modifiers.</p><p class="Text_20_body">The first parameter specifies the horizontal position of the glue point.</p><p class="Text_20_body">The second parameter specifies the vertical position of the glue point.</p><p class="Text_20_body">Each parameter can be a float, or it can also have one of the following enhancements:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A “?” (U+003F, QUESTION MARK) is used to mark the beginning of a formula name. The result of the <span class="Element">&lt;draw:equation&gt;</span> element's <span class="Attribute">draw:formula</span> attribute whose <span class="Attribute">draw:name</span> attribute is the formula name that is used as the value. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If “$” (U+0024, DOLLAR SIGN) precedes an integer value, the value is an index to a <span class="Attribute">draw:modifiers</span> attribute. The corresponding modifier value is used as parameter value.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value of a <span class="Attribute">draw:glue-points</span> attribute is formally defined as:</p><p class="Code_borderStart">gluepoints::= gluepointsequence? <br/>gluepointsequence::= gluepoint ( ' '+ gluepointsequence )* <br/>glue-point::= position ' '+ position <br/>position::= formula | modifier | number <br/>formula::= '?' name <br/>modifier::= '$' integer <br/>number::= sign? float | sign? integer <br/>float::= fractional exponent? | integer exponent <br/>fractional::= integer? '.' integer | integer '.' <br/>exponent::= ( 'e' | 'E' ) sign? integer <br/>sign::= '+'| '-' <br/>integer::= [0-9]+ <br/>name ::= [^ ]+ </p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:glue-points</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:glue-points</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_176draw_handle-mirror-horizontal"><span style="margin-right:0.127cm;">19.176</span></a><a id="__RefHeading__1417062_253892949"/><a id="attribute-draw_handle-mirror-horizontal"/>draw:handle-mirror-horizontal</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-mirror-horizontal</span> attribute specifies if the y position of a handle is mirrored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:handle-mirror-horizontal</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the y position of a handle is not mirrored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the y position of a handle is mirrored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:handle-mirror-horizontal</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-mirror-horizontal</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_177draw_handle-mirror-vertical"><span style="margin-right:0.127cm;">19.177</span></a><a id="__RefHeading__1417064_253892949"/><a id="attribute-draw_handle-mirror-vertical"/>draw:handle-mirror-vertical</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-mirror-vertical</span> attribute specifies if the x position of a handle is mirrored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:handle-mirror-vertical</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the x position of a handle is not mirrored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the x position of a handle is mirrored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:handle-mirror-vertical</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-mirror-vertical</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_178draw_handle-polar"><span style="margin-right:0.127cm;">19.178</span></a><a id="__RefHeading__1417066_253892949"/><a id="attribute-draw_handle-polar"/>draw:handle-polar</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-polar</span> attribute specifies that a handle is a polar handle. The syntax for this attribute is the same as for the <span class="Attribute">draw:handle-position</span> attribute. The first parameter specifies the horizontal center position, the vertical center position is specified by the second parameter. If this attribute is set, the <span class="Attribute">draw:handle-range-x-minimum</span>, <span class="Attribute">draw:handle-range-x-maximum</span>, <span class="Attribute">draw:handle-range-y-minimum</span> and <span class="Attribute">draw:handle-range-y-maximum</span> attributes are ignored, and the <span class="Attribute">draw:handle-radius-range-minimum</span> and <span class="Attribute">draw:handle-radius-range-maximum</span> attributes are used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-polar</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-polar</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_179draw_handle-position"><span style="margin-right:0.127cm;">19.179</span></a><a id="__RefHeading__1417068_253892949"/><a id="attribute-draw_handle-position"/>draw:handle-position</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-position</span> attribute specifies the position of a handle and consists of two values.</p><p class="Text_20_body">Each value can be a float or it can have one of the following enhancements:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A “?” (U+003F, QUESTION MARK) is used to mark the beginning of a formula name. The result of the <span class="Element">&lt;draw:equation&gt;</span> element's <span class="Attribute">draw:formula</span> attribute whose <span class="Attribute">draw:name</span> attribute is the formula name that is used as the value. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If “$” (U+0024, DOLLAR SIGN) precedes an integer value, the value is an index to a <span class="Attribute">draw:modifiers</span> attribute. The corresponding modifier value is used as parameter value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Instead of a number a value can also be one of the following constants:<span class="odfLiEnd"/> </p></li></ul><p class="Table">Table <a id="refTable12"/>13 - Handle position constants</p><table border="0" cellspacing="0" cellpadding="0" class="Table3"><colgroup><col width="81"/><col width="471"/></colgroup><tr><td style="text-align:left;width:0.7285in; " class="Table3_A1"><p class="Table_20_Heading">Constant</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B1"><p class="Table_20_Heading">Description</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">bottom</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body"><a id="DDE_LINK8"/>The bottom coordinate of the view box as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">hasfill</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">If the shape has a fill style, a value of 1 is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">hasstroke</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">If the shape has a line style, a value of 1 is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">height</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The view box height as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">logheight</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The view box height in 1/100th mm as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">logwidth</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The view box width in 1/100th mm as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">left</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The left coordinate of the view box as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">right</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The right coordinate of the view box as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">top</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The top coordinate of the view box as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">width</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The view box width as specified by the <span class="Attribute">svg:viewBox</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">xstretch</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The value of the <span class="Attribute">draw:path-stretchpoint-x</span> attribute is used.</p></td></tr><tr><td style="text-align:left;width:0.7285in; " class="Table3_A2"><p class="Table_20_Contents">ystretch</p></td><td style="text-align:left;width:4.2403in; " class="Table3_B2"><p class="Text_20_body">The value of the <span class="Attribute">draw:path-stretchpoint-y</span> attribute is used.</p></td></tr></table><p class="Text_20_body">If the <span class="Attribute">draw:handle-polar</span> attribute is not set, the first parameter of the <span class="Attribute">draw:handle-position</span> attribute specifies the horizontal handle position, the vertical handle position is described by the second parameter. If the <span class="Attribute">draw:handle-polar</span> attribute is set, then a handle is a polar handle and the first parameter of the <span class="Attribute">draw:handle-position</span> attribute specifies the angle (as defined in <a href="#datatype-angle">18.3.1</a>), the handle radius is specified by the second parameter.</p><p class="Text_20_body">The value of a <span class="Attribute">draw:handle-position</span> attribute is formally defined as:</p><p class="Code_borderStart">handleposition ::= position ' '+ position <br/>position::= formula | modifier | constant | number <br/>formula::= '?' name <br/>modifier::= '$' integer <br/>constant::= 'left' | 'top' | 'right' | 'bottom' | <br/>'xstretch' | 'ystretch' | 'hasstroke' | 'hasfill ' | <br/>'width' | 'height' | 'logwidth' | 'logheight' <br/>number::=sign? float | sign? integer <br/>float::= fractional exponent? | integer exponent <br/>fractional::= integer? '.' integer | integer '.' <br/>exponent::= ( 'e' | 'E' ) sign? integer <br/>sign::= '+'| '-' <br/>integer::= [0-9]+ <br/>name ::= [^ ]+ </p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:handle-position</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-position</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_180draw_handle-radius-range-maximum"><span style="margin-right:0.127cm;">19.180</span></a><a id="__RefHeading__1417070_253892949"/><a id="attribute-draw_handle-radius-range-maximum"/>draw:handle-radius-range-maximum</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-radius-range-maximum</span> attribute specifies the maximum radius range for a polar handle. The syntax for the value of the <span class="Attribute">draw:handle-radius-range-maximum</span> attribute is the same as the <span class="Attribute">draw:handle-position</span> attribute, except that only the first parameter is used. <a href="#attribute-draw_handle-position">19.179</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-radius-range-maximum</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-radius-range-maximum</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_181draw_handle-radius-range-minimum"><span style="margin-right:0.127cm;">19.181</span></a><a id="__RefHeading__1417072_253892949"/><a id="attribute-draw_handle-radius-range-minimum"/>draw:handle-radius-range-minimum</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-radius-range-minimum</span> attribute specifies the minimum radius range for a polar handle. The syntax for the value of the <span class="Attribute">draw:handle-radius-range-minimum</span> attribute is the same as the <span class="Attribute">draw:handle-position</span> attribute, except that only the first parameter is used. <a href="#attribute-draw_handle-position">19.179</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-radius-range-minimum</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-radius-range-minimum</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_182draw_handle-range-x-maximum"><span style="margin-right:0.127cm;">19.182</span></a><a id="__RefHeading__1417074_253892949"/><a id="attribute-draw_handle-range-x-maximum"/>draw:handle-range-x-maximum</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-range-x-maximum</span> attribute specifies the horizontal maximum value of the range for movement of a handle. The syntax for the value of the <span class="Attribute">draw:handle-range-x-maximum</span> attribute is the same as the <span class="Attribute">draw:handle-position</span> attribute, except that only the first parameter is used. <a href="#attribute-draw_handle-position">19.179</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-range-x-maximum</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-range-x-maximum</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_183draw_handle-range-x-minimum"><span style="margin-right:0.127cm;">19.183</span></a><a id="__RefHeading__1417076_253892949"/><a id="attribute-draw_handle-range-x-minimum"/>draw:handle-range-x-minimum</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-range-x-minimum</span> attribute specifies the horizontal minimum value of the range of movement of a handle. The syntax for the value of the <span class="Attribute">draw:handle-range-x-minimum</span> attribute is the same as the <span class="Attribute">draw:handle-position</span> attribute, except that only the first parameter is used. <a href="#attribute-draw_handle-position">19.179</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-range-x-minimum</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-range-x-minimum</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_184draw_handle-range-y-maximum"><span style="margin-right:0.127cm;">19.184</span></a><a id="__RefHeading__1417078_253892949"/><a id="attribute-draw_handle-range-y-maximum"/>draw:handle-range-y-maximum</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-range-y-maximum</span> attribute specifies the vertical maximum value of the range for movement of a handle. The syntax for the value of the <span class="Attribute">draw:handle-range-y-maximum</span> attribute is the same as the <span class="Attribute">draw:handle-position</span> attribute, except that only the first parameter is used. <a href="#attribute-draw_handle-position">19.179</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-range-y-maximum</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-range-y-maximum</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_185draw_handle-range-y-minimum"><span style="margin-right:0.127cm;">19.185</span></a><a id="__RefHeading__1417080_253892949"/><a id="attribute-draw_handle-range-y-minimum"/>draw:handle-range-y-minimum</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-range-y-minimum</span> attribute specifies the vertical minimum value of the range of movement of a handle. The syntax for the value of the <span class="Attribute">draw:handle-range-y-minimum</span> attribute is the same as the <span class="Attribute">draw:handle-position</span> attribute, except that only the first parameter is used. <a href="#attribute-draw_handle-position">19.179</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:handle-range-y-minimum</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-range-y-minimum</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_186draw_handle-switched"><span style="margin-right:0.127cm;">19.186</span></a><a id="__RefHeading__1417082_253892949"/><a id="attribute-draw_handle-switched"/>draw:handle-switched</h2><p class="Text_20_body">The <span class="Attribute">draw:handle-switched</span> attribute specifies if handle directions are swapped if shape height exceeds shape width.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:handle-switched</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: handle directions are not switched if a shape's height exceeds its width.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: handle directions are switched if a shape's height exceeds it width.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:handle-switched</span> attribute is usable with the following element: <span class="Element">&lt;draw:handle&gt;</span> <a href="#element-draw_handle">10.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:handle-switched</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_187draw_id"><span style="margin-right:0.127cm;">19.187</span></a><a id="__RefHeading__1417084_253892949"/><a id="attribute-draw_id"/>draw:id</h2><h3 class="Heading_20_3"><a id="a19_187_1General"><span style="margin-right:0.127cm;">19.187.1</span></a><a id="__RefHeading__1417086_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:id</span> attribute specifies an identifier for an element.</p><h3 class="Heading_20_3"><a id="a19_187_2_draw_glue-point_"><span style="margin-right:0.127cm;">19.187.2</span></a><a id="__RefHeading__1417088_253892949"/><a id="attribute-draw_id_element-draw_glue-point"/>&lt;draw:glue-point&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:id</span> attribute specifies an identifier for a glue point. See <a href="#element-draw_glue-point">10.3.16</a>. The ids 0 to 3 are reserved for the 4 standard glue points of drawing objects. The glue points are numbered clockwise, starting at the top left corner edge of the shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:id</span> attribute is usable with the following element: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:id</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_187_3_dr3d_cube____dr3d_extrude____dr3d_rotate____dr3d_scene____dr3d_sphere____draw_caption____draw_circle____draw_connector____draw_control____draw_custom-shape____draw_ellipse____draw_frame____draw_g____draw_line____draw_measure____draw_page____draw_page-thumbnail____draw_path____draw_polygon____draw_polyline____draw_rect____draw_regular-polygon__and__office_annotation_"><span style="margin-right:0.127cm;">19.187.3</span></a><a id="__RefHeading__1417090_253892949"/><a id="attribute-draw_id_element-draw_polygon"/><a id="attribute-draw_id_element-draw_polyline"/><a id="attribute-draw_id_element-draw_rect"/><a id="attribute-draw_id_element-draw_regular-polygon"/><a id="attribute-draw_id_element-office_annotation"/><a id="attribute-draw_id_element-dr3d_cube"/><a id="attribute-draw_id_element-dr3d_extrude"/><a id="attribute-draw_id_element-dr3d_rotate"/><a id="attribute-draw_id_element-dr3d_scene"/><a id="attribute-draw_id_element-dr3d_sphere"/><a id="attribute-draw_id_element-draw_caption"/><a id="attribute-draw_id_element-draw_circle"/><a id="attribute-draw_id_element-draw_connector"/><a id="attribute-draw_id_element-draw_control"/><a id="attribute-draw_id_element-draw_custom-shape"/><a id="attribute-draw_id_element-draw_ellipse"/><a id="attribute-draw_id_element-draw_frame"/><a id="attribute-draw_id_element-draw_g"/><a id="attribute-draw_id_element-draw_line"/><a id="attribute-draw_id_element-draw_measure"/><a id="attribute-draw_id_element-draw_page"/><a id="attribute-draw_id_element-draw_page-thumbnail"/><a id="attribute-draw_id_element-draw_path"/>&lt;dr3d:cube&gt;, &lt;dr3d:extrude&gt;, &lt;dr3d:rotate&gt;, &lt;dr3d:scene&gt;, &lt;dr3d:sphere&gt;, &lt;draw:caption&gt;, &lt;draw:circle&gt;, &lt;draw:connector&gt;, &lt;draw:control&gt;, &lt;draw:custom-shape&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:g&gt;, &lt;draw:line&gt;, &lt;draw:measure&gt;, &lt;draw:page&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:rect&gt;, &lt;draw:regular-polygon&gt; and &lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:id</span> attribute specifies identifiers for draw elements other than <span class="Element">&lt;draw:glue-point&gt;</span>.</p><p class="Text_20_body">OpenDocument consumers shall ignore a <span class="Attribute">draw:id</span> attribute if it occurs on a draw element with an <span class="Attribute">xml:id</span> attribute value.  </p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">draw:id</span> attributes for any draw element in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body"> The value of a <span class="Attribute">draw:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same element. </p><p class="Text_20_body">The <span class="Attribute">draw:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:id</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_188draw_kind"><span style="margin-right:0.127cm;">19.188</span></a><a id="__RefHeading__1417092_253892949"/><a id="attribute-draw_kind"/>draw:kind</h2><p class="Text_20_body">The <span class="Attribute">draw:kind</span> attribute specifies the appearance of a circle.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:kind</span> attribute are:</p><ul><li><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">arc</span>: specifies a circle or ellipse arc, like <p> </p>.<span class="odfLiEnd"/> </div></li><li><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cut</span>: specifies a circle or ellipse with a cut, like <p> </p>.<span class="odfLiEnd"/> </div></li><li><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">full</span>: specifies a full circle or ellipse, like <p> </p>.<span class="odfLiEnd"/> </div></li><li><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">section</span>: specifies a section of a circle or ellipse, like <p> </p>.<span class="odfLiEnd"/> </div></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">full</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:kind</span> attribute is usable with the following elements: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a> and <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:kind</span> attribute are <span class="Attribute_20_Value">full</span>, <span class="Attribute_20_Value">section</span>, <span class="Attribute_20_Value">cut</span> or <span class="Attribute_20_Value">arc</span>.</p><h2 class="Heading_20_2"><a id="a19_189draw_layer"><span style="margin-right:0.127cm;">19.189</span></a><a id="__RefHeading__1417094_253892949"/><a id="attribute-draw_layer"/>draw:layer</h2><p class="Text_20_body">The <span class="Attribute">draw:layer</span> attribute specifies the name of a layer in the layer-set of a document. </p><p class="Note"><span class="Note_20_Label">Note:</span> The effect of this attribute is to assign a shape to a particular layer.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:layer</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:layer</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_190draw_line-skew"><span style="margin-right:0.127cm;">19.190</span></a><a id="__RefHeading__1417096_253892949"/><a id="attribute-draw_line-skew"/>draw:line-skew</h2><p class="Text_20_body">The <span class="Attribute">draw:line-skew</span> attribute specifies a list of offsets for the placements of connector lines if the connector is of type <span class="Attribute_20_Value">standard</span>. The offsets are relative to the default position of the connector, that is, the position the lines get if the <span class="Attribute">draw:line-skew</span> attribute is not present. The offsets are applied in the order from the connector's start to its end shape. The first offset is applied to the line that follows the line that is connected to the start shape. The last line to which an offset is applied is the line that precedes the line that is connected to the end shape.</p><p class="Text_20_body">For the application of the offsets the connector lines are interpreted as vectors from their start to their end point. Positive values move a line to the right, while negative values move it to the left. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:line-skew</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:line-skew</span> attribute are one, two or three white space separated values of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_191draw_mime-type"><span style="margin-right:0.127cm;">19.191</span></a><a id="__RefHeading__1417098_253892949"/><a id="attribute-draw_mime-type"/>draw:mime-type</h2><p class="Text_20_body">The <span class="Attribute">draw:mime-type</span> attribute specifies the MIME type of the media-type which a plugin processes. Valid values for this attribute are those defined in accordance with §3.7 of <a title=" Hypertext Transfer Protocol -- HTTP/1.1" href="http://www.ietf.org/rfc/rfc2616.txt">[RFC2616]</a>, or registered in accordance with <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a>. </p><p class="Text_20_body"><span class="Note_20_Label">Note: </span>Additional information on MIME media types can be found at <a title="MIME Media Types" href="http://www.iana.org/assignments/media-types/">[MIMETYPES]</a>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:mime-type</span> attribute is usable with the following element: <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:mime-type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_192draw_mirror-horizontal"><span style="margin-right:0.127cm;">19.192</span></a><a id="__RefHeading__1417100_253892949"/><a id="attribute-draw_mirror-horizontal"/>draw:mirror-horizontal</h2><p class="Text_20_body">The <span class="Attribute">draw:mirror-horizontal</span> attribute specifies if the horizontal geometry of a shape is to be mirrored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:mirror-horizontal</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: horizontal geometry of a shape is not mirrored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: horizontal geometry of a shape is mirrored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:mirror-horizontal</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:mirror-horizontal</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_193draw_mirror-vertical"><span style="margin-right:0.127cm;">19.193</span></a><a id="__RefHeading__1417102_253892949"/><a id="attribute-draw_mirror-vertical"/>draw:mirror-vertical</h2><p class="Text_20_body">The <span class="Attribute">draw:mirror-vertical</span> attribute specifies if the vertical geometry of a shape is to be mirrored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:mirror-vertical</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: vertical geometry of a shape is not mirrored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: vertical geometry of a shape is mirrored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:mirror-vertical</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:mirror-vertical</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_194draw_master-page-name"><span style="margin-right:0.127cm;">19.194</span></a><a id="__RefHeading__1417104_253892949"/><a id="attribute-draw_master-page-name"/>draw:master-page-name</h2><p class="Text_20_body">The <span class="Attribute">draw:master-page-name</span> attribute specifies the name of a master page assigned to a drawing page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:master-page-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:master-page-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_195draw_may-script"><span style="margin-right:0.127cm;">19.195</span></a><a id="__RefHeading__1417106_253892949"/><a id="attribute-draw_may-script"/>draw:may-script</h2><p class="Text_20_body">The <span class="Attribute">draw:may-script</span> attribute specifies whether an applet can be modified by scripts. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:may-script</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: applet cannot be modified by scripts.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: applet can be modified by scripts.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:may-script</span> attribute is usable with the following element: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:may-script</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_196draw_modifiers"><span style="margin-right:0.127cm;">19.196</span></a><a id="__RefHeading__1417108_253892949"/><a id="attribute-draw_modifiers"/>draw:modifiers</h2><p class="Text_20_body">The <span class="Attribute">draw:modifiers</span> attribute contains list of modifier values. </p><p class="Text_20_body">The value of a <span class="Attribute">draw:modifiers</span> attribute is formally defined as:</p><p class="Code_borderStart">modifiers::= numbersequence? <br/>numbersequence::= number ( ' '+ numbersequence )* <br/>number::= sign? float | sign? integer <br/>float::= fractional exponent? | integer exponent <br/>fractional::= integer? '.' integer | integer '.' <br/>exponent::= ( 'e' | 'E' ) sign? integer <br/>sign::= '+'| '-' <br/>integer::= [0-9]+ </p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:modifiers</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:modifiers</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_197draw_name"><span style="margin-right:0.127cm;">19.197</span></a><a id="__RefHeading__1417110_253892949"/><a id="attribute-draw_name"/>draw:name</h2><h3 class="Heading_20_3"><a id="a19_197_1General"><span style="margin-right:0.127cm;">19.197.1</span></a><a id="__RefHeading__1417112_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies names that are used for referencing graphical elements. </p><h3 class="Heading_20_3"><a id="a19_197_2_draw_caption_"><span style="margin-right:0.127cm;">19.197.2</span></a><a id="__RefHeading__1417114_253892949"/><a id="attribute-draw_name_element-draw_caption"/>&lt;draw:caption&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:caption&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_3_draw_circle_"><span style="margin-right:0.127cm;">19.197.3</span></a><a id="__RefHeading__1417116_253892949"/><a id="attribute-draw_name_element-draw_circle"/>&lt;draw:circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:circle&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_4_draw_connector_"><span style="margin-right:0.127cm;">19.197.4</span></a><a id="__RefHeading__1417118_253892949"/><a id="attribute-draw_name_element-draw_connector"/>&lt;draw:connector&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:connector&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_5_draw_control_"><span style="margin-right:0.127cm;">19.197.5</span></a><a id="__RefHeading__1417120_253892949"/><a id="attribute-draw_name_element-draw_control"/>&lt;draw:control&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:control&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_6_draw_custom-shape_"><span style="margin-right:0.127cm;">19.197.6</span></a><a id="__RefHeading__1417122_253892949"/><a id="attribute-draw_name_element-draw_custom-shape"/>&lt;draw:custom-shape&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:custom-shape&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_7_draw_ellipse_"><span style="margin-right:0.127cm;">19.197.7</span></a><a id="__RefHeading__1417124_253892949"/><a id="attribute-draw_name_element-draw_ellipse"/>&lt;draw:ellipse&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:ellipse&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_8_draw_equation_"><span style="margin-right:0.127cm;">19.197.8</span></a><a id="__RefHeading__1417126_253892949"/><a id="attribute-draw_name_element-draw_equation"/>&lt;draw:equation&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:equation&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:equation&gt;</span> <a href="#element-draw_equation">10.2.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_9_draw_fill-image_"><span style="margin-right:0.127cm;">19.197.9</span></a><a id="__RefHeading__1417128_253892949"/><a id="attribute-draw_name_element-draw_fill-image"/>&lt;draw:fill-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:fill-image&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_10_draw_frame_"><span style="margin-right:0.127cm;">19.197.10</span></a><a id="__RefHeading__1417130_253892949"/><a id="attribute-draw_name_element-draw_frame"/>&lt;draw:frame&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:frame&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_11_draw_g_"><span style="margin-right:0.127cm;">19.197.11</span></a><a id="__RefHeading__1417132_253892949"/><a id="attribute-draw_name_element-draw_g"/>&lt;draw:g&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:g&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_12_draw_gradient_"><span style="margin-right:0.127cm;">19.197.12</span></a><a id="__RefHeading__1417134_253892949"/><a id="attribute-draw_name_element-draw_gradient"/>&lt;draw:gradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:gradient&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_13_draw_hatch_"><span style="margin-right:0.127cm;">19.197.13</span></a><a id="__RefHeading__1417136_253892949"/><a id="attribute-draw_name_element-draw_hatch"/>&lt;draw:hatch&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:hatch&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_14_draw_layer_"><span style="margin-right:0.127cm;">19.197.14</span></a><a id="__RefHeading__1417138_253892949"/><a id="attribute-draw_name_element-draw_layer"/>&lt;draw:layer&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:layer&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:layer&gt;</span> <a href="#element-draw_layer">10.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_15_draw_line_"><span style="margin-right:0.127cm;">19.197.15</span></a><a id="__RefHeading__1417140_253892949"/><a id="attribute-draw_name_element-draw_line"/>&lt;draw:line&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:line&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_16_draw_marker_"><span style="margin-right:0.127cm;">19.197.16</span></a><a id="__RefHeading__1417142_253892949"/><a id="attribute-draw_name_element-draw_marker"/>&lt;draw:marker&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:marker&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:marker&gt;</span> <a href="#element-draw_marker">16.40.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_17_draw_measure_"><span style="margin-right:0.127cm;">19.197.17</span></a><a id="__RefHeading__1417144_253892949"/><a id="attribute-draw_name_element-draw_measure"/>&lt;draw:measure&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:measure&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_18_draw_opacity_"><span style="margin-right:0.127cm;">19.197.18</span></a><a id="__RefHeading__1417146_253892949"/><a id="attribute-draw_name_element-draw_opacity"/>&lt;draw:opacity&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:opacity&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_19_draw_page_"><span style="margin-right:0.127cm;">19.197.19</span></a><a id="__RefHeading__1417148_253892949"/><a id="attribute-draw_name_element-draw_page"/>&lt;draw:page&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:page&gt;</span> element can be referenced. The name shall be unique within the document instance. If the attribute is not present, a consumer may generate a unique name. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_20_draw_page-thumbnail_"><span style="margin-right:0.127cm;">19.197.20</span></a><a id="__RefHeading__1417150_253892949"/><a id="attribute-draw_name_element-draw_page-thumbnail"/>&lt;draw:page-thumbnail&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:page-thumbnail&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_21_draw_param_"><span style="margin-right:0.127cm;">19.197.21</span></a><a id="__RefHeading__1417152_253892949"/><a id="attribute-draw_name_element-draw_param"/>&lt;draw:param&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies the name of a runtime parameter. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:param&gt;</span> <a href="#element-draw_param">10.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_22_draw_path_"><span style="margin-right:0.127cm;">19.197.22</span></a><a id="__RefHeading__1417154_253892949"/><a id="attribute-draw_name_element-draw_path"/>&lt;draw:path&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:path&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_23_draw_polygon_"><span style="margin-right:0.127cm;">19.197.23</span></a><a id="__RefHeading__1417156_253892949"/><a id="attribute-draw_name_element-draw_polygon"/>&lt;draw:polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:polygon&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_24_draw_polyline_"><span style="margin-right:0.127cm;">19.197.24</span></a><a id="__RefHeading__1417158_253892949"/><a id="attribute-draw_name_element-draw_polyline"/>&lt;draw:polyline&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:polyline&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_25_draw_rect_"><span style="margin-right:0.127cm;">19.197.25</span></a><a id="__RefHeading__1417160_253892949"/><a id="attribute-draw_name_element-draw_rect"/>&lt;draw:rect&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:rect&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_26_draw_regular-polygon_"><span style="margin-right:0.127cm;">19.197.26</span></a><a id="__RefHeading__1417162_253892949"/><a id="attribute-draw_name_element-draw_regular-polygon"/>&lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:regular-polygon&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_27_draw_stroke-dash_"><span style="margin-right:0.127cm;">19.197.27</span></a><a id="__RefHeading__1417164_253892949"/><a id="attribute-draw_name_element-draw_stroke-dash"/>&lt;draw:stroke-dash&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;draw:stroke-dash&gt;</span> element can be referenced. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_28_office_annotation___deprecated_"><span style="margin-right:0.127cm;">19.197.28</span></a><a id="__RefHeading__1417166_253892949"/><a id="attribute-draw_name_element-office_annotation"/>&lt;office:annotation&gt; (deprecated)</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name for an <span class="Element">&lt;office:annotation&gt;</span> element.</p><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute has been deprecated in favor of the <span class="Attribute">office:name</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_197_29_svg_linearGradient_"><span style="margin-right:0.127cm;">19.197.29</span></a><a id="__RefHeading__1417168_253892949"/><a id="attribute-draw_name_element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;svg:linearGradient&gt;</span> element can be referenced. </p><p class="Text_20_body">SVG gradients are referenced by the name assigned to them by use of the <span class="Attribute">draw:fill-gradient-name</span> attribute within a graphic style. SVG gradients cannot be referenced by a <span class="Attribute">draw:opacity-name</span> attribute. The result of referencing a SVG gradient with a <span class="Attribute">draw:fill-</span><span class="Attribute">gradient-name</span> attribute and an opacity gradient with a <span class="Attribute">draw:opacity-name</span> attribute at the same time is unspecified.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_197_30_svg_radialGradient_"><span style="margin-right:0.127cm;">19.197.30</span></a><a id="__RefHeading__1417170_253892949"/><a id="attribute-draw_name_element-svg_radialGradient"/>&lt;svg:radialGradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:name</span> attribute specifies a name by which a <span class="Element">&lt;svg:radialGradient&gt;</span> element can be referenced. </p><p class="Text_20_body">SVG gradients are referenced by the name assigned to them by use of the <span class="Attribute">draw:fill-gradient-name</span> attribute within a graphic style. SVG gradients cannot be referenced by a <span class="Attribute">draw:opacity-name</span> attribute. The result of referencing a SVG gradient with a <span class="Attribute">draw:fill-</span><span class="Attribute">gradient-name</span> attribute and an opacity gradient with a <span class="Attribute">draw:opacity-name</span> attribute at the same time is unspecified.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:name</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h2 class="Heading_20_2"><a id="a19_198draw_nav-order"><span style="margin-right:0.127cm;">19.198</span></a><a id="__RefHeading__1417172_253892949"/><a id="attribute-draw_nav-order"/>draw:nav-order</h2><p class="Text_20_body">The <span class="Attribute">draw:nav-order</span> attribute defines a navigation sequence for the graphical elements included in a <span class="Element">&lt;draw:page&gt;</span> element. Its value is a sequence of IDREFs. It shall include all graphic elements in the page that are not contained within a <span class="Element">&lt;draw:g&gt;</span> element. Any <span class="Element">&lt;draw:g&gt;</span> elements are included in that list as a single graphical element. </p><p class="Text_20_body">The value of this attribute is the ordering of graphics as set by the document author.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The ordering within any <span class="Element">&lt;draw:g&gt;</span> element is set by the value of its <span class="Attribute">draw:z-index</span> attribute. <a href="#attribute-draw_z-index">19.231</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:nav-order</span> attribute is usable with the following element: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:nav-order</span> attribute has the data type <span class="Datatype">IDREFS</span> <a href="#datatype-IDREFS">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_199draw_nohref"><span style="margin-right:0.127cm;">19.199</span></a><a id="__RefHeading__1417174_253892949"/><a id="attribute-draw_nohref"/>draw:nohref</h2><p class="Text_20_body">The <span class="Attribute">draw:nohref</span> attribute specifies that an image map element and its associated area are inactive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:nohref</span> attribute is usable with the following elements: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a> and <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The only value of the <span class="Attribute">draw:nohref</span> attribute is <span class="Attribute_20_Value">nohref</span>.</p><h2 class="Heading_20_2"><a id="a19_200draw_notify-on-update-of-ranges"><span style="margin-right:0.127cm;">19.200</span></a><a id="__RefHeading__1417176_253892949"/><a id="attribute-draw_notify-on-update-of-ranges"/>draw:notify-on-update-of-ranges</h2><p class="Text_20_body">The <span class="Attribute">draw:notify-on-update-of-ranges</span> attribute specifies that a <span class="Element">&lt;draw:object&gt;</span> will be notified if content within a given ranges changes. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:notify-on-update-of-ranges</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a list of cell ranges.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a table name.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If a table name is specified, the <span class="Element">&lt;draw:object&gt;</span> element is notified if any of the table's cells change. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:notify-on-update-of-ranges</span> attribute is usable with the following element: <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:notify-on-update-of-ranges</span> attribute are a value of type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_201draw_object"><span style="margin-right:0.127cm;">19.201</span></a><a id="__RefHeading__1417178_253892949"/><a id="attribute-draw_object"/>draw:object</h2><p class="Text_20_body">The <span class="Attribute">draw:object</span> attribute is equivalent to the object attribute of an <span class="Alien_20_Element">&lt;applet&gt;</span> element in HTML. See. §13.4 of <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:object</span> attribute is usable with the following element: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:object</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_202draw_opacity"><span style="margin-right:0.127cm;">19.202</span></a><a id="__RefHeading__1417180_253892949"/><a id="attribute-draw_opacity"/>draw:opacity</h2><p class="Text_20_body">The <span class="Attribute">draw:opacity</span> attribute specifies the opacity for an image or graphic object. The defined value range for the <span class="Attribute">draw:opacity</span> attribute is 0% to 100%, where 0% is fully transparent and 100% is fully opaque.</p><p class="Text_20_body">Use of the <span class="Attribute">draw:opacity</span> attribute disables any transparency effect and set the opacity for the fill area of a graphic object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:opacity</span> attribute is usable with the following element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:opacity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_203draw_page-number"><span style="margin-right:0.127cm;">19.203</span></a><a id="__RefHeading__1417182_253892949"/><a id="attribute-draw_page-number"/>draw:page-number</h2><p class="Text_20_body">The <span class="Attribute">draw:page-number</span> attribute specifies the number of a page that is displayed as a thumbnail. For thumbnails on notes pages, the value of this attribute is fixed to the drawing page of a notes page. For thumbnails on handout master pages, the value of this attribute is the order in which the pages are previewed on the handout.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:page-number</span> attribute is usable with the following element: <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:page-number</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_204draw_path-stretchpoint-x"><span style="margin-right:0.127cm;">19.204</span></a><a id="__RefHeading__1417184_253892949"/><a id="attribute-draw_path-stretchpoint-x"/>draw:path-stretchpoint-x</h2><p class="Text_20_body">The <span class="Attribute">draw:path-stretchpoint-x</span> attribute specifies that a drawing shape is stretched horizontally. </p><p class="Text_20_body">If specified, and if the x/y aspect ratio of the <span class="Attribute">svg:viewBox</span> is lower than the x/y aspect ratio of the shape size then the whole path is stretched horizontally at <span class="Attribute">draw:path-stretchpoint-x</span>. </p><p class="Text_20_body">Stretching is done by:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>intersecting the path vertically at <span class="Attribute">draw:path-stretchpoint-x</span>.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>moving the right path fragments to the right border of the drawing shape, using its original aspect ratio.The left path fragment remains unmodified at the left border of drawing the shape <span class="odfLiEnd"/> </p></li></ol><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:path-stretchpoint-x</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:path-stretchpoint-x</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_205draw_path-stretchpoint-y"><span style="margin-right:0.127cm;">19.205</span></a><a id="__RefHeading__1417186_253892949"/><a id="attribute-draw_path-stretchpoint-y"/>draw:path-stretchpoint-y</h2><p class="Text_20_body">The <span class="Attribute">draw:path-stretchpoint-y</span> attribute specifies that a drawing shape is stretched vertically.If the x/y aspect ratio of the <span class="Attribute">svg:viewBox</span> is greater than the x/y aspect ratio of the shape size then the whole path is stretched vertically at <span class="Attribute">draw:path-stretchpoint-y</span>. </p><p class="Text_20_body">Stretching is done by: </p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>intersecting the path horizontally at <span class="Attribute">draw:path-stretchpoint-y</span>. <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>moving the bottom path fragments to the bottom border of the drawing shape, using its original aspect ratio. <span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The top path fragment remains unmodified at the top border of drawing the shape </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:path-stretchpoint-y</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:path-stretchpoint-y</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_206draw_points"><span style="margin-right:0.127cm;">19.206</span></a><a id="__RefHeading__1417188_253892949"/><a id="attribute-draw_points"/>draw:points</h2><p class="Text_20_body">The <span class="Attribute">draw:points</span> attribute stores a sequence of points, which are connected by straight lines. Each point consists of two coordinates. The coordinates are separated by a comma “,” (U+002C, COMMA) and the points are separated by white spaces. The coordinates are relative to the coordinate system established by the <span class="Attribute">svg:viewBox</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:points</span> attribute is usable with the following elements: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:contour-polygon&gt;</span> <a href="#element-draw_contour-polygon">10.4.11.2</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a> and <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:points</span> attribute has the data type <span class="Datatype">points</span> <a href="#datatype-points">18.3.25</a>.</p><h2 class="Heading_20_2"><a id="a19_207draw_protected"><span style="margin-right:0.127cm;">19.207</span></a><a id="__RefHeading__1417190_253892949"/><a id="attribute-draw_protected"/>draw:protected</h2><p class="Text_20_body">The <span class="Attribute">draw:protected</span> attribute specifies if drawing objects in a layer are protected from modification.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:protected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: objects in a layer are not protected from modification.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: objects in a layer are protected from modification.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:protected</span> attribute is usable with the following element: <span class="Element">&lt;draw:layer&gt;</span> <a href="#element-draw_layer">10.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_208draw_recreate-on-edit"><span style="margin-right:0.127cm;">19.208</span></a><a id="__RefHeading__1417192_253892949"/><a id="attribute-draw_recreate-on-edit"/>draw:recreate-on-edit</h2><p class="Text_20_body">The <span class="Attribute">draw:recreate-on-edit</span> attribute specifies if the contour of an image or object should be recreated automatically if the image or object is edited.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:recreate-on-edit</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the contour of an image or object is not recreated automatically if the image or object is edited.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the contour of an image or object is recreated automatically if the image or object is edited.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:recreate-on-edit</span> attribute is usable with the following elements: <span class="Element">&lt;draw:contour-path&gt;</span> <a href="#element-draw_contour-path">10.4.11.3</a> and <span class="Element">&lt;draw:contour-polygon&gt;</span> <a href="#element-draw_contour-polygon">10.4.11.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:recreate-on-edit</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_209draw_rotation"><span style="margin-right:0.127cm;">19.209</span></a><a id="__RefHeading__1417194_253892949"/><a id="attribute-draw_rotation"/>draw:rotation</h2><p class="Text_20_body">The <span class="Attribute">draw:rotation</span> attribute specifies the rotation angle of a hatch axis. The direction is clockwise, 0 degrees is the vertical axis. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:rotation</span> attribute is usable with the following element: <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:rotation</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_210draw_shape-id"><span style="margin-right:0.127cm;">19.210</span></a><a id="__RefHeading__1417196_253892949"/><a id="attribute-draw_shape-id"/>draw:shape-id</h2><p class="Text_20_body">The <span class="Attribute">draw:shape-id</span> attribute identifies the shape to which an effect defined by a presentation shape effect element is applied.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:shape-id</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:dim&gt;</span> <a href="#element-presentation_dim">10.8.7</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:play&gt;</span> <a href="#element-presentation_play">10.8.8</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:shape-id</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_211draw_sharpness"><span style="margin-right:0.127cm;">19.211</span></a><a id="__RefHeading__1417198_253892949"/><a id="attribute-draw_sharpness"/>draw:sharpness</h2><p class="Text_20_body">The <span class="Attribute">draw:sharpness</span> attribute specifies the radius of the ellipse on which inner polygon corners are located. The value is a percentage, where 0% means that all corners are located on a single ellipse, while 100% means that the inner corners are located at the center point of the polygon. If <span class="Formula">r</span> is the radius of the polygon, and <span class="Formula">s</span> is the sharpness, the inner corners are located on a ellipse whose radius is <span class="Formula">r(100-s)/100</span>.</p><p class="Note"><span class="Note_20_Label">Note:</span> This attribute is only meaningful only with a <span class="Attribute">draw:concave</span> attribute with the value <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:sharpness</span> attribute is usable with the following element: <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:sharpness</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_212draw_start"><span style="margin-right:0.127cm;">19.212</span></a><a id="__RefHeading__1417200_253892949"/><a id="attribute-draw_start"/>draw:start</h2><p class="Text_20_body">The <span class="Attribute">draw:start</span> attribute specifies the start value for the <span class="Element">&lt;draw:opacity&gt;</span> element, which interpolates between the value of this attribute and <span class="Attribute">draw:end</span>. The defined value range for the <span class="Attribute">draw:start</span> attribute is 0% to 100%, where 0% is transparent and 100% is opaque.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start</span> attribute is usable with the following element: <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_213draw_start-angle"><span style="margin-right:0.127cm;">19.213</span></a><a id="__RefHeading__1417202_253892949"/><a id="attribute-draw_start-angle"/>draw:start-angle</h2><p class="Text_20_body">The <span class="Attribute">draw:start-angle</span> attribute specifies the start angle of a section, cut, or arc for circles where the <span class="Attribute">draw:kind</span> attribute value is <span class="Attribute_20_Value">section</span>, <span class="Attribute_20_Value">cut</span> or <span class="Attribute_20_Value">arc</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-angle</span> attribute is usable with the following elements: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a> and <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_214draw_start-color"><span style="margin-right:0.127cm;">19.214</span></a><a id="__RefHeading__1417204_253892949"/><a id="attribute-draw_start-color"/>draw:start-color</h2><p class="Text_20_body">The <span class="Attribute">draw:start-color</span> attributes specifies the start value for the <span class="Element">&lt;draw:gradient&gt;</span> element, which interpolates between the value of this attribute and <span class="Attribute">draw:end-color</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-color</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_215draw_start-glue-point"><span style="margin-right:0.127cm;">19.215</span></a><a id="__RefHeading__1417206_253892949"/><a id="attribute-draw_start-glue-point"/>draw:start-glue-point</h2><p class="Text_20_body">The <span class="Attribute">draw:start-glue-point</span> attribute identifies the glue point in a shape where a connector starts by its number. See <a href="#element-draw_glue-point">10.3.16</a>. Glue point numbers are defined by the <span class="Attribute">draw:id</span> attributes of the glue point elements <span class="Element">&lt;draw:glue-point&gt;</span>. See <a href="#attribute-draw_id">19.187</a>.</p><p class="Text_20_body">If the connector is not connected to a shape, this attribute is ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-glue-point</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-glue-point</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_216draw_start-intensity"><span style="margin-right:0.127cm;">19.216</span></a><a id="__RefHeading__1417208_253892949"/><a id="attribute-draw_start-intensity"/>draw:start-intensity</h2><p class="Text_20_body">The <span class="Attribute">draw:start-intensity</span> attribute specifies the intensity of the gradient's start color as a percentage value. If it is not specified, the color is used at 100% intensity. The defined value range for the <span class="Attribute">draw:start-intensity</span> attribute is 0% to 100%.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-intensity</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-intensity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_217draw_start-shape"><span style="margin-right:0.127cm;">19.217</span></a><a id="__RefHeading__1417210_253892949"/><a id="attribute-draw_start-shape"/>draw:start-shape</h2><p class="Text_20_body">The <span class="Attribute">draw:start-shape</span> attribute specifies a drawing shape to which the start of a connector is connected by its ID.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-shape</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-shape</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_218draw_style"><span style="margin-right:0.127cm;">19.218</span></a><a id="__RefHeading__1417212_253892949"/><a id="attribute-draw_style"/>draw:style</h2><h3 class="Heading_20_3"><a id="a19_218_1General"><span style="margin-right:0.127cm;">19.218.1</span></a><a id="__RefHeading__1417214_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:style</span> attribute specifies the rendering of graphic objects. </p><h3 class="Heading_20_3"><a id="a19_218_2_draw_gradient_"><span style="margin-right:0.127cm;">19.218.2</span></a><a id="__RefHeading__1417216_253892949"/><a id="attribute-draw_style_element-draw_gradient"/>&lt;draw:gradient&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style</span> attribute specifies a rendering for a gradient. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:style</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">axial</span>: defines a bi-linear gradient that is also known as reflected gradient or mirrored linear gradient. It is created as a linear gradient that is mirrored (or reflected) along its axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ellipsoid</span>: defines a gradient where the colors are blend along the radius from the center of an ellipsoid as defined with the <span class="Attribute">draw:cx</span> and <span class="Attribute">draw:cy</span> attributes. The length of the semi major-axis is the width of the filled area and the length of the semi-minor axis is the height of the filled area. The area outside the ellipse is filled with the end color. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">Linear</span>:  defines a gradient where the colors blend along the linear axis of the gradient. The axis of the gradient is specified with the <span class="Attribute">draw:angle</span> attribute clockwise to the vertical axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">radial</span>: defines a gradient where the colors are blend along the radius from the center of a circle as defined with the <span class="Attribute">draw:cx</span> and <span class="Attribute">draw:cy</span> attributes. The outside of the circle is filled with the end color.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">rectangle</span>: defines a gradient that produces a rectangular blend from the center of the rectangle to the shortest of the 4 borders. The center of the rectangle is defined with the attributes <span class="Attribute">draw:cx</span> and <span class="Attribute">draw:cy</span>. The width of the rectangle is the width of the filled area, the height of the rectangle is the height of the filled area. The outside of the square is filled with the end color. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">square</span>: defines a gradient that produces a square blend, imitating the visual perspective in a corridor or the aerial view of a pyramid. Also known as "box gradient" and "pyramidal gradient". The center of the square is defined with the <span class="Attribute">draw:cx</span> and <span class="Attribute">draw:cy</span> attributes. The width and height of the square is the minimum value of either the width or the height of the filled area. The outside of the square is filled with the end color. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style</span> attribute is usable with the following element: <span class="Element">&lt;draw:gradient&gt;</span> <a href="#element-draw_gradient">16.40.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:style</span> attribute are <span class="Attribute_20_Value">linear</span>, <span class="Attribute_20_Value">axial</span>, <span class="Attribute_20_Value">radial</span>, <span class="Attribute_20_Value">ellipsoid</span>, <span class="Attribute_20_Value">square</span> or <span class="Attribute_20_Value">rectangular</span>.</p><h3 class="Heading_20_3"><a id="a19_218_3_draw_hatch_"><span style="margin-right:0.127cm;">19.218.3</span></a><a id="__RefHeading__1417218_253892949"/><a id="attribute-draw_style_element-draw_hatch"/>&lt;draw:hatch&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style</span> attribute specifies a rendering for a hatch. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:style</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: defines a hatch that is made of a set of parallel lines along the axis of the hatch and a set of parallel lines perpendicular to the axis of the hatch. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">single</span>: defines a hatch that is made of parallel lines along the axis of the hatch. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">triple</span>: defines a hatch that is made of a set of parallel lines along the axis of the hatch, a set of parallel lines perpendicular to the axis of the hatch and a set of lines along 45 degree clockwise to the axis of the hatch. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style</span> attribute is usable with the following element: <span class="Element">&lt;draw:hatch&gt;</span> <a href="#element-draw_hatch">16.40.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:style</span> attribute are <span class="Attribute_20_Value">single</span>, <span class="Attribute_20_Value">double</span> or <span class="Attribute_20_Value">triple</span>.</p><h3 class="Heading_20_3"><a id="a19_218_4_draw_opacity_"><span style="margin-right:0.127cm;">19.218.4</span></a><a id="__RefHeading__1417220_253892949"/><a id="attribute-draw_style_element-draw_opacity"/>&lt;draw:opacity&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style</span> attribute specifies the transparency of a graphic object.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:style</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">axial</span>: <a href="#attribute-draw_style_element-draw_gradient">19.218.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ellipsoid</span>: <a href="#attribute-draw_style_element-draw_gradient">19.218.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">linear</span>: <a href="#attribute-draw_style_element-draw_gradient">19.218.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">rectangle</span>: <a id="DDE_LINK23"/><a href="#attribute-draw_style_element-draw_gradient">19.218.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">square</span>: <a href="#attribute-draw_style_element-draw_gradient">19.218.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The transparency of an object is blended in contrast to the blending of colors described for <span class="Attribute">draw:style</span> on <span class="Element">&lt;draw:gradient&gt;</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style</span> attribute is usable with the following element: <span class="Element">&lt;draw:opacity&gt;</span> <a href="#element-draw_opacity">16.40.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:style</span> attribute are <span class="Attribute_20_Value">linear</span>, <span class="Attribute_20_Value">axial</span>, <span class="Attribute_20_Value">radial</span>, <span class="Attribute_20_Value">ellipsoid</span>, <span class="Attribute_20_Value">square</span> or <span class="Attribute_20_Value">rectangular</span>.</p><h3 class="Heading_20_3"><a id="a19_218_5_draw_stroke-dash_"><span style="margin-right:0.127cm;">19.218.5</span></a><a id="__RefHeading__1417222_253892949"/><a id="attribute-draw_style_element-draw_stroke-dash"/>&lt;draw:stroke-dash&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style</span> attribute specifies a rendering for a stroke-dash. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:style</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">rect</span>: dash has a rectangular shape. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">round</span>: dash has a round shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style</span> attribute is usable with the following element: <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:style</span> attribute are <span class="Attribute_20_Value">rect</span> or <span class="Attribute_20_Value">round</span>.</p><h2 class="Heading_20_2"><a id="a19_219draw_style-name"><span style="margin-right:0.127cm;">19.219</span></a><a id="__RefHeading__1417224_253892949"/><a id="attribute-draw_style-name"/>draw:style-name</h2><h3 class="Heading_20_3"><a id="a19_219_1General"><span style="margin-right:0.127cm;">19.219.1</span></a><a id="__RefHeading__1417226_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element whose family varies depending upon the element where it appears. </p><h3 class="Heading_20_3"><a id="a19_219_2_dr3d_cube_"><span style="margin-right:0.127cm;">19.219.2</span></a><a id="__RefHeading__1417228_253892949"/><a id="attribute-draw_style-name_element-dr3d_cube"/>&lt;dr3d:cube&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_3_dr3d_extrude_"><span style="margin-right:0.127cm;">19.219.3</span></a><a id="__RefHeading__1417230_253892949"/><a id="attribute-draw_style-name_element-dr3d_extrude"/>&lt;dr3d:extrude&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_4_dr3d_rotate_"><span style="margin-right:0.127cm;">19.219.4</span></a><a id="__RefHeading__1417232_253892949"/><a id="attribute-draw_style-name_element-dr3d_rotate"/>&lt;dr3d:rotate&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_5_dr3d_scene_"><span style="margin-right:0.127cm;">19.219.5</span></a><a id="__RefHeading__1417234_253892949"/><a id="attribute-draw_style-name_element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_6_dr3d_sphere_"><span style="margin-right:0.127cm;">19.219.6</span></a><a id="__RefHeading__1417236_253892949"/><a id="attribute-draw_style-name_element-dr3d_sphere"/>&lt;dr3d:sphere&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_7_draw_caption_"><span style="margin-right:0.127cm;">19.219.7</span></a><a id="__RefHeading__1417238_253892949"/><a id="attribute-draw_style-name_element-draw_caption"/>&lt;draw:caption&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_8_draw_circle_"><span style="margin-right:0.127cm;">19.219.8</span></a><a id="__RefHeading__1417240_253892949"/><a id="attribute-draw_style-name_element-draw_circle"/>&lt;draw:circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_9_draw_connector_"><span style="margin-right:0.127cm;">19.219.9</span></a><a id="__RefHeading__1417242_253892949"/><a id="attribute-draw_style-name_element-draw_connector"/>&lt;draw:connector&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_10_draw_control_"><span style="margin-right:0.127cm;">19.219.10</span></a><a id="__RefHeading__1417244_253892949"/><a id="attribute-draw_style-name_element-draw_control"/>&lt;draw:control&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_11_draw_custom-shape_"><span style="margin-right:0.127cm;">19.219.11</span></a><a id="__RefHeading__1417246_253892949"/><a id="attribute-draw_style-name_element-draw_custom-shape"/>&lt;draw:custom-shape&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_12_draw_ellipse_"><span style="margin-right:0.127cm;">19.219.12</span></a><a id="__RefHeading__1417248_253892949"/><a id="attribute-draw_style-name_element-draw_ellipse"/>&lt;draw:ellipse&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_13_draw_frame_"><span style="margin-right:0.127cm;">19.219.13</span></a><a id="__RefHeading__1417250_253892949"/><a id="attribute-draw_style-name_element-draw_frame"/>&lt;draw:frame&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_14_draw_g_"><span style="margin-right:0.127cm;">19.219.14</span></a><a id="__RefHeading__1417252_253892949"/><a id="attribute-draw_style-name_element-draw_g"/>&lt;draw:g&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_15_draw_line_"><span style="margin-right:0.127cm;">19.219.15</span></a><a id="__RefHeading__1417254_253892949"/><a id="attribute-draw_style-name_element-draw_line"/>&lt;draw:line&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_16_draw_measure_"><span style="margin-right:0.127cm;">19.219.16</span></a><a id="__RefHeading__1417256_253892949"/><a id="attribute-draw_style-name_element-draw_measure"/>&lt;draw:measure&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_17_draw_page_"><span style="margin-right:0.127cm;">19.219.17</span></a><a id="__RefHeading__1417258_253892949"/><a id="attribute-draw_style-name_element-draw_page"/>&lt;draw:page&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">drawing-page</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_18_draw_page-thumbnail_"><span style="margin-right:0.127cm;">19.219.18</span></a><a id="__RefHeading__1417260_253892949"/><a id="attribute-draw_style-name_element-draw_page-thumbnail"/>&lt;draw:page-thumbnail&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_19_draw_path_"><span style="margin-right:0.127cm;">19.219.19</span></a><a id="__RefHeading__1417262_253892949"/><a id="attribute-draw_style-name_element-draw_path"/>&lt;draw:path&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_20_draw_polygon_"><span style="margin-right:0.127cm;">19.219.20</span></a><a id="__RefHeading__1417264_253892949"/><a id="attribute-draw_style-name_element-draw_polygon"/>&lt;draw:polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_21_draw_polyline_"><span style="margin-right:0.127cm;">19.219.21</span></a><a id="__RefHeading__1417266_253892949"/><a id="attribute-draw_style-name_element-draw_polyline"/>&lt;draw:polyline&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_22_draw_rect_"><span style="margin-right:0.127cm;">19.219.22</span></a><a id="__RefHeading__1417268_253892949"/><a id="attribute-draw_style-name_element-draw_rect"/>&lt;draw:rect&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_23_draw_regular-polygon_"><span style="margin-right:0.127cm;">19.219.23</span></a><a id="__RefHeading__1417270_253892949"/><a id="attribute-draw_style-name_element-draw_regular-polygon"/>&lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_24_office_annotation_"><span style="margin-right:0.127cm;">19.219.24</span></a><a id="__RefHeading__1417272_253892949"/><a id="attribute-draw_style-name_element-office_annotation"/>&lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">graphic</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_25_presentation_notes_"><span style="margin-right:0.127cm;">19.219.25</span></a><a id="__RefHeading__1417274_253892949"/><a id="attribute-draw_style-name_element-presentation_notes"/>&lt;presentation:notes&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">drawing-page</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_26_style_handout-master_"><span style="margin-right:0.127cm;">19.219.26</span></a><a id="__RefHeading__1417276_253892949"/><a id="attribute-draw_style-name_element-style_handout-master"/>&lt;style:handout-master&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">drawing-page</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_219_27_style_master-page_"><span style="margin-right:0.127cm;">19.219.27</span></a><a id="__RefHeading__1417278_253892949"/><a id="attribute-draw_style-name_element-style_master-page"/>&lt;style:master-page&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:style-name</span> attribute specifies the name of a <span class="Element">&lt;style:style&gt;</span> element that defines a style with the family value of <span class="Attribute_20_Value">drawing-page</span>. </p><p class="Text_20_body">In drawing and presentation documents, additional drawing page attributes may be assigned to a drawing page using the <span class="Attribute">draw:style-name</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_220draw_text-areas"><span style="margin-right:0.127cm;">19.220</span></a><a id="__RefHeading__1417280_253892949"/><a id="attribute-draw_text-areas"/>draw:text-areas</h2><p class="Text_20_body">The <span class="Attribute">draw:text-areas</span> attribute specifies up to two text areas. If the attribute specifies one text area, this text area is used to position and align the text. If the attribute specifies two text areas, the second text area is used if a style that is assigned to the text has a <span class="Attribute">style:writing-mode</span> attribute with value <span class="Attribute_20_Value">tb-rl</span> or <span class="Attribute_20_Value">tb</span>. Otherwise, the first text area is used. If the draw:text-areas attribute is omitted, the entire area of the shape is used to position and align the text. </p><p class="Text_20_body">An area consists of four parameters:</p><p class="Text_20_body">The first parameter specifies the left side of a text area.</p><p class="Text_20_body">The second parameter specifies the top side of a text area.</p><p class="Text_20_body">The third parameter specifies the right side of a text area.</p><p class="Text_20_body">The fourth parameter specifies the bottom side of a text area.</p><p class="Text_20_body">A parameter can also have one of the following enhancements:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A “?” (U+003F, QUESTION MARK) is used to mark the beginning of a formula name. The result of the <span class="Element">&lt;draw:equation&gt;</span> element's <span class="Attribute">draw:formula</span> attribute whose <span class="Attribute">draw:name</span> attribute is the formula name that is used as the value. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If “$” (U+0024, DOLLAR SIGN) precedes an integer value, the value is an index to a <span class="Attribute">draw:modifiers</span> attribute. The corresponding modifier value is used as parameter value.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value of a <span class="Attribute">draw:text-areas</span> attribute is formally defined as:</p><p class="Code_borderStart">textareas::= textareasequence <br/>textareasequence ::= textarea ( ' '+ textarea )? <br/>textarea::= position ' '+ position ' '+ position ' '+ position <br/>position::= formula | modifier | number <br/>formula::= '?' name <br/>modifier::= '$' integer <br/>number::= sign? float | sign? integer <br/>float::= fractional exponent? | integer exponent <br/>fractional::= integer? '.' integer | integer '.' <br/>exponent::= ( 'e' | 'E' ) sign? integer <br/>sign::= '+'| '-' <br/>integer::= [0-9]+ <br/>name ::= [^ ]+ </p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-areas</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:text-areas</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_221draw_text-path"><span style="margin-right:0.127cm;">19.221</span></a><a id="__RefHeading__1417282_253892949"/><a id="attribute-draw_text-path"/>draw:text-path</h2><p class="Text_20_body">The <span class="Attribute">draw:text-path</span> attribute specifies if text is displayed on a text path.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:text-path</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text is not displayed on a text path.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text is displayed on a text path.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-path</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:text-path</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_222draw_text-path-allowed"><span style="margin-right:0.127cm;">19.222</span></a><a id="__RefHeading__1417284_253892949"/><a id="attribute-draw_text-path-allowed"/>draw:text-path-allowed</h2><p class="Text_20_body">The <span class="Attribute">draw:text-path-allowed</span> attribute specifies whether the user interface of a consumer that supports the <span class="Attribute">draw:text-path</span> attribute should allow modification of the value of the <span class="Attribute">draw:text-path</span> attribute. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:text-path-allowed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the value of the <span class="Attribute">draw:text-path</span> attribute should not be modifiable by the user interface.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the value of the <span class="Attribute">draw:text-path</span> attribute should be modifiable by the user interface.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-path-allowed</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:text-path-allowed</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_223draw_text-path-mode"><span style="margin-right:0.127cm;">19.223</span></a><a id="__RefHeading__1417286_253892949"/><a id="attribute-draw_text-path-mode"/>draw:text-path-mode</h2><p class="Text_20_body">The <span class="Attribute">draw:text-path-mode</span> attribute specifies how text is drawn on a path.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:text-path-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">normal</span>: text is drawn along the path without scaling;<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">path</span>: text is fitted to a path;<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">shape</span>: text is fitted to the bounding box of a shape.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">normal</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-path-mode</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:text-path-mode</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">path</span> or <span class="Attribute_20_Value">shape</span>.</p><h2 class="Heading_20_2"><a id="a19_224draw_text-path-same-letter-heights"><span style="margin-right:0.127cm;">19.224</span></a><a id="__RefHeading__1417288_253892949"/><a id="attribute-draw_text-path-same-letter-heights"/>draw:text-path-same-letter-heights</h2><p class="Text_20_body">The <span class="Attribute">draw:text-path-same-letter-heights</span> attribute specifies if all letters in a custom shape have the same height.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:text-path-same-letter-heights</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: letters in a custom shape need not have the same height.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: letters in a custom shape have the same height.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-path-same-letter-heights</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:text-path-same-letter-heights</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_225draw_text-path-scale"><span style="margin-right:0.127cm;">19.225</span></a><a id="__RefHeading__1417290_253892949"/><a id="attribute-draw_text-path-scale"/>draw:text-path-scale</h2><p class="Text_20_body">The <span class="Attribute">draw:text-path-scale</span> attribute specifies the scaling of a text path.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:text-path-scale</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">path</span>: text scaling is determined by the length of the path from the <span class="Attribute">draw:enhanced-path</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">shape</span>: text scaling is determined by the width of a shape.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">path</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-path-scale</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:text-path-scale</span> attribute are <span class="Attribute_20_Value">path</span> or <span class="Attribute_20_Value">shape</span>.</p><h2 class="Heading_20_2"><a id="a19_226draw_text-rotate-angle"><span style="margin-right:0.127cm;">19.226</span></a><a id="__RefHeading__1417292_253892949"/><a id="attribute-draw_text-rotate-angle"/>draw:text-rotate-angle</h2><p class="Text_20_body">The <span class="Attribute">draw:text-rotate-angle</span> attribute specifies the angle by which text within a custom shape is rotated in addition to the rotation included in the shape's <span class="Attribute">draw:transform</span> attribute. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:text-rotate-angle</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:text-rotate-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a19_227draw_text-style-name"><span style="margin-right:0.127cm;">19.227</span></a><a id="__RefHeading__1417294_253892949"/><a id="attribute-draw_text-style-name"/>draw:text-style-name</h2><p class="Text_20_body">The <span class="Attribute">draw:text-style-name</span> attribute specifies a style for formatting of text in a shape.</p><p class="Text_20_body">The value of this attribute is the name of a <span class="Element">&lt;style:style&gt;</span> element with a family value of <span class="Attribute_20_Value">paragraph</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:text-style-name</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:text-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_228draw_transform"><span style="margin-right:0.127cm;">19.228</span></a><a id="__RefHeading__1417296_253892949"/><a id="attribute-draw_transform"/>draw:transform</h2><p class="Text_20_body">The <span class="Attribute">draw:transform</span> attribute specifies a list of transformations that can be applied to a drawing shape. </p><p class="Text_20_body">The value of this attribute is a list of transform definitions, which are applied to the drawing shape in the order in which they are listed. The transform definitions in the list shall be separated by a white space and/or a comma “,” (U+002C, COMMA). Unless otherwise stated, the parameters of the transform definitions are double values (<a href="#datatype-double">18.2</a>) </p><p class="Text_20_body">The defined transforms are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">matrix(</span><span class="Attribute_20_Value_20_Param">&lt;a&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;b&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;c&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;d&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;e&gt;</span><span class="Attribute_20_Value_20_Instance"> </span><span class="Attribute_20_Value_20_Param">&lt;f&gt;</span><span class="Attribute_20_Value_20_Instance">)</span>, specifies a transformation in the form of a transformation matrix of six values. "The values describe a standard 3x2 homogeneous transformation matrix in column-major order, where the right column (<span class="Attribute_20_Value_20_Param">&lt;e&gt;</span>, <span class="Attribute_20_Value_20_Param">&lt;f&gt;</span>) describes the translation. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">rotate(</span><span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span><span class="Attribute_20_Value_20_Fragment">)</span>, specifies a rotation by <span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span> degrees about the origin of the shapes coordinate system.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">scale(</span><span class="Attribute_20_Value_20_Param">&lt;sx&gt;</span><span class="Attribute_20_Value_20_Fragment"> [</span><span class="Attribute_20_Value_20_Param">&lt;sy&gt;</span><span class="Attribute_20_Value_20_Fragment">])</span>, specifies a scale operation by <span class="Attribute_20_Value_20_Param">sx</span> and <span class="Attribute_20_Value_20_Param">sy</span>. If <span class="Attribute_20_Value_20_Param">&lt;sy&gt;</span> is not provided, it is assumed to be equal to <span class="Attribute_20_Value_20_Param">&lt;sx&gt;</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">skewX(&lt;</span><span class="Attribute_20_Value_20_Param">skew-angle&gt;</span><span class="Attribute_20_Value_20_Fragment">)</span>, specifies a skew transformation by <span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span> degrees along the x-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">skewY(</span><span class="Attribute_20_Value_20_Param">&lt;skew-angle&gt;</span><span class="Attribute_20_Value_20_Fragment">)</span>, specifies a skew transformation by <span class="Attribute_20_Value_20_Param">&lt;rotate-angle&gt;</span> degrees along the y-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">translate(</span><span class="Attribute_20_Value_20_Param">&lt;tx&gt;</span><span class="Attribute_20_Value_20_Fragment"> [</span><span class="Attribute_20_Value_20_Param">&lt;ty&gt;</span><span class="Attribute_20_Value_20_Fragment">])</span>, specifies a translation by <span class="Attribute_20_Value_20_Param">tx</span> and <span class="Attribute_20_Value_20_Param">ty,</span> where tx and ty are lengths (<a href="#datatype-length">18.3.18</a>). If <span class="Attribute_20_Value_20_Param">ty</span> is not provided, it is assumed to be zero.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:transform</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:transform</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_229draw_type"><span style="margin-right:0.127cm;">19.229</span></a><a id="__RefHeading__1417298_253892949"/><a id="attribute-draw_type"/>draw:type</h2><h3 class="Heading_20_3"><a id="a19_229_1General"><span style="margin-right:0.127cm;">19.229.1</span></a><a id="__RefHeading__1417300_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">draw:type</span> attribute specifies a drawing type. </p><h3 class="Heading_20_3"><a id="a19_229_2_draw_connector_"><span style="margin-right:0.127cm;">19.229.2</span></a><a id="__RefHeading__1417302_253892949"/><a id="attribute-draw_type_element-draw_connector"/>&lt;draw:connector&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:type</span> attribute specifies the line or series of lines that connect two glue points.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">curve</span>: a curve connector draws a single curved line between the two glue points of connected objects<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">line</span>: a line connector draws one straight line between the two glue points of connected objects<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">lines</span>: a lines connector leaves two connecting objects with straight lines and connects them with a straight (not necessarily perpendicular) line<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">standard</span>: a standard connector leaves two connecting objects with straight lines and connects them with one or more straight perpendicular lines that do not intersect the connected shapes' bounding boxes<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a> element the default value for this attribute is <span class="Attribute_20_Value">standard</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:type</span> attribute is usable with the following element: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:type</span> attribute are <span class="Attribute_20_Value">standard</span>, <span class="Attribute_20_Value">lines</span>, <span class="Attribute_20_Value">line</span> or <span class="Attribute_20_Value">curve</span>.</p><h3 class="Heading_20_3"><a id="a19_229_3_draw_enhanced-geometry_"><span style="margin-right:0.127cm;">19.229.3</span></a><a id="__RefHeading__1417304_253892949"/><a id="attribute-draw_type_element-draw_enhanced-geometry"/>&lt;draw:enhanced-geometry&gt;</h3><p class="Text_20_body">The <span class="Attribute">draw:type</span> attribute specifies the name of a shape type that is rendering engine dependent. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">non-primitive</span>: no shape type is available.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type string: a rendering engine specific name of a shape.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value of this attribute shall not influence the geometry of the shape.</p><p class="Note"><span class="Note_20_Label">Note:</span> The shape type can be used to offer specialized user interfaces for classes of shapes, like for arrows, smileys, etc.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a> element the default value for this attribute is <span class="Attribute_20_Value">non-primitive</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">draw:type</span> attribute is usable with the following element: <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:type</span> attribute are <span class="Attribute_20_Value">non-primitive</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_230draw_value"><span style="margin-right:0.127cm;">19.230</span></a><a id="__RefHeading__1417306_253892949"/><a id="attribute-draw_value"/>draw:value</h2><p class="Text_20_body">The <span class="Attribute">draw:value</span> attribute specifies the value of a runtime parameter specified by a <span class="Attribute">draw:name</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:value</span> attribute is usable with the following element: <span class="Element">&lt;draw:param&gt;</span> <a href="#element-draw_param">10.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_231draw_z-index"><span style="margin-right:0.127cm;">19.231</span></a><a id="__RefHeading__1417308_253892949"/><a id="attribute-draw_z-index"/>draw:z-index</h2><p class="Text_20_body">The <span class="Attribute">draw:z-index</span> attribute defines a rendering order for shapes in a document instance. Shapes are rendered in the order in which they appear in the document in the absence of this attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:z-index</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:z-index</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_232fo_column-count"><span style="margin-right:0.127cm;">19.232</span></a><a id="__RefHeading__1417310_253892949"/><a id="attribute-fo_column-count"/>fo:column-count</h2><p class="Text_20_body">The <span class="Attribute">fo:column-count</span> attribute specifies the number of columns in a section.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:column-count</span> attribute is usable with the following element: <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:column-count</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_233fo_column-gap"><span style="margin-right:0.127cm;">19.233</span></a><a id="__RefHeading__1417312_253892949"/><a id="attribute-fo_column-gap"/>fo:column-gap</h2><p class="Text_20_body">The <span class="Attribute">fo:column-gap</span> attribute specifies the gap between columns for <span class="Element">&lt;style:columns&gt;</span> elements that do not contain individual <span class="Element">&lt;style:column&gt;</span> elements. </p><p class="Note"><span class="Note_20_Label">Note:</span> This attribute has the same name as an <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> property but it is attached to a different element.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:column-gap</span> attribute does not support <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">percentage</span> values. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:column-gap</span> attribute is usable with the following element: <span class="Element">&lt;style:columns&gt;</span> <a href="#element-style_columns">17.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:column-gap</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_234fo_country"><span style="margin-right:0.127cm;">19.234</span></a><a id="__RefHeading__1417314_253892949"/><a id="attribute-fo_country"/>fo:country</h2><h3 class="Heading_20_3"><a id="a19_234_1_text_alphabetical-index-source_"><span style="margin-right:0.127cm;">19.234.1</span></a><a id="__RefHeading__1417316_253892949"/><a id="attribute-fo_country_element-text_alphabetical-index-source"/>&lt;text:alphabetical-index-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:country</span> attribute specifies the country code used for sorting an alphabetical index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:country</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:country</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h3 class="Heading_20_3"><a id="a19_234_2_text_bibliography-configuration_"><span style="margin-right:0.127cm;">19.234.2</span></a><a id="__RefHeading__1417318_253892949"/><a id="attribute-fo_country_element-text_bibliography-configuration"/>&lt;text:bibliography-configuration&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:country</span> attribute specifies the country code used for sorting a bibliographic index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:country</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:country</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a19_235fo_end-indent"><span style="margin-right:0.127cm;">19.235</span></a><a id="__RefHeading__1417320_253892949"/><a id="attribute-fo_end-indent"/>fo:end-indent</h2><p class="Text_20_body">The <span class="Attribute">fo:end-indent</span> attribute specifies the right space of a column. Together with the <span class="Attribute">fo:start-indent</span> attribute of an immediately adjacent and following column, it establishes the gap between the columns. <a href="#attribute-fo_start-indent">19.245</a></p><p class="Text_20_body">See §7.10.8 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:end-indent</span> attribute does not support <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">percentage</span> values. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0cm</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">fo:end-indent</span> attribute is usable with the following element: <span class="Element">&lt;style:column&gt;</span> <a href="#element-style_column">17.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:end-indent</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_236fo_language"><span style="margin-right:0.127cm;">19.236</span></a><a id="__RefHeading__1417322_253892949"/><a id="attribute-fo_language"/>fo:language</h2><h3 class="Heading_20_3"><a id="a19_236_1General"><span style="margin-right:0.127cm;">19.236.1</span></a><a id="__RefHeading__1417324_253892949"/><a id="DDE_LINK21"/>General</h3><p class="Text_20_body">See §7.9.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. Compared to the XSL language attribute, the value range of this attribute is extended to additional parts of ISO 639. </p><p class="Text_20_body">This attribute may be ignored if it is not specified together with a <span class="Attribute">fo:country</span> attribute.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:language</span> attribute does not support <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">none</span> values. </p><h3 class="Heading_20_3"><a id="a19_236_2_text_alphabetical-index-source_"><span style="margin-right:0.127cm;">19.236.2</span></a><a id="__RefHeading__1417326_253892949"/><a id="attribute-fo_language_element-text_alphabetical-index-source"/>&lt;text:alphabetical-index-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:language</span> attribute specifies the language code used for sorting an alphabetical index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:language</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:language</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h3 class="Heading_20_3"><a id="a19_236_3_text_bibliography-configuration_"><span style="margin-right:0.127cm;">19.236.3</span></a><a id="__RefHeading__1417328_253892949"/><a id="attribute-fo_language_element-text_bibliography-configuration"/>&lt;text:bibliography-configuration&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:language</span> attribute specifies the language code used for sorting a bibliographic index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:language</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:language</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h2 class="Heading_20_2"><a id="a19_237fo_margin-left"><span style="margin-right:0.127cm;">19.237</span></a><a id="__RefHeading__1417330_253892949"/><a id="attribute-fo_margin-left"/>fo:margin-left</h2><p class="Text_20_body">See §7.10.3 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:margin-left</span> attribute specifies the left margins for the text lines of a list item. The attribute has the same meaning as the formatting property attribute <span class="Attribute">fo:margin-left</span>. <a href="#property-fo_margin-left">20.200</a> Its value is only considered for paragraphs inside a list item those paragraph styles do not specify a <span class="Attribute">fo:text-indent</span> attribute or a <span class="Attribute">fo:margin-left</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:margin-left</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:margin-left</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_238fo_max-height"><span style="margin-right:0.127cm;">19.238</span></a><a id="__RefHeading__1417332_253892949"/><a id="attribute-fo_max-height"/>fo:max-height</h2><p class="Text_20_body">See §7.14.6 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:max-height</span> attribute specifies the maximum height of a text box when the minimum height has been set using the <span class="Attribute">fo:min-height</span> attribute. When this maximum value is reached, the text box stops increasing in height. The units of measure for this attribute shall match those used for the corresponding <span class="Attribute">fo:min-height</span> attribute.</p><p class="Text_20_body">If the anchor for the text box is in a table cell, a percentage value is relative to the size of the surrounding table cell. If the anchor for the text box is in a text box, a percentage value is relative to the size of the surrounding text box. In other cases, percentage values are relative to the width or height of the page or window.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:max-height</span> attribute does not support the <span class="Attribute_20_Value">none</span> value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:max-height</span> attribute is usable with the following element: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:max-height</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_239fo_max-width"><span style="margin-right:0.127cm;">19.239</span></a><a id="__RefHeading__1417334_253892949"/><a id="attribute-fo_max-width"/>fo:max-width</h2><p class="Text_20_body">See §7.14.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:max-width</span> attribute specifies the maximum width of a text box when the minimum width have been set using the <span class="Attribute">fo:min-width</span> attribute. When this maximum value is reached, the text box stops increasing in width. The units of measure for this attribute shall match those used for the corresponding <span class="Attribute">fo:min-width</span> attribute.</p><p class="Text_20_body">If the anchor for the text box is in a table cell, a percentage value is relative to the size of the surrounding table cell. If the anchor for the text box is in a text box, a percentage value is relative to the size of the surrounding text box. In other cases, percentage values are relative to the width or height of the page or window.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:max-width</span> attribute is usable with the following element: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:max-width</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_240fo_min-height"><span style="margin-right:0.127cm;">19.240</span></a><a id="__RefHeading__1417336_253892949"/><a id="attribute-fo_min-height"/>fo:min-height</h2><p class="Text_20_body">See §7.14.8 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If set, it overrides the height or width of a text box specified by the <span class="Attribute">svg:height</span> attribute of the surrounding <span class="Element">&lt;draw:frame&gt;</span> element. </p><p class="Text_20_body">If the anchor for a text box is in a table cell, a percentage value is relative to the surrounding table box. If the anchor for the text box is in a text box, a percentage value is relative to the surrounding text box. In other cases, percentage values are relative to the height of the page or window.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:min-height</span> attribute is usable with the following element: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:min-height</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_241fo_min-width"><span style="margin-right:0.127cm;">19.241</span></a><a id="__RefHeading__1417338_253892949"/><a id="attribute-fo_min-width"/>fo:min-width</h2><p class="Text_20_body">See §7.14.9 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If set, it overrides the width of a text box specified by the <span class="Attribute">svg:width</span> attribute of the surrounding <span class="Element">&lt;draw:frame&gt;</span> element. </p><p class="Text_20_body">If the anchor for a text box is in a table cell, a percentage value is relative to the surrounding table box. If the anchor for a text box is in a text box, a percentage value is relative to the surrounding text box. In other cases, percentage values are relative to the height of the page or window.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:min-width</span> attribute is usable with the following element: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:min-width</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_242fo_script"><span style="margin-right:0.127cm;">19.242</span></a><a id="__RefHeading__1417340_253892949"/><a id="attribute-fo_script"/>fo:script</h2><h3 class="Heading_20_3"><a id="a19_242_1General"><span style="margin-right:0.127cm;">19.242.1</span></a><a id="__RefHeading__1417342_253892949"/>General</h3><p class="Text_20_body">See §7.9.3 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">It may be ignored if it is not specified together with a <span class="Attribute">fo:language</span> attribute.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:script</span> attribute does not support <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">none</span> values. </p><h3 class="Heading_20_3"><a id="a19_242_2_text_alphabetical-index-source_"><span style="margin-right:0.127cm;">19.242.2</span></a><a id="__RefHeading__1417344_253892949"/><a id="attribute-fo_script_element-text_alphabetical-index-source"/>&lt;text:alphabetical-index-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:script</span> attribute specifies the script code used for sorting an alphabetical index. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:script</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:script</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h3 class="Heading_20_3"><a id="a19_242_3_text_bibliography-configuration_"><span style="margin-right:0.127cm;">19.242.3</span></a><a id="__RefHeading__1417346_253892949"/><a id="attribute-fo_script_element-text_bibliography-configuration"/>&lt;text:bibliography-configuration&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:script</span> attribute specifies the script code used for sorting a bibliographic index. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:script</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:script</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h2 class="Heading_20_2"><a id="a19_243fo_space-after"><span style="margin-right:0.127cm;">19.243</span></a><a id="__RefHeading__1417348_253892949"/><a id="attribute-fo_space-after"/>fo:space-after</h2><p class="Text_20_body">See §7.10.6 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0cm</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">fo:space-after</span> attribute is usable with the following element: <span class="Element">&lt;style:column&gt;</span> <a href="#element-style_column">17.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:space-after</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_244fo_space-before"><span style="margin-right:0.127cm;">19.244</span></a><a id="__RefHeading__1417350_253892949"/><a id="attribute-fo_space-before"/>fo:space-before</h2><p class="Text_20_body">See §7.10.5 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0cm</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">fo:space-before</span> attribute is usable with the following element: <span class="Element">&lt;style:column&gt;</span> <a href="#element-style_column">17.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:space-before</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_245fo_start-indent"><span style="margin-right:0.127cm;">19.245</span></a><a id="__RefHeading__1417352_253892949"/><a id="attribute-fo_start-indent"/>fo:start-indent</h2><p class="Text_20_body">See §7.10.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0cm</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">fo:start-indent</span> attribute is usable with the following element: <span class="Element">&lt;style:column&gt;</span> <a href="#element-style_column">17.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:start-indent</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_246fo_text-indent"><span style="margin-right:0.127cm;">19.246</span></a><a id="__RefHeading__1417354_253892949"/><a id="attribute-fo_text-indent"/>fo:text-indent</h2><p class="Text_20_body">The <span class="Attribute">fo:text-indent</span> attribute specifies the indent for the text lines of a list item. The attribute has the same meaning as the formatting property attribute <span class="Attribute">fo:text-indent</span>. See <a href="#property-fo_text-indent">20.218</a> It is used for paragraphs inside list items whose paragraph styles do not specify an <span class="Attribute">fo:text-indent</span> or <span class="Attribute">fo:margin-left</span> attribute. </p><p class="Text_20_body">The value <span class="Attribute">fo:text-indent</span> + <span class="Attribute">fo:margin-left</span> specifies the indent of the first text line of the list item. This position is also the alignment position for the list label, because the value of <span class="Attribute">text:min-label-width</span> is treated as 0. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-indent</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:text-indent</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_247form_allow-deletes"><span style="margin-right:0.127cm;">19.247</span></a><a id="__RefHeading__1417356_253892949"/><a id="attribute-form_allow-deletes"/>form:allow-deletes</h2><p class="Text_20_body">The <span class="Attribute">form:allow-deletes</span> attribute specifies whether data records can be deleted by a form. It applies only if a form is data-aware.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:allow-deletes</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: records cannot be deleted by a form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: records can be deleted by a form.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:allow-deletes</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:allow-deletes</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_248form_allow-inserts"><span style="margin-right:0.127cm;">19.248</span></a><a id="__RefHeading__1417358_253892949"/><a id="attribute-form_allow-inserts"/>form:allow-inserts</h2><p class="Text_20_body">The <span class="Attribute">form:allow-inserts</span> attribute specifies whether new data records can be inserted by a form. It applies only if the form is data-aware.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:allow-inserts</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: records cannot be inserted by a form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: records can be inserted by a form.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:allow-inserts</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:allow-inserts</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_249form_allow-updates"><span style="margin-right:0.127cm;">19.249</span></a><a id="__RefHeading__1417360_253892949"/><a id="attribute-form_allow-updates"/>form:allow-updates</h2><p class="Text_20_body">The <span class="Attribute">form:allow-updates</span> attribute specifies whether data records in the form can be updated. It applies only if the form is data-aware.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:allow-updates</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: records cannot be updated by a form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: records can be updated by a form.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:allow-updates</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:allow-updates</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_250form_apply-design-mode"><span style="margin-right:0.127cm;">19.250</span></a><a id="__RefHeading__1417362_253892949"/><a id="attribute-form_apply-design-mode"/>form:apply-design-mode</h2><p class="Text_20_body">The <span class="Attribute">form:apply-design-mode</span> attribute specifies whether forms are presented in editable or non-editable state.</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: forms in document presented in completed state <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: forms in document presented in editable state <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:apply-design-mode</span> attribute is usable with the following element: <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:apply-design-mode</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_251form_apply-filter"><span style="margin-right:0.127cm;">19.251</span></a><a id="__RefHeading__1417364_253892949"/><a id="attribute-form_apply-filter"/>form:apply-filter</h2><p class="Text_20_body">The <span class="Attribute">form:apply-filter</span> attribute specifies whether the filter clause specified by the <span class="Attribute">form:filter</span> attribute is applied to the SQL command constituting the form's result set. <a href="#attribute-form_filter">19.273</a></p><p class="Text_20_body">The defined values for the <span class="Attribute">form:apply-filter</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the filter clause specified by the <span class="Attribute">form:filter</span> attribute is not applied to the SQL command constituting the form's result set.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the filter clause specified by the <span class="Attribute">form:filter</span> attribute is applied to the SQL command constituting the form's result set.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:apply-filter</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:apply-filter</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_252form_auto-complete"><span style="margin-right:0.127cm;">19.252</span></a><a id="__RefHeading__1417366_253892949"/><a id="attribute-form_auto-complete"/>form:auto-complete</h2><p class="Text_20_body">The <span class="Attribute">form:auto-complete</span> attribute specifies whether, when the user enters text in the combobox that matches the beginning of a list item in the combobox, the consumer completes the text with the matched item. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:auto-complete</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: completion of text is not enabled.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: completion of text is enabled.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:auto-complete</span> attribute is usable with the following element: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:auto-complete</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_253form_automatic-focus"><span style="margin-right:0.127cm;">19.253</span></a><a id="__RefHeading__1417368_253892949"/><a id="attribute-form_automatic-focus"/>form:automatic-focus</h2><p class="Text_20_body">The <span class="Attribute">form:automatic-focus</span> attribute specifies whether the consumer loading the document should set the focus to a form control.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:automatic-focus</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the consumer does not set the focus to a form control, but to the document view. In this case, the user can start editing the document content. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the consumer sets the focus to a form control after loading the document. In this case, the user can immediately start editing the form control content. <span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> Which form control is chosen to be focused is not defined. It may be the first control in the logical order defined by the <span class="Element">&lt;</span><span class="Element">office:forms</span><span class="Element">&gt;</span> elements and its sub elements, it may be the top-most form control of the document view, or any other control. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:automatic-focus</span> attribute is usable with the following element: <span class="Element">&lt;office:forms&gt;</span> <a href="#element-office_forms">13.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:automatic-focus</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_254form_bound-column"><span style="margin-right:0.127cm;">19.254</span></a><a id="__RefHeading__1417370_253892949"/><a id="attribute-form_bound-column"/>form:bound-column</h2><p class="Text_20_body">The <span class="Attribute">form:bound-column</span> attribute specifies the column values of the list source result set that are used to fill the data field values. </p><p class="Text_20_body">The <span class="Attribute">form:list-source</span> and <span class="Attribute">form:list-source-type</span> attributes together define an SQL command to execute against the database to which the control's form is bound. The result set of the execution of this SQL command is the list source result set. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:bound-column</span> attribute is usable with the following element: <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:bound-column</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_255form_button-type"><span style="margin-right:0.127cm;">19.255</span></a><a id="__RefHeading__1417372_253892949"/><a id="attribute-form_button-type"/>form:button-type</h2><p class="Text_20_body">The <span class="Attribute">form:button-type</span> attribute specifies the type of a button. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:button-type</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">push</span>: pressing the button does not perform any action by default. A user can add scripts to a button and the script will run when the button is pressed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">reset</span>: pressing the button resets every control in the form to its default value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">submit</span>: pressing the button submits the form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">url</span>: pressing the button loads the IRI that is specified in the <span class="Attribute">xlink:href</span> attribute.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">push</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:button-type</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a> and <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:button-type</span> attribute are <span class="Attribute_20_Value">submit</span>, <span class="Attribute_20_Value">reset</span>, <span class="Attribute_20_Value">push</span> or <span class="Attribute_20_Value">url</span>.</p><h2 class="Heading_20_2"><a id="a19_256form_command"><span style="margin-right:0.127cm;">19.256</span></a><a id="__RefHeading__1417374_253892949"/><a id="attribute-form_command"/>form:command</h2><p class="Text_20_body">The <span class="Attribute">form:command</span> attribute specifies a command to execute on a data source.</p><p class="Text_20_body">The value is interpreted differently, depending to the value of the <span class="Attribute">form:command-type</span> attribute of the form. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:command</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:command</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_257form_command-type"><span style="margin-right:0.127cm;">19.257</span></a><a id="__RefHeading__1417376_253892949"/><a id="attribute-form_command-type"/>form:command-type</h2><p class="Text_20_body">The <span class="Attribute">form:command-type</span> attribute specifies the type of command to execute on a data source. </p><p class="Text_20_body">The defined values of the <span class="Attribute">form:command-type</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">command</span>: the command contains an SQL statement. The form executes the SQL statement.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">query</span>: the command contains the name of query. The form retrieves the query and executes its SQL statement.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">table</span>: the command contains a table name. The form executes an SQL statement that retrieves all of the data in the table.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note: </span>The attribute value <span class="Attribute_20_Value">query</span> is only meaningful if the <span class="Attribute">form:datasource</span> attribute specifies a data source name or a database front-end document. .</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">command</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:command-type</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:command-type</span> attribute are <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">query</span> or <span class="Attribute_20_Value">command</span>.</p><h2 class="Heading_20_2"><a id="a19_258form_control-implementation"><span style="margin-right:0.127cm;">19.258</span></a><a id="__RefHeading__1417378_253892949"/><a id="attribute-form_control-implementation"/>form:control-implementation</h2><p class="Text_20_body">The <span class="Attribute">form:control-implementation</span> attribute specifies a \rendition or implementation of a control that should be created. If the consumer supports the form element this attribute is used with, but does not support the specific concrete rendition or implementation, the consumer shall ignore the <span class="Attribute">form:control-implementation</span> attribute and use its own rendition of the form element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:control-implementation</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:control-implementation</span> attribute has the data type <span class="Datatype">namespacedToken</span> <a href="#datatype-namespacedToken">18.3.19</a>.</p><h2 class="Heading_20_2"><a id="a19_259form_convert-empty-to-null"><span style="margin-right:0.127cm;">19.259</span></a><a id="__RefHeading__1417380_253892949"/><a id="attribute-form_convert-empty-to-null"/>form:convert-empty-to-null</h2><p class="Text_20_body">The <span class="Attribute">form:convert-empty-to-null</span> attribute specifies whether empty current values are treated as NULL.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:convert-empty-to-null</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: an empty string in the control is treated as an empty string.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: an empty string in the control is treated as a NULL value. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:convert-empty-to-null</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:convert-empty-to-null</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_260form_current-selected"><span style="margin-right:0.127cm;">19.260</span></a><a id="__RefHeading__1417382_253892949"/><a id="attribute-form_current-selected"/>form:current-selected</h2><p class="Text_20_body">The <span class="Attribute">form:current-selected</span> attribute specifies the state of a radio button or option element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:current-selected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: radio button or option element is not selected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: radio button or option element is selected. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:current-selected</span> attribute is usable with the following elements: <span class="Element">&lt;form:option&gt;</span> <a href="#element-form_option">13.5.14</a> and <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:current-selected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_261form_current-state"><span style="margin-right:0.127cm;">19.261</span></a><a id="__RefHeading__1417384_253892949"/><a id="attribute-form_current-state"/>form:current-state</h2><p class="Text_20_body">The <span class="Attribute">form:current-state</span> attribute specifies the state of a check box control.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:current-state</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">checked</span>: The check box is checked. The value of the control is submitted with the form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unchecked</span>: The check box is not checked.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unknown</span>: This value is available only if the <span class="Attribute">form:is-tristate</span> attribute for a <span class="Element">&lt;form:checkbox&gt;</span> element is true. It indicates that a check box control is neither checked nor unchecked.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:current-state</span> attribute is usable with the following element: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:current-state</span> attribute are <span class="Attribute_20_Value">unchecked</span>, <span class="Attribute_20_Value">checked</span> or <span class="Attribute_20_Value">unknown</span>.</p><h2 class="Heading_20_2"><a id="a19_262form_current-value"><span style="margin-right:0.127cm;">19.262</span></a><a id="__RefHeading__1417386_253892949"/><a id="attribute-form_current-value"/>form:current-value</h2><p class="Text_20_body">The <span class="Attribute">form:current-value</span> attribute specifies the current status of an input control. It overrides the value of a <span class="Attribute">form:value</span> attribute, if one is present.</p><p class="Text_20_body">The defined value types for <span class="Attribute">form:current-value</span> attribute values are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>: <span class="Datatype">string</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>: <span class="Datatype">date</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>: <span class="Datatype">string</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>: <span class="Datatype">string</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>: <span class="Datatype">double</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>: <span class="Datatype">string</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>: <span class="Datatype">string</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>: <span class="Datatype">time</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:current-value</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:current-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_263form_data-field"><span style="margin-right:0.127cm;">19.263</span></a><a id="__RefHeading__1417388_253892949"/><a id="attribute-form_data-field"/>form:data-field</h2><p class="Text_20_body">The <span class="Attribute">form:data-field</span> attribute specifies the name of a column in the result set defined by a (data-aware) form. A control interchanges content with its column when: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>the current row of a form changes, the control is initialized with the value from its column. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>the user changes the content of a control, this changed value is written back to its column.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> consumers may delay this write-back, for instance until the control loses the focus, instead of updating the column value with every change in the control. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:data-field</span> attribute is usable with the following elements: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:data-field</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_264form_datasource"><span style="margin-right:0.127cm;">19.264</span></a><a id="__RefHeading__1417390_253892949"/><a id="attribute-form_datasource"/>form:datasource</h2><p class="Text_20_body">The <span class="Attribute">form:datasource</span> attribute specifies the name of a data source to use for a form.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:datasource</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>An IRI specifying a database connection.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A data source name that a consumer can use to establish a database connection.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The IRI of an OpenDocument database front-end document.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note</span>: The data source name is a programmatic name for a database front end document which allows it to reference data sources regardless of their real location. The mapping from data source names to specific instances of database front end documents is implementation-defined. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:datasource</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:datasource</span> attribute are a value of type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_265form_default-button"><span style="margin-right:0.127cm;">19.265</span></a><a id="__RefHeading__1417392_253892949"/><a id="attribute-form_default-button"/>form:default-button</h2><p class="Text_20_body">The <span class="Attribute">form:default-button</span> attribute specifies whether a button is the default button on a form. If a user clicks the default button or presses Return while an input control is focused, the consumer takes the same action.</p><p class="Text_20_body">If multiple buttons with <span class="Attribute">form:default-button</span> attributes with values of true are present in a form, it is implementation-defined which button is the default for the form.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:default-button</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: button is not the default button for a form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: button is the default button for a form. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:default-button</span> attribute is usable with the following element: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:default-button</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_266form_delay-for-repeat"><span style="margin-right:0.127cm;">19.266</span></a><a id="__RefHeading__1417394_253892949"/><a id="attribute-form_delay-for-repeat"/>form:delay-for-repeat</h2><p class="Text_20_body">The <span class="Attribute">form:delay-for-repeat</span> attribute specifies a time-out to be used before a pressed mouse button results in repeating an action. The <span class="Attribute">form:delay-for-repeat</span> attribute is ignored unless a <span class="Attribute">form:repeat</span> attribute is present, and evaluates to <span class="Attribute_20_Value">true</span>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">PT0.050S</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:delay-for-repeat</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:delay-for-repeat</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_267form_detail-fields"><span style="margin-right:0.127cm;">19.267</span></a><a id="__RefHeading__1417396_253892949"/><a id="attribute-form_detail-fields"/>form:detail-fields</h2><p class="Text_20_body">The <span class="Attribute">form:detail-fields</span> attribute specifies the names of the columns in contained forms that are related to columns in the containing form. The columns are used as parameters in the command for the contained form to retrieve the details from its containing form. </p><p class="Text_20_body">This attribute contains a comma “,” (U+002C, COMMA) separated list of field names.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:detail-fields</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:detail-fields</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_268form_disabled"><span style="margin-right:0.127cm;">19.268</span></a><a id="__RefHeading__1417398_253892949"/><a id="attribute-form_disabled"/>form:disabled</h2><p class="Text_20_body">The <span class="Attribute">form:disabled</span> attribute specifies whether a control can accept user input. </p><p class="Text_20_body">Controls that are disabled are not included in the tabbing navigation sequence and cannot be focused.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:disabled</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a control cannot accept user input.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a control can accept user input. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:disabled</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:disabled</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_269form_dropdown"><span style="margin-right:0.127cm;">19.269</span></a><a id="__RefHeading__1417400_253892949"/><a id="attribute-form_dropdown"/>form:dropdown</h2><p class="Text_20_body">The <span class="Attribute">form:dropdown</span> attribute specifies whether a list in a <span class="Element">&lt;form:combobox&gt;</span> or <span class="Element">&lt;form:listbox&gt;</span> element is always visible or is only visible when the user clicks the drop-down button. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:dropdown</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: list is visible only when a user selects a drop-down button.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: list is always visible. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:dropdown</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a> and <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:dropdown</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_270form_echo-char"><span style="margin-right:0.127cm;">19.270</span></a><a id="__RefHeading__1417402_253892949"/><a id="attribute-form_echo-char"/>form:echo-char</h2><p class="Text_20_body">The <span class="Attribute">form:echo-char</span> attribute specifies the character that a form uses to mask text that a user inputs in a password control.</p><p class="Default_20_Value_borderStart">The default value for this attribute is "*" (U+002A, ASTERISK).</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:echo-char</span> attribute is usable with the following element: <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:echo-char</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a19_271form_enctype"><span style="margin-right:0.127cm;">19.271</span></a><a id="__RefHeading__1417404_253892949"/><a id="attribute-form_enctype"/>form:enctype</h2><p class="Text_20_body">The <span class="Attribute">form:enctype</span> attribute, when the value of the <span class="Attribute">form:method</span> attribute is <span class="Attribute_20_Value">post</span>, specifies the content type used to submit the form to the server.  Other MIME types may be acceptable. See §17.3.4 of <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">application/x-www-form-urlencoded</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:enctype</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:enctype</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_272form_escape-processing"><span style="margin-right:0.127cm;">19.272</span></a><a id="__RefHeading__1417406_253892949"/><a id="attribute-form_escape-processing"/>form:escape-processing</h2><p class="Text_20_body">The <span class="Attribute">form:escape-processing</span> attribute, when the value of the <span class="Attribute">form:command-type</span> attribute is <span class="Attribute_20_Value">command</span>, specifies whether the consumer processes the command before passing it to a database driver.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:escape-processing</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumer does not process commands before passing them to a database driver.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumer does process commands before passing them to a database driver. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:escape-processing</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:escape-processing</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_273form_filter"><span style="margin-right:0.127cm;">19.273</span></a><a id="__RefHeading__1417408_253892949"/><a id="attribute-form_filter"/>form:filter</h2><p class="Text_20_body">The <span class="Attribute">form:filter</span> attribute specifies a filter for the SQL clause determined by the <span class="Attribute">form:command-type</span> and <span class="Attribute">form:command</span> attributes. If that SQL statement contains a filter (WHERE clause), the filter specified by the attribute value is conjunctively added to the existing filter.</p><p class="Text_20_body">The filter is only applied if the <span class="Attribute">form:apply-filter</span> attribute has the value true. <a href="#attribute-form_apply-filter">19.251</a>.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> This allows OpenDocument consumers to toggle a filter on and off without losing the content of the <span class="Attribute">form:filter</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:filter</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:filter</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_274form_focus-on-click"><span style="margin-right:0.127cm;">19.274</span></a><a id="__RefHeading__1417410_253892949"/><a id="attribute-form_focus-on-click"/>form:focus-on-click</h2><p class="Text_20_body">The <span class="Attribute">form:focus-on-click</span> attribute specifies if a <span class="Element">&lt;form:button&gt;</span> element is given the focus in a form when the form button control for that element is operated.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:focus-on-click</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: element not given focus.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: element given focus.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:focus-on-click</span> attribute is usable with the following element: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:focus-on-click</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_275form_for"><span style="margin-right:0.127cm;">19.275</span></a><a id="__RefHeading__1417412_253892949"/><a id="attribute-form_for"/>form:for</h2><p class="Text_20_body">The <span class="Attribute">form:for</span> attribute specifies a comma “,” (U+002C, COMMA) separated list of <span class="Attribute">xml:id</span>s of control elements that are the targets of the elements where this attribute appears. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:for</span> attribute is usable with the following elements: <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a> and <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:for</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_276form_id__deprecated_"><span style="margin-right:0.127cm;">19.276</span></a><a id="__RefHeading__1417414_253892949"/><a id="attribute-form_id"/>form:id (deprecated) </h2><p class="Text_20_body">The <span class="Attribute">form:id</span> attribute specifies an identifier for a control element.</p><p class="Text_20_body">OpenDocument consumers shall ignore a <span class="Attribute">form:id</span> attribute if it occurs on an element with an <span class="Attribute">xml:id</span> attribute value. </p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">form:id</span> attributes for elements in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body"> The value of a <span class="Attribute">form:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same element. </p><p class="Text_20_body">The <span class="Attribute">form:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:id</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_277form_ignore-result"><span style="margin-right:0.127cm;">19.277</span></a><a id="__RefHeading__1417416_253892949"/><a id="attribute-form_ignore-result"/>form:ignore-result</h2><p class="Text_20_body">The <span class="Attribute">form:ignore-result</span> attribute specifies whether to discard all results that are retrieved from an underlying data source. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:ignore-result</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data from query of data source not discarded.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data from query of data source is discarded. Only new data can be inserted into a data source.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:ignore-result</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:ignore-result</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_278form_image-align"><span style="margin-right:0.127cm;">19.278</span></a><a id="__RefHeading__1417418_253892949"/><a id="attribute-form_image-align"/>form:image-align</h2><p class="Text_20_body">The <span class="Attribute">form:image-align</span> attribute specifies which border (<span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">end</span>) or axis (<span class="Attribute_20_Value">center</span>) of an image and a text are to be aligned.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:image-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: image and text are centered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">end</span>: image and text are aligned on the end of the image.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">start</span>: image and text are aligned on the start of the image.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If a <span class="Attribute">form:image-align</span> attribute is not present, it is assumed to be <span class="Attribute_20_Value">center</span>. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">center</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:image-align</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a> and <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:image-align</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">end</span>.</p><h2 class="Heading_20_2"><a id="a19_279form_image-data"><span style="margin-right:0.127cm;">19.279</span></a><a id="__RefHeading__1417420_253892949"/><a id="attribute-form_image-data"/>form:image-data</h2><p class="Text_20_body">The <span class="Attribute">form:image-data</span> attribute specifies the location of a file containing image data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:image-data</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a> and <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:image-data</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h2 class="Heading_20_2"><a id="a19_280form_image-position"><span style="margin-right:0.127cm;">19.280</span></a><a id="__RefHeading__1417422_253892949"/><a id="attribute-form_image-position"/>form:image-position</h2><p class="Text_20_body">If the <span class="Attribute">form:image-position</span> attribute specifies the location of an image relative to the text of a control. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:image-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: image is placed below the text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: image centered relative to the text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">end</span>: image is placed after the text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">start</span>: image is placed before the text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: image is placed above the text.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">center</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:image-position</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a> and <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:image-position</span> attribute are <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">end</span>, <span class="Attribute_20_Value">top</span> or <span class="Attribute_20_Value">bottom</span>.</p><h2 class="Heading_20_2"><a id="a19_281form_is-tristate"><span style="margin-right:0.127cm;">19.281</span></a><a id="__RefHeading__1417424_253892949"/><a id="attribute-form_is-tristate"/>form:is-tristate</h2><p class="Text_20_body">The <span class="Attribute">form:is-tristate</span> attribute specifies a check box can have the values of <span class="Attribute_20_Value">checked</span>, <span class="Attribute_20_Value">unchecked</span> and <span class="Attribute_20_Value">unknown</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:is-tristate</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a check box can only have the values of checked and unchecked.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a check box can have the values of checked, unchecked and unknown. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:is-tristate</span> attribute is usable with the following element: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:is-tristate</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_282form_label"><span style="margin-right:0.127cm;">19.282</span></a><a id="__RefHeading__1417426_253892949"/><a id="attribute-form_label"/>form:label</h2><p class="Text_20_body">The <span class="Attribute">form:label</span> attribute specifies the text for a control.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:label</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:item&gt;</span> <a href="#element-form_item">13.5.12</a>, <span class="Element">&lt;form:option&gt;</span> <a href="#element-form_option">13.5.14</a> and <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:label</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_283form_linked-cell"><span style="margin-right:0.127cm;">19.283</span></a><a id="__RefHeading__1417428_253892949"/><a id="attribute-form_linked-cell"/>form:linked-cell</h2><p class="Text_20_body">The <span class="Attribute">form:linked-cell</span> attribute specifies a table cell to which the form control content should be linked. Linking means that the cell value and control content are equal at all times.</p><p class="Text_20_body">The table cell to link the control to can be specified as a <span class="Keyword">cellAddress</span>, or as a named cell range. In the latter case, if the named range contains more than one cell, the cell in the first row and first column of the range is linked to the form control.</p><p class="Text_20_body">If the attribute value matches the name of a named range as well as a cell address, it is interpreted as the name of a named range. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:linked-cell</span> attribute is usable with the following elements: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:linked-cell</span> attribute are a value of type <span class="Datatype">cellAddress</span> <a href="#datatype-cellAddress">18.3.4</a> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_284form_list-linkage-type"><span style="margin-right:0.127cm;">19.284</span></a><a id="__RefHeading__1417430_253892949"/><a id="attribute-form_list-linkage-type"/>form:list-linkage-type</h2><p class="Text_20_body">The <span class="Attribute">form:list-linkage-type</span> attribute specifies how a control defined by a <span class="Element">&lt;form:listbox&gt;</span> elements interacts with a linked table cell.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:list-linkage-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">selection</span>: The text selected in the control is propagated to its linked cell. If text is entered into a cell linked to a <span class="Element">&lt;form:listbox&gt;</span> element, the list item whose label matches the cell text is selected, or all items are deselected if no such item exists.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">selection-indices</span>: If a list item is selected in the control, its index value on a 1-based index is propagated to its its linked cell. If the value in the linked cell changes, the control should select the list item with the index described by the cell value, or deselect all items if the cell value cannot be interpreted as integer value, or does not specify a valid list index item.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:list-linkage-type</span> attribute is usable with the following element: <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:list-linkage-type</span> attribute are <span class="Attribute_20_Value">selection</span> or <span class="Attribute_20_Value">selection-indices</span>.</p><h2 class="Heading_20_2"><a id="a19_285form_list-source"><span style="margin-right:0.127cm;">19.285</span></a><a id="__RefHeading__1417432_253892949"/><a id="attribute-form_list-source"/>form:list-source</h2><p class="Text_20_body">The <span class="Attribute">form:list-source</span> attribute specifies a source for the list entries in a list or combo box.</p><p class="Text_20_body">Obtaining those list entries is may be a multi-step process. The process depends upon the value of the <span class="Attribute">form:list-source-type</span> attribute on the same element.</p><p class="Text_20_body">If the <span class="Attribute">form:list-source-type</span> attribute has the value <span class="Attribute_20_Value">value-list</span>, the content of the <span class="Attribute">form:list-source</span> attribute is ignored.</p><p class="Text_20_body">In all other cases, the content of the <span class="Attribute">form:list-source</span> attribute is resolved relative to a database connection or database front-end document. The <span class="Element">&lt;form:form&gt;</span> element containing the control defines this database connection or document by its <span class="Attribute">form:datasource</span> attribute.</p><p class="Text_20_body">For retrieving the list entries depending on the <span class="Attribute">form:list-source-type</span> attribute, the following algorithms are to be used: </p><p class="Text_20_body">If the <span class="Attribute">form:list-source-type</span> attribute has the value <span class="Attribute_20_Value">table-fields</span>, the <span class="Attribute">form:list-source</span> attribute specifies the name of a database table. The names of the columns of this table, in the order as returned by the database driver, are used as list entries.</p><p class="Text_20_body">For all other values of <span class="Attribute">form:list-source-type</span>, the value of the <span class="Attribute">form:list-source</span> attribute is used to create a result set. For this, the first step is to transform the value of the <span class="Attribute">form:list-source</span> attribute into an SQL command as follows: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sql</span>, <span class="Attribute_20_Value">sql-pass-through</span>: The SQL command is the content of the <span class="Attribute">form:list-source</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">query</span>: The <span class="Attribute">form:list-source</span> attribute specifies the name of a query object in the database, whose underlying SQL command is to be used. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">table</span>: The <span class="Attribute">form:list-source</span> attribute specifies the name of a database table, and the SQL command is the default SQL command to select all data from that table. This is "SELECT * FROM &lt;table_name&gt;", but consumers may find it necessary to add escape characters to a table name, if required by the database driver.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">In a next step, the obtained SQL command is executed against the database. If the <span class="Attribute">form:list-source-type</span> attribute has the value <span class="Attribute_20_Value">sql-pass-through</span> or <span class="Attribute_20_Value">query</span>, and if the <span class="Attribute">db:escape-processing</span> attribute of the referred query has the value <span class="Attribute_20_Value">false</span>, then the SQL command shall be passed directly to the database driver, without being interpreted and modified or normalized by the consumer.</p><p class="Text_20_body">This execution produces a two-dimensional homogeneous result set, whose first-column-values form the entry list to be used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:list-source</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a> and <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:list-source</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_286form_list-source-type"><span style="margin-right:0.127cm;">19.286</span></a><a id="__RefHeading__1417434_253892949"/><a id="attribute-form_list-source-type"/>form:list-source-type</h2><p class="Text_20_body">The <span class="Attribute">form:list-source-type</span> attribute specifies how to populate the entry list in a combo box or list box control.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:list-source-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">query</span>: evaluated against the database front-end document or database connection defined by the <span class="Element">&lt;form:form&gt;</span> element which the control belongs to. The <span class="Attribute">form:list-source</span> attribute defines that evaluation. <a href="#attribute-form_list-source">19.285</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sql</span>: evaluated against the database front-end document or database connection defined by the <span class="Element">&lt;form:form&gt;</span> element which the control belongs to. The <span class="Attribute">form:list-source</span> attribute defines that evaluation. <a href="#attribute-form_list-source">19.285</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sql-pass-through</span>: evaluated against the database front-end document or database connection defined by the <span class="Element">&lt;form:form&gt;</span> element which the control belongs to. The <span class="Attribute">form:list-source</span> attribute defines that evaluation. <a href="#attribute-form_list-source">19.285</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">table</span>: evaluated against the database front-end document or database connection defined by the <span class="Element">&lt;form:form&gt;</span> element which the control belongs to. The <span class="Attribute">form:list-source</span> attribute defines that evaluation. <a href="#attribute-form_list-source">19.285</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">table-fields</span>: evaluated against the database front-end document or database connection defined by the <span class="Element">&lt;form:form&gt;</span> element which the control belongs to. The <span class="Attribute">form:list-source</span> attribute defines that evaluation. <a href="#attribute-form_list-source">19.285</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value-list</span>: entry list populated by values specified by the <span class="Attribute">form:value</span> attributes of <span class="Element">&lt;form:option&gt;</span> child elements. This value is applicable to list boxes only. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:list-source-type</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a> and <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:list-source-type</span> attribute are <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">query</span>, <span class="Attribute_20_Value">sql</span>, <span class="Attribute_20_Value">sql-pass-through</span>, <span class="Attribute_20_Value">value-list</span> or <span class="Attribute_20_Value">table-fields</span>.</p><h2 class="Heading_20_2"><a id="a19_287form_master-fields"><span style="margin-right:0.127cm;">19.287</span></a><a id="__RefHeading__1417436_253892949"/><a id="attribute-form_master-fields"/>form:master-fields</h2><p class="Text_20_body">The <span class="Attribute">form:master-fields</span> attribute specifies the names of the columns in the result set represented by a parent form. Each time the parent form changes the current row, the nested form queries the database again based on the values of the master fields. </p><p class="Text_20_body">The attribute contains a comma “,” (U+002C, COMMA) separated list of field names.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:master-fields</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:master-fields</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_288form_max-length"><span style="margin-right:0.127cm;">19.288</span></a><a id="__RefHeading__1417438_253892949"/><a id="attribute-form_max-length"/>form:max-length</h2><p class="Text_20_body">The <span class="Attribute">form:max-length</span> attribute specifies the maximum number of characters that a user can enter in an input control. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:max-length</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:max-length</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_289form_max-value"><span style="margin-right:0.127cm;">19.289</span></a><a id="__RefHeading__1417440_253892949"/><a id="attribute-form_max-value"/>form:max-value</h2><h3 class="Heading_20_3"><a id="a19_289_1General"><span style="margin-right:0.127cm;">19.289.1</span></a><a id="__RefHeading__1718308_1219268628"/>General</h3><p class="Text_20_body">The <span class="Attribute">form:max-value</span> attribute specifies the maximum value that a user can enter.</p><h3 class="Heading_20_3"><a id="a19_289_2_form_date_"><span style="margin-right:0.127cm;">19.289.2</span></a><a id="__RefHeading__1718310_1219268628"/><a id="attribute-form_max-value_element-form_date"/>&lt;form:date&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:max-value</span> attribute is <span class="Datatype">date</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:max-value</span> attribute is usable with the following element: <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:max-value</span> attribute has the data type <span class="Datatype">date</span> <a href="#datatype-date">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_289_3_form_formatted-text_"><span style="margin-right:0.127cm;">19.289.3</span></a><a id="__RefHeading__1718312_1219268628"/><a id="attribute-form_max-value_element-form_formatted-text"/>&lt;form:formatted-text&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:max-value</span> attribute is <span class="Datatype">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:max-value</span> attribute is usable with the following element: <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:max-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_289_4_form_number__and__form_value-range_"><span style="margin-right:0.127cm;">19.289.4</span></a><a id="__RefHeading__1718314_1219268628"/><a id="attribute-form_max-value_element-form_value-range"/><a id="attribute-form_max-value_element-form_number"/>&lt;form:number&gt; and &lt;form:value-range&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:max-value</span> attribute is <span class="Datatype">double</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:max-value</span> attribute is usable with the following elements: <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:max-value</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_289_5_form_time_"><span style="margin-right:0.127cm;">19.289.5</span></a><a id="__RefHeading__1718316_1219268628"/><a id="attribute-form_max-value_element-form_time"/>&lt;form:time&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:max-value</span> attribute is <span class="Datatype">time</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:max-value</span> attribute is usable with the following element: <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:max-value</span> attribute has the data type <span class="Datatype">time</span> <a href="#datatype-time">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_290form_min-value"><span style="margin-right:0.127cm;">19.290</span></a><a id="__RefHeading__1417442_253892949"/><a id="attribute-form_min-value"/>form:min-value</h2><h3 class="Heading_20_3"><a id="a19_290_1General"><span style="margin-right:0.127cm;">19.290.1</span></a><a id="__RefHeading__1718318_1219268628"/>General</h3><p class="Text_20_body">The <span class="Attribute">form:min-value</span> attribute specifies the minimum value that a user can enter.</p><h3 class="Heading_20_3"><a id="a19_290_2_form_date_"><span style="margin-right:0.127cm;">19.290.2</span></a><a id="__RefHeading__1718320_1219268628"/><a id="attribute-form_min-value_element-form_date"/>&lt;form:date&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:min-value</span> attribute is <span class="Datatype">date</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:min-value</span> attribute is usable with the following element: <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:min-value</span> attribute has the data type <span class="Datatype">date</span> <a href="#datatype-date">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_290_3_form_formatted-text_"><span style="margin-right:0.127cm;">19.290.3</span></a><a id="__RefHeading__1718322_1219268628"/><a id="attribute-form_min-value_element-form_formatted-text"/>&lt;form:formatted-text&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:min-value</span> attribute is <span class="Datatype">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:min-value</span> attribute is usable with the following element: <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:min-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_290_4_form_number__and__form_value-range_"><span style="margin-right:0.127cm;">19.290.4</span></a><a id="__RefHeading__1718324_1219268628"/><a id="attribute-form_min-value_element-form_number"/><a id="attribute-form_min-value_element-form_value-range"/>&lt;form:number&gt; and &lt;form:value-range&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:min-value</span> attribute is <span class="Datatype">double</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:min-value</span> attribute is usable with the following elements: <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:min-value</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_290_5_form_time_"><span style="margin-right:0.127cm;">19.290.5</span></a><a id="__RefHeading__1718326_1219268628"/><a id="attribute-form_min-value_element-form_time"/>&lt;form:time&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:min-value</span> attribute is <span class="Datatype">time</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:min-value</span> attribute is usable with the following element: <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:min-value</span> attribute has the data type <span class="Datatype">time</span> <a href="#datatype-time">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_291form_method"><span style="margin-right:0.127cm;">19.291</span></a><a id="__RefHeading__1417444_253892949"/><a id="attribute-form_method"/>form:method</h2><p class="Text_20_body">The <span class="Attribute">form:method</span> attribute specifies the HTTP method used to submit data in a form to a server. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:list-source-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">get</span>: HTTP get method.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">ost</span>: HTTP post method.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type string<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">These values are not case sensitive.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">get</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:method</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:method</span> attribute are <span class="Attribute_20_Value">get</span>, <span class="Attribute_20_Value">post</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_292form_multi-line"><span style="margin-right:0.127cm;">19.292</span></a><a id="__RefHeading__1417446_253892949"/><a id="attribute-form_multi-line"/>form:multi-line</h2><p class="Text_20_body">The <span class="Attribute">form:multi-line</span> attribute specifies whether a label is displayed on multiple lines.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:multi-line</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: label is not displayed over multiple lines.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: label is displayed over multiple lines.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:multi-line</span> attribute is usable with the following element: <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:multi-line</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_293form_multiple"><span style="margin-right:0.127cm;">19.293</span></a><a id="__RefHeading__1417448_253892949"/><a id="attribute-form_multiple"/>form:multiple</h2><p class="Text_20_body">The <span class="Attribute">form:multiple</span> attribute specifies whether a user can select multiple items from a list box.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:multiple</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: multiple items cannot be selected from a list box.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: multiple items can be selected from a list box.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:multiple</span> attribute is usable with the following element: <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:multiple</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_294form_name"><span style="margin-right:0.127cm;">19.294</span></a><a id="__RefHeading__1417450_253892949"/><a id="attribute-form_name"/>form:name</h2><p class="Text_20_body">The <span class="Attribute">form:name</span> attribute specifies the name of a form or control element. </p><p class="Note"><span class="Note_20_Label">Note: </span>This may be used to give a form or control element an identity, which is can be used for scripting or for submitting the content of controls.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:name</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_295form_navigation-mode"><span style="margin-right:0.127cm;">19.295</span></a><a id="__RefHeading__1417452_253892949"/><a id="attribute-form_navigation-mode"/>form:navigation-mode</h2><p class="Text_20_body">The <span class="Attribute">form:navigation-mode</span> attribute specifies methods for navigation of a database aware form. </p><p class="Text_20_body">The defined values of the <span class="Attribute">form:navigation-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">current</span>: An user interface is provided and the navigation is performed on the current form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: a user interface is not provided, but the form may be navigated using the TAB and SHIFT/TAB keys on the keyboard.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">parent</span>: a user interface is provided and the navigation is performed on the parent form of the current form.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:navigation-mode</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:navigation-mode</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">current</span> or <span class="Attribute_20_Value">parent</span>.</p><h2 class="Heading_20_2"><a id="a19_296form_order"><span style="margin-right:0.127cm;">19.296</span></a><a id="__RefHeading__1417454_253892949"/><a id="attribute-form_order"/>form:order</h2><p class="Text_20_body">The <span class="Attribute">form:order</span> attribute specifies a sort criteria for a command. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:order</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:order</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_297form_orientation"><span style="margin-right:0.127cm;">19.297</span></a><a id="__RefHeading__1417456_253892949"/><a id="attribute-form_orientation"/>form:orientation</h2><p class="Text_20_body">The <span class="Attribute">form:orientation</span> attribute specifies the orientation of a control,</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:orientation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal</span>: control is oriented horizontally.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: control is oriented vertically.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:orientation</span> attribute is usable with the following element: <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:orientation</span> attribute are <span class="Attribute_20_Value">horizontal</span> or <span class="Attribute_20_Value">vertical</span>.</p><h2 class="Heading_20_2"><a id="a19_298form_page-step-size"><span style="margin-right:0.127cm;">19.298</span></a><a id="__RefHeading__1417458_253892949"/><a id="attribute-form_page-step-size"/>form:page-step-size</h2><p class="Text_20_body">The <span class="Attribute">form:page-step-size</span> attribute specifies the preferred major value change offered through a UI (if applicable for the control used). </p><p class="Text_20_body">The value of a <span class="Attribute">form:page-step-size</span> attribute shall be positive. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:page-step-size</span> attribute is usable with the following element: <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:page-step-size</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_299form_printable"><span style="margin-right:0.127cm;">19.299</span></a><a id="__RefHeading__1417460_253892949"/><a id="attribute-form_printable"/>form:printable</h2><p class="Text_20_body">The <span class="Attribute">form:printable</span> attribute specifies whether a control is printed when a user prints a document in which the control is contained. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:printable</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: control not printed when a document containing the control is printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: control printed when a document containing the control is printed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:printable</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:printable</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_300form_property-name"><span style="margin-right:0.127cm;">19.300</span></a><a id="__RefHeading__1417462_253892949"/><a id="attribute-form_property-name"/>form:property-name</h2><p class="Text_20_body">The <span class="Attribute">form:property-name</span> attribute specifies the name of a property element. The name is unique within all <span class="Element">&lt;form:property&gt;</span> and <span class="Element">&lt;form:list-property&gt;</span> child elements of a &lt;form:properties&gt; element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:property-name</span> attribute is usable with the following elements: <span class="Element">&lt;form:list-property&gt;</span> <a href="#element-form_list-property">13.9</a> and <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:property-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_301form_readonly"><span style="margin-right:0.127cm;">19.301</span></a><a id="__RefHeading__1417464_253892949"/><a id="attribute-form_readonly"/>form:readonly</h2><p class="Text_20_body">The <span class="Attribute">form:readonly</span> attribute specifies whether a user can modify the value of a control. </p><p class="Text_20_body">Read-only controls are included in a tabbing navigation sequence.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:readonly</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a user cannot modify the value of a control. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a user can modify the value of a control.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:readonly</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:readonly</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_302form_repeat"><span style="margin-right:0.127cm;">19.302</span></a><a id="__RefHeading__1417466_253892949"/><a id="attribute-form_repeat"/>form:repeat</h2><p class="Text_20_body">The <span class="Attribute">form:repeat</span> attribute specifies whether a form control, or a part of a form control repeats a defined action in response a continuous action by a user.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:repeat</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: continuous action results in one defined action.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: continuous action results in repeating the defined action.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> Pressing and holding any key is an example of continuing a single act. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:repeat</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:repeat</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_303form_selected"><span style="margin-right:0.127cm;">19.303</span></a><a id="__RefHeading__1417468_253892949"/><a id="attribute-form_selected"/>form:selected</h2><p class="Text_20_body">The <span class="Attribute">form:selected</span> attribute specifies the default state of a radio button or option. A control initializes to the default state specified by this attribute. </p><p class="Text_20_body">In a group of radio buttons that share the same name, only one radio button can have a <span class="Attribute">form:selected</span> attribute set to true.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:selected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: not the default state of a radio button or option. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: default state of a radio button or option.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:selected</span> attribute is usable with the following elements: <span class="Element">&lt;form:option&gt;</span> <a href="#element-form_option">13.5.14</a> and <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:selected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_304form_size"><span style="margin-right:0.127cm;">19.304</span></a><a id="__RefHeading__1417470_253892949"/><a id="attribute-form_size"/>form:size</h2><p class="Text_20_body">The <span class="Attribute">form:size</span> attribute specifies the number of rows that are visible at a time in a combo box list or a list box list.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:size</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a> and <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:size</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_305form_source-cell-range"><span style="margin-right:0.127cm;">19.305</span></a><a id="__RefHeading__1417472_253892949"/><a id="attribute-form_source-cell-range"/>form:source-cell-range</h2><p class="Text_20_body">The <span class="Attribute">form:source-cell-range</span> attribute specifies a rectangular cell range, whose content should be synchronized with a form controls item list. The form control reacts to changes in the cell range, that is, it adjusts its item list as cell range's content changes.</p><p class="Text_20_body">Specify a cell range using cellRangeAddress or as a name of a named cell range. Display the left most columns of a range if the range contains more columns than a form control can display. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:source-cell-range</span> attribute is usable with the following elements: <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a> and <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:source-cell-range</span> attribute are a value of type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_306form_spin-button"><span style="margin-right:0.127cm;">19.306</span></a><a id="__RefHeading__1417474_253892949"/><a id="attribute-form_spin-button"/>form:spin-button</h2><p class="Text_20_body">The <span class="Attribute">form:spin-button</span> attribute specifies whether a form control for input has spin buttons. Spin buttons are used to increment or decrement all or part of an input value.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:spin-button</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: form control does not have spin buttons. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: form control has spin buttons. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:spin-button</span> attribute is usable with the following elements: <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a> and <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:spin-button</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_307form_state"><span style="margin-right:0.127cm;">19.307</span></a><a id="__RefHeading__1417476_253892949"/><a id="attribute-form_state"/>form:state</h2><p class="Text_20_body">The <span class="Attribute">form:state</span> attribute specifies the default state of a check box control. A check box control initializes to the default state specified by this attribute. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:state</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">checked</span>: default state of a check box control. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unchecked</span>: check box control has no default state.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unknown</span>: state of check box control is not known.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">unchecked</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:state</span> attribute is usable with the following element: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:state</span> attribute are <span class="Attribute_20_Value">unchecked</span>, <span class="Attribute_20_Value">checked</span> or <span class="Attribute_20_Value">unknown</span>.</p><h2 class="Heading_20_2"><a id="a19_308form_step-size"><span style="margin-right:0.127cm;">19.308</span></a><a id="__RefHeading__1417478_253892949"/><a id="attribute-form_step-size"/>form:step-size</h2><p class="Text_20_body">The <span class="Attribute">form:step-size</span> attribute specifies the preferred minor value change offered through a UI (if applicable for the control used).</p><p class="Text_20_body">The value of a <span class="Attribute">form:step-size</span> attribute shall be positive.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:step-size</span> attribute is usable with the following element: <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:step-size</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_309form_tab-cycle"><span style="margin-right:0.127cm;">19.309</span></a><a id="__RefHeading__1417480_253892949"/><a id="attribute-form_tab-cycle"/>form:tab-cycle</h2><p class="Text_20_body">The <span class="Attribute">form:tab-cycle</span> attribute specifies how the consumer responds when the user presses the TAB key in the controls in a form. The behavior of the consumer depends on whether the form is bound to a data source.</p><p class="Text_20_body">The defined values for the <span class="Attribute">form:tab-cycle</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">current</span>: If a user presses the TAB key in the last control of the form, the focus moves to the first control specified in the tab order of the same form. If the form is data aware (<a href="#data-aware">13.1</a>), then the current row of the result set subject to the form is not changed. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">page</span>: If a user presses the TAB key in the last control of a form, the focus moves to the first control specified in the tab order for the next form.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">records</span>: If a user presses the TAB key in the last control of the form, the focus moves to the first control specified in the tab order of the same form. If the form is data aware (<a href="#data-aware"/><a href="#data-aware"/><a href="#data-aware">13.1</a>), then the current row of the result set subject to the form moves to the next row. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:tab-cycle</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:tab-cycle</span> attribute are <span class="Attribute_20_Value">records</span>, <span class="Attribute_20_Value">current</span> or <span class="Attribute_20_Value">page</span>.</p><h2 class="Heading_20_2"><a id="a19_310form_tab-index"><span style="margin-right:0.127cm;">19.310</span></a><a id="__RefHeading__1417482_253892949"/><a id="attribute-form_tab-index"/>form:tab-index</h2><p class="Text_20_body">The <span class="Attribute">form:tab-index</span> attribute specifies the tabbing navigation order of controls within a form. <a id="didx-tabbing_order"/>Tabbing order is the order of focus on controls when a user navigates the form using the TAB key on the keyboard. Elements within other elements can be included in a tabbing order. Values do not have to be sequential and they do not have to begin with a particular value. </p><p class="Text_20_body">The rules of tab navigation are: </p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>Controls that have the <span class="Attribute">form:disabled</span> attribute set to true are not included in the navigation, independent of their <span class="Attribute">form:tab-index</span> value. <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>Controls that have the same values for the <span class="Attribute">form:tab-index</span> attribute are navigated in order of their position in the form. <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">3)</span>The navigation starts with the controls with lowest non-zero <span class="Attribute">form:tab-index</span> value. <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">4)</span>When the controls with a certain <span class="Attribute">form:tab-index</span> value have been navigated, navigation continues with the controls with the next highest value. <span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">5)</span>After the controls with the highest value have been navigated, navigation continues with the controls that do not contain the <span class="Attribute">form:tab-index</span> attribute or contain the attribute with a value of 0. <span class="odfLiEnd"/> </p></li></ol><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:tab-index</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:tab-index</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_311form_tab-stop"><span style="margin-right:0.127cm;">19.311</span></a><a id="__RefHeading__1417484_253892949"/><a id="attribute-form_tab-stop"/>form:tab-stop</h2><p class="Text_20_body">The <span class="Attribute">form:tab-stop</span> attribute specifies whether a control is included in the tabbing navigation order. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:tab-stop</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: control is not included in tabbing navigation order. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: control is included in tabbing navigation order.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:tab-stop</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:tab-stop</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_312form_text-style-name"><span style="margin-right:0.127cm;">19.312</span></a><a id="__RefHeading__1417486_253892949"/><a id="attribute-form_text-style-name"/>form:text-style-name</h2><p class="Text_20_body">The <span class="Attribute">form:text-style-name</span> attribute specifies paragraph style that is applied to all controls for a column. Unlike other paragraph styles, this style may reference a data style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:text-style-name</span> attribute is usable with the following element: <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:text-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_313form_title"><span style="margin-right:0.127cm;">19.313</span></a><a id="__RefHeading__1417488_253892949"/><a id="attribute-form_title"/>form:title</h2><p class="Text_20_body">The <span class="Attribute">form:title</span> attribute contains additional information about a control. The value of the attribute may be used as a "tool tip" (a short message that appears when the pointing device pauses over the form element). Audio user agents may speak the title information in a similar context. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:title</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_314form_toggle"><span style="margin-right:0.127cm;">19.314</span></a><a id="__RefHeading__1417490_253892949"/><a id="attribute-form_toggle"/>form:toggle</h2><p class="Text_20_body">The <span class="Attribute">form:toggle</span> attribute specifies whether a form button control acts as push button or as toggle button. </p><p class="Note"><span class="Note_20_Label">Note: </span>A toggle button is similar to a check box (in fact, it could be considered a different visual representation of a check box), in that operating it once, by either mouse or keyboard, toggles its state between "pressed" and "not pressed". </p><p class="Text_20_body">A push button triggers an action, which happens every time the user operates the button. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:toggle</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: form button control acts as push button. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: form button control acts as a toggle button.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:toggle</span> attribute is usable with the following element: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:toggle</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_315form_validation"><span style="margin-right:0.127cm;">19.315</span></a><a id="__RefHeading__1417492_253892949"/><a id="attribute-form_validation"/>form:validation</h2><p class="Text_20_body">The <span class="Attribute">form:validation</span> attribute specifies whether the text that the user enters is validated during input against the input format associated with the control. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:validation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: invalid content is detected during input.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: invalid content is not detected during input.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">form:validation</span> attribute is usable with the following element: <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:validation</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_316form_value"><span style="margin-right:0.127cm;">19.316</span></a><a id="__RefHeading__1417494_253892949"/><a id="attribute-form_value"/>form:value</h2><h3 class="Heading_20_3"><a id="a19_316_1General"><span style="margin-right:0.127cm;">19.316.1</span></a><a id="__RefHeading__1718328_1219268628"/>General </h3><p class="Text_20_body">The <span class="Attribute">form:value</span> attribute specifies the default value of an input control. </p><h3 class="Heading_20_3"><a id="a19_316_2_form_button_"><span style="margin-right:0.127cm;">19.316.2</span></a><a id="__RefHeading__1718330_1219268628"/><a id="attribute-form_value_element-form_button"/>&lt;form:button&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:</span><span class="Attribute">v</span><span class="Attribute">alue</span> attribute is <span class="Datatype">boole</span><span class="Datatype">an</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:value</span> attribute is usable with the following element: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_316_3_form_date_"><span style="margin-right:0.127cm;">19.316.3</span></a><a id="__RefHeading__1718332_1219268628"/><a id="attribute-form_value_element-form_date"/>&lt;form:date&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:</span><span class="Attribute">value</span> attribute is <span class="Datatype">date</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:value</span> attribute is usable with the following element: <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:value</span> attribute has the data type <span class="Datatype">date</span> <a href="#datatype-date">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_316_4_form_number__and__form_value-range_"><span style="margin-right:0.127cm;">19.316.4</span></a><a id="__RefHeading__1718334_1219268628"/><a id="attribute-form_value_element-form_number"/><a id="attribute-form_value_element-form_value-range"/>&lt;form:number&gt; and &lt;form:value-range&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:value</span> attribute is <span class="Datatype">number</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:value</span> attribute is usable with the following elements: <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:value</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_316_5_form_checkbox____form_combobox____form_file____form_formatted-text____form_hidden____form_image____form_option____form_password____form_radio____form_text____form_textarea_"><span style="margin-right:0.127cm;">19.316.5</span></a><a id="__RefHeading__1718336_1219268628"/><a id="attribute-form_value_element-form_image"/><a id="attribute-form_value_element-form_option"/><a id="attribute-form_value_element-form_password"/><a id="attribute-form_value_element-form_radio"/><a id="attribute-form_value_element-form_text"/><a id="attribute-form_value_element-form_textarea"/><a id="attribute-form_value_element-form_checkbox"/><a id="attribute-form_value_element-form_combobox"/><a id="attribute-form_value_element-form_file"/><a id="attribute-form_value_element-form_formatted-text"/><a id="attribute-form_value_element-form_hidden"/>&lt;form:checkbox&gt;, &lt;form:combobox&gt;, &lt;form:file&gt;, &lt;form:formatted-text&gt;, &lt;form:hidden&gt;, &lt;form:image&gt;, &lt;form:option&gt;, &lt;form:password&gt;, &lt;form:radio&gt;, &lt;form:text&gt;, &lt;form:textarea&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:value</span> attribute is <span class="Datatype">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:value</span> attribute is usable with the following elements: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:option&gt;</span> <a href="#element-form_option">13.5.14</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a> and <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_316_6_form_time_"><span style="margin-right:0.127cm;">19.316.6</span></a><a id="__RefHeading__1718338_1219268628"/><a id="attribute-form_value_element-form_time"/>&lt;form:time&gt;</h3><p class="Text_20_body">The value type of the <span class="Attribute">form:value</span> attribute is <span class="Datatype">time</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:value</span> attribute is usable with the following element: <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:value</span> attribute has the data type <span class="Datatype">time</span> <a href="#datatype-time">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_317form_visual-effect"><span style="margin-right:0.127cm;">19.317</span></a><a id="__RefHeading__1417496_253892949"/><a id="attribute-form_visual-effect"/>form:visual-effect</h2><p class="Text_20_body">The <span class="Attribute">form:visual-effect</span> attributes specifies a visual effect to apply to a control. </p><p class="Text_20_body">The defined values for the <span class="Attribute">form:visual-effect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">3d</span>: 3D visual effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">flat</span>: flat visual effect.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:visual-effect</span> attribute is usable with the following elements: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a> and <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">form:visual-effect</span> attribute are <span class="Attribute_20_Value">flat</span> or <span class="Attribute_20_Value">3d</span>.</p><h2 class="Heading_20_2"><a id="a19_318form_xforms-list-source"><span style="margin-right:0.127cm;">19.318</span></a><a id="__RefHeading__1417498_253892949"/><a id="attribute-form_xforms-list-source"/>form:xforms-list-source</h2><p class="Text_20_body">The <span class="Attribute">form:xforms-list-source</span> attribute specifies a reference to an <span class="Alien_20_Element">&lt;xforms:bind&gt;</span> element, and creates a list entry for each node in the node-set defined by that attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:xforms-list-source</span> attribute is usable with the following element: <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:xforms-list-source</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_319form_xforms-submission"><span style="margin-right:0.127cm;">19.319</span></a><a id="__RefHeading__1417500_253892949"/><a id="attribute-form_xforms-submission"/>form:xforms-submission</h2><p class="Text_20_body">The <span class="Attribute">form:xforms-submission</span> attribute specifies the name of an <span class="Alien_20_Element">&lt;xforms:submission&gt;</span> element for a <span class="Element">&lt;form:button&gt;</span> control. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">form:xforms-submission</span> attribute is usable with the following element: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">form:xforms-submission</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_320grddl_transformation"><span style="margin-right:0.127cm;">19.320</span></a><a id="__RefHeading__1417502_253892949"/><a id="attribute-grddl_transformation"/>grddl:transformation</h2><p class="Text_20_body">The <span class="Attribute">grddl:transformation</span> attributes link to a transformation for extracting RDF data from the document. See <a title="Gleaning Resource Descriptions from Dialects of Languages (GRDDL)" href="http://www.w3.org/TR/2007/REC-grddl-20070911/">[GRDDL]</a>.</p><p class="Note"><a id="line-401"/><span class="Note_20_Label">Note:</span> This transformation is intended to be interpreted by consumers that do not support OpenDocument. </p><p class="Text_20_body">The referenced transformations should map OpenDocument elements that are children of the <span class="Element">&lt;office:meta&gt;</span> element to RDF. They should also extract the RDF triples stored as RDFa attributes in the document content and styles. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Please check the <a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=office">OASIS Open Document Format for Office Applications (OpenDocument) TC's</a> web site for GRDDL transformations provided by the OASIS Open Document Format for Office Applications (OpenDocument) TC. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">grddl:transformation</span> attribute is usable with the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>, <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a>, <span class="Element">&lt;office:document-meta&gt;</span> <a href="#element-office_document-meta">3.1.3.4</a>, <span class="Element">&lt;office:document-settings&gt;</span> <a href="#element-office_document-settings">3.1.3.5</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The value of the <span class="Attribute">grddl:transformation</span> attribute is a white space separated lists of values of type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>, including the empty list.</p><h2 class="Heading_20_2"><a id="a19_321meta_cell-count"><span style="margin-right:0.127cm;">19.321</span></a><a id="__RefHeading__1417504_253892949"/><a id="attribute-meta_cell-count"/>meta:cell-count</h2><p class="Text_20_body">The <span class="Attribute">meta:cell-count</span> attribute specifies the number of table cells that an OpenDocument producer has counted for a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:cell-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:cell-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_322meta_character-count"><span style="margin-right:0.127cm;">19.322</span></a><a id="__RefHeading__1417506_253892949"/><a id="attribute-meta_character-count"/>meta:character-count</h2><p class="Text_20_body">The <span class="Attribute">meta:character-count</span> attribute specifies the number of characters that an OpenDocument producer has counted for a document. </p><p class="Text_20_body"><a id="__DdeLink__488020_1816664164"/>The value of the <span class="Attribute">meta:character-count</span> attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:character-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:character-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_323meta_date"><span style="margin-right:0.127cm;">19.323</span></a><a id="__RefHeading__1417508_253892949"/><a id="attribute-meta_date"/>meta:date</h2><p class="Text_20_body">The <span class="Attribute">meta:date</span> attribute specifies the date and time when a template was last modified, prior to being used to create the current document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:date</span> attribute is usable with the following element: <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:date</span> attribute has the data type <span class="Datatype">dateTime</span> <a href="#datatype-dateTime">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_324meta_delay"><span style="margin-right:0.127cm;">19.324</span></a><a id="__RefHeading__1417510_253892949"/><a id="attribute-meta_delay"/>meta:delay</h2><p class="Text_20_body">The <span class="Attribute">meta:delay</span> attribute specifies a reload delay.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:delay</span> attribute is usable with the following element: <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:delay</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_325meta_draw-count"><span style="margin-right:0.127cm;">19.325</span></a><a id="__RefHeading__1417512_253892949"/><a id="attribute-meta_draw-count"/>meta:draw-count</h2><p class="Text_20_body">The <span class="Attribute">meta:draw-count</span> attribute specifies the number of drawing-shapes that an OpenDocument producer has counted for a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:draw-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:draw-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_326meta_frame-count"><span style="margin-right:0.127cm;">19.326</span></a><a id="__RefHeading__1417514_253892949"/><a id="attribute-meta_frame-count"/>meta:frame-count</h2><p class="Text_20_body">The <span class="Attribute">meta:frame-count</span> attribute specifies the number of text-boxes that an OpenDocument producer has counted for a document. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:frame-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:frame-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_327meta_image-count"><span style="margin-right:0.127cm;">19.327</span></a><a id="__RefHeading__1417516_253892949"/><a id="attribute-meta_image-count"/>meta:image-count</h2><p class="Text_20_body">The <span class="Attribute">meta:image-count</span> attribute specifies the number of images that an OpenDocument producer has counted for a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:image-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:image-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_328meta_name"><span style="margin-right:0.127cm;">19.328</span></a><a id="__RefHeading__1417518_253892949"/><a id="attribute-meta_name"/>meta:name</h2><p class="Text_20_body">The <span class="Attribute">meta:name</span> attribute specifies the name of a metadata element. The name shall be unique within the domain of <span class="Element">&lt;meta:user-defined&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:name</span> attribute is usable with the following element: <span class="Element">&lt;meta:user-defined&gt;</span> <a href="#element-meta_user-defined">4.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_329meta_non-whitespace-character-count"><span style="margin-right:0.127cm;">19.329</span></a><a id="__RefHeading__1417520_253892949"/><a id="attribute-meta_non-whitespace-character-count"/>meta:non-whitespace-character-count</h2><p class="Text_20_body">The <span class="Attribute">meta:non-whitespace-character-count</span> attribute specifies the number of non-white space characters that an OpenDocument producer has counted for a document.</p><p class="Text_20_body">The value of the <span class="Attribute">meta:non-whitespace-character-count</span> attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:non-whitespace-character-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:non-whitespace-character-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_330meta_object-count"><span style="margin-right:0.127cm;">19.330</span></a><a id="__RefHeading__1417522_253892949"/><a id="attribute-meta_object-count"/>meta:object-count</h2><p class="Text_20_body">The <span class="Attribute">meta:object-count</span> attribute specifies the number of embedded objects stored in OpenDocument format that the OpenDocument producer has counted for the document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:object-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:object-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_331meta_ole-object-count"><span style="margin-right:0.127cm;">19.331</span></a><a id="__RefHeading__1417524_253892949"/><a id="attribute-meta_ole-object-count"/>meta:ole-object-count</h2><p class="Text_20_body">The <span class="Attribute">meta:ole-object-count</span> attribute specifies the number of embedded objects stored in a different format than OpenDocument that the OpenDocument producer has counted for the document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:ole-object-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:ole-object-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_332meta_page-count"><span style="margin-right:0.127cm;">19.332</span></a><a id="__RefHeading__1417526_253892949"/><a id="attribute-meta_page-count"/>meta:page-count</h2><p class="Text_20_body">The <span class="Attribute">meta:page-count</span> attribute specifies the number of pages that an OpenDocument producer has calculated for a document.</p><p class="Text_20_body">The value of the <span class="Attribute">meta:page-count</span> attribute is implementation-dependent. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:page-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:page-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_333meta_paragraph-count"><span style="margin-right:0.127cm;">19.333</span></a><a id="__RefHeading__1417528_253892949"/><a id="attribute-meta_paragraph-count"/>meta:paragraph-count</h2><p class="Text_20_body">The <span class="Attribute">meta:paragraph-count</span> attribute specifies the number of paragraphs that an OpenDocument producer has counted for a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:paragraph-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:paragraph-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_334meta_row-count"><span style="margin-right:0.127cm;">19.334</span></a><a id="__RefHeading__1417530_253892949"/><a id="attribute-meta_row-count"/>meta:row-count</h2><p class="Text_20_body">The <span class="Attribute">meta:row-count</span> attribute specifies the number of lines contained in a document instance. </p><p class="Text_20_body">The value of the <span class="Attribute">meta:row-count</span> attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:row-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:row-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_335meta_sentence-count"><span style="margin-right:0.127cm;">19.335</span></a><a id="__RefHeading__1417532_253892949"/><a id="attribute-meta_sentence-count"/>meta:sentence-count</h2><p class="Text_20_body">The <span class="Attribute">meta:sentence-count</span> attribute specifies the number of sentences that an OpenDocument producer has counted for a document.</p><p class="Text_20_body">The value of the <span class="Attribute">meta:sentence-count</span> attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:sentence-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:sentence-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_336meta_syllable-count"><span style="margin-right:0.127cm;">19.336</span></a><a id="__RefHeading__1417534_253892949"/><a id="attribute-meta_syllable-count"/>meta:syllable-count</h2><p class="Text_20_body">The <span class="Attribute">meta:syllable-count</span> attribute specifies the number of syllables that an OpenDocument producer has counted for a document.</p><p class="Text_20_body">The value of the <span class="Attribute">meta:syllable-count</span> attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:syllable-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:syllable-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_337meta_table-count"><span style="margin-right:0.127cm;">19.337</span></a><a id="__RefHeading__1417536_253892949"/><a id="attribute-meta_table-count"/>meta:table-count</h2><p class="Text_20_body">The <span class="Attribute">meta:table-count</span> attribute specifies the number of <span class="Element">&lt;table:table&gt;</span> elements contained in a document instance. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:table-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:table-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_338meta_value-type"><span style="margin-right:0.127cm;">19.338</span></a><a id="__RefHeading__1417538_253892949"/><a id="attribute-meta_value-type"/>meta:value-type</h2><p class="Text_20_body">The <span class="Attribute">meta:value-type</span> attribute specifies the type of a metadata element. </p><p class="Text_20_body">The defined values for the <span class="Attribute">meta:value-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">boolean</span>: <a href="#datatype-boolean">18.3.3</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">date</span>: <a href="#datatype-date">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">float</span>: <a href="#datatype-double">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">time</span>: <a href="#datatype-time">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">string</span>: <a href="#datatype-string">18.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default type for meta-data elements is <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:value-type</span> attribute is usable with the following element: <span class="Element">&lt;meta:user-defined&gt;</span> <a href="#element-meta_user-defined">4.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">meta:value-type</span> attribute are <span class="Attribute_20_Value">float</span>, <span class="Attribute_20_Value">date</span>, <span class="Attribute_20_Value">time</span>, <span class="Attribute_20_Value">boolean</span> or <span class="Attribute_20_Value">string</span>.</p><h2 class="Heading_20_2"><a id="a19_339meta_word-count"><span style="margin-right:0.127cm;">19.339</span></a><a id="__RefHeading__1417540_253892949"/><a id="attribute-meta_word-count"/>meta:word-count</h2><p class="Text_20_body">The <span class="Attribute">meta:word-count</span> attribute specifies the number of words that an OpenDocument producer has counted for a document. </p><p class="Text_20_body">The value of the <span class="Attribute">meta:word-count</span> attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">meta:word-count</span> attribute is usable with the following element: <span class="Element">&lt;meta:document-statistic&gt;</span> <a href="#element-meta_document-statistic">4.3.2.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">meta:word-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_340number_automatic-order"><span style="margin-right:0.127cm;">19.340</span></a><a id="__RefHeading__1417542_253892949"/><a id="attribute-number_automatic-order"/>number:automatic-order</h2><p class="Text_20_body">The <a id="DDE_LINK13"/><span class="Attribute">number:automatic-order</span> attribute specifies whether data is ordered to match the default order for the language and country of a data style. </p><p class="Text_20_body">The defined values for the <span class="Attribute">number:automatic-order</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data is not ordered to match the default order for the language and country of a data style.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data is ordered to match the default order for the language and country of a data style.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:automatic-order</span> attribute is usable with the following elements: <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a> and <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:automatic-order</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_341number_calendar"><span style="margin-right:0.127cm;">19.341</span></a><a id="__RefHeading__1417544_253892949"/><a id="attribute-number_calendar"/>number:calendar</h2><p class="Text_20_body">The <span class="Attribute">number:calendar</span> attribute specifies the calendar system used to extract parts of a date. </p><p class="Text_20_body">The defined values for the <span class="Attribute">number:calendar</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">buddhist</span>: Buddhist calendar, identical to Gregorian calendar but offset by -543 years. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">gengou</span>: Japanese Gengou calendar, Emperor eras. Identical to Gregorian calendar but with different eras for each emperor. Consumers may implement only the modern eras starting 1868, Meiji, Taisho, Showa and Heisei. Earlier dates are then displayed using the Gregorian calendar <a title="Data elements and interchange formats -- Information interchange -- Representation of dates and times">[JIS X 0301]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">gregorian</span>: Gregorian calendar with cut-off date 1582-10-04, 1582-10-15 following. Dates before cut-off date are calculated in Julian proleptic calendar <a title="Data elements and interchange formats -- Information interchange -- Representation of dates and times">[ISO8601]</a>, Section 2.4.1.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hanja</span>: Additional Gregorian calendar in Korean locales, uses differently localized day and month names. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hanja_yoil</span>: Legacy alias for <span class="Attribute_20_Value">hanja</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hijri</span>: Islamic Hijri lunar calendar (religious, non-civil). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">jewish</span>: Jewish lunisolar calendar. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ROC</span>: Taiwanese Minguo calendar, identical to Gregorian calendar offset by -1911 years. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The attribute value may also be a string value. If this attribute is not specified, the default calendar system for the locale of the data style is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:calendar</span> attribute is usable with the following elements: <span class="Element">&lt;number:day&gt;</span> <a href="#element-number_day">16.27.11</a>, <span class="Element">&lt;number:day-of-week&gt;</span> <a href="#element-number_day-of-week">16.27.15</a>, <span class="Element">&lt;number:era&gt;</span> <a href="#element-number_era">16.27.14</a>, <span class="Element">&lt;number:month&gt;</span> <a href="#element-number_month">16.27.12</a>, <span class="Element">&lt;number:quarter&gt;</span> <a href="#element-number_quarter">16.27.17</a>, <span class="Element">&lt;number:week-of-year&gt;</span> <a href="#element-number_week-of-year">16.27.16</a> and <span class="Element">&lt;number:year&gt;</span> <a href="#element-number_year">16.27.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:calendar</span> attribute are <span class="Attribute_20_Value">gregorian</span>, <span class="Attribute_20_Value">gengou</span>, <span class="Attribute_20_Value">ROC</span>, <span class="Attribute_20_Value">hanja_yoil</span>, <span class="Attribute_20_Value">hanja</span>, <span class="Attribute_20_Value">hijri</span>, <span class="Attribute_20_Value">jewish</span>, <span class="Attribute_20_Value">buddhist</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_342number_country"><span style="margin-right:0.127cm;">19.342</span></a><a id="__RefHeading__1417546_253892949"/><a id="attribute-number_country"/>number:country</h2><p class="Text_20_body">The <span class="Attribute">number:country</span> attribute specifies a country code for a data style. The country code is used for formatting properties whose evaluation is locale dependent.</p><p class="Text_20_body">If a country is not specified, the system settings are used. </p><p class="Text_20_body">The <span class="Attribute">number:country</span> attribute on a <span class="Element">&lt;number:currency-symbol&gt;</span> element, specifies the country of a currency symbol. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:country</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:currency-symbol&gt;</span> <a href="#element-number_currency-symbol">16.27.8</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:country</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a19_343number_decimal-places"><span style="margin-right:0.127cm;">19.343</span></a><a id="__RefHeading__1417548_253892949"/><a id="attribute-number_decimal-places"/>number:decimal-places</h2><h3 class="Heading_20_3"><a id="a19_343_1General"><span style="margin-right:0.127cm;">19.343.1</span></a><a id="__RefHeading__1417550_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">number:decimal-places</span> attribute specifies the number of decimal places to display. </p><h3 class="Heading_20_3"><a id="a19_343_2_number_number_"><span style="margin-right:0.127cm;">19.343.2</span></a><a id="__RefHeading__1417552_253892949"/><a id="attribute-number_decimal-places_element-number_number"/>&lt;number:number&gt;</h3><p class="Text_20_body">If the <span class="Attribute">number:decimal-places</span> attribute is not specified, the number of decimal places specified by the default table cell style is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:decimal-places</span> attribute is usable with the following element: <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:decimal-places</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_343_3_number_seconds_"><span style="margin-right:0.127cm;">19.343.3</span></a><a id="__RefHeading__1417554_253892949"/><a id="attribute-number_decimal-places_element-number_seconds"/>&lt;number:seconds&gt; </h3><p class="Text_20_body">If the <span class="Attribute">number:decimal-places</span> attribute  is not specified or if the value of the attribute is <span class="Attribute_20_Value_20_Instance">0</span>, seconds are not displayed.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;number:seconds&gt;</span> <a href="#element-number_seconds">16.27.21</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:decimal-places</span> attribute is usable with the following element: <span class="Element">&lt;number:seconds&gt;</span> <a href="#element-number_seconds">16.27.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:decimal-places</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_343_4_number_scientific-number_"><span style="margin-right:0.127cm;">19.343.4</span></a><a id="__RefHeading__1417556_253892949"/><a id="attribute-number_decimal-places_element-number_scientific-number"/>&lt;number:scientific-number&gt;</h3><p class="Text_20_body">The <span class="Attribute">number:decimal-places</span> attribute specifies the number of decimal places to display.</p><p class="Text_20_body">If the <span class="Attribute">number:decimal-places</span> attribute is not specified, the number of decimal places specified by the default table cell style is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:decimal-places</span> attribute is usable with the following element: <span class="Element">&lt;number:scientific-number&gt;</span> <a href="#element-number_scientific-number">16.27.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:decimal-places</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_344number_decimal-replacement"><span style="margin-right:0.127cm;">19.344</span></a><a id="__RefHeading__1417558_253892949"/><a id="attribute-number_decimal-replacement"/>number:decimal-replacement</h2><p class="Text_20_body">The <span class="Attribute">number:decimal-replacement</span> attribute specifies a replacement text for decimal places if a number style specifies that decimal places are used but the number displayed is an integer. </p><p class="Note"><span class="Note_20_Label">Note: </span>What replacement text is supported is implementation-dependent. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:decimal-replacement</span> attribute is usable with the following element: <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:decimal-replacement</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_345number_denominator-value"><span style="margin-right:0.127cm;">19.345</span></a><a id="__RefHeading__1417560_253892949"/><a id="attribute-number_denominator-value"/>number:denominator-value</h2><p class="Text_20_body">The <span class="Attribute">number:denominator-value</span> attribute specifies an integer value that is used as denominator of a fraction. If this attribute is not present, a denominator that is appropriate for displaying the number is used.</p><p class="Text_20_body"><span class="Note_20_Label">Note</span>: The <span class="Attribute">number:denominator-value</span> attribute is used with <span class="Attribute">number:grouping</span> <a href="#attribute-number_grouping">19.348</a>, <span class="Attribute">number:min-denominator-digits</span> <a href="#attribute-number_min-denominator-digits">19.350</a>, <span class="Attribute">number:min-integer-digits</span> <a href="#attribute-number_min-integer-digits">19.352</a> and <span class="Attribute">number:min-numerator-digits</span> <a href="#attribute-number_min-numerator-digits">19.353</a> to define the display of a floating point number as a fraction. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:denominator-value</span> attribute is usable with the following element: <span class="Element">&lt;number:fraction&gt;</span> <a href="#element-number_fraction">16.27.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:denominator-value</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_346number_display-factor"><span style="margin-right:0.127cm;">19.346</span></a><a id="__RefHeading__1417562_253892949"/><a id="attribute-number_display-factor"/>number:display-factor</h2><p class="Text_20_body">The <span class="Attribute">number:display-factor</span> attribute specifies a factor by which each number is scaled (divided) before displaying.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:display-factor</span> attribute is usable with the following element: <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:display-factor</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_347number_format-source"><span style="margin-right:0.127cm;">19.347</span></a><a id="__RefHeading__1417564_253892949"/><a id="attribute-number_format-source"/>number:format-source</h2><p class="Text_20_body">The <span class="Attribute">number:format-source</span> attribute specifies the source of definitions of the <span class="Attribute_20_Value">short</span> and <span class="Attribute_20_Value">long</span> display formats. </p><p class="Text_20_body">The defined values for the <span class="Attribute">number:format-source</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: the values <span class="Attribute_20_Value">short</span> and <span class="Attribute_20_Value">long</span> of the <span class="Attribute">number:style</span> attribute are defined by this standard. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">language</span>: the meaning of the values <span class="Attribute_20_Value">long</span> and <span class="Attribute_20_Value">short</span> of the <span class="Attribute">number:style</span> attribute depend upon the <span class="Attribute">number:language</span> and <span class="Attribute">number:country</span> attributes of the date style. If neither of those attributes are specified, consumers should use their default locale for short and long date and time formats.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">fixed</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:format-source</span> attribute is usable with the following elements: <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:format-source</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">language</span>.</p><h2 class="Heading_20_2"><a id="a19_348number_grouping"><span style="margin-right:0.127cm;">19.348</span></a><a id="__RefHeading__1417566_253892949"/><a id="attribute-number_grouping"/>number:grouping</h2><p class="Text_20_body">The <span class="Attribute">number:grouping</span> attribute specifies whether the integer digits of a number should be grouped using a separator character. </p><p class="Text_20_body">The grouping character that is used and the number of digits that are grouped together depends on the language and country of the style.</p><p class="Text_20_body">The defined values for the <span class="Attribute">number:grouping</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: integer digits of a number are note grouped using a separator character.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: integer digits of a number should be grouped by a separator character.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:grouping</span> attribute is usable with the following elements: <span class="Element">&lt;number:fraction&gt;</span> <a href="#element-number_fraction">16.27.6</a>, <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a> and <span class="Element">&lt;number:scientific-number&gt;</span> <a href="#element-number_scientific-number">16.27.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:grouping</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_349number_language"><span style="margin-right:0.127cm;">19.349</span></a><a id="__RefHeading__1417568_253892949"/><a id="attribute-number_language"/>number:language</h2><p class="Text_20_body">The <span class="Attribute">number:language</span> attribute specifies a language code. The country code is used for formatting properties whose evaluation is locale dependent.</p><p class="Text_20_body">If a language code is not specified, either the system settings or the setting for the system's language are used, depending on the property whose value should be evaluated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:language</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:currency-symbol&gt;</span> <a href="#element-number_currency-symbol">16.27.8</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:language</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h2 class="Heading_20_2"><a id="a19_350number_min-denominator-digits"><span style="margin-right:0.127cm;">19.350</span></a><a id="__RefHeading__1417570_253892949"/><a id="attribute-number_min-denominator-digits"/>number:min-denominator-digits</h2><p class="Text_20_body">The <span class="Attribute">number:min-denominator-digits</span> attribute specifies the minimum number of digits to use to display the denominator of a fraction.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:min-denominator-digits</span> attribute is usable with the following element: <span class="Element">&lt;number:fraction&gt;</span> <a href="#element-number_fraction">16.27.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:min-denominator-digits</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_351number_min-exponent-digits"><span style="margin-right:0.127cm;">19.351</span></a><a id="__RefHeading__1417572_253892949"/><a id="attribute-number_min-exponent-digits"/>number:min-exponent-digits</h2><p class="Text_20_body">The <span class="Attribute">number:min-exponent-digits</span> attribute specifies the minimum number of digits to use to display an exponent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:min-exponent-digits</span> attribute is usable with the following element: <span class="Element">&lt;number:scientific-number&gt;</span> <a href="#element-number_scientific-number">16.27.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:min-exponent-digits</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_352number_min-integer-digits"><span style="margin-right:0.127cm;">19.352</span></a><a id="__RefHeading__1417574_253892949"/><a id="attribute-number_min-integer-digits"/>number:min-integer-digits</h2><p class="Text_20_body">The <span class="Attribute">number:min-integer-digits</span> attribute specifies the minimum number of integer digits to display in a number, a scientific number, or a fraction. </p><p class="Text_20_body">For a <span class="Element">&lt;number:fraction&gt;</span> element, if the <span class="Attribute">number:min-integer-digits</span> attribute is not present, no integer portion is displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:min-integer-digits</span> attribute is usable with the following elements: <span class="Element">&lt;number:fraction&gt;</span> <a href="#element-number_fraction">16.27.6</a>, <span class="Element">&lt;number:number&gt;</span> <a href="#element-number_number">16.27.3</a> and <span class="Element">&lt;number:scientific-number&gt;</span> <a href="#element-number_scientific-number">16.27.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:min-integer-digits</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_353number_min-numerator-digits"><span style="margin-right:0.127cm;">19.353</span></a><a id="__RefHeading__1417576_253892949"/><a id="attribute-number_min-numerator-digits"/>number:min-numerator-digits</h2><p class="Text_20_body">The <span class="Attribute">number:min-numerator-digits</span> attribute specifies the minimum number of digits to use to display the numerator in a fraction.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:min-numerator-digits</span> attribute is usable with the following element: <span class="Element">&lt;number:fraction&gt;</span> <a href="#element-number_fraction">16.27.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:min-numerator-digits</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_354number_position"><span style="margin-right:0.127cm;">19.354</span></a><a id="__RefHeading__1417578_253892949"/><a id="attribute-number_position"/>number:position</h2><p class="Text_20_body">The <span class="Attribute">number:position</span> attribute specifies the position where text appears.</p><p class="Text_20_body">The index of a position starts with 1 and is counted by digits from right to left in the integer part of a number, starting left from a decimal separator if one exists, or from the last digit of the number. Text is inserted before the digit at the specified position. If the value of <span class="Attribute">number:position</span> attribute is greater than the value of <span class="Attribute">number:min-integer-digits</span> and greater than the number of integer digits in the number, text is prepended to the number.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:position</span> attribute is usable with the following element: <span class="Element">&lt;number:embedded-text&gt;</span> <a href="#element-number_embedded-text">16.27.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_355number_possessive-form"><span style="margin-right:0.127cm;">19.355</span></a><a id="__RefHeading__1417580_253892949"/><a id="attribute-number_possessive-form"/>number:possessive-form</h2><p class="Text_20_body">The <span class="Attribute">number:possessive-form</span> attribute specifies whether the month is displayed as a noun or using the possessive form. </p><p class="Text_20_body">The <span class="Attribute">number:possessive-form</span> attribute is only applied when a <span class="Attribute">number:textual</span> attribute on the same <span class="Element">&lt;number:month&gt;</span> element has the value of true.</p><p class="Text_20_body">The defined values for the <span class="Attribute">number:possessive-form</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the name of the month is displayed in nominative form. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the name of the month is displayed in possessive form. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:possessive-form</span> attribute is usable with the following element: <span class="Element">&lt;number:month&gt;</span> <a href="#element-number_month">16.27.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:possessive-form</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_356number_rfc-language-tag"><span style="margin-right:0.127cm;">19.356</span></a><a id="__RefHeading__1417582_253892949"/><a id="attribute-number_rfc-language-tag"/>number:rfc-language-tag</h2><p class="Text_20_body">The <span class="Attribute">number:rfc-language-tag</span> attribute specifies a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors. </p><p class="Text_20_body">It shall only be used if its value can not be expressed as a valid combination of the <span class="Attribute">number:language</span>, <span class="Attribute">number:script</span> and <span class="Attribute">number:country</span> attributes. </p><p class="Text_20_body">Producers may add support for consumers that don't support the <span class="Attribute">number:rfc-language-tag</span> attribute by specifying <span class="Attribute">number:language</span>, <span class="Attribute">number:script</span> and <span class="Attribute">number:country</span> attributes with values as close as possible to the actual value of the <span class="Attribute">number:rfc-language-tag</span> attribute. Producers shall not use values for these attributes that contradict the value of the <span class="Attribute">table:rfc-language-tag</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:rfc-language-tag</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:currency-symbol&gt;</span> <a href="#element-number_currency-symbol">16.27.8</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:rfc-language-tag</span> attribute has the data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h2 class="Heading_20_2"><a id="a19_357number_script"><span style="margin-right:0.127cm;">19.357</span></a><a id="__RefHeading__1417584_253892949"/><a id="attribute-number_script"/>number:script</h2><p class="Text_20_body">The <span class="Attribute">number:script</span> attribute specifies a script code. The script code is used for formatting properties whose evaluation is locale dependent. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:script</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:currency-symbol&gt;</span> <a href="#element-number_currency-symbol">16.27.8</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:script</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h2 class="Heading_20_2"><a id="a19_358number_style"><span style="margin-right:0.127cm;">19.358</span></a><a id="__RefHeading__1417586_253892949"/><a id="attribute-number_style"/>number:style</h2><h3 class="Heading_20_3"><a id="a19_358_1General"><span style="margin-right:0.127cm;">19.358.1</span></a><a id="__RefHeading__1417588_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">number:style</span> attribute specifies whether the content of a time element is displayed in short or long format. The value of this attribute can be <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>. The meaning of these values depends on the value of the <span class="Attribute">number:format-source</span> attribute that is attached to a date or time style.</p><h3 class="Heading_20_3"><a id="a19_358_2_number_day_"><span style="margin-right:0.127cm;">19.358.2</span></a><a id="__RefHeading__1417590_253892949"/><a id="attribute-number_style_element-number_day"/>&lt;number:day&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: the day of month is displayed using one or two digits.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: the day of month is displayed using two digits.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:day&gt;</span> <a href="#element-number_day">16.27.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_3_number_day-of-week_"><span style="margin-right:0.127cm;">19.358.3</span></a><a id="__RefHeading__1417592_253892949"/><a id="attribute-number_style_element-number_day-of-week"/>&lt;number:day-of-week&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: abbreviated name of the day is displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: full name of the day is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:day-of-week&gt;</span> <a href="#element-number_day-of-week">16.27.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_4_number_era_"><span style="margin-right:0.127cm;">19.358.4</span></a><a id="__RefHeading__1417594_253892949"/><a id="attribute-number_style_element-number_era"/>&lt;number:era&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: abbreviated era name is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: full era name is used.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:era&gt;</span> <a href="#element-number_era">16.27.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_5_number_hours_"><span style="margin-right:0.127cm;">19.358.5</span></a><a id="__RefHeading__1417596_253892949"/><a id="attribute-number_style_element-number_hours"/>&lt;number:hours&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: hours are displayed using at least one digit.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: hours are displayed using at least two digits.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:hours&gt;</span> <a href="#element-number_hours">16.27.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_6_number_minutes_"><span style="margin-right:0.127cm;">19.358.6</span></a><a id="__RefHeading__1417598_253892949"/><a id="attribute-number_style_element-number_minutes"/>&lt;number:minutes&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: minutes are displayed using at least one digit.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: minutes are displayed using at least two digits.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:minutes&gt;</span> <a href="#element-number_minutes">16.27.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_7_number_month_"><span style="margin-right:0.127cm;">19.358.7</span></a><a id="__RefHeading__1417600_253892949"/><a id="attribute-number_style_element-number_month"/>&lt;number:month&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: abbreviated name of the month is displayed or the month is displayed using one or two digits.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: full name of the month is displayed or the month is displayed using two digits.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:month&gt;</span> <a href="#element-number_month">16.27.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_8_number_quarter_"><span style="margin-right:0.127cm;">19.358.8</span></a><a id="__RefHeading__1417602_253892949"/><a id="attribute-number_style_element-number_quarter"/>&lt;number:quarter&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: abbreviated name of the quarter is displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: full name of the quarter is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:quarter&gt;</span> <a href="#element-number_quarter">16.27.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_9_number_seconds_"><span style="margin-right:0.127cm;">19.358.9</span></a><a id="__RefHeading__1417604_253892949"/><a id="attribute-number_style_element-number_seconds"/>&lt;number:seconds&gt;</h3><p class="Text_20_body">if the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: seconds are displayed using at least one digit.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: seconds are displayed using at least two digits.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:seconds&gt;</span> <a href="#element-number_seconds">16.27.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h3 class="Heading_20_3"><a id="a19_358_10_number_year_"><span style="margin-right:0.127cm;">19.358.10</span></a><a id="__RefHeading__1417606_253892949"/><a id="attribute-number_style_element-number_year"/>&lt;number:year&gt;</h3><p class="Text_20_body">If the value of the <span class="Attribute">number:format-source</span> attribute is <span class="Attribute_20_Value">fixed</span> the <span class="Attribute">number:style</span> attribute on the same element has the defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">short</span>: year is displayed using two digits.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long</span>: year is displayed using four digits.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:style</span> attribute is usable with the following element: <span class="Element">&lt;number:year&gt;</span> <a href="#element-number_year">16.27.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:style</span> attribute are <span class="Attribute_20_Value">short</span> or <span class="Attribute_20_Value">long</span>.</p><h2 class="Heading_20_2"><a id="a19_359number_textual"><span style="margin-right:0.127cm;">19.359</span></a><a id="__RefHeading__1417608_253892949"/><a id="attribute-number_textual"/>number:textual</h2><p class="Text_20_body">The <span class="Attribute">number:textual</span> attribute specifies whether the name or number of a month is displayed in the month element of a date. </p><p class="Text_20_body">The defined values for the <span class="Attribute">number:textual</span> element are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the number of the month is displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the name of the month is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The name or number of a month is defined by the <span class="Attribute">number:calendar</span> attribute on the same parent element as the <span class="Attribute">number:textual</span> attribute. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:textual</span> attribute is usable with the following element: <span class="Element">&lt;number:month&gt;</span> <a href="#element-number_month">16.27.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:textual</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_360number_title"><span style="margin-right:0.127cm;">19.360</span></a><a id="__RefHeading__1417610_253892949"/><a id="attribute-number_title"/>number:title</h2><p class="Text_20_body">The <span class="Attribute">number:title</span> attribute specifies the title of a data style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:title</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_361number_transliteration-country"><span style="margin-right:0.127cm;">19.361</span></a><a id="__RefHeading__1417612_253892949"/><a id="attribute-number_transliteration-country"/>number:transliteration-country</h2><p class="Text_20_body">The <span class="Attribute">number:transliteration-country</span> attribute specifies a country code in conformance with <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>.</p><p class="Text_20_body">If no language/country (locale) combination is specified the locale of the data style is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:transliteration-country</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:transliteration-country</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a19_362number_transliteration-format"><span style="margin-right:0.127cm;">19.362</span></a><a id="__RefHeading__1417614_253892949"/><a id="attribute-number_transliteration-format"/>number:transliteration-format</h2><p class="Text_20_body">The <span class="Attribute">number:transliteration-format</span> attribute specifies which number characters to use. </p><p class="Text_20_body">The value of the <span class="Attribute">number:transliteration-format</span> attribute shall be a decimal "DIGIT ONE" character with numeric value 1 as listed in the Unicode Character Database file UnicodeData.txt with value 'Nd' (Numeric decimal digit) in the General_Category/Numeric_Type property field 6 and value '1' in the Numeric_Value fields 7 and 8, respectively as listed in DerivedNumericValues.txt</p><p class="Text_20_body">If no format is specified the default ASCII representation of Latin-Indic digits is used, other transliteration attributes present in that case are ignored.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:transliteration-format</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:transliteration-format</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_363number_transliteration-language"><span style="margin-right:0.127cm;">19.363</span></a><a id="__RefHeading__1417616_253892949"/><a id="attribute-number_transliteration-language"/>number:transliteration-language</h2><p class="Text_20_body">The <span class="Attribute">number:transliteration-language</span> attribute specifies a language code in conformance with <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>.</p><p class="Text_20_body">If no language/country (locale) combination is specified the locale of the data style is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">number:transliteration-language</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:transliteration-language</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a19_364number_transliteration-style"><span style="margin-right:0.127cm;">19.364</span></a><a id="__RefHeading__1417618_253892949"/><a id="attribute-number_transliteration-style"/>number:transliteration-style</h2><p class="Text_20_body">The <span class="Attribute">number:transliteration-style</span> attribute specifies the transliteration-format of a number system.</p><p class="Text_20_body">The semantics of the values of the <span class="Attribute">number:transliteration-style</span> attribute are locale and implementation-dependent. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">short</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:transliteration-style</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">number:transliteration-style</span> attribute are <span class="Attribute_20_Value">short</span>, <span class="Attribute_20_Value">medium</span> or <span class="Attribute_20_Value">long</span>.</p><h2 class="Heading_20_2"><a id="a19_365number_truncate-on-overflow"><span style="margin-right:0.127cm;">19.365</span></a><a id="__RefHeading__1417620_253892949"/><a id="attribute-number_truncate-on-overflow"/>number:truncate-on-overflow</h2><p class="Text_20_body">The <span class="Attribute">number:truncate-on-overflow</span> attribute specifies if a time or duration for which the value to be displayed by the largest time component specified in the style is too large to be displayed using the value range for <span class="Element">&lt;number:hours&gt;</span> (0 to 23), or <span class="Element">&lt;number:minutes&gt;</span> or <span class="Element">&lt;number:seconds&gt;</span> (0 to 59) is truncated or if the value range of this component is extended. The largest time component is those for which a value of "1" represents the longest period of time.</p><p class="Text_20_body">If a value gets truncated, then its value is displayed modulo 24 (for <span class="Element">&lt;number:hours&gt;</span>) or modulo 60 (for <span class="Element">&lt;number:minutes&gt;</span> and <span class="Element">&lt;number:seconds&gt;</span>). </p><p class="Text_20_body">If the value range of a component get extended, then values larger than 23 or 59 are displayed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">number:truncate-on-overflow</span> element are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the value range of the component is extended.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the value range of the component is not extended.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">number:truncate-on-overflow</span> attribute is usable with the following element: <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">number:truncate-on-overflow</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_366office_automatic-update"><span style="margin-right:0.127cm;">19.366</span></a><a id="__RefHeading__1417622_253892949"/><a id="attribute-office_automatic-update"/>office:automatic-update</h2><p class="Text_20_body">The <span class="Attribute">office:automatic-update</span> attribute specifies if DDE links are automatically updated or only upon user request. </p><p class="Text_20_body">The defined values for the <span class="Attribute">office:automatic-update</span> element are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: DDE links are updated on user request only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: DDE links are updated automatically.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">office:automatic-update</span> attribute is usable with the following elements: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a> and <span class="Element">&lt;text:dde-connection-decl&gt;</span> <a href="#element-text_dde-connection-decl">14.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:automatic-update</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_367office_boolean-value"><span style="margin-right:0.127cm;">19.367</span></a><a id="__RefHeading__1417624_253892949"/><a id="attribute-office_boolean-value"/>office:boolean-value</h2><p class="Text_20_body">The <span class="Attribute">office:boolean-value</span> attribute specifies the Boolean value for a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>, <span class="Element">&lt;text:user-defined&gt;</span>, <span class="Element">&lt;text:user-field-decl&gt;</span> and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default value for database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>). </p><p class="Text_20_body">For <span class="Element">&lt;text:user-defined&gt;</span> elements, this attribute is only evaluated if the corresponding <span class="Element">&lt;meta:user-defined&gt;</span> element has attribute <span class="Attribute">meta:value-type</span>="<span class="Attribute_20_Value">boolean</span>". </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:boolean-value</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:boolean-value</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_368office_conversion-mode"><span style="margin-right:0.127cm;">19.368</span></a><a id="__RefHeading__1417626_253892949"/><a id="attribute-office_conversion-mode"/>office:conversion-mode</h2><p class="Text_20_body">The <span class="Attribute">office:conversion-mode</span> attribute specifies the method by which the DDE server converts its data into numbers. </p><p class="Text_20_body">The defined values for the <span class="Attribute">office:conversion-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">into-default-style-data-style</span>: numbers are converted into the data style which is set on the default style.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">into-english-number</span>: numbers are converted into the English default format.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">keep-text</span>: numbers are not converted. They are treated as text.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">into-default-style-data-style</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">office:conversion-mode</span> attribute is usable with the following element: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">office:conversion-mode</span> attribute are <span class="Attribute_20_Value">into-default-style-data-style</span>, <span class="Attribute_20_Value">into-english-number</span> or <span class="Attribute_20_Value">keep-text</span>.</p><h2 class="Heading_20_2"><a id="a19_369office_currency"><span style="margin-right:0.127cm;">19.369</span></a><a id="__RefHeading__1417628_253892949"/><a id="attribute-office_currency"/>office:currency</h2><p class="Text_20_body">The <span class="Attribute">office:currency</span> attribute specifies the currency for a value of a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>,  <span class="Element">&lt;text:user-field-decl&gt;</span> and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default currency for database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>).</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:currency</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:currency</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_370office_date-value"><span style="margin-right:0.127cm;">19.370</span></a><a id="__RefHeading__1417630_253892949"/><a id="attribute-office_date-value"/>office:date-value</h2><p class="Text_20_body">The <span class="Attribute">office:date-value</span> attribute specifies the date or date-time value for a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>, <span class="Element">&lt;text:user-defined&gt;</span>, <span class="Element">&lt;text:user-field-decl&gt;</span> and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default value for database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>). </p><p class="Text_20_body">For <span class="Element">&lt;text:user-defined&gt;</span> elements, this attribute is only evaluated if the corresponding <span class="Element">&lt;meta:user-defined&gt;</span> element has attribute <span class="Attribute">meta:value-type</span>="<span class="Attribute_20_Value">date</span>". </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:date-value</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:date-value</span> attribute has the data type <span class="Datatype">dateOrDateTime</span> <a href="#datatype-dateOrDateTime">18.3.14</a>.</p><h2 class="Heading_20_2"><a id="a19_371office_dde-application"><span style="margin-right:0.127cm;">19.371</span></a><a id="__RefHeading__1417632_253892949"/><a id="attribute-office_dde-application"/>office:dde-application</h2><p class="Text_20_body">The <span class="Attribute">office:dde-application</span> attribute specifies the name of the target application to use for the DDE connection.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:dde-application</span> attribute is usable with the following elements: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a> and <span class="Element">&lt;text:dde-connection-decl&gt;</span> <a href="#element-text_dde-connection-decl">14.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:dde-application</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_372office_dde-item"><span style="margin-right:0.127cm;">19.372</span></a><a id="__RefHeading__1417634_253892949"/><a id="attribute-office_dde-item"/>office:dde-item</h2><p class="Text_20_body">The <span class="Attribute">office:dde-item</span> attribute specifies which information the target application should deliver.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:dde-item</span> attribute is usable with the following elements: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a> and <span class="Element">&lt;text:dde-connection-decl&gt;</span> <a href="#element-text_dde-connection-decl">14.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:dde-item</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_373office_dde-topic"><span style="margin-right:0.127cm;">19.373</span></a><a id="__RefHeading__1417636_253892949"/><a id="attribute-office_dde-topic"/>office:dde-topic</h2><p class="Text_20_body">The <span class="Attribute">office:dde-topic</span> attribute specifies the name of the topic to use for the DDE connection.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:dde-topic</span> attribute is usable with the following elements: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a> and <span class="Element">&lt;text:dde-connection-decl&gt;</span> <a href="#element-text_dde-connection-decl">14.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:dde-topic</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_374office_display"><span style="margin-right:0.127cm;">19.374</span></a><a id="__RefHeading__1417638_253892949"/><a id="attribute-office_display"/>office:display</h2><p class="Text_20_body">The <span class="Attribute">office:display</span> attribute specifies whether an annotation is visible.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:display</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:display</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_375office_mimetype"><span style="margin-right:0.127cm;">19.375</span></a><a id="__RefHeading__1417640_253892949"/><a id="attribute-office_mimetype"/>office:mimetype</h2><p class="Text_20_body">The <span class="Attribute">office:mimetype</span> attribute specifies the document type for a document that is contained in a single XML file. Its values are the MIME types that are used for the packaged variant of office documents.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:mimetype</span> attribute is usable with the following element: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:mimetype</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_376office_name"><span style="margin-right:0.127cm;">19.376</span></a><a id="__RefHeading__1417642_253892949"/><a id="attribute-office_name"/>office:name</h2><h3 class="Heading_20_3"><a id="a19_376_1General"><span style="margin-right:0.127cm;">19.376.1</span></a><a id="__RefHeading__1417644_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name. The use of that name is specified for each element on which it appears. </p><h3 class="Heading_20_3"><a id="a19_376_2_draw_a_"><span style="margin-right:0.127cm;">19.376.2</span></a><a id="__RefHeading__1417646_253892949"/><a id="attribute-office_name_element-draw_a"/>&lt;draw:a&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for a link. The name can serve as a target for other hyperlinks. The name does not have to be unique.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_3_draw_area-circle_"><span style="margin-right:0.127cm;">19.376.3</span></a><a id="__RefHeading__1417648_253892949"/><a id="attribute-office_name_element-draw_area-circle"/>&lt;draw:area-circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for a shape represented by this element. The name does not have to be unique.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_4_draw_area-rectangle_"><span style="margin-right:0.127cm;">19.376.4</span></a><a id="__RefHeading__1417650_253892949"/><a id="attribute-office_name_element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for a shape represented by this element. The name does not have to be unique.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_5_draw_area-polygon_"><span style="margin-right:0.127cm;">19.376.5</span></a><a id="__RefHeading__1417652_253892949"/><a id="attribute-office_name_element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for an image map. The name does not have to be unique.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_6_office_annotation_"><span style="margin-right:0.127cm;">19.376.6</span></a><a id="__RefHeading__1417654_253892949"/><a id="attribute-office_name_element-office_annotation"/>&lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for an annotation. It is used to match <span class="Element">&lt;office:annotation&gt;</span> elements with the corresponding <span class="Element">&lt;office:annotation-end&gt;</span> elements.</p><p class="Text_20_body">The name that appears in the <span class="Attribute">office:name</span> attribute of any <span class="Element">&lt;office:annotation&gt;</span>, <span class="Element">&lt;office:annotation-end&gt;</span> pair shall be unique to that pair of elements in a document instance.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_7_office_annotation-end_"><span style="margin-right:0.127cm;">19.376.7</span></a><a id="__RefHeading__1417656_253892949"/><a id="attribute-office_name_element-office_annotation-end"/>&lt;office:annotation-end&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for an annotation. It is used to match <span class="Element">&lt;office:annotation-end&gt;</span> elements with the corresponding <span class="Element">&lt;office:annotation&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_8_office_dde-source_"><span style="margin-right:0.127cm;">19.376.8</span></a><a id="__RefHeading__1417658_253892949"/><a id="attribute-office_name_element-office_dde-source"/>&lt;office:dde-source&gt;</h3><p class="Text_20_body"><a id="DDE_LINK111"/>The <span class="Attribute">office:name</span> attribute specifies the name by which a connection can be referred.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;office:dde-source&gt;</span> <a href="#element-office_dde-source">14.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_9_text_a_"><span style="margin-right:0.127cm;">19.376.9</span></a><a id="__RefHeading__1417660_253892949"/><a id="attribute-office_name_element-text_a"/>&lt;text:a&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name for a hyperlink. The name serves as a target for other hyperlinks and need not be unique. </p><p class="Note"><span class="Note_20_Label">Note: </span>This attribute is specified for compatibility with <a title="HTML 4.01 Specification" href="http://www.w3.org/TR/1999/REC-html401-19991224">[HTML4]</a> only, where an <span class="Alien_20_Element">&lt;a&gt;</span> element may serve as a link source and target simultaneously. This attribute should not be used for any purpose other than to represent links that came from a HTML document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_376_10_text_dde-connection-decl_"><span style="margin-right:0.127cm;">19.376.10</span></a><a id="__RefHeading__1417662_253892949"/><a id="attribute-office_name_element-text_dde-connection-decl"/>&lt;text:dde-connection-decl&gt;</h3><p class="Text_20_body">The <span class="Attribute">office:name</span> attribute specifies a name by which a connection can be referenced.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:name</span> attribute is usable with the following element: <span class="Element">&lt;text:dde-connection-decl&gt;</span> <a href="#element-text_dde-connection-decl">14.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_377office_process-content__deprecated_"><span style="margin-right:0.127cm;">19.377</span></a><a id="__RefHeading__1417664_253892949"/><a id="attribute-office_process-content"/>office:process-content (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">office:process-content</span> attribute specifies the processing to be performed on foreign elements.</p><p class="Text_20_body">The defined values of the <span class="Attribute">office:process-content</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: conforming consumers should not interpret a foreign element's content, but may preserve its content, regardless of the foreign element's ancestor elements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: conforming consumers may interpret a foreign element's content without regard to its ancestor elements. <span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> The <span class="Attribute">office:process-content</span> attribute has been deprecated in favor of simpler rules regarding the processing of foreign elements. <a href="#ForeignElementsAndAttributes">3.17</a></p><h2 class="Heading_20_2"><a id="a19_378office_server-map"><span style="margin-right:0.127cm;">19.378</span></a><a id="__RefHeading__1417666_253892949"/><a id="attribute-office_server-map"/>office:server-map</h2><p class="Text_20_body">The <span class="Attribute">office:server-map</span> attribute specifies that a link returns data to a server side image map. The mouse coordinates of the click position of the graphic shape are appended to the IRI of the link. The coordinates are be used by the server to determine which link to activate within the image map.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">office:server-map</span> attribute is usable with the following element: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:server-map</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_379office_string-value"><span style="margin-right:0.127cm;">19.379</span></a><a id="__RefHeading__1417668_253892949"/><a id="attribute-office_string-value"/>office:string-value</h2><p class="Text_20_body">The <span class="Attribute">office:string-value</span> attribute specifies the string-value for a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>, <span class="Element">&lt;text:user-defined&gt;</span>, <span class="Element">&lt;text:user-field-decl&gt;</span> and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default value for database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>).</p><p class="Text_20_body">For <span class="Element">&lt;text:user-defined&gt;</span> elements, this attribute is only evaluated if the corresponding <span class="Element">&lt;meta:user-defined&gt;</span> element has (default) attribute <span class="Attribute">meta:value-type</span>="<span class="Attribute_20_Value">string</span>". </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:string-value</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:string-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_380office_target-frame"><span style="margin-right:0.127cm;">19.380</span></a><a id="__RefHeading__1417670_253892949"/><a id="attribute-office_target-frame"/>office:target-frame</h2><p class="Text_20_body">The <span class="Attribute">office:target-frame</span> attribute specifies a target frame.</p><p class="Text_20_body">The defined values for the <span class="Attribute">office:target-frame</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_blank</span>: The referenced document is displayed in a new frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_parent</span>: The referenced document is displayed in the parent frame of the current frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_self</span>: The referenced document replaces the content of the current frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_top</span>: The referenced document is displayed in the topmost frame, that is the frame that contains the current frame as a child or descendant but is not contained within another frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A frame name : The referenced document is displayed in the named frame. If the named frame does not exist, a new frame with that name is created.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">_blank</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">office:target-frame</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a> and <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:target-frame</span> attribute has the data type <span class="Datatype">targetFrameName</span> <a href="#datatype-targetFrameName">18.3.34</a>.</p><h2 class="Heading_20_2"><a id="a19_381office_target-frame-name"><span style="margin-right:0.127cm;">19.381</span></a><a id="__RefHeading__1417672_253892949"/><a id="attribute-office_target-frame-name"/>office:target-frame-name</h2><p class="Text_20_body">The <span class="Attribute">office:target-frame-name</span> attribute. specifies the name of a target frame.</p><p class="Text_20_body">The defined values for the <span class="Attribute">office:target-frame-name</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_blank</span>: The referenced document is displayed in a new frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_parent</span>: The referenced document is displayed in the parent frame of the current frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_self</span>: The referenced document replaces the content of the current frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">_top</span>: The referenced document is displayed in the topmost frame, that is the frame that contains the current frame as a child or descendant but is not contained within another frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A frame name: The referenced document is displayed in the named frame. If the named frame does not exist, a new frame with that name is created.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">office:target-frame-name</span> attribute may be used together with an <span class="Attribute">xlink:show</span> attribute. In that case, if the value of the attribute is <span class="Attribute_20_Value">_blank</span>, the <span class="Attribute">xlink:show</span> attribute value should be <span class="Attribute_20_Value">new</span>. If the value of the attribute is any of the other value options, the value of the <span class="Attribute">xlink:show</span> attribute should be <span class="Attribute_20_Value">replace</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:target-frame-name</span> attribute is usable with the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> <a href="#element-meta_hyperlink-behaviour">4.3.2.14</a> and <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:target-frame-name</span> attribute has the data type <span class="Datatype">targetFrameName</span> <a href="#datatype-targetFrameName">18.3.34</a>.</p><h2 class="Heading_20_2"><a id="a19_382office_time-value"><span style="margin-right:0.127cm;">19.382</span></a><a id="__RefHeading__1417674_253892949"/><a id="attribute-office_time-value"/>office:time-value</h2><p class="Text_20_body">The <span class="Attribute">office:time-value</span> attribute specifies the time value for a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>, <span class="Element">&lt;text:user-defined&gt;</span>, <span class="Element">&lt;text:user-field-decl&gt;</span> and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default value for database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>).</p><p class="Text_20_body">For <span class="Element">&lt;text:user-defined&gt;</span> elements, this attribute is only evaluated if the corresponding <span class="Element">&lt;meta:user-defined&gt;</span> element has attribute <span class="Attribute">meta:value-type</span>="<span class="Attribute_20_Value">time</span>".</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:time-value</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:time-value</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_383office_title"><span style="margin-right:0.127cm;">19.383</span></a><a id="__RefHeading__1417676_253892949"/><a id="attribute-office_title"/>office:title</h2><p class="Text_20_body">The <span class="Attribute">office:title</span> attribute specifies a short accessible description. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> See appendix D for guidelines on using this attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:title</span> attribute is usable with the following elements: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a> and <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_384office_value"><span style="margin-right:0.127cm;">19.384</span></a><a id="__RefHeading__1417678_253892949"/><a id="attribute-office_value"/>office:value</h2><p class="Text_20_body">The <span class="Attribute">office:value</span> attribute specifies the currency, float or percentage value for a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>, <span class="Element">&lt;text:user-defined&gt;</span>, <span class="Element">&lt;text:user-field-decl&gt;</span> and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default value for database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>). </p><p class="Text_20_body">For <span class="Element">&lt;text:user-defined&gt;</span> elements, this attribute is only interpreted if the corresponding <span class="Element">&lt;meta:user-defined&gt;</span> element has attribute <span class="Attribute">meta:value-type</span>="<span class="Attribute_20_Value">float</span>". </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:value</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-value&gt;</span> <a href="#element-form_list-value">13.10</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:value</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_385office_value-type"><span style="margin-right:0.127cm;">19.385</span></a><a id="__RefHeading__1417680_253892949"/><a id="attribute-office_value-type"/>office:value-type</h2><p class="Text_20_body">The <span class="Alien_20_Element">office:value-type</span> attribute specifies the value-type of a table cell (<span class="Element">&lt;table:change-track-table-cell&gt;</span>, <span class="Element">&lt;table:covered-table-cell&gt;</span> and <span class="Element">&lt;table:table-cell&gt;</span>), a text field (<span class="Element">&lt;text:expression&gt;</span>, <span class="Element">&lt;text:user-field-decl&gt;</span>, <span class="Element">&lt;text:variable-decl&gt;</span>, <span class="Element">&lt;text:variable-input&gt;</span>and <span class="Element">&lt;text:variable-set&gt;</span>), or a form property (<span class="Element">&lt;form:list-value&gt;</span> and <span class="Element">&lt;form:property&gt;</span>). </p><p class="Text_20_body">It specifies a default value type of database columns and database column definitions (<span class="Element">&lt;db:column&gt;</span> and <span class="Element">&lt;db:column-definition&gt;</span>). </p><p class="Text_20_body">If the value type is not <span class="Datatype">string</span>, the corresponding Value Attribute(s) (<a href="#refTable13">Table 14 - Value attributes</a>) shall contain the value(s) of the element. </p><p class="Text_20_body">Each of these elements has a value type that shall be specified. The defined value types, their respective value attributes, and how the values are encoded are described in <a href="#refTable13">Table 14 - Value attributes</a>.</p><p class="Table">Table <a id="refTable13"/>14 - Value attributes</p><table border="0" cellspacing="0" cellpadding="0" class="Table6"><colgroup><col width="102"/><col width="195"/><col width="239"/><col width="130"/></colgroup><tr><td style="text-align:left;width:0.9174in; " class="Table6_A1"><p class="Table_20_Heading">Value Type</p></td><td style="text-align:left;width:1.759in; " class="Table6_A1"><p class="Table_20_Heading">Value Attribute(s)</p></td><td style="text-align:left;width:2.1569in; " class="Table6_A1"><p class="Table_20_Heading">Encoded as...</p></td><td style="text-align:left;width:1.1667in; " class="Table6_D1"><p class="Table_20_Heading">Example</p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">boolean</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:boolean-value</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">true</span> or <span class="Source_20_Text">false</span></p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"true"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">currency</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:value</span> and<br/><span class="Source_20_Text">office:currency</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Table_20_Contents">Numeric value and<br/>currency symbol</p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"100"<br/></span><span class="Source_20_Text">"USD"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">date</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:date-value</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Text_20_body">Date value as specified in §3.2.9 of <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a>, or date and time value as specified in §3.2.7 of <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a></p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"2003-04-17"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">float</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:value</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Table_20_Contents">Numeric value</p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"12.345"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">percentage</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:value</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Table_20_Contents">Numeric value</p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"0.50"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">string</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:string-value</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Table_20_Contents">Strings</p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"abc def"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">time</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">office:time-value</span></p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Text_20_body">Duration, as specified in §3.2.6 of <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a></p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"><span class="Source_20_Text">"PT03H30M00S"</span></p></td></tr><tr><td style="text-align:left;width:0.9174in; " class="Table6_A2"><p class="Table_20_Contents"><span class="Source_20_Text">void</span></p></td><td style="text-align:left;width:1.759in; " class="Table6_A2"><p class="Table_20_Contents">none</p></td><td style="text-align:left;width:2.1569in; " class="Table6_A2"><p class="Text_20_body"> </p></td><td style="text-align:left;width:1.1667in; " class="Table6_D2"><p class="Table_20_Contents"> </p></td></tr></table><p class="Text_20_body">If the value type is string and the <span class="Attribute">office:string-value</span> attribute is not present, the element content defines the value. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The OpenDocument concept of field values and value types and their encoding in XML is also modeled on the corresponding XML for table cell attributes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:value-type</span> attribute is usable with the following elements: <span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a>, <span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a>, <span class="Element">&lt;form:list-property&gt;</span> <a href="#element-form_list-property">13.9</a>, <span class="Element">&lt;form:property&gt;</span> <a href="#element-form_property">13.8</a>, <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a>, <span class="Element">&lt;text:variable-decl&gt;</span> <a href="#element-text_variable-decl">7.4.3</a>, <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">office:value-type</span> attribute has the data type <span class="Datatype">valueType</span> <a href="#datatype-valueType">18.3.38</a>.</p><h2 class="Heading_20_2"><a id="a19_386office_version"><span style="margin-right:0.127cm;">19.386</span></a><a id="__RefHeading__1417682_253892949"/><a id="attribute-office_version"/>office:version</h2><p class="Text_20_body">The <span class="Attribute">office:version</span> attribute identifies the version of the OpenDocument specification that defines the associated element, its schema, its complete content, and its interpretation. <a id="line-651"/><a id="line-64"/></p><p class="Text_20_body">The <span class="Attribute">office:version</span> attribute <span class="ISO_20_Keyword">shall</span> be present in each and every <span class="Element">&lt;office:document&gt;</span>, <span class="Element">&lt;office:document-content&gt;</span>, <span class="Element">&lt;office:document-styles&gt;</span>, <span class="Element">&lt;office:document-meta&gt;</span>, and <span class="Element">&lt;office:document-settings&gt;</span> element in the XML documents that comprise an OpenDocument 1.2 document. The value of the <span class="Attribute">office:version</span> attribute <span class="ISO_20_Keyword">shall</span> be "<span class="Attribute_20_Value">1.2</span>". </p><p class="Text_20_body"><span class="Note_20_Label">Note 1:</span> When an <span class="Attribute">office:version</span>-requiring element has <span class="Attribute">office:version</span>="<span class="Alien_20_Attribute_20_Value">1.1</span>" the element and its content are based on the OpenDocument v1.1 specification <a title="Open Document Format for Office Applications (OpenDocument) v1.1" href="http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.pdf">[ODF11]</a>. For <span class="Attribute">office:version</span>="<span class="Alien_20_Attribute_20_Value">1.0</span>" the element and its content are based on the OpenDocument v1.0 specification <a title="Open Document Format for Office Applications (OpenDocument) v1.0" href="http://docs.oasis-open.org/office/v1.0/OpenDocument-v1.0-os.pdf">[ODF10]</a>. When an <span class="Attribute">office:version</span>-requiring element has <span class="Attribute">office:version</span> omitted, the element is based on a version of the OpenDocument specification earlier than v1.2. </p><p class="Text_20_body"><span class="Note_20_Label">Note 2:</span>An OpenDocument 1.2 document that relies solely on features of a previous OpenDocument specification that are upward-compatible with OpenDocument 1.2, can be interpreted correctly under that earlier specification by treating the office:version=""1.2" attribute as omitted or as identifying the earlier version.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">office:version</span> attribute is usable with the following elements: <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>, <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a>, <span class="Element">&lt;office:document-meta&gt;</span> <a href="#element-office_document-meta">3.1.3.4</a>, <span class="Element">&lt;office:document-settings&gt;</span> <a href="#element-office_document-settings">3.1.3.5</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The only value of the <span class="Attribute">office:version</span> attribute is <span class="Attribute_20_Value">1.2</span>.</p><h2 class="Heading_20_2"><a id="a19_387presentation_action"><span style="margin-right:0.127cm;">19.387</span></a><a id="__RefHeading__1417684_253892949"/><a id="attribute-presentation_action"/>presentation:action</h2><p class="Text_20_body">The <span class="Attribute">presentation:action</span> attribute specifies the type of action that is executed when an event is triggered. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:action</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">execute</span>: another application is launched when this event is triggered. The application is specified with the <span class="Attribute">xlink:href</span> attribute on the same <span class="Element">&lt;presentation:event-listener&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-out</span>: the object that contains this event is faded out when this event is triggered. The attributes <span class="Attribute">presentation:effect</span>, <span class="Attribute">presentation:direction</span>, <span class="Attribute">presentation:speed</span> and <span class="Attribute">presentation:start-scale</span> can be used to set the effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">first-page</span>: the presentation jumps to the first page of the current document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hide</span>: the object that contains this event is hidden if the event is triggered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">last-page</span>: the presentation jumps to the last page of the current document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">last-visited-page</span>: the presentation jumps to the page that was displayed before the current page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">next-page</span>: the presentation jumps to the next page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no action is performed when this event is triggered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">previous-page</span>: the presentation jumps to the previous page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">show</span>: the target of an IRI is opened when this event is triggered. The IRI is specified with the <span class="Attribute">xlink:href</span> attribute on the same <span class="Element">&lt;presentation:event-listener&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sound</span>: an audio effect is started when the effect is triggered. The audio effect is described by a <span class="Element">&lt;presentation:sound&gt;</span> child element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stop</span>: if a slide show is active, it will be stopped.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">verb</span>: if the object that contains this event supports the execution of <a title="Inside OLE">[OLE]</a> verbs, the verb with the id set in the <span class="Attribute">presentation:verb</span> attribute is executed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:action</span> attribute is usable with the following element: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:action</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">previous-page</span>, <span class="Attribute_20_Value">next-page</span>, <span class="Attribute_20_Value">first-page</span>, <span class="Attribute_20_Value">last-page</span>, <span class="Attribute_20_Value">hide</span>, <span class="Attribute_20_Value">stop</span>, <span class="Attribute_20_Value">execute</span>, <span class="Attribute_20_Value">show</span>, <span class="Attribute_20_Value">verb</span>, <span class="Attribute_20_Value">fade-out</span>, <span class="Attribute_20_Value">sound</span> or <span class="Attribute_20_Value">last-visited-page</span>.</p><h2 class="Heading_20_2"><a id="a19_388presentation_animations"><span style="margin-right:0.127cm;">19.388</span></a><a id="__RefHeading__1417686_253892949"/><a id="attribute-presentation_animations"/>presentation:animations</h2><p class="Text_20_body">The <span class="Attribute">presentation:animations</span> attribute enables or disables the playback of animations that are specified within embedded or linked images during a presentation. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:animations</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">disabled</span>: image animations cannot be played during a presentation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">enabled</span>: image animations can be played during a presentation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">enabled</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:animations</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:animations</span> attribute are <span class="Attribute_20_Value">enabled</span> or <span class="Attribute_20_Value">disabled</span>.</p><h2 class="Heading_20_2"><a id="a19_389presentation_class"><span style="margin-right:0.127cm;">19.389</span></a><a id="__RefHeading__1417688_253892949"/><a id="attribute-presentation_class"/>presentation:class</h2><p class="Text_20_body">The <span class="Attribute">presentation:class</span> attribute classifies presentation shapes by their usage within a draw page. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:class</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chart</span>: presentation charts are standard object shapes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">graphic</span>: presentation graphics are standard graphic shapes<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">handout</span>: presentation handouts are placeholder for the drawing page in a handout page<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">notes</span>: presentation notes are used on notes pages<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">object</span>: presentation objects are standard object shapes<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">orgchart</span>: presentation organization charts are standard object shapes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outline</span>: outlines are standard text shapes<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">page</span>: presentation pages are used on notes pages<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">subtitle</span>: subtitles are standard text shapes<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">table</span>: presentation tables are standard object shapes<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">text</span>: presentation texts are standard text shapes<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">title</span>: titles are standard text shapes<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute_20_Value">date-time</span>, <span class="Attribute_20_Value">footer</span>, <span class="Attribute_20_Value">header</span>, and <span class="Attribute_20_Value">page-number</span> classes can be used only for drawing shapes that are contained in master pages. Depending on the settings of the <span class="Element">&lt;style:master-page&gt;</span> element, they are displayed automatically on drawing pages that use the master page.</p><p class="Text_20_body">When used with drawing shapes contained in master pages, the defined values for the <span class="Attribute">presentation:class</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">date-time</span>: drawing shape is used as a date and/or time shape. Date and Time shapes are standard text shapes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">footer</span>: drawing shape is used as a footer. Footer shapes are standard text shapes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">header</span>: drawing shape is used as a header. Header shapes are standard text shapes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">page-number</span>: drawing shape is used as a page number shape. Page Number shapes are standard text shapes.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:class</span> attribute is usable with the following elements: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a> and <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:class</span> attribute are <span class="Attribute_20_Value">title</span>, <span class="Attribute_20_Value">outline</span>, <span class="Attribute_20_Value">subtitle</span>, <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">graphic</span>, <span class="Attribute_20_Value">object</span>, <span class="Attribute_20_Value">chart</span>, <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">orgchart</span>, <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">notes</span>, <span class="Attribute_20_Value">handout</span>, <span class="Attribute_20_Value">header</span>, <span class="Attribute_20_Value">footer</span>, <span class="Attribute_20_Value">date-time</span> or <span class="Attribute_20_Value">page-number</span>.</p><h2 class="Heading_20_2"><a id="a19_390presentation_class-names"><span style="margin-right:0.127cm;">19.390</span></a><a id="__RefHeading__1417690_253892949"/><a id="attribute-presentation_class-names"/>presentation:class-names</h2><p class="Text_20_body">The <span class="Attribute">presentation:class-names</span> attribute specifies a white space separated list of styles with the family value of <span class="Attribute_20_Value">presentation</span>. The referenced styles are applied in the order they are contained in the list. </p><p class="Text_20_body">If both <span class="Attribute">presentation:style-name</span> and <span class="Attribute">presentation:class-names</span> are present, the style referenced by the <span class="Attribute">presentation:style-name</span> attribute is applied before the styles referenced by the <span class="Attribute">presentation:class-names</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:class-names</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:class-names</span> attribute has the data type <span class="Datatype">styleNameRefs</span> <a href="#datatype-styleNameRefs">18.3.33</a>.</p><h2 class="Heading_20_2"><a id="a19_391presentation_delay"><span style="margin-right:0.127cm;">19.391</span></a><a id="__RefHeading__1417692_253892949"/><a id="attribute-presentation_delay"/>presentation:delay</h2><p class="Text_20_body">The <span class="Attribute">presentation:delay</span> attribute specifies the delay before a presentation effect starts after the previous one has finished.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:delay</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:delay</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_392presentation_direction"><span style="margin-right:0.127cm;">19.392</span></a><a id="__RefHeading__1417694_253892949"/><a id="attribute-presentation_direction"/>presentation:direction</h2><p class="Text_20_body">The <span class="Attribute">presentation:direction</span> attribute specifies the direction of an effect. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">clockwise</span>: effect moves in a clockwise direction.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">counter-clockwise</span>: effect moves in a counter-clockwise direction.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-bottom</span>: effect moves from the bottom of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-center</span>: effect moves from the center of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-left</span>: effect moves from the left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-right</span>: effect moves from the right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-top</span>: effect moves from the top of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-lower-left</span>: effect moves from the lower-left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-lower-right</span>: effect moves from the lower-right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-upper-left</span>: effect moves from the upper-left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-upper-right</span>: effect moves from the upper-right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal</span>: effect moves from the bottom of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no presentation effect direction<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">path</span>: effect moves from the bottom of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiral-inward-left</span>: effect spirals inward from the left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiral-inward-right</span>: effect spirals inward from the right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiral-outward-left</span>: effect spirals outward to the left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiral-outward-right</span>: effect spirals outward to the right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-left</span>: effect moves to the left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-top</span>: effect moves to the top of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-right</span>: effect moves to the right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-bottom</span>: effect moves to the bottom of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-center</span>: effect moves from the center of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-lower-left</span>: effect moves to the lower-left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-upper-left</span>: effect moves to the upper-left of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-lower-right</span>: effect moves to the lower-right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">to-upper-right</span>: effect moves to the upper-right of the presentation area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: effect moves vertically in the presentation area.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:direction</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:direction</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">from-left</span>, <span class="Attribute_20_Value">from-top</span>, <span class="Attribute_20_Value">from-right</span>, <span class="Attribute_20_Value">from-bottom</span>, <span class="Attribute_20_Value">from-center</span>, <span class="Attribute_20_Value">from-upper-left</span>, <span class="Attribute_20_Value">from-upper-right</span>, <span class="Attribute_20_Value">from-lower-left</span>, <span class="Attribute_20_Value">from-lower-right</span>, <span class="Attribute_20_Value">to-left</span>, <span class="Attribute_20_Value">to-top</span>, <span class="Attribute_20_Value">to-right</span>, <span class="Attribute_20_Value">to-bottom</span>, <span class="Attribute_20_Value">to-upper-left</span>, <span class="Attribute_20_Value">to-upper-right</span>, <span class="Attribute_20_Value">to-lower-right</span>, <span class="Attribute_20_Value">to-lower-left</span>, <span class="Attribute_20_Value">path</span>, <span class="Attribute_20_Value">spiral-inward-left</span>, <span class="Attribute_20_Value">spiral-inward-right</span>, <span class="Attribute_20_Value">spiral-outward-left</span>, <span class="Attribute_20_Value">spiral-outward-right</span>, <span class="Attribute_20_Value">vertical</span>, <span class="Attribute_20_Value">horizontal</span>, <span class="Attribute_20_Value">to-center</span>, <span class="Attribute_20_Value">clockwise</span> or <span class="Attribute_20_Value">counter-clockwise</span>.</p><h2 class="Heading_20_2"><a id="a19_393presentation_endless"><span style="margin-right:0.127cm;">19.393</span></a><a id="__RefHeading__1417696_253892949"/><a id="attribute-presentation_endless"/>presentation:endless</h2><p class="Text_20_body">The <span class="Attribute">presentation:endless</span> attribute specifies is a presentation repeats indefinitely or not.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:endless</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: presentation does not repeat indefinitely.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: presentation repeats indefinitely.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:endless</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:endless</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_394presentation_effect"><span style="margin-right:0.127cm;">19.394</span></a><a id="__RefHeading__1417698_253892949"/><a id="attribute-presentation_effect"/>presentation:effect</h2><p class="Text_20_body">The <span class="Attribute">presentation:effect</span> attribute specifies the type of an effect.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:effect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">appear</span>: the shape is faded in by just switching its state from invisible to visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">checkerboard</span>: the shape is faded in or out by drawing or removing checkerboard like blocks that increase in size over time.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">close</span>: the shape is drawn or removed line by line, either horizontally or vertically, starting at the edge of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dissolve</span>: the shape is faded in or out by drawing or removing small blocks in a random fashion.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade</span>: the shape fades from its visible or hidden state to a hidden or visible state.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hide</span>: the shape is faded out by just switching its state from visible to invisible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">laser</span>: this effect is only available for text shapes; the characters of the text are moved one by one from the top edge of the screen to their final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">lines</span>: the shape is faded in and out by drawing or removing line by line, either horizontally or vertically, in a random fashion.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move</span>: the shape moves from or to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-short</span>: like the move effect, but the moving shape is clipped to its final bounding rectangle during fade.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no effect is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">open</span>: the shape is drawn or removed line by line, either horizontally or vertically, starting at the center of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">random</span>: an effect is chosen at random to fade the shape in or out.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">rotate</span>: the shape rotates horizontally or vertically for a short amount of time during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch</span>: the shape is faded in or out by changing its size during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stripes</span>: the shape is faded in or out by drawing or removing horizontal or vertical stripes that change their size.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wavyline</span>: the shape is faded in and out by drawing or removing small blocks in a snake like fashion.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:effect</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:effect</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">fade</span>, <span class="Attribute_20_Value">move</span>, <span class="Attribute_20_Value">stripes</span>, <span class="Attribute_20_Value">open</span>, <span class="Attribute_20_Value">close</span>, <span class="Attribute_20_Value">dissolve</span>, <span class="Attribute_20_Value">wavyline</span>, <span class="Attribute_20_Value">random</span>, <span class="Attribute_20_Value">lines</span>, <span class="Attribute_20_Value">laser</span>, <span class="Attribute_20_Value">appear</span>, <span class="Attribute_20_Value">hide</span>, <span class="Attribute_20_Value">move-short</span>, <span class="Attribute_20_Value">checkerboard</span>, <span class="Attribute_20_Value">rotate</span> or <span class="Attribute_20_Value">stretch</span>.</p><h2 class="Heading_20_2"><a id="a19_395presentation_force-manual"><span style="margin-right:0.127cm;">19.395</span></a><a id="__RefHeading__1417700_253892949"/><a id="attribute-presentation_force-manual"/>presentation:force-manual</h2><p class="Text_20_body">The <span class="Attribute">presentation:force-manual</span> attribute specifies that the value of the <span class="Attribute">presentation:transition-type</span> attribute is set to <span class="Attribute_20_Value">manual</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:force-manual</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: <span class="Attribute">presentation:transition-type</span> attribute is not set to manual.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: <span class="Attribute">presentation:</span><span class="Attribute">transition-type</span> attribute is set to manual.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:force-manual</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:force-manual</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_396presentation_full-screen"><span style="margin-right:0.127cm;">19.396</span></a><a id="__RefHeading__1417702_253892949"/><a id="attribute-presentation_full-screen"/>presentation:full-screen</h2><p class="Text_20_body">The <span class="Attribute">presentation:full-screen</span> attribute specifies whether the presentation is displayed in full screen mode or in a window.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:full-screen</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: presentation is displayed in a window.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: presentation is displayed in full screen mode.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:full-screen</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:full-screen</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_397presentation_group-id"><span style="margin-right:0.127cm;">19.397</span></a><a id="__RefHeading__1417704_253892949"/><a id="attribute-presentation_group-id"/>presentation:group-id</h2><p class="Text_20_body">The <span class="Attribute">presentation:group-id</span> attribute specifies a group id. This id can be used to group animation elements within a user interface, where a group consists of all animation elements that have the same group id.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:group-id</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:group-id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_398presentation_master-element"><span style="margin-right:0.127cm;">19.398</span></a><a id="__RefHeading__1417706_253892949"/><a id="attribute-presentation_master-element"/>presentation:master-element</h2><p class="Text_20_body">The <span class="Attribute">presentation:master-element</span> attribute specifies the id of an animation element.</p><p class="Note"><span class="Note_20_Label">Note:</span> Consumer user interfaces may consider animation elements that have a <span class="Attribute">presentation:master-element</span> attribute to be a part of the animation element that is referenced, and may therefore exclude them from any lists of defined animations. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:master-element</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:master-element</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_399presentation_mouse-as-pen"><span style="margin-right:0.127cm;">19.399</span></a><a id="__RefHeading__1417708_253892949"/><a id="attribute-presentation_mouse-as-pen"/>presentation:mouse-as-pen</h2><p class="Text_20_body">The <span class="Attribute">presentation:mouse-as-pen</span> attribute specifies if a mouse pointer is displayed as a pen or a pointer. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:mouse-as-pen</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: mouse pointer is used as a pointer.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: mouse pointer is used for drawing.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:mouse-as-pen</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:mouse-as-pen</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_400presentation_mouse-visible"><span style="margin-right:0.127cm;">19.400</span></a><a id="__RefHeading__1417710_253892949"/><a id="attribute-presentation_mouse-visible"/>presentation:mouse-visible</h2><p class="Text_20_body">The <span class="Attribute">presentation:mouse-visible</span> attribute specifies whether a mouse pointer is visible during a presentation.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:mouse-visible</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: mouse not visible during presentation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: mouse visible during presentation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:mouse-visible</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:mouse-visible</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_401presentation_name"><span style="margin-right:0.127cm;">19.401</span></a><a id="__RefHeading__1417712_253892949"/><a id="attribute-presentation_name"/>presentation:name</h2><p class="Text_20_body">The <span class="Attribute">presentation:name</span> attribute identifies the element on which it appears inside a presentation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:name</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:date-time-decl&gt;</span> <a href="#element-presentation_date-time-decl">10.9.3.6</a>, <span class="Element">&lt;presentation:footer-decl&gt;</span> <a href="#element-presentation_footer-decl">10.9.3.4</a>, <span class="Element">&lt;presentation:header-decl&gt;</span> <a href="#element-presentation_header-decl">10.9.3.2</a> and <span class="Element">&lt;presentation:show&gt;</span> <a href="#element-presentation_show">10.9.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_402presentation_node-type"><span style="margin-right:0.127cm;">19.402</span></a><a id="__RefHeading__1417714_253892949"/><a id="attribute-presentation_node-type"/>presentation:node-type</h2><p class="Text_20_body">The <span class="Attribute">presentation:node-type</span> attribute specifies a node type for an animation element. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:node-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">after-previous</span>: this animation element is the root element of an effect that starts after the previous effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">default</span>: no node type is defined. This is the default setting.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">interactive-sequence</span>: this animation element is the root element for a sequence of effects that are started when the user selects an element inside a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">main-sequence</span>: this animation element is the root element for the main sequence of effects of a page<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">on-click</span>: this animation element is the root element of an effect that starts with a user click.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">timing-root</span>: this animation element is the root element for the animation of a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">with-previous</span>: this animation element is the root element of an effect that starts with the previous effect.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> Click is the action of a computer user moving a cursor or focus to a location on a screen (point) and then pressing a mouse button, usually the left button(click), or other pointing device. A click can be used with any number of input devices varying from mice, touch pads, keyboards, joysticks, scroll buttons, and roller balls. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">default</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:node-type</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:node-type</span> attribute are <span class="Attribute_20_Value">default</span>, <span class="Attribute_20_Value">on-click</span>, <span class="Attribute_20_Value">with-previous</span>, <span class="Attribute_20_Value">after-previous</span>, <span class="Attribute_20_Value">timing-root</span>, <span class="Attribute_20_Value">main-sequence</span> or <span class="Attribute_20_Value">interactive-sequence</span>.</p><h2 class="Heading_20_2"><a id="a19_403presentation_object"><span style="margin-right:0.127cm;">19.403</span></a><a id="__RefHeading__1417716_253892949"/><a id="attribute-presentation_object"/>presentation:object</h2><p class="Text_20_body">The <span class="Attribute">presentation:object</span> attribute specifies the type of object that a <span class="Element">&lt;presentation:placeholder&gt;</span> element represents. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:object</span> attribute are the same as those defined for the <span class="Attribute">presentation:class</span> attribute. <a href="#attribute-presentation_class">19.389</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:object</span> attribute is usable with the following element: <span class="Element">&lt;presentation:placeholder&gt;</span> <a href="#element-presentation_placeholder">16.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:object</span> attribute are <span class="Attribute_20_Value">title</span>, <span class="Attribute_20_Value">outline</span>, <span class="Attribute_20_Value">subtitle</span>, <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">graphic</span>, <span class="Attribute_20_Value">object</span>, <span class="Attribute_20_Value">chart</span>, <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">orgchart</span>, <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">notes</span>, <span class="Attribute_20_Value">handout</span>, <span class="Attribute_20_Value">header</span>, <span class="Attribute_20_Value">footer</span>, <span class="Attribute_20_Value">date-time</span> or <span class="Attribute_20_Value">page-number</span>.</p><h2 class="Heading_20_2"><a id="a19_404presentation_pages"><span style="margin-right:0.127cm;">19.404</span></a><a id="__RefHeading__1417718_253892949"/><a id="attribute-presentation_pages"/>presentation:pages</h2><p class="Text_20_body">The <span class="Attribute">presentation:pages</span> attribute specifies a comma “,” (U+002C, COMMA) separated list of page names as given by <span class="Attribute">draw:name</span> attributes on <span class="Element">&lt;draw:page&gt;</span> elements. The pages are displayed in the order in which they are listed during a presentation that uses this show. Pages can be included more than once.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:pages</span> attribute is usable with the following element: <span class="Element">&lt;presentation:show&gt;</span> <a href="#element-presentation_show">10.9.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:pages</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_405presentation_path-id"><span style="margin-right:0.127cm;">19.405</span></a><a id="__RefHeading__1417720_253892949"/><a id="attribute-presentation_path-id"/>presentation:path-id</h2><p class="Text_20_body">The <span class="Attribute">presentation:path-id</span> attribute specifies a polygon shape by the value of its <span class="Attribute">draw:shape-id</span> attribute. An effect moves along the lines of the specified polygon. The referenced polygon is not visible during the presentation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:path-id</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:path-id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_406presentation_pause"><span style="margin-right:0.127cm;">19.406</span></a><a id="__RefHeading__1417722_253892949"/><a id="attribute-presentation_pause"/>presentation:pause</h2><p class="Text_20_body">The <span class="Attribute">presentation:pause</span> attribute specifies a time duration for displaying a pause screen before the presentation is played again if the presentation is to be repeated indefinitely. If this attribute is not set or has a value of <span class="Attribute_20_Value_20_Instance">P0s</span>, a pause screen is not displayed in endless mode.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:pause</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:pause</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_407presentation_placeholder"><span style="margin-right:0.127cm;">19.407</span></a><a id="__RefHeading__1417724_253892949"/><a id="attribute-presentation_placeholder"/>presentation:placeholder</h2><p class="Text_20_body">The <span class="Attribute">presentation:placeholder</span> attribute specifies if a shape is a placeholder or a presentation object with content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:placeholder</span> attribute is usable with the following elements: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a> and <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:placeholder</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_408presentation_play-full"><span style="margin-right:0.127cm;">19.408</span></a><a id="__RefHeading__1417726_253892949"/><a id="attribute-presentation_play-full"/>presentation:play-full</h2><p class="Text_20_body">The <span class="Attribute">presentation:play-full</span> attribute specifies when an effect starts.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:play-full</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: effect starts after current effect ends.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: effect starts after the sound specified by its parent <span class="Element">&lt;presentation:sound&gt;</span> element ends.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:play-full</span> attribute is usable with the following element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:play-full</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_409presentation_presentation-page-layout-name"><span style="margin-right:0.127cm;">19.409</span></a><a id="__RefHeading__1417728_253892949"/><a id="attribute-presentation_presentation-page-layout-name"/>presentation:presentation-page-layout-name</h2><p class="Text_20_body">The <span class="Attribute">presentation:presentation-page-layout-name</span> attribute references the <span class="Attribute">style:name</span> attribute of a <span class="Element">&lt;style:presentation-page-layout&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:presentation-page-layout-name</span> attribute is usable with the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a> and <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:presentation-page-layout-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_410presentation_preset-class"><span style="margin-right:0.127cm;">19.410</span></a><a id="__RefHeading__1417730_253892949"/><a id="attribute-presentation_preset-class"/>presentation:preset-class</h2><p class="Text_20_body">The <span class="Attribute">presentation:preset-class</span> attribute specifies the class of the preset that was used to create an animation element. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:preset-class</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom</span>: the preset was a user defined one. This is the default setting.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">entrance</span>: the preset was an entrance effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">exit</span>: the preset was an exit effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">emphasis</span>: the preset was an emphasis effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">motion-path</span>: the preset was a motion path.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ole-action</span>: the preset was an ole action.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">media-call</span>: the preset was a media call.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">custom</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:preset-class</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:preset-class</span> attribute are <span class="Attribute_20_Value">custom</span>, <span class="Attribute_20_Value">entrance</span>, <span class="Attribute_20_Value">exit</span>, <span class="Attribute_20_Value">emphasis</span>, <span class="Attribute_20_Value">motion-path</span>, <span class="Attribute_20_Value">ole-action</span> or <span class="Attribute_20_Value">media-call</span>.</p><h2 class="Heading_20_2"><a id="a19_411presentation_preset-id"><span style="margin-right:0.127cm;">19.411</span></a><a id="__RefHeading__1417732_253892949"/><a id="attribute-presentation_preset-id"/>presentation:preset-id</h2><p class="Text_20_body">The <span class="Attribute">presentation:preset-id</span> attribute specifies the name of the preset that was used to create an animation element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:preset-id</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:preset-id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_412presentation_preset-sub-type"><span style="margin-right:0.127cm;">19.412</span></a><a id="__RefHeading__1417734_253892949"/><a id="attribute-presentation_preset-sub-type"/>presentation:preset-sub-type</h2><p class="Text_20_body">The <span class="Attribute">presentation:preset-sub-type</span> attribute specifies the sub type of the preset that was used to create an animation element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:preset-sub-type</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:preset-sub-type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_413presentation_show"><span style="margin-right:0.127cm;">19.413</span></a><a id="__RefHeading__1417736_253892949"/><a id="attribute-presentation_show"/>presentation:show</h2><p class="Text_20_body">The <span class="Attribute">presentation:show</span> attribute specifies the name of a <span class="Element">&lt;presentation:show&gt;</span> element that is used for the presentation. If the <span class="Attribute">presentation:start-page</span> attribute is set, it overrides the value of this attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:show</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:show</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_414presentation_show-end-of-presentation-slide"><span style="margin-right:0.127cm;">19.414</span></a><a id="__RefHeading__1417738_253892949"/><a id="attribute-presentation_show-end-of-presentation-slide"/>presentation:show-end-of-presentation-slide</h2><p class="Text_20_body">The <span class="Attribute">presentation:show-end-of-presentation-slide</span> attribute specifies whether an additional slide should be shown at the end of the presentation, indicating the presentation is finished.</p><p class="Text_20_body">The slide content is not defined within the document, but is implementation-defined.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:show-end-of-presentation-slide</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: end of presentation slide not shown at end of presentation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: end of presentation slide shown at end of presentation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:show-end-of-presentation-slide</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:show-end-of-presentation-slide</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_415presentation_show-logo"><span style="margin-right:0.127cm;">19.415</span></a><a id="__RefHeading__1417740_253892949"/><a id="attribute-presentation_show-logo"/>presentation:show-logo</h2><p class="Text_20_body">The <span class="Attribute">presentation:show-logo</span> attribute specifies whether an implementation-defined logo is shown on a pause screen.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:show-logo</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: logo not shown on pause screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: logo shown on pause screen.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:show-logo</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:show-logo</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_416presentation_source"><span style="margin-right:0.127cm;">19.416</span></a><a id="__RefHeading__1417742_253892949"/><a id="attribute-presentation_source"/>presentation:source</h2><p class="Text_20_body">The <span class="Attribute">presentation:source</span> attribute specifies whether the current date/time or the fixed content of the field declaration is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:source</span> attribute is usable with the following element: <span class="Element">&lt;presentation:date-time-decl&gt;</span> <a href="#element-presentation_date-time-decl">10.9.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:source</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">current-date</span>.</p><h2 class="Heading_20_2"><a id="a19_417presentation_speed"><span style="margin-right:0.127cm;">19.417</span></a><a id="__RefHeading__1417744_253892949"/><a id="attribute-presentation_speed"/>presentation:speed</h2><p class="Text_20_body">The <span class="Attribute">presentation:speed</span> attribute specifies the speed of an effect.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:speed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fast</span>: An implementation-defined speed. The <span class="Attribute_20_Value">fast</span> speed should be faster than the speed the implementation chooses for the values <span class="Attribute_20_Value">medium</span> and <span class="Attribute_20_Value">slow</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">medium</span>: An implementation-defined speed. The <span class="Attribute_20_Value">medium</span> speed should be faster than the speed the implementation chooses for the value <span class="Attribute_20_Value">slow</span>, and slower than the speed the implementation chooses for the value <span class="Attribute_20_Value">fast</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">slow</span>: An implementation-defined speed. The <span class="Attribute_20_Value">slow</span> speed should be slower than the speed the implementation chooses for the values <span class="Attribute_20_Value">medium</span> and <span class="Attribute_20_Value">fast</span>. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The rates specified by these values are implementation-defined.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">medium</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:speed</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:play&gt;</span> <a href="#element-presentation_play">10.8.8</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:speed</span> attribute are <span class="Attribute_20_Value">slow</span>, <span class="Attribute_20_Value">medium</span> or <span class="Attribute_20_Value">fast</span>.</p><h2 class="Heading_20_2"><a id="a19_418presentation_start-scale"><span style="margin-right:0.127cm;">19.418</span></a><a id="__RefHeading__1417746_253892949"/><a id="attribute-presentation_start-scale"/>presentation:start-scale</h2><p class="Text_20_body">The <span class="Attribute">presentation:start-scale</span> attribute specifies the start size of a shape as a percentage of its original size. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">100%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:start-scale</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:hide-shape&gt;</span> <a href="#element-presentation_hide-shape">10.8.5</a>, <span class="Element">&lt;presentation:hide-text&gt;</span> <a href="#element-presentation_hide-text">10.8.6</a>, <span class="Element">&lt;presentation:show-shape&gt;</span> <a href="#element-presentation_show-shape">10.8.3</a> and <span class="Element">&lt;presentation:show-text&gt;</span> <a href="#element-presentation_show-text">10.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:start-scale</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_419presentation_start-page"><span style="margin-right:0.127cm;">19.419</span></a><a id="__RefHeading__1417748_253892949"/><a id="attribute-presentation_start-page"/>presentation:start-page</h2><p class="Text_20_body">The <span class="Attribute">presentation:start-page</span> attribute specifies the name of the page on which the presentation starts. If this attribute is set, it overrides the <span class="Attribute">presentation:show</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:start-page</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:start-page</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_420presentation_start-with-navigator"><span style="margin-right:0.127cm;">19.420</span></a><a id="__RefHeading__1417750_253892949"/><a id="attribute-presentation_start-with-navigator"/>presentation:start-with-navigator</h2><p class="Text_20_body">The <span class="Attribute">presentation:start-with-navigator</span> attribute specifies whether a navigator window is initially displayed during a presentation.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:start-with-navigator</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: navigator window not displayed initially during a presentation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: navigator window displayed initially during a presentation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:start-with-navigator</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:start-with-navigator</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_421presentation_stay-on-top"><span style="margin-right:0.127cm;">19.421</span></a><a id="__RefHeading__1417752_253892949"/><a id="attribute-presentation_stay-on-top"/>presentation:stay-on-top</h2><p class="Text_20_body">The <span class="Attribute">presentation:stay-on-top</span> attribute specifies whether a presentation window is displayed on top of other windows during a presentation.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:stay-on-top</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: presentation window need not be displayed on top of other windows during a presentation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: presentation window displayed on top of other windows during a presentation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:stay-on-top</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:stay-on-top</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_422presentation_style-name"><span style="margin-right:0.127cm;">19.422</span></a><a id="__RefHeading__1417754_253892949"/><a id="attribute-presentation_style-name"/>presentation:style-name</h2><p class="Text_20_body">The <span class="Attribute">presentation:style-name</span> attribute specifies a style for a presentation shape. </p><p class="Text_20_body">The value of the attribute is the name of a <span class="Element">&lt;style:style&gt;</span> element that has a family value of <span class="Attribute_20_Value">presentation</span>. The formatting properties of the specified style and its parent styles are used to format the shape.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:style-name</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_423presentation_transition-on-click"><span style="margin-right:0.127cm;">19.423</span></a><a id="__RefHeading__1417756_253892949"/><a id="attribute-presentation_transition-on-click"/>presentation:transition-on-click</h2><p class="Text_20_body">The <span class="Attribute">presentation:transition-on-click</span> attributes specifies whether a mouse click on a slide during a presentation triggers a transition. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:transition-on-click</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">disabled</span>: mouse click on a slide during a presentation does not trigger a transition.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">nabled</span>: mouse click on a slide during a presentation triggers a transition. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">enabled</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">presentation:transition-on-click</span> attribute is usable with the following element: <span class="Element">&lt;presentation:settings&gt;</span> <a href="#element-presentation_settings">10.9.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:transition-on-click</span> attribute are <span class="Attribute_20_Value">enabled</span> or <span class="Attribute_20_Value">disabled</span>.</p><h2 class="Heading_20_2"><a id="a19_424presentation_use-date-time-name"><span style="margin-right:0.127cm;">19.424</span></a><a id="__RefHeading__1417758_253892949"/><a id="attribute-presentation_use-date-time-name"/>presentation:use-date-time-name</h2><p class="Text_20_body">The <span class="Attribute">presentation:use-date-time-name</span> attribute specifies the name of the <span class="Element">&lt;presentation:date-time-decl&gt;</span> that is used for all <span class="Element">&lt;presentation:date-time&gt;</span> elements that are displayed on a page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:use-date-time-name</span> attribute is usable with the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a> and <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:use-date-time-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_425presentation_use-footer-name"><span style="margin-right:0.127cm;">19.425</span></a><a id="__RefHeading__1417760_253892949"/><a id="attribute-presentation_use-footer-name"/>presentation:use-footer-name</h2><p class="Text_20_body">The <span class="Attribute">presentation:use-footer-name</span> attribute specifies the name of the <span class="Element">&lt;presentation:footer-decl&gt;</span> element that is used for all <span class="Element">&lt;presentation:footer&gt;</span> elements that are displayed on a page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:use-footer-name</span> attribute is usable with the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a> and <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:use-footer-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_426presentation_use-header-name"><span style="margin-right:0.127cm;">19.426</span></a><a id="__RefHeading__1417762_253892949"/><a id="attribute-presentation_use-header-name"/>presentation:use-header-name</h2><p class="Text_20_body">The <span class="Attribute">presentation:use-header-name</span> attribute specifies the name of the <span class="Element">&lt;presentation:header-decl&gt;</span> element that is used for all <span class="Element">&lt;presentation:header&gt;</span> elements that are displayed on a page.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:use-header-name</span> attribute is usable with the following elements: <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a> and <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:use-header-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_427presentation_user-transformed"><span style="margin-right:0.127cm;">19.427</span></a><a id="__RefHeading__1417764_253892949"/><a id="attribute-presentation_user-transformed"/>presentation:user-transformed</h2><p class="Text_20_body">The <span class="Attribute">presentation:user-transformed</span> attribute specifies whether the size and position of the shape is set by the user or is set by the corresponding presentation shape on the master page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:user-transformed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: size and position of shape set by corresponding presentation shape on master page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: size and position of shape set by user. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:user-transformed</span> attribute is usable with the following elements: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a> and <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:user-transformed</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_428presentation_verb"><span style="margin-right:0.127cm;">19.428</span></a><a id="__RefHeading__1417766_253892949"/><a id="attribute-presentation_verb"/>presentation:verb</h2><p class="Text_20_body">The <span class="Attribute">presentation:verb</span> attribute specifies the <a title="Inside OLE">[OLE]</a> verb that is executed for event listeners of type <span class="Attribute_20_Value">verb</span> at the object that contains this event.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:verb</span> attribute is usable with the following element: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:verb</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_429script_event-name"><span style="margin-right:0.127cm;">19.429</span></a><a id="__RefHeading__1417768_253892949"/><a id="attribute-script_event-name"/>script:event-name</h2><p class="Text_20_body">The <span class="Attribute">script:event-name</span> attribute specifies the name of an event. </p><p class="Text_20_body">Event names should begin with a namespace prefix followed by a “:” (U+003A, COLON).</p><p class="Text_20_body">Where appropriate, producers should use the event names described in <a title="Document Object Model (DOM) Level 2 Events Specification" href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113">[DOMEvents2]</a>. The corresponding namespace is “http://www.w3.org/2001/xml-events”.</p><p class="Note"><span class="Note_20_Label">Note:</span> Event names defined in <a title="Document Object Model (DOM) Level 2 Events Specification" href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113">[DOMEvents2]</a> are not namespaced. If used in OpenDocument, they should be preceded by a namespace prefix as described above</p><p class="Text_20_body">Table <a href="#refTable14">15</a> specifies events defined in <a title="Document Object Model (DOM) Level 2 Events Specification" href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113">[DOMEvents2]</a> that have an equivalent event in HTML. The namespace used for these events is “http://www.w3.org/2001/xml-events”“. The namespace prefix used in this specification is “dom”.</p><p class="Table">Table  <a id="refTable14"/>15 Script Events</p><table border="0" cellspacing="0" cellpadding="0" class="Table7"><colgroup><col width="200"/><col width="135"/><col width="331"/></colgroup><tr><td style="text-align:left;width:1.8014in; " class="Table7_A1"><p class="Table_20_Heading">Value of <span class="Attribute">script:event-name</span> Attribute</p></td><td style="text-align:left;width:1.2188in; " class="Table7_A1"><p class="Table_20_Heading">Equivalent HTML Event</p></td><td style="text-align:left;width:2.9799in; " class="Table7_C1"><p class="Table_20_Heading">Description of Event</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:change</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onchange</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a control is no longer focused and the value of the control was modified since it was given focus.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:DOMFocusIn</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onfocus</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a control is given focus using the mouse or the TAB key.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:DOMFocusOut</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onblur</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a control is no longer focused as a result of moving the mouse or by tabbing navigation. It may be used with the same elements as <span class="Attribute_20_Value_20_Instance">form:on-focus</span>.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:</span><span class="Source_20_Text">mousedown</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onmousedown</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a mouse button is pressed on a control.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:</span><span class="Source_20_Text">mousemove</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onmousemove</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when the mouse pointer is moved onto a control.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:</span><span class="Source_20_Text">mouseover</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onmouseover</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when the mouse pointer is moved over the control.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:</span><span class="Source_20_Text">mouseup</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onmouseup</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a mouse button is released on a control.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:mouseout</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onmouseout</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when the mouse pointer is moved away from a control.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:</span><span class="Source_20_Text">reset</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onreset</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a form is reset.</p></td></tr><tr><td style="text-align:left;width:1.8014in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">dom:</span><span class="Source_20_Text">submit</span></p></td><td style="text-align:left;width:1.2188in; " class="Table7_A2"><p class="Table_20_Contents"><span class="Source_20_Text">onsubmit</span></p></td><td style="text-align:left;width:2.9799in; " class="Table7_C2"><p class="Table_20_Contents">Occurs when a form is submitted.</p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">script:event-name</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a> and <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">script:event-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_430script_language"><span style="margin-right:0.127cm;">19.430</span></a><a id="__RefHeading__1417770_253892949"/><a id="attribute-script_language"/>script:language</h2><p class="Text_20_body">The attribute <span class="Attribute">script:language</span> specifies the name of a script. Script language names are implementation-dependent. The names identifying script languages should begin with by a namespace prefix, followed by a ":" (U+003A, COLON) separator. If a namespace prefix is present, the local name of the attribute value is considered to be a name in the XML namespace bound to the namespace prefix.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">script:language</span> attribute is usable with the following elements: <span class="Element">&lt;office:script&gt;</span> <a href="#element-office_script">3.13</a>, <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a> and <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">script:language</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_431script_macro-name"><span style="margin-right:0.127cm;">19.431</span></a><a id="__RefHeading__1417772_253892949"/><a id="attribute-script_macro-name"/>script:macro-name</h2><p class="Text_20_body">The <span class="Attribute">script:macro-name</span> attribute specifies the name of a macro. The interpretation of the name is script language dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">script:macro-name</span> attribute is usable with the following element: <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">script:macro-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_432smil_accelerate"><span style="margin-right:0.127cm;">19.432</span></a><a id="__RefHeading__1417774_253892949"/><a id="attribute-smil_accelerate"/>smil:accelerate</h2><p class="Text_20_body">See §11.1.2 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body">The defined range for the <span class="Attribute">smil:accelerate</span> attribute is 0 to 1, inclusive. The default value for a <span class="Attribute">smil:accelerate</span> attribute is 0.0, meaning no acceleration. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0.0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:accelerate</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:accelerate</span> attribute has values of type <span class="Datatype">decimal</span> <a href="#datatype-decimal">18.2</a> in the range [<span class="Attribute_20_Value">0</span>,<span class="Attribute_20_Value">1</span>].</p><h2 class="Heading_20_2"><a id="a19_433smil_accumulate"><span style="margin-right:0.127cm;">19.433</span></a><a id="__RefHeading__1417776_253892949"/><a id="attribute-smil_accumulate"/>smil:accumulate</h2><p class="Text_20_body">See $3.4.3 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:accumulate</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:accumulate</span> attribute are <span class="Attribute_20_Value">none</span> or <span class="Attribute_20_Value">sum</span>.</p><h2 class="Heading_20_2"><a id="a19_434smil_additive"><span style="margin-right:0.127cm;">19.434</span></a><a id="__RefHeading__1417778_253892949"/><a id="attribute-smil_additive"/>smil:additive</h2><p class="Text_20_body">See $3.4.3 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:additive</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:additive</span> attribute are <span class="Attribute_20_Value">replace</span> or <span class="Attribute_20_Value">sum</span>.</p><h2 class="Heading_20_2"><a id="a19_435smil_attributeName"><span style="margin-right:0.127cm;">19.435</span></a><a id="__RefHeading__1417780_253892949"/><a id="attribute-smil_attributeName"/>smil:attributeName</h2><p class="Text_20_body">See §3.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">smil:attributeName</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">charColor</span>: animates the <span class="T2">element's</span> char color.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">charFontName</span>: animates the <span class="T2">element's</span> text font.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">charHeight</span>: animates the <span class="T2">element's</span> text height.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">charPosture</span>: animates the <span class="T2">element's</span> text posture.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">charUnderline</span>: animates the <span class="T2">element's</span> text underline.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">charWeight</span>: animates the <span class="T2">element's</span> text weight.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">color</span>: animates the <span class="T2">element's</span> color, this animates both fill,line and char color. Values can be RGB or HSL.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">fillColor</span>: animates the <span class="T2">element's</span> fill color.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">fillStyle</span>: animates the <span class="T2">element's</span> fill style.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">height</span>: animates the <span class="T2">element's</span> height, values are given in screen space where 0 is no height and 1 is the same height as the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">lineColor</span>: animates the <span class="T2">element's</span> line color.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">lineStyle</span>: animates the <span class="T2">element's</span> line style.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">opacity</span>: animates the <span class="T2">element's</span> opacity.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">rotate</span>: animates the <span class="T2">element's</span> rotation, this animates both the shapes and text animation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">skewX</span>: animates the <span class="T2">element's</span> horizontal skew.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">visibility</span>: animates the <span class="T2">element's</span> visibility.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">width</span>: animates the <span class="T2">element's</span> width, values are given in screen space where 0 is no width and 1 is the same width as the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">x</span>: animates the <span class="T2">element's</span> x position, values are given in screen space where 0 is the left edge and 1 is the right edge.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">y</span>: animates the <span class="T2">element's</span> y position, values are given in screen space where 0 is the top and 1 is the bottom.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:attributeName</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a> and <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:attributeName</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_436smil_autoReverse"><span style="margin-right:0.127cm;">19.436</span></a><a id="__RefHeading__1417782_253892949"/><a id="attribute-smil_autoReverse"/>smil:autoReverse</h2><p class="Text_20_body">See §11.1.2 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:autoReverse</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:autoReverse</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_437smil_begin"><span style="margin-right:0.127cm;">19.437</span></a><a id="__RefHeading__1417784_253892949"/><a id="attribute-smil_begin"/>smil:begin</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:begin</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:begin</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_438smil_by"><span style="margin-right:0.127cm;">19.438</span></a><a id="__RefHeading__1417786_253892949"/><a id="attribute-smil_by"/>smil:by</h2><p class="Text_20_body">See §3.4.4 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:by</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:by</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_439smil_calcMode"><span style="margin-right:0.127cm;">19.439</span></a><a id="__RefHeading__1417788_253892949"/><a id="attribute-smil_calcMode"/>smil:calcMode</h2><p class="Text_20_body">See §3.4.2 and §3.7.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">For <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a> and <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a> elements the default value for this attribute is <span class="Attribute_20_Value">discrete</span>.</p><p class="Default_20_Value">For a <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a> element the default value for this attribute is <span class="Attribute_20_Value">paced</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:calcMode</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:calcMode</span> attribute are <span class="Attribute_20_Value">discrete</span>, <span class="Attribute_20_Value">linear</span>, <span class="Attribute_20_Value">paced</span> or <span class="Attribute_20_Value">spline</span>.</p><h2 class="Heading_20_2"><a id="a19_440smil_decelerate"><span style="margin-right:0.127cm;">19.440</span></a><a id="__RefHeading__1417790_253892949"/><a id="attribute-smil_decelerate"/>smil:decelerate</h2><p class="Text_20_body">See §11.1.2 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body"><a id="tab11"/><a id="rowForcustomfield_10001"/>The defined range for the <span class="Attribute">smil:decelerate</span> attribute is <span class="Attribute_20_Value_20_Instance">0</span> to <span class="Attribute_20_Value_20_Instance">1</span>, inclusive. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0.0</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:decelerate</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:decelerate</span> attribute has values of type <span class="Datatype">decimal</span> <a href="#datatype-decimal">18.2</a> in the range [<span class="Attribute_20_Value">0</span>,<span class="Attribute_20_Value">1</span>].</p><h2 class="Heading_20_2"><a id="a19_441smil_direction"><span style="margin-right:0.127cm;">19.441</span></a><a id="__RefHeading__1417792_253892949"/><a id="attribute-smil_direction"/>smil:direction</h2><p class="Text_20_body">See §12.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a> element the default value for this attribute is <span class="Attribute_20_Value">forward</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:direction</span> attribute is usable with the following element: <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:direction</span> attribute are <span class="Attribute_20_Value">forward</span> or <span class="Attribute_20_Value">reverse</span>.</p><h2 class="Heading_20_2"><a id="a19_442smil_dur"><span style="margin-right:0.127cm;">19.442</span></a><a id="__RefHeading__1417794_253892949"/><a id="attribute-smil_dur"/>smil:dur</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:dur</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:dur</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_443smil_end"><span style="margin-right:0.127cm;">19.443</span></a><a id="__RefHeading__1417796_253892949"/><a id="attribute-smil_end"/>smil:end</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:end</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:end</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_444smil_endsync"><span style="margin-right:0.127cm;">19.444</span></a><a id="__RefHeading__1417798_253892949"/><a id="attribute-smil_endsync"/>smil:endsync</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:endsync</span> attribute is usable with the following elements: <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:endsync</span> attribute are <span class="Attribute_20_Value">first</span>, <span class="Attribute_20_Value">last</span>, <span class="Attribute_20_Value">all</span>, <span class="Attribute_20_Value">media</span> or a value of type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_445smil_fadeColor"><span style="margin-right:0.127cm;">19.445</span></a><a id="__RefHeading__1417800_253892949"/><a id="attribute-smil_fadeColor"/>smil:fadeColor</h2><p class="Text_20_body">See §12.5.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is #000000.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:fadeColor</span> attribute is usable with the following element: <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:fadeColor</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_446smil_fill"><span style="margin-right:0.127cm;">19.446</span></a><a id="__RefHeading__1417802_253892949"/><a id="attribute-smil_fill"/>smil:fill</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:fill</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:fill</span> attribute are <span class="Attribute_20_Value">remove</span>, <span class="Attribute_20_Value">freeze</span>, <span class="Attribute_20_Value">hold</span>, <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">default</span> or <span class="Attribute_20_Value">transition</span>.</p><h2 class="Heading_20_2"><a id="a19_447smil_fillDefault"><span style="margin-right:0.127cm;">19.447</span></a><a id="__RefHeading__1417804_253892949"/><a id="attribute-smil_fillDefault"/>smil:fillDefault</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:fillDefault</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:fillDefault</span> attribute are <span class="Attribute_20_Value">remove</span>, <span class="Attribute_20_Value">freeze</span>, <span class="Attribute_20_Value">hold</span>, <span class="Attribute_20_Value">transition</span>, <span class="Attribute_20_Value">auto</span> or <span class="Attribute_20_Value">inherit</span>.</p><h2 class="Heading_20_2"><a id="a19_448smil_from"><span style="margin-right:0.127cm;">19.448</span></a><a id="__RefHeading__1417806_253892949"/><a id="attribute-smil_from"/>smil:from</h2><p class="Text_20_body">See §3.4.4 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:from</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:from</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_449smil_keySplines"><span style="margin-right:0.127cm;">19.449</span></a><a id="__RefHeading__1417808_253892949"/><a id="attribute-smil_keySplines"/>smil:keySplines</h2><p class="Text_20_body">See $3.7.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:keySplines</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a> and <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:keySplines</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_450smil_keyTimes"><span style="margin-right:0.127cm;">19.450</span></a><a id="__RefHeading__1417810_253892949"/><a id="attribute-smil_keyTimes"/>smil:keyTimes</h2><p class="Text_20_body">See $3.7.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:keyTimes</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a> and <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:keyTimes</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_451smil_mode"><span style="margin-right:0.127cm;">19.451</span></a><a id="__RefHeading__1417812_253892949"/><a id="attribute-smil_mode"/>smil:mode</h2><p class="Text_20_body">See §12.5.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">in</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:mode</span> attribute is usable with the following element: <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:mode</span> attribute are <span class="Attribute_20_Value">in</span> or <span class="Attribute_20_Value">out</span>.</p><h2 class="Heading_20_2"><a id="a19_452smil_repeatCount"><span style="margin-right:0.127cm;">19.452</span></a><a id="__RefHeading__1417814_253892949"/><a id="attribute-smil_repeatCount"/>smil:repeatCount</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:repeatCount</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:repeatCount</span> attribute are a non negative value of type <span class="Datatype">decimal</span> <a href="#datatype-decimal">18.2</a> or <span class="Attribute_20_Value">indefinite</span>.</p><h2 class="Heading_20_2"><a id="a19_453smil_repeatDur"><span style="margin-right:0.127cm;">19.453</span></a><a id="__RefHeading__1417816_253892949"/><a id="attribute-smil_repeatDur"/>smil:repeatDur</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body">The value of the <span class="Attribute">smil:repeatDur</span> attribute can be <span class="Attribute_20_Value">indefinite</span>, or a clock-value as defined in $10.3.1 of SMIL</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:repeatDur</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:repeatDur</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_454smil_restart"><span style="margin-right:0.127cm;">19.454</span></a><a id="__RefHeading__1417818_253892949"/><a id="attribute-smil_restart"/>smil:restart</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">default</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:restart</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:restart</span> attribute are <span class="Attribute_20_Value">never</span>, <span class="Attribute_20_Value">always</span>, <span class="Attribute_20_Value">whenNotActive</span> or <span class="Attribute_20_Value">default</span>.</p><h2 class="Heading_20_2"><a id="a19_455smil_restartDefault"><span style="margin-right:0.127cm;">19.455</span></a><a id="__RefHeading__1417820_253892949"/><a id="attribute-smil_restartDefault"/>smil:restartDefault</h2><p class="Text_20_body">See §10.3.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">inherit</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">smil:restartDefault</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:restartDefault</span> attribute are <span class="Attribute_20_Value">never</span>, <span class="Attribute_20_Value">always</span>, <span class="Attribute_20_Value">whenNotActive</span> or <span class="Attribute_20_Value">inherit</span>.</p><h2 class="Heading_20_2"><a id="a19_456smil_subtype"><span style="margin-right:0.127cm;">19.456</span></a><a id="__RefHeading__1417822_253892949"/><a id="attribute-smil_subtype"/>smil:subtype</h2><p class="Text_20_body">See §12.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body"><span class="Note_20_Label">Note: </span>See §12.8 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> for a list of supported subtypes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:subtype</span> attribute is usable with the following element: <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:subtype</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_457smil_targetElement"><span style="margin-right:0.127cm;">19.457</span></a><a id="__RefHeading__1417824_253892949"/><a id="attribute-smil_targetElement"/>smil:targetElement</h2><p class="Text_20_body">See §3.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body">Drawing shapes are specified by their <span class="Attribute">xml:id</span> or <span class="Attribute">draw:id</span> attribute values and paragraphs by their <span class="Attribute">xml:id</span> or <span class="Attribute">text:id</span> attribute values.</p><p class="Text_20_body">If the <span class="Attribute">anim:sub-item</span> attribute of a <span class="Element">&lt;anim:iterate&gt;</span> element has the value <span class="Attribute_20_Value_20_Instance">whole</span>, the iteration includes the drawing shape's background and its text. If the <span class="Attribute">anim:sub-item</span> attribute value is <span class="Attribute_20_Value_20_Instance">text</span>, only the shape's text is iterated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:targetElement</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:targetElement</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_458smil_to"><span style="margin-right:0.127cm;">19.458</span></a><a id="__RefHeading__1417826_253892949"/><a id="attribute-smil_to"/>smil:to</h2><p class="Text_20_body">See §3.4.4 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:to</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>, <span class="Element">&lt;anim:set&gt;</span> <a href="#element-anim_set">15.2.4</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:to</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_459smil_type"><span style="margin-right:0.127cm;">19.459</span></a><a id="__RefHeading__1417828_253892949"/><a id="attribute-smil_type"/>smil:type</h2><p class="Text_20_body">The <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> <span class="Attribute">smil:type</span> attribute specifies a transition type or family.</p><p class="Text_20_body">See §12.8 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> for a list of supported types.</p><p class="Text_20_body">If this attribute is present, the attributes <span class="Attribute">presentation:transition-type</span> and <span class="Attribute">presentation:transition-style</span> attributes should be ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:type</span> attribute is usable with the following element: <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_460smil_values"><span style="margin-right:0.127cm;">19.460</span></a><a id="__RefHeading__1417830_253892949"/><a id="attribute-smil_values"/>smil:values</h2><p class="Text_20_body">See $3.4.2 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:values</span> attribute is usable with the following elements: <span class="Element">&lt;anim:animate&gt;</span> <a href="#element-anim_animate">15.2.2</a>, <span class="Element">&lt;anim:animateColor&gt;</span> <a href="#element-anim_animateColor">15.2.6</a>, <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>, <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a> and <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:values</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_461style_adjustment"><span style="margin-right:0.127cm;">19.461</span></a><a id="__RefHeading__1417832_253892949"/><a id="attribute-style_adjustment"/>style:adjustment</h2><p class="Text_20_body">The <span class="Attribute">style:adjustment</span> attribute specifies how a footnote separator line is aligned on a page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:adjustment</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: footnote separator line centered on page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">eft</span>: footnote separator line aligned to left on page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ight</span>: footnote separator line aligned to right on page.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">left</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:adjustment</span> attribute is usable with the following element: <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:adjustment</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">right</span>.</p><h2 class="Heading_20_2"><a id="a19_462style_apply-style-name"><span style="margin-right:0.127cm;">19.462</span></a><a id="__RefHeading__1417834_253892949"/><a id="attribute-style_apply-style-name"/>style:apply-style-name</h2><p class="Text_20_body">The <span class="Attribute">style:apply-style-name</span> attribute specifies the style to apply when the condition specified by the <span class="Attribute">style:condition</span> attribute is <span class="Attribute_20_Value">true</span>. If the referenced style is undefined or is an automatic style, an error occurs.</p><p class="Text_20_body">The referenced style shall be defined by the same type of element as the conditional style that contains the condition. If the referenced style element has a <span class="Attribute">style:family</span> attribute, its value further shall be equal the value of the <span class="Attribute">style:family</span> attribute of the conditional style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:apply-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:apply-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_463style_auto-update"><span style="margin-right:0.127cm;">19.463</span></a><a id="__RefHeading__1417836_253892949"/><a id="attribute-style_auto-update"/>style:auto-update</h2><p class="Text_20_body">The <span class="Attribute">style:auto-update</span> attribute specifies whether styles are automatically updated when the formatting properties of an object that has the style assigned to it are changed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:auto-update</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a change to a formatting property is applied for the object where the change was made. If necessary, a new automatic style will be created which is applied to the object where the change was made.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a change to a formatting property results in the updating of the common style that is applied to an object. The formatting change is applied to all objects subject to the common style where the change was made. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:auto-update</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:auto-update</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_464style_base-cell-address"><span style="margin-right:0.127cm;">19.464</span></a><a id="__RefHeading__1417838_253892949"/><a id="attribute-style_base-cell-address"/>style:base-cell-address</h2><p class="Text_20_body">The <span class="Attribute">style:base-cell-address</span> attribute specifies as an absolute cell address with a table name the base cell for relative addresses in formulas. This attribute applies only to cell styles where the condition contains a formula.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:base-cell-address</span> attribute is usable with the following element: <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:base-cell-address</span> attribute has the data type <span class="Datatype">cellAddress</span> <a href="#datatype-cellAddress">18.3.4</a>.</p><h2 class="Heading_20_2"><a id="a19_465style_char"><span style="margin-right:0.127cm;">19.465</span></a><a id="__RefHeading__1417840_253892949"/><a id="attribute-style_char"/>style:char</h2><p class="Text_20_body">The <span class="Attribute">style:char</span> attribute specifies the delimiter character for tab stops of type <span class="Attribute_20_Value">char</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:char</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:char</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a19_466style_class"><span style="margin-right:0.127cm;">19.466</span></a><a id="__RefHeading__1417842_253892949"/><a id="attribute-style_class"/>style:class</h2><p class="Text_20_body">The <span class="Attribute">style:class</span> attribute specifies a style class name. A style class name is a string and any style may belong to any  number of classes. A style may belong to any class of styles. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:class</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:class</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_467style_color"><span style="margin-right:0.127cm;">19.467</span></a><a id="__RefHeading__1417844_253892949"/><a id="attribute-style_color"/>style:color</h2><p class="Text_20_body">The <span class="Attribute">style:color</span> attribute specifies the color of a column or footnote separator line.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">#000000</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:color</span> attribute is usable with the following elements: <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a> and <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_468style_condition"><span style="margin-right:0.127cm;">19.468</span></a><a id="__RefHeading__1417846_253892949"/><a id="attribute-style_condition"/>style:condition</h2><p class="Text_20_body">The <span class="Attribute">style:condition</span> attribute specifies a condition that triggers a style map.</p><p class="Text_20_body">The value of this attribute should be a namespace prefix, followed by a ":" (U+003A, COLON), followed by one of the defined conditions. If the namespace prefix is missing it defaults to the "urn:oasis:names:tc:opendocument:xmlns:of:1.2" namespace. The XML namespace that applies to the <span class="Attribute">style:condition</span> attribute specifies the syntax and semantics of any <span class="Attribute_20_Value">expression</span> occurrences in the <span class="Attribute">style:condition</span> syntax.</p><p class="Text_20_body">If a consumer does not recognize a condition, it shall ignore the <span class="Element">&lt;style:map&gt;</span> element containing the condition.</p><p class="Text_20_body">The defined conditions that may be used by paragraph styles are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">footnote()</span> and <span class="Attribute_20_Value_20_Fragment">endnote()</span>: true if the style is applied to a paragraph or heading that is contained in a footnote or endnote.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">header()</span> and <span class="Attribute_20_Value_20_Fragment">footer()</span>: True if the style is applied to a paragraph or heading that is contained in a page header or footer.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">list-level()=</span><span class="Attribute_20_Value_20_Param">n</span>, where <span class="Attribute_20_Value_20_Param">n</span> is a number: true if the style is applied to a paragraph or heading that is contained in a list on level <span class="Attribute_20_Value_20_Param">n</span>, or to a numbered paragraph on level <span class="Attribute_20_Value_20_Param">n</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">outline-level()=</span><span class="Attribute_20_Value_20_Param">n</span>, where <span class="Attribute_20_Value_20_Param">n</span> is a number: true if the if the style is applied to a heading on level <span class="Attribute_20_Value_20_Fragment">n</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">section()</span>: true if the style is applied to a paragraph or heading that is contained in a text section.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">table()</span> and <span class="Attribute_20_Value_20_Fragment">table-header()</span>: true if the style is applied to a paragraph or heading that is contained in a table cell or table header cell.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Within paragraph style conditions <span class="Attribute_20_Value_20_Param">n</span> is a positive integer in the lexical form of the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> positiveInteger datatype.</p><p class="Text_20_body">The defined conditions that may be used by table cell styles are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content() </span><a id="DDE_LINK271"/><span class="Attribute_20_Value_20_Param">op</span><span class="Attribute_20_Value_20_Fragment"> </span><span class="Attribute_20_Value_20_Param">value</span>: where <span class="Attribute_20_Value_20_Param">op</span> is one of the relational operators ”<span class="Attribute_20_Value_20_Fragment">&lt;</span>”, ”<span class="Attribute_20_Value_20_Fragment">&gt;</span>”, ”<span class="Attribute_20_Value_20_Fragment">&lt;=</span>”, ”<span class="Attribute_20_Value_20_Fragment">&gt;=</span>”, ”<span class="Attribute_20_Value_20_Fragment">=</span>” or ”<span class="Attribute_20_Value_20_Fragment">!=</span>”: true if the style is applied to a table cell where the cell's value compared to the value specified in the condition by <span class="Attribute_20_Value_20_Param">value</span> using the relational operator <span class="Attribute_20_Value_20_Param">op</span> evaluates to true.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-between(</span><span class="Attribute_20_Value_20_Param">value1</span><span class="Attribute_20_Value_20_Fragment">, </span><span class="Attribute_20_Value_20_Param">value2</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if the style is applied to a table cell whose value is between <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-not-between(</span><span class="Attribute_20_Value_20_Param">value</span><span class="Attribute_20_Value_20_Fragment">, </span><span class="Attribute_20_Value_20_Param">value</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if the style is applied to a table cell whose value is not between <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">is-true-formula(</span><span class="Attribute_20_Value_20_Param">expression</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if the style is applied to a table cell for which formula evaluates true.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"> Within table cell style conditions:</p><ul><li><ul><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">value</span>, <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span> are a <span class="Attribute_20_Value_20_Param">numberValue</span>, a <span class="Attribute_20_Value_20_Param">string</span> or an <span class="Attribute_20_Value_20_Param">expression</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">numberValue</span> is a whole or decimal number in the lexical form of the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a>  decimal datatype.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">string</span> expresses a value of the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> string datatype by surrounding the sequence of string characters in quotation marks (U+0022, QUOTATION MARK). A quotation mark within the string itself is expressed with two consecutive quotation marks. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0.6411cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">expression</span> is a lexical form that is neither <span class="Attribute_20_Value_20_Param">numberValue</span> nor <span class="Attribute_20_Value_20_Param">string</span> and that is a well-formed expression determined by the namespace applicable to the <span class="Attribute">style:condition</span> attribute value.<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="Text_20_body">The defined condition that may be used by data styles is:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">value() </span><span class="Attribute_20_Value_20_Param">op</span><span class="Attribute_20_Value_20_Fragment"> </span><span class="Attribute_20_Value_20_Param">n</span>, where, <span class="Attribute_20_Value_20_Param">op</span> is one of the relational operators ”<span class="Attribute_20_Value_20_Fragment">&lt;</span>”, ”<span class="Attribute_20_Value_20_Fragment">&gt;</span>”, ”<span class="Attribute_20_Value_20_Fragment">&lt;=</span>”, ”<span class="Attribute_20_Value_20_Fragment">&gt;=</span>”, “<span class="Attribute_20_Value_20_Fragment">=</span>” or ”<span class="Attribute_20_Value_20_Fragment">!=</span>”, and <span class="Attribute_20_Value_20_Param">n</span> is a number for non-Boolean data styles and <span class="Attribute_20_Value_20_Fragment">true</span> or <span class="Attribute_20_Value_20_Fragment">false</span> for Boolean data styles: true if the style is applied to a table cell where the cell's value compared to the value specified in the condition by <span class="Attribute_20_Value_20_Param">n</span> using the relational operator <span class="Attribute_20_Value_20_Param">op</span> evaluates to true.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Relative cell range addresses that occur in a condition for a table cell style define an offset which shall be interpreted relative to the cell for which a condition is calculated. The offset is the same as the offsets between the table cell addressed by the relative cell range address and the table cell specified by the <span class="Attribute">style:base-cell-address</span> attribute. </p><p class="Text_20_body">An OpenDocument Consumer when hosting a formula evaluator makes available the host-dependent properties defined by table <a href="#refTable11">12</a> in 19.644.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:condition</span> attribute is usable with the following element: <span class="Element">&lt;style:map&gt;</span> <a href="#element-style_map">16.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_469style_data-style-name"><span style="margin-right:0.127cm;">19.469</span></a><a id="__RefHeading__1417848_253892949"/><a id="attribute-style_data-style-name"/>style:data-style-name</h2><h3 class="Heading_20_3"><a id="a19_469_1General"><span style="margin-right:0.127cm;">19.469.1</span></a><a id="__RefHeading__1417850_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies the name of a data style. </p><h3 class="Heading_20_3"><a id="a19_469_2_presentation_date-time-decl_"><span style="margin-right:0.127cm;">19.469.2</span></a><a id="__RefHeading__1417852_253892949"/><a id="attribute-style_data-style-name_element-presentation_date-time-decl"/>&lt;presentation:date-time-decl&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a date and time. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;presentation:date-time-decl&gt;</span> <a href="#element-presentation_date-time-decl">10.9.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_3_style_style_"><span style="margin-right:0.127cm;">19.469.3</span></a><a id="__RefHeading__1417854_253892949"/><a id="attribute-style_data-style-name_element-style_style"/>&lt;style:style&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style for a <span class="Element">&lt;style:style&gt;</span> element that defines the styles for table cell styles and chart styles. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_4_text_creation-date_"><span style="margin-right:0.127cm;">19.469.4</span></a><a id="__RefHeading__1417856_253892949"/><a id="attribute-style_data-style-name_element-text_creation-date"/>&lt;text:creation-date&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_5_text_creation-time_"><span style="margin-right:0.127cm;">19.469.5</span></a><a id="__RefHeading__1417858_253892949"/><a id="attribute-style_data-style-name_element-text_creation-time"/>&lt;text:creation-time&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_6_text_database-display_"><span style="margin-right:0.127cm;">19.469.6</span></a><a id="__RefHeading__1417860_253892949"/><a id="attribute-style_data-style-name_element-text_database-display"/>&lt;text:database-display&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_7_text_date_"><span style="margin-right:0.127cm;">19.469.7</span></a><a id="__RefHeading__1417862_253892949"/><a id="attribute-style_data-style-name_element-text_date"/>&lt;text:date&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_8_text_editing-duration_"><span style="margin-right:0.127cm;">19.469.8</span></a><a id="__RefHeading__1417864_253892949"/><a id="attribute-style_data-style-name_element-text_editing-duration"/>&lt;text:editing-duration&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_9_text_expression_"><span style="margin-right:0.127cm;">19.469.9</span></a><a id="__RefHeading__1417866_253892949"/><a id="attribute-style_data-style-name_element-text_expression"/>&lt;text:expression&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_10_text_meta-field_"><span style="margin-right:0.127cm;">19.469.10</span></a><a id="__RefHeading__1417868_253892949"/><a id="attribute-style_data-style-name_element-text_meta-field"/>&lt;text:meta-field&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_11_text_modification-date_"><span style="margin-right:0.127cm;">19.469.11</span></a><a id="__RefHeading__1417870_253892949"/><a id="attribute-style_data-style-name_element-text_modification-date"/>&lt;text:modification-date&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_12_text_modification-time_"><span style="margin-right:0.127cm;">19.469.12</span></a><a id="__RefHeading__1417872_253892949"/><a id="attribute-style_data-style-name_element-text_modification-time"/>&lt;text:modification-time&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_13_text_print-date_"><span style="margin-right:0.127cm;">19.469.13</span></a><a id="__RefHeading__1417874_253892949"/><a id="attribute-style_data-style-name_element-text_print-date"/>&lt;text:print-date&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_14_text_print-time_"><span style="margin-right:0.127cm;">19.469.14</span></a><a id="__RefHeading__1417876_253892949"/><a id="attribute-style_data-style-name_element-text_print-time"/>&lt;text:print-time&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_15_text_table-formula_"><span style="margin-right:0.127cm;">19.469.15</span></a><a id="__RefHeading__1417878_253892949"/><a id="attribute-style_data-style-name_element-text_table-formula"/>&lt;text:table-formula&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_16_text_time_"><span style="margin-right:0.127cm;">19.469.16</span></a><a id="__RefHeading__1417880_253892949"/><a id="attribute-style_data-style-name_element-text_time"/>&lt;text:time&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a numeric value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_17_text_user-defined_"><span style="margin-right:0.127cm;">19.469.17</span></a><a id="__RefHeading__1417882_253892949"/><a id="attribute-style_data-style-name_element-text_user-defined"/>&lt;text:user-defined&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_18_text_user-field-get_"><span style="margin-right:0.127cm;">19.469.18</span></a><a id="__RefHeading__1417884_253892949"/><a id="attribute-style_data-style-name_element-text_user-field-get"/>&lt;text:user-field-get&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_19_text_user-field-input_"><span style="margin-right:0.127cm;">19.469.19</span></a><a id="__RefHeading__1417886_253892949"/><a id="attribute-style_data-style-name_element-text_user-field-input"/>&lt;text:user-field-input&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_20_text_variable-get_"><span style="margin-right:0.127cm;">19.469.20</span></a><a id="__RefHeading__1417888_253892949"/><a id="attribute-style_data-style-name_element-text_variable-get"/>&lt;text:variable-get&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_21_text_variable-input_"><span style="margin-right:0.127cm;">19.469.21</span></a><a id="__RefHeading__1417890_253892949"/><a id="attribute-style_data-style-name_element-text_variable-input"/>&lt;text:variable-input&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_469_22_text_variable-set_"><span style="margin-right:0.127cm;">19.469.22</span></a><a id="__RefHeading__1417892_253892949"/><a id="attribute-style_data-style-name_element-text_variable-set"/>&lt;text:variable-set&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute specifies a data style to format a field value. This attribute shall be omitted for fields whose value type is <span class="Attribute_20_Value">string</span>. It shall be present for fields whose value type is not <span class="Attribute_20_Value">string</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_470style_default-outline-level"><span style="margin-right:0.127cm;">19.470</span></a><a id="__RefHeading__1417894_253892949"/><a id="attribute-style_default-outline-level"/>style:default-outline-level</h2><p class="Text_20_body">The <span class="Attribute">style:default-outline-level</span> attribute specifies a default outline level for a style with the family <span class="Attribute_20_Value">paragraph</span>. </p><p class="Text_20_body">If the <span class="Attribute">style:default-outline-level</span> attribute is present in a paragraph style, and if this paragraph style is assigned to a paragraph or heading by user action, then the consumer should replace the paragraph or heading with a heading of the specified level, which has the same content and attributes as the original paragraph or heading. </p><p class="Note"><span class="Note_20_Label">Note:</span> This attribute does not modify the behavior of <span class="Element">&lt;text:p&gt;</span> or <span class="Element">&lt;text:h&gt;</span> elements, but only instructs a consumer to create one or the other when assigning a paragraph style as a result of user interface action while the document is edited.</p><p class="Text_20_body">The <span class="Attribute">style:default-outline-level</span> attribute value can be empty. If empty, this attribute does not inherit a list style value from a parent style. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:default-outline-level</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:default-outline-level</span> attribute are a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a> or an empty string.</p><h2 class="Heading_20_2"><a id="a19_471style_display"><span style="margin-right:0.127cm;">19.471</span></a><a id="__RefHeading__1417896_253892949"/><a id="attribute-style_display"/>style:display</h2><p class="Text_20_body">The <span class="Attribute">style:display</span> attribute specifies whether the header or footer is displayed or not. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: header or footer is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: header or footer is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:display</span> attribute is usable with the following elements: <span class="Element">&lt;style:footer&gt;</span> <a href="#element-style_footer">16.11</a>, <span class="Element">&lt;style:footer-left&gt;</span> <a href="#element-style_footer-left">16.13</a>, <span class="Element">&lt;style:header&gt;</span> <a href="#element-style_header">16.10</a> and <span class="Element">&lt;style:header-left&gt;</span> <a href="#element-style_header-left">16.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:display</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_472style_display-name"><span style="margin-right:0.127cm;">19.472</span></a><a id="__RefHeading__1417898_253892949"/><a id="attribute-style_display-name"/>style:display-name</h2><p class="Text_20_body">The <span class="Attribute">style:display-name</span> attribute specifies the name of a style as it should appear in the user interface. If this attribute is not present, the display name is the same as the style name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:display-name</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>, <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;style:presentation-page-layout&gt;</span> <a href="#element-style_presentation-page-layout">16.41</a>, <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a> and <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:display-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_473style_distance"><span style="margin-right:0.127cm;">19.473</span></a><a id="__RefHeading__1417900_253892949"/><a id="attribute-style_distance"/>style:distance</h2><p class="Text_20_body">The <span class="Attribute">style:distance</span> attribute specifies the distance between the last of the characters using the larger font and the first of the remaining characters of each line.</p><p class="Note"><span class="Note_20_Label">Note: </span>If the leading characters for a paragraph span the line size of a portion of the remaining text of a paragraph, the <span class="Attribute">style:distance</span> attribute specifies the distance between the end of the text written in the larger font and the smaller text of any lines that it spans. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0cm</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:distance</span> attribute is usable with the following element: <span class="Element">&lt;style:drop-cap&gt;</span> <a href="#element-style_drop-cap">17.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:distance</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_474style_distance-before-sep"><span style="margin-right:0.127cm;">19.474</span></a><a id="__RefHeading__1417902_253892949"/><a id="attribute-style_distance-before-sep"/>style:distance-before-sep</h2><p class="Text_20_body">The <span class="Attribute">style:distance-before-sep</span> attribute specifies the space between the body text area and a footnote separator line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:distance-before-sep</span> attribute is usable with the following element: <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:distance-before-sep</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_475style_distance-after-sep"><span style="margin-right:0.127cm;">19.475</span></a><a id="__RefHeading__1417904_253892949"/><a id="attribute-style_distance-after-sep"/>style:distance-after-sep</h2><p class="Text_20_body">The <span class="Attribute">style:distance-after-sep</span> attribute specifies the space between a footnote separator line and the footnote text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:distance-after-sep</span> attribute is usable with the following element: <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:distance-after-sep</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_476style_family"><span style="margin-right:0.127cm;">19.476</span></a><a id="__RefHeading__1417906_253892949"/><a id="attribute-style_family"/>style:family</h2><p class="Text_20_body">The <span class="Attribute">style:family</span> attribute specifies the family of a style. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:family</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chart</span>: family name of styles for charts.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">d</span><span class="Attribute_20_Value">rawing-page</span>: family name of styles for drawing pages.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">g</span><span class="Attribute_20_Value">raphic</span>: family name of styles for graphic elements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">paragraph</span>: family name of styles for paragraphs.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">presentation</span>: family name of styles for presentations.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">uby</span>: family name of styles for ruby text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able</span>: family name of styles for tables.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able-cell</span>: family name of styles for table cells.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able-column</span>: family name of styles for table columns.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able-row</span>: family name of styles for table rows.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext</span>: family name of styles for text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:family</span> attribute is usable with the following elements: <span class="Element">&lt;style:default-style&gt;</span> <a href="#element-style_default-style">16.4</a> and <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:family</span> attribute are <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">paragraph</span>, <span class="Attribute_20_Value">section</span>, <span class="Attribute_20_Value">ruby</span>, <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">table-column</span>, <span class="Attribute_20_Value">table-row</span>, <span class="Attribute_20_Value">table-cell</span>, <span class="Attribute_20_Value">graphic</span>, <span class="Attribute_20_Value">presentation</span>, <span class="Attribute_20_Value">drawing-page</span> or <span class="Attribute_20_Value">chart</span>.</p><h2 class="Heading_20_2"><a id="a19_477style_filter-name"><span style="margin-right:0.127cm;">19.477</span></a><a id="__RefHeading__1417908_253892949"/><a id="attribute-style_filter-name"/>style:filter-name</h2><p class="Text_20_body">The <span class="Attribute">style:filter-name</span> attribute specifies the implementation-dependent filter name that has been used to load an image into the document.</p><p class="Text_20_body">This attribute is attached to a <span class="Element">&lt;style:background-image&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:filter-name</span> attribute is usable with the following element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:filter-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_478style_font-adornments"><span style="margin-right:0.127cm;">19.478</span></a><a id="__RefHeading__1417910_253892949"/><a id="attribute-style_font-adornments"/>style:font-adornments</h2><p class="Text_20_body">The <span class="Attribute">style:font-adornments</span> attributes specifies a characteristic of a font.</p><p class="Text_20_body"><span class="Note_20_Label">Note: </span>A font characteristic includes bold or italic, which when used with a font family name, specifies a font. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-adornments</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-adornments</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_479style_font-charset"><span style="margin-right:0.127cm;">19.479</span></a><a id="__RefHeading__1417912_253892949"/><a id="attribute-style_font-charset"/>style:font-charset</h2><p class="Text_20_body">The <span class="Attribute">style:font-charset</span> attribute specifies whether a font defines glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> or not.</p><p class="Text_20_body">The value of this attributes can be <span class="Attribute_20_Value_20_Instance">x-symbol</span> or a character encoding in the notation described in the §4.3.3 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>. If the value is <span class="Attribute_20_Value_20_Instance">x-symbol</span>, the font does not define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. If the value is one of the encodings or transformations of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>, the font does define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. The use of other values is deprecated.</p><p class="Note"><span class="Note_20_Label">Note:</span> Fonts for which the attribute has the value <span class="Attribute_20_Value_20_Instance">x-symbol</span> may define glyphs for code points in the private use area of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-charset</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-charset</span> attribute has the data type <span class="Datatype">textEncoding</span> <a href="#datatype-textEncoding">18.3.35</a>.</p><h2 class="Heading_20_2"><a id="a19_480style_font-family-generic"><span style="margin-right:0.127cm;">19.480</span></a><a id="__RefHeading__1417914_253892949"/><a id="attribute-style_font-family-generic"/>style:font-family-generic</h2><p class="Text_20_body">The <span class="Attribute">style:font-family-generic</span> attribute specifies a generic font family name.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-family-generic</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">decorative</span>: the family of decorative fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">modern</span>: the family of modern fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roman</span>: the family roman fonts (with serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">script</span>: the family of script fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">swiss</span>: the family roman fonts (without serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">system</span>: the family system fonts. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-family-generic</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-family-generic</span> attribute are <span class="Attribute_20_Value">roman</span>, <span class="Attribute_20_Value">swiss</span>, <span class="Attribute_20_Value">modern</span>, <span class="Attribute_20_Value">decorative</span>, <span class="Attribute_20_Value">script</span> or <span class="Attribute_20_Value">system</span>.</p><h2 class="Heading_20_2"><a id="a19_481style_font-pitch"><span style="margin-right:0.127cm;">19.481</span></a><a id="__RefHeading__1417916_253892949"/><a id="attribute-style_font-pitch"/>style:font-pitch</h2><p class="Text_20_body">The <span class="Attribute">style:font-pitch</span> attribute specifies whether a font has a fixed or variable width.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-pitch</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: font has a fixed width.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">variable</span>: font has a variable width.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-pitch</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-pitch</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">variable</span>.</p><h2 class="Heading_20_2"><a id="a19_482style_height"><span style="margin-right:0.127cm;">19.482</span></a><a id="__RefHeading__1417918_253892949"/><a id="attribute-style_height"/>style:height</h2><p class="Text_20_body">The <span class="Attribute">style:height</span> attribute specifies the height of a column separator line. The value of this attribute is a percentage of the height of the columned area.</p><p class="Text_20_body">The defined value range for the <span class="Attribute">style:height</span> attribute is 0% to 100%, inclusive.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">100%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:height</span> attribute is usable with the following element: <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:height</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a19_483style_leader-char"><span style="margin-right:0.127cm;">19.483</span></a><a id="__RefHeading__1417920_253892949"/><a id="attribute-style_leader-char"/>style:leader-char</h2><p class="Text_20_body">The <span class="Attribute">style:leader-char</span> attribute specifies a leader character.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:leader-char</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:leader-char</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a19_484style_leader-color"><span style="margin-right:0.127cm;">19.484</span></a><a id="__RefHeading__1417922_253892949"/><a id="attribute-style_leader-color"/>style:leader-color</h2><p class="Text_20_body">The <span class="Attribute">style:leader-color</span> attribute specifies the color of a leader line. The value of this attribute is either <span class="Attribute_20_Value">font-color</span> or a color. If the value is <span class="Attribute_20_Value">font-color</span>, the current text color is used for the leader line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:leader-color</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:leader-color</span> attribute are <span class="Attribute_20_Value">font-color</span> or a value of type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_485style_leader-style"><span style="margin-right:0.127cm;">19.485</span></a><a id="__RefHeading__1417924_253892949"/><a id="attribute-style_leader-style"/>style:leader-style</h2><p class="Text_20_body">The <span class="Attribute">style:leader-style</span> attribute specifies a style for a leader line. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:leader-style</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: tab stop has no leader line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dash</span>: tab stop has a dashed leader line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dash</span>: tab stop has a leader line whose repeating pattern is a dot followed by a dash.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dot-dash</span>: tab stop has a leader line whose repeating pattern has two dots followed by a dash. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dotted</span>: tab stop has a dotted leader line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long-dash</span>: tab stop has a dashed leader line whose dashes are longer than the ones from the dashed line for value dash.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: tab stop has a solid leader line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wave</span>: tab stop has a wavy leader line.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"><span class="Note_20_Label">Note: </span>The definitions of the values of the <span class="Attribute">style:leader-style</span> attribute are based on the text decoration style 'text-underline-style' from <a title="CSS3 Text Module" href="http://www.w3.org/TR/2003/CR-css3-text-20030514">[CSS3Text]</a>, §9.2.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:leader-style</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:leader-style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">long-dash</span>, <span class="Attribute_20_Value">dot-dash</span>, <span class="Attribute_20_Value">dot-dot-dash</span> or <span class="Attribute_20_Value">wave</span>.</p><h2 class="Heading_20_2"><a id="a19_486style_leader-text"><span style="margin-right:0.127cm;">19.486</span></a><a id="__RefHeading__1417926_253892949"/><a id="attribute-style_leader-text"/>style:leader-text</h2><p class="Text_20_body">The <span class="Attribute">style:leader-text</span> attribute specifies a single Unicode character for use as leader text for tab stops.</p><p class="Text_20_body">An consumer may support only specific characters as textual leaders. If a character that is not supported by a consumer is specified by this attribute, the consumer should display a leader character that it supports instead of the one specified by this attribute. </p><p class="Text_20_body">If both <span class="Attribute">style:leader-text</span> and <span class="Attribute">style:leader-style</span> attributes are specified, the value of the <span class="Attribute">style:leader-text</span> sets the leader text for tab stops.</p><p class="Default_20_Value_borderStart">The default value for this attribute is “ “ (U+0020, SPACE).</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:leader-text</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:leader-text</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a19_487style_leader-text-style"><span style="margin-right:0.127cm;">19.487</span></a><a id="__RefHeading__1417928_253892949"/><a id="attribute-style_leader-text-style"/>style:leader-text-style</h2><p class="Text_20_body">The <span class="Attribute">style:leader-text-style</span> specifies a text style that is applied to a textual leader. It is not applied to leader lines. If the attribute appears in an automatic style, it may reference either an automatic text style or a common style. If the attribute appears in a common style, it may reference a common style only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:leader-text-style</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:leader-text-style</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_488style_leader-type"><span style="margin-right:0.127cm;">19.488</span></a><a id="__RefHeading__1417930_253892949"/><a id="attribute-style_leader-type"/>style:leader-type</h2><p class="Text_20_body">The <span class="Attribute">style:leader-type</span> attribute specifies whether a leader line should be drawn, and if so, whether a single or double line will be used.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:leader-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: a double line is drawn.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: no line is drawn.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">ingle</span>: a single line is drawn.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:leader-type</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:leader-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">single</span> or <span class="Attribute_20_Value">double</span>.</p><h2 class="Heading_20_2"><a id="a19_489style_leader-width"><span style="margin-right:0.127cm;">19.489</span></a><a id="__RefHeading__1417932_253892949"/><a id="attribute-style_leader-width"/>style:leader-width</h2><p class="Text_20_body">The <span class="Attribute">style:leader-width</span> attribute specifies the width of a leader line.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:leader-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the width of a leader line should be calculated from the font size of the text where the leader line will appear. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bold</span>: the width of a leader line should be calculated from the font size of the text where the leader line will appear but is wider than for the value of auto. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The line widths referenced by the values <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">thick</span> and <span class="Attribute_20_Value">thin</span> are implementation-defined. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:leader-width</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:leader-width</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">thin</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span>, a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>, a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a> or a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a19_490style_legend-expansion"><span style="margin-right:0.127cm;">19.490</span></a><a id="__RefHeading__1417934_253892949"/><a id="attribute-style_legend-expansion"/>style:legend-expansion</h2><p class="Text_20_body">The <span class="Attribute">style:legend-expansion</span> attribute specifies the direction in which a legend expands . </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:legend-expansion</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">balanced</span>: legend expands horizontally and vertically.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom</span>: with a <span class="Attribute">style:legend-expansion-aspect-ratio</span> attribute legend expands according to the specified ratio.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">high</span>: legend expands vertically. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wide</span>: legend expands horizontally.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:legend-expansion</span> attribute is usable with the following element: <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:legend-expansion</span> attribute are <span class="Attribute_20_Value">wide</span>, <span class="Attribute_20_Value">high</span>, <span class="Attribute_20_Value">balanced</span> or <span class="Attribute_20_Value">custom</span>.</p><h2 class="Heading_20_2"><a id="a19_491style_legend-expansion-aspect-ratio"><span style="margin-right:0.127cm;">19.491</span></a><a id="__RefHeading__1417936_253892949"/><a id="attribute-style_legend-expansion-aspect-ratio"/>style:legend-expansion-aspect-ratio</h2><p class="Text_20_body">The <span class="Attribute">style:legend-expansion-aspect-ratio</span> attribute specifies the ratio between width and height for a <span class="Attribute">style:legend-expansion</span> attribute with value <span class="Source_20_Text">custom</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:legend-expansion-aspect-ratio</span> attribute is usable with the following element: <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:legend-expansion-aspect-ratio</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_492style_length"><span style="margin-right:0.127cm;">19.492</span></a><a id="__RefHeading__1417938_253892949"/><a id="attribute-style_length"/>style:length</h2><p class="Text_20_body">The <span class="Attribute">style:length</span> attribute specifies the number of characters that are displayed in a larger font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:length</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">word</span>: specifies a set of characters to be displayed in a larger font.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> What will be treated as a “word” by a consumer is locale specific. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:length</span> attribute is usable with the following element: <span class="Element">&lt;style:drop-cap&gt;</span> <a href="#element-style_drop-cap">17.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:length</span> attribute are <span class="Attribute_20_Value">word</span> or a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_493style_line-style"><span style="margin-right:0.127cm;">19.493</span></a><a id="__RefHeading__1417940_253892949"/><a id="attribute-style_line-style"/>style:line-style</h2><p class="Text_20_body">The <span class="Attribute">style:line-style</span> attribute specifies the style of a footnote separator line.</p><p class="Text_20_body">The defined value for the <span class="Attribute">style:line-style</span> attribute is <span class="Attribute_20_Value">none</span>: no footnote separator line is drawn.</p><p class="Text_20_body">The footnote separator components referenced by the values <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">dot-dash</span>, <span class="Attribute_20_Value">dot-dot-dash</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">long-dash</span>, <span class="Attribute_20_Value">solid</span> and <span class="Attribute_20_Value">wave</span>, are implementation-defined.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:line-style</span> attribute is usable with the following element: <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:line-style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">long-dash</span>, <span class="Attribute_20_Value">dot-dash</span>, <span class="Attribute_20_Value">dot-dot-dash</span> or <span class="Attribute_20_Value">wave</span>.</p><h2 class="Heading_20_2"><a id="a19_494style_lines"><span style="margin-right:0.127cm;">19.494</span></a><a id="__RefHeading__1417942_253892949"/><a id="attribute-style_lines"/>style:lines</h2><p class="Text_20_body">The <span class="Attribute">style:lines</span> attribute specifies the number of text lines which a font spans. If the value of this attribute is <span class="Attribute_20_Value_20_Instance">1</span>, <span class="Element">&lt;style:drop-cap&gt;</span> is disabled.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:lines</span> attribute is usable with the following element: <span class="Element">&lt;style:drop-cap&gt;</span> <a href="#element-style_drop-cap">17.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:lines</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_495style_list-level"><span style="margin-right:0.127cm;">19.495</span></a><a id="__RefHeading__1417944_253892949"/><a id="attribute-style_list-level"/>style:list-level</h2><p class="Text_20_body">The <span class="Attribute">style:list-level</span> attribute specifies the list level value of a list style that may be applied to any paragraph style. It does not directly specify the paragraph's list level value, but consumers can change the paragraph's list level value to the specified value when the paragraph style is applied. It is valid only if the <span class="Attribute">style:list-style-name</span> attribute is specified and is not empty, and if the <span class="Attribute">style:family</span> attribute has the value <span class="Attribute_20_Value">paragraph</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:list-level</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:list-level</span> attribute are a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a> or an empty string.</p><h2 class="Heading_20_2"><a id="a19_496style_list-style-name"><span style="margin-right:0.127cm;">19.496</span></a><a id="__RefHeading__1417946_253892949"/><a id="attribute-style_list-style-name"/>style:list-style-name</h2><p class="Text_20_body">The <span class="Attribute">style:list-style-name</span> attribute specifies a list style for style families with paragraph formatting properties. This applies to automatic and common styles.</p><p class="Text_20_body">The list style specified by this attribute is applied to headings and paragraphs that are contained in a list, where the list does not specify a list style itself, and the list has no list style specification for any of its parents.</p><p class="Text_20_body">The <span class="Attribute">style:list-style-name</span> attribute value can be empty. If empty, this attribute does not inherit a list style value from a parent style. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:list-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:list-style-name</span> attribute are a value of type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a> or an empty string.</p><h2 class="Heading_20_2"><a id="a19_497style_master-page-name"><span style="margin-right:0.127cm;">19.497</span></a><a id="__RefHeading__1417948_253892949"/><a id="attribute-style_master-page-name"/>style:master-page-name</h2><p class="Text_20_body">The <span class="Attribute">style:master-page-name</span> attribute defines a master page for a paragraph or table style. This applies to automatic and common styles. </p><p class="Text_20_body">If this attribute is associated with a style, a page break is inserted when the style is applied and the specified master page is applied to the resulting page.</p><p class="Text_20_body">This attribute is ignored if it is associated with a paragraph style that is applied to a paragraph within a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:master-page-name</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:master-page-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_498style_name"><span style="margin-right:0.127cm;">19.498</span></a><a id="__RefHeading__1417950_253892949"/><a id="attribute-style_name"/>style:name</h2><h3 class="Heading_20_3"><a id="a19_498_1General"><span style="margin-right:0.127cm;">19.498.1</span></a><a id="__RefHeading__1417952_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:name</span> attribute specifies names that reference style mechanisms.</p><h3 class="Heading_20_3"><a id="a19_498_2_number_boolean-style____number_currency-style____number_date-style____number_number-style____number_percentage-style____number_text-style____number_time-style____style_master-page____style_page-layout____style_presentation-page-layout____style_style____text_list-style____text_outline-style_"><span style="margin-right:0.127cm;">19.498.2</span></a><a id="__RefHeading__1417954_253892949"/><a id="attribute-style_name_element-number_currency-style"/><a id="attribute-style_name_element-number_date-style"/><a id="attribute-style_name_element-number_number-style"/><a id="attribute-style_name_element-number_percentage-style"/><a id="attribute-style_name_element-number_text-style"/><a id="attribute-style_name_element-number_time-style"/><a id="attribute-style_name_element-style_master-page"/><a id="attribute-style_name_element-style_page-layout"/><a id="attribute-style_name_element-style_presentation-page-layout"/><a id="attribute-style_name_element-style_style"/><a id="attribute-style_name_element-text_list-style"/><a id="attribute-style_name_element-text_outline-style"/><a id="attribute-style_name_element-number_boolean-style"/>&lt;number:boolean-style&gt;, &lt;number:currency-style&gt;, &lt;number:date-style&gt;, &lt;number:number-style&gt;, &lt;number:percentage-style&gt;, &lt;number:text-style&gt;, &lt;number:time-style&gt;, &lt;style:master-page&gt;, &lt;style:page-layout&gt;, &lt;style:presentation-page-layout&gt;, &lt;style:style&gt;, &lt;text:list-style&gt;, &lt;text:outline-style&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:name</span> attribute specifies the name of a:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>data style - It can be used with all data style elements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>list style<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>master page - Each master page is referenced using the page name. The name specified shall be unique to the document instance.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>outline style - The outline style as a list style can be referenced by the <span class="Attribute">style:list-style-name</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>page layout <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>style – With the <span class="Attribute">style:family</span> attribute, the <span class="Attribute">style:name</span> attribute uniquely identifies a style. The <span class="Element">&lt;office:styles&gt;</span>, <span class="Element">&lt;office:automatic-styles&gt;</span> and <span class="Element">&lt;office:master-</span><span class="Element">styles&gt;</span> elements each shall not contain two styles with the same family and the same name.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">For automatic styles, the name may be generated by OpenDocument producers. For each style family or style element, producers should generate distinct sets of names for automatic styles stored in the content.xml <a href="#element-office_document-content">3.1.3.2</a> and styles.xml <a href="#element-office_document-styles">3.1.3.3</a> files. The names should also be distinct from the names used in the <span class="Element">&lt;office:styles&gt;</span> element inside the styles.xml files.</p><p class="Note"><span class="Note_20_Label">Note:</span> If the document is produced multiple times, it cannot be assumed that the same name is generated each time. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:name</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a>, <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>, <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>, <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout">16.5</a>, <span class="Element">&lt;style:presentation-page-layout&gt;</span> <a href="#element-style_presentation-page-layout">16.41</a>, <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>, <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a> and <span class="Element">&lt;text:outline-style&gt;</span> <a href="#element-text_outline-style">16.34</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_498_3_style_font-face_"><span style="margin-right:0.127cm;">19.498.3</span></a><a id="__RefHeading__1417956_253892949"/><a id="attribute-style_name_element-style_font-face"/>&lt;style:font-face&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:name</span> attribute specifies a unique name for a font declaration. This name can be used inside styles as an attribute of the <span class="Element">&lt;style:text-properties&gt;</span> element) as the value of a <span class="Attribute">style:font-name</span> attribute to immediately select a font face declaration.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:name</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_499style_next-style-name"><span style="margin-right:0.127cm;">19.499</span></a><a id="__RefHeading__1417958_253892949"/><a id="attribute-style_next-style-name"/>style:next-style-name</h2><h3 class="Heading_20_3"><a id="a19_499_1General"><span style="margin-right:0.127cm;">19.499.1</span></a><a id="__RefHeading__1417960_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:next-style-name</span> attribute specifies a style to be used with pages and paragraphs.</p><h3 class="Heading_20_3"><a id="a19_499_2_style_master-page_"><span style="margin-right:0.127cm;">19.499.2</span></a><a id="__RefHeading__1417962_253892949"/><a id="attribute-style_next-style-name_element-style_master-page"/>&lt;style:master-page&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:next-style-name</span> attribute specifies the name of the master page that is used for the next page if the current page is entirely filled. If the next style name is not specified, the current master page is used for the next page. The value of this attribute shall be the name of a <span class="Element">&lt;style:master-page&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:next-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:next-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_499_3_style_style_"><span style="margin-right:0.127cm;">19.499.3</span></a><a id="__RefHeading__1417964_253892949"/><a id="attribute-style_next-style-name_element-style_style"/>&lt;style:style&gt;</h3><p class="Text_20_body">Within styles for paragraphs, <span class="Attribute">style:next-style-name</span> attribute specifies the style to be used for the next paragraph if a paragraph break is inserted in the user interface. By default, the current style is used as the next style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:next-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:next-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_500style_num-format"><span style="margin-right:0.127cm;">19.500</span></a><a id="__RefHeading__1417966_253892949"/><a id="attribute-style_num-format"/>style:num-format</h2><p class="Text_20_body">The <span class="Attribute">style:num-format</span> attribute specifies a numbering sequence. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:num-format</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">1</span>: Hindu-Arabic number sequence starts with 1.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">a</span>: number sequence of lowercase Modern Latin basic alphabet characters starts with “a”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">A</span>: number sequence of uppercase Modern Latin basic alphabet characters starts with “A”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span>: number sequence of lowercase Roman numerals starts with “i”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">I</span>: number sequence of uppercase Roman numerals start with “I”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>an empty string: no number sequence displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If no value is given, no number sequence is displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-format</span> attribute is usable with the following elements: <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>, <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>, <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:num-format</span> attribute are <span class="Attribute_20_Value">1</span>, <span class="Attribute_20_Value">i</span>, <span class="Attribute_20_Value">I</span>, a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>, an empty string, <span class="Attribute_20_Value">a</span> or <span class="Attribute_20_Value">A</span>.</p><h2 class="Heading_20_2"><a id="a19_501style_num-letter-sync"><span style="margin-right:0.127cm;">19.501</span></a><a id="__RefHeading__1417968_253892949"/><a id="attribute-style_num-letter-sync"/>style:num-letter-sync</h2><p class="Text_20_body">The <span class="Attribute">style:num-letter-sync</span> attribute specifies whether letter synchronization shall take place. If letters are used in alphabetical order for numbering, there are two ways to process overflows within a digit, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: A new digit is inserted that always has the same value as the following digit. The numbering sequence (for lower case numberings) in that case is a, b, c, ..., z, aa, bb, cc, ..., zz, aaa, ..., and so on.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: A new digit is inserted. Its start value is ”a” or ”A”, and it is incremented every time an overflow occurs in the following digit. The numbering sequence (for lower case numberings) in that case is a,b,c, ..., z, aa, ab, ac, ...,az, ba, ..., and so on. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-letter-sync</span> attribute is usable with the following elements: <span class="Element">&lt;text:character-count&gt;</span> <a href="#element-text_character-count">7.5.18.5</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>, <span class="Element">&lt;text:image-count&gt;</span> <a href="#element-text_image-count">7.5.18.7</a>, <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>, <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>, <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>, <span class="Element">&lt;text:object-count&gt;</span> <a href="#element-text_object-count">7.5.18.8</a>, <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>, <span class="Element">&lt;text:page-count&gt;</span> <a href="#element-text_page-count">7.5.18.2</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:page-variable-get&gt;</span> <a href="#element-text_page-variable-get">7.7.1.3</a>, <span class="Element">&lt;text:paragraph-count&gt;</span> <a href="#element-text_paragraph-count">7.5.18.3</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:table-count&gt;</span> <a href="#element-text_table-count">7.5.18.6</a> and <span class="Element">&lt;text:word-count&gt;</span> <a href="#element-text_word-count">7.5.18.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:num-letter-sync</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_502style_num-prefix"><span style="margin-right:0.127cm;">19.502</span></a><a id="__RefHeading__1417970_253892949"/><a id="attribute-style_num-prefix"/>style:num-prefix</h2><p class="Text_20_body">The <span class="Attribute">style:num-prefix</span> attribute specifies what to display before a number.</p><p class="Text_20_body">If the <span class="Attribute">style:num-prefix</span> and <span class="Attribute">style:num-suffix</span> values do not contain any character that has a Unicode category of Nd, Nl, No, Lu, Ll, Lt, Lm or Lo, an <a title="XSL Transformations (XSLT) Version 1.0" href="http://www.w3.org/TR/1999/REC-xslt-19991116">[XSLT]</a> <span class="Alien_20_Attribute">format</span> attribute can be created from the OpenDocument attributes by concatenating the values of the <span class="Attribute">style:num-prefix</span>, <span class="Attribute">style:num-format</span>, and <span class="Attribute">style:num-suffix</span> attributes.</p><p class="Text_20_body">The <span class="Attribute">style:num-prefix</span> attribute can also specify a character before the value of a <span class="Attribute">text:bullet-char</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-prefix</span> attribute is usable with the following elements: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>, <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>, <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a> and <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:num-prefix</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_503style_num-suffix"><span style="margin-right:0.127cm;">19.503</span></a><a id="__RefHeading__1417972_253892949"/><a id="attribute-style_num-suffix"/>style:num-suffix</h2><p class="Text_20_body">The <span class="Attribute">style:num-prefix</span> and <span class="Attribute">style:num-suffix</span> attributes specify what to display before and after the number.</p><p class="Text_20_body">If the <span class="Attribute">style:num-prefix</span> and <span class="Attribute">style:num-suffix</span> values do not contain any character that has a Unicode category of Nd, Nl, No, Lu, Ll, Lt, Lm or Lo, an <a title="XSL Transformations (XSLT) Version 1.0" href="http://www.w3.org/TR/1999/REC-xslt-19991116">[XSLT]</a> <span class="Alien_20_Attribute">format</span> attribute can be created from the OpenDocument attributes by concatenating the values of the <span class="Attribute">style:num-prefix</span>, <span class="Attribute">style:num-format</span>, and <span class="Attribute">style:num-suffix</span> attributes.</p><p class="Text_20_body">The <span class="Attribute">style:num-suffix</span> attribute can also specify a character after the value of a <span class="Attribute">text:bullet-char</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-suffix</span> attribute is usable with the following elements: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>, <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>, <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a> and <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:num-suffix</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_504style_page-layout-name"><span style="margin-right:0.127cm;">19.504</span></a><a id="__RefHeading__1417974_253892949"/><a id="attribute-style_page-layout-name"/>style:page-layout-name</h2><p class="Text_20_body">The <span class="Attribute">style:page-layout-name</span> attribute specifies a page layout style that contains sizes, border and orientation attributes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:page-layout-name</span> attribute is usable with the following elements: <span class="Element">&lt;presentation:notes&gt;</span> <a href="#element-presentation_notes">16.17</a>, <span class="Element">&lt;style:handout-master&gt;</span> <a href="#element-style_handout-master">10.2.1</a> and <span class="Element">&lt;style:master-page&gt;</span> <a href="#element-style_master-page">16.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:page-layout-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_505style_page-usage"><span style="margin-right:0.127cm;">19.505</span></a><a id="__RefHeading__1417976_253892949"/><a id="attribute-style_page-usage"/>style:page-usage</h2><p class="Text_20_body">The <span class="Attribute">style:page-usage</span> attribute specifies the type of pages that a page master should generate.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:page-usage</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">all</span>: if there are no <span class="Element">&lt;style:header-left&gt;</span> or <span class="Element">&lt;style:footer-left&gt;</span> elements, the header and footer content is the same for left and right pages.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: <span class="Element">&lt;style:header-left&gt;</span> or <span class="Element">&lt;style:footer-left&gt;</span> elements are ignored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">mirrored</span>: if there are no <span class="Element">&lt;style:header-left&gt;</span> or <span class="Element">&lt;style:footer-left&gt;</span> elements, the header and footer content is the same for left and right pages.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: <span class="Element">&lt;style:header-left&gt;</span> or <span class="Element">&lt;style:footer-left&gt;</span> elements are ignored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">all</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:page-usage</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout&gt;</span> <a href="#element-style_page-layout">16.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:page-usage</span> attribute are <span class="Attribute_20_Value">all</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span> or <span class="Attribute_20_Value">mirrored</span>.</p><h2 class="Heading_20_2"><a id="a19_506style_parent-style-name"><span style="margin-right:0.127cm;">19.506</span></a><a id="__RefHeading__1417978_253892949"/><a id="attribute-style_parent-style-name"/>style:parent-style-name</h2><p class="Text_20_body">The <span class="Attribute">style:parent-style-name</span> attribute specifies the name of a parent style. The parent style cannot be an automatic style and shall exist.</p><p class="Text_20_body">If a parent style is not specified, the default style which has the same family as the current style is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:parent-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:parent-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_507style_percentage-data-style-name"><span style="margin-right:0.127cm;">19.507</span></a><a id="__RefHeading__1417980_253892949"/><a id="attribute-style_percentage-data-style-name"/>style:percentage-data-style-name</h2><p class="Text_20_body">The <span class="Attribute">style:percentage-data-style-name</span> attribute references the name of a percentage data style.</p><p class="Text_20_body">This attribute should be used together with <span class="Attribute">chart:data-label-number</span> attribute when the <span class="Attribute">chart:data-label-number</span> attribute has the value <span class="Attribute_20_Value">percentage</span> or the value <span class="Attribute_20_Value">value-and-percentage</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:percentage-data-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:style&gt;</span> <a href="#element-style_style">16.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:percentage-data-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_508style_position"><span style="margin-right:0.127cm;">19.508</span></a><a id="__RefHeading__1417982_253892949"/><a id="attribute-style_position"/>style:position</h2><h3 class="Heading_20_3"><a id="a19_508_1General"><span style="margin-right:0.127cm;">19.508.1</span></a><a id="__RefHeading__1417984_253892949"/>General</h3><p class="Text_20_body">This attribute defines a position.</p><h3 class="Heading_20_3"><a id="a19_508_2_style_background-image_"><span style="margin-right:0.127cm;">19.508.2</span></a><a id="__RefHeading__1417986_253892949"/><a id="attribute-style_position_element-style_background-image"/>&lt;style:background-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:position</span> attribute specifies the position of a background image. Its value can be a space separated combination of <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">bottom</span> for the vertical position and <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">right</span> for the horizontal position. The vertical and horizontal positions can be specified in any order. If one position is specified, the other position defaults to <span class="Attribute_20_Value">center</span>. </p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a> element the default value for this attribute is <span class="Attribute_20_Value">center</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:position</span> attribute is usable with the following element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:position</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">bottom</span>, or two white space separated values, that may appear in any order. One of these values is one of: <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">right</span>. The other value is one of: <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">bottom</span>.</p><h3 class="Heading_20_3"><a id="a19_508_3_style_tab-stop_"><span style="margin-right:0.127cm;">19.508.3</span></a><a id="__RefHeading__1417988_253892949"/><a id="attribute-style_position_element-style_tab-stop"/>&lt;style:tab-stop&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:position</span> attribute specifies the position of a tab stop. Depending on the value of the <span class="Attribute">text:relative-tab-stop-position</span> attribute in the <span class="Element">&lt;text:table-of-content-source&gt;</span>, <span class="Element">&lt;text:illustration-index-source&gt;</span>, <span class="Element">&lt;text:object-index-source&gt;</span>, <span class="Element">&lt;text:user-index-source&gt;</span> or <span class="Element">&lt;text:alphabetical-index-source&gt;</span> parent element, the position of the tab is interpreted as being relative to the left margin or the left indent. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:position</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:position</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_508_4_text_index-entry-tab-stop_"><span style="margin-right:0.127cm;">19.508.4</span></a><a id="__RefHeading__1417990_253892949"/><a id="attribute-style_position_element-text_index-entry-tab-stop"/>&lt;text:index-entry-tab-stop&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:position</span> attribute specifies the position of a tab stop. If the value of the <span class="Attribute">style:type</span> attribute is <span class="Attribute_20_Value">left</span>, then this attribute shall be present. Otherwise, it shall be omitted. </p><p class="Text_20_body">Depending on the value of the <span class="Attribute">text:relative-tab-stop-position</span> attribute in the <span class="Element">&lt;text:table-of-content-source&gt;</span>, <span class="Element">&lt;text:illustration-index-source&gt;</span>, <span class="Element">&lt;text:object-index-source&gt;</span>, <span class="Element">&lt;text:user-index-source&gt;</span> or <span class="Element">&lt;text:alphabetical-index-source&gt;</span> parent element, the position of the tab is interpreted as being relative to the left margin or the left indent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:position</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:position</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_509style_rel-height"><span style="margin-right:0.127cm;">19.509</span></a><a id="__RefHeading__1417992_253892949"/><a id="attribute-style_rel-height"/>style:rel-height</h2><p class="Text_20_body">The <span class="Attribute">style:rel-height</span> attribute specifies height of a drawing object as a relative value within a frame. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:rel-height</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale</span>: the height should be calculated depending on the width, so that the ratio of width and height of the original image or object size is preserved.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale-min</span>: the height should be calculated as for value <span class="Attribute_20_Value">scale</span>, but the calculated height is a minimum height rather than an absolute one.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The interpretation of percentage values depends on the anchor of the drawing object. If the anchor for the drawing object is in a table cell, the percentage value is relative to the surrounding table box. If the anchor for the drawing object is in a text box, the percentage value is relative to the surrounding text box. In other cases, the percentage values is relative to the width of the page or window.</p><p class="Text_20_body">To support consumers that do not support relative width and heights, producers should also provide the height in <span class="Attribute">svg:height</span> and <span class="Attribute">fo:min-height</span> attributes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-height</span> attribute is usable with the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:rel-height</span> attribute are a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>, <span class="Attribute_20_Value">scale</span> or <span class="Attribute_20_Value">scale-min</span>.</p><h2 class="Heading_20_2"><a id="a19_510style_rel-width"><span style="margin-right:0.127cm;">19.510</span></a><a id="__RefHeading__1417994_253892949"/><a id="attribute-style_rel-width"/>style:rel-width</h2><h3 class="Heading_20_3"><a id="a19_510_1General"><span style="margin-right:0.127cm;">19.510.1</span></a><a id="__RefHeading__1417996_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:rel-width</span> attribute specifies widths.</p><h3 class="Heading_20_3"><a id="a19_510_2_draw_frame_"><span style="margin-right:0.127cm;">19.510.2</span></a><a id="__RefHeading__1417998_253892949"/><a id="attribute-style_rel-width_element-draw_frame"/>&lt;draw:frame&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:rel-width</span> attribute specifies the width of a drawing object as a relative value within a frame. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:rel-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale</span>:the width should be calculated depending on the height, so that the ratio of width and height of the original image or object size is preserved.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale-min</span>: the width should be calculated as for value <span class="Attribute_20_Value">scale</span>, but the calculated width is a minimum width rather than an absolute one.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The interpretation of percentage values depends on the anchor of the drawing object. If the anchor for the drawing object is in a table cell, the percentage value is relative to the surrounding table box. If the anchor for the drawing object is in a text box, the percentage value is relative to the surrounding text box. In other cases, the percentage values is relative to the width of the page or window.</p><p class="Text_20_body">To support consumers that do not support relative width, producers should also provide the width and heights in the <span class="Attribute">svg:width</span> and <span class="Attribute">fo:min-width</span> attributes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-width</span> attribute is usable with the following element: <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:rel-width</span> attribute are a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>, <span class="Attribute_20_Value">scale</span> or <span class="Attribute_20_Value">scale-min</span>.</p><h3 class="Heading_20_3"><a id="a19_510_3_style_column_"><span style="margin-right:0.127cm;">19.510.3</span></a><a id="__RefHeading__1418000_253892949"/><a id="attribute-style_rel-width_element-style_column"/>&lt;style:column&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:rel-width</span> attribute specifies the width of a column. </p><p class="Text_20_body"> Column widths are specified as relative widths, that is, a number followed by a "*" (U+002A, ASTERISK) character. The total space available for the entire table is distributed among its columns according to its relative width. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-width</span> attribute is usable with the following element: <span class="Element">&lt;style:column&gt;</span> <a href="#element-style_column">17.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rel-width</span> attribute has the data type <span class="Datatype">relativeLength</span> <a href="#datatype-relativeLength">18.3.27</a>.</p><h3 class="Heading_20_3"><a id="a19_510_4_style_footnote-sep_"><span style="margin-right:0.127cm;">19.510.4</span></a><a id="__RefHeading__1418002_253892949"/><a id="attribute-style_rel-width_element-style_footnote-sep"/>&lt;style:footnote-sep&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:rel-width</span> attribute specifies the length of the footnote separator line as a percentage of the body text area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-width</span> attribute is usable with the following element: <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rel-width</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_511style_repeat"><span style="margin-right:0.127cm;">19.511</span></a><a id="__RefHeading__1418004_253892949"/><a id="attribute-style_repeat"/>style:repeat</h2><p class="Text_20_body">The <span class="Attribute">style:repeat</span> attribute specifies if an image can be repeated or stretched over an area. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:repeat</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no-repeat</span>: image should not be repeated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">epeat</span>: image should be repeated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch</span>: image should be stretched over an area.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a> element the default value for this attribute is <span class="Attribute_20_Value">repeat</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:repeat</span> attribute is usable with the following element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:repeat</span> attribute are <span class="Attribute_20_Value">no-repeat</span>, <span class="Attribute_20_Value">repeat</span> or <span class="Attribute_20_Value">stretch</span>.</p><h2 class="Heading_20_2"><a id="a19_512style_rfc-language-tag"><span style="margin-right:0.127cm;">19.512</span></a><a id="__RefHeading__1418006_253892949"/><a id="attribute-style_rfc-language-tag"/>style:rfc-language-tag</h2><p class="Text_20_body">The <span class="Attribute">style:rfc-language-tag</span> attribute specifies a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">It shall only be used if its value can not be expressed as a valid combination of the <span class="Attribute">fo:language</span>, <span class="Attribute">fo:script</span> and <span class="Attribute">fo:country</span> attributes.</p><p class="Text_20_body">Producers may add support for consumers that don't support the <span class="Attribute">style:rfc-language-tag</span> attribute by specifying <span class="Attribute">fo:language</span>, <span class="Attribute">fo:script</span> and <span class="Attribute">fo:country</span> attributes with values that are implementation-dependent. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rfc-language-tag</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a> and <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rfc-language-tag</span> attribute has the data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h2 class="Heading_20_2"><a id="a19_513style_style"><span style="margin-right:0.127cm;">19.513</span></a><a id="__RefHeading__1418008_253892949"/><a id="attribute-style_style"/>style:style</h2><p class="Text_20_body">The <span class="Attribute">style:style</span> attribute specifies the line style of a column separator line.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:style</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no separator line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dashed</span>: dashed separator line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dashed</span>: separator line whose repeating pattern is a dot followed by a dash.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dotted</span>: dotted separator line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: solid separator line.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">solid</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:style</span> attribute is usable with the following element: <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">dashed</span> or <span class="Attribute_20_Value">dot-dashed</span>.</p><h2 class="Heading_20_2"><a id="a19_514style_style-name"><span style="margin-right:0.127cm;">19.514</span></a><a id="__RefHeading__1418010_253892949"/><a id="attribute-style_style-name"/>style:style-name</h2><p class="Text_20_body">The <span class="Attribute">style:style-name</span> attribute specifies the text style to apply to characters specified by a <span class="Element">&lt;style:drop-cap&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:drop-cap&gt;</span> <a href="#element-style_drop-cap">17.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_515style_type"><span style="margin-right:0.127cm;">19.515</span></a><a id="__RefHeading__1418012_253892949"/><a id="attribute-style_type"/>style:type</h2><h3 class="Heading_20_3"><a id="a19_515_1General"><span style="margin-right:0.127cm;">19.515.1</span></a><a id="__RefHeading__1418014_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:type</span> attribute specifies a tab stop type.</p><h3 class="Heading_20_3"><a id="a19_515_2_text_index-entry-tab-stop_"><span style="margin-right:0.127cm;">19.515.2</span></a><a id="__RefHeading__1418016_253892949"/><a id="attribute-style_type_element-text_index-entry-tab-stop"/>&lt;text:index-entry-tab-stop&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:type</span> attribute specifies the type of a tab stop. If the value of this attribute is <span class="Attribute_20_Value">left</span>, the <span class="Attribute">style:position</span> attribute shall also be present. Otherwise, this attribute shall be omitted.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: text is left aligned with a tab stop.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: text is right aligned with a tab stop.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:type</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:type</span> attribute are <span class="Attribute_20_Value">right</span> or <span class="Attribute_20_Value">left</span>.</p><h3 class="Heading_20_3"><a id="a19_515_3_style_tab-stop_"><span style="margin-right:0.127cm;">19.515.3</span></a><a id="__RefHeading__1418018_253892949"/><a id="attribute-style_type_element-style_tab-stop"/>&lt;style:tab-stop&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:type</span> attribute specifies the type of a tab stop. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: text is centered on a tab stop.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">har</span>: character appears at a tab stop position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: text is left aligned with a tab stop.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ight</span>: text is right aligned with a tab stop.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:type</span> attribute is usable with the following element: <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a>.</p><p class="Attribute_20_Value_20_List">The values of the <span class="Attribute">style:type</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span> or <span class="Attribute_20_Value">char</span>.</p><p class="Default_20_Value_borderEnd">For a <span class="Element">&lt;style:tab-stop&gt;</span> <a href="#element-style_tab-stop">17.8</a> element the default value for this attribute is <span class="Attribute_20_Value">left</span>.</p><h2 class="Heading_20_2"><a id="a19_516style_vertical-align"><span style="margin-right:0.127cm;">19.516</span></a><a id="__RefHeading__1418020_253892949"/><a id="attribute-style_vertical-align"/>style:vertical-align</h2><p class="Text_20_body">The <span class="Attribute">style:vertical-align</span> attribute specifies how to vertically align a line that is less than 100% of its height within the columned area. The value of this attribute can be either <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">middle</span>, or <span class="Attribute_20_Value">bottom</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:vertical-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: line is aligned with the bottom of a columned area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">middle</span>: line is aligned with the middle of a columned area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: line is aligned with the top of a columned area.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a> element the default value for this attribute is <span class="Attribute_20_Value">top</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">style:vertical-align</span> attribute is usable with the following element: <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:vertical-align</span> attribute are <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">middle</span> or <span class="Attribute_20_Value">bottom</span>.</p><h2 class="Heading_20_2"><a id="a19_517style_volatile"><span style="margin-right:0.127cm;">19.517</span></a><a id="__RefHeading__1418022_253892949"/><a id="attribute-style_volatile"/>style:volatile</h2><p class="Text_20_body">The <span class="Attribute">style:volatile</span> attribute specifies whether unused style in a document are retained or discarded by consumers.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:volatile</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumers should discard the unused styles.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumers should keep unused styles.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:volatile</span> attribute is usable with the following elements: <span class="Element">&lt;number:boolean-style&gt;</span> <a href="#element-number_boolean-style">16.27.23</a>, <span class="Element">&lt;number:currency-style&gt;</span> <a href="#element-number_currency-style">16.27.7</a>, <span class="Element">&lt;number:date-style&gt;</span> <a href="#element-number_date-style">16.27.10</a>, <span class="Element">&lt;number:number-style&gt;</span> <a href="#element-number_number-style">16.27.2</a>, <span class="Element">&lt;number:percentage-style&gt;</span> <a href="#element-number_percentage-style">16.27.9</a>, <span class="Element">&lt;number:text-style&gt;</span> <a href="#element-number_text-style">16.27.25</a> and <span class="Element">&lt;number:time-style&gt;</span> <a href="#element-number_time-style">16.27.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:volatile</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_518style_width"><span style="margin-right:0.127cm;">19.518</span></a><a id="__RefHeading__1418024_253892949"/><a id="attribute-style_width"/>style:width</h2><h3 class="Heading_20_3"><a id="a19_518_1General"><span style="margin-right:0.127cm;">19.518.1</span></a><a id="__RefHeading__1418026_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:width</span> attribute specifies a width. </p><h3 class="Heading_20_3"><a id="a19_518_2_style_column-sep_"><span style="margin-right:0.127cm;">19.518.2</span></a><a id="__RefHeading__1418028_253892949"/><a id="attribute-style_width_element-style_column-sep"/>&lt;style:column-sep&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:width</span> attribute specifies the width of a column separation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:width</span> attribute is usable with the following element: <span class="Element">&lt;style:column-sep&gt;</span> <a href="#element-style_column-sep">17.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_518_3_style_footnote-sep_"><span style="margin-right:0.127cm;">19.518.3</span></a><a id="__RefHeading__1418030_253892949"/><a id="attribute-style_width_element-style_footnote-sep"/>&lt;style:footnote-sep&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:width</span> attribute width or thickness of a line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:width</span> attribute is usable with the following element: <span class="Element">&lt;style:footnote-sep&gt;</span> <a href="#element-style_footnote-sep">17.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_519svg_accent-height"><span style="margin-right:0.127cm;">19.519</span></a><a id="__RefHeading__1418032_253892949"/><a id="attribute-svg_accent-height"/>svg:accent-height</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:accent-height</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:accent-height</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_520svg_alphabetic"><span style="margin-right:0.127cm;">19.520</span></a><a id="__RefHeading__1418034_253892949"/><a id="attribute-svg_alphabetic"/>svg:alphabetic</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:alphabetic</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:alphabetic</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_521svg_ascent"><span style="margin-right:0.127cm;">19.521</span></a><a id="__RefHeading__1418036_253892949"/><a id="attribute-svg_ascent"/>svg:ascent</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:ascent</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:ascent</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_522svg_bbox"><span style="margin-right:0.127cm;">19.522</span></a><a id="__RefHeading__1418038_253892949"/><a id="attribute-svg_bbox"/>svg:bbox</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:bbox</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:bbox</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_523svg_cap-height"><span style="margin-right:0.127cm;">19.523</span></a><a id="__RefHeading__1418040_253892949"/><a id="attribute-svg_cap-height"/>svg:cap-height</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cap-height</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cap-height</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_524svg_cx"><span style="margin-right:0.127cm;">19.524</span></a><a id="__RefHeading__1418042_253892949"/><a id="attribute-svg_cx"/>svg:cx</h2><h3 class="Heading_20_3"><a id="a19_524_1_draw_area-circle_"><span style="margin-right:0.127cm;">19.524.1</span></a><a id="__RefHeading__1418044_253892949"/><a id="attribute-svg_cx_element-draw_area-circle"/>&lt;draw:area-circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:cx</span> attribute defines the x-axis coordinate of the center of a circular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cx</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cx</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_524_2_draw_circle_"><span style="margin-right:0.127cm;">19.524.2</span></a><a id="__RefHeading__1418046_253892949"/><a id="attribute-svg_cx_element-draw_circle"/>&lt;draw:circle&gt;</h3><p class="Text_20_body">See §9.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cx</span> attribute is usable with the following element: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cx</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_524_3_draw_ellipse_"><span style="margin-right:0.127cm;">19.524.3</span></a><a id="__RefHeading__1418048_253892949"/><a id="attribute-svg_cx_element-draw_ellipse"/>&lt;draw:ellipse&gt;</h3><p class="Text_20_body">See §9.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cx</span> attribute is usable with the following element: <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cx</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_524_4_svg_radialGradient_"><span style="margin-right:0.127cm;">19.524.4</span></a><a id="__RefHeading__1418050_253892949"/><a id="attribute-svg_cx_element-svg_radialGradient"/>&lt;svg:radialGradient&gt;</h3><p class="Text_20_body">See §13.3.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">50%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:cx</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:cx</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_525svg_cy"><span style="margin-right:0.127cm;">19.525</span></a><a id="__RefHeading__1418052_253892949"/><a id="attribute-svg_cy"/>svg:cy</h2><h3 class="Heading_20_3"><a id="a19_525_1_draw_area-circle_"><span style="margin-right:0.127cm;">19.525.1</span></a><a id="__RefHeading__1418054_253892949"/><a id="attribute-svg_cy_element-draw_area-circle"/>&lt;draw:area-circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:cy</span> attribute defines the y-axis coordinate of the center of a circular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cy</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cy</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_525_2_draw_circle_"><span style="margin-right:0.127cm;">19.525.2</span></a><a id="__RefHeading__1418056_253892949"/><a id="attribute-svg_cy_element-draw_circle"/>&lt;draw:circle&gt;</h3><p class="Text_20_body">See §9.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cy</span> attribute is usable with the following element: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cy</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_525_3_draw_ellipse_"><span style="margin-right:0.127cm;">19.525.3</span></a><a id="__RefHeading__1418058_253892949"/><a id="attribute-svg_cy_element-draw_ellipse"/>&lt;draw:ellipse&gt;</h3><p class="Text_20_body">See §9.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:cy</span> attribute is usable with the following element: <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:cy</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_525_4_svg_radialGradient_"><span style="margin-right:0.127cm;">19.525.4</span></a><a id="__RefHeading__1418060_253892949"/><a id="attribute-svg_cy_element-svg_radialGradient"/>&lt;svg:radialGradient&gt;</h3><p class="Text_20_body">See §13.3.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">50%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:cy</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:cy</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_526svg_d"><span style="margin-right:0.127cm;">19.526</span></a><a id="__RefHeading__1418062_253892949"/><a id="attribute-svg_d"/>svg:d</h2><p class="Text_20_body">See §8 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:d</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:contour-path&gt;</span> <a href="#element-draw_contour-path">10.4.11.3</a>, <span class="Element">&lt;draw:marker&gt;</span> <a href="#element-draw_marker">16.40.8</a> and <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:d</span> attribute has the data type <span class="Datatype">pathData</span> <a href="#datatype-pathData">18.3.22</a>.</p><h2 class="Heading_20_2"><a id="a19_527svg_descent"><span style="margin-right:0.127cm;">19.527</span></a><a id="__RefHeading__1418064_253892949"/><a id="attribute-svg_descent"/>svg:descent</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:descent</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:descent</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_528svg_font-family"><span style="margin-right:0.127cm;">19.528</span></a><a id="__RefHeading__1418066_253892949"/><a id="attribute-svg_font-family"/>svg:font-family</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:font-family</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:font-family</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_529svg_font-size"><span style="margin-right:0.127cm;">19.529</span></a><a id="__RefHeading__1418068_253892949"/><a id="attribute-svg_font-size"/>svg:font-size</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:font-size</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:font-size</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a19_530svg_font-stretch"><span style="margin-right:0.127cm;">19.530</span></a><a id="__RefHeading__1418070_253892949"/><a id="attribute-svg_font-stretch"/>svg:font-stretch</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:font-stretch</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:font-stretch</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">ultra-condensed</span>, <span class="Attribute_20_Value">extra-condensed</span>, <span class="Attribute_20_Value">condensed</span>, <span class="Attribute_20_Value">semi-condensed</span>, <span class="Attribute_20_Value">semi-expanded</span>, <span class="Attribute_20_Value">expanded</span>, <span class="Attribute_20_Value">extra-expanded</span> or <span class="Attribute_20_Value">ultra-expanded</span>.</p><h2 class="Heading_20_2"><a id="a19_531svg_font-style"><span style="margin-right:0.127cm;">19.531</span></a><a id="__RefHeading__1418072_253892949"/><a id="attribute-svg_font-style"/>svg:font-style</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:font-style</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:font-style</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">italic</span> or <span class="Attribute_20_Value">oblique</span>.</p><h2 class="Heading_20_2"><a id="a19_532svg_font-variant"><span style="margin-right:0.127cm;">19.532</span></a><a id="__RefHeading__1418074_253892949"/><a id="attribute-svg_font-variant"/>svg:font-variant</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:font-variant</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:font-variant</span> attribute are <span class="Attribute_20_Value">normal</span> or <span class="Attribute_20_Value">small-caps</span>.</p><h2 class="Heading_20_2"><a id="a19_533svg_font-weight"><span style="margin-right:0.127cm;">19.533</span></a><a id="__RefHeading__1418076_253892949"/><a id="attribute-svg_font-weight"/>svg:font-weight</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:font-weight</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:font-weight</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">100</span>, <span class="Attribute_20_Value">200</span>, <span class="Attribute_20_Value">300</span>, <span class="Attribute_20_Value">400</span>, <span class="Attribute_20_Value">500</span>, <span class="Attribute_20_Value">600</span>, <span class="Attribute_20_Value">700</span>, <span class="Attribute_20_Value">800</span> or <span class="Attribute_20_Value">900</span>.</p><h2 class="Heading_20_2"><a id="a19_534svg_fx"><span style="margin-right:0.127cm;">19.534</span></a><a id="__RefHeading__1418078_253892949"/><a id="attribute-svg_fx"/>svg:fx</h2><p class="Text_20_body">See §13.2.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:fx</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:fx</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_535svg_fy"><span style="margin-right:0.127cm;">19.535</span></a><a id="__RefHeading__1418080_253892949"/><a id="attribute-svg_fy"/>svg:fy</h2><p class="Text_20_body">See §13.2.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:fy</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:fy</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_536svg_gradientTransform"><span style="margin-right:0.127cm;">19.536</span></a><a id="__RefHeading__1418082_253892949"/><a id="attribute-svg_gradientTransform"/>svg:gradientTransform</h2><p class="Text_20_body">See §13.2.2 and §13.2.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:gradientTransform</span> attribute is usable with the following elements: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> and <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:gradientTransform</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_537svg_gradientUnits"><span style="margin-right:0.127cm;">19.537</span></a><a id="__RefHeading__1418084_253892949"/><a id="attribute-svg_gradientUnits"/>svg:gradientUnits</h2><p class="Text_20_body">See §13.2.2 and §13.2.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">objectBoundingBox</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:gradientUnits</span> attribute is usable with the following elements: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> and <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The only value of the <span class="Attribute">svg:gradientUnits</span> attribute is <span class="Attribute_20_Value">objectBoundingBox</span>.</p><h2 class="Heading_20_2"><a id="a19_538svg_hanging"><span style="margin-right:0.127cm;">19.538</span></a><a id="__RefHeading__1418086_253892949"/><a id="attribute-svg_hanging"/>svg:hanging</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:hanging</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:hanging</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_539svg_height"><span style="margin-right:0.127cm;">19.539</span></a><a id="__RefHeading__1418088_253892949"/><a id="attribute-svg_height"/>svg:height</h2><h3 class="Heading_20_3"><a id="a19_539_1_chart_chart_"><span style="margin-right:0.127cm;">19.539.1</span></a><a id="__RefHeading__1418090_253892949"/><a id="attribute-svg_height_element-chart_chart"/>&lt;chart:chart&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute defines the height of the entire chart. If it is omitted, the size of the chart is determined by the size of the window in which the chart is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_2_chart_plot-area_"><span style="margin-right:0.127cm;">19.539.2</span></a><a id="__RefHeading__1418092_253892949"/><a id="attribute-svg_height_element-chart_plot-area"/>&lt;chart:plot-area&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute defines the height of the plot-area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_3_dr3d_scene_"><span style="margin-right:0.127cm;">19.539.3</span></a><a id="__RefHeading__1418094_253892949"/><a id="attribute-svg_height_element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_height_element-draw_caption">19.539.8</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_4_draw_area-polygon_"><span style="margin-right:0.127cm;">19.539.4</span></a><a id="__RefHeading__1418096_253892949"/><a id="attribute-svg_height_element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute defines the height of a polygonal image map area's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_5_draw_area-rectangle_"><span style="margin-right:0.127cm;">19.539.5</span></a><a id="__RefHeading__1418098_253892949"/><a id="attribute-svg_height_element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:</span><span class="Attribute">height</span> attribute defines the height of a rectangular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_6_draw_contour-polygon____draw_contour-path_"><span style="margin-right:0.127cm;">19.539.6</span></a><a id="__RefHeading__1418100_253892949"/><a id="attribute-svg_height_element-draw_contour-polygon"/><a id="attribute-svg_height_element-draw_contour-path"/>&lt;draw:contour-polygon&gt;, &lt;draw:contour-path&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:</span><span class="Attribute">height</span> attribute defines the height of a contour's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following elements: <span class="Element">&lt;draw:contour-path&gt;</span> <a href="#element-draw_contour-path">10.4.11.3</a> and <span class="Element">&lt;draw:contour-polygon&gt;</span> <a href="#element-draw_contour-polygon">10.4.11.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_7_draw_fill-image_"><span style="margin-right:0.127cm;">19.539.7</span></a><a id="__RefHeading__1418102_253892949"/><a id="attribute-svg_height_element-draw_fill-image"/>&lt;draw:fill-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute may be used to specify the height of a linked image. Its value is overridden by the height of the linked image resource.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> This attribute can be used to estimate the size of a fill image without loading the image data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_8_draw_caption____draw_custom-shape____draw_circle____draw_control____draw_ellipse____draw_frame____draw_rect____draw_page-thumbnail____draw_path____draw_polygon____draw_polyline____draw_regular-polygon_"><span style="margin-right:0.127cm;">19.539.8</span></a><a id="__RefHeading__1418104_253892949"/><a id="attribute-svg_height_element-draw_caption"/><a id="attribute-svg_height_element-draw_custom-shape"/><a id="attribute-svg_height_element-draw_circle"/><a id="attribute-svg_height_element-draw_control"/><a id="attribute-svg_height_element-draw_ellipse"/><a id="attribute-svg_height_element-draw_frame"/><a id="attribute-svg_height_element-draw_rect"/><a id="attribute-svg_height_element-draw_page-thumbnail"/><a id="attribute-svg_height_element-draw_path"/><a id="attribute-svg_height_element-draw_polygon"/><a id="attribute-svg_height_element-draw_polyline"/><a id="attribute-svg_height_element-draw_regular-polygon"/>&lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">See §5.1.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. For drawing shapes that have a non rectangular shape, the length refers to the drawing shape's bounding box.</p><p class="Text_20_body">If the <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attributes specify different values for a <span class="Element">&lt;draw:circle&gt;</span> element, the radius of the circle is derived from the smaller of the two values, and the circle is centered within the bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_9_office_annotation_"><span style="margin-right:0.127cm;">19.539.9</span></a><a id="__RefHeading__1418106_253892949"/><a id="attribute-svg_height_element-office_annotation"/>&lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute specifies the height of the rectangular which displays the annotation. Its meaning is the same as for a <span class="Element">&lt;draw:caption&gt;</span> element. See <a href="#attribute-svg_width_element-draw_caption">19.571.10</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_539_10_presentation_placeholder_"><span style="margin-right:0.127cm;">19.539.10</span></a><a id="__RefHeading__1418108_253892949"/><a id="attribute-svg_height_element-presentation_placeholder"/>&lt;presentation:placeholder&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_width_element-draw_caption">19.571.10</a>. Percentage values are relative to the height of the drawing page. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;presentation:placeholder&gt;</span> <a href="#element-presentation_placeholder">16.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:height</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_540svg_ideographic"><span style="margin-right:0.127cm;">19.540</span></a><a id="__RefHeading__1418110_253892949"/><a id="attribute-svg_ideographic"/>svg:ideographic</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:ideographic</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:ideographic</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_541svg_mathematical"><span style="margin-right:0.127cm;">19.541</span></a><a id="__RefHeading__1418112_253892949"/><a id="attribute-svg_mathematical"/>svg:mathematical</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:mathematical</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:mathematical</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_542svg_name"><span style="margin-right:0.127cm;">19.542</span></a><a id="__RefHeading__1418114_253892949"/><a id="attribute-svg_name"/>svg:name</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:name</span> attribute is usable with the following element: <span class="Element">&lt;svg:font-face-name&gt;</span> <a href="#element-svg_font-face-name">16.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_543svg_offset"><span style="margin-right:0.127cm;">19.543</span></a><a id="__RefHeading__1418116_253892949"/><a id="attribute-svg_offset"/>svg:offset</h2><p class="Text_20_body">See §13.2.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:offset</span> attribute is usable with the following element: <span class="Element">&lt;svg:stop&gt;</span> <a href="#element-svg_stop">16.40.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:offset</span> attribute are a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_544svg_origin"><span style="margin-right:0.127cm;">19.544</span></a><a id="__RefHeading__1418118_253892949"/><a id="attribute-svg_origin"/>svg:origin</h2><p class="Text_20_body">See §19.2.12 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Note"><span class="Note_20_Label">Note:</span> SVG relies upon the definition of origin in SMIL, see: <a href="http://www.w3.org/TR/2001/REC-smil-animation-20010904/#MotionOriginAttribute">http://www.w3.org/TR/2001/REC-smil-animation-20010904/#MotionOriginAttribute</a>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:origin</span> attribute is usable with the following element: <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:origin</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_545svg_overline-position"><span style="margin-right:0.127cm;">19.545</span></a><a id="__RefHeading__1418120_253892949"/><a id="attribute-svg_overline-position"/>svg:overline-position</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:overline-position</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:overline-position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_546svg_overline-thickness"><span style="margin-right:0.127cm;">19.546</span></a><a id="__RefHeading__1418122_253892949"/><a id="attribute-svg_overline-thickness"/>svg:overline-thickness</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:overline-thickness</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:overline-thickness</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_547svg_panose-1"><span style="margin-right:0.127cm;">19.547</span></a><a id="__RefHeading__1418124_253892949"/><a id="attribute-svg_panose-1"/>svg:panose-1</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:panose-1</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:panose-1</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_548svg_path"><span style="margin-right:0.127cm;">19.548</span></a><a id="__RefHeading__1418126_253892949"/><a id="attribute-svg_path"/>svg:path</h2><p class="Text_20_body">See §19.2.12 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:path</span> attribute is usable with the following element: <span class="Element">&lt;anim:animateMotion&gt;</span> <a href="#element-anim_animateMotion">15.2.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:path</span> attribute has the data type <span class="Datatype">pathData</span> <a href="#datatype-pathData">18.3.22</a>.</p><h2 class="Heading_20_2"><a id="a19_549svg_r"><span style="margin-right:0.127cm;">19.549</span></a><a id="__RefHeading__1418128_253892949"/><a id="attribute-svg_r"/>svg:r</h2><h3 class="Heading_20_3"><a id="a19_549_1_draw_area-circle_"><span style="margin-right:0.127cm;">19.549.1</span></a><a id="__RefHeading__1418130_253892949"/><a id="attribute-svg_r_element-draw_area-circle"/>&lt;draw:area-circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:r</span> attribute defines the radius of a circular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:r</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:r</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_549_2_draw_circle_"><span style="margin-right:0.127cm;">19.549.2</span></a><a id="__RefHeading__1418132_253892949"/><a id="attribute-svg_r_element-draw_circle"/>&lt;draw:circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:r</span> attribute defines the radius of a circle. The use of this attribute is defined by §9.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Note"><span class="Note_20_Label">Note:</span> If a <span class="Element">&lt;draw:circle&gt;</span> element does not have a value for the <span class="Attribute">svg:r</span> attribute, then its <span class="Attribute">svg:x</span>, <span class="Attribute">svg:y</span>, <span class="Attribute">svg:height</span>, and <span class="Attribute">svg:width</span> attributes can be used to define the geometry of a circle.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:r</span> attribute is usable with the following element: <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:r</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_549_3_svg_radialGradient_"><span style="margin-right:0.127cm;">19.549.3</span></a><a id="__RefHeading__1418134_253892949"/><a id="attribute-svg_r_element-svg_radialGradient"/>&lt;svg:radialGradient&gt;</h3><p class="Text_20_body">See §13.2.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">50%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:r</span> attribute is usable with the following element: <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:r</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_550svg_rx"><span style="margin-right:0.127cm;">19.550</span></a><a id="__RefHeading__1418136_253892949"/><a id="attribute-svg_rx"/>svg:rx</h2><p class="Text_20_body">See §9.4 of<a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. </p><p class="Text_20_body">The <span class="Attribute">svg:rx</span> and <span class="Attribute">svg:ry</span> attributes can be used to round off the corners of a rectangle. The <span class="Attribute">svg:rx</span> attribute specifies the x-axis radius of the ellipse used to round off the corners of a rectangle. The <span class="Attribute">svg:ry</span> attribute specifies the y-axis radius of that ellipse. If only the <span class="Attribute">svg:rx</span> attribute is present then its value will be used for <span class="Attribute">svg:ry</span>. If only a <span class="Attribute">svg:ry</span> attribute is present then its value will be used for <span class="Attribute">svg:rx</span>.</p><p class="Text_20_body">For use of this attribute with <span class="Element">&lt;draw:rect&gt;</span> see §9.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. </p><p class="Text_20_body">For use of this attribute with <span class="Element">&lt;draw:ellipse&gt;</span> see §9.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:rx</span> attribute is usable with the following elements: <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a> and <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:rx</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a19_551svg_ry"><span style="margin-right:0.127cm;">19.551</span></a><a id="__RefHeading__1418138_253892949"/><a id="attribute-svg_ry"/>svg:ry</h2><p class="Text_20_body">See §9.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. </p><p class="Text_20_body">The <span class="Attribute">svg:rx</span> and <span class="Attribute">svg:ry</span> attributes can be used to round off the corners of a rectangle. The <span class="Attribute">svg:rx</span> attribute specifies the x-axis radius of the ellipse used to round off the corners of a rectangle. The <span class="Attribute">svg:ry</span> attribute specifies the y-axis radius of that ellipse. If only the <span class="Attribute">svg:rx</span> attribute is present then its value will be used for <span class="Attribute">svg:ry</span>. If only a <span class="Attribute">svg:ry</span> attribute is present then its value will be used for <span class="Attribute">svg:rx</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:ry</span> attribute is usable with the following elements: <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a> and <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:ry</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a19_552svg_slope"><span style="margin-right:0.127cm;">19.552</span></a><a id="__RefHeading__1418140_253892949"/><a id="attribute-svg_slope"/>svg:slope</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:slope</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:slope</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_553svg_spreadMethod"><span style="margin-right:0.127cm;">19.553</span></a><a id="__RefHeading__1418142_253892949"/><a id="attribute-svg_spreadMethod"/>svg:spreadMethod</h2><p class="Text_20_body">See §13.2.2 and §13.2.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">pad</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:spreadMethod</span> attribute is usable with the following elements: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> and <span class="Element">&lt;svg:radialGradient&gt;</span> <a href="#element-svg_radialGradient">16.40.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:spreadMethod</span> attribute are <span class="Attribute_20_Value">pad</span>, <span class="Attribute_20_Value">reflect</span> or <span class="Attribute_20_Value">repeat</span>.</p><h2 class="Heading_20_2"><a id="a19_554svg_stemh"><span style="margin-right:0.127cm;">19.554</span></a><a id="__RefHeading__1418144_253892949"/><a id="attribute-svg_stemh"/>svg:stemh</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stemh</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:stemh</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_555svg_stemv"><span style="margin-right:0.127cm;">19.555</span></a><a id="__RefHeading__1418146_253892949"/><a id="attribute-svg_stemv"/>svg:stemv</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stemv</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:stemv</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_556svg_stop-color"><span style="margin-right:0.127cm;">19.556</span></a><a id="__RefHeading__1418148_253892949"/><a id="attribute-svg_stop-color"/>svg:stop-color</h2><p class="Text_20_body">See §13.2.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stop-color</span> attribute is usable with the following element: <span class="Element">&lt;svg:stop&gt;</span> <a href="#element-svg_stop">16.40.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:stop-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_557svg_stop-opacity"><span style="margin-right:0.127cm;">19.557</span></a><a id="__RefHeading__1418150_253892949"/><a id="attribute-svg_stop-opacity"/>svg:stop-opacity</h2><p class="Text_20_body">See §13.2.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stop-opacity</span> attribute is usable with the following element: <span class="Element">&lt;svg:stop&gt;</span> <a href="#element-svg_stop">16.40.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:stop-opacity</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_558svg_strikethrough-position"><span style="margin-right:0.127cm;">19.558</span></a><a id="__RefHeading__1418152_253892949"/><a id="attribute-svg_strikethrough-position"/>svg:strikethrough-position</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:strikethrough-position</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:strikethrough-position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_559svg_strikethrough-thickness"><span style="margin-right:0.127cm;">19.559</span></a><a id="__RefHeading__1418154_253892949"/><a id="attribute-svg_strikethrough-thickness"/>svg:strikethrough-thickness</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:strikethrough-thickness</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:strikethrough-thickness</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_560svg_string"><span style="margin-right:0.127cm;">19.560</span></a><a id="__RefHeading__1418156_253892949"/><a id="attribute-svg_string"/>svg:string</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:string</span> attribute is usable with the following element: <span class="Element">&lt;svg:font-face-format&gt;</span> <a href="#element-svg_font-face-format">16.26</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:string</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_561svg_type"><span style="margin-right:0.127cm;">19.561</span></a><a id="__RefHeading__1418158_253892949"/><a id="attribute-svg_type"/>svg:type</h2><p class="Text_20_body">See §19.2.14 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:type</span> attribute is usable with the following element: <span class="Element">&lt;anim:animateTransform&gt;</span> <a href="#element-anim_animateTransform">15.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:type</span> attribute are <span class="Attribute_20_Value">translate</span>, <span class="Attribute_20_Value">scale</span>, <span class="Attribute_20_Value">rotate</span>, <span class="Attribute_20_Value">skewX</span> or <span class="Attribute_20_Value">skewY</span>.</p><h2 class="Heading_20_2"><a id="a19_562svg_underline-position"><span style="margin-right:0.127cm;">19.562</span></a><a id="__RefHeading__1418160_253892949"/><a id="attribute-svg_underline-position"/>svg:underline-position</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:underline-position</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:underline-position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_563svg_underline-thickness"><span style="margin-right:0.127cm;">19.563</span></a><a id="__RefHeading__1418162_253892949"/><a id="attribute-svg_underline-thickness"/>svg:underline-thickness</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:underline-thickness</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:underline-thickness</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_564svg_unicode-range"><span style="margin-right:0.127cm;">19.564</span></a><a id="__RefHeading__1418164_253892949"/><a id="attribute-svg_unicode-range"/>svg:unicode-range</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:unicode-range</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:unicode-range</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_565svg_units-per-em"><span style="margin-right:0.127cm;">19.565</span></a><a id="__RefHeading__1418166_253892949"/><a id="attribute-svg_units-per-em"/>svg:units-per-em</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:units-per-em</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:units-per-em</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_566svg_v-alphabetic"><span style="margin-right:0.127cm;">19.566</span></a><a id="__RefHeading__1418168_253892949"/><a id="attribute-svg_v-alphabetic"/>svg:v-alphabetic</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:v-alphabetic</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:v-alphabetic</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_567svg_v-hanging"><span style="margin-right:0.127cm;">19.567</span></a><a id="__RefHeading__1418170_253892949"/><a id="attribute-svg_v-hanging"/>svg:v-hanging</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:v-hanging</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:v-hanging</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_568svg_v-ideographic"><span style="margin-right:0.127cm;">19.568</span></a><a id="__RefHeading__1418172_253892949"/><a id="attribute-svg_v-ideographic"/>svg:v-ideographic</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:v-ideographic</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:v-ideographic</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_569svg_v-mathematical"><span style="margin-right:0.127cm;">19.569</span></a><a id="__RefHeading__1418174_253892949"/><a id="attribute-svg_v-mathematical"/>svg:v-mathematical</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:v-mathematical</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:v-mathematical</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_570svg_viewBox"><span style="margin-right:0.127cm;">19.570</span></a><a id="__RefHeading__1418176_253892949"/><a id="attribute-svg_viewBox"/>svg:viewBox</h2><p class="Text_20_body">The <span class="Attribute">svg:viewBox</span> attribute establishes a user coordinate system inside the coordinate system of the shape specified by the position and size attributes. This user coordinate system is used by the <span class="Attribute">draw:points</span> and <span class="Attribute">svg:d</span> attributes, as well as by the attributes of <span class="Element">&lt;draw:enhanced-geometry&gt;</span> element and its child elements which specify coordinates.</p><p class="Text_20_body">The syntax for using this attribute is the same as the <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a> syntax. The value of the attribute are four numbers separated by white spaces, which define the left, top, right, and bottom dimensions of the user coordinate system.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:viewBox</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:contour-path&gt;</span> <a href="#element-draw_contour-path">10.4.11.3</a>, <span class="Element">&lt;draw:contour-polygon&gt;</span> <a href="#element-draw_contour-polygon">10.4.11.2</a>, <span class="Element">&lt;draw:enhanced-geometry&gt;</span> <a href="#element-draw_enhanced-geometry">10.6.2</a>, <span class="Element">&lt;draw:marker&gt;</span> <a href="#element-draw_marker">16.40.8</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a> and <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:viewBox</span> attribute are four white space separated values of type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_571svg_width"><span style="margin-right:0.127cm;">19.571</span></a><a id="__RefHeading__1418178_253892949"/><a id="attribute-svg_width"/>svg:width</h2><h3 class="Heading_20_3"><a id="a19_571_1_chart_chart_"><span style="margin-right:0.127cm;">19.571.1</span></a><a id="__RefHeading__1418180_253892949"/><a id="attribute-svg_width_element-chart_chart"/>&lt;chart:chart&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute defines the width of a chart. If it is omitted, the size of a chart is determined by the size of the window in which the chart is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_2_chart_floor_"><span style="margin-right:0.127cm;">19.571.2</span></a><a id="__RefHeading__1418182_253892949"/><a id="attribute-svg_width_element-chart_floor"/>&lt;chart:floor&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute defines the thickness of a floor.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;chart:floor&gt;</span> <a href="#element-chart_floor">11.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_3_chart_plot-area_"><span style="margin-right:0.127cm;">19.571.3</span></a><a id="__RefHeading__1418184_253892949"/><a id="attribute-svg_width_element-chart_plot-area"/>&lt;chart:plot-area&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute defines the width of a plot-area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_4_chart_wall_"><span style="margin-right:0.127cm;">19.571.4</span></a><a id="__RefHeading__1418186_253892949"/><a id="attribute-svg_width_element-chart_wall"/>&lt;chart:wall&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute specifies the thickness of a wall for three-dimensional charts.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;chart:wall&gt;</span> <a href="#element-chart_wall">11.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_5_dr3d_scene_"><span style="margin-right:0.127cm;">19.571.5</span></a><a id="__RefHeading__1418188_253892949"/><a id="attribute-svg_width_element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_width_element-draw_caption">19.571.10</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_6_draw_area-polygon_"><span style="margin-right:0.127cm;">19.571.6</span></a><a id="__RefHeading__1418190_253892949"/><a id="attribute-svg_width_element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute defines the width of a polygonal image map area's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_7_draw_area-rectangle_"><span style="margin-right:0.127cm;">19.571.7</span></a><a id="__RefHeading__1418192_253892949"/><a id="attribute-svg_width_element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute defines the width of a rectangular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_8_draw_contour-polygon____draw_contour-path_"><span style="margin-right:0.127cm;">19.571.8</span></a><a id="__RefHeading__1418194_253892949"/><a id="attribute-svg_width_element-draw_contour-polygon"/><a id="attribute-svg_width_element-draw_contour-path"/>&lt;draw:contour-polygon&gt;, &lt;draw:contour-path&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute defines the width of a contour's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following elements: <span class="Element">&lt;draw:contour-path&gt;</span> <a href="#element-draw_contour-path">10.4.11.3</a> and <span class="Element">&lt;draw:contour-polygon&gt;</span> <a href="#element-draw_contour-polygon">10.4.11.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_9_draw_fill-image_"><span style="margin-right:0.127cm;">19.571.9</span></a><a id="__RefHeading__1418196_253892949"/><a id="attribute-svg_width_element-draw_fill-image"/>&lt;draw:fill-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute may be used to specify the width of a linked image. Its value is overridden by the width of the linked image resource.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> This attribute can be used to estimate the size of a fill image without loading the image data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_10_draw_caption____draw_custom-shape____draw_circle____draw_control____draw_ellipse____draw_frame____draw_rect____draw_page-thumbnail____draw_path____draw_polygon____draw_polyline____draw_regular-polygon_"><span style="margin-right:0.127cm;">19.571.10</span></a><a id="__RefHeading__1418198_253892949"/><a id="attribute-svg_width_element-draw_caption"/><a id="attribute-svg_width_element-draw_custom-shape"/><a id="attribute-svg_width_element-draw_circle"/><a id="attribute-svg_width_element-draw_control"/><a id="attribute-svg_width_element-draw_ellipse"/><a id="attribute-svg_width_element-draw_frame"/><a id="attribute-svg_width_element-draw_rect"/><a id="attribute-svg_width_element-draw_page-thumbnail"/><a id="attribute-svg_width_element-draw_path"/><a id="attribute-svg_width_element-draw_polygon"/><a id="attribute-svg_width_element-draw_polyline"/><a id="attribute-svg_width_element-draw_regular-polygon"/>&lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">See §5.1.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. For drawing shapes that have a non rectangular shape, the length refers to the drawing shape's bounding box.</p><p class="Text_20_body">If the <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attributes specify different values for a <span class="Element">&lt;draw:circle&gt;</span> element, the radius of the circle is derived from the smaller of the two values, and the circle is centered within the bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_11_office_annotation_"><span style="margin-right:0.127cm;">19.571.11</span></a><a id="__RefHeading__1418200_253892949"/><a id="attribute-svg_width_element-office_annotation"/>&lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute specifies the width of the rectangular which displays the annotation. Its meaning is the same as for a <span class="Element">&lt;draw:caption&gt;</span> element. See <a href="#attribute-svg_width_element-draw_caption">19.571.10</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a19_571_12_presentation_placeholder_"><span style="margin-right:0.127cm;">19.571.12</span></a><a id="__RefHeading__1418202_253892949"/><a id="attribute-svg_width_element-presentation_placeholder"/>&lt;presentation:placeholder&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_width_element-draw_caption">19.571.10</a>. Percentage values are relative to the width of the drawing page. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;presentation:placeholder&gt;</span> <a href="#element-presentation_placeholder">16.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:width</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_572svg_widths"><span style="margin-right:0.127cm;">19.572</span></a><a id="__RefHeading__1418204_253892949"/><a id="attribute-svg_widths"/>svg:widths</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:widths</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:widths</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_573svg_x"><span style="margin-right:0.127cm;">19.573</span></a><a id="__RefHeading__1418206_253892949"/><a id="attribute-svg_x"/>svg:x</h2><h3 class="Heading_20_3"><a id="a19_573_1_chart_data-label____chart_equation____chart_footer____chart_legend____chart_plot-area____chart_subtitle____chart_title_"><span style="margin-right:0.127cm;">19.573.1</span></a><a id="__RefHeading__1418208_253892949"/><a id="attribute-svg_x_element-chart_subtitle"/><a id="attribute-svg_x_element-chart_title"/><a id="attribute-svg_x_element-chart_data-label"/><a id="attribute-svg_x_element-chart_equation"/><a id="attribute-svg_x_element-chart_footer"/><a id="attribute-svg_x_element-chart_legend"/><a id="attribute-svg_x_element-chart_plot-area"/>&lt;chart:data-label&gt;, &lt;chart:equation&gt;, &lt;chart:footer&gt;, &lt;chart:legend&gt;, &lt;chart:plot-area&gt;, &lt;chart:subtitle&gt;, &lt;chart:title&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:x</span> attribute specifies the horizontal distance of the upper left corner of the given element from the upper left corner of the <span class="Element">&lt;chart:chart&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following elements: <span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a>, <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>, <span class="Element">&lt;chart:footer&gt;</span> <a href="#element-chart_footer">11.2.3</a>, <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>, <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;chart:subtitle&gt;</span> <a href="#element-chart_subtitle">11.2.2</a> and <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_573_2_draw_area-polygon_"><span style="margin-right:0.127cm;">19.573.2</span></a><a id="__RefHeading__1418210_253892949"/><a id="attribute-svg_x_element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:x</span> attribute defines the x-axis coordinate of a polygonal image map area's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_573_3_draw_area-rectangle_"><span style="margin-right:0.127cm;">19.573.3</span></a><a id="__RefHeading__1418212_253892949"/><a id="attribute-svg_x_element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:x</span> attribute defines the x-axis coordinate of a rectangular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_573_4_dr3d_scene_"><span style="margin-right:0.127cm;">19.573.4</span></a><a id="__RefHeading__1418214_253892949"/><a id="attribute-svg_x_element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_x_element-draw_caption">19.573.5</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_573_5_draw_caption____draw_custom-shape____draw_circle____draw_control____draw_ellipse____draw_frame____draw_rect____draw_page-thumbnail____draw_path____draw_polygon____draw_polyline____draw_regular-polygon_"><span style="margin-right:0.127cm;">19.573.5</span></a><a id="__RefHeading__1418216_253892949"/><a id="attribute-svg_x_element-draw_ellipse"/><a id="attribute-svg_x_element-draw_frame"/><a id="attribute-svg_x_element-draw_rect"/><a id="attribute-svg_x_element-draw_page-thumbnail"/><a id="attribute-svg_x_element-draw_path"/><a id="attribute-svg_x_element-draw_polygon"/><a id="attribute-svg_x_element-draw_polyline"/><a id="attribute-svg_x_element-draw_regular-polygon"/><a id="attribute-svg_x_element-draw_caption"/><a id="attribute-svg_x_element-draw_custom-shape"/><a id="attribute-svg_x_element-draw_circle"/><a id="attribute-svg_x_element-draw_control"/>&lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">See §5.1.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. For drawing shapes that have a non rectangular shape, the coordinate refers to the drawing shape's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_573_6_draw_glue-point_"><span style="margin-right:0.127cm;">19.573.6</span></a><a id="__RefHeading__1418218_253892949"/><a id="attribute-svg_x_element-draw_glue-point"/>&lt;draw:glue-point&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:x</span> attribute specifies the horizontal position of the glue point. The coordinate is either a percentage value relative to the drawing shape's center in horizontal direction, or, if the <span class="Attribute">draw:align</span> attribute is also specified, an absolute distance value relative to the edge specified by the <span class="Attribute">draw:align</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:x</span> attribute are a value of type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h3 class="Heading_20_3"><a id="a19_573_7_office_annotation_"><span style="margin-right:0.127cm;">19.573.7</span></a><a id="__RefHeading__1418220_253892949"/><a id="attribute-svg_x_element-office_annotation"/>&lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:x</span> attribute specifies the horizontal position of an annotation. Its meaning is the same as for a <span class="Element">&lt;draw:caption&gt;</span> element. See <a href="#attribute-svg_x_element-draw_caption">19.573.5</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_573_8_presentation_placeholder_"><span style="margin-right:0.127cm;">19.573.8</span></a><a id="__RefHeading__1418222_253892949"/><a id="attribute-svg_x_element-presentation_placeholder"/>&lt;presentation:placeholder&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_x_element-draw_caption">19.573.5</a>. Percentage values are relative to the height of the drawing page. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;presentation:placeholder&gt;</span> <a href="#element-presentation_placeholder">16.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:x</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_574svg_x1"><span style="margin-right:0.127cm;">19.574</span></a><a id="__RefHeading__1418224_253892949"/><a id="attribute-svg_x1"/>svg:x1</h2><h3 class="Heading_20_3"><a id="a19_574_1_draw_connector____draw_line__and__draw_measure_"><span style="margin-right:0.127cm;">19.574.1</span></a><a id="__RefHeading__1418226_253892949"/><a id="attribute-svg_x1_element-draw_line"/><a id="attribute-svg_x1_element-draw_measure"/><a id="attribute-svg_x1_element-draw_connector"/>&lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</h3><p class="Text_20_body">See §9.5 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Text_20_body">The <span class="Attribute">svg:x1</span> attribute may be omitted on <span class="Element">&lt;draw:connector&gt;</span> elements when the connector is connected to a shape by a <span class="Attribute">draw:start-shape</span> attribute. The start position then is the position of the glue point to which the connector is connected.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x1</span> attribute is usable with the following elements: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a> and <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x1</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_574_2_svg_linearGradient_"><span style="margin-right:0.127cm;">19.574.2</span></a><a id="__RefHeading__1418228_253892949"/><a id="attribute-svg_x1_element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">See §13.3.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">0%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:x1</span> attribute is usable with the following element: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:x1</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_575svg_x2"><span style="margin-right:0.127cm;">19.575</span></a><a id="__RefHeading__1418230_253892949"/><a id="attribute-svg_x2"/>svg:x2 </h2><h3 class="Heading_20_3"><a id="a19_575_1_draw_connector____draw_line__and__draw_measure_"><span style="margin-right:0.127cm;">19.575.1</span></a><a id="__RefHeading__1418232_253892949"/><a id="attribute-svg_x2_element-draw_connector"/><a id="attribute-svg_x2_element-draw_line"/><a id="attribute-svg_x2_element-draw_measure"/>&lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</h3><p class="Text_20_body">See §9.5 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Text_20_body">The <span class="Attribute">svg:x2</span> attribute may be omitted on <span class="Element">&lt;draw:connector&gt;</span> elements when the connector is connected to a shape by a <span class="Attribute">draw:end-shape</span> attribute. The end position then is the position of the glue point to which the connector is connected.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x2</span> attribute is usable with the following elements: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a> and <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x2</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_575_2_svg_linearGradient_"><span style="margin-right:0.127cm;">19.575.2</span></a><a id="__RefHeading__1418234_253892949"/><a id="attribute-svg_x2_element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">See §13.3.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">100%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:x2</span> attribute is usable with the following element: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:x2</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_576svg_x-height"><span style="margin-right:0.127cm;">19.576</span></a><a id="__RefHeading__1418236_253892949"/><a id="attribute-svg_x-height"/>svg:x-height</h2><p class="Text_20_body">See §20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x-height</span> attribute is usable with the following element: <span class="Element">&lt;style:font-face&gt;</span> <a href="#element-style_font-face">16.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x-height</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_577svg_y"><span style="margin-right:0.127cm;">19.577</span></a><a id="__RefHeading__1418238_253892949"/><a id="attribute-svg_y"/>svg:y</h2><h3 class="Heading_20_3"><a id="a19_577_1_chart_data-label____chart_equation____chart_footer____chart_legend____chart_plot-area____chart_subtitle____chart_title_"><span style="margin-right:0.127cm;">19.577.1</span></a><a id="__RefHeading__1418240_253892949"/><a id="attribute-svg_y_element-chart_data-label"/><a id="attribute-svg_y_element-chart_equation"/><a id="attribute-svg_y_element-chart_footer"/><a id="attribute-svg_y_element-chart_legend"/><a id="attribute-svg_y_element-chart_plot-area"/><a id="attribute-svg_y_element-chart_subtitle"/><a id="attribute-svg_y_element-chart_title"/>&lt;chart:data-label&gt;, &lt;chart:equation&gt;, &lt;chart:footer&gt;, &lt;chart:legend&gt;, &lt;chart:plot-area&gt;, &lt;chart:subtitle&gt;, &lt;chart:title&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attribute specifies the vertical distance of the upper left corner of the given element from the upper left corner of the <span class="Element">&lt;chart:chart&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following elements: <span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a>, <span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a>, <span class="Element">&lt;chart:footer&gt;</span> <a href="#element-chart_footer">11.2.3</a>, <span class="Element">&lt;chart:legend&gt;</span> <a href="#element-chart_legend">11.3</a>, <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;chart:subtitle&gt;</span> <a href="#element-chart_subtitle">11.2.2</a> and <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_577_2_draw_area-polygon_"><span style="margin-right:0.127cm;">19.577.2</span></a><a id="__RefHeading__1418242_253892949"/><a id="attribute-svg_y_element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attribute defines the y-axis coordinate of a polygonal image map area's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_577_3_draw_area-rectangle_"><span style="margin-right:0.127cm;">19.577.3</span></a><a id="__RefHeading__1418244_253892949"/><a id="attribute-svg_y_element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attributes defines the y-axis coordinate of a rectangular image map area.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_577_4_dr3d_scene_"><span style="margin-right:0.127cm;">19.577.4</span></a><a id="__RefHeading__1418246_253892949"/><a id="attribute-svg_y_element-dr3d_scene"/>&lt;dr3d:scene&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_y_element-draw_caption">19.577.5</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_577_5_draw_caption____draw_custom-shape____draw_circle____draw_control____draw_ellipse____draw_frame____draw_g____draw_rect____draw_page-thumbnail____draw_path____draw_polygon____draw_polyline____draw_regular-polygon_"><span style="margin-right:0.127cm;">19.577.5</span></a><a id="__RefHeading__1418248_253892949"/><a id="attribute-svg_y_element-draw_caption"/><a id="attribute-svg_y_element-draw_custom-shape"/><a id="attribute-svg_y_element-draw_circle"/><a id="attribute-svg_y_element-draw_control"/><a id="attribute-svg_y_element-draw_ellipse"/><a id="attribute-svg_y_element-draw_frame"/><a id="attribute-svg_y_element-draw_g"/><a id="attribute-svg_y_element-draw_rect"/><a id="attribute-svg_y_element-draw_page-thumbnail"/><a id="attribute-svg_y_element-draw_path"/><a id="attribute-svg_y_element-draw_polygon"/><a id="attribute-svg_y_element-draw_polyline"/><a id="attribute-svg_y_element-draw_regular-polygon"/>&lt;draw:caption&gt;, &lt;draw:custom-shape&gt;, &lt;draw:circle&gt;, &lt;draw:control&gt;, &lt;draw:ellipse&gt;, &lt;draw:frame&gt;, &lt;draw:g&gt;, &lt;draw:rect&gt;, &lt;draw:page-thumbnail&gt;, &lt;draw:path&gt;, &lt;draw:polygon&gt;, &lt;draw:polyline&gt;, &lt;draw:regular-polygon&gt;</h3><p class="Text_20_body">See §5.1.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. For drawing shapes that have a non rectangular shape, the coordinate refers to the drawing shape's bounding box.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following elements: <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a> and <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_577_6_draw_glue-point_"><span style="margin-right:0.127cm;">19.577.6</span></a><a id="__RefHeading__1418250_253892949"/><a id="attribute-svg_y_element-draw_glue-point"/>&lt;draw:glue-point&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attribute specifies the vertical position of the glue point. The coordinate is either a percentage value relative to the drawing shape's center in vertical direction, or, if the <span class="Attribute">draw:align</span> attribute is also specified, an absolute distance value relative to the edge specified by the <span class="Attribute">draw:align</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;draw:glue-point&gt;</span> <a href="#element-draw_glue-point">10.3.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:y</span> attribute are a value of type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h3 class="Heading_20_3"><a id="a19_577_7_office_annotation_"><span style="margin-right:0.127cm;">19.577.7</span></a><a id="__RefHeading__1418252_253892949"/><a id="attribute-svg_y_element-office_annotation"/>&lt;office:annotation&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attribute specifies the position where the annotation is displayed. Its meaning is the same as for a <span class="Element">&lt;draw:caption&gt;</span> element. See <a href="#attribute-svg_x_element-draw_caption">19.573.5</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_577_8_presentation_placeholder_"><span style="margin-right:0.127cm;">19.577.8</span></a><a id="__RefHeading__1418254_253892949"/><a id="attribute-svg_y_element-presentation_placeholder"/>&lt;presentation:placeholder&gt;</h3><p class="Text_20_body">See <a href="#attribute-svg_y_element-draw_caption">19.577.5</a>. Percentage values are relative to the height of the drawing page. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;presentation:placeholder&gt;</span> <a href="#element-presentation_placeholder">16.42</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:y</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_578svg_y1"><span style="margin-right:0.127cm;">19.578</span></a><a id="__RefHeading__1418256_253892949"/><a id="attribute-svg_y1"/>svg:y1</h2><h3 class="Heading_20_3"><a id="a19_578_1_draw_connector____draw_line__and__draw_measure_"><span style="margin-right:0.127cm;">19.578.1</span></a><a id="__RefHeading__1418258_253892949"/><a id="attribute-svg_y1_element-draw_connector"/><a id="attribute-svg_y1_element-draw_line"/><a id="attribute-svg_y1_element-draw_measure"/>&lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</h3><p class="Text_20_body">See §9.5 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Text_20_body">The <span class="Attribute">svg:y1</span> attribute may be omitted on <span class="Element">&lt;draw:connector&gt;</span> elements when the connector is connected to a shape by a <span class="Attribute">draw:start-shape</span> attribute. The start position then is the position of the glue point to which the connector is connected.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y1</span> attribute is usable with the following elements: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a> and <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y1</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_578_2_svg_linearGradient_"><span style="margin-right:0.127cm;">19.578.2</span></a><a id="__RefHeading__1418260_253892949"/><a id="attribute-svg_y1_element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">See §13.3.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">0%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:y1</span> attribute is usable with the following element: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:y1</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_579svg_y2"><span style="margin-right:0.127cm;">19.579</span></a><a id="__RefHeading__1418262_253892949"/><a id="attribute-svg_y2"/>svg:y2</h2><h3 class="Heading_20_3"><a id="a19_579_1_draw_connector____draw_line__and__draw_measure_"><span style="margin-right:0.127cm;">19.579.1</span></a><a id="__RefHeading__1418264_253892949"/><a id="attribute-svg_y2_element-draw_connector"/><a id="attribute-svg_y2_element-draw_line"/><a id="attribute-svg_y2_element-draw_measure"/>&lt;draw:connector&gt;, &lt;draw:line&gt; and &lt;draw:measure&gt;</h3><p class="Text_20_body">See §9.5 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Text_20_body">The <span class="Attribute">svg:y2</span> attribute may be omitted on <span class="Element">&lt;draw:connector&gt;</span> elements when the connector is connected to a shape by a <span class="Attribute">draw:end-shape</span> attribute. The end position then is the position of the glue point to which the connector is connected.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y2</span> attribute is usable with the following elements: <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a> and <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y2</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a19_579_2_svg_linearGradient_"><span style="margin-right:0.127cm;">19.579.2</span></a><a id="__RefHeading__1418266_253892949"/><a id="attribute-svg_y2_element-svg_linearGradient"/>&lt;svg:linearGradient&gt;</h3><p class="Text_20_body">See §13.3.2 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">100%</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">svg:y2</span> attribute is usable with the following element: <span class="Element">&lt;svg:linearGradient&gt;</span> <a href="#element-svg_linearGradient">16.40.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:y2</span> attribute are a value of type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_580table_acceptance-state"><span style="margin-right:0.127cm;">19.580</span></a><a id="__RefHeading__1418268_253892949"/><a id="attribute-table_acceptance-state"/>table:acceptance-state</h2><p class="Text_20_body">The <span class="Attribute">table:acceptance-state</span> attribute specifies whether a tracked change has been accepted or rejected already, or whether an acceptance or rejection is still pending.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:acceptance-state</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">accepted</span>: a tracked change has been accepted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">ending</span>: a tracked change is pending approval or rejection.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ejected</span>: a tracked change has been rejected.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">pending</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:acceptance-state</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a> and <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:acceptance-state</span> attribute are <span class="Attribute_20_Value">accepted</span>, <span class="Attribute_20_Value">rejected</span> or <span class="Attribute_20_Value">pending</span>.</p><h2 class="Heading_20_2"><a id="a19_581table_algorithm"><span style="margin-right:0.127cm;">19.581</span></a><a id="__RefHeading__1418270_253892949"/><a id="attribute-table_algorithm"/>table:algorithm</h2><p class="Text_20_body">The <span class="Attribute">table:algorithm</span> attribute specifies the algorithm used to compare sort keys. To avoid name conflicts between different consumers, the name of the algorithm should begin with a namespace prefix, followed by a “:” (U+003A, COLON) separator. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:algorithm</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:algorithm</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_582table_add-empty-lines"><span style="margin-right:0.127cm;">19.582</span></a><a id="__RefHeading__1418272_253892949"/><a id="attribute-table_add-empty-lines"/>table:add-empty-lines</h2><p class="Text_20_body">The <span class="Attribute">table:add-empty-lines</span> attribute specifies whether an empty row is inserted in the data pilot table after the data (including the subtotals) for each member of the field.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:add-empty-lines</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: an empty line should not be inserted after the data for a member, including any subtotal of that member.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: an empty line should not be inserted after the data for a member, including any subtotal of that member.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:add-empty-lines</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> <a href="#element-table_data-pilot-layout-info">9.6.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:add-empty-lines</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_583table_allow-empty-cell"><span style="margin-right:0.127cm;">19.583</span></a><a id="__RefHeading__1418274_253892949"/><a id="attribute-table_allow-empty-cell"/>table:allow-empty-cell</h2><p class="Text_20_body">The <span class="Attribute">table:allow-empty-cell</span> attribute specifies whether a cell can be empty.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:allow-empty-cell</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cell cannot be empty.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cell can be empty.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:allow-empty-cell</span> attribute is usable with the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:allow-empty-cell</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_584table_application-data"><span style="margin-right:0.127cm;">19.584</span></a><a id="__RefHeading__1418276_253892949"/><a id="attribute-table_application-data"/>table:application-data</h2><p class="Text_20_body">The <span class="Attribute">table:application-data</span> attribute specifies extra information about a data pilot table, which can be used by the consumer. This data shall not influence the behavior of the data pilot.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:application-data</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:application-data</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_585table_automatic-find-labels"><span style="margin-right:0.127cm;">19.585</span></a><a id="__RefHeading__1418278_253892949"/><a id="attribute-table_automatic-find-labels"/>table:automatic-find-labels</h2><p class="Text_20_body">The <span class="Attribute">table:automatic-find-labels</span> attribute specifies whether a consumer should attempt to find labels of rows and columns. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:automatic-find-labels</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumers should not attempt to find labels of rows and columns.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumers should attempt find labels of rows and columns.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note</span>: The <span class="Attribute">table:automatic-find-labels</span> attribute enables the use of the automatic lookup of labels capability defined by OpenFormula. OpenFormula, 5.10.2. (*update*)</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:automatic-find-labels</span> attribute is usable with the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:automatic-find-labels</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_586table_base-cell-address"><span style="margin-right:0.127cm;">19.586</span></a><a id="__RefHeading__1418280_253892949"/><a id="attribute-table_base-cell-address"/>table:base-cell-address</h2><p class="Text_20_body">The <span class="Attribute">table:base-cell-address</span> attribute specifies the address of the base cell for relative addresses in formulas that occur within a condition. This attribute is only necessary when the condition contains a formula. The value of this attribute shall be an absolute cell address that contains a table name. The dollar signs “$” (U+0024, DOLLAR SIGN) that indicate an absolute address may be omitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:base-cell-address</span> attribute is usable with the following elements: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>, <span class="Element">&lt;table:named-expression&gt;</span> <a href="#element-table_named-expression">9.4.13</a> and <span class="Element">&lt;table:named-range&gt;</span> <a href="#element-table_named-range">9.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:base-cell-address</span> attribute has the data type <span class="Datatype">cellAddress</span> <a href="#datatype-cellAddress">18.3.4</a>.</p><h2 class="Heading_20_2"><a id="a19_587table_bind-styles-to-content"><span style="margin-right:0.127cm;">19.587</span></a><a id="__RefHeading__1418282_253892949"/><a id="attribute-table_bind-styles-to-content"/>table:bind-styles-to-content</h2><p class="Text_20_body">The <span class="Attribute">table:bind-styles-to-content</span> attribute specifies whether cells retain their style after a subtotal calculation. This attribute is only evaluated if a <span class="Element">&lt;table:sort-groups&gt;</span> element is present.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:bind-styles-to-content</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells need not retain their style after a subtotal calculation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells should retain their style after a subtotal calculation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:bind-styles-to-content</span> attribute is usable with the following elements: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a> and <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:bind-styles-to-content</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_588table_border-color"><span style="margin-right:0.127cm;">19.588</span></a><a id="__RefHeading__1418284_253892949"/><a id="attribute-table_border-color"/>table:border-color</h2><p class="Text_20_body">The <span class="Attribute">table:border-color</span> attribute specifies the color of a border that is displayed around a scenario that belongs to a scenario table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:border-color</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:border-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a19_589table_buttons"><span style="margin-right:0.127cm;">19.589</span></a><a id="__RefHeading__1418286_253892949"/><a id="attribute-table_buttons"/>table:buttons</h2><p class="Text_20_body">The <span class="Attribute">table:buttons</span> attribute specifies the cells in a data pilot table that should be displayed as buttons to trigger interactive operations on the table like changing the order of columns. Its value is a list of white space separated cell-addresses. The value of this attribute shall be an absolute cell address that contains a table name. The dollar signs “$” (U+0024, DOLLAR SIGN) that indicate an absolute address may be omitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:buttons</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:buttons</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_590table_case-sensitive"><span style="margin-right:0.127cm;">19.590</span></a><a id="__RefHeading__1418288_253892949"/><a id="attribute-table_case-sensitive"/>table:case-sensitive</h2><p class="Text_20_body">The <span class="Attribute">table:case-sensitive</span> attribute specifies whether to distinguish between upper and lower case when comparing, sorting or filtering content.</p><p class="Text_20_body">That attribute is only evaluated if the operations take place on strings. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:case-sensitive</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: upper and lower case are not distinguished when comparing, sorting or filtering content.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: upper and lower case are distinguished when comparing, sorting or filtering content.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a> element the default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Default_20_Value">For <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>, <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a> and <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a> elements the default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:case-sensitive</span> attribute is usable with the following elements: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>, <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>, <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a> and <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:case-sensitive</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_591table_cell-address"><span style="margin-right:0.127cm;">19.591</span></a><a id="__RefHeading__1418290_253892949"/><a id="attribute-table_cell-address"/>table:cell-address</h2><p class="Text_20_body">The <span class="Attribute">table:cell-address</span> attribute specifies the original address of a cell used in a calculation.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-address</span> attribute is usable with the following element: <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-address</span> attribute has the data type <span class="Datatype">cellAddress</span> <a href="#datatype-cellAddress">18.3.4</a>.</p><h2 class="Heading_20_2"><a id="a19_592table_cell-range"><span style="margin-right:0.127cm;">19.592</span></a><a id="__RefHeading__1418292_253892949"/><a id="attribute-table_cell-range"/>table:cell-range</h2><p class="Text_20_body">The <span class="Attribute">table:cell-range</span> attribute specifies a list of ranges of cells.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range</span> attribute is usable with the following elements: <span class="Element">&lt;chart:footer&gt;</span> <a href="#element-chart_footer">11.2.3</a>, <span class="Element">&lt;chart:subtitle&gt;</span> <a href="#element-chart_subtitle">11.2.2</a> and <span class="Element">&lt;chart:title&gt;</span> <a href="#element-chart_title">11.2.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_593table_cell-range-address"><span style="margin-right:0.127cm;">19.593</span></a><a id="__RefHeading__1418294_253892949"/><a id="attribute-table_cell-range-address"/>table:cell-range-address</h2><h3 class="Heading_20_3"><a id="a19_593_1General"><span style="margin-right:0.127cm;">19.593.1</span></a><a id="__RefHeading__1418296_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies specifies a range of cells or a list of ranges of cells.</p><h3 class="Heading_20_3"><a id="a19_593_2_chart_categories_"><span style="margin-right:0.127cm;">19.593.2</span></a><a id="__RefHeading__1418298_253892949"/><a id="attribute-table_cell-range-address_element-chart_categories"/>&lt;chart:categories&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the region from which the category labels are taken. If this attribute or the <span class="Element">&lt;chart:categories&gt;</span> element is omitted the <span class="Attribute">chart:data-source-has-labels</span> attribute of the <span class="Element">&lt;chart:plot-area&gt;</span> element should be evaluated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:categories&gt;</span> <a href="#element-chart_categories">11.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h3 class="Heading_20_3"><a id="a19_593_3_chart_domain__-_bubble"><span style="margin-right:0.127cm;">19.593.3</span></a><a id="__RefHeading__1418300_253892949"/><a id="attribute-table_cell-range-address_element-chart_domain"/>&lt;chart:domain&gt; - bubble</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the x and y-coordinate values for bubble charts when the <span class="Attribute">chart:class</span> attribute of its parent <span class="Element">&lt;chart:series&gt;</span> element has the value <span class="Attribute_20_Value_20_Instance">chart:bubble</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:domain&gt;</span> <a href="#element-chart_domain">11.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h3 class="Heading_20_3"><a id="a19_593_4_chart_domain_-_scatter"><span style="margin-right:0.127cm;">19.593.4</span></a><a id="__RefHeading__1418302_253892949"/><a id="attribute-table_cell-range-address_element-chart_domain"/>&lt;chart:domain&gt;- scatter</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the x-coordinate values for scatter charts when the <span class="Attribute">chart:class</span> attribute of its parent <span class="Element">&lt;chart:series&gt;</span> element has the value <span class="Attribute_20_Value_20_Instance">chart:scatter</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:domain&gt;</span> <a href="#element-chart_domain">11.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h3 class="Heading_20_3"><a id="a19_593_5_chart_domain__-_surface"><span style="margin-right:0.127cm;">19.593.5</span></a><a id="__RefHeading__1718340_1219268628"/><a id="attribute-table_cell-range-address_element-chart_domain"/><a id="attribute-table_cell-range-address_element-chart_domain_value_chart_surface"/>&lt;chart:domain&gt; - surface</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute of the first <span class="Element">&lt;chart:domain&gt;</span> element specifies the y-coordinate values and the <span class="Attribute">table:cell-range-address</span> attribute of the second <span class="Element">&lt;chart:domain&gt;</span> element specifies the x-coordinate values for surface charts when the <span class="Attribute">chart:class</span> attribute of its parent <span class="Element">&lt;chart:series&gt;</span> element has the value <span class="Attribute_20_Value_20_Instance">chart:surface</span> and the <span class="Attribute">chart:values-cell-range-address</span> attribute of this <span class="Element">&lt;chart:series&gt;</span> element specifies a range with more than one row and more than one column. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:domain&gt;</span> <a href="#element-chart_domain">11.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h3 class="Heading_20_3"><a id="a19_593_6_chart_plot-area___deprecated_"><span style="margin-right:0.127cm;">19.593.6</span></a><a id="__RefHeading__1418304_253892949"/><a id="attribute-table_cell-range-address_element-chart_plot-area"/>&lt;chart:plot-area&gt; (deprecated)</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the ranges of data for a chart. </p><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute at the <span class="Element">&lt;chart:plot-area&gt;</span> element has no effect in case the data is assigned to the <span class="Element">&lt;chart:series&gt;</span> elements directly by <span class="Attribute">chart:values-cell-range-address</span> attributes.</p><p class="Text_20_body">The use of the <span class="Attribute">table:cell-range-address</span> attribute is deprecated in favor of the <span class="Attribute">chart:values-cell-range-address</span> attributes of <span class="Element">&lt;chart:series&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h3 class="Heading_20_3"><a id="a19_593_7_table_highlighted-range_"><span style="margin-right:0.127cm;">19.593.7</span></a><a id="__RefHeading__1418306_253892949"/><a id="attribute-table_cell-range-address_element-table_highlighted-range"/>&lt;table:highlighted-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the address of a range that is highlighted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:highlighted-range&gt;</span> <a href="#element-table_highlighted-range">9.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h3 class="Heading_20_3"><a id="a19_593_8_table_named-range_"><span style="margin-right:0.127cm;">19.593.8</span></a><a id="__RefHeading__1418308_253892949"/><a id="attribute-table_cell-range-address_element-table_named-range"/>&lt;table:named-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the address of a named range. The address can be either absolute or relative. If the cell range address is relative, the parent &lt;table:named-range&gt; element shall have a table:base-cell-address attribute with a value. A relative cell address defines an offset which shall be interpreted relative to the cell where the named range is used. The offset is the same as the offsets between the table cell addressed by the relative cell range address and the table cell specified by the <span class="Attribute">table:base-cell-address</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:named-range&gt;</span> <a href="#element-table_named-range">9.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h3 class="Heading_20_3"><a id="a19_593_9_table_source-cell-range_"><span style="margin-right:0.127cm;">19.593.9</span></a><a id="__RefHeading__1418310_253892949"/><a id="attribute-table_cell-range-address_element-table_source-cell-range"/>&lt;table:source-cell-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:cell-range-address</span> attribute specifies the cell range containing the source data. The value of this attribute shall be an absolute cell address that contains a table name. The dollar signs “$” (U+0024, DOLLAR SIGN) that indicate an absolute address may be omitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:source-cell-range&gt;</span> <a href="#element-table_source-cell-range">9.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h2 class="Heading_20_2"><a id="a19_594table_column"><span style="margin-right:0.127cm;">19.594</span></a><a id="__RefHeading__1418312_253892949"/><a id="attribute-table_column"/>table:column</h2><p class="Text_20_body">The <span class="Attribute">table:column</span> attribute specifies the column number of a cell.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:column</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-address&gt;</span> <a href="#element-table_cell-address">9.9.18</a>, <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:column</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_595table_comment"><span style="margin-right:0.127cm;">19.595</span></a><a id="__RefHeading__1418314_253892949"/><a id="attribute-table_comment"/>table:comment</h2><p class="Text_20_body">The <span class="Attribute">table:comment</span> attribute specifies a comment about a scenario.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:comment</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:comment</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_596table_condition"><span style="margin-right:0.127cm;">19.596</span></a><a id="__RefHeading__1418316_253892949"/><a id="attribute-table_condition"/>table:condition</h2><p class="Text_20_body">The <span class="Attribute">table:condition</span> attribute specifies a condition that applies to the value of a table cell that references a <span class="Element">&lt;table:content-validation&gt;</span> element having the table:condition attribute. When evaluation of the condition results in "false", any action taken is determine by the other attributes and child elements of the <span class="Element">&lt;table:content-validation&gt;</span> element. </p><p class="Note"><span class="Note_20_Label">Note</span>: Possible actions include presentation of a message, triggering an event, and performance of a script, with or without invalidating the value. The <span class="Attribute">table:allow-empty-cell</span> attribute value influences whether the <span class="Attribute">table:condition</span> is applicable.</p><p class="Text_20_body"> The value of this attribute should be a namespace prefix, followed by a ":" (U+003A, COLON), followed by Boolean expression. If the namespace prefix is missing it defaults to the "urn:oasis:names:tc:opendocument:xmlns:of:1.2" namespace. The XML namespace that applies to the <span class="Attribute">table:condition</span> attribute specifies the syntax and semantics of the <span class="Attribute_20_Value_20_Param">expression</span> occurrences in the table:condition syntax. </p><p class="Text_20_body"><span class="Note_20_Label">Note</span>: The value of the <span class="Element">&lt;table:content-validation&gt;</span> <span class="Attribute">table:base-cell-address</span> can influence how references are resolved in an <span class="Def">expression</span> anywhere within the defined conditions.</p><p class="Text_20_body">An OpenDocument Consumer when hosting a formula evaluator makes available the host-dependent properties defined by table <a href="#refTable11">12</a> in 19.644.</p><p class="Text_20_body">The defined conditions are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-text-length() </span><span class="Attribute_20_Value_20_Param">op</span><span class="Attribute_20_Value_20_Fragment"> </span><span class="Attribute_20_Value_20_Param">value</span>, where <span class="Attribute_20_Value_20_Param">op</span> is one of the relational operators ””&lt;”,“&gt;”, ”&lt;=”, ”&gt;=”, ”=” or “!=”: true if the length of the cell's text compared to the value specified in the condition by <span class="Attribute_20_Value_20_Param">value</span> using the relational operator <span class="Attribute_20_Value_20_Param">op</span> evaluates to true. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-text-length-is-between(value1, value2)</span>: true if the length of the cell's text is between value1 and value2. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-text-length-is-not-between(</span><span class="Attribute_20_Value_20_Param">value1</span><span class="Attribute_20_Value_20_Fragment">, </span><span class="Attribute_20_Value_20_Param">value2</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if the length of the cell's text is not between <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-in-list(</span><span class="Attribute_20_Value_20_Param">list</span><span class="Attribute_20_Value_20_Fragment">)</span>, where <span class="Attribute_20_Value_20_Param">list</span> is one or more string entries, separated by ”;” (U+003B, SEMICOLON), or an <span class="Attribute_20_Value_20_Param">expression</span>: true if the cell's content is in <span class="Attribute_20_Value_20_Param">list</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-decimal-number() and </span><span class="Attribute_20_Value_20_Param">condition</span>, where <span class="Attribute_20_Value_20_Param">condition</span> is one of the value conditions below: true if the cell has a numeric value and <span class="Attribute_20_Value_20_Param">condition</span> is true. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-whole-number() and </span><span class="Attribute_20_Value_20_Param">condition</span>, where <span class="Attribute_20_Value_20_Param">condition</span> is one of the value conditions below: true if the cell's cell has a whole value and <span class="Attribute_20_Value_20_Param">condition</span> is true.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-date() and </span><span class="Attribute_20_Value_20_Param">condition</span>, where <span class="Attribute_20_Value_20_Param">condition</span> is one of the value conditions below: true if the cell has a date value and <span class="Attribute_20_Value_20_Param">condition</span> is true. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-time() and </span><span class="Attribute_20_Value_20_Param">condition</span>, where <span class="Attribute_20_Value_20_Param">condition</span> is one of the value conditions below: true if the cell has a time value and <span class="Attribute_20_Value_20_Param">condition</span> is true. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">is-true-formula(</span><span class="Attribute_20_Value_20_Param">expression</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if evaluation of the <span class="Attribute_20_Value_20_Param">expression</span> yields a value that converts to logical type value true in the semantics for the <span class="Attribute_20_Value_20_Param">expression</span>; false otherwise. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The defined value conditions are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content() </span><span class="Attribute_20_Value_20_Param">op</span><span class="Attribute_20_Value_20_Fragment"> </span><span class="Attribute_20_Value_20_Param">value</span>, where <span class="Attribute_20_Value_20_Param">op</span> is one of the relational operators ”&lt;”, ”&gt;”, ”&lt;=”, ”&gt;=”, ”=” or ”!=”: true if the cell's value compared to the value specified in the condition by <span class="Attribute_20_Value_20_Param">value</span> using the relational operator <span class="Attribute_20_Value_20_Param">op</span> evaluates to true. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-between(</span><span class="Attribute_20_Value_20_Param">value1</span><span class="Attribute_20_Value_20_Fragment">, </span><span class="Attribute_20_Value_20_Param">value2</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if the cell's value is between <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">cell-content-is-not-between(</span><span class="Attribute_20_Value_20_Param">value1</span><span class="Attribute_20_Value_20_Fragment">, </span><span class="Attribute_20_Value_20_Param">value2</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if the cell's value is not between <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">is-true-formula(</span><span class="Attribute_20_Value_20_Param">expression</span><span class="Attribute_20_Value_20_Fragment">)</span>: true if evaluation of the <span class="Attribute_20_Value_20_Param">expression</span> yields a value that converts to logical value true in the semantics for the <span class="Attribute_20_Value_20_Param">expression</span>; false otherwise. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Within the conditions: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">value</span>, <span class="Attribute_20_Value_20_Param">value1</span> and <span class="Attribute_20_Value_20_Param">value2</span> are a <span class="Attribute_20_Value_20_Param">numberValue</span>, a <span class="Attribute_20_Value_20_Param">string</span> or an <span class="Attribute_20_Value_20_Param">expression</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">numberValue</span> is a whole or decimal number in the lexical form of the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> decimal datatype. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">string</span> expresses a value of the <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> string datatype by surrounding the sequence of string characters in quotation marks (U+0022, QUOTATION MARK). A quotation mark within the string itself is expressed with two consecutive quotation marks. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Param">expression</span> is a lexical form that is neither numberValue nor string and that is a well-formed expression determined by the namespace applicable to the table:condition value.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:condition</span> attribute is usable with the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_597table_condition-source"><span style="margin-right:0.127cm;">19.597</span></a><a id="__RefHeading__1418318_253892949"/><a id="attribute-table_condition-source"/>table:condition-source</h2><p class="Text_20_body">The <span class="Attribute">table:condition-source</span> attribute specifies whether the condition is contained in a filter or encoded in a cell range.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:condition-source</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cell-range</span>: condition encoded into the cell range specified by a <span class="Attribute">table:condition-source-range</span><span class="Attribute">-address</span> attribute. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">self</span>: condition specified by <span class="Element">&lt;table:filter&gt;</span> element's child elements.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">self</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:condition-source</span> attribute is usable with the following element: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:condition-source</span> attribute are <span class="Attribute_20_Value">self</span> or <span class="Attribute_20_Value">cell-range</span>.</p><h2 class="Heading_20_2"><a id="a19_598table_condition-source-range-address"><span style="margin-right:0.127cm;">19.598</span></a><a id="__RefHeading__1418320_253892949"/><a id="attribute-table_condition-source-range-address"/>table:condition-source-range-address</h2><p class="Text_20_body">The <span class="Attribute">table:condition-source-range-address</span> attribute specifies a cell range that contains encoded conditions. The first row of the cell range shall contain the labels of the columns whose content should be filtered. The following rows contain conditions that have to evaluate to true for the cells contained in the columns. The conditions in each row are connected by an “and” operation, while the rows are connected by an “or” operation. This means that a row is of the source table is displayed if there is at least one row in the condition range where all conditions evaluate to true if they are applied to the columns specified in the first row of the condition range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:condition-source-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:condition-source-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h2 class="Heading_20_2"><a id="a19_599table_contains-error"><span style="margin-right:0.127cm;">19.599</span></a><a id="__RefHeading__1418322_253892949"/><a id="attribute-table_contains-error"/>table:contains-error</h2><p class="Text_20_body">The <span class="Attribute">table:contains-error</span> attribute specifies whether a cell range contained an error at the point of evaluation.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:contains-error</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cell range contains no error at point of evaluation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cell range contains an error at point of evaluation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:contains-error</span> attribute is usable with the following element: <span class="Element">&lt;table:highlighted-range&gt;</span> <a href="#element-table_highlighted-range">9.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:contains-error</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_600table_contains-header"><span style="margin-right:0.127cm;">19.600</span></a><a id="__RefHeading__1418324_253892949"/><a id="attribute-table_contains-header"/>table:contains-header</h2><p class="Text_20_body">The <span class="Attribute">table:contains-header</span> attribute specifies whether the content of the database range's first row or column defines labels which may be used to reference a whole row or column. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:contains-header</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the first row or column of the database range does not define labels.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the first row or column of the database range defines labels.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:contains-header</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:contains-header</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_601table_content-validation-name"><span style="margin-right:0.127cm;">19.601</span></a><a id="__RefHeading__1418326_253892949"/><a id="attribute-table_content-validation-name"/>table:content-validation-name</h2><p class="Text_20_body">The <span class="Attribute">table:content-validation-name</span> attribute specifies the name of a validity check. </p><p class="Text_20_body">The value of this attribute is a name found in the <span class="Attribute">table:name</span> attribute of a <span class="Element">&lt;table:content-validation&gt;</span> element. <a href="#element-table_content-validation">9.4.5</a> If this attribute is not present, a cell may have arbitrary content.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:content-validation-name</span> attribute is usable with the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:content-validation-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_602table_copy-back"><span style="margin-right:0.127cm;">19.602</span></a><a id="__RefHeading__1418328_253892949"/><a id="attribute-table_copy-back"/>table:copy-back</h2><p class="Text_20_body">The <span class="Attribute">table:copy-back</span> attribute specifies whether data is copied back into a scenario table if another scenario is activated.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:copy-back</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data is not copied back into a scenario table if another scenario is activated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data copied back into a scenario table if another scenario is activated.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:copy-back</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:copy-back</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_603table_copy-formulas"><span style="margin-right:0.127cm;">19.603</span></a><a id="__RefHeading__1418330_253892949"/><a id="attribute-table_copy-formulas"/>table:copy-formulas</h2><p class="Text_20_body">The <span class="Attribute">table:copy-formulas</span> attribute specifies whether formulas are copied from a scenario table to a destination table. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:copy-formulas</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: only values resulting from formulas are copied.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: formulas are copied.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:copy-formulas</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:copy-formulas</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_604table_copy-styles"><span style="margin-right:0.127cm;">19.604</span></a><a id="__RefHeading__1418332_253892949"/><a id="attribute-table_copy-styles"/>table:copy-styles</h2><p class="Text_20_body">The <span class="Attribute">table:copy-styles</span> attribute specifies whether styles are copied from a scenario table to a destination table together with the data.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:copy-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: styles are not copied with data.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: styles are copied with data.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:copy-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:copy-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_605table_count"><span style="margin-right:0.127cm;">19.605</span></a><a id="__RefHeading__1418334_253892949"/><a id="attribute-table_count"/>table:count</h2><p class="Text_20_body">The <span class="Attribute">table:count</span> attribute specifies the count of inserted rows, columns or tables.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:count</span> attribute is usable with the following element: <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:count</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_606table_country"><span style="margin-right:0.127cm;">19.606</span></a><a id="__RefHeading__1418336_253892949"/><a id="attribute-table_country"/>table:country</h2><p class="Text_20_body">The <span class="Attribute">table:country</span> attribute specifies the country information for the natural language in which comparisons will occur.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:country</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:country</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a19_607table_data-field"><span style="margin-right:0.127cm;">19.607</span></a><a id="__RefHeading__1418338_253892949"/><a id="attribute-table_data-field"/>table:data-field</h2><p class="Text_20_body">The <span class="Attribute">table:data-field</span> attribute specifies the data field whose values are taken into account.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:data-field</span> attribute is usable with the following elements: <span class="Element">&lt;table:data-pilot-display-info&gt;</span> <a href="#element-table_data-pilot-display-info">9.6.13</a> and <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> <a href="#element-table_data-pilot-sort-info">9.6.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:data-field</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_608table_data-cell-range-address"><span style="margin-right:0.127cm;">19.608</span></a><a id="__RefHeading__1418340_253892949"/><a id="attribute-table_data-cell-range-address"/>table:data-cell-range-address</h2><p class="Text_20_body">The <span class="Attribute">table:data-cell-range-address</span> attribute specifies the cell range address of data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:data-cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:label-range&gt;</span> <a href="#element-table_label-range">9.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:data-cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h2 class="Heading_20_2"><a id="a19_609table_database-name"><span style="margin-right:0.127cm;">19.609</span></a><a id="__RefHeading__1418342_253892949"/><a id="attribute-table_database-name"/>table:database-name</h2><p class="Text_20_body">A <span class="Attribute">table:database-name</span> attribute specifies the name of an SQL database for the importation of data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:database-name</span> attribute is usable with the following elements: <span class="Element">&lt;table:database-source-query&gt;</span> <a href="#element-table_database-source-query">9.4.18</a>, <span class="Element">&lt;table:database-source-sql&gt;</span> <a href="#element-table_database-source-sql">9.4.16</a> and <span class="Element">&lt;table:database-source-table&gt;</span> <a href="#element-table_database-source-table">9.4.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:database-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_610table_database-table-name"><span style="margin-right:0.127cm;">19.610</span></a><a id="__RefHeading__1418344_253892949"/><a id="attribute-table_database-table-name"/>table:database-table-name</h2><p class="Text_20_body">A <span class="Attribute">table:database-table-name</span> attribute specifies a database table for the importation of data.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:database-table-name</span> attribute is usable with the following element: <span class="Element">&lt;table:database-source-table&gt;</span> <a href="#element-table_database-source-table">9.4.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:database-table-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_611table_data-type"><span style="margin-right:0.127cm;">19.611</span></a><a id="__RefHeading__1418346_253892949"/><a id="attribute-table_data-type"/>table:data-type</h2><h3 class="Heading_20_3"><a id="a19_611_1General"><span style="margin-right:0.127cm;">19.611.1</span></a><a id="__RefHeading__1418348_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:data-type</span> attribute specifies a data type for tables.</p><h3 class="Heading_20_3"><a id="a19_611_2_table_filter-condition_"><span style="margin-right:0.127cm;">19.611.2</span></a><a id="__RefHeading__1418350_253892949"/><a id="attribute-table_data-type_element-table_filter-condition"/>&lt;table:filter-condition&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:data-type</span> attribute specifies whether a comparison shall take place as text or as numeric values.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:data-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number</span>: comparison as numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext</span>: comparison as text values.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a> element the default value for this attribute is <span class="Attribute_20_Value">text</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:data-type</span> attribute is usable with the following element: <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:data-type</span> attribute are <span class="Attribute_20_Value">text</span> or <span class="Attribute_20_Value">number</span>.</p><h3 class="Heading_20_3"><a id="a19_611_3_table_sort-by_"><span style="margin-right:0.127cm;">19.611.3</span></a><a id="__RefHeading__1418352_253892949"/><a id="attribute-table_data-type_element-table_sort-by"/>&lt;table:sort-by&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:data-type</span> attribute specifies the data type of a field to be sorted. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:data-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: consumer determines the type of data in a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">umber</span>: numeric data type.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext</span>: text data type.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">string</span> (name of a user defined sort order, implementation-dependent)<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:sort-by&gt;</span> <a href="#element-table_sort-by">9.4.20</a> element the default value for this attribute is <span class="Attribute_20_Value">automatic</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:data-type</span> attribute is usable with the following element: <span class="Element">&lt;table:sort-by&gt;</span> <a href="#element-table_sort-by">9.4.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:data-type</span> attribute are <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">number</span>, <span class="Attribute_20_Value">automatic</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_611_4_table_sort-groups_"><span style="margin-right:0.127cm;">19.611.4</span></a><a id="__RefHeading__1418354_253892949"/><a id="attribute-table_data-type_element-table_sort-groups"/>&lt;table:sort-groups&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:data-type</span> attribute specifies the data type of a field to be sorted. </p><p class="Text_20_body">If the attribute value is <span class="Attribute_20_Value">automatic</span>, the consumer shall determine what type of data is in the field. User defined sort orders are implementation specific.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:data-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: consumer determines the type of data in a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">umber</span>: numeric data type.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext</span>: text data type.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">string</span> (name of a user defined sort order, implementation-dependent)<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:sort-groups&gt;</span> <a href="#element-table_sort-groups">9.4.22</a> element the default value for this attribute is <span class="Attribute_20_Value">automatic</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:data-type</span> attribute is usable with the following element: <span class="Element">&lt;table:sort-groups&gt;</span> <a href="#element-table_sort-groups">9.4.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:data-type</span> attribute are <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">number</span>, <span class="Attribute_20_Value">automatic</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_612table_date-end"><span style="margin-right:0.127cm;">19.612</span></a><a id="__RefHeading__1418356_253892949"/><a id="attribute-table_date-end"/>table:date-end</h2><p class="Text_20_body">The <span class="Attribute">table:date-end</span> attribute specifies the end value for a grouping of date values. </p><p class="Text_20_body">All values that are higher than the end value are contained in a single group, while values that are equal to or lower than the end value are grouped as specified by the <span class="Attribute">table:grouped-by</span> and <span class="Attribute">table:step</span> attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:date-end</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the highest value of the field is taken as the end value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">dateOrDateTime</span>: <span class="Datatype"><a href="#datatype-dateOrDateTime">18.3.14</a></span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:date-end</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:date-end</span> attribute are a value of type <span class="Datatype">dateOrDateTime</span> <a href="#datatype-dateOrDateTime">18.3.14</a> or <span class="Attribute_20_Value">auto</span>.</p><h2 class="Heading_20_2"><a id="a19_613table_date-start"><span style="margin-right:0.127cm;">19.613</span></a><a id="__RefHeading__1418358_253892949"/><a id="attribute-table_date-start"/>table:date-start</h2><p class="Text_20_body">The <span class="Attribute">table:date-start</span> attribute specifies the start value for a grouping of date values. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:date-start</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the lowest value of the field is used as the start value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">dateOrDateTime</span>: <span class="Datatype"><a href="#datatype-dateOrDateTime">18.3.14</a></span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:date-start</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:date-start</span> attribute are a value of type <span class="Datatype">dateOrDateTime</span> <a href="#datatype-dateOrDateTime">18.3.14</a> or <span class="Attribute_20_Value">auto</span>.</p><h2 class="Heading_20_2"><a id="a19_614table_date-value"><span style="margin-right:0.127cm;">19.614</span></a><a id="__RefHeading__1418360_253892949"/><a id="attribute-table_date-value"/>table:date-value</h2><p class="Text_20_body">The <span class="Attribute">table:date-value</span> attribute specifies the null date. The null date is the date that results in the value “0” if a date value is converted into a numeric value. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1899-12-30</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:date-value</span> attribute is usable with the following element: <span class="Element">&lt;table:null-date&gt;</span> <a href="#element-table_null-date">9.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:date-value</span> attribute has the data type <span class="Datatype">date</span> <a href="#datatype-date">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_615table_default-cell-style-name"><span style="margin-right:0.127cm;">19.615</span></a><a id="__RefHeading__1418362_253892949"/><a id="attribute-table_default-cell-style-name"/>table:default-cell-style-name</h2><p class="Text_20_body">The <span class="Attribute">table:default-cell-style-name</span> attribute specifies a default cell style. Cells defined by a <span class="Element">&lt;table:table-cell&gt;</span> element that do not have a <span class="Attribute">table:style-name</span> attribute value use the specified default cell style.</p><p class="Text_20_body">If an individual cell has a default style specified by a <span class="Attribute">table:default-cell-style-name</span> attribute on a <span class="Element">&lt;table:table-column&gt;</span> element and by a style:default-cell-style-name on a <span class="Element">&lt;table:table-row&gt;</span> element, the default style specified by the <span class="Element">&lt;table:table-row&gt;</span> element shall be applied to the cell and the default style specified by the &lt;table:table-column element shall be ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:default-cell-style-name</span> attribute is usable with the following elements: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a> and <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:default-cell-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_616table_direction"><span style="margin-right:0.127cm;">19.616</span></a><a id="__RefHeading__1418364_253892949"/><a id="attribute-table_direction"/>table:direction</h2><p class="Text_20_body">The <span class="Attribute">table:direction</span> attribute specifies the direction of a relation between a cell and a highlighted range. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-another-table</span>: relationship begins at another table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rom-same-table</span>: relationship begins at the same table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">o-another-table</span>: relationship ends at another table.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:direction</span> attribute is usable with the following element: <span class="Element">&lt;table:highlighted-range&gt;</span> <a href="#element-table_highlighted-range">9.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:direction</span> attribute are <span class="Attribute_20_Value">from-another-table</span>, <span class="Attribute_20_Value">to-another-table</span> or <span class="Attribute_20_Value">from-same-table</span>.</p><h2 class="Heading_20_2"><a id="a19_617table_display"><span style="margin-right:0.127cm;">19.617</span></a><a id="__RefHeading__1418366_253892949"/><a id="attribute-table_display"/>table:display</h2><p class="Text_20_body">The <span class="Attribute">table:display</span> attribute specifies whether a table is displayed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a> and <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a> elements the default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Default_20_Value">For <span class="Element">&lt;table:error-message&gt;</span> <a href="#element-table_error-message">9.4.7</a> and <span class="Element">&lt;table:help-message&gt;</span> <a href="#element-table_help-message">9.4.6</a> elements the default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:display</span> attribute is usable with the following elements: <span class="Element">&lt;table:data-pilot-member&gt;</span> <a href="#element-table_data-pilot-member">9.6.12</a>, <span class="Element">&lt;table:error-message&gt;</span> <a href="#element-table_error-message">9.4.7</a>, <span class="Element">&lt;table:help-message&gt;</span> <a href="#element-table_help-message">9.4.6</a>, <span class="Element">&lt;table:table-column-group&gt;</span> <a href="#element-table_table-column-group">9.1.10</a> and <span class="Element">&lt;table:table-row-group&gt;</span> <a href="#element-table_table-row-group">9.1.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:display</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_618table_display-border"><span style="margin-right:0.127cm;">19.618</span></a><a id="__RefHeading__1418368_253892949"/><a id="attribute-table_display-border"/>table:display-border</h2><p class="Text_20_body">The <span class="Attribute">table:display-border</span> attribute specifies whether to display a border around a scenario that belongs to a scenario table.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display-border</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: border is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: border is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:display-border</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:display-border</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_619table_display-duplicates"><span style="margin-right:0.127cm;">19.619</span></a><a id="__RefHeading__1418370_253892949"/><a id="attribute-table_display-duplicates"/>table:display-duplicates</h2><p class="Text_20_body">The <span class="Attribute">table:display-duplicates</span> attribute specifies whether to display duplicate matches in a result.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display-duplicates</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: duplicate matches not displayed in results.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: duplicate matches displayed in results.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:display-duplicates</span> attribute is usable with the following element: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:display-duplicates</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_620table_display-filter-buttons"><span style="margin-right:0.127cm;">19.620</span></a><a id="__RefHeading__1418372_253892949"/><a id="attribute-table_display-filter-buttons"/>table:display-filter-buttons</h2><p class="Text_20_body">The <span class="Attribute">table:display-filter-buttons</span> attribute specifies whether to display filter buttons. Filter buttons are list box controls displayed in the label cells whose list entries are the values that exist in the labeled row or column. Selecting one of these entries is the equivalent of applying a filter to the database range that selects all row or columns where the cells in the labeled row or column have the selected value.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display-filter-buttons</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: filter buttons are not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: filter buttons are displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:display-filter-buttons</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:display-filter-buttons</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_621table_display-list"><span style="margin-right:0.127cm;">19.621</span></a><a id="__RefHeading__1418374_253892949"/><a id="attribute-table_display-list"/>table:display-list</h2><p class="Text_20_body">The <span class="Attribute">table:display-list</span> attribute specifies whether a list of values that occurs within a condition is displayed in a UI when a user is entering a cell value. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display-list</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: the list values are not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sort-ascending</span>: the list values are displayed in ascending order.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unsorted</span>: the list values are displayed in the order they occur in the condition.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">unsorted</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:display-list</span> attribute is usable with the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:display-list</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">unsorted</span> or <span class="Attribute_20_Value">sort-ascending</span>.</p><h2 class="Heading_20_2"><a id="a19_622table_display-member-mode"><span style="margin-right:0.127cm;">19.622</span></a><a id="__RefHeading__1418376_253892949"/><a id="attribute-table_display-member-mode"/>table:display-member-mode</h2><p class="Text_20_body">The <span class="Attribute">table:display-member-mode</span> attribute specifies whether the value count specified by <span class="Attribute">table:member-count</span> attribute should be taken from the top or from the bottom of a data field's column. <a href="#attribute-table_member-count">19.667</a></p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display-member-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-bottom</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-top</span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:display-member-mode</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-display-info&gt;</span> <a href="#element-table_data-pilot-display-info">9.6.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:display-member-mode</span> attribute are <span class="Attribute_20_Value">from-top</span> or <span class="Attribute_20_Value">from-bottom</span>.</p><h2 class="Heading_20_2"><a id="a19_623table_drill-down-on-double-click"><span style="margin-right:0.127cm;">19.623</span></a><a id="__RefHeading__1418378_253892949"/><a id="attribute-table_drill-down-on-double-click"/>table:drill-down-on-double-click</h2><p class="Text_20_body">The <span class="Attribute">table:drill-down-on-double-click</span> attribute specifies how the data pilot table reacts on a double click in the data pilot table. A double click other than as specified in a data pilot table has no effect.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:drill-down-on-double-click</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a double click on a member label or the empty area next to it starts the edit mode of the table cell, like for cells outside of the data pilot table. <span class="odfLiEnd"/> </p><p class="P25" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span><span class="Note_20_Label">Note:</span> This can be used to rename group fields or members. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a double click on a member label or the empty area next to it shows or hides details for that member.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:drill-down-on-double-click</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:drill-down-on-double-click</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_624table_embedded-number-behavior"><span style="margin-right:0.127cm;">19.624</span></a><a id="__RefHeading__1418380_253892949"/><a id="attribute-table_embedded-number-behavior"/>table:embedded-number-behavior</h2><p class="Text_20_body">The <span class="Attribute">table:embedded-number-behavior</span> attribute specifies how string values that contain digits are sorted. If the value is <span class="Attribute_20_Value">alpha-numeric</span>, string comparison as specified by the other attributes of <span class="Element">&lt;table:sort&gt;</span> element is used for sorting.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:embedded-number-behavior</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">alpha-numeric</span>: other attributes are used to specify <span class="T2">the</span> string comparison for sorting.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: string values are compared as defined below <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">integer</span>: string values are compared as defined below <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"><span class="Note_20_Label">Note: </span>If the attribute value is <span class="Attribute_20_Value">integer</span> or <span class="Attribute_20_Value">double</span>, string-prefixed numbers will be sorted in a "natural", number-aware way, i.e. A1, A2, A3, ... , A19, A20, instead of the normal, alpha-numeric behavior, i.e. A1, A10, A11, A12, ... ,A19, A2, A20, A3, A4, ... , A8, A9.</p><p class="Text_20_body">The following illustrates how two strings shall be compared if the attribute value is <span class="Attribute_20_Value">integer</span> or <span class="Attribute_20_Value">double</span>.</p><p class="Text_20_body">In the following, the term "alpha-numeric comparison" means the string comparison that would be used if the <span class="Attribute">table:embedded-number-behavior</span> attribute would have the value <span class="Attribute_20_Value">alpha-numeric</span>.</p><p class="Text_20_body">Step 1: The two strings are compared by using the alpha-numeric comparison to test whether they are equal.  If they are equal, the comparison will stop immediately returning an equality as result.</p><p class="Text_20_body">Step 2:.The prefix substrings of the two strings are determined by locating the first occurrence of a digit character in the two strings; the substrings from the very first characters through the characters preceding the first digits are the prefix substrings. If a string starts with a digit, the prefix substring of this string is empty. If there is no digit in either one of the compared strings, the natural sort process will end and the alpha-numeric comparison will be performed instead. </p><p class="Text_20_body">Step 3: After the prefix substrings have been determined for both strings, an alpha-numeric comparison is performed on the two prefix substrings. If they differ, the result is returned and the process will end.</p><p class="Text_20_body">Step 4. The numeric substrings are determined by locating the first occurrences of a non-digit character after the first digit characters; the substrings from the first digit characters through the characters preceding the first non-digit character are the numeric substrings. These substrings are converted into double-precision values. The converted values are compared by numeric comparison. If these values differ, then the result will be returned and the process will end.</p><p class="Text_20_body">Step 5. The suffix substrings, which are the strings that start after the last digits of the numeric substring, will be determined. This suffix substrings replace the original strings, and the whole process will start again with step 1.</p><p class="Text_20_body">Decimal separators are treated as follows: If the attribute value is <span class="Attribute_20_Value">integer</span>, then a decimal separator is not considered as a digit. If the attribute value is <span class="Attribute_20_Value">double</span>, the treatment of a decimal separator is context-dependent: If a decimal separator occurs adjacent to one or two digit characters, it is considered a digit character as long as it is the only occurrence in that given numeric substring. In other words, a second occurrence of a decimal separator in sequence of digits and decimal separators is treated as a non-digit character. Therefore the character immediately preceding the separator becomes the last character of the numeric substring, while the separator itself becomes the first character of the suffix substring.</p><p class="Text_20_body">This sorting process is illustrated by the following figure:</p><!--Next 'div' was a 'text:p'.--><div class="Text_20_body"> <!--Next 'div' is a draw:frame.--><div style="width:4.9165in; padding:0; " class="fr1" id="Frame8"><!--Next 'div' was a 'draw:text-box'.--><div style="min-height:1.2189in;"><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is emulating the top hight of a draw:frame.--><div style="height:0.002cm;"> </div><!--Next 'div' is a draw:frame.--><div style="height:1.2189in;width:4.9165in; padding:0;  float:left; position:relative; left:0.0041cm; " class="fr6" id="graphics1"><img style="height:3.096cm;width:12.4879cm;" alt="" src="./Pictures/10000000000001D800000075C6C51876.png"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0.0041cm;">Figure <a id="refFigure0"/>1 - Natural sort</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></div></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">alpha-numeric</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:embedded-number-behavior</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:embedded-number-behavior</span> attribute are <span class="Attribute_20_Value">alpha-numeric</span>, <span class="Attribute_20_Value">integer</span> or <span class="Attribute_20_Value">double</span>.</p><h2 class="Heading_20_2"><a id="a19_625table_enabled"><span style="margin-right:0.127cm;">19.625</span></a><a id="__RefHeading__1418382_253892949"/><a id="attribute-table_enabled"/>table:enabled</h2><p class="Text_20_body">The <span class="Attribute">table:enabled</span> attribute specifies whether the <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element is evaluated or not.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:enabled</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element is not evaluated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the <span class="Element">&lt;table:data-pilot-display-info&gt;</span> element is evaluated.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:enabled</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-display-info&gt;</span> <a href="#element-table_data-pilot-display-info">9.6.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:enabled</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_626table_end"><span style="margin-right:0.127cm;">19.626</span></a><a id="__RefHeading__1418384_253892949"/><a id="attribute-table_end"/>table:end</h2><p class="Text_20_body">The <span class="Attribute">table:end</span> attribute specifies the end value for a grouping of numeric values. All values that are higher than the end value are contained in a single group, while values that are equal to or lower than the end value are grouped as specified by <span class="Attribute">table:grouped-by</span> and <span class="Attribute">table:step</span> attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:end</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the highest value of the field is taken as the end value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">double</span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:end</span> attribute are a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a> or <span class="Attribute_20_Value">auto</span>.</p><h2 class="Heading_20_2"><a id="a19_627table_end-cell-address"><span style="margin-right:0.127cm;">19.627</span></a><a id="__RefHeading__1418386_253892949"/><a id="attribute-table_end-cell-address"/>table:end-cell-address</h2><p class="Text_20_body">The <span class="Attribute">table:end-cell-address</span> attribute specifies specify end position of the shape if it is included in a spreadsheet document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-cell-address</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-cell-address</span> attribute has the data type <span class="Datatype">cellAddress</span> <a href="#datatype-cellAddress">18.3.4</a>.</p><h2 class="Heading_20_2"><a id="a19_628table_end-column"><span style="margin-right:0.127cm;">19.628</span></a><a id="__RefHeading__1418388_253892949"/><a id="attribute-table_end-column"/>table:end-column</h2><p class="Text_20_body">The <span class="Attribute">table:end-column</span> attribute specifies the end column of a range if the range address is a cell range address. The value of a <span class="Attribute">table:end-column</span> attribute is inclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-column</span> attribute is usable with the following elements: <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-column</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_629table_end-position"><span style="margin-right:0.127cm;">19.629</span></a><a id="__RefHeading__1418390_253892949"/><a id="attribute-table_end-position"/>table:end-position</h2><p class="Text_20_body">The <span class="Attribute">table:end-position</span> attribute specifies the number of the last deleted row or column. The value of a <span class="Attribute">table:end-position</span> attribute is exclusive. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-position</span> attribute is usable with the following element: <span class="Element">&lt;table:movement-cut-off&gt;</span> <a href="#element-table_movement-cut-off">9.9.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_630table_end-row"><span style="margin-right:0.127cm;">19.630</span></a><a id="__RefHeading__1418392_253892949"/><a id="attribute-table_end-row"/>table:end-row</h2><p class="Text_20_body">The <span class="Attribute">table:end-row</span> attribute specifies the end row of a range if the range address is a cell range address. The value of a <span class="Attribute">table:end-row</span> attribute is inclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-row</span> attribute is usable with the following elements: <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-row</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_631table_end-table"><span style="margin-right:0.127cm;">19.631</span></a><a id="__RefHeading__1418394_253892949"/><a id="attribute-table_end-table"/>table:end-table</h2><p class="Text_20_body">The <span class="Attribute">table:end-table</span> attribute specifies the end table of a range if the range address is a cell range address. The value of a <span class="Attribute">table:end-table</span> attribute is inclusive. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-table</span> attribute is usable with the following elements: <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-table</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_632table_end-x"><span style="margin-right:0.127cm;">19.632</span></a><a id="__RefHeading__1418396_253892949"/><a id="attribute-table_end-x"/>table:end-x </h2><p class="Text_20_body">The <span class="Attribute">table:end-x</span> attribute specifies the x-coordinate of the end position of a shape relative to the top left edge of a cell. The size attributes of the shape are ignored. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-x</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h2 class="Heading_20_2"><a id="a19_633table_end-y"><span style="margin-right:0.127cm;">19.633</span></a><a id="__RefHeading__1418398_253892949"/><a id="attribute-table_end-y"/>table:end-y</h2><p class="Text_20_body">The <span class="Attribute">table:end-y</span> attribute specifies the y-coordinate of the end position of a shape relative to the top left edge of a cell. The size attributes of the shape are ignored. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:end-y</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:end-y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h2 class="Heading_20_2"><a id="a19_634table_execute"><span style="margin-right:0.127cm;">19.634</span></a><a id="__RefHeading__1418400_253892949"/><a id="attribute-table_execute"/>table:execute</h2><p class="Text_20_body">The <span class="Attribute">table:execute</span> attribute specifies whether a macro should be executed or not.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:execute</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: macro is not executed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: macro is executed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:execute</span> attribute is usable with the following element: <span class="Element">&lt;table:error-macro&gt;</span> <a href="#element-table_error-macro">9.4.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:execute</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_635table_expression"><span style="margin-right:0.127cm;">19.635</span></a><a id="__RefHeading__1418402_253892949"/><a id="attribute-table_expression"/>table:expression</h2><p class="Text_20_body">The <span class="Attribute">table:expression</span> attribute specifies an expression. If the expression contains a named range or another named expression, the named range or named expression shall be specified first, before the containing expression. If the expression contains a relative cell range address, a <span class="Attribute">table:base-cell-address</span> attribute shall also appear on the <span class="Element">&lt;table:named-expression&gt;</span> element. </p><p class="Text_20_body">Relative cell range addresses that occur in an expression define an offset which shall be interpreted relative to the cell where a named expression is used. The offset is the same as the offsets between the table cell addressed by the relative cell range address and the table cell specified by the <span class="Attribute">table:base-cell-address</span> attribute. </p><p class="Text_20_body">The value of this attribute may have a namespace prefix, followed by a ":" (U+003A, COLON), followed by an expression. If the namespace prefix is missing it defaults to the "urn:oasis:names:tc:opendocument:xmlns:of:1.2" namespace. If a namespace prefix is present, the expression shall start with an '=' equal sign. If no namespace prefix is present, the '=' equal sign may be omitted. The XML namespace name bound to the namespace prefix specifies the syntax and semantics of the formulas and values occurring within the condition.</p><p class="Text_20_body">An OpenDocument Consumer when hosting a formula evaluator makes available the host-dependent properties defined by table <a href="#refTable11">12</a> in 19.644.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:expression</span> attribute is usable with the following element: <span class="Element">&lt;table:named-expression&gt;</span> <a href="#element-table_named-expression">9.4.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:expression</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_636table_field-name"><span style="margin-right:0.127cm;">19.636</span></a><a id="__RefHeading__1418404_253892949"/><a id="attribute-table_field-name"/>table:field-name</h2><p class="Text_20_body">The <span class="Attribute">table:field-name</span> attribute specifies a category column whose members' values are used in operations defined by a <span class="Attribute">table:type</span> attribute that determines the display of values of the data field of which the <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> element is a part. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:field-name</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> <a href="#element-table_data-pilot-field-reference">9.6.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:field-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_637table_field-number"><span style="margin-right:0.127cm;">19.637</span></a><a id="__RefHeading__1418406_253892949"/><a id="attribute-table_field-number"/>table:field-number</h2><p class="Text_20_body">The <span class="Attribute">table:field-number</span> number attribute specifies a row or column number to sort, subtotal or filter. It is the number of a row or column within a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:field-number</span> attribute is usable with the following elements: <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>, <span class="Element">&lt;table:sort-by&gt;</span> <a href="#element-table_sort-by">9.4.20</a> and <span class="Element">&lt;table:subtotal-field&gt;</span> <a href="#element-table_subtotal-field">9.4.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:field-number</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_638table_filter-name"><span style="margin-right:0.127cm;">19.638</span></a><a id="__RefHeading__1418408_253892949"/><a id="attribute-table_filter-name"/>table:filter-name</h2><p class="Text_20_body">The <span class="Attribute">table:filter-name</span> attribute specifies the file type of the document containing the original table. The value of this attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:filter-name</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a> and <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:filter-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_639table_filter-options"><span style="margin-right:0.127cm;">19.639</span></a><a id="__RefHeading__1418410_253892949"/><a id="attribute-table_filter-options"/>table:filter-options</h2><p class="Text_20_body">The <span class="Attribute">table:filter-options</span> attribute specifies implementation-dependent settings for a file type.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:filter-options</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a> and <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:filter-options</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_640table_first-row-end-column__deprecated_"><span style="margin-right:0.127cm;">19.640</span></a><a id="__RefHeading__1418412_253892949"/><a id="attribute-table_first-row-end-column"/>table:first-row-end-column (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">table:first-row-end-column</span> attribute specifies the whether the cell in the first row, end column gets its style from its row or column. </p><p class="Text_20_body">The use of this attribute is deprecated. The <span class="Attribute">table:use-first-row-styles</span> or <span class="Attribute">table:use-last-column-styles</span> attributes should be used instead. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:first-row-end-column</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: cell in first row, end column should inherit its style from the column where it appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: cell in first row, end column should inherit its style from the row where it appears.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:first-row-end-column</span> attribute is usable with the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:first-row-end-column</span> attribute are <span class="Attribute_20_Value">row</span> or <span class="Attribute_20_Value">column</span>.</p><h2 class="Heading_20_2"><a id="a19_641table_first-row-start-column__deprecated_"><span style="margin-right:0.127cm;">19.641</span></a><a id="__RefHeading__1418414_253892949"/><a id="attribute-table_first-row-start-column"/>table:first-row-start-column (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">table:first-row-start-column</span> attribute specifies the whether the cell in the first row, start column gets its style from its row or column. </p><p class="Text_20_body">The use of this attribute is deprecated. The <span class="Attribute">table:use-first-row-styles</span> or <span class="Attribute">table:use-first-column-styles</span> attributes should be used instead. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:first-row-start-column</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: cell in first row, start column should inherit its style from the column where it appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: cell in first row, start column should inherit its style from the row where it appears.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:first-row-start-column</span> attribute is usable with the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:first-row-start-column</span> attribute are <span class="Attribute_20_Value">row</span> or <span class="Attribute_20_Value">column</span>.</p><h2 class="Heading_20_2"><a id="a19_642table_formula"><span style="margin-right:0.127cm;">19.642</span></a><a id="__RefHeading__1418416_253892949"/><a id="attribute-table_formula"/>table:formula</h2><p class="Text_20_body">The <span class="Attribute">table:formula</span> attribute specifies a formula for a table cell.</p><p class="Text_20_body">Formulas specify calculations to be performed within table cells. The attribute value should begin with a namespace prefix followed by ":" (U+003A, COLON), followed by the text of the formula. The namespace bound to the prefix determines the syntax and semantics of the formula. </p><p class="Text_20_body">Whenever the initial text of a formula has the appearance of an NCName followed by ":" (U+003A, COLON), an OpenDocument producer shall provide a valid namespace prefix and separating ":" (U+003A, COLON) separator before the text of the formula in order to eliminate any ambiguity. </p><p class="Text_20_body">If a namespace prefix is not specified, it defaults to the "urn:oasis:names:tc:opendocument:xmlns:of:1.2" namespace. </p><p class="Text_20_body">An OpenDocument Consumer when hosting a formula evaluator has the host-dependent properties specified in Table <a href="#refTable15">16</a>.</p><p class="Table">Table  <a id="refTable15"/>16 Host-dependent Properties</p><table border="0" cellspacing="0" cellpadding="0" class="Table12"><colgroup><col width="222"/><col width="222"/><col width="222"/></colgroup><tr><td style="text-align:left;width:2in; " class="Table12_A1"><p class="Table_20_Heading">Property</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A1"><p class="Table_20_Heading">Attribute</p></td><td style="text-align:left;width:2in; " class="Table12_C1"><p class="Table_20_Heading">Default Value </p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-CASE-SENSITIVE</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">table:case-sensitive</span></p></td><td style="text-align:right; width:2in; " class="Table12_C2"><p class="Table_20_Contents"><span class="Attribute_20_Value">true</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-PRECISION-AS-SHOWN</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">table:precision-as-shown</span></p></td><td style="text-align:right; width:2in; " class="Table12_C2"><p class="Table_20_Contents"><span class="Attribute_20_Value">false</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-SEARCH-CRITERIA-MUST-APPLY-TO-WHOLE-CELL</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">t</span><span class="Attribute">able:search-criteria-must-apply-to-whole-</span><span class="Attribute">cell</span></p></td><td style="text-align:left;width:2in; " class="Table12_C4"><p class="Table_20_Contents"><span class="Attribute_20_Value">true</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-AUTOMATIC-FIND-LABELS</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">t</span><span class="Attribute">able:automatic-find-labels</span></p></td><td style="text-align:left;width:2in; " class="Table12_C4"><p class="Table_20_Contents"><span class="Attribute_20_Value">true</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-USE-REGULAR-EXPRESSIONS</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">t</span><span class="Attribute">able:use-regular-</span><span class="Attribute">expressions</span></p></td><td style="text-align:right; width:2in; " class="Table12_C2"><p class="Table_20_Contents"><span class="Attribute_20_Value">true</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-USE-WILDCARDS</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">t</span><span class="Attribute">able:use-wildcards</span></p></td><td style="text-align:right; width:2in; " class="Table12_C2"><p class="Table_20_Contents"><span class="Attribute_20_Value">false</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-NULL-YEAR</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">t</span><span class="Attribute">able:null-year</span></p></td><td style="text-align:right; width:2in; " class="Table12_C8"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">1930</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-NULL-DATE</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">t</span><span class="Attribute">able:null-date</span></p></td><td style="text-align:left;width:2in; " class="Table12_C4"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">1899-12-30</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-LOCALE</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents">N/A</p></td><td style="text-align:left;width:2in; " class="Table12_C4"><p class="Table_20_Contents">Implementation-defined</p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-ITERATION-STATUS</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">table:status</span></p></td><td style="text-align:left;width:2in; " class="Table12_C4"><p class="Table_20_Contents">disable </p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-ITERATION-MAXIMUM-DIFFERENCE</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">table:maximum-</span><span class="Attribute">difference</span></p></td><td style="text-align:right; width:2in; " class="Table12_C8"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">0</span></p></td></tr><tr><td style="text-align:left;width:2in; " class="Table12_A2"><p class="Table_20_Contents">HOST-ITERATION-STEPS</p></td><td style="text-align:left;width:2.0014in; " class="Table12_A2"><p class="Table_20_Contents"><span class="Attribute">table:steps</span></p></td><td style="text-align:right; width:2in; " class="Table12_C8"><p class="Table_20_Contents"><span class="Attribute_20_Value_20_Instance">100</span></p></td></tr></table><p class="Text_20_body"><span class="Note_20_Label">Note</span>: Host-dependent properties are applicable to <span class="Attribute">style:condition</span> (<a href="#attribute-style_condition">19.468</a>), <span class="Attribute">table:condition</span> (<a href="#attribute-table_condition">19.596</a>) and, <span class="Attribute">table:expression</span> (<a href="#attribute-table_expression">19.635</a>) attributes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:formula</span> attribute is usable with the following elements: <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:formula</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_643table_function"><span style="margin-right:0.127cm;">19.643</span></a><a id="__RefHeading__1418418_253892949"/><a id="attribute-table_function"/>table:function</h2><h3 class="Heading_20_3"><a id="a19_643_1General"><span style="margin-right:0.127cm;">19.643.1</span></a><a id="__RefHeading__1418420_253892949"/><a id="table_function-General"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:function</span> attribute specifies functions that are applied to tables.</p><p class="Text_20_body">The <span class="Attribute">table:function</span> attribute on all elements has the following defined values:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">average</span>: the average of all numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">count</span>: the count of all non-empty values, including text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">countnums</span>: the count of all numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">max</span>: the maximum of all numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">min</span>: the minimum of all numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">product</span>: the product of all numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stdev</span>: the standard deviation, treating all numeric values as a sample from a population.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stdevp</span>: the standard deviation, treating all numeric values as a whole population.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sum</span>: the sum of all numeric values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">var</span>: the variance, treating all numeric values as a sample from a population.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">varp</span>: the variance, treating all numeric values as a whole population. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">string</span>: an implementation-dependent function name.<span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a19_643_2_table_consolidation_"><span style="margin-right:0.127cm;">19.643.2</span></a><a id="__RefHeading__1418422_253892949"/><a id="attribute-table_function_element-table_consolidation"/>&lt;table:consolidation&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:function</span> attribute specifies functions. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:function</span> attribute is usable with the following element: <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:function</span> attribute are <span class="Attribute_20_Value">average</span>, <span class="Attribute_20_Value">count</span>, <span class="Attribute_20_Value">countnums</span>, <span class="Attribute_20_Value">max</span>, <span class="Attribute_20_Value">min</span>, <span class="Attribute_20_Value">product</span>, <span class="Attribute_20_Value">stdev</span>, <span class="Attribute_20_Value">stdevp</span>, <span class="Attribute_20_Value">sum</span>, <span class="Attribute_20_Value">var</span>, <span class="Attribute_20_Value">varp</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_643_3_table_data-pilot-field_"><span style="margin-right:0.127cm;">19.643.3</span></a><a id="__RefHeading__1418424_253892949"/><a id="attribute-table_function_element-table_data-pilot-field"/>&lt;table:data-pilot-field&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:function</span> attribute specifies specifies the function which is applied to the cell values of data columns.</p><p class="Text_20_body">For <span class="Element">&lt;table:data-pilot-field&gt;</span> elements whose <span class="Attribute">table:orientation</span> attribute has the value <span class="Attribute_20_Value">data</span>, the defined values for the <span class="Attribute">table:function</span> attribute are those defined in <a href="#table_function-General">19.643.1</a>.</p><p class="Text_20_body">For <span class="Element">&lt;table:data-pilot-field&gt;</span> elements whose <span class="Attribute">table:orientation</span> attribute has the value <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">row</span>, the only defined value for the <span class="Attribute">table:function</span> attribute is:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: no function is applied to that category field. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:function</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:function</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">average</span>, <span class="Attribute_20_Value">count</span>, <span class="Attribute_20_Value">countnums</span>, <span class="Attribute_20_Value">max</span>, <span class="Attribute_20_Value">min</span>, <span class="Attribute_20_Value">product</span>, <span class="Attribute_20_Value">stdev</span>, <span class="Attribute_20_Value">stdevp</span>, <span class="Attribute_20_Value">sum</span>, <span class="Attribute_20_Value">var</span>, <span class="Attribute_20_Value">varp</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_643_4_table_data-pilot-subtotal_"><span style="margin-right:0.127cm;">19.643.4</span></a><a id="__RefHeading__1418426_253892949"/><a id="attribute-table_function_element-table_data-pilot-subtotal"/>&lt;table:data-pilot-subtotal&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:function</span> attribute specifies the type of subtotals to calculate. </p><p class="Text_20_body">The addition to the values defined in <a href="#table_function-General">19.643.1</a> the <span class="T2">following</span> value is defined:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: specifies that subtotals shall use the same function(s) that are used to calculate the <span class="Element">&lt;table:data-pilot-field&gt;</span> elements with <span class="Attribute">table:orientation</span>="<span class="Attribute_20_Value">data</span>". <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:function</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-subtotal&gt;</span> <a href="#element-table_data-pilot-subtotal">9.6.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:function</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">average</span>, <span class="Attribute_20_Value">count</span>, <span class="Attribute_20_Value">countnums</span>, <span class="Attribute_20_Value">max</span>, <span class="Attribute_20_Value">min</span>, <span class="Attribute_20_Value">product</span>, <span class="Attribute_20_Value">stdev</span>, <span class="Attribute_20_Value">stdevp</span>, <span class="Attribute_20_Value">sum</span>, <span class="Attribute_20_Value">var</span>, <span class="Attribute_20_Value">varp</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_643_5_table_subtotal-field_"><span style="margin-right:0.127cm;">19.643.5</span></a><a id="__RefHeading__1418428_253892949"/><a id="attribute-table_function_element-table_subtotal-field"/>&lt;table:subtotal-field&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:function</span> attribute specifies the type of subtotals to calculate. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:function</span> attribute is usable with the following element: <span class="Element">&lt;table:subtotal-field&gt;</span> <a href="#element-table_subtotal-field">9.4.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:function</span> attribute are <span class="Attribute_20_Value">average</span>, <span class="Attribute_20_Value">count</span>, <span class="Attribute_20_Value">countnums</span>, <span class="Attribute_20_Value">max</span>, <span class="Attribute_20_Value">min</span>, <span class="Attribute_20_Value">product</span>, <span class="Attribute_20_Value">stdev</span>, <span class="Attribute_20_Value">stdevp</span>, <span class="Attribute_20_Value">sum</span>, <span class="Attribute_20_Value">var</span>, <span class="Attribute_20_Value">varp</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_644table_grand-total"><span style="margin-right:0.127cm;">19.644</span></a><a id="__RefHeading__1418430_253892949"/><a id="attribute-table_grand-total"/>table:grand-total</h2><p class="Text_20_body">The <span class="Attribute">table:grand-total</span> attribute specifies whether a grand total column, row, or both should be displayed in addition to values calculated for each combination of values in the category columns.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:grand-total</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">both</span>: grand totals for rows and columns are displayed in addition to values calculated for other combinations of values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">olumn</span>: grand totals for columns are displayed in addition to values calculated for other combinations of values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: grand totals for rows and columns are not displayed in addition to values calculated for other combinations of values.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">row</span>: grand totals for rows are displayed in addition to values calculated for other combinations of values.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">both</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:grand-total</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:grand-total</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">row</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">both</span>.</p><h2 class="Heading_20_2"><a id="a19_645table_group-by-field-number"><span style="margin-right:0.127cm;">19.645</span></a><a id="__RefHeading__1418432_253892949"/><a id="attribute-table_group-by-field-number"/>table:group-by-field-number</h2><p class="Text_20_body">The <span class="Attribute">table:group-by-field-number</span> attribute specifies a field, that is to be grouped. It is the number of a row or column within a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:group-by-field-number</span> attribute is usable with the following element: <span class="Element">&lt;table:subtotal-rule&gt;</span> <a href="#element-table_subtotal-rule">9.4.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:group-by-field-number</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_646table_grouped-by"><span style="margin-right:0.127cm;">19.646</span></a><a id="__RefHeading__1418434_253892949"/><a id="attribute-table_grouped-by"/>table:grouped-by</h2><p class="Text_20_body">The <span class="Attribute">table:grouped-by</span> attribute specifies the grouping of the date values. Date values can be grouped by seconds, minutes, hours, days, months, quarters or years. </p><p class="Note"><span class="Note_20_Label">Note:</span> If date values are for instance grouped by minutes, all dates or times that are within the same minute are within one group. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:grouped-by</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">seconds</span>: a value expressed as seconds.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">minutes</span>: a value expressed as minutes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hours</span>: a value expressed as hours.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">days</span>: a value expressed as days.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">months</span>: a value expressed as months.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">quarters</span>: a value expressed as quarters (4 equal 3 month segments).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">years</span>: a value expressed as years.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:grouped-by</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:grouped-by</span> attribute are <span class="Attribute_20_Value">seconds</span>, <span class="Attribute_20_Value">minutes</span>, <span class="Attribute_20_Value">hours</span>, <span class="Attribute_20_Value">days</span>, <span class="Attribute_20_Value">months</span>, <span class="Attribute_20_Value">quarters</span> or <span class="Attribute_20_Value">years</span>.</p><h2 class="Heading_20_2"><a id="a19_647table_has-persistent-data"><span style="margin-right:0.127cm;">19.647</span></a><a id="__RefHeading__1418436_253892949"/><a id="attribute-table_has-persistent-data"/>table:has-persistent-data</h2><p class="Text_20_body">The <span class="Attribute">table:has-persistent-data</span> attribute specifies whether the current data in a database range is saved when the document itself is saved.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:has-persistent-data</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data in a database range is not saved when the document itself is saved.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data in a database range is saved when the document itself is saved.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:has-persistent-data</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:has-persistent-data</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_648table_id"><span style="margin-right:0.127cm;">19.648</span></a><a id="__RefHeading__1418438_253892949"/><a id="attribute-table_id"/>table:id</h2><p class="Text_20_body">The <span class="Attribute">table:id</span> attribute specifies the id of an insertion or tracked change.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:id</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:cell-content-deletion&gt;</span> <a href="#element-table_cell-content-deletion">9.9.7</a>, <span class="Element">&lt;table:change-deletion&gt;</span> <a href="#element-table_change-deletion">9.9.8</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:dependency&gt;</span> <a href="#element-table_dependency">9.9.5</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a>, <span class="Element">&lt;table:insertion-cut-off&gt;</span> <a href="#element-table_insertion-cut-off">9.9.11</a>, <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a> and <span class="Element">&lt;table:previous&gt;</span> <a href="#element-table_previous">9.9.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_649table_identify-categories"><span style="margin-right:0.127cm;">19.649</span></a><a id="__RefHeading__1418440_253892949"/><a id="attribute-table_identify-categories"/>table:identify-categories</h2><p class="Text_20_body">The <span class="Attribute">table:identify-categories</span> attribute specifies whether rows that do not contain a value in one of the category columns should use the value of the nearest ancestor row that has a value, or  should be moved into a group (or category) of its own. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:identify-categories</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: empty rows form a group or category.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: empty rows use the value of the nearest ancestor row that has a value for classification into a group or category.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:identify-categories</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:identify-categories</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_650table_ignore-empty-rows"><span style="margin-right:0.127cm;">19.650</span></a><a id="__RefHeading__1418442_253892949"/><a id="attribute-table_ignore-empty-rows"/>table:ignore-empty-rows</h2><p class="Text_20_body">The <span class="Attribute">table:ignore-empty-rows</span> attribute specifies whether empty rows in a source range should be ignored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:ignore-empty-rows</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: empty rows in a source range are not ignored.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: empty rows in a source range are ignored.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:ignore-empty-rows</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:ignore-empty-rows</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_651table_index"><span style="margin-right:0.127cm;">19.651</span></a><a id="__RefHeading__1418444_253892949"/><a id="attribute-table_index"/>table:index</h2><p class="Text_20_body">The <span class="Attribute">table:index</span> attribute specifies for the <span class="Element">&lt;table:operation&gt;</span> element on which it appears, its order in a series of <span class="Element">&lt;table:operation&gt;</span> elements under a <span class="Element">&lt;table:detective&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:index</span> attribute is usable with the following element: <span class="Element">&lt;table:operation&gt;</span> <a href="#element-table_operation">9.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:index</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_652table_is-active"><span style="margin-right:0.127cm;">19.652</span></a><a id="__RefHeading__1418446_253892949"/><a id="attribute-table_is-active"/>table:is-active</h2><p class="Text_20_body">The <span class="Attribute">table:is-active</span> attribute specifies whether a scenario that belongs to a scenario table is active.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:is-active</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: scenario that belongs to a scenario table is inactive.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: scenario that belongs to a scenario table is active.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:is-active</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:is-active</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_653table_is-data-layout-field"><span style="margin-right:0.127cm;">19.653</span></a><a id="__RefHeading__1418448_253892949"/><a id="attribute-table_is-data-layout-field"/>table:is-data-layout-field</h2><p class="Text_20_body">The <span class="Attribute">table:is-data-layout-field</span> attribute specifies whether a field is a data layout field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:is-data-layout-field</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: field is not a data layout field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: field is a data layout field.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:is-data-layout-field</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:is-data-layout-field</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_654table_is-selection"><span style="margin-right:0.127cm;">19.654</span></a><a id="__RefHeading__1418450_253892949"/><a id="attribute-table_is-selection"/>table:is-selection</h2><p class="Text_20_body">The <span class="Attribute">table:is-selection</span> attribute specifies whether the database range includes a complete database, or a selection of records from a database only.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:is-selection</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: database range includes a section of records from a database.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: database range includes a complete database.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:is-selection</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:is-selection</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_655table_is-sub-table"><span style="margin-right:0.127cm;">19.655</span></a><a id="__RefHeading__1418452_253892949"/><a id="attribute-table_is-sub-table"/>table:is-sub-table</h2><p class="Text_20_body">The <span class="Attribute">table:is-sub-table</span> attribute specifies if a nested table is a subtable. </p><p class="Text_20_body">If a table cell only contains a single table but no paragraphs or other content, the table can be specified as subtable. It occupies the whole cell and no other content can appear in the cell.</p><p class="Text_20_body">The borders of a subtable merge with the borders of the cell where it is specified. A subtable does not have its own style. </p><p class="Text_20_body">A nested table that is not specified to be a subtable appears as a table within a table, that is, it has borders distinct from those of the parent cell and respects the padding of the parent cell.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:is-sub-table</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: nested table is not a subtable.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: nested table is a subtable.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:is-sub-table</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:is-sub-table</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_656table_label-cell-range-address"><span style="margin-right:0.127cm;">19.656</span></a><a id="__RefHeading__1418454_253892949"/><a id="attribute-table_label-cell-range-address"/>table:label-cell-range-address</h2><p class="Text_20_body">The <span class="Attribute">table:label-cell-range-address</span> attribute specifies a cell range address for labels.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:label-cell-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:label-range&gt;</span> <a href="#element-table_label-range">9.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:label-cell-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h2 class="Heading_20_2"><a id="a19_657table_language"><span style="margin-right:0.127cm;">19.657</span></a><a id="__RefHeading__1418456_253892949"/><a id="attribute-table_language"/>table:language</h2><p class="Text_20_body">The <span class="Attribute">table:language</span> attribute specifies the natural language in which a comparison will occur.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:language</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:language</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h2 class="Heading_20_2"><a id="a19_658table_last-column-spanned"><span style="margin-right:0.127cm;">19.658</span></a><a id="__RefHeading__1418458_253892949"/><a id="attribute-table_last-column-spanned"/>table:last-column-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:last-column-spanned</span> attribute together with the <span class="Attribute">table:last-row-spanned</span> attribute specifies the last known size of a range. If the size of the range has changed since the determination of its size, the value of these attributes will be incorrect. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:last-column-spanned</span> attribute is usable with the following element: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:last-column-spanned</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_659table_last-row-end-column__deprecated_"><span style="margin-right:0.127cm;">19.659</span></a><a id="__RefHeading__1418460_253892949"/><a id="attribute-table_last-row-end-column"/>table:last-row-end-column (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">table:last-row-end-column</span> attribute specifies the whether the cell in the last row, end column gets its style from its row or column. </p><p class="Text_20_body">The use of this attribute is deprecated. The <span class="Attribute">table:use-last-row-styles</span> or <span class="Attribute">table:use-last-column-styles</span> attributes should be used instead. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:last-row-end-column</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: cell in last row, end column should inherit its style from the column where it appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: cell in last row, end column should inherit its style from the column where it appears.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:last-row-end-column</span> attribute is usable with the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:last-row-end-column</span> attribute are <span class="Attribute_20_Value">row</span> or <span class="Attribute_20_Value">column</span>.</p><h2 class="Heading_20_2"><a id="a19_660table_last-row-spanned"><span style="margin-right:0.127cm;">19.660</span></a><a id="__RefHeading__1418462_253892949"/><a id="attribute-table_last-row-spanned"/>table:last-row-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:last-row-spanned</span> attribute together with the <span class="Attribute">table:last-column-spanned</span> attribute specifies the last known size of a range. If the size of the range has changed since the determination of its size, the value of these attributes will be incorrect.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:last-row-spanned</span> attribute is usable with the following element: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:last-row-spanned</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_661table_last-row-start-column__deprecated_"><span style="margin-right:0.127cm;">19.661</span></a><a id="__RefHeading__1418464_253892949"/><a id="attribute-table_last-row-start-column"/>table:last-row-start-column (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">table:last-row-start-column</span> attribute specifies the whether the cell in the last row, start column gets its style from its row or column. </p><p class="Text_20_body">The use of this attribute is deprecated. The <span class="Attribute">table:use-last-row-styles</span> or <span class="Attribute">table:use-first-column-styles</span> attributes should be used instead. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:last-row-start-column</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: cell in last row, start column should inherit its style from the column where it appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">row</span>: cell in last row, start column should inherit its style from the column where it appears.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:last-row-start-column</span> attribute is usable with the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:last-row-start-column</span> attribute are <span class="Attribute_20_Value">row</span> or <span class="Attribute_20_Value">column</span>.</p><h2 class="Heading_20_2"><a id="a19_662table_layout-mode"><span style="margin-right:0.127cm;">19.662</span></a><a id="__RefHeading__1418466_253892949"/><a id="attribute-table_layout-mode"/>table:layout-mode</h2><p class="Text_20_body">The <span class="Attribute">table:layout-mode</span> attribute specifies how to layout a field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:layout-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outline-subtotals-bottom</span>: Like <span class="Attribute_20_Value">outline-subtotals-top</span>, except that subtotals are shown at the bottom (below the member's data, as in tabular layout mode).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outline-subtotals-top</span>: In outline layout mode, the members from the following field start in the row below a member's name. Subtotals are shown at the top (in the same row as the member's name). When the subtotals take up more than one row (manually selected, or because there are multiple data fields), they are always shown below the member's data, regardless of the setting.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">tabular-layout</span>: Tabular layout mode is the layout, where each member's name is on the same row as the first member from the following field. Subtotals are always shown below a member's data in this mode.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:layout-mode</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-layout-info&gt;</span> <a href="#element-table_data-pilot-layout-info">9.6.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:layout-mode</span> attribute are <span class="Attribute_20_Value">tabular-layout</span>, <span class="Attribute_20_Value">outline-subtotals-top</span> or <span class="Attribute_20_Value">outline-subtotals-bottom</span>.</p><h2 class="Heading_20_2"><a id="a19_663table_link-to-source-data"><span style="margin-right:0.127cm;">19.663</span></a><a id="__RefHeading__1418468_253892949"/><a id="attribute-table_link-to-source-data"/>table:link-to-source-data</h2><p class="Text_20_body">The <span class="Attribute">table:link-to-source-data</span> attribute specifies whether the data in a consolidation table range should be linked to the source data, so that it is automatically updated if any changes are made to the source data.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:link-to-source-data</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data in consolidated table range not linked to source data.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data in consolidated table range is linked to source data.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:link-to-source-data</span> attribute is usable with the following element: <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:link-to-source-data</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_664table_marked-invalid"><span style="margin-right:0.127cm;">19.664</span></a><a id="__RefHeading__1418470_253892949"/><a id="attribute-table_marked-invalid"/>table:marked-invalid</h2><p class="Text_20_body">The <span class="Attribute">table:marked-invalid</span> attribute specifies whether the current cell is marked invalid. This attribute cannot be used together with any other attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:marked-invalid</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: current cell not marked invalid.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: current cell marked invalid.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:marked-invalid</span> attribute is usable with the following element: <span class="Element">&lt;table:highlighted-range&gt;</span> <a href="#element-table_highlighted-range">9.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:marked-invalid</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_665table_matrix-covered"><span style="margin-right:0.127cm;">19.665</span></a><a id="__RefHeading__1418472_253892949"/><a id="attribute-table_matrix-covered"/>table:matrix-covered</h2><p class="Text_20_body">The <span class="Attribute">table:matrix-covered</span> attribute specifies if a cell is contained in a matrix. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:matrix-covered</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cell is not included in a matrix.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cell is included in a matrix.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:matrix-covered</span> attribute is usable with the following element: <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:matrix-covered</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_666table_maximum-difference"><span style="margin-right:0.127cm;">19.666</span></a><a id="__RefHeading__1418474_253892949"/><a id="attribute-table_maximum-difference"/>table:maximum-difference</h2><p class="Text_20_body">The <span class="Attribute">table:maximum-difference</span> attribute specifies the maximum difference between two iterative calculation results. The iteration is stopped if the result is less than the value of this attribute. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">0.001</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:maximum-difference</span> attribute is usable with the following element: <span class="Element">&lt;table:iteration&gt;</span> <a href="#element-table_iteration">9.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:maximum-difference</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_667table_member-count"><span style="margin-right:0.127cm;">19.667</span></a><a id="__RefHeading__1418476_253892949"/><a id="attribute-table_member-count"/>table:member-count</h2><p class="Text_20_body">The <span class="Attribute">table:member-count</span> attribute specifies the number of values from the top or from the bottom of a data field's column are shown.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:member-count</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-display-info&gt;</span> <a href="#element-table_data-pilot-display-info">9.6.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:member-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_668table_member-name"><span style="margin-right:0.127cm;">19.668</span></a><a id="__RefHeading__1418478_253892949"/><a id="attribute-table_member-name"/>table:member-name</h2><p class="Text_20_body">The <span class="Attribute">table:member-name</span> attribute specifies the value of a data pilot member.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:member-name</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> <a href="#element-table_data-pilot-field-reference">9.6.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:member-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_669table_member-type"><span style="margin-right:0.127cm;">19.669</span></a><a id="__RefHeading__1418480_253892949"/><a id="attribute-table_member-type"/>table:member-type</h2><p class="Text_20_body">The <span class="Attribute">table:member-type</span> attribute specifies the member of the referenced category column, whose value within the current data field is taken into account. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:member-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">named</span>: the <span class="Attribute">table:member-name</span> attribute on the same <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> element specifies the member whose value within the data field is taken into account.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">next</span>: the value of the data field for the next visible member of the referenced category column is taken into account. Empty members are skipped.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">previous</span>: the value of the data field for the next visible member of the referenced category column is taken into account. Empty members are skipped.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:member-type</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> <a href="#element-table_data-pilot-field-reference">9.6.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:member-type</span> attribute are <span class="Attribute_20_Value">named</span>, <span class="Attribute_20_Value">previous</span> or <span class="Attribute_20_Value">next</span>.</p><h2 class="Heading_20_2"><a id="a19_670table_message-type"><span style="margin-right:0.127cm;">19.670</span></a><a id="__RefHeading__1418482_253892949"/><a id="attribute-table_message-type"/>table:message-type</h2><p class="Text_20_body">The <span class="Attribute">table:message-type</span> attribute specifies the display of messages.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:message-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">information</span>: message is displayed as information only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stop</span>: message is displayed as an error and the operation that caused the validation check is stopped.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">warning</span>: message is displayed as a warning.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">stop</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:message-type</span> attribute is usable with the following element: <span class="Element">&lt;table:error-message&gt;</span> <a href="#element-table_error-message">9.4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:message-type</span> attribute are <span class="Attribute_20_Value">stop</span>, <span class="Attribute_20_Value">warning</span> or <span class="Attribute_20_Value">information</span>.</p><h2 class="Heading_20_2"><a id="a19_671table_mode"><span style="margin-right:0.127cm;">19.671</span></a><a id="__RefHeading__1418484_253892949"/><a id="attribute-table_mode"/>table:mode</h2><p class="Text_20_body">The <span class="Attribute">table:mode</span> attribute specifies what data should be copied from a source table to a destination table. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">copy-all</span>: formulas and styles are copied.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">co</span><span class="Attribute_20_Value">py-results-only</span>: only formula results and non-calculated cell content are copied.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">copy-all</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:mode</span> attribute is usable with the following element: <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:mode</span> attribute are <span class="Attribute_20_Value">copy-all</span> or <span class="Attribute_20_Value">copy-results-only</span>.</p><h2 class="Heading_20_2"><a id="a19_672table_multi-deletion-spanned"><span style="margin-right:0.127cm;">19.672</span></a><a id="__RefHeading__1418486_253892949"/><a id="attribute-table_multi-deletion-spanned"/>table:multi-deletion-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:multi-deletion-spanned</span> attribute specifies the total number of deleted rows or columns when multiple columns or rows were deleted simultaneously. Each deleted row or column is represented by a <span class="Element">&lt;table:deletion&gt;</span> element. The first &lt;table:deletion element in a set representing a simultaneous deletion, shall carry a <span class="Attribute">table:multi-deletion-spanned</span> attribute that specifies the total number of deleted rows or columns.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:multi-deletion-spanned</span> attribute is usable with the following element: <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:multi-deletion-spanned</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_673table_name"><span style="margin-right:0.127cm;">19.673</span></a><a id="__RefHeading__1418488_253892949"/><a id="attribute-table_name"/>table:name</h2><h3 class="Heading_20_3"><a id="a19_673_1General"><span style="margin-right:0.127cm;">19.673.1</span></a><a id="__RefHeading__1418490_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies a name.</p><h3 class="Heading_20_3"><a id="a19_673_2_table_cell-range-source_"><span style="margin-right:0.127cm;">19.673.2</span></a><a id="__RefHeading__1418492_253892949"/><a id="attribute-table_name_element-table_cell-range-source"/>&lt;table:cell-range-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a source database range or named range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_3_table_content-validation_"><span style="margin-right:0.127cm;">19.673.3</span></a><a id="__RefHeading__1418494_253892949"/><a id="attribute-table_name_element-table_content-validation"/>&lt;table:content-validation&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a content validation rule. It is used to reference the validation rule from the cell the rule should applied. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:content-validation&gt;</span> <a href="#element-table_content-validation">9.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_4_table_data-pilot-group_"><span style="margin-right:0.127cm;">19.673.4</span></a><a id="__RefHeading__1418496_253892949"/><a id="attribute-table_name_element-table_data-pilot-group"/>&lt;table:data-pilot-group&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a group.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-group&gt;</span> <a href="#element-table_data-pilot-group">9.6.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_5_table_data-pilot-group-member_"><span style="margin-right:0.127cm;">19.673.5</span></a><a id="__RefHeading__1418498_253892949"/><a id="attribute-table_name_element-table_data-pilot-group-member"/>&lt;table:data-pilot-group-member&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a member.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-group-member&gt;</span> <a href="#element-table_data-pilot-group-member">9.6.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_6_table_data-pilot-member_"><span style="margin-right:0.127cm;">19.673.6</span></a><a id="__RefHeading__1418500_253892949"/><a id="attribute-table_name_element-table_data-pilot-member"/>&lt;table:data-pilot-member&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the value for which display information is specified.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-member&gt;</span> <a href="#element-table_data-pilot-member">9.6.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_7_table_data-pilot-table_"><span style="margin-right:0.127cm;">19.673.7</span></a><a id="__RefHeading__1418502_253892949"/><a id="attribute-table_name_element-table_data-pilot-table"/>&lt;table:data-pilot-table&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a data pilot table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_8_table_database-range_"><span style="margin-right:0.127cm;">19.673.8</span></a><a id="__RefHeading__1418504_253892949"/><a id="attribute-table_name_element-table_database-range"/>&lt;table:database-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a database range on which to perform operations. Within a single document, only one database range may have no name. This database range is created by the consumer and is used to filter or sort data in a cell ranges without the user creating a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_9_table_named-expression_"><span style="margin-right:0.127cm;">19.673.9</span></a><a id="__RefHeading__1418506_253892949"/><a id="attribute-table_name_element-table_named-expression"/>&lt;table:named-expression&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of an expression.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:named-expression&gt;</span> <a href="#element-table_named-expression">9.4.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_10_table_named-range_"><span style="margin-right:0.127cm;">19.673.10</span></a><a id="__RefHeading__1418508_253892949"/><a id="attribute-table_name_element-table_named-range"/>&lt;table:named-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a database range on which to perform operations. Within a single document, only one database range may have no name. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:named-range&gt;</span> <a href="#element-table_named-range">9.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_11_table_operation_"><span style="margin-right:0.127cm;">19.673.11</span></a><a id="__RefHeading__1418510_253892949"/><a id="attribute-table_name_element-table_operation"/>&lt;table:operation&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a detective operation. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:name</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">remove-dependents</span>: removes highlighting from cells that use the value of the current cell in their formula.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">remove-precedents</span>: removes highlighting from cells whose values are use in the formula of the current cell.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">trace-dependents</span>: highlights cells that use the value of the current cell in their formula.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">trace-errors</span>: highlights cells that cause an error while calculating the result of the current cell's formula.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">trace-precedents</span>: highlights cells whose values are use in the formula of the current cell.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The nature of the highlighting imposed or removed from cells as the result of detective operations is implementation-defined.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:operation&gt;</span> <a href="#element-table_operation">9.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:name</span> attribute are <span class="Attribute_20_Value">trace-dependents</span>, <span class="Attribute_20_Value">remove-dependents</span>, <span class="Attribute_20_Value">trace-precedents</span>, <span class="Attribute_20_Value">remove-precedents</span> or <span class="Attribute_20_Value">trace-errors</span>.</p><h3 class="Heading_20_3"><a id="a19_673_12_table_source-service_"><span style="margin-right:0.127cm;">19.673.12</span></a><a id="__RefHeading__1418512_253892949"/><a id="attribute-table_name_element-table_source-service"/>&lt;table:source-service&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a service. The value of this attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_13_table_table_"><span style="margin-right:0.127cm;">19.673.13</span></a><a id="__RefHeading__1418514_253892949"/><a id="attribute-table_name_element-table_table"/>&lt;table:table&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_673_14_table_table-template_"><span style="margin-right:0.127cm;">19.673.14</span></a><a id="__RefHeading__1418516_253892949"/><a id="attribute-table_name_element-table_table-template"/>&lt;table:table-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:name</span> attribute specifies the name of a table template.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:name</span> attribute is usable with the following element: <span class="Element">&lt;table:table-template&gt;</span> <a href="#element-table_table-template">16.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_674table_null-year"><span style="margin-right:0.127cm;">19.674</span></a><a id="__RefHeading__1418518_253892949"/><a id="attribute-table_null-year"/>table:null-year</h2><p class="Text_20_body">The <span class="Attribute">table:null-year</span> attribute specifies the start year for year values that contain only two digits. All two digit year values are interpreted as a year that is the same as or follows the start year.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1930</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:null-year</span> attribute is usable with the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:null-year</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_675table_number-columns-repeated"><span style="margin-right:0.127cm;">19.675</span></a><a id="__RefHeading__1418520_253892949"/><a id="attribute-table_number-columns-repeated"/>table:number-columns-repeated</h2><h3 class="Heading_20_3"><a id="a19_675_1General"><span style="margin-right:0.127cm;">19.675.1</span></a><a id="__RefHeading__1418522_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:number-columns-repeated</span> attribute specifies the repetition of columns.</p><h3 class="Heading_20_3"><a id="a19_675_2_table_covered-table-cell_"><span style="margin-right:0.127cm;">19.675.2</span></a><a id="__RefHeading__1418524_253892949"/><a id="attribute-table_number-columns-repeated_element-table_covered-table-cell"/>&lt;table:covered-table-cell&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:number-columns-repeated</span> attribute specifies the number of successive columns in which a cell is repeated. It may be used to describe two or more adjoining cells with a single cell element, if they meet the following conditions:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The cells contain the same content and style.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The cells are not merged horizontally or vertically.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:number-columns-repeated</span> attribute is usable with the following element: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-columns-repeated</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_675_3_table_table-cell_"><span style="margin-right:0.127cm;">19.675.3</span></a><a id="__RefHeading__1418526_253892949"/><a id="attribute-table_number-columns-repeated_element-table_table-cell"/>&lt;table:table-cell&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:number-columns-repeated</span> attribute specifies the number of successive columns in which a cell is repeated. It may be used to describe two or more adjoining cells with a single cell element, if they meet the following conditions:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The cells contain the same content and style.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The cells are not merged horizontally or vertically.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:number-columns-repeated</span> attribute is usable with the following element: <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-columns-repeated</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_675_4_table_table-column_"><span style="margin-right:0.127cm;">19.675.4</span></a><a id="__RefHeading__1418528_253892949"/><a id="attribute-table_number-columns-repeated_element-table_table-column"/>&lt;table:table-column&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:number-columns-repeated</span> attribute specifies the number of columns to which a column description applies. If two or more columns are adjoining, and have the same style, this attribute may be used to describe them with a single <span class="Element">&lt;table:table-column&gt;</span> element.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:number-columns-repeated</span> attribute is usable with the following element: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-columns-repeated</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_676table_number-columns-spanned"><span style="margin-right:0.127cm;">19.676</span></a><a id="__RefHeading__1418530_253892949"/><a id="attribute-table_number-columns-spanned"/>table:number-columns-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:number-columns-spanned</span> attribute specifies the number of columns that a cell spans.</p><p class="Text_20_body">When a cell covers another cell because of a column or row span value greater than one, a <span class="Element">&lt;table:covered-table-cell&gt;</span> element shall appear in the table to represent the covered cell.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:number-columns-spanned</span> attribute is usable with the following element: <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-columns-spanned</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_677table_number-rows-repeated"><span style="margin-right:0.127cm;">19.677</span></a><a id="__RefHeading__1418532_253892949"/><a id="attribute-table_number-rows-repeated"/>table:number-rows-repeated</h2><p class="Text_20_body">The <span class="Attribute">table:number-rows-repeated</span> attribute specifies the number of rows to which a row element applies. If two or more rows are adjoining, and have the same content and style, and do not contain vertically merged cells, they may be described by a single <span class="Element">&lt;table:table-row&gt;</span> element that has a <span class="Attribute">table:number-rows-repeated</span> attribute with a value greater than 1.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:number-rows-repeated</span> attribute is usable with the following element: <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-rows-repeated</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_678table_number-rows-spanned"><span style="margin-right:0.127cm;">19.678</span></a><a id="__RefHeading__1418534_253892949"/><a id="attribute-table_number-rows-spanned"/>table:number-rows-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:number-rows-spanned</span> attribute specifies the number of columns that a cell spans.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:number-rows-spanned</span> attribute is usable with the following element: <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-rows-spanned</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_679table_number-matrix-columns-spanned"><span style="margin-right:0.127cm;">19.679</span></a><a id="__RefHeading__1418536_253892949"/><a id="attribute-table_number-matrix-columns-spanned"/>table:number-matrix-columns-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:number-matrix-columns-spanned</span> attribute specifies the number of rows spanned by a matrix.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:number-matrix-columns-spanned</span> attribute is usable with the following elements: <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-matrix-columns-spanned</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_680table_number-matrix-rows-spanned"><span style="margin-right:0.127cm;">19.680</span></a><a id="__RefHeading__1418538_253892949"/><a id="attribute-table_number-matrix-rows-spanned"/>table:number-matrix-rows-spanned</h2><p class="Text_20_body">The <span class="Attribute">table:number-matrix-rows-spanned</span> attribute specifies the number of rows spanned by a matrix.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:number-matrix-rows-spanned</span> attribute is usable with the following elements: <span class="Element">&lt;table:change-track-table-cell&gt;</span> <a href="#element-table_change-track-table-cell">9.9.16</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:number-matrix-rows-spanned</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_681table_object-name"><span style="margin-right:0.127cm;">19.681</span></a><a id="__RefHeading__1418540_253892949"/><a id="attribute-table_object-name"/>table:object-name</h2><p class="Text_20_body">The <span class="Attribute">table:object-name</span> attribute specifies the name of the object in the source which contains the data and is passed to the service implementation. Its value is implementation-dependent and service specific.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:object-name</span> attribute is usable with the following element: <span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:object-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_682table_on-update-keep-size"><span style="margin-right:0.127cm;">19.682</span></a><a id="__RefHeading__1418542_253892949"/><a id="attribute-table_on-update-keep-size"/>table:on-update-keep-size</h2><p class="Text_20_body">The <span class="Attribute">table:on-update-keep-size</span> attribute specifies the behavior of a database range if the size of the data in the data source changes. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:on-update-keep-size</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: range does not retain its size.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: range retains its size.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:on-update-keep-size</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:on-update-keep-size</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_683table_on-update-keep-styles"><span style="margin-right:0.127cm;">19.683</span></a><a id="__RefHeading__1418544_253892949"/><a id="attribute-table_on-update-keep-styles"/>table:on-update-keep-styles</h2><p class="Text_20_body">The <span class="Attribute">table:on-update-keep-styles</span> attribute specifies the behavior if the database range is updated. If the attribute value is “true”, the cell styles that are assigned to the cells in the first non-label row of the database range are used for all rows with in the database range. If the attribute value is “false”, all cells in the database range get the default cell style of the document assigned.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:on-update-keep-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: all cells in the database range get the default cell style of the document assigned.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cell styles that are assigned to the cells in the first non-label row of the database range are used for all rows with in the database range.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:on-update-keep-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:on-update-keep-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_684table_operator"><span style="margin-right:0.127cm;">19.684</span></a><a id="__RefHeading__1418546_253892949"/><a id="attribute-table_operator"/>table:operator</h2><p class="Text_20_body">The <span class="Attribute">table:operator</span> attribute specifies the operator to use in a filter condition. Each cell contained in columns specified by a field number (<span class="Attribute">table:field-number</span> attribute) is compared to a value (<span class="Attribute">table:value</span> attribute) using the specified operator. The result of this comparison is the result of the filter sub-conditions specified by a <span class="Element">&lt;table:filter-condition&gt;</span> element.</p><p class="Text_20_body">The defined operators that use regular expressions are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">match</span> (matches)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Instance">!match</span> (does not match)<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">table:value</span> attribute contains the regular expression. </p><p class="Text_20_body">Regular expressions are implementation-dependent expressions that, at a minimum, conform to the requirements of Conformance Clause C1 of <a title="Unicode Regular Expressions" href="http://www.unicode.org/reports/tr18/tr18-13.html">[UTR18]</a>.</p><p class="Text_20_body">The defined operators that do not use regular expressions are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">=</span> (Equal to)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">!=</span> (Not equal to)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">&lt;</span> (Less than)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">&gt;</span> (Greater than)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">&lt;=</span> (Less than or equal to)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">&gt;=</span> (Greater than or equal to)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">begins</span> (begins with)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">contains</span> (contains)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">!contains</span> (does not contain)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">ends</span> (ends with)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">!begins</span> (does not begin with)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">!ends</span> (does not end with)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">bottom percent</span> (like <span class="Attribute_20_Value_20_Fragment">bottom values</span>, except that the <span class="Attribute">office:value</span> attribute specifies the number of cells for which the condition is true as a percentage)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">bottom values</span> (true for the <span class="Formula">n</span> cells that have the smallest value, where <span class="Formula">n</span> is the value of the <span class="Attribute">office:value</span> attribute)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">empty</span> (<span class="Attribute_20_Value_20_Fragment">true</span> for empty cells)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">!empty</span> (<span class="Attribute_20_Value_20_Fragment">true</span> for non-empty cells)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">top percent</span> (like <span class="Attribute_20_Value_20_Fragment">bottom percent</span>, but for the largest values)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value_20_Fragment">top values</span> (like <span class="Attribute_20_Value_20_Fragment">bottom values</span>, but for the largest values)<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Depending on the value of the <span class="Attribute">table:data-type</span> attribute, all operations take place on string or numeric values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:operator</span> attribute is usable with the following element: <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:operator</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_685table_order"><span style="margin-right:0.127cm;">19.685</span></a><a id="__RefHeading__1418548_253892949"/><a id="attribute-table_order"/>table:order</h2><p class="Text_20_body">The <span class="Attribute">table:order</span> attribute specifies a sort order should be in ascending or descending order.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:order</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ascending</span>: sorting of values should be in ascending order.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">d</span><span class="Attribute_20_Value">escending</span>: sorting of values should be in descending order.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note</span>: Sorting is locale and implementation-dependent.</p><p class="Default_20_Value_borderStart">For <span class="Element">&lt;table:sort-by&gt;</span> <a href="#element-table_sort-by">9.4.20</a> and <span class="Element">&lt;table:sort-groups&gt;</span> <a href="#element-table_sort-groups">9.4.22</a> elements the default value for this attribute is <span class="Attribute_20_Value">ascending</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:order</span> attribute is usable with the following elements: <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> <a href="#element-table_data-pilot-sort-info">9.6.14</a>, <span class="Element">&lt;table:sort-by&gt;</span> <a href="#element-table_sort-by">9.4.20</a> and <span class="Element">&lt;table:sort-groups&gt;</span> <a href="#element-table_sort-groups">9.4.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:order</span> attribute are <span class="Attribute_20_Value">ascending</span> or <span class="Attribute_20_Value">descending</span>.</p><h2 class="Heading_20_2"><a id="a19_686table_orientation"><span style="margin-right:0.127cm;">19.686</span></a><a id="__RefHeading__1418550_253892949"/><a id="attribute-table_orientation"/>table:orientation</h2><h3 class="Heading_20_3"><a id="a19_686_1General"><span style="margin-right:0.127cm;">19.686.1</span></a><a id="__RefHeading__1418552_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:orientation</span> attribute specifies the sorting of tables.</p><h3 class="Heading_20_3"><a id="a19_686_2_table_data-pilot-field_"><span style="margin-right:0.127cm;">19.686.2</span></a><a id="__RefHeading__1418554_253892949"/><a id="attribute-table_orientation_element-table_data-pilot-field"/>&lt;table:data-pilot-field&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:orientation</span> attribute specifies the orientation of a source field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:orientation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: field specifies a category column<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">data</span>: field specifies a data column<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hidden</span>: field has a corresponding column in a data pilot's source but are not visible in the data pilot table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">page</span>: specifies that an automatic filter (one that allows to choose one of the values that are contained in the column) should be generated for the corresponding column. In that case, an additional field with row, column or data orientation shall exist for the column. The <span class="Attribute">table:selected-page</span> attribute specifies which value is selected for the filter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">row</span>: specifies a category column<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:orientation</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:orientation</span> attribute are <span class="Attribute_20_Value">row</span>, <span class="Attribute_20_Value">column</span>, <span class="Attribute_20_Value">data</span>, <span class="Attribute_20_Value">hidden</span> or <span class="Attribute_20_Value">page</span>.</p><h3 class="Heading_20_3"><a id="a19_686_3_table_database-range_"><span style="margin-right:0.127cm;">19.686.3</span></a><a id="__RefHeading__1418556_253892949"/><a id="attribute-table_orientation_element-table_database-range"/>&lt;table:database-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:orientation</span> attribute specifies whether data fields are organized in row or columns.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:orientation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: organization is by columns<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">row</span>: organization is by rows<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a> element the default value for this attribute is <span class="Attribute_20_Value">row</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:orientation</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:orientation</span> attribute are <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">row</span>.</p><h3 class="Heading_20_3"><a id="a19_686_4_table_label-range_"><span style="margin-right:0.127cm;">19.686.4</span></a><a id="__RefHeading__1418558_253892949"/><a id="attribute-table_orientation_element-table_label-range"/>&lt;table:label-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:orientation</span> attribute specifies whether labels label rows or columns. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:orientation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: label range oriented by column<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">row</span>: label range oriented by row<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:orientation</span> attribute is usable with the following element: <span class="Element">&lt;table:label-range&gt;</span> <a href="#element-table_label-range">9.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:orientation</span> attribute are <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">row</span>.</p><h2 class="Heading_20_2"><a id="a19_687table_page-breaks-on-group-change"><span style="margin-right:0.127cm;">19.687</span></a><a id="__RefHeading__1418560_253892949"/><a id="attribute-table_page-breaks-on-group-change"/>table:page-breaks-on-group-change</h2><p class="Text_20_body">The <span class="Attribute">table:page-breaks-on-group-change</span> attribute specifies whether to insert a page break after the subtotal for each group.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:page-breaks-on-group-change</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: page breaks are not inserted after subtotals for a group.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: page breaks are inserted after subtotals for a group.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:page-breaks-on-group-change</span> attribute is usable with the following element: <span class="Element">&lt;table:subtotal-rules&gt;</span> <a href="#element-table_subtotal-rules">9.4.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:page-breaks-on-group-change</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_688table_paragraph-style-name"><span style="margin-right:0.127cm;">19.688</span></a><a id="__RefHeading__1418562_253892949"/><a id="attribute-table_paragraph-style-name"/>table:paragraph-style-name</h2><p class="Text_20_body">The <span class="Attribute">table:paragraph-style-name</span> attribute specifies the paragraph style which should be applied to the empty paragraphs created in cells for tables created from a template.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:paragraph-style-name</span> attribute is usable with the following elements: <span class="Element">&lt;table:body&gt;</span> <a href="#element-table_body">16.19.6</a>, <span class="Element">&lt;table:even-columns&gt;</span> <a href="#element-table_even-columns">16.19.9</a>, <span class="Element">&lt;table:even-rows&gt;</span> <a href="#element-table_even-rows">16.19.7</a>, <span class="Element">&lt;table:first-column&gt;</span> <a href="#element-table_first-column">16.19.4</a>, <span class="Element">&lt;table:first-row&gt;</span> <a href="#element-table_first-row">16.19.2</a>, <span class="Element">&lt;table:last-column&gt;</span> <a href="#element-table_last-column">16.19.5</a>, <span class="Element">&lt;table:last-row&gt;</span> <a href="#element-table_last-row">16.19.3</a>, <span class="Element">&lt;table:odd-columns&gt;</span> <a href="#element-table_odd-columns">16.19.10</a> and <span class="Element">&lt;table:odd-rows&gt;</span> <a href="#element-table_odd-rows">16.19.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:paragraph-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_689table_parse-sql-statement"><span style="margin-right:0.127cm;">19.689</span></a><a id="__RefHeading__1418564_253892949"/><a id="attribute-table_parse-sql-statement"/>table:parse-sql-statement</h2><p class="Text_20_body">A <span class="Attribute">table:parse-sql-statement</span> attribute specifies whether the consumer will parse SQL statements.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:parse-sql-statement</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumer does not parse SQL statements.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumer parses SQL statements.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:parse-sql-statement</span> attribute is usable with the following element: <span class="Element">&lt;table:database-source-sql&gt;</span> <a href="#element-table_database-source-sql">9.4.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:parse-sql-statement</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_690table_password"><span style="margin-right:0.127cm;">19.690</span></a><a id="__RefHeading__1418566_253892949"/><a id="attribute-table_password"/>table:password</h2><p class="Text_20_body">The <span class="Attribute">table:password</span> attribute specifies the password needed to access the source. It is passed to the service implementation. Its value is implementation-dependent and service specific.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:password</span> attribute is usable with the following element: <span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:password</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_691table_position"><span style="margin-right:0.127cm;">19.691</span></a><a id="__RefHeading__1418568_253892949"/><a id="attribute-table_position"/>table:position</h2><p class="Text_20_body">The <span class="Attribute">table:position</span> attribute specifies the position where an insertion or deletion was made in a table. Depending on the type of insertion or deletion, the value is the number of a row, a column or a table.</p><p class="Text_20_body">If multiple rows or columns get deleted, the <span class="Attribute">table:start-position</span> and <span class="Attribute">table:end-position</span> attributes contain the number of the first (inclusive) and last (exclusive) deleted rows or columns.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:position</span> attribute is usable with the following elements: <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a>, <span class="Element">&lt;table:insertion-cut-off&gt;</span> <a href="#element-table_insertion-cut-off">9.9.11</a> and <span class="Element">&lt;table:movement-cut-off&gt;</span> <a href="#element-table_movement-cut-off">9.9.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_692table_precision-as-shown"><span style="margin-right:0.127cm;">19.692</span></a><a id="__RefHeading__1418570_253892949"/><a id="attribute-table_precision-as-shown"/>table:precision-as-shown</h2><p class="Text_20_body">The <span class="Attribute">table:precision-as-shown</span> attribute specifies whether to perform a calculation using the rounded values displayed in the spreadsheet or using all of the digits in a value. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:precision-as-shown</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: calculations are performed using all of the digits in values, but the result is displayed as a rounded number.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: calculations are performed using the rounded values displayed in the spreadsheet.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:precision-as-shown</span> attribute is usable with the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:precision-as-shown</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_693table_print"><span style="margin-right:0.127cm;">19.693</span></a><a id="__RefHeading__1418572_253892949"/><a id="attribute-table_print"/>table:print</h2><p class="Text_20_body">The <span class="Attribute">table:print</span> attribute specifies if a table will be printed. The <span class="Attribute">table:print</span> attribute value is overridden by the <span class="Attribute">table:display</span> attribute. If the table is not displayed, it will also not be printed.</p><p class="Text_20_body">If a table is printed, the table range printed can be specified by the <span class="Attribute">table:print-ranges</span> attribute. If there is no <span class="Attribute">table:print-ranges</span> attribute or it has no value specified, the non-empty portion of a table will be printed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:print</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table can not be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table can be printed.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:print</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:print</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_694table_print-ranges"><span style="margin-right:0.127cm;">19.694</span></a><a id="__RefHeading__1418574_253892949"/><a id="attribute-table_print-ranges"/>table:print-ranges</h2><p class="Text_20_body">The <span class="Attribute">table:print-ranges</span> attribute specifies print ranges of a table. Print ranges define the cells that will be printed. It contains a list of cell addresses or cell range addresses.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:print-ranges</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:print-ranges</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_695table_protect__deprecated_"><span style="margin-right:0.127cm;">19.695</span></a><a id="__RefHeading__1418576_253892949"/><a id="attribute-table_protect"/>table:protect (deprecated) </h2><p class="Text_20_body">The <span class="Attribute">table:protect</span> attribute specifies whether a table cell is protected. Users can not edit the content of a cell that is marked as protected.</p><p class="Text_20_body">This attribute is deprecated in favor of the <span class="Attribute">table:protected</span> attribute. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:protect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cell is not protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cell is protected.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:protect</span> attribute is usable with the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> and <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:protect</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_696table_protected"><span style="margin-right:0.127cm;">19.696</span></a><a id="__RefHeading__1418578_253892949"/><a id="attribute-table_protected"/>table:protected</h2><h3 class="Heading_20_3"><a id="a19_696_1General"><span style="margin-right:0.127cm;">19.696.1</span></a><a id="__RefHeading__1418580_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:protected</span> attribute specifies protection for tables.</p><h3 class="Heading_20_3"><a id="a19_696_2_table_covered-table-cell_"><span style="margin-right:0.127cm;">19.696.2</span></a><a id="__RefHeading__1418582_253892949"/><a id="DDE_LINK17"/><a id="line-2411"/><a id="line-2511"/><a id="line-261"/><a id="line-271"/><a id="attribute-table_protected_element-table_covered-table-cell"/>&lt;table:covered-table-cell&gt; </h3><p class="Text_20_body">The <span class="Attribute">table:protected</span> attribute specifies whether a table cell is protected. Users can not edit the content of a cell that is marked as protected. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:protected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cell is not protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="line-291"/><a id="line-281"/><span class="Attribute_20_Value">true</span>: cell is protected.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a> element the default value for this attribute is <span class="Attribute_20_Value">false</span>. <a id="line-3111"/><a id="line-3011"/></p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:protected</span> attribute is usable with the following element: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h3 class="Heading_20_3"><a id="a19_696_3_table_scenario_"><span style="margin-right:0.127cm;">19.696.3</span></a><a id="__RefHeading__1418584_253892949"/><a id="attribute-table_protected_element-table_scenario"/>&lt;table:scenario&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:protected</span> attribute specifies specifies whether the data that is displayed within the scenario is protected from being edited. The attribute is only evaluated if the table on which the scenario displayed is also protected. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:protected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data is not protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data is protected.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:protected</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h3 class="Heading_20_3"><a id="a19_696_4_table_table_"><span style="margin-right:0.127cm;">19.696.4</span></a><a id="__RefHeading__1418586_253892949"/><a id="attribute-table_protected_element-table_table"/>&lt;table:table&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:protected</span> attribute specifies whether a table is protected from editing. If the table is protected, the <span class="Attribute">table:protection-key</span> attribute can specify an authorization requirement for resetting the protection to enable editing. <a href="#attribute-table_protection-key">19.697</a> For a protected table, the protection of table cells may be controlled individually by the <span class="Attribute">style:cell-protect</span> attribute. <a href="#property-style_cell-protect">20.246</a> Table cells are protected only if they have a table cell style assigned whose <span class="Attribute">style:cell-protect</span> attribute value is different than <span class="Attribute_20_Value">none</span>. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:protected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table is not protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table is protected.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:protected</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List">The <span class="Attribute">table:protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><p class="Default_20_Value_borderEnd">For a <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a> element the default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><h3 class="Heading_20_3"><a id="a19_696_5_table_table-cell_"><span style="margin-right:0.127cm;">19.696.5</span></a><a id="__RefHeading__1418588_253892949"/><a id="attribute-table_protected_element-table_table-cell"/><a id="line-241"/><a id="line-251"/><a id="line-26"/><a id="line-27"/>&lt;table:table-cell&gt; </h3><p class="Text_20_body">The <span class="Attribute">table:protected</span> attribute specifies whether a table cell is protected. Users can not edit the content of a cell that is marked as protected. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:protected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cell is not protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="line-29"/><a id="line-28"/><span class="Attribute_20_Value">true</span>: cell is protected.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a> element the default value for this attribute is <span class="Attribute_20_Value">false</span>. <a id="line-311"/><a id="line-301"/></p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:protected</span> attribute is usable with the following element: <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_697table_protection-key"><span style="margin-right:0.127cm;">19.697</span></a><a id="__RefHeading__1418590_253892949"/><a id="attribute-table_protection-key"/>table:protection-key</h2><p class="Text_20_body">The <span class="Attribute">table:protection-key</span> attribute, when present, specifies that an authorization is required for removing the protection of a table, table cell or scenario. The authentication procedure is identified by the <span class="Attribute">table:protection-key-digest-algorithm</span> attribute. <a href="#attribute-table_protection-key-digest-algorithm">19.698</a> The attribute value is binary data that may be used by the authentication procedure.</p><p class="Text_20_body">The password shall be provided as a sequence of bytes in UTF-8 encoding. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:protection-key</span> attribute is usable with the following elements: <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:protection-key</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_698table_protection-key-digest-algorithm"><span style="margin-right:0.127cm;">19.698</span></a><a id="__RefHeading__1418592_253892949"/><a id="attribute-table_protection-key-digest-algorithm"/>table:protection-key-digest-algorithm</h2><p class="Text_20_body">The <span class="Attribute">table:protection-key-digest-algorithm</span> attribute value is an IRI that identifies an authentication procedure for removing a protection.</p><p class="Text_20_body">If the IRI identifies a message-digest algorithm specified in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a>, the value of <span class="Attribute">table:protection-key</span> attribute shall be the hash value of the password that is required to authorize removal of the protection. The password shall be provided as a sequence of bytes in UTF-8 encoding. </p><p class="Text_20_body">Any other procedures, their identifying IRIs, and their application of <span class="Attribute">table:protection-key</span> values are implementation-defined.</p><p class="Text_20_body">Consumers shall support http://www.w3.org/2000/09/xmldsig#sha1<a href="http://www.w3.org/2000/09/xmldsig#sha1,">,</a> which is the default, and http://www.w3.org/2000/09/xmldsig#sha256. They may support other algorithms described in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a> or alternative procedures. Producers should use http://www.w3.org/2000/09/xmldsig#sha256. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">http://www.w3.org/2000/09/xmldsig#sha1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:protection-key-digest-algorithm</span> attribute is usable with the following elements: <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a> and <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:protection-key-digest-algorithm</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h2 class="Heading_20_2"><a id="a19_699table_query-name"><span style="margin-right:0.127cm;">19.699</span></a><a id="__RefHeading__1418594_253892949"/><a id="attribute-table_query-name"/>table:query-name</h2><p class="Text_20_body">A <span class="Attribute">table:query-name</span> attribute specifies a query to perform on a database whose data is being imported.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:query-name</span> attribute is usable with the following element: <span class="Element">&lt;table:database-source-query&gt;</span> <a href="#element-table_database-source-query">9.4.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:query-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_700table_range-usable-as"><span style="margin-right:0.127cm;">19.700</span></a><a id="__RefHeading__1418596_253892949"/><a id="attribute-table_range-usable-as"/>table:range-usable-as</h2><p class="Text_20_body">The <span class="Attribute">table:range-usable-as</span> attribute specifies whether the name of the range can be used within the specification of a print range, a filter, a repeating row, or a repeat column. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:range-usable-as</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a white space-separated list that consists of any of the values <span class="Attribute_20_Value">print-range</span>, <span class="Attribute_20_Value">filter</span>, <span class="Attribute_20_Value">repeat-row</span> or <span class="Attribute_20_Value">repeat-column</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:range-usable-as</span> attribute is usable with the following element: <span class="Element">&lt;table:named-range&gt;</span> <a href="#element-table_named-range">9.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:range-usable-as</span> attribute are <span class="Attribute_20_Value">none</span>, or white space separated non-empty lists of one of these values: <span class="Attribute_20_Value">print-range</span>, <span class="Attribute_20_Value">filter</span>, <span class="Attribute_20_Value">repeat-row</span>, or <span class="Attribute_20_Value">repeat-column</span>..</p><h2 class="Heading_20_2"><a id="a19_701table_refresh-delay"><span style="margin-right:0.127cm;">19.701</span></a><a id="__RefHeading__1418598_253892949"/><a id="attribute-table_refresh-delay"/>table:refresh-delay</h2><p class="Text_20_body">The <span class="Attribute">table:refresh-delay</span> attribute specifies a time delay between automatic refresh actions.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:refresh-delay</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a> and <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:refresh-delay</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_702table_rejecting-change-id"><span style="margin-right:0.127cm;">19.702</span></a><a id="__RefHeading__1418600_253892949"/><a id="attribute-table_rejecting-change-id"/>table:rejecting-change-id</h2><p class="Text_20_body">The <span class="Attribute">table:rejecting-change-id</span> attribute specifies the id of a previously tracked change that has been rejected. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:rejecting-change-id</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-content-change&gt;</span> <a href="#element-table_cell-content-change">9.9.17</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a> and <span class="Element">&lt;table:movement&gt;</span> <a href="#element-table_movement">9.9.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:rejecting-change-id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_703table_rfc-language-tag"><span style="margin-right:0.127cm;">19.703</span></a><a id="__RefHeading__1418602_253892949"/><a id="attribute-table_rfc-language-tag"/>table:rfc-language-tag</h2><p class="Text_20_body">The <span class="Attribute">table:rfc-language-tag</span> attribute specifies a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">It shall only be used if its value can not be expressed as a valid combination of the <span class="Attribute">table:language</span>, <span class="Attribute">table:script</span> and <span class="Attribute">table:country</span> attributes.</p><p class="Text_20_body">Producers may add support for consumers that don't support the <span class="Attribute">table:rfc-language-tag</span> attribute by specifying <span class="Attribute">table:language</span>, <span class="Attribute">table:script</span> and <span class="Attribute">table:country</span> attributes with values that are implementation-dependent. </p><p class="Text_20_body">The <span class="Attribute">table:rfc-language-tag</span> attribute augments the <span class="Attribute">table:language</span>, <span class="Attribute">table:script</span> and <span class="Attribute">table:country</span> attributes. It shall only be used if its value could not be expressed as a valid combination of those. The value shall be a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors. If a fall-back is provided for consumers that do not support the <span class="Attribute">table:rfc-language-tag</span> attribute, producers should add <span class="Attribute">table:language</span>, <span class="Attribute">table:script</span> and <span class="Attribute">table:country</span> attributes whose values are as close as possible to the value of the <span class="Attribute">table:rfc-language-tag</span> attribute. Producers shall not use values for these attributes that contradict the value of the <span class="Attribute">table:rfc-language-tag</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:rfc-language-tag</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:rfc-language-tag</span> attribute has the data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h2 class="Heading_20_2"><a id="a19_704table_row"><span style="margin-right:0.127cm;">19.704</span></a><a id="__RefHeading__1418604_253892949"/><a id="attribute-table_row"/>table:row</h2><p class="Text_20_body">The <span class="Attribute">table:row</span> attribute specifies the row number of a cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:row</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-address&gt;</span> <a href="#element-table_cell-address">9.9.18</a>, <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:row</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_705table_scenario-ranges"><span style="margin-right:0.127cm;">19.705</span></a><a id="__RefHeading__1418606_253892949"/><a id="attribute-table_scenario-ranges"/>table:scenario-ranges</h2><p class="Text_20_body">The <span class="Attribute">table:scenario-ranges</span> attribute specifies the table range that is displayed as a scenario. The value of this attribute is a white space separated list of cell range addresses.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:scenario-ranges</span> attribute is usable with the following element: <span class="Element">&lt;table:scenario&gt;</span> <a href="#element-table_scenario">9.2.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:scenario-ranges</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_706table_script"><span style="margin-right:0.127cm;">19.706</span></a><a id="__RefHeading__1418608_253892949"/><a id="attribute-table_script"/>table:script</h2><p class="Text_20_body">The <span class="Attribute">table:script</span> attribute specifies the script information for the natural language in which comparisons will occur. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:script</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:script</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h2 class="Heading_20_2"><a id="a19_707table_search-criteria-must-apply-to-whole-cell"><span style="margin-right:0.127cm;">19.707</span></a><a id="__RefHeading__1418610_253892949"/><a id="attribute-table_search-criteria-must-apply-to-whole-cell"/>table:search-criteria-must-apply-to-whole-cell</h2><p class="Text_20_body">The <span class="Attribute">table:search-criteria-must-apply-to-whole-cell</span> attribute specifies whether a search pattern matches the entire content of a cell.</p><p class="Note"><span class="Note_20_Label">Note:</span> The <span class="Attribute">table:search-criteria-must-apply-to-whole-cell</span> is used with the <span class="Element">&lt;table:filter-condition&gt;</span> element when the <span class="Attribute">table:data-type</span> attribute has the value <span class="Attribute_20_Value">text</span> and the <span class="Attribute">table:operator</span> attribute has a value of: <span class="Attribute_20_Value_20_Fragment">match</span>, <span class="Attribute_20_Value_20_Fragment">!match</span>, <span class="Attribute_20_Value_20_Fragment">=</span>, or <span class="Attribute_20_Value_20_Fragment">!=</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:search-criteria-must-apply-to-whole-cell</span> are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: search pattern can match a substring at any position within a cell. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: search pattern must match entire content of a cell. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:search-criteria-must-apply-to-whole-cell</span> attribute is usable with the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:search-criteria-must-apply-to-whole-cell</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_708table_selected-page"><span style="margin-right:0.127cm;">19.708</span></a><a id="__RefHeading__1418612_253892949"/><a id="attribute-table_selected-page"/>table:selected-page</h2><p class="Text_20_body">The <span class="Attribute">table:selected-page</span> attribute specifies which value is selected for an automatic filter.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:selected-page</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:selected-page</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_709table_show-details"><span style="margin-right:0.127cm;">19.709</span></a><a id="__RefHeading__1418614_253892949"/><a id="attribute-table_show-details"/>table:show-details</h2><p class="Text_20_body">The <span class="Attribute">table:show-details</span> attribute specifies whether additional fields are displayed for a member. This attribute changes the behavior of a data pilot only if there are multiple fields with the orientation row or column.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:show-details</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: field with a row or column orientation that is not the last field with this orientation, no members are displayed for following fields with the same orientation. Data displayed for these fields is summarized using a function specified by the data pilot's function attribute. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: field with a row or column orientation that is not the last field with this orientation, members are displayed for following fields with the same orientation.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:show-details</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-member&gt;</span> <a href="#element-table_data-pilot-member">9.6.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:show-details</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_710table_show-empty"><span style="margin-right:0.127cm;">19.710</span></a><a id="__RefHeading__1418616_253892949"/><a id="attribute-table_show-empty"/>table:show-empty</h2><p class="Text_20_body">The <span class="Attribute">table:show-empty</span> attribute specifies whether fields that do not have any members should be displayed. If this attribute is not present, it is implementation-defined whether fields without members are displayed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:show-details</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: fields without members are not displayed. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: fields without members are displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:show-empty</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-level&gt;</span> <a href="#element-table_data-pilot-level">9.6.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:show-empty</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_711table_show-filter-button"><span style="margin-right:0.127cm;">19.711</span></a><a id="__RefHeading__1418618_253892949"/><a id="attribute-table_show-filter-button"/>table:show-filter-button</h2><p class="Text_20_body">The <span class="Attribute">table:show-filter-button</span> attribute specifies whether a filter button is shown in the UI for a data pilot table. A filter button displays a user interface for a filter if pushed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:show-filter-button</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: filter button is not shown in UI. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: filter button is shown in UI.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:show-filter-button</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:show-filter-button</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_712table_sort-mode"><span style="margin-right:0.127cm;">19.712</span></a><a id="__RefHeading__1418620_253892949"/><a id="attribute-table_sort-mode"/>table:sort-mode</h2><p class="Text_20_body">The <span class="Attribute">table:sort-mode</span> attribute specifies how to sort the members of a single data pilot field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:sort-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">data</span>: fields are sorted by values in the data field specified by a <span class="Attribute">table:data-field</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">manual</span>: fields are sorted by a user<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name</span>: fields are sorted by name of the field<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: fields are not sorted.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:sort-mode</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-sort-info&gt;</span> <a href="#element-table_data-pilot-sort-info">9.6.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:sort-mode</span> attribute are <span class="Attribute_20_Value">data</span>, <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">manual</span> or <span class="Attribute_20_Value">name</span>.</p><h2 class="Heading_20_2"><a id="a19_713table_source-cell-range-addresses"><span style="margin-right:0.127cm;">19.713</span></a><a id="__RefHeading__1418622_253892949"/><a id="attribute-table_source-cell-range-addresses"/>table:source-cell-range-addresses</h2><p class="Text_20_body">The <span class="Attribute">table:source-cell-range-addresses</span> attribute specifies source cell ranges.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:source-cell-range-addresses</span> attribute is usable with the following element: <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:source-cell-range-addresses</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a19_714table_source-field-name"><span style="margin-right:0.127cm;">19.714</span></a><a id="__RefHeading__1418624_253892949"/><a id="attribute-table_source-field-name"/>table:source-field-name</h2><p class="Text_20_body">The <span class="Attribute">table:source-field-name</span> attribute specifies the name or label of a column that connects to a field.</p><p class="Text_20_body">There can be multiple <span class="Element">&lt;table:data-pilot-field&gt;</span> elements with the same value for this attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:source-field-name</span> attribute is usable with the following elements: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a> and <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:source-field-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_715table_source-name"><span style="margin-right:0.127cm;">19.715</span></a><a id="__RefHeading__1418626_253892949"/><a id="attribute-table_source-name"/>table:source-name</h2><p class="Text_20_body">The <span class="Attribute">table:source-name</span> attribute specifies a source name that is passed to the service implementation. Its value is implementation-dependent and service specific.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:source-name</span> attribute is usable with the following element: <span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:source-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_716table_sql-statement"><span style="margin-right:0.127cm;">19.716</span></a><a id="__RefHeading__1418628_253892949"/><a id="attribute-table_sql-statement"/>table:sql-statement</h2><p class="Text_20_body">An <span class="Attribute">table:sql-statement</span> attribute specifies the SQL statement to use when importing data from an SQL database.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:sql-statement</span> attribute is usable with the following element: <span class="Element">&lt;table:database-source-sql&gt;</span> <a href="#element-table_database-source-sql">9.4.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:sql-statement</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_717table_start"><span style="margin-right:0.127cm;">19.717</span></a><a id="__RefHeading__1418630_253892949"/><a id="attribute-table_start"/>table:start</h2><p class="Text_20_body">The <span class="Attribute">table:start</span> attribute specifies the start value for a grouping of numeric values. All values that are lower than the start value are contained in a single group, while values that are equal to or higher than the start value are grouped as specified by the <span class="Attribute">table:grouped-by</span> and <span class="Attribute">table:step</span> attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:start</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the lowest value of the field is used as the start value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">double</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:start</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:start</span> attribute are a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a> or <span class="Attribute_20_Value">auto</span>.</p><h2 class="Heading_20_2"><a id="a19_718table_start-column"><span style="margin-right:0.127cm;">19.718</span></a><a id="__RefHeading__1418632_253892949"/><a id="attribute-table_start-column"/>table:start-column</h2><p class="Text_20_body">The <span class="Attribute">table:start-column</span> attribute specifies the start-column for a cell range address. The value of a <span class="Attribute">table:start-column</span> attribute is inclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:start-column</span> attribute is usable with the following elements: <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:start-column</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_719table_start-position"><span style="margin-right:0.127cm;">19.719</span></a><a id="__RefHeading__1418634_253892949"/><a id="attribute-table_start-position"/>table:start-position</h2><p class="Text_20_body">The <span class="Attribute">table:start-position</span> attribute specifies the number of the first deleted row or column if multiple rows or columns are deleted. The value of a <span class="Attribute">table:start-position</span> attribute is inclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:start-position</span> attribute is usable with the following element: <span class="Element">&lt;table:movement-cut-off&gt;</span> <a href="#element-table_movement-cut-off">9.9.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:start-position</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_720table_start-row"><span style="margin-right:0.127cm;">19.720</span></a><a id="__RefHeading__1418636_253892949"/><a id="attribute-table_start-row"/>table:start-row</h2><p class="Text_20_body">The <span class="Attribute">table:start-row</span> attribute specifies the start-row for a cell range address. The value of a <span class="Attribute">table:start-row</span> attribute is inclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:start-row</span> attribute is usable with the following elements: <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:start-row</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_721table_start-table"><span style="margin-right:0.127cm;">19.721</span></a><a id="__RefHeading__1418638_253892949"/><a id="attribute-table_start-table"/>table:start-table</h2><p class="Text_20_body">The <span class="Attribute">table:start-table</span> attribute specifies the start-table for a cell range address. The value of a <span class="Attribute">table:start-table</span> attribute is inclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:start-table</span> attribute is usable with the following elements: <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:start-table</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_722table_status"><span style="margin-right:0.127cm;">19.722</span></a><a id="__RefHeading__1418640_253892949"/><a id="attribute-table_status"/>table:status</h2><p class="Text_20_body">The <span class="Attribute">table:status</span> attribute specifies whether iterative calculations are enabled.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:status</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">enable</span>: iterative calculations will occur.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">disable</span>: iterative calculations will not occur.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">disable</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:status</span> attribute is usable with the following element: <span class="Element">&lt;table:iteration&gt;</span> <a href="#element-table_iteration">9.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:status</span> attribute are <span class="Attribute_20_Value">enable</span> or <span class="Attribute_20_Value">disable</span>.</p><h2 class="Heading_20_2"><a id="a19_723table_step"><span style="margin-right:0.127cm;">19.723</span></a><a id="__RefHeading__1418642_253892949"/><a id="attribute-table_step"/>table:step</h2><p class="Text_20_body">The <span class="Attribute">table:step</span> attribute specifies the grouping of numeric values, by specifying the distance between the groups.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:step</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-groups&gt;</span> <a href="#element-table_data-pilot-groups">9.6.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:step</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_724table_steps"><span style="margin-right:0.127cm;">19.724</span></a><a id="__RefHeading__1418644_253892949"/><a id="attribute-table_steps"/>table:steps</h2><p class="Text_20_body">The <span class="Attribute">table:steps</span> attributes specifies the maximum number of iterative calculations. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">100</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:steps</span> attribute is usable with the following element: <span class="Element">&lt;table:iteration&gt;</span> <a href="#element-table_iteration">9.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:steps</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_725table_structure-protected"><span style="margin-right:0.127cm;">19.725</span></a><a id="__RefHeading__1418646_253892949"/><a id="attribute-table_structure-protected"/>table:structure-protected</h2><p class="Text_20_body">The <span class="Attribute">table:structure-protected</span> attribute specifies whether a table is protected from the insertion, deletion, moving or renaming of tables in the document. If the table structure is protected and the <span class="Attribute">table:protection-key</span> attribute is present, an authorization is required for resetting the protection to enable editing.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:show-details</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table is not protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table is protected.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:structure-protected</span> attribute is usable with the following element: <span class="Element">&lt;office:spreadsheet&gt;</span> <a href="#element-office_spreadsheet">3.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:structure-protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_726table_style-name"><span style="margin-right:0.127cm;">19.726</span></a><a id="__RefHeading__1418648_253892949"/><a id="attribute-table_style-name"/>table:style-name</h2><h3 class="Heading_20_3"><a id="a19_726_1General"><span style="margin-right:0.127cm;">19.726.1</span></a><a id="__RefHeading__1418650_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies styles that are assigned to elements. The style can be either an automatic or common style.</p><h3 class="Heading_20_3"><a id="a19_726_2_table_background_"><span style="margin-right:0.127cm;">19.726.2</span></a><a id="__RefHeading__1418652_253892949"/><a id="attribute-table_style-name_element-table_background"/>&lt;table:background&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element for the table. The style specified by the <span class="Element">&lt;style:style&gt;</span> element is of the table family.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:background&gt;</span> <a href="#element-table_background">16.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_3_table_body_"><span style="margin-right:0.127cm;">19.726.3</span></a><a id="__RefHeading__1418654_253892949"/><a id="attribute-table_style-name_element-table_body"/>&lt;table:body&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:body&gt;</span> <a href="#element-table_body">16.19.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_4_table_covered-table-cell_"><span style="margin-right:0.127cm;">19.726.4</span></a><a id="__RefHeading__1418656_253892949"/><a id="attribute-table_style-name_element-table_covered-table-cell"/>&lt;table:covered-table-cell&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Text_20_body">If a cell does not have a cell style assigned, then the <span class="Attribute">table:default-cell-style-name</span> attribute of the table row specifies the cell style. If that does not exist, the <span class="Attribute">table:default-cell-</span><span class="Attribute">style-name</span> attribute of the table column specifies the cell style. If that does not exist, the default style with family <span class="Attribute_20_Value">table-cell</span> specifies the style for the cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_5_table_even-columns_"><span style="margin-right:0.127cm;">19.726.5</span></a><a id="__RefHeading__1418658_253892949"/><a id="attribute-table_style-name_element-table_even-columns"/>&lt;table:even-columns&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:even-columns&gt;</span> <a href="#element-table_even-columns">16.19.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_6_table_even-rows_"><span style="margin-right:0.127cm;">19.726.6</span></a><a id="__RefHeading__1418660_253892949"/><a id="attribute-table_style-name_element-table_even-rows"/>&lt;table:even-rows&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:even-rows&gt;</span> <a href="#element-table_even-rows">16.19.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_7_table_first-column_"><span style="margin-right:0.127cm;">19.726.7</span></a><a id="__RefHeading__1418662_253892949"/><a id="attribute-table_style-name_element-table_first-column"/>&lt;table:first-column&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:first-column&gt;</span> <a href="#element-table_first-column">16.19.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_8_table_first-row_"><span style="margin-right:0.127cm;">19.726.8</span></a><a id="__RefHeading__1418664_253892949"/><a id="attribute-table_style-name_element-table_first-row"/>&lt;table:first-row&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:first-row&gt;</span> <a href="#element-table_first-row">16.19.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_9_table_last-column_"><span style="margin-right:0.127cm;">19.726.9</span></a><a id="__RefHeading__1418666_253892949"/><a id="attribute-table_style-name_element-table_last-column"/>&lt;table:last-column&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:last-column&gt;</span> <a href="#element-table_last-column">16.19.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_10_table_last-row_"><span style="margin-right:0.127cm;">19.726.10</span></a><a id="__RefHeading__1418668_253892949"/><a id="attribute-table_style-name_element-table_last-row"/>&lt;table:last-row&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:last-row&gt;</span> <a href="#element-table_last-row">16.19.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_11_table_odd-columns_"><span style="margin-right:0.127cm;">19.726.11</span></a><a id="__RefHeading__1418670_253892949"/><a id="attribute-table_style-name_element-table_odd-columns"/>&lt;table:odd-columns&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:odd-columns&gt;</span> <a href="#element-table_odd-columns">16.19.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_12_table_odd-rows_"><span style="margin-right:0.127cm;">19.726.12</span></a><a id="__RefHeading__1418672_253892949"/><a id="attribute-table_style-name_element-table_odd-rows"/>&lt;table:odd-rows&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:odd-rows&gt;</span> <a href="#element-table_odd-rows">16.19.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_13_table_table-cell_"><span style="margin-right:0.127cm;">19.726.13</span></a><a id="__RefHeading__1418674_253892949"/><a id="attribute-table_style-name_element-table_table-cell"/>&lt;table:table-cell&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-cell</span>.</p><p class="Text_20_body">If a cell does not have a cell style assigned, then the <span class="Attribute">table:default-cell-style-name</span> attribute of the table row specifies the cell style. If that does not exist, the <span class="Attribute">table:default-</span><span class="Attribute">cell-style-name</span> attribute of the table column specifies the cell style. If that does not exist, the default style with family table-cell specifies the style for the cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_14_table_table-column_"><span style="margin-right:0.127cm;">19.726.14</span></a><a id="__RefHeading__1418676_253892949"/><a id="attribute-table_style-name_element-table_table-column"/>&lt;table:table-column&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-column</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_15_table_table-row_"><span style="margin-right:0.127cm;">19.726.15</span></a><a id="__RefHeading__1418678_253892949"/><a id="attribute-table_style-name_element-table_table-row"/>&lt;table:table-row&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table-row</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_726_16_table_table_"><span style="margin-right:0.127cm;">19.726.16</span></a><a id="__RefHeading__1418680_253892949"/><a id="attribute-table_style-name_element-table_table"/>&lt;table:table&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:style-name</span> attribute specifies a <span class="Element">&lt;style:style&gt;</span> element of type <span class="Attribute_20_Value">table</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:style-name</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_727table_table"><span style="margin-right:0.127cm;">19.727</span></a><a id="__RefHeading__1418682_253892949"/><a id="attribute-table_table"/>table:table</h2><p class="Text_20_body">The <span class="Attribute">table:table</span> attribute specifies a table number for insertions, deletions and for table cells. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:table</span> attribute is usable with the following elements: <span class="Element">&lt;table:cell-address&gt;</span> <a href="#element-table_cell-address">9.9.18</a>, <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>, <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a>, <span class="Element">&lt;table:source-range-address&gt;</span> <a href="#element-table_source-range-address">9.9.14</a> and <span class="Element">&lt;table:target-range-address&gt;</span> <a href="#element-table_target-range-address">9.9.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:table</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_728table_table-background"><span style="margin-right:0.127cm;">19.728</span></a><a id="__RefHeading__1418684_253892949"/><a id="attribute-table_table-background"/>table:table-background</h2><p class="Text_20_body">The <span class="Attribute">table:table-background</span> attribute specifies whether a shape is in the table background if the drawing shape is included in a spreadsheet document. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:show-details</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: shape is included in foreground of a table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: shape is included in background of a table.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:table-background</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:table-background</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_729table_table-name"><span style="margin-right:0.127cm;">19.729</span></a><a id="__RefHeading__1418686_253892949"/><a id="attribute-table_table-name"/>table:table-name</h2><p class="Text_20_body">The <span class="Attribute">table:table-name</span> attribute specifies the name of the table in the source document to which the current table is linked. If the attribute is omitted, the current table is linked to the first table in the source document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:table-name</span> attribute is usable with the following element: <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:table-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_730table_target-cell-address"><span style="margin-right:0.127cm;">19.730</span></a><a id="__RefHeading__1418688_253892949"/><a id="attribute-table_target-cell-address"/>table:target-cell-address</h2><p class="Text_20_body">The <span class="Attribute">table:target-cell-address</span> attribute specifies a target cell address.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:target-cell-address</span> attribute is usable with the following element: <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:target-cell-address</span> attribute has the data type <span class="Datatype">cellAddress</span> <a href="#datatype-cellAddress">18.3.4</a>.</p><h2 class="Heading_20_2"><a id="a19_731table_target-range-address"><span style="margin-right:0.127cm;">19.731</span></a><a id="__RefHeading__1418690_253892949"/><a id="attribute-table_target-range-address"/>table:target-range-address</h2><h3 class="Heading_20_3"><a id="a19_731_1General"><span style="margin-right:0.127cm;">19.731.1</span></a><a id="__RefHeading__1418692_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:target-range-address</span> attribute specifies a cell range address. The value of this attribute shall be an absolute cell address that contains a table name. The dollar signs “$” (U+0024, DOLLAR SIGN) that indicate an absolute address may be omitted.</p><h3 class="Heading_20_3"><a id="a19_731_2_table_data-pilot-table_"><span style="margin-right:0.127cm;">19.731.2</span></a><a id="__RefHeading__1418694_253892949"/><a id="attribute-table_target-range-address_element-table_data-pilot-table"/>&lt;table:data-pilot-table&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:target-range-address</span> attribute specifies the cell range where a data pilot table will be displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:target-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-table&gt;</span> <a href="#element-table_data-pilot-table">9.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:target-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h3 class="Heading_20_3"><a id="a19_731_3_table_database-range_"><span style="margin-right:0.127cm;">19.731.3</span></a><a id="__RefHeading__1418696_253892949"/><a id="attribute-table_target-range-address_element-table_database-range"/>&lt;table:database-range&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:target-range-address</span> attribute specifies the cell range address of a database range.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:target-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:database-range&gt;</span> <a href="#element-table_database-range">9.4.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:target-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h3 class="Heading_20_3"><a id="a19_731_4_table_filter_"><span style="margin-right:0.127cm;">19.731.4</span></a><a id="__RefHeading__1418698_253892949"/><a id="attribute-table_target-range-address_element-table_filter"/>&lt;table:filter&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:target-range-address</span> attribute specifies the cell range for the result of a filter operation, but all table rows remain visible. If the attribute is not present, the rows that do not match the filter conditions are not displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:target-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:filter&gt;</span> <a href="#element-table_filter">9.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:target-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h3 class="Heading_20_3"><a id="a19_731_5_table_sort_"><span style="margin-right:0.127cm;">19.731.5</span></a><a id="__RefHeading__1418700_253892949"/><a id="attribute-table_target-range-address_element-table_sort"/>&lt;table:sort&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:target-range-address</span> attribute specifies the cell range for the result of a sort operation. If the attribute is not present, the cell range for the result is identical to the cell range of the database range. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:target-range-address</span> attribute is usable with the following element: <span class="Element">&lt;table:sort&gt;</span> <a href="#element-table_sort">9.4.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:target-range-address</span> attribute has the data type <span class="Datatype">cellRangeAddress</span> <a href="#datatype-cellRangeAddress">18.3.5</a>.</p><h2 class="Heading_20_2"><a id="a19_732table_template-name"><span style="margin-right:0.127cm;">19.732</span></a><a id="__RefHeading__1418702_253892949"/><a id="attribute-table_template-name"/>table:template-name</h2><p class="Text_20_body">The <span class="Attribute">table:template-name</span> attribute specifies a table template by name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:template-name</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:template-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_733table_title"><span style="margin-right:0.127cm;">19.733</span></a><a id="__RefHeading__1418704_253892949"/><a id="attribute-table_title"/>table:title</h2><p class="Text_20_body">The <span class="Attribute">table:title</span> attribute that specifies a title of a help or error message.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:title</span> attribute is usable with the following elements: <span class="Element">&lt;table:error-message&gt;</span> <a href="#element-table_error-message">9.4.7</a> and <span class="Element">&lt;table:help-message&gt;</span> <a href="#element-table_help-message">9.4.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_734table_track-changes"><span style="margin-right:0.127cm;">19.734</span></a><a id="__RefHeading__1418706_253892949"/><a id="attribute-table_track-changes"/>table:track-changes</h2><p class="Text_20_body">The <span class="Attribute">table:track-changes</span> attribute specifies whether change tracking is enabled.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:track-changes</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: changes are not tracked.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: changes are tracked.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:track-changes</span> attribute is usable with the following element: <span class="Element">&lt;table:tracked-changes&gt;</span> <a href="#element-table_tracked-changes">9.9.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:track-changes</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_735table_type"><span style="margin-right:0.127cm;">19.735</span></a><a id="__RefHeading__1418708_253892949"/><a id="attribute-table_type"/>table:type</h2><h3 class="Heading_20_3"><a id="a19_735_1General"><span style="margin-right:0.127cm;">19.735.1</span></a><a id="__RefHeading__1418710_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">table:type</span> attribute specifies a type for a table. </p><h3 class="Heading_20_3"><a id="a19_735_2_table_data-pilot-field-reference_"><span style="margin-right:0.127cm;">19.735.2</span></a><a id="__RefHeading__1418712_253892949"/><a id="attribute-table_type_element-table_data-pilot-field-reference"/>&lt;table:data-pilot-field-reference&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:type</span> attribute specifies the processing of a referenced category column for display.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column-percentage</span>: Same as <span class="Attribute_20_Value">row-percentage</span>, but the total for the result's column is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">index</span>: The row and column totals and the grand total are calculated as described for <span class="Attribute_20_Value">row-percentage</span>, and then are used to calculate the following expression: (original result * grand total ) / ( row total * column total ). Division by zero results in an error.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">member-difference</span>: From each result, the value calculated for the category column member specified by the <span class="Attribute">table:member-type</span> and <span class="Attribute">table:member-name</span> attributes is subtracted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">member-percentage</span>: Each result is divided by the value calculated for the category column member specified by the <span class="Attribute">table:member-type</span> and <span class="Attribute">table:member-name</span> attributes. Division by zero results in an error. Empty results are shown as “0”. If the <span class="Attribute">table:member-</span><span class="Attribute">type</span> attribute has the value <span class="Attribute_20_Value">previous</span>, “1” is displayed as first value. If the <span class="Attribute">table:member-type</span> attribute has the value <span class="Attribute_20_Value">next</span>, “1” is displayed as last value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">member-percentage-difference</span>: From each result, the value calculated for the category column member specified by the <span class="Attribute">table:member-type</span> and <span class="Attribute">table:member-</span><span class="Attribute">name</span> attributes is subtracted, and the result is divided by this value again. Division by zero results in an error. Otherwise, the rules for <span class="Attribute_20_Value">member-difference</span> apply.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: This value means that the results in the data fields are displayed unmodified.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">row-percentage</span>: Each result is divided by the total result for its row in the data pilot table. If there are multiple data fields, the total for the result's data field is used. If there are subtotals with manually selected summary functions, the total is calculated with the data field's summary function. Division by zero results in an error.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">running-total</span>: Each result is added to the sum of the results for preceding members in the referenced category column, in the reference field's sort order, and the total sum is shown.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">total-percentage</span>: Same as <span class="Attribute_20_Value">row-percentage</span>, but the grand total for the result's data field is used.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:type</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field-reference&gt;</span> <a href="#element-table_data-pilot-field-reference">9.6.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">member-difference</span>, <span class="Attribute_20_Value">member-percentage</span>, <span class="Attribute_20_Value">member-percentage-difference</span>, <span class="Attribute_20_Value">running-total</span>, <span class="Attribute_20_Value">row-percentage</span>, <span class="Attribute_20_Value">column-percentage</span>, <span class="Attribute_20_Value">total-percentage</span> or <span class="Attribute_20_Value">index</span>.</p><h3 class="Heading_20_3"><a id="a19_735_3_table_deletion_"><span style="margin-right:0.127cm;">19.735.3</span></a><a id="__RefHeading__1418714_253892949"/><a id="attribute-table_type_element-table_deletion"/>&lt;table:deletion&gt; </h3><p class="Text_20_body">The <span class="Attribute">table:type</span> attribute specifies the type of a deletion. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: column deleted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: row deleted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able</span>: table deleted.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:type</span> attribute is usable with the following element: <span class="Element">&lt;table:deletion&gt;</span> <a href="#element-table_deletion">9.9.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:type</span> attribute are <span class="Attribute_20_Value">row</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">table</span>.</p><h3 class="Heading_20_3"><a id="a19_735_4_table_insertion_"><span style="margin-right:0.127cm;">19.735.4</span></a><a id="__RefHeading__1418716_253892949"/><a id="attribute-table_type_element-table_insertion"/>&lt;table:insertion&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:type</span> attribute specifies the type of an insertion. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">column</span>: column inserted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: row inserted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able</span>: table inserted.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:type</span> attribute is usable with the following element: <span class="Element">&lt;table:insertion&gt;</span> <a href="#element-table_insertion">9.9.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:type</span> attribute are <span class="Attribute_20_Value">row</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">table</span>.</p><h2 class="Heading_20_2"><a id="a19_736table_use-banding-columns-styles"><span style="margin-right:0.127cm;">19.736</span></a><a id="__RefHeading__1418718_253892949"/><a id="attribute-table_use-banding-columns-styles"/>table:use-banding-columns-styles</h2><p class="Text_20_body">The <span class="Attribute">table:use-banding-columns-styles</span> attribute specifies if the styles referenced by the <span class="Element">&lt;table:even-columns&gt;</span> and <span class="Element">&lt;table:odd-columns&gt;</span> elements of a table template referenced by the <span class="Attribute">table:template-name</span> attribute are used for cells that are contained in even and odd columns.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-banding-columns-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells are not styled based on even or odd column location.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells are styled based on even or odd column location.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-banding-columns-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-banding-columns-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_737table_use-banding-rows-styles"><span style="margin-right:0.127cm;">19.737</span></a><a id="__RefHeading__1418720_253892949"/><a id="attribute-table_use-banding-rows-styles"/>table:use-banding-rows-styles</h2><p class="Text_20_body">The <span class="Attribute">table:use-banding-rows-styles</span> attribute specifies if the styles referenced by the <span class="Element">&lt;table:even-rows&gt;</span> and <span class="Element">&lt;table:odd-rows&gt;</span> elements of a table template referenced by the table:template-name attribute are used for cells that are contained in even and odd rows.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-banding-rows-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells not styled based on even or odd row location.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells styled based on even or odd row location.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-banding-rows-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-banding-rows-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_738table_use-first-column-styles"><span style="margin-right:0.127cm;">19.738</span></a><a id="__RefHeading__1418722_253892949"/><a id="attribute-table_use-first-column-styles"/>table:use-first-column-styles</h2><p class="Text_20_body">The <span class="Attribute">table:use-first-column-styles</span> attribute specifies if the styles referenced by the <span class="Element">&lt;table:first-column&gt;</span> element of the table template referenced by the <span class="Attribute">table:template-name</span> attribute are used for cells that are contained in the table's first column. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-first-column-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells not styled based on first column location.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells styled based on first column location.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-first-column-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-first-column-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_739table_use-first-row-styles"><span style="margin-right:0.127cm;">19.739</span></a><a id="__RefHeading__1418724_253892949"/><a id="attribute-table_use-first-row-styles"/>table:use-first-row-styles</h2><p class="Text_20_body">The <span class="Attribute">table:use-first-row-styles</span> attribute specifies if the styles referenced by the <span class="Element">&lt;table:first-row&gt;</span> element of the table template referenced by the <span class="Attribute">table:template-name</span> attribute are used for cells that are contained in the table's first row.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-first-row-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells not styled based on first row location.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells styled based on first row location.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-first-row-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-first-row-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_740table_use-last-column-styles"><span style="margin-right:0.127cm;">19.740</span></a><a id="__RefHeading__1418726_253892949"/><a id="attribute-table_use-last-column-styles"/>table:use-last-column-styles</h2><p class="Text_20_body">The <span class="Attribute">table:use-last-column-styles</span> attribute specifies if the styles referenced by the <span class="Element">&lt;table:last-column&gt;</span> element of the table template referenced by the <span class="Attribute">table:template-name</span> attribute are used for cells that are contained in the table's last column. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-last-column-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells not styled based on last column location.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells styled based on last column location.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-last-column-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-last-column-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_741table_use-last-row-styles"><span style="margin-right:0.127cm;">19.741</span></a><a id="__RefHeading__1418728_253892949"/><a id="attribute-table_use-last-row-styles"/>table:use-last-row-styles</h2><p class="Text_20_body">The <span class="Attribute">table:use-last-row-styles</span> attribute specifies if the styles referenced by the <span class="Element">&lt;table:last-row&gt;</span> element of the table template referenced by the <span class="Attribute">table:template-name</span> attribute are used for cells that are contained in the table's last row. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-last-row-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: cells not styled based on last row location.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: cells styled based on last row location.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-last-row-styles</span> attribute is usable with the following element: <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-last-row-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_742table_use-labels"><span style="margin-right:0.127cm;">19.742</span></a><a id="__RefHeading__1418730_253892949"/><a id="attribute-table_use-labels"/>table:use-labels</h2><p class="Text_20_body">The <span class="Attribute">table:use-labels</span> attribute specifies whether labels should be used by the consolidation for rows, columns or both. If labels are used for rows or columns, mathematical functions are applied to cells with equally labeled rows or columns rather than to cells with the same relative cell address.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">both</span>: column and row labels used for consolidation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">olumn</span>: column labels used for consolidation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: labels not used for consolidation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ow</span>: row labels used for consolidation.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-labels</span> attribute is usable with the following element: <span class="Element">&lt;table:consolidation&gt;</span> <a href="#element-table_consolidation">9.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:use-labels</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">row</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">both</span>.</p><h2 class="Heading_20_2"><a id="a19_743table_use-regular-expressions"><span style="margin-right:0.127cm;">19.743</span></a><a id="__RefHeading__1418732_253892949"/><a id="attribute-table_use-regular-expressions"/>table:use-regular-expressions</h2><p class="Text_20_body">The <span class="Attribute">table:use-regular-expressions</span> attribute specifies whether regular expressions are enabled for character string comparisons and when searching.</p><p class="Text_20_body">Regular expressions are implementation-dependent expressions that, at a minimum, conform to the requirements of Conformance Clause C1 of <a title="Unicode Regular Expressions" href="http://www.unicode.org/reports/tr18/tr18-13.html">[UTR18]</a>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-regular-expressions</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: regular expressions not enabled for string comparisons and searches.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: regular expressions enabled for string comparisons and searches.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-regular-expressions</span> attribute is usable with the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-regular-expressions</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_744table_use-wildcards"><span style="margin-right:0.127cm;">19.744</span></a><a id="__RefHeading__1418734_253892949"/><a id="attribute-table_use-wildcards"/>table:use-wildcards</h2><p class="Text_20_body">The <span class="Attribute">table:use-wildcards</span> attribute specifies whether wildcards are enabled for character string comparisons and when searching.</p><p class="Text_20_body">If enabled, in a query or search string of a function, the “?” (U+003F, QUESTION MARK), “<span class="Misc_20_Source">*"</span> (U+002A, ASTERISK), and “<span class="Misc_20_Source">~"</span> (U+007E, TILDE) are defined as:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Misc_20_Source">"?"</span> (U+003F, QUESTION MARK): matches any single character;<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Misc_20_Source">"*"</span> (U+002A, ASTERISK): matches any sequence of characters, including an empty string;<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Misc_20_Source">"~"</span> (U+007E, TILDE): escapes the special meaning of a QUESTION MARK, ASTERISK or TILDE character that follows immediately after the TILDE character.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">table:use-regular-expressions</span> attribute and the <span class="Attribute">table:use-wildcards</span> attribute are mutually exclusive. The attribute values cannot be <span class="Attribute_20_Value">true</span> for both attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:use-wildcards</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: wildcards are not enabled for character string comparisons and searching.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: wildcards are enabled for character string comparisons and searching.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:use-wildcards</span> attribute is usable with the following element: <span class="Element">&lt;table:calculation-settings&gt;</span> <a href="#element-table_calculation-settings">9.4.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:use-wildcards</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_745table_used-hierarchy"><span style="margin-right:0.127cm;">19.745</span></a><a id="__RefHeading__1418736_253892949"/><a id="attribute-table_used-hierarchy"/>table:used-hierarchy</h2><p class="Text_20_body">The <span class="Attribute">table:used-hierarchy</span> attribute specifies a unique number assigned by an external component to select the hierarchy that should be applied to a source field. </p><p class="Text_20_body">If the data pilot source is provided by an external component or service, the data contained within category columns may be grouped by its value and it may be further divided into sub-groups or hierarchies. If an external component supports hierarchies, it shall assign unique numbers to those hierarchies. </p><p class="Text_20_body">The default value -1 means that no hierarchy should be applied to a source field.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">-1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:used-hierarchy</span> attribute is usable with the following element: <span class="Element">&lt;table:data-pilot-field&gt;</span> <a href="#element-table_data-pilot-field">9.6.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:used-hierarchy</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_746table_user-name"><span style="margin-right:0.127cm;">19.746</span></a><a id="__RefHeading__1418738_253892949"/><a id="attribute-table_user-name"/>table:user-name</h2><p class="Text_20_body">The <span class="Attribute">table:user-name</span> attribute specifies the user name needed to access a source. It is passed to a service implementation. Its value is implementation-dependent and service specific.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:user-name</span> attribute is usable with the following element: <span class="Element">&lt;table:source-service&gt;</span> <a href="#element-table_source-service">9.6.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:user-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_747table_value"><span style="margin-right:0.127cm;">19.747</span></a><a id="__RefHeading__1418740_253892949"/><a id="attribute-table_value"/>table:value</h2><h3 class="Heading_20_3"><a id="a19_747_1_table_filter-condition_"><span style="margin-right:0.127cm;">19.747.1</span></a><a id="__RefHeading__1418742_253892949"/><a id="attribute-table_value_element-table_filter-condition"/>&lt;table:filter-condition&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:value</span> attribute specifies a value for the filter condition.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:value</span> attribute is usable with the following element: <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:value</span> attribute are a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a> or a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_747_2_table_filter-set-item_"><span style="margin-right:0.127cm;">19.747.2</span></a><a id="__RefHeading__1418744_253892949"/><a id="attribute-table_value_element-table_filter-set-item"/>&lt;table:filter-set-item&gt;</h3><p class="Text_20_body">The <span class="Attribute">table:value</span> attribute specifies a single value within a set of filter values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:value</span> attribute is usable with the following element: <span class="Element">&lt;table:filter-set-item&gt;</span> <a href="#element-table_filter-set-item">9.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_748table_value-type"><span style="margin-right:0.127cm;">19.748</span></a><a id="__RefHeading__1418746_253892949"/><a id="attribute-table_value-type"/>table:value-type</h2><p class="Text_20_body">The <span class="Attribute">table:value-type</span> attribute specifies the value type of a null date. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">date</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:value-type</span> attribute is usable with the following element: <span class="Element">&lt;table:null-date&gt;</span> <a href="#element-table_null-date">9.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The only value of the <span class="Attribute">table:value-type</span> attribute is <span class="Attribute_20_Value">date</span>.</p><h2 class="Heading_20_2"><a id="a19_749table_visibility"><span style="margin-right:0.127cm;">19.749</span></a><a id="__RefHeading__1418748_253892949"/><a id="attribute-table_visibility"/>table:visibility</h2><p class="Text_20_body">The <span class="Attribute">table:visibility</span> attribute specifies whether a row or column is visible.,</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:visibility</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">collapse</span>: a row or column is not visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">filter</span>: a row or column is not visible as the result of applying a filter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">visible</span>: a row or column is visible.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">visible</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">table:visibility</span> attribute is usable with the following elements: <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a> and <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:visibility</span> attribute are <span class="Attribute_20_Value">visible</span>, <span class="Attribute_20_Value">collapse</span> or <span class="Attribute_20_Value">filter</span>.</p><h2 class="Heading_20_2"><a id="a19_750text_active"><span style="margin-right:0.127cm;">19.750</span></a><a id="__RefHeading__1418750_253892949"/><a id="attribute-text_active"/>text:active</h2><p class="Text_20_body">The <span class="Attribute">text:active</span> attribute specifies the setting of the page variable.</p><p class="Text_20_body">The value of an active page variable is increased on each page.</p><p class="Text_20_body">An inactive page variable is not incremented between pages. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:active</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: page variable is turned off.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: page variable is turned on.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default value for this attribute is false.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:active</span> attribute is usable with the following element: <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:active</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_751text_address"><span style="margin-right:0.127cm;">19.751</span></a><a id="__RefHeading__1418752_253892949"/><a id="attribute-text_address"/>text:address</h2><p class="Text_20_body">The <span class="Attribute">text:address</span> attribute specifies the address for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:address</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:address</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_752text_alphabetical-separators"><span style="margin-right:0.127cm;">19.752</span></a><a id="__RefHeading__1418754_253892949"/><a id="attribute-text_alphabetical-separators"/>text:alphabetical-separators</h2><p class="Text_20_body">The <span class="Attribute">text:alphabetical-separators</span> attribute specifies whether entries beginning with the same letter are grouped and separated from the entries beginning with the next letter.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:alphabetical-separators</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: entries beginning with the same letter are not grouped together and separated from entries beginning with the next letter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: entries beginning with the same letter are grouped together and separated from entries beginning with the next letter.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:alphabetical-separators</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:alphabetical-separators</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_753text_anchor-page-number"><span style="margin-right:0.127cm;">19.753</span></a><a id="__RefHeading__1418756_253892949"/><a id="attribute-text_anchor-page-number"/>text:anchor-page-number</h2><p class="Text_20_body">The <span class="Attribute">text:anchor-page-number</span> attribute specifies the physical page number of an anchor if the drawing object is bound to a page within a text document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:anchor-page-number</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:anchor-page-number</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_754text_anchor-type"><span style="margin-right:0.127cm;">19.754</span></a><a id="__RefHeading__1418758_253892949"/><a id="attribute-text_anchor-type"/>text:anchor-type</h2><p class="Text_20_body">The <span class="Attribute">text:anchor-type</span> attribute specifies how a frame is bound to a text document. The anchor position is the point at which a frame is bound to a text document. The defined values for the <span class="Attribute">text:anchor-type</span> attribute are shown in Table <a href="#refTable16">17</a>.</p><p class="Table">Table <a id="refTable16"/>17 - Text anchor positions</p><table border="0" cellspacing="0" cellpadding="0" class="Table4"><colgroup><col width="138"/><col width="193"/><col width="189"/><col width="146"/></colgroup><tr><td style="text-align:left;width:1.2431in; " class="Table4_A1"><p class="Table_20_Heading">If the value of the <span class="Attribute">text:anchor-type</span> attribute is ...</p></td><td style="text-align:left;width:1.7361in; " class="Table4_A1"><p class="Table_20_Heading">The anchor position is...</p></td><td style="text-align:left;width:1.7069in; " class="Table4_A1"><p class="Table_20_Heading">The drawing shape element appears ...</p></td><td style="text-align:left;width:1.3139in; " class="Table4_D1"><p class="Table_20_Heading">Notes</p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table4_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">as-char</span></p></td><td style="text-align:left;width:1.7361in; " class="Table4_A2"><p class="Table_20_Contents">There is no anchor position. The drawing shape behaves like a character.</p></td><td style="text-align:left;width:1.7069in; " class="Table4_A2"><p class="Table_20_Contents">At the position where the character appears in the document.</p></td><td style="text-align:left;width:1.3139in; " class="Table4_D2"><p class="Table_20_Contents"> </p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table4_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">char</span></p></td><td style="text-align:left;width:1.7361in; " class="Table4_A2"><p class="Table_20_Contents">The character after the drawing shape element.</p></td><td style="text-align:left;width:1.7069in; " class="Table4_A2"><p class="Table_20_Contents">Just before the character.</p></td><td style="text-align:left;width:1.3139in; " class="Table4_D2"><p class="Table_20_Contents"> </p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table4_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame</span></p></td><td style="text-align:left;width:1.7361in; " class="Table4_A2"><p class="Table_20_Contents">The parent text box that the current drawing shape element is contained in.</p></td><td style="text-align:left;width:1.7069in; " class="Table4_A2"><p class="Table_20_Contents">In the element representing the text box to which the drawing object is bound.</p><p class="Text_20_body">If an image is bound to a text box, the image element is located in the text box element.</p></td><td style="text-align:left;width:1.3139in; " class="Table4_D2"><p class="Table_20_Contents"> </p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table4_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page</span></p></td><td style="text-align:left;width:1.7361in; " class="Table4_A2"><p class="Table_20_Contents">The page that has the same physical page number as the value of the <span class="Attribute">text:anchor-page-number</span> attribute that is attached to the drawing shape element. If no <span class="Attribute">text:anchor-page-</span><span class="Attribute">number</span> attribute is given, the anchor position is the page at which the character behind the drawing object element appears.</p></td><td style="text-align:left;width:1.7069in; " class="Table4_A2"><p class="Table_20_Contents">Either</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>At the start of the document body, outside any paragraph or frame, provided a <span class="Attribute">text:anchor-page-number</span> attribute is given.<span class="odfLiEnd"/> </p></li></ul><p class="Table_20_Contents">Or</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Inside any paragraph element that is not contained in a header, footer, footnote, or text box, if a <span class="Attribute">text:anchor-</span><span class="Attribute">page-number</span> attribute is not given.<span class="odfLiEnd"/> </p></li></ul></td><td style="text-align:left;width:1.3139in; " class="Table4_D2"><p class="Table_20_Contents">The physical page number is the number assigned to the page if all pages in the document are counted starting with page 1.</p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table4_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph</span></p></td><td style="text-align:left;width:1.7361in; " class="Table4_A2"><p class="Table_20_Contents">The paragraph that the current drawing shape element is contained in.</p></td><td style="text-align:left;width:1.7069in; " class="Table4_A2"><p class="Table_20_Contents">At the start of the paragraph element.</p></td><td style="text-align:left;width:1.3139in; " class="Table4_D2"><p class="Table_20_Contents"> </p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:anchor-type</span> attribute is usable with the following elements: <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a> and <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:anchor-type</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">frame</span>, <span class="Attribute_20_Value">paragraph</span>, <span class="Attribute_20_Value">char</span> or <span class="Attribute_20_Value">as-char</span>.</p><h2 class="Heading_20_2"><a id="a19_755text_annote"><span style="margin-right:0.127cm;">19.755</span></a><a id="__RefHeading__1418760_253892949"/><a id="attribute-text_annote"/>text:annote</h2><p class="Text_20_body">The <span class="Attribute">text:annote</span> attribute specifies the annotation for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:annote</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:annote</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_756text_author"><span style="margin-right:0.127cm;">19.756</span></a><a id="__RefHeading__1418762_253892949"/><a id="attribute-text_author"/>text:author</h2><p class="Text_20_body">The <span class="Attribute">text:author</span> attribute specifies the author or authors for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:author</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:author</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_757text_bibliography-data-field"><span style="margin-right:0.127cm;">19.757</span></a><a id="__RefHeading__1418764_253892949"/><a id="attribute-text_bibliography-data-field"/>text:bibliography-data-field</h2><p class="Text_20_body">The <span class="Attribute">text:bibliography-data-field</span> attribute specifies which part of a bibliography data field will be displayed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:bibliography-data-field</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">address</span>: <a href="#attribute-text_address">19.751</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">annote</span>: <a href="#attribute-text_annote">19.755</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">author</span>: <a href="#attribute-text_author">19.756</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bibliography-type</span>: <a href="#attribute-text_bibliography-type">19.758</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">booktitle</span>: <a href="#attribute-text_booktitle">19.759</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chapter</span>: <a href="#attribute-text_chapter">19.767</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom1</span>: <a href="#attribute-text_custom1">19.786</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom2</span>: <a href="#attribute-text_custom2">19.787</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom3</span>: <a href="#attribute-text_custom3">19.788</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom4</span>: <a href="#attribute-text_custom4">19.789</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom5</span>: <a href="#attribute-text_custom5">19.790</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">edition</span>: <a href="#attribute-text_edition">19.800</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">editor</span>: <a href="#attribute-text_editor">19.801</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">howpublished</span>: <a href="#attribute-text_howpublished">19.807</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">identifier</span>: <a href="#attribute-text_identifier">19.810</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">institution</span>: <a href="#attribute-text_institution">19.814</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">isbn</span>: <a href="#attribute-text_isbn">19.817</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">issn</span>: <a href="#attribute-text_issn">19.818</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">journal</span>: <a href="#attribute-text_journal">19.819</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">month</span>: <a href="#attribute-text_month">19.834</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">note</span>: <a href="#attribute-text_note">19.836</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number</span>: <a href="#attribute-text_number">19.838</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">organizations</span>: <a href="#attribute-text_organizations">19.843</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">pages</span>: <a href="#attribute-text_pages">19.846</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">publisher</span>: <a href="#attribute-text_publisher">19.852</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">report-type</span>: <a href="#attribute-text_report-type">19.856</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">school</span>: <a href="#attribute-text_school">19.860</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">series</span>: <a href="#attribute-text_series">19.862</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">title</span>: <a href="#attribute-text_title">19.882</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">url</span>: <a href="#attribute-text_url">19.884</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">volume</span>: <a href="#attribute-text_volume">19.902</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">year</span>: <a href="#attribute-text_year">19.903</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:bibliography-data-field</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-bibliography&gt;</span> <a href="#element-text_index-entry-bibliography">8.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:bibliography-data-field</span> attribute are <span class="Attribute_20_Value">address</span>, <span class="Attribute_20_Value">annote</span>, <span class="Attribute_20_Value">author</span>, <span class="Attribute_20_Value">bibliography-type</span>, <span class="Attribute_20_Value">booktitle</span>, <span class="Attribute_20_Value">chapter</span>, <span class="Attribute_20_Value">custom1</span>, <span class="Attribute_20_Value">custom2</span>, <span class="Attribute_20_Value">custom3</span>, <span class="Attribute_20_Value">custom4</span>, <span class="Attribute_20_Value">custom5</span>, <span class="Attribute_20_Value">edition</span>, <span class="Attribute_20_Value">editor</span>, <span class="Attribute_20_Value">howpublished</span>, <span class="Attribute_20_Value">identifier</span>, <span class="Attribute_20_Value">institution</span>, <span class="Attribute_20_Value">isbn</span>, <span class="Attribute_20_Value">issn</span>, <span class="Attribute_20_Value">journal</span>, <span class="Attribute_20_Value">month</span>, <span class="Attribute_20_Value">note</span>, <span class="Attribute_20_Value">number</span>, <span class="Attribute_20_Value">organizations</span>, <span class="Attribute_20_Value">pages</span>, <span class="Attribute_20_Value">publisher</span>, <span class="Attribute_20_Value">report-type</span>, <span class="Attribute_20_Value">school</span>, <span class="Attribute_20_Value">series</span>, <span class="Attribute_20_Value">title</span>, <span class="Attribute_20_Value">url</span>, <span class="Attribute_20_Value">volume</span> or <span class="Attribute_20_Value">year</span>.</p><h2 class="Heading_20_2"><a id="a19_758text_bibliography-type"><span style="margin-right:0.127cm;">19.758</span></a><a id="__RefHeading__1418766_253892949"/><a id="attribute-text_bibliography-type"/>text:bibliography-type</h2><p class="Text_20_body">The <span class="Attribute">text:bibliography-type</span> attribute specifies to which type of bibliographical entry a template applies.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:bibliography-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">article</span>: an article in a journal or magazine.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">book</span>: a book with a named publisher.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">ooklet</span>: a work that is printed and bound, but without a named publisher or sponsoring institution.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">onference</span>: an article in conference proceedings.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">ustom1</span>: the first of five user defined fields for a bibliographic entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">ustom2</span>: the second of five user defined fields for a bibliographic entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">ustom3</span>: the third of five user defined fields for a bibliographic entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">ustom4</span>: the fourth of five user defined fields for a bibliographic entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">ustom5</span>: the fifth of five user defined fields for a bibliographic entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">mail</span>: email address.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inbook</span>: a part of a book that can be identified.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span><span class="Attribute_20_Value">ncollection</span>: a part of a book that has its own title.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span><span class="Attribute_20_Value">nproceedings</span>: a paper in conference proceedings.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">j</span><span class="Attribute_20_Value">ournal</span>: a journal name.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span><span class="Attribute_20_Value">anual</span>: technical documentation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span><span class="Attribute_20_Value">astersthesis</span>: a masters thesis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span><span class="Attribute_20_Value">isc</span>: a type classification when more specific values are not appropriate.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">phdthesis</span>: a PhD thesis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">roceedings</span>: the proceedings of a conference.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">echreport</span>: a report published by a school or other institution. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">u</span><span class="Attribute_20_Value">npublished</span>: a document with an author and title but not formally published.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">w</span><span class="Attribute_20_Value">ww</span>: the IRI for a document.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The definitions for article, book, booklet, inbook, incollection, in proceedings, journal, manual, mastersthesis, misc, phdthesis, proceedings, techreport, and unpublished are based on <a title="BIBT E Xing" href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.6093">[BibTeXing]</a>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:bibliography-type</span> attribute is usable with the following elements: <span class="Element">&lt;text:bibliography-entry-template&gt;</span> <a href="#element-text_bibliography-entry-template">8.9.3</a> and <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:bibliography-type</span> attribute are <span class="Attribute_20_Value">article</span>, <span class="Attribute_20_Value">book</span>, <span class="Attribute_20_Value">booklet</span>, <span class="Attribute_20_Value">conference</span>, <span class="Attribute_20_Value">custom1</span>, <span class="Attribute_20_Value">custom2</span>, <span class="Attribute_20_Value">custom3</span>, <span class="Attribute_20_Value">custom4</span>, <span class="Attribute_20_Value">custom5</span>, <span class="Attribute_20_Value">email</span>, <span class="Attribute_20_Value">inbook</span>, <span class="Attribute_20_Value">incollection</span>, <span class="Attribute_20_Value">inproceedings</span>, <span class="Attribute_20_Value">journal</span>, <span class="Attribute_20_Value">manual</span>, <span class="Attribute_20_Value">mastersthesis</span>, <span class="Attribute_20_Value">misc</span>, <span class="Attribute_20_Value">phdthesis</span>, <span class="Attribute_20_Value">proceedings</span>, <span class="Attribute_20_Value">techreport</span>, <span class="Attribute_20_Value">unpublished</span> or <span class="Attribute_20_Value">www</span>.</p><h2 class="Heading_20_2"><a id="a19_759text_booktitle"><span style="margin-right:0.127cm;">19.759</span></a><a id="__RefHeading__1418768_253892949"/><a id="attribute-text_booktitle"/>text:booktitle</h2><p class="Text_20_body">The <span class="Attribute">text:booktitle</span> attribute specifies the book title for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:booktitle</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:booktitle</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_760text_bullet-char"><span style="margin-right:0.127cm;">19.760</span></a><a id="__RefHeading__1418770_253892949"/><a id="attribute-text_bullet-char"/>text:bullet-char</h2><p class="Text_20_body">The <span class="Attribute">text:bullet-char</span> attribute specifies the <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character to use as the bullet in a bullet level style.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:bullet-char</span> attribute are shown in Table <a href="#refTable17">18</a>:</p><p class="Table">Table <a id="refTable17"/>18 - Typical bullet characters</p><table border="0" cellspacing="0" cellpadding="0" class="Table8"><colgroup><col width="87"/><col width="68"/><col width="511"/></colgroup><tr><td style="text-align:left;width:0.7799in; " class="Table8_A1"><p class="Table_20_Heading">UNICODE Character Code</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A1"><p class="Table_20_Heading">Typical Shape</p></td><td style="text-align:left;width:4.6063in; " class="Table8_C1"><p class="Table_20_Heading">UNICODE Character Name</p></td></tr><tr><td style="text-align:left;width:0.7799in; " class="Table8_A2"><p class="Table_20_Contents">U+2022</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A2"><p class="Table_20_Contents">•</p></td><td style="text-align:left;width:4.6063in; " class="Table8_C2"><p class="Table_20_Contents">BULLET</p></td></tr><tr><td style="text-align:left;width:0.7799in; " class="Table8_A2"><p class="Table_20_Contents">U+25CF</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A2"><p class="Table_20_Contents">●</p></td><td style="text-align:left;width:4.6063in; " class="Table8_C2"><p class="Table_20_Contents">BLACK CIRCLE</p></td></tr><tr><td style="text-align:left;width:0.7799in; " class="Table8_A2"><p class="Table_20_Contents">U+2714</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A2"><p class="Table_20_Contents">✔</p></td><td style="text-align:left;width:4.6063in; " class="Table8_A2"><p class="Table_20_Contents">HEAVY CHECK MARK</p></td></tr><tr><td style="text-align:left;width:0.7799in; " class="Table8_A2"><p class="Table_20_Contents">U+2717</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A2"><p class="Table_20_Contents">✗</p></td><td style="text-align:left;width:4.6063in; " class="Table8_A2"><p class="Table_20_Contents">BALLOT X</p></td></tr><tr><td style="text-align:left;width:0.7799in; " class="Table8_A2"><p class="Table_20_Contents">U+2794</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A2"><p class="Table_20_Contents">➔</p></td><td style="text-align:left;width:4.6063in; " class="Table8_A2"><p class="Table_20_Contents">HEAVY WIDE-HEADED RIGHTWARDS ARROW</p></td></tr><tr><td style="text-align:left;width:0.7799in; " class="Table8_A2"><p class="Table_20_Contents">U+27A2</p></td><td style="text-align:left;width:0.6139in; " class="Table8_A2"><p class="Table_20_Contents">➢</p></td><td style="text-align:left;width:4.6063in; " class="Table8_A2"><p class="Table_20_Contents">THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD</p></td></tr></table><p class="Note"><span class="Note_20_Label">Note</span>: These characters need not be available in all fonts.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:bullet-char</span> attribute is usable with the following element: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:bullet-char</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a19_761text_bullet-relative-size"><span style="margin-right:0.127cm;">19.761</span></a><a id="__RefHeading__1418772_253892949"/><a id="attribute-text_bullet-relative-size"/>text:bullet-relative-size</h2><p class="Text_20_body">The <span class="Attribute">text:bullet-relative-size</span> attribute specifies a percentage value for the bullet size relative to the font size of the paragraphs in the bullet list.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:bullet-relative-size</span> attribute is usable with the following element: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:bullet-relative-size</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a19_762text_capitalize-entries"><span style="margin-right:0.127cm;">19.762</span></a><a id="__RefHeading__1418774_253892949"/><a id="attribute-text_capitalize-entries"/>text:capitalize-entries</h2><p class="Text_20_body">The <span class="Attribute">text:capitalize-entries</span> attribute specifies whether the entries in an index are capitalized.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:capitalize-entries</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the case of entries in an index should not change. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the entries in an index should be capitalized. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">text:capitalize-entries</span> attribute controls capitalization of index entries during the generation of indexes. Index entries may be entered in either upper or lower case, without regard to the <span class="Attribute">text:capitalize-entries</span> attribute. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:capitalize-entries</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:capitalize-entries</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_763text_c"><span style="margin-right:0.127cm;">19.763</span></a><a id="__RefHeading__1418776_253892949"/><a id="attribute-text_c"/>text:c</h2><p class="Text_20_body">The <span class="Attribute">text:c</span> attribute specifies the number of “ “ (U+0020, SPACE) characters that a <span class="Element">&lt;text:s&gt;</span> element represents. A missing <span class="Attribute">text:c</span> attribute is interpreted as a single “ “ (U+0020, SPACE) character. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:c</span> attribute is usable with the following element: <span class="Element">&lt;text:s&gt;</span> <a href="#element-text_s">6.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:c</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_764text_caption-sequence-format"><span style="margin-right:0.127cm;">19.764</span></a><a id="__RefHeading__1418778_253892949"/><a id="attribute-text_caption-sequence-format"/>text:caption-sequence-format</h2><p class="Text_20_body">The <span class="Attribute">text:caption-sequence-format</span> attribute specifies the format of entries for an index of illustrations obtained from image captions. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:caption-sequence-format</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">caption</span>: text of the caption in which the referenced sequence field is included (without sequence number and value).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">category-and-value</span>: displays the name and value of the referenced sequence field. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">text</span>: displays the value of the referenced sequence field. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:caption-sequence-format</span> attribute is usable with the following elements: <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a> and <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:caption-sequence-format</span> attribute are <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">category-and-value</span> or <span class="Attribute_20_Value">caption</span>.</p><h2 class="Heading_20_2"><a id="a19_765text_caption-sequence-name"><span style="margin-right:0.127cm;">19.765</span></a><a id="__RefHeading__1418780_253892949"/><a id="attribute-text_caption-sequence-name"/>text:caption-sequence-name</h2><p class="Text_20_body">The <span class="Attribute">text:caption-sequence-name</span> attribute specifies the sequence by which captions are identified.</p><p class="Text_20_body">If the <span class="Attribute">text:use-caption</span> attribute is set to <span class="Attribute_20_Value">true</span>, this attribute shall be present.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Illustration captions are regular paragraphs. For index generation, a paragraph is considered to be a caption if it contains the sequence variable with the name specified by the <span class="Attribute">text:caption-sequence-name</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:caption-sequence-name</span> attribute is usable with the following elements: <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a> and <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:caption-sequence-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_766text_change-id"><span style="margin-right:0.127cm;">19.766</span></a><a id="__RefHeading__1418782_253892949"/><a id="attribute-text_change-id"/>text:change-id</h2><p class="Text_20_body">The <span class="Attribute">text:change-id</span> attribute specifies the id that links <span class="Element">&lt;text:change-start&gt;</span>, <span class="Element">&lt;text:change-end&gt;</span>, and <span class="Element">&lt;text:change&gt;</span> elements to the <span class="Element">&lt;text:changed-region&gt;</span> element that contains change information. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:change-id</span> attribute is usable with the following elements: <span class="Element">&lt;text:change&gt;</span> <a href="#element-text_change">5.5.7.4</a>, <span class="Element">&lt;text:change-end&gt;</span> <a href="#element-text_change-end">5.5.7.3</a> and <span class="Element">&lt;text:change-start&gt;</span> <a href="#element-text_change-start">5.5.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:change-id</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_767text_chapter"><span style="margin-right:0.127cm;">19.767</span></a><a id="__RefHeading__1418784_253892949"/><a id="attribute-text_chapter"/>text:chapter</h2><p class="Text_20_body">The <span class="Attribute">text:chapter</span> attribute specifies the chapter reference for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:chapter</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:chapter</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_768text_citation-body-style-name"><span style="margin-right:0.127cm;">19.768</span></a><a id="__RefHeading__1418786_253892949"/><a id="attribute-text_citation-body-style-name"/>text:citation-body-style-name</h2><p class="Text_20_body">The <span class="Attribute">text:citation-body-style-name</span> attribute specifies the text style to use for a note citation in the text flow.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:citation-body-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:citation-body-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_769text_citation-style-name"><span style="margin-right:0.127cm;">19.769</span></a><a id="__RefHeading__1418788_253892949"/><a id="attribute-text_citation-style-name"/>text:citation-style-name</h2><p class="Text_20_body">The <span class="Attribute">text:citation-style-name</span> attribute specifies the text style to use for a note citation within the footnote.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:citation-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:citation-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_770text_class-names"><span style="margin-right:0.127cm;">19.770</span></a><a id="__RefHeading__1418790_253892949"/><a id="attribute-text_class-names"/>text:class-names</h2><h3 class="Heading_20_3"><a id="a19_770_1General"><span style="margin-right:0.127cm;">19.770.1</span></a><a id="__RefHeading__1418792_253892949"/>General</h3><p class="Text_20_body">A <span class="Attribute">text:class-names</span> attribute specifies a white space separated list of style names. The referenced styles are applied in the order they are contained in the list. </p><p class="Text_20_body">If both <span class="Attribute">text:style-name</span> and <span class="Attribute">text:class-names</span> are present, the style referenced by the <span class="Attribute">text:style-name</span> attribute is applied before the styles referenced by <span class="Attribute">text:class-names</span> attribute. If a conditional style is specified together with a <span class="Attribute">text:class-names</span> attribute, but without a <span class="Attribute">text:style-name</span> attribute, the text:style-name attribute is assumed to have the value of the first style name in the list defined by the text:class-name attribute. </p><h3 class="Heading_20_3"><a id="a19_770_2_text_h_"><span style="margin-right:0.127cm;">19.770.2</span></a><a id="__RefHeading__1418794_253892949"/><a id="attribute-text_class-names_element-text_h"/>&lt;text:h&gt;</h3><p class="Text_20_body">A <span class="Attribute">text:class-names</span> attribute specifies a white space separated list of <span class="Attribute_20_Value">paragraph</span> style names.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:class-names</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:class-names</span> attribute has the data type <span class="Datatype">styleNameRefs</span> <a href="#datatype-styleNameRefs">18.3.33</a>.</p><h3 class="Heading_20_3"><a id="a19_770_3_text_p_"><span style="margin-right:0.127cm;">19.770.3</span></a><a id="__RefHeading__1418796_253892949"/><a id="attribute-text_class-names_element-text_p"/>&lt;text:p&gt;</h3><p class="Text_20_body">A <span class="Attribute">text:class-names</span> attribute specifies a white space separated list of <span class="Attribute_20_Value">paragraph</span> style names.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:class-names</span> attribute is usable with the following element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:class-names</span> attribute has the data type <span class="Datatype">styleNameRefs</span> <a href="#datatype-styleNameRefs">18.3.33</a>.</p><h3 class="Heading_20_3"><a id="a19_770_4_text_span_"><span style="margin-right:0.127cm;">19.770.4</span></a><a id="__RefHeading__1418798_253892949"/><a id="attribute-text_class-names_element-text_span"/>&lt;text:span&gt;</h3><p class="Text_20_body">A <span class="Attribute">text:class-names</span> attribute specifies a white space separated list of text style names.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:class-names</span> attribute is usable with the following element: <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:class-names</span> attribute has the data type <span class="Datatype">styleNameRefs</span> <a href="#datatype-styleNameRefs">18.3.33</a>.</p><h2 class="Heading_20_2"><a id="a19_771text_column-name"><span style="margin-right:0.127cm;">19.771</span></a><a id="__RefHeading__1418800_253892949"/><a id="attribute-text_column-name"/>text:column-name</h2><p class="Text_20_body">The <span class="Attribute">text:column-name</span> attribute specifies the name of the column from which data is displayed. The value of this attribute shall be a column name contained in the current selection as specified by the data source.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:column-name</span> attribute is usable with the following element: <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:column-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_772text_combine-entries"><span style="margin-right:0.127cm;">19.772</span></a><a id="__RefHeading__1418802_253892949"/><a id="attribute-text_combine-entries"/>text:combine-entries</h2><p class="Text_20_body">The <span class="Attribute">text:combine-entries</span> attribute specifies whether multiple entries for a single word should be combined into a single entry.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:combine-entries</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: multiple entries for a single word should not be combined into a single entry. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: multiple entries for a single word should be combined into a single entry. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:combine-entries</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:combine-entries</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_773text_combine-entries-with-dash"><span style="margin-right:0.127cm;">19.773</span></a><a id="__RefHeading__1418804_253892949"/><a id="attribute-text_combine-entries-with-dash"/>text:combine-entries-with-dash</h2><p class="Text_20_body">The <span class="Attribute">text:combine-entries-with-dash</span> attributes specifies that multiple entries for a single word that should be displayed as a single entry, as per a <span class="Attribute">text:combine-entries</span> attribute, should be displayed as a range of numbers separated by a dash.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:combine-entries-with-dash</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: multiple entries for a single word should not be displayed as a range of numbers separated by a dash. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: multiple entries for a single word should be displayed as a range of numbers separated by a dash. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:combine-entries-with-dash</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:combine-entries-with-dash</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_774text_combine-entries-with-pp"><span style="margin-right:0.127cm;">19.774</span></a><a id="__RefHeading__1418806_253892949"/><a id="attribute-text_combine-entries-with-pp"/>text:combine-entries-with-pp</h2><p class="Text_20_body">The <span class="Attribute">text:combine-entries-with-pp</span> attributes specifies that multiple entries for a single word that should be displayed as a single entry, as per a <span class="Attribute">text:combine-entries</span> attribute, should be displayed as the start page number, followed by a "<span class="Attribute_20_Value_20_Fragment">ff</span>", or the appropriate label for the chosen language.</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: multiple entries for a single word are should not be displayed as the start page number, followed by a "<span class="Attribute_20_Value_20_Fragment">ff</span>", or the appropriate label for the chosen language. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: multiple entries for a single word are should be displayed as the start page number, followed by a "<span class="Attribute_20_Value_20_Fragment">ff</span>", or the appropriate label for the chosen language. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:combine-entries-with-pp</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:combine-entries-with-pp</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_775text_comma-separated"><span style="margin-right:0.127cm;">19.775</span></a><a id="__RefHeading__1418808_253892949"/><a id="attribute-text_comma-separated"/>text:comma-separated</h2><p class="Text_20_body">The <span class="Attribute">text:comma-separated</span> attribute specifies how to treat multiple index entries. Instead of listing each index entry on a separate line, multiple entries can be listed on a single line separated by a comma “,” (U+002C, COMMA). If the value of this attribute is <span class="Source_20_Text">true</span>, multiple entries are listed on a single line separated by a comma. By default, the value of this attribute is <span class="Attribute_20_Value">false</span> and each index entry is displayed on a separate line.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:comma-separated</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: each index entry for a word is displayed on a separate line. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: each index entry for a word is listed on a single line separated by a comma “,” (U+002C, COMMA). <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:comma-separated</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:comma-separated</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_776text_cond-style-name"><span style="margin-right:0.127cm;">19.776</span></a><a id="__RefHeading__1418810_253892949"/><a id="attribute-text_cond-style-name"/>text:cond-style-name</h2><p class="Text_20_body">The <span class="Attribute">text:cond-style-name</span> attribute specifies a conditional-style, that is, a style that contains conditions and maps to other styles. The styles referenced shall be a paragraph style. <a href="#element-style_map">16.3</a></p><p class="Text_20_body">If a conditional style is applied to a paragraph, the <span class="Attribute">text:style-name</span> attribute should contain the name of the style that was the result of the conditional style evaluation, while the conditional style name itself is the value of the <span class="Attribute">text:cond-style-name</span> attribute. The referenced style can be a common style or an automatic style. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:cond-style-name</span> attribute is usable with the following elements: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:cond-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_777text_condition"><span style="margin-right:0.127cm;">19.777</span></a><a id="__RefHeading__1418812_253892949"/><a id="attribute-text_condition"/>text:condition</h2><h3 class="Heading_20_3"><a id="a19_777_1General"><span style="margin-right:0.127cm;">19.777.1</span></a><a id="__RefHeading__1418814_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies a condition. Conditions do not have a predefined syntax, but the attribute value should begin with a namespace prefix, followed by a ":" (U+003A, COLON) separator, followed by the text of a formula. The namespace bound to the prefix determines the syntax and semantics of the formula. </p><h3 class="Heading_20_3"><a id="a19_777_2_text_conditional-text_"><span style="margin-right:0.127cm;">19.777.2</span></a><a id="__RefHeading__1418816_253892949"/><a id="attribute-text_condition_element-text_conditional-text"/>&lt;text:conditional-text&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies the condition that determines which of the two text strings of an <span class="Element">&lt;text:conditional-text&gt;</span> text field is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_777_3_text_database-next_"><span style="margin-right:0.127cm;">19.777.3</span></a><a id="__RefHeading__1418818_253892949"/><a id="attribute-text_condition_element-text_database-next"/>&lt;text:database-next&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies a condition expression. The expression is evaluated and if the result interpreted as a Boolean value is true, the next row is used as the new current row. </p><p class="Text_20_body">If the <span class="Element">&lt;text:database-next&gt;</span> element has no text:condition attribute, the next available row is selected. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_777_4_text_database-row-select_"><span style="margin-right:0.127cm;">19.777.4</span></a><a id="__RefHeading__1418820_253892949"/><a id="attribute-text_condition_element-text_database-row-select"/>&lt;text:database-row-select&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies a condition for selecting a row. If the attribute is present, a new row will be selected only if the condition evaluates to a value interpreted as true.</p><p class="Text_20_body">If a <span class="Element">&lt;text:database-row-select&gt;</span> element has no <span class="Attribute">text:condition</span> attribute, the next row is selected.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_777_5_text_hidden-paragraph_"><span style="margin-right:0.127cm;">19.777.5</span></a><a id="__RefHeading__1418822_253892949"/><a id="attribute-text_condition_element-text_hidden-paragraph"/>&lt;text:hidden-paragraph&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies a Boolean expression. If the expression evaluates to <span class="Attribute_20_Value">true</span>, the paragraph is hidden. If the expression evaluates to false, the paragraph is displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_777_6_text_hidden-text_"><span style="margin-right:0.127cm;">19.777.6</span></a><a id="__RefHeading__1418824_253892949"/><a id="attribute-text_condition_element-text_hidden-text"/>&lt;text:hidden-text&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies a Boolean expression. If the expression evaluates to <span class="Attribute_20_Value">true</span>, the text is hidden. If the expression evaluates to false, the text is displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_777_7_text_section_"><span style="margin-right:0.127cm;">19.777.7</span></a><a id="__RefHeading__1418826_253892949"/><a id="attribute-text_condition_element-text_section"/>&lt;text:section&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies the condition under which a section is hidden. The condition is encoded as a string. If the value of <span class="Attribute">text:display</span> is <span class="Source_20_Text">condition</span>, the <span class="Attribute">text:condition</span> attribute shall be present.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:condition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_778text_connection-name"><span style="margin-right:0.127cm;">19.778</span></a><a id="__RefHeading__1418828_253892949"/><a id="attribute-text_connection-name"/>text:connection-name</h2><p class="Text_20_body">The <span class="Attribute">text:connection-name</span> attribute specifies the name of the DDE connection to which a field refers.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:connection-name</span> attribute is usable with the following element: <span class="Element">&lt;text:dde-connection&gt;</span> <a href="#element-text_dde-connection">7.7.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:connection-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_779text_consecutive-numbering"><span style="margin-right:0.127cm;">19.779</span></a><a id="__RefHeading__1418830_253892949"/><a id="attribute-text_consecutive-numbering"/>text:consecutive-numbering</h2><p class="Text_20_body">The <span class="Attribute">text:consecutive-numbering</span> attribute specifies whether the style uses consecutive numbering for all list levels or whether each list level restarts the numbering.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:consecutive-numbering</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: each list level restarts numbering. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consecutive numbering is used for all list levels. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:consecutive-numbering</span> attribute is usable with the following element: <span class="Element">&lt;text:list-style&gt;</span> <a href="#element-text_list-style">16.30</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:consecutive-numbering</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_780text_continue-list"><span style="margin-right:0.127cm;">19.780</span></a><a id="__RefHeading__1418832_253892949"/><a id="attribute-text_continue-list"/>text:continue-list</h2><p class="Text_20_body">The <span class="Attribute">text:continue-list</span> attribute specifies the <span class="Attribute">xml:id</span> value of a list that is to be continued.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:continue-list</span> attribute is usable with the following element: <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:continue-list</span> attribute has the data type <span class="Datatype">IDREF</span> <a href="#datatype-IDREF">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_781text_continue-numbering"><span style="margin-right:0.127cm;">19.781</span></a><a id="__RefHeading__1418834_253892949"/><a id="attribute-text_continue-numbering"/>text:continue-numbering</h2><p class="Text_20_body">The <span class="Attribute">text:continue-numbering</span> attribute specifies, if the numbering of the preceding list is continued or not. This attribute is ignored, if attribute <span class="Attribute">text:continue-list</span> <a href="#attribute-text_continue-list">19.780</a> is present. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:continue-numbering</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: if <span class="Attribute">text:continue-list</span> attribute is not present and the numbering style of the preceding list is the same as the current list, the number of the first list item in the current list is the number of the last item in the preceding list incremented by one. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: if the <span class="Attribute">text:continue-list</span> attribute is not present, the numbering of the preceding list is not continued.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The use of the <span class="Attribute">text:continue-numbering</span> attribute with the <span class="Element">&lt;text:numbered-paragraph&gt;</span> element has been deprecated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:continue-numbering</span> attribute is usable with the following elements: <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a> and <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:continue-numbering</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_782text_copy-outline-levels"><span style="margin-right:0.127cm;">19.782</span></a><a id="__RefHeading__1418836_253892949"/><a id="attribute-text_copy-outline-levels"/>text:copy-outline-levels</h2><p class="Text_20_body">The <span class="Attribute">text:copy-outline-levels</span> attribute specifies whether index entries are indented according to the outline level of their source. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:copy-outline-levels</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: no indentation is added.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: index entries are indented according to the outline level of their source. <span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:copy-outline-levels</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:copy-outline-levels</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_783text_count-empty-lines"><span style="margin-right:0.127cm;">19.783</span></a><a id="__RefHeading__1418838_253892949"/><a id="attribute-text_count-empty-lines"/>text:count-empty-lines</h2><p class="Text_20_body">The <span class="Attribute">text:count-empty-lines</span> attribute specifies whether empty lines are included in the line count. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:count-empty-lines</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: empty lines are not included in a line count.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: empty lines are included in a line count.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:count-empty-lines</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:count-empty-lines</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_784text_count-in-text-boxes"><span style="margin-right:0.127cm;">19.784</span></a><a id="__RefHeading__1418840_253892949"/><a id="attribute-text_count-in-text-boxes"/>text:count-in-text-boxes</h2><p class="Text_20_body">The <span class="Attribute">text:count-in-text-boxes</span> attribute specifies whether text in text boxes is included in the line count. If the value of this attribute is <span class="Attribute_20_Value">true</span>, text within text boxes is included in the line count.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:count-in-text-boxes</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text within text boxes is not included in a line count.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text within text boxes is included in a line count.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:count-in-text-boxes</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:count-in-text-boxes</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_785text_current-value"><span style="margin-right:0.127cm;">19.785</span></a><a id="__RefHeading__1418842_253892949"/><a id="attribute-text_current-value"/>text:current-value</h2><p class="Text_20_body">The <span class="Attribute">text:current-value</span> attribute specifies the evaluation result of a condition given by the expression in a <span class="Attribute">text:condition</span> attribute. <a href="#attribute-text_condition_element-text_conditional-text">613</a> The value of this attribute is updated whenever the expression is evaluated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:current-value</span> attribute is usable with the following element: <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:current-value</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_786text_custom1"><span style="margin-right:0.127cm;">19.786</span></a><a id="__RefHeading__1418844_253892949"/><a id="attribute-text_custom1"/>text:custom1</h2><p class="Text_20_body">The <span class="Attribute">text:custom1</span> attribute specifies the first of up to five user defined fields for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:custom1</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:custom1</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_787text_custom2"><span style="margin-right:0.127cm;">19.787</span></a><a id="__RefHeading__1418846_253892949"/><a id="attribute-text_custom2"/>text:custom2</h2><p class="Text_20_body">The <span class="Attribute">text:custom2</span> attribute specifies the second of up to five user defined fields for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:custom2</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:custom2</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_788text_custom3"><span style="margin-right:0.127cm;">19.788</span></a><a id="__RefHeading__1418848_253892949"/><a id="attribute-text_custom3"/>text:custom3</h2><p class="Text_20_body">The <span class="Attribute">text:custom3</span> attribute specifies the third of up to five user defined fields for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:custom3</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:custom3</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_789text_custom4"><span style="margin-right:0.127cm;">19.789</span></a><a id="__RefHeading__1418850_253892949"/><a id="attribute-text_custom4"/>text:custom4</h2><p class="Text_20_body">The <span class="Attribute">text:custom4</span> attribute specifies the fourth of up to five user defined fields for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:custom4</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:custom4</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_790text_custom5"><span style="margin-right:0.127cm;">19.790</span></a><a id="__RefHeading__1418852_253892949"/><a id="attribute-text_custom5"/>text:custom5</h2><p class="Text_20_body">The <span class="Attribute">text:custom5</span> attribute specifies the fifth of up to five user defined fields for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:custom5</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:custom5</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_791text_database-name"><span style="margin-right:0.127cm;">19.791</span></a><a id="__RefHeading__1418854_253892949"/><a id="attribute-text_database-name"/>text:database-name</h2><p class="Text_20_body">The <span class="Attribute">text:database-name</span> attribute specifies a source database by its name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:database-name</span> attribute is usable with the following elements: <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a> and <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:database-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_792text_date-adjust"><span style="margin-right:0.127cm;">19.792</span></a><a id="__RefHeading__1418856_253892949"/><a id="attribute-text_date-adjust"/>text:date-adjust</h2><p class="Text_20_body">The <span class="Attribute">text:date-adjust</span> attribute specifies an adjustment to the value of a date field. If the time period is negative, it is subtracted from the value of the date field.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:date-adjust</span> attribute is usable with the following element: <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:date-adjust</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_793text_date-value"><span style="margin-right:0.127cm;">19.793</span></a><a id="__RefHeading__1418858_253892949"/><a id="attribute-text_date-value"/>text:date-value</h2><p class="Text_20_body">The <span class="Attribute">text:date-value</span> attribute specifies a date value. If no value is specified, whether the field is marked as fixed or not, the current date is assumed.</p><p class="Note"><span class="Note_20_Label">Note:</span> This attribute can also be used to specify a future date. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:date-value</span> attribute is usable with the following elements: <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a> and <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:date-value</span> attribute has the data type <span class="Datatype">dateOrDateTime</span> <a href="#datatype-dateOrDateTime">18.3.14</a>.</p><h2 class="Heading_20_2"><a id="a19_794text_default-style-name"><span style="margin-right:0.127cm;">19.794</span></a><a id="__RefHeading__1418860_253892949"/><a id="attribute-text_default-style-name"/>text:default-style-name</h2><p class="Text_20_body">The <span class="Attribute">text:default-style-name</span> attribute specifies a default footnote paragraph style for new footnotes that are inserted into a document. It is not evaluated for footnotes that already exist.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:default-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:default-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_795text_description"><span style="margin-right:0.127cm;">19.795</span></a><a id="__RefHeading__1418862_253892949"/><a id="attribute-text_description"/>text:description</h2><p class="Text_20_body">The <span class="Attribute">text:description</span> attribute specifies a message that is displayed when users are prompted for input. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:description</span> attribute is usable with the following elements: <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>, <span class="Element">&lt;text:text-input&gt;</span> <a href="#element-text_text-input">7.4.15</a>, <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a> and <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:description</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_796text_display"><span style="margin-right:0.127cm;">19.796</span></a><a id="__RefHeading__1418864_253892949"/><a id="attribute-text_display"/>text:display</h2><h3 class="Heading_20_3"><a id="a19_796_1General"><span style="margin-right:0.127cm;">19.796.1</span></a><a id="__RefHeading__1418866_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies options for the display of text. </p><h3 class="Heading_20_3"><a id="a19_796_2_text_chapter_"><span style="margin-right:0.127cm;">19.796.2</span></a><a id="__RefHeading__1418868_253892949"/><a id="attribute-text_display_element-text_chapter"/>&lt;text:chapter&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the information that a chapter field should display. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name</span>: name of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number</span>: number of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">umber-and-name</span>: name and number of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">lain-number</span>: number of a chapter without text defined by <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a> and <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, both of which are attributes on the <span class="Element">&lt;text:outline-level-style&gt;</span> element that defines the format for a chapter number.<a href="#element-text_outline-level-style">16.35</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">plain-number-and-name</span>: name of a chapter with the number of the same chapter without text defined by <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a> and <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, both of which are attributes on the <span class="Element">&lt;text:outline-level-style&gt;</span> element that defines the format for a chapter number.<a href="#element-text_outline-level-style">16.35</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">name</span>, <span class="Attribute_20_Value">number</span>, <span class="Attribute_20_Value">number-and-name</span>, <span class="Attribute_20_Value">plain-number-and-name</span> or <span class="Attribute_20_Value">plain-number</span>.</p><h3 class="Heading_20_3"><a id="a19_796_3_text_expression_"><span style="margin-right:0.127cm;">19.796.3</span></a><a id="__RefHeading__1418870_253892949"/><a id="attribute-text_display_element-text_expression"/>&lt;text:expression&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the display of a field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">formula</span>: displays the formula instead of the value of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">none</span>: hides the content of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">value</span>: displays the value of a field.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">value</span> or <span class="Attribute_20_Value">formula</span>.</p><h3 class="Heading_20_3"><a id="a19_796_4_text_file-name_"><span style="margin-right:0.127cm;">19.796.4</span></a><a id="__RefHeading__1418872_253892949"/><a id="attribute-text_display_element-text_file-name"/>&lt;text:file-name&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies how much of the file name to display. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">full</span>: full file name, extension and file path.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">path</span>: file path only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name</span>: file name without extension.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name-and-extension</span>: file name and extension. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The filename may be an IRI, either because an IRI has been used to retrieve the file, or the consumer internally uses IRIs and therefore converts system specific paths into an IRI. If this is the case, and if the path, the name or the extension cannot be evaluated from the IRI, then the IRI should be displayed unmodified.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">full</span>, <span class="Attribute_20_Value">path</span>, <span class="Attribute_20_Value">name</span> or <span class="Attribute_20_Value">name-and-extension</span>.</p><h3 class="Heading_20_3"><a id="a19_796_5_text_index-entry-chapter_"><span style="margin-right:0.127cm;">19.796.5</span></a><a id="__RefHeading__1418874_253892949"/><a id="attribute-text_display_element-text_index-entry-chapter"/>&lt;text:index-entry-chapter&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the information that a chapter field should display. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name</span>: name of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number</span>: number of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number-and-name</span>: name and number of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">plain-number</span>: number of a chapter without text defined by <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a> and <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, both of which are attributes on the <span class="Element">&lt;text:outline-level-style&gt;</span> element that defines the format for a chapter number.<a href="#element-text_outline-level-style">16.35</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">plain-number-and-name</span>: name of a chapter with the number of the same chapter without text defined by <span class="Attribute">style:num-prefix</span> <a href="#attribute-style_num-prefix">19.502</a> and <span class="Attribute">style:num-suffix</span> <a href="#attribute-style_num-suffix">19.503</a>, both of which are attributes on the <span class="Element">&lt;text:outline-level-style&gt;</span> element that defines the format for a chapter number.<a href="#element-text_outline-level-style">16.35</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a> element the default value for this attribute is <span class="Attribute_20_Value">number</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">name</span>, <span class="Attribute_20_Value">number</span>, <span class="Attribute_20_Value">number-and-name</span>, <span class="Attribute_20_Value">plain-number</span> or <span class="Attribute_20_Value">plain-number-and-name</span>.</p><h3 class="Heading_20_3"><a id="a19_796_6_text_section_"><span style="margin-right:0.127cm;">19.796.6</span></a><a id="__RefHeading__1418876_253892949"/><a id="attribute-text_display_element-text_section"/>&lt;text:section&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies whether the section is hidden. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">condition</span>: the section is hidden under the condition specified in the <span class="Attribute">text:condition</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: the section is hidden unconditionally.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the section is displayed. This is the default setting.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">true</span>, <span class="Attribute_20_Value">none</span> or <span class="Attribute_20_Value">condition</span>.</p><h3 class="Heading_20_3"><a id="a19_796_7_text_table-formula_"><span style="margin-right:0.127cm;">19.796.7</span></a><a id="__RefHeading__1418878_253892949"/><a id="attribute-text_display_element-text_table-formula"/>&lt;text:table-formula&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the type of the value that appears in this element. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">formula</span>: the formula used to calculate the value of the field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value</span>: the value of the field.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">value</span> or <span class="Attribute_20_Value">formula</span>.</p><h3 class="Heading_20_3"><a id="a19_796_8_text_template-name_"><span style="margin-right:0.127cm;">19.796.8</span></a><a id="__RefHeading__1418880_253892949"/><a id="attribute-text_display_element-text_template-name"/>&lt;text:template-name&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the information about a document template to display.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">area</span>: The category of the template. Assignments of categories to templates is implementation-dependent. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">full</span>: full file name, extension and file path.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name</span>: file name only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">name-and-extension</span>: file name and extension. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">path</span>: file path only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">title</span>: The title.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:template-name&gt;</span> <a href="#element-text_template-name">7.3.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">full</span>, <span class="Attribute_20_Value">path</span>, <span class="Attribute_20_Value">name</span>, <span class="Attribute_20_Value">name-and-extension</span>, <span class="Attribute_20_Value">area</span> or <span class="Attribute_20_Value">title</span>.</p><h3 class="Heading_20_3"><a id="a19_796_9_text_user-field-get_"><span style="margin-right:0.127cm;">19.796.9</span></a><a id="__RefHeading__1418882_253892949"/><a id="attribute-text_display_element-text_user-field-get"/>&lt;text:user-field-get&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the display of a user field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">formula</span>: displays the formula instead of the value of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">none</span>: hides the content of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">value</span>: displays the value of a field.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">value</span>, <span class="Attribute_20_Value">formula</span> or <span class="Attribute_20_Value">none</span>.</p><h3 class="Heading_20_3"><a id="a19_796_10_text_variable-get_"><span style="margin-right:0.127cm;">19.796.10</span></a><a id="__RefHeading__1418884_253892949"/><a id="attribute-text_display_element-text_variable-get"/>&lt;text:variable-get&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the display of a variable get field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">formula</span>: displays the formula instead of the value of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">value</span>: displays the value of a field.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">value</span> or <span class="Attribute_20_Value">formula</span>.</p><h3 class="Heading_20_3"><a id="a19_796_11_text_variable-input_"><span style="margin-right:0.127cm;">19.796.11</span></a><a id="__RefHeading__1418886_253892949"/><a id="attribute-text_display_element-text_variable-input"/>&lt;text:variable-input&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the display of a variable input field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: hides the content of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">value</span>: displays the value of a field.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">value</span> or <span class="Attribute_20_Value">none</span>.</p><h3 class="Heading_20_3"><a id="a19_796_12_text_variable-set_"><span style="margin-right:0.127cm;">19.796.12</span></a><a id="__RefHeading__1418888_253892949"/><a id="attribute-text_display_element-text_variable-set"/>&lt;text:variable-set&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies the display of a variable set field. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">none</span>: hides the content of a field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Source_20_Text">value</span>: displays the value of a field.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">value</span> or <span class="Attribute_20_Value">none</span>.</p><h2 class="Heading_20_2"><a id="a19_797text_display-levels"><span style="margin-right:0.127cm;">19.797</span></a><a id="__RefHeading__1418890_253892949"/><a id="attribute-text_display-levels"/>text:display-levels</h2><p class="Text_20_body">The <span class="Attribute">text:display-levels</span> attribute specifies the number of levels whose numbers are displayed at the current level.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:display-levels</span> attribute is usable with the following elements: <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a> and <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:display-levels</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_798text_display-outline-level"><span style="margin-right:0.127cm;">19.798</span></a><a id="__RefHeading__1418892_253892949"/><a id="attribute-text_display-outline-level"/>text:display-outline-level</h2><p class="Text_20_body">The <span class="Attribute">text:display-outline-level</span> attribute specifies the numbering of a sequence by chapter. This attribute specifies an outline level that determines which chapters to reference for the chapter-specific numbering. All chapters that are at or below the specified outline level reset the value of the sequence to zero, the default value. The chapter number of the last chapter at or below the specified outline level is prefixed to the sequence number. Choosing an outline level of zero results in a continuous numbering of all sequence elements for that sequence variable.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display-outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:sequence-decl&gt;</span> <a href="#element-text_sequence-decl">7.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:display-outline-level</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_799text_duration"><span style="margin-right:0.127cm;">19.799</span></a><a id="__RefHeading__1418894_253892949"/><a id="attribute-text_duration"/>text:duration</h2><p class="Text_20_body">The <span class="Attribute">text:duration</span> attribute contains the value of a <span class="Element">&lt;text:editing-duration&gt;</span> field element if its value is fixed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:duration</span> attribute is usable with the following element: <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:duration</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_800text_edition"><span style="margin-right:0.127cm;">19.800</span></a><a id="__RefHeading__1418896_253892949"/><a id="attribute-text_edition"/>text:edition</h2><p class="Text_20_body">The <span class="Attribute">text:edition</span> attribute specifies the edition for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:edition</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:edition</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_801text_editor"><span style="margin-right:0.127cm;">19.801</span></a><a id="__RefHeading__1418898_253892949"/><a id="attribute-text_editor"/>text:editor</h2><p class="Text_20_body">The <span class="Attribute">text:editor</span> attribute specifies the editor for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:editor</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:editor</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_802text_filter-name"><span style="margin-right:0.127cm;">19.802</span></a><a id="__RefHeading__1418900_253892949"/><a id="attribute-text_filter-name"/>text:filter-name</h2><p class="Text_20_body">The <span class="Attribute">text:filter-name</span> attribute specifies the filter type to be used to import the link target. The value of this attribute is implementation-dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:filter-name</span> attribute is usable with the following element: <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:filter-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_803text_fixed"><span style="margin-right:0.127cm;">19.803</span></a><a id="__RefHeading__1418902_253892949"/><a id="attribute-text_fixed"/>text:fixed</h2><p class="Text_20_body">The <span class="Attribute">text:fixed</span> attribute specifies whether the value of a field element is fixed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:fixed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: value of the field element where this attribute appears may be changed. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: value of the field element where this attribute appears is preserved.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:fixed</span> attribute is usable with the following elements: <span class="Element">&lt;text:author-initials&gt;</span> <a href="#element-text_author-initials">7.3.7.2</a>, <span class="Element">&lt;text:author-name&gt;</span> <a href="#element-text_author-name">7.3.7.1</a>, <span class="Element">&lt;text:creation-date&gt;</span> <a href="#element-text_creation-date">7.5.3</a>, <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:creator&gt;</span> <a href="#element-text_creator">7.5.17</a>, <span class="Element">&lt;text:date&gt;</span> <a href="#element-text_date">7.3.2</a>, <span class="Element">&lt;text:description&gt;</span> <a href="#element-text_description">7.5.5</a>, <span class="Element">&lt;text:editing-cycles&gt;</span> <a href="#element-text_editing-cycles">7.5.13</a>, <span class="Element">&lt;text:editing-duration&gt;</span> <a href="#element-text_editing-duration">7.5.14</a>, <span class="Element">&lt;text:file-name&gt;</span> <a href="#element-text_file-name">7.3.9</a>, <span class="Element">&lt;text:initial-creator&gt;</span> <a href="#element-text_initial-creator">7.5.2</a>, <span class="Element">&lt;text:keywords&gt;</span> <a href="#element-text_keywords">7.5.12</a>, <span class="Element">&lt;text:modification-date&gt;</span> <a href="#element-text_modification-date">7.5.16</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>, <span class="Element">&lt;text:print-date&gt;</span> <a href="#element-text_print-date">7.5.8</a>, <span class="Element">&lt;text:printed-by&gt;</span> <a href="#element-text_printed-by">7.5.9</a>, <span class="Element">&lt;text:print-</span><span class="Element">time&gt;</span> <a href="#element-text_print-time">7.5.7</a>, <span class="Element">&lt;text:sender-city&gt;</span> <a href="#element-text_sender-city">7.3.6.13</a>, <span class="Element">&lt;text:sender-company&gt;</span> <a href="#element-text_sender-company">7.3.6.10</a>, <span class="Element">&lt;text:sender-country&gt;</span> <a href="#element-text_sender-country">7.3.6.15</a>, <span class="Element">&lt;text:sender-email&gt;</span> <a href="#element-text_sender-email">7.3.6.7</a>, <span class="Element">&lt;text:sender-fax&gt;</span> <a href="#element-text_sender-fax">7.3.6.9</a>, <span class="Element">&lt;text:sender-firstname&gt;</span> <a href="#element-text_sender-firstname">7.3.6.2</a>, <span class="Element">&lt;text:sender-initials&gt;</span> <a href="#element-text_sender-initials">7.3.6.4</a>, <span class="Element">&lt;text:sender-lastname&gt;</span> <a href="#element-text_sender-lastname">7.3.6.3</a>, <span class="Element">&lt;text:sender-phone-private&gt;</span> <a href="#element-text_sender-phone-private">7.3.6.8</a>, <span class="Element">&lt;text:sender-phone-work&gt;</span> <a href="#element-text_sender-phone-work">7.3.6.11</a>, <span class="Element">&lt;text:sender-position&gt;</span> <a href="#element-text_sender-position">7.3.6.6</a>, <span class="Element">&lt;text:sender-postal-code&gt;</span> <a href="#element-text_sender-postal-code">7.3.6.14</a>, <span class="Element">&lt;text:sender-state-or-province&gt;</span> <a href="#element-text_sender-state-or-province">7.3.6.16</a>, <span class="Element">&lt;text:sender-street&gt;</span> <a href="#element-text_sender-street">7.3.6.12</a>, <span class="Element">&lt;text:sender-title&gt;</span> <a href="#element-text_sender-title">7.3.6.5</a>, <span class="Element">&lt;text:subject&gt;</span> <a href="#element-text_subject">7.5.11</a>, <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>, <span class="Element">&lt;text:title&gt;</span> <a href="#element-text_title">7.5.10</a> and <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:fixed</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_804text_footnotes-position"><span style="margin-right:0.127cm;">19.804</span></a><a id="__RefHeading__1418904_253892949"/><a id="attribute-text_footnotes-position"/>text:footnotes-position</h2><p class="Text_20_body">The <span class="Attribute">text:footnotes-position</span> attribute specifies a position for a footnote. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:footnotes-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">document</span>: end of the document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">page</span>: bottom of the page where the footnote citation is located.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">section</span>: end of the section.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">text</span>: at the page where the footnote citation is located, immediately below the page's text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:footnotes-position</span> attribute is usable with the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:footnotes-position</span> attribute are <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">section</span> or <span class="Attribute_20_Value">document</span>.</p><h2 class="Heading_20_2"><a id="a19_805text_formula"><span style="margin-right:0.127cm;">19.805</span></a><a id="__RefHeading__1418906_253892949"/><a id="attribute-text_formula"/>text:formula</h2><p class="Text_20_body">The <span class="Attribute">text:formula</span> attribute specifies the formula or expression used to compute the value of a field. </p><p class="Text_20_body">The attribute value should begin with a namespace prefix followed by ":" (U+003A, COLON) followed by the text of the formula. The namespace bound to the prefix determines the syntax and semantics of the formula. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:formula</span> attribute is usable with the following elements: <span class="Element">&lt;text:expression&gt;</span> <a href="#element-text_expression">7.4.14</a>, <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>, <span class="Element">&lt;text:table-formula&gt;</span> <a href="#element-text_table-formula">7.7.14</a>, <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a> and <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:formula</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_806text_global__deprecated_"><span style="margin-right:0.127cm;">19.806</span></a><a id="__RefHeading__1418908_253892949"/><a id="attribute-text_global"/>text:global (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">text:global</span> attribute specifies whether the user interface of a consumer should consider the documents to which linked text sections are linked as individually editable parts of the document.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:global</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the user interface need not make a distinction between linked text sections and non-linked text sections.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the user interface considers the content of linked text sections as parts of the document which may be edited by editing the documents to which the linked text sections are linked.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">text:global</span> attribute is deprecated in favor of the application/vnd.oasis.opendocument.text-master MIME type. Using this MIME type for a document has the same effect as the value <span class="Attribute_20_Value">true</span> for a <span class="Attribute">text:global</span> attribute.</p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:global</span> attribute is usable with the following element: <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:global</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_807text_howpublished"><span style="margin-right:0.127cm;">19.807</span></a><a id="__RefHeading__1418910_253892949"/><a id="attribute-text_howpublished"/>text:howpublished</h2><p class="Text_20_body">The <span class="Attribute">text:howpublished</span> attribute specifies the publication type for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:howpublished</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:howpublished</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_808text_increment"><span style="margin-right:0.127cm;">19.808</span></a><a id="__RefHeading__1418912_253892949"/><a id="attribute-text_increment"/>text:increment</h2><p class="Text_20_body">The <span class="Attribute">text:increment</span> attribute causes line numbers to be numbered as multiples of a specified increment.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:increment</span> attribute is usable with the following elements: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a> and <span class="Element">&lt;text:linenumbering-separator&gt;</span> <a href="#element-text_linenumbering-separator">16.29.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:increment</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_809text_id"><span style="margin-right:0.127cm;">19.809</span></a><a id="__RefHeading__1418914_253892949"/><a id="attribute-text_id"/>text:id</h2><h3 class="Heading_20_3"><a id="a19_809_1General"><span style="margin-right:0.127cm;">19.809.1</span></a><a id="__RefHeading__1418916_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies an identifier or a name for an element.</p><h3 class="Heading_20_3"><a id="a19_809_2_draw_text-box_"><span style="margin-right:0.127cm;">19.809.2</span></a><a id="__RefHeading__1418918_253892949"/><a id="attribute-text_id_element-draw_text-box"/>&lt;draw:text-box&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies an identifier for an element. </p><p class="Text_20_body">OpenDocument consumers shall ignore a <span class="Attribute">text:id</span> attribute if it occurs on a <span class="Element">&lt;draw:text-box&gt;</span> element with an <span class="Attribute">xml:id</span> attribute value. </p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">text:id</span> attributes for <span class="Element">&lt;draw:text-box&gt;</span> elements in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body"> The value of a <span class="Attribute">text:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same <span class="Element">&lt;draw:text-box&gt;</span> element. </p><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_3_text_alphabetical-index-mark-end_"><span style="margin-right:0.127cm;">19.809.3</span></a><a id="__RefHeading__1418920_253892949"/><a id="attribute-text_id_element-text_alphabetical-index-mark-end"/>&lt;text:alphabetical-index-mark-end&gt; </h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies a name by which start- and end mark elements are connected to each other.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-mark-end&gt;</span> <a href="#element-text_alphabetical-index-mark-end">8.1.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_4_text_alphabetical-index-mark-start_"><span style="margin-right:0.127cm;">19.809.4</span></a><a id="__RefHeading__1418922_253892949"/><a id="attribute-text_id_element-text_alphabetical-index-mark-start"/>&lt;text:alphabetical-index-mark-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies a name by which start- and end mark elements are connected to each other.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_5_text_changed-region_"><span style="margin-right:0.127cm;">19.809.5</span></a><a id="__RefHeading__1418924_253892949"/><a id="attribute-text_id_element-text_changed-region"/>&lt;text:changed-region&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies the an identifier for an element.</p><p class="Text_20_body">The ID value is used in <span class="Attribute_20_Value">text:change-id</span> IDREF values to refer to a particular <span class="Element">&lt;text:changed-region&gt;</span> element.</p><p class="Text_20_body">OpenDocument consumers shall ignore a <span class="Attribute">text:id</span> attribute if it occurs on an element with an <span class="Attribute">xml:id</span> attribute value.</p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">text:id</span> attributes for elements in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body">The value of a <span class="Attribute">text:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same element.</p><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:changed-region&gt;</span> <a href="#element-text_changed-region">5.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_6_text_h_"><span style="margin-right:0.127cm;">19.809.6</span></a><a id="__RefHeading__1418926_253892949"/><a id="attribute-text_id_element-text_h"/>&lt;text:h&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies an identifier for an element.</p><p class="Text_20_body">OpenDocument consumers shall ignore a <span class="Attribute">text:id</span> attribute if it occurs on an element with an <span class="Attribute">xml:id</span> attribute value.</p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">text:id</span> attributes for elements in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body">The value of a <span class="Attribute">text:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same element.</p><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_7_text_note_"><span style="margin-right:0.127cm;">19.809.7</span></a><a id="__RefHeading__1418928_253892949"/><a id="attribute-text_id_element-text_note"/>&lt;text:note&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies specifies a name by which notes can be referenced from <span class="Element">&lt;text:note-ref&gt;</span> elements. See <a href="#element-text_note-ref">7.7.7</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_8_text_p_"><span style="margin-right:0.127cm;">19.809.8</span></a><a id="__RefHeading__1418930_253892949"/><a id="attribute-text_id_element-text_p"/>&lt;text:p&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies an identifier for an element.</p><p class="Text_20_body">OpenDocument consumers shall ignore a <span class="Attribute">text:id</span> attribute if it occurs on a <span class="Element">&lt;text:p&gt;</span> element with an <span class="Attribute">xml:id</span> attribute value. If there is no <span class="Attribute">xml:id</span> attribute value, then a <span class="Attribute">text:id</span> attribute should be processed as it were an <span class="Attribute">xml:id</span> attribute. </p><p class="Text_20_body">OpenDocument producers may write <span class="Attribute">text:id</span> attributes for <span class="Element">&lt;text:p&gt;</span> elements in addition to an <span class="Attribute">xml:id</span> attribute.</p><p class="Text_20_body">A <span class="Element">&lt;text:p&gt;</span> element shall not have an <span class="Attribute">text:id</span> attribute if it has no <span class="Attribute">xml:id</span> attribute value. The value of a <span class="Attribute">text:id</span> attribute shall equal the value of an <span class="Attribute">xml:id</span> attribute on the same <span class="Element">&lt;text:p&gt;</span> element. </p><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute is deprecated in favor of <span class="Attribute">xml:id</span>. <a href="#attribute-xml_id">19.914</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_9_text_toc-mark-end_"><span style="margin-right:0.127cm;">19.809.9</span></a><a id="__RefHeading__1418932_253892949"/><a id="attribute-text_id_element-text_toc-mark-end"/>&lt;text:toc-mark-end&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies a name by which start- and end mark elements are connected to each other.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:toc-mark-end&gt;</span> <a href="#element-text_toc-mark-end">8.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_10_text_toc-mark-start_"><span style="margin-right:0.127cm;">19.809.10</span></a><a id="__RefHeading__1418934_253892949"/><a id="attribute-text_id_element-text_toc-mark-start"/>&lt;text:toc-mark-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies a name by which start- and end mark elements are connected to each other. The name specified by the <span class="Attribute">text:id</span> attribute shall be unique except for a matching <span class="Element">&lt;text:toc-mark-end&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_11_text_user-index-mark-end_"><span style="margin-right:0.127cm;">19.809.11</span></a><a id="__RefHeading__1418936_253892949"/><a id="attribute-text_id_element-text_user-index-mark-end"/>&lt;text:user-index-mark-end&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies a string by which start- and end mark elements are connected to each other. The string shall be unique except for matching its corresponding <span class="Element">&lt;text:user-index-mark-start&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-mark-end&gt;</span> <a href="#element-text_user-index-mark-end">8.1.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_809_12_text_user-index-mark-start_"><span style="margin-right:0.127cm;">19.809.12</span></a><a id="__RefHeading__1418938_253892949"/><a id="attribute-text_id_element-text_user-index-mark-start"/>&lt;text:user-index-mark-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:id</span> attribute specifies a string by which start- and end mark elements are connected to each other. The string shall be unique except for matching its corresponding <span class="Element">&lt;text:user-index-mark-end&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:id</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:id</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_810text_identifier"><span style="margin-right:0.127cm;">19.810</span></a><a id="__RefHeading__1418940_253892949"/><a id="attribute-text_identifier"/>text:identifier</h2><p class="Text_20_body">The <span class="Attribute">text:identifier</span> attribute specifies an identifier for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:identifier</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:identifier</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_811text_index-name"><span style="margin-right:0.127cm;">19.811</span></a><a id="__RefHeading__1418942_253892949"/><a id="attribute-text_index-name"/>text:index-name</h2><p class="Text_20_body">The <span class="Attribute">text:index-name</span> attribute specifies the name of a user defined index.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> In order to support multiple user-defined indexes with different contents, user index marks have a <span class="Attribute">text:index-name</span> attribute. The same attribute can be used with a <span class="Element">&lt;text:user-index-source&gt;</span> element to specify which index marks apply to the current index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:index-name</span> attribute is usable with the following elements: <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>, <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:index-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_812text_index-scope"><span style="margin-right:0.127cm;">19.812</span></a><a id="__RefHeading__1418944_253892949"/><a id="attribute-text_index-scope"/>text:index-scope</h2><p class="Text_20_body">The <span class="Attribute">text:index-scope</span> attribute specifies whether an index is constructed for an entire document or for a chapter.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:index-scope</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chapter</span>: the index is constructed for the chapter that contains the index. A chapter consists of all those paragraphs and headings which have the same immediately preceding heading with outline level <span class="Attribute_20_Value_20_Instance">1</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">document</span>: the index is constructed for the entire document. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default value for this attribute is <span class="Attribute_20_Value">document</span>. </p><p class="Default_20_Value_borderStart">For <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>, <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a>, <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>, <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a> elements the default value for this attribute is <span class="Attribute_20_Value">document</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:index-scope</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>, <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a>, <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>, <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>, <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:index-scope</span> attribute are <span class="Attribute_20_Value">document</span> or <span class="Attribute_20_Value">chapter</span>.</p><h2 class="Heading_20_2"><a id="a19_813text_ignore-case"><span style="margin-right:0.127cm;">19.813</span></a><a id="__RefHeading__1418946_253892949"/><a id="attribute-text_ignore-case"/>text:ignore-case</h2><p class="Text_20_body">The <span class="Attribute">text:ignore-case</span> attribute specifies whether the capitalization of words is ignored. If the value is <span class="Attribute_20_Value">true</span>, the capitalization is ignored and entries that are identical except for character case are listed as the same entries. If the value is <span class="Attribute_20_Value">false</span>, the capitalization of words is not ignored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:ignore-case</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: index entries that are identical except for character case should be listed as the same entries.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: index entries that are identical but differ in character case should not be listed as separate entries.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:ignore-case</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:ignore-case</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_814text_institution"><span style="margin-right:0.127cm;">19.814</span></a><a id="__RefHeading__1418948_253892949"/><a id="attribute-text_institution"/>text:institution</h2><p class="Text_20_body">The <span class="Attribute">text:institution</span> attribute specifies an institution for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:institution</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:institution</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_815text_is-hidden"><span style="margin-right:0.127cm;">19.815</span></a><a id="__RefHeading__1418950_253892949"/><a id="attribute-text_is-hidden"/>text:is-hidden</h2><p class="Text_20_body">The <span class="Attribute">text:is-hidden</span> attribute specifies whether a field or paragraph is currently visible.</p><p class="Note"><span class="Note_20_Label">Note:</span> The value of this attribute is overwritten with a new value as soon as the consumer evaluates the expression. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:is-hidden</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: condition for display has evaluated to false, field or paragraph is visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: condition for display has evaluated to true, field or paragraph is not visible.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:is-hidden</span> attribute is usable with the following elements: <span class="Element">&lt;text:hidden-paragraph&gt;</span> <a href="#element-text_hidden-paragraph">7.7.11</a> and <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:is-hidden</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_816text_is-list-header"><span style="margin-right:0.127cm;">19.816</span></a><a id="__RefHeading__1418952_253892949"/><a id="attribute-text_is-list-header"/>text:is-list-header</h2><p class="Text_20_body">The <span class="Attribute">text:is-list-header</span> attribute specifies the appearance of a specific heading without numbering. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:is-list-header</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: heading will be numbered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: heading will be not numbered, even if the header has a list-style..<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:is-list-header</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:is-list-header</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_817text_isbn"><span style="margin-right:0.127cm;">19.817</span></a><a id="__RefHeading__1418954_253892949"/><a id="attribute-text_isbn"/>text:isbn</h2><p class="Text_20_body">The <span class="Attribute">text:isbn</span> attribute specifies an ISBN for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:isbn</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:isbn</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_818text_issn"><span style="margin-right:0.127cm;">19.818</span></a><a id="__RefHeading__1418956_253892949"/><a id="attribute-text_issn"/>text:issn</h2><p class="Text_20_body">The <span class="Attribute">text:issn</span> attribute specifies an ISSN for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:issn</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:issn</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_819text_journal"><span style="margin-right:0.127cm;">19.819</span></a><a id="__RefHeading__1418958_253892949"/><a id="attribute-text_journal"/>text:journal</h2><p class="Text_20_body">The <span class="Attribute">text:journal</span> attribute specifies a journal for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:journal</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:journal</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_820text_key"><span style="margin-right:0.127cm;">19.820</span></a><a id="__RefHeading__1418960_253892949"/><a id="attribute-text_key"/>text:key</h2><p class="Text_20_body">The <span class="Attribute">text:key</span> attribute specifies a type for the index entries that should be used for sorting. See <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:key</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">address</span>: <a href="#attribute-text_address">19.751</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">annote</span>: <a href="#attribute-text_annote">19.755</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">author</span>: <a href="#attribute-text_author">19.756</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bibliography-type</span>: <a href="#attribute-text_bibliography-type">19.758</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">booktitle</span>: <a href="#attribute-text_booktitle">19.759</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chapter</span>: <a href="#attribute-text_chapter">19.767</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom1</span>: <a href="#attribute-text_custom1">19.786</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom2</span>: <a href="#attribute-text_custom2">19.787</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom3</span>: <a href="#attribute-text_custom3">19.788</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom4</span>: <a href="#attribute-text_custom4">19.789</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">custom5</span>: <a href="#attribute-text_custom5">19.790</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">edition</span>: <a href="#attribute-text_edition">19.800</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">editor</span>: <a href="#attribute-text_editor">19.801</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">howpublished</span>: <a href="#attribute-text_howpublished">19.807</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">identifier</span>: <a href="#attribute-text_identifier">19.810</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">institution</span>: <a href="#attribute-text_institution">19.814</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">isbn</span>: <a href="#attribute-text_isbn">19.817</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">issn</span>: <a href="#attribute-text_issn">19.818</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">journal</span>: <a href="#attribute-text_journal">19.819</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">month</span>: <a href="#attribute-text_month">19.834</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">note</span>: <a href="#attribute-text_note">19.836</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number</span>: <a href="#attribute-text_number">19.838</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">organizations</span>: <a href="#attribute-text_organizations">19.843</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">pages</span>: <a href="#attribute-text_pages">19.846</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">publisher</span>: <a href="#attribute-text_publisher">19.852</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">report-type</span>: <a href="#attribute-text_report-type">19.856</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">school</span>: <a href="#attribute-text_school">19.860</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">series</span>: <a href="#attribute-text_series">19.862</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">title</span>: <a href="#attribute-text_title">19.882</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">url</span>: <a href="#attribute-text_url">19.884</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">volume</span>: <a href="#attribute-text_volume">19.902</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">year</span>: <a href="#attribute-text_year">19.903</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:key</span> attribute is usable with the following element: <span class="Element">&lt;text:sort-key&gt;</span> <a href="#element-text_sort-key">16.29.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:key</span> attribute are <span class="Attribute_20_Value">address</span>, <span class="Attribute_20_Value">annote</span>, <span class="Attribute_20_Value">author</span>, <span class="Attribute_20_Value">bibliography-type</span>, <span class="Attribute_20_Value">booktitle</span>, <span class="Attribute_20_Value">chapter</span>, <span class="Attribute_20_Value">custom1</span>, <span class="Attribute_20_Value">custom2</span>, <span class="Attribute_20_Value">custom3</span>, <span class="Attribute_20_Value">custom4</span>, <span class="Attribute_20_Value">custom5</span>, <span class="Attribute_20_Value">edition</span>, <span class="Attribute_20_Value">editor</span>, <span class="Attribute_20_Value">howpublished</span>, <span class="Attribute_20_Value">identifier</span>, <span class="Attribute_20_Value">institution</span>, <span class="Attribute_20_Value">isbn</span>, <span class="Attribute_20_Value">issn</span>, <span class="Attribute_20_Value">journal</span>, <span class="Attribute_20_Value">month</span>, <span class="Attribute_20_Value">note</span>, <span class="Attribute_20_Value">number</span>, <span class="Attribute_20_Value">organizations</span>, <span class="Attribute_20_Value">pages</span>, <span class="Attribute_20_Value">publisher</span>, <span class="Attribute_20_Value">report-type</span>, <span class="Attribute_20_Value">school</span>, <span class="Attribute_20_Value">series</span>, <span class="Attribute_20_Value">title</span>, <span class="Attribute_20_Value">url</span>, <span class="Attribute_20_Value">volume</span> or <span class="Attribute_20_Value">year</span>.</p><h2 class="Heading_20_2"><a id="a19_821text_key1"><span style="margin-right:0.127cm;">19.821</span></a><a id="__RefHeading__1418962_253892949"/><a id="attribute-text_key1"/>text:key1</h2><p class="Text_20_body">The <span class="Attribute">text:key1</span> attribute specifies an additional key for an alphabetical index mark. If only one key is used, it shall be contained in a <span class="Attribute">text:key1</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:key1</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:key1</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_822text_key2"><span style="margin-right:0.127cm;">19.822</span></a><a id="__RefHeading__1418964_253892949"/><a id="attribute-text_key2"/>text:key2</h2><p class="Text_20_body">The <span class="Attribute">text:key2</span> attribute specifies an additional key for an alphabetical index mark.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:key2</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:key2</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_823text_key1-phonetic"><span style="margin-right:0.127cm;">19.823</span></a><a id="__RefHeading__1418966_253892949"/><a id="attribute-text_key1-phonetic"/>text:key1-phonetic</h2><p class="Text_20_body">The <span class="Attribute">text:key1-phonetic</span> attribute specifies a phonetic key for <span class="Element">&lt;text:toc-mark-start&gt;</span> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> elements. Phonetic keys should be used for sorting. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:key1-phonetic</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:key1-phonetic</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_824text_key2-phonetic"><span style="margin-right:0.127cm;">19.824</span></a><a id="__RefHeading__1418968_253892949"/><a id="attribute-text_key2-phonetic"/>text:key2-phonetic</h2><p class="Text_20_body">The <span class="Attribute">text:key2-phonetic</span> attribute specifies an additional phonetic key for <span class="Element">&lt;text:toc-mark-start&gt;</span> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:key2-phonetic</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:key2-phonetic</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_825text_kind"><span style="margin-right:0.127cm;">19.825</span></a><a id="__RefHeading__1418970_253892949"/><a id="attribute-text_kind"/>text:kind</h2><p class="Text_20_body">The <span class="Attribute">text:kind</span> attribute specifies which part of a measure is displayed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:kind</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">gap</span>: Adds space to text if the measure text's writing direction is perpendicular to the measure line. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">unit</span>: The measure's unit is displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value</span>: The measure's value is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> The purpose of the <span class="Attribute_20_Value">gap</span> value is add space between the measure line and the text if the text is displayed perpendicular to the measure line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:kind</span> attribute is usable with the following element: <span class="Element">&lt;text:measure&gt;</span> <a href="#element-text_measure">7.7.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:kind</span> attribute are <span class="Attribute_20_Value">value</span>, <span class="Attribute_20_Value">unit</span> or <span class="Attribute_20_Value">gap</span>.</p><h2 class="Heading_20_2"><a id="a19_826text_label"><span style="margin-right:0.127cm;">19.826</span></a><a id="__RefHeading__1418972_253892949"/><a id="attribute-text_label"/>text:label</h2><p class="Text_20_body">The <span class="Attribute">text:label</span> attribute specifies a label for user inserted notes in a document. If this attribute is omitted, the element content is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:label</span> attribute is usable with the following element: <span class="Element">&lt;text:note-citation&gt;</span> <a href="#element-text_note-citation">6.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:label</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_827text_label-followed-by"><span style="margin-right:0.127cm;">19.827</span></a><a id="__RefHeading__1418974_253892949"/><a id="attribute-text_label-followed-by"/>text:label-followed-by</h2><p class="Text_20_body">The <span class="Attribute">text:label-followed-by</span> attribute specifies a character that is inserted behind a list label. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:label-followed-by</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">listtab</span>: a tab character is inserted after a list label before the text starts.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">nothing</span>: text starts directly after a list label.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">space</span>: a “ “ (U+0020, SPACE) character is inserted after a list label before the text starts.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:label-followed-by</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:label-followed-by</span> attribute are <span class="Attribute_20_Value">listtab</span>, <span class="Attribute_20_Value">space</span> or <span class="Attribute_20_Value">nothing</span>.</p><h2 class="Heading_20_2"><a id="a19_828text_level"><span style="margin-right:0.127cm;">19.828</span></a><a id="__RefHeading__1418976_253892949"/><a id="attribute-text_level"/>text:level</h2><p class="Text_20_body">The <span class="Attribute">text:level</span> attribute specifies the level of an outline or number list style.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:level</span> attribute is usable with the following elements: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>, <span class="Element">&lt;text:list-level-style-</span><span class="Element">number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a> and <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_829text_list-id"><span style="margin-right:0.127cm;">19.829</span></a><a id="__RefHeading__1418978_253892949"/><a id="attribute-text_list-id"/>text:list-id</h2><p class="Text_20_body">The <span class="Attribute">text:list-id</span> attribute specifies an id that is used to group numbered paragraphs form a list. All numbered paragraphs with the same <span class="Attribute">text:list-id</span> value belong to one list. This list defines the counter domain for the numbered paragraphs. In this context, a list is defined as a number of list items, spanning multiple levels. As with lists in <span class="Element">&lt;text:list&gt;</span> representation the list style of the first numbered paragraph at every list level is used for the start value.</p><p class="Text_20_body">The <span class="Attribute">text:list-id</span> attribute did not exist in OpenDocument v1.0 and v1.1. For such text documents which do not contain the <span class="Attribute">text:list-id</span> attribute the following rules are applied to form a list from a group of numbered paragraphs:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A series of numbered paragraphs each using the same list style belong to the same list.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A numbered paragraph that does not have a <span class="Attribute">text:list-id</span> gets the <span class="Attribute">text:list-id</span> of the last numbered paragraph on the same list level using the same list style. If the previous numbered-paragraph has a different list style, then a new list is started.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:list-id</span> attribute is usable with the following element: <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:list-id</span> attribute has the data type <span class="Datatype">NCName</span> <a href="#datatype-NCName">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_830text_list-tab-stop-position"><span style="margin-right:0.127cm;">19.830</span></a><a id="__RefHeading__1418980_253892949"/><a id="attribute-text_list-tab-stop-position"/>text:list-tab-stop-position</h2><p class="Text_20_body">The <span class="Attribute">text:list-tab-stop-position</span> attribute specifies an additional tab stop which is inserted into the list of tab stops that are defined for a list item. By default the tab stop's position is behind list label. The text of the first line of list item starts at this tab stop. In left-to-right layout environments this tab stop is interpreted as a left tab. While in right-to-left layout environments it is interpreted as a right tab.</p><p class="Text_20_body">The <span class="Attribute">text:list-tab-stop-position</span> attribute is ignored unless the <span class="Attribute">text:label-followed-by</span> attribute has the value <span class="Attribute_20_Value">listtab</span>. </p><p class="Text_20_body">There are two cases in which this additional tab stop does not specify the start the of the text of the first line of the list item:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The position of the additional tab stop is before the end of the list label.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Between the end of the list label and the position of the additional tab stop exists already a tab stop.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">In these cases, the tab character that is inserted behind the list label advances to the next tab stop, or a default tab stop if none exists. However, other tab stops contained in the list item's text may advance to the additional list tab stop. The additional tab stop is further applied to the full text of tab stop, that is, not only the first line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:list-tab-stop-position</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:list-tab-stop-position</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a19_831text_main-entry"><span style="margin-right:0.127cm;">19.831</span></a><a id="__RefHeading__1418982_253892949"/><a id="attribute-text_main-entry"/>text:main-entry</h2><p class="Text_20_body">The <span class="Attribute">text:main-entry</span> attribute specifies which of multiple index marks for the same entry is the main entry.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:main-entry</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: no index mark is specified as the main entry from multiple index marks for the same entry.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: one index mark out of multiple index marks for the same entry is specified as the main entry.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:main-entry</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:main-entry</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_832text_main-entry-style-name"><span style="margin-right:0.127cm;">19.832</span></a><a id="__RefHeading__1418984_253892949"/><a id="attribute-text_main-entry-style-name"/>text:main-entry-style-name</h2><p class="Text_20_body">The <span class="Attribute">text:main-entry-style-name</span> attribute specifies the character style to use for main entries. Sub entries are formatted using the default character style determined by the paragraph style of the entries.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:main-entry-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:main-entry-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_833text_master-page-name"><span style="margin-right:0.127cm;">19.833</span></a><a id="__RefHeading__1418986_253892949"/><a id="attribute-text_master-page-name"/>text:master-page-name</h2><p class="Text_20_body">The <span class="Attribute">text:master-page-name</span> attribute specifies the name of a master page.</p><p class="Text_20_body">For <span class="Element">&lt;text:page&gt;</span> elements <a href="#element-text_page">5.2.2</a>, the attribute specifies the name of the master page which is used to format the page.</p><p class="Text_20_body">For <span class="Element">&lt;text:notes-configuration&gt;</span> elements <a href="#element-text_notes-configuration">16.29.3</a>, the attributes specifies the master page which is used to format the pages on which the notes are displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:master-page-name</span> attribute is usable with the following elements: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a> and <span class="Element">&lt;text:page&gt;</span> <a href="#element-text_page">5.2.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:master-page-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_834text_month"><span style="margin-right:0.127cm;">19.834</span></a><a id="__RefHeading__1418988_253892949"/><a id="attribute-text_month"/>text:month</h2><p class="Text_20_body">The <span class="Attribute">text:month</span> attribute specifies a month for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:month</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:month</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_835text_name"><span style="margin-right:0.127cm;">19.835</span></a><a id="__RefHeading__1418990_253892949"/><a id="attribute-text_name"/>text:name</h2><h3 class="Heading_20_3"><a id="a19_835_1General"><span style="margin-right:0.127cm;">19.835.1</span></a><a id="__RefHeading__1418992_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a name. </p><h3 class="Heading_20_3"><a id="a19_835_2_text_alphabetical-index_"><span style="margin-right:0.127cm;">19.835.2</span></a><a id="__RefHeading__1418994_253892949"/><a id="attribute-text_name_element-text_alphabetical-index"/>&lt;text:alphabetical-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for an alphabetical index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_3_text_bibliography_"><span style="margin-right:0.127cm;">19.835.3</span></a><a id="__RefHeading__1418996_253892949"/><a id="attribute-text_name_element-text_bibliography"/>&lt;text:bibliography&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for a bibliography.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_4_text_bookmark_"><span style="margin-right:0.127cm;">19.835.4</span></a><a id="__RefHeading__1418998_253892949"/><a id="attribute-text_name_element-text_bookmark"/>&lt;text:bookmark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a name for a bookmark.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_5_text_bookmark-end_"><span style="margin-right:0.127cm;">19.835.5</span></a><a id="__RefHeading__1419000_253892949"/><a id="attribute-text_name_element-text_bookmark-end"/>&lt;text:bookmark-end&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a name that shall match the <span class="Attribute">text:name</span> attribute on only one <span class="Element">&lt;text:bookmark-start&gt;</span> element in a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:bookmark-end&gt;</span> <a href="#element-text_bookmark-end">6.2.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_6_text_bookmark-start_"><span style="margin-right:0.127cm;">19.835.6</span></a><a id="__RefHeading__1419002_253892949"/><a id="attribute-text_name_element-text_bookmark-start"/>&lt;text:bookmark-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a name that shall match the <span class="Attribute">text:name</span> attribute on only one <span class="Element">&lt;text:bookmark-end&gt;</span> element in a document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_7_text_execute-macro_"><span style="margin-right:0.127cm;">19.835.7</span></a><a id="__RefHeading__1419004_253892949"/><a id="attribute-text_name_element-text_execute-macro"/>&lt;text:execute-macro&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a macro to invoke when a field is activated. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:execute-macro&gt;</span> <a href="#element-text_execute-macro">7.7.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_8_text_illustration-index_"><span style="margin-right:0.127cm;">19.835.8</span></a><a id="__RefHeading__1419006_253892949"/><a id="attribute-text_name_element-text_illustration-index"/>&lt;text:illustration-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for an illustration index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_9_text_index-title_"><span style="margin-right:0.127cm;">19.835.9</span></a><a id="__RefHeading__1419008_253892949"/><a id="attribute-text_name_element-text_index-title"/>&lt;text:index-title&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for an index title.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_10_text_object-index_"><span style="margin-right:0.127cm;">19.835.10</span></a><a id="__RefHeading__1419010_253892949"/><a id="attribute-text_name_element-text_object-index"/>&lt;text:object-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for an object index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_11_text_reference-mark_"><span style="margin-right:0.127cm;">19.835.11</span></a><a id="__RefHeading__1419012_253892949"/><a id="attribute-text_name_element-text_reference-mark"/>&lt;text:reference-mark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for reference elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:reference-mark&gt;</span> <a href="#element-text_reference-mark">6.2.2.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_12_text_reference-mark-end_"><span style="margin-right:0.127cm;">19.835.12</span></a><a id="__RefHeading__1419014_253892949"/><a id="attribute-text_name_element-text_reference-mark-end"/>&lt;text:reference-mark-end&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for reference elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:reference-mark-end&gt;</span> <a href="#element-text_reference-mark-end">6.2.2.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_13_text_reference-mark-start_"><span style="margin-right:0.127cm;">19.835.13</span></a><a id="__RefHeading__1419016_253892949"/><a id="attribute-text_name_element-text_reference-mark-start"/>&lt;text:reference-mark-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for reference elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:reference-mark-start&gt;</span> <a href="#element-text_reference-mark-start">6.2.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_14_text_section_"><span style="margin-right:0.127cm;">19.835.14</span></a><a id="__RefHeading__1419018_253892949"/><a id="attribute-text_name_element-text_section"/>&lt;text:section&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for a section.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_15_text_sequence_"><span style="margin-right:0.127cm;">19.835.15</span></a><a id="__RefHeading__1419020_253892949"/><a id="attribute-text_name_element-text_sequence"/>&lt;text:sequence&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies name of variable to display. It shall match the name of a sequence variable already declared by a preceding <span class="Element">&lt;text:sequence-decl&gt;</span>.element </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_16_text_sequence-decl_"><span style="margin-right:0.127cm;">19.835.16</span></a><a id="__RefHeading__1419022_253892949"/><a id="attribute-text_name_element-text_sequence-decl"/>&lt;text:sequence-decl&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies unique name of a variable to be declared. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:sequence-decl&gt;</span> <a href="#element-text_sequence-decl">7.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_17_text_table-of-content_"><span style="margin-right:0.127cm;">19.835.17</span></a><a id="__RefHeading__1419024_253892949"/><a id="attribute-text_name_element-text_table-of-content"/>&lt;text:table-of-content&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for a <span class="Element">&lt;text:table-of-content&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_18_text_table-index_"><span style="margin-right:0.127cm;">19.835.18</span></a><a id="__RefHeading__1419026_253892949"/><a id="attribute-text_name_element-text_table-index"/>&lt;text:table-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for a table index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_19_text_user-defined_"><span style="margin-right:0.127cm;">19.835.19</span></a><a id="__RefHeading__1419028_253892949"/><a id="attribute-text_name_element-text_user-defined"/>&lt;text:user-defined&gt;</h3><p class="Text_20_body"> The <span class="Attribute">text:name</span> attribute specifies a name that corresponds to the value of a <span class="Attribute">meta:name</span> attribute on a <span class="Element">&lt;meta:user-defined&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-defined&gt;</span> <a href="#element-text_user-defined">7.5.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_20_text_user-field-decl_"><span style="margin-right:0.127cm;">19.835.20</span></a><a id="__RefHeading__1419030_253892949"/><a id="attribute-text_name_element-text_user-field-decl"/>&lt;text:user-field-decl&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for a user defined field declaration. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-field-decl&gt;</span> <a href="#element-text_user-field-decl">7.4.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_21_text_user-field-get_"><span style="margin-right:0.127cm;">19.835.21</span></a><a id="__RefHeading__1419032_253892949"/><a id="attribute-text_name_element-text_user-field-get"/>&lt;text:user-field-get&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies name of a user defined field that shall be declared already by a preceding <span class="Element">&lt;text:user-field-decl&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-field-get&gt;</span> <a href="#element-text_user-field-get">7.4.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_22_text_user-field-input_"><span style="margin-right:0.127cm;">19.835.22</span></a><a id="__RefHeading__1419034_253892949"/><a id="attribute-text_name_element-text_user-field-input"/>&lt;text:user-field-input&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a name of a user defined field that shall be declared already by a preceding <span class="Element">&lt;text:user-field-decl&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-field-input&gt;</span> <a href="#element-text_user-field-input">7.4.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_23_text_user-index_"><span style="margin-right:0.127cm;">19.835.23</span></a><a id="__RefHeading__1419036_253892949"/><a id="attribute-text_name_element-text_user-index"/>&lt;text:user-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a unique name for a user specified index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_835_24_text_variable-set_"><span style="margin-right:0.127cm;">19.835.24</span></a><a id="__RefHeading__1419038_253892949"/><a id="attribute-text_name_element-text_variable-set"/>&lt;text:variable-set&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a variable name that shall match a variable name already declared by a preceding <span class="Element">&lt;text:variable-decl&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-set&gt;</span> <a href="#element-text_variable-set">7.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_25_text_variable-decl_"><span style="margin-right:0.127cm;">19.835.25</span></a><a id="__RefHeading__1419040_253892949"/><a id="attribute-text_name_element-text_variable-decl"/>&lt;text:variable-decl&gt; </h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies unique name for a variable declaration. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-decl&gt;</span> <a href="#element-text_variable-decl">7.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_26_text_variable-get_"><span style="margin-right:0.127cm;">19.835.26</span></a><a id="__RefHeading__1419042_253892949"/><a id="attribute-text_name_element-text_variable-get"/>&lt;text:variable-get&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a variable name that shall match a preceding <span class="Element">&lt;text:variable-decl&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-get&gt;</span> <a href="#element-text_variable-get">7.4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h3 class="Heading_20_3"><a id="a19_835_27_text_variable-input_"><span style="margin-right:0.127cm;">19.835.27</span></a><a id="__RefHeading__1419044_253892949"/><a id="attribute-text_name_element-text_variable-input"/>&lt;text:variable-input&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:name</span> attribute specifies a variable name that shall match the name of variable already declared by a preceding <span class="Element">&lt;text:variable-decl&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:name</span> attribute is usable with the following element: <span class="Element">&lt;text:variable-input&gt;</span> <a href="#element-text_variable-input">7.4.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:name</span> attribute has the data type <span class="Datatype">variableName</span> <a href="#datatype-variableName">18.3.39</a>.</p><h2 class="Heading_20_2"><a id="a19_836text_note"><span style="margin-right:0.127cm;">19.836</span></a><a id="__RefHeading__1419046_253892949"/><a id="attribute-text_note"/>text:note</h2><p class="Text_20_body">The <span class="Attribute">text:note</span> attribute specifies a note for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:note</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:note</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_837text_note-class"><span style="margin-right:0.127cm;">19.837</span></a><a id="__RefHeading__1419048_253892949"/><a id="attribute-text_note-class"/>text:note-class</h2><p class="Text_20_body">The <span class="Attribute">text:note-class</span> attribute specifies the class of a note. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:note-class</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">endnote</span>: note appears at the end of a chapter or document. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">ootnote</span>: note appears at the footer of a page.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:note-class</span> attribute is usable with the following elements: <span class="Element">&lt;text:note&gt;</span> <a href="#element-text_note">6.3.2</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a> and <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:note-class</span> attribute are <span class="Attribute_20_Value">footnote</span> or <span class="Attribute_20_Value">endnote</span>.</p><h2 class="Heading_20_2"><a id="a19_838text_number"><span style="margin-right:0.127cm;">19.838</span></a><a id="__RefHeading__1419050_253892949"/><a id="attribute-text_number"/>text:number</h2><p class="Text_20_body">The <span class="Attribute">text:number</span> attribute specifies a number for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:number</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:number</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_839text_number-lines"><span style="margin-right:0.127cm;">19.839</span></a><a id="__RefHeading__1419052_253892949"/><a id="attribute-text_number-lines"/>text:number-lines</h2><p class="Text_20_body">The <span class="Attribute">text:number-lines</span> attribute specifies whether lines are numbered.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:number-lines</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: lines are not numbered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: lines are numbered.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a> element the default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:number-lines</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:number-lines</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_840text_number-position"><span style="margin-right:0.127cm;">19.840</span></a><a id="__RefHeading__1419054_253892949"/><a id="attribute-text_number-position"/>text:number-position</h2><p class="Text_20_body">The <span class="Attribute">text:number-position</span> attribute specifies margin where line numbers appear. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:number-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inner</span>: page numbers appear on the inner side of a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">eft</span>: page numbers appear on the left side of a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outer</span>: page numbers appear on the outer side of a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ight</span>: page numbers appear on the right side of a page<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">left</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:number-position</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:number-position</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">inner</span> or <span class="Attribute_20_Value">outer</span>.</p><h2 class="Heading_20_2"><a id="a19_841text_numbered-entries"><span style="margin-right:0.127cm;">19.841</span></a><a id="__RefHeading__1419056_253892949"/><a id="attribute-text_numbered-entries"/>text:numbered-entries</h2><p class="Text_20_body">The <span class="Attribute">text:numbered-entries</span> attribute specifies whether a number is displayed for bibliography entries instead of their short name.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:numbered-entries</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: short names for bibliographic entries displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: number displayed for bibliographic entries.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:numbered-entries</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:numbered-entries</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_842text_offset"><span style="margin-right:0.127cm;">19.842</span></a><a id="__RefHeading__1419058_253892949"/><a id="attribute-text_offset"/>text:offset</h2><p class="Text_20_body">The <span class="Attribute">text:offset</span> attribute specifies the distance between a line number and the margin.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:offset</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:offset</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a19_843text_organizations"><span style="margin-right:0.127cm;">19.843</span></a><a id="__RefHeading__1419060_253892949"/><a id="attribute-text_organizations"/>text:organizations</h2><p class="Text_20_body">The <span class="Attribute">text:organizations</span> attribute specifies one or more organizations for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:organizations</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:organizations</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_844text_outline-level"><span style="margin-right:0.127cm;">19.844</span></a><a id="__RefHeading__1419062_253892949"/><a id="attribute-text_outline-level"/>text:outline-level</h2><h3 class="Heading_20_3"><a id="a19_844_1General"><span style="margin-right:0.127cm;">19.844.1</span></a><a id="__RefHeading__1419064_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level.</p><h3 class="Heading_20_3"><a id="a19_844_2_text_alphabetical-index-entry-template_"><span style="margin-right:0.127cm;">19.844.2</span></a><a id="__RefHeading__1419066_253892949"/><a id="attribute-text_outline-level_element-text_alphabetical-index-entry-template"/>&lt;text:alphabetical-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies the level to which a template applies.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:outline-level</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">1</span>: index mark with only text but no keys assigned is assigned to level one.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">2</span>: index mark with text and one key, key is assigned to level one and index mark value is assigned to level two.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">3</span>: index mark with two keys, first key is assigned to level one, second key is assigned to level two, and the index mark value is assigned to level three.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">separator</span>: the template defines an alphabetical separator. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:outline-level</span> attribute are <span class="Attribute_20_Value">1</span>, <span class="Attribute_20_Value">2</span>, <span class="Attribute_20_Value">3</span> or <span class="Attribute_20_Value">separator</span>.</p><h3 class="Heading_20_3"><a id="a19_844_3_text_chapter_"><span style="margin-right:0.127cm;">19.844.3</span></a><a id="__RefHeading__1419068_253892949"/><a id="attribute-text_outline-level_element-text_chapter"/>&lt;text:chapter&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level to use. The <span class="Element">&lt;text:chapter&gt;</span> element displays a chapter number or title up to the specified outline level.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:chapter&gt;</span> <a href="#element-text_chapter">7.3.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_4_text_h_"><span style="margin-right:0.127cm;">19.844.4</span></a><a id="__RefHeading__1419070_253892949"/><a id="attribute-text_outline-level_element-text_h"/>&lt;text:h&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies the level of a heading, starting with 1. Headings without a level attribute are assumed to be at level 1.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_5_text_index-entry-chapter_"><span style="margin-right:0.127cm;">19.844.5</span></a><a id="__RefHeading__1419072_253892949"/><a id="attribute-text_outline-level_element-text_index-entry-chapter"/>&lt;text:index-entry-chapter&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level for an index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_6_text_index-source-styles_"><span style="margin-right:0.127cm;">19.844.6</span></a><a id="__RefHeading__1419074_253892949"/><a id="attribute-text_outline-level_element-text_index-source-styles"/>&lt;text:index-source-styles&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level for an index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:index-source-styles&gt;</span> <a href="#element-text_index-source-styles">8.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_7_text_user-index-mark_"><span style="margin-right:0.127cm;">19.844.7</span></a><a id="__RefHeading__1419076_253892949"/><a id="attribute-text_outline-level_element-text_user-index-mark"/>&lt;text:user-index-mark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level for an index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_8_text_table-of-content-entry-template_"><span style="margin-right:0.127cm;">19.844.8</span></a><a id="__RefHeading__1419078_253892949"/><a id="attribute-text_outline-level_element-text_table-of-content-entry-template"/>&lt;text:table-of-content-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies to which outline level an entry configuration applies. Outline levels shall be unique for the template elements in one index source.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_9_text_table-of-content-source_"><span style="margin-right:0.127cm;">19.844.9</span></a><a id="__RefHeading__1419080_253892949"/><a id="attribute-text_outline-level_element-text_table-of-content-source"/>&lt;text:table-of-content-source&gt; </h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies which outline levels are used when generating a table of contents. The value of this attribute shall be an integer greater than zero. If this attribute is omitted, all outline levels are used by default.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_10_text_toc-mark_"><span style="margin-right:0.127cm;">19.844.10</span></a><a id="__RefHeading__1419082_253892949"/><a id="attribute-text_outline-level_element-text_toc-mark"/>&lt;text:toc-mark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level for a table of contents index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_11_text_toc-mark-start_"><span style="margin-right:0.127cm;">19.844.11</span></a><a id="__RefHeading__1419084_253892949"/><a id="attribute-text_outline-level_element-text_toc-mark-start"/>&lt;text:toc-mark-start&gt; </h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level for a table of contents index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:toc-mark-start&gt;</span> <a href="#element-text_toc-mark-start">8.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_12_text_user-index-entry-template_"><span style="margin-right:0.127cm;">19.844.12</span></a><a id="__RefHeading__1419086_253892949"/><a id="attribute-text_outline-level_element-text_user-index-entry-template"/>&lt;text:user-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies the template applied to entries at a specified outline level in a user-defined index. All <span class="Element">&lt;text:user-index-entry-template&gt;</span> elements that are contained in the same parent element shall specify different outline levels.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_844_13_text_user-index-mark-start_"><span style="margin-right:0.127cm;">19.844.13</span></a><a id="__RefHeading__1419088_253892949"/><a id="attribute-text_outline-level_element-text_user-index-mark-start"/>&lt;text:user-index-mark-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies an outline level for a user index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-mark-start&gt;</span> <a href="#element-text_user-index-mark-start">8.1.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:outline-level</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_845text_page-adjust"><span style="margin-right:0.127cm;">19.845</span></a><a id="__RefHeading__1419090_253892949"/><a id="attribute-text_page-adjust"/>text:page-adjust</h2><h3 class="Heading_20_3"><a id="a19_845_1General"><span style="margin-right:0.127cm;">19.845.1</span></a><a id="__RefHeading__1419092_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:page-adjust</span> attribute specifies an adjustment to page numbering. </p><h3 class="Heading_20_3"><a id="a19_845_2_text_page-number_"><span style="margin-right:0.127cm;">19.845.2</span></a><a id="__RefHeading__1419094_253892949"/><a id="attribute-text_page-adjust_element-text_page-number"/>&lt;text:page-number&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:page-adjust</span> attribute specifies an adjustment of the value of a page number field, in order to display of page numbers of following or preceding pages. The specified value is added to the current page number. If a page with the resulting page number does not exist, no number is displayed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:page-adjust</span> attribute is usable with the following element: <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:page-adjust</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_845_3_text_page-variable-set_"><span style="margin-right:0.127cm;">19.845.3</span></a><a id="__RefHeading__1419096_253892949"/><a id="attribute-text_page-adjust_element-text_page-variable-set"/>&lt;text:page-variable-set&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:page-adjust</span> attribute specifies a page adjustment. The value of an active page variable is the current page number plus any page adjustment value immediately prior to the occurrence of this variable in document order.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:page-adjust</span> attribute is usable with the following element: <span class="Element">&lt;text:page-variable-set&gt;</span> <a href="#element-text_page-variable-set">7.7.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:page-adjust</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_846text_pages"><span style="margin-right:0.127cm;">19.846</span></a><a id="__RefHeading__1419098_253892949"/><a id="attribute-text_pages"/>text:pages</h2><p class="Text_20_body">The <span class="Attribute">text:pages</span> attribute specifies the page number or page numbers for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:pages</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:pages</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_847text_placeholder-type"><span style="margin-right:0.127cm;">19.847</span></a><a id="__RefHeading__1419100_253892949"/><a id="attribute-text_placeholder-type"/>text:placeholder-type</h2><p class="Text_20_body">The <span class="Attribute">text:placeholder-type</span> attribute specifies the content type of a placeholder. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:placeholder-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">image</span>: placeholder can be replaced by an image.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">o</span><span class="Attribute_20_Value">bject</span>: placeholder can be replaced by an object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">able</span>: placeholder can be replaced by a table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext</span>: placeholder can be replaced by text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext-box</span>: placeholder can be replaced by a text-box.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:placeholder-type</span> attribute is usable with the following element: <span class="Element">&lt;text:placeholder&gt;</span> <a href="#element-text_placeholder">7.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:placeholder-type</span> attribute are <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">text-box</span>, <span class="Attribute_20_Value">image</span> or <span class="Attribute_20_Value">object</span>.</p><h2 class="Heading_20_2"><a id="a19_848text_prefix"><span style="margin-right:0.127cm;">19.848</span></a><a id="__RefHeading__1419102_253892949"/><a id="attribute-text_prefix"/>text:prefix</h2><p class="Text_20_body">The <span class="Attribute">text:prefix</span> attribute specifies a string that is displayed before a bibliography entry's short name or number if it occurs outside the bibliography. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:prefix</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:prefix</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_849text_protected"><span style="margin-right:0.127cm;">19.849</span></a><a id="__RefHeading__1419104_253892949"/><a id="attribute-text_protected"/>text:protected</h2><p class="Text_20_body">The <span class="Attribute">text:protected</span> attribute specifies whether a section is protected. A section can be protected, which means that a user can not edit the section. The protection is enforced by the user interface only.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> If the section is protected and the <span class="Attribute">text:protection-key</span> attribute is present, an authorization is required for resetting the protection to enable editing. <a href="#attribute-text_protection-key">19.850</a></p><p class="Text_20_body">The defined values for the <span class="Attribute">text:protected</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: section is not protected from editing.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: section is protected from editing.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:protected</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:protected</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_850text_protection-key"><span style="margin-right:0.127cm;">19.850</span></a><a id="__RefHeading__1419106_253892949"/><a id="attribute-text_protection-key"/>text:protection-key</h2><p class="Text_20_body">The <span class="Attribute">text:protection-key</span> attribute, when present, specifies that an authorization is required for removing the protection of a section. The authentication procedure is identified by the <span class="Attribute">text:protection-key-digest-algorithm</span> attribute  <a href="#attribute-text_protection-key-digest-algorithm">19.851</a> The attribute value is binary data that may be used by the authentication procedure. </p><p class="Text_20_body">The password shall be provided as a sequence of bytes in UTF-8 encoding. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:protection-key</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:protection-key</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_851text_protection-key-digest-algorithm"><span style="margin-right:0.127cm;">19.851</span></a><a id="__RefHeading__1419108_253892949"/><a id="attribute-text_protection-key-digest-algorithm"/>text:protection-key-digest-algorithm</h2><p class="Text_20_body">The <span class="Attribute">text:protection-key-digest-algorithm</span> attribute value is an IRI that identifies an authentication procedure for removing a protection.</p><p class="Text_20_body">If the IRI identifies a message-digest algorithm specified in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a>, the value of <span class="Attribute">text:protection-key</span> attribute shall be the hash value of the password that is required to authorize removal of the protection. The password shall be provided as a sequence of bytes in UTF-8 encoding.</p><p class="Text_20_body">Any other procedures, their identifying IRIs, and their application of <span class="Attribute">text:protection-key</span> values are implementation-defined. </p><p class="Text_20_body">Consumers shall support http://www.w3.org/2000/09/xmldsig#sha1<a href="http://www.w3.org/2000/09/xmldsig#sha1,">,</a> which is the default, and http://www.w3.org/2000/09/xmldsig#sha256. They may support other algorithms described in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a> or alternative procedures. Producers should use http://www.w3.org/2000/09/xmldsig#sha256. </p><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value_20_Instance">http://www.w3.org/2000/09/xmldsig#sha1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:protection-key-digest-algorithm</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:protection-key-digest-algorithm</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h2 class="Heading_20_2"><a id="a19_852text_publisher"><span style="margin-right:0.127cm;">19.852</span></a><a id="__RefHeading__1419110_253892949"/><a id="attribute-text_publisher"/>text:publisher</h2><p class="Text_20_body">The <span class="Attribute">text:publisher</span> attribute specifies a publisher for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:publisher</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:publisher</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_853text_ref-name"><span style="margin-right:0.127cm;">19.853</span></a><a id="__RefHeading__1419112_253892949"/><a id="attribute-text_ref-name"/>text:ref-name</h2><h3 class="Heading_20_3"><a id="a19_853_1General"><span style="margin-right:0.127cm;">19.853.1</span></a><a id="__RefHeading__1419114_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute specifies a name that is used as a reference. </p><h3 class="Heading_20_3"><a id="a19_853_2_text_bookmark-ref_"><span style="margin-right:0.127cm;">19.853.2</span></a><a id="__RefHeading__1419116_253892949"/><a id="attribute-text_ref-name_element-text_bookmark-ref"/>&lt;text:bookmark-ref&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute identifies a <span class="Element">&lt;text:bookmark&gt;</span> or <span class="Element">&lt;text:bookmark-start&gt;</span> element by the value of that element's <span class="Attribute">text:name</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:ref-name</span> attribute is usable with the following element: <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:ref-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_853_3_text_note-ref_"><span style="margin-right:0.127cm;">19.853.3</span></a><a id="__RefHeading__1419118_253892949"/><a id="attribute-text_ref-name_element-text_note-ref"/>&lt;text:note-ref&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute identifies a <span class="Element">&lt;text:note&gt;</span> element by the value of that element's <span class="Attribute">text:id</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:ref-name</span> attribute is usable with the following element: <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:ref-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_853_4_text_reference-ref_"><span style="margin-right:0.127cm;">19.853.4</span></a><a id="__RefHeading__1419120_253892949"/><a id="attribute-text_ref-name_element-text_reference-ref"/>&lt;text:reference-ref&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute identifies a <span class="Element">&lt;text:reference-mark&gt;</span> or <span class="Element">&lt;text:reference-mark-start&gt;</span> element by the value of that element's <span class="Attribute">text:name</span> attribute. </p><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute identifies the element referenced by this reference field element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:ref-name</span> attribute is usable with the following element: <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:ref-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_853_5_text_sequence_"><span style="margin-right:0.127cm;">19.853.5</span></a><a id="__RefHeading__1419122_253892949"/><a id="attribute-text_ref-name_element-text_sequence"/>&lt;text:sequence&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute specifies the name for a sequence field that is the subject of a reference field. No two sequence fields can have the same reference name.</p><p class="Text_20_body">If a sequence field is not the target of a reference, this attribute can be omitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:ref-name</span> attribute is usable with the following element: <span class="Element">&lt;text:sequence&gt;</span> <a href="#element-text_sequence">7.4.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:ref-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_853_6_text_sequence-ref_"><span style="margin-right:0.127cm;">19.853.6</span></a><a id="__RefHeading__1419124_253892949"/><a id="attribute-text_ref-name_element-text_sequence-ref"/>&lt;text:sequence-ref&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:ref-name</span> attribute identifies a <span class="Element">&lt;text:sequence&gt;</span> element by the value of that element's <span class="Attribute">text:ref-name</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:ref-name</span> attribute is usable with the following element: <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:ref-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_854text_reference-format"><span style="margin-right:0.127cm;">19.854</span></a><a id="__RefHeading__1419126_253892949"/><a id="attribute-text_reference-format"/>text:reference-format</h2><p class="Text_20_body">The <span class="Attribute">text:reference-format</span> attribute specifies what information about a reference is displayed. If the reference format is not specified, the page format is used as the default.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:reference-format</span> attribute supported by all reference fields are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chapter</span>: displays the number of the chapter in which the referenced item appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">direction</span>: displays whether the referenced item is above or below the reference field.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">page</span>: displays the number of the page on which the referenced item appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">text</span>: displays the text of the referenced item.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Additional defined values for the <span class="Attribute">text:reference-format</span> attribute supported by references to sequence fields are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">caption</span>: displays the caption in which the sequence is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">category-and-value</span>: displays the name and value of the sequence.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value</span>: displays the value of the sequence.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">References to bookmarks and other references support additional values, which display the <span class="Def">list label</span> of the referenced item. If the referenced item is contained in a list or a numbered paragraph, the list label is the formatted number of the paragraph which contains the referenced item. If the referenced item is not contained in a list or numbered paragraph, the list label is empty, and the referenced field therefore displays nothing. If the referenced bookmark or reference contains more than one paragraph, the list label of the paragraph at which the bookmark or reference starts is taken.</p><p class="Text_20_body">Additional defined values for the <span class="Attribute">text:reference-format</span> attribute supported by all references to bookmark's or other reference fields are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number</span>: displays the list label of the referenced item. To unambiguously identify the referenced item at the document position of the reference field, the list label content for as many superior list levels are added in front as are required to make the reference unambiguous. The required superior levels of the referenced item are the ones, which differ from the superior levels of the document position of the reference field.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The list label of the referenced item may already contain numbers of superior levels. If this is the case, and if <span class="Formula">n</span> is the level of the most superior level contained in the list label, then no list label content of superior levels smaller or equal than <span class="Formula">n</span> are added.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number-all-superior</span>: displays the list label of the referenced item and adds the contents of all list labels of superior levels in front of it.<span class="odfLiEnd"/> </p><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>The list label of the referenced item may already contain numbers of superior levels. If this is the case, and if <span class="Formula">n</span> is the level of the most superior level contained in the list label, then <a id="DDE_LINK15"/>no list label content of superior levels smaller or equal than <span class="Formula">n</span> are added.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">number-no-superior</span>: displays the contents of the list label of the referenced item.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:reference-format</span> attribute is usable with the following elements: <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a>, <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a>, <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a> and <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a>.</p><p class="Attribute_20_Value_20_List">For <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a> elements, the values of the <span class="Attribute">text:reference-format</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">chapter</span>, <span class="Attribute_20_Value">direction</span>, <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">number-no-superior</span>, <span class="Attribute_20_Value">number-all-superior</span> or <span class="Attribute_20_Value">number</span>.</p><p class="Attribute_20_Value_20_List">For <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a> elements, the values of the <span class="Attribute">text:reference-format</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">chapter</span>, <span class="Attribute_20_Value">direction</span>, <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">number-no-superior</span>, <span class="Attribute_20_Value">number-all-superior</span> or <span class="Attribute_20_Value">number</span>.</p><p class="Attribute_20_Value_20_List">For <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a> elements, the values of the <span class="Attribute">text:reference-format</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">chapter</span>, <span class="Attribute_20_Value">direction</span> or <span class="Attribute_20_Value">text</span>.</p><p class="Attribute_20_Value_20_List_borderEnd">For <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a> elements, the values of the <span class="Attribute">text:reference-format</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">chapter</span>, <span class="Attribute_20_Value">direction</span>, <span class="Attribute_20_Value">text</span>, <span class="Attribute_20_Value">category-and-value</span>, <span class="Attribute_20_Value">caption</span> or <span class="Attribute_20_Value">value</span>.</p><h2 class="Heading_20_2"><a id="a19_855text_relative-tab-stop-position"><span style="margin-right:0.127cm;">19.855</span></a><a id="__RefHeading__1419128_253892949"/><a id="attribute-text_relative-tab-stop-position"/>text:relative-tab-stop-position</h2><p class="Text_20_body">The <span class="Attribute">text:relative-tab-stop-position</span> attribute specifies whether the position of tab stops is relative to the left margin or to the left indent as determined by the paragraph style. It is used in the specification for the generation of index entries and table of content entries.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:relative-tab-stop-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: paragraph style determines position of tab stops relative to the left margin.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: paragraph style determines the position of tab stops relative to the left ident.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:relative-tab-stop-position</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>, <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a>, <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>, <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>, <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:relative-tab-stop-position</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_856text_report-type"><span style="margin-right:0.127cm;">19.856</span></a><a id="__RefHeading__1419130_253892949"/><a id="attribute-text_report-type"/>text:report-type</h2><p class="Text_20_body">The <span class="Attribute">text:report-type</span> attribute specifies a report type for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:report-type</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:report-type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_857text_restart-numbering"><span style="margin-right:0.127cm;">19.857</span></a><a id="__RefHeading__1419132_253892949"/><a id="attribute-text_restart-numbering"/>text:restart-numbering</h2><p class="Text_20_body">The <span class="Attribute">text:restart-numbering</span> attribute specifies whether to restart the numbering of headings. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:restart-numbering</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: numbering of headings does not restart.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: numbering of headings does restart.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:restart-numbering</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:restart-numbering</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_858text_restart-on-page"><span style="margin-right:0.127cm;">19.858</span></a><a id="__RefHeading__1419134_253892949"/><a id="attribute-text_restart-on-page"/>text:restart-on-page</h2><p class="Text_20_body">The <span class="Attribute">text:restart-on-page</span> attribute specifies whether the line count is reset to 1 at the start of every page.</p><p class="Text_20_body">If the value of this attribute is <span class="Source_20_Text">true</span>, the line count is reset to 1 at the beginning of every page, resulting in page-specific numbering of lines. The default value of this attribute is <span class="Source_20_Text">false</span>, resulting in document-specific numbering of lines.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:restart-on-page</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: line count is not reset, resulting in document-specific numbering of lines.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: line count is reset to 1 at the beginning of every page, resulting in page-specific line numbering.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:restart-on-page</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:restart-on-page</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_859text_row-number"><span style="margin-right:0.127cm;">19.859</span></a><a id="__RefHeading__1419136_253892949"/><a id="attribute-text_row-number"/>text:row-number</h2><p class="Text_20_body">The <span class="Attribute">text:row-number</span> attribute specifies a row number to select when a condition is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:row-number</span> attribute is usable with the following element: <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:row-number</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_860text_school"><span style="margin-right:0.127cm;">19.860</span></a><a id="__RefHeading__1419138_253892949"/><a id="attribute-text_school"/>text:school</h2><p class="Text_20_body">The <span class="Attribute">text:school</span> attribute specifies a school for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:school</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:school</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_861text_section-name"><span style="margin-right:0.127cm;">19.861</span></a><a id="__RefHeading__1419140_253892949"/><a id="attribute-text_section-name"/>text:section-name</h2><p class="Text_20_body">The <span class="Attribute">text:section-name</span> attribute specifies a section to which a section is linked by its name. The referenced section occurs either in the document referenced by the <span class="Attribute">xlink:href</span> attribute on the same <span class="Element">&lt;text:section-source&gt;</span> element, or in the same document if the <span class="Attribute">xlink:href</span> attribute is not present. </p><p class="Text_20_body">If the <span class="Attribute">text:section-name</span> attribute is not present, the section is linked to the entire document referenced by the <span class="Attribute">xlink:href</span> attribute, unless the <span class="Attribute">xlink:href</span> attribute contains a fragment identifier. If neither the <span class="Attribute">xlink:href</span> attribute nor the <span class="Attribute">text:section-name</span> attribute is present, the <span class="Element">&lt;text:section-source&gt;</span> element shall be ignored. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:section-name</span> attribute is usable with the following element: <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:section-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_862text_series"><span style="margin-right:0.127cm;">19.862</span></a><a id="__RefHeading__1419142_253892949"/><a id="attribute-text_series"/>text:series</h2><p class="Text_20_body">The <span class="Attribute">text:series</span> attribute specifies the series for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:series</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:series</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_863text_select-page"><span style="margin-right:0.127cm;">19.863</span></a><a id="__RefHeading__1419144_253892949"/><a id="attribute-text_select-page"/>text:select-page</h2><h3 class="Heading_20_3"><a id="a19_863_1General"><span style="margin-right:0.127cm;">19.863.1</span></a><a id="__RefHeading__1419146_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:select-page</span> attribute specifies conditional display of text.</p><h3 class="Heading_20_3"><a id="a19_863_2_text_page-continuation_"><span style="margin-right:0.127cm;">19.863.2</span></a><a id="__RefHeading__1419148_253892949"/><a id="attribute-text_select-page_element-text_page-continuation"/>&lt;text:page-continuation&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:select-page</span> attribute specifies whether to check for a previous or next page and if that page exists, continuation text is printed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:select-page</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">next</span>: check for next page and if it exists, prints continuation text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">previous</span>: check for previous page and if it exists, print continuation text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:select-page</span> attribute is usable with the following element: <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:select-page</span> attribute are <span class="Attribute_20_Value">previous</span> or <span class="Attribute_20_Value">next</span>.</p><h3 class="Heading_20_3"><a id="a19_863_3_text_page-number_"><span style="margin-right:0.127cm;">19.863.3</span></a><a id="__RefHeading__1419150_253892949"/><a id="attribute-text_select-page_element-text_page-number"/>&lt;text:page-number&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:select-page</span> attribute specifies whether to display or not the number of a previous or following page rather than the number of the current page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:select-page</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">current</span>: number of the current page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">ext</span>: number of the page immediately following the current page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">revious</span>: number of the page immediately preceding the current page.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> To display the current page number on all pages except the first or last page, use a combination of the <span class="Attribute">text:select-page</span> and <span class="Attribute">text:page-adjust</span> attributes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:select-page</span> attribute is usable with the following element: <span class="Element">&lt;text:page-number&gt;</span> <a href="#element-text_page-number">7.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:select-page</span> attribute are <span class="Attribute_20_Value">previous</span>, <span class="Attribute_20_Value">current</span> or <span class="Attribute_20_Value">next</span>.</p><h2 class="Heading_20_2"><a id="a19_864text_separation-character"><span style="margin-right:0.127cm;">19.864</span></a><a id="__RefHeading__1419152_253892949"/><a id="attribute-text_separation-character"/>text:separation-character</h2><p class="Text_20_body">The <span class="Attribute">text:separation-character</span> attribute specifies the character used to separate values representing levels in an outline.</p><p class="Text_20_body">If the value of the <span class="Attribute">text:display-outline-level</span> attribute is a non-zero value, a separation character may be specified. The default separation character is <span class="Source_20_Text">"."</span> (U+002E, FULL STOP). If the value of <span class="Attribute">text:display-outline-level</span> is zero, this attribute shall be omitted.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:separation-character</span> attribute is usable with the following element: <span class="Element">&lt;text:sequence-decl&gt;</span> <a href="#element-text_sequence-decl">7.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:separation-character</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a19_865text_sort-algorithm"><span style="margin-right:0.127cm;">19.865</span></a><a id="__RefHeading__1419154_253892949"/><a id="attribute-text_sort-algorithm"/>text:sort-algorithm</h2><p class="Text_20_body">The <span class="Attribute">text:sort-algorithm</span> specifies a locale specific sorting algorithm by name.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:sort-algorithm</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a> and <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:sort-algorithm</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_866text_sort-ascending"><span style="margin-right:0.127cm;">19.866</span></a><a id="__RefHeading__1419156_253892949"/><a id="attribute-text_sort-ascending"/>text:sort-ascending</h2><p class="Text_20_body">The <span class="Attribute">text:sort-ascending</span> attribute specifies whether locale specific sorting takes place in ascending or descending order.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:sort-ascending</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: sorting takes place in descending order.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: sorting takes place in ascending order.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:sort-ascending</span> attribute is usable with the following element: <span class="Element">&lt;text:sort-key&gt;</span> <a href="#element-text_sort-key">16.29.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:sort-ascending</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_867text_sort-by-position"><span style="margin-right:0.127cm;">19.867</span></a><a id="__RefHeading__1419158_253892949"/><a id="attribute-text_sort-by-position"/>text:sort-by-position</h2><p class="Text_20_body">The <span class="Attribute">text:sort-by-position</span> attribute specifies whether bibliography entries are displayed in the order of their positions in the document, or by selected fields.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:sort-by-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: bibliographic entries are displayed in the order of their positions in a document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: bibliographic entries are displayed as sorted by selected fields. The collation order for entries sorted by fields is determined by by the attributes <span class="Attribute">fo:language</span>, <span class="Attribute">fo:country</span>, <span class="Attribute">fo:script</span>, <span class="Attribute">style:rfc-language-tag</span> and <span class="Attribute">text:sort-algorithm</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:sort-by-position</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:sort-by-position</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_868text_start-value"><span style="margin-right:0.127cm;">19.868</span></a><a id="__RefHeading__1419160_253892949"/><a id="attribute-text_start-value"/>text:start-value</h2><h3 class="Heading_20_3"><a id="a19_868_1General"><span style="margin-right:0.127cm;">19.868.1</span></a><a id="__RefHeading__1419162_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies the start value for numbering. </p><h3 class="Heading_20_3"><a id="a19_868_2_text_h_"><span style="margin-right:0.127cm;">19.868.2</span></a><a id="__RefHeading__1419164_253892949"/><a id="attribute-text_start-value_element-text_h"/>&lt;text:h&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies a value that restarts numbering at the current heading.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:start-value</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:start-value</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_868_3_text_list-item_"><span style="margin-right:0.127cm;">19.868.3</span></a><a id="__RefHeading__1419166_253892949"/><a id="attribute-text_start-value_element-text_list-item"/>&lt;text:list-item&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies a value that restarts numbering of a list at the current item. This attribute can only be applied to items in a list with a numbering list style. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:start-value</span> attribute is usable with the following element: <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:start-value</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_868_4_text_list-level-style-number_"><span style="margin-right:0.127cm;">19.868.4</span></a><a id="__RefHeading__1419168_253892949"/><a id="attribute-text_start-value_element-text_list-level-style-number"/>&lt;text:list-level-style-number&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies a value that restarts numbering at the current list level.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:start-value</span> attribute is usable with the following element: <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:start-value</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_868_5_text_notes-configuration_"><span style="margin-right:0.127cm;">19.868.5</span></a><a id="__RefHeading__1419170_253892949"/><a id="attribute-text_start-value_element-text_notes-configuration"/>&lt;text:notes-configuration&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies the value at which note numbering starts.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:start-value</span> attribute is usable with the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:start-value</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_868_6_text_numbered-paragraph_"><span style="margin-right:0.127cm;">19.868.6</span></a><a id="__RefHeading__1419172_253892949"/><a id="attribute-text_start-value_element-text_numbered-paragraph"/>&lt;text:numbered-paragraph&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies a value that restarts numbering of a numbered paragraph at the current item.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:start-value</span> attribute is usable with the following element: <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:start-value</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_868_7_text_outline-level-style_"><span style="margin-right:0.127cm;">19.868.7</span></a><a id="__RefHeading__1419174_253892949"/><a id="attribute-text_start-value_element-text_outline-level-style"/>&lt;text:outline-level-style&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:start-value</span> attribute specifies the first number of a heading item at the current level.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a> element the default value for this attribute is <span class="Attribute_20_Value_20_Instance">1</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:start-value</span> attribute is usable with the following element: <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:start-value</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_869text_start-numbering-at"><span style="margin-right:0.127cm;">19.869</span></a><a id="__RefHeading__1419176_253892949"/><a id="attribute-text_start-numbering-at"/>text:start-numbering-at</h2><p class="Text_20_body">The <span class="Attribute">text:start-numbering-at</span> attribute specifies if footnote numbers start with a new number at the beginning of the document or at the beginning of each chapter or page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:start-numbering-at</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">chapter</span>: footnote numbers start with a new number at the beginning of a chapter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">d</span><span class="Attribute_20_Value">ocument</span>: footnote numbers start with a new number at the beginning of a document. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age</span>: footnote numbers start with a new number at the beginning of a page.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:start-numbering-at</span> attribute is usable with the following element: <span class="Element">&lt;text:notes-configuration&gt;</span> <a href="#element-text_notes-configuration">16.29.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:start-numbering-at</span> attribute are <span class="Attribute_20_Value">document</span>, <span class="Attribute_20_Value">chapter</span> or <span class="Attribute_20_Value">page</span>.</p><h2 class="Heading_20_2"><a id="a19_870text_string-value-phonetic"><span style="margin-right:0.127cm;">19.870</span></a><a id="__RefHeading__1419178_253892949"/><a id="attribute-text_string-value-phonetic"/>text:string-value-phonetic</h2><p class="Text_20_body">The <span class="Attribute">text:string-value-phonetic</span> attribute specifies a phonetic description of a word.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value-phonetic</span> attribute is usable with the following elements: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a> and <span class="Element">&lt;text:alphabetical-index-mark-start&gt;</span> <a href="#element-text_alphabetical-index-mark-start">8.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value-phonetic</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_871text_string-value"><span style="margin-right:0.127cm;">19.871</span></a><a id="__RefHeading__1419180_253892949"/><a id="attribute-text_string-value"/>text:string-value</h2><h3 class="Heading_20_3"><a id="a19_871_1General"><span style="margin-right:0.127cm;">19.871.1</span></a><a id="__RefHeading__1419182_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:string-value</span> attribute specifies text for display. </p><h3 class="Heading_20_3"><a id="a19_871_2_text_alphabetical-index-mark_"><span style="margin-right:0.127cm;">19.871.2</span></a><a id="__RefHeading__1419184_253892949"/><a id="attribute-text_string-value_element-text_alphabetical-index-mark"/>&lt;text:alphabetical-index-mark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:string-value</span> attribute specifies text to be displayed in an alphabetical index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-mark&gt;</span> <a href="#element-text_alphabetical-index-mark">8.1.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_871_3_text_hidden-text_"><span style="margin-right:0.127cm;">19.871.3</span></a><a id="__RefHeading__1419186_253892949"/><a id="attribute-text_string-value_element-text_hidden-text"/>&lt;text:hidden-text&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:string-value</span> attribute specifies the text to display if a <span class="Attribute">text:condition</span> attribute has the value of <span class="Attribute_20_Value">false</span>. If this attribute is omitted, the element content is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value</span> attribute is usable with the following element: <span class="Element">&lt;text:hidden-text&gt;</span> <a href="#element-text_hidden-text">7.7.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_871_4_text_page-continuation_"><span style="margin-right:0.127cm;">19.871.4</span></a><a id="__RefHeading__1419188_253892949"/><a id="attribute-text_string-value_element-text_page-continuation"/>&lt;text:page-continuation&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:string-value</span> attribute specifies continuation text to display. If this attribute is omitted, the element content is used.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value</span> attribute is usable with the following element: <span class="Element">&lt;text:page-continuation&gt;</span> <a href="#element-text_page-continuation">7.3.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_871_5_text_toc-mark_"><span style="margin-right:0.127cm;">19.871.5</span></a><a id="__RefHeading__1419190_253892949"/><a id="attribute-text_string-value_element-text_toc-mark"/>&lt;text:toc-mark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:string-value</span> attribute specifies text to be displayed in a table of contents.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value</span> attribute is usable with the following element: <span class="Element">&lt;text:toc-mark&gt;</span> <a href="#element-text_toc-mark">8.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a19_871_6_text_user-index-mark_"><span style="margin-right:0.127cm;">19.871.6</span></a><a id="__RefHeading__1419192_253892949"/><a id="attribute-text_string-value_element-text_user-index-mark"/>&lt;text:user-index-mark&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:string-value</span> attribute specifies text to be displayed in an index.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-mark&gt;</span> <a href="#element-text_user-index-mark">8.1.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_872text_string-value-if-false"><span style="margin-right:0.127cm;">19.872</span></a><a id="__RefHeading__1419194_253892949"/><a id="attribute-text_string-value-if-false"/>text:string-value-if-false</h2><p class="Text_20_body">The <span class="Attribute">text:string-value-if-false</span> attribute specifies text string to display if a condition is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value-if-false</span> attribute is usable with the following element: <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value-if-false</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_873text_string-value-if-true"><span style="margin-right:0.127cm;">19.873</span></a><a id="__RefHeading__1419196_253892949"/><a id="attribute-text_string-value-if-true"/>text:string-value-if-true</h2><p class="Text_20_body">The <span class="Attribute">text:string-value-if-true</span> attribute specifies a text string to display if a condition is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:string-value-if-true</span> attribute is usable with the following element: <span class="Element">&lt;text:conditional-text&gt;</span> <a href="#element-text_conditional-text">7.7.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:string-value-if-true</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_874text_style-name"><span style="margin-right:0.127cm;">19.874</span></a><a id="__RefHeading__1419198_253892949"/><a id="attribute-text_style-name"/>text:style-name</h2><h3 class="Heading_20_3"><a id="a19_874_1General"><span style="margin-right:0.127cm;">19.874.1</span></a><a id="__RefHeading__1419200_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a style by name, with the additional requirement that it belong to a family of styles. </p><h3 class="Heading_20_3"><a id="a19_874_2_text_a_"><span style="margin-right:0.127cm;">19.874.2</span></a><a id="__RefHeading__1419202_253892949"/><a id="attribute-text_style-name_element-text_a"/>&lt;text:a&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a text style for an unvisited hyperlink. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_3_text_alphabetical-index_"><span style="margin-right:0.127cm;">19.874.3</span></a><a id="__RefHeading__1419204_253892949"/><a id="attribute-text_style-name_element-text_alphabetical-index"/>&lt;text:alphabetical-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a section family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_4_text_alphabetical-index-entry-template_"><span style="margin-right:0.127cm;">19.874.4</span></a><a id="__RefHeading__1419206_253892949"/><a id="attribute-text_style-name_element-text_alphabetical-index-entry-template"/>&lt;text:alphabetical-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-entry-template&gt;</span> <a href="#element-text_alphabetical-index-entry-template">8.8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_5_text_bibliography_"><span style="margin-right:0.127cm;">19.874.5</span></a><a id="__RefHeading__1419208_253892949"/><a id="attribute-text_style-name_element-text_bibliography"/>&lt;text:bibliography&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a section family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_6_text_bibliography-entry-template_"><span style="margin-right:0.127cm;">19.874.6</span></a><a id="__RefHeading__1419210_253892949"/><a id="attribute-text_style-name_element-text_bibliography-entry-template"/>&lt;text:bibliography-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-entry-template&gt;</span> <a href="#element-text_bibliography-entry-template">8.9.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_7_text_h_"><span style="margin-right:0.127cm;">19.874.7</span></a><a id="__RefHeading__1419212_253892949"/><a id="attribute-text_style-name_element-text_h"/>&lt;text:h&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a style that shall have the family paragraph. If a conditional style is applied, this attribute has the name of the style that was the result of the conditional style evaluation. </p><p class="Text_20_body">If both <span class="Attribute">text:style-name</span> and <span class="Attribute">text:class-names</span> are present, the style referenced by the <span class="Attribute">text:style-name</span> attribute is treated as the first style in the list in <span class="Attribute">text:class-names</span>. Consumers should support the <span class="Attribute">text:class-names</span> attribute and also should preserve it while editing.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_8_text_illustration-index_"><span style="margin-right:0.127cm;">19.874.8</span></a><a id="__RefHeading__1419214_253892949"/><a id="attribute-text_style-name_element-text_illustration-index"/>&lt;text:illustration-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a section family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_9_text_illustration-index-entry-template_"><span style="margin-right:0.127cm;">19.874.9</span></a><a id="__RefHeading__1419216_253892949"/><a id="attribute-text_style-name_element-text_illustration-index-entry-template"/>&lt;text:illustration-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:illustration-index-entry-template&gt;</span> <a href="#element-text_illustration-index-entry-template">8.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_10_text_index-entry-bibliography_"><span style="margin-right:0.127cm;">19.874.10</span></a><a id="__RefHeading__1419218_253892949"/><a id="attribute-text_style-name_element-text_index-entry-bibliography"/>&lt;text:index-entry-bibliography&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-bibliography&gt;</span> <a href="#element-text_index-entry-bibliography">8.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_11_text_index-entry-chapter_"><span style="margin-right:0.127cm;">19.874.11</span></a><a id="__RefHeading__1419220_253892949"/><a id="attribute-text_style-name_element-text_index-entry-chapter"/>&lt;text:index-entry-chapter&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_12_text_index-entry-link-end_"><span style="margin-right:0.127cm;">19.874.12</span></a><a id="__RefHeading__1419222_253892949"/><a id="attribute-text_style-name_element-text_index-entry-link-end"/>&lt;text:index-entry-link-end&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-link-end&gt;</span> <a href="#element-text_index-entry-link-end">8.13.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_13_text_index-entry-link-start_"><span style="margin-right:0.127cm;">19.874.13</span></a><a id="__RefHeading__1419224_253892949"/><a id="attribute-text_style-name_element-text_index-entry-link-start"/>&lt;text:index-entry-link-start&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-link-start&gt;</span> <a href="#element-text_index-entry-link-start">8.13.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_14_text_index-entry-page-number_"><span style="margin-right:0.127cm;">19.874.14</span></a><a id="__RefHeading__1419226_253892949"/><a id="attribute-text_style-name_element-text_index-entry-page-number"/>&lt;text:index-entry-page-number&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-page-number&gt;</span> <a href="#element-text_index-entry-page-number">8.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_15_text_index-entry-span_"><span style="margin-right:0.127cm;">19.874.15</span></a><a id="__RefHeading__1419228_253892949"/><a id="attribute-text_style-name_element-text_index-entry-span"/>&lt;text:index-entry-span&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-span&gt;</span> <a href="#element-text_index-entry-span">8.13.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_16_text_index-entry-tab-stop_"><span style="margin-right:0.127cm;">19.874.16</span></a><a id="__RefHeading__1419230_253892949"/><a id="attribute-text_style-name_element-text_index-entry-tab-stop"/>&lt;text:index-entry-tab-stop&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_17_text_index-entry-text_"><span style="margin-right:0.127cm;">19.874.17</span></a><a id="__RefHeading__1419232_253892949"/><a id="attribute-text_style-name_element-text_index-entry-text"/>&lt;text:index-entry-text&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-entry-text&gt;</span> <a href="#element-text_index-entry-text">8.13.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_18_text_index-source-style_"><span style="margin-right:0.127cm;">19.874.18</span></a><a id="__RefHeading__1419234_253892949"/><a id="attribute-text_style-name_element-text_index-source-style"/>&lt;text:index-source-style&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-source-style&gt;</span> <a href="#element-text_index-source-style">8.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleName</span> <a href="#datatype-styleName">18.3.31</a>.</p><h3 class="Heading_20_3"><a id="a19_874_19_text_index-title_"><span style="margin-right:0.127cm;">19.874.19</span></a><a id="__RefHeading__1419236_253892949"/><a id="attribute-text_style-name_element-text_index-title"/>&lt;text:index-title&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies section family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_20_text_index-title-template_"><span style="margin-right:0.127cm;">19.874.20</span></a><a id="__RefHeading__1419238_253892949"/><a id="attribute-text_style-name_element-text_index-title-template"/>&lt;text:index-title-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:index-title-template&gt;</span> <a href="#element-text_index-title-template">8.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_21_text_linenumbering-configuration_"><span style="margin-right:0.127cm;">19.874.21</span></a><a id="__RefHeading__1419240_253892949"/><a id="attribute-text_style-name_element-text_linenumbering-configuration"/>&lt;text:linenumbering-configuration&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a <span class="Attribute_20_Value">text</span> style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:linenumbering-configuration&gt;</span> <a href="#element-text_linenumbering-configuration">16.29.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_22_text_list_"><span style="margin-right:0.127cm;">19.874.22</span></a><a id="__RefHeading__1419242_253892949"/><a id="attribute-text_style-name_element-text_list"/>&lt;text:list&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies the name of a list style that is applied to a list.</p><p class="Text_20_body">If this attribute is not included and therefore no list style is specified, one of the following actions is taken:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If a list is contained within another list, the list style defaults to the style of the surrounding list.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If there is no list style specified for the surrounding list, but the list's list items contain paragraphs that have paragraph styles attached specifying a list style, that list style is used. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>An implementation-dependent default list style is used.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">To determine which formatting properties are applied to a list, the list level and list style name are taken into account. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_23_text_list-level-style-number_"><span style="margin-right:0.127cm;">19.874.23</span></a><a id="__RefHeading__1419244_253892949"/><a id="attribute-text_style-name_element-text_list-level-style-number"/>&lt;text:list-level-style-number&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a <span class="Attribute_20_Value">text</span> style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:list-level-style-number&gt;</span> <a href="#element-text_list-level-style-number">16.32</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_24_text_list-level-style-bullet_"><span style="margin-right:0.127cm;">19.874.24</span></a><a id="__RefHeading__1419246_253892949"/><a id="attribute-text_style-name_element-text_list-level-style-bullet"/>&lt;text:list-level-style-bullet&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:list-level-style-bullet&gt;</span> <a href="#element-text_list-level-style-bullet">16.31</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_25_text_numbered-paragraph_"><span style="margin-right:0.127cm;">19.874.25</span></a><a id="__RefHeading__1419248_253892949"/><a id="attribute-text_style-name_element-text_numbered-paragraph"/>&lt;text:numbered-paragraph&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies the name of a list style that is applied to a list.</p><p class="Text_20_body">If this attribute is not included and therefore no list style is specified, one of the following actions is taken:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If the list is contained within another list, the list style defaults to the style of the surrounding list.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>If there is no list style specified for the surrounding list, but the list contains paragraphs that have paragraph styles attached specifying a list style, this list style is used for any of these paragraphs.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>An implementation-dependent default list style is applied to any other paragraphs.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">To determine which formatting properties are applied to a list, the list level and list style name are taken into account. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_26_text_object-index_"><span style="margin-right:0.127cm;">19.874.26</span></a><a id="__RefHeading__1419250_253892949"/><a id="attribute-text_style-name_element-text_object-index"/>&lt;text:object-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies section family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_27_text_object-index-entry-template_"><span style="margin-right:0.127cm;">19.874.27</span></a><a id="__RefHeading__1419252_253892949"/><a id="attribute-text_style-name_element-text_object-index-entry-template"/>&lt;text:object-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index-entry-template&gt;</span> <a href="#element-text_object-index-entry-template">8.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_28_text_outline-level-style_"><span style="margin-right:0.127cm;">19.874.28</span></a><a id="__RefHeading__1419254_253892949"/><a id="attribute-text_style-name_element-text_outline-level-style"/>&lt;text:outline-level-style&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies character family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:outline-level-style&gt;</span> <a href="#element-text_outline-level-style">16.35</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_29_text_p_"><span style="margin-right:0.127cm;">19.874.29</span></a><a id="__RefHeading__1419256_253892949"/><a id="attribute-text_style-name_element-text_p"/>&lt;text:p&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a style that shall have the family paragraph. If a conditional style is applied, this attribute has the name of the style that was the result of the conditional style evaluation. </p><p class="Text_20_body">If both <span class="Attribute">text:style-name</span> and <span class="Attribute">text:class-names</span> are present, the style referenced by the <span class="Attribute">text:style-name</span> attribute is treated as the first style in the list in <span class="Attribute">text:class-names</span>. Consumers should support the <span class="Attribute">text:class-names</span> attribute and also should preserve it while editing.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_30_text_ruby_"><span style="margin-right:0.127cm;">19.874.30</span></a><a id="__RefHeading__1419258_253892949"/><a id="attribute-text_style-name_element-text_ruby"/>&lt;text:ruby&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a style for ruby which shall be a style with family of ruby.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:ruby&gt;</span> <a href="#element-text_ruby">6.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_31_text_ruby-text_"><span style="margin-right:0.127cm;">19.874.31</span></a><a id="__RefHeading__1419260_253892949"/><a id="attribute-text_style-name_element-text_ruby-text"/>&lt;text:ruby-text&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a style for ruby which shall be a style with family of text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:ruby-text&gt;</span> <a href="#element-text_ruby-text">6.4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_32_text_section_"><span style="margin-right:0.127cm;">19.874.32</span></a><a id="__RefHeading__1419262_253892949"/><a id="attribute-text_style-name_element-text_section"/>&lt;text:section&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a section family style for a section.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_33_text_span_"><span style="margin-right:0.127cm;">19.874.33</span></a><a id="__RefHeading__1419264_253892949"/><a id="attribute-text_style-name_element-text_span"/>&lt;text:span&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies style for span which shall be a style with family of <span class="Attribute_20_Value">text</span>.</p><p class="Text_20_body">If both <span class="Attribute">text:style-name</span> and <span class="Attribute">text:class-names</span> are present, the style referenced by the <span class="Attribute">text:style-name</span> attribute is treated as the first style in the list in <span class="Attribute">text:class-names</span>. Consumers should support the <span class="Attribute">text:class-names</span> attribute and also should preserve it while editing.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:span&gt;</span> <a href="#element-text_span">6.1.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_34_text_table-index-entry-template_"><span style="margin-right:0.127cm;">19.874.34</span></a><a id="__RefHeading__1419266_253892949"/><a id="attribute-text_style-name_element-text_table-index-entry-template"/>&lt;text:table-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-index-entry-template&gt;</span> <a href="#element-text_table-index-entry-template">8.5.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_35_text_table-of-content_"><span style="margin-right:0.127cm;">19.874.35</span></a><a id="__RefHeading__1419268_253892949"/><a id="attribute-text_style-name_element-text_table-of-content"/>&lt;text:table-of-content&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a section family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_36_text_table-of-content-entry-template_"><span style="margin-right:0.127cm;">19.874.36</span></a><a id="__RefHeading__1419270_253892949"/><a id="attribute-text_style-name_element-text_table-of-content-entry-template"/>&lt;text:table-of-content-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-of-content-entry-template&gt;</span> <a href="#element-text_table-of-content-entry-template">8.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_37_text_table-index_"><span style="margin-right:0.127cm;">19.874.37</span></a><a id="__RefHeading__1419272_253892949"/><a id="attribute-text_style-name_element-text_table-index"/>&lt;text:table-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies section family styles.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_38_text_user-index_"><span style="margin-right:0.127cm;">19.874.38</span></a><a id="__RefHeading__1419274_253892949"/><a id="attribute-text_style-name_element-text_user-index"/>&lt;text:user-index&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a section family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h3 class="Heading_20_3"><a id="a19_874_39_text_user-index-entry-template_"><span style="margin-right:0.127cm;">19.874.39</span></a><a id="__RefHeading__1419276_253892949"/><a id="attribute-text_style-name_element-text_user-index-entry-template"/>&lt;text:user-index-entry-template&gt;</h3><p class="Text_20_body">The <span class="Attribute">text:style-name</span> attribute specifies a paragraph family style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-entry-template&gt;</span> <a href="#element-text_user-index-entry-template">8.7.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_875text_style-override"><span style="margin-right:0.127cm;">19.875</span></a><a id="__RefHeading__1419278_253892949"/><a id="attribute-text_style-override"/>text:style-override</h2><p class="Text_20_body">The <span class="Attribute">text:style-override</span> attribute specifies an override to the list style to be applied to a list item. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:style-override</span> attribute is usable with the following element: <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:style-override</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_876text_suffix"><span style="margin-right:0.127cm;">19.876</span></a><a id="__RefHeading__1419280_253892949"/><a id="attribute-text_suffix"/>text:suffix</h2><p class="Text_20_body">The <span class="Attribute">text:suffix</span> attribute specifies a string that is displayed after a bibliography entry's short name or number if it occurs outside the bibliography. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:suffix</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-configuration&gt;</span> <a href="#element-text_bibliography-configuration">16.29.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:suffix</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_877text_tab-ref"><span style="margin-right:0.127cm;">19.877</span></a><a id="__RefHeading__1419282_253892949"/><a id="attribute-text_tab-ref"/>text:tab-ref</h2><p class="Text_20_body">The <span class="Attribute">text:tab-ref</span> attribute contains the number of the tab-stop to which a tab character refers. The position 0 marks the start margin of a paragraph.</p><p class="Note"><span class="Note_20_Label">Note:</span> The <span class="Attribute">text:tab-ref</span> attribute is only a hint to help non-layout oriented consumers to determine the tab/tab-stop association. Layout oriented consumers should determine the tab positions based on the style information.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:tab-ref</span> attribute is usable with the following element: <span class="Element">&lt;text:tab&gt;</span> <a href="#element-text_tab">6.1.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:tab-ref</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_878text_table-name"><span style="margin-right:0.127cm;">19.878</span></a><a id="__RefHeading__1419284_253892949"/><a id="attribute-text_table-name"/>text:table-name</h2><p class="Text_20_body">The <span class="Attribute">text:table-name</span> attribute specifies a table within a source database.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:table-name</span> attribute is usable with the following elements: <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a> and <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:table-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_879text_table-type"><span style="margin-right:0.127cm;">19.879</span></a><a id="__RefHeading__1419286_253892949"/><a id="attribute-text_table-type"/>text:table-type</h2><p class="Text_20_body">The <span class="Attribute">text:table-type</span> attribute specifies the type of reference made by to a database. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:table-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>table : the value of the <span class="Attribute">text:table-name</span> attribute is the name of a database table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>query : the value of the <span class="Attribute">text:table-name</span> attribute is the name of a database query.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>command : the value of the <span class="Attribute">text:table-name</span> attribute is an SQL statement.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:table-type</span> attribute is usable with the following elements: <span class="Element">&lt;text:database-display&gt;</span> <a href="#element-text_database-display">7.6.3</a>, <span class="Element">&lt;text:database-name&gt;</span> <a href="#element-text_database-name">7.6.7</a>, <span class="Element">&lt;text:database-next&gt;</span> <a href="#element-text_database-next">7.6.4</a>, <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a> and <span class="Element">&lt;text:database-row-select&gt;</span> <a href="#element-text_database-row-select">7.6.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:table-type</span> attribute are <span class="Attribute_20_Value">table</span>, <span class="Attribute_20_Value">query</span> or <span class="Attribute_20_Value">command</span>.</p><h2 class="Heading_20_2"><a id="a19_880text_time-adjust"><span style="margin-right:0.127cm;">19.880</span></a><a id="__RefHeading__1419288_253892949"/><a id="attribute-text_time-adjust"/>text:time-adjust</h2><p class="Text_20_body">The <span class="Attribute">text:time-adjust</span> attribute specifies an adjustment of the value of a time by a specific time period. Positive values adjust the time to a time in the future, while negative values adjust the time to a time in the past. Duration values are truncated to full minutes.</p><p class="Note"><span class="Note_20_Label">Note:</span> Truncation of time values is defined by <span class="Attribute">number:truncate-on-overflow</span>. <a href="#attribute-number_truncate-on-overflow">19.365</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:time-adjust</span> attribute is usable with the following element: <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:time-adjust</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_881text_time-value"><span style="margin-right:0.127cm;">19.881</span></a><a id="__RefHeading__1419290_253892949"/><a id="attribute-text_time-value"/>text:time-value</h2><p class="Text_20_body">The <span class="Attribute">text:time-value</span> attribute specifies the time at which a document was last edited.</p><p class="Text_20_body">If no value is specified, whether the field is marked as fixed or not, the current time is assumed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:time-value</span> attribute is usable with the following elements: <span class="Element">&lt;text:creation-time&gt;</span> <a href="#element-text_creation-time">7.5.4</a>, <span class="Element">&lt;text:modification-time&gt;</span> <a href="#element-text_modification-time">7.5.15</a>, <span class="Element">&lt;text:print-time&gt;</span> <a href="#element-text_print-time">7.5.7</a> and <span class="Element">&lt;text:time&gt;</span> <a href="#element-text_time">7.3.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:time-value</span> attribute has the data type <span class="Datatype">timeOrDateTime</span> <a href="#datatype-timeOrDateTime">18.3.36</a>.</p><h2 class="Heading_20_2"><a id="a19_882text_title"><span style="margin-right:0.127cm;">19.882</span></a><a id="__RefHeading__1419292_253892949"/><a id="attribute-text_title"/>text:title</h2><p class="Text_20_body">The <span class="Attribute">text:title</span> attribute specifies a title for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:title</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_883text_track-changes"><span style="margin-right:0.127cm;">19.883</span></a><a id="__RefHeading__1419294_253892949"/><a id="attribute-text_track-changes"/>text:track-changes</h2><p class="Text_20_body">The <span class="Attribute">text:track-changes</span> attribute specifies whether changes to the document should be tracked and recorded.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:sort-ascending</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: changes are not tracked.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: changes are tracked.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:track-changes</span> attribute is usable with the following element: <span class="Element">&lt;text:tracked-changes&gt;</span> <a href="#element-text_tracked-changes">5.5.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:track-changes</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_884text_url"><span style="margin-right:0.127cm;">19.884</span></a><a id="__RefHeading__1419296_253892949"/><a id="attribute-text_url"/>text:url</h2><p class="Text_20_body">The <span class="Attribute">text:url</span> attribute specifies an IRI for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:url</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:url</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_885text_use-caption"><span style="margin-right:0.127cm;">19.885</span></a><a id="__RefHeading__1419298_253892949"/><a id="attribute-text_use-caption"/>text:use-caption</h2><p class="Text_20_body">The <span class="Attribute">text:use-caption</span> attribute specifies whether captions or names of illustrations or tables are used for an index. </p><p class="Text_20_body">The defined values of the <span class="Attribute">text:use-caption</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: illustration or table names are used for an index.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: illustration or table captions are used for an index.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-caption</span> attribute is usable with the following elements: <span class="Element">&lt;text:illustration-index-source&gt;</span> <a href="#element-text_illustration-index-source">8.4.2</a> and <span class="Element">&lt;text:table-index-source&gt;</span> <a href="#element-text_table-index-source">8.5.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-caption</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_886text_use-chart-objects"><span style="margin-right:0.127cm;">19.886</span></a><a id="__RefHeading__1419300_253892949"/><a id="attribute-text_use-chart-objects"/>text:use-chart-objects</h2><p class="Text_20_body">The <span class="Attribute">text:use-chart-objects</span> attribute specifies whether to include embedded chart objects in an index of objects. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-chart-objects</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: object is not included in index of objects.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: object is included in index of objects.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-chart-objects</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-chart-objects</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_887text_use-draw-objects"><span style="margin-right:0.127cm;">19.887</span></a><a id="__RefHeading__1419302_253892949"/><a id="attribute-text_use-draw-objects"/>text:use-draw-objects</h2><p class="Text_20_body">The <span class="Attribute">text:use-draw-objects</span> attributes specifies whether embedded draw objects (defined by <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a> elements) will be included in an index of objects. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-draw-objects</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: draw objects not included in an index of objects.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: draw objects included in an index of objects.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-draw-objects</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-draw-objects</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_888text_use-floating-frames"><span style="margin-right:0.127cm;">19.888</span></a><a id="__RefHeading__1419304_253892949"/><a id="attribute-text_use-floating-frames"/>text:use-floating-frames</h2><p class="Text_20_body">The <span class="Attribute">text:use-floating-frames</span> attribute specifies whether text boxes will be included n user-defined indexes. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-floating-frames</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text boxes not included in user-defined indexes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text boxes included in user-defined indexes.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-floating-frames</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-floating-frames</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_889text_use-graphics"><span style="margin-right:0.127cm;">19.889</span></a><a id="__RefHeading__1419306_253892949"/><a id="attribute-text_use-graphics"/>text:use-graphics</h2><p class="Text_20_body">The <span class="Attribute">text:use-graphics</span> attribute specifies whether graphics are include in user-defined indexes. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-graphics</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: graphics are not included in user-defined indexes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: graphics are included in user-defined indexes.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-graphics</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-graphics</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_890text_use-index-marks"><span style="margin-right:0.127cm;">19.890</span></a><a id="__RefHeading__1419308_253892949"/><a id="attribute-text_use-index-marks"/>text:use-index-marks</h2><p class="Text_20_body">The <span class="Attribute">text:use-index-marks</span> attribute specifies whether table of contents index marks are used to generate index entries. The <span class="Attribute">text:outline-level</span> attribute specifies up to which level index marks are being included.<a href="#attribute-text_outline-level">19.844</a></p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-index-marks</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table of contents does not include entries generated from table of contents index marks.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table of contents does include entries generated from table of contents index marks.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a> element the default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-index-marks</span> attribute is usable with the following elements: <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-index-marks</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_891text_use-index-source-styles"><span style="margin-right:0.127cm;">19.891</span></a><a id="__RefHeading__1419310_253892949"/><a id="attribute-text_use-index-source-styles"/>text:use-index-source-styles</h2><p class="Text_20_body">The <span class="Attribute">text:use-index-source-styles</span> attribute specifies whether index entries are generated for paragraphs formatted using the paragraph styles listed in the <span class="Element">&lt;text:index-source-styles&gt;</span> element.</p><p class="Text_20_body">The <span class="Attribute">text:outline-level</span> attribute specifies up to which level index source styles are being included. <a href="#attribute-text_outline-level">19.844</a> </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-index-source-styles</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: index entries are not generated for paragraphs formatted using the paragraph styles listed in a <span class="Element">&lt;text:index-source-styles&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: index entries are generated for paragraphs formatted using the paragraph styles listed in a <span class="Element">&lt;text:index-source-styles&gt;</span> element.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a> element the default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-index-source-styles</span> attribute is usable with the following elements: <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a> and <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-index-source-styles</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_892text_use-keys-as-entries"><span style="margin-right:0.127cm;">19.892</span></a><a id="__RefHeading__1419312_253892949"/><a id="attribute-text_use-keys-as-entries"/>text:use-keys-as-entries</h2><p class="Text_20_body">The <span class="Attribute">text:use-keys-as-entries</span> attribute specifies the use of the up to two keys for an index mark as entries in the index. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-keys-as-entries</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: additional keys are used as sub entries.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: additional keys are used as additional entries.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-keys-as-entries</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-source&gt;</span> <a href="#element-text_alphabetical-index-source">8.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-keys-as-entries</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_893text_use-math-objects"><span style="margin-right:0.127cm;">19.893</span></a><a id="__RefHeading__1419314_253892949"/><a id="attribute-text_use-math-objects"/>text:use-math-objects</h2><p class="Text_20_body">The <span class="Attribute">text:use-math-objects</span> attribute specifies whether embedded math objects are included in an index of objects. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-math-objects</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: math objects are not included in an index of objects.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: math objects are included in an index of objects.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-math-objects</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-math-objects</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_894text_use-objects"><span style="margin-right:0.127cm;">19.894</span></a><a id="__RefHeading__1419316_253892949"/><a id="attribute-text_use-objects"/>text:use-objects</h2><p class="Text_20_body">The <span class="Attribute">text:use-objects</span> attributes specifies whether an object is included in a user defined index. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-objects</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: objects are not included in a user define index.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: objects are included in a user defined index.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-objects</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-objects</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_895text_use-other-objects"><span style="margin-right:0.127cm;">19.895</span></a><a id="__RefHeading__1419318_253892949"/><a id="attribute-text_use-other-objects"/>text:use-other-objects</h2><p class="Text_20_body">The <span class="Attribute">text:use-other-objects</span> attribute specifies whether other embedded objects are included in an index of objects. Other objects are those not covered by <span class="Attribute">text:use-chart-</span><span class="Attribute">objects</span>, <span class="Attribute">text:use-draw-objects</span>, <span class="Attribute">text:use-math-objects</span>, and <span class="Attribute">text:use-spreadsheet-objects</span> attributes. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-other-objects</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: other objects are not included in an index of objects.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: other objects are included in an index of objects.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-other-objects</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-other-objects</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_896text_use-outline-level"><span style="margin-right:0.127cm;">19.896</span></a><a id="__RefHeading__1419320_253892949"/><a id="attribute-text_use-outline-level"/>text:use-outline-level</h2><p class="Text_20_body">The <span class="Attribute">text:use-outline-level</span> attribute specifies whether headings are used to generate index entries. The <span class="Attribute">text:outline-level</span> attribute specifies up to which level headings are being included. <a href="#attribute-text_outline-level">19.844</a></p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-outline-level</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table of contents does not include entries generated from headings.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table of contents does include entries generated from headings.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">true</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-outline-level</span> attribute is usable with the following element: <span class="Element">&lt;text:table-of-content-source&gt;</span> <a href="#element-text_table-of-content-source">8.3.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-outline-level</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_897text_use-soft-page-breaks"><span style="margin-right:0.127cm;">19.897</span></a><a id="__RefHeading__1419322_253892949"/><a id="attribute-text_use-soft-page-breaks"/>text:use-soft-page-breaks</h2><p class="Text_20_body">The <span class="Attribute">text:use-soft-page-breaks</span> attribute specifies whether a document contains soft page breaks.</p><p class="Text_20_body">A soft page break is a page break that has been included in a document by a page oriented consumer at a position where the document itself does not include a page break as defined by <span class="Attribute">fo:break-after</span> <a href="#property-fo_break-before">20.178</a> or <span class="Attribute">fo:break-before</span> <a href="#property-fo_break-before">20.178</a>. </p><p class="Text_20_body">Soft page breaks are specified by the <span class="Element">&lt;text:soft-page-break&gt;</span> element.</p><p class="Text_20_body">OpenDocument producers need not produce<span class="Element">&lt;text:soft-page-break&gt;</span> elements. They <span class="ISO_20_Keyword">may</span> include them if they have computed a paginated layout. Consumers <span class="ISO_20_Keyword">may</span> handle the element while computing the layout, but it <span class="ISO_20_Keyword">shall not</span> depend on its existence. Soft page breaks are only defined for text documents.</p><p class="Text_20_body">Producers that store soft page breaks <span class="ISO_20_Keyword">shall</span> indicate this by setting the <span class="Attribute">text:use-soft-page-breaks</span> attribute to <span class="Attribute_20_Value">true</span>. Producers that do not store soft page breaks <span class="ISO_20_Keyword">shall</span> indicate that by omitting this attribute, or by setting it to false.</p><p class="Text_20_body">A producer that does not support pagination and soft page-breaks and that modifies an OpenDocument file, which includes soft page-breaks, <span class="ISO_20_Keyword">shall</span> set the <span class="Attribute">text:use-soft-page-breaks</span> attribute to <span class="Attribute_20_Value">false</span> (or remove it). It <span class="ISO_20_Keyword">should</span> also remove the <span class="Element">&lt;text:soft-page-break&gt;</span> elements from the document.</p><p class="Text_20_body">Producers that compute a paginated layout of a document <span class="ISO_20_Keyword">should</span> provide a facility for the export of soft page breaks for the purposes of consistent page breaks and for  conversion to talking book formats ( <a title="ANSI/NISO Z39.86-2005 Specifications for the Digital Talking Book" href="http://www.niso.org/standards/resources/Z39-86-2005.html">[DAISY]</a>).</p><p class="Text_20_body">For <span class="Element">&lt;text:soft-page-break&gt;</span> elements that appear within table rows, the maximum number of <span class="Element">&lt;text:soft-page-break&gt;</span> elements that appear within the single table cells determines the number of page breaks that appear within the table row. The <span class="Element">&lt;text:soft-page-break&gt;</span> elements contained in each cell determine the positions where these page breaks appear within the cell content.</p><p class="Text_20_body">When <span class="Element">&lt;text:soft-page-break&gt;</span> elements appear within text boxes and other content displayed outside the text flow, they do not start a new page, but only indicate where the text-box's content breaks between two pages.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-soft-page-breaks</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: soft page breaks not supported.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: soft page breaks supported.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-soft-page-breaks</span> attribute is usable with the following element: <span class="Element">&lt;office:text&gt;</span> <a href="#element-office_text">3.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-soft-page-breaks</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_898text_use-spreadsheet-objects"><span style="margin-right:0.127cm;">19.898</span></a><a id="__RefHeading__1419324_253892949"/><a id="attribute-text_use-spreadsheet-objects"/>text:use-spreadsheet-objects</h2><p class="Text_20_body">The <span class="Attribute">text:use-spreadsheet-objects</span> attribute specifies whether embedded spreadsheet objects will appear in an object index. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-spreadsheet-objects</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: spreadsheet objects do not appear in an object index.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: spreadsheet objects do appear in an object index.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-spreadsheet-objects</span> attribute is usable with the following element: <span class="Element">&lt;text:object-index-source&gt;</span> <a href="#element-text_object-index-source">8.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-spreadsheet-objects</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_899text_use-tables"><span style="margin-right:0.127cm;">19.899</span></a><a id="__RefHeading__1419326_253892949"/><a id="attribute-text_use-tables"/>text:use-tables</h2><p class="Text_20_body">The <span class="Attribute">text:use-tables</span> attribute specifies whether tables will appear in a user defined index. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:use-tables</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: tables will not appear in a user defined index.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: tables will appear in a user defined index.<span class="odfLiEnd"/> </p></li></ul><p class="Default_20_Value_borderStart">The default value for this attribute is <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List">The <span class="Attribute">text:use-tables</span> attribute is usable with the following element: <span class="Element">&lt;text:user-index-source&gt;</span> <a href="#element-text_user-index-source">8.7.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:use-tables</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a19_900text_value"><span style="margin-right:0.127cm;">19.900</span></a><a id="__RefHeading__1419328_253892949"/><a id="attribute-text_value"/>text:value</h2><p class="Text_20_body">The <span class="Attribute">text:value</span> attribute specifies the current row number for a <span class="Element">&lt;text:database-row-number&gt;</span> element. The number changes when new data is added to the current document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:value</span> attribute is usable with the following element: <span class="Element">&lt;text:database-row-number&gt;</span> <a href="#element-text_database-row-number">7.6.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:value</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_901text_visited-style-name"><span style="margin-right:0.127cm;">19.901</span></a><a id="__RefHeading__1419330_253892949"/><a id="attribute-text_visited-style-name"/>text:visited-style-name</h2><p class="Text_20_body">The <span class="Attribute">text:visited-style-name</span> attribute specifies a style for a hyperlink that has been visited. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:visited-style-name</span> attribute is usable with the following element: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:visited-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a19_902text_volume"><span style="margin-right:0.127cm;">19.902</span></a><a id="__RefHeading__1419332_253892949"/><a id="attribute-text_volume"/>text:volume</h2><p class="Text_20_body">The <span class="Attribute">text:volume</span> attribute specifies a volume for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:volume</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:volume</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_903text_year"><span style="margin-right:0.127cm;">19.903</span></a><a id="__RefHeading__1419334_253892949"/><a id="attribute-text_year"/>text:year</h2><p class="Text_20_body">The <span class="Attribute">text:year</span> attribute specifies a year for a bibliography index entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:year</span> attribute is usable with the following element: <span class="Element">&lt;text:bibliography-mark&gt;</span> <a href="#element-text_bibliography-mark">8.1.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:year</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_904xforms_bind"><span style="margin-right:0.127cm;">19.904</span></a><a id="__RefHeading__1419336_253892949"/><a id="attribute-xforms_bind"/>xforms:bind</h2><p class="Text_20_body">The <span class="Attribute">xforms:bind</span> attribute specifies the binding of an OpenDocument control to an XForm form.</p><p class="Text_20_body">With OpenDocument form buttons, the bind attribute refers to an <span class="Alien_20_Element">&lt;xforms:submission&gt;</span> element with the given ID. Pushing the button causes the appropriate XForms submission action to be performed. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> OpenDocument form button controls are: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, and, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>.</p><p class="Text_20_body">With OpenDocument form non-button controls, the <span class="Attribute">xforms:bind</span> attribute refers to an <span class="Alien_20_Element">&lt;xforms:bind&gt;</span> element with the given ID. Any such bound control reads and writes its data as determined by the appropriate bind element.</p><p class="Text_20_body">Note: OpenDocument form non-button controls are: <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:column&gt;</span> <a href="#element-form_column">13.5.23</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:item&gt;</span> <a href="#element-form_item">13.5.12</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:option&gt;</span> <a href="#element-form_option">13.5.14</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>,<span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>, and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xforms:bind</span> attribute is usable with the following elements: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a> and <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xforms:bind</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_905xhtml_about"><span style="margin-right:0.127cm;">19.905</span></a><a id="__RefHeading__1419338_253892949"/><a id="attribute-xhtml_about"/>xhtml:about</h2><p class="Text_20_body">The <span class="Attribute">xhtml:about</span> attribute specifies the subject of an RDF statement for in content metadata. Predicates for RDF statements are specified by the <span class="Attribute">xhtml:property</span> attribute. <a href="#attribute-xhtml_property">19.908</a></p><p class="Text_20_body">The RDF statement's object is specified by the <span class="Attribute">xhtml:content</span> attribute, if present, or it is</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>the literal content between a pair of <span class="Alien_20_Element">&lt;text:bookmark-start&gt;</span> and <span class="Alien_20_Element">&lt;text:bookmark-end&gt;</span> elements that are paired by the values of their <span class="Attribute">text:name</span> attributes. <a href="#element-text_bookmark-start">6.2.1.3</a>, <a href="#element-text_bookmark-end">6.2.1.4</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>for elements other than <span class="Element">&lt;text:bookmark-start&gt;</span>/<span class="Element">&lt;text:bookmark-end&gt;</span>, the literal content of the element containing an <span class="Attribute">xhtml:about</span> attribute. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">xhtml:datatype</span> attribute provides the data type of the RDF object. <a href="#attribute-xhtml_datatype">19.907</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xhtml:about</span> attribute is usable with the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xhtml:about</span> attribute has the data type <span class="Datatype">URIorSafeCURIE</span> <a href="#datatype-URIorSafeCURIE">18.3.37</a>.</p><h2 class="Heading_20_2"><a id="a19_906xhtml_content"><span style="margin-right:0.127cm;">19.906</span></a><a id="__RefHeading__1419340_253892949"/><a id="attribute-xhtml_content"/>xhtml:content</h2><p class="Text_20_body">The <span class="Attribute">xhtml:content</span> attribute specifies an object of an RDF statement for in content metadata. <a href="#attribute-xhtml_about">19.905</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xhtml:content</span> attribute is usable with the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xhtml:content</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_907xhtml_datatype"><span style="margin-right:0.127cm;">19.907</span></a><a id="__RefHeading__1419342_253892949"/><a id="attribute-xhtml_datatype"/>xhtml:datatype</h2><p class="Text_20_body">The <span class="Attribute">xhtml:datatype</span> attribute specifies the RDF data type (see §5 of <a title="Resource Description Framework (RDF): Concepts and Abstract Syntax" href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">[RDF-CONCEPTS]</a>) of the object of an RDF statement. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xhtml:datatype</span> attribute is usable with the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xhtml:datatype</span> attribute has the data type <span class="Datatype">CURIE</span> <a href="#datatype-CURIE">18.3.12</a>.</p><h2 class="Heading_20_2"><a id="a19_908xhtml_property"><span style="margin-right:0.127cm;">19.908</span></a><a id="__RefHeading__1419344_253892949"/><a id="attribute-xhtml_property"/>xhtml:property</h2><p class="Text_20_body">The <span class="Attribute">xhtml:property</span> attribute specifies a list of one or more CURIEs. Each CURIE is the predicate of an RDF statement for in content metadata. <a href="#attribute-xhtml_about">19.905</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xhtml:property</span> attribute is usable with the following elements: <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a> and <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xhtml:property</span> attribute has the data type <span class="Datatype">CURIEs</span> <a href="#datatype-CURIEs">18.3.13</a>.</p><h2 class="Heading_20_2"><a id="a19_909xlink_actuate"><span style="margin-right:0.127cm;">19.909</span></a><a id="__RefHeading__1419346_253892949"/><a id="attribute-xlink_actuate"/>xlink:actuate</h2><p class="Text_20_body">See §5.6.2 of <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a>.</p><p class="Text_20_body">The <span class="Attribute">xlink:actuate</span> attribute has the value <span class="Attribute_20_Value">onRequest</span> for the following elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>, <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;prese</span><span class="Element">ntation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>, <span class="Element">&lt;svg:definition-</span><span class="Element">src&gt;</span> <a href="#element-svg_definition-src">16.25</a>, <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a> and <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Text_20_body">The <span class="Attribute">xlink:actuate</span> attribute has the value <span class="Attribute_20_Value">onLoad</span> for the following elements: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a> and <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>.</p><p class="Default_20_Value_borderStart">For <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>, <span class="Element">&lt;svg:definition-</span><span class="Element">src&gt;</span> <a href="#element-svg_definition-src">16.25</a>, <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a> and <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a> elements the default value for this attribute is <span class="Attribute_20_Value">onRequest</span>.</p><p class="Default_20_Value">For <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a> and <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a> elements the default value for this attribute is <span class="Attribute_20_Value">onLoad</span>.</p><p class="Parent_20_Element_20_List_borderEnd">The <span class="Attribute">xlink:actuate</span> attribute is usable with the following elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>, <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;svg:definition-src&gt;</span> <a href="#element-svg_definition-src">16.25</a>, <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a> and <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>.</p><h2 class="Heading_20_2"><a id="a19_910xlink_href"><span style="margin-right:0.127cm;">19.910</span></a><a id="__RefHeading__1419348_253892949"/><a id="attribute-xlink_href"/>xlink:href</h2><h3 class="Heading_20_3"><a id="a19_910_1General"><span style="margin-right:0.127cm;">19.910.1</span></a><a id="__RefHeading__1419350_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a remote resource. Its data type is <span class="Datatype">anyIRI</span>. See §5.4 of <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a>.</p><h3 class="Heading_20_3"><a id="a19_910_2_anim_audio_"><span style="margin-right:0.127cm;">19.910.2</span></a><a id="__RefHeading__1419352_253892949"/><a id="attribute-xlink_href_element-anim_audio"/>&lt;anim:audio&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies an audio stream.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_3_chart_chart_"><span style="margin-right:0.127cm;">19.910.3</span></a><a id="__RefHeading__1419354_253892949"/><a id="attribute-xlink_href_element-chart_chart"/>&lt;chart:chart&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute at the <span class="Element">&lt;chart:chart&gt;</span> element specifies the document which provides the data for a chart. The following values are supported:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span> "<span class="Attribute_20_Value_20_Instance">.</span>"(U+002E, FULL STOP): The data is provided by the chart document itself. It is taken from the <span class="Element">&lt;table:table&gt;</span> element inside the <span class="Element">&lt;chart:chart&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>"<span class="Attribute_20_Value_20_Instance">..</span>"(U+002E, FULL STOP followed by U+002E, FULL STOP): The data is provided by the document into which the chart is embedded. This is only supported if the chart is embedded into another document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>A relative IRI: The data is provided by an embedded object referenced by the IRI. This embedded object shall be within the same package as the chart itself.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">All cell range addresses that are specified within a chart are relative to the document referenced by the <span class="Attribute">xlink:href</span> attribute.</p><p class="Text_20_body">If the <span class="Attribute">xlink:href</span> attribute is omitted, its value is assumed to be "<span class="Attribute_20_Value_20_Instance">..</span>" (U+002E, FULL STOP followed by U+002E, FULL STOP).</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_4_chart_symbol-image_"><span style="margin-right:0.127cm;">19.910.4</span></a><a id="__RefHeading__1419356_253892949"/><a id="attribute-xlink_href_element-chart_symbol-image"/>&lt;chart:symbol-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a file containing an image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;chart:symbol-image&gt;</span> <a href="#element-chart_symbol-image">17.23</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_5_db_component_"><span style="margin-right:0.127cm;">19.910.5</span></a><a id="__RefHeading__1419358_253892949"/><a id="attribute-xlink_href_element-db_component"/>&lt;db:component&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a form or report document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_6_db_connection-resource_"><span style="margin-right:0.127cm;">19.910.6</span></a><a id="__RefHeading__1419360_253892949"/><a id="attribute-xlink_href_element-db_connection-resource"/>&lt;db:connection-resource&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies either a database, or database connection data encoded as an IRI.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_7_db_file-based-database_"><span style="margin-right:0.127cm;">19.910.7</span></a><a id="__RefHeading__1419362_253892949"/><a id="attribute-xlink_href_element-db_file-based-database"/>&lt;db:file-based-database&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the location of a file that defines a database. If a database consists of multiple files of different types which all are required for it to be operational, <span class="Attribute">xlink:href</span> points to one of those files which defines the database as a whole.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_8_draw_a_"><span style="margin-right:0.127cm;">19.910.8</span></a><a id="__RefHeading__1419364_253892949"/><a id="attribute-xlink_href_element-draw_a"/>&lt;draw:a&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a target location for the hyperlink.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_9_draw_applet_"><span style="margin-right:0.127cm;">19.910.9</span></a><a id="__RefHeading__1419366_253892949"/><a id="attribute-xlink_href_element-draw_applet"/>&lt;draw:applet&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the base IRI for an applet.</p><p class="Text_20_body">The default value for this attribute is an empty string. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_10_draw_area-circle_"><span style="margin-right:0.127cm;">19.910.10</span></a><a id="__RefHeading__1419368_253892949"/><a id="attribute-xlink_href_element-draw_area-circle"/>&lt;draw:area-circle&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a target location for the hyperlink.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_11_draw_area-polygon_"><span style="margin-right:0.127cm;">19.910.11</span></a><a id="__RefHeading__1419370_253892949"/><a id="attribute-xlink_href_element-draw_area-polygon"/>&lt;draw:area-polygon&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a target location for the hyperlink.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_12_draw_area-rectangle_"><span style="margin-right:0.127cm;">19.910.12</span></a><a id="__RefHeading__1419372_253892949"/><a id="attribute-xlink_href_element-draw_area-rectangle"/>&lt;draw:area-rectangle&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a target location for the hyperlink.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_13_draw_fill-image_"><span style="margin-right:0.127cm;">19.910.13</span></a><a id="__RefHeading__1419374_253892949"/><a id="attribute-xlink_href_element-draw_fill-image"/>&lt;draw:fill-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a file containing an image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_14_draw_floating-frame_"><span style="margin-right:0.127cm;">19.910.14</span></a><a id="__RefHeading__1419376_253892949"/><a id="attribute-xlink_href_element-draw_floating-frame"/>&lt;draw:floating-frame&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the source of a floating frame.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_15_draw_image_"><span style="margin-right:0.127cm;">19.910.15</span></a><a id="__RefHeading__1419378_253892949"/><a id="attribute-xlink_href_element-draw_image"/>&lt;draw:image&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a file containing an image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_16_draw_object_"><span style="margin-right:0.127cm;">19.910.16</span></a><a id="__RefHeading__1419380_253892949"/><a id="attribute-xlink_href_element-draw_object"/>&lt;draw:object&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the location of an embedded object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_17_draw_object-ole_"><span style="margin-right:0.127cm;">19.910.17</span></a><a id="__RefHeading__1419382_253892949"/><a id="attribute-xlink_href_element-draw_object-ole"/>&lt;draw:object-ole&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the location of an embedded object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_18_draw_plugin_"><span style="margin-right:0.127cm;">19.910.18</span></a><a id="__RefHeading__1419384_253892949"/><a id="attribute-xlink_href_element-draw_plugin"/>&lt;draw:plugin&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the source of a plugin.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_19_form_button_"><span style="margin-right:0.127cm;">19.910.19</span></a><a id="__RefHeading__1419386_253892949"/><a id="attribute-xlink_href_element-form_button"/>&lt;form:button&gt;</h3><p class="Text_20_body"> The <span class="Attribute">xlink:href</span> attribute specifies a resource that is loaded if a button is operated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_20_form_connection-resource_"><span style="margin-right:0.127cm;">19.910.20</span></a><a id="__RefHeading__1419388_253892949"/><a id="attribute-xlink_href_element-form_connection-resource"/>&lt;form:connection-resource&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies either a database, or database connection encoded as an IRI. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;form:connection-resource&gt;</span> <a href="#element-form_connection-resource">7.6.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_21_form_image_"><span style="margin-right:0.127cm;">19.910.21</span></a><a id="__RefHeading__1419390_253892949"/><a id="attribute-xlink_href_element-form_image"/>&lt;form:image&gt;</h3><p class="Text_20_body"> The <span class="Attribute">xlink:href</span> attribute specifies a resource that is loaded if a button is operated.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_22_form_form_"><span style="margin-right:0.127cm;">19.910.22</span></a><a id="__RefHeading__1419392_253892949"/><a id="attribute-xlink_href_element-form_form"/>&lt;form:form&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the processing agent for a form.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_23_meta_auto-reload_"><span style="margin-right:0.127cm;">19.910.23</span></a><a id="__RefHeading__1419394_253892949"/><a id="attribute-xlink_href_element-meta_auto-reload"/>&lt;meta:auto-reload&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the IRI of a replacement document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_24_meta_template_"><span style="margin-right:0.127cm;">19.910.24</span></a><a id="__RefHeading__1419396_253892949"/><a id="attribute-xlink_href_element-meta_template"/>&lt;meta:template&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the location of a document template.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_25_presentation_event-listener_"><span style="margin-right:0.127cm;">19.910.25</span></a><a id="__RefHeading__1419398_253892949"/><a id="attribute-xlink_href_element-presentation_event-listener"/>&lt;presentation:event-listener&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies depending on the action selected by the <span class="Attribute">presentation:action</span> attribute either a document bookmark or an application.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_26_presentation_sound_"><span style="margin-right:0.127cm;">19.910.26</span></a><a id="__RefHeading__1419400_253892949"/><a id="attribute-xlink_href_element-presentation_sound"/>&lt;presentation:sound&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies a sound that is played when an effect is executed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_27_script_event-listener_"><span style="margin-right:0.127cm;">19.910.27</span></a><a id="__RefHeading__1419402_253892949"/><a id="attribute-xlink_href_element-script_event-listener"/>&lt;script:event-listener&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies macro code that should be called for an event. The IRI may have any  protocol. The interpretation of the IRI is script language dependent.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_28_style_background-image_"><span style="margin-right:0.127cm;">19.910.28</span></a><a id="__RefHeading__1419404_253892949"/><a id="attribute-xlink_href_element-style_background-image"/>&lt;style:background-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies an image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_29_svg_definition-src_"><span style="margin-right:0.127cm;">19.910.29</span></a><a id="__RefHeading__1419406_253892949"/><a id="attribute-xlink_href_element-svg_definition-src"/>&lt;svg:definition-src&gt;</h3><p class="Text_20_body">See § 20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;svg:definition-src&gt;</span> <a href="#element-svg_definition-src">16.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_30_svg_font-face-uri_"><span style="margin-right:0.127cm;">19.910.30</span></a><a id="__RefHeading__1419408_253892949"/><a id="attribute-xlink_href_element-svg_font-face-uri"/>&lt;svg:font-face-uri&gt;</h3><p class="Text_20_body">See § 20.8.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_31_table_cell-range-source_"><span style="margin-right:0.127cm;">19.910.31</span></a><a id="__RefHeading__1419410_253892949"/><a id="attribute-xlink_href_element-table_cell-range-source"/>&lt;table:cell-range-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies an IRI for a document containing a source table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_32_table_table-source_"><span style="margin-right:0.127cm;">19.910.32</span></a><a id="__RefHeading__1419412_253892949"/><a id="attribute-xlink_href_element-table_table-source"/>&lt;table:table-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies an IRI of a document containing a source table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_33_text_a_"><span style="margin-right:0.127cm;">19.910.33</span></a><a id="__RefHeading__1419414_253892949"/><a id="attribute-xlink_href_element-text_a"/>&lt;text:a&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the target location of a hyperlink.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_34_text_alphabetical-index-auto-mark-file_"><span style="margin-right:0.127cm;">19.910.34</span></a><a id="__RefHeading__1419416_253892949"/><a id="attribute-xlink_href_element-text_alphabetical-index-auto-mark-file"/>&lt;text:alphabetical-index-auto-mark-file&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the location of an alphabetical index mark file that contains a list of terms.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_35_text_list-level-style-image_"><span style="margin-right:0.127cm;">19.910.35</span></a><a id="__RefHeading__1419418_253892949"/><a id="attribute-xlink_href_element-text_list-level-style-image"/>&lt;text:list-level-style-image&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies an image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_36_text_script_"><span style="margin-right:0.127cm;">19.910.36</span></a><a id="__RefHeading__1419420_253892949"/><a id="attribute-xlink_href_element-text_script"/>&lt;text:script&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the location script source code.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h3 class="Heading_20_3"><a id="a19_910_37_text_section-source_"><span style="margin-right:0.127cm;">19.910.37</span></a><a id="__RefHeading__1419422_253892949"/><a id="attribute-xlink_href_element-text_section-source"/>&lt;text:section-source&gt;</h3><p class="Text_20_body">The <span class="Attribute">xlink:href</span> attribute specifies the document or document fragment to which a section is linked. If the IRI contains a fragment identifier, and if the referenced document is an OpenDocument document, the fragment identifier should be interpreted as the name of a section to which a section is linked. A fragment identifier should be ignored if a <span class="Attribute">text:section-name</span> attribute is present. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:href</span> attribute is usable with the following element: <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:href</span> attribute has the data type <span class="Datatype">anyIRI</span> <a href="#datatype-anyIRI">18.3.2</a>.</p><h2 class="Heading_20_2"><a id="a19_911xlink_show"><span style="margin-right:0.127cm;">19.911</span></a><a id="__RefHeading__1419424_253892949"/><a id="attribute-xlink_show"/>xlink:show</h2><p class="Text_20_body">See §5.6.1 of <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a>.</p><p class="Text_20_body">For a <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a> element the value for this attribute is <span class="Attribute_20_Value">replace</span>.</p><p class="Text_20_body">For <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;style:background-</span><span class="Element">image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a> and <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a> elements the value for this attribute is <span class="Attribute_20_Value">embed</span>.</p><p class="Text_20_body">For <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> <a href="#element-meta_hyperlink-behaviour">4.3.2.14</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a> and <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a> elements the supported values for this attribute are <span class="Attribute_20_Value">new</span> or <span class="Attribute_20_Value">replace</span>.</p><p class="Default_20_Value_borderStart">For a <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a> element the default value for this attribute is <span class="Attribute_20_Value">replace</span>.</p><p class="Default_20_Value">For <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a> and <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a> elements the default value for this attribute is <span class="Attribute_20_Value">embed</span>.</p><p class="Default_20_Value">For <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a> the default value for this attribute is <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List_borderEnd">The <span class="Attribute">xlink:show</span> attribute is usable with the following elements: <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>, <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;meta:hyperlink-behaviour&gt;</span> <a href="#element-meta_hyperlink-behaviour">4.3.2.14</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a> and <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a>.</p><h2 class="Heading_20_2"><a id="a19_912xlink_title"><span style="margin-right:0.127cm;">19.912</span></a><a id="__RefHeading__1419426_253892949"/><a id="attribute-xlink_title"/>xlink:title</h2><p class="Text_20_body">The <span class="Attribute">xlink:title</span> attribute specifies a title to be associated with a document template.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xlink:title</span> attribute is usable with the following element: <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xlink:title</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a19_913xlink_type"><span style="margin-right:0.127cm;">19.913</span></a><a id="__RefHeading__1419428_253892949"/><a id="attribute-xlink_type"/>xlink:type</h2><p class="Text_20_body">See §3.2 <a id="DDE_LINK6"/>of <a title="XML Linking Language (XLink) Version 1.0" href="http://www.w3.org/TR/2001/REC-xlink-20010627/">[XLink]</a>. This attribute always has the value <span class="Attribute_20_Value">simple</span> in OpenDocument document instances. </p><p class="Default_20_Value_borderStart">For <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>, <span class="Element">&lt;style:background-</span><span class="Element">image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;svg:definition-src&gt;</span> <a href="#element-svg_definition-src">16.25</a>, <span class="Element">&lt;svg:font-face-</span><span class="Element">uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:list-</span><span class="Element">level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a> and <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a> elements the default value for this attribute is <span class="Attribute_20_Value">simple</span>.</p><p class="Parent_20_Element_20_List_borderEnd">The <span class="Attribute">xlink:type</span> attribute is usable with the following elements: <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>, <span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a>, <span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a>, <span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:area-circle&gt;</span> <a href="#element-draw_area-circle">10.4.13.4</a>, <span class="Element">&lt;draw:area-polygon&gt;</span> <a href="#element-draw_area-polygon">10.4.13.5</a>, <span class="Element">&lt;draw:area-rectangle&gt;</span> <a href="#element-draw_area-rectangle">10.4.13.3</a>, <span class="Element">&lt;draw:fill-image&gt;</span> <a href="#element-draw_fill-image">16.40.6</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;form:form&gt;</span> <a href="#element-form_form">13.3</a>, <span class="Element">&lt;meta:auto-reload&gt;</span> <a href="#element-meta_auto-reload">4.3.2.13</a>, <span class="Element">&lt;meta:template&gt;</span> <a href="#element-meta_template">4.3.2.12</a>, <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;script:event-listener&gt;</span> <a href="#element-script_event-listener">14.4.2</a>, <span class="Element">&lt;style:background-image&gt;</span> <a href="#element-style_background-image">17.3</a>, <span class="Element">&lt;svg:definition-src&gt;</span> <a href="#element-svg_definition-src">16.25</a>, <span class="Element">&lt;svg:font-face-uri&gt;</span> <a href="#element-svg_font-face-uri">16.24</a>, <span class="Element">&lt;table:cell-range-source&gt;</span> <a href="#element-table_cell-range-source">9.3.1</a>, <span class="Element">&lt;table:table-source&gt;</span> <a href="#element-table_table-source">9.2.6</a>, <span class="Element">&lt;text:a&gt;</span> <a href="#element-text_a">6.1.8</a>, <span class="Element">&lt;text:alphabetical-index-auto-mark-file&gt;</span> <a href="#element-text_alphabetical-index-auto-mark-file">8.8.3</a>, <span class="Element">&lt;text:list-level-style-image&gt;</span> <a href="#element-text_list-level-style-image">16.33</a>, <span class="Element">&lt;text:script&gt;</span> <a href="#element-text_script">7.7.9</a> and <span class="Element">&lt;text:section-source&gt;</span> <a href="#element-text_section-source">5.4.2</a>.</p><h2 class="Heading_20_2"><a id="a19_914xml_id"><span style="margin-right:0.127cm;">19.914</span></a><a id="__RefHeading__1419430_253892949"/><a id="attribute-xml_id"/>xml:id</h2><p class="Text_20_body">The <span class="Attribute">xml:id</span> attribute is standardized by the W3C <a title="xml:id Version 1.0" href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">[XML-ID]</a> and gives an element a unique identification in its XML file. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">xml:id</span> attribute is usable with the following elements: <span class="Element">&lt;anim:audio&gt;</span> <a href="#element-anim_audio">15.5</a>, <span class="Element">&lt;anim:command&gt;</span> <a href="#element-anim_command">15.6.1</a>, <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a>, <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a>, <span class="Element">&lt;chart:chart&gt;</span> <a href="#element-chart_chart">11.1</a>, <span class="Element">&lt;chart:data-point&gt;</span> <a href="#element-chart_data-point">11.13</a>, <span class="Element">&lt;chart:plot-area&gt;</span> <a href="#element-chart_plot-area">11.4</a>, <span class="Element">&lt;chart:series&gt;</span> <a href="#element-chart_series">11.11</a>, <span class="Element">&lt;dr3d:cube&gt;</span> <a href="#element-dr3d_cube">10.5.4</a>, <span class="Element">&lt;dr3d:extrude&gt;</span> <a href="#element-dr3d_extrude">10.5.6</a>, <span class="Element">&lt;dr3d:rotate&gt;</span> <a href="#element-dr3d_rotate">10.5.7</a>, <span class="Element">&lt;dr3d:scene&gt;</span> <a href="#element-dr3d_scene">10.5.2</a>, <span class="Element">&lt;dr3d:sphere&gt;</span> <a href="#element-dr3d_sphere">10.5.5</a>, <span class="Element">&lt;draw:a&gt;</span> <a href="#element-draw_a">10.4.12</a>, <span class="Element">&lt;draw:applet&gt;</span> <a href="#element-draw_applet">10.4.7</a>, <span class="Element">&lt;draw:caption&gt;</span> <a href="#element-draw_caption">10.3.11</a>, <span class="Element">&lt;draw:circle&gt;</span> <a href="#element-draw_circle">10.3.8</a>, <span class="Element">&lt;draw:connector&gt;</span> <a href="#element-draw_connector">10.3.10</a>, <span class="Element">&lt;draw:control&gt;</span> <a href="#element-draw_control">10.3.13</a>, <span class="Element">&lt;draw:custom-shape&gt;</span> <a href="#element-draw_custom-shape">10.6.1</a>, <span class="Element">&lt;draw:ellipse&gt;</span> <a href="#element-draw_ellipse">10.3.9</a>, <span class="Element">&lt;draw:floating-frame&gt;</span> <a href="#element-draw_floating-frame">10.4.10</a>, <span class="Element">&lt;draw:frame&gt;</span> <a href="#element-draw_frame">10.4.2</a>, <span class="Element">&lt;draw:g&gt;</span> <a href="#element-draw_g">10.3.15</a>, <span class="Element">&lt;draw:image&gt;</span> <a href="#element-draw_image">10.4.4</a>, <span class="Element">&lt;draw:line&gt;</span> <a href="#element-draw_line">10.3.3</a>, <span class="Element">&lt;draw:measure&gt;</span> <a href="#element-draw_measure">10.3.12</a>, <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a>, <span class="Element">&lt;draw:object-ole&gt;</span> <a href="#element-draw_object-ole">10.4.6.3</a>, <span class="Element">&lt;draw:page&gt;</span> <a href="#element-draw_page">10.2.4</a>, <span class="Element">&lt;draw:page-thumbnail&gt;</span> <a href="#element-draw_page-thumbnail">10.3.14</a>, <span class="Element">&lt;draw:path&gt;</span> <a href="#element-draw_path">10.3.7</a>, <span class="Element">&lt;draw:plugin&gt;</span> <a href="#element-draw_plugin">10.4.8</a>, <span class="Element">&lt;draw:polygon&gt;</span> <a href="#element-draw_polygon">10.3.5</a>, <span class="Element">&lt;draw:polyline&gt;</span> <a href="#element-draw_polyline">10.3.4</a>, <span class="Element">&lt;draw:rect&gt;</span> <a href="#element-draw_rect">10.3.2</a>, <span class="Element">&lt;draw:regular-polygon&gt;</span> <a href="#element-draw_regular-polygon">10.3.6</a>, <span class="Element">&lt;draw:text-box&gt;</span> <a href="#element-draw_text-box">10.4.3</a>, <span class="Element">&lt;form:button&gt;</span> <a href="#element-form_button">13.5.15</a>, <span class="Element">&lt;form:checkbox&gt;</span> <a href="#element-form_checkbox">13.5.17</a>, <span class="Element">&lt;form:combobox&gt;</span> <a href="#element-form_combobox">13.5.11</a>, <span class="Element">&lt;form:date&gt;</span> <a href="#element-form_date">13.5.8</a>, <span class="Element">&lt;form:file&gt;</span> <a href="#element-form_file">13.5.5</a>, <span class="Element">&lt;form:fixed-text&gt;</span> <a href="#element-form_fixed-text">13.5.10</a>, <span class="Element">&lt;form:formatted-text&gt;</span> <a href="#element-form_formatted-text">13.5.6</a>, <span class="Element">&lt;form:frame&gt;</span> <a href="#element-form_frame">13.5.19</a>, <span class="Element">&lt;form:generic-control&gt;</span> <a href="#element-form_generic-control">13.5.25</a>, <span class="Element">&lt;form:grid&gt;</span> <a href="#element-form_grid">13.5.22</a>, <span class="Element">&lt;form:hidden&gt;</span> <a href="#element-form_hidden">13.5.21</a>, <span class="Element">&lt;form:image&gt;</span> <a href="#element-form_image">13.5.16</a>, <span class="Element">&lt;form:image-frame&gt;</span> <a href="#element-form_image-frame">13.5.20</a>, <span class="Element">&lt;form:listbox&gt;</span> <a href="#element-form_listbox">13.5.13</a>, <span class="Element">&lt;form:number&gt;</span> <a href="#element-form_number">13.5.7</a>, <span class="Element">&lt;form:password&gt;</span> <a href="#element-form_password">13.5.4</a>, <span class="Element">&lt;form:radio&gt;</span> <a href="#element-form_radio">13.5.18</a>, <span class="Element">&lt;form:text&gt;</span> <a href="#element-form_text">13.5.2</a>, <span class="Element">&lt;form:textarea&gt;</span> <a href="#element-form_textarea">13.5.3</a>, <span class="Element">&lt;form:time&gt;</span> <a href="#element-form_time">13.5.9</a>, <span class="Element">&lt;form:value-range&gt;</span> <a href="#element-form_value-range">13.5.24</a>, <span class="Element">&lt;office:annotation&gt;</span> <a href="#element-office_annotation">14.1</a>, <span class="Element">&lt;presentation:sound&gt;</span> <a href="#element-presentation_sound">10.8.2</a>, <span class="Element">&lt;table:covered-table-cell&gt;</span> <a href="#element-table_covered-table-cell">9.1.5</a>, <span class="Element">&lt;table:table&gt;</span> <a href="#element-table_table">9.1.2</a>, <span class="Element">&lt;table:table-cell&gt;</span> <a href="#element-table_table-cell">9.1.4</a>, <span class="Element">&lt;table:table-column&gt;</span> <a href="#element-table_table-column">9.1.6</a>, <span class="Element">&lt;table:table-row&gt;</span> <a href="#element-table_table-row">9.1.3</a>, <span class="Element">&lt;text:alphabetical-index&gt;</span> <a href="#element-text_alphabetical-index">8.8</a>, <span class="Element">&lt;text:bibliography&gt;</span> <a href="#element-text_bibliography">8.9</a>, <span class="Element">&lt;text:bookmark&gt;</span> <a href="#element-text_bookmark">6.2.1.2</a>, <span class="Element">&lt;text:bookmark-start&gt;</span> <a href="#element-text_bookmark-start">6.2.1.3</a>, <span class="Element">&lt;text:changed-region&gt;</span> <a href="#element-text_changed-region">5.5.2</a>, <span class="Element">&lt;text:h&gt;</span> <a href="#element-text_h">5.1.2</a>, <span class="Element">&lt;text:illustration-index&gt;</span> <a href="#element-text_illustration-index">8.4</a>, <span class="Element">&lt;text:index-title&gt;</span> <a href="#element-text_index-title">8.2.3</a>, <span class="Element">&lt;text:list&gt;</span> <a href="#element-text_list">5.3.1</a>, <span class="Element">&lt;text:list-header&gt;</span> <a href="#element-text_list-header">5.3.3</a>, <span class="Element">&lt;text:list-item&gt;</span> <a href="#element-text_list-item">5.3.4</a>, <span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a>, <span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a>, <span class="Element">&lt;text:numbered-paragraph&gt;</span> <a href="#element-text_numbered-paragraph">5.3.6</a>, <span class="Element">&lt;text:object-index&gt;</span> <a href="#element-text_object-index">8.6</a>, <span class="Element">&lt;text:p&gt;</span> <a href="#element-text_p">5.1.3</a>, <span class="Element">&lt;text:section&gt;</span> <a href="#element-text_section">5.4</a>, <span class="Element">&lt;text:table-index&gt;</span> <a href="#element-text_table-index">8.5</a>, <span class="Element">&lt;text:table-of-content&gt;</span> <a href="#element-text_table-of-content">8.3</a> and <span class="Element">&lt;text:user-index&gt;</span> <a href="#element-text_user-index">8.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">xml:id</span> attribute has the data type <span class="Datatype">ID</span> <a href="#datatype-ID">18.2</a>.</p><h1 class="Heading_20_1"><a id="a20Formatting_Attributes"><span style="margin-right:0.127cm;">20</span></a><a id="__RefHeading__1419432_253892949"/><a id="Formatting_Attributes"/>Formatting Attributes</h1><h2 class="Heading_20_2"><a id="a20_1General"><span style="margin-right:0.127cm;">20.1</span></a><a id="__RefHeading__1419434_253892949"/>General</h2><p class="Text_20_body">In an OpenDocument Format document, <span class="Alien_20_Element">&lt;style:*-properties&gt;</span> elements contain the definitions of formatting that is associated with document structure elements. Formatting definitions are expressed as attributes on the <span class="Alien_20_Element">&lt;style:*-properties&gt;</span> elements or as child elements of these elements. This chapter defines formatting properties that are represented by attributes. Formatting properties that are represented by elements are defined in chapter 17. </p><h2 class="Heading_20_2"><a id="a20_2chart_angle-offset"><span style="margin-right:0.127cm;">20.2</span></a><a id="__RefHeading__1419436_253892949"/><a id="property-chart_angle-offset"/>chart:angle-offset</h2><p class="Text_20_body">The <span class="Attribute">chart:angle-offset</span> attribute specifies a counter clockwise rotation of a polar coordinate in a circle, ring or polar chart. The attribute value is an angle. See <a id="DDE_LINK28"/><a href="#datatype-angle">18.3.1</a>. The default value is <span class="Attribute_20_Value_20_Instance">90deg</span>.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:angle-offset</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:angle-offset</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a20_3chart_auto-position"><span style="margin-right:0.127cm;">20.3</span></a><a id="__RefHeading__1419438_253892949"/><a id="property-chart_auto-position"/>chart:auto-position</h2><p class="Text_20_body">The <span class="Attribute">chart:auto-position</span> attribute specifies if an object should be positioned automatically. </p><p class="Text_20_body">The default value is <span class="Attribute_20_Value">true</span> if <span class="Attribute">svg:x</span> and <span class="Attribute">svg:y</span> attributes are not specified. It is <span class="Attribute_20_Value">false</span> if the <span class="Attribute">svg:x</span> and <span class="Attribute">svg:y</span> attributes are specified. </p><p class="Text_20_body">The <span class="Attribute">chart:auto-position</span> attribute is evaluated for chart styles applied to elements that may have <span class="Attribute">svg:x</span> and <span class="Attribute">svg:y</span> attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:auto-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: <span class="Attribute">svg:x</span> and <span class="Attribute">svg:y</span> attribute values are used to position an object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: <span class="Attribute">svg:x</span> and <span class="Attribute">svg:y</span> attribute values are ignored and the consumer chooses a position.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:auto-position</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:auto-position</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_4chart_auto-size"><span style="margin-right:0.127cm;">20.4</span></a><a id="__RefHeading__1419440_253892949"/><a id="property-chart_auto-size"/>chart:auto-size</h2><p class="Text_20_body">The <span class="Attribute">chart:auto-size</span> attribute specifies if the size of an object should be chosen automatically. </p><p class="Text_20_body">The default value is <span class="Attribute_20_Value">true</span> if <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attributes are not specified. It is <span class="Attribute_20_Value">false</span> if the <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attributes are specified.</p><p class="Text_20_body">The <span class="Attribute">chart:auto-size</span> attribute is evaluated for chart styles applied to elements that have <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:auto-size</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attribute values are used to size an object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: <span class="Attribute">svg:width</span> and <span class="Attribute">svg:height</span> attribute values are ignored and the consumer chooses a size.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:auto-size</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:auto-size</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_5chart_axis-label-position"><span style="margin-right:0.127cm;">20.5</span></a><a id="__RefHeading__1419442_253892949"/><a id="property-chart_axis-label-position"/>chart:axis-label-position</h2><p class="Text_20_body">The <span class="Attribute">chart:axis-label-position</span> attribute specifies the position of the axis labels.</p><p class="Text_20_body"><a id="line-51"/><a id="line-50"/>The defined values for the <span class="Attribute">chart:axis-label-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">near-axis</span>: The labels are placed adjacent to the axis line. On which side of the line the labels are placed depends on the <span class="Attribute">chart:axis-position</span> attribute. If the <span class="Attribute">chart:axis-position</span> attribute has the value <span class="Attribute_20_Value">start</span> or <span class="Attribute_20_Value">end</span>, the labels are placed outside the coordinate system. Otherwise the labels are placed adjacent to the axis on the side that belongs to the lower values on the crossing axis.<a id="line-53"/><a id="line-52"/><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">near-axis-other-side</span>: The labels are placed adjacent to the axis on the opposite side as for near-axis.<a id="line-57"/><a id="line-56"/><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outside-end</span>: The labels are placed outside the coordinate region on that side where the crossing axis has its maximum value.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="line-59"/><a id="line-58"/><span class="Attribute_20_Value">outside-start</span>: The labels are placed outside the coordinate region on that side where the crossing axis has its minimum value.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If the <span class="Attribute">chart:axis-label-position</span> attribute is missing but a <span class="Attribute">chart:axis-position</span> attribute is given, the value of the <span class="Attribute">chart:axis-label-position</span> attribute is assumed to be <span class="Attribute_20_Value">near-axis</span>.<a id="line-61"/><a id="line-60"/></p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:axis-label-position</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:axis-label-position</span> attribute are <span class="Attribute_20_Value">near-axis</span>, <span class="Attribute_20_Value">near-axis-other-side</span>, <span class="Attribute_20_Value">outside-start</span> or <span class="Attribute_20_Value">outside-end</span>.</p><h2 class="Heading_20_2"><a id="a20_6chart_axis-position"><span style="margin-right:0.127cm;">20.6</span></a><a id="__RefHeading__1419444_253892949"/><a id="property-chart_axis-position"/>chart:axis-position</h2><p class="Text_20_body">The <span class="Attribute">chart:axis-position</span> attribute specifies the position of the axis line on the scale of the crossing axis.<a id="line-31"/><a id="line-30"/></p><p class="Text_20_body">If the attribute is set for a y-axis, the position indicates a value on the scale of the first x-axis.<a id="line-33"/><a id="line-32"/></p><p class="Text_20_body">If the attribute is set for a x-axis, the position indicates a value on the scale of the first y-axis.<a id="line-35"/><a id="line-34"/></p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element. </p><p class="Text_20_body"><a id="line-39"/><a id="line-38"/>The defined values for the <span class="Attribute">chart:axis-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">end</span>: The axis line is placed at the end of the crossing axis<a id="line-43"/><a id="line-42"/>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">start</span>: The axis line is placed at the start of the crossing axis<a id="line-412"/><a id="line-403"/>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type double: The axis line is placed at the given value on the crossing axis. If the crossing axis is an axis displaying categories rather than values, a value of <span class="Attribute_20_Value_20_Instance">1</span> indicates that the axis should be placed at the first category, a value of <span class="Attribute_20_Value_20_Instance">2</span> indicates that the axis should be placed at the second category and so forth.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:axis-position</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:axis-position</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">end</span> or a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_7chart_connect-bars"><span style="margin-right:0.127cm;">20.7</span></a><a id="__RefHeading__1419446_253892949"/><a id="property-chart_connect-bars"/>chart:connect-bars</h2><p class="Text_20_body">The <span class="Attribute">chart:connect-bars</span> attribute specifies if bars in a bar chart that belong to the same series are connected by lines.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:connect-bars</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: bars belonging to the same series are not connected by lines.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: bars belonging to the same series are connected by lines.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:connect-bars</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:connect-bars</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_8chart_data-label-number"><span style="margin-right:0.127cm;">20.8</span></a><a id="__RefHeading__1419448_253892949"/><a id="property-chart_data-label-number"/>chart:data-label-number</h2><p class="Text_20_body">The <a id="chart_data-label-number"/><span class="Attribute">chart:data-label-number</span> attribute specifies whether the value and/or the percentage of a data point should be displayed within a data label. By default, neither the value nor a percentage is displayed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:data-label-number</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: neither the value nor the percentage should be displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">percentage</span>: only the percentage value should be displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value</span>: only the value should be displayed within the data label.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value-and-percentage</span>: both the value and the percentage should be displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:data-label&gt;</span>, <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Text_20_body">The <span class="Attribute">style:data-style-name</span> attribute can be used together with this attribute to indicate which number format should be used to display the value.</p><p class="Text_20_body">The <span class="Attribute">style:percentage-data-style-name</span> attribute can be used together with this attribute to indicate which number format should be used to display the percentage value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:data-label-number</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:data-label-number</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">value</span>, <span class="Attribute_20_Value">percentage</span> or <span class="Attribute_20_Value">value-and-percentage</span>.</p><h2 class="Heading_20_2"><a id="a20_9chart_data-label-symbol"><span style="margin-right:0.127cm;">20.9</span></a><a id="__RefHeading__1419450_253892949"/><a id="property-chart_data-label-symbol"/>chart:data-label-symbol</h2><p class="Text_20_body">The <span class="Attribute">chart:data-label-symbol</span> attribute specifies whether to display a legend symbol within the data label of a data point.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:data-label&gt;</span>, <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:data-label-symbol</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a legend symbol is not displayed within the data label of a data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a legend symbol is displayed within the data label of a data point.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:data-label-symbol</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:data-label-symbol</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_10chart_data-label-text"><span style="margin-right:0.127cm;">20.10</span></a><a id="__RefHeading__1419452_253892949"/><a id="property-chart_data-label-text"/>chart:data-label-text</h2><p class="Text_20_body">The <a id="chart_data-label-text"/><span class="Attribute">chart:data-label-text</span> attribute specifies whether to display the category within the data label of a data point.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to <span class="Element">&lt;chart:data-label&gt;</span>, <span class="Element">&lt;chart:data-point&gt;</span>, a <span class="Element">&lt;chart:series&gt;</span> or a <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:data-label-text</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a category is not displayed within the data label of a data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a category is displayed within the data label of a data point.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:data-label-text</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:data-label-text</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_11chart_deep"><span style="margin-right:0.127cm;">20.11</span></a><a id="__RefHeading__1419454_253892949"/><a id="property-chart_deep"/>chart:deep</h2><p class="Text_20_body">The <span class="Attribute">chart:deep</span> attribute specifies whether data series are displayed behind each other along the z-axis or not. The <span class="Attribute">chart:deep</span> attribute is ignored unless a <span class="Attribute">chart:three-dimensional</span> attribute is present and has the value true. <a href="#property-chart_three-dimensional">20.58</a></p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:deep</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data series are not displayed behind each other along the z-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data series are displayed behind each other along the z-axis. The z-axis displays the name of the series.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:deep</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:deep</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_12chart_display-label"><span style="margin-right:0.127cm;">20.12</span></a><a id="__RefHeading__1419456_253892949"/><a id="property-chart_display-label"/>chart:display-label</h2><p class="Text_20_body">The <span class="Attribute">chart:display-label</span> attribute specifies whether labels are displayed on an axis or not. </p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Note"><span class="Note_20_Label">Note:</span> The labels controlled by <span class="Attribute">chart:display-label</span> attribute appear on an axis as opposed to being labels for the axis.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:display-label</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: labels are not displayed on an axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: labels are displayed on an axis.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:display-label</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:display-label</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_13chart_error-category"><span style="margin-right:0.127cm;">20.13</span></a><a id="__RefHeading__1419458_253892949"/><a id="property-chart_error-category"/>chart:error-category</h2><p class="Text_20_body">The <span class="Attribute">chart:error-category</span> attribute is used to determine which function is used to calculate error indicators at data points. By default, no error indicators are shown. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:error-category</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cell-range</span>: Use values from cell ranges for positive and negative error indicators. The <span class="Attribute">chart:error-lower-range</span> and <span class="Attribute">chart:error-upper-range</span> attributes determine the cell ranges which contain the values to be used for negative and positive error indicators.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">constant</span>: Use fixed absolute values for both directions: positive and negative The absolute value for a positive direction is given with <span class="Attribute">chart:error-upper-limit</span> attribute. The absolute value for a negative direction is given with <span class="Attribute">chart:error-lower-limit</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">error-margin</span>: Use a fixed percentage of the largest value – this is called error-margin. The percentage value is given within <span class="Attribute">chart:error-margin</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: No error indicators are shown.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">percentage</span>: Use a fixed percentage of each value The percentage value is given within <span class="Attribute">chart:error-percentage</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">standard-deviation</span>: Standard deviation of the values of a series assuming an equal distribution.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">standard-error</span>: Standard error (standard deviation of the mean) of the values of a series.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">variance</span>: Variance of the values of a series assuming an equal distribution.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to <span class="Element">&lt;chart:error-indicator&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-category</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:error-category</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">variance</span>, <span class="Attribute_20_Value">standard-deviation</span>, <span class="Attribute_20_Value">percentage</span>, <span class="Attribute_20_Value">error-margin</span>, <span class="Attribute_20_Value">constant</span>, <span class="Attribute_20_Value">standard-error</span> or <span class="Attribute_20_Value">cell-range</span>.</p><h2 class="Heading_20_2"><a id="a20_14chart_error-lower-indicator"><span style="margin-right:0.127cm;">20.14</span></a><a id="__RefHeading__1419460_253892949"/><a id="property-chart_error-lower-indicator"/>chart:error-lower-indicator</h2><p class="Text_20_body">The <span class="Attribute">chart:error-lower-indicator</span> attribute specifies whether negative error indicators are displayed (the error value is subtracted from the data point value).</p><p class="Text_20_body">This attribute should be used together with the <span class="Attribute">chart:error-category</span> attribute.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:error-lower-indicator</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: negative error indicators are not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: negative error indicators are displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-lower-indicator</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-lower-indicator</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_15chart_error-lower-limit"><span style="margin-right:0.127cm;">20.15</span></a><a id="__RefHeading__1419462_253892949"/><a id="property-chart_error-lower-limit"/>chart:error-lower-limit</h2><p class="Text_20_body">The <span class="Attribute">chart:error-lower-limit</span> attribute specifies the absolute value in the negative direction that is used to display error indicators, if a <span class="Attribute">chart:error-category</span> attribute has the value <span class="Attribute_20_Value">constant</span>. <a href="#property-chart_error-category">20.13</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-lower-limit</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-lower-limit</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_16chart_error-lower-range"><span style="margin-right:0.127cm;">20.16</span></a><a id="__RefHeading__1718342_1219268628"/><a id="property-chart_error-lower-range"/>chart:error-lower-range</h2><p class="Text_20_body">The <span class="Attribute">chart:error-lower-range</span> attribute specifies the cell range used for negative error indicators when a <span class="Attribute">chart:error-category</span> attribute has a value of <span class="Attribute_20_Value">cell-range</span>. <a href="#property-chart_error-category">20.13</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-lower-range</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-lower-range</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a20_17chart_error-margin"><span style="margin-right:0.127cm;">20.17</span></a><a id="__RefHeading__1419464_253892949"/><a id="property-chart_error-margin"/>chart:error-margin</h2><p class="Text_20_body">The <span class="Attribute">chart:error-margin</span> attribute specifies the percentage of the largest value in a series used in the display of error indicators for each data point of a series.</p><p class="Text_20_body">This attribute should be used together with the <span class="Attribute">chart:error-category</span> attribute if it has the value <span class="Attribute_20_Value">error-margin</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-margin</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-margin</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_18chart_error-percentage"><span style="margin-right:0.127cm;">20.18</span></a><a id="__RefHeading__1419466_253892949"/><a id="property-chart_error-percentage"/>chart:error-percentage</h2><p class="Text_20_body">The <span class="Attribute">chart:error-percentage</span> attribute specifies the percentage that is used in the display of error indicators for each data point of a series.</p><p class="Text_20_body">This attribute should be used together with a <span class="Attribute">chart:error-category</span> attribute if the <span class="Attribute">chart:error-category</span> attribute has the value <span class="Attribute_20_Value">percentage</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-percentage</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-percentage</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_19chart_error-upper-indicator"><span style="margin-right:0.127cm;">20.19</span></a><a id="__RefHeading__1419468_253892949"/><a id="property-chart_error-upper-indicator"/>chart:error-upper-indicator</h2><p class="Text_20_body">The <span class="Attribute">chart:error-upper-indicator</span> attribute specifies whether positive error indicators should be displayed (the error value is added to the data point value).</p><p class="Text_20_body">This attribute should be used together with a <span class="Attribute">chart:error-category</span> attribute.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:error-upper-indicator</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: positive error indicators are not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: positive error indicators are displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-upper-indicator</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-upper-indicator</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_20chart_error-upper-limit"><span style="margin-right:0.127cm;">20.20</span></a><a id="__RefHeading__1419470_253892949"/><a id="property-chart_error-upper-limit"/>chart:error-upper-limit</h2><p class="Text_20_body">The <span class="Attribute">chart:error-upper-limit</span> attribute specifies the absolute value in the positive direction that is used to display error indicators, if the <span class="Attribute">chart:error-category</span> attribute has the value <span class="Attribute_20_Value">constant</span>. <a href="#property-chart_error-category">20.13</a></p><p class="Text_20_body">This attribute should be used together with <span class="Attribute">chart:error-category</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-upper-limit</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-upper-limit</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_21chart_error-upper-range"><span style="margin-right:0.127cm;">20.21</span></a><a id="__RefHeading__1718344_1219268628"/><a id="property-chart_error-upper-range"/>chart:error-upper-range</h2><p class="Text_20_body">The <span class="Attribute">chart:error-upper-range</span> attribute specifies the cell range used for positive error indicators when the <span class="Attribute">chart:error-category</span> attribute has the value <span class="Attribute_20_Value">cell-range</span> <a href="#property-chart_error-category">20.13</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:error-upper-range</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:error-upper-range</span> attribute has the data type <span class="Datatype">cellRangeAddressList</span> <a href="#datatype-cellRangeAddressList">18.3.6</a>.</p><h2 class="Heading_20_2"><a id="a20_22chart_gap-width"><span style="margin-right:0.127cm;">20.22</span></a><a id="__RefHeading__1419472_253892949"/><a id="property-chart_gap-width"/>chart:gap-width</h2><p class="Text_20_body">The <span class="Attribute">chart:gap-width</span> attribute specifies a gap between neighboring groups of bars in a bar chart (that is the distance between the last bar in one category and the first bar in the following category). It is specified as an integer percentage relative to the width of a single bar.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:axis&gt;</span> element with <span class="Attribute">chart:dimension</span> attribute set to y. </p><p class="Note"><span class="Note_20_Label">Note:</span> Bars attached to different axis can be arranged differently as long as they are grouped per axis (<span class="Attribute">chart:group-bars-per-axis</span> attribute has the value <span class="Attribute_20_Value">true</span>).</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:gap-width</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:gap-width</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_23chart_group-bars-per-axis"><span style="margin-right:0.127cm;">20.23</span></a><a id="__RefHeading__1419474_253892949"/><a id="property-chart_group-bars-per-axis"/>chart:group-bars-per-axis</h2><p class="Text_20_body">The <span class="Attribute">chart:group-bars-per-axis</span> attribute specifies whether bars in a bar chart are displayed side by side or behind each other when they are attached to different y-axes. </p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:group-bars-per-axis</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: all bars on the same x-axis are handled as one group and are displayed side by side.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: only bars attached to the same x- and y-axis are handled as one group.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:group-bars-per-axis</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:group-bars-per-axis</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_24chart_hole-size"><span style="margin-right:0.127cm;">20.24</span></a><a id="__RefHeading__1419476_253892949"/><a id="property-chart_hole-size"/>chart:hole-size</h2><p class="Text_20_body">The <span class="Attribute">chart:hole-size</span> attribute specifies the diameter of the inner hole of a ring chart as percentage of the outer diameter of the outermost ring.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:hole-size</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:hole-size</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_25chart_include-hidden-cells"><span style="margin-right:0.127cm;">20.25</span></a><a id="__RefHeading__1419478_253892949"/><a id="property-chart_include-hidden-cells"/>chart:include-hidden-cells</h2><p class="Text_20_body">The <span class="Attribute">chart:include-hidden-cells</span> attribute specifies whether data points in hidden cells are plotted in a chart.<a id="line-25"/><a id="line-24"/> The default is to plot data points in hidden cells.</p><p class="Text_20_body">This attribute can be used within styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:include-hidden-cells</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data points in hidden cells are not plotted in a chart.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data points in hidden cells are plotted in a chart.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:include-hidden-cells</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:include-hidden-cells</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_26chart_interpolation"><span style="margin-right:0.127cm;">20.26</span></a><a id="__RefHeading__1419480_253892949"/><a id="property-chart_interpolation"/>chart:interpolation</h2><p class="Text_20_body"> The <span class="Attribute">chart:interpolation</span> attribute specifies interpolations for line and scatter charts.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:interpolation</span> attribute are:</p><ul><li><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b-spline</span> – B-Splines. <a href="#property-chart_spline-resolution">20.51</a> If the <span class="Attribute">chart:spline-resolution</span> attribute has value 1 this is identical to the <span class="Attribute">chart:interpolation</span> attribute value <span class="Attribute_20_Value">none</span>. If the <span class="Attribute">chart:spline-resolution</span> attribute has value <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.3654in; padding:0; " class="fr7" id="Object34"><img style="height:0.4671cm;width:0.9281cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m34ea101b.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">and the <span class="Attribute">chart:spline-order</span> attribute has value <span class="T3">p</span> then given a sequence of data points, a B-spline interpolation with polynomials of degree <span class="T3">p</span> is constructed as described here. First we omit any consecutive repeated data points obtaining </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3807in; padding:0; " class="fr7" id="Object35"><img style="height:0.54cm;width:3.507cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m1b16dc76.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-0.9281cm;">where for all </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.7189in; padding:0; " class="fr7" id="Object37"><img style="height:0.4671cm;width:1.826cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m3841189f.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-4.4351cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3972in; padding:0; " class="fr7" id="Object39"><img style="height:0.54cm;width:3.5489cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5cb9a3ca.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-6.261100000000001cm;">.</div>and the <span class="Attribute">chart:spline-order</span> attribute has value <span class="T3">p</span> then given a sequence of data points, a B-spline interpolation with polynomials of degree <span class="T3">p</span> is constructed as described here. First we omit any consecutive repeated data points obtaining <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3807in; padding:0; " class="fr7" id="Object35"><img style="height:0.54cm;width:3.507cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m1b16dc76.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">where for all </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.7189in; padding:0; " class="fr7" id="Object37"><img style="height:0.4671cm;width:1.826cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m3841189f.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-3.507cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3972in; padding:0; " class="fr7" id="Object39"><img style="height:0.54cm;width:3.5489cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5cb9a3ca.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-5.333cm;">.</div>where for all <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.7189in; padding:0; " class="fr7" id="Object37"><img style="height:0.4671cm;width:1.826cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m3841189f.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3972in; padding:0; " class="fr7" id="Object39"><img style="height:0.54cm;width:3.5489cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5cb9a3ca.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.826cm;">.</div>, <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3972in; padding:0; " class="fr7" id="Object39"><img style="height:0.54cm;width:3.5489cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5cb9a3ca.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">.</div>.<span class="odfLiEnd"/> </div><ul><li><!--Next 'div' was a 'text:p'.--><div class="P17">We then construct a parameter list <!--Next 'div' is a draw:frame.--><div style="height:0.2083in;width:0.602in; padding:0; " class="fr7" id="Object36"><img style="height:0.5291cm;width:1.5291cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_636c535a.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"> using the centripetal method with a power of 0.5: </div> <!--Next 'div' is a draw:frame.--><div style="height:0.9217in;width:2.1925in; padding:0; " class="fr7" id="Object38"><img style="height:2.3411cm;width:5.569cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_2341b03f.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.5291cm;"> for </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.7583in; padding:0; " class="fr7" id="Object40"><img style="height:0.4671cm;width:1.9261cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_7399792d.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-7.0981cm;"> and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2083in;width:0.4154in; padding:0; " class="fr7" id="Object41"><img style="height:0.5291cm;width:1.0551cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_4f1f02f5.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-9.0242cm;">.</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P17">Next we generate a knot vector <!--Next 'div' is a draw:frame.--><div style="height:0.2083in;width:0.678in; padding:0; " class="fr7" id="Object42"><img style="height:0.5291cm;width:1.7221cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_68762b5e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">with </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.8457in; padding:0; " class="fr7" id="Object43"><img style="height:0.4671cm;width:2.1481cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_med4bb24.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.7221cm;">:</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P20"> <!--Next 'div' is a draw:frame.--><div style="height:0.9098in;width:4.0189in; padding:0; " class="fr7" id="Object44"><img style="height:2.3109cm;width:10.208cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5fbad9b0.gif"/></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21">Now let <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.5783in; padding:0; " class="fr7" id="Object45"><img style="height:0.54cm;width:1.4689cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m2250a8b1.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">be the B-spline basis function defined recursively by </div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P20"> <!--Next 'div' is a draw:frame.--><div style="height:0.9362in;width:4.5043in; padding:0; " class="fr7" id="Object46"><img style="height:2.3779cm;width:11.4409cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_618c2856.gif"/></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21">Let <!--Next 'div' is a draw:frame.--><div style="height:0.9583in;width:0.8874in; padding:0; " class="fr7" id="Object49"><img style="height:2.4341cm;width:2.254cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m38a780d1.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"> be the solution of the matrix equation </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.6492in; padding:0; " class="fr7" id="Object50"><img style="height:0.4671cm;width:1.649cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m2571d0c0.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-2.254cm;"> with </div> <!--Next 'div' is a draw:frame.--><div style="height:0.9665in;width:2.6626in; padding:0; " class="fr7" id="Object47"><img style="height:2.4549cm;width:6.763cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_33ce35ec.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-3.903cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.9543in;width:0.9118in; padding:0; " class="fr7" id="Object48"><img style="height:2.4239cm;width:2.316cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m3b906748.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-10.666cm;">.</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21"> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.8217in; padding:0; " class="fr7" id="Object51"><img style="height:0.54cm;width:4.6271cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m567a86e2.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">are the control points of the desired B-spline of degree <span class="T3">p</span> passing through the data points </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3807in; padding:0; " class="fr7" id="Object52"><img style="height:0.54cm;width:3.507cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m1b16dc76.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-4.6271cm;">.</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21">For <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.5654in; padding:0; " class="fr7" id="Object59"><img style="height:0.4671cm;width:1.4361cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m43db3008.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"> let </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.5402in; padding:0; " class="fr7" id="Object57"><img style="height:0.54cm;width:1.3721cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_2557ce57.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.4361cm;">be recursively defined by</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P20"> <!--Next 'div' is a draw:frame.--><div style="height:0.6854in;width:5.3035in; padding:0; " class="fr7" id="Object58"><img style="height:1.7409cm;width:13.4709cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_63df795b.gif"/></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21">If <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.5654in; padding:0; " class="fr7" id="Object60"><img style="height:0.4671cm;width:1.4361cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m43db3008.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2091in;width:0.7744in; padding:0; " class="fr7" id="Object61"><img style="height:0.5311cm;width:1.967cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m632f039a.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.4361cm;">, then </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.5717in; padding:0; " class="fr7" id="Object62"><img style="height:0.54cm;width:1.4521cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m880a161.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-3.4031000000000002cm;">is the point on this B-spline corresponding to the parameter <span class="T3">u</span>. If </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.5654in; padding:0; " class="fr7" id="Object63"><img style="height:0.4671cm;width:1.4361cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m43db3008.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-4.8552cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2091in;width:0.4327in; padding:0; " class="fr7" id="Object64"><img style="height:0.5311cm;width:1.0991cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_6b861cd5.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-6.2913cm;">, then </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.828in; padding:0; " class="fr7" id="Object65"><img style="height:0.54cm;width:2.1031cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_7bcbe814.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-7.3904cm;">is the point on this B-spline corresponding to the parameter <span class="T3">u</span>.</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21">Note: <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.572in; padding:0; " class="fr7" id="Object66"><img style="height:0.54cm;width:1.4529cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m63dc7d57.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"> and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.828in; padding:0; " class="fr7" id="Object67"><img style="height:0.54cm;width:2.1031cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_7bcbe814.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.4529cm;"> are best calculated using de Boor's algorithm for a B-spline of degree <span class="T3">p</span> with control points </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.8217in; padding:0; " class="fr7" id="Object68"><img style="height:0.54cm;width:4.6271cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m567a86e2.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-3.556cm;"> and knots </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2083in;width:0.678in; padding:0; " class="fr7" id="Object69"><img style="height:0.5291cm;width:1.7221cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_68762b5e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-8.1831cm;">.</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P21">The approximation of this B-spline is then plotted by using <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.572in; padding:0; " class="fr7" id="Object54"><img style="height:0.54cm;width:1.4529cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m63dc7d57.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.828in; padding:0; " class="fr7" id="Object55"><img style="height:0.54cm;width:2.1031cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_7bcbe814.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.4529cm;"> to calculate the coordinates of the points on the spline corresponding to the parameters:</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P22"> <!--Next 'div' is a draw:frame.--><div style="height:1.4984in;width:5.0744in; padding:0; " class="fr7" id="Object53"><img style="height:3.8059cm;width:12.889cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m613015a8.gif"/></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></li></ul><p class="P23" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>and connecting these points with straight line segments.<span class="odfLiEnd"/> </p></li><li><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cubic-spline</span> – Cubic Splines. If the <span class="Attribute">chart:spline-resolution</span> attribute has value 1 this is identical to the <span class="Attribute">chart:interpolation</span> attribute value <span class="Attribute_20_Value">none</span>. If the <span class="Attribute">chart:spline-</span><span class="Attribute">resolution</span> attribute has value <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.3654in; padding:0; " class="fr7" id="Object26"><img style="height:0.4671cm;width:0.9281cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m26b0c4d7.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">then given a sequence of data points,</div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3807in; padding:0; " class="fr7" id="Object1"><img style="height:0.54cm;width:3.507cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m13d35d1d.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-0.9281cm;">a cubic spline interpolation is constructed as described here: </div>then given a sequence of data points,<!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.3807in; padding:0; " class="fr7" id="Object1"><img style="height:0.54cm;width:3.507cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m13d35d1d.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">a cubic spline interpolation is constructed as described here: </div>a cubic spline interpolation is constructed as described here: <span class="odfLiEnd"/> </div><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>Find the unique cubic polynomials <!--Next 'div' is a draw:frame.--><div style="height:0.2091in;width:0.8508in; padding:0; " class="fr7" id="Object4"><img style="height:0.5311cm;width:2.161cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m20efeabe.gif"/></div><!--Next 'div' is a draw:frame.--><div style="height:0.2091in;width:0.8957in; padding:0; " class="fr7" id="Object2"><img style="height:0.5311cm;width:2.2751cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5ca9aedc.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-2.161cm;"> and such that:</div><!--Next 'div' is a draw:frame.--><div style="height:0.2091in;width:0.8957in; padding:0; " class="fr7" id="Object2"><img style="height:0.5311cm;width:2.2751cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m5ca9aedc.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"> and such that:</div> and such that:<span class="odfLiEnd"/> </div><ul><li><!--Next 'div' was a 'text:p'.--><div class="P17">for all <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.7193in; padding:0; " class="fr7" id="Object5"><img style="height:0.4671cm;width:1.827cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_366288e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.6307in; padding:0; " class="fr7" id="Object6"><img style="height:0.54cm;width:1.602cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_60208579.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.827cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.9898in; padding:0; " class="fr7" id="Object7"><img style="height:0.54cm;width:2.5141cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m851aafe.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-3.4290000000000003cm;">,</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P17">for all <!--Next 'div' is a draw:frame.--><div style="height:0.2in;width:1.0654in; padding:0; " class="fr7" id="Object8"><img style="height:0.508cm;width:2.7061cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_6cd60e20.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.0543in; padding:0; " class="fr7" id="Object9"><img style="height:0.54cm;width:2.6779cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m23f660f6.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-2.7061cm;">with </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.2126in; padding:0; " class="fr7" id="Object10"><img style="height:0.4671cm;width:0.54cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m530e31fd.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-5.384cm;">denoting the first derivative of <span class="T3">f,</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><div class="P17"><span class="T4">for all </span><!--Next 'div' is a draw:frame.--><div style="height:0.2in;width:1.0654in; padding:0; " class="fr7" id="Object12"><img style="height:0.508cm;width:2.7061cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_6cd60e20.gif"/></div><span class="T4">, </span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.1807in; padding:0; " class="fr7" id="Object13"><img style="height:0.54cm;width:2.999cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m2e81bae4.gif"/></div><span class="T4">with </span><!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.2752in; padding:0; " class="fr7" id="Object14"><img style="height:0.4671cm;width:0.699cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m4c347194.gif"/></div><span class="T4">denoting the second derivative of </span><span class="T3">f,</span></div><!--Next 'div' was a 'text:p'.--><div class="P17">for all <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.7193in; padding:0; " class="fr7" id="Object17"><img style="height:0.4671cm;width:1.827cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_366288e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.6591in; padding:0; " class="fr7" id="Object18"><img style="height:0.54cm;width:1.6741cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m4f93f491.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-1.827cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.0181in; padding:0; " class="fr7" id="Object19"><img style="height:0.54cm;width:2.586cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_358f06cb.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-3.5011cm;">,</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><!--Next 'div' was a 'text:p'.--><div class="P17">for all <!--Next 'div' is a draw:frame.--><div style="height:0.2in;width:1.0654in; padding:0; " class="fr7" id="Object20"><img style="height:0.508cm;width:2.7061cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_6cd60e20.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">, </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.0839in; padding:0; " class="fr7" id="Object21"><img style="height:0.54cm;width:2.7531cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_734cdfb.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-2.7061cm;">with </div> <!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.2272in; padding:0; " class="fr7" id="Object22"><img style="height:0.4671cm;width:0.5771cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m4d2a58d2.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-5.4592cm;">denoting the first derivative of <span class="T3">g,</span></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><div class="P17"><span class="T4">for all </span><!--Next 'div' is a draw:frame.--><div style="height:0.2in;width:1.0654in; padding:0; " class="fr7" id="Object23"><img style="height:0.508cm;width:2.7061cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_6cd60e20.gif"/></div><span class="T4">, </span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.2102in; padding:0; " class="fr7" id="Object24"><img style="height:0.54cm;width:3.0739cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m556cd269.gif"/></div><span class="T4">with </span><!--Next 'div' is a draw:frame.--><div style="height:0.1839in;width:0.2902in; padding:0; " class="fr7" id="Object25"><img style="height:0.4671cm;width:0.7371cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m6b098ba9.gif"/></div><span class="T4">denoting the second derivative of </span><span class="T3">g,</span></div><p class="P23">and</p><ul><li><div class="P17" style="margin-left:1.2809cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.7807in; padding:0; " class="fr7" id="Object15"><img style="height:0.54cm;width:1.983cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m78f3f923.gif"/></div><span class="T4">, </span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.7819in; padding:0; " class="fr7" id="Object16"><img style="height:0.54cm;width:1.986cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_38d6964.gif"/></div><span class="T4">,</span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.7953in; padding:0; " class="fr7" id="Object3"><img style="height:0.54cm;width:2.0201cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m4a419a9e.gif"/></div><span class="T4">and </span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:0.7972in; padding:0; " class="fr7" id="Object11"><img style="height:0.54cm;width:2.0249cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m532ca36e.gif"/></div><span class="T4">if </span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.2189in; padding:0; " class="fr7" id="Object30"><img style="height:0.54cm;width:3.096cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m63e02a82.gif"/></div><span class="T4">(ie. the curve will not be closed) or</span><span class="odfLiEnd"/> </div></li><li><div class="P17" style="margin-left:1.2809cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><!--Next 'div' is a draw:frame.--><div style="height:0.3929in;width:2.5047in; padding:0; " class="fr7" id="Object32"><img style="height:0.998cm;width:6.3619cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_2cc36efd.gif"/></div><span class="T4">and </span><!--Next 'div' is a draw:frame.--><div style="height:0.3929in;width:2.5634in; padding:0; " class="fr7" id="Object33"><img style="height:0.998cm;width:6.511cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m72e50899.gif"/></div><span class="T4">if </span><!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.2189in; padding:0; " class="fr7" id="Object31"><img style="height:0.54cm;width:3.096cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_m3ab6b7ff.gif"/></div><span class="T4">(</span>I<span class="T4">,e. the curve will be closed).</span><span class="odfLiEnd"/> </div></li></ul></li></ul><div class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm"><!-- --></span>With these cubic polynomials we define the splines (piecewise polynomial functions)<!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.8429in; padding:0; " class="fr7" id="Object27"><img style="height:0.54cm;width:4.681cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_1bd94be.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">and </div> <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.8626in; padding:0; " class="fr7" id="Object28"><img style="height:0.54cm;width:4.731cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_7c6079d8.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-4.681cm;">. (In view of the first and fourth conditions above this yields well defined functions <span class="T3">F</span> and <span class="T3">G</span>.) The interpolation line is then obtained by connecting consecutive points in </div> <!--Next 'div' is a draw:frame.--><div style="height:0.4307in;width:5.6654in; padding:0; " class="fr7" id="Object29"><img style="height:1.094cm;width:14.3901cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_36f4054e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-9.411999999999999cm;"> using straight line segments.</div>and <!--Next 'div' is a draw:frame.--><div style="height:0.2126in;width:1.8626in; padding:0; " class="fr7" id="Object28"><img style="height:0.54cm;width:4.731cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_7c6079d8.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">. (In view of the first and fourth conditions above this yields well defined functions <span class="T3">F</span> and <span class="T3">G</span>.) The interpolation line is then obtained by connecting consecutive points in </div> <!--Next 'div' is a draw:frame.--><div style="height:0.4307in;width:5.6654in; padding:0; " class="fr7" id="Object29"><img style="height:1.094cm;width:14.3901cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_36f4054e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:-4.731cm;"> using straight line segments.</div>. (In view of the first and fourth conditions above this yields well defined functions <span class="T3">F</span> and <span class="T3">G</span>.) The interpolation line is then obtained by connecting consecutive points in <!--Next 'div' is a draw:frame.--><div style="height:0.4307in;width:5.6654in; padding:0; " class="fr7" id="Object29"><img style="height:1.094cm;width:14.3901cm;" alt="formula" src="./Pictures/OpenDocument-v1.2-cos01-part1_html_36f4054e.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;"> using straight line segments.</div> using straight line segments.<span class="odfLiEnd"/> </div></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span> - Straight lines. Consecutive data points are connected by straight line segments. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> or <span class="Element">&lt;chart:series&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:interpolation</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:interpolation</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">cubic-spline</span> or <span class="Attribute_20_Value">b-spline</span>.</p><h2 class="Heading_20_2"><a id="a20_27chart_interval-major"><span style="margin-right:0.127cm;">20.27</span></a><a id="__RefHeading__1419482_253892949"/><a id="property-chart_interval-major"/>chart:interval-major</h2><p class="Text_20_body">The <span class="Attribute">chart:interval-major</span> attribute specifies major intervals on an axis <a href="#element-chart_axis">11.8</a>.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:interval-major</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:interval-major</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_28chart_interval-minor-divisor"><span style="margin-right:0.127cm;">20.28</span></a><a id="__RefHeading__1419484_253892949"/><a id="property-chart_interval-minor-divisor"/>chart:interval-minor-divisor</h2><p class="Text_20_body">The <span class="Attribute">chart:interval-minor-divisor</span> attribute specifies a divisor for the <span class="Attribute">chart:interval-major</span> value, the division of which determines the minor interval.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:interval-minor-divisor</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:interval-minor-divisor</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_29chart_japanese-candle-stick"><span style="margin-right:0.127cm;">20.29</span></a><a id="__RefHeading__1419486_253892949"/><a id="property-chart_japanese-candle-stick"/>chart:japanese-candle-stick</h2><p class="Text_20_body">The <span class="Attribute">chart:japanese-candle-stick</span> attribute specifies the display of opening and closing values in a stock chart. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:japanese-candle-stick</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span> – opening and closing values are displayed as left and right tick-lines<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span> – opening and closing values are displayed as colored bars, where the color of the bar depends on whether the opening value is larger than the closing value<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:japanese-candle-stick</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:japanese-candle-stick</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_30chart_label-arrangement"><span style="margin-right:0.127cm;">20.30</span></a><a id="__RefHeading__1419488_253892949"/><a id="property-chart_label-arrangement"/>chart:label-arrangement</h2><p class="Text_20_body">The <span class="Attribute">chart:label-arrangement</span> attribute specifies the arrangement of labels on an axis.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:label-arrangement</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">side-by-side</span>: Labels are not staggered, they are aligned on one line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stagger-even</span>: Even labels are aligned on the same line as used for side by side arrangement. Counting starts with one, so the first label is odd. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stagger-odd</span>: All odd labels are aligned on the line used for side by side arrangement. Counting starts with one, so the first label is odd.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:label-arrangement</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:label-arrangement</span> attribute are <span class="Attribute_20_Value">side-by-side</span>, <span class="Attribute_20_Value">stagger-even</span> or <span class="Attribute_20_Value">stagger-odd</span>.</p><h2 class="Heading_20_2"><a id="a20_31chart_label-position"><span style="margin-right:0.127cm;">20.31</span></a><a id="__RefHeading__1419490_253892949"/><a id="property-chart_label-position"/>chart:label-position</h2><p class="Text_20_body">The <span class="Attribute">chart:label-position</span> attribute specifies where data labels are placed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:label-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">avoid-overlap</span>: an algorithm should be used that tries to place the labels without overlapping each other.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: the data label is placed below the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-left</span>: the data label is placed to the bottom left of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-right</span>: the data label is placed to the bottom right of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: the data label is centered on the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inside</span>: the data label is placed inside the data point ( for pie charts the label is placed inside the piece on the bisecting line aligned to the outer radius, for bar charts the label is inside the bar aligned to that end that is given by the data points value, for polar charts the label is placed on that side of the data point that points to the polar charts center ).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: the data label is placed left of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">near-origin</span>: the data label is placed inside the data point on that side that is near to the origin - where the origin is the beginning of the bar in a bar chart or the base line in an area chart ( for bar charts the label is placed inside the bar like with value inside, but aligned to the opposite end of the bar ).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outside</span>: the data label is placed outside the data point ( for pie charts the label is placed outside the circle aligned to the outer radius, for bar charts the label is outside the bar aligned to that end that is given by the data points value, for polar charts the label is placed on that side of the data point that points away from the polar charts center ).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: the data label is placed right of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: the data label is placed on top of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top-left</span>: the data label is placed to the top left of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top-right</span>: the data label is placed to the top right of the data point.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to <span class="Element">&lt;chart:data-label&gt;</span>, <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:label-position</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:label-position</span> attribute are <span class="Attribute_20_Value">avoid-overlap</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">top-right</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">bottom-right</span>, <span class="Attribute_20_Value">bottom</span>, <span class="Attribute_20_Value">bottom-left</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">top-left</span>, <span class="Attribute_20_Value">inside</span>, <span class="Attribute_20_Value">outside</span> or <span class="Attribute_20_Value">near-origin</span>.</p><h2 class="Heading_20_2"><a id="a20_32chart_label-position-negative"><span style="margin-right:0.127cm;">20.32</span></a><a id="__RefHeading__1419492_253892949"/><a id="property-chart_label-position-negative"/>chart:label-position-negative</h2><p class="Text_20_body">If the <span class="Attribute">chart:label-position-negative</span> attribute is set in addition to a <span class="Attribute">chart:label-position</span> attribute (<a href="#property-chart_label-position">20.31</a>), it is used for all labels that belong to data points with negative values. Otherwise the position set in a <span class="Attribute">chart:label-position</span> attribute is used for positive and negative values. If a <span class="Attribute">chart:label-position-negative</span> attribute is used without a <span class="Attribute">chart:label-position</span> attribute it is ignored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:label-position-negative</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">avoid-overlap</span>: an algorithm should be used that tries to place the labels without overlapping each other.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: the data label is placed below the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-left</span>: the data label is placed to the bottom left of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom-right</span>: the data label is placed to the bottom right of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: the data label is centered on the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inside</span>: the data label is placed inside the data point ( for pie charts the label is placed inside the piece on the bisecting line aligned to the outer radius, for bar charts the label is inside the bar aligned to that end that is given by the data points value, for polar charts the label is placed on that side of the data point that points to the polar charts center ).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: the data label is placed left of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">near-origin</span>: the data label is placed inside the data point on that side that is near to the origin - where the origin is the beginning of the bar in a bar chart or the base line in an area chart ( for bar charts the label is placed inside the bar like with value inside, but aligned to the opposite end of the bar ).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outside</span>: the data label is placed outside the data point ( for pie charts the label is placed outside the circle aligned to the outer radius, for bar charts the label is outside the bar aligned to that end that is given by the data points value, for polar charts the label is placed on that side of the data point that points away from the polar charts center ).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: the data label is placed right of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: the data label is placed on top of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top-left</span>: the data label is placed to the top left of the data point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top-right</span>: the data label is placed to the top right of the data point.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:label-position-negative</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:label-position-negative</span> attribute are <span class="Attribute_20_Value">avoid-overlap</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">top-right</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">bottom-right</span>, <span class="Attribute_20_Value">bottom</span>, <span class="Attribute_20_Value">bottom-left</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">top-left</span>, <span class="Attribute_20_Value">inside</span>, <span class="Attribute_20_Value">outside</span> or <span class="Attribute_20_Value">near-origin</span>.</p><h2 class="Heading_20_2"><a id="a20_33chart_lines__deprecated_"><span style="margin-right:0.127cm;">20.33</span></a><a id="__RefHeading__1419494_253892949"/><a id="property-chart_lines"/>chart:lines (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">chart:lines</span> attribute specifies whether connecting lines between data points are shown. </p><p class="Note"><span class="Note_20_Label">Note: </span>The display of lines can be specified by the <span class="Attribute">draw:stroke</span> attribute. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:lines</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: connecting lines between data points are not shown.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: connecting lines between data points are shown.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:lines</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:lines</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_34chart_link-data-style-to-source"><span style="margin-right:0.127cm;">20.34</span></a><a id="__RefHeading__1419496_253892949"/><a id="property-chart_link-data-style-to-source"/>chart:link-data-style-to-source</h2><p class="Text_20_body">The <span class="Attribute">chart:link-data-style-to-source</span> attribute can only be used in chart documents that are part of a document that provides the data for the chart.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:link-data-style-to-source</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: number format used for rendering axis labels is defined by the <span class="Attribute">style:data-style-name</span> attribute. <a href="#attribute-style_data-style-name">19.469</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: number format used for rendering the axis labels is inherited from the document providing the data. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:link-data-style-to-source</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:link-data-style-to-source</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_35chart_logarithmic"><span style="margin-right:0.127cm;">20.35</span></a><a id="__RefHeading__1419498_253892949"/><a id="property-chart_logarithmic"/>chart:logarithmic</h2><p class="Text_20_body">The <span class="Attribute">chart:logarithmic</span> attribute specifies whether logarithmic scaling will be used on an axis. By default, proportional scaling is used.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:logarithmic</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: proportional scaling is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: logarithmic scaling is used.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:logarithmic</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:logarithmic</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_36chart_maximum"><span style="margin-right:0.127cm;">20.36</span></a><a id="__RefHeading__1419500_253892949"/><a id="property-chart_maximum"/>chart:maximum</h2><p class="Text_20_body">The <span class="Attribute">chart:maximum</span> attribute specifies the maximum value of an axis.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:maximum</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:maximum</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_37chart_mean-value"><span style="margin-right:0.127cm;">20.37</span></a><a id="__RefHeading__1419502_253892949"/><a id="property-chart_mean-value"/>chart:mean-value</h2><p class="Text_20_body">The <span class="Attribute">chart:mean-value</span> attribute specifies whether to display a line that represents the statistical mean value of all data points of a series.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element or a <span class="Element">&lt;chart:series&gt;</span> element. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:mean-value</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: line representing the statistical mean of all the data points in a series is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: line representing the statistical mean of all the data points in a series is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:mean-value</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:mean-value</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_38chart_minimum"><span style="margin-right:0.127cm;">20.38</span></a><a id="__RefHeading__1419504_253892949"/><a id="property-chart_minimum"/>chart:minimum</h2><p class="Text_20_body">The <span class="Attribute">chart:minimum</span> attribute specifies the minimum value of an axis. </p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:minimum</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:minimum</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_39chart_origin"><span style="margin-right:0.127cm;">20.39</span></a><a id="__RefHeading__1419506_253892949"/><a id="property-chart_origin"/>chart:origin</h2><p class="Text_20_body">The <span class="Attribute">chart:origin</span> attribute defines the origin of the graphical representation of a data series attached to an axis. </p><p class="Note"><span class="Note_20_Label">Note:</span> For example, the beginning of the bars in a bar chart or the base line in an area chart can be set by the <span class="Attribute">chart:origin</span> attribute in the style of the y-axis to which the data series is attached. <a id="line-81"/><a id="line-80"/></p><p class="Text_20_body">If the first x-axis has a <span class="Attribute">chart:axis-position</span> attribute, that position is taken to indicate the origin of the data points attached to the first y-axis. It overrides the <span class="Attribute">chart:origin</span> attribute of the first y-axis.<a id="line-833"/><a id="line-823"/></p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:origin</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:origin</span> attribute has the data type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_40chart_overlap"><span style="margin-right:0.127cm;">20.40</span></a><a id="__RefHeading__1419508_253892949"/><a id="property-chart_overlap"/>chart:overlap</h2><p class="Text_20_body">The <span class="Attribute">chart:overlap</span> attribute specifies how much bars within the same category in a bar chart overlap. The attribute value is an integer that is interpreted as a percentage relative to the width of a single bar. Negative values specify gaps between bars. </p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:axis&gt;</span> element when a <span class="Attribute">chart:dimension</span> attribute set to y.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> This allows bars to be attached to different axis arranged differently as long as they are grouped per axis (<span class="Attribute">chart:group-bars-per-axis</span> attribute is <span class="Attribute_20_Value">true</span>).</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:overlap</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:overlap</span> attribute has the data type <span class="Datatype">integer</span> <a href="#datatype-integer">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_41chart_pie-offset"><span style="margin-right:0.127cm;">20.41</span></a><a id="__RefHeading__1419510_253892949"/><a id="property-chart_pie-offset"/>chart:pie-offset</h2><p class="Text_20_body">The <span class="Attribute">chart:pie-offset</span> attribute specifies the distance of a segment from the center of the circle in case of circle charts. The offset is given as an integer which is interpreted as a percentage of the radius of the circle. </p><p class="Text_20_body">In case of ring charts the <span class="Attribute">chart:pie-offset</span> attribute specifies an additional distance of a segment from the center of the circle. The distance is given as percentage of the thickness of the ring. </p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:data-point&gt;</span> or <span class="Element">&lt;chart:series&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:pie-offset</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:pie-offset</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_42chart_percentage"><span style="margin-right:0.127cm;">20.42</span></a><a id="__RefHeading__1419512_253892949"/><a id="property-chart_percentage"/>chart:percentage</h2><p class="Text_20_body">The <span class="Attribute">chart:percentage</span> attribute specifies a percentage accumulation of values per category.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:percentage</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the attribute has no effect <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: values should be accumulated by category. The sum of the values per category is treated as 100 percent and the y-axis displays according percentages. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">y-axis</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:percentage</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:percentage</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_43chart_regression-type"><span style="margin-right:0.127cm;">20.43</span></a><a id="__RefHeading__1419514_253892949"/><a id="property-chart_regression-type"/>chart:regression-type</h2><p class="Text_20_body">The <span class="Attribute">chart:regression-type</span> attribute specifies the regression function for a series. A regression function can be used to approximate the data points in a series. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:regression-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">exponential</span> – Exponential regression – approximate the values of the series using the model: <span class="Formula">y = A·e</span><span class="Formula_20_Super">B·x</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">linear</span> – Linear regression – approximate the values of the series using the model: <span class="Formula">y = A·x + B</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">logarithmic</span> – Logarithmic regression – approximate the values of the series using the model: <span class="Formula">y = A·ln(x) + B</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span> – no regression curve will be displayed (default value)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">power</span> – Regression with a power function – approximate the values of the series using the model: <span class="Formula">y = A·x</span><span class="Formula_20_Super">B</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to <span class="Element">&lt;chart:regression-curve&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:regression-type</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:regression-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">linear</span>, <span class="Attribute_20_Value">logarithmic</span>, <span class="Attribute_20_Value">exponential</span> or <span class="Attribute_20_Value">power</span>.</p><h2 class="Heading_20_2"><a id="a20_44chart_reverse-direction"><span style="margin-right:0.127cm;">20.44</span></a><a id="__RefHeading__1419516_253892949"/><a id="property-chart_reverse-direction"/>chart:reverse-direction</h2><p class="Text_20_body">The <span class="Attribute">chart:reverse-direction</span> attribute specifies whether the direction of an axis follows the Cartesian coordinate system or the reverse. False is the default.</p><p class="Text_20_body">In a Cartesian coordinate system the x-axis points from left to right and the y-axis points from bottom to top. 3D Cartesian coordinate systems are left handed and polar coordinate systems are counter clockwise. If x and y axes are swapped as in horizontal bar charts (when attribute <span class="Attribute">chart:vertical</span> value is <span class="Attribute_20_Value">true</span>), the unswapped coordinate system follows the Cartesian coordinate system and is left handed.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:reverse-direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: direction of axis follows the Cartesian coordinate system.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: direction of axis follows the reverse of the Cartesian coordinate system.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:reverse-direction</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:reverse-direction</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_45chart_right-angled-axes"><span style="margin-right:0.127cm;">20.45</span></a><a id="__RefHeading__1419518_253892949"/><a id="property-chart_right-angled-axes"/>chart:right-angled-axes</h2><p class="Text_20_body">The <span class="Attribute">chart:right-angled-axes</span> attribute specifies a modification of the projection of a 3D chart. In a Cartesian coordinate system the projections of x and y-axis are horizontal and vertical.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element. The chart:right-angled-axes attribute is ignored unless a <span class="Attribute">chart:three-dimensional</span> attribute is present and has the value <span class="Attribute_20_Value">true</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:right-angled-axes</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the attribute has no effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a 3D chart is sheared instead of rotated. For Cartesian coordinate systems the x and y-axis do form a right angle in the 2D-projection.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:right-angled-axes</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:right-angled-axes</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_46chart_scale-text"><span style="margin-right:0.127cm;">20.46</span></a><a id="__RefHeading__1419520_253892949"/><a id="property-chart_scale-text"/>chart:scale-text</h2><p class="Text_20_body">The <span class="Attribute">chart:scale-text</span> attribute specifies that the text contained in an object should be scaled whenever the size of the chart changes. This attribute can appear at all chart objects that contain text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:scale-text</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text contained in an object should not be scaled when the size of its containing chart changes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text contained in an object should be scaled when the size of its containing chart changes.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:scale-text</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:scale-text</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_47chart_series-source__deprecated_"><span style="margin-right:0.127cm;">20.47</span></a><a id="__RefHeading__1419522_253892949"/><a id="property-chart_series-source"/>chart:series-source (deprecated)</h2><p class="Text_20_body">The <span class="Attribute">chart:series-source</span> attribute specifies whether a tabular data for a chart contains all the data series in columns or rows .</p><p class="Text_20_body">The tabular data can be given by the <span class="Attribute">table:cell-range-address</span> attribute at the <span class="Element">&lt;chart:plot-area&gt;</span> element or by the <span class="Element">&lt;table:table&gt;</span> element inside the <span class="Element">&lt;chart:chart&gt;</span> element.</p><p class="Text_20_body">When data is assigned more specifically to a chart element, with a values-cell-range-address attribute on a <span class="Element">&lt;chart:series&gt;</span> element, the more specific data assignment has priority.</p><p class="Text_20_body">The <span class="Attribute">chart:series-source</span> attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:series-source</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">columns</span>: tabular data for a chart contains all the data series in a columns.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">rows</span>: tabular data for a chart contains all the data series in a rows.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:series-source</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:series-source</span> attribute are <span class="Attribute_20_Value">columns</span> or <span class="Attribute_20_Value">rows</span>.</p><h2 class="Heading_20_2"><a id="a20_48chart_sort-by-x-values"><span style="margin-right:0.127cm;">20.48</span></a><a id="__RefHeading__1419524_253892949"/><a id="property-chart_sort-by-x-values"/>chart:sort-by-x-values</h2><p class="Text_20_body">The <span class="Attribute">chart:sort-by-x-values</span> attribute specifies whether the data points of a data series should be displayed in ascending order of the x values, or in the order they are contained in the underlying data. It is evaluated for styles that are assigned to the <span class="Element">&lt;chart:plot-area&gt;</span> element. The <span class="Attribute">chart:sort-by-x-values</span> attribute is used for chart types with data series that contain x-values (for example scatter charts, <a href="#attribute-chart_class">19.15</a>).</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:sort-by-x-values</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: data points of a data series should be displayed in the order they are contained in the underlying data.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: data points of a data series should be displayed in ascending order of the x values.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:sort-by-x-values</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:sort-by-x-values</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_49chart_solid-type"><span style="margin-right:0.127cm;">20.49</span></a><a id="__RefHeading__1419526_253892949"/><a id="property-chart_solid-type"/>chart:solid-type</h2><p class="Text_20_body">The <span class="Attribute">chart:solid-type</span> attribute specifies the rendering of bars in three-dimensional bar charts. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:solid-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cone</span> – bars have the shape of cones<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cuboid</span> – bars have the shape of cuboids<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">cylinder</span> – bars have the shape of cylinders<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">pyramid</span> – bars have the shape of pyramids<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:solid-type</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:solid-type</span> attribute are <span class="Attribute_20_Value">cuboid</span>, <span class="Attribute_20_Value">cylinder</span>, <span class="Attribute_20_Value">cone</span> or <span class="Attribute_20_Value">pyramid</span>.</p><h2 class="Heading_20_2"><a id="a20_50chart_spline-order"><span style="margin-right:0.127cm;">20.50</span></a><a id="__RefHeading__1419528_253892949"/><a id="property-chart_spline-order"/>chart:spline-order</h2><p class="Text_20_body">The <span class="Attribute">chart:spline-order</span> attribute specifies the degree of the polynomials used as part of the spline.</p><p class="Text_20_body">This attribute should be used together with <span class="Attribute">chart:interpolation</span> attribute when it has the value <span class="Attribute_20_Value">b-spline</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:spline-order</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:spline-order</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_51chart_spline-resolution"><span style="margin-right:0.127cm;">20.51</span></a><a id="__RefHeading__1419530_253892949"/><a id="property-chart_spline-resolution"/>chart:spline-resolution</h2><p class="Text_20_body">The <span class="Attribute">chart:spline-resolution</span> attribute specifies the number of straight line segments used between any two data points.</p><p class="Text_20_body">This attribute should be used together with <span class="Attribute">chart:interpolation</span> attribute when it has a value other than <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:spline-resolution</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:spline-resolution</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_52chart_stacked"><span style="margin-right:0.127cm;">20.52</span></a><a id="__RefHeading__1419532_253892949"/><a id="property-chart_stacked"/>chart:stacked</h2><p class="Text_20_body">The <span class="Attribute">chart:stacked</span> attribute specifies the accumulation of the series values per category. Each value is in addition to the other values in the same category. </p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:stacked</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: series values should not be accumulated by category.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: series values should be accumulated by category. Bars in bar charts are stacked on top of each other.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:stacked</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:stacked</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_53chart_symbol-height"><span style="margin-right:0.127cm;">20.53</span></a><a id="__RefHeading__1419534_253892949"/><a id="property-chart_symbol-height"/>chart:symbol-height</h2><p class="Text_20_body">The <span class="Attribute">chart:symbol-height</span> attribute specifies the height of a symbol to be used for a data point in a chart.</p><p class="Text_20_body">This attribute should be used together with <span class="Attribute">chart:symbol-type</span> attribute when the <span class="Attribute">chart:symbol-type</span> attribute has a value other than <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:symbol-height</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:symbol-height</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_54chart_symbol-name"><span style="margin-right:0.127cm;">20.54</span></a><a id="__RefHeading__1419536_253892949"/><a id="property-chart_symbol-name"/>chart:symbol-name</h2><p class="Text_20_body">The <span class="Attribute">chart:symbol-name</span> attribute specifies a symbol to be used for a data point in a chart.</p><p class="Text_20_body">The glyphs associated with the values of the <span class="Attribute">chart:symbol-name</span> attribute are implementation-defined.</p><p class="Text_20_body">This attribute should be used only together with <span class="Attribute">chart:symbol-type</span> attribute and only when the <span class="Attribute">chart:symbol-type</span> attribute has the value <span class="Attribute_20_Value">named-symbol</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:symbol-name</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:symbol-name</span> attribute are <span class="Attribute_20_Value">square</span>, <span class="Attribute_20_Value">diamond</span>, <span class="Attribute_20_Value">arrow-down</span>, <span class="Attribute_20_Value">arrow-up</span>, <span class="Attribute_20_Value">arrow-right</span>, <span class="Attribute_20_Value">arrow-left</span>, <span class="Attribute_20_Value">bow-tie</span>, <span class="Attribute_20_Value">hourglass</span>, <span class="Attribute_20_Value">circle</span>, <span class="Attribute_20_Value">star</span>, <span class="Attribute_20_Value">x</span>, <span class="Attribute_20_Value">plus</span>, <span class="Attribute_20_Value">asterisk</span>, <span class="Attribute_20_Value">horizontal-bar</span> or <span class="Attribute_20_Value">vertical-bar</span>.</p><h2 class="Heading_20_2"><a id="a20_55chart_symbol-type"><span style="margin-right:0.127cm;">20.55</span></a><a id="__RefHeading__1419538_253892949"/><a id="property-chart_symbol-type"/>chart:symbol-type</h2><p class="Text_20_body">The <span class="Attribute">chart:symbol-type</span> attribute specifies if a symbol is used for a data point in a chart, and if so, which type of symbol is to be used.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:symbol-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: the consumer chooses from the list of available named symbols (see <span class="Attribute">chart:symbol-name</span> attribute <a href="#property-chart_symbol-name">20.54</a>), choose a different symbol per series in round-robin fashion,in this order: <span class="Attribute_20_Value">square</span>, <span class="Attribute_20_Value">diamond</span>, <span class="Attribute_20_Value">arrow-down</span>, <span class="Attribute_20_Value">arrow-up</span>, <span class="Attribute_20_Value">arrow-right</span>, <span class="Attribute_20_Value">arrow-left</span>, <span class="Attribute_20_Value">bow-tie</span>, <span class="Attribute_20_Value">hourglass</span>, <span class="Attribute_20_Value">circle</span>, <span class="Attribute_20_Value">star</span>, <span class="Attribute_20_Value">x</span>, <span class="Attribute_20_Value">plus</span>, <span class="Attribute_20_Value">asterisk</span>, <span class="Attribute_20_Value">horizontal-bar</span>, <span class="Attribute_20_Value">vertical-bar</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">named-symbol</span>: a symbol specified within <span class="Attribute">chart:symbol-name</span> attribute should be used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no symbol should be used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">image</span>: an image defined by a <span class="Element">&lt;chart:symbol-image&gt;</span> element is used as symbol. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> elements. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:symbol-type</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:symbol-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">automatic</span>, <span class="Attribute_20_Value">named-symbol</span> or <span class="Attribute_20_Value">image</span>.</p><h2 class="Heading_20_2"><a id="a20_56chart_symbol-width"><span style="margin-right:0.127cm;">20.56</span></a><a id="__RefHeading__1419540_253892949"/><a id="property-chart_symbol-width"/>chart:symbol-width</h2><p class="Text_20_body">The <span class="Attribute">chart:symbol-width</span> attribute specifies the width of a symbol to be used for a data point in a chart.</p><p class="Text_20_body">This attribute should be used together with <span class="Attribute">chart:symbol-type</span> attribute when the <span class="Attribute">chart:symbol-type</span> attribute has a value other than <span class="Attribute_20_Value">none</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:symbol-width</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:symbol-width</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_57chart_text-overlap"><span style="margin-right:0.127cm;">20.57</span></a><a id="__RefHeading__1419542_253892949"/><a id="property-chart_text-overlap"/>chart:text-overlap</h2><p class="Text_20_body">The <span class="Attribute">chart:text-overlap</span> attribute specifies whether axis labels may overlap each other.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:text-overlap</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: axis labels shall not overlap each other.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: axis labels may overlap each other.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:text-overlap</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:text-overlap</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_58chart_three-dimensional"><span style="margin-right:0.127cm;">20.58</span></a><a id="__RefHeading__1419544_253892949"/><a id="property-chart_three-dimensional"/>chart:three-dimensional</h2><p class="Text_20_body">The <span class="Attribute">chart:three-dimensional</span> attribute specifies whether a chart is displayed as a 3D scene.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:three-dimensional</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: chart should not be displayed as a 3D scene.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: chart should be displayed as a 3D scene.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:three-dimensional</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:three-dimensional</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_59chart_tick-marks-major-inner"><span style="margin-right:0.127cm;">20.59</span></a><a id="__RefHeading__1419546_253892949"/><a id="property-chart_tick-marks-major-inner"/>chart:tick-marks-major-inner</h2><p class="Text_20_body">The <span class="Attribute">chart:tick-marks-major-inner</span> attribute specifies the existence of major inner tick marks on an axis. They are drawn with respect to the major interval that may be specified by the <span class="Attribute">chart:interval-major</span> attribute, and are drawn towards the inside of the plot area. That is, they are drawn to the right for an axis displayed on the left hand side of the plot area, and to the left for an axis displayed on the right hand side of the plot area.</p><p class="Text_20_body">If a <span class="Attribute">chart:tick-marks-major-inner</span> attribute and a <span class="Attribute">chart:tick-marks-major-outer</span> attribute are both set to <span class="Attribute_20_Value">true</span>, one tick mark is drawn that crosses the axis.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:tick-marks-major-inner</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: major inner tick marks should not appear on an axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: major inner tick marks should appear on an axis.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:tick-marks-major-inner</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:tick-marks-major-inner</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_60chart_tick-marks-major-outer"><span style="margin-right:0.127cm;">20.60</span></a><a id="__RefHeading__1419548_253892949"/><a id="property-chart_tick-marks-major-outer"/>chart:tick-marks-major-outer</h2><p class="Text_20_body">The <span class="Attribute">chart:tick-marks-major-outer</span> attribute specifies the existence of major outer tick marks on an axis. They are drawn with respect to the major interval that may be specified by the <span class="Attribute">chart:interval-major</span> attribute, and are drawn towards the outside of the plot area. That is, they are drawn to the left for an axis displayed on the left hand side of the plot area, and to the right for an axis displayed on the right hand side of the plot area.</p><p class="Text_20_body">If a <span class="Attribute">chart:tick-marks-major-inner</span> attribute and a <span class="Attribute">chart:tick-marks-major-outer</span> attribute are both set to <span class="Attribute_20_Value">true</span>, one tick mark is drawn that crosses the axis.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:tick-marks-major-outer</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: major outer tick marks should not appear on an axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: major outer tick marks should appear on an axis.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:tick-marks-major-outer</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:tick-marks-major-outer</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_61chart_tick-marks-minor-inner"><span style="margin-right:0.127cm;">20.61</span></a><a id="__RefHeading__1419550_253892949"/><a id="property-chart_tick-marks-minor-inner"/>chart:tick-marks-minor-inner</h2><p class="Text_20_body">The <span class="Attribute">chart:tick-marks-minor-inner</span> attribute specifies the existence of minor inner tick marks on an axis. They are drawn with respect to the minor interval divisor that may be specified by the <span class="Attribute">chart:interval-minor-divisor</span> attribute, and are drawn towards the inside of the plot area. That is, they are drawn to the right for an axis displayed on the left hand side of the plot area, and to the left for an axis displayed on the right hand side of the plot area.</p><p class="Text_20_body">If a <span class="Attribute">chart:tick-marks-minor-inner</span> attribute and a <span class="Attribute">chart:tick-marks-minor-outer</span> attribute are both set to <span class="Attribute_20_Value">true</span>, one tick mark is drawn that crosses the axis.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:tick-marks-minor-inner</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: minor inner tick marks should not appear on an axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: minor inner tick marks should appear on an axis.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:tick-marks-minor-inner</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:tick-marks-minor-inner</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_62chart_tick-marks-minor-outer"><span style="margin-right:0.127cm;">20.62</span></a><a id="__RefHeading__1419552_253892949"/><a id="property-chart_tick-marks-minor-outer"/>chart:tick-marks-minor-outer</h2><p class="Text_20_body">The <span class="Attribute">chart:tick-marks-minor-outer</span> attribute specifies the existence of minor outer tick marks on an axis. They are drawn with respect to the minor interval divisor that may be specified by the <span class="Attribute">chart:interval-minor-divisor</span> attribute, and are drawn towards the outside of the plot area. That is, they are drawn to the left for an axis displayed on the left hand side of the plot area, and to the right for an axis displayed on the right hand side of the plot area.</p><p class="Text_20_body">If a <span class="Attribute">chart:tick-marks-minor-inner</span> attribute and a <span class="Attribute">chart:tick-marks-minor-outer</span> attribute are set to <span class="Attribute_20_Value">true</span>, one tick mark is drawn that crosses the axis.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:tick-marks-minor-outer</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: minor outer tick marks should not appear on an axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: minor outer tick marks should appear on an axis.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:tick-marks-minor-outer</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:tick-marks-minor-outer</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_63chart_tick-mark-position"><span style="margin-right:0.127cm;">20.63</span></a><a id="__RefHeading__1419554_253892949"/><a id="property-chart_tick-mark-position"/>chart:tick-mark-position</h2><p class="Text_20_body">The <span class="Attribute">chart:tick-mark-position</span> attribute specifies the position of the interval marks.<a id="line-66"/><a id="line-65"/></p><p class="Text_20_body"><a id="line-68"/><a id="line-67"/>The defined values for the <span class="Attribute">chart:tick-mark-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">at-labels</span>: interval marks are placed adjacent to axis labels.<a id="line-69"/><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">at-axis</span>: interval marks are placed at the axis line.<a id="line-70"/><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">at-labels-and-axis</span>: interval marks are placed at axis labels and at the axis line.<a id="line-72"/><a id="line-71"/><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This attribute makes a difference only if the labels are not placed at the axis line, that is, if the <span class="Attribute">chart:axis-label-position</span> attribute has the value <span class="Attribute_20_Value">outside-end</span> or <span class="Attribute_20_Value">outside-start</span>.<a id="line-74"/><a id="line-73"/> <a href="#property-chart_axis-label-position">20.5</a></p><p class="Text_20_body">If the <span class="Attribute">chart:tick-mark-position</span> attribute is missing but a <span class="Attribute">chart:axis-position</span> attribute is given, <span class="Attribute">chart:tick-mark-position</span> is assumed to be <span class="Attribute_20_Value">at-labels-and-axis</span>.<a id="line-76"/><a id="line-75"/></p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:tick-mark-position</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:tick-mark-position</span> attribute are <span class="Attribute_20_Value">at-labels</span>, <span class="Attribute_20_Value">at-axis</span> or <span class="Attribute_20_Value">at-labels-and-axis</span>.</p><h2 class="Heading_20_2"><a id="a20_64chart_treat-empty-cells"><span style="margin-right:0.127cm;">20.64</span></a><a id="__RefHeading__1419556_253892949"/><a id="property-chart_treat-empty-cells"/>chart:treat-empty-cells</h2><p class="Text_20_body">The <span class="Attribute">chart:treat-empty-cells</span> attribute specifies how missing and invalid values are plotted in a chart. </p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:treat-empty-cells</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ignore</span>: nothing is plotted for a point with missing values and the plot continues.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">leave-gap</span>: nothing is plotted for a point with missing values and a continuous plot stops and restarts at the next valid point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">use-zero</span>: missing values are replaced with zero.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default behavior is <span class="Attribute_20_Value">ignore</span> for scatter charts (<span class="Attribute">chart:class</span> is <span class="Attribute_20_Value_20_Instance">chart:scatter</span>). For all other chart types the default behavior is <span class="Attribute_20_Value">leave-gap</span>. </p><p class="Text_20_body">This attribute is evaluated for <span class="Attribute_20_Value">chart</span> styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:treat-empty-cells</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">chart:treat-empty-cells</span> attribute are <span class="Attribute_20_Value">use-zero</span>, <span class="Attribute_20_Value">leave-gap</span> or <span class="Attribute_20_Value">ignore</span>.</p><h2 class="Heading_20_2"><a id="a20_65chart_vertical"><span style="margin-right:0.127cm;">20.65</span></a><a id="__RefHeading__1419558_253892949"/><a id="property-chart_vertical"/>chart:vertical</h2><p class="Text_20_body">The <span class="Attribute">chart:vertical</span> attribute specifies whether the x-axis in a Cartesian coordinate system is oriented horizontally or vertically. </p><p class="Note"><span class="Note_20_Label">Note: </span>This attribute is used to distinguish bar (<span class="Attribute">chart:vertical</span><span class="Source_20_Text">=”</span><span class="Attribute_20_Value">true</span><span class="Source_20_Text">”</span>) and column (<span class="Attribute">chart:vertical</span><span class="Source_20_Text">=”</span><span class="Attribute_20_Value">false</span><span class="Source_20_Text">”</span>) charts.</p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:plot-area&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:vertical</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: horizontal x-axis, vertical y-axis.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: vertical x-axis, horizontal y-axis.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:vertical</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:vertical</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_66chart_visible"><span style="margin-right:0.127cm;">20.66</span></a><a id="__RefHeading__1419560_253892949"/><a id="property-chart_visible"/>chart:visible</h2><p class="Text_20_body">The <span class="Attribute">chart:visible</span> attribute specifies if an object in a chart is visible or not. By default, objects are visible. </p><p class="Text_20_body">This attribute is evaluated for chart styles that are applied to a <span class="Element">&lt;chart:axis&gt;</span> element or a <span class="Element">&lt;chart:series&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">chart:visible</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: object is not visible in chart.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: object is visible in chart.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">chart:visible</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">chart:visible</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_67dr3d_ambient-color"><span style="margin-right:0.127cm;">20.67</span></a><a id="__RefHeading__1419562_253892949"/><a id="property-dr3d_ambient-color"/><a id="DDE_LINK18"/>dr3d:ambient-color</h2><p class="Text_20_body">See: <a href="#attribute-dr3d_ambient-color">19.92</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:ambient-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:ambient-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_68dr3d_back-scale"><span style="margin-right:0.127cm;">20.68</span></a><a id="__RefHeading__1419564_253892949"/><a id="property-dr3d_back-scale"/>dr3d:back-scale</h2><p class="Text_20_body">The <span class="Attribute">dr3d:back-scale</span> attribute specifies the proportion of the background geometry for 3D rotation and extrude objects.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:back-scale</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:back-scale</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_69dr3d_backface-culling"><span style="margin-right:0.127cm;">20.69</span></a><a id="__RefHeading__1419566_253892949"/><a id="property-dr3d_backface-culling"/>dr3d:backface-culling</h2><p class="Text_20_body">The <span class="Attribute">dr3d:backface-culling</span> attribute specifies whether backface culling is enabled.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:backface-culling</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">disabled</span>: backface culling is not enabled.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">nabled</span>: backface culling is enabled.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:backface-culling</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:backface-culling</span> attribute are <span class="Attribute_20_Value">enabled</span> or <span class="Attribute_20_Value">disabled</span>.</p><h2 class="Heading_20_2"><a id="a20_70dr3d_close-back"><span style="margin-right:0.127cm;">20.70</span></a><a id="__RefHeading__1419568_253892949"/><a id="property-dr3d_close-back"/>dr3d:close-back</h2><p class="Text_20_body">The <span class="Attribute">dr3d:close-back</span> attribute specifies if a back face is generated. The attribute can be used with 3D extrude and 3D rotation objects. It is only evaluated for geometries that are closed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:close-back</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a back face should not be generated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a back face should be generated.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:close-back</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:close-back</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_71dr3d_close-front"><span style="margin-right:0.127cm;">20.71</span></a><a id="__RefHeading__1419570_253892949"/><a id="property-dr3d_close-front"/>dr3d:close-front</h2><p class="Text_20_body">The <span class="Attribute">dr3d:close-front</span> attribute specifies if a front face is generated. The attribute can be used with 3D extrude and 3D rotation objects. It is only evaluated for geometries that are closed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:close-front</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a front face should not be generated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a front face should be generated.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:close-front</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:close-front</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_72dr3d_depth"><span style="margin-right:0.127cm;">20.72</span></a><a id="__RefHeading__1419572_253892949"/><a id="property-dr3d_depth"/>dr3d:depth</h2><p class="Text_20_body">The <span class="Attribute">dr3d:depth</span> attribute specifies an extrusion depth for extruded objects.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:depth</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:depth</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_73dr3d_diffuse-color"><span style="margin-right:0.127cm;">20.73</span></a><a id="__RefHeading__1419574_253892949"/><a id="property-dr3d_diffuse-color"/>dr3d:diffuse-color</h2><p class="Text_20_body">The <span class="Attribute">dr3d:diffuse-color</span> attribute, along with <span class="Attribute">dr3d:ambient-color</span>, <span class="Attribute">dr3d:emissive-color</span>, and <span class="Attribute">dr3d:specular-color</span> specifies the four colors that define the color of a material.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:diffuse-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:diffuse-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_74dr3d_edge-rounding"><span style="margin-right:0.127cm;">20.74</span></a><a id="__RefHeading__1419576_253892949"/><a id="property-dr3d_edge-rounding"/>dr3d:edge-rounding</h2><p class="Text_20_body">The <span class="Attribute">dr3d:edge-rounding</span> attribute specifies the size of an area at the edges of a geometry that is used for rounding edges, if the geometry of a 3D object is generated during run-time. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:edge-rounding</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:edge-rounding</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_75dr3d_edge-rounding-mode"><span style="margin-right:0.127cm;">20.75</span></a><a id="__RefHeading__1419578_253892949"/><a id="property-dr3d_edge-rounding-mode"/>dr3d:edge-rounding-mode</h2><p class="Text_20_body">The <span class="Attribute">dr3d:edge-rounding-mode</span> attribute specifies how to generate rounded edges.</p><p class="Text_20_body">Creating rounded edges in a 3D environment requires an inner and outer representation of the outline on which rounded edges will appear. </p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:edge-rounding-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">attractive</span>: the edge begins at the inner plane by moving points in the direction of combined perpendicular vectors of both neighboring vectors. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">correct</span>: the inner face is linearly scaled smaller relative to its center and the original polygon is used for the outer face.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:edge-rounding-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:edge-rounding-mode</span> attribute are <span class="Attribute_20_Value">correct</span> or <span class="Attribute_20_Value">attractive</span>.</p><h2 class="Heading_20_2"><a id="a20_76dr3d_emissive-color"><span style="margin-right:0.127cm;">20.76</span></a><a id="__RefHeading__1419580_253892949"/><a id="property-dr3d_emissive-color"/>dr3d:emissive-color</h2><p class="Text_20_body">The <span class="Attribute">dr3d:emissive-color</span> attribute, along with <span class="Attribute">dr3d:ambient-color</span>, <span class="Attribute">dr3d:diffuse-color</span>, and <span class="Attribute">dr3d:specular-color</span> specifies the four colors that define the color of a material.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:emissive-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:emissive-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_77dr3d_end-angle"><span style="margin-right:0.127cm;">20.77</span></a><a id="__RefHeading__1419582_253892949"/><a id="property-dr3d_end-angle"/>dr3d:end-angle</h2><p class="Text_20_body">The <span class="Attribute">dr3d:end-angle</span> attribute specifies the rotation angle for 3D rotation objects. The attribute value is an angle. </p><p class="Text_20_body">A value of 360 degrees defines that the 3D rotation object is closed and completely rotated. This is also the default. Values smaller than 360 degrees define opened 3D rotation objects (segments). Values larger than 360 degrees define 3D rotation objects with more than one rotation. </p><p class="Note"><span class="Note_20_Label">Note:</span>  The visible effect of values larger than 360 degrees only differs from that of 360 degrees when the <span class="Attribute">dr3d:back-scale</span> attribute has a value different than <span class="Attribute_20_Value_20_Instance">100%</span> .</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:end-angle</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:end-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a20_78dr3d_horizontal-segments"><span style="margin-right:0.127cm;">20.78</span></a><a id="__RefHeading__1419584_253892949"/><a id="property-dr3d_horizontal-segments"/>dr3d:horizontal-segments</h2><p class="Text_20_body">The <span class="Attribute">dr3d:horizontal-segments</span> attribute specifies the number of horizontal segments that are used to generate a geometry, if the geometry of a 3D object is generated during run-time. </p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Typical consumers support values between 2 and 256.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:horizontal-segments</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:horizontal-segments</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_79dr3d_lighting-mode"><span style="margin-right:0.127cm;">20.79</span></a><a id="__RefHeading__1419586_253892949"/><a id="property-dr3d_lighting-mode"/>dr3d:lighting-mode</h2><p class="Text_20_body">The <span class="Attribute">dr3d:lighting-mode</span> attribute specifies whether lighting is used for a three-dimensional object.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:lighting-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double-sided</span>: the front and back sides of all planes are displayed if they are visible from the viewer's perspective.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">tandard</span>: Depending on the value of the <span class="Attribute">dr3</span><span class="Attribute">d</span><span class="Attribute">:normals-direction</span> attribute, only the front or only the back side sides of the plane are displayed. The opposite sides are not displayed, whether they are visible from the viewer's perspective or not. <span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note</span>: The <span class="Attribute">dr3d:lighting-mode</span> attribute is also defined for non-3D object uses. <a href="#attribute-dr3d_lighting-mode">19.99</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:lighting-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:lighting-mode</span> attribute are <span class="Attribute_20_Value">standard</span> or <span class="Attribute_20_Value">double-sided</span>.</p><h2 class="Heading_20_2"><a id="a20_80dr3d_normals-direction"><span style="margin-right:0.127cm;">20.80</span></a><a id="__RefHeading__1419588_253892949"/><a id="property-dr3d_normals-direction"/>dr3d:normals-direction</h2><p class="Text_20_body">The <span class="Attribute">dr3d:normals-direction</span> attribute specifies which sides of a 3D object's planes are displayed if the <span class="Attribute">dr3d:lighting-mode</span> attribute has the value 'standard'. </p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:normals-direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inverse</span>: only the back sides of planes are displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">normal</span>: only the front sides of planes are displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The front side of the plane is the one the normal points away from. </p><p class="Text_20_body">The <span class="Attribute">dr3d:normals</span><span class="Attribute">-direction</span> attribute has no effect if the <span class="Attribute">dr3d:lighting-mode</span> attribute has the value <span class="Attribute_20_Value">double-sided</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:normals-direction</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:normals-direction</span> attribute are <span class="Attribute_20_Value">normal</span> or <span class="Attribute_20_Value">inverse</span>.</p><h2 class="Heading_20_2"><a id="a20_81dr3d_normals-kind"><span style="margin-right:0.127cm;">20.81</span></a><a id="__RefHeading__1419590_253892949"/><a id="property-dr3d_normals-kind"/>dr3d:normals-kind</h2><p class="Text_20_body">The <span class="Attribute">dr3d:normals-kind</span> attribute specifies the normal settings for generated lighting.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:normals-kind</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">flat</span>: one normal per flat part.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">object</span>: apply object-specific normals.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sphere</span>: normals behave as the object is a sphere.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:normals-kind</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:normals-kind</span> attribute are <span class="Attribute_20_Value">object</span>, <span class="Attribute_20_Value">flat</span> or <span class="Attribute_20_Value">sphere</span>.</p><h2 class="Heading_20_2"><a id="a20_82dr3d_shadow"><span style="margin-right:0.127cm;">20.82</span></a><a id="__RefHeading__1419592_253892949"/><a id="property-dr3d_shadow"/>dr3d:shadow</h2><p class="Text_20_body">The <span class="Attribute">dr3d:shadow</span> attribute enables or disables a three-dimensional shadow for a three-dimensional object.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:shadow</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hidden</span>: three-dimensional shadow should not be shown for a three-dimensional object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">v</span><span class="Attribute_20_Value">isible</span>: three-dimensional shadow should be shown for a three-dimensional object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:shadow</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:shadow</span> attribute are <span class="Attribute_20_Value">visible</span> or <span class="Attribute_20_Value">hidden</span>.</p><h2 class="Heading_20_2"><a id="a20_83dr3d_shininess"><span style="margin-right:0.127cm;">20.83</span></a><a id="__RefHeading__1419594_253892949"/><a id="property-dr3d_shininess"/>dr3d:shininess</h2><p class="Text_20_body">The <span class="Attribute">dr3d:shininess</span> attribute specifies the shine of a material.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:shininess</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:shininess</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_84dr3d_specular-color"><span style="margin-right:0.127cm;">20.84</span></a><a id="__RefHeading__1419596_253892949"/><a id="property-dr3d_specular-color"/>dr3d:specular-color</h2><p class="Text_20_body">The <span class="Attribute">dr3d:specular-color</span> attribute, along with dr3d:ambient-color, <span class="Attribute">dr3d:diffuse-color</span>, and <span class="Attribute">dr3d:emissive-color</span> specifies the four colors that define the color of a material.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:specular-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:specular-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_85dr3d_texture-filter"><span style="margin-right:0.127cm;">20.85</span></a><a id="__RefHeading__1419598_253892949"/><a id="property-dr3d_texture-filter"/>dr3d:texture-filter</h2><p class="Text_20_body">The <span class="Attribute">dr3d:texture-filter</span> attribute specifies whether texture filtering is enabled.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:texture-filter</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">disabled</span>: texture filtering should not be enabled.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">nabled</span>: texture filtering should be enabled.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:texture-filter</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:texture-filter</span> attribute are <span class="Attribute_20_Value">enabled</span> or <span class="Attribute_20_Value">disabled</span>.</p><h2 class="Heading_20_2"><a id="a20_86dr3d_texture-kind"><span style="margin-right:0.127cm;">20.86</span></a><a id="__RefHeading__1419600_253892949"/><a id="property-dr3d_texture-kind"/>dr3d:texture-kind</h2><p class="Text_20_body">The <span class="Attribute">dr3d:texture-kind</span> attribute specifies if texture changes the luminance, intensity, or color of a shape.</p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:texture-kind</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">color</span>: color of a shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span><span class="Attribute_20_Value">ntensity</span>: intensity of a shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">uminance</span>: luminance of a shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:texture-kind</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:texture-kind</span> attribute are <span class="Attribute_20_Value">luminance</span>, <span class="Attribute_20_Value">intensity</span> or <span class="Attribute_20_Value">color</span>.</p><h2 class="Heading_20_2"><a id="a20_87dr3d_texture-mode"><span style="margin-right:0.127cm;">20.87</span></a><a id="__RefHeading__1419602_253892949"/><a id="property-dr3d_texture-mode"/>dr3d:texture-mode</h2><p class="Text_20_body">The <span class="Attribute">dr3d:texture-mode</span> attribute specifies how the texture is modulated. </p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:texture-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">blend</span>: blends the texture blend color with the object color.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">modulate</span>: modulates the object color with the texture color.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">replace</span>: replaces the object color with the texture color.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:texture-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:texture-mode</span> attribute are <span class="Attribute_20_Value">replace</span>, <span class="Attribute_20_Value">modulate</span> or <span class="Attribute_20_Value">blend</span>.</p><h2 class="Heading_20_2"><a id="a20_88dr3d_texture-generation-mode-x"><span style="margin-right:0.127cm;">20.88</span></a><a id="__RefHeading__1419604_253892949"/><a id="property-dr3d_texture-generation-mode-x"/>dr3d:texture-generation-mode-x</h2><p class="Text_20_body">The <span class="Attribute">dr3d:texture-generation-mode-x</span> attribute, along with the <span class="Attribute">dr3d:texture-generation-mode-y</span> attribute, specifies how textual coordinates are generated. </p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:texture-generation-mode-x</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">object</span>: This value specifies that the standard object projection method is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">parallel</span>: This value specifies a flat parallel projection in the specified degree of freedom (X or Y).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sphere</span>: This value forces projection to wrapping in X and/or Y direction.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:texture-generation-mode-x</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:texture-generation-mode-x</span> attribute are <span class="Attribute_20_Value">object</span>, <span class="Attribute_20_Value">parallel</span> or <span class="Attribute_20_Value">sphere</span>.</p><h2 class="Heading_20_2"><a id="a20_89dr3d_texture-generation-mode-y"><span style="margin-right:0.127cm;">20.89</span></a><a id="__RefHeading__1419606_253892949"/><a id="property-dr3d_texture-generation-mode-y"/>dr3d:texture-generation-mode-y</h2><p class="Text_20_body">The <span class="Attribute">dr3d:texture-generation-mode-y</span> attribute, along with the <span class="Attribute">dr3d:texture-generation-mode-x</span> attribute, specifies how textual coordinates are generated. </p><p class="Text_20_body">The defined values for the <span class="Attribute">dr3d:texture-generation-mode-y</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">object</span>: This value specifies that the standard object projection method is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">parallel</span>: This value specifies a flat parallel projection in the specified degree of freedom (X or Y).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">sphere</span>: This value forces projection to wrapping in X and/or Y direction.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:texture-generation-mode-y</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">dr3d:texture-generation-mode-y</span> attribute are <span class="Attribute_20_Value">object</span>, <span class="Attribute_20_Value">parallel</span> or <span class="Attribute_20_Value">sphere</span>.</p><h2 class="Heading_20_2"><a id="a20_90dr3d_vertical-segments"><span style="margin-right:0.127cm;">20.90</span></a><a id="__RefHeading__1419608_253892949"/><a id="property-dr3d_vertical-segments"/>dr3d:vertical-segments</h2><p class="Text_20_body">The <span class="Attribute">dr3d:vertical-segments</span> attribute specifies the number of vertical segments that are used to generate the geometry, if the geometry of a 3D object is generated during run-time. </p><p class="Text_20_body"><span class="Note_20_Label">Note: </span>Typical consumers support values between 2 and 256.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">dr3d:vertical-segments</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">dr3d:vertical-segments</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_91draw_auto-grow-height"><span style="margin-right:0.127cm;">20.91</span></a><a id="__RefHeading__1419610_253892949"/><a id="property-draw_auto-grow-height"/>draw:auto-grow-height</h2><p class="Text_20_body">The <span class="Attribute">draw:auto-grow-height</span> attributes specifies whether to automatically increase the height of the drawing object if text is added to the drawing object. This attribute is evaluated only for text boxes.</p><p class="Text_20_body">If both <span class="Attribute">draw:auto-grow-width</span> and <span class="Attribute">draw:auto-grow-height</span> are present, a consumer should first grow the size of the drawing object in the dimension of the major text flow (width for horizontal writing, and height for vertical writing). Only after that size component is filled, a consumer should adjust the other dimension to fit the text content. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:auto-grow-height</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: height of a drawing object should not automatically increase if text is added to the drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: height of a drawing object should automatically increase if text is added to the drawing object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:auto-grow-height</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:auto-grow-height</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_92draw_auto-grow-width"><span style="margin-right:0.127cm;">20.92</span></a><a id="__RefHeading__1419612_253892949"/><a id="property-draw_auto-grow-width"/>draw:auto-grow-width</h2><p class="Text_20_body">The <span class="Attribute">draw:auto-grow-width</span> attribute specifies whether to automatically increase the width of the drawing object if text is added to the drawing object. This attribute is evaluated only for text boxes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:auto-grow-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: width of a drawing object should not automatically increase if text is added to the drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: width of a drawing object should automatically increase if text is added to the drawing object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:auto-grow-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:auto-grow-width</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_93draw_background-size"><span style="margin-right:0.127cm;">20.93</span></a><a id="__RefHeading__1419614_253892949"/><a id="property-draw_background-size"/>draw:background-size</h2><p class="Text_20_body">The <span class="Attribute">draw:background-size</span> attribute specifies whether the background of a page is rendered on a full page or only inside the borders of a page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:background-size</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">border</span>: background should be rendered only inside borders of a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">ull</span>: background should be rendered on a full page.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:background-size</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:background-size</span> attribute are <span class="Attribute_20_Value">full</span> or <span class="Attribute_20_Value">border</span>.</p><h2 class="Heading_20_2"><a id="a20_94draw_blue"><span style="margin-right:0.127cm;">20.94</span></a><a id="__RefHeading__1419616_253892949"/><a id="property-draw_blue"/>draw:blue</h2><p class="Text_20_body">The <span class="Attribute">draw:blue</span> attribute specifies together with the attributes <span class="Attribute">draw:green</span> and <span class="Attribute">draw:red</span> a non destructive filter for a linear transformation of the white balance of a pixel image. </p><p class="Text_20_body">If any of these three attributes is specified, an offset is applied to each pixel of an image while is it rendered. The offsets for each color channel is given as a percentage in the range of -100% to +100%. </p><p class="Text_20_body">These offsets is scaled to the range -2^bits to 2^bits, where bits is the number of bits reserved for each color channel within the image. If the resulting value is less than 0 it is set to 0 and if it is greater than the maximum possible value it is set to the maximum. </p><p class="Note"><span class="Note_20_Label">Note:</span> For example, if the <span class="Attribute">draw:blue</span> attribute has the value 50% and the blue color channel has 8 bits, then 128 is added to the blue color value of each pixel inside the image before it is rendered. If <span class="Attribute">draw:blue</span> has the value -50% then 128 is subtracted. </p><p class="Text_20_body">The <span class="Attribute">draw:blue</span> attribute specifies the offset for the blue color channel. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:blue</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:blue</span> attribute has the data type <span class="Datatype">signedZeroToHundredPercent</span> <a href="#datatype-signedZeroToHundredPercent">18.3.30</a>.</p><h2 class="Heading_20_2"><a id="a20_95draw_caption-angle"><span style="margin-right:0.127cm;">20.95</span></a><a id="__RefHeading__1419618_253892949"/><a id="property-draw_caption-angle"/>draw:caption-angle</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-angle</span> attribute specifies the leaving angle of the line of a caption. It is evaluated only if <span class="Attribute">draw:caption-angle-type</span> has the value <span class="Attribute_20_Value">fixed</span>. The attribute value is an angle. See <a href="#datatype-angle">18.3.1</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-angle</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a20_96draw_caption-angle-type"><span style="margin-right:0.127cm;">20.96</span></a><a id="__RefHeading__1419620_253892949"/><a id="property-draw_caption-angle-type"/>draw:caption-angle-type</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-angle-type</span> attribute specifies if the leaving angle of the line of a caption is fixed or free.. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:caption-angle-typ</span><span class="Attribute">e</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: leaving angle of line from caption has been specified by a <span class="Attribute">draw:caption-angle</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">free</span>: consumer can choose the best possible leaving angle of the line from a caption.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-angle-type</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:caption-angle-type</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">free</span>.</p><h2 class="Heading_20_2"><a id="a20_97draw_caption-escape"><span style="margin-right:0.127cm;">20.97</span></a><a id="__RefHeading__1419622_253892949"/><a id="property-draw_caption-escape"/>draw:caption-escape</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-escape</span> attribute specifies the point where a caption's connector is connected to the caption's text area, measured from the top left corner of the text area. The value can be an absolute length or a percentage.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-escape</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:caption-escape</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_98draw_caption-escape-direction"><span style="margin-right:0.127cm;">20.98</span></a><a id="__RefHeading__1419624_253892949"/><a id="property-draw_caption-escape-direction"/>draw:caption-escape-direction</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-escape-direction</span> attribute specifies the leaving direction for the line of a caption. If this is set to <span class="Attribute_20_Value">auto</span> the consumer can choose the best direction.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:caption-escape-direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: consumer should choose best leaving direction for a line of a caption.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal</span>: the leaving line of a caption should be drawn horizontally.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: the leaving line of a caption should be drawn vertically.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-escape-direction</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:caption-escape-direction</span> attribute are <span class="Attribute_20_Value">horizontal</span>, <span class="Attribute_20_Value">vertical</span> or <span class="Attribute_20_Value">auto</span>.</p><h2 class="Heading_20_2"><a id="a20_99draw_caption-fit-line-length"><span style="margin-right:0.127cm;">20.99</span></a><a id="__RefHeading__1419626_253892949"/><a id="property-draw_caption-fit-line-length"/>draw:caption-fit-line-length</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-fit-line-length</span> attribute enables the consumer to determine the best possible length for a caption line.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:caption-fit-line-length</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: length for caption line is fixed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumer should determine the best possible length for a caption line.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-fit-line-length</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-fit-line-length</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_100draw_caption-gap"><span style="margin-right:0.127cm;">20.100</span></a><a id="__RefHeading__1419628_253892949"/><a id="property-draw_caption-gap"/>draw:caption-gap</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-gap</span> attribute specifies the distance between the text area of the caption and the start of the line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-gap</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-gap</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_101draw_caption-line-length"><span style="margin-right:0.127cm;">20.101</span></a><a id="__RefHeading__1419630_253892949"/><a id="property-draw_caption-line-length"/>draw:caption-line-length</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-line-length</span> attribute specifies the length of the first line of a caption. The attribute is only evaluated if <span class="Attribute">draw:caption-fit-line-length</span> has the value <span class="Attribute_20_Value">false</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-line-length</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:caption-line-length</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_102draw_caption-type"><span style="margin-right:0.127cm;">20.102</span></a><a id="__RefHeading__1419632_253892949"/><a id="property-draw_caption-type"/>draw:caption-type</h2><p class="Text_20_body">The <span class="Attribute">draw:caption-type</span> attribute specifies the geometry of the line of a caption. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:caption-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">angled-connector-line</span>: a line in leaving direction is drawn, followed by a line to the caption point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">angled-line</span>: a line is drawn to the caption point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">straight-line</span>: a line perpendicular to the leaving direction is drawn to the caption point.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:caption-type</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:caption-type</span> attribute are <span class="Attribute_20_Value">straight-line</span>, <span class="Attribute_20_Value">angled-line</span> or <span class="Attribute_20_Value">angled-connector-line</span>.</p><h2 class="Heading_20_2"><a id="a20_103draw_color-inversion"><span style="margin-right:0.127cm;">20.103</span></a><a id="__RefHeading__1419634_253892949"/><a id="property-draw_color-inversion"/>draw:color-inversion</h2><p class="Text_20_body">The <span class="Attribute">draw:color-inversion</span> attribute specifies whether the colors in the graphic shape should be inverted.</p><p class="Note"><span class="Note_20_Label">Note:</span> Given a color "#rrggbb", where rr, gg and bb are 8-bit hexadecimal digits, the inverted color is "#RRGGBB" where RR is the 8 bit hexadecimal number obtained as the difference of hexadecimal FF and rr, GG is the 8-bit hexadecimal number obtained as the difference of hexadecimal FF (=256) and gg, and BB is the 8 bit hexadecimal number obtained as the difference of hexadecimal FF (=256) and bb. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:color-inversion</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: colors in a graphic shape should not be inverted.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: colors in a graphic shape should be inverted.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:color-inversion</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:color-inversion</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_104draw_color-mode"><span style="margin-right:0.127cm;">20.104</span></a><a id="__RefHeading__1419636_253892949"/><a id="property-draw_color-mode"/>draw:color-mode</h2><p class="Text_20_body">The <span class="Attribute">draw:color-mode</span> attribute sets the output of colors from a source bitmap or raster graphic.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:color-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">greyscale</span>: image is displayed using intensity only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span><span class="Attribute_20_Value">ono</span>: image is displayed in black and white.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">standard</span>: image is displayed without modification by the <span class="Attribute">draw:color-mode</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">w</span><span class="Attribute_20_Value">atermark</span>: colors are modified to make the resulting image transparent.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:color-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:color-mode</span> attribute are <span class="Attribute_20_Value">greyscale</span>, <span class="Attribute_20_Value">mono</span>, <span class="Attribute_20_Value">watermark</span> or <span class="Attribute_20_Value">standard</span>.</p><h2 class="Heading_20_2"><a id="a20_105draw_contrast"><span style="margin-right:0.127cm;">20.105</span></a><a id="__RefHeading__1419638_253892949"/><a id="property-draw_contrast"/>draw:contrast</h2><p class="Text_20_body">The <span class="Attribute">draw:contrast</span> attribute specifies a signed percentage value that sets the output contrast of a bitmap or raster graphic.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:contrast</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:contrast</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_106draw_decimal-places"><span style="margin-right:0.127cm;">20.106</span></a><a id="__RefHeading__1419640_253892949"/><a id="property-draw_decimal-places"/>draw:decimal-places</h2><p class="Text_20_body">The <span class="Attribute">draw:decimal-places</span> attribute specifies the number of decimal places that are used for the measure text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:decimal-places</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:decimal-places</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_107draw_draw-aspect"><span style="margin-right:0.127cm;">20.107</span></a><a id="__RefHeading__1419642_253892949"/><a id="property-draw_draw-aspect"/>draw:draw-aspect</h2><p class="Text_20_body">The <span class="Attribute">draw:draw-aspect</span> attribute specifies the display embedded objects. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:draw-aspect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">content</span>: Specifies an object is displayed as an embedded object inside a frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">icon</span>: Specifies an icon to display.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">print-view</span>: Specifies an object is displayed as in a print preview.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">thumbnail</span>: Specifies a thumbnail of an object is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:draw-aspect</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:draw-aspect</span> attribute are <span class="Attribute_20_Value">content</span>, <span class="Attribute_20_Value">thumbnail</span>, <span class="Attribute_20_Value">icon</span> or <span class="Attribute_20_Value">print-view</span>.</p><h2 class="Heading_20_2"><a id="a20_108draw_end-guide"><span style="margin-right:0.127cm;">20.108</span></a><a id="__RefHeading__1419644_253892949"/><a id="property-draw_end-guide"/>draw:end-guide</h2><p class="Text_20_body">The <span class="Attribute">draw:end-guide</span> attribute specifies a length that is added to the length of the end extension line. The extension line is extended by this length towards the end reference point.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-guide</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-guide</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_109draw_end-line-spacing-horizontal"><span style="margin-right:0.127cm;">20.109</span></a><a id="__RefHeading__1419646_253892949"/><a id="property-draw_end-line-spacing-horizontal"/>draw:end-line-spacing-horizontal</h2><p class="Text_20_body">The <span class="Attribute">draw:end-line-spacing-horizontal</span> attribute increments the length of the leaving line from the end shape. For line connectors, it specifies the absolute length of the leaving line from the end shape. For other connector types, it is ignored. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-line-spacing-horizontal</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-line-spacing-horizontal</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_110draw_end-line-spacing-vertical"><span style="margin-right:0.127cm;">20.110</span></a><a id="__RefHeading__1419648_253892949"/><a id="property-draw_end-line-spacing-vertical"/>draw:end-line-spacing-vertical</h2><p class="Text_20_body">The <span class="Attribute">draw:end-line-spacing-vertical</span> attribute increments the length of the leaving line from the end shape. For line connectors, it specifies the absolute length of the leaving line from the end shape. For other connector types, it is ignored. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:end-line-spacing-vertical</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:end-line-spacing-vertical</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_111draw_fill"><span style="margin-right:0.127cm;">20.111</span></a><a id="__RefHeading__1419650_253892949"/><a id="property-draw_fill"/>draw:fill</h2><p class="Text_20_body">The <span class="Attribute">draw:fill</span> attribute specifies the fill style for a graphic object. Graphic objects that are not closed will not be filled. </p><p class="Note"><span class="Note_20_Label">Note:</span> A path without a closepath at the end is open and will not be filled.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:fill</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bitmap</span>: the drawing object is filled with the bitmap specified by the <span class="Attribute">draw:fill-image-name</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">gradient</span>: the drawing object is filled with the gradient specified by the <span class="Attribute">draw:fill-gradient-name</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hatch</span>: the drawing object is filled with the hatch specified by the <span class="Attribute">draw:fill-hatch-name</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: the drawing object is not filled.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: the drawing object is filled with the color specified by the <span class="Attribute">draw:fill-color</span> attribute.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:fill</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">bitmap</span>, <span class="Attribute_20_Value">gradient</span> or <span class="Attribute_20_Value">hatch</span>.</p><h2 class="Heading_20_2"><a id="a20_112draw_fill-color"><span style="margin-right:0.127cm;">20.112</span></a><a id="__RefHeading__1419652_253892949"/><a id="property-draw_fill-color"/>draw:fill-color</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-color</span> attribute specifies the color of the fill for a graphic object. It is used only if the <span class="Attribute">draw:fill</span> attribute has one of the values <span class="Attribute_20_Value">solid</span> or <span class="Attribute_20_Value">hatch</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-color</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_113draw_fill-gradient-name"><span style="margin-right:0.127cm;">20.113</span></a><a id="__RefHeading__1419654_253892949"/><a id="property-draw_fill-gradient-name"/>draw:fill-gradient-name</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-gradient-name</span> attribute specifies a gradient style that is used for filling graphic objects. It is used only if the <span class="Attribute">draw:fill</span> attribute has the value <span class="Attribute_20_Value">gradient</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-gradient-name</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-gradient-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_114draw_fill-hatch-name"><span style="margin-right:0.127cm;">20.114</span></a><a id="__RefHeading__1419656_253892949"/><a id="property-draw_fill-hatch-name"/>draw:fill-hatch-name</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-hatch-name</span> attribute specifies a hatch style that is used for filling. It is used only if the <span class="Attribute">draw:fill</span> attribute has the value <span class="Attribute_20_Value">hatch</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-hatch-name</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-hatch-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_115draw_fill-hatch-solid"><span style="margin-right:0.127cm;">20.115</span></a><a id="__RefHeading__1419658_253892949"/><a id="property-draw_fill-hatch-solid"/>draw:fill-hatch-solid</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-hatch-solid</span> attribute specifies whether the background of a hatch filling is solid or transparent.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:fill-hatch-solid</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: background of a hatch filling should be transparent.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: background of a hatch filling is filled with the color specified by the <span class="Attribute">draw:fill-color</span> attribute.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-hatch-solid</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-hatch-solid</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_116draw_fill-image-height"><span style="margin-right:0.127cm;">20.116</span></a><a id="__RefHeading__1419660_253892949"/><a id="property-draw_fill-image-height"/>draw:fill-image-height</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-image-height</span> attribute overrides the logical height of a source image that is used for filling. If the value of the <span class="Attribute">style:repeat</span> attribute is <span class="Attribute_20_Value">stretch</span>, this attribute is ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-image-height</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:fill-image-height</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_117draw_fill-image-name"><span style="margin-right:0.127cm;">20.117</span></a><a id="__RefHeading__1419662_253892949"/><a id="property-draw_fill-image-name"/>draw:fill-image-name</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-image-name</span> attribute specifies a fill image that is used for filling. It is used only if the <span class="Attribute">draw:fill</span> attribute has the value <span class="Attribute_20_Value">bitmap</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-image-name</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-image-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_118draw_fill-image-ref-point"><span style="margin-right:0.127cm;">20.118</span></a><a id="__RefHeading__1419664_253892949"/><a id="property-draw_fill-image-ref-point"/>draw:fill-image-ref-point</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-image-ref-point</span> attribute specifies an alignment of an image in the filling area. </p><p class="Text_20_body">If an alignment (<span class="Attribute">draw:fill-image-ref-point</span>) and a movement (<span class="Attribute">draw:fill-image-ref-point-x</span>, <span class="Attribute">draw:fill-image-ref-point-y</span>) is specified at the same time, the image first is aligned and then moved.</p><p class="Text_20_body">This attribute is only interpreted if the value of the current <span class="Attribute">style:repeat</span> attribute is <span class="Attribute_20_Value">repeat</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:fill-image-ref-point</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: image aligned with the bottom of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">ottom-left</span>: image aligned with the bottom-left of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">ottom-right</span>: image aligned with the bottom-right of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">enter</span>: image aligned with the center of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">eft</span>: image aligned with the left of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ight</span>: image aligned with the right of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op</span>: image aligned with the top of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op-left</span>: image aligned with the top-left of the filling area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op-right</span>: image aligned with the top-right of the filling area.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-image-ref-point</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:fill-image-ref-point</span> attribute are <span class="Attribute_20_Value">top-left</span>, <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">top-right</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">bottom-left</span>, <span class="Attribute_20_Value">bottom</span> or <span class="Attribute_20_Value">bottom-right</span>.</p><h2 class="Heading_20_2"><a id="a20_119draw_fill-image-ref-point-x"><span style="margin-right:0.127cm;">20.119</span></a><a id="__RefHeading__1419666_253892949"/><a id="property-draw_fill-image-ref-point-x"/>draw:fill-image-ref-point-x</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-image-ref-point-x</span> attribute specifies the horizontal movement of an image as a percentage value, where the percentage value is relative to the image width. </p><p class="Text_20_body">If an alignment (<span class="Attribute">draw:fill-image-ref-point</span>) and a movement (<span class="Attribute">draw:fill-image-ref-point-x</span>, <span class="Attribute">draw:fill-image-ref-point-y</span>) is specified at the same time, the image first is aligned and then moved.</p><p class="Text_20_body">This attribute is only interpreted if the value of the current <span class="Attribute">style:repeat</span> attribute is <span class="Attribute_20_Value">repeat</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-image-ref-point-x</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-image-ref-point-x</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_120draw_fill-image-ref-point-y"><span style="margin-right:0.127cm;">20.120</span></a><a id="__RefHeading__1419668_253892949"/><a id="property-draw_fill-image-ref-point-y"/>draw:fill-image-ref-point-y</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-image-ref-point-x</span> attribute specifies the horizontal movement of an image as a percentage value, where the percentage value is relative to the image width. </p><p class="Text_20_body">If an alignment (<span class="Attribute">draw:fill-image-ref-point</span>) and a movement (<span class="Attribute">draw:fill-image-ref-point-x</span>, <span class="Attribute">draw:fill-image-ref-point-y</span>) is specified at the same time, the image first is aligned and then moved.</p><p class="Text_20_body">This attribute is only interpreted if the value of the current <span class="Attribute">style:repeat</span> attribute is <span class="Attribute_20_Value">repeat</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-image-ref-point-y</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fill-image-ref-point-y</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_121draw_fill-image-width"><span style="margin-right:0.127cm;">20.121</span></a><a id="__RefHeading__1419670_253892949"/><a id="property-draw_fill-image-width"/>draw:fill-image-width</h2><p class="Text_20_body">The <span class="Attribute">draw:fill-image-width</span> attribute overrides the logical width of a source image that is used for filling. If the value of the <span class="Attribute">style:repeat</span> attribute is <span class="Attribute_20_Value">stretch</span>, this attribute is ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fill-image-width</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:fill-image-width</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_122draw_fit-to-contour"><span style="margin-right:0.127cm;">20.122</span></a><a id="__RefHeading__1419672_253892949"/><a id="property-draw_fit-to-contour"/>draw:fit-to-contour</h2><p class="Text_20_body">The <span class="Attribute">draw:fit-to-contour</span> attribute specifies whether to stretch the text content of a drawing object to fill the contour of an object. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:fit-to-contour</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text content should not be stretched to fill the contour of an object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text content should be stretched to fill the contour of an object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fit-to-contour</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fit-to-contour</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_123draw_fit-to-size"><span style="margin-right:0.127cm;">20.123</span></a><a id="__RefHeading__1419674_253892949"/><a id="property-draw_fit-to-size"/>draw:fit-to-size</h2><p class="Text_20_body">The <span class="Attribute">draw:fit-to-size</span> attribute specifies whether to stretch the text content of a drawing object to fill an entire object. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:fit-to-size</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text content should not be stretched to fill an entire object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text content should be stretched to fill an entire object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:fit-to-size</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:fit-to-size</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_124draw_frame-display-border"><span style="margin-right:0.127cm;">20.124</span></a><a id="__RefHeading__1419676_253892949"/><a id="property-draw_frame-display-border"/>draw:frame-display-border</h2><p class="Text_20_body">The <span class="Attribute">draw:frame-display-border</span> attribute specifies whether a border is displayed on a floating frame. This attribute can be used with automatic styles only.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:frame-display-border</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a border should not be displayed on a floating frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a border should be displayed on a floating frame.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:frame-display-border</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:frame-display-border</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_125draw_frame-margin-horizontal"><span style="margin-right:0.127cm;">20.125</span></a><a id="__RefHeading__1419678_253892949"/><a id="property-draw_frame-margin-horizontal"/>draw:frame-margin-horizontal</h2><p class="Text_20_body">The <span class="Attribute">draw:frame-margin-horizontal</span> attribute specifies the horizontal margin between the border and the content of the floating frame. If this attribute is not specified, the default margin is used. This attribute can be used with automatic styles only. The value of this attribute shall be a length in pixels.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:frame-margin-horizontal</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:frame-margin-horizontal</span> attribute has the data type <span class="Datatype">nonNegativePixelLength</span> <a href="#datatype-nonNegativePixelLength">18.3.21</a>.</p><h2 class="Heading_20_2"><a id="a20_126draw_frame-display-scrollbar"><span style="margin-right:0.127cm;">20.126</span></a><a id="__RefHeading__1419680_253892949"/><a id="property-draw_frame-display-scrollbar"/>draw:frame-display-scrollbar</h2><p class="Text_20_body">The <span class="Attribute">draw:frame-display-scrollbar</span> attribute specifies whether vertical and horizontal scrollbars are displayed. This attribute can be assigned to automatic styles only.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:frame-display-scrollbar</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: vertical and horizontal scrollbars should not be displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: vertical and horizontal scrollbars should be displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:frame-display-scrollbar</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:frame-display-scrollbar</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_127draw_frame-margin-vertical"><span style="margin-right:0.127cm;">20.127</span></a><a id="__RefHeading__1419682_253892949"/><a id="property-draw_frame-margin-vertical"/>draw:frame-margin-vertical</h2><p class="Text_20_body">The <span class="Attribute">draw:frame-margin-vertical</span> attribute specifies the vertical margin between the border and the content of the floating frame. If this attribute is not specified, the default margin is used. This attribute can be used with automatic styles only. The value of this attribute shall be a length in pixels.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:frame-margin-vertical</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:frame-margin-vertical</span> attribute has the data type <span class="Datatype">nonNegativePixelLength</span> <a href="#datatype-nonNegativePixelLength">18.3.21</a>.</p><h2 class="Heading_20_2"><a id="a20_128draw_gamma"><span style="margin-right:0.127cm;">20.128</span></a><a id="__RefHeading__1419684_253892949"/><a id="property-draw_gamma"/>draw:gamma</h2><p class="Text_20_body">The <span class="Attribute">draw:gamma</span> attribute specifies a value that sets the output gamma of a bitmap or raster graphic.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:gamma</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:gamma</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_129draw_green"><span style="margin-right:0.127cm;">20.129</span></a><a id="__RefHeading__1419686_253892949"/><a id="property-draw_green"/>draw:green</h2><p class="Text_20_body">The <span class="Attribute">draw:green</span> attribute specifies together with the attributes <span class="Attribute">draw:blue</span> and <span class="Attribute">draw:red</span> a non destructive filter for a linear transformation of the white balance of a pixel image. See <a href="#property-draw_blue">20.94</a>.</p><p class="Text_20_body">The <span class="Attribute">draw:green</span> attribute specifies the offset for the green color channel. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:green</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:green</span> attribute has the data type <span class="Datatype">signedZeroToHundredPercent</span> <a href="#datatype-signedZeroToHundredPercent">18.3.30</a>.</p><h2 class="Heading_20_2"><a id="a20_130draw_gradient-step-count"><span style="margin-right:0.127cm;">20.130</span></a><a id="__RefHeading__1419688_253892949"/><a id="property-draw_gradient-step-count"/>draw:gradient-step-count</h2><p class="Text_20_body">The <span class="Attribute">draw:gradient-step-count</span> attribute specifies the gradient step count of a color interpolation to be a fixed value. By default, the step count is automatically calculated based on the size and resolution of the filled area.</p><p class="Text_20_body">A gradient step count of color interpretation shall be 3 or greater. </p><p class="Text_20_body">A gradient step count of color interpretation may be above 256.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:gradient-step-count</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:gradient-step-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_131draw_guide-distance"><span style="margin-right:0.127cm;">20.131</span></a><a id="__RefHeading__1419690_253892949"/><a id="property-draw_guide-distance"/>draw:guide-distance</h2><p class="Text_20_body">The <span class="Attribute">draw:guide-distance</span> attribute specifies the distance between the reference points and the start point of extension lines.</p><p class="Note"><span class="Note_20_Label">Note: </span>This distance may be further modified for the start and end extensions lines individually with the <span class="Attribute">draw:start-guide</span> and <span class="Attribute">draw:end-guide</span> attributes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:guide-distance</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:guide-distance</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_132draw_guide-overhang"><span style="margin-right:0.127cm;">20.132</span></a><a id="__RefHeading__1419692_253892949"/><a id="property-draw_guide-overhang"/>draw:guide-overhang</h2><p class="Text_20_body">The <span class="Attribute">draw:guide-overhang</span> attribute specifies the length of extension lines after their intersection with a dimension line.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:guide-overhang</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:guide-overhang</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_133draw_image-opacity"><span style="margin-right:0.127cm;">20.133</span></a><a id="__RefHeading__1419694_253892949"/><a id="property-draw_image-opacity"/>draw:image-opacity</h2><p class="Text_20_body">The <span class="Attribute">draw:image-opacity</span> attribute specifies the opacity of an image. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:image-opacity</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:image-opacity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a20_134draw_line-distance"><span style="margin-right:0.127cm;">20.134</span></a><a id="__RefHeading__1419696_253892949"/><a id="property-draw_line-distance"/>draw:line-distance</h2><p class="Text_20_body">The <span class="Attribute">draw:line-distance</span> attribute specifies the distance between a reference line (as defined by the reference points) and a dimension line. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:line-distance</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:line-distance</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_135draw_luminance"><span style="margin-right:0.127cm;">20.135</span></a><a id="__RefHeading__1419698_253892949"/><a id="property-draw_luminance"/>draw:luminance</h2><p class="Text_20_body">The <span class="Attribute">draw:luminance</span> attribute specifies a signed percentage value that sets the output luminance of a bitmap or raster graphic.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:luminance</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:luminance</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a20_136draw_marker-end"><span style="margin-right:0.127cm;">20.136</span></a><a id="__RefHeading__1419700_253892949"/><a id="property-draw_marker-end"/>draw:marker-end</h2><p class="Text_20_body">The <span class="Attribute">draw:marker-end</span> attribute specifies a stroke end marker, which is a path that can be connected to the end of a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:marker-end</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:marker-end</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_137draw_marker-end-center"><span style="margin-right:0.127cm;">20.137</span></a><a id="__RefHeading__1419702_253892949"/><a id="property-draw_marker-end-center"/>draw:marker-end-center</h2><p class="Text_20_body">The <span class="Attribute">draw:marker-end-center</span> attribute specifies whether an end marker is centered at the end of a stroke.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:marker-end-center</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: an end marker should not be centered at the end of a stroke.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: an end marker should be centered at the end of a stroke.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:marker-end-center</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:marker-end-center</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_138draw_marker-end-width"><span style="margin-right:0.127cm;">20.138</span></a><a id="__RefHeading__1419704_253892949"/><a id="property-draw_marker-end-width"/>draw:marker-end-width</h2><p class="Text_20_body">The <span class="Attribute">draw:marker-end-width</span> attribute specifies the width of the marker at the end of a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:marker-end-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:marker-end-width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_139draw_marker-start"><span style="margin-right:0.127cm;">20.139</span></a><a id="__RefHeading__1419706_253892949"/><a id="property-draw_marker-start"/>draw:marker-start</h2><p class="Text_20_body">The <span class="Attribute">draw:marker-start</span> attribute specifies a stroke start marker, which is a path that can be connected to the start of a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:marker-start</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:marker-start</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_140draw_marker-start-center"><span style="margin-right:0.127cm;">20.140</span></a><a id="__RefHeading__1419708_253892949"/><a id="property-draw_marker-start-center"/>draw:marker-start-center</h2><p class="Text_20_body">The <span class="Attribute">draw:marker-start-center</span> attribute specifies whether a start marker is centered at the start of a stroke.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:marker-start-center</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: a start marker should not be centered at the start of a stroke.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: a start marker should be centered at the start of a stroke.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:marker-start-center</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:marker-start-center</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_141draw_marker-start-width"><span style="margin-right:0.127cm;">20.141</span></a><a id="__RefHeading__1419710_253892949"/><a id="property-draw_marker-start-width"/>draw:marker-start-width</h2><p class="Text_20_body">The <span class="Attribute">draw:marker-start-width</span> attribute specifies the width of the marker at the start of a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:marker-start-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:marker-start-width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_142draw_measure-align"><span style="margin-right:0.127cm;">20.142</span></a><a id="__RefHeading__1419712_253892949"/><a id="property-draw_measure-align"/>draw:measure-align</h2><p class="Text_20_body">The <span class="Attribute">draw:measure-align</span> attribute specifies the horizontal alignment of a measure text relative to its measure line.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:measure-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: horizontal alignment of a measure text relative to its measure line is chosen by the consumer.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span><span class="Attribute_20_Value">nside</span>: horizontal alignment of a measure text should be inside relative to its measure line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left-outside</span>: horizontal alignment of a measure text should be left-outside relative to its measure line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right-outside</span>: horizontal alignment of a measure text should be right-outside relative to its measure line.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:measure-align</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:measure-align</span> attribute are <span class="Attribute_20_Value">automatic</span>, <span class="Attribute_20_Value">left-outside</span>, <span class="Attribute_20_Value">inside</span> or <span class="Attribute_20_Value">right-outside</span>.</p><h2 class="Heading_20_2"><a id="a20_143draw_measure-vertical-align"><span style="margin-right:0.127cm;">20.143</span></a><a id="__RefHeading__1419714_253892949"/><a id="property-draw_measure-vertical-align"/>draw:measure-vertical-align</h2><p class="Text_20_body">The <span class="Attribute">draw:measure-vertical-align</span> attribute specifies the vertical alignment of a measure text relative to its measure line. If the value of this attribute is <span class="Attribute_20_Value">automatic</span>, the consumer chooses the best position.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:measure-vertical-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">above</span>: vertical alignment of a measure text should be above relative to its measure line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: vertical alignment of a measure text relative to its measure line is chosen by the consumer.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">elow</span>: vertical alignment of a measure text should be below relative to its measure line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">enter</span>: vertical alignment of a measure text should be centered relative to its measure line.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:measure-vertical-align</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:measure-vertical-align</span> attribute are <span class="Attribute_20_Value">automatic</span>, <span class="Attribute_20_Value">above</span>, <span class="Attribute_20_Value">below</span> or <span class="Attribute_20_Value">center</span>.</p><h2 class="Heading_20_2"><a id="a20_144draw_ole-draw-aspect__deprecated_"><span style="margin-right:0.127cm;">20.144</span></a><a id="__RefHeading__1419716_253892949"/><a id="property-draw_ole-draw-aspect"/>draw:ole-draw-aspect (deprecated) </h2><p class="Text_20_body">The <span class="Attribute">draw:ole-draw-aspect</span> attribute specifies the display of embedded objects. See <a title="Inside OLE">[OLE]</a>. </p><p class="Text_20_body">The use of this attribute is deprecated. The <span class="Attribute">draw:draw-aspect</span> attribute should be used instead.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:ole-draw-aspect</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:ole-draw-aspect</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_145draw_opacity"><span style="margin-right:0.127cm;">20.145</span></a><a id="__RefHeading__1419718_253892949"/><a id="property-draw_opacity"/>draw:opacity</h2><p class="Text_20_body">The <span class="Attribute">draw:opacity</span> attribute specifies the opacity for an image or graphic object. The value is a percentage, where 0% is fully transparent and 100% is fully opaque.</p><p class="Text_20_body">The defined value range for the <span class="Attribute">draw:opacity</span> attribute is 0% to 100%, inclusive. </p><p class="Text_20_body">Use of the <span class="Attribute">draw:opacity</span> attribute disables any transparency effect and set the opacity for the fill area of a graphic object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:opacity</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:opacity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a20_146draw_opacity-name"><span style="margin-right:0.127cm;">20.146</span></a><a id="__RefHeading__1419720_253892949"/><a id="property-draw_opacity-name"/>draw:opacity-name</h2><p class="Text_20_body">The <span class="Attribute">draw:opacity-name</span> attribute specifies an opacity gradient that defines the opacity for the fill area of a graphic object. When applying an opacity gradient, the opacity is interpolated as defined in the referenced opacity gradient style. Opacity is applied after other fill styles have been applied to an image or graphic object.</p><p class="Text_20_body">The value of this attribute overrides the <span class="Attribute">draw:opacity</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:opacity-name</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:opacity-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_147draw_parallel"><span style="margin-right:0.127cm;">20.147</span></a><a id="__RefHeading__1419722_253892949"/><a id="property-draw_parallel"/>draw:parallel</h2><p class="Text_20_body">The <span class="Attribute">draw:parallel</span> attribute specifies whether a measure text is displayed parallel to its measure line or perpendicular to it.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:parallel</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: measure text is displayed perpendicular to its measure line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: measure text is displayed parallel to its measure line.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:parallel</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:parallel</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_148draw_placing"><span style="margin-right:0.127cm;">20.148</span></a><a id="__RefHeading__1419724_253892949"/><a id="property-draw_placing"/>draw:placing</h2><p class="Text_20_body">The <span class="Attribute">draw:placing</span> attribute specifies whether the measure line is rendered below or above the edge defined by the two reference points. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:placing</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">above</span>: measure line is rendered above the edge defined by two reference points.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">elow</span>: measure line is rendered below the edge defined by two reference points.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:placing</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:placing</span> attribute are <span class="Attribute_20_Value">below</span> or <span class="Attribute_20_Value">above</span>.</p><h2 class="Heading_20_2"><a id="a20_149draw_red"><span style="margin-right:0.127cm;">20.149</span></a><a id="__RefHeading__1419726_253892949"/><a id="property-draw_red"/>draw:red</h2><p class="Text_20_body">The <span class="Attribute">draw:red</span> attribute specifies together with the attributes <span class="Attribute">draw:blue</span> and <span class="Attribute">draw:green</span> a non destructive filter for a linear transformation of the white balance of a pixel image. See <a href="#property-draw_blue">20.94</a>.</p><p class="Text_20_body">The <span class="Attribute">draw:red</span> attribute specifies the offset for the red color channel. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:red</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:red</span> attribute has the data type <span class="Datatype">signedZeroToHundredPercent</span> <a href="#datatype-signedZeroToHundredPercent">18.3.30</a>.</p><h2 class="Heading_20_2"><a id="a20_150draw_secondary-fill-color"><span style="margin-right:0.127cm;">20.150</span></a><a id="__RefHeading__1419728_253892949"/><a id="property-draw_secondary-fill-color"/>draw:secondary-fill-color</h2><p class="Text_20_body">The <span class="Attribute">draw:secondary-fill-color</span> attribute specifies a secondary fill color. It may be used as fill color for the extrusion.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:secondary-fill-color</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:secondary-fill-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_151draw_shadow"><span style="margin-right:0.127cm;">20.151</span></a><a id="__RefHeading__1419730_253892949"/><a id="property-draw_shadow"/>draw:shadow</h2><p class="Text_20_body">The <span class="Attribute">draw:shadow</span> attribute enables or disables the visibility of a shadow.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:shadow</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hidden</span>: a shadow should not be visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">v</span><span class="Attribute_20_Value">isible</span>: a shadow should be visible.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:shadow</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:shadow</span> attribute are <span class="Attribute_20_Value">visible</span> or <span class="Attribute_20_Value">hidden</span>.</p><h2 class="Heading_20_2"><a id="a20_152draw_shadow-color"><span style="margin-right:0.127cm;">20.152</span></a><a id="__RefHeading__1419732_253892949"/><a id="property-draw_shadow-color"/>draw:shadow-color</h2><p class="Text_20_body">The <span class="Attribute">draw:shadow-color</span> attribute specifies the color in which a shadow is rendered.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:shadow-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:shadow-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_153draw_shadow-offset-x"><span style="margin-right:0.127cm;">20.153</span></a><a id="__RefHeading__1419734_253892949"/><a id="property-draw_shadow-offset-x"/>draw:shadow-offset-x</h2><p class="Text_20_body">The <span class="Attribute">draw:shadow-offset-x</span> attribute along with the <span class="Attribute">draw:shadow-offset-y</span> attribute are used to render a shadow. </p><p class="Text_20_body">A copy of the shape is rendered in the single shadow color (specified by <span class="Attribute">draw:shadow-color</span>) behind the shape. The offset attributes specify the offset between the top left edge of the shape and the top left edge of the border.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:shadow-offset-x</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:shadow-offset-x</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_154draw_shadow-offset-y"><span style="margin-right:0.127cm;">20.154</span></a><a id="__RefHeading__1419736_253892949"/><a id="property-draw_shadow-offset-y"/>draw:shadow-offset-y</h2><p class="Text_20_body">The <span class="Attribute">draw:shadow-offset-y</span> attribute along with the <span class="Attribute">draw:shadow-offset-x</span> attribute are used to render a shadow. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:shadow-offset-y</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:shadow-offset-y</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_155draw_shadow-opacity"><span style="margin-right:0.127cm;">20.155</span></a><a id="__RefHeading__1419738_253892949"/><a id="property-draw_shadow-opacity"/>draw:shadow-opacity</h2><p class="Text_20_body">The <span class="Attribute">draw:shadow-opacity</span> attribute specifies the opacity in which the shadow is rendered. The value of this attribute is a percentage value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:shadow-opacity</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:shadow-opacity</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a20_156draw_show-unit"><span style="margin-right:0.127cm;">20.156</span></a><a id="__RefHeading__1419740_253892949"/><a id="property-draw_show-unit"/>draw:show-unit</h2><p class="Text_20_body">The <span class="Attribute">draw:show-unit</span> attribute specifies the visibility of a unit in the textual presentation of a measure shape.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:show-unit</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: units should not be visible in the textual presentation of a measure shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: units should be visible in the textual presentation of a measure shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:show-unit</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:show-unit</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_157draw_start-guide"><span style="margin-right:0.127cm;">20.157</span></a><a id="__RefHeading__1419742_253892949"/><a id="property-draw_start-guide"/>draw:start-guide</h2><p class="Text_20_body">The <span class="Attribute">draw:start-guide</span> attribute specifies a length that is added to the length of a start extension line. The extension line is extended by this length towards the start reference point. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-guide</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-guide</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_158draw_start-line-spacing-horizontal"><span style="margin-right:0.127cm;">20.158</span></a><a id="__RefHeading__1419744_253892949"/><a id="property-draw_start-line-spacing-horizontal"/>draw:start-line-spacing-horizontal</h2><p class="Text_20_body">The <span class="Attribute">draw:start-line-spacing-horizontal</span> attribute increments the length of the leaving line from the start shape for standard connectors. For lines connectors, these attributes specify the absolute length of the leaving line from the start shape. For other connector types, they are ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-line-spacing-horizontal</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-line-spacing-horizontal</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_159draw_start-line-spacing-vertical"><span style="margin-right:0.127cm;">20.159</span></a><a id="__RefHeading__1419746_253892949"/><a id="property-draw_start-line-spacing-vertical"/>draw:start-line-spacing-vertical</h2><p class="Text_20_body">The <span class="Attribute">draw:start-line-spacing-vertical</span> attribute increments the length of the leaving line from the start shape for standard connectors. For lines connectors, these attributes specify the absolute length of the leaving line from the start shape. For other connector types, they are ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:start-line-spacing-vertical</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:start-line-spacing-vertical</span> attribute has the data type <span class="Datatype">distance</span> <a href="#datatype-distance">18.3.15</a>.</p><h2 class="Heading_20_2"><a id="a20_160draw_stroke"><span style="margin-right:0.127cm;">20.160</span></a><a id="__RefHeading__1419748_253892949"/><a id="property-draw_stroke"/>draw:stroke</h2><p class="Text_20_body">The <span class="Attribute">draw:stroke</span> attribute specifies the style of the stroke on the current object. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:stroke</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dash</span>: stroke referenced by a <span class="Attribute">draw:stroke-dash</span> attribute of a style on the object is drawn.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no stroke is drawn.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: solid stroke is drawn.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:stroke</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:stroke</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">dash</span> or <span class="Attribute_20_Value">solid</span>.</p><h2 class="Heading_20_2"><a id="a20_161draw_stroke-dash"><span style="margin-right:0.127cm;">20.161</span></a><a id="__RefHeading__1419750_253892949"/><a id="property-draw_stroke-dash"/>draw:stroke-dash</h2><p class="Text_20_body">The <span class="Attribute">draw:stroke-dash</span> attribute specifies the dash style that is used for a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:stroke-dash</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:stroke-dash</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_162draw_stroke-dash-names"><span style="margin-right:0.127cm;">20.162</span></a><a id="__RefHeading__1419752_253892949"/><a id="property-draw_stroke-dash-names"/>draw:stroke-dash-names</h2><p class="Text_20_body">The <span class="Attribute">draw:stroke-dash-names</span> attribute specifies a list of dash styles that are used for the stroke in addition to the dash specified by the <span class="Attribute">draw:stroke-dash</span> attribute.</p><p class="Text_20_body">For each dash style referenced by the attribute a stroke using that dash style is drawn on top of the already drawn strokes. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:stroke-dash-names</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:stroke-dash-names</span> attribute has the data type <span class="Datatype">styleNameRefs</span> <a href="#datatype-styleNameRefs">18.3.33</a>.</p><h2 class="Heading_20_2"><a id="a20_163draw_stroke-linejoin"><span style="margin-right:0.127cm;">20.163</span></a><a id="__RefHeading__1419754_253892949"/><a id="property-draw_stroke-linejoin"/>draw:stroke-linejoin</h2><p class="Text_20_body">The <span class="Attribute">draw:stroke-linejoin</span> attribute specifies the shape at the corners of paths or other vector shapes when they are stroked. </p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:stroke-linejoin</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bevel</span>: See §11.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">middle</span>: mean value between joins is used (deprecated)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">miter</span><span class="Definition">: See §11.4 of </span><span class="Definition"><a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a></span><span class="Definition">.</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no shape specified.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">round</span>: See §11.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:stroke-linejoin</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:stroke-linejoin</span> attribute are <span class="Attribute_20_Value">miter</span>, <span class="Attribute_20_Value">round</span>, <span class="Attribute_20_Value">bevel</span>, <span class="Attribute_20_Value">middle</span> or <span class="Attribute_20_Value">none</span>.</p><h2 class="Heading_20_2"><a id="a20_164svg_stroke-linecap"><span style="margin-right:0.127cm;">20.164</span></a><a id="__RefHeading__1419756_253892949"/><a id="property-svg_stroke-linecap"/>svg:stroke-linecap</h2><p class="Text_20_body">The <span class="Attribute">svg:stroke-linecap</span> attribute specifies the shape of the end of open subpaths when they are stroked. </p><p class="Text_20_body">The defined values for the <span class="Attribute">svg:stroke-linecap</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">butt</span>: See §11.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">round</span>: See §11.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">square</span>: See §11.4 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stroke-linecap</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:stroke-linecap</span> attribute are <span class="Attribute_20_Value">butt</span>, <span class="Attribute_20_Value">square</span> or <span class="Attribute_20_Value">round</span>.</p><h2 class="Heading_20_2"><a id="a20_165draw_symbol-color"><span style="margin-right:0.127cm;">20.165</span></a><a id="__RefHeading__1419758_253892949"/><a id="property-draw_symbol-color"/>draw:symbol-color</h2><p class="Text_20_body">The <span class="Attribute">draw:symbol-color</span> attribute defines the color to be used to draw symbols contained on the drawing object.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:symbol-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:symbol-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_166draw_textarea-horizontal-align"><span style="margin-right:0.127cm;">20.166</span></a><a id="__RefHeading__1419760_253892949"/><a id="property-draw_textarea-horizontal-align"/>draw:textarea-horizontal-align</h2><p class="Text_20_body">The <span class="Attribute">draw:textarea-horizontal-align</span> attribute specifies the horizontal alignment of the text area inside a shape.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:textarea-horizontal-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: text area is centered horizontally inside a shape. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">j</span><span class="Attribute_20_Value">ustify</span>: text area is justified horizontally inside a shape. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">eft</span>: text area is left aligned horizontally inside a shape. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ight</span>: text area is right aligned horizontally inside a shape. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:textarea-horizontal-align</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:textarea-horizontal-align</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span> or <span class="Attribute_20_Value">justify</span>.</p><h2 class="Heading_20_2"><a id="a20_167draw_textarea-vertical-align"><span style="margin-right:0.127cm;">20.167</span></a><a id="__RefHeading__1419762_253892949"/><a id="property-draw_textarea-vertical-align"/>draw:textarea-vertical-align</h2><p class="Text_20_body">The <span class="Attribute">draw:textarea-vertical-align</span> attribute specifies the vertical alignment of the text area inside a shape.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:textarea-vertical-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: vertical alignment of text area inside a shape should start at the bottom of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">j</span><span class="Attribute_20_Value">ustify</span>: vertical alignment of text area inside a shape should be justified.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">middle</span>: vertical alignment of text area inside a shape should start at the middle of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">op</span>: vertical alignment of text area inside a shape should start at the top of the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:textarea-vertical-align</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:textarea-vertical-align</span> attribute are <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">middle</span>, <span class="Attribute_20_Value">bottom</span> or <span class="Attribute_20_Value">justify</span>.</p><h2 class="Heading_20_2"><a id="a20_168draw_tile-repeat-offset"><span style="margin-right:0.127cm;">20.168</span></a><a id="__RefHeading__1419764_253892949"/><a id="property-draw_tile-repeat-offset"/>draw:tile-repeat-offset</h2><p class="Text_20_body">The <span class="Attribute">draw:tile-repeat-offset</span> attribute specifies for tiling the translation of each tile in relation to the previous tile. This attribute is only interpreted if the value of the current <span class="Attribute">style:repeat</span> attribute is <span class="Attribute_20_Value">repeat</span>. The value of this attribute is a percentage value representing the tiles repeat offset relative to the tiles height or width, followed by either the word <span class="Attribute_20_Value">horizontal</span> or <span class="Attribute_20_Value">vertical</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:tile-repeat-offset</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal</span>: images are tiled horizontally with regard to the previous tile.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: images are tiled vertically with regard to the previous tile.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:tile-repeat-offset</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:tile-repeat-offset</span> attribute has two white space separated values. The first value is of type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>. The second value is one of: <span class="Attribute_20_Value">horizontal</span> or <span class="Attribute_20_Value">vertical</span>.</p><h2 class="Heading_20_2"><a id="a20_169draw_visible-area-height"><span style="margin-right:0.127cm;">20.169</span></a><a id="__RefHeading__1419766_253892949"/><a id="property-draw_visible-area-height"/>draw:visible-area-height</h2><p class="Text_20_body">The visible area of an object may be specified by the <span class="Attribute">draw:visible-area-height</span> attribute along with the <span class="Attribute">draw:visible-area-left</span>, <span class="Attribute">draw:visible-area-top</span>, <span class="Attribute">draw:visible-</span><span class="Attribute">area-width</span> attributes. It is implementation-defined whether these attributes are used to specify the visible area, or whether the producer of the object stores the visible area within the object itself. </p><p class="Text_20_body">When the entire object is visible, the values of the <span class="Attribute">draw:visible-area-left</span> and <span class="Attribute">draw:visible-area-top</span> attributes are <span class="Attribute_20_Value_20_Instance">0</span> and the <span class="Attribute">draw:visible-area-width</span> and <span class="Attribute">draw:visible-area-height</span> attributes specify the size of the object. These attributes can be assigned to automatic styles only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:visible-area-height</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:visible-area-height</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_170draw_visible-area-left"><span style="margin-right:0.127cm;">20.170</span></a><a id="__RefHeading__1419768_253892949"/><a id="property-draw_visible-area-left"/>draw:visible-area-left</h2><p class="Text_20_body">The visible area of an object may be specified by the <span class="Attribute">draw:visible-area-left</span> attribute along with the <span class="Attribute">draw:visible-area-height</span>, <span class="Attribute">draw:visible-area-top</span>, <span class="Attribute">draw:visible-area-width</span> attributes. It is implementation-defined whether these attributes are used to specify the visible area, or whether the producer of the object stores the visible area within the object itself. </p><p class="Text_20_body">When the entire object is visible, the values of the <span class="Attribute">draw:visible-area-left</span> and <span class="Attribute">draw:visible-area-top</span> attributes are <span class="Attribute_20_Value_20_Instance">0</span> and the <span class="Attribute">draw:visible-area-width</span> and <span class="Attribute">draw:visible-area-height</span> attributes specify the size of the object. These attributes can be assigned to automatic styles only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:visible-area-left</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:visible-area-left</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_171draw_visible-area-top"><span style="margin-right:0.127cm;">20.171</span></a><a id="__RefHeading__1419770_253892949"/><a id="property-draw_visible-area-top"/>draw:visible-area-top</h2><p class="Text_20_body">The visible area of an object may be specified by the <span class="Attribute">draw:visible-area-top</span> attribute along with the <span class="Attribute">draw:visible-area-left</span>, <span class="Attribute">draw:visible-area-height</span>, <span class="Attribute">draw:visible-area-width</span> attributes. It is implementation-defined whether these attributes are used to specify the visible area, or whether the producer of the object stores the visible area within the object itself. </p><p class="Text_20_body">When the entire object is visible, the values of the <span class="Attribute">draw:visible-area-left</span> and <span class="Attribute">draw:visible-area-top</span> attributes are <span class="Attribute_20_Value_20_Instance">0</span> and the <span class="Attribute">draw:visible-area-width</span> and <span class="Attribute">draw:visible-area-height</span> attributes specify the size of the object. These attributes can be assigned to automatic styles only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:visible-area-top</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:visible-area-top</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_172draw_visible-area-width"><span style="margin-right:0.127cm;">20.172</span></a><a id="__RefHeading__1419772_253892949"/><a id="property-draw_visible-area-width"/>draw:visible-area-width</h2><p class="Text_20_body">The visible area of an object may be specified by the <span class="Attribute">draw:visible-area-width</span> attribute along with the <span class="Attribute">draw:visible-area-left</span>, <span class="Attribute">draw:visible-area-top</span>, <span class="Attribute">draw:visible-</span><span class="Attribute">area-height</span> attributes. It is implementation-defined whether these attributes are used to specify the visible area, or whether the producer of the object stores the visible area within the object itself. </p><p class="Text_20_body">When the entire object is visible, the values of the <span class="Attribute">draw:visible-area-left</span> and <span class="Attribute">draw:visible-area-top</span> attributes are <span class="Attribute_20_Value_20_Instance">0</span> and the <span class="Attribute">draw:visible-area-width</span> and <span class="Attribute">draw:visible-area-height</span> attributes specify the size of the object. These attributes can be assigned to automatic styles only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:visible-area-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">draw:visible-area-width</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_173draw_unit"><span style="margin-right:0.127cm;">20.173</span></a><a id="__RefHeading__1419774_253892949"/><a id="property-draw_unit"/>draw:unit</h2><p class="Text_20_body">The <span class="Attribute">draw:unit</span> attribute specifies the unit of measurement used in the textual presentation of a measure shape.</p><p class="Text_20_body">The defined values for the <span class="Attribute">draw:unit</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: unit of measurement chosen by consumer. <span class="odfLiEnd"/> </p></li><li><p class="P24" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">mm</span>: millimeter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">m</span>: centimeter.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span>: meter<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">km</span>: kilometer.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">t</span>: point.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">pc</span>: pica.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inch</span>: inch.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">t</span>: foot.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span><span class="Attribute_20_Value">i</span>: mile.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:unit</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:unit</span> attribute are <span class="Attribute_20_Value">automatic</span>, <span class="Attribute_20_Value">mm</span>, <span class="Attribute_20_Value">cm</span>, <span class="Attribute_20_Value">m</span>, <span class="Attribute_20_Value">km</span>, <span class="Attribute_20_Value">pt</span>, <span class="Attribute_20_Value">pc</span>, <span class="Attribute_20_Value">inch</span>, <span class="Attribute_20_Value">ft</span> or <span class="Attribute_20_Value">mi</span>.</p><h2 class="Heading_20_2"><a id="a20_174draw_wrap-influence-on-position"><span style="margin-right:0.127cm;">20.174</span></a><a id="__RefHeading__1419776_253892949"/><a id="property-draw_wrap-influence-on-position"/>draw:wrap-influence-on-position</h2><p class="Text_20_body">The <span class="Attribute">draw:wrap-influence-on-position</span> attribute specifies placement options for two or more frames or graphic objects with <span class="Attribute">style:wrap</span> properties that influence the placement of the other object. (<a href="#property-style_wrap">20.390</a>) It is intended as a hint to the layout algorithm to help determine the placement of frames in cases where several correct placements are possible.</p><p class="Text_20_body">The situation in which this attribute makes a difference is when the anchor, position and wrapping mode of a frame influence each other. For example, consider a paragraph of text with two images positioned above the anchor. Without wrapping, the images overlie the text and can simply be placed at the given offset from the anchor.</p><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is a draw:frame.--><div style="width:3.1492in; padding:0; " class="fr2" id="Frame2"><!--Next 'div' was a 'draw:text-box'.--><div style="min-height:0.1965in;"><div class="Figure"><!--Next 'div' is a draw:frame.--><div style="height:0.8189in;width:0.7874in; padding:0; " class="fr5" id="graphics2"><img style="height:2.08cm;width:2cm;" alt="" src="./Pictures/100000000000009A0000009122A8E996.png"/></div></div><p class="Figure">Figure <a id="refFigure1"/>2 - Image positions without wrapping</p></div></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><p class="Text_20_body">If wrap-around is enabled, the text hidden behind the images now should flow around the images, making the first paragraph use more space than previously. This moves the anchor position further down. If the placement is only done once and concurrently for all objects, this is the final result. This corresponds to the object <span class="Source_20_Text">once-concurrently</span>.</p><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is a draw:frame.--><div style="width:3.1492in; padding:0; " class="fr3" id="Frame3"><!--Next 'div' was a 'draw:text-box'.--><div style="min-height:0.1965in;"><div class="Figure"><!--Next 'div' is a draw:frame.--><div style="height:0.8189in;width:0.7874in; padding:0; " class="fr5" id="graphics3"><img style="height:2.08cm;width:2cm;" alt="" src="./Pictures/100000000000009A000000A052ACB0F4.png"/></div></div><p class="Figure">Figure <a id="refFigure2"/>3 - Image positions for “once-concurrently”</p></div></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><p class="Text_20_body">If one image is processed at a time, the position shown Figure <a href="#refFigure4">5</a> results. This corresponds to the option <span class="Source_20_Text">once-successive</span>.</p><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is a draw:frame.--><div style="width:3.1492in; padding:0; " class="fr3" id="Frame4"><!--Next 'div' was a 'draw:text-box'.--><div style="min-height:0.1965in;"><div class="Figure"><!--Next 'div' is a draw:frame.--><div style="height:0.8189in;width:0.7874in; padding:0; " class="fr5" id="graphics4"><img style="height:2.08cm;width:2cm;" alt="" src="./Pictures/100000000000009A000000A03132DB2D.png"/></div></div><p class="Figure">Figure <a id="refFigure3"/>4 - Image positions for “once-successive”</p></div></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><p class="Text_20_body">If the images are placed iteratively, until a position is found which corresponds to the given offset from the anchor, a placement that fully satisfies all the given layout formatting properties can be achieved. This corresponds to the option <span class="Source_20_Text">iterative</span>.</p><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is a draw:frame.--><div style="width:3.1492in; padding:0; " class="fr3" id="Frame5"><!--Next 'div' was a 'draw:text-box'.--><div style="min-height:0.1965in;"><div class="Figure"><!--Next 'div' is a draw:frame.--><div style="height:0.8189in;width:0.7874in; padding:0; " class="fr5" id="graphics5"><img style="height:2.08cm;width:2cm;" alt="" src="./Pictures/100000000000009A000000A0BDF285E0.png"/></div></div><p class="Figure">Figure <a id="refFigure4"/>5 - Image positions for iterative</p></div></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><p class="Text_20_body">The defined values for the <span class="Attribute">draw:wrap-influence-on-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">iterative</span>: images are placed iteratively until all specified layout formatting properties are satisfied.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">once-concurrent</span>: images are aligned with one another.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">o</span><span class="Attribute_20_Value">nce-successive</span>: subsequent image is placed after the preceding image.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">draw:wrap-influence-on-position</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">draw:wrap-influence-on-position</span> attribute are <span class="Attribute_20_Value">iterative</span>, <span class="Attribute_20_Value">once-concurrent</span> or <span class="Attribute_20_Value">once-successive</span>.</p><h2 class="Heading_20_2"><a id="a20_175fo_background-color"><span style="margin-right:0.127cm;">20.175</span></a><a id="__RefHeading__1419778_253892949"/><a id="property-fo_background-color"/>fo:background-color</h2><p class="Text_20_body">The <span class="Attribute">fo:background-color</span> attribute specifies a background color for characters, paragraphs, text sections, frames, page bodies, headers, footers, tables, table rows and tables. This can be transparent or a color. If the value is set to transparent, it switches off any background image that is specified by a <span class="Element">&lt;style:background-image&gt;</span>. <a href="#element-style_background-image">17.3</a></p><p class="Text_20_body">If a value for a <span class="Attribute">draw:fill</span> attribute is provided in a style, any background image that is specified by a <span class="Element">&lt;style:background-image&gt;</span> element and any background color that is specified with the <span class="Attribute">fo:background-color</span> attribute are switched off. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:background-color</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>, <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>, <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>, <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:background-color</span> attribute are <span class="Attribute_20_Value">transparent</span> or a value of type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_176fo_Border_Properties"><span style="margin-right:0.127cm;">20.176</span></a><a id="__RefHeading__1419780_253892949"/><a id="FO_Border_Properties"/>fo Border Properties</h2><h3 class="Heading_20_3"><a id="a20_176_1General"><span style="margin-right:0.127cm;">20.176.1</span></a><a id="__RefHeading__1419782_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">fo:border</span>, <span class="Attribute">fo:border-top</span>, <span class="Attribute">fo:border-bottom</span>, <span class="Attribute">fo:border-left</span> and <span class="Attribute">fo:border-right</span> attributes specify border properties for these elements:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:graphic-properties&gt;</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:header-footer-properties&gt;</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:page-layout-properties&gt;</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:paragraph-properties&gt;</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:table-cell-properties&gt;</span><span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a20_176_2fo_border"><span style="margin-right:0.127cm;">20.176.2</span></a><a id="__RefHeading__1419784_253892949"/><a id="property-fo_border"/>fo:border</h3><p class="Text_20_body">See §7.29.3 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:border</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:border</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a20_176_3fo_border-bottom"><span style="margin-right:0.127cm;">20.176.3</span></a><a id="__RefHeading__1419786_253892949"/><a id="property-fo_border-bottom"/>fo:border-bottom</h3><p class="Text_20_body">See §7.29.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:border-bottom</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:border-bottom</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a20_176_4fo_border-left"><span style="margin-right:0.127cm;">20.176.4</span></a><a id="__RefHeading__1419788_253892949"/><a id="property-fo_border-left"/>fo:border-left</h3><p class="Text_20_body">See §7.29.6 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:border-left</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:border-left</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a20_176_5fo_border-right"><span style="margin-right:0.127cm;">20.176.5</span></a><a id="__RefHeading__1419790_253892949"/><a id="property-fo_border-right"/>fo:border-right</h3><p class="Text_20_body">See §7.29.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:border-right</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:border-right</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h3 class="Heading_20_3"><a id="a20_176_6fo_border-top"><span style="margin-right:0.127cm;">20.176.6</span></a><a id="__RefHeading__1419792_253892949"/><a id="property-fo_border-top"/>fo:border-top</h3><p class="Text_20_body">See §7.29.10 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:border-top</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:border-top</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_177fo_break-after"><span style="margin-right:0.127cm;">20.177</span></a><a id="__RefHeading__1419794_253892949"/><a id="property-fo_break-after"/>fo:break-after</h2><p class="Text_20_body">See §7.19.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. The values <span class="Alien_20_Attribute_20_Value">odd-page</span> and <span class="Alien_20_Attribute_20_Value">even-page</span> are not supported.</p><p class="Text_20_body">This attribute shall not be used at the same time as <span class="Attribute">fo:break-before</span>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:break-after</span> attribute does not support <span class="Alien_20_Attribute_20_Value">even-page</span>, <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">odd-page</span> values. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:break-after</span> attribute is usable with the following elements: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>, <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a> and <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:break-after</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">page</span>.</p><h2 class="Heading_20_2"><a id="a20_178fo_break-before"><span style="margin-right:0.127cm;">20.178</span></a><a id="__RefHeading__1419796_253892949"/><a id="property-fo_break-before"/>fo:break-before</h2><p class="Text_20_body">See §7.19.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. The values <span class="Alien_20_Attribute_20_Value">odd-page</span> and <span class="Alien_20_Attribute_20_Value">even-page</span> are not supported.</p><p class="Text_20_body">This attribute shall not be used at the same time as <span class="Attribute">fo:break-after</span>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:break-before</span> attribute does not support <span class="Alien_20_Attribute_20_Value">even-page</span>, <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">odd-page</span> values. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:break-before</span> attribute is usable with the following elements: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>, <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a> and <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:break-before</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">column</span> or <span class="Attribute_20_Value">page</span>.</p><h2 class="Heading_20_2"><a id="a20_179fo_clip"><span style="margin-right:0.127cm;">20.179</span></a><a id="__RefHeading__1419798_253892949"/><a id="property-fo_clip"/>fo:clip</h2><p class="Text_20_body">See §7.20.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:clip</span> attribute does not support <span class="Attribute_20_Value_20_Fragment">em</span> and <span class="Attribute_20_Value_20_Fragment">px</span> values. </p><p class="Text_20_body">The defined value for the <span class="Attribute">fo:clip</span> attribute is a value of type <span class="Datatype">clipShape</span> <a href="#datatype-clipShape">18.3.8</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:clip</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:clip</span> attribute are <span class="Attribute_20_Value">auto</span> or a value of type <span class="Datatype">clipShape</span> <a href="#datatype-clipShape">18.3.8</a>.</p><h2 class="Heading_20_2"><a id="a20_180fo_color"><span style="margin-right:0.127cm;">20.180</span></a><a id="__RefHeading__1419800_253892949"/><a id="property-fo_color"/>fo:color</h2><p class="Text_20_body">See §7.17.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:color</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> value. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:color</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_181fo_country"><span style="margin-right:0.127cm;">20.181</span></a><a id="__RefHeading__1419802_253892949"/><a id="property-fo_country"/>fo:country</h2><p class="Text_20_body">See §7.9.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">It may be ignored if is not specified together with a <span class="Attribute">fo:language</span> attribute.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:country</span> attribute does not support <span class="Alien_20_Attribute_20_Value">none</span> or <span class="Alien_20_Attribute_20_Value">inherit</span> values. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:country</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:country</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a20_182fo_font-family"><span style="margin-right:0.127cm;">20.182</span></a><a id="__RefHeading__1419804_253892949"/><a id="property-fo_font-family"/>fo:font-family</h2><p class="Text_20_body">See §7.8.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:font-family</span> attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:font-family</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:font-family</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_183fo_font-size"><span style="margin-right:0.127cm;">20.183</span></a><a id="__RefHeading__1419806_253892949"/><a id="property-fo_font-size"/>fo:font-size</h2><p class="Text_20_body">See §7.8.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The value of this attribute is either an absolute length or a percentage as described in §7.8.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. In contrast to XSL, percentage values can be used within common styles only and are based on the font height of the parent style rather than to the font height of the attributes neighborhood. Absolute font heights and relative font heights are not supported.</p><p class="Note"><span class="Note_20_Label">Note:</span> The <span class="Attribute">style:font-size-asian</span> attribute (<a href="#property-style_font-size-asian">20.276</a>) is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a> The <span class="Attribute">style:font-size-complex</span> attribute (<a href="#property-style_font-size-complex">20.277</a>) is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:font-size</span> attribute does not support <span class="Alien_20_Attribute_20_Value">absolute-size</span>, <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">relative-size</span> values. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:font-size</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:font-size</span> attribute are a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_184fo_font-style"><span style="margin-right:0.127cm;">20.184</span></a><a id="__RefHeading__1419808_253892949"/><a id="property-fo_font-style"/>fo:font-style</h2><p class="Text_20_body">See §7.8.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:font-style</span> attribute does not support <span class="Alien_20_Attribute_20_Value">backslant</span> and <span class="Alien_20_Attribute_20_Value">inherit</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:font-style</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:font-style</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">italic</span> or <span class="Attribute_20_Value">oblique</span>.</p><h2 class="Heading_20_2"><a id="a20_185fo_font-variant"><span style="margin-right:0.127cm;">20.185</span></a><a id="__RefHeading__1419810_253892949"/><a id="property-fo_font-variant"/>fo:font-variant</h2><p class="Text_20_body">See §7.8.8 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:font-variant</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:font-variant</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:font-variant</span> attribute are <span class="Attribute_20_Value">normal</span> or <span class="Attribute_20_Value">small-caps</span>.</p><h2 class="Heading_20_2"><a id="a20_186fo_font-weight"><span style="margin-right:0.127cm;">20.186</span></a><a id="__RefHeading__1419812_253892949"/><a id="property-fo_font-weight"/>fo:font-weight</h2><p class="Text_20_body">See §7.8.9 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:font-weight</span> attribute does not support <span class="Alien_20_Attribute_20_Value">bolder</span>, <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">lighter</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:font-weight</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:font-weight</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">100</span>, <span class="Attribute_20_Value">200</span>, <span class="Attribute_20_Value">300</span>, <span class="Attribute_20_Value">400</span>, <span class="Attribute_20_Value">500</span>, <span class="Attribute_20_Value">600</span>, <span class="Attribute_20_Value">700</span>, <span class="Attribute_20_Value">800</span> or <span class="Attribute_20_Value">900</span>.</p><h2 class="Heading_20_2"><a id="a20_187fo_height"><span style="margin-right:0.127cm;">20.187</span></a><a id="__RefHeading__1419814_253892949"/><a id="property-fo_height"/>fo:height</h2><p class="Text_20_body">See §7.14.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:height</span> attribute is used with <span class="Attribute">fo:width</span> to set the size of a bullet image. </p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:height</span> attribute does not support <span class="Alien_20_Attribute_20_Value">auto</span>, <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">percentage</span> values. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:height</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:height</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_188fo_hyphenate"><span style="margin-right:0.127cm;">20.188</span></a><a id="__RefHeading__1419816_253892949"/><a id="property-fo_hyphenate"/>fo:hyphenate</h2><p class="Text_20_body">See §7.9.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:hyphenate</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> value. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:hyphenate</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:hyphenate</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_189fo_hyphenation-keep"><span style="margin-right:0.127cm;">20.189</span></a><a id="__RefHeading__1419818_253892949"/><a id="property-fo_hyphenation-keep"/>fo:hyphenation-keep</h2><p class="Text_20_body">See §7.15.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:hyphenation-keep</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:hyphenation-keep</span> attribute are <span class="Attribute_20_Value">auto</span> or <span class="Attribute_20_Value">page</span>.</p><h2 class="Heading_20_2"><a id="a20_190fo_hyphenation-ladder-count"><span style="margin-right:0.127cm;">20.190</span></a><a id="__RefHeading__1419820_253892949"/><a id="property-fo_hyphenation-ladder-count"/>fo:hyphenation-ladder-count</h2><p class="Text_20_body">See §7.15.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">fo:hyphenation-ladder-count</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no-limit</span>:<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:hyphenation-ladder-count</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:hyphenation-ladder-count</span> attribute are <span class="Attribute_20_Value">no-limit</span> or a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_191fo_hyphenation-push-char-count"><span style="margin-right:0.127cm;">20.191</span></a><a id="__RefHeading__1419822_253892949"/><a id="property-fo_hyphenation-push-char-count"/>fo:hyphenation-push-char-count</h2><p class="Text_20_body">See §7.9.6 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:hyphenation-push-char-count</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:hyphenation-push-char-count</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_192fo_hyphenation-remain-char-count"><span style="margin-right:0.127cm;">20.192</span></a><a id="__RefHeading__1419824_253892949"/><a id="property-fo_hyphenation-remain-char-count"/>fo:hyphenation-remain-char-count</h2><p class="Text_20_body">See §7.9.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:hyphenation-remain-char-count</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:hyphenation-remain-char-count</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_193fo_keep-together"><span style="margin-right:0.127cm;">20.193</span></a><a id="__RefHeading__1419826_253892949"/><a id="property-fo_keep-together"/>fo:keep-together</h2><p class="Text_20_body">See §7.19.3 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:keep-together</span> attribute does not support the <span class="Attribute_20_Value">integer</span> value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:keep-together</span> attribute is usable with the following elements: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:keep-together</span> attribute are <span class="Attribute_20_Value">auto</span> or <span class="Attribute_20_Value">always</span>.</p><h2 class="Heading_20_2"><a id="a20_194fo_keep-with-next"><span style="margin-right:0.127cm;">20.194</span></a><a id="__RefHeading__1419828_253892949"/><a id="property-fo_keep-with-next"/>fo:keep-with-next</h2><p class="Text_20_body">See §7.9.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:keep-with-next</span> attribute does not support the <span class="Attribute_20_Value">integer</span> value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:keep-with-next</span> attribute is usable with the following elements: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:keep-with-next</span> attribute are <span class="Attribute_20_Value">auto</span> or <span class="Attribute_20_Value">always</span>.</p><h2 class="Heading_20_2"><a id="a20_195fo_language"><span style="margin-right:0.127cm;">20.195</span></a><a id="__RefHeading__1419830_253892949"/><a id="property-fo_language"/>fo:language</h2><p class="Text_20_body">See §7.9.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. Compared to the XSL language attribute, the value range of this attribute is extended to additional parts of ISO 639. See <a href="#datatype-languageCode">18.3.17</a>.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute may be ignored if it is not specified together with a <span class="Attribute">fo:country</span> attribute.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:language</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">none</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:language</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:language</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h2 class="Heading_20_2"><a id="a20_196fo_letter-spacing"><span style="margin-right:0.127cm;">20.196</span></a><a id="__RefHeading__1419832_253892949"/><a id="property-fo_letter-spacing"/>fo:letter-spacing</h2><p class="Text_20_body">See §7.16.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:letter-spacing</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> and <span class="Alien_20_Attribute_20_Value">space</span> values.</p><p class="Text_20_body">The defined value for the <span class="Attribute">fo:letter-spacing</span> attribute is a value of type length <a href="#datatype-length">18.3.18</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:letter-spacing</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:letter-spacing</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or <span class="Attribute_20_Value">normal</span>.</p><h2 class="Heading_20_2"><a id="a20_197fo_line-height"><span style="margin-right:0.127cm;">20.197</span></a><a id="__RefHeading__1419834_253892949"/><a id="property-fo_line-height"/>fo:line-height</h2><p class="Text_20_body"> See §7.15.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The value <span class="Attribute_20_Value">normal</span> activates the default line height calculation. The value of this attribute can be a length, a percentage, <span class="Attribute_20_Value">normal</span>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:line-height</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span>, <span class="Alien_20_Attribute_20_Value">number</span>, and <span class="Alien_20_Attribute_20_Value">space</span> values.</p><p class="Text_20_body">The defined values for the <span class="Attribute">fo:line-height</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">normal</span>: disables the effects of <span class="Attribute">style:line-height-at-least</span> and <span class="Attribute">style:line-spacing</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:line-height</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:line-height</span> attribute are <span class="Attribute_20_Value">normal</span>, a value of type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_198fo_margin"><span style="margin-right:0.127cm;">20.198</span></a><a id="__RefHeading__1419836_253892949"/><a id="property-fo_margin"/>fo:margin</h2><p class="Text_20_body">See §7.29.14 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:margin</span> attribute does not support <span class="Alien_20_Attribute_20_Value">auto</span> and <span class="Alien_20_Attribute_20_Value">inherit</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:margin</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:margin</span> attribute are a value of type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_199fo_margin-bottom"><span style="margin-right:0.127cm;">20.199</span></a><a id="__RefHeading__1419838_253892949"/><a id="property-fo_margin-bottom"/>fo:margin-bottom</h2><p class="Text_20_body">See §7.10.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If this attribute is contained in a <span class="Element">&lt;style:paragraph-properties&gt;</span> element, its value may be a percentage that refers to the corresponding margin of a parent style. </p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:margin-bottom</span> attribute does not support the <span class="Alien_20_Attribute">auto</span> and <span class="Alien_20_Attribute">inherit</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:margin-bottom</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:margin-bottom</span> attribute are a value of type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_200fo_margin-left"><span style="margin-right:0.127cm;">20.200</span></a><a id="__RefHeading__1419840_253892949"/><a id="property-fo_margin-left"/>fo:margin-left</h2><p class="Text_20_body">See §7.10.3 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If this attribute is contained in a <span class="Element">&lt;style:paragraph-properties&gt;</span> element, its value may be a percentage that refers to the corresponding margin of a parent style. </p><p class="Text_20_body">Tables that align to the left or to the center ignore right margins, and tables that align to the right or to the center ignore left margins.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:margin-left</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:margin-left</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_201fo_margin-right"><span style="margin-right:0.127cm;">20.201</span></a><a id="__RefHeading__1419842_253892949"/><a id="property-fo_margin-right"/>fo:margin-right</h2><p class="Text_20_body">See §7.10.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If this attribute is contained in a <span class="Element">&lt;style:paragraph-properties&gt;</span> element, its value may be a percentage that refers to the corresponding margin of a parent style. </p><p class="Text_20_body">Tables that align to the left or to the center ignore right margins, and tables that align to the right or to the center ignore left margins.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:margin-right</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:margin-right</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_202fo_margin-top"><span style="margin-right:0.127cm;">20.202</span></a><a id="__RefHeading__1419844_253892949"/><a id="property-fo_margin-top"/>fo:margin-top</h2><p class="Text_20_body">See §7.10.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If this attribute is contained in a <span class="Element">&lt;style:paragraph-properties&gt;</span> element, its value may be a percentage that refers to the corresponding margin of a parent style. </p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:margin-top</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:margin-top</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:margin-top</span> attribute are a value of type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_203fo_max-height"><span style="margin-right:0.127cm;">20.203</span></a><a id="__RefHeading__1419846_253892949"/><a id="property-fo_max-height"/>fo:max-height</h2><p class="Text_20_body">The <span class="Attribute">fo:max-height</span> attribute specifies a default maximum height for new frames that are created using a graphics style. See <a href="#attribute-fo_max-height">19.238</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:max-height</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:max-height</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_204fo_max-width"><span style="margin-right:0.127cm;">20.204</span></a><a id="__RefHeading__1419848_253892949"/><a id="property-fo_max-width"/>fo:max-width</h2><p class="Text_20_body">The <span class="Attribute">fo:max-width</span> attribute specifies a default maximum width for new frames that are created using a graphics style. See <a href="#attribute-fo_max-width">19.239</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:max-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:max-width</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_205fo_min-height"><span style="margin-right:0.127cm;">20.205</span></a><a id="__RefHeading__1419850_253892949"/><a id="property-fo_min-height"/>fo:min-height</h2><h3 class="Heading_20_3"><a id="a20_205_1_style_graphic-properties_"><span style="margin-right:0.127cm;">20.205.1</span></a><a id="__RefHeading__1419852_253892949"/><a id="property-fo_min-height_element-style_graphic-properties"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:min-height</span> attribute specifies a default minimum height for new frames that are created using a graphics style. See <a href="#attribute-fo_min-height">19.240</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:min-height</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:min-height</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h3 class="Heading_20_3"><a id="a20_205_2_style_header-footer-properties_"><span style="margin-right:0.127cm;">20.205.2</span></a><a id="__RefHeading__1419854_253892949"/><a id="property-fo_min-height_element-style_header-footer-properties"/>&lt;style:header-footer-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:min-height</span> attribute specifies a minimum height for a header or footer.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:min-height</span> attribute is usable with the following element: <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:min-height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_206fo_min-width"><span style="margin-right:0.127cm;">20.206</span></a><a id="__RefHeading__1419856_253892949"/><a id="property-fo_min-width"/>fo:min-width</h2><p class="Text_20_body">The <span class="Attribute">fo:min-width</span> attribute specifies a default minimum width for new frames that are created using a graphics style. See <a href="#attribute-fo_min-width">19.241</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:min-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:min-width</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_207fo_orphans"><span style="margin-right:0.127cm;">20.207</span></a><a id="__RefHeading__1419858_253892949"/><a id="property-fo_orphans"/>fo:orphans</h2><p class="Text_20_body">See §7.19.6 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:orphans</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:orphans</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_208fo_page-height"><span style="margin-right:0.127cm;">20.208</span></a><a id="__RefHeading__1419860_253892949"/><a id="property-fo_page-height"/>fo:page-height</h2><p class="Text_20_body">See §7.25.13 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:page-height</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:page-height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_209fo_page-width"><span style="margin-right:0.127cm;">20.209</span></a><a id="__RefHeading__1419862_253892949"/><a id="property-fo_page-width"/>fo:page-width</h2><p class="Text_20_body">See §7.25.15 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:page-width</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:page-width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_210fo_padding"><span style="margin-right:0.127cm;">20.210</span></a><a id="__RefHeading__1419864_253892949"/><a id="property-fo_padding"/>fo:padding</h2><p class="Text_20_body">See §7.29.15 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:padding</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:padding</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_211fo_padding-bottom"><span style="margin-right:0.127cm;">20.211</span></a><a id="__RefHeading__1419866_253892949"/><a id="property-fo_padding-bottom"/>fo:padding-bottom</h2><p class="Text_20_body">See §7.7.36 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:padding-bottom</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:padding-bottom</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_212fo_padding-left"><span style="margin-right:0.127cm;">20.212</span></a><a id="__RefHeading__1419868_253892949"/><a id="property-fo_padding-left"/>fo:padding-left</h2><p class="Text_20_body">See §7.7.37 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:padding-left</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:padding-left</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_213fo_padding-right"><span style="margin-right:0.127cm;">20.213</span></a><a id="__RefHeading__1419870_253892949"/><a id="property-fo_padding-right"/>fo:padding-right</h2><p class="Text_20_body">See §7.7.38 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:padding-right</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:padding-right</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_214fo_padding-top"><span style="margin-right:0.127cm;">20.214</span></a><a id="__RefHeading__1419872_253892949"/><a id="property-fo_padding-top"/>fo:padding-top</h2><p class="Text_20_body">See §7.7.35 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:padding-top</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:padding-top</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_215fo_script"><span style="margin-right:0.127cm;">20.215</span></a><a id="__RefHeading__1419874_253892949"/><a id="property-fo_script"/>fo:script</h2><p class="Text_20_body">See §7.9.3 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">The attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">It may be ignored if is not specified together with a <span class="Attribute">fo:language</span> attribute.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:script</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> or <span class="Alien_20_Attribute_20_Value">none</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:script</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:script</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h2 class="Heading_20_2"><a id="a20_216fo_text-align"><span style="margin-right:0.127cm;">20.216</span></a><a id="__RefHeading__1419876_253892949"/><a id="property-fo_text-align"/>fo:text-align</h2><p class="Text_20_body">See §7.15.9 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">If there are no values specified for the <span class="Attribute">fo:text-align</span> and <span class="Attribute">style:justify-single-word</span> attributes within the same formatting properties element, the values of those attributes is set to <span class="Attribute_20_Value">start</span> and <span class="Attribute_20_Value">false</span> respectively.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:text-align</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span>, <span class="Alien_20_Attribute_20_Value">inside</span>, <span class="Alien_20_Attribute_20_Value">outside</span>, or <span class="Alien_20_Attribute_20_Value">string</span> values.</p><h3 class="Heading_20_3"><a id="a20_216_1_style_paragraph-properties_"><span style="margin-right:0.127cm;">20.216.1</span></a><a id="__RefHeading__1419878_253892949"/><a id="property-fo_text-align_element-style_paragraph-properties"/>&lt;style:paragraph-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:text-align</span> attribute when used with the <span class="Element">&lt;style:paragraph-properties&gt;</span> element specifies the alignment of paragraphs in a text. </p><p class="Text_20_body">The values of <span class="Attribute_20_Value">start</span> and <span class="Attribute_20_Value">end</span> are interpreted according to the writing direction of the text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-align</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:text-align</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">end</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">justify</span>.</p><h3 class="Heading_20_3"><a id="a20_216_2_style_list-level-properties_"><span style="margin-right:0.127cm;">20.216.2</span></a><a id="__RefHeading__1419880_253892949"/><a id="property-fo_text-align_element-style_list-level-properties"/>&lt;style:list-level-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">fo:text-align</span> attribute when used with the <span class="Element">&lt;style:list-level-properties&gt;</span> elements specifies the alignment of list labels. </p><p class="Text_20_body">If the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute on the same <span class="Element">&lt;style:list-level-properties&gt;</span> element has the value <span class="Attribute_20_Value">label-width-and-position</span>, the <span class="Attribute">fo:text-align</span> attribute specifies the horizontal alignment of the list label within the width specified by the <span class="Attribute">text:min-label-width</span> attribute. If the actual width of the list label is greater than the specified minimum width no alignment takes place.</p><p class="Text_20_body">If the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute on the same <span class="Element">&lt;style:list-level-properties&gt;</span> element has the value <span class="Attribute_20_Value">label-alignment</span>, the value of the <span class="Attribute">text:min-label-width</span> attribute is treated as 0 and the <span class="Attribute">fo:text-align</span> attribute specifies the horizontal alignment of the list label at the alignment position. The alignment position is specified by the <span class="Attribute">fo:margin-left</span> and <span class="Attribute">fo:text-indent</span> attributes of it child element <span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">fo:text-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: center of the list label is positioned at the alignment position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">nd</span>: interpreted as <span class="Attribute">fo:text-align</span>=”<span class="Attribute_20_Value">right</span>”<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">justify</span>: label is justified.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: list label starts at the alignment position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: list label ends at the alignment position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">tart</span>: interpreted as <span class="Attribute">fo:text-align</span>=”<span class="Attribute_20_Value">left</span>”.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-align</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:text-align</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">end</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">justify</span>.</p><h2 class="Heading_20_2"><a id="a20_217fo_text-align-last"><span style="margin-right:0.127cm;">20.217</span></a><a id="__RefHeading__1419882_253892949"/><a id="property-fo_text-align-last"/>fo:text-align-last</h2><p class="Text_20_body">See §7.15.10 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is ignored if it not accompanied by an <span class="Attribute">fo:text-align</span> attribute.</p><p class="Text_20_body">If no value is specified for this attribute, the value is set to start. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-align-last</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:text-align-last</span> attribute are <span class="Attribute_20_Value">start</span>, <span class="Attribute_20_Value">center</span> or <span class="Attribute_20_Value">justify</span>.</p><h2 class="Heading_20_2"><a id="a20_218fo_text-indent"><span style="margin-right:0.127cm;">20.218</span></a><a id="__RefHeading__1419884_253892949"/><a id="property-fo_text-indent"/>fo:text-indent</h2><p class="Text_20_body">The <span class="Attribute">fo:text-indent</span> attribute specifies a positive or negative indent for the first line of a paragraph. See §7.15.11 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. The attribute value is a length. If the attribute is contained in a common style, the attribute value may be also a percentage that refers to the corresponding text indent of a parent style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-indent</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:text-indent</span> attribute are a value of type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_219fo_text-shadow"><span style="margin-right:0.127cm;">20.219</span></a><a id="__RefHeading__1419886_253892949"/><a id="property-fo_text-shadow"/>fo:text-shadow</h2><p class="Text_20_body">The <span class="Attribute">fo:text-shadow</span> attribute specifies the text shadow style to use. </p><p class="Text_20_body">The defined values for this attribute are those defined in §7.16.5 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>, except the value <span class="Alien_20_Attribute_20_Value">inherit</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-shadow</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:text-shadow</span> attribute are <span class="Attribute_20_Value">none</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_220fo_text-transform"><span style="margin-right:0.127cm;">20.220</span></a><a id="__RefHeading__1419888_253892949"/><a id="property-fo_text-transform"/>fo:text-transform</h2><p class="Text_20_body">See §7.16.6 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. </p><p class="Text_20_body">If <span class="Attribute">fo:text-transform</span> and <span class="Attribute">fo:font-variant</span> attributes are used simultaneously and have different values than <span class="Attribute_20_Value">normal</span> and <span class="Attribute_20_Value">none</span>, the result is undefined.</p><p class="Note"><span class="Note_20_Label">Note:</span> In consumers, the <span class="Attribute">fo:text-transform</span> and <span class="Attribute">fo:font-variant</span> attributes are mutually exclusive.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:text-transform</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:text-transform</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">lowercase</span>, <span class="Attribute_20_Value">uppercase</span> or <span class="Attribute_20_Value">capitalize</span>.</p><h2 class="Heading_20_2"><a id="a20_221fo_widows"><span style="margin-right:0.127cm;">20.221</span></a><a id="__RefHeading__1419890_253892949"/><a id="property-fo_widows"/>fo:widows</h2><p class="Text_20_body">See §7.19.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:widows</span> attribute specifies the minimum number of lines that shall be displayed at the top of a page to avoid paragraph widows.</p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:widows</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">inherit</span> value.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:widows</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:widows</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_222fo_width"><span style="margin-right:0.127cm;">20.222</span></a><a id="__RefHeading__1419892_253892949"/><a id="property-fo_width"/>fo:width</h2><p class="Text_20_body">See §7.14.12 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The <span class="Attribute">fo:width</span> attribute is used with <span class="Attribute">fo:height</span> to set the size of a bullet image. </p><p class="Text_20_body">In the OpenDocument XSL compatible namespace, the <span class="Attribute">fo:width</span> attribute does not support the <span class="Alien_20_Attribute_20_Value">auto</span> or <span class="Alien_20_Attribute_20_Value">inherit</span> values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:width</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">fo:width</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_223fo_wrap-option"><span style="margin-right:0.127cm;">20.223</span></a><a id="__RefHeading__1419894_253892949"/><a id="property-fo_wrap-option"/>fo:wrap-option</h2><p class="Text_20_body">See §7.15.13 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. </p><p class="Text_20_body">If wrapping is disabled, it is implementation-defined whether the overflow  text is visible or hidden. If the text is hidden consumers may support a scrolling to access the text. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">fo:wrap-option</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">fo:wrap-option</span> attribute are <span class="Attribute_20_Value">no-wrap</span> or <span class="Attribute_20_Value">wrap</span>.</p><h2 class="Heading_20_2"><a id="a20_224presentation_background-objects-visible"><span style="margin-right:0.127cm;">20.224</span></a><a id="__RefHeading__1419896_253892949"/><a id="property-presentation_background-objects-visible"/>presentation:background-objects-visible</h2><p class="Text_20_body">The <span class="Attribute">presentation:background-objects-visible</span> attribute specifies whether to display objects in the background of a master page when displaying a presentation page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:background-objects-visible</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: objects in background of a master page should not be displayed when displaying a presentation page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: objects in background of a master page should be displayed when displaying a presentation page.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:background-objects-visible</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:background-objects-visible</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_225presentation_background-visible"><span style="margin-right:0.127cm;">20.225</span></a><a id="__RefHeading__1419898_253892949"/><a id="property-presentation_background-visible"/>presentation:background-visible</h2><p class="Text_20_body">The <span class="Attribute">presentation:background-visible</span> attribute specifies whether to display the background of a master page when displaying a presentation page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:background-visible</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: background of a master page should not be displayed when displaying a presentation page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: background of a master page should be displayed when displaying a presentation page.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:background-visible</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:background-visible</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_226presentation_display-date-time"><span style="margin-right:0.127cm;">20.226</span></a><a id="__RefHeading__1419900_253892949"/><a id="property-presentation_display-date-time"/>presentation:display-date-time</h2><p class="Text_20_body">The <span class="Attribute">presentation:display-date-time</span> attribute specifies the visibility of from the <span class="Element">&lt;style:master-page&gt;</span> element with the presentation class <span class="Attribute_20_Value">date-time</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:display-date-time</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: drawing shape from a <span class="Element">&lt;style:master-page&gt;</span> element with the presentation class <span class="Attribute_20_Value">date-time</span> should not be visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: drawing shape from a <span class="Element">&lt;style:master-page&gt;</span> element with the presentation class <span class="Attribute_20_Value">date-time</span> should be visible.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:display-date-time</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:display-date-time</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_227presentation_display-footer"><span style="margin-right:0.127cm;">20.227</span></a><a id="__RefHeading__1419902_253892949"/><a id="property-presentation_display-footer"/>presentation:display-footer</h2><p class="Text_20_body">The <span class="Attribute">presentation:display-footer</span> attribute specifies the visibility of a drawing shape used as a footer in a <span class="Element">&lt;style:master-page&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:display-footer</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: drawing shape used as a footer of a <span class="Element">&lt;style:master-page&gt;</span> element should not be visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: drawing shape used as a footer of a <span class="Element">&lt;style:master-page&gt;</span> element should be visible.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:display-footer</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:display-footer</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_228presentation_display-header"><span style="margin-right:0.127cm;">20.228</span></a><a id="__RefHeading__1419904_253892949"/><a id="property-presentation_display-header"/>presentation:display-header</h2><p class="Text_20_body">The <span class="Attribute">presentation:display-header</span> attribute specifies the visibility of a drawing shape used as a header in a <span class="Element">&lt;style:master-page&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:display-header</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: drawing shape used as a header of a <span class="Element">&lt;style:master-page&gt;</span> element should not be visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: drawing shape used as a header of a <span class="Element">&lt;style:master-page&gt;</span> element should be visible.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:display-header</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:display-header</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_229presentation_display-page-number"><span style="margin-right:0.127cm;">20.229</span></a><a id="__RefHeading__1419906_253892949"/><a id="property-presentation_display-page-number"/>presentation:display-page-number</h2><p class="Text_20_body">The <span class="Attribute">presentation:display-page-number</span> attribute specifies the visibility of a drawing shape used as a page number in a <span class="Element">&lt;style:master-page&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:display-page-number</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: drawing shape used as a page number of a <span class="Element">&lt;style:master-page&gt;</span> element should not be visible.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: drawing shape used as a page number of a <span class="Element">&lt;style:master-page&gt;</span> element should be visible.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:display-page-number</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:display-page-number</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_230presentation_duration"><span style="margin-right:0.127cm;">20.230</span></a><a id="__RefHeading__1419908_253892949"/><a id="property-presentation_duration"/>presentation:duration</h2><p class="Text_20_body">The <span class="Attribute">presentation:duration</span> attribute specifies the amount of time that the presentation page is displayed. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:duration</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">presentation:duration</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_231presentation_transition-speed"><span style="margin-right:0.127cm;">20.231</span></a><a id="__RefHeading__1419910_253892949"/><a id="property-presentation_transition-speed"/>presentation:transition-speed</h2><p class="Text_20_body">The <span class="Attribute">presentation:transition-speed</span> attribute specifies the speed at which a presentation page is removed from display, and replaced by a new presentation page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:transition-speed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fast</span>: An implementation-defined speed. The <span class="Attribute_20_Value">fast</span> speed should be faster than the speed the consumer chooses for the values <span class="Attribute_20_Value">medium</span> and <span class="Attribute_20_Value">slow</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">medium</span>:An implementation-defined speed. The <span class="Attribute_20_Value">medium</span> speed should be faster than the speed the consumer chooses for the value <span class="Attribute_20_Value">slow</span>, and slower than the speed the consumer chooses for the value <span class="Attribute_20_Value">fast</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">slow</span>: An implementation-defined speed. The <span class="Attribute_20_Value">slow</span> speed should be slower than the speed the consumer chooses for the values <span class="Attribute_20_Value">medium</span> and <span class="Attribute_20_Value">fast</span>. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:transition-speed</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:transition-speed</span> attribute are <span class="Attribute_20_Value">slow</span>, <span class="Attribute_20_Value">medium</span> or <span class="Attribute_20_Value">fast</span>.</p><h2 class="Heading_20_2"><a id="a20_232presentation_transition-style"><span style="margin-right:0.127cm;">20.232</span></a><a id="__RefHeading__1419912_253892949"/><a id="property-presentation_transition-style"/>presentation:transition-style</h2><p class="Text_20_body">The <span class="Attribute">presentation:transition-style</span> attribute specifies the way that each presentation page replaces the previous presentation page. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:transition-style</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">clockwise</span>: page is uncovered by the hand of a watch, moving clockwise.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">close</span>: Combination of close-horizontal and close-vertical.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">close-horizontal</span>: page is uncovered by drawing it line by line horizontally starting at the edge of the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">close-vertical</span>: page is uncovered by drawing it line by line vertically starting at the edge of the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">counterclockwise</span>: page is uncovered by the hand of a watch, moving counterclockwise.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dissolve</span>: page is faded in by drawing small blocks in a random fashion.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-bottom</span>: page fades from a visible or hidden state to a hidden or visible state to the bottom of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-left</span>: page fades from a visible or hidden state to a hidden or visible state to the left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-right</span>: pages fade from a visible or hidden state to a hidden or visible state to the right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-top</span>: page fades from a visible or hidden state to a hidden or visible state to the top of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-lowerleft</span>: page fades from a visible or hidden state to a hidden or visible state to the lower left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-lowerright</span>: page fades from a visible or hidden state to a hidden or visible state to the lower right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-upperleft</span>: page fades from a visible or hidden state to a hidden or visible state to the upper left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-upperright</span>: page fades from a visible or hidden state to a hidden or visible state to the upper right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-from-center</span>: page fades from a visible or hidden state to a hidden or visible state from the center of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fade-to-center</span>: page fades from a visible or hidden state to a hidden or visible state to the center of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fly-away</span>: page first reduces itself to a smaller size (while remaining centered in the screen), and then "flies away" (turns around and moves to the bottom-right corner of the screen). The next slide appears under it meanwhile.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal-checkerboard</span>: page is uncovered by drawing checkerboard like blocks that increase in size horizontally.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal-lines</span>: page is uncovered by drawing it line by line horizontally in a random fashion.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">horizontal-stripes</span>: page is uncovered by drawing horizontal stripes that change their size during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">interlocking-horizontal-left</span>: page appears in 4 horizontal stripes (the height is divided in 4, like in the horizontal-stripes effect) but those stripes come from left, right, left, and right, and cross each other in the middle of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">interlocking-horizontal-right</span>: page appears in 4 horizontal stripes (the height is divided in 4, like in the horizontal-stripes effect) but those stripes come from right, left, right, and left, and cross each other in the middle of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">interlocking-vertical-bottom</span>: same effect as <span class="Attribute_20_Value_20_Fragment">interlocking-horizontal-*</span> but with vertical stripes crossing each other.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">interlocking-vertical-top</span>: same effect as <span class="Attribute_20_Value_20_Fragment">interlocking-horizontal-*</span> but with vertical stripes crossing each other.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">melt</span>: Small vertical stripes move down at random speed, which gives the effect of the current page "melting down".<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-bottom</span>: page moves from the bottom of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-left</span>: page moves from the left of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-right</span>: page moves from the right of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-top</span>: page moves from the top of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-lowerleft</span>: page moves from the lower left of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-lowerright</span>: page moves from the lower right of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-upperleft</span>: page moves from the upper left of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">move-from-upperright</span>: page moves from the upper right of the screen to its final position.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no effect is used.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">open</span>: Combination of open-horizontal and open-vertical.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">open-horizontal</span>: page is uncovered by drawing it line by line horizontally, starting at the center of the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">open-vertical</span>: page is uncovered by drawing it line by line vertically, starting at the center of the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">random</span>: an effect is chosen at random to uncover a page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roll-from-bottom</span>: page moves towards the bottom of the screen to its final position, pushing the previous page out.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roll-from-left</span>: pages move towards the left of the screen to its final position, pushing the previous page out.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roll-from-right</span>: page moves towards the right of the screen to its final position, pushing the previous page out.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roll-from-top</span>: page moves towards the top of the screen to its final position, pushing the previous page out.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiralin-left</span>: page is uncovered by drawing blocks in a spiral fashion, starting from the left edge of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiralin-right</span>: page is uncovered by drawing blocks in a spiral fashion, starting from the right edge of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiralout-left</span>: page is uncovered by drawing blocks in a spiral fashion, starting from the center of the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">spiralout-right</span>: page is uncovered by drawing blocks in a spiral fashion, starting from the center of the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch-from-bottom</span>: page is uncovered by changing its size from the bottom of the screen during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch-from-left</span>: page is uncovered by changing its size from the left of the screen during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch-from-right</span>: page is uncovered by changing its size from the right of the screen during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch-from-top</span>: page is uncovered by changing its size from the left of the screen during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-bottom</span>: page is uncovered from the bottom of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-left</span>: page is uncovered from the left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-right</span>: page is uncovered from the right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-top</span>: page is uncovered from the top of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-lowerleft</span>: page is uncovered from the lower left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-lowerright</span>: page is uncovered from the lower right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-upperleft</span>: page is uncovered from the upper left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">uncover-to-upperright</span>: page is uncovered from the upper right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical-checkerboard</span>: page is uncovered by drawing checkerboard like blocks that increase in size vertically.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical-lines</span>: page is uncovered by drawing it line by line vertically in a random fashion.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical-stripes</span>: page is uncovered by drawing vertical stripes that change their size during this effect.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wavyline-from-bottom</span>: page is uncovered by drawing small blocks in a snake like fashion from the bottom of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wavyline-from-left</span>: page is uncovered by drawing small blocks in a snake like fashion from the left of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wavyline-from-right</span>: page is uncovered by drawing small blocks in a snake like fashion from the right of the screen.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wavyline-from-top</span>: page is uncovered by drawing small blocks in a snake like fashion from the top of the screen.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:transition-style</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:transition-style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">fade-from-left</span>, <span class="Attribute_20_Value">fade-from-top</span>, <span class="Attribute_20_Value">fade-from-right</span>, <span class="Attribute_20_Value">fade-from-bottom</span>, <span class="Attribute_20_Value">fade-from-upperleft</span>, <span class="Attribute_20_Value">fade-from-upperright</span>, <span class="Attribute_20_Value">fade-from-lowerleft</span>, <span class="Attribute_20_Value">fade-from-lowerright</span>, <span class="Attribute_20_Value">move-</span><span class="Attribute_20_Value">from-left</span>, <span class="Attribute_20_Value">move-from-top</span>, <span class="Attribute_20_Value">move-from-right</span>, <span class="Attribute_20_Value">move-from-bottom</span>, <span class="Attribute_20_Value">move-from-upperleft</span>, <span class="Attribute_20_Value">move-from-upperright</span>, <span class="Attribute_20_Value">move-from-lowerleft</span>, <span class="Attribute_20_Value">move-from-lowerright</span>, <span class="Attribute_20_Value">uncover-to-left</span>, <span class="Attribute_20_Value">uncover-to-top</span>, <span class="Attribute_20_Value">uncover-to-right</span>, <span class="Attribute_20_Value">uncover-to-bottom</span>, <span class="Attribute_20_Value">uncover-to-upperleft</span>, <span class="Attribute_20_Value">uncover-to-upperright</span>, <span class="Attribute_20_Value">uncover-to-lowerleft</span>, <span class="Attribute_20_Value">uncover-to-lowerright</span>, <span class="Attribute_20_Value">fade-to-center</span>, <span class="Attribute_20_Value">fade-from-center</span>, <span class="Attribute_20_Value">vertical-stripes</span>, <span class="Attribute_20_Value">horizontal-stripes</span>, <span class="Attribute_20_Value">clockwise</span>, <span class="Attribute_20_Value">counterclockwise</span>, <span class="Attribute_20_Value">open-vertical</span>, <span class="Attribute_20_Value">open-horizontal</span>, <span class="Attribute_20_Value">close-vertical</span>, <span class="Attribute_20_Value">close-horizontal</span>, <span class="Attribute_20_Value">wavyline-from-left</span>, <span class="Attribute_20_Value">wavyline-from-top</span>, <span class="Attribute_20_Value">wavyline-from-right</span>, <span class="Attribute_20_Value">wavyline-from-bottom</span>, <span class="Attribute_20_Value">spiralin-left</span>, <span class="Attribute_20_Value">spiralin-right</span>, <span class="Attribute_20_Value">spiralout-left</span>, <span class="Attribute_20_Value">spiralout-right</span>, <span class="Attribute_20_Value">roll-from-top</span>, <span class="Attribute_20_Value">roll-from-left</span>, <span class="Attribute_20_Value">roll-from-right</span>, <span class="Attribute_20_Value">roll-from-bottom</span>, <span class="Attribute_20_Value">stretch-from-left</span>, <span class="Attribute_20_Value">stretch-from-top</span>, <span class="Attribute_20_Value">stretch-from-right</span>, <span class="Attribute_20_Value">stretch-from-bottom</span>, <span class="Attribute_20_Value">vertical-lines</span>, <span class="Attribute_20_Value">horizontal-lines</span>, <span class="Attribute_20_Value">dissolve</span>, <span class="Attribute_20_Value">random</span>, <span class="Attribute_20_Value">vertical-checkerboard</span>, <span class="Attribute_20_Value">horizontal-checkerboard</span>, <span class="Attribute_20_Value">interlocking-horizontal-left</span>, <span class="Attribute_20_Value">interlocking-horizontal-right</span>, <span class="Attribute_20_Value">interlocking-vertical-top</span>, <span class="Attribute_20_Value">interlocking-vertical-bottom</span>, <span class="Attribute_20_Value">fly-away</span>, <span class="Attribute_20_Value">open</span>, <span class="Attribute_20_Value">close</span> or <span class="Attribute_20_Value">melt</span>.</p><h2 class="Heading_20_2"><a id="a20_233presentation_transition-type"><span style="margin-right:0.127cm;">20.233</span></a><a id="__RefHeading__1419914_253892949"/><a id="property-presentation_transition-type"/>presentation:transition-type</h2><p class="Text_20_body">The <span class="Attribute">presentation:transition-type</span> attribute specifies the mode of a transition. </p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:transition-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: slide transition and shape effects start automatically.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">manual</span>: slide transition and shape effects are started separately by the user.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">semi-automatic</span>: slide transition starts automatically, shape effects are started by the user.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The <span class="Attribute">smil:type</span> attribute should be used for presentations. The <span class="Attribute">presentation:transition-type</span> and <span class="Attribute">presentation:transition-style</span> attributes are retained for legacy compatibility only. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:transition-type</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:transition-type</span> attribute are <span class="Attribute_20_Value">manual</span>, <span class="Attribute_20_Value">automatic</span> or <span class="Attribute_20_Value">semi-automatic</span>.</p><h2 class="Heading_20_2"><a id="a20_234presentation_visibility"><span style="margin-right:0.127cm;">20.234</span></a><a id="__RefHeading__1419916_253892949"/><a id="property-presentation_visibility"/>presentation:visibility</h2><p class="Text_20_body">The <span class="Attribute">presentation:visibility</span> attribute specifies if the content of a <span class="Element">&lt;draw:page&gt;</span> element is visible during a presentation.</p><p class="Text_20_body">The defined values for the <span class="Attribute">presentation:transition-speed</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hidden</span>: content is hidden during a presentation. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">visible</span>: content is visible during a presentation.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">presentation:visibility</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">presentation:visibility</span> attribute are <span class="Attribute_20_Value">visible</span> or <span class="Attribute_20_Value">hidden</span>.</p><h2 class="Heading_20_2"><a id="a20_235smil_direction"><span style="margin-right:0.127cm;">20.235</span></a><a id="__RefHeading__1419918_253892949"/><a id="property-smil_direction"/>smil:direction</h2><p class="Text_20_body">See §12.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:direction</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">smil:direction</span> attribute are <span class="Attribute_20_Value">forward</span> or <span class="Attribute_20_Value">reverse</span>.</p><h2 class="Heading_20_2"><a id="a20_236smil_fadeColor"><span style="margin-right:0.127cm;">20.236</span></a><a id="__RefHeading__1419920_253892949"/><a id="property-smil_fadeColor"/>smil:fadeColor</h2><p class="Text_20_body">See §12.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:fadeColor</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:fadeColor</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_237smil_subtype"><span style="margin-right:0.127cm;">20.237</span></a><a id="__RefHeading__1419922_253892949"/><a id="property-smil_subtype"/>smil:subtype</h2><p class="Text_20_body">See §12.4.1 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a>.</p><p class="Text_20_body"><span class="Note_20_Label">Note: </span>See §12.8 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> for a list of supported subtypes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:subtype</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:subtype</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_238smil_type"><span style="margin-right:0.127cm;">20.238</span></a><a id="__RefHeading__1419924_253892949"/><a id="property-smil_type"/>smil:type</h2><p class="Text_20_body">The <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> <span class="Attribute">smil:type</span> attribute specifies a transition type or family.</p><p class="Text_20_body">See §12.8 of <a title="Synchronized Multimedia Integration Language (SMIL 2.0) - [Second Edition]" href="http://www.w3.org/TR/2005/REC-SMIL2-20050107/">[SMIL20]</a> for a list of supported types.</p><p class="Text_20_body">If this attribute is present, the attributes <span class="Attribute">presentation:transition-type</span> and <span class="Attribute">presentation:transition-style</span> attributes should be ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">smil:type</span> attribute is usable with the following element: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">smil:type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_239style_auto-text-indent"><span style="margin-right:0.127cm;">20.239</span></a><a id="__RefHeading__1419926_253892949"/><a id="property-style_auto-text-indent"/>style:auto-text-indent</h2><p class="Text_20_body">The <span class="Attribute">style:auto-text-indent</span> attribute specifies that the first line of a paragraph is indented by a value that is based on the current font size.</p><p class="Text_20_body">If this attribute has a value of <span class="Attribute_20_Value">true</span> and is used together with a <span class="Attribute">fo:text-indent</span> attribute the <span class="Attribute">fo:text-indent</span> attribute is ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:auto-text-indent</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:auto-text-indent</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_240style_background-transparency"><span style="margin-right:0.127cm;">20.240</span></a><a id="__RefHeading__1419928_253892949"/><a id="property-style_background-transparency"/>style:background-transparency</h2><p class="Text_20_body">The <span class="Attribute">style:background-transparency</span> attribute specifies the transparency of a paragraph's background color.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:background-transparency</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a> and <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:background-transparency</span> attribute has the data type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a20_241style_border-line-width"><span style="margin-right:0.127cm;">20.241</span></a><a id="__RefHeading__1419930_253892949"/><a id="property-style_border-line-width"/>style:border-line-width</h2><p class="Text_20_body"><a id="DDE_LINK7"/>The <span class="Attribute">style:border-line-width</span> attribute specifies the widths of borders defined by the FO border properties (see <a href="#FO_Border_Properties">20.176</a>) for borders where the value of these properties is <span class="Attribute_20_Value">double</span>.</p><p class="Text_20_body">The value of the <span class="Attribute">style:border-line-width</span> attribute is a list of three white space-separated lengths, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The first value specifies the width of the inner line<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The second value specifies the distance between the two lines<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The third value specifies the width of the outer line<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:border-line-width</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:border-line-width</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_242style_border-line-width-bottom"><span style="margin-right:0.127cm;">20.242</span></a><a id="__RefHeading__1419932_253892949"/><a id="property-style_border-line-width-bottom"/>style:border-line-width-bottom</h2><p class="Text_20_body"><a id="DDE_LINK10"/>The <span class="Attribute">style:border-line-width-bottom</span> attribute specifies the widths of the bottom border for borders defined by the FO border properties (see <a href="#FO_Border_Properties">20.176</a>) if the property for the bottom border has the value <span class="Attribute_20_Value">double</span>.</p><p class="Text_20_body">The value of the <span class="Attribute">style:border-line-width-bottom</span> attribute is a list of three white space-separated lengths, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The first value specifies the width of the inner line<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The second value specifies the distance between the two lines<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The third value specifies the width of the outer line<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:border-line-width-bottom</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:border-line-width-bottom</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_243style_border-line-width-left"><span style="margin-right:0.127cm;">20.243</span></a><a id="__RefHeading__1419934_253892949"/><a id="property-style_border-line-width-left"/>style:border-line-width-left</h2><p class="Text_20_body">The <span class="Attribute">style:border-line-width-left</span> attribute specifies the widths of the left border for borders defined by the FO border properties (see <a href="#FO_Border_Properties">20.176</a>) if the property for the left border has the value <span class="Attribute_20_Value">double</span>.</p><p class="Text_20_body">The value of the <span class="Attribute">style:border-line-width-left</span> attribute is a list of three white space-separated lengths, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The first value specifies the width of the inner line<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The second value specified the distance between the two lines<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The third value specifies the width of the outer line<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:border-line-width-left</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:border-line-width-left</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_244style_border-line-width-right"><span style="margin-right:0.127cm;">20.244</span></a><a id="__RefHeading__1419936_253892949"/><a id="property-style_border-line-width-right"/>style:border-line-width-right</h2><p class="Text_20_body">The <span class="Attribute">style:border-line-width-right</span> attribute specifies the widths of the right border for borders defined by the FO border properties (see <a href="#FO_Border_Properties">20.176</a>) if the property for the right border has the value <span class="Attribute_20_Value">double</span>.</p><p class="Text_20_body">The value of the <span class="Attribute">style:border-line-width-right</span> attribute is a list of three white space-separated lengths, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The first value specifies the width of the inner line<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The second value specified the distance between the two lines<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The third value specifies the width of the outer line<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:border-line-width-right</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:border-line-width-right</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_245style_border-line-width-top"><span style="margin-right:0.127cm;">20.245</span></a><a id="__RefHeading__1419938_253892949"/><a id="property-style_border-line-width-top"/>style:border-line-width-top</h2><p class="Text_20_body">The <span class="Attribute">style:border-line-width-top</span> attribute specifies the widths of the top border for borders defined by the FO border properties (see <a href="#FO_Border_Properties">20.176</a>) if the property for the top border has the value <span class="Attribute_20_Value">double</span>.</p><p class="Text_20_body">The value of the <span class="Attribute">style:border-line-width-top</span> attribute is a list of three white space-separated lengths, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The first value specifies the width of the inner line<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The second value specified the distance between the two lines<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The third value specifies the width of the outer line<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:border-line-width-top</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:border-line-width-top</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_246style_cell-protect"><span style="margin-right:0.127cm;">20.246</span></a><a id="__RefHeading__1419940_253892949"/><a id="property-style_cell-protect"/>style:cell-protect</h2><p class="Text_20_body">The <span class="Attribute">style:cell-protect</span> attribute specifies how a cell is protected.</p><p class="Text_20_body">This attribute is only evaluated if the current table is protected. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:cell-protect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">formula-hidden</span>: if cell content is a formula, it is not displayed. It can be replaced by changing the cell content.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> Replacement of cell content includes replacement with another formula or other cell content.</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hidden-and-protected</span>: cell content is not displayed and cannot be edited. If content is a formula, the formula result is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: formula responsible for cell content is neither hidden nor protected.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">protected</span>: cell content can not be edited.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>protected formula-hidden: cell content can not be edited. If content is a formula, it is not displayed. A formula result is displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:cell-protect</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:cell-protect</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">hidden-and-protected</span>, or white space separated non-empty lists of one of these values: <span class="Attribute_20_Value">protected</span>, or <span class="Attribute_20_Value">formula-hidden</span>..</p><h2 class="Heading_20_2"><a id="a20_247style_column-width"><span style="margin-right:0.127cm;">20.247</span></a><a id="__RefHeading__1419942_253892949"/><a id="property-style_column-width"/>style:column-width</h2><p class="Text_20_body">The <span class="Attribute">style:column-width</span> attribute specifies a fixed width for a column.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:column-width</span> attribute is usable with the following element: <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:column-width</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_248style_country-asian"><span style="margin-right:0.127cm;">20.248</span></a><a id="__RefHeading__1419944_253892949"/><a id="property-style_country-asian"/>style:country-asian</h2><p class="Text_20_body">The <span class="Attribute">style:country-asian</span> attribute specifies the country of a text.</p><p class="Text_20_body">It is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">It may be ignored if it is not specified together with a <span class="Attribute">style:language-asian</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:country-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:country-asian</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a20_249style_country-complex"><span style="margin-right:0.127cm;">20.249</span></a><a id="__RefHeading__1419946_253892949"/><a id="property-style_country-complex"/>style:country-complex</h2><p class="Text_20_body">The <span class="Attribute">style:country-complex</span> attribute specifies the country of a text. See §7.9.1 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">It is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">It may be ignored if it is not specified together with a <span class="Attribute">style:language-complex</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:country-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:country-complex</span> attribute has the data type <span class="Datatype">countryCode</span> <a href="#datatype-countryCode">18.3.11</a>.</p><h2 class="Heading_20_2"><a id="a20_250style_decimal-places"><span style="margin-right:0.127cm;">20.250</span></a><a id="__RefHeading__1419948_253892949"/><a id="property-style_decimal-places"/>style:decimal-places</h2><p class="Text_20_body">The <span class="Attribute">style:decimal-places</span> attribute specifies the maximum number of decimal places that are displayed if numbers are formatted by a data style that has no setting for number of decimal places itself.</p><p class="Text_20_body">This attribute is only evaluated if it is contained in a default style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:decimal-places</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:decimal-places</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_251style_diagonal-bl-tr"><span style="margin-right:0.127cm;">20.251</span></a><a id="__RefHeading__1419950_253892949"/><a id="property-style_diagonal-bl-tr"/>style:diagonal-bl-tr</h2><p class="Text_20_body">The <span class="Attribute">style:diagonal-bl-tr</span> attribute specifies the style of border to use for a bottom-left to top-right diagonal in a spreadsheet cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:diagonal-bl-tr</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:diagonal-bl-tr</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_252style_diagonal-bl-tr-widths"><span style="margin-right:0.127cm;">20.252</span></a><a id="__RefHeading__1419952_253892949"/><a id="property-style_diagonal-bl-tr-widths"/>style:diagonal-bl-tr-widths</h2><p class="Text_20_body">The <span class="Attribute">style:diagonal-bl-tr-widths</span> attribute specifies the width between a double line border to use for a bottom-left to top-right diagonal in a spreadsheet cell.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:diagonal-bl-tr-widths</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:diagonal-bl-tr-widths</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_253style_diagonal-tl-br"><span style="margin-right:0.127cm;">20.253</span></a><a id="__RefHeading__1419954_253892949"/><a id="property-style_diagonal-tl-br"/>style:diagonal-tl-br</h2><p class="Text_20_body">The <span class="Attribute">style:diagonal-tl-br</span> attribute specifies the style of border to use for a left-top to bottom-right diagonal in a spreadsheet cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:diagonal-tl-br</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:diagonal-tl-br</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_254style_diagonal-tl-br-widths"><span style="margin-right:0.127cm;">20.254</span></a><a id="__RefHeading__1419956_253892949"/><a id="property-style_diagonal-tl-br-widths"/>style:diagonal-tl-br-widths</h2><p class="Text_20_body">The <span class="Attribute">style:diagonal-tl-br-widths</span> attribute specifies the width between a double line border to use for a top-left to bottom-right diagonal in a spreadsheet cell.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:diagonal-tl-br-widths</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:diagonal-tl-br-widths</span> attribute are three white space separated values of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_255style_direction"><span style="margin-right:0.127cm;">20.255</span></a><a id="__RefHeading__1419958_253892949"/><a id="property-style_direction"/>style:direction</h2><p class="Text_20_body">The <span class="Attribute">style:direction</span> attribute specifies the direction of characters.</p><p class="Text_20_body">The <span class="Attribute">style:direction</span> attribute modifies the direction of text rendering as specified by a <span class="Attribute">style:writing-mode</span> attribute. <a href="#property-style_writing-mode">20.394</a> </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ltr</span> – left to right, text is rendered in the direction specified by the <span class="Attribute">style:writing-mode</span> attribute <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ttb</span> – top to bottom, characters are vertically stacked but not rotated<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:direction</span> attribute is usable with the following elements: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:direction</span> attribute are <span class="Attribute_20_Value">ltr</span> or <span class="Attribute_20_Value">ttb</span>.</p><h2 class="Heading_20_2"><a id="a20_256style_dynamic-spacing"><span style="margin-right:0.127cm;">20.256</span></a><a id="__RefHeading__1419960_253892949"/><a id="property-style_dynamic-spacing"/>style:dynamic-spacing</h2><p class="Text_20_body">The <span class="Attribute">style:dynamic-spacing</span> attribute specifies whether the header or footer grows into the space between the page body and the header or footer before the height of the page body becomes smaller. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:dynamic-spacing</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: header or footers do not grow into the space between the header and footer and the page body.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: header or footers first grow into the space between the header and footer and the page body.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:dynamic-spacing</span> attribute is usable with the following element: <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:dynamic-spacing</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_257style_editable"><span style="margin-right:0.127cm;">20.257</span></a><a id="__RefHeading__1419962_253892949"/><a id="property-style_editable"/>style:editable</h2><p class="Text_20_body">The <span class="Attribute">style:editable</span> attribute specifies if a text section or box can be edited within a read-only document. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:editable</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text section or box in read-only document should not be editable.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text section or box in read-only document should be editable.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:editable</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a> and <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:editable</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_258style_first-page-number"><span style="margin-right:0.127cm;">20.258</span></a><a id="__RefHeading__1419964_253892949"/><a id="property-style_first-page-number"/>style:first-page-number</h2><p class="Text_20_body">The <span class="Attribute">style:first-page-number</span> attribute specifies the number of a document.</p><p class="Text_20_body">The value of this attribute can be an integer or <span class="Attribute_20_Value">continue</span>. If the value is <span class="Attribute_20_Value">continue</span>, the page number is the preceding page number incremented by 1. The default first page number is 1.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:first-page-number</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:first-page-number</span> attribute are a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a> or <span class="Attribute_20_Value">continue</span>.</p><h2 class="Heading_20_2"><a id="a20_259style_flow-with-text"><span style="margin-right:0.127cm;">20.259</span></a><a id="__RefHeading__1419966_253892949"/><a id="property-style_flow-with-text"/>style:flow-with-text</h2><p class="Text_20_body">The <span class="Attribute">style:flow-with-text</span> attribute specifies whether a drawing shape flows with the text of its layout environment or not. The layout environment of a drawing shape is determined by the location of its anchor. The following layout environments are defined:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>endnote area - anchor is inside an endnote.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>footnote area - anchor is inside a footnote.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>frame area - anchor is inside a frame or is a frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>page footer area - anchor is inside the page footer.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>page header area - anchor is inside the page header.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>page text area - anchor is inside body text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>table cell area - anchor is inside a table cell.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The innermost enclosing area of the anchor defines the layout environment of the drawing shape. </p><p class="Text_20_body">If the value of the attribute is <span class="Attribute_20_Value">true</span>, the following conditions shall hold:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The drawing shape flows with the text of its layout environment.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>The drawing shape does not leave its layout environment in the either text flow direction.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">When a drawing shape leaves its layout environment due to its position and/or size in the forward text flow direction, it flows with the text flow to the next layout environment. If there is no next layout environment, the position of the layout environment is adjusted. If the drawing shape is larger than its layout environment, the size of the layout environment is adjusted.</p><p class="Text_20_body">If due to its position a drawing shape would leave its layout environment in the backward text flow direction, the position is adjusted to the beginning of its layout environment.</p><p class="Text_20_body">A drawing object may leave its layout environment in the other (non text flow) directions. Exceptions from this rule are the layout environments table cell area and frame area. For these layout environments it shall be ensured that the drawing shape is laid out inside its layout environment by adjusting the position and (if necessary) the size.</p><p class="Text_20_body">If the value of the attribute is <span class="Attribute_20_Value">false</span>, the drawing shape does not have to flow with the text of its layout environment. It can be laid out anywhere on the page its anchor is on.</p><p class="Text_20_body">This attribute is not applicable to drawing shapes that are anchored with <span class="Attribute">text:anchor-type</span><span class="Source_20_Text">="</span><span class="Attribute_20_Value">as-char</span><span class="Source_20_Text">"</span>, because such drawing shapes are treated as characters. For drawing shapes, which are anchored to a specific page with <span class="Attribute">text:anchor-type</span><span class="Source_20_Text">="</span><span class="Attribute_20_Value">page</span><span class="Source_20_Text">"</span>, the attribute is also not applicable, because such drawing shapes are to be laid out on the page they are anchored to.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:flow-with-text</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:flow-with-text</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_260style_font-charset"><span style="margin-right:0.127cm;">20.260</span></a><a id="__RefHeading__1419968_253892949"/><a id="property-style_font-charset"/>style:font-charset</h2><p class="Text_20_body">The <span class="Attribute">style:font-charset</span> attribute specifies whether a font defines glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> or not.</p><p class="Text_20_body">The value of this attributes can be <span class="Attribute_20_Value_20_Instance">x-symbol</span> or a character encoding in the notation described in the §4.3.3 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>. If the value is <span class="Attribute_20_Value_20_Instance">x-symbol</span>, the font does not define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. If the value is one of the encodings or transformations of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>, the font does define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. The use of other values is deprecated.</p><p class="Note"><span class="Note_20_Label">Note:</span> Fonts for which the attribute has the value <span class="Attribute_20_Value_20_Instance">x-symbol</span> may define glyphs for code points in the private use area of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a></p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-charset</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-charset</span> attribute has the data type <span class="Datatype">textEncoding</span> <a href="#datatype-textEncoding">18.3.35</a>.</p><h2 class="Heading_20_2"><a id="a20_261style_font-charset-asian"><span style="margin-right:0.127cm;">20.261</span></a><a id="__RefHeading__1419970_253892949"/><a id="property-style_font-charset-asian"/>style:font-charset-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-charset-asian</span> attribute specifies whether a font defines glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> or not.</p><p class="Text_20_body">The value of this attributes can be <span class="Attribute_20_Value_20_Instance">x-symbol</span> or a character encoding in the notation described in the §4.3.3 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>. If the value is <span class="Attribute_20_Value_20_Instance">x-symbol</span>, the font does not define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. If the value is one of the encodings or transformations of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>, the font does define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. The use of other values is deprecated.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Fonts for which the attribute has the value <span class="Attribute_20_Value_20_Instance">x-symbol</span> may define glyphs for code points in the private use area of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a></p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a><a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no <span class="Attribute">style:font-family-asian</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-asian</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-charset-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-charset-asian</span> attribute has the data type <span class="Datatype">textEncoding</span> <a href="#datatype-textEncoding">18.3.35</a>.</p><h2 class="Heading_20_2"><a id="a20_262style_font-charset-complex"><span style="margin-right:0.127cm;">20.262</span></a><a id="__RefHeading__1419972_253892949"/><a id="property-style_font-charset-complex"/>style:font-charset-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-charset-complex</span> attribute specifies whether a font defines glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> or not.</p><p class="Text_20_body">The value of this attributes can be <span class="Attribute_20_Value_20_Instance">x-symbol</span> or a character encoding in the notation described in the §4.3.3 of <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>. If the value is <span class="Attribute_20_Value_20_Instance">x-symbol</span>, the font does not define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. If the value is one of the encodings or transformations of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>, the font does define glyphs according to the semantics of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a>. The use of other values is deprecated.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Fonts for which the attribute has the value <span class="Attribute_20_Value_20_Instance">x-symbol</span> may define glyphs for code points in the private use area of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a></p><p class="Text_20_body">The <span class="Attribute">style:font-charset-complex</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no <span class="Attribute">style:font-family-complex</span> attribute attached to the same formatting properties element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-complex</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-charset-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-charset-complex</span> attribute has the data type <span class="Datatype">textEncoding</span> <a href="#datatype-textEncoding">18.3.35</a>.</p><h2 class="Heading_20_2"><a id="a20_263style_font-family-asian"><span style="margin-right:0.127cm;">20.263</span></a><a id="__RefHeading__1419974_253892949"/><a id="property-style_font-family-asian"/>style:font-family-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-family-asian</span> attribute specifies the font family for a text. See §7.8.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_font-size-complex">20.277</a></p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-asian</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-family-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-family-asian</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_264style_font-family-complex"><span style="margin-right:0.127cm;">20.264</span></a><a id="__RefHeading__1419976_253892949"/><a id="property-style_font-family-complex"/>style:font-family-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-family-complex</span> attribute specifies the font family for a text. See §7.8.2 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-complex</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-family-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-family-complex</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_265style_font-family-generic"><span style="margin-right:0.127cm;">20.265</span></a><a id="__RefHeading__1419978_253892949"/><a id="property-style_font-family-generic"/>style:font-family-generic</h2><p class="Text_20_body">The <span class="Attribute">style:font-family-generic</span> attribute specifies a generic font family name.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name</span> attribute should be used to specify the properties of a font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-family-generic</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">decorative</span>: the family of decorative fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">modern</span>: the family of modern fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roman</span>: the family roman fonts (with serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">script</span>: the family of script fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">swiss</span>: the family roman fonts (without serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">system</span>: the family system fonts. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-family-generic</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-family-generic</span> attribute are <span class="Attribute_20_Value">roman</span>, <span class="Attribute_20_Value">swiss</span>, <span class="Attribute_20_Value">modern</span>, <span class="Attribute_20_Value">decorative</span>, <span class="Attribute_20_Value">script</span> or <span class="Attribute_20_Value">system</span>.</p><h2 class="Heading_20_2"><a id="a20_266style_font-family-generic-asian"><span style="margin-right:0.127cm;">20.266</span></a><a id="__RefHeading__1419980_253892949"/><a id="property-style_font-family-generic-asian"/>style:font-family-generic-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-family-generic-asian</span> attribute specifies a generic Asian font family name.</p><p class="Text_20_body">The <span class="Attribute">style:font-family-generic-asian</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_font-size-complex">20.277</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-asian</span> attribute should be used to specify the properties of a font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-family-generic-asian</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">decorative</span>: the family of decorative fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">modern</span>: the family of modern fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">roman</span>: the family roman fonts (with serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">script</span>: the family of script fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">swiss</span>: the family roman fonts (without serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">system</span>: the family system fonts. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-family-generic-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-family-generic-asian</span> attribute are <span class="Attribute_20_Value">roman</span>, <span class="Attribute_20_Value">swiss</span>, <span class="Attribute_20_Value">modern</span>, <span class="Attribute_20_Value">decorative</span>, <span class="Attribute_20_Value">script</span> or <span class="Attribute_20_Value">system</span>.</p><h2 class="Heading_20_2"><a id="a20_267style_font-family-generic-complex"><span style="margin-right:0.127cm;">20.267</span></a><a id="__RefHeading__1419982_253892949"/><a id="property-style_font-family-generic-complex"/>style:font-family-generic-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-family-generic-complex</span> attribute specifies a generic font family name.</p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-complex</span> attribute should be used to specify the properties of a font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-family-generic-complex</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">decorative</span>: the family of decorative fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">m</span><span class="Attribute_20_Value">odern</span>: the family of modern fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">oman</span>: the family roman fonts (with serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">cript</span>: the family of script fonts. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">swiss</span>: the family roman fonts (without serifs). <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">system</span>: the family system fonts. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-family-generic-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-family-generic-complex</span> attribute are <span class="Attribute_20_Value">roman</span>, <span class="Attribute_20_Value">swiss</span>, <span class="Attribute_20_Value">modern</span>, <span class="Attribute_20_Value">decorative</span>, <span class="Attribute_20_Value">script</span> or <span class="Attribute_20_Value">system</span>.</p><h2 class="Heading_20_2"><a id="a20_268style_font-independent-line-spacing"><span style="margin-right:0.127cm;">20.268</span></a><a id="__RefHeading__1419984_253892949"/><a id="property-style_font-independent-line-spacing"/>style:font-independent-line-spacing</h2><p class="Text_20_body">The <span class="Attribute">style:font-independent-line-spacing</span> attribute specifies if font independent line spacing is used. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-independent-line-spacing</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: font metric of the font is taken into account.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: line height is calculated only from the font height as specified by the font size attributes <span class="Attribute">fo:font-size</span>, <span class="Attribute">style:font-size-asian</span> and <span class="Attribute">style:font-size-complex</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-independent-line-spacing</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-independent-line-spacing</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_269style_font-name"><span style="margin-right:0.127cm;">20.269</span></a><a id="__RefHeading__1419986_253892949"/><a id="property-style_font-name"/>style:font-name</h2><p class="Text_20_body">The <span class="Attribute">style:font-name</span> attribute specifies a font that is declared by a <span class="Element">&lt;style:font-face&gt;</span> element with a <span class="Attribute">style:name</span> attribute whose name is the same as that of the <span class="Attribute">style:font-name</span> attribute value. </p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-name</span> attribute is usable with the following elements: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a> and <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_270style_font-name-asian"><span style="margin-right:0.127cm;">20.270</span></a><a id="__RefHeading__1419988_253892949"/><a id="property-style_font-name-asian"/>style:font-name-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-name-asian</span> attribute specifies a font that is declared by a <span class="Element">&lt;style:font-face&gt;</span> element with a style:name attribute whose name is the same as that of the <span class="Attribute">style:font-name-asian</span> attribute value. </p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_font-size-complex">20.277</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-name-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-name-asian</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_271style_font-name-complex"><span style="margin-right:0.127cm;">20.271</span></a><a id="__RefHeading__1419990_253892949"/><a id="property-style_font-name-complex"/>style:font-name-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-name-complex</span> attribute specifies a font that is declared by a <span class="Element">&lt;style:font-face&gt;</span> element with a <span class="Attribute">style:name</span> attribute whose name is the same as that of the <span class="Attribute">style:font-name-complex</span> attribute value. </p><p class="Text_20_body">The <span class="Attribute">style:font-name-complex</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-name-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-name-complex</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_272style_font-pitch"><span style="margin-right:0.127cm;">20.272</span></a><a id="__RefHeading__1419992_253892949"/><a id="property-style_font-pitch"/>style:font-pitch</h2><p class="Text_20_body">The <span class="Attribute">style:font-pitch</span> attribute specifies whether a font has a fixed or variable width.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name</span> attribute should be used to specify the properties of a font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-pitch</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: font pitch is fixed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">v</span><span class="Attribute_20_Value">ariable</span>: font pitch is variable.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-pitch</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-pitch</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">variable</span>.</p><h2 class="Heading_20_2"><a id="a20_273style_font-pitch-asian"><span style="margin-right:0.127cm;">20.273</span></a><a id="__RefHeading__1419994_253892949"/><a id="property-style_font-pitch-asian"/>style:font-pitch-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-pitch-asian</span> attribute specifies whether a font has a fixed or variable width.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-asian</span> attribute should be used to specify the properties of a font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-pitch-asian</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: font width is fixed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">variable</span>: font width is variable.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-pitch-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-pitch-asian</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">variable</span>.</p><h2 class="Heading_20_2"><a id="a20_274style_font-pitch-complex"><span style="margin-right:0.127cm;">20.274</span></a><a id="__RefHeading__1419996_253892949"/><a id="property-style_font-pitch-complex"/>style:font-pitch-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-pitch-complex</span> attribute specifies whether a font has a fixed or variable width.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-complex</span> attribute should be used to specify the properties of a font.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-pitch-complex</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: font width is fixed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">v</span><span class="Attribute_20_Value">ariable</span>: font width is variable.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-pitch-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-pitch-complex</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">variable</span>.</p><h2 class="Heading_20_2"><a id="a20_275style_font-relief"><span style="margin-right:0.127cm;">20.275</span></a><a id="__RefHeading__1419998_253892949"/><a id="property-style_font-relief"/>style:font-relief</h2><p class="Text_20_body">The <span class="Attribute">style:font-relief</span> attribute specifies whether a font should be embossed, engraved, or neither.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-relief</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">embossed</span>: characters are embossed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">e</span><span class="Attribute_20_Value">ngraved</span>: characters are engraved.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: characters are neither embossed or engraved.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-relief</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-relief</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">embossed</span> or <span class="Attribute_20_Value">engraved</span>.</p><h2 class="Heading_20_2"><a id="a20_276style_font-size-asian"><span style="margin-right:0.127cm;">20.276</span></a><a id="__RefHeading__1420000_253892949"/><a id="property-style_font-size-asian"/>style:font-size-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-size-asian</span> attribute specifies the size of a font.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The value of this attribute is either an absolute length or a percentage as described in §7.8.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. In contrast to XSL, percentage values can be used within common styles only and are based on the font height of the parent style rather than to the font height of the attributes neighborhood. Absolute font heights and relative font heights are not supported.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-size-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-size-asian</span> attribute are a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_277style_font-size-complex"><span style="margin-right:0.127cm;">20.277</span></a><a id="__RefHeading__1420002_253892949"/><a id="property-style_font-size-complex"/>style:font-size-complex</h2><p class="Text_20_body">The <span class="Attribute">fo:font-size</span>, <span class="Attribute">style:font-size-asian</span> and <span class="Attribute">style:font-size-complex</span> attributes specify the size of a font.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The value of this attribute is either an absolute length or a percentage as described in §7.8.4 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>. In contrast to XSL, percentage values can be used within common styles only and are based on the font height of the parent style rather than to the font height of the attributes neighborhood. Absolute font heights and relative font heights are not supported.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-size-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-size-complex</span> attribute are a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a> or a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_278style_font-size-rel"><span style="margin-right:0.127cm;">20.278</span></a><a id="__RefHeading__1420004_253892949"/><a id="property-style_font-size-rel"/>style:font-size-rel</h2><p class="Text_20_body">The <span class="Attribute">style:font-size-rel</span> attribute specifies a relative font size change.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute specifies a relative font size change as a length. It cannot be used within automatic styles. This attribute changes the font size based on the font size of the parent style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-size-rel</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-size-rel</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_279style_font-size-rel-asian"><span style="margin-right:0.127cm;">20.279</span></a><a id="__RefHeading__1420006_253892949"/><a id="property-style_font-size-rel-asian"/>style:font-size-rel-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-size-rel-asian</span> attributes specifies a relative font size change.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute specifies a relative font size change as a length. It cannot be used within automatic styles. This attribute changes the font size based on the font size of the parent style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-size-rel-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-size-rel-asian</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_280style_font-size-rel-complex"><span style="margin-right:0.127cm;">20.280</span></a><a id="__RefHeading__1420008_253892949"/><a id="property-style_font-size-rel-complex"/>style:font-size-rel-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-size-rel</span>, <span class="Attribute">style:font-size-rel-asian</span> and <span class="Attribute">style:font-size-rel-complex</span> attributes specify a relative font size change.</p><p class="Text_20_body">The <span class="Attribute">style:font-size-rel-complex</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute specifies a relative font size change as a length. It cannot be used within automatic styles. This attribute changes the font size based on the font size of the parent style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-size-rel-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-size-rel-complex</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_281style_font-style-asian"><span style="margin-right:0.127cm;">20.281</span></a><a id="__RefHeading__1420010_253892949"/><a id="property-style_font-style-asian"/>style:font-style-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-style-asian</span> attribute specifies whether to use normal or italic font face. See §7.8.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-style-asian</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">italic</span>: characters displayed in an italic font face.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">ormal</span>: characters displayed in normal font face.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">o</span><span class="Attribute_20_Value">blique</span>: characters displayed in an oblique font face.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-style-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-style-asian</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">italic</span> or <span class="Attribute_20_Value">oblique</span>.</p><h2 class="Heading_20_2"><a id="a20_282style_font-style-complex"><span style="margin-right:0.127cm;">20.282</span></a><a id="__RefHeading__1420012_253892949"/><a id="property-style_font-style-complex"/>style:font-style-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-style-complex</span> attribute specifies whether to use normal or italic font face. See §7.8.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The <span class="Attribute">fo:font-style</span> attribute is evaluated for any other <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:font-style-complex</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">italic</span>: characters displayed in an italic font face.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">ormal</span>: characters displayed in normal font face.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">o</span><span class="Attribute_20_Value">blique</span>: characters displayed in an oblique font face.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-style-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-style-complex</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">italic</span> or <span class="Attribute_20_Value">oblique</span>.</p><h2 class="Heading_20_2"><a id="a20_283style_font-style-name"><span style="margin-right:0.127cm;">20.283</span></a><a id="__RefHeading__1420014_253892949"/><a id="property-style_font-style-name"/>style:font-style-name</h2><p class="Text_20_body">The <span class="Attribute">style:font-style-name</span> attribute specifies a font style name.</p><p class="Text_20_body">This attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character whose script type is <span class="Attribute_20_Value">latin</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-style-name</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_284style_font-style-name-asian"><span style="margin-right:0.127cm;">20.284</span></a><a id="__RefHeading__1420016_253892949"/><a id="property-style_font-style-name-asian"/>style:font-style-name-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-style-name-asian</span> attribute specifies a font style name.</p><p class="Text_20_body">The <span class="Attribute">style:font-style-name-asian</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-asian</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-style-name-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-style-name-asian</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_285style_font-style-name-complex"><span style="margin-right:0.127cm;">20.285</span></a><a id="__RefHeading__1420018_253892949"/><a id="property-style_font-style-name-complex"/>style:font-style-name-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-style-name-complex</span> attribute specifies a font style name.</p><p class="Text_20_body">The <span class="Attribute">style:font-style-name-complex</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is ignored if there is no corresponding <span class="Attribute">fo:font-family</span> attribute attached to the same formatting property element.</p><p class="Text_20_body">Instead of this attribute, the <span class="Attribute">style:font-name-complex</span> attribute should be used to specify the properties of a font.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-style-name-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:font-style-name-complex</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_286style_font-weight-asian"><span style="margin-right:0.127cm;">20.286</span></a><a id="__RefHeading__1420020_253892949"/><a id="property-style_font-weight-asian"/>style:font-weight-asian</h2><p class="Text_20_body">The <span class="Attribute">style:font-weight-asian</span> attribute specifies the weight of a font. See §7.8.9 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-weight-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-weight-asian</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">100</span>, <span class="Attribute_20_Value">200</span>, <span class="Attribute_20_Value">300</span>, <span class="Attribute_20_Value">400</span>, <span class="Attribute_20_Value">500</span>, <span class="Attribute_20_Value">600</span>, <span class="Attribute_20_Value">700</span>, <span class="Attribute_20_Value">800</span> or <span class="Attribute_20_Value">900</span>.</p><h2 class="Heading_20_2"><a id="a20_287style_font-weight-complex"><span style="margin-right:0.127cm;">20.287</span></a><a id="__RefHeading__1420022_253892949"/><a id="property-style_font-weight-complex"/>style:font-weight-complex</h2><p class="Text_20_body">The <span class="Attribute">style:font-weight-complex</span> attributes specify the weight of a font. See §7.8.9 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The <span class="Attribute">fo:font-weight</span> attribute is evaluated for any other <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:font-weight-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:font-weight-complex</span> attribute are <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">100</span>, <span class="Attribute_20_Value">200</span>, <span class="Attribute_20_Value">300</span>, <span class="Attribute_20_Value">400</span>, <span class="Attribute_20_Value">500</span>, <span class="Attribute_20_Value">600</span>, <span class="Attribute_20_Value">700</span>, <span class="Attribute_20_Value">800</span> or <span class="Attribute_20_Value">900</span>.</p><h2 class="Heading_20_2"><a id="a20_288style_footnote-max-height"><span style="margin-right:0.127cm;">20.288</span></a><a id="__RefHeading__1420024_253892949"/><a id="property-style_footnote-max-height"/>style:footnote-max-height</h2><p class="Text_20_body">The <span class="Attribute">style:footnote-max-height</span> attribute specifies the maximum amount of space on a page that a footnote can occupy. The value of the attribute is a length, which determines the maximum height of a footnote area.</p><p class="Text_20_body">If the value of this attribute is set to <span class="Attribute_20_Value_20_Instance">0cm</span>, there is no limit to the amount of space that the footnote can occupy.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:footnote-max-height</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:footnote-max-height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_289style_glyph-orientation-vertical"><span style="margin-right:0.127cm;">20.289</span></a><a id="__RefHeading__1420026_253892949"/><a id="property-style_glyph-orientation-vertical"/>style:glyph-orientation-vertical</h2><p class="Text_20_body">The <span class="Attribute">style:glyph-orientation-vertical</span> attribute specifies a vertical glyph orientation. See §10.7.3 of <a id="DDE_LINK81"/><a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>. The attribute specifies an angle or automatic mode. The only defined angle is 0 degrees, which disables this feature.</p><p class="Note"><span class="Note_20_Label">Note:</span> OpenDocument v1.1 did not support angle specifications that contain an angle unit identifier. Angle unit identifiers should be omitted for compatibility with OpenDocument v1.1.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:glyph-orientation-vertical</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:glyph-orientation-vertical</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">0</span>, <span class="Attribute_20_Value">0deg</span>, <span class="Attribute_20_Value">0rad</span> or <span class="Attribute_20_Value">0grad</span>.</p><h2 class="Heading_20_2"><a id="a20_290style_horizontal-pos"><span style="margin-right:0.127cm;">20.290</span></a><a id="__RefHeading__1420028_253892949"/><a id="property-style_horizontal-pos"/>style:horizontal-pos</h2><p class="Text_20_body">The <span class="Attribute">style:horizontal-pos</span> attribute specifies the horizontal alignment of a frame in relation to an area specified by the <span class="Attribute">style:horizontal-rel attribute</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:horizontal-pos</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: horizontal alignment of a frame should be centered relative to <span class="T2">the</span> specified area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-inside</span>: on pages with an odd page number the left edge of the specific area is taken as the horizontal alignment of a frame. On pages with an even page number the right edge of the specified area is taken. Attribute <span class="Attribute">svg:x</span> associated with the frame element specifies the horizontal position of the frame from the edge which is taken. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-left</span>: the <span class="Attribute">svg:x</span> attribute associated with the frame element specifies the horizontal position of the frame from the left edge of the specified area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">inside</span>: on pages with an odd page number the horizontal alignment of a frame is the same as for the attribute value left. On pages with an even page number the horizontal alignment of a frame is the same as for the attribute value right. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: horizontal alignment of a frame should be left aligned relative to the specified area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outside</span>: on pages with an odd page number the horizontal alignment of a frame is the same as for the attribute value right. On pages with an even page number the horizontal alignment of a frame is the same as for the attribute value left. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: horizontal alignment of a frame should be right aligned relative to the specified area.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">If the attribute value is not <span class="Attribute_20_Value">from-left</span> and not <span class="Attribute_20_Value">from-inside</span>, the <span class="Attribute">svg:x</span> attribute associated with the frame element is ignored for text documents.</p><p class="Text_20_body">Tables <a href="#refTable18">19</a> and <a href="#refTable19">20</a> display the defined combinations of values of the attributes <span class="Attribute">style:horizontal-pos</span> and <span class="Attribute">style:horizontal-rel</span>. The values of these alignment attributes are listed in the first column on the left, and an alignment attribute value/anchor type value match is indicated by an X.</p><p class="Table">Table <a id="refTable18"/>19 - Horizontal position values</p><table border="0" cellspacing="0" cellpadding="0" class="Table9"><colgroup><col width="137"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/></colgroup><tr><td style="text-align:left;width:1.2354in; " class="Table9_A1"><p class="Table_20_Heading">Value of <span class="Attribute">style:horizontal-pos</span></p></td><td colspan="5" style="text-align:left;"><table border="0" cellspacing="0" cellpadding="0"><colgroup><col width="106"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/></colgroup><tr><th colspan="5" style="text-align:left;width:0.9535in; " class="Table9_B1_1_1"><p class="Table_20_Heading">Value of <span class="Attribute">text:anchor-type</span></p></th></tr><tr><th style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">page</span></p></th><th style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">frame</span></p></th><th style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">paragraph</span></p></th><th style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">char</span></p></th><th style="text-align:left;width:0.9507in; " class="Table9_B1_5_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">as-char</span></p></th></tr></table></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table9_B1_1_2"><p class="Table_20_Contents">any</p></td><td style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table9_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table9_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr></table><p class="Table">Table <a id="refTable19"/>20 - Horizontal relation values</p><p class="Table"> </p><table border="0" cellspacing="0" cellpadding="0" class="Table10"><colgroup><col width="137"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/></colgroup><tr><td style="text-align:left;width:1.2354in; " class="Table10_A1"><p class="Table_20_Heading">Value of <span class="Attribute">style:horizontal-rel</span></p></td><td colspan="5" style="text-align:left;"><table border="0" cellspacing="0" cellpadding="0"><colgroup><col width="106"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/></colgroup><tr><th colspan="5" style="text-align:left;width:0.9535in; " class="Table10_B1_1_1"><p class="Table_20_Heading">Value of <span class="Attribute">text:anchor-type</span></p></th></tr><tr><th style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">page</span></p></th><th style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">frame</span></p></th><th style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">paragraph</span></p></th><th style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">char</span></p></th><th style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">as-char</span></p></th></tr></table></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">char</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame-content</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame-end-margin</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame-start-</span><span class="Attribute_20_Value">margin</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page-content</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page-end-</span><span class="Attribute_20_Value">margin</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page-start-</span><span class="Attribute_20_Value">margin</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph-</span><span class="Attribute_20_Value">content</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph-</span><span class="Attribute_20_Value">end-</span><span class="Attribute_20_Value">margin</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2354in; " class="Table10_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph-</span><span class="Attribute_20_Value">start-margin</span></p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table10_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9507in; " class="Table10_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:horizontal-pos</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:horizontal-pos</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">from-left</span>, <span class="Attribute_20_Value">inside</span>, <span class="Attribute_20_Value">outside</span> or <span class="Attribute_20_Value">from-inside</span>.</p><h2 class="Heading_20_2"><a id="a20_291style_horizontal-rel"><span style="margin-right:0.127cm;">20.291</span></a><a id="__RefHeading__1420030_253892949"/><a id="property-style_horizontal-rel"/>style:horizontal-rel</h2><p class="Text_20_body">The <span class="Attribute">style:horizontal-rel</span> attribute specifies the area against which the horizontal position of a frame is positioned. </p><p class="Text_20_body">The value <span class="Attribute_20_Value">start-margin</span> determines the left margin, except when the horizontal position is <span class="Attribute_20_Value">from-inside</span>, <span class="Attribute_20_Value">inside</span> or <span class="Attribute_20_Value">outside</span> and the anchor for the frame is on a page with an even page number, in which case it determines the right margin. The value <span class="Attribute_20_Value">end-margin</span> determines the opposite margin to the <span class="Attribute_20_Value">start-margin</span> values.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:horizontal-rel</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">char</span>: horizontal position of a frame is positioned relative to a character. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age</span>: horizontal position of a frame is positioned relative to a page. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age-content</span>: horizontal position of a frame is positioned relative to page-content. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age-start-margin</span>: horizontal position of a frame is positioned relative to a page start margin. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age-end-margin</span>: horizontal position of a frame is positioned relative to a page end margin. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rame</span>: horizontal position of a frame is positioned relative to another frame. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rame-content</span>: horizontal position of a frame is positioned relative to frame content. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rame-end-margin</span>: horizontal position of a frame is positioned relative to a frame end margin. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rame-start-margin</span>: horizontal position of a frame is positioned relative to a frame start margin <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">aragraph</span>: horizontal position of a frame is positioned relative to a paragraph. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">aragraph-content</span>: horizontal position of a frame is positioned relative to paragraph content. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">aragraph-end-margin</span>: horizontal position of a frame is positioned relative to a paragraph end margin. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">paragraph-start-margin</span>:horizontal position of a frame is positioned relative to a paragraph start margin. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:horizontal-rel</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:horizontal-rel</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">page-content</span>, <span class="Attribute_20_Value">page-start-margin</span>, <span class="Attribute_20_Value">page-end-margin</span>, <span class="Attribute_20_Value">frame</span>, <span class="Attribute_20_Value">frame-content</span>, <span class="Attribute_20_Value">frame-start-margin</span>, <span class="Attribute_20_Value">frame-end-margin</span>, <span class="Attribute_20_Value">paragraph</span>, <span class="Attribute_20_Value">paragraph-content</span>, <span class="Attribute_20_Value">paragraph-start-margin</span>, <span class="Attribute_20_Value">paragraph-end-margin</span> or <span class="Attribute_20_Value">char</span>.</p><h2 class="Heading_20_2"><a id="a20_292style_join-border"><span style="margin-right:0.127cm;">20.292</span></a><a id="__RefHeading__1420032_253892949"/><a id="property-style_join-border"/>style:join-border</h2><p class="Text_20_body">The <span class="Attribute">style:join-border</span> property specifies whether a border for one paragraph is to be extended around the following paragraph. </p><p class="Text_20_body">In addition to the value of this attribute, joining of borders requires meeting these conditions:</p><ol><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">1)</span>Values of attributes <span class="Attribute">fo:border-top</span>, <span class="Attribute">fo:border-bottom</span>, <span class="Attribute">fo:border-left</span> and <span class="Attribute">fo:border-right</span> are the same. These values can also be given by the <span class="Attribute">fo:border</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">2)</span>Values of attributes <span class="Attribute">style:border-line-width-top</span>, <span class="Attribute">style:border-line-width-bottom</span>, <span class="Attribute">style:border-line-width-left</span> and <span class="Attribute">style:border-line-width-right</span> are the same. These values can also be given by the <span class="Attribute">style:border-line-width</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">3)</span>Values of attributes <span class="Attribute">fo:padding-left</span> and <span class="Attribute">fo:padding-right</span> are the same. These values can also be given by the <span class="Attribute">fo:padding</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">4)</span>Values of the <span class="Attribute">fo:margin-right</span> attributes are the same. These values can also be given by the <span class="Attribute">fo:margin</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span style="display:block;float:left;min-width:0.4991cm">5)</span>Values of the <span class="Attribute">fo:margin-left</span> attribute, which can also be given by the <span class="Attribute">fo:margin</span>, and <span class="Attribute">fo:text-indent</span> attributes, that meet one of these conditions:<span class="odfLiEnd"/> </p><ol><li><p class="P18" style="margin-left:0.4991cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">1.</span>All values are the same.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0.4991cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">2.</span>Values of the <span class="Attribute">fo:margin-left</span> attributes are the same and values of the <span class="Attribute">fo:text-indent</span> attributes are non-negative.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0.4991cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">3.</span>Value of the <span class="Attribute">fo:margin-left</span> attribute of one paragraph whose value of the <span class="Attribute">fo:text-indent</span> attribute is non-negative is the same as the sum of values of the <span class="Attribute">fo:margin-</span><span class="Attribute">left</span> and <span class="Attribute">fo:text-indent</span> attributes of the other paragraph whose value of the <span class="Attribute">fo:text-indent</span> attribute is negative.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0.4991cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">4.</span>Both values of the <span class="Attribute">fo:text-indent</span> attributes are negative and the sums of values of the <span class="Attribute">fo:margin-left</span> and <span class="Attribute">fo:text-indent</span> attributes are equal.<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">The default value of this attribute is true.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:join-border</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: borders should not be joined.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: borders should be joined.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:join-border</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:join-border</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_293style_justify-single-word"><span style="margin-right:0.127cm;">20.293</span></a><a id="__RefHeading__1420034_253892949"/><a id="property-style_justify-single-word"/>style:justify-single-word</h2><p class="Text_20_body">The <span class="Attribute">style:justify-single-word</span> attribute specifies whether a single word should be justified when the last line in a paragraph is justified.</p><p class="Text_20_body">Specifying a <span class="Attribute">style:justify-single-word</span> attribute without specifying a <span class="Attribute">fo:text-align</span> and <span class="Attribute">fo:text-align-last</span> attribute has no effect. Unspecified, both <span class="Attribute">fo:text-align</span> and <span class="Attribute">fo:text-align-last</span> have the value <span class="Attribute_20_Value">start</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:justify-single-word</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: single word should not be justified when the last line in a paragraph is justified.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: single word should be justified when last line in a paragraph is justified.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:justify-single-word</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:justify-single-word</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_294style_language-asian"><span style="margin-right:0.127cm;">20.294</span></a><a id="__RefHeading__1420036_253892949"/><a id="property-style_language-asian"/>style:language-asian</h2><p class="Text_20_body">The <span class="Attribute">style:language-asian</span> attribute specifies the language of a text.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute may be ignored if it is not specified together with a <span class="Attribute">style:country-asian</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:language-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:language-asian</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h2 class="Heading_20_2"><a id="a20_295style_language-complex"><span style="margin-right:0.127cm;">20.295</span></a><a id="__RefHeading__1420038_253892949"/><a id="property-style_language-complex"/>style:language-complex</h2><p class="Text_20_body">The <span class="Attribute">style:language-complex</span> attribute specifies the language of a text.</p><p class="Text_20_body">The <span class="Attribute">style:language-asian</span> attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">This attribute may be ignored if it is not specified together with a <span class="Attribute">style:country-complex</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:language-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:language-complex</span> attribute has the data type <span class="Datatype">languageCode</span> <a href="#datatype-languageCode">18.3.17</a>.</p><h2 class="Heading_20_2"><a id="a20_296style_layout-grid-base-height"><span style="margin-right:0.127cm;">20.296</span></a><a id="__RefHeading__1420040_253892949"/><a id="property-style_layout-grid-base-height"/>style:layout-grid-base-height</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-base-height</span> attribute specifies the height reserved in layout grid lines for non-ruby text.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-base-height</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-base-height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_297style_layout-grid-base-width"><span style="margin-right:0.127cm;">20.297</span></a><a id="__RefHeading__1420042_253892949"/><a id="property-style_layout-grid-base-width"/>style:layout-grid-base-width</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-base-width</span> attribute specifies a grid's base width. This attribute is only evaluated if <span class="Attribute">style:layout-grid-standard-mode</span> attribute has the value <span class="Attribute_20_Value">true</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-base-width</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-base-width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_298style_layout-grid-color"><span style="margin-right:0.127cm;">20.298</span></a><a id="__RefHeading__1420044_253892949"/><a id="property-style_layout-grid-color"/>style:layout-grid-color</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-color</span> attribute specifies the color of layout grid border lines.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-color</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_299style_layout-grid-display"><span style="margin-right:0.127cm;">20.299</span></a><a id="__RefHeading__1420046_253892949"/><a id="property-style_layout-grid-display"/>style:layout-grid-display</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-display</span> attribute specifies whether layout grid border lines are displayed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:layout-grid-display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: layout grid border lines should not be displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: layout grid border lines should be displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-display</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-display</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_300style_layout-grid-lines"><span style="margin-right:0.127cm;">20.300</span></a><a id="__RefHeading__1420048_253892949"/><a id="property-style_layout-grid-lines"/>style:layout-grid-lines</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-lines</span> attribute specifies the number of layout grid lines per page. The number of lines displayed may be smaller than specified if the page does not have space to display the specified number of lines with the specified line height.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-lines</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-lines</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_301style_layout-grid-mode"><span style="margin-right:0.127cm;">20.301</span></a><a id="__RefHeading__1420050_253892949"/><a id="property-style_layout-grid-mode"/>style:layout-grid-mode</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-mode</span> attribute enables Asian layout grids.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:layout-grid-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">both</span>: like lines, except that the lines are divided into rectangular layout cells. The calculation of layout cells depends on the <span class="Attribute">style:layout-grid-standard-mode</span> attribute. Within a layout cell, no more than one Asian <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> character is displayed. An Asian character that does not fit into a single layout cell is displayed centered into as many layout cells as required. Non Asian text is centered within as many cells as required.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">lines</span>: enables a line layout, this is, the page is divided in a fixed number of lines. The exact number of lines depends on the other layout grid formatting properties. There is no space between the layout grid lines. The layout grid itself is centered on the page.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: disables the layout grid.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:layout-grid-mode</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">line</span> or <span class="Attribute_20_Value">both</span>.</p><h2 class="Heading_20_2"><a id="a20_302style_layout-grid-print"><span style="margin-right:0.127cm;">20.302</span></a><a id="__RefHeading__1420052_253892949"/><a id="property-style_layout-grid-print"/>style:layout-grid-print</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-print</span> attribute specifies whether layout grid border lines are printed.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:layout-grid-print</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: layout grid border lines should not be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: layout grid border lines should be printed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-print</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-print</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_303style_layout-grid-ruby-below"><span style="margin-right:0.127cm;">20.303</span></a><a id="__RefHeading__1420054_253892949"/><a id="property-style_layout-grid-ruby-below"/>style:layout-grid-ruby-below</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-ruby-below</span> attribute specifies whether ruby text is displayed above or below the base text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:layout-grid-ruby-below</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: ruby text should be displayed above the base text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: ruby text should be displayed below the base text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-ruby-below</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-ruby-below</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_304style_layout-grid-ruby-height"><span style="margin-right:0.127cm;">20.304</span></a><a id="__RefHeading__1420056_253892949"/><a id="property-style_layout-grid-ruby-height"/>style:layout-grid-ruby-height</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-ruby-height</span> attribute specifies the height reserved in layout grid lines for ruby text. </p><p class="Text_20_body">The <span class="Attribute">style:layout-grid-ruby-height</span> attribute appears on a <span class="Element">&lt;style:page-layout-properties&gt;</span> element only if a <span class="Attribute">style:layout-grid-standard-mode</span> attribute, with the value <span class="Attribute_20_Value">false</span>, appears on the same <span class="Element">&lt;style:page-layout-properties&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-ruby-height</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-ruby-height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_305style_layout-grid-snap-to"><span style="margin-right:0.127cm;">20.305</span></a><a id="__RefHeading__1420058_253892949"/><a id="property-style_layout-grid-snap-to"/>style:layout-grid-snap-to</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-snap-to</span> attribute specifies whether the text is snapped to the grid or not. It is evaluated only if the <span class="Attribute">style:layout-grid-mode</span> attribute has the value <span class="Attribute_20_Value">both</span> and the <span class="Attribute">style:layout-grid-standard-mode</span> attribute has the value <span class="Attribute_20_Value">true</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:layout-grid-snap-to</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text should not be snapped to grid.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text should be snapped to grid.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-snap-to</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-snap-to</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_306style_layout-grid-standard-mode"><span style="margin-right:0.127cm;">20.306</span></a><a id="__RefHeading__1420060_253892949"/><a id="property-style_layout-grid-standard-mode"/>style:layout-grid-standard-mode</h2><p class="Text_20_body">The <span class="Attribute">style:layout-grid-standard-mode</span> attribute specifies how the rectangular grid cells are calculated if the <span class="Attribute">style:layout-grid-mode</span> attribute has the value <span class="Attribute_20_Value">both</span>.</p><p class="Text_20_body">The <span class="Attribute">style:layout-grid-standard-mode</span> attribute can only be used in the default page layout. If the <span class="Attribute">style:layout-grid-standard-mode</span> attribute appears inside a <span class="Element">&lt;style:page-layout&gt;</span> element it <span class="ISO_20_Keyword">shall </span>be ignored.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:layout-grid-standard-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the page is divided in a fixed number of lines, and the lines are divided into square cells. The number of cells per grid line depends on the line height, where the line height is the sum of the base height and the ruby height as specified by the <span class="Attribute">style:layout-grid-base-height</span> and <span class="Attribute">style:layout-grid-ruby-height</span> attributes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: the page is divided into a fixed numbers of lines, and the lines are divided into rectangular cells. The line height is specified by the <span class="Attribute">style:layout-grid-base-height</span> attribute, and the cell width is specified by <span class="Attribute">style:layout-grid-base-width</span> attribute. The number of cells per line depends on the grid base width. This mode is also called <span class="Def">standard paper mode</span>. The <span class="Attribute">style:layout-grid-ruby-height</span> attribute is ignored in this mode.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:layout-grid-standard-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:layout-grid-standard-mode</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_307style_line-break"><span style="margin-right:0.127cm;">20.307</span></a><a id="__RefHeading__1420062_253892949"/><a id="property-style_line-break"/>style:line-break</h2><p class="Text_20_body">The <span class="Attribute">style:line-break</span> attribute specifies line breaking rules. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:line-break</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">normal</span>: line breaks may occur between any characters.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">strict</span>: line breaks shall not occur before or after implementation-defined characters. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:line-break</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:line-break</span> attribute are <span class="Attribute_20_Value">normal</span> or <span class="Attribute_20_Value">strict</span>.</p><h2 class="Heading_20_2"><a id="a20_308style_letter-kerning"><span style="margin-right:0.127cm;">20.308</span></a><a id="__RefHeading__1420064_253892949"/><a id="property-style_letter-kerning"/>style:letter-kerning</h2><p class="Text_20_body">The <span class="Attribute">style:letter-kerning</span> attribute specifies whether kerning between characters is enabled or disabled.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:letter-kerning</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: kerning between letters should be disabled.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: kerning between letters should be enabled.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:letter-kerning</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:letter-kerning</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_309style_line-height-at-least"><span style="margin-right:0.127cm;">20.309</span></a><a id="__RefHeading__1420066_253892949"/><a id="property-style_line-height-at-least"/>style:line-height-at-least</h2><p class="Text_20_body">The <span class="Attribute">style:line-height-at-least</span> attribute specifies a minimum line height. The value of this attribute is a length.</p><p class="Text_20_body">The effect of this attribute is disabled when <span class="Attribute">fo:line-height</span> has the value of <span class="Attribute_20_Value">normal</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:line-height-at-least</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:line-height-at-least</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_310style_line-spacing"><span style="margin-right:0.127cm;">20.310</span></a><a id="__RefHeading__1420068_253892949"/><a id="property-style_line-spacing"/>style:line-spacing</h2><p class="Text_20_body">The <span class="Attribute">style:line-spacing</span> attribute specifies a fixed distance between two lines.</p><p class="Text_20_body">The effect of this attribute is disabled when <span class="Attribute">fo:line-height</span> has the value of <span class="Attribute_20_Value">normal</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:line-spacing</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:line-spacing</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_311style_may-break-between-rows"><span style="margin-right:0.127cm;">20.311</span></a><a id="__RefHeading__1420070_253892949"/><a id="property-style_may-break-between-rows"/>style:may-break-between-rows</h2><p class="Text_20_body">The <span class="Attribute">style:may-break-between-rows</span> attribute specifies that a page break may occur inside a table.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:may-break-between-rows</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: page break shall not occur inside a table.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: page break may occur inside a table.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:may-break-between-rows</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:may-break-between-rows</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_312style_min-row-height"><span style="margin-right:0.127cm;">20.312</span></a><a id="__RefHeading__1420072_253892949"/><a id="property-style_min-row-height"/>style:min-row-height</h2><p class="Text_20_body">The <span class="Attribute">style:min-row-height</span> attribute specifies a fixed minimum height for a row.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:min-row-height</span> attribute is usable with the following element: <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:min-row-height</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_313style_mirror"><span style="margin-right:0.127cm;">20.313</span></a><a id="__RefHeading__1420074_253892949"/><a id="property-style_mirror"/>style:mirror</h2><p class="Text_20_body">The <span class="Attribute">style:mirror</span> attribute specifies whether an image is mirrored before it is displayed. The mirroring can be vertical or horizontal or both.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:mirror</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: image should not be mirrored before being displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">h</span><span class="Attribute_20_Value">orizontal</span>: image should be mirrored horizontally before being displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">h</span><span class="Attribute_20_Value">orizontal-on-even</span>: image should be mirrored horizontally on even numbered pages before being displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">h</span><span class="Attribute_20_Value">orizontal-on-odd</span>: image should be mirrored horizontally on odd numbered pages before being displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: image should be mirrored vertically before being displayed. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value <span class="Attribute_20_Value">vertical</span> and the horizontal values can be specified together, separated by a white space.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:mirror</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:mirror</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">vertical</span>, or two white space separated values, that may appear in any order. One of these values is always <span class="Attribute_20_Value">vertical</span>. The other value is one of: <span class="Attribute_20_Value">horizontal</span>, <span class="Attribute_20_Value">horizontal-on-odd</span> or <span class="Attribute_20_Value">horizontal-on-even</span>.</p><h2 class="Heading_20_2"><a id="a20_314style_num-format"><span style="margin-right:0.127cm;">20.314</span></a><a id="__RefHeading__1420076_253892949"/><a id="property-style_num-format"/>style:num-format</h2><p class="Text_20_body">The <span class="Attribute">style:num-format</span> attribute specifies a numbering sequence. </p><p class="Text_20_body">If no value is given, no number sequence is displayed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:num-format</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">1</span>: number sequence starts with “1”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">a</span>: number sequence starts with “a”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">A</span>: number sequence starts with “A”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>empty string: no number sequence displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">i</span>: number sequence starts with “i”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">I</span>: number sequence start with “I”.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-format</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:num-format</span> attribute are <span class="Attribute_20_Value">1</span>, <span class="Attribute_20_Value">i</span>, <span class="Attribute_20_Value">I</span>, a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>, an empty string, <span class="Attribute_20_Value">a</span> or <span class="Attribute_20_Value">A</span>.</p><h2 class="Heading_20_2"><a id="a20_315style_num-letter-sync"><span style="margin-right:0.127cm;">20.315</span></a><a id="__RefHeading__1420078_253892949"/><a id="property-style_num-letter-sync"/>style:num-letter-sync</h2><p class="Text_20_body">The <span class="Attribute">style:num-letter-sync</span> attribute specifies whether letter synchronization shall take place. If letters are used in alphabetical order for numbering, there are two ways to process overflows within a digit, as follows:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: A new digit is inserted that always has the same value as the following digit. The numbering sequence (for lower case numberings) in that case is a, b, c, ..., z, aa, bb, cc, ..., zz, aaa, ..., and so on.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: A new digit is inserted. Its start value is ”a” or ”A”, and it is incremented every time an overflow occurs in the following digit. The numbering sequence (for lower case numberings) in that case is a,b,c, ..., z, aa, ab, ac, ...,az, ba, ..., and so on. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-letter-sync</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:num-letter-sync</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_316style_num-prefix"><span style="margin-right:0.127cm;">20.316</span></a><a id="__RefHeading__1420080_253892949"/><a id="property-style_num-prefix"/>style:num-prefix</h2><p class="Text_20_body">The <span class="Attribute">style:num-prefix</span> attribute specifies what to display before a number.</p><p class="Text_20_body">If the <span class="Attribute">style:num-prefix</span> and <span class="Attribute">style:num-suffix</span> values do not contain any character that has a Unicode category of Nd, Nl, No, Lu, Ll, Lt, Lm or Lo, an <a title="XSL Transformations (XSLT) Version 1.0" href="http://www.w3.org/TR/1999/REC-xslt-19991116">[XSLT]</a> <span class="Alien_20_Attribute">format</span> attribute can be created from the OpenDocument attributes by concatenating the values of the <span class="Attribute">style:num-prefix</span>, <span class="Attribute">style:num-format</span>, and <span class="Attribute">style:num-suffix</span> attributes.</p><p class="Text_20_body">The <span class="Attribute">style:num-prefix</span> attribute can also specify a character before the value of a <span class="Attribute">text:bullet-char</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-prefix</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:num-prefix</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_317style_num-suffix"><span style="margin-right:0.127cm;">20.317</span></a><a id="__RefHeading__1420082_253892949"/><a id="property-style_num-suffix"/>style:num-suffix</h2><p class="Text_20_body">The <span class="Attribute">style:num-prefix</span> and <span class="Attribute">style:num-suffix</span> attributes specify what to display before and after a number.</p><p class="Text_20_body">If the <span class="Attribute">style:num-prefix</span> and <span class="Attribute">style:num-suffix</span> values do not contain any character that has a Unicode category of Nd, Nl, No, Lu, Ll, Lt, Lm or Lo, an <a title="XSL Transformations (XSLT) Version 1.0" href="http://www.w3.org/TR/1999/REC-xslt-19991116">[XSLT]</a> <span class="Alien_20_Attribute">format</span> attribute can be created from the OpenDocument attributes by concatenating the values of the <span class="Attribute">style:num-prefix</span>, <span class="Attribute">style:num-format</span>, and <span class="Attribute">style:num-suffix</span> attributes.</p><p class="Text_20_body">The <span class="Attribute">style:num-suffix</span> attribute can also specify a character after the value of a <span class="Attribute">text:bullet-char</span> attribute. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:num-suffix</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:num-suffix</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_318style_number-wrapped-paragraphs"><span style="margin-right:0.127cm;">20.318</span></a><a id="__RefHeading__1420084_253892949"/><a id="property-style_number-wrapped-paragraphs"/>style:number-wrapped-paragraphs</h2><p class="Text_20_body">The <span class="Attribute">style:number-wrapped-paragraphs</span> attribute specifies the number of paragraphs that can wrap around a frame if the anchor position of a frame or drawing shape is a paragraph or a character, and the wrap mode specified by the <span class="Attribute">style:wrap</span> attribute is <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">parallel</span>, or <span class="Attribute_20_Value">dynamic</span>.</p><p class="Text_20_body">This attribute is only recognized in frames or styles that have a <span class="Attribute">style:wrap</span> attribute attached with a value of <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">parallel</span>, or <span class="Attribute_20_Value">dynamic</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:number-wrapped-paragraphs</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no</span><span class="Attribute_20_Value">-limit</span>: there is no limit on the number of paragraphs that may wrap around a frame.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:number-wrapped-paragraphs</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:number-wrapped-paragraphs</span> attribute are <span class="Attribute_20_Value">no-limit</span> or a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_319style_overflow-behavior"><span style="margin-right:0.127cm;">20.319</span></a><a id="__RefHeading__1420086_253892949"/><a id="property-style_overflow-behavior"/>style:overflow-behavior</h2><p class="Text_20_body">The <span class="Attribute">style:overflow-behavior</span> attribute specifies the behavior of text boxes where the containing text does not fit into a text box. </p><p class="Text_20_body">If the <span class="Attribute">style:overflow-behavior</span> attribute value is <span class="Attribute_20_Value">auto-create-new-frame</span> and the text box has a minimum width or height specified the text box will grow as long as there is space left on the page. If no space is left, a new frame will be created on the next page, with the same position and dimensions of the original frame.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:overflow-behavior</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">clip</span>: text that does not fit into a text box is not displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">au</span><span class="Attribute_20_Value">to-create-new-frame</span>: a new frame will be created on the next page, with the same position and dimensions of the original frame.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:overflow-behavior</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:overflow-behavior</span> attribute are <span class="Attribute_20_Value">clip</span> or <span class="Attribute_20_Value">auto-create-new-frame</span>.</p><h2 class="Heading_20_2"><a id="a20_320style_page-number"><span style="margin-right:0.127cm;">20.320</span></a><a id="__RefHeading__1420088_253892949"/><a id="property-style_page-number"/>style:page-number</h2><p class="Text_20_body">The <span class="Attribute">style:page-number</span> attribute specifies the page number that should be used for a new page when either a paragraph or table style specifies a master page that should be applied beginning from the start of a paragraph or table.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:page-number</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: a page has the page number of the previous page, incremented by one.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>: specifies a page number. <span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:page-number</span> attribute is usable with the following elements: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:page-number</span> attribute are a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a> or <span class="Attribute_20_Value">auto</span>.</p><h2 class="Heading_20_2"><a id="a20_321style_paper-tray-name"><span style="margin-right:0.127cm;">20.321</span></a><a id="__RefHeading__1420090_253892949"/><a id="property-style_paper-tray-name"/>style:paper-tray-name</h2><p class="Text_20_body">The <span class="Attribute">style:paper-tray-name</span> attribute specifies the paper tray to use when printing a document. The names assigned to the paper trays depends upon the printer. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:paper-tray-name</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">default</span>: the default tray specified by printer configuration settings.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type string <a href="#datatype-string">18.2</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:paper-tray-name</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:paper-tray-name</span> attribute are <span class="Attribute_20_Value">default</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_322style_print"><span style="margin-right:0.127cm;">20.322</span></a><a id="__RefHeading__1420092_253892949"/><a id="property-style_print"/>style:print</h2><p class="Text_20_body">The <span class="Attribute">style:print</span> attribute specifies the components in a spreadsheet document to print.</p><p class="Text_20_body">The value of the <span class="Attribute">style:print</span> attribute is a white space separated list of one or more of these values: <span class="Attribute_20_Value">headers</span>, <span class="Attribute_20_Value">grid</span>, <span class="Attribute_20_Value">annotations</span>, <span class="Attribute_20_Value">objects</span>, <span class="Attribute_20_Value">charts</span>, <span class="Attribute_20_Value">drawings</span>, <span class="Attribute_20_Value">formulas</span>, <span class="Attribute_20_Value">zero-values</span>, or the empty list. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:print</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">annotations</span>: annotations should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">charts</span>: charts should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">drawings</span>: drawings should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">formulas</span>: formulas should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">headers</span>: headers should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">grid</span>: grid lines should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">objects</span>: (including graphics): objects should be printed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">zero-values</span>: zero-values should be printed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:print</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The value of the <span class="Attribute">style:print</span> attribute is a white space separated lists of one of these values: <span class="Attribute_20_Value">headers</span>, <span class="Attribute_20_Value">grid</span>, <span class="Attribute_20_Value">annotations</span>, <span class="Attribute_20_Value">objects</span>, <span class="Attribute_20_Value">charts</span>, <span class="Attribute_20_Value">drawings</span>, <span class="Attribute_20_Value">formulas</span>, or <span class="Attribute_20_Value">zero-values</span>, including the empty list.</p><h2 class="Heading_20_2"><a id="a20_323style_print-content"><span style="margin-right:0.127cm;">20.323</span></a><a id="__RefHeading__1420094_253892949"/><a id="property-style_print-content"/>style:print-content</h2><h3 class="Heading_20_3"><a id="a20_323_1General"><span style="margin-right:0.127cm;">20.323.1</span></a><a id="__RefHeading__1420096_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:print-content</span> attribute specifies if content is printed.</p><h3 class="Heading_20_3"><a id="a20_323_2_style_graphic-properties_"><span style="margin-right:0.127cm;">20.323.2</span></a><a id="__RefHeading__1420098_253892949"/><a id="property-style_print-content_element-style_graphic-properties"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:print-content</span> attribute specifies if frame content is printed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:print-content</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:print-content</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h3 class="Heading_20_3"><a id="a20_323_3_style_table-cell-properties_"><span style="margin-right:0.127cm;">20.323.3</span></a><a id="__RefHeading__1420100_253892949"/><a id="property-style_print-content_element-style_table-cell-properties"/>&lt;style:table-cell-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:print-content</span> attribute specifies if cell content is printed.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:print-content</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:print-content</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_324style_print-page-order"><span style="margin-right:0.127cm;">20.324</span></a><a id="__RefHeading__1420102_253892949"/><a id="property-style_print-page-order"/>style:print-page-order</h2><p class="Text_20_body">The <span class="Attribute">style:print-page-order</span> attribute specifies the order in which data in a spreadsheet is numbered and printed when the data does not fit on one printed page.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:print-page-order</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ltr</span>: create pages from the first column to the last column before continuing with the next set of rows. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ttb</span>: create pages from the top row to the bottom row before continuing with the next set of columns.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:print-page-order</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:print-page-order</span> attribute are <span class="Attribute_20_Value">ttb</span> or <span class="Attribute_20_Value">ltr</span>.</p><h2 class="Heading_20_2"><a id="a20_325style_print-orientation"><span style="margin-right:0.127cm;">20.325</span></a><a id="__RefHeading__1420104_253892949"/><a id="property-style_print-orientation"/>style:print-orientation</h2><p class="Text_20_body">The <span class="Attribute">style:print-orientation</span> attribute specifies the orientation of the printed page. The value of this attribute can be <span class="Attribute_20_Value">portrait</span> or <span class="Attribute_20_Value">landscape</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:print-orientation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">landscape</span>: a page is printed in landscape orientation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">ortrait</span>: a page is printed in portrait orientation.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:print-orientation</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:print-orientation</span> attribute are <span class="Attribute_20_Value">portrait</span> or <span class="Attribute_20_Value">landscape</span>.</p><h2 class="Heading_20_2"><a id="a20_326style_protect"><span style="margin-right:0.127cm;">20.326</span></a><a id="__RefHeading__1420106_253892949"/><a id="property-style_protect"/>style:protect</h2><h3 class="Heading_20_3"><a id="a20_326_1General"><span style="margin-right:0.127cm;">20.326.1</span></a><a id="__RefHeading__1420108_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:protect</span> attribute specifies the protection of content.</p><h3 class="Heading_20_3"><a id="a20_326_2_style_graphic-properties_"><span style="margin-right:0.127cm;">20.326.2</span></a><a id="__RefHeading__1420110_253892949"/><a id="property-style_protect_element-style_graphic-properties"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:protect</span> attribute specifies whether the content, size, or position of a frame is protected. The value of this attribute can be either <span class="Attribute_20_Value">none</span> or a white space separated list that consists of any of the values <span class="Attribute_20_Value">content</span>, <span class="Attribute_20_Value">position</span>, or <span class="Attribute_20_Value">size</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:protect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">content</span>: content of a frame should be protected from editing.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: the content, size and position of a frame should be subject to editing.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">osition</span>: the position of a frame should be protected from editing.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">ize</span>: the size of a frame should be protected from editing.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:protect</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:protect</span> attribute are <span class="Attribute_20_Value">none</span>, or white space separated non-empty lists of one of these values: <span class="Attribute_20_Value">content</span>, <span class="Attribute_20_Value">position</span>, or <span class="Attribute_20_Value">size</span>..</p><h3 class="Heading_20_3"><a id="a20_326_3_style_section-properties_"><span style="margin-right:0.127cm;">20.326.3</span></a><a id="__RefHeading__1420112_253892949"/><a id="property-style_protect_element-style_section-properties"/>&lt;style:section-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:protect</span> attribute specifies that sections should not be changed. The user interface should prevent the user from manually making any changes. The <span class="Attribute">style:protect</span> attribute should be set to <span class="Attribute_20_Value">true</span> by default for linked sections or indexes. Removing the protection from linked sections or indexes leaves them unprotected from editing, but any edits will be over-written by updates to those sections.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:protect</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: sections should not be protected from editing.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: sections should be protected from editing.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:protect</span> attribute is usable with the following element: <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:protect</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_327style_punctuation-wrap"><span style="margin-right:0.127cm;">20.327</span></a><a id="__RefHeading__1420114_253892949"/><a id="property-style_punctuation-wrap"/>style:punctuation-wrap</h2><p class="Text_20_body">The <span class="Attribute">style:punctuation-wrap</span> attribute specifies whether a punctuation mark, if one is present, can be hanging, that is, whether it can placed in the margin area at the end of a full line of text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:punctuation-wrap</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">hanging</span>: a punctuation mark can be placed in the margin area at the end of a full line of text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">imple</span>: a punctuation mark can not be placed in the margin area at the end of a full line of text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:punctuation-wrap</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:punctuation-wrap</span> attribute are <span class="Attribute_20_Value">simple</span> or <span class="Attribute_20_Value">hanging</span>.</p><h2 class="Heading_20_2"><a id="a20_328style_register-true"><span style="margin-right:0.127cm;">20.328</span></a><a id="__RefHeading__1420116_253892949"/><a id="property-style_register-true"/>style:register-true</h2><p class="Text_20_body">The <span class="Attribute">style:register-true</span> attribute specifies whether the lines on both sides of a printed page align. The text baselines of text in page columns or text box columns also align.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:register-true</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: lines on both sides of a printed text need not align.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: lines on both sides of a printed text should align.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:register-true</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:register-true</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_329style_register-truth-ref-style-name"><span style="margin-right:0.127cm;">20.329</span></a><a id="__RefHeading__1420118_253892949"/><a id="property-style_register-truth-ref-style-name"/>style:register-truth-ref-style-name</h2><p class="Text_20_body">The <span class="Attribute">style:register-truth-ref-style-name</span> attribute specifies a paragraph style. The line distance specified of the paragraph style is used as the reference line distance for all paragraphs that have the register-truth feature enabled.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:register-truth-ref-style-name</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:register-truth-ref-style-name</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_330style_rel-column-width"><span style="margin-right:0.127cm;">20.330</span></a><a id="__RefHeading__1420120_253892949"/><a id="property-style_rel-column-width"/>style:rel-column-width</h2><p class="Text_20_body">The <span class="Attribute">style:rel-column-width</span> attribute specifies a relative width of a column with a number value, followed by a ”*” (U+002A, ASTERISK) character. If <span class="Formula">r</span><span class="Furmula_20_Sub">c</span> is the relative with of the column, <span class="Emphasis">r</span><span class="Furmula_20_Sub">s</span> the sum of all relative columns widths, and <span class="Formula">w</span><span class="Furmula_20_Sub">s</span> the absolute width that is available for these columns the absolute width <span class="Formula">w</span><span class="Furmula_20_Sub">c</span> of the column is <span class="Formula">w</span><span class="Furmula_20_Sub">c</span><span class="Formula">=r</span><span class="Furmula_20_Sub">c</span><span class="Formula">w</span><span class="Furmula_20_Sub">s</span><span class="Formula">/r</span><span class="Furmula_20_Sub">s</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-column-width</span> attribute is usable with the following element: <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rel-column-width</span> attribute has the data type <span class="Datatype">relativeLength</span> <a href="#datatype-relativeLength">18.3.27</a>.</p><h2 class="Heading_20_2"><a id="a20_331style_rel-height"><span style="margin-right:0.127cm;">20.331</span></a><a id="__RefHeading__1420122_253892949"/><a id="property-style_rel-height"/>style:rel-height</h2><p class="Text_20_body">The <span class="Attribute">style:rel-height</span> attribute specifies the height of a drawing object as a relative value within a frame. The relative value either is a percentage value, the value <span class="Attribute_20_Value">scale</span>, or the value <span class="Attribute_20_Value">scale-min</span>. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:rel-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale</span>: the height should be calculated depending on the width, so that the ratio of width and height of the original image or object size is preserved.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale-min</span>:the height should be calculated as for value <span class="Attribute_20_Value">scale</span>, but the calculated height is a minimum height rather than an absolute one.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The interpretation of relative values depends on the anchor of the drawing object. If the anchor for the drawing object is in a table cell, the percentage value is relative to the surrounding table box. If the anchor for the drawing object is in a text box, the percentage value is relative to the surrounding text box. In other cases, the percentage values is relative to the width of the page or window.</p><p class="Text_20_body">To support consumers that do not support relative width and heights, producers should also provide the height in <span class="Attribute">svg:height</span> and <span class="Attribute">fo:min-height</span> attributes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-height</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:rel-height</span> attribute are a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>, <span class="Attribute_20_Value">scale</span> or <span class="Attribute_20_Value">scale-min</span>.</p><h2 class="Heading_20_2"><a id="a20_332style_rel-width"><span style="margin-right:0.127cm;">20.332</span></a><a id="__RefHeading__1420124_253892949"/><a id="property-style_rel-width"/>style:rel-width</h2><h3 class="Heading_20_3"><a id="a20_332_1_style_graphic-properties_"><span style="margin-right:0.127cm;">20.332.1</span></a><a id="__RefHeading__1420126_253892949"/><a id="property-style_rel-width_element-style_graphic-properties"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:rel-width</span> attribute specifies the relative width of a drawing object. The relative value either is a percentage value, the value <span class="Attribute_20_Value">scale</span>, or the value <span class="Attribute_20_Value">scale-min</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:rel-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale</span>: the width should be calculated depending on the height, so that the ratio of width and height of the original image or object size is preserved.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scale-min</span>: the width should be calculated as for value <span class="Attribute_20_Value">scale</span>, but the calculated width is a minimum width rather than an absolute one.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The interpretation of the percent value depends on the anchor of the drawing object. If the anchor for the drawing object is in a table cell, the percent value of the surrounding table box. If the anchor for the drawing object is in a text box, the percentage value of the surrounding text box. In all other cases, the percent value of the containing page or window</p><p class="Text_20_body">To support consumers that do not support relative width, producers should also provide the width in a <span class="Attribute">svg:width</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:rel-width</span> attribute are a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>, <span class="Attribute_20_Value">scale</span> or <span class="Attribute_20_Value">scale-min</span>.</p><h3 class="Heading_20_3"><a id="a20_332_2_style_table-properties_"><span style="margin-right:0.127cm;">20.332.2</span></a><a id="__RefHeading__1420128_253892949"/><a id="DDE_LINK19"/><a id="property-style_rel-width_element-style_table-properties"/>&lt;style:table-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:rel-width</span> attribute specifies the width of a table relative to the width of the area that the table is in.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rel-width</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rel-width</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_333style_repeat"><span style="margin-right:0.127cm;">20.333</span></a><a id="__RefHeading__1420130_253892949"/><a id="property-style_repeat"/>style:repeat</h2><p class="Text_20_body">The <span class="Attribute">style:repeat</span> attribute specifies if an image can be repeated or stretched over an area. The value of the attribute can be <span class="Attribute_20_Value">no-repeat</span>, <span class="Attribute_20_Value">repeat</span>, or <span class="Attribute_20_Value">stretch</span>.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:repeat</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">no-repeat</span>: image should not be repeated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">epeat</span>: image should be repeated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">stretch</span>: image should be stretched over an area.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:repeat</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:repeat</span> attribute are <span class="Attribute_20_Value">no-repeat</span>, <span class="Attribute_20_Value">repeat</span> or <span class="Attribute_20_Value">stretch</span>.</p><h2 class="Heading_20_2"><a id="a20_334style_repeat-content"><span style="margin-right:0.127cm;">20.334</span></a><a id="__RefHeading__1420132_253892949"/><a id="property-style_repeat-content"/>style:repeat-content</h2><p class="Text_20_body">The <span class="Attribute">style:repeat-content</span> attribute specifies whether text content of a cell is displayed as many times as there is space left in the cell's writing direction. The attribute has no effect for cell content that contains a line break.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:repeat-content</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text content of a cell should not be displayed as many times as there is space left in the cell's writing direction.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text content of a cell should be displayed as many times as there is space left in the cell's writing direction.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:repeat-content</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:repeat-content</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_335style_rfc-language-tag"><span style="margin-right:0.127cm;">20.335</span></a><a id="__RefHeading__1420134_253892949"/><a id="property-style_rfc-language-tag"/>style:rfc-language-tag</h2><p class="Text_20_body">The <span class="Attribute">style:rfc-language-tag</span> attribute specifies a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">It shall only be used if its value can not be expressed as a valid combination of the <span class="Attribute">fo:language</span>, <span class="Attribute">fo:script</span> and <span class="Attribute">fo:country</span> attributes.</p><p class="Text_20_body">Producers may add support for consumers that don't support the <span class="Attribute">style:rfc-language-tag</span> attribute by specifying <span class="Attribute">fo:language</span>, <span class="Attribute">fo:script</span> and <span class="Attribute">fo:country</span> attributes with values that are implementation-dependent. </p><p class="Text_20_body">The attribute is evaluated for any <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters that are not of type asian or complex. <a href="#property-style_script-type">20.348</a></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rfc-language-tag</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rfc-language-tag</span> attribute has the data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h2 class="Heading_20_2"><a id="a20_336style_rfc-language-tag-asian"><span style="margin-right:0.127cm;">20.336</span></a><a id="__RefHeading__1420136_253892949"/><a id="property-style_rfc-language-tag-asian"/>style:rfc-language-tag-asian</h2><p class="Text_20_body">The <span class="Attribute">style:rfc-language-tag-asian</span> attribute specifies a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">It shall only be used if its value can not be expressed as a valid combination of the <span class="Attribute">style:language-asian</span>, <span class="Attribute">style:script-asian</span> and <span class="Attribute">style:country-asian</span> attributes.</p><p class="Text_20_body">Producers may add support for consumers that don't support the <span class="Attribute">style:rfc-language-tag-asian</span> attribute by specifying <span class="Attribute">style:language-asian</span>, <span class="Attribute">style:script-asian</span> and <span class="Attribute">style:country-asian</span> attributes with values that are implementation-dependent. </p><p class="Text_20_body"><a id="DDE_LINK121"/>This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters that are of type asian. <a href="#property-style_script-type">20.348</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rfc-language-tag-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rfc-language-tag-asian</span> attribute has the data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h2 class="Heading_20_2"><a id="a20_337style_rfc-language-tag-complex"><span style="margin-right:0.127cm;">20.337</span></a><a id="__RefHeading__1420138_253892949"/><a id="property-style_rfc-language-tag-complex"/>style:rfc-language-tag-complex</h2><p class="Text_20_body">The <span class="Attribute">style:rfc-language-tag-complex</span> attribute specifies a language identifier according to the rules of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">It shall only be used if its value can not be expressed as a valid combination of the <span class="Attribute">style:language-complex</span>, <span class="Attribute">style:script-complex</span> and <span class="Attribute">style:country-complex</span> attributes.</p><p class="Text_20_body">Producers may add support for consumers that don't support the <span class="Attribute">style:rfc-language-tag-complex</span> attribute by specifying <span class="Attribute">style:language-complex</span>, <span class="Attribute">style:script-complex</span> and <span class="Attribute">style:country-complex</span> attributes with values that are implementation-dependent. </p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters that are of type complex..</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rfc-language-tag-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rfc-language-tag-complex</span> attribute has the data type <span class="Datatype">language</span> <a href="#datatype-language">18.3.16</a>.</p><h2 class="Heading_20_2"><a id="a20_338style_rotation-align"><span style="margin-right:0.127cm;">20.338</span></a><a id="__RefHeading__1420140_253892949"/><a id="property-style_rotation-align"/>style:rotation-align</h2><p class="Text_20_body">The <span class="Attribute">style:rotation-align</span> attribute specifies how the edge of the text in a cell is aligned after a rotation. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:rotation-align</span> attribute are shown in Table <a href="#refTable20">21</a>:</p><p class="Table">Table <a id="refTable20"/>21 - Rotation align values</p><table border="0" cellspacing="0" cellpadding="0" class="Table11"><colgroup><col width="153"/><col width="224"/><col width="289"/></colgroup><tr><td style="text-align:left;width:1.3785in; " class="Table11_A1"><p class="Table_20_Heading">Alignment</p></td><td style="text-align:left;width:2.0201in; " class="Table11_A1"><p class="Table_20_Heading">Text is...</p></td><td style="text-align:left;width:2.6014in; " class="Table11_C1"><p class="Table_20_Heading">Borders and background are...</p></td></tr><tr><td style="text-align:left;width:1.3785in; " class="Table11_A2"><p class="Table_20_Contents">None.</p></td><td style="text-align:left;width:2.0201in; " class="Table11_A2"><p class="Table_20_Contents">Rotated and aligned within the cell. </p></td><td style="text-align:left;width:2.6014in; " class="Table11_C2"><p class="Table_20_Contents">Unchanged.</p></td></tr><tr><td style="text-align:left;"><table border="0" cellspacing="0" cellpadding="0"><colgroup><col width="153"/></colgroup><tr><td style="text-align:left;width:1.3785in; " class="Table11_A2"><p class="Table_20_Contents">Bottom</p></td></tr><tr><td style="text-align:left;width:1.3785in; " class="Table11_A2"><p class="Table_20_Contents">Center</p></td></tr><tr><td style="text-align:left;width:1.3785in; " class="Table11_A2"><p class="Table_20_Contents">Top</p></td></tr></table></td><td style="text-align:left;width:2.0201in; " class="Table11_A2"><p class="Table_20_Contents">Rotated and may overlap with other cells if the text is longer than the length of the cell.</p></td><td style="text-align:left;width:2.6014in; " class="Table11_C2"><p class="Table_20_Contents">Positioned parallel to the text, whereby the edge that is named by the attribute value aligns with the corresponding edge of the cell's original position. </p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rotation-align</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:rotation-align</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">bottom</span>, <span class="Attribute_20_Value">top</span> or <span class="Attribute_20_Value">center</span>.</p><h2 class="Heading_20_2"><a id="a20_339style_rotation-angle"><span style="margin-right:0.127cm;">20.339</span></a><a id="__RefHeading__1420142_253892949"/><a id="property-style_rotation-angle"/>style:rotation-angle</h2><p class="Text_20_body">The <span class="Attribute">style:rotation-angle</span> attribute specifies the rotation angle of content. The attribute value is an angle. </p><p class="Text_20_body">If used with a chart style applied to a <span class="Element">&lt;chart:axis&gt;</span> element the attribute specifies the rotation of the axis labels, each tick label is rotated, the axis title is not affected in this case.</p><p class="Text_20_body">If used with a chart style applied to a <span class="Element">&lt;chart:data-label&gt;</span>, <span class="Element">&lt;chart:data-point&gt;</span>, <span class="Element">&lt;chart:series&gt;</span> or <span class="Element">&lt;chart:plot-area&gt;</span> element the attribute specifies the rotation angle of the according data labels.</p><p class="Text_20_body">If used with a chart style applied to a <span class="Element">&lt;chart:title&gt;</span> element the attribute specifies the rotation angle of the title.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:rotation-angle</span> attribute is usable with the following elements: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:rotation-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a20_340style_row-height"><span style="margin-right:0.127cm;">20.340</span></a><a id="__RefHeading__1420144_253892949"/><a id="property-style_row-height"/>style:row-height</h2><p class="Text_20_body">The <span class="Attribute">style:row-height</span> attribute specifies a fixed row height.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:row-height</span> attribute is usable with the following element: <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:row-height</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_341style_ruby-align"><span style="margin-right:0.127cm;">20.341</span></a><a id="__RefHeading__1420146_253892949"/><a id="property-style_ruby-align"/>style:ruby-align</h2><p class="Text_20_body">The <span class="Attribute">style:ruby-align</span> attribute specifies the horizontal alignment of the ruby text in relationship to the ruby base.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:ruby-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: ruby text centered on ruby base text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">d</span><span class="Attribute_20_Value">istribute-letter</span>: If the width of the ruby text is smaller than that of the ruby base text, then the ruby text contents are evenly distributed across the width of the ruby base text, with the first and last ruby text glyphs lining up with the corresponding first and last base glyphs. If the width of the ruby text is at least the width of the ruby base text, then the letters of the ruby base text are evenly distributed across the width of the ruby text. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">distribute-space</span>: If the width of the ruby text is smaller than that of the ruby base text, then the ruby text contents are evenly distributed across the width of the ruby base text, with a  amount of white space preceding the first and following the last character in the ruby text. That amount of white space is normally equal to half the amount of inter-character space of the ruby text. If the width of the ruby text is at least the width of the ruby base text, then the same type of space distribution applies to the ruby base text. If the base is shorter than the ruby text, the base is <span class="Attribute_20_Value">distribute-space</span> aligned. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: ruby text to the left of ruby base text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: ruby text to the right of ruby base text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:ruby-align</span> attribute is usable with the following element: <span class="Element">&lt;style:ruby-properties&gt;</span> <a href="#element-style_ruby-properties">17.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:ruby-align</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">distribute-letter</span> or <span class="Attribute_20_Value">distribute-space</span>.</p><h2 class="Heading_20_2"><a id="a20_342style_ruby-position"><span style="margin-right:0.127cm;">20.342</span></a><a id="__RefHeading__1420148_253892949"/><a id="property-style_ruby-position"/>style:ruby-position</h2><p class="Text_20_body">The <span class="Attribute">style:ruby-position</span> attribute specifies the vertical position of the ruby text in relationship to the ruby base.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:ruby-position</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">above</span>: ruby text should be above ruby base text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">elow</span>: ruby text should be below ruby base text.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:ruby-position</span> attribute is usable with the following element: <span class="Element">&lt;style:ruby-properties&gt;</span> <a href="#element-style_ruby-properties">17.10</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:ruby-position</span> attribute are <span class="Attribute_20_Value">above</span> or <span class="Attribute_20_Value">below</span>.</p><h2 class="Heading_20_2"><a id="a20_343style_run-through"><span style="margin-right:0.127cm;">20.343</span></a><a id="__RefHeading__1420150_253892949"/><a id="property-style_run-through"/>style:run-through</h2><p class="Text_20_body">The <span class="Attribute">style:run-through</span> attribute specifies whether content of a frame is displayed in the background or foreground. </p><p class="Text_20_body">The value of this attribute can be <span class="Attribute_20_Value">foreground</span> or <span class="Attribute_20_Value">background</span>. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:run-through</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">background</span>: frame content is displayed behind a text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">foreground</span>: frame content is displayed in front of a text.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Use of this attribute depends upon the presence of a <span class="Attribute">style:wrap</span> attribute with the value <span class="Attribute_20_Value">run-through</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:run-through</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:run-through</span> attribute are <span class="Attribute_20_Value">foreground</span> or <span class="Attribute_20_Value">background</span>.</p><h2 class="Heading_20_2"><a id="a20_344style_scale-to"><span style="margin-right:0.127cm;">20.344</span></a><a id="__RefHeading__1420152_253892949"/><a id="property-style_scale-to"/>style:scale-to</h2><p class="Text_20_body">The <span class="Attribute">style:scale-to</span> attribute specifies that a document is to be scaled to a percentage value. A value of 100% means no scaling. </p><p class="Text_20_body">If this attribute and <span class="Attribute">style:scale-to-pages</span> are absent, a document is not scaled.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:scale-to</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:scale-to</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_345style_scale-to-pages"><span style="margin-right:0.127cm;">20.345</span></a><a id="__RefHeading__1420154_253892949"/><a id="property-style_scale-to-pages"/>style:scale-to-pages</h2><p class="Text_20_body">The <span class="Attribute">style:scale-to-pages</span> attribute specifies the number of pages on which a document should be printed. The document is scaled to fit a specified number of pages.</p><p class="Text_20_body">If this attribute and <span class="Attribute">style:scale-to</span> are absent, a document is not scaled.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:scale-to-pages</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:scale-to-pages</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_346style_script-asian"><span style="margin-right:0.127cm;">20.346</span></a><a id="__RefHeading__1420156_253892949"/><a id="property-style_script-asian"/>style:script-asian</h2><p class="Text_20_body">The <span class="Attribute">style:script-asian</span> attribute specifies the script code of a text. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body"><a id="DDE_LINK12"/>This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">It may be ignored if is not specified together with a <span class="Attribute">style:language-asian</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:script-asian</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:script-asian</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h2 class="Heading_20_2"><a id="a20_347style_script-complex"><span style="margin-right:0.127cm;">20.347</span></a><a id="__RefHeading__1420158_253892949"/><a id="property-style_script-complex"/>style:script-complex</h2><p class="Text_20_body">The <span class="Attribute">style:script-complex</span> attribute specifies the script code of a text. The attribute should be used only if necessary according to the rules of §2.2.3 of <a title="Tags for Identifying Languages" href="http://www.ietf.org/rfc/rfc5646.txt">[RFC5646]</a>, or its successors.</p><p class="Text_20_body">This attribute is evaluated for <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">complex</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">It may be ignored if is not specified together with a <span class="Attribute">style:language-complex</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:script-complex</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:script-complex</span> attribute has the data type <span class="Datatype">scriptCode</span> <a href="#datatype-scriptCode">18.3.29</a>.</p><h2 class="Heading_20_2"><a id="a20_348style_script-type"><span style="margin-right:0.127cm;">20.348</span></a><a id="__RefHeading__1420160_253892949"/><a id="property-style_script-type"/>style:script-type</h2><p class="Text_20_body">The <span class="Attribute">style:script-type</span> attribute specifies which script type dependent attributes ( <span class="Attribute">fo:font-family</span>, <span class="Attribute">style:font-family-asian</span>, <span class="Attribute">style:font-family-complex</span>) are currently active for a portion of text. The attribute may be evaluated by consumers that cannot determine the script types of Unicode characters to select the correct script type dependent formatting properties. Consumers that can determine script types of Unicode characters may also evaluate the attribute and overwrite the script type they determine for certain character with the value of the attribute. </p><p class="Note"><span class="Note_20_Label">Note:</span> The usage of this attribute simplifies transformations from and to <a title="Cascading Style Sheets, level 2" href="http://www.w3.org/TR/1998/REC-CSS2-19980512">[CSS2]</a>/<a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> and other formats that do not have script-dependent attributes, and also can be used to assign script-types to weak <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters, where consumers may choose different script types.</p><p class="Text_20_body">The value <span class="Attribute_20_Value">ignore</span> can be used only within default styles. If it is set, all script-dependent attributes are applied to all script types. This would mean that a <span class="Attribute">fo:font-family</span> would be applied to all script types as well as a <span class="Attribute">style:font-family-asian</span> or <span class="Attribute">style:font-family-complex</span>. </p><p class="Note"><span class="Note_20_Label">Note:</span> Use of the <span class="Attribute_20_Value">ignore</span> value simplifies saving documents with producers that do not support a script type.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:script-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">asian</span>: all asian script type dependent attributes are active.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">complex</span>: all complex script type dependent attributes are active.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ignore</span>: all script type dependent attributes are applied to all script types. This is available on default styles only.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">latin</span>: all latin script type dependent attributes are active.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The mapping of Unicode code points to script types is defined by table <a href="#refTable21">22</a>. Consumers should apply this mapping. For Unicode code points for which no mapping is defined, the mapping is implementation dependent.</p><p class="Table">Table <a id="refTable21"/>22 - Unicode Code Point to Script Type Mapping</p><table border="0" cellspacing="0" cellpadding="0" class="Tabelle1"><colgroup><col width="561"/><col width="103"/></colgroup><tr><td style="text-align:left;width:5.0535in; " class="Tabelle1_A1"><p class="Table_20_Heading">Unicode Code Point Ranges</p></td><td style="text-align:left;width:0.9306in; " class="Tabelle1_B1"><p class="Table_20_Heading">Script Type</p></td></tr><tr><td style="text-align:left;width:5.0535in; " class="Tabelle1_A2"><p class="Text_20_body">U+0003..U+001F, U+0021..U+009F, U+00A1..U+04FF, U+0530..U+058F, U+10A0..U+10FF, U+13A0..U+16FF, U+1E00..U+1FFF, U+2C60..U+2C7F, U+2C80..U+2CE3, U+A720..U+A7FF</p></td><td style="text-align:left;width:0.9306in; " class="Tabelle1_B2"><p class="Text_20_body"><span class="Attribute_20_Value">latin</span></p></td></tr><tr><td style="text-align:left;width:5.0535in; " class="Tabelle1_A2"><p class="Text_20_body">U+0590..U+074F, U+0780..U+07BF, U+0900..U+109F, U+1200..U+137F, U+1780..U+18AF, U+FB50..U+FDFF, U+FE70..U+FEFF</p></td><td style="text-align:left;width:0.9306in; " class="Tabelle1_B2"><p class="Text_20_body"><span class="Attribute_20_Value">complex</span></p></td></tr><tr><td style="text-align:left;width:5.0535in; " class="Tabelle1_A2"><p class="Text_20_body">U+1100..U+11FF, U+2E80..U+31BF, U+31C0..U+31EF, U+3200..U+4DBF, U+4E00..U+A4CF, U+AC00..U+D7AF, U+F900..U+FAFF, U+FE30..U+FE4F, U+FF00..U+FFEF, U+20000..U+2A6DF, U+2F800..U+2FA1F</p></td><td style="text-align:left;width:0.9306in; " class="Tabelle1_B2"><p class="Text_20_body"><span class="Attribute_20_Value">asian</span></p></td></tr></table><p class="Text_20_body">The <span class="Attribute">style:script-type</span> attribute specifies which script type dependent attributes are currently active for a portion of text. The attribute may be evaluated by consumers that do not support script types to select the correct script dependent formatting properties. Consumers that support script types may also evaluate the attribute and overwrite the script type they would evaluate for a specific character.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:script-type</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:script-type</span> attribute are <span class="Attribute_20_Value">latin</span>, <span class="Attribute_20_Value">asian</span>, <span class="Attribute_20_Value">complex</span> or <span class="Attribute_20_Value">ignore</span>.</p><h2 class="Heading_20_2"><a id="a20_349style_shadow"><span style="margin-right:0.127cm;">20.349</span></a><a id="__RefHeading__1420162_253892949"/><a id="property-style_shadow"/>style:shadow</h2><p class="Text_20_body">The <span class="Attribute">style:shadow</span> attribute specifies a shadow effect.</p><p class="Text_20_body">The defined values for this attribute are those defined in §7.16.5 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>, except the value <span class="Alien_20_Attribute_20_Value">inherit</span>.</p><p class="Text_20_body">The shadow effect is not applied to the text content of an element, but depending on the element where the attribute appears, to a paragraph, a text box, a page body, a header, a footer, a table or a table cell. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:shadow</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>, <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>, <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>, <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>, <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a> and <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:shadow</span> attribute are <span class="Attribute_20_Value">none</span> or a value of type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_350style_shrink-to-fit"><span style="margin-right:0.127cm;">20.350</span></a><a id="__RefHeading__1420164_253892949"/><a id="property-style_shrink-to-fit"/>style:shrink-to-fit</h2><p class="Text_20_body">The <span class="Attribute">style:shrink-to-fit</span> attribute specifies whether content is reduced in size to fit within a cell or drawing object. Shrinking means that the font size of the content is decreased to fit the content into a cell or drawing object. The attribute has no effect on cells where the cell content  already fits into the cell.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:shrink-to-fit</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: content should not be reduced in size to fit within a cell or drawing object.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: content should be reduced in size to fit within a cell or drawing object.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:shrink-to-fit</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a> and <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:shrink-to-fit</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_351style_snap-to-layout-grid"><span style="margin-right:0.127cm;">20.351</span></a><a id="__RefHeading__1420166_253892949"/><a id="property-style_snap-to-layout-grid"/>style:snap-to-layout-grid</h2><p class="Text_20_body">The <span class="Attribute">style:snap-to-layout-grid</span> attribute specifies whether the layout of a paragraph should consider the layout grid settings of the page where it appears.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:snap-to-layout-grid</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: layout of a paragraph should not consider the layout grid settings of the page where it appears.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: layout of a paragraph should consider the layout grid settings of the page where it appears.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:snap-to-layout-grid</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:snap-to-layout-grid</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_352style_tab-stop-distance"><span style="margin-right:0.127cm;">20.352</span></a><a id="__RefHeading__1420168_253892949"/><a id="property-style_tab-stop-distance"/>style:tab-stop-distance</h2><p class="Text_20_body">The <span class="Attribute">style:tab-stop-distance</span> attribute specifies the distance between default tab stops. A default tab stop is repeated automatically after the specified distance. Default tab stops are only evaluated if they are specified within a default style.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:tab-stop-distance</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:tab-stop-distance</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_353style_table-centering"><span style="margin-right:0.127cm;">20.353</span></a><a id="__RefHeading__1420170_253892949"/><a id="property-style_table-centering"/>style:table-centering</h2><p class="Text_20_body">The <span class="Attribute">style:table-centering</span> attribute specifies whether tables are centered horizontally and/or vertically on the page. This attribute only applies to spreadsheet documents.</p><p class="Text_20_body">The default is to align the table to the top-left or top-right corner of the page, depending of its writing direction.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:table-centering</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">both</span>: tables should be centered both horizontally and vertically on the pages where they appear.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">h</span><span class="Attribute_20_Value">orizontal</span>: tables should be centered horizontally on the pages where they appear.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: tables should not be centered both horizontally or vertically on the pages where they appear.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">vertical</span>: tables should be centered vertically on the pages where they appear.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:table-centering</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:table-centering</span> attribute are <span class="Attribute_20_Value">horizontal</span>, <span class="Attribute_20_Value">vertical</span>, <span class="Attribute_20_Value">both</span> or <span class="Attribute_20_Value">none</span>.</p><h2 class="Heading_20_2"><a id="a20_354style_text-align-source"><span style="margin-right:0.127cm;">20.354</span></a><a id="__RefHeading__1420172_253892949"/><a id="property-style_text-align-source"/>style:text-align-source</h2><p class="Text_20_body">The <span class="Attribute">style:text-align-source</span> attribute specifies the source of a text-align attribute. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-align-source</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fix</span>: content alignment uses the value of the <span class="Attribute">fo:text-align</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">value-type</span>: content alignment uses the value-type of the cell.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default alignment for a cell value-type <span class="Attribute_20_Value">string</span> is left, for other value-types it is right. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-align-source</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-align-source</span> attribute are <span class="Attribute_20_Value">fix</span> or <span class="Attribute_20_Value">value-type</span>.</p><h2 class="Heading_20_2"><a id="a20_355style_text-autospace"><span style="margin-right:0.127cm;">20.355</span></a><a id="__RefHeading__1420174_253892949"/><a id="property-style_text-autospace"/>style:text-autospace</h2><p class="Text_20_body">The <span class="Attribute">style:text-autospace</span> attribute specifies whether to add space between portions of Asian, Western, and complex texts.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-autospace</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">ideograph-alpha</span>: space should be added between portions of Asian, Western and complex texts.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: space should not be added between portions of Asian, Western and complex texts.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-autospace</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-autospace</span> attribute are <span class="Attribute_20_Value">none</span> or <span class="Attribute_20_Value">ideograph-alpha</span>.</p><h2 class="Heading_20_2"><a id="a20_356style_text-blinking"><span style="margin-right:0.127cm;">20.356</span></a><a id="__RefHeading__1420176_253892949"/><a id="property-style_text-blinking"/>style:text-blinking</h2><p class="Text_20_body">The <span class="Attribute">style:text-blinking</span> attribute specifies whether text blinks.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-blinking</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text should not blink.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text should blink.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-blinking</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-blinking</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_357style_text-combine"><span style="margin-right:0.127cm;">20.357</span></a><a id="__RefHeading__1420178_253892949"/><a id="property-style_text-combine"/>style:text-combine</h2><p class="Text_20_body">The <span class="Attribute">style:text-combine</span> attribute specifies whether to combine characters so that they are displayed within two lines.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-combine</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">letters</span>: Display text in Kumimoji. Up to five (5) characters are combined within two lines and are displayed with a reduced size in a single wide-cell character. Additional characters are displayed as normal text. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">lines</span>: Displays text in Warichu. All characters with the <span class="Attribute">style:text-combine</span> attribute that immediately follow each other are displayed within two lines of approximately the same length. A line break may occur between any two characters to meet this constraint. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">n</span><span class="Attribute_20_Value">one</span>: characters should not be combined.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-combine</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-combine</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">letters</span> or <span class="Attribute_20_Value">lines</span>.</p><h2 class="Heading_20_2"><a id="a20_358style_text-combine-start-char"><span style="margin-right:0.127cm;">20.358</span></a><a id="__RefHeading__1420180_253892949"/><a id="property-style_text-combine-start-char"/>style:text-combine-start-char</h2><p class="Text_20_body">The <span class="Attribute">style:text-combine-start-char</span> attribute specifies the start character that is displayed before a portion of text whose <span class="Attribute">style:text-combine</span> attribute has a value of <span class="Attribute_20_Value">lines</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-combine-start-char</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-combine-start-char</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a20_359style_text-combine-end-char"><span style="margin-right:0.127cm;">20.359</span></a><a id="__RefHeading__1420182_253892949"/><a id="property-style_text-combine-end-char"/>style:text-combine-end-char</h2><p class="Text_20_body">The <span class="Attribute">style:text-combine-end-char</span> attribute specifies the end character that is displayed after a portion of text whose <span class="Attribute">style:text-combine</span> attribute has a value of <span class="Attribute_20_Value">lines</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-combine-end-char</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-combine-end-char</span> attribute has the data type <span class="Datatype">character</span> <a href="#datatype-character">18.3.7</a>.</p><h2 class="Heading_20_2"><a id="a20_360style_text-emphasize"><span style="margin-right:0.127cm;">20.360</span></a><a id="__RefHeading__1420184_253892949"/><a id="property-style_text-emphasize"/>style:text-emphasize</h2><p class="Text_20_body">The <span class="Attribute">style:text-emphasize</span> attribute specifies emphasis in a text composed of <a title="The Unicode Consortium. The Unicode Standard, Version 5.2.0">[UNICODE]</a> characters whose script type is <span class="Attribute_20_Value">asian</span>. <a href="#property-style_script-type">20.348</a></p><p class="Text_20_body">The value of this attribute consists of two white space-separated values.</p><p class="Text_20_body">The first value represents the style to use for emphasis and it can be <span class="Attribute_20_Value">accent</span>, <span class="Attribute_20_Value">circle</span>, <span class="Attribute_20_Value">dot</span>, <span class="Attribute_20_Value">disc</span> or <span class="Attribute_20_Value">none</span>.</p><p class="Text_20_body">The second value represents the position of the emphasis and it can be <span class="Attribute_20_Value">above</span> or <span class="Attribute_20_Value">below</span>. If the first value is <span class="Attribute_20_Value">none</span>, the second value can be omitted.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-emphasize</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">accent</span>: calligraphic accent strokes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">circle</span>: hollow circles.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">disc</span>: filled circles.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">d</span><span class="Attribute_20_Value">ot</span>: calligraphic dot.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: no emphasis marks.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-emphasize</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-emphasize</span> attribute are <span class="Attribute_20_Value">none</span>, or two white space separated values. The first of these values is one of: <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">accent</span>, <span class="Attribute_20_Value">dot</span>, <span class="Attribute_20_Value">circle</span> or <span class="Attribute_20_Value">disc</span>. The second of these values is one of: <span class="Attribute_20_Value">above</span> or <span class="Attribute_20_Value">below</span>.</p><h2 class="Heading_20_2"><a id="a20_361style_text-line-through-color"><span style="margin-right:0.127cm;">20.361</span></a><a id="__RefHeading__1420186_253892949"/><a id="property-style_text-line-through-color"/>style:text-line-through-color</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-color</span> attribute specifies the color that is used for line-through text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-line-through-color</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">font-color</span>: current text color is used for underlining.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-color</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-line-through-color</span> attribute are <span class="Attribute_20_Value">font-color</span> or a value of type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_362style_text-line-through-mode"><span style="margin-right:0.127cm;">20.362</span></a><a id="__RefHeading__1420188_253892949"/><a id="property-style_text-line-through-mode"/>style:text-line-through-mode</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-mode</span> attribute specifies whether lining through is applied to words only or to portions of text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-line-through-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">continuous</span>: lining is applied to words and separating spaces.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">skip-white-space</span>: lining is not applied to spaces between words.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-line-through-mode</span> attribute are <span class="Attribute_20_Value">continuous</span> or <span class="Attribute_20_Value">skip-white-space</span>.</p><h2 class="Heading_20_2"><a id="a20_363style_text-line-through-style"><span style="margin-right:0.127cm;">20.363</span></a><a id="__RefHeading__1420190_253892949"/><a id="property-style_text-line-through-style"/>style:text-line-through-style</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-style</span> attribute specifies a style for rendering a line-through text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-line-through-style</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: text has no line through it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dash</span>: text has a dashed line through it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dash</span>: text has a line whose repeating pattern is a dot followed by a dash through it.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dot-dash</span>: text has a line whose repeating pattern is two dots followed by a dash through it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dotted</span>: text has a dotted line through it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long-dash</span>: text has a dashed line whose dashes are longer than the ones from the dashed line for value dash through it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: text has a solid line through it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wave</span>: text has a wavy line through it. <span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"><span class="Note_20_Label">Note: </span>The definitions of the values of the <span class="Attribute">style:text-line-through-style</span> attribute are based on the text decoration style 'text-line-through-style' from <a title="CSS3 Text Module" href="http://www.w3.org/TR/2003/CR-css3-text-20030514">[CSS3Text]</a>, §9.2.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-style</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-line-through-style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">long-dash</span>, <span class="Attribute_20_Value">dot-dash</span>, <span class="Attribute_20_Value">dot-dot-dash</span> or <span class="Attribute_20_Value">wave</span>.</p><h2 class="Heading_20_2"><a id="a20_364style_text-line-through-text"><span style="margin-right:0.127cm;">20.364</span></a><a id="__RefHeading__1420192_253892949"/><a id="property-style_text-line-through-text"/>style:text-line-through-text</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-text</span> attribute specifies a text that is used for line-through. The attribute will be evaluated only if the value of <span class="Attribute">style:text-line-through-style</span> attribute is different than <span class="Attribute_20_Value">none</span>.</p><p class="Text_20_body">If the attribute value is not empty, the attribute value string is used for line-through instead of the line style that has been specified by the <span class="Attribute">style:text-line-through-style</span> attribute. Consumers that do not support line-through with text should ignore the attribute, i and should use the line style specified by the <span class="Attribute">style:text-line-through-style</span> attribute.</p><p class="Text_20_body">Consumers that support line-through with single characters only, should use the first character of the value for line-through, if the <span class="Attribute">style:text-line-through-text</span> attribute value as more than one character. Consumers that support line-through with specific characters only (like ”x” or ”/” (U+002F, SOLIDUS) should use one of these characters if the attribute specifies characters that are not supported.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-text</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-line-through-text</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_365style_text-line-through-text-style"><span style="margin-right:0.127cm;">20.365</span></a><a id="__RefHeading__1420194_253892949"/><a id="property-style_text-line-through-text-style"/>style:text-line-through-text-style</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-text-style</span> specifies a text style that is applied to text-line-through characters. It is not applied to line-through lines. If the attribute appears in an automatic style, it may reference either an automatic text style or a common style. If the attribute appears in a common style, it may reference a common style only.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-text-style</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-line-through-text-style</span> attribute has the data type <span class="Datatype">styleNameRef</span> <a href="#datatype-styleNameRef">18.3.32</a>.</p><h2 class="Heading_20_2"><a id="a20_366style_text-line-through-type"><span style="margin-right:0.127cm;">20.366</span></a><a id="__RefHeading__1420196_253892949"/><a id="property-style_text-line-through-type"/>style:text-line-through-type</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-type</span> attribute specifies whether text is lined through, and if so, whether a single or double line will be used. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-line-through-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: a double line should be used for a line-through text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: deprecated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">single</span>: a single line should be used for a line-through text.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Every occurrence of the <span class="Attribute">style:text-line-through-type</span> attribute should be accompanied by an occurrence of the <span class="Attribute">style:text-line-through-style</span> attribute on the same element. There should not be an occurrence of the <span class="Attribute">style:text-line-through-type</span> attribute if the value of the <span class="Attribute">style:text-line-through-style</span> attribute is <span class="Attribute_20_Value">none</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-type</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-line-through-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">single</span> or <span class="Attribute_20_Value">double</span>.</p><h2 class="Heading_20_2"><a id="a20_367style_text-line-through-width"><span style="margin-right:0.127cm;">20.367</span></a><a id="__RefHeading__1420198_253892949"/><a id="property-style_text-line-through-width"/>style:text-line-through-width</h2><p class="Text_20_body">The <span class="Attribute">style:text-line-through-width</span> attribute specifies the width of a line-through line. The value <span class="Attribute_20_Value">bold</span> specifies a line width that is calculated from the font sizes like an <span class="Attribute_20_Value">auto</span> width, but is wider than an <span class="Attribute_20_Value">auto</span> width.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-line-through-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the width of a line-through should be calculated from the font size of the text where the line-through will appear. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bold</span>: the width of a line-through should be calculated from the font size of the text where the line-through will appear but is wider than for the value of <span class="Attribute_20_Value">auto</span>. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The line-through text styles referenced by the values <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span> and <span class="Attribute_20_Value">thin</span>, are implementation-defined. Thin shall be smaller width than medium and medium shall be a smaller width than thick. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-line-through-width</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-line-through-width</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">thin</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span>, a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>, a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a> or a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_368style_text-outline"><span style="margin-right:0.127cm;">20.368</span></a><a id="__RefHeading__1420200_253892949"/><a id="property-style_text-outline"/>style:text-outline</h2><p class="Text_20_body">The <span class="Attribute">style:text-outline</span> attribute specifies whether to display an outline of text or the text itself. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-outline</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text itself should be displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span><span class="Source_20_Text">:</span> outline of text should be displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-outline</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-outline</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_369style_text-overline-color"><span style="margin-right:0.127cm;">20.369</span></a><a id="__RefHeading__1420202_253892949"/><a id="property-style_text-overline-color"/>style:text-overline-color</h2><p class="Text_20_body">The <span class="Attribute">style:text-overline-color</span> attribute specifies a color that is used to overline text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-overline-color</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">font-color</span>: the current text color is used for overlining.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">color</span><span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-overline-color</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-overline-color</span> attribute are <span class="Attribute_20_Value">font-color</span> or a value of type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_370style_text-overline-mode"><span style="margin-right:0.127cm;">20.370</span></a><a id="__RefHeading__1420204_253892949"/><a id="property-style_text-overline-mode"/>style:text-overline-mode</h2><p class="Text_20_body">The <span class="Attribute">style:text-overline-mode</span> attribute specifies whether overlining is applied to words only or to portions of text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-line-through-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">continuous</span>: overlining is applied to words and separating spaces.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">skip-white-space</span>: overlining is not applied to spaces between words.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-overline-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-overline-mode</span> attribute are <span class="Attribute_20_Value">continuous</span> or <span class="Attribute_20_Value">skip-white-space</span>.</p><h2 class="Heading_20_2"><a id="a20_371style_text-overline-style"><span style="margin-right:0.127cm;">20.371</span></a><a id="__RefHeading__1420206_253892949"/><a id="property-style_text-overline-style"/>style:text-overline-style</h2><p class="Text_20_body">The <span class="Attribute">style:text-overline-style</span> attribute specifies a style for rendering a line over text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-overline-style</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: text has no overlining. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dash</span>: text has a dashed line overlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dash</span>: text has a line whose repeating pattern is a dot followed by a dash overlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dot-dash</span>: text has a line whose repeating pattern is two dots followed by a dash overlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dotted</span>: text has a dotted line overlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long-dash</span>: text has a dashed line whose dashes are longer than the ones from the dashed line for value dash overlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: text has a solid line overlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wave</span>: text has a wavy line overlining it.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note:</span> The definitions of the values of the <span class="Attribute">style:text-overline-style</span> attribute are based on the text decoration style 'text-overline-style' from <a title="CSS3 Text Module" href="http://www.w3.org/TR/2003/CR-css3-text-20030514">[CSS3Text]</a>, §9.2.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-overline-style</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-overline-style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">long-dash</span>, <span class="Attribute_20_Value">dot-dash</span>, <span class="Attribute_20_Value">dot-dot-dash</span> or <span class="Attribute_20_Value">wave</span>.</p><h2 class="Heading_20_2"><a id="a20_372style_text-overline-type"><span style="margin-right:0.127cm;">20.372</span></a><a id="__RefHeading__1420208_253892949"/><a id="property-style_text-overline-type"/>style:text-overline-type</h2><p class="Text_20_body">The <span class="Attribute">style:text-overline-type</span> attribute specifies the type of overlining applied to a text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-overline-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: a double line should be used for overlining text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: deprecated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">ingle</span>: a single line should be used for overlining text.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Every occurrence of the <span class="Attribute">style:text-overline-type</span> attribute should be accompanied by an occurrence of the <span class="Attribute">style:text-overline-style</span> attribute on the same element. There should not be an occurrence of the <span class="Attribute">style:text-overline-type</span> attribute if the value of the <span class="Attribute">style:text-overline-style</span> attribute is <span class="Attribute_20_Value">none</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-overline-type</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-overline-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">single</span> or <span class="Attribute_20_Value">double</span>.</p><h2 class="Heading_20_2"><a id="a20_373style_text-overline-width"><span style="margin-right:0.127cm;">20.373</span></a><a id="__RefHeading__1420210_253892949"/><a id="property-style_text-overline-width"/>style:text-overline-width</h2><p class="Text_20_body">The <span class="Attribute">style:text-overline-width</span> attribute specifies the width of an overline. The value <span class="Attribute_20_Value">bold</span> specifies a line width that is calculated from the font sizes like an <span class="Attribute_20_Value">auto</span> width, but is wider than an <span class="Attribute_20_Value">auto</span> width.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-overline-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the width of an overline should be calculated from the font size of the text where the overline will appear. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bold</span>: the width of an overline should be calculated from the font size of the text where the overline will appear but is wider than for the value of <span class="Attribute_20_Value">auto</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The overline text styles referenced by the values <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span> and <span class="Attribute_20_Value">thin</span>, are implementation-defined. Thin shall be smaller width than medium and medium shall be a smaller width than thick. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-overline-width</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-overline-width</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">thin</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span>, a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>, a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a> or a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_374style_text-position"><span style="margin-right:0.127cm;">20.374</span></a><a id="__RefHeading__1420212_253892949"/><a id="property-style_text-position"/>style:text-position</h2><p class="Text_20_body">The <span class="Attribute">style:text-position</span> attribute specifies whether text is positioned above or below the baseline and to specify the relative font height that is used for this text.</p><p class="Text_20_body">This attribute can have one or two values.</p><p class="Text_20_body">The first value shall be present and specifies the vertical text position as a percentage of the current font height or it takes one of the values <span class="Attribute_20_Value">sub</span> or <span class="Attribute_20_Value">super</span>. Negative percentages or the <span class="Attribute_20_Value">sub</span> value place the text below the baseline. Positive percentages or the <span class="Attribute_20_Value">super</span> value place the text above the baseline. If <span class="Attribute_20_Value">sub</span> or <span class="Attribute_20_Value">super</span> is specified, the consumer chooses an appropriate text position.</p><p class="Text_20_body">The second value may be present and specifies the font height as a percentage of the current font-height. If this value is not specified, an appropriate font height is used. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-position</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-position</span> attribute has one or two white space separated values. The first values is of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>, or is one of: <span class="Attribute_20_Value">super</span> or <span class="Attribute_20_Value">sub</span>. The second value is of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_375style_text-rotation-angle"><span style="margin-right:0.127cm;">20.375</span></a><a id="__RefHeading__1420214_253892949"/><a id="property-style_text-rotation-angle"/>style:text-rotation-angle</h2><p class="Text_20_body">The <span class="Attribute">style:text-rotation-angle</span> attribute specifies an angle to which text is rotated. The value of this attribute can be any integer, which specifies the rotation angle in degrees, or an angle as specified in <span class="Datatype">angle</span>. <a href="#datatype-angle">18.3.1</a></p><p class="Text_20_body">If more than one character is selected, the entire selection is rotated as a block.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-rotation-angle</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-rotation-angle</span> attribute has the data type <span class="Datatype">angle</span> <a href="#datatype-angle">18.3.1</a>.</p><h2 class="Heading_20_2"><a id="a20_376style_text-rotation-scale"><span style="margin-right:0.127cm;">20.376</span></a><a id="__RefHeading__1420216_253892949"/><a id="property-style_text-rotation-scale"/>style:text-rotation-scale</h2><p class="Text_20_body">The <span class="Attribute">style:text-rotation-scale</span> attribute specifies whether for rotated text the width of the text should be scaled to fit into the current line height or the width of the text should remain fixed, therefore changing the current line height.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-rotation-scale</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">fixed</span>: width of text should remain fixed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">ine-height</span>: width of text should be scaled to fit the current line height.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-rotation-scale</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-rotation-scale</span> attribute are <span class="Attribute_20_Value">fixed</span> or <span class="Attribute_20_Value">line-height</span>.</p><h2 class="Heading_20_2"><a id="a20_377style_text-scale"><span style="margin-right:0.127cm;">20.377</span></a><a id="__RefHeading__1420218_253892949"/><a id="property-style_text-scale"/>style:text-scale</h2><p class="Text_20_body">The <span class="Attribute">style:text-scale</span> attribute specifies whether to decrease or increase the width of text by scaling the font width.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-scale</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:text-scale</span> attribute has the data type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.</p><h2 class="Heading_20_2"><a id="a20_378style_text-underline-color"><span style="margin-right:0.127cm;">20.378</span></a><a id="__RefHeading__1420220_253892949"/><a id="property-style_text-underline-color"/>style:text-underline-color</h2><p class="Text_20_body">The <span class="Attribute">style:text-underline-color</span> attribute specifies a color that is used to underline text. The value of this attribute is either <span class="Attribute_20_Value">font-color</span> or a color. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-underline-color</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">font-color</span>: the current text color is used for underlining.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">color</span>: the color to be used for underlining.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-underline-color</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-underline-color</span> attribute are <span class="Attribute_20_Value">font-color</span> or a value of type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_379style_text-underline-mode"><span style="margin-right:0.127cm;">20.379</span></a><a id="__RefHeading__1420222_253892949"/><a id="property-style_text-underline-mode"/>style:text-underline-mode</h2><p class="Text_20_body">The <span class="Attribute">style:text-underline-mode</span> attribute specifies whether underlining is applied to words only or to portions of text. If underlining is applied to text portions, the spaces between words and the words are underlined. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-underline-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">continuous</span>: underlining is applied to words and separating spaces.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">skip-white-space</span>: underlining is not applied to spaces between words.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-underline-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-underline-mode</span> attribute are <span class="Attribute_20_Value">continuous</span> or <span class="Attribute_20_Value">skip-white-space</span>.</p><h2 class="Heading_20_2"><a id="a20_380style_text-underline-style"><span style="margin-right:0.127cm;">20.380</span></a><a id="__RefHeading__1420224_253892949"/><a id="property-style_text-underline-style"/>style:text-underline-style</h2><p class="Text_20_body">The <span class="Attribute">style:text-underline-style</span> attribute specifies a style for underlining text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-underline-style</span> attribute are: </p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: text has no underlining. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dash</span>: text has a dashed line underlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dash</span>: text has a line whose repeating pattern is a dot followed by a dash underlining it.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dot-dot-dash</span>: text has a line whose repeating pattern is two dots followed by a dash underlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dotted</span>: text has a dotted line underlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">long-dash</span>: text has a dashed line whose dashes are longer than the ones from the dashed line for value dash underlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">solid</span>: text has a solid line underlining it. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">wave</span>: text has a wavy line underlining it. <span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note: </span>The definitions of the values of the <span class="Attribute">style:text-underline-style</span> attribute are based on the text decoration style 'text-underline-style' from <a title="CSS3 Text Module" href="http://www.w3.org/TR/2003/CR-css3-text-20030514">[CSS3Text]</a>, §9.2.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-underline-style</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-underline-style</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">solid</span>, <span class="Attribute_20_Value">dotted</span>, <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">long-dash</span>, <span class="Attribute_20_Value">dot-dash</span>, <span class="Attribute_20_Value">dot-dot-dash</span> or <span class="Attribute_20_Value">wave</span>.</p><h2 class="Heading_20_2"><a id="a20_381style_text-underline-type"><span style="margin-right:0.127cm;">20.381</span></a><a id="__RefHeading__1420226_253892949"/><a id="property-style_text-underline-type"/>style:text-underline-type</h2><p class="Text_20_body">The <span class="Attribute">style:text-underline-type</span> attribute specifies the type of underlining applied to a text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-underline-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">double</span>: a double line should be used for underlining applied to a text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: deprecated.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">s</span><span class="Attribute_20_Value">ingle</span>: a single line should be used for underlining applied to a text.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Every occurrence of the <span class="Attribute">style:text-underline-type</span> attribute should be accompanied by an occurrence of the <span class="Attribute">style:text-underline-style</span> attribute on the same element. There should not be an occurrence of the <span class="Attribute">style:text-underline-type</span> attribute if the value of the <span class="Attribute">style:text-underline-style</span> attribute is <span class="Attribute_20_Value">none</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-underline-type</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-underline-type</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">single</span> or <span class="Attribute_20_Value">double</span>.</p><h2 class="Heading_20_2"><a id="a20_382style_text-underline-width"><span style="margin-right:0.127cm;">20.382</span></a><a id="__RefHeading__1420228_253892949"/><a id="property-style_text-underline-width"/>style:text-underline-width</h2><p class="Text_20_body">The <span class="Attribute">style:text-underline-width</span> attribute specifies the width of an underline. The value <span class="Attribute_20_Value">bold</span> specifies a line width that is calculated from the font sizes like an <span class="Attribute_20_Value">auto</span> width, but is wider than an <span class="Attribute_20_Value">auto</span> width.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:text-underline-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: the width of an underline should be calculated from the font size of the text where the underline will appear. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bold</span>: the width of an underline should be calculated from the font size of the text where the underline will appear but is wider than for the value of <span class="Attribute_20_Value">auto</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The underline text styles referenced by the values <span class="Attribute_20_Value">dash</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span> and <span class="Attribute_20_Value">thin</span>, are implementation-defined. Thin shall be smaller width than medium and medium shall be a smaller width than thick. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:text-underline-width</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:text-underline-width</span> attribute are <span class="Attribute_20_Value">auto</span>, <span class="Attribute_20_Value">normal</span>, <span class="Attribute_20_Value">bold</span>, <span class="Attribute_20_Value">thin</span>, <span class="Attribute_20_Value">medium</span>, <span class="Attribute_20_Value">thick</span>, a value of type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>, a value of type <span class="Datatype">percent</span> <a href="#datatype-percent">18.3.23</a> or a value of type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_383style_use-optimal-column-width"><span style="margin-right:0.127cm;">20.383</span></a><a id="__RefHeading__1420230_253892949"/><a id="property-style_use-optimal-column-width"/>style:use-optimal-column-width</h2><p class="Text_20_body">The <span class="Attribute">style:use-optimal-column-width</span> attribute specifies that a column width should be recalculated automatically if content in the column changes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:use-optimal-column-width</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: column width should not be recalculated automatically if content in the column changes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span><span class="Source_20_Text">:</span> column width should be recalculated automatically if content in the column changes.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:use-optimal-column-width</span> attribute is usable with the following element: <span class="Element">&lt;style:table-column-properties&gt;</span> <a href="#element-style_table-column-properties">17.16</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:use-optimal-column-width</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_384style_use-optimal-row-height"><span style="margin-right:0.127cm;">20.384</span></a><a id="__RefHeading__1420232_253892949"/><a id="property-style_use-optimal-row-height"/>style:use-optimal-row-height</h2><p class="Text_20_body">The <span class="Attribute">style:use-optimal-row-height</span> attribute specifies that a row height should be recalculated automatically if content in the row changes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:use-optimal-row-height</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: row height should not be recalculated automatically if content in the row changes.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span><span class="Source_20_Text">:</span> row height should be recalculated automatically if content in the row changes.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:use-optimal-row-height</span> attribute is usable with the following element: <span class="Element">&lt;style:table-row-properties&gt;</span> <a href="#element-style_table-row-properties">17.17</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:use-optimal-row-height</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_385style_use-window-font-color"><span style="margin-right:0.127cm;">20.385</span></a><a id="__RefHeading__1420234_253892949"/><a id="property-style_use-window-font-color"/>style:use-window-font-color</h2><p class="Text_20_body">The <span class="Attribute">style:use-window-font-color</span> attribute specifies whether the window foreground color should be used as the foreground color for a light background color and white for a dark background color. The determination of light or dark color is implementation-defined.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:use-window-font-color</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: the foreground color is specified by the <span class="Attribute">fo:color</span> attribute. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span><span class="Source_20_Text">:</span> windows foreground color should be used as the foreground color for a light background color and white for a dark background color.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:use-window-font-color</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:use-window-font-color</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_386style_vertical-align"><span style="margin-right:0.127cm;">20.386</span></a><a id="__RefHeading__1420236_253892949"/><a id="property-style_vertical-align"/>style:vertical-align</h2><h3 class="Heading_20_3"><a id="a20_386_1_style_paragraph-properties_"><span style="margin-right:0.127cm;">20.386.1</span></a><a id="__RefHeading__1420238_253892949"/><a id="property-style_vertical-align_element-style_paragraph-properties"/>&lt;style:paragraph-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:vertical-align</span> attribute specifies the vertical position of a character. By default characters are aligned according to their baseline. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:vertical-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">auto</span>: automatically, which sets the vertical alignment to suit the text rotation. Text that is rotated 0 or 90 degrees is aligned to the baseline, while text that is rotated 270 degrees is aligned to the center of the line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">b</span><span class="Attribute_20_Value">aseline</span>: to the baseline of the character.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: to the bottom of the line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">middle</span>: to the center of the line.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: to the top of the line.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:vertical-align</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:vertical-align</span> attribute are <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">middle</span>, <span class="Attribute_20_Value">bottom</span>, <span class="Attribute_20_Value">auto</span> or <span class="Attribute_20_Value">baseline</span>.</p><h3 class="Heading_20_3"><a id="a20_386_2_style_table-cell-properties_"><span style="margin-right:0.127cm;">20.386.2</span></a><a id="__RefHeading__1420240_253892949"/><a id="property-style_vertical-align_element-style_table-cell-properties"/>&lt;style:table-cell-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">style:vertical-align</span> attribute specifies the vertical alignment of text in a table cell. The options for the vertical alignment attribute are as follows:</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:vertical-align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">automatic</span>: consumer determines how to align the text.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: aligns text vertically with the bottom of the cell.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">middle</span>: aligns text vertically with the middle of the cell.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: aligns text vertically with the top of the cell.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:vertical-align</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:vertical-align</span> attribute are <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">middle</span>, <span class="Attribute_20_Value">bottom</span> or <span class="Attribute_20_Value">automatic</span>.</p><h2 class="Heading_20_2"><a id="a20_387style_vertical-pos"><span style="margin-right:0.127cm;">20.387</span></a><a id="__RefHeading__1420242_253892949"/><a id="property-style_vertical-pos"/>style:vertical-pos</h2><p class="Text_20_body">The <span class="Attribute">style:vertical-pos</span> attribute specifies the vertical alignment of a frame relative to a specific area.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:vertical-pos</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">below</span>: the top corner of the frame is positioned below the reference area. <span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">bottom</span>: the bottom of the frame is aligned with the reference area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">from-top</span>: the <span class="Attribute">svg:y</span> attribute associated with the frame element specifies the vertical position of the frame. Otherwise, the <span class="Attribute">svg:y</span> attribute is ignored for text documents.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">middle</span>: the middle of the frame is aligned with the reference area.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">top</span>: the top of the frame is aligned with the reference area.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:vertical-pos</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a> and <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:vertical-pos</span> attribute are <span class="Attribute_20_Value">top</span>, <span class="Attribute_20_Value">middle</span>, <span class="Attribute_20_Value">bottom</span>, <span class="Attribute_20_Value">from-top</span> or <span class="Attribute_20_Value">below</span>.</p><h2 class="Heading_20_2"><a id="a20_388style_vertical-rel"><span style="margin-right:0.127cm;">20.388</span></a><a id="__RefHeading__1420244_253892949"/><a id="property-style_vertical-rel"/>style:vertical-rel</h2><p class="Text_20_body">The <span class="Attribute">style:vertical-rel</span> attribute specifies the area against which the vertical position of a frame is positioned.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:vertical-rel</span> attribute are:</p><p class="Text_20_body"><span class="Attribute_20_Value">baseline</span>: vertical position of frame positioned relative to a baseline.</p><p class="Text_20_body"><span class="Attribute_20_Value">c</span><span class="Attribute_20_Value">har</span>: vertical position of frame positioned relative to a character.</p><p class="Text_20_body"><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rame</span>: vertical position of frame positioned relative to a frame.</p><p class="Text_20_body"><span class="Attribute_20_Value">f</span><span class="Attribute_20_Value">rame-content</span>: vertical position of frame positioned relative to frame content.</p><p class="Text_20_body"><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">ine</span>: vertical position of frame positioned relative to a line.</p><p class="Text_20_body"><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age</span>: vertical position of frame positioned relative to a page.</p><p class="Text_20_body"><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">age-content</span>: vertical position of frame positioned relative to page content.</p><p class="Text_20_body"><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">aragraph</span>: vertical position of frame positioned relative to a paragraph.</p><p class="Text_20_body"><span class="Attribute_20_Value">p</span><span class="Attribute_20_Value">aragraph-content</span>: vertical position of frame positioned relative to paragraph content.</p><p class="Text_20_body"><span class="Attribute_20_Value">t</span><span class="Attribute_20_Value">ext</span>: vertical position of frame positioned relative to text.</p><p class="Text_20_body">Table <a href="#refTable22">23</a> displays the defined values of <span class="Attribute">style:vertical-rel</span> and <span class="Attribute">text:anchor-type</span> attributes. Value combinations that can appear in a document are marked with an X.</p><p class="Table">Table <a id="refTable22"/>23 - Vertical Relation Values</p><table border="0" cellspacing="0" cellpadding="0" class="Table13"><colgroup><col width="140"/><col width="103"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/></colgroup><tr><td style="text-align:left;width:1.2604in; " class="Table13_A1"><p class="Table_20_Heading">Value of <span class="Attribute">style:vertical-rel</span></p></td><td colspan="5" style="text-align:left;"><table border="0" cellspacing="0" cellpadding="0"><colgroup><col width="103"/><col width="106"/><col width="106"/><col width="106"/><col width="106"/></colgroup><tr><th colspan="5" style="text-align:left;width:0.9278in; " class="Table13_B1_1_1"><p class="Table_20_Heading">Value of <span class="Attribute">text:anchor-type</span></p></th></tr><tr><th style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">page</span></p></th><th style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">frame</span></p></th><th style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">paragraph</span></p></th><th style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">char</span></p></th><th style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Heading"><span class="Attribute_20_Value">as-char</span></p></th></tr></table></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">baseline</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered">X</p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">char</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered">X</p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame-content</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">line</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered">X</p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page-content</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph-</span><span class="Attribute_20_Value">content</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered">X</p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered"> </p></td></tr><tr><td style="text-align:left;width:1.2604in; " class="Table13_B1_1_2"><p class="Table_20_Contents"><span class="Attribute_20_Value">text</span></p></td><td style="text-align:left;width:0.9278in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9528in; " class="Table13_B1_1_2"><p class="Table_20_Contents_20_Centered"> </p></td><td style="text-align:left;width:0.9535in; " class="Table13_B1_5_2"><p class="Table_20_Contents_20_Centered">X</p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:vertical-rel</span> attribute is usable with the following elements: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a> and <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:vertical-rel</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">page-content</span>, <span class="Attribute_20_Value">frame</span>, <span class="Attribute_20_Value">frame-content</span>, <span class="Attribute_20_Value">paragraph</span>, <span class="Attribute_20_Value">paragraph-content</span>, <span class="Attribute_20_Value">char</span>, <span class="Attribute_20_Value">line</span>, <span class="Attribute_20_Value">baseline</span> or <span class="Attribute_20_Value">text</span>.</p><h2 class="Heading_20_2"><a id="a20_389style_width"><span style="margin-right:0.127cm;">20.389</span></a><a id="__RefHeading__1420246_253892949"/><a id="property-style_width"/>style:width</h2><p class="Text_20_body">The <span class="Attribute">style:width</span> attribute specifies the fixed width of a table. Every table shall have a fixed width. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:width</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:width</span> attribute has the data type <span class="Datatype">positiveLength</span> <a href="#datatype-positiveLength">18.3.26</a>.</p><h2 class="Heading_20_2"><a id="a20_390style_wrap"><span style="margin-right:0.127cm;">20.390</span></a><a id="__RefHeading__1420248_253892949"/><a id="property-style_wrap"/>style:wrap</h2><p class="Text_20_body">The <span class="Attribute">style:wrap</span> attribute specifies how text is displayed around a frame or graphic object. </p><p class="Text_20_body">The defined values for the <span class="Attribute">style:wrap</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">biggest</span>: text may wrap around the shape where the difference to the left or right page or column border is largest.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">dynamic</span>: text may wrap around both sides of the shape. The space for wrapping is set by the <span class="Attribute">style:wrap-dynamic-threshold</span> attribute. <a href="#property-style_wrap-dynamic-threshold">20.393</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: text wraps around the left side of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: text does not wrap around the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">parallel</span>: text wraps around both sides of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: text wraps around the right side of the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">run-through</span>: text runs through the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:wrap</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:wrap</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">parallel</span>, <span class="Attribute_20_Value">dynamic</span>, <span class="Attribute_20_Value">run-through</span> or <span class="Attribute_20_Value">biggest</span>.</p><h2 class="Heading_20_2"><a id="a20_391style_wrap-contour"><span style="margin-right:0.127cm;">20.391</span></a><a id="__RefHeading__1420250_253892949"/><a id="property-style_wrap-contour"/>style:wrap-contour</h2><p class="Text_20_body">The <span class="Attribute">style:wrap-contour</span> attribute specifies whether text wraps around an object or the bounding box of the object.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:wrap-contour</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text wraps around the bounding box.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text wraps around the object.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">This is called contour wrapping.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:wrap-contour</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:wrap-contour</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_392style_wrap-contour-mode"><span style="margin-right:0.127cm;">20.392</span></a><a id="__RefHeading__1420252_253892949"/><a id="property-style_wrap-contour-mode"/>style:wrap-contour-mode</h2><p class="Text_20_body">The <span class="Attribute">style:wrap-contour-mode</span> attribute specifies the nature of the wrapping of text around the contour of a shape.</p><p class="Text_20_body">This attribute shall be evaluated only by frames/drawing shapes or styles with non-empty <span class="Attribute">style:wrap</span> and <span class="Attribute">style:wrap-contour</span> attributes.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:wrap-contour-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">full</span>: text wraps around the shape and fills any spaces and indentations in the shape.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">outside</span>: text wraps around the general area to the left and right of the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:wrap-contour-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:wrap-contour-mode</span> attribute are <span class="Attribute_20_Value">full</span> or <span class="Attribute_20_Value">outside</span>.</p><h2 class="Heading_20_2"><a id="a20_393style_wrap-dynamic-threshold"><span style="margin-right:0.127cm;">20.393</span></a><a id="__RefHeading__1420254_253892949"/><a id="property-style_wrap-dynamic-threshold"/>style:wrap-dynamic-threshold</h2><p class="Text_20_body">The <span class="Attribute">style:wrap-dynamic-threshold</span> attribute specifies the minimum distance between the page or column border and the object for which wrapping will be enabled. It is evaluated only if a <span class="Attribute">style:wrap</span> attribute, with the value <span class="Attribute_20_Value">dynamic</span>, appears on the same <span class="Element">&lt;style:graphic-properties&gt;</span> element.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:wrap-dynamic-threshold</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:wrap-dynamic-threshold</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_394style_writing-mode"><span style="margin-right:0.127cm;">20.394</span></a><a id="__RefHeading__1420256_253892949"/><a id="property-style_writing-mode"/>style:writing-mode</h2><h3 class="Heading_20_3"><a id="a20_394_1General"><span style="margin-right:0.127cm;">20.394.1</span></a><a id="__RefHeading__1420258_253892949"/>General</h3><p class="Text_20_body">The <span class="Attribute">style:writing-mode</span> attribute specifies a writing mode for an element. </p><h3 class="Heading_20_3"><a id="a20_394_2_style_graphic-properties_"><span style="margin-right:0.127cm;">20.394.2</span></a><a id="__RefHeading__1420260_253892949"/><a id="property-style_writing-mode_element-style_graphic-properties"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">See §7.27.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> with the additional value of <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">The defined value of <span class="Attribute">style:writing-mode</span> attribute is <span class="Attribute_20_Value">page</span>: writing mode is inherited from the page that contains the element where this attribute appears. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:writing-mode</span> attribute are <span class="Attribute_20_Value">lr-tb</span>, <span class="Attribute_20_Value">rl-tb</span>, <span class="Attribute_20_Value">tb-rl</span>, <span class="Attribute_20_Value">tb-lr</span>, <span class="Attribute_20_Value">lr</span>, <span class="Attribute_20_Value">rl</span>, <span class="Attribute_20_Value">tb</span> or <span class="Attribute_20_Value">page</span>.</p><h3 class="Heading_20_3"><a id="a20_394_3_style_page-layout-properties_"><span style="margin-right:0.127cm;">20.394.3</span></a><a id="__RefHeading__1420262_253892949"/><a id="property-style_writing-mode_element-style_page-layout-properties"/>&lt;style:page-layout-properties&gt;</h3><p class="Text_20_body">See §7.27.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a>.</p><p class="Text_20_body">The defined value for the <span class="Attribute">style:writing-mode</span> attribute is <span class="Attribute_20_Value">page</span>: writing mode is inherited from the page that contains the element where this attribute appears. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:page-layout-properties&gt;</span> <a href="#element-style_page-layout-properties">17.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:writing-mode</span> attribute are <span class="Attribute_20_Value">lr-tb</span>, <span class="Attribute_20_Value">rl-tb</span>, <span class="Attribute_20_Value">tb-rl</span>, <span class="Attribute_20_Value">tb-lr</span>, <span class="Attribute_20_Value">lr</span>, <span class="Attribute_20_Value">rl</span>, <span class="Attribute_20_Value">tb</span> or <span class="Attribute_20_Value">page</span>.</p><h3 class="Heading_20_3"><a id="a20_394_4_style_paragraph-properties_"><span style="margin-right:0.127cm;">20.394.4</span></a><a id="__RefHeading__1420264_253892949"/><a id="property-style_writing-mode_element-style_paragraph-properties"/>&lt;style:paragraph-properties&gt;</h3><p class="Text_20_body">See §7.27.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> with the additional value of <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">The defined value for the <span class="Attribute">style:writing-mode</span> attribute is <span class="Attribute_20_Value">page</span>: writing mode is inherited from the page that contains the element where this attribute appears.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:writing-mode</span> attribute are <span class="Attribute_20_Value">lr-tb</span>, <span class="Attribute_20_Value">rl-tb</span>, <span class="Attribute_20_Value">tb-rl</span>, <span class="Attribute_20_Value">tb-lr</span>, <span class="Attribute_20_Value">lr</span>, <span class="Attribute_20_Value">rl</span>, <span class="Attribute_20_Value">tb</span> or <span class="Attribute_20_Value">page</span>.</p><h3 class="Heading_20_3"><a id="a20_394_5_style_section-properties_"><span style="margin-right:0.127cm;">20.394.5</span></a><a id="__RefHeading__1420266_253892949"/><a id="property-style_writing-mode_element-style_section-properties"/>&lt;style:section-properties&gt;</h3><p class="Text_20_body">See §7.27.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> with the additional value of <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">The defined value for the <span class="Attribute">style:writing-mode</span> attribute is <span class="Attribute_20_Value">page</span>: writing mode is inherited from the page that contains the element where this attribute appears.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:writing-mode</span> attribute are <span class="Attribute_20_Value">lr-tb</span>, <span class="Attribute_20_Value">rl-tb</span>, <span class="Attribute_20_Value">tb-rl</span>, <span class="Attribute_20_Value">tb-lr</span>, <span class="Attribute_20_Value">lr</span>, <span class="Attribute_20_Value">rl</span>, <span class="Attribute_20_Value">tb</span> or <span class="Attribute_20_Value">page</span>.</p><h3 class="Heading_20_3"><a id="a20_394_6_style_table-cell-properties_"><span style="margin-right:0.127cm;">20.394.6</span></a><a id="__RefHeading__1420268_253892949"/><a id="property-style_writing-mode_element-style_table-cell-properties"/>&lt;style:table-cell-properties&gt;</h3><p class="Text_20_body">See §7.27.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> with the additional value of <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">The defined value for the <span class="Attribute">style:writing-mode</span> attribute is <span class="Attribute_20_Value">page</span>: writing mode is inherited from the page that contains the element where this attribute appears.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:writing-mode</span> attribute are <span class="Attribute_20_Value">lr-tb</span>, <span class="Attribute_20_Value">rl-tb</span>, <span class="Attribute_20_Value">tb-rl</span>, <span class="Attribute_20_Value">tb-lr</span>, <span class="Attribute_20_Value">lr</span>, <span class="Attribute_20_Value">rl</span>, <span class="Attribute_20_Value">tb</span> or <span class="Attribute_20_Value">page</span>.</p><h3 class="Heading_20_3"><a id="a20_394_7_style_table-properties_"><span style="margin-right:0.127cm;">20.394.7</span></a><a id="__RefHeading__1420270_253892949"/><a id="property-style_writing-mode_element-style_table-properties"/>&lt;style:table-properties&gt;</h3><p class="Text_20_body">See §7.27.7 of <a title="Extensible Stylesheet Language (XSL)" href="http://www.w3.org/TR/2001/REC-xsl-20011015/">[XSL]</a> with the additional value of <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">The defined value for the <span class="Attribute">style:writing-mode</span> attribute is <span class="Attribute_20_Value">page</span>: writing mode is inherited from the page that contains the element where this attribute appears.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">style:writing-mode</span> attribute are <span class="Attribute_20_Value">lr-tb</span>, <span class="Attribute_20_Value">rl-tb</span>, <span class="Attribute_20_Value">tb-rl</span>, <span class="Attribute_20_Value">tb-lr</span>, <span class="Attribute_20_Value">lr</span>, <span class="Attribute_20_Value">rl</span>, <span class="Attribute_20_Value">tb</span> or <span class="Attribute_20_Value">page</span>.</p><h2 class="Heading_20_2"><a id="a20_395style_writing-mode-automatic"><span style="margin-right:0.127cm;">20.395</span></a><a id="__RefHeading__1420272_253892949"/><a id="property-style_writing-mode-automatic"/>style:writing-mode-automatic</h2><p class="Text_20_body">The <span class="Attribute">style:writing-mode-automatic</span> attribute specifies whether a consumer may recalculate the writing mode of a paragraph based on its content whenever the content is edited. </p><p class="Text_20_body">The writing-mode should be specified in a <span class="Attribute">style:writing-mode</span> attribute.</p><p class="Text_20_body">If the <span class="Attribute">fo:text-align</span> with value <span class="Attribute_20_Value">start</span>, text alignment can be adapted to the writing mode.</p><p class="Text_20_body">The defined values for the <span class="Attribute">style:writing-mode-automatic</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: consumers should not recalculate writing mode of a paragraph  whenever its content is edited.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: consumers should recalculate writing mode of a paragraph  whenever its content is edited.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">style:writing-mode-automatic</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">style:writing-mode-automatic</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_396svg_fill-rule"><span style="margin-right:0.127cm;">20.396</span></a><a id="__RefHeading__1420274_253892949"/><a id="property-svg_fill-rule"/>svg:fill-rule</h2><p class="Text_20_body">See §11.3 of <a title="Scalable Vector Graphics (SVG) 1.1" href="http://www.w3.org/TR/2003/REC-SVG11-20030114/">[SVG]</a>.</p><p class="Text_20_body">OpenDocument does not support the value <span class="Alien_20_Attribute_20_Value">inherit</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:fill-rule</span> attribute is usable with the following elements: <span class="Element">&lt;style:drawing-page-properties&gt;</span> <a href="#element-style_drawing-page-properties">17.25</a> and <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:fill-rule</span> attribute are <span class="Attribute_20_Value">nonzero</span> or <span class="Attribute_20_Value">evenodd</span>.</p><h2 class="Heading_20_2"><a id="a20_397svg_height"><span style="margin-right:0.127cm;">20.397</span></a><a id="__RefHeading__1420276_253892949"/><a id="property-svg_height"/>svg:height</h2><h3 class="Heading_20_3"><a id="a20_397_1_style_graphic-properties_"><span style="margin-right:0.127cm;">20.397.1</span></a><a id="__RefHeading__1420278_253892949"/><a id="property-svg_height_element-style_graphic-properties"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute specifies a default height for new frames that are created using the graphics style. See <a href="#attribute-svg_height">19.539</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h3 class="Heading_20_3"><a id="a20_397_2_style_header-footer-properties_"><span style="margin-right:0.127cm;">20.397.2</span></a><a id="__RefHeading__1420280_253892949"/><a id="property-svg_height_element-style_header-footer-properties"/>&lt;style:header-footer-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:height</span> attribute specifies the height of a header or footer.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:height</span> attribute is usable with the following element: <span class="Element">&lt;style:header-footer-properties&gt;</span> <a href="#element-style_header-footer-properties">17.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:height</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_398svg_stroke-color"><span style="margin-right:0.127cm;">20.398</span></a><a id="__RefHeading__1420282_253892949"/><a id="property-svg_stroke-color"/>svg:stroke-color</h2><p class="Text_20_body">The <span class="Attribute">svg:stroke-color</span> attribute specifies the color of a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stroke-color</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:stroke-color</span> attribute has the data type <span class="Datatype">color</span> <a href="#datatype-color">18.3.9</a>.</p><h2 class="Heading_20_2"><a id="a20_399svg_stroke-opacity"><span style="margin-right:0.127cm;">20.399</span></a><a id="__RefHeading__1420284_253892949"/><a id="property-svg_stroke-opacity"/>svg:stroke-opacity</h2><p class="Text_20_body">The <span class="Attribute">svg:stroke-opacity</span> attribute specifies the opacity of a stroke. The value of this attribute can be a number between 0 (fully transparent) and 1 (fully opaque) or a percentage value in the range 0% to 100%.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stroke-opacity</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">svg:stroke-opacity</span> attribute are a value of type <span class="Datatype">double</span> <a href="#datatype-double">18.2</a> in the range [<span class="Attribute_20_Value">0</span>,<span class="Attribute_20_Value">1</span>] or a value of type <span class="Datatype">zeroToHundredPercent</span> <a href="#datatype-zeroToHundredPercent">18.3.41</a>.</p><h2 class="Heading_20_2"><a id="a20_400svg_stroke-width"><span style="margin-right:0.127cm;">20.400</span></a><a id="__RefHeading__1420286_253892949"/><a id="property-svg_stroke-width"/>svg:stroke-width</h2><p class="Text_20_body">The <span class="Attribute">svg:stroke-width</span> attribute specifies the width of a stroke.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:stroke-width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:stroke-width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_401svg_x"><span style="margin-right:0.127cm;">20.401</span></a><a id="__RefHeading__1420288_253892949"/><a id="property-svg_x"/>svg:x</h2><p class="Text_20_body">The <span class="Attribute">svg:x</span> attribute specifies a default horizontal position for new frames that are created using the graphics style. See <a href="#attribute-svg_x">19.573</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:x</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:x</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h2 class="Heading_20_2"><a id="a20_402svg_y"><span style="margin-right:0.127cm;">20.402</span></a><a id="__RefHeading__1420290_253892949"/><a id="property-svg_y"/>svg:y</h2><h3 class="Heading_20_3"><a id="a20_402_1_style_graphic-properties_"><span style="margin-right:0.127cm;">20.402.1</span></a><a id="__RefHeading__1420292_253892949"/><a id="property-svg_y_element-style_graphic-properties"/><a id="DDE_LINK24"/>&lt;style:graphic-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attribute specifies a default vertical position for new frames that are created using the graphics style. See <a href="#attribute-svg_y">19.577</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h3 class="Heading_20_3"><a id="a20_402_2_style_list-level-properties_"><span style="margin-right:0.127cm;">20.402.2</span></a><a id="__RefHeading__1420294_253892949"/><a id="property-svg_y_element-style_list-level-properties"/>&lt;style:list-level-properties&gt;</h3><p class="Text_20_body">The <span class="Attribute">svg:y</span> attribute specifies the vertical position of a bullet image.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:y</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:y</span> attribute has the data type <span class="Datatype">coordinate</span> <a href="#datatype-coordinate">18.3.10</a>.</p><h2 class="Heading_20_2"><a id="a20_403svg_width"><span style="margin-right:0.127cm;">20.403</span></a><a id="__RefHeading__1420296_253892949"/><a id="property-svg_width"/>svg:width</h2><p class="Text_20_body">The <span class="Attribute">svg:width</span> attribute specifies a default width for new frames that are created using the graphics style. See <a href="#attribute-svg_width">19.571</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">svg:width</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">svg:width</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_404table_align"><span style="margin-right:0.127cm;">20.404</span></a><a id="__RefHeading__1420298_253892949"/><a id="property-table_align"/>table:align</h2><p class="Text_20_body">The <span class="Attribute">table:align</span> attribute specifies the horizontal alignment of a table.</p><p class="Text_20_body">The defined values for the <span class="Attribute">table:align</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">center</span>: table aligns to the center between left and right margins.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">left</span>: table aligns to the left margin.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">margins</span>: table fills all the space between the left and right margins.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">right</span>: table aligns to the right margin.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Consumers that do not support the <span class="Attribute_20_Value">margins</span> value, may treat this value as left.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:align</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:align</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">center</span>, <span class="Attribute_20_Value">right</span> or <span class="Attribute_20_Value">margins</span>.</p><h2 class="Heading_20_2"><a id="a20_405table_border-model"><span style="margin-right:0.127cm;">20.405</span></a><a id="__RefHeading__1420300_253892949"/><a id="property-table_border-model"/>table:border-model</h2><p class="Text_20_body">The <span class="Attribute">table:border-model</span> attribute specifies what border model to use when creating a table with a border. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:border-mode</span><span class="Attribute">l</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">collapsing</span>: when two adjacent cells have different borders, the wider border appears as the border between the cells. Each cell receives half of the width of the border.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">separating</span>: borders appear within the cell that specifies the border.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">In OpenDocument, a row height or column width includes any space required to display borders or padding. This means that, while the width and height of the content area is less than the column width and row height, the sum of the widths of all columns is equal to the total width of the table.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:border-model</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">table:border-model</span> attribute are <span class="Attribute_20_Value">collapsing</span> or <span class="Attribute_20_Value">separating</span>.</p><h2 class="Heading_20_2"><a id="a20_406table_display"><span style="margin-right:0.127cm;">20.406</span></a><a id="__RefHeading__1420302_253892949"/><a id="property-table_display"/>table:display</h2><p class="Text_20_body">The <span class="Attribute">table:display</span> attribute specifies whether a table is displayed. </p><p class="Text_20_body">The defined values for the <span class="Attribute">table:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: table should not be displayed.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: table should be displayed.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">table:display</span> attribute is usable with the following element: <span class="Element">&lt;style:table-properties&gt;</span> <a href="#element-style_table-properties">17.15</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">table:display</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_407text_anchor-page-number"><span style="margin-right:0.127cm;">20.407</span></a><a id="__RefHeading__1420304_253892949"/><a id="property-text_anchor-page-number"/>text:anchor-page-number</h2><p class="Text_20_body">The <span class="Attribute">text:anchor-page-number</span> attribute specifies the physical page number of an anchor if the drawing object is bound to a page within a text document.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:anchor-page-number</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:anchor-page-number</span> attribute has the data type <span class="Datatype">positiveInteger</span> <a href="#datatype-positiveInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_408text_anchor-type"><span style="margin-right:0.127cm;">20.408</span></a><a id="__RefHeading__1420306_253892949"/><a id="property-text_anchor-type"/>text:anchor-type</h2><p class="Text_20_body">The <span class="Attribute">text:anchor-type</span> attribute specifies how a frame is bound to a text document. The anchor position is the point at which a frame is bound to a text document. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:anchor-type</span> attribute are shown in Table <a href="#refTable23">24</a>.</p><p class="Table">Table <a id="refTable23"/>24 - Text anchor positions</p><table border="0" cellspacing="0" cellpadding="0" class="Table16"><colgroup><col width="138"/><col width="193"/><col width="189"/><col width="146"/></colgroup><tr><td style="text-align:left;width:1.2431in; " class="Table16_A1"><p class="Table_20_Heading">If the value of the <span class="Attribute">text:anchor-type</span> attribute is ...</p></td><td style="text-align:left;width:1.7361in; " class="Table16_A1"><p class="Table_20_Heading">The anchor position is...</p></td><td style="text-align:left;width:1.7069in; " class="Table16_A1"><p class="Table_20_Heading">The drawing shape element appears ...</p></td><td style="text-align:left;width:1.3139in; " class="Table16_D1"><p class="Table_20_Heading">Notes</p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table16_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">as-char</span></p></td><td style="text-align:left;width:1.7361in; " class="Table16_A2"><p class="Table_20_Contents">There is no anchor position. The drawing shape behaves like a character.</p></td><td style="text-align:left;width:1.7069in; " class="Table16_A2"><p class="Table_20_Contents">At the position where the character appears in the document.</p></td><td style="text-align:left;width:1.3139in; " class="Table16_D2"><p class="Table_20_Contents"> </p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table16_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">char</span></p></td><td style="text-align:left;width:1.7361in; " class="Table16_A2"><p class="Table_20_Contents">The character after the drawing shape element.</p></td><td style="text-align:left;width:1.7069in; " class="Table16_A2"><p class="Table_20_Contents">Just before the character.</p></td><td style="text-align:left;width:1.3139in; " class="Table16_D2"><p class="Table_20_Contents"> </p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table16_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">frame</span></p></td><td style="text-align:left;width:1.7361in; " class="Table16_A2"><p class="Table_20_Contents">The parent text box that the current drawing shape element is contained in.</p></td><td style="text-align:left;width:1.7069in; " class="Table16_A2"><p class="Table_20_Contents">In the element representing the text box to which the drawing object is bound.</p><p class="Text_20_body">If an image is bound to a text box, the image element is located in the text box element.</p></td><td style="text-align:left;width:1.3139in; " class="Table16_D2"><p class="Table_20_Contents"> </p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table16_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">page</span></p></td><td style="text-align:left;width:1.7361in; " class="Table16_A2"><p class="Table_20_Contents">The page that has the same physical page number as the value of the <span class="Attribute">text:anchor-page-</span><span class="Attribute">number</span> attribute that is attached to the drawing shape element. If no <span class="Attribute">text:anchor-page-</span><span class="Attribute">number</span> attribute is given, the anchor position is the page at which the character behind the drawing object element appears.</p></td><td style="text-align:left;width:1.7069in; " class="Table16_A2"><p class="Table_20_Contents">Either</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>At the start of the document body, outside any paragraph or frame, provided a <span class="Attribute">text:anchor-</span><span class="Attribute">page-number</span> attribute is given.<span class="odfLiEnd"/> </p></li></ul><p class="Table_20_Contents">Or</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Inside any paragraph element that is not contained in a header, footer, footnote, or text box, if a <span class="Attribute">text:anchor-</span><span class="Attribute">page-number</span> attribute is not given.<span class="odfLiEnd"/> </p></li></ul></td><td style="text-align:left;width:1.3139in; " class="Table16_D2"><p class="Table_20_Contents">The physical page number is the number assigned to the page if all pages in the document are counted starting with page 1.</p></td></tr><tr><td style="text-align:left;width:1.2431in; " class="Table16_A2"><p class="Table_20_Contents"><span class="Attribute_20_Value">paragraph</span></p></td><td style="text-align:left;width:1.7361in; " class="Table16_A2"><p class="Table_20_Contents">The paragraph that the current drawing shape element is contained in.</p></td><td style="text-align:left;width:1.7069in; " class="Table16_A2"><p class="Table_20_Contents">At the start of the paragraph element.</p></td><td style="text-align:left;width:1.3139in; " class="Table16_D2"><p class="Table_20_Contents"> </p></td></tr></table><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:anchor-type</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:anchor-type</span> attribute are <span class="Attribute_20_Value">page</span>, <span class="Attribute_20_Value">frame</span>, <span class="Attribute_20_Value">paragraph</span>, <span class="Attribute_20_Value">char</span> or <span class="Attribute_20_Value">as-char</span>.</p><h2 class="Heading_20_2"><a id="a20_409text_animation"><span style="margin-right:0.127cm;">20.409</span></a><a id="__RefHeading__1420308_253892949"/><a id="property-text_animation"/>text:animation</h2><p class="Text_20_body">The <span class="Attribute">text:animation</span> attribute specifies the type of animation that is used for a text.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:animation</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">alternate</span>: scrolls the text from one side to another and back.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: disables the text animation.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">scroll</span>: scrolls the text from one side to another.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">slide</span>: scrolls the text from one side to the original text position and stops there.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:animation</span> attribute are <span class="Attribute_20_Value">none</span>, <span class="Attribute_20_Value">scroll</span>, <span class="Attribute_20_Value">alternate</span> or <span class="Attribute_20_Value">slide</span>.</p><h2 class="Heading_20_2"><a id="a20_410text_animation-delay"><span style="margin-right:0.127cm;">20.410</span></a><a id="__RefHeading__1420310_253892949"/><a id="property-text_animation-delay"/>text:animation-delay</h2><p class="Text_20_body">The <span class="Attribute">text:animation-delay</span> attribute specifies a delay before an animation is started.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation-delay</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:animation-delay</span> attribute has the data type <span class="Datatype">duration</span> <a href="#datatype-duration">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_411text_animation-direction"><span style="margin-right:0.127cm;">20.411</span></a><a id="__RefHeading__1420312_253892949"/><a id="property-text_animation-direction"/>text:animation-direction</h2><p class="Text_20_body">The <span class="Attribute">text:animation-direction</span> attribute specifies the scroll direction of animated text. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:animation-direction</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">down</span>: animated text scrolls down.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">l</span><span class="Attribute_20_Value">eft</span>: animated text scrolls left.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">r</span><span class="Attribute_20_Value">ight</span>: animated text scrolls right.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">u</span><span class="Attribute_20_Value">p</span>: animated text scrolls up.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation-direction</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:animation-direction</span> attribute are <span class="Attribute_20_Value">left</span>, <span class="Attribute_20_Value">right</span>, <span class="Attribute_20_Value">up</span> or <span class="Attribute_20_Value">down</span>.</p><h2 class="Heading_20_2"><a id="a20_412text_animation-repeat"><span style="margin-right:0.127cm;">20.412</span></a><a id="__RefHeading__1420314_253892949"/><a id="property-text_animation-repeat"/>text:animation-repeat</h2><p class="Text_20_body">The <span class="Attribute">text:animation-repeat</span> attribute specifies the number of times an animation is repeated. If the value of the attribute is <span class="Attribute_20_Value_20_Instance">0</span>, the animation is repeated indefinitely.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation-repeat</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:animation-repeat</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_413text_animation-start-inside"><span style="margin-right:0.127cm;">20.413</span></a><a id="__RefHeading__1420316_253892949"/><a id="property-text_animation-start-inside"/>text:animation-start-inside</h2><p class="Text_20_body">The <span class="Attribute">text:animation-start-inside</span> attribute specifies if a text animation starts inside or outside a shape. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:animation-start-inside</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text starts its animation just outside the shape's bounding rectangle.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text starts its animation inside the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation-start-inside</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:animation-start-inside</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_414text_animation-steps"><span style="margin-right:0.127cm;">20.414</span></a><a id="__RefHeading__1420318_253892949"/><a id="property-text_animation-steps"/>text:animation-steps</h2><p class="Text_20_body">The <span class="Attribute">text:animation-steps</span> attribute specifies the distance by which text is moved within a scrolling step.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation-steps</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:animation-steps</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><h2 class="Heading_20_2"><a id="a20_415text_animation-stop-inside"><span style="margin-right:0.127cm;">20.415</span></a><a id="__RefHeading__1420320_253892949"/><a id="property-text_animation-stop-inside"/>text:animation-stop-inside</h2><p class="Text_20_body">The <span class="Attribute">text:animation-stop-inside</span> attribute specifies if a text animation stops inside or outside a shape. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:animation-stop-inside</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text stops its animation outside the shape's bounding rectangle.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text stops its animation when it is inside the shape.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:animation-stop-inside</span> attribute is usable with the following element: <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:animation-stop-inside</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_416text_condition"><span style="margin-right:0.127cm;">20.416</span></a><a id="__RefHeading__1420322_253892949"/><a id="property-text_condition"/>text:condition</h2><p class="Text_20_body">The <span class="Attribute">text:condition</span> attribute specifies the display of text.</p><p class="Text_20_body">The defined value of the <span class="Attribute">text:condition</span> attribute is <span class="Attribute_20_Value">none</span>, which means text is hidden.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:condition</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The only value of the <span class="Attribute">text:condition</span> attribute is <span class="Attribute_20_Value">none</span>.</p><h2 class="Heading_20_2"><a id="a20_417text_display"><span style="margin-right:0.127cm;">20.417</span></a><a id="__RefHeading__1420324_253892949"/><a id="property-text_display"/>text:display</h2><p class="Text_20_body">The <span class="Attribute">text:display</span> attribute specifies whether text is hidden. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:display</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">condition</span>: text is hidden under the condition specified in the <span class="Attribute">text:condition</span> attribute.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">none</span>: text is hidden unconditionally.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text is displayed. This is the default setting.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:display</span> attribute is usable with the following element: <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:display</span> attribute are <span class="Attribute_20_Value">true</span>, <span class="Attribute_20_Value">none</span> or <span class="Attribute_20_Value">condition</span>.</p><h2 class="Heading_20_2"><a id="a20_418text_dont-balance-text-columns"><span style="margin-right:0.127cm;">20.418</span></a><a id="__RefHeading__1420326_253892949"/><a id="property-text_dont-balance-text-columns"/>text:dont-balance-text-columns</h2><p class="Text_20_body">The <span class="Attribute">text:dont-balance-text-columns</span> attribute specifies whether the text column content should be evenly distributed over all text columns or not.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:dont-balance-text-columns</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: text column content should not be evenly distributed over all text columns in a set of columns.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: text column content should be evenly distributed over all text columns in a set of columns.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:dont-balance-text-columns</span> attribute is usable with the following element: <span class="Element">&lt;style:section-properties&gt;</span> <a href="#element-style_section-properties">17.11</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:dont-balance-text-columns</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_419text_line-break"><span style="margin-right:0.127cm;">20.419</span></a><a id="__RefHeading__1420328_253892949"/><a id="property-text_line-break"/>text:line-break</h2><p class="Text_20_body">The <span class="Attribute">text:line-break</span> attribute specifies whether word wrapping is allowed for axis labels.</p><p class="Text_20_body">This attribute is evaluated for a chart style that is applied to a <span class="Element">&lt;chart:axis&gt;</span> element.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:line-break</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: word wrapping should not be allowed for axis labels.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: word wrapping should be allowed for axis labels.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:line-break</span> attribute is usable with the following element: <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:line-break</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_420text_line-number"><span style="margin-right:0.127cm;">20.420</span></a><a id="__RefHeading__1420330_253892949"/><a id="property-text_line-number"/>text:line-number</h2><p class="Text_20_body">The <span class="Attribute">text:line-number</span> attribute specifies a new start value for line numbering, if a <span class="Attribute">text:number-lines</span> attribute, with the value <span class="Attribute_20_Value">true</span>, appears on the same <span class="Element">&lt;style:paragraph-properties&gt;</span> element. Otherwise, this attribute shall be ignored.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:line-number</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:line-number</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">18.2</a>.</p><h2 class="Heading_20_2"><a id="a20_421text_list-level-position-and-space-mode"><span style="margin-right:0.127cm;">20.421</span></a><a id="__RefHeading__1420332_253892949"/><a id="property-text_list-level-position-and-space-mode"/>text:list-level-position-and-space-mode</h2><p class="Text_20_body">The <span class="Attribute">text:list-level-position-and-space-mode</span> attribute specifies how the position and spacing of the list labels (numbers or bullets) is defined. </p><p class="Text_20_body">The defined values for the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">label-alignment</span>: The <span class="Element">&lt;style:list-level-label-alignment&gt;</span> element and the <span class="Attribute">fo:text-align</span> attribute are used to define the position and spacing of the list label and the list item. The values of the attributes for <span class="Attribute">text:space-before</span>, <span class="Attribute">text:min-label-width</span> and <span class="Attribute">text:min-label-distance</span> are assumed to be <span class="Attribute_20_Value_20_Instance">0</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">label-width-and-position</span>: The <span class="Attribute">text:space-before</span>, <span class="Attribute">text:min-label-width</span>, <span class="Attribute">text:min-label-distance</span> and <span class="Attribute">fo:text-align</span> attributes are used to define the position and spacing of the list label and the list item.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default value of the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute is <span class="Attribute_20_Value">label-width-and-position</span>. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:list-level-position-and-space-mode</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute are <span class="Attribute_20_Value">label-width-and-position</span> or <span class="Attribute_20_Value">label-alignment</span>.</p><h2 class="Heading_20_2"><a id="a20_422text_min-label-distance"><span style="margin-right:0.127cm;">20.422</span></a><a id="__RefHeading__1420334_253892949"/><a id="property-text_min-label-distance"/>text:min-label-distance</h2><p class="Text_20_body">The <span class="Attribute">text:min-label-distance</span> attribute specifies the minimum distance between a number and a list item.</p><p class="Text_20_body">The content of a list label is rendered inside a specified minimum width - <span class="Attribute">text:min-label-width</span>. <a href="#property-text_min-label-width">20.423</a> The text of a list item is rendered following the label width area. If the distance between a list label and the text of a list item is smaller than the value of the <span class="Attribute">text:min-label-distance</span> attribute, the following actions are performed. First, the content of the list label is moved inside the specified minimum label width up to the value of the <span class="Attribute">text:min-label-</span><span class="Attribute">distance</span> attribute. If that does not result in a value equal to the <span class="Attribute">text:min-label-distance</span> attribute, the text of the list item is moved until the distance between the list label and text of list item equals the value of the <span class="Attribute">text:min-label-distance</span> attribute.</p><p class="Text_20_body">This attribute can be associated with a formatting properties element that is contained in a <span class="Alien_20_Element">&lt;text:list-level-style-*&gt;</span> element.</p><p class="Text_20_body">The attribute will be evaluated only if the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute has the value <span class="Attribute_20_Value">label-width-and-position</span> or is not present. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:min-label-distance</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:min-label-distance</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_423text_min-label-width"><span style="margin-right:0.127cm;">20.423</span></a><a id="__RefHeading__1420336_253892949"/><a id="property-text_min-label-width"/>text:min-label-width</h2><p class="Text_20_body">The <span class="Attribute">text:min-label-width</span> attribute specifies the minimum width of a list label.</p><p class="Text_20_body">This attribute can be associated with a formatting properties element that is contained in a <span class="Alien_20_Element">&lt;text:list-level-style-*&gt;</span> element.</p><p class="Text_20_body">The list label can be aligned horizontally within the specified minimum width using the <span class="Attribute">fo:text-align</span> attribute. If the actual width of the list label is greater than the specified minimum width no alignment takes place.</p><p class="Text_20_body">The attribute will be evaluated only if the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute has the value <span class="Attribute_20_Value">label-width-and-position</span> or is not present. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:min-label-width</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:min-label-width</span> attribute has the data type <span class="Datatype">nonNegativeLength</span> <a href="#datatype-nonNegativeLength">18.3.20</a>.</p><h2 class="Heading_20_2"><a id="a20_424text_number-lines"><span style="margin-right:0.127cm;">20.424</span></a><a id="__RefHeading__1420338_253892949"/><a id="property-text_number-lines"/>text:number-lines</h2><p class="Text_20_body">The <span class="Attribute">text:number-lines</span> attribute specifies whether lines are numbered.</p><p class="Text_20_body">The defined values for the <span class="Attribute">text:number-lines</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">false</span>: lines should not be numbered.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute_20_Value">true</span>: lines should be numbered.<span class="odfLiEnd"/> </p></li></ul><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:number-lines</span> attribute is usable with the following element: <span class="Element">&lt;style:paragraph-properties&gt;</span> <a href="#element-style_paragraph-properties">17.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:number-lines</span> attribute has the data type <span class="Datatype">boolean</span> <a href="#datatype-boolean">18.3.3</a>.</p><h2 class="Heading_20_2"><a id="a20_425text_space-before"><span style="margin-right:0.127cm;">20.425</span></a><a id="__RefHeading__1420340_253892949"/><a id="property-text_space-before"/>text:space-before</h2><p class="Text_20_body">The <span class="Attribute">text:space-before</span> attribute specifies the space to include before a number for all paragraphs at a specified level. If a paragraph has a left margin greater than 0, the position of the list label box is the left margin width plus the start indent value.</p><p class="Text_20_body">This attribute can be associated with a formatting properties element that is contained in a <span class="Alien_20_Element">&lt;text:list-level-style-*&gt;</span> element.</p><p class="Text_20_body">This attribute is evaluated only if the <span class="Attribute">text:list-level-position-and-space-mode</span> attribute has the value <span class="Attribute_20_Value">label-width-and-position</span> or is not present. </p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">text:space-before</span> attribute is usable with the following element: <span class="Element">&lt;style:list-level-properties&gt;</span> <a href="#element-style_list-level-properties">17.19</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">text:space-before</span> attribute has the data type <span class="Datatype">length</span> <a href="#datatype-length">18.3.18</a>.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix A. </span><a id="__RefHeading__1420384_253892949"/><a id="Appendix_A"/>OpenDocument Relax NG Schema<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The OpenDocument Relax-NG (see <a title="Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG" href="http://oasis-open.org/committees/relax-ng/spec-20011203.html">[RNG]</a>) schema is defined by a separate document, whose location can be found in the <a href="#Related_Work">Related work</a> section on the introductory pages.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix B. </span><a id="__RefHeading__1420386_253892949"/><a id="Appendix_B"/>OpenDocument Metadata Manifest Ontology<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The OpenDocument metadata manifest ontology is defined by a separate document, whose location can be found in the <a href="#Related_Work">Related work</a> section on the introductory pages.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix C. </span><a id="__RefHeading__1420388_253892949"/><a id="Appendix_C"/>MIME Types and File Name Extensions (Non Normative)<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The following table contains a list of MIME types and file name extensions for OpenDocument documents, that, at the time this specification is published, have been registered according to <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a>. Please see <a title="MIME Media Types" href="http://www.iana.org/assignments/media-types/">[MIMETYPES]</a> for a current list of registered MIME types.</p><p class="Text_20_body">Registered MIME types are for use with documents contained in OpenDocument packages. </p><p class="Table">Table <a id="refTable24"/>25 - Registered MIME types</p><table border="0" cellspacing="0" cellpadding="0" class="RegisteredMIMETypes"><colgroup><col width="430"/><col width="36"/><col width="200"/></colgroup><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A1"><p class="Table_20_Heading">MIME type</p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A1"><p class="Table_20_Heading">Ext.</p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C1"><p class="Table_20_Heading">Description</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">text</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odt</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Text document</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">text-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">ott</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Text document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">graphics</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odg</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Text_20_body">Graphics document (Drawing)</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">graphics-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">otg</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Drawing document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">presentation</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odp</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Presentation document</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">presentation-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">otp</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Presentation document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">spreadsheet</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">ods</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Spreadsheet document</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">spreadsheet-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">ots</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Spreadsheet document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">chart</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odc</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Chart document</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">chart-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">otc</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Chart document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">image</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odi</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Image document</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">image-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">oti</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Image document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">formula</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odf</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Formula document</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/<br/> </span><span class="Source_20_Text"><span class="T1"> </span></span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">formula-template</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">otf</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Formula document used as template</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">text-master</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odm</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Global Text document. See section <a href="#attribute-text_global">19.806</a>.</p></td></tr><tr><td style="text-align:left;width:3.8743in; " class="RegisteredMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">text-web</span></p></td><td style="text-align:left;width:0.3236in; " class="RegisteredMIMETypes_A2"><p class="Table_20_Contents"><span class="Source_20_Text">oth</span></p></td><td style="text-align:left;width:1.8021in; " class="RegisteredMIMETypes_C2"><p class="Table_20_Contents">Text document used as template for HTML documents</p></td></tr></table><p class="Text_20_body">The following table contains a list of MIME types and file name extensions for office documents that conform to this specification where a registration according to <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a> is in progress at the time this specification is published.</p><p class="Text_20_body">Please check <a title="MIME Media Types" href="http://www.iana.org/assignments/media-types/">[MIMETYPES]</a> before using these MIME types. If a MIME type is not listed there, the MIME type that is the result of inserting "<span class="Source_20_Text">x-</span>" behind the "/" (U+002F, SOLIDUS) character (<span class="Source_20_Text">application/x-</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">text</span>) should be used.</p><p class="Table">Table <a id="refTable25"/>26 - Recommended MIME types</p><table border="0" cellspacing="0" cellpadding="0" class="RecommendedMIMETypes"><colgroup><col width="429"/><col width="36"/><col width="201"/></colgroup><tr><td style="text-align:left;width:3.8632in; " class="RecommendedMIMETypes_A1"><p class="Table_20_Heading">MIME type</p></td><td style="text-align:left;width:0.3243in; " class="RecommendedMIMETypes_A1"><p class="Table_20_Heading">Ext.</p></td><td style="text-align:left;width:1.8125in; " class="RecommendedMIMETypes_C1"><p class="Table_20_Heading">Description</p></td></tr><tr><td style="text-align:left;width:3.8632in; " class="RecommendedMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">application/</span><span class="Source_20_Text">vnd.oasis.opendocument.</span><span class="Source_20_Text">base</span></p></td><td style="text-align:left;width:0.3243in; " class="RecommendedMIMETypes_A2"><p class="Text_20_body"><span class="Source_20_Text">odb</span></p></td><td style="text-align:left;width:1.8125in; " class="RecommendedMIMETypes_C2"><p class="Table_20_Contents">Database front end document</p></td></tr></table><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix D. </span><a id="__RefNumPara__203307_1700520208"/><a id="__RefHeading__440376_826425813"/><a id="Appendix_D"/><a id="AccessibilityGuidelines"/>Accessibility Guidelines (Non Normative)<span class="odfLiEnd"/> </p><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">D.1.</span><a id="__RefHeading__1420390_253892949"/><a id="Appendix_D_1"/>Title, Description and Caption of Graphical Elements<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">OpenDocument provides conventions to support accessible names, descriptions and captions for graphical elements.</p><p class="Text_20_body">Accessible names, if available, are represented by the <span class="Element">&lt;svg:title&gt;</span> element. <a href="#element-svg_title">10.3.17</a> If the <span class="Element">&lt;svg:title&gt;</span> element is not available, any text referenced by a <span class="Attribute">draw:caption-id</span> attribute is used as the title. <a href="#attribute-draw_caption-id">19.115</a></p><p class="Text_20_body">When transforming from another document format to OpenDocument the short names, like HTML's alt text on the <span class="Alien_20_Element">&lt;img&gt;</span> elements shall be mapped to the <span class="Element">&lt;svg:title&gt;</span> element.</p><p class="Text_20_body">User agents shall not manufacture names for the <span class="Element">&lt;svg:title&gt;</span> element, such as using the drawing object name followed by a cardinal number in a string as it is used for accessibility. Such name assignments provide no semantic meaning to the user.</p><p class="Text_20_body">Accessible descriptions, if available, are represented by the <span class="Element">&lt;svg:desc&gt;</span> element. <a href="#element-svg_desc">10.3.18</a></p><p class="Text_20_body">If a user agent supports relationships between graphic elements and their captions, the value of the <span class="Attribute">draw:caption-id</span> attribute for a graphical element should be used to for that relationship. <a href="#attribute-draw_caption-id">19.115</a></p><ol><li><ol><li><ol><li><p class="Appendix_20_Heading_20_3" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.27cm">D.1.1.</span><a id="__RefHeading__1420392_253892949"/><a id="Appendix_D_1_1"/>Guidance for authors<span class="odfLiEnd"/> </p></li></ol></li></ol></li></ol><p class="Text_20_body">Authors should not assign names to objects having no semantic value. If no name is assigned the caption text will be used in its place. The <span class="Element">&lt;svg:title&gt;</span> element shall take precedence over the caption text for accessible name assignment by the user agent.</p><p class="Text_20_body">Assignment of the long description should only be necessary when a drawing object is significantly complex and the user needs more information to describe it. Long descriptions would be more applicable to drawing groupings than basic drawing shapes.</p><ol><li><ol><li><ol><li><p class="Appendix_20_Heading_20_3" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.27cm">D.1.2.</span><a id="__RefHeading__1420394_253892949"/><a id="Appendix_D_1_2"/>Authoring tool responsibility for presenting and prompting for the <span class="Element">&lt;svg:title&gt;</span> and <span class="Element">&lt;svg:desc&gt;</span> elements<span class="odfLiEnd"/> </p></li></ol></li></ol></li></ol><p class="Text_20_body">Authoring tools should provide an option from an objects context menu to allow the user to enter the text for either of these elements as a minimum. More proactive authoring tools should have a facility for prompting the author for this text. Since the <span class="Element">&lt;svg:desc&gt;</span> element is a long description, a text area vs. a text field should be used to prompt the user accordingly in GUI-based authoring tools like office applications.</p><p class="Text_20_body">Navigation tools used to list the objects in the view should provide the type of object followed by the contents of <span class="Element">&lt;svg:title&gt;</span> element. </p><p class="Text_20_body">For <span class="Element">&lt;draw:g&gt;</span> elements the drawing objects which are members of the group should visible only when the group is expanded.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">D.2.</span><a id="__RefHeading__1420396_253892949"/><a id="Appendix_D_2"/><a id="Hyperlink_Titles"/>Hyperlink Titles<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">When transforming from another document format to OpenDocument the alt text of hyperlinks, shall be mapped to the <span class="Attribute">office:title</span> attribute of <span class="Element">&lt;text:a&gt;</span> elements (see <a href="#element-text_a">6.1.8</a>) or <span class="Element">&lt;draw:a&gt;</span> elements. <a href="#datatype-zeroToHundredPercent">18.3.41</a> When exporting OpenDocument documents to HTML, the contents of title text should be mapped to title attribute text on HTML anchor tags. As a minimum, authoring tools should provide a mechanism to provide the hint text.</p><p class="Text_20_body">The title text should be made accessible to the assistive technology and user. The user agent should allow for programmatic access through standard accessibility APIs such as the accessible description. Users should experience visible access to the hint text via the keyboard or mouse.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">D.3.</span><a id="__RefHeading__1420398_253892949"/><a id="Appendix_D_3"/>Tables in Presentations<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">Users importing non-OpenDocument slides that contain tables need access to the table structure via their assistive technology. Therefore tables imported into an OpenDocument application from another file format must have their structure preserved, and when saved as OpenDocument should be saved as as embedded spreadsheets.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">D.4.</span><a id="__RefHeading__1420400_253892949"/><a id="Appendix_D_4"/>Further Guidelines<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">Additional, non-normative Accessibility Guidelines are available at: <a href="http://docs.oasis-open.org/office/office-accessibility/guidelines">http://docs.oasis-open.org/office/office-accessibility/guidelines</a>. That more comprehensive document will be the up-to-date set of recommendations for what all OpenDocument applications should do in order to fully support accessibility.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix E. </span><a id="__RefHeading__1420402_253892949"/><a id="Appendix_E"/>Bidirectional (BiDi) Scripts,Numeric Digits Presentation and Calendars (Non Normative)<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">This appendix specifies how bidirectional (BiDi) scripts and related information are represented in OpenDocument.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">E.1.</span><a id="__RefHeading__1420404_253892949"/><a id="Appendix_E_1"/>Paragraph and Layout Direction<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">In OpenDocument, the direction of text runs inside a paragraph is calculated using the Unicode BiDi Algorithm. See <a title="The Bidirectional Algorithm" href="http://www.unicode.org/reports/tr9/tr9-15.html">[UAX9]</a>. The paragraph direction, as required by the BiDi Algorithm (see BD5 of <a title="The Bidirectional Algorithm" href="http://www.unicode.org/reports/tr9/tr9-15.html">[UAX9]</a>), and the display direction of layout objects like table or page columns (in the following called layout direction) is controlled by a writing mode attribute (<span class="Attribute">style:writing-mode</span>) that can be used within styles.</p><p class="Text_20_body">The writing mode attribute can be applied individually to paragraph styles, page styles, section styles, table styles, table cell styles, graphic styles and chart styles. If present within a paragraph style, it controls the paragraph direction of those paragraphs, to which the style is applied. If present within a page style, section style, table style, table cell style, graphic style or chart style, it controls the layout direction of those pages, text sections, tables, table cells, text-boxes and chart objects to which the styles is applied.</p><p class="Text_20_body">Section <a href="#property-style_writing-mode">20.394</a> specifies the <span class="Attribute">style:writing-mode</span> attribute for page styles. It may, among other values, take the values <span class="Attribute_20_Value">lr-tb</span> (left-to-right, top-to-bottom) and <span class="Attribute_20_Value">rl-tb</span> (right-to-left, top-to-bottom). The writing-mode attribute of a page style specifies the layout direction of page columns (left-to-right or right-to-left) for pages that are formatted using the page style.</p><p class="Text_20_body">Section <a href="#property-style_writing-mode">20.394</a> specifies the <span class="Attribute">style:writing-mode</span> attribute for paragraph styles. It specifies the paragraph direction as defined in BD5 of <a title="The Bidirectional Algorithm" href="http://www.unicode.org/reports/tr9/tr9-15.html">[UAX9]</a> for all paragraphs that have the paragraph style assigned. For paragraphs that are contained in lists, it further specifies whether the list numbers and bullets are displayed on the left or on the right of the paragraph.</p><p class="Text_20_body">The writing mode attribute for paragraph styles takes the same values as the writing mode attribute for page styles, but may also take the value <span class="Attribute_20_Value">page</span>. This value specifies that the paragraph direction is inherited from the layout direction of the closest layout object (section, table or text-box) in which the paragraph is contained, and which has a layout direction other than <span class="Attribute_20_Value">page</span>. If the paragraph is not contained in any of these layout objects, the paragraph direction is inherited from the page on which the paragraph appears.</p><p class="Text_20_body">The paragraph direction specifies the default bidirectional orientation of the text in that paragraph. The result of the BiDi Algorithm can be manually changed by inserting BiDi embedding control characters (U+202A ... U+202E) and implicit directional marks (U+200E ...U+200F) into the text. See <a title="Unicode in XML and other Markup Languages" href="http://www.unicode.org/reports/tr20/tr20-7.html">[UTR20]</a>.</p><p class="Text_20_body">OpenDocument further has a <span class="Attribute">style:writing-mode-automatic</span> attribute (described in section <a href="#property-style_writing-mode-automatic">20.395</a>) that specifies that a consumer is allowed to recalculate the value of the paragraph's writing-mode attribute based on its content whenever the content changes.</p><p class="Text_20_body">Section <a id="DDE_LINK14"/><a href="#property-style_writing-mode">20.394</a> specifies the <span class="Attribute">style:writing-mode</span> attribute for section styles. It may take the same values as the writing mode attribute for paragraph styles.</p><p class="Text_20_body">The writing-mode attribute of a section style specifies the layout direction of section columns (left-to-right or right-to-left) for text sections that have the section style assigned. If the attribute value is <span class="Attribute_20_Value">page</span> the layout direction is inherited from the layout direction of the closest layout object (section, table, table-cell or text-box) in which the section is contained, and which has a layout direction other than <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">Section <a href="#property-style_writing-mode">20.394</a> specifies the <span class="Attribute">style:writing-mode</span> attribute for table styles. It may take the same values as the writing mode attribute for paragraph styles.</p><p class="Text_20_body">The writing-mode attribute of a table style specifies the layout direction of table cells (left-to-right or right-to-left) for tables that have the table style assigned. If the attribute value is <span class="Attribute_20_Value">page</span> the layout direction is inherited from the layout direction of the closest layout object (section, table, table-cell or text-box) in which the table is contained, and which has a layout direction other than <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">Section <a href="#property-style_writing-mode">20.394</a> specifies the <span class="Attribute">style:writing-mode</span> attribute for table cell styles. It may take the same values as the writing mode attribute for paragraph styles.</p><p class="Text_20_body">The writing-mode attribute of a table cell style specifies the layout direction of table cells (left-to-right or right-to-left) that have the table style assigned. If the attribute value is <span class="Attribute_20_Value">page</span> the layout direction is inherited from the layout direction of the closest layout object (table, section or text-box) in which the table is contained, and which has a layout direction other than <span class="Attribute_20_Value">page</span>.</p><p class="Text_20_body">Section <a href="#property-style_writing-mode">20.394</a> specifies the <span class="Attribute">style:writing-mode</span> attribute for graphic styles. It may take the same values as the writing mode attribute for paragraph styles.</p><p class="Text_20_body">The writing-mode attribute of a graphic style specifies the layout direction of columns (left-to-right or right-to-left) for text-boxes that have the graphic style assigned. If the attribute value is <span class="Attribute_20_Value">page</span> the layout direction for text-boxes that are anchored to a page is inherited from the layout direction of the page on which the text-box is displayed. For text-boxes that have a different anchor type, the layout direction is inherited from the paragraph direction of the paragraph that contains the text-box.</p><p class="Text_20_body">The writing mode for chart styles is described by the same attribute as for paragraph styles. See <a href="#property-style_writing-mode">20.394</a>.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">E.2.</span><a id="__RefHeading__1420406_253892949"/><a id="Appendix_E_2"/>Numeric Digits Presentation and Calendars<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">All digits that have a Unicode code point can be included in an OpenDocument document.</p><p class="Text_20_body"><span class="Note_20_Label">Note 1:</span>  office application have a feature that allows the user to specify whether the ASCII digits U+0030 ... U+0039 should be displayed as Latin-Indic digits or as Arabic-Indic digits (U+0660 ... U+0669). Since this feature effects only what digits are displayed and does not influence the representation of digits in the document itself, OpenDocument only allows storing this setting as an implementation-dependent setting, not as document or style content.</p><p class="Text_20_body">For list numbers, that are calculated automatically, OpenDocument provides a generic mechanism to specify the applicable numbering systems. See <a href="#attribute-style_num-format">19.500</a>.</p><p class="Note"><span class="Note_20_Label">Note 2:</span> The specification currently mentions only "1, 2, 3...", "I, II, III...", and "i, ii, iii" explicitly, but the schema also allows a generic string value.</p><p class="Text_20_body">OpenDocument further supports data styles, which describe how different types of data are displayed, for example, a number or a date. Data styles are described in section <a href="#Data_Style">16.27</a>. The presentation of numeric digits can be controlled by the transliteration attributes described in sections <a href="#attribute-number_transliteration-country">19.361</a>-<a href="#attribute-number_transliteration-style">19.364</a>. The presentation of date information can be controlled by the <span class="Attribute">number:calendar</span> attribute specified in section <a href="#attribute-number_format-source">19.347</a>.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix F. </span><a id="__RefHeading__1420408_253892949"/><a id="Appendix_F"/>Recommended Usage of SMIL<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The following sections describe the usage of SMIL animation elements that enables an office application to present the animation elements in a simple and easy to use UI to the user. This UI may contain a single main sequence of effects, and in addition to this, multiple sequences of effects that are started as interactions on drawing shapes. An <span class="Def">effect</span> is a combination of one or more animation elements that animate a single shape and or a shape's paragraphs.</p><p class="Text_20_body">In user interfaces, effects should be creatable by using presets that have localized and meaningful names. This way, the user will not work on a hierarchy of SMIL animation elements, but on one dimensional lists of effects, which are much easier to handle for the office application users.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">F.1.</span><a id="__RefHeading__1420410_253892949"/><a id="Appendix_F_1"/>Slide Animation<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">Each <span class="Element">&lt;draw:page&gt;</span> element may have an <span class="Element">&lt;anim:par&gt;</span> element that defines the animation of that page during a running slideshow. This <span class="Element">&lt;anim:par&gt;</span> element should contain one <span class="Element">&lt;anim:seq&gt;</span> element which is the main sequence for shape effects and zero or more <span class="Element">&lt;anim:seq&gt;</span> elements that define interactive sequences for shapes that contain animation interactions. The animation elements are executed after the slide has executed its initial transition.</p><p class="Text_20_body">The <span class="Element">&lt;anim:par&gt;</span> element may further contain an <span class="Element">&lt;anim:par&gt;</span> element that defines the slide transition. Its <span class="Attribute">smil:begin</span> attribute shall have the value <span class="Attribute_20_Value_20_Param">&lt;id&gt;</span><span class="Attribute_20_Value_20_Fragment">.begin</span>, where <span class="Attribute_20_Value_20_Param">&lt;id&gt;</span> is the id of the slide's <span class="Element">&lt;draw:page&gt;</span> element itself. This <span class="Element">&lt;anim:par&gt;</span> element can contain basic animation elements as defined in chapter <a href="#SMIL_Animations">15</a>. These elements shall specify the <span class="Element">&lt;draw:page&gt;</span> element itself as target. If such an <span class="Element">&lt;anim:par&gt;</span> element for slide transitions is present, it overrides the following presentation page formatting properties:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;presentation:sound&gt;</span>. See <a href="#element-presentation_sound">10.8.2</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">presentation:transition-speed</span>. See <a href="#property-presentation_transition-speed">20.231</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">presentation:transition-style</span>. See <a href="#property-presentation_transition-style">20.232</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">presentation:transition-type</span>. See <a href="#property-presentation_transition-type">20.233</a>.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">For backward compatibility reasons, producers that use an <span class="Element">&lt;anim:par&gt;</span> element to define the slide transition should also add the above presentation page formatting properties. This also enables consumers without SMIL support to display the slide transitions.</p><p class="Text_20_body"><span class="Example_20_Label">Example:</span> The following example defines a slide wipe transition.</p><p class="Example_borderStart">&lt;draw:page draw:id="id1"&gt;</p><p class="Example">    &lt;anim:par presentation:node-type="timing-root"&gt;</p><p class="Example">        &lt;anim:par smil:begin="id1.begin"&gt;</p><p class="Example">            &lt;anim:transitionFilter smil:dur="2s" smil:targetElement="id1"</p><p class="Example">                smil:type="slideWipe" smil:subtype="fromBottom"</p><p class="Example">                smil:direction="reverse"/&gt;</p><p class="Example">        &lt;/anim:par&gt;</p><p class="Example">    &lt;/anim:par&gt;</p><p class="Example_borderEnd">&lt;/draw:page&gt;</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">F.2.</span><a id="__RefHeading__1420412_253892949"/><a id="Appendix_F_2"/>Main Sequence<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">The main sequence is a <span class="Element">&lt;anim:seq&gt;</span> element which contains the effects that should start after the slide has executed its initial transition. Since this is a sequential container, its child nodes are executed one after each other. If a child node's <span class="Attribute">smil:begin</span> attribute has the value <span class="Attribute_20_Value">indefinite</span> execution is stalled until the user advances the slideshow by a mouse or key interaction.</p><p class="Text_20_body">The first level of child nodes in the main sequence should be <span class="Element">&lt;anim:par&gt;</span> elements that group animation elements that are started with the same user interaction. The second level of child nodes should be <span class="Element">&lt;anim:par&gt;</span> elements that group animations elements that start at the same time. The third level of child nodes should be <span class="Element">&lt;anim:par&gt;</span> elements that group the animation elements for a single effect.</p><p class="Example_20_Text_borderStart"><span class="Example_20_Label">Example:</span> The following example shows a main sequence with the effects A, B, C and D. Effect A is started on user interaction, effect B is started simultaneously with A. Effect C is started 4 seconds after the effects A and B. Effect D is started on the next user interaction:</p><p class="Example">&lt;amin:par&gt; &lt;!-- timing root--&gt;</p><p class="Example">    &lt;anim:seq&gt; &lt;!-- main sequence--&gt;</p><p class="Example">        &lt;anim:par smil:begin="indefinite"&gt;</p><p class="Example">            &lt;!-- first user interaction --&gt;</p><p class="Example">            &lt;anim:par smil:begin="0s" smil:dur="4s"&gt;</p><p class="Example">                &lt;!-- first group of effects to execute --&gt;</p><p class="Example">                &lt;anim:par&gt; &lt;!-- effect a --&gt;</p><p class="Example">                    &lt;!-- nodes for effect a--&gt;</p><p class="Example">                &lt;/anim:par&gt;</p><p class="Example">                &lt;anim:par&gt; &lt;!-- effect b --&gt;</p><p class="Example">                    &lt;!-- nodes for effect b--&gt;</p><p class="Example">                &lt;/anim:par&gt;</p><p class="Example">            &lt;/anim:par&gt;</p><p class="Example">            &lt;anim:par smil:begin="4s"&gt;</p><p class="Example">                &lt;!-- second group of effects to execute --&gt;</p><p class="Example">                &lt;anim:par&gt; &lt;!-- effect c --&gt;</p><p class="Example">                    &lt;!-- nodes for effect c--&gt;    </p><p class="Example">                &lt;/anim:par&gt;</p><p class="Example">            &lt;/anim:par&gt;</p><p class="Example">        &lt;/anim:par&gt;</p><p class="Example">        &lt;anim:par&gt;    </p><p class="Example">            &lt;!-- second user interaction--&gt;</p><p class="Example">            &lt;anim:par smil:begin="indefinite"&gt;</p><p class="Example">                &lt;!-- first group of effects to execute --&gt;</p><p class="Example">                &lt;anim:par&gt; &lt;!-- effect d --&gt;</p><p class="Example">                    &lt;!--- nodes for effect d--&gt;</p><p class="Example">                &lt;/anim:par&gt;</p><p class="Example">            &lt;/anim:par&gt;</p><p class="Example">        &lt;/anim:par&gt;</p><p class="Example">    &lt;/anim:seq&gt;</p><p class="Example_borderEnd">&lt;/anim:par&gt;</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">F.3.</span><a id="__RefHeading__1420414_253892949"/><a id="Appendix_F_3"/>Interactive Sequence<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">An interactive sequence is a <span class="Element">&lt;anim:seq&gt;</span> element that should have the same structure as a main sequence. The only difference is that the <span class="Element">&lt;anim:par&gt;</span> element in the first level has a <span class="Attribute">smil:begin</span> attribute with a value like <span class="Attribute_20_Value_20_Param">[shape-id]</span><span class="Attribute_20_Value_20_Fragment">.click</span>, where <span class="Attribute_20_Value_20_Param">[shape-id]</span> identifies a drawing shapes by its <span class="Attribute">draw:id</span> attribute. These animation elements are triggered when the user interacts with the element defined by <span class="Attribute_20_Value_20_Param">[shape-id]</span>.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix G. </span><a id="__RefHeading__1420416_253892949"/><a id="Appendix_G"/>Changes From Previous Specification Versions (Non Normative)<span class="odfLiEnd"/> </p><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">G.1.</span><a id="__RefHeading__1420418_253892949"/><a id="Appendix_G_1"/>Changes from “Open Document Format for Office Applications (OpenDocument) v1.1”<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">The OpenDocument specification has been divided into three parts and has been restructured.</p><p class="Text_20_body">This appendix describes changes that are related to part 1 of this specification.</p><p class="Text_20_body">The following is a list of major features that have been added. For minor features please see the lists of new and changed elements and attributes.</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>New conformance clauses and levels (21)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Digital signatures (3.16)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Enhanced charts, including a new chart type 'filled-radar' (<a href="#attribute-chart_class_element-chart_chart">19.15.1</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Protection keys (<a href="#attribute-table_protection-key">19.697</a> and <a href="#attribute-text_protection-key">19.850</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Encyption algorithms for protection keys (<a href="#attribute-table_protection-key-digest-algorithm">19.698</a> and <a href="#attribute-text_protection-key-digest-algorithm">19.851</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Tables in presentations (<a href="#element-table_table">9.1.2</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="line-263"/>New formatting options for lists (<a href="#element-style_list-level-label-alignment">17.20</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>New formatting options for text grids (<a href="#property-style_layout-grid-base-width">20.297</a>, <a href="#property-style_layout-grid-snap-to">20.305</a> and <a href="#property-style_layout-grid-standard-mode">20.306</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>Database front end documents (<a href="#element-office_database">12.1</a>)<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span>RDF based metadata (4.2)<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The following elements are new:</p><ul><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;chart:data-label&gt;</span> <a href="#element-chart_data-label">11.14</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;chart:equation&gt;</span> <a href="#element-chart_equation">11.18</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;chart:label-separator&gt;</span> <a href="#element-chart_label-separator">17.24</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:application-connection-settings&gt;</span> <a href="#element-db_application-connection-settings">12.15</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:auto-increment&gt;</span> <a href="#element-db_auto-increment">12.10</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:character-set&gt;</span> <a href="#element-db_character-set">12.12</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:column&gt;</span> <a href="#element-db_column">12.35</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:column-definition&gt;</span> <a href="#element-db_column-definition">12.40</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:column-definitions&gt;</span> <a href="#element-db_column-definitions">12.39</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:columns&gt;</span> <a href="#element-db_columns">12.34</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:component&gt;</span> <a href="#element-db_component">12.25.5</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:component-collection&gt;</span> <a href="#element-db_component-collection">12.25.4</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:connection-data&gt;</span> <a href="#element-db_connection-data">12.3</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:connection-resource&gt;</span> <a href="#element-db_connection-resource">12.7</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:database-description&gt;</span> <a href="#element-db_database-description">12.4</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:data-source&gt;</span> <a href="#element-db_data-source">12.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:data-source-setting&gt;</span> <a href="#element-db_data-source-setting">12.23</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:data-source-settings&gt;</span> <a href="#element-db_data-source-settings">12.22</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:data-source-setting-value&gt;</span> <a href="#element-db_data-source-setting-value">12.24</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:delimiter&gt;</span> <a href="#element-db_delimiter">12.11</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:driver-settings&gt;</span> <a href="#element-db_driver-settings">12.9</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:file-based-database&gt;</span> <a href="#element-db_file-based-database">12.5</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:filter-statement&gt;</span> <a href="#element-db_filter-statement">12.30</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:forms&gt;</span> <a href="#element-db_forms">12.25.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:index&gt;</span> <a href="#element-db_index">12.46</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:index-column&gt;</span> <a href="#element-db_index-column">12.48</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:index-columns&gt;</span> <a href="#element-db_index-columns">12.47</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:indices&gt;</span> <a href="#element-db_indices">12.45</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:key&gt;</span> <a href="#element-db_key">12.42</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:key-column&gt;</span> <a href="#element-db_key-column">12.44</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:key-columns&gt;</span> <a href="#element-db_key-columns">12.43</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:keys&gt;</span> <a href="#element-db_keys">12.41</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:login&gt;</span> <a href="#element-db_login">12.8</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:order-statement&gt;</span> <a href="#element-db_order-statement">12.29</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:queries&gt;</span> <a href="#element-db_queries">12.26</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:query&gt;</span> <a href="#element-db_query">12.28</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:query-collection&gt;</span> <a href="#element-db_query-collection">12.27</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:reports&gt;</span> <a href="#element-db_reports">12.25.3</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:schema-definition&gt;</span> <a href="#element-db_schema-definition">12.36</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:server-database&gt;</span> <a href="#element-db_server-database">12.6</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-definition&gt;</span> <a href="#element-db_table-definition">12.38</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-definitions&gt;</span> <a href="#element-db_table-definitions">12.37</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-exclude-filter&gt;</span> <a href="#element-db_table-exclude-filter">12.18</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-filter&gt;</span> <a href="#element-db_table-filter">12.16</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-filter-pattern&gt;</span> <a href="#element-db_table-filter-pattern">12.19</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-include-filter&gt;</span> <a href="#element-db_table-include-filter">12.17</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-representation&gt;</span> <a href="#element-db_table-representation">12.33</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-representations&gt;</span> <a href="#element-db_table-representations">12.32</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-setting&gt;</span> <a href="#element-db_table-setting">12.14</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-settings&gt;</span> <a href="#element-db_table-settings">12.13</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-type&gt;</span> <a href="#element-db_table-type">12.21</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:table-type-filter&gt;</span> <a href="#element-db_table-type-filter">12.20</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;db:update-table&gt;</span> <a href="#element-db_update-table">12.31</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;office:annotation-end&gt;</span> <a href="#element-office_annotation-end">14.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;office:database&gt;</span> <a href="#element-office_database">12.1</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:default-page-layout&gt;</span> <a href="#element-style_default-page-layout">16.8</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;style:list-level-label-alignment&gt;</span> <a href="#element-style_list-level-label-alignment">17.20</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:background&gt;</span> <a href="#element-table_background">16.20</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:desc&gt;</span> <a href="#element-table_desc">9.1.14</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:filter-set-item&gt;</span> <a href="#element-table_filter-set-item">9.5.6</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;table:title&gt;</span> <a href="#element-table_title">9.1.13</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:meta&gt;</span> <a href="#element-text_meta">6.1.9</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Element">&lt;text:meta-field&gt;</span> <a href="#element-text_meta-field">7.5.19</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The following attributes are new:</p><ul><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:angle-offset</span> <a href="#property-chart_angle-offset">20.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:automatic-content</span> <a href="#attribute-chart_automatic-content">19.14</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:auto-position</span> <a href="#property-chart_auto-position">20.3</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:auto-size</span> <a href="#property-chart_auto-size">20.4</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:axis-label-position</span> <a href="#property-chart_axis-label-position">20.5</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:axis-position</span> <a href="#property-chart_axis-position">20.6</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:display-equation</span> <a href="#attribute-chart_display-equation">19.19</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:display-r-square</span> <a href="#attribute-chart_display-r-square">19.20</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:error-lower-range</span> <a href="#property-chart_error-lower-range">20.16</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:error-upper-range</span> <a href="#property-chart_error-upper-range">20.21</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:group-bars-per-axis</span> <a href="#property-chart_group-bars-per-axis">20.23</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:hole-size</span> <a href="#property-chart_hole-size">20.24</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:include-hidden-cells</span> <a href="#property-chart_include-hidden-cells">20.25</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:label-position</span> <a href="#property-chart_label-position">20.31</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:label-position-negative</span> <a href="#property-chart_label-position-negative">20.32</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:reverse-direction</span> <a href="#property-chart_reverse-direction">20.44</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:right-angled-axes</span> <a href="#property-chart_right-angled-axes">20.45</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:sort-by-x-values</span> <a href="#property-chart_sort-by-x-values">20.48</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:tick-mark-position</span> <a href="#property-chart_tick-mark-position">20.63</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:treat-empty-cells</span> <a href="#property-chart_treat-empty-cells">20.64</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:additional-column-statement</span> <a href="#attribute-db_additional-column-statement">19.31</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:append-table-alias-name</span> <a href="#attribute-db_append-table-alias-name">19.32</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:apply-command</span> <a href="#attribute-db_apply-command">19.33</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:as-template</span> <a href="#attribute-db_as-template">19.34</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:base-dn</span> <a href="#attribute-db_base-dn">19.35</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:boolean-comparison-mode</span> <a href="#attribute-db_boolean-comparison-mode">19.36</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:catalog-name</span> <a href="#attribute-db_catalog-name">19.37</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:command</span> <a href="#attribute-db_command">19.38</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:database-name</span> <a href="#attribute-db_database-name">19.43</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:data-source-setting-is-list</span> <a href="#attribute-db_data-source-setting-is-list">19.39</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:data-source-setting-name</span> <a href="#attribute-db_data-source-setting-name">19.40</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:data-source-setting-type</span> <a href="#attribute-db_data-source-setting-type">19.41</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:data-type</span> <a href="#attribute-db_data-type">19.42</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:decimal</span> <a href="#attribute-db_decimal">19.44</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:default-cell-style-name</span> <a href="#attribute-db_default-cell-style-name">19.45</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:default-row-style-name</span> <a href="#attribute-db_default-row-style-name">19.46</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:delete-rule</span> <a href="#attribute-db_delete-rule">19.47</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:description</span> <a href="#attribute-db_description">19.48</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:enable-sql92-check</span> <a href="#attribute-db_enable-sql92-check">19.49</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:encoding</span> <a href="#attribute-db_encoding">19.50</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:escape-processing</span> <a href="#attribute-db_escape-processing">19.51</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:extension</span> <a href="#attribute-db_extension">19.52</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:field</span> <a href="#attribute-db_field">19.53</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:hostname</span> <a href="#attribute-db_hostname">19.54</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:ignore-driver-privileges</span> <a href="#attribute-db_ignore-driver-privileges">19.55</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-ascending</span> <a href="#attribute-db_is-ascending">19.56</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-autoincrement</span> <a href="#attribute-db_is-autoincrement">19.57</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-clustered</span> <a href="#attribute-db_is-clustered">19.58</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-empty-allowed</span> <a href="#attribute-db_is-empty-allowed">19.59</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-first-row-header-line</span> <a href="#attribute-db_is-first-row-header-line">19.60</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-nullable</span> <a href="#attribute-db_is-nullable">19.62</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-password-required</span> <a href="#attribute-db_is-password-required">19.63</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-table-name-length-limited</span> <a href="#attribute-db_is-table-name-length-limited">19.66</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:is-unique</span> <a href="#attribute-db_is-unique">19.64</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:local-socket</span> <a href="#attribute-db_local-socket">19.67</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:login-timeout</span> <a href="#attribute-db_login-timeout">19.61</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:max-row-count</span> <a href="#attribute-db_max-row-count">19.68</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:media-type</span> <a href="#attribute-db_media-type">19.69</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:name</span> <a href="#attribute-db_name">19.70</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:parameter-name-substitution</span> <a href="#attribute-db_parameter-name-substitution">19.71</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:port</span> <a href="#attribute-db_port">19.72</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:precision</span> <a href="#attribute-db_precision">19.65</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:referenced-table-name</span> <a href="#attribute-db_referenced-table-name">19.73</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:related-column-name</span> <a href="#attribute-db_related-column-name">19.74</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:row-retrieving-statement</span> <a href="#attribute-db_row-retrieving-statement">19.75</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:scale</span> <a href="#attribute-db_scale">19.76</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:schema-name</span> <a href="#attribute-db_schema-name">19.77</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:show-deleted</span> <a href="#attribute-db_show-deleted">19.78</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:string</span> <a href="#attribute-db_string">19.79</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:style-name</span> <a href="#attribute-db_style-name">19.80</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:suppress-version-columns</span> <a href="#attribute-db_suppress-version-columns">19.81</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:system-driver-settings</span> <a href="#attribute-db_system-driver-settings">19.82</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:thousand</span> <a href="#attribute-db_thousand">19.83</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:title</span> <a href="#attribute-db_title">19.84</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:type</span> <a href="#attribute-db_type">19.85</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:type-name</span> <a href="#attribute-db_type-name">19.86</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:update-rule</span> <a href="#attribute-db_update-rule">19.87</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:use-catalog</span> <a href="#attribute-db_use-catalog">19.88</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:user-name</span> <a href="#attribute-db_user-name">19.90</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:use-system-user</span> <a href="#attribute-db_use-system-user">19.89</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">db:visible</span> <a href="#attribute-db_visible">19.91</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:draw-aspect</span> <a href="#property-draw_draw-aspect">20.107</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:escape-direction</span> <a href="#attribute-draw_escape-direction">19.147</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">fo:script</span> <a href="#attribute-fo_script">19.242</a><a href="#property-fo_script">20.215</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">form:linked-cell</span> <a href="#attribute-form_linked-cell">19.283</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">form:list-linkage-type</span> <a href="#attribute-form_list-linkage-type">19.284</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">form:repeat</span> <a href="#attribute-form_repeat">19.302</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">form:source-cell-range</span> <a href="#attribute-form_source-cell-range">19.305</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">form:spin-button</span> <a href="#attribute-form_spin-button">19.306</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">grddl:transformation</span> <a href="#attribute-grddl_transformation">19.320</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">number:rfc-language-tag</span> <a href="#attribute-number_rfc-language-tag">19.356</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">number:script</span> <a href="#attribute-number_script">19.357</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:join-border</span> <a href="#property-style_join-border">20.292</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><a id="DDE_LINK4"/><span class="Attribute">style:layout-grid-base-width</span> <a href="#property-style_layout-grid-base-width">20.297</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:layout-grid-snap-to</span> <a href="#property-style_layout-grid-snap-to">20.305</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:layout-grid-standard-mode</span> <a href="#property-style_layout-grid-standard-mode">20.306</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:list-level</span> <a href="#attribute-style_list-level">19.495</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:percentage-data-style-name</span> <a href="#attribute-style_percentage-data-style-name">19.507</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:rfc-language-tag</span> <a href="#attribute-style_rfc-language-tag">19.512</a><a href="#property-style_rfc-language-tag">20.335</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:rfc-language-tag-asian</span> <a href="#property-style_rfc-language-tag-asian">20.336</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:rfc-language-tag-complex</span> <a href="#property-style_rfc-language-tag-complex">20.337</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:script-asian</span> <a href="#property-style_script-asian">20.346</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:script-complex</span> <a href="#property-style_script-complex">20.347</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:text-overline-color</span> <a href="#property-style_text-overline-color">20.369</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:text-overline-mode</span> <a href="#property-style_text-overline-mode">20.370</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:text-overline-style</span> <a href="#property-style_text-overline-style">20.371</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:text-overline-type</span> <a href="#property-style_text-overline-type">20.372</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:text-overline-width</span> <a href="#property-style_text-overline-width">20.373</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">svg:stroke-linecap</span> <a href="#property-svg_stroke-linecap">20.164</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:embedded-number-behavior</span> <a href="#attribute-table_embedded-number-behavior">19.624</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:first-row-end-column</span> <a href="#attribute-table_first-row-end-column">19.640</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:first-row-start-column</span> <a href="#attribute-table_first-row-start-column">19.641</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:last-row-end-column</span> <a href="#attribute-table_last-row-end-column">19.659</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:last-row-start-column</span> <a href="#attribute-table_last-row-start-column">19.661</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:paragraph-style-name</span> <a href="#attribute-table_paragraph-style-name">19.688</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:protection-key-digest-algorithm</span> <a href="#attribute-table_protection-key-digest-algorithm">19.698</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:rfc-language-tag</span> <a href="#attribute-table_rfc-language-tag">19.703</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:script</span> <a href="#attribute-table_script">19.706</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:template-name</span> <a href="#attribute-table_template-name">19.732</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-banding-columns-styles</span> <a href="#attribute-table_use-banding-columns-styles">19.736</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-banding-rows-styles</span> <a href="#attribute-table_use-banding-rows-styles">19.737</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-first-column-styles</span> <a href="#attribute-table_use-first-column-styles">19.738</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-first-row-styles</span> <a href="#attribute-table_use-first-row-styles">19.739</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-last-column-styles</span> <a href="#attribute-table_use-last-column-styles">19.740</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-last-row-styles</span> <a href="#attribute-table_use-last-row-styles">19.741</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:use-wildcards</span> <a href="#attribute-table_use-wildcards">19.744</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:continue-list</span> <a href="#attribute-text_continue-list">19.780</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:label-followed-by</span> <a href="#attribute-text_label-followed-by">19.827</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:list-id</span> <a href="#attribute-text_list-id">19.829</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:list-level-position-and-space-mode</span> <a href="#property-text_list-level-position-and-space-mode">20.421</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:list-tab-stop-position</span> <a href="#attribute-text_list-tab-stop-position">19.830</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:protection-key-digest-algorithm</span> <a href="#attribute-text_protection-key-digest-algorithm">19.851</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:style-override</span> <a href="#attribute-text_style-override">19.875</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">xhtml:about</span> <a href="#attribute-xhtml_about">19.905</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">xhtml:content</span> <a href="#attribute-xhtml_content">19.906</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">xhtml:datatype</span> <a href="#attribute-xhtml_datatype">19.907</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">xhtml:property</span> <a href="#attribute-xhtml_property">19.908</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">xml:id</span> <a href="#attribute-xml_id">19.914</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value types of the following attributes changed:</p><ul><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">smil:endsync</span> <a href="#attribute-smil_endsync">19.444</a> of <span class="Element">&lt;anim:iterate&gt;</span> <a href="#element-anim_iterate">15.4.4</a>, <span class="Element">&lt;anim:par&gt;</span> <a href="#element-anim_par">15.4.2</a> and <span class="Element">&lt;anim:seq&gt;</span> <a href="#element-anim_seq">15.4.3</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">smil:fadeColor</span> <a href="#attribute-smil_fadeColor">19.445</a> of <span class="Element">&lt;anim:transitionFilter&gt;</span> <a href="#element-anim_transitionFilter">15.2.7</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:notify-on-update-of-ranges</span> <a href="#attribute-draw_notify-on-update-of-ranges">19.200</a> of <span class="Element">&lt;draw:object&gt;</span> <a href="#element-draw_object">10.4.6.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:dots1-length</span> <a href="#attribute-draw_dots1-length">19.136</a> of <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:dots2-length</span> <a href="#attribute-draw_dots2-length">19.138</a> of <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:distance</span> <a href="#attribute-draw_distance">19.134</a> of <span class="Element">&lt;draw:stroke-dash&gt;</span> <a href="#element-draw_stroke-dash">16.40.9</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">office:version</span> <a href="#attribute-office_version">19.386</a> of <span class="Element">&lt;office:document&gt;</span> <a href="#element-office_document">3.1.2</a>, <span class="Element">&lt;office:document-content&gt;</span> <a href="#element-office_document-content">3.1.3.2</a>, <span class="Element">&lt;office:document-meta&gt;</span> <a href="#element-office_document-meta">3.1.3.4</a>, <span class="Element">&lt;office:document-settings&gt;</span> <a href="#element-office_document-settings">3.1.3.5</a> and <span class="Element">&lt;office:document-styles&gt;</span> <a href="#element-office_document-styles">3.1.3.3</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">presentation:action</span> <a href="#attribute-presentation_action">19.387</a> of <span class="Element">&lt;presentation:event-listener&gt;</span> <a href="#element-presentation_event-listener">10.9.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:data-label-number</span> <a href="#property-chart_data-label-number">20.8</a> of <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">chart:error-category</span> <a href="#property-chart_error-category">20.13</a> of <span class="Element">&lt;style:chart-properties&gt;</span> <a href="#element-style_chart-properties">17.22</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">draw:stroke-linejoin</span> <a href="#property-draw_stroke-linejoin">20.163</a> of <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">fo:clip</span> <a href="#property-fo_clip">20.179</a> of <span class="Element">&lt;style:graphic-properties&gt;</span> <a href="#element-style_graphic-properties">17.21</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:glyph-orientation-vertical</span> <a href="#property-style_glyph-orientation-vertical">20.289</a> of <span class="Element">&lt;style:table-cell-properties&gt;</span> <a href="#element-style_table-cell-properties">17.18</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:text-rotation-angle</span> <a href="#property-style_text-rotation-angle">20.375</a> of <span class="Element">&lt;style:text-properties&gt;</span> <a href="#element-style_text-properties">16.27.28</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:value</span> <a href="#attribute-table_value">19.747</a> of <span class="Element">&lt;table:filter-condition&gt;</span> <a href="#element-table_filter-condition">9.5.5</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">table:value-type</span> <a href="#attribute-table_value-type">19.748</a> of <span class="Element">&lt;table:null-date&gt;</span> <a href="#element-table_null-date">9.4.2</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> of <span class="Element">&lt;text:bookmark-ref&gt;</span> <a href="#element-text_bookmark-ref">7.7.6</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:display</span> <a href="#attribute-text_display">19.796</a> of <span class="Element">&lt;text:index-entry-chapter&gt;</span> <a href="#element-text_index-entry-chapter">8.13.1</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:type</span> <a href="#attribute-style_type">19.515</a> of <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">style:type</span> <a href="#attribute-style_type">19.515</a> of <span class="Element">&lt;text:index-entry-tab-stop&gt;</span> <a href="#element-text_index-entry-tab-stop">8.13.6</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> of <span class="Element">&lt;text:note-ref&gt;</span> <a href="#element-text_note-ref">7.7.7</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> of <span class="Element">&lt;text:reference-ref&gt;</span> <a href="#element-text_reference-ref">7.7.5</a><span class="odfLiEnd"/> </p></li><li><p class="P26" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">●</span><span class="Attribute">text:reference-format</span> <a href="#attribute-text_reference-format">19.854</a> of <span class="Element">&lt;text:sequence-ref&gt;</span> <a href="#element-text_sequence-ref">7.7.8</a><span class="odfLiEnd"/> </p></li></ul></body></html>
\ No newline at end of file
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/OpenDocument-v1.2-part3.html b/trunk/odfdom/src/main/javadoc/doc-files/OpenDocument-v1.2-part3.html
new file mode 100644
index 0000000..a7da94f
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/OpenDocument-v1.2-part3.html
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html
+  PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><base href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.html" /><title xml:lang="en-US">OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 3: Packages</title><meta name="DCTERMS.title" content="OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 3: Packages" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2003-02-05T12:39:40" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.contributor" content="Paul Knight"/><meta name="DCTERMS.modified" content="2011-06-09T14:03:41.90" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="Printed by &#34;Daniel Vogelheim&#34;[dc:publisher] on &#34;2004-09-17T15:13:31&#34;[dc:date] in &#34;en-US&#34;[dc:language]" xml:lang="en-US"/><meta name="DCTERMS.subject" content=", OASIS, OpenDocument, ODF" xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
+	@page {  }
+	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
+	td, th { vertical-align:top; font-size:12pt;}
+	h1, h2, h3, h4, h5, h6 { clear:both }
+	ol, ul { margin:0; padding:0;}
+	li { list-style: none; margin:0; padding:0;}
+	<!-- "li span.odfLiEnd" - IE 7 issue-->
+	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
+	span.footnodeNumber { padding-right:1em; }
+	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
+	* { margin:0;}
+	.fr1 { font-size:12pt; text-align:right; vertical-align:top; writing-mode:lr-tb; margin-left:0.1965in; margin-right:0in; }
+	.fr2 { font-size:12pt; text-align:left; vertical-align:top; writing-mode:lr-tb; }
+	.fr3 { font-size:12pt; vertical-align:middle; writing-mode:lr-tb; margin-left:0in; margin-right:0in; margin-top:0in; margin-bottom:0in; padding:0in; border-style:none; }
+	.Appendix_20_Heading_borderStart { border-style:none; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1945in; padding:0in; padding-left:0in; padding-right:0in; padding-top:0.0835in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in;  border-bottom-style:none; }
+	.Appendix_20_Heading { border-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in; padding-top:0.1945in;  border-top-style:none; border-bottom-style:none; }
+	.Appendix_20_Heading_borderEnd { border-style:none; border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.1945in; margin-left:0in; margin-right:0in; padding:0in; padding-bottom:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1945in;  border-top-style:none;}
+	.Appendix_20_Heading_20_1_borderStart { border-style:none; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1945in; padding:0in; padding-left:0in; padding-right:0in; padding-top:0.0835in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in;  border-bottom-style:none; }
+	.Appendix_20_Heading_20_1 { border-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.1945in; padding-top:0.1945in;  border-top-style:none; border-bottom-style:none; }
+	.Appendix_20_Heading_20_1_borderEnd { border-style:none; border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.1945in; margin-left:0in; margin-right:0in; padding:0in; padding-bottom:0in; padding-left:0in; padding-right:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1945in;  border-top-style:none;}
+	.Appendix_20_Heading_20_2_borderStart { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Appendix_20_Heading_20_2 { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Appendix_20_Heading_20_2_borderEnd { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Attribute_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Attribute_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Attribute_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Attribute_20_List2_borderStart { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-top:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Attribute_20_List2 { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; padding:0.0201in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Attribute_20_List2_borderEnd { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-bottom:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; padding-top:0.0555in;  border-top-style:none;}
+	.Attribute_20_Value_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Attribute_20_Value_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Attribute_20_Value_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Bibliography_20_1 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; }
+	.Child_20_Element_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Child_20_Element_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Child_20_Element_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Child_20_Element_20_List2_borderStart { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-top:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Child_20_Element_20_List2 { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; padding:0.0201in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Child_20_Element_20_List2_borderEnd { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-bottom:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; padding-top:0.0555in;  border-top-style:none;}
+	.Contents_20_1 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; }
+	.Contents_20_10 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:1.7689in; margin-right:0in; text-indent:0in; }
+	.Contents_20_2 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; margin-left:0.1665in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_3 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; margin-left:0.3335in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_4 { font-size:9pt; margin-bottom:0.0417in; margin-left:0.5in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Contents_20_5 { font-size:9pt; margin-bottom:0.0417in; margin-left:0.6665in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Contents_20_6 { font-size:9pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:0.8335in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_7 { font-size:10pt; margin-bottom:0.0835in; margin-top:0in; font-family:Arial; writing-mode:page; margin-left:1in; margin-right:0in; text-indent:0.0008in; }
+	.Contents_20_8 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:1.3756in; margin-right:0in; text-indent:0in; }
+	.Contents_20_9 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; margin-left:1.572in; margin-right:0in; text-indent:0in; }
+	.Contents_20_Heading_borderStart { border-style:none; color:#000099; font-size:16pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Contents_20_Heading { border-style:none; color:#000099; font-size:16pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Contents_20_Heading_borderEnd { border-style:none; color:#000099; font-size:16pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Contributor { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0in; margin-left:0.5in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Figure { font-size:10pt; font-style:italic; margin-bottom:0.0835in; margin-top:0.0835in; text-align:center ! important; font-family:Arial; writing-mode:page; }
+	.Heading_20_1_borderStart { border-style:none; color:#000099; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.3335in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; padding-top:0.0835in; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Heading_20_1 { border-style:none; color:#000099; font-size:18pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; border-left-style:none; border-right-style:none; padding-bottom:0.0835in; padding-top:0.3335in;  border-top-style:none; border-bottom-style:none; }
+	.Heading_20_1_borderEnd { border-style:none; color:#000099; font-size:18pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; padding-bottom:0in; border-left-style:none; border-right-style:none; border-bottom-style:none; padding-top:0.3335in;  border-top-style:none;}
+	.Heading_20_2_borderStart { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Heading_20_2 { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Heading_20_2_borderEnd { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Heading_20_3_borderStart { border-style:none; color:#000099; font-size:13pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Heading_20_3 { border-style:none; color:#000099; font-size:13pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Heading_20_3_borderEnd { border-style:none; color:#000099; font-size:13pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Heading_20_4_borderStart { border-style:none; color:#000099; font-size:12pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.Heading_20_4 { border-style:none; color:#000099; font-size:12pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Heading_20_4_borderEnd { border-style:none; color:#000099; font-size:12pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Legal_20_notice { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0547in; margin-left:0in; margin-right:0in; margin-top:0.0547in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Note { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P1 { font-size:10pt; margin-bottom:0.0598in; margin-top:0in; font-family:Arial; writing-mode:page; }
+	.P10 { font-size:10pt; margin-bottom:0.0417in; margin-top:0.0417in; font-family:Arial; writing-mode:page; }
+	.P11 { font-size:10pt; margin-bottom:0.0417in; margin-left:0.1665in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P12 { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0555in; margin-left:0.5in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.P13 { color:#000000; font-size:10pt; font-weight:bold; margin-bottom:0.0555in; margin-left:0.5in; margin-right:0in; margin-top:0in; text-indent:0.0008in; font-family:Arial; writing-mode:page; letter-spacing:normal; font-style:normal; }
+	.P14 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P15 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P16 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P17 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P18 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P19 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P2 { color:#333399; font-size:10pt; font-weight:bold; margin-bottom:0in; margin-top:0.0835in; font-family:Arial; writing-mode:page; }
+	.P20 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P21 { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.P22 { font-size:10pt; margin-bottom:0.0598in; margin-top:0in; font-family:Arial; writing-mode:page; }
+	.P23_borderStart { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; margin-top:0.1665in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in;  border-bottom-style:none; }
+	.P23 { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-bottom:0.0835in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.P23_borderEnd { border-style:none; color:#000099; font-size:14pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; padding:0in; text-indent:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.P3 { color:#333399; font-size:12pt; font-weight:bold; margin-bottom:0in; margin-top:0.0835in; font-family:Arial; writing-mode:page; }
+	.P4_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-top:0.1665in; padding-left:0in; padding-right:0in; padding-top:0.0138in; font-family:Arial; writing-mode:page; padding-bottom:0.25in;  border-bottom-style:none; }
+	.P4 { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-bottom:0.25in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.P4_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.25in; padding-bottom:0in; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.P5_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-top:0.1665in; padding-left:0in; padding-right:0in; padding-top:0.0138in; font-family:Arial; writing-mode:page; padding-bottom:0.25in;  border-bottom-style:none; }
+	.P5 { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-bottom:0.25in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.P5_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.25in; padding-bottom:0in; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.P6_borderStart { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-top:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.P6 { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; padding:0.0201in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.P6_borderEnd { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-bottom:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; margin-left:0in; margin-right:0in; text-indent:0in; padding-top:0.0555in;  border-top-style:none;}
+	.P7 { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0555in; margin-left:0.75in; margin-right:0in; margin-top:0in; text-indent:0in; font-family:Arial; writing-mode:page; }
+	.P8 { font-size:10pt; margin-bottom:0.0555in; margin-left:0in; margin-right:0in; margin-top:0.0555in; text-indent:0in; font-family:Arial; writing-mode:page; }
+	.P9 { font-size:10pt; margin-bottom:0.0417in; margin-left:0.3335in; margin-right:0in; margin-top:0.0417in; text-indent:0.0008in; font-family:Arial; writing-mode:page; }
+	.Parent_20_Element_20_List_borderStart { font-size:10pt; margin-top:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Parent_20_Element_20_List { font-size:10pt; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Parent_20_Element_20_List_borderEnd { font-size:10pt; margin-bottom:0.0555in; font-family:Arial; writing-mode:page; background-color:#e6e6e6; padding:0.0201in; border-width:0.0133cm; border-style:solid; border-color:#000000; padding-top:0.0555in;  border-top-style:none;}
+	.Parent_20_Element_20_List2_borderStart { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-top:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in;  border-bottom-style:none; }
+	.Parent_20_Element_20_List2 { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; padding:0.0201in; font-family:Arial; writing-mode:page; padding-bottom:0.0555in; padding-top:0.0555in;  border-top-style:none; border-bottom-style:none; }
+	.Parent_20_Element_20_List2_borderEnd { background-color:#e6e6e6; border-width:0.0133cm; border-style:solid; border-color:#000000; font-size:10pt; margin-bottom:0.0555in; padding:0.0201in; font-family:Arial; writing-mode:page; padding-top:0.0555in;  border-top-style:none;}
+	.Subtitle_borderStart { border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-size:18pt; font-weight:bold; margin-top:0.1665in; padding-left:0in; padding-right:0in; padding-top:0.0138in; font-family:Arial; writing-mode:page; padding-bottom:0.25in;  border-bottom-style:none; }
+	.Subtitle { border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-bottom:0.25in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Subtitle_borderEnd { border-bottom-style:none; border-left-style:none; border-right-style:none; color:#333399; font-size:18pt; font-weight:bold; margin-bottom:0.25in; padding-bottom:0in; padding-left:0in; padding-right:0in; font-family:Arial; writing-mode:page; padding-top:0.1665in;  border-top-style:none;}
+	.Table { font-size:10pt; font-style:italic; margin-bottom:0.0835in; margin-top:0.0835in; text-align:center ! important; font-family:Arial; writing-mode:page; }
+	.Table_20_Contents { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.Table_20_Heading { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; text-align:center ! important; font-style:italic; font-weight:bold; }
+	.Text_20_body { font-size:10pt; margin-bottom:0.0555in; margin-top:0.0555in; font-family:Arial; writing-mode:page; }
+	.Title_borderStart { font-size:24pt; margin-top:0.1665in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; padding-top:0.0138in; border-left-style:none; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; color:#333399; font-weight:bold; padding-bottom:0.1665in;  border-bottom-style:none; }
+	.Title { font-size:24pt; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; border-left-style:none; border-right-style:none; color:#333399; font-weight:bold; padding-bottom:0.1665in; padding-top:0.1665in;  border-top-style:none; border-bottom-style:none; }
+	.Title_borderEnd { font-size:24pt; margin-bottom:0.1665in; font-family:Arial; writing-mode:page; padding-left:0in; padding-right:0in; padding-bottom:0in; border-left-style:none; border-right-style:none; border-bottom-style:none; color:#333399; font-weight:bold; padding-top:0.1665in;  border-top-style:none;}
+	.Title_20_page_20_info { font-size:10pt; margin-bottom:0in; margin-top:0.0835in; font-family:Arial; writing-mode:page; color:#333399; font-weight:bold; }
+	.Title_20_page_20_info_20_description { color:#000000; font-size:10pt; font-weight:normal; margin-bottom:0.0555in; margin-top:0in; font-family:Arial; writing-mode:page; margin-left:0.5in; margin-right:0in; text-indent:0.0008in; }
+	.NamespaceTable { width:6in; float:none; }
+	.Table1 { width:6in; float:none; }
+	.Table2 { width:6in; float:none; }
+	.NamespaceTable_A1 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable_A2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable_C1 { background-color:transparent; padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.NamespaceTable_C2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table1_A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table1_A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table1_C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table1_C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table2_A1 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table2_A2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.Table2_C1 { background-color:transparent; padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+	.Table2_C2 { background-color:transparent; padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+	.NamespaceTable_A { width:0.8632in; }
+	.NamespaceTable_B { width:2.4382in; }
+	.NamespaceTable_C { width:2.6986in; }
+	.Table1_A { width:0.8646in; }
+	.Table1_B { width:2.4368in; }
+	.Table1_C { width:2.6986in; }
+	.Table2_A { width:0.8632in; }
+	.Table2_B { width:2.4382in; }
+	.Table2_C { width:2.6986in; }
+	.Alien_20_Attribute { font-family:Courier New; }
+	.Alien_20_Attribute_20_Value { font-family:Courier New; }
+	.Alien_20_Element { font-family:Courier New; background-color:transparent; }
+	.Attribute { font-family:Courier New; font-size:10pt; background-color:transparent; }
+	.Attribute_20_Value { font-family:Courier New; background-color:transparent; }
+	.Datatype { font-family:Courier New; }
+	.Def { font-style:italic; background-color:transparent; }
+	.Element { font-family:Courier New; background-color:transparent; font-size:NaNpt; }
+	.Emphasis { font-style:italic; background-color:transparent; }
+	.ISO_20_Keyword { background-color:transparent; }
+	.Note_20_Label { background-color:transparent; font-weight:bold; }
+	.OWL_20_Class { font-family:Courier New; }
+	.OWL_20_Property { font-family:Courier New; }
+	.Source_20_Text { font-family:Courier New; }
+	.Strong_20_Emphasis { font-weight:bold; background-color:transparent; }
+	.T1 { background-color:#ffffff; }
+	.T10 { font-family:Arial; background-color:#ffffff; }
+	.T11 { color:#000000; font-family:Arial; font-size:10pt; font-weight:normal; }
+	.T12 { text-decoration:underline; }
+	.T13 { color:#000000; font-family:Arial; letter-spacing:normal; font-style:normal; font-weight:normal; }
+	.T14 { color:#000000; font-family:Arial; letter-spacing:normal; font-style:normal; font-weight:normal; }
+	.T15 { color:#000000; font-family:Arial; letter-spacing:normal; font-style:italic; font-weight:normal; }
+	.T16 { color:#0000ff; font-family:Arial; letter-spacing:normal; font-style:normal; text-decoration:none ! important; font-weight:normal; }
+	.T2 { font-family:Arial; font-size:10pt; }
+	.T3 { font-family:Arial; font-size:10pt; background-color:#ffffff; }
+	.T4 { font-family:Courier New; background-color:transparent; }
+	.T5 { font-family:Arial; font-size:10pt; }
+	.T6 { font-family:Arial; font-size:10pt; }
+	.T8 { background-color:transparent; }
+	.T9 { font-family:Arial; }
+	<!-- ODF styles with no properties representable as CSS -->
+	.Sect1 .Definition .Numbering_20_Symbols .T7 { }
+	</style></head><body dir="ltr" style="max-width:8.5in;margin-top:1in; margin-bottom:0.4925in; margin-left:1.2492in; margin-right:1.2492in; "><div class="Legal_20_notice"><!--Next 'div' is a draw:frame.--><div style="height:0.628in;width:2.4075in; padding:0; " class="fr2" id="OASISLogo"><img style="height:1.5951cm;width:6.1151cm;" alt="" src="./Pictures/100000000000011C0000004AA64D38BB.gif"/></div></div><p class="Title_borderStart">Open Document Format for Office Applications (OpenDocument) Version 1.2</p><p class="Subtitle">Part 3: Packages</p><p class="Subtitle">OASIS Standard</p><p class="Subtitle_borderEnd">29 September 2011</p><p class="P3">Specification URIs:</p><p class="Title_20_page_20_info">This version:</p><p class="Title_20_page_20_info_20_description"><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.odt">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.odt</a>   (Authoritative)<br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.pdf">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.pdf</a> <br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.html">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.html</a></p><p class="P2">Previous version:</p><p class="Title_20_page_20_info_20_description"><a href="http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part3.odt"><span class="T6">http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part3.odt</span></a><span class="T6">   (Authoritative)<br/></span><a href="http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part3.pdf"><span class="T6">http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part3.pdf</span></a><span class="T6"> <br/></span><a href="http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part3.html"><span class="T6">http://docs.oasis-open.org/office/v1.2/csd06/OpenDocument-v1.2-csd06-part3.html</span></a></p><p class="Title_20_page_20_info">Latest version:</p><p class="Title_20_page_20_info_20_description"><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.odt"><span class="T5">http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.odt</span></a><span class="T5"> (Authoritative)</span><a href="http://www.oasis-open.org/committees/office"><span class="T5"><br/></span></a><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.pdf"><span class="T5">http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.pdf</span></a><a href="http://www.oasis-open.org/committees/office"><span class="T5"><br/></span></a><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.html">http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.html</a></p><p class="Title_20_page_20_info">Technical Committee:</p><p class="Title_20_page_20_info_20_description"><a href="http://www.oasis-open.org/committees/office/">OASIS Open Document Format for Office Applications (OpenDocument) TC</a></p><p class="Title_20_page_20_info">Chairs:</p><p class="Title_20_page_20_info_20_description"><a href="mailto:robert_weir@us.ibm.com">Rob Weir</a>, <a href="http://www.ibm.com/">IBM</a><br/><a href="mailto:michael.brauer@oracle.com">Michael Brauer</a>, <a href="http://www.oracle.com/">Oracle Corporation</a></p><p class="Title_20_page_20_info">Editors:</p><p class="Contributor"><a href="mailto:patrick@durusau.net">Patrick Durusau</a></p><p class="Contributor"><a href="mailto:dennis.hamilton@acm.org">Dennis Hamilton</a></p><p class="Title_20_page_20_info_20_description"><a href="mailto:michael.brauer@oracle.com">Michael Brauer</a>, <a href="http://www.oracle.com/">Oracle Corporation</a></p><p class="Title_20_page_20_info"><a id="Related_Work"/>Related work:</p><p class="Title_20_page_20_info_20_description">This document is part of the <a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.odt"><span class="T12">OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2</span></a> specification.</p><p class="Title_20_page_20_info_20_description">The OpenDocument v1.2 specification has these parts:</p><p class="P7"><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.odt">OpenDocument v1.2 part 1: OpenDocument Schema</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.odt">OpenDocument v1.2 part 2: Recalculated Formula (OpenFormula) Format</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.odt">OpenDocument v1.2 part 3: Packages (this part)</a></p><p class="Title_20_page_20_info_20_description">OpenDocument v1.2 part 3 defines these schemas and ontologies:</p><p class="P7"><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-manifest-schema.rng">OpenDocument v1.2 Manifest Schema</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-dsig-schema.rng">OpenDocument v1.2 Digital Signature Schema</a><br/><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-package-metadata.owl">OpenDocument v1.2 Package Metadata Manifest Ontology</a></p><p class="Title_20_page_20_info">Declared XML namespaces:</p><p class="Title_20_page_20_info_20_description">urn:oasis:names:tc:opendocument:xmlns:manifest:1.0<br/>urn:oasis:names:tc:opendocument:xmlns:<a id="DDE_LINK11"/>digitalsignature:1.0<br/><a href="http://docs.oasis-open.org/ns/office/1.2/meta/pkg#">http://docs.oasis-open.org/ns/office/1.2/meta/pkg#</a></p><p class="Title_20_page_20_info">Abstract:</p><p class="Title_20_page_20_info_20_description">This document is part of the Open Document Format for Office Applications (OpenDocument) Version 1.2 specification.</p><p class="Title_20_page_20_info_20_description">It defines a package format<span class="T11"> </span>for OpenDocument documents.</p><p class="Title_20_page_20_info">Status:</p><p class="P12">This document was last revised or approved by the OASIS Open Document Format for Office Applications (OpenDocument) TC on the above date. The level of approval is also listed above. Check the "Latest version" location noted above for possible later revisions of this document.</p><p class="Title_20_page_20_info_20_description"><span class="T13">Technical Committee members should send comments on this specification to the Technical Committee’s email list. Others should send comments to the Technical Committee by using the “</span><a href="http://www.oasis-open.org/committees/comments/form.php?wg_abbrev=office"><span class="T16">Send A Comment</span></a><span class="T13">” button on the Technical Committee’s web page at </span><a href="http://www.oasis-open.org/committees/office/"><span class="T16">http://www.oasis-open.org/committees/office/</span></a><span class="T13">.</span></p><p class="Title_20_page_20_info_20_description"><span class="T13">For information on whether any patents have been disclosed that may be essential to implementing this specification, and any offers of patent licensing terms, please refer to the Intellectual Property Rights section of the Technical Committee web page (</span><a href="http://www.oasis-open.org/committees/office/ipr.php"><span class="T16">http://www.oasis-open.org/committees/office/ipr.php</span></a><span class="T13">).</span></p><p class="Title_20_page_20_info">Citation format:</p><p class="Title_20_page_20_info_20_description">When referencing this specification the following citation format should be used:</p><p class="P13">OpenDocument-v1.2-part3</p><p class="Title_20_page_20_info_20_description"><span class="T15">Open Document Format for Office Applications (</span><span class="T15">OpenDocument</span><span class="T15">) Version </span><span class="T15">1.2</span><span class="T15"/><span class="T15"> Part </span><span class="T15">3</span><span class="T15">: Packages. </span><span class="T14">29 September 2011. OASIS Standard.  </span><a href="http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.html">http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part3.html</a></p><p class="P5">Notices</p><p class="Text_20_body">Copyright © OASIS Open 2002–2011. All Rights Reserved.</p><p class="Text_20_body">All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full <a href="http://www.oasis-open.org/who/intellectualproperty.php">Policy</a> may be found at the OASIS website.</p><p class="Text_20_body">This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to OASIS, except as needed for the purpose of developing any document or deliverable produced by an OASIS Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English.</p><p class="Text_20_body">The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns.</p><p class="Text_20_body">This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.</p><p class="Text_20_body">OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Committee Specification or OASIS Standard, to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this specification.</p><p class="Text_20_body">OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this specification by a patent holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this specification. OASIS may include such claims on its website, but disclaims any obligation to do so.</p><p class="Text_20_body">OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Committee Specification or OASIS Standard, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.</p><p class="Text_20_body">The names "OASIS", “OpenDocument”, “Open Document Format”, and “ODF” are trademarks of <a href="http://www.oasis-open.org/">OASIS</a>, the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see <a href="http://www.oasis-open.org/who/trademark.php">http://www.oasis-open.org/who/trademark.php</a> for above guidance.</p><p class="P4">Table of Contents</p><table border="0" cellspacing="0" cellpadding="0" class="Sect1"><colgroup/><tr><td><p class="P10"><a href="#__RefHeading__752775_826425813">1 Introduction</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752777_826425813">1.1 Introduction</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752779_826425813">1.2 Terminology</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752781_826425813">1.3 Normative References</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752783_826425813">1.4 Non Normative References</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752785_826425813">1.5 Namespaces</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752787_826425813">2 Packages, Package Consumers and Package Producers</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__4812_1473967831">2.1 Introduction</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752789_826425813">2.2 Packages</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752791_826425813">2.2.1 OpenDocument Package</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752793_826425813">2.2.2 OpenDocument Extended Package</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752795_826425813">2.3 Producers</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752797_826425813">2.3.1 OpenDocument Package Producer</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752799_826425813">2.3.2 OpenDocument Package Extended Producer</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752801_826425813">2.4 OpenDocument Package Consumer</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752803_826425813">3 Packages</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752805_826425813">3.1 General</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752807_826425813">3.2 Manifest</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752809_826425813">3.3 MIME Media Type</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752811_826425813">3.4 Encryption</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752813_826425813">3.4.1 General</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752815_826425813">3.4.2 Encryption Process</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752817_826425813">3.5 Digital Signatures</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752819_826425813">3.6 Metadata</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752821_826425813">3.7 Usage of IRIs Within Packages</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752823_826425813">3.8 Preview Image</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752825_826425813">4 Manifest File</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752827_826425813">4.1 Introduction</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752829_826425813">4.2 &lt;manifest:manifest&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752831_826425813">4.3 &lt;manifest:file-entry&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752833_826425813">4.4 &lt;manifest:encryption-data&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752835_826425813">4.5 &lt;manifest:algorithm&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752837_826425813">4.6 &lt;manifest:start-key-generation&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752839_826425813">4.7 &lt;manifest:key-derivation&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752841_826425813">4.8 Manifest Attributes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752843_826425813">4.8.1 manifest:algorithm-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752845_826425813">4.8.2 manifest:checksum</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752847_826425813">4.8.3 manifest:checksum-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752849_826425813">4.8.4 manifest:full-path</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752851_826425813">4.8.5 manifest:initialisation-vector</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752853_826425813">4.8.6 manifest:start-key-generation-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752855_826425813">4.8.7 manifest:key-size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752857_826425813">4.8.8 manifest:iteration-count</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752859_826425813">4.8.9 manifest:key-derivation-name</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752861_826425813">4.8.10 manifest:media-type</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752863_826425813">4.8.11 manifest:preferred-view-mode</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752865_826425813">4.8.12 manifest:salt</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752867_826425813">4.8.13 manifest:size</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752869_826425813">4.8.14 manifest:version</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752871_826425813">5 Digital Signatures File</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752873_826425813">5.1 Introduction</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752875_826425813">5.2 &lt;dsig:document-signatures&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752877_826425813">5.3 &lt;ds:Signature&gt;</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752879_826425813">5.4 Digital Signatures Attributes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752881_826425813">5.4.1 dsig:version</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752883_826425813">6 Metadata Manifest Files</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752885_826425813">6.1 General</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752887_826425813">6.2 pkg:Document</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752889_826425813">6.3 pkg:File</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752891_826425813">6.4 pkg:MetadataFile</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752893_826425813">6.5 pkg:Element</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752895_826425813">6.6 pkg:hasPart</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752897_826425813">6.7 pkg:mimeType</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752899_826425813">7 Datatypes</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752901_826425813">7.1 Introduction</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752903_826425813">7.2 W3C Schema Datatypes</a></p></td></tr><tr><td><p class="P11"><a href="#__RefHeading__752905_826425813">7.3 Other Datatypes</a></p></td></tr><tr><td><p class="P9"><a href="#__RefHeading__752907_826425813">7.3.1 namespacedToken</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752909_826425813">Appendix A. Schemas</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752911_826425813">A.1. OpenDocument Manifest Schema</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752913_826425813">A.2. OpenDocument Digital Signature Schema</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752915_826425813">Appendix B. OpenDocument Metadata Manifest Ontology</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752917_826425813">Appendix C. Zip File Structure (Non normative)</a></p></td></tr><tr><td><p class="P10"><a href="#__RefHeading__752919_826425813">Appendix D. Changes From “Open Document Format for Office Applications (OpenDocument) v1.1” (Non Normative)</a></p></td></tr></table><h1 class="Heading_20_1"><a id="a1Introduction"><span style="margin-right:0.127cm;">1</span></a><a id="__RefHeading__752775_826425813"/><a id="Introduction"/>Introduction</h1><h2 class="Heading_20_2"><a id="a1_1Introduction"><span style="margin-right:0.127cm;">1.1</span></a><a id="__RefHeading__752777_826425813"/>Introduction</h2><p class="Text_20_body">This document is part of the Open Document Format for Office Applications (OpenDocument) Version 1.2 specification. It defines a package format for OpenDocument documents.</p><h2 class="Heading_20_2"><a id="a1_2Terminology"><span style="margin-right:0.127cm;">1.2</span></a><a id="__RefHeading__752779_826425813"/>Terminology</h2><p class="Text_20_body">All text is normative unless otherwise labeled.</p><p class="Text_20_body">Text with a gray background color which is contained in boxes is informative. It lists the XML element-element and element-attribute relations for cross reference purposes.</p><p class="Text_20_body">Within the normative text of this specification, the terms “shall”, “shall not”, “should”, “should not”, “may” and “need not” are to be interpreted as described in Annex H of <a title="Rules for the structure and drafting of International Standards">[ISO/IEC Directives]</a>.</p><p class="Text_20_body">XML Element, attribute names, attribute value types, and attribute values appear in<span class="T2"> </span><span class="Source_20_Text">monospace</span> font.</p><h2 class="Heading_20_2"><a id="a1_3Normative_References"><span style="margin-right:0.127cm;">1.3</span></a><a id="__RefHeading__752781_826425813"/>Normative References</h2><p class="P8">[<span class="Strong_20_Emphasis">ISO/IEC Directives</span>]        ISO/IEC Directives, Part 2 (Fifth Edition) <span class="Emphasis">Rules for the structure and drafting of International Standards</span>, International Organization for Standardization and International Electrotechnical Commission, 2004</p><p class="P8">[<span class="Strong_20_Emphasis">OWL</span>]        Deborah L. McGuinness, Frank van Harmelen, <span class="Emphasis">OWL Web Ontology Language Overview</span>, <a href="http://www.w3.org/TR/2004/REC-owl-features-20040210/">http://www.w3.org/TR/2004/REC-owl-features-20040210/</a>, W3C, 2004.</p><p class="P8">[<span class="Strong_20_Emphasis">PNG</span>]        David Duce, <span class="Emphasis">Portable Network Graphics (PNG) Specification (Second Edition)</span>, <a href="http://www.w3.org/TR/2003/REC-PNG-20031110">http://www.w3.org/TR/2003/REC-PNG-20031110</a>, W3C, 2003.</p><p class="P8">[<span class="Strong_20_Emphasis">RDF-CONCEPTS</span>]        Graham Klyne, Jeremy J. Carroll, Brian McBride, <span class="Emphasis">Resource Description Framework (RDF): Concepts and Abstract Syntax</span>, <a href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/</a>, W3C, 2004.</p><p class="P8">[<span class="Strong_20_Emphasis">RDF-XML</span>]        Dave Beckett, Brian McBride, <span class="Emphasis">   RDF/XML Syntax Specification (Revised)</span>, <a href="http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/">http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/</a>, W3C, 2004.</p><p class="P8">[<span class="Strong_20_Emphasis">RFC2898</span>]        B. Kaliski, <span class="Emphasis">PKCS #5: Password-Based Cryptography Specification Version 2.0</span>, <a href="http://www.ietf.org/rfc/rfc2898.txt">http://www.ietf.org/rfc/rfc2898.txt</a>, IETF, 2000.</p><p class="P8">[<span class="Strong_20_Emphasis">RFC3174</span>]        D. Eastlake, 3rd, P. Jones, <span class="Emphasis">US Secure Hash Algorithm 1 (SHA1)</span>, <a href="http://www.ietf.org/rfc/rfc3174.txt">http://www.ietf.org/rfc/rfc3174.txt</a>, IETF, 2001.</p><p class="P8">[<span class="Strong_20_Emphasis">RFC3986</span>]        T. Berners-Lee, R. Fielding, L. Masinter, <span class="Emphasis">Uniform Resource Identifier (URI): Generic Syntax</span>, <a href="http://www.ietf.org/rfc/rfc3986.txt">http://www.ietf.org/rfc/rfc3986.txt</a>, IETF, 2005.</p><p class="P8">[<span class="Strong_20_Emphasis">RFC3987</span>]        M. Duerst, M. Suignard, <span class="Emphasis">Internationalized Resource Identifiers (IRIs)</span>, <a href="http://www.ietf.org/rfc/rfc3987.txt">http://www.ietf.org/rfc/rfc3987.txt</a>, IETF, 2005.</p><p class="P8">[<span class="Strong_20_Emphasis">RFC4288</span>]        N. Freed, J. Klensin, <span class="Emphasis">Media Type Specifications and Registration Procedures</span>, <a href="http://www.ietf.org/rfc/rfc4288.txt">http://www.ietf.org/rfc/rfc4288.txt</a>, IETF, 2005.</p><p class="P8">[<span class="Strong_20_Emphasis">RNG</span>]        ISO/IEC 19757-2 <span class="Emphasis">Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG</span>, International Organization for Standardization and International Electrotechnical Commission, 2003</p><p class="P8">[<span class="Strong_20_Emphasis">Schneier</span>]         Bruce Schneier, Applied Cryptography (Second Edition), John Wiley &amp; Sons, ISBN: 0-471-11709-9, 1996</p><p class="P8">[<span class="Strong_20_Emphasis">XAdES</span>]        XML Advanced Electronic Signatures (XAdES) (ETSI TS 101 903 v1.4.1 June 2009), ETSI, 650 Route des Lucioles, F-06921 Sophia Antipolis Cedex, FRANCE, <a href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064</a>, 2009.</p><p class="P8">[<span class="Strong_20_Emphasis">XML-ID</span>]        Jonathan Marsh, Daniel Veillard, Norman Walsh, <span class="Emphasis">xml:id Version 1.0</span>, <a href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">http://www.w3.org/TR/2005/REC-xml-id-20050909/</a>, W3C, 2005.</p><p class="P8">[<span class="Strong_20_Emphasis">xml-names</span>]        Tim Bray et al., <span class="Emphasis">Namespaces in XML 1.0 (Second Edition)</span>, <a href="http://www.w3.org/TR/2006/REC-xml-names-20060816">http://www.w3.org/TR/2006/REC-xml-names-20060816</a>, W3C, 2006.</p><p class="P8">[<span class="Strong_20_Emphasis">XML1.0</span>]        Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler, François Yergeau , <span class="Emphasis">Extensible Markup Language (XML) 1.0 (Fourth Edition)</span>, <a href="http://www.w3.org/TR/2006/REC-xml-20060816/">http://www.w3.org/TR/2006/REC-xml-20060816/</a>, W3C, 2004.</p><p class="P8">[<span class="Strong_20_Emphasis">xmldsig-core</span>]        Donald Eastlake, Joseph Reagle, David Solo, Frederick Hirsch, Thomas Roessler, <span class="Emphasis"> XML Signature Syntax and Processing (Second Edition)</span>, <a href="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/">http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/</a>, W3C, 2008.</p><p class="P8">[<span class="Strong_20_Emphasis">xmlenc-core</span>]        Donald Eastlake, Joseph Reagle, <span class="Emphasis">XML Encryption Syntax and Processing</span>, <a href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/</a>, W3C, 2002.</p><p class="P8">[<span class="Strong_20_Emphasis">xmlschema-2</span>]        Paul V. Biron, Ashok Malhotra, <span class="Emphasis">XML Schema Part 2: Datatypes Second Edition</span>, <a href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/</a>, W3C, 2004.</p><p class="P8">[<span class="Strong_20_Emphasis">ZIP</span>]        <span class="Emphasis">PKWARE Inc. Zip APPNOTE Version 6.2.0</span>, available at <a href="http://www.pkware.com/support/application-note-archives">http://www.pkware.com/support/application-note-archives</a>, 2004</p><h2 class="Heading_20_2"><a id="a1_4Non_Normative_References"><span style="margin-right:0.127cm;">1.4</span></a><a id="__RefHeading__752783_826425813"/>Non Normative References</h2><p class="P8"><span class="Strong_20_Emphasis">[Schneier-Errata]</span>        Bruce Schneir, <span class="Emphasis">Applied Cryptography 2nd. Ed. - Errata</span>, <a href="http://www.schneier.com/book-applied-errata.html">http://www.schneier.com/book-applied-errata.html</a>, 1998.</p><h2 class="Heading_20_2"><a id="a1_5Namespaces"><span style="margin-right:0.127cm;">1.5</span></a><a id="__RefHeading__752785_826425813"/><a id="Namespaces"/>Namespaces</h2><p class="Text_20_body">The namespaces used or defined by OpenDocument part 3 are listed in tables 1 and 2.</p><p class="Text_20_body">The prefix column in tables 1 and 2 lists the namespace prefixes this specification uses when referring to elements and attributes in different namespaces. Conforming OpenDocument documents may substitute other namespace prefixes, bound to the listed namespace URI's, in accordance with the Namespaces in XML specification <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.</p><p class="Note"><span class="Note_20_Label">Note:</span> XML namespaces are employed in accordance with the <span class="Emphasis">Namespaces in XML</span> W3C Recommendation  <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.</p><p class="Table">Table <a id="refTable0"/>1 - XML Namespaces defined by the OpenDocument specification part 3</p><table border="0" cellspacing="0" cellpadding="0" class="NamespaceTable"><colgroup><col width="96"/><col width="271"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">manifest</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attribute contained in the package manifest.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<br/>manifest:1.0</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="NamespaceTable_A2"><p class="Table_20_Contents">dsig</p></td><td style="text-align:left;width:2.4382in; " class="NamespaceTable_A2"><p class="Table_20_Contents">Elements and attribute contained in digital signature files.</p></td><td style="text-align:left;width:2.6986in; " class="NamespaceTable_C2"><p class="Text_20_body">urn:oasis:names:tc:opendocument:xmlns:<a id="DDE_LINK1"/>digitalsignature:1.0</p></td></tr></table><p class="Table">Table <a id="refTable1"/>2 - XML Namespaces defined by the OpenDocument metadata manifest ontology</p><table border="0" cellspacing="0" cellpadding="0" class="Table2"><colgroup><col width="96"/><col width="271"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8632in; " class="Table2_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4382in; " class="Table2_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="Table2_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8632in; " class="Table2_A2"><p class="Table_20_Contents">pkg</p></td><td style="text-align:left;width:2.4382in; " class="Table2_A2"><p class="Table_20_Contents">OWL classes and properties contained in metadata manifest files.</p></td><td style="text-align:left;width:2.6986in; " class="Table2_C2"><p class="Text_20_body">http://docs.oasis-open.org/ns/office/1.2/meta/pkg#</p></td></tr></table><p class="Table">Table <a id="refTable2"/>3 - XML Namespaces used by the OpenDocument digital signature schema</p><table border="0" cellspacing="0" cellpadding="0" class="Table1"><colgroup><col width="96"/><col width="270"/><col width="300"/></colgroup><tr><td style="text-align:left;width:0.8646in; " class="Table1_A1"><p class="Table_20_Heading">Prefix</p></td><td style="text-align:left;width:2.4368in; " class="Table1_A1"><p class="Table_20_Heading">Description</p></td><td style="text-align:left;width:2.6986in; " class="Table1_C1"><p class="Table_20_Heading">Namespace</p></td></tr><tr><td style="text-align:left;width:0.8646in; " class="Table1_A2"><p class="Table_20_Contents">ds</p></td><td style="text-align:left;width:2.4368in; " class="Table1_A2"><p class="Text_20_body">XML Digital Signature Syntax and Processing namespace (see <a title=" XML Signature Syntax and Processing (Second Edition)" href="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/">[xmldsig-core]</a>)</p></td><td style="text-align:left;width:2.6986in; " class="Table1_C2"><p class="Text_20_body">http://www.w3.org/2000/09/xmldsig#</p></td></tr></table><h1 class="Heading_20_1"><a id="a2Packages__Package_Consumers_and_Package_Producers"><span style="margin-right:0.127cm;">2</span></a><a id="__RefHeading__752787_826425813"/>Packages, Package Consumers and Package Producers</h1><h2 class="Heading_20_2"><a id="a2_1Introduction"><span style="margin-right:0.127cm;">2.1</span></a><a id="__RefHeading__4812_1473967831"/>Introduction</h2><p class="Text_20_body">The OpenDocument specification defines conformance for packages, package consumers, and package producers, with two conformance classes called conforming and extended conforming. This chapter defines the basic requirements for the individual conformance targets.</p><h2 class="Heading_20_2"><a id="a2_2Packages"><span style="margin-right:0.127cm;">2.2</span></a><a id="__RefHeading__752789_826425813"/>Packages</h2><h3 class="Heading_20_3"><a id="a2_2_1OpenDocument_Package"><span style="margin-right:0.127cm;">2.2.1</span></a><a id="__RefHeading__752791_826425813"/><a id="OpenDocument_Package"/>OpenDocument Package</h3><p class="Text_20_body">An<span class="Def"> OpenDocument</span><span class="Definition"> P</span><span class="Def">ackage</span> <span class="ISO_20_Keyword">shall</span> meet the following requirements:</p><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>It <span class="ISO_20_Keyword">shall </span>be a Zip file, as defined by <a title="PKWARE Inc. Zip APPNOTE Version 6.2.0" href="available at http://www.pkware.com/support/application-note-archives">[ZIP]</a>. All files contained in the Zip file shall be non compressed (STORED) or compressed using the “deflate” (DEFLATED) algorithm.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>It <span class="ISO_20_Keyword">shall</span> contain a file “META-INF/manifest.xml”. This file <span class="ISO_20_Keyword">shall</span> meet the following requirements:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.1)</span>The file <span class="ISO_20_Keyword">shall</span> be a well formed XML document in accordance with the<span class="T2"> </span><a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a> specification.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2)</span>The XML root element of the file <span class="ISO_20_Keyword">shall</span> be a <span class="Element">&lt;manifest:manifest&gt;</span> element <a href="#element-manifest_manifest">4.2</a>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.3)</span>The XML file <span class="ISO_20_Keyword">shall</span> be valid with respect to the manifest schema defined in appendix A.1 OpenDocument Manifest Schema.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">C)</span>It <span class="ISO_20_Keyword">should</span> contain a file “mimetype”.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">D)</span>It <span class="ISO_20_Keyword">may</span> contain files whose relative paths begin with “META-INF/” and whose names contain the string “signatures”. These file shall meet the following requirements:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">D.1)</span>The files <span class="ISO_20_Keyword">shall</span> be well-formed XML files in accordance with<span class="T2"> </span><a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">D.2)</span>The XML root element of each file <span class="ISO_20_Keyword">shall</span> be a <span class="Element">&lt;dsig:document-signatures&gt;</span> element <a href="#element2-dsig_document-signatures">5.2</a>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">D.3)</span>The files <span class="ISO_20_Keyword">shall</span> be valid with respect to the digital signature schema defined in appendix A.2<span class="T2"> </span>OpenDocument Digital Signature Schema.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">E)</span>It shall not contain other files whose relative path begins with<span class="T2"> </span>“META-INF/” other than than those listed in B) and D).<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">F)</span>The files listed in (B) and (D) meet the following requirements:<span class="odfLiEnd"/> </p><ol><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">F.1)</span>They <span class="ISO_20_Keyword">shall</span> be namespace-well-formed with regard to the XML Namespaces specification <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P14" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">F.2)</span>They <span class="ISO_20_Keyword">shall</span> conform to the xml-id specification <a title="xml:id Version 1.0" href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">[XML-ID]</a>.<span class="odfLiEnd"/> </p></li></ol></li></ol><h3 class="Heading_20_3"><a id="a2_2_2OpenDocument_Extended_Package"><span style="margin-right:0.127cm;">2.2.2</span></a><a id="__RefHeading__752793_826425813"/>OpenDocument Extended Package</h3><ol><li><p class="P14" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">G)</span>An<span class="Def"> OpenDocument Extended Package</span> <span class="ISO_20_Keyword">shall</span> meet all requirements of a conforming package except item E) of <a href="#OpenDocument_Package">2.2.1</a>.<span class="odfLiEnd"/> </p></li></ol><h2 class="Heading_20_2"><a id="a2_3Producers"><span style="margin-right:0.127cm;">2.3</span></a><a id="__RefHeading__752795_826425813"/>Producers</h2><h3 class="Heading_20_3"><a id="a2_3_1OpenDocument_Package_Producer"><span style="margin-right:0.127cm;">2.3.1</span></a><a id="__RefHeading__752797_826425813"/>OpenDocument Package Producer</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Package Producer</span> is a program that creates conforming OpenDocument packages, and that meets the additional requirements:</p><ol><li><p class="P15" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>It <span class="ISO_20_Keyword">may</span> produce conforming OpenDocument extended packages, but it <span class="ISO_20_Keyword">shall</span> have a mode of operation where all OpenDocument packages that are created are conforming OpenDocument packages.<span class="odfLiEnd"/> </p></li><li><p class="P15" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>It <span class="ISO_20_Keyword">shall</span> be accompanied by a document that defines all implementation-defined values used by the OpenDocument package producer.<span class="odfLiEnd"/> </p></li></ol><h3 class="Heading_20_3"><a id="a2_3_2OpenDocument_Package_Extended_Producer"><span style="margin-right:0.127cm;">2.3.2</span></a><a id="__RefHeading__752799_826425813"/>OpenDocument Package Extended Producer</h3><p class="Text_20_body">An<span class="Def"> OpenDocument Package Extended Producer</span> is a program that creates conforming OpenDocument extended packages. It <span class="ISO_20_Keyword">shall</span> be accompanied by a document that defines all implementation-defined values used by the OpenDocument package producer.</p><h2 class="Heading_20_2"><a id="a2_4OpenDocument_Package_Consumer"><span style="margin-right:0.127cm;">2.4</span></a><a id="__RefHeading__752801_826425813"/>OpenDocument Package Consumer</h2><p class="Text_20_body">An <span class="Def">OpenDocument Package Consumer</span> is a program that can parse and interpret OpenDocument packages, and that meets the following additional requirements:</p><ol><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">A)</span>It <span class="ISO_20_Keyword">shall</span> be able to parse and interpret OpenDocument packages and OpenDocument extended packages, but it <span class="ISO_20_Keyword">need not</span> interpret the semantics of all elements, attributes and attribute values.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.1011cm">B)</span>The XML parser used to parse the files listed in <a href="#OpenDocument_Package">2.2.1</a> (B) and <a href="#OpenDocument_Package">2.2.1</a> (D) meets the<span class="T2"> </span>following requirements:<span class="odfLiEnd"/> </p><ol><li><p class="P16" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.1)</span>It <span class="ISO_20_Keyword">shall </span>be a nonvalidating XML processor with regard to the XML 1.0 specification <a title="Extensible Markup Language (XML) 1.0 (Fourth Edition)" href="http://www.w3.org/TR/2006/REC-xml-20060816/">[XML1.0]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.2)</span>It <span class="ISO_20_Keyword">shall </span>be<span class="T2"> </span>a conforming processor with regard to the XML Namespaces specification <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P16" style="margin-left:0.4991cm;"><span style="display:block;float:left;min-width:0.1011cm">B.3)</span>It <span class="ISO_20_Keyword">shall</span> conform to the xml-id specification <a title="xml:id Version 1.0" href="http://www.w3.org/TR/2005/REC-xml-id-20050909/">[XML-ID]</a>.<span class="odfLiEnd"/> </p></li></ol></li></ol><h1 class="Heading_20_1"><a id="a3Packages"><span style="margin-right:0.127cm;">3</span></a><a id="__RefHeading__752803_826425813"/><a id="Package"/>Packages</h1><h2 class="Heading_20_2"><a id="a3_1General"><span style="margin-right:0.127cm;">3.1</span></a><a id="__RefHeading__752805_826425813"/><a id="General"/>General</h2><p class="Text_20_body">OpenDocument defines a package file to store the XML content of a document as separate parts together with<span class="T2"> </span>associated binary data as file entries in a single package file. These file entries may be compressed to further reduce the storage taken by the package. This package is a Zip file <a title="PKWARE Inc. Zip APPNOTE Version 6.2.0" href="available at http://www.pkware.com/support/application-note-archives">[ZIP]</a>, whose structure is described in Appendix C. OpenDocument Packages impose additional structure on the Zip file to accomplish the representation of OpenDocument Format documents.</p><p class="Text_20_body">A document within a package may consist of a set of files creating a unit, for instance the set of files specified by OpenDocument part 1. These files may be located in the root of the package, or within a directory. If they are contained in the root of the package, they are called <span class="Def">document</span>. If they are located within a directory, the document they constitute is called a <span class="Def">sub document</span>. A package may contain multiple sub documents, but only a single document can be contained in the root of the package. Unless otherwise stated, the term <span class="Def">document</span> refers to the document contained in the root of the package. This may include sub documents.</p><h2 class="Heading_20_2"><a id="a3_2Manifest"><span style="margin-right:0.127cm;">3.2</span></a><a id="__RefHeading__752807_826425813"/>Manifest</h2><p class="Text_20_body">All OpenDocument packages shall contain a file named “META-INF/manifest.xml”. This file is the OpenDocument package manifest. The manifest provides :</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>A list of all of the files in the package (except those specifically excluded from the manifest).<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The MIME media type of each file in the package.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>If a file is stored in the file data in encrypted form, the manifest provides information required to decrypt the file correctly when the encryption key is also supplied.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The format of the manifest file is specified in chapter <a href="#Manifest_File">4</a>.</p><p class="Text_20_body">For all files contained in a package, with exception of the “mimetype” file and files whose relative path starts with “META-INF/”, the “META-INF/manifest.xml” file shall contain exactly one <span class="Element">&lt;manifest:file-entry&gt;</span> element whose <span class="Attribute">manifest:full-path</span> attribute's value references the file.</p><p class="Text_20_body">The “META-INF/manifest.xml” file need not contain <span class="Element">&lt;manifest:file-entry&gt;</span> elements <a href="#element-manifest_file-entry">4.3</a> whose <span class="Attribute">manifest:full-path</span> attribute <a href="#attribute-manifest_full-path">4.8.4</a> references files<span class="T2"> </span>whose relative path start with "META-INF/". The file <span class="ISO_20_Keyword">shall not</span> contain <span class="Element">&lt;manifest:file-entry&gt;</span> elements whose <span class="Attribute">manifest:full-path</span> attribute value references the “META-INF/manifest.xml” file itself or the “mimetype” file.</p><p class="Text_20_body">The “META-INF/manifest.xml” file <span class="ISO_20_Keyword">should</span> contain a <span class="Element">&lt;manifest:file-entry&gt;</span> element whose <span class="Attribute">manifest:full-path</span> attribute has the value "<span class="Attribute_20_Value">/</span>". This element specifies information regarding the document stored in the root of the package. This entry shall exist if the package contains a file "mimetype"</p><h2 class="Heading_20_2"><a id="a3_3MIME_Media_Type"><span style="margin-right:0.127cm;">3.3</span></a><a id="__RefHeading__752809_826425813"/><a id="MIME_type_stream"/>MIME Media Type</h2><p class="Text_20_body">If a MIME media type for a document exists, then an OpenDocument package <span class="ISO_20_Keyword">should</span> contain a <span class="T2">file</span> with name “mimetype”. The content of this <span class="T2">file</span> shall be the ASCII encoded MIME media type associated with the document. See <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a>.</p><p class="Text_20_body">The “mimetype” file <span class="ISO_20_Keyword">shall</span> be the first file of the zip file. It <span class="ISO_20_Keyword">shall not</span> be compressed, and it <span class="ISO_20_Keyword">shall not</span> use an 'extra field' in its header.</p><p class="Text_20_body">If the file named “META-INF/manifest.xml” contains a <span class="Element">&lt;manifest:file-entry&gt;</span> element whose <span class="Attribute">manifest:full-path</span> attribute has the value "<span class="Attribute_20_Value">/</span>", then a "mimetype" file shall exist, and the content of the “mimetype” file shall be equal to the value of the <span class="Attribute">manifest:media-type</span> attribute<span class="T2"> </span><a href="#attribute-manifest_media-type">4.8.10</a> of that element.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The purpose is to allow the type of document represented by the package to be discovered through 'magic number' mechanisms, such as Unix's file/magic utility. If a Zip file contains a file at the beginning of the file that is uncompressed, and has no extra data in the header, then its file name and data can be found at fixed positions from the beginning of the package. More specifically, one will find:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>the string 'PK' at position 0 of all zip files<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>the string 'mimetype' beginning at position 30<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>the media type itself beginning at position 38.<span class="odfLiEnd"/> </p></li></ul><h2 class="Heading_20_2"><a id="a3_4Encryption"><span style="margin-right:0.127cm;">3.4</span></a><a id="__RefHeading__752811_826425813"/><a id="Encryption"/>Encryption</h2><h3 class="Heading_20_3"><a id="a3_4_1General"><span style="margin-right:0.127cm;">3.4.1</span></a><a id="__RefHeading__752813_826425813"/>General</h3><p class="Text_20_body">OpenDocument packages may be encrypted by encrypting some or all files within the package. The encryption process takes place in the following stages:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>A single start key is generated and used for all of the keys that will be derived.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The derived key is generated based on the start key.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The files are encrypted based on the derived key and the encryption algorithm.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body"> The information regarding the algorithms that were used to encrypt a file and required parameters are contained in the manifest. The manifest shall not be encrypted.</p><p class="Text_20_body">Each file entry that is encrypted shall be compressed with the “deflate” algorithm before being encrypted. Encrypted file entries shall be flagged as 'STORED' rather than 'DEFLATED' in the Zip file's central directory. The size of the encrypted file should replace the real size value in the file entry's central directory records, its local file header and the data descriptor, if any. The original uncompressed, unencrypted size shall be contained in the <span class="Attribute">manifest:size</span> <a href="#attribute-manifest_size">4.8.13</a> attribute of the <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a> element for the file entry.</p><p class="Text_20_body">The encrypted form can be of greater size than the DEFLATED file used as the plaintext.</p><p class="Note"><span class="Note_20_Label">Note:</span> The encrypted form may be of greater because of padding of plaintext, inclusion of additional information, and other characteristics of the encryption technique).</p><p class="Text_20_body">The encryption method shall be such that the exact size and value of the plaintext DEFLATED file is recovered by the corresponding decryption process.</p><h3 class="Heading_20_3"><a id="a3_4_2Encryption_Process"><span style="margin-right:0.127cm;">3.4.2</span></a><a id="__RefHeading__752815_826425813"/><a id="Default_Algorithm"/>Encryption Process</h3><p class="Text_20_body">The three stages of the encryption process proceed as follows, using the legacy algorithms to illustrate each stage:</p><ol><li><p class="P18" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">1.</span>The start key is generated: The byte sequence representing the password in UTF-8 is used to generate a 20-byte SHA1 digest (see <span class="T8"><a title="US Secure Hash Algorithm 1 (SHA1)" href="http://www.ietf.org/rfc/rfc3174.txt">[RFC3174]</a></span>).<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">2.</span>For each file to be encrypted, a separate derived key is generated from the start key: The PBKDF2 algorithm based on the HMAC-SHA-1 function (see <a title="PKCS #5: Password-Based Cryptography Specification Version 2.0" href="http://www.ietf.org/rfc/rfc2898.txt">[RFC2898]</a>) is used for the key derivation. For each file, a 16-byte salt is generated by a random generator. The salt is used together with the start key to derive a unique 128-bit key for each file. The default iteration count for the algorithm is 1024.<span class="odfLiEnd"/> </p></li><li><p class="P18" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">3.</span>The files are encrypted: The random number generator is used to generate the 8-byte initialization vector for the algorithm. The derived key is used together with the initialization vector to encrypt the file using the Blowfish algorithm in 8-bit cipher feedback (8-bit CFB) mode (see <a title="Applied Cryptography (Second Edition)">[Schneier]</a>).<span class="odfLiEnd"/> </p></li></ol><h2 class="Heading_20_2"><a id="a3_5Digital_Signatures"><span style="margin-right:0.127cm;">3.5</span></a><a id="__RefHeading__752817_826425813"/><a id="Digital_Signatures"/>Digital Signatures</h2><p class="Text_20_body">Files within a package may have a digital signature applied. Digital signatures are stored in one or more files whose relative paths begin with “META-INF/”. The names of these files <span class="ISO_20_Keyword">shall</span> contain the term “signatures”.</p><p class="Text_20_body">The format of digital signature files is specified in chapter <a href="#Digital_Signature_File">5</a>.</p><h2 class="Heading_20_2"><a id="a3_6Metadata"><span style="margin-right:0.127cm;">3.6</span></a><a id="__RefHeading__752819_826425813"/><a id="Metadata"/>Metadata</h2><p class="Text_20_body">Metadata for documents contained in an OpenDocument package may be expressed using the model of the W3C Resource Description Framework <a title="Resource Description Framework (RDF): Concepts and Abstract Syntax" href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">[RDF-CONCEPTS]</a>.</p><p class="Text_20_body">A document or sub document that is stored in a package <span class="ISO_20_Keyword">may</span> contain any  number of <span class="Def">metadata files</span>. The content of a metadata files <span class="ISO_20_Keyword">shall</span> conform to the <a title="   RDF/XML Syntax Specification (Revised)" href="http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/">[RDF-XML]</a> specification. Implementations that are consumers as well as producers <span class="ISO_20_Keyword">should</span> preserve all metadata files.</p><p class="Text_20_body">All metadata files of a document or sub document <span class="ISO_20_Keyword">shall</span> be listed in a separate <span class="Def">metadata manifest file</span>, which has the file name “manifest.rdf”. This file enumerates metadata files and their relationships to other files in an OpenDocument package. See chapter <a href="#Metadata_Manifest_Files">6</a>.</p><p class="Text_20_body">In addition to metadata files, the "manifest.rdf" file may list other files which are contained in the document or sub document that contain RDF metadata, like files that contain RDFa metadata. The "manifest.rdf" file need not exist if a document or sub document does not contain any files that contain RDF metadata.</p><p class="Text_20_body">All references to a resource within the same package that occur within metadata file <span class="ISO_20_Keyword">shall</span> be represented by relative IRIs to the resource. This includes values of <span class="Alien_20_Attribute">rdf:about</span> attributes occurring within metadata files or metadata manifest files.</p><h2 class="Heading_20_2"><a id="a3_7Usage_of_IRIs_Within_Packages"><span style="margin-right:0.127cm;">3.7</span></a><a id="__RefHeading__752821_826425813"/><a id="Package_IRI"/>Usage of IRIs Within Packages</h2><p class="Text_20_body">Within the files contained in a package, relative IRIs as defined by <a title="Internationalized Resource Identifiers (IRIs)" href="http://www.ietf.org/rfc/rfc3987.txt">[RFC3987]</a> may be used to reference other files within the same package.</p><p class="P1">OpenDocument Package Consumers shall resolve relative IRIs that occur within a file of a package as follows:</p><ol><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">1.</span>The <span class="Def">file entry path</span> is the file name of the file within the Zip file which contains the relative IRI, including its relative path.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">2.</span>The <span class="Def">package base IRI</span> is the base IRI which would be established for the package itself as defined in §5.1 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">3.</span>If the relative IRI does not match the rule for "relative-ref" defined in §4.2 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a> or if the relative IRI does start with a "/" character (U+002F, SOLIDUS) then it is resolved as defined in §5.2 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a> with the package base IRI as base URI.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">4.</span>If the relative IRI references matches the rule for "relative-ref" defined in §4.2 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a> and its "relative-part" component matches the "path-empty" rule it shall be resolved as a "Same-Document" references defined in §4.4 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">5.</span>Otherwise the "relative-part" component of the relative IRI is copied into a <span class="Def">relative IRI buffer</span> and an empty <span class="Def">file entry path buffer</span> is created<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">6.</span>If the file entry path does contain a "/" character (U+002F, SOLIDUS) then the file path up to and including the last "/" character is copied into the file entry buffer.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">7.</span>If the relative IRI buffer starts with the character sequence "./" (U+002E, FULL STOP, followed by U+002F, SOLIDUS) then that character sequence it removed from the buffer. Continue with step 7.<span class="odfLiEnd"/> </p></li><li><p class="P19" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">8.</span>If the content of the relative IRI buffer is the character sequence "." (U+002E, FULL STOP), the content of the relative IRI buffer is removed. Continue with step 11.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">9.</span>If the content of the relative IRI buffer is the character sequence ".." (U+002E, FULL STOP, followed by U+002E, FULL STOP) and<span class="odfLiEnd"/> </p><ul><li><p class="P22" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">•</span>if the file entry path buffer is empty, then the content of the relative IRI buffer is replaced with "." (U+002E, FULL STOP). The query and fragment components of the relative IRI, if present, are appended to the relative IRI buffer, including the "?" (U+003F, QUESTION MARK) and "#" (U+0023, NUMBER SIGN) delimiter characters. The content of the relative IRI buffer then is resolved as defined in §5.2 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a> with the package base IRI as base URI.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">•</span>if the file entry path buffer contains at least one relative path component, the last relative path component up to and including the last "/" character (U+002F, SOLIDUS) is removed. The ".." character sequence is removed from the IRI buffer. Continue with step 11.<span class="odfLiEnd"/> </p></li></ul></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">10.</span>If a fragment buffer has been created and is not empty, its content may be resolved as fragment identifier, as defined by §3.5 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a>.<span class="odfLiEnd"/> </p><ul><li><p class="P22" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">•</span>if the file entry path buffer is empty, then the "../" is replaced with "./" (U+002E, FULL STOP, followed by U+002F, SOLIDUS) in the relative IRI buffer. The query and fragment components of the relative IRI, if present, are appended to the relative IRI buffer, including the "?" (U+003F, QUESTION MARK) and "#" (U+0023, NUMBER SIGN) delimiter characters. The content of the relative IRI buffer then is resolved as defined in §5.2 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a> with the package base IRI as base URI.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0.4991cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">•</span>if the file entry path buffer contains at least one one relative path component, the last relative path component up to and including the last "/" character (U+002F, SOLIDUS) is removed. The "../" character sequence is removed from the IRI buffer. Continue with step 7.<span class="odfLiEnd"/> </p></li></ul></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">11.</span>The content of the file entry buffer is inserted into the relative IRI buffer before any existing content.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">12.</span>The content of the relative IRI buffer is interpreted as a file or directory name within the package, that is, as the name of a file or directory including its relative path within the Zip file. An empty buffer denotes the package root. Path segments in the relative IRI buffer that originally came from the relative IRI shall be interpreted according to IRI syntax rules, while segments that originally came from the file entry path must be interpreted according to Zip path name syntax rules.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">13.</span>If the relative IRI contains a fragment component, it is resolved as fragment identifier, as defined by §3.5 of <a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://www.ietf.org/rfc/rfc3986.txt">[RFC3986]</a>.<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Files whose relative path starts with “META-INF/” are considered to be part of the OpenDocument package rather than of the content stored within the package. Therefore, different rules regarding the resolution of relative IRIs may apply.</p><h2 class="Heading_20_2"><a id="a3_8Preview_Image"><span style="margin-right:0.127cm;">3.8</span></a><a id="__RefHeading__752823_826425813"/>Preview Image</h2><p class="Text_20_body">Unless a document is encrypted, package producers should generate a preview image of the document that is contained in the package. It should be a representation of the first page, first sheet, etc. of the document. For maximum re-usability of the preview images they shall be generated without any effects, surrounding frames, or borders.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Such effects might interfere with effects added to the preview images by the different file system explorers or may not be desired at all for certain use cases.</p><p class="Text_20_body">The preview image <span class="ISO_20_Keyword">shall</span> be contained in a file named “Thumbnails/thumbnail.png”.</p><p class="Text_20_body">Preview images <span class="ISO_20_Keyword">shall</span> be saved in <a title="Portable Network Graphics (PNG) Specification (Second Edition)" href="http://www.w3.org/TR/2003/REC-PNG-20031110">[PNG]</a> format.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> Current desktops display preview images within squares of up to 256 pixel width and height, and 24 bit per pixel. While this specification does not define upper or lower limits for preview image sizes, producers should only use image sizes that are displayed with a reasonable quality if scaled to fit into 256x256 pixel square.</p><p class="Text_20_body">Encrypted documents are intended to be unreadable for unauthorized users and package producers shall not generate preview images for such documents. They may include a preview image that is independent of the contents of the document. Such preview images should not be encrypted.</p><h1 class="Heading_20_1"><a id="a4Manifest_File"><span style="margin-right:0.127cm;">4</span></a><a id="__RefHeading__752825_826425813"/><a id="Manifest_File"/>Manifest File</h1><h2 class="Heading_20_2"><a id="a4_1Introduction"><span style="margin-right:0.127cm;">4.1</span></a><a id="__RefHeading__752827_826425813"/>Introduction</h2><p class="Text_20_body">The format of the manifest file is defined by the OpenDocument manifest Relax-NG <a title="Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG" href="http://oasis-open.org/committees/relax-ng/spec-20011203.html">[RNG]</a> schema. See appendix A. This chapter describes the semantics of the elements and attributes defined by this schema.</p><h2 class="Heading_20_2"><a id="a4_2_manifest_manifest_"><span style="margin-right:0.127cm;">4.2</span></a><a id="__RefHeading__752829_826425813"/><a id="element-manifest_manifest"/>&lt;manifest:manifest&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;manifest:manifest&gt;</span> element is the root element of <span class="T7">the</span> manifest file. It contains <span class="Element">&lt;manifest:file-entry&gt;</span> child elements <a href="#element-manifest_file-entry">4.3</a>, each of which specifies information for a a file or directory in the package.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;manifest:manifest&gt;</span> element is a root element.</p><p class="Attribute_20_List">The <span class="Element">&lt;manifest:manifest&gt;</span> element has the following attribute: <span class="Attribute">manifest:version</span> <a href="#attribute-manifest_version_element-manifest_manifest">4.8.14.2</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;manifest:manifest&gt;</span> element has the following child element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><h2 class="Heading_20_2"><a id="a4_3_manifest_file-entry_"><span style="margin-right:0.127cm;">4.3</span></a><a id="__RefHeading__752831_826425813"/><a id="element-manifest_file-entry"/>&lt;manifest:file-entry&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;manifest:file-entry&gt;</span> element specifies the media type of a single file or sub document within the package.  It may also specify the data required to decrypt a file.</p><p class="Text_20_body">For directories, the manifest file should contain a <span class="Element">&lt;manifest:file-entry&gt;</span> element only if a directory contains a document or a sub document. See <a href="#General">3.1</a>. A directory for administrative or convenience purposes, such as a directory that contains various unrelated image files, should not have an entry in the manifest file.</p><p class="Text_20_body">Directories have no corresponding file entries within the Zip file.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;manifest:file-entry&gt;</span> element is usable within the following element: <span class="Element">&lt;manifest:manifest&gt;</span> <a href="#element-manifest_manifest">4.2</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;manifest:file-entry&gt;</span> element has the following attributes: <span class="Attribute">manifest:full-path</span> <a href="#attribute-manifest_full-path">4.8.4</a>, <span class="Attribute">manifest:media-type</span> <a href="#attribute-manifest_media-type">4.8.10</a>, <span class="Attribute">manifest:preferred-view-mode</span> <a href="#attribute-manifest_preferred-view-mode">4.8.11</a>, <span class="Attribute">manifest:size</span> <a href="#attribute-manifest_size">4.8.13</a> and <span class="Attribute">manifest:version</span> <a href="#attribute-manifest_version_element-manifest_file-entry">4.8.14.1</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;manifest:file-entry&gt;</span> element has the following child element: <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a>.</p><h2 class="Heading_20_2"><a id="a4_4_manifest_encryption-data_"><span style="margin-right:0.127cm;">4.4</span></a><a id="__RefHeading__752833_826425813"/><a id="element-manifest_encryption-data"/>&lt;manifest:encryption-data&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;manifest:encryption-data&gt;</span> element contains information required to decrypt a file entry.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;manifest:encryption-data&gt;</span> element is usable within the following element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;manifest:encryption-data&gt;</span> element has the following attributes: <span class="Attribute">manifest:checksum</span> <a href="#attribute-manifest_checksum">4.8.2</a> and <span class="Attribute">manifest:checksum-type</span> <a href="#attribute-manifest_checksum-type">4.8.3</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;manifest:encryption-data&gt;</span> element has the following child elements: <span class="Element">&lt;manifest:algorithm&gt;</span> <a href="#element-manifest_algorithm">4.5</a>, <span class="Element">&lt;manifest:key-derivation&gt;</span> <a href="#element-manifest_key-derivation">4.7</a> and <span class="Element">&lt;manifest:start-key-generation&gt;</span> <a href="#element-manifest_start-key-generation">4.6</a>.</p><h2 class="Heading_20_2"><a id="a4_5_manifest_algorithm_"><span style="margin-right:0.127cm;">4.5</span></a><a id="__RefHeading__752835_826425813"/><a id="element-manifest_algorithm"/>&lt;manifest:algorithm&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;manifest:algorithm&gt;</span> element specifies the algorithm used to encrypt data.</p><p class="Text_20_body">Depending on the algorithm specified by the <span class="Attribute">manifest:algorithm-name</span> attribute  <a href="#attribute-manifest_algorithm-name">4.8.1</a> , the <span class="Element">&lt;manifest:algorithm&gt;</span> element may have further child elements.</p><p class="Text_20_body"><span class="T1">When the </span><span class="Attribute">manifest:algorithm-name</span><span class="T1"> attribute value matches one of those defined in section §3.2 of </span><span class="T10"><a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a></span><span class="T1">, the </span><span class="Element">&lt;manifest:algorithm&gt;</span><span class="T1"> element shall not have child elements except those permitted as child elements of the </span><span class="T10"><a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a></span><span class="T1"> </span><span class="Alien_20_Element">&lt;EncryptionMethod&gt;</span><span class="T1"> element whose Algorithm attribute value is the same as the </span><span class="Element">&lt;manifest:algorithm&gt;</span><span class="T1"> </span><span class="Attribute">manifest:algorithm-name</span><span class="T1"> attribute value.</span></p><p class="Text_20_body"><span class="T1">When the value of the </span><span class="Attribute">manifest:algorithm-name</span><span class="T1"> attribute identifies the legacy Blowfish algorithm, </span><span class="Element">&lt;manifest:algorithm&gt;</span><span class="T1"> shall be an empty element.</span></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;manifest:algorithm&gt;</span> element is usable within the following element: <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a>.</p><p class="Attribute_20_List_borderEnd">The <span class="Element">&lt;manifest:algorithm&gt;</span> element has the following attributes: <span class="Attribute">manifest:algorithm-name</span> <a href="#attribute-manifest_algorithm-name">4.8.1</a> and <span class="Attribute">manifest:initialisation-vector</span> <a href="#attribute-manifest_initialisation-vector">4.8.5</a>.</p><h2 class="P23"><a id="a4_6_manifest_start-key-generation_"><span style="margin-right:0.127cm;">4.6</span></a><a id="__RefHeading__752837_826425813"/><a id="element-manifest_start-key-generation"/>&lt;manifest:start-key-generation&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;manifest:start-key-generation&gt;</span> element specifies how the encryption start key is derived from a user specified password. The password shall be provided as a sequence of bytes in UTF-8 encoding.</p><p class="Text_20_body">When a <span class="Element">&lt;manifest:start-key-generation&gt;</span> element is absent as a child of a <span class="Element">&lt;manifest:encryption-data&gt;</span> element, interpretation is the same as if the element is present with default attribute values.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;manifest:start-key-generation&gt;</span> element is usable within the following element: <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;manifest:start-key-generation&gt;</span> element has the following attributes: <span class="Attribute">manifest:key-size</span> <a href="#attribute-manifest_key-size">4.8.7</a> and <span class="Attribute">manifest:start-key-generation-name</span> <a href="#attribute-manifest_start-key-generation-name">4.8.6</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;manifest:start-key-generation&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a4_7_manifest_key-derivation_"><span style="margin-right:0.127cm;">4.7</span></a><a id="__RefHeading__752839_826425813"/><a id="element-manifest_key-derivation"/>&lt;manifest:key-derivation&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;manifest:key-derivation&gt;</span> element specifies how the encryption key was calculated from the encryption start key.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Element">&lt;manifest:key-derivation&gt;</span> element is usable within the following element: <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a>.</p><p class="Attribute_20_List">The <span class="Element">&lt;manifest:key-derivation&gt;</span> element has the following attributes: <span class="Attribute">manifest:iteration-count</span> <a href="#attribute-manifest_iteration-count">4.8.8</a>, <span class="Attribute">manifest:key-derivation-name</span> <a href="#attribute-manifest_key-derivation-name">4.8.9</a>, <span class="Attribute">manifest:key-size</span> <a href="#attribute-manifest_key-size">4.8.7</a> and <span class="Attribute">manifest:salt</span> <a href="#attribute-manifest_salt">4.8.12</a>.</p><p class="Child_20_Element_20_List_borderEnd">The <span class="Element">&lt;manifest:key-derivation&gt;</span> element has no child elements.</p><h2 class="Heading_20_2"><a id="a4_8Manifest_Attributes"><span style="margin-right:0.127cm;">4.8</span></a><a id="__RefHeading__752841_826425813"/>Manifest Attributes</h2><h3 class="Heading_20_3"><a id="a4_8_1manifest_algorithm-name"><span style="margin-right:0.127cm;">4.8.1</span></a><a id="__RefHeading__752843_826425813"/><a id="attribute-manifest_algorithm-name"/>manifest:algorithm-name</h3><p class="Text_20_body">The <span class="Attribute">manifest:algorithm-name</span> attribute specifies the algorithm and mode used to encrypt a file entry. </p><p class="Text_20_body">The defined values for the <span class="Attribute">manifest:algorithm-name</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="T9">An IRI listed in §5.2 of </span><span class="T9"><a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a></span><span class="T9">: The algorithm and mode specified in §5.2 of </span><span class="T9"><a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a></span><span class="T9"> for this IRI.</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">Blowfish CFB</span>: The Blowfish algorithm in 8-bit CFB mode. See <a title="Applied Cryptography (Second Edition)">[Schneier]</a>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#blowfish</span>: The same algorithm as identified by <span class="Attribute_20_Value">Blowfish CFB</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The IRI of an alternative algorithm as specified in §5.1 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a>. Alternative algorithms may be specified by extended conforming <span class="T2">package</span>s only. They shall not be specified by conforming <span class="T2">package</span>s.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>Package producers that support encryption shall support the value <span class="Attribute_20_Value">Blowfish CFB</span>. Package consumers that support encryption shall support the values <span class="Attribute_20_Value">Blowfish CFB</span> and <span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#blowfish</span>.<span class="odfLiEnd"/> </p></li></ul><p class="Note"><span class="Note_20_Label">Note</span>: An errata for <a title="Applied Cryptography (Second Edition)">[Schneier]</a> is available at <a title="Applied Cryptography 2nd. Ed. - Errata" href="http://www.schneier.com/book-applied-errata.html">[Schneier-Errata]</a>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:algorithm-name</span> attribute is usable with the following element: <span class="Element">&lt;manifest:algorithm&gt;</span> <a href="#element-manifest_algorithm">4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">manifest:algorithm-name</span> attribute are <span class="Attribute_20_Value">Blowfish CFB</span> or a value of type <span class="Datatype">anyURI</span> <a href="#datatype-anyURI">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_2manifest_checksum"><span style="margin-right:0.127cm;">4.8.2</span></a><a id="__RefHeading__752845_826425813"/><a id="attribute-manifest_checksum"/>manifest:checksum</h3><p class="Text_20_body">The <span class="Attribute">manifest:checksum</span> attribute specifies a digest in BASE64 encoding that can be used to detect password correctness as specified by a <span class="Attribute">manifest:checksum-type</span> attribute <a href="#attribute-manifest_checksum-type">4.8.3</a> .</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:checksum</span> attribute is usable with the following element: <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:checksum</span> attribute has the data type <span class="Datatype">base64Binary</span> <a href="#datatype-base64Binary">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_3manifest_checksum-type"><span style="margin-right:0.127cm;">4.8.3</span></a><a id="__RefHeading__752847_826425813"/><a id="attribute-manifest_checksum-type"/>manifest:checksum-type</h3><p class="Text_20_body">The <span class="Attribute">manifest:checksum-type</span> attribute specifies the name of a digest algorithm that can be used to check password correctness. The digest is build from the compressed unencrypted file.</p><p class="Text_20_body">The defined values for the <span class="Attribute">manifest:checksum-type</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">SHA1/1K</span>: SHA1 algorithm (see <span class="T8"><a title="US Secure Hash Algorithm 1 (SHA1)" href="http://www.ietf.org/rfc/rfc3174.txt">[RFC3174]</a></span>) applied to first 1024 bytes of the compressed unencrypted file.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">SHA1</span>: The same as <span class="Attribute_20_Value">http://www.w3.org/2000/09/xmldsig#sha1</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#sha1-1k</span>: The same as <span class="Attribute_20_Value">SHA1/1K</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#sha256-1k</span>: SHA256 algorithm (see <span class="T8"><a title="US Secure Hash Algorithm 1 (SHA1)" href="http://www.ietf.org/rfc/rfc3174.txt">[RFC3174]</a></span>) applied to first 1024 bytes of the compressed unencrypted file.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>An IRI listed in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a>: The algorithm specified in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a> for this IRI.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The IRI of an alternative algorithm as specified in §5.1 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a>. Alternative algorithms may be specified by extended conforming <span class="T2">package</span>s only. They shall not be specified by conforming <span class="T2">package</span>s.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Package producers that support encryption should use the <span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#sha256-1k</span> algorithm, Package consumers that support encryption shall support the values <span class="Attribute_20_Value">SHA1/1K</span>, <span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#sha1</span>-1k and <span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#sha256-1k</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:checksum-type</span> attribute is usable with the following element: <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">manifest:checksum-type</span> attribute are <span class="Attribute_20_Value">SHA1/1K</span> or a value of type <span class="Datatype">anyURI</span> <a href="#datatype-anyURI">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_4manifest_full-path"><span style="margin-right:0.127cm;">4.8.4</span></a><a id="__RefHeading__752849_826425813"/><a id="attribute-manifest_full-path"/>manifest:full-path</h3><p class="Text_20_body">The <span class="Attribute">manifest:full-path</span> attribute describes the location of a file or directory within the package. It's value is the name of a file or folder within the Zip file for which the manifest entry defines additional information, including its relative path in the package. The notation is the same as for the “filename” fields of the Zip file's central directory.</p><p class="Text_20_body">The attribute value "<span class="Attribute_20_Value">/</span>" denotes a manifest entry for the package itself.</p><p class="Text_20_body"><span class="Note_20_Label">Note:</span> The Zip file's central directory and the manifest file may have different text encodings.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:full-path</span> attribute is usable with the following element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:full-path</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_5manifest_initialisation-vector"><span style="margin-right:0.127cm;">4.8.5</span></a><a id="__RefHeading__752851_826425813"/><a id="attribute-manifest_initialisation-vector"/>manifest:initialisation-vector</h3><p class="Text_20_body">The <span class="Attribute">manifest:initialisation-vector</span> attribute value provides the byte-sequence for the initialization vector used by the encryption algorithm when delivery of a required initialization vector is not specified as part of the encryption algorithm definition. The initialization vector is a BASE64 encoded binary sequence. The format and length of an initialization vector, in bytes, shall be as required by its encryption algorithm specification.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:initialisation-vector</span> attribute is usable with the following element: <span class="Element">&lt;manifest:algorithm&gt;</span> <a href="#element-manifest_algorithm">4.5</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:initialisation-vector</span> attribute has the data type <span class="Datatype">base64Binary</span> <a href="#datatype-base64Binary">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_6manifest_start-key-generation-name"><span style="margin-right:0.127cm;">4.8.6</span></a><a id="__RefHeading__752853_826425813"/><a id="attribute-manifest_start-key-generation-name"/>manifest:start-key-generation-name</h3><p class="Text_20_body"><span class="T1">The </span><span class="Attribute">manifest:start-key-generation-name</span><span class="T1"> attribute specifies the algorithm used to generate a start key from the user password.</span></p><p class="Text_20_body"><span class="T1">The defined values for the </span><span class="Attribute">manifest:start-key-generation-name</span><span class="T1"> attribute are:</span></p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">SHA1</span><span class="T10">:</span><span class="T1"> The SHA1 algorithm </span><span class="T8">(see </span><span class="T8"><a title="US Secure Hash Algorithm 1 (SHA1)" href="http://www.ietf.org/rfc/rfc3174.txt">[RFC3174]</a></span><span class="T8">)</span><span class="T1">.</span><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>An IRI listed in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a>: The algorithm specified in §5.7 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a> for this IRI.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The IRI of an alternative algorithm as specified in §5.1 of <a title="XML Encryption Syntax and Processing" href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">[xmlenc-core]</a> Alternative algorithms may be specified by extended conforming <span class="T2">package</span>s only. They shall not be specified by conforming <span class="T2">package</span>s.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The default value for this attribute is <span class="Attribute_20_Value">SHA1</span>.</p><p class="Text_20_body"><span class="T1">Package producers that support encryption should use the </span><span class="Attribute_20_Value">http://www.w3.org/2000/09/xmldsig#sha256</span><span class="T1"> algorithm</span><span class="T3">.</span><span class="T1"> Package consumers that support encryption shall support the values </span><span class="Attribute_20_Value">SHA1</span><span class="T1">, and</span> <span class="Attribute_20_Value">http://www.w3.org/2000/09/xmldsig#sha1</span> and <span class="Attribute_20_Value">http://www.w3.org/2000/09/xmldsig#sha256</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:start-key-generation-name</span> attribute is usable with the following element: <span class="Element">&lt;manifest:start-key-generation&gt;</span> <a href="#element-manifest_start-key-generation">4.6</a>.</p><p class="Attribute_20_Value_20_List">The values of the <span class="Attribute">manifest:start-key-generation-name</span> attribute are <span class="Attribute_20_Value">SHA1</span> or a value of type <span class="Datatype">anyURI</span> <a href="#datatype-anyURI">7.2</a>.</p><p class="P6_borderEnd"><span class="T8">The </span>manifest:start-key-generation-name<span class="T8"> attribute has the value </span><span class="T4">SHA1</span><span class="T8"> or a value of data type </span><span class="Datatype"><span class="T8">anyURI</span></span><span class="T8">.</span></p><h3 class="Heading_20_3"><a id="a4_8_7manifest_key-size"><span style="margin-right:0.127cm;">4.8.7</span></a><a id="__RefHeading__752855_826425813"/><a id="attribute-manifest_key-size"/>manifest:key-size</h3><p class="Text_20_body"><span class="T1">The</span> <span class="Attribute">manifest:key-size</span> a<span class="T1">ttribute specifies the length </span><span class="T1">in octets </span><span class="T1">of a key</span><span class="T1"> delivered by a key-developing algorithm</span><span class="T1">.</span></p><p class="Text_20_body"><span class="T1">For a </span><span class="Element">&lt;manifest:start-key-generation&gt;</span><span class="T1"> element, the default value for this attribute is </span><span class="Attribute_20_Value"><span class="T1">20</span></span><span class="T1">.</span></p><p class="Note"><span class="Note_20_Label">Note</span><span class="T1">: The value used will need to be compatible with the result obtain from the start-key-generation algorithm and the input requirements of the key derivation algorithm.<br/><br/>For a </span><span class="Element">&lt;manifest:key-derivation&gt;</span><span class="T1"> element, the default value for this attribute is </span><span class="Attribute_20_Value"><span class="T1">16</span></span><span class="T1">.</span></p><p class="Note"><span class="Note_20_Label">Note</span><span class="T1">: The value used will need to be one obtainable from the key-derivation algorithm and acceptable for the encryption algorithm being used.</span></p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:key-size</span> attribute is usable with the following elements: <span class="Element">&lt;manifest:key-derivation&gt;</span> <a href="#element-manifest_key-derivation">4.7</a> and <span class="Element">&lt;manifest:start-key-generation&gt;</span> <a href="#element-manifest_start-key-generation">4.6</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:key-size</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_8manifest_iteration-count"><span style="margin-right:0.127cm;">4.8.8</span></a><a id="__RefHeading__752857_826425813"/><a id="attribute-manifest_iteration-count"/>manifest:iteration-count</h3><p class="Text_20_body">The <span class="Attribute">manifest:iteration-count</span> attribute specifies the number of iterations used by the key derivation algorithm to derive a key.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:iteration-count</span> attribute is usable with the following element: <span class="Element">&lt;manifest:key-derivation&gt;</span> <a href="#element-manifest_key-derivation">4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:iteration-count</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_9manifest_key-derivation-name"><span style="margin-right:0.127cm;">4.8.9</span></a><a id="__RefHeading__752859_826425813"/><a id="attribute-manifest_key-derivation-name"/>manifest:key-derivation-name</h3><p class="Text_20_body">The <span class="Attribute">manifest:key-derivation-name</span> attribute specifies the password-based key-derivation algorithm used to derive a cryptographic key for use in encryption and decryption of the file.</p><p class="Text_20_body">The defined values for the <span class="Attribute">manifest:key-derivation-name</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">PBKDF2</span>: The PBKDF2 key derivation method with HMAC-SHA-1 for the Pseudo-Random Function(PRF). See <a title="PKCS #5: Password-Based Cryptography Specification Version 2.0" href="http://www.ietf.org/rfc/rfc2898.txt">[RFC2898]</a> sections 5.2 and B.1.1.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#pbkdf2</span>: The same algorithms as identified by <span class="Attribute_20_Value">PBKDF2</span>.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>The IRI of an implementation-defined alternative algorithm. Alternative algorithms may be specified by extended conforming <span class="T2">package</span>s only. They shall not be specified by conforming <span class="T2">package</span>s.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Package producers that support encryption shall support the value <span class="Attribute_20_Value">PBKDF2</span>. <span class="T1">Package consumers that support encryption shall support the values </span><span class="Attribute_20_Value">PBKDF2</span><span class="T1"> and </span><span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#pbkdf2</span>.</p><p class="Text_20_body">If the value of this attribute is <span class="Attribute_20_Value">PBKDF2</span> or <span class="Attribute_20_Value">urn:oasis:names:tc:opendocument:xmlns:</span><span class="Attribute_20_Value">manifest</span><span class="Attribute_20_Value">:1.0</span><span class="Attribute_20_Value">#pbkdf2</span> the <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a> shall contain a <span class="Element">&lt;manifest:start-key-generation&gt;</span> <a href="#element-manifest_start-key-generation">4.6</a> child element that specifies the start key for the PBKDF2 algorithm.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:key-derivation-name</span> attribute is usable with the following element: <span class="Element">&lt;manifest:key-derivation&gt;</span> <a href="#element-manifest_key-derivation">4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">manifest:key-derivation-name</span> attribute are <span class="Attribute_20_Value">PBKDF2</span> or a value of type <span class="Datatype">anyURI</span> <a href="#datatype-anyURI">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_10manifest_media-type"><span style="margin-right:0.127cm;">4.8.10</span></a><a id="__RefHeading__752861_826425813"/><a id="attribute-manifest_media-type"/>manifest:media-type</h3><p class="Text_20_body">The <span class="Attribute">manifest:media-type</span> attribute specifies the MIME media type of a file or directory. See <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a>.</p><p class="Text_20_body">A <span class="Attribute">manifest:media-type</span> attribute should be present for all files and directories where a MIME media type exists for the content of the file, or the document or sub document contained in a directory.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:media-type</span> attribute is usable with the following element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:media-type</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_11manifest_preferred-view-mode"><span style="margin-right:0.127cm;">4.8.11</span></a><a id="__RefHeading__752863_826425813"/><a id="line-141"/><a id="attribute-manifest_preferred-view-mode"/><a id="line-13"/>manifest:preferred-view-mode</h3><p class="Text_20_body">The <span class="Attribute">manifest:preferred-view-mode</span> attribute specifies a preference on how the author of the document would like the document to be presented upon the document being opened. This attribute is only applicable to the root file entry with the <span class="Attribute">manifest:full-path</span> <a href="#attribute-manifest_full-path">4.8.4</a> attribute value of "<span class="Attribute_20_Value">/</span>".</p><p class="Text_20_body">The defined values for the <span class="Attribute">manifest:preferred-view-mode</span> attribute are:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">edit</span>: The author's preference is to open the document as an editable document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">presentation-slide-show</span>: The author's preference is to open the document as presentation slide show.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute_20_Value">read-only</span>: The author's preference is to open the document as a read-only document.<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>A namespaced token value: Specifies an implementation defined view.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">Preferred view modes are not necessarily generally applicable to all media types. The default preferred view mode is implementation defined. The behavior for cases where the <span class="Attribute">manifest:preferred-view-mode</span> attribute is absent is implementation defined.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:preferred-view-mode</span> attribute is usable with the following element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The values of the <span class="Attribute">manifest:preferred-view-mode</span> attribute are <span class="Attribute_20_Value">edit</span>, <span class="Attribute_20_Value">presentation-slide-show</span>, <span class="Attribute_20_Value">read-only</span> or a value of type <span class="Datatype">namespacedToken</span> <a href="#datatype-namespacedToken">7.3.1</a>.</p><h3 class="Heading_20_3"><a id="a4_8_12manifest_salt"><span style="margin-right:0.127cm;">4.8.12</span></a><a id="__RefHeading__752865_826425813"/><a id="attribute-manifest_salt"/>manifest:salt</h3><p class="Text_20_body">The <span class="Attribute">manifest:salt</span> attribute carries the value of a cryptographically-random binary value designed to mitigate certain cryptographic attacks on the password. There is no maximum length to the salt. See <a title="PKCS #5: Password-Based Cryptography Specification Version 2.0" href="http://www.ietf.org/rfc/rfc2898.txt">[RFC2898]</a> for further considerations in the use of salts with key-derivation and other cryptographic functions. The salt is encoded in the attribute value as <span class="Datatype">base64binary</span>.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:salt</span> attribute is usable with the following element: <span class="Element">&lt;manifest:key-derivation&gt;</span> <a href="#element-manifest_key-derivation">4.7</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:salt</span> attribute has the data type <span class="Datatype">base64Binary</span> <a href="#datatype-base64Binary">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_13manifest_size"><span style="margin-right:0.127cm;">4.8.13</span></a><a id="__RefHeading__752867_826425813"/><a id="attribute-manifest_size"/>manifest:size</h3><p class="Text_20_body">The <span class="Attribute">manifest:size</span> attribute shall be present for encrypted files. See <a href="#Encryption">3.4</a>. Its value shall be size of the uncompressed, unencrypted file in bytes.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:size</span> attribute is usable with the following element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:size</span> attribute has the data type <span class="Datatype">nonNegativeInteger</span> <a href="#datatype-nonNegativeInteger">7.2</a>.</p><h3 class="Heading_20_3"><a id="a4_8_14manifest_version"><span style="margin-right:0.127cm;">4.8.14</span></a><a id="__RefHeading__752869_826425813"/><a id="attribute-manifest_version"/>manifest:version</h3><h4 class="Heading_20_4"><a id="a4_8_14_1_manifest_file-entry_"><span style="margin-right:0.127cm;">4.8.14.1</span></a><a id="attribute-manifest_version_element-manifest_file-entry"/>&lt;manifest:file-entry&gt;</h4><p class="Text_20_body">The <span class="Attribute">manifest:version</span> attribute specifies the format version of a file entry. For documents that are composed from multiple files, this attribute is specified at the manifest entry that references the folder that contains these files.</p><p class="Text_20_body">The interpretation of the attribute value depends on the MIME media type specified in the <span class="Attribute">manifest:media-type</span> attribute.</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:version</span> attribute is usable with the following element: <span class="Element">&lt;manifest:file-entry&gt;</span> <a href="#element-manifest_file-entry">4.3</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The <span class="Attribute">manifest:version</span> attribute has the data type <span class="Datatype">string</span> <a href="#datatype-string">7.2</a>.</p><h4 class="Heading_20_4"><a id="a4_8_14_2_manifest_manifest_"><span style="margin-right:0.127cm;">4.8.14.2</span></a><a id="attribute-manifest_version_element-manifest_manifest"/>&lt;manifest:manifest&gt;</h4><p class="Text_20_body">The <span class="Attribute">manifest:version</span> attribute identifies the version of OpenDocument specification that defines the schema and interpretation of the package manifest. The value of the <span class="Attribute">manifest:version</span> attribute shall be "<span class="Attribute_20_Value">1.2</span>".</p><p class="Parent_20_Element_20_List_borderStart">The <span class="Attribute">manifest:version</span> attribute is usable with the following element: <span class="Element">&lt;manifest:manifest&gt;</span> <a href="#element-manifest_manifest">4.2</a>.</p><p class="Attribute_20_Value_20_List_borderEnd">The only value of the <span class="Attribute">manifest:version</span> attribute is <span class="Attribute_20_Value">1.2</span>.</p><h1 class="Heading_20_1"><a id="a5Digital_Signatures_File"><span style="margin-right:0.127cm;">5</span></a><a id="__RefHeading__752871_826425813"/><a id="Digital_Signature_File"/>Digital Signatures File</h1><h2 class="Heading_20_2"><a id="a5_1Introduction"><span style="margin-right:0.127cm;">5.1</span></a><a id="__RefHeading__752873_826425813"/>Introduction</h2><p class="Text_20_body">The format of the digital signature files is defined by the OpenDocument digital signature schema Relax-NG <a title="Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG" href="http://oasis-open.org/committees/relax-ng/spec-20011203.html">[RNG]</a> schema. See appendix A. This chapter describes the semantics of the elements and attributes defined by this schema.</p><h2 class="Heading_20_2"><a id="a5_2_dsig_document-signatures_"><span style="margin-right:0.127cm;">5.2</span></a><a id="__RefHeading__752875_826425813"/><a id="element-dsig_document-signatures"/><a id="element2-dsig_document-signatures"/><a id="DDE_LINK"/>&lt;dsig:document-signatures&gt;</h2><p class="Text_20_body">The <span class="Element">&lt;dsig:document-signatures&gt;</span> root element serves as a container for any number of <span class="Alien_20_Element">&lt;ds:Signature&gt;</span> <a href="#element2-xmldsig_Signature">5.3</a> elements. If the <span class="Element">&lt;dsig:document-signatures&gt;</span> element contains multiple <span class="Alien_20_Element">&lt;ds:Signature&gt;</span> elements, then there <span class="ISO_20_Keyword">should</span> be a relation between the digital signatures they define, for instance, they may all apply to the same set of files.</p><p class="Text_20_body">Consumers <span class="ISO_20_Keyword">may </span>require that a digital signature includes a certain set of files. That is, they <span class="ISO_20_Keyword">may </span>consider a digital signature to be valid if, and only if,</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>the digital signature itself is valid, and<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>if the <span class="Alien_20_Element">&lt;</span><span class="Alien_20_Element">ds:</span><span class="Alien_20_Element">Reference&gt;</span> child elements of the <span class="Alien_20_Element">&lt;</span><span class="Alien_20_Element">ds:</span><span class="Alien_20_Element">Signature&gt;</span> element reference a certain set of files.<span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">In particular, consumers <span class="ISO_20_Keyword">may</span> require that a digital signature references all files contained in a package.</p><p class="Text_20_body">If a digital signature file is not encrypted, consumers shall not decrypt files that are referenced by <span class="Alien_20_Element">&lt;</span><span class="Alien_20_Element">ds:</span><span class="Alien_20_Element">Reference&gt;</span> elements and that are encrypted before validating the signature.</p><p class="Text_20_body">If a digital signature file is encrypted, consumers shall decrypt files that are referenced by <span class="Alien_20_Element">&lt;</span><span class="Alien_20_Element">ds:</span><span class="Alien_20_Element">Reference&gt;</span> elements and that are encrypted before validating the signature.</p><p class="Parent_20_Element_20_List2_borderStart">The <span class="Element">&lt;dsig:document-signatures&gt;</span> element is a root element.</p><p class="Attribute_20_List2">The <span class="Element">&lt;dsig:document-signatures&gt;</span> element has the following attribute: <span class="Attribute">dsig:version</span> <a href="#attribute-dsig_version">5.4.1</a>.</p><p class="Child_20_Element_20_List2_borderEnd">The <span class="Element">&lt;dsig:document-signatures&gt;</span> element has the following child element: <span class="Element">&lt;ds:Signature&gt;</span> <a href="#element2-xmldsig_Signature">5.3</a>.</p><h2 class="Heading_20_2"><a id="a5_3_ds_Signature_"><span style="margin-right:0.127cm;">5.3</span></a><a id="__RefHeading__752877_826425813"/><a id="element2-xmldsig_Signature"/><a id="attribute-manifest_version_element-ds_Signature"/>&lt;ds:Signature&gt;</h2><p class="Text_20_body">The <span class="Alien_20_Element">&lt;ds:Signature&gt;</span> element is defined by the <a title=" XML Signature Syntax and Processing (Second Edition)" href="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/">[xmldsig-core]</a> specification. Each <span class="Alien_20_Element">&lt;ds:Signature&gt;</span> element shall contain an <span class="Alien_20_Attribute">Id</span> attribute specifying a unique value. A producer may use the XAdES extensions as specified in ETSI TS 101 903 v1.4.1 <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a>, or later versions of the XAdES specification.</p><p class="Text_20_body">A <span class="Alien_20_Element">&lt;ds:KeyInfo&gt;</span> element, as specified in <a title=" XML Signature Syntax and Processing (Second Edition)" href="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/">[xmldsig-core]</a>, section 4.4 shall be included. The <span class="Alien_20_Element">&lt;ds:KeyInfo&gt;</span> element should contain an <span class="Alien_20_Element">&lt;ds:X509Data&gt;</span> element containing an <span class="Alien_20_Element">&lt;ds:X509IssuerSerial&gt;</span> element specifying the issuer and serial number of the signing certificate, and an <span class="Alien_20_Element">&lt;ds:X509Certificate&gt;</span> element specifying the full signing certificate.</p><p class="Text_20_body">Additional <span class="Alien_20_Element">&lt;ds:X509Certificate&gt;</span> elements may be placed in the <span class="Alien_20_Element">&lt;ds:X509Data&gt;</span>, or may be placed in the <span class="Alien_20_Element">&lt;xades:CertificateValues&gt;</span> element of the XAdES <span class="Alien_20_Element">&lt;ds:Object&gt;</span>, as defined in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a> section 7.6.1. The additional certificates should represent the entire certificate chain used for verification at signing time.</p><p class="Text_20_body"><span class="Alien_20_Element">&lt;ds:Reference&gt;</span> elements contained within a <span class="Alien_20_Element">&lt;ds:SignedInfo&gt;</span> element shall be resolved according to the following specification:</p><ol><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">1.</span>A <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element which has a Type attribute value of "<span class="Alien_20_Attribute_20_Value">http://docs.oasis-open.org/office/v1.2/OS/OpenDocument-v1.2.odt</span>" shall refer to files in the same package in the accordance with the procedure for resolving IRIs <a href="#Package_IRI">3.7</a>, except that the file entry path shall be the name of the signature file with its relative path omitted. <span class="odfLiEnd"/> </p><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm"><!-- --></span><span class="Note_20_Label">Note:</span> Consequently, an IRI-Reference consisting entirely of "#" followed by an ifragment (§2.2 of [RFC3987]) refers to the ID of an XML element within the same XML document containing this <span class="Alien_20_Element">&lt;ds:signature&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">2.</span>A <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element which has a Type attribute with a value of "<span class="Alien_20_Attribute_20_Value">http://uri.etsi.org/01903/v1.2.2#SignedProperties</span>" refers to an XAdES SignedProperties element.. A <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element which refers to the XAdES SignedProperties element (if present) shall be as specified in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a> section 6.3.1.<span class="odfLiEnd"/> </p></li><li><p class="P22" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0.4991cm">3.</span>A <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element which does not have a Type attribute shall be processed the same a <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element which has a Type attribute with a value of "<span class="Alien_20_Attribute_20_Value">http://docs.oasis-open.org/office/v1.2/OS/OpenDocument-v1.2.odt</span>".<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The only permitted <span class="Alien_20_Element">&lt;ds:Transform&gt;</span> elements which apply to files contained within the archive shall be canonicalization transforms, as specified in <a title=" XML Signature Syntax and Processing (Second Edition)" href="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/">[xmldsig-core]</a>, section 6.5.</p><p class="Text_20_body">The signing time should be recorded using one or more of the following approaches:</p><ol><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">1.</span>An <span class="Alien_20_Element">&lt;ds:Object &gt;</span> element containing a <span class="Alien_20_Element">&lt;ds:SignatureProperty&gt;</span> element with:<span class="odfLiEnd"/> </p><ol><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">a.</span>An <span class="Alien_20_Attribute">Id</span> attribute with a value containing a unique identifier.<span class="odfLiEnd"/> </p></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">b.</span>A Target attribute corresponding to the <span class="Alien_20_Attribute">Id</span> attribute of the <span class="Alien_20_Element">&lt;ds:Signature&gt;</span> element.<span class="odfLiEnd"/> </p></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">c.</span>A <span class="Alien_20_Element">&lt;date&gt;</span> element from the namespace "<span class="Alien_20_Attribute_20_Value">http://purl.org/dc/elements/1.1/</span>" containing the UTC time as <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> dateTime value.<span class="odfLiEnd"/> </p></li></ol></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">2.</span>A <span class="Alien_20_Element">&lt;xades:SigningTime&gt;</span> element as specified in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a> section 7.2.1.<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">If an <span class="Alien_20_Element">&lt;ds:Object&gt;</span> containing XAdES elements is present, then a document compliant with this specification uses the following options:</p><ol><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">1.</span>The <span class="Alien_20_Element">&lt;xades:SignedSignatureProperties&gt;</span> element shall contain a <span class="Alien_20_Element">&lt;xades:SigningCertificate&gt;</span> property as specified in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a> section 7.2.2.<span class="odfLiEnd"/> </p></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">2.</span>A &lt;xades:SigningTime&gt; element should be present as specified in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a> section 7.2.1.<span class="odfLiEnd"/> </p></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">3.</span>If any timestamp elements of type XAdESTimeStampType are present, such as the <span class="Alien_20_Element">&lt;xades:SignatureTimeStamp&gt;</span> or <span class="Alien_20_Element">&lt;xades: SigAndRefsTimestamp&gt;</span> elements, the time stamp information shall be specified as an EncapsulatedTimeStamp element containing DER encoded ASN.1. Data.<span class="odfLiEnd"/> </p></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">4.</span>If references to validation data are present, the <span class="Alien_20_Element">&lt;xades:SigAndRefsTimestamp&gt;</span> element as specified in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a> sections 7.5.1 and 7.5.1.1 shall be used.<span class="odfLiEnd"/> </p></li><li><p class="P20" style="margin-left:0cm;"><span class="Numbering_20_Symbols" style="display:block;float:left;min-width:0cm">5.</span>There shall be a <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element specifying the digest of the SignedProperties element, as specified in <a title="XML Advanced Electronic Signatures (XAdES)" href="http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=28064">[XAdES]</a>, section 6.2.1. This <span class="Alien_20_Element">&lt;ds:Reference&gt;</span> element shall be contained within the <span class="Alien_20_Element">&lt;ds:SignedInfo&gt;</span> element of the <span class="Alien_20_Element">&lt;ds:Signature&gt;</span> element.<span class="odfLiEnd"/> </p></li></ol><p class="Parent_20_Element_20_List2">The <span class="Element">&lt;ds:Signature&gt;</span> element is usable with the following element: <span class="Element">&lt;dsig:document-signatures&gt;</span> <a href="#element2-dsig_document-signatures">5.2</a>.</p><h2 class="Heading_20_2"><a id="a5_4Digital_Signatures_Attributes"><span style="margin-right:0.127cm;">5.4</span></a><a id="__RefHeading__752879_826425813"/>Digital Signatures Attributes</h2><h3 class="Heading_20_3"><a id="a5_4_1dsig_version"><span style="margin-right:0.127cm;">5.4.1</span></a><a id="__RefHeading__752881_826425813"/><a id="attribute-dsig_version"/>dsig:version</h3><p class="Text_20_body">The <span class="Attribute">dsig:version</span> attribute identifies the version of OpenDocument specification that defines the schema and interpretation of the digital signature file. The value of the <span class="Attribute">dsig:version</span> attribute shall be "<span class="Attribute_20_Value">1.2</span>".</p><p class="Parent_20_Element_20_List2_borderStart">The <span class="Attribute">dsig:version</span> attribute is usable with the following element: <span class="Element">&lt;dsig:document-signatures&gt;</span> <a href="#element2-dsig_document-signatures">5.2</a>.</p><p class="Parent_20_Element_20_List2_borderEnd">The only value of the <span class="Attribute">dsig:version</span> attribute is <span class="Attribute_20_Value">1.2</span>.</p><h1 class="Heading_20_1"><a id="a6Metadata_Manifest_Files"><span style="margin-right:0.127cm;">6</span></a><a id="__RefHeading__752883_826425813"/><a id="Metadata_Manifest_Files"/>Metadata Manifest Files</h1><h2 class="Heading_20_2"><a id="a6_1General"><span style="margin-right:0.127cm;">6.1</span></a><a id="__RefHeading__752885_826425813"/>General</h2><p class="Text_20_body">Metadata manifest files (see <a href="#Metadata">3.6</a>) have the file name “manifest.rdf”. The metadata manifest file for a document (see <a href="#General">3.1</a>) shall be stored in the root of the package. The metadata manifest file for a sub documents shall be stored in the sub document's directory.</p><p class="Text_20_body">Metadata manifest files enumerate metadata files and their relationships to other files in that document or sub document as defined by this specification.</p><p class="Text_20_body">The relationships are expressed in the metadata manifest files using <a title="   RDF/XML Syntax Specification (Revised)" href="http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/">[RDF-XML]</a> and the <a title="OWL Web Ontology Language Overview" href="http://www.w3.org/TR/2004/REC-owl-features-20040210/">[OWL]</a> Metadata Manifest Description ontology that is defined in appendix B. The following OWL classes and properties are defined.</p><h2 class="Heading_20_2"><a id="a6_2pkg_Document"><span style="margin-right:0.127cm;">6.2</span></a><a id="__RefHeading__752887_826425813"/><a id="owlclass-pkg_Document"/>pkg:Document</h2><p class="Text_20_body">An instance of the <span class="OWL_20_Class">pkg:Document</span> class in the metadata manifest file represents the document or sub document itself.</p><p class="Text_20_body">The following property is defined for the <span class="OWL_20_Class">pkg:Document</span> class: <span class="OWL_20_Property">pkg:hasPart</span> <a href="#owlproperty-pkg_hasPart">6.6</a>.</p><h2 class="Heading_20_2"><a id="a6_3pkg_File"><span style="margin-right:0.127cm;">6.3</span></a><a id="__RefHeading__752889_826425813"/><a id="owlclass-pkg_File"/>pkg:File</h2><p class="Text_20_body">A file in an OpenDocument package is represented by an instance of class <span class="OWL_20_Class">pkg:File</span> or by one of its subclasses, for example <span class="OWL_20_Class">pkg:MetadataFile</span>.</p><p class="Text_20_body">An instance of the <span class="OWL_20_Class">pkg:File</span> class (or one of its subclasses) is identified by an IRI.</p><p class="Text_20_body">The relationship between a file and a package is expressed using the property <span class="OWL_20_Property">pkg:hasPart</span> <a href="#owlproperty-pkg_hasPart">6.6</a>.</p><p class="Text_20_body">The following property is defined for the <span class="OWL_20_Class">pkg:File</span> class: <span class="OWL_20_Property">pkg:mimeType</span> <a href="#owlproperty-pkg_mimeType">6.7</a>.</p><h2 class="Heading_20_2"><a id="a6_4pkg_MetadataFile"><span style="margin-right:0.127cm;">6.4</span></a><a id="__RefHeading__752891_826425813"/>pkg:MetadataFile</h2><p class="Text_20_body">An instance of the <span class="OWL_20_Class">pkg:MetadataFile</span> class represents a metadata file.</p><p class="Text_20_body">The <span class="OWL_20_Class">pkg:MetadataFile</span> class is a subclass of <span class="OWL_20_Class">pkg:File</span> <a href="#owlclass-pkg_File">6.3</a>.</p><h2 class="Heading_20_2"><a id="a6_5pkg_Element"><span style="margin-right:0.127cm;">6.5</span></a><a id="__RefHeading__752893_826425813"/><a id="owlclass-pkg_Element"/>pkg:Element</h2><p class="Text_20_body">The <span class="OWL_20_Class">pkg:Element</span> class describes an XML element contained in a file within an OpenDocument package.</p><h2 class="Heading_20_2"><a id="a6_6pkg_hasPart"><span style="margin-right:0.127cm;">6.6</span></a><a id="__RefHeading__752895_826425813"/><a id="owlproperty-pkg_hasPart"/>pkg:hasPart</h2><p class="Text_20_body">The <span class="OWL_20_Property">pkg:hasPart</span> property locates a file described by <span class="OWL_20_Class">pkg:File</span> or its subclasses within a document or sub document.</p><p class="Text_20_body">This property can be used with the following class: <span class="OWL_20_Class">pkg:Document</span> <a href="#owlclass-pkg_Document">6.2</a>.</p><h2 class="Heading_20_2"><a id="a6_7pkg_mimeType"><span style="margin-right:0.127cm;">6.7</span></a><a id="__RefHeading__752897_826425813"/><a id="owlproperty-pkg_mimeType"/>pkg:mimeType</h2><p class="Text_20_body">The <span class="OWL_20_Property">pkg:mimeType</span> property is used to specify the MIME media type <a title="Media Type Specifications and Registration Procedures" href="http://www.ietf.org/rfc/rfc4288.txt">[RFC4288]</a> of file described by an <span class="OWL_20_Class">pkg:File</span> class or one of its subclasses.</p><p class="Text_20_body">This property can be used with the following class: <span class="OWL_20_Class">pkg:File</span> <a href="#owlclass-pkg_File">6.3</a>.</p><h1 class="Heading_20_1"><a id="a7Datatypes"><span style="margin-right:0.127cm;">7</span></a><a id="__RefHeading__752899_826425813"/>Datatypes</h1><h2 class="Heading_20_2"><a id="a7_1Introduction"><span style="margin-right:0.127cm;">7.1</span></a><a id="__RefHeading__752901_826425813"/>Introduction</h2><p class="Text_20_body">The values of attributes and elements are often described as having datatypes. These datatypes either are datatypes defined within <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a>, or are defined by this specification. Datatypes for which no <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> datatype exists are expressed in the schema by <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> datatypes. Some of these datatypes have additional constraints.</p><h2 class="Heading_20_2"><a id="a7_2W3C_Schema_Datatypes"><span style="margin-right:0.127cm;">7.2</span></a><a id="__RefHeading__752903_826425813"/>W3C Schema Datatypes</h2><p class="Text_20_body">The following <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> datatypes are used in this specification:</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><a id="datatype-anyURI"/>anyURI<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><a id="datatype-base64Binary"/>base64Binary<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><a id="datatype-nonNegativeInteger"/>nonNegativeInteger<span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><a id="datatype-string"/>string<span class="odfLiEnd"/> </p></li></ul><h2 class="Heading_20_2"><a id="a7_3Other_Datatypes"><span style="margin-right:0.127cm;">7.3</span></a><a id="__RefHeading__752905_826425813"/>Other Datatypes</h2><h3 class="Heading_20_3"><a id="a7_3_1namespacedToken"><span style="margin-right:0.127cm;">7.3.1</span></a><a id="__RefHeading__752907_826425813"/><a id="datatype-namespacedToken"/>namespacedToken</h3><p class="Text_20_body">A namespaced token is an <a title="XML Schema Part 2: Datatypes Second Edition" href="http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">[xmlschema-2]</a> QName that matches the definition of PrefixedName in §4 of <a title="Namespaces in XML 1.0 (Second Edition)" href="http://www.w3.org/TR/2006/REC-xml-names-20060816">[xml-names]</a>.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix A.</span><a id="__RefHeading__752909_826425813"/><a id="Appendix_A"/>Schemas<span class="odfLiEnd"/> </p><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">A.1.</span><a id="__RefHeading__752911_826425813"/>OpenDocument Manifest Schema<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">The OpenDocument manifest schema is defined by a separate document, whose location can be found in the <a href="#Related_Work">Related work</a> section on the introductory pages.</p><ol><li><ol><li><p class="Appendix_20_Heading_20_2" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:1.016cm">A.2.</span><a id="__RefHeading__752913_826425813"/>OpenDocument Digital Signature Schema<span class="odfLiEnd"/> </p></li></ol></li></ol><p class="Text_20_body">The OpenDocument digital signature schema is defined by a separate document, whose location can be found in the <a href="#Related_Work">Related work</a> section on the introductory pages.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix B.</span><a id="__RefHeading__752915_826425813"/><a id="Appendix_B"/>OpenDocument Metadata Manifest Ontology<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The OpenDocument metadata manifest ontology is defined by a separate document, whose location can be found in the <a href="#Related_Work">Related work</a> section on the introductory pages.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix C.</span><a id="__RefHeading__752917_826425813"/><a id="Appendix_C"/>Zip File Structure (Non normative)<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">A Zip file starts with a sequence of files, each of which can be compressed or stored in raw format. Each file has a local header immediately before its data, which contains most of the information about the file, including time-stamps, compression method and file name. The compressed file contents immediately follow, and are terminated by an optional data descriptor. The data descriptor contains the CRC and compressed size of the file, which are frequently not available when writing the local file header. If these details were included, the data descriptor can be skipped.</p><p class="Text_20_body">Each file in the archive is laid down sequentially in this format, followed by a central directory at the end of the Zip archive. The central directory is a contiguous set of directory entries, each of which contains all the information in the local file header, plus extras such as file comments and attributes. Most importantly, the central directory contains pointers to the position of each file in the archive for navigation of the Zip file.</p><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is a draw:frame.--><div style="width:2.9992in; padding:0; " class="fr1" id="Frame8"><!--Next 'div' was a 'draw:text-box'.--><div style="min-height:4.1866in;"><!--Next 'div' was a 'text:p'.--><div class="Figure"> <!--Next 'div' is a draw:frame.--><div style="height:4.1846in;width:3in; padding:0; " class="fr3" id="ZipFileStructure"><img style="height:10.6289cm;width:7.62cm;" alt="" src="./Pictures/10000200000001200000019292DCF9E2.gif"/></div><!--Next 'div' added for floating.--><div style="position:relative; left:0cm;">Figure <a id="refFigure0"/>1 - Zip file structure</div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div></div></div></div><div style="clear:both; line-height:0; width:0; height:0; margin:0; padding:0;"> </div><p class="Text_20_body">For more details about the Zip file format, see <a title="PKWARE Inc. Zip APPNOTE Version 6.2.0" href="available at http://www.pkware.com/support/application-note-archives">[ZIP]</a>.</p><ol><li><p class="Appendix_20_Heading_20_1" style="margin-left:0cm;"><span class="Zeichenformat" style="display:block;float:left;min-width:0.762cm">Appendix D.</span><a id="__RefHeading__752919_826425813"/><a id="Appendix_D"/>Changes From “Open Document Format for Office Applications (OpenDocument) v1.1” (Non Normative)<span class="odfLiEnd"/> </p></li></ol><p class="Text_20_body">The OpenDocument specification has been divided into three parts and has been restructured.</p><p class="Text_20_body">This appendix describes changes that are related to part 3 of this specification.</p><p class="Text_20_body">The following is a list of major features that have been added. For minor features please see the lists of new and changed elements and attributes.</p><ul><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>Digital Signatures <a href="#Digital_Signatures">3.5</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>RDF based metadata <a href="#Metadata">3.6</a><span class="odfLiEnd"/> </p></li><li><p class="P17" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span>Support for additional encryption algorithms <a href="#Encryption">3.4</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The following element is new for manifest files:</p><ul><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Element">&lt;manifest:start-key-generation&gt;</span> <a href="#element-manifest_start-key-generation">4.6</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The following attributes are new for manifest files:</p><ul><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:key-size</span> <a href="#attribute-manifest_key-size">4.8.7</a><span class="odfLiEnd"/> </p></li><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:preferred-view-mode</span> <a href="#attribute-manifest_preferred-view-mode">4.8.11</a><span class="odfLiEnd"/> </p></li><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:start-key-generation-name</span> <a href="#attribute-manifest_start-key-generation-name">4.8.6</a><span class="odfLiEnd"/> </p></li><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:version</span> <a href="#attribute-manifest_version">4.8.14</a><span class="odfLiEnd"/> </p></li></ul><p class="Text_20_body">The value types of the following attributes changed:</p><ul><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:algorithm-name</span> <a href="#attribute-manifest_algorithm-name">4.8.1</a> of <span class="Element">&lt;manifest:algorithm&gt;</span> <a href="#element-manifest_algorithm">4.5</a><span class="odfLiEnd"/> </p></li><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:checksum-type</span> <a href="#attribute-manifest_checksum-type">4.8.3</a> of <span class="Element">&lt;manifest:encryption-data&gt;</span> <a href="#element-manifest_encryption-data">4.4</a><span class="odfLiEnd"/> </p></li><li><p class="P21" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.6401cm">•</span><span class="Attribute">manifest:key-derivation-name</span> <a href="#attribute-manifest_key-derivation-name">4.8.9</a> of <span class="Element">&lt;manifest:key-derivation&gt;</span> <a href="#element-manifest_key-derivation">4.7</a><span class="odfLiEnd"/> </p></li></ul></body></html>
\ No newline at end of file
diff --git a/trunk/odfdom/src/main/javadoc/doc-files/simple_odf_fam_prop.jpg b/trunk/odfdom/src/main/javadoc/doc-files/simple_odf_fam_prop.jpg
new file mode 100644
index 0000000..3a01873
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/doc-files/simple_odf_fam_prop.jpg
Binary files differ
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/doc/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/doc/package.html
new file mode 100644
index 0000000..ad99f20
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/doc/package.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        The "Document Layer" exisit for usability reasons, it gives a feature based view on the document model.
+		One feature consists of one or more ODF elements (e.g. table).</br>
+		<b>NOTE:</b> Since ODFDOM 0.8.8, the "Document Layer" was marked as "Deprecated". We suggest you use Simple API replace the APIs in this package. Simple API is similar with it, but more stable and with more powerful features.
+		More detail information, please reference the Javadoc in each class.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/doc/table/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/doc/table/package.html
new file mode 100644
index 0000000..c181563
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/doc/table/package.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to manipulate table in ODF text and spreadsheet document.
+        
+	<p>
+	Table is a common used feature in ODF. 
+	This package provides convenient methods to manipulate table feature and its child features, such as row, column, cell, cell range.
+	<p>
+	OdfTable represents table in ODF. It provides methods to new a table, delete a table, get rows, 
+	columns, and cells of a table, new a cell range, insert and delete rows and columns, and so on.
+	<p>
+	OdfTableRow and OdfTableColumn represents row and column in ODF. It provides methods to get cells, 
+	get next and previous row and column, set properties of rows and columns, and so on.
+	<p>
+	OdfTableCell represents cell in ODF. It provides many methods to set the properties and values of a cell, 
+	such as horizontal alignment, vertical alignment, value, formula, value format, and so on.
+	<p>
+	OdfTableRange represents a range of cells in ODF. It provides a method to merge a range of cells to a single cell, and some other methods too.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/attribute/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/attribute/package.html
new file mode 100644
index 0000000..ce6f0a6
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/attribute/package.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        From the ODF RelaxNG generated Java classes representing the ODF attributes with their allowed value sets.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/element/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/element/package.html
new file mode 100644
index 0000000..cf97976
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/element/package.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        From the ODF RelaxNG generated Java classes representing the ODF elements.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/style/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/style/package.html
new file mode 100644
index 0000000..a05af15
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/style/package.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provides classes to create and access ODF styles and ODF style families.
+        (DEPRECATED: functionality will be moved to element.style for version 0.8 see <a href="https://odftoolkit.org/bugzilla/show_bug.cgi?id=72">
+        <b>Bug&nbsp;72</b></a>)
+        Instances of class OdfStyle represent the style of ODF elements.
+        Derived style classes for stylable elements were generated from the RelaxNG schema
+        and implement Interfaces which specify their possible style property attributes.
+        
+        <br>Note:
+        Classes OdfListStyle and ListStyle were not generated yet. This will follow in
+        upcoming versions. 
+        <p>
+        The class OdfStyleCollection provides access to all styles used in
+        the document. The class OdfDocument uses instances of the OdfStyleCollection
+        respectively for default-styles, document-styles and for automatic-styles.	
+        <p>
+        Each style-family is associated with a set of properties, e.g. style:family="text"
+        is associated with a style:text-properties child element. Some style families contain 
+        multiple style properties.The associations which properties go with which style
+        families were generated from the RelaxNG schema. The class OdfStyleFamily holds a static
+        instance for every possible style family which itself contains all possible style 
+        property attributes.
+        <p>
+        <!-- ToDo: update class diagram after style refactoring in 0.8 
+        The following class diagram is neither complete nor very detailed. It has the purpose 
+        to give a basic overview about how styles are handled by ODFDOM
+        <p align="center">
+        <img src="../../../../../doc-files/Abstract_ODFDOM_style.jpg">
+         -->
+        
+        
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/style/props/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/style/props/package.html
new file mode 100644
index 0000000..486d208
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/dom/style/props/package.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Classes representing the style properties. 
+        (DEPRECATED: functionality will be moved to element.style for version 0.8 see <a href="https://odftoolkit.org/bugzilla/show_bug.cgi?id=72">
+        <b>Bug&nbsp;72</b></a>)
+
+        Each style-family is associated with a set of properties, e.g. style:family="text"
+        is associated with a style:text-properties child element. Some style families contain 
+        multiple style properties.The associations which properties go with which style
+        families were generated from the RelaxNG schema. Then again these properties have 
+        various style property attributes.
+        <p align="center">
+        <img src="../../../../../doc-files/simple_odf_fam_prop.jpg">
+        
+        
+        
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/incubator/meta/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/incubator/meta/package.html
new file mode 100644
index 0000000..f371405
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/incubator/meta/package.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide classes to access the metadata of ODF documents. (Incubator Status)
+        <p>
+	This package provides very simple fuctions to set and get the properties of metadata in ODF documents. 
+	The fuctions to access metadata about auto-reload, template and hyperlink behaviour are not completed.
+	       
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/incubator/search/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/incubator/search/package.html
new file mode 100644
index 0000000..5530be6
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/incubator/search/package.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide classes to operate the content and style of the selected text content. (Incubator Status)
+        
+        <p>
+        Abstract class Navigation represent the navigate action on the specified document, and user can iterate all the results of this navigation operation. Abstract class Selection describes one result of navigation.
+        
+        <p>
+        The instance of derived navigation class will give the match condition so that user can get the corresponding derived Selection class instance. e.g. TextNavigation class is used to search the specified text content in the document. and TextStyleNavigation class can select the text which match the specified style.
+        <p>
+        TextSelection class which inheriates Selection represents a snippet text of the paragraph/heading/header/footer, it can be represent by the belonged element and the text index of this element. User can get delete this result, or replace this text with other content, add href link for this selections, append the italic style for it and paste this selection at the front of or the end of other selction.
+        <p>
+       
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/pkg/package.html b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/pkg/package.html
new file mode 100644
index 0000000..093da4d
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/org/odftoolkit/odfdom/pkg/package.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        Representing the "Package Layer", the physical document handling.        
+        File streams can be inserted and deleted.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/odfdom/src/main/javadoc/overview.html b/trunk/odfdom/src/main/javadoc/overview.html
new file mode 100644
index 0000000..99c8ae7
--- /dev/null
+++ b/trunk/odfdom/src/main/javadoc/overview.html
@@ -0,0 +1,214 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!--
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+<html>
+    <body>
+
+		<div class="wikiMainBody"><p><br />
+				The ODFDOM project's objective is to provide an easy API for reading, writing and manipulating documents of the OpenDocument format (ODF).
+			</p><h1><a name='The_ODFDOM_Layers'></a>The ODFDOM Layers</h1>
+			<p>
+			<div id='toc' style='border:solid #DEDEDF 1px;background:#EEE;padding:10px;'>
+
+				<div id='toctitle' style='padding-bottom:5px;font-weight:bold;'>
+
+					<span>Contents</span>
+				</div>
+				<div id='toccontents' style='list-style-type:none;'><ul><li>1 <a href='#The_ODFDOM_Layers'>The ODFDOM Layers</a></li></
+						<ul><li>1.1 <a href='#The_ODF_Package_Layer'>The ODF Package Layer</a></li>
+							<ul><li>1.1.1 <a href='#The_ODF_Package_API'>The ODF Package API</a></li>
+							</ul><li>1.2 <a href='#The_ODF_XML_Layer'>The ODF XML Layer</a></li>
+							<ul><li>1.2.1 <a href='#The_ODF_DOM_API'>The ODF DOM API</a></li>
+								<li>1.2.2 <a href='#The_ODF_Document_API'>The ODF Document API</a></li>
+							</ul></ul></ul></div>
+			</div><p><br />
+
+			</p><h1><a name='The_ODFDOM_Layers'></a>The ODFDOM Layers</h1>
+			<p>
+				The ODFDOM project's objective is to provide an easy API for reading, writing and manipulating documents of the OpenDocument format (ODF).
+				To archive this, the ODFDOM API follows a layered approach to access documents, as layered design is the robust foundation for a well-designed modular structure.
+
+			</p><p><img src='doc-files/ODFDOM-Layered-Model.png' />
+			</p><h2><a name='The_ODF_Package_Layer'></a>The ODF Package Layer</h2>
+		<p>The ODF Package Layer provides access to all resources stored within the ODF package, such as XML streams, images or embedded objects.
+		</p><h3><a name='The_ODF_Package_API'></a>The ODF Package API</h3>
+		<p>The ODF Package API covers all features from the <a class='external' href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.html">third part of the ODF 1.2 specification</a> defining the ODF Package features. The ODF 1.2 package features are build on top technologies as <a class='external' href="http://www.pkware.com/documents/APPNOTE/APPNOTE_6.2.0.txt">ZIP package handling</a>, <a class='external' href="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/">W3C encryption</a>, <a class='external' href="http://www.w3.org/TR/2008/REC-xmldsig-core-20080610/">W3C signature</a> and <a class='external' href="http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/">W3C metadata</a>.
+
+		</p><p>At this layer a document is in general represented by a bundle of named resources zipped to a package.
+			For instance, an ODF text document like 'myVacation.odt' might contain the following files:
+
+		</p><p><img src='doc-files/ODF_Package.jpg' />
+
+		</p><p><b>Note:</b>
+			All file streams aside of the '/Pictures' directory and its content are specified by the ODF standard.
+			Furthermore, the file streams are similar for all types of ODF documents.
+
+		</p><p>The main requirements for this layer in regard of ZIP are:
+		</p><ul><li> Zip/unzip the file streams of the package
+			</li><li> Enlist all file streams in the /META-INF/manifest.xml (similar to an inventory)
+			</li><li> Begin the package with an unzipped 'mimetype' file stream (allowing others to easily identify the package)
+			</li></ul><p>
+			All sources of the Package layer are organized in ODFDOM beyond <code>org.odftoolkit.odfdom.pkg.*</code>
+
+		</p><p>The following example illustrates how to add a graphic to the package level
+			(although not shown by an ODF application (like OpenOffice.org), as not used by the shown content):
+
+		</p><p><pre>
+
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+[...]
+
+// loads the ODF document package from the path
+OdfPackage pkg = OdfPackage.loadPackage(&quot;/home/myDocuments/myVacation.odt&quot;);
+
+// loads the image from the URL and inserts the image in the package,
+// adapting the manifest
+pkg.insert(new URI(&quot;./myHoliday.png&quot;), &quot;Pictures/myHoliday.png&quot;, &quot;image/png&quot;);
+pkg.save(&quot;/home/myDocuments/myVacation.odt&quot;);
+
+		</pre>
+
+	</p><p><br />
+
+	</p><h2><a name='The_ODF_XML_Layer'></a>The ODF XML Layer</h2>
+	<p>The ODF XML Layer provides all the features of an office format, such as tables, images, numbering etc. All features are defined in <a class='external' href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html">the first part of the ODF 1.2 specification</a> describing the ODF XML schema. This layer consists of two APIs representing two different views on the features.
+
+	</p><h3><a name='The_ODF_DOM_API'></a>The ODF DOM API</h3>
+	<p>The ODF DOM API gives access to the XML, the elemental parts of the ODF schema features. With this API it is easy to manipulate all specified XML nodes extending the platform and language independent DOM API <a class='external' href="http://www.w3.org/DOM/">DOM API standardized by the W3C</a> - best-known by its implementation through the browsers. It extends the DOM API using a typed DOM. For every ODF XML element and ODF XML attribute defined by the ODF grammar (the RelaxNG schema) a unique class exists, providing methods for their allowed children. The purpose is to provide the user a corset to easily write valid ODF without consulting the spec constantly. This API is very consistent as instead of laboriously writing all these classes, the sources were generated directly from the ODF schema. This generation guarantees complete coverage of the ODF specification on one side and an easy and accurate upgrade to future ODF specifications on the other.
+
+	</p><p>At this level, all XML file streams of the document are accessible via the <a class='external' href="http://www.w3.org/DOM/">W3C DOM API</a>, but only the ODF standardized XML file streams of the document (e.g. content.xml, meta.xml) have their own classes representing their ODF XML elements. Foreign XML within a specified ODF XML file will remain in the document model in general and won't be neglected unless desired ( which still might be a future option).
+
+	</p><p>Example of the ODF XML representing a table in ODF:
+
+	</p><p><img src='doc-files/FruitTable_code.jpg' />
+
+	</p><p><b>Note:</b> In the OpenDocument standard the ODF elements are reused among all document types. The above XML of a table is for instance equally usable in Text and Spreadsheet documents.
+
+	</p><p>
+		This XML would be mapped to a W3C derived ODF DOM class structure:
+
+	</p><p><img src='doc-files/800px-Table_fruits_diagramm.jpg' width="670px" height="346px" />
+
+	</p><p>All sources of the typed DOM API are organized beyond <code>org.odftoolkit.odfdom.dom.*</code>
+
+	</p><p>The sources for the ODF elements are all generated from the ODF grammar (RelaxNG schema) using the following naming conventions in the Java reference implementation:
+	</p><ul><li> The class name is equal to the element local name using the Namespace as prefix and 'Element' as suffix (e.g. the 'draw:frame' element has the <code>DrawFrameElement</code> class).
+		</li><li> Elements are stored beyond a sub-package equal to their Namespace used by the OOo. Therefore the frame element 'draw:frame' would be generated in Java as class <code>org.odftoolkit.odfdom.dom.draw.DrawFrameElement</code>.
+		</li></ul><p><b>Note:</b> The element local names 'h' and 'p' have been renamed to the classes 'Heading' and 'Paragraph' for usability reasons.
+
+	</p><p>The following example illustrates how to add a graphic to the ODF document, that it is viewable:
+	<pre>
+
+import java.net.URI;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+
+[...]
+
+// Load file
+OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(&quot;ImageIn.odt&quot;);
+
+// get root of all content of a text document
+OfficeTextElement officeText = odt.getContentRoot();
+
+// get first paragraph
+TextPElement firstParagraph =
+  OdfElement.findFirstChildNode(TextPElement.class, officeText);
+
+// XPath alternative to get the first paragraph
+/*
+  XPath xpath = XPathFactory.newInstance().newXPath();
+  xpath.setNamespaceContext(new OdfNamespace());
+  OdfFileDom dom = odt.getContentDom();
+  firstParagraph = (TextPElement) xpath.evaluate(&quot;//text:p[1]&quot;, dom, XPathConstants.NODE);
+*/
+
+// insert a frame
+DrawFrameElement frame = firstParagraph.newDrawFrameElement();
+
+// insert an image: This is a class from the Document API
+OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
+image.newImage(new URI(&quot;./MySampleImage.png&quot;));
+
+// Save file
+odt.save(&quot;ImageOut.odt&quot;);
+	</pre><br />
+	Even in this example we had to refer to a class from the Document API. Otherwise our implementation had gotten quite long and complex.
+
+</p><p><br />
+
+</p><h3><a name='The_ODF_Document_API'></a>The ODF Document API</h3>
+<p>
+	The ODF Document API provides a different much more high level view on the ODF schema features. This API is concerned about usability, hiding all ODF XML implementation details from the user, covering frequent user scenarios. For example, changing the content of a certain spreadsheet cell (e.g. Add 'Hello World' to a spreadsheet cell positioned at 'B2'). While in the ODF DOM API in general each class represents an ODF XML node, here a class covers multiple underlying ODF XML elements (&amp; their attributes). Think of puzzle piece consisting of multiple smaller pieces. Therefore the typed DOM tree is being mapped to feature tree.
+
+</p><p>As naming convention all sources of the ODF document functionality layer are organized beyond <code>org.odftoolkit.odfdom.doc.*</code>
+	The name of a document class is in general similar as the root element from the XML layer feature, only there is the new prefix 'Odf' and the suffix 'Element' has been neglected.
+
+</p><p>For example, the document class for a 'draw:frame' element would be represented in the ODFDOM Java reference implemenation as <code>org.odftoolkit.odfdom.doc.draw.OdfDrawFrame</code> class. Some classes of the Document API differ from this naming convention, e.g. OdfTextParagraph is the subclass of TextPElement. However by browsing the packages you will easily find the classes your looking for.
+
+</p><p><b>Note:</b> The Document API will change. The current inheritance between DOM and DOC elements does not fit any longer in the multiple elements to a single document feature (1:n) pattern. The first Document Object is the table <code>rg.odftoolkit.odfdom.doc.table.OdfTable</code>, others will follow soon.
+
+</p><p>Again let's look at the previous code example for the DOM API: Remember all DOM element classes are abstract and we're really getting objects from the Document API: Even if <code>frame.newDrawFrameElement()</code> is defined to return the DOM class DrawFrameElement, it really returns the DOC subclass OdfDrawFrame. So it's always save to use explicit casting <code>OdfDrawFrame frame = (OdfDrawFrame) firstParagraph.newDrawFrameElement();</code>.
+
+</p><p>However reworking the previous example would just make the code larger, since we're not using any of the document methods provided by the DOC subclasses.
+
+</p><p>Here's an example for working with DOC classes, completely avoiding handling the DOM manually:
+
+</p><p><pre>
+[...]
+// Load Image
+OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(&quot;ImageIn.odt&quot;);
+
+// Play around with text
+odt.addText(&quot;When there is no paragraph, the text will be embedded in a new paragraph&quot;);
+odt.newParagraph(&quot;Create new paragraph&quot;);
+odt.addText(&quot;\nThis is a new line&quot;);
+
+// Insert Image and make last paragraph its anchor
+odt.newImage(new URI(&quot;./MySampleImage.png&quot;));
+
+// Save file
+odt.save(&quot;ImageOut.odt&quot;);
+</pre>
+
+</p><p><br />
+
+<h2>Further Information</h2>
+For further Information about ODFDOM and related topics please visit following pages:
+<ol>
+	<li><a href="http://incubator.apache.org/odftoolkit/odfdom/index.html">ODFDOM</a></li>
+	<li><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html">OpenDocument v1.2 specification - part 1: OpenDocument Schema</a></li>
+	<li><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.html">OpenDocument v1.2 specification - part 3: Packages</a></li>
+	<li><a href="http://incubator.apache.org/odftoolkit/simple/index.html">Simple Java API</a></li>
+</ol>
+</p>
+</div>
+</body>
+</html>
diff --git a/trunk/odfdom/src/main/resources/OdfChartDocument.odc b/trunk/odfdom/src/main/resources/OdfChartDocument.odc
new file mode 100644
index 0000000..0860e0b
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/OdfChartDocument.odc
Binary files differ
diff --git a/trunk/odfdom/src/main/resources/OdfGraphicsDocument.odg b/trunk/odfdom/src/main/resources/OdfGraphicsDocument.odg
new file mode 100644
index 0000000..0a73855
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/OdfGraphicsDocument.odg
Binary files differ
diff --git a/trunk/odfdom/src/main/resources/OdfImageDocument.odi b/trunk/odfdom/src/main/resources/OdfImageDocument.odi
new file mode 100644
index 0000000..1f31418
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/OdfImageDocument.odi
Binary files differ
diff --git a/trunk/odfdom/src/main/resources/OdfPresentationDocument.odp b/trunk/odfdom/src/main/resources/OdfPresentationDocument.odp
new file mode 100644
index 0000000..db7ad19
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/OdfPresentationDocument.odp
Binary files differ
diff --git a/trunk/odfdom/src/main/resources/OdfSpreadsheetDocument.ods b/trunk/odfdom/src/main/resources/OdfSpreadsheetDocument.ods
new file mode 100644
index 0000000..1bc08dc
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/OdfSpreadsheetDocument.ods
Binary files differ
diff --git a/trunk/odfdom/src/main/resources/OdfTextDocument.odt b/trunk/odfdom/src/main/resources/OdfTextDocument.odt
new file mode 100644
index 0000000..d5e8265
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/OdfTextDocument.odt
Binary files differ
diff --git a/trunk/odfdom/src/main/resources/grddl/odf2rdf.xsl b/trunk/odfdom/src/main/resources/grddl/odf2rdf.xsl
new file mode 100644
index 0000000..f6d1696
--- /dev/null
+++ b/trunk/odfdom/src/main/resources/grddl/odf2rdf.xsl
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:pkg="http://docs.oasis-open.org/ns/office/1.2/meta/pkg#" xmlns:odf="http://docs.oasis-open.org/ns/office/1.2/meta/odf#">
+	<output method="xml" encoding="UTF-8" media-type="application/rdf+xml" indent="yes" omit-xml-declaration="yes" />
+
+  <!-- The base URL of the OpenDocument's three XML files (directory within package) -->
+	<param name="sourceBaseURL" select="'.'" />
+	<param name="FILE_URL">
+		<choose>
+			<when test="substring($sourceBaseURL, string-length($sourceBaseURL), 1) = '/'">
+				<value-of select="concat($sourceBaseURL , substring-after(name(/*), 'office:document-'), '.xml')"/>
+			</when>
+			<otherwise>
+				<!-- add '/' to the end of the document URL -->
+				<value-of select="concat($sourceBaseURL ,'/', substring-after(name(/*), 'office:document-'), '.xml')"/>
+			</otherwise>
+		</choose>
+	</param>
+
+
+	<!-- Version 1.2.0 by Svante.Schubert AT gmail.com
+		 First two digits mark the supported ODF version  -->
+	<variable name="stylesheetVersion" select="'1.2.0'"/>
+
+	<template match="/">
+		<element name="rdf:RDF">
+			<attribute name="xml:base">
+				<value-of select="$sourceBaseURL"/>
+			</attribute>
+			<element name="pkg:Document">
+				<attribute name="rdf:about">
+					<value-of select="$sourceBaseURL"/>
+				</attribute>
+				<call-template name="setMimeType"/>
+				<apply-templates select="*/@office:version" mode="root"/>
+				<apply-templates select="/office:document-meta/office:meta/*" mode="meta-file"/>
+			</element>
+			<apply-templates mode="content-styles-files"/>
+		</element>
+	</template>
+
+	<template match="@office:version" mode="root">
+		<attribute name="office:version">
+			<value-of select="."/>
+		</attribute>
+	</template>
+
+	<template name="setMimeType">
+		<!-- Use new ODF 1.2 RDF mimeType property -->
+		<if test="@office:mimetype or name(/*/office:body/*)">
+			<attribute name="pkg:mimeType">
+				<choose>
+					<when test="@office:mimetype">
+						<value-of select="@office:mimetype"/>
+					</when>
+					<otherwise>
+						<value-of select="concat('vnd.oasis.opendocument.', substring-after(name(/*/office:body/*), 'office:'))"/>
+					</otherwise>
+				</choose>
+			</attribute>
+		</if>
+	</template>
+
+	 <!-- OpenDocument meta.xml handling -->
+	<template match="*" mode="meta-file">
+		<element name="{name()}">
+			<value-of select="text()"/>
+		</element>
+	</template>
+
+	<template match="*[* or @*]" mode="meta-file">
+		<element name="{name()}">
+			<apply-templates select="@* | text()" mode="meta-file-child"/>
+		</element>
+	</template>
+
+	<template match="@*" mode="meta-file-child">
+		<attribute name="{name()}">
+			<value-of select="."/>
+		</attribute>
+	</template>
+
+	<template match="text()" mode="meta-file-child">
+		<attribute name="meta:value">
+			<value-of select="."/>
+		</attribute>
+	</template>
+
+	<!-- OpenDocument content.xml handling -->
+	<template match="/office:document-content/office:body/*" mode="content-styles-files">
+		<apply-templates mode="content-styles-files" />
+	</template>
+
+	<!-- OpenDocument styles.xml handling (header&footer)-->
+	<template match="/office:document-styles/office:master-styles/style:master-page/*" mode="content-styles-files">
+		<apply-templates mode="content-styles-files" />
+	</template>
+
+	<!-- ignore RDFa of deleted content -->
+	<template match="text:tracked-changes" mode="content-styles-files" />
+
+	<!-- RDFa -->
+	<template match="*" mode="content-styles-files">
+		<apply-templates mode="content-styles-files" />
+	</template>
+
+	<template match="text()" mode="content-styles-files"/>
+
+	<template match="*[@xhtml:about]" mode="content-styles-files">
+		<choose>
+			<when test="name() = 'text:bookmark-start'">
+				<call-template name="resolve-RDF-subject">
+					<with-param name="text">
+						<apply-templates select="following::node()[1]" mode="rdfa-bookmark-literal">
+							<with-param name="name" select="@text:name"/>
+						</apply-templates>
+					</with-param>
+				</call-template>
+			</when>
+			<otherwise>
+				<call-template name="resolve-RDF-subject">
+					<with-param name="text">
+						<apply-templates mode="rdfa-literal"/>
+					</with-param>
+				</call-template>
+			</otherwise>
+		</choose>
+	</template>
+
+	<template match="*" mode="rdfa-literal">
+		<apply-templates mode="rdfa-literal"/>
+	</template>
+
+	<template match="text()" mode="rdfa-literal">
+		<value-of select="."/>
+	</template>
+
+	<template match="*" mode="rdfa-bookmark-literal">
+		<param name="name"/>
+
+		<choose>
+			<when test="descendant::node()[1]">
+				<apply-templates select="descendant::node()[1]" mode="rdfa-bookmark-literal">
+					<with-param name="name" select="$name"/>
+				</apply-templates>
+			</when>
+			<otherwise>
+				<apply-templates select="following::node()[1]" mode="rdfa-bookmark-literal">
+					<with-param name="name" select="$name"/>
+				</apply-templates>
+			</otherwise>
+		</choose>
+	</template>
+
+	<template match="text()" mode="rdfa-bookmark-literal">
+		<param name="name"/>
+
+		<!-- heuristic instead of a check if parent may contain text -->
+		<if test="normalize-space(.) != ''">
+			<value-of select="."/>
+		</if>
+		<apply-templates select="following::node()[1]" mode="rdfa-bookmark-literal">
+			<with-param name="name" select="$name"/>
+		</apply-templates>
+	</template>
+
+	<template match="text:bookmark-end" mode="rdfa-bookmark-literal">
+		<param name="name"/>
+
+		<!-- end condition of the recursion, if the bookmark-end  -->
+		<if test="$name != @text:name">
+			<apply-templates select="following::node()[1]" mode="rdfa-bookmark-literal">
+				<with-param name="name" select="$name"/>
+			</apply-templates>
+		</if>
+	</template>
+
+	<template name="resolve-RDF-subject">
+		<param name="text" />
+
+		<!-- create RDF subject -->
+		<element name="rdf:Description">
+			<attribute name="rdf:about">
+				<call-template name="resolve-URI-or-Safe-CURIE">
+					<with-param name="URIorSafeCURIE" select="@xhtml:about"/>
+				</call-template>
+			</attribute>
+			<if test="@xhtml:content">
+				<attribute name="rdfs:label" namespace="http://www.w3.org/2000/01/rdf-schema#">
+					<value-of select="$text"/>
+				</attribute>
+			</if>
+			<call-template name="resolve-RDF-property">
+				<with-param name="CURIEs" select="@xhtml:property"/>
+				<with-param name="text" select="$text"/>
+			</call-template>
+		</element>
+	</template>
+
+	<template name="resolve-RDF-property">
+		<param name="CURIEs"/>
+		<param name="text"/>
+
+		<variable name="multiplePredicates" select="contains($CURIEs, ' ')"/>
+		<variable name="CURIE">
+			<choose>
+				<when test="$multiplePredicates">
+					<value-of select="normalize-space(substring-before($CURIEs, ' '))"/>
+				</when>
+				<otherwise>
+					<value-of select="$CURIEs"/>
+				</otherwise>
+			</choose>
+		</variable>
+		<variable name="ns">
+			<call-template name="get-namespace">
+				<with-param name="CURIE" select="normalize-space(substring-before($CURIEs, ' '))"/>
+			</call-template>
+		</variable>
+		<!-- RDF property -->
+		<element name="{$CURIE}" namespace="{$ns}">
+			<apply-templates select="@xhtml:datatype"/>
+			<choose>
+				<when test="@xhtml:content">
+					<value-of select="@xhtml:content"/>
+				</when>
+				<otherwise>
+					<value-of select="$text"/>
+				</otherwise>
+			</choose>
+		</element>
+
+		<if test="$multiplePredicates">
+			<call-template name="resolve-RDF-property">
+				<with-param name="CURIEs" select="normalize-space(substring-after($CURIEs, $CURIE))"/>
+				<with-param name="text" select="$text"/>
+			</call-template>
+		</if>
+	</template>
+
+	<template match="@xhtml:datatype">
+		<variable name="ns">
+			<call-template name="get-namespace">
+				<with-param name="CURIE" select="."/>
+			</call-template>
+		</variable>
+
+		<attribute name="rdf:datatype">
+			<value-of select="concat($ns, substring-after(., substring-before(.,':')))"/>
+		</attribute>
+	</template>
+
+	<template name="get-namespace">
+		<param name="CURIE"/>
+
+		<variable name="prefix" select="substring-before($CURIE,':')"/>
+		<choose>
+			<when test="string-length($prefix)&gt;0">
+				<value-of select="ancestor-or-self::*/namespace::*[name()=$prefix][1]"/>
+			</when>
+			<otherwise> <!-- default namespace -->
+				<value-of select="ancestor-or-self::*/namespace::*[name()=''][1]"/>
+			</otherwise>
+		</choose>
+	</template>
+
+	<template name="resolve-URI-or-Safe-CURIE">
+		<param name="URIorSafeCURIE"/>
+		<choose>
+			<when test="starts-with($URIorSafeCURIE,'[')"> <!-- a SafeCURIE -->
+				<value-of select="substring-after(substring-before($URIorSafeCURIE,']'),'[')"/>
+			</when>
+			<when test="starts-with($URIorSafeCURIE,'#')"> <!-- an ODF element -->
+				<value-of select="concat($FILE_URL,$URIorSafeCURIE)"/>
+			</when>
+			<when test="string-length($URIorSafeCURIE)=0"> <!-- an ODF document -->
+				<value-of select="$sourceBaseURL"/>
+			</when>
+			<otherwise> <!-- an IRI -->
+				<value-of select="$URIorSafeCURIE"/>
+			</otherwise>
+		</choose>
+	</template>
+
+	<template match="node()"/>
+</stylesheet>
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/junit/AlphabeticalOrderedRunner.java b/trunk/odfdom/src/test/java/org/odftoolkit/junit/AlphabeticalOrderedRunner.java
new file mode 100644
index 0000000..b6ee1d4
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/junit/AlphabeticalOrderedRunner.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.odftoolkit.Junit;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * Guarantees that the test methods of a test class are being executed in alphabetical order.
+ * Activated by annotating the test class using <code>@RunWith(AlphabeticalOrderedRunner.class)</code>.
+ * 
+ * @author svanteschubert
+ */
+public class AlphabeticalOrderedRunner extends BlockJUnit4ClassRunner {
+
+	//private static final Logger LOG = Logger.getLogger(OrderedRunner.class.getName());
+
+	/*                                                                         
+	 * default initializer                                                     
+	 */
+	public AlphabeticalOrderedRunner(Class _class) throws InitializationError {
+		super(_class);
+	}
+
+	/**
+	 * The initializer just pipes through to the superclass. Pretty standard
+	 * stuff. The interesting part is in overriding the computeTestMethods method.
+	 */
+	@Override
+	protected List computeTestMethods() {
+		List lst = super.computeTestMethods();
+		List methodList = new ArrayList(lst);
+
+		Collections.sort(methodList, new AlphabeticalOrder());
+
+		return methodList;
+	}
+
+	/*                                                                              
+	 * Class for alphabetical ordering of a list                                   
+	 */
+	public class AlphabeticalOrder implements Comparator {
+
+		public int compare(Object o1, Object o2) {
+			FrameworkMethod f1 = (FrameworkMethod) o1;
+			FrameworkMethod f2 = (FrameworkMethod) o2;
+
+			return f1.getName().compareTo(f2.getName());
+		}
+	}
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ChartTemplateTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ChartTemplateTest.java
new file mode 100644
index 0000000..8610ad3
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ChartTemplateTest.java
@@ -0,0 +1,98 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ * Test class for template aspects of chart.
+ */
+public class ChartTemplateTest {
+
+	private static final String TEST_CHART_TEMPLATE = "chartTestTemplate.otc";
+
+	@Test
+	@Ignore
+	public void testLoadingAChartTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_CHART_TEMPLATE));
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingAChartTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_CHART_TEMPLATE));
+		File destination = File.createTempFile("odfdom-test", ".otc");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewChartTemplate() throws Exception {
+		OdfDocument document = OdfChartDocument.newChartTemplateDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("odfdom-test", ".otc");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfChartDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfChartDocument() throws Exception {
+		OdfChartDocument document = OdfChartDocument.newChartDocument();
+		document.changeMode(OdfChartDocument.OdfMediaType.CHART_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+
+		document = OdfChartDocument.newChartTemplateDocument();
+		document.changeMode(OdfChartDocument.OdfMediaType.CHART);
+		Assert.assertEquals(OdfDocument.OdfMediaType.CHART.getMediaTypeString(), document.getPackage().getMediaTypeString());
+	}
+
+	@Test
+	public void testSwitchingOdfImageDocument() throws Exception {
+		OdfImageDocument document = OdfImageDocument.newImageDocument();
+		document.changeMode(OdfImageDocument.OdfMediaType.IMAGE_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.IMAGE_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+
+		document = OdfImageDocument.newImageTemplateDocument();
+		document.changeMode(OdfImageDocument.OdfMediaType.IMAGE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.IMAGE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/CreateChildrenElementsTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/CreateChildrenElementsTest.java
new file mode 100644
index 0000000..5c95fa2
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/CreateChildrenElementsTest.java
@@ -0,0 +1,437 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.anim.AnimAnimateElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartChartElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartPlotAreaElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawLineElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentContentElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleDefaultStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSoftPageBreakElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextList;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class CreateChildrenElementsTest {
+
+	@Test
+	public void testCreatChildrenForPresentation() {
+		try {
+			OdfPresentationDocument odfdoc = (OdfPresentationDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("presentation.odp"));
+			OfficePresentationElement presentation = odfdoc.getContentRoot();
+			Assert.assertNotNull(presentation);
+
+			DrawPageElement page = presentation.newDrawPageElement("NewPage");
+
+			OdfFileDom contentDom = odfdoc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			DrawPageElement presentationTest = (DrawPageElement) xpath.evaluate("//draw:page[last()]", contentDom, XPathConstants.NODE);
+
+			Assert.assertTrue(presentationTest instanceof DrawPageElement);
+			Assert.assertEquals(page, presentationTest);
+			Assert.assertEquals(presentationTest.getNodeName(), "draw:page");
+			Assert.assertEquals(presentationTest.getDrawMasterPageNameAttribute(), "NewPage");
+
+			odfdoc.save(ResourceUtilities.newTestOutputFile("CreatChildrenForPresentationTest.odp"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForChart() {
+		try {
+
+			OdfFileDom contentDom = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("empty.odt")).getContentDom();
+
+			// find the last paragraph
+			NodeList lst = contentDom.getElementsByTagNameNS(
+					OdfTextParagraph.ELEMENT_NAME.getUri(),
+					OdfTextParagraph.ELEMENT_NAME.getLocalName());
+			Assert.assertTrue(lst.getLength() > 0);
+			OdfTextParagraph p0 = (OdfTextParagraph) lst.item(lst.getLength() - 1);
+
+			OfficeDocumentContentElement content = contentDom.newOdfElement(OfficeDocumentContentElement.class);
+			OfficeBodyElement body = contentDom.newOdfElement(OfficeBodyElement.class);
+			content.appendChild(body);
+			ChartChartElement chart = contentDom.newOdfElement(ChartChartElement.class);
+			//create children element
+			ChartPlotAreaElement plotArea = chart.newChartPlotAreaElement();
+			body.appendChild(chart);
+			p0.getParentNode().insertBefore(content, p0);
+
+
+			XPath xpath = contentDom.getXPath();
+			ChartChartElement chartTest = (ChartChartElement) xpath.evaluate("//chart:chart[last()]", contentDom, XPathConstants.NODE);
+
+			Assert.assertNotNull(chartTest.getChildNodes());
+
+			Assert.assertTrue(chartTest.getChildNodes().item(0) instanceof ChartPlotAreaElement);
+			Assert.assertEquals(plotArea, chartTest.getChildNodes().item(0));
+			Assert.assertEquals(chartTest.getChildNodes().item(0).getNodeName(), "chart:plot-area");
+
+			contentDom.getDocument().save(ResourceUtilities.newTestOutputFile("CreatChildrenForChartTest.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreateChildrenForTable() {
+		try {
+			OdfFileDom contentDom = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("empty.odt")).getContentDom();
+
+			// find the last paragraph
+			NodeList lst = contentDom.getElementsByTagNameNS(
+					TextPElement.ELEMENT_NAME.getUri(),
+					TextPElement.ELEMENT_NAME.getLocalName());
+			Assert.assertTrue(lst.getLength() > 0);
+			OdfTextParagraph p0 = (OdfTextParagraph) lst.item(lst.getLength() - 1);
+
+			TableTableElement table = contentDom.newOdfElement(TableTableElement.class);
+
+
+			TableTableRowElement tr = table.newTableTableRowElement();
+
+			TableTableCellElement td1 = tr.newTableTableCellElement(0,"void");
+
+			TextPElement p1 = td1.newTextPElement();
+			p1.appendChild(contentDom.createTextNode("content 1"));
+
+			p0.getParentNode().insertBefore(table, p0);
+
+			table.setProperty(StyleTablePropertiesElement.Width, "12cm");
+			table.setProperty(StyleTablePropertiesElement.Align, "left");
+
+			td1.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, "2cm");
+			XPath xpath = contentDom.getXPath();
+			TableTableRowElement tableRowTest = (TableTableRowElement) xpath.evaluate("//table:table-row [last()]", contentDom, XPathConstants.NODE);
+			Assert.assertNotNull(tableRowTest.getChildNodes());
+
+			Assert.assertTrue(tableRowTest.getChildNodes().item(0) instanceof TableTableCellElement);
+			Assert.assertEquals(tableRowTest.getChildNodes().item(0).getNodeName(), "table:table-cell");
+
+			contentDom.getDocument().save(ResourceUtilities.newTestOutputFile("CreateChildrenForTableTest.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForText() {
+		try {
+
+			OdfFileDom contentDom = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("empty.odt")).getContentDom();
+
+			// find the last paragraph
+			NodeList lst = contentDom.getElementsByTagNameNS(
+					OdfTextParagraph.ELEMENT_NAME.getUri(),
+					OdfTextParagraph.ELEMENT_NAME.getLocalName());
+			Assert.assertTrue(lst.getLength() > 0);
+			OdfTextParagraph p0 = (OdfTextParagraph) lst.item(lst.getLength() - 1);
+
+			TextListItemElement listItem = contentDom.newOdfElement(TextListItemElement.class);
+			//create children elements
+			TextHElement heading = listItem.newTextHElement(1);
+			TextListElement list = listItem.newTextListElement();
+			TextPElement paragraph = listItem.newTextPElement();
+			TextSoftPageBreakElement softPageBreak = listItem.newTextSoftPageBreakElement();
+
+			p0.getParentNode().insertBefore(listItem, p0);
+			XPath xpath = contentDom.getXPath();
+			TextListItemElement listItemTest = (TextListItemElement) xpath.evaluate("//text:list-item[last()]", contentDom, XPathConstants.NODE);
+			Assert.assertNotNull(listItemTest.getChildNodes());
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(0) instanceof OdfTextHeading);
+			Assert.assertEquals(heading, listItemTest.getChildNodes().item(0));
+			Assert.assertEquals(listItemTest.getChildNodes().item(0).getNodeName(), "text:h");
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(1) instanceof OdfTextList);
+			Assert.assertEquals(list, listItemTest.getChildNodes().item(1));
+			Assert.assertEquals(listItemTest.getChildNodes().item(1).getNodeName(), "text:list");
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(2) instanceof OdfTextParagraph);
+			Assert.assertEquals(paragraph, listItemTest.getChildNodes().item(2));
+			Assert.assertEquals(listItemTest.getChildNodes().item(2).getNodeName(), "text:p");
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(3) instanceof TextSoftPageBreakElement);
+			Assert.assertEquals(softPageBreak, listItemTest.getChildNodes().item(3));
+			Assert.assertEquals(listItemTest.getChildNodes().item(3).getNodeName(), "text:soft-page-break");
+
+
+			contentDom.getDocument().save(ResourceUtilities.newTestOutputFile("CreatChildrenForTextTable.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForGraphic() {
+		try {
+
+			OdfGraphicsDocument odgDoc1 = OdfGraphicsDocument.newGraphicsDocument();
+			OdfFileDom contentDom = odgDoc1.getContentDom();
+
+			NodeList lst = contentDom.getElementsByTagNameNS(
+					DrawPageElement.ELEMENT_NAME.getUri(),
+					DrawPageElement.ELEMENT_NAME.getLocalName());
+			DrawPageElement page = (DrawPageElement) lst.item(lst.getLength() - 1);
+			//page.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.DRAW), "name" ), "page1" );
+			//page.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.DRAW), "style-name" ), "dp1" );
+			//page.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.DRAW), "master-page-name" ), "Default" );
+			page.setDrawNameAttribute("page1");
+			page.setDrawStyleNameAttribute("dp1");
+			page.setDrawMasterPageNameAttribute("Default");
+
+			DrawLineElement line = page.newDrawLineElement("6cm", "10cm", "15cm", "20cm");
+			//line.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.DRAW), "style-name" ), "gr1" );
+			//line.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.DRAW), "text-style-name" ), "P1" );
+			//line.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.DRAW), "layer" ), "layout" );
+			line.setDrawStyleNameAttribute("gr1");
+			line.setDrawTextStyleNameAttribute("P1");
+			line.setDrawLayerAttribute("layer");
+			XPath xpath = contentDom.getXPath();
+			DrawPageElement graphicTest = (DrawPageElement) xpath.evaluate("//draw:page[last()]", contentDom, XPathConstants.NODE);
+			Assert.assertNotNull(graphicTest.getChildNodes());
+
+			Assert.assertTrue(graphicTest.getChildNodes().item(0) instanceof DrawLineElement);
+			Assert.assertEquals(line, graphicTest.getChildNodes().item(0));
+			Assert.assertEquals(graphicTest.getChildNodes().item(0).getNodeName(), "draw:line");
+
+			Assert.assertEquals(((DrawLineElement) graphicTest.getChildNodes().item(0)).getSvgX1Attribute().toString(), "6cm");
+			Assert.assertEquals(((DrawLineElement) graphicTest.getChildNodes().item(0)).getSvgX2Attribute().toString(), "10cm");
+			Assert.assertEquals(((DrawLineElement) graphicTest.getChildNodes().item(0)).getSvgY1Attribute().toString(), "15cm");
+			Assert.assertEquals(((DrawLineElement) graphicTest.getChildNodes().item(0)).getSvgY2Attribute().toString(), "20cm");
+
+			contentDom.getDocument().save(ResourceUtilities.newTestOutputFile("CreatChildrenForGraphic.odg"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForStyles() {
+		try {
+			OdfDocument textDoc = OdfTextDocument.newTextDocument();
+
+			OdfOfficeStyles styles = textDoc.getOrCreateDocumentStyles();
+			StyleDefaultStyleElement def = styles.newStyleDefaultStyleElement("text");
+			def.setStyleFamilyAttribute(OdfStyleFamily.Paragraph.toString());
+			def.setProperty(StyleTextPropertiesElement.TextUnderlineColor, "#00FF00");
+
+			StyleStyleElement parent = styles.newStyleStyleElement("text","TheParent");
+			parent.setStyleFamilyAttribute(OdfStyleFamily.Paragraph.toString());
+
+			parent.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+			parent.setProperty(StyleTextPropertiesElement.Color, "#FF0000");
+			OdfStylesDom stylesDom = textDoc.getStylesDom();
+			XPath xpath = stylesDom.getXPath();
+			StyleStyleElement styleTest = (StyleStyleElement) xpath.evaluate("//style:style[last()]", stylesDom, XPathConstants.NODE);
+			Assert.assertEquals(styleTest, parent);
+			textDoc.save(ResourceUtilities.newTestOutputFile("CreatChildrenForStyles.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForEmbeddedDoc() {
+		try {
+			OdfDocument document = OdfTextDocument.newTextDocument();
+			document.insertDocument(OdfTextDocument.newTextDocument(), "Object1/");
+			OdfDocument embeddedObject1 = (OdfDocument) document.loadSubDocument("Object1/");
+			OdfFileDom contentDom = embeddedObject1.getContentDom();
+			// find the last paragraph
+			NodeList lst = contentDom.getElementsByTagNameNS(
+					OdfTextParagraph.ELEMENT_NAME.getUri(),
+					OdfTextParagraph.ELEMENT_NAME.getLocalName());
+			Assert.assertTrue(lst.getLength() > 0);
+			OdfTextParagraph p0 = (OdfTextParagraph) lst.item(lst.getLength() - 1);
+
+			TextListItemElement listItem = contentDom.newOdfElement(TextListItemElement.class);
+			//create children elements
+			TextHElement heading = listItem.newTextHElement(1);
+			TextListElement list = listItem.newTextListElement();
+			TextPElement paragraph = listItem.newTextPElement();
+			TextSoftPageBreakElement softPageBreak = listItem.newTextSoftPageBreakElement();
+
+			p0.getParentNode().insertBefore(listItem, p0);
+			XPath xpath = contentDom.getXPath();
+			TextListItemElement listItemTest = (TextListItemElement) xpath.evaluate("//text:list-item[last()]", contentDom, XPathConstants.NODE);
+			Assert.assertNotNull(listItemTest.getChildNodes());
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(0) instanceof OdfTextHeading);
+			Assert.assertEquals(heading, listItemTest.getChildNodes().item(0));
+			Assert.assertEquals(listItemTest.getChildNodes().item(0).getNodeName(), "text:h");
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(1) instanceof OdfTextList);
+			Assert.assertEquals(list, listItemTest.getChildNodes().item(1));
+			Assert.assertEquals(listItemTest.getChildNodes().item(1).getNodeName(), "text:list");
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(2) instanceof OdfTextParagraph);
+			Assert.assertEquals(paragraph, listItemTest.getChildNodes().item(2));
+			Assert.assertEquals(listItemTest.getChildNodes().item(2).getNodeName(), "text:p");
+
+			Assert.assertTrue(listItemTest.getChildNodes().item(3) instanceof TextSoftPageBreakElement);
+			Assert.assertEquals(softPageBreak, listItemTest.getChildNodes().item(3));
+			Assert.assertEquals(listItemTest.getChildNodes().item(3).getNodeName(), "text:soft-page-break");
+
+
+			contentDom.getDocument().save(ResourceUtilities.newTestOutputFile("CreatChildrenForEmbedded.odt"));
+
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+
+	}
+
+	@Test
+	public void testCreatChildrenForSpreadSheet() {
+		try {
+
+			OdfSpreadsheetDocument odfSpreadSheet = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfFileDom contentDom = odfSpreadSheet.getContentDom();
+
+			NodeList lst = contentDom.getElementsByTagNameNS(
+					OfficeSpreadsheetElement.ELEMENT_NAME.getUri(),
+					OfficeSpreadsheetElement.ELEMENT_NAME.getLocalName());
+			OfficeSpreadsheetElement sheet = (OfficeSpreadsheetElement) lst.item(lst.getLength() - 1);
+			TableTableElement table = sheet.newTableTableElement();
+			//table.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.TABLE), "name" ), "newtable" );
+			//table.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.TABLE), "style-name" ), "ta1" );
+			table.setTableNameAttribute("newtable");
+			table.setTableStyleNameAttribute("ta1");
+			TableTableColumnElement column = table.newTableTableColumnElement();
+			//column.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.TABLE), "style-name" ), "co1" );
+			//column.setOdfAttribute( OdfName.newName( OdfNamespace.newName(OdfDocumentNamespace.TABLE), "default-cell-style-name" ), "Default" );
+			column.setTableStyleNameAttribute("co1");
+			column.setTableDefaultCellStyleNameAttribute("Default");
+			XPath xpath = contentDom.getXPath();
+			TableTableElement spreadsheetTest = (TableTableElement) xpath.evaluate("//table:table[last()]", contentDom, XPathConstants.NODE);
+			Assert.assertNotNull(spreadsheetTest.getChildNodes());
+
+			Assert.assertTrue(spreadsheetTest.getChildNodes().item(0) instanceof TableTableColumnElement);
+			Assert.assertEquals(column, spreadsheetTest.getChildNodes().item(0));
+			Assert.assertEquals(spreadsheetTest.getChildNodes().item(0).getNodeName(), "table:table-column");
+
+			Assert.assertEquals(((TableTableColumnElement) spreadsheetTest.getChildNodes().item(0)).getAttribute("table:style-name"), "co1");
+			Assert.assertEquals(((TableTableColumnElement) spreadsheetTest.getChildNodes().item(0)).getAttribute("table:default-cell-style-name"), "Default");
+
+			contentDom.getDocument().save(ResourceUtilities.newTestOutputFile("CreatChildrenForSpreadsheet.ods"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForForm() {
+		try {
+			OdfTextDocument doc = OdfTextDocument.newTextDocument();
+			OfficeTextElement text = doc.getContentRoot();
+			FormFormElement form = text.newOfficeFormsElement().newFormFormElement();
+			form.setFormNameAttribute("NewFrom");
+			OdfFileDom contentDom = doc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			FormFormElement formTest = (FormFormElement) xpath.evaluate("//form:form[last()]", contentDom, XPathConstants.NODE);
+			Assert.assertEquals(formTest, form);
+			doc.getContentDom().getDocument().save(ResourceUtilities.newTestOutputFile("CreatChildrenForForm.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testCreatChildrenForAnimation() {
+		try {
+			OdfPresentationDocument odfdoc = OdfPresentationDocument.newPresentationDocument();
+			OfficePresentationElement presentation = odfdoc.getContentRoot();
+			Assert.assertNotNull(presentation);
+
+			DrawPageElement page = presentation.newDrawPageElement("NewPage");
+
+			AnimAnimateElement anim = page.newAnimAnimateElement("new");
+			OdfFileDom contentDom = odfdoc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			AnimAnimateElement animTest = (AnimAnimateElement) xpath.evaluate("//anim:animate[last()]", contentDom, XPathConstants.NODE);
+
+			Assert.assertTrue(animTest instanceof AnimAnimateElement);
+
+			Assert.assertEquals(anim, animTest);
+
+			odfdoc.save(ResourceUtilities.newTestOutputFile("CreatChildrenForAnimateTest.odp"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateChildrenElementsTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/CreateTableTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/CreateTableTest.java
new file mode 100644
index 0000000..6995c3d
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/CreateTableTest.java
@@ -0,0 +1,97 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class CreateTableTest {
+
+	public CreateTableTest() {
+	}
+
+	@Test
+	public void testCreateTable1() {
+		try {
+			OdfFileDom doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("empty.odt")).getContentDom();
+
+			// find the last paragraph
+			NodeList lst = doc.getElementsByTagNameNS(
+					TextPElement.ELEMENT_NAME.getUri(),
+					TextPElement.ELEMENT_NAME.getLocalName());
+			Assert.assertTrue(lst.getLength() > 0);
+			OdfTextParagraph p0 = (OdfTextParagraph) lst.item(lst.getLength() - 1);
+
+			TableTableElement table = doc.newOdfElement(TableTableElement.class);
+
+			TableTableRowElement tr = (TableTableRowElement) table.appendChild(
+					doc.newOdfElement(TableTableRowElement.class));
+			TableTableCellElement td1 = (TableTableCellElement) tr.appendChild(
+					doc.newOdfElement(TableTableCellElement.class));
+			OdfTextParagraph p1 = doc.newOdfElement(OdfTextParagraph.class);
+			p1.appendChild(doc.createTextNode("content 1"));
+			td1.appendChild(p1);
+
+			TableTableCellElement td2 = (TableTableCellElement) tr.appendChild(
+					doc.newOdfElement(TableTableCellElement.class));
+			OdfTextParagraph p2 = doc.newOdfElement(OdfTextParagraph.class);
+			p2.appendChild(doc.createTextNode("cell 2"));
+			td2.appendChild(p2);
+
+			TableTableCellElement td3 = (TableTableCellElement) tr.appendChild(
+					doc.newOdfElement(TableTableCellElement.class));
+			OdfTextParagraph p3 = doc.newOdfElement(OdfTextParagraph.class);
+			p3.appendChild(doc.createTextNode("table cell content 3"));
+			td3.appendChild(p3);
+
+			p0.getParentNode().insertBefore(table, p0);
+
+			table.setProperty(StyleTablePropertiesElement.Width, "12cm");
+			table.setProperty(StyleTablePropertiesElement.Align, "left");
+
+			td1.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, "2cm");
+
+			td2.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, "4cm");
+
+			td3.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, "6cm");
+
+			doc.getDocument().save(ResourceUtilities.newTestOutputFile("tabletest.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CreateTableTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DefaultStylesTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DefaultStylesTest.java
new file mode 100644
index 0000000..ee56e0f
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DefaultStylesTest.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableRowPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ * Tests if default styles are parsed correctly into
+ * the defaultstyleCollection of the OdfDocument
+ */
+public class DefaultStylesTest {
+
+    private static String TEST_FILE = "test2.odt";
+
+    public DefaultStylesTest() {
+    }
+
+    @Test
+    public void testDefaultStyles() {
+        try {
+            OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+            doc.getDocumentStyles();
+            OdfDefaultStyle oDSG = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Graphic);
+            Assert.assertEquals(oDSG.getFamilyName(), OdfStyleFamily.Graphic.getName());
+            String prop1 = oDSG.getProperty(StyleGraphicPropertiesElement.ShadowOffsetX);
+            Assert.assertEquals(prop1, "0.1181in");
+
+            OdfDefaultStyle oDSP = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Paragraph);
+            Assert.assertEquals(oDSP.getFamilyName(), OdfStyleFamily.Paragraph.getName());
+            String prop2 = oDSP.getProperty(StyleTextPropertiesElement.FontName);
+            Assert.assertEquals(prop2, "Thorndale");
+            String prop3 = oDSP.getProperty(StyleTextPropertiesElement.LetterKerning);
+            Assert.assertEquals(prop3, "true");
+
+            OdfDefaultStyle oDST = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Table);
+            Assert.assertEquals(oDST.getFamilyName(), OdfStyleFamily.Table.getName());
+            String prop4 = oDST.getProperty(StyleTablePropertiesElement.BorderModel);
+            Assert.assertEquals(prop4, "collapsing");
+
+
+            OdfDefaultStyle oDSTR = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.TableRow);
+            Assert.assertEquals(oDSTR.getFamilyName(), OdfStyleFamily.TableRow.getName());
+            String prop5 = oDSTR.getProperty(StyleTableRowPropertiesElement.KeepTogether);
+            Assert.assertEquals(prop5, "auto");
+
+
+        } catch (Exception e) {
+            Logger.getLogger(DefaultStylesTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DocumentCreationTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DocumentCreationTest.java
new file mode 100644
index 0000000..02712ba
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DocumentCreationTest.java
@@ -0,0 +1,484 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.odftoolkit.Junit.AlphabeticalOrderedRunner;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+@RunWith(AlphabeticalOrderedRunner.class)
+public class DocumentCreationTest {
+
+	private static final Logger LOG = Logger.getLogger(DocumentCreationTest.class.getName());
+	private static final String TEST_FILE_FOLDER = ResourceUtilities.getTestOutputFolder();
+	private static final String TEST_FILE_EMBEDDED = TEST_FILE_FOLDER + "testEmbeddedDoc.odt";
+	private static final String TEST_PIC = "testA.jpg";
+	// Changed leading space against character as leading space have to be <text:s/> element in ODF, see http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#White-space_Characters 
+	private static final String TEST_SPAN_TEXT = "*Find Truth!!!";
+	private static final String TEST_FILE_ACCESS_EMBEDDED = TEST_FILE_FOLDER + "TestAccess_EmbeddedDocument.odt";
+	private static final String TEST_FILE_EMBEDDED_EMBEDDED = TEST_FILE_FOLDER + "TestAccess_EmbeddedinEmbedded.odt";
+	private static final String TEST_FILE_SAVE_EMBEDDED = TEST_FILE_FOLDER + "testSaveEmbeddedDoc.odt";
+	private static final String TEST_FILE_SAVE_EMBEDDED_OUT = TEST_FILE_FOLDER + "TestSaveEmbeddedDoc_newName.odt";
+	private static final String TEST_FILE_SAVE_EMBEDDED_OUT2 = TEST_FILE_FOLDER + "TestSaveEmbeddedDoc2.odt";
+	private static final String TEST_FILE_SAVE_QUEER_PATH = TEST_FILE_FOLDER + "TestSaveQueerEmbeddedPathDoc1.odt";
+	private static final String CORRUPTED_MIMETYPE_DOC = TEST_FILE_FOLDER + "CorruptedMimetypeDoc.odt";
+	private static final String CORRUPTED_MIMETYPE_DOC_OUT = TEST_FILE_FOLDER + "TestSaveCorruptedMimetypeDoc.odt";
+	private static final String CORRUPTED_MIMETYPE_CHART = TEST_FILE_FOLDER + "CorruptedMimetypeChart.odc";
+	private static final String CORRUPTED_MIMETYPE_CHART_OUT = TEST_FILE_FOLDER + "TestSaveCorruptedMimetypeChart.odc";
+
+	@Test
+	public void _1_createEmptyDocs() {
+		try {
+			OdfTextDocument odtDoc1 = OdfTextDocument.newTextDocument();
+			OdfTextDocument odtDoc2 = OdfTextDocument.newTextDocument();
+			odtDoc2.getContentDom();
+			odtDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfTextDocument.odt"));
+
+			OdfGraphicsDocument odgDoc1 = OdfGraphicsDocument.newGraphicsDocument();
+			OdfGraphicsDocument odgDoc2 = OdfGraphicsDocument.newGraphicsDocument();
+			odgDoc2.getContentDom();
+			odgDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfGraphicsDocument.odg"));
+
+			OdfSpreadsheetDocument odsDoc1 = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfSpreadsheetDocument odsDoc2 = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			odsDoc2.getContentDom();
+			odsDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfSpreadsheetDocument.ods"));
+
+			OdfPresentationDocument odpDoc1 = OdfPresentationDocument.newPresentationDocument();
+			OdfPresentationDocument odpDoc2 = OdfPresentationDocument.newPresentationDocument();
+			odpDoc2.getContentDom();
+			odpDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfPresentationDocument.odp"));
+
+			OdfChartDocument odcDoc1 = OdfChartDocument.newChartDocument();
+			OdfChartDocument odcDoc2 = OdfChartDocument.newChartDocument();
+			odcDoc2.getContentDom();
+			odcDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfChartDocument.odc"));
+
+			/////////////////////////////////////////
+			// ODFDOM PACKAGE LAYER - WIKI EXAMPLE //
+			/////////////////////////////////////////
+
+			// loads the ODF document package from the path
+			OdfPackage pkg = OdfPackage.loadPackage(ResourceUtilities.getTestResourceAsStream("TestEmpty_OdfTextDocument.odt"));
+
+			// loads the images from the URLs and inserts the image in the package, adapting the manifest
+			pkg.insert(ResourceUtilities.getURI(TEST_PIC), "Pictures/" + TEST_PIC, null);
+			//Deactivated as test fail, when test machine is not online (painful for offline work)
+			//pkg.insert(new URI("http://odftoolkit.org/attachments/wiki_images/odftoolkit/Table_fruits_diagramm.jpg"), "someweiredname/tableandfruits.jpg", null);
+			pkg.save(ResourceUtilities.newTestOutputFile("odfdom-wiki-package.odt"));
+
+
+			/////////////////////////////////////
+			// ODFDOM XML LAYER - WIKI EXAMPLE //
+			/////////////////////////////////////
+
+			// loads the ODF document from the path
+			OdfDocument odfDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestEmpty_OdfTextDocument.odt"));
+
+			// get the ODF content as DOM tree representation
+			OdfFileDom odfContent = odfDoc.getContentDom();
+
+			//// W3C XPath initialization ''(JDK5 functionality)''  - XPath is the path within the XML file
+			//// (Find XPath examples here: http://www.w3.org/TR/xpath#path-abbrev)
+			XPath xpath2 = odfContent.getXPath();
+
+			// receiving the first paragraph "//text:p[1]" ''(JDK5 functionality)''
+			TextPElement para = (TextPElement) xpath2.evaluate("//text:p[1]", odfContent, XPathConstants.NODE);
+
+			// adding an image - expecting the user to know that
+			// an image consists always of a 'draw:image' and a 'draw:frame' parent
+
+			// FUTURE USAGE: para.createDrawFrame().createDrawImage("/myweb.org/images/myHoliday.png", "/Pictures/myHoliday.png");
+			//             Child access methods are still not part of the v0.6.x releases
+			// CURRENT USAGE:
+			OdfDrawFrame odfFrame = (OdfDrawFrame) OdfXMLFactory.newOdfElement(odfContent, DrawFrameElement.ELEMENT_NAME);
+			para.appendChild(odfFrame);
+			OdfDrawImage odfImage = (OdfDrawImage) OdfXMLFactory.newOdfElement(odfContent, OdfDrawImage.ELEMENT_NAME);
+			odfFrame.appendChild(odfImage);
+			odfImage.newImage(ResourceUtilities.getURI(TEST_PIC));
+
+			OdfDrawImage odfImage2 = (OdfDrawImage) OdfXMLFactory.newOdfElement(odfContent, OdfDrawImage.ELEMENT_NAME);
+			odfFrame.appendChild(odfImage2);
+			//Deactivated as test fail, when test machine is not online (painful for offline work)
+			//odfImage2.newImage(new URI("http://odftoolkit.org/attachments/wiki_images/odftoolkit/Table_fruits_diagramm.jpg"));
+			odfDoc.save(ResourceUtilities.newTestOutputFile("odfdom-wiki-dom.odt"));
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void _2_createEmbeddedDocs() {
+		try {
+			OdfTextDocument odtDoc1 = OdfTextDocument.newTextDocument();
+
+			odtDoc1.insertDocument(OdfTextDocument.newTextDocument(), "Object1/");
+			odtDoc1.insertDocument(OdfTextDocument.newTextDocument(), "Object2/");
+			odtDoc1.insertDocument(OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestEmpty_OdfGraphicsDocument.odg")), "Object3");
+			odtDoc1.insertDocument(OdfChartDocument.newChartDocument(), "Object4");
+			odtDoc1.insertDocument(OdfGraphicsDocument.newGraphicsDocument(), "Object5");
+			odtDoc1.insertDocument(OdfPresentationDocument.newPresentationDocument(), "Object6");
+
+			Map<String, OdfDocument> embeddedDocs = odtDoc1.loadSubDocuments();
+			LOG.log(Level.INFO, "Embedded Document count: {0}", embeddedDocs.size());
+			odtDoc1.save(ResourceUtilities.newTestOutputFile("TestCreate_EmbeddedDocuments.odt"));
+
+			Assert.assertTrue(embeddedDocs.size() == 6);
+
+			Map<String, OdfDocument> embeddedTextDocs = odtDoc1.loadSubDocuments(OdfDocument.OdfMediaType.TEXT);
+			LOG.log(Level.INFO, "Only Embedded Text Docs Size: {0}", embeddedTextDocs.size());
+			Assert.assertTrue(embeddedTextDocs.size() == 2);
+
+			Map<String, OdfDocument> embeddedChartDocs = odtDoc1.loadSubDocuments(OdfDocument.OdfMediaType.CHART);
+			LOG.log(Level.INFO, "Only Embedded Chart Docs Size: {0}", embeddedChartDocs.size());
+			Assert.assertTrue(embeddedChartDocs.size() == 1);
+
+			OdfDocument embeddedObject1 = odtDoc1.loadSubDocument("Object1/");
+			LOG.log(Level.INFO, "Embedded Object1 path: {0}", embeddedObject1.getDocumentPath());
+			LOG.log(Level.INFO, "Embedded Object1 media-type: {0}", embeddedObject1.getMediaTypeString());
+			Assert.assertEquals(embeddedObject1.getMediaTypeString(), OdfDocument.OdfMediaType.TEXT.getMediaTypeString());
+
+			OdfDocument embeddedObject3 = odtDoc1.loadSubDocument("Object3");
+			LOG.log(Level.INFO, "Embedded Object3 path: {0}", embeddedObject3.getDocumentPath());
+			LOG.log(Level.INFO, "Embedded Object3 media-type: {0}", embeddedObject3.getMediaTypeString());
+			Assert.assertEquals(embeddedObject3.getMediaTypeString(), OdfDocument.OdfMediaType.GRAPHICS.getMediaTypeString());
+
+			OdfDocument embeddedObject6 = odtDoc1.loadSubDocument("Object6/");
+			LOG.log(Level.INFO, "Embedded Object6 path: {0}", embeddedObject6.getDocumentPath());
+			LOG.log(Level.INFO, "Embedded Object6 media-type: {0}", embeddedObject6.getMediaTypeString());
+			Assert.assertEquals(embeddedObject6.getMediaTypeString(), OdfDocument.OdfMediaType.PRESENTATION.getMediaTypeString());
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void _3_accessEmbeddedDocs() {
+		try {
+			OdfDocument docWithEmbeddedObjects = OdfDocument.loadDocument(TEST_FILE_EMBEDDED);
+			Map<String, OdfDocument> embDocs = docWithEmbeddedObjects.loadSubDocuments();
+			String pathToEmbeddedObject = "";
+			for (String embDocPath : embDocs.keySet()) {
+				OdfPackageDocument embDoc = embDocs.get(embDocPath);
+				LOG.log(Level.INFO, "Embedded file of {0} internal package path: {1} mediaType: {2}", new Object[]{TEST_FILE_EMBEDDED, embDoc.getDocumentPath(), embDoc.getMediaTypeString()});
+				pathToEmbeddedObject = embDoc.getDocumentPath();
+			}
+
+			OdfDocument embDoc = docWithEmbeddedObjects.loadSubDocument(pathToEmbeddedObject);
+			OdfContentDom contentDom = embDoc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			// Make sure the embedded document is being loaded
+
+
+			// Add text element
+			TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+			LOG.log(Level.INFO, "First para: {0}", para.getTextContent());
+			OdfTextSpan spanElem = new OdfTextSpan(contentDom);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			para.appendChild(spanElem);
+
+			// Add frame and image element
+			TextPElement paraLast = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom, XPathConstants.NODE);
+			addImageToDocument(contentDom, paraLast);
+
+			// Access/Update automatic styles
+			OdfOfficeAutomaticStyles autoStyles = embDoc.getContentDom().getAutomaticStyles();
+			OdfStyle autoStyle = autoStyles.getStyle("P1", OdfStyleFamily.Paragraph);
+			Assert.assertEquals(autoStyle.getStyleNameAttribute(), "P1");
+			Assert.assertEquals(autoStyle.getFamilyName(), "paragraph");
+
+			// Access/Update styles.xml
+			OdfStyle documentStyle = embDoc.getDocumentStyles().getStyle("myStyle", OdfStyleFamily.Paragraph);
+			Assert.assertEquals(documentStyle.getStyleNameAttribute(), "myStyle");
+			Assert.assertEquals(documentStyle.getFamilyName(), "paragraph");
+
+			documentStyle.setProperty(StyleTextPropertiesElement.FontWeight, "bold");
+			documentStyle.setProperty(StyleParagraphPropertiesElement.BackgroundColor, "#14EA5D");
+
+			// SAVE / LOAD
+			docWithEmbeddedObjects.save(TEST_FILE_ACCESS_EMBEDDED);
+
+			OdfDocument doc2 = OdfDocument.loadDocument(TEST_FILE_ACCESS_EMBEDDED);
+			OdfDocument embDoc2 = doc2.loadSubDocument("Object 1/");
+			embDoc2.getStylesDom();
+			OdfStyle documentStyle2 = embDoc2.getDocumentStyles().getStyle("myStyle", OdfStyleFamily.Paragraph);
+			String prop2 = documentStyle2.getProperty(StyleTextPropertiesElement.FontWeight);
+			Assert.assertEquals(prop2, "bold");
+
+			TextSpanElement spanTest = (TextSpanElement) xpath.evaluate("//text:p[1]/text:span[1]", contentDom, XPathConstants.NODE);
+			Assert.assertEquals(spanTest.getTextContent(), TEST_SPAN_TEXT);
+
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void _4_accessEmbeddedWithinEmbeddedDocs() {
+
+		try {
+			OdfDocument rootDocument = OdfDocument.loadDocument(TEST_FILE_EMBEDDED);
+			// Test DOM Access
+			Assert.assertNotNull(rootDocument.getDocumentStyles());
+			Assert.assertNotNull(rootDocument.getContentDom().getAutomaticStyles());
+			Assert.assertNotNull(rootDocument.getStylesDom());
+			Assert.assertNotNull(rootDocument.getContentDom());
+
+			Map<String, OdfDocument> embDocs = rootDocument.loadSubDocuments();
+			int embDocsNumber = embDocs.size();
+			// the document "Object 1/
+			OdfDocument embDoc = embDocs.get("Object 1/");
+			String pathOfSecondInnerDoc = "Object in Object1/";
+			embDoc.insertDocument(OdfTextDocument.newTextDocument(), pathOfSecondInnerDoc);
+			OdfFileEntry fileEntry = embDoc.getPackage().getFileEntry(embDoc.getDocumentPath() + pathOfSecondInnerDoc);
+			Assert.assertNotNull(fileEntry);
+
+			// get "Object 1/content.xml"
+			OdfContentDom contentDom = embDoc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			TextPElement lastPara = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom, XPathConstants.NODE);
+			addFrameForEmbeddedDoc(contentDom, lastPara, "Object in Object1");
+			Map<String, OdfDocument> emb_embDocs = embDoc.loadSubDocuments();
+			Assert.assertEquals(embDocsNumber + 1, emb_embDocs.size());
+			
+			OdfDocument emb_embDoc = rootDocument.loadSubDocument(embDoc.getDocumentPath()+ pathOfSecondInnerDoc);
+			contentDom = emb_embDoc.getContentDom();
+			TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+			OdfTextSpan spanElem = new OdfTextSpan(contentDom);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			para.appendChild(spanElem);
+
+			// embDoc.save(ResourceUtilities.newTestOutputFile("222debug.odt"));
+			rootDocument.save(TEST_FILE_EMBEDDED_EMBEDDED);
+
+			OdfDocument docWithdoubleEmbeddedDoc = OdfDocument.loadDocument(TEST_FILE_EMBEDDED_EMBEDDED);
+			OdfDocument doubleEmbeddedDoc =docWithdoubleEmbeddedDoc.loadSubDocument("Object 1/Object in Object1");
+
+			OdfContentDom dEDcontentDom = doubleEmbeddedDoc.getContentDom();
+			TextSpanElement spanTest = (TextSpanElement) xpath.evaluate("//text:span[last()]", dEDcontentDom, XPathConstants.NODE);
+			Assert.assertEquals(spanTest.getTextContent(), TEST_SPAN_TEXT);
+
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void _5_testCacheDocuments() {
+		OdfDocument docWithEmbeddedObjects;
+		try {
+			docWithEmbeddedObjects = OdfDocument.loadDocument(TEST_FILE_EMBEDDED);
+			Map<String, OdfDocument> embDocs = docWithEmbeddedObjects.loadSubDocuments();
+			for(String embDocPath : embDocs.keySet()){
+				OdfDocument doc1 = embDocs.get(embDocPath);
+				doc1.getDocumentPath();
+				OdfContentDom contentDom1 = doc1.getContentDom();
+				OdfDocument doc2 = doc1.loadSubDocument(".");
+				OdfContentDom contentDom2 = doc2.getContentDom();
+				Assert.assertEquals(doc2, doc1);
+				Assert.assertEquals(contentDom1, contentDom2);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void _6_testSaveEmbeddedDocuments() {
+		OdfDocument docWithEmbeddedObjects;
+		try {
+			docWithEmbeddedObjects = OdfDocument.loadDocument(TEST_FILE_SAVE_EMBEDDED);
+			Map<String, OdfDocument> embDocs = docWithEmbeddedObjects.loadSubDocuments(OdfDocument.OdfMediaType.GRAPHICS);
+			// Graphics Doc
+			for(String eDocPath : embDocs.keySet()){
+				OdfDocument doc1 = embDocs.get(eDocPath);
+				Assert.assertNotNull(doc1);
+				OdfContentDom contentDom = doc1.getContentDom();
+				XPath xpath = contentDom.getXPath();
+				TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+				OdfTextSpan spanElem = new OdfTextSpan(contentDom);
+				spanElem.setTextContent(TEST_SPAN_TEXT);
+				para.appendChild(spanElem);
+				//save the embed document to a stand alone document
+				doc1.save(TEST_FILE_SAVE_EMBEDDED_OUT);
+				// Load test
+				OdfDocument loadedDoc = OdfDocument.loadDocument(TEST_FILE_SAVE_EMBEDDED_OUT);
+				OdfContentDom contentDom2 = loadedDoc.getContentDom();
+				OdfTextSpan span = (OdfTextSpan) xpath.evaluate("//text:span[last()]", contentDom2, XPathConstants.NODE);
+				Assert.assertEquals(span.getTextContent(), TEST_SPAN_TEXT);
+				Map<String, OdfDocument> embDocs3 = docWithEmbeddedObjects.loadSubDocuments(OdfDocument.OdfMediaType.TEXT);
+				for(String eDocPath3 : embDocs3.keySet()){
+					// Writer Doc
+					OdfDocument doc3 = embDocs3.get(eDocPath3);
+					Assert.assertNotNull(doc3);
+					OdfContentDom contentDom3 = doc3.getContentDom();
+					TextPElement para2 = (TextPElement) xpath.evaluate("//text:p[1]", contentDom3, XPathConstants.NODE);
+					addImageToDocument(contentDom3, para2);
+					TextPElement para3 = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom3, XPathConstants.NODE);
+					addFrameForEmbeddedDoc(contentDom3, para3, "NewEmbedded");
+					doc3.insertDocument(OdfTextDocument.newTextDocument(), "/NewEmbedded/");
+					OdfDocument doc4 = doc3.loadSubDocument("NewEmbedded");
+					Assert.assertNotNull(doc4);
+					OdfContentDom contentDom4 = doc4.getContentDom();
+					para = (TextPElement) xpath.evaluate("//text:p[1]",	contentDom4, XPathConstants.NODE);
+					spanElem = new OdfTextSpan(contentDom4);
+					spanElem.setTextContent(TEST_SPAN_TEXT);
+					para.appendChild(spanElem);
+					doc3.save(TEST_FILE_SAVE_EMBEDDED_OUT2);
+
+					OdfDocument testLoad = OdfDocument.loadDocument(TEST_FILE_SAVE_EMBEDDED_OUT2);
+					NodeList linkNodes = (NodeList) xpath.evaluate("//*[@xlink:href]", testLoad.getContentDom(), XPathConstants.NODE);
+					for (int i = 0; i < linkNodes.getLength(); i++) {
+						OdfElement object = (OdfElement) linkNodes.item(i);
+						String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+						Assert.assertTrue(refObjPath.equals("Pictures/"	+ TEST_PIC)	|| refObjPath.equals("./NewEmbedded"));
+					}
+					Assert.assertNotNull(testLoad.getPackage().getFileEntry("Pictures/" + TEST_PIC));
+					OdfDocument embedDocOftestLoad = testLoad.loadSubDocument("NewEmbedded/");
+					contentDom4 = embedDocOftestLoad.getContentDom();
+					OdfTextSpan span4 = (OdfTextSpan) xpath.evaluate("//text:span[last()]", contentDom4, XPathConstants.NODE);
+					Assert.assertNotNull(span4);
+					Assert.assertEquals(span4.getTextContent(), TEST_SPAN_TEXT);
+				}
+			}			
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	/**
+	 * OdfDocument docA and docB are ODF subdocuments.
+	 * docA containing docB, like
+	 * OdfPackage/dummy/docA/docB
+	 */
+	public void _7_testDocumentWithQueerPath() {
+		try {
+
+			OdfDocument containerDoc = OdfTextDocument.newTextDocument();
+			String pathToDocA = "dummy/docA/";
+			String pathToDocB = "docB/";
+			containerDoc.insertDocument(OdfTextDocument.newTextDocument(), pathToDocA);
+			OdfDocument docA = containerDoc.loadSubDocument(pathToDocA);
+			Assert.assertNotNull(docA);
+			docA.insertDocument(OdfTextDocument.newTextDocument(), pathToDocB);
+			OdfDocument docB = containerDoc.loadSubDocument(pathToDocA + pathToDocB);
+			Assert.assertNotNull(docB);
+			// only the document docB located at dummy/docA/docB will be saved
+			docB.save(TEST_FILE_SAVE_QUEER_PATH);
+
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test if saving OdfDocuments always results in a valid ODF file. This means
+	 * that the mimetype is written clearly at the first position in the zipped
+	 * ODF package.
+	 */
+	@Test
+	public void _8_testWritingCorrectMimetype() {
+		try {
+			OdfDocument docWithCorruptedMimetype = OdfDocument.loadDocument(CORRUPTED_MIMETYPE_DOC);
+			docWithCorruptedMimetype.save(CORRUPTED_MIMETYPE_DOC_OUT);
+			OdfDocument chartWithCorruptedMimetype = OdfDocument.loadDocument(CORRUPTED_MIMETYPE_CHART);
+			chartWithCorruptedMimetype.save(CORRUPTED_MIMETYPE_CHART_OUT);
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	private void addImageToDocument(OdfContentDom dom, TextPElement para) throws Exception {
+		OdfDrawFrame drawFrame = new OdfDrawFrame(dom);
+		drawFrame.setDrawNameAttribute("graphics1");
+		drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+		drawFrame.setSvgWidthAttribute("4.233cm");
+		drawFrame.setSvgHeightAttribute("4.233cm");
+		drawFrame.setDrawZIndexAttribute(0);
+		para.appendChild(drawFrame);
+
+		OdfDrawImage image = new OdfDrawImage(dom);
+		drawFrame.appendChild(image);
+		image.newImage(ResourceUtilities.getURI(TEST_PIC));
+	}
+
+	private void addFrameForEmbeddedDoc(OdfContentDom dom, TextPElement para, String path) throws Exception {
+		OdfDrawFrame drawFrame = new OdfDrawFrame(dom);
+		drawFrame.setDrawNameAttribute(path);
+		drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+		drawFrame.setSvgXAttribute("0.834cm");
+		drawFrame.setSvgYAttribute("2.919cm");
+		drawFrame.setSvgWidthAttribute("13.257cm");
+		drawFrame.setSvgHeightAttribute("11.375cm");
+		drawFrame.setDrawZIndexAttribute(0);
+
+		DrawObjectElement object = new DrawObjectElement(dom);
+		object.setXlinkHrefAttribute("./" + path);
+		object.setXlinkActuateAttribute("onLoad");
+		object.setXlinkShowAttribute("embed");
+		object.setXlinkTypeAttribute("simple");
+		drawFrame.appendChild(object);
+		para.appendChild(drawFrame);
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DocumentTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DocumentTest.java
new file mode 100644
index 0000000..a0d2564
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/DocumentTest.java
@@ -0,0 +1,513 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfSchemaConstraint;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfPackageConstraint;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.odfdom.pkg.ValidationConstraint;
+import org.odftoolkit.odfdom.utils.ErrorHandlerStub;
+import org.odftoolkit.odfdom.utils.NodeAction;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class DocumentTest {
+
+	private static final Logger LOG = Logger.getLogger(DocumentTest.class.getName());
+	private static final String TEST_FILE = "test2.odt";
+	private static final String TEST_FILE_WITHOUT_OPT = "no_size_opt.odt";
+	private static final String ODF_FORMULAR_TEST_FILE = "SimpleFormula.odf";
+	private static final String IMAGE_TEST_FILE = "testA.jpg";
+	private static final String GENERATED_INVALID_SPREADSHEET = "invalid.ods";
+	private static final String ZERO_BYTE_SPREADSHEET = "empty_file.ods";
+	private static final long PRESENTATION1_DOC_COUNT = 11;
+
+	public DocumentTest() {
+	}
+
+	@Test
+	public void loadDocument() {
+		try {
+			System.setProperty("org.odftoolkit.odfdom.tmpfile.disable", "true");
+			// LOAD INVALID GENERATED SPREADSHEET DOCUMENT
+			LOG.info("Loading an supported ODF Spreadsheet document as an ODF Document!");
+			try {
+				// Should work!
+				OdfDocument ods = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(GENERATED_INVALID_SPREADSHEET));
+				Assert.assertNotNull(ods);
+			} catch (Exception e) {
+				LOG.log(Level.SEVERE, e.getMessage(), e);
+				Assert.fail();
+			}
+
+
+			// LOAD EMPTY DOCUMENT
+			LOG.info("Loading an empty document as an ODF Document!");
+			try {
+				// Should throw error!
+				OdfDocument ods = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(ZERO_BYTE_SPREADSHEET));
+				Assert.fail();
+			} catch (Exception e) {
+				if (!e.getMessage().contains("shall be a ZIP file")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			}
+
+			// LOAD FORMULA DOCUMENT
+			LOG.info("Loading an unsupported ODF Formula document as an ODF Document!");
+			try {
+				// Exception is expected!
+				OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(ODF_FORMULAR_TEST_FILE));
+				Assert.fail();
+			} catch (IllegalArgumentException e) {
+				if (!e.getMessage().contains("is not yet supported!")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			}
+
+			// LOAD DOCUMENT IMAGE
+			LOG.info("Loading an unsupported image file as an ODF Document!");
+			try {
+				// Exception is expected!
+				OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
+				Assert.fail();
+			} catch (IllegalArgumentException e) {
+				if (!e.getMessage().contains("shall be a ZIP file")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			} catch (OdfValidationException e) {
+				if (!e.getMessage().contains("shall be a ZIP file")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testParser() {
+		try {
+			OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetContentRoot() {
+		try {
+			OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_WITHOUT_OPT));
+			Assert.assertNotNull(odt.getContentRoot());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	@Ignore
+	public void testDumpDom() {
+		try {
+			Assert.assertTrue(testXSLT("content") & testXSLT("styles"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private static boolean testXSLT(String odfFileNamePrefix) throws Exception {
+		OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+		Transformer trans = TransformerFactory.newInstance().newTransformer();
+		trans.setOutputProperty("indent", "yes");
+		// trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+
+		LOG.log(Level.INFO, "---------- {0}.xml transformed and compared ---------", odfFileNamePrefix);
+		// The XML file (e.g. content.xml) is transformed by XSLT into the similar/identical XML file
+		ByteArrayOutputStream xmlBytes = new ByteArrayOutputStream();
+		OdfFileDom fileDom = null;
+		if (odfFileNamePrefix.equals("content")) {
+			fileDom = odfdoc.getContentDom();
+		} else {
+			fileDom = odfdoc.getStylesDom();
+		}
+		// transforming the XML using identical transformation
+		trans.transform(new DOMSource(fileDom), new StreamResult(xmlBytes));
+		String xmlString = xmlBytes.toString("UTF-8");
+		// Saving test file to disc
+		saveString(xmlString, ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-test.xml");
+
+		// The template XML was once transformed and saved to the resource folder to gurantee the same indentation
+		String xmlStringOriginal = inputStreamToString(ResourceUtilities.getTestResourceAsStream("test2-" + odfFileNamePrefix + ".xml"));
+		// Saving original file to disc
+		saveString(xmlStringOriginal, ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-original.xml");
+
+
+		// Loading original file back to string representation
+		String testString = inputStreamToString(new FileInputStream(ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-test.xml"));
+		// Loading test file back to string representation
+		String originalString = inputStreamToString(new FileInputStream(ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-original.xml"));
+
+		boolean xmlEqual = originalString.equals(testString);
+		if (!xmlEqual) {
+			String testFilePath = ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-final-test.xml";
+			String originalFilePath = ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-final-original.xml";
+			saveString(testString, testFilePath);
+			saveString(originalString, originalFilePath);
+			LOG.log(Level.SEVERE, "Please compare the XML of two file:\n{0}\n and \n{1}", new Object[]{testFilePath, originalFilePath});
+		}
+		return xmlEqual;
+	}
+
+	@Test
+	public void testStylesDom() {
+		try {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+			OdfStylesDom stylesDom = odfdoc.getStylesDom();
+			Assert.assertNotNull(stylesDom);
+
+			// test styles.xml:styles
+			OdfOfficeStyles styles = odfdoc.getDocumentStyles();
+			Assert.assertNotNull(styles);
+
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.Graphic));
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.Paragraph));
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.Table));
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.TableRow));
+
+			OdfStyle style = styles.getStyle("Standard", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getStyleClassAttribute(), "text");
+
+			style = styles.getStyle("List", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getProperty(StyleTextPropertiesElement.FontNameComplex), "Tahoma1");
+			Assert.assertTrue(style.hasProperty(StyleTextPropertiesElement.FontNameComplex));
+			Assert.assertFalse(style.hasProperty(StyleTextPropertiesElement.FontNameAsian));
+
+			Assert.assertNull(styles.getStyle("foobar", OdfStyleFamily.Chart));
+
+			// test styles.xml:automatic-styles
+			OdfOfficeAutomaticStyles autostyles = stylesDom.getAutomaticStyles();
+			Assert.assertNotNull(autostyles);
+
+			OdfStylePageLayout pageLayout = autostyles.getPageLayout("pm1");
+			Assert.assertNotNull(pageLayout);
+			Assert.assertEquals(pageLayout.getProperty(StylePageLayoutPropertiesElement.PageWidth), "8.5in");
+			Assert.assertEquals(pageLayout.getProperty(StylePageLayoutPropertiesElement.PageHeight), "11in");
+
+			Assert.assertNull(autostyles.getStyle("foobar", OdfStyleFamily.Chart));
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testContentNode() {
+		try {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+			OdfContentDom contentDom = odfdoc.getContentDom();
+
+			// test content.xml:automatic-styles
+			OdfOfficeAutomaticStyles autoStyles = contentDom.getAutomaticStyles();
+			Assert.assertNotNull(autoStyles);
+
+			OdfStyle style = autoStyles.getStyle("P1", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getStyleNameAttribute(), "P1");
+			Assert.assertEquals(style.getStyleParentStyleNameAttribute(), "Text_20_body");
+			Assert.assertEquals(style.getStyleListStyleNameAttribute(), "L1");
+
+			style = autoStyles.getStyle("T1", OdfStyleFamily.Text);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getStyleNameAttribute(), "T1");
+
+			for (OdfStyle testStyle : autoStyles.getStylesForFamily(OdfStyleFamily.Paragraph)) {
+				testStyle(testStyle);
+			}
+
+			for (OdfStyle testStyle : autoStyles.getStylesForFamily(OdfStyleFamily.Text)) {
+				testStyle(testStyle);
+			}
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSaveDocument() {
+		try {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+			new NodeAction<String>() {
+
+				@Override
+				protected void apply(Node cur, String replace, int depth) {
+					if (cur.getNodeType() == Node.TEXT_NODE) {
+						cur.setNodeValue(cur.getNodeValue().replaceAll("\\w", replace));
+					}
+				}
+			};
+//            replaceText.performAction(e, "X");            
+			odfdoc.save(ResourceUtilities.newTestOutputFile("list-out.odt"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void testStyle(OdfStyle testStyle) throws Exception {
+		OdfFileDom fileDom = (OdfFileDom) testStyle.getOwnerDocument();
+		OdfOfficeAutomaticStyles autoStyles = null;
+		if (testStyle.getStyleParentStyleNameAttribute() != null) {
+			if (fileDom instanceof OdfContentDom) {
+				autoStyles = ((OdfContentDom) fileDom).getAutomaticStyles();
+			} else if (fileDom instanceof OdfStylesDom) {
+				autoStyles = ((OdfStylesDom) fileDom).getAutomaticStyles();
+			}
+			OdfStyle parentStyle = autoStyles.getStyle(testStyle.getStyleParentStyleNameAttribute(), testStyle.getFamily());
+			if (parentStyle == null) {
+				parentStyle = ((OdfDocument) fileDom.getDocument()).getDocumentStyles().getStyle(testStyle.getStyleParentStyleNameAttribute(), testStyle.getFamily());
+			}
+
+			Assert.assertNotNull(parentStyle);
+		}
+		if (testStyle.hasOdfAttribute(OdfName.newName(OdfDocumentNamespace.STYLE, "list-style-name"))) {
+			if (testStyle.getStyleListStyleNameAttribute() != null) {
+				OdfTextListStyle listStyle = autoStyles.getListStyle(testStyle.getStyleListStyleNameAttribute());
+				if (listStyle == null) {
+					listStyle = ((OdfDocument) fileDom.getDocument()).getDocumentStyles().getListStyle(testStyle.getStyleListStyleNameAttribute());
+				}
+
+				Assert.assertNotNull(listStyle);
+			}
+		}
+	}
+
+	@Test
+	public void testParsingOfInvalidAttribute() {
+		try {
+			// file with invalid value for enum text-underline-style
+			File testfile = ResourceUtilities.newTestOutputFile("InvalidUnderlineAttribute.odt");
+
+			// Test1: Loading shouldn't fail just because of one invalid attribute
+			OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(testfile);
+			Assert.assertNotNull(odt);
+
+			// Test2: invalid attribute node should have been be removed
+//			OdfStyle styleNode = odt.getContentDom().getAutomaticStyles().getStyle("T1", OdfStyleFamily.Text);
+//			StyleTextPropertiesElement props = OdfElement.findFirstChildNode(StyleTextPropertiesElement.class, styleNode);
+//			Assert.assertFalse(props.hasAttribute("style:text-underline-style"));
+//			odt.save(ResourceUtilities.newTestOutputFile("saving-is-possible2.odt"));
+
+			// Test3: New ODF 1.2 attribute node should exist
+			OdfStyle styleNode2 = odt.getStylesDom().getOfficeStyles().getStyle("bug77", OdfStyleFamily.Graphic);
+			StyleGraphicPropertiesElement propsGrapicElement = OdfElement.findFirstChildNode(StyleGraphicPropertiesElement.class, styleNode2);
+			Assert.assertTrue("Could not find the attribute svg:opac-capicity. Workaround bug77 did not succeeded!", propsGrapicElement.hasAttribute("svg:stroke-opacity"));
+			odt.save(ResourceUtilities.newTestOutputFile("saving-is-possible.odt"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetLocale() {
+		String filename = "testDefaultLanguage.odp";
+		try {
+			OdfPresentationDocument doc = OdfPresentationDocument.newPresentationDocument();
+
+			Assert.assertNull(doc.getLocale(OdfDocument.UnicodeGroup.WESTERN));
+			Assert.assertNull(doc.getLocale(OdfDocument.UnicodeGroup.CJK));
+			Assert.assertNull(doc.getLocale(OdfDocument.UnicodeGroup.CTL));
+
+			Locale eng_can = new Locale(Locale.ENGLISH.getLanguage(),
+					Locale.CANADA.getCountry());
+			Locale chinese_china = new Locale(Locale.CHINESE.getLanguage(),
+					Locale.CHINA.getCountry());
+			Locale ar_eg = new Locale("ar", "eg");
+
+			doc.setLocale(eng_can);
+			doc.setLocale(chinese_china);
+			doc.setLocale(ar_eg);
+
+			doc.save(ResourceUtilities.newTestOutputFile(filename));
+
+			OdfPresentationDocument newDoc = OdfPresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(filename));
+			Assert.assertEquals(eng_can, newDoc.getLocale(OdfDocument.UnicodeGroup.WESTERN));
+			Assert.assertEquals(chinese_china, newDoc.getLocale(OdfDocument.UnicodeGroup.CJK));
+			Assert.assertEquals(ar_eg, newDoc.getLocale(OdfDocument.UnicodeGroup.CTL));
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private static String inputStreamToString(InputStream in) throws IOException {
+		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+		StringBuilder stringBuilder = new StringBuilder();
+		String line = null;
+
+		while ((line = bufferedReader.readLine()) != null) {
+			stringBuilder.append(line).append("\n");
+		}
+		bufferedReader.close();
+		return stringBuilder.toString();
+	}
+
+	/** Saves the data string as UTF8 to the given filePath */
+	private static void saveString(String dataString, String filePath) throws UnsupportedEncodingException, IOException {
+		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), "UTF8"));
+		out.append(dataString);
+		out.close();
+	}
+
+	@Test
+	public void validationTest() {
+		// TESTDOC2: Expected ODF Warnings
+		Map expectedWarning2 = new HashMap();
+		expectedWarning2.put(OdfPackageConstraint.MIMETYPE_NOT_IN_PACKAGE, 1);
+		expectedWarning2.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
+
+		// TESTDOC2: Expected ODF Errors
+		Map expectedErrors2 = new HashMap();
+		expectedErrors2.put(OdfPackageConstraint.MANIFEST_DOES_NOT_LIST_FILE, 1);
+		expectedErrors2.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 3);
+		expectedErrors2.put(OdfSchemaConstraint.DOCUMENT_WITHOUT_CONTENT_NOR_STYLES_XML, 1);
+		expectedErrors2.put(OdfSchemaConstraint.PACKAGE_SHALL_CONTAIN_MIMETYPE, 1);
+		ErrorHandlerStub handler2 = new ErrorHandlerStub(expectedWarning2, expectedErrors2, null);
+		handler2.setTestFilePath("testInvalidPkg2.odt");
+
+
+		// TESTDOC3: Expected ODF Warnings
+		Map expectedWarning3 = new HashMap();
+		expectedWarning3.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 21);
+
+		// TESTDOC3: Expected ODF Errors
+		Map expectedErrors3 = new HashMap();
+		expectedErrors3.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 2);
+		expectedErrors3.put(OdfSchemaConstraint.DOCUMENT_WITHOUT_CONTENT_NOR_STYLES_XML, 1);
+		expectedErrors3.put(OdfPackageConstraint.MANIFEST_WITH_EMPTY_PATH, 1);
+		ErrorHandlerStub handler3 = new ErrorHandlerStub(expectedWarning3, expectedErrors3, null);
+		handler3.setTestFilePath("performance/Presentation1_INVALID.odp");
+
+
+		// TESTDOC1: Expected ODF Warnings
+		Map expectedWarning1 = new HashMap();
+		expectedWarning1.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
+
+		// TESTDOC1: Expected ODF Errors
+		Map expectedErrors1 = new HashMap();
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_NOT_FIRST_IN_PACKAGE, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_IS_COMPRESSED, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_HAS_EXTRA_FIELD, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_DIFFERS_FROM_PACKAGE, 1);
+		expectedErrors1.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 1);
+
+		// TESTDOC1: Expected ODF FatalErrors
+		Map<ValidationConstraint, Integer> expectedFatalErrors1 = new HashMap<ValidationConstraint, Integer>();
+		expectedFatalErrors1.put(OdfSchemaConstraint.DOCUMENT_WITHOUT_ODF_MIMETYPE, 1);
+
+		ErrorHandlerStub handler1 = new ErrorHandlerStub(expectedWarning1, expectedErrors1, expectedFatalErrors1);
+		handler1.setTestFilePath("testInvalidPkg1.odt");
+		try {
+			// First Test / Handler2
+			OdfPackage pkg2 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler2.getTestFilePath())), null, handler2);
+			OdfDocument doc2 = OdfDocument.loadDocument(pkg2);
+			Assert.assertNotNull(doc2);
+
+			// Second Test / Handler3
+			OdfPackage pkg3 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler3.getTestFilePath())), null, handler3);
+			OdfDocument doc3 = OdfDocument.loadDocument(pkg3);
+			Assert.assertNotNull(doc3);
+			Map subDocs = doc3.loadSubDocuments();
+			Assert.assertNotNull(subDocs);
+			Assert.assertEquals(PRESENTATION1_DOC_COUNT, subDocs.size());
+
+			// Third Test / Handler1
+			OdfPackage pkg1 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler1.getTestFilePath())), null, handler1);
+			OdfDocument.loadDocument(pkg1);
+			Assert.fail();
+		} catch (Exception e) {
+			if (!e.getMessage().contains("is invalid for the ODF XML Schema document")) {
+				Assert.fail();
+			}
+		}
+		handler1.validate();
+		handler2.validate();
+		handler3.validate();
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ElementTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ElementTest.java
new file mode 100644
index 0000000..3944638
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ElementTest.java
@@ -0,0 +1,90 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+
+public class ElementTest {
+
+    public ElementTest() {
+    }
+
+    @Test
+    public void testCloneNode() {
+        try {
+            OdfDocument doc = OdfTextDocument.newTextDocument();
+            OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+
+            OdfStyle p1 = styles.newStyle("P1", OdfStyleFamily.Paragraph);
+            p1.setProperty(StyleTextPropertiesElement.FontSize, "42pt");
+
+            OdfStyle clone = (OdfStyle) p1.cloneNode(true);
+            clone.setStyleNameAttribute("p1-clone");
+            styles.appendChild(clone);
+
+            OdfStyle p1clone = styles.getStyle("p1-clone", OdfStyleFamily.Paragraph);
+            Assert.assertNotNull(p1clone);
+            Assert.assertEquals(p1clone.getProperty(StyleTextPropertiesElement.FontSize), p1.getProperty(StyleTextPropertiesElement.FontSize));
+        } catch (Exception e) {
+            Logger.getLogger(ElementTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+        }
+    }
+
+    @Test
+    public void testEquals() {
+        try {
+            OdfDocument doc = OdfTextDocument.newTextDocument();
+            OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+
+            OdfStyle p1 = styles.newStyle("P1", OdfStyleFamily.Paragraph);
+            p1.setProperty(StyleTextPropertiesElement.FontSize, "42pt");
+            OdfStyle p2 = styles.newStyle("P2", OdfStyleFamily.Paragraph);
+            p2.setProperty(StyleTextPropertiesElement.FontSize, "42pt");
+            OdfStyle p3 = styles.newStyle("P3", OdfStyleFamily.Paragraph);
+            p3.setProperty(StyleTextPropertiesElement.FontSize, "13pt");
+
+            OdfTextListStyle l1 = styles.newListStyle("L1");
+            Assert.assertTrue(p1.equals(p1));
+            Assert.assertTrue(p1.equals(p2));
+            Assert.assertTrue(p2.equals(p1));
+            Assert.assertFalse(p1.equals(p3));
+            Assert.assertFalse(p3.equals(p1));
+            Assert.assertFalse(p3.equals(p1));
+            Assert.assertFalse(p1.equals(l1));
+            Assert.assertFalse(p1.equals(null));
+
+        } catch (Exception e) {
+            Logger.getLogger(ElementTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/FactoryManipulationTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/FactoryManipulationTest.java
new file mode 100644
index 0000000..59aa5e6
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/FactoryManipulationTest.java
@@ -0,0 +1,78 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class FactoryManipulationTest {
+
+    public FactoryManipulationTest() {
+    }
+
+    @Test
+	@Ignore
+    public void testFactoryManipulation() {
+//        try {
+//            // MyOwnPrivateSpanClass_1 is derived from OdfSpan (doc layer)
+//            OdfXMLFactory.setOdfElementClass(TextSpanElement.ELEMENT_NAME, MyOwnPrivateSpanClass_1.class);
+//            OdfPackage pkg = OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("factorymanipulation.odt"));
+//            OdfFileDom contentDom = OdfDocument.loadDocument(pkg).getContentDom();
+//            NodeList lst = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "span");
+//            Assert.assertTrue(lst.getLength() == 1);
+//            Node node = lst.item(0);
+//            Assert.assertTrue(node instanceof MyOwnPrivateSpanClass_1);
+//
+//            // MyOwnPrivateSpanClass_2 is derived from TextSpanElement (dom layer)
+//            OdfXMLFactory.setOdfElementClass(TextSpanElement.ELEMENT_NAME, MyOwnPrivateSpanClass_2.class);
+//            contentDom = OdfDocument.loadDocument(pkg).getContentDom();
+//            lst = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "span");
+//            Assert.assertTrue(lst.getLength() == 1);
+//            node = lst.item(0);
+//            Assert.assertTrue(node instanceof MyOwnPrivateSpanClass_2);
+//
+//            // MyOwnPrivateSpanClass_3 is derived from OdfElement to replace TextSpanElement (dom layer)
+//            OdfXMLFactory.setOdfElementClass(TextSpanElement.ELEMENT_NAME, MyOwnPrivateSpanClass_3.class);
+//            contentDom = OdfDocument.loadDocument(pkg).getContentDom();
+//            lst = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "span");
+//            Assert.assertTrue(lst.getLength() == 1);
+//            node = lst.item(0);
+//            Assert.assertTrue(node instanceof MyOwnPrivateSpanClass_3);
+//
+//            // MyOwnPrivateOdfElement is derived from OdfElement to handle <text:userdefined>
+//            OdfXMLFactory.setOdfElementClass(MyOwnPrivateOdfElement.ELEMENT_NAME, MyOwnPrivateOdfElement.class);
+//            contentDom = OdfDocument.loadDocument(pkg).getContentDom();
+//            lst = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "userdefined");
+//            Assert.assertTrue(lst.getLength() == 1);
+//            node = lst.item(0);
+//            Assert.assertTrue(node instanceof MyOwnPrivateOdfElement);
+//
+//            //set TextSpanElement.ELEMENT_NAME back to org.odftoolkit.odfdom.doc.element.text.OdfSpan
+//            OdfXMLFactory.setOdfElementClass(TextSpanElement.ELEMENT_NAME, org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan.class);
+//
+//        } catch (Exception e) {
+//            Logger.getLogger(FactoryManipulationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+//            Assert.fail(e.getMessage());
+//        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/FrameTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/FrameTest.java
new file mode 100644
index 0000000..021aa73
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/FrameTest.java
@@ -0,0 +1,57 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class FrameTest {
+
+	public FrameTest() {
+	}
+
+	@Test
+	public void testFrame() {
+		try {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("frame.odt"));
+			NodeList lst = odfdoc.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "frame");
+			Assert.assertEquals(lst.getLength(), 1);
+			Node node = lst.item(0);
+			Assert.assertTrue(node instanceof OdfDrawFrame);
+			OdfDrawFrame fe = (OdfDrawFrame) lst.item(0);
+
+			Assert.assertEquals(fe.getProperty(StyleGraphicPropertiesElement.VerticalPos), "top");
+		} catch (Exception e) {
+			Logger.getLogger(FrameTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/GetTextTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/GetTextTest.java
new file mode 100644
index 0000000..76be19c
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/GetTextTest.java
@@ -0,0 +1,60 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+ */
+
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Logger;
+import org.junit.Test;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfEditableTextExtractor;
+import org.junit.Assert;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+public class GetTextTest {
+
+	public static final Logger LOG = Logger.getLogger(GetTextTest.class.getName());
+
+	/**
+	 * This method will invoke OdfEditableTextExtractor to test text extraction function.
+	 */
+	@Test
+	public void testToString() {
+
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("text-extract.odt"));
+			OdfEditableTextExtractor extractor = OdfEditableTextExtractor.newOdfEditableTextExtractor(doc);
+			String output = extractor.getText();
+			LOG.info(output);
+			int count = 0;
+			int index = output.indexOf("ODFDOM");
+			while (index != -1) {
+				count++;
+				index = output.indexOf("ODFDOM", index + 1);
+			}
+			if (count != 30) {
+				// there are
+				// 23 ODFDOM in the /content.xml
+				// 2  ODFDOM in the /styles.xml
+				// 5 ODFDOM in the /Object 1/content.xml
+				throw new RuntimeException("Something wrong! count=" + count);
+			}
+		} catch (Exception e) {
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/GraphicsTemplateTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/GraphicsTemplateTest.java
new file mode 100644
index 0000000..7723126
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/GraphicsTemplateTest.java
@@ -0,0 +1,79 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of graphics.
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class GraphicsTemplateTest {
+
+	private static final String TEST_GRAPHICS_TEMPLATE = "/graphicTestTemplate.otg";
+
+	@Test
+	public void testLoadingAGraphicsTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_GRAPHICS_TEMPLATE));
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingAGraphicsTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_GRAPHICS_TEMPLATE));
+		File destination = File.createTempFile("odfdom-test", ".otg");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewGraphicsTemplate() throws Exception {
+		OdfDocument document = OdfGraphicsDocument.newGraphicsTemplateDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("odfdom-test", ".otg");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfGraphicsDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfGraphicsDocument() throws Exception {
+		OdfGraphicsDocument document = OdfGraphicsDocument.newGraphicsDocument();
+		document.changeMode(OdfGraphicsDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = OdfGraphicsDocument.newGraphicsTemplateDocument();
+		document.changeMode(OdfGraphicsDocument.OdfMediaType.GRAPHICS);
+		Assert.assertEquals(OdfDocument.OdfMediaType.GRAPHICS.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ImageTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ImageTest.java
new file mode 100644
index 0000000..291207f
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ImageTest.java
@@ -0,0 +1,224 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import static org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage.deleteImage;
+import static org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage.deleteImageByPath;
+import static org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage.getImageByPath;
+import static org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage.getImageCount;
+import static org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage.getImagePathSet;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.utils.NodeAction;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class ImageTest {
+
+	private URI mImageUri_ODFDOM = null;
+	private static final String mImagePath = "src/main/javadoc/doc-files/";
+	private static final String mImageName_ODFDOM = "ODFDOM-Layered-Model.png";
+	private static final String mPackageGraphicsPath = "Pictures/";
+
+	public ImageTest() {
+		try {
+			mImageUri_ODFDOM = new URI(mImagePath + mImageName_ODFDOM);
+
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null,
+					ex);
+			Assert.fail(ex.getMessage());
+		}
+	}
+
+	@Test
+	@SuppressWarnings("unchecked")
+	public void testAddImageByUri() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("image.odt"));
+			final OdfPackage pkg = doc.getPackage();
+			NodeAction addImages = new NodeAction() {
+
+				@Override
+				protected void apply(Node node, Object arg, int depth) {
+					if (node instanceof OdfDrawImage) {
+						OdfDrawImage img = (OdfDrawImage) node;
+						try {
+							String packagePath = img.newImage(mImageUri_ODFDOM);
+							if (packagePath == null || !pkg.contains(packagePath)) {
+								Assert.fail("The folloing image could not be embedded:" + mImageUri_ODFDOM.toString());
+							} else if (!packagePath.equals(mPackageGraphicsPath + mImageName_ODFDOM)) {
+								Assert.fail("Instead of '" + mPackageGraphicsPath + mImageName_ODFDOM + "' the folloing image path was returned: '" + packagePath + "'");
+							}
+						} catch (Exception ex) {
+							Logger.getLogger(ImageTest.class.getName()).log(
+									Level.SEVERE, null, ex);
+							Assert.fail(ex.getMessage());
+						}
+					}
+				}
+			};
+			addImages.performAction(doc.getContentDom().getDocumentElement(),
+					null);			
+			doc.save(ResourceUtilities.getTestOutput("add-images-by-uri.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testRemoveImage() throws Exception {
+		OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("image.odt"));
+		final OdfPackage pkg = doc.getPackage();
+		NodeAction<?> removeImages = new NodeAction<Object>() {
+
+			@Override
+			protected void apply(Node node, Object arg, int depth) {
+				if (node instanceof OdfDrawImage) {
+					OdfDrawImage img = (OdfDrawImage) node;
+					String ref = img.getAttributeNS(
+							OdfDocumentNamespace.XLINK.getUri(), "href");
+					pkg.remove(ref);
+					img.getParentNode().removeChild(img);
+				}
+			}
+		};
+		removeImages.performAction(doc.getContentDom().getDocumentElement(),
+				null);
+		pkg.save(ResourceUtilities.getTestOutput("remove-images.odt"));
+
+	}
+
+	@Test
+	public void testImageInTextDocument() {
+		try {
+			OdfTextDocument doc = OdfTextDocument.newTextDocument();
+			String imagePath1 = doc.newImage(ResourceUtilities.getURI("testA.jpg"));
+			Assert.assertTrue(getImageCount(doc) == 1);
+			OdfDrawImage image = getImageByPath(doc, imagePath1).get(0);
+			Assert.assertTrue(image.getImageUri().toString().equals(imagePath1));
+			OdfDrawFrame frame1 = (OdfDrawFrame) image.getParentNode();
+			frame1.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+			frame1.setTextAnchorPageNumberAttribute(1);
+
+			//add paragraph
+			OfficeTextElement office = doc.getContentRoot();
+			OdfTextParagraph para1 = (OdfTextParagraph) office.newTextPElement();
+			para1.setTextContent("insert an image here");
+			String imagePath2 = doc.newImage(mImageUri_ODFDOM);
+
+			OdfTextParagraph para2 = (OdfTextParagraph) office.newTextPElement();
+			para2.setTextContent("another");
+			String imagePath3 = doc.newImage(mImageUri_ODFDOM);
+			OdfDrawImage image3 = getImageByPath(doc, imagePath3).get(1);
+			OdfDrawFrame frame3 = (OdfDrawFrame) image3.getParentNode();
+			frame3.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.CHAR.toString());
+
+			doc.save(ResourceUtilities.newTestOutputFile("addimages.odt"));
+
+			//load the file again
+			OdfTextDocument doc1 = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("addimages.odt"));
+
+			Assert.assertTrue(getImageCount(doc1) == 3);
+			Assert.assertTrue(getImageByPath(doc1, imagePath2).size() == 2);
+			deleteImageByPath(doc1, imagePath2);
+			Assert.assertTrue(getImageCount(doc1) == 1);
+			Assert.assertTrue(getImageByPath(doc1, imagePath3).size() == 0);
+			Assert.assertNull(doc1.getPackage().getBytes(imagePath3));
+			doc1.save(ResourceUtilities.newTestOutputFile("removeimages.odt"));
+
+		} catch (Exception ex) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+
+	}
+
+        @Test
+	public void testSVGInTextDocument() {
+		try {
+			OdfTextDocument doc = OdfTextDocument.newTextDocument();
+			String imagePath1 = doc.newImage(ResourceUtilities.getURI("simple.svg"));
+			Assert.assertTrue(getImageCount(doc) == 1);
+			OdfDrawImage image = getImageByPath(doc, imagePath1).get(0);
+			Assert.assertTrue(image.getImageUri().toString().equals(imagePath1));
+			OdfDrawFrame frame1 = (OdfDrawFrame) image.getParentNode();
+			frame1.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+			frame1.setTextAnchorPageNumberAttribute(1);
+
+			doc.save(ResourceUtilities.newTestOutputFile("svg-image.odt"));
+
+			//load the file again
+			OdfTextDocument doc1 = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("svg-image.odt"));
+
+			Assert.assertTrue(getImageCount(doc1) == 1);
+
+		} catch (Exception ex) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+
+	}
+
+	@Test
+	public void testRemoveAllImage() {
+		try {
+			OdfTextDocument doc = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("addimages.odt"));
+
+			Set<String> pathSet = getImagePathSet(doc);
+			for (String pathIter : pathSet) {
+				List<OdfDrawImage> imageList = getImageByPath(doc, pathIter);
+				for (int i = 0; i < 1; i++) {
+					deleteImage(doc, imageList.get(i));
+				}
+			}
+			Assert.assertTrue(getImageCount(doc) == 1);
+			pathSet = getImagePathSet(doc);
+			for (String pathIter : pathSet) {
+				deleteImageByPath(doc, pathIter);
+			}
+			Assert.assertTrue(getImageCount(doc) == 0);
+			doc.save(ResourceUtilities.newTestOutputFile("removeAllImages.odt"));
+
+		} catch (Exception ex) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ListTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ListTest.java
new file mode 100644
index 0000000..246b21a
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/ListTest.java
@@ -0,0 +1,69 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextList;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class ListTest {
+
+    public ListTest() {
+    }
+
+    @Test
+    public void testList() {
+        try {            
+            OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("list.odt"));
+            OdfFileDom odfContent = odfdoc.getContentDom();
+            NodeList lst = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "list");
+            for (int i = 0; i < lst.getLength(); i++) {
+                Node node = lst.item(i);
+                Assert.assertTrue(node instanceof OdfTextList);
+                OdfTextList le = (OdfTextList) lst.item(i);
+
+                OdfTextListStyle ls = le.getListStyle();
+                Assert.assertNotNull(ls);
+                OdfElement lvl = ls.getLevel(1);
+                Assert.assertNotNull(lvl);
+
+                int level = le.getListLevel();
+                OdfElement lvl1 = ls.getLevel(level);
+                OdfElement lvl2 = le.getListLevelStyle();
+                Assert.assertEquals(lvl1, lvl2);
+            }
+        } catch (Exception e) {
+        	Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java
new file mode 100644
index 0000000..8f5d1b6
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java
@@ -0,0 +1,100 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentContentElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class LoadSaveTest {
+
+	private static final String SOURCE = "not-only-odf.odt";
+	private static final String TARGET = "loadsavetest.odt";
+	private static final String FOREIGN_ATTRIBUTE_NAME = "foreignAttribute";
+	private static final String FOREIGN_ATTRIBUTE_VALUE = "foreignAttributeValue";
+	private static final String FOREIGN_ELEMENT_TEXT = "foreignText";
+
+	public LoadSaveTest() {
+	}
+
+	@Test
+	public void testLoadSave() {
+		try {
+			OdfDocument odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE));
+			Assert.assertTrue(odfDocument.getPackage().contains("content.xml"));
+			String baseURI1 = odfDocument.getBaseURI();
+			String baseURI2 = ResourceUtilities.getURI(SOURCE).toString();
+//			Assert.assertTrue(baseURI2.compareToIgnoreCase(baseURI1) == 0);
+			System.out.println("SOURCE URI1:"+baseURI1);
+			System.out.println("SOURCE URI2:"+baseURI2);
+			
+			OdfFileDom odfContent = odfDocument.getContentDom();
+			String odf12 = OfficeVersionAttribute.Value._1_2.toString();
+			OfficeDocumentContentElement content = (OfficeDocumentContentElement) odfContent.getDocumentElement();
+			String version = content.getOfficeVersionAttribute();
+			Assert.assertFalse(version.equals(odf12));
+
+			NodeList lst = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+			Node node = lst.item(0);
+			String oldText = "Changed!!!";
+			node.setTextContent(oldText);
+
+			odfDocument.save(ResourceUtilities.newTestOutputFile(TARGET));
+			odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TARGET));
+
+			odfContent = odfDocument.getContentDom();
+			// ToDo: Will be used for issue 60: Load & Save of previous ODF versions (ie. ODF 1.0, ODF 1.1)
+			//Assert.assertTrue(odfContent.getRootElement().getOfficeVersionAttribute().equals(odf12));
+			lst = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+			node = lst.item(0);
+			String newText = node.getTextContent();
+			Assert.assertTrue(newText.equals(oldText));
+
+			node = lst.item(1);
+			//check foreign attribute without namespace
+			Element foreignElement = (Element) node.getChildNodes().item(0);
+			String foreignText = foreignElement.getTextContent();
+			Assert.assertTrue(foreignText.equals(FOREIGN_ELEMENT_TEXT));
+
+			//check foreign element without namespace
+			Attr foreignAttr = (Attr) node.getAttributes().getNamedItem(FOREIGN_ATTRIBUTE_NAME);
+			String foreignAttrValue = foreignAttr.getValue();
+			Assert.assertTrue(foreignAttrValue.equals(FOREIGN_ATTRIBUTE_VALUE));
+
+
+
+		} catch (Exception e) {
+			Logger.getLogger(LoadSaveTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateOdfElement.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateOdfElement.java
new file mode 100644
index 0000000..616efee
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateOdfElement.java
@@ -0,0 +1,53 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+/**
+ * ODF DOM Element implementation for element "<text:userdefined>".
+ */
+public class MyOwnPrivateOdfElement extends OdfElement
+{
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 2777209641983266195L;
+	/**
+     * 
+     */
+    public static final OdfName ELEMENT_NAME = OdfName.newName( OdfDocumentNamespace.TEXT, "userdefined" );
+
+    public MyOwnPrivateOdfElement( OdfFileDom _aOwnerDoc )
+    {
+        super( _aOwnerDoc, ELEMENT_NAME );
+    }
+
+    @Override
+	public OdfName getOdfName()
+    {
+        return ELEMENT_NAME;
+    }
+};
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_1.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_1.java
new file mode 100644
index 0000000..87a27f4
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_1.java
@@ -0,0 +1,38 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+
+public class MyOwnPrivateSpanClass_1 extends OdfTextSpan {
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 998212211280402094L;
+
+	/** Creates a new instance of this class */
+    public MyOwnPrivateSpanClass_1(OdfFileDom ownerDoc) {
+        super(ownerDoc);
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_2.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_2.java
new file mode 100644
index 0000000..c8fb2da
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_2.java
@@ -0,0 +1,39 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.odftoolkit.odfdom.doc;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+
+
+public class MyOwnPrivateSpanClass_2 extends TextSpanElement {
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 3782225493052113393L;
+
+	/** Creates a new instance of this class */
+    public MyOwnPrivateSpanClass_2(OdfFileDom ownerDoc) {
+        super(ownerDoc);
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_3.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_3.java
new file mode 100644
index 0000000..18a7a80
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/MyOwnPrivateSpanClass_3.java
@@ -0,0 +1,47 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+
+public class MyOwnPrivateSpanClass_3 extends OdfElement {
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -4819629767539792181L;
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfDocumentNamespace.TEXT, "span");
+
+    /** Creates a new instance of OdfParagraphElementImpl
+     */
+    public MyOwnPrivateSpanClass_3(OdfFileDom ownerDoc) {
+        super(ownerDoc, ELEMENT_NAME);
+    }
+
+    @Override
+    public OdfName getOdfName() {
+        return ELEMENT_NAME;
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/NamespaceTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/NamespaceTest.java
new file mode 100644
index 0000000..0b51bac
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/NamespaceTest.java
@@ -0,0 +1,96 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+public class NamespaceTest {
+
+    private static final String TARGET = "namespacetest.odt";
+
+    public NamespaceTest() {
+    }
+
+    @Test
+    public void testNewNamespace() {
+        try {
+            OdfTextDocument doc = OdfTextDocument.newTextDocument();
+
+            OdfFileDom contentDom = doc.getContentDom();
+            XPath xpath = contentDom.getXPath();
+            
+            // Postive test for XPath on ODF attributes
+            String resTest1 = xpath.evaluate("//text:p[@text:style-name='Standard']", contentDom);
+            Assert.assertTrue(resTest1 != null);
+
+            // Test XPath on none ODF attributes (added explicitly via DOM)
+            OdfTextParagraph p = doc.newParagraph();
+            p.setAttributeNS("http://myAttributeNamespace", "my:attr", "attrValue");
+            String resAttr1 = xpath.evaluate("//*[@my:attr = 'attrValue']", contentDom);
+            Assert.assertTrue(resAttr1 != null);
+
+            // Test XPath on none ODF element (added explicitly via DOM)
+            p.appendChild(contentDom.createElementNS("http://myElementNamespace", "my:element"));
+            String resElement1 = xpath.evaluate("//my:element", contentDom);
+            Assert.assertTrue(resElement1 != null);
+
+            // Save documnet
+            File targetFile = ResourceUtilities.newTestOutputFile(TARGET);
+            doc.save(targetFile);
+
+
+            
+            // Load document with ODF foreign attriute
+            OdfTextDocument docReloaded = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TARGET));
+            OdfFileDom contentDomReloaded = docReloaded.getContentDom();
+
+            // Postive test for XPath on ODF attributes
+            xpath = contentDomReloaded.getXPath();
+            String resTest2 = xpath.evaluate("//text:p[@text:style-name='Standard']", contentDomReloaded);
+            Assert.assertTrue(resTest2 != null);
+            
+            // Test XPath on none ODF attributes (added via load)
+            String resAttr2 = xpath.evaluate("//*[@my:attr = 'attrValue']", contentDomReloaded);
+            Assert.assertTrue(resAttr2 != null);
+
+            // Test XPath on none ODF element (added via load)
+            p.appendChild(contentDom.createElementNS("http://myElementNamespace", "my:element"));
+            String resElement2 = xpath.evaluate("//my:element", contentDomReloaded);
+            Assert.assertTrue(resElement2 != null);
+
+        } catch (Exception ex) {
+        	Logger.getLogger(NamespaceTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+            Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/PresentationTemplateTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/PresentationTemplateTest.java
new file mode 100644
index 0000000..e315fcf
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/PresentationTemplateTest.java
@@ -0,0 +1,80 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of presentations.
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class PresentationTemplateTest {
+
+	private static final String TEST_PRESENTATION = "/presentationTestTemplate.otp";
+
+	@Test
+	public void testLoadingAPresentationTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_PRESENTATION));
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingAPresentationTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_PRESENTATION));
+		File destination = File.createTempFile("odfdom-test", ".otp");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewPresentationTemplate() throws Exception {
+		OdfDocument document = OdfPresentationDocument.newPresentationTemplateDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		File destination = File.createTempFile("odfdom-test", ".otp");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfPresentationDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfPresentationDocument() throws Exception {
+		OdfPresentationDocument document = OdfPresentationDocument.newPresentationDocument();
+		document.changeMode(OdfPresentationDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = OdfPresentationDocument.newPresentationTemplateDocument();
+		document.changeMode(OdfPresentationDocument.OdfMediaType.PRESENTATION);
+		Assert.assertEquals(OdfDocument.OdfMediaType.PRESENTATION.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/PresentationTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/PresentationTest.java
new file mode 100644
index 0000000..6d6185e
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/PresentationTest.java
@@ -0,0 +1,204 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.doc;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.presentation.OdfSlide;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGradientElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawHatchElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMarkerElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+/**
+ *
+ * @author cl93746
+ */
+public class PresentationTest {
+
+	OdfDocument odfdoc;
+
+	public PresentationTest() {
+		try {
+			odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("presentation.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testPresentation() {
+		try {
+			OdfPresentationDocument odpdoc = (OdfPresentationDocument) odfdoc;
+
+			OdfSlide page = odpdoc.getSlideByName("slide-name-1");
+			Assert.assertTrue((page != null) && page.getSlideName().equals("slide-name-1"));
+			Assert.assertEquals(page, odpdoc.getSlideByIndex(0));
+
+			page = odpdoc.getSlideByName("slide-name-2");
+			Assert.assertTrue((page != null) && page.getSlideName().equals("slide-name-2"));
+			Assert.assertEquals(page, odpdoc.getSlideByIndex(1));
+
+			page = odpdoc.getSlideByName("slide-name-3");
+			Assert.assertTrue((page != null) && page.getSlideName().equals("slide-name-3"));
+			Assert.assertEquals(page, odpdoc.getSlideByIndex(2));
+
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testMasterStyles() {
+		try {
+			OdfOfficeMasterStyles officeMasterStyles = odfdoc.getOfficeMasterStyles();
+			Assert.assertNotNull(officeMasterStyles);
+
+			// check if iterator has all two master pages
+			testIterator(StyleMasterPageElement.class, officeMasterStyles.getMasterPages(), 2);
+
+			// test "master-name-1"
+			StyleMasterPageElement master = officeMasterStyles.getMasterPage("master-name-1");
+			Assert.assertNotNull(master);
+			Assert.assertEquals(master.getStyleNameAttribute(), "master-name-1");
+
+			// test "master-name-2"
+			master = officeMasterStyles.getMasterPage("master-name-2");
+			Assert.assertNotNull(master);
+			Assert.assertEquals(master.getStyleNameAttribute(), "master-name-2");
+
+			// test handout master
+			Assert.assertNotNull(officeMasterStyles.getHandoutMaster());
+
+			// test layerset
+			Assert.assertNotNull(officeMasterStyles.getLayerSet());
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testStyles() {
+		try {
+			OdfOfficeStyles officeStyles = odfdoc.getDocumentStyles();
+			Assert.assertNotNull(officeStyles);
+
+			Assert.assertNotNull(officeStyles.getGradient("Linear_20_blue_2f_white"));
+			testIterator(DrawGradientElement.class, officeStyles.getGradients().iterator(), 1);
+
+			Assert.assertNotNull(officeStyles.getMarker("Arrow"));
+			testIterator(DrawMarkerElement.class, officeStyles.getMarker().iterator(), 1);
+
+			Assert.assertNotNull(officeStyles.getHatch("Black_20_0_20_Degrees"));
+			testIterator(DrawHatchElement.class, officeStyles.getHatches().iterator(), 1);
+
+			Assert.assertNotNull(officeStyles.getFillImage("Aqua"));
+			testIterator(DrawFillImageElement.class, officeStyles.getFillImages().iterator(), 1);
+
+			// check for some styles
+			Assert.assertNotNull(officeStyles.getDefaultStyle(OdfStyleFamily.Graphic));
+			Assert.assertNotNull(officeStyles.getStyle("standard", OdfStyleFamily.Graphic));
+			Assert.assertNotNull(officeStyles.getStyle("master-name-1-outline1", OdfStyleFamily.Presentation));
+
+			Iterator<OdfStyle> style_iter = officeStyles.getStylesForFamily(OdfStyleFamily.Presentation).iterator();
+			Assert.assertNotNull(style_iter);
+			Assert.assertTrue(style_iter.hasNext());
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private <T extends OdfElement> void testIterator(Class<T> clazz, Iterator<T> iter, int elements) {
+		Assert.assertNotNull(iter);
+		while (elements > 0) {
+			Assert.assertTrue(iter.hasNext());
+			Assert.assertTrue(clazz.isInstance(iter.next()));
+			elements--;
+		}
+
+		Assert.assertFalse(iter.hasNext());
+	}
+
+	@Test
+	public void testPresentationClassAttribute() {
+		try {
+			OdfGraphicsDocument doc = OdfGraphicsDocument.newGraphicsDocument();
+			OdfFileDom dom = doc.getContentDom();
+			OdfDrawFrame f = new OdfDrawFrame(dom);
+
+			f.setPresentationClassAttribute(PresentationClassAttribute.Value.GRAPHIC.toString());
+			Logger.getLogger(DocumentCreationTest.class.getName()).info(f.getPresentationClassAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testStyleUsageCount() {
+		try {
+			OdfOfficeAutomaticStyles s = odfdoc.getStylesDom().getAutomaticStyles();
+			OdfStyle pr1 = s.getStyle("pr1", OdfStyleFamily.Presentation);
+			int styleUserCount = pr1.getStyleUserCount();
+			OdfStylesDom stylesDom = odfdoc.getStylesDom();
+			XPath xpath = stylesDom.getXPath();
+			NodeList elementsWithStyle = (NodeList) xpath.evaluate("//draw:frame[@presentation:style-name='pr1']",
+					stylesDom, XPathConstants.NODESET);
+			int elementsWithStyleCount = elementsWithStyle.getLength();
+			Assert.assertTrue(styleUserCount == elementsWithStyleCount);
+//			//#bug51,the bug will be induced by using set attribute method
+//			OdfDrawFrame frame = (OdfDrawFrame) elementsWithStyle.item(0);
+//			frame.setPresentationStyleNameAttribute("pr2");
+//			styleUserCount = pr1.getStyleUserCount();
+//			elementsWithStyle = (NodeList) xpath.evaluate("//draw:frame[@presentation:style-name='pr1']",
+//					odfdoc.getStylesDom(), XPathConstants.NODESET);
+//			elementsWithStyleCount = elementsWithStyle.getLength();
+//			Assert.assertTrue("Last part of bug51 still to be fixed..!!", styleUserCount == elementsWithStyleCount);
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/SlideTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/SlideTest.java
new file mode 100644
index 0000000..d338785
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/SlideTest.java
@@ -0,0 +1,574 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.presentation.OdfPresentationNotes;
+import org.odftoolkit.odfdom.doc.presentation.OdfSlide;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+/**
+ * Test for Presentation Slide API, including get/move/insert/delete slide in one presentation
+ * and the slides operation of two presentations.
+ */
+public class SlideTest {
+
+	private static final Logger LOG = Logger.getLogger(SlideTest.class.getName());
+	OdfPresentationDocument doc;
+	OdfPresentationDocument doc2;
+	final String TEST_PRESENTATION_FILE_MAIN = "Presentation1.odp";
+	final String TEST_PRESENTATION_FILE_ANOTHER = "Presentation2.odp";
+	final String TEST_PRESENTATION_FILE_OUT_PREFIX = "SlideResult";
+	final String TEST_PRESENTATION_DOCUMENT1 = "SlideTest1.odp";
+	final String TEST_PRESENTATION_DOCUMENT2 = "SlideTest2.odp";
+	final String TEST_PRESENTATION_DOCUMENT3 = "SlideTest3.odp";
+
+	/**
+	 * Initialize the test case.
+	 */
+	public SlideTest() {
+	}
+
+	/**
+	 * Test case for get presentation slide, including get the slide count, get
+	 * the slide at the specified position or with the specified name, and get
+	 * the collection of slide. 
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp
+	 * <b>Method</b> 1)By using OdfPresentationDocument.getSlideCount() to Get the
+	 * number of the slides in this presentation.
+	 * 2)According to the slide count, get a slide at the specific position of
+	 * the loaded presentation document using
+	 * OdfPresentationDocument.getSlideByIndex(int index), and the param "index"
+	 * should be limited with the slide count. Use OdfDrawPage.getSlideIndex()
+	 * method to verify the returned slide.
+	 * 3)OdfPresentationDocument.getSlideByName(String name)
+	 * 4)Using dfPresentationDocument.getSlides() to get the slide iterator
+	 * <b>Covered Element</b> &lt;office:presentation&gt;,&lt;draw:page&gt;
+	 * <b>Note</b> OdfPresentationDocument.getContentRoot override OdfDocument.getContentRoot method
+	 * will return OfficePresentationElement, rather than OdfOfficePresentation
+	 * because of the inheritance relationship broken up between dom and doc element
+	 * And because OdfOfficePresentation is useless, so I delete this class
+	 * <b>Code Coverage Result</b>
+	 * 1)can not catch Exception because it is only used to catch the exception thrown by getContentRoot()
+	 */
+	@Test
+	public void testGetSlide() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			int slideCount = doc.getSlideCount();
+			Assert.assertTrue(10 == slideCount);
+			OdfSlide page2 = doc.getSlideByIndex(2);
+			Assert.assertTrue(2 == page2.getSlideIndex());
+			OdfSlide slide3 = doc.getSlideByName("Slide 3");
+			Assert.assertNull(slide3);
+			slide3 = doc.getSlideByName("page3");
+			Assert.assertEquals(page2, slide3);
+			Iterator<OdfSlide> slideIter = doc.getSlides();
+			int i = 0;
+			while (slideIter.hasNext()) {
+				OdfSlide slide = slideIter.next();
+				Assert.assertTrue(i == slide.getSlideIndex());
+				String name = "page" + (i + 1);
+				Assert.assertTrue(name.equals(slide.getSlideName()));
+				i++;
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		OdfSlide slidesNoName = doc.getSlideByName(null);
+		Assert.assertNull(slidesNoName);
+		OdfSlide nullSlide = doc.getSlideByIndex(20);
+		Assert.assertNull(nullSlide);
+		nullSlide = doc.getSlideByIndex(-1);
+		Assert.assertNull(nullSlide);
+
+	}
+
+	/**
+	 * Test case for get/set slide name to make sure the name is unique in the whole presentation document.
+	 * If the loaded presentation document is not valid that contain the same slide name,
+	 * we should modified the duplicate slide name to make them unique.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp
+	 * Using the dom method to make slide index 4 and 8 have the same name, 
+	 * and delete the "draw:name" attribute of slide 7.
+	 * <b>Method</b> 
+	 * 1)By accessing any slide API to trigger the duplicate slide name check method.
+	 * After this operation, slide 8 will change the slide name.
+	 * 2)Trigger OdfDrawPage.getSlideName() to make the slide 7 has the unique slide name.
+	 * 3)Using OdfDrawPage.setSlideName() to give the slide 1 with the new name.
+	 */
+	@Test
+	public void testSlideName() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			OfficePresentationElement contentRoot = doc.getContentRoot();
+			NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+			DrawPageElement slideEle4 = (DrawPageElement) slideNodes.item(4);
+			Assert.assertEquals(slideEle4.getDrawNameAttribute(), "page5");
+			DrawPageElement slideEle8 = (DrawPageElement) slideNodes.item(8);
+			slideEle8.setDrawNameAttribute("page5");
+			OdfSlide slide7 = doc.getSlideByIndex(7);
+			DrawPageElement slideEle7 = (DrawPageElement) slideNodes.item(7);
+			slideEle7.removeAttributeNS(OdfDocumentNamespace.DRAW.getUri(), "name");
+
+			OdfSlide slide4 = doc.getSlideByIndex(4);
+			Assert.assertTrue(slide4.getSlideName().equals("page5"));
+			OdfSlide slide8 = doc.getSlideByIndex(8);
+			Assert.assertFalse(slide8.getSlideName().equals("page5"));
+
+			Assert.assertTrue(slide7.getSlideName().startsWith("page8"));
+			OdfPresentationNotes note7 = slide7.getNotesPage();
+			note7.addText("This is slide at index" + slide7.getSlideIndex() + " named " + slide7.getSlideName());
+
+			OdfSlide slide1 = doc.getSlideByIndex(1);
+			slide1.setSlideName("haha");
+			slide1.setSlideName("page1");
+
+		} catch (IllegalArgumentException ile) {
+			OdfSlide slide1 = doc.getSlideByIndex(1);
+			Assert.assertTrue("the given name page1 is duplicate with the previous slide", slide1.getSlideName().equals("haha"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "SlideName.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for delete presentation slide, including delete slide at the
+	 * specified position or with the specified name.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp
+	 * <b>Method</b> 1)By using OdfPresentationDocument.deleteSlideByIndex(int index)
+	 * to delete the slide at the specified position which is present by
+	 * param "index", then index of the slide which after the delete slide will change.
+	 * 2)Delete slide with the specified name by using
+	 * OdfPresentationDocument.deleteSlideByName(String name)
+	 * <b>PostCondition</b> Save the modified document at SlideResultDelete.odp
+	 * <b>Covered Element</b> 1) &lt;office:presentation&gt;,&lt;draw:page&gt;
+	 * 2)All the element that contains "xlink:href" attribute, such as &lt;draw:object&gt;, &lt;draw:image&gt;, etc.
+	 * 3)All the style name definition element,
+	 * include &lt;style:style&gt;, &lt;text:list-style&gt;, &lt;number:time-style&gt;, &lt;number:date-style&gt;,
+	 *         &lt;number:boolean-style&gt;, &lt;number:number-style&gt;, &lt;number:currency-style&gt;,
+	 *         &lt;number:percentage-style&gt;, &lt;number:text-style&gt;
+	 * 4)All the <code>OdfStylableElement</code> which have the style name reference,
+	 * such as &lt;draw:frame&gt;, &lt;text:p&gt; etc.
+	 * <b>Note</b> When the specific slide is delete, if it referred images, ole or styles are not used by other slide
+	 * they will all be removed from the package.
+	 */
+	@Test
+	public void testDeleteSlide() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			OdfSlide slide2 = doc.getSlideByIndex(2);
+			OdfSlide slide3 = doc.getSlideByIndex(3);
+			//this slide contains an embed document, remove this slide will also remove the embed document
+			int nEmbedDoc = doc.loadSubDocuments().size();
+			Assert.assertTrue(doc.deleteSlideByIndex(2));
+			//slide3 is no longer exist
+			Assert.assertTrue(-1 == slide2.getSlideIndex());
+			Assert.assertTrue(2 == slide3.getSlideIndex());
+			Assert.assertTrue(doc.loadSubDocuments().size() == (nEmbedDoc - 1));
+			Assert.assertTrue(doc.deleteSlideByName("page5"));
+			int count = doc.getSlideCount();
+			Assert.assertTrue(8 == count);
+			//slide at index 9 contains two images and one embed document, the embed document aslo have the object replacement image
+			//remove this slide will also remove these three images
+			String IMAGE_NAME_1 = "Pictures/10000000000002580000018FB151A5C8.jpg";
+			String IMAGE_NAME_2 = "Pictures/1000000000000C80000004009305DCA3.jpg";
+			String IMAGE_NAME_3 = "ObjectReplacements/Object 13";
+			int nImageCnt = OdfDrawImage.getImageCount(doc);
+			InputStream imageStream1 = doc.getPackage().getInputStream(IMAGE_NAME_1);
+			Assert.assertNotNull(imageStream1);
+			Assert.assertTrue(doc.deleteSlideByIndex(doc.getSlideCount() - 2));
+			Assert.assertTrue(OdfDrawImage.getImageCount(doc) == (nImageCnt - 3));
+			imageStream1 = doc.getPackage().getInputStream(IMAGE_NAME_1);
+			Assert.assertNull(imageStream1);
+			InputStream imageStream2 = doc.getPackage().getInputStream(IMAGE_NAME_2);
+			Assert.assertNull(imageStream2);
+			InputStream imageStream3 = doc.getPackage().getInputStream(IMAGE_NAME_3);
+			Assert.assertNull(imageStream3);
+			//slide at index 2 at doc2 contains one image, but it also referred by other slides
+			//so the image of this slide will not be removed
+			doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER));
+			nImageCnt = OdfDrawImage.getImageCount(doc2);
+			Assert.assertTrue(doc2.deleteSlideByIndex(2));
+			Assert.assertTrue(OdfDrawImage.getImageCount(doc2) == (nImageCnt - 1));
+			imageStream1 = doc2.getPackage().getInputStream(IMAGE_NAME_1);
+			Assert.assertNotNull(imageStream1);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			Assert.assertTrue(doc.deleteSlideByIndex(20));
+			Assert.assertTrue(false);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Delete.odp"));
+			doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Delete2.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for create new slide at the specified position, with the
+	 * specified name and slide template.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp
+	 * <b>Method</b>
+	 * OdfPresentationDocument.newSlide(int index, String name,
+	 * OdfDrawPage.SlideLayout slideLayout) is used to new a slide at the specified
+	 * position with the specified name, and use the specified slide template.
+	 * <b>Postcondition</b> Save the modified document at SlideResultNew.odp
+	 * <b>Covered Element</b> 
+	 * 1) &lt;style:presentation-page-layout&gt; referred by "presentation:presentation-page-layout-name" attribute of &lt;draw:page&gt;
+	 * 2) &lt;style:master-page&gt; referred by "draw:master-page-name" attribute of &lt;draw:page&gt;
+	 * 3) The placeholder element of &lt;draw:page&gt;, such as title, outline placeholder
+	 * <b>Note</b> The new slide will use the same master page style of the previous slide,
+	 * and add the placeholder on the slide according to the slide template parameter.
+	 */
+	@Test
+	public void testNewSlide() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			OdfSlide slide5 = doc.getSlideByIndex(5);
+			OdfSlide newSlide1 = doc.newSlide(2, "Slide 2 new", OdfSlide.SlideLayout.BLANK);
+			Assert.assertTrue(2 == newSlide1.getSlideIndex());
+			OdfSlide newSlide2 = doc.newSlide(0, "", OdfSlide.SlideLayout.TITLE_ONLY);
+			Assert.assertTrue(newSlide2.getSlideName().equals(""));
+			Assert.assertTrue(7 == slide5.getSlideIndex());
+			doc.newSlide(3, OdfSlide.SlideLayout.TITLE_PLUS_TEXT.toString(), OdfSlide.SlideLayout.enumValueOf("title_text"));
+			OdfSlide newSlide4 = doc.newSlide(4, null, OdfSlide.SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			Assert.assertTrue(newSlide4.getOdfElement().getDrawNameAttribute() != null);
+			OdfSlide.SlideLayout outlineType = OdfSlide.SlideLayout.TITLE_OUTLINE;
+			doc.newSlide(14, OdfSlide.SlideLayout.toString(outlineType), outlineType);
+			doc.newSlide(15, "Default", null);
+			int count = doc.getSlideCount();
+			Assert.assertTrue(16 == count);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc.newSlide(20, "Slide 20 new", OdfSlide.SlideLayout.BLANK);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "New.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for move the slide from one position to another, or copy a
+	 * specified slide and insert it to another specified position.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp
+	 * test\resources\performance\Presentation1.odp 
+	 * <b>Method</b> 1)Using OdfPresentationDocument.moveSlide(int current, int destination)
+	 * to move a slide at the current position to the destination position.
+	 * 2)OdfPresentationDocument.copySlide(int source, int dest, String newName)
+	 * is used to make a copy of the slide at a specified position to another
+	 * position in this presentation.
+	 * <b>Postcondition</b> Save the modified document at
+	 * SlideResultMoveAndCopy.odp
+	 * <b>Covered Element</b> 1) &lt;office:presentation&gt;,&lt;draw:page&gt;
+	 * 2) &lt;presentation:notes&gt; of each slide.
+	 * <b>Note</b> Each slide has its own notes page to show its notes view,
+	 * while the notes page has the "draw:page-number" attribute to show the notes view of which slide 
+	 * so when the slide is moved or copied, the index of this slide will be change, 
+	 * the notes page have to change the "draw:page-number" value.
+	 */
+	@Test
+	public void testMoveAndCopySlide() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			OdfSlide lastSlide = doc.getSlideByIndex(9);
+			OdfSlide firstSlide = doc.getSlideByIndex(0);
+
+			OdfSlide copyFirstToLastSlide = doc.copySlide(0, 10, firstSlide.getSlideName() + "(copy)");
+			Assert.assertTrue(10 == copyFirstToLastSlide.getSlideIndex());
+
+			OdfSlide copyLastToFirstSlide = doc.copySlide(9, 0, lastSlide.getSlideName() + "(copy)");
+			Assert.assertTrue(0 == copyLastToFirstSlide.getSlideIndex());
+
+			doc.moveSlide(11, 0);
+			doc.moveSlide(1, 12);
+			Assert.assertTrue(1 == firstSlide.getSlideIndex());
+			Assert.assertTrue(10 == lastSlide.getSlideIndex());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc.moveSlide(20, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.moveSlide(-1, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.copySlide(20, 0, "outofbounds");
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.copySlide(-1, 0, "outofbounds");
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "MoveAndCopy.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for copy a slide which comes from the other presentation
+	 * to the specified position of the current presentation.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp & test\resources\performance\Presentation2.odp
+	 * <b>Method</b> Using OdfPresentationDocument.copyForeignSlide(int
+	 * destIndex,OdfPresentationDocument srcDoc, int srcIndex) to copy a slide
+	 * which locates at "srcIndex" position of the "srcDoc" presentation
+	 * document and insert it to the current presentation document at "destIndex" position.
+	 * <b>Postcondition</b> Save the modified document at SlideResultCopyForeignSlide.odp
+	 * <b>Covered Element</b> 1) &lt;office:presentation&gt;,&lt;draw:page&gt;
+	 * 2) All the element that contains "xlink:href" attribute, such as &lt;draw:object&gt;, &lt;draw:image&gt;, etc.
+	 * 3) Each style definition element of &lt;draw:page&gt; and its all child elements
+	 * such as layout style, master page style, object style and text style
+	 * the style definition element must contain "style:name" or "draw:name" attribute, include 
+	 *         &lt;style:mater-page&gt;,&lt;style:page-layout&gt;,&lt;style:presentation-page-layout&gt;,
+	 *         &lt;style:style&gt;, &lt;text:list-style&gt;, &lt;number:time-style&gt;, &lt;number:date-style&gt;,
+	 *         &lt;number:boolean-style&gt;, &lt;number:number-style&gt;, &lt;number:currency-style&gt;,
+	 *         &lt;number:percentage-style&gt;, &lt;number:text-style&gt;, &lt;text:outline-style&gt;,&lt;style:font-face&gt;,
+	 * 4) the element which refer the style name, that is &lt;draw:page&gt; and all the child elements.
+	 * <b>Note</b> If the copied style/image/ole name is duplicated with destination presentation document,
+	 * the name definition element and reference element must be renamed then insert to the dest document.
+	 */
+	@Test
+	public void testCopyForeignSlide() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER));
+
+			// copy slide at index 2 of doc to the index 2 of doc2
+			int nEmbedDoc = doc2.loadSubDocuments().size();
+			String embedDocName = "Object 3/";
+			OdfFileEntry fileEntry = doc2.getPackage().getFileEntry(embedDocName);
+			Assert.assertNull(fileEntry);
+			OdfSlide newPage1 = doc2.copyForeignSlide(2, doc, 2);
+			Assert.assertTrue(2 == newPage1.getSlideIndex());
+			// slide at index 2 of doc contains an embedded document called
+			// "Object 3"
+			OdfDocument embedDoc = doc2.loadSubDocument(embedDocName);
+			Assert.assertNotNull(embedDoc);
+			int size = doc2.loadSubDocuments().size();
+			Assert.assertTrue(size == (nEmbedDoc + 1));
+			// the copied slide also have an bitmap background, and the image bullet
+			// they should all be copied
+			String BACKGROUND_IMAGE_NAME = "Pictures/1000000000000C80000004009305DCA3.jpg";
+			String BULLET_IMAGE_NAME = "Pictures/10000000000002580000018FB151A5C8.jpg";
+			InputStream backgroundImage = doc2.getPackage().getInputStream(BACKGROUND_IMAGE_NAME);
+			Assert.assertNotNull(backgroundImage);
+			// copy the slide at index 2 of doc to the end of doc2
+			OdfSlide newPage2 = doc2.copyForeignSlide(101, doc, 2);
+			Assert.assertNotNull(doc2.getPackage().getFileEntry(BULLET_IMAGE_NAME));
+			Assert.assertFalse(newPage1.getSlideName().equals(newPage2.getSlideName()));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		try {
+			doc2.copyForeignSlide(200, doc, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc2.copyForeignSlide(-1, doc, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "CopyForeignSlide2.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for appending all the slide of one presentation to the end of
+	 * another presentation.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp & test\resources\performance\Presentation2.odp
+	 * <b>Method</b> Using OdfPresentationDocument.appendPresentation(OdfPresentationDocument aDoc)
+	 * to append the specified presentation to the current presentation.
+	 * <b>Postcondition</b> Save the modified document at SlideResultMerge.odp
+	 * <b>Covered Element</b> 
+	 * Same with <code>CopyForeignSlide</code> method,
+	 * except that it covers all the slide element of the document,rather than specific slide.
+	 * <b>Note</b> 1)You'd better check the generated document to look at if there are any object/style is lost.
+	 * 2) The generated file size will be larger than we append by using OpenOffice/Symphony,
+	 * that is because the styles and images from the different document might have the same content,
+	 * but I still append them rather than use one copy,
+	 * because compare the odf element content and the image stream might cost much time.
+	 */
+	@Test
+	public void testAppendPresentation() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER));
+			int slideCount = doc.getSlideCount();
+			int slideCount2 = doc2.getSlideCount();
+			//doc, doc2 both have the embed document named "Object 2"
+			//with different content, so after appendPresentation,
+			//the embedded doc "Object 2" of doc will be renamed
+			String EMBEDDOC_NAME = "Object 2";
+			Assert.assertNotNull(doc.loadSubDocument(EMBEDDOC_NAME));
+			Assert.assertNotNull(doc2.loadSubDocument(EMBEDDOC_NAME));
+			doc2.appendPresentation(doc);
+			Assert.assertTrue((slideCount + slideCount2) == doc2.getSlideCount());
+			//slide at index 3 of doc contains "Object 2", "Object 6"
+			//after appendPresentation, let's check the slide at index 103 of merged document
+			//which is corresponding to the slide at index 3 of doc
+			OdfSlide slide = doc2.getSlideByIndex(103);
+			DrawPageElement slideEle = slide.getOdfElement();
+			NodeList objectList = slideEle.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "object");
+			Assert.assertTrue(objectList.getLength() == 2);
+			DrawObjectElement object1 = (DrawObjectElement) objectList.item(0);
+			String linkPath = object1.getXlinkHrefAttribute();
+			Assert.assertTrue(linkPath.startsWith("./Object 2") && !linkPath.equals("./Object 2"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Merge2.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testAnotherMergeDoc() {
+		try {
+			doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN));
+			doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER));
+			doc.appendPresentation(doc2);
+			Assert.assertTrue(doc.getSlideCount() == 110);
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Merge1.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for merge the three presentation document
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at test\resources\performance\SlideTest1.odp, 
+	 * 	 test\resources\performance\SlideTest2.odp and test\resources\performance\SlideTest3.odp
+	 * <b>Method</b> copy the slide from SlideTest2.odp and SlideTest3.odp to SlideTest1.odp
+	 * <b>Postcondition</b> Save the modified document at SlideResultCopyThreeDoc.odp
+	 * <b>Notice</b> 
+	 * This test case is used to show that the style name can be renamed if they define the different style.
+	 */
+	@Test
+	public void testCopyThreeDoc() {
+		try {
+			//testdoc1 contain "dp1" for draw page style
+			OdfPresentationDocument testdoc1 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_DOCUMENT1));
+			//testdoc1 contain "dp1" for draw page style
+			OdfPresentationDocument testdoc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_DOCUMENT2));
+			//testdoc1 contain "dp1" for draw page style
+			OdfPresentationDocument testdoc3 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_DOCUMENT3));
+			testdoc1.copyForeignSlide(1, testdoc2, 0);
+			testdoc1.copyForeignSlide(2, testdoc3, 0);
+			//after copy foreign slide, the each slide should has its own draw page style
+			DrawPageElement slide1 = testdoc1.getSlideByIndex(0).getOdfElement();
+			DrawPageElement slide2 = testdoc1.getSlideByIndex(1).getOdfElement();
+			DrawPageElement slide3 = testdoc1.getSlideByIndex(2).getOdfElement();
+			String slideStyle1 = slide1.getDrawNameAttribute();
+			String slideStyle2 = slide2.getDrawNameAttribute();
+			String slideStyle3 = slide3.getDrawNameAttribute();
+			LOG.info(slideStyle1);
+			LOG.info(slideStyle2);
+			LOG.info(slideStyle3);
+			testdoc1.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "CopyThreeDoc.odp"));
+			Assert.assertNotSame(slideStyle1, slideStyle2);
+			Assert.assertNotSame(slideStyle2, slideStyle3);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/SpreadsheetTemplateTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/SpreadsheetTemplateTest.java
new file mode 100644
index 0000000..dd49f88
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/SpreadsheetTemplateTest.java
@@ -0,0 +1,79 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of calc documents.
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class SpreadsheetTemplateTest {
+
+	private static final String TEST_SPREADSHEET_TEMPLATE = "/spreadsheetTestTemplate.ots";
+
+	@Test
+	public void testLoadingASpreadsheetTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_SPREADSHEET_TEMPLATE));
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingASpreadsheetTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_SPREADSHEET_TEMPLATE));
+		File destination = File.createTempFile("odfdom-test", ".ots");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewSpreadsheetTemplate() throws Exception {
+		OdfDocument document = OdfSpreadsheetDocument.newSpreadsheetTemplateDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("odfdom-test", ".ots");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfSpreadsheetDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfSpreadsheetDocument() throws Exception {
+		OdfSpreadsheetDocument document = OdfSpreadsheetDocument.newSpreadsheetDocument();
+		document.changeMode(OdfSpreadsheetDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = OdfSpreadsheetDocument.newSpreadsheetTemplateDocument();
+		document.changeMode(OdfSpreadsheetDocument.OdfMediaType.SPREADSHEET);
+		Assert.assertEquals(OdfDocument.OdfMediaType.SPREADSHEET.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/StyleManipulationTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/StyleManipulationTest.java
new file mode 100644
index 0000000..4faf1d8
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/StyleManipulationTest.java
@@ -0,0 +1,64 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+public class StyleManipulationTest {
+
+    private static final String SOURCE = "empty.odt";
+    private static final String TARGET = "stylemanipulationtest.odt";
+    
+    public StyleManipulationTest() {}
+
+    @Test
+    public void testLoadSave() {
+        try {
+            OdfDocument odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE));
+            OdfOfficeStyles styles = odfDocument.getDocumentStyles();
+            Assert.assertNotNull(styles);
+            OdfStyle standardStyle = styles.getStyle("Standard", OdfStyleFamily.Paragraph);
+            standardStyle.setProperty(StyleParagraphPropertiesElement.MarginLeft, "4711");
+            odfDocument.save(ResourceUtilities.newTestOutputFile(TARGET));
+            odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TARGET));
+            styles = odfDocument.getDocumentStyles();
+            standardStyle = styles.getStyle("Standard", OdfStyleFamily.Paragraph);
+            String marginLeft = standardStyle.getProperty(StyleParagraphPropertiesElement.MarginLeft);
+            
+            Assert.assertTrue(marginLeft != null && marginLeft.equals("4711"));
+        } catch (Exception e) {
+            Logger.getLogger(StyleManipulationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }        
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/StyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/StyleTest.java
new file mode 100644
index 0000000..3e0d9cd
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/StyleTest.java
@@ -0,0 +1,295 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleBackgroundImageElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleChartPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTabStopElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTabStopsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class StyleTest {
+
+    public StyleTest() {
+    }
+
+    @Test
+    public void testStyleOrdering() {
+        try {
+            OdfDocument doc = OdfTextDocument.newTextDocument();
+            OdfFileDom dom = doc.getContentDom();
+
+            // 1. different # of attributes
+            OdfStyle style1 = new OdfStyle(dom);
+            style1.setStyleFamilyAttribute(OdfStyleFamily.Paragraph.toString());
+
+            OdfStyle style2 = new OdfStyle(dom);
+            style2.setStyleFamilyAttribute(OdfStyleFamily.Paragraph.toString());
+            style2.setStyleNextStyleNameAttribute("nextStyle");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 2. same # of attributes, different attributes
+            style1.setStyleDisplayNameAttribute("displayName");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 3. same # of attributes, same attributes, different values
+            style1.setStyleNextStyleNameAttribute("nextStyle");
+            style2.setStyleNextStyleNameAttribute("xnextStyle");
+            style2.setStyleDisplayNameAttribute("displayName");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 4. same # of attributes, same attributes, same values, different
+            // number of children
+            style2.setStyleNextStyleNameAttribute("nextStyle");
+            style2.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+            style2.setProperty(StyleParagraphPropertiesElement.TextAlign, "left");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 5. same # of attributes, same attributes, same values, same number
+            // of children, different number of properties
+            style1.setProperty(StyleChartPropertiesElement.DataLabelNumber, "value");
+            style1.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+            style1.setProperty(StyleParagraphPropertiesElement.TextAlign, "left");
+            style2.setProperty(StyleParagraphPropertiesElement.KeepTogether, "auto");
+            style2.setProperty(StyleChartPropertiesElement.DataLabelNumber, "value");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 6. same # of attributes, same attributes, same values, same number
+            // of children, same number of properties, different properties:
+            style1.setProperty(StyleParagraphPropertiesElement.AutoTextIndent, "true");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 7. same # of attributes, same attributes, same values, same number
+            // of children, same number of properties, same properties, different
+            // values:
+            style2.setProperty(StyleParagraphPropertiesElement.AutoTextIndent, "true");
+            style1.setProperty(StyleParagraphPropertiesElement.KeepTogether, "always");
+            Assert.assertTrue(style2.compareTo(style1) > 0);
+
+            // 8. same # of attributes, same attributes, same values, same number
+            // of children, same number of properties, same properties, same
+            // values:
+            style1.setProperty(StyleParagraphPropertiesElement.KeepTogether, "auto");
+            Assert.assertTrue(style2.compareTo(style1) == 0);
+
+            // 9. tab stops vs background image
+            StyleTabStopsElement tabStops = (StyleTabStopsElement) OdfXMLFactory.newOdfElement(dom, StyleTabStopsElement.ELEMENT_NAME);
+            StyleTabStopElement tabStop1 = (StyleTabStopElement) OdfXMLFactory.newOdfElement(dom, StyleTabStopElement.ELEMENT_NAME);
+            StyleTabStopElement tabStop2 = (StyleTabStopElement) OdfXMLFactory.newOdfElement(dom, StyleTabStopElement.ELEMENT_NAME);
+            OdfStylePropertiesBase propElement = style1.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+            propElement.appendChild(tabStops);
+            tabStops.appendChild(tabStop1);
+            tabStops.appendChild(tabStop2);
+            StyleBackgroundImageElement img = (StyleBackgroundImageElement) OdfXMLFactory.newOdfElement(dom, StyleBackgroundImageElement.ELEMENT_NAME);
+            propElement = style2.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+            propElement.appendChild(img);
+            Assert.assertTrue(style2.compareTo(style1) < 0);
+
+            // 10. Same tab stops and background image, different position:
+            // These two styles are considered distinct!
+            tabStops = (StyleTabStopsElement) OdfXMLFactory.newOdfElement(dom, StyleTabStopsElement.ELEMENT_NAME);
+            tabStop1 = (StyleTabStopElement) OdfXMLFactory.newOdfElement(dom, StyleTabStopElement.ELEMENT_NAME);
+            tabStop2 = (StyleTabStopElement) OdfXMLFactory.newOdfElement(dom, StyleTabStopElement.ELEMENT_NAME);
+            propElement = style2.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+            propElement.appendChild(tabStops);
+            tabStops.appendChild(tabStop1);
+            tabStops.appendChild(tabStop2);
+            img = (StyleBackgroundImageElement) OdfXMLFactory.newOdfElement(dom, StyleBackgroundImageElement.ELEMENT_NAME);
+            propElement = style1.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+            propElement.appendChild(img);
+            Assert.assertTrue(style2.compareTo(style1) < 0);
+
+        } catch (Exception e) {
+            Logger.getLogger(StyleTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+        }
+    }
+
+    @Test
+    public void testAutomaticStylesOptimize() {
+        try {
+            OdfDocument doc = OdfTextDocument.newTextDocument();
+            OdfFileDom dom = doc.getContentDom();
+
+            OdfTextParagraph para1 = (OdfTextParagraph) OdfXMLFactory.newOdfElement(dom, OdfTextParagraph.ELEMENT_NAME);
+            para1.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+            para1.setProperty(StyleParagraphPropertiesElement.TextAlign, "left");
+            para1.setProperty(StyleChartPropertiesElement.DataLabelNumber, "value");
+
+            OdfTextParagraph para2 = (OdfTextParagraph) OdfXMLFactory.newOdfElement(dom, OdfTextParagraph.ELEMENT_NAME);
+            para2.setProperty(StyleChartPropertiesElement.DataLabelNumber, "value");
+            para2.setProperty(StyleParagraphPropertiesElement.TextAlign, "left");
+            para2.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+
+            StyleStyleElement style1 = para1.getAutomaticStyle();
+            StyleStyleElement style2 = para2.getAutomaticStyle();
+
+            String styleName1 = para1.getStyleName();
+            String styleName2 = para2.getStyleName();
+
+            Assert.assertFalse(styleName1.equals(styleName2));
+            Assert.assertTrue(style1.getStyleUserCount() == 1);
+            Assert.assertTrue(style2.getStyleUserCount() == 1);
+
+            OdfOfficeAutomaticStyles autoStyles = para1.getAutomaticStyles();
+
+            Iterator<OdfStyle> iter = autoStyles.getStylesForFamily(OdfStyleFamily.Paragraph).iterator();
+            int count = 0;
+            while (iter.hasNext()) {
+                iter.next();
+                ++count;
+            }
+
+            Assert.assertTrue(count == 2);
+
+            // optimize should automatically remove one style:
+            autoStyles.optimize();
+
+            iter = autoStyles.getStylesForFamily(OdfStyleFamily.Paragraph).iterator();
+            count = 0;
+            while (iter.hasNext()) {
+                iter.next();
+                ++count;
+            }
+
+            Assert.assertTrue(count == 1);
+
+            style1 = para1.getAutomaticStyle();
+            style2 = para2.getAutomaticStyle();
+
+            Assert.assertTrue(style1 == style2);
+            Assert.assertTrue(style1.getStyleUserCount() == 2);
+        } catch (Exception e) {
+            Logger.getLogger(StyleTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+        }
+    }
+
+    @Test
+    public void testPropertyInheritance() {
+        try {
+            OdfDocument doc = OdfTextDocument.newTextDocument();
+
+            OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+
+            OdfDefaultStyle def = styles.getOrCreateDefaultStyle(OdfStyleFamily.Paragraph);
+            def.setProperty(StyleTextPropertiesElement.TextUnderlineColor, "#00FF00");
+
+            OdfStyle parent = styles.newStyle("TheParent", OdfStyleFamily.Paragraph);
+            parent.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+            parent.setProperty(StyleTextPropertiesElement.Color, "#FF0000");
+
+            OdfStyle child = styles.newStyle("TheChild", OdfStyleFamily.Paragraph);
+            child.setStyleParentStyleNameAttribute(parent.getStyleNameAttribute());
+
+            Assert.assertEquals("17pt", child.getProperty(StyleTextPropertiesElement.FontSize));
+            Assert.assertEquals("#FF0000", child.getProperty(StyleTextPropertiesElement.Color));
+            Assert.assertEquals("#00FF00", child.getProperty(StyleTextPropertiesElement.TextUnderlineColor));
+
+        } catch (Exception e) {
+            Logger.getLogger(StyleTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+        }
+    }
+
+//    /**
+//     * Test included to reproduce bug29, which was rolled back due to performance problems!!
+//     *
+//     */
+//    @Test
+//    public void testAutomaticStyleRename() {
+//        try {
+//            OdfDocument doc = OdfTextDocument.newTextDocument();
+//            OdfFileDom dom = doc.getContentDom();
+//
+//            OdfOfficeAutomaticStyles autoStyles = new OdfOfficeAutomaticStyles(dom);
+//            OdfStyle paraStyle = autoStyles.newStyle(OdfStyleFamily.Paragraph);
+//
+//            paraStyle.setStyleNameAttribute("newName");
+//            OdfStyle newStyle = autoStyles.getStyle("newName", OdfStyleFamily.Paragraph);
+//
+//            Assert.assertNotNull(newStyle);
+//            Assert.assertSame(paraStyle, newStyle);
+//
+//            autoStyles.optimize();
+//            newStyle = autoStyles.getStyle("newName", OdfStyleFamily.Paragraph);
+//            // unused style removed
+//            Assert.assertNull(newStyle);
+//
+//            // new style created
+//            OdfStyle style = autoStyles.newStyle(OdfStyleFamily.Paragraph);
+//            style.setStyleNameAttribute("newName1");
+//            OdfStyle style2 = autoStyles.newStyle(OdfStyleFamily.Paragraph);
+//            style2.setStyleNameAttribute("newName2");
+//
+//            autoStyles.removeChild(style2);
+//            OdfStyle style3 = autoStyles.getStyle("newName1", OdfStyleFamily.Paragraph);
+//            // assert the correct style was removed
+//            Assert.assertNotNull(style3);
+//        } catch (Exception ex) {
+//            Logger.getLogger(StyleTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+//            Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+//        }
+//    }
+
+    /**
+     * Setting style property on an automatic style, which occurs on multiple
+     * elements and does not have a style parent results in an error (Bug 124).
+     */
+    @Test
+    public void testAutomaticStyleSharing() {
+        try {
+            OdfDocument odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("sharedautostyles.odt"));
+            OdfFileDom dom = odfDocument.getContentDom();
+
+            NodeList lst = dom.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+            Assert.assertTrue(lst.getLength() == 2);
+
+            OdfTextParagraph p = (OdfTextParagraph)lst.item(0);
+            p.setProperty(StyleTextPropertiesElement.FontSize, "17pt");
+        } catch (Exception ex) {
+        	Logger.getLogger(StyleTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+            Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java
new file mode 100644
index 0000000..6f6ed4e
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java
@@ -0,0 +1,136 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.table.OdfTable;
+import org.odftoolkit.odfdom.doc.table.OdfTableCell;
+import org.odftoolkit.odfdom.doc.table.OdfTableRow;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class TableTest {
+
+	private static final String TEST_FILE_SAVE_2TABLES_OUT = "TestSave2Tables.odt";
+
+	public TableTest() {
+	}
+
+	@Test
+	public void testTable() {
+		try {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("table.odt"));
+			NodeList lst = odfdoc.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table");
+			int tscount = 0;
+			for (int i = 0; i < lst.getLength(); i++) {
+				Node node = lst.item(i);
+				Assert.assertTrue(node instanceof TableTableElement);
+				TableTableElement te = (TableTableElement) lst.item(i);
+
+				OdfStyle ds = te.getDocumentStyle();
+				Assert.assertNull(ds);
+
+				if (te.hasAutomaticStyle()) {
+					te.getAutomaticStyle();
+					tscount++;
+				}
+			}
+			Assert.assertTrue(tscount > 0);
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCellsAndRows() {
+		try {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("table.odt"));
+			NodeList lst = odfdoc.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-cell");
+			for (int i = 0; i < lst.getLength(); i++) {
+				Node node = lst.item(i);
+				Assert.assertTrue(node instanceof TableTableCellElement);
+				TableTableCellElement td = (TableTableCellElement) lst.item(i);
+				TableTableRowElement tr = (TableTableRowElement) td.getParentNode();
+				Assert.assertNotNull(tr);
+
+				OdfTable table = OdfTableRow.getInstance(tr).getTable();
+				Assert.assertNotNull(table);
+				Assert.assertTrue(table == OdfTableCell.getInstance(td).getTable());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void create2ndTableTab() throws Exception {
+		OdfSpreadsheetDocument mysheet = OdfSpreadsheetDocument.newSpreadsheetDocument();
+		OdfFileDom odt = mysheet.getContentDom();
+
+		// find the first table in the sheet
+		NodeList lst =
+				odt.getElementsByTagNameNS(TableTableElement.ELEMENT_NAME.getUri(), TableTableElement.ELEMENT_NAME.getLocalName());
+		TableTableElement mytable = (TableTableElement) lst.item(0);
+		mytable.setTableNameAttribute("Cars Sheet");
+
+		// remove first empty row of table.
+		mytable.removeChild(mytable.getFirstChild().getNextSibling());
+
+		TableTableRowElement row = (TableTableRowElement) mytable.appendChild(new TableTableRowElement(odt));
+		TableTableCellElement cell = (TableTableCellElement) row.appendChild(new TableTableCellElement(odt));
+
+		OdfTextParagraph p = new OdfTextParagraph(odt);
+		p.appendChild(odt.createTextNode("Corvette"));
+		cell.appendChild(p);
+
+		// 2nd Table
+		TableTableElement my2table = new TableTableElement(odt);
+
+		Element spreadsheetElement = (Element) odt.getElementsByTagNameNS(OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+		my2table.setAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "table:name", "BikesSheet");
+		spreadsheetElement.appendChild(my2table);
+
+		TableTableRowElement row2 = (TableTableRowElement) my2table.appendChild(new TableTableRowElement(odt));
+		TableTableCellElement cell2 = (TableTableCellElement) row2.appendChild(new TableTableCellElement(odt));
+
+		OdfTextParagraph p2 = new OdfTextParagraph(odt);
+		p2.appendChild(odt.createTextNode("Bandit 600"));
+		cell2.appendChild(p2);
+
+		mysheet.save(ResourceUtilities.getTestOutput(TEST_FILE_SAVE_2TABLES_OUT));
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TextTemplateTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TextTemplateTest.java
new file mode 100644
index 0000000..1039f02
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TextTemplateTest.java
@@ -0,0 +1,141 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.doc;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of calc documents.
+ * 
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class TextTemplateTest {
+
+	private static final String TEST_TEXT_TEMPLATE = "/textTestTemplate.ott";
+
+	@Test
+	public void testLoadingATextTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_TEXT_TEMPLATE));
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingATextTemplate() throws Exception {
+		OdfDocument document = OdfDocument.loadDocument(this.getClass().getResourceAsStream(TEST_TEXT_TEMPLATE));
+		File destination = File.createTempFile("odfdom-test", ".ott");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewTextTemplate() throws Exception {
+		OdfDocument document = OdfTextDocument.newTextTemplateDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("odfdom-test", ".ott");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfTextDocument);
+	}
+
+	@Test
+	public void testNewTextMaster() throws Exception {
+		OdfDocument document = OdfTextDocument.newTextMasterDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_MASTER.getMediaTypeString(),
+				document.getMediaTypeString());
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_MASTER.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("odfdom-test", ".ott");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_MASTER.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfTextDocument);
+	}
+
+	@Test
+	public void testNewTextWeb() throws Exception {
+		OdfDocument document = OdfTextDocument.newTextWebDocument();
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_WEB.getMediaTypeString(),
+				document.getMediaTypeString());
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_WEB.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("odfdom-test", ".ott");
+		document.save(destination);
+
+		// load again
+		OdfDocument loadedDocument = OdfDocument.loadDocument(destination);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_WEB.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof OdfTextDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfTextDocument() throws Exception {
+		OdfTextDocument document = OdfTextDocument.newTextDocument();
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_WEB);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_WEB.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_MASTER);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_MASTER.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = OdfTextDocument.newTextTemplateDocument();
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_MASTER);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_MASTER.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_WEB);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_WEB.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = OdfTextDocument.newTextMasterDocument();
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_WEB);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_WEB.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = OdfTextDocument.newTextWebDocument();
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_TEMPLATE);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(OdfTextDocument.OdfMediaType.TEXT_MASTER);
+		Assert.assertEquals(OdfDocument.OdfMediaType.TEXT_MASTER.getMediaTypeString(), document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/UnknownPropertiesTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/UnknownPropertiesTest.java
new file mode 100644
index 0000000..91d655b
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/UnknownPropertiesTest.java
@@ -0,0 +1,81 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleTabStopElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTabStopsElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class UnknownPropertiesTest {
+
+    private static final String SOURCE = "unknown_properties.odt";
+    private static final String TARGET = "unknown_properties_saved.odt";
+
+    public UnknownPropertiesTest() {
+    }
+
+    @Test
+    public void unknownPropertiesTest() {
+        try {
+            for (int i = 0; i < 2; ++i) {
+                OdfDocument odfDocument = i == 0 ? OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE)) : OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TARGET));
+
+                Document odfContent = odfDocument.getContentDom();
+                NodeList lst = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+                Node node = lst.item(0);
+                OdfTextParagraph para = (OdfTextParagraph) node;
+                OdfStyleBase paraLocalStyle = para.getAutomaticStyle();
+
+                OdfStylePropertiesBase paraProperties = paraLocalStyle.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+
+                StyleTabStopsElement tabstops = OdfElement.findFirstChildNode(StyleTabStopsElement.class, paraProperties );
+                Assert.assertNotNull(tabstops);
+
+                StyleTabStopElement tabstop = OdfElement.findFirstChildNode(StyleTabStopElement.class, tabstops);
+                Assert.assertNotNull(tabstop);
+
+                Assert.assertEquals(tabstop.getStylePositionAttribute().toString(), "7.643cm");
+
+                if (i == 0) {
+                    odfDocument.save(ResourceUtilities.newTestOutputFile(TARGET));
+                }
+            }
+        } catch (Exception e) {
+            Logger.getLogger(UnknownPropertiesTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/draw/OdfDrawImageTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/draw/OdfDrawImageTest.java
new file mode 100644
index 0000000..5022244
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/draw/OdfDrawImageTest.java
@@ -0,0 +1,82 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.odftoolkit.odfdom.doc.draw;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileInputStream;
+import java.net.URI;
+import java.util.logging.Logger;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ *
+ * @author hs234750
+ */
+public class OdfDrawImageTest {
+
+	private static final Logger LOG = Logger.getLogger(OdfDrawImageTest.class.getName());
+
+	/**
+	 * Test of newImage method, of class OdfDrawImage.
+	 */
+	@Test
+	public void testInsertImage_URI() throws Exception {
+		LOG.info("insertImage from URI");
+		OdfTextDocument odt = OdfTextDocument.newTextDocument();
+		OdfTextParagraph para = (OdfTextParagraph) odt.getContentRoot().newTextPElement();
+		OdfDrawFrame frame = (OdfDrawFrame) para.newDrawFrameElement();
+		OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
+		String packagePath = image.newImage(ResourceUtilities.getURI("testA.jpg"));
+		assertEquals(image.getXlinkTypeAttribute(), "simple");
+		LOG.info(frame.getSvgWidthAttribute());
+		LOG.info(frame.getSvgHeightAttribute());
+		assert (frame.getSvgWidthAttribute().startsWith("19.") && frame.getSvgWidthAttribute().endsWith("cm"));
+		assert (frame.getSvgHeightAttribute().startsWith("6.") && frame.getSvgHeightAttribute().endsWith("cm"));
+		assertEquals(odt.getPackage().getFileEntry(packagePath).getMediaTypeString(), "image/jpeg");
+	}
+
+	/**
+	 * Test of newImage method, of class OdfDrawImage.
+	 */
+	@Test
+	public void testInsertImage_InputStream() throws Exception {
+		LOG.info("insertImage from InputStream");
+		OdfTextDocument odt = OdfTextDocument.newTextDocument();
+		OdfTextParagraph para = (OdfTextParagraph) odt.getContentRoot().newTextPElement();
+		OdfDrawFrame frame = (OdfDrawFrame) para.newDrawFrameElement();
+		OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
+		String packagePath = "Pictures/myChosenImageName.jpg";
+		String mediaType = "image/jpeg";
+		image.newImage(new FileInputStream(ResourceUtilities.getAbsolutePath("testA.jpg")), packagePath, mediaType);
+		assertEquals(image.getXlinkTypeAttribute(), "simple");
+		assert (frame.getSvgWidthAttribute().startsWith("19.") && frame.getSvgWidthAttribute().endsWith("cm"));
+		assert (frame.getSvgHeightAttribute().startsWith("6.") && frame.getSvgHeightAttribute().endsWith("cm"));
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfCurrencyStyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfCurrencyStyleTest.java
new file mode 100644
index 0000000..5b728fe
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfCurrencyStyleTest.java
@@ -0,0 +1,339 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.number;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencySymbolElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ *
+ * @author J David Eisenberg
+ */
+public class OdfCurrencyStyleTest {
+	OdfSpreadsheetDocument doc;
+	OdfFileDom dom;
+	private static final Logger LOG = Logger.getLogger(OdfCurrencyStyleTest.class.getName());
+    public OdfCurrencyStyleTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	/**
+	 * Test of buildFromFormat method, of class OdfCurrencyStyle.
+	 */
+	@Test
+	public void testBuildFromFormat() {
+		String[] formatTest = {
+			"$US#,##0.00",
+			"cr$US##0.00",
+			"## $US",
+			"##0 \u03b4\u03c1\u03c7", // Greek drachma
+			"cr#,##0.00 $US"
+		};
+
+		String[] getFormatExpected = {
+				"$US#,##0.00",
+				"cr$US#0.00",
+				"# $US",
+				"#0 \u03b4\u03c1\u03c7", // Greek drachma
+				"cr#,##0.00 $US"
+		};
+
+		String[] currencySymbol = { "$", "$", "$", "\u03b4\u03c1\u03c7", "$" };
+
+		/*
+		 * Expected elements.
+         * t -- <number:text> with following text
+         * n -- <number:number> with minimum digits, decimal places,
+         *      and grouping (T or F)
+         * c -- <number:currency-symbol> with the symbol text
+		 */
+        String[][] expected = {
+			{"c$","tUS","n12T" }, // $US#,##0.00
+			{"tcr", "c$", "tUS", "n12F"}, // cr$US##0.00
+			{"n00F", "t ", "c$", "tUS"}, // ## $US
+			{"n10F", "t ", "c\u03b4\u03c1\u03c7"}, // ##0 \u03b4\u03c1\u03c7
+			{"tcr", "n12T", "t ", "c$", "tUS"} //cr#,##0.00 $US
+		};
+
+		LOG.info("buildFromFormat");
+		OdfNumberCurrencyStyle instance = null;
+		Node node;
+		char expectedType;
+		String expectedValue;
+
+		for (int i = 0; i < formatTest.length; i++)
+		{
+			LOG.info("Currency format: " + formatTest[i]);
+			instance = new OdfNumberCurrencyStyle(dom,
+				currencySymbol[i], formatTest[i], "fstyle");
+			Assert.assertNotNull(instance);
+
+			node = instance.getFirstChild();
+
+			for (int j = 0; j < expected[i].length; j++)
+			{
+				expectedType = expected[i][j].charAt(0);
+				expectedValue = expected[i][j].substring(1);
+				switch (expectedType)
+				{
+					case 't':
+						checkNumberText("text", expectedValue, node);
+						break;
+					case 'c':
+						checkCurrency(expectedValue, node);
+						break;
+					case 'n':
+						checkNumberFormat(expectedValue, node);
+						break;
+				}
+				node = node.getNextSibling();
+			}
+			Assert.assertEquals(getFormatExpected[i], instance.getFormat());
+		}
+	}
+
+	/**
+	 * Check that the node is an element with the given name
+	 * with the expected text content.
+	 * @param elementName expected element name (in number: namespace)
+	 * @param expected expected text content
+	 * @param node the Node to be examined
+	 */
+	private void checkNumberText(String elementName, String expected, Node node)
+	{
+		Node childNode;
+
+		// Check for <number:elementName> with expected content
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.NUMBER.getUri(),
+			node.getNamespaceURI());
+		Assert.assertEquals(elementName, node.getLocalName());
+		childNode = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, childNode.getNodeType());
+		Assert.assertEquals(expected, childNode.getNodeValue());
+	}
+
+	/**
+	 * Check to see that the node is <code>&lt;number:number&gt;</code> and
+	 * meets the expected specifications.
+	 *
+	 * The expected specifications is a string of three characters:
+	 * min # of digits, # of decimal places, grouped (T/F)
+	 * @param expected expected specification for <code>&lt;number:number&gt;</code>
+	 * @param node the node to be validated
+	 */
+	private void checkNumberFormat(String expected, Node node)
+	{
+		int nDigits = Integer.parseInt(expected.substring(0,1));
+		int nDecimals = Integer.parseInt(expected.substring(1,2));
+		boolean grouped = (expected.charAt(2) == 'T');
+		boolean nodeGrouped;
+		NumberNumberElement number;
+
+		Assert.assertTrue("node is NumberNmberElement", node instanceof NumberNumberElement);
+		number = (NumberNumberElement) node;
+
+		// check number of digits and decimals
+		Assert.assertEquals(nDigits, (long) number.getNumberMinIntegerDigitsAttribute());
+
+		if (nDecimals > 0)
+		{
+			Assert.assertEquals(nDecimals, (long)number.getNumberDecimalPlacesAttribute());
+		}
+
+		// check if grouping is set properly
+		nodeGrouped = (number.getNumberGroupingAttribute() == null) ? 
+			false :
+			number.getNumberGroupingAttribute().booleanValue();
+		Assert.assertTrue("Grouping", grouped == nodeGrouped);
+	}
+
+	/**
+	 * Check that a <code>&lt;number:currency-symbol&gt;</code> element
+	 * meets specifications.
+	 *
+	 * @param expected a string giving the currency symbol
+	 * @param node the node to be validated
+	 */
+	private void checkCurrency(String expected, Node node)
+	{
+		Assert.assertTrue("node is currency symbol", node instanceof
+			NumberCurrencySymbolElement);
+		checkNumberText("currency-symbol", expected, node);
+	}
+
+	/**
+	 * Test of getCurrencySymbolElement method, of class OdfNumberNumberCurrencyStyle.
+	 */
+	@Test
+	public void testGetCurrencySymbolElement() {
+		LOG.info("getCurrencySymbolElement");
+		OdfNumberCurrencyStyle instance = new OdfNumberCurrencyStyle(dom,
+			"$", "$#,##0.00", "cstyle");
+		NumberCurrencySymbolElement expResult = new NumberCurrencySymbolElement(dom);
+		expResult.setTextContent("$");
+		NumberCurrencySymbolElement result = instance.getCurrencySymbolElement();
+		Assert.assertEquals(expResult.getTextContent(),
+			result.getTextContent());
+	}
+
+	/**
+	 * Test of setCurrencyLocale method, of class OdfNumberCurrencyStyle.
+	 */
+	@Test
+	public void testSetCurrencyLocale_String_String() {
+		LOG.info("setCurrencyLocale");
+		String language = "ko";
+		String country = "KR";
+		OdfNumberCurrencyStyle instance = new OdfNumberCurrencyStyle(dom,
+			"\u20a9", "\u20a9#,##0.00", "kstyle"); // korean Won
+		NumberCurrencySymbolElement cSymbol;
+		instance.setCurrencyLocale(language,
+			country);
+		NodeList list = instance.getElementsByTagNameNS(
+			OdfDocumentNamespace.NUMBER.getUri(), "currency-symbol");
+		Assert.assertTrue("Has currency symbol", list.getLength() > 0);
+		cSymbol = (NumberCurrencySymbolElement) list.item(0);
+		Assert.assertEquals(language, cSymbol.getNumberLanguageAttribute());
+		Assert.assertEquals(country, cSymbol.getNumberCountryAttribute());
+	}
+
+	/**
+	 * Test of setCurrencyLocale method, of class OdfNumberCurrencyStyle.
+	 */
+	@Test
+	public void testSetCurrencyLocale_String() {
+		LOG.info("setCurrencyLocale");
+		String locale = "ko-KR";
+		String language = "ko";
+		String country = "KR";
+		NumberCurrencySymbolElement cSymbol;
+		NodeList list;
+
+		// first, test setting with a combined language/country
+		OdfNumberCurrencyStyle instance = new OdfNumberCurrencyStyle(dom,
+			"\u20a9", "\u20a9#,##0.00", "kstyle");
+		instance.setCurrencyLocale(locale);
+		list = instance.getElementsByTagNameNS(
+			OdfDocumentNamespace.NUMBER.getUri(), "currency-symbol");
+		Assert.assertTrue("Has currency symbol", list.getLength() > 0);
+		cSymbol = (NumberCurrencySymbolElement) list.item(0);
+		Assert.assertEquals(language, cSymbol.getNumberLanguageAttribute());
+		Assert.assertEquals(country, cSymbol.getNumberCountryAttribute());
+
+		// then, a language only
+		instance = new OdfNumberCurrencyStyle(dom,
+			"\u20a9", "\u20a9#,##0.00", "kstyle");
+		instance.setCurrencyLocale(language);
+		list = instance.getElementsByTagNameNS(
+			OdfDocumentNamespace.NUMBER.getUri(), "currency-symbol");
+		Assert.assertTrue("Has currency symbol", list.getLength() > 0);
+		cSymbol = (NumberCurrencySymbolElement) list.item(0);
+		Assert.assertEquals(language, cSymbol.getNumberLanguageAttribute());
+
+	}
+
+	/**
+	 * Test of setMapPositive method, of class OdfNumberCurrencyStyle.
+	 */
+	@Test
+	public void testSetMapPositive() {
+		Node node;
+		StyleMapElement mapNode;
+
+		LOG.info("setMapPositive");
+		String mapName = "positiveMap";
+		OdfNumberCurrencyStyle instance = new OdfNumberCurrencyStyle(dom,
+				"$", "#0", "fstyle");
+		instance.setMapPositive(mapName);
+		node = instance.getLastChild();
+		Assert.assertNotNull(node);
+		Assert.assertTrue(node instanceof StyleMapElement);
+		mapNode = (StyleMapElement) node;
+		Assert.assertEquals("value()>0", mapNode.getStyleConditionAttribute());
+		Assert.assertEquals(mapName, mapNode.getStyleApplyStyleNameAttribute());
+	}
+
+	/**
+	 * Test of setMapNegative method, of class OdfNumberCurrencyStyle.
+	 */
+	@Test
+	public void testSetMapNegative() {
+		Node node;
+		StyleMapElement mapNode;
+
+		LOG.info("setMapNegative");
+		String mapName = "negativeMap";
+		OdfNumberCurrencyStyle instance = new OdfNumberCurrencyStyle(dom,
+				"$", "#0", "fstyle");
+		instance.setMapNegative(mapName);
+		node = instance.getLastChild();
+		Assert.assertNotNull(node);
+		Assert.assertTrue(node instanceof StyleMapElement);
+		mapNode = (StyleMapElement) node;
+		Assert.assertEquals("value()<0", mapNode.getStyleConditionAttribute());
+		Assert.assertEquals(mapName, mapNode.getStyleApplyStyleNameAttribute());
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfDateStyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfDateStyleTest.java
new file mode 100644
index 0000000..7cfd70d
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfDateStyleTest.java
@@ -0,0 +1,264 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.number;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+/**
+ *
+ * @author J David Eisenberg
+ */
+public class OdfDateStyleTest {
+	private static final Logger LOG = Logger.getLogger(OdfDateStyleTest.class.getName());
+	OdfSpreadsheetDocument doc;
+	OdfFileDom dom;
+
+    public OdfDateStyleTest() {
+    }
+
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+    }
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	Logger.getLogger(OdfDateStyleTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Test of buildFromFormat method, of class OdfDateStyle.
+     */
+    /*
+    G  	Era designator       AD
+y 	Year                 1996; 96
+Q	Quarter in Year      2 -- not in Java; in ODF
+M 	Month in year        July; Jul; 07
+w 	Week in year         27
+d 	Day in month         10
+E 	Day in week          Tuesday; Tue
+a 	Am/pm marker         PM
+H 	Hour in day (0-23)   0
+h 	Hour in am/pm (1-12) -- depends on AM/PM marker
+m 	Minute in hour       30
+s 	Second in minute     55
+        */
+    @Test
+    public void testBuildFromFormat() {
+		int i;
+		int j;
+		String[] formatTest = {
+			"d-M-yy GGGG",
+			"dd/MM/yyyy GG",
+            "E, MMM d, yy",
+			"EEE, MMMM dd, yyyy",
+			"EEEE, MMM dd",
+			"QQQ' quarter, 'yy",
+			"dd-MM-yyyy hh:mm:ss a"
+		};
+
+		String[] expectedFormat = {
+				"d-M-yy GGGG",
+				"dd/MM/yyyy GG",
+	            "EEE, MMM d, yy",
+				"EEE, MMMM dd, yyyy",
+				"EEEE, MMM dd",
+				"QQQ quarter, yy",
+				"dd-MM-yyyy hh:mm:ss a"
+		};
+		/*
+		 * starts with "T" if a text node (followed by content)
+		 * starts with "E" if an element, followed by:
+		 *    S or L for short or long node, anything else if not applicable
+		 * the month element can be either numeric or text format,
+		 * so I am using monthN and monthT to specify which one is desired.
+		 */
+		String[][] expected = {
+			{"ESday", "T-", "ESmonthN", "T-", "ESyear",
+				 "T ", "ELera"}, // "d-M-yy GGGG",
+			{"ELday", "T/", "ELmonthN", "T/", "ELyear", "T ", "ESera"}, // "dd/MM/yyyy GG",
+			{"ESday-of-week", "T, ", "ESmonthT", "T ",
+				"ESday", "T, ", "ESyear"}, // "E, MMM d, yy",
+			{"ESday-of-week", "T, ", "ELmonthT", "T ",
+				"ELday", "T, ", "ELyear"}, // "EEE, MMMM dd, yyyy",
+			{"ELday-of-week", "T, ", "ESmonthT", "T ",
+				"ELday"}, // "EEEE, MMM dd",
+			{"ELquarter", "T quarter, ", "ESyear"}, // "QQQ quarter, yy",
+			{"ELday", "T-", "ELmonthN", "T-",
+				"ELyear", "T ", "ELhours", "T:",
+				"ELminutes", "T:", "ELseconds", "T ",
+				"E-am-pm"} // "dd-MM-yyyy hh:mm:ss a"
+		};
+
+        LOG.info("buildFromFormat");
+        OdfNumberDateStyle instance = null;
+
+        for (i = 0; i < formatTest.length; i++)
+		{
+			LOG.info("Date format: " + formatTest[i]);
+			instance = new OdfNumberDateStyle(dom,
+				formatTest[i], "fstyle");
+			Assert.assertNotNull(instance.getFirstChild());
+
+			checkNodes(instance.getFirstChild(), expected[i], 0);
+			Assert.assertEquals(expectedFormat[i], instance.getFormat());
+		}
+	}
+
+	private void checkNodes(Node node, String[] expected, int position)
+	{
+		char expectedType;
+		String expectedValue;
+
+		while (node != null)
+		{
+			Assert.assertTrue("More nodes than specifiers",
+				position < expected.length);
+			expectedType = expected[position].charAt(0);
+			expectedValue = expected[position].substring(1);
+
+			switch (expectedType)
+			{
+				case 'T':
+					checkNumberText("text", expectedValue, node);
+					position++;
+					break;
+				case 'E':
+					checkElement(expectedValue, node);
+					position++;
+					if (node.hasChildNodes())
+					{
+						node = node.getFirstChild();
+						checkNodes(node, expected, position);
+					}
+					break;
+			}
+			node = node.getNextSibling();
+		}
+    }
+
+   	/**
+	 * Check that the node is an element with the given name
+	 * with the expected text content.
+	 * @param elementName expected element name (in number: namespace)
+	 * @param expected expected text content
+	 * @param node the Node to be examined
+	 */
+	private void checkNumberText(String elementName, String expected, Node node)
+	{
+		Node childNode;
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.NUMBER.getUri(),
+			node.getNamespaceURI());
+		Assert.assertEquals(elementName, node.getLocalName());
+		childNode = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, childNode.getNodeType());
+		Assert.assertEquals(expected, childNode.getNodeValue());
+	}
+
+	/**
+	 * Check to see that the given Node is an element with the expected name
+	 * and the appropriate number:style of short or long.
+	 * For the month specifier, the element name ends with N if it's numeric
+	 * and T if it's textual.
+	 * @param expectedName name element should have
+	 * @param expectedLong 'S' for short, 'L' for long, ' ' if not applicable
+	 * @param node the node to be examined
+	 */
+	private void checkElement(String expectedName, Node node)
+	{
+		char expectedLong;
+		String longShort;
+		String monthTextual = null;
+
+		expectedLong = expectedName.charAt(0);
+		expectedName = expectedName.substring(1);
+		if (expectedName.equals("monthN"))
+		{
+			expectedName = "month";
+			monthTextual = "false";
+		}
+		else if (expectedName.equals("monthT"))
+		{
+			expectedName = "month";
+			monthTextual = "true";
+		}
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(expectedName, node.getLocalName());
+
+		if (expectedLong == 'S' || expectedLong == 'L')
+		{
+			if (expectedLong == 'S')
+			{
+				longShort = "short";
+			}
+			else
+			{
+				longShort = "long";
+			}
+			Assert.assertEquals("Element is " + expectedName, longShort,
+				((Element)node).getAttributeNS(OdfDocumentNamespace.NUMBER.getUri(),
+				"style"));
+		}
+
+		if (monthTextual != null)
+		{
+			Assert.assertEquals(monthTextual,
+				((Element) node).getAttributeNS(OdfDocumentNamespace.NUMBER.getUri(),
+				"textual")
+			);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfNumberStyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfNumberStyleTest.java
new file mode 100644
index 0000000..a12ca2a
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfNumberStyleTest.java
@@ -0,0 +1,274 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.number;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author J David Eisenberg
+ */
+public class OdfNumberStyleTest {
+	private static final Logger LOG = Logger.getLogger(OdfNumberStyleTest.class.getName());
+	OdfSpreadsheetDocument doc;
+	OdfFileDom dom;
+
+    public OdfNumberStyleTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	Logger.getLogger(OdfNumberStyleTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	/**
+	 * Test of buildFromFormat method, of class OdfNumberStyle.
+	 */
+	@Test
+	public void testBuildFromFormat() {
+		int n;
+		String[] formatTest = {
+			"##",
+			"#0",
+			"#00",
+			"#,###",
+			"#,##0",
+			"#,##0.00",
+			"before:##0",
+			"##0:after",
+			"before:##0:after"
+		};
+
+		String[] expectedFormat = {
+				"#",
+				"#0",
+				"#00",
+				"#,###",
+				"#,##0",
+				"#,##0.00",
+				"before:#0",
+				"#0:after",
+				"before:#0:after"
+		};
+		int[] expectedNumberDecimalPlaces = {
+				0,
+				0,
+				0,
+				0,
+				0,
+				2,
+				0,
+				0,
+				0
+		};
+		/*
+		 * Expected elements.
+         * t -- <number:text> with following text
+         * n -- <number:number> with minimum digits, decimal places,
+         *      and grouping (T or F)
+		 */
+		String[][] expected = {
+			{ "n00F" }, // ##
+			{ "n10F"}, // #0
+			{ "n20F" }, // #00
+			{ "n00T" }, // #,###
+			{ "n10T" }, // #,##0
+			{ "n12T" }, // #,##0.00
+			{ "tbefore:", "n10F" },
+			{ "n10F", "t:after" },
+			{ "tbefore:", "n10F", "t:after"},
+		};
+		LOG.info("buildFromFormat");
+		OdfNumberStyle instance = null;
+		char expectedType;
+        String expectedValue;
+		Node node;
+
+		for (int i = 0; i < formatTest.length; i++)
+		{
+			LOG.info("Number format: " + formatTest[i]);
+			instance = new OdfNumberStyle(dom,
+				formatTest[i], "fstyle");
+			Assert.assertNotNull(instance);
+
+			node = instance.getFirstChild();
+
+			for (int j = 0; j < expected[i].length; j++)
+			{
+				expectedType = expected[i][j].charAt(0);
+				expectedValue = expected[i][j].substring(1);
+				switch (expectedType)
+				{
+					case 't':
+						checkNumberText("text", expectedValue, node);
+						break;
+					case 'n':
+						checkNumberFormat(expectedValue, node);
+						break;
+				}
+				node = node.getNextSibling();
+				Assert.assertEquals(expectedFormat[i], instance.getFormat());
+				NumberNumberElement number = OdfElement.findFirstChildNode(NumberNumberElement.class, instance);
+				try {
+					Assert.assertEquals(expectedNumberDecimalPlaces[i], number
+							.getNumberDecimalPlacesAttribute().intValue());
+				} catch (Exception e) {
+					Assert.fail(e.getMessage());
+				}
+			}
+		}
+	}
+
+	/**
+	 * Check that the node is a <code>&lt;number:elementName&gt;</code> node
+	 * with the expected text content.
+     * @param elementName the local name of the expected element
+	 * @param expected expected text content
+	 * @param node the Node to be examined
+	 */
+	private void checkNumberText(String elementName, String expected, Node node)
+	{
+		Node childNode;
+		// Check for <number:text> with expected content
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.NUMBER.getUri(),
+			node.getNamespaceURI());
+		Assert.assertEquals(elementName, node.getLocalName());
+		childNode = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, childNode.getNodeType());
+		Assert.assertEquals(expected, childNode.getNodeValue());
+	}
+	/**
+	 * Check to see that the node is <code>&lt;number:number&gt;</code> and
+	 * meets the expected specifications.
+	 *
+	 * The expected specifications is a string of three characters:
+	 * min # of digits, # of decimal places, grouped (T/F)
+	 * @param expected expected specification for <code>&lt;number:number&gt;</code>
+	 * @param node the node to be validated
+	 */
+	private void checkNumberFormat(String expected, Node node)
+	{
+		int nDigits = Integer.parseInt(expected.substring(0,1));
+		int nDecimals = Integer.parseInt(expected.substring(1,2));
+		boolean grouped = (expected.charAt(2) == 'T');
+		boolean nodeGrouped;
+		NumberNumberElement number;
+
+		Assert.assertTrue("node is OdfNumber", node instanceof NumberNumberElement);
+		number = (NumberNumberElement) node;
+
+		// check number of digits and decimals
+		Assert.assertEquals(nDigits, (long) number.getNumberMinIntegerDigitsAttribute());
+
+		if (nDecimals > 0)
+		{
+			Assert.assertEquals(nDecimals, (long)number.getNumberDecimalPlacesAttribute());
+		}
+
+		// check if grouping is set properly
+		nodeGrouped = (number.getNumberGroupingAttribute() == null) ? false :
+			number.getNumberGroupingAttribute().booleanValue();
+		Assert.assertTrue("Grouping", grouped == nodeGrouped);
+	}
+
+	/**
+	 * Test of setMapPositive method, of class NumberNumberElementNumberStyle.
+	 */
+	@Test
+	public void testSetMapPositive() {
+		Node node;
+		StyleMapElement mapNode;
+
+		LOG.info("setMapPositive");
+		String mapName = "positiveMap";
+		OdfNumberStyle instance = new OdfNumberStyle(dom,
+				"#0", "fstyle");
+		instance.setMapPositive(mapName);
+		node = instance.getLastChild();
+		Assert.assertNotNull(node);
+		Assert.assertTrue(node instanceof StyleMapElement);
+		mapNode = (StyleMapElement) node;
+		Assert.assertEquals("value()>0", mapNode.getStyleConditionAttribute());
+		Assert.assertEquals(mapName, mapNode.getStyleApplyStyleNameAttribute());
+	}
+
+	/**
+	 * Test of setMapNegative method, of class NumberNumberElementNumberStyle.
+	 */
+	@Test
+	public void testSetMapNegative() {
+		Node node;
+		StyleMapElement mapNode;
+
+		LOG.info("setMapNegative");
+		String mapName = "negativeMap";
+		OdfNumberStyle instance = new OdfNumberStyle(dom,
+				"#0", "fstyle");
+		instance.setMapNegative(mapName);
+		node = instance.getLastChild();
+		Assert.assertNotNull(node);
+		Assert.assertTrue(node instanceof StyleMapElement);
+		mapNode = (StyleMapElement) node;
+		Assert.assertEquals("value()<0", mapNode.getStyleConditionAttribute());
+		Assert.assertEquals(mapName, mapNode.getStyleApplyStyleNameAttribute());
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfPercentageStyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfPercentageStyleTest.java
new file mode 100644
index 0000000..6ef222f
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfPercentageStyleTest.java
@@ -0,0 +1,163 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.number;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.element.style.StyleMapElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.w3c.dom.Node;
+
+/**
+ * @author Daisy
+ *
+ */
+public class OdfPercentageStyleTest {
+	private static final Logger LOG = Logger.getLogger(OdfPercentageStyleTest.class.getName());
+	OdfSpreadsheetDocument doc;
+	OdfFileDom dom;
+
+    public OdfPercentageStyleTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	/**
+	 * Test of buildFromFormat method, of class OdfNumberStyle.
+	 */
+	@Test
+	public void testBuildFromFormat() {
+		int n;
+		String[] formatTest = {
+			"##%",
+			"#0%",
+			"#00%",
+			"#,###%",
+			"#,##0%",
+			"#,##0.00%",
+			"before:##0%",
+			"##0%:after",
+			"before:##0%:after"
+		};
+
+		String[] expectedFormat = {
+				"#%",
+				"#0%",
+				"#00%",
+				"#,###%",
+				"#,##0%",
+				"#,##0.00%",
+				"before:#0%",
+				"#0%:after",
+				"before:#0%:after"
+		};
+
+		LOG.info("buildFromFormat");
+		OdfNumberPercentageStyle instance = null;
+
+		for (int i = 0; i < formatTest.length; i++)
+		{
+			LOG.info("Number format: " + formatTest[i]);
+			instance = new OdfNumberPercentageStyle(dom,
+				formatTest[i], "fstyle");
+			Assert.assertNotNull(instance);
+
+			Assert.assertEquals(expectedFormat[i], instance.getFormat());
+		}
+	}
+
+	/**
+	 * Test of setMapPositive method, of class OdfNumberNumberStyle.
+	 */
+	@Test
+	public void testSetMapPositive() {
+		Node node;
+		StyleMapElement mapNode;
+
+		LOG.info("setMapPositive");
+		String mapName = "positiveMap";
+		OdfNumberPercentageStyle instance = new OdfNumberPercentageStyle(dom,
+				"#0", "fstyle");
+		instance.setMapPositive(mapName);
+		node = instance.getLastChild();
+		Assert.assertNotNull(node);
+		Assert.assertTrue(node instanceof StyleMapElement);
+		mapNode = (StyleMapElement) node;
+		Assert.assertEquals("value()>0", mapNode.getStyleConditionAttribute());
+		Assert.assertEquals(mapName, mapNode.getStyleApplyStyleNameAttribute());
+	}
+
+	/**
+	 * Test of setMapNegative method, of class OdfNumberNumberStyle.
+	 */
+	@Test
+	public void testSetMapNegative() {
+		Node node;
+		StyleMapElement mapNode;
+
+		LOG.info("setMapNegative");
+		String mapName = "negativeMap";
+		OdfNumberPercentageStyle instance = new OdfNumberPercentageStyle(dom,
+				"#0", "fstyle");
+		instance.setMapNegative(mapName);
+		node = instance.getLastChild();
+		Assert.assertNotNull(node);
+		Assert.assertTrue(node instanceof StyleMapElement);
+		mapNode = (StyleMapElement) node;
+		Assert.assertEquals("value()<0", mapNode.getStyleConditionAttribute());
+		Assert.assertEquals(mapName, mapNode.getStyleApplyStyleNameAttribute());
+	}
+	
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfTimeStyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfTimeStyleTest.java
new file mode 100644
index 0000000..a284d10
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/number/OdfTimeStyleTest.java
@@ -0,0 +1,231 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.number;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+/**
+ *
+ * @author J David Eisenberg
+ */
+public class OdfTimeStyleTest {
+	private static final Logger LOG = Logger.getLogger(OdfTimeStyleTest.class.getName());
+	OdfSpreadsheetDocument doc;
+	OdfFileDom dom;
+
+    public OdfTimeStyleTest() {
+    }
+
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+    }
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Test of buildFromFormat method, of class OdfDateStyle.
+     */
+    /*
+a 	Am/pm marker         PM
+H 	Hour in day (0-23)   0
+h 	Hour in am/pm (1-12) -- depends on AM/PM marker
+m 	Minute in hour       30
+s 	Second in minute     55
+        */
+    @Test
+    public void testBuildFromFormat() {
+		int i;
+		int j;
+		String[] formatTest = {
+			"hh:mm:ss a",
+			"HH:mm:ss"
+		};
+
+		/*
+		 * starts with "T" if a text node (followed by content)
+		 * starts with "E" if an element, followed by:
+		 *    S or L for short or long node, anything else if not applicable
+		 */
+		String[][] expected = {
+			{"ELhours", "T:",
+				"ELminutes", "T:", "E-seconds", "T ",
+				"E-am-pm"}, // "hh:mm:ss a"
+			{"ELhours", "T:",
+				"ELminutes", "T:", "ELseconds"} // "HH:mm:ss"
+		};
+
+        LOG.info("buildFromFormat");
+        OdfNumberTimeStyle instance = null;
+
+        for (i = 0; i < formatTest.length; i++)
+		{
+			LOG.info("Time format: " + formatTest[i]);
+			instance = new OdfNumberTimeStyle(dom,
+				formatTest[i], "fstyle");
+			Assert.assertNotNull(instance.getFirstChild());
+
+			checkNodes(instance.getFirstChild(), expected[i], 0);
+		}
+	}
+
+	private void checkNodes(Node node, String[] expected, int position)
+	{
+		char expectedType;
+		String expectedValue;
+
+		while (node != null)
+		{
+			Assert.assertTrue("More nodes than specifiers",
+				position < expected.length);
+			expectedType = expected[position].charAt(0);
+			expectedValue = expected[position].substring(1);
+
+			switch (expectedType)
+			{
+				case 'T':
+					checkNumberText("text", expectedValue, node);
+					position++;
+					break;
+				case 'E':
+					checkElement(expectedValue, node);
+					position++;
+					if (node.hasChildNodes())
+					{
+						node = node.getFirstChild();
+						checkNodes(node, expected, position);
+					}
+					break;
+			}
+			node = node.getNextSibling();
+		}
+    }
+
+   	/**
+	 * Check that the node is an element with the given name
+	 * with the expected text content.
+	 * @param elementName expected element name (in number: namespace)
+	 * @param expected expected text content
+	 * @param node the Node to be examined
+	 */
+	private void checkNumberText(String elementName, String expected, Node node)
+	{
+		Node childNode;
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.NUMBER.getUri(),
+			node.getNamespaceURI());
+		Assert.assertEquals(elementName, node.getLocalName());
+		childNode = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, childNode.getNodeType());
+		Assert.assertEquals(expected, childNode.getNodeValue());
+	}
+
+	/**
+	 * Check to see that the given Node is an element with the expected name
+	 * and the appropriate number:style of short or long.
+	 * For the month specifier, the element name ends with N if it's numeric
+	 * and T if it's textual.
+	 * @param expectedName name element should have
+	 * @param expectedLong 'S' for short, 'L' for long, ' ' if not applicable
+	 * @param node the node to be examined
+	 */
+	private void checkElement(String expectedName, Node node)
+	{
+		char expectedLong;
+		String longShort;
+		String monthTextual = null;
+
+		expectedLong = expectedName.charAt(0);
+		expectedName = expectedName.substring(1);
+		if (expectedName.equals("monthN"))
+		{
+			expectedName = "month";
+			monthTextual = "false";
+		}
+		else if (expectedName.equals("monthT"))
+		{
+			expectedName = "month";
+			monthTextual = "true";
+		}
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(expectedName, node.getLocalName());
+
+		if (expectedLong == 'S' || expectedLong == 'L')
+		{
+			if (expectedLong == 'S')
+			{
+				longShort = "short";
+			}
+			else
+			{
+				longShort = "long";
+			}
+			Assert.assertEquals("Element is " + expectedName, longShort,
+				((Element)node).getAttributeNS(OdfDocumentNamespace.NUMBER.getUri(),
+				"style"));
+		}
+
+		if (monthTextual != null)
+		{
+			Assert.assertEquals(monthTextual,
+				((Element) node).getAttributeNS(OdfDocumentNamespace.NUMBER.getUri(),
+				"textual")
+			);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableCellRangeTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableCellRangeTest.java
new file mode 100644
index 0000000..6fa3c17
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableCellRangeTest.java
@@ -0,0 +1,240 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfWhitespaceProcessor;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class TableCellRangeTest {
+
+	final String filename = "TestSpreadsheetTable";
+	final String odtfilename = "TestTextTable";
+	OdfSpreadsheetDocument odsdoc;
+	OdfTextDocument odtdoc;
+	OdfTable odsTable, odtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			odsdoc = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(filename + ".ods"));
+			odtdoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(odtfilename + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testTextCellMerge() {
+		//get cell range, then merge
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		//get the first two cell
+		OdfTableCellRange cellRange = table1.getCellRangeByPosition(0, 0, 1, 0);
+		cellRange.merge();
+		OdfTableCell cell = cellRange.getCellByPosition(0, 0);
+		Assert.assertEquals(cell.getDisplayText(), "cell1cell2");
+		saveodt("MergeTwoCell");
+		try {
+			OdfTextDocument saveddoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(odtfilename + "MergeTwoCell.odt"));
+			OdfTable savedTable1 = saveddoc.getTableByName("Table1");
+			//get the cell range which the first cell is the covered cell.
+			//so the cell range will be enlarged
+			OdfTableCellRange savedCellRange = savedTable1.getCellRangeByPosition(1, 0, 2, 0);
+			savedCellRange.merge();
+			Assert.assertTrue(savedCellRange.getColumnNumber() == 3);
+			OdfTableCell savedCell = savedCellRange.getCellByPosition(0, 0);
+			NodeList paraList = savedCell.getOdfElement().getChildNodes();
+			OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+			Assert.assertTrue(paraList.item(2) instanceof OdfTextParagraph);
+			Assert.assertEquals(textProcessor.getText(paraList.item(2)),"0.00");
+			saveddoc.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeCoveredCell.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			OdfTextDocument saveddoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(odtfilename + "MergeTwoCell.odt"));
+			OdfTable savedTable1 = saveddoc.getTableByName("Table1");
+			//get the cell range which the first cell is the covered cell.
+			//so the cell range will be enlarged
+			OdfTableCellRange savedCellRange = savedTable1.getCellRangeByPosition(0, 0, 0, 1);
+			savedCellRange.merge();
+			Assert.assertTrue(savedCellRange.getColumnNumber() == 2);
+			Assert.assertTrue(savedCellRange.getRowNumber() == 2);
+			OdfTableCell savedCell = savedCellRange.getCellByPosition(0, 1);
+			Assert.assertTrue(savedCell.getOdfElement() instanceof TableCoveredTableCellElement);
+			saveddoc.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeCoveredCell2.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/////////////////////////////////////////
+	//issue: removeColumnByIndex removeRowByIndex removeCellByIndex
+	@Test
+	public void testTextTableMerge() {
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		//merge whole table
+		OdfTableCellRange cellRange = table1.getCellRangeByPosition(0, 0, table1.getColumnCount() - 1, table1.getRowCount() - 1);
+		cellRange.merge();
+		Assert.assertEquals(table1.getColumnCount(), 1);
+		Assert.assertEquals(table1.getRowCount(), 1);
+		saveodt("MergeTable");
+	}
+
+	@Test
+	public void testTextColumnMerge() {
+		//merge first column
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		OdfTableCellRange firstColumn = table1.getCellRangeByPosition(0, 0, 0, table1.getRowCount() - 1);
+		firstColumn.merge();
+		OdfTableCell cell = firstColumn.getCellByPosition(0, 2);
+		OdfTableCell firstCell = firstColumn.getCellByPosition(0, 0);
+		Assert.assertTrue(cell.getOwnerTableCell().equals(firstCell));
+		saveodt("MergeFirstColumn");
+		try {
+			OdfTextDocument saveddoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(odtfilename + "MergeFirstColumn.odt"));
+			OdfTable savedTable = saveddoc.getTableByName("Table1");
+			OdfTableCellRange firstTwoColumn = savedTable.getCellRangeByPosition(0, 0, 1, savedTable.getRowCount() - 1);
+			firstTwoColumn.merge();
+			OdfTableCell cell1 = firstTwoColumn.getCellByPosition(0, 2);
+			OdfTableCell firstCell1 = firstTwoColumn.getCellByPosition(0, 0);
+			Assert.assertTrue(cell1.getOwnerTableCell().equals(firstCell1));
+			saveddoc.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeFirstTwoColumn.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testTextRowMerge() {
+		//merge first two row
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		int rowCount = table1.getRowCount();
+		OdfTableCellRange firstTwoRow = table1.getCellRangeByPosition(0, 0, table1.getColumnCount() - 1, 1);
+		firstTwoRow.merge();
+		Assert.assertTrue(rowCount == (table1.getRowCount() + 1));
+		saveodt("MergeFirstTwoRow");
+	}
+
+	@Test
+	public void testSpreadSheetMerge() {
+		//get cell range, set name
+		OdfTable sheet1 = odsdoc.getTableByName("Sheet1");
+		OdfTableCellRange cellRange = sheet1.getCellRangeByPosition(28, 0, 28, 5);
+		cellRange.setCellRangeName("test");
+		cellRange.merge();
+		OdfTableCellRange cellRange1 = sheet1.getCellRangeByPosition("$E1", "$E6");
+		cellRange1.setCellRangeName("TimeCellRange");
+		cellRange1.merge();
+
+		saveods("CellRangeName");
+		try {
+			OdfSpreadsheetDocument saveddos = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(filename + "CellRangeName.ods"));
+			OdfTable savedSheet = saveddos.getTableByName("Sheet1");
+			OdfTableCellRange namedCellRange = savedSheet.getCellRangeByName("TimeCellRange");
+			OdfTableCell cell = namedCellRange.getCellByPosition("A1");
+			Assert.assertTrue(cell.getRowSpannedNumber() == 6);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testMergeExpandCellRange() {
+		try {
+			OdfSpreadsheetDocument ods = OdfSpreadsheetDocument
+					.newSpreadsheetDocument();
+			// the doc contain the table which only have one column and one row
+			// element
+			OdfTable table = ods.getTableByName("Sheet1");
+			int nCols = table.getColumnCount();
+			int nRows = table.getRowCount();
+			Assert.assertTrue(nCols == 1);
+			Assert.assertTrue(nRows == 1);
+			OdfTableCellRange cellRange = table.getCellRangeByPosition("A1","E1");
+			OdfTableCell cell = table.getCellByPosition("A1");
+			cell.setStringValue("Merge A1:E1");
+			cellRange.merge();
+			OdfTable table2 = OdfTable.newTable(ods, 1, 1);
+			table2.setTableName("Sheet2");
+			OdfTableCellRange cellRange2 = table2.getCellRangeByPosition("A1","F3");
+			OdfTableCell cell2 = table2.getCellByPosition("A1");
+			cell2.setStringValue("Merge A1:F3");
+			cellRange2.merge();
+			ods.save(ResourceUtilities.newTestOutputFile(filename + "MergeExpandCell.ods"));
+			table = ods.getTableByName("Sheet1");
+			Assert.assertTrue(table.getColumnCount() == 5);
+			Assert.assertTrue(table.getRowCount() == 1);
+			table = ods.getTableByName("Sheet2");
+			Assert.assertTrue(table.getColumnCount() == 6);
+			Assert.assertTrue(table.getRowCount() == 3);
+			OdfTextDocument odt = OdfTextDocument.newTextDocument();
+			OdfTable swTable = OdfTable.newTable(odt, 1, 5);
+			OdfTableCellRange swCellRange = swTable.getCellRangeByPosition("A1", "E2");
+			OdfTableCell swCell = swTable.getCellByPosition("E2");
+			swCell.setStringValue("Merge A1:E2");
+			swCellRange.merge();
+			odt.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeTextExpandCell.odt"));
+			swTable = odt.getTableList().get(0);
+			Assert.assertTrue(swTable.getColumnCount() == 1);
+			Assert.assertTrue(swTable.getRowCount() == 1);
+		} catch (Exception ex) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log( Level.SEVERE, ex.getMessage(), ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+
+	}
+
+	private void saveods(String name) {
+		try {
+			odsdoc.save(ResourceUtilities.newTestOutputFile(filename + name + ".ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	private void saveodt(String name) {
+		try {
+			odtdoc.save(ResourceUtilities.newTestOutputFile(odtfilename + name + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableCellTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableCellTest.java
new file mode 100644
index 0000000..d791ee4
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableCellTest.java
@@ -0,0 +1,1072 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.text.DecimalFormatSymbols;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+public class TableCellTest {
+
+	final static String SAMPLE_SPREADSHEET = "TestSpreadsheetTable";
+	final static String SAMPLE_STYLE_SPREADSHEET = "TestSpreadsheetStyleTable";
+	final static String SAMPLE_TEXT = "TestTextTable";
+	OdfSpreadsheetDocument odsdoc, odsstyle;
+	OdfTextDocument odtdoc;
+	OdfTable odsTable, odtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			odsdoc = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(SAMPLE_SPREADSHEET
+					+ ".ods"));
+			odtdoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(SAMPLE_TEXT + ".odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	private void saveods() {
+		try {
+			odsdoc.save(ResourceUtilities.newTestOutputFile(SAMPLE_SPREADSHEET
+					+ "Output.ods"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	private void saveodt() {
+		try {
+			odtdoc.save(ResourceUtilities.newTestOutputFile(SAMPLE_TEXT
+					+ "Output.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@Test
+	public void testGetIndexInRowColumn() {
+		int rowindex = 2, columnindex = 1;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell cell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertEquals(rowindex, cell.getRowIndex());
+		Assert.assertEquals(columnindex, cell.getColumnIndex());
+
+		OdfTable table3 = odtdoc.getTableByName("Table3");
+		OdfTableCell cell1 = table.getCellByPosition(0, 1);
+		Assert.assertEquals(1, cell1.getRowIndex());
+		Assert.assertEquals(0, cell1.getColumnIndex());
+	}
+
+	@Test
+	public void testGetSetHoriAlignment() {
+		int rowindex = 3, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		String align = fcell.getHorizontalAlignment();
+		Assert.assertEquals("center", align);
+
+		fcell.setHorizontalAlignment(null);
+		String newAlign = fcell.getHorizontalAlignment();
+		Assert.assertEquals(null, newAlign);
+
+		fcell.setHorizontalAlignment("start");
+		align = fcell.getHorizontalAlignment();
+		Assert.assertEquals("start", align);
+
+		// "left" and "right" should be mapped as "start" and "end".
+		fcell.setHorizontalAlignment("left");
+		align = fcell.getHorizontalAlignment();
+		Assert.assertEquals("start", align);
+		fcell.setHorizontalAlignment("right");
+		align = fcell.getHorizontalAlignment();
+		Assert.assertEquals("end", align);
+		saveods();
+
+		OdfSpreadsheetDocument ods;
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell = tbl.getCellByPosition(0, 0);
+			String horizonAlignment = cell.getHorizontalAlignment();
+			Assert.assertEquals(null, horizonAlignment);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetVertAlignment() {
+		int rowindex = 3, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		String align = fcell.getVerticalAlignment();
+		Assert.assertEquals("top", align);
+
+		fcell.setVerticalAlignment(null);
+		String newAlign = fcell.getVerticalAlignment();
+		Assert.assertEquals(null, newAlign);
+
+		fcell.setVerticalAlignment("bottom");
+		align = fcell.getVerticalAlignment();
+		Assert.assertEquals("bottom", align);
+		saveods();
+		OdfSpreadsheetDocument ods;
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell = tbl.getCellByPosition(0, 0);
+			String verticalAlignment = cell.getVerticalAlignment();
+			Assert.assertEquals(null, verticalAlignment);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetValueType() {
+		int rowindex = 3, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setValueType(null);
+		} catch (IllegalArgumentException ie) {
+			if ("type shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		fcell.setValueType("date");
+		String valueType = fcell.getValueType();
+		Assert.assertEquals("date", valueType);
+		saveods();
+
+		OdfSpreadsheetDocument ods;
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell = tbl.getCellByPosition(0, 0);
+			valueType = cell.getValueType();
+			Assert.assertEquals(null, valueType);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetWrapOption() {
+		int rowindex = 5, columnindex = 8;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		boolean wrap = fcell.isTextWrapped();
+		Assert.assertEquals(true, wrap);
+
+		fcell.setTextWrapped(false);
+		wrap = fcell.isTextWrapped();
+		Assert.assertEquals(false, wrap);
+		saveods();
+	}
+
+	@Test
+	public void testGetSetTextValue() {
+		int rowindex = 5, columnindex = 8;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		String text = fcell.getDisplayText();
+		Assert.assertEquals("this is a big cell with a big table", text);
+
+		fcell.setDisplayText("changed");
+		text = fcell.getDisplayText();
+		Assert.assertEquals("changed", text);
+		// reproduce bug 150.
+		fcell.setDisplayText(null);
+		text = fcell.getDisplayText();
+		Assert.assertEquals("", text);
+		fcell.setDisplayText(null, "automatic7777");
+		text = fcell.getDisplayText();
+		Assert.assertEquals("", text);
+		saveods();
+
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		OdfTableCell fcell2 = table1.getCellByPosition(0, 1);
+		text = fcell2.getDisplayText();
+		Assert.assertEquals("Aabbccddee", text);
+	}
+
+	@Test
+	public void testSetGetFormat() {
+		int rowindex = 3, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		fcell.setFormatString("#0.0");
+		String displayvalue = fcell.getDisplayText();
+		Assert.assertEquals("300"
+				+ (new DecimalFormatSymbols()).getDecimalSeparator() + "0",
+				displayvalue);
+		String format = fcell.getFormatString();
+		Assert.assertEquals("#0.0", format);
+
+		OdfTableCell dcell = table.getCellByPosition(3, 2);
+		format = dcell.getFormatString();
+		Assert.assertEquals("MMM d, yy", format);
+
+		dcell.setFormatString("yyyy-MM-dd");
+		displayvalue = dcell.getDisplayText();
+		Assert.assertEquals("2008-12-23", displayvalue);
+
+		OdfTableCell pcell = table.getCellByPosition("B2");
+		format = pcell.getFormatString();
+		Assert.assertEquals("#0%", format);
+
+		pcell.setFormatString("#0.00%");
+		displayvalue = pcell.getDisplayText();
+		Assert.assertEquals("200"
+				+ (new DecimalFormatSymbols()).getDecimalSeparator() + "00%",
+				displayvalue);
+		try {
+			OdfTableRow tablerow = table.getRowByIndex(6);
+			OdfTableCell cell = tablerow.getCellByIndex(3);
+			Calendar currenttime = Calendar.getInstance();
+			cell.setDateValue(currenttime);
+			cell.setFormatString("yyyy-MM-dd");
+			tablerow = table.getRowByIndex(7);
+			cell = tablerow.getCellByIndex(3);
+			cell.setTimeValue(currenttime);
+			cell.setFormatString("HH:mm:ss");
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		saveods();
+
+		//test value type adapt function.
+		OdfSpreadsheetDocument ods;
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setDoubleValue(new Double(i));
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=sum(A1:A10)");
+			//contains '#' should be adapted as float.
+			cell.setFormatString("#,###");
+			Assert.assertEquals("float", cell.getValueType());
+			cell = tbl.getCellByPosition("A12");
+			cell.setFormula("=sum(A1:A10)");
+			//contains '0' should be adapted as float.
+			cell.setFormatString("0.00");
+			Assert.assertEquals("float", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setPercentageValue(0.1);
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=sum(A1:A10)");
+			//contains '%'should be adapted as percentage.
+			cell.setFormatString("###.0%");
+			Assert.assertEquals("percentage", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setDateValue(Calendar.getInstance());
+				cell.setFormatString("yyyy.MM.dd");
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=max(A1:A10)");
+			//contains 'y' 'M' 'd' should be adapted as date.
+			cell.setFormatString("yyyy.MM.dd");
+			Assert.assertEquals("date", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setTimeValue(Calendar.getInstance());
+				cell.setFormatString("yyyy.MM.dd HH:mm:ss");
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=max(A1:A10)");
+			//contains 'H' 'm' 's' should be adapted as time.
+			cell.setFormatString("yyyy.MM.dd HH:mm:ss");
+			Assert.assertEquals("time", cell.getValueType());
+			cell = tbl.getCellByPosition("A12");
+			cell.setFormula("=max(A1:A10)");
+			//contains 'H' 'm' 's' should be adapted as time.
+			cell.setFormatString("HH:mm:ss");
+			Assert.assertEquals("time", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void loadOutputSpreadsheet() {
+		try {
+			odsdoc = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(SAMPLE_SPREADSHEET
+					+ "Output.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@Test
+	public void testGetSetCellBackgroundColor() throws Exception {
+		int rowindex = 2, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setCellBackgroundColor("#ffffff");
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set color as DEFAULT_BACKGROUND_COLOR #FFFFFF
+		Assert.assertEquals("#ffffff", fcell.getCellBackgroundColorString());
+
+		Color expectedColor = Color.valueOf("#000000");
+		fcell.setCellBackgroundColor(expectedColor);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expectedColor.toString(), fcell.getCellBackgroundColor().toString());
+
+		OdfSpreadsheetDocument ods;
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			OdfTableCell cell = tbl.getCellByPosition(0, 0);
+			Color actualBackColor = cell.getCellBackgroundColor();
+			Assert.assertEquals("#ffffff", actualBackColor.toString());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetColumnSpannedNumber() throws Exception {
+		int rowindex = 2, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setColumnSpannedNumber(-2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set column spanned number as DEFAULT_COLUMN_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnSpannedNumber());
+
+		fcell.setColumnSpannedNumber(0);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set column spanned number as DEFAULT_COLUMN_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnSpannedNumber());
+
+		fcell.setColumnSpannedNumber(2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(2, fcell.getColumnSpannedNumber());
+	}
+
+	@Test
+	public void testGetSetRowSpannedNumber() throws Exception {
+		int rowindex = 2, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setRowSpannedNumber(-2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set row spanned number as DEFAULT_ROW_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getRowSpannedNumber());
+
+		fcell.setRowSpannedNumber(0);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set row spanned number as DEFAULT_ROW_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getRowSpannedNumber());
+
+		fcell.setRowSpannedNumber(2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(2, fcell.getRowSpannedNumber());
+
+	}
+
+	@Test
+	public void testGetSetColumnsRepeatedNumber() throws Exception {
+		int rowindex = 3, columnindex = 1;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setColumnsRepeatedNumber(-2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set columns repeated number as DEFAULT_COLUMNS_REPEATED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnsRepeatedNumber());
+
+		fcell.setColumnsRepeatedNumber(0);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set columns repeated number as DEFAULT_COLUMNS_REPEATED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnsRepeatedNumber());
+
+		fcell.setColumnsRepeatedNumber(2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(2, fcell.getColumnsRepeatedNumber());
+	}
+
+	@Test
+	public void testGetSetDateValue() {
+		int rowindex = 7, columnindex = 7;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setDateValue(null);
+		} catch (IllegalArgumentException ie) {
+			if ("date shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		Calendar expectedCalendar = new GregorianCalendar(2010, 1, 30);
+		fcell.setDateValue(expectedCalendar);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(0, fcell.getDateValue().compareTo(
+				expectedCalendar));
+	}
+
+	@Test
+	public void testGetSetStringValue() {
+		int rowindex = 6, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setStringValue(null);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals("", fcell.getStringValue());
+
+		String expectedString = "hello world";
+		fcell.setStringValue(expectedString);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expectedString, fcell.getStringValue());
+	}
+
+	@Test
+	public void testGetSetBooleanValue() {
+		int rowindex = 5, columnindex = 5;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean expected = false;
+		fcell.setBooleanValue(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertFalse(fcell.getBooleanValue());
+	}
+
+	@Test
+	public void testGetSetCurrencyValue() {
+		int rowindex = 5, columnindex = 5;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setValueType("currency");
+		fcell.setCurrencyFormat("$", "#,##0.00");
+		Double actualValue = fcell.getCurrencyValue();
+		Assert.assertNull(actualValue);
+
+		double expected = 100.00;
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setCurrencyValue(expected, null);
+		} catch (IllegalArgumentException ie) {
+			if ("currency shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		fcell.setCurrencyValue(expected, "USD");
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getCurrencyValue());
+	}
+
+	@Test
+	public void testGetSetCurrencyDesc() {
+		int rowindex = 1, columnindex = 2;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setCurrencyCode(null);
+		} catch (IllegalArgumentException ie) {
+			if ("Currency code of cell should not be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		String expected = "USD";
+		fcell.setCurrencyCode(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getCurrencyCode());
+	}
+
+	@Test
+	public void testGetSetPercentageValue() {
+		int rowindex = 5, columnindex = 5;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		double expected = 56.98;
+		fcell.setPercentageValue(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getPercentageValue());
+	}
+
+	@Test
+	public void testGetSetTimeValue() {
+		int rowindex = 0, columnindex = 4;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setTimeValue(null);
+		} catch (IllegalArgumentException ie) {
+			if ("time shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		Calendar expected = Calendar.getInstance();
+		fcell.setTimeValue(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(
+				"'PT'HH'H'mm'M'ss'S'");
+		String expectedString = simpleFormat.format(expected.getTime());
+		String targetString = simpleFormat.format(fcell.getTimeValue().getTime());
+		Assert.assertEquals(expectedString, targetString);
+	}
+
+	@Test
+	public void testGetSetFormula() {
+		int rowindex = 1, columnindex = 10;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setFormula(null);
+		} catch (IllegalArgumentException ie) {
+			if ("formula shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		String expected = "of:=[.I2]*4";
+		fcell.setFormula(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getFormula());
+	}
+
+	/**
+	 * This test case is used to check whether the new created cell uses correct
+	 * style settings.</br>
+	 * ODFDOM allows users to set if cell styles are inherited or not whenever a
+	 * new cell is added to the table. The default setting is using inheritance.
+	 * In this condition, the style of new column is same with the
+	 * last column before the inserted position, while the style of new row
+	 * is same with the last row before the inserted position.<br/>
+	 * This feature setting will influence <code>appendRow()</code>,
+	 * <code>appendColumn()</code>, <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code> and
+	 * <code>insertColumnsBefore()</code>. In default setting condition, the
+	 * style name of new created cells after these methods called should be
+	 * "ce1" which is inherited from preceding cell. <br/>
+	 * But after setting cell style inheritance false, these new created cells'
+	 * style name should be "Default", which is not inherited from preceding
+	 * one.<br/>
+	 * For <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>, if need
+	 * automatically expand cells, it will return empty cell(s) without any
+	 * style settings. Inheritance setting have no effect on them, so for cells
+	 * which created after these methods are called, should have "Default" style
+	 * name.
+	 */
+	@Test
+	public void testGetStyleName() {
+		try {
+			odsstyle = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(SAMPLE_STYLE_SPREADSHEET
+					+ ".ods"));
+			int rowindex = 1, columnindex = 0;
+			OdfTable table = odsstyle.getTableByName("Sheet1");
+			OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+			String expected = "ce1";
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// the default setting is inherited, so for new row, 
+			// the cell style name should be "ce1".
+			//test appendColumn
+			table.appendColumn();
+			int columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test appendRow
+			table.appendRow();
+			int rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test insertRowsBefore
+			table.insertRowsBefore(rowindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex, rowindex + 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test insertColumnsBefore
+			table.insertColumnsBefore(columnindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex + 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test appendColumns
+			table.appendColumns(2);
+			columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test appendRows
+			table.appendRows(2);
+			rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// for getCellByPosition the return cell style should be "Default".
+			fcell = table.getCellByPosition(table.getColumnCount() + 1, table.getRowCount() + 1);
+			Assert.assertEquals("Default", fcell.getStyleName());
+			odsstyle.close();
+
+			// change setting is not inherited, so for new row, 
+			// the cell style name should be "Default".
+			odsstyle = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(SAMPLE_STYLE_SPREADSHEET
+					+ ".ods"));
+			rowindex = 1;
+			columnindex = 0;
+			table = odsstyle.getTableByName("Sheet1");
+			table.setCellStyleInheritance(false);
+			expected = "Default";
+			table.appendColumn();
+			columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test appendRow
+			table.appendRow();
+			rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test insertRowsBefore
+			table.insertRowsBefore(rowindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex, rowindex + 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test insertColumnsBefore
+			table.insertColumnsBefore(columnindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex + 1, rowindex);
+			//Assert.assertEquals(expected, fcell.getStyleName());
+			//test appendColumns
+			table.appendColumns(2);
+			columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			//test appendRows
+			table.appendRows(2);
+			rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// for getCellByPosition the return cell style should be "Default".
+			fcell = table.getCellByPosition(table.getColumnCount(), table.getRowCount());
+			Assert.assertEquals("Default", fcell.getStyleName());
+			odsstyle.close();
+		} catch (Exception e) {
+			Assert.fail(e.toString());
+		}
+	}
+
+	@Test
+	public void testGetTableColumn() {
+		int rowindex = 2, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertNotNull(fcell.getTableColumn());
+		Assert.assertEquals(columnindex, fcell.getTableColumn().getColumnIndex());
+	}
+
+	@Test
+	public void testGetTableRow() {
+		int rowindex = 2, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertNotNull(fcell.getTableRow());
+		Assert.assertEquals(rowindex, fcell.getTableRow().getRowIndex());
+	}
+
+	@Test
+	public void testRemoveContent() {
+		int rowindex = 5, columnindex = 8;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertTrue(fcell.mCellElement.getChildNodes().getLength() > 0);
+		fcell.removeContent();
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(0, fcell.mCellElement.getChildNodes().getLength());
+	}
+
+	@Test
+	public void testRemoveTextContent() throws Exception {
+		int rowindex = 5, columnindex = 8;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		// how to test?
+		fcell.removeContent();
+		Assert.assertEquals(0, fcell.mCellElement.getChildNodes().getLength());
+
+		fcell.setDisplayText("hello");
+		DrawFrameElement drawEle = new DrawFrameElement(odsdoc.getContentDom());
+		DrawImageElement imageEle = drawEle.newDrawImageElement();
+		fcell.mCellElement.appendChild(drawEle);
+
+		Assert.assertEquals(2, fcell.mCellElement.getChildNodes().getLength());
+
+		fcell.removeTextContent();
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(1, fcell.mCellElement.getChildNodes().getLength());
+	}
+
+	@Test
+	public void testGetSetDisplayText() {
+		int rowindex = 5, columnindex = 5;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		String expected = "display text";
+
+		// Assert.assertEquals(expected, fcell.getDisplayText());
+
+		fcell.setDisplayText(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getDisplayText());
+	}
+
+	@Test
+	public void testGetSetFormatString() {
+		int rowindex = 3, columnindex = 0;
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setFormatString(null);
+		} catch (IllegalArgumentException ie) {
+			if ("formatStr shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		// float format string
+		String expected = "#0.0";
+		fcell.setFormatString(expected);
+		// date format string
+		// String expected="MMM d, yy";
+		// String expected="yyyy-MM-dd";
+
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getFormatString());
+	}
+
+	@Test
+	public void testGetCurrencySymbol() {
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		OdfTableCell cell1 = table.getCellByPosition("C2");
+		Assert.assertEquals("$", cell1.getCurrencySymbol());
+		OdfTableCell cell2 = table.getCellByPosition("C3");
+		Assert.assertEquals("CNY", cell2.getCurrencySymbol());
+	}
+
+	@Test
+	public void testGetSetCurrencyFormat() {
+		OdfTable table = odsdoc.getTableByName("Sheet1");
+		String[] formats = {"$#,##0.00", "#,##0.00 CNY", "$#,##0.0"};
+
+		OdfTableCell cell = table.getCellByPosition("J1");
+		boolean illegalArgumentFlag = false;
+		try {
+			cell.setCurrencyFormat(null, formats[0]);
+		} catch (IllegalArgumentException ie) {
+			if ("currencySymbol shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		try {
+			cell.setCurrencyFormat("$", null);
+		} catch (IllegalArgumentException ie) {
+			if ("format shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		cell.setCurrencyValue(32.12, "USD");
+		cell.setCurrencyFormat("$", formats[0]);
+
+		cell = table.getCellByPosition("J2");
+		cell.setCurrencyValue(new Double(32), "CNY");
+		cell.setCurrencyFormat("CNY", formats[1]);
+
+		cell = table.getCellByPosition("J3");
+		cell.setCurrencyValue(-32.12, "USD");
+		cell.setCurrencyFormat("$", formats[2]);
+
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		for (int i = 1; i <= 3; i++) {
+			OdfTableCell newcell = table.getCellByPosition("J" + i);
+			Assert.assertEquals(formats[i - 1], newcell.getFormatString());
+		}
+	}
+
+	@Test
+	public void testSetDefaultCellStyle() {
+		OdfSpreadsheetDocument outputDocument;
+		OdfContentDom contentDom; // the document object model for content.xml
+		OdfStylesDom stylesDom; // the document object model for styles.xml
+		// the office:automatic-styles element in content.xml
+		OdfOfficeAutomaticStyles contentAutoStyles;
+		// the office:styles element in styles.xml
+		OdfOfficeStyles stylesOfficeStyles;
+		OdfStyle style;
+		String noaaDateStyleName;
+		String noaaTempStyleName;
+
+		try {
+			outputDocument = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			contentDom = outputDocument.getContentDom();
+			contentAutoStyles = contentDom.getOrCreateAutomaticStyles();
+
+			OdfNumberDateStyle dateStyle = new OdfNumberDateStyle(contentDom,
+					"yyyy-MM-dd", "numberDateStyle", null);
+			OdfNumberStyle numberStyle = new OdfNumberStyle(contentDom,
+					"#0.00", "numberTemperatureStyle");
+
+			contentAutoStyles.appendChild(dateStyle);
+			contentAutoStyles.appendChild(numberStyle);
+
+			style = contentAutoStyles.newStyle(OdfStyleFamily.TableCell);
+			noaaDateStyleName = style.getStyleNameAttribute();
+			style.setStyleDataStyleNameAttribute("numberDateStyle");
+
+			// and for time cells
+			style = contentAutoStyles.newStyle(OdfStyleFamily.TableCell);
+			noaaTempStyleName = style.getStyleNameAttribute();
+			style.setStyleDataStyleNameAttribute("numberTemperatureStyle");
+			style.setProperty(StyleParagraphPropertiesElement.TextAlign, "end");
+
+			OdfTable table = OdfTable.newTable(outputDocument);
+			List<OdfTableColumn> columns = table.insertColumnsBefore(0, 3);
+			OdfTableColumn column = columns.get(0);
+			column.setDefaultCellStyle(
+					contentAutoStyles.getStyle(noaaDateStyleName,
+					OdfStyleFamily.TableCell));
+			OdfTableCell aCell = column.getCellByIndex(0);
+			aCell.setValueType("date");
+			String format = aCell.getFormatString();
+			Assert.assertEquals("yyyy-MM-dd", format);
+
+			List<OdfTableRow> rows = table.insertRowsBefore(0, 1);
+			OdfTableRow row = rows.get(0);
+			row.setDefaultCellStyle(contentAutoStyles.getStyle(noaaTempStyleName,
+					OdfStyleFamily.TableCell));
+			OdfTableCell bCell = row.getCellByIndex(0);
+			bCell.setValueType("float");
+			String bformat = bCell.getFormatString();
+			Assert.assertEquals("#0.00", bformat);
+			Assert.assertEquals("end", bCell.getHorizontalAlignment());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+        
+        @Test
+        public void testGetFromEmptyDateValue() throws Exception {
+            OdfSpreadsheetDocument doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+            OdfTable table = OdfTable.newTable(doc);
+            OdfTableCell dateCell = table.appendRow().getCellByIndex(0);
+            dateCell.setValueType(OfficeValueTypeAttribute.Value.DATE.toString());
+            Assert.assertNull(dateCell.getDateValue());
+        }
+        
+        @Test
+        public void testGetFromEmptyTimeValue() throws Exception {
+            OdfSpreadsheetDocument doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+            OdfTable table = OdfTable.newTable(doc);
+            OdfTableCell timeCell = table.appendRow().getCellByIndex(0);
+            timeCell.setValueType(OfficeValueTypeAttribute.Value.TIME.toString());
+            Assert.assertNull(timeCell.getTimeValue());
+        }
+        
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableRowColumnTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableRowColumnTest.java
new file mode 100644
index 0000000..d82a213
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableRowColumnTest.java
@@ -0,0 +1,231 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableColumnProperties;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.search.TextNavigation;
+import org.odftoolkit.odfdom.incubator.search.TextSelection;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class TableRowColumnTest {
+
+	final String filename = "TestSpreadsheetTable";
+	final String odtfilename = "TestTextTable";
+	OdfSpreadsheetDocument odsdoc;
+	OdfTextDocument odtdoc;
+	OdfTable odsTable, odtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			odsdoc = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(filename + ".ods"));
+			odtdoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(odtfilename + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@Test
+	public void testSetSize() {
+		OdfTable table3 = odtdoc.getTableByName("Table3");
+		//change the table height to 1/2
+		for (int i = 0; i < table3.getRowCount(); i++) {
+			OdfTableRow row = table3.getRowByIndex(i);
+			long oldHeight = row.getHeight() / 2;
+			row.setHeight(oldHeight, false);
+			String sHeightMM = String.valueOf(oldHeight) + Unit.MILLIMETER.abbr();
+			String sHeightIN = PositiveLength.mapToUnit(sHeightMM, Unit.INCH);
+			long expectedHeight = PositiveLength.parseLong(sHeightIN, Unit.MILLIMETER);
+			Assert.assertEquals(expectedHeight, row.getHeight());
+		}
+
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		//change the table width to 1/2
+		table1.setWidth(table1.getWidth() / 2);
+		for (int i = 0; i < table1.getColumnCount(); i++) {
+			OdfTableColumn column = table1.getColumnByIndex(i);
+			long oldWidth = column.getWidth() / 2;
+			column.setWidth(oldWidth);
+			String sWidthMM = String.valueOf(oldWidth) + Unit.MILLIMETER.abbr();
+			String sWidthIN = PositiveLength.mapToUnit(sWidthMM, Unit.INCH);
+			long expectedWidth = PositiveLength.parseLong(sWidthIN, Unit.MILLIMETER);
+			Assert.assertEquals(expectedWidth, column.getWidth());
+		}
+		saveodt("ChangeSize");
+	}
+
+	/**
+	 * When a repeated column without width is split up, no width attribute should be set.
+	 */
+	@Test
+	public void testSplitRepeatedColumns() {
+		// test original width is null or null value.
+		OdfTable table5 = odtdoc.getTableByName("Table5");
+		//columns 0-2 original width are null.
+		table5.getColumnByIndex(0).splitRepeatedColumns();
+		String columnWidth = table5.getColumnByIndex(1).maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+		Assert.assertNull(columnWidth);
+		//columns 3-5 original width value are null.
+		table5.getColumnByIndex(3).splitRepeatedColumns();
+		columnWidth = table5.getColumnByIndex(4).maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+		Assert.assertNull(columnWidth);
+		saveodt("SplitRepeatedColumns");
+	}
+
+	@Test
+	public void testGetPreviousNext() {
+		OdfTable table2 = odtdoc.getTableByName("Table2");
+		OdfTableRow row2 = table2.getRowByIndex(2);
+		OdfTableRow row1 = table2.getRowByIndex(1);
+		OdfTableRow row0 = table2.getRowByIndex(0);
+		OdfTableRow lastRow = table2.getRowByIndex(table2.getRowCount() - 1);
+		OdfTableRow preRow = row2.getPreviousRow();
+		Assert.assertTrue(preRow.equals(row1));
+		Assert.assertTrue(row0.getPreviousRow() == null);
+		Assert.assertEquals(row1.getNextRow(), row2);
+		Assert.assertTrue(lastRow.getNextRow() == null);
+
+		OdfTable table1 = odtdoc.getTableByName("Table1");
+		OdfTableColumn column2 = table1.getColumnByIndex(2);
+		OdfTableColumn column1 = table1.getColumnByIndex(1);
+		OdfTableColumn column0 = table1.getColumnByIndex(0);
+		OdfTableColumn lastColumn = table1.getColumnByIndex(table1.getColumnCount() - 1);
+		OdfTableColumn preColumn = column2.getPreviousColumn();
+		Assert.assertTrue(column0.getPreviousColumn() == null);
+		Assert.assertTrue(preColumn.equals(column1));
+		Assert.assertEquals(column0.getNextColumn(), column1);
+		Assert.assertTrue(lastColumn.getNextColumn() == null);
+	}
+
+	@Test
+	public void testGetIndex() {
+		//this is used to test the method for setColumnRepeatedIndex
+		//merge the first two column, then the third column's index is 2
+		OdfTable table3 = odtdoc.getTableByName("Table3");
+		OdfTableColumn column2OfT3 = table3.getColumnByIndex(2);
+		OdfTableCellRange range = table3.getCellRangeByPosition(0, 0, 1, table3.getRowCount() - 1);
+		range.merge();
+		Assert.assertTrue(column2OfT3.getColumnIndex() == 1);
+		//insert two columns after the first column, then the next column's index add 2
+		table3.insertColumnsBefore(1, 2);
+		Assert.assertTrue(column2OfT3.getColumnIndex() == 3);
+		//append a row
+		OdfTableRow newRow = table3.appendRow();
+		int index = newRow.getRowIndex();
+		Assert.assertTrue(index == (table3.getRowCount() - 1));
+		//remove two row
+//		table3.removeRowByIndex(0, 2);
+//		Assert.assertTrue(newRow.getRowIndex() == (index - 2));
+		//remove two colum
+		table3.removeColumnsByIndex(1, 2);
+		Assert.assertTrue(column2OfT3.getColumnIndex() == 1);
+
+		//insert two column in the repeated columns
+		OdfTable table2 = odtdoc.getTableByName("Table2");
+		OdfTableColumn column1OfT2 = table2.getColumnByIndex(1);
+		List<OdfTableColumn> columns = table2.insertColumnsBefore(1, 2);
+		Assert.assertTrue(column1OfT2.getColumnIndex() == 3);
+		Assert.assertTrue(columns.get(0).getColumnIndex() == 1);
+		Assert.assertEquals(column1OfT2.getPreviousColumn(), columns.get(1));
+		Assert.assertEquals(column1OfT2.getNextColumn(), table2.getColumnByIndex(4));
+
+		//append two row in the repeated rows
+		OdfTableRow row4OfT2 = table2.getRowByIndex(4);
+		OdfTableRow row3OfT2 = table2.getRowByIndex(3);
+		List<OdfTableRow> rows = table2.insertRowsBefore(4, 2);
+		OdfTableCell cell1 = rows.get(0).getCellByIndex(0);
+		cell1.setStringValue("cell1");
+		OdfTableCell cell2 = rows.get(1).getCellByIndex(0);
+		cell2.setStringValue("cell2");
+		Assert.assertTrue(row4OfT2.getRowIndex() == 6);
+		Assert.assertEquals(rows.get(0).getPreviousRow(), row3OfT2);
+		//remove a row, then the next row will decrease the index
+		table2.removeRowsByIndex(4, 1);
+		Assert.assertNull(rows.get(0).getOdfElement());
+		Assert.assertEquals(rows.get(1).getPreviousRow(), row3OfT2);
+		saveodt("ChangeIndex");
+	}
+
+	@Test
+	public void testCellGetRowIndex() {
+		OdfTable table3 = odtdoc.getTableByName("Table3");
+		OdfTableCell cell = table3.getCellByPosition(0, 1);
+		Assert.assertTrue(cell.getRowIndex() == 1);
+		table3.removeRowsByIndex(0, 2);
+	}
+
+	@Test
+	public void testGetInstance() {
+		//get the text content contains "cell"
+		TextNavigation search = new TextNavigation("cell", odtdoc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			OdfElement containerEle = item.getContainerElement();
+			if (containerEle instanceof OdfTextParagraph) {
+				Node ele = containerEle.getParentNode();
+				if (ele instanceof TableTableCellElement) {
+					OdfTableCell cell = OdfTableCell.getInstance((TableTableCellElementBase) ele);
+					Assert.assertTrue(cell.getStringValue().contains("cell"));
+					Assert.assertTrue(cell.getRowIndex() == 0);
+					ele = ele.getParentNode();
+					if (ele instanceof TableTableRowElement) {
+						OdfTableRow row = OdfTableRow.getInstance((TableTableRowElement) ele);
+						Assert.assertTrue(row == cell.getTableRow());
+					}
+				}
+			}
+		}
+	}
+
+	private void saveods(String name) {
+		try {
+			odsdoc.save(ResourceUtilities.newTestOutputFile(filename + name + ".ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	private void saveodt(String name) {
+		try {
+			odtdoc.save(ResourceUtilities.newTestOutputFile(odtfilename + name + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableTest.java
new file mode 100644
index 0000000..910dd8f
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableTest.java
@@ -0,0 +1,1193 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.doc.table;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderFooterPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderStyleElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class TableTest {
+
+	final static String mOdsTestFileName = "TestSpreadsheetTable";
+	final static String mOdtTestFileName = "TestTextTable";
+	OdfSpreadsheetDocument mOdsDoc;
+	OdfTextDocument mOdtDoc;
+	TableTableElement mOdsTable, mOdtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			mOdsDoc = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(mOdsTestFileName + ".ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private OdfTextDocument loadODTDocument(String name) {
+		try {
+			OdfTextDocument odtdoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(name));
+			return odtdoc;
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+		return null;
+	}
+
+	@Test
+	public void testNewTable() {
+		try {
+			OdfTextDocument document = OdfTextDocument.newTextDocument();
+			document.newParagraph("Empty table:");
+			createEmptyTable(document);
+
+			document.newParagraph();
+			document.newParagraph("Table with float values:");
+			createTableWithData(document);
+			document.newParagraph();
+			document.newParagraph("Table with string values:");
+			createTableWithString(document);
+
+			document.save(ResourceUtilities.newTestOutputFile("CreateTableCase.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testNewTableWithArrayData() {
+		try {
+			OdfSpreadsheetDocument spreadsheet = OdfSpreadsheetDocument.newSpreadsheetDocument();
+
+			// reproduce bug 121
+			int rowCount = 10, columnCount = 4;
+			String[] rowLabels = getTestTableRowLabel(rowCount);
+			String[] columnLabels = getTestTableColumnLabel(columnCount);
+			double[][] doubleArray = null;
+			String[][] stringArray = null;
+
+			OdfTable table1 = OdfTable.newTable(spreadsheet, null, null,
+					doubleArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT 2
+			Assert.assertEquals(2, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT 5
+			Assert.assertEquals(5, table1.getColumnCount());
+
+			table1 = OdfTable.newTable(spreadsheet, rowLabels, columnLabels,
+					doubleArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT+1 3
+			Assert.assertEquals(3, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT+1 6
+			Assert.assertEquals(6, table1.getColumnCount());
+
+			table1 = OdfTable.newTable(spreadsheet, null, null, stringArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT 2
+			Assert.assertEquals(2, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT 5
+			Assert.assertEquals(5, table1.getColumnCount());
+
+			table1 = OdfTable.newTable(spreadsheet, rowLabels, columnLabels,
+					stringArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT+1 3
+			Assert.assertEquals(3, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT+1 6
+			Assert.assertEquals(6, table1.getColumnCount());
+
+			doubleArray = getTestTableDataDouble(rowCount, columnCount);
+			table1 = OdfTable.newTable(spreadsheet, null, null, doubleArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount, table1.getRowCount());
+			Assert.assertEquals(columnCount, table1.getColumnCount());
+
+			table1 = OdfTable.newTable(spreadsheet, rowLabels, columnLabels,
+					doubleArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount + 1, table1.getRowCount());
+			Assert.assertEquals(columnCount + 1, table1.getColumnCount());
+
+			stringArray = new String[rowCount][columnCount];
+			for (int i = 0; i < rowCount; i++) {
+				for (int j = 0; j < columnCount; j++) {
+					stringArray[i][j] = "string" + (i * columnCount + j);
+				}
+			}
+			table1 = OdfTable.newTable(spreadsheet, null, null, stringArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount, table1.getRowCount());
+			Assert.assertEquals(columnCount, table1.getColumnCount());
+
+			table1 = OdfTable.newTable(spreadsheet, rowLabels, columnLabels,
+					stringArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount + 1, table1.getRowCount());
+			Assert.assertEquals(columnCount + 1, table1.getColumnCount());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testNewTableWithoutHeaderColumn() {
+		try {
+			// reproduce bug 145
+			OdfSpreadsheetDocument spreadsheet = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable sheet = OdfTable.newTable(spreadsheet, 3, 5);
+			TableTableHeaderColumnsElement headers = OdfElement.findFirstChildNode(TableTableHeaderColumnsElement.class,
+					sheet.mTableElement);
+			if (headers != null) {
+				for (Node n : new DomNodeList(headers.getChildNodes())) {
+					if (n instanceof TableTableColumnElement) {
+						if (sheet.getColumnInstance(
+								((TableTableColumnElement) n), 0).getColumnsRepeatedNumber() == 0) {
+							Assert.fail("table:number-columns-repeated has the invalid value: '0'. It have to be a value matching the 'positiveInteger' type.");
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private OdfTable createEmptyTable(OdfTextDocument document) {
+		String tablename = "Table1";
+		int rownumber = 5;
+		int clmnumber = 3;
+
+		OdfTable table1 = OdfTable.newTable(document, 5, 3);
+		table1.setTableName(tablename);
+
+		Assert.assertEquals(tablename, table1.getTableName());
+		Assert.assertEquals(rownumber, table1.getRowCount());
+		Assert.assertEquals(clmnumber, table1.getColumnCount());
+
+		OdfTable table = document.getTableByName(tablename);
+		Assert.assertNotNull(table);
+		Assert.assertEquals(table1, table);
+		return table1;
+	}
+
+	private OdfTable createTableWithData(OdfTextDocument document) {
+		String tablename = "Table2";
+		int rowcount = 10, columncount = 4;
+		double[][] data = new double[rowcount][columncount];
+		for (int i = 0; i < rowcount; i++) {
+			for (int j = 0; j < columncount; j++) {
+				data[i][j] = Math.random();
+			}
+		}
+
+		String[] rowlabels = new String[rowcount];
+		for (int i = 0; i < rowcount; i++) {
+			rowlabels[i] = "RowHeader" + i;
+		}
+
+		String[] columnlabels = new String[columncount];
+		for (int i = 0; i < columncount; i++) {
+			columnlabels[i] = "ColumnHeader" + i;
+		}
+
+		OdfTable table2 = OdfTable.newTable(document, rowlabels, columnlabels, data);
+		table2.setTableName(tablename);
+
+		Assert.assertEquals(1, table2.getHeaderColumnCount());
+		Assert.assertEquals(1, table2.getHeaderRowCount());
+		Assert.assertEquals(rowcount + 1, table2.getRowCount());
+		Assert.assertEquals(columncount + 1, table2.getColumnCount());
+		OdfTable table = document.getTableByName(tablename);
+		Assert.assertNotNull(table);
+		Assert.assertEquals(table2, table);
+
+		OdfTableCell cell = table.getCellByPosition(1, 1);
+		Assert.assertEquals("float", cell.getValueType());
+
+		return table2;
+	}
+
+	private OdfTable createTableWithString(OdfTextDocument document) {
+		String tablename = "Table3";
+		int rowcount = 7, columncount = 5;
+		String[][] data = new String[rowcount][columncount];
+		for (int i = 0; i < rowcount; i++) {
+			for (int j = 0; j < columncount; j++) {
+				data[i][j] = "string" + (i * columncount + j);
+			}
+		}
+
+		String[] rowlabels = new String[rowcount];
+		for (int i = 0; i < rowcount; i++) {
+			rowlabels[i] = "RowHeader" + i;
+		}
+
+		String[] columnlabels = new String[columncount];
+		for (int i = 0; i < columncount; i++) {
+			columnlabels[i] = "ColumnHeader" + i;
+		}
+
+		OdfTable table3 = OdfTable.newTable(document, rowlabels, columnlabels, data);
+		table3.setTableName(tablename);
+
+		Assert.assertEquals(1, table3.getHeaderColumnCount());
+		Assert.assertEquals(1, table3.getHeaderRowCount());
+		Assert.assertEquals(rowcount + 1, table3.getRowCount());
+		Assert.assertEquals(columncount + 1, table3.getColumnCount());
+		OdfTable table = document.getTableByName(tablename);
+		Assert.assertNotNull(table);
+		Assert.assertEquals(table3, table);
+
+		OdfTableCell cell = table.getCellByPosition(1, 1);
+		Assert.assertEquals("string", cell.getValueType());
+
+
+		return table3;
+
+	}
+
+	@Test
+	public void testDeleteTable() {
+		try {
+			mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+			List<OdfTable> tableList = mOdtDoc.getTableList();
+			int count = tableList.size();
+
+			OdfTable table = mOdtDoc.getTableByName("DeletedTable");
+			if (table != null) {
+				table.remove();
+			}
+
+			saveodt(mOdtTestFileName + "Out.odt");
+			mOdtDoc = loadODTDocument(mOdtTestFileName + "Out.odt");
+			tableList = mOdtDoc.getTableList();
+			Assert.assertEquals(count - 1, tableList.size());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetGetWidth() {
+		long width = 500;
+		try {
+			OdfTextDocument document = OdfTextDocument.newTextDocument();
+			document.newParagraph("Empty table:");
+			OdfTable table = createEmptyTable(document);
+			table.setWidth(width);
+			Assert.assertTrue(Math.abs(width - table.getWidth()) < 3);
+
+			document.save(ResourceUtilities.newTestOutputFile("TestSetGetWidth.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAppendColumn() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		List<OdfTable> tableList = mOdtDoc.getTableList();
+		for (int i = 0; i < tableList.size(); i++) {
+			OdfTable table = tableList.get(i);
+			int clmnum = table.getColumnCount();
+			table.appendColumn();
+			Assert.assertEquals(clmnum + 1, table.getColumnCount());
+
+			OdfTableColumn column = table.getColumnByIndex(clmnum);
+			OdfTableColumn columnOld = table.getColumnByIndex(clmnum - 1);
+			Assert.assertEquals(column.getCellCount(), columnOld.getCellCount());
+		}
+		saveodt(mOdtTestFileName + "Output.odt");
+	}
+
+	@Test
+	public void testGetSetTablename() {
+		String tablename = "My Table";
+		OdfTextDocument document = null;
+		try {
+			document = OdfTextDocument.newTextDocument();
+			document.newParagraph("Empty table:");
+			OdfTable table = createEmptyTable(document);
+			table.setTableName(tablename);
+			Assert.assertEquals(tablename, table.getTableName());
+
+			document.save(ResourceUtilities.newTestOutputFile("TestGetSetName.odt"));
+			document.close();
+			document = loadODTDocument("TestGetSetName.odt");
+			table = document.getTableByName(tablename);
+			Assert.assertNotNull(table);
+			String tablename2 = table.getTableName();
+			Assert.assertEquals(tablename, tablename2);
+		} catch (Exception e) {
+			Assert.fail(e.getMessage());
+		}
+
+		try {
+			//new another table with the same name
+			//an exception will be thrown
+			OdfTable table2 = OdfTable.newTable(document);
+			table2.setTableName(tablename);
+			document.save(ResourceUtilities.newTestOutputFile("TestGetSetName.odt"));
+			Assert.fail("should not save the tables with the same table name.");
+		} catch (Exception e) {
+			if (!e.getMessage().startsWith("The table name is duplicate")) {
+				Assert.fail(e.getMessage());
+			}
+		}
+	}
+
+	@Test
+	public void testInsertColumnBefore() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		OdfTable table1 = mOdtDoc.getTableByName("Table3");
+		OdfTableCellRange range = table1.getCellRangeByPosition(0, 1, 1, 2);
+		range.merge();
+
+		int clmnum = table1.getColumnCount();
+		OdfTableColumn oldClm1 = table1.getColumnByIndex(1);
+
+		List<OdfTableColumn> columns = table1.insertColumnsBefore(1, 2);
+		Assert.assertEquals(clmnum + 2, table1.getColumnCount());
+		OdfTableColumn clm0 = table1.getColumnByIndex(0);
+		OdfTableColumn clm1 = table1.getColumnByIndex(1);
+		OdfTableColumn clm2 = table1.getColumnByIndex(2);
+		OdfTableColumn clm3 = table1.getColumnByIndex(3);
+		Assert.assertEquals(columns.get(0), clm1);
+		Assert.assertEquals(columns.get(1), clm2);
+		Assert.assertEquals(clm0.getCellCount(), clm1.getCellCount());
+		Assert.assertEquals(clm1.getCellCount(), clm2.getCellCount());
+		Assert.assertEquals(clm3, oldClm1);
+
+		OdfTable table2 = mOdtDoc.getTableByName("Table2");
+		OdfTableColumn oldClm0 = table2.getColumnByIndex(0);
+		columns = table2.insertColumnsBefore(0, 2);
+
+		OdfTableColumn newClm0 = table2.getColumnByIndex(0);
+		OdfTableColumn newClm1 = table2.getColumnByIndex(1);
+		OdfTableColumn newClm2 = table2.getColumnByIndex(2);
+		Assert.assertEquals(newClm0.getCellCount(), newClm2.getCellCount());
+		Assert.assertEquals(newClm1.getCellCount(), newClm2.getCellCount());
+		Assert.assertEquals(newClm2, oldClm0);
+
+		saveodt(mOdtTestFileName + "Out.odt");
+	}
+
+	@Test
+	public void testRemoveColumnByIndex() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		OdfTable table1 = mOdtDoc.getTableByName("Table3");
+		OdfTableCellRange range = table1.getCellRangeByPosition(0, 1, 1, 2);
+		range.merge();
+
+		int clmnum = table1.getColumnCount();
+		OdfTableColumn oldClm0 = table1.getColumnByIndex(0);
+		OdfTableColumn oldClm3 = table1.getColumnByIndex(3);
+		table1.removeColumnsByIndex(1, 2);
+		OdfTableColumn newClm0 = table1.getColumnByIndex(0);
+		OdfTableColumn newClm1 = table1.getColumnByIndex(1);
+		Assert.assertEquals(clmnum - 2, table1.getColumnCount());
+		Assert.assertEquals(oldClm0, newClm0);
+		Assert.assertEquals(oldClm3, newClm1);
+
+		OdfTable table2 = mOdtDoc.getTableByName("Table4");
+		clmnum = table2.getColumnCount();
+		OdfTableColumn oldClm1 = table2.getColumnByIndex(2);
+		table2.removeColumnsByIndex(0, 2);
+		table2.removeColumnsByIndex(table2.getColumnCount() - 2, 2);
+		OdfTableColumn clm0 = table2.getColumnByIndex(0);
+		Assert.assertEquals(oldClm1, clm0);
+		Assert.assertEquals(clmnum - 4, table2.getColumnCount());
+		saveodt(mOdtTestFileName + "Out.odt");
+
+	}
+
+	@Test
+	public void testInsertRowBefore() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		OdfTable table2 = mOdtDoc.getTableByName("Table2");
+		OdfTableRow row = table2.getRowByIndex(0);
+		int originalRowCount = table2.getRowCount();
+		List<OdfTableRow> newRows = table2.insertRowsBefore(0, 2);
+
+
+		OdfTableRow newRow1 = table2.getRowByIndex(0);
+		OdfTableRow newRow2 = table2.getRowByIndex(0);
+		Assert.assertEquals(newRow1.getCellCount(), newRows.get(0).getCellCount());
+		Assert.assertEquals(newRow2.getCellCount(), newRows.get(1).getCellCount());
+		//original row index 0
+		Assert.assertEquals(row, table2.getRowByIndex(2));
+
+		saveodt(mOdtTestFileName + "Out.odt");
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + "Out.odt");
+		OdfTable newTable = mOdtDoc.getTableByName("Table2");
+
+		Assert.assertEquals(originalRowCount + 2, newTable.getRowCount());
+
+	}
+
+	@Test
+	public void testGetColumnList() {
+		String tablename = "MyTable";
+		String testFileName = "TestGetColumnList.odt";
+		try {
+			OdfTextDocument document = OdfTextDocument.newTextDocument();
+
+			int rowcount = 3, columncount = 3;
+			String[][] data = new String[rowcount][columncount];
+			for (int i = 0; i < rowcount; i++) {
+				for (int j = 0; j < columncount; j++) {
+					data[i][j] = "string" + (i * columncount + j);
+				}
+			}
+
+			String[] rowlabels = new String[rowcount];
+			for (int i = 0; i < rowcount; i++) {
+				rowlabels[i] = "RowHeader" + i;
+			}
+
+			String[] columnlabels = new String[columncount];
+			for (int i = 0; i < columncount; i++) {
+				columnlabels[i] = "ColumnHeader" + i;
+			}
+
+			OdfTable table3 = OdfTable.newTable(document, rowlabels, columnlabels, data);
+			table3.setTableName(tablename);
+
+			document.save(ResourceUtilities.newTestOutputFile(testFileName));
+			document = loadODTDocument(testFileName);
+			OdfTable table = document.getTableByName(tablename);
+			OdfTableColumn tmpColumn;
+			List<OdfTableColumn> columns = table.getColumnList();
+
+			//the code below prints the column value,it shows that the first columns value is the same with the last column
+			for (int i = 0; i < columns.size(); i++) {
+				tmpColumn = columns.get(i);
+				for (int j = 0; j < tmpColumn.getCellCount(); j++) {
+					String text = tmpColumn.getCellByIndex(j).getStringValue();
+					if (i == 0 && j == 0) {
+						Assert.assertEquals("", text);
+					} else if (i == 0 && j > 0) {
+						Assert.assertEquals("RowHeader" + (j - 1), text);
+					} else if (i > 0 && j == 0) {
+						Assert.assertEquals("ColumnHeader" + (i - 1), text);
+					} else {
+						Assert.assertEquals("string" + ((j - 1) * columncount + i - 1), text);
+					}
+				}
+			}
+
+			for (int i = 1; i < columns.size(); i++) {
+				tmpColumn = columns.get(i);
+				//each column's first cell is the column header
+				Assert.assertEquals(columnlabels[i - 1], tmpColumn.getCellByIndex(0).getStringValue());
+			}
+			Assert.assertEquals(columncount, columns.size() - 1);
+
+			Assert.assertEquals("", columns.get(0).getCellByIndex(0).getStringValue());
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+
+	@Test
+	public void testGetRowList() {
+		String tablename = "MyTable";
+		String testFileName = "TestGetRowList.odt";
+		try {
+			OdfTextDocument document = OdfTextDocument.newTextDocument();
+
+			int rowcount = 3, columncount = 3;
+			String[][] data = new String[rowcount][columncount];
+			for (int i = 0; i < rowcount; i++) {
+				for (int j = 0; j < columncount; j++) {
+					data[i][j] = "string" + (i * columncount + j);
+				}
+			}
+
+			String[] rowlabels = new String[rowcount];
+			for (int i = 0; i < rowcount; i++) {
+				rowlabels[i] = "RowHeader" + i;
+			}
+
+			String[] columnlabels = new String[columncount];
+			for (int i = 0; i < columncount; i++) {
+				columnlabels[i] = "ColumnHeader" + i;
+			}
+
+			OdfTable table3 = OdfTable.newTable(document, rowlabels, columnlabels, data);
+			table3.setTableName(tablename);
+
+			document.save(ResourceUtilities.newTestOutputFile(testFileName));
+			document = loadODTDocument(testFileName);
+			OdfTable table = document.getTableByName(tablename);
+			OdfTableRow tmpRow;
+			List<OdfTableRow> rows = table.getRowList();
+			for (int i = 1; i < rows.size(); i++) {
+				tmpRow = rows.get(i);
+				//each row's first cell is the row header
+				Assert.assertEquals(rowlabels[i - 1], tmpRow.getCellByIndex(0).getStringValue());
+			}
+			Assert.assertEquals(rowcount, rows.size() - 1);
+
+			Assert.assertEquals("", rows.get(0).getCellByIndex(0).getStringValue());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetColumnByIndex() {
+
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		OdfTable table = mOdtDoc.getTableByName("Table3");
+		Assert.assertNotNull(table);
+		//test if index is negative number, which is an illegal argument.
+		boolean illegalArgumentFlag = false;
+		try {
+			table.getColumnByIndex(-1);
+		} catch (IllegalArgumentException ie) {
+			if ("index should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		OdfTableColumn column = table.getColumnByIndex(2);
+		Assert.assertNotNull(column);
+		Assert.assertEquals("string6", column.getCellByIndex(2).getStringValue());
+		// test column automatically expands.
+		// Table3 original size is 7 rows and 5 columns. this test case will
+		// test row index 8 and columns index 6 are work well though they are
+		// both out bound of the original table.
+		column = table.getColumnByIndex(8);
+		Assert.assertNotNull(column);
+		OdfTableCell cell = column.getCellByIndex(6);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string86");
+		Assert.assertEquals("string86", cell.getStringValue());
+	}
+
+	@Test
+	public void testGetRowByIndex() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		OdfTable table = mOdtDoc.getTableByName("Table3");
+		Assert.assertNotNull(table);
+		//test index is negative number. This is a illegal argument.
+		boolean illegalArgumentFlag = false;
+		try {
+			table.getRowByIndex(-1);
+		} catch (IllegalArgumentException ie) {
+			if ("index should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		OdfTableRow row = table.getRowByIndex(3);
+		Assert.assertNotNull(row);
+		Assert.assertEquals("string12", row.getCellByIndex(3).getStringValue());
+		// test row automatically expands.
+		// Table3 original size is 7 rows and 5 columns. this test case will
+		// test row index 8 and columns index 6 are work well though they are
+		// both out bound of the original table.
+		row = table.getRowByIndex(6);
+		Assert.assertNotNull(row);
+		OdfTableCell cell = row.getCellByIndex(8);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string86");
+		Assert.assertEquals("string86", cell.getStringValue());
+	}
+
+	@Test
+	public void testRemoveRowByIndex() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		OdfTable table2 = mOdtDoc.getTableByName("Table2");
+		OdfTableRow row0 = table2.getRowByIndex(0);
+		OdfTableRow row3 = table2.getRowByIndex(3);
+		int originalRowCount = table2.getRowCount();
+		table2.removeRowsByIndex(1, 2);
+
+		//original row index 0
+		Assert.assertEquals(row0, table2.getRowByIndex(0));
+		Assert.assertEquals(row3, table2.getRowByIndex(1));
+
+		saveodt(mOdtTestFileName + "Out.odt");
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + "Out.odt");
+		OdfTable newTable = mOdtDoc.getTableByName("Table2");
+
+		Assert.assertEquals(originalRowCount - 2, newTable.getRowCount());
+	}
+
+	@Test
+	public void testGetHeaderRowCount() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		OdfTable table = mOdtDoc.getTableByName("Table3");
+		int headerRowCount = table.getHeaderRowCount();
+		Assert.assertEquals(1, headerRowCount);
+	}
+
+	@Test
+	public void testGetHeaderColumnCount() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		OdfTable table = mOdtDoc.getTableByName("Table3");
+		int headerColumnCount = table.getHeaderColumnCount();
+		Assert.assertEquals(1, headerColumnCount);
+
+	}
+
+	@Test
+	public void testIsProtected() throws Exception {
+		String tablename = "DeletedTable";
+		String outputFilename = "tableProtected.odt";
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Assert.assertNotNull(mOdtDoc);
+		OdfTable table = mOdtDoc.getTableByName(tablename);
+		table.setProtected(false);
+		mOdtDoc.save(ResourceUtilities.newTestOutputFile(outputFilename));
+
+		mOdtDoc = loadODTDocument(outputFilename);
+		table = mOdtDoc.getTableByName(tablename);
+		Assert.assertFalse(table.isProtected());
+
+	}
+
+	@Test
+	public void testSetIsProtected() throws Exception {
+		String tablename = "DeletedTable";
+		String outputFilename = "tableProtected.odt";
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Assert.assertNotNull(mOdtDoc);
+		OdfTable table = mOdtDoc.getTableByName(tablename);
+		table.setProtected(true);
+		mOdtDoc.save(ResourceUtilities.newTestOutputFile(outputFilename));
+
+		mOdtDoc = loadODTDocument(outputFilename);
+		table = mOdtDoc.getTableByName(tablename);
+		Assert.assertTrue(table.isProtected());
+	}
+
+	@Test
+	public void testGetCellByPosition() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		OdfTable table = mOdtDoc.getTableByName("Table3");
+
+		OdfTableCell cell = table.getCellByPosition(3, 3);
+		Assert.assertNotNull(cell);
+		Assert.assertEquals("string12", cell.getStringValue());
+		cell = table.getCellByPosition("D4");
+		Assert.assertNotNull(cell);
+		Assert.assertEquals("string12", cell.getStringValue());
+		//test index are negative numbers. They are illegal arguments.
+		boolean illegalArgumentFlag = false;
+		try {
+			cell = table.getCellByPosition(-1, 0);
+		} catch (IllegalArgumentException ie) {
+			if ("colIndex and rowIndex should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		// test TextTable automatically expands.
+		// Table3 original size is 7 rows and 5 columns;
+		//test row index 8 and column index 6, row index and column index both out of bound, work well. 
+		cell = table.getCellByPosition(8, 6);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string86");
+		Assert.assertEquals("string86", cell.getStringValue());
+		//test row index 9 and column index 4, row index out of bound, work well.
+		cell = table.getCellByPosition(4, 9);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string49");
+		Assert.assertEquals("string49", cell.getStringValue());
+		//test row index 9 and column index 4, column index out of bound, work well.
+		cell = table.getCellByPosition(9, 10);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string910");
+		Assert.assertEquals("string910", cell.getStringValue());
+		//test column index out of bound, work well.
+		cell = table.getCellByPosition("I4");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringI4");
+		Assert.assertEquals("stringI4", cell.getStringValue());
+		//test row index out of bound, work well.
+		cell = table.getCellByPosition("D11");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringD11");
+		Assert.assertEquals("stringD11", cell.getStringValue());
+		//test row index and column index both out of bound, work well. 
+		cell = table.getCellByPosition("K12");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringK12");
+		Assert.assertEquals("stringK12", cell.getStringValue());
+		// test TestSpreadsheetTable automatically expands.
+		// Sheet1 original size is 6 rows and 9 columns;
+		table = mOdsDoc.getTableByName("Sheet1");
+		cell = table.getCellByPosition("C1");
+		Assert.assertNotNull(cell);
+		Assert.assertEquals("Currency", cell.getStringValue());
+		cell = table.getCellByPosition("K4");
+		Assert.assertNotNull(cell);
+		cell.setBooleanValue(true);
+		Assert.assertEquals(Boolean.TRUE, cell.getBooleanValue());
+		cell = table.getCellByPosition("D10");
+		Assert.assertNotNull(cell);
+		Calendar cal = Calendar.getInstance();
+		cell.setTimeValue(cal);
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(
+				"'PT'HH'H'mm'M'ss'S'");
+		String expectedString = simpleFormat.format(cal.getTime());
+		String targetString = simpleFormat.format(cell.getTimeValue().getTime());
+		Assert.assertEquals(expectedString, targetString);
+		cell = table.getCellByPosition("M15");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringM15");
+		Assert.assertEquals("stringM15", cell.getStringValue());
+	}
+
+	@Test
+	public void testGetCellWithAutoExtend() {
+		OdfSpreadsheetDocument ods;
+		try {
+			ods = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OdfTable tbl = ods.getTableByName("Sheet1");
+			tbl.setTableName("Tests");
+			OdfTableCell cell = tbl.getCellByPosition(5, 5);
+			Assert.assertNotNull(cell);
+			Assert.assertEquals(6, tbl.getRowCount());
+			Assert.assertEquals(6, tbl.getColumnCount());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetCellRangeByPosition() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		OdfTable table = mOdtDoc.getTableByName("Table3");
+
+		OdfTableCellRange range = table.getCellRangeByPosition(0, 0, 3, 3);
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("A1", "D4");
+		Assert.assertNotNull(range);
+
+		// test TextTable automatically expands.
+		// Table3 original size is 7 rows and 5 columns;
+
+		//test index is negative number. They are illegal arguments.
+		boolean illegalArgumentFlag = false;
+		try {
+			range = table.getCellRangeByPosition(-1, 0, 2, -14);
+		} catch (IllegalArgumentException ie) {
+			if ("colIndex and rowIndex should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		range = table.getCellRangeByPosition(0, 0, 8, 6);
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition(0, 0, 4, 9);
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition(0, 0, 9, 10);
+		Assert.assertNotNull(range);
+		// get cell range by address.
+		range = table.getCellRangeByPosition("A1", "I4");
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("A1", "D11");
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("A1", "K12");
+		Assert.assertNotNull(range);
+		// test TestSpreadsheetTable automatically expands.
+		// Sheet1 original size is 6 rows and 9 columns;
+		// get cell range by index.
+		table = mOdsDoc.getTableByName("Sheet1");
+		range = table.getCellRangeByPosition("A1", "C1");
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("B7", "K12");
+		Assert.assertNotNull(range);
+	}
+
+	@Test
+	public void testRemoveRowColumn() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		OdfTable table1 = mOdtDoc.getTableByName("Table1");
+		int rowCount = table1.getRowCount();
+		table1.removeRowsByIndex(1, 2);
+		Assert.assertEquals(rowCount - 2, table1.getRowCount());
+
+		OdfTable table2 = mOdtDoc.getTableByName("Table2");
+		int columnCount = table2.getColumnCount();
+		table2.removeColumnsByIndex(2, 1);
+		Assert.assertEquals(columnCount - 1, table2.getColumnCount());
+
+		OdfTable table3 = mOdtDoc.getTableByName("Table3");
+		rowCount = table3.getRowCount();
+		table3.removeRowsByIndex(0, 2);
+		Assert.assertEquals(rowCount - 2, table3.getRowCount());
+
+		saveodt(mOdtTestFileName + "Out.odt");
+
+	}
+
+	@Test
+	public void testAppendRow() {
+		OdfFileDom dom;
+		try {
+			dom = mOdsDoc.getContentDom();
+			NodeList tablelist = dom.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table");
+			mOdsTable = (TableTableElement) tablelist.item(0);
+			testAppendRow(mOdsTable);
+			saveods();
+
+			mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+			dom = mOdtDoc.getContentDom();
+			tablelist = dom.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table");
+			for (int i = 0; i < tablelist.getLength(); i++) {
+				mOdtTable = (TableTableElement) tablelist.item(i);
+				testAppendRow(mOdtTable);
+			}
+			saveodt(mOdtTestFileName + "Out.odt");
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSplitCellAddress() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		OdfTable table1 = mOdtDoc.getTableByName("Table1");
+		//reproduce bug 138, test case to proof the fix problem.
+		//test address without table name.
+		String[] address = table1.splitCellAddress("A1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("A", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("AC1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("B34");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("B", address[1]);
+		Assert.assertEquals("34", address[2]);
+		address = table1.splitCellAddress("AC29");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("29", address[2]);
+
+		//test relative address
+		address = table1.splitCellAddress("Table1.A1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("A", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("Table1.AC1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("Table1.B34");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("B", address[1]);
+		Assert.assertEquals("34", address[2]);
+		address = table1.splitCellAddress("Table1.AC29");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("29", address[2]);
+
+		//test absolute address.
+		address = table1.splitCellAddress("$Table1.$A$1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("A", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("$Table1.$AC$1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("$Table1.$B$34");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("B", address[1]);
+		Assert.assertEquals("34", address[2]);
+		address = table1.splitCellAddress("$Table1.$AC$29");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("29", address[2]);
+	}
+
+	// Bug 97 - OdfTableRow.getCellAt(int) returns null when the cell is a repeat cell
+	@Test
+	public void testGetCellAt() {
+		try {
+			OdfSpreadsheetDocument doc = (OdfSpreadsheetDocument) OdfSpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath("testGetCellAt.ods"));
+			OdfTable odfTable = doc.getTableList().get(0);
+			OdfTableRow valueRows = odfTable.getRowByIndex(0);
+			for (int i = 0; i < 4; i++) {
+				OdfTableCell cell = valueRows.getCellByIndex(i);
+				Assert.assertNotNull(cell);
+				int value = cell.getDoubleValue().intValue();
+				Assert.assertEquals(1, value);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	private String[] getTestTableRowLabel(int rowCount) {
+		String[] rowLabels = new String[rowCount];
+		for (int i = 0; i < rowCount; i++) {
+			rowLabels[i] = "RowHeader" + i;
+		}
+		return rowLabels;
+	}
+
+	private String[] getTestTableColumnLabel(int columnCount) {
+		String[] columnLabels = new String[columnCount];
+		for (int i = 0; i < columnCount; i++) {
+			columnLabels[i] = "columnHeader" + i;
+		}
+		return columnLabels;
+
+	}
+
+	private double[][] getTestTableDataDouble(int rowCount, int columnCount) {
+		double[][] doubleArray = new double[rowCount][columnCount];
+		for (int i = 0; i < rowCount; i++) {
+			for (int j = 0; j < columnCount; j++) {
+				doubleArray[i][j] = i * j;
+			}
+		}
+		return doubleArray;
+	}
+
+	// Bug 294 Enable Tables to be inserted in Header Footer
+	@Test
+	public void testTableInHeaderFooter() {
+		try {
+			OdfDocument odfDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(mOdtTestFileName + ".odt"));
+			Map<String, StyleMasterPageElement> masterPages1 = odfDoc.getMasterPages();
+			StyleMasterPageElement masterPage1 = masterPages1.get("Standard");
+			Assert.assertNotNull(masterPage1);
+			int rowCount = 4;
+			int columnCount = 5;
+			OdfTable.newTable(masterPage1.newStyleHeaderElement(), getTestTableRowLabel(rowCount), getTestTableRowLabel(columnCount), getTestTableDataDouble(rowCount, columnCount));
+			OdfTable.newTable(masterPage1.newStyleFooterElement(), getTestTableRowLabel(rowCount), getTestTableRowLabel(columnCount), getTestTableDataDouble(rowCount, columnCount));
+
+			// ToDo: Should be added as test when header/footer styles are supported in ODFDOM
+//			HashMap<String, String> pageProps1 = getPageStyleProps(odfDoc, masterPage1);
+//			HashMap<String, String> footerProps1 = getFooterStyleProps(odfDoc, masterPage1);
+//			HashMap<String, String> headerProps1 = getHeaderStyleProps(odfDoc, masterPage1);
+
+			odfDoc.save(ResourceUtilities.newTestOutputFile("TestHeaderFooter.odt"));
+			odfDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestHeaderFooter.odt"));
+			Map<String, StyleMasterPageElement> masterPages2 = odfDoc.getMasterPages();
+			StyleMasterPageElement masterPage2 = masterPages2.get("Standard");
+
+				// Test if the new footer exists
+			StyleHeaderElement headerContentRoot2 = OdfElement.findFirstChildNode(StyleHeaderElement.class, masterPage2);
+			Assert.assertNotNull(headerContentRoot2);
+			StyleFooterElement footerContentRoot2 = OdfElement.findFirstChildNode(StyleFooterElement.class, masterPage2);
+			Assert.assertNotNull(footerContentRoot2);
+			
+		} catch (Exception ex) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, ex);
+		}
+
+	}
+
+	private Map<String, StyleMasterPageElement> getMasterPages(OdfDocument doc) throws Exception {
+	
+		OdfStylesDom stylesDoc = doc.getStylesDom();
+		OfficeMasterStylesElement masterStyles = OdfElement.findFirstChildNode(OfficeMasterStylesElement.class, stylesDoc.getRootElement());
+		Map<String, StyleMasterPageElement> masterPages = null;
+		if (masterStyles != null) {
+			NodeList lstMasterPages = stylesDoc.getElementsByTagNameNS(OdfDocumentNamespace.STYLE.getUri(), "master-page");
+			if (lstMasterPages != null && lstMasterPages.getLength() > 0) {
+				masterPages = new HashMap<String, StyleMasterPageElement>();
+				for (int i = 0; i < lstMasterPages.getLength(); i++) {
+					StyleMasterPageElement masterPage = (StyleMasterPageElement) lstMasterPages.item(i); //Take the node from the list
+					// ODFDOM ToDo?: Drop Attribute Suffix for methods returning String values and NOT Attributes
+					// ODFDOM ToDo?: Why is a method with Attirbute ending returng the value? BETTER: Drop the suffix?
+					String styleName = masterPage.getStyleNameAttribute();
+					masterPages.put(styleName, masterPage);
+				}
+			}
+		}
+		return masterPages;
+	}
+
+	// ODFDOM ToDo: http://odftoolkit.org/bugzilla/show_bug.cgi?id=293
+	// 293 - Adding optional Maps to generated ODF sources for indexed ODF elements
+	// Method To be moved on StyleMasterPageElement
+	private HashMap<String, String> getPageStyleProps(OdfDocument odfDoc, StyleMasterPageElement masterPage) throws Exception {
+		StylePageLayoutElement pageLayout = getMasterPageLayout(odfDoc, masterPage);
+
+		// ToDo: Access methods for MasterPage children NOT available!! & drop prefix/suffix
+		StylePageLayoutPropertiesElement pagePropsElement = OdfElement.findFirstChildNode(StylePageLayoutPropertiesElement.class, pageLayout);
+		Assert.assertNotNull(pagePropsElement);
+
+		// fill map with header attributes name/values
+		HashMap<String, String> pageProps = new HashMap<String, String>();
+		NamedNodeMap pageAttrs = pagePropsElement.getAttributes();
+		for (int i = 0; i < pageAttrs.getLength(); i++) {
+			pageProps.put(pageAttrs.item(i).getNamespaceURI() + pageAttrs.item(i).getLocalName(), pageAttrs.item(i).getNodeValue());
+		}
+		return pageProps;
+	}
+
+	// ODFDOM ToDo: http://odftoolkit.org/bugzilla/show_bug.cgi?id=293
+	// 293 - Adding optional Maps to generated ODF sources for indexed ODF elements
+	// Method To be moved on StyleMasterPageElement
+	private HashMap<String, String> getHeaderStyleProps(OdfDocument odfDoc, StyleMasterPageElement masterPage) throws Exception {
+		StylePageLayoutElement pageLayout = getMasterPageLayout(odfDoc, masterPage);
+		// ToDo: Combine a GETTER for header Properties in one method
+		StyleHeaderStyleElement headerStyle = OdfElement.findFirstChildNode(StyleHeaderStyleElement.class, pageLayout);
+		Assert.assertNotNull(headerStyle);
+		StyleHeaderFooterPropertiesElement headerStyleProps = OdfElement.findFirstChildNode(StyleHeaderFooterPropertiesElement.class, headerStyle);
+		Assert.assertNotNull(headerStyleProps);
+		// fill map with header attributes name/values
+		HashMap<String, String> headerProps = new HashMap<String, String>();
+		NamedNodeMap headerAttrs = headerStyleProps.getAttributes();
+		for (int i = 0; i < headerAttrs.getLength(); i++) {
+			headerProps.put(headerAttrs.item(i).getNamespaceURI() + headerAttrs.item(i).getLocalName(), headerAttrs.item(i).getNodeValue());
+		}
+		return headerProps;
+	}
+
+	// ODFDOM ToDo: http://odftoolkit.org/bugzilla/show_bug.cgi?id=293
+	// 293 - Adding optional Maps to generated ODF sources for indexed ODF elements
+	// Method To be moved on StyleMasterPageElement
+	private HashMap<String, String> getFooterStyleProps(OdfDocument odfDoc, StyleMasterPageElement masterPage) throws Exception {
+		StylePageLayoutElement pageLayout = getMasterPageLayout(odfDoc, masterPage);
+		// ODFDOM ToDo: Combine a GETTER for footer Properties in one method
+		StyleFooterStyleElement footerStyle = OdfElement.findFirstChildNode(StyleFooterStyleElement.class, pageLayout);
+		Assert.assertNotNull(footerStyle);
+		StyleHeaderFooterPropertiesElement footerStyleProps = OdfElement.findFirstChildNode(StyleHeaderFooterPropertiesElement.class, footerStyle);
+		Assert.assertNotNull(footerStyleProps);
+
+		// fill map with header attributes name/values
+		HashMap<String, String> footerProps = new HashMap<String, String>();
+		NamedNodeMap footerAttrs = footerStyleProps.getAttributes();
+		for (int i = 0; i < footerAttrs.getLength(); i++) {
+			footerProps.put(footerAttrs.item(i).getNamespaceURI() + footerAttrs.item(i).getLocalName(), footerAttrs.item(i).getNodeValue());
+		}
+		return footerProps;
+	}
+
+	// ODFDOM ToDo: http://odftoolkit.org/bugzilla/show_bug.cgi?id=292
+	// 292 - Usability: Generated ODF classes shall provide getter to element children
+	// Method should be generated per se
+	private StylePageLayoutElement getMasterPageLayout(OdfDocument odfDoc, StyleMasterPageElement masterPage) throws Exception {
+		// ODFDOM ToDo: Drop StylePageLayout as convenient and move those functions to convenient DOM part
+		// ODFDOM ToDo: Drop "Odf" Prefix, Drop Styles Prefix
+		// ODFDOM ToDo: Add methods to dedicated generated classes? (e.g. OfficeAutomaticStylesElement ?) BEST -- fill into a existing Java tempalte?
+		String pageLayoutName = masterPage.getStylePageLayoutNameAttribute();
+		Assert.assertNotNull(pageLayoutName);
+		StylePageLayoutElement pageLayout = odfDoc.getStylesDom().getAutomaticStyles().getPageLayout(pageLayoutName);
+		Assert.assertNotNull(pageLayout);
+		return pageLayout;
+	}
+
+	private void testAppendRow(TableTableElement table) {
+		OdfTable fTable = OdfTable.getInstance(table);
+		int count = fTable.getRowCount();
+		fTable.appendRow();
+		int newcount = fTable.getRowCount();
+		Assert.assertEquals(count + 1, newcount);
+	}
+
+	private void saveods() {
+		try {
+			mOdsDoc.save(ResourceUtilities.newTestOutputFile(mOdsTestFileName + "Output.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void saveodt(String filename) {
+		try {
+			mOdtDoc.save(ResourceUtilities.newTestOutputFile(filename));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfHeadingTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfHeadingTest.java
new file mode 100644
index 0000000..3b01add
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfHeadingTest.java
@@ -0,0 +1,263 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.doc.text;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author instructor
+ */
+public class OdfHeadingTest {
+
+	private static final Logger LOG = Logger.getLogger(OdfHeadingTest.class.getName());
+	OdfTextDocument doc;
+	OdfFileDom dom;
+
+	public OdfHeadingTest() {
+	}
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = OdfTextDocument.newTextDocument();
+			dom = doc.getContentDom();
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test of addContent method, of class OdfHeading.
+	 */
+	@Test
+	public void testAddContent() {
+		LOG.info("addContent");
+		String content = "heading content";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContent(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(content, node.getTextContent());
+	}
+
+	/**
+	 * Test of addContentWhitespace method, of class OdfTextH.
+	 */
+	@Test
+	public void testAddContentWhitespace() {
+		LOG.info("text:h addContentWhitespace");
+		String content = "a\tb";
+		String part1 = "a";
+		String part2 = "b";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContentWhitespace(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+		node = node.getNextSibling();
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.TEXT.getUri(),
+				node.getNamespaceURI());
+		Assert.assertEquals("tab", node.getLocalName());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+	/**
+	 * Test of addStyledContent method, of class OdfHeading.
+	 */
+	@Test
+	public void testAddStyledContent() {
+		LOG.info("addStyleContent");
+		String content = "heading content";
+		String styleName = "testStyle";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), content);
+		Assert.assertEquals(instance.getStyleName(), styleName);
+	}
+
+	/**
+	 * Test of addStyledContentWhitespace method, of class OdfTextH.
+	 */
+	@Test
+	public void testAddStyledContentWhitespace() {
+		LOG.info("text:h addStyledContentWhitespace");
+		String content = "a\nb";
+		String part1 = "a";
+		String part2 = "b";
+		String styleName = "testStyle";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContentWhitespace(styleName, content);
+		Assert.assertEquals(styleName, instance.getStyleName());
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+		node = node.getNextSibling();
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.TEXT.getUri(),
+				node.getNamespaceURI());
+		Assert.assertEquals("line-break", node.getLocalName());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+	/**
+	 * Test of addStyledSpan method, of class OdfHeading.
+	 */
+	@Test
+	public void testAddStyledSpan() {
+		LOG.info("addStyleSpan");
+		String content = "heading content";
+		String spanContent = "span content";
+		String styleName = "testStyle";
+		String spanStyleName = "spanStyle";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		OdfTextSpan subElement;
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content).addStyledSpan(
+				spanStyleName, spanContent);
+
+		// first item should be text
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), content);
+		Assert.assertEquals(instance.getStyleName(), styleName);
+
+		// followed by a span
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertTrue(node instanceof OdfTextSpan);
+		subElement = (OdfTextSpan) node;
+
+		// with correct style and content
+		Assert.assertEquals(subElement.getStyleName(), spanStyleName);
+		node = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), spanContent);
+
+	}
+
+	/**
+	 * Test of addStyledSpan method, of class OdfTextP.
+	 */
+	@Test
+	public void testAddStyledSpanWhitespace() {
+		LOG.info("text:h addStyledSpanWhitespace");
+		String content = "heading content";
+		String spanContent = "span    content";  // four blanks
+		String part1 = "span ";
+		String part2 = "content";
+		String styleName = "testStyle";
+		String spanStyleName = "spanStyle";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		OdfTextSpan subElement;
+		Element element;
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content).addStyledSpanWhitespace(
+				spanStyleName, spanContent);
+
+		// first item should be text
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(content, node.getTextContent());
+		Assert.assertEquals(styleName, instance.getStyleName());
+
+		// followed by a span
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertTrue(node instanceof OdfTextSpan);
+		subElement = (OdfTextSpan) node;
+
+		// with correct style and content
+		Assert.assertEquals(subElement.getStyleName(), spanStyleName);
+		node = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals("s", node.getLocalName());
+		element = (Element) node;
+		Assert.assertEquals("3", element.getAttributeNS(
+				OdfDocumentNamespace.TEXT.getUri(), "c"));
+
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfListStyleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfListStyleTest.java
new file mode 100644
index 0000000..ec9e2a7
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfListStyleTest.java
@@ -0,0 +1,227 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.doc.text;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleElementBase;
+import org.odftoolkit.odfdom.dom.style.props.OdfListLevelProperties;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListLevelStyleBullet;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListLevelStyleNumber;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author J David Eisenberg
+ */
+public class OdfListStyleTest {
+	private static final Logger LOG = Logger.getLogger(OdfListStyleTest.class.getName());
+    OdfTextDocument doc;
+	OdfFileDom dom;
+	OdfOfficeAutomaticStyles documentStyles;
+
+	String[] listSpecTest = {
+		"*,>,##",
+		"I./1:/a)",
+		"1.!\u273f!(a)",
+	};
+
+	String[] delim = { ",", "/", "!" };
+
+	boolean[] show = { false, true, false };
+
+	String[][] levelType = { // B=bullet, N = numeric
+		{"B","B","B"},
+		{"N","N","N"},
+		{"N","B","N"}
+	};
+
+	String[][] formatChar = { // 1,I,a,A for numeric, char for bullet
+		{"*", ">", "#" },
+		{"I", "1", "a" },
+		{"1", "\u273f", "a"}
+	};
+
+	String[][] prefixSuffix = { // separated by slashes
+		{"/", "/", "/" },
+		{"/.", "/:", "/)"},
+		{"/.", "/", "(/)" }
+	};
+
+    public OdfListStyleTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfTextDocument.newTextDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	    @Test
+    public void testBuildFromFormat() {
+		int i;
+		
+        LOG.info("createListStyle");
+        OdfTextListStyle instance = null;
+
+        for (i = 0; i < listSpecTest.length; i++)
+		{
+			LOG.info("List Format: " + listSpecTest[i]);
+			instance = new OdfTextListStyle(dom, "list" + i,
+				listSpecTest[i], delim[i], "1cm", show[i]);
+
+			Assert.assertNotNull(instance.getFirstChild());
+
+			checkNodes(instance, i);
+		}
+	}
+
+	/**
+	 * Test of addContent method, of class OdfListStyle.
+	 */
+	@Test
+	public void testAddContent() {
+		LOG.info("addContent");
+		String content = "heading content";
+		OdfTextHeading instance = new OdfTextHeading(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContent(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(content, node.getTextContent());
+	}
+
+	private void checkNodes(Node node, int position)
+	{
+		OdfTextListStyle theStyle;
+		OdfTextListLevelStyleBullet bullet;
+		OdfTextListLevelStyleNumber number;
+		TextListLevelStyleElementBase base;
+
+		int i = 0;
+		theStyle = (OdfTextListStyle) node;
+		Assert.assertTrue("Style name " +
+			theStyle.getStyleNameAttribute() + " incorrect",
+			theStyle.getStyleNameAttribute().equals("list" + position));
+		node = node.getFirstChild();
+
+		while (node != null)
+		{
+			Assert.assertTrue("More nodes than specifiers",
+				i < levelType[position].length);
+			String[] surround;
+			if (prefixSuffix[position][i].equals("/"))
+			{
+				surround = new String[2];
+				surround[0] = "";
+				surround[1] = "";
+			}
+			else
+			{
+				surround = prefixSuffix[position][i].split("/");
+			}
+			if (levelType[position][i].equals("B"))
+			{
+				Assert.assertTrue("Class is not bullet",
+					node instanceof OdfTextListLevelStyleBullet);
+				bullet = (OdfTextListLevelStyleBullet) node;
+				base = bullet;
+				Assert.assertEquals("Prefix incorrect",
+					surround[0], bullet.getStyleNumPrefixAttribute());
+				Assert.assertEquals("Suffix incorrect", surround[1],
+					bullet.getStyleNumSuffixAttribute());
+			}
+			else
+			{
+				Assert.assertTrue("Class is not number",
+					node instanceof OdfTextListLevelStyleNumber);
+				number = (OdfTextListLevelStyleNumber) node;
+				Assert.assertEquals(formatChar[position][i],
+					number.getStyleNumFormatAttribute());
+				base = number;
+				Assert.assertEquals("Prefix incorrect",
+					surround[0], number.getStyleNumPrefixAttribute());
+				Assert.assertEquals("Suffix incorrect", surround[1],
+					number.getStyleNumSuffixAttribute());
+			}
+			Assert.assertEquals("Level incorrect",
+				i+1, base.getTextLevelAttribute().intValue());
+
+			checkNumber(
+				"SpaceBefore",
+				base.getProperty(OdfListLevelProperties.SpaceBefore),
+				i+1);
+
+			checkNumber(
+				"MinLabelWidth",
+				base.getProperty(OdfListLevelProperties.MinLabelWidth),
+				1.0);
+
+			node = node.getNextSibling();
+			i++;
+		}
+    }
+
+	private void checkNumber(String message, String cssLength, double expected)
+	{
+		String cssAmount = cssLength.replaceFirst("cm","");
+		double amount = Double.valueOf(cssAmount);
+		Assert.assertEquals(message + " incorrect", expected, amount, 0.01);
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfListTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfListTest.java
new file mode 100644
index 0000000..d95e3a5
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfListTest.java
@@ -0,0 +1,180 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.doc.text;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextList;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author J David Eisenberg
+ */
+public class OdfListTest {
+	private static final Logger LOG = Logger.getLogger(OdfListTest.class.getName());
+    OdfTextDocument doc;
+	OdfFileDom dom;
+	OdfOfficeAutomaticStyles documentStyles;
+
+	/*
+	 * This list purposely does not go in strict hierarchial order;
+	 * it skips around levels to make sure that the
+	 * proper elements are being produced in the correct places
+	 * without extraneous empty OdfListItems.
+	 */
+	String[] listContent = {
+		"Level zero A",
+		">>>>Level four A",
+		">>>>Level four B",
+		">>Level two A",
+		">>Level two B",
+		">>>Level three A",
+		">>>Level three B",
+		"Level zero B"
+	};
+
+	/*
+	 * L: expecting an OdfList
+	 * I: expecting an OdfItem
+	 * P: expecting an OdfParagraph with given content
+	 */
+	String[] expected = {
+		"L", "I", "PLevel zero A",
+		"L","I",
+		"L","I",
+		"L","I",
+		"L","I","PLevel four A",
+		"I", "PLevel four B",
+		"I", "PLevel two A", "I", "PLevel two B",
+		"L", "I", "PLevel three A", "I", "PLevel three B",
+		"I", "PLevel zero B"
+	};
+
+	int position = 0;
+
+    public OdfListTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfTextDocument.newTextDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+
+	/**
+	 * Test of constructor, of class OdfListStyle.
+	 */
+	@Test
+	public void testOdfList() {
+		LOG.info("odfList constructor");
+		String styleName = "lstyle";
+
+		OdfTextList instance = new OdfTextList(dom,
+			listContent, '>', styleName);
+		Node node;
+		Assert.assertNotNull(instance);
+		node = instance;
+		checkNode(node);
+	}
+
+	private void checkNode(Node node)
+	{
+		while (node != null)
+		{
+			Assert.assertTrue("More nodes than expected",
+				position < expected.length);
+			
+			if (expected[position].startsWith("L"))
+			{
+				Assert.assertTrue("Not a list", node instanceof OdfTextList);
+				position++;
+				if (node.hasChildNodes())
+				{
+					checkNode(node.getFirstChild());
+				}
+			}
+			else if (expected[position].startsWith("I"))
+			{
+				Assert.assertTrue("Not an item", node instanceof TextListItemElement);
+				position++;
+				if (node.hasChildNodes())
+				{
+					checkNode(node.getFirstChild());
+				}
+			}
+			else // it's a paragraph
+			{
+				checkParagraph(node, expected[position].substring(1));
+				position++;
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	private void checkParagraph(Node node, String value)
+	{
+		Node child;
+		Assert.assertTrue("Not a paragraph", node instanceof
+			TextPElement);
+		Assert.assertTrue("Paragraph has no child",
+			node.hasChildNodes());
+		child = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, child.getNodeType());
+		Assert.assertEquals(value, child.getTextContent());
+   }
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfParagraphTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfParagraphTest.java
new file mode 100644
index 0000000..87e915b
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfParagraphTest.java
@@ -0,0 +1,267 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.doc.text;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author instructor
+ */
+public class OdfParagraphTest {
+	private static final Logger LOG = Logger.getLogger(OdfParagraphTest.class.getName());
+    OdfTextDocument doc;
+	OdfFileDom dom;
+
+    public OdfParagraphTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfTextDocument.newTextDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	/**
+	 * Test of addContent method, of class OdfParagraph.
+	 */
+	@Test
+	public void testAddContent() {
+		LOG.info("addContent");
+		String content = "paragraph content";
+		OdfTextParagraph instance = new OdfTextParagraph(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContent(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(content, node.getTextContent());
+	}
+
+	/**
+	 * Test of addContentWhitespace method, of class OdfTextP.
+	 */
+	@Test
+	public void testAddContentWhitespace() {
+		LOG.info("text:p addContentWhitespace");
+		String content = "a\tb";
+		String part1 = "a";
+		String part2 = "b";
+		OdfTextParagraph instance = new OdfTextParagraph(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContentWhitespace(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+		node = node.getNextSibling();
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.TEXT.getUri(),
+			node.getNamespaceURI());
+		Assert.assertEquals("tab", node.getLocalName());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+    /**
+	 * Test of addStyledContent method, of class OdfParagraph.
+	 */
+	@Test
+	public void testAddStyledContent() {
+		LOG.info("addStyleContent");
+		String content = "paragraph content";
+		String styleName = "testStyle";
+		OdfTextParagraph instance = new OdfTextParagraph(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), content);
+		Assert.assertEquals(instance.getStyleName(), styleName);
+	}
+
+	/**
+	 * Test of addStyledContentWhitespace method, of class OdfTextP.
+	 */
+	@Test
+	public void testAddStyledContentWhitespace() {
+		LOG.info("text:p addStyledContentWhitespace");
+		String content = "a\nb";
+		String part1 = "a";
+		String part2 = "b";
+		String styleName = "testStyle";
+		OdfTextParagraph instance = new OdfTextParagraph(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContentWhitespace(styleName, content);
+		Assert.assertEquals(styleName, instance.getStyleName());
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+		node = node.getNextSibling();
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals(OdfDocumentNamespace.TEXT.getUri(),
+			node.getNamespaceURI());
+		Assert.assertEquals("line-break", node.getLocalName());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+	/**
+	 * Test of addStyledSpan method, of class OdfParagraph.
+	 */
+	@Test
+	public void testAddStyledSpan() {
+		LOG.info("addStyleSpan");
+		String content = "heading content";
+		String spanContent = "span content";
+		String styleName = "testStyle";
+		String spanStyleName = "spanStyle";
+		OdfTextParagraph instance = new OdfTextParagraph(dom);
+		OdfTextSpan subElement;
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content).addStyledSpan(
+			spanStyleName, spanContent);
+
+		// first item should be text
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), content);
+		Assert.assertEquals(instance.getStyleName(), styleName);
+
+		// followed by a span
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertTrue(node instanceof OdfTextSpan);
+		subElement = (OdfTextSpan) node;
+
+		// with correct style and content
+		Assert.assertEquals(subElement.getStyleName(), spanStyleName);
+		node = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), spanContent);
+	}
+
+	/**
+	 * Test of addStyledSpan method, of class OdfTextP.
+	 */
+	@Test
+	public void testAddStyledSpanWhitespace() {
+		LOG.info("text:p addStyledSpanWhitespace");
+		String content = "heading content";
+		String spanContent = "span    content";  // four blanks
+		String part1 = "span ";
+		String part2 = "content";
+		String styleName = "testStyle";
+		String spanStyleName = "spanStyle";
+		OdfTextParagraph instance = new OdfTextParagraph(dom);
+		OdfTextSpan subElement;
+		Element element;
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content).addStyledSpanWhitespace(
+			spanStyleName, spanContent);
+
+		// first item should be text
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(content, node.getTextContent());
+		Assert.assertEquals(styleName, instance.getStyleName());
+
+		// followed by a span
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertTrue(node instanceof OdfTextSpan);
+		subElement = (OdfTextSpan) node;
+
+		// with correct style and content
+		Assert.assertEquals(subElement.getStyleName(), spanStyleName);
+		node = node.getFirstChild();
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals("s", node.getLocalName());
+		element = (Element) node;
+		Assert.assertEquals("3", element.getAttributeNS(
+			OdfDocumentNamespace.TEXT.getUri(), "c"));
+
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfSpanTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfSpanTest.java
new file mode 100644
index 0000000..90909c8
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfSpanTest.java
@@ -0,0 +1,170 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.doc.text;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author instructor
+ */
+public class OdfSpanTest {
+	private static final Logger LOG = Logger.getLogger(OdfSpanTest.class.getName());
+    OdfTextDocument doc;
+	OdfFileDom dom;
+
+    public OdfSpanTest() {
+    }
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
+        try
+        {
+            doc = OdfTextDocument.newTextDocument();
+			dom = doc.getContentDom();
+        }
+        catch (Exception e)
+        {
+        	LOG.log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	/**
+	 * Test of addContent method, of class OdfSpan.
+	 */
+	@Test
+	public void testAddContent() {
+		LOG.info("addContent");
+		String content = "span content";
+		OdfTextSpan instance = new OdfTextSpan(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContent(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(content, node.getTextContent());
+	}
+    
+	/**
+	 * Test of addContent method, of class OdfSpan.
+	 */
+	@Test
+	public void testAddContentWhitespace() {
+		LOG.info("text:span addContentWhitespace");
+		String content = "span\tcontent";
+		String part1 = "span";
+		String part2 = "content";
+		OdfTextSpan instance = new OdfTextSpan(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addContentWhitespace(content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals("tab", node.getLocalName());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+	/**
+	 * Test of addStyledContent method, of class OdfSpan.
+	 */
+	@Test
+	public void testAddStyledContent() {
+		LOG.info("addStyleContent");
+		String content = "span content";
+		String styleName = "testStyle";
+		OdfTextSpan instance = new OdfTextSpan(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContent(styleName, content);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(node.getTextContent(), content);
+		Assert.assertEquals(instance.getStyleName(), styleName);
+	}
+
+	/**
+	 * Test of addStyledContent method, of class OdfSpan.
+	 */
+	@Test
+	public void testAddStyledContentWhitespace() {
+		LOG.info("text:span addStyledContentWhitespace");
+		String content = "span\ncontent";
+		String styleName = "testStyle";
+		String part1 = "span";
+		String part2 = "content";
+		OdfTextSpan instance = new OdfTextSpan(dom);
+		Node node;
+		Assert.assertNotNull(instance);
+		instance.addStyledContentWhitespace(styleName, content);
+		Assert.assertEquals(instance.getStyleName(), styleName);
+		node = instance.getFirstChild();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part1, node.getTextContent());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+		Assert.assertEquals("line-break", node.getLocalName());
+		node = node.getNextSibling();
+		Assert.assertNotNull(node);
+		Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+		Assert.assertEquals(part2, node.getTextContent());
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfWhitespaceProcessorTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfWhitespaceProcessorTest.java
new file mode 100644
index 0000000..be397dd
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/doc/text/OdfWhitespaceProcessorTest.java
@@ -0,0 +1,195 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.doc.text;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfWhitespaceProcessor;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * 
+ * @author J David Eisenberg
+ */
+public class OdfWhitespaceProcessorTest {
+	private static final Logger LOG = Logger.getLogger(OdfWhitespaceProcessorTest.class.getName());
+	OdfTextDocument doc;
+	OdfFileDom dom;
+	String[] plainText = { "nospace", "one space", "two  spaces",
+			"three   spaces", "   three leading spaces",
+			"three trailing spaces   ", "one\ttab", "two\t\ttabs",
+			"\tleading tab", "trailing tab\t", "mixed   \t   spaces and tabs",
+			"line\nbreak" };
+
+	String[][] elementResult = { { "nospace" }, { "one space" },
+			{ "two ", "*s1", "spaces" }, { "three ", "*s2", "spaces" },
+			{ " ", "*s2", "three leading spaces" },
+			{ "three trailing spaces ", "*s2" }, { "one", "*t", "tab" },
+			{ "two", "*t", "*t", "tabs" }, { "*t", "leading tab" },
+			{ "trailing tab", "*t" },
+			{ "mixed ", "*s2", "*t", " ", "*s2", "spaces and tabs" },
+			{ "line", "*n", "break" } };
+
+	public OdfWhitespaceProcessorTest() {
+	}
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = OdfTextDocument.newTextDocument();
+			dom = doc.getContentDom();
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test of append method, of class OdfWhitespaceProcessor.
+	 */
+	@Test
+	public void testAppend() {
+		LOG.info("append");
+		Element element = null;
+		OdfWhitespaceProcessor instance = new OdfWhitespaceProcessor();
+		int i;
+		for (i = 0; i < plainText.length; i++) {
+			element = new OdfTextParagraph(dom);
+			instance.append(element, plainText[i]);
+			compareResults(element, plainText[i], elementResult[i]);
+		}
+	}
+
+	private void compareResults(Element element, String input, String[] output) {
+		int i;
+		int nSpaces;
+		int nSpacesInAttribute;
+		Node node = element.getFirstChild();
+		for (i = 0; i < output.length; i++) {
+			if (output[i].startsWith("*")) {
+				Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+				if (output[i].equals("*t")) {
+					Assert.assertEquals("tab", node.getLocalName());
+				} else if (output[i].equals("*n")) {
+					Assert.assertEquals("line-break", node.getLocalName());
+				} else {
+					nSpaces = Integer.parseInt(output[i].substring(2));
+					Assert.assertEquals(node.getLocalName(), "s");
+					nSpacesInAttribute = Integer.parseInt(((Element) node)
+							.getAttribute("text:c"));
+					Assert.assertEquals(nSpaces, nSpacesInAttribute);
+				}
+			} else {
+				Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+				Assert.assertEquals(output[i], node.getTextContent());
+			}
+			node = node.getNextSibling();
+		}
+		Assert.assertEquals(node, null);
+	}
+
+	/**
+	 * Test of getText method, of class OdfWhitespaceProcessor.
+	 */
+	@Test
+	public void testGetText() {
+		LOG.info("getText");
+		Node element = null;
+		OdfWhitespaceProcessor instance = new OdfWhitespaceProcessor();
+		int i;
+		String expResult = "";
+		String result;
+		for (i = 0; i < plainText.length; i++) {
+			element = new OdfTextParagraph(dom);
+			constructElement(element, elementResult[i]);
+			result = plainText[i];
+			expResult = instance.getText(element);
+			Assert.assertEquals(expResult, result);
+		}
+	}
+
+	private void constructElement(Node element, String[] expected) {
+		int i;
+		int nSpaces;
+		TextSElement spaceElement;
+
+		for (i = 0; i < expected.length; i++) {
+			if (expected[i].startsWith("*")) {
+				if (expected[i].equals("*t")) {
+					element.appendChild(new TextTabElement(dom));
+				} else if (expected[i].equals("*n")) {
+					element.appendChild(new TextLineBreakElement(dom));
+				} else {
+					nSpaces = Integer.parseInt(expected[i].substring(2));
+					spaceElement = new TextSElement(dom);
+					spaceElement.setTextCAttribute(nSpaces);
+					element.appendChild(spaceElement);
+				}
+			} else {
+				element.appendChild(dom.createTextNode(expected[i]));
+			}
+		}
+	}
+
+	/**
+	 * Test of appendText method, of class OdfWhitespaceProcessor.
+	 */
+	@Test
+	public void testAppendText() {
+		LOG.info("appendText");
+		Element element = null;
+		int i;
+		for (i = 0; i < plainText.length; i++) {
+			element = new OdfTextParagraph(dom);
+			OdfWhitespaceProcessor.appendText(element, plainText[i]);
+			compareResults(element, plainText[i], elementResult[i]);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/XPathTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/XPathTest.java
new file mode 100644
index 0000000..436e1ea
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/XPathTest.java
@@ -0,0 +1,256 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.pkg.OdfAlienElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfPresentationDocument;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XPathTest {
+
+	private static final Logger LOG = Logger.getLogger(XPathTest.class.getName());
+	private static final String SOURCE_FILE_1 = "XPathTest-foreignPrefix.odp";
+	private static final String SOURCE_FILE_2 = "XPathTest-foreignPrefix2.odp";
+        private static final String SOURCE_FILE_3 = "XPathTest-duplicate-prefix.odt";
+	/**
+	 * 1) The first test document "XPathTest-foreignPrefix.odp" uses the prefix "daisy" instead of "office" for ODF XML elements.
+	   <daisy:document-content xmlns:daisy="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="ur...
+			<daisy:scripts/>
+			<daisy:automatic-styles>
+
+
+	 * 2) The test doc also uses multiple identical namespace prefixes with different URIs.
+	 * <text:p>Slide
+	 *		<draw:element1 xmlns:draw="urn://dummy-namespace-one">
+	 *			<draw:element2 xmlns:draw="urn://dummy-namespace-two"
+	 *				draw:attribute2="importantValue">dummy</draw:element2></draw:element1>One!!</text:p>
+	 * It will be tested, if they have been renamed correctly.
+
+	 * 3) The test doc also uses multiple different namespace prefixes with the similar URIs.
+	 *    Testing getPrefixes(String URI) from the NamespaceContext interface.
+	 * <text:p>Slide
+	 *		<prefixOne:element1 xmlns:prefixOne="urn://some-test-odfdom-namespace">
+	 *			<prefixTwo:element2 xmlns:prefixTwo="urn://some-test-odfdom-namespace"
+	 *				prefixTwo:attribute2="importantValue">dummy</prefixTwo:element2></prefixOne:element1>Two!!</text:p>
+	 *
+	 * 4) Having element and attribute without namespace
+	 * <!-- element and attribute without namespace with an attribute value with a namespace prefix as well -->
+       <text:p xmlns:alien="urn://some-test-attribute-value-namespace"
+	 *		foreign="alien:valueOfAlienAttribute">Some<test>good</test> Content!!</text:p>
+
+	 */
+	@Test
+	public void testXPathwithAlienNodes() throws Exception {
+		try {
+			OdfPresentationDocument odpWithSlides = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE_FILE_1));
+			OdfFileDom contentDom = odpWithSlides.getContentDom();
+
+			XPath xpath = contentDom.getXPath();
+			// Test scenario 1 - see comment above
+			Iterator<String> prefixes = contentDom.getPrefixes("urn:oasis:names:tc:opendocument:xmlns:office:1.0");
+			// The first prefix have to be "office"
+			String prefix = prefixes.next();
+			Assert.assertTrue(prefix.equals("office") || prefix.equals("daisy"));
+			if(prefix.equals("office")){
+				prefix = prefixes.next();
+				Assert.assertTrue(prefix.equals("daisy"));
+			}else if(prefix.equals("daisy")){
+				prefix = prefixes.next();
+				Assert.assertTrue(prefix.equals("office"));
+			}else{
+				Assert.fail();
+			}
+			// There should be no further prefix
+			Assert.assertFalse(prefixes.hasNext());
+					
+			Iterator<String> prefixes2 = contentDom.getPrefixes("urn://some-test-odfdom-namespace");
+			prefix = prefixes2.next();
+			Assert.assertTrue(prefix.equals("prefixOne") || prefix.equals("prefixTwo"));
+			if(prefix.equals("prefixOne")){
+				prefix = prefixes2.next();
+				Assert.assertTrue(prefix.equals("prefixTwo"));				
+			}else if(prefix.equals("prefixTwo")){
+				prefix = prefixes2.next();
+				Assert.assertTrue(prefix.equals("prefixOne"));				
+			}else{
+				Assert.fail();
+			}
+			// There should be no further prefix
+			Assert.assertFalse(prefixes.hasNext());
+
+			Node rootNode = contentDom.getRootElement();
+			odpWithSlides.save(ResourceUtilities.newTestOutputFile("XPathTest-ForeignPrefix-output.odp"));
+
+			if (rootNode instanceof OdfAlienElement) {
+				Assert.fail("The none OOO default prefix for office: was not exchanged!");
+			}
+			NodeList styleNameAttributes = (NodeList) xpath.evaluate(".//*[@style:name]", rootNode, XPathConstants.NODESET);
+			LOG.log(Level.INFO, "Amount of style:name is {0}", styleNameAttributes.getLength());
+
+			Assert.assertTrue(styleNameAttributes.getLength() == 11);
+			// test if the identical namespace prefixes with different URI have been renamed correctly (earlier draw:element1/draw:element2).
+			String attributeWithDuplicatePrefix = (String) xpath.evaluate(".//draw__1:element1/draw__2:element2/@draw__2:attribute2", rootNode, XPathConstants.STRING);
+			Assert.assertTrue(attributeWithDuplicatePrefix.equals("importantValue"));
+			Assert.assertEquals("urn:oasis:names:tc:opendocument:xmlns:office:1.0", xpath.getNamespaceContext().getNamespaceURI("office"));
+			Assert.assertEquals("http://www.w3.org/1999/xlink", xpath.getNamespaceContext().getNamespaceURI("xlink"));
+
+			String alienAttributeValue = (String) xpath.evaluate(".//*/@foreign", rootNode, XPathConstants.STRING);
+			LOG.log(Level.INFO, "The value of the alien attribute is {0}, expected is ''alien:valueOfAlienAttribute''!", alienAttributeValue);
+			Assert.assertEquals("alien:valueOfAlienAttribute", alienAttributeValue);
+
+			String alienElementValue = (String) xpath.evaluate("//text:p/test", rootNode, XPathConstants.STRING);
+			LOG.log(Level.INFO, "The value of the alien element is {0}, expected is ''good''!", alienElementValue);
+			Assert.assertEquals("good", alienElementValue);
+			LOG.log(Level.INFO, "Amount of @alien:foreignAttribute and @style:name is {0}", ((NodeList) xpath.evaluate(".//*[@alien:foreignAttribute or @style:name]", rootNode, XPathConstants.NODESET)).getLength());
+			Assert.assertTrue("Amount of @alien:foreignAttribute and @style:name is not 13!!", ((NodeList) xpath.evaluate(".//*[@alien:foreignAttribute or @style:name]", rootNode, XPathConstants.NODESET)).getLength() == 13);
+			
+			// Test if an empty iterator is being returned for a none existing URL
+			Iterator<String> prefixes3 = contentDom.getPrefixes("urn://this-prefix-does-not-exist-in-the-xml");
+			Assert.assertFalse("Not used prefix returned a none-empty iterator!", prefixes3.hasNext());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.toString());
+		}
+	}
+
+	/**
+	 * A typical test, that deals with xlinks in SOURCE_FILE_2
+	 */
+	@Test
+	public void testCopyForeignSlide() {
+		try {
+			OdfPresentationDocument targetodp = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE_FILE_1));
+			OdfPresentationDocument sourceodp = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE_FILE_2));
+
+			int slidecount = sourceodp.getSlideCount();
+			for (int i = 0; i < slidecount; i++) {
+				targetodp.copyForeignSlide(i, sourceodp, i);
+			}
+			targetodp.save(ResourceUtilities.newTestOutputFile("XPathTest-ForeignPrefix2-output.odp"));
+			targetodp.close();
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.toString());
+		}
+	}
+
+	/**
+	 * This test SHOULD fail, but it isn't. Its source code is identical to the first test in this unit test
+	 * @throws Exception
+	 */
+	@Test
+	public void testXPathIsMissingXLinkButItWillPassBecauseItTheSecondTestInThisUnitTest() throws Exception {
+		try {
+			OdfPresentationDocument odpWithSlides = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE_FILE_1));
+			OdfFileDom contentDom = odpWithSlides.getContentDom();
+			XPath xpath = contentDom.getXPath();
+
+			Node node = odpWithSlides.getContentDom().getRootElement();
+			NodeList linkNodes = (NodeList) xpath.evaluate(".//*[@xlink:href]", node, XPathConstants.NODESET);
+			Assert.assertNotNull(linkNodes);
+			Assert.assertEquals("urn:oasis:names:tc:opendocument:xmlns:office:1.0", xpath.getNamespaceContext().getNamespaceURI("office"));
+			Assert.assertEquals("http://www.w3.org/1999/xlink", xpath.getNamespaceContext().getNamespaceURI("xlink"));
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.toString());
+		}
+	}
+
+        /**
+         * This test checks if the XPath returned by OdfFileDom is correctly aware of namespacess.
+         * The NamespaceContext implementation in OdfFileDom is aware of duplicate prefixes, but getNamespaceURI(prefix)
+         * in OdfFileDom does not implement it correctly
+         *
+         * With the patch applied in OdfFileDom these tests pass correctly
+         *
+         * sample metadata rdf generate from Openoffice 3.3 looks like this :
+         * <?xml version="1.0" encoding="utf-8"?>
+         *   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+         *     <rdf:Description rdf:about="../content.xml#id1366098766">
+         *       <ns1:BungeniActionEvent xmlns:ns1="http://editor.bungeni.org/1.0/anx/"></ns1:BungeniActionEvent>
+         *       <ns2:BungeniSectionID xmlns:ns2="http://editor.bungeni.org/1.0/anx/">Xda+5VC/SQKKG7Bk83a2JA</ns2:BungeniSectionID>
+         *       <ns3:BungeniSectionType xmlns:ns3="http://editor.bungeni.org/1.0/anx/">Conclusion</ns3:BungeniSectionType>
+         *       <ns4:hiddenBungeniMetaEditable xmlns:ns4="http://editor.bungeni.org/1.0/anx/">false</ns4:hiddenBungeniMetaEditable>
+         *     </rdf:Description>
+         *
+         * @throws Exception
+         */
+        @Test
+        public void testXPathDuplicatePrefixForForeignNamespace() throws Exception{
+           try {
+
+            OdfDocument odfDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE_FILE_3));
+            OdfFileDom fileDom = odfDoc.getFileDom("meta/meta.rdf");
+            
+            // add additional duplicate NS prefixes to the DOM
+            fileDom.setNamespace("anx", "http://editor.bungeni.org/1.0/anx/");
+            fileDom.setNamespace("myrdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
+
+            //get the XPath from the file dom and set its NS context to the OdfFileDom object
+            XPath xpathFileDom = fileDom.getXPath();
+            xpathFileDom.setNamespaceContext(fileDom);
+
+            //PASS - this works correctly
+            String rdfNsUri = fileDom.getNamespaceURI("rdf");
+            LOG.log(Level.INFO, "The value of the nsuri is {0} expected ns-uri is ''http://www.w3.org/1999/02/22-rdf-syntax-ns#''", rdfNsUri);
+            Assert.assertEquals("http://www.w3.org/1999/02/22-rdf-syntax-ns#", rdfNsUri);
+
+            //FAIL - for duplicate RDF ns prefix
+            String myrdfNsUri = fileDom.getNamespaceURI("myrdf");
+            LOG.log(Level.INFO, "The value of the nsuri is {0} expected ns-uri is ''http://www.w3.org/1999/02/22-rdf-syntax-ns#''", myrdfNsUri);
+            Assert.assertEquals("http://www.w3.org/1999/02/22-rdf-syntax-ns#", myrdfNsUri);
+
+            //PASS - for custom NS prefix in document, only the first one
+            String anxNsUri1 = fileDom.getNamespaceURI("ns1");
+            LOG.log(Level.INFO, "The value of the nsuri is {0} expected ns-uri is ''http://editor.bungeni.org/1.0/anx/''", anxNsUri1);
+            Assert.assertEquals("http://editor.bungeni.org/1.0/anx/", anxNsUri1);
+
+            //FAIL - for custom NS prefix in document ns3, ns4, ns...
+            String anxNsUri2 = fileDom.getNamespaceURI("ns2");
+            LOG.log(Level.INFO, "The value of the ns-uri is {0} expected ns-uri is ''http://editor.bungeni.org/1.0/anx/''", anxNsUri2);
+            Assert.assertEquals("http://editor.bungeni.org/1.0/anx/", anxNsUri2);
+
+            //FAIL - for custom duplicate NS prefix anx
+            String anxNsUriCustom = fileDom.getNamespaceURI("anx");
+            LOG.log(Level.INFO, "The value of the ns-uri is {0} expected ns-uri is ''http://editor.bungeni.org/1.0/anx/''", anxNsUriCustom);
+            Assert.assertEquals("http://editor.bungeni.org/1.0/anx/", anxNsUriCustom);
+
+           } catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.toString());
+           }
+        }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/LoadMultipleTimes.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/LoadMultipleTimes.java
new file mode 100644
index 0000000..b45eecd
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/LoadMultipleTimes.java
@@ -0,0 +1,71 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.example;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+
+public class LoadMultipleTimes {
+
+	final static int num = 50;
+	private static final Logger LOG = Logger.getLogger(LoadMultipleTimes.class.getName());
+
+	@Test
+	@Ignore
+	/** A testdocument will be loaded and closed repeatedly and the memory will be logged.
+	Loading is tested with and without disc memory usage */
+	public void testRepeatedLoading() {
+		System.setProperty("org.odftoolkit.odfdom.tmpfile.disable", "true");
+		repeatedLoading();
+		System.setProperty("org.odftoolkit.odfdom.tmpfile.disable", "false");
+		repeatedLoading();
+	}
+
+	// ToDO: Load instead the specification as extreme example (not neccessarily 50 times)
+	private void repeatedLoading() {
+		long t = 0;
+		for (int i = 0; i < num; i++) {
+			try {
+				long t1 = System.currentTimeMillis();
+				OdfDocument doc = OdfDocument.loadDocument("src/test/resources/test1.odt");
+				OdfContentDom dom1 = doc.getContentDom();
+				OdfStylesDom dom2 = doc.getStylesDom();
+				long t2 = System.currentTimeMillis() - t1;
+				t = t + t2;
+				LOG.info("Open in " + t2 + " milliseconds");
+				long f1 = Runtime.getRuntime().freeMemory();
+				doc.close();
+				Runtime.getRuntime().gc();
+				long f2 = Runtime.getRuntime().freeMemory();
+				LOG.info("Freemem pre-gc: " + f1 + ", post-gc: " + f2 + ", delta: " + (f1 - f2) + ".");
+			} catch (Exception ex) {
+				Logger.getLogger(LoadMultipleTimes.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		LOG.info("Opening " + num + " times took " + t + " milliseconds");
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleExample1.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleExample1.java
new file mode 100644
index 0000000..41fdd60
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleExample1.java
@@ -0,0 +1,68 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.example;
+
+
+class StyleExample1 {
+/* todo: refactor            
+    public static void main(String[] args) {
+
+        try {
+            OdfDocument odfdoc = OdfDocument.OdfDocument("test/resources/test1.odt");
+            LOG.info("parsed document.");
+            
+            OdfElement e = (OdfElement) odfdoc.getContentDom().getDocumentElement();
+            NodeAction dumpStyles = new NodeAction() {
+                protected void apply(Node node, Object arg, int depth) {
+                    String indent = new String();
+                    for (int i=0; i<depth; i++) indent += "  ";
+                    LOG.info(indent + node.getNodeName());
+                    if (node.getNodeType() == Node.TEXT_NODE) {
+                        LOG.info(": " + node.getNodeValue());
+                    }
+                    LOG.info();
+                    if (node instanceof OdfStylableElement) {
+                        try {
+                            LOG.info(indent + "-style info...");
+                            OdfStylableElement se = (OdfStylableElement) node;
+                            OdfStyle ds = se.getDocumentStyle();
+                            OdfStyle ls = se.getAutomaticStyle();
+                            if (ls != null) {
+                                LOG.info(indent + "-OdfLocalStyle: " + ls);
+                            }
+                            if (ds != null) {
+                                LOG.info(indent + "-OdfDocumentStyle: " + ds);
+                            }
+                        } catch (Exception ex) {
+                            Logger.getLogger(StyleExample1.class.getName()).log(Level.SEVERE, null, ex);
+                        }
+                    }
+                }
+            };       
+            dumpStyles.performAction(e, null);                
+            // serializeXml(e, System.out);                                    
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    } */
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleExamplesTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleExamplesTest.java
new file mode 100644
index 0000000..c6e573d
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleExamplesTest.java
@@ -0,0 +1,217 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.dom.example;
+
+import static java.util.logging.Level.INFO;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableRowPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.utils.NodeAction;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author j
+ */
+public class StyleExamplesTest {
+
+	private static String TEST_FILE = "test2.odt";
+	private static final Logger LOG = Logger.getLogger(StyleExamplesTest.class.getName());
+
+	static class DumpPropertyAndText extends NodeAction<ArrayList<String>> {
+
+		OdfStyleProperty desiredProperty; // = OdfTextProperties.FontName;
+
+		public DumpPropertyAndText(OdfStyleProperty desiredProperty) {
+			this.desiredProperty = desiredProperty;
+		}
+
+		@Override
+		protected void apply(Node textNode, ArrayList<String> fontAndText, int depth) {
+
+			if (textNode.getNodeType() != Node.TEXT_NODE) {
+				return;
+			}
+			if (textNode.hasChildNodes()) {
+				return;
+			}
+
+			LOG.finest(textNode.getParentNode().toString());
+
+			String teksto = textNode.getTextContent().trim();
+			if (teksto.length() == 0) {
+				return;
+			}
+
+			String font = StyleUtils.findActualStylePropertyValueForNode(textNode, desiredProperty);
+
+			LOG.log(Level.FINEST, "{0}: {1}", new Object[]{font, teksto});
+			fontAndText.add(font + ": " + teksto);
+		}
+	}
+
+	@Test
+	public void displayActualFontForEachTextNode() throws Exception {
+		OdfDocument odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+		OdfElement documentRoot = (OdfElement) odfDocument.getContentDom().getDocumentElement();
+
+		ArrayList<String> fontAndText = new ArrayList<String>();
+
+		DumpPropertyAndText dumpFontAndText = new DumpPropertyAndText(StyleTextPropertiesElement.FontName);
+		dumpFontAndText.performAction(documentRoot, fontAndText);
+
+		Assert.assertEquals("Thorndale: Hello", fontAndText.get(0));
+		Assert.assertEquals("Thorndale: world", fontAndText.get(1));
+		Assert.assertEquals("Thorndale: absatz", fontAndText.get(2));
+		Assert.assertEquals("Cumberland: z", fontAndText.get(3));
+		Assert.assertEquals("Cumberland: we", fontAndText.get(4));
+		Assert.assertEquals("Cumberland: i", fontAndText.get(5));
+		Assert.assertEquals("Thorndale: Absatz", fontAndText.get(6));
+		Assert.assertEquals("Thorndale: drei", fontAndText.get(7));
+		Assert.assertEquals("Thorndale: num 1", fontAndText.get(8));
+		Assert.assertEquals("Thorndale: num 2", fontAndText.get(9));
+		Assert.assertEquals("Thorndale: bullet1", fontAndText.get(10));
+		Assert.assertEquals("Thorndale: bullet2", fontAndText.get(11));
+	}
+
+	@Test
+	@SuppressWarnings("unchecked")
+	public void dumpAllStyles() throws Exception {
+		if (LOG.isLoggable(INFO)) {
+			OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+			LOG.info("Parsed document.");
+
+			OdfElement e = (OdfElement) odfdoc.getContentDom().getDocumentElement();
+			NodeAction dumpStyles = new NodeAction() {
+
+				@Override
+				protected void apply(Node node, Object arg, int depth) {
+					String indent = new String();
+					for (int i = 0; i < depth; i++) {
+						indent += "  ";
+					}
+					if (node.getNodeType() == Node.TEXT_NODE) {
+						LOG.log(INFO, "{0}{1}", new Object[]{indent, node.getNodeName()});
+						LOG.log(INFO, ": {0}\n", node.getNodeValue());
+					}
+					if (node instanceof OdfStylableElement) {
+						try {
+							//LOG.info(indent + "-style info...");
+							OdfStylableElement se = (OdfStylableElement) node;
+							OdfStyleBase as = se.getAutomaticStyle();
+							OdfStyle ds = se.getDocumentStyle();
+							if (as != null) {
+								LOG.log(INFO, "{0}-AutomaticStyle: {1}", new Object[]{indent, as});
+							}
+							if (ds != null) {
+								LOG.log(INFO, "{0}-OdfDocumentStyle: {1}", new Object[]{indent, ds});
+							}
+						} catch (Exception ex) {
+							LOG.log(Level.SEVERE, ex.getMessage(), ex);
+						}
+					}
+				}
+			};
+			dumpStyles.performAction(e, null);
+		}
+	}
+
+	@Test
+	public void testDefaultStyles() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+			doc.getDocumentStyles();
+			OdfDefaultStyle oDSG = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Graphic);
+			Assert.assertEquals(oDSG.getFamilyName(), OdfStyleFamily.Graphic.getName());
+			String prop1 = oDSG.getProperty(StyleGraphicPropertiesElement.ShadowOffsetX);
+			Assert.assertEquals(prop1, "0.1181in");
+
+			OdfDefaultStyle oDSP = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Paragraph);
+			Assert.assertEquals(oDSP.getFamilyName(), OdfStyleFamily.Paragraph.getName());
+			String prop2 = oDSP.getProperty(StyleTextPropertiesElement.FontName);
+			Assert.assertEquals(prop2, "Thorndale");
+			String prop3 = oDSP.getProperty(StyleTextPropertiesElement.LetterKerning);
+			Assert.assertEquals(prop3, "true");
+
+			OdfDefaultStyle oDST = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Table);
+			Assert.assertEquals(oDST.getFamilyName(), OdfStyleFamily.Table.getName());
+			String prop4 = oDST.getProperty(StyleTablePropertiesElement.BorderModel);
+			Assert.assertEquals(prop4, "collapsing");
+
+
+			OdfDefaultStyle oDSTR = doc.getDocumentStyles().getDefaultStyle(OdfStyleFamily.TableRow);
+			Assert.assertEquals(oDSTR.getFamilyName(), OdfStyleFamily.TableRow.getName());
+			String prop5 = oDSTR.getProperty(StyleTableRowPropertiesElement.KeepTogether);
+			Assert.assertEquals(prop5, "auto");
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+    @Test
+	@Ignore
+	/** Should there be a validation in the future? */
+    public void testSetValue() throws Exception {
+        OdfTextDocument odt = OdfTextDocument.newTextDocument();
+        OdfContentDom dom = odt.getContentDom();
+        OdfStyle style1 = new OdfStyle(dom);
+
+        // No exception should be thrown here
+        style1.setStyleFamilyAttribute(OdfStyleFamily.Paragraph.toString());
+        assertEquals(style1.getStyleFamilyAttribute(), OdfStyleFamily.Paragraph.toString());
+
+        // Catch only IllegalArgumentException
+        try {
+            style1.setStyleFamilyAttribute("ImSoInvalid");
+        } catch (IllegalArgumentException e) {
+            return;   // test passed
+        }
+        // We need an exception from the setValue method! Otherwise we don't know that an empty attribute node has to be removed
+        fail("An IllegalArgumentException has to be thrown for invalid attributes so the attribute node can be removed afterwards.");
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleUtils.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleUtils.java
new file mode 100644
index 0000000..f5ff8ea
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/StyleUtils.java
@@ -0,0 +1,76 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.dom.example;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.w3c.dom.Node;
+
+
+/**
+ *
+ * @author j
+ */
+class StyleUtils {
+
+  
+    /**
+     * Returns a property for a (text) node, as it would appear for a user in OpenOffice:
+     * First examining the style (and the style's parent styles) and if the property is not
+     * found the search continues in the enclosing node, and so on, until an enclosing node
+     * is found, whitc has a style (or an inherited style) where the property is defined.
+     * Example: findActualStylePropertyValueForNode(textNode, OdfTextProperties.FontName) will give the font name
+     * @param node (text) node to be examined
+     * @param propertyName for example OdfTextProperties.FontName
+     * @return proterty the value of the property, for example "Thorndale"
+     */
+    static String findActualStylePropertyValueForNode(Node node, OdfStyleProperty propertyName) {
+      Node nodeWithStyle = node;
+
+      while (nodeWithStyle!=null && !(nodeWithStyle instanceof OdfStylableElement)) {
+            nodeWithStyle = nodeWithStyle.getParentNode();
+        }
+
+      if (nodeWithStyle==null) {
+        // Property value not found in any nodes' styles!
+        return null;
+      }
+
+
+      String propertyValue = ((OdfStylableElement) nodeWithStyle).getProperty(propertyName);
+
+      if (propertyValue != null) {
+            return propertyValue;
+        }
+
+      // Continue the search in enclosing nodes
+      return findActualStylePropertyValueForNode(nodeWithStyle.getParentNode(), propertyName);
+
+    }
+
+    private StyleUtils() {
+    }
+
+
+
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/WikiExampleTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/WikiExampleTest.java
new file mode 100644
index 0000000..2aa31b1
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/dom/example/WikiExampleTest.java
@@ -0,0 +1,124 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.odfdom.dom.example;
+
+import java.net.URI;
+import org.junit.Ignore;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+
+/** The test was deactivated. As an invalid value will no longer throw an exception and cause the removal of the attribute. */
+public class WikiExampleTest {
+
+	@Test
+	@Ignore
+	public void testWikiExamples1() throws Exception {
+
+		// WIKI EXAMPLE I from http://odftoolkit.org/projects/odfdom/pages/Home
+
+		// Create a text document from a standard template (empty documents within the JAR)
+		OdfTextDocument odt = OdfTextDocument.newTextDocument();
+
+		// Append text to the end of the document.
+		odt.addText("This is my very first ODF test");
+
+		// Save document
+		odt.save("MyFilename.odt");
+	}
+
+
+	@Test
+	@Ignore
+	public void testWikiExamples2() throws Exception {
+
+		//********************************************************************
+		// WIKI EXAMPLE I from http://odftoolkit.org/projects/odfdom/pages/Layers
+
+		// loads the ODF document package from the path
+		OdfPackage pkg = OdfPackage.loadPackage("/home/myDocuments/myVacation.odt");
+
+		// loads the image from the URL and inserts the image in the package,
+		// adapting the manifest
+		pkg.insert(new URI("./myHoliday.png"), "Pictures/myHoliday.png", "image/png");
+		pkg.save("/home/myDocuments/myVacation.odt");
+
+
+
+		//********************************************************************
+		// WIKI EXAMPLE II from http://odftoolkit.org/projects/odfdom/pages/Layers
+
+		// Load file
+		OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument("ImageIn.odt");
+
+		// get root of all content of a text document
+		OfficeTextElement officeText = odt.getContentRoot();
+
+		// get first paragraph
+		TextPElement firstParagraph =
+		  OdfElement.findFirstChildNode(TextPElement.class, officeText);
+
+		// XPath alternative to get the first paragraph
+		/*
+		  XPath xpath = XPathFactory.newInstance().newXPath();
+		  xpath.setNamespaceContext(new OdfNamespace());
+		  OdfFileDom dom = odt.getContentDom();
+		  firstParagraph = (TextPElement) xpath.evaluate("//text:p[1]", dom, XPathConstants.NODE);
+		*/
+
+		// insert a frame
+		DrawFrameElement frame = firstParagraph.newDrawFrameElement();
+
+		// insert an image: This is a class from the Document API
+		OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
+		image.newImage(new URI("./MySampleImage.png"));
+
+		// Save file
+		odt.save("ImageOut.odt");
+
+		//********************************************************************
+		// WIKI EXAMPLE III from http://odftoolkit.org/projects/odfdom/pages/Layers
+
+		// Load Image
+		odt = (OdfTextDocument) OdfDocument.loadDocument("ImageIn.odt");
+
+		// Play around with text
+		odt.addText("When there is no paragraph, the text will be embedded in a new paragraph");
+		odt.newParagraph("Create new paragraph");
+		odt.addText("\nThis is a new line");
+
+		// Insert Image and make last paragraph its anchor
+		odt.newImage(new URI("./MySampleImage.png"));
+
+		// Insert new spreadsheet as sub document into the package within directory  "myOdsDirectoryPath/"
+		odt.insertDocument(OdfSpreadsheetDocument.newSpreadsheetDocument(), "myOdsDirectoryPath");
+
+		// Save file
+		odt.save("ImageOut.odt");
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/meta/MetaDocumentStatisticTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/meta/MetaDocumentStatisticTest.java
new file mode 100644
index 0000000..bd7bf41
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/meta/MetaDocumentStatisticTest.java
@@ -0,0 +1,203 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+
+package org.odftoolkit.odfdom.incubator.meta;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+public class MetaDocumentStatisticTest {
+
+	private String filename = "metaTest.odt";
+	private OdfTextDocument doc;
+	private OdfFileDom metadom;
+	private OdfMetaDocumentStatistic stat;
+	private Integer cellCount = 1;
+	private Integer characterCount = 2;
+	private Integer drawCount = 3;
+	private Integer frameCount = 4;
+	private Integer imageCount = 5;
+	private Integer nonWhitespaceCharacterCount = 6;
+	private Integer objectCount = 7;
+	private Integer oleObjectCount = 8;
+	private Integer pageCount = 9;
+	private Integer paragraphCount = 10;
+	private Integer rowCount = 11;
+	private Integer sentenceCount = 12;
+	private Integer syllableCount = 13;
+	private Integer tableCount = 14;
+	private Integer wordCount = 15;
+
+	@Before
+	public void setUp() throws Exception {
+		doc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities
+				.getTestResourceAsStream(filename));
+		metadom = doc.getMetaDom();
+		OdfOfficeMeta meta = new OdfOfficeMeta(metadom);
+		stat = meta.getDocumentStatistic();
+		if (stat == null) {
+			// the element does not exist in the metadata, add a new one
+			MetaDocumentStatisticElement statEle = meta
+					.getOfficeMetaElement().newMetaDocumentStatisticElement();
+			stat = new OdfMetaDocumentStatistic(statEle);
+		}
+
+	}
+
+	@Test
+	public void testGetCellCount() {
+		stat.setCellCount(cellCount);
+		Assert.assertEquals(cellCount, stat.getCellCount());
+	}
+
+	@Test
+	public void testGetCharacterCount() {
+		stat.setCharacterCount(characterCount);
+		Assert.assertEquals(characterCount, stat.getCharacterCount());
+	}
+
+	@Test
+	public void testGetDrawCount() {
+		stat.setDrawCount(drawCount);
+		Assert.assertEquals(drawCount, stat.getDrawCount());
+	}
+
+	@Test
+	public void testGetFrameCount() {
+		stat.setFrameCount(frameCount);
+		Assert.assertEquals(frameCount, stat.getFrameCount());
+	}
+
+	@Test
+	public void testGetImageCount() {
+		stat.setImageCount(imageCount);
+		Assert.assertEquals(imageCount, stat.getImageCount());
+	}
+
+	@Test
+	public void testGetNonWhitespaceCharacterCount() {
+		stat.setNonWhitespaceCharacterCount(nonWhitespaceCharacterCount);
+		Assert.assertEquals(nonWhitespaceCharacterCount, stat
+				.getNonWhitespaceCharacterCount());
+	}
+
+	@Test
+	public void testGetObjectCount() {
+		stat.setObjectCount(objectCount);
+		Assert.assertEquals(objectCount, stat.getObjectCount());
+	}
+
+	@Test
+	public void testGetOleObjectCount() {
+		stat.setOleObjectCount(oleObjectCount);
+		Assert.assertEquals(oleObjectCount, stat.getOleObjectCount());
+	}
+
+	@Test
+	public void testGetPageCount() {
+		stat.setPageCount(pageCount);
+		Assert.assertEquals(pageCount, stat.getPageCount());
+	}
+
+	@Test
+	public void testGetParagraphCount() {
+		stat.setParagraphCount(paragraphCount);
+		Assert.assertEquals(paragraphCount, stat.getParagraphCount());
+	}
+
+	@Test
+	public void testGetRowCount() {
+		stat.setRowCount(rowCount);
+		Assert.assertEquals(rowCount, stat.getRowCount());
+	}
+
+	@Test
+	public void testGetSentenceCount() {
+		stat.setSentenceCount(sentenceCount);
+		Assert.assertEquals(sentenceCount, stat.getSentenceCount());
+	}
+
+	@Test
+	public void testGetSyllableCount() {
+		stat.setSyllableCount(syllableCount);
+		Assert.assertEquals(syllableCount, stat.getSyllableCount());
+	}
+
+	@Test
+	public void testGetTableCount() {
+		stat.setTableCount(tableCount);
+		Assert.assertEquals(tableCount, stat.getTableCount());
+	}
+
+	@Test
+	public void testGetWordCount() {
+		stat.setWordCount(wordCount);
+		Assert.assertEquals(wordCount, stat.getWordCount());
+	}
+
+	@Test
+	public void testReadEmptyDocumentMeta() throws Exception {
+
+		// create a new empty document
+		doc = (OdfTextDocument) OdfTextDocument.newTextDocument();
+		doc
+				.save(ResourceUtilities
+						.newTestOutputFile("EmptyDocForMetaTest.odt"));
+
+		// read empty document meta
+		doc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities
+				.getTestResourceAsStream("EmptyDocForMetaTest.odt"));
+		metadom = doc.getMetaDom();
+		OdfOfficeMeta meta = new OdfOfficeMeta(metadom);
+		stat = meta.getDocumentStatistic();
+		Assert.assertNull(stat);
+
+		// create a new stat
+		MetaDocumentStatisticElement statEle = meta
+				.getOfficeMetaElement().newMetaDocumentStatisticElement();
+		stat = new OdfMetaDocumentStatistic(statEle);
+
+		Assert.assertNull(stat.getCellCount());
+		Assert.assertNull(stat.getCharacterCount());
+		Assert.assertNull(stat.getDrawCount());
+		Assert.assertNull(stat.getFrameCount());
+		Assert.assertNull(stat.getImageCount());
+		Assert.assertNull(stat.getNonWhitespaceCharacterCount());
+		Assert.assertNull(stat.getObjectCount());
+		Assert.assertNull(stat.getOleObjectCount());
+		Assert.assertNull(stat.getPageCount());
+		Assert.assertNull(stat.getParagraphCount());
+		Assert.assertNull(stat.getRowCount());
+		Assert.assertNull(stat.getSentenceCount());
+		Assert.assertNull(stat.getSyllableCount());
+		Assert.assertNull(stat.getTableCount());
+		Assert.assertNull(stat.getWordCount());
+
+	}
+
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/meta/OfficeMetaTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/meta/OfficeMetaTest.java
new file mode 100644
index 0000000..31e367f
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/meta/OfficeMetaTest.java
@@ -0,0 +1,421 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.meta;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.odftoolkit.Junit.AlphabeticalOrderedRunner;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaValueTypeAttribute.Value;
+import org.odftoolkit.odfdom.dom.example.LoadMultipleTimes;
+import org.odftoolkit.odfdom.type.Duration;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+@RunWith(AlphabeticalOrderedRunner.class)
+public class OfficeMetaTest {
+
+	private static final Logger LOG = Logger.getLogger(OfficeMetaTest.class.getName());
+	private String filename = "metaTest.odt";
+	private String filenameOut = "metaTest_OfficeMetaTest.odt";
+	private OdfTextDocument doc;
+	private OdfFileDom metadom;
+	private OdfOfficeMeta fMetadata;
+	private static final String generator = "ODFDOM/SNAPSHOT-TEST";
+	private String dctitle = "dctitle";
+	private String dcdescription = "dcdescription";
+	private String subject = "dcsubject";
+	private List<String> keywords = new ArrayList<String>();
+	private String initialCreator = "creator";
+	private String dccreator = "Mr. fictionalTestUser";
+	private String printedBy = "persia p";
+	private String language = "EN_us";
+	private Integer editingCycles = new Integer(4);
+	private Duration editingDuration = Duration.valueOf("P49DT11H8M9S");
+	private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+	
+	@Before	
+	public void setUp() throws Exception {
+		// Former developer was writing into the original file, triggering a race discussion of regression tests working on all documents.
+		// Sometimes the file was changed (if this test ran earlier), sometimes not. Fixed by doing the test result in a new ODT output file
+		File newMetaFile = ResourceUtilities.newTestOutputFile(filenameOut);
+		if(!newMetaFile.exists()){
+			doc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath(filename));
+		}else{
+			doc = (OdfTextDocument) OdfTextDocument.loadDocument(newMetaFile);
+		}
+		
+		metadom = doc.getMetaDom();
+		fMetadata = new OdfOfficeMeta(metadom);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		doc.save(ResourceUtilities.newTestOutputFile(filenameOut));
+		doc.close();
+		doc = null;
+		metadom = null;
+	}
+
+	@Test
+	@Ignore // Add Test when the version number changes and the templates should be adapted
+	public void updateTemplates() {
+		// Adapt all files with latest XML changes automatically
+		loadSaveDirFiles("target/classes/"); // all template files to be bundled within the JAR
+		// The following is only necessary, when the templates in the source repository should be adapted, e.g. before a release
+		loadSaveDirFiles("src/main/resources/");
+	}
+
+	/** The reference templates of the JAR will be loaded and saved. */
+	private void loadSaveDirFiles(String targetDirectory) {
+		try {
+			LOG.log(Level.INFO, "Loading/saving resources from the directory: ''{0}''!", targetDirectory);
+			File resDir = new File(targetDirectory);
+			File[] resFiles = resDir.listFiles();
+			boolean validTest = true;
+			for (File odfFile : resFiles) {
+				if (!odfFile.isDirectory() ) { //&& odfFile.getName().startsWith("Odf")
+					OdfDocument odfDoc = OdfDocument.loadDocument(odfFile);
+					String version = System.getProperty("odfdom.version");
+					OdfOfficeMeta meta = odfDoc.getOfficeMetadata();
+					meta.setAutomaticUpdate(false);
+					meta.setCreator(null);
+					meta.setCreationDate(null);
+					meta.setDate(null);
+					meta.setDescription(null);
+					meta.setEditingCycles(null);
+					meta.setEditingDuration(null);
+					meta.setLanguage(null);
+					meta.setPrintDate(null);
+					meta.setPrintedBy(null);
+					meta.setSubject(null);
+					meta.setTitle(null);
+					meta.removeUserDefinedDataByName("Info 1");
+					meta.removeUserDefinedDataByName("Info 2");
+					meta.removeUserDefinedDataByName("Info 3");
+					meta.removeUserDefinedDataByName("Info 4");
+					String timeStamp = mSimpleDateFormat.format(Calendar.getInstance().getTime());
+					if (version != null) {
+						if (version.endsWith("SNAPSHOT")) {
+							version = version + "(" + timeStamp + ")";
+						}
+						meta.setGenerator("ODFDOM/" + version);
+					} else {
+						meta.setGenerator("ODFDOM/SNAPSHOT(" + timeStamp + ")");
+						validTest = false;
+					}
+					LOG.log(Level.INFO, "Updating the resource {0}", odfFile.getPath());
+					odfDoc.save(odfFile.getPath());
+				}
+			}
+			Assert.assertTrue("No meta:generator could be set as the System property 'odfdom.version' set by the Maven pom.xml was not found!", validTest);
+
+			//ToDO: Add validation test afterwards..
+		} catch (Exception ex) {
+			Logger.getLogger(LoadMultipleTimes.class.getName()).log(Level.SEVERE, null, ex);
+		}
+	}
+
+	@Test
+	public void test1SetGenerator() {
+		fMetadata.setGenerator(generator);
+	}
+
+	@Test
+	public void test2GetGenerator() {
+		Assert.assertEquals(generator, fMetadata.getGenerator());
+	}
+
+	@Test
+	public void test1SetDcTitle() {
+		fMetadata.setTitle(dctitle);
+	}
+
+	@Test
+	public void test2GetDcTitle() {
+		Assert.assertEquals(dctitle, fMetadata.getTitle());
+	}
+
+	@Test
+	public void test1SetDcDescription() {
+		fMetadata.setDescription(dcdescription);
+	}
+
+	@Test
+	public void test2GetDcDescription() {
+		fMetadata.setDescription(dcdescription);
+		Assert.assertEquals(dcdescription, fMetadata.getDescription());
+	}
+
+	@Test
+	public void test1SetSubject() {
+		fMetadata.setSubject(subject);
+	}
+
+	@Test
+	public void test2GetSubject() {
+		Assert.assertEquals(subject, fMetadata.getSubject());
+	}
+
+	@Test
+	public void testSetAndGetKeywords() throws Exception {
+		keywords.add("lenovo2");
+		keywords.add("computer3");
+		keywords.add("think center");
+		fMetadata.setKeywords(keywords);
+		tearDown();
+		setUp();
+		Assert.assertEquals(keywords, fMetadata.getKeywords());
+	}
+
+	@Test
+	public void test1SetInitialCreator() {
+		fMetadata.setInitialCreator(initialCreator);
+	}
+
+	@Test
+	public void test2GetInitialCreator() {
+		Assert.assertEquals(initialCreator, fMetadata.getInitialCreator());
+	}
+
+	@Test
+	public void test1SetDcCreator() {
+		fMetadata.setCreator(dccreator);
+	}
+
+	@Test
+	public void test2GetDcCreator() {
+		fMetadata.setCreator(dccreator);
+		Assert.assertEquals(dccreator, fMetadata.getCreator());
+	}
+
+	@Test
+	public void test1SetPrintedBy() {
+		fMetadata.setPrintedBy(printedBy);
+	}
+
+	@Test
+	public void test2GetPrintedBy() {
+		Assert.assertEquals(printedBy, fMetadata.getPrintedBy());
+	}
+
+	@Test
+	public void testSetAndGetCreationDate() throws Exception {
+		Calendar creationDate = Calendar.getInstance();
+		fMetadata.setCreationDate(creationDate);
+		tearDown();
+		setUp();
+		// //the millisecond lost while changing calendar to string
+		// creationDate.clear(Calendar.MILLISECOND);
+		// fMetadata.getCreationDate().clear(Calendar.MILLISECOND);
+		//Assert.assertEquals(0,creationDate.compareTo(fMetadata.getCreationDate
+		// ()));
+		String expected = mSimpleDateFormat.format(creationDate.getTime());
+		String actual = mSimpleDateFormat.format(fMetadata.getCreationDate().getTime());
+		Assert.assertEquals(expected, actual);
+	}
+
+	@Test
+	public void testSetDcDate() throws Exception {
+		Calendar dcDate = Calendar.getInstance();
+		fMetadata.setDate(dcDate);
+		tearDown();
+		setUp();
+		// dcDate.clear(Calendar.MILLISECOND);
+		// fMetadata.getDate().clear(Calendar.MILLISECOND);
+		// Assert.assertEquals(0,dcDate.compareTo(fMetadata.getDate()));
+		String expected = mSimpleDateFormat.format(dcDate.getTime());
+		String actual = mSimpleDateFormat.format(fMetadata.getDate().getTime());
+		Assert.assertEquals(expected, actual);
+	}
+
+	@Test
+	public void testSetPrintDate() throws Exception {
+		Calendar printDate = Calendar.getInstance();
+		fMetadata.setPrintDate(printDate);
+		tearDown();
+		setUp();
+		// printDate.clear(Calendar.MILLISECOND);
+		// fMetadata.getPrintDate().clear(Calendar.MILLISECOND);
+		// Assert.assertEquals(0,printDate.compareTo(fMetadata.getPrintDate()));
+		String expected = mSimpleDateFormat.format(printDate.getTime());
+		String actual = mSimpleDateFormat.format(fMetadata.getPrintDate().getTime());
+		Assert.assertEquals(expected, actual);
+	}
+
+	@Test
+	public void test1SetLanguage() {
+		fMetadata.setLanguage(language);
+	}
+
+	@Test
+	public void test2GetLanguage() {
+		Assert.assertEquals(language, fMetadata.getLanguage());
+	}
+
+	@Test
+	public void test1SetEditingCycles() {
+		fMetadata.setEditingCycles(editingCycles);
+	}
+
+	@Test
+	public void test2GetEditingCycles() {
+		Assert.assertNotNull(fMetadata.getEditingCycles());
+	}
+
+	@Test
+	public void test1SetEditingDuration() {
+		fMetadata.setEditingDuration(editingDuration);
+	}
+
+	@Test
+	public void test2GetEditingDuration() {
+		Assert.assertNotNull(fMetadata.getEditingDuration());
+	}
+
+	@Test
+	public void testEmptyKeyword() throws Exception {
+		List<String> emptyKeyword = new ArrayList<String>();
+		fMetadata.setKeywords(emptyKeyword);
+		tearDown();
+		setUp();
+		Assert.assertNull(fMetadata.getKeywords());
+	}
+
+	@Test
+	public void testAddKeyword() throws Exception {
+		String newKeyword = "hello";
+		fMetadata.addKeyword(newKeyword);
+		tearDown();
+		setUp();
+		Assert.assertEquals(true, fMetadata.getKeywords().contains(newKeyword));
+	}
+
+	@Test
+	public void testSetAndGetUserdefinedData() throws Exception {
+		// remove if there is userdefined data
+		List<String> names;
+		names = fMetadata.getUserDefinedDataNames();
+		if (names == null) {
+			names = new ArrayList<String>();
+		} else {
+			for (String name : names) {
+				fMetadata.removeUserDefinedDataByName(name);
+			}
+			names.clear();
+		}
+		names.add("weather");
+		names.add("mood");
+		names.add("late");
+		// test set
+		fMetadata.setUserDefinedData(names.get(0), Value.STRING.toString(),
+				"windy");
+		fMetadata.setUserDefinedData(names.get(1), Value.STRING.toString(),
+				"happy");
+		fMetadata.setUserDefinedData(names.get(2), Value.BOOLEAN.toString(),
+				"false");
+		tearDown();
+
+		setUp();
+		// test get
+		Assert.assertEquals(names, fMetadata.getUserDefinedDataNames());
+		Assert.assertEquals(Value.STRING.toString(), fMetadata.getUserDefinedDataType(names.get(0)));
+		Assert.assertEquals("windy", fMetadata.getUserDefinedDataValue(names.get(0)));
+
+		fMetadata.setUserDefinedDataValue(names.get(1), "false");
+		fMetadata.setUserDefinedDataType(names.get(1), Value.BOOLEAN.toString());
+		fMetadata.setUserDefinedData(names.get(2), Value.STRING.toString(),
+				"no");
+		tearDown();
+
+		setUp();
+		// update
+		Assert.assertEquals("false", fMetadata.getUserDefinedDataValue(names.get(1)));
+		Assert.assertEquals(Value.BOOLEAN.toString(), fMetadata.getUserDefinedDataType(names.get(1)));
+		Assert.assertEquals("no", fMetadata.getUserDefinedDataValue(names.get(2)));
+		Assert.assertEquals(Value.STRING.toString(), fMetadata.getUserDefinedDataType(names.get(2)));
+		tearDown();
+
+		setUp();
+		// remove
+		fMetadata.removeUserDefinedDataByName(names.get(0));
+		tearDown();
+		setUp();
+		Assert.assertEquals(2, fMetadata.getUserDefinedDataNames().size());
+
+	}
+
+	@Test
+	public void testReadEmptyDocumentMeta() throws Exception {
+
+		// create a new empty document
+		doc = OdfTextDocument.newTextDocument();
+		doc.save(ResourceUtilities.newTestOutputFile("EmptyDocForMetaTest.odt"));
+
+		// read empty document meta
+		doc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath("EmptyDocForMetaTest.odt"));
+		metadom = doc.getMetaDom();
+		fMetadata = new OdfOfficeMeta(metadom);
+		//Assert.assertTrue(fMetadata.getGenerator().startsWith(generator));
+		//ToDO: http://odftoolkit.org/bugzilla/show_bug.cgi?id=171
+		// Assert.assertEquals(fMetadata.getGenerator(), generator);
+		Assert.assertNull(fMetadata.getTitle());
+		Assert.assertNull(fMetadata.getDescription());
+		Assert.assertNull(fMetadata.getSubject());
+		Assert.assertNull(fMetadata.getKeywords());
+		Assert.assertNull(fMetadata.getPrintedBy());
+		Assert.assertNull(fMetadata.getPrintDate());
+		Assert.assertNotNull(fMetadata.getUserDefinedDataNames());
+	}
+
+	@Test
+	public void testReadDocumentMeta() throws Exception {
+		// create a new empty document
+		OdfTextDocument textDoc = OdfTextDocument.newTextDocument(); // activiating metadata updates
+		textDoc.save(ResourceUtilities.newTestOutputFile("DocForMetaTest.odt"));
+		textDoc.close();
+		// read empty document meta
+		textDoc = (OdfTextDocument) OdfTextDocument.loadDocument(ResourceUtilities.getAbsolutePath("DocForMetaTest.odt"));
+		OdfOfficeMeta meta = textDoc.getOfficeMetadata();
+		Assert.assertNotNull(meta.getGenerator());
+		Assert.assertNotNull(meta.getCreationDate());
+		Assert.assertNotNull(meta.getCreator());
+		Assert.assertNotNull(meta.getDate());
+		Assert.assertTrue(meta.getEditingCycles() > 0);
+		Assert.assertNotNull(meta.getEditingDuration());
+		Assert.assertNull(meta.getLanguage());
+		textDoc.close();
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/MONPTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/MONPTest.java
new file mode 100644
index 0000000..cf67d47
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/MONPTest.java
@@ -0,0 +1,69 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ * Test ReplaceWith method for class org.odftoolkit.odfdom.incubator.search.TextSelection 
+ */
+public class MONPTest {
+
+	public static final String TEXT_FILE = "navigationtest.odt";
+	public static final String SAVE_FILE = "testsave1.odt";
+
+	/**
+	 * replace all the "mnop" occurance in navigationtest.odt with the word "success"
+	 */
+	@Test
+	public void testReplaceWith() {
+
+		try {
+			OdfTextDocument doc = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+
+			TextNavigation search = new TextNavigation("mnop", doc);
+
+			int i = 0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.getCurrentItem();
+				try {
+					item.replaceWith("success");
+					i++;
+					// item.addHref(new URL("http://www.oracle.com"));
+				} catch (InvalidNavigationException e) {
+					Assert.fail(e.getMessage());
+				}
+			}
+			Assert.assertTrue(18 == i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE));
+		} catch (Exception e) {
+			Logger.getLogger(MONPTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextNavigationTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextNavigationTest.java
new file mode 100644
index 0000000..307b75c
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextNavigationTest.java
@@ -0,0 +1,125 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfWhitespaceProcessor;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ * Test the method of class org.odftoolkit.odfdom.incubator.search.TextNavigation 
+ */
+public class TextNavigationTest {
+
+	private static final Logger LOG = Logger.getLogger(TextNavigationTest.class.getName());
+	public static final String TEXT_FILE = "TestTextSelection.odt";
+	OdfTextDocument doc;
+	TextNavigation search;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		} catch (Exception e) {
+			Logger.getLogger(TextNavigationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test getCurrentItem method of org.odftoolkit.odfdom.incubator.search.TextNavigation
+	 */
+	@Test
+	public void testGotoNext() {
+
+		search = null;
+		search = new TextNavigation("delete", doc);
+
+
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			LOG.info(item.toString());
+		}
+
+	}
+
+	/**
+	 * Test getNextMatchElement method of org.odftoolkit.odfdom.incubator.search.TextNavigation
+	 */
+	@Test
+	public void testGetNextMatchElement() {
+
+		search = null;
+		search = new TextNavigation("delete", doc);
+		OdfWhitespaceProcessor textProcessor = new OdfWhitespaceProcessor();
+
+		try {
+			//NodeList list = doc.getContentDom().getElementsByTagName("text:p");
+			OdfElement firstmatch = (OdfElement) search.getNextMatchElement(doc.getContentRoot());
+			Assert.assertNotNull(firstmatch);
+			Assert.assertEquals("Task2.delete next paragraph", textProcessor.getText(firstmatch));
+
+			OdfElement secondmatch = (OdfElement) search.getNextMatchElement(firstmatch);
+			Assert.assertNotNull(secondmatch);
+			Assert.assertEquals("Hello [delete], I will be delete", textProcessor.getText(secondmatch));
+
+			OdfElement thirdmatch = (OdfElement) search.getNextMatchElement(secondmatch);
+			Assert.assertNotNull(thirdmatch);
+			Assert.assertEquals("indeed   delete", textProcessor.getText(thirdmatch));
+
+			OdfElement match4 = (OdfElement) search.getNextMatchElement(thirdmatch);
+			Assert.assertNotNull(match4);
+			Assert.assertEquals("different span in one single word delete indeed", textProcessor.getText(match4));
+
+			OdfElement match5 = (OdfElement) search.getNextMatchElement(match4);
+			Assert.assertNotNull(match5);
+			Assert.assertEquals("Hello delete this word delete true delete  indeed", textProcessor.getText(match5));
+
+		} catch (Exception e) {
+			Logger.getLogger(TextNavigationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextSelectionTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextSelectionTest.java
new file mode 100644
index 0000000..b95131b
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextSelectionTest.java
@@ -0,0 +1,359 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ * Test the method of class org.odftoolkit.odfdom.incubator.search.TextSelection
+ */
+public class TextSelectionTest {
+
+	public static final String TEXT_FILE = "TestTextSelection.odt";
+	public static final String SAVE_FILE_DELETE = "TextSelectionResultDelete.odt";
+	public static final String SAVE_FILE_STYLE = "TextSelectionResultStyle.odt";
+	public static final String SAVE_FILE_HREF = "TextSelectionResultHref.odt";
+	public static final String SAVE_FILE_REPLACE = "TextSelectionResultReplace.odt";
+	public static final String SAVE_FILE_COPYTO = "TextSelectionResultCopyTo.odt";
+	public static final String SAVE_FILE_COPYTO1 = "TextSelectionResultCopyTo1.odt";
+	public static final String SAVE_FILE_DELETE_PATTERN = "TextSelectionResultPatternDelete.odt";
+	OdfTextDocument doc;
+	OdfFileDom contentDOM;
+	TextNavigation search;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			contentDOM = doc.getContentDom();
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test cut method of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * delete all the 'delete' word
+	 */
+	@Test
+	public void testCut() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+
+		TextSelection nextSelect = null;
+		TextNavigation nextsearch = new TextNavigation("next", doc);
+		if (nextsearch.hasNext()) {
+			nextSelect = (TextSelection) nextsearch.getCurrentItem();
+		}
+		int i = 0;
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			i++;
+			try {
+				item.cut();
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+		Assert.assertTrue(8 == i);
+		//research the "delete"
+		search = new TextNavigation("delete", doc);
+		Assert.assertFalse(search.hasNext());
+
+		//this document just have one "next"
+		try {
+			nextSelect.cut();
+		} catch (InvalidNavigationException e1) {
+			Assert.fail(e1.getMessage());
+		}
+		Assert.assertFalse(nextsearch.hasNext());
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_DELETE));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test pasteAtFrontOf method of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * copy the first 'change' word in the front of all the 'delete' word
+	 */
+	@Test
+	public void testPasteAtFrontOf() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		TextSelection sel = null;
+
+		TextNavigation search1 = new TextNavigation("change", doc);
+		if (search1.hasNext()) {
+			sel = (TextSelection) search1.getCurrentItem();
+		}
+
+		int i = 0;
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			i++;
+			try {
+				sel.pasteAtFrontOf(item);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		int j = 0;
+		search = new TextNavigation("changedelete", doc);
+		while (search.hasNext()) {
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_COPYTO));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * Test pasteAtEndOf method of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * copy the first 'change' word at the end of all the 'delete' word
+	 */
+	@Test
+	public void testPasteAtEndOf() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		TextSelection sel = null;
+
+		TextNavigation search1 = new TextNavigation("change", doc);
+		if (search1.hasNext()) {
+			sel = (TextSelection) search1.getCurrentItem();
+		}
+
+		int i = 0;
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			i++;
+			try {
+				sel.pasteAtEndOf(item);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+		int j = 0;
+		search = new TextNavigation("deletechange", doc);
+		while (search.hasNext()) {
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_COPYTO1));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * Test applyStyle method of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * append "T4" style for all the 'delete' word, 'T4' in the original document is the 'bold' style
+	 */
+	@Test
+	public void testApplyStyle() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		OdfOfficeAutomaticStyles autoStyles = null;
+		try {
+			autoStyles = doc.getContentDom().getAutomaticStyles();
+		} catch (Exception e1) {
+			Assert.fail("Failed with " + e1.getClass().getName() + ": '" + e1.getMessage() + "'");
+		}
+		//T4 is the bold style for text
+		OdfStyleBase style = autoStyles.getStyle("T4", OdfStyleFamily.Text);
+		Assert.assertNotNull(style);
+
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			try {
+				item.applyStyle(style);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_STYLE));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test replaceWith method of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * replace all the 'ODFDOM' with 'Odf Toolkit'
+	 */
+	@Test
+	public void testReplacewith() {
+		search = null;
+		search = new TextNavigation("ODFDOM", doc);
+
+		TextSelection nextSelect = null;
+		TextNavigation nextsearch = new TextNavigation("next", doc);
+		if (nextsearch.hasNext()) {
+			nextSelect = (TextSelection) nextsearch.getCurrentItem();
+		}
+
+		//replace all the "ODFDOM" to "Odf Toolkit"
+		//except the sentence "Task5.Change the ODFDOM to Odf Toolkit, and bold them."
+		OdfStyle style = new OdfStyle(contentDOM);
+		style.setProperty(StyleTextPropertiesElement.FontWeight, "bold");
+		style.setStyleFamilyAttribute("text");
+		int i = 0;
+		while (search.hasNext()) {
+			if (i > 0) {
+				TextSelection item = (TextSelection) search.getCurrentItem();
+				try {
+					item.replaceWith("Odf Toolkit");
+					item.applyStyle(style);
+				} catch (InvalidNavigationException e) {
+					Assert.fail(e.getMessage());
+				}
+			}
+			i++;
+		}
+
+		search = new TextNavigation("Odf Toolkit", doc);
+		int j = 0;
+		while (search.hasNext()) {
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			nextSelect.replaceWith("bbb");
+		} catch (InvalidNavigationException e1) {
+			Assert.fail(e1.getMessage());
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test addHref method of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * add href "http://www.ibm.com" for all the 'delete' word
+	 */
+	@Test
+	public void testAddHref() {
+		search = null;
+		search = new TextNavigation("^delete", doc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			// LOG.info(item);
+			try {
+				item.addHref(new URL("http://www.ibm.com"));
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			} catch (MalformedURLException e) {
+				Assert.fail(e.getMessage());
+				Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_HREF));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * Test search pattern of org.odftoolkit.odfdom.incubator.search.TextSelection
+	 * search a snippet of text match the pattern "<%([^>]*)%>", and extract the content 
+	 * between "<%" and "%>"
+	 */
+	@Test
+	public void testCutPattern() {
+		search = new TextNavigation("<%([^>]*)%>", doc);
+
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.getCurrentItem();
+			try {
+				String text = item.getText();
+				text = text.substring(2, text.length() - 2);
+				item.replaceWith(text);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_DELETE_PATTERN));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextStyleNavigationTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextStyleNavigationTest.java
new file mode 100644
index 0000000..02f41d9
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/incubator/search/TextStyleNavigationTest.java
@@ -0,0 +1,263 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.incubator.search;
+
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+/**
+ * Test the method of class org.odftoolkit.odfdom.incubator.search.TextStyleNavigation 
+ */
+public class TextStyleNavigationTest {
+
+	private static final Logger LOG = Logger.getLogger(TextStyleNavigationTest.class.getName());
+	public static final String TEXT_FILE = "TestStyleSelection.odt";
+	public static final String SAVE_FILE_PAST_FRONT = "TextStyleSelectionResultInsertFront.odt";
+	public static final String SAVE_FILE_PAST_END = "TextStyleSelectionResultInsertEnd.odt";
+	public static final String SAVE_FILE_DELETE = "TextStyleSelectionResultDelete.odt";
+	public static final String SAVE_FILE_STYLE = "TextStyleSelectionResultStyle.odt";
+	public static final String SAVE_FILE_REPLACE = "TextStyleSelectionResultReplace.odt";
+	public static final String SAVE_FILE_COPYTO = "TextStyleSelectionResultCopyTo.odt";
+	public static final String SAVE_FILE_COPYTO1 = "TextStyleSelectionResultCopyTo1.odt";
+	public static final String SAVE_FILE_CUT_FOOTERHEADER = "TextStyleSelectionResultCutFooterHeader.odt";
+	public static final String SAVE_FILE_APPLY_FOOTERHEADER = "TextStyleSelectionResultApplyFooterHeader.odt";
+	OdfTextDocument doc;
+	TextStyleNavigation search1;
+	TextNavigation search2;
+	TextNavigation search3;
+	TextStyleNavigation search4;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test pasteAtFrontOf method of org.odftoolkit.odfdom.incubator.search.TextStyleNavigation
+	 */
+	@Test
+	public void testPasteAtFrontOf() {
+
+		//search the text of specified style, then insert it before specified text (delete)
+		search1 = null;
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Times New Roman1");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "16pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+		search2 = new TextNavigation("delete", doc);
+		search3 = new TextNavigation("Roman16 Romanl16delete", doc);
+
+		TextSelection itemstyle = null;
+		if (search1.hasNext()) {
+			itemstyle = (TextSelection) search1.getCurrentItem();
+			LOG.info(itemstyle.toString());
+		}
+		int i = 0;
+		if (itemstyle != null) {
+			while (search2.hasNext()) {
+				i++;
+				TextSelection itemtext = (TextSelection) search2.getCurrentItem();
+				try {
+					itemstyle.pasteAtFrontOf(itemtext);
+				} catch (InvalidNavigationException e) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail(e.getMessage());
+				}
+				LOG.info(itemtext.toString());
+			}
+		}
+
+		int j = 0;
+		while (search3.hasNext()) {
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_PAST_FRONT));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test pasteAtEndOf method of org.odftoolkit.odfdom.incubator.search.TextStyleNavigation
+	 */
+	@Test
+	public void testPasteAtEndOf() {
+
+		//search the text of specified style, then insert it after specified text (delete)
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Times New Roman1");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "16pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+		search2 = new TextNavigation("delete", doc);
+		search3 = new TextNavigation("deleteRoman16 Romanl16", doc);
+		TextSelection itemstyle = null;
+		if (search1.hasNext()) {
+			itemstyle = (TextSelection) search1.getCurrentItem();
+			LOG.info(itemstyle.toString());
+		}
+		int i = 0;
+		if (itemstyle != null) {
+			while (search2.hasNext()) {
+				i++;
+				TextSelection itemtext = (TextSelection) search2.getCurrentItem();
+				try {
+					itemstyle.pasteAtEndOf(itemtext);
+				} catch (InvalidNavigationException e) {
+					Assert.fail(e.getMessage());
+				}
+				LOG.info(itemtext.toString());
+			}
+		}
+
+		int j = 0;
+		while (search3.hasNext()) {
+			j++;
+		}
+
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_PAST_END));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test cut method of org.odftoolkit.odfdom.incubator.search.TextStyleNavigation
+	 */
+	@Test
+	public void testCut() {
+
+		//delete all text with specified style
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Century1");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "22pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+		search2 = new TextNavigation("Century22", doc);
+
+		while (search1.hasNext()) {
+			TextSelection item = (TextSelection) search1.getCurrentItem();
+			try {
+				item.cut();
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		Assert.assertFalse(search2.hasNext());
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_DELETE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test applyStyle method of org.odftoolkit.odfdom.incubator.search.TextStyleNavigation
+	 */
+	@Test
+	public void testApplyStyle() {
+		//select the text specified style and apply the text with new style.
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Arial");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "12pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+
+		OdfStyle style = null;
+		try {
+			style = new OdfStyle(doc.getContentDom());
+			style.setProperty(StyleTextPropertiesElement.FontSize, "23pt");
+			style.setProperty(StyleTextPropertiesElement.FontWeight, "bold");
+			style.setStyleFamilyAttribute("text");
+		} catch (Exception e1) {
+			LOG.log(Level.SEVERE, e1.getMessage(), e1);
+			Assert.fail("Failed with " + e1.getClass().getName() + ": '" + e1.getMessage() + "'");
+		}
+
+		int i = 0;
+		while (search1.hasNext()) {
+			i++;
+			TextSelection item = (TextSelection) search1.getCurrentItem();
+			// LOG.info(item);
+			try {
+				item.applyStyle(style);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		TreeMap<OdfStyleProperty, String> chgProps = new TreeMap<OdfStyleProperty, String>();
+		chgProps.put(StyleTextPropertiesElement.FontSize, "23pt");
+		chgProps.put(StyleTextPropertiesElement.FontWeight, "bold");
+		search4 = new TextStyleNavigation(chgProps, doc);
+		int j = 0;
+		while (search4.hasNext()) {
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_STYLE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/integrationtest/JarManifestIT.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/integrationtest/JarManifestIT.java
new file mode 100644
index 0000000..1221378
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/integrationtest/JarManifestIT.java
@@ -0,0 +1,81 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.integrationtest;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.JarManifest;
+
+public class JarManifestIT {
+
+	private static final Logger LOG = Logger.getLogger(JarManifestIT.class.getName());
+
+	@Test
+	public void testJar() {
+		try {
+			String command = "java -jar target/odfdom.jar";
+			Process process = Runtime.getRuntime().exec(command);
+			process.waitFor();
+			BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+			BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+			String line;
+			while ((line = errorReader.readLine()) != null) {
+				LOG.info(line);
+				Assert.assertTrue(line.indexOf("Exception") == -1);
+			}
+			String firstOutputLine = outputReader.readLine();
+			String secondOutputLine = outputReader.readLine();
+			errorReader.close();
+			outputReader.close();
+			process.destroy();
+			LOG.log(Level.INFO, "The version info from commandline given by {0} is:\n", command);
+			LOG.log(Level.INFO, "\"{0}\"", firstOutputLine);
+			LOG.log(Level.INFO, "\"{0}\"", secondOutputLine);
+			Assert.assertEquals(firstOutputLine, JarManifest.getOdfdomTitle() + " (build " + JarManifest.getOdfdomBuildDate() + ')');
+			Assert.assertEquals(secondOutputLine, "from " + JarManifest.getOdfdomWebsite() + " supporting ODF " + JarManifest.getOdfdomSupportedOdfVersion());
+
+			LOG.log(Level.INFO, "\nJarManifest.getName(): {0}", JarManifest.getOdfdomName());
+			Assert.assertNotNull(JarManifest.getOdfdomName());
+
+			LOG.log(Level.INFO, "\nJarManifest.getTitle(): {0}", JarManifest.getOdfdomTitle());
+			Assert.assertNotNull(JarManifest.getOdfdomTitle());
+
+			LOG.log(Level.INFO, "\nJarManifest.getVersion(): {0}", JarManifest.getOdfdomVersion());
+			Assert.assertNotNull(JarManifest.getOdfdomVersion());
+
+			LOG.log(Level.INFO, "\nJarManifest.getBuildDate(): {0}", JarManifest.getOdfdomBuildDate());
+			Assert.assertNotNull(JarManifest.getOdfdomBuildDate());
+
+			LOG.log(Level.INFO, "\nJarManifest.getSupportedOdfVersion(): {0}", JarManifest.getOdfdomSupportedOdfVersion());
+			Assert.assertNotNull(JarManifest.getOdfdomSupportedOdfVersion());
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/integrationtest/PerformanceIT.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/integrationtest/PerformanceIT.java
new file mode 100644
index 0000000..19a8ba5
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/integrationtest/PerformanceIT.java
@@ -0,0 +1,377 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+ */
+
+package org.odftoolkit.odfdom.integrationtest;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.w3c.dom.NodeList;
+
+public class PerformanceIT {
+
+	private static final Logger LOG = Logger.getLogger(PerformanceIT.class.getName());
+	private static String TEST_FILE_FOLDER;
+	private static String[] TEST_FILE_NAME;
+	//private static final String timesheetTemplate = "timesheetTemplate.ods";
+	//private static final String memorysheetTemplate = "memorysheetTemplate.ods";
+	private double[] totalTime = new double[3];
+	private double[] totalLoadTimeForEach = null;
+	private double[] totalSaveTimeForEach = null;
+	private double[] totalParseTimeForEach = null;
+	private double[] memoryfootprint = null;
+	private String time_spreadsheet = null;
+	private String memory_spreadsheet = null;
+	private String REPORT_FILE_FOLDER = null;
+	private int count = 1;
+	private String testTag = "new test";
+
+	public PerformanceIT() {
+		try {
+			TEST_FILE_FOLDER = PerformanceIT.class.getClassLoader().getResource("").toURI().getPath() + System.getProperty("testresourcefolder") + File.separatorChar;
+			testTag = System.getProperty("testflag");
+			String executeTimesTest = System.getProperty("executetimes");
+			if (executeTimesTest != null) {
+				count = Integer.parseInt(executeTimesTest);
+			}
+			REPORT_FILE_FOLDER = getOutputPath() + File.separatorChar;
+			memory_spreadsheet = REPORT_FILE_FOLDER + "memorylog.ods";
+			time_spreadsheet = REPORT_FILE_FOLDER + "timelog.ods";
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(PerformanceIT.class.getName()).log(Level.SEVERE, null, ex);
+		}
+
+	}
+
+	private String getOutputPath() {
+		String path = null;
+		try {
+			File rootpath = new File(PerformanceIT.class.getClassLoader().getResource("").toURI().getPath());
+			File parent = rootpath.getParentFile();
+			File outputpath = new File(parent, "performance-reports");
+			if (!outputpath.exists()) {
+				outputpath.mkdir();
+			}
+			path = outputpath.getPath();
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(PerformanceIT.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return path;
+	}
+
+	@Test
+	public void testPerformance() {
+		try {
+			init();
+			// 1. Collect Test result
+			test();
+			// 2. Save to spreadsheet
+			writeToLog();
+		} catch (Exception e) {
+			Logger.getLogger(PerformanceIT.class.getName()).log(Level.SEVERE, null, e);
+
+		}
+	}
+
+	private void init() {
+
+		readFileList(TEST_FILE_FOLDER);
+		if (TEST_FILE_NAME == null) {
+			return;
+		}
+
+		totalTime[0] = 0;
+		totalTime[1] = 0;
+		totalTime[2] = 0;
+
+		totalLoadTimeForEach = new double[TEST_FILE_NAME.length];
+		totalSaveTimeForEach = new double[TEST_FILE_NAME.length];
+		totalParseTimeForEach = new double[TEST_FILE_NAME.length];
+		memoryfootprint = new double[TEST_FILE_NAME.length * 3];
+
+		for (int i = 0; i < TEST_FILE_NAME.length; i++) {
+			totalLoadTimeForEach[i] = 0;
+			totalSaveTimeForEach[i] = 0;
+			totalParseTimeForEach[i] = 0;
+			memoryfootprint[3 * i] = 0;
+			memoryfootprint[3 * i + 1] = 0;
+			memoryfootprint[3 * i + 2] = 0;
+		}
+
+	}
+
+	private void readFileList(String folder) {
+		String filename;
+
+		LOG.log(Level.INFO, "[PerformaceTest] Reading test documents from {0}", folder);
+		File myFolder = new File(folder);
+		if (!myFolder.isDirectory()) {
+			return;
+		}
+		File[] files = myFolder.listFiles();
+		ArrayList myList = new ArrayList();
+
+		for (int i = 0; i < files.length; i++) {
+			filename = files[i].getName();
+			if (filename.endsWith("ods") || filename.endsWith("odp") || filename.endsWith("odt")) {
+				myList.add(filename);
+			}
+			//TEST_FILE_NAME[i]=files[i].getName();
+			//LOG.info("name="+TEST_FILE_NAME[i]);
+		}
+
+		LOG.log(Level.INFO, "[PerformaceTest] {0} test files are loaded", myList.size());
+		if (myList.size() > 0) {
+			TEST_FILE_NAME = (String[]) myList.toArray(new String[1]);
+		}
+	}
+
+	private void writeToLog() throws Exception {
+		FileInputStream timefile, memoryfile;
+		OdfDocument timedoc, memorydoc;
+
+		if (TEST_FILE_NAME == null) {
+			return;
+		}
+
+		try {
+			timefile = new FileInputStream(time_spreadsheet);
+			timedoc = OdfDocument.loadDocument(timefile);
+		} catch (FileNotFoundException e) {
+			//Create an empty spreadsheet
+			timedoc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) timedoc.getContentDom().getElementsByTagNameNS(
+					OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+			spreadsheet.removeChild(spreadsheet.getFirstChild());
+		}
+
+		try {
+			memoryfile = new FileInputStream(memory_spreadsheet);
+			memorydoc = OdfDocument.loadDocument(memoryfile);
+		} catch (FileNotFoundException e) {
+			//Create an empty spreadsheet
+			memorydoc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) memorydoc.getContentDom().getElementsByTagNameNS(
+					OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+			spreadsheet.removeChild(spreadsheet.getFirstChild());
+		}
+
+		String[] summaryName = new String[]{"Load All Documents", "Parse All Documents", "Save All Documents"};
+		updateTableCells(timedoc, "Summary", totalTime, summaryName);
+		updateTableCells(timedoc, "Load ODF", totalLoadTimeForEach, TEST_FILE_NAME);
+		updateTableCells(timedoc, "Parse ODF", totalParseTimeForEach, TEST_FILE_NAME);
+		updateTableCells(timedoc, "Save ODF", totalSaveTimeForEach, TEST_FILE_NAME);
+
+		String[] memorylabel = new String[TEST_FILE_NAME.length * 3];
+		for (int i = 0; i < TEST_FILE_NAME.length; i++) {
+			memorylabel[3 * i] = "load " + TEST_FILE_NAME[i];
+			memorylabel[3 * i + 1] = "parse " + TEST_FILE_NAME[i];
+			memorylabel[3 * i + 2] = "save " + TEST_FILE_NAME[i];
+		}
+		updateTableCells(memorydoc, "Memory footprint", memoryfootprint, memorylabel);
+
+		timedoc.save(time_spreadsheet);
+		LOG.log(Level.INFO, "[PerformaceTest] Test results are written to {0}", time_spreadsheet);
+		memorydoc.save(memory_spreadsheet);
+		LOG.log(Level.INFO, "[PerformaceTest] Test results are written to {0}", memory_spreadsheet);
+	}
+
+	private void updateTableCells(OdfDocument odfdoc, String tablename,
+			double[] values, String[] labels) {
+		int i = 0, j = 0;
+		TableTableRowElement td;
+		TableTableCellElement cell;
+		OdfFileDom dom;
+		NodeList tableList;
+		TableTableElement myTable;
+		NodeList lst;
+		OdfTextParagraph p;
+		OfficeSpreadsheetElement spreadsheet = null;
+
+		try {
+			dom = odfdoc.getContentDom();
+			tableList = dom.getElementsByTagNameNS(
+					OdfDocumentNamespace.TABLE.getUri(), "table");
+			spreadsheet = (OfficeSpreadsheetElement) dom.getElementsByTagNameNS(
+					OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+
+			i = 0;
+			if (tableList.getLength() > 0) {
+				for (; i < tableList.getLength(); i++) {
+					String currentname = ((TableTableElement) tableList.item(i)).getTableNameAttribute();
+					if (currentname == null) {
+						currentname = "";
+					}
+					if (currentname.equalsIgnoreCase(tablename)) {
+						break;
+					}
+				}
+			}
+			if (i < tableList.getLength()) //table with the specific table name is found
+			{
+				myTable = (TableTableElement) tableList.item(i);
+			} else { //table with the specific table name is not found. Create table
+				myTable = dom.newOdfElement(TableTableElement.class);
+				myTable.setTableNameAttribute(tablename);
+				spreadsheet.appendChild(myTable);
+			}
+
+			lst = myTable.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-row");
+			if (lst.getLength() == 0) { //the first table row is not existed. Create table row
+				td = dom.newOdfElement(TableTableRowElement.class);
+				cell = dom.newOdfElement(TableTableCellElement.class);
+				p = dom.newOdfElement(OdfTextParagraph.class);
+				if (tablename.startsWith("Memory")) {
+					p.setTextContent("memory(b)");
+				} else {
+					p.setTextContent("time(ms)");
+				}
+				td.appendChild(cell);
+				cell.appendChild(p);
+				myTable.appendChild(td);
+			} else {
+				td = (TableTableRowElement) lst.item(0); //the first table row is existed.
+			}
+			cell = dom.newOdfElement(TableTableCellElement.class);
+			td.appendChild(cell);
+			p = dom.newOdfElement(OdfTextParagraph.class);
+			p.setTextContent(testTag);
+			cell.appendChild(p);
+
+
+			for (i = 1; i < values.length + 1; i++) {
+				if (i < lst.getLength()) { //table row is existed
+					td = (TableTableRowElement) lst.item(i);
+				} else { //table row is not existed.
+					td = dom.newOdfElement(TableTableRowElement.class);
+					myTable.appendChild(td);
+					//append first cell with labels
+					cell = dom.newOdfElement(TableTableCellElement.class);
+					td.appendChild(cell);
+					p = dom.newOdfElement(OdfTextParagraph.class);
+					p.setTextContent(labels[j]);
+					cell.appendChild(p);
+				}
+				cell = dom.newOdfElement(TableTableCellElement.class);
+				cell.setOfficeValueTypeAttribute("float");
+				cell.setOfficeValueAttribute(new Double(values[j]));
+				p = dom.newOdfElement(OdfTextParagraph.class);
+				p.setTextContent(values[j] + "");
+				cell.appendChild(p);
+				td.appendChild(cell);
+				j++;
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+		}
+	}
+
+	private void firsttry() throws Exception {
+		OdfDocument doc = null;
+		OdfFileDom dom = null;
+		String filename = null;
+
+		for (int j = 0; j < TEST_FILE_NAME.length; j++) {
+			filename = TEST_FILE_FOLDER + TEST_FILE_NAME[j];
+			LOG.log(Level.INFO, "filename:{0}", filename);
+			doc = OdfDocument.loadDocument(filename);
+			dom = doc.getContentDom();
+			doc.save(filename);
+		}
+	}
+
+	private void test() throws Exception {
+		long start, end;
+		OdfDocument doc = null;
+		OdfFileDom dom = null;
+		String filename = null;
+
+		if (TEST_FILE_NAME == null) {
+			return;
+		}
+
+		firsttry();
+
+		for (int i = 0; i < count; i++) {
+			for (int j = 0; j < TEST_FILE_NAME.length; j++) {
+				filename = TEST_FILE_FOLDER + TEST_FILE_NAME[j];
+				start = System.currentTimeMillis();
+				doc = OdfDocument.loadDocument(filename);
+				end = System.currentTimeMillis();
+				totalLoadTimeForEach[j] += end - start;
+				totalTime[0] += end - start;
+				if (i == 0) {
+					System.gc();
+					memoryfootprint[3 * j] = Runtime.getRuntime().totalMemory()
+							- Runtime.getRuntime().freeMemory();
+				}
+
+				start = System.currentTimeMillis();
+				dom = doc.getContentDom();
+				end = System.currentTimeMillis();
+				totalParseTimeForEach[j] += end - start;
+				totalTime[1] += end - start;
+				if (i == 0) {
+					System.gc();
+					memoryfootprint[3 * j + 1] = Runtime.getRuntime().totalMemory()
+							- Runtime.getRuntime().freeMemory();
+				}
+
+				start = System.currentTimeMillis();
+				doc.save(filename);
+				end = System.currentTimeMillis();
+				totalSaveTimeForEach[j] += end - start;
+				totalTime[2] += end - start;
+
+				doc = null;
+				dom = null;
+				if (i == 0) {
+					System.gc();
+					memoryfootprint[3 * j + 2] = Runtime.getRuntime().totalMemory()
+							- Runtime.getRuntime().freeMemory();
+				}
+			}
+		}
+
+		for (int i = 0; i < 3; i++) {
+			totalTime[i] = totalTime[i] / count;
+		}
+
+		for (int i = 0; i < TEST_FILE_NAME.length; i++) {
+			totalLoadTimeForEach[i] = totalLoadTimeForEach[i] / count;
+			totalParseTimeForEach[i] = totalParseTimeForEach[i] / count;
+			totalSaveTimeForEach[i] = totalSaveTimeForEach[i] / count;
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/EmbeddedDocumentTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/EmbeddedDocumentTest.java
new file mode 100644
index 0000000..1520d07
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/EmbeddedDocumentTest.java
@@ -0,0 +1,344 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.doc.OdfDocument.OdfMediaType;
+import org.odftoolkit.odfdom.doc.table.OdfTable;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class EmbeddedDocumentTest {
+
+	private static final Logger LOG = Logger.getLogger(EmbeddedDocumentTest.class.getName());
+	private static final String TEST_FILE_FOLDER = ResourceUtilities.getTestOutputFolder();
+	private static final String TEST_FILE_EMBEDDED = "performance/Presentation1_INVALID.odp";
+	private static final String TEST_FILE_EMBEDDED_SAVE_OUT = "SaveEmbeddedDoc.odt";
+	private static final String TEST_FILE_EMBEDDED_SIDEBYSIDE_SAVE_OUT = "SaveEmbeddedDocSideBySide.odt";
+	private static final String TEST_FILE_EMBEDDED_INCLUDED_SAVE_OUT = "SaveEmbeddedDocIncluded.odt";
+	private static final String TEST_FILE_REMOVE_EMBEDDED_SAVE_OUT = "RemoveEmbeddedDoc.odt";
+	private static final String TEST_FILE_MODIFIED_EMBEDDED = "TestModifiedEmbeddedDoc.odt";
+	private static final String TEST_FILE_MODIFIED_EMBEDDED_SAVE_STANDALONE = "SaveModifiedEmbeddedDocAlone.odt";
+	private static final String TEST_SPAN_TEXT = "Modify Header";
+	private static final String TEST_PIC = "testA.jpg";
+	private static final String TEST_PIC_ANOTHER = "testB.jpg";
+	private static final String SLASH = "/";
+
+	/**
+	 * The document A contains the embedded document E1, 
+	 * this test case is used to embed E1 to another document B
+	 */
+	@Test
+	public void testEmbedEmbeddedDocument() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_EMBEDDED));
+			OdfDocument saveDoc = OdfTextDocument.newTextDocument();
+			Map<String, OdfDocument> subDocs = doc.loadSubDocuments();
+			List<String> subDocNames = new ArrayList<String>();
+			for (String childDocPath : subDocs.keySet()) {
+				OdfDocument childDoc = subDocs.get(childDocPath);
+				String embeddedDocPath = childDoc.getDocumentPath();
+				saveDoc.insertDocument(childDoc, embeddedDocPath);
+				subDocNames.add(embeddedDocPath);
+			}
+			Set<String> paths = saveDoc.getPackage().getDocumentPaths();
+			int docCount = paths.size();
+			paths = saveDoc.getPackage().getDocumentPaths("application/vnd.oasis.opendocument.presentation");
+			int presentationDocCount = paths.size();
+			Assert.assertTrue(docCount > presentationDocCount);
+			saveDoc.save(TEST_FILE_FOLDER + TEST_FILE_EMBEDDED_SAVE_OUT);
+			saveDoc.close();
+			saveDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_EMBEDDED_SAVE_OUT));
+			Map<String, OdfDocument> reloadedSubDocs = saveDoc.loadSubDocuments();
+			Assert.assertTrue(subDocs.size() == reloadedSubDocs.size());
+			for (String childDocPath : subDocs.keySet()) {
+				Assert.assertEquals(subDocs.get(childDocPath).getMediaTypeString(), reloadedSubDocs.get(childDocPath).getMediaTypeString());
+			}
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail("Failed to embed an embedded Document: '" + ex.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * The document B is embedded to document A 
+	 * and the directory path of A and B are absolute from the package
+	 * DOCA/ and DOCB/
+	 */
+	@Test
+	public void testembeddedDocumentsLocatedSideBySide() {
+		try {
+			OdfTextDocument odtRootDoc = OdfTextDocument.newTextDocument();
+			odtRootDoc.insertDocument(OdfTextDocument.newTextDocument(), "DOCA/");
+			OdfDocument docA = odtRootDoc.loadSubDocument("DOCA");
+			docA.newImage(ResourceUtilities.getURI(TEST_PIC));
+			docA.insertDocument(OdfSpreadsheetDocument.newSpreadsheetDocument(), "../DOCB/");
+			OdfFileDom contentA = docA.getContentDom();
+			XPath xpath = contentA.getXPath();
+			TextPElement lastPara = (TextPElement) xpath.evaluate("//text:p[last()]", contentA, XPathConstants.NODE);
+			addFrameForEmbeddedDoc(contentA, lastPara, "DOCB");
+			OdfDocument docB = odtRootDoc.loadSubDocument("DOCB/");
+			Assert.assertNotNull(docB);
+			Assert.assertNull(odtRootDoc.loadSubDocument("DOCA/DOCB/"));
+			docB.newImage(ResourceUtilities.getURI(TEST_PIC_ANOTHER));
+			OdfTable table1 = docB.getTableList().get(0);
+			table1.setTableName("NewTable");
+			updateFrameForEmbeddedDoc(contentA, "./DOCB", "DOCA/DOCB");
+			//if user want to save the docA with the side by side embedded document
+			//he has to insert it to the sub document of docA and update the xlink:href link
+			docA.insertDocument(docB, "DOCB/");
+			//save
+			docA.save(TEST_FILE_FOLDER + TEST_FILE_EMBEDDED_SIDEBYSIDE_SAVE_OUT);
+			OdfDocument testLoad = OdfDocument.loadDocument(TEST_FILE_FOLDER + TEST_FILE_EMBEDDED_SIDEBYSIDE_SAVE_OUT);
+			OdfFileEntry imageEntry = testLoad.getPackage().getFileEntry(OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC);
+			Assert.assertNotNull(imageEntry);
+			Map<String, OdfDocument> embDocs = testLoad.loadSubDocuments(OdfDocument.OdfMediaType.SPREADSHEET);
+			for(String embedDocPath : embDocs.keySet()){
+				OdfDocument doc1 = embDocs.get(embedDocPath);
+				imageEntry = doc1.getPackage().getFileEntry(doc1.getDocumentPath() + OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC_ANOTHER);
+				Assert.assertNotNull(doc1.getTableByName("NewTable"));
+			}
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * 1) A new sub document text document DOCA/ is inserted into a new text document
+	 * 2) A picture is being added to the subdocument (ie. /DOCA/Pictures/testA.jpg)
+	 * 3) A new sub document spreadsheet document is inserted into the first (ie. /DOCA/DOCB)
+	 * 4) In the last paragraph of /DOCA a frame with a reference to the subdocument DOCB is added
+	 * 5) A picture is being added to the second subdocument (ie. /DOCA/DOCB/Pictures/testB.jpg)
+	 * 6) The spreadsheetname of DOCB is set to "NewTable"
+	 * 7) DOCA/ is saved in a document for its own	 
+	 */
+	@Test
+	public void testembeddedDocumentWithSubPath() {
+		try {
+			OdfTextDocument odtDoc1 = OdfTextDocument.newTextDocument();
+			odtDoc1.insertDocument(OdfTextDocument.newTextDocument(), "DOCA/");
+			OdfDocument docA = odtDoc1.loadSubDocument("DOCA");
+			docA.newImage(ResourceUtilities.getURI(TEST_PIC));
+			docA.insertDocument(OdfSpreadsheetDocument.newSpreadsheetDocument(), "DOCB/");
+			OdfFileDom contentA = docA.getContentDom();
+			XPath xpath = contentA.getXPath();
+			TextPElement lastPara = (TextPElement) xpath.evaluate("//text:p[last()]", contentA, XPathConstants.NODE);
+			addFrameForEmbeddedDoc(contentA, lastPara, "./DOCB");
+			OdfDocument docB = odtDoc1.loadSubDocument("DOCA/DOCB/");
+			docB.newImage(ResourceUtilities.getURI(TEST_PIC_ANOTHER));
+			OdfTable table1 = docB.getTableList().get(0);
+			table1.setTableName("NewTable");
+			Assert.assertNotNull(docB);
+			Assert.assertNull(odtDoc1.loadSubDocument("DOCB/"));
+			docA.save(TEST_FILE_FOLDER + TEST_FILE_EMBEDDED_INCLUDED_SAVE_OUT);
+			OdfDocument testLoad = OdfDocument.loadDocument(TEST_FILE_FOLDER + TEST_FILE_EMBEDDED_INCLUDED_SAVE_OUT);
+			OdfFileEntry imageEntry = testLoad.getPackage().getFileEntry(OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC);
+			Assert.assertNotNull(imageEntry);
+			Map<String, OdfDocument> embDocs = testLoad.loadSubDocuments(OdfDocument.OdfMediaType.SPREADSHEET);
+			for (String childDocPath : embDocs.keySet()) {	
+				OdfDocument doc1 = embDocs.get(childDocPath);
+				imageEntry = doc1.getPackage().getFileEntry(doc1.getDocumentPath() + OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC_ANOTHER);
+				Assert.assertNotNull(doc1.getTableByName("NewTable"));
+			}
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * The document A contains the embedded document E1,
+	 * This test case is used to show how to save the E1 to a stand alone document.
+	 */
+	@Test
+	public void testSaveEmbeddedDocument() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_EMBEDDED));
+			Map<String, OdfDocument> embeddedDocs = doc.loadSubDocuments();
+			for (String childDocPath : embeddedDocs.keySet()) {
+				OdfDocument childDoc = embeddedDocs.get(childDocPath);
+				String embedFileName = childDoc.getDocumentPath();
+				OdfMediaType embedMediaType = OdfMediaType.getOdfMediaType(childDoc.getMediaTypeString());
+				//use '_' replace '/', because '/' is not the valid char in file path
+				embedFileName = embedFileName.replaceAll("/", "_") + "." + embedMediaType.getSuffix();
+				childDoc.save(TEST_FILE_FOLDER + embedFileName);
+				LOG.log(Level.INFO, "Save file : {0}", TEST_FILE_FOLDER + embedFileName);
+				OdfDocument embeddedDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(embedFileName));
+				Assert.assertEquals(embeddedDoc.getMediaTypeString(), embedMediaType.getMediaTypeString());
+			}
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * There are two document, one is Presentation1_INVALID.odp
+	 * another is a new text document TestModifiedEmbeddedDoc.odt
+	 * Presentation1_INVALID.odp contains an embed document named "Object 1/", add one paragraph to Object 1
+	 * then embed "Object 1" to the new text document, and save this text document
+	 * reload TestModifiedEmbeddedDoc.odt, then get and modify embed document "DocA" and save it to a standalone document
+	 * load the saved standalone document, and check the content of it
+	 */
+	@Test
+	public void testEmbedModifiedEmbeddedDocument() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_EMBEDDED));
+			OdfDocument saveDoc = OdfTextDocument.newTextDocument();
+			OdfDocument embeddedDoc = doc.loadSubDocument("Object 1/");
+			//modify content of "Object 1"
+			OdfFileDom embedContentDom = embeddedDoc.getContentDom();
+			XPath xpath = embedContentDom.getXPath();
+			TextHElement header = (TextHElement) xpath.evaluate("//text:h[1]", embedContentDom, XPathConstants.NODE);
+			LOG.log(Level.INFO, "First para: {0}", header.getTextContent());
+			OdfTextSpan spanElem = new OdfTextSpan(embedContentDom);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			header.appendChild(spanElem);
+			//insert image to "Object 1"
+			embeddedDoc.newImage(ResourceUtilities.getURI(TEST_PIC));
+			//embed "Object 1" to TestModifiedEmbeddedDoc.odt as the path /DocA
+			String embedPath = "DocA";
+			saveDoc.insertDocument(embeddedDoc, embedPath);
+			saveDoc.save(TEST_FILE_FOLDER + TEST_FILE_MODIFIED_EMBEDDED);
+			saveDoc.close();
+			//reload TestModifiedEmbeddedDoc.odt
+			saveDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_MODIFIED_EMBEDDED));
+			embeddedDoc = saveDoc.loadSubDocument(embedPath);
+			//check the content of "DocA" and modify it again
+			embedContentDom = embeddedDoc.getContentDom();
+			header = (TextHElement) xpath.evaluate("//text:h[1]", embedContentDom, XPathConstants.NODE);
+			Assert.assertTrue(header.getTextContent().contains(TEST_SPAN_TEXT));
+			header.setTextContent("");
+			String packagePath = embeddedDoc.getDocumentPath() + SLASH + OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC;
+			OdfFileEntry imageEntry = embeddedDoc.getPackage().getFileEntry(packagePath);
+			Assert.assertNotNull(imageEntry);
+			embeddedDoc.newImage(ResourceUtilities.getURI(TEST_PIC_ANOTHER));
+			//save the "DocA" as the standalone document
+			embeddedDoc.save(TEST_FILE_FOLDER + TEST_FILE_MODIFIED_EMBEDDED_SAVE_STANDALONE);
+			//load the standalone document and check the content
+			OdfDocument standaloneDoc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_MODIFIED_EMBEDDED_SAVE_STANDALONE));
+			embedContentDom = standaloneDoc.getContentDom();
+			header = (TextHElement) xpath.evaluate("//text:h[1]", embedContentDom, XPathConstants.NODE);
+			Assert.assertTrue(header.getTextContent().length() == 0);
+			imageEntry = standaloneDoc.getPackage().getFileEntry(OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC);
+			Assert.assertNotNull(imageEntry);
+			OdfFileEntry anotherImageEntry = standaloneDoc.getPackage().getFileEntry(OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + TEST_PIC_ANOTHER);
+			Assert.assertNotNull(anotherImageEntry);
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testRemoveEmbeddedDocument() {
+		try {
+			OdfDocument doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_EMBEDDED));
+			Map<String, OdfDocument> embeddedDocs = doc.loadSubDocuments();
+			List<String> subDocNames = new ArrayList<String>();
+			for (String childDocPath : embeddedDocs.keySet()) {
+				OdfDocument childDoc = embeddedDocs.get(childDocPath);
+				Assert.assertNotNull(childDoc);
+				String embedFileName = childDoc.getDocumentPath();
+				subDocNames.add(embedFileName);
+				doc.removeDocument(embedFileName);
+			}
+			doc.save(TEST_FILE_FOLDER + TEST_FILE_REMOVE_EMBEDDED_SAVE_OUT);
+			doc.close();
+			//check manifest entry for the embed document 
+			//the sub entry of the embed document such as the pictures of the document should also be removed
+			doc = OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_REMOVE_EMBEDDED_SAVE_OUT));
+			Map<String, OdfDocument> reloadedSubDocs = doc.loadSubDocuments();
+			Assert.assertTrue(0 == reloadedSubDocs.size());
+			Set<String> entries = doc.getPackage().getFilePaths();
+			Iterator<String> entryIter = null;
+			for (int i = 0; i < subDocNames.size(); i++) {
+				entryIter = entries.iterator();
+				String embeddedDocPath = subDocNames.get(i);
+				while (entryIter.hasNext()) {
+					String entry = entryIter.next();
+					Assert.assertFalse(entry.startsWith(embeddedDocPath));
+				}
+			}
+			doc.close();
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	private void addFrameForEmbeddedDoc(OdfFileDom dom, TextPElement para, String path) throws Exception {
+		OdfDrawFrame drawFrame = new OdfDrawFrame(dom);
+		drawFrame.setDrawNameAttribute(path);
+		drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+		drawFrame.setSvgXAttribute("0.834cm");
+		drawFrame.setSvgYAttribute("2.919cm");
+		drawFrame.setSvgWidthAttribute("13.257cm");
+		drawFrame.setSvgHeightAttribute("11.375cm");
+		drawFrame.setDrawZIndexAttribute(0);
+
+		DrawObjectElement object = new DrawObjectElement(dom);
+
+		object.setXlinkHrefAttribute(path);
+		object.setXlinkActuateAttribute("onLoad");
+		object.setXlinkShowAttribute("embed");
+		object.setXlinkTypeAttribute("simple");
+		drawFrame.appendChild(object);
+		para.appendChild(drawFrame);
+	}
+
+	private void updateFrameForEmbeddedDoc(OdfFileDom dom, String originPath, String newPath) throws Exception {
+		NodeList objNodes = dom.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "object");
+		for (int i = 0; i < objNodes.getLength(); i++) {
+			OdfElement object = (OdfElement) objNodes.item(i);
+			String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+			if (refObjPath.equals(originPath)) {
+				object.setAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href", newPath);
+			}
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/GRDDLTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/GRDDLTest.java
new file mode 100644
index 0000000..1cc6bdc
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/GRDDLTest.java
@@ -0,0 +1,85 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.util.logging.Logger;
+
+import javax.xml.transform.Templates;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.xml.sax.InputSource;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.test.ModelTestBase;
+
+import java.util.logging.Level;
+import org.junit.Assert;
+
+public class GRDDLTest extends ModelTestBase {
+
+	private static final Logger LOG = Logger.getLogger(GRDDLTest.class
+			.getName());
+	private static final String SIMPLE_ODT = "test_rdfmeta.odt";
+
+	public GRDDLTest(String name) {
+		super(name);
+		// TODO Auto-generated constructor stub
+	}
+
+	@Test
+	public void testGRDDL()  {
+		try {
+			OdfXMLHelper helper = new OdfXMLHelper();
+			OdfTextDocument odt = (OdfTextDocument) OdfDocument
+					.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
+			InputSource inputSource = new InputSource(ResourceUtilities.getURI(
+					"grddl/odf2rdf.xsl").toString());
+			Templates multiFileAccessTemplate = TransformerFactory.newInstance()
+					.newTemplates(new SAXSource(inputSource));
+			ByteArrayOutputStream out = new ByteArrayOutputStream();
+	 
+			helper.transform(odt.getPackage(), "content.xml",
+					multiFileAccessTemplate, new StreamResult(out));
+
+			Model m1 = createMemModel();
+			m1.read(new InputStreamReader(new ByteArrayInputStream(out
+					.toByteArray()), "utf-8"), odt.getPackage().getBaseURI());
+			LOG.info("RDF Model:\n" + m1.toString());
+			TestCase.assertEquals(5, m1.size());
+		} catch (Exception ex) {
+			Assert.fail(ex.getMessage());
+			Logger.getLogger(GRDDLTest.class.getName()).log(Level.SEVERE, null, ex);
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/LoadSaveErrorTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/LoadSaveErrorTest.java
new file mode 100644
index 0000000..5215fb4
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/LoadSaveErrorTest.java
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * Tests the error behaviour while loading or saving a document.
+ */
+public class LoadSaveErrorTest {
+
+	private static final String SOURCE = "OdfTextDocument.odt";
+
+	/**
+	 * The ZIP in this test claims to be an ODT file but then backs this with nothing.
+	 * We should be able to cancel the whole operation through a custom ErrorHandler,
+	 * throwing exception not only for fatal errors.
+	 * 
+	 * @throws SAXException if an XML-related error occurs
+	 * @throws IOException if an I/O error occurs
+	 */
+	@Test
+	public void testInvalidZipAsODF() throws Exception {
+		ByteArrayOutputStream baout = new ByteArrayOutputStream();
+		ZipOutputStream zout = new ZipOutputStream(baout);
+		ZipEntry entry = new ZipEntry("mimetype");
+		zout.putNextEntry(entry);
+		zout.write(OdfDocument.OdfMediaType.TEXT.getMediaTypeString().getBytes("US-ASCII"));
+		zout.closeEntry();
+		zout.close();
+
+		byte[] zip = baout.toByteArray();
+
+		final AtomicInteger warnings = new AtomicInteger(0);
+		final AtomicInteger errors = new AtomicInteger(0);
+		final AtomicInteger fatals = new AtomicInteger(0);
+
+		ErrorHandler errorHandler = new ErrorHandler() {
+
+			public void warning(SAXParseException exception) throws SAXException {
+				warnings.incrementAndGet();
+				Logger.getLogger(getClass().getName()).warning(exception.getLocalizedMessage());
+			}
+
+			public void error(SAXParseException exception) throws SAXException {
+				errors.incrementAndGet();
+				Logger.getLogger(getClass().getName()).severe(exception.getLocalizedMessage());
+				//Here's the difference to DefaultErrorHandler:
+				//we also throw normal errors, not just fatal errors.
+				throw exception;
+			}
+
+			public void fatalError(SAXParseException exception)
+					throws SAXException {
+				fatals.incrementAndGet();
+				Logger.getLogger(getClass().getName()).severe(exception.getLocalizedMessage());
+				throw exception;
+			}
+
+		};
+
+		try {
+			OdfPackage odfPackage = OdfPackage.loadPackage(
+					new ByteArrayInputStream(zip), null, errorHandler);
+			odfPackage.close();
+			Assert.fail("Expected an exception for the incomplete ODF file!");
+		} catch (SAXException se) {
+			//expected
+		}
+		Assert.assertEquals(0, warnings.get());
+		Assert.assertEquals(0, fatals.get());
+		Assert.assertEquals("Expected abortion after the first exception to come through the ErrorHandler",
+				1, errors.get());
+	}
+
+	@Test
+	public void testLoadWithFailingNetwortConnection() throws Exception {
+		String doc = ResourceUtilities.getAbsolutePath(SOURCE);
+		File file = new File(doc);
+		InputStream in = new java.io.FileInputStream(file);
+		try {
+			in = new FailingInputStream(in, 8000);
+			try {
+				OdfPackage.loadPackage(in);
+				Assert.fail("Expected IOException for failing stream!");
+			} catch (IOException ioe) {
+				Assert.assertTrue(ioe.getMessage().contains("Stream failed!"));
+			}
+		} finally {
+			in.close();
+		}
+	}
+
+	/**
+	 * Tests what happens if there is an I/O error while saving an ODF file.
+	 * @throws Exception if an error occurs
+	 */
+	@Test
+	public void testDiskFullOnSave() throws Exception {
+		OdfPackageDocument odfDocument = OdfPackageDocument
+				.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE));
+		Assert.assertTrue(odfDocument.getPackage().contains("content.xml"));
+		String baseURI = odfDocument.getPackage().getBaseURI();
+//		Assert.assertTrue(ResourceUtilities.getURI(SOURCE).toString()
+//				.compareToIgnoreCase(baseURI) == 0);
+		System.out.println("SOURCE URI1:"+ResourceUtilities.getURI(SOURCE).toString());
+		System.out.println("SOURCE URI2:"+baseURI);
+
+		Document odfContent = odfDocument.getFileDom("content.xml");
+		NodeList lst = odfContent.getElementsByTagNameNS(
+				"urn:oasis:names:tc:opendocument:xmlns:text:1.0", "p");
+		Node node = lst.item(0);
+		String oldText = "Changed!!!";
+		node.setTextContent(oldText);
+
+		try {
+			odfDocument.getPackage().save(
+					new DiskFullSimulationOutputStream(400));
+			Assert.fail("Expected an IOException when disk is full!");
+		} catch (IOException ioe) {
+			Assert.assertEquals("Disk full!", ioe.getMessage());
+		}
+	}
+
+	private static class DiskFullSimulationOutputStream extends OutputStream {
+
+		private long remainingBytes;
+
+		public DiskFullSimulationOutputStream(long byteCountUntilDiskFull) {
+			this.remainingBytes = byteCountUntilDiskFull;
+		}
+
+		@Override
+		public void write(int b) throws IOException {
+			remainingBytes--;
+			if (remainingBytes <= 0) {
+				throw new IOException("Disk full!");
+			}
+		}
+
+	}
+
+	/** InputStream that will stop reading after the amount to failure has reached.
+	 By doing so this InputStream emulates a network failure or disc error. */
+	private static class FailingInputStream extends FilterInputStream {
+
+		private long remainingBytes;
+
+		protected FailingInputStream(InputStream in, long bytesUntilFailure) {
+			super(in);
+			this.remainingBytes = bytesUntilFailure;
+		}
+
+		private void processBytes(int count) throws IOException {
+			remainingBytes -= count;
+			if (remainingBytes <= 0) {
+				throw new IOException("Stream failed!");
+			}
+		}
+
+		@Override
+		public int read() throws IOException {
+			processBytes(1);
+			return super.read();
+		}
+
+		@Override
+		public int read(byte[] b, int off, int len) throws IOException {
+			int bytesRead = super.read(b, off, len);
+			if (bytesRead > 0) {
+				processBytes(bytesRead);
+			}
+			return bytesRead;
+		}
+
+		@Override
+		public int read(byte[] b) throws IOException {
+			return read(b, 0, b.length);
+		}
+
+
+
+	}
+
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/LoadSaveTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/LoadSaveTest.java
new file mode 100644
index 0000000..002f3cb
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/LoadSaveTest.java
@@ -0,0 +1,102 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class LoadSaveTest {
+
+    private static final String SOURCE = "not-only-odf.odt";
+    private static final String TARGET = "loadsavetest.odt";
+	private static final String FOREIGN_ATTRIBUTE_NAME = "foreignAttribute";
+	private static final String FOREIGN_ATTRIBUTE_VALUE = "foreignAttributeValue";
+	private static final String FOREIGN_ELEMENT_TEXT = "foreignText";
+
+    public LoadSaveTest() {
+    }
+
+    @Test
+    public void testLoadSave() {
+        try {
+            OdfPackageDocument odfDocument = OdfPackageDocument.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE));
+            Assert.assertTrue(odfDocument.getPackage().contains("content.xml"));
+            String baseURI = odfDocument.getPackage().getBaseURI();
+//            Assert.assertTrue(ResourceUtilities.getURI(SOURCE).toString().compareToIgnoreCase(baseURI) == 0);
+            System.out.println("SOURCE URI1:"+ResourceUtilities.getURI(SOURCE).toString());
+			System.out.println("SOURCE URI2:"+baseURI);
+
+            Document odfContent = odfDocument.getFileDom("content.xml");
+            NodeList lst = odfContent.getElementsByTagNameNS("urn:oasis:names:tc:opendocument:xmlns:text:1.0", "p");
+            Node node = lst.item(0);
+            String oldText = "Changed!!!";
+            node.setTextContent(oldText);
+
+            //Added to reproduce the bug "xlmns:null=""" is added to namespace.
+            OdfFileDom dom = odfDocument.getFileDom("content.xml");
+			Map<String, String> nsByUri = dom.getMapNamespacePrefixByUri();
+			for (Entry<String, String> entry : nsByUri.entrySet()) {
+				Assert.assertNotNull(entry.getValue());
+				Assert.assertFalse(entry.getValue().length()==0);
+				Assert.assertNotNull(entry.getKey());
+				Assert.assertFalse(entry.getKey().length()==0);
+			}
+			
+            odfDocument.save(ResourceUtilities.newTestOutputFile(TARGET));
+            odfDocument = OdfPackageDocument.loadDocument(ResourceUtilities.getAbsolutePath(TARGET));
+
+            odfContent = odfDocument.getFileDom("content.xml");
+            lst = odfContent.getElementsByTagNameNS("urn:oasis:names:tc:opendocument:xmlns:text:1.0", "p");
+            node = lst.item(0);
+            String newText = node.getTextContent();
+            Assert.assertTrue(newText.equals(oldText));
+
+			node = lst.item(1);
+			//check foreign attribute without namespace
+			Element foreignElement = (Element) node.getChildNodes().item(0);
+            String foreignText = foreignElement.getTextContent();
+            Assert.assertTrue(foreignText.equals(FOREIGN_ELEMENT_TEXT));
+
+			//check foreign element without namespace
+			Attr foreignAttr = (Attr) node.getAttributes().getNamedItem(FOREIGN_ATTRIBUTE_NAME);
+			String foreignAttrValue = foreignAttr.getValue();
+            Assert.assertTrue(foreignAttrValue.equals(FOREIGN_ATTRIBUTE_VALUE));
+
+
+
+        } catch (Exception e) {
+        	Logger.getLogger(LoadSaveTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+            Assert.fail(e.getMessage());
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/NoTempFileTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/NoTempFileTest.java
new file mode 100644
index 0000000..73ba5df
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/NoTempFileTest.java
@@ -0,0 +1,135 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.FileInputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+
+public class NoTempFileTest {
+
+	private static final Logger LOG = Logger.getLogger(OdfPackage.class.getName());
+	private static final String TEST_FILE_FOLDER = ResourceUtilities.getTestOutputFolder();
+	private static final String Test_File = "image.odt";
+	private static String IMage = "testA.jpg";
+	private static String New_File = "test3.odt";
+	private static String Test2File = "test2.odt";
+
+	@Before
+	public void setUp() {
+		try {
+			System.setProperty("org.odftoolkit.odfdom.tmpfile.disable", "true");
+			String userPropTempEnable = System.getProperty("org.odftoolkit.odfdom.tmpfile.disable");
+			LOG.info("The test property org.odftoolkit.odfdom.tmpfile.disable is set to '" + userPropTempEnable + "'.");
+		} catch (Exception e) {
+			Logger.getLogger(NoTempFileTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testLoadPkgFromInputStream() {
+		try {
+			FileInputStream docStream = new FileInputStream(TEST_FILE_FOLDER + Test_File);
+			OdfPackage pkg = OdfPackage.loadPackage(docStream);
+			docStream.close();
+
+			OdfFileEntry imagefile = pkg.getFileEntry("Pictures/10000000000000B400000050FF285AE0.png");
+			Assert.assertNotNull(imagefile);
+			Assert.assertEquals("image/png", imagefile.getMediaTypeString());
+
+			byte[] bytes = pkg.getBytes("Pictures/10000000000000B400000050FF285AE0.png");
+			Assert.assertEquals(5551, bytes.length);
+
+		} catch (Exception e) {
+			Logger.getLogger(NoTempFileTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testInsertImageWithoutTemp() {
+		try {
+			// loads the ODF document package from the path
+			FileInputStream docStream = new FileInputStream(TEST_FILE_FOLDER + Test2File);
+			OdfPackage pkg = OdfPackage.loadPackage(docStream);
+			docStream.close();
+
+			// loads the image from the URL and inserts the image in the package, adapting the manifest
+			pkg.insert(new FileInputStream(TEST_FILE_FOLDER + IMage), "Pictures/myHoliday.jpg", "image/jpeg");
+			pkg.save(ResourceUtilities.newTestOutputFile(New_File));
+
+			OdfDocument doc = OdfDocument.loadDocument(TEST_FILE_FOLDER + New_File);
+			OdfFileDom contentDom = doc.getContentDom();
+
+			XPath xpath = contentDom.getXPath();
+			DrawFrameElement frame = contentDom.newOdfElement(DrawFrameElement.class);
+			frame.setSvgHeightAttribute("3in");
+			frame.setSvgWidthAttribute("7in");
+			DrawImageElement image = contentDom.newOdfElement(DrawImageElement.class);
+			image.setXlinkHrefAttribute("Pictures/myHoliday.jpg");
+			frame.appendChild(image);
+
+			TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+			para.appendChild(frame);
+			doc.save(TEST_FILE_FOLDER + New_File);
+			doc.close();
+
+			//Test if the image has been inserted
+			doc = OdfDocument.loadDocument(TEST_FILE_FOLDER + New_File);
+			contentDom = doc.getContentDom();
+			DrawFrameElement frameobj = (DrawFrameElement) xpath.evaluate("//text:p[1]/draw:frame", contentDom, XPathConstants.NODE);
+			Assert.assertEquals("3in", frameobj.getSvgHeightAttribute());
+			Assert.assertEquals("7in", frameobj.getSvgWidthAttribute());
+			DrawImageElement imageobj = (DrawImageElement) frameobj.getFirstChild();
+			Assert.assertEquals("Pictures/myHoliday.jpg", imageobj.getXlinkHrefAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(NoTempFileTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@After
+	public void tearDown() {
+		try {
+			System.setProperty("org.odftoolkit.odfdom.tmpfile.disable", "false");
+			String userPropTempEnable = System.getProperty("org.odftoolkit.odfdom.tmpfile.disable");
+			LOG.info("The test property org.odftoolkit.odfdom.tmpfile.disable is set to '" + userPropTempEnable + "'.");
+		} catch (Exception e) {
+			Logger.getLogger(NoTempFileTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/OdfXMLHelper.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/OdfXMLHelper.java
new file mode 100644
index 0000000..8fb62c1
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/OdfXMLHelper.java
@@ -0,0 +1,378 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+public class OdfXMLHelper {
+
+	/**
+	 * create an XMLReader
+	 * with a Resolver set to parse content in a ODF Package
+	 *
+	 * @param pkg the ODF Package
+	 * @return a SAX XMLReader
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public XMLReader newXMLReader(OdfPackage pkg)
+			throws SAXException, ParserConfigurationException {
+		XMLReader xmlReader = pkg.getXMLReader();
+		xmlReader.setEntityResolver(pkg.getEntityResolver());
+		return xmlReader;
+	}
+
+	/**
+	 * use SAX parser to parse content of package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param contentHandler a SAX Content handler to receive SAX Events
+	 * @param errorHandler a SAX Error handler to be called on errors during parsing
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 */
+	public void parse(OdfPackage pkg, String path, ContentHandler contentHandler, ErrorHandler errorHandler)
+			throws SAXException, ParserConfigurationException, IOException, IllegalArgumentException, TransformerConfigurationException, TransformerException {
+
+		InputStream is = null;
+		try {
+			is = pkg.getInputStream(path);
+			XMLReader reader = newXMLReader(pkg);
+
+			String uri = pkg.getBaseURI() + path;
+
+			if (contentHandler != null) {
+				reader.setContentHandler(contentHandler);
+			}
+			if (errorHandler != null) {
+				reader.setErrorHandler(errorHandler);
+			}
+
+			InputSource ins = new InputSource(is);
+			ins.setSystemId(uri);
+
+			reader.parse(ins);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+		} finally {
+			try {
+				is.close();
+			} catch (IOException ex) {
+				Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templatePath a path to a file in the filesystem containing an XSL Template
+	 * @param outPath a path in the filesystem for the output of the XSL Transformation
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, String templatePath, String outPath)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		transform(pkg, path, new File(templatePath), new File(outPath));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templateSource TraX Source of an XSL Transformation Template
+	 * @param outPath path to an output file for the XSL Transformation
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Source templateSource, String outPath)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		transform(pkg, path, templateSource, new File(outPath));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templateSource TraX Source of an XSL Transformation
+	 * @param out an output File
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Source templateSource, File out)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		transform(pkg, path, templateSource, new StreamResult(out));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * insert result back to package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templatePath path inside the filesystem to an XSL template file
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, String templatePath)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+		transform(pkg, path, new File(templatePath));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param template File containing an XSLT Template
+	 * @param out File for the XSLT ouput
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, File template, File out)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		TransformerFactory transformerfactory = TransformerFactory.newInstance();
+
+		Templates templates = transformerfactory.newTemplates(new StreamSource(template));
+		transform(pkg, path, templates, new StreamResult(out));
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * insert result back to package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param template a File containing an XSLT Template
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, File template)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		TransformerFactory transformerfactory = TransformerFactory.newInstance();
+
+		Templates templates = transformerfactory.newTemplates(new StreamSource(template));
+		transform(pkg, path, templates);
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templateSource TraX Source of an XSLT Template
+	 * @param result TraX Result of XSL-Tranformation
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Source templateSource, Result result)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException,
+			ParserConfigurationException {
+		TransformerFactory transformerfactory = TransformerFactory.newInstance();
+		transformerfactory.setURIResolver(pkg.getURIResolver());
+
+		Templates templates = transformerfactory.newTemplates(templateSource);
+		transform(pkg, path, templates, result);
+	}
+
+	/**
+	 * Does an XSL-Transformation on content contained in package.<br/><br/>
+	 *
+	 * There are three default parameteres provided to the transformation:
+	 * There are three default parameteres provided to the transformation:
+	 * <ol>
+	 * <li><b>sourceURL:</b> the URL of the source directory </li>
+	 * <li><b>sourceBaseURL:</b> baseURL of the source file (the package).
+	 * This URL necessary to access any content within the package from the XSLT scripts.
+	 * The relative package path will concatenated after the 'sourceBaseURL'.</li>
+	 * <li><b>targetURL:</b> the URL of the target directory</li>
+	 * <li><b>targetBaseURL:</b>the baseURL of the target file</li>
+	 * </ol>
+	 *
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templates TraX XSLT Template
+	 * @param result TraX XSLT Result
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Templates templates, Result result)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException,
+			ParserConfigurationException {
+		try {
+
+			Source source = null;
+			String uri = pkg.getBaseURI() + path;
+			Document doc = pkg.getDom(path);
+			source = new DOMSource(doc);
+			Transformer transformer = templates.newTransformer();
+			transformer.setURIResolver(pkg.getURIResolver());
+
+			transformer.setParameter("sourceURL", uri);
+			transformer.setParameter("sourceBaseURL", pkg.getBaseURI() + "/");
+
+			uri = result.getSystemId();
+			if (uri != null) {
+				transformer.setParameter("targetURL", uri);
+				int i = uri.lastIndexOf('/');
+				if (i > 0) {
+					uri = uri.substring(0, i + 1);
+					transformer.setParameter("targetBaseURL", uri);
+				}
+			}
+			DocumentType doctype = doc.getDoctype();
+			if (doctype != null) {
+				if (doctype.getPublicId() != null) {
+					transformer.setParameter("publicType", doctype.getPublicId());
+				}
+				if (doctype.getSystemId() != null) {
+					transformer.setParameter("systemType", doctype.getSystemId());
+				}
+			}
+
+			transformer.transform(source, result);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+	}
+
+	/**
+	 * Do XSL-Transformation on content contained in package
+	 * and insert result back to package
+	 * @param pkg a OdfPackage
+	 * @param path a path inside the OdfPackage, eg. to a contained content.xml stream
+	 * @param templates Trax XSLT Template
+	 * @throws TransformerConfigurationException
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 * @throws SAXException
+	 * @throws ParserConfigurationException
+	 */
+	public void transform(OdfPackage pkg, String path, Templates templates)
+			throws TransformerConfigurationException, TransformerException,
+			IOException, IllegalArgumentException, SAXException, ParserConfigurationException {
+
+		Result result = null;
+		ByteArrayOutputStream baos = null;
+
+//		if (pkg.isDomCached(path)) {
+//			result = new DOMResult();
+//		} else {
+			baos = new ByteArrayOutputStream();
+			result = new StreamResult(baos);
+//		}
+
+		transform(pkg, path, templates, result);
+
+//		if (pkg.isDomCached(path)) {
+//			try {
+//				pkg.insert((Document) ((DOMResult) result).getNode(), path, null);
+//			} catch (Exception ex) {
+//				Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+//			}
+//		} else {
+			try {
+				byte[] data = baos.toByteArray();
+				pkg.insert(data, path, "text/xml");
+			} catch (Exception ex) {
+				Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex);
+			}
+//		}
+
+	}
+}
+
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackagePathTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackagePathTest.java
new file mode 100644
index 0000000..8a6011f
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackagePathTest.java
@@ -0,0 +1,37 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.odftoolkit.odfdom.pkg;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PackagePathTest {
+
+	@Test
+	public void normalizePath() {
+		Assert.assertEquals(OdfPackage.normalizePath("docA1///docA2/.."), "docA1/");
+		Assert.assertEquals(OdfPackage.normalizePath("docA1/../docA2"), "docA2");
+		Assert.assertEquals(OdfPackage.normalizePath("docA1/../docA2/./."), "docA2/");
+		Assert.assertEquals(OdfPackage.normalizePath("docA1/docA2/docA3/../../docA4/"), "docA1/docA4/");
+		Assert.assertEquals(OdfPackage.normalizePath("docA1/docA2/docA3/../docA4/../../docA5/"), "docA1/docA5/");
+	}
+
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java
new file mode 100644
index 0000000..58be527
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/PackageTest.java
@@ -0,0 +1,384 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import javax.xml.transform.Templates;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfPresentationDocument;
+import org.odftoolkit.odfdom.doc.OdfSpreadsheetDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.type.AnyURI;
+import org.odftoolkit.odfdom.utils.ErrorHandlerStub;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class PackageTest {
+	
+	private static final Logger LOG = Logger.getLogger(PackageTest.class.getName());
+	private static final String mImagePath = "src/main/javadoc/doc-files/";
+	private static final String mImageName = "ODFDOM-Layered-Model.png";
+	private static final String mImageMediaType = "image/png";
+	private static final String XSL_CONCAT = "xslt/concatfiles.xsl";
+	private static final String XSL_OUTPUT = "ResolverTest.html";
+	// ToDo: Package Structure for test output possbile?
+	// private static final String XSL_OUTPUT ="pkg" + File.separator +
+	// "ResolverTest.html";
+	private static final String SIMPLE_ODT = "test2.odt";
+	private static final String ODF_FORMULAR_TEST_FILE = "SimpleFormula.odf";
+	private static final String IMAGE_TEST_FILE = "testA.jpg";
+	private static final String IMAGE_PRESENTATION = "imageCompressed.odp";
+	private static final String TARGET_STEP_1 = "PackageLoadTestStep1.ods";
+	private static final String TARGET_STEP_2 = "PackageLoadTestStep2.ods";
+	private static final String TARGET_STEP_3 = "PackageLoadTestStep3.ods";
+	
+	public PackageTest() {
+	}
+	
+	@Test
+	public void testNotCompressImages() throws Exception {
+		// create test presentation
+		OdfPresentationDocument odp = OdfPresentationDocument.newPresentationDocument();
+		OfficePresentationElement officePresentation = odp.getContentRoot();
+		DrawPageElement page = officePresentation.newDrawPageElement(null);
+		DrawFrameElement frame = page.newDrawFrameElement();
+		OdfDrawImage image = (OdfDrawImage) frame.newDrawImageElement();
+		image.newImage(ResourceUtilities.getURI(IMAGE_TEST_FILE));
+		odp.save(ResourceUtilities.newTestOutputFile(IMAGE_PRESENTATION));
+		
+		// test if the image is not compressed
+		ZipInputStream zinput = new ZipInputStream(ResourceUtilities.getTestResourceAsStream(IMAGE_PRESENTATION));
+		ZipEntry entry = zinput.getNextEntry();
+		while (entry != null) {
+			String entryName = entry.getName();
+			if (entryName.endsWith(".jpg")) {
+				File f = new File(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
+				Assert.assertEquals(ZipEntry.STORED, entry.getMethod());
+				Assert.assertEquals(f.length(), entry.getSize());
+			}
+			entry = zinput.getNextEntry();
+		}
+	}
+	
+	@Test
+	public void loadPackage() {
+		try {
+			
+			// LOAD PACKAGE FORMULA
+			LOG.info("Loading an unsupported ODF Formula document as an ODF Package!");
+			OdfPackage formulaPackage = OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath(ODF_FORMULAR_TEST_FILE));
+			Assert.assertNotNull(formulaPackage);
+			
+			// LOAD PACKAGE IMAGE
+			LOG.info("Loading an unsupported image file as an ODF Package!");
+			try {
+				// Exception is expected!
+				OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
+				Assert.fail();
+			} catch (Exception e) {
+				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+					LOG.log(Level.SEVERE, null, e);
+					Assert.fail();
+				}
+			}
+			
+			// LOAD PACKAGE IMAGE (WITH ERROR HANDLER)
+			LOG.info("Loading an unsupported image file as an ODF Package (with error handler)!");
+			try {
+				// Exception is expected by error handler!
+				OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE)), null, new DefaultHandler());
+				Assert.fail();
+			} catch (SAXException e) {
+				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+					LOG.log(Level.SEVERE, null, e);
+					Assert.fail();
+				}
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testPackage() {
+		File tmpFile1 = ResourceUtilities.newTestOutputFile(TARGET_STEP_1);
+		File tmpFile2 = ResourceUtilities.newTestOutputFile(TARGET_STEP_2);
+		File tmpFile3 = ResourceUtilities.newTestOutputFile(TARGET_STEP_3);
+		OdfDocument doc = null;
+		try {
+			doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			doc.save(tmpFile1);
+			doc.close();
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, mImagePath, ex);
+			Assert.fail();
+		}
+		
+		long lengthBefore = tmpFile1.length();
+		try {
+			// not allowed to change the document simply by open and save
+			OdfPackage odfPackage = OdfPackage.loadPackage(tmpFile1);
+			
+			URI imageURI = new URI(mImagePath + mImageName);
+			// testing encoded none ASCII in URL path
+			String pkgRef1 = AnyURI.encodePath("Pictures/a&b.jpg");
+			LOG.log(Level.INFO, "Attempt to write graphic to package path: {0}", pkgRef1);
+			odfPackage.insert(uri2ByteArray(imageURI), pkgRef1, mImageMediaType);
+			
+			// testing allowed none-ASCII in URL path (see rfc1808.txt)
+			String pkgRef2 = "Pictures/a&%" + "\u00ea" + "\u00f1" + "\u00fc" + "b.jpg";
+			LOG.log(Level.INFO, "Attempt to write graphic to package path: {0}", pkgRef2);
+			odfPackage.insert(uri2ByteArray(imageURI), pkgRef2, mImageMediaType);
+			odfPackage.save(tmpFile2);
+			long lengthAfter2 = tmpFile2.length();
+			// the new package with the images have to be bigger
+			Assert.assertTrue(lengthBefore < lengthAfter2);
+			odfPackage.remove(pkgRef1);
+			odfPackage.remove(pkgRef2);
+			odfPackage.remove("Pictures/");
+			odfPackage.save(tmpFile3);
+			long lengthAfter3 = tmpFile3.length();
+			odfPackage.close();
+			
+			// the package without the images should be as long as before
+			Assert.assertTrue("The files \n\t" + tmpFile1.getAbsolutePath() + " and \n\t" + tmpFile3.getAbsolutePath() + " differ!", lengthBefore == lengthAfter3);
+			
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, mImagePath, ex);
+			Assert.fail();
+		}
+	}
+	
+	private static byte[] uri2ByteArray(URI uri) {
+		byte[] fileBytes = null;
+		try {
+			InputStream fileStream = null;
+			if (uri.isAbsolute()) {
+				// if the URI is absolute it can be converted to URL
+				fileStream = uri.toURL().openStream();
+			} else {
+				// otherwise create a file class to open the transformStream
+				fileStream = new FileInputStream(uri.toString());
+				// TODO: error handling in this case! -> allow method
+				// insert(URI, ppath, mtype)?
+			}
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			BufferedInputStream bis = new BufferedInputStream(fileStream);
+			StreamHelper.transformStream(bis, baos);
+			fileBytes = baos.toByteArray();
+		} catch (Exception e) {
+			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+			e.getLocalizedMessage();
+		}
+		return fileBytes;
+	}
+	
+	/**
+	 * Testing the XML helper and the OdfPackage to handle two files at the same
+	 * time (have them open)
+	 */
+	@Test
+	public void testResolverWithXSLT() {
+		try {
+			OdfXMLHelper helper = new OdfXMLHelper();
+			OdfTextDocument odt = (OdfTextDocument) OdfDocument.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
+			InputSource inputSource = new InputSource(ResourceUtilities.getURI(XSL_CONCAT).toString());
+			Templates multiFileAccessTemplate = TransformerFactory.newInstance().newTemplates(new SAXSource(inputSource));
+			File xslOut = ResourceUtilities.newTestOutputFile(XSL_OUTPUT);
+			helper.transform(odt.getPackage(), "content.xml", multiFileAccessTemplate, new StreamResult(xslOut));
+			LOG.info("Transformed ODF document " + SIMPLE_ODT + " to " + xslOut.getAbsolutePath() + "!");
+			File testOutputFile = new File(xslOut.getAbsolutePath());
+			if (testOutputFile.length() < 100) {
+				String errorMsg = "The file " + xslOut.getAbsolutePath() + " is smaller than it should be. \nIt was not created from multiple package files!";
+				LOG.severe(errorMsg);
+				Assert.fail(errorMsg);
+			}
+		} catch (Throwable t) {
+			Logger.getLogger(PackageTest.class.getName()).log(Level.SEVERE, t.getMessage(), t);
+			Assert.fail();
+		}
+		
+	}
+	
+	@Test
+	public void validationTestDefault() {
+		try {
+			// default no error handler: warnings and errors are not reported
+			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testInvalidPkg1.odt"));
+			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testInvalidPkg2.odt"));
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail();
+		}
+		
+		// default no error handler: fatal errors are reported
+		try {
+			OdfPackage.loadPackage(ResourceUtilities.getAbsolutePath("testA.jpg"));
+			Assert.fail();
+		} catch (Exception e) {
+			String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+			if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+				Assert.fail();
+			}
+		}
+	}
+	
+	@Test
+	public void loadPackageWithoutManifest() {
+		try {
+			// regression for ODFTOOLKIT-327: invalid package without
+			// errorhandler
+			// doesn't throw NPE
+			ByteArrayOutputStream out = new ByteArrayOutputStream();
+			ZipOutputStream zipped = new ZipOutputStream(out);
+			ZipEntry entry = new ZipEntry("someentry");
+			zipped.putNextEntry(entry);
+			zipped.close();
+			
+			byte[] data = out.toByteArray();
+			ByteArrayInputStream in = new ByteArrayInputStream(data);
+			OdfPackage pkg = OdfPackage.loadPackage(in);
+			Assert.assertNotNull(pkg);
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail();
+		}
+	}
+	
+	@Test
+	public void validationTest() {
+		
+		// TESTDOC1: Expected ODF Warnings
+		Map expectedWarning1 = new HashMap();
+		expectedWarning1.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
+		
+		// TESTDOC1: Expected ODF Errors
+		Map expectedErrors1 = new HashMap();
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_NOT_FIRST_IN_PACKAGE, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_IS_COMPRESSED, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_HAS_EXTRA_FIELD, 1);
+		expectedErrors1.put(OdfPackageConstraint.MIMETYPE_DIFFERS_FROM_PACKAGE, 1);
+		expectedErrors1.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 1);
+		ErrorHandlerStub handler1 = new ErrorHandlerStub(expectedWarning1, expectedErrors1, null);
+		handler1.setTestFilePath("testInvalidPkg1.odt");
+		
+		// TESTDOC2: Expected ODF Warnings
+		Map expectedWarning2 = new HashMap();
+		expectedWarning2.put(OdfPackageConstraint.MIMETYPE_NOT_IN_PACKAGE, 1);
+		expectedWarning2.put(OdfPackageConstraint.MANIFEST_LISTS_DIRECTORY, 10);
+		
+		// TESTDOC2: Expected ODF Errors
+		Map expectedErrors2 = new HashMap();
+		expectedErrors2.put(OdfPackageConstraint.MANIFEST_DOES_NOT_LIST_FILE, 1);
+		expectedErrors2.put(OdfPackageConstraint.MANIFEST_LISTS_NONEXISTENT_FILE, 3);
+		ErrorHandlerStub handler2 = new ErrorHandlerStub(expectedWarning2, expectedErrors2, null);
+		handler2.setTestFilePath("testInvalidPkg2.odt");
+		
+		// TESTDOC3 DESCRIPTION - only mimetype file in package
+		// TESTDOC3: Expected ODF Errors
+		Map expectedErrors3 = new HashMap();
+		expectedErrors3.put(OdfPackageConstraint.MANIFEST_NOT_IN_PACKAGE, 1);
+		expectedErrors3.put(OdfPackageConstraint.MIMETYPE_WITHOUT_MANIFEST_MEDIATYPE, 1);
+		ErrorHandlerStub handler3 = new ErrorHandlerStub(null, expectedErrors3, null);
+		handler3.setTestFilePath("testInvalidPkg3.odt");
+		
+		// TESTDOC4: Expected ODF FatalErrors
+		Map<ValidationConstraint, Integer> expectedFatalErrors4 = new HashMap<ValidationConstraint, Integer>();
+		// loading a graphic instead an ODF document
+		expectedFatalErrors4.put(OdfPackageConstraint.PACKAGE_IS_NO_ZIP, 1);
+		ErrorHandlerStub handler4 = new ErrorHandlerStub(null, null, expectedFatalErrors4);
+		
+		try {
+			OdfPackage pkg1 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler1.getTestFilePath())), null, handler1);
+			Assert.assertNotNull(pkg1);
+			OdfPackage pkg2 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler2.getTestFilePath())), null, handler2);
+			Assert.assertNotNull(pkg2);
+			OdfPackage pkg3 = OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath(handler3.getTestFilePath())), null, handler3);
+			Assert.assertNotNull(pkg3);
+			try {
+				OdfPackage.loadPackage(new File(ResourceUtilities.getAbsolutePath("testA.jpg")), null, handler4);
+				Assert.fail();
+			} catch (Exception e) {
+				String errorMsg = OdfPackageConstraint.PACKAGE_IS_NO_ZIP.getMessage();
+				if (!e.getMessage().endsWith(errorMsg.substring(errorMsg.indexOf("%1$s") + 4))) {
+					Assert.fail();
+				}
+			}
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, null, ex);
+			Assert.fail(ex.toString());
+		}
+		handler1.validate();
+		handler2.validate();
+		handler3.validate();
+		handler4.validate();
+	}
+	
+	@Test
+	public void testPackagePassword() {
+		File tmpFile = ResourceUtilities.newTestOutputFile("PackagePassword.ods");
+		OdfDocument doc = null;
+		try {
+			doc = OdfSpreadsheetDocument.newSpreadsheetDocument();
+			doc.getPackage().setPassword("password");
+			doc.save(tmpFile);
+			doc.close();
+			OdfPackage odfPackage = OdfPackage.loadPackage(tmpFile, "password", null);
+			byte[] contentBytes = odfPackage.getBytes("content.xml");
+			Assert.assertNotNull(contentBytes);
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, "password test failed.", ex);
+			Assert.fail();
+		}
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/RDFMetadataTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/RDFMetadataTest.java
new file mode 100644
index 0000000..529f56b
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/pkg/RDFMetadataTest.java
@@ -0,0 +1,280 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.pkg;
+
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.doc.OdfTextDocument;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.text.TextBookmarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextMetaElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.rdfa.BookmarkRDFMetadataExtractor;
+import org.odftoolkit.odfdom.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+import com.hp.hpl.jena.rdf.model.Literal;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.Statement;
+import com.hp.hpl.jena.rdf.model.StmtIterator;
+import com.hp.hpl.jena.rdf.model.test.ModelTestBase;
+import com.hp.hpl.jena.util.PrintUtil;
+
+public class RDFMetadataTest extends ModelTestBase {
+
+	private static final Logger LOG = Logger.getLogger(RDFMetadataTest.class
+			.getName());
+	private static final String SIMPLE_ODT = "test_rdfmeta.odt";
+
+	public RDFMetadataTest(String name) {
+		super(name);
+		// TODO Auto-generated constructor stub
+	}
+
+	@Test
+	public void testGetRDFMetaFromGRDDLXSLT() throws Exception {
+		OdfTextDocument odt = (OdfTextDocument) OdfDocument
+				.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
+		Model m1 = odt.getManifestRDFMetadata();
+		LOG.info("RDF Model - manifest:\n" + m1.toString());				
+		long size1 = m1.size();
+		TestCase.assertEquals(25, size1);
+
+		Model m2 = odt.getInContentMetadata();
+		LOG.info("RDF Model - rood document in-content:\n" + m1.toString());				
+		long size2 = m2.size();
+		TestCase.assertEquals(20, size2);
+
+		Model m = odt.getRDFMetadata();
+
+		// This triples are duplicated in m1 and m2:
+		// (test_rdfmeta.odt rdf:type
+		// http://docs.oasis-open.org/ns/office/1.2/meta/pkg#Document)
+		// (test_rdfmeta.odt/embeded.odt rdf:type
+		// http://docs.oasis-open.org/ns/office/1.2/meta/pkg#Document)
+//		int duplicated = 2;
+		Model m3 = m1.intersection(m2);
+		LOG.info("RDF Model - duplicated (manifest & in-content of root doc):\n" + m3.toString());
+// Uncertain about the previuos statement, as the duplicated RDF triple do not have an identical subject..
+//		TestCase.assertEquals(duplicated, m3.size());
+//		TestCase.assertEquals(size1 + size2 - duplicated, m.size());
+
+		// test the embeded document
+		OdfDocument subDoc = odt.loadSubDocument("embeded.odt");
+		m1 = subDoc.getManifestRDFMetadata();
+		size1 = m1.size();
+		TestCase.assertEquals(5, size1);
+
+		m2 = subDoc.getInContentMetadata();
+		size2 = m2.size();
+		LOG.info("RDF Model - embedded document in content:\n" + m2.toString());
+		TestCase.assertEquals(6, size2);
+
+		m = subDoc.getRDFMetadata();
+
+		// This triple is duplicated in m1 and m2:
+		// (test_rdfmeta.odt/embeded.odt rdf:type
+		// http://docs.oasis-open.org/ns/office/1.2/meta/pkg#Document)
+//		duplicated = 1;
+		m3 = m1.intersection(m2);
+		LOG.info("RDF Model - intersection of in-content metadata of root & embedded document:\n" + m2.toString());
+		//TestCase.assertEquals(duplicated, m3.size());
+		//TestCase.assertEquals(size1 + size2 - duplicated, m.size());
+
+	}
+
+	@Test
+	public void testGetInContentMetaFromCache() throws Exception {
+		OdfTextDocument odt = (OdfTextDocument) OdfDocument
+				.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
+		Model m1 = odt.getInContentMetadataFromCache();
+
+		// We have the following 1 triple in cache:
+		// (http://dbpedia.org/page/J._R._R._Tolkien
+		// http://www.w3.org/2006/vcard/ns#fn 'John Ronald Reuel Tolkien')
+		TestCase.assertEquals(1, m1.size());
+
+		OdfContentDom contentDom = odt.getContentDom();
+		XPath xpath = contentDom.getXPath();
+		TextMetaElement tm = (TextMetaElement) xpath.evaluate(
+				"//text:p/text:meta[last()]", contentDom, XPathConstants.NODE);
+
+		tm.setXhtmlAboutAttribute("http://dbpedia.org/page/J._K._Rowling");
+		m1 = odt.getInContentMetadataFromCache();
+		PrintUtil.printOut(m1.listStatements());
+		TestCase.assertEquals("http://dbpedia.org/page/J._K._Rowling", m1
+				.listStatements().nextStatement().getSubject().getURI());
+
+		tm.setTextContent("Joanne Kathleen Rowling");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals("Joanne Kathleen Rowling", m1.listStatements()
+				.nextStatement().getObject().toString());
+
+		tm.setXhtmlPropertyAttribute("dc:name");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals("http://purl.org/dc/elements/1.1/name", m1
+				.listStatements().nextStatement().getPredicate().getURI());
+
+		Node parent = tm.getParentNode();
+		parent.removeChild(tm);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(0, m1.size());
+		parent.appendChild(tm);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		parent.removeChild(tm);
+
+		TextPElement pEle = contentDom.newOdfElement(TextPElement.class);
+		parent.appendChild(pEle);
+		pEle.setXhtmlAboutAttribute("[dbpedia:J._K._Rowling]");
+		pEle.setXhtmlPropertyAttribute("dbpprop:birthDate dbpprop:dateOfBirth");
+		pEle.setXhtmlDatatypeAttribute("xsd:date");
+		pEle.setXhtmlContentAttribute("1965-07-31");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(2, m1.size());
+		StmtIterator iter = m1.listStatements();
+		while (iter.hasNext()) {
+			Statement stmt = iter.nextStatement();
+			TestCase.assertEquals("http://dbpedia.org/page/J._K._Rowling", stmt
+					.getSubject().getURI());
+			TestCase.assertTrue(stmt.getObject().canAs(Literal.class));
+			Literal literal = stmt.getObject().as(Literal.class);
+			TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#date",
+					literal.getDatatypeURI());
+			TestCase.assertEquals("1965-07-31", literal.getLexicalForm());
+		}
+		pEle.setXhtmlPropertyAttribute("dc:date");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		TestCase.assertEquals("http://purl.org/dc/elements/1.1/date", m1
+				.listStatements().nextStatement().getPredicate().getURI());
+
+		parent.removeChild(pEle);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(0, m1.size());
+		parent.appendChild(pEle);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		parent.removeChild(pEle);
+
+		TextHElement hEle = contentDom.newOdfElement(TextHElement.class);
+		parent.appendChild(hEle);
+		hEle.setXhtmlAboutAttribute("[dbpedia:J._K._Rowling]");
+		hEle.setXhtmlPropertyAttribute("dbpprop:children");
+		hEle.setXhtmlDatatypeAttribute("xsd:integer");
+		hEle.setTextContent("2");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		TestCase.assertEquals("http://dbpedia.org/page/J._K._Rowling", m1
+				.listStatements().nextStatement().getSubject().getURI());
+		TestCase.assertEquals("http://dbpedia.org/property/children", m1
+				.listStatements().nextStatement().getPredicate().getURI());
+		TestCase.assertTrue(m1.listStatements().nextStatement().getObject()
+				.canAs(Literal.class));
+		TestCase.assertEquals("2^^http://www.w3.org/2001/XMLSchema#integer", m1
+				.listStatements().nextStatement().getObject().toString());
+		hEle.setTextContent("3");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals("3^^http://www.w3.org/2001/XMLSchema#integer", m1
+				.listStatements().nextStatement().getObject().toString());
+
+		parent.removeChild(hEle);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(0, m1.size());
+		parent.appendChild(hEle);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		parent.removeChild(hEle);
+
+		TableTableCellElement ttce = contentDom
+				.newOdfElement(TableTableCellElement.class);
+		parent.appendChild(ttce);
+		ttce.setXhtmlAboutAttribute("[dbpedia:J._K._Rowling]");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(0, m1.size());
+		ttce.setXhtmlPropertyAttribute("dbpprop:nationality");
+		ttce.setTextContent("British");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		ttce.setXhtmlAboutAttribute("http://dbpedia.org/page/J._R._R._Tolkien");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		TestCase.assertEquals("http://dbpedia.org/page/J._R._R._Tolkien", m1
+				.listStatements().nextStatement().getSubject().getURI());
+
+		TableCoveredTableCellElement tctce = contentDom
+				.newOdfElement(TableCoveredTableCellElement.class);
+		parent.appendChild(tctce);
+		tctce.setXhtmlAboutAttribute("[dbpedia:J._R._R._Tolkien]");
+		tctce.setXhtmlPropertyAttribute("dbpprop:shortDescription");
+		tctce.setXhtmlContentAttribute("British philologist and author");
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(2, m1.size());
+
+		parent.removeChild(ttce);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		parent.appendChild(ttce);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(2, m1.size());
+		parent.removeChild(ttce);
+
+		parent.removeChild(tctce);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(0, m1.size());
+		parent.appendChild(tctce);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(1, m1.size());
+		parent.removeChild(tctce);
+		m1 = odt.getInContentMetadataFromCache();
+		TestCase.assertEquals(0, m1.size());
+
+	}
+
+	@Test
+	public void testGetBookmarkRDFMetadata() throws Exception {
+		OdfTextDocument odt = (OdfTextDocument) OdfDocument
+				.loadDocument(ResourceUtilities.getAbsolutePath(SIMPLE_ODT));
+		Model m = odt.getBookmarkRDFMetadata();
+		TestCase.assertEquals(2, m.size());
+
+		OdfContentDom contentDom = odt.getContentDom();
+		XPath xpath = contentDom.getXPath();
+		TextBookmarkStartElement tm = (TextBookmarkStartElement) xpath
+				.evaluate("//text:bookmark-start[last()]", contentDom,
+						XPathConstants.NODE);
+		BookmarkRDFMetadataExtractor extractor = BookmarkRDFMetadataExtractor
+				.newBookmarkTextExtractor();
+		m = extractor.getBookmarkRDFMetadata(tm);
+		TestCase.assertEquals(1, m.size());
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/type/DataTypeTest.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/type/DataTypeTest.java
new file mode 100644
index 0000000..51bc5d4
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/type/DataTypeTest.java
@@ -0,0 +1,214 @@
+/************************************************************************
+* 
+*  Licensed to the Apache Software Foundation (ASF) under one
+*  or more contributor license agreements.  See the NOTICE file
+*  distributed with this work for additional information
+*  regarding copyright ownership.  The ASF licenses this file
+*  to you under the Apache License, Version 2.0 (the
+*  "License"); you may not use this file except in compliance
+*  with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing,
+*  software distributed under the License is distributed on an
+*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+*  KIND, either express or implied.  See the License for the
+*  specific language governing permissions and limitations
+*  under the License.
+*
+************************************************************************/
+package org.odftoolkit.odfdom.type;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeFactory;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Length.Unit;
+
+public class DataTypeTest {
+
+	private static final Logger LOG = Logger.getLogger(DataTypeTest.class.getName());
+
+	@Test
+	public void testAnyURI() {
+		// AnyURI
+		AnyURI anyURI = AnyURI.valueOf("./Object 1");
+		URI uri = anyURI.getURI();
+		Assert.assertTrue(AnyURI.isValid(uri));
+		try {
+			uri = new URI(URITransformer.encodePath("http://www.sina.com"));
+			Assert.assertTrue(AnyURI.isValid(uri));
+		} catch (URISyntaxException e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testBase64() {
+		// Base64Binary
+		Base64Binary base64Binary = Base64Binary.valueOf("GVCC9H6p8LeqecY96ggY680uoZA=");
+		byte[] bytes = base64Binary.getBytes();
+		LOG.info("bytes:" + bytes.length);
+		Assert.assertTrue(Base64Binary.isValid("KWy1spZbKcHOunnKMB6dVA=="));
+	}
+	
+	@Test
+	public void testCellAddress() {		
+		// CellAddress
+		CellAddress cellAddress = new CellAddress("Sheet1.A3");
+		Assert.assertEquals(cellAddress.toString(), "Sheet1.A3");
+		Assert.assertFalse(CellAddress.isValid("33"));
+		Assert.assertTrue(CellAddress.isValid("$.$Z11"));
+	}
+	
+	@Test
+	public void testCellRangeAddress() {
+		// CellRangeAddress
+		CellRangeAddress cellRangeAddress1 = CellRangeAddress.valueOf("A.A1:A.F19");
+		CellRangeAddress cellRangeAddress2 = new CellRangeAddress(
+				"$(first).8:$(second).19");
+		CellRangeAddress cellRangeAddress3 = new CellRangeAddress("$.$8:$.19");
+		Assert.assertTrue(CellRangeAddress.isValid("$Sheet1.B12:$Sheet1.E35"));
+		
+		// CellRangeAddressList
+		CellRangeAddressList addressList = CellRangeAddressList.valueOf(cellRangeAddress1.toString() + " " + cellRangeAddress2.toString());
+		Assert.assertEquals(addressList.getCellRangesAddressList().get(0).toString(), cellRangeAddress1.toString());
+		CellRangeAddressList addressList2 = null;
+		try {
+			addressList2 = CellRangeAddressList.valueOf("");
+		} catch (IllegalArgumentException ex) {
+			// CellRangeAddressList is not allowed to have a empty string
+			Assert.assertNull(addressList2);
+		}
+	}
+	
+	@Test
+	public void testColor() {
+		// Color
+		try {
+			Color color = new Color("#ff00ff");
+			String hexColor = Color.toSixDigitHexRGB("rgb(123,214,23)");
+			Assert.assertTrue(Color.isValid(hexColor));
+			java.awt.Color awtColor = Color.mapColorToAWTColor(color);
+			Assert.assertEquals(new java.awt.Color(0xff00ff), awtColor);
+			try {
+				color = new Color(255, 0, 255);
+				Assert.assertEquals("#ff00ff", color.toString());
+				color = new Color(new java.awt.Color(255, 0, 255));
+				Assert.assertEquals("#ff00ff", color.toString());
+				color = new Color(1.0f, 0.0f, 1.0f);
+				Assert.assertEquals("#ff00ff", color.toString());
+				color = new Color("#f0f");
+				Assert.assertEquals("#ff00ff", color.toString());
+				Assert.assertEquals("#ff00ff", Color.FUCHSIA.toString());
+			} catch (IllegalArgumentException ie) {
+				Assert.fail(ie.getMessage());
+			}
+			try {
+				Assert.assertEquals("#ff0000", Color.toSixDigitHexRGB("rgb(255,0,0)"));
+				Assert.assertEquals("#ff0000", Color.toSixDigitHexRGB("rgb(300,0,0)"));
+				Assert.assertEquals("#ff0000", Color.toSixDigitHexRGB("rgb(110%, 0%, 0%)"));
+				Assert.assertEquals("#ff00ff", Color.toSixDigitHexRGB("fuchsia"));
+				Assert.assertEquals("#ff0000", Color.toSixDigitHexRGB("#ff0000"));
+				Assert.assertEquals("#ff0000", Color.toSixDigitHexRGB("#f00"));
+			} catch (IllegalArgumentException ie) {
+				Assert.fail(ie.getMessage());
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+	
+	@Test
+	public void testDateTime() {
+		// DateOrDateTime
+		DateTime time1 = DateTime.valueOf("2007-09-28T22:01:13");
+		Assert.assertNotNull(time1);
+		Date time2 = null;
+		try {
+			time2 = Date.valueOf("2007-09-28T22:01:13");
+		} catch (IllegalArgumentException ex) {
+			Assert.assertNull(time2);
+			time2 = Date.valueOf("2007-09-28");
+			Assert.assertNotNull(time2);
+		}
+
+		DatatypeFactory aFactory = new org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl();
+		GregorianCalendar calendar = new GregorianCalendar();
+		LOG.info(aFactory.newXMLGregorianCalendar(calendar).toString());
+		DateOrDateTime time3 = new DateOrDateTime(aFactory.newXMLGregorianCalendar(calendar));
+		Assert.assertNotNull(time3.getXMLGregorianCalendar());
+	}
+	
+	@Test
+	public void testStyle() {
+		// StyleName,StyleNameRef,StyleNameList
+		StyleName styleName1 = new StyleName("ta1");
+		StyleName styleName2 = new StyleName("_22");
+		StyleName styleName3 = StyleName.valueOf("cc_a");
+		Assert.assertFalse(StyleName.isValid(""));
+		Assert.assertFalse(StyleName.isValid("t:1"));
+		StyleNameRef styleNameRef1 = StyleNameRef.valueOf("ce1");
+		Assert.assertTrue(StyleNameRef.isValid(""));
+		List<StyleName> styleList = new ArrayList<StyleName>();
+		styleList.add(StyleName.valueOf(styleNameRef1.toString()));
+		styleList.add(styleName1);
+		styleList.add(styleName2);
+		StyleNameRefs styleRefs = new StyleNameRefs(styleList);
+		Assert.assertEquals(styleRefs.getStyleNameRefList().get(2).toString(),
+				styleName2.toString());
+		// StyleNameRefs is allowed to be empty string, it is defined to have
+		// zero or more NCName
+		Assert.assertTrue(StyleNameRefs.isValid(""));
+		styleList = StyleNameRefs.valueOf("").getStyleNameRefList();
+		Assert.assertTrue(styleList.size() == 0);
+	}
+	
+	@Test
+	public void testItegerPercent() {
+		// Integer,Percent
+		PositiveInteger positiveInt = new PositiveInteger(1);
+		NonNegativeInteger nnInt = new NonNegativeInteger(positiveInt.intValue());
+		Assert.assertFalse(NonNegativeInteger.isValid(-23));
+		Percent percent = new Percent(0.3);
+		Percent percent1 = Percent.valueOf("30.0%");
+		Assert.assertTrue(percent1.doubleValue() == percent.doubleValue());
+	}
+	
+	@Test
+	public void testMeasurement() {
+		// Measurement
+		String inchMeasure = "-4.354in";
+		Length length = new Length(inchMeasure);
+		String cmMeasure = length.mapToUnit(Unit.CENTIMETER);
+		NonNegativeLength nnLength = NonNegativeLength.valueOf(cmMeasure.substring(1));
+		Assert.assertEquals(nnLength.mapToUnit(Unit.INCH), "4.354in");
+		Assert.assertTrue(PositiveLength.isValid("0.01pt"));
+		Assert.assertTrue(NonNegativeLength.isValid("0.00pt"));
+		Assert.assertFalse(NonNegativeLength.isValid("-0.00pt"));
+		int mmValue = Length.parseInt(length.toString(), Unit.MILLIMETER);
+
+		NonNegativePixelLength pixelLength = NonNegativePixelLength.valueOf("1240px");
+		NonNegativePixelLength pixelLength1 = null;
+		try {
+			pixelLength1 = new NonNegativePixelLength("234cm");
+		} catch (NumberFormatException ex) {
+			Assert.assertNull(pixelLength1);
+		}
+		
+		// make sure Units are resolved correctly
+		Unit unit = Length.parseUnit("cm");
+		Assert.assertEquals(Unit.CENTIMETER, unit);
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/ErrorHandlerStub.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/ErrorHandlerStub.java
new file mode 100644
index 0000000..deffcfa
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/ErrorHandlerStub.java
@@ -0,0 +1,142 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.utils;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import junit.framework.Assert;
+import org.odftoolkit.odfdom.dom.OdfSchemaConstraint;
+import org.odftoolkit.odfdom.pkg.OdfPackageConstraint;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.odfdom.pkg.ValidationConstraint;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/** A stub for a real SAX ErrorHandler embracing the expected amount of exceptions to be catched */
+public class ErrorHandlerStub implements ErrorHandler {
+
+	private static final Logger LOG = Logger.getLogger(ErrorHandlerStub.class.getName());
+	/** Map which returns the number of defects for each given ValidationConstraint */
+	private Map<ValidationConstraint, Integer> mExpectedWarning;
+	private Map<ValidationConstraint, Integer> mExpectedError;
+	private Map<ValidationConstraint, Integer> mExpectedFatalError;
+	private String mTestFilePath = null;
+
+	/** @param expectedW Excpected Warnings - a Map relating a certain ValidationConstraint to the number of occurances */
+	/** @param expectedE Excpected Errors	- a Map relating a certain ValidationConstraint to the number of occurances */
+	/** @param expectedF Excpected Fatal	- a Map relating a certain ValidationConstraint to the number of occurances */
+	public ErrorHandlerStub(Map<ValidationConstraint, Integer> expectedW, Map<ValidationConstraint, Integer> expectedE, Map<ValidationConstraint, Integer> expectedF) {
+		mExpectedWarning = expectedW;
+		mExpectedError = expectedE;
+		mExpectedFatalError = expectedF;
+	}
+
+	public void warning(SAXParseException exception) throws SAXException {
+		if (mExpectedWarning == null) {
+			mExpectedWarning = new HashMap<ValidationConstraint, Integer>();
+		}
+		registerProblem(exception, mExpectedWarning);
+	}
+
+	public void error(SAXParseException exception) throws SAXException {
+		if (mExpectedError == null) {
+			mExpectedError = new HashMap<ValidationConstraint, Integer>();
+		}
+		registerProblem(exception, mExpectedError);
+	}
+
+	public void fatalError(SAXParseException exception) throws SAXException {
+		if (mExpectedFatalError == null) {
+			mExpectedFatalError = new HashMap<ValidationConstraint, Integer>();
+		}
+		registerProblem(exception, mExpectedFatalError);
+	}
+
+	private void registerProblem(SAXParseException exception, Map<ValidationConstraint, Integer> problemOccurances) {
+		ValidationConstraint constraint = ((OdfValidationException) exception).getConstraint();
+		Integer problemOccurance = problemOccurances.get(constraint);
+		if (problemOccurance == null) {
+			problemOccurance = 0;
+		}
+		LOG.log(Level.INFO, "EXPECTED VALIDATION MESSAGE:\"{0}\"", exception.getMessage());
+		problemOccurances.put(constraint, --problemOccurance);
+	}
+
+	public void validate() {
+		if (mExpectedWarning != null) {
+			validateProblem(mExpectedWarning, "warning");
+		}
+		if (mExpectedError != null) {
+			validateProblem(mExpectedError, "error");
+		}
+		if (mExpectedFatalError != null) {
+			validateProblem(mExpectedFatalError, "fatalError");
+		}
+	}
+
+	private void validateProblem(Map<ValidationConstraint, Integer> expectedProblems, String level) {
+		Iterator<ValidationConstraint> constraints = expectedProblems.keySet().iterator();
+		while (constraints.hasNext()) {
+			ValidationConstraint constraint = constraints.next();
+			Integer problemOccurance = expectedProblems.get(constraint);
+			if (problemOccurance > 0) {
+				logMissingConstraint(constraint, level, problemOccurance);
+			} else if (problemOccurance < 0) {
+				logUnexpectedConstraint(constraint, level, problemOccurance * -1);
+			}
+		}
+	}
+
+	private void logMissingConstraint(ValidationConstraint constraint, String errorLevel, int problemOccurance) {
+		if (constraint instanceof OdfPackageConstraint) {
+			OdfPackageConstraint pkgConstraint = (OdfPackageConstraint) constraint;
+			Assert.fail(problemOccurance + "x time(s) was in " + getTestFilePath() + " not thrown the ODF 1.2 Package " + errorLevel + " '" + pkgConstraint.name() + "'!");
+		} else {
+			OdfSchemaConstraint schemaConstraint = (OdfSchemaConstraint) constraint;
+			Assert.fail(problemOccurance + "x time(s) was in " + getTestFilePath() + " not thrown the ODF 1.2 Schema " + errorLevel + " '" + schemaConstraint.name() + "'!");
+		}
+	}
+
+	private void logUnexpectedConstraint(ValidationConstraint constraint, String errorLevel, int problemOccurance) {
+		if (constraint instanceof OdfPackageConstraint) {
+			OdfPackageConstraint pkgConstraint = (OdfPackageConstraint) constraint;
+			Assert.fail(problemOccurance + "x time(s) in " + getTestFilePath() + " a new ODF 1.2 Package " + errorLevel + " '" + pkgConstraint.name() + "' was unexpected thrown!");
+		} else {
+			OdfSchemaConstraint schemaConstraint = (OdfSchemaConstraint) constraint;
+			Assert.fail(problemOccurance + "x time(s) in " + getTestFilePath() + " a new ODF 1.2 Schema " + errorLevel + " '" + schemaConstraint.name() + "' was unexpected thrown!");
+		}
+	}
+
+	/** @param testFilePath the path of the test file */
+	public void setTestFilePath(String testFilePath) {
+		mTestFilePath = testFilePath;
+	}
+
+	/** @return the path of the test file */
+	public String getTestFilePath() {
+		return mTestFilePath;
+	}
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/NodeAction.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/NodeAction.java
new file mode 100644
index 0000000..bfec383
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/NodeAction.java
@@ -0,0 +1,38 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.utils;
+
+import org.w3c.dom.Node;
+
+public abstract class NodeAction<T> {
+    protected abstract void apply(Node node, T arg, int depth) throws Exception;
+    private int depth = 0;
+    public void performAction(Node node, T arg) throws Exception {
+        while (node != null) {
+            apply(node, arg, depth);
+            depth++;
+            performAction(node.getFirstChild(), arg);
+            depth--;
+            node = node.getNextSibling();
+        }
+    }
+}
diff --git a/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/ResourceUtilities.java b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/ResourceUtilities.java
new file mode 100644
index 0000000..a5bf621
--- /dev/null
+++ b/trunk/odfdom/src/test/java/org/odftoolkit/odfdom/utils/ResourceUtilities.java
@@ -0,0 +1,115 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfdom.utils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+
+/** Test utility class providing resources for the test in- and output */
+public final class ResourceUtilities {
+
+	private ResourceUtilities() {
+	}
+
+	/** The relative path of the test file will be resolved and the absolute will be returned
+	 * @param relativeFilePath Path of the test resource relative to <code>src/test/resource/</code>.
+	 * @return the absolute path of the test file
+	 * @throws FileNotFoundException If the file could not be found
+	 */
+	public static String getAbsolutePath(String relativeFilePath) throws FileNotFoundException {
+		URI uri = null;
+		try {
+			uri = ResourceUtilities.class.getClassLoader().getResource(relativeFilePath).toURI();
+			uri = new URI(Util.toExternalForm(uri));
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ResourceUtilities.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		if (uri == null) {
+			throw new FileNotFoundException("Could not find the file '" + relativeFilePath + "'!");
+		}
+		return uri.getPath();
+	}
+
+	/** The relative path of the test file will be resolved and the absolute will be returned
+	 * @param relativeFilePath Path of the test resource relative to <code>src/test/resource/</code>.
+	 * @return the URI created based on the relativeFilePath
+	 * @throws URISyntaxException if no URI could be created from the given relative path
+	 */
+	public static URI getURI(String relativeFilePath) throws URISyntaxException {
+		String filePath = "file:" + ResourceUtilities.class.getClassLoader().getResource(relativeFilePath).getPath();
+		filePath = Util.toExternalForm(new URI(filePath));
+		return new URI(filePath);		
+	}
+
+	/** The relative path of the test file will be used to determine an absolute
+	 *  path to a temporary directory in the output directory.
+	 * @param relativeFilePath Path of the test resource relative to <code>src/test/resource/</code>.
+	 * @return absolute path to a test output
+	 * @throws IOException if no absolute Path could be created.
+	 */
+	public static String getTestOutput(String relativeFilePath) throws IOException {
+		return File.createTempFile(relativeFilePath, null).getAbsolutePath();
+	}
+
+	/** The Input of the test file will be resolved and the absolute will be returned
+	 * @param relativeFilePath Path of the test resource relative to <code>src/test/resource/</code>.
+	 * @return the absolute path of the test file
+	 */
+	public static InputStream getTestResourceAsStream(String relativeFilePath) {
+		return ResourceUtilities.class.getClassLoader().getResourceAsStream(relativeFilePath);
+	}
+
+	/** Relative to the test output directory a test file will be returned dependent on the relativeFilePath provided.
+	 * @param relativeFilePath Path of the test output resource relative to <code>target/test-classes/</code>.
+	 * @return the empty <code>File</code> of the test output (to be filled)
+	 */
+	public static File newTestOutputFile(String relativeFilePath) {
+		String filepath = null;
+		try {
+			filepath = ResourceUtilities.class.getClassLoader().getResource("").toURI().getPath() + relativeFilePath;
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ResourceUtilities.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return new File(filepath);
+	}
+
+	/** 
+	 * @return the absolute path of the test output folder, which is usually <code>target/test-classes/</code>.
+	 */
+	public static String getTestOutputFolder() {
+		String testFolder = null;
+		try {
+			testFolder = ResourceUtilities.class.getClassLoader().getResource("").toURI().getPath();
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ResourceUtilities.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return testFolder;		
+	}
+}
diff --git a/trunk/odfdom/src/test/resources/CorruptedMimetypeChart.odc b/trunk/odfdom/src/test/resources/CorruptedMimetypeChart.odc
new file mode 100644
index 0000000..be94ffe
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/CorruptedMimetypeChart.odc
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/CorruptedMimetypeDoc.odt b/trunk/odfdom/src/test/resources/CorruptedMimetypeDoc.odt
new file mode 100644
index 0000000..d5f502a
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/CorruptedMimetypeDoc.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/InvalidUnderlineAttribute.odt b/trunk/odfdom/src/test/resources/InvalidUnderlineAttribute.odt
new file mode 100644
index 0000000..487e20a
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/InvalidUnderlineAttribute.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/Presentation1.odp b/trunk/odfdom/src/test/resources/Presentation1.odp
new file mode 100644
index 0000000..83c4a96
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/Presentation1.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/Presentation2.odp b/trunk/odfdom/src/test/resources/Presentation2.odp
new file mode 100644
index 0000000..7a9289e
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/Presentation2.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/SimpleFormula.odf b/trunk/odfdom/src/test/resources/SimpleFormula.odf
new file mode 100644
index 0000000..0e10240
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/SimpleFormula.odf
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/SlideTest1.odp b/trunk/odfdom/src/test/resources/SlideTest1.odp
new file mode 100644
index 0000000..c4c7842
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/SlideTest1.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/SlideTest2.odp b/trunk/odfdom/src/test/resources/SlideTest2.odp
new file mode 100644
index 0000000..0dbca30
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/SlideTest2.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/SlideTest3.odp b/trunk/odfdom/src/test/resources/SlideTest3.odp
new file mode 100644
index 0000000..e9c53a3
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/SlideTest3.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/TestSpreadsheetStyleTable.ods b/trunk/odfdom/src/test/resources/TestSpreadsheetStyleTable.ods
new file mode 100644
index 0000000..6d0be8c
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/TestSpreadsheetStyleTable.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/TestSpreadsheetTable.ods b/trunk/odfdom/src/test/resources/TestSpreadsheetTable.ods
new file mode 100644
index 0000000..d2f09fb
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/TestSpreadsheetTable.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/TestStyleSelection.odt b/trunk/odfdom/src/test/resources/TestStyleSelection.odt
new file mode 100644
index 0000000..bb84fc0
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/TestStyleSelection.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/TestTextSelection.odt b/trunk/odfdom/src/test/resources/TestTextSelection.odt
new file mode 100644
index 0000000..05dd45f
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/TestTextSelection.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/TestTextTable.odt b/trunk/odfdom/src/test/resources/TestTextTable.odt
new file mode 100644
index 0000000..ddb542d
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/TestTextTable.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/XPathTest-duplicate-prefix.odt b/trunk/odfdom/src/test/resources/XPathTest-duplicate-prefix.odt
new file mode 100644
index 0000000..7b5a2fb
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/XPathTest-duplicate-prefix.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/XPathTest-foreignPrefix.odp b/trunk/odfdom/src/test/resources/XPathTest-foreignPrefix.odp
new file mode 100644
index 0000000..d966770
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/XPathTest-foreignPrefix.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/XPathTest-foreignPrefix2.odp b/trunk/odfdom/src/test/resources/XPathTest-foreignPrefix2.odp
new file mode 100644
index 0000000..18f2c6b
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/XPathTest-foreignPrefix2.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/blank.odp b/trunk/odfdom/src/test/resources/blank.odp
new file mode 100644
index 0000000..b2e9dcc
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/blank.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/chartTestTemplate.otc b/trunk/odfdom/src/test/resources/chartTestTemplate.otc
new file mode 100644
index 0000000..e9ab341
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/chartTestTemplate.otc
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/empty.odt b/trunk/odfdom/src/test/resources/empty.odt
new file mode 100644
index 0000000..6b632ae
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/empty.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/empty_file.ods b/trunk/odfdom/src/test/resources/empty_file.ods
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/empty_file.ods
@@ -0,0 +1 @@
+
diff --git a/trunk/odfdom/src/test/resources/factorymanipulation.odt b/trunk/odfdom/src/test/resources/factorymanipulation.odt
new file mode 100644
index 0000000..beb7388
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/factorymanipulation.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/frame.odt b/trunk/odfdom/src/test/resources/frame.odt
new file mode 100644
index 0000000..188a0ae
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/frame.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/graphicTestTemplate.otg b/trunk/odfdom/src/test/resources/graphicTestTemplate.otg
new file mode 100644
index 0000000..b465714
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/graphicTestTemplate.otg
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/image.odt b/trunk/odfdom/src/test/resources/image.odt
new file mode 100644
index 0000000..df8081a
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/image.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/invalid.ods b/trunk/odfdom/src/test/resources/invalid.ods
new file mode 100644
index 0000000..49f7637
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/invalid.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/list.odt b/trunk/odfdom/src/test/resources/list.odt
new file mode 100644
index 0000000..90c7a17
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/list.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/metaTest.odt b/trunk/odfdom/src/test/resources/metaTest.odt
new file mode 100644
index 0000000..85a5130
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/metaTest.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/navigationtest.odt b/trunk/odfdom/src/test/resources/navigationtest.odt
new file mode 100644
index 0000000..9d2ebc5
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/navigationtest.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/no_size_opt.odt b/trunk/odfdom/src/test/resources/no_size_opt.odt
new file mode 100644
index 0000000..81a2342
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/no_size_opt.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/not-only-odf.odt b/trunk/odfdom/src/test/resources/not-only-odf.odt
new file mode 100644
index 0000000..9ea735e
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/not-only-odf.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Presentation1_INVALID.odp b/trunk/odfdom/src/test/resources/performance/Presentation1_INVALID.odp
new file mode 100644
index 0000000..5df2ea5
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Presentation1_INVALID.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Presentation2.odp b/trunk/odfdom/src/test/resources/performance/Presentation2.odp
new file mode 100644
index 0000000..2c2a7df
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Presentation2.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Presentation3.odp b/trunk/odfdom/src/test/resources/performance/Presentation3.odp
new file mode 100644
index 0000000..f3e3adc
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Presentation3.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Presentation4.odp b/trunk/odfdom/src/test/resources/performance/Presentation4.odp
new file mode 100644
index 0000000..f32c7af
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Presentation4.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Presentation5.odp b/trunk/odfdom/src/test/resources/performance/Presentation5.odp
new file mode 100644
index 0000000..e5b7588
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Presentation5.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Presentation7.odp b/trunk/odfdom/src/test/resources/performance/Presentation7.odp
new file mode 100644
index 0000000..9002ac8
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Presentation7.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Text1.odt b/trunk/odfdom/src/test/resources/performance/Text1.odt
new file mode 100644
index 0000000..4761107
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Text1.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Text3.odt b/trunk/odfdom/src/test/resources/performance/Text3.odt
new file mode 100644
index 0000000..d72df2d
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Text3.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Text4.odt b/trunk/odfdom/src/test/resources/performance/Text4.odt
new file mode 100644
index 0000000..15f208e
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Text4.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Text6.odt b/trunk/odfdom/src/test/resources/performance/Text6.odt
new file mode 100644
index 0000000..61bd0d6
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Text6.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/Text7.odt b/trunk/odfdom/src/test/resources/performance/Text7.odt
new file mode 100644
index 0000000..c691f63
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/Text7.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/spreadsheet1.ods b/trunk/odfdom/src/test/resources/performance/spreadsheet1.ods
new file mode 100644
index 0000000..363bb89
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/spreadsheet1.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/spreadsheet2.ods b/trunk/odfdom/src/test/resources/performance/spreadsheet2.ods
new file mode 100644
index 0000000..4876065
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/spreadsheet2.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/spreadsheet3.ods b/trunk/odfdom/src/test/resources/performance/spreadsheet3.ods
new file mode 100644
index 0000000..60e984a
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/spreadsheet3.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/spreadsheet4.ods b/trunk/odfdom/src/test/resources/performance/spreadsheet4.ods
new file mode 100644
index 0000000..a34f9ca
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/spreadsheet4.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/performance/spreadsheet5.ods b/trunk/odfdom/src/test/resources/performance/spreadsheet5.ods
new file mode 100644
index 0000000..fd4d56f
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/performance/spreadsheet5.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/presentation.odp b/trunk/odfdom/src/test/resources/presentation.odp
new file mode 100644
index 0000000..ad918a3
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/presentation.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/presentationTestTemplate.otp b/trunk/odfdom/src/test/resources/presentationTestTemplate.otp
new file mode 100644
index 0000000..23b2761
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/presentationTestTemplate.otp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/presentationWithEmbedDoc.odp b/trunk/odfdom/src/test/resources/presentationWithEmbedDoc.odp
new file mode 100644
index 0000000..de56a68
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/presentationWithEmbedDoc.odp
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/sharedautostyles.odt b/trunk/odfdom/src/test/resources/sharedautostyles.odt
new file mode 100644
index 0000000..509bf94
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/sharedautostyles.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/simple.svg b/trunk/odfdom/src/test/resources/simple.svg
new file mode 100644
index 0000000..e5b85cc
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/simple.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="744.09448"
+   height="1052.3622"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1">
+    <rect
+       width="200"
+       height="125.71429"
+       x="51.42857"
+       y="226.6479"
+       id="rect2985"
+       style="fill:#5d4848;fill-opacity:1;stroke:#000000;stroke-width:5.86358643;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <rect
+       width="180"
+       height="125.71429"
+       x="117.14286"
+       y="280.93362"
+       id="rect2987"
+       style="fill:#5d4848;fill-opacity:1;stroke:#000000;stroke-width:5.86358643;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/trunk/odfdom/src/test/resources/spreadsheetTestTemplate.ots b/trunk/odfdom/src/test/resources/spreadsheetTestTemplate.ots
new file mode 100644
index 0000000..7033cc0
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/spreadsheetTestTemplate.ots
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/table.odt b/trunk/odfdom/src/test/resources/table.odt
new file mode 100644
index 0000000..5002524
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/table.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/test1.odt b/trunk/odfdom/src/test/resources/test1.odt
new file mode 100644
index 0000000..7edea86
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/test1.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/test2-content.xml b/trunk/odfdom/src/test/resources/test2-content.xml
new file mode 100644
index 0000000..64bd8f0
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/test2-content.xml
@@ -0,0 +1,165 @@
+<!-- 
+       Licensed to the Apache 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" standalone="no"?>
+<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:ooo="http://openoffice.org/2004/office" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.2">
+<office:scripts/>
+<office:font-face-decls>
+<style:font-face style:name="StarSymbol" svg:font-family="StarSymbol"/>
+<style:font-face style:name="Tahoma1" svg:font-family="Tahoma"/>
+<style:font-face style:font-family-generic="modern" style:font-pitch="fixed" style:name="Cumberland" svg:font-family="Cumberland"/>
+<style:font-face style:font-family-generic="roman" style:font-pitch="variable" style:name="Thorndale" svg:font-family="Thorndale"/>
+<style:font-face style:font-family-generic="swiss" style:font-pitch="variable" style:name="Albany" svg:font-family="Albany"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Andale Sans UI" svg:font-family="'Andale Sans UI'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="MS Mincho" svg:font-family="'MS Mincho'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Tahoma" svg:font-family="Tahoma"/>
+</office:font-face-decls>
+<office:automatic-styles>
+<style:style style:family="paragraph" style:list-style-name="L1" style:name="P1" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:list-style-name="L2" style:name="P2" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:list-style-name="L2" style:name="P3" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:list-style-name="L1" style:name="P4" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:name="P5" style:parent-style-name="Text_20_body">
+<style:paragraph-properties fo:margin-left="0.2in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false"/>
+</style:style>
+<style:style style:family="paragraph" style:name="P6" style:parent-style-name="Text_20_body">
+<style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false"/>
+</style:style>
+<style:style style:family="text" style:name="T1">
+<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+</style:style>
+<style:style style:family="text" style:name="T2">
+<style:text-properties fo:color="#ff3366"/>
+</style:style>
+<text:list-style style:name="L1">
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="1" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.25in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="2" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.5in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="3" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.75in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="4" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="5" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.25in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="6" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.5in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="7" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.75in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="8" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="9" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.25in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="10" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.5in"/>
+</text:list-level-style-number>
+</text:list-style>
+<text:list-style style:name="L2">
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="1" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.25in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="○" text:level="2" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.5in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="■" text:level="3" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.75in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="4" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="○" text:level="5" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.25in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="■" text:level="6" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.5in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="7" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.75in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="○" text:level="8" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="■" text:level="9" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.25in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="10" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.5in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+</text:list-style>
+</office:automatic-styles>
+<office:body>
+<office:text>
+<office:forms form:apply-design-mode="false" form:automatic-focus="false"/>
+<text:sequence-decls>
+<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+</text:sequence-decls>
+<text:p text:style-name="Standard">Hello <text:span text:style-name="T1">world</text:span>
+</text:p>
+<text:p text:style-name="Text_20_body">absatz <text:span text:style-name="Example">z</text:span>
+<text:span text:style-name="Example">
+<text:span text:style-name="T1">we</text:span>
+</text:span>
+<text:span text:style-name="Example">i</text:span>
+</text:p>
+<text:p text:style-name="P5">Absatz <text:span text:style-name="T2">drei</text:span>
+</text:p>
+<text:p text:style-name="P6">
+<text:span text:style-name="T2"/>
+</text:p>
+<text:list text:style-name="L1">
+<text:list-item>
+<text:p text:style-name="P1">num 1</text:p>
+</text:list-item>
+<text:list-item>
+<text:p text:style-name="P1">num 2</text:p>
+</text:list-item>
+</text:list>
+<text:p text:style-name="Text_20_body"/>
+<text:list text:style-name="L2">
+<text:list-item>
+<text:p text:style-name="P2">bullet1</text:p>
+</text:list-item>
+<text:list-item>
+<text:p text:style-name="P2">bullet2</text:p>
+</text:list-item>
+</text:list>
+</office:text>
+</office:body>
+</office:document-content>
diff --git a/trunk/odfdom/src/test/resources/test2-styles.xml b/trunk/odfdom/src/test/resources/test2-styles.xml
new file mode 100644
index 0000000..751445e
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/test2-styles.xml
@@ -0,0 +1,123 @@
+<!-- 
+       Licensed to the Apache 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" standalone="no"?>
+<office:document-styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:ooo="http://openoffice.org/2004/office" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2">
+<office:font-face-decls>
+<style:font-face style:name="StarSymbol" svg:font-family="StarSymbol"/>
+<style:font-face style:name="Tahoma1" svg:font-family="Tahoma"/>
+<style:font-face style:font-family-generic="modern" style:font-pitch="fixed" style:name="Cumberland" svg:font-family="Cumberland"/>
+<style:font-face style:font-family-generic="roman" style:font-pitch="variable" style:name="Thorndale" svg:font-family="Thorndale"/>
+<style:font-face style:font-family-generic="swiss" style:font-pitch="variable" style:name="Albany" svg:font-family="Albany"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Andale Sans UI" svg:font-family="'Andale Sans UI'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="MS Mincho" svg:font-family="'MS Mincho'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Tahoma" svg:font-family="Tahoma"/>
+</office:font-face-decls>
+<office:styles>
+<style:default-style style:family="graphic">
+<style:graphic-properties draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" style:flow-with-text="false"/>
+<style:paragraph-properties style:font-independent-line-spacing="false" style:line-break="strict" style:text-autospace="ideograph-alpha" style:writing-mode="lr-tb">
+<style:tab-stops/>
+</style:paragraph-properties>
+<style:text-properties fo:country="US" fo:font-size="12pt" fo:language="en" style:country-asian="none" style:country-complex="none" style:font-size-asian="12pt" style:font-size-complex="12pt" style:language-asian="zxx" style:language-complex="zxx" style:letter-kerning="true" style:use-window-font-color="true"/>
+</style:default-style>
+<style:default-style style:family="paragraph">
+<style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:line-break="strict" style:punctuation-wrap="hanging" style:tab-stop-distance="0.4925in" style:text-autospace="ideograph-alpha" style:writing-mode="page"/>
+<style:text-properties fo:country="US" fo:font-size="12pt" fo:hyphenate="false" fo:hyphenation-push-char-count="2" fo:hyphenation-remain-char-count="2" fo:language="en" style:country-asian="none" style:country-complex="none" style:font-name="Thorndale" style:font-name-asian="Andale Sans UI" style:font-name-complex="Tahoma" style:font-size-asian="12pt" style:font-size-complex="12pt" style:language-asian="zxx" style:language-complex="zxx" style:letter-kerning="true" style:use-window-font-color="true"/>
+</style:default-style>
+<style:default-style style:family="table">
+<style:table-properties table:border-model="collapsing"/>
+</style:default-style>
+<style:default-style style:family="table-row">
+<style:table-row-properties fo:keep-together="auto"/>
+</style:default-style>
+<style:style style:class="text" style:family="paragraph" style:name="Standard"/>
+<style:style style:class="text" style:display-name="Text body" style:family="paragraph" style:name="Text_20_body" style:parent-style-name="Standard">
+<style:paragraph-properties fo:margin-bottom="0.0835in" fo:margin-top="0in"/>
+</style:style>
+<style:style style:class="text" style:family="paragraph" style:name="Heading" style:next-style-name="Text_20_body" style:parent-style-name="Standard">
+<style:paragraph-properties fo:keep-with-next="always" fo:margin-bottom="0.0835in" fo:margin-top="0.1665in"/>
+<style:text-properties fo:font-size="14pt" style:font-name="Albany" style:font-name-asian="MS Mincho" style:font-name-complex="Tahoma" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+</style:style>
+<style:style style:class="list" style:family="paragraph" style:name="List" style:parent-style-name="Text_20_body">
+<style:text-properties style:font-name-complex="Tahoma1"/>
+</style:style>
+<style:style style:class="extra" style:family="paragraph" style:name="Caption" style:parent-style-name="Standard">
+<style:paragraph-properties fo:margin-bottom="0.0835in" fo:margin-top="0.0835in" text:line-number="0" text:number-lines="false"/>
+<style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-name-complex="Tahoma1" style:font-size-asian="12pt" style:font-size-complex="12pt" style:font-style-asian="italic" style:font-style-complex="italic"/>
+</style:style>
+<style:style style:class="index" style:family="paragraph" style:name="Index" style:parent-style-name="Standard">
+<style:paragraph-properties text:line-number="0" text:number-lines="false"/>
+<style:text-properties style:font-name-complex="Tahoma1"/>
+</style:style>
+<style:style style:display-name="Numbering Symbols" style:family="text" style:name="Numbering_20_Symbols"/>
+<style:style style:display-name="Bullet Symbols" style:family="text" style:name="Bullet_20_Symbols">
+<style:text-properties fo:font-size="9pt" style:font-name="StarSymbol" style:font-name-asian="StarSymbol" style:font-name-complex="StarSymbol" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
+</style:style>
+<style:style style:family="text" style:name="Example">
+<style:text-properties style:font-name="Cumberland" style:font-name-asian="Cumberland" style:font-name-complex="Cumberland"/>
+</style:style>
+<text:outline-style>
+<text:outline-level-style style:num-format="" text:level="1">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="2">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="3">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="4">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="5">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="6">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="7">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="8">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="9">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="10">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+</text:outline-style>
+<text:notes-configuration style:num-format="1" text:footnotes-position="page" text:note-class="footnote" text:start-numbering-at="document" text:start-value="0"/>
+<text:notes-configuration style:num-format="i" text:note-class="endnote" text:start-value="0"/>
+<text:linenumbering-configuration style:num-format="1" text:increment="5" text:number-lines="false" text:number-position="left" text:offset="0.1965in"/>
+</office:styles>
+<office:automatic-styles>
+<style:page-layout style:name="pm1">
+<style:page-layout-properties fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" fo:margin-top="0.7874in" fo:page-height="11in" fo:page-width="8.5in" style:footnote-max-height="0in" style:num-format="1" style:print-orientation="portrait" style:writing-mode="lr-tb">
+<style:footnote-sep style:adjustment="left" style:color="#000000" style:distance-after-sep="0.0398in" style:distance-before-sep="0.0398in" style:rel-width="25%" style:width="0.0071in"/>
+</style:page-layout-properties>
+<style:header-style/>
+<style:footer-style/>
+</style:page-layout>
+</office:automatic-styles>
+<office:master-styles>
+<style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+</office:master-styles>
+</office:document-styles>
diff --git a/trunk/odfdom/src/test/resources/test2.odt b/trunk/odfdom/src/test/resources/test2.odt
new file mode 100644
index 0000000..8a11c06
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/test2.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/test3.odt b/trunk/odfdom/src/test/resources/test3.odt
new file mode 100644
index 0000000..c88c871
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/test3.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testA.jpg b/trunk/odfdom/src/test/resources/testA.jpg
new file mode 100644
index 0000000..494c46d
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testA.jpg
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testB.jpg b/trunk/odfdom/src/test/resources/testB.jpg
new file mode 100644
index 0000000..f5e59c2
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testB.jpg
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testEmbeddedDoc.odt b/trunk/odfdom/src/test/resources/testEmbeddedDoc.odt
new file mode 100644
index 0000000..eba806e
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testEmbeddedDoc.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testGetCellAt.ods b/trunk/odfdom/src/test/resources/testGetCellAt.ods
new file mode 100644
index 0000000..7858cef
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testGetCellAt.ods
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testInvalidPkg1.odt b/trunk/odfdom/src/test/resources/testInvalidPkg1.odt
new file mode 100644
index 0000000..84ccd5c
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testInvalidPkg1.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testInvalidPkg2.odt b/trunk/odfdom/src/test/resources/testInvalidPkg2.odt
new file mode 100644
index 0000000..da95acc
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testInvalidPkg2.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testInvalidPkg3.odt b/trunk/odfdom/src/test/resources/testInvalidPkg3.odt
new file mode 100644
index 0000000..f43e49b
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testInvalidPkg3.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/testSaveEmbeddedDoc.odt b/trunk/odfdom/src/test/resources/testSaveEmbeddedDoc.odt
new file mode 100644
index 0000000..41dfaf1
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/testSaveEmbeddedDoc.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/test_rdfmeta.odt b/trunk/odfdom/src/test/resources/test_rdfmeta.odt
new file mode 100644
index 0000000..d3b3fcc
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/test_rdfmeta.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/text-extract.odt b/trunk/odfdom/src/test/resources/text-extract.odt
new file mode 100644
index 0000000..d2e93e6
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/text-extract.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/textTestTemplate.ott b/trunk/odfdom/src/test/resources/textTestTemplate.ott
new file mode 100644
index 0000000..a3d08f9
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/textTestTemplate.ott
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/unknown_properties.odt b/trunk/odfdom/src/test/resources/unknown_properties.odt
new file mode 100644
index 0000000..d87a3de
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/unknown_properties.odt
Binary files differ
diff --git a/trunk/odfdom/src/test/resources/xslt/concatfiles.xsl b/trunk/odfdom/src/test/resources/xslt/concatfiles.xsl
new file mode 100644
index 0000000..81b5266
--- /dev/null
+++ b/trunk/odfdom/src/test/resources/xslt/concatfiles.xsl
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding="UTF-8"?>
+ <!-- 
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output method="xml" encoding="UTF-8"/>
+	
+    <!-- 
+        To access contents of a office file content (e.g. meta.xml, styles.xml) 
+        this URL has to be added before the inner path.
+        
+        For instance sourceBaseURL might be:
+            file:/E:/cws/multiPkgFileTest-ODFDOM/target/test-classes/test2.odt/
+    -->
+	<xsl:param name="sourceBaseURL" select="'./'" />    
+
+    <xsl:template match="/">
+        <xsl:message>The sourceBaseURL is '<xsl:value-of select="$sourceBaseURL"/>'</xsl:message>
+        <concatedFiles>            
+            <xsl:copy-of select="document(concat($sourceBaseURL, 'styles.xml'))" />
+            <xsl:copy-of select="document(concat($sourceBaseURL, 'meta.xml'))" />        
+        </concatedFiles>
+    </xsl:template>
+</xsl:stylesheet>
+
diff --git a/trunk/pom.xml b/trunk/pom.xml
new file mode 100644
index 0000000..340a143
--- /dev/null
+++ b/trunk/pom.xml
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>odftoolkit</artifactId>
+    <version>0.6.1-incubating</version>
+    <packaging>pom</packaging>
+
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>13</version>
+    </parent>
+   
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity</artifactId>
+                <version>1.6.4</version>
+            </dependency>
+            <dependency>
+                <groupId>xml-apis</groupId>
+                <artifactId>xml-apis</artifactId>
+                <version>1.3.04</version>
+            </dependency>
+            <dependency>
+                <groupId>xerces</groupId>
+                <artifactId>xercesImpl</artifactId>
+                <version>2.9.1</version>
+            </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>4.8.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.jena</groupId>
+                <artifactId>jena-arq</artifactId>
+                <version>2.9.4</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.jena</groupId>
+                <artifactId>jena-core</artifactId>
+                <version>2.7.4</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.jena</groupId>
+                <artifactId>jena-core</artifactId>
+                <classifier>tests</classifier>
+                <version>2.7.4</version>
+            </dependency>
+            <dependency>
+                <groupId>net.rootdev</groupId>
+                <artifactId>java-rdfa</artifactId>
+                <version>0.4.2</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-validator</groupId>
+                <artifactId>commons-validator</artifactId>
+                <version>1.4.0</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-fileupload</groupId>
+                <artifactId>commons-fileupload</artifactId>
+                <version>1.2.2</version>
+            </dependency>
+            <dependency>
+                <groupId>net.java.dev.msv</groupId>
+                <artifactId>msv-core</artifactId>
+                <version>2011.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.iso_relax.verifier.jaxp.validation</groupId>
+                <artifactId>isorelax-jaxp-bridge</artifactId>
+                <version>1.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.ant</groupId>
+                <artifactId>ant</artifactId>
+                <version>1.8.2</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+ 
+    <modules>
+        <module>taglets</module>
+        <module>generator</module>
+        <module>xslt-runner</module>
+        <module>xslt-runner-task</module>
+        <module>odfdom</module>
+        <module>validator</module>
+        <module>simple</module>
+    </modules>
+
+    <name>Apache ODF Toolkit</name>
+    <description>
+        The Apache ODF Toolkit is a set of Java modules that allow 
+        programmatic creation, scanning and manipulation of Open Document Format 
+        (ISO/IEC 26300 == ODF) documents. Unlike other approaches which rely on 
+        runtime manipulation of heavy-weight editors via an automation 
+        interface, the ODF Toolkit is lightweight and ideal for server use. 
+    </description>
+    <url>http://incubator.apache.org/odftoolkit/</url>
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1</developerConnection>
+        <url>http://svn.apache.org/viewvc/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1</url>
+    </scm>
+
+    <issueManagement>
+        <system>jira</system>
+        <url>https://issues.apache.org/jira/browse/ODFTOOLKIT</url>
+    </issueManagement>
+
+    <ciManagement>
+        <system>jenkins</system>
+        <url>https://builds.apache.org</url>
+    </ciManagement>
+
+    <distributionManagement>
+        <!-- not used for deployment but only for site:stage goal -->
+        <site>
+            <id>incubator.apache.org/odftoolkit/</id>
+            <url>http://incubator.apache.org/odftoolkit/reports/${project.version}/</url>
+        </site>
+    </distributionManagement>
+
+    <developers>
+        <developer>
+            <id>svanteschubert</id>
+            <name>Svante</name>
+            <email>svanteschubert AT apache.org</email>
+            <organization>Individual</organization>
+            <roles>
+                <role>ODFDOM working group chair</role>
+                <role>architect</role>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>devinhan</id>
+            <name>Han Biao</name>
+            <email>devinhan AT apache.org</email>
+            <organization>IBM</organization>
+            <organizationUrl>http://www.ibm.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+8</timezone>
+        </developer>
+        <developer>
+            <id>daisyguo</id>
+            <name>Ying Chun Guo</name>
+            <email>daisyguo AT apache.org</email>
+            <organization>IBM</organization>
+            <organizationUrl>http://www.ibm.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+8</timezone>
+        </developer>
+        <developer>
+            <id>weihuaWang</id>
+            <name>Wei Hua Wang</name>
+            <organization>IBM</organization>
+            <organizationUrl>http://www.ibm.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+8</timezone>
+        </developer>
+        <developer>
+            <id>FrankMeies</id>
+            <name>Frank</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>lars_behrmann</id>
+            <name>Lars</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>steffeng</id>
+            <name>Steffen</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>hans-peter</id>
+            <name>Hans-Peter</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>bei</id>
+            <name>Bernd</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>mst</id>
+            <name>Michael</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>clippka</id>
+            <name>Christian</name>
+            <organization>Oracle Inc.</organization>
+            <organizationUrl>http://www.oracle.com/</organizationUrl>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+        <developer>
+            <id>fhopf</id>
+            <name>Florian Hopf</name>
+            <email>fhopf AT apache.org</email>
+            <url>http://blog.florian-hopf.de</url>
+            <roles>
+                <role>developer</role>
+            </roles>
+            <timezone>+1</timezone>
+        </developer>
+    </developers>
+
+    <mailingLists>
+        <mailingList>
+            <name>User List</name>
+            <post>odf-users@incubator.apache.org</post>
+            <subscribe>odf-users-subscribe@incubator.apache.org</subscribe>
+            <unsubscribe>odf-users-unsubscribe@incubator.apache.org</unsubscribe>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-odf-users/</archive>
+        </mailingList>
+        <mailingList>
+            <name>Developer List</name>
+            <post>odf-dev@incubator.apache.org</post>
+            <subscribe>odf-dev-subscribe@incubator.apache.org</subscribe>
+            <unsubscribe>odf-dev-unsubscribe@incubator.apache.org</unsubscribe>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-odf-dev/</archive>
+        </mailingList>
+        <mailingList>
+            <name>Commits</name>
+            <subscribe>odf-commits-subscribe@incubator.apache.org</subscribe>
+            <unsubscribe>odf-commmits-unsubscribe@incubator.apache.org</unsubscribe>
+            <archive>http://mail-archives.apache.org/mod_mbox/incubator-odf-commits/</archive>
+        </mailingList>
+    </mailingLists>
+    
+
+    <profiles>
+        <profile>
+            <id>pedantic</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.rat</groupId>
+                        <artifactId>apache-rat-plugin</artifactId>
+                        <configuration>
+                            <excludes>
+                                <exclude>CHANGES.txt</exclude>
+								<exclude>.gitignore</exclude>
+                                <exclude>DEPENDENCIES</exclude>
+                            </excludes>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>check</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>release-distribution</id>
+            <properties>
+                <username>${user.name}</username>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <inherited>false</inherited>
+                        <executions>
+                            <execution>
+                                <id>src</id>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <phase>package</phase>
+                                <configuration>
+                                    <descriptors>
+                                        <descriptor>assemble/src.xml</descriptor>
+                                    </descriptors>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>doc</id>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <phase>package</phase>
+                                <configuration>
+                                    <descriptors>
+                                        <descriptor>assemble/doc.xml</descriptor>
+                                    </descriptors>
+                                </configuration>
+                            </execution>            
+                            <execution>
+                                <id>bin</id>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <phase>package</phase>
+                                <configuration>
+                                    <descriptors>
+                                        <descriptor>assemble/bin.xml</descriptor>
+                                    </descriptors>
+                                </configuration>
+                            </execution>                            
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <inherited>false</inherited>
+                        <executions>
+                            <execution>
+                                <id>package</id>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                                <phase>prepare-package</phase>
+                                <configuration>
+                                    <tasks>
+                                        <mkdir dir="${basedir}/target/${project.version}-bin" />
+                                        <copy todir="${basedir}/target/${project.version}-bin" flatten="true">
+                                              <fileset dir="${basedir}">
+                                                <include name="*.txt" />
+                                                <include name="KEYS" />      
+                                                <include name="odfdom/target/*.jar" />
+                                                <include name="simple/target/*.jar" />
+                                                <include name="validator/target/*.?ar" />
+                                                <include name="xslt-runner/target/*.jar" />
+                                                <include name="xslt-runner-task/target/*.jar" />
+                                                <exclude name="**/target/**-javadoc.jar" />
+                                                <exclude name="**/target/**-sources.jar" />
+                                                <exclude name="**/target/**-jar-with-dependencies.jar" />
+                                              </fileset>
+                                        </copy>
+                                        <mkdir dir="${basedir}/target/${project.version}-docs" />
+                                        <copy todir="${basedir}/target/${project.version}-docs" flatten="true">  
+                                            <fileset dir="${basedir}">   
+                                                <include name="*.txt" />
+                                                <include name="KEYS" />                                   
+                                                <include name="**/target/*-javadoc.jar" />
+                                            </fileset>
+                                        </copy>
+                                        </tasks>                                 
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>checksum</id>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                                <phase>install</phase>
+                                <configuration>
+                                    <tasks>                                       
+                                        <checksum algorithm="MD5" fileext=".md5">
+                                              <fileset dir="${basedir}/target">
+                                                <include name="*.zip" />
+                                                <include name="*.tar.gz" />
+                                                <include name="*.tar.bz2" />
+                                              </fileset>
+                                        </checksum>
+                                        <checksum algorithm="SHA1" fileext=".sha">
+                                              <fileset dir="${basedir}/target">
+                                                <include name="*.zip" />
+                                                <include name="*.tar.gz" />
+                                                <include name="*.tar.bz2" />
+                                              </fileset>
+                                        </checksum>
+                                        <checksum file="target/odftoolkit-${project.version}-src.zip" algorithm="SHA1" property="checksum" />                                
+                                        <copy todir="${basedir}/target/release/${project.version}/">  
+                                            <fileset dir="${basedir}/target">   
+                                                <include name="*-source-release.*" />
+                                            </fileset>
+                                        </copy>
+                                        <copy todir="${basedir}/target/release/${project.version}/binaries">  
+                                            <fileset dir="${basedir}/target">   
+                                                <include name="*-bin.*" />
+                                            </fileset>
+                                        </copy>
+                                        <copy todir="${basedir}/target/release/${project.version}/docs">  
+                                            <fileset dir="${basedir}/target">   
+                                                <include name="*-doc.*" />
+                                            </fileset>
+                                        </copy>
+                                        <echo file="${basedir}/target/vote.txt">
+                                            From: ${username}@apache.org
+                                            To: odf-dev@incubator.apache.org
+                                            Subject: [VOTE] Release Apache ODF Toolkit ${project.version}
+
+                                            A candidate for the ODF Toolkit ${project.version} release is available    at:
+
+                                            http://people.apache.org/~${username}/odftoolkit-release/odftoolkit-${project.version}/
+                                            
+                                            The release candidate is a zip archive of the sources in:
+
+                                            https://svn.apache.org/repos/asf/incubator/odf/tags/${project.version}/
+
+                                            The SHA1 checksum of the archive is ${checksum}.
+
+                                            Please vote on releasing this package as Apache ODF Toolkit ${project.version}.
+                                            The vote is open for the next 72 hours and passes if a majority
+                                            of at least three +1 ODF Toolkit PMC votes are cast.
+
+                                            [ ] +1 Release this package as Apache ODF Toolkit ${project.version}
+                                            [ ] -1 Do not release this package because...${line.separator}
+                                        </echo>
+                                        <echo />
+                                        <echo>
+                                            The release candidate has been prepared in:    ${basedir}/target/${project.version}
+
+                                            Please deploy it to people.apache.org like this:
+
+                                            scp -r ${basedir}/target/${project.version} people.apache.org:public_html/odftoolkit/
+
+											A release vote template has been generated for you:    file://${basedir}/target/vote.txt
+										</echo>
+										<echo />
+									</tasks>                                 
+								</configuration>
+							</execution>
+						</executions>
+						<dependencies>
+							<dependency>
+								<groupId>org.apache.ant</groupId>
+								<artifactId>ant-nodeps</artifactId>
+								<version>1.8.1</version>
+							</dependency>
+						</dependencies>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+</project>
+
diff --git a/trunk/simple/LICENSE.txt b/trunk/simple/LICENSE.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/trunk/simple/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/trunk/simple/README.txt b/trunk/simple/README.txt
new file mode 100644
index 0000000..0e919af
--- /dev/null
+++ b/trunk/simple/README.txt
@@ -0,0 +1,57 @@
+*************************************************************
+* Simple Java API for ODF                                   *
+*                                                           *
+*************************************************************
+*                                                           *
+* Version: @VERSION@                                              *
+* Release Date: @DATE@                         *
+*                                                           *
+*************************************************************
+
+
+About Simple
+-------------
+
+The Simple Java API for ODF is an easy-to-use, high-level Java API 
+for creating, modifying and extracting data from ODF 1.2 documents.
+It is written in pure Java and does not require that you install any
+document editor on your system. The Simple Java API for ODF is a high
+level abstraction of the lower-level ODFDOM API
+
+
+Documentation
+--------------
+
+The latest release notes are available online at the project's 
+Wiki page:
+    http://odftoolkit.org/projects/simple/pages/Home
+
+In general, the Wiki page is a great place to start when looking 
+for online information about the simple project:
+    http://odftoolkit.org/projects/simple/pages/Home
+
+The website is another place that you can get online documentations, 
+such as cookbook, javadoc and demo codes:
+    http://simple.odftoolkit.org/
+
+API documentation (Javadoc) can be downloaded from the project's 
+download area:
+    http://odftoolkit.org/projects/simple/downloads
+
+The Javadoc can also be viewed online:
+    http://simple.odftoolkit.org/javadoc/index.html
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
+
+Installation
+-------------
+
+Just put the file simple.jar in your classpath. You will
+need ODFDOM0.9-SNAPSHOT and Apache Xerces-J 2.9.1 as well. Get them from
+    http://odftoolkit.org/projects/simple/downloads/directory/tools
+    http://xerces.apache.org/mirrors.cgi
diff --git a/trunk/simple/pom.xml b/trunk/simple/pom.xml
new file mode 100644
index 0000000..14e9ad0
--- /dev/null
+++ b/trunk/simple/pom.xml
@@ -0,0 +1,443 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+      <groupId>org.apache.odftoolkit</groupId>
+      <artifactId>odftoolkit</artifactId>
+      <version>0.6.1-incubating</version>
+    </parent>
+
+    <artifactId>simple-odf</artifactId>
+    <version>0.8.1-incubating</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+           <groupId>${project.groupId}</groupId>
+           <artifactId>odfdom-java</artifactId>
+           <version>0.8.10-incubating</version>
+        </dependency>
+        <dependency>
+            <groupId>xerces</groupId>
+            <artifactId>xercesImpl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xml-apis</groupId>
+            <artifactId>xml-apis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss</maven.build.timestamp.format>
+    </properties>
+    <!-- Build Settings -->
+    <build>
+        <defaultGoal>install</defaultGoal>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.2</version>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                    <meminitial>512m</meminitial>
+                    <maxmem>1024m</maxmem>
+                    <showDeprecation>true</showDeprecation>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.3.1</version>
+                <configuration>
+                    <archive>
+                        <index>true</index>
+                        <manifest>
+                            <mainClass>org.odftoolkit.simple.JarManifest</mainClass>
+                        </manifest>
+                        <manifestEntries>
+                            <version>${project.version}</version>
+                        </manifestEntries>
+                        <manifestSections>
+                            <manifestSection>
+                                <name>SIMPLE-ODF</name>
+                                <manifestEntries>
+                                    <SIMPLE-ODF-Name>Simple Java API for ODF(Simple ODF)</SIMPLE-ODF-Name>
+                                    <SIMPLE-ODF-Version>${project.version}</SIMPLE-ODF-Version>
+                                    <SIMPLE-ODF-Website>http://incubator.apache.org/odftoolkit/simple/index.html</SIMPLE-ODF-Website>
+                                    <SIMPLE-ODF-Built-By>${user.name}</SIMPLE-ODF-Built-By>
+                                    <SIMPLE-ODF-Built-Date>${build.timestamp}</SIMPLE-ODF-Built-Date>
+                                    <SIMPLE-ODF-Supported-ODF-Version>1.2</SIMPLE-ODF-Supported-ODF-Version>
+                                </manifestEntries>
+                            </manifestSection>
+                        </manifestSections>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-release-plugin</artifactId>
+                <version>2.1</version>
+                <configuration>
+                    <!-- Workaround for http://jira.codehaus.org/browse/MGPG-9 -->
+                    <mavenExecutorId>forked-path</mavenExecutorId>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <doctitle>Simple Java API for ODF(Simple ODF)</doctitle>
+                    <minmemory>512m</minmemory>
+                    <maxmemory>1024m</maxmemory>
+                    <links>
+                        <link>http://download.oracle.com/javase/6/docs/api/</link>
+                        <link>http://xerces.apache.org/xerces-j/apiDocs/</link>
+                        <link>http://odfdom.odftoolkit.org/0.8.7/odfdom/apidocs/</link>
+                    </links>
+                    <splitindex>true</splitindex>
+                    <windowtitle>Simple ODF v${project.version} - http://odftoolkit</windowtitle>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <systemPropertyVariables>
+                        <simple.version>${project.version}</simple.version>
+                        <simple.timestamp>${build.timestamp}</simple.timestamp>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.1.2</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>single</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>compile</phase>
+                        <configuration>
+                            <tasks>
+                                <copy file="./README.txt" tofile="./target/README.txt" overwrite="yes">
+                                    <filterset>
+                                        <filter token="VERSION" value="${project.version}" />
+                                        <filter token="DATE" value="${build.timestamp}" />
+                                    </filterset>
+                                </copy>
+                            </tasks>
+                        </configuration>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>src/test/resources/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+        <extensions>
+            <extension>
+                <groupId>org.jvnet.wagon-svn</groupId>
+                <artifactId>wagon-svn</artifactId>
+                <version>1.9</version>
+            </extension>
+            <extension>
+                <groupId>org.apache.maven.wagon</groupId>
+                <artifactId>wagon-webdav-jackrabbit</artifactId>
+                <version>1.0-beta-7</version>
+            </extension>
+        </extensions>
+    </build>
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <doctitle>Simple Java API for ODF(Simple ODF)</doctitle>
+                    <minmemory>512m</minmemory>
+                    <maxmemory>1024m</maxmemory>
+                    <links>
+                        <link>http://download.oracle.com/javase/6/docs/api/</link>
+                        <link>http://xerces.apache.org/xerces-j/apiDocs/</link>
+                    </links>
+                    <splitindex>true</splitindex>
+                    <windowtitle>Simple ODF API v${project.version} - http://incubator.apache.org/odftoolkit/</windowtitle>
+                </configuration>
+            </plugin>
+            <!-- Code Coverage Testing generated by Cobertura -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>cobertura-maven-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <instrumentation>
+                        <excludes>
+                            <exclude>org/odftoolkit/**/*Test.class</exclude>
+                        </excludes>
+                    </instrumentation>
+                </configuration>
+            </plugin>
+            <!-- Reporting integration test results -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <version>2.5</version>
+                <reportSets>
+                    <reportSet>
+                        <id>integration-tests</id>
+                        <reports>
+                            <report>report-only</report>
+                        </reports>
+                        <configuration>
+                            <outputName>failsafe-report</outputName>
+                        </configuration>
+                    </reportSet>
+                </reportSets>
+            </plugin>
+        </plugins>
+    </reporting>
+    <!-- More Project Information -->
+    <name>Simple Java API for ODF (Simple ODF)</name>
+    <description>A simple API for easy manipulation of ODF documents.</description>
+    <url>http://incubator.apache.org/odftoolkit/simple/index.html</url>
+    <inceptionYear>2010</inceptionYear>
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/simple</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/simple</developerConnection>
+        <url>http://svn.apache.org/viewvc/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/simple</url>
+    </scm>
+    <profiles>
+        <profile>
+            <id>release</id>
+            <activation>
+                <property>
+                    <name>release</name>
+                    <value />
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <!--
+                        We want to deploy the artifact to a staging location for perusal
+                    -->
+                    <plugin>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <configuration>
+                            <descriptorRefs>
+                                <descriptorRef>jar-with-dependencies</descriptorRef>
+                            </descriptorRefs>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>single</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <inherited>true</inherited>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-deploy-plugin</artifactId>
+                        <configuration>
+                            <altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
+                            <updateReleaseInfo>true</updateReleaseInfo>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <encoding>${project.build.sourceEncoding}</encoding>
+                            <attach>true</attach>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>attach-javadocs</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>integration-test</id>
+            <activation>
+                <property>
+                    <name>integration-test</name>
+                </property>
+            </activation>
+            <build>
+                <defaultGoal>verify</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <version>2.5</version>
+                        <executions>
+                            <execution>
+                                <id>failsafe-it</id>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                                <configuration>
+                                    <classesDirectory>${basedir}/target/simple-odf.jar</classesDirectory>
+                                    <systemPropertyVariables>
+                                        <testresourcefolder>performance</testresourcefolder>
+                                        <executetimes>1</executetimes>
+                                        <testflag>test</testflag>
+                                    </systemPropertyVariables>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <!-- Explizit version required for fix on systemPropertyVariables -->
+                        <version>2.5</version>
+                        <configuration>
+                            <skip>true</skip>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <configuration>
+                            <source>1.5</source>
+                            <target>1.5</target>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <!--
+            Profile for deploying to the Sonatype repository, which requires GPG
+            signatures see:
+            https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
+            https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven
+            https://issues.sonatype.org/browse/OSSRH-1321
+        -->
+        <profile>
+            <id>release-javadoc</id>
+            <activation>
+                <property>
+                    <name>deploy</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <defaultGoal>site</defaultGoal>
+            </build>
+            <properties>
+                <project.reporting.outputDirectory>target/site/apidocs</project.reporting.outputDirectory>
+            </properties>
+            <!-- <distributionManagement>
+                <site>
+                    <id>simple-odf-website</id>
+                    <name>Simple Java API for ODF(Simple ODF)</name>
+                    <url>dav:https://odftoolkit.org/website/simple/${project.version}/simple</url>
+                </site>
+            </distributionManagement> -->
+        </profile>
+    </profiles>
+</project>
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/ChartDocument.java b/trunk/simple/src/main/java/org/odftoolkit/simple/ChartDocument.java
new file mode 100644
index 0000000..9056055
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/ChartDocument.java
@@ -0,0 +1,215 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeChartElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+
+/**
+ * This class represents an empty ODF document , which will be in general
+ * embedded in an existing ODF (Spreadsheet) document.
+ */
+public class ChartDocument extends Document {
+
+	private static final String EMPTY_CHART_DOCUMENT_PATH = "/OdfChartDocument.odc";
+	static final Resource EMPTY_CHART_DOCUMENT_RESOURCE = new Resource(EMPTY_CHART_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of ChartDocument documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		CHART(Document.OdfMediaType.CHART), CHART_TEMPLATE(Document.OdfMediaType.CHART_TEMPLATE);
+		private final Document.OdfMediaType mMediaType;
+
+		OdfMediaType(Document.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 * 
+		 * @param mediaType
+		 *            string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and
+		 *         the suffix
+		 */
+		public static Document.OdfMediaType getOdfMediaType(String mediaType) {
+			return Document.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty charts document. * <br/>
+	 * <em>Note: ODF Chart documents are (with OOo 3.0) only used as embedded document and not used stand-alone.</em>
+	 * 
+	 * @return ODF charts document based on a default template
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static ChartDocument newChartDocument() throws Exception {
+		return (ChartDocument) Document.loadTemplate(EMPTY_CHART_DOCUMENT_RESOURCE, Document.OdfMediaType.CHART);
+	}
+
+	/**
+	 * Creates an empty charts template. * <br/>
+	 * <em>Note: ODF Chart documents are (with OOo 3.0) only used as embedded document and not used stand-alone.</em>
+	 * 
+	 * @return ODF charts template based on a default template
+	 * @throws java.lang.Exception
+	 *             - if the template could not be created
+	 */
+	public static ChartDocument newChartTemplateDocument() throws Exception {
+		ChartDocument doc = (ChartDocument) Document.loadTemplate(EMPTY_CHART_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.CHART_TEMPLATE);
+		doc.changeMode(OdfMediaType.CHART_TEMPLATE);
+		return doc;
+	}
+
+	/**
+	 * Creates an ChartDocument from the OpenDocument provided by a resource
+	 * Stream.
+	 * 
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by ChartDocument, the InputStream is cached. This
+	 * usually takes more time compared to the other createInternalDocument
+	 * methods. An advantage of caching is that there are no problems
+	 * overwriting an input file.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF chart document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param inputStream
+	 *            - the InputStream of the ODF chart document.
+	 * @return the chart document created from the given InputStream
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static ChartDocument loadDocument(InputStream inputStream) throws Exception {
+		return (ChartDocument) Document.loadDocument(inputStream);
+	}
+
+	/**
+	 * Loads an ChartDocument from the provided path.
+	 * 
+	 * <p>
+	 * ChartDocument relies on the file being available for read access over the
+	 * whole lifecycle of ChartDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF chart document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @return the chart document from the given path or NULL if the media type
+	 *         is not supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static ChartDocument loadDocument(String documentPath) throws Exception {
+		return (ChartDocument) Document.loadDocument(documentPath);
+	}
+
+	/**
+	 * Creates an ChartDocument from the OpenDocument provided by a File.
+	 * 
+	 * <p>
+	 * ChartDocument relies on the file being available for read access over the
+	 * whole lifecycle of ChartDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF chart document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF chart document.
+	 * @return the chart document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static ChartDocument loadDocument(File file) throws Exception {
+		return (ChartDocument) Document.loadDocument(file);
+	}
+
+	/**
+	 * To avoid data duplication a new document is only created, if not already
+	 * opened. A document is cached by this constructor using the internalpath
+	 * as key.
+	 */
+	protected ChartDocument(OdfPackage pkg, String internalPath, ChartDocument.OdfMediaType odfMediaType) {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Get the content root of a chart document.
+	 * 
+	 * @return content root, representing the office:chart tag
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeChartElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeChartElement.class);
+	}
+
+	/**
+	 * Changes the document to the given mediatype. This method can only be used
+	 * to convert a document to a related mediatype, e.g. template.
+	 * 
+	 * @param mediaType
+	 *            the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+
+	public OdfElement getTableContainerElement() {
+		throw new UnsupportedOperationException("Chart document is not supported to hold table now.");
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/Component.java b/trunk/simple/src/main/java/org/odftoolkit/simple/Component.java
new file mode 100644
index 0000000..79014fe
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/Component.java
@@ -0,0 +1,100 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+
+package org.odftoolkit.simple;
+
+import java.util.IdentityHashMap;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+
+/**
+ * This class is the parent of classes that present all kinds of document
+ * structures.
+ * 
+ * @since 0.5
+ */
+public abstract class Component {
+
+	/**
+	 * Return the instance of OdfElement which presents this structure.
+	 * 
+	 * @return the instance of OdfElement
+	 */
+	public abstract OdfElement getOdfElement();
+
+	/**
+	 * Register component to the map repository
+	 * 
+	 * @param component
+	 *            the component to be registered.
+	 * @param element
+	 *            the instance of OdfElement which presents this component.
+	 * @see Document#getComponentMap()
+	 */
+	protected static void registerComponent(Component component, OdfElement element) {
+		Document ownerDoc = component.getOwnerDocument();
+		synchronized (ownerDoc) {
+			IdentityHashMap<OdfElement, Component> repository = ownerDoc.getComponentMap();
+			repository.put(element, component);
+		}
+	}
+	
+	/**
+	 * Unregister component from the map repository
+	 * 
+	 * @param element
+	 *            the instance of OdfElement which presents this component.
+	 * 
+	 * @see Document#getComponentMap()
+	 * @since 0.6.5
+	 */
+	protected static void unregisterComponent(OdfElement element) {
+		Document ownerDoc = (Document) ((OdfFileDom) element.getOwnerDocument()).getDocument();
+		synchronized (ownerDoc) {
+			IdentityHashMap<OdfElement, Component> repository = ownerDoc.getComponentMap();
+			repository.remove(element);
+		}
+	}
+
+	/**
+	 * Get the component instance by the element instance. Return null if there
+	 * is no such element registered.
+	 * 
+	 * @param element
+	 *            the instance of OdfElement which presents this component.
+	 * @return the component instance
+	 */
+	protected static Component getComponentByElement(OdfElement element) {
+		Document doc = (Document) ((OdfFileDom) element.getOwnerDocument()).getDocument();
+		IdentityHashMap<OdfElement, Component> repository = doc.getComponentMap();
+		return repository.get(element);
+	}
+
+	/**
+	 * Get the owner document of this component
+	 * 
+	 * @return - the owner document
+	 */
+	public Document getOwnerDocument() {
+		return (Document) ((OdfFileDom) getOdfElement().getOwnerDocument()).getDocument();
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/Document.java b/trunk/simple/src/main/java/org/odftoolkit/simple/Document.java
new file mode 100644
index 0000000..29151d0
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/Document.java
@@ -0,0 +1,2677 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfSchemaConstraint;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeBodyElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFontFaceElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfTextProperties;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.type.Duration;
+import org.odftoolkit.simple.meta.Meta;
+import org.odftoolkit.simple.table.TableTemplate;
+import org.odftoolkit.simple.table.AbstractTableContainer;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.Section;
+import org.w3c.dom.Attr;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.ErrorHandler;
+
+/**
+ * This abstract class is representing one of the possible ODF documents
+ */
+public abstract class Document extends OdfSchemaDocument implements TableContainer {
+	// Static parts of file references
+	private static final String SLASH = "/";
+	private OdfMediaType mMediaType;
+	private Meta mOfficeMeta;
+	private long documentOpeningTime;
+	private TableContainerImpl tableContainerImpl;
+	private static final Pattern CONTROL_CHAR_PATTERN = Pattern.compile("\\p{Cntrl}");
+	private static final String EMPTY_STRING = "";
+
+	private IdentityHashMap<OdfElement, Component> mComponentRepository = new IdentityHashMap<OdfElement, Component>();
+
+	// FIXME: This field is only used in method copyResourcesFrom to improve
+	// copy performance, should not be used in any other way.
+	// methods loadDocument(String documentPath) and loadDocument(File file)
+	// will initialize it.
+	// This field and its methods should be removed after ODFDOM supplies batch
+	// copy.
+	private File mFile = null;
+
+	// if the copy foreign slide for several times,
+	// the same style might be copied for several times with the different name
+	// so use styleRenameMap to keep track the renamed style so we can reuse the
+	// style,
+	// rather than new several styles which only have the different style names.
+	// while if the style elements really have the same style name but with
+	// different content
+	// such as that these style elements are from different document
+	// so the value for each key should be a list
+	private HashMap<String, List<String>> styleRenameMap = new HashMap<String, List<String>>();
+	// the map is used to record if the renamed style name is appended to the
+	// current dom
+	private HashMap<String, Boolean> styleAppendMap = new HashMap<String, Boolean>();
+
+	// the object rename map for image.
+	// can not easily recognize if the embedded document are the same.
+	// private HashMap<String, String> objectRenameMap = new HashMap<String,
+	// String>();
+
+	// Using static factory instead of constructor
+	protected Document(OdfPackage pkg, String internalPath, OdfMediaType mediaType) {
+		super(pkg, internalPath, mediaType.getMediaTypeString());
+		mMediaType = mediaType;
+		// set document opening time.
+		documentOpeningTime = System.currentTimeMillis();
+	}
+
+	/**
+	 * This enum contains all possible media types of Document documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		CHART("application/vnd.oasis.opendocument.chart", "odc"), 
+		CHART_TEMPLATE("application/vnd.oasis.opendocument.chart-template", "otc"), 
+		FORMULA("application/vnd.oasis.opendocument.formula", "odf"), 
+		FORMULA_TEMPLATE("application/vnd.oasis.opendocument.formula-template", "otf"), 
+		DATABASE_FRONT_END("application/vnd.oasis.opendocument.base", "odb"), 
+		GRAPHICS("application/vnd.oasis.opendocument.graphics", "odg"), 
+		GRAPHICS_TEMPLATE("application/vnd.oasis.opendocument.graphics-template", "otg"), 
+		IMAGE("application/vnd.oasis.opendocument.image", "odi"), 
+		IMAGE_TEMPLATE("application/vnd.oasis.opendocument.image-template", "oti"), 
+		PRESENTATION("application/vnd.oasis.opendocument.presentation", "odp"), 
+		PRESENTATION_TEMPLATE("application/vnd.oasis.opendocument.presentation-template", "otp"), 
+		SPREADSHEET("application/vnd.oasis.opendocument.spreadsheet", "ods"), 
+		SPREADSHEET_TEMPLATE("application/vnd.oasis.opendocument.spreadsheet-template", "ots"), 
+		TEXT("application/vnd.oasis.opendocument.text", "odt"), 
+		TEXT_MASTER("application/vnd.oasis.opendocument.text-master", "odm"), 
+		TEXT_TEMPLATE("application/vnd.oasis.opendocument.text-template", "ott"), 
+		TEXT_WEB("application/vnd.oasis.opendocument.text-web", "oth");
+
+		private final String mMediaType;
+		private final String mSuffix;
+
+		OdfMediaType(String mediaType, String suffix) {
+			this.mMediaType = mediaType;
+			this.mSuffix = suffix;
+		}
+
+		/**
+		 * @return the mediatype String of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType;
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mSuffix;
+		}
+
+		/**
+		 * 
+		 * @param mediaType
+		 *            string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and
+		 *         the suffix
+		 */
+		public static OdfMediaType getOdfMediaType(String mediaType) {
+			OdfMediaType odfMediaType = null;
+			if (mediaType != null) {
+				String mediaTypeShort = mediaType.substring(mediaType.lastIndexOf(".") + 1, mediaType.length());
+				mediaTypeShort = mediaTypeShort.replace('-', '_').toUpperCase();
+				try {
+					odfMediaType = OdfMediaType.valueOf(mediaTypeShort);
+				} catch (IllegalArgumentException e) {
+					throw new IllegalArgumentException("Given mediaType '" + mediaType + "' is either not yet supported or not an ODF mediatype!");
+				}
+			}
+			return odfMediaType;
+		}
+	}
+
+	/**
+	 * Loads an Document from the given resource. NOTE: Initial meta data will
+	 * be added in this method.
+	 * 
+	 * @param res
+	 *            a resource containing a package with a root document
+	 * @param odfMediaType
+	 *            the media type of the root document
+	 * @return the Document document or NULL if the media type is not supported
+	 *         by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	protected static Document loadTemplate(Resource res, OdfMediaType odfMediaType) throws Exception {
+		InputStream in = res.createInputStream();
+		OdfPackage pkg = null;
+		try {
+			pkg = OdfPackage.loadPackage(in);
+		} finally {
+			in.close();
+		}
+		Document newDocument = newDocument(pkg, ROOT_DOCUMENT_PATH, odfMediaType);
+		// add initial meta data to new document.
+		initializeMetaData(newDocument);
+		return newDocument;
+	}
+
+	/**
+	 * Loads a Document from the provided path.
+	 * 
+	 * <p>
+	 * Document relies on the file being available for read access over the
+	 * whole life cycle of Document.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @param password
+	 *            - file password.
+	 * @return the Document from the given path or NULL if the media type is not
+	 *         supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 * @since 0.8
+	 */
+	public static Document loadDocument(String documentPath, String password) throws Exception {
+		File file = new File(documentPath);
+		return loadDocument(file, password);
+	}
+
+	/**
+	 * Loads a Document from the provided path.
+	 * 
+	 * <p>
+	 * Document relies on the file being available for read access over the
+	 * whole life cycle of Document.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @return the Document from the given path or NULL if the media type is not
+	 *         supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static Document loadDocument(String documentPath) throws Exception {
+		File file = new File(documentPath);
+		return loadDocument(file);
+	}
+
+	/**
+	 * Creates a Document from the Document provided by a resource Stream.
+	 * 
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by Document, the InputStream is cached. This usually
+	 * takes more time compared to the other createInternalDocument methods. An
+	 * advantage of caching is that there are no problems overwriting an input
+	 * file.
+	 * </p>
+	 * 
+	 * @param inStream
+	 *            - the InputStream of the ODF document.
+	 * @return the document created from the given InputStream
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static Document loadDocument(InputStream inStream) throws Exception {
+		return loadDocument(OdfPackage.loadPackage(inStream));
+	}
+
+	/**
+	 * Creates a Document from the Document provided by a File.
+	 * 
+	 * <p>
+	 * Document relies on the file being available for read access over the
+	 * whole lifecycle of Document.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF document.
+	 * @return the document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static Document loadDocument(File file) throws Exception {
+		Document doc = loadDocument(OdfPackage.loadPackage(file));
+		doc.setFile(file);
+		return doc;
+	}
+
+	/**
+	 * Creates a Document from the Document provided by a File.
+	 * 
+	 * <p>
+	 * Document relies on the file being available for read access over the
+	 * whole lifecycle of Document.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF document.
+	 * @param password
+	 *            - file password.
+	 * @return the document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 * @since 0.7
+	 */
+	public static Document loadDocument(File file, String password) throws Exception {
+		Document doc = loadDocument(OdfPackage.loadPackage(file, password, null));
+		doc.setFile(file);
+		return doc;
+	}
+
+	/**
+	 * Creates a Document from the Document provided by an ODF package.
+	 * 
+	 * @param odfPackage
+	 *            - the ODF package containing the ODF document.
+	 * @return the root document of the given OdfPackage
+	 * @throws java.lang.Exception
+	 *             - if the ODF document could not be created.
+	 */
+	public static Document loadDocument(OdfPackage odfPackage) throws Exception {
+		return loadDocument(odfPackage, ROOT_DOCUMENT_PATH);
+	}
+
+	/**
+	 * Creates a Document from the Document provided by an ODF package.
+	 * 
+	 * @param odfPackage
+	 *            - the ODF package containing the ODF document.
+	 * @param internalPath
+	 *            - the path to the ODF document relative to the package root.
+	 * @return the root document of the given OdfPackage
+	 * @throws java.lang.Exception
+	 *             - if the ODF document could not be created.
+	 */
+	public static Document loadDocument(OdfPackage odfPackage, String internalPath) throws Exception {
+		String documentMediaType = odfPackage.getMediaTypeString(internalPath);
+		if (documentMediaType == null) {
+			throw new IllegalArgumentException("Given internalPath '" + internalPath + "' is an illegal or inappropriate argument.");
+		}
+		OdfMediaType odfMediaType = OdfMediaType.getOdfMediaType(documentMediaType);
+		if (odfMediaType == null) {
+			ErrorHandler errorHandler = odfPackage.getErrorHandler();
+			Matcher matcherCTRL = CONTROL_CHAR_PATTERN.matcher(documentMediaType);
+			if (matcherCTRL.find()) {
+				documentMediaType = matcherCTRL.replaceAll(EMPTY_STRING);
+			}
+			OdfValidationException ve = new OdfValidationException(OdfSchemaConstraint.DOCUMENT_WITHOUT_ODF_MIMETYPE, internalPath, documentMediaType);
+			if (errorHandler != null) {
+				errorHandler.fatalError(ve);
+			}
+			throw ve;
+		}
+		return newDocument(odfPackage, internalPath, odfMediaType);
+	}
+
+	/**
+	 * Sets password of this document.
+	 * 
+	 * @param password
+	 *            the password of this document.
+	 * @since 0.8
+	 */
+	public void setPassword(String password) {
+		getPackage().setPassword(password);
+	}
+
+	// return null if the media type can not be recognized.
+	private static Document loadDocumentFromTemplate(OdfMediaType odfMediaType) throws Exception {
+
+		switch (odfMediaType) {
+		case TEXT:
+		case TEXT_TEMPLATE:
+		case TEXT_MASTER:
+		case TEXT_WEB:
+			// documentTemplate = TextDocument.EMPTY_TEXT_DOCUMENT_RESOURCE;
+			TextDocument document = TextDocument.newTextDocument();
+			document.changeMode(TextDocument.OdfMediaType.TEXT_WEB);
+			return document;
+
+		case SPREADSHEET:
+			SpreadsheetDocument spreadsheet = SpreadsheetDocument.newSpreadsheetDocument();
+			spreadsheet.changeMode(SpreadsheetDocument.OdfMediaType.SPREADSHEET);
+			return spreadsheet;
+
+		case SPREADSHEET_TEMPLATE:
+			SpreadsheetDocument spreadsheettemplate = SpreadsheetDocument.newSpreadsheetDocument();
+			spreadsheettemplate.changeMode(SpreadsheetDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+			return spreadsheettemplate;
+
+		case PRESENTATION:
+			PresentationDocument presentation = PresentationDocument.newPresentationDocument();
+			presentation.changeMode(PresentationDocument.OdfMediaType.PRESENTATION);
+			return presentation;
+
+		case PRESENTATION_TEMPLATE:
+			PresentationDocument presentationtemplate = PresentationDocument.newPresentationDocument();
+			presentationtemplate.changeMode(PresentationDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+			return presentationtemplate;
+
+		case GRAPHICS:
+			GraphicsDocument graphics = GraphicsDocument.newGraphicsDocument();
+			graphics.changeMode(GraphicsDocument.OdfMediaType.GRAPHICS);
+			return graphics;
+
+		case GRAPHICS_TEMPLATE:
+			GraphicsDocument graphicstemplate = GraphicsDocument.newGraphicsDocument();
+			graphicstemplate.changeMode(GraphicsDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+			return graphicstemplate;
+
+		case CHART:
+			ChartDocument chart = ChartDocument.newChartDocument();
+			chart.changeMode(ChartDocument.OdfMediaType.CHART);
+			return chart;
+
+		case CHART_TEMPLATE:
+			ChartDocument charttemplate = ChartDocument.newChartDocument();
+			charttemplate.changeMode(ChartDocument.OdfMediaType.CHART_TEMPLATE);
+			return charttemplate;
+
+			// case IMAGE:
+			// case IMAGE_TEMPLATE:
+
+		default:
+			throw new IllegalArgumentException("Given mediaType '" + odfMediaType.toString() + "' is either not yet supported or not an ODF mediatype!");
+		}
+	}
+
+	/**
+	 * Creates one of the ODF documents based a given mediatype.
+	 * 
+	 * @param odfMediaType
+	 *            The ODF Mediatype of the ODF document to be created.
+	 * @return The ODF document, which mediatype dependends on the parameter or
+	 *         NULL if media type were not supported.
+	 */
+	private static Document newDocument(OdfPackage pkg, String internalPath, OdfMediaType odfMediaType) {
+		Document newDoc = null;
+		switch (odfMediaType) {
+		case TEXT:
+			newDoc = new TextDocument(pkg, internalPath, TextDocument.OdfMediaType.TEXT);
+			break;
+
+		case TEXT_TEMPLATE:
+			newDoc = new TextDocument(pkg, internalPath, TextDocument.OdfMediaType.TEXT_TEMPLATE);
+			break;
+
+		case TEXT_MASTER:
+			newDoc = new TextDocument(pkg, internalPath, TextDocument.OdfMediaType.TEXT_MASTER);
+			break;
+
+		case TEXT_WEB:
+			newDoc = new TextDocument(pkg, internalPath, TextDocument.OdfMediaType.TEXT_WEB);
+			break;
+
+		case SPREADSHEET:
+			newDoc = new SpreadsheetDocument(pkg, internalPath, SpreadsheetDocument.OdfMediaType.SPREADSHEET);
+			break;
+
+		case SPREADSHEET_TEMPLATE:
+			newDoc = new SpreadsheetDocument(pkg, internalPath, SpreadsheetDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+			break;
+
+		case PRESENTATION:
+			newDoc = new PresentationDocument(pkg, internalPath, PresentationDocument.OdfMediaType.PRESENTATION);
+			break;
+
+		case PRESENTATION_TEMPLATE:
+			newDoc = new PresentationDocument(pkg, internalPath, PresentationDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+			break;
+
+		case GRAPHICS:
+			newDoc = new GraphicsDocument(pkg, internalPath, GraphicsDocument.OdfMediaType.GRAPHICS);
+			break;
+
+		case GRAPHICS_TEMPLATE:
+			newDoc = new GraphicsDocument(pkg, internalPath, GraphicsDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+			break;
+
+		case CHART:
+			newDoc = new ChartDocument(pkg, internalPath, ChartDocument.OdfMediaType.CHART);
+			break;
+
+		case CHART_TEMPLATE:
+			newDoc = new ChartDocument(pkg, internalPath, ChartDocument.OdfMediaType.CHART_TEMPLATE);
+			break;
+		// case IMAGE:
+		// case IMAGE_TEMPLATE:
+
+		default:
+			newDoc = null;
+			throw new IllegalArgumentException("Given mediaType '" + odfMediaType.mMediaType + "' is not yet supported!");
+		}
+		// returning null if MediaType is not supported
+		return newDoc;
+	}
+
+	/**
+	 * Returns an embedded OdfPackageDocument from the given package path.
+	 * 
+	 * @param documentPath
+	 *            path to the ODF document within the package. The path is
+	 *            relative to the current document.
+	 * @return an embedded Document
+	 */
+	public Document getEmbeddedDocument(String documentPath) {
+		String internalPath = getDocumentPath() + documentPath;
+		internalPath = normalizeDocumentPath(internalPath);
+		Document embeddedDocument = (Document) mPackage.getCachedDocument(internalPath);
+		// if the document was not already loaded, fine mimetype and create a
+		// new instance
+		if (embeddedDocument == null) {
+			String mediaTypeString = getMediaTypeString();
+			OdfMediaType odfMediaType = OdfMediaType.getOdfMediaType(mediaTypeString);
+			if (odfMediaType == null) {
+				embeddedDocument = newDocument(mPackage, internalPath, odfMediaType);
+			} else {
+				try {
+					String documentMediaType = mPackage.getMediaTypeString(internalPath);
+					odfMediaType = OdfMediaType.getOdfMediaType(documentMediaType);
+					if (odfMediaType == null) {
+						return null;
+					}
+					embeddedDocument = Document.loadDocument(mPackage, internalPath);
+				} catch (Exception ex) {
+					Logger.getLogger(OdfPackageDocument.class.getName()).log(Level.SEVERE, null, ex);
+				}
+			}
+		}
+		return embeddedDocument;
+	}
+
+	/**
+	 * Method returns all embedded OdfPackageDocuments, which match a valid
+	 * OdfMediaType, of the root OdfPackageDocument.
+	 * 
+	 * @return a list with all embedded documents of the root OdfPackageDocument
+	 */
+	// ToDo: (Issue 219 - PackageRefactoring) - Better return Path of
+	// Documents??
+	public List<Document> getEmbeddedDocuments() {
+		List<Document> embeddedObjects = new ArrayList<Document>();
+		// ToDo: (Issue 219 - PackageRefactoring) - Algorithm enhancement:
+		// Instead going through all the files for each mimetype, better
+		// Check all files, which have a mimetype if it is one of the desired,
+		// perhaps start with ODF prefix
+		for (OdfMediaType mediaType : OdfMediaType.values()) {
+			embeddedObjects.addAll(getEmbeddedDocuments(mediaType));
+		}
+		return embeddedObjects;
+	}
+
+	/**
+	 * Method returns all embedded OdfPackageDocuments of the root
+	 * OdfPackageDocument matching the according MediaType. This is done by
+	 * matching the subfolder entries of the manifest file with the given
+	 * OdfMediaType.
+	 * 
+	 * @param mediaType
+	 *            media type which is used as a filter
+	 * @return embedded documents of the root OdfPackageDocument matching the
+	 *         given media type
+	 */
+	public List<Document> getEmbeddedDocuments(OdfMediaType mediaType) {
+		String wantedMediaString = null;
+		if (mediaType != null) {
+			wantedMediaString = mediaType.getMediaTypeString();
+		}
+		List<Document> embeddedObjects = new ArrayList<Document>();
+		// check manifest for current embedded OdfPackageDocuments
+		Set<String> manifestEntries = mPackage.getFilePaths();
+		for (String path : manifestEntries) {
+			// any directory that is not the root document "/"
+			if (path.length() > 1 && path.endsWith(SLASH)) {
+				String entryMediaType = mPackage.getFileEntry(path).getMediaTypeString();
+				// if the entry is a document (directory has mediaType)
+				if (entryMediaType != null) {
+					// if a specific ODF mediatype was requested
+					if (wantedMediaString != null) {
+						// test if the desired mediatype matches the current
+						if (entryMediaType.equals(wantedMediaString)) {
+							normalizeDocumentPath(path);
+							embeddedObjects.add(getEmbeddedDocument(path));
+						}
+					} else {
+						// test if any ODF mediatype matches the current
+						for (OdfMediaType type : OdfMediaType.values()) {
+							if (entryMediaType.equals(type.getMediaTypeString())) {
+								embeddedObjects.add(getEmbeddedDocument(path));
+							}
+						}
+					}
+				}
+			}
+		}
+		return embeddedObjects;
+	}
+
+	/**
+	 * Embed an OdfPackageDocument to the current OdfPackageDocument. All the
+	 * file entries of child document will be embedded as well to the current
+	 * document package.
+	 * 
+	 * @param documentPath
+	 *            to the directory the ODF document should be inserted (relative
+	 *            to the current document).
+	 * @param sourceDocument
+	 *            the OdfPackageDocument to be embedded.
+	 */
+	public void insertDocument(OdfPackageDocument sourceDocument, String documentPath) {
+		super.insertDocument(sourceDocument, documentPath);
+	}
+
+	/**
+	 * Sets the media type of the Document
+	 * 
+	 * @param odfMediaType
+	 *            media type to be set
+	 */
+	protected void setOdfMediaType(OdfMediaType odfMediaType) {
+		mMediaType = odfMediaType;
+		super.setMediaTypeString(odfMediaType.getMediaTypeString());
+	}
+
+	/**
+	 * Gets the media type of the Document
+	 */
+	protected OdfMediaType getOdfMediaType() {
+		return mMediaType;
+	}
+
+	/**
+	 * Get the meta data feature instance of the current document
+	 * 
+	 * @return the meta data feature instance which represent
+	 *         <code>office:meta</code> in the meta.xml
+	 */
+	public Meta getOfficeMetadata() {
+		if (mOfficeMeta == null) {
+			try {
+				mOfficeMeta = new Meta(getMetaDom());
+			} catch (Exception ex) {
+				Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, ex);
+			}
+		}
+		return mOfficeMeta;
+	}
+
+	/**
+	 * Save the document to an OutputStream. Delegate to the root document and
+	 * save possible embedded Documents.
+	 * 
+	 * <p>
+	 * If the input file has been cached (this is the case when loading from an
+	 * InputStream), the input file can be overwritten.
+	 * </p>
+	 * 
+	 * <p>
+	 * If not, the OutputStream may not point to the input file! Otherwise this
+	 * will result in unwanted behaviour and broken files.
+	 * </p>
+	 * 
+	 * <p>
+	 * When save the embedded document to a stand alone document, all the file
+	 * entries of the embedded document will be copied to a new document
+	 * package. If the embedded document is outside of the current document
+	 * directory, you have to embed it to the sub directory and refresh the link
+	 * of the embedded document. you should reload it from the stream to get the
+	 * saved embedded document.
+	 * 
+	 * @param out
+	 *            - the OutputStream to write the file to
+	 * @throws java.lang.Exception
+	 *             if the document could not be saved
+	 */
+	public void save(OutputStream out) throws Exception {
+		// 2DO FLUSH AND SAVE IN PACKAGE
+		flushDoms();
+		updateMetaData();
+		if (!isRootDocument()) {
+			Document newDoc = loadDocumentFromTemplate(getOdfMediaType());
+			newDoc.insertDocument(this, ROOT_DOCUMENT_PATH);
+			newDoc.updateMetaData();
+			newDoc.mPackage.save(out);
+			// ToDo: (Issue 219 - PackageRefactoring) - Return the document,
+			// when not closing!
+			// Should we close the sources now? User will never receive the open
+			// package!
+		} else {
+			// 2DO MOVE CACHE TO PACKAGE
+			// // the root document only have to flush the DOM of all open child
+			// documents
+			// flushAllDOMs();
+			mPackage.save(out);
+		}
+	}
+
+	/**
+	 * Save the document to a given file.
+	 * 
+	 * <p>
+	 * If the input file has been cached (this is the case when loading from an
+	 * InputStream), the input file can be overwritten.
+	 * </p>
+	 * 
+	 * <p>
+	 * Otherwise it's allowed to overwrite the input file as long as the same
+	 * path name is used that was used for loading (no symbolic link foo2.odt
+	 * pointing to the loaded file foo1.odt, no network path X:\foo.odt pointing
+	 * to the loaded file D:\foo.odt).
+	 * </p>
+	 * 
+	 * <p>
+	 * When saving the embedded document to a stand alone document, all files of
+	 * the embedded document will be copied to a new document package. If the
+	 * embedded document is outside of the current document directory, you have
+	 * to embed it to the sub directory and refresh the link of the embedded
+	 * document. You should reload it from the given file to get the saved
+	 * embedded document.
+	 * 
+	 * @param file
+	 *            - the file to save the document
+	 * @throws java.lang.Exception
+	 *             if the document could not be saved
+	 */
+	public void save(File file) throws Exception {
+		// 2DO FLUSH AND SAVE IN PACKAGE
+		flushDoms();
+		updateMetaData();
+		if (!isRootDocument()) {
+			Document newDoc = loadDocumentFromTemplate(getOdfMediaType());
+			newDoc.insertDocument(this, ROOT_DOCUMENT_PATH);
+			newDoc.updateMetaData();
+			newDoc.mPackage.save(file);
+			// ToDo: (Issue 219 - PackageRefactoring) - Return the document,
+			// when not closing!
+			// Should we close the sources now? User will never receive the open
+			// package!
+		} else {
+			this.mPackage.save(file);
+		}
+	}
+
+	/**
+	 * Save the document to a given file with given password.
+	 * 
+	 * <p>
+	 * If the input file has been cached (this is the case when loading from an
+	 * InputStream), the input file can be overwritten.
+	 * </p>
+	 * 
+	 * <p>
+	 * Otherwise it's allowed to overwrite the input file as long as the same
+	 * path name is used that was used for loading (no symbolic link foo2.odt
+	 * pointing to the loaded file foo1.odt, no network path X:\foo.odt pointing
+	 * to the loaded file D:\foo.odt).
+	 * </p>
+	 * 
+	 * <p>
+	 * When saving the embedded document to a stand alone document, all files of
+	 * the embedded document will be copied to a new document package. If the
+	 * embedded document is outside of the current document directory, you have
+	 * to embed it to the sub directory and refresh the link of the embedded
+	 * document. You should reload it from the given file to get the saved
+	 * embedded document.
+	 * 
+	 * @param file
+	 *            the file to save the document.
+	 * @param file
+	 *            the password of this document.
+	 * 
+	 * @throws java.lang.Exception
+	 *             if the document could not be saved
+	 * @since 0.8
+	 */
+	public void save(File file, String password) throws Exception {
+		// 2DO FLUSH AND SAVE IN PACKAGE
+		flushDoms();
+		updateMetaData();
+		if (!isRootDocument()) {
+			Document newDoc = loadDocumentFromTemplate(getOdfMediaType());
+			newDoc.insertDocument(this, ROOT_DOCUMENT_PATH);
+			newDoc.updateMetaData();
+			newDoc.mPackage.setPassword(password);
+			newDoc.mPackage.save(file);
+			// ToDo: (Issue 219 - PackageRefactoring) - Return the document,
+			// when not closing!
+			// Should we close the sources now? User will never receive the open
+			// package!
+		} else {
+			mPackage.setPassword(password);
+			mPackage.save(file);
+		}
+	}
+
+	/**
+	 * Close the OdfPackage and release all temporary created data. Acter
+	 * execution of this method, this class is no longer usable. Do this as the
+	 * last action to free resources. Closing an already closed document has no
+	 * effect. Note that this will not close any cached documents.
+	 */
+	@Override
+	public void close() {
+		// set all member variables explicit to null
+		mMediaType = null;
+		mOfficeMeta = null;
+		mComponentRepository.clear();
+		super.close();
+	}
+
+	/**
+	 * Get the content root of a document.
+	 * 
+	 * You may prefer to use the getContentRoot methods of subclasses of
+	 * Document. Their return parameters are already casted to respective
+	 * subclasses of OdfElement.
+	 * 
+	 * @param clazz
+	 *            the type of the content root, depend on the document type
+	 * @return the child element of office:body, e.g. office:text for text docs
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	@SuppressWarnings("unchecked")
+	protected <T extends OdfElement> T getContentRoot(Class<T> clazz) throws Exception {
+		OdfElement contentRoot = getContentDom().getRootElement();
+		OfficeBodyElement contentBody = OdfElement.findFirstChildNode(OfficeBodyElement.class, contentRoot);
+		NodeList childs = contentBody.getChildNodes();
+		for (int i = 0; i < childs.getLength(); i++) {
+			Node cur = childs.item(i);
+			if ((cur != null) && clazz.isInstance(cur)) {
+				return (T) cur;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Get the content root of a document.
+	 * 
+	 * You may prefer to use the getContentRoot methods of subclasses of
+	 * Document.
+	 * 
+	 * @return the child element of office:body, e.g. office:text for text docs
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	public OdfElement getContentRoot() throws Exception {
+		return getContentRoot(OdfElement.class);
+	}
+
+	@Override
+	public String toString() {
+		return "\n" + getMediaTypeString() + " - ID: " + this.hashCode() + " " + getPackage().getBaseURI();
+	}
+
+	/**
+	 * Insert an Image from the specified uri to the end of the Document.
+	 * 
+	 * @param imageUri
+	 *            The URI of the image that will be added to the document, add
+	 *            image stream to the package, in the 'Pictures/' graphic
+	 *            directory with the same image file name as in the URI. If the
+	 *            imageURI is relative first the user.dir is taken to make it
+	 *            absolute.
+	 * @return Returns the internal package path of the image, which was created
+	 *         based on the given URI.
+	 * */
+	public String newImage(URI imageUri) {
+		try {
+			OdfContentDom contentDom = this.getContentDom();
+			OdfDrawFrame drawFrame = contentDom.newOdfElement(OdfDrawFrame.class);
+			XPath xpath = contentDom.getXPath();
+			if (this instanceof SpreadsheetDocument) {
+				TableTableCellElement lastCell = (TableTableCellElement) xpath.evaluate("//table:table-cell[last()]", contentDom, XPathConstants.NODE);
+				lastCell.appendChild(drawFrame);
+				drawFrame.removeAttribute("text:anchor-type");
+
+			} else if (this instanceof TextDocument) {
+				TextPElement lastPara = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom, XPathConstants.NODE);
+				if (lastPara == null) {
+					lastPara = ((TextDocument) this).newParagraph();
+				}
+				lastPara.appendChild(drawFrame);
+				drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+			} else if (this instanceof PresentationDocument) {
+				DrawPageElement lastPage = (DrawPageElement) xpath.evaluate("//draw:page[last()]", contentDom, XPathConstants.NODE);
+				lastPage.appendChild(drawFrame);
+			}
+			OdfDrawImage image = (OdfDrawImage) drawFrame.newDrawImageElement();
+			String imagePath = image.newImage(imageUri);
+			return imagePath;
+		} catch (Exception ex) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+
+	/**
+	 * Meta data about the document will be initialized. Following metadata data
+	 * is being added:
+	 * <ul>
+	 * <li>The initial creator name will be the Java user.name System property.</li>
+	 * <li>The date and time when this document was created using the current
+	 * data.</li>
+	 * <li>The number of times this document has been edited.</li>
+	 * <li>The default language will be the Java user.language System property.</li>
+	 * </ul>
+	 * 
+	 * @param newDoc
+	 *            the Document object which need to initialize meta data.
+	 * 
+	 *            TODO:This method will be moved to OdfMetadata class. see
+	 *            http://odftoolkit.org/bugzilla/show_bug.cgi?id=204
+	 */
+	private static void initializeMetaData(Document newDoc) {
+		Meta metaData = newDoc.getOfficeMetadata();
+		// add initial-creator info.
+		String creator = System.getProperty("user.name");
+		metaData.setInitialCreator(creator);
+		// add creation-date info.
+		Calendar calendar = Calendar.getInstance();
+		metaData.setCreationDate(calendar);
+		// add editing-cycles info.
+		metaData.setEditingCycles(0);
+		// add language info.
+		String language = System.getProperty("user.language");
+		if (language != null) {
+			metaData.setLanguage(language);
+		}
+	}
+
+	/**
+	 * Update document meta data in the ODF document. Following metadata data is
+	 * being updated:
+	 * <ul>
+	 * <li>The name of the person who last modified this document will be the
+	 * Java user.name System property</li>
+	 * <li>The date and time when the document was last modified using current
+	 * data</li>
+	 * <li>The number of times this document has been edited is incremented by 1
+	 * </li>
+	 * <li>The total time spent editing this document</li>
+	 * </ul>
+	 * 
+	 * TODO:This method will be moved to OdfMetadata class. see
+	 * http://odftoolkit.org/bugzilla/show_bug.cgi?id=204
+	 * 
+	 * @throws Exception
+	 */
+	private void updateMetaData() throws Exception {
+		if (mMetaDom != null) {
+			Meta metaData = getOfficeMetadata();
+			String creator = System.getProperty("user.name");
+			// update creator info.
+			metaData.setCreator(creator);
+			// update date info.
+			Calendar calendar = Calendar.getInstance();
+			metaData.setDcdate(calendar);
+			// update editing-cycles info.
+			Integer cycle = metaData.getEditingCycles();
+			if (cycle != null) {
+				metaData.setEditingCycles(++cycle);
+			} else {
+				metaData.setEditingCycles(1);
+			}
+			// update editing-duration info.
+			long editingDuration = calendar.getTimeInMillis() - documentOpeningTime;
+			editingDuration = (editingDuration < 1) ? 1 : editingDuration;
+			try {
+				DatatypeFactory aFactory = DatatypeFactory.newInstance();
+				metaData.setEditingDuration(new Duration(aFactory.newDurationDayTime(editingDuration)));
+			} catch (DatatypeConfigurationException e) {
+				Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "editing duration update fail as DatatypeFactory can not be instanced", e);
+			}
+		}
+	}
+
+	// /////////////////
+	// Following is the implementation of locale settings
+	// ////////////////
+
+	/**
+	 * <p>
+	 * Unicode characters are in general divided by office applications into
+	 * three different types:
+	 * 
+	 * <p>
+	 * 1) There is CJK: the Chinese, Japanese and Korean script (also old
+	 * Vietnamese belong to this group). See
+	 * http://en.wikipedia.org/wiki/CJK_characters
+	 * 
+	 * <p>
+	 * 2) There is CTL: Complex Text Layout, which uses BIDI algorithms and/or
+	 * glyph modules. See http://en.wikipedia.org/wiki/Complex_Text_Layout
+	 * 
+	 * <p>
+	 * 3) And there is all the rest, which was once called by MS Western.
+	 */
+	public enum ScriptType {
+		/**
+		 * Western language
+		 */
+		WESTERN,
+		/**
+		 * Chinese, Japanese and Korean
+		 */
+		CJK,
+		/**
+		 * Complex Text Layout language
+		 */
+		CTL;
+
+	}
+
+	private final static HashSet<String> CJKLanguage = new HashSet<String>();
+	private final static HashSet<String> CTLLanguage = new HashSet<String>();
+	{
+		CJKLanguage.add("zh"); // LANGUAGE_CHINES
+		CJKLanguage.add("ja"); // LANGUAGE_JAPANESE
+		CJKLanguage.add("ko"); // LANGUAGE_KOREANE
+
+		CTLLanguage.add("am"); // LANGUAGE_AMHARIC_ETHIOPIA
+		CTLLanguage.add("ar"); // LANGUAGE_ARABIC_SAUDI_ARABIA
+		CTLLanguage.add("as"); // LANGUAGE_ASSAMESE
+		CTLLanguage.add("bn"); // LANGUAGE_BENGALI
+		CTLLanguage.add("bo"); // LANGUAGE_TIBETAN
+		CTLLanguage.add("brx");// LANGUAGE_USER_BODO_INDIA
+		CTLLanguage.add("dgo");// LANGUAGE_USER_DOGRI_INDIA
+		CTLLanguage.add("dv"); // LANGUAGE_DHIVEHI
+		CTLLanguage.add("dz"); // LANGUAGE_DZONGKHA
+		CTLLanguage.add("fa"); // LANGUAGE_FARSI
+		CTLLanguage.add("gu"); // LANGUAGE_GUJARATI
+		CTLLanguage.add("he"); // LANGUAGE_HEBREW
+		CTLLanguage.add("hi"); // LANGUAGE_HINDI
+		CTLLanguage.add("km"); // LANGUAGE_KHMER
+		CTLLanguage.add("kn"); // LANGUAGE_KANNADA
+		CTLLanguage.add("ks"); // LANGUAGE_KASHMIRI
+		CTLLanguage.add("ku"); // LANGUAGE_USER_KURDISH_IRAQ
+		CTLLanguage.add("lo"); // LANGUAGE_LAO
+		CTLLanguage.add("mai");// LANGUAGE_USER_MAITHILI_INDIA
+		CTLLanguage.add("ml"); // LANGUAGE_MALAYALAM
+		CTLLanguage.add("mn"); // LANGUAGE_MONGOLIAN_MONGOLIAN
+		CTLLanguage.add("mni");// LANGUAGE_MANIPURI
+		CTLLanguage.add("mr"); // LANGUAGE_MARATHI
+		CTLLanguage.add("my"); // LANGUAGE_BURMESE
+		CTLLanguage.add("ne"); // LANGUAGE_NEPALI
+		CTLLanguage.add("or"); // LANGUAGE_ORIYA
+		CTLLanguage.add("pa"); // LANGUAGE_PUNJABI
+		CTLLanguage.add("sa"); // LANGUAGE_SANSKRIT
+		CTLLanguage.add("sd"); // LANGUAGE_SINDHI
+		CTLLanguage.add("si"); // LANGUAGE_SINHALESE_SRI_LANKA
+		CTLLanguage.add("syr");// LANGUAGE_SYRIAC
+		CTLLanguage.add("ta"); // LANGUAGE_TAMIL
+		CTLLanguage.add("te"); // LANGUAGE_TELUGU
+		CTLLanguage.add("th"); // LANGUAGE_THAI
+		CTLLanguage.add("ug"); // LANGUAGE_UIGHUR_CHINA
+		CTLLanguage.add("ur"); // LANGUAGE_URDU
+		CTLLanguage.add("yi"); // LANGUAGE_YIDDISH
+	}
+
+	/**
+	 * <p>
+	 * Set a locale information.
+	 * <p>
+	 * The locale information will affect the language and country setting of
+	 * the document. Thus the font settings, the spell checkings and etc will be
+	 * affected.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale
+	 */
+	public void setLocale(Locale locale) {
+		setLocale(locale, getScriptType(locale));
+	}
+
+	public static ScriptType getScriptType(Locale locale) {
+		String language = locale.getLanguage();
+		if (CJKLanguage.contains(language))
+			return ScriptType.CJK;
+		if (CTLLanguage.contains(language))
+			return ScriptType.CTL;
+		return ScriptType.WESTERN;
+
+	}
+
+	/**
+	 * <p>
+	 * Set a locale of a specific script type.
+	 * <p>
+	 * If the locale is not belone to the script type, nothing will happen.
+	 * 
+	 * @param locale
+	 *            - Locale information
+	 * @param scriptType
+	 *            - The script type
+	 */
+	public void setLocale(Locale locale, ScriptType scriptType) {
+		try {
+			switch (scriptType) {
+			case WESTERN:
+				setWesternLanguage(locale);
+				break;
+			case CJK:
+				setDefaultAsianLanguage(locale);
+				break;
+			case CTL:
+				setDefaultComplexLanguage(locale);
+				break;
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "Failed to set locale", e);
+		}
+	}
+
+	/**
+	 * <p>
+	 * Get a locale information of a specific script type.
+	 * 
+	 * @param scriptType
+	 *            - The script type
+	 * @return the Locale information
+	 */
+	public Locale getLocale(ScriptType scriptType) {
+		try {
+			switch (scriptType) {
+			case WESTERN:
+				return getDefaultLanguageByProperty(OdfTextProperties.Country, OdfTextProperties.Language);
+			case CJK:
+				return getDefaultLanguageByProperty(OdfTextProperties.CountryAsian, OdfTextProperties.LanguageAsian);
+			case CTL:
+				return getDefaultLanguageByProperty(OdfTextProperties.CountryComplex, OdfTextProperties.LanguageComplex);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "Failed to get locale", e);
+		}
+		return null;
+	}
+
+	/**
+	 * This method will set the default language and country information of the
+	 * document, based on the parameter of the Locale information.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale that the default language and country
+	 *            will be set to.
+	 * @throws Exception
+	 */
+	private void setWesternLanguage(Locale locale) throws Exception {
+		if (getScriptType(locale) != ScriptType.WESTERN)
+			return;
+
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		if (defaultStyles != null) {
+			Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+			while (itera.hasNext()) {
+				OdfDefaultStyle style = itera.next();
+				if (style.getFamily().getProperties().contains(OdfTextProperties.Language)) {
+					style.setProperty(OdfTextProperties.Language, locale.getLanguage());
+					style.setProperty(OdfTextProperties.Country, locale.getCountry());
+				}
+			}
+		}
+	}
+
+	private Locale getDefaultLanguageByProperty(OdfStyleProperty countryProp, OdfStyleProperty languageProp) throws Exception {
+		String lang = null, ctry = null;
+
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+
+		// get language and country setting from default style setting for
+		// paragraph
+		OdfDefaultStyle defaultStyle = styles.getDefaultStyle(OdfStyleFamily.Paragraph);
+		if (defaultStyle != null) {
+			if (defaultStyle.hasProperty(countryProp) && defaultStyle.hasProperty(languageProp)) {
+				ctry = defaultStyle.getProperty(countryProp);
+				lang = defaultStyle.getProperty(languageProp);
+				return new Locale(lang, ctry);
+			}
+		}
+		// if no default style setting for paragraph
+		// get language and country setting from other default style settings
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+		while (itera.hasNext()) {
+			OdfDefaultStyle style = itera.next();
+			if (style.hasProperty(countryProp) && style.hasProperty(languageProp)) {
+				ctry = style.getProperty(countryProp);
+				lang = style.getProperty(languageProp);
+				return new Locale(lang, ctry);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method will return an instance of Locale, which presents the default
+	 * language and country information settings in this document.
+	 * 
+	 * @return an instance of Locale that the default language and country is
+	 *         set to.
+	 */
+
+	/**
+	 * This method will set the default Asian language and country information
+	 * of the document, based on the parameter of the Locale information. If the
+	 * Locale instance is not set a Asian language (Chinese, Traditional
+	 * Chinese, Japanese and Korean, nothing will take effect.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale that the default Asian language and
+	 *            country will be set to.
+	 * @throws Exception
+	 */
+	private void setDefaultAsianLanguage(Locale locale) throws Exception {
+		if (getScriptType(locale) != ScriptType.CJK)
+			return;
+		String user_language = locale.getLanguage();
+		if (!user_language.equals(Locale.CHINESE.getLanguage()) && !user_language.equals(Locale.TRADITIONAL_CHINESE.getLanguage())
+				&& !user_language.equals(Locale.JAPANESE.getLanguage()) && !user_language.equals(Locale.KOREAN.getLanguage()))
+			return;
+
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		if (defaultStyles != null) {
+			Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+			while (itera.hasNext()) {
+				OdfDefaultStyle style = itera.next();
+				if (style.getFamily().getProperties().contains(OdfTextProperties.LanguageAsian)) {
+					style.setProperty(OdfTextProperties.LanguageAsian, locale.getLanguage());
+					style.setProperty(OdfTextProperties.CountryAsian, locale.getCountry());
+				}
+			}
+		}
+	}
+
+	/**
+	 * This method will set the default complex language and country information
+	 * of the document, based on the parameter of the Locale information.
+	 * 
+	 * @param locale
+	 *            - an instance of Locale that the default complex language and
+	 *            country will be set to.
+	 * @throws Exception
+	 */
+	private void setDefaultComplexLanguage(Locale locale) throws Exception {
+		if (getScriptType(locale) != ScriptType.CTL)
+			return;
+		OdfOfficeStyles styles = getStylesDom().getOfficeStyles();
+		Iterable<OdfDefaultStyle> defaultStyles = styles.getDefaultStyles();
+		if (defaultStyles != null) {
+			Iterator<OdfDefaultStyle> itera = defaultStyles.iterator();
+			while (itera.hasNext()) {
+				OdfDefaultStyle style = itera.next();
+				if (style.getFamily().getProperties().contains(OdfTextProperties.LanguageComplex)) {
+					style.setProperty(OdfTextProperties.LanguageComplex, locale.getLanguage());
+					style.setProperty(OdfTextProperties.CountryComplex, locale.getCountry());
+				}
+			}
+		}
+	}
+
+	/**
+	 * This method will search both the document content and header/footer,
+	 * return an iterator of section objects.
+	 * <p>
+	 * The sections defined in embed document won't be covered.
+	 * 
+	 * @return an iterator of Section objects
+	 */
+	public Iterator<Section> getSectionIterator() {
+		TextSectionElement element;
+		ArrayList<Section> list = new ArrayList<Section>();
+		try {
+			// search in content.xml
+			OdfElement root = getContentDom().getRootElement();
+			OfficeBodyElement officeBody = OdfElement.findFirstChildNode(OfficeBodyElement.class, root);
+			NodeList sectionList = officeBody.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "section");
+			for (int i = 0; i < sectionList.getLength(); i++) {
+				element = (TextSectionElement) sectionList.item(i);
+				list.add(Section.getInstance(element));
+			}
+
+			// Search in style.xml
+			root = getStylesDom().getRootElement();
+			OfficeMasterStylesElement masterStyle = OdfElement.findFirstChildNode(OfficeMasterStylesElement.class, root);
+			sectionList = masterStyle.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "section");
+			for (int i = 0; i < sectionList.getLength(); i++) {
+				element = (TextSectionElement) sectionList.item(i);
+				list.add(Section.getInstance(element));
+			}
+
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "Failed in sectionIterator", e);
+		}
+		return list.iterator();
+	}
+
+	/**
+	 * This method will search both the document content and header/footer,
+	 * return a section with a specific name.
+	 * <p>
+	 * This method won't search in the embed document.
+	 * <p>
+	 * Null will be returned if there is no section found.
+	 * 
+	 * @param name
+	 *            - the name of a section
+	 * @return a section object with a specific name
+	 */
+	public Section getSectionByName(String name) {
+		TextSectionElement element;
+		try {
+			OdfElement root = getContentDom().getRootElement();
+			OfficeBodyElement officeBody = OdfElement.findFirstChildNode(OfficeBodyElement.class, root);
+			XPath xpath = getContentDom().getXPath();
+			String xpathValue = ".//text:section[@text:name=\"" + name + "\"]";
+			element = (TextSectionElement) xpath.evaluate(xpathValue, officeBody, XPathConstants.NODE);
+			if (element != null) {
+				return Section.getInstance(element);
+			}
+
+			root = getStylesDom().getRootElement();
+			OfficeMasterStylesElement masterStyle = OdfElement.findFirstChildNode(OfficeMasterStylesElement.class, root);
+			xpath = getStylesDom().getXPath();
+			element = (TextSectionElement) xpath.evaluate(".//text:section[@text:name=\"" + name + "\"]", masterStyle, XPathConstants.NODE);
+			if (element != null) {
+				return Section.getInstance(element);
+			}
+
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "Failed in getSectionByName", e);
+		}
+
+		return null;
+
+	}
+
+	/**
+	 * Remove an ODF element from the document. All the resources that are only
+	 * related with this element will be removed at the same time.
+	 * 
+	 * @param odfElement
+	 *            - the odf element that would be moved.
+	 */
+	public boolean removeElementLinkedResource(OdfElement odfElement) {
+		boolean success = deleteLinkedRef(odfElement);
+		success &= deleteStyleRef(odfElement);
+		return success;
+	}
+
+	/**
+	 * Return a unique string with a character "a" followed by randomly
+	 * generating 6 hex numbers
+	 * 
+	 * @return a unique string
+	 */
+	String makeUniqueName() {
+		return String.format("a%06x", (int) (Math.random() * 0xffffff));
+	}
+
+	private String getNewUniqueString(String oldStr) {
+		int lastIndex = oldStr.lastIndexOf("-");
+		if (lastIndex == -1) {
+			return oldStr + "-" + makeUniqueName();
+		}
+		String suffix = oldStr.substring(lastIndex + 1);
+		if (suffix.matches("a[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]")) {
+			return oldStr.substring(0, lastIndex + 1) + makeUniqueName();
+		} else
+			return oldStr + "-" + makeUniqueName();
+	}
+
+	private void updateAttribute(Attr attr) {
+		String oldID = attr.getValue();
+		String newID = getNewUniqueString(oldID);
+		attr.setValue(newID);
+	}
+
+	/**
+	 * Make a content copy of the specified element, and the returned element
+	 * should have the specified ownerDocument.
+	 * 
+	 * @param element
+	 *            The element that need to be copied
+	 * @param dom
+	 *            The specified DOM tree that the returned element belong to
+	 * @param deep
+	 *            If true, recursively clone the subtree under the element,
+	 *            false, only clone the element itself
+	 * @return Returns a duplicated element which is not in the DOM tree with
+	 *         the specified element
+	 */
+	Node cloneForeignElement(Node element, OdfFileDom dom, boolean deep) {
+		if (element instanceof OdfElement) {
+			OdfElement cloneElement = dom.createElementNS(((OdfElement) element).getOdfName());
+
+			NamedNodeMap attributes = element.getAttributes();
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node item = attributes.item(i);
+					String qname = null;
+					String prefix = item.getPrefix();
+					if (prefix == null) {
+						qname = item.getLocalName();
+					} else {
+						qname = prefix + ":" + item.getLocalName();
+					}
+
+					cloneElement.setAttributeNS(item.getNamespaceURI(), qname, item.getNodeValue());
+				}
+			}
+
+			if (deep) {
+				Node childNode = element.getFirstChild();
+				while (childNode != null) {
+					cloneElement.appendChild(cloneForeignElement(childNode, dom, true));
+					childNode = childNode.getNextSibling();
+				}
+			}
+
+			return cloneElement;
+		} else {
+			return dom.createTextNode(element.getNodeValue());
+		}
+
+	}
+
+	/**
+	 * This method will update all the attribute "xml:id" to make it unique
+	 * within the whole document content
+	 * <p>
+	 * This method is usually be invoked before inserting a copied ODF element
+	 * to document content.
+	 * 
+	 * @param element
+	 *            - the element that need to be inserted.
+	 */
+	void updateXMLIds(OdfElement element) {
+		try {
+			XPath xpath = getContentDom().getXPath();
+			String xpathValue = "//*[@xml:id]";
+			NodeList childList = (NodeList) xpath.evaluate(xpathValue, element, XPathConstants.NODESET);
+			if (childList == null)
+				return;
+
+			for (int i = 0; i < childList.getLength(); i++) {
+				OdfElement ele = (OdfElement) childList.item(i);
+				Attr attri = ele.getAttributeNodeNS(OdfDocumentNamespace.XML.getUri(), "id");
+				updateAttribute(attri);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "Failed in updateXMLIds", e);
+		}
+	}
+
+	/**
+	 * This method will update all the attribute
+	 * "text:name","table:name","draw:name","chart:name", to make it unique
+	 * within the whole document content.
+	 * <p>
+	 * This method is usually be invoked before inserting a copied ODF element
+	 * to document content.
+	 * 
+	 * @param element
+	 *            - the element that need to be inserted.
+	 */
+	// anim:name, chart:name, config:name, office:name, presentation:name,
+	// svg:name,
+	void updateNames(OdfElement element) {
+		try {
+			XPath xpath = getContentDom().getXPath();
+			String xpathValue = "descendant-or-self::node()[@text:name|@table:name|@draw:name|@chart:name]";
+			NodeList childList = (NodeList) xpath.evaluate(xpathValue, element, XPathConstants.NODESET);
+			if (childList == null)
+				return;
+			for (int i = 0; i < childList.getLength(); i++) {
+				OdfElement ele = (OdfElement) childList.item(i);
+				Attr attri = ele.getAttributeNodeNS(OdfDocumentNamespace.TEXT.getUri(), "name");
+				if (attri != null)
+					updateAttribute(attri);
+				attri = ele.getAttributeNodeNS(OdfDocumentNamespace.TABLE.getUri(), "name");
+				if (attri != null)
+					updateAttribute(attri);
+				if (ele instanceof DrawFrameElement)// only update draw:frame
+				{
+					attri = ele.getAttributeNodeNS(OdfDocumentNamespace.DRAW.getUri(), "name");
+					if (attri != null)
+						updateAttribute(attri);
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, "Failed in updateXMLIds", e);
+		}
+	}
+
+	/**
+	 * This method will copy the linked resource of the element which need to be
+	 * copied, from the source package to the target package.
+	 * <p>
+	 * If the target package contains a resource with the same path and name,
+	 * the name of the resource will be renamed.
+	 * <p>
+	 * This method will copy resources all in one batch.
+	 * 
+	 * @param sourceCloneEle
+	 *            - the element that need to be copied
+	 * @param srcDocument
+	 *            - the source document
+	 */
+	void copyLinkedRefInBatch(OdfElement sourceCloneEle, Document srcDocument) {
+		try {
+			OdfFileDom fileDom = (OdfFileDom) sourceCloneEle.getOwnerDocument();
+			XPath xpath;
+			if (fileDom instanceof OdfContentDom) {
+				xpath = ((OdfContentDom) fileDom).getXPath();
+			} else {
+				xpath = ((OdfStylesDom) fileDom).getXPath();
+			}
+			// OdfPackageDocument srcDoc = fileDom.getDocument();
+			// new a map to put the original name and the rename string, in case
+			// that the same name might be referred by the slide several times.
+			HashMap<String, String> objectRenameMap = new HashMap<String, String>();
+			NodeList linkNodes = (NodeList) xpath.evaluate(".//*[@xlink:href]", sourceCloneEle, XPathConstants.NODESET);
+			for (int i = 0; i <= linkNodes.getLength(); i++) {
+				OdfElement object = null;
+				if (linkNodes.getLength() == i) {
+					if (sourceCloneEle.hasAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href")) {
+						object = sourceCloneEle;
+					} else {
+						break;
+					}
+				} else {
+					object = (OdfElement) linkNodes.item(i);
+				}
+				String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+				if (refObjPath != null && refObjPath.length() > 0) {
+					// the path of the object is start with "./"
+					boolean hasPrefix = false;
+					String prefix = "./";
+					String newObjPath;
+					if (refObjPath.startsWith(prefix)) {
+						refObjPath = refObjPath.substring(2);
+						hasPrefix = true;
+					}
+					// check if this linked resource has been copied
+					if (objectRenameMap.containsKey(refObjPath)) {
+						// this object has been copied already
+						newObjPath = objectRenameMap.get(refObjPath);
+						object.setAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "xlink:href", hasPrefix ? (prefix + newObjPath) : newObjPath);
+						continue;
+					}
+					// check if the current document contains the same path
+					OdfFileEntry fileEntry = getPackage().getFileEntry(refObjPath);
+					// note: if refObjPath is a directory, it must end with '/'
+					if (fileEntry == null) {
+						fileEntry = getPackage().getFileEntry(refObjPath + "/");
+					}
+					newObjPath = refObjPath;
+					if (fileEntry != null) {
+						// rename the object path
+						newObjPath = objectRenameMap.get(refObjPath);
+						if (newObjPath == null) {
+							// if refObjPath still contains ".", it means that
+							// it has the suffix
+							// then change the name before the suffix string
+							int dotIndex = refObjPath.indexOf(".");
+							if (dotIndex != -1) {
+								newObjPath = refObjPath.substring(0, dotIndex) + "-" + makeUniqueName() + refObjPath.substring(dotIndex);
+							} else {
+								newObjPath = refObjPath + "-" + makeUniqueName();
+							}
+							objectRenameMap.put(refObjPath, newObjPath);
+						}
+						object.setAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "xlink:href", hasPrefix ? (prefix + newObjPath) : newObjPath);
+					} else
+						objectRenameMap.put(refObjPath, refObjPath);
+				}
+			}
+			// copy resource in batch
+			copyResourcesFrom(srcDocument, objectRenameMap);
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	/*****************************/
+	/*
+	 * These codes are moved from OdfPackage, and should be removed till
+	 * OdfPackage can provide a mechanism to copy resources in batch.
+	 */
+	/*****************************/
+	private InputStream readAsInputStream(ZipInputStream inputStream) throws IOException {
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		if (outputStream != null) {
+			byte[] buf = new byte[4096];
+			int r = 0;
+			while ((r = inputStream.read(buf, 0, 4096)) > -1) {
+				outputStream.write(buf, 0, r);
+			}
+		}
+		return new ByteArrayInputStream(outputStream.toByteArray());
+	}
+
+	private String normalizeFilePath(String internalPath) {
+		if (internalPath.equals(EMPTY_STRING)) {
+			String errMsg = "The internalPath given by parameter is an empty string!";
+			Logger.getLogger(OdfPackage.class.getName()).severe(errMsg);
+			throw new IllegalArgumentException(errMsg);
+		} else {
+			return normalizePath(internalPath);
+		}
+	}
+
+	private static final String DOUBLE_DOT = "..";
+	private static final String DOT = ".";
+	private static final String COLON = ":";
+	private static final Pattern BACK_SLASH_PATTERN = Pattern.compile("\\\\");
+	private static final Pattern DOUBLE_SLASH_PATTERN = Pattern.compile("//");
+
+	private String normalizePath(String path) {
+		if (path == null) {
+			String errMsg = "The internalPath given by parameter is NULL!";
+			Logger.getLogger(OdfPackage.class.getName()).severe(errMsg);
+			throw new IllegalArgumentException(errMsg);
+		} else if (!mightBeExternalReference(path)) {
+			if (path.equals(EMPTY_STRING)) {
+				path = SLASH;
+			} else {
+				// exchange all backslash "\" with a slash "/"
+				if (path.indexOf('\\') != -1) {
+					path = BACK_SLASH_PATTERN.matcher(path).replaceAll(SLASH);
+				}
+				// exchange all double slash "//" with a slash "/"
+				while (path.indexOf("//") != -1) {
+					path = DOUBLE_SLASH_PATTERN.matcher(path).replaceAll(SLASH);
+				}
+				// if directory replacements (e.g. ..) exist, resolve and remove
+				// them
+				if (path.indexOf("/.") != -1 || path.indexOf("./") != -1) {
+					path = removeChangeDirectories(path);
+				}
+			}
+		}
+		return path;
+	}
+
+	private boolean mightBeExternalReference(String internalPath) {
+		boolean isExternalReference = false;
+		// if the fileReference is a external relative documentURL..
+		if (internalPath.startsWith(DOUBLE_DOT) || // or absolute documentURL
+				// AND not root document
+				internalPath.startsWith(SLASH) && !internalPath.equals(SLASH) || // or
+				// absolute
+				// IRI
+				internalPath.contains(COLON)) {
+			isExternalReference = true;
+		}
+		return isExternalReference;
+	}
+
+	private String removeChangeDirectories(String path) {
+		boolean isDirectory = path.endsWith(SLASH);
+		StringTokenizer tokenizer = new StringTokenizer(path, SLASH);
+		int tokenCount = tokenizer.countTokens();
+		List<String> tokenList = new ArrayList<String>(tokenCount);
+		// add all paths to a list
+		while (tokenizer.hasMoreTokens()) {
+			String token = tokenizer.nextToken();
+			tokenList.add(token);
+		}
+		if (!isDirectory) {
+			String lastPath = tokenList.get(tokenCount - 1);
+			if (lastPath.equals(DOT) || lastPath.equals(DOUBLE_DOT)) {
+				isDirectory = true;
+			}
+		}
+		String currentToken;
+		int removeDirLevel = 0;
+		StringBuilder out = new StringBuilder();
+		// work on the list from back to front
+		for (int i = tokenCount - 1; i >= 0; i--) {
+			currentToken = tokenList.get(i);
+			// every ".." will remove an upcoming path
+			if (currentToken.equals(DOUBLE_DOT)) {
+				removeDirLevel++;
+			} else if (currentToken.equals(DOT)) {
+			} else {
+				// if a path have to be remove, neglect current path
+				if (removeDirLevel > 0) {
+					removeDirLevel--;
+				} else {
+					// add the path segment
+					out.insert(0, SLASH);
+					out.insert(0, currentToken);
+				}
+			}
+		}
+		if (removeDirLevel > 0) {
+			return EMPTY_STRING;
+		} else {
+			if (!isDirectory) {
+				// remove trailing slash /
+				out.deleteCharAt(out.length() - 1);
+			}
+			return out.toString();
+		}
+	}
+
+	/*****************************/
+	// FIXME: These two methods are only used in method copyResourcesFrom to
+	// improve copy performance, should not be used in any other way.
+	// methods loadDocument(String documentPath) and loadDocument(File file)
+	// will initialize mFile.
+	// This field and these two methods should be removed after ODFDOM supplies
+	// batch copy.
+	private void setFile(File thisFile) {
+		mFile = thisFile;
+	}
+
+	private File getFile() {
+		return mFile;
+	}
+
+	/**
+	 * This method will copy resources from source document to this document.
+	 * The second parameter contains a map between all the name of resources in
+	 * the source document and the rename string. If the source document is
+	 * loaded from a file, a good performance method will be used. If the source
+	 * document is loaded from a input stream, package layer methods will be
+	 * invoked to copy these resources, with bad performance.
+	 * 
+	 * In future, the code of this method will move to ODFDOM package layer.
+	 * Till then, good performance will be gotten whether the source document is
+	 * loaded from file or from input stream.
+	 * 
+	 */
+	void copyResourcesFrom(Document srcDoc, HashMap<String, String> objectRenameMap) throws Exception {
+		if (srcDoc.getFile() != null) {
+			ArrayList<String> copiedFolder = new ArrayList<String>();
+			Set<String> refObjPathSet = objectRenameMap.keySet();
+			FileInputStream tempFileStream = new FileInputStream(srcDoc.getFile());
+			ZipInputStream zipStream = new ZipInputStream(tempFileStream);
+			ZipEntry zipEntry = zipStream.getNextEntry();
+			while (zipEntry != null) {
+				String refObjPath = zipEntry.getName();
+				for (String path : refObjPathSet) {
+					if (refObjPath.equals(path)) {
+						String newObjPath = objectRenameMap.get(refObjPath);
+						refObjPath = normalizeFilePath(refObjPath);
+						String mediaType = srcDoc.getPackage().getFileEntry(refObjPath).getMediaTypeString();
+						InputStream is = readAsInputStream(zipStream);
+						getPackage().insert(is, newObjPath, mediaType);
+						break;
+					} else if (refObjPath.startsWith(path + "/")) {
+						String suffix = refObjPath.substring(path.length());
+						String newObjPath = objectRenameMap.get(path) + suffix;
+						refObjPath = normalizeFilePath(refObjPath);
+						String mediaType = srcDoc.getPackage().getFileEntry(refObjPath).getMediaTypeString();
+						InputStream is = readAsInputStream(zipStream);
+						getPackage().insert(is, newObjPath, mediaType);
+						if (!copiedFolder.contains(path)) {
+							mediaType = srcDoc.getPackage().getFileEntry(path + "/").getMediaTypeString();
+							getPackage().insert((InputStream) null, objectRenameMap.get(path) + "/", mediaType);
+							copiedFolder.add(path);
+						}
+						break;
+					}
+				}
+				zipEntry = zipStream.getNextEntry();
+			}
+			zipStream.close();
+			tempFileStream.close();
+		} else {
+			Set<String> refObjPathSet = objectRenameMap.keySet();
+			for (String refObjPath : refObjPathSet) {
+				String newObjPath = objectRenameMap.get(refObjPath);
+				InputStream is = srcDoc.getPackage().getInputStream(refObjPath);
+				if (is != null) {
+					String mediaType = srcDoc.getPackage().getFileEntry(refObjPath).getMediaTypeString();
+					getPackage().insert(is, newObjPath, mediaType);
+				} else {
+					Document embedDoc = ((Document) srcDoc).getEmbeddedDocument(refObjPath);
+					if (embedDoc != null) {
+						insertDocument(embedDoc, newObjPath);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * This method will copy the linked resource of the element which need to be
+	 * copied, from the source package to the target package.
+	 * <p>
+	 * If the target package contains a resource with the same path and name,
+	 * the name of the resource will be renamed.
+	 * 
+	 * @param sourceCloneEle
+	 *            - the element that need to be copied
+	 */
+	// clone the source clone element's referred object path to the current
+	// package
+	// if the current package contains the same name with the referred object
+	// path,
+	// rename the object path and path reference of this slide element
+	// notes: the source clone element is the copied one to avoid changing the
+	// content of the source document.
+	void copyLinkedRef(OdfElement sourceCloneEle) {
+		try {
+			OdfFileDom fileDom = (OdfFileDom) sourceCloneEle.getOwnerDocument();
+			XPath xpath;
+			if (fileDom instanceof OdfContentDom) {
+				xpath = ((OdfContentDom) fileDom).getXPath();
+			} else {
+				xpath = ((OdfStylesDom) fileDom).getXPath();
+			}
+			OdfPackageDocument srcDoc = fileDom.getDocument();
+			// new a map to put the original name and the rename string, in case
+			// that the same name might be referred by the slide several times.
+			HashMap<String, String> objectRenameMap = new HashMap<String, String>();
+			NodeList linkNodes = (NodeList) xpath.evaluate(".//*[@xlink:href]", sourceCloneEle, XPathConstants.NODESET);
+			for (int i = 0; i <= linkNodes.getLength(); i++) {
+				OdfElement object = null;
+				if (linkNodes.getLength() == i) {
+					if (sourceCloneEle.hasAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href")) {
+						object = sourceCloneEle;
+					} else {
+						break;
+					}
+				} else {
+					object = (OdfElement) linkNodes.item(i);
+				}
+				String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+				if (refObjPath != null && refObjPath.length() > 0) {
+					// the path of the object is start with "./"
+					boolean hasPrefix = false;
+					String prefix = "./";
+					if (refObjPath.startsWith(prefix)) {
+						refObjPath = refObjPath.substring(2);
+						hasPrefix = true;
+					}
+					// check if the current document contains the same path
+					OdfFileEntry fileEntry = getPackage().getFileEntry(refObjPath);
+					// note: if refObjPath is a directory, it must end with '/'
+					if (fileEntry == null) {
+						fileEntry = getPackage().getFileEntry(refObjPath + "/");
+					}
+					String newObjPath = refObjPath;
+					if (fileEntry != null) {
+						// rename the object path
+						newObjPath = objectRenameMap.get(refObjPath);
+						if (newObjPath == null) {
+							// if refObjPath still contains ".", it means that
+							// it has the suffix
+							// then change the name before the suffix string
+							int dotIndex = refObjPath.indexOf(".");
+							if (dotIndex != -1) {
+								newObjPath = refObjPath.substring(0, dotIndex) + "-" + makeUniqueName() + refObjPath.substring(dotIndex);
+							} else {
+								newObjPath = refObjPath + "-" + makeUniqueName();
+							}
+							objectRenameMap.put(refObjPath, newObjPath);
+						}
+						object.setAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "xlink:href", hasPrefix ? (prefix + newObjPath) : newObjPath);
+					}
+					InputStream is = srcDoc.getPackage().getInputStream(refObjPath);
+					if (is != null) {
+						String mediaType = srcDoc.getPackage().getFileEntry(refObjPath).getMediaTypeString();
+						getPackage().insert(is, newObjPath, mediaType);
+					} else {
+						Document embedDoc = ((Document) srcDoc).getEmbeddedDocument(refObjPath);
+						if (embedDoc != null) {
+							insertDocument(embedDoc, newObjPath);
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	/**
+	 * When a element needs to be copied to a different document, all the style
+	 * definitions that are related with this element need to be copied.
+	 * 
+	 * @param sourceCloneEle
+	 *            - the element that need to be copied
+	 * @param srcDoc
+	 *            - the source document
+	 */
+	void copyForeignStyleRef(OdfElement sourceCloneEle, Document srcDoc) {
+		try {
+			ArrayList<String> tempList = new ArrayList<String>();
+			OdfFileDom srcContentDom = srcDoc.getContentDom();
+			XPath xpath = srcContentDom.getXPath();
+			// 1. collect all the referred style element which has "style:name"
+			// attribute
+			// 1.1. style:name of content.xml
+			String styleQName = "style:name";
+			NodeList srcStyleDefNodeList = (NodeList) xpath.evaluate("*/office:automatic-styles/*[@" + styleQName + "]", srcContentDom, XPathConstants.NODESET);
+			IdentityHashMap<OdfElement, List<OdfElement>> srcContentStyleCloneEleList = new IdentityHashMap<OdfElement, List<OdfElement>>();
+			IdentityHashMap<OdfElement, OdfElement> appendContentStyleList = new IdentityHashMap<OdfElement, OdfElement>();
+			getCopyStyleList(null, sourceCloneEle, styleQName, srcStyleDefNodeList, srcContentStyleCloneEleList, appendContentStyleList, tempList, true);
+			// 1.2. style:name of styles.xml
+			srcStyleDefNodeList = (NodeList) xpath.evaluate(".//*[@" + styleQName + "]", srcDoc.getStylesDom(), XPathConstants.NODESET);
+			IdentityHashMap<OdfElement, List<OdfElement>> srcStylesStyleCloneEleList = new IdentityHashMap<OdfElement, List<OdfElement>>();
+			IdentityHashMap<OdfElement, OdfElement> appendStylesStyleList = new IdentityHashMap<OdfElement, OdfElement>();
+			tempList.clear();
+			getCopyStyleList(null, sourceCloneEle, styleQName, srcStyleDefNodeList, srcStylesStyleCloneEleList, appendStylesStyleList, tempList, true);
+			// 1.3 rename, copy the referred style element to the corresponding
+			// position in the dom tree
+			insertCollectedStyle(styleQName, srcContentStyleCloneEleList, getContentDom(), appendContentStyleList);
+			insertCollectedStyle(styleQName, srcStylesStyleCloneEleList, getStylesDom(), appendStylesStyleList);
+
+			// 2. collect all the referred style element which has "draw:name"
+			// attribute
+			// 2.1 draw:name of styles.xml
+			// the value of draw:name is string or StyleName,
+			// only when the value is StyleName type, the style definition
+			// should be cloned to the destination document
+			// in ODF spec, such attribute type is only exist in <office:styles>
+			// element, so only search it in styles.xml dom
+			tempList.clear();
+			styleQName = "draw:name";
+			srcStyleDefNodeList = (NodeList) xpath.evaluate(".//*[@" + styleQName + "]", srcDoc.getStylesDom(), XPathConstants.NODESET);
+			IdentityHashMap<OdfElement, List<OdfElement>> srcDrawStyleCloneEleList = new IdentityHashMap<OdfElement, List<OdfElement>>();
+			IdentityHashMap<OdfElement, OdfElement> appendDrawStyleList = new IdentityHashMap<OdfElement, OdfElement>();
+			Iterator<OdfElement> iter = appendContentStyleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendContentStyleList.get(styleElement);
+				getCopyStyleList(styleElement, cloneStyleElement, styleQName, srcStyleDefNodeList, srcDrawStyleCloneEleList, appendDrawStyleList, tempList,
+						false);
+			}
+			iter = appendStylesStyleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendStylesStyleList.get(styleElement);
+				getCopyStyleList(styleElement, cloneStyleElement, styleQName, srcStyleDefNodeList, srcDrawStyleCloneEleList, appendDrawStyleList, tempList,
+						false);
+			}
+			// 2.2 rename, copy the referred style element to the corresponding
+			// position in the dom tree
+			// note: "draw:name" style element only exist in styles.dom
+			insertCollectedStyle(styleQName, srcDrawStyleCloneEleList, getStylesDom(), appendDrawStyleList);
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+		}
+
+	}
+
+	// 1. modified the style name of the style definition element which has the
+	// same name with the source document
+	// 2. As to the style definition which match 1) condition, modified the
+	// referred style name of the element which reference this style
+	// 3. All the style which also contains other style reference, should be
+	// copied to the source document.
+	private void insertCollectedStyle(String styleQName, IdentityHashMap<OdfElement, List<OdfElement>> srcStyleCloneEleList, OdfFileDom dom,
+			IdentityHashMap<OdfElement, OdfElement> appendStyleList) {
+		try {
+			String stylePrefix = OdfNamespace.getPrefixPart(styleQName);
+			String styleLocalName = OdfNamespace.getLocalPart(styleQName);
+			String styleURI = OdfDocumentNamespace.STYLE.getUri();
+			if (stylePrefix.equals("draw"))
+				styleURI = OdfDocumentNamespace.DRAW.getUri();
+			// is the DOM always the styles.xml
+			XPath xpath = dom.getXPath();
+			NodeList destStyleNodeList;
+			if (dom instanceof OdfContentDom)
+				destStyleNodeList = (NodeList) xpath.evaluate("*/office:automatic-styles/*[@" + styleQName + "]", dom, XPathConstants.NODESET);
+			else
+				destStyleNodeList = (NodeList) xpath.evaluate(".//*[@" + styleQName + "]", dom, XPathConstants.NODESET);
+			Iterator<OdfElement> iter = srcStyleCloneEleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendStyleList.get(styleElement);
+				if (cloneStyleElement == null) {
+					cloneStyleElement = (OdfElement) styleElement.cloneNode(true);
+					appendStyleList.put(styleElement, cloneStyleElement);
+				}
+				String styleName = styleElement.getAttributeNS(styleURI, styleLocalName);
+				List<String> newStyleNameList = styleRenameMap.get(styleName);
+				// if the newStyleNameList != null, means that styleName exists
+				// in dest document
+				// and it has already been renamed
+				if ((newStyleNameList != null) || (isStyleNameExist(destStyleNodeList, styleName) != null)) {
+					String newStyleName = null;
+					if (newStyleNameList == null) {
+						newStyleNameList = new ArrayList<String>();
+						newStyleName = styleName + "-" + makeUniqueName();
+						newStyleNameList.add(newStyleName);
+						styleRenameMap.put(styleName, newStyleNameList);
+					} else {
+						for (int i = 0; i < newStyleNameList.size(); i++) {
+							String styleNameIter = newStyleNameList.get(i);
+							OdfElement destStyleElementWithNewName = isStyleNameExist(destStyleNodeList, styleNameIter);
+							// check if the two style elements have the same
+							// content
+							// if not, the cloneStyleElement should rename,
+							// rather than reuse the new style name
+							cloneStyleElement.setAttributeNS(styleURI, styleQName, styleNameIter);
+							if ((destStyleElementWithNewName != null) && destStyleElementWithNewName.equals(cloneStyleElement)) {
+								newStyleName = styleNameIter;
+								break;
+							}
+						}
+						if (newStyleName == null) {
+							newStyleName = styleName + "-" + makeUniqueName();
+							newStyleNameList.add(newStyleName);
+						}
+					}
+					// System.out.println("renaming:"+styleName+"-"+newStyleName);
+					// if newStyleName has been set in the element as the new
+					// name
+					// which means that the newStyleName is conform to the odf
+					// spec
+					// then change element style reference name
+					if (changeStyleRefName(srcStyleCloneEleList.get(styleElement), styleName, newStyleName)) {
+						cloneStyleElement.setAttributeNS(styleURI, styleQName, newStyleName);
+						// if display name should also be renamed
+						String displayName = cloneStyleElement.getAttributeNS(styleURI, "display-name");
+						if ((displayName != null) && (displayName.length() > 0)) {
+							cloneStyleElement.setAttributeNS(styleURI, stylePrefix + ":display-name",
+									displayName + newStyleName.substring(newStyleName.length() - 8));
+						}
+					}
+				}
+			}
+
+			iter = appendStyleList.keySet().iterator();
+			while (iter.hasNext()) {
+				OdfElement styleElement = iter.next();
+				OdfElement cloneStyleElement = appendStyleList.get(styleElement);
+				String newStyleName = cloneStyleElement.getAttributeNS(styleURI, styleLocalName);
+				Boolean isAppended = styleAppendMap.get(newStyleName);
+				// if styleAppendMap contain the newStyleName,
+				// means that cloneStyleElement has already been appended
+				if ((isAppended != null) && isAppended.booleanValue() == true) {
+					continue;
+				} else {
+					styleAppendMap.put(newStyleName, true);
+				}
+				OdfElement cloneForeignStyleElement = (OdfElement) cloneForeignElement(cloneStyleElement, dom, true);
+				String styleElePath = getElementPath(styleElement);
+				appendForeignStyleElement(cloneForeignStyleElement, dom, styleElePath);
+				copyLinkedRef(cloneStyleElement);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+		}
+
+	}
+
+	// get all the copy of referred style element which is directly referred or
+	// indirectly referred by cloneEle
+	// styleQName is style:name
+	// all the style are defined in srcStyleNodeList
+	// and these style are all have the styleName defined in styleQName
+	// attribute
+	// the key of copyStyleEleList is the style definition element
+	// the value of the corresponding key is the clone of the element which
+	// refer to the key,
+	// the cloned element can be the content of slide or the style element.
+	// the key of appendStyleList is the style definition element which has the
+	// other style reference
+	// the value of the corresponding key is the the style definition clone
+	// element
+	// loop means if recursive call this function
+	// if loop == true, get the style definition element reference other style
+	// definition element
+	private void getCopyStyleList(OdfElement ele, OdfElement cloneEle, String styleQName, NodeList srcStyleNodeList,
+			IdentityHashMap<OdfElement, List<OdfElement>> copyStyleEleList, IdentityHashMap<OdfElement, OdfElement> appendStyleList, List<String> attrStrList,
+			boolean loop) {
+		try {
+			String styleLocalName = OdfNamespace.getLocalPart(styleQName);
+			String stylePrefix = OdfNamespace.getPrefixPart(styleQName);
+			String styleURI = OdfDocumentNamespace.STYLE.getUri();
+			if (stylePrefix.equals("draw"))
+				styleURI = OdfDocumentNamespace.DRAW.getUri();
+			// OdfElement override the "toString" method
+			String cloneEleStr = cloneEle.toString();
+			for (int i = 0; i < srcStyleNodeList.getLength(); i++) {
+				OdfElement styleElement = (OdfElement) srcStyleNodeList.item(i);
+				String styleName = styleElement.getAttributeNS(styleURI, styleLocalName);
+				if (styleName != null) {
+					int index = 0;
+					index = cloneEleStr.indexOf("=\"" + styleName + "\"", index);
+					while (index >= 0) {
+						String subStr = cloneEleStr.substring(0, index);
+						int lastSpaceIndex = subStr.lastIndexOf(' ');
+						String attrStr = subStr.substring(lastSpaceIndex + 1, index);
+						if (attrStr.equals(styleQName) || attrStrList.contains(attrStr + "=" + "\"" + styleName + "\"")) {
+							index = cloneEleStr.indexOf("=\"" + styleName + "\"", index + styleName.length());
+							continue;
+						}
+						attrStrList.add(attrStr + "=" + "\"" + styleName + "\"");
+						XPath xpath = ((OdfFileDom) cloneEle.getOwnerDocument()).getXPath();
+						NodeList styleRefNodes = (NodeList) xpath.evaluate(".//*[@" + attrStr + "='" + styleName + "']", cloneEle, XPathConstants.NODESET);
+						boolean isExist = false;
+						for (int j = 0; j <= styleRefNodes.getLength(); j++) {
+							OdfElement styleRefElement = null;
+							if (j == styleRefNodes.getLength()) {
+								isExist = isStyleNameRefExist(cloneEle, styleName, false);
+								if (isExist) {
+									styleRefElement = cloneEle;
+								} else {
+									continue;
+								}
+							} else {
+								OdfElement tmpElement = (OdfElement) styleRefNodes.item(j);
+								if (isStyleNameRefExist(tmpElement, styleName, false)) {
+									styleRefElement = tmpElement;
+								} else {
+									continue;
+								}
+							}
+							boolean hasLoopStyleDef = true;
+							if (!(styleElement instanceof StyleFontFaceElement)) {
+							if (copyStyleEleList.get(styleElement) == null) {
+								List<OdfElement> styleRefEleList = new ArrayList<OdfElement>();
+								copyStyleEleList.put(styleElement, styleRefEleList);
+								hasLoopStyleDef = false;
+							}
+							copyStyleEleList.get(styleElement).add(styleRefElement);
+							}
+
+							OdfElement cloneStyleElement = appendStyleList.get(styleElement);
+							if (cloneStyleElement == null) {
+								cloneStyleElement = (OdfElement) styleElement.cloneNode(true);
+								appendStyleList.put(styleElement, cloneStyleElement);
+							}
+							if (loop && !hasLoopStyleDef) {
+								getCopyStyleList(styleElement, cloneStyleElement, styleQName, srcStyleNodeList, copyStyleEleList, appendStyleList, attrStrList,
+										loop);
+							}
+						}
+						index = cloneEleStr.indexOf("=\"" + styleName + "\"", index + styleName.length());
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	// append the cloneStyleElement to the contentDom which position is defined
+	// by styleElePath
+	private void appendForeignStyleElement(OdfElement cloneStyleEle, OdfFileDom dom, String styleElePath) {
+		StringTokenizer token = new StringTokenizer(styleElePath, "/");
+		boolean isExist = true;
+		boolean found = false;
+		Node iterNode = dom.getFirstChild();
+		Node parentNode = dom;
+		while (token.hasMoreTokens()) {
+			String onePath = token.nextToken();
+			found = false;
+
+			while ((iterNode != null) && isExist) {
+				String path = iterNode.getNamespaceURI();
+				String prefix = iterNode.getPrefix();
+				if (prefix == null) {
+					path += "@" + iterNode.getLocalName();
+				} else {
+					path += "@" + prefix + ":" + iterNode.getLocalName();
+				}
+				if (!path.equals(onePath)) {
+					// not found, then get the next sibling to find such path
+					// node
+					iterNode = iterNode.getNextSibling();
+				} else {
+					// found, then get the child nodes to find the next path
+					// node
+					parentNode = iterNode;
+					found = true;
+					iterNode = iterNode.getFirstChild();
+					break;
+				}
+			}
+
+			if (!found) {
+				// should new the element since the current path node
+				if (isExist) {
+					isExist = false;
+				}
+				StringTokenizer token2 = new StringTokenizer(onePath, "@");
+				OdfElement newElement = dom.createElementNS(OdfName.newName(token2.nextToken(), token2.nextToken()));
+				parentNode.appendChild(newElement);
+				parentNode = newElement;
+			}
+		}
+		parentNode.appendChild(cloneStyleEle);
+	}
+
+	// The returned string is a path from the top of the dom tree to the
+	// specified element
+	// and the path is split by "/" between each node
+	private String getElementPath(OdfElement styleEle) {
+		String path = "";
+		Node parentNode = styleEle.getParentNode();
+		while (!(parentNode instanceof OdfFileDom)) {
+			String qname = null;
+			String prefix = parentNode.getPrefix();
+			if (prefix == null) {
+				qname = parentNode.getLocalName();
+			} else {
+				qname = prefix + ":" + parentNode.getLocalName();
+			}
+			path = parentNode.getNamespaceURI() + "@" + qname + "/" + path;
+			parentNode = parentNode.getParentNode();
+		}
+		return path;
+	}
+
+	// change the element referred oldStyleName to the new name
+	// if true then set newStyleName attribute value successfully
+	// if false means that the newStyleName value is not conform to the ODF
+	// spec, so do not modify the oldStyleName
+	private boolean changeStyleRefName(List<OdfElement> list, String oldStyleName, String newStyleName) {
+		boolean rtn = false;
+		for (int index = 0; index < list.size(); index++) {
+			OdfElement element = list.get(index);
+			NamedNodeMap attributes = element.getAttributes();
+
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node item = attributes.item(i);
+					String value = item.getNodeValue();
+					if (oldStyleName.equals(value)) {
+						try {
+							item.setNodeValue(newStyleName);
+							rtn = true;
+							break;
+						} catch (IllegalArgumentException e) {
+							return false;
+						}
+					}
+				}
+			}
+		}
+		return rtn;
+	}
+
+	// check if the element contains the referred styleName
+	private boolean isStyleNameRefExist(Node element, String styleName, boolean deep) {
+		NamedNodeMap attributes = element.getAttributes();
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Node item = attributes.item(i);
+				if (item.getNodeValue().equals(styleName) && !item.getNodeName().equals("style:name")) {
+					// this is style definition, not reference.
+					return true;
+				}
+			}
+		}
+		if (deep) {
+			Node childNode = element.getFirstChild();
+			while (childNode != null) {
+				if (!isStyleNameRefExist(childNode, styleName, true)) {
+					childNode = childNode.getNextSibling();
+				} else {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	// check if nodeList contains the node that "style:name" attribute has the
+	// same value with styleName
+	// Note: nodeList here is all the style definition list
+	private OdfElement isStyleNameExist(NodeList nodeList, String styleName) {
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			OdfElement element = (OdfElement) nodeList.item(i);
+			String name = element.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "name");
+			if (name.equals(styleName)) {
+				// return true;
+				return element;
+			}
+		}
+		// return false;
+		return null;
+	}
+
+	/**
+	 * This method will delete all the linked resources that are only related
+	 * with this element.
+	 * 
+	 * @param odfEle
+	 *            - the element to be deleted.
+	 * @return true if successfully delete, or else, false will be returned
+	 */
+	// delete all the xlink:href object which is contained in slideElement and
+	// does not referred by other slides
+	boolean deleteLinkedRef(OdfElement odfEle) {
+		boolean success = true;
+		try {
+			OdfFileDom contentDom = getContentDom();
+			XPath xpath = contentDom.getXPath();
+			NodeList linkNodes = (NodeList) xpath.evaluate("//*[@xlink:href]", contentDom, XPathConstants.NODESET);
+			for (int i = 0; i < linkNodes.getLength(); i++) {
+				OdfElement object = (OdfElement) linkNodes.item(i);
+				String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+				int relation = odfEle.compareDocumentPosition(object);
+				// if slide element contains the returned element which has the
+				// xlink:href reference
+				if ((relation & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0 && refObjPath != null && refObjPath.length() > 0) {
+					// the path of the object is start with "./"
+					NodeList pathNodes = (NodeList) xpath.evaluate("//*[@xlink:href='" + refObjPath + "']", getContentDom(), XPathConstants.NODESET);
+					int refCount = pathNodes.getLength();
+					if (refCount == 1) {
+						// delete "./"
+						if (refObjPath.startsWith("./")) {
+							refObjPath = refObjPath.substring(2);
+						}
+						// check if the current document contains the same path
+						OdfFileEntry fileEntry = getPackage().getFileEntry(refObjPath);
+						if (fileEntry != null) {
+							// it is a stream, such as image, binary file
+							getPackage().remove(refObjPath);
+						} else {
+							// note: if refObjPath is a directory, it must end
+							// with '/'
+							fileEntry = getPackage().getFileEntry(refObjPath + "/");
+							removeDocument(refObjPath);
+						}
+					}
+				}
+			}
+		} catch (XPathExpressionException e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+		}
+		return success;
+	}
+
+	/**
+	 * This method will delete all the style definitions that are only related
+	 * with this element.
+	 * 
+	 * @param odfEle
+	 *            - the element to be deleted.
+	 * @return true if successfully delete, or else, false will be returned
+	 */
+	boolean deleteStyleRef(OdfElement odfEle) {
+		boolean success = true;
+		try {
+			// method 1:
+			// 1.1. iterate child element of the content element
+			// 1.2. if the child element is an OdfStylableElement, get the
+			// style-name ref count
+			// //////////////
+			// method 2:
+			// 2.1. get the list of the style definition
+			ArrayList<OdfElement> removeStyles = new ArrayList<OdfElement>();
+			OdfOfficeAutomaticStyles autoStyles = getContentDom().getAutomaticStyles();
+
+			NodeList stylesList = autoStyles.getChildNodes();
+			OdfFileDom contentDom = getContentDom();
+			XPath xpath = contentDom.getXPath();
+
+			// 2.2. get the reference of each style which occurred in the
+			// current page
+			for (int i = 0; i < stylesList.getLength(); i++) {
+				Node item = stylesList.item(i);
+				if (item instanceof OdfElement) {
+					OdfElement node = (OdfElement) item;
+					String styleName = node.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "name");
+					if (styleName != null) {
+						// search the styleName contained at the current page
+						// element
+						NodeList styleNodes = (NodeList) xpath.evaluate("//*[@*='" + styleName + "']", contentDom, XPathConstants.NODESET);
+						int styleCnt = styleNodes.getLength();
+						if (styleCnt > 1) {
+							// the first styleName is occurred in the style
+							// definition
+							// so check if the second styleName and last
+							// styleName is occurred in the current page element
+							// if yes, then remove it
+							OdfElement elementFirst = (OdfElement) styleNodes.item(1);
+							OdfElement elementLast = (OdfElement) styleNodes.item(styleCnt - 1);
+							boolean isSamePage = false;
+							if (elementFirst instanceof DrawPageElement) {
+								DrawPageElement tempPage = (DrawPageElement) elementFirst;
+								if (tempPage.equals(odfEle)) {
+									isSamePage = true;
+								}
+							}
+							int relationFirst = odfEle.compareDocumentPosition(elementFirst);
+							int relationLast = odfEle.compareDocumentPosition(elementLast);
+							// if slide element contains the child element which
+							// has the styleName reference
+							if (((relationFirst & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0 && (relationLast & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0)
+									|| (isSamePage && (styleCnt == 1))) {
+								if (node instanceof OdfStyleBase) {
+									removeStyles.add(node);
+								}
+							}
+						} else {
+							continue;
+						}
+					}
+				}
+			}
+			for (int i = 0; i < removeStyles.size(); i++) {
+				autoStyles.removeChild(removeStyles.get(i));
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+		}
+		return success;
+	}
+
+	public Table addTable() {
+		return getTableContainerImpl().addTable();
+	}
+
+	public Table addTable(int numRows, int numCols) {
+		return getTableContainerImpl().addTable(numRows, numCols);
+	}
+
+	public Table getTableByName(String name) {
+		return getTableContainerImpl().getTableByName(name);
+	}
+
+	public java.util.List<Table> getTableList() {
+		return getTableContainerImpl().getTableList();
+	}
+
+	public TableBuilder getTableBuilder() {
+		return getTableContainerImpl().getTableBuilder();
+	}
+
+	protected TableContainer getTableContainerImpl() {
+		if (tableContainerImpl == null) {
+			tableContainerImpl = new TableContainerImpl();
+		}
+		return tableContainerImpl;
+	}
+
+	private class TableContainerImpl extends AbstractTableContainer {
+
+		public OdfElement getTableContainerElement() {
+			OdfElement containerElement = null;
+			try {
+				containerElement = getContentRoot();
+			} catch (Exception e) {
+				Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, e);
+			}
+			return containerElement;
+		}
+	}
+
+	/**
+	 * Return the component repository of this document.
+	 * 
+	 * @return the component repository of this document.
+	 */
+	protected IdentityHashMap<OdfElement, Component> getComponentMap() {
+		return mComponentRepository;
+	}
+
+	/**
+	 * Construct a
+	 * 
+	 * 
+	 * <code>TableTemplate<code> feature by extracting style template from an pre-defined table in a foreign document. The styles loaded by the template will be copied into the document as well and can be referenced by table directly.
+	 * <p>
+	 * The imported table need to be at least a 5*5 table (e.g. A1E5).  Each type of style in the template will be set according to the style reference in a specific table cell, as following:
+	 * <br>first column - A2
+	 * <br>last column - E2
+	 * <br>first row - A2
+	 * <br>last row - E2
+	 * <br>even rows - B3
+	 * <br>odd rows - B2
+	 * <br>even columns - C2
+	 * <br>odd columns - B2
+	 * <br>body - B2
+	 * <br>first-row-start-column -A1
+	 * <br>first-row-end-column -E1
+	 * <br>last-row-start-column -A5
+	 * <br>last-row-end-column -E5
+	 * 
+	 * @param templateFileInputStream
+	 *            - the InputStream of the ODF document.
+	 * @param tableName
+	 *            - the table name which will be used to load styles as template
+	 * @throws Exception
+	 *             - if content DOM could not be initialized
+	 */
+	public TableTemplate LoadTableTemplateFromForeignTable(
+			InputStream templateFileInputStream, String tableName) throws Exception {
+
+		Document doc = Document.loadDocument(templateFileInputStream);
+
+		if (doc == null)
+			throw new IllegalStateException(
+					"Cannot load specified template file.");
+
+		Table table = doc.getTableByName(tableName);
+		if (table == null)
+			throw new IllegalStateException(
+					"Cannot load table template from specified file.");
+
+		if (table.getRowCount() < 5 || table.getColumnCount() < 5)
+			throw new IllegalStateException(
+					"The template cannot be loaded. It should be at least a 5*5 table.");
+
+		TableTemplate template = new TableTemplate(getStylesDom()
+				.newOdfElement(TableTableTemplateElement.class));
+
+		// first-row-start-column
+		Cell cell = table.getCellByPosition(0, 0);
+		cell.getParagraphIterator().hasNext();
+		cell.getParagraphIterator().next().getStyleName();
+		Paragraph para = cell.getParagraphByIndex(0, false);
+		String paraStyle = (para != null ? para.getStyleName() : null);
+		template.setExtendedStyleByType(
+				TableTemplate.ExtendedStyleType.FIRSTROWSTARTCOLUM, cell
+						.getStyleName(), paraStyle);
+		TableTableCellElementBase oldCellEle = cell.getOdfElement();
+		TableTableCellElementBase newCellEle = (TableTableCellElementBase) oldCellEle
+				.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// first-row-end-column
+		cell = table.getCellByPosition(4, 0);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setExtendedStyleByType(
+				TableTemplate.ExtendedStyleType.FIRSTROWENDCOLUMN, cell
+						.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// last-row-start-column
+		cell = table.getCellByPosition(0, 4);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setExtendedStyleByType(
+				TableTemplate.ExtendedStyleType.LASTROWSTARTCOLUMN, cell
+						.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// last-row-end-column
+		cell = table.getCellByPosition(4, 4);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setExtendedStyleByType(
+				TableTemplate.ExtendedStyleType.LASTROWENDCOLUMN, cell
+						.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// first column
+		cell = table.getCellByPosition(0, 1);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableFirstColumnStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// last column
+		cell = table.getCellByPosition(4, 2);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableLastColumnStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// first row
+		cell = table.getCellByPosition(1, 0);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableFirstRowStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// last row
+		cell = table.getCellByPosition(1, 4);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableLastRowStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// body (=odd row/column)
+		cell = table.getCellByPosition(1, 1);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableBodyStyle(cell.getStyleName(), paraStyle);
+		template.setTableOddRowsStyle(cell.getStyleName(), paraStyle);
+		template.setTableOddColumnsStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// even row
+		cell = table.getCellByPosition(1, 2);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableEvenRowsStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		// even row
+		cell = table.getCellByPosition(2, 1);
+		para = cell.getParagraphByIndex(0, false);
+		paraStyle = (para != null ? para.getStyleName() : null);
+		template.setTableEvenColumnsStyle(cell.getStyleName(), paraStyle);
+		oldCellEle = cell.getOdfElement();
+		newCellEle = (TableTableCellElementBase) oldCellEle.cloneNode(true);
+		copyForeignStyleRef(newCellEle, cell.getOwnerDocument());
+
+		return template;
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/GraphicsDocument.java b/trunk/simple/src/main/java/org/odftoolkit/simple/GraphicsDocument.java
new file mode 100644
index 0000000..ca00ced
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/GraphicsDocument.java
@@ -0,0 +1,215 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.io.File;
+import java.io.InputStream;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeDrawingElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+
+/**
+ * This class represents an empty ODF graphics document.
+ * 
+ */
+public class GraphicsDocument extends Document {
+
+	private static final String EMPTY_GRAPHICS_DOCUMENT_PATH = "/OdfGraphicsDocument.odg";
+	static final Resource EMPTY_GRAPHICS_DOCUMENT_RESOURCE = new Resource(EMPTY_GRAPHICS_DOCUMENT_PATH);
+
+	/**
+	 * This enum contains all possible media types of GraphicsDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		GRAPHICS(Document.OdfMediaType.GRAPHICS), GRAPHICS_TEMPLATE(Document.OdfMediaType.GRAPHICS_TEMPLATE);
+		private final Document.OdfMediaType mMediaType;
+
+		OdfMediaType(Document.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 * 
+		 * @param mediaType
+		 *            string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and
+		 *         the suffix
+		 */
+		public static Document.OdfMediaType getOdfMediaType(String mediaType) {
+			return Document.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty graphics document.
+	 * 
+	 * @return ODF graphics document based on a default template
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static GraphicsDocument newGraphicsDocument() throws Exception {
+		return (GraphicsDocument) Document.loadTemplate(EMPTY_GRAPHICS_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.GRAPHICS);
+	}
+
+	/**
+	 * Creates an empty graphics template.
+	 * 
+	 * @return ODF graphics template based on a default
+	 * @throws java.lang.Exception
+	 *             - if the template could not be created
+	 */
+	public static GraphicsDocument newGraphicsTemplateDocument() throws Exception {
+		GraphicsDocument doc = (GraphicsDocument) Document.loadTemplate(EMPTY_GRAPHICS_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.GRAPHICS_TEMPLATE);
+		doc.changeMode(OdfMediaType.GRAPHICS_TEMPLATE);
+		return doc;
+	}
+
+	/**
+	 * To avoid data duplication a new document is only created, if not already
+	 * opened. A document is cached by this constructor using the internalpath
+	 * as key.
+	 */
+	protected GraphicsDocument(OdfPackage pkg, String internalPath, GraphicsDocument.OdfMediaType odfMediaType) {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Creates an GraphicsDocument from the OpenDocument provided by a resource
+	 * Stream.
+	 * 
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by GraphicsDocument, the InputStream is cached. This
+	 * usually takes more time compared to the other createInternalDocument
+	 * methods. An advantage of caching is that there are no problems
+	 * overwriting an input file.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF graphics document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param inputStream
+	 *            - the InputStream of the ODF graphics document.
+	 * @return the graphics document created from the given InputStream
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static GraphicsDocument loadDocument(InputStream inputStream) throws Exception {
+		return (GraphicsDocument) Document.loadDocument(inputStream);
+	}
+
+	/**
+	 * Loads an GraphicsDocument from the provided path.
+	 * 
+	 * <p>
+	 * GraphicsDocument relies on the file being available for read access over
+	 * the whole lifecycle of GraphicsDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF graphics document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @return the graphics document from the given path or NULL if the media
+	 *         type is not supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static GraphicsDocument loadDocument(String documentPath) throws Exception {
+		return (GraphicsDocument) Document.loadDocument(documentPath);
+	}
+
+	/**
+	 * Creates an GraphicsDocument from the OpenDocument provided by a File.
+	 * 
+	 * <p>
+	 * GraphicsDocument relies on the file being available for read access over
+	 * the whole lifecycle of GraphicsDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF graphics document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF graphics document.
+	 * @return the graphics document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static GraphicsDocument loadDocument(File file) throws Exception {
+		return (GraphicsDocument) Document.loadDocument(file);
+	}
+
+	/**
+	 * Get the content root of a graphics document.
+	 * 
+	 * @return content root, representing the office:drawing tag
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeDrawingElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeDrawingElement.class);
+	}
+
+	/**
+	 * Changes the document to the given mediatype. This method can only be used
+	 * to convert a document to a related mediatype, e.g. template.
+	 * 
+	 * @param mediaType
+	 *            the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+
+	public OdfElement getTableContainerElement() {
+		throw new UnsupportedOperationException("Graphics document is not supported to hold table now.");
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/JarManifest.java b/trunk/simple/src/main/java/org/odftoolkit/simple/JarManifest.java
new file mode 100644
index 0000000..c0bbeba
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/JarManifest.java
@@ -0,0 +1,174 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Provides meta data about the Simple ODF library as build date, version
+ * number. Its main() method is the start method of the library, enabling the
+ * access of version methods from command line: "java -jar simple-odf.jar".
+ */
+public class JarManifest {
+
+	private static final String CURRENT_CLASS_RESOURCE_PATH = "org/odftoolkit/simple/JarManifest.class";
+	private static final String MANIFEST_JAR_PATH = "META-INF/MANIFEST.MF";
+	private static String SIMPLE_ODF_NAME;
+	private static String SIMPLE_ODF_VERSION;
+	private static String SIMPLE_ODF_WEBSITE;
+	private static String SIMPLE_ODF_BUILD_BY;
+	private static String SIMPLE_ODF_BUILD_DATE;
+	private static String SIMPLE_ODF_SUPPORTED_ODF_VERSION;
+
+	static {
+		try {
+			Manifest manifest = new Manifest(getManifestAsStream());
+			Attributes attr = manifest.getEntries().get("SIMPLE-ODF");
+			SIMPLE_ODF_NAME = attr.getValue("SIMPLE-ODF-Name");
+			SIMPLE_ODF_VERSION = attr.getValue("SIMPLE-ODF-Version");
+			SIMPLE_ODF_WEBSITE = attr.getValue("SIMPLE-ODF-Website");
+			SIMPLE_ODF_BUILD_BY = attr.getValue("SIMPLE-ODF-Built-By");
+			SIMPLE_ODF_BUILD_DATE = attr.getValue("SIMPLE-ODF-Built-Date");
+			SIMPLE_ODF_SUPPORTED_ODF_VERSION = attr.getValue("SIMPLE-ODF-Supported-ODF-Version");
+		} catch (Exception e) {
+			Logger.getLogger(JarManifest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	private static InputStream getManifestAsStream() {
+		String versionRef = JarManifest.class.getClassLoader().getResource(
+				CURRENT_CLASS_RESOURCE_PATH).toString();
+		String manifestRef = versionRef.substring(0, versionRef
+				.lastIndexOf(CURRENT_CLASS_RESOURCE_PATH))
+				+ MANIFEST_JAR_PATH;
+		URL manifestURL = null;
+		InputStream in = null;
+		try {
+			manifestURL = new URL(manifestRef);
+		} catch (MalformedURLException ex) {
+			Logger.getLogger(JarManifest.class.getName()).log(Level.SEVERE,
+					null, ex);
+		}
+		try {
+			in = manifestURL.openStream();
+		} catch (IOException ex) {
+			Logger.getLogger(JarManifest.class.getName()).log(Level.SEVERE,
+					null, ex);
+		}
+		return in;
+	}
+
+	private JarManifest() {
+	}
+
+	/**
+	 * The main method is meant to be called when the JAR is being executed,
+	 * e.g. "java -jar simple-odf.jar" and provides version information:
+	 * 
+	 * simple-odf 0.3 (build 20110201-1729) from http://odftoolkit.org
+	 * supporting ODF 1.2
+	 * 
+	 * Allowing version access from the JAR without the need to unzip the JAR
+	 * nor naming the JAR (requiring the change of class path for every version
+	 * due to JAR naming change).
+	 */
+	public static void main(String[] args) throws IOException {
+		System.out.println(getSimpleOdfTitle() + " (build "
+				+ getSimpleOdfBuildDate() + ')' + "\nfrom "
+				+ getSimpleOdfWebsite() + " supporting ODF "
+				+ getSimpleOdfSupportedOdfVersion());
+	}
+
+	/**
+	 * Return the name of Simple ODF;
+	 * 
+	 * @return the Simple ODF library name
+	 */
+	public static String getSimpleOdfName() {
+		return SIMPLE_ODF_NAME;
+	}
+
+	/**
+	 * Returns the Simple ODF library title
+	 * 
+	 * @return A string containing both the name and the version of the Simple
+	 *         ODF library.
+	 */
+	public static String getSimpleOdfTitle() {
+		return getSimpleOdfName() + ' ' + getSimpleOdfVersion();
+	}
+
+	/**
+	 * Return the version of the Simple ODF library (ie. simple-odf.jar)
+	 * 
+	 * @return the Simple ODF library version
+	 */
+	public static String getSimpleOdfVersion() {
+		return SIMPLE_ODF_VERSION;
+	}
+
+	/**
+	 * Return the website of the Simple ODF library (ie. simple-odf.jar)
+	 * 
+	 * @return the Simple ODF library website
+	 */
+	public static String getSimpleOdfWebsite() {
+		return SIMPLE_ODF_WEBSITE;
+	}
+
+	/**
+	 * Return the name of the one building the Simple ODF library (ie.
+	 * simple-odf.jar)
+	 * 
+	 * @return the name of the Simple ODF library builder
+	 */
+	public static String getSimpleOdfBuildResponsible() {
+		return SIMPLE_ODF_BUILD_BY;
+	}
+
+	/**
+	 * Return the date when Simple ODF had been build
+	 * 
+	 * @return the date of the build
+	 */
+	public static String getSimpleOdfBuildDate() {
+		return SIMPLE_ODF_BUILD_DATE;
+	}
+
+	/**
+	 * Returns the version of the OpenDocument specification covered by the
+	 * Simple ODF library (ie. simple-odf.jar)
+	 * 
+	 * @return the supported ODF version number
+	 */
+	public static String getSimpleOdfSupportedOdfVersion() {
+		return SIMPLE_ODF_SUPPORTED_ODF_VERSION;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/PresentationDocument.java b/trunk/simple/src/main/java/org/odftoolkit/simple/PresentationDocument.java
new file mode 100644
index 0000000..9546620
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/PresentationDocument.java
@@ -0,0 +1,964 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.awt.Rectangle;
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageThumbnailElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.chart.AbstractChartContainer;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.chart.ChartContainer;
+import org.odftoolkit.simple.chart.DataSet;
+import org.odftoolkit.simple.presentation.Slide;
+import org.odftoolkit.simple.presentation.Notes.NotesBuilder;
+import org.odftoolkit.simple.presentation.Slide.SlideBuilder;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents an empty ODF presentation.
+ */
+public class PresentationDocument extends Document implements ChartContainer{
+
+	private static final String EMPTY_PRESENTATION_DOCUMENT_PATH = "/OdfPresentationDocument.odp";
+	static final Resource EMPTY_PRESENTATION_DOCUMENT_RESOURCE = new Resource(EMPTY_PRESENTATION_DOCUMENT_PATH);
+	private final SlideBuilder slideBuilder;
+	private final NotesBuilder notesBuilder;
+	private ChartContainerImpl chartContainerImpl;
+	
+	/**
+	 * It represents the defined values of presentation:class. The
+	 * presentation:class attribute classifies presentation shapes by their
+	 * usage within a draw page.
+	 * 
+	 * @since 0.5
+	 */
+	public static enum PresentationClass {
+		/**
+		 * presentation charts are standard object shapes.
+		 */
+		CHAT("chart"),
+		/**
+		 * presentation graphics are standard graphic shapes.
+		 */
+		GRAPHIC("graphic"),
+		/**
+		 * presentation handouts are placeholder for the drawing page in a
+		 * handout page.
+		 */
+		HANDOUT("handout"),
+		/**
+		 * presentation notes are used on notes pages.
+		 */
+		NOTES("notes"),
+		/**
+		 * presentation objects are standard object shapes.
+		 */
+		OBJECTS("object"),
+		/**
+		 * presentation organization charts are standard object shapes.
+		 */
+		ORGCHART("orgchart"),
+		/**
+		 * outlines are standard text shapes
+		 */
+		OUTLINE("outline"),
+		/**
+		 * presentation pages are used on notes pages
+		 */
+		PAGE("page"),
+		/**
+		 * subtitles are standard text shapes
+		 */
+		SUBTITLE("subtitle"),
+		/**
+		 * presentation tables are standard object shapes
+		 */
+		TABLE("table"),
+		/**
+		 * presentation texts are standard text shapes
+		 */
+		TEXT("text"),
+		/**
+		 * titles are standard text shapes
+		 */
+		TITLE("title"),
+		/**
+		 * drawing shape is used as a date and/or time shape. Date and Time
+		 * shapes are standard text shapes.
+		 */
+		DATETIME("date-time"),
+		/**
+		 * drawing shape is used as a footer. Footer shapes are standard text
+		 * shapes.
+		 */
+		FOOTER("footer"),
+		/**
+		 * drawing shape is used as a header. Header shapes are standard text
+		 * shapes.
+		 */
+		HEADER("header"),
+		/**
+		 * drawing shape is used as a page number shape. Page Number shapes are
+		 * standard text shapes.
+		 */
+		PAGENUMBER("page-number");
+
+		private String value;
+
+		PresentationClass(String aClass) {
+			value = aClass;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+
+		public static PresentationClass enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (PresentationClass aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Presentation Class!");
+		}
+	}
+	
+	/**
+	 * This enum contains all possible media types of PresentationDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		PRESENTATION(Document.OdfMediaType.PRESENTATION), PRESENTATION_TEMPLATE(
+				Document.OdfMediaType.PRESENTATION_TEMPLATE);
+		private final Document.OdfMediaType mMediaType;
+
+		OdfMediaType(Document.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the ODF mediatype of this document
+		 */
+		public Document.OdfMediaType getOdfMediaType() {
+			return mMediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 * 
+		 * @param mediaType
+		 *            string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and
+		 *         the suffix
+		 */
+		public static Document.OdfMediaType getOdfMediaType(String mediaType) {
+			return Document.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty presentation document.
+	 * 
+	 * @return ODF presentation document based on a default template
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static PresentationDocument newPresentationDocument() throws Exception {
+		return (PresentationDocument) Document.loadTemplate(EMPTY_PRESENTATION_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.PRESENTATION);
+	}
+
+	/**
+	 * Creates an empty presentation template.
+	 * 
+	 * @return ODF presentation template based on a default
+	 * @throws Exception
+	 *             - if the template could not be created
+	 */
+	public static PresentationDocument newPresentationTemplateDocument() throws Exception {
+		PresentationDocument doc = (PresentationDocument) Document.loadTemplate(EMPTY_PRESENTATION_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.PRESENTATION_TEMPLATE);
+		doc.changeMode(OdfMediaType.PRESENTATION_TEMPLATE);
+		return doc;
+	}
+
+	/**
+	 * To avoid data duplication a new document is only created, if not already
+	 * opened. A document is cached by this constructor using the internalpath
+	 * as key.
+	 */
+	protected PresentationDocument(OdfPackage pkg, String internalPath, PresentationDocument.OdfMediaType odfMediaType) {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+		slideBuilder = new SlideBuilder(this);
+		notesBuilder = new NotesBuilder(this);
+	}
+
+	/**
+	 * Creates an PresentationDocument from the OpenDocument provided by a
+	 * resource Stream.
+	 * 
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by PresentationDocument, the InputStream is cached.
+	 * This usually takes more time compared to the other createInternalDocument
+	 * methods. An advantage of caching is that there are no problems
+	 * overwriting an input file.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF presentation document,
+	 * ClassCastException might be thrown.
+	 * </p>
+	 * 
+	 * @param inputStream
+	 *            - the InputStream of the ODF presentation document.
+	 * @return the presentation document created from the given InputStream
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static PresentationDocument loadDocument(InputStream inputStream) throws Exception {
+		return (PresentationDocument) Document.loadDocument(inputStream);
+	}
+
+	/**
+	 * Loads an PresentationDocument from the provided path.
+	 * 
+	 * <p>
+	 * PresentationDocument relies on the file being available for read access
+	 * over the whole lifecycle of PresentationDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF presentation document,
+	 * ClassCastException might be thrown.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @return the presentation document from the given path or NULL if the
+	 *         media type is not supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static PresentationDocument loadDocument(String documentPath) throws Exception {
+		return (PresentationDocument) Document.loadDocument(documentPath);
+	}
+
+	/**
+	 * Creates an PresentationDocument from the OpenDocument provided by a File.
+	 * 
+	 * <p>
+	 * PresentationDocument relies on the file being available for read access
+	 * over the whole lifecycle of PresentationDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF presentation document,
+	 * ClassCastException might be thrown.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF presentation document.
+	 * @return the presentation document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static PresentationDocument loadDocument(File file) throws Exception {
+		return (PresentationDocument) Document.loadDocument(file);
+	}
+
+	/**
+	 * Get the content root of a presentation document.
+	 * 
+	 * @return content root, representing the office:presentation tag
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	@Override
+	public OfficePresentationElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficePresentationElement.class);
+	}
+
+	/**
+	 * Switches this instance to the given type. This method can be used to e.g.
+	 * convert a document instance to a template and vice versa. Changes take
+	 * affect in the package when saving the document.
+	 * 
+	 * @param type
+	 *            the compatible ODF mediatype.
+	 */
+	public void changeMode(OdfMediaType type) {
+		setOdfMediaType(type.mMediaType);
+	}
+
+	private boolean hasCheckSlideName = false;
+
+	/**
+	 * Return the slide builder of this document. Every presentation document
+	 * has a slide builder.
+	 * 
+	 * @return the slide builder of this document.
+	 * @since 0.3.5
+	 */
+	public SlideBuilder getSlideBuilder() {
+		return slideBuilder;
+	}
+
+	/**
+	 * Return the notes builder of this document. Every presentation document
+	 * has a notes builder.
+	 * 
+	 * @return the notes builder of this document.
+	 * @since 0.3.5
+	 */
+	public NotesBuilder getNotesBuilder() {
+		return notesBuilder;
+	}
+
+	/**
+	 * Return the slide at a specified position in this presentation. Return
+	 * null if the index is out of range.
+	 * 
+	 * @param index
+	 *            the index of the slide to be returned
+	 * @return a draw slide at the specified position
+	 */
+	public Slide getSlideByIndex(int index) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		if ((index >= slideNodes.getLength()) || (index < 0)) {
+			return null;
+		}
+		DrawPageElement slideElement = (DrawPageElement) slideNodes.item(index);
+		return Slide.getInstance(slideElement);
+	}
+
+	/**
+	 * Get the number of the slides in this presentation.
+	 * 
+	 * @return the number of slides
+	 */
+	public int getSlideCount() {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return 0;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		return slideNodes.getLength();
+	}
+
+	/**
+	 * Return the slide which have a specified slide name in this presentation.
+	 * <p>
+	 * According to the odf specification "The draw:name attribute specifies a
+	 * name by which this element can be referenced. It is optional but if
+	 * present, must be unique within the document instance. If not present, an
+	 * application may generate a unique name."
+	 * <p>
+	 * If the name is null, then return null because all the slide must has its
+	 * own unique name.
+	 * 
+	 * @param name
+	 *            the specified slide name
+	 * @return the slide whose name equals to the specified name
+	 */
+	public Slide getSlideByName(String name) {
+		checkAllSlideName();
+		if (name == null) {
+			return null;
+		}
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideElement = (DrawPageElement) slideNodes.item(i);
+			Slide slide = Slide.getInstance(slideElement);
+			String slideName = slide.getSlideName();
+			if (slideName.equals(name)) {
+				return slide;
+			}
+		}
+		return null;
+	}
+
+	// when access slide related method, this function should be called
+	private void checkAllSlideName() {
+		// check if this function is called or not
+		if (hasCheckSlideName) {
+			return;
+		}
+		List<String> slideNameList = new ArrayList<String>();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideElement = (DrawPageElement) slideNodes.item(i);
+			String slideName = slideElement.getDrawNameAttribute();
+			if ((slideName == null) || slideNameList.contains(slideName)) {
+				slideName = "page" + (i + 1) + "-" + makeUniqueName();
+				slideElement.setDrawNameAttribute(slideName);
+			}
+			slideNameList.add(slideName);
+		}
+		hasCheckSlideName = true;
+	}
+
+	/**
+	 * Return a list iterator containing all slides in this presentation.
+	 * 
+	 * @return a list iterator containing all slides in this presentation
+	 */
+	public Iterator<Slide> getSlides() {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		ArrayList<Slide> slideList = new ArrayList<Slide>();
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideElement = (DrawPageElement) slideNodes.item(i);
+			slideList.add(Slide.getInstance(slideElement));
+		}
+		return slideList.iterator();
+	}
+
+	/**
+	 * Delete the slide at a specified position in this presentation.
+	 * 
+	 * @param index
+	 *            the index of the slide that need to be delete
+	 *            <p>
+	 *            Throw IndexOutOfBoundsException if the slide index is out of
+	 *            the presentation document slide count.
+	 * @return false if the operation was not successful
+	 */
+	public boolean deleteSlideByIndex(int index) {
+		boolean success = true;
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+			return success;
+		}
+		NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		if ((index >= slideNodes.getLength()) || (index < 0)) {
+			throw new IndexOutOfBoundsException(
+					"the specified Index is out of slide count when call deleteSlideByIndex method.");
+		}
+		DrawPageElement slideElement = (DrawPageElement) slideNodes.item(index);
+		// remove all the content of the current page
+		// 1. the reference of the path that contained in this slide is 1, then
+		// remove it
+		// success &= deleteLinkedRef(slideElement);
+		// 2.the reference of the style is 1, then remove it
+		// in order to save time, do not delete the style here
+		// success &= deleteStyleRef(slideElement);
+		// these two methods have been merged into 1 method
+		success &= removeElementLinkedResource(slideElement);
+		// remove the current page element
+		contentRoot.removeChild(slideElement);
+		adjustNotePageNumber(index);
+		return success;
+	}
+
+	/**
+	 * Delete all the slides with a specified name in this presentation.
+	 * 
+	 * @param name
+	 *            the name of the slide that need to be delete
+	 * @return false if the operation was not successful
+	 */
+	public boolean deleteSlideByName(String name) {
+		boolean success = true;
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			success = false;
+			return success;
+		}
+		Slide slide = getSlideByName(name);
+		DrawPageElement slideElement = slide.getOdfElement();
+		// remove all the content of the current page
+		// 1. the reference of the path that contained in this slide is 1, then
+		// remove its
+		success &= deleteLinkedRef(slideElement);
+		// 2.the reference of the style is 1, then remove it
+		// in order to save time, do not delete style here
+		success &= deleteStyleRef(slideElement);
+		// remove the current page element
+		contentRoot.removeChild(slideElement);
+		adjustNotePageNumber(0);
+		return success;
+	}
+
+	/**
+	 * Make a copy of the slide at a specified position to another position in
+	 * this presentation. The original slide which at the dest index and after
+	 * the dest index will move after.
+	 * <p>
+	 * 
+	 * @param source
+	 *            the source position of the slide need to be copied
+	 * @param dest
+	 *            the destination position of the slide need to be copied
+	 * @param newName
+	 *            the new name of the copied slide
+	 * @return the new slide at the destination position with the specified
+	 *         name, and it has the same content with the slide at the source
+	 *         position.
+	 *         <p>
+	 *         Throw IndexOutOfBoundsException if the slide index is out of the
+	 *         presentation document slide count. If copy the slide at the end
+	 *         of document, destIndex should set the same value with the slide
+	 *         count.
+	 */
+	public Slide copySlide(int source, int dest, String newName) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((source < 0) || (source >= slideCount) || (dest < 0) || (dest > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call copySlide method.");
+		}
+		DrawPageElement sourceSlideElement = (DrawPageElement) slideList.item(source);
+		DrawPageElement cloneSlideElement = (DrawPageElement) sourceSlideElement.cloneNode(true);
+		cloneSlideElement.setDrawNameAttribute(newName);
+		if (dest == slideCount) {
+			contentRoot.appendChild(cloneSlideElement);
+		} else {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(dest);
+			contentRoot.insertBefore(cloneSlideElement, refSlide);
+		}
+		adjustNotePageNumber(Math.min(source, dest));
+		// in case that the appended new slide have the same name with the
+		// original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+		return Slide.getInstance(cloneSlideElement);
+	}
+
+	/**
+	 * Move the slide at a specified position to the destination position.
+	 * 
+	 * @param source
+	 *            the current index of the slide that need to be moved
+	 * @param dest
+	 *            The index of the destination position before the move action
+	 *            <p>
+	 *            Throw IndexOutOfBoundsException if the slide index is out of
+	 *            the presentation document slide count.
+	 */
+	public void moveSlide(int source, int dest) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((source < 0) || (source >= slideCount) || (dest < 0) || (dest > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call moveSlide method.");
+		}
+		DrawPageElement sourceSlide = (DrawPageElement) slideList.item(source);
+		if (dest == slideCount) {
+			contentRoot.appendChild(sourceSlide);
+		} else {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(dest);
+			contentRoot.insertBefore(sourceSlide, refSlide);
+		}
+		adjustNotePageNumber(Math.min(source, dest));
+	}
+
+	private Node cloneForeignElement_(Node element, OdfFileDom dom, boolean deep) {
+		checkAllSlideName();
+		return cloneForeignElement(element, dom, deep);
+	}
+
+	/**
+	 * Append all the slides of the specified presentation document to the
+	 * current document.
+	 * 
+	 * @param srcDoc
+	 *            the specified <code>PresentationDocument</code> that need to
+	 *            be appended
+	 */
+	public void appendPresentation(PresentationDocument srcDoc) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		OdfFileDom contentDom = null;
+		OfficePresentationElement srcContentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+			contentDom = getContentDom();
+			srcContentRoot = srcDoc.getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideNum = slideList.getLength();
+		// clone the srcContentRoot, and make a modification on this clone node.
+		OfficePresentationElement srcCloneContentRoot = (OfficePresentationElement) srcContentRoot.cloneNode(true);
+		// copy all the referred xlink:href here
+		copyLinkedRefInBatch(srcCloneContentRoot, srcDoc);
+		// copy all the referred style definition here
+		copyForeignStyleRef(srcCloneContentRoot, srcDoc);
+		Node child = srcCloneContentRoot.getFirstChild();
+		while (child != null) {
+			Node cloneElement = cloneForeignElement_(child, contentDom, true);
+			contentRoot.appendChild(cloneElement);
+			child = child.getNextSibling();
+		}
+		adjustNotePageNumber(slideNum - 1);
+
+		// in case that the appended new slide have the same name with the
+		// original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+	}
+
+	/**
+	 * Make a copy of slide which locates at the specified position of the
+	 * source presentation document and insert it to the current presentation
+	 * document at the new position. The original slide which at the dest index
+	 * and after the dest index will move after.
+	 * 
+	 * @param destIndex
+	 *            the new position of the copied slide in the current document
+	 * @param srcDoc
+	 *            the source document of the copied slide
+	 * @param srcIndex
+	 *            the slide index of the source document that need to be copied
+	 * @return the new slide which has the same content with the source slide
+	 *         <p>
+	 *         Throw IndexOutOfBoundsException if the slide index is out of the
+	 *         presentation document slide count If insert the foreign slide at
+	 *         the end of document, destIndex should set the same value with the
+	 *         slide count of the current presentation document.
+	 */
+	public Slide copyForeignSlide(int destIndex, PresentationDocument srcDoc, int srcIndex) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		OdfFileDom contentDom = null;
+		try {
+			contentRoot = getContentRoot();
+			contentDom = getContentDom();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((destIndex < 0) || (destIndex > slideCount)) {
+			throw new IndexOutOfBoundsException(
+					"the specified Index is out of slide count when call copyForeignSlide method.");
+		}
+		Slide sourceSlide = srcDoc.getSlideByIndex(srcIndex);
+		DrawPageElement sourceSlideElement = sourceSlide.getOdfElement();
+		// clone the sourceSlideEle, and make a modification on this clone node.
+		DrawPageElement sourceCloneSlideElement = (DrawPageElement) sourceSlideElement.cloneNode(true);
+
+		// copy all the referred xlink:href here
+		copyLinkedRefInBatch(sourceCloneSlideElement, srcDoc);
+		// copy all the referred style definition here
+		copyForeignStyleRef(sourceCloneSlideElement, srcDoc);
+		// clone the sourceCloneSlideEle, and this cloned element should in the
+		// current dom tree
+		DrawPageElement cloneSlideElement = (DrawPageElement) cloneForeignElement_(sourceCloneSlideElement, contentDom,
+				true);
+		if (destIndex == slideCount) {
+			contentRoot.appendChild(cloneSlideElement);
+		} else {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(destIndex);
+			contentRoot.insertBefore(cloneSlideElement, refSlide);
+		}
+		adjustNotePageNumber(destIndex);
+		// in case that the appended new slide have the same name with the
+		// original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+		return Slide.getInstance(cloneSlideElement);
+	}
+
+	/**
+	 * New a slide at the specified position with the specified name, and use
+	 * the specified slide template. See <code>OdfDrawPage.SlideLayout</code>.
+	 * <p>
+	 * If index is invalid, such as larger than the current document slide
+	 * number or is negative, then append the new slide at the end of the
+	 * document.
+	 * <p>
+	 * The slide name can be null.
+	 * 
+	 * @param index
+	 *            the new slide position
+	 * @param name
+	 *            the new slide name
+	 * @param slideLayout
+	 *            the new slide template
+	 * @return the new slide which locate at the specified position with the
+	 *         specified name and apply the specified slide template. If
+	 *         slideLayout is null, then use the default slide template which is
+	 *         a blank slide.
+	 *         <p>
+	 *         Throw IndexOutOfBoundsException if index is out of the
+	 *         presentation document slide count.
+	 */
+	public Slide newSlide(int index, String name, Slide.SlideLayout slideLayout) {
+		checkAllSlideName();
+		OfficePresentationElement contentRoot = null;
+		try {
+			contentRoot = getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+			return null;
+		}
+		NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		int slideCount = slideList.getLength();
+		if ((index < 0) || (index > slideCount)) {
+			throw new IndexOutOfBoundsException("the specified Index is out of slide count when call newSlide method.");
+		}
+		// if insert page at the beginning of the document,
+		// get the next page style as the new page style
+		// else get the previous page style as the new page style
+		DrawPageElement refStyleSlide = null;
+		int refSlideIndex = 0;
+		if (index > 0) {
+			refSlideIndex = index - 1;
+		}
+		refStyleSlide = (DrawPageElement) slideList.item(refSlideIndex);
+		String masterPageStyleName = "Default";
+		String masterName = refStyleSlide.getDrawMasterPageNameAttribute();
+		if (masterName != null) {
+			masterPageStyleName = masterName;
+		}
+		DrawPageElement newSlideElement = contentRoot.newDrawPageElement(masterPageStyleName);
+		newSlideElement.setDrawNameAttribute(name);
+		String drawStyleName = refStyleSlide.getDrawStyleNameAttribute();
+		if (drawStyleName != null) {
+			newSlideElement.setDrawStyleNameAttribute(drawStyleName);
+		}
+		String pageLayoutName = refStyleSlide.getPresentationPresentationPageLayoutNameAttribute();
+		if (pageLayoutName != null) {
+			newSlideElement.setPresentationPresentationPageLayoutNameAttribute(pageLayoutName);
+		}
+		setSlideLayout(newSlideElement, slideLayout);
+		// insert notes page
+		NodeList noteNodes = refStyleSlide.getElementsByTagNameNS(OdfDocumentNamespace.PRESENTATION.getUri(), "notes");
+		if (noteNodes.getLength() > 0) {
+			PresentationNotesElement notePage = (PresentationNotesElement) noteNodes.item(0);
+			PresentationNotesElement cloneNotePage = (PresentationNotesElement) notePage.cloneNode(true);
+			newSlideElement.appendChild(cloneNotePage);
+		}
+		if (index < slideCount) {
+			DrawPageElement refSlide = (DrawPageElement) slideList.item(index);
+			contentRoot.insertBefore(newSlideElement, refSlide);
+		}
+		adjustNotePageNumber(index);
+		// in case that the appended new slide have the same name with the
+		// original slide
+		hasCheckSlideName = false;
+		checkAllSlideName();
+		return Slide.getInstance(newSlideElement);
+	}
+	
+	public Chart createChart(String title, DataSet dataset, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, dataset, rect);
+	}
+
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr, boolean firstRowAsLabel,
+			boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, document, cellRangeAddr, firstRowAsLabel, firstColumnAsLabel,
+				rowAsDataSeries, rect);
+	}
+
+	public Chart createChart(String title, String[] labels, String[] legends, double[][] data, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, labels, legends, data, rect);
+	}
+
+	public void deleteChartById(String chartId) {
+		getChartContainerImpl().deleteChartById(chartId);
+	}
+
+	public void deleteChartByTitle(String title) {
+		getChartContainerImpl().deleteChartByTitle(title);
+	}
+
+	public Chart getChartById(String chartId) {
+		return getChartContainerImpl().getChartById(chartId);
+	}
+
+	public List<Chart> getChartByTitle(String title) {
+		return getChartContainerImpl().getChartByTitle(title);
+	}
+
+	public int getChartCount() {
+		return getChartContainerImpl().getChartCount();
+	}
+	
+	// when insert a slide, the note page for this slide is also inserted.
+	// note page refer the slide index in order to show the corresponding slide
+	// notes view
+	// this function is used to adjust note page referred slide index since
+	// startIndex
+	// when the slide at startIndex has been delete or insert
+	private void adjustNotePageNumber(int startIndex) {
+		try {
+			OfficePresentationElement contentRoot = getContentRoot();
+			NodeList slideList = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+			for (int i = startIndex; i < getSlideCount(); i++) {
+				DrawPageElement page = (DrawPageElement) slideList.item(i);
+				NodeList noteNodes = page.getElementsByTagNameNS(OdfDocumentNamespace.PRESENTATION.getUri(), "notes");
+				if (noteNodes.getLength() > 0) {
+					PresentationNotesElement notePage = (PresentationNotesElement) noteNodes.item(0);
+					NodeList thumbnailList = notePage.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(),
+							"page-thumbnail");
+					if (thumbnailList.getLength() > 0) {
+						DrawPageThumbnailElement thumbnail = (DrawPageThumbnailElement) thumbnailList.item(0);
+						thumbnail.setDrawPageNumberAttribute(i + 1);
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(PresentationDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	// covered element
+	// <presentation:notes>, <draw:page-thumbnail>, <draw:frame>
+	// <style:presentation-page-layout>
+	private void setSlideLayout(DrawPageElement page, Slide.SlideLayout slideLayout) {
+		if (slideLayout == null) {
+			slideLayout = Slide.SlideLayout.BLANK;
+		}
+		slideLayout.apply(page);
+	}
+
+	public OdfElement getTableContainerElement() {
+		throw new UnsupportedOperationException("Presentation document is not supported to hold table directly.");
+	}
+	
+	private ChartContainerImpl getChartContainerImpl() {
+		if (chartContainerImpl == null) {
+			chartContainerImpl = new ChartContainerImpl(this);
+		}
+		return chartContainerImpl;
+	}
+	
+	private class ChartContainerImpl extends AbstractChartContainer {
+		PresentationDocument sdoc;
+
+		protected ChartContainerImpl(Document doc) {
+			super(doc);
+			sdoc = (PresentationDocument) doc;
+		}
+
+		protected DrawFrameElement getChartFrame() throws Exception {
+			OdfContentDom contentDom2 = sdoc.getContentDom();
+			DrawFrameElement drawFrame = contentDom2.newOdfElement(DrawFrameElement.class);
+			DrawPageElement lastPage = (DrawPageElement) contentDom2.getXPath().evaluate("//draw:page[last()]",
+					contentDom2, XPathConstants.NODE);
+			lastPage.appendChild(drawFrame);
+			drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+			return drawFrame;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/SpreadsheetDocument.java b/trunk/simple/src/main/java/org/odftoolkit/simple/SpreadsheetDocument.java
new file mode 100644
index 0000000..12b96b9
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/SpreadsheetDocument.java
@@ -0,0 +1,666 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.awt.Rectangle;
+import java.io.File;
+import java.io.InputStream;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.chart.AbstractChartContainer;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.chart.ChartContainer;
+import org.odftoolkit.simple.chart.DataSet;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.TableContainer;
+import org.w3c.dom.Node;
+
+/**
+ * This class represents an empty ODF spreadsheet document.
+ * 
+ */
+public class SpreadsheetDocument extends Document implements ChartContainer {
+
+	private static final String EMPTY_SPREADSHEET_DOCUMENT_PATH = "/OdfSpreadsheetDocument.ods";
+	static final Resource EMPTY_SPREADSHEET_DOCUMENT_RESOURCE = new Resource(EMPTY_SPREADSHEET_DOCUMENT_PATH);
+	private ChartContainerImpl chartContainerImpl;
+	/**
+	 * This enum contains all possible media types of SpreadsheetDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		SPREADSHEET(Document.OdfMediaType.SPREADSHEET), SPREADSHEET_TEMPLATE(Document.OdfMediaType.SPREADSHEET_TEMPLATE);
+		private final Document.OdfMediaType mMediaType;
+
+		OdfMediaType(Document.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 * 
+		 * @param mediaType
+		 *            string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and
+		 *         the suffix
+		 */
+		public static Document.OdfMediaType getOdfMediaType(String mediaType) {
+			return Document.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty spreadsheet document.
+	 * 
+	 * @return ODF spreadsheet document based on a default template*
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static SpreadsheetDocument newSpreadsheetDocument() throws Exception {
+		return (SpreadsheetDocument) Document.loadTemplate(EMPTY_SPREADSHEET_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.SPREADSHEET);
+	}
+
+	/**
+	 * Creates an empty spreadsheet template.
+	 * 
+	 * @return ODF spreadsheet template based on a default
+	 * @throws java.lang.Exception
+	 *             - if the template could not be created
+	 */
+	public static SpreadsheetDocument newSpreadsheetTemplateDocument() throws Exception {
+		SpreadsheetDocument doc = (SpreadsheetDocument) Document.loadTemplate(EMPTY_SPREADSHEET_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.SPREADSHEET_TEMPLATE);
+		doc.changeMode(OdfMediaType.SPREADSHEET_TEMPLATE);
+		return doc;
+	}
+
+	/**
+	 * To avoid data duplication a new document is only created, if not already
+	 * opened. A document is cached by this constructor using the internalpath
+	 * as key.
+	 */
+	protected SpreadsheetDocument(OdfPackage pkg, String internalPath, SpreadsheetDocument.OdfMediaType odfMediaType) {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Creates an SpreadsheetDocument from the OpenDocument provided by a
+	 * resource Stream.
+	 * 
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by SpreadsheetDocument, the InputStream is cached.
+	 * This usually takes more time compared to the other createInternalDocument
+	 * methods. An advantage of caching is that there are no problems
+	 * overwriting an input file.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF spreadsheet document,
+	 * ClassCastException might be thrown.
+	 * </p>
+	 * 
+	 * @param inputStream
+	 *            - the InputStream of the ODF spreadsheet document.
+	 * @return the spreadsheet document created from the given InputStream
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static SpreadsheetDocument loadDocument(InputStream inputStream) throws Exception {
+		return (SpreadsheetDocument) Document.loadDocument(inputStream);
+	}
+
+	/**
+	 * Loads an SpreadsheetDocument from the provided path.
+	 * 
+	 * <p>
+	 * SpreadsheetDocument relies on the file being available for read access
+	 * over the whole lifecycle of SpreadsheetDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF spreadsheet document,
+	 * ClassCastException might be thrown.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @return the spreadsheet document from the given path or NULL if the media
+	 *         type is not supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static SpreadsheetDocument loadDocument(String documentPath) throws Exception {
+		return (SpreadsheetDocument) Document.loadDocument(documentPath);
+	}
+
+	/**
+	 * Creates an SpreadsheetDocument from the OpenDocument provided by a File.
+	 * 
+	 * <p>
+	 * SpreadsheetDocument relies on the file being available for read access
+	 * over the whole lifecycle of SpreadsheetDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF spreadsheet document,
+	 * ClassCastException might be thrown.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF spreadsheet document.
+	 * @return the spreadsheet document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static SpreadsheetDocument loadDocument(File file) throws Exception {
+		return (SpreadsheetDocument) Document.loadDocument(file);
+	}
+
+	/**
+	 * Get the content root of a spreadsheet document.
+	 * 
+	 * @return content root, representing the office:spreadsheet tag
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeSpreadsheetElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeSpreadsheetElement.class);
+	}
+
+	/**
+	 * Changes the document to the given mediatype. This method can only be used
+	 * to convert a document to a related mediatype, e.g. template.
+	 * 
+	 * @param mediaType
+	 *            the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+
+	/**
+	 * Retrieves sheet by index.
+	 * 
+	 * @param index
+	 *            the index of the retrieved sheet, which starts from 0. If the
+	 *            index value is out of range (index >= sheet count or index <
+	 *            0), this method would return <code>null</code>.
+	 * @since 0.6
+	 */
+	public Table getSheetByIndex(int index) {
+		if (index < 0) {
+			return null;
+		}
+		int count = 0;
+		try {
+			OfficeSpreadsheetElement spreadsheetElement = getContentRoot();
+			Node child = spreadsheetElement.getFirstChild();
+			while ((child != null) && (count <= index)) {
+				if (child instanceof TableTableElement) {
+					if (count == index) {
+						return getTableBuilder().getTableInstance((TableTableElement) child);
+					} else {
+						count++;
+					}
+				}
+				child = child.getNextSibling();
+			}
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+	
+	/**
+	 * Retrieves sheet by name.
+	 * 
+	 * @param name
+	 *            the name of the retrieved sheet.
+	 * @since 0.6
+	 */
+	public Table getSheetByName(String name) {
+		return getTableByName(name);
+	}
+
+	
+	/**
+	 * Adds a new blank sheet with the specified <code>name</code> to this
+	 * document.
+	 * 
+	 * @param name
+	 *            the name of the new sheet.
+	 * @return added sheet.
+	 * @since 0.6
+	 */
+	public Table appendSheet(String name) {
+		Table newTable = addTable();
+		newTable.setTableName(name);
+		return newTable;
+	}
+
+	/**
+	 * Adds a new sheet with data from existing table.
+	 * <p>
+	 * NOTE: This method copies data from existing table, including linked
+	 * resources and styles, if the source table is not in the target document.
+	 * If these data has dependencies to other data of the source document, the
+	 * data dependencies will not be copied. For example, document A has two
+	 * sheets, "Sheet1" and "Sheet2". In "Sheet2", there is a cell with formula,
+	 * "=sum(Sheet1.A1:Sheet1.A10)". After copy the data of "Sheet2" to the new
+	 * sheet in document B, the result of this formula would be different or
+	 * even invalid in document B.
+	 * 
+	 * @param refTable
+	 *            the reference table, which is the data source of the new
+	 *            sheet.
+	 * @param name
+	 *            the name of the new sheet.
+	 * @return added sheet.
+	 * @since 0.6
+	 */
+	public Table appendSheet(Table refTable, String name) {
+		TableTableElement refTableElement = refTable.getOdfElement();
+		try {
+			OdfContentDom contentDom = getContentDom();
+			TableTableElement newTableEle = (TableTableElement) (refTableElement.cloneNode(true));
+			// not in a same document
+			if (refTableElement.getOwnerDocument() != contentDom) {
+				Document ownerDocument = refTable.getOwnerDocument();
+				copyLinkedRefInBatch(newTableEle, ownerDocument);
+				copyForeignStyleRef(newTableEle, ownerDocument);
+				newTableEle = (TableTableElement) cloneForeignElement(newTableEle, contentDom, true);
+			}
+			updateNames(newTableEle);
+			updateXMLIds(newTableEle);
+			getTableContainerElement().appendChild(newTableEle);
+			Table tableInstance = getTableBuilder().getTableInstance(newTableEle);
+			tableInstance.setTableName(name);
+			return tableInstance;
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+	
+	/**
+	 * Inserts a new blank sheet before the reference index.
+	 * 
+	 * @param before
+	 *            the reference index, which starts from 0. If the index value
+	 *            is out of range (index >= sheet count or index < 0), this
+	 *            method would return <code>null</code>.
+	 * @return inserted sheet.
+	 * @since 0.6
+	 */
+	public Table insertSheet(int before) {
+		if (before < 0) {
+			return null;
+		}
+		int count = 0;
+		try {
+			OfficeSpreadsheetElement spreadsheetElement = getContentRoot();
+			Node child = spreadsheetElement.getFirstChild();
+			while ((child != null) && (count <= before)) {
+				if (child instanceof TableTableElement) {
+					if (count == before) {
+						Table table = getTableBuilder().newTable();
+						getContentRoot().insertBefore(table.getOdfElement(), child);
+						return table;
+					} else {
+						count++;
+					}
+				}
+				child = child.getNextSibling();
+			}
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+	
+	/**
+	 * Inserts a new sheet with data from existing table.
+	 * 
+	 * <p>
+	 * NOTE: This method copies data from existing table, including linked
+	 * resources and styles, if the source table is not in the target document.
+	 * If these data has dependencies to other data of the source document, the
+	 * data dependencies will not be copied. For example, document A has two
+	 * sheets, "Sheet1" and "Sheet2". In "Sheet2", there is a cell with formula,
+	 * "=sum(Sheet1.A1:Sheet1.A10)". After copy the data of "Sheet2" to the new
+	 * sheet in document B, the result of this formula would be different or
+	 * even invalid in document B.
+	 * 
+	 * @param refTable
+	 *            the reference table, which is the data source of the new
+	 *            sheet.
+	 * @param before
+	 *            the reference index, which starts from 0 and new sheet would
+	 *            be inserted before it. If the index value is out of range
+	 *            (index >= sheet count or index < 0), this method would return
+	 *            <code>null</code>.
+	 * @return inserted sheet.
+	 * @since 0.6
+	 */
+	public Table insertSheet(Table refTable, int before) {
+		if (before < 0) {
+			return null;
+		}
+		int count = 0;
+		try {
+			OfficeSpreadsheetElement spreadsheetElement = getContentRoot();
+			Node child = spreadsheetElement.getFirstChild();
+			while ((child != null) && (count <= before)) {
+				if (child instanceof TableTableElement) {
+					if (count == before) {
+						TableTableElement refTableElement = refTable.getOdfElement();
+						try {
+							OdfContentDom contentDom = getContentDom();
+							TableTableElement newTableEle = (TableTableElement) (refTableElement.cloneNode(true));
+							//foreign node not in a same document
+							if (refTableElement.getOwnerDocument() != contentDom) {
+								Document ownerDocument = refTable.getOwnerDocument();
+								copyLinkedRefInBatch(newTableEle, ownerDocument);
+								copyForeignStyleRef(newTableEle, ownerDocument);
+								newTableEle = (TableTableElement) cloneForeignElement(newTableEle, contentDom, true);
+							}
+							updateNames(newTableEle);
+							updateXMLIds(newTableEle);
+							newTableEle.setTableNameAttribute(getUniqueSheetName(this));
+							getContentRoot().insertBefore(newTableEle, child);
+							return getTableBuilder().getTableInstance(newTableEle);
+						} catch (Exception e) {
+							Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+						}
+					} else {
+						count++;
+					}
+				}
+				child = child.getNextSibling();
+			}
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+
+	/**
+	 * Removes the sheet in the specified <code>index</code>.
+	 * 
+	 * @param index
+	 *            the index of the removed sheet, which starts from 0. If the
+	 *            index value is out of range (index >= sheet count or index <
+	 *            0), this method would do nothing.
+	 * @since 0.6
+	 */
+	public void removeSheet(int index) {
+		if (index < 0) {
+			return;
+		}
+		int count = 0;
+		try {
+			OfficeSpreadsheetElement spreadsheetElement = getContentRoot();
+			Node child = spreadsheetElement.getFirstChild();
+			while ((child != null) && (count <= index)) {
+				if (child instanceof TableTableElement) {
+					if (count == index) {
+						spreadsheetElement.removeChild(child);
+						return;
+					} else {
+						count++;
+					}
+				}
+				child = child.getNextSibling();
+			}
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	/**
+	 * Returns the sheet count of this document.
+	 * 
+	 * @return the sheet count of this document.
+	 * @since 0.6
+	 */
+	public int getSheetCount() {
+		int count = 0;
+		try {
+			OfficeSpreadsheetElement spreadsheetElement = getContentRoot();
+			Node child = spreadsheetElement.getFirstChild();
+			while (child != null) {
+				if (child instanceof TableTableElement) {
+					count++;
+				}
+				child = child.getNextSibling();
+			}
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return count;
+	}
+	
+	public OdfElement getTableContainerElement() {
+		return getTableContainerImpl().getTableContainerElement();
+	}
+	
+	/**
+	 * Creates a new Chart for this spreadsheet document.
+	 * 
+	 * @param title
+	 *            chart title.
+	 * @param dataset
+	 *            chart data set.
+	 * @param rect
+	 *            chart rectangle.
+	 * @return the created chart.
+	 * 
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, DataSet dataset, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, dataset, rect);
+	}
+	
+	/**
+	 * Creates a new Chart for this spreadsheet document.
+	 * 
+	 * @param title
+	 *            chart title.
+	 * @param document
+	 *            the data source spreadsheet document.
+	 * @param cellRangeAddr
+	 *            the cell range address list which is used as chart data set.
+	 * @param firstRowAsLabel
+	 *            whether uses first row as label.
+	 * @param firstColumnAsLabel
+	 *            whether uses first column as label.
+	 * @param rowAsDataSeries
+	 *            whether uses data as series.
+	 * @param rect
+	 *            chart rectangle.
+	 * @return the created chart.
+	 * 
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr, boolean firstRowAsLabel,
+			boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, document, cellRangeAddr, firstRowAsLabel, firstColumnAsLabel,
+				rowAsDataSeries, rect);
+	}
+	
+	/**
+	 * Creates a new Chart for this spreadsheet document.
+	 * 
+	 * @param title
+	 *            chart rectangle.
+	 * @param labels
+	 *            label strings
+	 * @param legends
+	 *            legend strings
+	 * @param data
+	 *            chart data set.
+	 * @param rect
+	 *            chart rectangle.
+	 * @return the created chart.
+	 * 
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, String[] labels, String[] legends, double[][] data, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, labels, legends, data, rect);
+	}
+	
+	/**
+	 * Creates a new Chart for this spreadsheet document.
+	 * 
+	 * @param title
+	 *            chart rectangle.
+	 * @param document
+	 *            the data source spreadsheet document.
+	 * @param cellRangeAddr
+	 *            the cell range list to be used as chart data.
+	 * @param firstRowAsLabel
+	 *            whether use first row as label.
+	 * @param firstColumnAsLabel
+	 *            whether use first column as label.
+	 * @param rowAsDataSeries
+	 *            whether use row as data series.
+	 * @param rect
+	 *            chart rectangle.
+	 * @param cell
+	 *            the position cell where the new chart is inserted.
+	 * @return the created chart.
+	 * 
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr, boolean firstRowAsLabel,
+			boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect, Cell cell) {
+		return getChartContainerImpl().createChart(title, document, cellRangeAddr, firstRowAsLabel, firstColumnAsLabel,
+				rowAsDataSeries, rect, cell);
+	}
+	
+	public void deleteChartById(String chartId) {
+		getChartContainerImpl().deleteChartById(chartId);
+	}
+
+	public void deleteChartByTitle(String title) {
+		getChartContainerImpl().deleteChartByTitle(title);
+	}
+
+	public Chart getChartById(String chartId) {
+		return getChartContainerImpl().getChartById(chartId);
+	}
+
+	public List<Chart> getChartByTitle(String title) {
+		return getChartContainerImpl().getChartByTitle(title);
+	}
+
+	public int getChartCount() {
+		return getChartContainerImpl().getChartCount();
+	}
+	
+	private static String getUniqueSheetName(TableContainer container) {
+		List<Table> tableList = container.getTableList();
+		boolean notUnique = true;
+		String tablename = "Sheet" + (tableList.size() + 1);
+		while (notUnique) {
+			notUnique = false;
+			for (int i = 0; i < tableList.size(); i++) {
+				if (tableList.get(i).getTableName() != null) {
+					if (tableList.get(i).getTableName().equalsIgnoreCase(tablename)) {
+						notUnique = true;
+						break;
+					}
+				}
+			}
+			if (notUnique) {
+				tablename = tablename + Math.round(Math.random() * 10);
+			}
+		}
+		return tablename;
+	}
+	
+	private ChartContainerImpl getChartContainerImpl() {
+		if (chartContainerImpl == null) {
+			chartContainerImpl = new ChartContainerImpl(this);
+		}
+		return chartContainerImpl;
+	}
+	
+	private class ChartContainerImpl extends AbstractChartContainer {
+		SpreadsheetDocument sdoc;
+		DrawFrameElement drawFrame;
+		protected ChartContainerImpl(Document doc) {
+			super(doc);
+			sdoc = (SpreadsheetDocument) doc;
+		}
+
+		protected DrawFrameElement getChartFrame() throws Exception {
+			OdfContentDom contentDom2 = sdoc.getContentDom();
+			DrawFrameElement drawFrame = contentDom2.newOdfElement(DrawFrameElement.class);
+			TableTableCellElement lastCell = (TableTableCellElement) contentDom2.getXPath().evaluate(
+					"//table:table-cell[last()]", contentDom2, XPathConstants.NODE);
+			lastCell.appendChild(drawFrame);
+			drawFrame.removeAttribute("text:anchor-type");
+			this.drawFrame = drawFrame;
+			return drawFrame;
+		}
+		
+		private Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr, boolean firstRowAsLabel,
+				boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect, Cell cell) {
+			Chart chart = getChartContainerImpl().createChart(title, document, cellRangeAddr, firstRowAsLabel, firstColumnAsLabel,
+					rowAsDataSeries, rect);
+			cell.getOdfElement().appendChild(this.drawFrame);
+			return chart;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/TextDocument.java b/trunk/simple/src/main/java/org/odftoolkit/simple/TextDocument.java
new file mode 100644
index 0000000..801f210
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/TextDocument.java
@@ -0,0 +1,1618 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.awt.Rectangle;
+import java.io.File;
+import java.io.InputStream;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentStylesElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMasterStylesElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleColumnsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleSectionPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexBodyElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryLinkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexEntryTabStopElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexSourceStylesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextIndexTitleTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSequenceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentEntryTemplateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentSourceElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkStartElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.MediaType;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.chart.AbstractChartContainer;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.chart.ChartContainer;
+import org.odftoolkit.simple.chart.DataSet;
+import org.odftoolkit.simple.common.field.AbstractVariableContainer;
+import org.odftoolkit.simple.common.field.VariableContainer;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+import org.odftoolkit.simple.draw.Control;
+import org.odftoolkit.simple.draw.ControlContainer;
+import org.odftoolkit.simple.form.AbstractFormContainer;
+import org.odftoolkit.simple.form.Form;
+import org.odftoolkit.simple.form.FormContainer;
+import org.odftoolkit.simple.style.MasterPage;
+import org.odftoolkit.simple.style.TOCStyle;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.AbstractParagraphContainer;
+import org.odftoolkit.simple.text.Footer;
+import org.odftoolkit.simple.text.Header;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.ParagraphContainer;
+import org.odftoolkit.simple.text.Section;
+import org.odftoolkit.simple.text.list.AbstractListContainer;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * This class represents an empty ODF text document.
+ * 
+ */
+public class TextDocument extends Document implements ListContainer,
+		ParagraphContainer, VariableContainer, ChartContainer, FormContainer,
+		ControlContainer {
+
+	private static final String EMPTY_TEXT_DOCUMENT_PATH = "/OdfTextDocument.odt";
+	static final Resource EMPTY_TEXT_DOCUMENT_RESOURCE = new Resource(EMPTY_TEXT_DOCUMENT_PATH);
+
+	private ListContainerImpl listContainerImpl;
+	private ParagraphContainerImpl paragraphContainerImpl;
+	private VariableContainerImpl variableContainerImpl;
+	private ChartContainerImpl chartContainerImpl;
+	private FormContainerImpl formContainerImpl = null;
+	
+	private Header firstPageHeader;
+	private Header standardHeader;
+
+	private Footer firstPageFooter;
+	private Footer standardFooter;
+
+	/**
+	 * This enum contains all possible media types of SpreadsheetDocument
+	 * documents.
+	 */
+	public enum OdfMediaType implements MediaType {
+
+		TEXT(Document.OdfMediaType.TEXT), TEXT_TEMPLATE(Document.OdfMediaType.TEXT_TEMPLATE), TEXT_MASTER(
+				Document.OdfMediaType.TEXT_MASTER), TEXT_WEB(Document.OdfMediaType.TEXT_WEB);
+		private final Document.OdfMediaType mMediaType;
+
+		OdfMediaType(Document.OdfMediaType mediaType) {
+			this.mMediaType = mediaType;
+		}
+
+		/**
+		 * @return the mediatype of this document
+		 */
+		public String getMediaTypeString() {
+			return mMediaType.getMediaTypeString();
+		}
+
+		/**
+		 * @return the ODF filesuffix of this document
+		 */
+		public String getSuffix() {
+			return mMediaType.getSuffix();
+		}
+
+		/**
+		 * 
+		 * @param mediaType
+		 *            string defining an ODF document
+		 * @return the according OdfMediatype encapuslating the given string and
+		 *         the suffix
+		 */
+		public static Document.OdfMediaType getOdfMediaType(String mediaType) {
+			return Document.OdfMediaType.getOdfMediaType(mediaType);
+		}
+	}
+
+	/**
+	 * Creates an empty text document.
+	 * 
+	 * @return ODF text document based on a default template
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static TextDocument newTextDocument() throws Exception {
+		return (TextDocument) Document.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, Document.OdfMediaType.TEXT);
+	}
+
+	/**
+	 * Creates an empty text document.
+	 * 
+	 * @return ODF text document based on a default template
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static TextDocument newTextDocument(TextDocument.OdfMediaType mimeType) throws Exception {
+		return (TextDocument) Document.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, Document.OdfMediaType.TEXT);
+	}
+
+	/**
+	 * Creates an empty text template.
+	 * 
+	 * @return ODF text template based on a default
+	 * @throws java.lang.Exception
+	 *             - if the template could not be created
+	 */
+	public static TextDocument newTextTemplateDocument() throws Exception {
+		return (TextDocument) Document.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE, Document.OdfMediaType.TEXT_TEMPLATE);
+	}
+
+	/**
+	 * Creates an empty text master document.
+	 * 
+	 * @return ODF text master based on a default
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static TextDocument newTextMasterDocument() throws Exception {
+		TextDocument doc = (TextDocument) Document.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.TEXT_MASTER);
+		doc.changeMode(OdfMediaType.TEXT_MASTER);
+		return doc;
+	}
+
+	/**
+	 * Creates an empty text web.
+	 * 
+	 * @return ODF text web based on a default
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created
+	 */
+	public static TextDocument newTextWebDocument() throws Exception {
+		TextDocument doc = (TextDocument) Document.loadTemplate(EMPTY_TEXT_DOCUMENT_RESOURCE,
+				Document.OdfMediaType.TEXT_WEB);
+		doc.changeMode(OdfMediaType.TEXT_WEB);
+		return doc;
+	}
+
+	/**
+	 * Creates an TextDocument from the OpenDocument provided by a resource
+	 * Stream.
+	 * 
+	 * <p>
+	 * Since an InputStream does not provide the arbitrary (non sequentiell)
+	 * read access needed by TextDocument, the InputStream is cached. This
+	 * usually takes more time compared to the other createInternalDocument
+	 * methods. An advantage of caching is that there are no problems
+	 * overwriting an input file.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF text document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param inputStream
+	 *            - the InputStream of the ODF text document.
+	 * @return the text document created from the given InputStream
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static TextDocument loadDocument(InputStream inputStream) throws Exception {
+		return (TextDocument) Document.loadDocument(inputStream);
+	}
+
+	/**
+	 * Loads an TextDocument from the provided path.
+	 * 
+	 * <p>
+	 * TextDocument relies on the file being available for read access over the
+	 * whole lifecycle of TextDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF text document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            - the path from where the document can be loaded
+	 * @return the text document from the given path or NULL if the media type
+	 *         is not supported by SIMPLE.
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static TextDocument loadDocument(String documentPath) throws Exception {
+		return (TextDocument) Document.loadDocument(documentPath);
+	}
+
+	/**
+	 * Creates an TextDocument from the OpenDocument provided by a File.
+	 * 
+	 * <p>
+	 * TextDocument relies on the file being available for read access over the
+	 * whole lifecycle of TextDocument.
+	 * </p>
+	 * 
+	 * <p>
+	 * If the resource stream is not a ODF text document, ClassCastException
+	 * might be thrown.
+	 * </p>
+	 * 
+	 * @param file
+	 *            - a file representing the ODF text document.
+	 * @return the text document created from the given File
+	 * @throws java.lang.Exception
+	 *             - if the document could not be created.
+	 */
+	public static TextDocument loadDocument(File file) throws Exception {
+		return (TextDocument) Document.loadDocument(file);
+	}
+
+	/**
+	 * To avoid data duplication a new document is only created, if not already
+	 * opened. A document is cached by this constructor using the internalpath
+	 * as key.
+	 */
+	protected TextDocument(OdfPackage pkg, String internalPath, TextDocument.OdfMediaType odfMediaType) {
+		super(pkg, internalPath, odfMediaType.mMediaType);
+	}
+
+	/**
+	 * Get the content root of a text document. Start here to get or create new
+	 * elements of a text document like paragraphs, headings, tables or lists.
+	 * 
+	 * @return content root, representing the office:text tag
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 */
+	@Override
+	public OfficeTextElement getContentRoot() throws Exception {
+		return super.getContentRoot(OfficeTextElement.class);
+	}
+
+	/**
+	 * Creates a new paragraph and append text
+	 * 
+	 * @param text
+	 * @return the new paragraph
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 * @deprecated As of Simple version 0.5, replaced by
+	 *             <code>addParagraph(String text)</code>
+	 * @see #addParagraph(String)
+	 */
+	public OdfTextParagraph newParagraph(String text) throws Exception {
+		OdfTextParagraph para = newParagraph();
+		para.addContent(text);
+		return para;
+	}
+
+	/**
+	 * Creates a new paragraph
+	 * 
+	 * @return The new paragraph
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 * @deprecated As of Simple version 0.5, replaced by
+	 *             <code>Paragraph.newParagraph(ParagraphContainer)</code>
+	 * @see Paragraph#newParagraph(ParagraphContainer)
+	 * @see #addParagraph(String)
+	 */
+	public OdfTextParagraph newParagraph() throws Exception {
+		OfficeTextElement odfText = getContentRoot();
+		return (OdfTextParagraph) odfText.newTextPElement();
+	}
+
+	/**
+	 * Append text to the end of a text document. If there is no paragraph at
+	 * the end of a document, a new one will be created.
+	 * 
+	 * @param text
+	 *            initial text for the paragraph.
+	 * @return The paragraph at the end of the text document, where the text has
+	 *         been added to.
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 * @deprecated As of Simple version 0.5, replaced by
+	 *             <code>Paragraph.appendTextContent(String content)</code>
+	 * @see Paragraph#appendTextContent(String)
+	 * @see Paragraph#appendTextContentNotCollapsed(String)
+	 * @see #getParagraphByIndex(int, boolean)
+	 * @see #getParagraphByReverseIndex(int, boolean)
+	 */
+	public OdfTextParagraph addText(String text) throws Exception {
+		OfficeTextElement odfText = getContentRoot();
+		Node n = odfText.getLastChild();
+		OdfTextParagraph para;
+		if (OdfTextParagraph.class.isInstance(n)) {
+			para = (OdfTextParagraph) n;
+		} else {
+			para = newParagraph();
+		}
+		para.addContent(text);
+		return para;
+	}
+
+	/**
+	 * Changes the document to the given mediatype. This method can only be used
+	 * to convert a document to a related mediatype, e.g. template.
+	 * 
+	 * @param mediaType
+	 *            the related ODF mimetype
+	 */
+	public void changeMode(OdfMediaType mediaType) {
+		setOdfMediaType(mediaType.mMediaType);
+	}
+
+	/**
+	 * Copy a section and append it at the end of the text document, whether the
+	 * section is in this document or in a different document.
+	 * <p>
+	 * The IDs and names in this section would be changed to ensure unique.
+	 * <p>
+	 * If the section contains a linked resource, <code>isResourceCopied</code>
+	 * would specify whether the linked resource would be copied or not, when
+	 * the copy and append happens within a same document.
+	 * 
+	 * @param section
+	 *            - the section object
+	 * @param isResourceCopied
+	 *            - whether the linked resource is copied or not.
+	 */
+	public Section appendSection(Section section, boolean isResourceCopied) {
+		boolean isForeignNode = false;
+		try {
+			if (section.getOdfElement().getOwnerDocument() != getContentDom())
+				isForeignNode = true;
+			TextSectionElement oldSectionEle = section.getOdfElement();
+			TextSectionElement newSectionEle = (TextSectionElement) oldSectionEle.cloneNode(true);
+
+			if (isResourceCopied || isForeignNode)
+				copyLinkedRefInBatch(newSectionEle, section.getOwnerDocument());
+			if (isForeignNode)
+				copyForeignStyleRef(newSectionEle, section.getOwnerDocument());
+			if (isForeignNode) // not in a same document
+				newSectionEle = (TextSectionElement) cloneForeignElement(newSectionEle, getContentDom(), true);
+
+			updateNames(newSectionEle);
+			updateXMLIds(newSectionEle);
+			OfficeTextElement contentRoot = getContentRoot();
+			contentRoot.appendChild(newSectionEle);
+			return Section.getInstance(newSectionEle);
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+
+	/**
+	 * Create an empty section and append it at the end of the text document.
+	 * 
+	 * @param name
+	 *            - specify the section name
+	 * @return an instance of the section
+	 * @throws RuntimeException
+	 *             if content DOM could not be initialized
+	 */
+	public Section appendSection(String name) {
+		TextSectionElement newSectionEle = null;
+		try {
+			OdfContentDom contentDocument = getContentDom();
+			OdfOfficeAutomaticStyles styles = contentDocument
+					.getAutomaticStyles();
+			OdfStyle style = styles.newStyle(OdfStyleFamily.Section);
+			StyleSectionPropertiesElement sProperties = style
+					.newStyleSectionPropertiesElement();
+			sProperties.setTextDontBalanceTextColumnsAttribute(false);
+			sProperties.setStyleEditableAttribute(false);
+			StyleColumnsElement columnEle = sProperties
+					.newStyleColumnsElement(1);
+			columnEle.setFoColumnGapAttribute("0in");
+
+			newSectionEle = getContentRoot()
+					.newTextSectionElement("true", name);
+			newSectionEle.setStyleName(style.getStyleNameAttribute());
+			return Section.getInstance(newSectionEle);
+
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					null, e);
+			throw new RuntimeException(name + "Section appends failed.", e);
+		}
+	}
+
+	/**
+	 * Get the Standard Page header of this text document.
+	 * 
+	 * @return the Standard Page header of this text document.
+	 * @since 0.4.5
+	 */
+	public Header getHeader() {
+		return getHeader(false);
+	}
+
+	/**
+	 * Get the header of this text document.
+	 * 
+	 * @param isFirstPage
+	 *            if <code>isFirstPage</code> is true, return the First Page
+	 *            header, otherwise return Standard Page header.
+	 * 
+	 * @return the header of this text document.
+	 * @since 0.5
+	 */
+	public Header getHeader(boolean isFirstPage) {
+		Header tmpHeader = isFirstPage ? firstPageHeader : standardHeader;
+		if (tmpHeader == null) {
+			try {
+				StyleMasterPageElement masterPageElement = getMasterPage(isFirstPage);
+				StyleHeaderElement headerElement = OdfElement.findFirstChildNode(StyleHeaderElement.class,
+						masterPageElement);
+				if (headerElement == null) {
+					headerElement = masterPageElement.newStyleHeaderElement();
+				}
+				tmpHeader = new Header(headerElement);
+			} catch (Exception e) {
+				Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+			}
+			if (isFirstPage) {
+				firstPageHeader = tmpHeader;
+			} else {
+				standardHeader = tmpHeader;
+			}
+		}
+		return tmpHeader;
+	}
+
+	/**
+	 * Get the Standard Page footer of this text document.
+	 * 
+	 * @return the Standard Page footer of this text document.
+	 * @since 0.4.5
+	 */
+	public Footer getFooter() {
+		return getFooter(false);
+	}
+
+	/**
+	 * Get the footer of this text document.
+	 * 
+	 * @param isFirstPage
+	 *            if <code>isFirstPage</code> is true, return the First Page
+	 *            footer, otherwise return Standard Page footer.
+	 * 
+	 * @return the footer of this text document.
+	 * @since 0.5
+	 */
+	public Footer getFooter(boolean isFirstPage) {
+		Footer tmpFooter = isFirstPage ? firstPageFooter : standardFooter;
+		if (tmpFooter == null) {
+			try {
+				StyleMasterPageElement masterPageElement = getMasterPage(isFirstPage);
+				StyleFooterElement footerElement = OdfElement.findFirstChildNode(StyleFooterElement.class,
+						masterPageElement);
+				if (footerElement == null) {
+					footerElement = masterPageElement.newStyleFooterElement();
+				}
+				tmpFooter = new Footer(footerElement);
+			} catch (Exception e) {
+				Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+			}
+			if (isFirstPage) {
+				firstPageFooter = tmpFooter;
+			} else {
+				standardFooter = tmpFooter;
+			}
+		}
+		return tmpFooter;
+	}
+
+	public OdfElement getTableContainerElement() {
+		return getTableContainerImpl().getTableContainerElement();
+	}
+
+	public OdfElement getListContainerElement() {
+		return getListContainerImpl().getListContainerElement();
+	}
+
+	public List addList() {
+		return getListContainerImpl().addList();
+	}
+
+	public List addList(ListDecorator decorator) {
+		return getListContainerImpl().addList(decorator);
+	}
+
+	public void clearList() {
+		getListContainerImpl().clearList();
+	}
+
+	public Iterator<List> getListIterator() {
+		return getListContainerImpl().getListIterator();
+	}
+
+	public boolean removeList(List list) {
+		return getListContainerImpl().removeList(list);
+	}
+	
+	/**
+	 * Appends a new page break to this document.
+	 * 
+	 * @since 0.6.5
+	 */
+	public void addPageBreak() {
+		addPageOrColumnBreak(null, "page");
+	}
+	
+	/**
+	 * Appends a new page break to this document after the reference paragraph.
+	 * 
+	 * @param refParagraph
+	 *            the reference paragraph after where the page break inserted.
+	 * @since 0.6.5
+	 */
+	public void addPageBreak(Paragraph refParagraph) {
+		addPageOrColumnBreak(refParagraph, "page");
+	}
+	
+	/** 
+	 * Defines several columns to the page whose style is specified.
+	 * 
+	 * @param columnsNumber
+	 * 			the number of columns (are of width identical)
+	 * @param spacing
+	 * 			column spacing in cm (ex. 2.40 for 2,4 cm)
+	 * 
+	 * @since 0.6.6
+	 */
+	public void setPageColumns(int columnsNumber, double spacing) {
+		String vSpacingColumn = (new DecimalFormat("#0.###").format(spacing) + Unit.CENTIMETER.abbr()).replace(",", ".");
+		// Get back the name of the style Page wanted Layout
+		// (Example of the got back name : pm1 or Mpm1 for the standard style)
+		try {
+			String stylePageLayoutName = null;
+			int pageLayoutNameCount = 0;
+			NodeList list = getStylesDom().getElementsByTagName("office:master-styles");
+			if (list.getLength() > 0) {
+				OdfOfficeMasterStyles officeMasterStyles = (OdfOfficeMasterStyles) list.item(0);
+				// Get back the StylePageLayoutName
+				for (int i = 0; i < officeMasterStyles.getLength(); i++) {
+					StyleMasterPageElement syleMasterPage = (StyleMasterPageElement) officeMasterStyles.item(i);
+					if(syleMasterPage.getStyleNameAttribute().equals("Standard")){					
+						stylePageLayoutName = syleMasterPage.getStylePageLayoutNameAttribute();
+						break;
+					}
+				}
+				// Allows to know if StylePageLayoutName is unique
+				for (int i = 0; i < officeMasterStyles.getLength(); i++) {
+					StyleMasterPageElement syleMasterPage = (StyleMasterPageElement) officeMasterStyles.item(i);
+					if(syleMasterPage.getStylePageLayoutNameAttribute().equals(stylePageLayoutName)){					
+						pageLayoutNameCount++;
+					}
+				}
+			}
+			
+			OdfOfficeAutomaticStyles autoStyles = getStylesDom().getAutomaticStyles();
+			int autoStylesCount = autoStyles.getLength();			
+			OdfStylePageLayout pageLayout = autoStyles.getPageLayout(stylePageLayoutName);
+			if(pageLayout != null) {
+				// Clone the OdfStylePageLayout if another master style possesses the same name before modifying its properties
+				if(pageLayoutNameCount > 1){
+					Node pageLayoutNew = pageLayout.cloneNode(true);					
+					// Rename the style of the clone before modifying its properties
+					String oldPageLayoutName = pageLayout.getStyleNameAttribute();
+					pageLayout.setStyleNameAttribute("Mpm" + (autoStylesCount+1));
+					// Allocate the new name of the style to the master style (the cloned style)
+					if (list.getLength() > 0) {
+						OdfOfficeMasterStyles masterpage = (OdfOfficeMasterStyles) list.item(0);
+						for (int i = 0; i < masterpage.getLength(); i++) {
+							StyleMasterPageElement vSyleMasterPage = (StyleMasterPageElement) masterpage.item(i);
+							if(vSyleMasterPage.getStyleNameAttribute().equals("Standard")){
+								if(vSyleMasterPage.getStylePageLayoutNameAttribute().equals(oldPageLayoutName)){					
+									vSyleMasterPage.setStylePageLayoutNameAttribute(pageLayout.getStyleNameAttribute());
+								}
+							}
+						}
+					}
+					autoStyles.appendChild(pageLayoutNew);
+				}
+				NodeList vListStlePageLprop = pageLayout.getElementsByTagName("style:page-layout-properties");
+				StylePageLayoutPropertiesElement vStlePageLprop = (StylePageLayoutPropertiesElement) vListStlePageLprop.item(0);
+				StyleColumnsElement vStyleColumnsElement = vStlePageLprop.newStyleColumnsElement(columnsNumber);
+				vStyleColumnsElement.setFoColumnGapAttribute(vSpacingColumn);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+			throw new RuntimeException("Page column sets failed.", e);
+		}		
+	}
+	
+	/**
+	 * Appends a new column break to this document.
+	 * 
+	 * @since 0.6.6
+	 */
+	public void addColumnBreak() {
+		addPageOrColumnBreak(null, "column");
+	}
+	
+	/**
+	 * Appends a new column break to this document after the reference paragraph.
+	 * 
+	 * @param refParagraph
+	 *            the reference paragraph after where the column break inserted.
+	 * @since 0.6.6
+	 */
+	public void addColumnBreak(Paragraph refParagraph) {
+		addPageOrColumnBreak(refParagraph, "column");
+	}
+	
+	/** 
+	 * Appends a new column or page break to this document.
+	 * 
+	 * @param refParagraph
+	 * 			the reference paragraph after where the column break inserted.
+	 * @param breakAttribute
+	 * 			the attribute name (page or column)
+	 */
+	private void addPageOrColumnBreak(Paragraph refParagraph, String breakAttribute) {
+		TextPElement pEle = null;
+		try {
+			OdfContentDom contentDocument = getContentDom();
+			OdfOfficeAutomaticStyles styles = contentDocument.getAutomaticStyles();
+			OdfStyle style = styles.newStyle(OdfStyleFamily.Paragraph);
+			style.newStyleParagraphPropertiesElement().setFoBreakBeforeAttribute(breakAttribute);
+			if(refParagraph == null){
+				pEle = getContentRoot().newTextPElement();
+			} else {
+				OfficeTextElement contentRoot = getContentRoot();
+				pEle = contentRoot.newTextPElement();
+				OdfElement refEle = refParagraph.getOdfElement();
+				contentRoot.insertBefore(pEle, refEle.getNextSibling());
+			}
+			pEle.setStyleName(style.getStyleNameAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+			throw new RuntimeException(breakAttribute + "Break appends failed.", e);
+		}
+	}
+
+	/**
+	 * Appends a new page break to this document after the reference paragraph,
+	 * and the master page style will be applied to the new page.
+	 * 
+	 * @param refParagraph
+	 *            the reference paragraph after where the page break inserted.
+	 * @param master
+	 *            the master page style applied to the new page.
+	 * @since 0.8
+	 */
+
+	public void addPageBreak(Paragraph refParagraph, MasterPage master) {
+		TextPElement pEle = null;
+		try {
+			OdfContentDom contentDocument = getContentDom();
+			OdfOfficeAutomaticStyles styles = contentDocument
+					.getAutomaticStyles();
+			OdfStyle style = styles.newStyle(OdfStyleFamily.Paragraph);
+			style.setStyleMasterPageNameAttribute(master.getName());
+
+			if (refParagraph == null) {
+				pEle = getContentRoot().newTextPElement();
+			} else {
+				OfficeTextElement contentRoot = getContentRoot();
+				pEle = contentRoot.newTextPElement();
+				OdfElement refEle = refParagraph.getOdfElement();
+				contentRoot.insertBefore(pEle, refEle.getNextSibling());
+			}
+			pEle.setStyleName(style.getStyleNameAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					null, e);
+			throw new RuntimeException("PageBreak with mater page - "
+					+ master.getName() + " - appends failed.", e);
+		}
+	}
+
+	/**
+	 * Creates a new paragraph and append text.
+	 * 
+	 * @param text
+	 *            the text content of this paragraph
+	 * @return the new paragraph
+	 */
+	public Paragraph addParagraph(String text) {
+		Paragraph para = getParagraphContainerImpl().addParagraph(text);
+		return para;
+	}
+
+	/**
+	 * Remove paragraph from this document
+	 * 
+	 * @param para
+	 *            the instance of paragraph
+	 * @return true if the paragraph is removed successfully, false if errors
+	 *         happen.
+	 */
+	public boolean removeParagraph(Paragraph para) {
+		return getParagraphContainerImpl().removeParagraph(para);
+	}
+
+	public OdfElement getParagraphContainerElement() {
+		return getParagraphContainerImpl().getParagraphContainerElement();
+	}
+
+	public Paragraph getParagraphByIndex(int index, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByIndex(index, isEmptyParagraphSkipped);
+	}
+
+	public Paragraph getParagraphByReverseIndex(int reverseIndex, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByReverseIndex(reverseIndex, isEmptyParagraphSkipped);
+	}
+
+	public Iterator<Paragraph> getParagraphIterator() {
+		return getParagraphContainerImpl().getParagraphIterator();
+	}
+
+	public VariableField declareVariable(String name, VariableType type) {
+		return getVariableContainerImpl().declareVariable(name, type);
+	}
+
+	public VariableField getVariableFieldByName(String name) {
+		return getVariableContainerImpl().getVariableFieldByName(name);
+	}
+
+	public OdfElement getVariableContainerElement() {
+		return getVariableContainerImpl().getVariableContainerElement();
+	}
+	
+	public Chart createChart(String title, DataSet dataset, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, dataset, rect);
+	}
+
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr, boolean firstRowAsLabel,
+			boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, document, cellRangeAddr, firstRowAsLabel, firstColumnAsLabel,
+				rowAsDataSeries, rect);
+	}
+
+	public Chart createChart(String title, String[] labels, String[] legends, double[][] data, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, labels, legends, data, rect);
+	}
+
+	public void deleteChartById(String chartId) {
+		getChartContainerImpl().deleteChartById(chartId);
+	}
+
+	public void deleteChartByTitle(String title) {
+		getChartContainerImpl().deleteChartByTitle(title);
+	}
+
+	public Chart getChartById(String chartId) {
+		return getChartContainerImpl().getChartById(chartId);
+	}
+
+	public java.util.List<Chart> getChartByTitle(String title) {
+		return getChartContainerImpl().getChartByTitle(title);
+	}
+
+	public int getChartCount() {
+		return getChartContainerImpl().getChartCount();
+	}
+	
+	private ListContainerImpl getListContainerImpl() {
+		if (listContainerImpl == null) {
+			listContainerImpl = new ListContainerImpl();
+		}
+		return listContainerImpl;
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+
+		public OdfElement getListContainerElement() {
+			OdfElement containerElement = null;
+			try {
+				containerElement = getContentRoot();
+			} catch (Exception e) {
+				Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+			}
+			return containerElement;
+		}
+	}
+
+	private StyleMasterPageElement getMasterPage(boolean pFirstPage) throws Exception {
+		String pageStyleName = pFirstPage ? "First_20_Page" : "Standard";
+		OfficeDocumentStylesElement rootElement = getStylesDom().getRootElement();
+		OfficeMasterStylesElement masterStyles = OdfElement.findFirstChildNode(OfficeMasterStylesElement.class,
+				rootElement);
+		if (masterStyles == null) {
+			masterStyles = rootElement.newOfficeMasterStylesElement();
+		}
+		StyleMasterPageElement masterPageEle = null;
+		NodeList lastMasterPages = masterStyles.getElementsByTagNameNS(OdfDocumentNamespace.STYLE.getUri(),
+				"master-page");
+		if (lastMasterPages != null && lastMasterPages.getLength() > 0) {
+			for (int i = 0; i < lastMasterPages.getLength(); i++) {
+				StyleMasterPageElement masterPage = (StyleMasterPageElement) lastMasterPages.item(i);
+				String styleName = masterPage.getStyleNameAttribute();
+				if (pageStyleName.equals(styleName)) {
+					masterPageEle = masterPage;
+					break;
+				}
+			}
+		}
+		if (masterPageEle == null) {
+			OdfStylePageLayout layout = OdfElement.findFirstChildNode(OdfStylePageLayout.class, getStylesDom()
+					.getAutomaticStyles());
+			masterPageEle = masterStyles.newStyleMasterPageElement(pageStyleName, layout.getStyleNameAttribute());
+		}
+		return masterPageEle;
+	}
+
+	private class ParagraphContainerImpl extends AbstractParagraphContainer {
+		public OdfElement getParagraphContainerElement() {
+			OdfElement containerElement = null;
+			try {
+				containerElement = getContentRoot();
+			} catch (Exception e) {
+				Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+			}
+			return containerElement;
+		}
+	}
+
+	private ParagraphContainerImpl getParagraphContainerImpl() {
+		if (paragraphContainerImpl == null)
+			paragraphContainerImpl = new ParagraphContainerImpl();
+		return paragraphContainerImpl;
+	}
+
+	private class VariableContainerImpl extends AbstractVariableContainer {
+
+		public OdfElement getVariableContainerElement() {
+			try {
+				return getContentRoot();
+			} catch (Exception e) {
+				Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+				return null;
+			}
+		}
+	}
+
+	private VariableContainer getVariableContainerImpl() {
+		if (variableContainerImpl == null) {
+			variableContainerImpl = new VariableContainerImpl();
+		}
+		return variableContainerImpl;
+	}
+	
+	private ChartContainerImpl getChartContainerImpl() {
+		if (chartContainerImpl == null) {
+			chartContainerImpl = new ChartContainerImpl(this);
+		}
+		return chartContainerImpl;
+	}
+	
+	private class ChartContainerImpl extends AbstractChartContainer {
+		TextDocument sdoc;
+
+		protected ChartContainerImpl(Document doc) {
+			super(doc);
+			sdoc = (TextDocument) doc;
+		}
+
+		protected DrawFrameElement getChartFrame() throws Exception {
+			OdfContentDom contentDom2 = sdoc.getContentDom();
+			DrawFrameElement drawFrame = contentDom2.newOdfElement(DrawFrameElement.class);
+			TextPElement lastPara = sdoc.getContentRoot().newTextPElement();
+			lastPara.appendChild(drawFrame);
+			drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+			return drawFrame;
+		}
+	}
+
+	/**
+	 * Create a new Table Of Content to this document before the reference
+	 * paragraph. Because until you do a full layout of the document, taking
+	 * into account font metrics,line breaking algorithms, hyphenation, image
+	 * positioning, "orphan and widow" rules, etc., you don't know what content
+	 * is on which page. So all the page numbers in TOC are be set value "1".
+	 * Please update the page numbers from AOO Menus: Tools->Update->All Indexes
+	 * and Tables
+	 * 
+	 * @param refParagraph
+	 *            the reference paragraph where the TOC be inserted.
+	 * @param before
+	 *            true:insert TOC before the reference paragraph. false:insert
+	 *            TOC after the reference paragraph.
+	 * @since 0.8.6
+	 */
+	public TextTableOfContentElement createDefaultTOC(Paragraph refParagraph, boolean before) {
+		
+		TextTableOfContentElement textTableOfContent =null;
+		if(refParagraph==null){
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					"Failed to create Default TOC, The refParagraph where the TOC be inserted is null");
+			throw new RuntimeException("Failed to create Default TOC, The refParagraph where the TOC be inserted is null");
+		}
+		Node refparagraphNode = refParagraph.getOdfElement();
+		Node rootNode = refparagraphNode.getParentNode();		
+		try {
+			OdfContentDom content = getContentDom();
+			textTableOfContent = content
+					.newOdfElement(TextTableOfContentElement.class);
+			textTableOfContent.setTextNameAttribute("Table of Contents");
+			textTableOfContent.setTextProtectedAttribute(true);
+			TextTableOfContentSourceElement textTableOfContentSource = textTableOfContent
+					.newTextTableOfContentSourceElement();
+			textTableOfContentSource.setTextOutlineLevelAttribute(10);
+			textTableOfContentSource.setTextUseIndexMarksAttribute(true);
+			TextIndexTitleTemplateElement textIndexTitleTemplate = textTableOfContentSource
+					.newTextIndexTitleTemplateElement();
+			textIndexTitleTemplate
+					.setTextStyleNameAttribute("Contents_20_Heading");
+			textIndexTitleTemplate.setTextContent("Table of Contents");
+			for (int i = 1; i <= 10; i++) {
+				TextTableOfContentEntryTemplateElement textTableOfContentEntryTemplate = textTableOfContentSource
+						.newTextTableOfContentEntryTemplateElement(i,
+								"Contents_20_" + i);
+				TextIndexEntryLinkStartElement TextIndexEntryLinkStart = textTableOfContentEntryTemplate
+						.newTextIndexEntryLinkStartElement();
+				TextIndexEntryLinkStart
+						.setTextStyleNameAttribute("Index_20_Link");
+				textTableOfContentEntryTemplate
+						.newTextIndexEntryChapterElement();
+				textTableOfContentEntryTemplate.newTextIndexEntryTextElement();
+				TextIndexEntryTabStopElement TextIndexEntryTabStop = textTableOfContentEntryTemplate
+						.newTextIndexEntryTabStopElement("right");
+				TextIndexEntryTabStop.setStyleLeaderCharAttribute(".");
+				textTableOfContentEntryTemplate
+						.newTextIndexEntryPageNumberElement();
+				textTableOfContentEntryTemplate
+						.newTextIndexEntryLinkEndElement();
+			}
+			TextIndexBodyElement textIndexBody = textTableOfContent
+					.newTextIndexBodyElement();
+			TextIndexTitleElement TextIndexTitle = textIndexBody
+					.newTextIndexTitleElement("Table of Contents_Head");
+			TextPElement texp = TextIndexTitle.newTextPElement();
+			texp.setTextStyleNameAttribute("Contents_20_Heading");
+			texp.setTextContent("Table of Contents");
+			Iterator<Paragraph> paragraphIterator = getParagraphIterator();
+			while (paragraphIterator.hasNext()) {
+				Paragraph paragraph = paragraphIterator.next();
+				String text = paragraph.getTextContent();
+				String stylename = paragraph.getStyleName();
+				// Outline support
+				if (paragraph.isHeading()) {
+					int headingLevel = paragraph.getHeadingLevel();
+					if (stylename.length() <= 0) {
+						stylename = "Contents_20_" + headingLevel;
+					}
+					ceateIndexBodyEntry(textIndexBody, stylename, text);
+				}
+				// end of Outline support
+				// Index Makes support
+				TextParagraphElementBase podf = paragraph.getOdfElement();
+				NodeList cns = podf.getChildNodes();
+				for (int i = 0; i < cns.getLength(); i++) {
+					Node node = cns.item(i);
+					if (node instanceof TextTocMarkElement) {
+						TextTocMarkElement textTocMarkElement = (TextTocMarkElement) node;
+						text = textTocMarkElement.getTextStringValueAttribute();
+						int headingLevel = textTocMarkElement
+								.getTextOutlineLevelAttribute();
+						stylename = "Contents_20_" + headingLevel;
+						ceateIndexBodyEntry(textIndexBody, stylename, text);
+					}
+					if (node instanceof TextTocMarkStartElement) {
+						TextTocMarkStartElement textTocMarkStartElement = (TextTocMarkStartElement) node;
+						Node tmp = node.getNextSibling();
+						while (!(tmp instanceof Text)) {
+							tmp = node.getNextSibling();
+						}
+						text = tmp.getTextContent();
+						int headingLevel = textTocMarkStartElement
+								.getTextOutlineLevelAttribute();
+						stylename = "Contents_20_" + headingLevel;
+						ceateIndexBodyEntry(textIndexBody, stylename, text);
+					}
+				}
+				// end of Index Makes support
+			}
+			if (before) {
+				rootNode.insertBefore(textTableOfContent, refparagraphNode);
+			} else {
+				// Insert TOC after the refParagraph
+				Node refNextNode = refparagraphNode.getNextSibling();
+				if (refNextNode == null) {
+					rootNode.appendChild(textTableOfContent);
+				} else {
+					rootNode.insertBefore(textTableOfContent, refNextNode);
+				}
+			}
+			return textTableOfContent;
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					"Failed to create Default TOC", e);
+			throw new RuntimeException("Failed to create Default TOC", e);
+		}
+	}
+
+	private void ceateIndexBodyEntry(TextIndexBodyElement textIndexBody,
+			String stylename, String text) {
+		TextPElement textp = textIndexBody.newTextPElement();
+		textp.setTextStyleNameAttribute(stylename);
+		textp.newTextNode(text);
+		textp.newTextTabElement();
+		textp.newTextNode("1");
+	}
+
+	/**
+	 * Create a new Table Of Content to this document before the reference
+	 * paragraph. The additional paragraph styles list will be included in the
+	 * TOC. Because until you do a full layout of the document, taking into
+	 * account font metrics,line breaking algorithms, hyphenation, image
+	 * positioning, "orphan and widow" rules, etc., you don't know what content
+	 * is on which page. So all the page numbers in TOC are be set value "1".
+	 * Please update the page numbers from AOO Menus: Tools->Update->All Indexes
+	 * and Tables.  If additionalStyle is null then call createDefaultTOC().
+	 * 
+	 * @param refParagraph
+	 *            the reference paragraph before where the TOC inserted.
+	 * @param additionalStyle
+	 *            the additional paragraph styles that you want to include in
+	 *            the TOC
+	 * @param before
+	 *            true:insert TOC before the reference paragraph. 
+	 *            false:insert TOC after the reference paragraph.
+	 * @since 0.8.6
+	 */
+	public TextTableOfContentElement createTOCwithStyle(Paragraph refParagraph,
+			TOCStyle additionalStyle, boolean before) {
+		if(refParagraph==null){
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					"Failed to create Default TOC, The refParagraph where the TOC be inserted is null");
+			throw new RuntimeException("Failed to create Default TOC, The refParagraph where the TOC be inserted is null");
+		}
+		if (additionalStyle == null) {
+			TextTableOfContentElement textTableOfContentElement = createDefaultTOC(refParagraph, before);
+			return textTableOfContentElement;
+		}
+		HashMap<Integer, String> tocstyleList = additionalStyle.getStyle();
+		if (tocstyleList.isEmpty()) {
+			TextTableOfContentElement textTableOfContentElement =createDefaultTOC(refParagraph, before);
+			return textTableOfContentElement;
+		}
+
+		Collection<String> tocvalues = tocstyleList.values();
+		OdfOfficeStyles docstyles = getOrCreateDocumentStyles();
+		Iterable<OdfStyle> paragraphStyles = docstyles
+				.getStylesForFamily(OdfStyleFamily.Paragraph);
+		ArrayList<String> pstyle = new ArrayList<String>();
+		Iterator<OdfStyle> iterator = paragraphStyles.iterator();
+		while (iterator.hasNext()) {
+			OdfStyle style = iterator.next();
+			String name = style.getStyleNameAttribute();
+			pstyle.add(name);
+		}
+		if (!pstyle.containsAll(tocvalues)) {
+			Logger.getLogger(TextDocument.class.getName())
+					.log(Level.SEVERE,
+							"Failed to create TOC with Styles. Some of addtional Styles that you want to include in the TOC can't be found in the document.\n"
+									+ tocvalues.toString());
+			throw new RuntimeException(
+					"Failed to create TOC Styles.Some of addtional Styles that you want to include in the TOC can't be found in the document.");
+		}
+		TextTableOfContentElement textTableOfContent =null;
+		// Additional Styles support
+		HashMap<String, Integer> tmptocstyleList = new HashMap<String, Integer>();
+		if (!tocstyleList.isEmpty()) {
+			Set<Integer> key = tocstyleList.keySet();
+			Iterator<Integer> it = key.iterator();
+			while (it.hasNext()) {
+				Integer textOutlineLevelValue = it.next();
+				String textStyleNameValue = tocstyleList
+						.get(textOutlineLevelValue);
+				tmptocstyleList.put(textStyleNameValue, textOutlineLevelValue);
+			}
+		}
+		// end of Additional Styles support
+
+		Node refparagraphNode = refParagraph.getOdfElement();
+		Node rootNode = refparagraphNode.getParentNode();
+		try {
+			OdfContentDom content = getContentDom();
+			textTableOfContent = content
+					.newOdfElement(TextTableOfContentElement.class);
+			textTableOfContent.setTextNameAttribute("Table of Contents");
+			textTableOfContent.setTextProtectedAttribute(true);
+
+			TextTableOfContentSourceElement textTableOfContentSource = textTableOfContent
+					.newTextTableOfContentSourceElement();
+			textTableOfContentSource.setTextOutlineLevelAttribute(10);
+			textTableOfContentSource.setTextUseIndexMarksAttribute(true);
+			textTableOfContentSource.setTextUseIndexSourceStylesAttribute(true);
+			TextIndexTitleTemplateElement textIndexTitleTemplate = textTableOfContentSource
+					.newTextIndexTitleTemplateElement();
+			textIndexTitleTemplate
+					.setTextStyleNameAttribute("Contents_20_Heading");
+			textIndexTitleTemplate.setTextContent("Table of Contents");
+			for (int i = 1; i <= 10; i++) {
+				TextTableOfContentEntryTemplateElement textTableOfContentEntryTemplate = textTableOfContentSource
+						.newTextTableOfContentEntryTemplateElement(i,
+								"Contents_20_" + i);
+				TextIndexEntryLinkStartElement TextIndexEntryLinkStart = textTableOfContentEntryTemplate
+						.newTextIndexEntryLinkStartElement();
+				TextIndexEntryLinkStart
+						.setTextStyleNameAttribute("Index_20_Link");
+				textTableOfContentEntryTemplate
+						.newTextIndexEntryChapterElement();
+				textTableOfContentEntryTemplate.newTextIndexEntryTextElement();
+				TextIndexEntryTabStopElement TextIndexEntryTabStop = textTableOfContentEntryTemplate
+						.newTextIndexEntryTabStopElement("right");
+				TextIndexEntryTabStop.setStyleLeaderCharAttribute(".");
+				textTableOfContentEntryTemplate
+						.newTextIndexEntryPageNumberElement();
+				textTableOfContentEntryTemplate
+						.newTextIndexEntryLinkEndElement();
+			}
+
+			if (!tocstyleList.isEmpty()) {
+				Set<Integer> key = tocstyleList.keySet();
+				Iterator<Integer> it = key.iterator();
+				while (it.hasNext()) {
+					Integer textOutlineLevelValue = it.next();
+					String textStyleNameValue = tocstyleList
+							.get(textOutlineLevelValue);
+					TextIndexSourceStylesElement textIndexSourceStyles = textTableOfContentSource
+							.newTextIndexSourceStylesElement(textOutlineLevelValue);
+					textIndexSourceStyles
+							.newTextIndexSourceStyleElement(textStyleNameValue);
+				}
+			}
+
+			TextIndexBodyElement textIndexBody = textTableOfContent
+					.newTextIndexBodyElement();
+			TextIndexTitleElement TextIndexTitle = textIndexBody
+					.newTextIndexTitleElement("Table of Contents_Head");
+			TextPElement texp = TextIndexTitle.newTextPElement();
+			texp.setTextStyleNameAttribute("Contents_20_Heading");
+			texp.setTextContent("Table of Contents");
+			Iterator<Paragraph> paragraphIterator = getParagraphIterator();
+			while (paragraphIterator.hasNext()) {
+				Paragraph paragraph = paragraphIterator.next();
+				String text = paragraph.getTextContent();
+				String stylename = paragraph.getStyleName();
+				// Outline support
+				if (paragraph.isHeading()) {
+					int headingLevel = paragraph.getHeadingLevel();
+					if (stylename.length() <= 0) {
+						stylename = "Contents_20_" + headingLevel;
+					}
+					ceateIndexBodyEntry(textIndexBody, stylename, text);
+				}
+				// end of Outline support
+				// Additional Styles support
+				if (tmptocstyleList.containsKey(stylename)) {
+					int headingLevel = tmptocstyleList.get(stylename);
+					stylename = "Contents_20_" + headingLevel;
+					ceateIndexBodyEntry(textIndexBody, stylename, text);
+				}
+				// end of Additional Styles support
+				// Index Makes support
+				TextParagraphElementBase podf = paragraph.getOdfElement();
+				NodeList cns = podf.getChildNodes();
+				for (int i = 0; i < cns.getLength(); i++) {
+					Node node = cns.item(i);
+					if (node instanceof TextTocMarkElement) {
+						TextTocMarkElement textTocMarkElement = (TextTocMarkElement) node;
+						text = textTocMarkElement.getTextStringValueAttribute();
+						int headingLevel = textTocMarkElement
+								.getTextOutlineLevelAttribute();
+						stylename = "Contents_20_" + headingLevel;
+						ceateIndexBodyEntry(textIndexBody, stylename, text);
+					}
+					if (node instanceof TextTocMarkStartElement) {
+						TextTocMarkStartElement textTocMarkStartElement = (TextTocMarkStartElement) node;
+						Node tmp = node.getNextSibling();
+						while (!(tmp instanceof Text)) {
+							tmp = node.getNextSibling();
+						}
+						text = tmp.getTextContent();
+						int headingLevel = textTocMarkStartElement
+								.getTextOutlineLevelAttribute();
+						stylename = "Contents_20_" + headingLevel;
+						ceateIndexBodyEntry(textIndexBody, stylename, text);
+					}
+				}
+				// end of Index Makes support
+			}
+			if (before) {
+				rootNode.insertBefore(textTableOfContent, refparagraphNode);
+			} else {
+				// Insert TOC after the refParagraph
+				Node refNextNode = refparagraphNode.getNextSibling();
+				if (refNextNode == null) {
+					rootNode.appendChild(textTableOfContent);
+				} else {
+					rootNode.insertBefore(textTableOfContent, refNextNode);
+				}
+			}
+			return textTableOfContent;
+			
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					"Failed to create Default TOC", e);
+			throw new RuntimeException("Failed to create Default TOC", e);
+		}
+	}
+	
+	/**
+	 * Copy a Paragraph and insert it before or after the Reference Paragraph in the text document, whether the
+	 * Paragraph is in this document or in a different document.
+	 * 
+	 * @param referenceParagraph
+	 *            - where the Paragraph be inserted 
+	 * @param sourceParagraph
+	 *            - the Paragraph which will be copied
+	 * @param before
+	 *            true:insert Paragraph before the reference paragraph. 
+	 *            false:insert Paragraph after the reference paragraph.       
+	 */
+	public Paragraph insertParagraph(Paragraph referenceParagraph, Paragraph sourceParagraph,boolean before) {
+		boolean isForeignNode = false;
+		try {
+			Node refparagraphNode = referenceParagraph.getOdfElement();
+			if (sourceParagraph.getOdfElement().getOwnerDocument() != getContentDom())
+				isForeignNode = true;
+			 TextParagraphElementBase oldParagraphEle = sourceParagraph.getOdfElement();
+			 TextParagraphElementBase newParagraphEle = (TextParagraphElementBase) oldParagraphEle.cloneNode(true);
+			
+			if (isForeignNode)
+				copyForeignStyleRef(sourceParagraph.getOdfElement(), sourceParagraph.getOwnerDocument());
+			if (isForeignNode) // not in a same document
+				newParagraphEle = (TextParagraphElementBase) cloneForeignElement(newParagraphEle, getContentDom(), true);
+			
+			if (before) {
+				refparagraphNode.getParentNode().insertBefore(newParagraphEle, refparagraphNode);
+			} else {
+				// Insert Paragraph after the refParagraph
+				Node refNextNode = refparagraphNode.getNextSibling();
+				if (refNextNode == null) {
+					refparagraphNode.getParentNode().appendChild(newParagraphEle);
+				} else {
+					refparagraphNode.getParentNode().insertBefore(newParagraphEle, refNextNode);
+				}
+			}
+			
+			return Paragraph.getInstanceof(newParagraphEle);
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+	/**
+	 * Copy a Table and insert it before or after the Reference Paragraph in the text document, whether the
+	 * Table is in this TextDocument or in a different Document.
+	 * 
+	 * @param referenceParagraph
+	 *            - where the Paragraph be inserted 
+	 * @param sourceParagraph
+	 *            - the Paragraph which will be copied
+	 * @param before
+	 *            true:insert Paragraph before the reference paragraph. 
+	 *            false:insert Paragraph after the reference paragraph.       
+	 */
+	public Table insertTable(Paragraph referenceParagraph, Table sourceTable,boolean before) {
+		
+		Document ownDocument = sourceTable.getOwnerDocument();
+		TableTableElement newTEle = (TableTableElement)insertOdfElement(referenceParagraph.getOdfElement(),ownDocument,sourceTable.getOdfElement(),before);
+		Table table = Table.getInstance(newTEle);
+		return table;
+	}
+	/**
+	 * Copy a OdfElement and insert it before or after the Reference OdfElement in the TextDocument, whether the
+	 * OdfElement is in this TextDocument or in a different Document.
+	 * 
+	 * @param referenceOdfElement
+	 *            - where the OdfElement be inserted 
+	 * @param sourceDocument
+	 *            - the source Document which contain the sourceOdfElement
+	 * @param sourceOdfElement
+	 *            - the OdfElement which will be copied
+	 * @param before
+	 *            true:insert OdfElement before the reference OdfElement. 
+	 *            false:insert OdfElement after the reference OdfElement.       
+	 */
+	public OdfElement insertOdfElement(OdfElement referenceOdfElement,Document sourceDocument ,OdfElement sourceOdfElement,boolean before) {
+		boolean isForeignNode = false;
+		try {
+			
+			if (sourceOdfElement.getOwnerDocument() != getContentDom())
+				isForeignNode = true;
+			 
+			OdfElement newOdfElement = (OdfElement) sourceOdfElement.cloneNode(true);
+			
+			if (isForeignNode) {
+				copyForeignStyleRef(newOdfElement, sourceDocument);
+				copyLinkedRef(newOdfElement);
+				newOdfElement = (OdfElement) cloneForeignElement(newOdfElement,
+						getContentDom(), true);
+			}
+			
+			if (before) {
+				referenceOdfElement.getParentNode().insertBefore(newOdfElement, referenceOdfElement);
+			} else {
+				// Insert newOdfElement after the referenceOdfElement
+				Node refNextNode = referenceOdfElement.getNextSibling();
+				if (refNextNode == null) {
+					referenceOdfElement.getParentNode().appendChild(newOdfElement);
+				} else {
+					referenceOdfElement.getParentNode().insertBefore(newOdfElement, refNextNode);
+				}
+			}
+			return newOdfElement;
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+	
+	private OdfElement insertOdfElementwithoutstyle(OdfElement referenceOdfElement,Document sourceDocument ,OdfElement sourceOdfElement,boolean before) {
+		try {			 
+			OdfElement newOdfElement = (OdfElement) sourceOdfElement.cloneNode(true);
+			newOdfElement = (OdfElement)  cloneForeignElement(newOdfElement, getContentDom(), true);
+			if (before) {
+				referenceOdfElement.getParentNode().insertBefore(newOdfElement, referenceOdfElement);
+			} else {
+				// Insert newOdfElement after the referenceOdfElement
+				Node refNextNode = referenceOdfElement.getNextSibling();
+				if (refNextNode == null) {
+					referenceOdfElement.getParentNode().appendChild(newOdfElement);
+				} else {
+					referenceOdfElement.getParentNode().insertBefore(newOdfElement, refNextNode);
+				}
+			}
+			return newOdfElement;
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+	
+	/**
+	 * Copy text content of the source TextDocument and insert it to the current TextDocument
+	 * after the reference Paragraph, with Styles or without Styles.
+	 * 
+	 * @param sourceDocument
+	 *            the source TextDocument
+	 * @param referenceParagraph
+	 *  		  where the text content of the source TextDocument be inserted 
+	 * @param isCopyStyle
+	 *            true:copy the styles in source document to current TextDocment. 
+	 *            false:don't copy the styles in source document to current TextDocment. 
+	 */
+	public void insertContentFromDocumentAfter(TextDocument sourceDocument, Paragraph referenceParagraph, boolean isCopyStyle){
+		try {
+			OfficeTextElement sroot = sourceDocument.getContentRoot();
+			NodeList clist = sroot.getChildNodes();
+			for (int i=(clist.getLength()-1); i>=0; i--) {
+				OdfElement node = (OdfElement) clist.item(i);
+				if(isCopyStyle){
+					insertOdfElement(referenceParagraph.getOdfElement(), sourceDocument, node, false);
+				}
+				else {
+					insertOdfElementwithoutstyle(referenceParagraph.getOdfElement(), sourceDocument, node, false);
+				}
+			}
+			
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+	/**
+	 * Copy text content of the source TextDocument and insert it to the current TextDocument
+	 * before the reference Paragraph, with Styles or without Styles.
+	 * 
+	 * @param srcDoc
+	 *            the source TextDocument
+	 * @param referenceParagraph
+	 *  		  where the text content of the source TextDocument be inserted 
+	 * @param isCopyStyle
+	 *            true:copy the styles in source document to current TextDocment. 
+	 *            false:don't copy the styles in source document to current TextDocment. 
+	 */
+	public void insertContentFromDocumentBefore(TextDocument sourceDocument, Paragraph referenceParagraph, boolean isCopyStyle){
+		try {
+			OfficeTextElement sroot = sourceDocument.getContentRoot();
+			NodeList clist = sroot.getChildNodes();
+			for (int i = 0; i < clist.getLength(); i++) {
+				OdfElement node = (OdfElement) clist.item(i);
+				if(isCopyStyle){
+					insertOdfElement(referenceParagraph.getOdfElement(), sourceDocument, node, true);
+				}
+				else {
+					insertOdfElementwithoutstyle(referenceParagraph.getOdfElement(), sourceDocument, node, true);
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	private FormContainerImpl getFormContainerImpl() {
+		if (formContainerImpl == null) {
+			formContainerImpl = new FormContainerImpl();
+		}
+		return formContainerImpl;
+	}
+
+	private class FormContainerImpl extends AbstractFormContainer {
+
+		public OfficeFormsElement getFormContainerElement() {
+			OfficeFormsElement forms = null;
+			try {
+				OfficeTextElement root = getContentRoot();
+				forms = OdfElement.findFirstChildNode(OfficeFormsElement.class,
+						root);
+				if (forms == null) {
+					Node firstChild = root.getFirstChild();
+					OfficeFormsElement officeForms = ((OdfFileDom) getContentDom())
+							.newOdfElement(OfficeFormsElement.class);
+					forms = (OfficeFormsElement) root.insertBefore(officeForms,
+							firstChild);
+				}
+				return forms;
+			} catch (Exception e) {
+				Logger.getLogger(TextDocument.class.getName()).log(
+						Level.SEVERE, null, e);
+			}
+			return forms;
+		}
+
+	}
+
+	/**
+	 * Create a form with specified name in this text document.
+	 * 
+	 * @see FormContainer#createForm(String)
+	 */
+	public Form createForm(String name) {
+		return getFormContainerImpl().createForm(name);
+	}
+
+	/**
+	 * Get a form iterator to traverse all the forms in this document.
+	 * 
+	 * @see FormContainer#getFormIterator()
+	 */
+	public Iterator<Form> getFormIterator() {
+		return getFormContainerImpl().getFormIterator();
+	}
+
+	/**
+	 * Remove a form with the specified name in this document.
+	 * 
+	 * @see FormContainer#removeForm(Form)
+	 */
+	public boolean removeForm(Form form) {
+		return getFormContainerImpl().removeForm(form);
+	}
+
+//	@Override
+	public Form getFormByName(String name) {
+		return getFormContainerImpl().getFormByName(name);
+	}
+
+//	@Override
+	public OfficeFormsElement getFormContainerElement() {
+		return getFormContainerImpl().getFormContainerElement();
+	}
+
+//	@Override
+	public boolean getApplyDesignMode() {
+		return getFormContainerImpl().getApplyDesignMode();
+	}
+
+//	@Override
+	public boolean getAutomaticFocus() {
+		return getFormContainerImpl().getAutomaticFocus();
+	}
+
+//	@Override
+	public void setApplyDesignMode(boolean isDesignMode) {
+		getFormContainerImpl().setApplyDesignMode(isDesignMode);
+
+	}
+
+//	@Override
+	public void setAutomaticFocus(boolean isAutoFocus) {
+		getFormContainerImpl().setAutomaticFocus(isAutoFocus);
+
+	}
+
+//	@Override
+	public Control createDrawControl() {
+		OdfElement parent = this.getDrawControlContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parent.getOwnerDocument();
+		DrawControlElement element = ownerDom
+				.newOdfElement(DrawControlElement.class);
+		Node refChild = OdfElement.findFirstChildNode(
+				TextSequenceDeclsElement.class, parent);
+		parent.insertBefore(element, refChild.getNextSibling());
+		Control control = new Control(element);
+		Component.registerComponent(control, element);
+		return control;
+	}
+
+//	@Override
+	public OdfElement getDrawControlContainerElement() {
+		OdfElement element = null;
+		try {
+			element = this.getContentRoot();
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+		return element;
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/chart/AbstractChartContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/AbstractChartContainer.java
new file mode 100644
index 0000000..795a14e
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/AbstractChartContainer.java
@@ -0,0 +1,212 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.odftoolkit.simple.chart;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.chart.ChartChartElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.ChartDocument;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.w3c.dom.NodeList;
+
+/**
+ * AbstractChartContainer is an abstract implementation of the ChartContainer
+ * interface, with a default implementation for every method defined in
+ * ChartContainer.
+ * 
+ * @since 0.6
+ */
+public abstract class AbstractChartContainer implements ChartContainer {
+	private Document mDocument;
+	private Map<String, Chart> mCharts;
+	private String ROOT_STRING = "./";
+
+	/**
+	 * The constructor to create a chart container
+	 * 
+	 * @param doc
+	 *            - the onwer document
+	 */
+	protected AbstractChartContainer(Document doc) {
+		try {
+			mDocument = doc;
+			// init chart container by searching the embeded document
+			mCharts = new HashMap<String, Chart>();
+			List<Document> charts = mDocument.getEmbeddedDocuments(Document.OdfMediaType.CHART);
+			for (Document chartDoc : charts) {
+				OdfContentDom contentDom = chartDoc.getContentDom();
+				ChartChartElement chartEle = (ChartChartElement) contentDom.getXPath().evaluate("//chart:chart[1]",
+						contentDom, XPathConstants.NODE);
+				String documentPath = chartDoc.getDocumentPath();
+				mCharts.put(documentPath, new Chart(chartEle, documentPath));
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(AbstractChartContainer.class.getName()).log(Level.SEVERE, null, ex);
+		}
+	}
+
+	/**
+	 * Returns the <draw:frame> element which can contain a chart image object.
+	 * 
+	 * @return the draw:frame element
+	 */
+	protected abstract DrawFrameElement getChartFrame() throws Exception;
+
+	public Chart createChart(String title, DataSet dataset, Rectangle rect) {
+		try {
+			String sName = mDocument.getDocumentPath() + "/" + title + "_" + System.currentTimeMillis();
+			// embed this chart document
+			ChartDocument newChartDocument = ChartDocument.newChartDocument();
+			mDocument.insertDocument(newChartDocument, sName);
+			OdfContentDom contentDom = newChartDocument.getContentDom();
+			ChartChartElement chartEle = (ChartChartElement) (contentDom.getXPath().evaluate("//chart:chart[1]",
+					contentDom, XPathConstants.NODE));
+			Chart chart = new Chart(chartEle, sName);
+			chart.setChartTitle(title);
+			chart.setChartType(ChartType.BAR);
+			chart.setUseLegend(true);
+			chart.setChartData(dataset);
+			DrawFrameElement drawFrame = getChartFrame();
+			drawFrame.setProperty(StyleGraphicPropertiesElement.OleDrawAspect, "1");
+			drawFrame.setPresentationUserTransformedAttribute(true);
+			drawFrame.removeAttributeNS(OdfDocumentNamespace.PRESENTATION.getUri(), "placeholder");
+			if (rect != null) {
+				drawFrame.setSvgXAttribute(new Integer(rect.x).toString());
+				drawFrame.setSvgYAttribute(new Integer(rect.y).toString());
+				drawFrame.setSvgWidthAttribute(new Integer(rect.width).toString());
+				drawFrame.setSvgHeightAttribute(new Integer(rect.height).toString());
+			}
+			DrawObjectElement drawObject = OdfElement.findFirstChildNode(DrawObjectElement.class, drawFrame);
+			if(drawObject == null){
+				drawObject = drawFrame.newDrawObjectElement();
+			}
+			if (dataset.getCellRangeAddress() != null){
+				drawObject.setDrawNotifyOnUpdateOfRangesAttribute(dataset.getCellRangeAddress().toString());
+			}
+			drawObject.setXlinkHrefAttribute(ROOT_STRING + sName);
+			drawObject.setXlinkTypeAttribute("simple");
+			drawObject.setXlinkShowAttribute("embed");
+			drawObject.setXlinkActuateAttribute("onLoad");
+			mCharts.put(sName, chart);
+			return chart;
+		} catch (Exception ex) {
+			Logger.getLogger(AbstractChartContainer.class.getName()).log(Level.SEVERE, null, ex);
+			return null;
+		}
+	}
+
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr,
+			boolean firstRowAsLabel, boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect) {
+		DataSet dataset = new DataSet(cellRangeAddr, document, firstRowAsLabel, firstColumnAsLabel, rowAsDataSeries);
+		return createChart(title, dataset, rect);
+	}
+
+	public Chart createChart(String title, String[] labels, String[] legends, double[][] data, Rectangle rect) {
+		DataSet dataset = new DataSet(labels, legends, data);
+		return createChart(title, dataset, rect);
+	}
+
+	public void deleteChartById(String chartId) {
+		try {
+			// 1.remove from the container
+			mCharts.remove(chartId);
+			// 2.remove the embedded document
+			mDocument.removeDocument(chartId);
+			// 3.remove the draw:frame element in main document
+			NodeList frameObjects;
+			frameObjects = mDocument.getContentDom().getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(),
+					"object");
+			for (int i = 0; i < frameObjects.getLength(); i++) {
+				DrawObjectElement object = (DrawObjectElement) frameObjects.item(i);
+				if (object.getXlinkHrefAttribute().toString().endsWith(chartId)) {
+					DrawFrameElement frame = (DrawFrameElement) object.getParentNode();
+					frame.getParentNode().removeChild(frame);
+				}
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(AbstractChartContainer.class.getName()).log(Level.SEVERE, null, ex);
+		}
+	}
+
+	public void deleteChartByTitle(String title) {
+		List<String> delChartIDList = new ArrayList<String>();
+		Set<String> chartSet = mCharts.keySet();
+		for (String chartIter : chartSet) {
+			Chart chart = mCharts.get(chartIter);
+			if (chart.getChartTitle().equals(title)) {
+				delChartIDList.add(chartIter);
+			}
+		}
+		for (int i = 0; i < delChartIDList.size(); i++) {
+			deleteChartById(delChartIDList.get(i));
+		}
+	}
+
+	public Chart getChartById(String chartId) {
+		try {
+			Document embedChartDoc = mDocument.getEmbeddedDocument(chartId);
+			if (embedChartDoc != null) {
+				OdfContentDom contentDom = embedChartDoc.getContentDom();
+				ChartChartElement chartEle = (ChartChartElement) contentDom.getXPath().evaluate("//chart:chart[1]",
+						contentDom, XPathConstants.NODE);
+				Chart chart = new Chart(chartEle, chartId);
+				if (mCharts.get(chartId) != null) {
+					return chart;
+				}
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(AbstractChartContainer.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+
+	public List<Chart> getChartByTitle(String title) {
+		List<Chart> chartList = new ArrayList<Chart>();
+		Set<String> chartSet = mCharts.keySet();
+		for (String chartIter : chartSet) {
+			Chart chart = mCharts.get(chartIter);
+			if (chart.getChartTitle().equals(title)) {
+				chartList.add(chart);
+			}
+		}
+		return chartList;
+	}
+
+	public int getChartCount() {
+		int cnt = mDocument.getEmbeddedDocuments(Document.OdfMediaType.CHART).size();
+		return cnt;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/chart/Chart.java b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/Chart.java
new file mode 100644
index 0000000..fb6870a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/Chart.java
@@ -0,0 +1,914 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.odftoolkit.simple.chart;
+
+import java.util.Random;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartDimensionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.chart.ChartLegendPositionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dProjectionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.dr3d.Dr3dShadeModeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLegendExpansionAttribute;
+import org.odftoolkit.odfdom.dom.element.chart.ChartAxisElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartCategoriesElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartChartElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartDataPointElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartFloorElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartGridElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartLegendElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartPlotAreaElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartSeriesElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartTitleElement;
+import org.odftoolkit.odfdom.dom.element.chart.ChartWallElement;
+import org.odftoolkit.odfdom.dom.element.dr3d.Dr3dLightElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleChartPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.w3c.dom.NodeList;
+
+/**
+ * <code>Chart</code> represents the chart feature of the ODF document.
+ * <code>Chart</code> provides methods to get/set chart title, get/set chart
+ * data, etc.
+ * 
+ * @since 0.6
+ */
+public class Chart {
+
+	private final static String AXIS_SVG_X = "3.104cm";
+	private final static String AXIS_SVG_Y = "6.359cm";
+	private final static String AXIS_FONTSIZE = "10pt";
+	private final static String AXIS_FONTSIZEASIAN = "10pt";
+	private final static String AXIS_FONTSIZECOMPLEX = "10pt";
+	private final static String CHART_SVG_WIDTH = "7cm";
+	private final static String CHART_SVG_HEIGH = "8cm";
+	private final static String CHART_CLASS_TYPE = "chart:bar";
+	private final static String CHART_PROPERTIES_STROKE = "none";
+	private final static String PLOTAREA_SVG_HEIGHT = "7.52cm";
+	private final static String PLOTAREA_SVG_WIDTH = "4.73cm";
+	private final static String PLOTAREA_SVG_X = "0.16cm";
+	private final static String PLOTAREA_SVG_Y = "1.375cm";
+
+	private ChartChartElement chartElement;
+	private DataSet dataSet;
+	private ChartTitleElement chartTitle;
+	private ChartLegendElement legend;
+	private ChartPlotAreaElement plotArea;
+	private TableTableElement table;
+	private TableTableHeaderColumnsElement headerColumns;
+	private TableTableColumnsElement columns;
+	private TableTableColumnElement column;
+	private TableTableHeaderRowsElement headerRows;
+	private TableTableRowElement headerRow;
+	private TableTableRowsElement rows;
+	private String chartID;
+
+	private boolean isApply3DEffect = false;
+	private boolean isUseLegend = false;
+
+	Chart(ChartChartElement chartElement, String chartID) {
+		this.chartElement = chartElement;
+		this.chartID = chartID;
+		init();
+	}
+
+	private void init() {
+		chartElement.setSvgWidthAttribute(CHART_SVG_WIDTH);
+		chartElement.setSvgHeightAttribute(CHART_SVG_HEIGH);
+		chartElement.setChartClassAttribute(CHART_CLASS_TYPE);
+		chartElement.setProperty(StyleGraphicPropertiesElement.Stroke, CHART_PROPERTIES_STROKE);
+	}
+
+	private void setPlotArea() {
+		// chart:plotarea
+		NodeList plotAreas = chartElement.getElementsByTagName(ChartPlotAreaElement.ELEMENT_NAME.getQName());
+		if (plotAreas.getLength() > 0) {
+			chartElement.removeChild(plotAreas.item(0));
+		}
+		plotArea = (ChartPlotAreaElement) chartElement.newChartPlotAreaElement();
+
+		plotArea = (ChartPlotAreaElement) plotAreas.item(0);
+		plotArea.setProperty(StyleChartPropertiesElement.RightAngledAxes, "true");
+		plotArea.setSvgHeightAttribute(PLOTAREA_SVG_HEIGHT);
+		plotArea.setSvgWidthAttribute(PLOTAREA_SVG_WIDTH);
+		plotArea.setSvgXAttribute(PLOTAREA_SVG_X);
+		plotArea.setSvgYAttribute(PLOTAREA_SVG_Y);
+
+		// chart:axis
+		ChartAxisElement axisX = plotArea.newChartAxisElement(ChartDimensionAttribute.Value.x.toString());
+		if (getTableCellRange() != null) {
+			ChartCategoriesElement categories = (ChartCategoriesElement) axisX.newChartCategoriesElement();
+			categories.setTableCellRangeAddressAttribute(getTableCellRange());
+		}
+		axisX.setChartDimensionAttribute(ChartDimensionAttribute.Value.x.toString());
+		axisX.setChartNameAttribute("primary-x");
+		axisX.setProperty(StyleChartPropertiesElement.DisplayLabel, "true");
+		axisX.setProperty(StyleChartPropertiesElement.Logarithmic, "false");
+		axisX.setProperty(StyleChartPropertiesElement.ReverseDirection, "false");
+		axisX.setProperty(StyleChartPropertiesElement.LineBreak, "false");
+		axisX.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+		axisX.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+		axisX.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+		axisX.setProperty(StyleTextPropertiesElement.FontCharsetComplex, "10pt");
+
+		ChartAxisElement axisY = (ChartAxisElement) plotArea.newChartAxisElement(ChartDimensionAttribute.Value.y
+				.toString());
+		axisY.setChartDimensionAttribute(ChartDimensionAttribute.Value.y.toString());
+		axisY.setChartNameAttribute("primary-y");
+		axisY.setProperty(StyleChartPropertiesElement.DisplayLabel, "true");
+		axisY.setProperty(StyleChartPropertiesElement.Logarithmic, "false");
+		axisY.setProperty(StyleChartPropertiesElement.ReverseDirection, "false");
+		axisY.setProperty(StyleChartPropertiesElement.LineBreak, "false");
+		axisY.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+		axisY.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+		axisY.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+		axisY.setProperty(StyleTextPropertiesElement.FontCharsetComplex, "10pt");
+
+		// chart:grid
+		ChartGridElement grid = axisY.newChartGridElement();
+		grid.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+		grid.setChartClassAttribute(ChartClassAttribute.Value.MAJOR.toString());
+
+		// chart:series
+		int numSeries = dataSet.getDataSeriesCount();
+		Object[] valueCellRange = getValueCellRange();
+		Object[] labelCellRange = getLabelCellRange();
+
+		for (int i = 0; i < numSeries; i++) {
+			ChartSeriesElement series = plotArea.newChartSeriesElement();
+			series.setChartClassAttribute(chartElement.getChartClassAttribute());
+			series.setProperty(StyleGraphicPropertiesElement.Stroke, "solid");
+			series.setProperty(StyleGraphicPropertiesElement.FillColor, getRandColorCode());
+			series.setProperty(StyleGraphicPropertiesElement.EdgeRounding, "0%");
+			series.setProperty(StyleTextPropertiesElement.FontSize, "6pt");
+			series.setProperty(StyleTextPropertiesElement.FontSizeAsian, "6pt");
+			series.setProperty(StyleTextPropertiesElement.FontCharsetComplex, "6pt");
+
+			if ((String) valueCellRange[i] != null) {
+				series.setChartValuesCellRangeAddressAttribute((String) valueCellRange[i]);
+			}
+
+			if ((String) labelCellRange[i] != null) {
+				series.setChartLabelCellAddressAttribute((String) labelCellRange[i]);
+			}
+
+			ChartDataPointElement point = series.newChartDataPointElement();
+			point.setChartRepeatedAttribute(new Integer(numSeries));
+		}
+
+		ChartWallElement wall = plotArea.newChartWallElement();
+		wall.setProperty(StyleGraphicPropertiesElement.Stroke, "none");
+		wall.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+		wall.setProperty(StyleGraphicPropertiesElement.Fill, "none");
+		wall.setProperty(StyleGraphicPropertiesElement.FillColor, "#e6e6e6");
+
+		ChartFloorElement floor = plotArea.newChartFloorElement();
+		floor.setProperty(StyleGraphicPropertiesElement.Stroke, "none");
+		floor.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+		floor.setProperty(StyleGraphicPropertiesElement.Fill, "none");
+		floor.setProperty(StyleGraphicPropertiesElement.FillColor, "#e6e6e6");
+	}
+
+	/**
+	 * 3D effect manipulation, get whether the chart apples 3D effect
+	 * 
+	 * @return return true if the chart is applied 3D effect
+	 */
+	public boolean IsApply3DEffect() {
+		return isApply3DEffect;
+	}
+
+	/**
+	 * chart axis manipulation, temporarily only consider the axis title
+	 * 
+	 * @param dimType
+	 *            the chart axis dimension, x, y or z
+	 * @return return axis title according to the given dimension,null if the
+	 *         specific dimensional axis has no title
+	 */
+	public String getAxisTitle(String dimType) {
+		NodeList chartAxises = (NodeList) plotArea.getElementsByTagName(ChartAxisElement.ELEMENT_NAME.getQName());
+		for (int i = 0; i < chartAxises.getLength(); i++) {
+			ChartAxisElement axis = (ChartAxisElement) chartAxises.item(i);
+			String dimension = axis.getAttributeNS(OdfDocumentNamespace.CHART.getUri(), "dimension");
+			if (dimension.equals(dimType)) {
+				NodeList titles = axis.getElementsByTagName(ChartTitleElement.ELEMENT_NAME.getQName());
+				ChartTitleElement axisTitle = (ChartTitleElement) titles.item(0);
+				NodeList paras = (NodeList) axisTitle.getElementsByTagName(TextPElement.ELEMENT_NAME.getQName());
+				return paras.item(0).getTextContent();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * chart data manipulation, get the chart data
+	 * 
+	 * @return return the chart data
+	 */
+	public DataSet getChartData() {
+		String[] labels;
+		String[] legends;
+		double[][] values;
+
+		if (dataSet == null) {
+			this.dataSet = new DataSet();
+			if (table == null) {
+				table = (TableTableElement) chartElement
+						.getElementsByTagName(TableTableElement.ELEMENT_NAME.getQName()).item(0);
+				headerRows = (TableTableHeaderRowsElement) table.getElementsByTagName(
+						TableTableHeaderRowsElement.ELEMENT_NAME.getQName()).item(0);
+				headerRow = (TableTableRowElement) table.getElementsByTagName(
+						TableTableRowElement.ELEMENT_NAME.getQName()).item(0);
+				NodeList headerCells = headerRow.getElementsByTagName(TableTableCellElement.ELEMENT_NAME.getQName());
+
+				// column count
+				int legendcount = headerCells.getLength() - 1;
+				legends = new String[legendcount];
+				for (int i = 1; i < legendcount + 1; i++) {
+					TableTableCellElement headerCell = (TableTableCellElement) headerCells.item(i);
+					legends[i - 1] = ((OdfTextParagraph) headerCell.getElementsByTagName(
+							TextPElement.ELEMENT_NAME.getQName()).item(0)).getTextContent();
+				}
+
+				rows = (TableTableRowsElement) table
+						.getElementsByTagName(TableTableRowsElement.ELEMENT_NAME.getQName()).item(0);
+				NodeList row = rows.getElementsByTagName(TableTableRowElement.ELEMENT_NAME.getQName());
+
+				// row count
+				int labelcount = row.getLength();
+				values = new double[legendcount][labelcount];
+				labels = new String[labelcount];
+				for (int i = 0; i < labelcount; i++) {
+					NodeList cells = ((TableTableRowElement) row.item(i)).getElementsByTagNameNS(
+							OdfDocumentNamespace.TABLE.getUri(), "table-cell");
+					labels[i] = ((OdfTextParagraph) ((TableTableCellElement) cells.item(0)).getElementsByTagNameNS(
+							OdfDocumentNamespace.TEXT.getUri(), "p").item(0)).getTextContent();
+					for (int j = 0; j < legendcount; j++) {
+						String aValue = ((TableTableCellElement) cells.item(j + 1)).getOdfAttributeValue(OdfName
+								.newName(OdfNamespace.newNamespace(OdfDocumentNamespace.OFFICE), "value"));
+						if (aValue == null || aValue.equals("")) {
+							values[j][i] = Double.NaN;
+						} else {
+							values[j][i] = Double.valueOf(aValue).doubleValue();
+						}
+					}
+				}
+				dataSet.setValues(labels, legends, values);
+			}
+		}
+		return dataSet;
+	}
+
+	/**
+	 * chart title manipulation, get the current chart title
+	 * 
+	 * @return return the chart title
+	 */
+	public String getChartTitle() {
+		if (chartTitle == null) {
+			chartTitle = (ChartTitleElement) chartElement.getElementsByTagName(
+					ChartTitleElement.ELEMENT_NAME.getQName()).item(0);
+		}
+		NodeList paras = (NodeList) chartTitle.getElementsByTagName(TextPElement.ELEMENT_NAME.getQName());
+		if (paras.getLength() > 0) {
+			return paras.item(0).getTextContent();
+		} else {
+			return "";
+		}
+	}
+
+	/**
+	 * chart type manipulation, get the current chart type
+	 * 
+	 * @return the chart type
+	 */
+	public ChartType getChartType() {
+		return ChartType.enumValueOf(chartElement.getChartClassAttribute());
+	}
+
+	/**
+	 * chart id manipulation, get the current chart id
+	 * 
+	 * @return the chart id
+	 */
+	public String getChartID() {
+		return chartID;
+	}
+
+	/**
+	 * chart legend manipulation
+	 * 
+	 *@return returns true if it is using legend, otherwise returns false
+	 */
+	public boolean isUseLegend() {
+		return isUseLegend;
+	}
+
+	/**
+	 * 3D effect manipulation, set to apply 3D effect
+	 * 
+	 * @param _3deffect
+	 *            a flag specifying whether or not apply a 3D effect
+	 */
+	public void setApply3DEffect(boolean _3deffect) {
+		isApply3DEffect = _3deffect;
+		if (_3deffect) {
+			legend.setProperty(StyleGraphicPropertiesElement.Stroke, "none");
+			legend.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+			legend.setProperty(StyleGraphicPropertiesElement.Fill, "none");
+			legend.setProperty(StyleGraphicPropertiesElement.FillColor, "#e6e6e6");
+			legend.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+			legend.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+			legend.setProperty(StyleTextPropertiesElement.FontSizeComplex, "10pt");
+
+			plotArea.setDr3dVpnAttribute("(0.416199821709347 0.173649045905254 0.892537795986984)");
+			plotArea.setDr3dVrpAttribute("(17634.6218373783 10271.4823817647 24594.8639082739)");
+			plotArea.setDr3dVupAttribute("(-0.0733876362771618 0.984807599917971 -0.157379306090273)");
+			plotArea.setDr3dProjectionAttribute(Dr3dProjectionAttribute.Value.PARALLEL.toString());
+			plotArea.setDr3dDistanceAttribute("4.2cm");
+			plotArea.setDr3dFocalLengthAttribute("8cm");
+			plotArea.setDr3dShadowSlantAttribute("0");
+			plotArea.setDr3dShadeModeAttribute(Dr3dShadeModeAttribute.Value.FLAT.toString());
+			plotArea.setDr3dAmbientColorAttribute("#999999");
+			plotArea.setDr3dLightingModeAttribute("");
+
+			plotArea.setProperty(StyleChartPropertiesElement.ThreeDimensional, "true");
+			plotArea.setProperty(StyleChartPropertiesElement.SortByXValues, "false");
+			plotArea.setProperty(StyleChartPropertiesElement.RightAngledAxes, "true");
+
+			NodeList chartAxises = (NodeList) plotArea.getElementsByTagName(ChartAxisElement.ELEMENT_NAME.getQName());
+			for (int i = 0; i < chartAxises.getLength(); i++) {
+				ChartAxisElement axis = (ChartAxisElement) chartAxises.item(i);
+				if (axis.getChartDimensionAttribute().equals("x")) {
+					// x axis
+					axis.setProperty(StyleChartPropertiesElement.DisplayLabel, "true");
+					axis.setProperty(StyleChartPropertiesElement.Logarithmic, "false");
+					axis.setProperty(StyleChartPropertiesElement.ReverseDirection, "false");
+					axis.setProperty(StyleChartPropertiesElement.LineBreak, "false");
+					axis.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+					axis.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeComplex, "10pt");
+				}
+				if (axis.getChartDimensionAttribute().equals("y")) {
+					// y axis
+					axis.setProperty(StyleTextPropertiesElement.FontSize, "9pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeAsian, "9pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeComplex, "9pt");
+				}
+				if (axis.getChartDimensionAttribute().equals("z")) {
+					// z axis
+					axis.setProperty(StyleChartPropertiesElement.DisplayLabel, "true");
+					axis.setProperty(StyleChartPropertiesElement.Logarithmic, "false");
+					axis.setProperty(StyleChartPropertiesElement.ReverseDirection, "false");
+					axis.setProperty(StyleChartPropertiesElement.LineBreak, "false");
+					axis.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+					axis.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeComplex, "10pt");
+				}
+			}
+
+			Dr3dLightElement light1 = plotArea.newDr3dLightElement("");
+			light1.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light1.setDr3dDirectionAttribute("(0 0 1)");
+			light1.setDr3dEnabledAttribute(new Boolean(false));
+			light1.setDr3dSpecularAttribute(new Boolean(true));
+			Dr3dLightElement light2 = plotArea.newDr3dLightElement("");
+			light2.setDr3dDiffuseColorAttribute("#999999");
+			light2.setDr3dDirectionAttribute("(-0.2 0.7 0.6)");
+			light2.setDr3dEnabledAttribute(new Boolean(true));
+			light2.setDr3dSpecularAttribute(new Boolean(false));
+			Dr3dLightElement light3 = plotArea.newDr3dLightElement("");
+			light3.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light3.setDr3dDirectionAttribute("(0 0 1)");
+			light3.setDr3dEnabledAttribute(new Boolean(false));
+			light3.setDr3dSpecularAttribute(new Boolean(false));
+			Dr3dLightElement light4 = plotArea.newDr3dLightElement("");
+			light4.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light4.setDr3dDirectionAttribute("(0 0 1)");
+			light4.setDr3dEnabledAttribute(new Boolean(false));
+			light4.setDr3dSpecularAttribute(new Boolean(false));
+			Dr3dLightElement light5 = plotArea.newDr3dLightElement("");
+			light5.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light5.setDr3dDirectionAttribute("(0 0 1)");
+			light5.setDr3dEnabledAttribute(new Boolean(false));
+			light5.setDr3dSpecularAttribute(new Boolean(false));
+			Dr3dLightElement light6 = plotArea.newDr3dLightElement("");
+			light6.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light6.setDr3dDirectionAttribute("(0 0 1)");
+			light6.setDr3dEnabledAttribute(new Boolean(false));
+			light6.setDr3dSpecularAttribute(new Boolean(false));
+			Dr3dLightElement light7 = plotArea.newDr3dLightElement("");
+			light7.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light7.setDr3dDirectionAttribute("(0 0 1)");
+			light7.setDr3dEnabledAttribute(new Boolean(false));
+			light7.setDr3dSpecularAttribute(new Boolean(false));
+			Dr3dLightElement light8 = plotArea.newDr3dLightElement("");
+			light8.setDr3dDiffuseColorAttribute("#b3b3b3");
+			light8.setDr3dDirectionAttribute("(0 0 1)");
+			light8.setDr3dEnabledAttribute(new Boolean(false));
+			light8.setDr3dSpecularAttribute(new Boolean(false));
+		} else {
+			NodeList lights = plotArea.getElementsByTagName(Dr3dLightElement.ELEMENT_NAME.getQName());
+			for (int i = 0; i < lights.getLength(); i++) {
+				plotArea.removeChild(lights.item(i));
+			}
+			if (lights.getLength() > 0) {
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "vpn");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "vrn");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "vun");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "projection");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "distance");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "focal-length");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "shadow-slant");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "shade-mode");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "ambient-color");
+				plotArea.removeAttributeNS(OdfDocumentNamespace.SVG.getUri(), "lighting-mode");
+				plotArea.removeProperty(StyleChartPropertiesElement.ThreeDimensional);
+				plotArea.removeProperty(StyleChartPropertiesElement.SortByXValues);
+				plotArea.setProperty(StyleChartPropertiesElement.RightAngledAxes, "true");
+			}
+			NodeList chartAxises = (NodeList) plotArea.getElementsByTagName(ChartAxisElement.ELEMENT_NAME.getQName());
+			for (int i = 0; i < chartAxises.getLength(); i++) {
+				ChartAxisElement axis = (ChartAxisElement) chartAxises.item(i);
+				if (axis.getChartDimensionAttribute().equals("x")) {
+					// x axis
+					axis.setProperty(StyleChartPropertiesElement.DisplayLabel, "true");
+					axis.setProperty(StyleChartPropertiesElement.Logarithmic, "false");
+					axis.setProperty(StyleChartPropertiesElement.ReverseDirection, "false");
+					axis.setProperty(StyleChartPropertiesElement.LineBreak, "false");
+					axis.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+					axis.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeComplex, "10pt");
+				}
+
+				if (axis.getChartDimensionAttribute().equals("y")) {
+					// y axis
+					axis.setProperty(StyleChartPropertiesElement.DisplayLabel, "true");
+					axis.setProperty(StyleChartPropertiesElement.Logarithmic, "false");
+					axis.setProperty(StyleChartPropertiesElement.ReverseDirection, "false");
+					axis.setProperty(StyleChartPropertiesElement.LineBreak, "false");
+					axis.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+					axis.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+					axis.setProperty(StyleTextPropertiesElement.FontCharsetComplex, "10pt");
+				}
+
+				if (axis.getChartDimensionAttribute().equals("z")) {
+					// z axis
+					axis.removeProperty(StyleChartPropertiesElement.DisplayLabel);
+					axis.removeProperty(StyleChartPropertiesElement.Logarithmic);
+					axis.removeProperty(StyleChartPropertiesElement.ReverseDirection);
+					axis.removeProperty(StyleChartPropertiesElement.LineBreak);
+					axis.removeProperty(StyleGraphicPropertiesElement.StrokeColor);
+					axis.removeProperty(StyleTextPropertiesElement.FontSize);
+					axis.removeProperty(StyleTextPropertiesElement.FontSizeAsian);
+					axis.removeProperty(StyleTextPropertiesElement.FontSizeComplex);
+				}
+			}
+		}
+	}
+
+	/**
+	 * chart axis manipulation, set the chart axis title according to the give
+	 * dimension
+	 * 
+	 * @param dimType
+	 *            the chart axis dimension, x,y, or z
+	 * @param title
+	 *            the title of axis
+	 */
+	public void setAxisTitle(String dimType, String title) {
+		NodeList chartAxises = (NodeList) plotArea.getElementsByTagName(ChartAxisElement.ELEMENT_NAME.getQName());
+		for (int i = 0; i < chartAxises.getLength(); i++) {
+			ChartAxisElement axis = (ChartAxisElement) chartAxises.item(i);
+			String dimension = axis.getAttributeNS(OdfDocumentNamespace.CHART.getUri(), "dimension");
+			if (dimension.equals(dimType)) {
+				NodeList titles = axis.getElementsByTagName(ChartTitleElement.ELEMENT_NAME.getQName());
+				ChartTitleElement axisTitle;
+				if (titles.getLength() == 0) {
+					axisTitle = axis.newChartTitleElement();
+					if (dimension.equals(ChartDimensionAttribute.Value.x.toString())) {
+						axisTitle.setSvgXAttribute(AXIS_SVG_X);
+						axisTitle.setSvgYAttribute(AXIS_SVG_Y);
+					} else {
+						axisTitle.setSvgXAttribute("0.161cm");
+						axisTitle.setSvgYAttribute("4.188cm");
+					}
+
+					axisTitle.setProperty(StyleTextPropertiesElement.FontSize, AXIS_FONTSIZE);
+					axisTitle.setProperty(StyleTextPropertiesElement.FontSizeAsian, AXIS_FONTSIZEASIAN);
+					axisTitle.setProperty(StyleTextPropertiesElement.FontSizeComplex, AXIS_FONTSIZECOMPLEX);
+				} else {
+					axisTitle = (ChartTitleElement) titles.item(0);
+				}
+				NodeList paras = axisTitle.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+				if (paras.getLength() == 0) {
+					axisTitle.newTextPElement().setTextContent(title);
+				} else {
+					TextPElement para0 = (TextPElement) paras.item(0);
+					para0.setTextContent(title);
+
+				}
+			}
+		}
+	}
+
+	/**
+	 * chart data manipulation, set chart data
+	 * 
+	 * @param dataset
+	 *            the data set for the chart, which is a 2 dimensional data
+	 *            container
+	 */
+	public void setChartData(DataSet dataset) {
+		this.dataSet = dataset;
+		boolean isFirstRowAsLabel = dataSet.isFirstRowAsLabel();
+		boolean isFirstColumnAsLabel = dataSet.isFirstColumnAsLabel();
+		boolean isRowAsSeries = dataSet.isRowAsDataSeries();
+
+		setPlotArea();
+		NodeList tables = chartElement.getElementsByTagNameNS(OdfDocumentNamespace.CHART.getUri(), "table");
+		if (tables.getLength() > 0) {
+			chartElement.removeChild(tables.item(0));
+		}
+
+		// judge the cell range or local data
+		/*
+		 * if (dataset.getCellRangeAddress() != null) {
+		 * plotArea.setTableCellRangeAddressAttribute
+		 * (dataset.getCellRangeAddress().toString()); if
+		 * (dataset.isFirstColumnAsLabel() && dataset.isFirstRowAsLabel())
+		 * plotArea
+		 * .setChartDataSourceHasLabelsAttribute(ChartDataSourceHasLabelsAttribute
+		 * .Value.BOTH.toString()); else if (dataset.isFirstColumnAsLabel())
+		 * plotArea
+		 * .setChartDataSourceHasLabelsAttribute(ChartDataSourceHasLabelsAttribute
+		 * .Value.COLUMN.toString()); else if (dataset.isFirstRowAsLabel())
+		 * plotArea
+		 * .setChartDataSourceHasLabelsAttribute(ChartDataSourceHasLabelsAttribute
+		 * .Value.ROW.toString()); if (dataset.isRowAsDataSeries())
+		 * plotArea.setProperty(StyleChartPropertiesElement.SeriesSource,
+		 * "rows"); else
+		 * plotArea.setProperty(StyleChartPropertiesElement.SeriesSource,
+		 * "columns"); }
+		 */
+
+		table = chartElement.newTableTableElement();
+		headerColumns = table.newTableTableHeaderColumnsElement();
+		headerColumns.newTableTableColumnElement();
+		columns = table.newTableTableColumnsElement();
+		column = columns.newTableTableColumnElement();
+		headerRows = table.newTableTableHeaderRowsElement();
+		headerRow = headerRows.newTableTableRowElement();
+		rows = table.newTableTableRowsElement();
+
+		// create table lable cells
+		int numColumns = dataset.getLocalTableFirstRow().length;
+		int numRows = dataset.getLocalTableFirstColumn().length;
+		column.setTableNumberColumnsRepeatedAttribute(new Integer(numColumns));
+		headerRow.newTableTableCellElement(0.0, "string");
+		Object[] labelCellRange = getLabelCellRange();
+		Object[] valueCellRange = getValueCellRange();
+		for (int i = 0; i < numColumns; i++) {
+			TableTableCellElement cell = headerRow.newTableTableCellElement(0.0, "string");
+			cell.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			String[] cellContents = dataset.getLocalTableFirstRow();
+			OdfTextParagraph paragraph = (OdfTextParagraph) cell.newTextPElement();
+
+			if (isFirstRowAsLabel && !isRowAsSeries) {
+				if ((String) labelCellRange[i] != null) {
+					paragraph.setTextIdAttribute((String) labelCellRange[i]);
+				}
+			}
+			if (isFirstRowAsLabel && isRowAsSeries && i == 0) {
+				if ((String) getTableCellRange() != null) {
+					paragraph.setTextIdAttribute(getTableCellRange());
+				}
+			}
+			if (cellContents[i] != null) {
+				paragraph.setTextContent(cellContents[i]);
+			} else {
+				paragraph.setTextContent("");
+			}
+		}
+
+		// create table rows
+		Double[][] cellValues = dataset.getLocalTableData();
+		for (int i = 0; i < numRows; i++) {
+			TableTableRowElement row = rows.newTableTableRowElement();
+			TableTableCellElement nameCell = row.newTableTableCellElement(0.0, "string");
+			nameCell.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			OdfTextParagraph paragraph = (OdfTextParagraph) nameCell.newTextPElement();
+			String[] cellContents = dataset.getLocalTableFirstColumn();
+			if (cellContents[i] != null) {
+				if (isFirstColumnAsLabel) {
+					if (isRowAsSeries) {
+						paragraph.setTextIdAttribute((String) labelCellRange[i]);
+					}
+					if (!isRowAsSeries && i == 0) {
+						paragraph.setTextIdAttribute(getTableCellRange());
+					}
+				}
+				paragraph.setTextContent(cellContents[i]);
+			} else {
+				paragraph.setTextContent("");
+			}
+			for (int j = 0; j < numColumns; j++) {
+				TableTableCellElement cell = row.newTableTableCellElement(0.0, "string");
+				cell.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.FLOAT.toString());
+				if (cellValues[i][j] != null) {
+					cell.setOfficeValueAttribute(cellValues[i][j]);
+					OdfTextParagraph paragraph1 = (OdfTextParagraph) cell.newTextPElement();
+					paragraph1.setTextContent(cellValues[i][j].toString());
+					if (isRowAsSeries && j == 0) {
+						paragraph1.setTextIdAttribute((String) valueCellRange[i]);
+					}
+					if (!isRowAsSeries && i == 0) {
+						paragraph1.setTextIdAttribute((String) valueCellRange[j]);
+					}
+				} else {
+					cell.setOfficeValueAttribute(new Double(Double.NaN));
+					OdfTextParagraph paragraph1 = (OdfTextParagraph) cell.newTextPElement();
+					paragraph1.setTextContent("1.#NAN");
+					if (isRowAsSeries && j == 0) {
+						paragraph1.setTextIdAttribute((String) valueCellRange[i]);
+					}
+					if (!isRowAsSeries && i == 0) {
+						paragraph1.setTextIdAttribute((String) valueCellRange[j]);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * chart title manipulation, get the current chart title
+	 * 
+	 * @return return the chart title
+	 */
+	public boolean setChartTitle(String title) {
+
+		// chart:title
+		NodeList titles = chartElement.getElementsByTagNameNS(OdfDocumentNamespace.CHART.getUri(), "title");
+		if (titles.getLength() == 0) {
+			chartTitle = chartElement.newChartTitleElement();
+			chartTitle.setSvgXAttribute("3.669cm");
+			chartTitle.setSvgYAttribute("0.141cm");
+			chartTitle.setProperty(StyleTextPropertiesElement.FontSize, "12pt");
+			chartTitle.setProperty(StyleTextPropertiesElement.FontSizeAsian, "12pt");
+			chartTitle.setProperty(StyleTextPropertiesElement.FontSizeComplex, "12pt");
+		} else {
+			chartTitle = (ChartTitleElement) titles.item(0);
+		}
+		NodeList paras = chartTitle.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+		if (paras.getLength() == 0) {
+			chartTitle.newTextPElement().setTextContent(title);
+		} else {
+			OdfTextParagraph para0 = (OdfTextParagraph) paras.item(0);
+			para0.setTextContent(title);
+		}
+		return true;
+	}
+
+	/**
+	 * chart type manipulation, set a chart type when chart type is changed, all
+	 * the corresponding chart behaviors and properties should be changed
+	 * accordingly
+	 * 
+	 * @param type
+	 *            the type of chart
+	 */
+	public void setChartType(ChartType type) {
+
+		// set chart:class for chart:chart element
+		chartElement.setChartClassAttribute(type.toString());
+		// set chart:class for the chart:series
+		NodeList plotAreas = chartElement.getElementsByTagName(ChartPlotAreaElement.ELEMENT_NAME.getQName());
+
+		if (plotAreas.getLength() > 0) {
+			ChartPlotAreaElement plotArea = (ChartPlotAreaElement) plotAreas.item(0);
+			NodeList series = plotArea.getElementsByTagName(ChartSeriesElement.ELEMENT_NAME.getQName());
+			for (int i = 0; i < series.getLength(); i++) {
+				ChartSeriesElement serie = (ChartSeriesElement) series.item(i);
+				serie.setChartClassAttribute(type.toString());
+			}
+		}
+	}
+
+	/**
+	 * chart legend manipulation, get whether the chart use legend
+	 * 
+	 * @param useLegend
+	 *            a flag specifying whether or not use legend
+	 */
+	public void setUseLegend(boolean useLegend) {
+		this.isUseLegend = useLegend;
+		NodeList legends = chartElement.getElementsByTagNameNS(OdfDocumentNamespace.CHART.getUri(), "legend");
+		if (useLegend) {
+			if (legends.getLength() == 0) {
+				legend = chartElement.newChartLegendElement(ChartLegendPositionAttribute.Value.TOP_END.toString(),
+						StyleLegendExpansionAttribute.Value.BALANCED.toString());
+				legend.setSvgXAttribute("6.715cm");
+				legend.setSvgYAttribute("3.192cm");
+				legend.setProperty(StyleGraphicPropertiesElement.Stroke, "none");
+				legend.setProperty(StyleGraphicPropertiesElement.StrokeColor, "#b3b3b3");
+				legend.setProperty(StyleGraphicPropertiesElement.Fill, "none");
+				legend.setProperty(StyleGraphicPropertiesElement.FillColor, "#e6e6e6");
+				legend.setProperty(StyleTextPropertiesElement.FontSize, "10pt");
+				legend.setProperty(StyleTextPropertiesElement.FontSizeAsian, "10pt");
+				legend.setProperty(StyleTextPropertiesElement.FontSizeComplex, "10pt");
+			}
+		} else {
+			if (legends.getLength() > 0) {
+				chartElement.removeChild(legends.item(0));
+			}
+		}
+
+	}
+
+	/**
+	 * Refresh chart view and data setting.
+	 */
+	public void refreshChart() {
+		setPlotArea();
+		setChartData(dataSet);
+	}
+
+	private String getRandColorCode() {
+		String r, g, b;
+		Random random = new Random();
+		r = Integer.toHexString(random.nextInt(256)).toUpperCase();
+		g = Integer.toHexString(random.nextInt(256)).toUpperCase();
+		b = Integer.toHexString(random.nextInt(256)).toUpperCase();
+
+		r = r.length() == 1 ? "0" + r : r;
+		g = g.length() == 1 ? "0" + g : g;
+		b = b.length() == 1 ? "0" + b : b;
+		return "#" + r + g + b;
+	}
+
+	private Object[] getValueCellRange() {
+		Vector<String> seriesCellRange = new Vector<String>();
+		Vector<String> legendCellAddr = new Vector<String>();
+		if (dataSet.isLocalTable()) {
+			dataSet.getLocalTableCellRanges(dataSet.getDataSeriesCount(), dataSet.getLabels().length, seriesCellRange,
+					legendCellAddr);
+		} else {
+			dataSet.getCellRanges(dataSet.getCellRangeAddress().toString(), dataSet.isFirstRowAsLabel(), dataSet
+					.isFirstColumnAsLabel(), dataSet.isRowAsDataSeries(), seriesCellRange, legendCellAddr);
+		}
+		return seriesCellRange.toArray();
+	}
+
+	private Object[] getLabelCellRange() {
+		Vector<String> seriesCellRange = new Vector<String>();
+		Vector<String> legendCellAddr = new Vector<String>();
+		if (dataSet.isLocalTable()) {
+			getLocalTableCellRanges(dataSet.getDataSeriesCount(), dataSet.getLabels().length, seriesCellRange,
+					legendCellAddr);
+		} else {
+			getCellRanges(dataSet.getCellRangeAddress().toString(), dataSet.isFirstRowAsLabel(), dataSet
+					.isFirstColumnAsLabel(), dataSet.isRowAsDataSeries(), seriesCellRange, legendCellAddr);
+		}
+		return legendCellAddr.toArray();
+	}
+
+	private String getTableCellRange() {
+		Vector<String> seriesCellRange = new Vector<String>();
+		Vector<String> legendCellAddr = new Vector<String>();
+		String cellRange;
+		if (dataSet.isLocalTable()) {
+			cellRange = getLocalTableCellRanges(dataSet.getDataSeriesCount(), dataSet.getLabels().length,
+					seriesCellRange, legendCellAddr);
+		} else {
+			cellRange = getCellRanges(dataSet.getCellRangeAddress().toString(), dataSet.isFirstRowAsLabel(), dataSet
+					.isFirstColumnAsLabel(), dataSet.isRowAsDataSeries(), seriesCellRange, legendCellAddr);
+		}
+		return cellRange;
+	}
+
+	// return label cell ranges
+	private String getCellRanges(String tablecellrange, boolean bFirstRowAsLabel, boolean bFirstColumnAsLabel,
+			boolean rowAsDataSeries, Vector<String> seriesCellRange, Vector<String> legendCellAddr) {
+		// prepare variables
+		String labelCellRange = null;
+		if (seriesCellRange == null)
+			seriesCellRange = new Vector<String>();
+		else
+			seriesCellRange.removeAllElements();
+		if (legendCellAddr == null)
+			legendCellAddr = new Vector<String>();
+		else
+			legendCellAddr.removeAllElements();
+
+		// seperate column and row from cell range
+		StringTokenizer st = new StringTokenizer(tablecellrange, ".:$ ");
+		if (st.countTokens() < 3)
+			return null;
+
+		String sheettable = st.nextToken();
+		String begincell = st.nextToken();
+		String endcell = st.nextToken();
+		if (st.hasMoreTokens()) {
+			endcell = st.nextToken();
+		}
+		char beginColumn = begincell.charAt(0);
+		char endColumn = endcell.charAt(0);
+		int beginRow = Integer.parseInt(begincell.substring(1));
+		int endRow = Integer.parseInt(endcell.substring(1));
+
+		if (rowAsDataSeries) {
+			int starti = beginRow + 1;
+			if (!bFirstRowAsLabel) {
+				labelCellRange = null;
+				starti = beginRow;
+			} else if (bFirstColumnAsLabel)
+				labelCellRange = createCellRange(sheettable, beginRow, (char) (beginColumn + 1), beginRow, endColumn);
+			else
+				labelCellRange = createCellRange(sheettable, beginRow, beginColumn, beginRow, endColumn);
+			for (int i = starti; i < endRow + 1; i++) {
+				if (bFirstColumnAsLabel) {
+					seriesCellRange.add(createCellRange(sheettable, i, (char) (beginColumn + 1), i, endColumn));
+				} else {
+					seriesCellRange.add(createCellRange(sheettable, i, beginColumn, i, endColumn));
+				}
+				if (bFirstColumnAsLabel) {
+					legendCellAddr.add(sheettable + "." + beginColumn + i);
+				} else {
+					legendCellAddr.add(null);
+				}
+			}
+		} else {
+			char startch = (char) (beginColumn + 1);
+			if (!bFirstColumnAsLabel) {
+				labelCellRange = null;
+				startch = beginColumn;
+			} else if (bFirstRowAsLabel)
+				labelCellRange = createCellRange(sheettable, beginRow + 1, beginColumn, endRow, beginColumn);
+			else
+				labelCellRange = createCellRange(sheettable, beginRow, beginColumn, endRow, beginColumn);
+
+			for (char ch = startch; ch <= endColumn; ch++) {
+				if (bFirstRowAsLabel)
+					seriesCellRange.add(createCellRange(sheettable, beginRow + 1, ch, endRow, ch));
+				else
+					seriesCellRange.add(createCellRange(sheettable, beginRow, ch, endRow, ch));
+
+				if (bFirstRowAsLabel)
+					legendCellAddr.add(sheettable + "." + ch + beginRow);
+				else
+					legendCellAddr.add(null);
+			}
+		}
+		return labelCellRange;
+	}
+
+	// return legend cell ranges
+	private String getLocalTableCellRanges(int seriesCount, int labelLength, Vector<String> seriesCellRange,
+			Vector<String> legendCellAddr) {
+		String localtable = "local-table";
+		String tablecellrange = localtable + "." + "A1:" + (char) ('A' + seriesCount) + (1 + labelLength);
+		return dataSet.getCellRanges(tablecellrange, true, true, false, seriesCellRange, legendCellAddr);
+	}
+
+	private String createCellRange(String table, int beginRow, char beginColumn, int endRow, char endColumn) {
+		return table + "." + beginColumn + beginRow + ":" + table + "." + endColumn + endRow;
+	}
+}
\ No newline at end of file
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/chart/ChartContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/ChartContainer.java
new file mode 100644
index 0000000..613b26b
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/ChartContainer.java
@@ -0,0 +1,142 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.chart;
+
+import java.awt.Rectangle;
+import java.util.List;
+
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.SpreadsheetDocument;
+
+/**
+ * ChartContainer is a container which maintains Chart(s) as element(s).
+ * Chart(s) can be added, removed and iterated in this container.
+ * 
+ * @see Chart
+ * @see org.odftoolkit.simple.TextDocument
+ * @see org.odftoolkit.simple.SpreadsheetDocument
+ * @see org.odftoolkit.simple.PresentationDocument
+ * @see org.odftoolkit.simple.presentation.Slide
+ * 
+ * @since 0.6
+ */
+public interface ChartContainer {
+
+	/**
+	 * Creates a new Chart for this container.
+	 * 
+	 * @param title
+	 *            chart title.
+	 * @param dataset
+	 *            chart data set.
+	 * @param rect
+	 *            chart rectangle.
+	 * @return the created chart.
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, DataSet dataset, Rectangle rect);
+
+	/**
+	 * Creates a new Chart for this container.
+	 * 
+	 * @param title
+	 *            chart title.
+	 * @param document
+	 *            the data source spreadsheet document.
+	 * @param cellRangeAddr
+	 *            the cell range address list which is used as chart data set.
+	 * @param firstRowAsLabel
+	 *            whether uses first row as label.
+	 * @param firstColumnAsLabel
+	 *            whether uses first column as label.
+	 * @param rowAsDataSeries
+	 *            whether uses data as series.
+	 * @param rect
+	 *            chart rectangle.
+	 * @return the created chart.
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr,
+			boolean firstRowAsLabel, boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect);
+
+	/**
+	 * Creates a new Chart for this container.
+	 * 
+	 * @param title
+	 *            chart rectangle.
+	 * @param labels
+	 *            label strings
+	 * @param legends
+	 *            legend strings
+	 * @param data
+	 *            chart data set.
+	 * @param rect
+	 *            chart rectangle.
+	 * @return the created chart.
+	 * @since 0.6
+	 */
+	public Chart createChart(String title, String[] labels, String[] legends, double[][] data, Rectangle rect);
+
+	/**
+	 * Deletes chart by chart id.
+	 * 
+	 * @param chartId
+	 *            the id of specified chart.
+	 * @since 0.6
+	 */
+	public void deleteChartById(String chartId);
+
+	/**
+	 * Deletes chart(s) by chart title.
+	 * 
+	 * @param title
+	 *            the title of specified chart(s).
+	 * @since 0.6
+	 */
+	public void deleteChartByTitle(String title);
+
+	/**
+	 * Gets chart with specified id.
+	 * 
+	 * @param chartId
+	 *            the id of this chart.
+	 * @return the chart with specified id.
+	 * @since 0.6
+	 */
+	public Chart getChartById(String chartId);
+
+	/**
+	 * Gets chart list with specified title.
+	 * 
+	 * @param title
+	 *            the title of specified chart(s).
+	 * @return the chart(s) with specified title.
+	 * @since 0.6
+	 */
+	public List<Chart> getChartByTitle(String title);
+
+	/**
+	 * Returns the chart count of this container
+	 * 
+	 * @return the chart count of this container
+	 * @since 0.6
+	 */
+	public int getChartCount();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/chart/ChartType.java b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/ChartType.java
new file mode 100644
index 0000000..1fb4f31
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/ChartType.java
@@ -0,0 +1,89 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.chart;
+
+/**
+ * The value set of chart type.
+ * 
+ * @since 0.6
+ */
+public enum ChartType {
+
+	/**
+	 * BAR, The bar type chart
+	 */
+	BAR("chart:bar"),
+	/**
+	 * PIE, The pie type chart
+	 */
+	PIE("chart:circle"),
+	/**
+	 * RING, The ring type chart
+	 */
+	RING("chart:ring"),
+	/**
+	 * AREA, The area type chart
+	 */
+	AREA("chart:area"),
+	/**
+	 * LINE, The line type chart
+	 */
+	LINE("chart:line"),
+	/**
+	 * SCATTER, The scatter type chart
+	 */
+	SCATTER("chart:scatter"),
+	/**
+	 * RADAR, The radar type chart
+	 */
+	RADAR("chart:radar"),
+	/**
+	 * STOCK, The stock type chart
+	 */
+	STOCK("chart:stock");
+
+	private String m_aValue;
+
+	private ChartType(String _aValue) {
+		m_aValue = _aValue;
+	}
+	
+
+	@Override
+	public String toString() {
+		return m_aValue;
+	}
+
+	/**
+	 * Returns the enum of ChartType string.
+	 * 
+	 * @param mString
+	 *            the string value
+	 * @return the enum of ChartType.
+	 */
+	public static ChartType enumValueOf(String mString) {
+		for (ChartType aIter : values()) {
+			if (mString.equals(aIter.toString())) {
+				return aIter;
+			}
+		}
+		return null;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/chart/DataSet.java b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/DataSet.java
new file mode 100644
index 0000000..cf63fbf
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/chart/DataSet.java
@@ -0,0 +1,800 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.chart;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.odftoolkit.odfdom.type.CellRangeAddress;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.w3c.dom.NodeList;
+
+/**
+ * DataSet is wrapper class for chart data. Generally it is a 2 dimensional data
+ * container, a set of chart data series. Each data series has a key, i.e. chart
+ * label. The data may be a 2 dimensional double array, or a cell range address
+ * of a sheet in Spreadsheet document. DataSet provides some convenient methods
+ * for users to manipulate specific data series in the chart data.
+ * 
+ * @since 0.6
+ */
+
+public class DataSet {
+
+	private Vector<Vector<Double>> dataset; // The second vector is a data
+											// series.
+	private Vector<String> labelset; // label vector,
+	private Vector<String> legendset; // legend vector
+	// Vector<OdfCellRangeAddressList> seriesCellRange; //cellrange of data
+	// series
+	// Vector<String> legendCellRange;
+	// String cellRangeAddress;
+	private CellRangeAddressList cellRangeAddress;
+	private boolean bFirstRowAsLabel, bFirstColumnAsLabel, bRowAsDataSeries;
+	// Chart chart;
+	private boolean isLocalTable;
+
+	/**
+	 * Creates a new DataSet without argument.
+	 */
+	public DataSet() {
+		dataset = new Vector<Vector<Double>>();
+		labelset = new Vector<String>();
+		legendset = new Vector<String>();
+		bFirstRowAsLabel = true;
+		bFirstColumnAsLabel = true;
+		bRowAsDataSeries = false;
+		isLocalTable = false;
+	}
+
+	/**
+	 * Creates a new DataSet.
+	 * 
+	 * @param labels
+	 *            the label strings of this DataSet.
+	 * @param legends
+	 *            the legend strings of this DataSet.
+	 * @param data
+	 *            the data of this DataSet, which stores in 2 dimensional double
+	 *            array.
+	 */
+	public DataSet(String[] labels, String[] legends, double[][] data) {
+		dataset = new Vector<Vector<Double>>();
+		labelset = new Vector<String>();
+		legendset = new Vector<String>();
+		bFirstRowAsLabel = true;
+		bFirstColumnAsLabel = true;
+		bRowAsDataSeries = false;
+		isLocalTable = true;
+		setValues(labels, legends, data);
+
+	}
+
+	/**
+	 * Creates a new DataSet.
+	 * 
+	 * @param cellRangeAddress
+	 *            the cell range address, which is used as the data source.
+	 * @param spreadsheet
+	 *            the data source SpreadsheetDocument.
+	 * @param bFirstRowAsLabel
+	 *            whether this data set uses first row as chart label.
+	 * @param bFirstColumnAsLabel
+	 *            whether this data set uses first column as chart label.
+	 * @param rowAsDataSeries
+	 *            whether this data set uses row as data series.
+	 */
+	public DataSet(CellRangeAddressList cellRangeAddress, SpreadsheetDocument spreadsheet, boolean bFirstRowAsLabel,
+			boolean bFirstColumnAsLabel, boolean rowAsDataSeries) {
+		dataset = new Vector<Vector<Double>>();
+		labelset = new Vector<String>();
+		legendset = new Vector<String>();
+		this.bFirstRowAsLabel = bFirstRowAsLabel;
+		this.bFirstColumnAsLabel = bFirstColumnAsLabel;
+		bRowAsDataSeries = rowAsDataSeries;
+		isLocalTable = false;
+		setValues(cellRangeAddress, spreadsheet, bFirstRowAsLabel, bFirstColumnAsLabel, rowAsDataSeries);
+	}
+
+	// return legend cell ranges
+	/**
+	 * Gets the local table cell range.
+	 * 
+	 * @return the local table cell range,
+	 */
+	public String getLocalTableCellRanges(int seriesCount, int labelLength, Vector<String> seriesCellRange,
+			Vector<String> legendCellAddr) {
+		String localtable = "local-table";
+		String tablecellrange = localtable + "." + "A1:" + (char) ('A' + seriesCount) + (1 + labelLength);
+		return getCellRanges(tablecellrange, true, true, false, seriesCellRange, legendCellAddr);
+	}
+
+	/**
+	 * Gets the cell range address list.
+	 * 
+	 * @return the cell range address list.
+	 */
+	public CellRangeAddressList getCellRangeAddress() {
+		return cellRangeAddress;
+	}
+
+	/**
+	 * Adds a data series at the end of current data set.
+	 * 
+	 * @param legend
+	 *            legend for the data series.
+	 * @param values
+	 *            data series values corresponding to the legend.
+	 */
+	public void appendDataSeries(String legend, double[] values) {
+		legendset.add(legend);
+
+		Vector<Double> valuesList = new Vector<Double>();
+		for (int i = 0; i < values.length; i++) {
+			valuesList.add(new Double(values[i]));
+		}
+
+		dataset.add(valuesList);
+
+	}
+
+	/**
+	 * Adds a data series at the index in current data set.
+	 * 
+	 * @param index
+	 *            the index the added data series will be located.
+	 * @param legend
+	 *            legend for the data series.
+	 * @param values
+	 *            data series values corresponding to the legend.
+	 */
+	public void insertDataSeries(int index, String legend, double[] values) {
+		legendset.add(index, legend);
+
+		Vector<Double> valuesList = new Vector<Double>();
+		for (int i = 0; i < values.length; i++) {
+			valuesList.add(new Double(values[i]));
+		}
+		dataset.add(index, valuesList);
+
+	}
+
+	/**
+	 * Updates the data series values according to the index of the data series.
+	 * 
+	 * @param index
+	 *            the index of the data series in the data set.
+	 * @param values
+	 *            data series values.
+	 */
+	public void updateDataSeries(int index, double[] values) {
+		Vector<Double> valuesList = new Vector<Double>();
+		for (int i = 0; i < values.length; i++) {
+			valuesList.add(new Double(values[i]));
+		}
+		dataset.set(index, valuesList);
+
+	}
+
+	/**
+	 * Updates the data series values according to the legend of the data
+	 * series.
+	 * 
+	 * @param legend
+	 *            the chart legend of the data series.
+	 * @param values
+	 *            data series values.
+	 */
+	public void updateDataSeries(String legend, int beginindex, double[] values) {
+		Vector<Double> valuesList = new Vector<Double>();
+		for (int i = 0; i < values.length; i++) {
+			valuesList.add(new Double(values[i]));
+		}
+		dataset.set(getIndexOfDataSeries(legend, beginindex), valuesList);
+
+	}
+
+	/**
+	 * Removes a data series by the index of the data series in the data set.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set.
+	 */
+	public void removeDataSeries(int index) {
+		legendset.remove(index);
+		dataset.remove(index);
+	}
+
+	/**
+	 * Remove a data series by the legend of the data series.
+	 * 
+	 * @param legend
+	 *            the legend of the data series.
+	 */
+	public void removeDataSeries(String legend, int beginindex) {
+		int index = getIndexOfDataSeries(legend, beginindex);
+		removeDataSeries(index);
+	}
+
+	/**
+	 * Gets the index of the data series by its legend.
+	 * 
+	 * @param legend
+	 *            the legend of the data series.
+	 * @return index of the data series in the data set.
+	 */
+	public int getIndexOfDataSeries(String legend, int beginindex) {
+		return legendset.indexOf(legend, beginindex);
+	}
+
+	/**
+	 * Gets the legend of the data series by its index in the data set.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set.
+	 * @return the legend of the data series.
+	 */
+	public String getLegendByIndex(int index) {
+		return legendset.get(index);
+	}
+
+	/**
+	 * Sets or change the legend of the data series by its index in the data
+	 * set.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set.
+	 * @param legend
+	 *            the legend of the data series.
+	 */
+	public void setLegendByIndex(int index, String legend) {
+		legendset.set(index, legend);
+	}
+
+	/**
+	 * Gets the legend of the data series by its index in the data set.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set.
+	 * @return the label of the data series.
+	 */
+	public String getLabelByIndex(int index) {
+		return labelset.get(index);
+	}
+
+	/**
+	 * Sets or change the legend of the data series by its index in the data
+	 * set.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set.
+	 * @param label
+	 *            the label of the data series.
+	 */
+	public void setLabelByIndex(int index, String label) {
+		labelset.set(index, label);
+	}
+
+	/**
+	 * Gets the string array of labels.
+	 * 
+	 * @return the string array of labels.
+	 */
+	public String[] getLabels() {
+		return labelset.toArray(new String[1]);
+	}
+
+	/**
+	 * Gets the string array of legends.
+	 * 
+	 * @return the string array of legends.
+	 */
+	public String[] getLegends() {
+		return legendset.toArray(new String[1]);
+	}
+
+	/**
+	 * Gets whether this data set uses first row as chart label.
+	 * 
+	 * @return if return <code>true</code>, this data set uses first row as
+	 *         chart label.
+	 */
+	public boolean isFirstRowAsLabel() {
+		return bFirstRowAsLabel;
+	}
+
+	/**
+	 * Gets whether this data set uses first column as chart label.
+	 * 
+	 * @return if return <code>true</code>, this data set uses first row as
+	 *         chart label.
+	 */
+	public boolean isFirstColumnAsLabel() {
+		return bFirstColumnAsLabel;
+	}
+
+	/**
+	 * Gets whether this data set uses row as data series.
+	 * 
+	 * @return if return <code>true</code>, this data set uses row as data
+	 *         series.
+	 */
+	public boolean isRowAsDataSeries() {
+		return bRowAsDataSeries;
+	}
+
+	/**
+	 * Gets whether this data set uses local table.
+	 * 
+	 * @return if return <code>true</code>, this data set uses uses local table.
+	 */
+	public boolean isLocalTable() {
+		return isLocalTable;
+	}
+
+	/**
+	 * Sets this data set uses local table or not.
+	 * 
+	 * @param isLocalTable
+	 *            if the value is <code>true</code>, this data set uses uses
+	 *            local table.
+	 */
+	public void setLocalTable(boolean isLocalTable) {
+		this.isLocalTable = isLocalTable;
+	}
+
+	/**
+	 * Gets the values of a data series by its index in the data set.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set.
+	 * @return the values of the data series.
+	 */
+	public double[] getDataSeriesByIndex(int index) {
+		double[] doubleArray;
+		Vector<Double> values = dataset.elementAt(index);
+		doubleArray = new double[values.size()];
+		for (int i = 0; i < values.size(); i++)
+			doubleArray[i] = values.get(i).doubleValue();
+		return doubleArray;
+	}
+
+	/**
+	 * Gets the values of a data series by its legend, if multiple data series
+	 * have duplicated legends, return the values of the first matched data
+	 * series. we do not recommend the duplicated legends, but practically, some
+	 * ODF editors allow users to do that.
+	 * 
+	 * @param legend
+	 *            the legend of the data series
+	 * @return the values of the data series
+	 */
+	public double[] getDataSeriesByLegend(String legend, int beginindex) {
+		double[] doubleArray;
+		Vector<Double> values = dataset.elementAt(getIndexOfDataSeries(legend, beginindex));
+		doubleArray = new double[values.size()];
+		for (int i = 0; i < values.size(); i++)
+			doubleArray[i] = values.get(i).doubleValue();
+		return doubleArray;
+	}
+
+	/**
+	 * Gets the values of a data set as a double dimension array.
+	 * 
+	 * @return the values of the whole data set.
+	 */
+	public Double[][] getLocalTableData() {
+		// if rowAsDataSeries, the local table data needs to turn 90 degree
+		int seriescount, itemcount;
+		Double[][] doubleArray;
+
+		seriescount = legendset.size();
+		itemcount = labelset.size();
+		if (bRowAsDataSeries) {
+			doubleArray = new Double[seriescount][itemcount];
+		} else {
+			doubleArray = new Double[itemcount][seriescount];
+		}
+
+		for (int i = 0; i < seriescount; i++) {
+			Vector<Double> values = dataset.elementAt(i);
+			for (int j = 0; j < itemcount; j++) {
+				if (bRowAsDataSeries)
+					doubleArray[i][j] = values.get(j);
+				else
+					doubleArray[j][i] = values.get(j);
+			}
+		}
+
+		return doubleArray;
+	}
+
+	/**
+	 * Gets the first row labels of the local table.
+	 * 
+	 * @return the first row labels of the local table.
+	 */
+	public String[] getLocalTableFirstRow() {
+		if (bRowAsDataSeries)
+			return labelset.toArray(new String[1]);
+		else
+			return legendset.toArray(new String[1]);
+	}
+
+	/**
+	 * Gets the first column labels of the local table.
+	 * 
+	 * @return the first column labels of the local table.
+	 */
+	public String[] getLocalTableFirstColumn() {
+		if (bRowAsDataSeries)
+			return legendset.toArray(new String[1]);
+		else
+			return labelset.toArray(new String[1]);
+	}
+
+	/**
+	 * Gets the data item count of the data series given by the index.
+	 * 
+	 * @param index
+	 *            index of the data series in the data set
+	 * @return the data item count of the data series
+	 */
+	public int getLengthOfDataSeries(int index) {
+		Vector<Double> values = dataset.elementAt(index);
+		int length = values.size();
+		for (int i = values.size() - 1; i >= 0; i--) {
+			if (values.elementAt(i) == null)
+				length--;
+		}
+		return length;
+	}
+
+	/**
+	 * Gets the data item count of the data series given by the label.
+	 * 
+	 * @param legend
+	 *            the legend of the data series
+	 * @return the data item count of the data series
+	 */
+	public int getLengthOfDataSeries(String legend, int beginindex) {
+		int index = getIndexOfDataSeries(legend, beginindex);
+		return getLengthOfDataSeries(index);
+	}
+
+	/**
+	 * Gets the maximal data item count
+	 * 
+	 * @return the maximal data item count
+	 */
+	public int getMaxLengthOfDataSeries() {
+		int max = 0;
+		for (int i = 0; i < legendset.size(); i++) {
+			int length = getLengthOfDataSeries(i);
+			if (max < length)
+				max = length;
+		}
+		return max;
+	}
+
+	/**
+	 * Gets the count of data series in the data set.
+	 * 
+	 * @return the count of data series
+	 */
+	public int getDataSeriesCount() {
+		return legendset.size();
+	}
+
+	/**
+	 * Sets or updates data for the data set with 2 dimensional double array,
+	 * the first dimension represents the index of data series, the second
+	 * dimension represents the index of data item in each data series.
+	 * 
+	 * @param labels
+	 *            the chart labels, which is corresponding to the first
+	 *            dimension of data array.
+	 * @param data
+	 *            a 2 dimensional double array.
+	 */
+	public void setValues(String[] labels, String[] legends, double[][] data) {
+		this.isLocalTable = true;
+		this.bFirstColumnAsLabel = true;
+		this.bFirstRowAsLabel = true;
+		this.bRowAsDataSeries = false;
+		int seriescount = (legends.length <= data.length) ? legends.length : data.length;
+		int itemcount = (labels.length <= data[0].length) ? labels.length : data[0].length;
+		for (int i = 0; i < seriescount; i++) {
+			if (i < legends.length)
+				legendset.add(legends[i]);
+			else
+				legendset.add("" + (i + 1));
+			Vector<Double> series = new Vector<Double>();
+			for (int j = 0; j < itemcount; j++) {
+				if ((i < data.length) && (j < data[0].length))
+					series.add(new Double(data[i][j]));
+				else
+					series.add(null);
+			}
+			dataset.add(series);
+		}
+		for (int i = 0; i < itemcount; i++) {
+			if (i < labels.length)
+				labelset.add(labels[i]);
+			else
+				labelset.add("");
+		}
+	}
+
+	/**
+	 * Sets data for the data set with cell range address of sheet in
+	 * spreadsheet document or internal chart table in other chart containers.
+	 * 
+	 * @param cellRangeAddress
+	 *            cell range address of sheet or table.
+	 * @param spreadsheet
+	 *            the spreadsheet document instance, the cell address is
+	 *            relative to the spreadsheet document.
+	 * @param bFirstRowAsLabel
+	 *            whether this data set uses first row as chart label.
+	 * @param bFirstColumnAsLabel
+	 *            whether this data set uses first column as chart label.
+	 * @param rowAsDataSeries
+	 *            whether this data set uses row as data series.
+	 */
+	public void setValues(CellRangeAddressList cellRangeAddress, SpreadsheetDocument spreadsheet,
+			boolean bFirstRowAsLabel, boolean bFirstColumnAsLabel, boolean rowAsDataSeries) {
+		this.isLocalTable = false;
+		this.bFirstColumnAsLabel = bFirstColumnAsLabel;
+		this.bFirstRowAsLabel = bFirstRowAsLabel;
+		this.bRowAsDataSeries = rowAsDataSeries;
+		this.cellRangeAddress = cellRangeAddress;
+
+		// analysis cell range
+		String cellrange = ((CellRangeAddress) cellRangeAddress.getCellRangesAddressList().get(0)).toString();
+		// init variables
+		StringTokenizer st = new StringTokenizer(cellrange, ".:$ ");
+		if (st.countTokens() < 3)
+			return;
+
+		String sheettable = st.nextToken();
+		String begincell = st.nextToken();
+		String endcell = st.nextToken();
+		if (st.hasMoreTokens())
+			endcell = st.nextToken();
+
+		char beginColumn = begincell.charAt(0);
+		char endColumn = endcell.charAt(0);
+		int beginRow = Integer.parseInt(begincell.substring(1));
+		int endRow = Integer.parseInt(endcell.substring(1));
+
+		dataset = new Vector<Vector<Double>>();
+		Vector<String> rowLabels = new Vector<String>();
+		Vector<String> columnLabels = new Vector<String>();
+
+		try {
+			int i = 0, rowindex, columnindex;
+			char ch;
+			TableTableRowElement td;
+			TableTableCellElement cell;
+			OdfFileDom sheetContent;
+			NodeList tableList, rowList, cellList;
+			TableTableElement table;
+			Vector<Double> series;
+			double value;
+
+			// get table
+			sheetContent = spreadsheet.getContentDom();
+			tableList = sheetContent.getElementsByTagNameNS(OdfNamespace.newNamespace(OdfDocumentNamespace.TABLE)
+					.toString(), "table");
+			while (!sheettable.equals(((TableTableElement) tableList.item(i)).getTableNameAttribute()))
+				i++;
+			table = (TableTableElement) tableList.item(i);
+			rowList = table.getElementsByTagNameNS(OdfNamespace.newNamespace(OdfDocumentNamespace.TABLE).toString(),
+					"table-row");
+
+			// get data, begin for(beginRow,endRow)
+			for (i = beginRow; i <= endRow; i++) {
+				rowindex = bFirstRowAsLabel ? (i - beginRow - 1) : (i - beginRow);
+				td = (TableTableRowElement) rowList.item(i - 1);
+				cellList = td.getElementsByTagNameNS(OdfNamespace.newNamespace(OdfDocumentNamespace.TABLE).toString(),
+						"table-cell");
+				Map<Integer, TableTableCellElement> cellIndexMap = new HashMap<Integer, TableTableCellElement>();
+				for (int index = 0, cellNum = 0; (cellNum < cellList.getLength()) && (index <= (endColumn - 'A')); cellNum++) {
+					TableTableCellElement item = (TableTableCellElement) cellList.item(cellNum);
+					int repeatedCount = item.getTableNumberColumnsRepeatedAttribute()
+							* item.getTableNumberColumnsSpannedAttribute();
+					int tmpIndex = index + repeatedCount;
+					if (tmpIndex >= (beginColumn - 'A')) {
+						if ((beginColumn - 'A') > index) {
+							index = beginColumn - 'A';
+						}
+						for (int ii = index; ii < tmpIndex; ii++) {
+							cellIndexMap.put(ii, item);
+						}
+					}
+					index = tmpIndex;
+				}
+				// begin for(beginColumn,endColumn)
+				for (ch = beginColumn; ch <= endColumn; ch++) {
+					columnindex = bFirstColumnAsLabel ? (ch - beginColumn - 1) : (ch - beginColumn);
+					cell = cellIndexMap.get(ch - 'A');
+					if (bFirstRowAsLabel && (i == beginRow)) // label row
+					{
+						if (!bFirstColumnAsLabel || (ch != beginColumn)) {
+							if (cell.getFirstChild() != null)
+								rowLabels.add(cell.getFirstChild().getTextContent());
+							else
+								rowLabels.add("Column " + ch);
+						}
+					} else if (bFirstColumnAsLabel && (ch == beginColumn)) {
+						if (!bFirstRowAsLabel || (i != beginRow)) {
+							if (cell.getFirstChild() != null)
+								columnLabels.add(cell.getFirstChild().getTextContent());
+							else
+								columnLabels.add("Row " + i);
+						}
+					} else {
+						// set default rowLabel
+						if ((i == beginRow) && (!bFirstColumnAsLabel || (ch != beginColumn))) {
+							// first row is not label.
+							rowLabels.add("Column " + ch);
+						}
+
+						// set default column label
+						if ((ch == beginColumn) && (!bFirstRowAsLabel || (i != beginRow))) // first
+							// column is not label.
+							columnLabels.add("Row " + i);
+						if (rowAsDataSeries) {
+							if (rowindex < dataset.size())
+								series = dataset.get(rowindex);
+							else {
+								series = new Vector<Double>();
+								dataset.add(series);
+							}
+							try {
+								value = cell.getOfficeValueAttribute().doubleValue();
+								series.add(new Double(value));
+							} catch (Exception e) {
+								series.add(null);
+							}
+						} else {
+							if (columnindex < dataset.size())
+								series = dataset.get(columnindex);
+							else {
+								series = new Vector<Double>();
+								dataset.add(series);
+							}
+							try {
+								value = cell.getOfficeValueAttribute().doubleValue();
+								series.add(new Double(value));
+							} catch (Exception e) {
+								series.add(null);
+							}
+						}
+					}
+				}// end begin for(beginColumn,endColumn)
+			}// end begin for(beginRow,endRow)
+			if (rowAsDataSeries) {
+				labelset = rowLabels;
+				legendset = columnLabels;
+			} else {
+				labelset = columnLabels;
+				legendset = rowLabels;
+			}
+		} catch (Exception e) {
+			Logger.getLogger(DataSet.class.getName()).log(Level.SEVERE,	e.getMessage(), e);
+		}
+	}
+
+	// return label cell ranges
+	String getCellRanges(String tablecellrange, boolean bFirstRowAsLabel, boolean bFirstColumnAsLabel,
+			boolean rowAsDataSeries, Vector<String> seriesCellRange, Vector<String> legendCellAddr) {
+		// prepare variables
+		String labelCellRange = null;
+		if (seriesCellRange == null)
+			seriesCellRange = new Vector<String>();
+		else
+			seriesCellRange.removeAllElements();
+		if (legendCellAddr == null)
+			legendCellAddr = new Vector<String>();
+		else
+			legendCellAddr.removeAllElements();
+
+		// seperate column and row from cell range
+		StringTokenizer st = new StringTokenizer(tablecellrange, ".:$ ");
+		if (st.countTokens() < 3)
+			return null;
+
+		String sheettable = st.nextToken();
+		String begincell = st.nextToken();
+		String endcell = st.nextToken();
+		if (st.hasMoreTokens())
+			endcell = st.nextToken();
+
+		char beginColumn = begincell.charAt(0);
+		char endColumn = endcell.charAt(0);
+		int beginRow = Integer.parseInt(begincell.substring(1));
+		int endRow = Integer.parseInt(endcell.substring(1));
+		// if (bFirstColumnAsLabel) beginColumn=(char)(beginColumn1);
+		// if (bFirstRowAsLabel)beginRow=beginRow1;
+
+		if (rowAsDataSeries) {
+			int starti = beginRow + 1;
+			if (!bFirstRowAsLabel) {
+				labelCellRange = null;
+				starti = beginRow;
+			} else if (bFirstColumnAsLabel)
+				labelCellRange = createCellRange(sheettable, beginRow, (char) (beginColumn + 1), beginRow, endColumn);
+			else
+				labelCellRange = createCellRange(sheettable, beginRow, beginColumn, beginRow, endColumn);
+
+			for (int i = starti; i < endRow + 1; i++) {
+				if (bFirstColumnAsLabel)
+					seriesCellRange.add(createCellRange(sheettable, i, (char) (beginColumn + 1), i, endColumn));
+				else
+					seriesCellRange.add(createCellRange(sheettable, i, beginColumn, i, endColumn));
+
+				if (bFirstColumnAsLabel)
+					legendCellAddr.add(sheettable + "." + beginColumn + i);
+				else
+					legendCellAddr.add(null);
+			}
+		} else {
+			char startch = (char) (beginColumn + 1);
+			if (!bFirstColumnAsLabel) {
+				labelCellRange = null;
+				startch = beginColumn;
+			} else if (bFirstRowAsLabel)
+				labelCellRange = createCellRange(sheettable, beginRow + 1, beginColumn, endRow, beginColumn);
+			else
+				labelCellRange = createCellRange(sheettable, beginRow, beginColumn, endRow, beginColumn);
+
+			for (char ch = startch; ch <= endColumn; ch++) {
+				if (bFirstRowAsLabel)
+					seriesCellRange.add(createCellRange(sheettable, beginRow + 1, ch, endRow, ch));
+				else
+					seriesCellRange.add(createCellRange(sheettable, beginRow, ch, endRow, ch));
+
+				if (bFirstRowAsLabel)
+					legendCellAddr.add(sheettable + "." + ch + beginRow);
+				else
+					legendCellAddr.add(null);
+			}
+		}
+		return labelCellRange;
+	}
+
+	//get cell range string
+	private String createCellRange(String table, int beginRow, char beginColumn, int endRow, char endColumn) {
+		return table + "." + beginColumn + beginRow + ":" + table + "." + endColumn + endRow;
+	}
+}
\ No newline at end of file
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/EditableTextExtractor.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/EditableTextExtractor.java
new file mode 100644
index 0000000..7807235
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/EditableTextExtractor.java
@@ -0,0 +1,243 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfMetaDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMetaElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.table.Row;
+import org.odftoolkit.simple.table.Table;
+import org.w3c.dom.NodeList;
+
+/**
+ * It's a sub class of TextExtractor, which provides a method
+ * <code>getText()</code> to return all the text that the user can typically
+ * edit in a document, including text in cotent.xml, header and footer in
+ * styles.xml, meta data in meta.xml.
+ * 
+ * <p>
+ * This function can be used by search engine, and text analytic operations.
+ * </p>
+ * 
+ * @see org.odftoolkit.odfdom.pkg.OdfElement
+ * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor
+ */
+public class EditableTextExtractor extends TextExtractor {
+
+	Document mDocument = null;
+	boolean mIsDocumentExtractor = false;
+
+	/**
+	 * An instance of EditableTextExtractor will be created to extract the
+	 * editable text content in specified document.
+	 * 
+	 * @param doc
+	 *            the document whose text will be extracted.
+	 * @return An instance of EditableTextExtractor
+	 */
+	public static EditableTextExtractor newOdfEditableTextExtractor(Document doc) {
+		return new EditableTextExtractor(doc);
+	}
+
+	/**
+	 * An instance of EditableTextExtractor will be created to extract the
+	 * editable text content of an ODF element.
+	 * 
+	 * @param element
+	 *            the ODF element whose text will be extracted.
+	 * @return An instance of EditableTextExtractor
+	 */
+	public static EditableTextExtractor newOdfEditableTextExtractor(OdfElement element) {
+		return new EditableTextExtractor(element);
+	}
+
+	/**
+	 * Return the text content of a element as String
+	 * 
+	 * @param ele
+	 *            the ODF element
+	 * @return the text content of the element
+	 */
+	public static synchronized String getText(OdfElement ele) {
+		EditableTextExtractor extractor = newOdfEditableTextExtractor(ele);
+		return extractor.getText();
+	}
+
+	/**
+	 * Return the text content of document as String
+	 * 
+	 * @param doc
+	 *            the document
+	 * @return the text content of the document
+	 */
+	public static synchronized String getText(Document doc) {
+		EditableTextExtractor extractor = newOdfEditableTextExtractor(doc);
+		return extractor.getText();
+	}
+
+	/**
+	 * Return the editable text content as a string
+	 * 
+	 * @return the editable text content as a string
+	 */
+	@Override
+	public String getText() {
+		if (mIsDocumentExtractor) {
+			return getDocumentText();
+		} else {
+			visit(mElement);
+			return mTextBuilder.toString();
+		}
+	}
+
+	/**
+	 * Constructor with a document as parameter
+	 * 
+	 * @param doc
+	 *            the document whose editable text would be extracted.
+	 */
+	private EditableTextExtractor(Document doc) {
+		super();
+		mDocument = doc;
+		mIsDocumentExtractor = true;
+	}
+
+	/**
+	 * Constructor with an ODF element as parameter
+	 * 
+	 * @param element
+	 *            the ODF element whose editable text would be extracted.
+	 */
+	private EditableTextExtractor(OdfElement element) {
+		super(element);
+		mIsDocumentExtractor = false;
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of draw:object.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement)
+	 */
+	@Override
+	public void visit(DrawObjectElement element) {
+		String embedDocPath = element.getXlinkHrefAttribute();
+		Document embedDoc = ((Document) (((OdfContentDom) element.getOwnerDocument()).getDocument()))
+				.getEmbeddedDocument(embedDocPath);
+		if (embedDoc != null) {
+			try {
+				mTextBuilder.append(EditableTextExtractor.newOdfEditableTextExtractor(embedDoc).getText());
+			} catch (Exception e) {
+				Logger.getLogger(EditableTextExtractor.class.getName()).log(Level.SEVERE, null, e);
+			}
+		}
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:tracked-changes.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextTrackedChangesElement)
+	 */
+	@Override
+	public void visit(TextTrackedChangesElement ele) {
+		return;
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:a.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextAElement)
+	 */
+	@Override
+	public void visit(TextAElement ele) {
+		String link = ele.getXlinkHrefAttribute();
+		mTextBuilder.append(link);
+		appendElementText(ele);
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of table:table.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextTabElement)
+	 */
+	@Override
+	public void visit(TableTableElement ele) {
+		Table table = Table.getInstance(ele);
+		List<Row> rowlist = table.getRowList();
+		int column = table.getColumnCount();
+		for (int i = 0; i < rowlist.size(); i++) {
+			Row row = rowlist.get(i);
+			for (int j = 0; j < column; j++) {
+				mTextBuilder.append(row.getCellByIndex(j).getDisplayText());
+				mTextBuilder.append(TabChar);
+			}
+			mTextBuilder.appendLine();
+		}
+	}
+
+	private String getDocumentText() {
+		StringBuilder builder = new StringBuilder();
+		try {
+			// Extract text from content.xml
+			EditableTextExtractor contentDomExtractor = newOdfEditableTextExtractor(mDocument.getContentRoot());
+			builder.append(contentDomExtractor.getText());
+			// Extract text from style.xml
+			OdfStylesDom styleDom = mDocument.getStylesDom();
+			if (styleDom != null) {
+				StyleMasterPageElement masterpage = null;
+				NodeList list = styleDom.getElementsByTagName("style:master-page");
+				if (list.getLength() > 0) {
+					masterpage = (StyleMasterPageElement) list.item(0);
+				}
+				if (masterpage != null) {
+					builder.append(newOdfEditableTextExtractor(masterpage).getText());
+				}
+			}
+			// Extract text from meta.xml
+			OdfMetaDom metaDom = mDocument.getMetaDom();
+			if (metaDom != null) {
+				OdfElement root = metaDom.getRootElement();
+				OfficeMetaElement officemeta = OdfElement.findFirstChildNode(OfficeMetaElement.class, root);
+				if (officemeta != null) {
+					builder.append(newOdfEditableTextExtractor(officemeta).getText());
+				}
+			}
+			return builder.toString();
+		} catch (Exception e) {
+			Logger.getLogger(EditableTextExtractor.class.getName()).severe(e.getMessage());
+			return builder.toString();
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/TextExtractor.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/TextExtractor.java
new file mode 100644
index 0000000..9c18eb5
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/TextExtractor.java
@@ -0,0 +1,267 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common;
+
+import org.odftoolkit.odfdom.dom.DefaultElementVisitor;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfNamespace;
+import org.w3c.dom.Node;
+
+/**
+ * This is a sub class of <code>DefaultElementVisitor</code>, which is used to
+ * extract display text from ODF element. For example, if you want to get all of
+ * the text content in a slide notes, you can call <code>getOdfElement()</code>
+ * to get the ODF element of this notes, then pass it to
+ * <code>newOdfTextExtractor</code> to create a TextExtractor. The last step is
+ * very easy, you only need to use <code>getText()</code>, all of the text
+ * content will be return as string. Another easier way is pass the ODF element
+ * to the static method <code>TextExtractor.getText(OdfElement)</code> directly.
+ * <p>
+ * If you pass the content root which you can get by
+ * {@link org.odftoolkit.simple.Document#getContentRoot()
+ * Document.getContentRoot()} as the parameter, the whole document content will
+ * be returned, without any tag information.
+ * <p>
+ * This extractor implements parts of ODF elements' white space handling
+ * functions. They are text:p, text:h, text:s, text:tab and text:linebreak,
+ * which <code>visit()</code> are override to process white space, according to
+ * ODF specification.
+ * 
+ * @see org.odftoolkit.odfdom.pkg.OdfElement
+ */
+public class TextExtractor extends DefaultElementVisitor {
+
+	protected static final char NewLineChar = '\n';
+	protected static final char TabChar = '\t';
+	protected final ExtractorStringBuilder mTextBuilder;
+	OdfElement mElement;
+	
+	/**
+	 * This class is used to provide the string builder functions to extractor.
+	 * It will automatically process the last NewLineChar.
+	 * 
+	 * @since 0.3.5
+	 */
+	protected static class ExtractorStringBuilder {
+		private StringBuilder mBuilder;
+		private boolean lastAppendNewLine;
+
+		ExtractorStringBuilder() {
+			mBuilder = new StringBuilder();
+			lastAppendNewLine = false;
+		}
+
+		/**
+		 * Append a string
+		 * 
+		 * @param str
+		 *            - the string
+		 */
+		public void append(String str) {
+			mBuilder.append(str);
+		}
+
+		/**
+		 * Append a character
+		 * 
+		 * @param ch
+		 *            - the character
+		 */
+		public void append(char ch) {
+			mBuilder.append(ch);
+		}
+
+		/**
+		 * Append a new line character at the end
+		 */
+		public void appendLine() {
+			mBuilder.append(NewLineChar);
+			lastAppendNewLine = true;
+		}
+
+		/**
+		 * Return the string value.
+		 * <p>
+		 * If the last character is a new line character and is appended with
+		 * appendLine(), the last new line character will be removed.
+		 */
+		public String toString() {
+			if (lastAppendNewLine) {
+				mBuilder.deleteCharAt(mBuilder.length() - 1);
+			}
+			return mBuilder.toString();
+		}
+	}
+
+	/**
+	 * Return the text content of a element as String
+	 * 
+	 * @param ele
+	 *            the ODF element
+	 * @return the text content of the element
+	 */
+	public static synchronized String getText(OdfElement ele) {
+		TextExtractor extractor = newOdfTextExtractor(ele);
+		return extractor.getText();
+	}
+
+	/**
+	 * Create a TextExtractor instance using specified ODF element, which text
+	 * content can be extracted by <code>getText()</code>.
+	 * 
+	 * @param element
+	 *            the ODF element whose text will be extracted.
+	 * @return an instance of TextExtractor
+	 */
+	public static TextExtractor newOdfTextExtractor(OdfElement element) {
+		return new TextExtractor(element);
+	}
+
+	/**
+	 * Return the text content of specified ODF element as a string.
+	 * 
+	 * @return the text content as a string
+	 */
+	public String getText() {
+		visit(mElement);
+		return mTextBuilder.toString();
+	}
+
+	/**
+	 * Default constructor
+	 */
+	protected TextExtractor() {
+		mTextBuilder = new ExtractorStringBuilder();
+	}
+
+	/**
+	 * Constructor with an ODF element as parameter
+	 * 
+	 * @param element
+	 *            the ODF element whose text would be extracted.
+	 */
+	protected TextExtractor(OdfElement element) {
+		mTextBuilder = new ExtractorStringBuilder();
+		mElement = element;
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of <code>OdfElement</code>.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.pkg.OdfElement)
+	 */
+	@Override
+	public void visit(OdfElement element) {
+		appendElementText(element);
+		if (OdfDocumentNamespace.META.getUri().equals(element.getNamespaceURI())
+				|| OdfDocumentNamespace.DC.getUri().equals(element.getNamespaceURI())) {
+			mTextBuilder.appendLine();
+		}
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:p.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextPElement)
+	 */
+	@Override
+	public void visit(TextPElement ele) {
+		appendElementText(ele);
+		mTextBuilder.appendLine();
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:h.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextHElement)
+	 */
+	@Override
+	public void visit(TextHElement ele) {
+		appendElementText(ele);
+		mTextBuilder.appendLine();
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:s.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextSElement)
+	 */
+	@Override
+	public void visit(TextSElement ele) {
+		Integer count = ele.getTextCAttribute();
+		if (count == null) {
+			count = 1;
+		}
+		for (int i = 0; i < count; i++) {
+			mTextBuilder.append(' ');
+		}
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:tab.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextTabElement)
+	 */
+	@Override
+	public void visit(TextTabElement ele) {
+		mTextBuilder.append(TabChar);
+	}
+
+	/**
+	 * The end users needn't to care of this method, if you don't want to
+	 * override the text content handling strategy of text:linebreak.
+	 * 
+	 * @see org.odftoolkit.odfdom.dom.DefaultElementVisitor#visit(org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement)
+	 */
+	@Override
+	public void visit(TextLineBreakElement ele) {
+		mTextBuilder.append(NewLineChar);
+	}
+
+	/**
+	 * Append the text content of this element to string buffer.
+	 * 
+	 * @param ele
+	 *            the ODF element whose text will be appended.
+	 */
+	protected void appendElementText(OdfElement ele) {
+		Node node = ele.getFirstChild();
+		while (node != null) {
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				mTextBuilder.append(node.getNodeValue());
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				OdfElement element = (OdfElement) node;
+				element.accept(this);
+			}
+			node = node.getNextSibling();
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/WhitespaceProcessor.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/WhitespaceProcessor.java
new file mode 100644
index 0000000..d988fab
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/WhitespaceProcessor.java
@@ -0,0 +1,161 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * It's a tool class to help process white space.
+ */
+public class WhitespaceProcessor {
+	private int nSpaces;
+	private String partial;
+	private OdfFileDom owner;
+	private Element element;
+
+	/**
+	 * Add given text content to an element, handling multiple blanks, tabs, and
+	 * newlines properly.
+	 * 
+	 * @param element
+	 *            the element to which content is being added
+	 * @param content
+	 *            text content including whitespace
+	 */
+	public void append(Element element, String content) {
+		int i = 0;
+		char ch;
+		this.element = element;
+		partial = "";
+		nSpaces = 0;
+		owner = (OdfFileDom) element.getOwnerDocument();
+		for (i = 0; i < content.length(); i++) {
+			ch = content.charAt(i);
+			if (ch == ' ') {
+				if (nSpaces == 0) {
+					partial += " ";
+				}
+				nSpaces++;
+			} else if (ch == '\n') {
+				emitPartial();
+				element.appendChild(new TextLineBreakElement(owner));
+			} else if (ch == '\t') {
+				emitPartial();
+				element.appendChild(new TextTabElement(owner));
+			} else if (ch != '\r') // ignore DOS half of CR-LF
+			{
+				if (nSpaces > 1) {
+					emitPartial();
+				}
+				partial += ch;
+				nSpaces = 0;
+			}
+		}
+		emitPartial();
+	}
+
+	/**
+	 * Retrieve the text content of an element. Recursively retrieves all the
+	 * text nodes, expanding whitespace where necessary. Ignores any elements
+	 * except <code>&lt;text:s&gt;</code>, <code>&lt;text:line-break&gt;</code>
+	 * and <code>&lt;text:tab&gt</code>.
+	 * 
+	 * @param element
+	 *            an element whose text you want to retrieve
+	 * @return the element's text content, with whitespace expanded
+	 * 
+	 * @deprecated As of Simple version 0.3.5, replaced by
+	 *             <code>TextExtractor.getText(OdfElement)</code>
+	 * 
+	 * @see TextExtractor#getText(OdfElement)
+	 */
+	public String getText(Node element) {
+		String result = "";
+		int spaceCount;
+		Node node = element.getFirstChild();
+		while (node != null) {
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				result += node.getNodeValue();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node.getLocalName().equals("s")) // text:s
+				{
+					try {
+						spaceCount = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						spaceCount = 1;
+					}
+					for (int i = 0; i < spaceCount; i++) {
+						result += " ";
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					result += "\n";
+				} else if (node.getLocalName().equals("tab")) {
+					result += "\t";
+				} else {
+					result = result + getText(node);
+				}
+			}
+			node = node.getNextSibling();
+		}
+		return result;
+	}
+
+	/**
+	 * Append text content to a given element, handling whitespace properly.
+	 * This is a static method that creates its own WhitespaceProcessor, so that
+	 * you don't have to.
+	 * 
+	 * @param element
+	 *            the element to which content is being added
+	 * @param content
+	 *            text content including whitespace
+	 */
+	public static void appendText(Element element, String content) {
+		WhitespaceProcessor processor = new WhitespaceProcessor();
+		processor.append(element, content);
+	}
+
+	/*
+	 * Send out any information that has been buffered
+	 */
+	private void emitPartial() {
+		/* send out any partial text */
+		if (!partial.equals("")) {
+			element.appendChild(owner.createTextNode(partial));
+		}
+		/* and any spaces if necessary */
+		if (nSpaces > 1) {
+			TextSElement spaceElement = new TextSElement(owner);
+			spaceElement.setTextCAttribute(new Integer(nSpaces - 1));
+			element.appendChild(spaceElement);
+		}
+		/* and reset all the counters */
+		nSpaces = 0;
+		partial = "";
+	}
+}
\ No newline at end of file
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/AbstractVariableContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/AbstractVariableContainer.java
new file mode 100644
index 0000000..f8b2675
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/AbstractVariableContainer.java
@@ -0,0 +1,91 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+
+/**
+ * AbstractVariableContainer is an abstract implementation of the
+ * VariableContainer interface, with a default implementation for every method
+ * defined in VariableContainer , except getVariableContainerElement(). A
+ * subclass must implement the abstract method getVariableContainerElement().
+ * 
+ * @since 0.5
+ */
+public abstract class AbstractVariableContainer implements VariableContainer {
+
+	public VariableField declareVariable(String name, VariableType type) {
+		VariableField variableField = null;
+		switch (type) {
+		case SIMPLE:
+			variableField = Fields.createSimpleVariableField(this, name);
+			break;
+		case USER:
+			variableField = Fields.createUserVariableField(this, name, "0");
+			break;
+		case SEQUENCE:
+			throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+		}
+		return variableField;
+	}
+
+	public VariableField getVariableFieldByName(String name) {
+		OdfElement containerElement = getVariableContainerElement();
+		TextVariableDeclsElement simpleVariableElements = OdfElement.findFirstChildNode(TextVariableDeclsElement.class,
+				containerElement);
+		if (simpleVariableElements != null) {
+			TextVariableDeclElement simpleVariableElement = (TextVariableDeclElement) simpleVariableElements
+					.getFirstChild();
+			while (simpleVariableElement != null) {
+				if (name.equals(simpleVariableElement.getTextNameAttribute())) {
+					return Fields.createSimpleVariableField(this, name);
+				} else {
+					simpleVariableElement = (TextVariableDeclElement) simpleVariableElement.getNextSibling();
+				}
+			}
+		}
+		TextUserFieldDeclsElement userVariableElements = OdfElement.findFirstChildNode(TextUserFieldDeclsElement.class,
+				containerElement);
+		if (userVariableElements != null) {
+			TextUserFieldDeclElement userVariableElement = (TextUserFieldDeclElement) userVariableElements
+					.getFirstChild();
+			while (userVariableElement != null) {
+				if (name.equals(userVariableElement.getTextNameAttribute())) {
+					String type = userVariableElement.getOfficeValueTypeAttribute();
+					if(type.equalsIgnoreCase("string")){
+						String stringValue = userVariableElement.getOfficeStringValueAttribute();
+						return Fields.createUserVariableField(this, name, stringValue);
+					}
+					Double DoubleValue = userVariableElement.getOfficeValueAttribute();
+					DoubleValue.toString();
+					return Fields.createUserVariableField(this, name, DoubleValue.toString());
+				} else {
+					userVariableElement = (TextUserFieldDeclElement) userVariableElement.getNextSibling();
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/AuthorField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/AuthorField.java
new file mode 100644
index 0000000..6b44a16
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/AuthorField.java
@@ -0,0 +1,80 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorInitialsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+
+/**
+ * An <tt>AuthorField</tt> represents the initials of the author or the full
+ * name of the author of a document.
+ * <p>
+ * NOTE: Before the document is opened in any editor, the value of this field is
+ * invalid.
+ * 
+ * @since 0.5
+ */
+public class AuthorField extends Field {
+
+	private final boolean isInitials;
+
+	private TextAuthorNameElement authorNameElement;
+	private TextAuthorInitialsElement authorInitialsElement;
+
+	// package constructor, only called by Fields
+	AuthorField(OdfElement odfElement, boolean isAuthorInitials) {
+		isInitials = isAuthorInitials;
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		if (isAuthorInitials) {
+			authorInitialsElement = spanElement.newTextAuthorInitialsElement();
+			authorInitialsElement.setTextFixedAttribute(false);
+		} else {
+			authorNameElement = spanElement.newTextAuthorNameElement();
+			authorNameElement.setTextFixedAttribute(false);
+		}
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Return an instance of <code>OdfElement</code> which represents this
+	 * feature. If this is an initial author field, an instance of
+	 * <code>TextAuthorInitialsElement</code> is returned, otherwise an instance
+	 * of <code>TextAuthorNameElement</code> is returned.
+	 * 
+	 * @return an instance of <code>OdfElement</code>
+	 */
+	public OdfElement getOdfElement() {
+		if (isInitials) {
+			return authorInitialsElement;
+		} else {
+			return authorNameElement;
+		}
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return isInitials ? FieldType.AUTHOR_INITIALS_FIELD : FieldType.AUTHOR_NAME_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ChapterField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ChapterField.java
new file mode 100644
index 0000000..b83640c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ChapterField.java
@@ -0,0 +1,111 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextChapterElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+
+/**
+ * ChapterField is placed inside a header or footer, it displays the current
+ * chapter name or number on every page.
+ * <p>
+ * NOTE: Before the document is opened in any editor, the value of this field
+ * maybe invalid.
+ * 
+ * @since 0.5
+ */
+public class ChapterField extends Field {
+
+	private TextChapterElement chapterElement;
+
+	/**
+	 * A <tt>DisplayType</tt> specifies the information that a chapter field
+	 * should display.
+	 * 
+	 * @since 0.5
+	 */
+	public static enum DisplayType {
+
+		NAME("name"), 
+		NUMBER("number"), 
+		NUMBER_AND_NAME("number-and-name"), 
+		PLAIN_NUMBER("plain-number"), 
+		PLAIN_NUMBER_AND_NAME("plain-number-and-name");
+
+		private final String displayType;
+
+		DisplayType(String type) {
+			displayType = type;
+		}
+
+		@Override
+		public String toString() {
+			return displayType;
+		}
+	}
+
+	// package constructor, only called by Fields
+	ChapterField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		chapterElement = spanElement.newTextChapterElement(null, 1);
+		setDisplayPage(DisplayType.NUMBER_AND_NAME);
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Specifies the information that a chapter field should display.
+	 * 
+	 * @param type
+	 *            the display type which is predefined in
+	 *            {@link ChapterField.DisplayType DisplayType}.
+	 */
+	public void setDisplayPage(DisplayType type) {
+		chapterElement.setTextDisplayAttribute(type.toString());
+	}
+
+	/**
+	 * Specifies the outline level to be displayed.
+	 * 
+	 * @param level
+	 *            the outline level to be displayed.
+	 */
+	public void setOutlineLevel(int level) {
+		chapterElement.setTextOutlineLevelAttribute(level);
+	}
+
+	/**
+	 * Return an instance of <code>TextChapterElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>TextChapterElement</code>
+	 */
+	public TextChapterElement getOdfElement() {
+		return chapterElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return FieldType.CHAPTER_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ConditionField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ConditionField.java
new file mode 100644
index 0000000..c30e291
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ConditionField.java
@@ -0,0 +1,99 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextConditionalTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+
+/**
+ * ConditionField specifies a condition for display of one text string or
+ * another. If the condition is true, one of the text strings is displayed. If
+ * the condition is false, the other text string is displayed.
+ * 
+ * @since 0.5
+ */
+public class ConditionField extends Field {
+
+	private TextConditionalTextElement conditionalTextElement;
+	private final boolean isHiddenTextField;
+
+	// package constructor, only called by Fields
+	ConditionField(OdfElement odfElement, String condition, String trueText, String falseText, boolean isHiddenTextField) {
+		if (odfElement instanceof TextPElement) {
+			conditionalTextElement = ((TextPElement) odfElement).newTextConditionalTextElement("ooow:" + condition,
+					falseText, trueText);
+		} else if (odfElement instanceof TextSpanElement) {
+			conditionalTextElement = ((TextSpanElement) odfElement).newTextConditionalTextElement("ooow:" + condition,
+					falseText, trueText);
+		} else {
+			TextPElement pElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextPElement.class);
+			odfElement.appendChild(pElement);
+			conditionalTextElement = pElement.newTextConditionalTextElement("ooow:" + condition, falseText, trueText);
+		}
+		conditionalTextElement.setTextCurrentValueAttribute(true);
+		this.isHiddenTextField = isHiddenTextField;
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Update the condition of this field.
+	 * 
+	 * @param condition
+	 *            the new condition of this condition field.
+	 */
+	public void updateCondition(String condition) {
+		conditionalTextElement.setTextConditionAttribute("ooow:" + condition);
+	}
+
+	/**
+	 * Update the true text of this condition field.
+	 * 
+	 * @param text
+	 *            the new text content.
+	 */
+	public void updateTrueText(String text) {
+		conditionalTextElement.setTextStringValueIfTrueAttribute(text);
+	}
+
+	/**
+	 * Update the false text of this condition field.
+	 * 
+	 * @param text
+	 *            the new text content.
+	 */
+	public void updateFalseText(String text) {
+		conditionalTextElement.setTextStringValueIfFalseAttribute(text);
+	}
+
+	@Override
+	public OdfElement getOdfElement() {
+		return conditionalTextElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return isHiddenTextField ? FieldType.HIDDEN_TEXT_FIELD : FieldType.CONDITION_FIELD;
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/DateField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/DateField.java
new file mode 100644
index 0000000..c9fdd97
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/DateField.java
@@ -0,0 +1,156 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.text.TextDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+
+/**
+ * DateField displays a date, by default this is the current date.
+ * 
+ * @since 0.5
+ */
+public class DateField extends Field {
+
+	/**
+	 * The default date format of date field.
+	 */
+	private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+
+	/**
+	 * The default date value format.
+	 */
+	private static final String DEFAULT_DATE_VALUE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.S";
+
+	private TextDateElement dateElement;
+
+	// package constructor, only called by Fields.
+	DateField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		dateElement = spanElement.newTextDateElement();
+		OdfNumberDateStyle dateStyle = newDateStyle();
+		String dateStyleName = dateStyle.getStyleNameAttribute();
+		dateStyle.buildFromFormat(DEFAULT_DATE_FORMAT);
+		dateStyle.setStyleNameAttribute(dateStyleName);
+		dateElement.setStyleDataStyleNameAttribute(dateStyle.getStyleNameAttribute());
+		Calendar calender = Calendar.getInstance();
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_DATE_VALUE_FORMAT);
+		Date date = calender.getTime();
+		String svalue = simpleFormat.format(date);
+		dateElement.setTextDateValueAttribute(svalue);
+		SimpleDateFormat contentFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
+		dateElement.setTextContent(contentFormat.format(date));
+		dateElement.setTextFixedAttribute(true);
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Set the format of this date field. Date format pattern is the same as
+	 * {@link java.text.SimpleDateFormat SimpleDateFormat}.
+	 * 
+	 * @param formatString
+	 *            the format string of this date.
+	 * @see java.text.SimpleDateFormat
+	 */
+	public void formatDate(String formatString) {
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_DATE_VALUE_FORMAT);
+		String sValue = dateElement.getTextDateValueAttribute();
+		try {
+			Date simpleDate = simpleFormat.parse(sValue);
+			SimpleDateFormat newFormat = new SimpleDateFormat(formatString);
+			dateElement.setTextContent(newFormat.format(simpleDate));
+			OdfFileDom dom = (OdfFileDom) dateElement.getOwnerDocument();
+			OdfOfficeAutomaticStyles styles = null;
+			if (dom instanceof OdfContentDom) {
+				styles = ((OdfContentDom) dom).getAutomaticStyles();
+			} else if (dom instanceof OdfStylesDom) {
+				styles = ((OdfStylesDom) dom).getAutomaticStyles();
+			}
+			OdfNumberDateStyle dataStyle = styles.getDateStyle(dateElement.getStyleDataStyleNameAttribute());
+			dataStyle.buildFromFormat(formatString);
+		} catch (ParseException e) {
+			Logger.getLogger(DateField.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Set whether the date value of this field is fixed.
+	 * 
+	 * @param isFixed
+	 *            if <code>true</code>, the date value shall be preserved,
+	 *            otherwise it may be replaced with a new value in future edits.
+	 */
+	public void setFixed(boolean isFixed) {
+		dateElement.setTextFixedAttribute(isFixed);
+	}
+
+	/**
+	 * Return an instance of <code>TextDateElement</code> which represents this
+	 * feature.
+	 * 
+	 * @return an instance of <code>TextDateElement</code>
+	 */
+	public TextDateElement getOdfElement() {
+		return dateElement;
+	}
+
+	// Create an <code>OdfNumberDateStyle</code> element
+	private OdfNumberDateStyle newDateStyle() {
+		OdfFileDom dom = (OdfFileDom) dateElement.getOwnerDocument();
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		OdfNumberDateStyle newStyle = dom.newOdfElement(OdfNumberDateStyle.class);
+		newStyle.setStyleNameAttribute(newUniqueStyleName(styles));
+		styles.appendChild(newStyle);
+		return newStyle;
+	}
+
+	private String newUniqueStyleName(OdfOfficeAutomaticStyles styles) {
+		String unique_name;
+		do {
+			unique_name = String.format("N%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getTimeStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return dateElement.getTextFixedAttribute() ? FieldType.FIXED_DATE_FIELD : FieldType.DATE_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/Field.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/Field.java
new file mode 100644
index 0000000..755a45c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/Field.java
@@ -0,0 +1,65 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.simple.Component;
+
+/**
+ * This is the abstract class of all kinds of fields.
+ * 
+ * @see org.odftoolkit.simple.common.navigation.FieldSelection
+ * 
+ * @since 0.5
+ */
+public abstract class Field extends Component {
+	
+	/**
+	 * A <tt>FieldType</tt> specifies the type of a field.
+	 * 
+	 * @since 0.5
+	 */
+	public static enum FieldType {
+		DATE_FIELD,
+		FIXED_DATE_FIELD,
+		TIME_FIELD,
+		FIXED_TIME_FIELD,
+		PREVIOUS_PAGE_NUMBER_FIELD,
+		CURRENT_PAGE_NUMBER_FIELD,
+		NEXT_PAGE_NUMBER_FIELD,
+		PAGE_COUNT_FIELD,
+		TITLE_FIELD,
+		SUBJECT_FIELD,
+		AUTHOR_NAME_FIELD,
+		AUTHOR_INITIALS_FIELD,
+		CHAPTER_FIELD,
+		REFERENCE_FIELD,
+		SIMPLE_VARIABLE_FIELD,
+		USER_VARIABLE_FIELD,
+		CONDITION_FIELD,
+		HIDDEN_TEXT_FIELD;
+	}
+	
+	/**
+	 * Return the type of this field.
+	 * 
+	 * @return the type of this field.
+	 */
+	public abstract FieldType getFieldType();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/Fields.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/Fields.java
new file mode 100644
index 0000000..a5d60fe
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/Fields.java
@@ -0,0 +1,291 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.common.field.PageNumberField.DisplayType;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+
+/**
+ * This is a tool class to help the user creating all kinds of fields as needed.
+ * 
+ * @see org.odftoolkit.simple.common.navigation.FieldSelection
+ * @since 0.5
+ */
+public class Fields {
+
+	/**
+	 * Create an automatically update date field for the specific OdfElement,
+	 * which displays current date.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created date field.
+	 */
+	public static DateField createDateField(OdfElement odfElement) {
+		DateField dateField = new DateField(odfElement);
+		dateField.setFixed(false);
+		return dateField;
+	}
+
+	/**
+	 * Create a fixed date field for the specific OdfElement, which displays the
+	 * field created date.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created date field.
+	 */
+	public static DateField createFixedDateField(OdfElement odfElement) {
+		return new DateField(odfElement);
+	}
+
+	/**
+	 * Create an automatically update time field for the specific OdfElement,
+	 * which displays current time.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created time field.
+	 */
+	public static TimeField createTimeField(OdfElement odfElement) {
+		TimeField timeField = new TimeField(odfElement);
+		timeField.setFixed(false);
+		return timeField;
+	}
+
+	/**
+	 * Create a fixed time field for the specific OdfElement, which displays the
+	 * field created time.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created time field.
+	 */
+	public static TimeField createFixedTimeField(OdfElement odfElement) {
+		return new TimeField(odfElement);
+	}
+
+	/**
+	 * Create a page number field for the specific OdfElement, which displays
+	 * previous page number.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created page number field.
+	 */
+	public static PageNumberField createPreviousPageNumberField(OdfElement odfElement) {
+		PageNumberField pageNumberField = new PageNumberField(odfElement);
+		pageNumberField.setDisplayPage(DisplayType.PREVIOUS_PAGE);
+		return pageNumberField;
+	}
+
+	/**
+	 * Create a page number field for the specific OdfElement, which displays
+	 * current page number.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created page number field.
+	 */
+	public static PageNumberField createCurrentPageNumberField(OdfElement odfElement) {
+		return new PageNumberField(odfElement);
+	}
+
+	/**
+	 * Create a page number field for the specific OdfElement, which displays
+	 * next page number.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created page number field.
+	 */
+	public static PageNumberField createNextPageNumberField(OdfElement odfElement) {
+		PageNumberField pageNumberField = new PageNumberField(odfElement);
+		pageNumberField.setDisplayPage(DisplayType.NEXT_PAGE);
+		return pageNumberField;
+	}
+
+	/**
+	 * Create a page count field for the specific OdfElement, which displays
+	 * page total count of this document.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created page count field.
+	 */
+	public static PageCountField createPageCountField(OdfElement odfElement) {
+		return new PageCountField(odfElement);
+	}
+
+	/**
+	 * Create a title field for the specific OdfElement, which displays title
+	 * data of this document.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created title field.
+	 */
+	public static TitleField createTitleField(OdfElement odfElement) {
+		return new TitleField(odfElement);
+	}
+
+	/**
+	 * Create a subject field for the specific OdfElement, which displays the
+	 * subject data of this document.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created author field.
+	 */
+	public static SubjectField createSubjectField(OdfElement odfElement) {
+		return new SubjectField(odfElement);
+	}
+
+	/**
+	 * Create an author field for the specific OdfElement, which displays author
+	 * full name of this document.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created author field.
+	 */
+	public static AuthorField createAuthorNameField(OdfElement odfElement) {
+		return new AuthorField(odfElement, false);
+	}
+
+	/**
+	 * Create an author field for the specific OdfElement, which displays the
+	 * initials of the author of this document.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created author field.
+	 */
+	public static AuthorField createAuthorInitialsField(OdfElement odfElement) {
+		return new AuthorField(odfElement, true);
+	}
+
+	/**
+	 * Create a chapter field for the specific OdfElement.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @return the created chapter field.
+	 */
+	public static ChapterField createChapterField(OdfElement odfElement) {
+		return new ChapterField(odfElement);
+	}
+
+	/**
+	 * Create a ReferenceField for the specific OdfElement.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @param referenceName
+	 *            the reference field name.
+	 * @return the created reference field.
+	 */
+	public static ReferenceField createReferenceField(OdfElement odfElement, String referenceName) {
+		return new ReferenceField(odfElement, referenceName);
+	}
+
+	/**
+	 * Declare a simple variable field. Simple variables, can take different
+	 * values at different positions throughout a document.
+	 * <p>
+	 * Simple variables can be used to display different text in recurring
+	 * elements, such as headers or footers.
+	 * 
+	 * @param container
+	 *            the container which this variable field is contained.
+	 * @param name
+	 *            the name of this variable field.
+	 * @return the created variable field.
+	 */
+	public static VariableField createSimpleVariableField(VariableContainer container, String name) {
+		return new VariableField(container, name, VariableType.SIMPLE);
+	}
+
+	/**
+	 * Declare a user variable field. User variables have the same value
+	 * throughout a document. If a user variable is set anywhere within the
+	 * document, all fields in the document that display the user variable have
+	 * the same value.
+	 * 
+	 * @param container
+	 *            the container which this variable field is contained.
+	 * @param name
+	 *            the name of this variable field.
+	 * @param value
+	 *            the initial value of this variable field.
+	 * @return the created variable field.
+	 */
+	public static VariableField createUserVariableField(VariableContainer container, String name, String value) {
+		VariableField field = new VariableField(container, name, VariableType.USER);
+		field.updateField(value, (OdfElement) null);
+		return field;
+	}
+
+	/**
+	 * Declare a condition field, which specifies a condition for display of one
+	 * text string or another. If the condition is true, one of the text strings
+	 * is displayed. If the condition is false, the other text string is
+	 * displayed.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @param condition
+	 *            the condition that determines which of the two text strings is
+	 *            displayed.
+	 * @param trueText
+	 *            the text string to display if a <code>condition</code> is
+	 *            true.
+	 * @param falseText
+	 *            the text string to display if a <code>condition</code> is
+	 *            false.
+	 * @return the created condition field.
+	 */
+	public static ConditionField createConditionField(OdfElement odfElement, String condition, String trueText,
+			String falseText) {
+		return new ConditionField(odfElement, condition, trueText, falseText, false);
+	}
+
+	/**
+	 * Declare a hidden text field, which hides the text it contains when a
+	 * specified condition is true.
+	 * 
+	 * @param odfElement
+	 *            the OdfElement which owns this field.
+	 * @param condition
+	 *            the condition that determines whether the text string is
+	 *            displayed or not.
+	 * @param text
+	 *            the text string to display.
+	 * @return the created condition field.
+	 */
+	public static ConditionField createHiddenTextField(OdfElement odfElement, String condition, String text) {
+		return new ConditionField(odfElement, condition, null, text, true);
+	}
+
+	// private constructor, cannot instantiate.
+	private Fields() {
+	};
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/PageCountField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/PageCountField.java
new file mode 100644
index 0000000..476cd95
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/PageCountField.java
@@ -0,0 +1,88 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextPageCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.meta.Meta;
+import org.odftoolkit.simple.style.NumberFormat;
+
+/**
+ * A <tt>PageCountField</tt> displays the total number of pages in a document.
+ * The value of this field is from the owner document meta statistic
+ * information.
+ * <p>
+ * NOTE: Before the document is opened in any editor, the value of this field
+ * maybe invalid.
+ * 
+ * @since 0.5
+ */
+public class PageCountField extends Field {
+
+	private TextPageCountElement pageCountElement;
+
+	// package constructor, only called by Fields
+	PageCountField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		pageCountElement = spanElement.newTextPageCountElement(null);
+		try {
+			OdfFileDom dom = (OdfFileDom) odfElement.getOwnerDocument();
+			Meta meta = ((Document) dom.getDocument()).getOfficeMetadata();
+			int count = meta.getDocumentStatistic().getPageCount();
+			pageCountElement.setTextContent(String.valueOf(count));
+		} catch (Exception e) {
+			// get meta info failed, do not set count value. Let editor update
+			// it.
+		}
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Specifies the number format of this field.
+	 * 
+	 * @param format
+	 *            the format which is predefined in
+	 *            {@link org.odftoolkit.simple.style.NumberFormat NumberFormat}.
+	 * @see org.odftoolkit.simple.style.NumberFormat
+	 */
+	public void setNumberFormat(NumberFormat format) {
+		pageCountElement.setStyleNumFormatAttribute(format.toString());
+	}
+
+	/**
+	 * Return an instance of <code>TextPageCountElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>TextPageCountElement</code>
+	 */
+	public TextPageCountElement getOdfElement() {
+		return pageCountElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return FieldType.PAGE_COUNT_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/PageNumberField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/PageNumberField.java
new file mode 100644
index 0000000..380e300
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/PageNumberField.java
@@ -0,0 +1,122 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextPageNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.style.NumberFormat;
+
+/**
+ * A <tt>PageNumberField</tt> displays the current page number of pages in a
+ * document.
+ * <p>
+ * NOTE: Before the document is opened in any editor, the value of this field is
+ * invalid.
+ * 
+ * @since 0.5
+ */
+public class PageNumberField extends Field {
+
+	private TextPageNumberElement pageNumberElement;
+	private DisplayType type;
+
+	/**
+	 * A <tt>DisplayType</tt> represents the selected page attribute of the
+	 * field. The page immediately preceding the current page, current page and
+	 * the page immediately following the current page are supported.
+	 * 
+	 * @since 0.5
+	 */
+	public static enum DisplayType {
+
+		PREVIOUS_PAGE("previous"), CURRENT_PAGE("current"), NEXT_PAGE("next");
+
+		private final String displayType;
+
+		DisplayType(String type) {
+			displayType = type;
+		}
+
+		@Override
+		public String toString() {
+			return displayType;
+		}
+	}
+
+	// package constructor, only called by Fields
+	PageNumberField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		pageNumberElement = spanElement.newTextPageNumberElement(null);
+		setDisplayPage(DisplayType.CURRENT_PAGE);
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Specifies whether to display or not the number of a previous or following
+	 * page rather than the number of the current page.
+	 * 
+	 * @param type
+	 *            the display type which is predefined.
+	 */
+	public void setDisplayPage(DisplayType type) {
+		pageNumberElement.setTextSelectPageAttribute(type.toString());
+		this.type = type;
+	}
+
+	/**
+	 * Specifies the number format of this field.
+	 * 
+	 * @param format
+	 *            the format which is predefined in
+	 *            {@link org.odftoolkit.simple.style.NumberFormat NumberFormat}.
+	 * @see org.odftoolkit.simple.style.NumberFormat
+	 */
+	public void setNumberFormat(NumberFormat format) {
+		pageNumberElement.setStyleNumFormatAttribute(format.toString());
+	}
+
+	/**
+	 * Return an instance of <code>TextPageNumberElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>TextPageNumberElement</code>
+	 */
+	public TextPageNumberElement getOdfElement() {
+		return pageNumberElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		switch (type) {
+		case PREVIOUS_PAGE:
+			return FieldType.PREVIOUS_PAGE_NUMBER_FIELD;
+		case CURRENT_PAGE:
+			return FieldType.CURRENT_PAGE_NUMBER_FIELD;
+		case NEXT_PAGE:
+			return FieldType.NEXT_PAGE_NUMBER_FIELD;
+		default:
+			return null;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ReferenceField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ReferenceField.java
new file mode 100644
index 0000000..11bfba2
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/ReferenceField.java
@@ -0,0 +1,174 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextMetaElement;
+import org.odftoolkit.odfdom.dom.element.text.TextMetaFieldElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceMarkEndElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceMarkStartElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceRefElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.w3c.dom.Node;
+
+/**
+ * A ReferenceField refers to a field that appears in another location in a
+ * document.
+ * <p>
+ * The advantage of entering a reference as a field is that you do not have to
+ * adjust the references manually every time you change the document. Just
+ * update the fields and the references in the document are updated too.
+ * <p>
+ * NOTE: Before the document is opened in any editor, the value of this field
+ * maybe invalid.
+ * 
+ * @since 0.5
+ */
+public class ReferenceField extends Field {
+
+	private OdfElement referencedElement;
+	private String name;
+	private TextReferenceMarkStartElement referenceMarkStartElement;
+	private TextReferenceMarkEndElement referenceMarkEndElement;
+
+	/**
+	 * A <tt>DisplayType</tt> specifies the information that a reference field
+	 * should display.
+	 * <ul>
+	 * <li>CHAPTER: displays the number of the chapter in which the referenced
+	 * item appears.
+	 * <li>DIRECTION: displays whether the referenced item is above or below the
+	 * reference field.
+	 * <li>PAGE: displays the number of the page on which the referenced item
+	 * appears.
+	 * <li>TEXT: displays the text of the referenced item.
+	 * </ul>
+	 * 
+	 * @since 0.5
+	 */
+	public static enum DisplayType {
+
+		CHAPTER("chapter"), DIRECTION("direction"), PAGE("page"), TEXT("text");
+
+		private final String displayType;
+
+		DisplayType(String type) {
+			displayType = type;
+		}
+
+		@Override
+		public String toString() {
+			return displayType;
+		}
+	}
+
+	// package constructor, only called by Fields
+	ReferenceField(OdfElement odfElement, String referenceName) {
+		OdfElement parentEle = (OdfElement) odfElement.getParentNode();
+		if (parentEle instanceof TextAElement || parentEle instanceof TextHElement
+				|| parentEle instanceof TextMetaElement || parentEle instanceof TextMetaFieldElement
+				|| parentEle instanceof TextPElement || parentEle instanceof TextSpanElement) {
+			referencedElement = odfElement;
+			name = referenceName;
+			// insert start target element
+			referenceMarkStartElement = ((OdfFileDom) odfElement.getOwnerDocument())
+					.newOdfElement(TextReferenceMarkStartElement.class);
+			referenceMarkStartElement.setTextNameAttribute(referenceName);
+			parentEle.insertBefore(referenceMarkStartElement, odfElement);
+			// insert end target element
+			referenceMarkEndElement = ((OdfFileDom) odfElement.getOwnerDocument())
+					.newOdfElement(TextReferenceMarkEndElement.class);
+			referenceMarkEndElement.setTextNameAttribute(referenceName);
+			OdfElement nextSiblingEle = (OdfElement) odfElement.getNextSibling();
+			if (nextSiblingEle == null) {
+				parentEle.appendChild(referenceMarkEndElement);
+			} else {
+				parentEle.insertBefore(referenceMarkEndElement, nextSiblingEle);
+			}
+			Component.registerComponent(this, getOdfElement());
+		} else {
+			throw new IllegalArgumentException("The specific odf element can't own a reference field.");
+		}
+	}
+
+	/**
+	 * Set the name of this reference field.
+	 * 
+	 * @param referenceName
+	 *            the name of this content.
+	 */
+	public void setName(String referenceName) {
+		referenceMarkStartElement.setTextNameAttribute(name);
+		name = referenceName;
+	}
+
+	/**
+	 * Get the name of this reference field.
+	 * 
+	 * @return the name of this reference field.
+	 */
+	public String getName() {
+		return referenceMarkStartElement.getTextNameAttribute();
+	}
+
+	/**
+	 * Append this reference field after the specifics OdfElement.
+	 * 
+	 * @param odfEle
+	 *            the reference of odf element.
+	 *@param type
+	 *            the display type.
+	 */
+	public void appendReferenceTo(OdfElement odfEle, DisplayType type) {
+		// create reference ref element.
+		TextSpanElement spanElement = ((OdfFileDom) odfEle.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		TextReferenceRefElement referenceRefElement = spanElement.newTextReferenceRefElement();
+		referenceRefElement.setTextRefNameAttribute(name);
+		referenceRefElement.setTextReferenceFormatAttribute(type.toString());
+		// insert
+		if (odfEle instanceof TextPElement) {
+			odfEle.appendChild(spanElement);
+		} else {
+			OdfElement parentEle = (OdfElement) odfEle.getParentNode();
+			Node nextSiblingEle =  odfEle.getNextSibling();
+			TextPElement pElement = ((OdfFileDom) odfEle.getOwnerDocument()).newOdfElement(TextPElement.class);
+			pElement.appendChild(spanElement);
+			if (nextSiblingEle == null) {
+				parentEle.appendChild(pElement);
+			} else {
+				parentEle.insertBefore(pElement, nextSiblingEle);
+			}
+		}
+	}
+
+	public OdfElement getOdfElement() {
+		return referencedElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return FieldType.REFERENCE_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/SubjectField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/SubjectField.java
new file mode 100644
index 0000000..ab26ae6
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/SubjectField.java
@@ -0,0 +1,69 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSubjectElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.meta.Meta;
+
+/**
+ * A <tt>SubjectField</tt> displays the subject value contained by the document
+ * meta data.
+ * 
+ * @since 0.5
+ */
+public class SubjectField extends Field {
+	private TextSubjectElement subjectElement;
+
+	// package constructor, only called by Fields
+	SubjectField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		subjectElement = spanElement.newTextSubjectElement();
+		try {
+			OdfFileDom dom = (OdfFileDom) odfElement.getOwnerDocument();
+			Meta meta = ((Document) dom.getDocument()).getOfficeMetadata();
+			subjectElement.setTextContent(meta.getSubject());
+		} catch (Exception e) {
+			// get meta info failed, do not set content value. Let editor update
+			// it.
+		}
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Return an instance of <code>TextSubjectElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>TextSubjectElement</code>
+	 */
+	public TextSubjectElement getOdfElement() {
+		return subjectElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return FieldType.SUBJECT_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/TimeField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/TimeField.java
new file mode 100644
index 0000000..3e2d9a7
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/TimeField.java
@@ -0,0 +1,156 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTimeElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+
+/**
+ * TimeField displays a time, by default this is the current time.
+ * 
+ * @since 0.5
+ */
+public class TimeField extends Field {
+
+	/**
+	 * The default time format of time field.
+	 */
+	private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
+
+	/**
+	 * The default time value format.
+	 */
+	private static final String DEFAULT_TIME_VALUE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.S";
+
+	private TextTimeElement timeElement;
+
+	// package constructor, only called by Fields.
+	TimeField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		timeElement = spanElement.newTextTimeElement();
+		OdfNumberTimeStyle timeStyle = newTimeStyle();
+		String timeStyleName = timeStyle.getStyleNameAttribute();
+		timeStyle.buildFromFormat(DEFAULT_TIME_FORMAT);
+		timeStyle.setStyleNameAttribute(timeStyleName);
+		timeElement.setStyleDataStyleNameAttribute(timeStyle.getStyleNameAttribute());
+		Calendar calender = Calendar.getInstance();
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_TIME_VALUE_FORMAT);
+		Date time = calender.getTime();
+		String svalue = simpleFormat.format(time);
+		timeElement.setTextTimeValueAttribute(svalue);
+		SimpleDateFormat contentFormat = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
+		timeElement.setTextContent(contentFormat.format(time));
+		timeElement.setTextFixedAttribute(true);
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Set the format of this time field. Time format pattern is the same as
+	 * {@link java.text.SimpleDateFormat SimpleDateFormat}.
+	 * 
+	 * @param formatString
+	 *            the format string of this time.
+	 * @see java.text.SimpleDateFormat
+	 */
+	public void formatTime(String formatString) {
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_TIME_VALUE_FORMAT);
+		String sValue = timeElement.getTextTimeValueAttribute();
+		try {
+			Date simpleDate = simpleFormat.parse(sValue);
+			SimpleDateFormat newFormat = new SimpleDateFormat(formatString);
+			timeElement.setTextContent(newFormat.format(simpleDate));
+			OdfFileDom dom = (OdfFileDom) timeElement.getOwnerDocument();
+			OdfOfficeAutomaticStyles styles = null;
+			if (dom instanceof OdfContentDom) {
+				styles = ((OdfContentDom) dom).getAutomaticStyles();
+			} else if (dom instanceof OdfStylesDom) {
+				styles = ((OdfStylesDom) dom).getAutomaticStyles();
+			}
+			OdfNumberTimeStyle dataStyle = styles.getTimeStyle(timeElement.getStyleDataStyleNameAttribute());
+			dataStyle.buildFromFormat(formatString);
+		} catch (ParseException e) {
+			Logger.getLogger(TimeField.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Set whether the time value of this field is fixed.
+	 * 
+	 * @param isFixed
+	 *            if <code>true</code>, the time value shall be preserved,
+	 *            otherwise it may be replaced with a new value in future edits.
+	 */
+	public void setFixed(boolean isFixed) {
+		timeElement.setTextFixedAttribute(isFixed);
+	}
+
+	/**
+	 * Return an instance of <code>TextTimeElement</code> which represents this
+	 * feature.
+	 * 
+	 * @return an instance of <code>TextTimeElement</code>
+	 */
+	public TextTimeElement getOdfElement() {
+		return timeElement;
+	}
+
+	// Create an <code>OdfNumberTimeStyle</code> element
+	private OdfNumberTimeStyle newTimeStyle() {
+		OdfFileDom dom = (OdfFileDom) timeElement.getOwnerDocument();
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		OdfNumberTimeStyle newStyle = dom.newOdfElement(OdfNumberTimeStyle.class);
+		newStyle.setStyleNameAttribute(newUniqueStyleName(styles));
+		styles.appendChild(newStyle);
+		return newStyle;
+	}
+
+	private String newUniqueStyleName(OdfOfficeAutomaticStyles styles) {
+		String unique_name;
+		do {
+			unique_name = String.format("N%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getTimeStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return FieldType.TIME_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/TitleField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/TitleField.java
new file mode 100644
index 0000000..3bae0e6
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/TitleField.java
@@ -0,0 +1,69 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTitleElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.meta.Meta;
+
+/**
+ * A <tt>TitleField</tt> displays the title value contained by the document meta
+ * data.
+ * 
+ * @since 0.5
+ */
+public class TitleField extends Field {
+	private TextTitleElement titleElement;
+
+	// package constructor, only called by Fields
+	TitleField(OdfElement odfElement) {
+		TextSpanElement spanElement = ((OdfFileDom) odfElement.getOwnerDocument()).newOdfElement(TextSpanElement.class);
+		odfElement.appendChild(spanElement);
+		titleElement = spanElement.newTextTitleElement();
+		try {
+			OdfFileDom dom = (OdfFileDom) odfElement.getOwnerDocument();
+			Meta meta = ((Document) dom.getDocument()).getOfficeMetadata();
+			titleElement.setTextContent(meta.getTitle());
+		} catch (Exception e) {
+			// get meta info failed, do not set content value. Let editor update
+			// it.
+		}
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Return an instance of <code>TextTitleElement</code> which represents this
+	 * feature.
+	 * 
+	 * @return an instance of <code>TextTitleElement</code>
+	 */
+	public TextTitleElement getOdfElement() {
+		return titleElement;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		return FieldType.TITLE_FIELD;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/VariableContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/VariableContainer.java
new file mode 100644
index 0000000..dbe574c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/VariableContainer.java
@@ -0,0 +1,71 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+
+/**
+ * VariableContainer is a container which maintains the declared variables.
+ * Variable(s) can be added in this container.
+ * 
+ * @see VariableField
+ * @see org.odftoolkit.simple.TextDocument
+ * @see org.odftoolkit.simple.text.Header
+ * @see org.odftoolkit.simple.text.Footer
+ * 
+ * @since 0.5
+ */
+public interface VariableContainer {
+
+	/**
+	 * Get the ODF element which can have variable declare section as child
+	 * element directly according to ODF specification. This element will help
+	 * to find the position to declare a new variable.
+	 * <p>
+	 * The variable declare section may be <text:variable-decls>,
+	 * <text:user-field-decls> or <text:sequence-decls>.
+	 * 
+	 * @return container element which can hold variable declare section.
+	 */
+	public OdfElement getVariableContainerElement();
+
+	/**
+	 * Declare a new variable field to this container.
+	 * 
+	 * @param name
+	 *            the unique name of this variable field.
+	 * @param type
+	 *            the type of this variable field.
+	 * 
+	 * @return declared variable field.
+	 */
+	public VariableField declareVariable(String name, VariableType type);
+
+	/**
+	 * Return the declared variable by name.
+	 * 
+	 * @param name
+	 *            the unique name of this variable field.
+	 * @return the declared variable.
+	 */
+	public VariableField getVariableFieldByName(String name);
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/VariableField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/VariableField.java
new file mode 100644
index 0000000..e32b004
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/field/VariableField.java
@@ -0,0 +1,259 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableSetElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+
+/**
+ * ODF document can contain variables, which are processed or displayed as
+ * VariableFields. In an ODF file, variable declarations shall precede in
+ * document order any use of those variable declarations.
+ * 
+ * @since 0.5
+ */
+public class VariableField extends Field {
+
+	private final VariableType type;
+	private final String name;
+
+	private TextVariableDeclElement simpleVariableElement;
+	private TextVariableDeclsElement simpleVariableElements;
+
+	private TextUserFieldDeclElement userVariableElement;
+	private TextUserFieldDeclsElement userVariableElements;
+
+	/**
+	 * A <tt>VariableType</tt> represents the type of the variable field. There
+	 * are three types of variables:
+	 * <ul>
+	 * <li>SIMPLE: Simple variables, or variables, can take different values at
+	 * different positions throughout a document. Simple variables can be used
+	 * to display different text in recurring elements, such as headers or
+	 * footers.
+	 * <li>USER: User variables have the same value throughout a document. If a
+	 * user variable is set anywhere within the document, all fields in the
+	 * document that display the user variable have the same value.
+	 * <li>SEQUENCE: Sequence variables are used to number items in an ODF text
+	 * document. NOTE: Simple Java API for ODF doesn't support this type now.
+	 * </ul>
+	 * 
+	 * @since 0.5
+	 */
+	public static enum VariableType {
+
+		SIMPLE("simple"), USER("user"), SEQUENCE("sequence");
+
+		private final String variableType;
+
+		VariableType(String type) {
+			variableType = type;
+		}
+
+		@Override
+		public String toString() {
+			return variableType;
+		}
+	}
+
+	// package constructor, only called by Fields
+	VariableField(VariableContainer container, String name, VariableType type) {
+		this.type = type;
+		this.name = name;
+		OdfElement containerElement = container.getVariableContainerElement();
+		switch (type) {
+		case SIMPLE:
+			simpleVariableElements = OdfElement.findFirstChildNode(TextVariableDeclsElement.class, containerElement);
+			if (simpleVariableElements == null) {
+				simpleVariableElements = ((OdfFileDom) containerElement.getOwnerDocument())
+						.newOdfElement(TextVariableDeclsElement.class);
+				containerElement.insertBefore(simpleVariableElements, containerElement.getFirstChild());
+			} else {
+				TextVariableDeclElement simpleVariableElementTmp = (TextVariableDeclElement) simpleVariableElements
+						.getFirstChild();
+				while (simpleVariableElementTmp != null) {
+					if (name.equals(simpleVariableElementTmp.getTextNameAttribute())) {
+						simpleVariableElement = simpleVariableElementTmp;
+						break;
+					} else {
+						simpleVariableElementTmp = (TextVariableDeclElement) simpleVariableElementTmp.getNextSibling();
+					}
+				}
+			}
+			if (simpleVariableElement == null) {
+				simpleVariableElement = simpleVariableElements.newTextVariableDeclElement("string", name);
+			}
+			break;
+		case USER:
+			userVariableElements = OdfElement.findFirstChildNode(TextUserFieldDeclsElement.class, containerElement);
+			if (userVariableElements == null) {
+				userVariableElements = ((OdfFileDom) containerElement.getOwnerDocument())
+						.newOdfElement(TextUserFieldDeclsElement.class);
+				containerElement.insertBefore(userVariableElements, containerElement.getFirstChild());
+			} else {
+				TextUserFieldDeclElement userVariableElementTmp = (TextUserFieldDeclElement) userVariableElements
+						.getFirstChild();
+				while (userVariableElementTmp != null) {
+					if (name.equals(userVariableElementTmp.getTextNameAttribute())) {
+						userVariableElement = userVariableElementTmp;
+						break;
+					} else {
+						userVariableElementTmp = (TextUserFieldDeclElement) userVariableElementTmp.getNextSibling();
+					}
+				}
+			}
+			if (userVariableElement == null) {
+				userVariableElement = userVariableElements.newTextUserFieldDeclElement(0, "string", name);
+			}
+			break;
+		case SEQUENCE:
+			throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+		}
+		Component.registerComponent(this, getOdfElement());
+	}
+
+	/**
+	 * Reset the value of this variable field after the reference OdfElement.
+	 * <p>
+	 * Note: For user variable, the value of all fields in the document that
+	 * display the user variable will be reset.
+	 * 
+	 * @param value
+	 *            the new value of this variable field.
+	 * @param refElement
+	 *            the reference OdfElement. The variable field will be appended
+	 *            after this element. For user variable, this parameter can be
+	 *            null.
+	 */
+	public void updateField(String value, OdfElement refElement) {
+		String officeNS = OdfDocumentNamespace.OFFICE.getUri();
+		switch (type) {
+		case SIMPLE:
+			TextVariableSetElement textVariableSetElement = null;
+			if (refElement instanceof TextPElement) {
+				textVariableSetElement = ((TextPElement) refElement).newTextVariableSetElement(0, "string", name);
+			} else if (refElement instanceof TextSpanElement) {
+				textVariableSetElement = ((TextSpanElement) refElement).newTextVariableSetElement(0, "string", name);
+			} else {
+				TextPElement pElement = ((OdfFileDom) refElement.getOwnerDocument()).newOdfElement(TextPElement.class);
+				OdfElement parentEle = (OdfElement) refElement.getParentNode();
+				parentEle.insertBefore(pElement, refElement.getNextSibling());
+				textVariableSetElement = pElement.newTextVariableSetElement(0, "string", name);
+			}
+			textVariableSetElement.removeAttributeNS(officeNS, "value");
+			textVariableSetElement.setOfficeStringValueAttribute(value);
+			textVariableSetElement.setTextContent(value);
+			break;
+		case USER:
+			userVariableElement.setOfficeValueTypeAttribute("string");
+			userVariableElement.setOfficeStringValueAttribute(value);
+			break;
+		case SEQUENCE:
+			throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+		}
+
+	}
+
+	/**
+	 * Display this variable field after the reference OdfElement.
+	 * 
+	 * @param refElement
+	 *            the reference OdfElement. The variable field will be appended
+	 *            after this element.
+	 */
+	public void displayField(OdfElement refElement) {
+		if (refElement instanceof TextSpanElement) {
+			TextSpanElement spanEle = (TextSpanElement) refElement;
+			switch (type) {
+			case SIMPLE:
+				spanEle.newTextVariableGetElement(name);
+				break;
+			case USER:
+				spanEle.newTextUserFieldGetElement(name);
+				break;
+			case SEQUENCE:
+				throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+			}
+		} else {
+			TextPElement textPElement;
+			if (refElement instanceof TextPElement) {
+				textPElement = (TextPElement) refElement;
+			} else {
+				textPElement = ((OdfFileDom) refElement.getOwnerDocument()).newOdfElement(TextPElement.class);
+				OdfElement parentEle = (OdfElement) refElement.getParentNode();
+				parentEle.insertBefore(textPElement, refElement.getNextSibling());
+			}
+			switch (type) {
+			case SIMPLE:
+				textPElement.newTextVariableGetElement(name);
+				break;
+			case USER:
+				textPElement.newTextUserFieldGetElement(name);
+				break;
+			case SEQUENCE:
+				throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+			}
+		}
+	}
+
+	/**
+	 * Get the variable field name.
+	 * 
+	 * @return the variable field name
+	 */
+	public String getVariableName() {
+		return name;
+	}
+
+	@Override
+	public OdfElement getOdfElement() {
+		switch (type) {
+		case SIMPLE:
+			return simpleVariableElement;
+		case USER:
+			return userVariableElement;
+		case SEQUENCE:
+			throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+		}
+		return null;
+	}
+
+	@Override
+	public FieldType getFieldType() {
+		switch (type) {
+		case SIMPLE:
+			return FieldType.SIMPLE_VARIABLE_FIELD;
+		case USER:
+			return FieldType.USER_VARIABLE_FIELD;
+		case SEQUENCE:
+			throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+		}
+		return null;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/CellSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/CellSelection.java
new file mode 100644
index 0000000..94edc8b
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/CellSelection.java
@@ -0,0 +1,112 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.CellValueAdapter;
+
+/**
+ * Based on <code>TextSelection</code>, <code>CellSelection</code> updates table
+ * cell value and value type when the cell text is replaced by other content.
+ * This is a more complete realization than TextSelection for cell content
+ * replacement, which keeps the synchronization among cell value, value type and
+ * display text.
+ * 
+ * @see TextSelection
+ * @see org.odftoolkit.simple.table.CellValueAdapter
+ * 
+ * @since 0.3
+ */
+public class CellSelection extends TextSelection {
+
+	private Cell mCell;
+
+	/**
+	 * Constructor of CellSelection.
+	 * 
+	 * @param text
+	 *            the text content of this CellSelection
+	 * @param containerElement
+	 *            the paragraph element that contains this CellSelection
+	 * @param index
+	 *            the start index of the text content of the container element
+	 * @param cell
+	 *            the table cell which is selected
+	 */
+	CellSelection(Navigation search, String text, OdfElement containerElement,
+			int index, Cell cell) {
+		super(search, text, containerElement, index);
+		mCell = cell;
+	}
+
+
+	/**
+	 * Replace the text content of selection with a new string. The cell value
+	 * and value type will be updated follow by the rules which are designed in
+	 * the {@link org.odftoolkit.simple.table.CellValueAdapter
+	 * <code>CellValueAdapter</code>}.
+	 * 
+	 * @param newText
+	 *            the replace text String
+	 * @param adapter
+	 *            the <code>CellValueAdapter</code> used to adapt cell value and
+	 *            value type
+	 * @throws InvalidNavigationException
+	 *            if the selection is unavailable.
+	 * 
+	 * @see #replaceWith(String)
+	 * @see org.odftoolkit.simple.table.CellValueAdapter
+	 */
+	public void advancedReplaceWith(String newText, CellValueAdapter adapter) throws InvalidNavigationException {
+		super.replaceWith(newText);
+		if (mCell != null) {
+			String text = mCell.getDisplayText();
+			// update mCell value and value type.
+			mCell.setDisplayText(text, adapter);
+		}
+	}
+
+	/**
+	 * Replace the text content of selection with a new string. The cell value
+	 * and value type will be updated follow by the rules which are designed in
+	 * the {@link org.odftoolkit.simple.table.DefaultCellValueAdapter
+	 * <code>DefaultCellValueAdapter</code>}.
+	 * 
+	 * @param newText
+	 *            the replace text String
+	 * @throws InvalidNavigationException
+	 *            if the selection is unavailable.
+	 * 
+	 * @see org.odftoolkit.simple.table.DefaultCellValueAdapter
+	 */
+	public void advancedReplaceWith(String newText) throws InvalidNavigationException {
+		advancedReplaceWith(newText, CellValueAdapter.DEFAULT_VALUE_ADAPTER);
+	}
+
+	/**
+	 * Get the selected table cell.
+	 * 
+	 * @return the selected table cell
+	 */
+	public Cell getCell() {
+		return mCell;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/FieldSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/FieldSelection.java
new file mode 100644
index 0000000..139938f
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/FieldSelection.java
@@ -0,0 +1,462 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.common.field.ConditionField;
+import org.odftoolkit.simple.common.field.Field;
+import org.odftoolkit.simple.common.field.Fields;
+import org.odftoolkit.simple.common.field.ReferenceField;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * This is a decorator class of TextSelection, which help user replace a text
+ * content with field.
+ * 
+ * @see org.odftoolkit.simple.common.field.Fields
+ * @see org.odftoolkit.simple.common.field.AuthorField
+ * @see org.odftoolkit.simple.common.field.ChapterField
+ * @see org.odftoolkit.simple.common.field.ConditionField
+ * @see org.odftoolkit.simple.common.field.DateField
+ * @see org.odftoolkit.simple.common.field.PageCountField
+ * @see org.odftoolkit.simple.common.field.PageNumberField
+ * @see org.odftoolkit.simple.common.field.ReferenceField
+ * @see org.odftoolkit.simple.common.field.SubjectField
+ * @see org.odftoolkit.simple.common.field.TimeField
+ * @see org.odftoolkit.simple.common.field.TitleField
+ * @see org.odftoolkit.simple.common.field.VariableField
+ * 
+ * @since 0.5
+ */
+public class FieldSelection extends Selection {
+
+	private TextSelection textSelection;
+	private boolean mIsInserted;
+	private OdfTextSpan spanContainer;
+
+	/**
+	 * Replace the content with a simple field, such as author field, page
+	 * number field, date field and so on.
+	 * 
+	 * @param fieldType
+	 *            the simple field type to replace.
+	 */
+	public Field replaceWithSimpleField(Field.FieldType fieldType) {
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		prepareSpanContainer(leftLength, index);
+		Field field = null;
+		switch (fieldType) {
+		case DATE_FIELD:
+			field = Fields.createDateField(spanContainer);
+			break;
+		case FIXED_DATE_FIELD:
+			field = Fields.createFixedDateField(spanContainer);
+			break;
+		case TIME_FIELD:
+			field = Fields.createTimeField(spanContainer);
+			break;
+		case FIXED_TIME_FIELD:
+			field = Fields.createFixedTimeField(spanContainer);
+			break;
+		case PREVIOUS_PAGE_NUMBER_FIELD:
+			field = Fields.createPreviousPageNumberField(spanContainer);
+			break;
+		case CURRENT_PAGE_NUMBER_FIELD:
+			field = Fields.createCurrentPageNumberField(spanContainer);
+			break;
+		case NEXT_PAGE_NUMBER_FIELD:
+			field = Fields.createNextPageNumberField(spanContainer);
+			break;
+		case PAGE_COUNT_FIELD:
+			field = Fields.createPageCountField(spanContainer);
+			break;
+		case TITLE_FIELD:
+			field = Fields.createTitleField(spanContainer);
+			break;
+		case SUBJECT_FIELD:
+			field = Fields.createSubjectField(spanContainer);
+			break;
+		case AUTHOR_NAME_FIELD:
+			field = Fields.createAuthorNameField(spanContainer);
+			break;
+		case AUTHOR_INITIALS_FIELD:
+			field = Fields.createAuthorInitialsField(spanContainer);
+			break;
+		case CHAPTER_FIELD:
+			field = Fields.createChapterField(spanContainer);
+			break;
+		case REFERENCE_FIELD:
+		case SIMPLE_VARIABLE_FIELD:
+		case USER_VARIABLE_FIELD:
+		case CONDITION_FIELD:
+		case HIDDEN_TEXT_FIELD:
+			throw new IllegalArgumentException("this is not a vaild simple field type.");
+		}
+		textSelection.mMatchedText = field.getOdfElement().getTextContent();
+		int textLength = textSelection.mMatchedText.length();
+		int offset = textLength - leftLength;
+		SelectionManager.refresh(textSelection.getContainerElement(), offset, index + textLength);
+		return field;
+	}
+
+	/**
+	 * Replace the content with a reference field.
+	 * 
+	 * @param field
+	 *            the reference field to replace.
+	 */
+	public void replaceWithReferenceField(ReferenceField field, ReferenceField.DisplayType type) {
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		prepareSpanContainer(leftLength, index);
+		field.appendReferenceTo(spanContainer, type);
+		textSelection.mMatchedText = field.getOdfElement().getTextContent();
+		int textLength = textSelection.mMatchedText.length();
+		int offset = textLength - leftLength;
+		SelectionManager.refresh(textSelection.getContainerElement(), offset, index + textLength);
+	}
+
+	/**
+	 * Replace the content with a variable field.
+	 * 
+	 * @param field
+	 *            the variable field to replace.
+	 */
+	public void replaceWithVariableField(VariableField field) {
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		prepareSpanContainer(leftLength, index);
+		field.displayField(spanContainer);
+		textSelection.mMatchedText = field.getOdfElement().getTextContent();
+		int textLength = textSelection.mMatchedText.length();
+		int offset = textLength - leftLength;
+		SelectionManager.refresh(textSelection.getContainerElement(), offset, index + textLength);
+	}
+
+	/**
+	 * Replace the content with a condition field.
+	 * 
+	 * @param condition
+	 *            the condition that determines which of the two text strings is
+	 *            displayed.
+	 * @param trueText
+	 *            the text string to display if a <code>condition</code> is
+	 *            true.
+	 * @param falseText
+	 *            the text string to display if a <code>condition</code> is
+	 *            false.
+	 * @return the created condition field.
+	 */
+	public ConditionField replaceWithConditionField(String condition, String trueText, String falseText) {
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		prepareSpanContainer(leftLength, index);
+		textSelection.mMatchedText = "";
+		int offset = -leftLength;
+		SelectionManager.refresh(textSelection.getContainerElement(), offset, index);
+		return Fields.createConditionField(spanContainer, condition, trueText, falseText);
+	}
+
+	/**
+	 * Replace the content with a hidden text field.
+	 * 
+	 * @param condition
+	 *            the condition that determines whether the text string is
+	 *            displayed or not.
+	 * @param text
+	 *            the text string to display.
+	 * @return the created condition field.
+	 */
+	public ConditionField replaceWithHiddenTextField(String condition, String text) {
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		prepareSpanContainer(leftLength, index);
+		textSelection.mMatchedText = "";
+		int offset = -leftLength;
+		SelectionManager.refresh(textSelection.getContainerElement(), offset, index);
+		return Fields.createHiddenTextField(spanContainer, condition, text);
+	}
+
+	/**
+	 * Apply a style to the selection so that the text style of this selection
+	 * will append the specified style.
+	 * 
+	 * @param style
+	 *            the style can be from the current document or user defined
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	public void applyStyle(OdfStyleBase style) throws InvalidNavigationException {
+		if (spanContainer == null) {
+			textSelection.applyStyle(style);
+		} else {
+			spanContainer.setProperties(style.getStyleProperties());
+		}
+	}
+
+	/**
+	 * Construct a FieldSelection with TextSelection. Then user can replace text
+	 * content with fields.
+	 * 
+	 * @param selection
+	 *            the TextSelection to be decorated.
+	 */
+	public FieldSelection(TextSelection selection) {
+		textSelection = selection;
+		spanContainer = null;
+	}
+
+	/**
+	 * Delete the selection from the document the other matched selection in the
+	 * same container element will be updated automatically because the start
+	 * index of the following selections will be changed when the previous
+	 * selection has been deleted.
+	 * 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		textSelection.cut();
+	}
+
+	/**
+	 * Replace the text content of selection with a new string.
+	 * 
+	 * @param newText
+	 *            the replace text String
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	public void replaceWith(String newText) throws InvalidNavigationException {
+		textSelection.replaceWith(newText);
+	}
+
+	/**
+	 * Paste this selection just after a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtEndOf(positionItem);
+	}
+
+	/**
+	 * Paste this selection just before a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtFrontOf(positionItem);
+	}
+
+	protected void refresh(int offset) {
+		textSelection.refresh(offset);
+	}
+
+	protected void refreshAfterFrontalDelete(Selection deletedItem) {
+		textSelection.refreshAfterFrontalDelete(deletedItem);
+	}
+
+	protected void refreshAfterFrontalInsert(Selection insertedItem) {
+		textSelection.refreshAfterFrontalInsert(insertedItem);
+	}
+
+	/*
+	 * Initialize or clear the <code>OdfTextSpan<code> element which contains
+	 * replaced field.
+	 */
+	private void prepareSpanContainer(int leftLength, int index) {
+		if (spanContainer == null) {
+			OdfElement parentElement = textSelection.getContainerElement();
+			delete(index, leftLength, parentElement);
+			spanContainer = new OdfTextSpan((OdfFileDom) parentElement.getOwnerDocument());
+			mIsInserted = false;
+			insertSpan(spanContainer, index, parentElement);
+		} else {
+			Node childNode = spanContainer.getFirstChild();
+			while (childNode != null) {
+				spanContainer.removeChild(childNode);
+				childNode = spanContainer.getFirstChild();
+			}
+		}
+	}
+
+	/*
+	 * Delete the <code>pNode<code> from the <code>fromIndex</code> text, and
+	 * delete <code>leftLength</code> text.
+	 */
+	private void delete(int fromIndex, int leftLength, Node pNode) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromIndex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						delete(fromIndex, leftLength, node);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*
+	 * Insert <code>textSpan</code> into the from index of <code>pNode<code>.
+	 */
+	private void insertSpan(OdfTextSpan textSpan, int fromIndex, Node pNode) {
+		if (fromIndex < 0) {
+			fromIndex = 0;
+		}
+		if (fromIndex == 0 && mIsInserted) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if (fromIndex <= 0 && mIsInserted) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+				if ((fromIndex != 0) && (nodeLength < fromIndex)) {
+					fromIndex -= nodeLength;
+				} else {
+					// insert result after node, and insert an new text node
+					// after the result node
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					// insert the text span in appropriate position
+					node.setNodeValue(buffer.toString());
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					Node newNode = node.cloneNode(true);
+					newNode.setNodeValue(value.substring(fromIndex, value.length()));
+					if (nextNode != null) {
+						parNode.insertBefore(textSpan, nextNode);
+						parNode.insertBefore(newNode, nextNode);
+					} else {
+						parNode.appendChild(textSpan);
+						parNode.appendChild(newNode);
+					}
+					mIsInserted = true;
+					return;
+				}
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+					fromIndex -= nodeLength;
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+					fromIndex--;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+					fromIndex--;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+					insertSpan(textSpan, fromIndex, node);
+					fromIndex -= nodeLength;
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/ImageSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/ImageSelection.java
new file mode 100644
index 0000000..c9a9563
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/ImageSelection.java
@@ -0,0 +1,376 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.draw.Image;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This is a decorator class of TextSelection, which help user replace a text content with a Image from Document or from URI.
+ * 
+ */
+public class ImageSelection extends Selection {
+
+	private TextSelection textSelection;
+	private DrawFrameElement imageContainer;
+
+	private boolean mIsInserted;
+	
+	/**
+	 * Replace the content with a Image
+	 * 
+	 * @param image the reference Image to replace.
+	 *   
+	 * @return the new Image in the TextDocument,the image name is set to "replace" + System.currentTimeMillis(), please update the name to others by yourself.
+	 *
+	 */
+	public Image replaceWithImage(Image image) {
+		Image mImage =null;
+		if(search instanceof TextNavigation){
+			TextNavigation textSearch = (TextNavigation) search;
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		mIsInserted = false;
+		OdfElement parentElement = textSelection.getContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parentElement.getOwnerDocument();
+		
+			int nodeLength = TextExtractor.getText(
+					this.textSelection.getContainerElement()).length();
+			if (this.textSelection.getText().length() != nodeLength)
+				this.textSelection.setSelectionReplaced(true);
+		try {
+			if (imageContainer == null) {
+				delete(index, leftLength, parentElement);
+				// PrepareContainer
+				imageContainer = ownerDom.newOdfElement(DrawFrameElement.class);
+				insertOdfElement(imageContainer, index, parentElement);
+			} else {
+				NodeList nodeImages = imageContainer.getElementsByTagName("draw:image");
+				Node nodeImage = nodeImages.item(0);
+				DrawImageElement im = (DrawImageElement) nodeImage;
+				Image oldimage = Image.getInstanceof(im);
+				oldimage.remove();
+				// PrepareContainer
+				imageContainer = ownerDom.newOdfElement(DrawFrameElement.class);
+				insertOdfElement(imageContainer, index, parentElement);
+			}
+			// Insert Image resource to package
+			DrawImageElement imageElement = imageContainer.newDrawImageElement();
+			InputStream is = image.getImageInputStream();
+			String internalPath = image.getInternalPath();
+			String mediaType = OdfFileEntry.getMediaTypeString(internalPath);
+			OdfSchemaDocument mOdfSchemaDoc = (OdfSchemaDocument) ownerDom.getDocument();
+			String packagePath = Image.getPackagePath(mOdfSchemaDoc,internalPath);
+			mOdfSchemaDoc.getPackage().insert(is, packagePath, mediaType);
+			packagePath = packagePath.replaceFirst(ownerDom.getDocument().getDocumentPath(), "");
+			Image.configureInsertedImage((OdfSchemaDocument) ownerDom.getDocument(), imageElement,packagePath, false);
+			// get image object
+			mImage = Image.getInstanceof(imageElement);
+			mImage.getStyleHandler().setAchorType(AnchorType.AS_CHARACTER);
+			mImage.setName("replace" + System.currentTimeMillis());
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageSelection.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		}
+		return mImage;
+	}	
+	/**
+	 * Replace the content with a Image
+	 * 
+	 * @param imageUri the URI of the reference Image to replace
+	 *   
+	 * @return the new Image in the TextDocument,the image name is set to "replace" + System.currentTimeMillis(), please update the name to others by yourself
+	 *
+	 */
+	public Image replaceWithImage(URI imageUri) {
+		Image mImage =null;
+		if(search instanceof TextNavigation){
+			TextNavigation textSearch = (TextNavigation) search;
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		mIsInserted = false;
+		OdfElement parentElement = textSelection.getContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parentElement.getOwnerDocument();
+			int nodeLength = TextExtractor.getText(
+					this.textSelection.getContainerElement()).length();
+			if (this.textSelection.getText().length() != nodeLength)
+				this.textSelection.setSelectionReplaced(true);
+		try{
+			if (imageContainer == null) {
+				delete(index, leftLength, parentElement);
+				// PrepareContainer
+				imageContainer = ownerDom.newOdfElement(DrawFrameElement.class);
+				insertOdfElement(imageContainer, index, parentElement);
+			} else {
+				NodeList nodeImages = imageContainer.getElementsByTagName("draw:image");
+				Node nodeImage = nodeImages.item(0);
+				DrawImageElement im = (DrawImageElement) nodeImage;
+				Image oldimage = Image.getInstanceof(im);
+				oldimage.remove();
+				// PrepareContainer
+				imageContainer = ownerDom.newOdfElement(DrawFrameElement.class);
+				insertOdfElement(imageContainer, index, parentElement);
+			}
+			// Insert Image resource to package
+			DrawImageElement imageElement = imageContainer.newDrawImageElement();
+			String imageRef = imageUri.toString();
+			String mediaType = OdfFileEntry.getMediaTypeString(imageRef);
+			OdfSchemaDocument mOdfSchemaDoc = (OdfSchemaDocument) ownerDom.getDocument();
+			String packagePath = Image.getPackagePath(mOdfSchemaDoc, imageRef);
+			mOdfSchemaDoc.getPackage().insert(imageUri, packagePath, mediaType);
+			packagePath = packagePath.replaceFirst(ownerDom.getDocument().getDocumentPath(), "");
+			Image.configureInsertedImage((OdfSchemaDocument) ownerDom.getDocument(), imageElement,packagePath, false);
+			// get image object
+			mImage = Image.getInstanceof(imageElement);
+			mImage.getStyleHandler().setAchorType(AnchorType.AS_CHARACTER);
+			mImage.setName("replace" + System.currentTimeMillis());
+			
+		} catch (Exception e) {
+			Logger.getLogger(ImageSelection.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			}
+		}
+		return mImage;
+	}	
+	/*
+	 * Delete the <code>pNode<code> from the <code>fromIndex</code> text, and
+	 * delete <code>leftLength</code> text.
+	 */
+	private void delete(int fromIndex, int leftLength, Node pNode) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromIndex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						delete(fromIndex, leftLength, node);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/**
+	 * Construct a ImageSelection with TextSelection. Then user can replace text
+	 * content with Image from Document or Image form System
+	 * 
+	 * @param selection
+	 *            the TextSelection to be decorated.
+	 */
+	public ImageSelection(TextSelection selection) {
+		textSelection = selection;
+		search = textSelection.getTextNavigation();
+		imageContainer = null;
+	}
+
+	/**
+	 * Delete the selection from the document the other matched selection in the
+	 * same container element will be updated automatically because the start
+	 * index of the following selections will be changed when the previous
+	 * selection has been deleted.
+	 * 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		textSelection.cut();
+	}
+
+	/**
+	 * Paste this selection just after a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtEndOf(positionItem);
+	}
+	
+
+	/**
+	 * Paste this selection just before a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtFrontOf(positionItem);
+	}
+
+	protected void refresh(int offset) {
+		textSelection.refresh(offset);
+	}
+
+	protected void refreshAfterFrontalDelete(Selection deletedItem) {
+		textSelection.refreshAfterFrontalDelete(deletedItem);
+	}
+
+	protected void refreshAfterFrontalInsert(Selection insertedItem) {
+		textSelection.refreshAfterFrontalInsert(insertedItem);
+	}
+	
+	private void insertOdfElement(OdfElement odfElement, int fromIndex, Node pNode) {
+		if (fromIndex < 0) {
+			fromIndex = 0;
+		}
+		if (fromIndex == 0 && mIsInserted) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if (fromIndex <= 0 && mIsInserted) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+				if ((fromIndex != 0) && (nodeLength < fromIndex)) {
+					fromIndex -= nodeLength;
+				} else {
+					// insert result after node, and insert an new text node
+					// after the result node
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					// insert the text span in appropriate position
+					node.setNodeValue(buffer.toString());
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					Node newNode = node.cloneNode(true);
+					newNode.setNodeValue(value.substring(fromIndex, value.length()));
+					if (nextNode != null) {
+						parNode.insertBefore(odfElement, nextNode);
+						parNode.insertBefore(newNode, nextNode);
+					} else {
+						parNode.appendChild(odfElement);
+						parNode.appendChild(newNode);
+					}
+					mIsInserted = true;
+					return;
+				}
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+					fromIndex -= nodeLength;
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+					fromIndex--;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+					fromIndex--;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+					insertOdfElement(odfElement, fromIndex, node);
+					fromIndex -= nodeLength;
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/InvalidNavigationException.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/InvalidNavigationException.java
new file mode 100644
index 0000000..026cd71
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/InvalidNavigationException.java
@@ -0,0 +1,40 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+/**
+ * Thrown to indicate that the navigation operation can not be processed on
+ * selections
+ */
+public class InvalidNavigationException extends Exception {
+
+	private static final long serialVersionUID = 704778271501721996L;
+
+	/**
+	 * Constructs a <code>InvalidNavigateOperation</code> with the specified
+	 * detail message.
+	 * 
+	 * @param msg
+	 *            the detail message.
+	 */
+	public InvalidNavigationException(String msg) {
+		super(msg);
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/Navigation.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/Navigation.java
new file mode 100644
index 0000000..e9a77fb
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/Navigation.java
@@ -0,0 +1,135 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.w3c.dom.Node;
+
+/**
+ * <code>Navigation</code> is used to navigate the document and find the matched
+ * element by user defined conditions.
+ */
+public abstract class Navigation {
+	
+	/**
+	 * Return true if document still has more matched {@link Selection
+	 * Selection} when traversing the document(in other words return true if
+	 * getNextMatchElement() would return an element instance rather than return
+	 * null)
+	 * 
+	 * @return true if document still has more matched Selection, and vice versa
+	 */
+	public abstract boolean hasNext();
+
+	// public abstract void gotoPrevious();
+	
+	/**
+	 * Get next {@link Selection Selection} result.
+	 * 
+	 * @return the next <code>Selection</code> result
+	 */
+	public abstract Selection nextSelection();
+	
+	/**
+	 * Check if the element is a qualified one.
+	 * <p> Developers can define their own logic here to determine whether an element satisfies the requirements. 
+	 * 
+	 * @param element
+	 *            navigate this element node.
+	 * @return true if the element node match the user defined condition; false
+	 *         if not match.
+	 */
+	public abstract boolean match(Node element);
+
+	/**
+	 * Get the next matched element in the whole element tree.
+	 * 
+	 * @param startpoint
+	 *            navigate from the start point
+	 * @return the next matched element node
+	 */
+	protected Node getNextMatchElement(Node startpoint) {
+		// match the sub tree up to the root node (parent == null)
+		return getNextMatchElementInTree(startpoint, null);
+	}
+
+	/**
+	 * Get the next matched element node in a sub tree
+	 * 
+	 * @param startpoint
+	 *            navigate from the start point
+	 * @param root
+	 *            the root of the sub tree
+	 * @return the next matched element
+	 */
+	protected Node getNextMatchElementInTree(Node startpoint, Node root) {
+		Node matchedNode = null;
+		matchedNode = traverseTree(startpoint);
+		Node currentpoint = startpoint;
+		while ((matchedNode == null) && (currentpoint != root)) {
+			Node sibling = currentpoint.getNextSibling();
+			if ((sibling != null)
+					&& (sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.ELEMENT_NODE)
+					&& (match(sibling))) {
+				matchedNode = sibling;
+				break;
+			}
+			while ((sibling != null) && (matchedNode == null)) {
+				if ((sibling.getNodeType() == Node.TEXT_NODE || sibling.getNodeType() == Node.ELEMENT_NODE)) {
+					matchedNode = traverseTree(sibling);
+				}
+				if (matchedNode == null) {
+					sibling = sibling.getNextSibling();
+					if (sibling != null && match(sibling)) {
+						matchedNode = sibling;
+						break;
+					}
+				}
+			}
+			currentpoint = currentpoint.getParentNode();
+		}
+		return matchedNode;
+	}
+
+	private Node traverseTree(Node root) {
+		Node matchedNode = null;
+		if (root == null) {
+			return null;
+		}
+		// if (match(root)) return root;
+		Node node = root.getFirstChild();
+		while (node != null) {
+			if ((node.getNodeType() == Node.TEXT_NODE || node.getNodeType() == Node.ELEMENT_NODE)
+					&& (!(node instanceof OfficeAnnotationElement))) {
+				if (match(node) == true) {
+					matchedNode = node;
+					break;
+				} else {
+					matchedNode = traverseTree(node);
+					if (matchedNode != null) {
+						break;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+		return matchedNode;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/ParagraphSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/ParagraphSelection.java
new file mode 100644
index 0000000..007664f
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/ParagraphSelection.java
@@ -0,0 +1,457 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleMasterPageNameAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.common.navigation.Selection;
+import org.odftoolkit.simple.common.navigation.TextNavigation;
+import org.odftoolkit.simple.common.navigation.TextSelection;
+import org.odftoolkit.simple.style.ParagraphProperties;
+import org.odftoolkit.simple.text.Paragraph;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This is a decorator class of TextSelection, which help user replace a text content with a Paragraph.
+ * 
+ */
+public class ParagraphSelection extends Selection {
+
+	private TextSelection textSelection;
+	private Paragraph paragraphContainer;
+	private Paragraph sourceParagraph;
+	
+	/**
+	 * Replace the content with a paragraph, the paragraph can be in the same TextDocument or in a different Document.
+	 * 
+	 * @param paragraph
+	 *            the reference paragraph to replace.
+	 */
+	public Paragraph replaceWithParagraph(Paragraph paragraph) {
+		this.sourceParagraph=paragraph;
+		if (search instanceof TextNavigation) {
+			TextNavigation textSearch = (TextNavigation) search;
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+			boolean continued = false;
+			if (textSearch != null
+					&& textSearch.getReplacedItem() != null
+					&& textSearch.getReplacedItem().getElement() == this.textSelection
+							.getElement()) {
+				continued = true;
+			} else {
+				textSearch.setHandlePageBreak(false);
+			}
+			prepareParagraphContainer(leftLength, index, continued);
+			Selection.SelectionManager.unregisterItem(this.textSelection);
+			if (textSearch != null) {
+				textSearch.setReplacedItem(this.textSelection);
+				OdfElement containerElement = paragraphContainer
+						.getOdfElement();
+				String content = TextExtractor.getText(containerElement);
+				TextSelection selected = TextSelection.newTextSelection(
+						textSearch, this.textSelection.getText(),
+						containerElement, content.length() - 1);
+				textSearch.setSelectedItem(selected);
+			}
+		}
+		return paragraphContainer;
+	}
+
+	/**
+	 * Construct a ParagraphSelection with TextSelection. Then user can replace text
+	 * content with paragraph.
+	 * 
+	 * @param selection
+	 *            the TextSelection to be decorated.
+	 */
+	public ParagraphSelection(TextSelection selection) {
+		textSelection = selection;
+		search = textSelection.getTextNavigation();
+		paragraphContainer = null;
+	}
+
+	/**
+	 * Delete the selection from the document the other matched selection in the
+	 * same container element will be updated automatically because the start
+	 * index of the following selections will be changed when the previous
+	 * selection has been deleted.
+	 * 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		textSelection.cut();
+	}
+
+	/**
+	 * Paste this selection just after a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtEndOf(positionItem);
+	}
+	private void delete(int fromIndex, int leftLength, Node pNode) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromIndex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						delete(fromIndex, leftLength, node);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/**
+	 * Paste this selection just before a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtFrontOf(positionItem);
+	}
+
+	protected void refresh(int offset) {
+		textSelection.refresh(offset);
+	}
+
+	protected void refreshAfterFrontalDelete(Selection deletedItem) {
+		textSelection.refreshAfterFrontalDelete(deletedItem);
+	}
+
+	protected void refreshAfterFrontalInsert(Selection insertedItem) {
+		textSelection.refreshAfterFrontalInsert(insertedItem);
+	}
+
+	private ParagraphProperties getParagraphPropertiesForWrite() {
+		OdfStyleBase style = paragraphContainer.getStyleHandler()
+				.getStyleElementForRead();
+		if (style == null || style.getLocalName().equals("default-style")) {
+			OdfStyle element = paragraphContainer.getStyleHandler()
+					.getStyleElementForWrite();
+			NodeList nodes = element.getChildNodes();
+			int size = nodes.getLength();
+			for (int i = 0; i < size; i++) {
+				element.removeChild(nodes.item(0));
+			}
+		}
+		ParagraphProperties properties = paragraphContainer.getStyleHandler()
+				.getParagraphPropertiesForWrite();
+		return properties;
+	}
+	private OdfStyleBase getParagraphStyleElementForWrite() {
+		OdfStyleBase style = paragraphContainer.getStyleHandler()
+				.getStyleElementForRead();
+		OdfStyle element = paragraphContainer.getStyleHandler()
+				.getStyleElementForWrite();
+		if (style == null || style.getLocalName().equals("default-style")) {
+			NodeList nodes = element.getChildNodes();
+			int size = nodes.getLength();
+			for (int i = 0; i < size; i++) {
+				element.removeChild(nodes.item(0));
+			}
+		}
+		return element;
+	}
+	private void handlePageBreak(Paragraph origParagraph, String pos,
+			boolean continued) {
+		if (continued
+				&& this.textSelection.getTextNavigation().isHandlePageBreak())
+			return;
+		ParagraphProperties orgParaPty = origParagraph.getStyleHandler()
+				.getParagraphPropertiesForRead();
+		boolean handleBreak = false;
+		String posInPara = "middle";
+		if (continued && pos.equals("whole")) {
+			posInPara = "end";
+		} else if (continued && pos.endsWith("head")) {
+			posInPara = "middle";
+		} else if (continued && pos.endsWith("end")) {
+			posInPara = "end";
+		} else if (!continued && pos.endsWith("whole")) {
+			posInPara = "whole";
+		} else if (!continued && pos.endsWith("head")) {
+			posInPara = "head";
+		} else if (!continued && pos.endsWith("end")) {
+			posInPara = "end";
+		}
+		if (orgParaPty != null) {
+			String breakAttribute = orgParaPty.getBreakBefore();
+			if (breakAttribute != null) {
+				if (posInPara.equals("head") || posInPara.equals("whole")) {
+					getParagraphPropertiesForWrite().setBreak("before",
+							breakAttribute);
+					handleBreak = true;
+				}
+			}
+			breakAttribute = orgParaPty.getBreakAfter();
+			if (breakAttribute != null) {
+				if (posInPara.equals("end") || posInPara.equals("whole")) {
+					getParagraphPropertiesForWrite().setBreak("after",
+							breakAttribute);
+					handleBreak = true;
+				}
+			}
+		}
+		String masterStyle = origParagraph
+				.getStyleHandler()
+				.getStyleElementForRead()
+				.getOdfAttributeValue(
+						OdfName.newName(OdfDocumentNamespace.STYLE,
+								"master-page-name"));
+		if (masterStyle != null && !masterStyle.isEmpty()) {
+			if (posInPara.equals("head") || posInPara.equals("whole")) {
+				getParagraphStyleElementForWrite().setOdfAttributeValue(
+						OdfName.newName(OdfDocumentNamespace.STYLE,
+								"master-page-name"), masterStyle);
+				handleBreak = true;
+				try {
+					int pageNumber = orgParaPty.getPageNumber();
+					if (pos.equals("head")) {
+						paragraphContainer.getStyleHandler()
+								.getParagraphPropertiesForWrite()
+								.setPageNumber(pageNumber);
+					}
+				} catch (NumberFormatException e) {
+					Logger.getLogger(ParagraphSelection.class.getName()).log(
+							Level.SEVERE, e.getMessage(), "NumberFormatException");
+				}
+			}
+		}
+		if (handleBreak && !posInPara.equals("whole"))
+			cleanBreakProperty(origParagraph);
+	}
+	private void cleanBreakProperty(Paragraph paragraph) {
+		TextNavigation search = this.textSelection.getTextNavigation();
+		if (search == null)
+			throw new IllegalStateException("Navigation is null");
+		OdfStyleBase styleElement = paragraph.getStyleHandler()
+				.getStyleElementForRead();
+		String name = styleElement.getAttribute("style:name");
+		String newName = null;
+		OdfElement modifiedStyleElement = search
+				.getModifiedStyleElement(styleElement);
+		if (modifiedStyleElement == null) {
+			modifiedStyleElement = (OdfElement) styleElement.cloneNode(true);
+			search.addModifiedStyleElement(styleElement, modifiedStyleElement);
+			NodeList paragraphProperties = modifiedStyleElement
+					.getElementsByTagName("style:paragraph-properties");
+			if (paragraphProperties != null
+					&& paragraphProperties.getLength() > 0) {
+				StyleParagraphPropertiesElement property = (StyleParagraphPropertiesElement) paragraphProperties
+						.item(0);
+				property.removeAttribute("fo:break-before");
+				property.removeAttribute("fo:break-after");
+				property.removeAttribute("style:page-number");
+			}
+			modifiedStyleElement.removeAttribute("style:master-page-name");
+			newName = name + "-" + makeUniqueName();
+			NamedNodeMap attributes = modifiedStyleElement.getAttributes();
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node item = attributes.item(i);
+					String value = item.getNodeValue();
+					if (name.equals(value)) {
+						item.setNodeValue(newName);
+						break;
+					}
+				}
+			}
+			styleElement.getParentNode().appendChild(modifiedStyleElement);
+		} else {
+			newName = modifiedStyleElement.getAttribute("style:name");
+		}
+		NamedNodeMap attributes = paragraph.getOdfElement().getAttributes();
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Node item = attributes.item(i);
+				String value = item.getNodeValue();
+				if (name.equals(value)) {
+					item.setNodeValue(newName);
+					break;
+				}
+			}
+		}
+		this.textSelection.getTextNavigation().setHandlePageBreak(true);
+	}
+	String makeUniqueName() {
+		return String.format("p%06x", (int) (Math.random() * 0xffffff));
+	}
+	private void prepareParagraphContainer(int leftLength, int index,
+			boolean continued) {
+		if (paragraphContainer == null) {
+			String pos = "middle";
+			OdfElement rightparentElement = textSelection.getContainerElement();
+			int nodeLength = TextExtractor.getText(rightparentElement).length();
+			if(index==0){
+				if(leftLength==nodeLength){
+					//Replace whole Paragraph
+					Paragraph orgparagraph = Paragraph
+							.getInstanceof((TextParagraphElementBase) rightparentElement);
+					TextDocument document = (TextDocument) orgparagraph
+							.getOwnerDocument();
+					paragraphContainer = document.insertParagraph(orgparagraph,
+							sourceParagraph, false);
+					NodeList cnl = rightparentElement.getChildNodes();
+					pos = "whole";
+					handlePageBreak(orgparagraph, pos, continued);
+
+					rightparentElement.getParentNode().removeChild(
+							rightparentElement);
+				}else{
+					//at the start of original Paragraph, insert before original Paragraph
+					delete(index, leftLength, rightparentElement);
+					Paragraph orgparagraph = Paragraph
+							.getInstanceof((TextParagraphElementBase) rightparentElement);
+					TextDocument document = (TextDocument) orgparagraph
+							.getOwnerDocument();
+					paragraphContainer = document.insertParagraph(orgparagraph,
+							sourceParagraph, true);
+					pos = "head";
+					handlePageBreak(orgparagraph, pos, continued);
+			}
+			} else if (nodeLength == (index + leftLength)) {
+				//at the end of original Paragraph, insert after original Paragraph
+				delete(index, leftLength, rightparentElement);
+				Paragraph orgparagraph = Paragraph
+						.getInstanceof((TextParagraphElementBase) rightparentElement);
+				TextDocument document = (TextDocument) orgparagraph
+						.getOwnerDocument();
+				paragraphContainer = document.insertParagraph(orgparagraph,
+						sourceParagraph, false);
+				handlePageBreak(orgparagraph, pos, continued);
+			}else{
+				//at the middle of original Paragraph, split original Paragraph, insert before the second Paragraph.
+				delete(index, leftLength, rightparentElement);
+				Node leftparentElement = rightparentElement.cloneNode(true);
+				rightparentElement.getParentNode().insertBefore(
+						leftparentElement, rightparentElement);
+				nodeLength = TextExtractor.getText(
+						(OdfElement) leftparentElement).length();
+				delete(index, nodeLength-index, leftparentElement);
+				delete(0, index, rightparentElement);
+				Paragraph orgparagraph = Paragraph
+						.getInstanceof((TextParagraphElementBase) rightparentElement);
+				TextDocument document = (TextDocument) orgparagraph
+						.getOwnerDocument();
+				paragraphContainer = document.insertParagraph(orgparagraph,
+						sourceParagraph, true);
+				if (!continued)
+					cleanBreakProperty(orgparagraph);
+				
+			}
+		} else{
+			TextDocument document = (TextDocument) paragraphContainer
+					.getOwnerDocument();
+			Paragraph tmp = document.insertParagraph(paragraphContainer,
+					sourceParagraph, true);
+			paragraphContainer.remove();
+			paragraphContainer=tmp;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/Selection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/Selection.java
new file mode 100644
index 0000000..0a97aa8
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/Selection.java
@@ -0,0 +1,262 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.Hashtable;
+import java.util.Vector;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+/**
+ * <code>Selection</code> describes one of the matched results, which is
+ * recognized by the container element, the start index of the text content in
+ * this element and the text content.
+ */
+public abstract class Selection {
+
+	private OdfElement mElement;
+	private int mIndex;
+	protected Navigation search;
+	public Navigation getNavigation() {
+		return search;
+	}
+
+	/**
+	 * Get the container element of this <code>Selection</code>.
+	 * 
+	 * @return the container element
+	 */
+	public OdfElement getElement() {
+		return mElement;
+	}
+
+	/**
+	 * Get the start index of the text content in the container element. This is
+	 * only meaningful for {@link TextSelection TextSelection} and its sub
+	 * classes, other type of <code>Selection</code> will return 0.
+	 * 
+	 * @return the start index of the container element
+	 */
+	public int getIndex() {
+		return mIndex;
+	}
+
+	/**
+	 * Cut current <code>Selection</code>.
+	 * 
+	 * @throws InvalidNavigationException
+	 */
+	public abstract void cut() throws InvalidNavigationException;
+
+	/**
+	 * Paste current <code>Selection</code> at front of the specified position
+	 * <code>Selection</code>.
+	 * 
+	 * @param positionItem
+	 *            the position <code>Selection</code>
+	 * @throws InvalidNavigationException
+	 */
+	public abstract void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException;
+
+	/**
+	 * Paste current <code>Selection</code> at end of the specified position
+	 * <code>Selection</code>.
+	 * 
+	 * @param positionItem
+	 *            the position <code>Selection</code>
+	 * @throws InvalidNavigationException
+	 */
+	public abstract void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException;
+
+	/**
+	 * When a selected item has been deleted, the <code>Selection</code>s after
+	 * this deleted <code>Selection</code> should be refreshed, as these
+	 * <code>Selection</code>s index have been changed.
+	 * 
+	 * @param deletedItem
+	 *            the deleted <code>Selection</code>
+	 */
+	protected abstract void refreshAfterFrontalDelete(Selection deletedItem);
+
+	/**
+	 * When a selected item has been inserted, the <code>Selection</code> after
+	 * the inserted item should be refresh, as these <code>Selection</code>s
+	 * index have been changed.
+	 * 
+	 * @param insertedItem
+	 *            the inserted <code>Selection</code>
+	 */
+	protected abstract void refreshAfterFrontalInsert(Selection insertedItem);
+
+	/**
+	 * A quick method to update the index of this <code>Selection</code>.
+	 * 
+	 * @param offset
+	 *            the offset that the index should be added.
+	 */
+	protected abstract void refresh(int offset);
+
+	/**
+	 * SelectionManager can manage all the <code>Selection</code>s that are
+	 * returned to end users. This SelectionManager contains a repository of all
+	 * <code>Selection</code>s, and will refresh the status/index of
+	 * <code>Selection</code>s after certain operation.
+	 */
+	static class SelectionManager {
+
+		private static Hashtable<OdfElement, Vector<Selection>> repository = new Hashtable<OdfElement, Vector<Selection>>();
+
+		/**
+		 * Register the <code>Selection</code> item.
+		 * 
+		 * @param item
+		 *            the <code>Selection</code> item
+		 */
+		public static void registerItem(Selection item) {
+			OdfElement element = item.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				int i = 0;
+				while (i < selections.size()) {
+					if (selections.get(i).getIndex() > item.getIndex()) {
+						selections.insertElementAt(item, i);
+						break;
+					}
+					i++;
+				}
+				if (i == selections.size()) {
+					selections.add(item);
+				}
+			} else {
+				Vector<Selection> al = new Vector<Selection>();
+				al.add(item);
+				repository.put(element, al);
+			}
+		}
+
+		/**
+		 * Refresh the <code>Selection</code>s in repository after a item is
+		 * cut.
+		 * 
+		 * @param cutItem
+		 *            the cut item
+		 */
+		public synchronized static void refreshAfterCut(Selection cutItem) {
+			// travase the whole sub tree
+			OdfElement element = cutItem.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() > cutItem.getIndex()) {
+						selections.get(i).refreshAfterFrontalDelete(cutItem);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Refresh the selections in repository after pastedAtFrontOf operation
+		 * is called.
+		 * 
+		 * @param item
+		 *            the pasted item
+		 * @param positionItem
+		 *            the position item
+		 */
+		public synchronized static void refreshAfterPasteAtFrontOf(Selection item, Selection positionItem) {
+			// travase the whole sub tree
+			OdfElement element = positionItem.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() >= positionItem.getIndex()) {
+						selections.get(i).refreshAfterFrontalInsert(item);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Refresh the <code>Selection</code>s in repository after pastedAtEndOf
+		 * operation is called.
+		 * 
+		 * @param item
+		 *            the pasted item
+		 * @param positionItem
+		 *            the position item
+		 */
+		public synchronized static void refreshAfterPasteAtEndOf(Selection item, Selection positionItem) {
+			OdfElement element = positionItem.getElement();
+			int positionIndex;
+			if (positionItem instanceof TextSelection) {
+				positionIndex = positionItem.getIndex() + ((TextSelection) positionItem).getText().length();
+			} else {
+				positionIndex = positionItem.getIndex();
+			}
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() >= positionIndex) {
+						selections.get(i).refreshAfterFrontalInsert(item);
+					}
+				}
+			}
+		}
+
+		/**
+		 * Remove the <code>Selection</code> from repository.
+		 * 
+		 * @param item
+		 *            <code>Selection</code> item
+		 */
+		public static void unregisterItem(Selection item) {
+			OdfElement element = item.getElement();
+			if (repository.containsKey(element)) {
+				Vector<Selection> selections = repository.get(element);
+				selections.remove(item);
+			}
+		}
+
+		/**
+		 * A direct method to update all the <code>Selection</code>s contained
+		 * in a element after a certain position.
+		 * 
+		 * @param containerElement
+		 *            the container element
+		 * @param offset
+		 *            the offset
+		 * @param positionIndex
+		 *            the index of a certain position
+		 */
+		public synchronized static void refresh(OdfElement containerElement, int offset, int positionIndex) {
+			if (repository.containsKey(containerElement)) {
+				Vector<Selection> selections = repository.get(containerElement);
+				for (int i = 0; i < selections.size(); i++) {
+					if (selections.get(i).getIndex() >= positionIndex) {
+						selections.get(i).refresh(offset);
+					}
+				}
+			}
+		}
+
+		private SelectionManager() {
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TableSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TableSelection.java
new file mode 100644
index 0000000..d552139
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TableSelection.java
@@ -0,0 +1,450 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.common.navigation.Navigation;
+import org.odftoolkit.simple.common.navigation.Selection;
+import org.odftoolkit.simple.common.navigation.TextNavigation;
+import org.odftoolkit.simple.common.navigation.TextSelection;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.style.ParagraphProperties;
+import org.odftoolkit.simple.style.TableProperties;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Row;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This is a decorator class of TextSelection, which help user replace a text content with a Table.
+ * 
+ */
+public class TableSelection extends Selection {
+
+	private TextSelection textSelection;
+	private Table tableContainer;
+	private Table sourceTable;
+	
+	/**
+	 * Replace the content with a Table , the table can be in the same TextDocument or in a different Document.
+	 * 
+	 * @param paragraph the reference table to replace.
+	 * 
+	 * @return the new Table in the TextDocument
+	 */
+	public Table replaceWithTable(Table table) {
+		this.sourceTable=table;
+		if (search instanceof TextNavigation) {
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+			boolean continued = false;
+			TextNavigation textSearch = (TextNavigation) search;
+			if (textSearch != null
+					&& textSearch.getReplacedItem() != null
+					&& textSearch.getReplacedItem().getElement() == this.textSelection
+							.getElement()) {
+				continued = true;
+			} else {
+				textSearch.setHandlePageBreak(false);
+			}
+			preparetableContainer(leftLength, index, continued);
+			Selection.SelectionManager.unregisterItem(this.textSelection);
+			if (textSearch != null) {
+				textSearch.setReplacedItem(this.textSelection);
+				Paragraph lastParagraph = getLastParagraphInTable(tableContainer);
+				OdfElement newStartPoint;
+				if (lastParagraph != null) {
+					newStartPoint = lastParagraph.getOdfElement();
+				} else {
+					newStartPoint = tableContainer.getOdfElement();
+				}
+				String content = TextExtractor.getText(newStartPoint);
+				TextSelection selected = newTextSelection(textSearch,
+						this.textSelection.getText(), newStartPoint,
+						content.length() - 1);
+				textSearch.setSelectedItem(selected);
+			}
+		}
+		return tableContainer;
+	}
+
+	/**
+	 * Construct a TableSelection with TextSelection. Then user can replace text
+	 * content with {@link org.odftoolkit.simple.table.Table table}.
+	 * 
+	 * @param selection
+	 *            the TextSelection to be decorated.
+	 */
+	public TableSelection(TextSelection selection) {
+		textSelection = selection;
+		search = textSelection.getTextNavigation();
+		tableContainer = null;
+	}
+
+	/**
+	 * Delete the selection from the document the other matched selection in the
+	 * same container element will be updated automatically because the start
+	 * index of the following selections will be changed when the previous
+	 * selection has been deleted.
+	 * 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		textSelection.cut();
+	}
+
+	/**
+	 * Paste this selection just after a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtEndOf(positionItem);
+	}
+	private void delete(int fromIndex, int leftLength, Node pNode) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromIndex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						delete(fromIndex, leftLength, node);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/**
+	 * Paste this selection just before a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtFrontOf(positionItem);
+	}
+
+	protected void refresh(int offset) {
+		textSelection.refresh(offset);
+	}
+
+	protected void refreshAfterFrontalDelete(Selection deletedItem) {
+		textSelection.refreshAfterFrontalDelete(deletedItem);
+	}
+
+	protected void refreshAfterFrontalInsert(Selection insertedItem) {
+		textSelection.refreshAfterFrontalInsert(insertedItem);
+	}
+
+	private void preparetableContainer(int leftLength, int index,
+			boolean continued) {
+		if (tableContainer == null) {
+			String pos = "middle";
+			OdfElement rightparentElement = textSelection.getContainerElement();
+			int nodeLength = TextExtractor.getText(rightparentElement).length();
+			if(index==0){
+				
+				if(leftLength==nodeLength){
+					//Replace whole Paragraph
+					Paragraph orgparagraph = Paragraph
+							.getInstanceof((TextParagraphElementBase) rightparentElement);
+					TextDocument document = (TextDocument) orgparagraph
+							.getOwnerDocument();
+					tableContainer = document.insertTable(orgparagraph,
+							sourceTable, false);
+					pos = "whole";
+					handlePageBreak(orgparagraph, pos, continued);
+
+					rightparentElement.getParentNode().removeChild(
+							rightparentElement);
+				}else{
+					//at the start of original Paragraph, insert before original Paragraph
+					delete(index, leftLength, rightparentElement);
+					Paragraph orgparagraph = Paragraph
+							.getInstanceof((TextParagraphElementBase) rightparentElement);
+					TextDocument document = (TextDocument) orgparagraph
+							.getOwnerDocument();
+					tableContainer = document.insertTable(orgparagraph,
+							sourceTable, true);
+					pos = "head";
+					handlePageBreak(orgparagraph, pos, continued);
+			}
+			} else if (nodeLength == (index + leftLength)) {
+				//at the end of original Paragraph, insert after original Paragraph
+				delete(index, leftLength, rightparentElement);
+				Paragraph orgparagraph = Paragraph
+						.getInstanceof((TextParagraphElementBase) rightparentElement);
+				TextDocument document = (TextDocument) orgparagraph
+						.getOwnerDocument();
+				tableContainer = document.insertTable(orgparagraph,
+						sourceTable, false);
+				handlePageBreak(orgparagraph, pos, continued);
+			}else{
+				//at the middle of original Paragraph, split original Paragraph, insert before the second Paragraph.
+				delete(index, leftLength, rightparentElement);
+				Node leftparentElement = rightparentElement.cloneNode(true);
+				rightparentElement.getParentNode().insertBefore(
+						leftparentElement, rightparentElement);
+				nodeLength = TextExtractor.getText(
+						(OdfElement) leftparentElement).length();
+				delete(index, nodeLength-index, leftparentElement);
+				delete(0, index, rightparentElement);
+				Paragraph orgparagraph = Paragraph
+						.getInstanceof((TextParagraphElementBase) rightparentElement);
+				TextDocument document = (TextDocument) orgparagraph
+						.getOwnerDocument();
+				tableContainer = document.insertTable(orgparagraph,
+						sourceTable, true);
+				if (!continued)
+					textSelection.cleanBreakProperty(orgparagraph);
+			}
+		} else{
+			TextDocument document = (TextDocument) tableContainer
+					.getOwnerDocument();
+			TableTableElement newTEle = (TableTableElement) document
+					.insertOdfElement(tableContainer.getOdfElement(),
+							tableContainer.getOwnerDocument(),
+							sourceTable.getOdfElement(), true);
+			tableContainer.getOdfElement().getParentNode()
+					.removeChild(tableContainer.getOdfElement());
+			Table table = Table.getInstance(newTEle);
+			tableContainer=table;
+		}
+	}
+	private Paragraph getLastParagraphInTable(Table table) {
+		Paragraph paragraph = null;
+		int rowCount = table.getRowCount();
+		for (int i = rowCount - 1; i >= 0; i--) {
+			Row row = table.getRowByIndex(i);
+			int cellCount = row.getCellCount();
+			for (int j = cellCount - 1; j >= 0; j--) {
+				Cell cell = row.getCellByIndex(j);
+				paragraph = cell.getParagraphByReverseIndex(0, false);
+				if (paragraph != null)
+					return paragraph;
+			}
+		}
+		return paragraph;
+	}
+	private TableProperties getTablePropertiesForWrite() {
+		OdfStyleBase style = tableContainer.getStyleHandler()
+				.getStyleElementForRead();
+		if (style == null || style.getLocalName().equals("default-style")) {
+			OdfStyle element = tableContainer.getStyleHandler()
+					.getStyleElementForWrite();
+			NodeList nodes = element.getChildNodes();
+			int size = nodes.getLength();
+			for (int i = 0; i < size; i++) {
+				element.removeChild(nodes.item(0));
+			}
+		}
+		TableProperties properties = tableContainer.getStyleHandler()
+				.getTablePropertiesForWrite();
+		return properties;
+	}
+	private OdfStyleBase getParagraphStyleElementForWrite() {
+		OdfStyleBase style = tableContainer.getStyleHandler()
+				.getStyleElementForRead();
+		OdfStyle element = tableContainer.getStyleHandler()
+				.getStyleElementForWrite();
+		if (style == null || style.getLocalName().equals("default-style")) {
+			NodeList nodes = element.getChildNodes();
+			int size = nodes.getLength();
+			for (int i = 0; i < size; i++) {
+				element.removeChild(nodes.item(0));
+			}
+		}
+		return element;
+	}
+	private void handlePageBreak(Paragraph origParagraph, String pos,
+			boolean continued) {
+		if (continued
+				&& this.textSelection.getTextNavigation().isHandlePageBreak())
+			return;
+		ParagraphProperties orgParaPty = origParagraph.getStyleHandler()
+				.getParagraphPropertiesForRead();
+		boolean handleBreak = false;
+		String posInPara = "middle";
+		if (continued && pos.equals("whole")) {
+			posInPara = "end";
+		} else if (continued && pos.endsWith("head")) {
+			posInPara = "middle";
+		} else if (continued && pos.endsWith("end")) {
+			posInPara = "end";
+		} else if (!continued && pos.endsWith("whole")) {
+			posInPara = "whole";
+		} else if (!continued && pos.endsWith("head")) {
+			posInPara = "head";
+		} else if (!continued && pos.endsWith("end")) {
+			posInPara = "end";
+		}
+		if (orgParaPty != null) {
+			String breakAttribute = orgParaPty.getBreakBefore();
+			if (breakAttribute != null) {
+				if (posInPara.equals("head") || posInPara.equals("whole")) {
+					getTablePropertiesForWrite().setBreak("before",
+							breakAttribute);
+					handleBreak = true;
+				}
+			}
+			breakAttribute = orgParaPty.getBreakAfter();
+			if (breakAttribute != null) {
+				if (posInPara.equals("end") || posInPara.equals("whole")) {
+					getTablePropertiesForWrite().setBreak("after",
+							breakAttribute);
+					handleBreak = true;
+				}
+			}
+		}
+		String masterStyle = origParagraph
+				.getStyleHandler()
+				.getStyleElementForRead()
+				.getOdfAttributeValue(
+						OdfName.newName(OdfDocumentNamespace.STYLE,
+								"master-page-name"));
+		if (masterStyle != null && !masterStyle.isEmpty()) {
+			if (posInPara.equals("head") || posInPara.equals("whole")) {
+				getParagraphStyleElementForWrite().setOdfAttributeValue(
+						OdfName.newName(OdfDocumentNamespace.STYLE,
+								"master-page-name"), masterStyle);
+				handleBreak = true;
+				try {
+					int pageNumber = orgParaPty.getPageNumber();
+					if (pos.equals("head")) {
+						tableContainer.getStyleHandler()
+								.getParagraphPropertiesForWrite()
+								.setPageNumber(pageNumber);
+					}
+				} catch (NumberFormatException e) {
+					Logger.getLogger(ParagraphSelection.class.getName()).log(
+							Level.SEVERE, e.getMessage(), "NumberFormatException");
+				}
+			}
+		}
+		if (handleBreak && !posInPara.equals("whole"))
+			textSelection.cleanBreakProperty(origParagraph);
+	}
+	private class TextSelectionForTableReplacement extends TextSelection {
+		private OdfElement mContainer;
+		TextSelectionForTableReplacement(Navigation search, String text,
+				OdfElement containerElement, int index) {
+			super(search, text, containerElement, index);
+			if (containerElement instanceof TableTableElement)
+				mContainer = containerElement;
+		}
+		@Override
+		public OdfElement getContainerElement() {
+			OdfElement element = super.getContainerElement();
+			if (element == null) {
+				element = mContainer;
+			}
+			return element;
+		}
+	}
+	TextSelection newTextSelection(Navigation search, String text,
+			OdfElement containerElement, int index) {
+		TextSelection selection = new TextSelectionForTableReplacement(search,
+				text, containerElement, index);
+		Selection.SelectionManager.registerItem(selection);
+		return selection;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextDocumentSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextDocumentSelection.java
new file mode 100644
index 0000000..702ad72
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextDocumentSelection.java
@@ -0,0 +1,294 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.office.OfficeTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.text.Paragraph;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This is a decorator class of TextSelection, which help user replace a text
+ * content with a TextDocument, all Styles be included.
+ */
+public class TextDocumentSelection extends Selection {
+	
+	private TextSelection textSelection;
+	private TextDocument sourceDocument;
+	
+	/**
+	 * Replace the Searched Content with a TextDocument with Styles.
+	 * <p>
+	 * Note: You need cache the TextNavigation.nextSelection item because after
+	 * you replace currtenTextSelection with TextDocument,
+	 * TextNavigation.nextSelection will search from the inserted Content, it
+	 * will make you into a loop if the Search keyword also can be found in the
+	 * new inserted Content.
+	 * </p>
+	 * The right way to use this replaceWithTextDocument(TextDocument
+	 * textDocument) method should like this: <Code>
+	 * <p>	search = new TextNavigation("SIMPLE", doc);    </p>
+	 * <p>	TextSelection currtenTextSelection,nextTextSelection=null;</p>
+	 * <p>		while (search.hasNext()) {</p>
+	 * <p>			if(nextTextSelection!=null){</p>
+	 * <p>				currtenTextSelection=nextTextSelection;</p>
+	 * <p>			}else {</p>
+	 * <p>			 	currtenTextSelection = (TextSelection) search.nextSelection();</p>
+	 * <p>			}</p>
+	 * <p>			nextTextSelection = (TextSelection) search.nextSelection();</p>
+	 * <p>			if(currtenTextSelection!=null){</p>
+	 * <p>				TextDocumentSelection nextParagraphSelection = new TextDocumentSelection(currtenTextSelection);</p>
+	 * <p>				try {</p>
+	 * <p>					nextParagraphSelection.replaceWithTextDocument(sourcedoc);</p>
+	 * <p>				} catch (Exception e) {</p>
+	 * <p>					e.printStackTrace();</p>
+	 * <p>				}</p>
+	 * <p>			}</p>
+	 * <p>		}</p>
+	 * <p>		if(nextTextSelection!=null){</p>
+	 * <p>			TextDocumentSelection nextParagraphSelection = new TextDocumentSelection(nextTextSelection);</p>
+	 * <p>			try {</p>
+	 * <p>				nextParagraphSelection.replaceWithTextDocument(sourcedoc);</p>
+	 * <p>			} catch (Exception e) {</p>
+	 * <p>				e.printStackTrace();</p>
+	 * <p>			}</p>
+	 * <p>		}</p>
+	 * </Code>
+	 * 
+	 * @param textDocument
+	 *            the reference TextDocument to replace.
+	 * @throws Exception
+	 */
+	public void replaceWithTextDocument(TextDocument textDocument) throws Exception {
+		this.sourceDocument = textDocument;
+		int leftLength = textSelection.getText().length();
+		int index = textSelection.getIndex();
+		prepareParagraphContainer(leftLength, index);
+	}
+	
+	/**
+	 * Construct a TextDocumentSelection with TextSelection. Then user can
+	 * replace text content with a TextDocument.
+	 * 
+	 * @param selection
+	 *            the TextSelection to be decorated.
+	 */
+	public TextDocumentSelection(TextSelection selection) {
+		textSelection = selection;
+	}
+	
+	/**
+	 * Delete the selection from the document the other matched selection in the
+	 * same container element will be updated automatically because the start
+	 * index of the following selections will be changed when the previous
+	 * selection has been deleted.
+	 * 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		textSelection.cut();
+	}
+	
+	/**
+	 * Paste this selection just after a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtEndOf(positionItem);
+	}
+	
+	private void delete(int fromIndex, int leftLength, Node pNode) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromIndex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+					
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						delete(fromIndex, leftLength, node);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+	
+	/**
+	 * Paste this selection just before a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		textSelection.pasteAtFrontOf(positionItem);
+	}
+	
+	protected void refresh(int offset) {
+		textSelection.refresh(offset);
+	}
+	
+	protected void refreshAfterFrontalDelete(Selection deletedItem) {
+		textSelection.refreshAfterFrontalDelete(deletedItem);
+	}
+	
+	protected void refreshAfterFrontalInsert(Selection insertedItem) {
+		textSelection.refreshAfterFrontalInsert(insertedItem);
+	}
+	
+	private void prepareParagraphContainer(int leftLength, int index) throws Exception {
+		OdfElement rightparentElement = textSelection.getContainerElement();
+		int nodeLength = TextExtractor.getText(rightparentElement).length();
+		Paragraph orgparagraph = Paragraph.getInstanceof((TextParagraphElementBase) rightparentElement);
+		
+		TextDocument document = (TextDocument) orgparagraph.getOwnerDocument();
+		OfficeTextElement sroot = sourceDocument.getContentRoot();
+		NodeList clist = sroot.getChildNodes();
+		
+		try {
+			OfficeTextElement documentRoot = document.getContentRoot();
+			Node rootNode = rightparentElement.getParentNode();
+			if (!rootNode.equals(documentRoot)) {
+				throw new RuntimeException(
+						"The ParentNode of text content's ContainerElement which will be replaced is not Document ContentRoot, TextDocument only can be insert to the Docuemnt ContentRoot");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextDocumentSelection.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		
+		if (index == 0) {
+			if (leftLength == nodeLength) {
+				// Replace whole Paragraph
+				OdfElement refElement = orgparagraph.getOdfElement();
+				for (int i = 0; i < clist.getLength(); i++) {
+					OdfElement node = (OdfElement) clist.item(i);
+					refElement = document.insertOdfElement(refElement,
+							sourceDocument, node, false);
+				}
+				rightparentElement.getParentNode().removeChild(
+						rightparentElement);
+			} else {
+				// at the start of original Paragraph, insert before original
+				// Paragraph
+				delete(index, leftLength, rightparentElement);
+				for (int i = 0; i < clist.getLength(); i++) {
+					OdfElement node = (OdfElement) clist.item(i);
+					document.insertOdfElement(orgparagraph.getOdfElement(), sourceDocument, node, true);
+				}
+			}
+		} else if (nodeLength == (index + leftLength)) {
+			// at the end of original Paragraph, insert after original Paragraph
+			delete(index, leftLength, rightparentElement);
+			for (int i = 0; i < clist.getLength(); i++) {
+				OdfElement node = (OdfElement) clist.item(i);
+				document.insertOdfElement(orgparagraph.getOdfElement(), sourceDocument, node, false);
+			}
+		} else {
+			// at the middle of original Paragraph, split original Paragraph,
+			// insert before the second Paragraph.
+			delete(index, leftLength, rightparentElement);
+			Node leftparentElement = rightparentElement.cloneNode(true);
+			rightparentElement.getParentNode().insertBefore(leftparentElement, rightparentElement);
+			nodeLength = TextExtractor.getText((OdfElement) leftparentElement).length();
+			delete(index, nodeLength - index, leftparentElement);
+			delete(0, index, rightparentElement);
+			for (int i = 0; i < clist.getLength(); i++) {
+				OdfElement node = (OdfElement) clist.item(i);
+				document.insertOdfElement(orgparagraph.getOdfElement(), sourceDocument, node, true);
+			}
+			int offset = 0 - leftLength - index;
+			SelectionManager.refresh(rightparentElement, offset, offset);
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextNavigation.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextNavigation.java
new file mode 100644
index 0000000..5cb3b42
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextNavigation.java
@@ -0,0 +1,368 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.IdentityHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.table.Cell;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A derived <code>Navigation</code> class used to navigate the text content,
+ * which can search the document and find the matched text and return
+ * <code>TextSelection</code> instance.
+ */
+public class TextNavigation extends Navigation {
+
+	private String mMatchedElementName = "text:p,text:h";
+	private Pattern mPattern;
+	private Document mDocument;
+	private OdfElement mElement;
+	private TextSelection mNextSelectedItem;
+	private TextSelection mTempSelectedItem;
+	private TextSelection mReplacedItem;
+	private boolean handlePageBreak;
+	private String mNextText;
+	private int mNextIndex;
+	private boolean mbFinishFindInHeaderFooter;
+	private IdentityHashMap<OdfElement, OdfElement> modifiedStyleList;
+
+	/**
+	 * Construct <code>TextNavigation</code> with matched condition and
+	 * navigation scope.
+	 * 
+	 * @param pattern
+	 *            the matched pattern String
+	 * @param doc
+	 *            the navigation scope
+	 */
+	public TextNavigation(String pattern, Document doc) {
+		mPattern = Pattern.compile(pattern);
+		mDocument = doc;
+		mElement = null;
+		mNextSelectedItem = null;
+		mTempSelectedItem = null;
+		mbFinishFindInHeaderFooter = false;
+		setHandlePageBreak(false);
+	}
+
+	/**
+	 * Construct <code>TextNavigation</code> with matched condition and
+	 * navigation scope.
+	 * 
+	 * @param pattern
+	 *            the matched pattern String
+	 * @param element
+	 *            the ODF element whose content will be navigated.
+	 * @since 0.5
+	 */
+	public TextNavigation(String pattern, OdfElement element) {
+		mPattern = Pattern.compile(pattern);
+		mDocument = null;
+		mElement = element;
+		mNextSelectedItem = null;
+		mTempSelectedItem = null;
+		mbFinishFindInHeaderFooter = false;
+	}
+
+	/**
+	 * Check if has next <code>TextSelection</code> with satisfied content
+	 * pattern.
+	 * 
+	 * @see org.odftoolkit.simple.common.navigation.Navigation#hasNext()
+	 */
+	@Override
+	public boolean hasNext() {
+		mTempSelectedItem = findNext(mNextSelectedItem);
+		return (mTempSelectedItem != null);
+	}
+	void setSelectedItem(TextSelection nextSelectedItem) {
+		this.mNextSelectedItem = nextSelectedItem;
+	}
+	TextSelection getSelectedItem() {
+		return this.mNextSelectedItem;
+	}
+
+	/**
+	 * Get next <code>TextSelection</code>.
+	 * 
+	 * @see org.odftoolkit.simple.common.navigation.Navigation#nextSelection()
+	 */
+	@Override
+	public Selection nextSelection() {
+		if (mTempSelectedItem != null) {
+			mNextSelectedItem = mTempSelectedItem;
+			mTempSelectedItem = null;
+		} else {
+			mNextSelectedItem = findNext(mNextSelectedItem);
+		}
+		if (mNextSelectedItem == null) {
+			return null;
+		} else {
+			Selection.SelectionManager.registerItem(mNextSelectedItem);
+			return mNextSelectedItem;
+		}
+	}
+
+	/**
+	 * Check if the text content of element match the specified matched
+	 * condition, which is stated when the <code>TextNavigation</code> created.
+	 * 
+	 * @param element
+	 *            navigate this element
+	 * @return true if the text content of this element match this pattern;
+	 *         false if not match
+	 */
+	@Override
+	public boolean match(Node element) {
+		if (element instanceof OdfElement) {
+			String content = TextExtractor.getText((OdfElement) element);
+			Matcher matcher = mPattern.matcher(content);
+			if (matcher.find()) {
+				// check whether this container is minimum
+				Node childNode = element.getFirstChild();
+				while (childNode != null) {
+					String childContent = getText(childNode);
+					Matcher childMatcher = mPattern.matcher(childContent);
+					if (childMatcher.find()) {
+						if (childNode.getNodeType() == Node.TEXT_NODE
+								|| "text:span".equalsIgnoreCase(childNode.getNodeName())
+								|| "text:a".equalsIgnoreCase(childNode.getNodeName())) {
+							break;
+						} else {
+							return false;
+						}
+					} else {
+						childNode = childNode.getNextSibling();
+					}
+				}
+				if (mMatchedElementName.indexOf(element.getNodeName()) != -1) {
+					// here just consider \n\r\t occupy one char
+					mNextIndex = matcher.start();
+					int eIndex = matcher.end();
+					mNextText = content.substring(mNextIndex, eIndex);
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	private String getText(Node node) {
+		if (node.getNodeType() == Node.TEXT_NODE)
+			return node.getNodeValue();
+		if (node instanceof OdfElement)
+			return TextExtractor.getText((OdfElement) node);
+		return "";
+	}
+
+	/*
+	 * Return the matched text might exist in header/footer.
+	 */
+	private TextSelection findInHeaderFooter(TextSelection selected) {
+		OdfFileDom styledom = null;
+		OdfOfficeMasterStyles masterpage = null;
+		OdfElement element = null;
+
+		if (selected != null) {
+			OdfElement containerElement = selected.getContainerElement();
+			int index = selected.getIndex();
+			String content = TextExtractor.getText(containerElement);
+
+			int nextIndex = -1;
+			Matcher matcher = mPattern.matcher(content);
+			// start from the end index of the selected item
+			if (matcher.find(index + selected.getText().length())) {
+				// here just consider \n\r\t occupy one char
+				nextIndex = matcher.start();
+				int eIndex = matcher.end();
+				mNextText = content.substring(nextIndex, eIndex);
+			}
+			if (nextIndex != -1) {
+				return createSelection(selected.getContainerElement(), nextIndex);
+			}
+		}
+		try {
+			styledom = mDocument.getStylesDom();
+			NodeList list = styledom.getElementsByTagName("office:master-styles");
+			if (styledom == null) {
+				return null;
+			}
+			if (list.getLength() > 0) {
+				masterpage = (OdfOfficeMasterStyles) list.item(0);
+			} else {
+				return null;
+			}
+
+			if (selected == null) {
+				element = (OdfElement) getNextMatchElementInTree(masterpage, masterpage);
+			} else {
+				element = (OdfElement) getNextMatchElementInTree(selected.getContainerElement(), masterpage);
+			}
+
+			if (element != null) {
+				return createSelection(element, mNextIndex);
+			} else {
+				return null;
+			}
+
+		} catch (Exception ex) {
+			Logger.getLogger(TextNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		return null;
+	}
+
+	/*
+	 * Found the next <code>Selection</code> start from the
+	 * <code>selected</code>.
+	 */
+	private TextSelection findNext(TextSelection selected) {
+		if (!mbFinishFindInHeaderFooter) {
+			// find in document.
+			if (mElement == null) {
+				TextSelection styleselected = findInHeaderFooter(selected);
+				if (styleselected != null) {
+					return styleselected;
+				}
+			}
+			selected = null;
+			mbFinishFindInHeaderFooter = true;
+		}
+		OdfElement rootElement = null;
+		try {
+			if (mElement != null) {
+				rootElement = mElement;
+			} else {
+				rootElement = mDocument.getContentRoot();
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(TextNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		if (selected == null) {
+			OdfElement element = (OdfElement) getNextMatchElementInTree(rootElement, rootElement);
+			if (element != null) {
+				return createSelection(element, mNextIndex);
+			} else {
+				return null;
+			}
+		}
+		OdfElement containerElement = selected.getContainerElement();
+		int index = selected.getIndex();
+		String content = TextExtractor.getText(containerElement);
+
+		int nextIndex = -1;
+		Matcher matcher = mPattern.matcher(content);
+		// start from the end index of the selected item
+		if (!selected.isSelectionReplaced()) {
+		if (((content.length() > index + selected.getText().length()))
+				&& (matcher.find(index + selected.getText().length()))) {
+				nextIndex = matcher.start();
+				int eIndex = matcher.end();
+				mNextText = content.substring(nextIndex, eIndex);
+			}
+		} else if (((content.length() >= index + selected.getText().length()))
+				&& (matcher.find(index))) {
+			// here just consider \n\r\t occupy one char
+			nextIndex = matcher.start();
+			int eIndex = matcher.end();
+			mNextText = content.substring(nextIndex, eIndex);
+		}
+		if (nextIndex != -1) {
+			return createSelection(selected.getContainerElement(), nextIndex);
+		} else {
+			OdfElement element = (OdfElement) getNextMatchElementInTree(containerElement, rootElement);
+			if (element != null) {
+				return createSelection(element, mNextIndex);
+			} else {
+				return null;
+			}
+		}
+	}
+
+	/*
+	 * In order to keep the consist between value and display text, spreadsheet
+	 * and chart document should use <code>CellSelection</code>.
+	 */
+	private TextSelection createSelection(OdfElement containerElement, int nextIndex) {
+		TextSelection item = null;
+		Node parent = containerElement.getParentNode();
+		while (parent != null) {
+			if (TableTableCellElementBase.class.isInstance(parent)) {
+				TableTableCellElementBase cellElement = (TableTableCellElementBase) parent;
+				Cell cell = Cell.getInstance(cellElement);
+				item = new CellSelection(this, mNextText, containerElement,
+						nextIndex, cell);
+				break;
+			} else {
+				OdfName odfName = ((OdfElement) parent).getOdfName();
+				String ns = odfName.getPrefix();
+				if ("text".equals(ns)) {
+					parent = parent.getParentNode();
+				} else {
+					break;
+				}
+			}
+		}
+		if (item == null) {
+			item = new TextSelection(this, mNextText, containerElement,
+					nextIndex);
+		}
+		return item;
+	}
+	OdfElement getModifiedStyleElement(OdfElement styleElement) {
+		if (modifiedStyleList == null)
+			return null;
+		return modifiedStyleList.get(styleElement);
+	}
+	void addModifiedStyleElement(OdfElement styleElment,
+			OdfElement modifiedStyleElement) {
+		if (modifiedStyleElement != null) {
+			if (modifiedStyleList == null) {
+				modifiedStyleList = new IdentityHashMap<OdfElement, OdfElement>();
+			}
+			modifiedStyleList.put(styleElment, modifiedStyleElement);
+		}
+	}
+	boolean isHandlePageBreak() {
+		return handlePageBreak;
+	}
+	void setHandlePageBreak(boolean handlePageBreak) {
+		this.handlePageBreak = handlePageBreak;
+	}
+	void setReplacedItem(TextSelection replacedItem) {
+		this.mReplacedItem = replacedItem;
+	}
+	TextSelection getReplacedItem() {
+		return this.mReplacedItem;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextSelection.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextSelection.java
new file mode 100644
index 0000000..9a9e558
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextSelection.java
@@ -0,0 +1,1299 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.net.URI;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextConditionalTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldDeclElement;
+import org.odftoolkit.odfdom.dom.element.text.TextVariableDeclElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.common.field.ConditionField;
+import org.odftoolkit.simple.common.field.Field;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+import org.odftoolkit.simple.common.field.Fields;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.draw.Image;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * <code>TextSelection</code> describes a sub element in a paragraph element or
+ * a heading element. It is recognized by the container element, which type
+ * should be {@link org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph
+ * OdfTextParagraph} or
+ * {@link org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading
+ * OdfTextHeading}, the start index of text content in container element and the
+ * text content of this <code>Selection</code>.
+ */
+public class TextSelection extends Selection {
+
+	String mMatchedText;
+	private OdfTextParagraph mParagraph;
+	private OdfTextHeading mHeading;
+	private int mIndexInContainer;
+	private boolean mIsInserted;
+	private boolean isSelectionReplaced = false;
+
+	/**
+	 * Constructor of <code>TextSelection</code>.
+	 * 
+	 * @param text
+	 *            the text content of this <code>TextSelection</code>
+	 * @param containerElement
+	 *            the paragraph element or heading element that contains this
+	 *            <code>TextSelection</code>
+	 * @param index
+	 *            the start index of the text content in container element
+	 * 
+	 */
+	TextSelection(Navigation search, String text, OdfElement containerElement,
+			int index) {
+		this.search = search;
+		mMatchedText = text;
+		if (containerElement instanceof OdfTextParagraph) {
+			mParagraph = (OdfTextParagraph) containerElement;
+		} else if (containerElement instanceof OdfTextHeading) {
+			mHeading = (OdfTextHeading) containerElement;
+		}
+		mIndexInContainer = index;
+	}
+
+	public TextNavigation getTextNavigation() {
+		if (search instanceof TextNavigation) {
+			return (TextNavigation) search;
+		}
+		return null;
+	}
+	/**
+	 * Create a new <code>TextSelection</code>.
+	 * 
+	 * @param text
+	 *            the text content of this <code>TextSelection</code>
+	 * @param containerElement
+	 *            the paragraph element or heading element that contains this
+	 *            <code>TextSelection</code>
+	 * @param index
+	 *            the start index of the text content in container element
+	 * 
+	 * @since 0.5.5
+	 */
+	public static TextSelection newTextSelection(Navigation search,
+			String text, OdfElement containerElement, int index) {
+		TextSelection selection = new TextSelection(search, text,
+				containerElement, index);
+		Selection.SelectionManager.registerItem(selection);
+		return selection;
+	}
+
+	/**
+	 * Get the paragraph element or heading element that contains this
+	 * <code>TextSelection</code>.
+	 * 
+	 * @return OdfElement the container element
+	 */
+	@Override
+	public OdfElement getElement() {
+		return getContainerElement();
+	}
+
+	/**
+	 * Get the paragraph element or heading element that contains this text.
+	 * 
+	 * @return OdfElement
+	 */
+	public OdfElement getContainerElement() {
+		if (mParagraph != null) {
+			return mParagraph;
+		} else {
+			return mHeading;
+		}
+	}
+
+	/**
+	 * Get the start index of the text content of its container element.
+	 * 
+	 * @return index the start index of the text content of its container
+	 *         element
+	 */
+	@Override
+	public int getIndex() {
+		return mIndexInContainer;
+	}
+
+	/**
+	 * Get the text content of this <code>TextSelection</code>.
+	 * 
+	 * @return text the text content
+	 */
+	public String getText() {
+		return mMatchedText;
+	}
+
+	/**
+	 * Delete the selection from the document the other matched selection in the
+	 * same container element will be updated automatically because the start
+	 * index of the following selections will be changed when the previous
+	 * selection has been deleted.
+	 * 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void cut() throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement container = getContainerElement();
+		delete(mIndexInContainer, mMatchedText.length(), container);
+		SelectionManager.refreshAfterCut(this);
+		mMatchedText = "";
+	}
+
+	/**
+	 * Apply a style to the selection so that the text style of this selection
+	 * will append the specified style.
+	 * 
+	 * @param style
+	 *            the style can be from the current document or user defined
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	public void applyStyle(OdfStyleBase style) throws InvalidNavigationException {
+		// append the specified style to the selection
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement parentElement = getContainerElement();
+
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+
+		appendStyle(index, leftLength, parentElement, style);
+
+	}
+
+	/**
+	 * Replace the text content of selection with a new string.
+	 * 
+	 * @param newText
+	 *            the replace text String
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	public void replaceWith(String newText) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement parentElement = getContainerElement();
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+		delete(index, leftLength, parentElement);
+		OdfTextSpan textSpan = new OdfTextSpan((OdfFileDom) parentElement.getOwnerDocument());
+		textSpan.addContentWhitespace(newText);
+		mIsInserted = false;
+		insertOdfElement(textSpan, index, parentElement);
+		// optimize the parent element
+		optimize(parentElement);
+		int offset = newText.length() - leftLength;
+		SelectionManager.refresh(getContainerElement(), offset, index + getText().length());
+		mMatchedText = newText;
+	}
+	
+	/**
+	 * Replace the text content of selection with a new Table.
+	 * 
+	 * @param newTable
+	 *            the replace Table
+	 * @return 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 * @return the new Table in the TextDocument
+	 */
+	public Table replaceWith(Table newTable) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		TableSelection nextTableSelection=new TableSelection(this);
+		return nextTableSelection.replaceWithTable(newTable);
+	}
+	/**
+	 * Replace the text content of selection with a new Image.
+	 * 
+	 * @param newImage
+	 *            the replace Image
+	 * @return 
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 * @return the new Image in the TextDocument,the image name is set to "replace" + System.currentTimeMillis(), please update the name to others by yourself.
+	 */
+	public Image replaceWith(Image newImage) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		ImageSelection nextImageSelection=new ImageSelection(this);
+		return nextImageSelection.replaceWithImage(newImage);
+	}
+	/**
+	 * Replace the text content of selection with a new Image.
+	 * 
+	 * @param imageUri
+	 *            the replace Image URI
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 * @return the new Image in the TextDocument,the image name is set to "replace" + System.currentTimeMillis(), please update the name to others by yourself.
+	 */
+	public Image replaceWith(URI imageUri) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		ImageSelection nextImageSelection=new ImageSelection(this);
+		return nextImageSelection.replaceWithImage(imageUri);
+	}
+	/**
+	 * Replace the content with a Field
+	 * 
+	 * @param orgField
+	 *            the reference Field to replace.
+     * @throws InvalidNavigationException
+	 *             if the selection is unavailable.   
+	 * @return the created field.         
+	 */
+	public Field replaceWith(Field orgField) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		Field newfield=null;
+		OdfElement parentElement = getContainerElement();
+		Paragraph orgparagraph = Paragraph.getInstanceof((TextParagraphElementBase) parentElement);
+		TextDocument document = (TextDocument) orgparagraph.getOwnerDocument();
+		
+		FieldSelection nextFieldSelection=new FieldSelection(this);
+		FieldType fieldType = orgField.getFieldType();
+	
+		switch (fieldType) {
+		case DATE_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case FIXED_DATE_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case TIME_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case FIXED_TIME_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case PREVIOUS_PAGE_NUMBER_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case CURRENT_PAGE_NUMBER_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case NEXT_PAGE_NUMBER_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case PAGE_COUNT_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case TITLE_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case SUBJECT_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case AUTHOR_NAME_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case AUTHOR_INITIALS_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case CHAPTER_FIELD:
+			newfield=nextFieldSelection.replaceWithSimpleField(fieldType);
+			break;
+		case SIMPLE_VARIABLE_FIELD:
+			VariableField SimpleVariableField = (VariableField)orgField;
+			String simplefieldname = SimpleVariableField.getVariableName();
+			VariableField simplefield=Fields.createSimpleVariableField(document, simplefieldname);
+			nextFieldSelection.replaceWithVariableField(simplefield);
+			newfield=simplefield;
+			break;
+		case USER_VARIABLE_FIELD:
+			VariableField userVariableField = (VariableField)orgField;
+			TextUserFieldDeclElement textUserFieldDeclElement =(TextUserFieldDeclElement) userVariableField.getOdfElement();
+			String fieldname = userVariableField.getVariableName();
+			String value=textUserFieldDeclElement.getOfficeStringValueAttribute();
+			VariableField variableField=Fields.createUserVariableField(document, fieldname,value);
+			nextFieldSelection.replaceWithVariableField(variableField);
+			newfield=variableField;
+			break;
+		case CONDITION_FIELD:
+			ConditionField conditionField = (ConditionField)orgField;
+			TextConditionalTextElement textConditionalTextElement =(TextConditionalTextElement) conditionField.getOdfElement();
+			String StringValueIfFalse=textConditionalTextElement.getTextStringValueIfFalseAttribute();
+			String StringValueIfTrue=textConditionalTextElement.getTextStringValueIfTrueAttribute();
+			String StringCondition=textConditionalTextElement.getTextConditionAttribute();
+			boolean CurrentValue=textConditionalTextElement.getTextCurrentValueAttribute();
+			ConditionField newdConditionField = nextFieldSelection.replaceWithConditionField(StringCondition, StringValueIfTrue, StringValueIfFalse);
+			TextConditionalTextElement newTextConditionalTextElement=(TextConditionalTextElement)newdConditionField.getOdfElement();
+			newTextConditionalTextElement.setTextCurrentValueAttribute(CurrentValue);
+			newfield=newdConditionField;
+			break;
+		case HIDDEN_TEXT_FIELD:
+			ConditionField conditionFieldHIDDEN = (ConditionField)orgField;
+			TextConditionalTextElement textConditionalTextElementHIDDEN =(TextConditionalTextElement) conditionFieldHIDDEN.getOdfElement();
+			String StringValueIfFalseHIDDEN=textConditionalTextElementHIDDEN.getTextStringValueIfFalseAttribute();
+			String StringConditionHIDDEN=textConditionalTextElementHIDDEN.getTextConditionAttribute();
+			boolean CurrentValueHIDDEN=textConditionalTextElementHIDDEN.getTextCurrentValueAttribute();
+			ConditionField newdConditionFieldHIDDEN = nextFieldSelection.replaceWithHiddenTextField(StringConditionHIDDEN, StringValueIfFalseHIDDEN);
+			TextConditionalTextElement newTextConditionalTextElementHIDDEN=(TextConditionalTextElement)newdConditionFieldHIDDEN.getOdfElement();
+			newTextConditionalTextElementHIDDEN.setTextCurrentValueAttribute(CurrentValueHIDDEN);
+			newfield=newdConditionFieldHIDDEN;
+			break;
+		case REFERENCE_FIELD:
+		default: throw new IllegalArgumentException("Simple Java API for ODF doesn't support this type now.");
+		}
+		return newfield;
+	}
+	
+	/**
+	 * Replace the content with a paragraph, the paragraph can be in the same TextDocument or in a different Document.
+	 * 
+	 * @param newParagraph
+	 *            the reference paragraph to replace.
+     * @throws InvalidNavigationException
+	 *             if the selection is unavailable.   
+	 * @return the replaced Paragraph.             
+	 */
+	public Paragraph replaceWith(Paragraph newParagraph) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		ParagraphSelection nextParagraphSelection=new ParagraphSelection(this);
+		return nextParagraphSelection.replaceWithParagraph(newParagraph);
+	}
+	/**
+	 * Replace the content with a TextDocument with Styles.
+	 * Note: You need cache the TextNavigation.nextSelection item because after
+	 * you replace currtenTextSelection with TextDocument, TextNavigation.nextSelection will search from the inserted Content, 
+	 * it will make you into a loop if the Search keyword also can be found in the new inserted Content.
+	 * </p>
+	 * The right way to use this replaceWithTextDocument(TextDocument textDocument) method should like this: 
+	 * <Code>
+	 * <p>	search = new TextNavigation("SIMPLE", doc);    </p>
+	 * <p>	TextSelection currtenTextSelection,nextTextSelection=null;</p>
+	 * <p>		while (search.hasNext()) {</p>
+	 * <p>			if(nextTextSelection!=null){</p>
+	 * <p>				currtenTextSelection=nextTextSelection;</p>
+	 * <p>			}else {</p>
+	 * <p>			 	currtenTextSelection = (TextSelection) search.nextSelection();</p>
+	 * <p>			}</p>
+	 * <p>			nextTextSelection = (TextSelection) search.nextSelection();</p>
+	 * <p>			if(currtenTextSelection!=null){</p>
+	 * <p>				try {</p>
+	 * <p>					nextTextSelection.replaceWithTextDocument(sourcedoc);</p>
+	 * <p>				} catch (Exception e) {</p>
+	 * <p>					e.printStackTrace();</p>
+	 * <p>				}</p>
+	 * <p>			}</p>
+	 * <p>		}</p>
+	 * <p>		if(nextTextSelection!=null){</p>
+	 * <p>			try {</p>
+	 * <p>				nextTextSelection.replaceWithTextDocument(sourcedoc);</p>
+	 * <p>			} catch (Exception e) {</p>
+	 * <p>				e.printStackTrace();</p>
+	 * <p>			}</p>
+	 * <p>		}</p>
+	 * </Code>
+	 * 
+	 * @param newTextDocument
+	 *            the reference TextDocument to replace.
+	 * @throws InvalidNavigationException 
+	 */
+	public void replaceWith(TextDocument newTextDocument) throws InvalidNavigationException{
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		TextDocumentSelection nextTextDocumentSelection=new TextDocumentSelection(this);
+		try {
+			nextTextDocumentSelection.replaceWithTextDocument(newTextDocument);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	/**
+	 * Create a span element for this text selection.
+	 * 
+	 * @return the created text span element for this selection
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 * @since 0.5.5
+	 */
+	public TextSpanElement createSpanElement() throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement parentElement = getContainerElement();
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+		delete(index, leftLength, parentElement);
+		OdfTextSpan textSpan = new OdfTextSpan((OdfFileDom) parentElement.getOwnerDocument());
+		textSpan.addContentWhitespace(getText());
+		mIsInserted = false;
+		insertOdfElement(textSpan, index, parentElement);
+		// optimize the parent element
+		optimize(parentElement);
+
+		return textSpan;
+	}
+
+	/**
+	 * Paste this selection just before a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtFrontOf(Selection positionItem) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		int indexOfNew = 0;
+		OdfElement newElement = positionItem.getElement();
+		if (positionItem instanceof TextSelection) {
+			indexOfNew = ((TextSelection) positionItem).getIndex();
+			newElement = ((TextSelection) positionItem).getContainerElement();
+		}
+
+		OdfTextSpan textSpan = getSpan((OdfFileDom) positionItem.getElement().getOwnerDocument());
+		mIsInserted = false;
+		insertOdfElement(textSpan, indexOfNew, newElement);
+		adjustStyle(newElement, textSpan, null);
+		SelectionManager.refreshAfterPasteAtFrontOf(this, positionItem);
+	}
+
+	/**
+	 * Paste this selection just after a specific selection.
+	 * 
+	 * @param positionItem
+	 *            a selection that is used to point out the position
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	@Override
+	public void pasteAtEndOf(Selection positionItem) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		// TODO: think about and test if search item is a element selection
+		int indexOfNew = 0;
+		OdfElement newElement = positionItem.getElement();
+		if (positionItem instanceof TextSelection) {
+			indexOfNew = ((TextSelection) positionItem).getIndex() + ((TextSelection) positionItem).getText().length();
+			newElement = ((TextSelection) positionItem).getContainerElement();
+		}
+		OdfTextSpan textSpan = getSpan((OdfFileDom) positionItem.getElement().getOwnerDocument());
+		mIsInserted = false;
+		insertOdfElement(textSpan, indexOfNew, newElement);
+		adjustStyle(newElement, textSpan, null);
+		SelectionManager.refreshAfterPasteAtEndOf(this, positionItem);
+	}
+	public void setSelectionReplaced(boolean b) {
+		this.isSelectionReplaced = b;
+	}
+	public boolean isSelectionReplaced() {
+		return this.isSelectionReplaced;
+	}
+
+	/**
+	 * Add a hypertext reference to the selection.
+	 * 
+	 * @param url
+	 *            the URL of this hypertext reference
+	 * @throws InvalidNavigationException
+	 *             if the selection is unavailable.
+	 */
+	public void addHref(URL url) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		OdfElement parentElement = getContainerElement();
+		int leftLength = getText().length();
+		int index = mIndexInContainer;
+		addHref(index, leftLength, parentElement, url.toString());
+	}
+	
+	/**
+	 * Add a comment to the selection.
+	 * 
+	 * @param content
+	 *            the content of this comment.
+	 * @param creator
+	 *            the creator of this comment, if <code>creator</code> is null,
+	 *            the value of <code>System.getProperty("user.name")</code> will
+	 *            be used.
+	 * @throws InvalidNavigationException
+	 *            if the selection is unavailable.
+	 * @since 0.6.5
+	 */
+	public void addComment(String content, String creator) throws InvalidNavigationException {
+		if (validate() == false) {
+			throw new InvalidNavigationException("No matched string at this position");
+		}
+		// create annotation element
+		OdfElement parentElement = getContainerElement();
+		OdfFileDom dom = (OdfFileDom) parentElement.getOwnerDocument();
+		OfficeAnnotationElement annotationElement = dom.newOdfElement(OfficeAnnotationElement.class);
+		// set creator
+		DcCreatorElement dcCreatorElement = annotationElement.newDcCreatorElement();
+		if (creator == null) {
+			creator = System.getProperty("user.name");
+		}
+		dcCreatorElement.setTextContent(creator);
+		// set date
+		String dcDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date());
+		DcDateElement dcDateElement = annotationElement.newDcDateElement();
+		dcDateElement.setTextContent(dcDate);
+		TextPElement notePElement = annotationElement.newTextPElement();
+		TextSpanElement noteSpanElement = notePElement.newTextSpanElement();
+		// set comment style
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		OdfStyle textStyle = styles.newStyle(OdfStyleFamily.Text);
+		StyleTextPropertiesElement styleTextPropertiesElement = textStyle.newStyleTextPropertiesElement(null);
+		styleTextPropertiesElement.setStyleFontNameAttribute("Tahoma");
+		styleTextPropertiesElement.setFoFontSizeAttribute("10pt");
+		styleTextPropertiesElement.setStyleFontNameAsianAttribute("Lucida Sans Unicode");
+		styleTextPropertiesElement.setStyleFontSizeAsianAttribute("12pt");
+		noteSpanElement.setStyleName(textStyle.getStyleNameAttribute());
+		// set comment content
+		noteSpanElement.setTextContent(content);
+		// insert comment to its position
+		insertOdfElement(annotationElement, mIndexInContainer, parentElement);
+		// three text length plus two '\r'
+		int offset = content.length() + 1 + dcDate.length() + 1 + creator.length();
+		SelectionManager.refresh(getContainerElement(), offset, getIndex());
+	}
+	
+	/**
+	 * return a String Object representing this selection value the text content
+	 * of the selection, start index in the container element and the text
+	 * content of the container element will be provided.
+	 * 
+	 * @return a String representation of the value of this
+	 *         <code>TextSelection</code>
+	 */
+	@Override
+	public String toString() {
+		return "[" + mMatchedText + "] started from " + mIndexInContainer + " in paragraph:"
+				+ TextExtractor.getText(getContainerElement());
+	}
+
+	@Override
+	protected void refreshAfterFrontalDelete(Selection deleteItem) {
+		if (deleteItem instanceof TextSelection) {
+			mIndexInContainer -= ((TextSelection) deleteItem).getText().length();
+		}
+	}
+
+	@Override
+	protected void refreshAfterFrontalInsert(Selection pasteItem) {
+		if (pasteItem instanceof TextSelection) {
+			mIndexInContainer += ((TextSelection) pasteItem).getText().length();
+		}
+	}
+
+	@Override
+	protected void refresh(int offset) {
+		mIndexInContainer += offset;
+		if (mIndexInContainer < 0) {
+			mIndexInContainer = 0;
+		}
+	}
+
+	void cleanBreakProperty(Paragraph paragraph) {
+		TextNavigation search = this.getTextNavigation();
+		if (search == null)
+			throw new IllegalStateException("Navigation is null");
+		OdfStyleBase styleElement = paragraph.getStyleHandler()
+				.getStyleElementForRead();
+		String name = styleElement.getAttribute("style:name");
+		String newName = null;
+		OdfElement modifiedStyleElement = search
+				.getModifiedStyleElement(styleElement);
+		if (modifiedStyleElement == null) {
+			modifiedStyleElement = (OdfElement) styleElement.cloneNode(true);
+			search.addModifiedStyleElement(styleElement, modifiedStyleElement);
+			NodeList paragraphProperties = modifiedStyleElement
+					.getElementsByTagName("style:paragraph-properties");
+			if (paragraphProperties != null
+					&& paragraphProperties.getLength() > 0) {
+				StyleParagraphPropertiesElement property = (StyleParagraphPropertiesElement) paragraphProperties
+						.item(0);
+				property.removeAttribute("fo:break-before");
+				property.removeAttribute("fo:break-after");
+				property.removeAttribute("style:page-number");
+			}
+			modifiedStyleElement.removeAttribute("style:master-page-name");
+			newName = name + "-" + makeUniqueName();
+			NamedNodeMap attributes = modifiedStyleElement.getAttributes();
+			if (attributes != null) {
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node item = attributes.item(i);
+					String value = item.getNodeValue();
+					if (name.equals(value)) {
+						item.setNodeValue(newName);
+						break;
+					}
+				}
+			}
+			styleElement.getParentNode().appendChild(modifiedStyleElement);
+		} else {
+			newName = modifiedStyleElement.getAttribute("style:name");
+		}
+		NamedNodeMap attributes = paragraph.getOdfElement().getAttributes();
+		if (attributes != null) {
+			for (int i = 0; i < attributes.getLength(); i++) {
+				Node item = attributes.item(i);
+				String value = item.getNodeValue();
+				if (name.equals(value)) {
+					item.setNodeValue(newName);
+					break;
+				}
+			}
+		}
+		this.getTextNavigation().setHandlePageBreak(true);
+	}
+	String makeUniqueName() {
+		return String.format("p%06x", (int) (Math.random() * 0xffffff));
+	}
+	/*
+	 * Return a new span that cover this selection and keep the original style
+	 * of this <code>Selection</code>.
+	 */
+	private OdfTextSpan getSpan(OdfFileDom ownerDoc) {
+
+		OdfElement parentElement = getContainerElement();
+		if (parentElement != null) {
+			OdfElement copyParentNode = (OdfElement) parentElement.cloneNode(true);
+			if (ownerDoc != parentElement.getOwnerDocument()) {
+				copyParentNode = (OdfElement) ownerDoc.adoptNode(copyParentNode);
+			}
+			OdfTextSpan textSpan = new OdfTextSpan(ownerDoc);
+			int sIndex = mIndexInContainer;
+			int eIndex = sIndex + mMatchedText.length();
+			// delete the content except the selection string
+			// delete from the end to start, so that the postion will not be
+			// impact by delete action
+			delete(eIndex, TextExtractor.getText(copyParentNode).length() - eIndex, copyParentNode);
+			delete(0, sIndex, copyParentNode);
+			optimize(copyParentNode);
+			Node childNode = copyParentNode.getFirstChild();
+			while (childNode != null) {
+				textSpan.appendChild(childNode.cloneNode(true));
+				childNode = childNode.getNextSibling();
+			}
+			// apply text style for the textSpan
+			if (copyParentNode instanceof OdfStylableElement) {
+				applyTextStyleProperties(getTextStylePropertiesDeep((OdfStylableElement) copyParentNode), textSpan);
+			}
+			return textSpan;
+		}
+		return null;
+	}
+
+	/*
+	 * Optimize the text element by deleting the empty text node.
+	 */
+	private void optimize(Node pNode) {
+		// check if the text:a can be optimized
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			Node nextNode = node.getNextSibling();
+			// if ((node.getNodeType() == Node.ELEMENT_NODE) &&
+			// (node.getPrefix().equals("text"))) {
+			if (node instanceof OdfTextSpan) {
+				if (TextExtractor.getText((OdfTextSpan) node).length() == 0) {
+					node.getParentNode().removeChild(node);
+				} else {
+					optimize(node);
+				}
+			}
+			node = nextNode;
+		}
+	}
+
+	/*
+	 * Apply the <code>styleMap</code> to the <code>toElement</code> reserve the
+	 * style property of toElement, if it is also exist in <code>styleMap</code>
+	 */
+	private void applyTextStyleProperties(Map<OdfStyleProperty, String> styleMap, OdfStylableElement toElement) {
+		if (styleMap != null) {
+			// preserve the style property of toElement if it is also exist in
+			// styleMap
+			OdfStyle resultStyleElement = toElement.getAutomaticStyles().newStyle(OdfStyleFamily.Text);
+			for (Map.Entry<OdfStyleProperty, String> entry : styleMap.entrySet()) {
+				if (toElement.hasProperty(entry.getKey())) {
+					resultStyleElement.setProperty(entry.getKey(), toElement.getProperty(entry.getKey()));
+				} else {
+					resultStyleElement.setProperty(entry.getKey(), entry.getValue());
+				}
+			}
+			toElement.setStyleName(resultStyleElement.getStyleNameAttribute());
+		}
+	}
+
+	/*
+	 * Insert <code>odfElement</code>, span or annotation, into the from index of <code>pNode<code>.
+	 */
+	private void insertOdfElement(OdfElement odfElement, int fromIndex, Node pNode) {
+		if (fromIndex < 0) {
+			fromIndex = 0;
+		}
+		if (fromIndex == 0 && mIsInserted) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if (fromIndex <= 0 && mIsInserted) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+				if ((fromIndex != 0) && (nodeLength < fromIndex)) {
+					fromIndex -= nodeLength;
+				} else {
+					// insert result after node, and insert an new text node
+					// after the result node
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					// insert the text span in appropriate position
+					node.setNodeValue(buffer.toString());
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					Node newNode = node.cloneNode(true);
+					newNode.setNodeValue(value.substring(fromIndex, value.length()));
+					if (nextNode != null) {
+						parNode.insertBefore(odfElement, nextNode);
+						parNode.insertBefore(newNode, nextNode);
+					} else {
+						parNode.appendChild(odfElement);
+						parNode.appendChild(newNode);
+					}
+					mIsInserted = true;
+					return;
+				}
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+					fromIndex -= nodeLength;
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+					fromIndex--;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+					fromIndex--;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+					insertOdfElement(odfElement, fromIndex, node);
+					fromIndex -= nodeLength;
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*
+	 * The <code>textSpan</code> must be the child element of
+	 * <code>parentNode</code> this method is used to keep the style of text
+	 * span when it has been insert into the <code>parentNode</code> if we don't
+	 * deal with the style, the inserted span will also have the style of
+	 * <code>parentNode</code>.
+	 */
+	private void adjustStyle(Node parentNode, OdfTextSpan textSpan, Map<OdfStyleProperty, String> styleMap) {
+		if (parentNode instanceof OdfStylableElement) {
+			OdfStylableElement pStyleNode = (OdfStylableElement) parentNode;
+			if (styleMap == null) {
+				styleMap = getTextStylePropertiesDeep(pStyleNode);
+			}
+			Node node = parentNode.getFirstChild();
+			while (node != null) {
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					if (node.getTextContent().length() > 0) {
+						Node nextNode = node.getNextSibling();
+						OdfTextSpan span = new OdfTextSpan((OdfFileDom) node.getOwnerDocument());
+						span.appendChild(node);
+						if (nextNode != null) {
+							parentNode.insertBefore(span, nextNode);
+						} else {
+							parentNode.appendChild(span);
+						}
+						node = span;
+						applyTextStyleProperties(styleMap, (OdfStylableElement) node);
+					}
+				} else if ((node instanceof OdfStylableElement)) {
+					if (!node.equals(textSpan)) {
+						Map<OdfStyleProperty, String> styles = getTextStylePropertiesDeep(pStyleNode);
+						Map<OdfStyleProperty, String> styles1 = getTextStylePropertiesDeep((OdfStylableElement) node);
+						if (styles == null) {
+							styles = styles1;
+						} else if (styles1 != null) {
+							styles.putAll(styles1);
+						}
+						int comp = node.compareDocumentPosition(textSpan);
+						// if node contains textSpan, then recurse the node
+						if ((comp & Node.DOCUMENT_POSITION_CONTAINED_BY) > 0) {
+							adjustStyle(node, textSpan, styles);
+						} else {
+							applyTextStyleProperties(styles, (OdfStylableElement) node);
+						}
+					}
+				}
+				node = node.getNextSibling();
+			}
+			// change the parentNode to default style
+			// here we don't know the default style name, so here just
+			// remove the text:style-name attribute
+			pStyleNode.removeAttributeNS(OdfDocumentNamespace.TEXT.getUri(), "style-name");
+		}
+	}
+
+	/*
+	 * Delete the <code>pNode<code> from the <code>fromIndex</code> text, and
+	 * delete <code>leftLength</code> text.
+	 */
+	private void delete(int fromIndex, int leftLength, Node pNode) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					StringBuffer buffer = new StringBuffer();
+					buffer.append(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+					fromIndex = 0;
+					if (nextLength >= 0) {
+						// delete the result
+						buffer.append(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						leftLength = endLength - value.length();
+					}
+					node.setNodeValue(buffer.toString());
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						delete(fromIndex, leftLength, node);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*
+	 * Add href for a range text of <code>pNode<code> from the
+	 * <code>fromIndex</code> text, and the href will cover
+	 * <code>leftLength</code> text.
+	 */
+	private void addHref(int fromIndex, int leftLength, Node pNode, String href) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					node.setNodeValue(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					// init text:a
+					TextAElement textLink = new TextAElement((OdfFileDom) node.getOwnerDocument());
+					Node newNode = null;
+					if (nextLength >= 0) {
+						textLink.setTextContent(value.substring(fromIndex, endLength));
+						newNode = node.cloneNode(true);
+						newNode.setNodeValue(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						textLink.setTextContent(value.substring(fromIndex, value.length()));
+						leftLength = endLength - value.length();
+					}
+					textLink.setXlinkTypeAttribute("simple");
+					textLink.setXlinkHrefAttribute(href);
+
+					if (nextNode != null) {
+						parNode.insertBefore(textLink, nextNode);
+						if (newNode != null) {
+							parNode.insertBefore(newNode, nextNode);
+						}
+					} else {
+						parNode.appendChild(textLink);
+						if (newNode != null) {
+							parNode.appendChild(newNode);
+						}
+					}
+					fromIndex = 0;
+					if (nextNode != null) {
+						node = nextNode;
+					} else {
+						node = textLink;
+					}
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						addHref(fromIndex, leftLength, node, href);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*
+	 * Get a map containing text properties of the specified styleable
+	 * <code>element</code>.
+	 * 
+	 * @return a map of text properties.
+	 */
+	private Map<OdfStyleProperty, String> getTextStyleProperties(OdfStylableElement element) {
+		String styleName = element.getStyleName();
+		OdfStyleBase styleElement = element.getAutomaticStyles().getStyle(styleName, element.getStyleFamily());
+
+		if (styleElement == null) {
+			styleElement = element.getDocumentStyle();
+		}
+		if (styleElement != null) {
+			// check if it is the style:defaut-style
+			if ((styleElement.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties) == null)
+					&& (styleElement.getPropertiesElement(OdfStylePropertiesSet.TextProperties) == null)) {
+				styleElement = ((Document) ((OdfFileDom) styleElement.getOwnerDocument()).getDocument())
+						.getDocumentStyles().getDefaultStyle(styleElement.getFamily());
+			}
+			TreeMap<OdfStyleProperty, String> result = new TreeMap<OdfStyleProperty, String>();
+			OdfStyleFamily family = OdfStyleFamily.Text;
+			if (family != null) {
+				for (OdfStyleProperty property : family.getProperties()) {
+					if (styleElement.hasProperty(property)) {
+						result.put(property, styleElement.getProperty(property));
+					}
+				}
+			}
+			return result;
+		}
+		return null;
+	}
+
+	/*
+	 * Get a map containing text properties of the specified styleable
+	 * <code>element</code>. The map will also include any properties set by
+	 * parent styles.
+	 * 
+	 * @return a map of text properties.
+	 */
+	private Map<OdfStyleProperty, String> getTextStylePropertiesDeep(OdfStylableElement element) {
+		String styleName = element.getStyleName();
+		OdfStyleBase styleElement = element.getAutomaticStyles().getStyle(styleName, element.getStyleFamily());
+		if (styleElement == null) {
+			styleElement = element.getDocumentStyle();
+		}
+		TreeMap<OdfStyleProperty, String> result = new TreeMap<OdfStyleProperty, String>();
+		while (styleElement != null) {
+			// check if it is the style:defaut-style
+			if ((styleElement.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties) == null)
+					&& (styleElement.getPropertiesElement(OdfStylePropertiesSet.TextProperties) == null)) {
+				styleElement = ((Document) ((OdfFileDom) styleElement.getOwnerDocument()).getDocument())
+						.getDocumentStyles().getDefaultStyle(styleElement.getFamily());
+			}
+			OdfStyleFamily family = OdfStyleFamily.Text;
+			if (family != null) {
+				for (OdfStyleProperty property : family.getProperties()) {
+					if (styleElement.hasProperty(property)) {
+						result.put(property, styleElement.getProperty(property));
+					}
+				}
+			}
+			styleElement = styleElement.getParentStyle();
+		}
+		return result;
+	}
+
+	/*
+	 * Validate if the <code>Selection</code> is still available.
+	 * 
+	 * @return true if the selection is available; false if the
+	 * <code>Selection</code> is not available.
+	 */
+	private boolean validate() {
+		if (getContainerElement() == null) {
+			return false;
+		}
+		OdfElement container = getContainerElement();
+		if (container == null) {
+			return false;
+		}
+		String content = TextExtractor.getText(container);
+		if (content.indexOf(mMatchedText, mIndexInContainer) == mIndexInContainer) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/*
+	 * Append specified style for a range text of <code>pNode<code> from
+	 * <code>fromIndex</code> and cover <code>leftLength</code>
+	 */
+	private void appendStyle(int fromIndex, int leftLength, Node pNode, OdfStyleBase style) {
+		if ((fromIndex == 0) && (leftLength == 0)) {
+			return;
+		}
+		int nodeLength = 0;
+		Node node = pNode.getFirstChild();
+		while (node != null) {
+			if ((fromIndex == 0) && (leftLength == 0)) {
+				return;
+			}
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				nodeLength = node.getNodeValue().length();
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				// text:s
+				if (node.getLocalName().equals("s")) {
+					try {
+						nodeLength = Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+								.getUri(), "c"));
+					} catch (Exception e) {
+						nodeLength = 1;
+					}
+				} else if (node.getLocalName().equals("line-break")) {
+					nodeLength = 1;
+				} else if (node.getLocalName().equals("tab")) {
+					nodeLength = 1;
+				} else {
+					nodeLength = TextExtractor.getText((OdfElement) node).length();
+				}
+			}
+			if (nodeLength <= fromIndex) {
+				fromIndex -= nodeLength;
+			} else {
+				// the start index is in this node
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					String value = node.getNodeValue();
+					node.setNodeValue(value.substring(0, fromIndex));
+					int endLength = fromIndex + leftLength;
+					int nextLength = value.length() - endLength;
+
+					Node nextNode = node.getNextSibling();
+					Node parNode = node.getParentNode();
+					// init text:a
+					OdfTextSpan textSpan = new OdfTextSpan((OdfFileDom) node.getOwnerDocument());
+					Node newNode = null;
+					if (nextLength >= 0) {
+						textSpan.setTextContent(value.substring(fromIndex, endLength));
+						newNode = node.cloneNode(true);
+						newNode.setNodeValue(value.substring(endLength, value.length()));
+						leftLength = 0;
+					} else {
+						textSpan.setTextContent(value.substring(fromIndex, value.length()));
+						leftLength = endLength - value.length();
+					}
+					textSpan.setProperties(style.getStyleProperties());
+
+					if (nextNode != null) {
+						parNode.insertBefore(textSpan, nextNode);
+						if (newNode != null) {
+							parNode.insertBefore(newNode, nextNode);
+						}
+					} else {
+						parNode.appendChild(textSpan);
+						if (newNode != null) {
+							parNode.appendChild(newNode);
+						}
+					}
+					fromIndex = 0;
+					if (nextNode != null) {
+						node = nextNode;
+					} else {
+						node = textSpan;
+					}
+
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// if text:s?????????
+					// text:s
+					if (node.getLocalName().equals("s")) {
+						// delete space
+						((TextSElement) node).setTextCAttribute(new Integer(nodeLength - fromIndex));
+						leftLength = leftLength - (nodeLength - fromIndex);
+						fromIndex = 0;
+
+					} else if (node.getLocalName().equals("line-break") || node.getLocalName().equals("tab")) {
+						fromIndex = 0;
+						leftLength--;
+					} else {
+						appendStyle(fromIndex, leftLength, node, style);
+						int length = (fromIndex + leftLength) - nodeLength;
+						leftLength = length > 0 ? length : 0;
+						fromIndex = 0;
+					}
+				}
+			}
+			node = node.getNextSibling();
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextStyleNavigation.java b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextStyleNavigation.java
new file mode 100644
index 0000000..fb2fd64
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/common/navigation/TextStyleNavigation.java
@@ -0,0 +1,312 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextHeading;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.TextDocument;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A derived <code>Navigation</code> class used to navigate the text content,
+ * which can search the document and find matched style properties and return
+ * <code>TextSelection</code> instance(s).
+ */
+public class TextStyleNavigation extends Navigation {
+
+	private TextDocument mTextDocument;
+	private TextSelection mNextSelectedItem;
+	private TextSelection mTempSelectedItem;
+	private int mCurrentIndex;
+	private Map<OdfStyleProperty, String> mProps;
+	private String mText;
+	private Node mPhNode;
+	private int mIndex;
+	private Node mNode;
+
+	/**
+	 * Construct <code>TextStyleNavigation</code> with style properties condition and
+	 * navigation scope.
+	 * 
+	 * @param props
+	 *            the matched style properties conditions
+	 * @param doc
+	 *            the navigation search scope
+	 */
+	public TextStyleNavigation(Map<OdfStyleProperty, String> props, TextDocument doc) {
+		mTextDocument = doc;
+		mNextSelectedItem = null;
+		mTempSelectedItem = null;
+		this.mProps = props;
+	}
+
+	/**
+	 * Check if has next <code>TextSelection</code> with satisfied style.
+	 * 
+	 * @see org.odftoolkit.simple.common.navigation.Navigation#hasNext()
+	 */
+	@Override
+	public boolean hasNext() {
+		mTempSelectedItem = findNext(mNextSelectedItem);
+		return (mTempSelectedItem != null);
+	}
+	
+	/**
+	 * Get next <code>TextSelection</code>.
+	 * 
+	 * @see org.odftoolkit.simple.common.navigation.Navigation#nextSelection()
+	 */
+	@Override
+	public Selection nextSelection() {
+		if(mTempSelectedItem !=null){
+			mNextSelectedItem = mTempSelectedItem;
+			mTempSelectedItem = null;
+		}else{
+			mNextSelectedItem = findNext(mNextSelectedItem);
+		}
+		if (mNextSelectedItem == null) {
+			return null;
+		} else {
+			Selection.SelectionManager.registerItem(mNextSelectedItem);
+			return mNextSelectedItem;
+		}
+	}
+
+	/**
+	 * Check if the element has specified style properties, which are stated
+	 * when the <code>TextStyleNavigation</code> created.
+	 * 
+	 * @param element
+	 *            navigate this element
+	 * @return true if this element has the specified style properties false if
+	 *         not match
+	 */
+	@Override
+	public boolean match(Node element) {
+		boolean match = false;
+		if (element.getNodeType() == Node.TEXT_NODE && !element.getNodeValue().trim().equals("")) {
+			if (element.getParentNode() instanceof OdfStylableElement) {
+				OdfStylableElement parStyleElement = (OdfStylableElement) element.getParentNode();
+				String parStyleName = getStyleName(parStyleElement);
+				if (getMatchStyleNames().contains(parStyleName)) {
+					match = true;
+					mText = element.getNodeValue();
+					NodeList nodes = getPHElement(element.getParentNode()).getChildNodes();
+					mIndex = 0;
+					getIndex(nodes, element);
+				}
+			}
+		}
+		return match;
+	}
+
+	/*
+	 * Find next <code>TextSelection</code> which match specified style.
+	 */
+	private TextSelection findNext(TextSelection selected) {
+		OdfElement element = null;
+		try {
+			Node rootNode = mTextDocument.getContentRoot();
+			if (selected == null) {
+				mNode = getNextMatchElementInTree(rootNode, rootNode);
+			} else {
+				mNode = getNextMatchElementInTree(mNode, rootNode);
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(TextStyleNavigation.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+		}
+		if (mNode != null) {
+			element = (OdfElement) getPHElement(mNode);
+			TextSelection item = new TextSelection(this, mText, element,
+					mCurrentIndex);
+			return item;
+		}
+		return null;
+	}
+
+	private Node getPHElement(Node node) {
+		// get paragraph or heading element
+		if (node instanceof OdfTextParagraph) {
+			mPhNode = node;
+		} else if (node instanceof OdfTextHeading) {
+			mPhNode = node;
+		} else {
+			getPHElement(node.getParentNode());
+		}
+		return mPhNode;
+	}
+
+	private void getIndex(NodeList nodes, Node element) {
+		for (int i = 0; i < nodes.getLength(); i++) {
+			Node node = nodes.item(i);
+			if (node == element) {
+				mCurrentIndex = mIndex;
+				break;
+			} else {
+				if (node.getNodeType() == Node.TEXT_NODE) {
+					mIndex = mIndex + node.getNodeValue().length();
+				} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+					// mText:s
+					if (node.getLocalName().equals("s")) {
+						try {
+							mIndex = mIndex
+									+ Integer.parseInt(((Element) node).getAttributeNS(OdfDocumentNamespace.TEXT
+											.getUri(), "c"));
+						} catch (Exception e) {
+							mIndex++;
+						}
+					} else if (node.getLocalName().equals("line-break")) {
+						mIndex++;
+					} else if (node.getLocalName().equals("tab")) {
+						mIndex++;
+					} else {
+						getIndex(node.getChildNodes(), element);
+					}
+				}
+			}
+		}
+	}
+
+	private String getStyleName(OdfStylableElement element) {
+		String stylename = element.getStyleName();
+		if (stylename == null) {
+			if (element.getParentNode() instanceof OdfStylableElement) {
+				getStyleName((OdfStylableElement) element.getParentNode());
+			} else {
+				stylename = "defaultstyle";
+			}
+		}
+		return stylename;
+	}
+
+	private Set<String> getMatchStyleNames() {
+		Set<String> styleNames = new HashSet<String>();
+		String sname;
+		HashMap<String, OdfDefaultStyle> defaultStyles = new HashMap<String, OdfDefaultStyle>();
+		try {
+			NodeList defStyleList = mTextDocument.getDocumentStyles().getElementsByTagName("style:default-style");
+			for (int i = 0; i < defStyleList.getLength(); i++) {
+				OdfDefaultStyle defStyle = (OdfDefaultStyle) defStyleList.item(i);
+				defaultStyles.put(defStyle.getFamilyName(), defStyle);
+			}
+			NodeList styleList = mTextDocument.getDocumentStyles().getElementsByTagName("style:style");
+			for (int i = 0; i < styleList.getLength(); i++) {
+				OdfStyle sStyle = (OdfStyle) styleList.item(i);
+				// get default properties and style properties
+				Map<OdfStyleProperty, String> map = sStyle.getStylePropertiesDeep();
+				// check if properties include all search properties and value
+				// equal
+				Iterator<OdfStyleProperty> pIter = mProps.keySet().iterator();
+				boolean isStyle = false;
+				while (pIter.hasNext()) {
+					isStyle = false;
+					OdfStyleProperty p = pIter.next();
+					if (map.containsKey(p)) {
+						if (map.get(p).equals(mProps.get(p))) {
+							isStyle = true;
+						} else {
+							break;
+						}
+					} else {
+						break;
+					}
+				}
+				// put all match style names
+				if (isStyle) {
+					sname = sStyle.getStyleNameAttribute();
+					// if(sname.contains("default"))sname="defaultstyle";
+					styleNames.add(sname);
+				}
+			}
+			// get all automatic styles
+			Iterator<OdfStyle> cStyles = mTextDocument.getContentDom().getAutomaticStyles().getAllStyles().iterator();
+			while (cStyles.hasNext()) {
+				OdfStyle cStyle = cStyles.next();
+				// get default properties and style properties
+				Map<OdfStyleProperty, String> map = cStyle.getStylePropertiesDeep();
+
+				if (cStyle.getParentStyle() == null) {
+					if (cStyle.getFamilyName().equals("text")) {
+						if (defaultStyles.containsKey("text")) {
+							getTextDefaultProperties("text", defaultStyles, map);
+						} else {
+							getTextDefaultProperties("paragraph", defaultStyles, map);
+						}
+					}
+				}
+				// check if the search properties is in properties
+				Iterator<OdfStyleProperty> pIter = mProps.keySet().iterator();
+				boolean isStyle = false;
+				while (pIter.hasNext()) {
+					isStyle = false;
+					OdfStyleProperty p = pIter.next();
+					if (map.containsKey(p)) {
+						if (map.get(p).equals(mProps.get(p))) {
+							isStyle = true;
+						} else {
+							break;
+						}
+					} else {
+						break;
+					}
+				}
+				// put all match style names
+				if (isStyle) {
+					styleNames.add(cStyle.getStyleNameAttribute());
+				}
+			}
+		} catch (Exception e1) {
+			Logger.getLogger(TextStyleNavigation.class.getName()).log(Level.SEVERE, e1.getMessage(), e1);
+		}
+		return styleNames;
+	}
+
+	private void getTextDefaultProperties(String familyName, HashMap<String, OdfDefaultStyle> defaultStyles,
+			Map<OdfStyleProperty, String> map) {
+		OdfDefaultStyle defStyle = defaultStyles.get(familyName);
+		if (defStyle != null) {
+			OdfStyleFamily family = defStyle.getFamily();
+			if (family != null) {
+				for (OdfStyleProperty property : family.getProperties()) {
+					if (!map.containsKey(property) && defStyle.hasProperty(property)) {
+						map.put(property, defStyle.getProperty(property));
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/AbstractFrameContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/AbstractFrameContainer.java
new file mode 100644
index 0000000..4080483
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/AbstractFrameContainer.java
@@ -0,0 +1,121 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.PresentationDocument;
+
+/**
+ * AbstractFrameContainer is an abstract implementation of the FrameContainer
+ * interface, with a default implementation for every method defined in
+ * FrameContainer, except getFrameContainerElement(). A subclass must implement
+ * the abstract method getFrameContainerElement().
+ * 
+ * @since 0.5
+ */
+public abstract class AbstractFrameContainer implements FrameContainer {
+
+	public abstract OdfElement getFrameContainerElement();
+
+	/**
+	 * Add a frame to the container
+	 * 
+	 * @return the instance of DrawFrameElement
+	 */
+	public Frame addFrame() {
+		Frame frame = Frame.newFrame(this);
+		return frame;
+	}
+
+	/**
+	 * Add a frame with the specific position to the container
+	 * 
+	 * @param rectangle
+	 *            - the rectangle (position and size) of this frame
+	 * @return an object of frame
+	 */
+	public Frame addFrame(FrameRectangle rectangle) {
+		Frame frame = Frame.newFrame(this);
+		frame.setRectangle(rectangle);
+		return frame;
+	}
+
+	/**
+	 * Return a frame whose name (specified with "draw:name") is a given value.
+	 * 
+	 * @param name
+	 *            - the name of this frame
+	 * @return a frame whose name is the given value
+	 */
+	public Frame getFrameByName(String name) {
+		if (name == null)
+			return null;
+
+		OdfElement container = getFrameContainerElement();
+		DrawFrameElement element = OdfElement.findFirstChildNode(DrawFrameElement.class, container);
+		while (element != null) {
+			if (name.equals(element.getDrawNameAttribute())) {
+				Frame frame = Frame.getInstanceof(element);
+				frame.mFrameContainer = this;
+				return frame;
+			}
+			element = OdfElement.findNextChildNode(DrawFrameElement.class, element);
+		}
+		return null;
+	}
+
+	/**
+	 * Return a list of frame whose usage (specified with "presentation:class")
+	 * is a given value.
+	 * <p>
+	 * Null will be returned if the owner document is not a presentation
+	 * document.
+	 * 
+	 * @param usage
+	 *            - the usage value
+	 * @return a list of frame whose usage is a given value. Null will be
+	 *         returned if the owner document is not a presentation document.
+	 * @see org.odftoolkit.simple.PresentationDocument.PresentationClass
+	 */
+	public List<Frame> getFrameByPresentationclass(PresentationDocument.PresentationClass usage) {
+		OdfElement container = getFrameContainerElement();
+		Document doc = (Document) ((OdfFileDom) container.getOwnerDocument()).getDocument();
+		if (!(doc instanceof PresentationDocument)) {
+			return null;
+		}
+		ArrayList<Frame> al = new ArrayList<Frame>();
+		DrawFrameElement element = OdfElement.findFirstChildNode(DrawFrameElement.class, container);
+		while (element != null) {
+			if (usage.toString().equals(element.getPresentationClassAttribute())) {
+				Frame frame = Frame.getInstanceof(element);
+				frame.mFrameContainer = this;
+				al.add(frame);
+			}
+			element = OdfElement.findNextChildNode(DrawFrameElement.class, element);
+		}
+		return al;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/AbstractTextboxContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/AbstractTextboxContainer.java
new file mode 100644
index 0000000..b358079
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/AbstractTextboxContainer.java
@@ -0,0 +1,188 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawTextBoxElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.text.AbstractParagraphContainer;
+import org.w3c.dom.DOMException;
+
+/**
+ * AbstractTextboxContainer is an abstract implementation of the
+ * TextboxContainer interface, with a default implementation for every method
+ * defined in TextboxContainer, except getFrameContainerElement(). A subclass
+ * must implement the abstract method getFrameContainerElement().
+ * 
+ * @since 0.5
+ */
+public abstract class AbstractTextboxContainer extends AbstractFrameContainer implements TextboxContainer {
+
+	public Textbox addTextbox() {
+		Textbox textbox = Textbox.newTextbox(this);
+		return textbox;
+	}
+
+	/**
+	 * Remove the text box.
+	 * 
+	 * @param box
+	 *            - the text box to be removed
+	 * @return true if the text box is removed successfully, false if errors
+	 *         happen.
+	 */
+	public boolean removeTextbox(Textbox box) {
+		OdfElement containerElement = getFrameContainerElement();
+		DrawFrameElement drawFrame = box.getDrawFrameElement();
+		try {
+			drawFrame.removeChild(box.getOdfElement());
+			if (drawFrame.hasChildNodes() == false)
+				containerElement.removeChild(box.getDrawFrameElement());
+		} catch (DOMException exception) {
+			Logger.getLogger(AbstractParagraphContainer.class.getName()).log(Level.WARNING, exception.getMessage());
+			return false;
+		}
+		return true;
+	}
+
+	public Iterator<Textbox> getTextboxIterator() {
+		return new SimpleTextboxIterator(this);
+	}
+
+	public Textbox addTextbox(FrameRectangle position) {
+		Textbox textbox = Textbox.newTextbox(this);
+		textbox.setRectangle(position);
+		return textbox;
+	}
+
+	/**
+	 * Return a text box whose name is a given value.
+	 * 
+	 * @param name
+	 *            - the name of the text box
+	 * @return a text box whose name is a given value
+	 * @see AbstractFrameContainer#getFrameByName(String)
+	 */
+	public Textbox getTextboxByName(String name) {
+		Frame frame = getFrameByName(name);
+		if (frame != null) {
+			DrawTextBoxElement boxElement = OdfElement.findFirstChildNode(DrawTextBoxElement.class, frame
+					.getDrawFrameElement());
+			if (boxElement != null) {
+				Textbox box = Textbox.getInstanceof(boxElement);
+				box.mFrameContainer = frame.mFrameContainer;
+				return box;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method is only useful for presentation slides.
+	 * <p>
+	 * This method will return a list of text boxs by the usage defined in
+	 * presentation slides.
+	 * 
+	 * @param usage
+	 *            - the usage description
+	 * @return a list of text box Null will be returned if the owner document is
+	 *         not a presentation
+	 * @see AbstractFrameContainer#getFrameByPresentationclass(PresentationDocument.PresentationClass)
+	 * @see org.odftoolkit.simple.PresentationDocument.PresentationClass
+	 */
+	public List<Textbox> getTextboxByUsage(PresentationDocument.PresentationClass usage) {
+		List<Frame> frameList = getFrameByPresentationclass(usage);
+		if (frameList == null)
+			return null;
+
+		ArrayList<Textbox> al = new ArrayList<Textbox>();
+		for (int i = 0; i < frameList.size(); i++) {
+			Frame frame = frameList.get(i);
+			DrawTextBoxElement boxElement = OdfElement.findFirstChildNode(DrawTextBoxElement.class, frame
+					.getDrawFrameElement());
+			if (boxElement != null) {
+				Textbox box = Textbox.getInstanceof(boxElement);
+				box.mFrameContainer = frame.mFrameContainer;
+				al.add(box);
+			}
+		}
+		return al;
+	}
+
+	private class SimpleTextboxIterator implements Iterator<Textbox> {
+
+		private OdfElement containerElement;
+		private Textbox nextElement = null;
+		private Textbox tempElement = null;
+
+		private SimpleTextboxIterator(TextboxContainer container) {
+			containerElement = container.getFrameContainerElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Textbox next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			containerElement.removeChild(nextElement.getDrawFrameElement());
+		}
+
+		private Textbox findNext(Textbox thisBox) {
+			DrawFrameElement nextFrame = null;
+			if (thisBox == null) {
+				nextFrame = OdfElement.findFirstChildNode(DrawFrameElement.class, containerElement);
+			} else {
+				nextFrame = OdfElement.findNextChildNode(DrawFrameElement.class, thisBox.getDrawFrameElement());
+			}
+
+			if (nextFrame != null) {
+				DrawTextBoxElement nextbox = OdfElement.findFirstChildNode(DrawTextBoxElement.class, nextFrame);
+				return Textbox.getInstanceof(nextbox);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Control.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Control.java
new file mode 100644
index 0000000..1ecf1c2
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Control.java
@@ -0,0 +1,286 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.w3c.dom.DOMException;
+
+/**
+ * This class represents control object, a shape that is linked to a control
+ * inside an form. It provides methods to get/set control properties, content,
+ * and styles.
+ * 
+ * @since 0.8
+ */
+public class Control extends Component {
+	private DrawControlElement mElement;
+	private OdfElement containerElement;
+	private ControlStyleHandler mStyleHandler;
+
+	public Control(DrawControlElement element) {
+		mElement = element;
+		containerElement = (OdfElement) element.getParentNode();
+	}
+
+	/**
+	 * Get the container element which contains this control.
+	 * 
+	 * @return the container element.
+	 */
+	public OdfElement getContainerElement() {
+		return containerElement;
+	}
+
+	/**
+	 * Get the instance of DrawControlElement which represents this control.
+	 * 
+	 * @return the instance of DrawControlElement
+	 */
+	public DrawControlElement getOdfElement() {
+		return mElement;
+	}
+
+	/**
+	 * Create an instance of control and and append it at the end of a container
+	 * element.
+	 * 
+	 * @param container
+	 *            - the container element
+	 * @return a control instance
+	 */
+	public static Control newDrawControl(ControlContainer container) {
+		OdfElement parent = container.getDrawControlContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parent.getOwnerDocument();
+		DrawControlElement element = ownerDom
+				.newOdfElement(DrawControlElement.class);
+		parent.appendChild(element);
+		Control control = new Control(element);
+		Component.registerComponent(control, element);
+		return control;
+	}
+
+	/**
+	 * Get an instance of control according to a DrawControlElement.
+	 * 
+	 * @param element
+	 *            - an instance of DrawControlElement
+	 * @return an instance of DrawControlElement
+	 */
+	public static Control getInstanceof(DrawControlElement element) {
+		Control control = null;
+		control = (Control) Component.getComponentByElement(element);
+		if (control != null)
+			return control;
+
+		control = new Control(element);
+		Component.registerComponent(control, element);
+		return control;
+	}
+
+	/**
+	 * Remove the shape control from the container.
+	 * <p>
+	 * The resource is removed if it's only used by this object.
+	 * 
+	 * @return true if the shape control is successfully removed; false if
+	 *         otherwise.
+	 */
+	public boolean remove() {
+		try {
+			Document mOwnerDocument = (Document) ((OdfFileDom) mElement
+					.getOwnerDocument()).getDocument();
+			mOwnerDocument.removeElementLinkedResource(getOdfElement());
+			containerElement.removeChild(mElement);
+			return true;
+		} catch (DOMException exception) {
+			Logger.getLogger(Control.class.getName()).log(Level.WARNING,
+					exception.getMessage());
+			return false;
+		}
+	}
+
+	/**
+	 * Return the style handler for this control
+	 * 
+	 * @return the style handler
+	 */
+	public ControlStyleHandler getStyleHandler() {
+		if (mStyleHandler == null)
+			mStyleHandler = new ControlStyleHandler(this);
+		return mStyleHandler;
+	}
+
+	/**
+	 * Set a control within a form that is linked to this control shape by its
+	 * ID.
+	 * 
+	 * @param formControlId
+	 *            - id of a form control
+	 */
+	public void setControl(String formControlId) {
+		mElement.setDrawControlAttribute(formControlId);
+	}
+
+	/**
+	 * Set how a form control is bound to a text document. Default position
+	 * relative and alignment will be set.
+	 * 
+	 * <p>
+	 * If the document is not text document, nothing will happen.
+	 * 
+	 * @param achorType
+	 *            - the point at which a form control is bound to a text
+	 *            document
+	 */
+	public void setAchorType(StyleTypeDefinitions.AnchorType achorType) {
+		this.getStyleHandler().setAchorType(achorType);
+	}
+
+	/**
+	 * Set the rectangle used by this control
+	 * 
+	 * @param rectangle
+	 *            - the rectangle used by this control
+	 */
+	public void setRectangle(FrameRectangle rectangle) {
+		if (rectangle.getWidth() > 0)
+			mElement.setSvgWidthAttribute(rectangle.getWidthDesc());
+		if (rectangle.getHeight() > 0)
+			mElement.setSvgHeightAttribute(rectangle.getHeigthDesc());
+		if (rectangle.getX() > 0)
+			mElement.setSvgXAttribute(rectangle.getXDesc());
+		if (rectangle.getY() > 0)
+			mElement.setSvgYAttribute(rectangle.getYDesc());
+	}
+
+	/**
+	 * Return the rectangle used by this control
+	 * 
+	 * @return - the rectangle used by this control
+	 */
+	public FrameRectangle getRectangle() {
+		try {
+			FrameRectangle rectange = new FrameRectangle(mElement
+					.getSvgXAttribute(), mElement.getSvgYAttribute(), mElement
+					.getSvgWidthAttribute(), mElement.getSvgHeightAttribute());
+			return rectange;
+		} catch (Exception e) {
+			Logger.getLogger(Frame.class.getName()).log(Level.FINE,
+					e.getMessage(), e);
+			return null;
+		}
+	}
+
+	/**
+	 * Set the format string of the input control.
+	 * <p>
+	 * This function only works for date, time and percentage, otherwise an
+	 * {@link java.lang.IllegalArgumentException} will be thrown.
+	 * <p>
+	 * For value type percentage, the <code>formatStr</code> must follow the
+	 * encoding rule of {@link java.text.DecimalFormat
+	 * <code>java.text.DecimalFormat</code>}. For value type date and time, the
+	 * <code>formatStr</code> must follow the encoding rule of
+	 * {@link java.text.SimpleDateFormat
+	 * <code>java.text.SimpleDateFormat</code>}.
+	 * 
+	 * @param formatStr
+	 *            -the input need be formatted as this specified format string.
+	 * @param type
+	 *            - the type that need to be set
+	 * @throws IllegalArgumentException
+	 *             if <code>formatStr</code> is null or the value type is
+	 *             supported.
+	 * @see java.text.SimpleDateFormat
+	 * @see java.text.DecimalFormat
+	 */
+	public void setFormatString(String formatStr, String type) {
+		OfficeValueTypeAttribute.Value typeValue = null;
+		typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		if (typeValue == OfficeValueTypeAttribute.Value.DATE) {
+			OdfNumberDateStyle dateStyle = new OdfNumberDateStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniqueDateStyleName(), null);
+			dateStyle.setNumberLanguageAttribute("en");
+			dateStyle.setNumberCountryAttribute("US");
+			mElement.getAutomaticStyles().appendChild(dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+		} else if (typeValue == OfficeValueTypeAttribute.Value.TIME) {
+			OdfNumberTimeStyle timeStyle = new OdfNumberTimeStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniqueDateStyleName());
+			mElement.getAutomaticStyles().appendChild(timeStyle);
+			setDataDisplayStyleName(timeStyle.getStyleNameAttribute());
+		} else if (typeValue == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			OdfNumberPercentageStyle dateStyle = new OdfNumberPercentageStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniquePercentageStyleName());
+			mElement.getAutomaticStyles().appendChild(dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+		} else {
+			throw new IllegalArgumentException("This function doesn't support "
+					+ type + "formatting.");
+		}
+	}
+
+	private String getUniqueDateStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("d%06x",
+					(int) (Math.random() * 0xffffff));
+		} while (styles.getDateStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private void setDataDisplayStyleName(String name) {
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForWrite();
+		if (styleElement != null) {
+			styleElement.setOdfAttributeValue(OdfName.newName(
+					OdfDocumentNamespace.STYLE, "data-style-name"), name);
+		}
+	}
+
+	private String getUniquePercentageStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("p%06x",
+					(int) (Math.random() * 0xffffff));
+		} while (styles.getDateStyle(unique_name) != null);
+		return unique_name;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/ControlContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/ControlContainer.java
new file mode 100644
index 0000000..ea6c561
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/ControlContainer.java
@@ -0,0 +1,45 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+/**
+ * ControlContainer is a container which maintains Control(s) as element(s).
+ * 
+ * @since 0.8
+ */
+public interface ControlContainer {
+	/**
+	 * Create an instance of control and and append it at the end of this
+	 * container.
+	 * 
+	 * @return a control instance
+	 */
+	public Control createDrawControl();
+
+	/**
+	 * Get the ODF element which can have DrawControlElement as child element
+	 * directly.
+	 * 
+	 * @return - an ODF element which can have control as child
+	 */
+	public OdfElement getDrawControlContainerElement();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/ControlStyleHandler.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/ControlStyleHandler.java
new file mode 100644
index 0000000..284a492
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/ControlStyleHandler.java
@@ -0,0 +1,112 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+
+/**
+ * This class provides functions to handle the style of a form control.
+ * 
+ * @since 0.8
+ */
+public class ControlStyleHandler extends DefaultStyleHandler {
+
+	private Control mControl;
+
+	public ControlStyleHandler(Control control) {
+		super(control.getOdfElement());
+		mControl = control;
+	}
+
+	/**
+	 * Set how a form control is bound to a text document. Default position
+	 * relative and alignment will be set.
+	 * 
+	 * <p>
+	 * If the document is not text document, nothing will happen.
+	 * 
+	 * @param achorType
+	 *            - the point at which a form control is bound to a text
+	 *            document
+	 */
+	public void setAchorType(StyleTypeDefinitions.AnchorType achorType) {
+		if (!mDocument.getMediaTypeString().equals(
+				Document.OdfMediaType.TEXT.getMediaTypeString())
+				&& !mDocument.getMediaTypeString().equals(
+						Document.OdfMediaType.TEXT_TEMPLATE
+								.getMediaTypeString()))
+			return;
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+
+		DrawControlElement controlElement = (DrawControlElement) mOdfElement;
+		controlElement.setTextAnchorTypeAttribute(achorType.toString());
+
+		// set default relative
+		switch (achorType) {
+		case AS_CHARACTER:
+			graphicPropertiesForWrite
+					.setVerticalRelative(VerticalRelative.BASELINE);
+			graphicPropertiesForWrite
+					.setVerticalPosition(FrameVerticalPosition.TOP);
+			break;
+		case TO_CHARACTER:
+			graphicPropertiesForWrite
+					.setVerticalRelative(VerticalRelative.PARAGRAPH);
+			graphicPropertiesForWrite
+					.setVerticalPosition(FrameVerticalPosition.TOP);
+			graphicPropertiesForWrite
+					.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			graphicPropertiesForWrite
+					.setHorizontalPosition(FrameHorizontalPosition.CENTER);
+			break;
+		case TO_PAGE:
+			controlElement.setTextAnchorPageNumberAttribute(Integer.valueOf(1));
+			graphicPropertiesForWrite
+					.setVerticalRelative(VerticalRelative.PAGE);
+			graphicPropertiesForWrite
+					.setVerticalPosition(FrameVerticalPosition.FROMTOP);
+			graphicPropertiesForWrite
+					.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			graphicPropertiesForWrite
+					.setHorizontalPosition(FrameHorizontalPosition.FROMLEFT);
+			break;
+		case TO_PARAGRAPH:
+			graphicPropertiesForWrite
+					.setVerticalRelative(VerticalRelative.PARAGRAPH);
+			graphicPropertiesForWrite
+					.setVerticalPosition(FrameVerticalPosition.TOP);
+			graphicPropertiesForWrite
+					.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			graphicPropertiesForWrite
+					.setHorizontalPosition(FrameHorizontalPosition.CENTER);
+			break;
+		case TO_FRAME:
+			break;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Frame.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Frame.java
new file mode 100644
index 0000000..216902d
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Frame.java
@@ -0,0 +1,377 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.net.URI;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.draw.DrawAElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeImageElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgDescElement;
+import org.odftoolkit.odfdom.dom.element.svg.SvgTitleElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class presents frame object. It provides method to get/set frame
+ * properties, content, and and styles. A frame is a container for enhanced
+ * content like text boxes, images or objects. A frame may contain multiple
+ * renditions of content.
+ * 
+ * @since 0.5
+ */
+public class Frame extends Component {
+
+	/**
+	 * Attributes:
+	 * 
+	 * draw:caption-id 19.115, draw:class-names 19.120, draw:copy-of 19.126,
+	 * draw:id 19.187.3, draw:layer 19.189, draw:name 19.197.10, draw:style-name
+	 * 19.219.13, draw:text-style-name 19.227, draw:transform 19.228,
+	 * draw:z-index 19.231, presentation:class 19.389, presentation:class-names
+	 * 19.390, presentation:placeholder 19.407, presentation:style-name 19.422,
+	 * presentation:user-transformed 19.427, style:rel-height 19.509,
+	 * style:rel-width 19.510.2, svg:height 19.539.8, svg:width 19.571.10, svg:x
+	 * 19.573.5, svg:y 19.577.5, table:end-cell-address 19.627, table:end-x
+	 * 19.632, table:end-y 19.633, table:table-background 19.728,
+	 * text:anchor-page-number 19.753, text:anchor-type 19.754 xml:id 19.914.
+	 */
+	protected DrawFrameElement mElement;
+	protected Document mOwnerDocument;
+	protected FrameContainer mFrameContainer;
+	protected FrameStyleHandler mStyleHandler;
+
+	protected Frame(DrawFrameElement element) {
+		mElement = element;
+		mOwnerDocument = (Document) ((OdfFileDom) mElement.getOwnerDocument()).getDocument();
+		mFrameContainer = null;
+	}
+
+	/**
+	 * Get a frame instance by an instance of <code>DrawFrameElement</code>.
+	 * 
+	 * @param element
+	 *            - the instance of DrawFrameElement
+	 * @return an instance of frame
+	 */
+	protected static Frame getInstanceof(DrawFrameElement element) {
+		Frame frame = null;
+		frame = (Frame) Component.getComponentByElement(element);
+		if (frame != null)
+			return frame;
+
+		frame = new Frame(element);
+		// Component.registerComponent(frame, element);
+		return frame;
+	}
+
+	/**
+	 * Create an instance of frame
+	 * <p>
+	 * The frame will be added at the end of this container.
+	 * 
+	 * @param container
+	 *            - the frame container that contains this frame.
+	 */
+	protected static Frame newFrame(FrameContainer container) {
+		Frame frame = null;
+		OdfElement parent = container.getFrameContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parent.getOwnerDocument();
+		DrawFrameElement fElement = ownerDom.newOdfElement(DrawFrameElement.class);
+		parent.appendChild(fElement);
+		frame = new Frame(fElement);
+		frame.mFrameContainer = container;
+		// Component.registerComponent(frame, fElement);
+
+		return frame;
+	}
+
+	/**
+	 * Set the name of this frame.
+	 * 
+	 * @param name
+	 *            - the name of the frame
+	 */
+	public void setName(String name) {
+		mElement.setDrawNameAttribute(name);
+	}
+
+	/**
+	 * Get the name of this frame.
+	 * 
+	 * @return the name of the frame
+	 */
+	public String getName() {
+		return mElement.getDrawNameAttribute();
+	}
+
+	// /**
+	// * Get the style handler of this frame.
+	// *
+	// * @return the style handler of this frame
+	// */
+	// public FrameStyleHandler getFrameStyleHandler() {
+	// return null;
+	// }
+	//
+	// /**
+	// * Get the paragraph style handler of this frame.
+	// *
+	// * @return the paragraph style handler of this frame
+	// */
+	// public DefaultStyleHandler getParagraphStyleHandler() {
+	// return null;
+	// }
+
+	/**
+	 * Get the instance of <code>DrawFrameElement</code> which represents this
+	 * frame.
+	 * 
+	 * @return the instance of <code>DrawFrameElement</code>
+	 */
+	public OdfElement getOdfElement() {
+		return mElement;
+	}
+
+	/**
+	 * Get the instance of <code>DrawFrameElement</code> which represents this
+	 * frame.
+	 * 
+	 * @return the instance of <code>DrawFrameElement</code>
+	 */
+	public DrawFrameElement getDrawFrameElement() {
+		return mElement;
+	}
+
+	/**
+	 * Set the rectangle used by this frame
+	 * 
+	 * @param rectangle
+	 *            - the rectangle used by this frame
+	 */
+	public void setRectangle(FrameRectangle rectangle) {
+		String linemeasure = rectangle.getLinearMeasure().toString();
+		if (rectangle.getWidth() > 0)
+			mElement.setSvgWidthAttribute(rectangle.getWidth() + linemeasure);
+		if (rectangle.getHeight() > 0)
+			mElement.setSvgHeightAttribute(rectangle.getHeight() + linemeasure);
+		if (rectangle.getX() > 0)
+			mElement.setSvgXAttribute(rectangle.getX() + linemeasure);
+		if (rectangle.getY() > 0)
+			mElement.setSvgYAttribute(rectangle.getY() + linemeasure);
+	}
+
+	/**
+	 * Return the rectangle used by this frame
+	 * 
+	 * @return - the rectangle
+	 */
+	public FrameRectangle getRectangle() {
+		try {
+			FrameRectangle rectange = new FrameRectangle(mElement.getSvgXAttribute(), mElement.getSvgYAttribute(),
+					mElement.getSvgWidthAttribute(), mElement.getSvgHeightAttribute());
+			return rectange;
+		} catch (Exception e) {
+			Logger.getLogger(Frame.class.getName()).log(Level.FINE, e.getMessage(), e);
+			return null;
+		}
+	}
+
+	/**
+	 * Set the title of this text box
+	 * 
+	 * @param title
+	 *            - the title of this text box
+	 */
+	public void setTitle(String title) {
+		SvgTitleElement titleElement = OdfElement.findFirstChildNode(SvgTitleElement.class, mElement);
+		if (titleElement == null)
+			titleElement = mElement.newSvgTitleElement();
+		titleElement.setTextContent(title);
+	}
+
+	/**
+	 * Get the title of this text box
+	 * 
+	 * @return - the title of this text box
+	 */
+	public String getTitle() {
+		SvgTitleElement titleElement = OdfElement.findFirstChildNode(SvgTitleElement.class, mElement);
+		if (titleElement == null)
+			return null;
+		else
+			return titleElement.getTextContent();
+	}
+
+	/**
+	 * Get the description of this text box
+	 * 
+	 * @return - the description of this text box
+	 */
+	public String getDesciption() {
+		SvgDescElement descElement = OdfElement.findFirstChildNode(SvgDescElement.class, mElement);
+		if (descElement == null)
+			return null;
+		else
+			return descElement.getTextContent();
+	}
+
+	/**
+	 * Set the description of this text box.
+	 * 
+	 * @param description
+	 *            - the description of this text box
+	 */
+	public void setDescription(String description) {
+		SvgDescElement descElement = OdfElement.findFirstChildNode(SvgDescElement.class, mElement);
+		if (descElement == null)
+			descElement = mElement.newSvgDescElement();
+		descElement.setTextContent(description);
+	}
+	
+	/**
+	 * Add a hypertext reference to this frame.
+	 * 
+	 * @param linkto
+	 *            the hyperlink
+	 * @since 0.6.5
+	 * 
+	 */
+	public void setHyperlink(URI linkto) {
+		OdfElement thisFrame = getOdfElement();
+		OdfElement parent = (OdfElement) thisFrame.getParentNode();
+		// if this frame has a hyperlink setting
+		if (parent instanceof DrawAElement) {
+			((DrawAElement) parent).setXlinkHrefAttribute(linkto.toString());
+			return;
+		}
+		// if this frame has not hyperlink setting
+		Node brother = thisFrame.getNextSibling();
+		if (parent instanceof OfficeImageElement)
+			return;
+		try {
+			DrawAElement aElement = mOwnerDocument.getContentDom()
+					.newOdfElement(DrawAElement.class);
+			aElement.setXlinkHrefAttribute(linkto.toString());
+			aElement.setXlinkTypeAttribute("simple");
+			parent.removeChild(thisFrame);
+			aElement.appendChild(thisFrame);
+			if (brother == null)
+				parent.appendChild(aElement);
+			parent.insertBefore(aElement, brother);
+		} catch (Exception e) {
+			Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Return the URI of hypertext reference if exists, or else, return null.
+	 * 
+	 * @return the URI of hyperlink if exists
+	 */
+	public URI getHyperlink() {
+		OdfElement thisFrame = getOdfElement();
+		OdfElement parent = (OdfElement) thisFrame.getParentNode();
+		// if this frame has a hyperlink setting
+		if (parent instanceof DrawAElement) {
+
+			return URI.create(((DrawAElement) parent).getXlinkHrefAttribute());
+		}
+		return null;
+	}
+
+	/**
+	 * Return style handler for this frame
+	 * 
+	 * @return the style handler
+	 */
+	public FrameStyleHandler getStyleHandler() {
+		if (mStyleHandler == null)
+			mStyleHandler = new FrameStyleHandler(this);
+		return mStyleHandler;
+	}
+
+	/**
+	 * Set the background color of this frame.
+	 * <p>
+	 * If the parameter is null, there will be no background color defined for
+	 * this frame. The old setting of background color will be removed.
+	 * 
+	 * @param color
+	 *            - the background color to be set
+	 */
+	public void setBackgroundColor(Color color) {
+		getStyleHandler().setBackgroundColor(color);
+	}
+
+	private void removeContent() {
+		NodeList nodeList = mElement.getChildNodes();
+		int i;
+		for (i = 0; i < nodeList.getLength(); i++) {
+			Node node;
+			node = nodeList.item(i);
+			if (node.getNodeType() == Node.TEXT_NODE)
+				mElement.removeChild(node);
+			else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				mElement.removeChild(node);
+			}
+		}
+		// mElement.removeAttributeNS(OdfDocumentNamespace.PRESENTATION.getUri(),
+		// "class");
+		mElement.removeAttributeNS(OdfDocumentNamespace.PRESENTATION.getUri(), "placeholder");
+	}
+
+	/**
+	 * Add a image to the frame after all the contents get removed.
+	 * 
+	 * @since 0.5.5
+	 */
+	public Image setImage(URI uri) {
+		removeContent();
+		Image image = Image.newImage(this, uri);
+		return image;
+	}
+
+	// /**
+	// * Set the frame to be transparent, with none border and none fill color.
+	// */
+	// public void setTransparent() {
+	// }
+	// /**
+	// * Set the
+	// */
+	// public void setFitWeightToText()
+	// {
+	//		
+	// }
+	//	
+	// public void setFitHeightToText()
+	// {
+	//		
+	// }
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameContainer.java
new file mode 100644
index 0000000..e4a8fcb
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameContainer.java
@@ -0,0 +1,39 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+/**
+ * FrameContainer is a container which maintains Frame(s) as element(s).
+ * 
+ * @since 0.5
+ */
+public interface FrameContainer {
+
+	/**
+	 * Get the ODF element which can have <draw:frame> as child element directly
+	 * according to ODF specification. This Element will help to find the
+	 * position to insert a new draw:frame element.
+	 * 
+	 * @return the parent of draw:frame
+	 */
+	OdfElement getFrameContainerElement();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameRectangle.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameRectangle.java
new file mode 100644
index 0000000..9e26d6e
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameRectangle.java
@@ -0,0 +1,291 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+
+/**
+ * This class represents a rectangle used by a frame object.
+ * <p>
+ * A Rectangle specifies an area in a coordinate space that is enclosed by the
+ * Rectangle object's top-left point (x, y) in the coordinate space, its width,
+ * and its height.
+ * 
+ * @since 0.5
+ * 
+ */
+public class FrameRectangle {
+
+	/**
+	 * the x-axis coordinate
+	 */
+	private double x;
+	/**
+	 * the y-axis coordinate
+	 */
+	private double y;
+	/**
+	 * The width
+	 */
+	private double width;
+	/**
+	 * The height
+	 */
+	private double height;
+	private StyleTypeDefinitions.SupportedLinearMeasure linearMeasure;
+
+	private static final String WidthFormat = "#.####";
+	private DecimalFormat formater = new DecimalFormat(WidthFormat, new DecimalFormatSymbols(Locale.US));
+
+	/**
+	 * @return the x-axis coordinate
+	 */
+	public double getX() {
+		return x;
+	}
+
+	/**
+	 * @param x
+	 *            - the x-axis coordinate to set
+	 */
+	public void setX(double x) {
+		this.x = x;
+	}
+
+	/**
+	 * @return the y-axis coordinate
+	 */
+	public double getY() {
+		return y;
+	}
+
+	/**
+	 * @param y
+	 *            - the y-axis coordinate to set
+	 */
+	public void setY(double y) {
+		this.y = y;
+	}
+
+	/**
+	 * @return the width
+	 */
+	public double getWidth() {
+		return width;
+	}
+
+	/**
+	 * @param width
+	 *            - the width to set
+	 */
+	public void setWidth(double width) {
+		this.width = width;
+	}
+
+	/**
+	 * @return the height
+	 */
+	public double getHeight() {
+		return height;
+	}
+
+	/**
+	 * @param height
+	 *            - the height to set
+	 */
+	public void setHeight(double height) {
+		this.height = height;
+	}
+
+	/**
+	 * @return the line measurement
+	 */
+	public StyleTypeDefinitions.SupportedLinearMeasure getLinearMeasure() {
+		return linearMeasure;
+	}
+
+	/**
+	 * @param newLinearMeasure
+	 *            the line measurement to set
+	 */
+	public void setLinearMeasure(StyleTypeDefinitions.SupportedLinearMeasure newLinearMeasure) {
+		if (this.linearMeasure != linearMeasure) {
+			x = newLinearMeasure.convert(x, linearMeasure);
+			y = newLinearMeasure.convert(y, linearMeasure);
+			width = newLinearMeasure.convert(width, linearMeasure);
+			height = newLinearMeasure.convert(height, linearMeasure);
+		}
+		this.linearMeasure = newLinearMeasure;
+	}
+
+	/**
+	 * Create an instance of FrameRectangle with the top-left point (x, y),
+	 * width, height and the measurement
+	 * 
+	 * @param x
+	 *            - the x-axis coordinate
+	 * @param y
+	 *            - the y-axis coordinate
+	 * @param width
+	 *            - the width
+	 * @param height
+	 *            - the height
+	 * @param linearMeasure
+	 *            - the measurement
+	 */
+	public FrameRectangle(double x, double y, double width, double height,
+			StyleTypeDefinitions.SupportedLinearMeasure linearMeasure) {
+		this.x = x;
+		this.y = y;
+		this.width = width;
+		this.height = height;
+		this.linearMeasure = linearMeasure;
+	}
+
+	/**
+	 * Create an instance of FrameRectangle with the descriptions of top-left
+	 * point (x, y), width and height.
+	 * 
+	 * @param xDesc
+	 *            - the x-axis coordinate with measurement
+	 * @param yDesc
+	 *            - the y-axis coordinate with measurement
+	 * @param widthDesc
+	 *            - the width with measurement
+	 * @param heightDesc
+	 *            - the height with measurement
+	 */
+	public FrameRectangle(String xDesc, String yDesc, String widthDesc, String heightDesc) {
+		StyleTypeDefinitions.SupportedLinearMeasure tempXMeasure, tempYMeasure, tempWMeasure, tempHMeasure;
+
+		// get the basic information of width and measurement
+		if (xDesc == null || xDesc.length() == 0) {
+			x = 0;
+			tempXMeasure = StyleTypeDefinitions.SupportedLinearMeasure.CM;
+		} else {
+			x = getLineWidth(xDesc);
+			tempXMeasure = getLineMeasure(xDesc);
+		}
+
+		if (yDesc == null || yDesc.length() == 0) {
+			y = 0;
+			tempYMeasure = StyleTypeDefinitions.SupportedLinearMeasure.CM;
+		} else {
+			y = getLineWidth(yDesc);
+			tempYMeasure = getLineMeasure(yDesc);
+		}
+
+		if (widthDesc == null || widthDesc.length() == 0) {
+			width = 0;
+			tempWMeasure = StyleTypeDefinitions.SupportedLinearMeasure.CM;
+		} else {
+			width = getLineWidth(widthDesc);
+			tempWMeasure = getLineMeasure(widthDesc);
+		}
+
+		if (heightDesc == null || heightDesc.length() == 0) {
+			height = 0;
+			tempHMeasure = StyleTypeDefinitions.SupportedLinearMeasure.CM;
+		} else {
+			height = getLineWidth(heightDesc);
+			tempHMeasure = getLineMeasure(heightDesc);
+		}
+
+		// if all the measurement are empty, an exception will be thrown.
+		if (tempXMeasure == null && tempYMeasure == null && tempWMeasure == null && tempHMeasure == null)
+			throw new RuntimeException(xDesc + "," + yDesc + "," + widthDesc + "," + heightDesc + ","
+					+ " are not valid line description!");
+
+		// get the first unempty measurement definition
+		if (tempXMeasure != null)
+			linearMeasure = tempXMeasure;
+		else if (tempYMeasure != null)
+			linearMeasure = tempYMeasure;
+		else if (tempWMeasure != null)
+			linearMeasure = tempWMeasure;
+		else if (tempHMeasure != null)
+			linearMeasure = tempHMeasure;
+
+		// verify if the measurement is same, or else, change the value
+		if (tempXMeasure != null && tempXMeasure != linearMeasure)
+			x = linearMeasure.convert(x, tempXMeasure);
+		if (tempYMeasure != null && tempYMeasure != linearMeasure)
+			y = linearMeasure.convert(y, tempYMeasure);
+		if (tempWMeasure != null && tempWMeasure != linearMeasure)
+			width = linearMeasure.convert(width, tempWMeasure);
+		if (tempHMeasure != null && tempHMeasure != linearMeasure)
+			height = linearMeasure.convert(height, tempHMeasure);
+	}
+
+	/**
+	 * Return the x-axis coordinate with measurement
+	 * 
+	 * @return the x-axis coordinate with measurement
+	 */
+	public String getXDesc() {
+		return formater.format(x) + linearMeasure.toString();
+	}
+
+	/**
+	 * Return the y-axis coordinate with measurement
+	 * 
+	 * @return the y-axis coordinate with measurement
+	 */
+	public String getYDesc() {
+		return formater.format(y) + linearMeasure.toString();
+	}
+
+	/**
+	 * Return the width with measurement
+	 * 
+	 * @return the width with measurement
+	 */
+	public String getWidthDesc() {
+		return formater.format(width) + linearMeasure.toString();
+	}
+
+	/**
+	 * Return the height with measurement
+	 * 
+	 * @return the height with measurement
+	 */
+	public String getHeigthDesc() {
+		return formater.format(height) + linearMeasure.toString();
+	}
+
+	private double getLineWidth(String width) {
+		String floatValue = width.substring(0, width.length() - 2);
+		return Double.parseDouble(floatValue);
+	}
+
+	private StyleTypeDefinitions.SupportedLinearMeasure getLineMeasure(String width) {
+		for (SupportedLinearMeasure aIter : SupportedLinearMeasure.values()) {
+			if (width.endsWith(aIter.toString())) {
+				return aIter;
+			}
+		}
+		return null;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameStyleHandler.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameStyleHandler.java
new file mode 100644
index 0000000..36876fc
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/FrameStyleHandler.java
@@ -0,0 +1,258 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.style.Border;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.OdfDrawFill;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+
+/**
+ * This class provides functions to handle the style of a frame.
+ * 
+ * @since 0.5
+ */
+public class FrameStyleHandler extends DefaultStyleHandler {
+
+	private Frame mFrame;
+
+	public FrameStyleHandler(Frame frame) {
+		super(frame.getDrawFrameElement());
+		mFrame = frame;
+	}
+
+	/**
+	 * Set the border style of this cell. You can set the border style for a
+	 * single border or a border collection.
+	 * <p>
+	 * The second parameter <code>bordersType</code> describes which borders you
+	 * want to apply the style to, e.g. up border, bottom border, left border,
+	 * right border, diagonal lines or four borders.
+	 * 
+	 * @param border
+	 *            - the border style description
+	 * @param bordersType
+	 *            - the type of the borders
+	 */
+	public void setBorders(Border border, CellBordersType bordersType) {
+		getGraphicPropertiesForWrite().setBorders(bordersType, border);
+	}
+
+	/**
+	 * Set the style of stroke.
+	 * <p>
+	 * There are three types of stroke: none, solid and dash.
+	 * <p>
+	 * If the stroke is NONE, there is no stroke around the frame.
+	 * <p>
+	 * If the stroke is SOLID, there is solid line around the frame. color and
+	 * width need to be specified.
+	 * <p>
+	 * If the stroke is DASH, there is dash line around the frame. color, width
+	 * and the style name of dash line need to be specified.
+	 * 
+	 * @param stroke
+	 *            - the stroke type
+	 * @param color
+	 *            - the color of the stroke
+	 * @param widthDesc
+	 *            - the width description of the stroke, e.g. "0.01in"
+	 * @param dashStyleName
+	 *            - the dash style name
+	 * @see org.odftoolkit.simple.style.StyleTypeDefinitions.OdfDrawStroke
+	 */
+	public void setStroke(StyleTypeDefinitions.OdfDrawStroke stroke, Color color, String widthDesc, String dashStyleName) {
+		getGraphicPropertiesForWrite().setStroke(stroke, color, widthDesc, dashStyleName);
+	}
+
+	/**
+	 * Set the background color of this frame.
+	 * <p>
+	 * If the parameter is null, there will be no background color defined for
+	 * this frame. The old setting of background color will be removed.
+	 * 
+	 * @param color
+	 *            - the background color to be set
+	 */
+	public void setBackgroundColor(Color color) {
+		if (color == null)
+			getGraphicPropertiesForWrite().setFill(OdfDrawFill.NONE, null);
+		else
+			getGraphicPropertiesForWrite().setFill(OdfDrawFill.SOLID, color);
+
+	}
+
+	/**
+	 * Set whether the content of a frame is displayed in the background or
+	 * foreground. If it's displayed in the background, the content wouldn't be
+	 * selected or moved.
+	 * 
+	 * @param isBackgroundFrame
+	 *            If <code>true</code>, the frame is displayed in the
+	 *            background.
+	 * @since 0.5.5
+	 */
+	public void setBackgroundFrame(boolean isBackgroundFrame) {
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+		graphicPropertiesForWrite.setStyleRunThrough(isBackgroundFrame);
+	}
+	
+	/**
+	 * Set how a frame is bound to a text document. Default position relative and alignment will be set.
+	 * 
+	 * <p>If the document is not text document, nothing will happen.
+	 * @param achorType - the point at which a frame is bound to a text document
+	 */
+	public void setAchorType(StyleTypeDefinitions.AnchorType achorType)
+	{
+		if (!mDocument.getMediaTypeString().equals(Document.OdfMediaType.TEXT.getMediaTypeString()) &&
+				!mDocument.getMediaTypeString().equals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString()))
+			return;
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+
+		DrawFrameElement frameElement = (DrawFrameElement)mOdfElement;
+		frameElement.setTextAnchorTypeAttribute(achorType.toString());
+		
+		//set default relative
+		switch(achorType)
+		{
+		case AS_CHARACTER:
+			graphicPropertiesForWrite.setVerticalRelative(VerticalRelative.BASELINE);
+			graphicPropertiesForWrite.setVerticalPosition(FrameVerticalPosition.TOP);
+			break;
+		case TO_CHARACTER:
+			graphicPropertiesForWrite.setVerticalRelative(VerticalRelative.PARAGRAPH);
+			graphicPropertiesForWrite.setVerticalPosition(FrameVerticalPosition.TOP);
+			graphicPropertiesForWrite.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			graphicPropertiesForWrite.setHorizontalPosition(FrameHorizontalPosition.CENTER);
+			break;
+		case TO_PAGE:
+			graphicPropertiesForWrite.setVerticalRelative(VerticalRelative.PAGE);
+			graphicPropertiesForWrite.setVerticalPosition(FrameVerticalPosition.TOP);
+			graphicPropertiesForWrite.setHorizontalRelative(HorizontalRelative.PAGE);
+			graphicPropertiesForWrite.setHorizontalPosition(FrameHorizontalPosition.CENTER);
+			break;
+		case TO_PARAGRAPH:
+			graphicPropertiesForWrite.setVerticalRelative(VerticalRelative.PARAGRAPH);
+			graphicPropertiesForWrite.setVerticalPosition(FrameVerticalPosition.TOP);
+			graphicPropertiesForWrite.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			graphicPropertiesForWrite.setHorizontalPosition(FrameHorizontalPosition.CENTER);
+			break;
+		case TO_FRAME:
+			break;
+		}
+	}
+	
+	/**
+	 * Set the horizontal position
+	 * 
+	 * @param horizontalPos
+	 *            - the horizontal position
+	 */
+	public void setHorizontalPosition(FrameHorizontalPosition horizontalPos) {
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+		graphicPropertiesForWrite.setHorizontalPosition(horizontalPos);
+	}
+	
+	/**
+	 * Set the horizontal relative
+	 * 
+	 * @param relative
+	 *            - the horizontal relative
+	 */
+	public void setHorizontalRelative(HorizontalRelative relative)
+	{
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+		graphicPropertiesForWrite.setHorizontalRelative(relative);
+	}
+	
+	/**
+	 * Set the vertical relative
+	 * 
+	 * @param relative
+	 *            - the vertical relative
+	 */
+	public void setVerticalRelative(VerticalRelative relative)
+	{
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+		graphicPropertiesForWrite.setVerticalRelative(relative);
+	}
+
+	/**
+	 * Set the vertical position
+	 * 
+	 * @param verticalPos
+	 *            - the vertical position
+	 */
+	public void setVerticalPosition(FrameVerticalPosition verticalPos) {
+		GraphicProperties graphicPropertiesForWrite = getGraphicPropertiesForWrite();
+		graphicPropertiesForWrite.setVerticalPosition(verticalPos);
+	}
+
+	/**
+	 * Return the horizontal position
+	 * 
+	 * @return the horizontal position
+	 */
+	public FrameHorizontalPosition getHorizontalPosition() {
+		GraphicProperties graphicPropertiesForRead = getGraphicPropertiesForRead();
+		return graphicPropertiesForRead.getHorizontalPosition();
+	}
+
+	/**
+	 * Return the vertical position
+	 * 
+	 * @return the vertical position
+	 */
+	public FrameVerticalPosition getVerticalPosition() {
+		GraphicProperties graphicPropertiesForRead = getGraphicPropertiesForRead();
+		return graphicPropertiesForRead.getVerticalPosition();
+	}
+	
+	/**
+	 * Return the vertical relative
+	 * @return the vertical relative
+	 */
+	public VerticalRelative getVerticalRelative()
+	{
+		GraphicProperties graphicPropertiesForRead = getGraphicPropertiesForRead();
+		return graphicPropertiesForRead.getVerticalRelative();
+	}
+	
+	/**
+	 * Return the horizontal relative
+	 * @return the horizontal relative
+	 */
+	public HorizontalRelative getHorizontalRelative()
+	{
+		GraphicProperties graphicPropertiesForRead = getGraphicPropertiesForRead();
+		return graphicPropertiesForRead.getHorizontalRelative();
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Image.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Image.java
new file mode 100644
index 0000000..555f797
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Image.java
@@ -0,0 +1,548 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.awt.image.BufferedImage;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.imageio.ImageIO;
+
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.odfdom.type.AnyURI;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.text.AbstractParagraphContainer;
+import org.odftoolkit.simple.text.Paragraph;
+import org.w3c.dom.DOMException;
+
+/**
+ * This class provides method to add/remove/get images.
+ * 
+ * @since 0.5.5
+ */
+public class Image extends Component {
+
+	private static final String SLASH = "/";
+	DrawImageElement mImageElement;
+	Frame mFrame;
+	URI mImageURI = null;
+	DrawFrameElement mElement;
+	Document mOwnerDocument;
+	FrameStyleHandler mStyleHandler;
+
+	private Image(DrawImageElement drawElement) {
+		mOwnerDocument = (Document) ((OdfFileDom) drawElement.getOwnerDocument()).getDocument();
+		mElement = (DrawFrameElement) drawElement.getParentNode();
+		if (mElement == null) {
+			Logger.getLogger(Image.class.getName()).log(Level.WARNING,
+					"The image has no parent frame. A new frame will be created as its parent");
+			OdfFileDom ownerDom = (OdfFileDom) drawElement.getOwnerDocument();
+			mElement = ownerDom.newOdfElement(DrawFrameElement.class);
+			mElement.appendChild(drawElement);
+		}
+		mFrame = Frame.getInstanceof(mElement);
+		mImageElement = drawElement;
+	}
+
+	/**
+	 * Get a image instance by an instance of <code>DrawImageElement</code>.
+	 * 
+	 * @param imageElement
+	 *            - the instance of DrawImageElement
+	 * @return an instance of image
+	 */
+	public static Image getInstanceof(DrawImageElement imageElement) {
+		if (imageElement == null)
+			return null;
+
+		Image image = null;
+		image = (Image) Component.getComponentByElement(imageElement);
+		if (image != null)
+			return image;
+
+		Image myImage = new Image(imageElement);
+		Component.registerComponent(myImage, imageElement);
+		return myImage;
+
+	}
+	
+	/**
+	 * Add a hypertext reference to this image.
+	 * 
+	 * @param linkto
+	 *            the hyperlink
+	 * @since 0.6.5
+	 * 
+	 */
+	public void setHyperlink(URI linkto) {
+		mFrame.setHyperlink(linkto);
+	}	
+	
+	/**
+	 * Return the URI of hypertext reference if exists, or else, return null.
+	 * 
+	 * @return the URI of hyperlink if exists
+	 */
+	public URI getHyperlink() {
+		return mFrame.getHyperlink();
+	}
+	
+
+	/**
+	 * Get the owner document of this image
+	 * 
+	 * @return the document who owns this image
+	 */
+	public Document getOwnerDocument() {
+		return mOwnerDocument;
+	}
+
+	/**
+	 * Return style handler for this frame
+	 * 
+	 * @return the style handler
+	 */
+	public FrameStyleHandler getStyleHandler() {
+		if (mStyleHandler == null)
+			mStyleHandler = new FrameStyleHandler(mFrame);
+		return mStyleHandler;
+	}
+
+	/**
+	 * Return the instance of "draw:image" element
+	 * 
+	 * @return the instance of "draw:image" element
+	 */
+	public DrawImageElement getOdfElement() {
+		return mImageElement;
+	}
+
+	/**
+	 * Return the frame who contains this image.
+	 * 
+	 * @return - the frame who contains this image
+	 */
+	public Frame getFrame() {
+		return mFrame;
+	}
+
+	/**
+	 * Create an image and append it at the end of a container element.
+	 * 
+	 * @param container
+	 *            - the frame container element
+	 * @param uri
+	 *            - the URI of the image
+	 * @return the instance of Image
+	 */
+	public static Image newImage(FrameContainer container, URI uri) {
+		Image mImage;
+
+		try {
+			OdfElement parent = container.getFrameContainerElement();
+			OdfFileDom ownerDom = (OdfFileDom) parent.getOwnerDocument();
+			DrawFrameElement fElement = ownerDom.newOdfElement(DrawFrameElement.class);
+			parent.appendChild(fElement);
+			DrawImageElement imageElement = fElement.newDrawImageElement();
+			// set uri and copy resource
+			String packagePath = insertImageResourceIntoPackage((OdfSchemaDocument) ownerDom.getDocument(), uri);
+			packagePath = packagePath.replaceFirst(ownerDom.getDocument().getDocumentPath(), "");
+			URI newURI = configureInsertedImage((OdfSchemaDocument) ownerDom.getDocument(), imageElement, packagePath,
+					false);
+
+			// create image object
+			mImage = new Image(imageElement);
+			mImage.mImageURI = newURI;
+			Component.registerComponent(mImage, imageElement);
+
+			// set default alignment
+			if (container instanceof Paragraph) {
+				mImage.getStyleHandler().setAchorType(AnchorType.TO_PARAGRAPH);
+			}
+
+			return mImage;
+
+		} catch (Exception e) {
+			Logger.getLogger(Image.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Create an image and add it to a frame.
+	 * 
+	 * @param frame
+	 *            - the frame which contains this image
+	 * @param uri
+	 *            - the URI of the image
+	 * @return the instance of Image
+	 */
+	public static Image newImage(Frame frame, URI uri) {
+		Image mImage;
+
+		try {
+			DrawFrameElement fElement = (DrawFrameElement) frame.getDrawFrameElement();
+			OdfFileDom ownerDom = (OdfFileDom) fElement.getOwnerDocument();
+			DrawImageElement imageElement = fElement.newDrawImageElement();
+			// set uri and copy resource
+			String packagePath = insertImageResourceIntoPackage((OdfSchemaDocument) ownerDom.getDocument(), uri);
+			packagePath = packagePath.replaceFirst(ownerDom.getDocument().getDocumentPath(), "");
+			URI newURI = configureInsertedImage((OdfSchemaDocument) ownerDom.getDocument(), imageElement, packagePath,
+					true);
+
+			// create image object
+			mImage = new Image(imageElement);
+			mImage.mImageURI = newURI;
+			Component.registerComponent(mImage, imageElement);
+
+			// set default alignment
+			FrameContainer container = frame.mFrameContainer;
+			if (container instanceof Paragraph) {
+				mImage.getStyleHandler().setAchorType(AnchorType.TO_PARAGRAPH);
+			}
+
+			return mImage;
+
+		} catch (Exception e) {
+			Logger.getLogger(Image.class.getName()).severe(e.getMessage());
+		}
+		return null;
+	}
+
+	private static String insertImageResourceIntoPackage(OdfSchemaDocument mOdfSchemaDoc, URI imageUri)
+			throws Exception {
+		String imageRef = imageUri.toString();
+		String mediaType = OdfFileEntry.getMediaTypeString(imageRef);
+		String packagePath = getPackagePath(mOdfSchemaDoc, imageRef);
+		mOdfSchemaDoc.getPackage().insert(imageUri, packagePath, mediaType);
+		return packagePath;
+	}
+
+	/* Helper method */
+	public static String getPackagePath(OdfSchemaDocument mOdfSchemaDoc, String imageRef) {
+		if (imageRef.contains(SLASH)) {
+			imageRef = imageRef.substring(imageRef.lastIndexOf(SLASH) + 1, imageRef.length());
+		}
+		String packagePath = OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + imageRef;
+		return packagePath = mOdfSchemaDoc.getDocumentPath() + packagePath;
+	}
+
+	/* Helper method */
+	public static URI configureInsertedImage(OdfSchemaDocument mOdfSchemaDoc, DrawImageElement imageElement,
+			String packagePath, boolean isResetSize) throws Exception {
+		// Set path to image attribute
+		URI uri = new URI(AnyURI.encodePath(packagePath).toString());
+		imageElement.setXlinkHrefAttribute(AnyURI.decodePath(uri.toString()));
+		// Set mandatory attribute xlink:type
+		imageElement.setXlinkTypeAttribute("simple");
+		// A draw:image is always embedded in a draw:frame
+		InputStream is = mOdfSchemaDoc.getPackage().getInputStream(packagePath);
+		DrawFrameElement odfFrame = (DrawFrameElement) imageElement.getParentNode();
+		Frame aFrame = Frame.getInstanceof(odfFrame);
+		FrameRectangle oldRect = aFrame.getRectangle();
+		if (oldRect.getLinearMeasure() != StyleTypeDefinitions.SupportedLinearMeasure.CM)
+			oldRect.setLinearMeasure(StyleTypeDefinitions.SupportedLinearMeasure.CM);
+		if (odfFrame != null) {
+			BufferedImage image = ImageIO.read(is);
+			int height = image.getHeight(null);
+			int width = image.getWidth(null);
+			odfFrame.setSvgHeightAttribute(Length.mapToUnit(String.valueOf(height) + "px", Unit.CENTIMETER));
+			odfFrame.setSvgWidthAttribute(Length.mapToUnit(String.valueOf(width) + "px", Unit.CENTIMETER));
+			if (isResetSize) {
+				FrameRectangle newRect = aFrame.getRectangle();
+				newRect.setX(oldRect.getX()+(oldRect.getWidth()-newRect.getWidth())/2);
+				newRect.setY(oldRect.getY()+(oldRect.getHeight()-newRect.getHeight())/2);
+				aFrame.setRectangle(newRect);
+			}
+		}
+		return uri;
+	}
+
+	/**
+	 * Return an iterator of image.
+	 * 
+	 * @param container the frame container.
+	 * @return the image iterator.
+	 */
+	public static Iterator<Image> imageIterator(FrameContainer container) {
+		return new SimpleImageIterator(container);
+	}
+
+	/**
+	 * Remove the image from the document.
+	 * <p>
+	 * The resource is removed if it's only used by this object.
+	 * 
+	 * @return true if the image object is successfully removed; false if
+	 *         otherwise.
+	 */
+	public boolean remove() {
+		OdfElement containerElement = (OdfElement) mElement.getParentNode();
+		try {
+			mElement.removeChild(getOdfElement());
+			if (mElement.hasChildNodes() == false)
+				containerElement.removeChild(mElement);
+			mOwnerDocument.removeElementLinkedResource(getOdfElement());
+		} catch (DOMException exception) {
+			Logger.getLogger(AbstractParagraphContainer.class.getName()).log(Level.WARNING, exception.getMessage());
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Update the image file with another resource.
+	 * 
+	 * @param imageUri
+	 *            - the URI of the new image resource
+	 */
+	public void updateImage(URI imageUri) {
+		try {
+			// remove the old resource
+			String packagePath = mImageURI.toString();
+			mOwnerDocument.getPackage().remove(packagePath);
+			// insert the new resource
+			String imageRef = imageUri.toString();
+			String mediaType = OdfFileEntry.getMediaTypeString(imageRef);
+			mOwnerDocument.getPackage().insert(imageUri, packagePath, mediaType);
+		} catch (Exception e) {
+			Logger.getLogger(Image.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Get the image resource as an input stream.
+	 * 
+	 * @return - the input stream of the image resource
+	 */
+	public InputStream getImageInputStream() {
+		return mOwnerDocument.getPackage().getInputStream(getInternalPath());
+	}
+
+	/**
+	 * Get the internal path within the package of the image resource as a
+	 * string.
+	 * 
+	 * @return - the internal path of the image resource
+	 */
+	public String getInternalPath() {
+		try {
+			if (mImageURI == null)
+				mImageURI = new URI(mImageElement.getXlinkHrefAttribute());
+			return mImageURI.toString();
+		} catch (URISyntaxException e) {
+			Logger.getLogger(Image.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the media type of the image resource
+	 * 
+	 * @return - the media type of the image resource
+	 */
+	public String getMediaTypeString() {
+		return mOwnerDocument.getPackage().getMediaTypeString(getInternalPath());
+	}
+
+	private static class SimpleImageIterator implements Iterator<Image> {
+
+		private OdfElement containerElement;
+		private Image nextElement = null;
+		private Image tempElement = null;
+
+		private SimpleImageIterator(FrameContainer container) {
+			containerElement = container.getFrameContainerElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Image next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			containerElement.removeChild(nextElement.getOdfElement());
+		}
+
+		private Image findNext(Image thisImage) {
+			DrawImageElement nextFrame = null;
+			if (thisImage == null) {
+				nextFrame = OdfElement.findFirstChildNode(DrawImageElement.class, containerElement);
+			} else {
+				nextFrame = OdfElement.findNextChildNode(DrawImageElement.class, thisImage.getOdfElement());
+			}
+
+			if (nextFrame != null) {
+				return Image.getInstanceof(nextFrame);
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * Set the name of this image.
+	 * 
+	 * @param name
+	 *            - the name of the image
+	 */
+	public void setName(String name) {
+		mFrame.setName(name);
+	}
+
+	/**
+	 * Get the name of this image.
+	 * 
+	 * @return the name of the image
+	 */
+	public String getName() {
+		return mFrame.getName();
+	}
+
+	/**
+	 * Set the rectangle used by this image
+	 * 
+	 * @param rectangle
+	 *            - the rectangle used by this image
+	 */
+	public void setRectangle(FrameRectangle rectangle) {
+		mFrame.setRectangle(rectangle);
+	}
+
+	/**
+	 * Return the rectangle used by this image
+	 * 
+	 * @return - the rectangle
+	 */
+	public FrameRectangle getRectangle() {
+		return mFrame.getRectangle();
+	}
+
+	/**
+	 * Set the title of this image
+	 * 
+	 * @param title
+	 *            - the title of this image
+	 */
+	public void setTitle(String title) {
+		mFrame.setTitle(title);
+	}
+
+	/**
+	 * Get the title of this image
+	 * 
+	 * @return - the title of this image
+	 */
+	public String getTitle() {
+		return mFrame.getTitle();
+	}
+
+	/**
+	 * Get the description of this image
+	 * 
+	 * @return - the description of this image
+	 */
+	public String getDesciption() {
+		return mFrame.getDesciption();
+	}
+
+	/**
+	 * Set the description of this image.
+	 * 
+	 * @param description
+	 *            - the description of this image
+	 */
+	public void setDescription(String description) {
+		mFrame.setDescription(description);
+	}
+
+	/**
+	 * Set the horizontal position
+	 * 
+	 * @param horizontalPos
+	 *            - the horizontal position
+	 */
+	public void setHorizontalPosition(FrameHorizontalPosition horizontalPos) {
+		getStyleHandler().setHorizontalPosition(horizontalPos);
+	}
+
+	/**
+	 * Set the vertical position
+	 * 
+	 * @param verticalPos
+	 *            - the vertical position
+	 */
+	public void setVerticalPosition(FrameVerticalPosition verticalPos) {
+		getStyleHandler().setVerticalPosition(verticalPos);
+	}
+
+	/**
+	 * Return the horizontal position
+	 * 
+	 * @return the horizontal position
+	 */
+	public FrameHorizontalPosition getHorizontalPosition() {
+		return getStyleHandler().getHorizontalPosition();
+	}
+
+	/**
+	 * Return the vertical position
+	 * 
+	 * @return the vertical position
+	 */
+	public FrameVerticalPosition getVerticalPosition() {
+		return getStyleHandler().getVerticalPosition();
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Textbox.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Textbox.java
new file mode 100644
index 0000000..b7ac880
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/Textbox.java
@@ -0,0 +1,266 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawTextBoxElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.OdfDrawStroke;
+import org.odftoolkit.simple.text.AbstractParagraphContainer;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.ParagraphContainer;
+import org.odftoolkit.simple.text.list.AbstractListContainer;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class provides method to set the content, properties and style of text
+ * box.
+ * 
+ * @since 0.5
+ */
+public class Textbox extends Frame implements ListContainer, ParagraphContainer {
+
+	/*
+	 * The <draw:frame> element is usable within the following elements:
+	 * Supported: <draw:page> 10.2.4, <draw:text-box> 10.4.3, <office:text> 3.4,
+	 * <presentation:notes> 16.17, <style:handout-master> 10.2.1,
+	 * <style:master-page> 16.9, <table:covered-table-cell> 9.1.5,
+	 * <table:table-cell> 9.1.4, <text:p> 5.1.3, <text:section> 5.4 Not
+	 * supported: <draw:a> 10.4.12, <draw:g> 10.3.15, <office:image> 3.9,
+	 * <table:shapes> 9.2.8, <text:a> 6.1.8, <text:deletion> 5.5.4, <text:h>
+	 * 5.1.2, <text:index-body> 8.2.2, <text:index-title> 8.2.3, <text:meta>
+	 * 6.1.9, <text:meta-field> 7.5.19, <text:note-body> 6.3.4, <text:ruby-base>
+	 * 6.4.2,and <text:span> 6.1.7.
+	 * 
+	 * The <draw:text-box> element is usable within the following element:
+	 * <draw:frame> 10.4.2.
+	 * 
+	 * <draw:text-box> element has following children: <dr3d:scene> 10.5.2,
+	 * <draw:a> 10.4.12, <draw:caption> 10.3.11, <draw:circle> 10.3.8,
+	 * <draw:connector> 10.3.10, <draw:control> 10.3.13, <draw:custom-shape>
+	 * 10.6.1, <draw:ellipse> 10.3.9, <draw:frame> 10.4.2, <draw:g> 10.3.15,
+	 * <draw:line> 10.3.3, <draw:measure> 10.3.12, <draw:page-thumbnail>
+	 * 10.3.14, <draw:path> 10.3.7, <draw:polygon> 10.3.5, <draw:polyline>
+	 * 10.3.4, <draw:rect> 10.3.2, <draw:regular-polygon> 10.3.6, <table:table>
+	 * 9.1.2, <text:alphabetical-index> 8.8, <text:bibliography> 8.9,
+	 * <text:change> 5.5.7.4, <text:change-end> 5.5.7.3, <text:change-start>
+	 * 5.5.7.2, <text:h> 5.1.2, <text:illustration-index> 8.4, <text:list>
+	 * 5.3.1, <text:numbered-paragraph> 5.3.6, <text:object-index> 8.6, <text:p>
+	 * 5.1.3, <text:section> 5.4, <text:soft-page-break> 5.6, <text:table-index>
+	 * 8.5, <text:table-of-content> 8.3 and <text:user-index> 8.7.
+	 */
+	DrawTextBoxElement mTextboxElement;
+	private ParagraphContainerImpl paragraphContainerImpl;
+	private ListContainerImpl listContainerImpl;
+
+	private Textbox(DrawTextBoxElement textbox) {
+		super((DrawFrameElement) textbox.getParentNode());
+		mTextboxElement = textbox;
+
+	}
+
+	/**
+	 * Get a text box instance by an instance of <code>DrawTextBoxElement</code>
+	 * .
+	 * 
+	 * @param element
+	 *            - the instance of DrawTextBoxElement
+	 * @return an instance of text box
+	 */
+	public static Textbox getInstanceof(DrawTextBoxElement element) {
+		if (element == null)
+			return null;
+
+		Textbox textbox = null;
+		textbox = (Textbox) Component.getComponentByElement(element);
+		if (textbox != null)
+			return textbox;
+
+		textbox = new Textbox(element);
+		Component.registerComponent(textbox, element);
+		return textbox;
+	}
+
+	/**
+	 * Create an instance of frame
+	 * <p>
+	 * The frame will be added at the end of this container.
+	 * 
+	 * @param container
+	 *            - the frame container that contains this frame.
+	 */
+	public static Textbox newTextbox(TextboxContainer container) {
+		Textbox textbox = null;
+		OdfElement parent = container.getFrameContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parent.getOwnerDocument();
+		DrawFrameElement fElement = ownerDom.newOdfElement(DrawFrameElement.class);
+		parent.appendChild(fElement);
+		DrawTextBoxElement boxElement = fElement.newDrawTextBoxElement();
+		textbox = new Textbox(boxElement);
+		textbox.mFrameContainer = container;
+		Component.registerComponent(textbox, boxElement);
+
+		// set text box default style
+		textbox.getStyleHandler().setBorders(null, CellBordersType.NONE);
+		textbox.getStyleHandler().setStroke(OdfDrawStroke.NONE, null, null, null);
+		textbox.getStyleHandler().setBackgroundColor(null);
+		// set style:run-through="foreground"
+		textbox.getStyleHandler().setBackgroundFrame(false);
+		return textbox;
+	}
+
+	/**
+	 * Set the text content of this text box.
+	 * <p>
+	 * This method will clear the content at first, and then create a paragraph
+	 * with the given content.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @see #clearContent()
+	 * @see #addParagraph(String textContent)
+	 */
+	public void setTextContent(String content) {
+		clearContent();
+		addParagraph(content);
+	}
+
+	/**
+	 * Remove all the content of this text box.
+	 */
+	public void clearContent() {
+		NodeList nodeList = mTextboxElement.getChildNodes();
+		int i;
+		for (i = 0; i < nodeList.getLength(); i++) {
+			Node node = nodeList.item(i);
+			if (node.getNodeType() == Node.ELEMENT_NODE || node.getNodeType() == node.TEXT_NODE)
+				mTextboxElement.removeChild(nodeList.item(i));
+		}
+	}
+
+	/**
+	 * Get the text content of this text box.
+	 * 
+	 * @return - the text content
+	 * @see TextExtractor#getText(OdfElement)
+	 */
+	public String getTextContent() {
+		return TextExtractor.getText(mTextboxElement);
+	}
+
+	/**
+	 * Get the instance of <code>DrawTextBoxElement</code> which represents this
+	 * frame.
+	 * 
+	 * @return the instance of <code>DrawTextBoxElement</code>
+	 */
+	@Override
+	public DrawTextBoxElement getOdfElement() {
+		return mTextboxElement;
+	}
+
+	// ***************List support*************************//
+
+	public List addList() {
+		return getListContainerImpl().addList();
+	}
+
+	public List addList(ListDecorator decorator) {
+		return getListContainerImpl().addList(decorator);
+	}
+
+	public void clearList() {
+		getListContainerImpl().clearList();
+	}
+
+	public OdfElement getListContainerElement() {
+		return getListContainerImpl().getListContainerElement();
+	}
+
+	public Iterator<List> getListIterator() {
+		return getListContainerImpl().getListIterator();
+	}
+
+	public boolean removeList(List list) {
+		return getListContainerImpl().removeList(list);
+	}
+
+	private ListContainerImpl getListContainerImpl() {
+		if (listContainerImpl == null) {
+			listContainerImpl = new ListContainerImpl();
+		}
+		return listContainerImpl;
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+
+		public OdfElement getListContainerElement() {
+			return mTextboxElement;
+		}
+	}
+
+	// ****************Paragraph support******************//
+
+	public Paragraph addParagraph(String textContent) {
+		return getParagraphContainerImpl().addParagraph(textContent);
+	}
+
+	public OdfElement getParagraphContainerElement() {
+		return getParagraphContainerImpl().getParagraphContainerElement();
+	}
+
+	public boolean removeParagraph(Paragraph para) {
+		return getParagraphContainerImpl().removeParagraph(para);
+	}
+
+	private class ParagraphContainerImpl extends AbstractParagraphContainer {
+		public OdfElement getParagraphContainerElement() {
+			return mTextboxElement;
+		}
+	}
+
+	private ParagraphContainerImpl getParagraphContainerImpl() {
+		if (paragraphContainerImpl == null)
+			paragraphContainerImpl = new ParagraphContainerImpl();
+		return paragraphContainerImpl;
+	}
+
+	public Paragraph getParagraphByIndex(int index, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByIndex(index, isEmptyParagraphSkipped);
+	}
+
+	public Paragraph getParagraphByReverseIndex(int reverseIndex, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByReverseIndex(reverseIndex, isEmptyParagraphSkipped);
+	}
+
+	public Iterator<Paragraph> getParagraphIterator() {
+		return getParagraphContainerImpl().getParagraphIterator();
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/draw/TextboxContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/TextboxContainer.java
new file mode 100644
index 0000000..c857e26
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/draw/TextboxContainer.java
@@ -0,0 +1,89 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.odftoolkit.simple.PresentationDocument;
+
+/**
+ * TextboxContainer is a container which maintains TextBox(s) as element(s).
+ * TextBox(s) can be added, removed and iterated in this container.
+ * 
+ * @since 0.5
+ */
+public interface TextboxContainer extends FrameContainer {
+
+	/**
+	 * Add a text box
+	 * 
+	 * @return the object of text box
+	 */
+	public Textbox addTextbox();
+
+	/**
+	 * Add a text box with a specific size at a specific position
+	 * 
+	 * @param position
+	 *            - the rectangle (position and size) of this text box
+	 * @return the object of text box
+	 */
+	public Textbox addTextbox(FrameRectangle position);
+
+	/**
+	 * Remove the text box
+	 * 
+	 * @param box
+	 *            - the instance of text box
+	 * @return true if success, false if fails
+	 */
+	public boolean removeTextbox(Textbox box);
+
+	/**
+	 * Return an Iterator of the text objects in this container.
+	 * 
+	 * @return an Iterator of the text objects in this container
+	 */
+	public Iterator<Textbox> getTextboxIterator();
+
+	/**
+	 * Return a text box whose name is a given value.
+	 * 
+	 * @param name
+	 *            - the name of the text box
+	 * @return a text box whose name is a given value
+	 */
+	public Textbox getTextboxByName(String name);
+
+	/**
+	 * This method is only useful in presentation slide.
+	 * <p>
+	 * This method will return a list of text boxs by the usage in presentation
+	 * slides.
+	 * 
+	 * @param usage
+	 *            - the usage description
+	 * @return a list of text box Null will be returned if the owner document is
+	 *         not a presentation
+	 */
+	public List<Textbox> getTextboxByUsage(PresentationDocument.PresentationClass usage);
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/AbstractFormContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/AbstractFormContainer.java
new file mode 100644
index 0000000..9a5b82a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/AbstractFormContainer.java
@@ -0,0 +1,186 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.w3c.dom.DOMException;
+
+/**
+ * AbstractFormContainer is an abstract implementation of the FormContainer
+ * interface, with a default implementation for every method defined in
+ * FormContainer, except getFormContainerElement(). A subclass must implement
+ * the abstract method getFormContainerElement().
+ * 
+ * @since 0.8
+ */
+public abstract class AbstractFormContainer implements FormContainer {
+
+	private FormProvider provider = null;
+
+
+	public abstract OfficeFormsElement getFormContainerElement();
+
+
+	public Form createForm(String name) {
+		return getProvider().createForm(name, getFormContainerElement());
+	}
+
+
+	public boolean removeForm(Form form) {
+		if (form == null)
+			return true;
+		OdfElement containerElement = getFormContainerElement();
+		FormFormElement formElement = form.getOdfElement();
+		try {
+			containerElement.removeChild(formElement);
+		} catch (DOMException exception) {
+			Logger.getLogger(AbstractFormContainer.class.getName()).log(
+					Level.WARNING, exception.getMessage());
+			return false;
+		}
+		return true;
+	}
+
+
+	public Form getFormByName(String name) {
+		if (name == null)
+			return null;
+
+		OdfElement container = getFormContainerElement();
+		FormFormElement element = OdfElement.findFirstChildNode(
+				FormFormElement.class, container);
+		while (element != null) {
+			if (name.equals(element.getFormNameAttribute())) {
+				Form form = getProvider().getInstanceOf(element);
+				return form;
+			}
+			element = OdfElement.findNextChildNode(FormFormElement.class,
+					element);
+		}
+		return null;
+	}
+
+
+	public Iterator<Form> getFormIterator() {
+		return new SimpleFormIterator(this);
+	}
+
+	private class SimpleFormIterator implements Iterator<Form> {
+
+		private OdfElement containerElement;
+		private Form nextElement = null;
+		private Form tempElement = null;
+
+		private SimpleFormIterator(FormContainer container) {
+			containerElement = container.getFormContainerElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Form next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			containerElement.removeChild(nextElement.getOdfElement());
+		}
+
+		private Form findNext(Form thisForm) {
+			FormFormElement nextForm = null;
+			if (thisForm == null) {
+				nextForm = OdfElement.findFirstChildNode(FormFormElement.class,
+						containerElement);
+			} else {
+				nextForm = OdfElement.findNextChildNode(FormFormElement.class,
+						thisForm.getOdfElement());
+			}
+
+			if (nextForm != null) {
+				return getProvider().getInstanceOf(nextForm);
+			}
+			return null;
+		}
+	}
+
+
+	public boolean getApplyDesignMode() {
+		return getFormContainerElement().getFormApplyDesignModeAttribute();
+	}
+
+
+	public boolean getAutomaticFocus() {
+		return getFormContainerElement().getFormAutomaticFocusAttribute();
+	}
+
+
+	public void setApplyDesignMode(boolean isDesignMode) {
+		getFormContainerElement().setFormApplyDesignModeAttribute(isDesignMode);
+	}
+
+
+	public void setAutomaticFocus(boolean isAutoFocus) {
+		getFormContainerElement().setFormAutomaticFocusAttribute(isAutoFocus);
+	}
+
+	/**
+	 * Set the form provider of this container.
+	 * 
+	 * @param provider
+	 *            - which is used to instantiate a form
+	 */
+	public void setProvider(FormProvider provider) {
+		this.provider = provider;
+	}
+
+	/**
+	 * Get the form provider of this container.
+	 * 
+	 * @return provider - a default provider followed by OO definition will be
+	 *         created if users don't appointed one.
+	 */
+	public FormProvider getProvider() {
+		if (provider == null)
+			provider = new OOFormProvider();
+		return provider;
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/Button.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Button.java
new file mode 100644
index 0000000..3ab11d3
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Button.java
@@ -0,0 +1,194 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormButtonElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+
+/**
+ * This class represents the form control of Button, provides methods to get/set
+ * the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class Button extends FormControl {
+
+	Button(FormButtonElement element) {
+		mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of button by an instance of FormButtonElement, while
+	 * searching the document content to make a bind with the DrawControl which
+	 * already reference to this button.
+	 * 
+	 * @param element
+	 *            - an instance of FormButtonElement
+	 * @return an instance of button
+	 */
+	public static Button getInstanceOf(FormButtonElement element) {
+		Button btn = new Button(element);
+		try {
+			btn.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(Button.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this button.");
+		}
+		return btn;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormButtonElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormButtonElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormButtonElement) mElement).setFormIdAttribute(id);
+
+	}
+
+	@Override
+	public String getId() {
+		return ((FormButtonElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public String getName() {
+		return ((FormButtonElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormButtonElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Set the label content of this button
+	 * 
+	 * @param label
+	 *            - the label
+	 */
+	public void setLabel(String label) {
+		((FormButtonElement) mElement).setFormLabelAttribute(label);
+	}
+
+	/**
+	 * Get the label content of this button
+	 * 
+	 * @return the label
+	 */
+	public String getLabel() {
+		return ((FormButtonElement) mElement).getFormLabelAttribute();
+	}
+
+	/**
+	 * Set the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @param value
+	 *            - the default value
+	 */
+	public void setValue(String value) {
+		((FormButtonElement) mElement).setFormValueAttribute(value);
+
+	}
+
+	/**
+	 * Get a simple iterator for buttons.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the buttons
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleButtonIterator(container);
+	}
+
+	private static class SimpleButtonIterator implements Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private Button nextElement = null;
+		private Button tempElement = null;
+
+		private SimpleButtonIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Button next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+		}
+
+		private Button findNext(Button thisButton) {
+			FormButtonElement nextForm = null;
+			if (thisButton == null) {
+				nextForm = OdfElement.findFirstChildNode(
+						FormButtonElement.class, containerElement);
+			} else {
+				nextForm = OdfElement.findNextChildNode(
+						FormButtonElement.class, thisButton.getOdfElement());
+			}
+
+			if (nextForm != null) {
+				return Button.getInstanceOf(nextForm);
+			}
+			return null;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/CheckBox.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/CheckBox.java
new file mode 100644
index 0000000..cadfcda
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/CheckBox.java
@@ -0,0 +1,254 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormCheckboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormCheckboxState;
+
+/**
+ * This class represents the form control of Check Box, provides methods to
+ * get/set the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class CheckBox extends FormControl {
+
+	CheckBox(FormCheckboxElement element) {
+		mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of check box by an instance of FormCheckboxElement, while
+	 * searching the document content to make a bind with the DrawControl which
+	 * already reference to this check box.
+	 * 
+	 * @param element
+	 *            - an instance of FormCheckboxElement
+	 * @return an instance of check box
+	 */
+	public static CheckBox getInstanceOf(FormCheckboxElement element) {
+		CheckBox checkbox = new CheckBox(element);
+		try {
+			checkbox.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(CheckBox.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this check box.");
+		}
+		return checkbox;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormCheckboxElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	@Override
+	public String getId() {
+		return ((FormCheckboxElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormCheckboxElement) mElement).setFormIdAttribute(id);
+	}
+
+	@Override
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormCheckboxElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	/**
+	 * Set the label content of this check box
+	 * 
+	 * @param label
+	 *            - the label of this check box
+	 */
+	public void setLabel(String label) {
+		((FormCheckboxElement) mElement).setFormLabelAttribute(label);
+	}
+
+	/**
+	 * Get the label content of this check box
+	 * 
+	 * @param label
+	 *            - the label of this check box
+	 */
+	public String getLabel() {
+		return ((FormCheckboxElement) mElement).getFormLabelAttribute();
+	}
+
+	@Override
+	public String getName() {
+		return ((FormCheckboxElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormCheckboxElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Set the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @param value
+	 *            - the default value
+	 */
+	public void setValue(String value) {
+		((FormCheckboxElement) mElement).setFormValueAttribute(value);
+
+	}
+
+	/**
+	 * Get the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @return the default value
+	 */
+	public String getValue() {
+		return ((FormCheckboxElement) mElement).getFormValueAttribute();
+
+	}
+
+	/**
+	 * Set the default state of this check box
+	 * 
+	 * @param state
+	 *            - default state of this check box
+	 */
+	public void setDefaultState(FormCheckboxState state) {
+		((FormCheckboxElement) mElement)
+				.setFormStateAttribute(state.toString());
+	}
+
+	/**
+	 * Get the default state of this check box
+	 * 
+	 * @return default state of this check box
+	 */
+	public FormCheckboxState getDefaultState() {
+		String value = ((FormCheckboxElement) mElement).getFormStateAttribute();
+		return FormCheckboxState.enumValueOf(value);
+	}
+
+	/**
+	 * Set current state of this check box
+	 * 
+	 * @param state
+	 *            - current state of this check box
+	 */
+	public void setCurrentState(FormCheckboxState state) {
+		((FormCheckboxElement) mElement).setFormCurrentStateAttribute(state
+				.toString());
+	}
+
+	/**
+	 * Get current state of this check box
+	 * 
+	 * @return current state of this check box
+	 */
+	public FormCheckboxState getCurrentState() {
+		String value = ((FormCheckboxElement) mElement)
+				.getFormCurrentStateAttribute();
+		return FormCheckboxState.enumValueOf(value);
+	}
+
+	/**
+	 * Get a simple iterator for check boxes.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the check boxes
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleCheckBoxIterator(container);
+	}
+
+	private static class SimpleCheckBoxIterator implements
+			Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private CheckBox nextElement = null;
+		private CheckBox tempElement = null;
+
+		private SimpleCheckBoxIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public CheckBox next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+
+		}
+
+		private CheckBox findNext(CheckBox thisCheckBox) {
+			FormCheckboxElement nextCheckBox = null;
+			if (thisCheckBox == null) {
+				nextCheckBox = OdfElement.findFirstChildNode(
+						FormCheckboxElement.class, containerElement);
+			} else {
+				nextCheckBox = OdfElement
+						.findNextChildNode(FormCheckboxElement.class,
+								thisCheckBox.getOdfElement());
+			}
+
+			if (nextCheckBox != null) {
+				return CheckBox.getInstanceOf(nextCheckBox);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/ComboBox.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/ComboBox.java
new file mode 100644
index 0000000..563e8d2
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/ComboBox.java
@@ -0,0 +1,343 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormComboboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormItemElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormListSourceType;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents the form control of Combo Box, provides methods to
+ * get/set the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class ComboBox extends FormControl {
+
+	private ArrayList<String> entries;
+
+	ComboBox(FormComboboxElement element) {
+		this.mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of combo box by an instance of FormComboboxElement, while
+	 * searching the document content to make a bind with the DrawControl which
+	 * already reference to this check box.
+	 * 
+	 * @param element
+	 *            - an instance of FormComboboxElement
+	 * @return an instance of combo box
+	 */
+	public static ComboBox getInstanceOf(FormComboboxElement element) {
+		ComboBox combo = new ComboBox(element);
+		try {
+			combo.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(ComboBox.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this combo box.");
+		}
+		return combo;
+	}
+
+	@Override
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormComboboxElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormComboboxElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	@Override
+	public String getId() {
+		return ((FormComboboxElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormComboboxElement) mElement).setFormIdAttribute(id);
+	}
+
+	@Override
+	public String getName() {
+		return ((FormComboboxElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormComboboxElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Set the visibility of the drop-down list
+	 * 
+	 * @param isDropDown
+	 *            - specify if the drop-down list is visible
+	 */
+	public void setFormDropdown(boolean isDropDown) {
+		((FormComboboxElement) mElement).setFormDropdownAttribute(isDropDown);
+	}
+
+	/**
+	 * Get the visibility of the drop-down list
+	 * 
+	 * @return true means the drop-down list is visible; false means invisible
+	 */
+	public boolean getFormDropdown() {
+		return ((FormComboboxElement) mElement).getFormDropdownAttribute();
+	}
+
+	/**
+	 * Add a list item to this combo box.
+	 * 
+	 * @param item
+	 *            - a list item
+	 */
+	public void addItem(String item) {
+		if (item == null)
+			return;
+		if (entries == null)
+			entries = new ArrayList<String>();
+		((FormComboboxElement) mElement).newFormItemElement()
+				.setFormLabelAttribute(item);
+		entries.add(item);
+	}
+
+	/**
+	 * Add a group of list items to this combo box
+	 * 
+	 * @param items
+	 *            -a group of list items
+	 */
+	public void addItems(String[] items) {
+		if (items == null || items.length == 0)
+			return;
+		for (int i = 0; i < items.length; i++) {
+			addItem(items[i]);
+		}
+	}
+
+	/**
+	 * Get the list entries if they are initiated through a list of string.
+	 * 
+	 * @return the list entries
+	 */
+	public ArrayList<String> getEntries() {
+		if (entries == null || entries.size() == 0) {
+			NodeList items = mElement.getElementsByTagName("form:item");
+			if (items != null && items.getLength() > 0) {
+				for (int i = 0; i < items.getLength(); i++) {
+					if (entries == null)
+						entries = new ArrayList<String>();
+					entries.add(((FormItemElement) items.item(i))
+							.getFormLabelAttribute());
+				}
+				return entries;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Set the source type of the data list.
+	 * 
+	 * @param type
+	 *            - the source type of this list
+	 */
+	public void setListSourceType(FormListSourceType type) {
+		((FormComboboxElement) mElement).setFormListSourceTypeAttribute(type
+				.toString());
+	}
+
+	/**
+	 * Get the source type of the data list.
+	 * 
+	 * @return the source type of this list
+	 */
+	public FormListSourceType getListSourceType() {
+		String value = ((FormComboboxElement) mElement)
+				.getFormListSourceTypeAttribute();
+		return FormListSourceType.enumValueOf(value);
+	}
+
+	/**
+	 * Set the source of this data list.
+	 * 
+	 * @param listSource
+	 *            - the source of this data list.
+	 */
+	public void setListSource(String listSource) {
+		((FormComboboxElement) mElement).setFormListSourceAttribute(listSource);
+	}
+
+	/**
+	 * Get the source of this data list.
+	 * 
+	 * @return the source of this data list.
+	 */
+	public String getListSource() {
+		return ((FormComboboxElement) mElement).getFormListSourceAttribute();
+	}
+
+	/**
+	 * Set the data field referenced by this combo box
+	 * 
+	 * @param dataField
+	 *            - the data field referenced by this combo box
+	 */
+	public void setDataField(String dataField) {
+		((FormComboboxElement) mElement).setFormDataFieldAttribute(dataField);
+	}
+
+	/**
+	 * Get the data field referenced by this combo box
+	 * 
+	 * @return the data field referenced by this combo box
+	 */
+	public String getDataField() {
+		return ((FormComboboxElement) mElement).getFormDataFieldAttribute();
+	}
+
+	/**
+	 * Set the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @param value
+	 *            - default value
+	 */
+	public void setValue(String defaultValue) {
+		((FormComboboxElement) mElement).setFormValueAttribute(defaultValue);
+	}
+
+	/**
+	 * Get the default value of this control.
+	 * 
+	 * @return default value
+	 */
+	public String getValue() {
+		return ((FormComboboxElement) mElement).getFormValueAttribute();
+	}
+
+	/**
+	 * Set the current value of this control, it override the default value.
+	 * 
+	 * @param currentValue
+	 *            - current value
+	 */
+	public void setCurrentValue(String currentValue) {
+		((FormComboboxElement) mElement)
+				.setFormCurrentValueAttribute(currentValue);
+	}
+
+	/**
+	 * Get the current value of this control, it override the default value.
+	 * 
+	 * @return current value
+	 */
+	public String getCurrentValue() {
+		return ((FormComboboxElement) mElement).getFormCurrentValueAttribute();
+	}
+
+	/**
+	 * Get a simple iterator for combo boxes.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the combo boxes s
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleComboBoxIterator(container);
+	}
+
+	private static class SimpleComboBoxIterator implements
+			Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private ComboBox nextElement = null;
+		private ComboBox tempElement = null;
+
+		private SimpleComboBoxIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public ComboBox next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+
+		}
+
+		private ComboBox findNext(ComboBox thisComboBox) {
+			FormComboboxElement nextComboBox = null;
+			if (thisComboBox == null) {
+				nextComboBox = OdfElement.findFirstChildNode(
+						FormComboboxElement.class, containerElement);
+			} else {
+				nextComboBox = OdfElement
+						.findNextChildNode(FormComboboxElement.class,
+								thisComboBox.getOdfElement());
+			}
+
+			if (nextComboBox != null) {
+				return ComboBox.getInstanceOf(nextComboBox);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/CurrencyField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/CurrencyField.java
new file mode 100644
index 0000000..a481b6c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/CurrencyField.java
@@ -0,0 +1,77 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+
+public class CurrencyField extends Field {
+
+	CurrencyField(FormFormattedTextElement element) {
+		super(element);
+	}
+
+
+	/**
+	 * Get an instance of currency field by an instance of FormFormattedTextElement,
+	 * while searching the document content to make a bind with the DrawControl
+	 * which already reference to this currency field.
+	 * 
+	 * @param element
+	 *            - an instance of FormFormattedTextElement
+	 * @return an instance of currency field
+	 */
+	public static CurrencyField getInstanceOf(FormFormattedTextElement element) {
+		CurrencyField field = new CurrencyField(element);
+		try {
+			field.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(CurrencyField.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this field.");
+		}
+		return field;
+	}
+	
+	public void setCurrencySymbol(String symbol) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_CURRENCYSYMBOL,
+				"string", symbol, null, null, null, null, null);
+	}
+
+	public void setDecimalAccuracy(double value) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_DECIMALACCURACY,
+				"float", null, null, null, null, value, null);
+	}
+
+	public void setStepValue(double value) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_VALUESTEP,
+				"float", null, null, null, null, value, null);
+	}
+
+	public void setCurrencySymbolVisible(boolean visible) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_PREPENDCURRENCYSYMBOL,
+				"boolean", null, visible, null, null, null, null);
+
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/DateField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/DateField.java
new file mode 100644
index 0000000..05b9b11
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/DateField.java
@@ -0,0 +1,94 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute.Value;
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+
+/**
+ * This class represents a date field of form.
+ * 
+ */
+public class DateField extends Field {
+
+	DateField(FormFormattedTextElement element) {
+		super(element);
+	}
+
+	/**
+	 * Get an instance of date field by an instance of FormFormattedTextElement,
+	 * while searching the document content to make a bind with the DrawControl
+	 * which already reference to this date field.
+	 * 
+	 * @param element
+	 *            - an instance of FormFormattedTextElement
+	 * @return an instance of date field
+	 */
+	public static DateField getInstanceOf(FormFormattedTextElement element) {
+		DateField field = new DateField(element);
+		try {
+			field.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(DateField.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this field.");
+		}
+		return field;
+	}
+
+	/**
+	 * Set the visibility of the drop-down button.
+	 * 
+	 * @param isVisible
+	 *            - the visibility of drop-down button.
+	 */
+	public void setDropDownVisible(boolean isVisible) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_DROPDOWN,
+				"boolean", null, isVisible, null, null, null, null);
+	}
+
+	/**
+	 * Format the date value according to the appointed format and locale.
+	 * 
+	 * @param formatStr
+	 *            - format code
+	 * @param locale
+	 *            - locale information
+	 */
+	public void formatDate(String formatStr, Locale locale) {
+		this.setFormatString(formatStr, Value.DATE, locale);
+	}
+
+	/**
+	 * Get the format code which is used to format the display value
+	 * 
+	 * @return the format code
+	 */
+	public String getDateFormat() {
+		return this.getFormatString(Value.DATE);
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/Field.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Field.java
new file mode 100644
index 0000000..0b81a03
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Field.java
@@ -0,0 +1,456 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.Document;
+
+/**
+ * This class represents the form control of Field, provides methods to get/set
+ * the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class Field extends FormControl {
+
+	Field(FormFormattedTextElement element) {
+		mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of field by an instance of FormFormattedTextElement,
+	 * while searching the document content to make a bind with the DrawControl
+	 * which already reference to this field.
+	 * 
+	 * @param element
+	 *            - an instance of FormFormattedTextElement
+	 * @return an instance of field
+	 */
+	public static Field getInstanceOf(FormFormattedTextElement element) {
+		Field field = null;
+		if (element.getFormControlImplementationAttribute().equals(
+				OOFormProvider.OO_CONTROL_IMPLEMENTATION_DATEFIELD)) {
+			return DateField.getInstanceOf(element);
+		} else if (element.getFormControlImplementationAttribute().equals(
+				OOFormProvider.OO_CONTROL_IMPLEMENTATION_TIMEFIELD)) {
+			return TimeField.getInstanceOf(element);
+		} else if (element.getFormControlImplementationAttribute().equals(
+				OOFormProvider.OO_CONTROL_IMPLEMENTATION_NUMERICFIELD)) {
+			return NumericField.getInstanceOf(element);
+		} else if (element.getFormControlImplementationAttribute().equals(
+				OOFormProvider.OO_CONTROL_IMPLEMENTATION_PATTERNFIELD)) {
+			return PatternField.getInstanceOf(element);
+		} else if (element.getFormControlImplementationAttribute().equals(
+				OOFormProvider.OO_CONTROL_IMPLEMENTATION_CURRENCYFIELD)) {
+			return CurrencyField.getInstanceOf(element);
+		} else {
+			field = new Field(element);
+		}
+		if (field == null)
+			throw new IllegalStateException(
+					"Failed to load and initiate a field.");
+
+		try {
+			field.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(Field.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this field.");
+		}
+		return field;
+	}
+
+	@Override
+	public String getId() {
+		return ((FormFormattedTextElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormFormattedTextElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormFormattedTextElement) mElement).setFormIdAttribute(id);
+	}
+
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormFormattedTextElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	@Override
+	public String getName() {
+		return ((FormFormattedTextElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormFormattedTextElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Set the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @param value
+	 *            - default value
+	 */
+	public void setValue(String value) {
+		((FormFormattedTextElement) mElement).setFormValueAttribute(value);
+
+	}
+
+	/**
+	 * Get the default value of this control
+	 * 
+	 * @return default value
+	 */
+	public String getValue() {
+		return ((FormFormattedTextElement) mElement).getFormValueAttribute();
+
+	}
+
+	/**
+	 * Set the current value of this control, it override the default value.
+	 * 
+	 * @param currentValue
+	 *            - current value
+	 */
+	public void setCurrentValue(String value) {
+		((FormFormattedTextElement) mElement)
+				.setFormCurrentValueAttribute(value);
+	}
+
+	/**
+	 * Get the current value of this control
+	 * 
+	 * @return current value
+	 */
+	public String getCurrentValue() {
+		return ((FormFormattedTextElement) mElement)
+				.getFormCurrentValueAttribute();
+	}
+
+	/**
+	 * Set the visibility of the spin button
+	 * 
+	 * @param isVisible
+	 *            - true means the spin button is visible; false means the spin
+	 *            button is hidden
+	 */
+	public void setSpinButonVisible(boolean isVisible) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_SPIN, "boolean",
+				null, isVisible, null, null, null, null);
+	}
+
+/**
+	 * Set the format string of the field.
+	 * <p>
+	 * This function only works for float, date, time and percentage, otherwise an
+	 * {@link java.lang.IllegalArgumentException} will be thrown. 
+	 * <p>
+	 * For value type float and percentage, the <code>formatStr</code> must follow the encoding 
+	 * rule of {@link java.text.DecimalFormat <code>java.text.DecimalFormat</code>}.
+	 * For value type date and time, the <code>formatStr</code> must follow the encoding 
+	 * rule of {@link java.text.SimpleDateFormat <code>java.text.SimpleDateFormat</code>}.
+	 * <p>
+	 * <blockquote>
+	 * <table border=0 cellspacing=3 cellpadding=0 summary="Chart showing ValueType, Distinguish Symbol
+	 * and Distinguish Priority.">
+	 *     <tr bgcolor="#ccccff">
+	 *          <th align=left>ValueType
+	 *          <th align=left>Distinguish Symbol
+	 *          <th align=left>Distinguish Priority
+	 *     <tr valign=top>
+	 *          <td>percentage
+	 *          <td>%
+	 *          <td>1
+	 *     <tr valign=top>
+	 *          <td>time
+	 *          <td>H, k, m, s, S
+	 *          <td>2
+	 *     <tr valign=top>
+	 *          <td>date
+	 *          <td>y, M, w, W, D, d, F, E, K, h
+	 *          <td>3
+	 *     <tr valign=top>
+	 *          <td>float
+	 *          <td>#, 0
+	 *          <td>4
+	 * </table>
+	 * </blockquote>
+	 * If adaptive failed, an {@link java.lang.UnsupportedOperationException} will be thrown.
+	 * <p>
+	 * @param formatStr	the cell need be formatted as this specified format string.
+	 * @throws IllegalArgumentException if <code>formatStr</code> is null or the cell value type is supported.
+	 * @see java.text.SimpleDateFormat
+	 * @see java.text.DecimalFormat
+	 */
+	protected void setFormatString(String formatStr,
+			OfficeValueTypeAttribute.Value type, Locale locale) {
+		if (locale == null) {
+			locale = Locale.US;
+		}
+		if (formatStr == null)
+			throw new IllegalArgumentException("formatStr cannot be null.");
+
+		if (type == OfficeValueTypeAttribute.Value.FLOAT) {
+			OdfNumberStyle numberStyle = new OdfNumberStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniqueNumberStyleName());
+			numberStyle.setNumberLanguageAttribute(locale.getLanguage());
+			numberStyle.setNumberCountryAttribute(locale.getCountry());
+			drawingShape.getOdfElement().getAutomaticStyles().appendChild(
+					numberStyle);
+			setDataDisplayStyleName(numberStyle.getStyleNameAttribute());
+		} else if (type == OfficeValueTypeAttribute.Value.DATE) {
+			OdfNumberDateStyle dateStyle = new OdfNumberDateStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniqueDateStyleName(), null);
+			dateStyle.setNumberLanguageAttribute(locale.getLanguage());
+			dateStyle.setNumberCountryAttribute(locale.getCountry());
+			drawingShape.getOdfElement().getAutomaticStyles().appendChild(
+					dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+		} else if (type == OfficeValueTypeAttribute.Value.TIME) {
+			OdfNumberTimeStyle timeStyle = new OdfNumberTimeStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniqueDateStyleName());
+			timeStyle.setNumberLanguageAttribute(locale.getLanguage());
+			timeStyle.setNumberCountryAttribute(locale.getCountry());
+			drawingShape.getOdfElement().getAutomaticStyles().appendChild(
+					timeStyle);
+			setDataDisplayStyleName(timeStyle.getStyleNameAttribute());
+		} else if (type == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			OdfNumberPercentageStyle dateStyle = new OdfNumberPercentageStyle(
+					(OdfFileDom) mElement.getOwnerDocument(), formatStr,
+					getUniquePercentageStyleName());
+			dateStyle.setNumberLanguageAttribute(locale.getLanguage());
+			dateStyle.setNumberCountryAttribute(locale.getCountry());
+			drawingShape.getOdfElement().getAutomaticStyles().appendChild(
+					dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+		} else {
+			throw new IllegalArgumentException("This function doesn't support "
+					+ type + " fomat.");
+		}
+	}
+
+	/**
+	 * Get the format string of the field.
+	 * 
+	 * @return the format string of the field
+	 */
+	public String getFormatString(OfficeValueTypeAttribute.Value typeValue) {
+		Document mDocument = ((Document) ((OdfFileDom) mElement
+				.getOwnerDocument()).getDocument());
+
+		if (typeValue == OfficeValueTypeAttribute.Value.FLOAT) {
+			String name = getDataDisplayStyleName();
+			OdfNumberStyle style = drawingShape.getOdfElement()
+					.getAutomaticStyles().getNumberStyle(name);
+			if (style == null) {
+				style = ((OdfSchemaDocument) mDocument).getDocumentStyles()
+						.getNumberStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.DATE) {
+			String name = getDataDisplayStyleName();
+			OdfNumberDateStyle style = drawingShape.getOdfElement()
+					.getAutomaticStyles().getDateStyle(name);
+			if (style == null) {
+				style = ((OdfSchemaDocument) mDocument).getDocumentStyles()
+						.getDateStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.TIME) {
+			String name = getDataDisplayStyleName();
+			OdfNumberDateStyle style = drawingShape.getOdfElement()
+					.getAutomaticStyles().getDateStyle(name);
+			if (style == null) {
+				style = ((OdfSchemaDocument) mDocument).getDocumentStyles()
+						.getDateStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			String name = getDataDisplayStyleName();
+			OdfNumberPercentageStyle style = drawingShape.getOdfElement()
+					.getAutomaticStyles().getPercentageStyle(name);
+			if (style == null) {
+				style = ((OdfSchemaDocument) mDocument).getDocumentStyles()
+						.getPercentageStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		}
+		return null;
+	}
+
+	private void setDataDisplayStyleName(String name) {
+		OdfStyleBase styleElement = drawingShape.getStyleHandler()
+				.getStyleElementForWrite();
+		if (styleElement != null) {
+			styleElement.setOdfAttributeValue(OdfName.newName(
+					OdfDocumentNamespace.STYLE, "data-style-name"), name);
+		}
+	}
+
+	private String getDataDisplayStyleName() {
+		String datadisplayStylename = null;
+		OdfStyleBase styleElement = drawingShape.getStyleHandler()
+				.getStyleElementForRead();
+		if (styleElement != null) {
+			datadisplayStylename = styleElement.getOdfAttributeValue(OdfName
+					.newName(OdfDocumentNamespace.STYLE, "data-style-name"));
+		}
+
+		return datadisplayStylename;
+	}
+
+	private String getUniqueNumberStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = drawingShape.getOdfElement()
+				.getAutomaticStyles();
+		do {
+			unique_name = String.format("n%06x",
+					(int) (Math.random() * 0xffffff));
+		} while (styles.getNumberStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private String getUniqueDateStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = drawingShape.getOdfElement()
+				.getAutomaticStyles();
+		do {
+			unique_name = String.format("d%06x",
+					(int) (Math.random() * 0xffffff));
+		} while (styles.getDateStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private String getUniquePercentageStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = drawingShape.getOdfElement()
+				.getAutomaticStyles();
+		do {
+			unique_name = String.format("p%06x",
+					(int) (Math.random() * 0xffffff));
+		} while (styles.getPercentageStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	/**
+	 * Get a simple iterator for Field.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the date fields
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleFieldIterator(container);
+	}
+
+	private static class SimpleFieldIterator implements Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private Field nextElement = null;
+		private Field tempElement = null;
+
+		private SimpleFieldIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Field next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+
+		}
+
+		private Field findNext(Field thisField) {
+			FormFormattedTextElement nextfield = null;
+			if (thisField == null) {
+				nextfield = OdfElement.findFirstChildNode(
+						FormFormattedTextElement.class, containerElement);
+			} else {
+				nextfield = OdfElement.findNextChildNode(
+						FormFormattedTextElement.class, thisField
+								.getOdfElement());
+			}
+			if (nextfield != null) {
+				return Field.getInstanceOf(nextfield);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/Form.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Form.java
new file mode 100644
index 0000000..5c80682
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Form.java
@@ -0,0 +1,336 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.simple.draw.ControlContainer;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormCommandType;
+
+/**
+ * This class represents form object. It provides method to get/set form
+ * properties, content, layout and styles. A form is a container to hold
+ * controls like buttons, combo boxes, labels, fields, check boxes, radio
+ * buttons, text boxes, list boxes and etc.
+ * 
+ * @since 0.8
+ */
+public interface Form {
+
+	/**
+	 * Create a button control in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param label
+	 *            - the text label of the button
+	 * 
+	 * @return an instance of button
+	 */
+	public FormControl createButton(ControlContainer parent,
+			FrameRectangle rectangle, String name, String label);
+
+	/**
+	 * Create a label control in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param text
+	 *            -default text of the label
+	 * 
+	 * @return an instance of label
+	 */
+	public FormControl createLabel(ControlContainer parent,
+			FrameRectangle rectangle, String name, String text);
+
+	/**
+	 * Create a textbox in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultText
+	 *            -default text of the textbox
+	 * @param isMultipleLine
+	 *            - if this textbox supports multiple lines input
+	 * 
+	 * @return an instance of text box
+	 */
+	public FormControl createTextBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultText,
+			boolean isMultipleLine);
+
+	/**
+	 * Create a list box in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param isMultiSelection
+	 *            - support multi-selection or not
+	 * @param isDropDown
+	 *            - the drop-down list is visible or not
+	 * 
+	 * @return an instance of list box
+	 */
+	public FormControl createListBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, boolean isMultiSelection,
+			boolean isDropDown);
+
+	/**
+	 * Create a combo box in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultText
+	 *            - the default text of combobox
+	 * @param isDropDown
+	 *            - the drop-down list is visible or not
+	 * 
+	 * @return an instance of combo box
+	 */
+	public FormControl createComboBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultText,
+			boolean isDropDown);
+
+	/**
+	 * Create a radio button in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param label
+	 *            - the label of this radio button
+	 * @param value
+	 *            - the value assign to this option
+	 * 
+	 * @return an instance of radio button
+	 */
+	public FormControl createRadioButton(ControlContainer parent,
+			FrameRectangle rectangle, String name, String label, String value);
+
+	/**
+	 * Create a check box in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param label
+	 *            - the label of this check box
+	 * @param value
+	 *            - the value assign to this option
+	 * 
+	 * @return an instance of check box
+	 */
+	public FormControl createCheckBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, String label, String value);
+
+	/**
+	 * Create a date field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field
+	 * 
+	 * @return an instance of date field
+	 */
+	public FormControl createDateField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue);
+
+	/**
+	 * Create a time field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field
+	 * 
+	 * @return an instance of time field
+	 */
+	public FormControl createTimeField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue);
+
+	/**
+	 * Create a numeric field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field
+	 * 
+	 * @return an instance of numeric field
+	 */
+	public FormControl createNumericField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue);
+
+	/**
+	 * Create a pattern field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field
+	 * 
+	 * @return an instance of pattern field
+	 */
+	public FormControl createPatternField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue);
+
+	/**
+	 * Create a currency field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field
+	 * 
+	 * @return an instance of currency field
+	 */
+	public FormControl createCurrencyField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue);
+
+	/**
+	 * Set the name of this form
+	 * 
+	 * @param name
+	 *            - the form name
+	 */
+	public void setFormName(String name);
+
+	/**
+	 * Get the form name
+	 * 
+	 * @return the form name
+	 */
+	public String getFormName();
+
+	/**
+	 * Set the implementation of the created control
+	 * 
+	 * @param controlImpl
+	 *            - implementation of control
+	 */
+	public void setControlImplementation(String controlImpl);
+
+	/**
+	 * Get the implementation of the created control
+	 * 
+	 * @return a control implementation
+	 */
+	public String getControlImplementation();
+
+	/**
+	 * Set the data source to be used by the form
+	 * 
+	 * @param dataSource
+	 *            - name of data source
+	 */
+	public void setDataSource(String dataSource);
+
+	/**
+	 * Get the name of data source
+	 * 
+	 * @return the name of data source used by the form
+	 */
+	public String getDataSource();
+
+	/**
+	 * Set the type of command to execute on a data source.
+	 * 
+	 * @param commandType
+	 *            the command type
+	 */
+	public void setCommandType(FormCommandType commandType);
+
+	/**
+	 * Get the type of command to execute on a data source
+	 * 
+	 * @return the command type
+	 */
+	public FormCommandType getCommandType();
+
+	/**
+	 * Set a command to execute on a data source
+	 * 
+	 * @param command
+	 * 
+	 */
+	public void setCommand(String command);
+
+	/**
+	 * Get the command to execute on a data source
+	 * 
+	 * @return the command
+	 */
+	public String getCommand();
+
+	/**
+	 * Get the instance of <code>FormFormElemnt</code> element.
+	 * 
+	 * @return the instance of <code>FormFormElemnt</code>
+	 */
+	public FormFormElement getOdfElement();
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormContainer.java
new file mode 100644
index 0000000..509a3df
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormContainer.java
@@ -0,0 +1,117 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+
+/**
+ * FormContainer is a container which maintains Form(s) as element(s).
+ * 
+ * @since 0.8
+ */
+public interface FormContainer {
+
+	/**
+	 * Get the ODF element <code>OfficeFormsElement</code> which can have
+	 * <code>FormFormElement</code> as child element directly according to ODF
+	 * specification. This element will help to find the position to insert a
+	 * new <code>FormFormElement</code> element.
+	 * 
+	 * @return the element of office:forms
+	 */
+	public OfficeFormsElement getFormContainerElement();
+
+	/**
+	 * create and add a form into this container.
+	 * 
+	 * @param name
+	 *            - form name, represents attribute <code>form:name</code>
+	 * @return an instance of Form
+	 */
+	public Form createForm(String name);
+
+	/**
+	 * Remove the form and its binding shape.
+	 * 
+	 * @param form
+	 *            - the form to be removed
+	 * @return true if the form is removed successfully, false if errors happen.
+	 */
+	public boolean removeForm(Form form);
+
+	/**
+	 * Return a form whose name is a given value.
+	 * 
+	 * @param name
+	 *            - the name of the form
+	 * @return a form whose name is a given value
+	 */
+	public Form getFormByName(String name);
+
+	/**
+	 * Get an iterator to traverse each form in this container.
+	 * 
+	 * @return form iterator
+	 */
+	public Iterator<Form> getFormIterator();
+
+	/**
+	 * Get the attribute <code>form:apply-design-mode</code> which specifies
+	 * whether forms are presented in editable or non-editable state.
+	 * 
+	 * @return true if forms in document are presented in editable state;false
+	 *         if forms in document are presented in completed state
+	 */
+	public boolean getApplyDesignMode();
+
+	/**
+	 * Get the attribute <code>form:automatic-focus</code> which specifies
+	 * whether the consumer loading the document should set the focus to a form
+	 * control.
+	 * 
+	 * @return true if sets the focus to a form control after loading the
+	 *         document; false if else.
+	 */
+	public boolean getAutomaticFocus();
+
+	/**
+	 * Set the attribute <code>form:apply-design-mode</code> which specifies
+	 * whether forms are presented in editable or non-editable state.
+	 * 
+	 * @param isDesignMode
+	 *            - true if forms in document are presented in editable state;
+	 *            false if forms in document are presented in completed state
+	 */
+	public void setApplyDesignMode(boolean isDesignMode);
+
+	/**
+	 * Set the attribute <code>form:automatic-focus</code> which specifies
+	 * whether the consumer loading the document should set the focus to a form
+	 * control.
+	 * 
+	 * @param isAutoFocus
+	 *            -true if sets the focus to a form control after loading the
+	 *            document; false if else.
+	 */
+	public void setAutomaticFocus(boolean isAutoFocus);
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormControl.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormControl.java
new file mode 100644
index 0000000..a1c3033
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormControl.java
@@ -0,0 +1,274 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.xerces.dom.NodeImpl;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertyElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.draw.Control;
+import org.odftoolkit.simple.draw.ControlContainer;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.w3c.dom.NodeList;
+
+/**
+ *This class represents the form control, which provides the methods to get/set
+ * the control properties and style and layout properties of its binding drawing
+ * shape.
+ * 
+ * @since 0.8
+ */
+public abstract class FormControl extends Component {
+
+	protected Control drawingShape;
+	protected FormFormElement formElement;
+	protected FormPropertiesElement mFormProperties;
+	protected OdfElement mElement;
+
+	/**
+	 * Create an instance of a drawing shape(<code>DrawControlElement</code>) as
+	 * an visual representation of this form control.
+	 * 
+	 * @param parent
+	 *            - the container where this drawing shape is contained.
+	 * @return an instance of drawing shape
+	 */
+	Control createDrawControl(ControlContainer parent) {
+		drawingShape = parent.createDrawControl();
+		drawingShape.setControl(getId());
+		return drawingShape;
+	}
+
+	/**
+	 * Remove the form control from the container.
+	 * <p>
+	 * The resource is removed if it's only used by this object.
+	 * 
+	 * @see Control#remove()
+	 * 
+	 * @return true if the form control is successfully removed; false if
+	 *         otherwise.
+	 */
+	public boolean remove() {
+		try {
+			Document mOwnerDocument = (Document) ((OdfFileDom) mElement
+					.getOwnerDocument()).getDocument();
+			if (getDrawControl() == null)
+				loadDrawControl(mOwnerDocument.getContentRoot());
+			getDrawControl().remove();
+			formElement.removeChild(getOdfElement());
+			mOwnerDocument.removeElementLinkedResource(getOdfElement());
+			return true;
+		} catch (Exception e) {
+			Logger.getLogger(FormControl.class.getName()).log(Level.SEVERE,
+					"fail to remove this element.");
+			return false;
+		}
+	}
+
+	/**
+	 * Load an instance of drawing shape by searching the DrawControlElement
+	 * which contains a reference to this control.
+	 * 
+	 * @param root
+	 *            - root element where to search the DrawControlElement
+	 * @return true if an element is found; false no element is found.
+	 */
+	boolean loadDrawControl(OdfElement root) {
+		NodeList controls = root.getElementsByTagName("draw:control");
+		for (int i = 0; i < controls.getLength(); i++) {
+			DrawControlElement control = (DrawControlElement) controls.item(i);
+			if (control.getDrawControlAttribute().equals(getId())) {
+				drawingShape = (Control) Component
+						.getComponentByElement(control);
+				if (drawingShape == null) {
+					drawingShape = new Control(control);
+					Component.registerComponent(drawingShape, control);
+				}
+				return true;
+			}
+		}
+		return false;
+
+	}
+
+	/**
+	 * Get the OdfElement which represents this control
+	 * 
+	 * @return the OdfElement which represents this control
+	 */
+	public OdfElement getOdfElement() {
+		return mElement;
+	}
+
+	/**
+	 * Get the drawing shape binding to this control
+	 * 
+	 * @return the drawing shape binding to this control
+	 */
+	public Control getDrawControl() {
+		return drawingShape;
+	}
+
+	/**
+	 * Set the control id.
+	 * 
+	 * @param id
+	 *            -the control id.
+	 */
+	public abstract void setId(String id);
+
+	/**
+	 * Get the control id.
+	 * 
+	 * @return the control id.
+	 */
+	public abstract String getId();
+
+	/**
+	 * Set the control name.
+	 * 
+	 * @param name
+	 *            - the control name.
+	 */
+	public abstract void setName(String name);
+
+	/**
+	 * Get the control name.
+	 * 
+	 * @return the control name.
+	 */
+	public abstract String getName();
+
+	/**
+	 * Set the implementation of this control.
+	 * 
+	 * @param controlImpl
+	 *            - the implementation description of this control
+	 */
+	public abstract void setControlImplementation(String controlImpl);
+
+	/**
+	 * Set the anchor position how this form control is bound to a text
+	 * document.
+	 * 
+	 * @param anchorType
+	 *            - the anchor position
+	 */
+	public void setAnchorType(AnchorType anchorType) {
+		if (drawingShape == null)
+			throw new IllegalStateException(
+					"No drawing shape is binding to this control. Please call createDrawControl() or loadDrawControl() first.");
+		drawingShape.setAchorType(anchorType);
+	}
+
+	/**
+	 * Return the rectangle used as the bounding box of this form control
+	 * 
+	 * @return - the rectangle
+	 */
+	public FrameRectangle getRectangle() {
+		return getDrawControl().getRectangle();
+	}
+
+	/**
+	 * Set the rectangle used as the bounding box of this form control
+	 * 
+	 * @param rectangle
+	 *            - the rectangle
+	 */
+	public void setRectangle(FrameRectangle rectangle) {
+		getDrawControl().setRectangle(rectangle);
+
+	}
+
+	/**
+	 * Get the <code>FormPropertiesElement</code> of this control, which is used
+	 * to set the implementation-independent properties. If there's no such
+	 * element, create a new one for this control.
+	 * 
+	 * @return an instance of the <code>FormPropertiesElement</code>
+	 */
+	abstract FormPropertiesElement getFormPropertiesElementForWrite();
+
+	/**
+	 * Get the <code>FormPropertiesElement</code> of this control, which is used
+	 * to set the implementation-independent properties. If there's no such
+	 * element, null will be returned.
+	 * 
+	 * @return an instance of the <code>FormPropertiesElement</code>
+	 */
+	FormPropertiesElement getFormPropertiesElementForRead() {
+		return mFormProperties;
+	}
+
+	protected void setFormProperty(String formPropertyName,
+			String officeValueType, String officeStringValue,
+			Boolean officeBooleanValue, String officeDateValue,
+			String officeTimeValue, Double officeValue, String officeCurrency) {
+		FormPropertiesElement parentEle = getFormPropertiesElementForWrite();
+
+		// find the existing property with the appointed form property name
+		NodeList properties = parentEle.getChildNodes();
+		FormPropertyElement formProperty = null;
+		for (int i = 0; i < properties.getLength(); i++) {
+			FormPropertyElement property = (FormPropertyElement) properties
+					.item(i);
+			if (property.getFormPropertyNameAttribute()
+					.equals(formPropertyName)) {
+				formProperty = (FormPropertyElement) properties.item(i);
+				break;
+			}
+		}
+		// create a new property
+		if (formProperty == null) {
+			org.w3c.dom.Document ownerDocument = parentEle.getOwnerDocument();
+			formProperty = ((OdfFileDom) ownerDocument)
+					.newOdfElement(FormPropertyElement.class);
+			formProperty.setFormPropertyNameAttribute(formPropertyName);
+			formProperty.setOfficeValueTypeAttribute(officeValueType);
+		}
+		// set the value
+		if (officeStringValue != null)
+			formProperty.setOfficeStringValueAttribute(officeStringValue);
+		if (officeBooleanValue != null)
+			formProperty.setOfficeBooleanValueAttribute(officeBooleanValue);
+		if (officeDateValue != null)
+			formProperty.setOfficeDateValueAttribute(officeDateValue);
+		if (officeTimeValue != null)
+			formProperty.setOfficeTimeValueAttribute(officeTimeValue);
+		if (officeValue != null)
+			formProperty.setOfficeValueAttribute(officeValue);
+		if (officeCurrency != null)
+			formProperty.setOfficeCurrencyAttribute(officeCurrency);
+
+		((NodeImpl) parentEle).appendChild(formProperty);
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormProvider.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormProvider.java
new file mode 100644
index 0000000..59e9dce
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormProvider.java
@@ -0,0 +1,52 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+
+/**
+ * FormProvider provides the methods to create and get form instance in a way
+ * that is implementation-independent.
+ * 
+ * @since 0.8
+ */
+public interface FormProvider {
+
+	/**
+	 * Create a form in a way that is implementation-independent.
+	 * 
+	 * @param name
+	 *            -the form name
+	 * @param parent
+	 *            -the container element of this form
+	 * @return a form instance
+	 */
+	public Form createForm(String name, OfficeFormsElement parent);
+
+	/**
+	 * Get a form instance by a <code>FormFormElement</code>
+	 * 
+	 * @param element
+	 *            - a <code>FormFormElement</code>
+	 * @return a form instance
+	 */
+	public Form getInstanceOf(FormFormElement element);
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormTypeDefinition.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormTypeDefinition.java
new file mode 100644
index 0000000..86549da
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/FormTypeDefinition.java
@@ -0,0 +1,150 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+/**
+ * This class defines the common used constants in form handling methods.
+ * 
+ * @since 0.8
+ */
+public class FormTypeDefinition {
+	/**
+	 * Common used image position of form from users perspective.
+	 * <p>
+	 * This attibute specifies the location of an image relative to the text of
+	 * a control.
+	 * 
+	 */
+	public static enum FormImageLocation {
+		BOTTOM("bottom"), CENTER("center"), END("end"), START("start"), TOP(
+				"top");
+
+		private String formImageLocation = "center";
+
+		FormImageLocation(String location) {
+			this.formImageLocation = location;
+		}
+
+		@Override
+		public String toString() {
+			return formImageLocation;
+		}
+	}
+
+	/**
+	 * Common used command type of form from users perspective. *
+	 * <p>
+	 * This attibute specifies the type of command to execute on a data source.
+	 */
+	public static enum FormCommandType {
+		COMMAND("command"), QUERY("query"), TABLE("table");
+
+		private String formCommandType = "command";
+
+		FormCommandType(String type) {
+			this.formCommandType = type;
+		}
+
+		public static FormCommandType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (FormCommandType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Form Command Type!");
+		}
+
+		@Override
+		public String toString() {
+			return formCommandType;
+		}
+	}
+
+	// table, query, sql, sql-pass-through, value-list or table-fields
+	/**
+	 * Common used source type of entry list from users perspective.
+	 * <p>
+	 * This attibutes pecifies how to populate the entry list in a combo box or
+	 * list box control.
+	 */
+	public static enum FormListSourceType {
+		TABLE("table"), QUERY("query"), SQL("sql"), SQL_PASS_THROUGH(
+				"sql-pass-through"), VALUE_LIST("value-list"), TABLE_FIELDS(
+				"table-fields");
+
+		private String formListSourceType = "sql";
+
+		FormListSourceType(String type) {
+			this.formListSourceType = type;
+		}
+
+		public static FormListSourceType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (FormListSourceType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Form Command Type!");
+		}
+
+		@Override
+		public String toString() {
+			return formListSourceType;
+		}
+	}
+
+	/**
+	 * Common used state for a check box from users perspective.
+	 * <p>
+	 *This attibutes pecifies the default state of a check box control.
+	 */
+	public static enum FormCheckboxState {
+		CHECKED("checked"), UNCHECKED("unchecked"), UNKNOWN("unknown");
+
+		private String formCheckboxState = "unchecked";
+
+		FormCheckboxState(String state) {
+			this.formCheckboxState = state;
+		}
+
+		public static FormCheckboxState enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (FormCheckboxState aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Check Box State!");
+		}
+
+		@Override
+		public String toString() {
+			return formCheckboxState;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/Label.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Label.java
new file mode 100644
index 0000000..b805cee
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/Label.java
@@ -0,0 +1,184 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFixedTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+
+/**
+ * This class represents the form control of Label, provides methods to get/set
+ * the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class Label extends FormControl {
+
+	Label(FormFixedTextElement element) {
+		mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of label by an instance of FormFixedTextElement, while
+	 * searching the document content to make a bind with the DrawControl which
+	 * already reference to this label.
+	 * 
+	 * @param element
+	 *            - an instance of FormFixedTextElement
+	 * @return an instance of label
+	 */
+	public static Label getInstanceOf(FormFixedTextElement element) {
+		Label label = new Label(element);
+		try {
+			label.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(Label.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this label.");
+		}
+		return label;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormFixedTextElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	@Override
+	public String getId() {
+		return ((FormFixedTextElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormFixedTextElement) mElement).setFormIdAttribute(id);
+	}
+
+	@Override
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormFixedTextElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	@Override
+	public String getName() {
+		return ((FormFixedTextElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormFixedTextElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Set the text content of this label
+	 * 
+	 * @param label
+	 *            - the text content of this label
+	 */
+	public void setLabel(String label) {
+		((FormFixedTextElement) mElement).setFormLabelAttribute(label);
+	}
+
+	/**
+	 * Get the text content of this label
+	 * 
+	 * @return the text content of this label
+	 */
+	public String getLabel() {
+		return ((FormFixedTextElement) mElement).getFormLabelAttribute();
+	}
+
+	/**
+	 * Get a simple iterator for labels.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the labels
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleLabelIterator(container);
+	}
+
+	private static class SimpleLabelIterator implements Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private Label nextElement = null;
+		private Label tempElement = null;
+
+		private SimpleLabelIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Label next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+
+		}
+
+		private Label findNext(Label thisLabel) {
+			FormFixedTextElement nextLabel = null;
+			if (thisLabel == null) {
+				nextLabel = OdfElement.findFirstChildNode(
+						FormFixedTextElement.class, containerElement);
+			} else {
+				nextLabel = OdfElement.findNextChildNode(
+						FormFixedTextElement.class, thisLabel.getOdfElement());
+			}
+
+			if (nextLabel != null) {
+				return Label.getInstanceOf(nextLabel);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/ListBox.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/ListBox.java
new file mode 100644
index 0000000..edd6221
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/ListBox.java
@@ -0,0 +1,320 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormListboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormOptionElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormListSourceType;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents the form control of List Box, provides methods to
+ * get/set the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class ListBox extends FormControl {
+
+	private ArrayList<String> entries;
+
+	ListBox(FormListboxElement element) {
+		this.mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of list box by an instance of FormListboxElement, while
+	 * searching the document content to make a bind with the DrawControl which
+	 * already reference to this list box.
+	 * 
+	 * @param element
+	 *            - an instance of FormComboboxElement
+	 * @return an instance of list box
+	 */
+	public static ListBox getInstanceOf(FormListboxElement element) {
+		ListBox listbox = new ListBox(element);
+		try {
+			listbox.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(ListBox.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this listbox.");
+		}
+		return listbox;
+	}
+
+	@Override
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormListboxElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormListboxElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	@Override
+	public String getId() {
+		return ((FormListboxElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormListboxElement) mElement).setFormIdAttribute(id);
+	}
+
+	@Override
+	public String getName() {
+		return ((FormListboxElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormListboxElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Set if the list box support multi-selection
+	 * 
+	 * @param isMultiSelection
+	 *            - specify if the list box supports multi-selection
+	 */
+	public void setFormMultiSelection(boolean isMultiSelection) {
+		((FormListboxElement) mElement)
+				.setFormMultipleAttribute(isMultiSelection);
+	}
+
+	/**
+	 * Get if the list box support multi-selection
+	 * 
+	 * @return true if the list box supports multi-selection; false if not.
+	 */
+	public boolean getFormMultiSelection() {
+		return ((FormListboxElement) mElement).getFormMultipleAttribute();
+	}
+
+	/**
+	 * Set the visibility of the drop-down list
+	 * 
+	 * @param isDropDown
+	 *            - specify if the drop-down list is visible
+	 */
+	public void setFormDropdown(boolean isDropDown) {
+		((FormListboxElement) mElement).setFormDropdownAttribute(isDropDown);
+	}
+
+	/**
+	 * Get the visibility of the drop-down list
+	 * 
+	 * @return true if the drop-down list is visible; false if not.
+	 */
+	public boolean getFormDropdown() {
+		return ((FormListboxElement) mElement).getFormDropdownAttribute();
+	}
+
+	/**
+	 * Add a list item to this list box.
+	 * 
+	 * @param item
+	 *            - a list item
+	 */
+	public void addItem(String item) {
+		if (item == null)
+			return;
+		if (entries == null)
+			entries = new ArrayList<String>();
+		((FormListboxElement) mElement).newFormOptionElement()
+				.setFormLabelAttribute(item);
+		entries.add(item);
+	}
+
+	/**
+	 * Get the list entries if they are initiated through a list of string.
+	 * 
+	 * @return the list entries
+	 */
+	public ArrayList<String> getEntries() {
+		if (entries == null || entries.size() == 0) {
+			NodeList items = mElement.getElementsByTagName("form:option");
+			if (items != null && items.getLength() > 0) {
+				for (int i = 0; i < items.getLength(); i++) {
+					if (entries == null)
+						entries = new ArrayList<String>();
+					entries.add(((FormOptionElement) items.item(i))
+							.getFormLabelAttribute());
+				}
+				return entries;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Add a group of list items to this list box
+	 * 
+	 * @param items
+	 *            -a group of list items
+	 */
+	public void addItems(String[] items) {
+		if (items == null || items.length == 0)
+			return;
+		for (int i = 0; i < items.length; i++) {
+			addItem(items[i]);
+		}
+	}
+
+	/**
+	 * Set the source type of the data list.
+	 * 
+	 * @param type
+	 *            - the source type of this list
+	 */
+	public void setListSourceType(FormListSourceType type) {
+		((FormListboxElement) mElement).setFormListSourceTypeAttribute(type
+				.toString());
+	}
+
+	/**
+	 * Get the source type of the data list.
+	 * 
+	 * @return the source type of this list
+	 */
+	public FormListSourceType getListSourceType() {
+		String aValue = ((FormListboxElement) mElement)
+				.getFormListSourceTypeAttribute();
+		return FormListSourceType.enumValueOf(aValue);
+	}
+
+	/**
+	 * Set the source of this data list.
+	 * 
+	 * @param listSource
+	 *            - the source of this data list.
+	 */
+	public void setListSource(String listSource) {
+		((FormListboxElement) mElement).setFormListSourceAttribute(listSource);
+	}
+
+	/**
+	 * Get the source of this data list.
+	 * 
+	 * @return the source of this data list.
+	 */
+	public String getListSource() {
+		return ((FormListboxElement) mElement).getFormListSourceAttribute();
+	}
+
+	/**
+	 * Set the data field referenced by this combo box
+	 * 
+	 * @param dataField
+	 *            - the data field referenced by this combo box
+	 */
+	public void setDataField(String dataField) {
+		((FormListboxElement) mElement).setFormDataFieldAttribute(dataField);
+	}
+
+	/**
+	 * Get the data field referenced by this combo box
+	 * 
+	 * @return the data field
+	 */
+	public String getDataField() {
+		return ((FormListboxElement) mElement).getFormDataFieldAttribute();
+	}
+
+	/**
+	 * Get a simple iterator for list boxes.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the list boxes
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleListBoxIterator(container);
+	}
+
+	private static class SimpleListBoxIterator implements Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private ListBox nextElement = null;
+		private ListBox tempElement = null;
+
+		private SimpleListBoxIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public ListBox next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+		}
+
+		private ListBox findNext(ListBox thisListBox) {
+			FormListboxElement nextListBox = null;
+			if (thisListBox == null) {
+				nextListBox = OdfElement.findFirstChildNode(
+						FormListboxElement.class, containerElement);
+			} else {
+				nextListBox = OdfElement.findNextChildNode(
+						FormListboxElement.class, thisListBox.getOdfElement());
+			}
+
+			if (nextListBox != null) {
+				return ListBox.getInstanceOf(nextListBox);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/NumericField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/NumericField.java
new file mode 100644
index 0000000..815ccaa
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/NumericField.java
@@ -0,0 +1,77 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+
+public class NumericField extends Field {
+
+	NumericField(FormFormattedTextElement element) {
+		super(element);
+	}
+
+	/**
+	 * Get an instance of numeric field by an instance of
+	 * FormFormattedTextElement, while searching the document content to make a
+	 * bind with the DrawControl which already reference to this numeric field.
+	 * 
+	 * @param element
+	 *            - an instance of FormFormattedTextElement
+	 * @return an instance of numeric field
+	 */
+	public static TimeField getInstanceOf(FormFormattedTextElement element) {
+		TimeField field = new TimeField(element);
+		try {
+			field.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(DateField.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this field.");
+		}
+		return field;
+	}
+
+	/**
+	 * Set the decimal accuracy of the input value
+	 * 
+	 * @param value
+	 *            - specify how many digits will be kept after the decimal point
+	 */
+	public void setDecimalAccuracy(double value) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_DECIMALACCURACY,
+				"float", null, null, null, null, value, null);
+	}
+
+	/**
+	 * Set the step value for the spin button.
+	 * 
+	 * @param value
+	 *            - the step value for the spin button.
+	 */
+	public void setStepValue(double value) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_VALUESTEP,
+				"float", null, null, null, null, value, null);
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/OOForm.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/OOForm.java
new file mode 100644
index 0000000..6d809e5
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/OOForm.java
@@ -0,0 +1,546 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import org.odftoolkit.odfdom.dom.element.form.FormButtonElement;
+import org.odftoolkit.odfdom.dom.element.form.FormCheckboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormComboboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFixedTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFrameElement;
+import org.odftoolkit.odfdom.dom.element.form.FormListboxElement;
+import org.odftoolkit.odfdom.dom.element.form.FormRadioElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlContainer;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormCommandType;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormImageLocation;
+import org.odftoolkit.simple.form.OOFormProvider.FieldType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+
+/**
+ * This class implements the interface of Form according to the implementation
+ * of OpenOffice.org.
+ * 
+ * @since 0.8
+ * 
+ */
+public class OOForm extends Component implements Form {
+
+	private FormFormElement mElement;
+	private Document mOwnerDocument;
+	protected OfficeFormsElement mFormContainerElement;
+	private int controlCount;
+
+	private OOForm(FormFormElement element) {
+		mElement = element;
+		mOwnerDocument = (Document) ((OdfFileDom) mElement.getOwnerDocument())
+				.getDocument();
+		mFormContainerElement = (OfficeFormsElement) mElement.getParentNode();
+	}
+
+	static OOForm createForm(String name, OfficeFormsElement parent) {
+		OOForm form = null;
+		if (parent != null) {
+			FormFormElement element = parent.newFormFormElement();
+			form = new OOForm(element);
+			form.setFormName(name);
+			form
+					.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_FORM);
+			Component.registerComponent(form, element);
+		}
+		return form;
+	}
+
+	public Document getOwnerDocument() {
+		return mOwnerDocument;
+	}
+
+	/**
+	 * Get a form instance by an instance of <code>FormFormElement</code>.
+	 * 
+	 * @param element
+	 * @return
+	 */
+	public static Form getInstance(FormFormElement element) {
+		OOForm form = null;
+		form = (OOForm) Component.getComponentByElement(element);
+		if (form == null) {
+			form = new OOForm(element);
+			Component.registerComponent(form, element);
+		}
+		return form;
+	}
+
+
+	public Button createButton(ControlContainer parent,
+			FrameRectangle rectangle, String name, String label) {
+		FormButtonElement btnElement = mElement.newFormButtonElement(
+				FormImageLocation.CENTER.toString(), generateFormId());
+		// set default control properties
+		Button btnForm = new Button(btnElement);
+		Component.registerComponent(btnForm, btnElement);
+		btnForm.setId(btnElement.getXmlIdAttribute());
+		btnForm.setName(name);
+		btnForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_COMMANDBUTTON);
+		btnForm.setLabel(label);
+		btnForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				OOFormProvider.FORM_PROPERTY_VALUE_COMMANDBUTTON, null, null,
+				null, null, null);
+		// bond to drawing shape
+		btnForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			btnForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			btnForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		btnForm.setRectangle(rectangle);
+		return btnForm;
+	}
+
+
+	public FormControl createLabel(ControlContainer parent,
+			FrameRectangle rectangle, String name, String text) {
+		FormFixedTextElement fixedTElement = mElement
+				.newFormFixedTextElement(generateFormId());
+		// set default control properties
+		Label labelForm = new Label(fixedTElement);
+		Component.registerComponent(labelForm, fixedTElement);
+		labelForm.setId(fixedTElement.getXmlIdAttribute());
+		labelForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_FIXEDTEXT);
+		labelForm.setName(name);
+		labelForm.setLabel(text);
+		// bond to drawing shape
+		labelForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			labelForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			labelForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		labelForm.setRectangle(rectangle);
+		return labelForm;
+	}
+
+
+	public FormControl createTextBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultText,
+			boolean isMultipleLine) {
+		OdfElement textBoxElement;
+		String formId = generateFormId();
+		if (isMultipleLine) {
+			textBoxElement = mElement.newFormTextareaElement(formId);
+		} else {
+			textBoxElement = mElement.newFormTextElement(formId);
+		}
+		// set default control properties
+		TextBox textBoxForm = new TextBox(textBoxElement);
+		Component.registerComponent(textBoxForm, textBoxElement);
+		textBoxForm.setId(formId);
+		textBoxForm.setName(name);
+		textBoxForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_TEXTFEILD);
+		textBoxForm.setValue(defaultText);
+		textBoxForm.setCurrentValue(defaultText);
+		textBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				OOFormProvider.FORM_PROPERTY_VALUE_TEXTFEILD, null, null, null,
+				null, null);
+		if (isMultipleLine)
+			textBoxForm.setFormProperty(
+					OOFormProvider.FORM_PROPERTY_NAME_MULTILINE, "boolean",
+					null, true, null, null, null, null);
+		textBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_OBJIDINMSO, "float", null,
+				null, null, null, 0.0, null);
+
+		// bond to drawing shape
+		textBoxForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			textBoxForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			textBoxForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		textBoxForm.setRectangle(rectangle);
+		return textBoxForm;
+	}
+
+
+	public FormControl createListBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, boolean isMultiSelection,
+			boolean isDropDown) {
+		String formId = generateFormId();
+		FormListboxElement listBoxElement = mElement
+				.newFormListboxElement(generateFormId());
+		// set default control properties
+		ListBox listBoxForm = new ListBox(listBoxElement);
+		Component.registerComponent(listBoxForm, listBoxElement);
+		listBoxForm.setId(formId);
+		listBoxForm.setName(name);
+		listBoxForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_LISTBOX);
+		listBoxForm.setFormMultiSelection(isMultiSelection);
+		if (isDropDown) {
+			listBoxForm.setFormDropdown(true);
+		}
+		listBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_COMPLEXSTRINGITEMLIST,
+				"float", null, null, null, null, null, null);
+		listBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				OOFormProvider.FORM_PROPERTY_VALUE_LISTBOX, null, null, null,
+				null, null);
+		listBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_CONTROLTYPEINMSO, "float",
+				null, null, null, null, 0.0, null);
+		listBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_FOCUSEDITEM, "float", null,
+				null, null, null, 0.0, null);
+		listBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_EXTMULTISELECTION, "float",
+				null, null, null, null, 0.0, null);
+		listBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_OBJIDINMSO, "float", null,
+				null, null, null, 0.0, null);
+		// bond to drawing shape
+		listBoxForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			listBoxForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			listBoxForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		listBoxForm.setRectangle(rectangle);
+		return listBoxForm;
+	}
+
+
+	public FormControl createComboBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultText,
+			boolean isDropDown) {
+		String formId = generateFormId();
+		FormComboboxElement comboElement = mElement
+				.newFormComboboxElement(formId);
+		// set default control properties
+		ComboBox comboBoxForm = new ComboBox(comboElement);
+		Component.registerComponent(comboBoxForm, comboElement);
+		comboBoxForm.setId(formId);
+		comboBoxForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_COMBOBOX);
+		comboBoxForm.setName(name);
+		if (defaultText != null) {
+			comboBoxForm.setCurrentValue(defaultText);
+			comboBoxForm.setValue(defaultText);
+		}
+		if (isDropDown) {
+			comboBoxForm.setFormDropdown(true);
+		}
+		comboBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_COMPLEXSTRINGITEMLIST,
+				"float", null, null, null, null, null, null);
+		comboBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				OOFormProvider.FORM_PROPERTY_VALUE_COMBOBOX, null, null, null,
+				null, null);
+		comboBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_CONTROLTYPEINMSO, "float",
+				null, null, null, null, 0.0, null);
+		comboBoxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_OBJIDINMSO, "float", null,
+				null, null, null, 0.0, null);
+		// bond to drawing shape
+		comboBoxForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			comboBoxForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			comboBoxForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		comboBoxForm.setRectangle(rectangle);
+		return comboBoxForm;
+	}
+
+
+	public FormControl createRadioButton(ControlContainer parent,
+			FrameRectangle rectangle, String name, String label, String value) {
+		String formId = generateFormId();
+		FormRadioElement radioElement = mElement.newFormRadioElement("center",
+				formId);
+		// set default control properties
+		RadioButton radioBtnForm = new RadioButton(radioElement);
+		Component.registerComponent(radioBtnForm, radioElement);
+		radioBtnForm.setId(formId);
+		radioBtnForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_RADIOBUTTON);
+		radioBtnForm.setLabel(label);
+		radioBtnForm.setName(name);
+		radioBtnForm.setValue(value);
+		radioBtnForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_CONTROLTYPEINMSO, "float",
+				null, null, null, null, 0.0, null);
+		radioBtnForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				OOFormProvider.FORM_PROPERTY_VALUE_RADIOBUTTON, null, null,
+				null, null, null);
+		// bond to drawing shape
+		radioBtnForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			radioBtnForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			radioBtnForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		radioBtnForm.setRectangle(rectangle);
+		return radioBtnForm;
+	}
+
+
+	public FormControl createCheckBox(ControlContainer parent,
+			FrameRectangle rectangle, String name, String label, String value) {
+		String formId = generateFormId();
+		FormCheckboxElement checkboxElement = mElement.newFormCheckboxElement(
+				"center", formId);
+		// set default control properties
+		CheckBox checkboxForm = new CheckBox(checkboxElement);
+		Component.registerComponent(checkboxForm, checkboxElement);
+		checkboxForm.setId(formId);
+		checkboxForm.setName(name);
+		checkboxForm
+				.setControlImplementation(OOFormProvider.OO_CONTROL_IMPLEMENTATION_CHECKBOX);
+		checkboxForm.setLabel(label);
+		checkboxForm.setValue(value);
+		checkboxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_CONTROLTYPEINMSO, "float",
+				null, null, null, null, 0.0, null);
+		checkboxForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				OOFormProvider.FORM_PROPERTY_VALUE_CHECKBOX, null, null, null,
+				null, null);
+		// bond to drawing shape
+		checkboxForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			checkboxForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			checkboxForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		checkboxForm.setRectangle(rectangle);
+		return checkboxForm;
+	}
+
+	/**
+	 * Create a time field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field. It's a 6 digits
+	 *            number, e.g. 20121015 represents 2012-10-15.
+	 * 
+	 * @return an instance of time field
+	 */
+	public FormControl createDateField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue) {
+		return createField(FieldType.DATE_FIELD, parent, rectangle, name,
+				defaultValue);
+	}
+
+	/**
+	 * Create a time field in this form.
+	 * 
+	 * @param parent
+	 *            - the element that contains this form control
+	 * @param rectangle
+	 *            - the bounding rectangle used by this button
+	 * @param name
+	 *            - the name of the control
+	 * @param defaultValue
+	 *            - the default value of this input field. It's a 6 digits
+	 *            number, e.g. 15304000 represents 15:30:40.
+	 * 
+	 * @return an instance of time field
+	 */
+	public FormControl createTimeField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue) {
+		return createField(FieldType.TIME_FIELD, parent, rectangle, name,
+				defaultValue);
+	}
+
+
+	public FormControl createNumericField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue) {
+		return createField(FieldType.NUMERIC_FIELD, parent, rectangle, name,
+				defaultValue);
+	}
+
+
+	public FormControl createPatternField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue) {
+		return createField(FieldType.PATTERN_FIELD, parent, rectangle, name,
+				defaultValue);
+	}
+
+
+	public FormControl createCurrencyField(ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue) {
+		return createField(FieldType.CURRENCY_FIELD, parent, rectangle, name,
+				defaultValue);
+	}
+
+	private FormControl createField(FieldType type, ControlContainer parent,
+			FrameRectangle rectangle, String name, String defaultValue) {
+		String formId = generateFormId();
+		FormFormattedTextElement formattedTextElement = mElement
+				.newFormFormattedTextElement(formId);
+		// create control according to the field type
+		Field fieldForm = null;
+		String defaultControl = null;
+		String controlImpl = null;
+		switch (type) {
+		case DATE_FIELD:
+			defaultControl = OOFormProvider.FORM_PROPERTY_VALUE_DATEFIELD;
+			controlImpl = OOFormProvider.OO_CONTROL_IMPLEMENTATION_DATEFIELD;
+			fieldForm = new DateField(formattedTextElement);
+			break;
+		case TIME_FIELD:
+			defaultControl = OOFormProvider.FORM_PROPERTY_VALUE_TIMEFIELD;
+			controlImpl = OOFormProvider.OO_CONTROL_IMPLEMENTATION_TIMEFIELD;
+			fieldForm = new TimeField(formattedTextElement);
+			break;
+		case NUMERIC_FIELD:
+			defaultControl = OOFormProvider.FORM_PROPERTY_VALUE_NUMERICFIELD;
+			controlImpl = OOFormProvider.OO_CONTROL_IMPLEMENTATION_NUMERICFIELD;
+			fieldForm = new NumericField(formattedTextElement);
+			break;
+		case PATTERN_FIELD:
+			defaultControl = OOFormProvider.FORM_PROPERTY_VALUE_PATTERNFIELD;
+			controlImpl = OOFormProvider.OO_CONTROL_IMPLEMENTATION_PATTERNFIELD;
+			fieldForm = new PatternField(formattedTextElement);
+			break;
+		case CURRENCY_FIELD:
+			defaultControl = OOFormProvider.FORM_PROPERTY_VALUE_CURRENCYFIELD;
+			controlImpl = OOFormProvider.OO_CONTROL_IMPLEMENTATION_CURRENCYFIELD;
+			fieldForm = new CurrencyField(formattedTextElement);
+			break;
+		}
+		if (fieldForm == null)
+			throw new RuntimeException("Fail to create a field.");
+		Component.registerComponent(fieldForm, formattedTextElement);
+		// set control properties
+		fieldForm.setName(name);
+		fieldForm.setId(formId);
+		fieldForm.setControlImplementation(controlImpl);
+		fieldForm.setValue(defaultValue);
+		fieldForm.setCurrentValue(defaultValue);
+		fieldForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_CONTROLTYPEINMSO, "float",
+				null, null, null, null, 0.0, null);
+		fieldForm.setFormProperty(
+				OOFormProvider.FORM_PROPERTY_NAME_DEFAULTCONTROL, "string",
+				defaultControl, null, null, null, null, null);
+		// bond to drawing shape
+		fieldForm.createDrawControl(parent);
+		// set default shape properties
+		if (parent instanceof TextDocument) {
+			fieldForm.setAnchorType(AnchorType.TO_PAGE);
+		} else {
+			fieldForm.setAnchorType(AnchorType.TO_PARAGRAPH);
+		}
+		fieldForm.setRectangle(rectangle);
+		return fieldForm;
+
+	}
+
+	private String generateFormId() {
+		return getFormName() + (++controlCount);
+	}
+
+
+	public void setControlImplementation(String controlImpl) {
+		mElement.setFormControlImplementationAttribute(controlImpl);
+	}
+
+
+	public void setFormName(String name) {
+		mElement.setFormNameAttribute(name);
+	}
+
+
+	public void setCommand(String command) {
+		mElement.setFormCommandAttribute(command);
+	}
+
+
+	public void setCommandType(FormCommandType commandType) {
+		mElement.setFormCommandTypeAttribute(commandType.toString());
+	}
+
+
+	public void setDataSource(String dataSource) {
+		mElement.setFormDatasourceAttribute(dataSource);
+	}
+
+
+	public FormFormElement getOdfElement() {
+		return mElement;
+	}
+
+
+	public String getFormName() {
+		return mElement.getFormNameAttribute();
+	}
+
+
+	public String getCommand() {
+		return mElement.getFormCommandAttribute();
+	}
+
+
+	public FormCommandType getCommandType() {
+		return FormCommandType.enumValueOf(mElement
+				.getFormCommandTypeAttribute());
+	}
+
+
+	public String getControlImplementation() {
+		return mElement.getFormControlImplementationAttribute();
+	}
+
+
+	public String getDataSource() {
+		return mElement.getFormDatasourceAttribute();
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/OOFormProvider.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/OOFormProvider.java
new file mode 100644
index 0000000..90df78b
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/OOFormProvider.java
@@ -0,0 +1,99 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFormsElement;
+
+/**
+ * This class provide method to create/get the form instance implemented in
+ * Apache Open Office way.
+ * 
+ * @since 0.8
+ */
+public class OOFormProvider implements FormProvider {
+
+	static final String OO_CONTROL_IMPLEMENTATION_FORM = "ooo:com.sun.star.form.component.Form";
+	static final String OO_CONTROL_IMPLEMENTATION_COMMANDBUTTON = "ooo:com.sun.star.form.component.CommandButton";
+	static final String OO_CONTROL_IMPLEMENTATION_FIXEDTEXT = "ooo:com.sun.star.form.component.FixedText";
+	static final String OO_CONTROL_IMPLEMENTATION_TEXTFEILD = "ooo:com.sun.star.form.component.TextField";
+	static final String OO_CONTROL_IMPLEMENTATION_LISTBOX = "ooo:com.sun.star.form.component.ListBox";
+	static final String OO_CONTROL_IMPLEMENTATION_GROUPBOX = "ooo:com.sun.star.form.component.GroupBox";
+	static final String OO_CONTROL_IMPLEMENTATION_COMBOBOX = "ooo:com.sun.star.form.component.ComboBox";
+	static final String OO_CONTROL_IMPLEMENTATION_RADIOBUTTON = "ooo:com.sun.star.form.component.RadioButton";
+	static final String OO_CONTROL_IMPLEMENTATION_CHECKBOX = "ooo:com.sun.star.form.component.CheckBox";
+	static final String OO_CONTROL_IMPLEMENTATION_DATEFIELD = "ooo:com.sun.star.form.component.DateField";
+	static final String OO_CONTROL_IMPLEMENTATION_TIMEFIELD = "ooo:com.sun.star.form.component.TimeField";
+	static final String OO_CONTROL_IMPLEMENTATION_NUMERICFIELD = "ooo:com.sun.star.form.component.NumericField";
+	static final String OO_CONTROL_IMPLEMENTATION_PATTERNFIELD = "ooo:com.sun.star.form.component.PatternField";
+	static final String OO_CONTROL_IMPLEMENTATION_CURRENCYFIELD = "ooo:com.sun.star.form.component.CurrencyField";
+
+	static final String FORM_PROPERTY_VALUE_COMMANDBUTTON = "com.sun.star.form.control.CommandButton";
+	static final String FORM_PROPERTY_VALUE_TEXTFEILD = "com.sun.star.form.control.TextField";
+	static final String FORM_PROPERTY_VALUE_LISTBOX = "com.sun.star.form.control.ListBox";
+	static final String FORM_PROPERTY_VALUE_COMBOBOX = "com.sun.star.form.control.ComboBox";
+	static final String FORM_PROPERTY_VALUE_RADIOBUTTON = "com.sun.star.form.control.RadioButton";
+	static final String FORM_PROPERTY_VALUE_CHECKBOX = "com.sun.star.form.control.CheckBox";
+	static final String FORM_PROPERTY_VALUE_DATEFIELD = "com.sun.star.form.control.DateField";
+	static final String FORM_PROPERTY_VALUE_TIMEFIELD = "com.sun.star.form.control.TimeField";
+	static final String FORM_PROPERTY_VALUE_NUMERICFIELD = "com.sun.star.form.control.NumericField";
+	static final String FORM_PROPERTY_VALUE_PATTERNFIELD = "com.sun.star.form.control.PatternField";
+	static final String FORM_PROPERTY_VALUE_CURRENCYFIELD = "com.sun.star.form.control.CurrencyField";
+
+	static final String FORM_PROPERTY_NAME_DEFAULTCONTROL = "DefaultControl";
+	static final String FORM_PROPERTY_NAME_OBJIDINMSO = "ObjIDinMSO";
+	static final String FORM_PROPERTY_NAME_MULTILINE = "MultiLine";
+	static final String FORM_PROPERTY_NAME_COMPLEXSTRINGITEMLIST = "ComplexStringItemList";
+	static final String FORM_PROPERTY_NAME_CONTROLTYPEINMSO = "ControlTypeinMSO";
+	static final String FORM_PROPERTY_NAME_FOCUSEDITEM = "FocusedItem";
+	static final String FORM_PROPERTY_NAME_EXTMULTISELECTION = "ExtMultiSelection";
+	static final String FORM_PROPERTY_NAME_SPIN = "Spin";
+	static final String FORM_PROPERTY_NAME_DROPDOWN = "Dropdown";
+	public static final String FORM_PROPERTY_NAME_DECIMALACCURACY = "DecimalAccuracy";
+	public static final String FORM_PROPERTY_NAME_VALUESTEP = "ValueStep";
+	public static final String FORM_PROPERTY_NAME_EDITMASK = "EditMask";
+	public static final String FORM_PROPERTY_NAME_LITERALMASK = "LiteralMask";
+	public static final String FORM_PROPERTY_NAME_CURRENCYSYMBOL = "CurrencySymbol";
+	public static final String FORM_PROPERTY_NAME_PREPENDCURRENCYSYMBOL = "PrependCurrencySymbol";
+
+	static enum FieldType {
+		DATE_FIELD, TIME_FIELD, NUMERIC_FIELD, PATTERN_FIELD, CURRENCY_FIELD;
+	}
+
+	/**
+	 * Create a form in Apache Open Office way.
+	 * 
+	 * @see FormProvider#createForm(String, OfficeFormsElement)
+	 */
+	public Form createForm(String name, OfficeFormsElement parent) {
+
+		return OOForm.createForm(name, parent);
+	}
+
+	/**
+	 * Get a form instance implemented in Apache Open Office way.
+	 * 
+	 * @see FormProvider#getInstanceOf(FormFormElement)
+	 */
+	public Form getInstanceOf(FormFormElement element) {
+		return OOForm.getInstance(element);
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/PatternField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/PatternField.java
new file mode 100644
index 0000000..a60a87a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/PatternField.java
@@ -0,0 +1,66 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+
+public class PatternField extends Field {
+
+	PatternField(FormFormattedTextElement element) {
+		super(element);
+	}
+
+
+	/**
+	 * Get an instance of pattern field by an instance of FormFormattedTextElement,
+	 * while searching the document content to make a bind with the DrawControl
+	 * which already reference to this pattern field.
+	 * 
+	 * @param element
+	 *            - an instance of FormFormattedTextElement
+	 * @return an instance of pattern field
+	 */
+	public static PatternField getInstanceOf(FormFormattedTextElement element) {
+		PatternField field = new PatternField(element);
+		try {
+			field.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(PatternField.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this field.");
+		}
+		return field;
+	}
+
+	public void setEditMask(String mask) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_EDITMASK,
+				"string", mask, null, null, null, null, null);
+	}
+
+	public void setLiteralMask(String mask) {
+		this.setFormProperty(OOFormProvider.FORM_PROPERTY_NAME_LITERALMASK,
+				"string", mask, null, null, null, null, null);
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/RadioButton.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/RadioButton.java
new file mode 100644
index 0000000..a8f0cc3
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/RadioButton.java
@@ -0,0 +1,246 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.form.FormRadioElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.draw.Control;
+
+/**
+ * This class represents the form control of radio button, provides methods to
+ * get/set the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class RadioButton extends FormControl {
+
+	RadioButton(FormRadioElement element) {
+		mElement = element;
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of radio button by an instance of FormRadioElement, while
+	 * searching the document content to make a bind with the DrawControl which
+	 * already reference to this radio button.
+	 * 
+	 * @param element
+	 *            - an instance of FormRadioElement
+	 * @return an instance of radio button
+	 */
+	public static RadioButton getInstanceOf(FormRadioElement element) {
+		RadioButton radio = new RadioButton(element);
+		try {
+			radio.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(RadioButton.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this radio button.");
+		}
+		return radio;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		((FormRadioElement) mElement)
+				.setFormControlImplementationAttribute(controlImpl);
+	}
+
+	@Override
+	public String getId() {
+		return ((FormRadioElement) mElement).getFormIdAttribute();
+	}
+
+	@Override
+	public void setId(String id) {
+		((FormRadioElement) mElement).setFormIdAttribute(id);
+	}
+
+	@Override
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null)
+			mFormProperties = ((FormRadioElement) mElement)
+					.newFormPropertiesElement();
+		return mFormProperties;
+	}
+
+	/**
+	 * Set the label content of this radio button
+	 * 
+	 * @param label
+	 *            - the label content of this radio button
+	 */
+	public void setLabel(String label) {
+		((FormRadioElement) mElement).setFormLabelAttribute(label);
+	}
+
+	/**
+	 * Get the label content of this radio button
+	 * 
+	 * @return the label content of this radio button
+	 */
+	public String getLabel() {
+		return ((FormRadioElement) mElement).getFormLabelAttribute();
+	}
+
+	@Override
+	public String getName() {
+		return ((FormRadioElement) mElement).getFormNameAttribute();
+	}
+
+	@Override
+	public void setName(String name) {
+		((FormRadioElement) mElement).setFormNameAttribute(name);
+	}
+
+	/**
+	 * Get the default value of this control.
+	 * 
+	 * @param default value
+	 */
+	public String getValue() {
+		return ((FormRadioElement) mElement).getFormValueAttribute();
+	}
+
+	/**
+	 * Set the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @param value
+	 *            - default value
+	 */
+	public void setValue(String value) {
+		((FormRadioElement) mElement).setFormValueAttribute(value);
+	}
+
+	/**
+	 * Set the default selection status of this radio button
+	 * 
+	 * @param isSelected
+	 *            - true means selected; false means unselected
+	 */
+	public void setDefaultSelected(boolean isSelected) {
+		((FormRadioElement) mElement).setFormSelectedAttribute(isSelected);
+	}
+
+	/**
+	 * Get the default selection status of this radio button
+	 * 
+	 * @return true means selected; false means unselected
+	 */
+	public boolean getDefaultSelected() {
+		return ((FormRadioElement) mElement).getFormSelectedAttribute();
+	}
+
+	/**
+	 * Set current selection status of this radio button, it override the
+	 * default status
+	 * 
+	 * @param isSelected
+	 *            - true means selected; false means unselected
+	 */
+	public void setCurrentSelected(boolean isSelected) {
+		((FormRadioElement) mElement)
+				.setFormCurrentSelectedAttribute(isSelected);
+	}
+
+	/**
+	 * Get current selection status of this radio button
+	 * 
+	 * @return true means selected; false means unselected
+	 */
+	public boolean getCurrentSelected() {
+		return ((FormRadioElement) mElement).getFormCurrentSelectedAttribute();
+	}
+
+	/**
+	 * Get a simple iterator for radio buttons.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the radio buttons
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleRadioButtonIterator(container);
+	}
+
+	private static class SimpleRadioButtonIterator implements
+			Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private RadioButton nextElement = null;
+		private RadioButton tempElement = null;
+
+		private SimpleRadioButtonIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public RadioButton next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+		}
+
+		private RadioButton findNext(RadioButton thisRadioButton) {
+			FormRadioElement nextRadioButton = null;
+			if (thisRadioButton == null) {
+				nextRadioButton = OdfElement.findFirstChildNode(
+						FormRadioElement.class, containerElement);
+			} else {
+				nextRadioButton = OdfElement
+						.findNextChildNode(FormRadioElement.class,
+								thisRadioButton.getOdfElement());
+			}
+
+			if (nextRadioButton != null) {
+				return RadioButton.getInstanceOf(nextRadioButton);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/TextBox.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/TextBox.java
new file mode 100644
index 0000000..fc66ccc
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/TextBox.java
@@ -0,0 +1,285 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.xerces.dom.ParentNode;
+import org.odftoolkit.odfdom.dom.element.form.FormFormElement;
+import org.odftoolkit.odfdom.dom.element.form.FormPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.form.FormTextElement;
+import org.odftoolkit.odfdom.dom.element.form.FormTextareaElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.draw.Control;
+import org.w3c.dom.Node;
+
+/**
+ * This class represents the form control of Text Box, provides methods to
+ * get/set the form properties and the style formatting of this control.
+ * 
+ * @since 0.8
+ */
+public class TextBox extends FormControl {
+	private boolean isMultipleLine = false;
+
+	TextBox(OdfElement element) {
+		if (element instanceof FormTextareaElement) {
+			isMultipleLine = true;
+			mElement = (FormTextareaElement) element;
+		} else {
+			mElement = (FormTextElement) element;
+		}
+		formElement = (FormFormElement) element.getParentNode();
+	}
+
+	/**
+	 * Get an instance of text box by an instance of OdfElement, while searching
+	 * the document content to make a bind with the DrawControl which already
+	 * reference to this text box.
+	 * 
+	 * @param element
+	 *            - an instance of OdfElement
+	 * @return an instance of text box
+	 */
+	public static TextBox getInstanceOf(OdfElement element) {
+		TextBox textbox = new TextBox(element);
+		try {
+			textbox.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(TextBox.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this textbox.");
+		}
+		return textbox;
+	}
+
+	@Override
+	FormPropertiesElement getFormPropertiesElementForWrite() {
+		if (mFormProperties == null) {
+			if (isMultipleLine) {
+				mFormProperties = ((FormTextareaElement) mElement)
+						.newFormPropertiesElement();
+			} else {
+				mFormProperties = ((FormTextElement) mElement)
+						.newFormPropertiesElement();
+			}
+		}
+		return mFormProperties;
+	}
+
+	@Override
+	public void setControlImplementation(String controlImpl) {
+		if (isMultipleLine) {
+			((FormTextareaElement) mElement)
+					.setFormControlImplementationAttribute(controlImpl);
+		} else {
+			((FormTextElement) mElement)
+					.setFormControlImplementationAttribute(controlImpl);
+		}
+
+	}
+
+	@Override
+	public String getId() {
+		String formId;
+		if (isMultipleLine) {
+			formId = ((FormTextareaElement) mElement).getFormIdAttribute();
+		} else {
+			formId = ((FormTextElement) mElement).getFormIdAttribute();
+		}
+		return formId;
+	}
+
+	@Override
+	public void setId(String id) {
+		if (isMultipleLine) {
+			((FormTextareaElement) mElement).setFormIdAttribute(id);
+		} else {
+			((FormTextElement) mElement).setFormIdAttribute(id);
+		}
+	}
+
+	@Override
+	public String getName() {
+		String name;
+		if (isMultipleLine) {
+			name = ((FormTextareaElement) mElement).getFormNameAttribute();
+		} else {
+			name = ((FormTextElement) mElement).getFormNameAttribute();
+		}
+		return name;
+	}
+
+	@Override
+	public void setName(String name) {
+		if (isMultipleLine) {
+			((FormTextareaElement) mElement).setFormNameAttribute(name);
+		} else {
+			((FormTextElement) mElement).setFormNameAttribute(name);
+		}
+	}
+
+	/**
+	 * Set the default value of this control, it will be override by current
+	 * value.
+	 * 
+	 * @param value
+	 *            - default value
+	 */
+	public void setValue(String defaultValue) {
+		if (isMultipleLine) {
+			((FormTextareaElement) mElement)
+					.setFormValueAttribute(defaultValue);
+		} else {
+			((FormTextElement) mElement).setFormValueAttribute(defaultValue);
+		}
+	}
+
+	/**
+	 * Get the default value of this control
+	 * 
+	 * @return default value
+	 */
+	public String getValue() {
+		if (isMultipleLine) {
+			return ((FormTextareaElement) mElement).getFormValueAttribute();
+		} else {
+			return ((FormTextElement) mElement).getFormValueAttribute();
+		}
+	}
+
+	/**
+	 * Set the current value of this control, it override the default value.
+	 * 
+	 * @param currentValue
+	 *            - current value
+	 */
+	public void setCurrentValue(String currentValue) {
+		if (isMultipleLine) {
+			((FormTextareaElement) mElement)
+					.setFormCurrentValueAttribute(currentValue);
+		} else {
+			((FormTextElement) mElement)
+					.setFormCurrentValueAttribute(currentValue);
+		}
+	}
+
+	/**
+	 * Get the current value of this control
+	 * 
+	 * @return current value
+	 */
+	public String getCurrentValue() {
+		if (isMultipleLine) {
+			return ((FormTextareaElement) mElement)
+					.getFormCurrentValueAttribute();
+		} else {
+			return ((FormTextElement) mElement).getFormCurrentValueAttribute();
+		}
+	}
+
+	/**
+	 * Get a simple iterator for text boxes.
+	 * 
+	 * @param container
+	 *            - an instance of form where to traverse the text boxes
+	 */
+	public static Iterator<FormControl> getSimpleIterator(Form container) {
+		return new SimpleTextBoxIterator(container);
+	}
+
+	private static class SimpleTextBoxIterator implements Iterator<FormControl> {
+
+		private FormFormElement containerElement;
+		private TextBox nextElement = null;
+		private TextBox tempElement = null;
+
+		private SimpleTextBoxIterator(Form container) {
+			containerElement = container.getOdfElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public TextBox next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+		}
+
+		private TextBox findNext(TextBox thisTextBox) {
+			OdfElement nextTextBox = null;
+			if (thisTextBox == null) {
+				if (containerElement != null
+						&& containerElement instanceof ParentNode) {
+					Node node = ((ParentNode) containerElement).getFirstChild();
+					while ((node != null)
+							&& !FormTextareaElement.class.isInstance(node)
+							&& !FormTextElement.class.isInstance(node)) {
+						node = node.getNextSibling();
+					}
+					if (node != null) {
+						nextTextBox = (OdfElement) node;
+					}
+				}
+			} else {
+				Node refNode = thisTextBox.getOdfElement();
+				if (refNode != null) {
+					Node node = refNode.getNextSibling();
+					while (node != null
+							&& !FormTextareaElement.class.isInstance(node)
+							&& !FormTextElement.class.isInstance(node)) {
+						node = node.getNextSibling();
+					}
+
+					if (node != null) {
+						nextTextBox = (OdfElement) node;
+					}
+				}
+			}
+			if (nextTextBox != null) {
+				return TextBox.getInstanceOf(nextTextBox);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/form/TimeField.java b/trunk/simple/src/main/java/org/odftoolkit/simple/form/TimeField.java
new file mode 100644
index 0000000..c4323b2
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/form/TimeField.java
@@ -0,0 +1,123 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.form.FormFormattedTextElement;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute.Value;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.Document;
+
+public class TimeField extends Field {
+
+	TimeField(FormFormattedTextElement element) {
+		super(element);
+	}
+
+	/**
+	 * Get an instance of time field by an instance of FormFormattedTextElement,
+	 * while searching the document content to make a bind with the DrawControl
+	 * which already reference to this time field.
+	 * 
+	 * @param element
+	 *            - an instance of FormFormattedTextElement
+	 * @return an instance of time field
+	 */
+	public static TimeField getInstanceOf(FormFormattedTextElement element) {
+		TimeField field = new TimeField(element);
+		try {
+			field.loadDrawControl(((Document) ((OdfFileDom) element
+					.getOwnerDocument()).getDocument()).getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(TimeField.class.getName()).log(Level.WARNING,
+					"Cannot load the drawing shape of this field.");
+		}
+		return field;
+	}
+
+	/**
+	 * Format the time value according to the appointed format and locale.
+	 * 
+	 * @param formatStr
+	 *            - format code
+	 * @param locale
+	 *            - locale information
+	 */
+
+	public void setTimeFormat(String formatStr, Locale locale) {
+		this.setFormatString(formatStr, Value.TIME, locale);
+	}
+
+	/**
+	 * Set the format of this time field. Time format pattern is the same as
+	 * {@link java.text.SimpleDateFormat SimpleDateFormat}.
+	 * 
+	 * @param formatStr
+	 *            the format string of this date.
+	 * @see java.text.SimpleDateFormat
+	 */
+	public void formatTime(String formatStr, Locale locale) {
+		if (drawingShape == null)
+			throw new IllegalStateException(
+					"Please call loadDrawControl() first.");
+		DrawControlElement element = drawingShape.getOdfElement();
+		String name = getUniqueTimeStyleName();
+		OdfNumberTimeStyle timeStyle = new OdfNumberTimeStyle(
+				(OdfFileDom) element.getOwnerDocument(), formatStr, name);
+		timeStyle.setNumberLanguageAttribute(locale.getLanguage());
+		timeStyle.setNumberCountryAttribute(locale.getCountry());
+		element.getAutomaticStyles().appendChild(timeStyle);
+		OdfStyleBase styleElement = drawingShape.getStyleHandler()
+				.getStyleElementForWrite();
+		if (styleElement != null) {
+			styleElement.setOdfAttributeValue(OdfName.newName(
+					OdfDocumentNamespace.STYLE, "data-style-name"), name);
+		}
+	}
+
+	private String getUniqueTimeStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = getDrawControl()
+				.getOdfElement().getAutomaticStyles();
+		do {
+			unique_name = String.format("t%06x",
+					(int) (Math.random() * 0xffffff));
+		} while (styles.getDateStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	/**
+	 * Get the format code which is used to format the display value
+	 * 
+	 * @return the format code
+	 */
+	public String getTimeFormat() {
+		return this.getFormatString(Value.TIME);
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/meta/DocumentStatistic.java b/trunk/simple/src/main/java/org/odftoolkit/simple/meta/DocumentStatistic.java
new file mode 100644
index 0000000..800a1de
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/meta/DocumentStatistic.java
@@ -0,0 +1,434 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.simple.meta;
+
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+
+/**
+ * <code>DocumentStatistic</code> feature specifies the statistics about
+ * the document.
+ * 
+ */
+public class DocumentStatistic {
+
+	private MetaDocumentStatisticElement mDocStatistic;
+
+	/**
+	 * Constructor of <code>DocumentStatistic</code> feature.
+	 * 
+	 * @param docStatistic
+	 *            the <code>MetaDocumentStatisticElement</code> represent this
+	 *            feature
+	 */
+	public DocumentStatistic(MetaDocumentStatisticElement docStatistic) {
+		this.mDocStatistic = docStatistic;
+	}
+
+	/**
+	 * Get the instance of <code>MetaDocumentStatisticElement</code> which represents this
+	 * feature.
+	 * 
+	 * @return an instance of <code>MetaDocumentStatisticElement</code>
+	 */
+	private MetaDocumentStatisticElement getMetaDocumentStatisticElement() {
+		return mDocStatistic;
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaCellCountAttribute</code>.
+	 * 
+	 * @return the number of table cells contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaCellCountAttribute
+	 */
+	public Integer getCellCount() {
+		return mDocStatistic.getMetaCellCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaCellCountAttribute</code> .
+	 * 
+	 * @param cellCount	the number of table cells need to be set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaCellCountAttribute
+	 *            
+	 */
+	public void setCellCount(int cellCount) {
+		mDocStatistic.setMetaCellCountAttribute(cellCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaCharacterCountAttribute</code> .
+	 * 
+	 * @return the number of characters contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaCharacterCountAttribute
+	 */
+	public Integer getCharacterCount() {
+		return mDocStatistic.getMetaCharacterCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaCharacterCountAttribute</code>.
+	 * 
+	 * @param characterCount	the number of characters need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaCharacterCountAttribute
+	 */
+	public void setCharacterCount(Integer characterCount) {
+		mDocStatistic.setMetaCharacterCountAttribute(characterCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaDrawCountAttribute</code> .
+	 * 
+	 * @return the number of all the graphic related element in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaDrawCountAttribute
+	 */
+	public Integer getDrawCount() {
+		return mDocStatistic.getMetaDrawCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaDrawCountAttribute</code>.
+	 * 
+	 * @param drawCount	the number of all the graphic related element need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaDrawCountAttribute
+	 */
+	public void setDrawCount(Integer drawCount) {
+		mDocStatistic.setMetaDrawCountAttribute(drawCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaFrameCountAttribute</code>.
+	 * 
+	 * @return the number of <code><draw:frame></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaFrameCountAttribute
+	 */
+	public Integer getFrameCount() {
+		return mDocStatistic.getMetaFrameCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaFrameCountAttribute</code> .
+	 * 
+	 * @param frameCount the number of <code><draw:frame></code> element need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaFrameCountAttribute
+	 */
+	public void setFrameCount(Integer frameCount) {
+		mDocStatistic.setMetaFrameCountAttribute(frameCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaImageCountAttribute</code> .
+	 * 
+	 * @return the number of <code><draw:image></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaImageCountAttribute
+	 */
+	public Integer getImageCount() {
+		return mDocStatistic.getMetaImageCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaImageCountAttribute</code> .
+	 * 
+	 * @param imageCount the number of <code><draw:image></code> element need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaImageCountAttribute
+	 */
+	public void setImageCount(Integer imageCount) {
+		mDocStatistic.setMetaImageCountAttribute(imageCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaNonWhitespaceCharacterCountAttribute</code>.
+	 * 
+	 * @return the number of non-whitespace characters contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaNonWhitespaceCharacterCountAttribute
+	 */
+	public Integer getNonWhitespaceCharacterCount() {
+		return mDocStatistic.getMetaNonWhitespaceCharacterCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaNonWhitespaceCharacterCountAttribute</code>.
+	 * 
+	 * @param nonWhitespaceCharacterCount	the number of non-whitespace characters need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaNonWhitespaceCharacterCountAttribute
+	 */
+	public void setNonWhitespaceCharacterCount(
+			Integer nonWhitespaceCharacterCount) {
+		mDocStatistic
+				.setMetaNonWhitespaceCharacterCountAttribute(nonWhitespaceCharacterCount);
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaObjectCountAttribute</code>
+	 * 
+	 * @return the number of <code><draw:object></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaObjectCountAttribute
+	 */
+	public Integer getObjectCount() {
+		return mDocStatistic.getMetaObjectCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaObjectCountAttribute</code>.
+	 * 
+	 * @param objectCount the number of <code><draw:object></code> element need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaObjectCountAttribute
+	 */
+	public void setObjectCount(Integer objectCount) {
+		mDocStatistic.setMetaObjectCountAttribute(objectCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaOleObjectCountAttribute</code>.
+	 * 
+	 * @return the number of <code><draw:object-ole></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaOleObjectCountAttribute
+	 */
+	public Integer getOleObjectCount() {
+		return mDocStatistic.getMetaOleObjectCountAttribute();
+
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaOleObjectCountAttribute</code>.
+	 * 
+	 * @param oleObjectCount the number of <code><draw:object-ole></code> element need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaOleObjectCountAttribute
+	 */
+	public void setOleObjectCount(Integer oleObjectCount) {
+		mDocStatistic.setMetaOleObjectCountAttribute(oleObjectCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaPageCountAttribute</code>.
+	 * 
+	 * @return the number of page count contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaPageCountAttribute
+	 */
+	public Integer getPageCount() {
+		return mDocStatistic.getMetaPageCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaPageCountAttribute</code>.
+	 * 
+	 * @param pageCount the number of page count need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaPageCountAttribute
+	 */
+	public void setPageCount(Integer pageCount) {
+		mDocStatistic.setMetaPageCountAttribute(pageCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaParagraphCountAttribute</code>.
+	 * 
+	 * @return the number of <code><text:p></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaParagraphCountAttribute
+	 */
+	public Integer getParagraphCount() {
+		return mDocStatistic.getMetaParagraphCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaParagraphCountAttribute</code>.
+	 * 
+	 * @param paragraphCount the number of <code><text:p></code> element need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaParagraphCountAttribute
+	 */
+	public void setParagraphCount(Integer paragraphCount) {
+		mDocStatistic.setMetaParagraphCountAttribute(paragraphCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaRowCountAttribute</code>.
+	 * 
+	 * @return the number of lines contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaRowCountAttribute
+	 */
+	public Integer getRowCount() {
+		return mDocStatistic.getMetaRowCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaRowCountAttribute</code>.
+	 * 
+	 * @param rowCount the number of lines need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaRowCountAttribute
+	 */
+	public void setRowCount(Integer rowCount) {
+		mDocStatistic.setMetaRowCountAttribute(rowCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaSentenceCountAttribute</code>.
+	 * 
+	 * @return the number of sentences contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaSentenceCountAttribute.
+	 */
+	public Integer getSentenceCount() {
+		return mDocStatistic.getMetaSentenceCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaSentenceCountAttribute</code>.
+	 * 
+	 * @param sentenceCount the number of sentences need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaSentenceCountAttribute.
+	 */
+	public void setSentenceCount(Integer sentenceCount) {
+		mDocStatistic.setMetaSentenceCountAttribute(sentenceCount);
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaSyllableCountAttribute</code>.
+	 * 
+	 * @return the number of syllables contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaSyllableCountAttribute.
+	 */
+	public Integer getSyllableCount() {
+		return mDocStatistic.getMetaSyllableCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaSyllableCountAttribute</code>.
+	 * 
+	 * @param syllableCount the number of syllables need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaSyllableCountAttribute.
+	 */
+	public void setSyllableCount(Integer syllableCount) {
+		mDocStatistic.setMetaSyllableCountAttribute(syllableCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaTableCountAttribute</code>.
+	 * 
+	 * @return the number of <code><table:table></code> element contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaTableCountAttribute.
+	 */
+	public Integer getTableCount() {
+		return mDocStatistic.getMetaTableCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaTableCountAttribute</code>.
+	 * 
+	 * @param tableCount the number of <code><table:table></code> need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaTableCountAttribute.
+	 */
+	public void setTableCount(Integer tableCount) {
+		mDocStatistic.setMetaTableCountAttribute(tableCount);
+
+	}
+
+	/**
+	 * Receives the value of the odf dom attribute representation
+	 * <code>MetaWordCountAttribute</code>.
+	 * 
+	 * @return the number of words contained in the current document;
+	 * <p>
+	 * <code>null</code>, if the attribute is not set and no default value defined.
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaWordCountAttribute.
+	 */
+	public Integer getWordCount() {
+		return mDocStatistic.getMetaWordCountAttribute();
+	}
+
+	/**
+	 * Sets the value of odf dom attribute representation
+	 * <code>MetaWordCountAttribute</code>.
+	 * 
+	 * @param wordCount the number of words need to set
+	 * @see org.odftoolkit.odfdom.dom.attribute.meta.MetaWordCountAttribute.
+	 */
+	public void setWordCount(Integer wordCount) {
+		mDocStatistic.setMetaWordCountAttribute(wordCount);
+
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/meta/Meta.java b/trunk/simple/src/main/java/org/odftoolkit/simple/meta/Meta.java
new file mode 100644
index 0000000..2c1d717
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/meta/Meta.java
@@ -0,0 +1,833 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple.meta;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDescriptionElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcLanguageElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcSubjectElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcTitleElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaCreationDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingCyclesElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaEditingDurationElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaGeneratorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaInitialCreatorElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintDateElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaPrintedByElement;
+import org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentMetaElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeMetaElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.Duration;
+
+/**
+ * <code>Meta</code> represent the meta data feature in the ODF document.
+ * <p>
+ * It provides convenient method to get meta data info.
+ * 
+ */
+public class Meta {
+
+	private OfficeMetaElement mOfficeMetaElement;
+
+	/**
+	 * Constructor of <code>Meta</code> feature.
+	 * 
+	 * @param metaDom	the file DOM element of meta.xml
+	 */
+	public Meta(OdfFileDom metaDom) {
+		OfficeDocumentMetaElement metaEle = OdfElement.findFirstChildNode(OfficeDocumentMetaElement.class, metaDom);
+		mOfficeMetaElement = OdfElement.findFirstChildNode(OfficeMetaElement.class, metaEle);
+	}
+
+	/**
+	 * Get the instance of <code>OfficeMetaElement</code> which represents this feature.
+	 * 
+	 * @return the instance of OfficeMetaElement
+	 */
+	public OfficeMetaElement getOfficeMetaElement() {
+		return mOfficeMetaElement;
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaGeneratorElement</code>.
+	 * 
+	 * @return the generator info of the current document.
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaGeneratorElement.
+	 */
+	public String getGenerator() {
+		MetaGeneratorElement metaGenerator = OdfElement.findFirstChildNode(
+				MetaGeneratorElement.class, mOfficeMetaElement);
+		if (metaGenerator != null) {
+			return metaGenerator.getTextContent();
+		}
+		return null;
+
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaGeneratorElement</code>.
+	 * 
+	 * @param generator	set the specified document generator.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaGeneratorElement.
+	 */
+	public void setGenerator(String generator) {
+		MetaGeneratorElement metaGenerator = OdfElement.findFirstChildNode(
+				MetaGeneratorElement.class, mOfficeMetaElement);
+		if (metaGenerator == null) {
+			metaGenerator = mOfficeMetaElement.newMetaGeneratorElement();
+		}
+		metaGenerator.setTextContent(generator);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>DcTitleElement</code>.
+	 * 
+	 * @return the title of the current document.
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcTitleElement.
+	 */
+	public String getTitle() {
+
+		DcTitleElement titleEle = OdfElement.findFirstChildNode(
+				DcTitleElement.class, mOfficeMetaElement);
+		if (titleEle != null) {
+			return titleEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>DcTitleElement</code>.
+	 * 
+	 * @param title set the specified document title
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcTitleElement.
+	 */
+	public void setTitle(String title) {
+		DcTitleElement titleEle = OdfElement.findFirstChildNode(
+				DcTitleElement.class, mOfficeMetaElement);
+		if (titleEle == null) {
+			titleEle = mOfficeMetaElement.newDcTitleElement();
+		}
+		titleEle.setTextContent(title);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>DcDescriptionElement</code>.
+	 * 
+	 * @return the description of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcDescriptionElement.
+	 */
+	public String getDescription() {
+		DcDescriptionElement descEle = OdfElement.findFirstChildNode(
+				DcDescriptionElement.class, mOfficeMetaElement);
+		if (descEle != null) {
+			return descEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>DcDescriptionElement</code>.
+	 *
+	 * @param description set the specified document description 
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcDescriptionElement.
+	 */
+	public void setDescription(String description) {
+		DcDescriptionElement descEle = OdfElement.findFirstChildNode(
+				DcDescriptionElement.class, mOfficeMetaElement);
+		if (descEle == null) {
+			descEle = mOfficeMetaElement.newDcDescriptionElement();
+		}
+		descEle.setTextContent(description);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>DcSubjectElement</code>.
+	 * 
+	 * @return the subject of the current document.
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcSubjectElement.
+	 */
+	public String getSubject() {
+		DcSubjectElement subjectEle = OdfElement.findFirstChildNode(
+				DcSubjectElement.class, mOfficeMetaElement);
+		if (subjectEle != null) {
+			return subjectEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>DcSubjectElement</code>.
+	 * 
+	 * @param subject set the specified document subject.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcSubjectElement.
+	 */
+	public void setSubject(String subject) {
+		DcSubjectElement subjectEle = OdfElement.findFirstChildNode(
+				DcSubjectElement.class, mOfficeMetaElement);
+		if (subjectEle == null) {
+			subjectEle = mOfficeMetaElement.newDcSubjectElement();
+		}
+		subjectEle.setTextContent(subject);
+	}
+
+	/**
+	 * Receives the list value of the odf dom element representation
+	 * <code>MetaKeywordElement</code>.
+	 * 
+	 * @return the keywords of the current document.
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement.
+	 */
+	public List<String> getKeywords() {
+		List<String> keywords = new ArrayList<String>();
+		MetaKeywordElement keywordEle = OdfElement.findFirstChildNode(
+				MetaKeywordElement.class, mOfficeMetaElement);
+		if (keywordEle != null) {
+			keywords.add(keywordEle.getTextContent());
+			MetaKeywordElement keywordNext;
+			while ((keywordNext = OdfElement.findNextChildNode(
+					MetaKeywordElement.class, keywordEle)) != null) {
+				keywords.add(keywordNext.getTextContent());
+				keywordEle = keywordNext;
+			}
+			return keywords;
+		} else {
+			return null;
+		}
+
+	}
+
+	/**
+	 * Sets the list value of the odf dom element representation
+	 * <code>MetaKeywordElement</code>.
+	 * 
+	 * @param keyList set the specified list of keywords.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement.
+	 */
+	public void setKeywords(List<String> keyList) {
+		MetaKeywordElement keywordEle = OdfElement.findFirstChildNode(
+				MetaKeywordElement.class, mOfficeMetaElement);
+		List<MetaKeywordElement> toBeDeleted = new ArrayList<MetaKeywordElement>();
+		if (keywordEle != null) {
+			MetaKeywordElement keywordTmp;
+			toBeDeleted.add(keywordEle);
+			while ((keywordTmp = OdfElement.findNextChildNode(
+					MetaKeywordElement.class, keywordEle)) != null) {
+				keywordEle = keywordTmp;
+				toBeDeleted.add(keywordTmp);
+			}
+
+		}
+
+		// remove the original
+		for (MetaKeywordElement keyele : toBeDeleted) {
+			mOfficeMetaElement.removeChild(keyele);
+		}
+		// add new
+		for (int i = 0; i < keyList.size(); i++) {
+			MetaKeywordElement keywordElement = mOfficeMetaElement.newMetaKeywordElement();
+			keywordElement.setTextContent(keyList.get(i));
+		}
+
+	}
+
+	/**
+	 * Add the keyword to the current document.
+	 * Create child element <code>MetaKeywordElement</code>.
+	 * 
+	 * @param keyword	the value of child element <code>MetaKeywordElement</code>.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaKeywordElement.
+	 */
+	public void addKeyword(String keyword) {
+		MetaKeywordElement keywordElement = mOfficeMetaElement.newMetaKeywordElement();
+		keywordElement.setTextContent(keyword);
+	}
+
+	/**
+	 * Receives the list value of the odf dom element representation
+	 * <code>MetaUserDefinedElement</code>.
+	 * 
+	 * @return get the list of user-defined metadata names;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public List<String> getUserDefinedDataNames() {
+		List<String> definedNames = new ArrayList<String>();
+		MetaUserDefinedElement definedEle = OdfElement.findFirstChildNode(
+				MetaUserDefinedElement.class, mOfficeMetaElement);
+		if (definedEle != null) {
+
+			definedNames.add(definedEle.getMetaNameAttribute());
+			MetaUserDefinedElement definedNext;
+			while ((definedNext = OdfElement.findNextChildNode(
+					MetaUserDefinedElement.class, definedEle)) != null) {
+
+				definedNames.add(definedNext.getMetaNameAttribute());
+
+				definedEle = definedNext;
+			}
+			return definedNames;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the odf dom element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @return	the <code>MetaUserDefinedElement</code> which is identified by the specified name;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public MetaUserDefinedElement getUserDefinedElementByAttributeName(
+			String name) {
+		MetaUserDefinedElement definedEle = OdfElement.findFirstChildNode(
+				MetaUserDefinedElement.class, mOfficeMetaElement);
+		if (definedEle != null) {
+			if (definedEle.getMetaNameAttribute().equals(name)) {
+				return definedEle;
+			}
+			MetaUserDefinedElement definedNext;
+			while ((definedNext = OdfElement.findNextChildNode(
+					MetaUserDefinedElement.class, definedEle)) != null) {
+
+				if (definedNext.getMetaNameAttribute().equals(name)) {
+					return definedNext;
+				}
+
+				definedEle = definedNext;
+			}
+			return null;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @return the value of the user-defined metadata with the specified name;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public String getUserDefinedDataValue(String name) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			return definedElement.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Receives the data type of the odf dom element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @return the data type of the user-defined metadata with the specified name;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public String getUserDefinedDataType(String name) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			return definedElement.getMetaValueTypeAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Remove the odf dom element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name.
+	 * 
+	 * @param name	the name of the user-defined metadata
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public void removeUserDefinedDataByName(String name) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			mOfficeMetaElement.removeChild(definedElement);
+		}
+
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name.
+	 * 
+	 * @param name	the name need to set for the user-defined metadata
+	 * @param value  the value need to set for the user-defined metadata
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public void setUserDefinedDataValue(String name, String value) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			definedElement.setTextContent(value);
+		}
+
+	}
+
+	/**
+	 * Sets the data type of the odf dom element representation
+	 * <code>MetaUserDefinedElement</code> by attribute name.
+	 * 
+	 * @param name	the name need to set for the user-defined metadata
+	 * @param value  the value need to set for the user-defined metadata
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public void setUserDefinedDataType(String name, String value) {
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		if (definedElement != null) {
+			definedElement.setMetaValueTypeAttribute(value);
+		}
+
+	}
+
+	/**
+	 * Sets the odf dom element representation
+	 * <code>MetaUserDefinedElement</code>, if the element with the attribute name exists,then
+	 * update;or create a new element if type or value is null,the original will
+	 * not be updated.
+	 * 
+	 * @param name	the name need to set for the user-defined metadata
+	 * @param type	the data type need to set for the user-defined metadata
+	 * @param value	the value need to set for the user-defined metadata
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaUserDefinedElement.
+	 */
+	public void setUserDefinedData(String name, String type, String value) {
+		// test if name exists
+		MetaUserDefinedElement definedElement = getUserDefinedElementByAttributeName(name);
+		// if exists, then update,if parameter is null, then don't change
+		if (definedElement != null) {
+			if (type != null) {
+				definedElement.setMetaValueTypeAttribute(type);
+			}
+			if (value != null) {
+				definedElement.setTextContent(value);
+			}
+		} else {
+			// if not exists, add
+			definedElement = mOfficeMetaElement.newMetaUserDefinedElement(name,
+					type);
+			definedElement.setTextContent(value);
+
+		}
+
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaInitialCreatorElement</code>.
+	 * 
+	 * @return get the initial creator of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaInitialCreatorElement.
+	 */
+	public String getInitialCreator() {
+		MetaInitialCreatorElement iniCreatorEle = OdfElement.findFirstChildNode(MetaInitialCreatorElement.class,
+				mOfficeMetaElement);
+		if (iniCreatorEle != null) {
+			return iniCreatorEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaInitialCreatorElement</code>.
+	 * 
+	 * @param initialCreator set the specified initial creator
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaInitialCreatorElement.
+	 */
+	public void setInitialCreator(String initialCreator) {
+		MetaInitialCreatorElement iniCreatorEle = OdfElement.findFirstChildNode(MetaInitialCreatorElement.class,
+				mOfficeMetaElement);
+		if (iniCreatorEle == null) {
+			iniCreatorEle = mOfficeMetaElement.newMetaInitialCreatorElement();
+		}
+		iniCreatorEle.setTextContent(initialCreator);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>DcCreatorElement</code>.
+	 * 
+	 * @return the creator of the current document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcCreatorElement.
+	 */
+	public String getCreator() {
+		DcCreatorElement creatorEle = OdfElement.findFirstChildNode(
+				DcCreatorElement.class, mOfficeMetaElement);
+		if (creatorEle != null) {
+			return creatorEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>DcCreatorElement</code>.
+	 * 
+	 * @param creator set the specified creator
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcCreatorElement.
+	 */
+	public void setCreator(String creator) {
+		DcCreatorElement creatorEle = OdfElement.findFirstChildNode(
+				DcCreatorElement.class, mOfficeMetaElement);
+		if (creatorEle == null) {
+			creatorEle = mOfficeMetaElement.newDcCreatorElement();
+		}
+		creatorEle.setTextContent(creator);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaPrintedByElement</code>
+	 * 
+	 * @return the name of the last person who printed the current document;
+	 * <p>
+	 * <code>null</code>, if element is not set
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaPrintedByElement.
+	 */
+	public String getPrintedBy() {
+		MetaPrintedByElement printedByEle = OdfElement.findFirstChildNode(
+				MetaPrintedByElement.class, mOfficeMetaElement);
+		if (printedByEle != null) {
+			return printedByEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaPrintedByElement</code>.
+	 * 
+	 * @param printedBy	the name need to set for the last person who printed the current document
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaPrintedByElement.
+	 */
+	public void setPrintedBy(String printedBy) {
+		MetaPrintedByElement printedByEle = OdfElement.findFirstChildNode(
+				MetaPrintedByElement.class, mOfficeMetaElement);
+		if (printedByEle == null) {
+			printedByEle = mOfficeMetaElement.newMetaPrintedByElement();
+		}
+		printedByEle.setTextContent(printedBy);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaCreationDateElement</code>
+	 * 
+	 * @return the date and time when the document was created initially;
+	 * <p>
+	 * <code>null</code>, if element is not set
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaCreationDateElement.
+	 */
+	public Calendar getCreationDate() {
+		MetaCreationDateElement creationDateEle = OdfElement.findFirstChildNode(MetaCreationDateElement.class,
+				mOfficeMetaElement);
+		if (creationDateEle != null) {
+			return stringToCalendar(creationDateEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaCreationDateElement</code> .
+	 * 
+	 * @param creationDate	the date and time need to set
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaCreationDateElement.
+	 */
+	public void setCreationDate(Calendar creationDate) {
+		MetaCreationDateElement creationDateEle = OdfElement.findFirstChildNode(MetaCreationDateElement.class,
+				mOfficeMetaElement);
+		if (creationDateEle == null) {
+			creationDateEle = mOfficeMetaElement.newMetaCreationDateElement();
+		}
+		creationDateEle.setTextContent(calendarToString(creationDate));
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>DcDateElement</code>.
+	 * 
+	 * @return the date and time when the document was last modified;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcDateElement.
+	 */
+	public Calendar getDcdate() {
+		DcDateElement dcDateEle = OdfElement.findFirstChildNode(
+				DcDateElement.class, mOfficeMetaElement);
+		if (dcDateEle != null) {
+			return stringToCalendar(dcDateEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>DcDateElement</code>.
+	 * 
+	 * @param dcdate	the date and time need to set
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcDateElement.
+	 */
+	public void setDcdate(Calendar dcdate) {
+		DcDateElement dcDateEle = OdfElement.findFirstChildNode(
+				DcDateElement.class, mOfficeMetaElement);
+		if (dcDateEle == null) {
+			dcDateEle = mOfficeMetaElement.newDcDateElement();
+		}
+		dcDateEle.setTextContent(calendarToString(dcdate));
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaPrintDateElement</code>.
+	 * 
+	 * @return the date and time when the document was last printed;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaPrintDateElement
+	 */
+	public Calendar getPrintDate() {
+		MetaPrintDateElement printDateEle = OdfElement.findFirstChildNode(
+				MetaPrintDateElement.class, mOfficeMetaElement);
+		if (printDateEle != null) {
+			return stringToCalendar(printDateEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaPrintDateElement</code>.
+	 * 
+	 * @param printDate	the date and time need to set
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaPrintDateElement
+	 */
+	public void setPrintDate(Calendar printDate) {
+		MetaPrintDateElement printDateEle = OdfElement.findFirstChildNode(
+				MetaPrintDateElement.class, mOfficeMetaElement);
+		if (printDateEle == null) {
+			printDateEle = mOfficeMetaElement.newMetaPrintDateElement();
+		}
+		printDateEle.setTextContent(calendarToString(printDate));
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>DcLanguageElement</code>.
+	 * 
+	 * @return the default language of the document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcLanguageElement
+	 */
+	public String getLanguage() {
+		DcLanguageElement languageEle = OdfElement.findFirstChildNode(
+				DcLanguageElement.class, mOfficeMetaElement);
+		if (languageEle != null) {
+			return languageEle.getTextContent();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>DcLanguageElement</code>.
+	 * 
+	 * @param language the default language need to set fo the current document
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DcLanguageElement
+	 */
+	public void setLanguage(String language) {
+		DcLanguageElement languageEle = OdfElement.findFirstChildNode(
+				DcLanguageElement.class, mOfficeMetaElement);
+		if (languageEle == null) {
+			languageEle = mOfficeMetaElement.newDcLanguageElement();
+		}
+		languageEle.setTextContent(language);
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaEditingCyclesElement</code> .
+	 * 
+	 * @return the number of times that the document has been edited;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaEditingCyclesElement
+	 */
+	public Integer getEditingCycles() {
+		MetaEditingCyclesElement editingCyclesEle = OdfElement.findFirstChildNode(MetaEditingCyclesElement.class,
+				mOfficeMetaElement);
+		if (editingCyclesEle != null) {
+			return Integer.valueOf(editingCyclesEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaEditingCyclesElement</code> .
+	 * 
+	 * @param editingCycles	set the specified edit times
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaEditingCyclesElement
+	 */
+	public void setEditingCycles(Integer editingCycles) {
+		MetaEditingCyclesElement editingCyclesEle = OdfElement.findFirstChildNode(MetaEditingCyclesElement.class,
+				mOfficeMetaElement);
+		if (editingCyclesEle == null) {
+			editingCyclesEle = mOfficeMetaElement.newMetaEditingCyclesElement();
+		}
+		editingCyclesEle.setTextContent(String.valueOf(editingCycles));
+	}
+
+	/**
+	 * Receives the value of the odf dom element representation
+	 * <code>MetaEditingDurationElement</code>.
+	 * 
+	 * @return the total time spent editing the document;
+	 * <p>
+	 * <code>null</code>, if the element is not set.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaEditingDurationElement
+	 */
+	public Duration getEditingDuration() {
+		MetaEditingDurationElement editiingDurationEle = OdfElement.findFirstChildNode(MetaEditingDurationElement.class,
+				mOfficeMetaElement);
+		if (editiingDurationEle != null) {
+			return Duration.valueOf(editiingDurationEle.getTextContent());
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the value of the odf dom element representation
+	 * <code>MetaEditingDurationElement</code>.
+	 * 
+	 * @param editingDuration the time need to set
+	 * @see org.odftoolkit.odfdom.dom.element.meta.MetaEditingDurationElement
+	 */
+	public void setEditingDuration(Duration editingDuration) {
+		MetaEditingDurationElement editiingDurationEle = OdfElement.findFirstChildNode(MetaEditingDurationElement.class,
+				mOfficeMetaElement);
+		if (editiingDurationEle == null) {
+			editiingDurationEle = mOfficeMetaElement.newMetaEditingDurationElement();
+		}
+		editiingDurationEle.setTextContent(editingDuration.toString());
+
+	}
+
+	/**
+	 * Receives the sub feature of DocumentStatistic.
+	 * 
+	 * @return the statistics about the document which can be represented by 
+	 * <code>DocumentStatistic</code> feature;
+	 * <p>
+	 * <code>null</code>, if the feature is not exist.
+	 * @see org.odftoolkit.odfdom.dom.element.meta.DocumentStatistic
+	 */
+	public DocumentStatistic getDocumentStatistic() {
+		MetaDocumentStatisticElement element = getDocumentStatisticElement();
+		if (element != null) {
+			return new DocumentStatistic(element);
+		} else {
+			return null;
+		}
+	}
+	
+	private MetaDocumentStatisticElement getDocumentStatisticElement() {
+		return OdfElement.findFirstChildNode(
+				MetaDocumentStatisticElement.class, mOfficeMetaElement);
+	}
+
+	/**
+	 * Change valid string of calendar to Calendar type.
+	 * 
+	 * @param baseDate the string of a calender
+	 * @return the object of Calender
+	 */
+	private Calendar stringToCalendar(String baseDate) {
+		// Calendar calendar=new GregorianCalendar();
+		Calendar calendar = Calendar.getInstance();
+		Date d1 = null;
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+
+		try {
+			d1 = sdf.parse(baseDate);
+		} catch (Exception e) {
+			// invalid format or null value in meta.xml
+			// d1=new Date();
+		}
+
+		calendar.setTime(d1);
+		return calendar;
+	}
+
+	/**
+	 * Convert a <code>Canlender</code> object to <code>String</code> object.
+	 * @param calendar an instanceof <code>Canlender</code>
+	 * @return the String format(yyyy-MM-dd'T'HH:mm:ss) of Calendar.
+	 */
+	private String calendarToString(Calendar calendar) {
+		return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(calendar.getTime());
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/presentation/Notes.java b/trunk/simple/src/main/java/org/odftoolkit/simple/presentation/Notes.java
new file mode 100644
index 0000000..5feacd1
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/presentation/Notes.java
@@ -0,0 +1,206 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.simple.presentation;
+
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawTextBoxElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.text.list.AbstractListContainer;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.w3c.dom.NodeList;
+
+/**
+ * <code>Notes</code> represents the presentation notes feature of the ODF
+ * document. <code>Notes</code> provides methods to creates notes, add content,
+ * add list, etc.
+ * 
+ */
+public class Notes extends Component implements ListContainer {
+
+	PresentationNotesElement maNoteElement;
+	private ListContainerImpl listContainerImpl;
+
+	/**
+	 * This is a tool class which supplies all of the notes creation detail.
+	 * <p>
+	 * The end user isn't allowed to create it directly, otherwise an
+	 * <code>IllegalStateException</code> will be thrown.
+	 * 
+	 *@since 0.3.5
+	 */
+	public static class NotesBuilder {
+
+		private final IdentityHashMap<PresentationNotesElement, Notes> maNotesRepository = new IdentityHashMap<PresentationNotesElement, Notes>();
+
+		/**
+		 * NotesBuilder constructor. This constructor should only be use in
+		 * owner {@link org.odftoolkit.simple.PresentationDocument
+		 * PresentationDocument} constructor. The end user isn't allowed to call
+		 * it directly, otherwise an <code>IllegalStateException</code> will be
+		 * thrown.
+		 * 
+		 * @param doc
+		 *            the owner <code>PresentationDocument</code>.
+		 * @throws IllegalStateException
+		 *             if new NotesBuilder out of owner PresentationDocument
+		 *             constructor, this exception will be thrown.
+		 */
+		public NotesBuilder(PresentationDocument doc) {
+			if (doc.getNotesBuilder() != null) {
+				throw new IllegalStateException(
+						"NotesBuilder only can be created in owner PresentationDocument constructor.");
+			}
+		}
+
+		/**
+		 * Get a presentation notes page instance by an instance of
+		 * <code>PresentationNotesElement</code>.
+		 * 
+		 * @param noteElement
+		 *            an instance of <code>PresentationNotesElement</code>
+		 * @return an instance of <code>Notes</code> that can represent
+		 *         <code>PresentationNotesElement</code>
+		 */
+		public synchronized Notes getNotesInstance(PresentationNotesElement noteElement) {
+			if (maNotesRepository.containsKey(noteElement))
+				return maNotesRepository.get(noteElement);
+			else {
+				Notes newNotes = new Notes(noteElement);
+				maNotesRepository.put(noteElement, newNotes);
+				return newNotes;
+			}
+		}
+	}
+
+	private Notes(PresentationNotesElement noteElement) {
+		maNoteElement = noteElement;
+	}
+
+	/**
+	 * Get a presentation notes page instance by an instance of
+	 * <code>PresentationNotesElement</code>.
+	 * 
+	 * @param noteElement
+	 *            an instance of <code>PresentationNotesElement</code>
+	 * @return an instance of <code>Notes</code> that can represent
+	 *         <code>PresentationNotesElement</code>
+	 */
+	public static Notes getInstance(PresentationNotesElement noteElement) {
+		PresentationDocument ownerDocument = (PresentationDocument) ((OdfFileDom) (noteElement.getOwnerDocument()))
+				.getDocument();
+		return ownerDocument.getNotesBuilder().getNotesInstance(noteElement);
+
+	}
+
+	/**
+	 * Return an instance of <code>PresentationNotesElement</code> which
+	 * represents presentation notes page feature.
+	 * 
+	 * @return an instance of <code>PresentationNotesElement</code>
+	 */
+	public PresentationNotesElement getOdfElement() {
+		return maNoteElement;
+	}
+
+	/**
+	 * insert some text to the notes page
+	 * 
+	 * @param text
+	 *            the text that need to insert in the notes page
+	 */
+	public void addText(String text) {
+		NodeList frameList = maNoteElement.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "frame");
+		if (frameList.getLength() > 0) {
+			DrawFrameElement frame = (DrawFrameElement) frameList.item(0);
+			NodeList textBoxList = frame.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "text-box");
+			if (textBoxList.getLength() > 0) {
+				DrawTextBoxElement textBox = (DrawTextBoxElement) textBoxList.item(0);
+				TextPElement newPara = textBox.newTextPElement();
+				newPara.setTextContent(text);
+			}
+		}
+	}
+
+	public OdfElement getListContainerElement() {
+		return getListContainerImpl().getListContainerElement();
+	}
+
+	public List addList() {
+		return getListContainerImpl().addList();
+	}
+
+	public List addList(ListDecorator decorator) {
+		return getListContainerImpl().addList(decorator);
+	}
+
+	public void clearList() {
+		getListContainerImpl().clearList();
+	}
+
+	public Iterator<List> getListIterator() {
+		return getListContainerImpl().getListIterator();
+	}
+
+	public boolean removeList(List list) {
+		return getListContainerImpl().removeList(list);
+	}
+
+	private ListContainerImpl getListContainerImpl() {
+		if (listContainerImpl == null) {
+			listContainerImpl = new ListContainerImpl();
+		}
+		return listContainerImpl;
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+
+		public OdfElement getListContainerElement() {
+			DrawFrameElement frame = null;
+			DrawTextBoxElement textBox = null;
+			NodeList frameList = maNoteElement.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "frame");
+			if (frameList.getLength() <= 0) {
+				frame = maNoteElement.newDrawFrameElement();
+			} else {
+				frame = (DrawFrameElement) frameList.item(frameList.getLength() - 1);
+			}
+			NodeList textBoxList = frame.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "text-box");
+			if (textBoxList.getLength() <= 0) {
+				textBox = frame.newDrawTextBoxElement();
+			} else {
+				textBox = (DrawTextBoxElement) textBoxList.item(textBoxList.getLength() - 1);
+			}
+			return textBox;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/presentation/Slide.java b/trunk/simple/src/main/java/org/odftoolkit/simple/presentation/Slide.java
new file mode 100644
index 0000000..e9d5b32
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/presentation/Slide.java
@@ -0,0 +1,1174 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple.presentation;
+
+import java.awt.Rectangle;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassAttribute;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawTextBoxElement;
+import org.odftoolkit.odfdom.dom.element.presentation.PresentationNotesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePresentationPageLayoutElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.chart.AbstractChartContainer;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.chart.ChartContainer;
+import org.odftoolkit.simple.chart.DataSet;
+import org.odftoolkit.simple.draw.AbstractTextboxContainer;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.draw.Textbox;
+import org.odftoolkit.simple.draw.TextboxContainer;
+import org.odftoolkit.simple.table.AbstractTableContainer;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.odftoolkit.simple.text.list.AbstractListContainer;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.w3c.dom.NodeList;
+
+/**
+ * <code>Slide</code> represents the presentation slide feature of the ODF
+ * document. <code>Slide</code> provides methods to get the slide index,get the
+ * content of the current slide, etc.
+ */
+public class Slide extends Component implements ListContainer, TableContainer, TextboxContainer, ChartContainer {
+
+	DrawPageElement maSlideElement;
+	private ListContainerImpl listContainerImpl;
+	private TableContainerImpl tableContainerImpl;
+	private TextboxContainerImpl mTextboxContainerImpl;
+	private ChartContainerImpl chartContainerImpl;
+	
+	/**
+	 * This is a tool class which supplies all of the slide creation detail.
+	 * <p>
+	 * The end user isn't allowed to create it directly, otherwise an
+	 * <code>IllegalStateException</code> will be thrown.
+	 * 
+	 *@since 0.3.5
+	 */
+	public static class SlideBuilder {
+
+		private final IdentityHashMap<DrawPageElement, Slide> maSlideRepository = new IdentityHashMap<DrawPageElement, Slide>();
+
+		/**
+		 * SlideBuilder constructor. This constructor should only be use in
+		 * owner {@link org.odftoolkit.simple.PresentationDocument
+		 * PresentationDocument} constructor. The end user isn't allowed to call
+		 * it directly, otherwise an <code>IllegalStateException</code> will be
+		 * thrown.
+		 * 
+		 * @param doc
+		 *            the owner <code>PresentationDocument</code>.
+		 * @throws IllegalStateException
+		 *             if new SlideBuilder out of owner PresentationDocument
+		 *             constructor, this exception will be thrown.
+		 */
+		public SlideBuilder(PresentationDocument doc) {
+			if (doc.getSlideBuilder() != null) {
+				throw new IllegalStateException(
+						"SlideBuilder only can be created in owner PresentationDocument constructor.");
+			}
+		}
+
+		/**
+		 * Get a presentation slide instance by an instance of
+		 * <code>DrawPageElement</code>.
+		 * 
+		 * @param pageElement
+		 *            an instance of <code>DrawPageElement</code>
+		 * @return an instance of <code>Slide</code> that can represent
+		 *         <code>pageElement</code>
+		 */
+		public synchronized Slide getSlideInstance(DrawPageElement pageElement) {
+			if (maSlideRepository.containsKey(pageElement)) {
+				return maSlideRepository.get(pageElement);
+			} else {
+				Slide newSlide = new Slide(pageElement);
+				maSlideRepository.put(pageElement, newSlide);
+				return newSlide;
+			}
+		}
+	}
+
+	private Slide(DrawPageElement pageElement) {
+		maSlideElement = pageElement;
+	}
+
+	/**
+	 * Get a presentation slide instance by an instance of
+	 * <code>DrawPageElement</code>.
+	 * 
+	 * @param pageElement
+	 *            an instance of <code>DrawPageElement</code>
+	 * @return an instance of <code>Slide</code> that can represent
+	 *         <code>pageElement</code>
+	 */
+	public static Slide getInstance(DrawPageElement pageElement) {
+		PresentationDocument ownerDocument = (PresentationDocument) ((OdfFileDom) (pageElement.getOwnerDocument()))
+				.getDocument();
+		return ownerDocument.getSlideBuilder().getSlideInstance(pageElement);
+	}
+
+	/**
+	 * Return an instance of <code>DrawPageElement</code> which represents
+	 * presentation slide feature.
+	 * 
+	 * @return an instance of <code>DrawPageElement</code>
+	 */
+	public DrawPageElement getOdfElement() {
+		return maSlideElement;
+	}
+
+	/**
+	 * Get the current slide index in the owner document.
+	 * 
+	 * @return the slide index in the owner document
+	 *         <p>
+	 *         -1, if the odf element which can represent this slide is not in
+	 *         the document DOM tree
+	 */
+	public int getSlideIndex() {
+		OdfFileDom contentDom = (OdfFileDom) maSlideElement.getOwnerDocument();
+		NodeList slideNodes = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideEle = (DrawPageElement) slideNodes.item(i);
+			if (slideEle == maSlideElement)// should not equals here, see
+			// OdfElement.equals(Object obj)
+			{
+				return i;
+			}
+		}
+		return -1;
+	}
+
+	/**
+	 * Get the current slide name.
+	 * <p>
+	 * If the "draw:name" attribute is not present there, create an unique name
+	 * for this slide
+	 * 
+	 * @return the name of the current slide
+	 */
+	public String getSlideName() {
+		String slideName = maSlideElement.getDrawNameAttribute();
+		if (slideName == null) {
+			slideName = makeUniqueSlideName();
+			maSlideElement.setDrawNameAttribute(slideName);
+		}
+		return slideName;
+	}
+
+	/**
+	 * Set the current slide name.
+	 * <p>
+	 * It must be unique slide name in the current presentation. If not, an
+	 * IllegalArgumentException will be thrown. If the given name is null, an
+	 * IllegalArgumentException will also be thrown.
+	 * 
+	 * @param name
+	 *            the new name of the current slide
+	 * @throws IllegalArgumentException
+	 *             if the given name is null or it is not unique in the current
+	 *             presentation.
+	 */
+	public void setSlideName(String name) {
+		if (name == null) {
+			throw new IllegalArgumentException("slide name is null is not accepted in the presentation document");
+		}
+		// check if name is unique in this presentation
+		OdfFileDom contentDom = (OdfFileDom) maSlideElement.getOwnerDocument();
+		NodeList slideNodes = contentDom.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+		for (int i = 0; i < slideNodes.getLength(); i++) {
+			DrawPageElement slideEle = (DrawPageElement) slideNodes.item(i);
+			Slide slide = Slide.getInstance(slideEle);
+			String slideName = slide.getSlideName();
+			if (slideName.equals(name)) {
+				throw new IllegalArgumentException(
+						"the given slide name is already exist in the current presentation document");
+			}
+		}
+		maSlideElement.setDrawNameAttribute(name);
+	}
+
+	/**
+	 * Get the Notes page of this slide
+	 * 
+	 * @return the instance of <code>Notes</code> which represent the notes page
+	 *         of the current slide
+	 */
+	public Notes getNotesPage() {
+		NodeList notesList = maSlideElement.getElementsByTagNameNS(OdfDocumentNamespace.PRESENTATION.getUri(), "notes");
+		if (notesList.getLength() > 0) {
+			PresentationNotesElement noteEle = (PresentationNotesElement) notesList.item(0);
+			return Notes.getInstance(noteEle);
+
+		}
+		return null;
+	}
+
+	private String makeUniqueSlideName() {
+		int index = getSlideIndex();
+		String slideName = "page" + (index + 1) + "-" + String.format("a%06x", (int) (Math.random() * 0xffffff));
+		return slideName;
+	}
+
+	/**
+	 * A slide layout is a slide with some predefine place holder.
+	 * 
+	 * we define some template layout as below:
+	 * <ul>
+	 * <li>"BLANK" template is a slide without any filled element.</li>
+	 * <li>"TITLE_ONLY" template is a slide with a title only.</li>
+	 * <li>"TITLE_SUBTITLE" template is a slide with a title and a subtitle.</li>
+	 * <li>"TITLE_OUTLINE" template is a slide with a title and an outline
+	 * block.</li>
+	 * <li>"TITLE_PLUS_TEXT" template is a slide with a title and a text block.</li>
+	 * <li>"TITLE_PLUS_CHART" template is a slide with a title and a chart
+	 * block.</li>
+	 * <li>"TITLE_PLUS_2_TEXT_BLOCK" template is a slide with a title and two
+	 * text blocks.</li>
+	 * <li>"TITLE_PLUS_2_CHART" template is a slide with a title and two chart
+	 * blocks.</li>
+	 * <li>"TITLE_LEFT_CHART_RIGHT_OUTLINE" template is a slide with a title, a
+	 * chart block on the left and an outline block on the right.</li>
+	 * <li>"TITLE_PLUS_3_OBJECT" template is a slide with a title, an outline
+	 * block and two chart blocks.</li>
+	 * <li>"TITLE_PLUS_4_OBJECT" template is a slide with a title, an outline
+	 * block and three chart blocks.</li>
+	 * <ul>
+	 */
+	public enum SlideLayout {
+
+		/**
+		 * Blank, a blank presentation
+		 */
+		BLANK("blank") {
+			public void apply(DrawPageElement page) {
+				//do nothing.			
+			}
+		},
+		/**
+		 * Title_only, the presentation with title only
+		 */
+		TITLE_ONLY("title_only") {
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = "AL1T" + makeUniqueName();
+				try {
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					layout.newPresentationPlaceholderElement("title", "2.058cm", "1.743cm", "23.91cm", "3.507cm");
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setProperty(StyleGraphicPropertiesElement.StyleShadow, "true");
+				frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.006cm");
+				frame1.setSvgWidthAttribute("24.299cm");
+				frame1.setSvgXAttribute("1.35cm");
+				frame1.setSvgYAttribute("0.717cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+			}
+		},
+		/**
+		 * title_subtitle, the presentation with title and subtitle.
+		 */
+		TITLE_SUBTITLE("title_subtitle") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName ="AL1T" + makeUniqueName();
+				try {
+					styles = doc.getStylesDom().getOfficeStyles();
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					//String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue
+					layout.newPresentationPlaceholderElement("title", "3.507cm", "23.912cm", "2.058cm", "1.743cm");
+					layout.newPresentationPlaceholderElement("subtitle", "13.23cm", "23.912cm", "2.058cm", "5.838cm");
+					
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+				
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("4.244cm");
+				frame1.setSvgWidthAttribute("23.848cm");
+				frame1.setSvgXAttribute("2.075cm");
+				frame1.setSvgYAttribute("6.621cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("5.097cm");
+				frame2.setSvgWidthAttribute("19.631cm");
+				frame2.setSvgXAttribute("4.183cm");
+				frame2.setSvgYAttribute("12.003cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.SUBTITLE.toString());
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.newDrawTextBoxElement();
+			}
+		},
+		/**
+		 * Title_outline, the presentation with outline
+		 */
+		TITLE_OUTLINE("title_outline") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					if (styles == null) {
+						styles = doc.getStylesDom().getOfficeStyles();
+					}
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					layout.newPresentationPlaceholderElement("title", "2.058cm", "1.743cm", "23.91cm", "3.507cm");
+					layout.newPresentationPlaceholderElement("outline", "2.058cm", "1.743cm", "23.91cm", "3.507cm");
+
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setProperty(StyleGraphicPropertiesElement.StyleShadow, "true");
+				frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.006cm");
+				frame1.setSvgWidthAttribute("24.299cm");
+				frame1.setSvgXAttribute("1.35cm");
+				frame1.setSvgYAttribute("0.717cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+
+				frame2.setProperty(StyleGraphicPropertiesElement.FillColor, "#ffffff");
+				frame2.setProperty(StyleGraphicPropertiesElement.MinHeight, "13.114");
+				frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("11.629cm");
+				frame2.setSvgWidthAttribute("24.199cm");
+				frame2.setSvgXAttribute("1.35cm");
+				frame2.setSvgYAttribute("4.337cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.newDrawTextBoxElement();
+			}
+		},
+		/**
+		 * Title_text, the presentation with title and one text block
+		 */
+		TITLE_PLUS_TEXT("title_text") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					if (styles == null) {
+						styles = doc.getStylesDom().getOfficeStyles();
+					}
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					layout.newPresentationPlaceholderElement("title", "2.058cm", "1.743cm", "23.91cm", "1.743cm");
+					layout.newPresentationPlaceholderElement("subtitle", "2.058cm", "5.838cm", "23.91cm", "13.23cm");
+
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.006cm");
+				frame1.setSvgWidthAttribute("24.299cm");
+				frame1.setSvgXAttribute("1.35cm");
+				frame1.setSvgYAttribute("0.717cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame2.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("11.88cm");
+				frame2.setSvgWidthAttribute("24.299cm");
+				frame2.setSvgXAttribute("1.35cm");
+				frame2.setSvgYAttribute("4.712cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.SUBTITLE.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.newDrawTextBoxElement();
+			}
+		},
+		/**
+		 * title_two_text_block, the presentation with title and two text blocks
+		 */
+		TITLE_PLUS_2_TEXT_BLOCK("title_two_text_block") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					if (styles == null) {
+						styles = doc.getStylesDom().getOfficeStyles();
+					}
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					layout.newPresentationPlaceholderElement("outline", "2.058cm", "1.743cm", "23.91cm", "1.743cm");
+					layout.newPresentationPlaceholderElement("outline", "1.35cm", "4.212cm", "11.857cm", "11.629cm");
+					layout.newPresentationPlaceholderElement("outline", "4.212cm", "13.8cm", "11.857cm", "11.629cm");
+
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+				
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame1.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.006cm");
+				frame1.setSvgWidthAttribute("24.299cm");
+				frame1.setSvgXAttribute("1.35cm");
+				frame1.setSvgYAttribute("0.717cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame2.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame2.setPresentationStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("11.629cm");
+				frame2.setSvgWidthAttribute("11.857cm");
+				frame2.setSvgXAttribute("1.35cm");
+				frame2.setSvgYAttribute("4.212cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.newDrawTextBoxElement();
+				
+				DrawFrameElement frame3 = page.newDrawFrameElement();
+				frame3.setProperty(StyleGraphicPropertiesElement.AutoGrowHeight, "true");
+				frame3.setProperty(StyleGraphicPropertiesElement.MinHeight, "3.507");
+				frame3.setPresentationStyleNameAttribute(frame3.getStyleName());
+				frame3.setDrawLayerAttribute("layout");
+				frame3.setSvgHeightAttribute("11.62cm");
+				frame3.setSvgWidthAttribute("11.857cm");
+				frame3.setSvgXAttribute("13.8cm");
+				frame3.setSvgYAttribute("4.212cm");
+				frame3.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+				frame3.setPresentationPlaceholderAttribute(true);
+				frame3.newDrawTextBoxElement();
+			}
+		},
+		/**
+		 * title_three_objects, the presentation with title, chart and outline blocks.
+		 */
+		TITLE_LEFT_CHART_RIGHT_OUTLINE("title_left_chart_right_outline") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					styles = doc.getStylesDom().getOfficeStyles();
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					//String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue
+					layout.newPresentationPlaceholderElement("title", "3.507cm", "25.199cm", "1.4cm", "0.837cm");
+					layout.newPresentationPlaceholderElement("chart", "13.86cm", "12.296cm", "1.4cm", "4.914cm");
+					layout.newPresentationPlaceholderElement("outline", "13.86cm", "12.296cm", "14.311cm", "4.914cm");
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.507cm");
+				frame1.setSvgWidthAttribute("25.199cm");
+				frame1.setSvgXAttribute("1.4cm");
+				frame1.setSvgYAttribute("0.837cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setDrawStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("13.86cm");
+				frame2.setSvgWidthAttribute("12.296cm");
+				frame2.setSvgXAttribute("1.4cm");
+				frame2.setSvgYAttribute("4.914cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame2.newDrawObjectElement();
+
+				DrawFrameElement frame3 = page.newDrawFrameElement();
+				frame3.setPresentationStyleNameAttribute(frame3.getStyleName());
+				frame3.setDrawLayerAttribute("layout");
+				frame3.setSvgHeightAttribute("13.86cm");
+				frame3.setSvgWidthAttribute("12.296cm");
+				frame3.setSvgXAttribute("14.311cm");
+				frame3.setSvgYAttribute("4.914cm");
+				frame3.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+				frame3.setPresentationPlaceholderAttribute(true);
+				frame3.newDrawTextBoxElement();
+			}
+		},
+		/**
+		 * title_plus_chart, the presentation with title and chart.
+		 */
+		TITLE_PLUS_CHART("title_plus_chart") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = "AL1T" + makeUniqueName();
+				try {
+					styles = doc.getStylesDom().getOfficeStyles();
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					//String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue
+					layout.newPresentationPlaceholderElement("title", "3.507cm", "25.199cm", "1.4cm", "0.837cm");
+					layout.newPresentationPlaceholderElement("chart", "13.86cm", "25.199cm", "1.4cm", "4.914cm");
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+				
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.507cm");
+				frame1.setSvgWidthAttribute("25.199cm");
+				frame1.setSvgXAttribute("1.4cm");
+				frame1.setSvgYAttribute("0.837cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setDrawStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("13.86cm");
+				frame2.setSvgWidthAttribute("25.199cm");
+				frame2.setSvgXAttribute("1.4cm");
+				frame2.setSvgYAttribute("4.914cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame2.newDrawObjectElement();
+			}
+		},
+		/**
+		 * title_plus_two_chart, the presentation with title and two charts.
+		 */
+		TITLE_PLUS_2_CHART("title_plus_2_chart") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					styles = doc.getStylesDom().getOfficeStyles();
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					//String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue
+					layout.newPresentationPlaceholderElement("title", "3.507cm", "25.199cm", "1.4cm", "0.837cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "25.199cm", "1.4cm", "4.914cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "25.199cm", "1.4cm", "12.153cm");
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+				
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.507cm");
+				frame1.setSvgWidthAttribute("25.199cm");
+				frame1.setSvgXAttribute("1.4cm");
+				frame1.setSvgYAttribute("0.837cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setDrawStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("6.61cm");
+				frame2.setSvgWidthAttribute("25.199cm");
+				frame2.setSvgXAttribute("1.4cm");
+				frame2.setSvgYAttribute("4.914cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame2.newDrawObjectElement();
+
+				DrawFrameElement frame3 = page.newDrawFrameElement();
+				frame3.setDrawStyleNameAttribute(frame3.getStyleName());
+				frame3.setDrawLayerAttribute("layout");
+				frame3.setSvgHeightAttribute("6.61cm");
+				frame3.setSvgWidthAttribute("25.199cm");
+				frame3.setSvgXAttribute("1.4cm");
+				frame3.setSvgYAttribute("12.153cm");
+				frame3.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame3.setPresentationPlaceholderAttribute(true);
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame3.newDrawObjectElement();
+			}
+		},
+		/**
+		 * title_three_object, the presentation with title and three object blocks.
+		 */
+		TITLE_PLUS_3_OBJECT("title_plus_three_object") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					styles = doc.getStylesDom().getOfficeStyles();
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					//String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue
+					layout.newPresentationPlaceholderElement("title", "3.507cm", "25.199cm", "1.4cm", "0.837cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "12.296cm", "1.4cm", "4.914cm");
+					layout.newPresentationPlaceholderElement("outline", "6.61cm", "12.296cm", "14.311cm", "4.914cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "25.199cm", "1.4cm", "12.153cm");
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+				
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.507cm");
+				frame1.setSvgWidthAttribute("25.199cm");
+				frame1.setSvgXAttribute("1.4cm");
+				frame1.setSvgYAttribute("0.837cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setDrawStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("6.61cm");
+				frame2.setSvgWidthAttribute("12.296cm");
+				frame2.setSvgXAttribute("1.4cm");
+				frame2.setSvgYAttribute("4.914cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame2.newDrawObjectElement();
+
+				DrawFrameElement frame3 = page.newDrawFrameElement();
+				frame3.setPresentationStyleNameAttribute(frame3.getStyleName());
+				frame3.setDrawLayerAttribute("layout");
+				frame3.setSvgHeightAttribute("6.61cm");
+				frame3.setSvgWidthAttribute("12.296cm");
+				frame3.setSvgXAttribute("14.311cm");
+				frame3.setSvgYAttribute("4.914cm");
+				frame3.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+				frame3.setPresentationPlaceholderAttribute(true);
+				frame3.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame3.newDrawTextBoxElement();
+				
+				DrawFrameElement frame4 = page.newDrawFrameElement();
+				frame4.setDrawStyleNameAttribute(frame4.getStyleName());
+				frame4.setDrawLayerAttribute("layout");
+				frame4.setSvgHeightAttribute("6.61cm");
+				frame4.setSvgWidthAttribute("25.199cm");
+				frame4.setSvgXAttribute("1.4cm");
+				frame4.setSvgYAttribute("12.153cm");
+				frame4.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame4.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame4.setPresentationPlaceholderAttribute(true);
+				frame4.newDrawObjectElement();
+			}
+		},
+		/**
+		 * title_four_object, the presentation with title and four object blocks.
+		 */
+		TITLE_PLUS_4_OBJECT("title_four_object") {
+			
+			public void apply(DrawPageElement page) {
+				Document doc = (Document) ((OdfFileDom) page.getOwnerDocument()).getDocument();
+				OdfOfficeStyles styles = doc.getOrCreateDocumentStyles();
+				String layoutName;
+				layoutName = makeUniqueName();
+				try {
+					styles = doc.getStylesDom().getOfficeStyles();
+					if (styles == null) {
+						styles = doc.getStylesDom().newOdfElement(OdfOfficeStyles.class);
+					}
+					StylePresentationPageLayoutElement layout = styles.newStylePresentationPageLayoutElement(layoutName);
+					//String presentationObjectValue, String svgHeightValue, String svgWidthValue, String svgXValue, String svgYValue
+					layout.newPresentationPlaceholderElement("title", "3.507cm", "25.199cm", "1.4cm", "0.837cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "12.296cm", "1.4cm", "4.914cm");
+					layout.newPresentationPlaceholderElement("outline", "6.61cm", "12.296cm", "14.311cm", "4.914cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "12.296cm", "1.4cm", "12.153cm");
+					layout.newPresentationPlaceholderElement("chart", "6.61cm", "12.296cm", "14.311cm", "12.153cm");
+				} catch (Exception e1) {
+					Logger.getLogger(SlideLayout.class.getName()).log(Level.SEVERE, null, e1);
+				}
+				page.setPresentationPresentationPageLayoutNameAttribute(layoutName);
+				
+				DrawFrameElement frame1 = page.newDrawFrameElement();
+				frame1.setPresentationStyleNameAttribute(frame1.getStyleName());
+				frame1.setDrawLayerAttribute("layout");
+				frame1.setSvgHeightAttribute("3.507cm");
+				frame1.setSvgWidthAttribute("25.199cm");
+				frame1.setSvgXAttribute("1.4cm");
+				frame1.setSvgYAttribute("0.837cm");
+				frame1.setPresentationClassAttribute(PresentationClassAttribute.Value.TITLE.toString());
+				frame1.setPresentationPlaceholderAttribute(true);
+				frame1.newDrawTextBoxElement();
+				
+				DrawFrameElement frame2 = page.newDrawFrameElement();
+				frame2.setDrawStyleNameAttribute(frame2.getStyleName());
+				frame2.setDrawLayerAttribute("layout");
+				frame2.setSvgHeightAttribute("6.61cm");
+				frame2.setSvgWidthAttribute("12.296cm");
+				frame2.setSvgXAttribute("1.4cm");
+				frame2.setSvgYAttribute("4.914cm");
+				frame2.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame2.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame2.setPresentationPlaceholderAttribute(true);
+				frame2.newDrawObjectElement();
+
+				DrawFrameElement frame3 = page.newDrawFrameElement();
+				frame3.setPresentationStyleNameAttribute(frame3.getStyleName());
+				frame3.setDrawLayerAttribute("layout");
+				frame3.setSvgHeightAttribute("6.61cm");
+				frame3.setSvgWidthAttribute("12.296cm");
+				frame3.setSvgXAttribute("14.311cm");
+				frame3.setSvgYAttribute("4.914cm");
+				frame3.setPresentationClassAttribute(PresentationClassAttribute.Value.OUTLINE.toString());
+				frame3.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame3.setPresentationUserTransformedAttribute(true);
+				frame3.setPresentationPlaceholderAttribute(true);
+				frame3.newDrawTextBoxElement();
+				
+				DrawFrameElement frame4 = page.newDrawFrameElement();
+				frame4.setDrawStyleNameAttribute(frame4.getStyleName());
+				frame4.setDrawLayerAttribute("layout");
+				frame4.setSvgHeightAttribute("6.61cm");
+				frame4.setSvgWidthAttribute("12.296cm");
+				frame4.setSvgXAttribute("1.4cm");
+				frame4.setSvgYAttribute("12.153cm");
+				frame4.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame4.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame4.setPresentationPlaceholderAttribute(true);
+				frame4.newDrawObjectElement();
+				
+				DrawFrameElement frame5 = page.newDrawFrameElement();
+				frame5.setDrawStyleNameAttribute(frame5.getStyleName());
+				frame5.setDrawLayerAttribute("layout");
+				frame5.setSvgHeightAttribute("6.61cm");
+				frame5.setSvgWidthAttribute("12.296cm");
+				frame5.setSvgXAttribute("14.311cm");
+				frame5.setSvgYAttribute("12.153cm");
+				frame5.setPresentationClassAttribute(PresentationClassAttribute.Value.CHART.toString());
+				frame5.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PAGE.toString());
+				frame5.setPresentationPlaceholderAttribute(true);
+				frame5.newDrawObjectElement();
+			}
+		};
+		
+		private String mValue;
+
+		SlideLayout(String aValue) {
+			mValue = aValue;
+		}
+
+		/**
+		 * Applies this layout on a slide page.
+		 * 
+		 * @param page
+		 *            the slide element which this layout is applied on.
+		 * @since 0.6
+		 */
+		public abstract void apply(DrawPageElement page);
+		
+		/**
+		 * Return the slide template type value.
+		 * 
+		 * @return the template type value
+		 */
+		@Override
+		public String toString() {
+			return mValue;
+		}
+
+		/**
+		 * Return the name of the template slide type.
+		 * 
+		 * @param aEnum
+		 *            a <code>SlideLayout</code>
+		 * @return the name of slide template type
+		 */
+		public static String toString(SlideLayout aEnum) {
+			return aEnum.toString();
+		}
+
+		/**
+		 * Return a template slide type.
+		 * 
+		 * @param aString
+		 *            the name of the slide template type
+		 * @return a <code>SlideLayout</code>
+		 */
+		public static SlideLayout enumValueOf(String aString) {
+			for (SlideLayout aIter : values()) {
+				if (aString.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return null;
+		}
+		
+		//return an unique name.
+		private static String makeUniqueName() {
+			return String.format("a%06x", (int) (Math.random() * 0xffffff));
+		}
+	}
+
+	public OdfElement getListContainerElement() {
+		return getListContainerImpl().getListContainerElement();
+	}
+
+	public List addList() {
+		return getListContainerImpl().addList();
+	}
+
+	public List addList(ListDecorator decorator) {
+		return getListContainerImpl().addList(decorator);
+	}
+
+	public void clearList() {
+		getListContainerImpl().clearList();
+	}
+
+	public Iterator<List> getListIterator() {
+		return getListContainerImpl().getListIterator();
+	}
+
+	public boolean removeList(List list) {
+		return getListContainerImpl().removeList(list);
+	}
+
+	private ListContainerImpl getListContainerImpl() {
+		if (listContainerImpl == null) {
+			listContainerImpl = new ListContainerImpl();
+		}
+		return listContainerImpl;
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+
+		public OdfElement getListContainerElement() {
+			DrawFrameElement frame = null;
+			DrawTextBoxElement textBox = null;
+			NodeList frameList = maSlideElement.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "frame");
+			if (frameList.getLength() > 0) {
+				int index = frameList.getLength() - 1;
+				while (index >= 0) {
+					frame = (DrawFrameElement) frameList.item(index);
+					String presentationClass = frame.getPresentationClassAttribute();
+					if (presentationClass == null || "outline".equals(presentationClass)
+							|| "text".equals(presentationClass) || "subtitle".equals(presentationClass)) {
+						break;
+					} else {
+						index--;
+					}
+					frame = null;
+				}
+			}
+			if (frame == null) {
+				throw new UnsupportedOperationException(
+						"There is no list container in this slide, please chose a proper slide layout.");
+			}
+			NodeList textBoxList = frame.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "text-box");
+			if (textBoxList.getLength() <= 0) {
+				textBox = frame.newDrawTextBoxElement();
+			} else {
+				textBox = (DrawTextBoxElement) textBoxList.item(textBoxList.getLength() - 1);
+			}
+			return textBox;
+		}
+	}
+
+	public Table addTable() {
+		return getTableContainerImpl().addTable();
+	}
+
+	public Table addTable(int numRows, int numCols) {
+		return getTableContainerImpl().addTable(numRows, numCols);
+	}
+
+	public Table getTableByName(String name) {
+		return getTableContainerImpl().getTableByName(name);
+	}
+
+	public java.util.List<Table> getTableList() {
+		return getTableContainerImpl().getTableList();
+	}
+
+	public TableBuilder getTableBuilder() {
+		return getTableContainerImpl().getTableBuilder();
+	}
+
+	public OdfElement getTableContainerElement() {
+		return getTableContainerImpl().getTableContainerElement();
+	}
+
+	protected TableContainer getTableContainerImpl() {
+		if (tableContainerImpl == null) {
+			tableContainerImpl = new TableContainerImpl();
+		}
+		return tableContainerImpl;
+	}
+
+	private class TableContainerImpl extends AbstractTableContainer {
+
+		public OdfElement getTableContainerElement() {
+			DrawFrameElement frame = null;
+			NodeList frameList = maSlideElement.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "frame");
+			if (frameList.getLength() > 0) {
+				int index = frameList.getLength() - 1;
+				while (index >= 0) {
+					frame = (DrawFrameElement) frameList.item(index);
+					String presentationClass = frame.getPresentationClassAttribute();
+					if (presentationClass == null || "table".equals(presentationClass)) {
+						break;
+					} else {
+						index--;
+					}
+					frame = null;
+				}
+			}
+			if (frame == null) {
+				frame = maSlideElement.newDrawFrameElement();
+				frame.setPresentationClassAttribute("table");
+				frame.setDrawLayerAttribute("layout");
+				frame.setStyleName("standard");
+				frame.setSvgHeightAttribute("1.945cm");
+				frame.setSvgWidthAttribute("14.098cm");
+				frame.setSvgXAttribute("6.922cm");
+				frame.setSvgYAttribute("10.386cm");
+			}
+			return frame;
+		}
+	}
+
+	// *********Text box support **********//
+	public Textbox addTextbox() {
+		return getTextboxContainerImpl().addTextbox();
+	}
+
+	public Iterator<Textbox> getTextboxIterator() {
+		return getTextboxContainerImpl().getTextboxIterator();
+	}
+
+	public boolean removeTextbox(Textbox box) {
+		return getTextboxContainerImpl().removeTextbox(box);
+	}
+
+	public OdfElement getFrameContainerElement() {
+		return getTextboxContainerImpl().getFrameContainerElement();
+	}
+
+	public Textbox addTextbox(FrameRectangle position) {
+		return getTextboxContainerImpl().addTextbox(position);
+	}
+
+	public Textbox getTextboxByName(String name) {
+		return getTextboxContainerImpl().getTextboxByName(name);
+	}
+
+	private class TextboxContainerImpl extends AbstractTextboxContainer {
+		public OdfElement getFrameContainerElement() {
+			return maSlideElement;
+		}
+	}
+
+	private TextboxContainerImpl getTextboxContainerImpl() {
+		if (mTextboxContainerImpl == null)
+			mTextboxContainerImpl = new TextboxContainerImpl();
+		return mTextboxContainerImpl;
+	}
+
+	public java.util.List<Textbox> getTextboxByUsage(PresentationDocument.PresentationClass usage) {
+		return getTextboxContainerImpl().getTextboxByUsage(usage);
+	}
+	public Chart createChart(String title, DataSet dataset, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, dataset, rect);
+	}
+
+	public Chart createChart(String title, SpreadsheetDocument document, CellRangeAddressList cellRangeAddr, boolean firstRowAsLabel,
+			boolean firstColumnAsLabel, boolean rowAsDataSeries, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, document, cellRangeAddr, firstRowAsLabel, firstColumnAsLabel,
+				rowAsDataSeries, rect);
+	}
+
+	public Chart createChart(String title, String[] labels, String[] legends, double[][] data, Rectangle rect) {
+		return getChartContainerImpl().createChart(title, labels, legends, data, rect);
+	}
+
+	public void deleteChartById(String chartId) {
+		getChartContainerImpl().deleteChartById(chartId);
+	}
+
+	public void deleteChartByTitle(String title) {
+		getChartContainerImpl().deleteChartByTitle(title);
+	}
+
+	public Chart getChartById(String chartId) {
+		return getChartContainerImpl().getChartById(chartId);
+	}
+
+	public java.util.List<Chart> getChartByTitle(String title) {
+		return getChartContainerImpl().getChartByTitle(title);
+	}
+
+	public int getChartCount() {
+		return getChartContainerImpl().getChartCount();
+	}
+	
+	private ChartContainerImpl getChartContainerImpl() {
+		if (chartContainerImpl == null) {
+			chartContainerImpl = new ChartContainerImpl(getOwnerDocument(), this);
+		}
+		return chartContainerImpl;
+	}
+	
+	private class ChartContainerImpl extends AbstractChartContainer {
+		DrawPageElement slide;
+
+		protected ChartContainerImpl(Document doc, Slide slide) {
+			super(doc);
+			this.slide = slide.getOdfElement();
+		}
+
+		protected DrawFrameElement getChartFrame() throws Exception {
+			DrawFrameElement element = OdfElement.findFirstChildNode(DrawFrameElement.class, slide);
+			while (element != null) {
+				if ("chart".equals(element.getPresentationClassAttribute())) {
+					DrawObjectElement chartEle= OdfElement.findFirstChildNode(DrawObjectElement.class, element);
+					if(chartEle == null){
+						return element;
+					}else{
+						String href = chartEle.getXlinkHrefAttribute();
+						if("".equals(href) || href ==null){
+							return element;
+						}
+					}
+				}
+				element = OdfElement.findNextChildNode(DrawFrameElement.class, element);
+			}
+			return null;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/Border.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/Border.java
new file mode 100644
index 0000000..f74918f
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/Border.java
@@ -0,0 +1,490 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+import java.util.StringTokenizer;
+
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+
+/**
+ * This class represents border style settings, including line style, color,
+ * width, inner line width, outer line width and the distance.
+ * 
+ * @since 0.3
+ */
+public class Border {
+
+	StyleTypeDefinitions.LineType lineStyle;
+	Color color;
+	double width;
+	double innerLineWidth, distance, outerLineWidth;
+	StyleTypeDefinitions.SupportedLinearMeasure linearMeasure;
+	private static final String WidthFormatInInch = "#.####";
+
+	/**
+	 * A static variable to represent a border without any lines, which means no
+	 * border at all.
+	 */
+	public static Border NONE = new Border(StyleTypeDefinitions.LineType.NONE);
+
+	/**
+	 * Constructor to create an empty border
+	 */
+	protected Border() {
+
+	}
+
+	private Border(StyleTypeDefinitions.LineType lineType) {
+		this.lineStyle = lineType;
+		width = 0;
+	}
+
+	/**
+	 * Constructor to create a single line border
+	 * 
+	 * @param aColor
+	 *            - the color of the border
+	 * @param width
+	 *            - the line width of the border
+	 * @param linearMeasure
+	 *            - the linear measurement of the border width
+	 */
+	public Border(Color aColor, double width, StyleTypeDefinitions.SupportedLinearMeasure linearMeasure) {
+		color = aColor;
+		this.width = width;
+		this.linearMeasure = linearMeasure;
+		this.lineStyle = StyleTypeDefinitions.LineType.SINGLE;
+	}
+
+	// /**
+	// * Constructor to create a single line border.
+	// *
+	// * @param width - a string to represent the width and the linear
+	// measurement, such as "12pt", "0.001in".
+	// * The supported linear measurement includes "pt" and "in".
+	// * @param aColor - the color of the border
+	// */
+	// protected Border(String width, Color aColor) {
+	// color = aColor;
+	// this.width = getLineWidth(width);
+	// this.linearMeasure = getLineMeasure(width);
+	// this.lineStyle = StyleTypeDefinitions.LineType.SINGLE;
+	// }
+
+	/**
+	 * Constructor to create a double line border
+	 * 
+	 * @param aColor
+	 *            - the color of the border
+	 * @param width
+	 *            - the line width of the border
+	 * @param innerLineWidth
+	 *            - the inner line width of the border
+	 * @param outerLineWidth
+	 *            - the outer line width of the border
+	 * @param linearMeasure
+	 *            - the linear measurement of the border width
+	 * 
+	 * @throws IllegalArgumentException
+	 *             if the width is not bigger than the sum of inner line width
+	 *             and outer line width.
+	 */
+	public Border(Color aColor, double width, double innerLineWidth, double outerLineWidth,
+			StyleTypeDefinitions.SupportedLinearMeasure linearMeasure) {
+		color = aColor;
+		this.width = width;
+		this.linearMeasure = linearMeasure;
+		this.innerLineWidth = innerLineWidth;
+		this.outerLineWidth = outerLineWidth;
+		this.distance = width - innerLineWidth - outerLineWidth;
+		this.lineStyle = StyleTypeDefinitions.LineType.DOUBLE;
+
+		if (distance <= 0)
+			throw new IllegalArgumentException(
+					"The width must bigger than the sum of inner line width and outer line width!");
+	}
+
+	// /**
+	// * COnstructor to create a double line border
+	// *
+	// * @param width - a string to represent the width and the linear
+	// measurement.
+	// * @param aColor - the color of the border
+	// * @param innerLineWidth - a string to represent the width and the linear
+	// measurement.
+	// * @param distance - a string to represent the width and the linear
+	// measurement.
+	// * @param outerLineWidth - a string to represent the width and the linear
+	// measurement.
+	// */
+	// protected Border(String width, Color aColor, String innerLineWidth,
+	// String distance, String outerLineWidth) {
+	// color = aColor;
+	// this.width = getLineWidth(width);
+	// this.linearMeasure = getLineMeasure(width);
+	// setDoubleLineWidth(innerLineWidth, distance, outerLineWidth);
+	// }
+
+	/**
+	 * Return the line style of the border.
+	 * <p>
+	 * The possible return value are "SINGLE","DOUBLE", and "NONE";
+	 * 
+	 * @return the line style of the border.
+	 */
+	public StyleTypeDefinitions.LineType getLineStyle() {
+		return lineStyle;
+	}
+
+	/**
+	 * Set the line style of the border.
+	 * <p>
+	 * The valid parameter can be "SINGLE","DOUBLE", and "NONE";
+	 * 
+	 * @param lineStyle
+	 *            - the line style of the border.
+	 */
+	public void setLineStyle(StyleTypeDefinitions.LineType lineStyle) {
+		this.lineStyle = lineStyle;
+	}
+
+	/**
+	 * Set border style by a description string. The description string includes
+	 * border width, line style and color. For example:
+	 * "0.0362in double #ff3333" is a valid description string.
+	 * 
+	 * @param borderDesc
+	 *            - the description of border style
+	 */
+	protected void setBorderByDescription(String borderDesc) {
+		StringTokenizer st = new StringTokenizer(borderDesc);
+		if (st.countTokens() != 3)
+			throw new IllegalArgumentException(
+					"The border description is invalid. Border description contains width, style and color, such as '0.0154in double #9900ff'");
+
+		String borderWidth = st.nextToken();
+		String borderStyle = st.nextToken();
+		Color borderColor = new Color(st.nextToken());
+
+		if (borderStyle.equals("solid"))
+			borderStyle = StyleTypeDefinitions.LineType.SINGLE.toString();
+
+		StyleTypeDefinitions.LineType borderStyleType = StyleTypeDefinitions.LineType.enumValueOf(borderStyle);
+
+		this.width = getLineWidth(borderWidth);
+		this.linearMeasure = getLineMeasure(borderWidth);
+		setLineStyle(borderStyleType);
+		setColor(borderColor);
+	}
+
+	/**
+	 * Return the description string of border style. The description string
+	 * includes border width, line style and color. For example,
+	 * "0.0362in double #ff3333".
+	 * 
+	 * @return the description string of border style
+	 */
+	protected String getBorderDescription() {
+		switch (lineStyle) {
+		case SINGLE:
+			return getWidth() + linearMeasure.toString() + " solid " + getColor();
+		case DOUBLE:
+			return getWidth() + linearMeasure.toString() + " double " + getColor();
+		case NONE:
+			return null;
+		}
+		return null;
+	}
+
+	/**
+	 * Return the color of this border
+	 * 
+	 * @return the color of this border
+	 */
+	public Color getColor() {
+		return color;
+	}
+
+	/**
+	 * Set the color of this border
+	 * 
+	 * @param color
+	 *            - the color
+	 */
+	public void setColor(Color color) {
+		this.color = color;
+	}
+
+	/**
+	 * Return the width of this border
+	 * 
+	 * @return the width of this border
+	 */
+	public double getWidth() {
+		return width;
+	}
+
+	/**
+	 * Set the width of this border
+	 * 
+	 * @param width
+	 *            - the width of this border
+	 */
+	public void setWidth(double width) {
+		this.width = width;
+	}
+
+	/**
+	 * Return a description string for border widths with double lines. The
+	 * description string includes inner line width, distance, and outline
+	 * width. For example, "0.0008in 0.0346in 0.0346in".
+	 * 
+	 * @return - the description for border widths with double lines
+	 */
+	protected String getDoubleLineWidthDescription() {
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return null;
+		DecimalFormat formater = new DecimalFormat(WidthFormatInInch, new DecimalFormatSymbols(Locale.US));
+		return formater.format(innerLineWidth) + linearMeasure.toString() + " " + formater.format(distance)
+				+ linearMeasure + " " + formater.format(outerLineWidth) + linearMeasure;
+	}
+
+	/**
+	 * Set the border widths with double lines by a description string. The
+	 * description string includes inner line width, distance, and outline
+	 * width. For example, "0.0008in 0.0346in 0.0346in".
+	 * 
+	 * @param widthDesc
+	 *            - the description string
+	 */
+	protected void setDoubleLineWidthByDescription(String widthDesc) {
+		StringTokenizer st = new StringTokenizer(widthDesc);
+		if (st.countTokens() != 3)
+			throw new IllegalArgumentException(
+					"The width description is invalid. Width description contains inner line width, distance and outer line width, such as '0.0154in 0154in 0154in'");
+
+		String thisInnerWidth = st.nextToken();
+		String thisDistance = st.nextToken();
+		String thisOuterWidth = st.nextToken();
+
+		setDoubleLineWidth(thisInnerWidth, thisDistance, thisOuterWidth);
+	}
+
+	/**
+	 * Return the inner line width of border with double lines
+	 * 
+	 * @return - the inner line width
+	 */
+	public double getInnerLineWidth() {
+		// DecimalFormat formater = new DecimalFormat(WidthFormatInInch);
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return getWidth();
+		else
+			return innerLineWidth;
+
+	}
+
+	/**
+	 * Set the inner line width of border with double lines If the line style is
+	 * not double, nothing will happen.
+	 * 
+	 * @param innerWidth
+	 *            - the inner line width
+	 */
+	public void setInnerLineWidth(double innerWidth) {
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return;
+		innerLineWidth = innerWidth;
+	}
+
+	/**
+	 * Return the distance between inner line and outer line of border with
+	 * double lines
+	 * 
+	 * @return - the distance between inner line and outer line.
+	 */
+	public double getDistance() {
+		// DecimalFormat formater = new DecimalFormat(WidthFormatInInch);
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return getWidth();
+		else
+			return distance;
+
+	}
+
+	/**
+	 * Set the distance between inner line and outer line of border with double
+	 * lines. If the line style is not double, nothing will happen.
+	 * 
+	 * @param distance
+	 *            - the distance between inner line and outer line.
+	 */
+	public void setDistance(double distance) {
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return;
+		else
+			this.distance = distance;
+
+	}
+
+	/**
+	 * Return the outer line width of border with double lines
+	 * 
+	 * @return - the outer line width.
+	 */
+	public double getOuterLineWidth() {
+		// DecimalFormat formater = new DecimalFormat(WidthFormatInInch);
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return getWidth();
+		else
+			return outerLineWidth;
+	}
+
+	/**
+	 * Set the outer line width of border with double lines If the line style is
+	 * not double, nothing will happen.
+	 * 
+	 * @param lineWidth
+	 *            - the outer line width
+	 */
+	public void setOuterLineWidth(double lineWidth) {
+		if (lineStyle == StyleTypeDefinitions.LineType.SINGLE)
+			return;
+		else
+			this.outerLineWidth = lineWidth;
+	}
+
+	private void setDoubleLineWidth(String innerLineWidth, String distance, String outerLineWidth) {
+		// get line measure for inner line
+		this.linearMeasure = getLineMeasure(innerLineWidth);
+		// get line width for distance
+		StyleTypeDefinitions.SupportedLinearMeasure lm = getLineMeasure(distance);
+		double lf = getLineWidth(distance);
+		this.distance = linearMeasure.convert(lf, lm);
+		// get line width for outer line
+		lm = getLineMeasure(outerLineWidth);
+		lf = getLineWidth(outerLineWidth);
+		this.outerLineWidth = linearMeasure.convert(lf, lm);
+		// get line width for inner line
+		this.innerLineWidth = getLineWidth(innerLineWidth);
+		// set line style
+		lineStyle = StyleTypeDefinitions.LineType.DOUBLE;
+	}
+
+	private StyleTypeDefinitions.SupportedLinearMeasure getLineMeasure(String width) {
+		for (SupportedLinearMeasure aIter : SupportedLinearMeasure.values()) {
+			if (width.endsWith(aIter.toString())) {
+				return aIter;
+			}
+		}
+		return null;
+	}
+
+	private double getLineWidth(String width) {
+		String floatValue = width.substring(0, width.length() - 2);
+		return Double.parseDouble(floatValue);
+	}
+
+	/**
+	 * Return a border which is same but with a different line measurement
+	 * 
+	 * @param newLineMeasure
+	 *            - the new measurement
+	 * @return the new border
+	 */
+	protected Border changeLineMeasure(StyleTypeDefinitions.SupportedLinearMeasure newLineMeasure) {
+		if (newLineMeasure == linearMeasure)
+			return this;
+		Border newBorder = new Border();
+		newBorder.width = newLineMeasure.convert(width, linearMeasure);
+		newBorder.distance = newLineMeasure.convert(distance, linearMeasure);
+		newBorder.innerLineWidth = newLineMeasure.convert(innerLineWidth, linearMeasure);
+		newBorder.outerLineWidth = newLineMeasure.convert(outerLineWidth, linearMeasure);
+		newBorder.color = this.color;
+		newBorder.lineStyle = this.lineStyle;
+		newBorder.linearMeasure = newLineMeasure;
+		return newBorder;
+	}
+
+	@Override
+	public String toString() {
+		return "Border:" + getBorderDescription() + ";" + "BorderWidth:" + getDoubleLineWidthDescription();
+	}
+
+	private boolean doubleEqual(double d1, double d2) {
+		if (this.linearMeasure == SupportedLinearMeasure.IN && Math.abs(d1 - d2) > 0.0002)
+			return false;
+		if (this.linearMeasure == SupportedLinearMeasure.PT && Math.abs(d1 - d2) > 0.02)
+			return false;
+		return true;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (o == Border.NONE && this == Border.NONE)
+			return true;
+		if (o instanceof Border) {
+			Border aBorder = (Border) o;
+			if (aBorder.getLineStyle() != this.getLineStyle())
+				return false;
+			if (!aBorder.color.toString().equals(this.color.toString()))
+				return false;
+			if (aBorder.linearMeasure != this.linearMeasure) {
+				Border bBorder = aBorder.changeLineMeasure(this.linearMeasure);
+				return this.equals(bBorder);
+			}
+			if (!doubleEqual(aBorder.width, this.width))
+				return false;
+			if (lineStyle == StyleTypeDefinitions.LineType.DOUBLE) {
+				if (!doubleEqual(aBorder.distance, this.distance))
+					return false;
+				if (!doubleEqual(aBorder.innerLineWidth, this.innerLineWidth))
+					return false;
+				if (!doubleEqual(aBorder.outerLineWidth, this.outerLineWidth))
+					return false;
+			}
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Return the linear measurement
+	 * 
+	 * @return the the linear measurement
+	 */
+	public StyleTypeDefinitions.SupportedLinearMeasure getLinearMeasure() {
+		return linearMeasure;
+	}
+
+	/**
+	 * Set linear measurement
+	 * 
+	 * @param linearMeasure
+	 *            the linear measurement
+	 */
+	public void setLinearMeasure(StyleTypeDefinitions.SupportedLinearMeasure linearMeasure) {
+		this.linearMeasure = linearMeasure;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/DefaultStyleHandler.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/DefaultStyleHandler.java
new file mode 100644
index 0000000..23e0431
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/DefaultStyleHandler.java
@@ -0,0 +1,689 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+
+package org.odftoolkit.simple.style;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.table.CellStyleHandler;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * This class is the default style handler. It provides methods to get the
+ * readable style element and the writable style element. It also provides
+ * method to get all kinds of style properties elements.
+ * 
+ * @since 0.5
+ */
+public class DefaultStyleHandler {
+	/**
+	 * The style element that will be processed.
+	 */
+	protected OdfStyleBase mStyleElement;
+	/**
+	 * The writable style element that will be processed.
+	 */
+	protected OdfStyle mWritableStyleElement;
+	/**
+	 * Whether the default style is used.
+	 */
+	protected boolean isUseDefaultStyle = false;
+
+	/**
+	 * The odf element
+	 */
+	protected OdfStylableElement mOdfElement;
+	/**
+	 * The document
+	 */
+	protected Document mDocument;
+
+	/**
+	 * The readable text properties element.
+	 */
+	protected TextProperties mTextProperties;
+
+	/**
+	 * The writable text properties element.
+	 */
+	protected TextProperties mWritableTextProperties;
+
+	/**
+	 * The readable table cell properties element.
+	 */
+	protected TableCellProperties mTableCellProperties;
+
+	/**
+	 * The writable table cell properties element.
+	 */
+	protected TableCellProperties mWritableTableCellProperties;
+
+	/**
+	 * The readable paragraph properties element.
+	 */
+	protected ParagraphProperties mParagraphProperties;
+
+	/**
+	 * The writable paragraph properties element.
+	 */
+	protected ParagraphProperties mWritableParagraphProperties;
+
+	/**
+	 * The readable graphics properties element.
+	 */
+	protected GraphicProperties mGraphicProperties;
+
+	/**
+	 * The writable graphics properties element.
+	 */
+	protected GraphicProperties mWritableGraphicProperties;
+	/**
+	 * The readable table properties element.
+	 */
+	protected TableProperties mTableProperties;
+
+	/**
+	 * The writable table properties element.
+	 */
+	protected TableProperties mWritableTableProperties;
+	/**
+	 * Constructor of DefaultStyleHandler
+	 * 
+	 * @param element
+	 *            - the instance of structure component in an ODF document
+	 * 
+	 */
+	public DefaultStyleHandler(OdfStylableElement element) {
+		mOdfElement = element;
+		mDocument = ((Document) ((OdfFileDom) mOdfElement.getOwnerDocument()).getDocument());
+	}
+
+	/**
+	 * This HashMap contains the relationship between OdfStyleFamily and
+	 * OdfStylePropertiesSet.
+	 */
+	protected static HashMap<OdfStyleFamily, EnumSet<OdfStylePropertiesSet>> mFamilyProperties = new HashMap<OdfStyleFamily, EnumSet<OdfStylePropertiesSet>>();
+
+	{
+		mFamilyProperties.put(OdfStyleFamily.Text, EnumSet.of(OdfStylePropertiesSet.TextProperties));
+		mFamilyProperties.put(OdfStyleFamily.Paragraph, EnumSet.of(OdfStylePropertiesSet.TextProperties,
+				OdfStylePropertiesSet.ParagraphProperties));
+		mFamilyProperties.put(OdfStyleFamily.TableCell, EnumSet.of(OdfStylePropertiesSet.TextProperties,
+				OdfStylePropertiesSet.ParagraphProperties, OdfStylePropertiesSet.TableCellProperties));
+		mFamilyProperties.put(OdfStyleFamily.Graphic, EnumSet.of(OdfStylePropertiesSet.TextProperties,
+				OdfStylePropertiesSet.ParagraphProperties, OdfStylePropertiesSet.GraphicProperties));
+		mFamilyProperties.put(OdfStyleFamily.Presentation, EnumSet.of(OdfStylePropertiesSet.TextProperties,
+				OdfStylePropertiesSet.ParagraphProperties, OdfStylePropertiesSet.GraphicProperties));
+		mFamilyProperties.put(OdfStyleFamily.Section, EnumSet.of(OdfStylePropertiesSet.SectionProperties));
+		mFamilyProperties.put(OdfStyleFamily.Ruby, EnumSet.of(OdfStylePropertiesSet.RubyProperties));
+		mFamilyProperties.put(OdfStyleFamily.Table, EnumSet.of(OdfStylePropertiesSet.TableProperties));
+		mFamilyProperties.put(OdfStyleFamily.TableRow, EnumSet.of(OdfStylePropertiesSet.TableRowProperties));
+		mFamilyProperties.put(OdfStyleFamily.TableColumn, EnumSet.of(OdfStylePropertiesSet.TableColumnProperties));
+		mFamilyProperties.put(OdfStyleFamily.DrawingPage, EnumSet.of(OdfStylePropertiesSet.DrawingPageProperties));
+		mFamilyProperties.put(OdfStyleFamily.Chart, EnumSet.of(OdfStylePropertiesSet.TextProperties,
+				OdfStylePropertiesSet.ParagraphProperties, OdfStylePropertiesSet.GraphicProperties,
+				OdfStylePropertiesSet.ChartProperties));
+	}
+
+	/**
+	 * Return the text style properties definition for this component, only for
+	 * read function.
+	 * <p>
+	 * Null will be returned if there is no style definition.
+	 * <p>
+	 * Null will be returned if there is no explicit text style properties
+	 * definition for this component.
+	 * <p>
+	 * Note if you try to write style properties to the returned object, errors
+	 * will be met with.
+	 * 
+	 * @return the text style properties definition for this component, only for
+	 *         read function
+	 */
+	public TextProperties getTextPropertiesForRead() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.TextProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"Text properties are not supported by style family: " + mOdfElement.getStyleFamily() + "!", "");
+			return null;
+		}
+
+		if (mWritableTextProperties != null)
+			return mWritableTextProperties;
+		else if (mTextProperties != null)
+			return mTextProperties;
+
+		OdfStyleBase style = getStyleElementForRead();
+		if (style == null) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE, "No style definition is found!", "");
+			return null;
+		}
+		mTextProperties = TextProperties.getTextProperties(style);
+		if (mTextProperties != null)
+			return mTextProperties;
+		else {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"No explicit text properties definition is found!", "");
+			return null;
+		}
+	}
+
+	/**
+	 * Return the text style properties definition for this component, for read
+	 * and write function.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * definition.
+	 * <p>
+	 * An empty text style properties definition will be created if there is no
+	 * explicit text style properties definition.
+	 * 
+	 * @return the text style properties definition for this component, for read
+	 *         and write function
+	 */
+	public TextProperties getTextPropertiesForWrite() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.TextProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"Text properties are not supported by style family: " + mOdfElement.getStyleFamily() + "!", "");
+			return null;
+		}
+
+		if (mWritableTextProperties != null)
+			return mWritableTextProperties;
+		OdfStyle style = getStyleElementForWrite();
+		mWritableTextProperties = TextProperties.getOrCreateTextProperties(style);
+		return mWritableTextProperties;
+	}
+
+	/**
+	 * Return the cell style properties definition for this component, only for
+	 * read function.
+	 * <p>
+	 * Null will be returned if there is no style definition.
+	 * <p>
+	 * Null will be returned if there is no explicit cell style properties
+	 * definition for this component.
+	 * <p>
+	 * Note if you try to write style properties to the returned object, errors
+	 * will be met with.
+	 * 
+	 * @return the cell style properties definition for this component, only for
+	 *         read function
+	 */
+	public TableCellProperties getTableCellPropertiesForRead() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.TableCellProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName())
+					.log(
+							Level.FINE,
+							"TableCell properties are not supported by style family: " + mOdfElement.getStyleFamily()
+									+ "!", "");
+			return null;
+		}
+
+		if (mWritableTableCellProperties != null)
+			return mWritableTableCellProperties;
+		else if (mTableCellProperties != null)
+			return mTableCellProperties;
+
+		OdfStyleBase style = getStyleElementForRead();
+		if (style == null) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE, "No style definition is found!", "");
+			return null;
+		}
+		mTableCellProperties = TableCellProperties.getTableCellProperties(style);
+		if (mTableCellProperties != null)
+			return mTableCellProperties;
+		else {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"No explicit table cell properties definition is found!", "");
+			return null;
+		}
+	}
+
+	/**
+	 * Return the cell style properties definition for this component, for read
+	 * and write function.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * definition.
+	 * <p>
+	 * An empty cell style properties definition will be created if there is no
+	 * explicit cell style properties definition.
+	 * 
+	 * @return the cell style properties definition for this component, for read
+	 *         and write function
+	 */
+	public TableCellProperties getTableCellPropertiesForWrite() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.TableCellProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName())
+					.log(
+							Level.FINE,
+							"TableCell properties are not supported by style family: " + mOdfElement.getStyleFamily()
+									+ "!", "");
+			return null;
+		}
+
+		if (mWritableTableCellProperties != null)
+			return mWritableTableCellProperties;
+		OdfStyle style = getStyleElementForWrite();
+		mWritableTableCellProperties = TableCellProperties.getOrCreateTableCellProperties(style);
+		return mWritableTableCellProperties;
+	}
+
+	/**
+	 * Return the paragraph style properties definition for this component, only
+	 * for read function.
+	 * <p>
+	 * Null will be returned if there is no style definition.
+	 * <p>
+	 * Null will be returned if there is no explicit paragraph style properties
+	 * definition for this component.
+	 * <p>
+	 * Note if you try to write style properties to the returned object, errors
+	 * will be met with.
+	 * 
+	 * @return the paragraph style properties definition for this component,
+	 *         only for read function
+	 */
+	public ParagraphProperties getParagraphPropertiesForRead() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.ParagraphProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName())
+					.log(
+							Level.FINE,
+							"Paragraph properties are not supported by style family: " + mOdfElement.getStyleFamily()
+									+ "!", "");
+			return null;
+		}
+
+		if (mWritableParagraphProperties != null)
+			return mWritableParagraphProperties;
+		else if (mParagraphProperties != null)
+			return mParagraphProperties;
+
+		OdfStyleBase style = getStyleElementForRead();
+		if (style == null) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE, "No style definition is found!", "");
+			return null;
+		}
+		mParagraphProperties = ParagraphProperties.getParagraphProperties(style);
+		if (mParagraphProperties != null)
+			return mParagraphProperties;
+		else {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"No explicit paragraph properties definition is found!", "");
+			return null;
+		}
+	}
+
+	/**
+	 * Return the paragraph style properties definition for this component, for
+	 * read and write function.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * definition.
+	 * <p>
+	 * An empty paragraph style properties definition will be created if there
+	 * is no explicit paragraph style properties definition.
+	 * 
+	 * @return the paragraph style properties definition for this component, for
+	 *         read and write function
+	 */
+	public ParagraphProperties getParagraphPropertiesForWrite() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.ParagraphProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName())
+					.log(
+							Level.FINE,
+							"Paragraph properties are not supported by style family: " + mOdfElement.getStyleFamily()
+									+ "!", "");
+			return null;
+		}
+
+		if (mWritableParagraphProperties != null)
+			return mWritableParagraphProperties;
+		OdfStyle style = getStyleElementForWrite();
+		mWritableParagraphProperties = ParagraphProperties.getOrCreateParagraphProperties(style);
+		return mWritableParagraphProperties;
+	}
+
+	/**
+	 * Return the graphic style properties definition for this component, only
+	 * for read function.
+	 * <p>
+	 * Null will be returned if there is no style definition.
+	 * <p>
+	 * Null will be returned if there is no explicit graphic style properties
+	 * definition for this component.
+	 * <p>
+	 * Note if you try to write style properties to the returned object, errors
+	 * will be met with.
+	 * 
+	 * @return the graphic style properties definition for this component, only
+	 *         for read function
+	 */
+	public GraphicProperties getGraphicPropertiesForRead() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.GraphicProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"Graphics properties are not supported by style family: " + mOdfElement.getStyleFamily() + "!", "");
+			return null;
+		}
+
+		if (mWritableGraphicProperties != null)
+			return mWritableGraphicProperties;
+		else if (mGraphicProperties != null)
+			return mGraphicProperties;
+
+		OdfStyleBase style = getStyleElementForRead();
+		if (style == null) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE, "No style definition is found!", "");
+			return null;
+		}
+		mGraphicProperties = GraphicProperties.getGraphicProperties(style);
+		if (mGraphicProperties != null)
+			return mGraphicProperties;
+		else {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"No explicit graphic properties definition is found!", "");
+			return null;
+		}
+	}
+
+	/**
+	 * Return the text style properties definition for this component, for read
+	 * and write function.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * definition.
+	 * <p>
+	 * An empty text style properties definition will be created if there is no
+	 * explicit text style properties definition.
+	 * 
+	 * @return the text style properties definition for this component, for read
+	 *         and write function
+	 */
+	public GraphicProperties getGraphicPropertiesForWrite() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(OdfStylePropertiesSet.GraphicProperties)) {
+			Logger.getLogger(CellStyleHandler.class.getName()).log(Level.FINE,
+					"Graphics properties are not supported by style family: " + mOdfElement.getStyleFamily() + "!", "");
+			return null;
+		}
+
+		if (mWritableGraphicProperties != null)
+			return mWritableGraphicProperties;
+		OdfStyle style = getStyleElementForWrite();
+		mWritableGraphicProperties = GraphicProperties.getOrCreateGraphicProperties(style);
+		return mWritableGraphicProperties;
+	}
+
+	/**
+	 * Return the table style properties definition for this component, only for
+	 * read function.
+	 * <p>
+	 * Null will be returned if there is no style definition.
+	 * Note if you try to write style properties to the returned object, errors
+	 * will be met with.
+	 * 
+	 * @return the table style properties definition for this component, only
+	 *         for read function
+	 */
+	public TableProperties getTablePropertiesForRead() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(
+				OdfStylePropertiesSet.TableProperties)) {
+			Logger.getLogger(DefaultStyleHandler.class.getName()).log(
+					Level.FINE,
+					"Table properties are not supported by style family: "
+							+ mOdfElement.getStyleFamily() + "!", "");
+			return null;
+		}
+
+		if (mWritableTableProperties != null)
+			return mWritableTableProperties;
+		else if (mTableProperties != null)
+			return mTableProperties;
+
+		OdfStyleBase style = getStyleElementForRead();
+		if (style == null) {
+			Logger.getLogger(DefaultStyleHandler.class.getName()).log(
+					Level.FINE, "No style definition is found!", "");
+			return null;
+		}
+		mTableProperties = TableProperties.getTableProperties(style);
+		if (mTableProperties != null)
+			return mTableProperties;
+		else {
+			Logger.getLogger(DefaultStyleHandler.class.getName()).log(
+					Level.FINE,
+					"No explicit table properties definition is found!", "");
+			return null;
+		}
+	}
+
+	/**
+	 * Return the table style properties definition for this component, for read
+	 * and write function.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * An empty table style properties definition will be created if there is no
+	 * explicit table style properties definition.
+	 * 
+	 * @return the table style properties definition for this component, for
+	 *         read and write function
+	 */
+	public TableProperties getTablePropertiesForWrite() {
+		if (!mFamilyProperties.get(mOdfElement.getStyleFamily()).contains(
+				OdfStylePropertiesSet.TableProperties)) {
+			Logger.getLogger(DefaultStyleHandler.class.getName()).log(
+					Level.FINE,
+					"Table properties are not supported by style family: "
+							+ mOdfElement.getStyleFamily() + "!", "");
+			return null;
+		}
+
+		if (mWritableTableProperties != null)
+			return mWritableTableProperties;
+		OdfStyle style = getStyleElementForWrite();
+		mWritableTableProperties = TableProperties
+				.getOrCreateTableProperties(style);
+		return mWritableTableProperties;
+	}
+
+	/**
+	 * Return the used style name of this component.
+	 * <p>
+	 * This method can be override by sub classes.
+	 * <p>
+	 * Please note the return of this method might not be same with the
+	 * getStyleName() of component. If the style name is shared by multiple
+	 * elements, getStyleElementForWrite() will return a copied style element,
+	 * which is not same with the return of this method.
+	 * 
+	 * @return - the used style name of this component
+	 */
+	protected String getUsedStyleName() {
+		return mOdfElement.getStyleName();
+	}
+
+	/**
+	 * Return a readable style element by style name.
+	 * <p>
+	 * If the style name is null, the default style will be returned.
+	 * 
+	 * @param styleName
+	 *            - the style name
+	 * @return a readable style element
+	 */
+	protected OdfStyleBase getReadableStyleElementByName(String styleName) {
+		OdfDefaultStyle defaultStyleElement = null;
+		if (styleName == null || (styleName.equals(""))) {
+			// get from default style element
+			defaultStyleElement = mDocument.getDocumentStyles().getDefaultStyle(mOdfElement.getStyleFamily());
+			isUseDefaultStyle = true;
+			return defaultStyleElement;
+		}
+
+		OdfStyle styleElement = mOdfElement.getAutomaticStyles().getStyle(styleName, mOdfElement.getStyleFamily());
+
+		if (styleElement == null) {
+			styleElement = mDocument.getDocumentStyles().getStyle(styleName, mOdfElement.getStyleFamily());
+		}
+
+		if (styleElement == null) {
+			styleElement = mOdfElement.getDocumentStyle();
+		}
+
+		if (styleElement == null) {
+			return null;
+		}
+
+		return styleElement;
+	}
+
+	/**
+	 * Return a writable style element by style name.
+	 * <p>
+	 * If the style is shared, a copied style element would be returned.
+	 * <p>
+	 * If the style name is null, the default style will be copied.
+	 * 
+	 * @param styleName
+	 *            - the style name
+	 * @return a writable style element
+	 */
+	protected OdfStyle getWritableStyleElementByName(String styleName, boolean isShared) {
+		boolean createNew = isShared;
+		OdfStyle styleElement = null;
+		OdfDefaultStyle defaultStyleElement = null;
+		if (styleName == null || (styleName.equals(""))) {
+			createNew = true;
+			// get from default style element
+			defaultStyleElement = mDocument.getDocumentStyles().getDefaultStyle(mOdfElement.getStyleFamily());
+		} else {
+			OdfOfficeAutomaticStyles styles = mOdfElement.getAutomaticStyles();
+			styleElement = styles.getStyle(styleName, mOdfElement.getStyleFamily());
+
+			// If not default cell style definition,
+			// Try to find if the style is defined in document styles
+			if (styleElement == null && defaultStyleElement == null) {
+				styleElement = mDocument.getDocumentStyles().getStyle(styleName, mOdfElement.getStyleFamily());
+			}
+
+			if (styleElement == null && defaultStyleElement == null) {
+				styleElement = mOdfElement.getDocumentStyle();
+			}
+			if (styleElement == null || styleElement.getStyleUserCount() > 1) {
+				createNew = true;
+			}
+		}
+		// if style name is null or this style are used by many users,
+		// should create a new one.
+		if (createNew) {
+			OdfStyle newStyle = mOdfElement.getAutomaticStyles().newStyle(mOdfElement.getStyleFamily());
+			if (styleElement != null) {
+				newStyle.setProperties(styleElement.getStylePropertiesDeep());
+				// copy attributes
+				NamedNodeMap attributes = styleElement.getAttributes();
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node attr = attributes.item(i);
+					if (!attr.getNodeName().equals("style:name")) {
+						newStyle.setAttributeNS(attr.getNamespaceURI(), attr.getNodeName(), attr.getNodeValue());
+					}
+				}// end of copying attributes
+			} else if (defaultStyleElement != null) {
+				newStyle.setProperties(defaultStyleElement.getStylePropertiesDeep());
+				// copy attributes
+				NamedNodeMap attributes = defaultStyleElement.getAttributes();
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node attr = attributes.item(i);
+					if (!attr.getNodeName().equals("style:name")) {
+						newStyle.setAttributeNS(attr.getNamespaceURI(), attr.getNodeName(), attr.getNodeValue());
+					}
+				}// end of copying attributes
+				isUseDefaultStyle = true;
+			}
+			// mCellElement.getAutomaticStyles().appendChild(newStyle);
+			String newname = newStyle.getStyleNameAttribute();
+			mOdfElement.setStyleName(newname);
+			return newStyle;
+		}
+		return styleElement;
+	}
+
+	/**
+	 * Return the style element for this component, only for read function. This
+	 * method will invode <code>getusedStyleName</code> to get the style name,
+	 * and then find the readable style element by name.
+	 * <p>
+	 * Null will be returned if there is no style definition.
+	 * <p>
+	 * Note if you try to write style properties to the returned object, errors
+	 * will be met with.
+	 * 
+	 * @return the style element
+	 * @see #getUsedStyleName()
+	 */
+	public OdfStyleBase getStyleElementForRead() {
+		// Return current used style
+		if (getCurrentUsedStyle() != null)
+			return getCurrentUsedStyle();
+
+		String styleName = getUsedStyleName();
+		mStyleElement = getReadableStyleElementByName(styleName);
+		return mStyleElement;
+	}
+
+	/**
+	 * Return the style element for this component, for read and write
+	 * functions. This method will invode <code>getusedStyleName</code> to get
+	 * the style name, and then find the writable style element by name.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * definition.
+	 * 
+	 * @return the style element
+	 * @see #getUsedStyleName()
+	 */
+	public OdfStyle getStyleElementForWrite() {
+		if (mWritableStyleElement != null)
+			return mWritableStyleElement;
+
+		String styleName = getUsedStyleName();
+		mWritableStyleElement = getWritableStyleElementByName(styleName, false);
+		return mWritableStyleElement;
+	}
+
+	private OdfStyleBase getCurrentUsedStyle() {
+		if (mWritableStyleElement != null)
+			return mWritableStyleElement;
+		else
+			return mStyleElement;
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/Font.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/Font.java
new file mode 100644
index 0000000..4c6bf89
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/Font.java
@@ -0,0 +1,366 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.Locale;
+
+import org.odftoolkit.odfdom.type.Color;
+
+/**
+ * This class represents the font style settings, including font family name,
+ * font style, size, front color.
+ * 
+ * @since 0.3
+ */
+public class Font {
+
+	String familyName; // svg:font-family
+	String fontName; // style:name @ <style:font-face>
+	StyleTypeDefinitions.FontStyle simpleFontStyle; // fo:font-style,
+	StyleTypeDefinitions.TextLinePosition textLinePosition; //style:text-line-through-style and style:text-underline-style
+	// fo:font-weight
+	double size; // fo:font-size
+	// Locale language;
+	Color color;
+
+	/**
+	 * Create a font with specific family name, font style, and size.
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the size
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = StyleTypeDefinitions.TextLinePosition.REGULAR;
+		this.size = fontSize;
+	}
+
+	/**
+	 * Create a font with specific family name, font style, size and line position.
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the size
+	 * @param textLinePosition
+	 * 			  - the line position
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize, StyleTypeDefinitions.TextLinePosition textLinePosition) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = textLinePosition;
+		this.size = fontSize;
+	}
+
+	/**
+	 * Create a font with specific family name, style, size, and front color.
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the size
+	 * @param color
+	 *            - the front color
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize, Color color) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = StyleTypeDefinitions.TextLinePosition.REGULAR;
+		this.size = fontSize;
+		this.color = color;
+	}
+
+	/**
+	 * Create a font with specific family name, style, size, front color and line position
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the size
+	 * @param color
+	 *            - the front color
+	 * @param textLinePosition
+	 * 			  - the line position
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize, Color color, StyleTypeDefinitions.TextLinePosition textLinePosition) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = textLinePosition;
+		this.size = fontSize;
+		this.color = color;
+	}
+
+	/**
+	 * Create a font with specific family name, style, size for a specific
+	 * character. For example, a font style setting for English character.
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the font size
+	 * @param language
+	 *            - the character information
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize, Locale language) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = StyleTypeDefinitions.TextLinePosition.REGULAR;
+		this.size = fontSize;
+	}
+
+	/**
+	 * Create a font with specific family name, style, size, and color for a
+	 * specific character. For example, a font style setting for English
+	 * character.
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the size
+	 * @param color
+	 *            - the front color
+	 * @param language
+	 *            - the character information
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize, Color color, Locale language) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = StyleTypeDefinitions.TextLinePosition.REGULAR;
+		this.size = fontSize;
+		this.color = color;
+	}
+	
+	/**
+	 * Create a font with specific family name, style, size, color, and line position for a
+	 * specific character. For example, a font style setting for English
+	 * character.
+	 * 
+	 * @param fontFamilyName
+	 *            - the family name
+	 * @param simpleFontStyle
+	 *            - the font style
+	 * @param fontSize
+	 *            - the size
+	 * @param color
+	 *            - the front color
+	 * @param textLinePosition
+	 * 			  - the line position
+	 * @param language
+	 *            - the character information
+	 */
+	public Font(String fontFamilyName, StyleTypeDefinitions.FontStyle simpleFontStyle, double fontSize, Color color, StyleTypeDefinitions.TextLinePosition textLinePosition,
+			Locale language) {
+		this.familyName = fontFamilyName;
+		this.simpleFontStyle = simpleFontStyle;
+		this.textLinePosition = textLinePosition;
+		this.size = fontSize;
+		this.color = color;
+	}
+
+	/**
+	 * Return the font family
+	 * 
+	 * @return the font family
+	 */
+	public String getFamilyName() {
+		return familyName;
+	}
+
+	/**
+	 * Set the font family.
+	 * <p>
+	 * Font family name is what you get from the font list in ODF editors.
+	 * 
+	 * @param familyName
+	 *            - the font family name
+	 */
+	public void setFamilyName(String familyName) {
+		this.familyName = familyName;
+	}
+
+	/**
+	 * Return the font name
+	 * <p>
+	 * Note the font name might be different from font family name. A font
+	 * family may have different font name definitions.
+	 * 
+	 * @return the font name
+	 */
+	protected String getFontName() {
+		return fontName;
+	}
+
+	/**
+	 * Set the font name
+	 * <p>
+	 * Note the font name might be different from font family name. A font
+	 * family may have different font name definitions.
+	 * 
+	 * @param fontName
+	 *            - the font name
+	 */
+	protected void setFontName(String fontName) {
+		this.fontName = fontName;
+	}
+
+	/**
+	 * Get the font style
+	 * 
+	 * @return the font style
+	 */
+	public StyleTypeDefinitions.FontStyle getFontStyle() {
+		return simpleFontStyle;
+	}
+
+	/**
+	 * Set the font style
+	 * 
+	 * @param simpleFontStyle
+	 *            - the font style
+	 */
+	public void setFontStyle(StyleTypeDefinitions.FontStyle simpleFontStyle) {
+		this.simpleFontStyle = simpleFontStyle;
+	}
+
+	/**
+	 * Get the font text line position
+	 * 
+	 * @return the font text line position
+	 */
+	public StyleTypeDefinitions.TextLinePosition getTextLinePosition() {
+		return textLinePosition;
+	}
+
+	/**
+	 * Set the font text line position
+	 * 
+	 * @param textLinePosition
+	 *            - the font text line position
+	 */
+	public void setTextLinePosition(StyleTypeDefinitions.TextLinePosition textLinePosition) {
+		this.textLinePosition = textLinePosition;
+	}
+	
+	/**
+	 * Return the font size in measurement point(PT).
+	 * 
+	 * @return - the font size in measurement point(PT)
+	 */
+	public double getSize() {
+		return size;
+	}
+
+	/**
+	 * Set the font size. The font size is in measurement point(PT).
+	 * 
+	 * @param size
+	 *            - the font size
+	 */
+	public void setSize(double size) {
+		this.size = size;
+	}
+
+	// /**
+	// * Return the character information, which the font setting will affect.
+	// *
+	// * @return the character information
+	// * @deprecated
+	// */
+	// public Locale getLocale() {
+	// return language;
+	// }
+	//
+	// /**
+	// * Set the character information, which the font setting will affect.
+	// *
+	// * @param language
+	// * - the character information
+	// * @deprecated
+	// */
+	// public void setLocale(Locale language) {
+	// this.language = language;
+	// }
+
+	/**
+	 * Return the font color
+	 * 
+	 * @return the font color
+	 */
+	public Color getColor() {
+		return color;
+	}
+
+	/**
+	 * Set the font color
+	 * 
+	 * @param color
+	 *            - the font color
+	 */
+	public void setColor(Color color) {
+		this.color = color;
+	}
+
+	@Override
+	public String toString() {
+		return "FamilyName:" + getFamilyName() + "; Style:" + getFontStyle() + "; Size:" + getSize() + "; Color:"
+				+ getColor() + "; TextLinePosition:" + getTextLinePosition();
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (o instanceof Font) {
+			Font f = (Font) o;
+			if (!this.getFamilyName().equals(f.getFamilyName()))
+				return false;
+			if (!(Math.abs(this.getSize() - f.getSize()) < 0.005))
+				return false;
+			if (!(this.getFontStyle() == f.getFontStyle()))
+				return false;
+			// if ((this.getLocale() != null && f.getLocale() == null)
+			// || (this.getLocale() == null && f.getLocale() != null))
+			// return false;
+			// if ((this.getLocale() != null && f.getLocale() != null)
+			// && (!this.getLocale().equals(f.getLocale())))
+			// return false;
+			if ((this.getColor() != null && f.getColor() == null) || (this.getColor() == null && f.getColor() != null))
+				return false;
+			if ((this.getColor() != null && f.getColor() != null)
+					&& (!this.getColor().toString().equals(f.getColor().toString())))
+				return false;
+			return true;
+		}
+		return false;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/GraphicProperties.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/GraphicProperties.java
new file mode 100644
index 0000000..75f8f2b
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/GraphicProperties.java
@@ -0,0 +1,520 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalBlTrAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalBlTrWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalTlBrAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalTlBrWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRunThroughAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.OdfDrawFill;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.OdfDrawStroke;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+
+/**
+ * This class represents the graphic style settings. It provides methods to
+ * access borders and background styles. More functions will be added later.
+ * <p>
+ * This class is a corresponded high level class for element
+ * "style:graphic-properties". It provides methods to access the attributes and
+ * children of "style:graphic-properties".
+ * 
+ * @since 0.5
+ */
+public class GraphicProperties {
+
+	private StyleGraphicPropertiesElement mElement;
+	BorderPropertiesImpl mBorderPropertiesHandler;
+
+	/**
+	 * Create a paragraph style setting object, which has the association with
+	 * an element "style:paragraph-properties".
+	 * 
+	 * @param properties
+	 *            - the element "style:paragraph-properties"
+	 */
+	protected GraphicProperties(StyleGraphicPropertiesElement properties) {
+		mElement = properties;
+		mBorderPropertiesHandler = new BorderPropertiesImpl(mElement);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>GraphicProperties</p> to represent the "style:graphic-properties" in a style element.
+	 * <p>If there is no "style:graphic-properties" defined in the style element, a new "style:graphic-properties" element will be created.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>GraphicProperties</p>
+	 */
+	public static GraphicProperties getOrCreateGraphicProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style.getOrCreatePropertiesElement(OdfStylePropertiesSet.GraphicProperties);
+		return new GraphicProperties((StyleGraphicPropertiesElement) properties);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>GraphicProperties</p> to represent the "style:graphic-properties" in a style element.
+	 * <p>If there is no "style:graphic-properties" defined in the style element, null will be returned.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>GraphicProperties</p>;Null if there is no
+	 *         "style:graphic-properties" defined
+	 */
+	public static GraphicProperties getGraphicProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style.getPropertiesElement(OdfStylePropertiesSet.GraphicProperties);
+		if (properties != null)
+			return new GraphicProperties((StyleGraphicPropertiesElement) properties);
+		else
+			return null;
+	}
+
+	/**
+	 * Set the border style.
+	 * <p>
+	 * The first parameter <code>bordersType</code> describes which borders you
+	 * want to apply the style to, e.g. up border, bottom border, left border,
+	 * right border, diagonal lines or four borders.
+	 * <p>
+	 * The border style information will be removed if the parameter
+	 * <code>bordersType</code> is NONE.
+	 * 
+	 * @param bordersType
+	 *            - the type of the borders
+	 * @param border
+	 *            - the border style description
+	 */
+	public void setBorders(StyleTypeDefinitions.CellBordersType bordersType, Border border) {
+		switch (bordersType) {
+		case BOTTOM:
+			setBottomBorder(border);
+			break;
+		case LEFT:
+			setLeftBorder(border);
+			break;
+		case RIGHT:
+			setRightBorder(border);
+			break;
+		case TOP:
+			setTopBorder(border);
+			break;
+		case DIAGONALBLTR:
+			throw new RuntimeException("DIAGONALBL is not supported");
+		case DIAGONALTLBR:
+			throw new RuntimeException("DIAGONALTLBR is not supported");
+		case ALL_FOUR:
+			setBorder(border);
+			break;
+		case LEFT_RIGHT:
+			setLeftBorder(border);
+			// border.switchInnerLineOuterLineWidth();
+			setRightBorder(border);
+			break;
+		case TOP_BOTTOM:
+			setTopBorder(border);
+			// border.switchInnerLineOuterLineWidth();
+			setBottomBorder(border);
+			break;
+		case DIAGONAL_LINES:
+			throw new RuntimeException("DIAGONAL_LINES is not supported");
+		case NONE:
+			mElement.removeAttribute(StyleBorderLineWidthAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthBottomAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderBottomAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthTopAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderTopAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthLeftAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderLeftAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthRightAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderRightAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalBlTrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalBlTrAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalTlBrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalTlBrAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	/**
+	 * Return the border setting for all four borders.
+	 * <p>
+	 * Null will be returned if there is no border setting for all four borders.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBorder() {
+		return mBorderPropertiesHandler.getBorder();
+	}
+
+	/**
+	 * Return the border setting for the top border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the top border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getTopBorder() {
+		return mBorderPropertiesHandler.getTopBorder();
+	}
+
+	/**
+	 * Return the border setting for the left border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the left border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getLeftBorder() {
+		return mBorderPropertiesHandler.getLeftBorder();
+	}
+
+	/**
+	 * Return the border setting for the right border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the right border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getRightBorder() {
+		return mBorderPropertiesHandler.getRightBorder();
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Return the border setting for the bottom border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the bottom
+	 * border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBottomBorder() {
+		return mBorderPropertiesHandler.getBottomBorder();
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Set the border definition for the bottom border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the bottom border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the bottom border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBottomBorder(Border border) {
+		mBorderPropertiesHandler.setBottomBorder(border);
+	}
+
+	// fo:border-top
+	// style:border-line-width-top
+	/**
+	 * Set the border definition for the top border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the top border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the top border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setTopBorder(Border border) {
+		mBorderPropertiesHandler.setTopBorder(border);
+	}
+
+	// fo:border-left
+	// style:border-line-width-left
+	/**
+	 * Set the border definition for the left border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the left border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the left border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setLeftBorder(Border border) {
+		mBorderPropertiesHandler.setLeftBorder(border);
+	}
+
+	// fo:border-right
+	// style:border-line-width-right
+	/**
+	 * Set the border definition for the right border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the right border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the right border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setRightBorder(Border border) {
+		mBorderPropertiesHandler.setRightBorder(border);
+	}
+
+	// fo:border
+	// style:border-line-width
+	/**
+	 * Set the border definition for all four borders.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * all four borders will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for all four borders will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBorder(Border border) {
+		mBorderPropertiesHandler.setBorder(border);
+	}
+
+	/**
+	 * Set the style of stroke.
+	 * <p>
+	 * There are three types of stroke: none, solid and dash.
+	 * <p>
+	 * If the stroke is NONE, there is no stroke around the frame.
+	 * <p>
+	 * If the stroke is SOLID, there is solid line around the frame. color and
+	 * width need to be specified.
+	 * <p>
+	 * If the stroke is DASH, there is dash line around the frame. color, width
+	 * and the style name of dash line need to be specified.
+	 * 
+	 * @param stroke
+	 *            the stroke type
+	 * @param color
+	 *            the color of the stroke
+	 * @param widthDesc
+	 *            the width description of the stroke, e.g. "0.01in"
+	 * @param dashStyleName
+	 *            the dash style name
+	 * @see org.odftoolkit.simple.style.StyleTypeDefinitions.OdfDrawStroke
+	 */
+	public void setStroke(OdfDrawStroke stroke, Color color, String widthDesc, String dashStyleName) {
+		switch (stroke) {
+		case NONE:
+			mElement.setDrawStrokeAttribute("none");
+			break;
+		case SOLID:
+			mElement.setDrawStrokeAttribute("solid");
+			if (color != null)
+				mElement.setSvgStrokeColorAttribute(color.toString());
+			if (widthDesc != null && widthDesc.length() > 2 && verifyWidthDesc(widthDesc)) {
+				mElement.setSvgStrokeWidthAttribute(widthDesc);
+			}
+			break;
+		case DASH:
+			mElement.setDrawStrokeAttribute("dash");
+			if (color != null)
+				mElement.setSvgStrokeColorAttribute(color.toString());
+			if (widthDesc != null && widthDesc.length() > 2 && verifyWidthDesc(widthDesc)) {
+				mElement.setSvgStrokeWidthAttribute(widthDesc);
+			}
+			mElement.setDrawStrokeDashNamesAttribute(dashStyleName);
+		}
+	}
+
+	/**
+	 * Set the fill style for a graphic object.
+	 * 
+	 * <p>
+	 * This method supports 2 types of fill: none and solid.
+	 * <p>
+	 * If the fill type is NONE, the object is no filled at all.
+	 * <p>
+	 * If the fill type is SOLID, the drawing object is filled with the color
+	 * specified by the second parameter.
+	 * 
+	 * @param fillType
+	 *            the fill style type
+	 * @param color
+	 *            the specified color
+	 */
+	public void setFill(OdfDrawFill fillType, Color color) {
+		switch (fillType) {
+		case NONE:
+			mElement.setDrawFillAttribute("none");
+			break;
+		case SOLID:
+			mElement.setDrawFillAttribute("solid");
+			mElement.setDrawFillColorAttribute(color.toString());
+			break;
+		case BITMAP:
+		case GRADIENT:
+		case HATCH:
+			throw new RuntimeException(fillType.toString() + " not supported!");
+		}
+	}
+
+	/**
+	 * Set whether the content of a graphic object is displayed in the
+	 * background or foreground. If it's displayed in the background, the
+	 * content wouldn't be selected or moved.
+	 * 
+	 * @param isBackgroundObject
+	 *            If <code>true</code>, the graphic object is displayed in the
+	 *            background.
+	 * @since 0.5.5
+	 */
+	public void setStyleRunThrough(boolean isBackgroundObject) {
+		if (isBackgroundObject) {
+			mElement.setStyleRunThroughAttribute(StyleRunThroughAttribute.Value.BACKGROUND.toString());
+		} else {
+			mElement.setStyleRunThroughAttribute(StyleRunThroughAttribute.Value.FOREGROUND.toString());
+		}
+	}
+
+	/**
+	 * Set the horizontal position
+	 * 
+	 * @param horizontalPos
+	 *            the horizontal position
+	 * @since 0.5.5
+	 */
+	public void setHorizontalPosition(FrameHorizontalPosition horizontalPos) {
+		mElement.setStyleHorizontalPosAttribute(horizontalPos.toString());
+	}
+
+	/**
+	 * Set the horizontal relative
+	 * 
+	 * @param relative
+	 *            the horizontal relative
+	 * @since 0.5.5
+	 */
+	public void setHorizontalRelative(HorizontalRelative relative) {
+		mElement.setStyleHorizontalRelAttribute(relative.toString());
+	}
+
+	/**
+	 * Set the vertical relative
+	 * 
+	 * @param relative
+	 *            the vertical relative
+	 * @since 0.5.5
+	 */
+	public void setVerticalRelative(VerticalRelative relative) {
+		mElement.setStyleVerticalRelAttribute(relative.toString());
+	}
+
+	/**
+	 * Set the vertical position
+	 * 
+	 * @param verticalPos
+	 *            the vertical position
+	 * @since 0.5.5
+	 */
+	public void setVerticalPosition(FrameVerticalPosition verticalPos) {
+		mElement.setStyleVerticalPosAttribute(verticalPos.toString());
+	}
+
+	/**
+	 * Return the horizontal position
+	 * 
+	 * @return the horizontal position
+	 * @since 0.5.5
+	 */
+	public FrameHorizontalPosition getHorizontalPosition() {
+		return FrameHorizontalPosition.enumValueOf(mElement.getStyleHorizontalPosAttribute());
+	}
+
+	/**
+	 * Return the vertical position
+	 * 
+	 * @return the vertical position
+	 * @since 0.5.5
+	 */
+	public FrameVerticalPosition getVerticalPosition() {
+		return FrameVerticalPosition.enumValueOf(mElement.getStyleVerticalPosAttribute());
+	}
+
+	/**
+	 * Return the vertical relative
+	 * 
+	 * @return the vertical relative
+	 * @since 0.5.5
+	 */
+	public VerticalRelative getVerticalRelative() {
+		return VerticalRelative.enumValueOf(mElement.getStyleVerticalRelAttribute());
+	}
+
+	/**
+	 * Return the horizontal relative
+	 * 
+	 * @return the horizontal relative
+	 * 
+	 * @since 0.5.5
+	 */
+	public HorizontalRelative getHorizontalRelative() {
+		return HorizontalRelative.enumValueOf(mElement.getStyleHorizontalRelAttribute());
+	}
+
+	private boolean verifyWidthDesc(String widthDesc) {
+		char char1 = widthDesc.charAt(widthDesc.length() - 1);
+		char char2 = widthDesc.charAt(widthDesc.length() - 2);
+
+		if (!(char1 >= 'a' && char1 <= 'z') && !(char1 >= 'A' && (char1 <= 'Z')))
+			return false;
+		if (!(char2 >= 'a' && char2 <= 'z') && !(char2 >= 'A' && (char2 <= 'Z')))
+			return false;
+		String floatValue = widthDesc.substring(0, widthDesc.length() - 2).trim();
+		try {
+			Double.parseDouble(floatValue);
+		} catch (Exception e) {
+			return false;
+		}
+		return true;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/MasterPage.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/MasterPage.java
new file mode 100644
index 0000000..04170b7
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/MasterPage.java
@@ -0,0 +1,735 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePageLayoutNameAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.odfdom.type.Percent;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AdjustmentStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.LineStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.PrintOrientation;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.WritingMode;
+
+/**
+ * This class represents the master page style settings. It provides methods to
+ * access page layout styles. More functions will be added latter.
+ * 
+ * <p>
+ * This class is a corresponding high level class for element
+ * "style:master-page". It provides methods to access the attributes and
+ * children of "style:master-page".
+ * 
+ * @since 0.8
+ */
+public class MasterPage {
+
+	/**
+	 * This class is the style handler for master page. It provides methods to
+	 * get the readable element and the writable element of a page layout style.
+	 * It also provides method to get the readable element and the writable
+	 * element of page layout properties .
+	 * 
+	 */
+	class StyleHandlerImpl {
+
+		private OdfStylePageLayout mWritableStyleElement;
+		private OdfStyleBase mStyleElement;
+		private PageLayoutProperties mPageLayoutProperties;
+		private PageLayoutProperties mWritablePageLayoutProperties;
+		private OdfStylableElement mOdfElement; // master page style element
+		private Document mDocument;
+
+		/**
+		 * Constructor of StyleHandlerImpl
+		 * 
+		 * @param element
+		 *            - the instance of master page element in an ODF document
+		 * 
+		 */
+		public StyleHandlerImpl(OdfStylableElement element) {
+			mOdfElement = element;
+			mDocument = ((Document) ((OdfFileDom) mOdfElement
+					.getOwnerDocument()).getDocument());
+		}
+
+		/**
+		 * Return the page layout properties definition for this component, only
+		 * for read function.
+		 * <p>
+		 * Null will be returned if there is no style definition.
+		 * <p>
+		 * Null will be returned if there is no explicit page layout properties
+		 * definition for this component.
+		 * <p>
+		 * Note if you try to write style properties to the returned object,
+		 * errors will be met with.
+		 * 
+		 * @return the page layout properties definition for this component,
+		 *         only for read function
+		 */
+		public PageLayoutProperties getPageLayoutPropertiesForRead() {
+			if (mWritablePageLayoutProperties != null)
+				return mWritablePageLayoutProperties;
+			else if (mPageLayoutProperties != null)
+				return mPageLayoutProperties;
+
+			OdfStyleBase style = getPageLayoutElementForRead();
+			if (style == null) {
+				Logger.getLogger(DefaultStyleHandler.class.getName()).log(
+						Level.FINE, "No style definition is found!", "");
+				return null;
+			}
+			mPageLayoutProperties = PageLayoutProperties
+					.getPageLayoutProperties(style);
+			if (mPageLayoutProperties != null)
+				return mPageLayoutProperties;
+			else {
+				Logger
+						.getLogger(DefaultStyleHandler.class.getName())
+						.log(
+								Level.FINE,
+								"No explicit pageLayout properties definition is found!",
+								"");
+				return null;
+			}
+		}
+
+		/**
+		 * Return the page layout properties definition for this component, for
+		 * read and write function.
+		 * <p>
+		 * An empty style definition will be created if there is no style
+		 * definition.
+		 * <p>
+		 * An empty page layout properties definition will be created if there
+		 * is no explicit page layout properties definition.
+		 * 
+		 * @return the page layout properties definition for this component, for
+		 *         read and write function
+		 * @throws Exception
+		 *             if the corresponding <code>StylePageLayoutElement</code>
+		 *             cannot be accessed for write.
+		 */
+		public PageLayoutProperties getPageLayoutPropertiesForWrite()
+				throws Exception {
+			if (mWritablePageLayoutProperties != null)
+				return mWritablePageLayoutProperties;
+			OdfStylePageLayout style = getPageLayoutElementForWrite();
+			mWritablePageLayoutProperties = PageLayoutProperties
+					.getOrCreatePageLayoutProperties(style);
+			return mWritablePageLayoutProperties;
+		}
+
+		/**
+		 * Return the style element for this component, only for read function.
+		 * This method will invode <code>getusedStyleName</code> to get the
+		 * style name, and then find the readable style element by name.
+		 * <p>
+		 * Null will be returned if there is no style definition.
+		 * <p>
+		 * Note if you try to write style properties to the returned object,
+		 * errors will be met with.
+		 * 
+		 * @return the style element
+		 * @see #getUsedPageLayoutStyleName()
+		 */
+		public OdfStyleBase getPageLayoutElementForRead() {
+			// Return current used style
+			if (getCurrentUsedStyle() != null)
+				return getCurrentUsedStyle();
+
+			String styleName = getUsedPageLayoutStyleName();
+			mStyleElement = getReadableStyleElementByName(styleName);
+			return mStyleElement;
+		}
+
+		/**
+		 * Return the style element for this component, for read and write
+		 * functions. This method will invode <code>getusedStyleName</code> to
+		 * get the style name, and then find the writable style element by name.
+		 * <p>
+		 * An empty style definition will be created if there is no style
+		 * definition.
+		 * 
+		 * @return the style element
+		 * @throws Exception
+		 *             if the corresponding <code>StylePageLayoutElement</code>
+		 *             cannot be accessed for write.
+		 * @see #getUsedPageLayoutStyleName()
+		 */
+		public OdfStylePageLayout getPageLayoutElementForWrite()
+				throws Exception {
+			if (mWritableStyleElement != null)
+				return mWritableStyleElement;
+
+			String styleName = getUsedPageLayoutStyleName();
+			mWritableStyleElement = getWritableStyleElementByName(styleName,
+					false);
+			return mWritableStyleElement;
+		}
+
+		/**
+		 * Return a readable style element by style name.
+		 * <p>
+		 * If the style name is null, the default style will be returned.
+		 * 
+		 * @param styleName
+		 *            - the style name
+		 * @return a readable style element
+		 */
+		protected OdfStyleBase getReadableStyleElementByName(String styleName) {
+
+			// TODO: get from default page layout style element
+			if (styleName == null || (styleName.equals("")))
+				;
+
+			OdfStylePageLayout styleElement = mOdfElement.getAutomaticStyles()
+					.getPageLayout(styleName);
+
+			return styleElement;
+		}
+
+		/**
+		 * Return a writable page layout style element by style name.
+		 * <p>
+		 * If the style is shared, a copied style element would be returned.
+		 * <p>
+		 * If the style name is null, the default style will be copied.
+		 * 
+		 * @param styleName
+		 *            - the style name
+		 * @return a writable style element
+		 * @throws Exception
+		 *             if the corresponding StyleElement cannot be accessed for
+		 *             write.
+		 */
+		protected OdfStylePageLayout getWritableStyleElementByName(
+				String styleName, boolean isShared) throws Exception {
+			boolean createNew = isShared;
+			OdfStylePageLayout pageLayout = null;
+			OdfOfficeAutomaticStyles styles = mOdfElement.getAutomaticStyles();
+			if (styleName == null || (styleName.equals(""))) {
+				createNew = true;
+				// TODO: get default page layout style
+			} else {
+				styles = mOdfElement.getAutomaticStyles();
+				pageLayout = styles.getPageLayout(styleName);
+				if (pageLayout == null || pageLayout.getStyleUserCount() > 1) {
+					createNew = true;
+				}
+			}
+			// if style name is null or this style are used by many users,
+			// should create a new one.
+			if (createNew) {
+				OdfStylePageLayout newPageLayout = null;
+				if (pageLayout != null) {
+					newPageLayout = (OdfStylePageLayout) pageLayout
+							.cloneNode(true);
+				}
+				newPageLayout = (OdfStylePageLayout) mDocument.getStylesDom()
+						.newOdfElement(StylePageLayoutElement.class);
+				String newname = newUniquePageLayoutName();
+				newPageLayout.setStyleNameAttribute(newname);
+				styles.appendChild(newPageLayout);
+				mOdfElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(),
+						"style:page-layout-name", newname);
+				newPageLayout.addStyleUser(mOdfElement);
+				return newPageLayout;
+			}
+			return pageLayout;
+		}
+
+		private String newUniquePageLayoutName() {
+			String unique_name;
+			OdfOfficeAutomaticStyles styles = mOdfElement.getAutomaticStyles();
+			do {
+				unique_name = String.format("a%06x",
+						(int) (Math.random() * 0xffffff));
+			} while (styles.getPageLayout(unique_name) != null);
+			return unique_name;
+		}
+
+		private OdfStyleBase getCurrentUsedStyle() {
+			if (mWritableStyleElement != null)
+				return mWritableStyleElement;
+			else
+				return mStyleElement;
+		}
+
+		/**
+		 * Return the referenced style name by this master page.
+		 * 
+		 * @return - the referenced style name by this master page.
+		 */
+		public String getUsedPageLayoutStyleName() {
+			return mOdfElement
+					.getAttribute(StylePageLayoutNameAttribute.ATTRIBUTE_NAME
+							.getQName());
+		}
+	}
+
+	private StyleMasterPageElement mStyleMasterPageElement;
+	private StyleHandlerImpl mStyleHandler;
+
+	/**
+	 * Constructor of MasterPage
+	 * 
+	 * @param styleMasterPageElement
+	 *            - the instance of style:master-page element in an ODF document
+	 */
+	MasterPage(StyleMasterPageElement styleMasterPageElement) {
+		mStyleMasterPageElement = styleMasterPageElement;
+	}
+
+	/**
+	 * Return a master page according to its name and its document.
+	 * <p>
+	 * If there is no existing master page defined by this name in the document,
+	 * a new master with this name will be created and returned.
+	 * 
+	 * @param doc
+	 *            - the document to which the master page belongs.
+	 * @param name
+	 *            - the name of the master page
+	 * @return a master page
+	 * @throws Exception
+	 *             if the style DOM cannot be initialized
+	 */
+	public static MasterPage getOrCreateMasterPage(Document doc, String name)
+			throws Exception {
+		OdfOfficeMasterStyles officeMasterStyles = doc.getOfficeMasterStyles();
+		StyleMasterPageElement master = officeMasterStyles.getMasterPage(name);
+		if (master == null) {
+			master = doc.getStylesDom().newOdfElement(
+					StyleMasterPageElement.class);
+			master.setStyleNameAttribute(name);
+			officeMasterStyles.appendChild(master);
+		}
+		return new MasterPage(master);
+	}
+
+	/**
+	 * Get the style handler of this master page.
+	 * <p>
+	 * The style handler is an instance of StyleHandlerImpl
+	 * 
+	 * @return an instance of StyleHandlerImpl
+	 * @see StyleHandlerImpl
+	 */
+	StyleHandlerImpl getPageLayoutStyleHandler() {
+		if (mStyleHandler != null)
+			return mStyleHandler;
+		else {
+			mStyleHandler = new StyleHandlerImpl(mStyleMasterPageElement);
+			return mStyleHandler;
+		}
+
+	}
+
+	/**
+	 * Get the name of this master page.
+	 * <p>
+	 * This represents the attribute <code>style:name</code> of
+	 * <code>style:master-page</code>.
+	 * 
+	 * @return the style name of this master page.
+	 */
+	public String getName() {
+		return mStyleMasterPageElement.getStyleNameAttribute();
+	}
+
+	/**
+	 * Get the top margin of the <code>PageLayoutProperties</code> referenced by
+	 * this master page.
+	 * 
+	 * @return the top margin (in Millimeter)
+	 */
+	public double getMarginTop() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getMarginTop();
+	}
+
+	/**
+	 * Get the right margin of the <code>PageLayoutProperties</code> referenced
+	 * by this master page.
+	 * 
+	 * @return the right margin (in Millimeter)
+	 */
+	public double getMarginRight() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getMarginRight();
+	}
+
+	/**
+	 * Get the left margin of the <code>PageLayoutProperties</code> referenced
+	 * by this master page.
+	 * 
+	 * @return the left margin (in Millimeter)
+	 */
+	public double getMarginLeft() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getMarginLeft();
+	}
+
+	/**
+	 * Get the bottom margin of the <code>PageLayoutProperties</code> referenced
+	 * by this master page.
+	 * 
+	 * @return the bottom margin (in Millimeter)
+	 */
+	public double getMarginBottom() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getMarginBottom();
+	}
+
+	/**
+	 * Set the margins of the <code>PageLayoutProperties</code> referenced by
+	 * this master page.
+	 * <p>
+	 * If the margin size is set to zero, the corresponding margin definition
+	 * will be removed.
+	 * 
+	 * @param marginTop
+	 *            the size of the top margin (in Millimeter)
+	 * @param marginBottom
+	 *            the size of the bottom margin (in Millimeter)
+	 * @param marginLeft
+	 *            the size of the left margin (in Millimeter)
+	 * @param marginRight
+	 *            the size of the right margin (in Millimeter)
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 * 
+	 */
+	public void setMargins(double marginTop, double marginBottom,
+			double marginLeft, double marginRight) throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setMarginTop(marginTop);
+		properties.setMarginBottom(marginBottom);
+		properties.setMarginLeft(marginLeft);
+		properties.setMarginRight(marginRight);
+	}
+
+	/**
+	 * Get the page width of the the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @return the size of page width (in Millimeter)
+	 */
+	public double getPageWidth() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getPageWidth();
+	}
+
+	/**
+	 * Set the page width of the <code>PageLayoutProperties</code> referenced by
+	 * this master page.
+	 * <p>
+	 * If the size is set to zero, the page width definition will be removed.
+	 * 
+	 * @param pageWidth
+	 *            the size of the page width (in Millimeter)
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 */
+	public void setPageWidth(double pageWidth) throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setPageWidth(pageWidth);
+	}
+
+	/**
+	 * Get the page height of the the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @return the size of page height (in Millimeter)
+	 */
+	public double getPageHeight() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getPageHeight();
+	}
+
+	/**
+	 * Set the page height of the <code>PageLayoutProperties</code> referenced
+	 * by this master page.
+	 * <p>
+	 * If the size is set to zero, the page height definition will be removed.
+	 * 
+	 * @param pageHeight
+	 *            the size of the page height (in Millimeter)
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 */
+	public void setPageHeight(double pageHeight) throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setPageHeight(pageHeight);
+	}
+
+	/**
+	 * Get the number format of the the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @return the value of number format
+	 */
+	public String getNumberFormat() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getNumberFormat();
+	}
+
+	/**
+	 * Set the number format of the <code>PageLayoutProperties</code> referenced
+	 * by this master page.
+	 * 
+	 * @param format
+	 *            specify the number format. The values of the style:num-format
+	 *            attribute are 1, i, I, string, an empty string, a or A.
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 */
+	public void setNumberFormat(String format) throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setNumberFormat(format);
+	}
+
+	/**
+	 * Get the print orientation of the the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @return the value of print orientation
+	 */
+	public String getPrintOrientation() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getPrintOrientation();
+	}
+
+	/**
+	 * Set the print orientation of the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * <p>
+	 * If the parameter <code>orientation</code> is null, the print orientation
+	 * definition will be removed.
+	 * 
+	 * @param orientation
+	 *            - the print orientation
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 */
+	public void setPrintOrientation(PrintOrientation orientation)
+			throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setPrintOrientation(orientation);
+	}
+
+	/**
+	 * Get the writing mode of the the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @return the value of writing mode
+	 */
+	public String getWritingMode() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getWritingMode();
+	}
+
+	/**
+	 * Set the writing mode of the <code>PageLayoutProperties</code> referenced
+	 * by this master page.
+	 * 
+	 * @param mode
+	 *            - writing mode
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 */
+	public void setWritingMode(WritingMode mode) throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setWritingMode(mode);
+	}
+
+	/**
+	 * Get the footnote max height of the the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @return the value of footnote max height
+	 */
+	public double getFootnoteMaxHeight() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteMaxHeight();
+	}
+
+	/**
+	 * Set the footnote max height of the <code>PageLayoutProperties</code>
+	 * referenced by this master page.
+	 * 
+	 * @param height
+	 *            - the max height of a footnote area
+	 *@throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 */
+	public void setFootnoteMaxHeight(double height) throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setFootnoteMaxHeight(height);
+	}
+
+	/**
+	 * Get the way in which a footnote separator line aligned to a page, which
+	 * is set by the <code>PageLayoutProperties</code> referenced by this master
+	 * page.
+	 * 
+	 * @return the adjustment of a footnote separator line
+	 */
+	public String getFootnoteSepAdjustment() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepAdjustment();
+	}
+
+	/**
+	 * Get the color of a footnote separator which is set by the
+	 * <code>PageLayoutProperties</code> referenced by this master page.
+	 * 
+	 * @return the color of a footnote separator line
+	 */
+	public String getFootnoteSepColor() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepColor();
+	}
+
+	/**
+	 * Get the distance between a footnote separator and the footnote area,
+	 * which is set by the <code>PageLayoutProperties</code> referenced by this
+	 * master page.
+	 * 
+	 * @return the distance after a footnote separator line
+	 */
+	public double getFootnoteSepDistanceAfterSep() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepDistanceAfterSep();
+	}
+
+	/**
+	 * Get the distance between the text area and the footnote separator, which
+	 * is set by the <code>PageLayoutProperties</code> referenced by this master
+	 * page.
+	 * 
+	 * @return the distance before a footnote separator line
+	 */
+	public double getFootnoteSepDistanceBeforeSep() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepDistanceBeforeSep();
+	}
+
+	/**
+	 * Get the line style of a footnote separator which is set by the
+	 * <code>PageLayoutProperties</code> referenced by this master page.
+	 * 
+	 * @return the line style of a footnote separator line
+	 */
+	public String getFootnoteSepLineStyle() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepLineStyle();
+	}
+
+	/**
+	 * Get the real width of a footnote separator which is set by the
+	 * <code>PageLayoutProperties</code> referenced by this master page.
+	 * 
+	 * @return the real width of a footnote separator line
+	 */
+	public double getFootnoteSepWidth() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepWidth();
+	}
+
+	/**
+	 * Get the thickness of a footnote separator which is set by the
+	 * <code>PageLayoutProperties</code> referenced by this master page.
+	 * 
+	 * @return the thickness of a footnote separator line
+	 */
+	public double getFootnoteSepThickness() {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForRead();
+		return properties.getFootnoteSepThickness();
+	}
+
+	/**
+	 * Set the foot note separator properties of the
+	 * <code>PageLayoutProperties</code> referenced by this master page.
+	 * 
+	 * @throws Exception
+	 *             if the corresponding <code>StylePageLayoutElement</code>
+	 *             cannot be accessed for write.
+	 * @see PageLayoutProperties#setFootnoteSepProperties(AdjustmentStyle,
+	 *      Color, double, double, LineStyle, Percent, double)
+	 * 
+	 */
+	public void setFootnoteSepProperties(AdjustmentStyle adjustment,
+			Color color, double distanceAfterSep, double distanceBeforeSep,
+			LineStyle lineStyle, Percent width, double thickness)
+			throws Exception {
+		PageLayoutProperties properties = getPageLayoutStyleHandler()
+				.getPageLayoutPropertiesForWrite();
+		properties.setFootnoteSepProperties(adjustment, color,
+				distanceAfterSep, distanceBeforeSep, lineStyle, width,
+				thickness);
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/NumberFormat.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/NumberFormat.java
new file mode 100644
index 0000000..a9a7364
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/NumberFormat.java
@@ -0,0 +1,45 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+/**
+ * A <tt>NumberFormat</tt> specifies a numbering sequence.
+ * 
+ * @since 0.5
+ */
+public enum NumberFormat {
+
+	HINDU_ARABIC_NUMBER("1"), 
+	LOWERCASE_LATIN_ALPHABET("a"), 
+	UPPERCASE_LATIN_ALPHABET("A"),
+	LOWERCASE_ROMAN_NUMBER("i"),
+	UPPERCASE_ROMAN_NUMBER("I");
+	
+	private final String numberFormat;
+
+	NumberFormat(String format) {
+		numberFormat = format;
+	}
+
+	@Override
+	public String toString() {
+		return numberFormat;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/PageLayoutProperties.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/PageLayoutProperties.java
new file mode 100644
index 0000000..6fef41a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/PageLayoutProperties.java
@@ -0,0 +1,985 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.style;
+
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPageHeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoPageWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDistanceAfterSepAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDistanceBeforeSepAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleNumFormatAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StylePrintOrientationAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleRelWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleWidthAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleFootnoteSepElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.Percent;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AdjustmentStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.LineStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.WritingMode;
+
+/**
+ * This class represents the page layout style settings. It provides methods to
+ * access borders, margins,number format, page width, page height and etc. More
+ * functions will be added latter.
+ * 
+ * <p>
+ * This class is a corresponded high level class for element
+ * "style:page-layout-properties". It provides methods to access the attributes
+ * and children of "style:page-layout-properties".
+ * 
+ * @since 0.8
+ */
+public class PageLayoutProperties {
+	// fo:background-color
+
+	// fo:border, style:border-line-width
+	// fo:border-bottom, style:border-line-width-bottom
+	// fo:border-left, style:border-line-width-left
+	// fo:border-right, style:border-line-width-right
+	// fo:border-top, style:border-line-width-top
+
+	// fo:margin
+	// fo:margin-bottom
+	// fo:margin-left
+	// fo:margin-right
+	// fo:margin-top
+
+	// fo:padding
+	// fo:padding-bottom
+	// fo:padding-left
+	// fo:padding-right
+	// fo:padding-top
+
+	// fo:page-height
+	// fo:page-width
+
+	// style:layout-grid-base-height
+	// style:layout-grid-base-width
+	// style:layout-grid-color
+	// style:layout-grid-display
+	// style:layout-grid-lines
+	// style:layout-grid-mode
+	// style:layout-grid-print
+	// style:layout-grid-ruby-below
+	// style:layout-grid-ruby-height
+	// style:layout-grid-snap-to
+	// style:layout-grid-standard-mode
+
+	// style:num-format
+	// style:num-letter-sync
+	// style:num-prefix
+	// style:num-suffix
+
+	// style:print
+	// style:print-orientation
+	// style:first-page-number
+	// style:footnote-max-height
+	// style:paper-tray-name
+	// style:print-page-order
+	// style:register-truth-ref-style-name
+	// style:scale-to
+	// style:scale-to-pages
+	// style:shadow
+	// style:table-centering
+	// style:writing-mode
+
+	// the default size as used for left-, right-margin and indention
+	private static final String DEFAULT_LENGTH = "0in";
+	private static final String DEFAULT_PERCENT = "0%";
+	StylePageLayoutPropertiesElement mElement;
+	StyleFootnoteSepElement mFootnoteSepElement;
+	BorderPropertiesImpl mBorderPropertiesHandler;
+
+	/**
+	 * Create an instance of PageLayoutProperties
+	 */
+	protected PageLayoutProperties() {
+	}
+
+	/**
+	 * Create an instance of PageLayoutProperties from an element
+	 * <style:page-layout-properties>
+	 * 
+	 * @param pageLayoutProperties
+	 *            - the element of style:page-layout-properties
+	 */
+	protected PageLayoutProperties(
+			StylePageLayoutPropertiesElement pageLayoutProperties) {
+		mElement = pageLayoutProperties;
+		mFootnoteSepElement = (StyleFootnoteSepElement) pageLayoutProperties
+				.getElementsByTagName(
+						StyleFootnoteSepElement.ELEMENT_NAME.getQName())
+				.item(0);
+		mBorderPropertiesHandler = new BorderPropertiesImpl(mElement);
+	}
+
+	/**
+	 * Set the border style.
+	 * <p>
+	 * The first parameter <code>bordersType</code> describes which borders you
+	 * want to apply the style to, e.g. up border, bottom border, left border,
+	 * right border or four borders.
+	 * <p>
+	 * The border style information will be removed if the parameter
+	 * <code>bordersType</code> is NONE.
+	 * 
+	 * @param bordersType
+	 *            - the type of the borders
+	 * @param border
+	 *            - the border style description
+	 */
+	public void setBorders(StyleTypeDefinitions.CellBordersType bordersType,
+			Border border) {
+		switch (bordersType) {
+		case BOTTOM:
+			setBottomBorder(border);
+			break;
+		case LEFT:
+			setLeftBorder(border);
+			break;
+		case RIGHT:
+			setRightBorder(border);
+			break;
+		case TOP:
+			setTopBorder(border);
+			break;
+		case ALL_FOUR:
+			setBorder(border);
+			break;
+		case LEFT_RIGHT:
+			setLeftBorder(border);
+			setRightBorder(border);
+			break;
+		case TOP_BOTTOM:
+			setTopBorder(border);
+			setBottomBorder(border);
+			break;
+		case NONE:
+			mElement
+					.removeAttribute(StyleBorderLineWidthAttribute.ATTRIBUTE_NAME
+							.getQName());
+			mElement.removeAttribute(FoBorderAttribute.ATTRIBUTE_NAME
+					.getQName());
+			mElement
+					.removeAttribute(StyleBorderLineWidthBottomAttribute.ATTRIBUTE_NAME
+							.getQName());
+			mElement.removeAttribute(FoBorderBottomAttribute.ATTRIBUTE_NAME
+					.getQName());
+			mElement
+					.removeAttribute(StyleBorderLineWidthTopAttribute.ATTRIBUTE_NAME
+							.getQName());
+			mElement.removeAttribute(FoBorderTopAttribute.ATTRIBUTE_NAME
+					.getQName());
+			mElement
+					.removeAttribute(StyleBorderLineWidthLeftAttribute.ATTRIBUTE_NAME
+							.getQName());
+			mElement.removeAttribute(FoBorderLeftAttribute.ATTRIBUTE_NAME
+					.getQName());
+			mElement
+					.removeAttribute(StyleBorderLineWidthRightAttribute.ATTRIBUTE_NAME
+							.getQName());
+			mElement.removeAttribute(FoBorderRightAttribute.ATTRIBUTE_NAME
+					.getQName());
+		}
+	}
+
+	/**
+	 * Return the border setting for all four borders.
+	 * <p>
+	 * Null will be returned if there is no border setting for all four borders.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBorder() {
+		return mBorderPropertiesHandler.getBorder();
+	}
+
+	/**
+	 * Return the border setting for the top border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the top border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getTopBorder() {
+		return mBorderPropertiesHandler.getTopBorder();
+	}
+
+	/**
+	 * Return the border setting for the left border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the left border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getLeftBorder() {
+		return mBorderPropertiesHandler.getLeftBorder();
+	}
+
+	/**
+	 * Return the border setting for the right border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the right border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getRightBorder() {
+		return mBorderPropertiesHandler.getRightBorder();
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Return the border setting for the bottom border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the bottom
+	 * border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBottomBorder() {
+		return mBorderPropertiesHandler.getBottomBorder();
+	}
+
+	// fo:border
+	// style:border-line-width
+	/**
+	 * Set the border definition for all four borders.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * all four borders will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for all four borders will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBorder(Border border) {
+		mBorderPropertiesHandler.setBorder(border);
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Set the border definition for the bottom border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the bottom border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the bottom border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBottomBorder(Border border) {
+		mBorderPropertiesHandler.setBottomBorder(border);
+	}
+
+	// fo:border-top
+	// style:border-line-width-top
+	/**
+	 * Set the border definition for the top border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the top border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the top border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setTopBorder(Border border) {
+		mBorderPropertiesHandler.setTopBorder(border);
+	}
+
+	// fo:border-left
+	// style:border-line-width-left
+	/**
+	 * Set the border definition for the left border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the left border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the left border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setLeftBorder(Border border) {
+		mBorderPropertiesHandler.setLeftBorder(border);
+	}
+
+	// fo:border-right
+	// style:border-line-width-right
+	/**
+	 * Set the border definition for the right border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the right border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the right border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setRightBorder(Border border) {
+		mBorderPropertiesHandler.setRightBorder(border);
+	}
+
+	/**
+	 * Set the left margin of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the left margin definition will be removed.
+	 * 
+	 * @param marginLeft
+	 *            the size of the left margin (in Millimeter)
+	 */
+	public void setMarginLeft(double marginLeft) {
+		if (marginLeft == 0) {
+			mElement.removeAttribute(FoMarginLeftAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginLeftAttribute(getInchValue(marginLeft));
+		}
+	}
+
+	/**
+	 * Returns the provided Millimeter value as Inch value
+	 * 
+	 * @param value
+	 *            the value to set the attribute value to (in Millimeter)
+	 */
+	private static String getInchValue(double value) {
+		// build the string for mm
+		final String mmValueString = value + Unit.MILLIMETER.abbr();
+		// convert the length to inch
+		final String inchValueString = Length.mapToUnit(mmValueString,
+				Unit.INCH);
+
+		// return the value
+		return inchValueString;
+	}
+
+	/**
+	 * Get the size of the left margin of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the left margin definition will be removed.
+	 * 
+	 * @return the size of the left margin (in Millimeter)
+	 */
+	public double getMarginLeft() {
+		// get the value
+		String valueString = mElement.getFoMarginLeftAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the right margin of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the right margin definition will be removed.
+	 * 
+	 * @param marginRight
+	 *            the size of the right margin (in Millimeter)
+	 */
+	public void setMarginRight(double marginRight) {
+		if (marginRight == 0) {
+			mElement.removeAttribute(FoMarginRightAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginRightAttribute(getInchValue(marginRight));
+		}
+	}
+
+	/**
+	 * Get the size of the right margin of this
+	 * <code>PageLayoutProperties</code>
+	 * 
+	 * @return the size of the right margin (in Millimeter)
+	 */
+	public double getMarginRight() {
+		// get the value
+		String valueString = mElement.getFoMarginRightAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the top margin of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the top margin definition will be removed.
+	 * 
+	 * @param marginTop
+	 *            the size of the right margin (in Millimeter)
+	 */
+	public void setMarginTop(double marginTop) {
+		if (marginTop == 0) {
+			mElement.removeAttribute(FoMarginTopAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginTopAttribute(getInchValue(marginTop));
+		}
+	}
+
+	/**
+	 * Get the size of the top margin of this <code>PageLayoutProperties</code>
+	 * 
+	 * @return the size of the top margin (in Millimeter)
+	 */
+	public double getMarginTop() {
+		// get the value
+		String valueString = mElement.getFoMarginTopAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the bottom margin of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the bottom margin definition will be removed.
+	 * 
+	 * @param marginBottom
+	 *            the size of the bottom margin (in Millimeter)
+	 */
+	public void setMarginBottom(double marginBottom) {
+		if (marginBottom == 0) {
+			mElement.removeAttribute(FoMarginBottomAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginBottomAttribute(getInchValue(marginBottom));
+		}
+	}
+
+	/**
+	 * Get the size of the bottom margin of this
+	 * <code>PageLayoutProperties</code>
+	 * 
+	 * @return the size of the bottom margin (in Millimeter)
+	 */
+	public double getMarginBottom() {
+		// get the value
+		String valueString = mElement.getFoMarginBottomAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Get the number format of this <code>PageLayoutProperties</code>
+	 * 
+	 * @return the number format
+	 */
+	public String getNumberFormat() {
+		return mElement.getStyleNumFormatAttribute();
+	}
+
+	/**
+	 * Set the number format of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the parameter <code>format</code> is null, the definition will be
+	 * removed.
+	 * 
+	 * @param format
+	 *            specify the number format. The values of the style:num-format
+	 *            attribute are 1, i, I, string, an empty string, a or A.
+	 */
+	public void setNumberFormat(String format) {
+		if (format == null) {
+			mElement.removeAttribute(StyleNumFormatAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setStyleNumFormatAttribute(format);
+		}
+	}
+
+	/**
+	 * Get the page width of this <code>PageLayoutProperties</code>
+	 * 
+	 * @return the size of page width (in Millimeter)
+	 */
+	public double getPageWidth() {
+		// get the value
+		String valueString = mElement.getFoPageWidthAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the page width of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the page width definition will be removed.
+	 * 
+	 * @param pageWidth
+	 *            the size of the page width (in Millimeter)
+	 */
+	public void setPageWidth(double pageWidth) {
+		if (pageWidth == 0) {
+			mElement.removeAttribute(FoPageWidthAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoPageWidthAttribute(getInchValue(pageWidth));
+		}
+	}
+
+	/**
+	 * Get the page height of this <code>PageLayoutProperties</code>
+	 * 
+	 * @return the size of page height (in Millimeter)
+	 */
+	public double getPageHeight() {
+		// get the value
+		String valueString = mElement.getFoPageHeightAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the page height of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the size is set to zero, the page height definition will be removed.
+	 * 
+	 * @param pageHeight
+	 *            the size of the page height (in Millimeter)
+	 */
+	public void setPageHeight(double pageHeight) {
+		if (pageHeight == 0) {
+			mElement.removeAttribute(FoPageHeightAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoPageHeightAttribute(getInchValue(pageHeight));
+		}
+	}
+
+	/**
+	 * Get the print orientation of this <code>PageLayoutProperties</code>
+	 * 
+	 * @return the print orientation
+	 */
+	public String getPrintOrientation() {
+		return mElement.getStylePrintOrientationAttribute();
+	}
+
+	/**
+	 * Set the print orientation of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the parameter <code>orientation</code> is null, the print orientation
+	 * definition will be removed.
+	 * 
+	 * @param orientation
+	 *            - the print orientation
+	 */
+	public void setPrintOrientation(
+			StyleTypeDefinitions.PrintOrientation orientation) {
+		if (orientation == null) {
+			mElement
+					.removeAttribute(StylePrintOrientationAttribute.ATTRIBUTE_NAME
+							.getQName());
+		} else {
+			mElement.setStylePrintOrientationAttribute(orientation.toString());
+		}
+	}
+
+	/**
+	 * Get the way in which a footnote separator line is aligned on a page.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, the default value
+	 * "left" will be returned.
+	 * 
+	 * @return the adjustment value of footnote separator line.
+	 */
+	public String getFootnoteSepAdjustment() {
+		if (mFootnoteSepElement == null) {
+			return AdjustmentStyle.LEFT.toString();
+		} else {
+			return mFootnoteSepElement.getStyleAdjustmentAttribute();
+		}
+	}
+
+	/**
+	 * Get the color of footnote separator line.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, the null value
+	 * will be returned.
+	 * 
+	 * @return the color of footnote separator line.
+	 */
+	public String getFootnoteSepColor() {
+		if (mFootnoteSepElement == null) {
+			return null;
+		} else {
+			return mFootnoteSepElement.getStyleColorAttribute();
+		}
+	}
+
+	/**
+	 * Get the distance between a footnote separator line and the footnote text.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, null will be
+	 * returned.
+	 * 
+	 * @return the distance after a footnote separator line.
+	 */
+	public double getFootnoteSepDistanceAfterSep() {
+		if (mFootnoteSepElement == null) {
+			return 0;
+		} else {
+			String value = mFootnoteSepElement
+					.getStyleDistanceAfterSepAttribute();
+			if (value == null)
+				value = DEFAULT_LENGTH;
+			return Length.parseDouble(value, Unit.MILLIMETER);
+		}
+	}
+
+	/**
+	 * Get the distance between the text area and a footnote separator line.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, null will be
+	 * returned.
+	 * 
+	 * @return the distance before a footnote separator line.
+	 */
+	public double getFootnoteSepDistanceBeforeSep() {
+		if (mFootnoteSepElement == null) {
+			return 0;
+		} else {
+			String value = mFootnoteSepElement
+					.getStyleDistanceBeforeSepAttribute();
+			if (value == null)
+				value = DEFAULT_LENGTH;
+			return Length.parseDouble(value, Unit.MILLIMETER);
+		}
+	}
+
+	/**
+	 * Get the line style of a footnote separator line.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, the default value
+	 * "NONE" will be returned.
+	 * 
+	 * @return the line style of a footnote separator line.
+	 */
+	public String getFootnoteSepLineStyle() {
+		if (mFootnoteSepElement == null) {
+			return LineStyle.NONE.toString();
+		} else {
+			return mFootnoteSepElement.getStyleLineStyleAttribute();
+		}
+	}
+
+	/**
+	 * Get the width of a footnote separator line.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, the default value
+	 * 0 will be returned.
+	 * 
+	 * @return the width a footnote separator line.
+	 */
+	public double getFootnoteSepWidth() {
+		if (mFootnoteSepElement == null) {
+			return 0;
+		} else {
+			String value = mFootnoteSepElement.getStyleRelWidthAttribute();
+			if (value == null)
+				value = DEFAULT_PERCENT;
+			return Percent.valueOf(value).doubleValue();
+		}
+	}
+
+	/**
+	 * Get the thickness of a footnote separator line.
+	 * <p>
+	 * If there is no <code>style:footnote-sep</code> element, the default value
+	 * 0 will be returned.
+	 * 
+	 * @return the thickness a footnote separator line.
+	 */
+	public double getFootnoteSepThickness() {
+		if (mFootnoteSepElement == null) {
+			return 0;
+		} else {
+			String value = mFootnoteSepElement.getStyleWidthAttribute();
+			if (value == null)
+				value = DEFAULT_LENGTH;
+			return Length.parseDouble(value, Unit.MILLIMETER);
+		}
+	}
+
+	/**
+	 * Set the formatting of footnote separator of this
+	 * <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the parameter <code>adjustment</code> is null, the adjustment
+	 * definition will be set as left. <br>
+	 * If the parameter <code>lineStyle</code> is null, the line style
+	 * definition will be set as NONE. <br>
+	 * If other parameters, like <code>color,
+	 * distanceAfterSep, distanceBeforeSep, width or thickness</code> is null,
+	 * the corresponding definition will be removed.
+	 * 
+	 * @param adjustment
+	 *            - specifies how a footnote separator line is aligned on a
+	 *            page.
+	 * 
+	 * @param color
+	 *            - specifies the color of a column or footnote separator line
+	 * 
+	 * @param distanceAfterSep
+	 *            - specifies the space between a footnote separator line and
+	 *            the footnote text.
+	 * 
+	 * @param distanceBeforeSep
+	 *            - specifies the space between the body text area and a
+	 *            footnote separator line.
+	 * 
+	 * @param lineStyle
+	 *            - specifies the style of a footnote separator line.
+	 * 
+	 * @param width
+	 *            - specifies the length of the footnote separator line as a
+	 *            percentage of the body text area.
+	 * 
+	 * @param thickness
+	 *            - specifies the width or thickness of a line.
+	 */
+	public void setFootnoteSepProperties(AdjustmentStyle adjustment,
+			Color color, double distanceAfterSep, double distanceBeforeSep,
+			StyleTypeDefinitions.LineStyle lineStyle, Percent width,
+			double thickness) {
+		if (mFootnoteSepElement == null) {
+			mFootnoteSepElement = mElement.newStyleFootnoteSepElement();
+		}
+
+		// style:adjustment
+		if (adjustment != null) {
+			mFootnoteSepElement.setStyleAdjustmentAttribute(adjustment
+					.toString());
+		} else {
+			mFootnoteSepElement
+					.setStyleAdjustmentAttribute(AdjustmentStyle.LEFT
+							.toString());
+		}
+
+		// style:color
+		if (color != null) {
+			mFootnoteSepElement.setStyleColorAttribute(color.toString());
+		} else {
+			mFootnoteSepElement
+					.removeAttribute(StyleColorAttribute.ATTRIBUTE_NAME
+							.getQName());
+		}
+
+		// style:distance-after-sep
+		if (distanceAfterSep == 0) {
+			mFootnoteSepElement
+					.removeAttribute(StyleDistanceAfterSepAttribute.ATTRIBUTE_NAME
+							.getQName());
+		} else {
+			mFootnoteSepElement
+					.setStyleDistanceAfterSepAttribute(getInchValue(distanceAfterSep));
+		}
+
+		// style:distance-before-sep
+		if (distanceBeforeSep == 0) {
+			mFootnoteSepElement
+					.removeAttribute(StyleDistanceBeforeSepAttribute.ATTRIBUTE_NAME
+							.getQName());
+		} else {
+			mFootnoteSepElement
+					.setStyleDistanceBeforeSepAttribute(getInchValue(distanceBeforeSep));
+		}
+
+		// style:line-style
+		if (lineStyle == null) {
+			mFootnoteSepElement.setStyleLineStyleAttribute(LineStyle.NONE
+					.toString());
+		} else {
+			mFootnoteSepElement
+					.setStyleLineStyleAttribute(lineStyle.toString());
+		}
+
+		// style:rel-width
+		if (width == null) {
+			mFootnoteSepElement
+					.removeAttribute(StyleRelWidthAttribute.ATTRIBUTE_NAME
+							.getQName());
+		} else {
+			mFootnoteSepElement.setStyleRelWidthAttribute(width.toString());
+		}
+
+		// style:width
+		if (thickness == 0) {
+			mFootnoteSepElement
+					.removeAttribute(StyleWidthAttribute.ATTRIBUTE_NAME
+							.getQName());
+		} else {
+			mFootnoteSepElement.setStyleWidthAttribute(getInchValue(thickness));
+		}
+	}
+
+	/**
+	 * Set the writing mode of this <code>PageLayoutProperties</code>
+	 * <p>
+	 * If the parameter <code>mode</code> is null, the default value of writing
+	 * node "page" will be set.
+	 * 
+	 * @param mode
+	 *            - specifies a writing mode.
+	 */
+	public void setWritingMode(WritingMode mode) {
+		if (mode == null) {
+			mElement.setStyleWritingModeAttribute(WritingMode.PAGE.toString());
+		} else {
+			mElement.setStyleWritingModeAttribute(mode.toString());
+		}
+	}
+
+	/**
+	 * Get the writing mode of this <code>PageLayoutProperties</code>
+	 * 
+	 * @return the value of writing mode
+	 */
+	public String getWritingMode() {
+		return WritingMode.enumValueOf(mElement.getStyleWritingModeAttribute())
+				.toString();
+	}
+
+	/**
+	 * Set the max height of a footnote area on a page.
+	 * <p>
+	 * If the value of this attribute is set to 0, there is no limit to the
+	 * amount of space that the footnote can occupy.
+	 * 
+	 * @param height
+	 *            - the max height which a footnote area can occupy
+	 */
+	public void setFootnoteMaxHeight(double height) {
+		mElement.setStyleFootnoteMaxHeightAttribute(getInchValue(height));
+	}
+
+	/**
+	 * Get the max height of a footnote area on a page.
+	 * 
+	 * @return the value of max height of footnote area.
+	 */
+	public double getFootnoteMaxHeight() {
+		String valueString = mElement.getStyleFootnoteMaxHeightAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>PageLayoutProperties</p> to represent the "style:page-layout-properties" in a style element.
+	 * <p>If there is no "style:page-layout-properties" defined in the style element, a new "style:page-layout-properties" element will be created.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>PageLayoutProperties</p>
+	 */
+	public static PageLayoutProperties getOrCreatePageLayoutProperties(
+			OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style
+				.getOrCreatePropertiesElement(OdfStylePropertiesSet.PageLayoutProperties);
+		return new PageLayoutProperties(
+				(StylePageLayoutPropertiesElement) properties);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>PageLayoutProperties</p> to represent the "style:page-layout-properties" in a style element.
+	 * <p>If there is no "style:page-layout-properties" defined in the style element, null will be returned.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>PageLayoutProperties</p>;Null if there is no
+	 *         "style:page-layout-properties" defined
+	 */
+	public static PageLayoutProperties getPageLayoutProperties(
+			OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style
+				.getPropertiesElement(OdfStylePropertiesSet.PageLayoutProperties);
+		if (properties != null)
+			return new PageLayoutProperties(
+					(StylePageLayoutPropertiesElement) properties);
+		else
+			return null;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/ParagraphProperties.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/ParagraphProperties.java
new file mode 100644
index 0000000..69d0c1c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/ParagraphProperties.java
@@ -0,0 +1,374 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakBeforeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoMarginTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextIndentAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+
+/**
+ * This class represents the paragraph style settings. It provides methods to
+ * access horizontal alignment. More functions will be added latter.
+ * 
+ * <p>
+ * This class is a corresponded high level class for element
+ * "style:paragraph-properties". It provides methods to access the attributes
+ * and children of "style:paragraph-properties".
+ * 
+ * @since 0.3
+ */
+public class ParagraphProperties {
+
+	// the default size as used for left-, right-margin and indention
+	private static final String  DEFAULT_LENGTH = "0in";
+
+	// fo:text-align
+
+	StyleParagraphPropertiesElement mElement;
+
+	/**
+	 * Create an empty paragraph style setting object
+	 */
+	protected ParagraphProperties() {
+	}
+
+	/**
+	 * Create a paragraph style setting object, which has the association with
+	 * an element "style:paragraph-properties".
+	 * 
+	 * @param properties
+	 *            - the element "style:paragraph-properties"
+	 */
+	protected ParagraphProperties(StyleParagraphPropertiesElement properties) {
+		mElement = properties;
+	}
+
+	/**
+	 * Set the horizontal alignment.
+	 * <p>
+	 * If the first parameter is null, the horizontal alignment setting will be
+	 * removed.
+	 * 
+	 * @param alignType
+	 *            - the horizontal alignment
+	 */
+	public void setHorizontalAlignment(HorizontalAlignmentType alignType) {
+		if (alignType == HorizontalAlignmentType.DEFAULT)
+			mElement.removeAttribute(FoTextAlignAttribute.ATTRIBUTE_NAME.getQName());
+		else
+			mElement.setFoTextAlignAttribute(alignType.getAlignmentString());
+	}
+
+	/**
+	 * Return the horizontal alignment.
+	 * <p>
+	 * Null will be returned if there is no horizontal alignment setting.
+	 * 
+	 * @return - the horizontal alignment; null if there is no horizontal
+	 *         alignment setting.
+	 */
+	public HorizontalAlignmentType getHorizontalAlignment() {
+		String alignType = mElement.getFoTextAlignAttribute();
+		if ((alignType == null) || (alignType.length() == 0))
+			return HorizontalAlignmentType.DEFAULT;
+
+		FoTextAlignAttribute.Value value = FoTextAlignAttribute.Value.enumValueOf(alignType);
+		switch (value) {
+		case CENTER:
+			return HorizontalAlignmentType.CENTER;
+		case END:
+			return HorizontalAlignmentType.RIGHT;
+		case JUSTIFY:
+			return HorizontalAlignmentType.JUSTIFY;
+		case LEFT:
+			return HorizontalAlignmentType.LEFT;
+		case RIGHT:
+			return HorizontalAlignmentType.RIGHT;
+		case START:
+			return HorizontalAlignmentType.LEFT;
+		}
+		return null;
+	}
+
+	/**
+	 * Set the left margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @param marginLeft
+	 *            the size of the left margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public void setMarginLeft(double marginLeft) {
+		if (marginLeft == 0) {
+			mElement.removeAttribute(FoMarginLeftAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginLeftAttribute(getInchValue(marginLeft));
+		}
+	}
+
+	/**
+	 * Get the size of the left margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @return the size of the left margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public double getMarginLeft() {
+		// get the value
+		String valueString = mElement.getFoMarginLeftAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the right margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @param marginRight
+	 *            the size of the right margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public void setMarginRight(double marginRight) {
+		if (marginRight == 0) {
+			mElement.removeAttribute(FoMarginRightAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginRightAttribute(getInchValue(marginRight));
+		}
+	}
+
+	/**
+	 * Get the size of the right margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @return the size of the right margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public double getMarginRight() {
+		// get the value
+		String valueString = mElement.getFoMarginRightAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the top margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @param marginTop
+	 *            the size of the right margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public void setMarginTop(double marginTop) {
+		if (marginTop == 0) {
+			mElement.removeAttribute(FoMarginTopAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginTopAttribute(getInchValue(marginTop));
+		}
+	}
+
+	/**
+	 * Get the size of the top margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @return the size of the top margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public double getMarginTop() {
+		// get the value
+		String valueString = mElement.getFoMarginTopAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the bottom margin of this <code>ParagraphProperties</code>
+	 * 
+	 * @param marginBottom
+	 *            the size of the bottom margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public void setMarginBottom(double marginBottom) {
+		if (marginBottom == 0) {
+			mElement.removeAttribute(FoMarginBottomAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoMarginBottomAttribute(getInchValue(marginBottom));
+		}
+	}
+
+	/**
+	 * Get the size of the bottom margin of this
+	 * <code>ParagraphProperties</code>
+	 * 
+	 * @return the size of the bottom margin (in Millimeter)
+	 * @since 0.7
+	 */
+	public double getMarginBottom() {
+		// get the value
+		String valueString = mElement.getFoMarginBottomAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the text indention size of this <code>ParagraphProperties</code>
+	 * 
+	 * @param textIndent
+	 *            the size of the text indention (in Millimeter)
+	 * @since 0.7
+	 */
+	public void setTextIndent(double textIndent) {
+		if (textIndent == 0) {
+			mElement.removeAttribute(FoTextIndentAttribute.ATTRIBUTE_NAME
+					.getQName());
+		} else {
+			mElement.setFoTextIndentAttribute(getInchValue(textIndent));
+		}
+	}
+
+	/**
+	 * Get the size of the text indention of this
+	 * <code>ParagraphProperties</code>
+	 * 
+	 * @return the size of the text indention (in Millimeter)
+	 * @since 0.7
+	 */
+	public double getTextIndent() {
+		// get the value
+		String valueString = mElement.getFoTextIndentAttribute();
+		// check if a value was returned
+		if (valueString == null) {
+			// if not use the default length
+			valueString = DEFAULT_LENGTH;
+		}
+		// return the converted value
+		return Length.parseDouble(valueString, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>ParagraphProperties</p> to represent the "style:paragraph-properties" in a style element.
+	 * <p>If there is no "style:paragraph-properties" defined in the style element, a new "style:paragraph-properties" element will be created.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>ParagraphProperties</p>
+	 */
+	public static ParagraphProperties getOrCreateParagraphProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style
+				.getOrCreatePropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+		return new ParagraphProperties((StyleParagraphPropertiesElement) properties);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>ParagraphProperties</p> to represent the "style:paragraph-properties" in a style element.
+	 * <p>If there is no "style:paragraph-properties" defined in the style element, null will be returned.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>ParagraphProperties</p>;Null if there is no
+	 *         "style:paragraph-properties" defined
+	 */
+	public static ParagraphProperties getParagraphProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style.getPropertiesElement(OdfStylePropertiesSet.ParagraphProperties);
+		if (properties != null)
+			return new ParagraphProperties((StyleParagraphPropertiesElement) properties);
+		else
+			return null;
+	}
+	
+	/**
+	 * Returns the provided Millimeter value as Inch value
+	 * 
+	 * @param value
+	 *          the value to set the attribute value to (in Millimeter)
+	 */
+	private static String getInchValue(double value) {
+		// build the string for mm
+		final String mmValueString = value + Unit.MILLIMETER.abbr();
+		// convert the length to inch
+		final String inchValueString = Length.mapToUnit(mmValueString, Unit.INCH);
+
+		// return the value
+		return inchValueString;
+	}
+	public void setBreak(String breakPosition, String breakAttribute) {
+		if (breakPosition == null) {
+			return;
+		}
+		if (breakAttribute == null) {
+			if (breakPosition.equals("before")) {
+				mElement.removeAttribute(FoBreakBeforeAttribute.ATTRIBUTE_NAME
+						.getQName());
+			} else if (breakPosition.equals("after"))
+				mElement.removeAttribute(FoBreakAfterAttribute.ATTRIBUTE_NAME
+						.getQName());
+		} else if (breakPosition.equals("before")) {
+			mElement.setFoBreakBeforeAttribute(breakAttribute);
+		} else if (breakPosition.equals("after"))
+			mElement.setFoBreakAfterAttribute(breakAttribute);
+	}
+	public String getBreakBefore() {
+		return mElement.getFoBreakBeforeAttribute();
+	}
+	public String getBreakAfter() {
+		return mElement.getFoBreakAfterAttribute();
+	}
+	public int getPageNumber() {
+		return mElement.getStylePageNumberAttribute();
+	}
+	public void setPageNumber(int pageNumber) {
+		if (pageNumber > 0) {
+			mElement.setStylePageNumberAttribute(pageNumber);
+		} else {
+			mElement.removeAttribute("style:page-number");
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/StyleTypeDefinitions.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/StyleTypeDefinitions.java
new file mode 100644
index 0000000..8df1a80
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/StyleTypeDefinitions.java
@@ -0,0 +1,893 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+/**
+ * This class defines the common used types in style handling methods.
+ * 
+ * @since 0.3
+ */
+public class StyleTypeDefinitions {
+
+	private StyleTypeDefinitions() {
+
+	}
+
+	/**
+	 * Common used line style from users perspective
+	 * 
+	 */
+	public static enum LineStyle {
+		/**
+		 * no border
+		 */
+		NONE("none"),
+		/**
+		 * solid line
+		 */
+		SOLID("solid"),
+		/**
+		 * single line
+		 */
+		SINGLE("single"),
+		/**
+		 * double line
+		 */
+		DOUBLE("double"),
+		/**
+		 * bold line
+		 */
+		BOLD("bold"), DOTTED("dotted"), DOTTED_BOLD("dotted (bold)"), DASH("dash"), DASH_BOLD("dash (bold)"), LONG_DASH(
+				"long-dash"), LONG_DASH_BOLD("long-dash (bold)"), DOT_DASH("dot-dash"), DOT_DASH_BOLD("dot-dash (bold)"), DOT_DOT_DASH(
+				"dot-dot-dash"), DOT_DOT_DASH_BOLD("dot-dot-dash (bold)"), WAVE("wave"), WAVE_BOLD("wave (bold)"), DOUBLE_WAVE(
+				"double wave");
+
+		private String lineStyle;
+
+		LineStyle(String value) {
+			lineStyle = value;
+		}
+
+		@Override
+		public String toString() {
+			return lineStyle;
+		}
+
+	}
+
+	/**
+	 * Common used font style from users perspective
+	 * 
+	 */
+	public static enum FontStyle {
+		REGULAR("Regular"), ITALIC("Italic"), BOLD("Bold"), BOLDITALIC("Bold_Italic");
+
+		private String fontStyle;
+
+		FontStyle(String style) {
+			this.fontStyle = style;
+		}
+
+		@Override
+		public String toString() {
+			return fontStyle;
+		}
+	}
+
+	/**
+	 * Common used font adjustment style from users perspective
+	 */
+	public static enum AdjustmentStyle {
+		CENTER("center"), LEFT("left"), RIGHT("right");
+
+		private String adjustment = "left";
+
+		AdjustmentStyle(String value) {
+			this.adjustment = value;
+		}
+
+		public String toString() {
+			return adjustment;
+		}
+
+	}
+
+	/**
+	 * Common used font text line position from users perspective.
+	 * <p>Currently, only support underline and strike through.
+	 * 
+	 */
+	public static enum TextLinePosition {
+		REGULAR("Regular"), THROUGH("Through"), UNDER("Under"), THROUGHUNDER("Through_Under");
+
+		private String textLineStyle;
+
+		TextLinePosition(String style) {
+			this.textLineStyle = style;
+		}
+
+		@Override
+		public String toString() {
+			return textLineStyle;
+		}
+	}
+
+	/**
+	 * Common used style of line lining through text from users perspective
+	 * 
+	 */
+	public static enum LineThroughStyle {
+		NONE("none"), SINGLE("single"), DOUBLE("double"), BOLD("bold"), WITH_X("with X"), WITH_SLASH("with /");
+
+		private String value;
+
+		LineThroughStyle(String style) {
+			this.value = style;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+
+	/**
+	 * Common used horizontal alignment type from users perspective
+	 * 
+	 */
+	public static enum HorizontalAlignmentType {
+		DEFAULT("default"), LEFT("left"), RIGHT("right"), CENTER("center"), JUSTIFY("justify"), FILLED("filled");
+
+		private String value;
+
+		HorizontalAlignmentType(String style) {
+			this.value = style;
+		}
+
+		public static HorizontalAlignmentType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (HorizontalAlignmentType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Horizontal Alignment Type!");
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+
+		public String getAlignmentString() {
+			if (value.equals("left"))
+				return "start";
+			if (value.equals("right"))
+				return "end";
+			if (value.equals("filled"))
+				return "start";
+			return value;
+		}
+	}
+
+	/**
+	 * Common used vertical alignment type from users perspective
+	 * 
+	 */
+	public static enum VerticalAlignmentType {
+		DEFAULT("default"), TOP("top"), MIDDLE("middle"), BOTTOM("bottom");
+
+		private String value;
+
+		VerticalAlignmentType(String style) {
+			this.value = style;
+		}
+
+		public static VerticalAlignmentType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (VerticalAlignmentType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Vertical Alignment Type!");
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+
+	/**
+	 * Emphasis mark type from ODF specification perspective
+	 * 
+	 */
+	public static enum OdfEmphasisMarkType {
+		NONE("none"), ACCENT_ABOVE("accent above"), DOT_ABOVE("dot above"), CIRCLE_ABOVE("circle above"), DISC_ABOVE(
+				"disc above"), ACCENT_BELOW("accent below"), DOT_BELOW("dot below"), CIRCLE_BELOW("circle below"), DISC_BELOW(
+				"disc below");
+
+		private String value;
+
+		OdfEmphasisMarkType(String style) {
+			this.value = style;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+
+	/**
+	 * Line style from ODF specification perspective
+	 * 
+	 */
+	public static enum OdfLineStyle {
+		DASH("dash"), DOT_DASH("dot-dash"), DOT_DOT_DASH("dot-dot-dash"), DOTTED("dotted"), LONG_DASH("long-dash"), NONE(
+				"none"), SOLID("solid"), WAVE("wave");
+
+		private String lineStyle;
+
+		OdfLineStyle(String value) {
+			lineStyle = value;
+		}
+
+		@Override
+		public String toString() {
+			return lineStyle;
+		}
+	}
+
+	/**
+	 * The supported line measurement till now
+	 * 
+	 */
+	public static enum SupportedLinearMeasure {
+		//1in = 2.54cm = 25.4 mm = 72pt = 6pc
+		PT("pt") {
+			public double toINs(double measure) {
+				return measure / 72;
+			}
+
+			public double toPTs(double measure) {
+				return measure;
+			}
+			
+			public double toCMs(double measure) {
+				return measure / 28.3465;
+			}
+			
+			public double convert(double measure, SupportedLinearMeasure measureUnit) {
+				return measureUnit.toPTs(measure);
+			}
+		},
+		IN("in") {
+			public double toINs(double measure) {
+				return measure;
+			}
+
+			public double toPTs(double measure) {
+				return 72 * measure;
+			}
+
+			public double toCMs(double measure) {
+				return 2.54 * measure;
+			}
+			
+			public double convert(double measure, SupportedLinearMeasure measureUnit) {
+				return measureUnit.toINs(measure);
+			}
+		},
+		CM("cm") {
+			public double toINs(double measure) {
+				return measure / 2.54;
+			}
+
+			public double toPTs(double measure) {
+				return measure * 28.3465;
+			}
+			
+			public double toCMs(double measure) {
+				return measure;
+			}
+			
+			public double convert(double measure, SupportedLinearMeasure measureUnit) {
+				return measureUnit.toPTs(measure);
+			}
+		};
+//		MM("mm") {
+//			
+//		}
+
+		private String value;
+
+		SupportedLinearMeasure(String style) {
+			this.value = style;
+		}
+
+		/**
+		 * Convert the given linear measure in the given unit to this unit.
+		 * 
+		 * @param measure
+		 *            the measure value in the given <code>measureUnit</code>
+		 * @param measureUnit
+		 *            the unit of the <code>measure</code> argument
+		 * @return the converted measure in this unit.
+		 */
+		public double convert(double measure, SupportedLinearMeasure measureUnit) {
+			throw new AbstractMethodError();
+		}
+
+		/**
+		 * Convert other measure to inch(IN) measure.
+		 * 
+		 * @param measure
+		 *            the measure
+		 * @return the converted measure
+		 * @see #convert
+		 */
+		public double toINs(double measure) {
+			throw new AbstractMethodError();
+		}
+
+		/**
+		 * Convert other measure to point(PT) measure.
+		 * 
+		 * @param measure
+		 *            the measure
+		 * @return the converted measure
+		 * @see #convert
+		 */
+		public double toPTs(double measure) {
+			throw new AbstractMethodError();
+		}
+		
+		/**
+		 * Convert other measure to centimeter(CM) measure.
+		 * 
+		 * @param measure
+		 *            the measure
+		 * @return the converted measure
+		 * @see #convert
+		 */
+		public double toCMs(double measure) {
+			throw new AbstractMethodError();
+		}
+
+		public static SupportedLinearMeasure enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (SupportedLinearMeasure aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Linear Measure!");
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+
+	/**
+	 * 
+	 * Common used border types from users perspective
+	 * 
+	 */
+	public static enum CellBordersType {
+		TOP("top"), BOTTOM("bottom"), LEFT("left"), RIGHT("right"), DIAGONALBLTR("diagonal_bltr"), DIAGONALTLBR(
+				"diagonal_tlbr"), NONE("none"), ALL_FOUR("all_four"), LEFT_RIGHT("left_right"), TOP_BOTTOM("top_bottom"), DIAGONAL_LINES(
+				"diagonal_lines");
+
+		private String value;
+
+		CellBordersType(String style) {
+			this.value = style;
+		}
+
+		public static CellBordersType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return null;
+
+			for (CellBordersType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			throw new RuntimeException("Unsupported Cell Borders Type!");
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+
+	}
+
+	/**
+	 * Line type from ODF specification perspective
+	 * 
+	 */
+	public static enum LineType {
+		DOUBLE("double"), NONE("none"), SINGLE("single");
+
+		private String lineType;
+
+		LineType(String type) {
+			this.lineType = type;
+		}
+
+		public static LineType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return NONE;
+
+			for (LineType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return NONE;
+		}
+
+		@Override
+		public String toString() {
+			return lineType;
+		}
+	}
+	
+	/**
+	 * Anchor type from users perspective.
+	 * 
+	 * @since 0.5.5
+	 */
+	public static enum AnchorType {
+		TO_PAGE("page"), 
+		TO_PARAGRAPH("paragraph"), 
+		TO_CHARACTER("char"),
+		AS_CHARACTER("as-char"),
+		TO_FRAME("frame");
+
+		private String anchorType;
+
+		AnchorType(String type) {
+			this.anchorType = type;
+		}
+
+		public static AnchorType enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return TO_PAGE;
+
+			for (AnchorType aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return TO_PAGE;
+		}
+
+		@Override
+		public String toString() {
+			return anchorType;
+		}
+	}
+
+	/**
+	 * Position vertical relative from ODF specification perspective
+	 * 
+	 * @since 0.5.5
+	 */
+	public static enum VerticalRelative
+	{
+		PAGE("page"), 
+		PAGE_CONTENT("page-content"),
+		FRAME("frame"),
+		FRAME_CONTENT("frame-content"),
+		PARAGRAPH("paragraph"),
+		PARAGRAPH_CONTENT("paragraph-content"),
+		CHAR("char"),
+		LINE("line"),
+		BASELINE("baseline"),
+		TEXT("text");
+
+		private String relativeType;
+
+		VerticalRelative(String type) {
+			this.relativeType = type;
+		}
+
+		public static VerticalRelative enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return PAGE;
+
+			for (VerticalRelative aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return PAGE;
+		}
+
+		@Override
+		public String toString() {
+			return relativeType;
+		}
+	}
+	
+	/**
+	 * Position horizontal relative from ODF specification perspective
+	 * @since 0.5.5
+	 */
+	public static enum HorizontalRelative
+	{
+		PAGE("page"), 
+		PAGE_CONTENT("page-content"),
+		FRAME("frame"),
+		FRAME_CONTENT("frame-content"),
+		PARAGRAPH("paragraph"),
+		PARAGRAPH_CONTENT("paragraph-content"),
+		CHAR("char"),
+		PAGE_START_MARGIN("page-start-margin"),
+		PAGE_END_MARGIN("page-end-margin"),
+		FRAME_START_MARGIN("frame-start-margin"),
+		FRAME_END_MARGIN("frame-end-margin"),
+		PARAGRAPH_START_MARGIN("paragraph-start-margin"),
+		PARAGRAPH_END_MARGIN("paragraph-end-margin");
+
+		private String relativeType;
+
+		HorizontalRelative(String type) {
+			this.relativeType = type;
+		}
+
+		public static HorizontalRelative enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return PAGE;
+
+			for (HorizontalRelative aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return PAGE;
+		}
+
+		@Override
+		public String toString() {
+			return relativeType;
+		}
+	}
+	
+	/**
+	 * specifies the vertical alignment of a frame relative to a specific area.
+	 * 
+	 * @since 0.5.5
+	 */
+	public static enum FrameVerticalPosition
+	{
+		TOP("top"),
+		MIDDLE("middle"),
+		BOTTOM("bottom"),
+		FROMTOP("from-top"),
+		BELOW("below");
+
+		private String verticalPos;
+
+		FrameVerticalPosition(String type) {
+			this.verticalPos = type;
+		}
+
+		public static FrameVerticalPosition enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return MIDDLE;
+
+			for (FrameVerticalPosition aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return MIDDLE;
+		}
+
+		@Override
+		public String toString() {
+			return verticalPos;
+		}
+	}
+	
+	/**
+	 * specifies the horizontal alignment of a frame relative to a specific area.
+	 * 
+	 * @since 0.5.5
+	 */
+	public static enum FrameHorizontalPosition
+	{
+		LEFT("left"),
+		CENTER("center"),
+		RIGHT("right"),
+		FROMLEFT("from-left"),
+		INSIDE("inside"),
+		OUTSIDE("outside"),
+		FROMINSIDE("from-inside");
+
+		private String horizontalPos;
+
+		FrameHorizontalPosition(String type) {
+			this.horizontalPos = type;
+		}
+
+		public static FrameHorizontalPosition enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return CENTER;
+
+			for (FrameHorizontalPosition aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return CENTER;
+		}
+
+		@Override
+		public String toString() {
+			return horizontalPos;
+		}
+	}
+	
+
+	/**
+	 * Line width from ODF specification perspective
+	 * 
+	 */
+	public static enum OdfLineWidth {
+		AUTO("auto"), BOLD("bold"), MEDIUM("medium"), NORMAL("normal"), THICK("thick"), THIN("thin");
+
+		private String lineWidth;
+
+		OdfLineWidth(String type) {
+			this.lineWidth = type;
+		}
+
+		@Override
+		public String toString() {
+			return lineWidth;
+		}
+	}
+
+	/**
+	 * Font style from ODF specification perspective
+	 * 
+	 */
+	public static enum OdfFontStyle {
+		ITALIC("italic"), NORMAL("normal"), OBLIQUE("oblique");
+
+		private String value;
+
+		OdfFontStyle(String style) {
+			this.value = style;
+		}
+
+		public static OdfFontStyle enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return NORMAL;
+
+			for (OdfFontStyle aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return NORMAL;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+
+	/**
+	 * Font weight from ODF specification perspective
+	 * 
+	 */
+	public static enum OdfFontWeight {
+		_100("100"), _200("200"), _300("300"), _400("400"), _500("500"), _600("600"), _700("700"), _800("800"), _900(
+				"900"), BOLD("bold"), NORMAL("normal");
+		private String value;
+
+		OdfFontWeight(String style) {
+			this.value = style;
+		}
+
+		public static OdfFontWeight enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return NORMAL;
+
+			for (OdfFontWeight aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return NORMAL;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+	
+	/**
+	 * 
+	 * the fill style for a graphic object. 
+	 *
+	 */
+	public static enum OdfDrawFill {
+		/**
+		 * the drawing object is filled with the bitmap specified by the draw:fill-image-name attribute.
+		 */
+		BITMAP("bitmap"),
+		/**
+		 * the drawing object is filled with the gradient specified by the draw:fill-gradient-name attribute.
+		 */
+		GRADIENT("gradient"),
+		/**
+		 * the drawing object is filled with the hatch specified by the draw:fill-hatch-name attribute. 
+		 */
+		HATCH("hatch"),
+		/**
+		 * the drawing object is not filled.
+		 */
+		NONE("none"),
+		/**
+		 * the drawing object is filled with the color specified by the draw:fill-color attribute.
+		 */
+		SOLID("solid");  		
+
+		private String value;
+
+		OdfDrawFill(String style) {
+			this.value = style;
+		}
+
+		public static OdfDrawFill enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return NONE;
+
+			for (OdfDrawFill aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return NONE;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+	
+	/**
+	 * 
+	 * The style of the stroke from ODF perspective
+	 *
+	 */
+	public static enum OdfDrawStroke {
+		/**
+		 * stroke referenced by a draw:stroke-dash attribute of a style on the object is drawn
+		 */
+		DASH("dash"),
+		/**
+		 * no stroke is drawn.
+		 */
+		NONE("none"),
+		/**
+		 * solid stroke is drawn.
+		 */
+		SOLID("solid");
+		
+		private String value;
+
+		OdfDrawStroke(String style) {
+			this.value = style;
+		}
+
+		public static OdfDrawStroke enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return NONE;
+
+			for (OdfDrawStroke aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return NONE;
+		}
+
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
+
+	public static enum PrintOrientation {
+		LANDSCAPE("landscape"), PORTRAIT("portrait");
+
+		private String printOrientaiton;
+
+		PrintOrientation(String orientation) {
+			this.printOrientaiton = orientation;
+		}
+
+		public static PrintOrientation enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return PORTRAIT;
+
+			for (PrintOrientation aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return PORTRAIT;
+		}
+
+		@Override
+		public String toString() {
+			return printOrientaiton;
+		}
+	}
+
+	public static enum WritingMode {
+		LRTB("lr-tb"), RLTB("rl-tb"), TBRL("tb-rl"), TBLR("tb-lr"), LR("lr"), RL(
+				"rl"), TB("tb"), PAGE("page");
+
+		private String mode;
+
+		WritingMode(String mode) {
+			this.mode = mode;
+		}
+
+		public static WritingMode enumValueOf(String aValue) {
+			if ((aValue == null) || (aValue.length() == 0))
+				return PAGE;
+
+			for (WritingMode aIter : values()) {
+				if (aValue.equals(aIter.toString())) {
+					return aIter;
+				}
+			}
+			return PAGE;
+		}
+
+		@Override
+		public String toString() {
+			return mode;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/TOCStyle.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TOCStyle.java
new file mode 100644
index 0000000..7402b9d
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TOCStyle.java
@@ -0,0 +1,84 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.style;
+
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+/**
+ * This class represents the additional paragraph styles list that you want to
+ * include in the TOC.
+ * 
+ * @since 0.8.6
+ */
+public class TOCStyle {
+	HashMap<Integer, String> stylelist=new HashMap<Integer, String>();
+	
+	/**
+	 * Create an instance of TOCStyle
+	 * @param doc 
+	 */
+	public TOCStyle() {
+		
+	}
+
+	/**
+	 * Add an additional paragraph style to the style list that you want to
+	 * include in the TOC.
+	 * 
+	 * @param styleName
+	 *            - the style name
+	 * @param level
+	 *            - the outline level of this style, level value is: [1,10]
+	 */
+	public void addStyle(String styleName, int level) {
+		if ((level >= 1) && (level <= 10)) {
+			
+			stylelist.put(level, styleName);
+		
+		} else {
+			Logger.getLogger(TOCStyle.class.getName()).log(
+					Level.SEVERE,
+					"Outline level:" + level + " is out of range[1,10] "
+							+ "TOCStyle.addStyle failed.");
+			throw new RuntimeException("Outline level:" + level
+					+ " is out of range[1,10] " + "TOCStyle.addStyle failed.");
+		}
+	}
+	public HashMap<Integer, String> getStyle(){
+		return stylelist;
+	}
+	@Override
+	public String toString() {
+		StringBuilder strBuilder = new StringBuilder();
+		int size=stylelist.size();
+		strBuilder.append("The additional paragraph styles list that you want to include in the TOC.\n");
+		for(int i=0;i<size;i++){
+			strBuilder.append("Outline Level:"+ (i+1));	
+			String styleName=stylelist.get(i+1);
+			strBuilder.append(" Style Name:"+styleName);
+			strBuilder.append("\n");
+		}
+		return strBuilder.toString();
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/TableCellProperties.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TableCellProperties.java
new file mode 100644
index 0000000..e8ed94a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TableCellProperties.java
@@ -0,0 +1,962 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBackgroundColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoWrapOptionAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthTopAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalBlTrAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalBlTrWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalTlBrAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleDiagonalTlBrWidthsAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleVerticalAlignAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.type.Color;
+
+/**
+ * This class represents the table cell style settings. It provides methods to
+ * access borders styles. More functions will be added latter.
+ * 
+ * <p>
+ * This class is a corresponded high level class for element
+ * "style:table-cell-properties". It provides methods to access the attributes
+ * and children of "style:table-cell-properties".
+ * 
+ * @since 0.3
+ */
+public class TableCellProperties {
+
+	// fo:background-color
+	// fo:border
+	// fo:border-bottom
+	// fo:border-left
+	// fo:border-right
+	// fo:border-top
+	// fo:padding
+	// fo:padding-bottom
+	// fo:padding-left
+	// fo:padding-right
+	// fo:padding-top
+	// fo:wrap-option
+	// style:border-line-width
+	// style:border-line-width-bottom
+	// style:border-line-width-left
+	// style:border-line-width-right
+	// style:border-line-width-top
+	// style:cell-protect
+	// style:decimal-places
+	// style:diagonal-bl-tr
+	// style:diagonal-bl-tr-widths
+	// style:diagonal-tl-br
+	// style:diagonal-tl-br-widths
+	// style:direction
+	// style:glyph-orientation-vertical
+	// style:print-content
+	// style:repeat-content
+	// style:rotation-align
+	// style:rotation-angle
+	// style:shadow
+	// style:shrink-to-fit
+	// style:text-align-source
+	// style:vertical-align
+	// style:writing-mode
+
+	// String backgroundColor;
+	String padding;
+	String paddingBottom;
+	String paddingLeft;
+	String paddingRight;
+	String paddingTop;
+	String cellProtect;
+	String decimalPlaces;
+	String direction;
+	String glyphOrientationVertical;
+	String printContent;
+	String repeatContent;
+	String rotationAlign;
+	String rotationAngle;
+	String shadow;
+	String shrinkToFit;
+	String textAlignSource;
+	String verticalAlign;
+	String writingMode;
+	// String wrapOption;
+
+	// String border;
+	// String borderBottom;
+	// String borderLeft;
+	// String borderRight;
+	// String borderTop;
+	// String diagonalBlTr;
+	// String diagonalTlBr;
+	// String borderLineWidth;
+	// String borderLineWidthBottom;
+	// String borderLineWidthLeft;
+	// String borderLineWidthRight;
+	// String borderLineWidthTop;
+	// String diagonalBlTrWidths;
+	// String diagonalTlBrWidths;
+	
+	BorderPropertiesImpl mBorderPropertiesHandler;
+
+	StyleTableCellPropertiesElement mElement;
+
+	/**
+	 * Create an instance of TableCellProperties
+	 */
+	protected TableCellProperties() {
+	}
+
+	/**
+	 * Create an instance of TableCellProperties from an element
+	 * <style:table-cell-properties>
+	 * 
+	 * @param properties
+	 *            - the element of style:table-cell-properties
+	 */
+	protected TableCellProperties(StyleTableCellPropertiesElement properties) {
+		mElement = properties;
+		mBorderPropertiesHandler = new BorderPropertiesImpl(mElement);
+	}
+
+	/**
+	 * Set the border style.
+	 * <p>
+	 * The first parameter <code>bordersType</code> describes which borders you
+	 * want to apply the style to, e.g. up border, bottom border, left border,
+	 * right border, diagonal lines or four borders.
+	 * <p>
+	 * The border style information will be removed if the parameter
+	 * <code>bordersType</code> is NONE.
+	 * 
+	 * @param bordersType
+	 *            - the type of the borders
+	 * @param border
+	 *            - the border style description
+	 */
+	public void setBorders(StyleTypeDefinitions.CellBordersType bordersType, Border border) {
+		switch (bordersType) {
+		case BOTTOM:
+			setBottomBorder(border);
+			break;
+		case LEFT:
+			setLeftBorder(border);
+			break;
+		case RIGHT:
+			setRightBorder(border);
+			break;
+		case TOP:
+			setTopBorder(border);
+			break;
+		case DIAGONALBLTR:
+			setDiagonalBlTr(border);
+			break;
+		case DIAGONALTLBR:
+			setDiagonalTlBr(border);
+			break;
+		case ALL_FOUR:
+			setBorder(border);
+			break;
+		case LEFT_RIGHT:
+			setLeftBorder(border);
+			// border.switchInnerLineOuterLineWidth();
+			setRightBorder(border);
+			break;
+		case TOP_BOTTOM:
+			setTopBorder(border);
+			// border.switchInnerLineOuterLineWidth();
+			setBottomBorder(border);
+			break;
+		case DIAGONAL_LINES:
+			setDiagonalBlTr(border);
+			setDiagonalTlBr(border);
+			break;
+		case NONE:
+			mElement.removeAttribute(StyleBorderLineWidthAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthBottomAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderBottomAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthTopAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderTopAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthLeftAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderLeftAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleBorderLineWidthRightAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoBorderRightAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalBlTrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalBlTrAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalTlBrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalTlBrAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	/**
+	 * Return the border setting for all four borders.
+	 * <p>
+	 * Null will be returned if there is no border setting for all four borders.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBorder() {
+		return mBorderPropertiesHandler.getBorder();
+	}
+
+	/**
+	 * Return the border setting for the top border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the top border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getTopBorder() {
+		return mBorderPropertiesHandler.getTopBorder();
+	}
+
+	/**
+	 * Return the border setting for the left border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the left border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getLeftBorder() {
+		return mBorderPropertiesHandler.getLeftBorder();
+	}
+
+	/**
+	 * Return the border setting for the right border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the right border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getRightBorder() {
+		return mBorderPropertiesHandler.getRightBorder();
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Return the border setting for the bottom border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the bottom
+	 * border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBottomBorder() {
+		return mBorderPropertiesHandler.getBottomBorder();
+	}
+
+	/**
+	 * Return the border setting for the diagonal from bottom left to top right.
+	 * <p>
+	 * Null will be returned if there is no border setting for the diagonal from
+	 * bottom left to top right.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getDiagonalBlTr() {
+		Border border = new Border();
+		String borderAttr = mElement.getStyleDiagonalBlTrAttribute();
+		String borderWidth = mElement.getStyleDiagonalBlTrWidthsAttribute();
+		if (borderWidth == null)
+			// some ODF version uses diagonal-bl-tr-width while schema use
+			// diagonal-bl-tr-widths
+			borderWidth = mElement.getAttribute("style:diagonal-bl-tr-width");
+
+		if (borderAttr == null || borderAttr.length() == 0)
+			return null;
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+	/**
+	 * Return the border setting for the diagonal from top left to bottom right.
+	 * <p>
+	 * Null will be returned if there is no border setting for the diagonal from
+	 * top left to bottom right.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getDiagonalTlBr() {
+		Border border = new Border();
+		String borderAttr = mElement.getStyleDiagonalTlBrAttribute();
+		String borderWidth = mElement.getStyleDiagonalTlBrWidthsAttribute();
+		if (borderWidth == null)
+			// some ODF version uses diagonal-tl-br-width while schema use
+			// diagonal-tl-br-widths
+			borderWidth = mElement.getAttribute("style:diagonal-tl-br-width");
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Set the border definition for the bottom border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the bottom border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the bottom border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBottomBorder(Border border) {
+		mBorderPropertiesHandler.setBottomBorder(border);
+	}
+
+	// fo:border-top
+	// style:border-line-width-top
+	/**
+	 * Set the border definition for the top border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the top border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the top border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setTopBorder(Border border) {
+		mBorderPropertiesHandler.setTopBorder(border);
+	}
+
+	// fo:border-left
+	// style:border-line-width-left
+	/**
+	 * Set the border definition for the left border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the left border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the left border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setLeftBorder(Border border) {
+		mBorderPropertiesHandler.setLeftBorder(border);
+	}
+
+	// fo:border-right
+	// style:border-line-width-right
+	/**
+	 * Set the border definition for the right border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the right border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the right border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setRightBorder(Border border) {
+		mBorderPropertiesHandler.setRightBorder(border);
+	}
+
+	// style:diagonal-bl-tr
+	// style:diagonal-bl-tr-widths
+	/**
+	 * Set the border definition for the diagonal from bottom left to top right.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the diagonal from bottom left to top right will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the diagonal from bottom left to top right will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setDiagonalBlTr(Border border) {
+		if (border == null) {
+			mElement.removeAttribute(StyleDiagonalBlTrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalBlTrAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			mElement.setStyleDiagonalBlTrWidthsAttribute(border.getDoubleLineWidthDescription());
+			mElement.setStyleDiagonalBlTrAttribute(border.getBorderDescription());
+			break;
+		case SINGLE:
+			mElement.setStyleDiagonalBlTrAttribute(border.getBorderDescription());
+			break;
+		case NONE:
+			mElement.removeAttribute(StyleDiagonalBlTrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalBlTrAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	// style:diagonal-tl-br
+	// style:diagonal-tl-br-widths
+	/**
+	 * Set the border definition for the diagonal from top left to bottom right.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the diagonal from top left to bottom right will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the diagonal from top left to bottom right will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setDiagonalTlBr(Border border) {
+		if (border == null) {
+			mElement.removeAttribute(StyleDiagonalTlBrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalTlBrAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			mElement.setStyleDiagonalTlBrWidthsAttribute(border.getDoubleLineWidthDescription());
+			mElement.setStyleDiagonalTlBrAttribute(border.getBorderDescription());
+			break;
+		case SINGLE:
+			mElement.setStyleDiagonalTlBrAttribute(border.getBorderDescription());
+			break;
+		case NONE:
+			mElement.removeAttribute(StyleDiagonalTlBrWidthsAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleDiagonalTlBrAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	// fo:border
+	// style:border-line-width
+	/**
+	 * Set the border definition for all four borders.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * all four borders will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for all four borders will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBorder(Border border) {
+		mBorderPropertiesHandler.setBorder(border);
+	}
+
+	// fo:background-color
+	/**
+	 * Set the background color.
+	 * <p>
+	 * If the parameter <code>aColor</code> is null, the background color
+	 * definition will be removed.
+	 * 
+	 * @param aColor
+	 *            - the background color
+	 */
+	public void setBackgroundColor(Color aColor) {
+		if (aColor == null) {
+                    mElement.removeAttribute(FoBackgroundColorAttribute.ATTRIBUTE_NAME.getQName());
+                } else {
+                    mElement.setFoBackgroundColorAttribute(aColor.toString());
+                }
+	}
+
+	// //style:cell-protect
+	// public void setProtected(boolean isProtected)
+	// {
+	//		
+	// }
+	//	
+	// //style:cell-protect
+	// public boolean isProctected()
+	// {
+	// return false;
+	// }
+
+	/**
+	 * Return the background color.
+	 * <p>
+	 * Null will be returned if there is no the background color definition or
+	 * the background color definition is not valid.
+	 * 
+	 * @return the background color
+	 */
+	public Color getBackgroundColor() {
+		String property = mElement.getFoBackgroundColorAttribute();
+		Color color = null;
+		try {
+			color = Color.valueOf(property);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellProperties.class.getName()).log(Level.WARNING, e.getMessage());
+		}
+		return color;
+	}
+
+	// fo:wrap-option
+	/**
+	 * Set the text is allowed to be wrapped.
+	 * <p>
+	 * If the parameter <code>isWrapped</code> is true, the text will be allowed
+	 * to be wrapped. Or else, the text is not allowed to be wrapped.
+	 * 
+	 * @param isWrapped
+	 *            - the wrapped option
+	 */
+	public void setWrapped(boolean isWrapped) {
+		if (isWrapped) {
+			mElement.setFoWrapOptionAttribute(FoWrapOptionAttribute.Value.WRAP.toString());
+		} else {
+			mElement.setFoWrapOptionAttribute(FoWrapOptionAttribute.Value.NO_WRAP.toString());
+		}
+	}
+
+	// style:vertical-align
+	/**
+	 * Set the vertical alignment.
+	 * <p>
+	 * If the parameter <code>alignType</code> is null or DEFAULT, the vertical
+	 * alignment definition will be removed.
+	 * 
+	 * @param alignType
+	 *            - the vertical alignment
+	 */
+	public void setVerticalAlignment(StyleTypeDefinitions.VerticalAlignmentType alignType) {
+		if (alignType == StyleTypeDefinitions.VerticalAlignmentType.DEFAULT || alignType == null)
+			mElement.removeAttribute(StyleVerticalAlignAttribute.ATTRIBUTE_NAME.getQName());
+		else
+			mElement.setStyleVerticalAlignAttribute(alignType.toString());
+	}
+
+	// style:vertical-align
+	/**
+	 * Return the vertical alignment.
+	 * <p>
+	 * If there is no vertical alignment definition, null will be returned.
+	 * 
+	 * @return the vertical alignment
+	 */
+	public StyleTypeDefinitions.VerticalAlignmentType getVerticalAlignment() {
+		String alignType = mElement.getStyleVerticalAlignAttribute();
+		if ((alignType == null) || (alignType.length() == 0))
+			return null;
+
+		StyleVerticalAlignAttribute.Value value = StyleVerticalAlignAttribute.Value.enumValueOf(alignType);
+
+		switch (value) {
+		case AUTO:
+			return StyleTypeDefinitions.VerticalAlignmentType.DEFAULT;
+		case AUTOMATIC:
+			return StyleTypeDefinitions.VerticalAlignmentType.DEFAULT;
+		case BASELINE:
+			return StyleTypeDefinitions.VerticalAlignmentType.BOTTOM;
+		case BOTTOM:
+			return StyleTypeDefinitions.VerticalAlignmentType.BOTTOM;
+		case MIDDLE:
+			return StyleTypeDefinitions.VerticalAlignmentType.MIDDLE;
+		case TOP:
+			return StyleTypeDefinitions.VerticalAlignmentType.TOP;
+		}
+		return null;
+	}
+
+	// fo:wrap-option
+	/**
+	 * Return whether the text is allowed to be wrapped.
+	 * <p>
+	 * Return true if the text is allowed to be wrapped. Or else, return false.
+	 * 
+	 * @return a boolean value to indicate whether the text is allowed to be
+	 *         wrapped
+	 */
+	public Boolean isWrapped() {
+		String attr = mElement.getFoWrapOptionAttribute();
+		if ((attr == null) || (attr.length() == 0))
+			return false;
+
+		FoWrapOptionAttribute.Value value = FoWrapOptionAttribute.Value.enumValueOf(attr);
+
+		switch (value) {
+		case NO_WRAP:
+			return false;
+		case WRAP:
+			return true;
+		}
+		return null;
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>TableCellProperties</p> to represent the "style:table-cell-properties" in a style element.
+	 * <p>If there is no "style:table-cell-properties" defined in the style element, a new "style:table-cell-properties" element will be created.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>TableCellProperties</p>
+	 */
+	public static TableCellProperties getOrCreateTableCellProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style
+				.getOrCreatePropertiesElement(OdfStylePropertiesSet.TableCellProperties);
+		return new TableCellProperties((StyleTableCellPropertiesElement) properties);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>TableCellProperties</p> to represent the "style:table-cell-properties" in a style element.
+	 * <p>If there is no "style:table-cell-properties" defined in the style element, null will be returned.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>TableCellProperties</p>;Null if there is no
+	 *         "style:table-cell-properties" defined
+	 */
+	public static TableCellProperties getTableCellProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style.getPropertiesElement(OdfStylePropertiesSet.TableCellProperties);
+		if (properties != null)
+			return new TableCellProperties((StyleTableCellPropertiesElement) properties);
+		else
+			return null;
+	}
+
+}
+
+class BorderPropertiesImpl {
+	
+	OdfStylePropertiesBase borderPropertiesElement;
+	
+	public BorderPropertiesImpl(OdfStylePropertiesBase element)
+	{
+		borderPropertiesElement = element;
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Set the border definition for the bottom border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the bottom border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the bottom border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBottomBorder(Border border) {
+		if (border == null) {
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthBottomAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderBottomAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "style:border-line-width-bottom",border.getDoubleLineWidthDescription());
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-bottom",border.getBorderDescription());
+			break;
+		case SINGLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-bottom",border.getBorderDescription());
+			break;
+		case NONE:
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthBottomAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderBottomAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	// fo:border-top
+	// style:border-line-width-top
+	/**
+	 * Set the border definition for the top border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the top border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the top border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setTopBorder(Border border) {
+		if (border == null) {
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthTopAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderTopAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "style:border-line-width-top",border.getDoubleLineWidthDescription());
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-top",border.getBorderDescription());
+			break;
+		case SINGLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-top",border.getBorderDescription());
+			break;
+		case NONE:
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthTopAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderTopAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	// fo:border-left
+	// style:border-line-width-left
+	/**
+	 * Set the border definition for the left border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the left border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the left border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setLeftBorder(Border border) {
+		if (border == null) {
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthLeftAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderLeftAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "style:border-line-width-left",border.getDoubleLineWidthDescription());
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-left",border.getBorderDescription());
+			break;
+		case SINGLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-left",border.getBorderDescription());
+			break;
+		case NONE:
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthLeftAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderLeftAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	// fo:border-right
+	// style:border-line-width-right
+	/**
+	 * Set the border definition for the right border.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * the right border will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for the right border will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setRightBorder(Border border) {
+		if (border == null) {
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthRightAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderRightAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "style:border-line-width-right",border.getDoubleLineWidthDescription());
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-right",border.getBorderDescription());
+			break;
+		case SINGLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border-right",border.getBorderDescription());
+			break;
+		case NONE:
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthRightAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderRightAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	// fo:border
+	// style:border-line-width
+	/**
+	 * Set the border definition for all four borders.
+	 * <p>
+	 * If the parameter <code>border</code> is null, the border definition for
+	 * all four borders will be removed.
+	 * <p>
+	 * If the line type in the border definition is NONE, the border definition
+	 * for all four borders will be removed.
+	 * 
+	 * @param border
+	 *            - the border setting
+	 */
+	public void setBorder(Border border) {
+		if (border == null) {
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderAttribute.ATTRIBUTE_NAME.getQName());
+			return;
+		}
+		switch (border.lineStyle) {
+		case DOUBLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "style:border-line-width",border.getDoubleLineWidthDescription());
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border",border.getBorderDescription());
+			break;
+		case SINGLE:
+			borderPropertiesElement.setAttributeNS(OdfDocumentNamespace.FO.getUri(), "fo:border",border.getBorderDescription());
+			break;
+		case NONE:
+			borderPropertiesElement.removeAttribute(StyleBorderLineWidthAttribute.ATTRIBUTE_NAME.getQName());
+			borderPropertiesElement.removeAttribute(FoBorderAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+	
+	/**
+	 * Return the border setting for all four borders.
+	 * <p>
+	 * Null will be returned if there is no border setting for all four borders.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBorder() {
+		Border border = new Border();
+		String borderAttr = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.FO.getUri(), "border");
+		String borderWidth = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "border-line-width");
+
+		if (borderAttr == null || borderAttr.length() == 0)
+			return null;
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+	/**
+	 * Return the border setting for the top border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the top border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getTopBorder() {
+		Border border = new Border();
+		String borderAttr = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.FO.getUri(), "border-top");
+		String borderWidth = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "border-line-width-top");
+
+		if (borderAttr == null || borderAttr.length() == 0)
+			return getBorder();
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+	/**
+	 * Return the border setting for the left border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the left border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getLeftBorder() {
+		Border border = new Border();
+		String borderAttr = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.FO.getUri(), "border-left");
+		String borderWidth = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "border-line-width-left");
+
+		if (borderAttr == null || borderAttr.length() == 0)
+			return getBorder();
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+	/**
+	 * Return the border setting for the right border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the right border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getRightBorder() {
+		Border border = new Border();
+		String borderAttr = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.FO.getUri(), "border-right");
+		String borderWidth = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "border-line-width-right");
+
+		if (borderAttr == null || borderAttr.length() == 0)
+			return getBorder();
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+	// fo:border-bottom
+	// style:border-line-width-bottom
+	/**
+	 * Return the border setting for the bottom border.
+	 * <p>
+	 * Null will be returned if there is no border setting for the bottom
+	 * border.
+	 * 
+	 * @return the border setting
+	 */
+	public Border getBottomBorder() {
+		Border border = new Border();
+		String borderAttr = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.FO.getUri(), "border-bottom");
+		String borderWidth = borderPropertiesElement.getAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "border-line-width-bottom");
+
+		if (borderAttr == null || borderAttr.length() == 0) {
+			return getBorder();
+		}
+
+		border.setBorderByDescription(borderAttr);
+		if ((borderWidth != null) && (borderWidth.length() != 0)) {
+			border.setDoubleLineWidthByDescription(borderWidth);
+		}
+		return border;
+	}
+
+}
+
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/TableProperties.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TableProperties.java
new file mode 100644
index 0000000..15b5544
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TableProperties.java
@@ -0,0 +1,170 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakAfterAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBreakBeforeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+
+/**
+ * This class represents the table style settings. It provides methods to access
+ * or modify the formatting properties applied to tables. More functions will be
+ * added latter.
+ * 
+ * <p>
+ * This class is a corresponded high level class for element
+ * "style:table-properties". It provides methods to access the attributes and
+ * children of "style:table-properties".
+ * 
+ * @since 0.8
+ */
+public class TableProperties {
+	StyleTablePropertiesElement mElement;
+
+	/**
+	 * Create an instance of TableProperties
+	 */
+	protected TableProperties() {
+	}
+
+	/**
+	 * Create an instance of TableProperties from an element
+	 * <style:table-properties>
+	 * 
+	 * @param properties
+	 *            - the element of style:table-properties
+	 */
+	protected TableProperties(StyleTablePropertiesElement properties) {
+		mElement = properties;
+	}
+
+	/**
+	 * Set the break.
+	 * 
+	 * @param breakPosition
+	 *            the position to insert a break (before or after)
+	 * @param breakAttribute
+	 *            the attribute name (page or column)
+	 */
+	public void setBreak(String breakPosition, String breakAttribute) {
+		if (breakPosition == null) {
+			return;
+		}
+		if (breakAttribute == null) {
+			if (breakPosition.equals("before")) {
+				mElement.removeAttribute(FoBreakBeforeAttribute.ATTRIBUTE_NAME
+						.getQName());
+			} else if (breakPosition.equals("after"))
+				mElement.removeAttribute(FoBreakAfterAttribute.ATTRIBUTE_NAME
+						.getQName());
+		} else if (breakPosition.equals("before")) {
+			mElement.setFoBreakBeforeAttribute(breakAttribute);
+		} else if (breakPosition.equals("after"))
+			mElement.setFoBreakAfterAttribute(breakAttribute);
+	}
+
+	/**
+	 * Return the break property before the reference.
+	 * <p>
+	 * Null will be returned if there is no break setting before the reference.
+	 * 
+	 * @return - the break property; null if there is no break setting.
+	 */
+	public String getBreakBefore() {
+		return mElement.getFoBreakBeforeAttribute();
+	}
+
+	/**
+	 * Return the break property after the reference.
+	 * <p>
+	 * Null will be returned if there is no break setting after the reference.
+	 * 
+	 * @return - the break property; null if there is no break setting.
+	 */
+	public String getBreakAfter() {
+		return mElement.getFoBreakAfterAttribute();
+	}
+
+	/**
+	 * Return the page number that is used for a new page with a master style.
+	 * <p>
+	 * If there is no valid page number, 0 will be returned;
+	 * 
+	 * @return the page number
+	 */
+	public int getPageNumber() {
+		try {
+			return mElement.getStylePageNumberAttribute();
+		} catch (NullPointerException e) {
+			return 0;
+		}
+	}
+
+	/**
+	 * Set the page number for a new page with a master style.
+	 * 
+	 * @param pageNumber
+	 *            the page number
+	 */
+	public void setPageNumber(int pageNumber) {
+		if (pageNumber > 0) {
+			mElement.setStylePageNumberAttribute(pageNumber);
+		} else {
+			mElement.removeAttribute("style:page-number");
+		}
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>TableProperties</p> to represent the "style:table-properties" in a style element.
+	 * <p>If there is no "style:table-properties" defined in the style element, a new "style:table-properties" element will be created.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>TableProperties</p>
+	 */
+	public static TableProperties getOrCreateTableProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style
+				.getOrCreatePropertiesElement(OdfStylePropertiesSet.TableProperties);
+		return new TableProperties((StyleTablePropertiesElement) properties);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>TableProperties</p> to represent the "style:table-properties" in a style element.
+	 * <p>If there is no "style:table-properties" defined in the style element, null will be returned.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>TableProperties</p>;Null if there is no
+	 *         "style:table-properties" defined
+	 */
+	public static TableProperties getTableProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style
+				.getPropertiesElement(OdfStylePropertiesSet.TableProperties);
+		if (properties != null)
+			return new TableProperties((StyleTablePropertiesElement) properties);
+		else
+			return null;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/style/TextProperties.java b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TextProperties.java
new file mode 100644
index 0000000..a58113a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/style/TextProperties.java
@@ -0,0 +1,1153 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoCountryAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontSizeAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoFontWeightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoLanguageAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleCountryAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleCountryComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontNameComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontSizeComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontStyleComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontWeightAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleFontWeightComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLanguageAsianAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleLanguageComplexAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextLineThroughStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineColorAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineStyleAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineWidthAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.OdfStylePropertiesBase;
+import org.odftoolkit.odfdom.dom.element.office.OfficeFontFaceDeclsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFontFaceElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents text style settings.
+ * <p>
+ * In Open Document Format, there can be different font settings for different
+ * script types.
+ * <p>
+ * This class provides methods to access font style, font size, font name and
+ * etc for different script types.
+ * <p>
+ * Further functions will be provided, such as underline, shadow, background
+ * color and etc.
+ * 
+ * <p>
+ * This class is a corresponded high level class for element
+ * "style:text-properties". It provides methods to access the attributes and
+ * children of "style:text-properties".
+ * 
+ * @since 0.3
+ */
+public class TextProperties {
+
+	// The corresponding attributes includes:
+	// ---Westen---
+	//
+	// fo:background-color
+	// fo:color
+	// fo:country
+	// fo:language
+	// fo:font-family
+	// fo:font-size
+	// fo:font-style
+	// fo:font-variant
+	// fo:font-weight
+	// fo:hyphenate
+	// fo:hyphenation-push-char-count
+	// fo:hyphenation-remain-char-count
+	// fo:letter-spacing
+	// fo:script
+	// fo:text-shadow
+	// fo:text-transform
+	// style:font-style-name //not used
+	//
+	// style:text-emphasize
+	// style:text-line-through-color
+	// style:text-line-through-mode
+	// style:text-line-through-style
+	// style:text-line-through-text
+	// style:text-line-through-text-style
+	// style:text-line-through-type
+	// style:text-line-through-width
+	//
+	// style:text-outline
+	// style:text-underline-color
+	// style:text-underline-mode
+	// style:text-underline-style
+	// style:text-underline-type
+	// style:text-underline-width
+	//
+	// style:use-window-font-color
+	// style:font-relief
+	// style:font-name
+	// style:font-charset
+	// style:font-family-generic
+	// style:font-pitch
+	// style:script-type
+	//
+	// ----Asian---
+	//
+	// style:font-style-name-asian
+	// style:font-weight-asian
+	// style:language-asian
+	// style:script-asian
+	// style:font-size-asian
+	// style:font-name-asian
+	// style:country-asian
+	// style:font-charset-asian
+	// style:font-family-asian
+	// style:rfc-language-tag-asian
+	// style:font-pitch-asian
+	// style:font-style-asian
+	//
+	// ----Complex----
+	//
+	// style:font-style-name-complex
+	// style:font-weight-complex
+	// style:language-complex
+	// style:script-complex
+	// style:font-size-complex
+	// style:font-name-complex
+	// style:country-complex
+	// style:font-charset-complex
+	// style:font-family-complex
+	// style:rfc-language-tag-complex
+	// style:font-style-complex
+	// style:font-pitch-complex
+
+	StyleTextPropertiesElement mElement;
+
+	/*
+	 * String familyName; //svg:font-family String fontName; //style:name @
+	 * style:font-face StyleTypeDefinitions.SimpleFontStyle SimpleFontStyle;
+	 * //fo:font-style, fo:font-weight int size; //fo:font-size Locale language;
+	 * Color fontColor; //fo:color Color backgroundColor; //fo:background-color
+	 * String overLining; //style:text-overline-style="solid"
+	 * //style:text-overline-type="double" //style:text-overline-width="auto"
+	 * //style:text-overline-color="#000000" String
+	 * strikeThrough;//style:text-line-through-style="solid"
+	 * style:text-line-through-type="double" String underLining;
+	 * //style:text-underline-style="solid" style:text-underline-width="auto"
+	 * style:text-underline-color="#00ccff" Color overLiningColor; Color
+	 * underLiningColor; String emphasisMark;
+	 * //style:text-emphasize="circle below",
+	 * style:text-emphasize="accent above" String relief;
+	 * //style:font-relief="embossed", style:font-relief="engraved" boolean
+	 * isOutline; //style:text-outline="true" boolean isShadow;
+	 * //fo:text-shadow="1pt 1pt"
+	 */
+
+	/**
+	 * Create an instance of TextProperties
+	 */
+	protected TextProperties() {
+	}
+
+	/**
+	 * Create an instance of TextProperties from an element
+	 * <style:text-properties>
+	 * 
+	 * @param textProperties
+	 *            - the element of style:text-properties
+	 */
+	protected TextProperties(StyleTextPropertiesElement textProperties) {
+		mElement = textProperties;
+	}
+
+	/**
+	 * Return the font style for western characters
+	 * <p>
+	 * Null will be returned if there is no font style setting for western
+	 * characters
+	 * 
+	 * @return the font style
+	 */
+	public StyleTypeDefinitions.FontStyle getFontStyle() {
+
+		String fontstyle = mElement.getFoFontStyleAttribute();
+		String fontweight = mElement.getFoFontWeightAttribute();
+		StyleTypeDefinitions.OdfFontStyle theFontType = StyleTypeDefinitions.OdfFontStyle.enumValueOf(fontstyle);
+		StyleTypeDefinitions.OdfFontWeight theFontWeight = StyleTypeDefinitions.OdfFontWeight.enumValueOf(fontweight);
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.NORMAL
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.NORMAL)
+			return StyleTypeDefinitions.FontStyle.REGULAR;
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.ITALIC
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.NORMAL)
+			return StyleTypeDefinitions.FontStyle.ITALIC;
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.ITALIC
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.BOLD)
+			return StyleTypeDefinitions.FontStyle.BOLDITALIC;
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.NORMAL
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.BOLD)
+			return StyleTypeDefinitions.FontStyle.BOLD;
+
+		return null;
+	}
+	
+	/**
+	 * Return the font text line style
+	 * <p>
+	 * TextLineStyle.REGULAR will be returned if there is no text line style setting
+	 * 
+	 * @return the font style
+	 */
+	public StyleTypeDefinitions.TextLinePosition getTextLineStyle() {
+		String throughLine = mElement.getStyleTextLineThroughStyleAttribute();
+		String underLine = mElement.getStyleTextUnderlineStyleAttribute();
+		if (throughLine ==null && underLine == null)
+			return StyleTypeDefinitions.TextLinePosition.REGULAR;
+		if (throughLine !=null && underLine == null)
+			return StyleTypeDefinitions.TextLinePosition.THROUGH;
+		if (throughLine !=null && underLine != null)
+			return StyleTypeDefinitions.TextLinePosition.THROUGHUNDER;
+		if (throughLine ==null && underLine != null)
+			return StyleTypeDefinitions.TextLinePosition.UNDER;
+		return null;
+	}
+
+	/**
+	 * Return the font style for a specific script type
+	 * <p>
+	 * REGULAR will be returned if there is no font style setting for this
+	 * script type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font style for a specific script type
+	 */
+	public StyleTypeDefinitions.FontStyle getFontStyle(Document.ScriptType type) {
+		if (type == null)
+			type = Document.ScriptType.WESTERN;
+		String fontstyle = null, fontweight = null;
+		switch (type) {
+		case WESTERN:
+			fontstyle = mElement.getFoFontStyleAttribute();
+			fontweight = mElement.getFoFontWeightAttribute();
+			break;
+		case CJK:
+			fontstyle = mElement.getStyleFontStyleAsianAttribute();
+			fontweight = mElement.getStyleFontWeightAsianAttribute();
+			break;
+		case CTL:
+			fontstyle = mElement.getStyleFontStyleComplexAttribute();
+			fontweight = mElement.getStyleFontWeightComplexAttribute();
+			break;
+		}
+		StyleTypeDefinitions.OdfFontStyle theFontType = StyleTypeDefinitions.OdfFontStyle.enumValueOf(fontstyle);
+		StyleTypeDefinitions.OdfFontWeight theFontWeight = StyleTypeDefinitions.OdfFontWeight.enumValueOf(fontweight);
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.NORMAL
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.NORMAL)
+			return StyleTypeDefinitions.FontStyle.REGULAR;
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.ITALIC
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.NORMAL)
+			return StyleTypeDefinitions.FontStyle.ITALIC;
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.ITALIC
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.BOLD)
+			return StyleTypeDefinitions.FontStyle.BOLDITALIC;
+
+		if (theFontType == StyleTypeDefinitions.OdfFontStyle.NORMAL
+				&& theFontWeight == StyleTypeDefinitions.OdfFontWeight.BOLD)
+			return StyleTypeDefinitions.FontStyle.BOLD;
+
+		return null;
+	}
+
+	/**
+	 * Set the font style for western characters
+	 * <p>
+	 * If the parameter <code>style</code> is REGULAR, the font style setting
+	 * for western characters will be removed.
+	 * 
+	 * @param style
+	 *            - the font style
+	 */
+	public void setFontStyle(StyleTypeDefinitions.FontStyle style) {
+		switch (style) {
+		case BOLD:
+			mElement.removeAttribute(FoFontStyleAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.setFoFontWeightAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+			break;
+		case ITALIC:
+			mElement.setFoFontStyleAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+			mElement.removeAttribute(FoFontWeightAttribute.ATTRIBUTE_NAME.getQName());
+			break;
+		case BOLDITALIC:
+			mElement.setFoFontStyleAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+			mElement.setFoFontWeightAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+			break;
+		case REGULAR:
+			mElement.removeAttribute(FoFontStyleAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(FoFontWeightAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	/**
+	 * Set the font text line style for characters
+	 * <p>
+	 * If the parameter <code>style</code> is REGULAR, the font text line style
+	 * setting for characters will be removed.
+	 * 
+	 * @param style
+	 *            - the font text line style
+	 */
+	public void setTextLineStyle(StyleTypeDefinitions.TextLinePosition style) {
+		switch (style) {
+		case THROUGH:
+			mElement.setStyleTextLineThroughStyleAttribute(StyleTypeDefinitions.LineStyle.SOLID.toString());
+			mElement.setStyleTextLineThroughColorAttribute("font-color");
+			break;
+		case UNDER:
+			mElement.setStyleTextUnderlineStyleAttribute(StyleTypeDefinitions.LineStyle.SOLID.toString());
+			mElement.setStyleTextUnderlineWidthAttribute("auto");
+			mElement.setStyleTextUnderlineColorAttribute("font-color");
+			break;
+		case THROUGHUNDER:
+			mElement.setStyleTextLineThroughStyleAttribute(StyleTypeDefinitions.LineStyle.SOLID.toString());
+			mElement.setStyleTextLineThroughColorAttribute("font-color");
+			mElement.setStyleTextUnderlineStyleAttribute(StyleTypeDefinitions.LineStyle.SOLID.toString());
+			mElement.setStyleTextUnderlineWidthAttribute("auto");
+			mElement.setStyleTextUnderlineColorAttribute("font-color");
+			break;
+		case REGULAR:
+			mElement.removeAttribute(StyleTextLineThroughStyleAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleTextLineThroughColorAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleTextUnderlineStyleAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleTextUnderlineWidthAttribute.ATTRIBUTE_NAME.getQName());
+			mElement.removeAttribute(StyleTextUnderlineColorAttribute.ATTRIBUTE_NAME.getQName());
+		}
+	}
+
+	/**
+	 * Set the font style for a specific script type
+	 * <p>
+	 * If the parameter <code>style</code> is REGULAR, the font style setting
+	 * for this script type will be removed.
+	 * 
+	 * @param style
+	 *            - font style
+	 * @param type
+	 *            - script type
+	 */
+	public void setFontStyle(StyleTypeDefinitions.FontStyle style, Document.ScriptType type) {
+		if (type == null)
+			type = Document.ScriptType.WESTERN;
+		switch (type) {
+		case WESTERN:
+			switch (style) {
+			case BOLD:
+				mElement.removeAttribute(FoFontStyleAttribute.ATTRIBUTE_NAME.getQName());
+				mElement.setFoFontWeightAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+				break;
+			case ITALIC:
+				mElement.setFoFontStyleAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+				mElement.removeAttribute(FoFontWeightAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case BOLDITALIC:
+				mElement.setFoFontStyleAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+				mElement.setFoFontWeightAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+				break;
+			case REGULAR:
+				mElement.removeAttribute(FoFontStyleAttribute.ATTRIBUTE_NAME.getQName());
+				mElement.removeAttribute(FoFontWeightAttribute.ATTRIBUTE_NAME.getQName());
+			}
+			break;
+		case CJK:
+			switch (style) {
+			case BOLD:
+				mElement.removeAttribute(StyleFontStyleAsianAttribute.ATTRIBUTE_NAME.getQName());
+				mElement.setStyleFontWeightAsianAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+				break;
+			case ITALIC:
+				mElement.setStyleFontStyleAsianAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+				mElement.removeAttribute(StyleFontWeightAsianAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case BOLDITALIC:
+				mElement.setStyleFontStyleAsianAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+				mElement.setStyleFontWeightAsianAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+				break;
+			case REGULAR:
+				mElement.removeAttribute(StyleFontStyleAsianAttribute.ATTRIBUTE_NAME.getQName());
+				mElement.removeAttribute(StyleFontWeightAsianAttribute.ATTRIBUTE_NAME.getQName());
+			}
+			break;
+		case CTL:
+			switch (style) {
+			case BOLD:
+				mElement.removeAttribute(StyleFontStyleComplexAttribute.ATTRIBUTE_NAME.getQName());
+				mElement.setStyleFontWeightComplexAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+				break;
+			case ITALIC:
+				mElement.setStyleFontStyleComplexAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+				mElement.removeAttribute(StyleFontWeightComplexAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case BOLDITALIC:
+				mElement.setStyleFontStyleComplexAttribute(StyleTypeDefinitions.OdfFontStyle.ITALIC.toString());
+				mElement.setStyleFontWeightComplexAttribute(StyleTypeDefinitions.OdfFontWeight.BOLD.toString());
+				break;
+			case REGULAR:
+				mElement.removeAttribute(StyleFontStyleComplexAttribute.ATTRIBUTE_NAME.getQName());
+				mElement.removeAttribute(StyleFontWeightComplexAttribute.ATTRIBUTE_NAME.getQName());
+			}
+			break;
+		}
+	}
+
+	/**
+	 * Return the font size definition in measurement point(PT) for western
+	 * characters.
+	 * <p>
+	 * Zero will be returned if there is no font size definition for western
+	 * characters.
+	 * <p>
+	 * Zero will be returned if the line measurement is not point(PT).
+	 * 
+	 * @return the font size in measurement point(PT)
+	 */
+	public double getFontSizeInPoint() {
+		String fontsize = mElement.getFoFontSizeAttribute();
+		if (fontsize.endsWith("pt")) {
+			fontsize = fontsize.substring(0, fontsize.length() - 2);
+			double iSize;
+			try {
+				iSize = Double.parseDouble(fontsize.trim());
+			} catch (Exception e) {
+				iSize = 0;
+			}
+			return iSize;
+		}
+		return 0;
+	}
+
+	/**
+	 * Return the font size definition in measurement point(PT) for a specific
+	 * script type.
+	 * <p>
+	 * Zero will be returned if there is no font size definition for this script
+	 * type.
+	 * <p>
+	 * Zero will be returned if the line measurement is not point(PT).
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font size in measurement point(PT)
+	 */
+	public double getFontSizeInPoint(Document.ScriptType type) {
+		String fontsize = "";
+		switch (type) {
+		case WESTERN:
+			fontsize = mElement.getFoFontSizeAttribute();
+			break;
+		case CJK:
+			fontsize = mElement.getStyleFontSizeAsianAttribute();
+			break;
+		case CTL:
+			fontsize = mElement.getStyleFontSizeComplexAttribute();
+			break;
+		}
+		if (fontsize != null && fontsize.endsWith("pt")) {
+			fontsize = fontsize.substring(0, fontsize.length() - 2);
+			double iSize;
+			try {
+				iSize = Double.parseDouble(fontsize.trim());
+			} catch (Exception e) {
+				iSize = 0;
+			}
+			return iSize;
+		}
+		return 0;
+	}
+
+	/**
+	 * Set the font size in measurement point(PT) for western characters.
+	 * <p>
+	 * If the font size is less than zero, the font size definition for western
+	 * characters will be removed.
+	 * 
+	 * @param size
+	 *            - font size
+	 */
+	public void setFontSizeInPoint(double size) {
+		setFontSizeInPoint(size, Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Set the font size in measurement point(PT) for a specific script type.
+	 * <p>
+	 * If the font size is less than zero, the font size definition for this
+	 * script type will be removed.
+	 * 
+	 * @param size
+	 *            - font size
+	 * @param type
+	 *            - script type
+	 */
+	public void setFontSizeInPoint(double size, Document.ScriptType type) {
+		if (size < 0) {
+			switch (type) {
+			case WESTERN:
+				mElement.removeAttribute(FoFontSizeAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CJK:
+				mElement.removeAttribute(StyleFontSizeAsianAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CTL:
+				mElement.removeAttribute(StyleFontSizeComplexAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			}
+			return;
+		}
+		switch (type) {
+		case WESTERN:
+			mElement.setFoFontSizeAttribute(size + "pt");
+			break;
+		case CJK:
+			mElement.setStyleFontSizeAsianAttribute(size + "pt");
+			break;
+		case CTL:
+			mElement.setStyleFontSizeComplexAttribute(size + "pt");
+			break;
+		}
+	}
+
+	/**
+	 * Return the language information for western characters.
+	 * <p>
+	 * Null will be returned if there is no language information for western
+	 * characters.
+	 * 
+	 * @return the language information for western characters.
+	 */
+	public String getLanguage() {
+		return getLanguage(Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Return the language information for a specific script type
+	 * <p>
+	 * Null will be returned if there is no language information for this script
+	 * type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the language information for a specific script type
+	 */
+	public String getLanguage(Document.ScriptType type) {
+		switch (type) {
+		case WESTERN:
+			return mElement.getFoLanguageAttribute();
+		case CJK:
+			return mElement.getStyleLanguageAsianAttribute();
+		case CTL:
+			return mElement.getStyleLanguageComplexAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Set the language information for western characters.
+	 * <p>
+	 * If the parameter <code>language</code> is null, the language information
+	 * for western characters will be removed.
+	 * 
+	 * @param language
+	 *            - the language information
+	 */
+	public void setLanguage(String language) {
+		setLanguage(language, Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Set the language information for a specific script type
+	 * <p>
+	 * The consistency between country and script type is not verified.
+	 * <p>
+	 * If the parameter <code>language</code> is null, the language information
+	 * for this script type will be removed.
+	 * 
+	 * @param language
+	 *            - the language information
+	 * @param type
+	 *            - script type
+	 */
+	public void setLanguage(String language, Document.ScriptType type) {
+		if (language == null) {
+			switch (type) {
+			case WESTERN:
+				mElement.removeAttribute(FoLanguageAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CJK:
+				mElement.removeAttribute(StyleLanguageAsianAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CTL:
+				mElement.removeAttribute(StyleLanguageComplexAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			}
+			return;
+		}
+		switch (type) {
+		case WESTERN:
+			mElement.setFoLanguageAttribute(language);
+			break;
+		case CJK:
+			mElement.setStyleLanguageAsianAttribute(language);
+			break;
+		case CTL:
+			mElement.setStyleLanguageComplexAttribute(language);
+			break;
+		}
+	}
+
+	/**
+	 * Return the country information for western characters.
+	 * <p>
+	 * Null will be returned if there is no country information for western
+	 * characters.
+	 * 
+	 * @return the country information for western characters.
+	 */
+	public String getCountry() {
+		return getCountry(Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Return the country information for a specific script type
+	 * <p>
+	 * Null will be returned if there is no country information for this script
+	 * type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the country information for a specific script type
+	 */
+	public String getCountry(Document.ScriptType type) {
+		switch (type) {
+		case WESTERN:
+			return mElement.getFoCountryAttribute();
+		case CJK:
+			return mElement.getStyleCountryAsianAttribute();
+		case CTL:
+			return mElement.getStyleCountryComplexAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Set the country information for western character.
+	 * <p>
+	 * If the parameter <code>country</code> is null, the country information
+	 * for western character will be removed.
+	 * 
+	 * @param country
+	 *            - the country information
+	 */
+	public void setCountry(String country) {
+		setCountry(country, Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Set the country information for a specific script type.
+	 * <p>
+	 * The consistency between country and script type is not verified.
+	 * <p>
+	 * If the parameter <code>country</code> is null, the country information
+	 * for this script type will be removed.
+	 * 
+	 * @param country
+	 *            - the country information
+	 * @param type
+	 *            - script type
+	 */
+	public void setCountry(String country, Document.ScriptType type) {
+		if (country == null) {
+			switch (type) {
+			case WESTERN:
+				mElement.removeAttribute(FoCountryAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CJK:
+				mElement.removeAttribute(StyleCountryAsianAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CTL:
+				mElement.removeAttribute(StyleCountryComplexAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			}
+			return;
+		}
+		switch (type) {
+		case WESTERN:
+			mElement.setFoCountryAttribute(country);
+			break;
+		case CJK:
+			mElement.setStyleCountryAsianAttribute(country);
+			break;
+		case CTL:
+			mElement.setStyleCountryComplexAttribute(country);
+			break;
+		}
+	}
+
+	/**
+	 * Return the font color.
+	 * <p>
+	 * Null will be returned if there is no font color setting.
+	 * 
+	 * @return the font color
+	 */
+	public Color getFontColor() {
+		String color = mElement.getFoColorAttribute();
+		if (color != null)
+			return Color.valueOf(mElement.getFoColorAttribute());
+		else
+			return null;
+	}
+
+	/**
+	 * Set the font color.
+	 * <p>
+	 * If the parameter <code>fontColor</code> is null, the font color
+	 * definition will be removed.
+	 * 
+	 * @param fontColor
+	 *            - the font color
+	 */
+	public void setFontColor(Color fontColor) {
+		if (fontColor == null)
+			mElement.removeAttribute(FoColorAttribute.ATTRIBUTE_NAME.getQName());
+		else
+			mElement.setFoColorAttribute(fontColor.toString());
+	}
+
+	/**
+	 * Return the font name for western characters.
+	 * <p>
+	 * Null will be returned if there is no font name setting for western
+	 * characters.
+	 * 
+	 * @return the font style for western characters
+	 */
+	public String getFontName() {
+		return mElement.getStyleFontNameAttribute();
+	}
+
+	/**
+	 * Return the font name for a specific script type
+	 * <p>
+	 * Null will be returned if there is no font name setting for this script
+	 * type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font name for a specific script type
+	 */
+	public String getFontName(Document.ScriptType type) {
+		if (type == null)
+			return null;
+		switch (type) {
+		case WESTERN:
+			return mElement.getStyleFontNameAttribute();
+		case CJK:
+			return mElement.getStyleFontNameAsianAttribute();
+		case CTL:
+			return mElement.getStyleFontNameComplexAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Set the font name for western characters.
+	 * <p>
+	 * If the parameter <code>fontName</code> is null, the font name for western
+	 * characters will be removed.
+	 * 
+	 * @param fontName
+	 *            - font name
+	 */
+	public void setFontName(String fontName) {
+		mElement.setStyleFontNameAttribute(fontName);
+	}
+
+	/**
+	 * Set the font name for a specific script type
+	 * <p>
+	 * If the parameter <code>fontName</code> is null, the font name for this
+	 * script type will be removed.
+	 * 
+	 * @param fontName
+	 *            - font name
+	 * @param type
+	 *            - script type
+	 */
+	public void setFontName(String fontName, Document.ScriptType type) {
+		if (fontName == null) {
+			switch (type) {
+			case WESTERN:
+				mElement.removeAttribute(StyleFontNameAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CJK:
+				mElement.removeAttribute(StyleFontNameAsianAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			case CTL:
+				mElement.removeAttribute(StyleFontNameComplexAttribute.ATTRIBUTE_NAME.getQName());
+				break;
+			}
+			return;
+		}
+		switch (type) {
+		case WESTERN:
+			mElement.setStyleFontNameAttribute(fontName);
+			break;
+		case CJK:
+			mElement.setStyleFontNameAsianAttribute(fontName);
+			break;
+		case CTL:
+			mElement.setStyleFontNameComplexAttribute(fontName);
+			break;
+		}
+	}
+
+	/**
+	 * Return the font definition for western characters.
+	 * <p>
+	 * Null will be returned if there is no font definition for western
+	 * characters.
+	 * 
+	 * @return the font definition for western characters
+	 */
+	public Font getFont() {
+		return getFont(Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Return the font definition for a specific script type
+	 * <p>
+	 * Null will be returned if there is no font definition for this script
+	 * type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font definition for a specific script type
+	 */
+	public Font getFont(Document.ScriptType type) {
+		// get Font family name
+		String fontName = getFontName(type);
+		String familyName = null;
+		if (fontName != null)
+			familyName = getFontFamilyNameFromFontName(fontName);
+		else
+			familyName = getFontFamilyName(type);
+		double size = getFontSizeInPoint(type);
+		StyleTypeDefinitions.FontStyle fontStyle = getFontStyle(type);
+		StyleTypeDefinitions.TextLinePosition lineStyle = getTextLineStyle();
+		Font aFont = new Font(familyName, fontStyle, size, lineStyle);
+
+		Color color = getFontColor();
+		// String language = getLanguage(type);
+		// String country = getCountry(type);
+
+		if (color != null)
+			aFont.setColor(color);
+
+		// Commented since 0.3.5 because the font won't contain the language
+		// information
+		// if (language != null && country != null) {
+		// Locale locale = new Locale(language, country);
+		// aFont.setLocale(locale);
+		// }
+		return aFont;
+
+	}
+
+	/**
+	 * Set the font definition for western character.
+	 * <p>
+	 * If the parameter <code>font</code> is null, nothing will be happened.
+	 * 
+	 * @param font
+	 *            - font definition
+	 */
+	public void setFont(Font font) {
+		if (font == null)
+			return;
+
+		setFont(font, Document.ScriptType.WESTERN, null);
+		if (font.getColor() != null)
+			setFontColor(font.getColor());
+	}
+
+	/**
+	 * Set the font definition.
+	 * <p>
+	 * This method can be used to set font for different script type, such as
+	 * western characters, CJK characters, and CTL characters. The second
+	 * parameter will be used to determine the script type.
+	 * <p>
+	 * If the parameter <code>font</code> is null, nothing will be happened.
+	 * 
+	 * @param font
+	 *            - font definition
+	 * @param language
+	 *            - the language
+	 * @see org.odftoolkit.simple.Document.ScriptType
+	 * 
+	 */
+	public void setFont(Font font, Locale language) {
+		if (font == null)
+			return;
+
+		if (language == null) {
+			setFont(font, Document.ScriptType.WESTERN, null);
+		} else
+			setFont(font, Document.getScriptType(language), language);
+		if (font.getColor() != null)
+			setFontColor(font.getColor());
+	}
+
+	/**
+	 * Return the font family name for a specific script type
+	 * <p>
+	 * Null will be returned if there is no font family name definition for this
+	 * script type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font family name for a specific script type
+	 */
+	public String getFontFamilyName(Document.ScriptType type) {
+		switch (type) {
+		case WESTERN:
+			return mElement.getFoFontFamilyAttribute();
+		case CJK:
+			return mElement.getStyleFontFamilyAsianAttribute();
+		case CTL:
+			return mElement.getStyleFontFamilyComplexAttribute();
+		}
+		return null;
+	}
+
+	private String getFontFamilyNameFromFontName(String aFontName) {
+		try {
+			// try if the font has been defined.
+			Document mDocument = ((Document) ((OdfFileDom) mElement.getOwnerDocument()).getDocument());
+			// find <office:font-face-decls> in content dom
+			OdfContentDom contentDom = mDocument.getContentDom();
+			OfficeFontFaceDeclsElement fontfaceDecls = OdfElement.findFirstChildNode(OfficeFontFaceDeclsElement.class,
+					contentDom.getRootElement());
+			if (fontfaceDecls == null) {
+				// find <office:font-face-decls> in style dom
+				OdfStylesDom styleDom = mDocument.getStylesDom();
+				fontfaceDecls = OdfElement.findFirstChildNode(OfficeFontFaceDeclsElement.class, styleDom
+						.getRootElement());
+			}
+			if (fontfaceDecls == null)
+				return null;
+
+			NodeList list = fontfaceDecls.getElementsByTagName("style:font-face");
+			for (int i = 0; i < list.getLength(); i++) {
+				StyleFontFaceElement node = (StyleFontFaceElement) list.item(i);
+				String familyname = node.getSvgFontFamilyAttribute();
+				String fontName = node.getStyleNameAttribute();
+				if (aFontName.equals(fontName)) {
+					return familyname;
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextProperties.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	private String getFontNameFromFamilyName(String aFamilyName) {
+		String aFontName = aFamilyName;
+		boolean duplicated = false;
+		try {
+			// try if the font has been defined.
+			Document mDocument = ((Document) ((OdfFileDom) mElement.getOwnerDocument()).getDocument());
+			// find <office:font-face-decls> in content dom
+			OdfContentDom contentDom = mDocument.getContentDom();
+			OfficeFontFaceDeclsElement fontfaceDecls = OdfElement.findFirstChildNode(OfficeFontFaceDeclsElement.class,
+					contentDom.getRootElement());
+			if (fontfaceDecls == null) {
+				// find <office:font-face-decls> in style dom
+				OdfStylesDom styleDom = mDocument.getStylesDom();
+				fontfaceDecls = OdfElement.findFirstChildNode(OfficeFontFaceDeclsElement.class, styleDom
+						.getRootElement());
+				if (fontfaceDecls == null)
+					fontfaceDecls = contentDom.getRootElement().newOfficeFontFaceDeclsElement();
+			}
+
+			NodeList list = fontfaceDecls.getElementsByTagName("style:font-face");
+			for (int i = 0; i < list.getLength(); i++) {
+				StyleFontFaceElement node = (StyleFontFaceElement) list.item(i);
+				String familyname = node.getSvgFontFamilyAttribute();
+				String fontName = node.getStyleNameAttribute();
+				if (aFamilyName.equals(familyname)) {
+					return fontName;
+				}
+				if (aFontName.equals(fontName)) {
+					duplicated = true;
+				}
+			}
+
+			// Get a font name
+			while (duplicated) {
+				duplicated = false;
+				aFontName = aFontName + "_1";
+				for (int i = 0; i < list.getLength(); i++) {
+					StyleFontFaceElement node = (StyleFontFaceElement) list.item(i);
+					String fontName = node.getStyleNameAttribute();
+					if (aFontName.equals(fontName)) {
+						duplicated = true;
+						break;
+					}
+				}
+			}
+
+			StyleFontFaceElement newfont = fontfaceDecls.newStyleFontFaceElement(aFontName);
+			newfont.setSvgFontFamilyAttribute(aFamilyName);
+			return aFontName;
+		} catch (Exception e) {
+			Logger.getLogger(TextProperties.class.getName()).log(Level.SEVERE,	e.getMessage(), e);
+		}
+		return null;
+
+	}
+
+	private void setFont(Font font, Document.ScriptType type, Locale locale) {
+		// get font name by font family name
+		String fontName = getFontNameFromFamilyName(font.getFamilyName());
+		if (fontName == null)
+			return;
+		font.setFontName(fontName);
+		switch (type) {
+		case WESTERN:
+			setFontName(font.getFontName(), Document.ScriptType.WESTERN);
+			setFontStyle(font.getFontStyle(), Document.ScriptType.WESTERN);
+			setFontSizeInPoint(font.getSize(), Document.ScriptType.WESTERN);
+			if (locale != null) {
+				setLanguage(locale.getLanguage(), Document.ScriptType.WESTERN);
+				setCountry(locale.getCountry(), Document.ScriptType.WESTERN);
+			}
+			break;
+		case CJK:
+			setFontName(font.getFontName(), Document.ScriptType.CJK);
+			setFontStyle(font.getFontStyle(), Document.ScriptType.CJK);
+			setFontSizeInPoint(font.getSize(), Document.ScriptType.CJK);
+			if (locale != null) {
+				setLanguage(locale.getLanguage(), Document.ScriptType.CJK);
+				setCountry(locale.getCountry(), Document.ScriptType.CJK);
+			}
+			break;
+		case CTL:
+			setFontName(font.getFontName(), Document.ScriptType.CTL);
+			setFontStyle(font.getFontStyle(), Document.ScriptType.CTL);
+			setFontSizeInPoint(font.getSize(), Document.ScriptType.CTL);
+			if (locale != null) {
+				setLanguage(locale.getLanguage(), Document.ScriptType.CTL);
+				setCountry(locale.getCountry(), Document.ScriptType.CTL);
+			}
+			break;
+		}
+		setTextLineStyle(font.getTextLinePosition());
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>TextProperties</p> to represent the "style:text-properties" in a style element.
+	 * <p>If there is no "style:text-properties" defined in the style element, a new "style:text-properties" element will be created.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>TextProperties</p>
+	 */
+	public static TextProperties getOrCreateTextProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style.getOrCreatePropertiesElement(OdfStylePropertiesSet.TextProperties);
+		return new TextProperties((StyleTextPropertiesElement) properties);
+	}
+
+	/**
+	 * Return an instance of
+	 * <code>TextProperties</p> to represent the "style:text-properties" in a style element.
+	 * <p>If there is no "style:text-properties" defined in the style element, null will be returned.
+	 * 
+	 * @param style
+	 *            - a style element
+	 * @return an instance of <code>TextProperties</p>;Null if there is no
+	 *         "style:text-properties" defined
+	 */
+	public static TextProperties getTextProperties(OdfStyleBase style) {
+		OdfStylePropertiesBase properties = style.getPropertiesElement(OdfStylePropertiesSet.TextProperties);
+		if (properties != null)
+			return new TextProperties((StyleTextPropertiesElement) properties);
+		else
+			return null;
+	}
+
+	// public void setBackgroundColor(Color bkColor)
+	// {
+	//		
+	// }
+	//	
+	// public Color getBackgroundColor()
+	// {
+	// return null;
+	// }
+	//	
+	// public void setIsShadow(boolean shadow)
+	// {
+	//		
+	// }
+	//	
+	// public boolean isShadow()
+	// {
+	// return false;
+	// }
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/AbstractTableContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/AbstractTableContainer.java
new file mode 100644
index 0000000..c97e6bf
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/AbstractTableContainer.java
@@ -0,0 +1,130 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.w3c.dom.NodeList;
+
+/**
+ * AbstractTableContainer is an abstract implementation of the TableContainer
+ * interface, with a default implementation for every method defined in
+ * TableContainer , except getTableContainerElement(). Each subclass must
+ * implement the abstract method getTableContainerElement().
+ * 
+ * @since 0.4.5
+ */
+public abstract class AbstractTableContainer implements TableContainer {
+
+	private final TableBuilder tableBuilder;
+
+	protected AbstractTableContainer() {
+		tableBuilder = new Table.TableBuilder(this);
+	}
+	
+	/**
+	 * Add a new Table to this container.
+	 * 
+	 * @return added table.
+	 */
+	public Table addTable() {
+		return Table.newTable(this);
+	}
+	
+	/**
+	 * Add a new Table to this container with a specified row number and column
+	 * number.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * 
+	 * @param numRows
+	 *            the row number
+	 * @param numCols
+	 *            the column number
+	 * @return a new instance of <code>Table</code>
+	 */
+	public Table addTable(int numRows, int numCols) {
+		return Table.newTable(this, numRows, numCols);
+	}
+	
+	/**
+	 * Return an instance of table feature with the specific table name.
+	 * 
+	 * @param name
+	 *            of the table beeing searched for.
+	 * @return an instance of table feature with the specific table name.
+	 */
+	public Table getTableByName(String name) {
+		try {
+			OdfElement containerEle = getTableContainerElement();
+			NodeList nodeList = containerEle.getElementsByTagName(TableTableElement.ELEMENT_NAME.getQName());
+			for (int i = 0; i < nodeList.getLength(); i++) {
+				TableTableElement table = (TableTableElement) nodeList.item(i);
+				if (table.getOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.TABLE, "name")).equals(name)) {
+					return getTableBuilder().getTableInstance(table);
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(AbstractTableContainer.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return null;
+	}
+
+	/**
+	 * Return a list of table features in this container.
+	 * 
+	 * @return a list of table features in this container.
+	 */
+	public List<Table> getTableList() {
+		List<Table> tableList = new ArrayList<Table>();
+		try {
+			OdfElement containerEle = getTableContainerElement();
+			NodeList nodeList = containerEle.getElementsByTagName(TableTableElement.ELEMENT_NAME.getQName());
+			for (int i = 0; i < nodeList.getLength(); i++) {
+				tableList.add(getTableBuilder().getTableInstance((TableTableElement) nodeList.item(i)));
+			}
+		} catch (Exception e) {
+			Logger.getLogger(AbstractTableContainer.class.getName()).log(Level.SEVERE, null, e);
+		}
+		return tableList;
+	}
+
+	/**
+	 * Return the table builder of this container. Every container has a table
+	 * builder, which supplies all of the table creation realization, for
+	 * example newTable().
+	 * 
+	 * @return the table builder of this container.
+	 * @since 0.3.5
+	 */
+	public TableBuilder getTableBuilder() {
+		return tableBuilder;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/Cell.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Cell.java
new file mode 100644
index 0000000..d2fb26c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Cell.java
@@ -0,0 +1,2577 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.awt.FontMetrics;
+import java.awt.image.BufferedImage;
+import java.io.InputStream;
+import java.net.URI;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.imageio.ImageIO;
+import javax.swing.JTextField;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoTextAlignAttribute;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberCurrencySymbolElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberNumberElement;
+import org.odftoolkit.odfdom.dom.element.number.NumberTextElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationElement;
+import org.odftoolkit.odfdom.dom.element.table.TableContentValidationsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableHelpMessageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.common.WhitespaceProcessor;
+import org.odftoolkit.simple.draw.FrameContainer;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.draw.Image;
+import org.odftoolkit.simple.style.Border;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalAlignmentType;
+import org.odftoolkit.simple.text.AbstractParagraphContainer;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.ParagraphContainer;
+import org.odftoolkit.simple.text.list.AbstractListContainer;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Cell represents table cell feature in ODF document.
+ * <p>
+ * Table provides methods to get/set/modify the cell content and cell
+ * properties.
+ */
+public class Cell extends Component implements ListContainer, ParagraphContainer, FrameContainer {
+
+	TableTableCellElementBase mCellElement;
+	Document mDocument;
+
+	int mnRepeatedColIndex;
+	int mnRepeatedRowIndex;
+	Table mOwnerTable;
+	String msFormatString;
+	CellStyleHandler mStyleHandler;
+
+	/**
+	 * The default date format of table cell.
+	 */
+	private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+	/**
+	 * The default time format of table cell.
+	 */
+	private static final String DEFAULT_TIME_FORMAT = "'PT'HH'H'mm'M'ss'S'";
+	// example format: 2002-05-30T09:30:10
+	private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
+	/**
+	 * The default cell back color of table cell.
+	 */
+	private static final String DEFAULT_BACKGROUND_COLOR = "#FFFFFF";
+	/**
+	 * The default column spanned number.
+	 */
+	private static final int DEFAULT_COLUMN_SPANNED_NUMBER = 1;
+	/**
+	 * The default row spanned number.
+	 */
+	private static final int DEFAULT_ROW_SPANNED_NUMBER = 1;
+	/**
+	 * The default columns repeated number.
+	 */
+	private static final int DEFAULT_COLUMNS_REPEATED_NUMBER = 1;
+	
+	private ParagraphContainerImpl paragraphContainerImpl;
+	private ListContainerImpl listContainerImpl;
+
+	Cell(TableTableCellElementBase odfElement, int repeatedColIndex, int repeatedRowIndex) {
+		mCellElement = odfElement;
+		mnRepeatedColIndex = repeatedColIndex;
+		mnRepeatedRowIndex = repeatedRowIndex;
+		mOwnerTable = getTable();
+		mDocument = ((Document) ((OdfFileDom) mCellElement.getOwnerDocument()).getDocument());
+		mStyleHandler = new CellStyleHandler(this);
+	}
+
+	/**
+	 * Get the <code>Cell</code> instance from the
+	 * <code>TableTableCellElementBase</code> instance.
+	 * <p>
+	 * Each <code>TableTableCellElementBase</code> instance has a one-to-one
+	 * relationship to the a <code>Cell</code> instance.
+	 * 
+	 * @param cellElement
+	 *            the cell element that need to get the corresponding
+	 *            <code>Cell</code> instance
+	 * @return the <code>Cell</code> instance that represents a specified cell
+	 *         element
+	 */
+	public static Cell getInstance(TableTableCellElementBase cellElement) {
+		TableTableElement tableElement = null;
+		Node node = cellElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				tableElement = (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		Table table = null;
+		if (tableElement != null) {
+			table = Table.getInstance(tableElement);
+		} else {
+			throw new IllegalArgumentException("the cellElement is not in the table dom tree");
+		}
+
+		Cell cell = table.getCellInstance(cellElement, 0, 0);
+		int colRepeatedNum = cell.getColumnsRepeatedNumber();
+		int rowRepeatedNum = cell.getTableRow().getRowsRepeatedNumber();
+		if (colRepeatedNum > 1 && rowRepeatedNum > 1) {
+			if (colRepeatedNum > 1) {
+				Logger
+						.getLogger(Cell.class.getName())
+						.log(Level.WARNING,
+								"the cell has the repeated column number, and puzzled about get which repeated column index of the cell,");
+			}
+			if (rowRepeatedNum > 1) {
+				Logger
+						.getLogger(Cell.class.getName())
+						.log(
+								Level.WARNING,
+								"the row contains the current cell has the repeated row number, and puzzled about get which repeated row index of the cell,");
+			}
+			Logger
+					.getLogger(Cell.class.getName())
+					.log(Level.WARNING,
+							"here just return the first cell that the repeated column index is 0 and repeated row index is 0, too.");
+		}
+		return cell;
+	}
+
+	/**
+	 * Return the horizontal alignment setting of this cell.
+	 * <p>
+	 * The returned value can be "center", "end", "justify", "left", "right", or
+	 * "start". If no horizontal alignment is set, null will be returned.
+	 * 
+	 * @return the horizontal alignment setting.
+	 * 
+	 * @see #getHorizontalAlignmentType()
+	 * @deprecated As of Simple version 0.3, replaced by
+	 *             <code>getHorizontalAlignmentType()</code>
+	 */
+	@Deprecated
+	public String getHorizontalAlignment() {
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForRead();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName
+					.newName(OdfDocumentNamespace.FO, "text-align"));
+			return styleElement.getProperty(property);
+		}
+		return null;
+	}
+
+	/**
+	 * Return the horizontal alignment setting of this cell.
+	 * <p>
+	 * Null will returned if there is no explicit style definition for this
+	 * cell.
+	 * <p>
+	 * Default value will be returned if explicit style definition is found but
+	 * no horizontal alignment is set.
+	 * 
+	 * @return the horizontal alignment setting.
+	 */
+	public HorizontalAlignmentType getHorizontalAlignmentType() {
+		return getStyleHandler().getHorizontalAlignment();
+	}
+
+	/**
+	 * Set the horizontal alignment setting of this cell.
+	 * <p>
+	 * The parameter can be "center", "end", "justify", "left", "right", or
+	 * "start". Actually, "left" will be interpreted as "start", while "right"
+	 * will be interpreted as "end". If argument is null, the explicit
+	 * horizontal alignment setting is removed.
+	 * 
+	 * @param horizontalAlignment
+	 *            the horizontal alignment setting.
+	 * @see #setHorizontalAlignment(StyleTypeDefinitions.HorizontalAlignmentType)
+	 * @deprecated As of Simple version 0.3, replaced by
+	 *             <code>setHorizontalAlignment(SimpleHorizontalAlignmentType)</code>
+	 */
+	@Deprecated
+	public void setHorizontalAlignment(String horizontalAlignment) {
+		if (FoTextAlignAttribute.Value.LEFT.toString().equalsIgnoreCase(horizontalAlignment)) {
+			horizontalAlignment = FoTextAlignAttribute.Value.START.toString();
+		}
+		if (FoTextAlignAttribute.Value.RIGHT.toString().equalsIgnoreCase(horizontalAlignment)) {
+			horizontalAlignment = FoTextAlignAttribute.Value.END.toString();
+		}
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.ParagraphProperties, OdfName
+					.newName(OdfDocumentNamespace.FO, "text-align"));
+			if (horizontalAlignment != null) {
+				styleElement.setProperty(property, horizontalAlignment);
+			} else {
+				styleElement.removeProperty(property);
+			}
+		}
+	}
+
+	/**
+	 * Set the horizontal alignment setting of this cell. If the alignment is
+	 * set as Default, the explicit horizontal alignment setting is removed.
+	 * 
+	 * @param alignType
+	 *            the horizontal alignment setting.
+	 */
+	public void setHorizontalAlignment(HorizontalAlignmentType alignType) {
+		getStyleHandler().setHorizontalAlignment(alignType);
+	}
+
+	/**
+	 * Return the vertical alignment setting of this cell.
+	 * <p>
+	 * The returned value can be "auto", "automatic", "baseline", "bottom",
+	 * "middle", or "top".
+	 * 
+	 * @return the vertical alignment setting of this cell.
+	 * 
+	 * @see #getVerticalAlignmentType()
+	 * @deprecated As of Simple version 0.3, replaced by
+	 *             <code>getVerticalAlignmentType()</code>
+	 */
+	@Deprecated
+	public String getVerticalAlignment() {
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForRead();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName
+					.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+			return styleElement.getProperty(property);
+		}
+		return null;
+	}
+
+	/**
+	 * Return the vertical alignment setting of this cell.
+	 * <p>
+	 * Null will returned if there is no explicit style definition for this
+	 * cell.
+	 * <p>
+	 * Default value will be returned if explicit style definition is found but
+	 * no vertical alignment is set.
+	 * 
+	 * @return the vertical alignment setting.
+	 */
+	public VerticalAlignmentType getVerticalAlignmentType() {
+		return getStyleHandler().getVerticalAlignment();
+	}
+
+	/**
+	 * Set the vertical alignment setting of this cell.
+	 * <p>
+	 * The parameter can be "auto", "automatic", "baseline", "bottom", "middle",
+	 * or "top". If argument is null, the explicit vertical alignment setting is
+	 * removed.
+	 * 
+	 * @param verticalAlignment
+	 *            the vertical alignment setting.
+	 * @see #setVerticalAlignment(StyleTypeDefinitions.VerticalAlignmentType)
+	 * @deprecated As of Simple version 0.3, replaced by
+	 *             <code>setVerticalAlignment(SimpleVerticalAlignmentType)</code>
+	 */
+	@Deprecated
+	public void setVerticalAlignment(String verticalAlignment) {
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty property = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName
+					.newName(OdfDocumentNamespace.STYLE, "vertical-align"));
+			if (verticalAlignment != null) {
+				styleElement.setProperty(property, verticalAlignment);
+			} else {
+				styleElement.removeProperty(property);
+			}
+		}
+	}
+
+	/**
+	 * Set the vertical alignment setting of this cell.
+	 * <p>
+	 * If the alignment is set as Default or null, the explicit vertical
+	 * alignment setting is removed.
+	 * 
+	 * @param verticalAlignment
+	 *            the vertical alignment setting.
+	 */
+	public void setVerticalAlignment(VerticalAlignmentType verticalAlignment) {
+		getStyleHandler().setVerticalAlignment(verticalAlignment);
+	}
+
+	/**
+	 * Return the wrap option of this cell.
+	 * 
+	 * @return true if the cell content can be wrapped;
+	 *         <p>
+	 *         false if the cell content cannot be wrapped.
+	 */
+	public boolean isTextWrapped() {
+		return getStyleHandler().isTextWrapped();
+	}
+
+	/**
+	 * Set the wrap option of this cell.
+	 * 
+	 * @param isTextWrapped
+	 *            whether the cell content can be wrapped or not
+	 */
+	public void setTextWrapped(boolean isTextWrapped) {
+		getStyleHandler().setTextWrapped(isTextWrapped);
+	}
+
+	private TableTableRowElement findRowInTableHeaderRows(TableTableHeaderRowsElement headers, TableTableRowElement tr,
+			int[] indexs) {
+		int result = 0;
+		for (Node m : new DomNodeList(headers.getChildNodes())) {
+			if (m == tr) {
+				indexs[0] = result;
+				return tr;
+			}
+			if (m instanceof TableTableRowElement) {
+				result += ((TableTableRowElement) m).getTableNumberRowsRepeatedAttribute().intValue();
+			}
+		}
+		indexs[0] = result;
+		return null;
+	}
+
+	private TableTableRowElement findRowInTableRows(TableTableRowsElement rows, TableTableRowElement tr, int[] indexs) {
+		int result = 0;
+		for (Node m : new DomNodeList(rows.getChildNodes())) {
+			if (m == tr) {
+				indexs[0] = result;
+				return tr;
+			}
+			if (m instanceof TableTableRowElement) {
+				result += ((TableTableRowElement) m).getTableNumberRowsRepeatedAttribute().intValue();
+			}
+		}
+		indexs[0] = result;
+		return null;
+	}
+
+	private TableTableRowElement findRowInTableRowGroup(OdfElement group, TableTableRowElement tr, int[] indexs) {
+		int result = 0;
+		int[] resultIndexs = new int[1];
+
+		if (!(group instanceof TableTableRowGroupElement) && !(group instanceof TableTableElement)) {
+			indexs[0] = 0;
+			return null;
+		}
+
+		for (Node m : new DomNodeList(group.getChildNodes())) {
+			if (m instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) m;
+				TableTableRowElement returnEle = findRowInTableHeaderRows(headers, tr, resultIndexs);
+				result += resultIndexs[0];
+				if (returnEle != null) {// find
+					indexs[0] = result;
+					return returnEle;
+				}
+			} else if (m instanceof TableTableRowGroupElement) {
+				TableTableRowGroupElement aGroup = (TableTableRowGroupElement) m;
+				TableTableRowElement returnEle = findRowInTableRowGroup(aGroup, tr, resultIndexs);
+				result += resultIndexs[0];
+				if (returnEle != null) {// find
+					indexs[0] = result;
+					return returnEle;
+				}
+			} else if (m instanceof TableTableRowsElement) {
+				TableTableRowsElement rows = (TableTableRowsElement) m;
+				TableTableRowElement returnEle = findRowInTableRows(rows, tr, resultIndexs);
+				result += resultIndexs[0];
+				if (returnEle != null) {// find
+					indexs[0] = result;
+					return returnEle;
+				}
+			} else if (m instanceof TableTableRowElement) {
+				if (m == tr) { // find
+					indexs[0] = result;
+					return tr;
+				}
+				result += ((TableTableRowElement) m).getTableNumberRowsRepeatedAttribute().intValue();
+			}
+		}
+		indexs[0] = result;
+		return null;
+	}
+
+	/**
+	 * Get the index of the table row which contains this cell.
+	 * 
+	 * @return the index of the row containing this cell
+	 */
+	public int getRowIndex() {
+		TableTableElement table = getTableElement();
+		TableTableRowElement tr = getTableRowElement();
+		int[] indexs = new int[1];
+
+		TableTableRowElement returnEle = findRowInTableRowGroup(table, tr, indexs);
+		if (returnEle != null) {
+			return (indexs[0] + mnRepeatedRowIndex);
+		} else {
+			return -1;
+		}
+	}
+
+	/**
+	 * Get an instance of table feature which contains this cell.
+	 * 
+	 * @return the table containing this cell
+	 */
+	public Table getTable() {
+		TableTableElement tableElement = getTableElement();
+		if (tableElement != null) {
+			return Table.getInstance(tableElement);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the index of the table column which contains this cell.
+	 * 
+	 * @return the index of the column containing this cell
+	 */
+	public int getColumnIndex() {
+		TableTableRowElement tr = (TableTableRowElement) mCellElement.getParentNode();
+		int result = 0;
+		for (Node n : new DomNodeList(tr.getChildNodes())) {
+			if (n == mCellElement) {
+				return result + mnRepeatedColIndex;
+			}
+			if (n instanceof TableTableCellElementBase) {
+				result += ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute().intValue();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Get the instance of table column feature which contains this cell.
+	 * 
+	 * @return the instance of table column feature which contains the cell.
+	 */
+	public Column getTableColumn() {
+		Table table = getTable();
+		int index = getColumnIndex();
+		return table.getColumnByIndex(index);
+	}
+
+	TableTableColumnElement getTableColumnElement() {
+		// return OdfTableCellBaseImpl.getTableColumn((OdfTableCellBase)
+		// mCellElement);
+		TableTableElement tableElement = getTableElement();
+		int columnindex = getColumnIndex();
+		Table fTable = Table.getInstance(tableElement);
+		return fTable.getColumnElementByIndex(columnindex);
+	}
+
+	/**
+	 * Get the instance of table row feature which contains this cell.
+	 * 
+	 * @return the instance of table row feature which contains the cell.
+	 */
+	public Row getTableRow() {
+		Table table = getTable();
+		return table.getRowInstance(getTableRowElement(), mnRepeatedRowIndex);
+	}
+
+	private TableTableRowElement getTableRowElement() {
+		Node node = mCellElement.getParentNode();
+		if (node instanceof TableTableRowElement) {
+			return (TableTableRowElement) node;
+		}
+		return null;
+	}
+
+	/**
+	 * Get the table object who contains this cell.
+	 * 
+	 * @return the table object who contains the cell.
+	 */
+	private TableTableElement getTableElement() {
+		Node node = mCellElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				return (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	/**
+	 * Get the cell that covers this cell.
+	 * <p>
+	 * If the cell is a covered cell, the owner cell will be returned; if the
+	 * cell is a real cell , the cell itself will be returned.
+	 * 
+	 * @return the cell that covers the current cell
+	 */
+	public Cell getOwnerTableCell() {
+		Table ownerTable = getTable();
+		List<CellCoverInfo> coverList = ownerTable.getCellCoverInfos(0, 0, ownerTable.getColumnCount() - 1, ownerTable
+				.getRowCount() - 1);
+		return ownerTable.getOwnerCellByPosition(coverList, getColumnIndex(), getRowIndex());
+	}
+
+	/**
+	 * Get the instance of <code>TableTableCellElementBase</code> which
+	 * represents this cell.
+	 * 
+	 * @return the instance of <code>TableTableCellElementBase</code>
+	 */
+	public TableTableCellElementBase getOdfElement() {
+		return mCellElement;
+	}
+
+	/**
+	 * Return the currency code of this cell, for example, "USD", "EUR", "CNY",
+	 * and etc.
+	 * <p>
+	 * If the value type is not "currency", an IllegalArgumentException will be
+	 * thrown.
+	 * 
+	 * @return the currency code
+	 *         <p>
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown if the value type
+	 *             is not "currency".
+	 */
+	public String getCurrencyCode() {
+		if (mCellElement.getOfficeValueTypeAttribute().equals(OfficeValueTypeAttribute.Value.CURRENCY.toString())) {
+			return mCellElement.getOfficeCurrencyAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the currency code of this cell, for example, "USD", "EUR", "CNY", and
+	 * etc.
+	 * 
+	 * @param currency
+	 *            the currency code that need to be set.
+	 * @throws IllegalArgumentException
+	 *             If input <code>currency</code> is null, an
+	 *             IllegalArgumentException will be thrown.
+	 */
+	public void setCurrencyCode(String currency) {
+		if (currency == null) {
+			throw new IllegalArgumentException("Currency code of cell should not be null.");
+		}
+		splitRepeatedCells();
+		if (mCellElement.getOfficeValueTypeAttribute().equals(OfficeValueTypeAttribute.Value.CURRENCY.toString())) {
+			mCellElement.setOfficeCurrencyAttribute(currency);
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	private void setTypeAttr(OfficeValueTypeAttribute.Value type) {
+		mCellElement.setOfficeValueTypeAttribute(type.toString());
+	}
+
+	/**
+	 * Set the value type of this cell. The parameter can be "boolean",
+	 * "currency", "date", "float", "percentage", "string" or "time".
+	 * <p>
+	 * If the parameter <code>type</code> is not a valid cell type, an
+	 * IllegalArgumentException will be thrown.
+	 * 
+	 * @param type
+	 *            the type that need to be set If input type is null, an
+	 *            IllegalArgumentException will be thrown.
+	 */
+	public void setValueType(String type) {
+		if (type == null) {
+			throw new IllegalArgumentException("type shouldn't be null.");
+		}
+		String sType = type.toLowerCase();
+		OfficeValueTypeAttribute.Value value = OfficeValueTypeAttribute.Value.enumValueOf(sType);
+		if (value == null) {
+			throw new IllegalArgumentException("the value type of cell is not valid");
+		}
+
+		mCellElement.setOfficeValueTypeAttribute(sType);
+	}
+
+	/**
+	 * Get the value type of this cell. The returned value can be "boolean",
+	 * "currency", "date", "float", "percentage", "string" or "time". If no
+	 * value type is set, null will be returned.
+	 * 
+	 * @return the type of the cell
+	 */
+	public String getValueType() {
+		return mCellElement.getOfficeValueTypeAttribute();
+	}
+
+	private OfficeValueTypeAttribute.Value getTypeAttr() {
+		String type = mCellElement.getOfficeValueTypeAttribute();
+		return OfficeValueTypeAttribute.Value.enumValueOf(type);
+	}
+
+	/**
+	 * Get the double value of this cell as Double object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "float".
+	 * 
+	 * @return the double value of this cell as a Double object. If the cell
+	 *         value is empty, null will be returned.
+	 *         <p>
+	 *         An IllegalArgumentException will be thrown if the cell type is
+	 *         not "float".
+	 */
+	public Double getDoubleValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.FLOAT) {
+			return mCellElement.getOfficeValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Get the currency value of this cell as Double object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "currency".
+	 * 
+	 * @return the currency value of this cell as a Double object. If the cell
+	 *         value is empty, null will be returned.
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown if the cell type
+	 *             is not "currency".
+	 */
+	public Double getCurrencyValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.CURRENCY) {
+			return mCellElement.getOfficeValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Get the symbol of currency.
+	 * 
+	 * @return the currency symbol
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown if the value type
+	 *             is not "currency".
+	 */
+	public String getCurrencySymbol() {
+		if (getTypeAttr() != OfficeValueTypeAttribute.Value.CURRENCY) {
+			throw new IllegalArgumentException();
+		}
+
+		OdfStyleBase style = getStyleHandler().getStyleElementForRead();
+		if (style != null) {
+			String dataStyleName = style.getOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.STYLE,
+					"data-style-name"));
+			OdfNumberCurrencyStyle dataStyle = mCellElement.getAutomaticStyles().getCurrencyStyle(dataStyleName);
+			if (dataStyle == null) {
+				dataStyle = mDocument.getDocumentStyles().getCurrencyStyle(dataStyleName);
+			}
+			if ((dataStyle != null) && (dataStyle.getCurrencySymbolElement() != null)) {
+				return dataStyle.getCurrencySymbolElement().getTextContent();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Set the value and currency of the cell, and set the value type as
+	 * "currency". If
+	 * <code>value</value> is null, the cell value will be removed.
+	 * 
+	 * @param value
+	 *            the value that will be set
+	 * @param currency
+	 *            the currency that will be set.
+	 * @throws IllegalArgumentException
+	 *             If input currency is null, an IllegalArgumentException will
+	 *             be thrown.
+	 */
+	public void setCurrencyValue(Double value, String currency) {
+		if (currency == null) {
+			throw new IllegalArgumentException("currency shouldn't be null.");
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.CURRENCY);
+		mCellElement.setOfficeValueAttribute(value);
+		mCellElement.setOfficeCurrencyAttribute(currency);
+	}
+
+	/**
+	 * Get the cell percentage value as Double object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "percentage".
+	 * 
+	 * @return the percentage value of this cell as a Double object. If the cell
+	 *         value is empty, null will be returned.
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown if the cell type
+	 *             is not "percentage".
+	 */
+	public Double getPercentageValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			return mCellElement.getOfficeValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a percentage value and set the value type as
+	 * percentage too. If
+	 * <code>value</value> is null, the cell value will be removed.
+	 * 
+	 * @param value
+	 *            the value that will be set
+	 */
+	public void setPercentageValue(Double value) {
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.PERCENTAGE);
+		mCellElement.setOfficeValueAttribute(value);
+	}
+
+	/**
+	 * Get the text displayed in this cell.
+	 * 
+	 * @return the text displayed in this cell
+	 */
+	public String getDisplayText() {
+		// TODO: This function doesn't work well if a cell contains a list.
+		// Refer to testGetSetTextValue();
+		return TextExtractor.getText(mCellElement);
+	}
+
+	/**
+	 * Set the text displayed in this cell. If content is null, it will display
+	 * the empty string instead.
+	 * <p>
+	 * Please note the displayed text in ODF viewer might be different with the
+	 * value set by this method, because the displayed text in ODF viewer is
+	 * calculated and set by editor. So an adapter can be assigned to adapt cell
+	 * value and value type.
+	 * 
+	 * @param content
+	 *            the displayed text.
+	 * @param adapter
+	 *            the <code>CellValueAdapter</code> used to adapt cell value and
+	 *            value type.
+	 * 
+	 * @see org.odftoolkit.simple.table.CellValueAdapter
+	 * @since 0.3
+	 */
+	public void setDisplayText(String content, CellValueAdapter adapter) {
+		if (content == null) {
+			content = "";
+		}
+		setDisplayTextContent(content, null);
+		// adapt value and value type by display text.
+		adapter.adaptValue(this, content);
+	}
+
+	/**
+	 * Set the text displayed in this cell. If content is null, it will display
+	 * the empty string instead.
+	 * <p>
+	 * Please note the displayed text in ODF viewer might be different with the
+	 * value set by this method, because the displayed text in ODF viewer is
+	 * calculated and set by editor. The cell value and value type will be
+	 * updated follow by the rules which are designed in the
+	 * {@link org.odftoolkit.simple.table.DefaultCellValueAdapter
+	 * <code>DefaultCellValueAdapter</code>}.
+	 * 
+	 * @param content
+	 *            the displayed text.
+	 * 
+	 * @see org.odftoolkit.simple.table.CellValueAdapter
+	 * @see org.odftoolkit.simple.table.DefaultCellValueAdapter
+	 */
+	public void setDisplayText(String content) {
+		setDisplayText(content, CellValueAdapter.DEFAULT_VALUE_ADAPTER);
+	}
+
+	/**
+	 * Set the text displayed in this cell, with a specified style name.
+	 * <p>
+	 * Please note the displayed text in ODF viewer might be different with the
+	 * value set by this method, because the displayed text in ODF viewer is
+	 * calculated and set by editor. So an adapter can be assigned to adapt cell
+	 * value and value type.
+	 * 
+	 * @param content
+	 *            the displayed text. If content is null, it will display the
+	 *            empty string instead.
+	 * @param adapter
+	 *            the <code>CellValueAdapter</code> used to adapt cell value and
+	 *            value type.
+	 * @param stylename
+	 *            the style name. If style name is null, the content will use
+	 *            the default paragraph style.
+	 * 
+	 * @see org.odftoolkit.simple.table.CellValueAdapter
+	 * @since 0.3
+	 */
+	public void setDisplayText(String content, CellValueAdapter adapter, String stylename) {
+		if (content == null) {
+			content = "";
+		}
+		setDisplayTextContent(content, stylename);
+		// adapt value and value type by display text.
+		adapter.adaptValue(this, content);
+	}
+
+	/**
+	 * Set the text displayed in this cell, with a specified style name.
+	 * <p>
+	 * Please note the displayed text in ODF viewer might be different with the
+	 * value set by this method, because the displayed text in ODF viewer is
+	 * calculated and set by editor. The cell value and value type will be
+	 * updated follow by the rules which are designed in the
+	 * {@link org.odftoolkit.simple.table.DefaultCellValueAdapter
+	 * <code>DefaultCellValueAdapter</code>}.
+	 * 
+	 * @param content
+	 *            the displayed text. If content is null, it will display the
+	 *            empty string instead.
+	 * @param stylename
+	 *            the style name. If style name is null, the content will use
+	 *            the default paragraph style.
+	 * 
+	 * @see org.odftoolkit.simple.table.CellValueAdapter
+	 * @see org.odftoolkit.simple.table.DefaultCellValueAdapter
+	 */
+	public void setDisplayText(String content, String stylename) {
+		setDisplayText(content, CellValueAdapter.DEFAULT_VALUE_ADAPTER, stylename);
+	}
+
+	// Set the text content in this cell. If content is null, it will display
+	// the empty string instead.
+	private void setDisplayTextContent(String content, String stylename) {
+		WhitespaceProcessor textProcessor = new WhitespaceProcessor();
+		OdfStylableElement element = OdfElement.findFirstChildNode(OdfTextParagraph.class, mCellElement);
+		if (element == null) {
+			removeContent();
+			element = new OdfTextParagraph((OdfFileDom) mCellElement.getOwnerDocument());
+			mCellElement.appendChild(element);
+		} else {
+			String formerContent = element.getTextContent();
+			while (formerContent == null || "".equals(formerContent)) {
+				OdfTextSpan span = OdfElement.findFirstChildNode(OdfTextSpan.class, element);
+				if (span == null) {
+					break;
+				}
+				formerContent = span.getTextContent();
+				element = span;
+			}
+		}
+		if ((stylename != null) && (stylename.length() > 0)) {
+			element.setStyleName(stylename);
+		}
+		element.setTextContent(null);
+		textProcessor.append(element, content);
+		optimizeCellSize(content);
+	}
+
+	/**
+	 * Set the cell value as a double and set the value type to be "float".
+	 * 
+	 * @param value
+	 *            the double value that will be set. If
+	 *            <code>value</value> is null, the cell value will be removed.
+	 */
+	public void setDoubleValue(Double value) {
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.FLOAT);
+		mCellElement.setOfficeValueAttribute(value);
+		setDisplayTextContent(value + "", null);
+	}
+
+	/**
+	 * Get the cell boolean value as Boolean object.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "boolean".
+	 * 
+	 * @return the Boolean value of cell. If the cell value is empty, null will
+	 *         be returned.
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown if the cell type
+	 *             is not "boolean".
+	 */
+	public Boolean getBooleanValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.BOOLEAN) {
+			return mCellElement.getOfficeBooleanValueAttribute();
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a boolean and set the value type to be boolean. If
+	 * <code>value</value> is null, the cell value will be removed.
+	 * 
+	 * @param value
+	 *            the value of boolean type
+	 */
+	public void setBooleanValue(Boolean value) {
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.BOOLEAN);
+		mCellElement.setOfficeBooleanValueAttribute(value);
+		setDisplayTextContent(value + "", null);
+	}
+
+	/**
+	 * Get the cell date value as Calendar.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "date".
+	 * 
+	 * @return the Calendar value of cell
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown, if the cell type
+	 *             is not "date".
+	 */
+	public Calendar getDateValue() {
+		return getOfficeDateValue(DEFAULT_DATE_FORMAT);
+	}
+	
+	/**
+	 * Get the cell date time value (date and time) as Calendar.
+	 * <p>
+	 * Throw IllegalArgumentException if the cell type is not "date".
+	 * 
+	 * @return the Calendar value of cell
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown, if the cell type
+	 *             is not "date".
+	 */
+	public Calendar getDateTimeValue() {
+		return getOfficeDateValue(DEFAULT_DATE_TIME_FORMAT);
+	}
+	
+	private Calendar getOfficeDateValue(String pattern) {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.DATE) {
+			String dateStr = mCellElement.getOfficeDateValueAttribute();
+			if (dateStr == null) {
+				return null;
+			}
+			Date date = parseString(dateStr, pattern);
+			Calendar calender = Calendar.getInstance();
+			calender.setTime(date);
+			return calender;
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a date, and set the value type to be "date".
+	 * 
+	 * @param date
+	 *            the value of {@link java.util.Calendar java.util.Calendar}
+	 *            type.
+	 */
+	public void setDateValue(Calendar date) {
+		setOfficeDateValue(date, DEFAULT_DATE_FORMAT);
+	}
+	
+	/**
+	 * Sets the cell value as a date with second precision and the value type to be "date".
+	 * @param date 
+	 */
+	public void setDateTimeValue(Calendar date) {
+		setOfficeDateValue(date, DEFAULT_DATE_TIME_FORMAT);
+	}
+
+	private void setOfficeDateValue(Calendar date, String pattern) {
+		if (date == null) {
+			throw new IllegalArgumentException("date shouldn't be null.");
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.DATE);
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(pattern);
+		String svalue = simpleFormat.format(date.getTime());
+		mCellElement.setOfficeDateValueAttribute(svalue);
+		setDisplayTextContent(svalue, null);
+	}
+	
+	/**
+	 * Set the cell style name. When lots of cells have the same style features,
+	 * the user can configuration the first one and set the other's style name
+	 * directly. That will improve the performance.
+	 * 
+	 * @param styleName
+	 *            an exit cell style name.
+	 * @since 0.4
+	 */
+	public void setCellStyleName(String styleName) {
+		mCellElement.setStyleName(styleName);
+	}
+
+	/**
+	 * Get the cell style name.
+	 * 
+	 * @return cell style name.
+	 * @since 0.4
+	 */
+	public String getCellStyleName() {
+		return mCellElement.getStyleName();
+	}
+
+	/**
+	 * Set the cell value as a string, and set the value type to be string.
+	 * 
+	 * @param str
+	 *            the value of string type. If input string is null, an empty
+	 *            string will be set.
+	 */
+	public void setStringValue(String str) {
+		if (str == null) {
+			str = "";
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.STRING);
+		mCellElement.setOfficeStringValueAttribute(str);
+		setDisplayTextContent(str, null);
+	}
+
+	// Note: if you want to change the cell
+	// splitRepeatedCells must be called first in order to
+	// 1. update parent row if the row is the repeated rows.
+	// 2. update the cell itself if the cell is the column repeated cells.
+	void splitRepeatedCells() {
+		Table table = getTable();
+		TableTableRowElement ownerRowElement = getTableRowElement();
+		// 1.if the parent row is the repeated row
+		// the repeated row has to be separated
+		// after this the cell element and repeated index will be updated
+		// according to the new parent row
+		Row ownerRow = table.getRowInstance(ownerRowElement, mnRepeatedRowIndex);
+		if (ownerRow.getRowsRepeatedNumber() > 1) {
+			ownerRow.splitRepeatedRows();
+			// update row element, new row element maybe created.
+			ownerRowElement = ownerRow.maRowElement;
+			mnRepeatedRowIndex = 0;
+		}
+		// 2.if the cell is the column repeated cell
+		// this repeated cell has to be separated
+		int repeateNum = getColumnsRepeatedNumber();
+		if (repeateNum > 1) {
+			// change this repeated cell to three parts: repeated cell before,
+			// new single cell and repeated cell after.
+			Map<TableTableCellElementBase, Vector<Cell>> cellRepository = table.mCellRepository;
+			String tableNamespaceURI = OdfDocumentNamespace.TABLE.getUri();
+			Vector<Cell> oldList = null;
+			if (cellRepository.containsKey(mCellElement)) {
+				oldList = cellRepository.remove(mCellElement);
+			}
+			int offetAfterCurrentCell = repeateNum - mnRepeatedColIndex - 1;
+			TableTableCellElementBase currentCellElement = mCellElement;
+			TableTableCellElementBase newBeforeCellElement = null;
+			TableTableCellElementBase newAfterCellElement = null;
+			if (mnRepeatedColIndex > 0) {
+				newBeforeCellElement = (TableTableCellElementBase) mCellElement.cloneNode(true);
+				if (mnRepeatedColIndex > 1) {
+					newBeforeCellElement.setTableNumberColumnsRepeatedAttribute(mnRepeatedColIndex);
+				} else {
+					newBeforeCellElement.removeAttributeNS(tableNamespaceURI, "number-columns-repeated");
+				}
+				// insert new before repeated cell
+				ownerRowElement.insertBefore(newBeforeCellElement, currentCellElement);
+				// update cell cache
+				if (oldList != null) {
+					Vector<Cell> newBeforeList = new Vector<Cell>(mnRepeatedColIndex);
+					for (int i = 0; i < mnRepeatedColIndex && i < oldList.size(); i++) {
+						Cell beforeCell = oldList.get(i);
+						if (beforeCell != null) {
+							beforeCell.mCellElement = newBeforeCellElement;
+							newBeforeList.add(i, beforeCell);
+						}
+					}
+					cellRepository.put(newBeforeCellElement, newBeforeList);
+				}
+			}
+			currentCellElement.removeAttributeNS(tableNamespaceURI, "number-columns-repeated");
+			if (offetAfterCurrentCell > 0) {
+				newAfterCellElement = (TableTableCellElementBase) currentCellElement.cloneNode(true);
+				ownerRowElement.insertBefore(newAfterCellElement, currentCellElement);
+				currentCellElement = newAfterCellElement;
+				newAfterCellElement = (TableTableCellElementBase) currentCellElement.getNextSibling();
+				if (offetAfterCurrentCell > 1) {
+					newAfterCellElement.setTableNumberColumnsRepeatedAttribute(offetAfterCurrentCell);
+				}
+				// update cell cache
+				if (oldList != null) {
+					Vector<Cell> newAfterList = new Vector<Cell>(offetAfterCurrentCell);
+					for (int i = mnRepeatedColIndex + 1; i < repeateNum && i < oldList.size(); i++) {
+						Cell afterCell = oldList.get(i);
+						if (afterCell != null) {
+							afterCell.mCellElement = newAfterCellElement;
+							afterCell.mnRepeatedColIndex = i - mnRepeatedColIndex - 1;
+							newAfterList.add(afterCell.mnRepeatedColIndex, afterCell);
+						}
+					}
+					cellRepository.put(newAfterCellElement, newAfterList);
+				}
+			}
+			mnRepeatedColIndex = 0;
+			mCellElement = currentCellElement;
+			// update cell cache
+			Vector<Cell> currentList = new Vector<Cell>(1);
+			currentList.add(0, this);
+			cellRepository.put(currentCellElement, currentList);
+		}
+	}
+
+	/**
+	 * Get the cell value as a string.
+	 * <p>
+	 * If the cell type is not string, the display text will be returned.
+	 * 
+	 * @return the string value of this cell, or the display text
+	 */
+	public String getStringValue() {
+		return getDisplayText();
+	}
+
+	/**
+	 * Get the cell value as {@link java.util.Calendar java.util.Calendar}.
+	 * <p>
+	 * Throw exception if the cell type is not "time".
+	 * 
+	 * @return the Calendar value of cell
+	 * @throws IllegalArgumentException
+	 *             an IllegalArgumentException will be thrown if the cell type
+	 *             is not time.
+	 */
+	public Calendar getTimeValue() {
+		if (getTypeAttr() == OfficeValueTypeAttribute.Value.TIME) {
+			String timeStr = mCellElement.getOfficeTimeValueAttribute();
+                        if (timeStr == null) {
+                            return null;
+                        }
+			Date date = parseString(timeStr, DEFAULT_TIME_FORMAT);
+			Calendar calender = Calendar.getInstance();
+			calender.setTime(date);
+			calender.clear(Calendar.YEAR);
+			calender.clear(Calendar.MONTH);
+			calender.clear(Calendar.DAY_OF_MONTH);
+			return calender;
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the cell value as a time and set the value type to be "time" too.
+	 * 
+	 * @param time
+	 *            the value of {@link java.util.Calendar java.util.Calendar}
+	 *            type.
+	 * @throws IllegalArgumentException
+	 *             If input time is null, an IllegalArgumentException exception
+	 *             will be thrown.
+	 */
+	public void setTimeValue(Calendar time) {
+		if (time == null) {
+			throw new IllegalArgumentException("time shouldn't be null.");
+		}
+		splitRepeatedCells();
+		setTypeAttr(OfficeValueTypeAttribute.Value.TIME);
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
+		String svalue = simpleFormat.format(time.getTime());
+		mCellElement.setOfficeTimeValueAttribute(svalue);
+		setDisplayTextContent(svalue, null);
+	}
+
+	private Date parseString(String value, String format) {
+		SimpleDateFormat simpleFormat = new SimpleDateFormat(format);
+		Date simpleDate = null;
+		try {
+			simpleDate = simpleFormat.parse(value);
+		} catch (ParseException e) {
+			Logger.getLogger(Cell.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			return null;
+		}
+		return simpleDate;
+	}
+
+	/**
+	 * Get the background color of this cell.
+	 * <p>
+	 * If no background color is set, default background color "#FFFFFF" will be
+	 * returned.
+	 * 
+	 * @return the background color of this cell
+	 */
+	public Color getCellBackgroundColor() {
+		return getStyleHandler().getBackgroundColor();
+	}
+
+	/**
+	 * Get the background color string of this cell.
+	 * <p>
+	 * If no background color is set, default background color "#FFFFFF" will be
+	 * returned.
+	 * 
+	 * @return the background color of this cell
+	 * 
+	 * @see #getCellBackgroundColor()
+	 * @deprecated As of Simple version 0.3, replaced by
+	 *             <code>getCellBackgroundColor()</code>
+	 */
+	@Deprecated
+	public String getCellBackgroundColorString() {
+		String color = DEFAULT_BACKGROUND_COLOR;
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForRead();
+		if (styleElement != null) {
+			OdfStyleProperty bkColorProperty = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName
+					.newName(OdfDocumentNamespace.FO, "background-color"));
+			String property = styleElement.getProperty(bkColorProperty);
+			if (Color.isValid(property)) {
+				color = property;
+			}
+		}
+		return color;
+	}
+
+	/**
+	 * Set the background color of this cell.
+	 * 
+	 * @param cellBackgroundColor
+	 *            the background color that need to set. If
+	 *            <code>cellBackgroundColor</code> is null, default background
+	 *            color <code>Color.WHITE</code> will be set.
+	 */
+	public void setCellBackgroundColor(Color cellBackgroundColor) {
+		getStyleHandler().setBackgroundColor(cellBackgroundColor);
+	}
+
+	/**
+	 * Set the background color of this cell using string. The string must be a
+	 * valid argument for constructing {@link org.odftoolkit.odfdom.type.Color
+	 * <code>org.odftoolkit.odfdom.type.Color</code>}.
+	 * 
+	 * @param cellBackgroundColor
+	 *            the background color that need to set. If cellBackgroundColor
+	 *            is null, default background color #FFFFFF will be set.
+	 * @see org.odftoolkit.odfdom.type.Color
+	 * @see #setCellBackgroundColor(Color)
+	 * @deprecated As of Simple version 0.3, replaced by
+	 *             <code>setCellBackgroundColor(Color)</code>
+	 */
+	@Deprecated
+	public void setCellBackgroundColor(String cellBackgroundColor) {
+		if (!Color.isValid(cellBackgroundColor)) {
+			Logger.getLogger(Cell.class.getName()).log(Level.WARNING,
+					"Parameter is invalid for datatype Color, default background color #FFFFFF will be set.");
+			cellBackgroundColor = DEFAULT_BACKGROUND_COLOR;
+		}
+		splitRepeatedCells();
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForWrite();
+		if (styleElement != null) {
+			OdfStyleProperty bkColorProperty = OdfStyleProperty.get(OdfStylePropertiesSet.TableCellProperties, OdfName
+					.newName(OdfDocumentNamespace.FO, "background-color"));
+			styleElement.setProperty(bkColorProperty, cellBackgroundColor);
+		}
+	}
+
+	/**
+	 * Get the column spanned number of this cell.
+	 * 
+	 * @return the column spanned number
+	 */
+	public int getColumnSpannedNumber() {
+		if (mCellElement instanceof TableCoveredTableCellElement) {
+			return 1;
+		}
+		Integer value = ((TableTableCellElement) mCellElement).getTableNumberColumnsSpannedAttribute();
+		if (value != null) {
+			return value.intValue();
+		}
+		return DEFAULT_COLUMN_SPANNED_NUMBER;
+	}
+
+	/**
+	 * Get the column repeated number of this cell.
+	 * 
+	 * @return the column repeated number
+	 */
+	int getColumnsRepeatedNumber() {
+		Integer value = mCellElement.getTableNumberColumnsRepeatedAttribute();
+		if (value != null) {
+			return value.intValue();
+		}
+		return DEFAULT_COLUMNS_REPEATED_NUMBER;
+	}
+
+	/**
+	 * Get the row spanned number of this cell.
+	 * 
+	 * @return the row spanned number
+	 */
+	public int getRowSpannedNumber() {
+		if (mCellElement instanceof TableCoveredTableCellElement) {
+			return 1;
+		}
+		Integer value = ((TableTableCellElement) mCellElement).getTableNumberRowsSpannedAttribute();
+		if (value != null) {
+			return value.intValue();
+		}
+		return DEFAULT_ROW_SPANNED_NUMBER;
+	}
+
+	/**
+	 * Set the column spanned number.
+	 * 
+	 * @param spannedNum
+	 *            the column spanned number to be set. If spannedNum is less
+	 *            than 1, default column spanned number 1 will be set.
+	 */
+	void setColumnSpannedNumber(int spannedNum) {
+		if (spannedNum < 1) {
+			spannedNum = DEFAULT_COLUMN_SPANNED_NUMBER;
+		}
+		splitRepeatedCells();
+		if (mCellElement instanceof TableTableCellElement) {
+			((TableTableCellElement) mCellElement).setTableNumberColumnsSpannedAttribute(new Integer(spannedNum));
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Set the column repeated number.
+	 * 
+	 * @param repeatedNum
+	 *            the column repeated number that need to be set. If repeatedNum
+	 *            is less than 1, default columns repeated number 1 will be set.
+	 */
+	void setColumnsRepeatedNumber(int repeatedNum) {
+		if (repeatedNum < 1) {
+			repeatedNum = DEFAULT_COLUMNS_REPEATED_NUMBER;
+		}
+		mCellElement.setTableNumberColumnsRepeatedAttribute(new Integer(repeatedNum));
+	}
+
+	/**
+	 * Set the row spanned number.
+	 * 
+	 * @param spannedNum
+	 *            row spanned number that need to be set the row spanned number
+	 *            that need to be set. If spannedNum is less than 1, default row
+	 *            spanned number 1 will be set.
+	 */
+	void setRowSpannedNumber(int spannedNum) {
+		if (spannedNum < 1) {
+			spannedNum = DEFAULT_ROW_SPANNED_NUMBER;
+		}
+		splitRepeatedCells();
+		if (mCellElement instanceof TableTableCellElement) {
+			((TableTableCellElement) mCellElement).setTableNumberRowsSpannedAttribute(new Integer(spannedNum));
+		} else {
+			throw new IllegalArgumentException();
+		}
+	}
+
+	/**
+	 * Judge if the ODF DOM element of this cell is the covered cell element.
+	 * 
+	 * @return true if the Odf element is TableCoveredTableCellElement
+	 */
+	boolean isCoveredElement() {
+		if (mCellElement instanceof TableCoveredTableCellElement) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Get the style name of this cell.
+	 * 
+	 * @return the name of the style
+	 */
+	public String getStyleName() {
+		OdfStyleBase style = getStyleHandler().getStyleElementForRead();
+		if (style == null) {
+			return "";
+		}
+		if (style instanceof OdfStyle)
+			return ((OdfStyle) style).getStyleNameAttribute();
+		else
+			return "";
+	}
+
+	/**
+	 * Set a formula to the cell.
+	 * <p>
+	 * Please note, the parameter <code>formula</code> will not be checked and
+	 * interpreted; the cell value will not be calculated. It's just simply set
+	 * as a formula attribute.
+	 * 
+	 * @param formula
+	 *            the formula that need to be set.
+	 * @see org.odftoolkit.odfdom.dom.attribute.table.TableFormulaAttribute
+	 * @throws IllegalArgumentException
+	 *             if formula is null, an IllegalArgumentException will be
+	 *             thrown.
+	 */
+	public void setFormula(String formula) {
+		if (formula == null) {
+			throw new IllegalArgumentException("formula shouldn't be null.");
+		}
+		splitRepeatedCells();
+		mCellElement.setTableFormulaAttribute(formula);
+	}
+
+	/**
+	 * Get the formula string of the cell.
+	 * 
+	 * @return the formula representation of the cell
+	 *         <p>
+	 *         If the cell does not contain a formula, null will be returned.
+	 * 
+	 */
+	public String getFormula() {
+		return mCellElement.getTableFormulaAttribute();
+	}
+
+	// /**
+	// * get the error value of the cell
+	// * if the formula can not be calculated, an error will be set
+	// * @return
+	// * return 0 if the cell has no error
+	// * return the error value of the cell if the formula result can not be
+	// calculated
+	// * such as divided by 0
+	// */
+	// public long getError()
+	// {
+	// return 0;
+	// }
+	/**
+	 * Set the currency symbol and overall format of a currency cell.
+	 * <p>
+	 * Please note the overall format includes the symbol character, for
+	 * example: $#,##0.00.
+	 * <p>
+	 * This function only works for currency.
+	 * 
+	 * @param currencySymbol
+	 *            the currency symbol
+	 * @param format
+	 *            overall format
+	 * @throws IllegalArgumentException
+	 *             if input currencySymbol or format is null, an
+	 *             IllegalArgumentException will be thrown.
+	 */
+	public void setCurrencyFormat(String currencySymbol, String format) {
+		if (currencySymbol == null) {
+			throw new IllegalArgumentException("currencySymbol shouldn't be null.");
+		}
+		if (format == null) {
+			throw new IllegalArgumentException("format shouldn't be null.");
+		}
+		splitRepeatedCells();
+		String type = mCellElement.getOfficeValueTypeAttribute();
+		OfficeValueTypeAttribute.Value typeValue = null;
+		msFormatString = format;
+		if (type != null) {
+			typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		}
+
+		if (typeValue != OfficeValueTypeAttribute.Value.CURRENCY) {
+			throw new IllegalArgumentException();
+		}
+
+		OdfNumberCurrencyStyle currencyStyle = new OdfNumberCurrencyStyle((OdfFileDom) mCellElement.getOwnerDocument(),
+				currencySymbol, format, getUniqueCurrencyStyleName());
+		mCellElement.getAutomaticStyles().appendChild(currencyStyle);
+		setDataDisplayStyleName(currencyStyle.getStyleNameAttribute());
+		Double value = getCurrencyValue();
+
+		// set display text
+		if (value != null) {
+			setDisplayTextContent(formatCurrency(currencyStyle, value.doubleValue()), null);
+		}
+	}
+
+	// This method doesn't handle style:map element.
+	private String formatCurrency(OdfNumberCurrencyStyle currencyStyle, double value) {
+		String valuestr = "";
+		for (Node m : new DomNodeList(currencyStyle.getChildNodes())) {
+			if (m instanceof NumberCurrencySymbolElement) {
+				valuestr += m.getTextContent();
+			} else if (m instanceof NumberNumberElement) {
+				String numberformat = currencyStyle.getNumberFormat();
+				valuestr += (new DecimalFormat(numberformat)).format(value);
+			} else if (m instanceof NumberTextElement) {
+				String textcontent = m.getTextContent();
+				if (textcontent == null || textcontent.length() == 0) {
+					textcontent = " ";
+				}
+				valuestr += textcontent;
+			}
+		}
+		return valuestr;
+	}
+
+/**
+	 * Set the format string of the cell.
+	 * <p>
+	 * This function only works for float, date, time and percentage, otherwise an
+	 * {@link java.lang.IllegalArgumentException} will be thrown. 
+	 * <p>
+	 * For value type float and percentage, the <code>formatStr</code> must follow the encoding 
+	 * rule of {@link java.text.DecimalFormat <code>java.text.DecimalFormat</code>}.
+	 * For value type date and time, the <code>formatStr</code> must follow the encoding 
+	 * rule of {@link java.text.SimpleDateFormat <code>java.text.SimpleDateFormat</code>}.
+	 * <p>
+	 * Refer to {@link org.odftoolkit.simple.table.Cell#setCurrencyFormat <code>setCurrencyFormat</code>} to set the format of currency.
+	 * <p>
+	 * If the cell value type is not set, the method will try to give it a value type, according 
+	 * to common ordination. The adapt order is: percentage-> time-> date-> float.
+	 * <blockquote>
+	 * <table border=0 cellspacing=3 cellpadding=0 summary="Chart showing ValueType, Distinguish Symbol
+	 * and Distinguish Priority.">
+	 *     <tr bgcolor="#ccccff">
+	 *          <th align=left>ValueType
+	 *          <th align=left>Distinguish Symbol
+	 *          <th align=left>Distinguish Priority
+	 *     <tr valign=top>
+	 *          <td>percentage
+	 *          <td>%
+	 *          <td>1
+	 *     <tr valign=top>
+	 *          <td>time
+	 *          <td>H, k, m, s, S
+	 *          <td>2
+	 *     <tr valign=top>
+	 *          <td>date
+	 *          <td>y, M, w, W, D, d, F, E, K, h
+	 *          <td>3
+	 *     <tr valign=top>
+	 *          <td>float
+	 *          <td>#, 0
+	 *          <td>4
+	 * </table>
+	 * </blockquote>
+	 * The adapt result may be inaccurate, so you'd better set value type before call this method. 
+	 * If adaptive failed, an {@link java.lang.UnsupportedOperationException} will be thrown.
+	 * <p>
+	 * @param formatStr	the cell need be formatted as this specified format string.
+	 * @throws IllegalArgumentException if <code>formatStr</code> is null or the cell value type is supported.
+	 * @throws UnsupportedOperationException if the adaptive failed, when cell value type is not set.
+	 * @see java.text.SimpleDateFormat
+	 * @see java.text.DecimalFormat
+	 */
+	public void setFormatString(String formatStr) {
+		if (formatStr == null) {
+			throw new IllegalArgumentException("formatStr shouldn't be null.");
+		}
+		String type = getValueType();
+		if (type == null) {
+			if (formatStr.contains("%")) {
+				setValueType("percentage");
+			} else if (formatStr.contains("H") || formatStr.contains("k") || formatStr.contains("m")
+					|| formatStr.contains("s") || formatStr.contains("S")) {
+				setValueType("time");
+			} else if (formatStr.contains("y") || formatStr.contains("M") || formatStr.contains("w")
+					|| formatStr.contains("W") || formatStr.contains("D") || formatStr.contains("d")
+					|| formatStr.contains("F") || formatStr.contains("E") || formatStr.contains("K")
+					|| formatStr.contains("h")) {
+				setValueType("date");
+			} else if (formatStr.contains("#") || formatStr.contains("0")) {
+				setValueType("float");
+			} else {
+				throw new UnsupportedOperationException("format string: " + formatStr
+						+ " can't be adapted to a possible value type.");
+			}
+			type = getValueType();
+		}
+		setCellFormatString(formatStr, type);
+	}
+
+	private void setCellFormatString(String formatStr, String type) {
+		OfficeValueTypeAttribute.Value typeValue = null;
+		msFormatString = formatStr;
+		splitRepeatedCells();
+		typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		if (typeValue == OfficeValueTypeAttribute.Value.FLOAT) {
+			OdfNumberStyle numberStyle = new OdfNumberStyle((OdfFileDom) mCellElement.getOwnerDocument(), formatStr,
+					getUniqueNumberStyleName());
+			mCellElement.getAutomaticStyles().appendChild(numberStyle);
+			setDataDisplayStyleName(numberStyle.getStyleNameAttribute());
+			Double value = getDoubleValue();
+			if (value != null) {
+				setDisplayTextContent((new DecimalFormat(formatStr)).format(value.doubleValue()), null);
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.DATE) {
+			OdfNumberDateStyle dateStyle = new OdfNumberDateStyle((OdfFileDom) mCellElement.getOwnerDocument(),
+					formatStr, getUniqueDateStyleName(), null);
+			mCellElement.getAutomaticStyles().appendChild(dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+			String dateStr = mCellElement.getOfficeDateValueAttribute();
+			if (dateStr != null) {
+				Calendar date = getDateValue();
+				setDisplayTextContent((new SimpleDateFormat(formatStr)).format(date.getTime()), null);
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.TIME) {
+			OdfNumberTimeStyle timeStyle = new OdfNumberTimeStyle((OdfFileDom) mCellElement.getOwnerDocument(),
+					formatStr, getUniqueDateStyleName());
+			mCellElement.getAutomaticStyles().appendChild(timeStyle);
+			setDataDisplayStyleName(timeStyle.getStyleNameAttribute());
+			String timeStr = mCellElement.getOfficeTimeValueAttribute();
+			if (timeStr != null) {
+				Calendar time = getTimeValue();
+				setDisplayTextContent((new SimpleDateFormat(formatStr)).format(time.getTime()), null);
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			OdfNumberPercentageStyle dateStyle = new OdfNumberPercentageStyle((OdfFileDom) mCellElement
+					.getOwnerDocument(), formatStr, getUniquePercentageStyleName());
+			mCellElement.getAutomaticStyles().appendChild(dateStyle);
+			setDataDisplayStyleName(dateStyle.getStyleNameAttribute());
+			Double value = getPercentageValue();
+			if (value != null) {
+				setDisplayTextContent((new DecimalFormat(formatStr)).format(value.doubleValue()), null);
+			}
+		} else {
+			throw new IllegalArgumentException("This function doesn't support " + typeValue + " cell.");
+		}
+	}
+
+	private void setDataDisplayStyleName(String name) {
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForWrite();
+		if (styleElement != null) {
+			styleElement.setOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.STYLE, "data-style-name"), name);
+		}
+	}
+
+	private String getDataDisplayStyleName() {
+		String datadisplayStylename = null;
+		OdfStyleBase styleElement = getStyleHandler().getStyleElementForRead();
+		if (styleElement != null) {
+			datadisplayStylename = styleElement.getOdfAttributeValue(OdfName.newName(OdfDocumentNamespace.STYLE,
+					"data-style-name"));
+		}
+
+		return datadisplayStylename;
+	}
+
+	private String getUniqueNumberStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("n%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getNumberStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private String getUniqueDateStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("d%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getDateStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	private String getUniquePercentageStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("p%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getPercentageStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	// private String getUniqueCellStyleName() {
+	// String unique_name;
+	// OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+	// do {
+	// unique_name = String.format("a%06x", (int) (Math.random() * 0xffffff));
+	// } while (styles.getStyle(unique_name, OdfStyleFamily.TableCell) != null);
+	// return unique_name;
+	// }
+	private String getUniqueCurrencyStyleName() {
+		String unique_name;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		do {
+			unique_name = String.format("c%06x", (int) (Math.random() * 0xffffff));
+		} while (styles.getCurrencyStyle(unique_name) != null);
+		return unique_name;
+	}
+
+	/**
+	 * Get the format string of the cell.
+	 * 
+	 * @return the format string of the cell
+	 */
+	public String getFormatString() {
+		String type = mCellElement.getOfficeValueTypeAttribute();
+		OfficeValueTypeAttribute.Value typeValue = null;
+		if (type != null) {
+			typeValue = OfficeValueTypeAttribute.Value.enumValueOf(type);
+		}
+
+		if (typeValue == OfficeValueTypeAttribute.Value.FLOAT) {
+			String name = getDataDisplayStyleName();
+			OdfNumberStyle style = mCellElement.getAutomaticStyles().getNumberStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getNumberStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.DATE) {
+			String name = getDataDisplayStyleName();
+			OdfNumberDateStyle style = mCellElement.getAutomaticStyles().getDateStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getDateStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.TIME) {
+			String name = getDataDisplayStyleName();
+			OdfNumberDateStyle style = mCellElement.getAutomaticStyles().getDateStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getDateStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.CURRENCY) {
+			String name = getCurrencyDisplayStyleName();
+			OdfNumberCurrencyStyle dataStyle = mCellElement.getAutomaticStyles().getCurrencyStyle(name);
+			if (dataStyle == null) {
+				dataStyle = mDocument.getDocumentStyles().getCurrencyStyle(name);
+			}
+			if (dataStyle != null) {
+				return dataStyle.getFormat();
+			}
+		} else if (typeValue == OfficeValueTypeAttribute.Value.PERCENTAGE) {
+			String name = getDataDisplayStyleName();
+			OdfNumberPercentageStyle style = mCellElement.getAutomaticStyles().getPercentageStyle(name);
+			if (style == null) {
+				style = mDocument.getDocumentStyles().getPercentageStyle(name);
+			}
+			if (style != null) {
+				return style.getFormat();
+			}
+		}
+		return null;
+	}
+
+	private String getCurrencyDisplayStyleName() {
+		String name = getDataDisplayStyleName();
+		OdfNumberCurrencyStyle dataStyle = mCellElement.getAutomaticStyles().getCurrencyStyle(name);
+		if (dataStyle == null) {
+			dataStyle = mDocument.getDocumentStyles().getCurrencyStyle(name);
+		}
+
+		if (dataStyle != null) {
+			return dataStyle.getConditionStyleName(getCurrencyValue());
+		}
+		return null;
+	}
+
+	/**
+	 * Remove all the text content of cell.
+	 */
+	public void removeTextContent() {
+		splitRepeatedCells();
+		// delete text:p child element
+		Node node = mCellElement.getFirstChild();
+		while (node != null) {
+			Node nextNode = node.getNextSibling();
+			if (node instanceof TextPElement || node instanceof TextHElement || node instanceof TextListElement) {
+				mCellElement.removeChild(node);
+			}
+			node = nextNode;
+		}
+	}
+
+	/**
+	 * Remove all the content of the cell.
+	 */
+	public void removeContent() {
+		splitRepeatedCells();
+		Node node = mCellElement.getFirstChild();
+		while (node != null) {
+			Node nextNode = node.getNextSibling();
+			mCellElement.removeChild(node);
+			node = nextNode;
+		}
+	}
+
+	/**
+	 * Append the content of another cell.
+	 * 
+	 * @param fromCell
+	 *            another cell whose content will be appended to this cell
+	 */
+	void appendContentFrom(Cell fromCell) {
+		splitRepeatedCells();
+		TableTableCellElementBase cell = fromCell.getOdfElement();
+		Node node = cell.getFirstChild();
+		while (node != null) {
+			if (node instanceof OdfTextParagraph) {
+				if (!TextExtractor.getText((OdfTextParagraph) node).equals("")) {
+					mCellElement.appendChild(node.cloneNode(true));
+				}
+			} else {
+				mCellElement.appendChild(node.cloneNode(true));
+			}
+			node = node.getNextSibling();
+		}
+	}
+
+	/*****************************************
+	 * Moved from Table
+	 * 
+	 *******************************************/
+	/**
+	 * This method is invoked by insertCellBefore and insertRowBefore When it is
+	 * needed to clone a cell and the cell is a cover cell, for some instance,
+	 * we need to find the cell who covers this cell. So this method is to get
+	 * the cell who covers this cell
+	 */
+	Cell getCoverCell() {
+		int startRowi = getRowIndex();
+		int startColumni = getColumnIndex();
+
+		for (int i = startRowi; i >= 0; i--) {
+			Row aRow = mOwnerTable.getRowByIndex(i);
+			for (int j = startColumni; j >= 0; j--) {
+				if (i == startRowi && j == startColumni) {
+					continue;
+				}
+				Cell cell = aRow.getCellByIndex(j);
+				if (cell.getOdfElement() instanceof TableTableCellElement) {
+					TableTableCellElement cellEle = (TableTableCellElement) cell.getOdfElement();
+					if ((cellEle.getTableNumberColumnsSpannedAttribute() + j > startColumni)
+							&& (cellEle.getTableNumberRowsSpannedAttribute() + i > startRowi)) {
+						return mOwnerTable.getCellInstance(cellEle, 0, 0);
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This method is invoked by getCoverCell. It's to get the cell in a same
+	 * row who covers this cell.
+	 * 
+	 * @return the cell in a same row who covers this cell
+	 *         <p>
+	 *         Null if there is no cell who covers this cell
+	 */
+	Cell getCoverCellInSameRow() {
+		int startRowi = getRowIndex();
+		int startColumni = getColumnIndex();
+
+		for (int j = startColumni - 1; j >= 0; j--) {
+			Cell cell = mOwnerTable.getCellByPosition(j, startRowi);
+			if (cell.getOdfElement() instanceof TableCoveredTableCellElement) {
+				continue;
+			}
+
+			int oldSpanN = cell.getColumnSpannedNumber();
+			if (oldSpanN + j > startColumni) {
+				// cell.setColumnSpannedNumber(oldSpanN-1);
+				return cell;
+			}
+			return null;
+		}
+		return null;
+	}
+
+	/**
+	 * This method is invoked by getCoverCell
+	 */
+	Cell getCoverCellInSameColumn() {
+		int startRowi = getRowIndex();
+		int startColumni = getColumnIndex();
+
+		for (int i = startRowi - 1; i >= 0; i--) {
+			Cell cell = mOwnerTable.getCellByPosition(startColumni, i);
+			if (cell.getOdfElement() instanceof TableCoveredTableCellElement) {
+				continue;
+			}
+
+			int oldSpanN = cell.getRowSpannedNumber();
+			if (oldSpanN + i > startRowi) {
+				// cell.setRowSpannedNumber(oldSpanN-1);
+				return cell;
+			}
+			return null;
+		}
+		return null;
+	}
+
+	/**
+	 * Return the font definition for this cell.
+	 * <p>
+	 * Null will be returned if there is no explicit style definition, or even
+	 * default style definition, for this cell.
+	 * 
+	 * @return the font definition null if there is no style definition for this
+	 *         cell
+	 * 
+	 * @since 0.3
+	 */
+	public Font getFont() {
+		return getStyleHandler().getFont(Document.ScriptType.WESTERN);
+
+	}
+
+	/**
+	 * Set font style for this cell.
+	 * 
+	 * @param font
+	 *            - the font
+	 * 
+	 * @since 0.3
+	 */
+	public void setFont(Font font) {
+		getStyleHandler().setFont(font);
+	}
+
+	/**
+	 * Set the border style definitions for this cell.
+	 * <p>
+	 * This method will invoke
+	 * <code>CellStyleHandler.setBorders(Border border, SimpleCellBordersType bordersType).</code>
+	 * 
+	 * @param bordersType
+	 *            - A predefined border type
+	 * @param border
+	 *            - border style description
+	 * 
+	 * @see CellStyleHandler#setBorders(Border border,
+	 *      StyleTypeDefinitions.CellBordersType bordersType)
+	 * @since 0.3
+	 */
+	public void setBorders(StyleTypeDefinitions.CellBordersType bordersType, Border border) {
+		getStyleHandler().setBorders(border, bordersType);
+	}
+
+	/**
+	 * Return the border setting for a specific border.
+	 * <p>
+	 * This method will invoke
+	 * <code>CellStyleHandler.getBorder(SimpleCellBordersType type).</code>
+	 * 
+	 * @param type
+	 *            - the border type which describes a single border
+	 * @return the border setting
+	 * 
+	 * @see CellStyleHandler#getBorder(StyleTypeDefinitions.CellBordersType
+	 *      type)
+	 * @since 0.3.5
+	 */
+	public Border getBorder(CellBordersType type) {
+		return getStyleHandler().getBorder(type);
+	}
+
+	/**
+	 * Get the note text of this table cell. If there is no note on this cell,
+	 * <code>null</code> will be returned.
+	 * <p>
+	 * The note may contain text list, text paragraph and styles, but this
+	 * method extracts only text from them.
+	 * 
+	 * @return the note text of this cell.
+	 */
+	public String getNoteText() {
+		String noteString = null;
+		OfficeAnnotationElement annotation = OdfElement.findFirstChildNode(OfficeAnnotationElement.class, mCellElement);
+		if (annotation != null) {
+			noteString = "";
+			Node n = annotation.getFirstChild();
+			while (n != null) {
+				Node m = n.getNextSibling();
+				if (n instanceof TextPElement || n instanceof TextListElement) {
+					noteString += TextExtractor.getText((OdfElement) n);
+				}
+				n = m;
+			}
+		}
+		return noteString;
+	}
+
+	/**
+	 * Set note text for this table cell. This method creates a text paragraph
+	 * without style as note. The note text is text paragraph content.
+	 * <p>
+	 * Only simple text is supported to receive in this method, which is a sub
+	 * function of office annotation. So overwriting a note with text might
+	 * loose structure and styles.
+	 * 
+	 * @param note
+	 *            note content.
+	 */
+	public void setNoteText(String note) {
+		splitRepeatedCells();
+		OfficeAnnotationElement annotation = OdfElement.findFirstChildNode(OfficeAnnotationElement.class, mCellElement);
+		if (annotation == null) {
+			OdfFileDom dom = (OdfFileDom) mCellElement.getOwnerDocument();
+			annotation = (OfficeAnnotationElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+					OdfDocumentNamespace.OFFICE, "annotation"));
+		}
+		TextPElement noteElement = OdfElement.findFirstChildNode(TextPElement.class, annotation);
+		if (noteElement == null) {
+			noteElement = annotation.newTextPElement();
+		}
+		noteElement.setTextContent(note);
+		DcCreatorElement dcCreatorElement = OdfElement.findFirstChildNode(DcCreatorElement.class, annotation);
+		if (dcCreatorElement == null) {
+			dcCreatorElement = annotation.newDcCreatorElement();
+		}
+		dcCreatorElement.setTextContent(System.getProperty("user.name"));
+		String dcDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date());
+		DcDateElement dcDateElement = OdfElement.findFirstChildNode(DcDateElement.class, annotation);
+		if (dcDateElement == null) {
+			dcDateElement = annotation.newDcDateElement();
+		}
+		dcDateElement.setTextContent(dcDate);
+		mCellElement.appendChild(annotation);
+	}
+
+	/**
+	 * Insert an Image from the specified uri to cell. Note: if there is any
+	 * other text content in this cell, it will be removed.
+	 * 
+	 * @param imageUri
+	 *            The URI of the image that will be added to the cell, add image
+	 *            stream to the package, in the 'Pictures/' graphic directory
+	 *            with the same image file name as in the URI. If the imageURI
+	 *            is relative first the user.dir is taken to make it absolute.
+	 * @since 0.4.5
+	 */
+	public Image setImage(URI imageUri) {
+		if (imageUri == null)
+			return null;
+
+		splitRepeatedCells();
+		Image newImage;
+		try {
+			NodeList cellPs = mCellElement.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+			if (cellPs != null && cellPs.getLength() > 0) {
+				for (int i = 0; i < cellPs.getLength(); i++) {
+					mCellElement.removeChild(cellPs.item(i));
+				}
+			}
+
+			if (mOwnerTable.mIsSpreadsheet) {
+				newImage = Image.newImage(this, imageUri);
+			} else {
+				OdfFileDom dom = (OdfFileDom) mCellElement.getOwnerDocument();
+				TextPElement pElement = dom.newOdfElement(TextPElement.class);
+				mCellElement.appendChild(pElement);
+				newImage = Image.newImage(Paragraph.getInstanceof(pElement), imageUri);
+			}
+			if (imageUri != null) {
+				FrameRectangle rect = newImage.getRectangle();
+				double height = rect.getHeight();
+				double width = rect.getWidth();
+				long widthInMI = new Double(width / 100).longValue();
+				Column column = getTableColumn();
+				if (widthInMI > column.getWidth()) {
+					column.setWidth(widthInMI);
+				}
+
+				long heightInMI = new Double(height / 100).longValue();
+				Row row = getTableRow();
+				if (heightInMI > row.getHeight()) {
+					row.setHeight(heightInMI, false);
+				}
+				return newImage;
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(Cell.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the Image from the specified cell.
+	 * 
+	 * @return If there is a image exist in this cell, An {@link java.awt.Image
+	 *         Image} will be returned.
+	 * @since 0.4.5
+	 * @deprecated
+	 */
+	public BufferedImage getBufferedImage() {
+		try {
+			TextPElement pElement = OdfElement.findFirstChildNode(TextPElement.class, mCellElement);
+			if (pElement != null) {
+				DrawFrameElement drawFrame = OdfElement.findFirstChildNode(DrawFrameElement.class, pElement);
+				if (drawFrame != null) {
+					DrawImageElement imageElement = OdfElement.findFirstChildNode(DrawImageElement.class, drawFrame);
+					if (imageElement != null) {
+						String packagePath = imageElement.getXlinkHrefAttribute();
+						OdfFileDom dom = (OdfFileDom) mCellElement.getOwnerDocument();
+						OdfPackage mOdfPackage = dom.getDocument().getPackage();
+						InputStream is = mOdfPackage.getInputStream(packagePath);
+						BufferedImage image = ImageIO.read(is);
+						return image;
+					}
+				}
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(Cell.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the image from the specified cell.
+	 * 
+	 * @return If there is a image exist in this cell, an
+	 *         {@link org.odftoolkit.simple.draw.Image Image} will be returned.
+	 * @since 0.5.5
+	 */
+	public Image getImage() {
+		try {
+			TextPElement pElement = OdfElement.findFirstChildNode(TextPElement.class, mCellElement);
+			if (pElement != null) {
+				DrawFrameElement drawFrame = OdfElement.findFirstChildNode(DrawFrameElement.class, pElement);
+				if (drawFrame != null) {
+					DrawImageElement imageElement = OdfElement.findFirstChildNode(DrawImageElement.class, drawFrame);
+					return Image.getInstanceof(imageElement);
+				}
+			} else {
+				DrawFrameElement drawFrame = OdfElement.findFirstChildNode(DrawFrameElement.class, mCellElement);
+				if (drawFrame != null) {
+					DrawImageElement imageElement = OdfElement.findFirstChildNode(DrawImageElement.class, drawFrame);
+					return Image.getInstanceof(imageElement);
+				}
+			}
+		} catch (Exception ex) {
+			Logger.getLogger(Cell.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return null;
+	}
+	
+	/**
+	 * Return style handler for this cell
+	 * 
+	 * @return the style handler
+	 * 
+	 * @since 0.3
+	 */
+	public CellStyleHandler getStyleHandler() {
+		if (mStyleHandler == null)
+			mStyleHandler = new CellStyleHandler(this);
+		return mStyleHandler;
+	}
+
+	public OdfElement getListContainerElement() {
+		return getListContainerImpl().getListContainerElement();
+	}
+
+	public org.odftoolkit.simple.text.list.List addList() {
+		Document ownerDocument = getTable().getOwnerDocument();
+		if (ownerDocument instanceof SpreadsheetDocument) {
+			throw new UnsupportedOperationException(
+					"Open Office and Symphony can't show a list in spreadsheet document cell.");
+		} else {
+			return getListContainerImpl().addList();
+		}
+	}
+
+	public org.odftoolkit.simple.text.list.List addList(ListDecorator decorator) {
+		Document ownerDocument = getTable().getOwnerDocument();
+		if (ownerDocument instanceof SpreadsheetDocument) {
+			throw new UnsupportedOperationException(
+					"Open Office and Symphony can't show a list in spreadsheet document cell.");
+		} else {
+			return getListContainerImpl().addList(decorator);
+		}
+	}
+
+	public void clearList() {
+		getListContainerImpl().clearList();
+	}
+
+	public Iterator<org.odftoolkit.simple.text.list.List> getListIterator() {
+		return getListContainerImpl().getListIterator();
+	}
+
+	public boolean removeList(org.odftoolkit.simple.text.list.List list) {
+		return getListContainerImpl().removeList(list);
+	}
+
+	/**
+	 * Creates a new paragraph and append text
+	 * 
+	 * @param text
+	 * @return the new paragraph
+	 * @throws Exception
+	 *             if the file DOM could not be created.
+	 * @since 0.5.5
+	 */
+	public Paragraph addParagraph(String text) {
+		Paragraph para = getParagraphContainerImpl().addParagraph(text);
+		return para;
+	}
+
+	/**
+	 * Remove paragraph from this document
+	 * 
+	 * @param para
+	 *            - the instance of paragraph
+	 * @return true if the paragraph is removed successfully, false if errors
+	 *         happen.
+	 *         
+	 * @since 0.5.5
+	 */
+	public boolean removeParagraph(Paragraph para) {
+		return getParagraphContainerImpl().removeParagraph(para);
+	}
+	
+	/**
+	 * Get the ODF element which can have <text:p> as child element directly.
+	 * 
+	 * @return - an ODF element which can have paragraph as child.
+	 * 
+	 * @since 0.5.5
+	 */
+	public OdfElement getParagraphContainerElement() {
+		return getParagraphContainerImpl().getParagraphContainerElement();
+	}
+	/**
+	 * Return a paragraph with a given index.
+	 * <p>
+	 * An index of zero represents the first paragraph.
+	 * <p>
+	 * If empty paragraph is skipped, the empty paragraph won't be counted.
+	 * 
+	 * @param index
+	 *            - the index started from 0.
+	 * @param isEmptyParagraphSkipped
+	 *            - whether the empty paragraph is skipped or not
+	 * @return the paragraph with a given index
+	 * 
+	 * @since 0.5.5
+	 */
+	public Paragraph getParagraphByIndex(int index, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByIndex(index, isEmptyParagraphSkipped);
+	}
+	
+	/**
+	 * Return a paragraph with a given index. The index is in reverse order.
+	 * <p>
+	 * An index of zero represents the last paragraph.
+	 * <p>
+	 * If empty paragraph is skipped, the empty paragraph won't be counted.
+	 * 
+	 * @param reverseIndex
+	 *            - the index started from 0 in reverse order.
+	 * @param isEmptyParagraphSkipped
+	 *            - whether the empty paragraph is skipped or not
+	 * @return the paragraph with a given index
+	 * 
+	 * @since 0.5.5
+	 */
+	public Paragraph getParagraphByReverseIndex(int reverseIndex, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByReverseIndex(reverseIndex, isEmptyParagraphSkipped);
+	}
+	
+	/**
+	 * Return an Iterator of the paragraph in this container.
+	 * 
+	 * @return an Iterator of the paragraph in this container
+	 * 
+	 * @since 0.5.5
+	 */
+	public Iterator<Paragraph> getParagraphIterator() {
+		return getParagraphContainerImpl().getParagraphIterator();
+	}
+
+	public OdfElement getFrameContainerElement() {
+		return mCellElement;
+	}
+
+	/**
+	 * Specifies the allowed values of this cell in a list. Any value out of
+	 * this list is invalid.
+	 * <p>
+	 * NOTE: Now, the validity rule does not take effect when a cell value
+	 * is updated by Simple ODF API yet.
+	 * 
+	 * @param values
+	 *            the list of allowed values.
+	 * @since 0.6
+	 */
+	public void setValidityList(List<String> values) {
+		try {
+			TableContentValidationElement validation = getContentValidationEle();
+			validation.setTableAllowEmptyCellAttribute(true);
+			String split = "";
+			StringBuilder listStr = new StringBuilder("");
+			for (String value : values) {
+				listStr.append(split);
+				listStr.append("\"");
+				listStr.append(value);
+				listStr.append("\"");
+				split = ";";
+			}
+			validation.setTableConditionAttribute("cell-content-is-in-list(" + listStr + ")");
+			String tableName = getTableElement().getTableNameAttribute();
+			validation.setTableBaseCellAddressAttribute(tableName + "." + getCellAddress());
+			validation.setTableDisplayListAttribute("unsorted");
+		} catch (Exception e) {
+			Logger.getLogger(Cell.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	/**
+	 * Sets the title and the text of the tip, which will then be displayed if
+	 * the cell is selected.
+	 * 
+	 * @param title
+	 *            the title of the tip.
+	 * @param text
+	 *            the text of the tip.
+	 * @since 0.6
+	 */
+	public void setInputHelpMessage(String title, String text) {
+		try {
+			TableContentValidationElement validationElement = getContentValidationEle();
+			TableHelpMessageElement helpMessageElement = OdfElement.findFirstChildNode(TableHelpMessageElement.class,
+					validationElement);
+			if (helpMessageElement != null) {
+				validationElement.removeChild(helpMessageElement);
+			}
+			helpMessageElement = validationElement.newTableHelpMessageElement();
+			helpMessageElement.setTableTitleAttribute(title);
+			helpMessageElement.setTableDisplayAttribute(true);
+			helpMessageElement.newTextPElement().setTextContent(text);
+		} catch (Exception e) {
+			Logger.getLogger(Cell.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+	
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	//////////////////////////////////////// private methods ///////////////////////////////////////////////////////////
+	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	
+	private TableContentValidationElement getContentValidationEle() throws Exception {
+		Document ownerDocument = getOwnerDocument();
+		OdfElement contentRootElement = ownerDocument.getContentRoot();
+		TableContentValidationsElement validations = OdfElement.findFirstChildNode(
+				TableContentValidationsElement.class, contentRootElement);
+		if (validations == null) {
+			validations = (TableContentValidationsElement) OdfXMLFactory.newOdfElement(ownerDocument
+					.getContentDom(), OdfName.newName(OdfDocumentNamespace.TABLE, "content-validations"));
+			contentRootElement.insertBefore(validations, contentRootElement.getFirstChild());
+		}
+		String validationName = getOdfElement().getTableContentValidationNameAttribute();
+		TableContentValidationElement validationElement = null;
+		if (validationName != null) {
+			Node child = validations.getFirstChild();
+			while (child != null) {
+				TableContentValidationElement contentValidationElementRef = (TableContentValidationElement) child;
+				if (validationName.equals(contentValidationElementRef.getTableNameAttribute())) {
+					validationElement = contentValidationElementRef;
+					break;
+				}
+			}
+		} else {
+			String valName = "val" + String.format("d%06x", (int) (Math.random() * 0xffffff));
+			validationElement = validations.newTableContentValidationElement(valName);
+			getOdfElement().setTableContentValidationNameAttribute(valName);
+		}
+		return validationElement;
+	}
+
+	private String getCellAddress() {
+		char[] digits = { '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
+				'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
+		int i = getColumnIndex() + 1;
+		char[] buf = new char[32];
+		int charPos = 32;
+		do {
+			buf[--charPos] = digits[i % 26];
+			i /= 26;
+		} while (i != 0);
+		String cs = new String(buf, charPos, (32 - charPos));
+		return cs + (getRowIndex() + 1);
+	}
+	
+	private ListContainerImpl getListContainerImpl() {
+		if (listContainerImpl == null) {
+			listContainerImpl = new ListContainerImpl();
+		}
+		return listContainerImpl;
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+
+		public OdfElement getListContainerElement() {
+			return mCellElement;
+		}
+	}
+	
+	private class ParagraphContainerImpl extends AbstractParagraphContainer {
+		public OdfElement getParagraphContainerElement() {
+			return mCellElement;
+		}
+	}
+
+	private ParagraphContainerImpl getParagraphContainerImpl() {
+		if (paragraphContainerImpl == null)
+			paragraphContainerImpl = new ParagraphContainerImpl();
+		return paragraphContainerImpl;
+	}
+	
+	//column can fit the width to the text, if column.isOptimalWidth() is true.
+	//since 0.5.5
+	private void optimizeCellSize(String content){
+		JTextField txtField = new JTextField();
+		// map font to awt font
+		Font font = getFont();
+		String fontFamilyName = font.getFamilyName();
+		if (fontFamilyName == null) {
+			fontFamilyName = "Times New Roman";
+		}
+		int fontStyleNum = java.awt.Font.PLAIN;
+		FontStyle fontStyle = font.getFontStyle();
+		if (fontStyle != null) {
+			switch (fontStyle) {
+			case BOLD:
+				fontStyleNum = java.awt.Font.BOLD;
+				break;
+			case REGULAR:
+				fontStyleNum = java.awt.Font.PLAIN;
+				break;
+			case ITALIC:
+				fontStyleNum = java.awt.Font.ITALIC;
+				break;
+			case BOLDITALIC:
+				fontStyleNum = java.awt.Font.BOLD | java.awt.Font.ITALIC;
+				break;
+			default:
+				fontStyleNum = java.awt.Font.PLAIN;
+			}
+		}
+		double fontSize = font.getSize();
+		if (fontSize < 0.0001) {
+			fontSize = 10;
+		}
+		txtField.setFont(new java.awt.Font(fontFamilyName, fontStyleNum, (int)fontSize));
+		FontMetrics fm = txtField.getFontMetrics(txtField.getFont());
+		// content width in pixels.
+		int widthPixels = fm.stringWidth(content);
+		// content height in pixels.
+		// int heightPixels = fm.getHeight();
+		OdfStyleBase properties = getStyleHandler().getStyleElementForRead();
+		double millimeterPadding = 0.0;
+		if(properties!=null){
+			String padding = properties.getProperty(StyleTableCellPropertiesElement.Padding);
+			if(padding!=null){
+				millimeterPadding = Length.parseDouble(padding, Unit.MILLIMETER);
+			}
+		}
+		// convert width pixels to mm
+		double columnWidth = widthPixels / 2.83464;
+		columnWidth += millimeterPadding * 2;
+		Column column = getTableColumn();
+		if (column.isOptimalWidth()) {
+			double width = column.getWidth();
+			if (width < columnWidth) {
+				column.setWidth(columnWidth);
+			}
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellRange.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellRange.java
new file mode 100644
index 0000000..fbe3414
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellRange.java
@@ -0,0 +1,475 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+
+/**
+ * CellRange represent a rang of cells that are adjacent with each other
+ * <p>
+ * CellRange provides methods to get/set/modify the properties of cell range.
+ */
+public class CellRange {
+
+	private int mnStartRow;
+	private int mnStartColumn;
+	private int mnEndRow;
+	private int mnEndColumn;
+	private String msCellRangeName;
+	private Table maOwnerTable;
+	private boolean mbSpreadsheet;
+
+	/**
+	 * Construct the instance of CellRange.
+	 * @param table
+	 * 					is the container table of this cell range.
+	 * @param startColumn
+	 * 					is the column index of the first cell in this cell range.
+	 * @param startRow
+	 * 					is the row index of the first cell in this cell range.
+	 * @param endColumn
+	 * 					is the column index of the last cell in this cell range.
+	 * @param endRow
+	 * 					is the row index of the last cell in this cell range.
+	 */
+	CellRange(Table table, int startColumn, int startRow, int endColumn, int endRow) {
+		maOwnerTable = table;
+
+		Document doc = (Document) ((OdfFileDom) maOwnerTable.getOdfElement().getOwnerDocument()).getDocument();
+		if (doc instanceof SpreadsheetDocument) {
+			mbSpreadsheet = true;
+		}
+
+		//the first cell is the covered cell, then the cell range should be enlarged
+		//so that it can contains the complete cell
+		//get the cell cover info
+		mnStartColumn = startColumn;
+		mnStartRow = startRow;
+		mnEndColumn = endColumn;
+		mnEndRow = endRow;
+		List<CellCoverInfo> coverList = maOwnerTable.getCellCoverInfos(0, 0, endColumn, endRow);
+		Cell cell;// = maOwnerTable.getOwnerCellByPosition(coverList, nStartColumn, nStartRow);
+		for (int i = startColumn; i <= endColumn; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, i, startRow);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+
+		for (int i = startColumn; i <= endColumn; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, i, endRow);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+
+		for (int i = startRow + 1; i < endRow; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, startColumn, i);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+
+		for (int i = startRow + 1; i < endRow; i++) {
+			cell = maOwnerTable.getOwnerCellByPosition(coverList, endColumn, i);
+			int rowIndex = cell.getRowIndex();
+			int colIndex = cell.getColumnIndex();
+			mnStartColumn = Math.min(mnStartColumn, colIndex);
+			mnStartRow = Math.min(mnStartRow, rowIndex);
+			mnEndColumn = Math.max(mnEndColumn, colIndex + cell.getColumnSpannedNumber() - 1);
+			mnEndRow = Math.max(mnEndRow, rowIndex + cell.getRowSpannedNumber() - 1);
+		}
+	}
+
+	/**
+	 * construct the empty cellRange
+	 */
+	CellRange() {
+	}
+
+	/**
+	 * Merge the current cell range to one cell
+	 */
+	public void merge() {
+		Cell firstCell = maOwnerTable.getCellByPosition(mnStartColumn, mnStartRow);
+
+		//note: after merge, the cell row/column count might  be changed
+		int rowCount = maOwnerTable.getRowCount();
+		int colCount = maOwnerTable.getColumnCount();
+		//if the cell range is the whole table, then merge it to a big cell
+		//as to the spreadsheet document, it should still keep the original cell count,
+		//rather than merge to a big cell.
+		if (rowCount == (mnEndRow - mnStartRow + 1)
+				&& colCount == (mnEndColumn - mnStartColumn + 1)
+				&& !mbSpreadsheet) {
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-spanned");
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-spanned");
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//just copy the text of the other cells to this first cell
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					Cell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						//copy the content of this cell to the first cell
+						firstCell.appendContentFrom(cellBase);
+					}
+				}
+			}
+			maOwnerTable.removeRowsByIndex(1, maOwnerTable.getRowCount() - 1);
+			maOwnerTable.removeColumnsByIndex(1, maOwnerTable.getColumnCount() - 1);
+			Column firstColumn = maOwnerTable.getColumnByIndex(0);
+			firstColumn.setWidth(maOwnerTable.getWidth());
+			mnEndRow = mnStartRow;
+			mnEndColumn = mnStartColumn;
+			return;
+		} //if the cell range covered all the table row, and the merged column > 1
+		//the merged column can be removed
+		else if (rowCount == (mnEndRow - mnStartRow + 1)
+				&& colCount > (mnEndColumn - mnStartColumn + 1)
+				&& (mnEndColumn - mnStartColumn) > 0) {
+			//the first cell, set the span attribute
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-spanned");
+				firstCellElement.setTableNumberRowsSpannedAttribute(Integer.valueOf(mnEndRow - mnStartRow + 1));
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//the other cell, copy the content to first cell
+			//if it is also in the first column of the cell range, set to the covered cell
+			//other cell not in the first column will be removed when remove the column
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					Cell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						//append content to first cell
+						firstCell.appendContentFrom(cellBase);
+						//change the cell in the first column of cell range to covered cell
+						if ((j == mnStartColumn) && (cellBase.getOdfElement() instanceof TableTableCellElement)) {
+							//change the normal cell to be the covered cell
+							TableTableCellElement firstColumnCell = (TableTableCellElement) cellBase.getOdfElement();
+							TableCoveredTableCellElement coveredCell = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+									(OdfFileDom) firstColumnCell.getOwnerDocument(),
+									OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+							Row parentRow = cellBase.getTableRow();
+							parentRow.getOdfElement().insertBefore(coveredCell, firstColumnCell);
+							parentRow.getOdfElement().removeChild(firstColumnCell);
+						}
+					}
+				}
+			}
+			List<Double> widthList = getCellRangeWidthList();
+			double nCellRangeWidth = widthList.get(widthList.size() - 1) - widthList.get(0);
+			maOwnerTable.removeColumnsByIndex(mnStartColumn + 1, mnEndColumn - mnStartColumn);
+			Column firstColumn = maOwnerTable.getColumnByIndex(mnStartColumn);
+			firstColumn.setWidth(nCellRangeWidth);
+			mnEndColumn = mnStartColumn;
+			return;
+		} //if the cell range covered all the table column, the merged row can be removed
+		else if (rowCount > (mnEndRow - mnStartRow + 1)
+				&& colCount == (mnEndColumn - mnStartColumn + 1)
+				&& (mnEndRow - mnStartRow) > 0) {
+			//the first cell, set the span attribute
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-spanned");
+				firstCellElement.setTableNumberColumnsSpannedAttribute(Integer.valueOf(mnEndColumn - mnStartColumn + 1));
+				firstCellElement.setOfficeValueTypeAttribute(OfficeValueTypeAttribute.Value.STRING.toString());
+			}
+			//the other cell, copy the content to first cell
+			//if it is also in the first row of the cell range, set to the covered cell
+			//other cell not in the first row will be removed when remove the row
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					Cell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						//append content to first cell
+						firstCell.appendContentFrom(cellBase);
+						//change the cell in the first row of cell range to covered cell
+						if ((i == mnStartRow) && (cellBase.getOdfElement() instanceof TableTableCellElement)) {
+							//change the normal cell to be the covered cell
+							TableTableCellElement firstRowCell = (TableTableCellElement) cellBase.getOdfElement();
+							TableCoveredTableCellElement coveredCell = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+									(OdfFileDom) firstRowCell.getOwnerDocument(),
+									OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+							Row parentRow = cellBase.getTableRow();
+							parentRow.getOdfElement().insertBefore(coveredCell, firstRowCell);
+							parentRow.getOdfElement().removeChild(firstRowCell);
+						}
+					}
+				}
+			}
+			maOwnerTable.removeRowsByIndex(mnStartRow + 1, mnEndRow - mnStartRow);
+			mnEndRow = mnStartRow;
+			return;
+		} //don't remove any row/column
+		else {
+			//first keep the column and row count in this cell range
+			//the first cell, set the span attribute
+			if (firstCell.getOdfElement() instanceof TableTableCellElement) {
+				//first cell number columns repeated attribute may > 1.
+				firstCell.splitRepeatedCells();
+				TableTableCellElement firstCellElement = (TableTableCellElement) (firstCell.getOdfElement());
+				firstCellElement.setTableNumberColumnsSpannedAttribute(mnEndColumn - mnStartColumn + 1);
+				firstCellElement.setTableNumberRowsSpannedAttribute(mnEndRow - mnStartRow + 1);
+			}
+			//the other cell, set to the covered cell
+			for (int i = mnStartRow; i < mnEndRow + 1; i++) {
+				for (int j = mnStartColumn; j < mnEndColumn + 1; j++) {
+					Cell cellBase = maOwnerTable.getCellByPosition(j, i);
+					if (j != mnStartColumn || i != mnStartRow) {
+						if (cellBase.getOdfElement() instanceof TableTableCellElement) {
+							//change the normal cell to be the covered cell
+							TableTableCellElement cell = (TableTableCellElement) cellBase.getOdfElement();
+							TableCoveredTableCellElement coveredCell = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+									(OdfFileDom) cell.getOwnerDocument(),
+									OdfName.newName(OdfDocumentNamespace.TABLE, "covered-table-cell"));
+
+							TableTableRowElement parentRowEle = cellBase.getTableRow().getOdfElement();
+							parentRowEle.insertBefore(coveredCell, cell);
+							//copy the content of this cell to the first cell
+							firstCell.appendContentFrom(cellBase);
+							cellBase.removeContent();
+							//set the table column repeated attribute
+							int repeatedNum = cell.getTableNumberColumnsRepeatedAttribute();
+							int num = (mnEndColumn - j + 1) - repeatedNum;
+							if (num >= 0) {
+								if(repeatedNum > 1){
+									coveredCell.setTableNumberColumnsRepeatedAttribute(repeatedNum);
+								}
+								parentRowEle.removeChild(cell);
+							} else {
+								int tableNumberColumnsRepeatedValue = mnEndColumn - j + 1;
+								if(tableNumberColumnsRepeatedValue > 1){
+									coveredCell.setTableNumberColumnsRepeatedAttribute(tableNumberColumnsRepeatedValue);
+								}
+								cell.setTableNumberColumnsRepeatedAttribute(-num);
+							}
+						} else if (cellBase.getOdfElement() instanceof TableCoveredTableCellElement) {
+							try {
+								//copy the content of this cell to the first cell
+								firstCell.appendContentFrom(cellBase);
+								cellBase.removeContent();
+							} catch (Exception e) {
+								Logger.getLogger(CellRange.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	//vector store the x coordinate of each column which reference to the left start point of owner table
+	//the returned value is all measured with "mm" unit
+	private List<Double> getCellRangeWidthList() {
+		List<Double> list = new ArrayList<Double>();
+		Double length = Double.valueOf(0.0);
+		for (int i = 0; i < maOwnerTable.getColumnCount() - 1; i++) {
+			Column col = maOwnerTable.getColumnByIndex(i);
+			int repeateNum = col.getColumnsRepeatedNumber();
+			if (repeateNum == 1) {
+				if (isColumnInCellRange(i)) {
+					list.add(length);
+				}
+				length = Double.valueOf(length + col.getWidth());
+			} else {
+				for (int j = 0; j < repeateNum; j++) {
+					if (isColumnInCellRange(i + j)) {
+						list.add(length);
+						length = Double.valueOf(length + col.getWidth());
+					}
+				}
+				i += repeateNum - 1;
+			}
+		}
+		//x coordinate of last column right point 
+		list.add(length);
+		return list;
+	}
+
+	//vector store the x coordinate of each will split column start point
+	List<Double> getVeticalSplitCellRangeWidthList(int splitNum) {
+		//get each cell in the cell range(the cell here means the real cell, not the covered cell)
+		List<CellCoverInfo> coverList = maOwnerTable.getCellCoverInfos(mnStartColumn, mnStartRow, mnEndColumn, mnEndRow);
+		//then get the real(uncovered) cell x coordinate
+		List<Double> tmpList = new ArrayList<Double>();
+		List<Double> widthList = getCellRangeWidthList();
+		for (int i = mnStartColumn; i < mnEndColumn + 1; i++) {
+			for (int j = mnStartRow; j < mnEndRow + 1; j++) {
+				if (maOwnerTable.isCoveredCellInOwnerTable(coverList, i, j)) {
+					continue;
+				} else {
+					//the real cell, record the x coordinate of the left point
+					Double width = widthList.get(i - mnStartColumn);
+					if (!tmpList.contains(width)) {
+						tmpList.add(width);
+					}
+				}
+			}
+		}
+
+		//last, reorder the tmpVector and split it to splitNum between each item
+		Double[] widthArray = (Double[]) tmpList.toArray();
+		Arrays.sort(widthArray);
+		List<Double> rtnValues = new ArrayList<Double>();
+		double colWidth;
+		double unitWidth;
+		rtnValues.add(widthArray[0]);
+		for (int i = 1; i < widthArray.length; i++) {
+			colWidth = Double.valueOf(widthArray[i] - widthArray[i - 1]);
+			unitWidth = colWidth / splitNum;
+			for (int j = 1; j < splitNum; j++) {
+				double eachWidth = unitWidth * j + widthArray[i - 1];
+				rtnValues.add(Double.valueOf(eachWidth));
+			}
+			rtnValues.add(widthArray[i]);
+		}
+		return rtnValues;
+	}
+
+	/**
+	 * Get the name of the named cell range.
+	 * 
+	 * @return the name of the cell range
+	 */
+	public String getCellRangeName() {
+		return msCellRangeName;
+	}
+
+	/**
+	 * Set the name of the current cell range.
+	 * 
+	 * @param cellRangeName	the name that need to set
+	 */
+	public void setCellRangeName(String cellRangeName) {
+		try {
+			OdfElement contentRoot = maOwnerTable.mDocument.getContentRoot();
+			//create name range element
+			OdfFileDom contentDom = ((OdfFileDom) maOwnerTable.getOdfElement().getOwnerDocument());
+			TableNamedExpressionsElement nameExpress = (TableNamedExpressionsElement) OdfXMLFactory.newOdfElement(
+					contentDom,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "named-expressions"));
+			String startCellRange = "$" + maOwnerTable.getTableName() + "." + maOwnerTable.getAbsoluteCellAddress(mnStartColumn, mnStartRow);
+			String endCellRange = "$" + maOwnerTable.getTableName() + "." + maOwnerTable.getAbsoluteCellAddress(mnEndColumn, mnEndRow);
+			TableNamedRangeElement nameRange = (TableNamedRangeElement) nameExpress.newTableNamedRangeElement(startCellRange + ":" + endCellRange, cellRangeName);
+			nameRange.setTableBaseCellAddressAttribute(endCellRange);
+			contentRoot.appendChild(nameExpress);
+			msCellRangeName = cellRangeName;
+		} catch (Exception ex) {
+			Logger.getLogger(CellRange.class.getName()).log(Level.SEVERE, null, ex);
+		}
+
+	}
+
+	/**
+	 * Get the <code>Table</code> instance who contains this cell range.
+	 * @return the table that contains the cell range.
+	 */
+	public Table getTable() {
+		return maOwnerTable;
+	}
+
+	/**
+	 * Get the number of rows in this cell range.
+	 * @return rows number in the cell range
+	 */
+	public int getRowNumber() {
+		return (mnEndRow - mnStartRow + 1);
+	}
+
+	/**
+	 * Get the number of columns in this cell range.
+	 * @return columns number in the cell range
+	 */
+	public int getColumnNumber() {
+		return (mnEndColumn - mnStartColumn + 1);
+	}
+
+	/** 
+	 * Returns a single cell that is positioned at specified column and row.
+	 * @param clmIndex	the column index of the cell inside the range.
+	 * @param rowIndex	the row index of the cell inside the range.
+	 * @return
+	 * 				the cell at the specified position relative to the start position of the cell range
+	 * @throws IndexOutOfBoundsException if the column/row index is bigger than the column/row count
+	 */
+	public Cell getCellByPosition(int clmIndex, int rowIndex) throws IndexOutOfBoundsException {
+		return maOwnerTable.getCellByPosition(mnStartColumn + clmIndex, mnStartRow + rowIndex);
+	}
+
+	/**
+	 * Check if the given column in is this cell range.
+	 * @param colIndex	
+	 * 					the given column index
+	 * @return true if the given column index is in the current cell range
+	 * 
+	 */
+	private boolean isColumnInCellRange(int colIndex) {
+		if (colIndex < mnStartColumn || colIndex > mnEndColumn) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	/** 
+	 * Returns a single cell that is positioned at specified cell address.
+	 * 
+	 * @param address
+	 * 				the cell address of the cell inside the range.
+	 * @return
+	 * 				the cell at the specified cell address relative to the start position of the cell range
+	 */
+	public Cell getCellByPosition(String address) {
+		//if the address also contain the table name,  but the table is not the maOwnerTable
+		//what should do? get the table then getcellByPosition?
+		return getCellByPosition(maOwnerTable.getColIndexFromCellAddress(address), maOwnerTable.getRowIndexFromCellAddress(address));
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellStyleHandler.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellStyleHandler.java
new file mode 100644
index 0000000..9962906
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellStyleHandler.java
@@ -0,0 +1,718 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.Locale;
+
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.Document.ScriptType;
+import org.odftoolkit.simple.style.Border;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.ParagraphProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.TableCellProperties;
+import org.odftoolkit.simple.style.TextProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.TextLinePosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalAlignmentType;
+
+/**
+ * This class provides functions to handle the style of a cell.
+ * 
+ * <p>
+ * This class provides functions to handle the border settings, font settings,
+ * text alignment settings and so on.
+ * 
+ * @since 0.3
+ */
+public class CellStyleHandler extends DefaultStyleHandler {
+
+	Cell mCell;
+	TableTableCellElementBase mCellElement;
+
+	TextProperties mTextProperties;
+	TextProperties mWritableTextProperties;
+	TableCellProperties mTableCellProperties;
+	TableCellProperties mWritableTableCellProperties;
+	ParagraphProperties mParagraphProperties;
+	ParagraphProperties mWritableParagraphProperties;
+
+	CellStyleHandler(Cell aCell) {
+		super(aCell.getOdfElement());
+		mCell = aCell;
+		mCellElement = (TableTableCellElementBase) mCell.getOdfElement();
+	}
+
+	private boolean isShared = false;
+
+	/**
+	 * Return the used style name of this cell.
+	 * <p>
+	 * If there is no style name defined for cell, the attribute
+	 * "table:default-cell-style-name" in table row and table column would be
+	 * returned.
+	 */
+	@Override
+	public String getUsedStyleName() {
+		String styleName = mCellElement.getStyleName();
+		if (styleName == null || (styleName.equals(""))) { // search in row
+			Row aRow = mCell.getTableRow();
+			styleName = aRow.getOdfElement().getTableDefaultCellStyleNameAttribute();
+			isShared = true;
+		}
+		if (styleName == null || (styleName.equals(""))) { // search in column
+			Column aColumn = mCell.getTableColumn();
+			styleName = aColumn.getOdfElement().getTableDefaultCellStyleNameAttribute();
+			isShared = true;
+		}
+		return styleName;
+	}
+
+	/**
+	 * Return the style element for this cell, for read and write functions.
+	 * <p>
+	 * An empty style definition will be created if there is no style
+	 * definition.
+	 * 
+	 * @return the style element
+	 */
+	@Override
+	public OdfStyle getStyleElementForWrite() {
+		if (mWritableStyleElement != null)
+			return mWritableStyleElement;
+
+		mCell.splitRepeatedCells();
+		mCellElement = (TableTableCellElementBase) mCell.getOdfElement();
+		mOdfElement = mCellElement; // note here: mOdfElement in
+									// DefaultStyleHandler must be updated at
+									// the same time
+
+		String styleName = getUsedStyleName();
+		mWritableStyleElement = getWritableStyleElementByName(styleName, isShared);
+		return mWritableStyleElement;
+	}
+
+	private OdfDefaultStyle getCellDefaultStyle() {
+		return mDocument.getDocumentStyles().getDefaultStyle(OdfStyleFamily.TableCell);
+	}
+
+	private OdfDefaultStyle getParagraphDefaultStyle() {
+		return mDocument.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Paragraph);
+	}
+
+	private OdfStyleBase getParentStyle(OdfStyle aStyle) {
+		String parentName = aStyle.getStyleParentStyleNameAttribute();
+		if (parentName == null || parentName.length() == 0)
+			return null;
+		if (parentName.equals("Default"))
+			return getCellDefaultStyle();
+		else
+			return getStyleByName(parentName);
+	}
+
+	private OdfStyle getStyleByName(String name) {
+		OdfStyle styleElement = null;
+		OdfOfficeAutomaticStyles styles = mCellElement.getAutomaticStyles();
+		styleElement = styles.getStyle(name, OdfStyleFamily.TableCell);
+
+		if (styleElement == null) {
+			styleElement = mDocument.getDocumentStyles().getStyle(name, OdfStyleFamily.TableCell);
+		}
+
+		return styleElement;
+	}
+
+	private OdfStyleBase getCurrentUsedStyle() {
+		if (mWritableStyleElement != null)
+			return mWritableStyleElement;
+		else
+			return mStyleElement;
+	}
+
+	/**
+	 * Return the country information for a specific script type
+	 * <p>
+	 * The country information in its parent style and default style will be
+	 * taken into considered.
+	 * <p>
+	 * Null will be returned if there is no country information for this script
+	 * type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the country information for a specific script type
+	 */
+	public String getCountry(ScriptType type) {
+		String country = null;
+		TextProperties textProperties = getTextPropertiesForRead();
+		if (textProperties != null)
+			country = textProperties.getCountry(type);
+		if (country != null && country.length() > 0)
+			return country;
+
+		boolean isDefault = isUseDefaultStyle;
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TextProperties parentStyleSetting = TextProperties.getTextProperties(parentStyle);
+			country = parentStyleSetting.getCountry(type);
+			if (country != null && country.length() > 0)
+				return country;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			TextProperties defaultStyleSetting = TextProperties.getTextProperties(defaultStyle);
+			country = defaultStyleSetting.getCountry(type);
+		}
+		return country;
+	}
+
+	private void mergeFont(Font target, Font source) {
+		// merge font
+		if (target.getFamilyName() == null && source.getFamilyName() != null)
+			target.setFamilyName(source.getFamilyName());
+		if (target.getColor() == null && source.getColor() != null)
+			target.setColor(source.getColor());
+		if (target.getSize() == 0 && source.getSize() > 0)
+			target.setSize(source.getSize());
+		if (target.getFontStyle() == null && source.getFontStyle() != null)
+			target.setFontStyle(source.getFontStyle());
+		if (target.getTextLinePosition() == null && source.getTextLinePosition() != null)
+			target.setTextLinePosition(source.getTextLinePosition());
+	}
+
+	/**
+	 * Return the font definition for a specific script type.
+	 * <p>
+	 * The font definition in its parent style and default style will be taken
+	 * into considered.
+	 * <p>
+	 * A default font definition will be returned if there is no font definition
+	 * for this script type at all.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font definition for a specific script type
+	 */
+	public Font getFont(ScriptType type) {
+		// A font includes font family name, font style, font color, font size
+		Font font = null;
+		TextProperties textProperties = getTextPropertiesForRead();
+		if (textProperties != null)
+			font = textProperties.getFont(type);
+		else
+			font = new Font(null, null, 0, (StyleTypeDefinitions.TextLinePosition) null);
+
+		if (font != null && font.getFamilyName() != null && font.getColor() != null && font.getSize() != 0
+				&& font.getFontStyle() != null && font.getTextLinePosition() != null)
+			return font;
+
+		boolean isDefault = isUseDefaultStyle;
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TextProperties parentStyleSetting = TextProperties.getTextProperties(parentStyle);
+			Font tempFont = parentStyleSetting.getFont(type);
+			mergeFont(font, tempFont);
+			if (font.getFamilyName() != null && font.getColor() != null && font.getSize() > 0
+					&& font.getFontStyle() != null && font.getTextLinePosition() != null) {
+				return font;
+			}
+			// continue to get parent properties
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			// For text document, there is no default table cell style.
+			// So use default font style in default paragraph style.
+			if (defaultStyle == null) {
+				defaultStyle = getParagraphDefaultStyle();
+			}
+			if (defaultStyle != null) {
+				TextProperties defaultStyleSetting = TextProperties.getTextProperties(defaultStyle);
+				Font tempFont = defaultStyleSetting.getFont(type);
+				mergeFont(font, tempFont);
+			}
+		}
+
+		if (font.getColor() == null)
+			font.setColor(Color.BLACK);
+		if (font.getFontStyle() == null)
+			font.setFontStyle(FontStyle.REGULAR);
+		if (font.getTextLinePosition() == null)
+			font.setTextLinePosition(TextLinePosition.REGULAR);
+
+		return font;
+	}
+
+	/**
+	 * Return the language information for a specific script type
+	 * <p>
+	 * The language definition in its parent style and default style will be
+	 * taken into considered.
+	 * <p>
+	 * Null will be returned if there is no language information for this script
+	 * type at all.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the language information for a specific script type
+	 */
+	public String getLanguage(ScriptType type) {
+		String language = null;
+		TextProperties textProperties = getTextPropertiesForRead();
+		if (textProperties != null)
+			language = textProperties.getLanguage(type);
+		if (language != null && language.length() > 0)
+			return language;
+
+		boolean isDefault = isUseDefaultStyle;
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TextProperties parentStyleSetting = TextProperties.getTextProperties(parentStyle);
+			language = parentStyleSetting.getLanguage(type);
+			if (language != null && language.length() > 0)
+				return language;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			TextProperties defaultStyleSetting = TextProperties.getTextProperties(defaultStyle);
+			language = defaultStyleSetting.getLanguage(type);
+		}
+		return language;
+	}
+
+	/**
+	 * Set the country information for a specific script type
+	 * <p>
+	 * The consistency between country and script type is not verified.
+	 * <p>
+	 * If the parameter <code>country</code> is null, the country information
+	 * for this script type will be removed.
+	 * 
+	 * @param country
+	 *            - the country information
+	 * @param type
+	 *            - script type
+	 * @see TextProperties#setCountry(String, Document.ScriptType)
+	 * @see org.odftoolkit.simple.Document.ScriptType
+	 */
+	public void setCountry(String country, ScriptType type) {
+		getTextPropertiesForWrite().setCountry(country, type);
+	}
+
+	/**
+	 * Set the font definition. The locale information in font definition will
+	 * be used to justify the script type.
+	 * <p>
+	 * If the parameter <code>font</code> is null, nothing will be happened.
+	 * 
+	 * @param font
+	 *            - font definition
+	 */
+	public void setFont(Font font) {
+		getTextPropertiesForWrite().setFont(font);
+	}
+
+	/**
+	 * Set the font definition. The locale information in font definition will
+	 * be used to justify the script type.
+	 * <p>
+	 * If the parameter <code>font</code> is null, nothing will be happened.
+	 * 
+	 * @param font
+	 *            - font definition
+	 */
+	public void setFont(Font font, Locale language) {
+		getTextPropertiesForWrite().setFont(font, language);
+	}
+
+	/**
+	 * Set the language information for a specific script type
+	 * <p>
+	 * If the parameter <code>language</code> is null, the language information
+	 * for this script type will be removed.
+	 * 
+	 * @param language
+	 *            - the language information
+	 * @param type
+	 *            - script type
+	 */
+	public void setLanguage(String language, ScriptType type) {
+		getTextPropertiesForWrite().setLanguage(language, type);
+	}
+
+	/**
+	 * Return the background color.
+	 * <p>
+	 * The background color in its parent style and default style will be taken
+	 * into considered.
+	 * <p>
+	 * Color WHITE will be returned if there is no the background color
+	 * definition or the background color definition is not valid.
+	 * 
+	 * @return the background color
+	 */
+	public Color getBackgroundColor() {
+		Color tempColor = null;
+		TableCellProperties properties = getTableCellPropertiesForRead();
+		if (properties != null)
+			tempColor = properties.getBackgroundColor();
+		if (tempColor != null)
+			return tempColor;
+
+		boolean isDefault = isUseDefaultStyle;
+		// find in parent style definition
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TableCellProperties parentStyleSetting = TableCellProperties.getTableCellProperties(parentStyle);
+			tempColor = parentStyleSetting.getBackgroundColor();
+			if (tempColor != null)
+				return tempColor;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		// find in default style definition
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			TableCellProperties defaultStyleSetting = TableCellProperties.getTableCellProperties(defaultStyle);
+			tempColor = defaultStyleSetting.getBackgroundColor();
+		}
+		// use default
+		if (tempColor == null)
+			return Color.WHITE;
+		return tempColor;
+	}
+
+	private Border getNullableBorder(TableCellProperties properties, CellBordersType type) {
+		switch (type) {
+		case LEFT:
+			return properties.getLeftBorder();
+		case RIGHT:
+			return properties.getRightBorder();
+		case TOP:
+			return properties.getTopBorder();
+		case BOTTOM:
+			return properties.getBottomBorder();
+		case DIAGONALBLTR:
+			return properties.getDiagonalBlTr();
+		case DIAGONALTLBR:
+			return properties.getDiagonalTlBr();
+		default:
+			throw new IllegalArgumentException("Only border type with a single border is accepted.");
+		}
+	}
+
+	/**
+	 * Return the border setting for a specific border.
+	 * <p>
+	 * The accepted parameter can be TOP,BOTTOM,LEFT,RIGHT,DIAGONALBLTR and
+	 * DIAGONALTLBR.
+	 * <p>
+	 * The border type with a collection of borders, e.g. ALL_FOUR, LEFT_RIGHT,
+	 * are not legal arguments
+	 * <p>
+	 * The border definition in its parent style and default style will be taken
+	 * into considered.
+	 * <p>
+	 * <code>Border.NONE</code> will be returned if there is no the border
+	 * definition for a specific border.
+	 * 
+	 * @param type
+	 *            - the border type which describes a single border
+	 * @return the border setting
+	 */
+	public Border getBorder(CellBordersType type) {
+
+		Border tempBorder = null;
+		TableCellProperties properties = getTableCellPropertiesForRead();
+		if (properties != null) {
+			tempBorder = getNullableBorder(properties, type);
+		}
+		if (tempBorder != null)
+			return tempBorder;
+
+		boolean isDefault = isUseDefaultStyle;
+		// find in parent style definition
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TableCellProperties parentStyleSetting = TableCellProperties.getTableCellProperties(parentStyle);
+			tempBorder = getNullableBorder(parentStyleSetting, type);
+			;
+			if (tempBorder != null)
+				return tempBorder;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		// find in default style definition
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			TableCellProperties defaultStyleSetting = TableCellProperties.getTableCellProperties(defaultStyle);
+			tempBorder = getNullableBorder(defaultStyleSetting, type);
+		}
+		// use default
+		if (tempBorder == null) {
+			return Border.NONE;
+		}
+		return tempBorder;
+	}
+
+	/**
+	 * Return the vertical alignment.
+	 * <p>
+	 * If there is no vertical alignment definition, DEFAULT will be returned.
+	 * <p>
+	 * The vertical alignment definition in its parent style and default style
+	 * will be taken into considered.
+	 * 
+	 * @return the vertical alignment
+	 */
+	public VerticalAlignmentType getVerticalAlignment() {
+		VerticalAlignmentType tempAlign = null;
+		TableCellProperties properties = getTableCellPropertiesForRead();
+		if (properties != null) {
+			tempAlign = properties.getVerticalAlignment();
+		}
+		if (tempAlign != null)
+			return tempAlign;
+
+		boolean isDefault = isUseDefaultStyle;
+		// find in parent style definition
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TableCellProperties parentStyleSetting = TableCellProperties.getTableCellProperties(parentStyle);
+			tempAlign = parentStyleSetting.getVerticalAlignment();
+			if (tempAlign != null)
+				return tempAlign;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		// find in default style definition
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			TableCellProperties defaultStyleSetting = TableCellProperties.getTableCellProperties(defaultStyle);
+			tempAlign = defaultStyleSetting.getVerticalAlignment();
+		}
+		// use default
+		if (tempAlign == null) {
+			return VerticalAlignmentType.DEFAULT;
+		}
+		return tempAlign;
+	}
+
+	/**
+	 * Return the wrap option of this cell.
+	 * <p>
+	 * The wrap option definition in its parent style and default style will be
+	 * taken into considered.
+	 * 
+	 * @return <code>true</code> if the cell content can be wrapped;
+	 *         <p>
+	 *         <code>false</code> if the cell content cannot be wrapped.
+	 */
+	public boolean isTextWrapped() {
+		Boolean tempBool = null;
+		TableCellProperties properties = getTableCellPropertiesForRead();
+		if (properties != null)
+			tempBool = properties.isWrapped();
+		if (tempBool != null)
+			return tempBool.booleanValue();
+
+		boolean isDefault = isUseDefaultStyle;
+		// find in parent style definition
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			TableCellProperties parentStyleSetting = TableCellProperties.getTableCellProperties(parentStyle);
+			tempBool = parentStyleSetting.isWrapped();
+			if (tempBool != null)
+				return tempBool;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		// find in default style definition
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			TableCellProperties defaultStyleSetting = TableCellProperties.getTableCellProperties(defaultStyle);
+			tempBool = defaultStyleSetting.isWrapped();
+		}
+		// use default
+		if (tempBool == null)
+			return false;
+		return tempBool.booleanValue();
+	}
+
+	/**
+	 * Set the background color of this cell.
+	 * 
+	 * @param color
+	 *            - the background color that need to set. If <code>color</code>
+	 *            is null, background color setting will be removed.
+	 */
+	public void setBackgroundColor(Color color) {
+		getTableCellPropertiesForWrite().setBackgroundColor(color);
+	}
+
+	/**
+	 * Set the border style of this cell. You can set the border style for a
+	 * single border or a border collection.
+	 * <p>
+	 * The second parameter <code>bordersType</code> describes which borders you
+	 * want to apply the style to, e.g. up border, bottom border, left border,
+	 * right border, diagonal lines or four borders.
+	 * 
+	 * @param border
+	 *            - the border style description
+	 * @param bordersType
+	 *            - the type of the borders
+	 */
+	public void setBorders(Border border, CellBordersType bordersType) {
+		getTableCellPropertiesForWrite().setBorders(bordersType, border);
+	}
+
+	/**
+	 * Set the vertical alignment setting of this cell.
+	 * <p>
+	 * If the alignment is set as Default or null, the explicit vertical
+	 * alignment setting is removed.
+	 * 
+	 * @param alignType
+	 *            - the vertical alignment setting.
+	 */
+	public void setVerticalAlignment(VerticalAlignmentType alignType) {
+		getTableCellPropertiesForWrite().setVerticalAlignment(alignType);
+	}
+
+	/**
+	 * Set the wrap option of this cell.
+	 * 
+	 * @param isWrapped
+	 *            - whether the cell content can be wrapped or not
+	 */
+	public void setTextWrapped(boolean isWrapped) {
+		getTableCellPropertiesForWrite().setWrapped(isWrapped);
+	}
+
+	/**
+	 * Set the horizontal alignment.
+	 * <p>
+	 * If the parameter <code>alignType</code> is null, the horizontal alignment
+	 * setting will be removed.
+	 * 
+	 * @param alignType
+	 *            - the horizontal alignment
+	 */
+	public void setHorizontalAlignment(HorizontalAlignmentType alignType) {
+		getParagraphPropertiesForWrite().setHorizontalAlignment(alignType);
+	}
+
+	/**
+	 * Return the horizontal alignment.
+	 * <p>
+	 * The horizontal alignment in its parent style and default style will be
+	 * taken into considered.
+	 * <p>
+	 * DEFAULT will be returned if there is no horizontal alignment setting.
+	 * 
+	 * @return - the horizontal alignment; null if there is no horizontal
+	 *         alignment setting.
+	 */
+	public HorizontalAlignmentType getHorizontalAlignment() {
+		HorizontalAlignmentType tempAlign = null;
+		ParagraphProperties properties = getParagraphPropertiesForRead();
+		if (properties != null)
+			tempAlign = properties.getHorizontalAlignment();
+		if (tempAlign != null)
+			return tempAlign;
+
+		boolean isDefault = isUseDefaultStyle;
+		// find in parent style definition
+		OdfStyleBase parentStyle = null;
+		if (!isDefault)
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		while ((!isDefault) && (parentStyle != null)) {
+			ParagraphProperties parentStyleSetting = ParagraphProperties.getParagraphProperties(parentStyle);
+			tempAlign = parentStyleSetting.getHorizontalAlignment();
+			if (tempAlign != null)
+				return tempAlign;
+
+			if (parentStyle instanceof OdfDefaultStyle)
+				isDefault = true;
+			else
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+		}
+		// find in default style definition
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getCellDefaultStyle();
+			ParagraphProperties defaultStyleSetting = ParagraphProperties.getParagraphProperties(defaultStyle);
+			tempAlign = defaultStyleSetting.getHorizontalAlignment();
+		}
+		// use default
+		if (tempAlign == null)
+			return HorizontalAlignmentType.DEFAULT;
+		return tempAlign;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellValueAdapter.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellValueAdapter.java
new file mode 100644
index 0000000..0a65416
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/CellValueAdapter.java
@@ -0,0 +1,51 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+/**
+ * This interface supplies a method which can adapt string content to a more
+ * proper cell value type as need. This a very useful function in
+ * {@link org.odftoolkit.simple.table.Cell#setDisplayText(String, CellValueAdapter)
+ * Cell.setDisplayText} and table cell text replacement. For example, if a table
+ * cell would be replaced with string "1234" in text navigation, the cell value
+ * type can be adapted to "float" automatically with the help of
+ * <code>CellValueAdapter</code>. </br>
+ * Different adapter realizations have different adaptive rules.
+ * 
+ * @see org.odftoolkit.simple.table.Cell#setDisplayText
+ * @see org.odftoolkit.simple.common.navigation.CellSelection
+ * 
+ * @since 0.3
+ */
+public interface CellValueAdapter {
+	
+	/**
+	 * The default cell value adapter.
+	 */
+	public static final CellValueAdapter DEFAULT_VALUE_ADAPTER = new DefaultCellValueAdapter();
+	
+	/**
+	 * Adapt string content to a more proper cell value type as need.
+	 * 
+	 * @param cell  the cell need to value adapt.
+	 * @param value the value to be adapted.
+	 */
+	public void adaptValue(Cell cell, String value);
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/Column.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Column.java
new file mode 100644
index 0000000..e52291f
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Column.java
@@ -0,0 +1,553 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableColumnProperties;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.w3c.dom.Node;
+
+/**
+ * Column represents table column feature in ODF document.
+ * <p>
+ * Column provides methods to get table cells that belong to this table column.
+ */
+public class Column extends Component {
+
+	TableTableColumnElement maColumnElement;
+	int mnRepeatedIndex;
+	private static final String DEFAULT_WIDTH = "0in";
+	private final int DEFAULT_REL_TABLE_WIDTH = 65535;
+	private Document mDocument;
+
+	/**
+	 * Construct the <code>Column</code> feature.
+	 * 
+	 * @param odfElement
+	 *            the element that can construct this table column
+	 * @param repeatedIndex
+	 *            the index in the repeated columns
+	 */
+	Column(TableTableColumnElement colElement, int repeatedIndex) {
+		maColumnElement = colElement;
+		mnRepeatedIndex = repeatedIndex;
+		mDocument = (Document) ((OdfFileDom) maColumnElement.getOwnerDocument()).getDocument();
+	}
+
+	/**
+	 * Get the <code>Column</code> instance from the
+	 * <code>TableTableColumnElement</code> instance.
+	 * <p>
+	 * Each <code>TableTableColumnElement</code> instance has a one-to-one
+	 * relationship to the a <code>Column</code> instance.
+	 * 
+	 * @param colElement
+	 *            the column element that need to get the corresponding
+	 *            <code>Column</code> instance
+	 * @return the <code>Column</code> instance represent the specified column
+	 *         element
+	 */
+	public static Column getInstance(TableTableColumnElement colElement) {
+		TableTableElement tableElement = null;
+		Node node = colElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				tableElement = (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		Table table = null;
+		if (tableElement != null) {
+			table = Table.getInstance(tableElement);
+		} else {
+			throw new IllegalArgumentException("the colElement is not in the table dom tree");
+		}
+
+		Column column = table.getColumnInstance(colElement, 0);
+		if (column.getColumnsRepeatedNumber() > 1) {
+			Logger.getLogger(Column.class.getName()).log(
+					Level.WARNING,
+					"the column has the repeated column number, and puzzled about get which repeated index of the column,"
+							+ "here just return the first column of the repeated columns.");
+		}
+		return column;
+	}
+
+	/**
+	 * Get the <code>TableTableElement</code> who contains this cell.
+	 * 
+	 * @return the table that contains the cell.
+	 */
+	private TableTableElement getTableElement() {
+		Node node = maColumnElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				return (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	/**
+	 * Get owner table of the current column.
+	 * 
+	 * @return the parent table of this column
+	 */
+	public Table getTable() {
+		TableTableElement tableElement = getTableElement();
+		if (tableElement != null) {
+			return Table.getInstance(tableElement);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the width of the column (in Millimeter).
+	 * 
+	 * @return the width of the current column (in Millimeter).
+	 */
+	public double getWidth() {
+		String sWidth = maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+		if (sWidth == null) {
+			sWidth = DEFAULT_WIDTH;
+		}
+		return PositiveLength.parseDouble(sWidth, Unit.MILLIMETER) ;
+	}
+
+	/**
+	 * Set the width of the column (in Millimeter).
+	 * 
+	 * @param width
+	 *            the width that will be set to the column (in Millimeter).
+	 */
+	public void setWidth(double width) {
+		double roundingFactor = 10000.0;
+		//TODO:need refactor to PositiveLength.
+		double inValue = Math.round(roundingFactor * width / Unit.INCH.unitInMillimiter()) / roundingFactor;
+		String sWidthIN = String.valueOf(inValue) + Unit.INCH.abbr();
+		//width before modification
+		double columnWidth = getWidth();
+		if(columnWidth < 0)	{
+			columnWidth = 0;
+		}
+		splitRepeatedColumns();
+		maColumnElement.setProperty(OdfTableColumnProperties.ColumnWidth, sWidthIN);
+
+		Table table = getTable();
+		// check if need set relative width
+		if (!(table.getOwnerDocument() instanceof SpreadsheetDocument)) {
+			int index = getColumnIndex();
+			int columnCount = table.getColumnCount();
+			if (index == columnCount-1) {
+				//if the column to resize is the rightmost
+				index = index - 1;
+			} else {
+				index = index + 1;
+			}
+			if (index >= 0) {
+				Column column = null;
+				if (index < columnCount) {
+					column = table.getColumnByIndex(index);
+				} else if (columnCount >= 2) {
+					column = table.getColumnByIndex(columnCount - 2);
+				}
+
+				double nextColumnWidth = 0;
+				if (column != null) {
+					nextColumnWidth = column.getWidth();
+					setRelativeWidth((long) (DEFAULT_REL_TABLE_WIDTH / table.getWidth() * width));
+				}
+
+				// total width of two columns
+				double columnsWidth = nextColumnWidth + columnWidth;
+				// calculates the new width of the next / previous column
+				double newWidthNextColumn = columnsWidth - width;
+				if (newWidthNextColumn < 0) {
+					newWidthNextColumn = 0;
+				}
+				inValue = Math.round(roundingFactor * newWidthNextColumn / Unit.INCH.unitInMillimiter())
+						/ roundingFactor;
+				sWidthIN = String.valueOf(inValue) + Unit.INCH.abbr();
+				column.getOdfElement().setProperty(OdfTableColumnProperties.ColumnWidth, sWidthIN);
+				double relWidth = (DEFAULT_REL_TABLE_WIDTH / table.getWidth()) * newWidthNextColumn;
+				column.setRelativeWidth((long)relWidth);
+			}
+		}
+	}
+
+	// if one of the repeated column want to change something
+	// then this repeated column have to split to repeated number columns
+	// the maColumnElement should also be updated according to the original
+	// index in the repeated column
+	void splitRepeatedColumns() {
+		Table table = getTable();
+		TableTableElement tableEle = table.getOdfElement();
+		int repeateNum = getColumnsRepeatedNumber();
+		if (repeateNum > 1) {
+			// change this repeated column to several single columns
+			TableTableColumnElement ownerColumnElement = null;
+			String columnWidthStr = null;
+			long columnWidth = 0;
+			int repeatedColumnIndex = mnRepeatedIndex;
+			Node refElement = maColumnElement;
+			maColumnElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+			String originalWidth = maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+			String originalRelWidth = maColumnElement.getProperty(OdfTableColumnProperties.RelColumnWidth);
+			if (originalWidth != null) {
+				columnWidthStr = Length.mapToUnit(originalWidth, Unit.MILLIMETER);
+				columnWidth = PositiveLength.parseLong(columnWidthStr, Unit.MILLIMETER);
+			}
+			for (int i = repeateNum - 1; i >= 0; i--) {
+				TableTableColumnElement newColumn = (TableTableColumnElement) OdfXMLFactory.newOdfElement(
+						(OdfFileDom) maColumnElement.getOwnerDocument(), OdfName.newName(OdfDocumentNamespace.TABLE,
+								"table-column"));
+				if (originalWidth != null && originalWidth.length() > 0) {
+					newColumn.setProperty(OdfTableColumnProperties.ColumnWidth, originalWidth);
+				}
+				if (originalRelWidth != null && originalRelWidth.length() > 0) {
+					long relWidth = (long) ((DEFAULT_REL_TABLE_WIDTH / table.getWidth()) *	columnWidth);
+					newColumn.setProperty(OdfTableColumnProperties.RelColumnWidth, String.valueOf(relWidth) + "*");
+				}
+				tableEle.insertBefore(newColumn, refElement);
+				refElement = newColumn;
+				if (repeatedColumnIndex == i) {
+					ownerColumnElement = newColumn;
+				} else {
+					table.updateColumnRepository(maColumnElement, i, newColumn, 0);
+				}
+			}
+			// remove this column element
+			tableEle.removeChild(maColumnElement);
+
+			if (ownerColumnElement != null) {
+				table.updateColumnRepository(maColumnElement, mnRepeatedIndex, ownerColumnElement, 0);
+				// update column element.
+				maColumnElement = ownerColumnElement;
+			}
+		}
+	}
+
+//	private long getRelativeWidth() {
+//		String sRelWidth = maColumnElement.getProperty(OdfTableColumnProperties.RelColumnWidth);
+//		if (sRelWidth != null) {
+//			if (sRelWidth.contains("*")) {
+//				Long value = Long.valueOf(sRelWidth.substring(0, sRelWidth.indexOf("*")));
+//				return value.longValue();
+//			}
+//		}
+//		return 0;
+//	}
+
+	private void setRelativeWidth(long relWidth) {
+		if (relWidth < 40) {
+			maColumnElement.setProperty(OdfTableColumnProperties.RelColumnWidth, String.valueOf(40) + "*");
+		} else {
+			maColumnElement.setProperty(OdfTableColumnProperties.RelColumnWidth, String.valueOf(relWidth) + "*");
+		}
+	}
+
+	/**
+	 * Returns if the column always keeps its optimal width.
+	 * 
+	 * @return true if the column always keeps its optimal width; vice versa
+	 */
+	public boolean isOptimalWidth() {
+		return Boolean.parseBoolean(maColumnElement.getProperty(OdfTableColumnProperties.UseOptimalColumnWidth));
+	}
+
+	/**
+	 * Set if the column always keeps its optimal width.
+	 * 
+	 * @param isUseOptimalWidth
+	 *            the flag that indicate column should keep its optimal width or
+	 *            not
+	 */
+	public void setUseOptimalWidth(boolean isUseOptimalWidth) {
+		maColumnElement.setProperty(OdfTableColumnProperties.UseOptimalColumnWidth, String.valueOf(isUseOptimalWidth));
+	}
+
+	/**
+	 * Return an instance of <code>TableTableColumnElement</code> which
+	 * represents this feature.
+	 * 
+	 * @return an instance of <code>TableTableColumnElement</code>
+	 */
+	public TableTableColumnElement getOdfElement() {
+		return maColumnElement;
+	}
+
+	/**
+	 * Get the count of cells in this column.
+	 * 
+	 * @return the cells count in the current column
+	 */
+	public int getCellCount() {
+		return getTable().getRowCount();
+	}
+
+	/**
+	 * Get a cell with a specific index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the cell index in this column
+	 * @return the cell object in the given cell index
+	 */
+	public Cell getCellByIndex(int index) {
+		return getTable().getCellByPosition(getColumnIndex(), index);
+	}
+
+	/**
+	 * Get the previous column of the current column.
+	 * 
+	 * @return the previous column before this column in the owner table
+	 */
+	public Column getPreviousColumn() {
+		Table table = getTable();
+		// the column has repeated column number > 1
+		if (maColumnElement.getTableNumberColumnsRepeatedAttribute().intValue() > 1) {
+			if (mnRepeatedIndex > 0) {
+				return table.getColumnInstance(maColumnElement, mnRepeatedIndex - 1);
+			}
+		}
+		// the column has repeated column number > 1 && the index is 0
+		// or the column has repeated column num = 1
+		Node aPrevNode = maColumnElement.getPreviousSibling();
+		Node aCurNode = maColumnElement;
+		while (true) {
+			if (aPrevNode == null) {
+				// does not have previous sibling, then get the parent
+				// because aCurNode might be the child element of
+				// table-header-columns, table-columns, table-column-group
+				Node parentNode = aCurNode.getParentNode();
+				// if the parent is table, then it means that this column is the
+				// first column in this table
+				// it has no previous column
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aPrevNode = parentNode.getPreviousSibling();
+			}
+			// else the parent node might be table-header-columns,
+			// table-columns, table-column-group
+			if (aPrevNode != null) {
+				try {
+					if (aPrevNode instanceof TableTableColumnElement) {
+						return table.getColumnInstance((TableTableColumnElement) aPrevNode,
+								((TableTableColumnElement) aPrevNode).getTableNumberColumnsRepeatedAttribute()
+										.intValue() - 1);
+					} else if (aPrevNode instanceof TableTableColumnsElement
+							|| aPrevNode instanceof TableTableHeaderColumnsElement
+							|| aPrevNode instanceof TableTableColumnGroupElement) {
+						XPath xpath = ((OdfFileDom) maColumnElement.getOwnerDocument()).getXPath();
+						TableTableColumnElement lastCol = (TableTableColumnElement) xpath.evaluate(
+								"//table:table-column[last()]", aPrevNode, XPathConstants.NODE);
+						if (lastCol != null) {
+							return table.getColumnInstance(lastCol, lastCol.getTableNumberColumnsRepeatedAttribute()
+									.intValue() - 1);
+						}
+					} else {
+						aCurNode = aPrevNode;
+						aPrevNode = aPrevNode.getPreviousSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(Column.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get the next column of the current column.
+	 * 
+	 * @return the next column after this column in the owner table
+	 */
+	public Column getNextColumn() {
+		Table table = getTable();
+		// the column has repeated column number > 1
+		int columnsRepeatedNumber = getColumnsRepeatedNumber();
+		if (columnsRepeatedNumber > 1) {
+			if (mnRepeatedIndex < (columnsRepeatedNumber - 1)) {
+				return table.getColumnInstance(maColumnElement, mnRepeatedIndex + 1);
+			}
+		}
+		Node aNextNode = maColumnElement.getNextSibling();
+		Node aCurNode = maColumnElement;
+		while (true) {
+			if (aNextNode == null) {
+				// does not have next sibling, then get the parent
+				// because aCurNode might be the child element of
+				// table-header-columns, table-columns, table-column-group
+				Node parentNode = aCurNode.getParentNode();
+				// if the parent is table, then it means that this column is the
+				// last column in this table
+				// it has no next column
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aNextNode = parentNode.getNextSibling();
+			}
+			// else the parent node might be table-header-columns,
+			// table-columns, table-column-group
+			if (aNextNode != null) {
+				try {
+					if (aNextNode instanceof TableTableColumnElement) {
+						return table.getColumnInstance((TableTableColumnElement) aNextNode, 0);
+					} else if (aNextNode instanceof TableTableColumnsElement
+							|| aNextNode instanceof TableTableHeaderColumnsElement
+							|| aNextNode instanceof TableTableColumnGroupElement) {
+						XPath xpath = ((OdfFileDom) maColumnElement.getOwnerDocument()).getXPath();
+						TableTableColumnElement firstCol = (TableTableColumnElement) xpath.evaluate(
+								"//table:table-column[first()]", aNextNode, XPathConstants.NODE);
+						if (firstCol != null) {
+							return table.getColumnInstance(firstCol, 0);
+						}
+					} else {
+						aCurNode = aNextNode;
+						aNextNode = aNextNode.getNextSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(Column.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get the index of this column in the owner table.
+	 * 
+	 * @return the index of the column
+	 */
+	public int getColumnIndex() {
+		int result = 0;
+		Table table = getTable();
+		TableTableColumnElement columnEle;
+		TableTableElement mTableElement = table.getOdfElement();
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableColumnElement) {
+						columnEle = (TableTableColumnElement) m;
+						if (columnEle == getOdfElement()) {
+							return result + mnRepeatedIndex;
+						}
+						if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+							result += 1;
+						} else {
+							result += columnEle.getTableNumberColumnsRepeatedAttribute();
+						}
+					}
+				}
+			}
+			if (n instanceof TableTableColumnElement) {
+				columnEle = (TableTableColumnElement) n;
+				if (columnEle == getOdfElement()) {
+					break;
+				}
+				if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+					result += 1;
+				} else {
+					result += columnEle.getTableNumberColumnsRepeatedAttribute();
+				}
+			}
+		}
+		return result + mnRepeatedIndex;
+	}
+
+	/**
+	 * Set the default cell style to this column.
+	 * <p>
+	 * The style should already exist in this document.
+	 * <p>
+	 * This method is not recommended for text document cases. These is a style
+	 * assigned to each cell in tables under text documents. So setting the
+	 * default cell style to a column may not work.
+	 * 
+	 * @param style
+	 *            the cell style of the document
+	 */
+	public void setDefaultCellStyle(OdfStyle style) {
+		splitRepeatedColumns();
+		OdfStyle defaultStyle = getDefaultCellStyle();
+		if (defaultStyle != null) {
+			defaultStyle.removeStyleUser(maColumnElement);
+		}
+
+		if (style != null) {
+			style.addStyleUser(maColumnElement);
+			maColumnElement.setTableDefaultCellStyleNameAttribute(style.getStyleNameAttribute());
+		}
+	}
+
+	/**
+	 * Get the default cell style of this column.
+	 * 
+	 * @return the default cell style of this column
+	 */
+	public OdfStyle getDefaultCellStyle() {
+		String styleName = maColumnElement.getTableDefaultCellStyleNameAttribute();
+		OdfStyle style = maColumnElement.getAutomaticStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+
+		if (style == null) {
+			style = mDocument.getDocumentStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+		}
+		return style;
+	}
+
+	// note: we have to use this method to modify the column repeated number
+	// in order to update mnRepeatedIndex of the each column
+	void setColumnsRepeatedNumber(int num) {
+		// update the mnRepeatedIndex for the ever repeated column
+		maColumnElement.setTableNumberColumnsRepeatedAttribute(Integer.valueOf(num));
+	}
+
+	int getColumnsRepeatedNumber() {
+		Integer count = maColumnElement.getTableNumberColumnsRepeatedAttribute();
+		if (count == null) {
+			return 1;
+		} else {
+			return count.intValue();
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/DefaultCellValueAdapter.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/DefaultCellValueAdapter.java
new file mode 100644
index 0000000..20b8cdb
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/DefaultCellValueAdapter.java
@@ -0,0 +1,213 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * This is a default realization of {@link CellValueAdapter CellValueAdapter}.
+ * It will adapt cell string content as common rule.
+ * 
+ * @see CellValueAdapter
+ * 
+ * @since 0.3
+ */
+public class DefaultCellValueAdapter implements CellValueAdapter{
+	
+	/**
+	 * The default date format of table cell.
+	 */
+	private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+	
+	/**
+	 * The default time format of table cell.
+	 */
+	private static final String DEFAULT_TIME_FORMAT = "'PT'HH'H'mm'M'ss'S'";
+	
+	/**
+	 * The default percent format of table cell.
+	 */
+	private static final String DEFAULT_PERCENT_FORMAT = "0%";
+	
+	/**
+	 * The default currency format of table cell.
+	 */
+	private static final String DEFAULT_CURRENCY_FORMAT = "$#,##0.00;-$#,##0.00";
+	
+	/* (non-Javadoc)
+	 * @see org.odftoolkit.simple.table.CellValueAdapter#adaptValue()
+	 */
+	public void adaptValue(Cell cell, String value){
+		String type = cell.getValueType();
+		String formatStr = cell.getFormatString();
+		if ("boolean".equals(type)) {
+			if ("true".equalsIgnoreCase(value)) {
+				cell.setBooleanValue(Boolean.TRUE);
+			} else if ("false".equalsIgnoreCase(value)) {
+				cell.setBooleanValue(Boolean.FALSE);
+			} else {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			}
+		} else if ("currency".equals(type)) {
+			if (formatStr == null) {
+				formatStr = DEFAULT_CURRENCY_FORMAT;
+			}
+			try {
+				DecimalFormat decimalFormat = new DecimalFormat(formatStr);
+				Number number = decimalFormat.parse(value);
+				cell.setCurrencyValue(number.doubleValue(), cell.getCurrencyCode());
+				cell.setCurrencyFormat(cell.getCurrencySymbol(), formatStr);
+			} catch (ParseException e) {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			}
+		} else if ("date".equals(type)) {
+			if (formatStr == null) {
+				formatStr = DEFAULT_DATE_FORMAT;
+			}
+			try {
+				SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr);
+				Date date = simpleDateFormat.parse(value);
+				Calendar calender = Calendar.getInstance();
+				calender.setTime(date);
+				cell.setDateValue(calender);
+			} catch (ParseException e) {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			}
+		} else if ("float".equals(type)) {
+			try {
+				if (formatStr != null) {
+					DecimalFormat decimalFormat = new DecimalFormat(formatStr);
+					Number number = decimalFormat.parse(value);
+					cell.setDoubleValue(number.doubleValue());
+				} else {
+					Double doubleValue = Double.parseDouble(value);
+					cell.setDoubleValue(doubleValue);
+				}
+			} catch (ParseException e) {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			} catch (NumberFormatException e) {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			}
+		} else if ("percentage".equals(type)) {
+			if (formatStr == null) {
+				formatStr = DEFAULT_PERCENT_FORMAT;
+			}
+			try {
+				DecimalFormat decimalFormat = new DecimalFormat(formatStr);
+				Number number = decimalFormat.parse(value);
+				cell.setPercentageValue(number.doubleValue());
+			} catch (ParseException e) {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			}
+		} else if ("time".equals(type)) {
+			if (formatStr == null) {
+				formatStr = DEFAULT_TIME_FORMAT;
+			}
+			try {
+				SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr);
+				Date time = simpleDateFormat.parse(value);
+				Calendar calender = Calendar.getInstance();
+				calender.setTime(time);
+				cell.setTimeValue(calender);
+			} catch (ParseException e) {
+				cell.setValueType("string");
+				adaptValue(cell, value);
+			}
+		} else {
+			// for string and void
+			// adapt boolean
+			if ("true".equalsIgnoreCase(value)) {
+				cell.setBooleanValue(Boolean.TRUE);
+			} else if ("false".equalsIgnoreCase(value)) {
+				cell.setBooleanValue(Boolean.FALSE);
+			} else {
+				// adapt date
+				String[] dateFormats = { "MM/dd/yyyy", "MMM d, yyyy", "yyyy-MM-dd", "MM/dd/yy" };
+				for (String dateFormat : dateFormats) {
+					try {
+						SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
+						Date date = simpleDateFormat.parse(value);
+						Calendar calender = Calendar.getInstance();
+						calender.setTime(date);
+						cell.setDateValue(calender);
+						cell.setFormatString(dateFormat);
+						return;
+					} catch (ParseException e) {
+						continue;
+					}
+				}
+				// adapt time
+				String[] timeFormats = { "MM/dd/yyyy HH:mm:ss", "yyyy-MM-dd HH:mm:ss", "HH:mm:ss", "HH:mm a", "HH:mm"};
+				for (String timeFormat : timeFormats) {
+					try {
+						SimpleDateFormat simpleDateFormat = new SimpleDateFormat(timeFormat);
+						Date time = simpleDateFormat.parse(value);
+						Calendar calender = Calendar.getInstance();
+						calender.setTime(time);
+						cell.setTimeValue(calender);
+						cell.setFormatString(timeFormat);
+						return;
+					} catch (ParseException e) {
+						continue;
+					}
+				}
+				// adapt percent
+				String[] percentFormats = { "0.00%"/*, "0%"*/ };
+				for (String percentFormat : percentFormats) {
+					try {
+						DecimalFormat decimalFormat = new DecimalFormat(percentFormat);
+						Number number = decimalFormat.parse(value);
+						cell.setPercentageValue(number.doubleValue());
+						cell.setFormatString(percentFormat);
+						return;
+					} catch (ParseException e) {
+						continue;
+					}
+				}
+				// adapt float
+				String[] floatFormats = { /*"#,###.00", "#,##0.00", */"#,##0"/*, "0.00", "0" */};
+				for (String floatStr : floatFormats) {
+					try {
+						DecimalFormat decimalFormat = new DecimalFormat(floatStr);
+						Number number = decimalFormat.parse(value);
+						cell.setDoubleValue(number.doubleValue());
+						cell.setFormatString(floatStr);
+						return;
+					} catch (ParseException e) {
+						continue;
+					}
+				}
+				//TODO: adapt currency
+				// adapt string
+				cell.setStringValue(value);
+			}
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/DomNodeList.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/DomNodeList.java
new file mode 100644
index 0000000..aca7814
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/DomNodeList.java
@@ -0,0 +1,47 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple.table;
+
+import java.util.AbstractList;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+class DomNodeList extends AbstractList<Node> {
+    
+    private NodeList m_nodeList;
+    
+    /** Creates a new instance of NodeList */
+    public DomNodeList(NodeList list) {
+        m_nodeList = list;
+    }
+
+    @Override
+	public int size() {
+        return m_nodeList.getLength();
+    }
+
+    @Override
+	public Node get(int index) {
+        return m_nodeList.item(index);
+    }    
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/Row.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Row.java
new file mode 100644
index 0000000..b261bb3
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Row.java
@@ -0,0 +1,1000 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableRowProperties;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+
+/**
+ * Row represents table row feature in ODF document.
+ * <p>
+ * Row provides methods to get table cells that belong to this table row.
+ */
+public class Row extends Component {
+
+	// boolean mbVisible;
+	TableTableRowElement maRowElement;
+	int mnRepeatedIndex;
+	int mRowsRepeatedNumber = -1;
+
+	private static final String DEFAULT_HEIGHT = "0.30in";
+	private Document mDocument;
+
+	/**
+	 * Construct the <code>Row</code> feature.
+	 * 
+	 * @param rowElement
+	 *            the row element represent this row
+	 * @param repeatedIndex
+	 *            the index in the repeated rows
+	 */
+	Row(TableTableRowElement rowElement, int repeatedIndex) {
+		maRowElement = rowElement;
+		mnRepeatedIndex = repeatedIndex;
+		mDocument = (Document) ((OdfFileDom) maRowElement.getOwnerDocument()).getDocument();
+	}
+
+	/**
+	 * Get the <code>Row</code> instance from the
+	 * <code>TableTableRowElement</code> instance.
+	 * <p>
+	 * Each <code>TableTableRowElement</code> instance has a one-to-one
+	 * relationship to a <code>Row</code> instance.
+	 * 
+	 * @param rowElement
+	 *            the row element that need to get the corresponding
+	 *            <code>Row</code> instance
+	 * @return the <code>Row</code> instance represent the specified row element
+	 */
+	public static Row getInstance(TableTableRowElement rowElement) {
+		TableTableElement tableElement = null;
+		Node node = rowElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				tableElement = (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		Table table = null;
+		if (tableElement != null) {
+			table = Table.getInstance(tableElement);
+		} else {
+			throw new IllegalArgumentException("the rowElement is not in the table dom tree");
+		}
+		Row row = table.getRowInstance(rowElement, 0);
+		if (row.getRowsRepeatedNumber() > 1) {
+			Logger.getLogger(Row.class.getName()).log(
+					Level.WARNING,
+					"the row has the repeated row number, and puzzled about get which repeated index of the row,"
+							+ "here just return the first row of the repeated rows.");
+		}
+		return row;
+	}
+
+	/**
+	 * Get the <code>TableTableElement</code> who contains this row.
+	 * 
+	 * @return the table element that contains the row.
+	 */
+	private TableTableElement getTableElement() {
+		Node node = maRowElement.getParentNode();
+		while (node != null) {
+			if (node instanceof TableTableElement) {
+				return (TableTableElement) node;
+			}
+			node = node.getParentNode();
+		}
+		return null;
+	}
+
+	/**
+	 * Get owner table of the current row.
+	 * 
+	 * @return the parent table of this row
+	 */
+	public Table getTable() {
+		TableTableElement tableElement = getTableElement();
+		if (tableElement != null) {
+			return Table.getInstance(tableElement);
+		}
+		return null;
+	}
+
+	/**
+	 * Return the height of the row (in Millimeter).
+	 * <p>
+	 * Return the minimal height, if the row height is not set,
+	 * 
+	 * @return the height of the current row (in Millimeter).
+	 */
+	public double getHeight() {
+		String sHeight = maRowElement.getProperty(OdfTableRowProperties.RowHeight);
+		if (sHeight == null) {
+			sHeight = maRowElement.getProperty(OdfTableRowProperties.MinRowHeight);
+		}
+		if (sHeight == null) {
+			sHeight = DEFAULT_HEIGHT;
+		}
+		return PositiveLength.parseDouble(sHeight, Unit.MILLIMETER);
+	}
+
+	/**
+	 * Set the height/minimal height of the row (in Millimeter) according to the
+	 * second parameter.
+	 * 
+	 * @param height
+	 *            the height/minimal height that will be set to the row (in
+	 *            Millimeter).
+	 * @param isMinHeight
+	 *            if it is true, the row can fit the height to the text, vice
+	 *            versa.
+	 */
+	public void setHeight(double height, boolean isMinHeight) {
+		double roundingFactor = 10000.0;
+		OdfStyleProperty rowHeightProp = isMinHeight ? OdfTableRowProperties.MinRowHeight : OdfTableRowProperties.RowHeight;
+		// TODO:need refactor to PositiveLength.
+		double inValue = Math.round(roundingFactor * height / Unit.INCH.unitInMillimiter()) / roundingFactor;
+		String sHeightIN = String.valueOf(inValue) + Unit.INCH.abbr();
+		splitRepeatedRows();
+		maRowElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+		maRowElement.setProperty(rowHeightProp, sHeightIN);
+	}
+
+	// if one of the repeated row want to change something
+	// then this repeated row have to split to repeated number rows
+	// the maRowElement/mnRepeatedIndex should also be updated according to the
+	// original index in the repeated column
+	void splitRepeatedRows() {
+		int repeateNum = getRowsRepeatedNumber();
+		if (repeateNum > 1) {
+			// change this repeated row to three parts: repeated row before, new
+			// single row and repeated row after.
+			Node rowOwnerElement = maRowElement.getParentNode();
+			Table table = getTable();
+			Map<TableTableRowElement, Vector<Row>> rowRepository = table.mRowRepository;
+			Map<TableTableCellElementBase, Vector<Cell>> cellRepository = table.mCellRepository;
+			String tableNameSpaceURI = OdfDocumentNamespace.TABLE.getUri();
+			Vector<Row> oldList = null;
+			if (rowRepository.containsKey(maRowElement)) {
+				oldList = rowRepository.remove(maRowElement);
+			}
+			int offetAfterCurrentRow = repeateNum - mnRepeatedIndex - 1;
+			TableTableRowElement currentRowElement = null;
+			TableTableRowElement newBeforeRowElement = null;
+			TableTableRowElement newAfterRowElement = null;
+			List<TableTableCellElementBase> newBeforeCellElements = new ArrayList<TableTableCellElementBase>();
+			List<TableTableCellElementBase> newCurrentCellElements = new ArrayList<TableTableCellElementBase>();
+			List<TableTableCellElementBase> newAfterCellElements = new ArrayList<TableTableCellElementBase>();
+			if (mnRepeatedIndex > 0) {
+				newBeforeRowElement = (TableTableRowElement) maRowElement.cloneNode(true);
+				if (mnRepeatedIndex > 1) {
+					newBeforeRowElement.setTableNumberRowsRepeatedAttribute(mnRepeatedIndex);
+				} else {
+					newBeforeRowElement.removeAttributeNS(tableNameSpaceURI, "number-rows-repeated");
+				}
+				// insert new before repeated row
+				rowOwnerElement.insertBefore(newBeforeRowElement, maRowElement);
+				// update row cache
+				if (oldList != null) {
+					Vector<Row> newBeforeList = new Vector<Row>(mnRepeatedIndex);
+					for (int i = 0; i < mnRepeatedIndex && i < oldList.size(); i++) {
+						Row beforeRow = oldList.get(i);
+						if (beforeRow != null) {
+							beforeRow.maRowElement = newBeforeRowElement;
+							beforeRow.mRowsRepeatedNumber = -1;
+							newBeforeList.add(i, beforeRow);
+						}
+					}
+					rowRepository.put(newBeforeRowElement, newBeforeList);
+					// create new cell element map.
+					for (Node n : new DomNodeList(newBeforeRowElement.getChildNodes())) {
+						int columnsRepeatedNumber = ((TableTableCellElementBase) n)
+								.getTableNumberColumnsRepeatedAttribute();
+						for (int i = 0; i < columnsRepeatedNumber; i++) {
+							newBeforeCellElements.add((TableTableCellElementBase) n);
+						}
+					}
+				}
+			}
+			currentRowElement = (TableTableRowElement) maRowElement.cloneNode(true);
+			currentRowElement.removeAttributeNS(tableNameSpaceURI, "number-rows-repeated");
+			rowOwnerElement.insertBefore(currentRowElement, maRowElement);
+			// create new cell element map.
+			for (Node n : new DomNodeList(currentRowElement.getChildNodes())) {
+				int columnsRepeatedNumber = ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute();
+				for (int i = 0; i < columnsRepeatedNumber; i++) {
+					newCurrentCellElements.add((TableTableCellElementBase) n);
+				}
+			}
+			if (offetAfterCurrentRow > 0) {
+				newAfterRowElement = (TableTableRowElement) maRowElement.cloneNode(true);
+				if (offetAfterCurrentRow > 1) {
+					newAfterRowElement.setTableNumberRowsRepeatedAttribute(offetAfterCurrentRow);
+				} else {
+					newAfterRowElement.removeAttributeNS(tableNameSpaceURI, "number-rows-repeated");
+				}
+				rowOwnerElement.insertBefore(newAfterRowElement, maRowElement);
+				// update row cache
+				if (oldList != null) {
+					Vector<Row> newAfterList = new Vector<Row>(offetAfterCurrentRow);
+					for (int i = mnRepeatedIndex + 1; i < repeateNum && i < oldList.size(); i++) {
+						Row afterRow = oldList.get(i);
+						if (afterRow != null) {
+							afterRow.maRowElement = newAfterRowElement;
+							afterRow.mnRepeatedIndex = i - mnRepeatedIndex - 1;
+							afterRow.mRowsRepeatedNumber = -1;
+							newAfterList.add(afterRow.mnRepeatedIndex, afterRow);
+						}
+					}
+					rowRepository.put(newAfterRowElement, newAfterList);
+					// create new cell element map.
+					for (Node n : new DomNodeList(newAfterRowElement.getChildNodes())) {
+						int columnsRepeatedNumber = ((TableTableCellElementBase) n)
+								.getTableNumberColumnsRepeatedAttribute();
+						for (int i = 0; i < columnsRepeatedNumber; i++) {
+							newAfterCellElements.add((TableTableCellElementBase) n);
+						}
+					}
+				}
+			}
+			// this var help to avoid calling duplicate.
+			int cellColumnIndexBase = 0;
+			// update cache cell list
+			for (Node n : new DomNodeList(maRowElement.getChildNodes())) {
+				if (cellRepository.containsKey(n)) {
+					Vector<Cell> cellList = cellRepository.get(n);
+					for (Cell cell : cellList) {
+						if (cell != null) {
+							int oldColumnIndex = cellColumnIndexBase + cell.mnRepeatedColIndex;
+							if (cell.mnRepeatedRowIndex > mnRepeatedIndex) {
+								cell.mnRepeatedRowIndex = cell.mnRepeatedRowIndex - mnRepeatedIndex - 1;
+								cell.mCellElement = newAfterCellElements.get(oldColumnIndex);
+							} else if (cell.mnRepeatedRowIndex == mnRepeatedIndex) {
+								cell.mnRepeatedRowIndex = 0;
+								cell.mCellElement = newCurrentCellElements.get(oldColumnIndex);
+							} else {
+								cell.mCellElement = newBeforeCellElements.get(oldColumnIndex);
+							}
+						}
+					}
+				}
+				cellColumnIndexBase += ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute()
+						.intValue();
+			}
+			// update row cache
+			Vector<Row> currentList = new Vector<Row>(1);
+			currentList.add(0, this);
+			rowRepository.put(currentRowElement, currentList);
+			mRowsRepeatedNumber = -1;
+			mnRepeatedIndex = 0;
+			rowOwnerElement.removeChild(maRowElement);
+			maRowElement = currentRowElement;
+		}
+	}
+
+	/**
+	 * Return if the row always keeps its optimal height.
+	 * 
+	 * @return true if the row always keeps its optimal height; vice versa
+	 */
+	public boolean isOptimalHeight() {
+		return Boolean.parseBoolean(maRowElement.getProperty(OdfTableRowProperties.UseOptimalRowHeight));
+	}
+
+	/**
+	 * Set if the row always keeps its optimal height.
+	 * 
+	 * @param isUseOptimalHeight
+	 *            the flag that indicate row should keep its optimal height or
+	 *            not
+	 */
+	public void setUseOptimalHeight(boolean isUseOptimalHeight) {
+		maRowElement.setProperty(OdfTableRowProperties.UseOptimalRowHeight, String.valueOf(isUseOptimalHeight));
+	}
+
+	/**
+	 * Return an instance of <code>TableTableRowElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>TableTableRowElement</code>
+	 */
+	public TableTableRowElement getOdfElement() {
+		return maRowElement;
+	}
+
+	/**
+	 * Get a cell with a specific index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the cell index in this row
+	 * @return the cell object in the given cell index
+	 */
+	public Cell getCellByIndex(int index) {
+		Table table = getTable();
+		if (index < 0) {
+			throw new IllegalArgumentException("index should be nonnegative integer.");
+		}
+		// expand column as needed.
+		int lastColumnIndex = table.getColumnCount() - 1;
+		if (index > lastColumnIndex) {
+			// need clean cell style.
+			table.appendColumns((index - lastColumnIndex), true);
+		}
+		for (Node n : new DomNodeList(maRowElement.getChildNodes())) {
+			if (n instanceof TableTableCellElementBase) {
+				if (index == 0) {
+					return table.getCellInstance((TableTableCellElementBase) n, 0, mnRepeatedIndex);
+				} else {
+					int nextIndex = index
+							- ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute().intValue();
+					if (nextIndex < 0) {
+						Cell cell = table.getCellInstance((TableTableCellElementBase) n, index, mnRepeatedIndex);
+						return cell;
+					} else {
+						index = nextIndex;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Return the count of real cells in this row. The cells covered by top
+	 * cells are not counted.
+	 * <p>
+	 * Please note it might not equal to the column count of the owner table,
+	 * because some of them are the covered cells.
+	 * 
+	 * @return the cell count
+	 */
+	public int getCellCount() {
+		Table table = getTable();
+		Set<Cell> realCells = new HashSet<Cell>();
+		List<CellCoverInfo> coverList = table.getCellCoverInfos(0, 0, table.getColumnCount() - 1,
+				table.getRowCount() - 1);
+		int rowIndex = getRowIndex();
+		for (int i = 0; i < table.getColumnCount(); i++) {
+			Cell cell = table.getOwnerCellByPosition(coverList, i, rowIndex);
+			realCells.add(cell);
+		}
+		return realCells.size();
+	}
+
+	/**
+	 * Return the previous row of the current row.
+	 * 
+	 * @return the previous row before this row in the owner table
+	 */
+	public Row getPreviousRow() {
+		Table table = getTable();
+		// the row has repeated row number > 1
+		if (getRowsRepeatedNumber() > 1) {
+			if (mnRepeatedIndex > 0) {
+				return table.getRowInstance(maRowElement, mnRepeatedIndex - 1);
+			}
+		}
+		// the row has repeated row number > 1 && the index is 0
+		// or the row has repeated row num = 1
+		Node aPrevNode = maRowElement.getPreviousSibling();
+		Node aCurNode = maRowElement;
+		TableTableRowElement lastRow;
+		while (true) {
+			if (aPrevNode == null) {
+				// does not have previous sibling, then get the parent
+				// because aCurNode might be the child element of
+				// table-header-rows, table-rows, table-row-group
+				Node parentNode = aCurNode.getParentNode();
+				// if the parent is table, then it means that this row is the
+				// first row in this table
+				// it has no previous row
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aPrevNode = parentNode.getPreviousSibling();
+			}
+			// else the previous node might be table-header-rows, table-rows,
+			// table-row-group
+			if (aPrevNode != null) {
+				try {
+					if (aPrevNode instanceof TableTableRowElement) {
+						return table
+								.getRowInstance((TableTableRowElement) aPrevNode, ((TableTableRowElement) aPrevNode)
+										.getTableNumberRowsRepeatedAttribute().intValue() - 1);
+					} else if (aPrevNode instanceof TableTableRowsElement
+							|| aPrevNode instanceof TableTableHeaderRowsElement
+							|| aPrevNode instanceof TableTableRowGroupElement) {
+						XPath xpath = ((OdfContentDom) aPrevNode.getOwnerDocument()).getXPath();
+						synchronized (mDocument) {
+							lastRow = (TableTableRowElement) xpath.evaluate(".//table:table-row[last()]", aPrevNode,
+									XPathConstants.NODE);
+						}
+						if (lastRow != null) {
+							return table.getRowInstance(lastRow, lastRow.getTableNumberRowsRepeatedAttribute()
+									.intValue() - 1);
+						}
+					} else {
+						aCurNode = aPrevNode;
+						aPrevNode = aPrevNode.getPreviousSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(Row.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Return the next row of the current row.
+	 * 
+	 * @return the next row after this row in the owner table
+	 */
+	public Row getNextRow() {
+		Table table = getTable();
+		// the row has repeated row number > 1
+		if (getRowsRepeatedNumber() > 1) {
+			if (mnRepeatedIndex < (getRowsRepeatedNumber() - 1)) {
+				return table.getRowInstance(maRowElement, mnRepeatedIndex + 1);
+			}
+		}
+		Node aNextNode = maRowElement.getNextSibling();
+		Node aCurNode = maRowElement;
+		TableTableRowElement firstRow;
+		while (true) {
+			if (aNextNode == null) {
+				// does not have next sibling, then get the parent
+				// because aCurNode might be the child element of
+				// table-header-rows, table-rows, table-row-group
+				Node parentNode = aCurNode.getParentNode();
+				// if the parent is table, then it means that this row is the
+				// last row in this table
+				// it has no next row
+				if (parentNode instanceof TableTableElement) {
+					return null;
+				}
+				aNextNode = parentNode.getNextSibling();
+			}
+			// else the next node might be table-header-rows, table-rows,
+			// table-row-group
+			if (aNextNode != null) {
+				try {
+					if (aNextNode instanceof TableTableRowElement) {
+						return table.getRowInstance((TableTableRowElement) aNextNode, 0);
+					} else if (aNextNode instanceof TableTableRowsElement
+							|| aNextNode instanceof TableTableHeaderRowsElement
+							|| aNextNode instanceof TableTableRowGroupElement) {
+						XPath xpath = ((OdfContentDom) aNextNode.getOwnerDocument()).getXPath();
+						synchronized (mDocument) {
+							firstRow = (TableTableRowElement) xpath.evaluate(".//table:table-row[first()]", aNextNode,
+									XPathConstants.NODE);
+						}
+						if (firstRow != null) {
+							return table.getRowInstance(firstRow, 0);
+						}
+					} else {
+						aCurNode = aNextNode;
+						aNextNode = aNextNode.getNextSibling();
+					}
+				} catch (XPathExpressionException e) {
+					Logger.getLogger(Row.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Set the default cell style to this row.
+	 * <p>
+	 * The style should already exist in this document.
+	 * 
+	 * @param style
+	 *            the cell style of the document
+	 */
+	public void setDefaultCellStyle(OdfStyle style) {
+		splitRepeatedRows();
+		OdfStyle defaultStyle = getDefaultCellStyle();
+		if (defaultStyle != null) {
+			defaultStyle.removeStyleUser(maRowElement);
+		}
+
+		if (style != null) {
+			style.addStyleUser(maRowElement);
+			maRowElement.setTableDefaultCellStyleNameAttribute(style.getStyleNameAttribute());
+		}
+	}
+
+	/**
+	 * Get the default cell style of this row.
+	 * 
+	 * @return the default cell style of this row
+	 */
+	public OdfStyle getDefaultCellStyle() {
+		String styleName = maRowElement.getTableDefaultCellStyleNameAttribute();
+		OdfStyle style = maRowElement.getAutomaticStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+
+		if (style == null) {
+			style = mDocument.getDocumentStyles().getStyle(styleName, OdfStyleFamily.TableCell);
+		}
+		return style;
+	}
+
+	/**
+	 * Return the index of this row in the owner table.
+	 * 
+	 * @return the index of the row
+	 */
+	public int getRowIndex() {
+		int result = 0;
+		TableTableElement mTableElement = getTableElement();
+		TableTableRowElement rowEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableRowElement) {
+						rowEle = (TableTableRowElement) m;
+						if (rowEle == getOdfElement()) {
+							return result + mnRepeatedIndex;
+						}
+						result += rowEle.getTableNumberRowsRepeatedAttribute();
+					}
+				}
+			}
+			if (n instanceof TableTableRowElement) {
+				rowEle = (TableTableRowElement) n;
+				if (rowEle == getOdfElement()) {
+					break;
+				}
+				result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+			}
+		}
+		return result + mnRepeatedIndex;
+	}
+
+	// insert count number of cell from index
+	// this is called after insertColumn has been called by Table
+	void insertCellByIndex(int index, int count) {
+		splitRepeatedRows();
+		// all insert the real cell
+		Table table = getTable();
+		List<CellCoverInfo> coverList = table.getCellCoverInfos(0, 0, table.getColumnCount() - 1,
+				table.getRowCount() - 1);
+		int rowIndex = getRowIndex();
+		Cell preCell;
+		if (index == 0) {
+			preCell = table.getOwnerCellByPosition(coverList, 0, rowIndex);
+		} else {
+			preCell = table.getOwnerCellByPosition(coverList, index - 1, rowIndex);
+		}
+		Cell nextCell = getCellByIndex(index);
+		if (nextCell == null) {
+			nextCell = getCellByIndex(getCellCount() - 1);
+		}
+		// add a single cell element to describe cells.
+		OdfName tableCellNameSpace = OdfName.newName(OdfDocumentNamespace.TABLE, "table-cell");
+		if (table.isUseRepeat()) {
+			TableTableCellElement newCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(
+					(OdfFileDom) maRowElement.getOwnerDocument(), tableCellNameSpace);
+			newCell.setTableStyleNameAttribute(preCell.getStyleName());
+			if (count > 1) {
+				newCell.setTableNumberColumnsRepeatedAttribute(count);
+			}
+			maRowElement.insertBefore(newCell, nextCell.getOdfElement());
+		} else {
+			for (int i = index + count; i > index; i--) {
+				TableTableCellElement newCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(
+						(OdfFileDom) maRowElement.getOwnerDocument(), tableCellNameSpace);
+				newCell.setTableStyleNameAttribute(preCell.getStyleName());
+				maRowElement.insertBefore(newCell, nextCell.getOdfElement());
+			}
+		}
+	}
+
+	// note: we have to use this method to modify the row repeated number
+	// in order to update mnRepeatedIndex of the each row
+	void setRowsRepeatedNumber(int num) {
+		mRowsRepeatedNumber = num;
+		// update the mnRepeatedIndex for the ever repeated row
+		maRowElement.setTableNumberRowsRepeatedAttribute(Integer.valueOf(num));
+	}
+
+	int getRowsRepeatedNumber() {
+		if (mRowsRepeatedNumber < 0) {
+			Integer count = maRowElement.getTableNumberRowsRepeatedAttribute();
+			if (count == null) {
+				mRowsRepeatedNumber = 1;
+			} else {
+				mRowsRepeatedNumber = count.intValue();
+			}
+		}
+		return mRowsRepeatedNumber;
+	}
+
+	/****************************
+	 * Moved from Table
+	 * 
+	 */
+	private void insertCellElementBefore(OdfElement parentEle, TableTableCellElementBase positionEle,
+			TableTableCellElementBase cellEle, int count) {
+		boolean isDescribedBySingleElement = getTable().isUseRepeat();
+		if (positionEle == null) {
+			parentEle.appendChild(cellEle);
+			if (isDescribedBySingleElement && count > 1) {
+				cellEle.setTableNumberColumnsRepeatedAttribute(count);
+			} else {
+				for (int i = 1; i < count; i++) {
+					parentEle.appendChild(cellEle.cloneNode(true));
+				}
+			}
+
+		} else {
+			parentEle.insertBefore(cellEle, positionEle);
+			if (isDescribedBySingleElement && count > 1) {
+				cellEle.setTableNumberColumnsRepeatedAttribute(count);
+			} else {
+				for (int i = 1; i < count; i++) {
+					parentEle.insertBefore(cellEle.cloneNode(true), positionEle);
+				}
+			}
+		}
+	}
+
+	void insertCellBefore(Cell refCell, Cell positionCell, int count) {
+		splitRepeatedRows();
+		Table ownerTable = getTable();
+		if (positionCell == null) {
+			if (refCell.isCoveredElement()) {
+				TableTableCellElement coverCellEle = (TableTableCellElement) refCell.getCoverCell().getOdfElement();
+				TableTableCellElement newCellEle = (TableTableCellElement) coverCellEle.cloneNode(true);
+				cleanCell(newCellEle);
+				insertCellElementBefore(getOdfElement(), null, newCellEle, count);
+			} else {
+				TableTableCellElement endCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(endCellEle);
+				getOdfElement().appendChild(endCellEle);
+				reviseStyleFromLastColumnToMedium(refCell);
+				if (count > 1) {
+					TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+					cleanCell(newCellEle);
+					insertCellElementBefore(getOdfElement(), endCellEle, newCellEle, count - 1);
+				}
+			}
+		} else {
+			TableTableCellElement coverRefCellEle = null;
+			TableTableCellElement coverPosCellEle = null;
+			Cell coverRefCell = null;
+			// get ref cover cell
+			if (refCell.isCoveredElement()) {
+				coverRefCell = refCell.getCoverCell();
+				coverRefCellEle = (TableTableCellElement) coverRefCell.getOdfElement();
+			}
+			// get position cover cell
+			if (positionCell.isCoveredElement()) {
+				coverPosCellEle = (TableTableCellElement) positionCell.getCoverCell().getOdfElement();
+			}
+			// is cover cell and have the same cover cell
+			// position cell is cover cell and refer cell covers position cell
+			if ((coverRefCellEle != null && coverRefCellEle == coverPosCellEle)
+					|| (coverPosCellEle != null && refCell.getOdfElement() == coverPosCellEle)) {
+				if (coverRefCellEle == null) {
+					coverRefCellEle = (TableTableCellElement) refCell.getOdfElement();
+					coverRefCell = refCell;
+				}
+				TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+						(OdfFileDom) ownerTable.getOdfElement().getOwnerDocument(), OdfName.newName(
+								OdfDocumentNamespace.TABLE, "covered-table-cell"));
+				insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+				// the first cover line
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) {
+					coverRefCell.setColumnSpannedNumber(coverRefCell.getColumnSpannedNumber() + count);
+				}
+			} else if (coverRefCellEle != null) {
+				// This is a cover cell
+
+				// the first cover line
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) {
+					TableTableCellElement newCellEle = (TableTableCellElement) coverRefCellEle.cloneNode(true);
+					cleanCell(newCellEle);
+					insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+				} else { // the second and other cover line
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) refCell.getOdfElement()
+							.cloneNode(true);
+					newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+					insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+				}
+			} else if ((refCell.getOdfElement() == positionCell.getOdfElement())
+					&& (refCell.getColumnsRepeatedNumber() > 1)) {
+				// repeated number
+				int repeatNum = refCell.getColumnsRepeatedNumber();
+				// update the cell that after the ref cell
+				for (int i = repeatNum - 1; i > refCell.mnRepeatedColIndex; i--) {
+					ownerTable.updateCellRepository(refCell.getOdfElement(), i, refCell.mnRepeatedRowIndex, refCell
+							.getOdfElement(), i + count, refCell.mnRepeatedRowIndex);
+				}
+				refCell.getOdfElement().setTableNumberColumnsRepeatedAttribute(repeatNum + count);
+			} else {
+				TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(newCellEle);
+				insertCellElementBefore(getOdfElement(), positionCell.getOdfElement(), newCellEle, count);
+			}
+		}
+	}
+
+	/**
+	 * This method is to insert a cell same as refCell before positionCell.
+	 * <p>
+	 * This method is invoked by appendColumn and insertColumnBefore.
+	 */
+	Cell insertCellBefore(Cell refCell, Cell positionCell) {
+		splitRepeatedRows();
+		Cell newCell = null;
+		Table ownerTable = getTable();
+		if (positionCell == null) {
+			if (refCell.isCoveredElement()) {
+				TableTableCellElement coverCellEle = (TableTableCellElement) refCell.getCoverCell().getOdfElement();
+				TableTableCellElement newCellEle = (TableTableCellElement) coverCellEle.cloneNode(true);
+				cleanCell(newCellEle);
+				getOdfElement().appendChild(newCellEle);
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+			} else {
+				TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(newCellEle);
+				getOdfElement().appendChild(newCellEle);
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+				reviseStyleFromLastColumnToMedium(refCell);
+			}
+		} else {
+			TableTableCellElement coverRefCellEle = null;
+			TableTableCellElement coverPosCellEle = null;
+			Cell coverRefCell = null;
+			if (refCell.isCoveredElement()) {
+				// get ref cover cell
+				coverRefCell = refCell.getCoverCell();
+				coverRefCellEle = (TableTableCellElement) coverRefCell.getOdfElement();
+			}
+			if (positionCell.isCoveredElement()) {
+				// get position cover cell
+				coverPosCellEle = (TableTableCellElement) positionCell.getCoverCell().getOdfElement();
+			}
+			// is cover cell and have the same cover cell
+			// position cell is cover cell and refer cell covers position cell
+			if ((coverRefCellEle != null && coverRefCellEle == coverPosCellEle)
+					|| (coverPosCellEle != null && refCell.getOdfElement() == coverPosCellEle)) {
+				if (coverRefCellEle == null) {
+					coverRefCellEle = (TableTableCellElement) refCell.getOdfElement();
+					coverRefCell = refCell;
+				}
+				TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) OdfXMLFactory.newOdfElement(
+						(OdfFileDom) ownerTable.getOdfElement().getOwnerDocument(), OdfName.newName(
+								OdfDocumentNamespace.TABLE, "covered-table-cell"));
+				getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) {
+					// the first cover line
+					coverRefCell.setColumnSpannedNumber(coverRefCell.getColumnSpannedNumber() + 1);
+				}
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+			} else if (coverRefCellEle != null) {
+				// This is cover cell
+				if (refCell.getRowIndex() == coverRefCell.getRowIndex()) {
+					// the first cover line
+					TableTableCellElement newCellEle = (TableTableCellElement) coverRefCellEle.cloneNode(true);
+					cleanCell(newCellEle);
+					getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+					newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+				} else { // the second and other cover line
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) refCell.getOdfElement()
+							.cloneNode(true);
+					newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+					getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+					newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+				}
+			} else if ((refCell.getOdfElement() == positionCell.getOdfElement())
+					&& (refCell.getColumnsRepeatedNumber() > 1)) {
+				// repeated number
+
+				int repeatNum = refCell.getColumnsRepeatedNumber();
+				// update the cell that after the ref cell
+				for (int i = repeatNum - 1; i > refCell.mnRepeatedColIndex; i--) {
+					ownerTable.updateCellRepository(refCell.getOdfElement(), i, refCell.mnRepeatedRowIndex, refCell
+							.getOdfElement(), i + 1, refCell.mnRepeatedRowIndex);
+				}
+				refCell.getOdfElement().setTableNumberColumnsRepeatedAttribute(repeatNum + 1);
+				newCell = ownerTable.getCellInstance(refCell.getOdfElement(), refCell.mnRepeatedColIndex + 1,
+						refCell.mnRepeatedRowIndex);
+			} else {
+				TableTableCellElement newCellEle = (TableTableCellElement) refCell.getOdfElement().cloneNode(true);
+				cleanCell(newCellEle);
+				getOdfElement().insertBefore(newCellEle, positionCell.getOdfElement());
+				newCell = ownerTable.getCellInstance(newCellEle, 0, 0);
+			}
+		}
+		return newCell;
+	}
+
+	private void cleanCell(TableTableCellElement newCellEle) {
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "date-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "time-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "boolean-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.OFFICE.getUri(), "string-value");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "formula");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+		newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-spanned");
+		if (!getTable().isCellStyleInheritance()) {
+			newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+		}
+		Node n = newCellEle.getFirstChild();
+		while (n != null) {
+			Node m = n.getNextSibling();
+			if (n instanceof TextPElement || n instanceof TextHElement || n instanceof TextListElement) {
+				newCellEle.removeChild(n);
+			}
+			n = m;
+		}
+	}
+
+	private void reviseStyleFromLastColumnToMedium(Cell oldLastCell) {
+		if (getTable().mIsSpreadsheet) {
+			return;
+		}
+		OdfStyle styleEle = oldLastCell.getStyleHandler().getStyleElementForWrite();
+		if (styleEle != null) {
+			if (oldLastCell.getRowIndex() == 0) {
+				Table.setLeftTopBorderStyleProperties(styleEle);
+			} else {
+				Table.setLeftBottomBorderStylesProperties(styleEle);
+			}
+		}
+	}
+
+	private void reviseStyleFromMediumColumnToLast(Cell newLastCell) {
+		if (getTable().mIsSpreadsheet) {
+			return;
+		}
+		OdfStyle styleEle = newLastCell.getStyleHandler().getStyleElementForWrite();
+		if (styleEle != null) {
+			if (newLastCell.getRowIndex() == 0) {
+				Table.setRightTopBorderStyleProperties(styleEle);
+			} else {
+				Table.setRightBottomBorderStylesProperties(styleEle);
+			}
+		}
+	}
+
+	/**
+	 * This method is invoked by removeColumnByIndex So we don't need to care
+	 * about the covered and spanned cell in a same column
+	 */
+	void removeCellByIndex(int nStart, int nCount) {
+		splitRepeatedRows();
+		Cell startCell = getCellByIndex(nStart);
+		Cell coverCell = null;
+		if (startCell.isCoveredElement()) {
+			coverCell = startCell.getCoverCellInSameRow();
+		}
+		int index = nStart;
+		for (int i = 0; i < nCount; i++) {
+			Cell cell = getCellByIndex(index);
+			cell.splitRepeatedCells();
+			if (cell.isCoveredElement() && coverCell != null) {
+				coverCell.setColumnSpannedNumber(coverCell.getColumnSpannedNumber() - cell.getColumnsRepeatedNumber());
+				maRowElement.removeChild(cell.getOdfElement());
+				i += cell.getColumnsRepeatedNumber() - 1;
+			} else if (cell.isCoveredElement()) {
+				maRowElement.removeChild(cell.getOdfElement());
+				i += cell.getColumnsRepeatedNumber() - 1;
+			} else if (!cell.isCoveredElement()) {
+				if (i + cell.getColumnSpannedNumber() <= nCount) {
+					maRowElement.removeChild(cell.getOdfElement());
+					i += cell.getColumnSpannedNumber() - 1;
+				} else {
+					removeCellByIndex(index + 1, nCount - i);
+				}
+			}
+		}
+		int clmnum = getTable().getColumnCount();
+		if (nStart + nCount >= clmnum) {
+			Cell cell = getCellByIndex(nStart - 1);
+			reviseStyleFromMediumColumnToLast(cell);
+		}
+	}
+
+	void removeAllCellsRelationship() {
+		Table table = getTable();
+		for (int i = 0; i < table.getColumnCount();) {
+			Cell cell = getCellByIndex(i);
+			if (cell == null) {
+				// cell might be null for empty row
+				i++;
+			} else {
+				if (cell.isCoveredElement()) {
+					// cell is a cover cell
+					Cell coverCell = cell.getCoverCellInSameColumn();
+					if (coverCell != null) {
+						coverCell.setRowSpannedNumber(coverCell.getRowSpannedNumber() - getRowsRepeatedNumber());
+					}
+					getOdfElement().removeChild(cell.getOdfElement());
+				} else if (cell.getRowSpannedNumber() > 1) {
+					// cell is not a cover cell and it span more rows
+					// split the cell under this cell to a single cell
+					Row nextRow = table.getRowByIndex(getRowIndex() + 1);
+					if (nextRow.getRowsRepeatedNumber() > 1) {
+						nextRow.splitRepeatedRows();
+					}
+					Cell coveredCell = table.getCellByPosition(cell.getColumnIndex(), getRowIndex() + 1);
+					if (coveredCell.getColumnsRepeatedNumber() > 1) {
+						coveredCell.splitRepeatedCells();
+						coveredCell = table.getCellByPosition(cell.getColumnIndex(), getRowIndex() + 1);
+					}
+					// create a new cell
+					TableTableCellElement newCellEle = (TableTableCellElement) cell.getOdfElement().cloneNode(true);
+					newCellEle.setTableNumberRowsSpannedAttribute(cell.getRowSpannedNumber() - getRowsRepeatedNumber());
+					// update repository
+					int startRow = coveredCell.getRowIndex();
+					int endRow = coveredCell.getRowIndex() + newCellEle.getTableNumberRowsSpannedAttribute();
+					int startClm = coveredCell.getColumnIndex();
+					int endClm = coveredCell.getColumnIndex() + newCellEle.getTableNumberColumnsSpannedAttribute()
+							* newCellEle.getTableNumberColumnsRepeatedAttribute();
+					coveredCell.getOdfElement().getParentNode().replaceChild(newCellEle, coveredCell.getOdfElement());
+					table.updateRepositoryWhenCellElementChanged(startRow, endRow, startClm, endClm, newCellEle);
+				}
+				i += cell.getColumnSpannedNumber();
+			}
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/Table.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Table.java
new file mode 100644
index 0000000..8e170fa
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/Table.java
@@ -0,0 +1,3490 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.ArrayList;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.table.TableAlignAttribute;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableColumnPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedExpressionsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableNamedRangeElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowGroupElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableProperties;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.text.Paragraph;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Table represents the table feature in ODF spreadsheet and text documents.
+ * <p>
+ * Table provides methods to get/add/delete/modify table column/row/cell.
+ * 
+ */
+public class Table extends Component {
+
+	private final TableTableElement mTableElement;
+	protected Document mDocument;
+	protected boolean mIsSpreadsheet;
+	protected boolean mIsCellStyleInheritance = true;
+	protected boolean mIsDescribedBySingleElement = true;
+	private static final int DEFAULT_ROW_COUNT = 2;
+	private static final int DEFAULT_COLUMN_COUNT = 5;
+	private static final double DEFAULT_TABLE_WIDTH = 6.692; // 6
+	private static final int DEFAULT_REL_TABLE_WIDTH = 65535;
+	private static final String DEFAULT_TABLE_ALIGN = "margins";
+	private static final DecimalFormat IN_FORMAT = new DecimalFormat("##0.0000");
+	// TODO: should save seperately for different dom tree
+	IdentityHashMap<TableTableCellElementBase, Vector<Cell>> mCellRepository = new IdentityHashMap<TableTableCellElementBase, Vector<Cell>>();
+	IdentityHashMap<TableTableRowElement, Vector<Row>> mRowRepository = new IdentityHashMap<TableTableRowElement, Vector<Row>>();
+	IdentityHashMap<TableTableColumnElement, Vector<Column>> mColumnRepository = new IdentityHashMap<TableTableColumnElement, Vector<Column>>();
+	private DefaultStyleHandler mStyleHandler;
+	static {
+		IN_FORMAT.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
+	}
+
+	/**
+	 * This is a tool class which supplies all of the table creation detail.
+	 * <p>
+	 * The end user isn't allowed to create it directly, otherwise an
+	 * <code>IllegalStateException</code> will be thrown.
+	 * 
+	 *@since 0.3.5
+	 */
+	public static class TableBuilder {
+
+		private final TableContainer ownerContainer;
+
+		private final IdentityHashMap<TableTableElement, Table> mTableRepository = new IdentityHashMap<TableTableElement, Table>();
+
+		/**
+		 * TableBuilder constructor. This constructor should only be use in
+		 * owner {@link org.odftoolkit.simple.table.TableContainer
+		 * TableContainer} constructor. The end user isn't allowed to call it
+		 * directly, otherwise an <code>IllegalStateException</code> will be
+		 * thrown.
+		 * 
+		 * @param container
+		 *            the owner <code>TableContainer</code>.
+		 * @throws IllegalStateException
+		 *             if new TableBuilder out of owner Document constructor,
+		 *             this exception will be thrown.
+		 */
+		public TableBuilder(TableContainer container) {
+			if (container.getTableBuilder() == null) {
+				ownerContainer = container;
+			} else {
+				throw new IllegalStateException("TableBuilder only can be created in table containter constructor.");
+			}
+		}
+
+		/**
+		 * Get a table feature instance by an instance of
+		 * <code>TableTableElement</code>.
+		 * 
+		 * @param odfElement
+		 *            an instance of <code>TableTableElement</code>
+		 * @return an instance of <code>Table</code> that can represent
+		 *         <code>odfElement</code>
+		 */
+		public synchronized Table getTableInstance(TableTableElement odfElement) {
+			if (mTableRepository.containsKey(odfElement)) {
+				return mTableRepository.get(odfElement);
+			} else {
+				Table newTable = new Table(ownerContainer, odfElement);
+				mTableRepository.put(odfElement, newTable);
+				return newTable;
+			}
+		}
+
+		/**
+		 * Construct the <code>Table</code> feature. The default column count is
+		 * 5. The default row count is 2.
+		 * <p>
+		 * The table will be inserted at the end of the table container. An
+		 * unique table name will be given, you may set a custom table name
+		 * using the <code>setTableName</code> method.
+		 * <p>
+		 * If the container is a text document, cell borders will be created by
+		 * default.
+		 * 
+		 * @return the created <code>Table</code> feature instance
+		 */
+		public Table newTable() {
+			return newTable(DEFAULT_ROW_COUNT, DEFAULT_COLUMN_COUNT, 0, 0);
+		}
+
+		/**
+		 * Construct the <code>Table</code> feature with a specified row number,
+		 * column number, header row number, header column number.
+		 * <p>
+		 * The table will be inserted at the end of the container. An unique
+		 * table name will be given, you may set a custom table name using the
+		 * <code>setTableName</code> method.
+		 * <p>
+		 * If the container is a text document, cell borders will be created by
+		 * default.
+		 * 
+		 * @param numRows
+		 *            the row number
+		 * @param numCols
+		 *            the column number
+		 * @param headerRowNumber
+		 *            the header row number
+		 * @param headerColumnNumber
+		 *            the header column number
+		 * @return a new instance of <code>Table</code>
+		 * */
+		public Table newTable(int numRows, int numCols, int headerRowNumber, int headerColumnNumber) {
+			try {
+				TableTableElement newTEle = createTable(ownerContainer, numRows, numCols, headerRowNumber,
+						headerColumnNumber);
+				ownerContainer.getTableContainerElement().appendChild(newTEle);
+				return getTableInstance(newTEle);
+			} catch (DOMException e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			} catch (Exception e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			}
+			return null;
+		}
+		
+		/**
+		 * Construct the <code>Table</code> feature with a specified row number,
+		 * column number, header row number, header column number, left margin
+		 * space and right margin space.
+		 * <p>
+		 * The table will be inserted at the end of the container. An unique
+		 * table name will be given, you may set a custom table name using the
+		 * <code>setTableName</code> method.
+		 * <p>
+		 * If the container is a text document, cell borders will be created by
+		 * default.
+		 * 
+		 * @param numRows
+		 *            the row number
+		 * @param numCols
+		 *            the column number
+		 * @param headerRowNumber
+		 *            the header row number
+		 * @param headerColumnNumber
+		 *            the header column number
+		 * @param marginLeft
+		 *            the left table margin in centimeter(cm), between the left
+		 *            margin of table container and the table
+		 * @param marginRight
+		 *            the right table margin in centimeter(cm), between the
+		 *            right margin of table container and the table
+		 * 
+		 * @return a new instance of <code>Table</code>
+		 * 
+		 * @since 0.5.5
+		 * */
+		public Table newTable(int numRows, int numCols, int headerRowNumber, int headerColumnNumber, double marginLeft,
+				double marginRight) {
+			try {
+				TableTableElement newTEle = createTable(ownerContainer, numRows, numCols, headerRowNumber,
+						headerColumnNumber, marginLeft, marginRight);
+				ownerContainer.getTableContainerElement().appendChild(newTEle);
+				return getTableInstance(newTEle);
+			} catch (Exception e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			}
+			return null;
+		}
+
+		/**
+		 * Construct the <code>Table</code> feature with a specified row number
+		 * and column number.
+		 * <p>
+		 * The table will be inserted at the end of the container. An unique
+		 * table name will be given, you may set a custom table name using the
+		 * <code>setTableName</code> method.
+		 * <p>
+		 * If the container is a text document, cell borders will be created by
+		 * default.
+		 * 
+		 * @param numRows
+		 *            the row number
+		 * @param numCols
+		 *            the column number
+		 * @return a new instance of <code>Table</code>
+		 */
+		public Table newTable(int numRows, int numCols) {
+			return newTable(numRows, numCols, 0, 0);
+		}
+
+		/**
+		 * Construct the Table feature with a specified 2 dimension array as the
+		 * data of this table. The value type of each cell is float.
+		 * <p>
+		 * The table will be inserted at the end of the container. An unique
+		 * table name will be given, you may set a custom table name using the
+		 * <code>setTableName</code> method.
+		 * <p>
+		 * If the container is a text document, cell borders will be created by
+		 * default.
+		 * 
+		 * @param rowLabel
+		 *            set as the header row, it can be null if no header row
+		 *            needed
+		 * @param columnLabel
+		 *            set as the header column, it can be null if no header
+		 *            column needed
+		 * @param data
+		 *            the two dimension array of double as the data of this
+		 *            table
+		 * @return a new instance of <code>Table</code>
+		 */
+		public Table newTable(String[] rowLabel, String[] columnLabel, double[][] data) {
+			int rowNumber = DEFAULT_ROW_COUNT;
+			int columnNumber = DEFAULT_COLUMN_COUNT;
+			if (data != null) {
+				rowNumber = data.length;
+				columnNumber = data[0].length;
+			}
+			int rowHeaders = 0, columnHeaders = 0;
+
+			if (rowLabel != null) {
+				rowHeaders = 1;
+			}
+			if (columnLabel != null) {
+				columnHeaders = 1;
+			}
+			try {
+				TableTableElement newTEle = createTable(ownerContainer, rowNumber + rowHeaders, columnNumber
+						+ columnHeaders, rowHeaders, columnHeaders);
+				// append to the end of table container
+				ownerContainer.getTableContainerElement().appendChild(newTEle);
+				Table table = getTableInstance(newTEle);
+				List<Row> rowList = table.getRowList();
+				for (int i = 0; i < rowNumber + rowHeaders; i++) {
+					Row row = rowList.get(i);
+					for (int j = 0; j < columnNumber + columnHeaders; j++) {
+						if ((i == 0) && (j == 0)) {
+							continue;
+						}
+						Cell cell = row.getCellByIndex(j);
+						if (i == 0 && columnLabel != null) // first row, should
+						// fill column
+						// labels
+						{
+							if (j <= columnLabel.length) {
+								cell.setStringValue(columnLabel[j - 1]);
+							} else {
+								cell.setStringValue("");
+							}
+						} else if (j == 0 && rowLabel != null) // first column,
+						// should fill
+						// row labels
+						{
+							if (i <= rowLabel.length) {
+								cell.setStringValue(rowLabel[i - 1]);
+							} else {
+								cell.setStringValue("");
+							}
+						} else {// data
+							if ((data != null) && (i >= rowHeaders) && (j >= columnHeaders)) {
+								cell.setDoubleValue(data[i - rowHeaders][j - columnHeaders]);
+							}
+						}
+					}
+				}
+				return table;
+
+			} catch (DOMException e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			} catch (Exception e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			}
+			return null;
+		}
+
+		/**
+		 * Construct the Table feature with a specified 2 dimension array as the
+		 * data of this table. The value type of each cell is string.
+		 * <p>
+		 * The table will be inserted at the end of the container. An unique
+		 * table name will be given, you may set a custom table name using the
+		 * <code>setTableName</code> method.
+		 * <p>
+		 * If the container is a text document, cell borders will be created by
+		 * default.
+		 * 
+		 * @param rowLabel
+		 *            set as the header row, it can be null if no header row
+		 *            needed
+		 * @param columnLabel
+		 *            set as the header column, it can be null if no header
+		 *            column needed
+		 * @param data
+		 *            the two dimension array of string as the data of this
+		 *            table
+		 * @return a new instance of <code>Table</code>
+		 */
+		public Table newTable(String[] rowLabel, String[] columnLabel, String[][] data) {
+			int rowNumber = DEFAULT_ROW_COUNT;
+			int columnNumber = DEFAULT_COLUMN_COUNT;
+			if (data != null) {
+				rowNumber = data.length;
+				columnNumber = data[0].length;
+			}
+			int rowHeaders = 0, columnHeaders = 0;
+
+			if (rowLabel != null) {
+				rowHeaders = 1;
+			}
+			if (columnLabel != null) {
+				columnHeaders = 1;
+			}
+			try {
+				TableTableElement newTEle = createTable(ownerContainer, rowNumber + rowHeaders, columnNumber
+						+ columnHeaders, rowHeaders, columnHeaders);
+				// append to the end of table container
+				ownerContainer.getTableContainerElement().appendChild(newTEle);
+
+				Table table = getTableInstance(newTEle);
+				List<Row> rowList = table.getRowList();
+				for (int i = 0; i < rowNumber + rowHeaders; i++) {
+					Row row = rowList.get(i);
+					for (int j = 0; j < columnNumber + columnHeaders; j++) {
+						if ((i == 0) && (j == 0)) {
+							continue;
+						}
+						Cell cell = row.getCellByIndex(j);
+						if (i == 0 && columnLabel != null) // first row, should
+						// fill column
+						// labels
+						{
+							if (j <= columnLabel.length) {
+								cell.setStringValue(columnLabel[j - 1]);
+							} else {
+								cell.setStringValue("");
+							}
+						} else if (j == 0 && rowLabel != null) // first column,
+						// should fill
+						// row labels
+						{
+							if (i <= rowLabel.length) {
+								cell.setStringValue(rowLabel[i - 1]);
+							} else {
+								cell.setStringValue("");
+							}
+						} else {
+							if ((data != null) && (i >= rowHeaders) && (j >= columnHeaders)) {
+								cell.setStringValue(data[i - rowHeaders][j - columnHeaders]);
+							}
+						}
+					}
+				}
+				return table;
+
+			} catch (DOMException e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			} catch (Exception e) {
+				Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			}
+			return null;
+		}
+	}
+
+	private Table(TableContainer container, TableTableElement table) {
+		mTableElement = table;
+		mDocument = getOwnerDocument(container);
+		if (mDocument instanceof SpreadsheetDocument) {
+			mIsSpreadsheet = true;
+		} else {
+			mIsSpreadsheet = false;
+		}
+	}
+
+	private static Document getOwnerDocument(TableContainer tableContainer) {
+		OdfElement containerElement = tableContainer.getTableContainerElement();
+		OdfFileDom ownerDocument = (OdfFileDom) containerElement.getOwnerDocument();
+		return (Document) ownerDocument.getDocument();
+	}
+
+	/**
+	 * Get a table feature instance by an instance of
+	 * <code>TableTableElement</code>.
+	 * 
+	 * @param element
+	 *            an instance of <code>TableTableElement</code>
+	 * @return an instance of <code>Table</code> that can represent
+	 *         <code>element</code>
+	 */
+	public static Table getInstance(TableTableElement element) {
+		Document ownerDocument = (Document) ((OdfFileDom) (element.getOwnerDocument())).getDocument();
+		return ownerDocument.getTableBuilder().getTableInstance(element);
+	}
+
+	/**
+	 * Construct the <code>Table</code> feature. The default column count is 5.
+	 * The default row count is 2.
+	 * <p>
+	 * The table will be inserted at the end of the container. An unique table
+	 * name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * <p>
+	 * If the <code>tableContainer</code> is a text document, cell borders will
+	 * be created by default.
+	 * 
+	 * @param tableContainer
+	 *            the table container that contains this table
+	 * @return the created <code>Table</code> feature instance
+	 */
+	public static Table newTable(TableContainer tableContainer) {
+		return tableContainer.getTableBuilder().newTable();
+	}
+
+	/**
+	 * Construct the <code>Table</code> feature with a specified row number and
+	 * column number.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * <p>
+	 * If the <code>tableContainer</code> is a text document, cell borders will
+	 * be created by default.
+	 * 
+	 * @param tableContainer
+	 *            the table container that contains this table
+	 * @param numRows
+	 *            the row number
+	 * @param numCols
+	 *            the column number
+	 * @return a new instance of <code>Table</code>
+	 */
+	public static Table newTable(TableContainer tableContainer, int numRows, int numCols) {
+		return tableContainer.getTableBuilder().newTable(numRows, numCols);
+	}
+	
+	/**
+	 * Construct the <code>Table</code> feature with a specified row number and
+	 * column number.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * <p>
+	 * If the <code>tableContainer</code> is a text document, cell borders will
+	 * be created by default.
+	 * 
+	 * @param tableContainer
+	 *            the table container that contains this table
+	 * @param numRows
+	 *            the row number
+	 * @param numCols
+	 *            the column number
+	 * @param marginLeft double
+	 * 			  <I>the left table margin in cm (between the left margin of document and the table)</I>
+	 * @param marginRight double
+	 * 			  <I>the right table margin in cm (between the right margin of document and the table)</I>
+	 * @return a new instance of <code>Table</code>
+	 */
+	public static Table newTable(TableContainer tableContainer, int numRows, int numCols, 
+			double marginLeft, double marginRight) {
+		return tableContainer.getTableBuilder().newTable(numRows, numCols, 0, 0, marginLeft, marginRight);
+	}
+
+	/**
+	 * Construct the <code>Table</code> feature with a specified row number,
+	 * column number, header row number, header column number.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * <p>
+	 * If the <code>tableContainer</code> is a text document, cell borders will
+	 * be created by default.
+	 * 
+	 * @param tableContainer
+	 *            the ODF document that contains this feature
+	 * @param numRows
+	 *            the row number
+	 * @param numCols
+	 *            the column number
+	 * @param headerRowNumber
+	 *            the header row number
+	 * @param headerColumnNumber
+	 *            the header column number
+	 * @return a new instance of <code>Table</code>
+	 * */
+	public static Table newTable(TableContainer tableContainer, int numRows, int numCols, int headerRowNumber,
+			int headerColumnNumber) {
+		return tableContainer.getTableBuilder().newTable(numRows, numCols, headerRowNumber, headerColumnNumber);
+	}
+	
+	
+
+	/**
+	 * Construct the Table feature with a specified 2 dimension array as the
+	 * data of this table. The value type of each cell is float.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * <p>
+	 * If the <code>tableContainer</code> is a text document, cell borders will
+	 * be created by default.
+	 * 
+	 * @param tableContainer
+	 *            the table container that contains this table
+	 * @param rowLabel
+	 *            set as the header row, it can be null if no header row needed
+	 * @param columnLabel
+	 *            set as the header column, it can be null if no header column
+	 *            needed
+	 * @param data
+	 *            the two dimension array of double as the data of this table
+	 * @return a new instance of <code>Table</code>
+	 */
+	public static Table newTable(TableContainer tableContainer, String[] rowLabel, String[] columnLabel, double[][] data) {
+		return tableContainer.getTableBuilder().newTable(rowLabel, columnLabel, data);
+	}
+
+	/**
+	 * Construct the Table feature with a specified 2 dimension array as the
+	 * data of this table. The value type of each cell is string.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * <p>
+	 * If the <code>tableContainer</code> is a text document, cell borders will
+	 * be created by default.
+	 * 
+	 * @param tableContainer
+	 *            the table container that contains this table
+	 * @param rowLabel
+	 *            set as the header row, it can be null if no header row needed
+	 * @param columnLabel
+	 *            set as the header column, it can be null if no header column
+	 *            needed
+	 * @param data
+	 *            the two dimension array of string as the data of this table
+	 * @return a new instance of <code>Table</code>
+	 */
+	public static Table newTable(TableContainer tableContainer, String[] rowLabel, String[] columnLabel, String[][] data) {
+		return tableContainer.getTableBuilder().newTable(rowLabel, columnLabel, data);
+	}
+
+	Cell getCellInstance(TableTableCellElementBase cell, int repeatedColIndex, int repeatedRowIndex) {
+		if (mCellRepository.containsKey(cell)) {
+			Vector<Cell> list = mCellRepository.get(cell);
+			Cell fCell = null;
+			for (int i = 0; i < list.size(); i++) {
+				if (list.get(i).getOdfElement() == cell && list.get(i).mnRepeatedColIndex == repeatedColIndex
+						&& list.get(i).mnRepeatedRowIndex == repeatedRowIndex) {
+					fCell = list.get(i);
+					break;
+				}
+			}
+			if (fCell == null) {
+				fCell = new Cell(cell, repeatedColIndex, repeatedRowIndex);
+				list.add(fCell);
+			}
+			return fCell;
+		} else {
+			Cell newCell = new Cell(cell, repeatedColIndex, repeatedRowIndex);
+			Vector<Cell> list = new Vector<Cell>();
+			list.add(newCell);
+			mCellRepository.put(cell, list);
+			return newCell;
+		}
+	}
+
+	Row getRowInstance(TableTableRowElement row, int repeatedRowIndex) {
+		if (mRowRepository.containsKey(row)) {
+			Vector<Row> list = mRowRepository.get(row);
+			if (list.size() <= repeatedRowIndex) {
+				list.setSize(repeatedRowIndex + 1);
+			}
+			Row fCell = list.get(repeatedRowIndex);
+			if (fCell == null) {
+				fCell = new Row(row, repeatedRowIndex);
+				list.set(repeatedRowIndex, fCell);
+			}
+			return fCell;
+		} else {
+			Row newRow = new Row(row, repeatedRowIndex);
+			int size = (repeatedRowIndex > 7) ? (repeatedRowIndex + 1) : 8;
+			Vector<Row> list = new Vector<Row>(size);
+			list.setSize(repeatedRowIndex + 1);
+			list.set(repeatedRowIndex, newRow);
+			mRowRepository.put(row, list);
+			return newRow;
+		}
+	}
+
+	Column getColumnInstance(TableTableColumnElement col, int repeatedColIndex) {
+		if (mColumnRepository.containsKey(col)) {
+			Vector<Column> list = mColumnRepository.get(col);
+			if (list.size() <= repeatedColIndex) {
+				list.setSize(repeatedColIndex + 1);
+			}
+			Column fClm = list.get(repeatedColIndex);
+			if (fClm == null) {
+				fClm = new Column(col, repeatedColIndex);
+				list.set(repeatedColIndex, fClm);
+			}
+			return fClm;
+		} else {
+			Column newColumn = new Column(col, repeatedColIndex);
+			int size = (repeatedColIndex > 7) ? (repeatedColIndex + 1) : 8;
+			Vector<Column> list = new Vector<Column>(size);
+			list.setSize(repeatedColIndex + 1);
+			list.set(repeatedColIndex, newColumn);
+			mColumnRepository.put(col, list);
+			return newColumn;
+		}
+	}
+
+	TableTableColumnElement getColumnElementByIndex(int colIndex) {
+		int result = 0;
+		TableTableColumnElement columnEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableColumnElement) {
+						columnEle = (TableTableColumnElement) m;
+						if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+							result += 1;
+						} else {
+							result += columnEle.getTableNumberColumnsRepeatedAttribute();
+						}
+					}
+					if (result > colIndex) {
+						break;
+					}
+				}
+			}
+			if (n instanceof TableTableColumnElement) {
+				columnEle = (TableTableColumnElement) n;
+				if (columnEle.getTableNumberColumnsRepeatedAttribute() == null) {
+					result += 1;
+				} else {
+					result += columnEle.getTableNumberColumnsRepeatedAttribute();
+				}
+			}
+			if (result > colIndex) {
+				break;
+			}
+		}
+		return columnEle;
+	}
+
+	TableTableRowElement getRowElementByIndex(int rowIndex) {
+		int result = 0;
+		TableTableRowElement rowEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableRowElement) {
+						rowEle = (TableTableRowElement) m;
+						result += rowEle.getTableNumberRowsRepeatedAttribute();
+					}
+					if (result > rowIndex) {
+						break;
+					}
+				}
+			}
+			if (n instanceof TableTableRowElement) {
+				rowEle = (TableTableRowElement) n;
+				result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+			}
+			if (result > rowIndex) {
+				break;
+			}
+		}
+		return rowEle;
+	}
+
+	/**
+	 * Get the width of the table (in Millimeter).
+	 * <p>
+	 * Throw an UnsupportedOperationException if the table is one sheet of a
+	 * spreadsheet document. because the sheet doesn't have an attribute of
+	 * table width.
+	 * 
+	 * @return the width of the current table (in Millimeter).
+	 *         <p>
+	 *         An UnsupportedOperationException will be thrown if the table is
+	 *         in the spreadsheet document.
+	 */
+	public double getWidth() {
+		if (!mIsSpreadsheet) {
+			String sWidth = mTableElement.getProperty(OdfTableProperties.Width);
+			if (sWidth == null) {
+				int colCount = getColumnCount();
+				double tableWidth = 0;
+				for (int i = 0; i < colCount; i++) {
+					Column col = getColumnByIndex(i);
+					tableWidth += col.getWidth();
+				}
+				return tableWidth;
+			} else{
+				return PositiveLength.parseDouble(sWidth, Unit.MILLIMETER);
+			}
+		} else {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	/**
+	 * Set the width of the table (in Millimeter).
+	 * <p>
+	 * Throw an UnsupportedOperationException if the table is part of a
+	 * spreadsheet document that does not allow to change the table size,
+	 * because spreadsheet is not allow user to set the table size.
+	 * 
+	 * @param width
+	 *            the width that need to set (in Millimeter).
+	 *            <p>
+	 *            An UnsupportedOperationException will be thrown if the table
+	 *            is in the spreadsheet document.
+	 */
+	public void setWidth(double width) {
+		if (!mIsSpreadsheet) {
+			double roundingFactor = 10000.0;
+			//TODO:need refactor to PositiveLength.
+			double inValue = Math.round(roundingFactor * width / Unit.INCH.unitInMillimiter()) / roundingFactor;
+			String sWidthIN = String.valueOf(inValue) + Unit.INCH.abbr();
+			mTableElement.setProperty(OdfTableProperties.Width, sWidthIN);
+			// if the width is changed, we should also change the table:align
+			// properties if it is "margins"
+			// otherwise the width seems not changed
+			String alineStyle = mTableElement.getProperty(StyleTablePropertiesElement.Align);
+			if (TableAlignAttribute.Value.MARGINS.toString().equals(alineStyle)) {
+				mTableElement.setProperty(StyleTablePropertiesElement.Align, TableAlignAttribute.Value.LEFT.toString());
+			}
+		} else {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	static void setLeftTopBorderStyleProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.BorderLeft, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderRight, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderTop, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderBottom, "0.0007in solid #000000");
+	}
+
+	static void setRightTopBorderStyleProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.Border, "0.0007in solid #000000");
+	}
+
+	static void setLeftBottomBorderStylesProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.BorderLeft, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderRight, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderTop, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderBottom, "0.0007in solid #000000");
+
+	}
+
+	static void setRightBottomBorderStylesProperties(OdfStyle style) {
+		style.setProperty(StyleTableCellPropertiesElement.Padding, "0.0382in");
+		style.setProperty(StyleTableCellPropertiesElement.Border, "0.0007in solid #000000");
+		style.setProperty(StyleTableCellPropertiesElement.BorderTop, "none");
+		style.setProperty(StyleTableCellPropertiesElement.BorderBottom, "0.0007in solid #000000");
+	}
+	
+	private static TableTableElement createTable(TableContainer container, int numRows, int numCols,
+			int headerRowNumber, int headerColumnNumber) throws Exception {
+		return createTable(container, numRows, numCols, headerRowNumber, headerColumnNumber, 0, 0);
+	}
+
+	private static TableTableElement createTable(TableContainer container, int numRows, int numCols,
+			int headerRowNumber, int headerColumnNumber, double marginLeft, double marginRight) throws Exception {
+		Document document = getOwnerDocument(container);
+		OdfElement containerElement = container.getTableContainerElement();
+		OdfFileDom dom = (OdfFileDom) containerElement.getOwnerDocument();
+		double tableWidth = getTableWidth(container, marginLeft, marginRight);
+
+		boolean isTextDocument = document instanceof TextDocument;
+
+		// check arguments
+		if (numRows < 1 || numCols < 1 || headerRowNumber < 0 || headerColumnNumber < 0 || headerRowNumber > numRows
+				|| headerColumnNumber > numCols) {
+			throw new IllegalArgumentException("Can not create table with the given parameters:\n" + "Rows " + numRows
+					+ ", Columns " + numCols + ", HeaderRows " + headerRowNumber + ", HeaderColumns "
+					+ headerColumnNumber);
+		}
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		// 1. create table element
+		TableTableElement newTEle = (TableTableElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+				OdfDocumentNamespace.TABLE, "table"));
+		String tablename = getUniqueTableName(container);
+		newTEle.setTableNameAttribute(tablename);
+		// create style
+		OdfStyle tableStyle = styles.newStyle(OdfStyleFamily.Table);
+		String stylename = tableStyle.getStyleNameAttribute();
+		tableStyle.setProperty(StyleTablePropertiesElement.Width, tableWidth + "in");
+		tableStyle.setProperty(StyleTablePropertiesElement.Align, DEFAULT_TABLE_ALIGN);
+		if (marginLeft != 0) {
+			tableStyle.setProperty(StyleTablePropertiesElement.MarginLeft, (new DecimalFormat("#0.##")
+					.format(marginLeft) + Unit.CENTIMETER.abbr()).replace(",", "."));
+		}
+		if (marginRight != 0) {
+			tableStyle.setProperty(StyleTablePropertiesElement.MarginRight, (new DecimalFormat("#0.##")
+					.format(marginRight) + Unit.CENTIMETER.abbr()).replace(",", "."));
+		}
+		newTEle.setStyleName(stylename);
+
+		// 2. create column elements
+		// 2.0 create column style
+		OdfStyle columnStyle = styles.newStyle(OdfStyleFamily.TableColumn);
+		String columnStylename = columnStyle.getStyleNameAttribute();
+		// for spreadsheet document, no need compute column width.
+		if (isTextDocument) {
+			columnStyle.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, IN_FORMAT.format(tableWidth
+					/ numCols)
+					+ "in");
+			columnStyle.setProperty(StyleTableColumnPropertiesElement.RelColumnWidth, Math
+					.round(DEFAULT_REL_TABLE_WIDTH / numCols)
+					+ "*");
+		}
+		// 2.1 create header column elements
+		if (headerColumnNumber > 0) {
+			TableTableHeaderColumnsElement headercolumns = (TableTableHeaderColumnsElement) OdfXMLFactory
+					.newOdfElement(dom, OdfName.newName(OdfDocumentNamespace.TABLE, "table-header-columns"));
+			TableTableColumnElement headercolumn = (TableTableColumnElement) OdfXMLFactory.newOdfElement(dom, OdfName
+					.newName(OdfDocumentNamespace.TABLE, "table-column"));
+			if (headerColumnNumber > 1) {
+				headercolumn.setTableNumberColumnsRepeatedAttribute(headerColumnNumber);
+			} else {
+				headercolumn.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+			}
+			headercolumns.appendChild(headercolumn);
+			newTEle.appendChild(headercolumns);
+			headercolumn.setStyleName(columnStylename);
+		}
+		// 2.2 create common column elements
+		TableTableColumnElement columns = (TableTableColumnElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+				OdfDocumentNamespace.TABLE, "table-column"));
+		int tableNumberColumnsRepeatedValue = numCols - headerColumnNumber;
+		if (tableNumberColumnsRepeatedValue > 1) {
+			columns.setTableNumberColumnsRepeatedAttribute(tableNumberColumnsRepeatedValue);
+		}
+		columns.setStyleName(columnStylename);
+		newTEle.appendChild(columns);
+
+		// 3. create row elements
+		// 3.0 create 4 kinds of styles
+		OdfStyle lefttopStyle = null, leftbottomStyle = null, righttopStyle = null, rightbottomStyle = null;
+
+		if (isTextDocument) {
+			lefttopStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setLeftTopBorderStyleProperties(lefttopStyle);
+
+			leftbottomStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setLeftBottomBorderStylesProperties(leftbottomStyle);
+
+			righttopStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setRightTopBorderStyleProperties(righttopStyle);
+
+			rightbottomStyle = styles.newStyle(OdfStyleFamily.TableCell);
+			setRightBottomBorderStylesProperties(rightbottomStyle);
+		}
+
+		// 3.1 create header row elements
+		if (headerRowNumber > 0) {
+			TableTableHeaderRowsElement headerrows = (TableTableHeaderRowsElement) OdfXMLFactory.newOdfElement(dom,
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-header-rows"));
+			for (int i = 0; i < headerRowNumber; i++) {
+				TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+						OdfDocumentNamespace.TABLE, "table-row"));
+				for (int j = 0; j < numCols; j++) {
+					TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom, OdfName
+							.newName(OdfDocumentNamespace.TABLE, "table-cell"));
+					if (isTextDocument) {
+						if ((j + 1 == numCols) && (i == 0)) {
+							aCell.setStyleName(righttopStyle.getStyleNameAttribute());
+						} else if (i == 0) {
+							aCell.setStyleName(lefttopStyle.getStyleNameAttribute());
+						} else if ((j + 1 == numCols) && (i > 0)) {
+							aCell.setStyleName(rightbottomStyle.getStyleNameAttribute());
+						} else {
+							aCell.setStyleName(leftbottomStyle.getStyleNameAttribute());
+						}
+					}
+					aRow.appendChild(aCell);
+				}
+				headerrows.appendChild(aRow);
+			}
+			newTEle.appendChild(headerrows);
+		}
+
+		// 3.2 create common row elements
+		for (int i = headerRowNumber; i < numRows; i++) {
+			TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+					OdfDocumentNamespace.TABLE, "table-row"));
+			for (int j = 0; j < numCols; j++) {
+				TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+						OdfDocumentNamespace.TABLE, "table-cell"));
+				if (isTextDocument) {
+					if ((j + 1 == numCols) && (i == 0)) {
+						aCell.setStyleName(righttopStyle.getStyleNameAttribute());
+					} else if (i == 0) {
+						aCell.setStyleName(lefttopStyle.getStyleNameAttribute());
+					} else if ((j + 1 == numCols) && (i > 0)) {
+						aCell.setStyleName(rightbottomStyle.getStyleNameAttribute());
+					} else {
+						aCell.setStyleName(leftbottomStyle.getStyleNameAttribute());
+					}
+				}
+				aRow.appendChild(aCell);
+			}
+			newTEle.appendChild(aRow);
+		}
+
+		return newTEle;
+	}
+
+	/**
+	 * Apply the formatting specified in the template to corresponding table
+	 * cells.
+	 * <p>
+	 * A table can only be formatted as one type of styles: even-odd-rows or
+	 * even-odd-columns. The rule is to check the style of odd rows and even
+	 * rows in the template, only if they have one different properties, table:
+	 * style-name or table:paragraph-style-name, the table template will be
+	 * treated as a even-odd-columns styled table.
+	 * <p>
+	 * If one style in the template is null, the style of corresponding cells
+	 * will be removed. An empty template can be used to remove all the styles
+	 * in a table.
+	 * 
+	 * @param template
+	 * @throws IllegalArgumentException
+	 *             if the given template is null
+	 * @throws Exception
+	 *             if content DOM could not be initialized
+	 */
+	public void applyStyle(TableTemplate template) throws Exception {
+
+		if (template == null)
+			throw new IllegalArgumentException(
+					"The template cannot null to be applied to a table.");
+
+		Document doc = this.getOwnerDocument();
+		OdfOfficeAutomaticStyles styles = doc.getContentDom()
+				.getAutomaticStyles();
+
+		// decide row style or column style
+		boolean isEqualTableStyle = true;
+		boolean isEqualParaStyle = true;
+		OdfStyle evenRowsTableStyle = styles.getStyle(template
+				.getTableEvenRowsTableStyle(), OdfStyleFamily.TableCell);
+		OdfStyle oddRowsTableStyle = styles.getStyle(template
+				.getTableOddRowsTableStyle(), OdfStyleFamily.TableCell);
+		OdfStyle evenRowsParagraphStyle = styles.getStyle(template
+				.getTableEvenRowsParagraphStyle(), OdfStyleFamily.Paragraph);
+		OdfStyle oddRowsParagraphStyle = styles.getStyle(template
+				.getTableOddRowsParagraphStyle(), OdfStyleFamily.Paragraph);
+		if (evenRowsTableStyle != null || oddRowsTableStyle != null)
+			isEqualTableStyle = evenRowsTableStyle.compareTo(oddRowsTableStyle) == 0;
+		if (evenRowsParagraphStyle != null || oddRowsParagraphStyle != null)
+			isEqualParaStyle = evenRowsParagraphStyle
+					.compareTo(oddRowsParagraphStyle) == 0;
+
+		Iterator<Row> rowIterator = this.getRowIterator();
+
+		if (rowIterator.hasNext()) { // first row
+			Row currentRow = rowIterator.next();
+			String firstCellTableStyle = template
+					.getExtendedTableStyleByType(TableTemplate.ExtendedStyleType.FIRSTROWSTARTCOLUM);
+			String firstCellParagraphStyle = template
+					.getExtendedParagraphStyleByType(TableTemplate.ExtendedStyleType.FIRSTROWSTARTCOLUM);
+			String lastCellTableStyle = template
+					.getExtendedTableStyleByType(TableTemplate.ExtendedStyleType.FIRSTROWENDCOLUMN);
+			String lastCellParagraphStyle = template
+					.getExtendedParagraphStyleByType(TableTemplate.ExtendedStyleType.FIRSTROWENDCOLUMN);
+			String evenCellTableStyle = template.getTableFirstRowTableStyle();
+			String evenCellParagraphStyle = template
+					.getTableFirstRowParagraphStyle();
+			String oddCellTableStyle = evenCellTableStyle;
+			String oddCellParagraphStyle = evenCellParagraphStyle;
+
+			applyStyleToRow(template, currentRow, firstCellTableStyle,
+					oddCellTableStyle, evenCellTableStyle, lastCellTableStyle,
+					firstCellParagraphStyle, oddCellParagraphStyle,
+					evenCellParagraphStyle, lastCellParagraphStyle);
+
+			int line = 0;
+			while (rowIterator.hasNext()) {
+				currentRow = rowIterator.next();
+				line++;
+
+				if (!rowIterator.hasNext()) { // last row
+					firstCellTableStyle = template
+							.getExtendedTableStyleByType(TableTemplate.ExtendedStyleType.LASTROWSTARTCOLUMN);
+					firstCellParagraphStyle = template
+							.getExtendedParagraphStyleByType(TableTemplate.ExtendedStyleType.LASTROWSTARTCOLUMN);
+					lastCellTableStyle = template
+							.getExtendedTableStyleByType(TableTemplate.ExtendedStyleType.LASTROWENDCOLUMN);
+					lastCellParagraphStyle = template
+							.getExtendedParagraphStyleByType(TableTemplate.ExtendedStyleType.LASTROWENDCOLUMN);
+					oddCellTableStyle = evenCellTableStyle = template
+							.getTableLastRowTableStyle();
+					oddCellParagraphStyle = evenCellParagraphStyle = template
+							.getTableLastRowParagraphStyle();
+
+					applyStyleToRow(template, currentRow, firstCellTableStyle,
+							oddCellTableStyle, evenCellTableStyle,
+							lastCellTableStyle, firstCellParagraphStyle,
+							oddCellParagraphStyle, evenCellParagraphStyle,
+							lastCellParagraphStyle);
+
+				} else if (!isEqualTableStyle || !isEqualParaStyle) {
+					firstCellTableStyle = template
+							.getTableFirstColumnTableStyle();
+					firstCellParagraphStyle = template
+							.getTableFirstColumnParagraphStyle();
+					lastCellTableStyle = template
+							.getTableLastColumnTableStyle();
+					lastCellParagraphStyle = template
+							.getTableLastColumnParagraphStyle();
+
+					if (line % 2 != 0) { // odd row
+
+						oddCellTableStyle = evenCellTableStyle = template
+								.getTableOddRowsTableStyle();
+						oddCellParagraphStyle = evenCellParagraphStyle = template
+								.getTableOddRowsParagraphStyle();
+						applyStyleToRow(template, currentRow,
+								firstCellTableStyle, oddCellTableStyle,
+								evenCellTableStyle, lastCellTableStyle,
+								firstCellParagraphStyle, oddCellParagraphStyle,
+								evenCellParagraphStyle, lastCellParagraphStyle);
+					} else { // even row
+
+						oddCellTableStyle = evenCellTableStyle = template
+								.getTableEvenRowsTableStyle();
+						oddCellParagraphStyle = evenCellParagraphStyle = template
+								.getTableEvenRowsParagraphStyle();
+
+						applyStyleToRow(template, currentRow,
+								firstCellTableStyle, oddCellTableStyle,
+								evenCellTableStyle, lastCellTableStyle,
+								firstCellParagraphStyle, oddCellParagraphStyle,
+								evenCellParagraphStyle, lastCellParagraphStyle);
+					}
+
+				} else { // even&odd column
+					firstCellTableStyle = template
+							.getTableFirstColumnTableStyle();
+					firstCellParagraphStyle = template
+							.getTableFirstColumnParagraphStyle();
+					lastCellTableStyle = template
+							.getTableLastColumnTableStyle();
+					lastCellParagraphStyle = template
+							.getTableLastColumnParagraphStyle();
+					evenCellTableStyle = template
+							.getTableEvenColumnsTableStyle();
+					evenCellParagraphStyle = template
+							.getTableEvenColumnsParagraphStyle();
+					oddCellTableStyle = template.getTableOddColumnsTableStyle();
+					oddCellParagraphStyle = template
+							.getTableOddColumnsParagraphStyle();
+					applyStyleToRow(template, currentRow, firstCellTableStyle,
+							oddCellTableStyle, evenCellTableStyle,
+							lastCellTableStyle, firstCellParagraphStyle,
+							oddCellParagraphStyle, evenCellParagraphStyle,
+							lastCellParagraphStyle);
+				}
+			}
+
+		}
+
+	}
+
+	private void applyStyleToRow(TableTemplate template, Row row,
+			String firstCellTableStyle, String oddCellTableStyle,
+			String evenCellTableStyle, String lastCellTableStyle,
+			String firstCellParagraphStyle, String oddCellParagraphStyle,
+			String evenCellParagraphStyle, String lastCellParagraphStyle) {
+		int cellIndex = 0;
+		int mnRepeatedIndex = row.getRowsRepeatedNumber();
+		int lastIndex = row.getCellCount() - 1;
+		Cell cell;
+		String tableStyle, paraStyle;
+		for (Node n : new DomNodeList(row.getOdfElement().getChildNodes())) {
+			if (n instanceof TableTableCellElementBase) {
+				cell = this.getCellInstance((TableTableCellElementBase) n, 0,
+						mnRepeatedIndex);
+				if (cell.getColumnsRepeatedNumber() > 1)
+					lastIndex -= cell.getColumnsRepeatedNumber() - 1;
+				if (cellIndex == 0) {
+					tableStyle = firstCellTableStyle;
+					paraStyle = firstCellParagraphStyle;
+				} else if (cellIndex == lastIndex) {
+					tableStyle = lastCellTableStyle;
+					paraStyle = lastCellParagraphStyle;
+				} else if (cellIndex % 2 == 0) {
+					tableStyle = evenCellTableStyle;
+					paraStyle = evenCellParagraphStyle;
+				} else {
+					tableStyle = oddCellTableStyle;
+					paraStyle = oddCellParagraphStyle;
+				}
+				cell.setCellStyleName(tableStyle);
+				Iterator<Paragraph> paraIterator = cell.getParagraphIterator();
+				while (paraIterator.hasNext()) {
+					Paragraph t = paraIterator.next();
+					t.getOdfElement().setStyleName(paraStyle);
+				}
+				cellIndex++;
+			}
+		}
+	}
+
+	private static String getUniqueTableName(TableContainer container) {
+		List<Table> tableList = container.getTableList();
+		boolean notUnique = true;
+
+		String tablename = "Table" + (tableList.size() + 1);
+
+		while (notUnique) {
+			notUnique = false;
+			for (int i = 0; i < tableList.size(); i++) {
+				if (tableList.get(i).getTableName() != null) {
+					if (tableList.get(i).getTableName().equalsIgnoreCase(tablename)) {
+						notUnique = true;
+						break;
+					}
+				}
+			}
+			if (notUnique) {
+				tablename = tablename + Math.round(Math.random() * 10);
+			}
+		}
+
+		return tablename;
+
+	}
+
+	/**
+	 * Get the row count of this table.
+	 * 
+	 * @return total count of rows
+	 */
+	public int getRowCount() {
+		int result = 0;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				result += getHeaderRowCount((TableTableHeaderRowsElement) n);
+			}
+			if (n instanceof TableTableRowElement) {
+				result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+			}
+			if (n instanceof TableTableRowsElement) {
+				for (Node nn : new DomNodeList(n.getChildNodes())) {
+					if (nn instanceof TableTableRowElement) {
+						result += ((TableTableRowElement) nn).getTableNumberRowsRepeatedAttribute();
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Get the column count of this table.
+	 * 
+	 * @return total count of columns
+	 */
+	public int getColumnCount() {
+		int result = 0;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			// TODO: how about <table:table-column-group>
+			if (n instanceof TableTableHeaderColumnsElement) {
+				result += getHeaderColumnCount((TableTableHeaderColumnsElement) n);
+			}
+
+			// <table:table-columns>
+			if (n instanceof TableTableColumnsElement) {
+				result += getColumnsCount((TableTableColumnsElement) n);
+			}
+
+			if (n instanceof TableTableColumnElement) {
+				result += ((TableTableColumnElement) n).getTableNumberColumnsRepeatedAttribute();
+			}
+			// as different type of elements appear in order, so if n is one of
+			// the the following elements, computing will stop. It's helpful
+			// when the table has lots of rows.
+			if (n instanceof TableTableHeaderRowsElement || n instanceof TableTableRowsElement
+					|| n instanceof TableTableRowGroupElement || n instanceof TableTableRowElement) {
+				break;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * This method is invoked by appendRow. When a table has no row, the first
+	 * row is a default row.
+	 */
+	private TableTableRowElement createDefaultRow(int columnCount, boolean createRepeatedCell) {
+		OdfFileDom dom = (OdfFileDom) mTableElement.getOwnerDocument();
+		TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+				OdfDocumentNamespace.TABLE, "table-row"));
+		if (createRepeatedCell) {
+			TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+					OdfDocumentNamespace.TABLE, "table-cell"));
+			if (columnCount > 1) {
+				aCell.setTableNumberColumnsRepeatedAttribute(columnCount);
+			}
+			if (!mIsSpreadsheet) {
+				OdfOfficeAutomaticStyles automaticStyles = mTableElement.getAutomaticStyles();
+				OdfStyle borderStyle = automaticStyles.newStyle(OdfStyleFamily.TableCell);
+				setRightTopBorderStyleProperties(borderStyle);
+				aCell.setStyleName(borderStyle.getStyleNameAttribute());
+			}
+			aRow.appendChild(aCell);
+		} else {
+			OdfStyle lefttopStyle = null, righttopStyle = null;
+			// create 2 kinds of styles
+			if (!mIsSpreadsheet) {
+				OdfOfficeAutomaticStyles automaticStyles = mTableElement.getAutomaticStyles();
+				lefttopStyle = automaticStyles.newStyle(OdfStyleFamily.TableCell);
+				setLeftTopBorderStyleProperties(lefttopStyle);
+				righttopStyle = automaticStyles.newStyle(OdfStyleFamily.TableCell);
+				setRightTopBorderStyleProperties(righttopStyle);
+			}
+			for (int j = 0; j < columnCount; j++) {
+				TableTableCellElement aCell = (TableTableCellElement) OdfXMLFactory.newOdfElement(dom, OdfName.newName(
+						OdfDocumentNamespace.TABLE, "table-cell"));
+				if (!mIsSpreadsheet) {
+					if (j + 1 == columnCount) {
+						aCell.setStyleName(righttopStyle.getStyleNameAttribute());
+					} else {
+						aCell.setStyleName(lefttopStyle.getStyleNameAttribute());
+					}
+				}
+				aRow.appendChild(aCell);
+			}
+		}
+		return aRow;
+	}
+
+	/**
+	 * Append a row to the end of the table. The style of new row is same with
+	 * the last row in the table.
+	 * <p>
+	 * Since SIMPLE supports automatic table expansion. Whenever a cell outside
+	 * the current table is addressed the table is instantly expanded. Method
+	 * <code>getCellByPosition</code> can randomly access any cell, no matter it
+	 * in or out of the table original range.
+	 * 
+	 * @return a new appended row
+	 * @see #appendRows(int)
+	 * @see #getRowByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public Row appendRow() {
+		// find append position
+		Node childNode = mTableElement.getLastChild();
+		// where is the new row inserted before.
+		Node positionNode = null;
+		// row style and structure clone from.
+		TableTableRowElement refRowElement = null;
+		TableTableRowElement newRow = null;
+		if (childNode instanceof TableNamedExpressionsElement) {
+			childNode = childNode.getPreviousSibling();
+			positionNode = childNode;
+		}
+		if (childNode instanceof TableTableRowElement) {
+			refRowElement = (TableTableRowElement) childNode;
+		}
+		// TODO: what about childNode instanceof TableTableHeaderRowsElement,
+		// TableTableRowsElement or TableTableRowGroupElement
+		int columnCount = getColumnCount();
+		// no row, create a default row
+		if (refRowElement == null) {
+			newRow = createDefaultRow(columnCount, true);
+			mTableElement.appendChild(newRow);
+		} else {
+			newRow = (TableTableRowElement) OdfXMLFactory.newOdfElement((OdfFileDom) mTableElement.getOwnerDocument(),
+					OdfName.newName(OdfDocumentNamespace.TABLE, "table-row"));
+			TableTableCellElementBase cellElement = (TableTableCellElementBase) refRowElement.getFirstChild();
+			int i = 1;
+			while (cellElement != null && i <= columnCount) {
+				// covered element
+				String tableNameSpace = OdfDocumentNamespace.TABLE.getUri();
+				if (cellElement instanceof TableCoveredTableCellElement) {
+					TableCoveredTableCellElement coveredCellEle = (TableCoveredTableCellElement) cellElement;
+					// find cover cell element
+					TableTableRowElement aRowEle = (TableTableRowElement) (coveredCellEle.getParentNode()
+							.getPreviousSibling());
+					while (aRowEle != null) {
+						// the cover cell and the first covered cell must have
+						// the same column index.
+						TableTableCellElementBase coverCellEle = (TableTableCellElementBase) (aRowEle.getFirstChild());
+						int j = coverCellEle.getTableNumberColumnsRepeatedAttribute();
+						while (j < i) {
+							coverCellEle = (TableTableCellElementBase) (coverCellEle.getNextSibling());
+							if (coverCellEle instanceof TableTableCellElement) {
+								j += (coverCellEle.getTableNumberColumnsRepeatedAttribute() * (((TableTableCellElement) coverCellEle)
+										.getTableNumberColumnsSpannedAttribute()));
+							} else {
+								j += coverCellEle.getTableNumberColumnsRepeatedAttribute();
+							}
+						}
+						// find the cover cell, now start cell clone.
+						if (coverCellEle instanceof TableTableCellElement) {
+							TableTableCellElement newCellEle = (TableTableCellElement) (coverCellEle.cloneNode(true));
+							cleanCell(newCellEle);
+							newCellEle.removeAttributeNS(tableNameSpace, "number-rows-spanned");
+							newRow.appendChild(newCellEle);
+							// deal with the following covered cell, spread
+							// sheet need change these covered cell to cell.
+							if (mIsSpreadsheet) {
+								// update column repeated number.
+								int columnsSpannedNumber = newCellEle.getTableNumberColumnsSpannedAttribute();
+								newCellEle.removeAttributeNS(tableNameSpace, "number-columns-spanned");
+								int newColumnRepeatedNumber = newCellEle.getTableNumberColumnsRepeatedAttribute()
+										* columnsSpannedNumber;
+								if (newColumnRepeatedNumber > 1) {
+									newCellEle.setTableNumberColumnsRepeatedAttribute(newColumnRepeatedNumber);
+								} else {
+									newCellEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+								}
+								// ignore the following covered cell of
+								// reference row.
+								// added by Daisy because of a bug in demo4
+								// cellElement is a covered cell. coverCellEle
+								// is its cover cell.
+								// below codes will count
+								// newColumnRepeatedNumber covered cell.
+								int tempi = newColumnRepeatedNumber;
+								while (tempi > 0) {
+									int iColumnRepeatedNumber = cellElement.getTableNumberColumnsRepeatedAttribute();
+									if (iColumnRepeatedNumber > tempi) {
+										// split covered cell
+										if (cellElement instanceof TableCoveredTableCellElement) {
+											cellElement.setTableNumberColumnsRepeatedAttribute(iColumnRepeatedNumber
+													- tempi);
+											TableTableCellElementBase newCoveredCellEle = (TableTableCellElementBase) cellElement
+													.cloneNode(true);
+											cleanCell(newCoveredCellEle);
+											if (tempi > 1) {
+												newCoveredCellEle.setTableNumberColumnsRepeatedAttribute(tempi);
+											} else {
+												newCoveredCellEle.removeAttributeNS(
+														OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+											}
+											refRowElement.insertBefore(newCoveredCellEle, cellElement);
+											cellElement = newCoveredCellEle;
+										}
+									}
+									tempi = tempi - cellElement.getTableNumberColumnsRepeatedAttribute();
+									i = i + cellElement.getTableNumberColumnsRepeatedAttribute();
+									if (!(cellElement instanceof TableCoveredTableCellElement) && (tempi > 0)){
+										Logger.getLogger(Table.class.getName()).log(Level.FINE,	"Not covered cell was ignored");
+									}
+									cellElement = (TableTableCellElementBase) (cellElement.getNextSibling());
+									// while ((cellElement != null) &&
+									// (cellElement instanceof
+									// TableCoveredTableCellElement)) {
+									// cellElement = (TableTableCellElementBase)
+									// (cellElement.getNextSibling());
+									// }
+								}
+								// i += newColumnRepeatedNumber;
+							} else {
+								// clone the following covered cell of reference
+								// row.
+								// added by Daisy because of a bug in demo4
+								cellElement = (TableTableCellElementBase) cellElement.getNextSibling();
+								i += cellElement.getTableNumberColumnsRepeatedAttribute();
+								int newColumnSpanNumber = newCellEle.getTableNumberColumnsSpannedAttribute();
+								while ((cellElement != null) && (cellElement instanceof TableCoveredTableCellElement)
+										&& (newColumnSpanNumber > 1)) {
+									TableCoveredTableCellElement newCoveredCellElement = (TableCoveredTableCellElement) cellElement
+											.cloneNode(true);
+									cleanCell(newCoveredCellElement);
+									newRow.appendChild(newCoveredCellElement);
+									i += cellElement.getTableNumberColumnsRepeatedAttribute();
+									cellElement = (TableTableCellElementBase) cellElement.getNextSibling();
+									newColumnSpanNumber--;
+								}
+							}
+							break;
+						}
+						// continue find cover cell
+						Node preNode = aRowEle.getPreviousSibling();
+						if (preNode instanceof TableTableRowElement) {
+							aRowEle = (TableTableRowElement) preNode;
+						} else {
+							// </table:table-header-rows>
+							aRowEle = (TableTableRowElement) (preNode.getLastChild());
+						}
+					}
+				} else {
+					TableTableCellElement newCellEle = (TableTableCellElement) cellElement.cloneNode(true);
+					cleanCell(newCellEle);
+					newRow.appendChild(newCellEle);
+					Integer tableNumberColumnsRepeated = newCellEle.getTableNumberColumnsRepeatedAttribute();
+					Integer tableNumberColumnsSpanned = newCellEle.getTableNumberColumnsSpannedAttribute();
+					i += tableNumberColumnsRepeated * tableNumberColumnsSpanned;
+					cellElement = (TableTableCellElementBase) cellElement.getNextSibling();
+					if (tableNumberColumnsSpanned > 1) {
+						int j = 1;
+						if (mIsSpreadsheet) {
+							newCellEle.removeAttributeNS(tableNameSpace, "number-columns-spanned");
+							int newColumnRepeatedNumber = tableNumberColumnsRepeated * tableNumberColumnsSpanned;
+							if (newColumnRepeatedNumber > 1) {
+								newCellEle.setTableNumberColumnsRepeatedAttribute(newColumnRepeatedNumber);
+							} else {
+								newCellEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+							}
+							// cellElement is not a covered cell.
+							// below codes will count
+							// (newColumnRepeatedNumber-1) covered cell.
+							int tempi = newColumnRepeatedNumber;
+							while (tempi > 1) {
+								int iColumnRepeatedNumber = cellElement.getTableNumberColumnsRepeatedAttribute();
+								if (iColumnRepeatedNumber > tempi + 1) {
+									// split covered cell
+									if (cellElement instanceof TableCoveredTableCellElement) {
+										cellElement.setTableNumberColumnsRepeatedAttribute(iColumnRepeatedNumber
+												- tempi + 1);
+										TableTableCellElementBase newCoveredCellEle = (TableTableCellElementBase) cellElement
+												.cloneNode(true);
+										cleanCell(newCoveredCellEle);
+										newCoveredCellEle.setTableNumberColumnsRepeatedAttribute(tempi - 1);
+										refRowElement.insertBefore(newCoveredCellEle, cellElement);
+										cellElement = newCoveredCellEle;
+									}
+								}
+								tempi = tempi - cellElement.getTableNumberColumnsRepeatedAttribute();
+								if (!(cellElement instanceof TableCoveredTableCellElement) && (tempi > 1)){
+									Logger.getLogger(Table.class.getName()).log(Level.FINE,	"Not covered cell was ignored");
+								}
+								cellElement = (TableTableCellElementBase) (cellElement.getNextSibling());
+							}
+						} else {
+							while ((j < tableNumberColumnsSpanned) && (cellElement != null)) {
+								int iColumnRepeatedNumber = cellElement.getTableNumberColumnsRepeatedAttribute();
+								if (iColumnRepeatedNumber > tableNumberColumnsSpanned - j) {
+									// split covered cell
+									if (cellElement instanceof TableCoveredTableCellElement) {
+										cellElement.setTableNumberColumnsRepeatedAttribute(iColumnRepeatedNumber
+												- tableNumberColumnsSpanned + j);
+										TableTableCellElementBase newCoveredCellEle = (TableTableCellElementBase) cellElement
+												.cloneNode(true);
+										cleanCell(newCoveredCellEle);
+										newCoveredCellEle
+												.setTableNumberColumnsRepeatedAttribute(tableNumberColumnsSpanned - j);
+										refRowElement.insertBefore(newCoveredCellEle, cellElement);
+										cellElement = newCoveredCellEle;
+									}
+								}
+								TableTableCellElementBase newCoveredCellEle = (TableTableCellElementBase) cellElement
+										.cloneNode(true);
+								cleanCell(newCoveredCellEle);
+								newRow.appendChild(newCoveredCellEle);
+								j += newCoveredCellEle.getTableNumberColumnsRepeatedAttribute();
+								cellElement = (TableTableCellElementBase) cellElement.getNextSibling();
+							}
+						}
+					}
+				}
+			}
+			if (positionNode == null) {
+				mTableElement.appendChild(newRow);
+			} else {
+				mTableElement.insertBefore(newRow, positionNode);
+			}
+		}
+		return getRowInstance(newRow, 0);
+	}
+
+	/**
+	 * Append a specific number of rows to the end of the table. The style of
+	 * new rows are same with the last row in the table.
+	 * <p>
+	 * Since SIMPLE supports automatic table expansion. Whenever a cell outside
+	 * the current table is addressed the table is instantly expanded. Method
+	 * <code>getCellByPosition</code> can randomly access any cell, no matter it
+	 * in or out of the table original range.
+	 * 
+	 * @param rowCount
+	 *            is the number of rows to be appended.
+	 * @return a list of new appended rows
+	 * @see #appendRow()
+	 * @see #getRowByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public List<Row> appendRows(int rowCount) {
+		return appendRows(rowCount, false);
+	}
+
+	List<Row> appendRows(int rowCount, boolean isCleanStyle) {
+		List<Row> resultList = new ArrayList<Row>();
+		if (rowCount <= 0) {
+			return resultList;
+		}
+		if (isUseRepeat()) {
+			Row firstRow = appendRow();
+			resultList.add(firstRow);
+			if (rowCount > 1) {
+				firstRow.setRowsRepeatedNumber(rowCount);
+				TableTableRowElement firstRowEle = firstRow.getOdfElement();
+				for (int i = 1; i < rowCount; i++) {
+					Row row = getRowInstance(firstRowEle, i);
+					resultList.add(row);
+				}
+			}
+		} else {
+			for (int i = 0; i < rowCount; i++) {
+				Row firstRow = appendRow();
+				resultList.add(firstRow);
+			}
+		}
+		if (isCleanStyle) {
+			// clean style name
+			String tableNameSpace = OdfDocumentNamespace.TABLE.getUri();
+			for (Row row : resultList) {
+				Node cellE = row.getOdfElement().getFirstChild();
+				while (cellE != null) {
+					((TableTableCellElementBase) cellE).removeAttributeNS(tableNameSpace, "style-name");
+					cellE = cellE.getNextSibling();
+				}
+			}
+		}
+		return resultList;
+	}
+
+	/**
+	 * Append a column at the end of the table. The style of new column is same
+	 * with the last column in the table.
+	 * <p>
+	 * Since SIMPLE supports automatic table expansion. Whenever a cell outside
+	 * the current table is addressed the table is instantly expanded. Method
+	 * <code>getCellByPosition</code> can randomly access any cell, no matter it
+	 * in or out of the table original range.
+	 * 
+	 * @return a new appended column
+	 * @see #appendColumns(int)
+	 * @see #getColumnByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public Column appendColumn() {
+		List<Column> columnList = getColumnList();
+		int columnCount = columnList.size();
+
+		TableTableColumnElement newColumn;
+		OdfElement positonElement = getRowElementByIndex(0);
+		if (positonElement.getParentNode() instanceof TableTableHeaderRowsElement) {
+			positonElement = (OdfElement) positonElement.getParentNode();
+		}
+
+		// Moved before column elements inserted
+		// insert cells firstly
+		// Or else, wrong column number will be gotten in updateCellRepository,
+		// which will cause a NPE.
+		// insertCellBefore()->splitRepeatedRows()->updateRowRepository()->updateCellRepository()
+		List<Row> rowList = getRowList();
+		for (int i = 0; i < rowList.size();) {
+			Row row1 = rowList.get(i);
+			row1.insertCellBefore(row1.getCellByIndex(columnCount - 1), null);
+			i = i + row1.getRowsRepeatedNumber();
+		}
+
+		// insert columns secondly
+		if (columnList.size() == 0) // no column, create a new column
+		{
+			OdfStyle columnStyle = mTableElement.getAutomaticStyles().newStyle(OdfStyleFamily.TableColumn);
+			String columnStylename = columnStyle.getStyleNameAttribute();
+			columnStyle.setProperty(StyleTableColumnPropertiesElement.ColumnWidth, DEFAULT_TABLE_WIDTH + "in");
+			columnStyle.setProperty(StyleTableColumnPropertiesElement.RelColumnWidth, DEFAULT_REL_TABLE_WIDTH + "*");
+
+			newColumn = (TableTableColumnElement) OdfXMLFactory.newOdfElement((OdfFileDom) mTableElement
+					.getOwnerDocument(), OdfName.newName(OdfDocumentNamespace.TABLE, "table-column"));
+			newColumn.setStyleName(columnStylename);
+			mTableElement.insertBefore(newColumn, positonElement);
+		} else { // has column, append a same column as the last one.
+			TableTableColumnElement refColumn = columnList.get(columnList.size() - 1).getOdfElement();
+			newColumn = (TableTableColumnElement) refColumn.cloneNode(true);
+			String tableNameSpace = OdfDocumentNamespace.TABLE.getUri();
+			newColumn.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+			mTableElement.insertBefore(newColumn, positonElement);
+		}
+
+		return getColumnInstance(newColumn, 0);
+	}
+
+	/**
+	 * Append a specific number of columns to the right of the table. The style
+	 * of new columns are same with the rightmost column in the table.
+	 * <p>
+	 * Since SIMPLE supports automatic table expansion. Whenever a cell outside
+	 * the current table is addressed the table is instantly expanded. Method
+	 * <code>getCellByPosition</code> can randomly access any cell, no matter it
+	 * in or out of the table original range.
+	 * 
+	 * @param columnCount
+	 *            is the number of columns to be appended.
+	 * @return a list of new appended columns
+	 * @see #appendColumn()
+	 * @see #getColumnByIndex(int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 */
+	public List<Column> appendColumns(int columnCount) {
+		return appendColumns(columnCount, false);
+	}
+
+	List<Column> appendColumns(int columnCount, boolean isCleanStyle) {
+		List<Column> resultList = new ArrayList<Column>();
+		if (columnCount <= 0) {
+			return resultList;
+		}
+		Column firstClm = appendColumn();
+		resultList.add(firstClm);
+		if (columnCount > 1) {
+			List<Column> list = insertColumnsBefore((getColumnCount() - 1), (columnCount - 1));
+			resultList.addAll(list);
+		}
+		// clean style name
+		if (isCleanStyle) {
+			for (Column column : resultList) {
+				int length = column.getCellCount();
+				for (int i = 0; i < length; i++) {
+					TableTableCellElementBase cellElement = column.getCellByIndex(i).mCellElement;
+					cellElement.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "style-name");
+				}
+			}
+		}
+		return resultList;
+	}
+
+	/**
+	 * This method is to insert a numbers of row
+	 */
+	private List<Row> insertMultipleRowsBefore(Row refRow, Row positionRow, int count) {
+		List<Row> resultList = new ArrayList<Row>();
+		int j = 1;
+
+		if (count <= 0) {
+			return resultList;
+		}
+
+		Row firstRow = insertRowBefore(refRow, positionRow, getColumnCount());
+		resultList.add(firstRow);
+
+		if (count == 1) {
+			return resultList;
+		}
+		TableTableRowElement rowEle = firstRow.getOdfElement();
+		for (int i = 0; i < getColumnCount();) {
+			Cell refCell = refRow.getCellByIndex(i);
+			if (!refCell.isCoveredElement()) {
+				int coveredHeigth = refCell.getRowSpannedNumber();
+				if (coveredHeigth > 1) {
+					refCell.setRowSpannedNumber(coveredHeigth + 1);
+				}
+			}
+			i += refCell.getColumnsRepeatedNumber();
+		}
+		if (isUseRepeat()) {
+			firstRow.setRowsRepeatedNumber(count);
+			while (j < count) {
+				resultList.add(getRowInstance(rowEle, j));
+				j++;
+			}
+		} else {
+			while (j < count) {
+				TableTableRowElement newRowEle = (TableTableRowElement) rowEle.cloneNode(true);
+				newRowEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-repeated");
+				mTableElement.insertBefore(newRowEle, positionRow.getOdfElement());
+				resultList.add(getRowInstance(newRowEle, 0));
+				j++;
+			}
+		}
+		return resultList;
+	}
+
+	// only insert one Row
+	private Row insertRowBefore(Row refRow, Row positionRow, int columnCount) {
+		TableTableRowElement aRow = (TableTableRowElement) OdfXMLFactory.newOdfElement((OdfFileDom) mTableElement
+				.getOwnerDocument(), OdfName.newName(OdfDocumentNamespace.TABLE, "table-row"));
+		int coveredLength = 0, coveredHeigth = 0;
+		for (int i = 0; i < columnCount;) {
+			Cell refCell = refRow.getCellByIndex(i);
+			int columnsRepeatedNumber = refCell.getColumnsRepeatedNumber();
+			if (!refCell.isCoveredElement()) // not cover element
+			{
+				TableTableCellElement aCellEle = (TableTableCellElement) refCell.getOdfElement();
+				coveredHeigth = aCellEle.getTableNumberRowsSpannedAttribute();
+				if (coveredHeigth == 1) {
+					TableTableCellElement newCellEle = (TableTableCellElement) aCellEle.cloneNode(true);
+					cleanCell(newCellEle);
+					aRow.appendChild(newCellEle);
+				} else { // cover more rows
+					aCellEle.setTableNumberRowsSpannedAttribute(coveredHeigth + 1);
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) OdfXMLFactory
+							.newOdfElement((OdfFileDom) mTableElement.getOwnerDocument(), OdfName.newName(
+									OdfDocumentNamespace.TABLE, "covered-table-cell"));
+					if (columnsRepeatedNumber > 1) {
+						newCellEle.setTableNumberColumnsRepeatedAttribute(columnsRepeatedNumber);
+					} else {
+						newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-columns-repeated");
+					}
+					aRow.appendChild(newCellEle);
+				}
+
+				coveredLength = aCellEle.getTableNumberColumnsSpannedAttribute() - columnsRepeatedNumber;
+				i = i + columnsRepeatedNumber;
+			} else {
+				TableCoveredTableCellElement aCellEle = (TableCoveredTableCellElement) refCell.getOdfElement();
+				if (coveredLength >= 1) {
+					TableCoveredTableCellElement newCellEle = (TableCoveredTableCellElement) aCellEle.cloneNode(true);
+					aRow.appendChild(newCellEle);
+					coveredLength -= newCellEle.getTableNumberColumnsRepeatedAttribute();
+				} else {
+					TableTableCellElement coveredCell = (TableTableCellElement) refCell.getCoverCell().getOdfElement();
+					TableTableCellElement newCellEle = (TableTableCellElement) coveredCell.cloneNode(true);
+					cleanCell(newCellEle);
+					newCellEle.removeAttributeNS(OdfDocumentNamespace.TABLE.getUri(), "number-rows-spanned");
+					aRow.appendChild(newCellEle);
+					coveredLength = coveredCell.getTableNumberColumnsSpannedAttribute() - columnsRepeatedNumber;
+				}
+				i = i + columnsRepeatedNumber;
+			}
+		}
+		if (positionRow == null) {
+			mTableElement.appendChild(aRow);
+		} else {
+			mTableElement.insertBefore(aRow, positionRow.getOdfElement());
+		}
+
+		return getRowInstance(aRow, 0);
+	}
+
+	void cleanCell(TableTableCellElementBase newCellEle) {
+		String officeNameSpaceURI = OdfDocumentNamespace.OFFICE.getUri();
+		String tableNameSpaceURI = OdfDocumentNamespace.TABLE.getUri();
+		newCellEle.removeAttributeNS(officeNameSpaceURI, "value");
+		newCellEle.removeAttributeNS(officeNameSpaceURI, "date-value");
+		newCellEle.removeAttributeNS(officeNameSpaceURI, "time-value");
+		newCellEle.removeAttributeNS(officeNameSpaceURI, "boolean-value");
+		newCellEle.removeAttributeNS(officeNameSpaceURI, "string-value");
+		newCellEle.removeAttributeNS(tableNameSpaceURI, "formula");
+		newCellEle.removeAttributeNS(officeNameSpaceURI, "value-type");
+		if (!isCellStyleInheritance()) {
+			newCellEle.removeAttributeNS(tableNameSpaceURI, "style-name");
+		}
+		Node n = newCellEle.getFirstChild();
+		while (n != null) {
+			Node m = n.getNextSibling();
+			if (n instanceof TextPElement || n instanceof TextHElement || n instanceof TextListElement
+					|| n instanceof OfficeAnnotationElement) {
+				newCellEle.removeChild(n);
+			}
+			n = m;
+		}
+	}
+
+	/**
+	 * Return an instance of <code>TableTableElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>TableTableElement</code>
+	 */
+	public TableTableElement getOdfElement() {
+		return mTableElement;
+	}
+
+	/**
+	 * Insert a specific number of columns before the column whose index is
+	 * <code>index</code>.
+	 * 
+	 * @param index
+	 *            is the index of the column to insert before.
+	 * @param columnCount
+	 *            is the number of columns to insert.
+	 * @return a list of new inserted columns
+	 */
+	public List<Column> insertColumnsBefore(int index, int columnCount) {
+		Column refColumn, positionCol;
+		String tableNameSpace = OdfDocumentNamespace.TABLE.getUri();
+		ArrayList<Column> list = new ArrayList<Column>();
+		int columncount = getColumnCount();
+
+		if (index >= columncount) {
+			throw new IndexOutOfBoundsException();
+		}
+
+		if (index == 0) {
+			int iRowCount = getRowCount();
+			for (int i = 0; i < iRowCount; i++) {
+				Row row = getRowByIndex(i);
+				row.insertCellByIndex(index, columnCount);
+			}
+			refColumn = getColumnByIndex(index);
+			positionCol = refColumn;
+			// add a single column element to describe columns.
+			if (isUseRepeat()) {
+				TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement().cloneNode(
+						true);
+				if (columnCount > 1) {
+					newColumnEle.setTableNumberColumnsRepeatedAttribute(columnCount);
+				} else {
+					newColumnEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+				}
+				mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+				for (int i = 0; i < columnCount; i++) {
+					list.add(getColumnInstance(newColumnEle, i));
+				}
+			} else {
+				for (int i = 0; i < columnCount; i++) {
+					TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement()
+							.cloneNode(true);
+					mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+					newColumnEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+					list.add(getColumnInstance(newColumnEle, 0));
+				}
+			}
+			return list;
+		}
+
+		// 1. insert the cell
+		int iRowCount = getRowCount();
+		for (int i = iRowCount - 1; i >= 0;) {
+			Row row = getRowByIndex(i);
+			Cell refCell = row.getCellByIndex(index - 1);
+			Cell positionCell = null;
+			positionCell = row.getCellByIndex(index);
+			row.insertCellBefore(refCell, positionCell, columnCount);
+			i = i - row.getRowsRepeatedNumber();
+		}
+
+		refColumn = getColumnByIndex(index - 1);
+		positionCol = getColumnByIndex(index);
+		// 2. insert a <table:table-column>
+		if (refColumn.getOdfElement() == positionCol.getOdfElement()) {
+			TableTableColumnElement column = refColumn.getOdfElement();
+			int repeatedCount = column.getTableNumberColumnsRepeatedAttribute();
+			TableTableColumnElement columnEle = positionCol.getOdfElement();
+			// add a single column element to describe columns.
+			if (isUseRepeat()) {
+				column.setTableNumberColumnsRepeatedAttribute(repeatedCount + columnCount);
+				Column startCol = getColumnInstance(positionCol.getOdfElement(), 0);
+				for (int i = repeatedCount + columnCount - 1; i >= columnCount + (index - startCol.getColumnIndex()); i--) {
+					updateColumnRepository(columnEle, i - columnCount, columnEle, i);
+				}
+				for (int i = 0; i < columnCount; i++) {
+					list.add(getColumnInstance(column, refColumn.mnRepeatedIndex + 1 + i));
+				}
+			} else {
+				TableTableColumnElement newBeforeColumnEle = (TableTableColumnElement) refColumn.getOdfElement()
+						.cloneNode(true);
+				if (index > 1) {
+					newBeforeColumnEle.setTableNumberColumnsRepeatedAttribute(index);
+				} else {
+					newBeforeColumnEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+				}
+				mTableElement.insertBefore(newBeforeColumnEle, positionCol.getOdfElement());
+				for (int i = 0; i < index; i++) {
+					updateColumnRepository(columnEle, i, newBeforeColumnEle, i);
+				}
+				int newAfterCount = repeatedCount - index;
+				if (newAfterCount > 1) {
+					positionCol.setColumnsRepeatedNumber(newAfterCount);
+				} else {
+					positionCol.getOdfElement().removeAttributeNS(tableNameSpace, "number-columns-repeated");
+				}
+				for (int i = repeatedCount - 1; i >= index; i--) {
+					updateColumnRepository(columnEle, i, columnEle, i - index);
+				}
+				for (int i = 0; i < columnCount; i++) {
+					TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement()
+							.cloneNode(true);
+					newColumnEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+					mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+					list.add(getColumnInstance(newColumnEle, 0));
+				}
+			}
+		} else {
+			// add a single column element to describe columns.
+			if (isUseRepeat()) {
+				TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement().cloneNode(
+						true);
+				if (columnCount > 1) {
+					newColumnEle.setTableNumberColumnsRepeatedAttribute(columnCount);
+				} else {
+					newColumnEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+				}
+				mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+				for (int i = 0; i < columnCount; i++) {
+					list.add(getColumnInstance(newColumnEle, i));
+				}
+			} else {
+				for (int i = 0; i < columnCount; i++) {
+					TableTableColumnElement newColumnEle = (TableTableColumnElement) refColumn.getOdfElement()
+							.cloneNode(true);
+					newColumnEle.removeAttributeNS(tableNameSpace, "number-columns-repeated");
+					mTableElement.insertBefore(newColumnEle, positionCol.getOdfElement());
+					list.add(getColumnInstance(newColumnEle, 0));
+				}
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * Remove a specific number of columns, starting from the column at
+	 * <code>index</code>.
+	 * 
+	 * @param startIndex
+	 *            is the index of the first column to delete.
+	 * @param deleteColCount
+	 *            is the number of columns to delete.
+	 */
+	public void removeColumnsByIndex(int startIndex, int deleteColCount) {
+		// 0. verify the index
+		if (deleteColCount <= 0) {
+			return;
+		}
+		if (startIndex < 0) {
+			throw new IllegalArgumentException("startIndex of the deleted columns should not be negative");
+		}
+		int colCount = getColumnCount();
+		if (startIndex >= colCount) {
+			throw new IndexOutOfBoundsException("Start column index is out of bound");
+		}
+		if (startIndex + deleteColCount >= colCount) {
+			deleteColCount = colCount - startIndex;
+		}
+
+		// 1. remove cell
+		for (int i = 0; i < getRowCount(); i++) {
+			Row aRow = getRowByIndex(i);
+			aRow.removeCellByIndex(startIndex, deleteColCount);
+		}
+
+		// 2. remove column
+		Column firstColumn;
+		for (int i = 0; i < deleteColCount; i++) {
+			firstColumn = getColumnByIndex(startIndex);
+			int repeatedAttr = firstColumn.getColumnsRepeatedNumber();
+			if (repeatedAttr == 1) {
+				TableTableColumnElement columnEle = OdfElement.findNextChildNode(TableTableColumnElement.class,
+						firstColumn.getOdfElement());
+				mTableElement.removeChild(firstColumn.getOdfElement());
+				if (i < (deleteColCount - 1)) {
+					firstColumn = this.getColumnInstance(columnEle, 0);
+				}
+			} else {
+				if (repeatedAttr > firstColumn.mnRepeatedIndex) {
+					firstColumn.setColumnsRepeatedNumber(repeatedAttr - 1);
+					Column startCol = this.getColumnInstance(firstColumn.getOdfElement(), 0);
+					updateColumnRepository(firstColumn.getOdfElement(), startIndex - startCol.getColumnIndex(), null, 0);
+				}
+			}
+		}
+
+	}
+	
+	/**
+	 * Calculates the width between the left and right margins of the table
+	 * container.
+	 * 
+	 * @param container
+	 *            TableContainer
+	 * @param marginLeft
+	 *            space between left margin and the table
+	 * @param marginRight
+	 *            space between right margin and the table
+	 * @return width that can be attributed at the table (in)
+	 */
+	private static double getTableWidth(TableContainer container, double marginLeft, double marginRight) {
+		String pageWidthStr = null;
+		double pageWidth = 0;
+		double tableWidth = DEFAULT_TABLE_WIDTH;
+		OdfOfficeAutomaticStyles automaticStyles = null;
+		try {
+			automaticStyles = getOwnerDocument(container).getStylesDom().getAutomaticStyles();
+		} catch (Exception e) {
+			Logger.getLogger(Table.class.getName()).log(Level.SEVERE,	e.getMessage(), e);
+		}
+		OdfStylePageLayout pageLayout = automaticStyles.getPageLayout("pm1");
+		if (pageLayout == null) {
+			pageLayout = automaticStyles.getPageLayout("Mpm1");
+		}
+		if (pageLayout != null) {
+			pageWidthStr = pageLayout.getProperty(StylePageLayoutPropertiesElement.PageWidth);
+			if (pageWidthStr != null) {
+				pageWidth = Length.parseDouble(pageWidthStr, Unit.CENTIMETER);
+			}
+			// margins
+			double dLeftPageMargin = 0;
+			double dRightPageMargin = 0;
+			String leftPageMargin = pageLayout.getProperty(StylePageLayoutPropertiesElement.MarginLeft);
+			String rightPageMargin = pageLayout.getProperty(StylePageLayoutPropertiesElement.MarginRight);
+			if (leftPageMargin != null && rightPageMargin != null) {
+				dLeftPageMargin = Length.parseDouble(leftPageMargin, Unit.CENTIMETER);
+				dRightPageMargin = Length.parseDouble(rightPageMargin, Unit.CENTIMETER);
+			}
+			tableWidth = (pageWidth - (dLeftPageMargin + dRightPageMargin + marginLeft + marginRight)) / 2.5399;
+			if (tableWidth <= 0) {
+				tableWidth = DEFAULT_TABLE_WIDTH;
+			}
+		}
+		return Double.valueOf(new DecimalFormat("#0.###").format(tableWidth).replace(",", ".")).doubleValue();
+	}
+
+	private void reviseStyleFromTopRowToMediumRow(Row oldTopRow) {
+		if (mIsSpreadsheet)
+			return;
+		int length = getColumnCount();
+
+		for (int i = 0; i < length;) {
+			Cell cell = oldTopRow.getCellByIndex(i);
+			if (cell.isCoveredElement()) {
+				i = i + cell.getColumnsRepeatedNumber();
+				continue;
+			}
+			OdfStyle styleEle = cell.getStyleHandler().getStyleElementForWrite();
+			if (i < length - 1) {
+				setLeftBottomBorderStylesProperties(styleEle);
+			} else {
+				setRightBottomBorderStylesProperties(styleEle);
+			}
+			i = i + cell.getColumnsRepeatedNumber();
+		}
+	}
+
+	private void reviseStyleFromMediumRowToTopRow(Row newTopRow) {
+		if (mIsSpreadsheet) {
+			return;
+		}
+		int length = getColumnCount();
+
+		for (int i = 0; i < length;) {
+			Cell cell = newTopRow.getCellByIndex(i);
+			if (cell.isCoveredElement()) {
+				i = i + cell.getColumnsRepeatedNumber();
+				continue;
+			}
+			OdfStyle styleEle = cell.getStyleHandler().getStyleElementForWrite();
+			if (i < length - 1) {
+				setLeftTopBorderStyleProperties(styleEle);
+			} else {
+				setRightTopBorderStyleProperties(styleEle);
+			}
+			i = i + cell.getColumnsRepeatedNumber();
+		}
+	}
+
+	/**
+	 * Insert a specific number of rows before the row at <code>index</code>.
+	 * 
+	 * @param index
+	 *            is the index of the row to insert before.
+	 * @param rowCount
+	 *            is the number of rows to insert.
+	 * @return a list of new inserted rows
+	 */
+	public List<Row> insertRowsBefore(int index, int rowCount) {
+		if (index >= getRowCount()) {
+			throw new IndexOutOfBoundsException();
+		}
+		ArrayList<Row> list = new ArrayList<Row>();
+		if (index == 0) {
+			Row refRow = getRowByIndex(index);
+			Row positionRow = refRow;
+			// add first row
+			Row newFirstRow = insertRowBefore(refRow, positionRow, getColumnCount());
+			reviseStyleFromTopRowToMediumRow(refRow);
+			list.add(newFirstRow);
+			List<Row> rowList = insertMultipleRowsBefore(refRow, refRow, rowCount - 1);
+			for (int i = 0; i < rowList.size(); i++) {
+				list.add(rowList.get(i));
+			}
+			return list;
+		}
+
+		Row refRow = getRowByIndex(index - 1);
+		Row positionRow = getRowByIndex(index);
+		// 1. insert a <table:table-row>
+		if (refRow.getOdfElement() == positionRow.getOdfElement()) {
+			TableTableRowElement row = refRow.getOdfElement();
+			int repeatedCount = refRow.getRowsRepeatedNumber();
+			refRow.setRowsRepeatedNumber(repeatedCount + rowCount);
+			TableTableRowElement rowEle = positionRow.getOdfElement();
+			Row startRow = getRowInstance(positionRow.getOdfElement(), 0);
+			for (int i = repeatedCount + rowCount - 1; i >= rowCount + (index - startRow.getRowIndex()); i--) {
+				updateRowRepository(rowEle, i - rowCount, rowEle, i);
+			}
+			for (int i = 0; i < rowCount; i++) {
+				list.add(getRowInstance(row, refRow.mnRepeatedIndex + 1 + i));
+			}
+		} else {
+			List<Row> newRowList = insertMultipleRowsBefore(refRow, positionRow, rowCount);
+			if (index - 1 == 0) {
+				// correct styles
+				reviseStyleFromTopRowToMediumRow(newRowList.get(0));
+			}
+			for (int i = 0; i < newRowList.size(); i++) {
+				list.add(newRowList.get(i));
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Return a list of columns in the current table.
+	 * 
+	 * @return a list of table columns
+	 */
+	public List<Column> getColumnList() {
+		ArrayList<Column> list = new ArrayList<Column>();
+		TableTableColumnElement colEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableColumnElement) {
+						colEle = (TableTableColumnElement) m;
+						int columnsRepeatedNumber = colEle.getTableNumberColumnsRepeatedAttribute();
+						for (int i = 0; i < columnsRepeatedNumber; i++) {
+							list.add(getColumnInstance(colEle, i));
+						}
+					}
+				}
+			}
+			if (n instanceof TableTableColumnElement) {
+				colEle = (TableTableColumnElement) n;
+				int columnsRepeatedNumber = colEle.getTableNumberColumnsRepeatedAttribute();
+				for (int i = 0; i < columnsRepeatedNumber; i++) {
+					list.add(getColumnInstance(colEle, i));
+				}
+			}
+		}
+		return list;
+	}
+	
+	/**
+	 * Return an Iterator of the column in this table.
+	 * 
+	 * @return an Iterator of the column in this table.
+	 * @see java.util.Iterator
+	 * 
+	 * @since 0.5.5
+	 */
+	public Iterator<Column> getColumnIterator(){
+		return new SimpleColumnIterator(this);
+	}
+	
+	/**
+	 * Return a list of table rows in the current table.
+	 * 
+	 * @return a list of table rows
+	 */
+	public List<Row> getRowList() {
+		ArrayList<Row> list = new ArrayList<Row>();
+		TableTableRowElement rowEle = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) n;
+				for (Node m : new DomNodeList(headers.getChildNodes())) {
+					if (m instanceof TableTableRowElement) {
+						rowEle = (TableTableRowElement) m;
+						for (int i = 0; i < rowEle.getTableNumberRowsRepeatedAttribute(); i++) {
+							list.add(getRowInstance(rowEle, i));
+						}
+					}
+				}
+			}
+			if (n instanceof TableTableRowElement) {
+				rowEle = (TableTableRowElement) n;
+				for (int i = 0; i < rowEle.getTableNumberRowsRepeatedAttribute(); i++) {
+					list.add(getRowInstance(rowEle, i));
+				}
+			}
+		}
+		return list;
+	}
+	
+	/**
+	 * Return an Iterator of the row in this table.
+	 * 
+	 * @return an Iterator of the row in this table.
+	 * @see java.util.Iterator
+	 * 
+	 * @since 0.5.5
+	 */
+	public Iterator<Row> getRowIterator(){
+		return new SimpleRowIterator(this);
+	}
+	
+	/**
+	 * Get the column at the specified index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the zero-based index of the column.
+	 * @return the column at the specified index
+	 */
+	public Column getColumnByIndex(int index) {
+		if (index < 0) {
+			throw new IllegalArgumentException("index should be nonnegative integer.");
+		}
+		// expand column as needed.
+		int lastIndex = getColumnCount() - 1;
+		if (index > lastIndex) {
+			appendColumns(index - lastIndex);
+		}
+		int result = 0;
+		Column col = null;
+		// TableTableColumnElement colEle=null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderColumnsElement) {
+				col = getHeaderColumnByIndex((TableTableHeaderColumnsElement) n, index);
+				if (col != null) {
+					return col;
+				}
+				result += getHeaderColumnCount((TableTableHeaderColumnsElement) n);
+			}
+			if (n instanceof TableTableColumnElement) {
+				col = getColumnInstance((TableTableColumnElement) n, 0);
+				result += col.getColumnsRepeatedNumber();
+			}
+			if ((result > index) && (col != null)) {
+				return getColumnInstance(col.getOdfElement(), index - (result - col.getColumnsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	private Row getHeaderRowByIndex(TableTableHeaderRowsElement headers, int nIndex) {
+		int result = 0;
+		Row row = null;
+		for (Node n : new DomNodeList(headers.getChildNodes())) {
+			if (n instanceof TableTableRowElement) {
+				row = getRowInstance((TableTableRowElement) n, 0);
+				result += row.getRowsRepeatedNumber();
+			}
+			if ((result > nIndex) && (row != null)) {
+				return getRowInstance(row.getOdfElement(), nIndex - (result - row.getRowsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	private Column getHeaderColumnByIndex(TableTableHeaderColumnsElement headers, int nIndex) {
+		int result = 0;
+		Column col = null;
+		for (Node n : new DomNodeList(headers.getChildNodes())) {
+			if (n instanceof TableTableColumnElement) {
+				col = getColumnInstance((TableTableColumnElement) n, 0);
+				result += col.getColumnsRepeatedNumber();
+			}
+			if (result > nIndex) {
+				return getColumnInstance(col.getOdfElement(), nIndex - (result - col.getColumnsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Get the row at the specified index. The table will be automatically
+	 * expanded, when the given index is outside of the original table.
+	 * 
+	 * @param index
+	 *            the zero-based index of the row.
+	 * @return the row at the specified index
+	 */
+	public Row getRowByIndex(int index) {
+		if (index < 0) {
+			throw new IllegalArgumentException("index should be nonnegative integer.");
+		}
+		// expand row as needed.
+		int lastIndex = getRowCount() - 1;
+		if (index > lastIndex) {
+			appendRows(index - lastIndex);
+		}
+		int result = 0;
+		Row row = null;
+		for (Node n : new DomNodeList(mTableElement.getChildNodes())) {
+			if (n instanceof TableTableHeaderRowsElement) {
+				row = getHeaderRowByIndex((TableTableHeaderRowsElement) n, index);
+				if (row != null) {
+					return row;
+				}
+				result += getHeaderRowCount((TableTableHeaderRowsElement) n);
+			}
+			if (n instanceof TableTableRowElement) {
+				row = getRowInstance((TableTableRowElement) n, 0);
+				result += row.getRowsRepeatedNumber();
+			}
+			if (n instanceof TableTableRowsElement) {
+				for (Node nn : new DomNodeList(n.getChildNodes())) {
+					if (nn instanceof TableTableRowElement) {
+						row = getRowInstance((TableTableRowElement) nn, 0);
+						result += row.getRowsRepeatedNumber();
+						if (result > index) {
+							return getRowInstance(row.getOdfElement(), index - (result - row.getRowsRepeatedNumber()));
+						}
+					}
+				}
+			}
+			if (result > index) {
+				return getRowInstance(row.getOdfElement(), index - (result - row.getRowsRepeatedNumber()));
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Remove the specific number of rows, starting from the row at
+	 * <code>index</code>.
+	 * 
+	 * @param startIndex
+	 *            is the zero-based index of the first row to delete.
+	 * @param deleteRowCount
+	 *            is the number of rows to delete.
+	 */
+	public void removeRowsByIndex(int startIndex, int deleteRowCount) {
+		boolean deleted = false;
+		// 0. verify the index
+		if (deleteRowCount <= 0) {
+			return;
+		}
+		if (startIndex < 0) {
+			throw new IllegalArgumentException("startIndex of the deleted rows should not be negative");
+		}
+		int rowCount = getRowCount();
+		if (startIndex >= rowCount) {
+			throw new IndexOutOfBoundsException("Start index out of bound");
+		}
+		if (startIndex + deleteRowCount >= rowCount) {
+			deleteRowCount = rowCount - startIndex;
+		}
+
+		// 1. remove row
+		Row firstRow = getRowByIndex(startIndex);
+		for (int i = startIndex; i < startIndex + deleteRowCount; i++) {
+			int repeatedAttr = firstRow.getRowsRepeatedNumber();
+			if (repeatedAttr == 1) {
+				TableTableRowElement rowEle = OdfElement.findNextChildNode(TableTableRowElement.class, firstRow
+						.getOdfElement());
+				firstRow.removeAllCellsRelationship();
+				firstRow.getOdfElement().getParentNode().removeChild(firstRow.getOdfElement());
+				updateRowRepository(firstRow.getOdfElement(), firstRow.mnRepeatedIndex, null, 0);
+				if (i < (startIndex + deleteRowCount - 1)) {
+					firstRow = this.getRowInstance(rowEle, 0);
+				}
+				deleted = true;
+			} else {
+				if (repeatedAttr > firstRow.mnRepeatedIndex) {
+					firstRow.setRowsRepeatedNumber(repeatedAttr - 1);
+					Row startRow = this.getRowInstance(firstRow.getOdfElement(), 0);
+					updateRowRepository(firstRow.getOdfElement(), i - startRow.getRowIndex(), null, 0);
+				}
+			}
+		}
+		// 2. if mediumRow becomes as top row, revise style
+		if (deleted && startIndex == 0 && getRowCount() > 0) {
+			Row aRow = getRowByIndex(0);
+			reviseStyleFromMediumRowToTopRow(aRow);
+		}
+	}
+
+	/**
+	 * Remove this table from the document
+	 */
+	public void remove() {
+		mTableElement.getParentNode().removeChild(mTableElement);
+
+	}
+
+	private int getHeaderRowCount(TableTableHeaderRowsElement headers) {
+		int result = 0;
+		if (headers != null) {
+			for (Node n : new DomNodeList(headers.getChildNodes())) {
+				if (n instanceof TableTableRowElement) {
+					result += ((TableTableRowElement) n).getTableNumberRowsRepeatedAttribute();
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Return the number of header rows in this table.
+	 * 
+	 * @return the number of header rows.
+	 */
+	public int getHeaderRowCount() {
+
+		TableTableHeaderRowsElement headers = OdfElement.findFirstChildNode(TableTableHeaderRowsElement.class,
+				mTableElement);
+		return getHeaderRowCount(headers);
+	}
+
+	private int getHeaderColumnCount(TableTableHeaderColumnsElement headers) {
+		int result = 0;
+		if (headers != null) {
+			for (Node n : new DomNodeList(headers.getChildNodes())) {
+				result += ((TableTableColumnElement) n).getTableNumberColumnsRepeatedAttribute();
+			}
+		}
+		return result;
+	}
+
+	private int getColumnsCount(TableTableColumnsElement columns) {
+		int result = 0;
+		if (columns != null) {
+			for (Node n : new DomNodeList(columns.getChildNodes())) {
+				result += ((TableTableColumnElement) n).getTableNumberColumnsRepeatedAttribute();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Return the number of header columns in the table.
+	 * 
+	 * @return the number of header columns.
+	 */
+	public int getHeaderColumnCount() {
+		TableTableHeaderColumnsElement headers = OdfElement.findFirstChildNode(TableTableHeaderColumnsElement.class,
+				mTableElement);
+		return getHeaderColumnCount(headers);
+	}
+
+	/**
+	 * Return the table name.
+	 * 
+	 * @return the table name
+	 */
+	public String getTableName() {
+		return mTableElement.getTableNameAttribute();
+	}
+
+	/**
+	 * Set the table name.
+	 * 
+	 * @param tableName
+	 *            the table name
+	 * @throws IllegalArgumentException
+	 *             if the tableName is duplicate with one of tables in the
+	 *             current document
+	 */
+	public void setTableName(String tableName) {
+		// check if the table name is already exist
+		List<Table> tableList = mDocument.getTableList();
+		for (int i = 0; i < tableList.size(); i++) {
+			Table table = tableList.get(i);
+			if (tableName.equals(table.getTableName())) {
+				if (table != this) {
+					throw new IllegalArgumentException(
+							"The table name is duplicate with one of tables in the current document.");
+				}
+			}
+		}
+		mTableElement.setTableNameAttribute(tableName);
+	}
+
+	/**
+	 * Return true if the table is protected.
+	 * 
+	 * @return true if the table is protected
+	 */
+	public boolean isProtected() {
+		if (mTableElement.getTableProtectedAttribute() != null) {
+			return mTableElement.getTableProtectedAttribute().booleanValue();
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Set if the table is protected.
+	 * 
+	 * @param isProtected
+	 *            the protected attribute of the table to be set
+	 */
+	public void setProtected(boolean isProtected) {
+		mTableElement.setTableProtectedAttribute(isProtected);
+	}
+
+	/**
+	 * Return true if cell style is inherited when a new cell is added to the
+	 * table.
+	 * <p>
+	 * The default setting is inherited. In this condition, the style of new
+	 * column is same with the previous column before the inserted position,
+	 * while the style of new row is same with the last row before the inserted
+	 * position.
+	 * <p>
+	 * This feature setting will influence <code>appendRow()</code>,
+	 * <code>appendColumn()</code>, <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code> and
+	 * <code>insertColumnsBefore()</code>.
+	 * <p>
+	 * For <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>, if need
+	 * automatically expand cells, it will return empty cell(s) without any
+	 * style settings. So inheritance setting have no effect on them.
+	 * 
+	 * @return true if cell style is inherited when a new cell is added to the
+	 *         table.
+	 * 
+	 * @see #setCellStyleInheritance(boolean)
+	 * @see #appendColumn()
+	 * @see #appendColumns(int)
+	 * @see #appendRow()
+	 * @see #appendRows(int)
+	 * @see #insertColumnsBefore(int, int)
+	 * @see #insertRowsBefore(int, int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 * @see #getCellRangeByPosition(int, int, int, int)
+	 * @see #getCellRangeByPosition(String, String)
+	 * @see #getCellRangeByName(String)
+	 * @see #getColumnByIndex(int)
+	 * @see #getRowByIndex(int)
+	 * 
+	 * @since 0.4.5
+	 */
+	public boolean isCellStyleInheritance() {
+		return mIsCellStyleInheritance;
+	}
+
+	/**
+	 * This method allows users to set whether cell style is inherited or not
+	 * when a new cell is added to the table. Of course, the default setting is
+	 * inherited. In this condition, the style of new column is same with the
+	 * previous column before the inserted position, while the style of new row
+	 * is same with the last row before the inserted position.
+	 * <p>
+	 * This feature setting will influence <code>appendRow()</code>,
+	 * <code>appendColumn()</code>, <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code> and
+	 * <code>insertColumnsBefore()</code>.
+	 * <p>
+	 * For <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>, if need
+	 * automatically expand cells, it will return empty cell(s) without any
+	 * style settings. So inheritance setting have no effect on them.
+	 * 
+	 * @param isEnabled
+	 *            if<code>isEnabled</code> is true, cell style will be inherited
+	 *            by new cell.
+	 * 
+	 * @see #isCellStyleInheritance()
+	 * @see #appendColumn()
+	 * @see #appendColumns(int)
+	 * @see #appendRow()
+	 * @see #appendRows(int)
+	 * @see #insertColumnsBefore(int, int)
+	 * @see #insertRowsBefore(int, int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 * @see #getCellRangeByPosition(int, int, int, int)
+	 * @see #getCellRangeByPosition(String, String)
+	 * @see #getCellRangeByName(String)
+	 * @see #getColumnByIndex(int)
+	 * @see #getRowByIndex(int)
+	 * 
+	 * @since 0.4.5
+	 */
+	public void setCellStyleInheritance(boolean isEnabled) {
+		mIsCellStyleInheritance = isEnabled;
+	}
+
+	/**
+	 * Return true if the new created multiple columns/rows/cells are described
+	 * by a single element when it's possible.
+	 * <p>
+	 * The default setting is <code>true</code>, which helps to decrease the
+	 * document size. If setting is <code>false</code>, each column/row/cell
+	 * will be described by its owned single element.
+	 * <p>
+	 * This feature setting will influence <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code>,
+	 * <code>insertColumnsBefore()</code>, <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>.
+	 * 
+	 * @return true if the new created columns/rows/cells are described by a
+	 *         single element when it's possible.
+	 * 
+	 * @see #setUseRepeat(boolean)
+	 * @see #appendColumns(int)
+	 * @see #appendRows(int)
+	 * @see #insertColumnsBefore(int, int)
+	 * @see #insertRowsBefore(int, int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 * @see #getCellRangeByPosition(int, int, int, int)
+	 * @see #getCellRangeByPosition(String, String)
+	 * @see #getCellRangeByName(String)
+	 * @see #getColumnByIndex(int)
+	 * @see #getRowByIndex(int)
+	 * 
+	 * @since 0.4.5
+	 */
+	public boolean isUseRepeat() {
+		return mIsDescribedBySingleElement;
+	}
+
+	/**
+	 * When two or more columns/rows/cells are added to a table, if they are
+	 * adjoining, and have the same content and style, and do not contain
+	 * horizontally/vertically merged cells, they may be described by a single
+	 * element. The repeated number attribute, for row is
+	 * table:number-rows-repeated, while for column and cell are
+	 * table:number-columns-repeated, specifies the number of columns/rows/cells
+	 * to which a column/row/cell element applies.
+	 * <p>
+	 * This method allows users to set whether the new created
+	 * columns/rows/cells are described by a single element. Of course, the
+	 * default setting is <code>true</code>, which helps to decrease the
+	 * document size. If setting is <code>false</code>, each column/row/cell
+	 * will be described by its owned single element.
+	 * <p>
+	 * This feature setting will influence <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code>,
+	 * <code>insertColumnsBefore()</code>, <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>.
+	 * 
+	 * @param isSingle
+	 *            if<code>isSingle</code> is true, the new created
+	 *            columns/rows/cells are described by a single element, if
+	 *            possible.
+	 * 
+	 * @see #isUseRepeat()
+	 * @see #appendColumns(int)
+	 * @see #appendRows(int)
+	 * @see #insertColumnsBefore(int, int)
+	 * @see #insertRowsBefore(int, int)
+	 * @see #getCellByPosition(int, int)
+	 * @see #getCellByPosition(String)
+	 * @see #getCellRangeByPosition(int, int, int, int)
+	 * @see #getCellRangeByPosition(String, String)
+	 * @see #getCellRangeByName(String)
+	 * @see #getColumnByIndex(int)
+	 * @see #getRowByIndex(int)
+	 * 
+	 * @since 0.4.5
+	 */
+	public void setUseRepeat(boolean isSingle) {
+		mIsDescribedBySingleElement = isSingle;
+	}
+
+	// //////////////////////////////////////////////////////////////////////////////////////////
+	/**
+	 * Return a range of cells within the specified range. The table will be
+	 * automatically expanded as need.
+	 * 
+	 * @param startCol
+	 *            the column index of the first cell inside the range.
+	 * @param startRow
+	 *            the row index of the first cell inside the range.
+	 * @param endCol
+	 *            the column index of the last cell inside the range.
+	 * @param endRow
+	 *            the row index of the last cell inside the range.
+	 * @return the specified cell range.
+	 */
+	public CellRange getCellRangeByPosition(int startCol, int startRow, int endCol, int endRow) {
+		// test whether cell position is out of table range and expand table
+		// automatically.
+		getCellByPosition(startCol, startRow);
+		getCellByPosition(endCol, endRow);
+		return new CellRange(this, startCol, startRow, endCol, endRow);
+	}
+
+	/**
+	 * Return a range of cells within the specified range. The range is
+	 * specified by the cell address of the first cell and the cell address of
+	 * the last cell. The table will be automatically expanded as need.
+	 * <p>
+	 * The cell address is constructed with a table name, a dot (.), an
+	 * alphabetic value representing the column, and a numeric value
+	 * representing the row. The table name can be omitted. For example:
+	 * "$Sheet1.A1", "Sheet1.A1" and "A1" are all valid cell address.
+	 * 
+	 * @param startAddress
+	 *            the cell address of the first cell inside the range.
+	 * @param endAddress
+	 *            the cell address of the last cell inside the range.
+	 * @return the specified cell range.
+	 */
+	public CellRange getCellRangeByPosition(String startAddress, String endAddress) {
+		return getCellRangeByPosition(getColIndexFromCellAddress(startAddress),
+				getRowIndexFromCellAddress(startAddress), getColIndexFromCellAddress(endAddress),
+				getRowIndexFromCellAddress(endAddress));
+	}
+
+	/**
+	 * Return a range of cells by a specified name.
+	 * <p>
+	 * After you get a cell range with <code>getCellRangeByPosition</code>, you
+	 * can assign a name to this cell range with the method
+	 * <code>setCellRangeName<code> in class <code>CellRange</code>. Then you
+	 * will get a <b>named range</b> which can be represented by name. This
+	 * method can be used to get a named range.
+	 * 
+	 * @param name
+	 *            the name of the specified named range
+	 * @return the specified cell range.
+	 */
+	public CellRange getCellRangeByName(String name) {
+		NodeList nameRanges;
+		try {
+			nameRanges = mTableElement.getOwnerDocument().getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(),
+					"named-range");
+			for (int i = 0; i < nameRanges.getLength(); i++) {
+				TableNamedRangeElement nameRange = (TableNamedRangeElement) nameRanges.item(i);
+				if (nameRange.getTableNameAttribute().equals(name)) {
+					String cellRange = nameRange.getTableCellRangeAddressAttribute();
+					String[] addresses = cellRange.split(":");
+					return getCellRangeByPosition(addresses[0], addresses[1]);
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(Table.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	/**
+	 * Return a single cell that is positioned at the specified column and row.
+	 * The table will be automatically expanded as need.
+	 * 
+	 * @param colIndex
+	 *            the column index of the cell.
+	 * @param rowIndex
+	 *            the row index of the cell.
+	 * @return the cell at the specified position
+	 */
+	public Cell getCellByPosition(int colIndex, int rowIndex) {
+		if (colIndex < 0 || rowIndex < 0) {
+			throw new IllegalArgumentException("colIndex and rowIndex should be nonnegative integer.");
+		}
+		// expand row as needed.
+		int lastRowIndex = getRowCount() - 1;
+		if (rowIndex > lastRowIndex) {
+			// need clean cell style.
+			appendRows((rowIndex - lastRowIndex), true);
+		}
+		// expand column as needed.
+		int lastColumnIndex = getColumnCount() - 1;
+		if (colIndex > lastColumnIndex) {
+			// need clean cell style.
+			appendColumns((colIndex - lastColumnIndex), true);
+		}
+		Row row = getRowByIndex(rowIndex);
+		return row.getCellByIndex(colIndex);
+	}
+
+	// return array of string contain 3 member
+	// 1. sheet table name
+	// 2. alphabetic represent the column
+	// 3. string represent the row number
+	String[] splitCellAddress(String cellAddress) {
+		String[] returnArray = new String[3];
+		// seperate column and row from cell range
+		StringTokenizer stDot = new StringTokenizer(cellAddress, ".");
+		// get sheet table name and the cell address
+		String cell = "";
+		if (stDot.countTokens() >= 2) {
+			StringTokenizer stDollar = new StringTokenizer(stDot.nextToken(), "$");
+			returnArray[0] = stDollar.nextToken();
+			cell = stDot.nextToken();
+		} else {
+			returnArray[0] = getTableName();
+			cell = stDot.nextToken();
+		}
+
+		// get the column/row number from the cell address
+		StringTokenizer stDollar = new StringTokenizer(cell, "$");
+		if (stDollar.countTokens() >= 2) {
+			returnArray[1] = stDollar.nextToken();
+			returnArray[2] = stDollar.nextToken();
+		} else {
+			cell = stDollar.nextToken();
+			for (int i = 0; i < cell.length(); i++) {
+				if (!Character.isLetter(cell.charAt(i))) {
+					returnArray[1] = cell.substring(0, i);
+					returnArray[2] = cell.substring(i);
+					break;
+				}
+			}
+		}
+		return returnArray;
+
+	}
+
+	/**
+	 * Return a single cell that is positioned at the specified cell address.
+	 * The table can be automatically expanded as need.
+	 * <p>
+	 * The cell address is constructed with a table name, a dot (.), an
+	 * alphabetic value representing the column, and a numeric value
+	 * representing the row. The table name can be omitted. For example:
+	 * "$Sheet1.A1", "Sheet1.A1" and "A1" are all valid cell address.
+	 * 
+	 * @param address
+	 *            the cell address of the cell.
+	 * @return the cell at the specified position.
+	 */
+	public Cell getCellByPosition(String address) {
+		return getCellByPosition(getColIndexFromCellAddress(address), getRowIndexFromCellAddress(address));
+	}
+	
+	/**
+	 * Modifies the margin above and below the table.
+	 * 
+	 * @param spaceTop
+	 *            space above the table in centimeter(cm), ex. 1.25 cm
+	 * @param spaceBottom
+	 *            spacing below the table in centimeter(cm), ex. 0.7 cm
+	 *            
+	 * @since 0.5.5
+	 */
+	public void setVerticalMargin(double spaceTop, double spaceBottom) {
+		String tableStyleName = mTableElement.getStyleName();
+		OdfOfficeAutomaticStyles automaticStyles = mTableElement.getAutomaticStyles();
+		OdfStyleBase tableStyle = automaticStyles.getStyle(tableStyleName, OdfStyleFamily.Table);
+		if (tableStyle != null) {
+			tableStyle.setProperty(StyleTablePropertiesElement.MarginTop,
+					(new DecimalFormat("#0.##").format(spaceTop) + Unit.CENTIMETER.abbr()).replace(",", "."));
+			tableStyle.setProperty(StyleTablePropertiesElement.MarginBottom, (new DecimalFormat("#0.##")
+					.format(spaceBottom) + Unit.CENTIMETER.abbr()).replace(",", "."));
+		}
+	}
+
+	// TODO: can put these two method to type.CellAddress
+	int getColIndexFromCellAddress(String cellAddress) {
+		String[] returnArray = splitCellAddress(cellAddress);
+		String colNum = returnArray[1];
+		int colIndex = 0;
+		for (int i = 0; i < colNum.length(); i++) {
+			colIndex = 26 * colIndex;
+			colIndex += (colNum.charAt(i) - 'A') + 1;
+		}
+
+		return (colIndex - 1);
+	}
+
+	int getRowIndexFromCellAddress(String cellAddress) {
+		String[] returnArray = splitCellAddress(cellAddress);
+		return Integer.parseInt(returnArray[2]) - 1;
+	}
+
+	String getAbsoluteCellAddress(int colIndex, int rowIndex) {
+		int remainder = 0;
+		int multiple = colIndex;
+		String cellRange = "";
+		while (multiple != 0) {
+			multiple = colIndex / 26;
+			remainder = colIndex % 26;
+			char c;
+			if (multiple == 0) {
+				c = (char) ('A' + remainder);
+			} else {
+				c = (char) ('A' + multiple - 1);
+			}
+			cellRange = cellRange + String.valueOf(c);
+			colIndex = remainder;
+		}
+		cellRange = "$" + cellRange + "$" + (rowIndex + 1);
+		return cellRange;
+
+	}
+
+	// the parameter is the column/row index in the ownerTable,rather than in
+	// the cell range
+	// if the position is a covered cell, then get the owner cell for it
+
+	Cell getOwnerCellByPosition(List<CellCoverInfo> coverList, int nCol, int nRow) {
+		CellCoverInfo info;
+		if (!isCoveredCellInOwnerTable(coverList, nCol, nRow)) {
+			Cell cell = getCellByPosition(nCol, nRow);
+			return cell;
+		} else {
+			for (int m = 0; m < coverList.size(); m++) {
+				info = coverList.get(m);
+				if (((nCol > info.nStartCol) && (nCol <= info.nEndCol) && (nRow == info.nStartRow) && (nRow == info.nEndRow))
+						|| ((nCol == info.nStartCol) && (nCol == info.nEndCol) && (nRow > info.nStartRow) && (nRow <= info.nEndRow))
+						|| ((nCol > info.nStartCol) && (nCol <= info.nEndCol) && (nRow > info.nStartRow) && (nRow <= info.nEndRow))) {
+					Cell cell = getCellByPosition(info.nStartCol, info.nStartRow);
+					return cell;
+				}
+			}
+		}
+		return null;
+	}
+
+	// the parameter is the column/row index in the ownerTable,rather than in
+	// the cell range
+	boolean isCoveredCellInOwnerTable(List<CellCoverInfo> coverList, int nCol, int nRow) {
+		CellCoverInfo info;
+		for (int m = 0; m < coverList.size(); m++) {
+			info = coverList.get(m);
+			if (((nCol > info.nStartCol) && (nCol <= info.nEndCol) && (nRow == info.nStartRow) && (nRow == info.nEndRow))
+					|| ((nCol == info.nStartCol) && (nCol == info.nEndCol) && (nRow > info.nStartRow) && (nRow <= info.nEndRow))
+					|| ((nCol > info.nStartCol) && (nCol <= info.nEndCol) && (nRow > info.nStartRow) && (nRow <= info.nEndRow))) // covered
+			// cell
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+
+	List<CellCoverInfo> getCellCoverInfos(int nStartCol, int nStartRow, int nEndCol, int nEndRow) {
+		List<CellCoverInfo> coverList = new ArrayList<CellCoverInfo>();
+		int nColSpan, nRowSpan;
+		for (int i = nStartCol; i < nEndCol + 1; i++) {
+			for (int j = nStartRow; j < nEndRow + 1; j++) {
+				Cell cell = getCellByPosition(i, j);
+				if (cell != null) {
+					nColSpan = cell.getColumnSpannedNumber();
+					nRowSpan = cell.getRowSpannedNumber();
+					if ((nColSpan > 1) || (nRowSpan > 1)) {
+						coverList.add(new CellCoverInfo(i, j, nColSpan, nRowSpan));
+					}
+				}
+			}
+		}
+		return coverList;
+	}
+
+	// the odfelement of the FTableColumn changed, so we should update the
+	// repository here
+	void updateColumnRepository(TableTableColumnElement oldElement, int oldRepeatIndex,
+			TableTableColumnElement newElement, int newRepeatIndex) {
+		if (mColumnRepository.containsKey(oldElement)) {
+			Vector<Column> oldList = mColumnRepository.get(oldElement);
+			if (oldRepeatIndex < oldList.size()) {
+				if (oldElement != newElement) {
+					// the new column replace the old column
+					Column oldColumn = oldList.get(oldRepeatIndex);
+					if (oldColumn != null) {
+						// update the mnRepeateIndex of the column which locate
+						// after the removed column
+						for (int i = oldRepeatIndex + 1; i < oldList.size(); i++) {
+							Column column = oldList.get(i);
+							if (column != null) {
+								column.mnRepeatedIndex = i - 1;
+							}
+						}
+						oldList.remove(oldColumn);
+						// oldList.add(oldRepeatIndex, null);
+						if (newElement != null) {
+							oldColumn.maColumnElement = newElement;
+							oldColumn.mnRepeatedIndex = newRepeatIndex;
+							int size = (newRepeatIndex > 7) ? (newRepeatIndex + 1) : 8;
+							Vector<Column> list = new Vector<Column>(size);
+							list.setSize(newRepeatIndex + 1);
+							list.set(newRepeatIndex, oldColumn);
+							mColumnRepository.put(newElement, list);
+						} else {
+							oldColumn.maColumnElement = null;
+						}
+					}
+				} else {
+					// the new column element is equal to the old column
+					// element, just change the repeatIndex
+					Column oldColumn = oldList.get(oldRepeatIndex);
+					if (oldColumn != null) {
+						oldList.remove(oldColumn);
+						oldList.add(oldRepeatIndex, null);
+						oldColumn.mnRepeatedIndex = newRepeatIndex;
+						if (newRepeatIndex >= oldList.size()) {
+							oldList.setSize(newRepeatIndex + 1);
+						}
+						oldList.set(newRepeatIndex, oldColumn);
+					} else {
+						getColumnInstance(newElement, newRepeatIndex);
+					}
+				}
+			}
+		}
+	}
+
+	// the odfelement of the FTableRow changed, so we should update the
+	// repository here
+	void updateRowRepository(TableTableRowElement oldElement, int oldRepeatIndex, TableTableRowElement newElement,
+			int newRepeatIndex) {
+		if (mRowRepository.containsKey(oldElement)) {
+			Vector<Row> oldList = mRowRepository.get(oldElement);
+			if (oldRepeatIndex < oldList.size()) {
+				if (oldElement != newElement) {
+					// the new row replace the old row
+					Row oldRow = oldList.get(oldRepeatIndex);
+					Vector<Cell> updateCellList = new Vector<Cell>();
+					if (oldRow != null) {
+						// update the mnRepeateIndex of the row which locate
+						// after the removed row
+						for (int i = oldRepeatIndex + 1; i < oldList.size(); i++) {
+							Row row = oldList.get(i);
+							if (row != null) {
+								// update the cell in this row,
+								int colNum = getColumnCount();
+								for (int j = 0; j < colNum; j++) {
+									Cell cell = row.getCellByIndex(j);
+									updateCellList.add(cell);
+								}
+								row.mnRepeatedIndex = i - 1;
+							}
+						}
+						oldList.remove(oldRow);
+						if (newElement != null) {
+							// update the cell in this row
+							int colNum = getColumnCount();
+							Cell[] oldCells = new Cell[colNum];
+							for (int j = 0; j < colNum; j++) {
+								oldCells[j] = oldRow.getCellByIndex(j);
+							}
+							// /
+							oldRow.maRowElement = newElement;
+							oldRow.mnRepeatedIndex = newRepeatIndex;
+							int size = (newRepeatIndex > 7) ? (newRepeatIndex + 1) : 8;
+							Vector<Row> list = new Vector<Row>(size);
+							list.setSize(newRepeatIndex + 1);
+							list.set(newRepeatIndex, oldRow);
+							mRowRepository.put(newElement, list);
+							// update the cell in this row
+							Cell[] newCells = new Cell[colNum];
+							for (int j = 0; j < colNum; j++) {
+								newCells[j] = oldRow.getCellByIndex(j);
+							}
+							for (int j = 0; j < colNum; j++) {
+								this.updateCellRepository(oldCells[j].getOdfElement(), oldCells[j].mnRepeatedColIndex,
+										oldCells[j].mnRepeatedRowIndex, newCells[j].getOdfElement(),
+										newCells[j].mnRepeatedColIndex, newCells[j].mnRepeatedRowIndex);
+							}
+
+							// update the mnRepeatedRowIndex of the cell which
+							// locate after the removed row
+							for (int j = 0; j < updateCellList.size(); j++) {
+								Cell cell = updateCellList.get(j);
+								if (cell.mnRepeatedRowIndex > oldRepeatIndex) {
+									cell.mnRepeatedRowIndex--;
+								}
+							}
+						} else {
+							oldRow.maRowElement = null;
+						}
+					}
+				} else {
+					// the new row element is equal to the old row element, just
+					// change the repeatIndex
+					Row oldRow = oldList.get(oldRepeatIndex);
+					if (oldRow != null) {
+						oldList.remove(oldRow);
+						oldList.add(oldRepeatIndex, null);
+						oldRow.mnRepeatedIndex = newRepeatIndex;
+						if (newRepeatIndex >= oldList.size()) {
+							oldList.setSize(newRepeatIndex + 1);
+						}
+						oldList.set(newRepeatIndex, oldRow);
+					} else {
+						getRowInstance(newElement, newRepeatIndex);
+					}
+				}
+			}
+		}
+	}
+
+	// the odfelement of the FTableCell changed, so we should update the
+	// repository here
+	void updateCellRepository(TableTableCellElementBase oldElement, int oldRepeatColIndex, int oldRepeatRowIndex,
+			TableTableCellElementBase newElement, int newRepeatColIndex, int newRepeatRowIndex) {
+		if (mCellRepository.containsKey(oldElement)) {
+			Cell oldCell = null;
+			Vector<Cell> oldList = mCellRepository.get(oldElement);
+			for (int i = 0; i < oldList.size(); i++) {
+				if (oldList.get(i).getOdfElement() == oldElement
+						&& oldList.get(i).mnRepeatedColIndex == oldRepeatColIndex
+						&& oldList.get(i).mnRepeatedRowIndex == oldRepeatRowIndex) {
+					oldCell = oldList.get(i);
+					break;
+				}
+			}
+			if (oldElement != newElement) {
+				// the new cell replace the old cell
+				if (oldCell != null) {
+					// update the mnRepeateRowIndex & mnRepeateColIndex of the
+					// cell which locate after the removed cell
+					for (int i = 0; i < oldList.size(); i++) {
+						Cell cell = oldList.get(i);
+						if (cell != null && (cell.getOdfElement() == oldElement)) {
+							if ((cell.mnRepeatedRowIndex == oldRepeatRowIndex)
+									&& (cell.mnRepeatedColIndex > oldRepeatColIndex)) {
+								cell.mnRepeatedColIndex--;
+							}
+						}
+					}
+					oldList.remove(oldCell);
+					if (oldList.size() == 0) {
+						mCellRepository.remove(oldElement);
+					}
+					if (newElement != null) {
+						oldCell.mCellElement = newElement;
+						oldCell.mnRepeatedColIndex = newRepeatColIndex;
+						oldCell.mnRepeatedRowIndex = newRepeatRowIndex;
+						Vector<Cell> list;
+						if (mCellRepository.containsKey(newElement)) {
+							list = mCellRepository.get(newElement);
+							boolean bReplaced = false;
+							for (int i = 0; i < list.size(); i++) {
+								Cell cell = list.get(i);
+								if (cell != null && (cell.getOdfElement() == newElement)) {
+									if ((cell.mnRepeatedColIndex == newRepeatColIndex)
+											&& (cell.mnRepeatedRowIndex == newRepeatRowIndex)) {
+										list.remove(i);
+										list.add(i, oldCell);
+										bReplaced = true;
+										break;
+									}
+								}
+							}
+							if (!bReplaced) {
+								list.add(oldCell);
+							}
+						} else {
+							list = new Vector<Cell>();
+							list.add(oldCell);
+							mCellRepository.put(newElement, list);
+						}
+					} else {
+						oldCell.mCellElement = null;
+						oldCell.mnRepeatedColIndex = 0;
+						oldCell.mnRepeatedRowIndex = 0;
+					}
+				}
+			} else {
+				// the new cell element is equal to the old cell element, just
+				// change the repeatIndex
+				if (oldCell != null) {
+					oldCell.mnRepeatedColIndex = newRepeatColIndex;
+					oldCell.mnRepeatedRowIndex = newRepeatRowIndex;
+				} else {
+					getCellInstance(newElement, newRepeatColIndex, newRepeatRowIndex);
+				}
+			}
+		}
+	}
+
+	void updateRepositoryWhenCellElementChanged(int startRow, int endRow, int startClm, int endClm,
+			TableTableCellElement newCellEle) {
+		for (int i = startRow; i < endRow; i++) {
+			for (int j = startClm; j < endClm; j++) {
+				Cell cell = getCellByPosition(j, i);
+				updateCellRepository(cell.getOdfElement(), cell.mnRepeatedColIndex, cell.mnRepeatedRowIndex,
+						newCellEle, cell.mnRepeatedColIndex, cell.mnRepeatedRowIndex);
+			}
+		}
+	}
+	
+	public DefaultStyleHandler getStyleHandler() {
+		if (mStyleHandler == null)
+			mStyleHandler = new DefaultStyleHandler(this.getOdfElement());
+		return mStyleHandler;
+	}
+	// default iterator to iterate column item.
+	private class SimpleColumnIterator implements Iterator<Column> {
+		private Table ownerTable;
+		private TableTableColumnElement nextColumnElement;
+		private TableTableColumnElement tempColumnElement;
+		private int columnsRepeatedIndex = -1;
+		private int columnsRepeatedNumber = 0;
+
+		private SimpleColumnIterator(Table owner) {
+			ownerTable = owner;
+		}
+
+		public boolean hasNext() {
+			tempColumnElement = findNext(nextColumnElement);
+			return (tempColumnElement != null);
+		}
+
+		public Column next() {
+			if (tempColumnElement != null) {
+				nextColumnElement = tempColumnElement;
+				tempColumnElement = null;
+			} else {
+				nextColumnElement = findNext(nextColumnElement);
+			}
+			if (nextColumnElement == null) {
+				return null;
+			} else {
+				return getColumnInstance(nextColumnElement, columnsRepeatedIndex);
+			}
+		}
+
+		public void remove() {
+			if (nextColumnElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			Column column = getColumnInstance(nextColumnElement, columnsRepeatedIndex);
+			ownerTable.removeColumnsByIndex(column.getColumnIndex(), 1);
+		}
+
+		private TableTableColumnElement findNext(TableTableColumnElement nextColumnElement) {
+			tempColumnElement = null;
+			columnsRepeatedIndex++;
+			if ((columnsRepeatedNumber > 0) && (columnsRepeatedIndex < columnsRepeatedNumber)) {
+				tempColumnElement = nextColumnElement;
+			} else {
+				Node child = null;
+				if (nextColumnElement == null) {
+					child = ownerTable.getOdfElement().getFirstChild();
+					while (child != null) {
+						if (child instanceof TableTableHeaderColumnsElement) {
+							TableTableHeaderColumnsElement headers = (TableTableHeaderColumnsElement) child;
+							Node header = headers.getFirstChild();
+							while (header != null) {
+								if (header instanceof TableTableColumnElement) {
+									tempColumnElement = (TableTableColumnElement) header;
+									break;
+								}
+								header = header.getNextSibling();
+							}
+							if (tempColumnElement != null) {
+								break;
+							}
+						}
+						if (child instanceof TableTableColumnElement) {
+							tempColumnElement = (TableTableColumnElement) child;
+							break;
+						}
+						child = child.getNextSibling();
+					}
+				} else {
+					child = nextColumnElement.getNextSibling();
+					if (child != null) {
+						if (child instanceof TableTableColumnElement) {
+							tempColumnElement = (TableTableColumnElement) child;
+						}
+					} else {
+						Node parentNode = nextColumnElement.getParentNode();
+						if (parentNode instanceof TableTableHeaderColumnsElement) {
+							parentNode = parentNode.getNextSibling();
+							if ((parentNode != null) && (parentNode instanceof TableTableColumnElement)) {
+								child = parentNode;
+								tempColumnElement = (TableTableColumnElement) child;
+							}
+						}
+					}
+				}
+				if (tempColumnElement != null) {
+					columnsRepeatedNumber = tempColumnElement.getTableNumberColumnsRepeatedAttribute();
+					columnsRepeatedIndex = 0;
+				}
+			}
+			return tempColumnElement;
+		}
+	}
+	
+	// default iterator to iterate row item.
+	private class SimpleRowIterator implements Iterator<Row> {
+		
+		private Table ownerTable;
+		private TableTableRowElement nextRowElement;
+		private TableTableRowElement tempRowElement;
+		private int rowsRepeatedIndex = -1;
+		private int rowsRepeatedNumber = 0;
+
+		private SimpleRowIterator(Table owner) {
+			ownerTable = owner;
+		}
+
+		public boolean hasNext() {
+			tempRowElement = findNext(nextRowElement);
+			return (tempRowElement != null);
+		}
+
+		public Row next() {
+			if (tempRowElement != null) {
+				nextRowElement = tempRowElement;
+				tempRowElement = null;
+			} else {
+				nextRowElement = findNext(nextRowElement);
+			}
+			if (nextRowElement == null) {
+				return null;
+			} else {
+				return getRowInstance(nextRowElement, rowsRepeatedIndex);
+			}
+		}
+
+		public void remove() {
+			if (nextRowElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			Row row = getRowInstance(nextRowElement, rowsRepeatedIndex);
+			ownerTable.removeRowsByIndex(row.getRowIndex(), 1);
+		}
+
+		private TableTableRowElement findNext(TableTableRowElement nextRowElement) {
+			tempRowElement = null;
+			rowsRepeatedIndex++;
+			if ((rowsRepeatedNumber > 0) && (rowsRepeatedIndex < rowsRepeatedNumber)) {
+				tempRowElement = nextRowElement;
+			} else {
+				Node child = null;
+				if (nextRowElement == null) {
+					child = ownerTable.getOdfElement().getFirstChild();
+					while (child != null) {
+						if (child instanceof TableTableHeaderRowsElement) {
+							TableTableHeaderRowsElement headers = (TableTableHeaderRowsElement) child;
+							Node header = headers.getFirstChild();
+							while (header != null) {
+								if (header instanceof TableTableRowElement) {
+									tempRowElement = (TableTableRowElement) header;
+									break;
+								}
+								header = header.getNextSibling();
+							}
+							if (tempRowElement != null) {
+								break;
+							}
+						}
+						if (child instanceof TableTableRowElement) {
+							tempRowElement = (TableTableRowElement) child;
+							break;
+						}
+						child = child.getNextSibling();
+					}
+				} else {
+					child = nextRowElement.getNextSibling();
+					if (child != null) {
+						if (child instanceof TableTableRowElement) {
+							tempRowElement = (TableTableRowElement) child;
+						}
+					} else {
+						Node parentNode = nextRowElement.getParentNode();
+						if (parentNode instanceof TableTableHeaderRowsElement) {
+							parentNode = parentNode.getNextSibling();
+							if ((parentNode != null) && (parentNode instanceof TableTableRowElement)) {
+								child = parentNode;
+								tempRowElement = (TableTableRowElement) child;
+							}
+						}
+					}
+				}
+				if (tempRowElement != null) {
+					rowsRepeatedNumber = tempRowElement.getTableNumberRowsRepeatedAttribute();
+					rowsRepeatedIndex = 0;
+				}
+			}
+			return tempRowElement;
+		}
+	}
+}
+
+/**
+ * Record the Cell Cover Info in this cell range.
+ * <p>
+ * Sometimes the covered cell is not tagged as
+ * <table:covered-table-cell>
+ * element.
+ */
+class CellCoverInfo {
+	int nStartCol;
+	int nStartRow;
+	int nEndCol;
+	int nEndRow;
+
+	CellCoverInfo(int nSC, int nSR, int nColumnSpan, int nRowSpan) {
+		nStartCol = nSC;
+		nStartRow = nSR;
+		nEndCol = nSC + nColumnSpan - 1;
+		nEndRow = nSR + nRowSpan - 1;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/TableContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/TableContainer.java
new file mode 100644
index 0000000..e4f550c
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/TableContainer.java
@@ -0,0 +1,102 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.List;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+
+/**
+ * TableContainer is a container which maintains Table(s) as element(s).
+ * Table(s) can be added, removed and iterated in this container.
+ * 
+ * @see Table
+ * @see org.odftoolkit.simple.TextDocument
+ * @see org.odftoolkit.simple.SpreadsheetDocument
+ * 
+ * @since 0.4.5
+ */
+public interface TableContainer {
+
+	/**
+	 * Get the ODF element which can have
+	 * <table:table>
+	 * as child element directly according to ODF specification. This Element
+	 * will help to find the position to insert a new Table. For example,
+	 * <table:table>
+	 * element is usable with <office:text> element, so TextDocument will return
+	 * OfficeTextElement. While Presentation Notes is an indirectly
+	 * TableContainer, which holds Table with the help of its grand-child
+	 * element <draw:text-box>, so for Notes, DrawTextBoxElement should be
+	 * return.
+	 * 
+	 * @return container element which can hold <text:table>.
+	 */
+	public OdfElement getTableContainerElement();
+
+	/**
+	 * Add a new Table to this container.
+	 * 
+	 * @return added table.
+	 */
+	public Table addTable();
+
+	/**
+	 * Add a new Table to this container with a specified row number and column
+	 * number.
+	 * <p>
+	 * The table will be inserted at the end of the tableContainer. An unique
+	 * table name will be given, you may set a custom table name using the
+	 * <code>setTableName</code> method.
+	 * 
+	 * @param numRows
+	 *            the row number
+	 * @param numCols
+	 *            the column number
+	 * @return a new instance of <code>Table</code>
+	 */
+	public Table addTable(int numRows, int numCols);
+
+	/**
+	 * Return an instance of table feature with the specific table name.
+	 * 
+	 * @param name
+	 *            of the table being searched for.
+	 * @return an instance of table feature with the specific table name.
+	 */
+	public Table getTableByName(String name);
+
+	/**
+	 * Return a list of table features in this document.
+	 * 
+	 * @return a list of table features in this document.
+	 */
+	public List<Table> getTableList();
+
+	/**
+	 * Return the table builder of this document. Every document has a table
+	 * builder, which supplies all of the table creation realization, for
+	 * example newTable().
+	 * 
+	 * @return the table builder of this document.
+	 */
+	public TableBuilder getTableBuilder();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/table/TableTemplate.java b/trunk/simple/src/main/java/org/odftoolkit/simple/table/TableTemplate.java
new file mode 100644
index 0000000..07eb77a
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/table/TableTemplate.java
@@ -0,0 +1,765 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.HashMap;
+
+import org.odftoolkit.odfdom.dom.element.table.TableBodyElement;
+import org.odftoolkit.odfdom.dom.element.table.TableEvenColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableEvenRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFirstColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableFirstRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLastColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableLastRowElement;
+import org.odftoolkit.odfdom.dom.element.table.TableOddColumnsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableOddRowsElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableTemplateElement;
+import org.w3c.dom.NodeList;
+
+/**
+ * TableTemplate represents the table template feature in ODF documents.
+ * <p>
+ * Besides the seven types of style (first row, first column, last row, last
+ * column, even/odd rows,even/odd columns and body) defined by
+ * <code>table:table-template</code> in ODF 1.2, TableTemplate provide extension
+ * mechnism, which allows user to specify style value to additional cells. For
+ * example, in ODF 1.2 the four coner cells can only inherit styles from the
+ * colum or row they are existing, but through TableTemplate.ExtendedStyleType,
+ * they can reference any style defined in the document.
+ * <p>
+ * TableTemplate provide method to get/set a set of references to table cell
+ * styles that specify the formatting to be used on a table.
+ * 
+ */
+public class TableTemplate {
+
+	private TableTableTemplateElement mElement;
+
+	/**
+	 * Extended style types supported by table template.
+	 * 
+	 */
+	public static enum ExtendedStyleType {
+		FIRSTROWSTARTCOLUM, FIRSTROWENDCOLUMN, LASTROWSTARTCOLUMN, LASTROWENDCOLUMN
+	}
+
+	HashMap<ExtendedStyleType, String> extendedTableStyleMap;
+	HashMap<ExtendedStyleType, String> extendedParagraphStyleMap;
+
+	/**
+	 * Create an instance of TableTemplate
+	 */
+	protected TableTemplate() {
+	}
+
+	/**
+	 * Create an instance of TableTemplate from an element
+	 * <table:table-template>
+	 * 
+	 * @param tableTableTemplate
+	 *            - the element of table:table-template
+	 */
+	public TableTemplate(TableTableTemplateElement tableTableTemplate) {
+		mElement = tableTableTemplate;
+	}
+
+	/**
+	 * Return the name of table template.
+	 * <p>
+	 * Null will be returned if there is no table template name setting.
+	 * 
+	 * @return the table template name.
+	 */
+	public String getTableName() {
+		return mElement.getTableNameAttribute();
+	}
+
+	/**
+	 * Set the name of table template.
+	 * <p>
+	 * If the parameter <code>tableNameValue</code> is null, the table template
+	 * name definition will be removed.
+	 * 
+	 * @param tableNameValue
+	 *            - the table template name
+	 */
+	public void setTableName(String tableNameValue) {
+		mElement.setTableNameAttribute(tableNameValue);
+	}
+
+	/**
+	 * get the value of table style specified by type.
+	 * <p>
+	 * Null will be returned if there is no such extended style type setting.
+	 * 
+	 * @param type
+	 *            - style type
+	 * @return the style name referenced by this style type
+	 */
+	public String getExtendedTableStyleByType(ExtendedStyleType type) {
+		if (extendedTableStyleMap == null)
+			return null;
+		return extendedTableStyleMap.get(type);
+	}
+
+	/**
+	 * get the value of paragraph style specified by type.
+	 * <p>
+	 * Null will be returned if there is no such extended style type setting.
+	 * 
+	 * @param type
+	 *            - extended style type
+	 * @return the style name referenced by this style type
+	 */
+	public String getExtendedParagraphStyleByType(ExtendedStyleType type) {
+		if (extendedParagraphStyleMap == null)
+			return null;
+		return extendedParagraphStyleMap.get(type);
+	}
+
+	/**
+	 * set the value of table style and paragraph style specified by type.
+	 * 
+	 * @param type
+	 *            - extended style type
+	 * @param tableStyle
+	 *            - table style name
+	 * @param paraStyle
+	 *            - paragraph style name
+	 */
+	public void setExtendedStyleByType(ExtendedStyleType type,
+			String tableStyle, String paraStyle) {
+
+		if (extendedTableStyleMap == null) {
+			extendedTableStyleMap = new HashMap<ExtendedStyleType, String>(5);
+		}
+		if (extendedParagraphStyleMap == null) {
+			extendedParagraphStyleMap = new HashMap<ExtendedStyleType, String>(
+					5);
+		}
+		extendedTableStyleMap.put(type, tableStyle);
+		extendedParagraphStyleMap.put(type, paraStyle);
+	}
+
+	/**
+	 * get the value of table style of body.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of body.
+	 */
+	public String getTableBodyTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableBodyElement.ELEMENT_NAME.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableBodyElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of body.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of body.
+	 */
+	public String getTableBodyParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableBodyElement.ELEMENT_NAME.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableBodyElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of even columns.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of even columns.
+	 */
+	public String getTableEvenColumnsTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableEvenColumnsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableEvenColumnsElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of even columns.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of even columns.
+	 */
+	public String getTableEvenColumnsParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableEvenColumnsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableEvenColumnsElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of even rows.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of even rows.
+	 */
+	public String getTableEvenRowsTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableEvenRowsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableEvenRowsElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of even rows.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of even rows.
+	 */
+	public String getTableEvenRowsParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableEvenRowsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableEvenRowsElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of first colum.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of first column.
+	 */
+	public String getTableFirstColumnTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableFirstColumnElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableFirstColumnElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of first column.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of first column.
+	 */
+	public String getTableFirstColumnParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableFirstColumnElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableFirstColumnElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of first row.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of first row.
+	 */
+	public String getTableFirstRowTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableFirstRowElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableFirstRowElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of first row.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of first row.
+	 */
+	public String getTableFirstRowParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableFirstRowElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableFirstRowElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of last column.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of last column.
+	 */
+	public String getTableLastColumnTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableLastColumnElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableLastColumnElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of last column.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of last column.
+	 */
+	public String getTableLastColumnParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableLastColumnElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableLastColumnElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of last row.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of last row.
+	 */
+	public String getTableLastRowTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableLastRowElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableLastRowElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of last row.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of last row.
+	 */
+	public String getTableLastRowParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableLastRowElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableLastRowElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of odd columns.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of odd columns.
+	 */
+	public String getTableOddColumnsTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableOddColumnsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableOddColumnsElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of odd columns.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of odd columns.
+	 */
+	public String getTableOddColumnsParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableOddColumnsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableOddColumnsElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of table style of odd rows.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by table style of odd rows.
+	 */
+	public String getTableOddRowsTableStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableOddRowsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableOddRowsElement) elements.item(0))
+					.getTableStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * get the value of paragraph style of odd rows.
+	 * <p>
+	 * Null will be returned if there is no such style setting.
+	 * 
+	 * @return the style name referenced by paragraph style of odd rows.
+	 */
+	public String getTableOddRowsParagraphStyle() {
+		NodeList elements = mElement
+				.getElementsByTagName(TableOddRowsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			return ((TableOddRowsElement) elements.item(0))
+					.getTableParagraphStyleNameAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of body.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in body will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in body will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by body
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by body
+	 */
+	public void setTableBodyStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableBodyElement.ELEMENT_NAME.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableBodyElement ele = (TableBodyElement) elements.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableBodyElement ele = mElement
+					.newTableBodyElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of even columns.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in even columns will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in even columns will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by even columns
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by even columns
+	 */
+	public void setTableEvenColumnsStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableEvenColumnsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableEvenColumnsElement ele = (TableEvenColumnsElement) elements
+					.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableEvenColumnsElement ele = mElement
+					.newTableEvenColumnsElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of even rows.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in even rows will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in even rows will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by even rows
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by even rows
+	 */
+	public void setTableEvenRowsStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableEvenRowsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableEvenRowsElement ele = (TableEvenRowsElement) elements.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableEvenRowsElement ele = mElement
+					.newTableEvenRowsElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of first column.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in first column will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in first column will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by first column
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by first column
+	 */
+	public void setTableFirstColumnStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableFirstColumnElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableFirstColumnElement ele = (TableFirstColumnElement) elements
+					.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableFirstColumnElement ele = mElement
+					.newTableFirstColumnElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of first row.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in first row will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in first row will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by first row
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by first row
+	 */
+	public void setTableFirstRowStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableFirstRowElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableFirstRowElement ele = (TableFirstRowElement) elements.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableFirstRowElement ele = mElement
+					.newTableFirstRowElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of last column.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in last column will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in last column will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by last column
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by last column
+	 */
+	public void setTableLastColumnStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableLastColumnElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableLastColumnElement ele = (TableLastColumnElement) elements
+					.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableLastColumnElement ele = mElement
+					.newTableLastColumnElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of last row.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in last row will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in last row will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by last row
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by last row
+	 */
+	public void setTableLastRowStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableLastRowElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableLastRowElement ele = (TableLastRowElement) elements.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableLastRowElement ele = mElement
+					.newTableLastRowElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of odd columns.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in odd columns will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in odd columns will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by odd columns
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by odd columns
+	 */
+	public void setTableOddColumnsStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableOddColumnsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableOddColumnsElement ele = (TableOddColumnsElement) elements
+					.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableOddColumnsElement ele = mElement
+					.newTableOddColumnsElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+	/**
+	 * Set the value of table style and paragraph style of odd rows.
+	 * <p>
+	 * If the parameter <code>tableStyleNameValue</code> is null, the table
+	 * style name definition in odd rows will be removed. If the parameter
+	 * <code>tableParagraphStyleNameValue</code> is null, the paragraph style
+	 * name definition in odd rows will be removed.
+	 * 
+	 * @param tableStyleNameValue
+	 *            - table style name referenced by odd rows
+	 * @param tableParagraphStyleNameValue
+	 *            - paragraph style name referenced by odd rows
+	 */
+	public void setTableOddRowsStyle(String tableStyleNameValue,
+			String tableParagraphStyleNameValue) {
+		NodeList elements = mElement
+				.getElementsByTagName(TableOddRowsElement.ELEMENT_NAME
+						.getQName());
+		if (elements != null && elements.getLength() > 0) {
+			TableOddRowsElement ele = (TableOddRowsElement) elements.item(0);
+			ele.setTableStyleNameAttribute(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		} else {
+			TableOddRowsElement ele = mElement
+					.newTableOddRowsElement(tableStyleNameValue);
+			ele
+					.setTableParagraphStyleNameAttribute(tableParagraphStyleNameValue);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/AbstractParagraphContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/AbstractParagraphContainer.java
new file mode 100644
index 0000000..2ace7a4
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/AbstractParagraphContainer.java
@@ -0,0 +1,201 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.w3c.dom.Node;
+
+/**
+ * AbstractParagraphContainer is an abstract class to present paragraph
+ * container. It contains the default implementation to add/get/remove
+ * paragraph. Each subclass needs to implement getParagraphContainerElement().
+ * 
+ * @since 0.5
+ */
+public abstract class AbstractParagraphContainer implements ParagraphContainer {
+
+	abstract public OdfElement getParagraphContainerElement();
+
+	/**
+	 * Add paragraph at the end of the container with specified text content.
+	 * 
+	 * @param textContent
+	 *            the text content
+	 * @return an instance of paragraph
+	 */
+	public Paragraph addParagraph(String textContent) {
+		Paragraph para = Paragraph.newParagraph(this);
+		para.setTextContent(textContent);
+		return para;
+	}
+
+	/**
+	 * Remove paragraph from the container
+	 * 
+	 * @param para
+	 *            the instance of paragraph
+	 * @return true if the paragraph is removed successfully, false if errors
+	 *         happen.
+	 */
+	public boolean removeParagraph(Paragraph para) {
+		try {
+			para.remove();
+		} catch (Exception exception) {
+			Logger.getLogger(AbstractParagraphContainer.class.getName()).log(Level.WARNING, exception.getMessage());
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Return an Iterator of the paragraph in this container.
+	 * 
+	 * @return an Iterator of the paragraph in this container
+	 */
+	public Iterator<Paragraph> getParagraphIterator() {
+		return new SimpleParagraphIterator(this);
+	}
+
+	/**
+	 * Return a paragraph with a given index.
+	 * <p>
+	 * An index of zero represents the first paragraph.
+	 * <p>
+	 * If empty paragraph is skipped, the empty paragraph won't be counted.
+	 * 
+	 * @param index
+	 *            the index started from 0.
+	 * @param isEmptyParagraphSkipped
+	 *            whether the empty paragraph is skipped or not.
+	 * @return the paragraph with a given index
+	 */
+	public Paragraph getParagraphByIndex(int index, boolean isEmptyParagraphSkipped) {
+		Iterator<Paragraph> iterator = getParagraphIterator();
+		while (iterator.hasNext() && (index >= 0)) {
+			Paragraph current = iterator.next();
+			if (isEmptyParagraphSkipped) {
+				String content = current.getTextContent();
+				if ((content == null) || (content.length() == 0)) {
+					continue;
+				}
+			}
+			if (index == 0) {
+				return current;
+			}
+			index--;
+		}
+		return null;
+	}
+
+	/**
+	 * Return a paragraph with a given index. The index is in reverse order.
+	 * <p>
+	 * An index of zero represents the last paragraph.
+	 * <p>
+	 * If empty paragraph is skipped, the empty paragraph won't be counted.
+	 * 
+	 * @param reverseIndex
+	 *            the index started from 0 in reverse order.
+	 * @param isEmptyParagraphSkipped
+	 *            whether the empty paragraph is skipped or not.
+	 * @return the paragraph with a given index.
+	 */
+	public Paragraph getParagraphByReverseIndex(int reverseIndex, boolean isEmptyParagraphSkipped) {
+		OdfElement containerElement = getParagraphContainerElement();
+		Node node = containerElement.getLastChild();
+		while (node != null && (reverseIndex >= 0)) {
+			if (node.getNodeType() != Node.ELEMENT_NODE) {
+				node = node.getPreviousSibling();
+				continue;
+			}
+			if (node instanceof TextParagraphElementBase) {
+				if (isEmptyParagraphSkipped) {
+					if (node.hasChildNodes() == false || node.getTextContent() == null
+							|| node.getTextContent().length() == 0) {
+						node = node.getPreviousSibling();
+						continue;
+					}
+				}
+				if (reverseIndex == 0) {
+					return Paragraph.getInstanceof((TextParagraphElementBase) node);
+				}
+				reverseIndex--;
+			}
+			node = node.getPreviousSibling();
+		}
+		return null;
+	}
+
+	private class SimpleParagraphIterator implements Iterator<Paragraph> {
+
+		private OdfElement containerElement;
+		private Paragraph nextElement = null;
+		private Paragraph tempElement = null;
+
+		private SimpleParagraphIterator(ParagraphContainer container) {
+			containerElement = container.getParagraphContainerElement();
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public Paragraph next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			nextElement.remove();
+		}
+
+		private Paragraph findNext(Paragraph thisBox) {
+			TextParagraphElementBase nextParagraph = null;
+			if (thisBox == null) {
+				nextParagraph = OdfElement.findFirstChildNode(TextParagraphElementBase.class, containerElement);
+			} else {
+				nextParagraph = OdfElement.findNextChildNode(TextParagraphElementBase.class, thisBox.getOdfElement());
+			}
+
+			if (nextParagraph != null) {
+				return Paragraph.getInstanceof(nextParagraph);
+			}
+			return null;
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/Footer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Footer.java
new file mode 100644
index 0000000..0169cf9
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Footer.java
@@ -0,0 +1,280 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleColumnsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleSectionPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.AbstractVariableContainer;
+import org.odftoolkit.simple.common.field.VariableContainer;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+import org.odftoolkit.simple.table.AbstractTableContainer;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents footer definition in text document. It provides methods
+ * to manipulate footer in text document, such as, set text, add table.
+ * 
+ * @since 0.4.5
+ */
+public class Footer extends Component implements TableContainer, VariableContainer {
+	private StyleFooterElement footerEle;
+	private TableContainerImpl tableContainerImpl;
+	private VariableContainerImpl variableContainerImpl;
+
+	/**
+	 * Create a footer instance by an object of <code>StyleFooterElement</code>.
+	 * 
+	 * @param element
+	 *            - an object of <code>StyleFooterElement</code>
+	 */
+	public Footer(StyleFooterElement element) {
+		footerEle = element;
+	}
+
+	/**
+	 * Return an instance of <code>StyleFooterElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>StyleFooterElement</code>
+	 */
+	public StyleFooterElement getOdfElement() {
+		return footerEle;
+	}
+	
+	/**
+	 * Get this footer is visible or not.
+	 * 
+	 * @return If this footer is visible return <code>true</code>, otherwise
+	 *         return <code>false</code>.
+	 * @since 0.5.5
+	 */
+	public boolean isVisible() {
+		boolean isVisible = footerEle.getStyleDisplayAttribute();
+		return isVisible;
+	}
+	
+	/**
+	 * Set this footer visible or not.
+	 * 
+	 * @param isVisible
+	 *            If <code>isVisible</code> is true, the footer of this document
+	 *            is visible, otherwise is invisible.
+	 * @since 0.5.5
+	 */
+	public void setVisible(boolean isVisible) {
+		if (isVisible) {
+			footerEle.removeAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "display");
+		} else {
+			footerEle.setStyleDisplayAttribute(false);
+		}
+		NodeList nodeList = footerEle.getElementsByTagName(TextPElement.ELEMENT_NAME.getQName());
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			TextPElement textEle = (TextPElement) nodeList.item(i);
+			String stylename = textEle.getStyleName();
+			OdfFileDom dom = (OdfFileDom) footerEle.getOwnerDocument();
+			OdfOfficeAutomaticStyles styles = null;
+			if (dom instanceof OdfContentDom) {
+				styles = ((OdfContentDom) dom).getAutomaticStyles();
+			} else if (dom instanceof OdfStylesDom) {
+				styles = ((OdfStylesDom) dom).getAutomaticStyles();
+			}
+			
+			OdfStyle newStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+			OdfStyle style = styles.getStyle(stylename, OdfStyleFamily.Paragraph);
+			if (style != null) {
+				String styleName = newStyle.getStyleNameAttribute();
+				styles.removeChild(newStyle);
+				newStyle = (OdfStyle) style.cloneNode(true);
+				newStyle.setStyleNameAttribute(styleName);
+				styles.appendChild(newStyle);
+			}
+			if (isVisible) {
+				if (newStyle.hasProperty(StyleTextPropertiesElement.Display)) {
+					newStyle.removeProperty(StyleTextPropertiesElement.Display);
+				}
+			} else {
+				newStyle.setProperty(StyleTextPropertiesElement.Display, "none");
+			}
+			textEle.setStyleName(newStyle.getStyleNameAttribute());
+		}
+	}
+	
+	public Table addTable() {
+		Table table = getTableContainerImpl().addTable();
+		updateTableToNone(table);
+		return table;
+	}
+
+	public Table addTable(int numRows, int numCols) {
+		Table table = getTableContainerImpl().addTable(numRows, numCols);
+		updateTableToNone(table);
+		return table;
+	}
+
+	public Table getTableByName(String name) {
+		return getTableContainerImpl().getTableByName(name);
+	}
+
+	public java.util.List<Table> getTableList() {
+		return getTableContainerImpl().getTableList();
+	}
+
+	public TableBuilder getTableBuilder() {
+		return getTableContainerImpl().getTableBuilder();
+	}
+
+	public OdfElement getTableContainerElement() {
+		return getTableContainerImpl().getTableContainerElement();
+	}
+
+	public OdfElement getVariableContainerElement() {
+		return getVariableContainerImpl().getVariableContainerElement();
+	}
+
+	public VariableField declareVariable(String name, VariableType type) {
+		return getVariableContainerImpl().declareVariable(name, type);
+	}
+
+	public VariableField getVariableFieldByName(String name) {
+		return getVariableContainerImpl().getVariableFieldByName(name);
+	}
+
+	private TableContainer getTableContainerImpl() {
+		if (tableContainerImpl == null) {
+			tableContainerImpl = new TableContainerImpl();
+		}
+		return tableContainerImpl;
+	}
+
+	private VariableContainer getVariableContainerImpl() {
+		if (variableContainerImpl == null) {
+			variableContainerImpl = new VariableContainerImpl();
+		}
+		return variableContainerImpl;
+	}
+
+	private void updateTableToNone(Table table) {
+		OdfFileDom dom = (OdfFileDom) getTableContainerElement().getOwnerDocument();
+		TableTableElement tableEle = table.getOdfElement();
+		String stylename = tableEle.getStyleName();
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		OdfStyle tableStyle = styles.getStyle(stylename, OdfStyleFamily.Table);
+		tableStyle.setProperty(StyleTablePropertiesElement.Shadow, "none");
+		NodeList cells = tableEle.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-cell");
+		if (cells != null && cells.getLength() > 0) {
+			OdfStyle cellStyleWithoutBorder = styles.newStyle(OdfStyleFamily.TableCell);
+			cellStyleWithoutBorder.setProperty(StyleTableCellPropertiesElement.Border, "none");
+			cellStyleWithoutBorder.removeProperty(StyleTableCellPropertiesElement.Padding);
+			String cellStyleName = cellStyleWithoutBorder.getStyleNameAttribute();
+			for (int i = 0; i < cells.getLength(); i++) {
+				TableTableCellElement cell = (TableTableCellElement) cells.item(i);
+				cell.setStyleName(cellStyleName);
+			}
+		}
+	}
+
+	private class TableContainerImpl extends AbstractTableContainer {
+
+		public OdfElement getTableContainerElement() {
+			return footerEle;
+		}
+	}
+
+	private class VariableContainerImpl extends AbstractVariableContainer {
+
+		public OdfElement getVariableContainerElement() {
+			try {
+				return footerEle;
+			} catch (Exception e) {
+				Logger.getLogger(Footer.class.getName()).log(Level.SEVERE, null, e);
+				return null;
+			}
+		}
+	}
+
+	/**
+	 * Create an empty section and append it at the end of the footer.
+	 * 
+	 * @param name
+	 *            - specify the section name
+	 * @return an instance of the section
+	 * @throws RuntimeException
+	 *             if content DOM could not be initialized
+	 */
+	public Section appendSection(String name) {
+		TextSectionElement newSectionEle = null;
+		try {
+			Document doc = (Document) ((OdfFileDom) footerEle
+					.getOwnerDocument()).getDocument();
+			OdfContentDom contentDocument = doc.getContentDom();
+			OdfOfficeAutomaticStyles styles = contentDocument
+					.getAutomaticStyles();
+			OdfStyle style = styles.newStyle(OdfStyleFamily.Section);
+			StyleSectionPropertiesElement sProperties = style
+					.newStyleSectionPropertiesElement();
+			sProperties.setTextDontBalanceTextColumnsAttribute(false);
+			sProperties.setStyleEditableAttribute(false);
+			StyleColumnsElement columnEle = sProperties
+					.newStyleColumnsElement(1);
+			columnEle.setFoColumnGapAttribute("0in");
+
+			newSectionEle = footerEle.newTextSectionElement("true", name);
+			newSectionEle.setStyleName(style.getStyleNameAttribute());
+			return Section.getInstance(newSectionEle);
+
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					null, e);
+			throw new RuntimeException(name + "Section appends failed.", e);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/Header.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Header.java
new file mode 100644
index 0000000..1c0d702
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Header.java
@@ -0,0 +1,280 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleColumnsElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleSectionPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTableCellPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTablePropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.AbstractVariableContainer;
+import org.odftoolkit.simple.common.field.VariableContainer;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+import org.odftoolkit.simple.table.AbstractTableContainer;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents header definition in text document. It provides methods
+ * to manipulate header in text document, such as, set text, add table.
+ * 
+ * @since 0.4.5
+ */
+public class Header extends Component implements TableContainer, VariableContainer {
+
+	private StyleHeaderElement headerEle;
+	private TableContainerImpl tableContainerImpl;
+	private VariableContainerImpl variableContainerImpl;
+
+	/**
+	 * Create a header instance by an object of <code>StyleHeaderElement</code>.
+	 * 
+	 * @param element
+	 *            - an object of <code>StyleHeaderElement</code>
+	 */
+	public Header(StyleHeaderElement element) {
+		headerEle = element;
+	}
+
+	/**
+	 * Return an instance of <code>StyleHeaderElement</code> which represents
+	 * this feature.
+	 * 
+	 * @return an instance of <code>StyleHeaderElement</code>
+	 */
+	public StyleHeaderElement getOdfElement() {
+		return headerEle;
+	}
+
+	/**
+	 * Get this header is visible or not.
+	 * 
+	 * @return If this header is visible return <code>true</code>, otherwise
+	 *         return <code>false</code>.
+	 * @since 0.5.5
+	 */
+	public boolean isVisible() {
+		boolean isVisible = headerEle.getStyleDisplayAttribute();
+		return isVisible;
+	}
+
+	/**
+	 * Set this header visible or not.
+	 * 
+	 * @param isVisible
+	 *            If <code>isVisible</code> is true, the header of this document
+	 *            is visible, otherwise is invisible.
+	 * @since 0.5.5
+	 */
+	public void setVisible(boolean isVisible) {
+		if (isVisible) {
+			headerEle.removeAttributeNS(OdfDocumentNamespace.STYLE.getUri(), "display");
+		} else {
+			headerEle.setStyleDisplayAttribute(false);
+		}
+		NodeList nodeList = headerEle.getElementsByTagName(TextPElement.ELEMENT_NAME.getQName());
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			TextPElement textEle = (TextPElement) nodeList.item(i);
+			String stylename = textEle.getStyleName();
+			OdfFileDom dom = (OdfFileDom) headerEle.getOwnerDocument();
+			OdfOfficeAutomaticStyles styles = null;
+			if (dom instanceof OdfContentDom) {
+				styles = ((OdfContentDom) dom).getAutomaticStyles();
+			} else if (dom instanceof OdfStylesDom) {
+				styles = ((OdfStylesDom) dom).getAutomaticStyles();
+			}
+
+			OdfStyle newStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+			OdfStyle style = styles.getStyle(stylename, OdfStyleFamily.Paragraph);
+			if (style != null) {
+				String styleName = newStyle.getStyleNameAttribute();
+				styles.removeChild(newStyle);
+				newStyle = (OdfStyle) style.cloneNode(true);
+				newStyle.setStyleNameAttribute(styleName);
+				styles.appendChild(newStyle);
+			}
+			if (isVisible) {
+				if (newStyle.hasProperty(StyleTextPropertiesElement.Display)) {
+					newStyle.removeProperty(StyleTextPropertiesElement.Display);
+				}
+			} else {
+				newStyle.setProperty(StyleTextPropertiesElement.Display, "none");
+			}
+			textEle.setStyleName(newStyle.getStyleNameAttribute());
+		}
+	}
+
+	public Table addTable() {
+		Table table = getTableContainerImpl().addTable();
+		updateTableToNone(table);
+		return table;
+	}
+
+	public Table addTable(int numRows, int numCols) {
+		Table table = getTableContainerImpl().addTable(numRows, numCols);
+		updateTableToNone(table);
+		return table;
+	}
+
+	public Table getTableByName(String name) {
+		return getTableContainerImpl().getTableByName(name);
+	}
+
+	public java.util.List<Table> getTableList() {
+		return getTableContainerImpl().getTableList();
+	}
+
+	public TableBuilder getTableBuilder() {
+		return getTableContainerImpl().getTableBuilder();
+	}
+
+	public OdfElement getTableContainerElement() {
+		return getTableContainerImpl().getTableContainerElement();
+	}
+
+	public OdfElement getVariableContainerElement() {
+		return getVariableContainerImpl().getVariableContainerElement();
+	}
+
+	public VariableField declareVariable(String name, VariableType type) {
+		return getVariableContainerImpl().declareVariable(name, type);
+	}
+
+	public VariableField getVariableFieldByName(String name) {
+		return getVariableContainerImpl().getVariableFieldByName(name);
+	}
+
+	private TableContainer getTableContainerImpl() {
+		if (tableContainerImpl == null) {
+			tableContainerImpl = new TableContainerImpl();
+		}
+		return tableContainerImpl;
+	}
+
+	private VariableContainer getVariableContainerImpl() {
+		if (variableContainerImpl == null) {
+			variableContainerImpl = new VariableContainerImpl();
+		}
+		return variableContainerImpl;
+	}
+
+	private void updateTableToNone(Table table) {
+		OdfFileDom dom = (OdfFileDom) getTableContainerElement().getOwnerDocument();
+		TableTableElement tableEle = table.getOdfElement();
+		String stylename = tableEle.getStyleName();
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		OdfStyle tableStyle = styles.getStyle(stylename, OdfStyleFamily.Table);
+		tableStyle.setProperty(StyleTablePropertiesElement.Shadow, "none");
+		NodeList cells = tableEle.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-cell");
+		if (cells != null && cells.getLength() > 0) {
+			OdfStyle cellStyleWithoutBorder = styles.newStyle(OdfStyleFamily.TableCell);
+			cellStyleWithoutBorder.setProperty(StyleTableCellPropertiesElement.Border, "none");
+			cellStyleWithoutBorder.removeProperty(StyleTableCellPropertiesElement.Padding);
+			String cellStyleName = cellStyleWithoutBorder.getStyleNameAttribute();
+			for (int i = 0; i < cells.getLength(); i++) {
+				TableTableCellElement cell = (TableTableCellElement) cells.item(i);
+				cell.setStyleName(cellStyleName);
+			}
+		}
+	}
+
+	private class TableContainerImpl extends AbstractTableContainer {
+
+		public OdfElement getTableContainerElement() {
+			return headerEle;
+		}
+	}
+
+	private class VariableContainerImpl extends AbstractVariableContainer {
+
+		public OdfElement getVariableContainerElement() {
+			try {
+				return headerEle;
+			} catch (Exception e) {
+				Logger.getLogger(Header.class.getName()).log(Level.SEVERE, null, e);
+				return null;
+			}
+		}
+	}
+
+	/**
+	 * Create an empty section and append it at the end of the footer.
+	 * 
+	 * @param name
+	 *            - specify the section name
+	 * @return an instance of the section
+	 * @throws RuntimeException
+	 *             if content DOM could not be initialized
+	 */
+	public Section appendSection(String name) {
+		TextSectionElement newSectionEle = null;
+		try {
+			Document doc = (Document) ((OdfFileDom) headerEle
+					.getOwnerDocument()).getDocument();
+			OdfContentDom contentDocument = doc.getContentDom();
+			OdfOfficeAutomaticStyles styles = contentDocument
+					.getAutomaticStyles();
+			OdfStyle style = styles.newStyle(OdfStyleFamily.Section);
+			StyleSectionPropertiesElement sProperties = style
+					.newStyleSectionPropertiesElement();
+			sProperties.setTextDontBalanceTextColumnsAttribute(false);
+			sProperties.setStyleEditableAttribute(false);
+			StyleColumnsElement columnEle = sProperties
+					.newStyleColumnsElement(1);
+			columnEle.setFoColumnGapAttribute("0in");
+
+			newSectionEle = headerEle.newTextSectionElement("true", name);
+			newSectionEle.setStyleName(style.getStyleNameAttribute());
+			return Section.getInstance(newSectionEle);
+
+		} catch (Exception e) {
+			Logger.getLogger(TextDocument.class.getName()).log(Level.SEVERE,
+					null, e);
+			throw new RuntimeException(name + "Section appends failed.", e);
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/Paragraph.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Paragraph.java
new file mode 100644
index 0000000..f75ab60
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Paragraph.java
@@ -0,0 +1,778 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.dc.DcCreatorElement;
+import org.odftoolkit.odfdom.dom.element.dc.DcDateElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawControlElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.draw.AbstractTextboxContainer;
+import org.odftoolkit.simple.draw.Control;
+import org.odftoolkit.simple.draw.ControlContainer;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.draw.Textbox;
+import org.odftoolkit.simple.draw.TextboxContainer;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * This class presents paragraph element in ODF document. It provides methods to
+ * manipulate text content, and other child component under the paragraph.
+ * Headings and body text paragraphs are collectively referred to as paragraph
+ * elements.
+ * 
+ * @since 0.5
+ */
+public class Paragraph extends Component implements TextboxContainer,
+		TextHyperlinkContainer, ControlContainer {
+
+	private TextPElement mParagraphElement;
+	private TextHElement mHeadingElement;
+	private Document mOwnerDocument;
+	private ParagraphStyleHandler mStyleHandler;
+	private TextboxContainerImpl mTextboxContainerImpl;
+	private TextHyperlinkContainerImpl mHyperlinkContainerImpl;
+
+	private Paragraph(TextParagraphElementBase paragraphElement) {
+		if (paragraphElement instanceof TextPElement) {
+			mParagraphElement = (TextPElement) paragraphElement;
+			mHeadingElement = null;
+		}
+		if (paragraphElement instanceof TextHElement) {
+			mHeadingElement = (TextHElement) paragraphElement;
+			mParagraphElement = null;
+		}
+		mOwnerDocument = (Document) ((OdfFileDom) paragraphElement.getOwnerDocument()).getDocument();
+		mStyleHandler = new ParagraphStyleHandler(this);
+	}
+
+	/**
+	 * Gets a paragraph instance by an instance of
+	 * <code>TextParagraphElementBase</code>.
+	 * 
+	 * @param paragraphElement
+	 *            the instance of TextParagraphElementBase.
+	 * @return an instance of paragraph.
+	 */
+	public static Paragraph getInstanceof(TextParagraphElementBase paragraphElement) {
+		if (paragraphElement == null)
+			return null;
+
+		Paragraph para = null;
+		para = (Paragraph) Component.getComponentByElement(paragraphElement);
+		if (para != null)
+			return para;
+
+		para = new Paragraph(paragraphElement);
+		Component.registerComponent(para, paragraphElement);
+		return para;
+	}
+
+	/**
+	 * Create an instance of paragraph
+	 * <p>
+	 * The paragrah will be added at the end of this container.
+	 * 
+	 * @param container
+	 *            the paragraph container that contains this paragraph.
+	 */
+	public static Paragraph newParagraph(ParagraphContainer container) {
+		Paragraph para = null;
+		OdfElement parent = container.getParagraphContainerElement();
+		OdfFileDom ownerDom = (OdfFileDom) parent.getOwnerDocument();
+		TextPElement pEle = ownerDom.newOdfElement(TextPElement.class);
+		parent.appendChild(pEle);
+		para = new Paragraph(pEle);
+		Component.registerComponent(para, pEle);
+
+		return para;
+	}
+
+	/**
+	 * Set the text content of this paragraph.
+	 * <p>
+	 * All the existing text content of this paragraph would be removed, and
+	 * then new text content would be set. The style of the last character will
+	 * be inherited.
+	 * <p>
+	 * The white space characters in the content would be collapsed by default.
+	 * For example, tab character would be replaced with <text:tab>, break line
+	 * character would be replaced with <text:line-break>.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @see #setTextContentNotCollapsed(String content)
+	 */
+	public void setTextContent(String content) {
+		removeTextContentImpl(getOdfElement());
+		Node lastNode = getOdfElement().getLastChild();
+		if (lastNode != null && lastNode.getNodeName() != null
+				&& (lastNode.getNodeName().equals("text:a") || lastNode.getNodeName().equals("text:span"))) {
+			if (content != null && !content.equals(""))
+				appendTextElements((TextAElement) lastNode, content, true);
+		} else {
+			if (content != null && !content.equals(""))
+				appendTextElements(getOdfElement(), content, true);
+		}
+		// remove empty hyperlink
+		removeEmptyHyperlink(getOdfElement());
+	}
+
+	static void removeEmptyHyperlink(OdfElement element) {
+		// remove empty hyperlink
+		NodeList nodeList = element.getChildNodes();
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			Node node;
+			node = nodeList.item(i);
+			if (node.getNodeType() == Node.ELEMENT_NODE) {
+				String nodename = node.getNodeName();
+				if (nodename.equals("text:a") && node.hasChildNodes() == false)
+					element.removeChild(node);
+			}
+		}
+	}
+
+	/**
+	 * Remove the text content of this paragraph. The empty hyperlink element
+	 * will be removed.
+	 * <p>
+	 * The other child elements except text content will not be removed.
+	 * 
+	 */
+	public void removeTextContent() {
+		removeTextContentImpl(getOdfElement());
+		removeEmptyHyperlink(getOdfElement());
+	}
+
+	static void removeTextContentImpl(OdfElement ownerElement) {
+		NodeList nodeList = ownerElement.getChildNodes();
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			Node node;
+			node = nodeList.item(i);
+			if (node.getNodeType() == Node.TEXT_NODE) {
+				ownerElement.removeChild(node);
+				// element removed need reset index.
+				i--;
+			} else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				String nodename = node.getNodeName();
+				if (nodename.equals("text:s") || nodename.equals("text:tab") || nodename.equals("text:line-break")) {
+					ownerElement.removeChild(node);
+					// element removed need reset index.
+					i--;
+				} else if (nodename.equals("text:a"))
+					removeTextContentImpl((OdfElement) node);
+			}
+		}
+	}
+
+	/**
+	 * Return the text content of this paragraph.
+	 * <p>
+	 * The other child elements except text content will not be returned.
+	 * 
+	 * @return - the text content of this paragraph
+	 */
+	public String getTextContent() {
+		return getTextContent(getOdfElement());
+	}
+
+	static String getTextContent(OdfElement ownerEle) {
+		StringBuilder buffer = new StringBuilder();
+		NodeList nodeList = ownerEle.getChildNodes();
+		int i;
+		for (i = 0; i < nodeList.getLength(); i++) {
+			Node node;
+			node = nodeList.item(i);
+			if (node.getNodeType() == Node.TEXT_NODE)
+				buffer.append(node.getNodeValue());
+			else if (node.getNodeType() == Node.ELEMENT_NODE) {
+				if (node instanceof TextSpanElement) {
+					buffer.append(((TextSpanElement) node).getTextContent());
+				}
+				else if (node.getNodeName().equals("text:s")) {
+					Integer count = ((TextSElement) node).getTextCAttribute();
+					for (int j = 0; j < (count != null ? count : 0); j++)
+						buffer.append(' ');
+				} else if (node.getNodeName().equals("text:tab"))
+					buffer.append('\t');
+				else if (node.getNodeName().equals("text:line-break")) {
+					String lineseperator = System.getProperty("line.separator");
+					buffer.append(lineseperator);
+				} else if (node.getNodeName().equals("text:a"))
+					buffer.append(TextHyperlink.getInstanceof((TextAElement) node).getTextContent());
+			}
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * Set the text content of this paragraph.
+	 * <p>
+	 * All the existing text content of this paragraph would be removed, and
+	 * then new text content would be set.
+	 * <p>
+	 * The white space characters in the content would not be collapsed.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @see #setTextContent(String content)
+	 */
+	public void setTextContentNotCollapsed(String content) {
+		removeTextContent();
+		if (content != null && !content.equals(""))
+			appendTextElements(getOdfElement(), content, false);
+	}
+
+	/**
+	 * Append the text content at the end of this paragraph. The appended text
+	 * would follow the style of the last character.
+	 * <p>
+	 * The white space characters in the content would be collapsed by default.
+	 * For example, tab character would be replaced with <text:tab>, break line
+	 * character would be replaced with <text:line-break>.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @see #appendTextContentNotCollapsed(String content)
+	 */
+	public void appendTextContent(String content) {
+		appendTextContent(content, true);
+	}
+
+	/**
+	 * Append the text content at the end of this paragraph. The appended text
+	 * would follow the style of the last character if the second parameter is
+	 * set to true; Or else, the appended text would follow the default style of
+	 * this paragraph.
+	 * <p>
+	 * The white space characters in the content would be collapsed by default.
+	 * For example, tab character would be replaced with <text:tab>, break line
+	 * character would be replaced with <text:line-break>.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @param isStyleInherited
+	 *            - whether the style would be inherited by the appended text
+	 * @see #appendTextContentNotCollapsed(String content)
+	 */
+	public void appendTextContent(String content, boolean isStyleInherited) {
+		boolean canInherited = false;
+		Node lastNode = getOdfElement().getLastChild();
+		if (lastNode != null && lastNode.getNodeName() != null
+				&& (lastNode.getNodeName().equals("text:a") || lastNode.getNodeName().equals("text:span")))
+			canInherited = true;
+
+		if (isStyleInherited && canInherited) {
+			if (content != null && !content.equals(""))
+				appendTextElements((OdfElement) lastNode, content, true);
+		} else {
+			if (content != null && !content.equals(""))
+				appendTextElements(getOdfElement(), content, true);
+		}
+	}
+
+	/**
+	 * Append the text content at the end of this paragraph. The appended text
+	 * would follow the style of the last character.
+	 * <p>
+	 * The white space characters in the content would not be collapsed.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @see #appendTextContent(String content)
+	 */
+	public void appendTextContentNotCollapsed(String content) {
+		Node lastNode = getOdfElement().getLastChild();
+		boolean canInherited = false;
+		if (lastNode != null && lastNode.getNodeName() != null
+				&& (lastNode.getNodeName().equals("text:a") || lastNode.getNodeName().equals("text:span")))
+			canInherited = true;
+
+		if (canInherited) {
+			if (content != null && !content.equals(""))
+				appendTextElements((OdfElement) lastNode, content, false);
+		} else {
+			if (content != null && !content.equals(""))
+				appendTextElements(getOdfElement(), content, false);
+		}
+	}
+
+	/**
+	 * Set the style name of this paragraph
+	 * 
+	 * @param styleName
+	 *            - the style name
+	 */
+	public void setStyleName(String styleName) {
+		mStyleHandler.getStyleElementForWrite().setStyleNameAttribute(styleName);
+	}
+
+	/**
+	 * Get the style name of this paragraph
+	 * 
+	 * @return - the style name
+	 */
+	public String getStyleName() {
+		OdfStyleBase style = getStyleHandler().getStyleElementForRead();
+		if (style == null) {
+			return "";
+		}
+		if (style instanceof OdfStyle)
+			return ((OdfStyle) style).getStyleNameAttribute();
+		else
+			return "";
+	}
+
+	/**
+	 * Get the owner document of this paragraph.
+	 * 
+	 * @return the document who owns this paragraph.
+	 */
+	public Document getOwnerDocument() {
+		return mOwnerDocument;
+	}
+
+	/**
+	 * Remove this paragraph from its container.
+	 * 
+	 * @since 0.6.5
+	 */
+	public void remove(){
+		Component.unregisterComponent(getOdfElement());
+		getOdfElement().getParentNode().removeChild(getOdfElement());
+		mParagraphElement=null;
+		mHeadingElement=null;
+		mOwnerDocument=null;
+		mStyleHandler=null;
+		mTextboxContainerImpl=null;
+		mHyperlinkContainerImpl=null;
+	}
+	
+	/**
+	 * Get the style handler of this paragraph.
+	 * <p>
+	 * The style handler is an instance of ParagraphStyleHandler
+	 * 
+	 * @return an instance of ParagraphStyleHandler
+	 * @see ParagraphStyleHandler
+	 */
+	public ParagraphStyleHandler getStyleHandler() {
+		if (mStyleHandler != null)
+			return mStyleHandler;
+		else {
+			mStyleHandler = new ParagraphStyleHandler(this);
+			return mStyleHandler;
+		}
+	}
+
+	/**
+	 * Return the <code>TextParagraphElementBase</code> of this paragraph.
+	 * Headings and body text paragraphs are collectively referred to as
+	 * paragraph elements, so the <code>TextParagraphElementBase</code> can be
+	 * <code>TextHElement</code> element or <code>TextPElement</code> element.
+	 * 
+	 * @return the <code>TextParagraphElementBase</code> of this paragraph.
+	 */
+	@Override
+	public TextParagraphElementBase getOdfElement() {
+		if (isHeading()) {
+			return mHeadingElement;
+		} else {
+			return mParagraphElement;
+		}
+	}
+
+	/**
+	 * Creates a comment in the front of this paragraph.
+	 * 
+	 * @param content
+	 *            the content of this comment.
+	 * @param creator
+	 *            the creator of this comment, if <code>creator</code> is null,
+	 *            the value of <code>System.getProperty("user.name")</code> will
+	 *            be used.
+	 * @since 0.6.5
+	 */
+	public void addComment(String content, String creator) {
+		// create annotation element.
+		OdfFileDom dom = (OdfFileDom) getOdfElement().getOwnerDocument();
+		OfficeAnnotationElement annotationElement = (OfficeAnnotationElement) OdfXMLFactory.newOdfElement(dom, OdfName
+				.newName(OdfDocumentNamespace.OFFICE, "annotation"));
+		getOdfElement().insertBefore(annotationElement, getOdfElement().getFirstChild());
+		// set creator
+		DcCreatorElement dcCreatorElement = annotationElement.newDcCreatorElement();
+		if (creator == null) {
+			creator = System.getProperty("user.name");
+		}
+		dcCreatorElement.setTextContent(creator);
+		// set date
+		String dcDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date());
+		DcDateElement dcDateElement = annotationElement.newDcDateElement();
+		dcDateElement.setTextContent(dcDate);
+		TextPElement notePElement = annotationElement.newTextPElement();
+		TextSpanElement noteSpanElement = notePElement.newTextSpanElement();
+		// set comment style
+		OdfOfficeAutomaticStyles styles = null;
+		if (dom instanceof OdfContentDom) {
+			styles = ((OdfContentDom) dom).getAutomaticStyles();
+		} else if (dom instanceof OdfStylesDom) {
+			styles = ((OdfStylesDom) dom).getAutomaticStyles();
+		}
+		OdfStyle textStyle = styles.newStyle(OdfStyleFamily.Text);
+		StyleTextPropertiesElement styleTextPropertiesElement = textStyle.newStyleTextPropertiesElement(null);
+		styleTextPropertiesElement.setStyleFontNameAttribute("Tahoma");
+		styleTextPropertiesElement.setFoFontSizeAttribute("10pt");
+		styleTextPropertiesElement.setStyleFontNameAsianAttribute("Lucida Sans Unicode");
+		styleTextPropertiesElement.setStyleFontSizeAsianAttribute("12pt");
+		noteSpanElement.setStyleName(textStyle.getStyleNameAttribute());
+		// set comment content
+		noteSpanElement.setTextContent(content);
+	}
+
+	/**
+	 * Returns the paragraph type, heading or body text paragraph.
+	 * 
+	 * @return the paragraph type, if this paragraph is heading, returns
+	 *         <code>true</code>, otherwise return <code>false</code>.
+	 * 
+	 * @since 0.6.5
+	 */
+	public boolean isHeading() {
+		if (mHeadingElement != null) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Returns outline level of this paragraph.
+	 * 
+	 * @return outline level, if this paragraph is a body text paragraph, 0 will
+	 *         be returned.
+	 * 
+	 * @since 0.6.5
+	 */
+	public int getHeadingLevel() {
+		if (isHeading()) {
+			return mHeadingElement.getTextOutlineLevelAttribute();
+		}
+		return 0;
+	}
+
+	/**
+	 * Sets the paragraph type, heading or body text paragraph.
+	 * 
+	 * @param isHeading
+	 *            if <code>true</code>, this paragraph would be formatted as
+	 *            heading, otherwise as a body text paragraph.
+	 * @param level
+	 *            the heading outline level of this paragraph, if
+	 *            <code>isHeading</code> is <code>true</code>.
+	 * 
+	 * @since 0.6.5
+	 */
+	public void applyHeading(boolean isHeading, int level) {
+		if (isHeading) {
+			if (!isHeading()) {
+				// create new heading element, clone children nodes.
+				OdfFileDom ownerDocument = (OdfFileDom) getOdfElement().getOwnerDocument();
+				mHeadingElement = ownerDocument.newOdfElement(TextHElement.class);
+				Node firstChild = mParagraphElement.getFirstChild();
+				while (firstChild != null) {
+					// mHeadingElement.appendChild(firstChild.cloneNode(true));
+					// firstChild = firstChild.getNextSibling();
+					Node thisChild = firstChild;
+					firstChild = firstChild.getNextSibling();
+					mParagraphElement.removeChild(thisChild);
+					mHeadingElement.appendChild(thisChild);
+				}
+				// update style
+				mHeadingElement.setStyleName(mParagraphElement.getStyleName());
+				// unregister component
+				Component.unregisterComponent(mParagraphElement);
+				// replace paragraph with heading
+				OdfElement parentOdfElement = (OdfElement) mParagraphElement.getParentNode();
+				parentOdfElement.replaceChild(mHeadingElement, mParagraphElement);
+				mParagraphElement = null;
+				// re-register component.
+				Component.registerComponent(this, mHeadingElement);
+			}
+			// update outline level.
+			mHeadingElement.setTextOutlineLevelAttribute(level);
+		} else {
+			if (isHeading()) {
+				// need create new paragraph element and clone content.
+				OdfFileDom ownerDocument = (OdfFileDom) getOdfElement().getOwnerDocument();
+				mParagraphElement = ownerDocument.newOdfElement(TextPElement.class);
+				Node firstChild = mHeadingElement.getFirstChild();
+				while (firstChild != null) {
+					Node thisChild = firstChild;
+					firstChild = firstChild.getNextSibling();
+					mHeadingElement.removeChild(thisChild);
+					mParagraphElement.appendChild(thisChild);
+				}
+				// update style
+				mParagraphElement.setStyleName(mHeadingElement.getStyleName());
+				// unregister component
+				Component.unregisterComponent(mHeadingElement);
+				// replace heading with paragraph
+				OdfElement parentOdfElement = (OdfElement) mHeadingElement.getParentNode();
+				parentOdfElement.replaceChild(mParagraphElement, mHeadingElement);
+				mHeadingElement = null;
+				// re-register component.
+				Component.registerComponent(this, mParagraphElement);
+			}
+		}
+	}
+
+	/**
+	 * Formats the paragraph as heading. Its outline level is 1.
+	 * 
+	 * @since 0.6.5
+	 */
+	public void applyHeading() {
+		applyHeading(true, 1);
+	}
+
+	/**
+	 * Returns the font definition for this paragraph.
+	 * 
+	 * @return font if there is no style definition for this paragraph,
+	 *         <code>null</code> will be returned.
+	 * 
+	 * @since 0.6.5
+	 */
+	public Font getFont() {
+		return getStyleHandler().getFont(Document.ScriptType.WESTERN);
+	}
+
+	/**
+	 * Sets font style for this paragraph.
+	 * 
+	 * @param font
+	 *            the font definition of this paragraph
+	 * 
+	 * @since 0.6.5
+	 */
+	public void setFont(Font font) {
+		getStyleHandler().setFont(font);
+	}
+
+	/**
+	 * Return the horizontal alignment setting of this paragraph.
+	 * <p>
+	 * Null will returned if there is no explicit style definition for this
+	 * paragraph.
+	 * <p>
+	 * Default value will be returned if explicit style definition is found but
+	 * no horizontal alignment is set.
+	 * 
+	 * @return the horizontal alignment setting.
+	 * @since 0.6.5
+	 */
+	public HorizontalAlignmentType getHorizontalAlignment() {
+		return getStyleHandler().getHorizontalAlignment();
+	}
+
+	/**
+	 * Set the horizontal alignment setting of this paragraph. If the alignment
+	 * is set as Default, the explicit horizontal alignment setting is removed.
+	 * 
+	 * @param alignType
+	 *            the horizontal alignment setting.
+	 * @since 0.6.5
+	 */
+	public void setHorizontalAlignment(HorizontalAlignmentType alignType) {
+		getStyleHandler().setHorizontalAlignment(alignType);
+	}
+
+	public Textbox addTextbox() {
+		return getTextboxContainerImpl().addTextbox();
+	}
+
+	public Iterator<Textbox> getTextboxIterator() {
+		return getTextboxContainerImpl().getTextboxIterator();
+	}
+
+	public boolean removeTextbox(Textbox box) {
+		return getTextboxContainerImpl().removeTextbox(box);
+	}
+
+	public OdfElement getFrameContainerElement() {
+		return getTextboxContainerImpl().getFrameContainerElement();
+	}
+
+	public Textbox addTextbox(FrameRectangle position) {
+		return getTextboxContainerImpl().addTextbox(position);
+	}
+
+	public Textbox getTextboxByName(String name) {
+		return getTextboxContainerImpl().getTextboxByName(name);
+	}
+
+	public List<Textbox> getTextboxByUsage(PresentationDocument.PresentationClass usage) {
+		throw new UnsupportedOperationException("this method is not supported by paragraph.");
+	}
+
+	private class TextboxContainerImpl extends AbstractTextboxContainer {
+		public OdfElement getFrameContainerElement() {
+			return getOdfElement();
+		}
+	}
+
+	private TextboxContainerImpl getTextboxContainerImpl() {
+		if (mTextboxContainerImpl == null)
+			mTextboxContainerImpl = new TextboxContainerImpl();
+		return mTextboxContainerImpl;
+	}
+
+	static void appendTextElements(OdfElement ownerElement, String content, boolean isWhitespaceCollapsed) {
+		OdfFileDom ownerDocument = (OdfFileDom) ownerElement.getOwnerDocument();
+		if (isWhitespaceCollapsed) {
+			int i = 0, length = content.length();
+			String str = "";
+			while (i < length) {
+				char ch = content.charAt(i);
+				if (ch == ' ') {
+					int j = 1;
+					i++;
+					while ((i < length) && (content.charAt(i) == ' ')) {
+						j++;
+						i++;
+					}
+					if (j == 1) {
+						str += ' ';
+					} else {
+						str += ' ';
+						Text textnode = ownerDocument.createTextNode(str);
+						ownerElement.appendChild(textnode);
+						str = "";
+						TextSElement spaceElement = ownerDocument.newOdfElement(TextSElement.class);
+						ownerElement.appendChild(spaceElement);
+						spaceElement.setTextCAttribute(j - 1);
+					}
+				} else if (ch == '\n') {
+					if (str.length() > 0) {
+						Text textnode = ownerDocument.createTextNode(str);
+						ownerElement.appendChild(textnode);
+						str = "";
+					}
+					TextLineBreakElement lineBreakElement = ownerDocument.newOdfElement(TextLineBreakElement.class);
+					ownerElement.appendChild(lineBreakElement);
+					i++;
+				} else if (ch == '\t') {
+					if (str.length() > 0) {
+						Text textnode = ownerElement.getOwnerDocument().createTextNode(str);
+						ownerElement.appendChild(textnode);
+						str = "";
+					}
+					TextTabElement tabElement = ownerDocument.newOdfElement(TextTabElement.class);
+					ownerElement.appendChild(tabElement);
+					i++;
+				} else if (ch == '\r') {
+					i++;
+				} else {
+					str += ch;
+					i++;
+				}
+			}
+			if (str.length() > 0) {
+				Text textnode = ownerDocument.createTextNode(str);
+				ownerElement.appendChild(textnode);
+			}
+		} else {
+			Text textnode = ownerDocument.createTextNode(content);
+			ownerElement.appendChild(textnode);
+		}
+	}
+
+	/************ Hyperlink support ************/
+	public TextHyperlink applyHyperlink(URI linkto) {
+		return getTextHyperlinkContainerImpl().applyHyperlink(linkto);
+	}
+
+	public Iterator<TextHyperlink> getHyperlinkIterator() {
+		return getTextHyperlinkContainerImpl().getHyperlinkIterator();
+	}
+
+	public void removeHyperlinks() {
+		getTextHyperlinkContainerImpl().removeHyperlinks();
+	}
+
+	public TextHyperlink appendHyperlink(String text, URI linkto) {
+		return getTextHyperlinkContainerImpl().appendHyperlink(text, linkto);
+	}
+
+	private class TextHyperlinkContainerImpl extends AbstractTextHyperlinkContainer {
+		public TextHyperlinkContainerImpl(OdfElement parent) {
+			super(parent);
+		}
+	}
+
+	private TextHyperlinkContainerImpl getTextHyperlinkContainerImpl() {
+		if (mHyperlinkContainerImpl == null)
+			mHyperlinkContainerImpl = new TextHyperlinkContainerImpl(getOdfElement());
+		return mHyperlinkContainerImpl;
+	}
+	/************ End of Hyperlink support ************/
+
+//	@Override
+	public Control createDrawControl() {
+		return Control.newDrawControl(this);
+	}
+
+//	@Override
+	public OdfElement getDrawControlContainerElement() {
+		return this.getOdfElement();
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/ParagraphContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/ParagraphContainer.java
new file mode 100644
index 0000000..950e495
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/ParagraphContainer.java
@@ -0,0 +1,100 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+
+package org.odftoolkit.simple.text;
+
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+/**
+ * ParagraphContainer is a container which maintains paragraph(s) as element(s).
+ * Paragraph(s) can be added and removed in this container.
+ * 
+ * @see Paragraph
+ * @see org.odftoolkit.simple.TextDocument
+ * 
+ * @since 0.5
+ */
+
+public interface ParagraphContainer {
+	/**
+	 * Add paragraph at the end of the container with specified text content.
+	 * 
+	 * @param textContent
+	 *            - the text content
+	 * @return an instance of paragraph
+	 */
+	public Paragraph addParagraph(String textContent);
+
+	/**
+	 * Remove paragraph from the container
+	 * 
+	 * @param para
+	 *            - the instance of paragraph
+	 * @return true if the paragraph is removed successfully, false if errors
+	 *         happen.
+	 */
+	public boolean removeParagraph(Paragraph para);
+
+	/**
+	 * Get the ODF element which can have <text:p> as child element directly.
+	 * 
+	 * @return - an ODF element which can have paragraph as child
+	 */
+	public OdfElement getParagraphContainerElement();
+
+	/**
+	 * Return an Iterator of the paragraph in this container.
+	 * 
+	 * @return an Iterator of the paragraph in this container
+	 */
+	public Iterator<Paragraph> getParagraphIterator();
+
+	/**
+	 * Return a paragraph with a given index.
+	 * <p>
+	 * An index of zero represents the first paragraph.
+	 * <p>
+	 * If empty paragraph is skipped, the empty paragraph won't be counted.
+	 * 
+	 * @param index
+	 *            - the index started from 0.
+	 * @param isEmptyParagraphSkipped
+	 *            - whether the empty paragraph is skipped or not
+	 * @return the paragraph with a given index
+	 */
+	public Paragraph getParagraphByIndex(int index, boolean isEmptyParagraphSkipped);
+
+	/**
+	 * Return a paragraph with a given index. The index is in reverse order.
+	 * <p>
+	 * An index of zero represents the last paragraph.
+	 * <p>
+	 * If empty paragraph is skipped, the empty paragraph won't be counted.
+	 * 
+	 * @param reverseIndex
+	 *            - the index started from 0 in reverse order.
+	 * @param isEmptyParagraphSkipped
+	 *            - whether the empty paragraph is skipped or not
+	 * @return the paragraph with a given index
+	 */
+	public Paragraph getParagraphByReverseIndex(int reverseIndex, boolean isEmptyParagraphSkipped);
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/ParagraphStyleHandler.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/ParagraphStyleHandler.java
new file mode 100644
index 0000000..1a4b504
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/ParagraphStyleHandler.java
@@ -0,0 +1,411 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.Locale;
+
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.Document.ScriptType;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.ParagraphProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.TextProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.TextLinePosition;
+
+/**
+ * This class provides functions to handle the style of a paragraph.
+ * 
+ * <p>
+ * This class provides functions to handle the font settings, text alignment
+ * settings and so on.
+ * 
+ * @since 0.6.5
+ */
+public class ParagraphStyleHandler extends DefaultStyleHandler {
+
+	Paragraph mParagraph;
+	TextParagraphElementBase mParaElement;
+
+	TextProperties mTextProperties;
+	TextProperties mWritableTextProperties;
+
+	ParagraphProperties mParagraphProperties;
+	ParagraphProperties mWritableParagraphProperties;
+
+	ParagraphStyleHandler(Paragraph aParagraph) {
+		super(aParagraph.getOdfElement());
+		mParagraph = aParagraph;
+		mParaElement = aParagraph.getOdfElement();
+	}
+
+	/**
+	 * Return the country information for a specific script type
+	 * <p>
+	 * The country information in its parent style and default style will be
+	 * taken into considered.
+	 * <p>
+	 * Null will be returned if there is no country information for this script
+	 * type.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the country information for a specific script type
+	 */
+	public String getCountry(ScriptType type) {
+		String country = null;
+		TextProperties textProperties = getTextPropertiesForRead();
+		if (textProperties != null) {
+			country = textProperties.getCountry(type);
+		}
+		if (country != null && country.length() > 0) {
+			return country;
+		}
+
+		boolean isDefault = isUseDefaultStyle;
+		OdfStyleBase parentStyle = null;
+		if (!isDefault) {
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		}
+		while ((!isDefault) && (parentStyle != null)) {
+			TextProperties parentStyleSetting = TextProperties.getTextProperties(parentStyle);
+			country = parentStyleSetting.getCountry(type);
+			if (country != null && country.length() > 0) {
+				return country;
+			}
+			if (parentStyle instanceof OdfDefaultStyle) {
+				isDefault = true;
+			} else {
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+			}
+		}
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getParagraphDefaultStyle();
+			TextProperties defaultStyleSetting = TextProperties.getTextProperties(defaultStyle);
+			country = defaultStyleSetting.getCountry(type);
+		}
+		return country;
+	}
+
+	/**
+	 * Return the font definition for a specific script type.
+	 * <p>
+	 * The font definition in its parent style and default style will be taken
+	 * into considered.
+	 * <p>
+	 * A default font definition will be returned if there is no font definition
+	 * for this script type at all.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the font definition for a specific script type
+	 */
+	public Font getFont(ScriptType type) {
+		// A font includes font family name, font style, font color, font size
+		Font font = null;
+		TextProperties textProperties = getTextPropertiesForRead();
+		if (textProperties != null) {
+			font = textProperties.getFont(type);
+		} else {
+			font = new Font(null, null, 0, (StyleTypeDefinitions.TextLinePosition) null);
+		}
+
+		if (font != null && font.getFamilyName() != null && font.getColor() != null && font.getSize() != 0
+				&& font.getFontStyle() != null && font.getTextLinePosition() != null) {
+			return font;
+		}
+
+		boolean isDefault = isUseDefaultStyle;
+		OdfStyleBase parentStyle = null;
+		if (!isDefault) {
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		}
+		while ((!isDefault) && (parentStyle != null)) {
+			TextProperties parentStyleSetting = TextProperties.getTextProperties(parentStyle);
+			Font tempFont = parentStyleSetting.getFont(type);
+			mergeFont(font, tempFont);
+			if (font.getFamilyName() != null && font.getColor() != null && font.getSize() > 0
+					&& font.getFontStyle() != null && font.getTextLinePosition() != null) {
+				return font;
+			}
+			// continue to get parent properties
+			if (parentStyle instanceof OdfDefaultStyle) {
+				isDefault = true;
+			} else {
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+			}
+		}
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getParagraphDefaultStyle();
+			if (defaultStyle == null) {
+				defaultStyle = getParagraphDefaultStyle();
+			}
+			if (defaultStyle != null) {
+				TextProperties defaultStyleSetting = TextProperties.getTextProperties(defaultStyle);
+				Font tempFont = defaultStyleSetting.getFont(type);
+				mergeFont(font, tempFont);
+			}
+		}
+		if (font.getColor() == null) {
+			font.setColor(Color.BLACK);
+		}
+		if (font.getFontStyle() == null) {
+			font.setFontStyle(FontStyle.REGULAR);
+		}
+		if (font.getTextLinePosition() == null) {
+			font.setTextLinePosition(TextLinePosition.REGULAR);
+		}
+		return font;
+	}
+
+	/**
+	 * Return the language information for a specific script type
+	 * <p>
+	 * The language definition in its parent style and default style will be
+	 * taken into considered.
+	 * <p>
+	 * Null will be returned if there is no language information for this script
+	 * type at all.
+	 * 
+	 * @param type
+	 *            - script type
+	 * @return the language information for a specific script type
+	 */
+	public String getLanguage(ScriptType type) {
+		String language = null;
+		TextProperties textProperties = getTextPropertiesForRead();
+		if (textProperties != null) {
+			language = textProperties.getLanguage(type);
+		}
+		if (language != null && language.length() > 0) {
+			return language;
+		}
+		boolean isDefault = isUseDefaultStyle;
+		OdfStyleBase parentStyle = null;
+		if (!isDefault) {
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		}
+		while ((!isDefault) && (parentStyle != null)) {
+			TextProperties parentStyleSetting = TextProperties.getTextProperties(parentStyle);
+			language = parentStyleSetting.getLanguage(type);
+			if (language != null && language.length() > 0) {
+				return language;
+			}
+			if (parentStyle instanceof OdfDefaultStyle) {
+				isDefault = true;
+			} else {
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+			}
+		}
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getParagraphDefaultStyle();
+			TextProperties defaultStyleSetting = TextProperties.getTextProperties(defaultStyle);
+			language = defaultStyleSetting.getLanguage(type);
+		}
+		return language;
+	}
+
+	/**
+	 * Set the country information for a specific script type
+	 * <p>
+	 * The consistency between country and script type is not verified.
+	 * <p>
+	 * If the parameter <code>country</code> is null, the country information
+	 * for this script type will be removed.
+	 * 
+	 * @param country
+	 *            - the country information
+	 * @param type
+	 *            - script type
+	 * @see TextProperties#setCountry(String, Document.ScriptType)
+	 * @see org.odftoolkit.simple.Document.ScriptType
+	 */
+	public void setCountry(String country, ScriptType type) {
+		getTextPropertiesForWrite().setCountry(country, type);
+	}
+
+	/**
+	 * Set the font definition. The locale information in font definition will
+	 * be used to justify the script type.
+	 * <p>
+	 * If the parameter <code>font</code> is null, nothing will be happened.
+	 * 
+	 * @param font
+	 *            font definition
+	 */
+	public void setFont(Font font) {
+		getTextPropertiesForWrite().setFont(font);
+	}
+
+	/**
+	 * Set the font definition. The locale information in font definition will
+	 * be used to justify the script type.
+	 * <p>
+	 * If the parameter <code>font</code> is null, nothing will be happened.
+	 * 
+	 * @param font
+	 *            font definition
+	 */
+	public void setFont(Font font, Locale language) {
+		getTextPropertiesForWrite().setFont(font, language);
+	}
+
+	/**
+	 * Set the language information for a specific script type
+	 * <p>
+	 * If the parameter <code>language</code> is null, the language information
+	 * for this script type will be removed.
+	 * 
+	 * @param language
+	 *            - the language information
+	 * @param type
+	 *            - script type
+	 */
+	public void setLanguage(String language, ScriptType type) {
+		getTextPropertiesForWrite().setLanguage(language, type);
+	}
+
+	/**
+	 * Set the horizontal alignment.
+	 * <p>
+	 * If the parameter <code>alignType</code> is null, the horizontal alignment
+	 * setting will be removed.
+	 * 
+	 * @param alignType
+	 *            the horizontal alignment
+	 */
+	public void setHorizontalAlignment(HorizontalAlignmentType alignType) {
+		getParagraphPropertiesForWrite().setHorizontalAlignment(alignType);
+	}
+
+	/**
+	 * Return the horizontal alignment.
+	 * <p>
+	 * The horizontal alignment in its parent style and default style will be
+	 * taken into considered.
+	 * <p>
+	 * HorizontalAlignmentType.DEFAULT will be returned if there is no
+	 * horizontal alignment setting.
+	 * 
+	 * @return the horizontal alignment; null if there is no horizontal
+	 *         alignment setting.
+	 */
+	public HorizontalAlignmentType getHorizontalAlignment() {
+		HorizontalAlignmentType tempAlign = null;
+		ParagraphProperties properties = getParagraphPropertiesForRead();
+		if (properties != null) {
+			tempAlign = properties.getHorizontalAlignment();
+		}
+		if (tempAlign != null) {
+			return tempAlign;
+		}
+		boolean isDefault = isUseDefaultStyle;
+		// find in parent style definition
+		OdfStyleBase parentStyle = null;
+		if (!isDefault) {
+			parentStyle = getParentStyle((OdfStyle) getCurrentUsedStyle());
+		}
+		while ((!isDefault) && (parentStyle != null)) {
+			ParagraphProperties parentStyleSetting = ParagraphProperties.getParagraphProperties(parentStyle);
+			tempAlign = parentStyleSetting.getHorizontalAlignment();
+			if (tempAlign != null) {
+				return tempAlign;
+			}
+			if (parentStyle instanceof OdfDefaultStyle) {
+				isDefault = true;
+			} else {
+				parentStyle = getParentStyle((OdfStyle) parentStyle);
+			}
+		}
+		// find in default style definition
+		if (!isDefault) {
+			OdfDefaultStyle defaultStyle = getParagraphDefaultStyle();
+			ParagraphProperties defaultStyleSetting = ParagraphProperties.getParagraphProperties(defaultStyle);
+			tempAlign = defaultStyleSetting.getHorizontalAlignment();
+		}
+		// use default
+		if (tempAlign == null) {
+			return HorizontalAlignmentType.DEFAULT;
+		}
+		return tempAlign;
+	}
+
+	private OdfDefaultStyle getParagraphDefaultStyle() {
+		return mDocument.getDocumentStyles().getDefaultStyle(OdfStyleFamily.Paragraph);
+	}
+
+	private OdfStyleBase getParentStyle(OdfStyle aStyle) {
+		String parentName = aStyle.getStyleParentStyleNameAttribute();
+		if (parentName == null || parentName.length() == 0) {
+			return null;
+		}
+		if (parentName.equals("Default")) {
+			return getParagraphDefaultStyle();
+		} else {
+			return getStyleByName(parentName);
+		}
+	}
+
+	private OdfStyle getStyleByName(String name) {
+		OdfStyle styleElement = null;
+		OdfOfficeAutomaticStyles styles = mParaElement.getAutomaticStyles();
+		styleElement = styles.getStyle(name, OdfStyleFamily.Paragraph);
+		if (styleElement == null) {
+			styleElement = mDocument.getDocumentStyles().getStyle(name, OdfStyleFamily.Paragraph);
+		}
+		return styleElement;
+	}
+
+	private OdfStyleBase getCurrentUsedStyle() {
+		if (mWritableStyleElement != null) {
+			return mWritableStyleElement;
+		} else {
+			return mStyleElement;
+		}
+	}
+
+	private void mergeFont(Font target, Font source) {
+		// merge font
+		if (target.getFamilyName() == null && source.getFamilyName() != null) {
+			target.setFamilyName(source.getFamilyName());
+		}
+		if (target.getColor() == null && source.getColor() != null) {
+			target.setColor(source.getColor());
+		}
+		if (target.getSize() == 0 && source.getSize() > 0) {
+			target.setSize(source.getSize());
+		}
+		if (target.getFontStyle() == null && source.getFontStyle() != null) {
+			target.setFontStyle(source.getFontStyle());
+		}
+		if (target.getTextLinePosition() == null && source.getTextLinePosition() != null) {
+			target.setTextLinePosition(source.getTextLinePosition());
+		}
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/ProtectionKeyDigestProvider.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/ProtectionKeyDigestProvider.java
new file mode 100644
index 0000000..94c6673
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/ProtectionKeyDigestProvider.java
@@ -0,0 +1,35 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+public interface ProtectionKeyDigestProvider {
+
+	/**
+	 * Generate a digest value of the input key
+	 * 
+	 * @param key
+	 *            -an key required to be digest
+	 * @return the digest result
+	 */
+	public String generateHashKey(String key);
+
+	public String getProtectionKeyDigestAlgorithm();
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/Section.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Section.java
new file mode 100644
index 0000000..0e553b4
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Section.java
@@ -0,0 +1,454 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.text.TextSectionElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.table.AbstractTableContainer;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.odftoolkit.simple.text.list.AbstractListContainer;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+
+import sun.misc.BASE64Encoder;
+
+/**
+ * This class represents section definition in text document. It provides
+ * methods to manipulate section in text document, such as getting/setting
+ * section name, moving section and so on.
+ * 
+ * @since 0.4
+ */
+public class Section extends Component implements ParagraphContainer,
+		TableContainer, ListContainer {
+
+	private ParagraphContainerImpl paragraphContainerImpl;
+	private TableContainerImpl tableContainerImpl;
+	private ListContainerImpl listContainerImpl;
+
+	private TextSectionElement mSectionElement;
+	private Document mDocument;
+	private ProtectionKeyDigestProvider protectionKeyDigestProvider;
+
+	private Section(Document doc, TextSectionElement element) {
+		mSectionElement = element;
+		mDocument = doc;
+	}
+
+	/**
+	 * Get a section instance by an object of <code>TextSectionElement</code>.
+	 * 
+	 * @param element
+	 *            - an object of <code>TextSectionElement</code>
+	 * @return an instance of <code>Section</code> that can represent
+	 *         <code>TextSectionElement</code>
+	 */
+	public static Section getInstance(TextSectionElement element) {
+		return new Section((Document) ((OdfFileDom) (element.getOwnerDocument())).getDocument(), element);
+	}
+
+	/**
+	 * Return the ODF document which this section belongs to.
+	 * 
+	 * @return - the ODF document which this section belongs to.
+	 */
+	public Document getOwnerDocument() {
+		return mDocument;
+	}
+
+	/**
+	 * Return the name of this section
+	 * 
+	 * @return - the name of this section
+	 */
+	public String getName() {
+		return mSectionElement.getTextNameAttribute();
+	}
+
+	/**
+	 * Set the value of this section name
+	 * 
+	 * @param name
+	 *            - the value of name to be set
+	 */
+	public void setName(String name) {
+		mSectionElement.setTextNameAttribute(name);
+	}
+
+	/**
+	 * Remove this section from the document.
+	 * <p>
+	 * All the linked resources which are only linked to this section will be
+	 * removed too.
+	 * 
+	 */
+	public void remove() {
+		mDocument.removeElementLinkedResource(mSectionElement);
+		mSectionElement.getParentNode().removeChild(mSectionElement);
+		paragraphContainerImpl = null;
+		mSectionElement = null;
+		mDocument = null;
+	}
+
+	/**
+	 * Return an instance of <code>TextSectionElement</code> which represents
+	 * this section.
+	 * 
+	 * @return - an instance of <code>TextSectionElement</code> which represents
+	 *         this section
+	 */
+	public TextSectionElement getOdfElement() {
+		return mSectionElement;
+	}
+
+	/**
+	 * Return whether this section is contained in footer or header.
+	 * 
+	 * @return - true if this section is contained in footer or header. false if
+	 *         this section is not contained in footer or header.
+	 */
+	boolean isInHeaderFooter() {
+		try {
+			if (mSectionElement.getOwnerDocument() == mDocument.getStylesDom())
+				return true;
+		} catch (Exception e) {
+			Logger.getLogger(Section.class.getName()).log(Level.SEVERE, "Failed in isInHeaderFooter", e);
+		}
+		return false;
+	}
+
+	/**
+	 * Set the value to specify whether the section is protected.
+	 * <p>
+	 * If this value is set to false, the existing password will be removed at
+	 * the same.
+	 * 
+	 * @param isProtected
+	 *            - "true" represents the section cannot be edited through a
+	 *            user interface. "false" represents the section is allowed to
+	 *            be edited.
+	 */
+	public void setProtected(boolean isProtected) {
+		mSectionElement.setTextProtectedAttribute(isProtected);
+		if (!isProtected && getProtectedPassword() != null)
+			setProtectedWithPassword(null);
+	}
+
+	/**
+	 * Return the value of section which specifies whether the section is
+	 * protected.
+	 * 
+	 * @return whether the section is protected.
+	 */
+	public boolean isProtected() {
+		return mSectionElement.getTextProtectedAttribute();
+	}
+
+	/**
+	 * Set the password which specifies that an authorization is required for
+	 * removing the protection of this section.
+	 * <p>
+	 * If key is empty or null, the attribute of
+	 * <code>text:protection-key</code> and
+	 * <code>text:protection-key-digest-algorithm</code> will be removed.
+	 * <p>
+	 * The authentication procedure can be customized by
+	 * {@link Section#setProtectionKeyDigestProvider(ProtectionKeyDigestProvider)}
+	 * . The default digest algorighom of the protection key is SHA-1:
+	 * {@link http://www.w3.org/2000/09/xmldsig#sha1.}
+	 * 
+	 * @param key
+	 *            -the value of the password.
+	 * 
+	 */
+	public void setProtectedWithPassword(String key) {
+		if (key != null && key.length() > 0) {
+			mSectionElement.setTextProtectionKeyAttribute(generateHashKey(key));
+			mSectionElement
+					.setTextProtectionKeyDigestAlgorithmAttribute(getDigestAlgorithm());
+			setProtected(true);
+		} else {
+			mSectionElement.removeAttributeNS(OdfDocumentNamespace.TEXT
+					.getUri(), "protection-key");
+			mSectionElement.removeAttributeNS(OdfDocumentNamespace.TEXT
+					.getUri(), "protection-key-digest-algorithm");
+		}
+	}
+
+	/**
+	 * Get the protection key of this section.
+	 * 
+	 * @return the protection key of this section
+	 */
+	public String getProtectedPassword() {
+		return mSectionElement.getTextProtectionKeyAttribute();
+	}
+
+	/**
+	 * Get the protection key digest algorithm.
+	 * <p>
+	 * The default value is http://www.w3.org/2000/09/xmldsig#sha1, if no value
+	 * specified.
+	 * 
+	 * @return an IRI that identifies an authentication procedure for removing a
+	 *         protection.
+	 */
+	public String getProtectionKeyDigestAlgorithm() {
+		return mSectionElement.getTextProtectionKeyDigestAlgorithmAttribute();
+	}
+
+	private static class SHA1KeyDigest implements ProtectionKeyDigestProvider {
+
+		private static final String KEY_DIGEST_ALGORITHM = "http://www.w3.org/2000/09/xmldsig#sha1";
+		private static SHA1KeyDigest provider;
+
+		static SHA1KeyDigest getInstance() {
+			if (provider == null)
+				provider = new SHA1KeyDigest();
+			return provider;
+		}
+
+//		@Override
+		public String generateHashKey(String passwd) {
+			String hashKey = null;
+			if (passwd != null && passwd.length() > 0) {
+				MessageDigest md;
+				try {
+					byte[] pwd = new byte[passwd.length() * 2];
+					for (int i = 0; i < passwd.length(); i++) {
+						pwd[2 * i] = (byte) (passwd.charAt(i) & 0xFF);
+						pwd[2 * i + 1] = (byte) (passwd.charAt(i) >> 8);
+					}
+					md = MessageDigest.getInstance("SHA-1");
+					byte[] byteCode = md.digest(pwd);
+					BASE64Encoder encoder = new BASE64Encoder();
+					hashKey = encoder.encode(byteCode);
+				} catch (NoSuchAlgorithmException e) {
+					Logger.getLogger(Section.class.getName(),
+							"Fail to initiate the digest method.");
+				}
+			}
+			return hashKey;
+		}
+
+//		@Override
+		public String getProtectionKeyDigestAlgorithm() {
+			return KEY_DIGEST_ALGORITHM;
+		}
+
+	}
+
+	/**
+	 * Set the provider which provides corresponding protection key digest
+	 * algorithm.
+	 * 
+	 * @param provider
+	 *            - an instance of a protection key digest algorithm provider
+	 */
+	public void setProtectionKeyDigestProvider(
+			ProtectionKeyDigestProvider provider) {
+		protectionKeyDigestProvider = provider;
+	}
+
+	/**
+	 * Get current used provider which provides corresponding protection key
+	 * digest algorithm.
+	 * 
+	 * @return the current used provider.
+	 */
+	public ProtectionKeyDigestProvider getProtectionKeyDigestProvier() {
+		if (protectionKeyDigestProvider == null) {
+			protectionKeyDigestProvider = getDefaultProtectionKeyDigestProvider();
+		}
+		return protectionKeyDigestProvider;
+	}
+
+	/**
+	 * Get the default provider which use SHA-1 standard as the protection key
+	 * digest algorithm.
+	 * 
+	 * @return the default protection key digest algorithm.
+	 */
+	public ProtectionKeyDigestProvider getDefaultProtectionKeyDigestProvider() {
+		return SHA1KeyDigest.getInstance();
+	}
+
+	private String generateHashKey(String passwd) {
+		return getProtectionKeyDigestProvier().generateHashKey(passwd);
+	}
+
+	private String getDigestAlgorithm() {
+		return getProtectionKeyDigestProvier()
+				.getProtectionKeyDigestAlgorithm();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (!(obj instanceof Section))
+			return false;
+		Section aSection = (Section) obj;
+		if (aSection == this)
+			return true;
+		return aSection.getOdfElement().equals(mSectionElement);
+	}
+
+	//****************Paragraph support******************//
+	
+	public Paragraph addParagraph(String textContent) {
+		return getParagraphContainerImpl().addParagraph(textContent);
+	}
+
+	public OdfElement getParagraphContainerElement() {
+		return getParagraphContainerImpl().getParagraphContainerElement();
+	}
+
+	public boolean removeParagraph(Paragraph para) {
+		return getParagraphContainerImpl().removeParagraph(para);
+	}
+
+	private class ParagraphContainerImpl extends AbstractParagraphContainer {
+		public OdfElement getParagraphContainerElement()
+		{
+			return mSectionElement;
+		}
+	}
+	private ParagraphContainerImpl getParagraphContainerImpl() {
+		if (paragraphContainerImpl == null)
+			paragraphContainerImpl = new ParagraphContainerImpl();
+		return paragraphContainerImpl;
+	}
+
+	public Paragraph getParagraphByIndex(int index, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByIndex(index, isEmptyParagraphSkipped);
+	}
+
+	public Paragraph getParagraphByReverseIndex(int reverseIndex, boolean isEmptyParagraphSkipped) {
+		return getParagraphContainerImpl().getParagraphByReverseIndex(reverseIndex, isEmptyParagraphSkipped);
+	}
+
+	public Iterator<Paragraph> getParagraphIterator() {
+		return getParagraphContainerImpl().getParagraphIterator();
+	}
+
+	// ****************Table support******************//
+	protected TableContainer getTableContainerImpl() {
+		if (tableContainerImpl == null) {
+			tableContainerImpl = new TableContainerImpl();
+		}
+		return tableContainerImpl;
+	}
+
+	private class TableContainerImpl extends AbstractTableContainer {
+
+		public OdfElement getTableContainerElement() {
+			return mSectionElement;
+		}
+	}
+
+//	@Override
+	public Table addTable() {
+		return getTableContainerImpl().addTable();
+	}
+
+//	@Override
+	public Table addTable(int numRows, int numCols) {
+		return getTableContainerImpl().addTable(numRows, numCols);
+	}
+
+//	@Override
+	public TableBuilder getTableBuilder() {
+		return getTableContainerImpl().getTableBuilder();
+	}
+
+//	@Override
+	public Table getTableByName(String name) {
+		return getTableContainerImpl().getTableByName(name);
+	}
+
+//	@Override
+	public OdfElement getTableContainerElement() {
+		return getTableContainerImpl().getTableContainerElement();
+	}
+
+//	@Override
+	public List<Table> getTableList() {
+		return getTableContainerImpl().getTableList();
+	}
+
+	// ****************List support******************//
+
+	private ListContainerImpl getListContainerImpl() {
+		if (listContainerImpl == null) {
+			listContainerImpl = new ListContainerImpl();
+		}
+		return listContainerImpl;
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+
+		public OdfElement getListContainerElement() {
+			return mSectionElement;
+		}
+	}
+
+//	@Override
+	public org.odftoolkit.simple.text.list.List addList() {
+		return getListContainerImpl().addList();
+	}
+
+//	@Override
+	public org.odftoolkit.simple.text.list.List addList(ListDecorator decorator) {
+		return getListContainerImpl().addList(decorator);
+	}
+
+//	@Override
+	public void clearList() {
+		getListContainerImpl().clearList();
+	}
+
+//	@Override
+	public OdfElement getListContainerElement() {
+		return getListContainerImpl().getListContainerElement();
+	}
+
+//	@Override
+	public Iterator<org.odftoolkit.simple.text.list.List> getListIterator() {
+		return getListContainerImpl().getListIterator();
+	}
+
+//	@Override
+	public boolean removeList(org.odftoolkit.simple.text.list.List list) {
+		return getListContainerImpl().removeList(list);
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/Span.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Span.java
new file mode 100644
index 0000000..7585391
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/Span.java
@@ -0,0 +1,259 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.net.URI;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Component;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.common.navigation.InvalidNavigationException;
+import org.odftoolkit.simple.common.navigation.TextSelection;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class represents the application of a style to the character data of a
+ * portion of text.
+ * <p>
+ * It provides convenient methods to create a span and manipulate attributes of
+ * a span.
+ * 
+ * @since 0.5.5
+ */
+public class Span extends Component implements TextHyperlinkContainer {
+
+	private TextSpanElement mSpanElement;
+	private Document mOwnerDocument;
+	private DefaultStyleHandler mStyleHandler;
+	private TextHyperlinkContainerImpl mHyperlinkContainerImpl;
+
+	private Span(TextSpanElement element) {
+		mSpanElement = element;
+		mOwnerDocument = (Document) ((OdfFileDom) element.getOwnerDocument()).getDocument();
+		mStyleHandler = new DefaultStyleHandler(element);
+	}
+
+	/**
+	 * Get a span instance by an instance of <code>TextSpanElement</code>.
+	 * 
+	 * @param sElement
+	 *            - the instance of TextSpanElement
+	 * @return an instance of span
+	 */
+	public static Span getInstanceof(TextSpanElement sElement) {
+		if (sElement == null)
+			return null;
+
+		Span span = null;
+		span = (Span) Component.getComponentByElement(sElement);
+		if (span != null)
+			return span;
+
+		span = new Span(sElement);
+		Component.registerComponent(span, sElement);
+		return span;
+	}
+
+	/**
+	 * Create a span instance with a text selection
+	 * 
+	 * @param textSelection
+	 *            the TextSelection which the span is applied to.
+	 * @return an instance of span
+	 * @see org.odftoolkit.simple.common.navigation.TextSelection
+	 */
+	public static Span newSpan(TextSelection textSelection) {
+		try {
+			TextSpanElement element = textSelection.createSpanElement();
+			return Span.getInstanceof(element);
+		} catch (InvalidNavigationException e) {
+			Logger.getLogger(Span.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the style handler of this span.
+	 * <p>
+	 * The style handler is an instance of DefaultStyleHandler
+	 * 
+	 * @return an instance of DefaultStyleHandler
+	 * @see org.odftoolkit.simple.style.DefaultStyleHandler
+	 */
+	public DefaultStyleHandler getStyleHandler() {
+		if (mStyleHandler != null)
+			return mStyleHandler;
+		else {
+			mStyleHandler = new DefaultStyleHandler(mSpanElement);
+			return mStyleHandler;
+		}
+	}
+
+	/**
+	 * Get the owner document of this span
+	 * 
+	 * @return the document who owns this span
+	 */
+	public Document getOwnerDocument() {
+		return mOwnerDocument;
+	}
+
+	/**
+	 * Return the instance of "text:span" element
+	 * 
+	 * @return the instance of "text:span" element
+	 */
+	@Override
+	public TextSpanElement getOdfElement() {
+		return mSpanElement;
+	}
+
+	/**
+	 * Remove the text content of this span.
+	 * 
+	 */
+	public void removeTextContent() {
+		Paragraph.removeTextContentImpl(getOdfElement());
+		// remove empty hyperlink
+		NodeList nodeList = getOdfElement().getChildNodes();
+		for (int i = 0; i < nodeList.getLength(); i++) {
+			Node node;
+			node = nodeList.item(i);
+			if (node.getNodeType() == Node.ELEMENT_NODE) {
+				String nodename = node.getNodeName();
+				if (nodename.equals("text:a") && node.hasChildNodes() == false)
+					getOdfElement().removeChild(node);
+			}
+		}
+	}
+
+	/**
+	 * Set the text content of this span.
+	 * <p>
+	 * All the existing text content of this paragraph would be removed, and
+	 * then new text content would be set.
+	 * 
+	 * @param content
+	 *            - the text content
+	 */
+	public void setTextContent(String content) {
+		Paragraph.removeTextContentImpl(getOdfElement());
+		Node lastNode = getOdfElement().getLastChild();
+		if (content != null && !content.equals("")){
+			if (lastNode != null && lastNode.getNodeName() != null && lastNode.getNodeName().equals("text:a")) {
+				Paragraph.appendTextElements((TextAElement) lastNode, content, true);
+			} else {
+				Paragraph.appendTextElements(getOdfElement(), content, true);
+			}
+		}
+		// remove empty hyperlink
+		Paragraph.removeEmptyHyperlink(getOdfElement());
+	}
+
+	/**
+	 * Return the text content of this span.
+	 * <p>
+	 * The other child elements except text content will not be returned.
+	 * 
+	 * @return - the text content of this span
+	 */
+	public String getTextContent() {
+		return Paragraph.getTextContent(getOdfElement());
+	}
+
+	/**
+	 * Append the text content at the end of this span.
+	 * <p>
+	 * The appended text would follow the style of the last character.
+	 * 
+	 * @param content
+	 *            - the text content
+	 */
+	public void appendTextContent(String content) {
+		appendTextContent(content, true);
+	}
+
+	/**
+	 * Append the text content at the end of this span.
+	 * <p>
+	 * The appended text would follow the style of the last character if the
+	 * second parameter is set to true; Or else, the appended text would follow
+	 * the default style of this paragraph.
+	 * 
+	 * @param content
+	 *            - the text content
+	 * @param isStyleInherited
+	 *            - whether the hyperlink style would be inherited by the
+	 *            appended text
+	 */
+	public void appendTextContent(String content, boolean isStyleInherited) {
+		boolean canInherited = false;
+		Node lastNode = getOdfElement().getLastChild();
+		if (lastNode != null && lastNode.getNodeName() != null && lastNode.getNodeName().equals("text:a"))
+			canInherited = true;
+
+		if (isStyleInherited && canInherited) {
+			if (content != null && !content.equals(""))
+				Paragraph.appendTextElements((OdfElement) lastNode, content, true);
+		} else {
+			if (content != null && !content.equals(""))
+				Paragraph.appendTextElements(getOdfElement(), content, true);
+		}
+	}
+
+	/************ Hyperlink support ************/
+	public TextHyperlink applyHyperlink(URI linkto) {
+		return getTextHyperlinkContainerImpl().applyHyperlink(linkto);
+	}
+
+	public Iterator<TextHyperlink> getHyperlinkIterator() {
+		return getTextHyperlinkContainerImpl().getHyperlinkIterator();
+	}
+
+	public void removeHyperlinks() {
+		getTextHyperlinkContainerImpl().removeHyperlinks();
+	}
+	
+	public TextHyperlink appendHyperlink(String text, URI linkto) {
+		return getTextHyperlinkContainerImpl().appendHyperlink(text, linkto);
+	}
+
+	private class TextHyperlinkContainerImpl extends AbstractTextHyperlinkContainer {
+		public TextHyperlinkContainerImpl(OdfElement parent) {
+			super(parent);
+		}
+	}
+
+	private TextHyperlinkContainerImpl getTextHyperlinkContainerImpl() {
+		if (mHyperlinkContainerImpl == null)
+			mHyperlinkContainerImpl = new TextHyperlinkContainerImpl(getOdfElement());
+		return mHyperlinkContainerImpl;
+	}
+	/************ End of Hyperlink support ************/
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/TextHyperlink.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/TextHyperlink.java
new file mode 100644
index 0000000..11ef7d5
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/TextHyperlink.java
@@ -0,0 +1,243 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.InvalidParameterException;
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.Component;
+import org.w3c.dom.Node;
+
+/**
+ * This class represents a text hyperlink in ODF document. It provides
+ * convenient methods to get/set/remove the URI of hyperlinks.
+ * 
+ * @since 0.6.5
+ */
+public class TextHyperlink extends Component {
+
+	TextAElement hyperLinkElement;
+
+	private TextHyperlink(TextAElement aElement) {
+		hyperLinkElement = aElement;
+	}
+
+	/**
+	 * Gets a TextHyperlink instance by an instance of <code>TextAElement</code>
+	 * .
+	 * 
+	 * @param aElement
+	 *            the instance of TextAElement.
+	 * @return an instance of Hyperlink.
+	 */
+	public static TextHyperlink getInstanceof(TextAElement aElement) {
+		if (aElement == null)
+			return null;
+
+		TextHyperlink link = null;
+		link = (TextHyperlink) Component.getComponentByElement(aElement);
+		if (link != null)
+			return link;
+
+		link = new TextHyperlink(aElement);
+		Component.registerComponent(link, aElement);
+		return link;
+	}
+
+	@Override
+	public OdfElement getOdfElement() {
+		// TODO Auto-generated method stub
+		return hyperLinkElement;
+	}
+
+	/**
+	 * Return the URI of this hyperlink
+	 * 
+	 * @return the URI of this hyperlink
+	 * @throws URISyntaxException
+	 */
+	public URI getURI() throws URISyntaxException {
+		return new URI(hyperLinkElement.getXlinkHrefAttribute());
+	}
+
+	/**
+	 * Set the value of URI for this hyperlink
+	 * 
+	 * @param linkto
+	 *            - the URI of this hyperlink
+	 */
+	public void setURI(URI linkto) {
+		hyperLinkElement.setXlinkHrefAttribute(linkto.toString());
+	}
+
+	/**
+	 * Get the text content of this hyperlink
+	 * 
+	 * @return the text content of this hyperlink
+	 */
+	public String getTextContent() {
+		return Paragraph.getTextContent(getOdfElement());
+	}
+
+	/**
+	 * Set the text content of this hyperlink
+	 * 
+	 * @param text
+	 *            - the text content to be set
+	 */
+	public void setTextContent(String text) {
+		Paragraph.removeTextContentImpl(getOdfElement());
+		if (text != null && !text.equals(""))
+			Paragraph.appendTextElements(getOdfElement(), text, true);
+	}
+
+	/**
+	 * Remove the text content of this hyperlink.
+	 * <p>
+	 * The other child elements except text content will not be removed.
+	 * 
+	 */
+	public void removeTextContent() {
+		Paragraph.removeTextContentImpl(getOdfElement());
+	}
+
+}
+
+class AbstractTextHyperlinkContainer implements TextHyperlinkContainer {
+	OdfElement linkContainer;
+
+	public AbstractTextHyperlinkContainer(OdfElement parent) {
+		if ((parent instanceof TextPElement) || (parent instanceof TextHElement) || (parent instanceof TextSpanElement))
+			linkContainer = parent;
+		else
+			throw new InvalidParameterException(parent.getClass() + "is not a valid element.");
+	}
+
+	public TextHyperlink applyHyperlink(URI linkto) {
+		// new a text:a element, move all the child under text:p to text:a
+		OdfElement parent = linkContainer;
+		removeHyperlinks();
+		TextAElement aElement;
+		aElement = ((OdfContentDom) (parent.getOwnerDocument())).newOdfElement(TextAElement.class);
+		aElement.setXlinkTypeAttribute("simple");
+		aElement.setXlinkHrefAttribute(linkto.toString());
+		Node node = parent.getFirstChild();
+		while (node != null) {
+			Node thisNode = node;
+			node = node.getNextSibling();
+			parent.removeChild(thisNode);
+			aElement.appendChild(thisNode);
+		}
+		parent.appendChild(aElement);
+		return TextHyperlink.getInstanceof(aElement);
+	}
+
+	public void removeHyperlinks() {
+		OdfElement parent = linkContainer;
+		TextAElement aElement = OdfElement.findFirstChildNode(TextAElement.class, parent);
+		while (aElement != null) {
+			Node node = aElement.getFirstChild();
+			while (node != null) {
+				Node thisNode = node;
+				node = node.getNextSibling();
+				aElement.removeChild(thisNode);
+				parent.insertBefore(thisNode, aElement);
+			}
+			TextAElement thisElement = aElement;
+			aElement = OdfElement.findNextChildNode(TextAElement.class, aElement);
+			parent.removeChild(thisElement);
+		}
+	}
+
+	public SimpleHyperlinkIterator getHyperlinkIterator() {
+		return new SimpleHyperlinkIterator(linkContainer);
+	}
+
+	public TextHyperlink appendHyperlink(String text, URI linkto) {
+		OdfElement parent = linkContainer;
+		TextAElement aElement;
+		aElement = ((OdfContentDom) (parent.getOwnerDocument())).newOdfElement(TextAElement.class);
+		aElement.setXlinkTypeAttribute("simple");
+		aElement.setXlinkHrefAttribute(linkto.toString());
+		aElement.setTextContent(text);
+		parent.appendChild(aElement);
+		return TextHyperlink.getInstanceof(aElement);
+	}
+
+	private class SimpleHyperlinkIterator implements Iterator<TextHyperlink> {
+
+		private OdfElement containerElement;
+		private TextHyperlink nextElement = null;
+		private TextHyperlink tempElement = null;
+
+		private SimpleHyperlinkIterator(OdfElement container) {
+			containerElement = container;
+		}
+
+		public boolean hasNext() {
+			tempElement = findNext(nextElement);
+			return (tempElement != null);
+		}
+
+		public TextHyperlink next() {
+			if (tempElement != null) {
+				nextElement = tempElement;
+				tempElement = null;
+			} else {
+				nextElement = findNext(nextElement);
+			}
+			if (nextElement == null) {
+				return null;
+			} else {
+				return nextElement;
+			}
+		}
+
+		public void remove() {
+			if (nextElement == null) {
+				throw new IllegalStateException("please call next() first.");
+			}
+			containerElement.removeChild(nextElement.getOdfElement());
+		}
+
+		private TextHyperlink findNext(TextHyperlink thisLink) {
+			TextAElement nextLink = null;
+			if (thisLink == null) {
+				nextLink = OdfElement.findFirstChildNode(TextAElement.class, containerElement);
+			} else {
+				nextLink = OdfElement.findNextChildNode(TextAElement.class, thisLink.getOdfElement());
+			}
+
+			if (nextLink != null) {
+				return TextHyperlink.getInstanceof(nextLink);
+			}
+			return null;
+		}
+	}
+
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/TextHyperlinkContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/TextHyperlinkContainer.java
new file mode 100644
index 0000000..8704104
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/TextHyperlinkContainer.java
@@ -0,0 +1,67 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.net.URI;
+import java.util.Iterator;
+
+/**
+ * TextHyperlinkContainer is a container which maintains text hyperlinks.
+ * Hyperlinks can be added and removed in this container.
+ * 
+ * @see TextHyperlink
+ * 
+ * @since 0.6.5
+ */
+
+public interface TextHyperlinkContainer {
+
+	/**
+	 * Add a hypertext reference to this hyperlink container.
+	 * 
+	 * @param linkto
+	 *            the hyperlink
+	 * @return an instance of TextHyperlink
+	 */
+	public TextHyperlink applyHyperlink(URI linkto);
+
+	/**
+	 * Remove all the hyperlinks in this container element.
+	 */
+	public void removeHyperlinks();
+
+	/**
+	 * Append a hyperlink at the end of the container
+	 * 
+	 * @param text
+	 *            - the text content
+	 * @param linkto
+	 *            - the URI of this hyperlink
+	 * @return an instance of TextHyperlink
+	 */
+	public TextHyperlink appendHyperlink(String text, URI linkto);
+
+	/**
+	 * Get the iterator of hyperlinks within this container element
+	 * 
+	 * @return the iterator of hyperlinks within this container element
+	 */
+	public Iterator<TextHyperlink> getHyperlinkIterator();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/AbstractListContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/AbstractListContainer.java
new file mode 100644
index 0000000..cc0df6f
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/AbstractListContainer.java
@@ -0,0 +1,150 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.NoSuchElementException;
+
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * AbstractListContainer is an abstract implementation of the ListContainer
+ * interface, with a default implementation for every method defined in ListContainer
+ * , except getListContainerElement(). A subclass must implement
+ * the abstract method getListContainerElement().
+ * 
+ * @since 0.4
+ */
+public abstract class AbstractListContainer implements ListContainer {
+
+	public List addList() {
+		return new List(this);
+	}
+
+	public List addList(ListDecorator decorator) {
+		return new List(this, decorator);
+	}
+
+	public void clearList() {
+		OdfElement containerElement = getListContainerElement();
+		Node child = getListContainerElement().getFirstChild();
+		while (child != null) {
+			if (child instanceof TextListElement) {
+				Node tmp = child;
+				child = child.getNextSibling();
+				containerElement.removeChild(tmp);
+			} else {
+				child = child.getNextSibling();
+			}
+		}
+	}
+
+	public Iterator<List> getListIterator() {
+		return new SimpleListIterator(this);
+	}
+
+	public boolean removeList(List list) {
+		OdfElement containerElement = getListContainerElement();
+		Node child = containerElement.getFirstChild();
+		OdfFileDom ownerDocument = (OdfFileDom) containerElement.getOwnerDocument();
+		Document doc = (Document) ownerDocument.getDocument();
+		while (child != null) {
+			if (child instanceof TextListElement) {
+				TextListElement listElement1 = (TextListElement) child;
+				String id1 = listElement1.getXmlIdAttribute();
+				TextListElement listElement2 = list.getOdfElement();
+				String id2 = listElement2.getXmlIdAttribute();
+				if ((listElement1 == listElement2) || ((id1 != null) && (id2 != null) && (id1.equals(id2)))) {
+					doc.removeElementLinkedResource(listElement1);
+					containerElement.removeChild(child);
+					return true;
+				}
+			}
+			child = child.getNextSibling();
+		}
+		return false;
+	}
+
+	// default iterator to iterate list item.
+	private static class SimpleListIterator implements Iterator<List> {
+		
+		private java.util.List<List> allLists;
+		private int index;
+		private List currentList;
+		
+		public SimpleListIterator(ListContainer container) {
+			this.allLists = getLists(container.getListContainerElement().getChildNodes());
+		}
+
+		public boolean hasNext() {
+			return this.index < this.allLists.size();
+		}
+
+		public List next() {
+			if (hasNext()) {
+				this.currentList = allLists.get(index);
+				this.index++;
+				return this.currentList;
+			} else {
+				throw new NoSuchElementException();
+			}
+		}
+
+		public void remove() {
+			if (this.currentList == null) {
+				throw new IllegalStateException();
+			} else {
+				this.allLists.remove(this.currentList);
+				this.currentList = null;
+			}
+		}
+		
+		private java.util.List<List> getLists(NodeList nodes) {
+			java.util.List<List> lists = new LinkedList<List>();
+			int numberOfNodes = nodes.getLength();
+			for (int i = 0; i < numberOfNodes; i++) {
+				Node node = nodes.item(i);
+				lists.addAll(getLists(node));
+			}
+			return lists;
+		}
+		
+		private java.util.List<List> getLists(Node node) {
+			java.util.List<List> lists = new LinkedList<List>();
+			if (node instanceof TextListElement) {
+				TextListElement textListElement = (TextListElement) node;
+				List list = new List(textListElement);
+				lists.add(list);
+			} else {
+				NodeList childNodes = node.getChildNodes();
+				lists.addAll(getLists(childNodes));
+			}
+			return lists;
+		}
+		
+	}
+	
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java
new file mode 100644
index 0000000..bc33927
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java
@@ -0,0 +1,165 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleBulletElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+
+/**
+ * BulletDecorator is an implementation of the ListDecorator interface,
+ * decorates a given List as bullet list. User can extend this class and realize
+ * their own list and list item style. For example, set a specifies list item
+ * with red color.
+ * <p>
+ * A BulletDecorator can be reused in the same Document.
+ * 
+ * @since 0.4
+ */
+public class BulletDecorator implements ListDecorator {
+
+	private static String[] DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES = { null, "0.401cm", "0.799cm", "1.2cm", "1.6cm",
+			"2.001cm", "2.399cm", "2.8cm", "3.2cm", "3.601cm" };
+	private static String DEFAULT_TEXT_MIN_LABEL_WIDTH = "0.4cm";
+	private static String DEFAULT_FONT_NAME = "Tahoma";
+	private static String DEFAULT_BULLET_CHAR = "•";
+	private static String DEFAULT_NAME = "Simple_Default_Bullet_List";
+
+	private OdfTextListStyle listStyle;
+	private OdfStyle paragraphStyle;
+	private OdfOfficeAutomaticStyles styles;
+
+	/**
+	 * Constructor with Document.
+	 * 
+	 * @param doc
+	 *            the Document which this BulletDecorator will be used on.
+	 */
+	public BulletDecorator(Document doc) {
+		OdfContentDom contentDocument;
+		try {
+			contentDocument = doc.getContentDom();
+			styles = contentDocument.getAutomaticStyles();
+			OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+			listStyle = styles.getListStyle(DEFAULT_NAME);
+			// create bullet style
+			if (listStyle == null) {
+				listStyle = styles.newListStyle();
+				// <style:style style:name="Numbering_20_Symbols"
+				// style:display-name="Numbering Symbols" style:family="text" />
+				getOrCreateStyleByName(documentStyles, styles, "Bullet_20_Symbols", OdfStyleFamily.Text);
+				for (int i = 0; i < 10; i++) {
+					TextListLevelStyleBulletElement listLevelElement = listStyle.newTextListLevelStyleBulletElement(
+							DEFAULT_BULLET_CHAR, i + 1);
+					// get from default style element
+					listLevelElement.setTextStyleNameAttribute("Bullet_20_Symbols");
+					StyleListLevelPropertiesElement styleListLevelPropertiesElement = listLevelElement
+							.newStyleListLevelPropertiesElement();
+					if (DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES[i] != null) {
+						styleListLevelPropertiesElement
+								.setTextSpaceBeforeAttribute(DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES[i]);
+					}
+					styleListLevelPropertiesElement.setTextMinLabelWidthAttribute(DEFAULT_TEXT_MIN_LABEL_WIDTH);
+					StyleTextPropertiesElement styleTextPropertiesElement = listLevelElement
+							.newStyleTextPropertiesElement("true");
+					styleTextPropertiesElement.setStyleFontNameAttribute(DEFAULT_FONT_NAME);
+				}
+				// listStyle.setStyleNameAttribute(DEFAULT_NAME);
+			}
+			// create default paragraph style
+			// <style:style style:name="P3" style:family="paragraph"
+			// style:parent-style-name="Default_20_Text"
+			// style:list-style-name="L1"
+			// />
+			paragraphStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+			// <style:style style:name="Default_20_Text"
+			// style:display-name="Default Text" style:family="paragraph"
+			// style:class="text" />
+			// <style:style style:name="Standard" style:family="paragraph"
+			// style:class="text" />
+			getOrCreateStyleByName(documentStyles, styles, "Default_20_Text", OdfStyleFamily.Paragraph);
+			paragraphStyle.setStyleParentStyleNameAttribute("Default_20_Text");
+			paragraphStyle.setStyleListStyleNameAttribute(listStyle.getStyleNameAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(BulletDecorator.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+	
+	public void decorateList(List list) {
+		TextListElement listElement = list.getOdfElement();
+		listElement.setTextStyleNameAttribute(listStyle.getStyleNameAttribute());
+	}
+
+	public void decorateListItem(ListItem item) {
+		TextListItemElement listItemElement = item.getOdfElement();
+		Node child = listItemElement.getFirstChild();
+		while (child != null) {
+			if (child instanceof TextPElement) {
+				TextPElement pElement = (TextPElement) child;
+				// user can realize defined style for specifies item.
+				/*
+				 * if (pElement.getTextContent().contains("item1")) { OdfStyle
+				 * sParagraphStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+				 * sParagraphStyle
+				 * .setStyleParentStyleNameAttribute("Default_20_Text");
+				 * sParagraphStyle
+				 * .newStyleTextPropertiesElement(null).setFoColorAttribute
+				 * ("#ff3333");
+				 * pElement.setTextStyleNameAttribute(sParagraphStyle
+				 * .getStyleNameAttribute()); } else
+				 */
+				pElement.setTextStyleNameAttribute(paragraphStyle.getStyleNameAttribute());
+			}
+			child = child.getNextSibling();
+		}
+	}
+
+	public ListType getListType() {
+		return ListType.BULLET;
+	}
+
+	private OdfStyle getOrCreateStyleByName(OdfOfficeStyles documentStyles, OdfOfficeAutomaticStyles styles,
+			String styleName, OdfStyleFamily styleFamily) {
+		OdfStyle odfStyle = documentStyles.getStyle(styleName, styleFamily);
+		if (odfStyle == null) {
+			styles.getStyle(styleName, styleFamily);
+		}
+		if (odfStyle == null) {
+			odfStyle = styles.newStyle(styleFamily);
+			odfStyle.setStyleNameAttribute(styleName);
+			odfStyle.setStyleDisplayNameAttribute(styleName);
+		}
+		return odfStyle;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ImageDecorator.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ImageDecorator.java
new file mode 100644
index 0000000..3f1d509
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ImageDecorator.java
@@ -0,0 +1,184 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.net.URI;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelLabelAlignmentElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+
+/**
+ * ImageDecorator is an implementation of the ListDecorator interface, decorates
+ * a given List as image list. Users can set an image as the list item prefix.
+ * They also can extend this class and realize their own list and list item
+ * style. For example, set a specifies list item with red color.
+ * <p>
+ * An ImageDecorator can be reused in the same Document.
+ * 
+ * @since 0.4
+ */
+public class ImageDecorator implements ListDecorator {
+
+	private static String[] DEFAULT_MARGIN_LEFT_ATTRIBUTES = { "0.741cm", "1.482cm", "2.223cm", "2.963cm", "3.704cm",
+			"4.445cm", "5.186cm", "5.927cm", "6.668cm", "7.408cm" };
+	private static String DEFAULT_IMAGE_WIDTH = "0.54cm";
+	private static String DEFAULT_IMAGE_HEIGHT = "0.54cm";
+	private static String DEFAULT_NAME = "Simple_Default_Image_List";
+	private static final String SLASH = "/";
+
+	private OdfTextListStyle listStyle;
+	private OdfStyle paragraphStyle;
+	private OdfOfficeAutomaticStyles styles;
+
+	/**
+	 * Constructor with Document and image URI.
+	 * 
+	 * @param doc
+	 *            the Document which this ImageDecorator will be used on.
+	 * @param imageUri
+	 *            the image location.
+	 */
+	public ImageDecorator(Document doc, URI imageUri) {
+		OdfContentDom contentDocument;
+		try {
+			contentDocument = doc.getContentDom();
+			styles = contentDocument.getAutomaticStyles();
+			OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+			listStyle = styles.getListStyle(DEFAULT_NAME);
+			// create image style
+			if (listStyle == null) {
+				listStyle = styles.newListStyle();
+				String packagePath = null;
+				try {
+					packagePath = insertImage(doc, imageUri);
+				} catch (Exception e) {
+					Logger.getLogger(ImageDecorator.class.getName()).log(Level.SEVERE, null, e);
+				}
+				for (int i = 0; i < 10; i++) {
+					TextListLevelStyleImageElement listLevelElement = listStyle
+							.newTextListLevelStyleImageElement(i + 1);
+					// xlink:href="Pictures/100002010000001700000017B273CC34.png"
+					listLevelElement.setXlinkHrefAttribute(packagePath);
+					listLevelElement.setXlinkTypeAttribute("simple");
+					listLevelElement.setXlinkShowAttribute("embed");
+					listLevelElement.setXlinkActuateAttribute("onLoad");
+					StyleListLevelPropertiesElement styleListLevelPropertiesElement = listLevelElement
+							.newStyleListLevelPropertiesElement();
+					styleListLevelPropertiesElement.setTextListLevelPositionAndSpaceModeAttribute("label-alignment");
+					styleListLevelPropertiesElement.setStyleVerticalPosAttribute("middle");
+					styleListLevelPropertiesElement.setStyleVerticalRelAttribute("line");
+					styleListLevelPropertiesElement.setFoWidthAttribute(DEFAULT_IMAGE_WIDTH);
+					styleListLevelPropertiesElement.setFoHeightAttribute(DEFAULT_IMAGE_HEIGHT);
+					StyleListLevelLabelAlignmentElement styleListLevelLabelAlignmentElement = styleListLevelPropertiesElement
+							.newStyleListLevelLabelAlignmentElement("listtab");
+					styleListLevelLabelAlignmentElement
+							.setTextListTabStopPositionAttribute(DEFAULT_MARGIN_LEFT_ATTRIBUTES[i]);
+					styleListLevelLabelAlignmentElement.setFoTextIndentAttribute("-0.741cm");
+					styleListLevelLabelAlignmentElement.setFoMarginLeftAttribute(DEFAULT_MARGIN_LEFT_ATTRIBUTES[i]);
+				}
+				// listStyle.setStyleNameAttribute(DEFAULT_NAME);
+			}
+			// create default paragraph style
+			// <style:style style:name="P3" style:family="paragraph"
+			// style:parent-style-name="Default_20_Text"
+			// style:list-style-name="L1"
+			// />
+			paragraphStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+			// <style:style style:name="Default_20_Text"
+			// style:display-name="Default Text" style:family="paragraph"
+			// style:class="text" />
+			// <style:style style:name="Standard" style:family="paragraph"
+			// style:class="text" />
+			getOrCreateStyleByName(documentStyles, styles, "Default_20_Text", OdfStyleFamily.Paragraph);
+			paragraphStyle.setStyleParentStyleNameAttribute("Default_20_Text");
+			paragraphStyle.setStyleListStyleNameAttribute(listStyle.getStyleNameAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(ImageDecorator.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	public void decorateList(List list) {
+		TextListElement listElement = list.getOdfElement();
+		listElement.setTextStyleNameAttribute(listStyle.getStyleNameAttribute());
+	}
+
+	public void decorateListItem(ListItem item) {
+		TextListItemElement listItemElement = item.getOdfElement();
+		Node child = listItemElement.getFirstChild();
+		while (child != null) {
+			if (child instanceof TextPElement) {
+				TextPElement pElement = (TextPElement) child;
+				pElement.setTextStyleNameAttribute(paragraphStyle.getStyleNameAttribute());
+			}
+			child = child.getNextSibling();
+		}
+	}
+
+	public ListType getListType() {
+		return ListType.IMAGE;
+	}
+
+	private OdfStyle getOrCreateStyleByName(OdfOfficeStyles documentStyles, OdfOfficeAutomaticStyles styles,
+			String styleName, OdfStyleFamily styleFamily) {
+		OdfStyle odfStyle = documentStyles.getStyle(styleName, styleFamily);
+		if (odfStyle == null) {
+			styles.getStyle(styleName, styleFamily);
+		}
+		if (odfStyle == null) {
+			odfStyle = styles.newStyle(styleFamily);
+			odfStyle.setStyleNameAttribute(styleName);
+			odfStyle.setStyleDisplayNameAttribute(styleName);
+		}
+		return odfStyle;
+	}
+
+	private String insertImage(Document doc, URI imageUri) throws Exception {
+		String imageRef = null;
+		if (!imageUri.isAbsolute()) {
+			imageRef = System.getProperty("user.dir") + '/' + imageUri.toString();
+		} else {
+			imageRef = imageUri.toString();
+		}
+		String mediaType = OdfFileEntry.getMediaTypeString(imageRef);
+		if (imageRef.contains(SLASH)) {
+			imageRef = imageRef.substring(imageRef.lastIndexOf(SLASH) + 1, imageRef.length());
+		}
+		String packagePath = OdfPackage.OdfFile.IMAGE_DIRECTORY.getPath() + SLASH + imageRef;
+		packagePath = doc.getDocumentPath() + packagePath;
+		doc.getPackage().insert(imageUri, packagePath, mediaType);
+		return packagePath;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/List.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/List.java
new file mode 100644
index 0000000..e00b944
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/List.java
@@ -0,0 +1,849 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListHeaderElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleBulletElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.text.list.ListDecorator.ListType;
+import org.w3c.dom.Node;
+
+/**
+ * This class represents a list. It can contain list header, 
+ * followed by list items.
+ * 
+ * @since 0.4
+ */
+public class List {
+
+	private TextListElement listElement;
+	private ListDecorator decorator;
+
+	/**
+	 * Constructor ListItem, AbstractListContainer and List use only.
+	 * 
+	 * @param element
+	 *            the ODF element 
+	 */
+	List(TextListElement element) {
+		listElement = element;
+		// only getListType and addItem --> item.setParagraphDecorator() need
+		// decorator. We have fixed the problems when decorator is null in these
+		// two conditions. So decorator null is OK for a exist list. But this
+		// constructor should not be used on a new created TextListElement, as
+		// its style name may have not set.
+		decorator = null;
+	}
+
+	/**
+	 * Constructor with ListContainer only. A bullet list with default style
+	 * will be created.
+	 * 
+	 * @param container
+	 *            the container in where this list will be appended.
+	 */
+	public List(ListContainer container) {
+		this(container, null, null);
+	}
+
+	/**
+	 * Constructor with ListContainer and ListDecorator.
+	 * 
+	 * @param container
+	 *            the container in where this list will be appended.
+	 * @param decorator
+	 *            the ListDecorator of this list.
+	 */
+	public List(ListContainer container, ListDecorator decorator) {
+		this(container, null, decorator);
+	}
+
+	/**
+	 * Constructor with ListContainer, ListDecorator and header.
+	 * 
+	 * @param container
+	 *            the container in where this list will be appended.
+	 * @param decorator
+	 *            the ListDecorator of this list.
+	 * @param header
+	 *            the header of this list.
+	 */
+	public List(ListContainer container, String header, ListDecorator decorator) {
+		OdfElement containerElement = container.getListContainerElement();
+		OdfFileDom ownerDocument = (OdfFileDom) containerElement.getOwnerDocument();
+		listElement = ownerDocument.newOdfElement(TextListElement.class);
+		listElement.setXmlIdAttribute(getUniqueXMLID());
+		containerElement.appendChild(listElement);
+		setHeader(header);
+		if (decorator == null) {
+			Document doc = (Document) ownerDocument.getDocument();
+			decorator = new BulletDecorator(doc);
+		}
+		this.decorator = decorator;
+		decorator.decorateList(this);
+	}
+
+	/**
+	 * Constructor with ListContainer, ListDecorator, header and numbering setting.
+	 * 
+	 * @param container
+	 *            the container in where this list will be appended.
+	 * @param decorator
+	 *            the ListDecorator of this list.
+	 * @param isContinueNumbering
+	 *            If <code>isContinueNumbering</code> is true, the numbering of this list is
+	 *            continuing, otherwise the numbering of this list starts from the beginning.
+	 * @param header
+	 *            the header of this list.
+	 */
+	public List(ListContainer container, String header, boolean isContinueNumbering, ListDecorator decorator) {
+		this(container, header, decorator);
+		setContinueNumbering(isContinueNumbering);
+	}
+
+	/**
+	 * Constructor with ListContainer, ListDecorator, header and continued list
+	 * 
+	 * @param container
+	 *            the container in where this list will be appended.
+	 * @param decorator
+	 *            the ListDecorator of this list.
+	 * @param continueList
+	 *            the continued list of this list.
+	 * @param header
+	 *            the header of this list.
+	 */
+	public List(ListContainer container, String header, List continueList, ListDecorator decorator) {
+		this(container, header, decorator);
+		setContinueList(continueList);
+	}
+
+	/**
+	 * Get the type of this list. The list type can be BULLET, NUMBER and IMAGE.
+	 * 
+	 * @return the list type.
+	 */
+	public ListType getType() {
+		if (decorator != null) {
+			return decorator.getListType();
+		} else {
+			try {
+				String textStyleName = listElement.getTextStyleNameAttribute();
+				Document doc = (Document) (((OdfFileDom) listElement.getOwnerDocument()).getDocument());
+				OdfContentDom contentDocument = doc.getContentDom();
+				OdfOfficeAutomaticStyles styles = contentDocument.getAutomaticStyles();
+				OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+				OdfTextListStyle listStyle = styles.getListStyle(textStyleName);
+				if (listStyle == null) {
+					listStyle = documentStyles.getListStyle(textStyleName);
+				}
+				if (listStyle != null) {
+					TextListLevelStyleElementBase listLevelStyle = listStyle.getLevel(1);
+					if (listLevelStyle instanceof TextListLevelStyleBulletElement) {
+						return ListType.BULLET;
+					} else if (listLevelStyle instanceof TextListLevelStyleNumberElement) {
+						return ListType.NUMBER;
+					} else if (listLevelStyle instanceof TextListLevelStyleImageElement) {
+						return ListType.IMAGE;
+					}
+				}
+			} catch (Exception e) {
+				Logger.getLogger(List.class.getName()).log(Level.SEVERE, null, e);
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * Get the header of this list.
+	 * 
+	 * @return the header of this list.
+	 */
+	public String getHeader() {
+		String header = "";
+		Node headerNode = listElement.getFirstChild();
+		if (headerNode instanceof TextListHeaderElement) {
+			Node pNode = headerNode.getFirstChild();
+			String splitString = "";
+			while (pNode != null) {
+				if (pNode instanceof TextPElement) {
+					String content = pNode.getTextContent();
+					if ((content != null) && (content.length() > 0)) {
+						header = header + splitString + content;
+						splitString = "\n";
+					}
+				}
+				pNode = pNode.getNextSibling();
+			}
+		}
+		if ("".equals(header)) {
+			return null;
+		} else {
+			return header;
+		}
+	}
+
+	/**
+	 * Set the header of this list. The exist header will be replaced.
+	 * 
+	 * @param header
+	 *            the header to be set.
+	 */
+	public void setHeader(String header) {
+		if (header != null) {
+			String[] headerContents = header.split("\n");
+			TextListHeaderElement listHeaderElement = null;
+			Node firstNode = listElement.getFirstChild();
+			if (firstNode instanceof TextListHeaderElement) {
+				listHeaderElement = (TextListHeaderElement) firstNode;
+				Node pElement = listHeaderElement.getFirstChild();
+				while (pElement != null) {
+					firstNode.removeChild(pElement);
+					pElement = pElement.getNextSibling();
+				}
+			} else {
+				listHeaderElement = ((OdfFileDom) listElement.getOwnerDocument())
+						.newOdfElement(TextListHeaderElement.class);
+				listElement.insertBefore(listHeaderElement, firstNode);
+			}
+			for (String headerContent : headerContents) {
+				TextPElement pElement = listHeaderElement.newTextPElement();
+				pElement.setTextContent(headerContent);
+			}
+		}
+	}
+
+	/**
+	 * Set the ListDecorator of this list. The current ListDecorator will be
+	 * replaced.
+	 * <p>
+	 * This is a useful method which can change the list type and style, even
+	 * though it has been created.
+	 * 
+	 * @param decorator
+	 *            the ListDecorator to be used.
+	 */
+	public void setDecorator(ListDecorator decorator) {
+		if (decorator != null) {
+			this.decorator = decorator;
+			decorator.decorateList(this);
+		}
+	}
+
+	/**
+	 * Add a list item by specifying a string value.
+	 * 
+	 * @param itemContent
+	 *            the list item content to be added.
+	 * @return the added ListItem.
+	 */
+	public ListItem addItem(String itemContent) {
+		TextListItemElement listItemElement = listElement.newTextListItemElement();
+		ListItem item = new ListItem(listItemElement);
+		item.setParagraphDecorator(decorator);
+		item.setTextContent(itemContent);
+		return item;
+	}
+
+	/**
+	 * Insert the specified ListItem at the specified location.
+	 * The ListItem is inserted before the ListItem at the specified
+	 * location.
+	 * 
+	 * @param location
+	 *            the index to insert. The start number is 0.
+	 * @param itemContent
+	 *            the list item content to be added.
+	 * @return the added ListItem.
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public ListItem addItem(int location, String itemContent) {
+		OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+		TextListItemElement listItemElement = ownerDocument.newOdfElement(TextListItemElement.class);
+		Node refNode = getItemByLocation(location);
+		listElement.insertBefore(listItemElement, refNode);
+		ListItem item = new ListItem(listItemElement);
+		item.setParagraphDecorator(decorator);
+		item.setTextContent(itemContent);
+		return item;
+	}
+
+	/**
+	 * Add the specified list item in ListItem object.
+	 * 
+	 * @param item
+	 *            the list item to be added.
+	 * @return the added ListItem.
+	 */
+	public ListItem addItem(ListItem item) {
+		TextListItemElement itemElement = (TextListItemElement) (item.getOdfElement().cloneNode(true));
+		listElement.appendChild(itemElement);
+		ListItem newItem = new ListItem(itemElement);
+		return newItem;
+	}
+
+	/**
+	 * Insert a ListItem at the specified location.
+	 * The ListItem is inserted before the ListItem at the specified
+	 * location.
+	 * 
+	 * @param location
+	 *            the index to insert.
+	 * @param item
+	 *            the list item to add.
+	 * @return the added ListItem.
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public ListItem addItem(int location, ListItem item) {
+		TextListItemElement itemElement = (TextListItemElement) (item.getOdfElement().cloneNode(true));
+		Node refNode = getItemByLocation(location);
+		listElement.insertBefore(itemElement, refNode);
+		ListItem newItem = new ListItem(itemElement);
+		return newItem;
+	}
+
+	/**
+	 * Add list items by specifying an array of string values.
+	 * 
+	 * @param items
+	 *            the list items to be added.
+	 * @return the added items.
+	 */
+	public java.util.List<ListItem> addItems(String[] items) {
+		java.util.List<ListItem> itemList = new java.util.ArrayList<ListItem>();
+		for (String itemString : items) {
+			TextListItemElement listItemElement = listElement.newTextListItemElement();
+			ListItem item = new ListItem(listItemElement);
+			item.setTextContent(itemString);
+			itemList.add(item);
+		}
+		return itemList;
+	}
+
+	/**
+	 * Insert the list items at the specified location in this List 
+	 * by giving an array of string values.
+	 * 
+	 * @param location
+	 *            the index to insert.
+	 * @param items
+	 *            the collection of list item contents.
+	 * @return the added items.
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public java.util.List<ListItem> addItems(int location, String[] items) {
+		java.util.List<ListItem> listCollection = new ArrayList<ListItem>();
+		OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+		Node refNode = getItemByLocation(location);
+		for (int i = items.length - 1; i >= 0; i--) {
+			TextListItemElement listItemElement = ownerDocument.newOdfElement(TextListItemElement.class);
+			listElement.insertBefore(listItemElement, refNode);
+			ListItem item = new ListItem(listItemElement);
+			item.setParagraphDecorator(decorator);
+			item.setTextContent(items[i]);
+			refNode = listItemElement;
+			listCollection.add(item);
+		}
+		return listCollection;
+	}
+
+	/**
+	 * Add list items by specifying an array of ListItem.
+	 * 
+	 * @param items
+	 *            the list items to be added.
+	 */
+	public java.util.List<ListItem> addItems(ListItem[] items) {
+		java.util.List<ListItem> itemList = new java.util.ArrayList<ListItem>();
+		for (ListItem itemClone : items) {
+			TextListItemElement itemElement = (TextListItemElement) (itemClone.getOdfElement().cloneNode(true));
+			listElement.appendChild(itemElement);
+			itemList.add(new ListItem(itemElement));
+		}
+		return itemList;
+	}
+
+	/**
+	 * Insert the list items at the certain location
+	 * by specifying an array of ListItem.
+	 * 
+	 * @param location
+	 *            the index to insert.
+	 * @param items
+	 *            the collection of items.
+	 * @return the added items
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public java.util.List<ListItem> addItems(int location, ListItem[] items) {
+		java.util.List<ListItem> listCollection = new ArrayList<ListItem>();
+		Node refNode = getItemByLocation(location);
+		for (int i = items.length - 1; i >= 0; i--) {
+			TextListItemElement itemElement = (TextListItemElement) (items[i].getOdfElement().cloneNode(true));
+			listElement.insertBefore(itemElement, refNode);
+			ListItem item = new ListItem(itemElement);
+			refNode = itemElement;
+			listCollection.add(item);
+		}
+		return listCollection;
+	}
+
+	/**
+	 * Return the item at the specified location in this List.
+	 * 
+	 * @param location
+	 *            the index of the element to be returned.
+	 * @return the element at the specified location.
+	 * 
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public ListItem getItem(int location) {
+		return new ListItem(getItemByLocation(location));
+	}
+
+	/**
+	 * Get all of the list items.
+	 * 
+	 * @return all of list items.
+	 */
+	public java.util.List<ListItem> getItems() {
+		java.util.List<ListItem> itemList = new java.util.ArrayList<ListItem>();
+		Node firstNode = listElement.getFirstChild();
+		while (firstNode != null) {
+			if (firstNode instanceof TextListItemElement) {
+				itemList.add(new ListItem((TextListItemElement) firstNode));
+			}
+			firstNode = firstNode.getNextSibling();
+		}
+		return itemList;
+	}
+
+	/**
+	 * Return the number of direct child items in this List.
+	 * 
+	 * @return the number of direct child items in this List.
+	 */
+	public int size() {
+		int size = 0;
+		Node firstNode = listElement.getFirstChild();
+		while (firstNode != null) {
+			if (firstNode instanceof TextListItemElement) {
+				size++;
+			}
+			firstNode = firstNode.getNextSibling();
+		}
+		return size;
+	}
+
+	/**
+	 * Replace the item at the specified location in this List with the
+	 * specified item.
+	 * 
+	 * @param location
+	 *            the index to put the specified item.
+	 * @param item
+	 *            the new item to be added.
+	 * @return the previous element at the index.
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public ListItem set(int location, ListItem item) {
+		TextListItemElement itemElement = (TextListItemElement) (item.getOdfElement().cloneNode(true));
+		Node oldNode = getItemByLocation(location);
+		listElement.replaceChild(itemElement, oldNode);
+		ListItem newItem = new ListItem(itemElement);
+		newItem.setParagraphDecorator(decorator);
+		return newItem;
+	}
+
+	/**
+	 * Replace the item at the specified location in this List with the
+	 * specified item content.
+	 * 
+	 * @param location
+	 *            the index to insert. The start number is 0.
+	 * @param itemContent
+	 *            the list item content to be added.
+	 * @return the previous element at the index.
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public ListItem set(int location, String itemContent) {
+		OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+		TextListItemElement listItemElement = ownerDocument.newOdfElement(TextListItemElement.class);
+		Node oldNode = getItemByLocation(location);
+		listElement.replaceChild(listItemElement, oldNode);
+		ListItem item = new ListItem(listItemElement);
+		item.setParagraphDecorator(decorator);
+		item.setTextContent(itemContent);
+		return item;
+	}
+
+	/**
+	 * Remove the item at the specified location from this List.
+	 * 
+	 * @param location
+	 *            the index of the item to be removed.
+	 * @return true if this List is modified, false otherwise.
+	 * @exception IndexOutOfBoundsException
+	 *                when the <code>location</code> is out of the List range.
+	 */
+	public boolean removeItem(int location) {
+		TextListItemElement itemElement = getItemByLocation(location);
+		if (itemElement == null) {
+			return false;
+		} else {
+			OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+			Document doc = (Document) ownerDocument.getDocument();
+			doc.removeElementLinkedResource(itemElement);
+			listElement.removeChild(itemElement);
+			return true;
+		}
+	}
+
+	/**
+	 * Remove the specified item from this List.
+	 * 
+	 * @param item
+	 *            the item to be removed.
+	 * @return true if this List is modified, false otherwise.
+	 */
+	public boolean removeItem(ListItem item) {
+		TextListItemElement itemElement = item.getOdfElement();
+		OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+		Document doc = (Document) ownerDocument.getDocument();
+		doc.removeElementLinkedResource(itemElement);
+		Node removedNode = listElement.removeChild(itemElement);
+		if (removedNode == null) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	/**
+	 * Remove all the items in the collection from this list
+	 * 
+	 * @param items
+	 *            the collection of items to be removed.
+	 * @return true if this List is modified, false otherwise.
+	 */
+	public boolean removeItems(java.util.List<ListItem> items) {
+		boolean listChanged = false;
+		for (ListItem item : items) {
+			TextListItemElement itemElement = item.getOdfElement();
+			OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+			Document doc = (Document) ownerDocument.getDocument();
+			doc.removeElementLinkedResource(itemElement);
+			Node removedNode = listElement.removeChild(itemElement);
+			if (removedNode != null) {
+				listChanged = true;
+			}
+		}
+		return listChanged;
+	}
+
+	/**
+	 * Remove all items from this List.
+	 */
+	public void clear() {
+		Node firstChild = listElement.getFirstChild();
+		while (firstChild != null) {
+			if (firstChild instanceof TextListItemElement) {
+				Node removedNode = firstChild;
+				firstChild = firstChild.getNextSibling();
+				listElement.removeChild(removedNode);
+			} else {
+				firstChild = firstChild.getNextSibling();
+			}
+		}
+	}
+
+	/**
+	 * Remove this list from its container.
+	 */
+	public void remove() {
+		Node parentElement = listElement.getParentNode();
+		OdfFileDom ownerDocument = (OdfFileDom) listElement.getOwnerDocument();
+		Document doc = (Document) ownerDocument.getDocument();
+		doc.removeElementLinkedResource(listElement);
+		parentElement.removeChild(listElement);
+	}
+
+	/**
+	 * Return whether the numbering of this list is continuing,
+	 * or whether the numbering of the preceding list is continued or not.
+	 * 
+	 * @return true if the numbering of this list is continuing,
+	 *         false if not.
+	 */
+	public boolean isContinueNumbering() {
+		Boolean isContinueNumbering = listElement.getTextContinueNumberingAttribute();
+		if (isContinueNumbering == null) {
+			String continueList = listElement.getTextContinueListAttribute();
+			if (continueList != null) {
+				return true;
+			} else {
+				return false;
+			}
+		} else {
+			return isContinueNumbering;
+		}
+	}
+
+	/**
+	 * Set whether the numbering of the preceding list is continued or not. This
+	 * method will set the attribute "text:continue-numbering" of list element.
+	 * As ODF specification describes, this attribute is ignored, if attribute
+	 * <text:continue-list> is present, the user can call
+	 * <code>setContinueList(List)</code> to set this attribute. This method is
+	 * a easy way to set a list continue numbering, while
+	 * <code>setContinueList(List)</code> is an advance way to set a list
+	 * numbering. For example, there are three lists ListA, ListB and ListC in
+	 * order. If the user call set ListC.setContinueNumbering, the first list
+	 * item in ListC is the number of the last item in ListB incremented by one.
+	 * It easy, no need to get the reference of ListB. While if the user need
+	 * the first list item in ListC is the number of the last item in ListA
+	 * incremented by one, he must use ListC.setContinueList(ListA).
+	 * 
+	 * 
+	 * @param isContinueNumbering
+	 *            If <code>isContinueNumbering</code> is true, and
+	 *            text:continue-list attribute is not present and the numbering
+	 *            style of the preceding list is the same as the current list,
+	 *            the number of the first list item in the current list is the
+	 *            number of the last item in the preceding list incremented by
+	 *            one.the list is continue numbering, otherwise if the
+	 *            text:continue-list attribute is not present, the numbering of
+	 *            the preceding list is not continued.
+	 * @see #setContinueList(List)
+	 */
+	public void setContinueNumbering(boolean isContinueNumbering) {
+		if (getType() == ListType.NUMBER) {
+			listElement.setTextContinueNumberingAttribute(isContinueNumbering);
+		}
+	}
+
+	/**
+	 * Get the preceding list whose numbering is continued by this list. 
+	 * <p>Now only support to get the continued list reference in the same ListContainer and the same Level.
+	 * 
+	 * @return the continued list of this list. If the list has no continued list,
+	 *         it will return null.
+	 */
+	public List getContinueList() {
+		List continueList = null;
+		if (isContinueNumbering()) {
+			TextListElement continueListElement = null;
+			String continueListID = listElement.getTextContinueListAttribute();
+			if (continueListID != null) {
+				Node parentElement = listElement.getParentNode();
+				Node firstNode = parentElement.getFirstChild();
+				while (firstNode != null) {
+					if (firstNode instanceof TextListElement) {
+						TextListElement listElement = (TextListElement) firstNode;
+						String xmlID = listElement.getXmlIdAttribute();
+						if (continueListID.equals(xmlID)) {
+							continueListElement = (TextListElement) firstNode;
+							break;
+						}
+					}
+					firstNode = firstNode.getNextSibling();
+				}
+			} else {
+				Node preNode = listElement.getPreviousSibling();
+				while (preNode != null) {
+					if (preNode instanceof TextListElement) {
+						continueListElement = (TextListElement) preNode;
+						break;
+					}
+					preNode = preNode.getPreviousSibling();
+				}
+			}
+			continueList = new List(continueListElement);
+		}
+		return continueList;
+	}
+
+	/**
+	 * Set the list whose numbering is continued by this list.
+	 * This is an advance way to set a list
+	 * numbering. For example, there are three lists ListA, ListB and ListC in
+	 * order. If the user needs the first list item in ListC is the number of the
+	 * last item in ListA incremented by one, he must use
+	 * ListC.setContinueList(ListA).
+	 * 
+	 * @param continueList
+	 *            the continued list of this list.
+	 * @see #setContinueNumbering(boolean)
+	 */
+	public void setContinueList(List continueList) {
+		if (getType() == ListType.NUMBER) {
+			String xmlId = continueList.listElement.getXmlIdAttribute();
+			if (xmlId != null) {
+				listElement.setTextContinueListAttribute(xmlId);
+			} else {
+				xmlId = getUniqueXMLID();
+				continueList.listElement.setXmlIdAttribute(xmlId);
+				listElement.setTextContinueListAttribute(xmlId);
+			}
+			listElement.setTextContinueNumberingAttribute(true);
+		}
+	}
+
+	/**
+	 * Get the level of this list.
+	 * <p>
+	 * Every list has a list level. If a list is not contained in another list,
+	 * its list level is 1. If a list is contained within another list, the list
+	 * level of the contained list is the list level of the list in which it is
+	 * contained incremented by one. If a list is contained in a table cell or
+	 * text box, its list level returns to 1, even though the table or text box
+	 * may be nested in another list. Every list with a list level of 1 defines
+	 * a list and the counter domain for its list items and any sub list of that
+	 * list. Each sub list starts a counter for its list items and any sub list
+	 * it may contain.
+	 * 
+	 * @return list level.
+	 */
+	public int getLevel() {
+		int level = 1;
+		Node parentNode = listElement.getParentNode();
+		while (parentNode != null) {
+			if (parentNode instanceof TextListElement) {
+				level++;
+			}
+			if (parentNode instanceof TableTableCellElementBase) {
+				break;
+			}
+			parentNode = parentNode.getParentNode();
+		}
+		return level;
+	}
+
+	/**
+	 * Get the instance of TextListElement which represents this list.
+	 * 
+	 * @return the instance of TextListElement.
+	 */
+	public TextListElement getOdfElement() {
+		return listElement;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder strBuilder = new StringBuilder();
+		int level = getLevel();
+		String levelPrefix = "";
+		int i = 1;
+		while (i < level) {
+			levelPrefix += " ";
+			i++;
+		}
+		String splitStr = "";
+		String header = getHeader();
+		if (header != null) {
+			strBuilder.append(levelPrefix);
+			strBuilder.append(header);
+			splitStr = "\n";
+		}
+		String itemPrefix = "• ";
+		int j = 0;
+		if (getType() == ListType.NUMBER) {
+			itemPrefix = ". ";
+			j = 1;
+		}
+		for (ListItem item : getItems()) {
+			strBuilder.append(splitStr);
+			strBuilder.append(levelPrefix);
+			if (j > 0) {
+				strBuilder.append(j++);
+			}
+			strBuilder.append(itemPrefix);
+			strBuilder.append(item.toString());
+			splitStr = "\n";
+		}
+		return strBuilder.toString();
+	}
+
+	// find the insert node.
+	private TextListItemElement getItemByLocation(int location) {
+		if (location < 0) {
+			throw new IndexOutOfBoundsException("the location " + location + " is is out of the List range.");
+		}
+		Node firstNode = listElement.getFirstChild();
+		TextListItemElement positionNode = null;
+		int i = 0;
+		while (firstNode != null) {
+			if (firstNode instanceof TextListItemElement) {
+				if (i == location) {
+					break;
+				}
+				i++;
+			}
+			firstNode = firstNode.getNextSibling();
+		}
+		if ((i == location) && (firstNode instanceof TextListItemElement)) {
+			positionNode = (TextListItemElement) firstNode;
+		}
+		if ((location != 0) && (i < location)) {
+			throw new IndexOutOfBoundsException("the location " + location + " is is out of the List range.");
+		}
+		return positionNode;
+	}
+
+	private String getUniqueXMLID() {
+		return "list" + Math.round(Math.random() * 100000000);
+	}
+
+	/**
+	 * Answers an Iterator on the items of this List. The items are iterated in
+	 * the same order that they occur in the List.
+	 * 
+	 * @return an Iterator on the items of this List
+	 * 
+	 * @see java.util.Iterator
+	 */
+	/*
+	 * public Iterator<ListItem> iterator() { throw new
+	 * UnsupportedOperationException("todo"); }
+	 */
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListContainer.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListContainer.java
new file mode 100644
index 0000000..cbe6c7e
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListContainer.java
@@ -0,0 +1,99 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.pkg.OdfElement;
+
+/**
+ * ListContainer is a container which maintains List(s) as element(s). List(s)
+ * can be added, removed and iterated in this container.
+ * <p>
+ * All of the components which need to hold a List, must implement this
+ * interface. For example, <text:list> element is under <office:text>
+ * element according to ODF specification. So TextDocument is a type of
+ * ListContainer which holds List directly. TextDocument must implement this
+ * interface. While Presentation Notes is also a type of ListContainer, although
+ * <presentation:notes> is not a element with which the <text:list> element is
+ * usable. <presentation:notes> can have child element <draw:frame> and
+ * <draw:frame> can have child element <draw:text-box>. <text:list> is usable
+ * with the <draw:text-box> element. Notes is an indirectly ListContainer which
+ * let user operate List easily.
+ * 
+ * @see List
+ * @see org.odftoolkit.simple.TextDocument
+ * @see org.odftoolkit.simple.presentation.Notes
+ * 
+ * @since 0.4
+ */
+public interface ListContainer {
+
+	/**
+	 * Get the ODF element which can have <text:list> as child
+	 * element directly according to ODF specification. This Element will help to find the
+	 * position to insert a new List. For example, <text:list> element is
+	 * usable with <office:text> element, so TextDocument will return
+	 * OfficeTextElement. While Presentation Notes is an indirectly
+	 * ListContainer, which holds List with the help of its grand-child element
+	 * <draw:text-box>, so for Notes, DrawTextBoxElement should be return.
+	 * 
+	 * @return container element which can hold <text:list>.
+	 */
+	public OdfElement getListContainerElement();
+
+	/**
+	 * Add a new List to this container.
+	 * 
+	 * @return added list.
+	 */
+	public List addList();
+
+	/**
+	 * Add a List with specified ListDecorator to this container.
+	 * 
+	 * @param decorator
+	 *            the specified ListDecorator
+	 * @return added list.
+	 */
+	public List addList(ListDecorator decorator);
+
+	/**
+	 * Remove the existing List from this container.
+	 * 
+	 * @return true, if the container contains this List.
+	 */
+	public boolean removeList(List list);
+
+	/**
+	 * Remove all Lists from this container.
+	 */
+	public void clearList();
+
+	/**
+	 * Return an Iterator of the Lists in this ListContainer. The Lists are
+	 * iterated in the same order that they occur in the ListContainer.
+	 * 
+	 * @return an Iterator of the Lists in this ListContainer
+	 * 
+	 * @see java.util.Iterator
+	 */
+	public Iterator<List> getListIterator();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListDecorator.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListDecorator.java
new file mode 100644
index 0000000..367ccba
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListDecorator.java
@@ -0,0 +1,85 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+/**
+ * ListDecorator is a decorator which decides how to decorate a List and its
+ * ListItems.
+ * <p>
+ * Every list, including sub lists, may have a list style which is applied to
+ * its list items and sub lists. ListDecorator holds this style and decides the
+ * appearance of a list. List style is applied by invoking decorateList(List),
+ * while list item style is applied by invoking decorateListItem(ListItem).
+ * <p>
+ * A ListDecorator specified for a sub list overrides the ListDecorator
+ * specified for the list in which the sub list is contained.
+ * 
+ * @since 0.4
+ */
+public interface ListDecorator {
+
+	/**
+	 * The supported list types till now.
+	 * 
+	 * @since 0.4
+	 */
+	public static enum ListType {
+		/**
+		 * BULLET specifies a list type where list items are preceded by
+		 * bullets.
+		 */
+		BULLET,
+
+		/**
+		 * NUMBER specifies a list type where list items are preceded by
+		 * numbers.
+		 */
+		NUMBER,
+
+		/**
+		 * IMAGE specifies a list type where list items are preceded by images.
+		 */
+		IMAGE
+	}
+
+	/**
+	 * Decorate the specifies <code>list</code>, of which style is set.
+	 * 
+	 * @param list
+	 *            the List is decorated.
+	 */
+	public void decorateList(List list);
+
+	/**
+	 * Decorate the specifies <code>item</code> in a List, of which style is
+	 * set.
+	 * 
+	 * @param item
+	 *            the ListItem is decorated.
+	 */
+	public void decorateListItem(ListItem item);
+
+	/**
+	 * Get the ListType of this ListDecorator.
+	 * 
+	 * @return the ListType of this ListDecorator.
+	 */
+	public ListType getListType();
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListItem.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListItem.java
new file mode 100644
index 0000000..18194da
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/ListItem.java
@@ -0,0 +1,351 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.Iterator;
+
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.text.list.ListDecorator.ListType;
+import org.w3c.dom.Node;
+
+/**
+ * ListItem represents an item in a list. ListItem can have text content or sub
+ * List.
+ * 
+ * @since 0.4
+ */
+public class ListItem implements ListContainer {
+
+	// <text:list-item>
+	private TextListItemElement listItemElement;
+	private ListDecorator paragraphDecorator;
+	private ListContainerImpl listContainerImpl = new ListContainerImpl();
+
+	/**
+	 * Constructor with list item element only.
+	 * 
+	 * @param element
+	 *            the list item odf element
+	 */
+	ListItem(TextListItemElement element) {
+		this(element, null);
+	}
+
+	/**
+	 * Constructor with item content set
+	 * 
+	 * @param element
+	 *            the list item odf element
+	 * @param content
+	 *            item text content
+	 */
+	ListItem(TextListItemElement element, String content) {
+		listItemElement = element;
+		setTextContent(content);
+	}
+
+	/**
+	 * Get the instance of TextListItemElement which represents this list item.
+	 * 
+	 * @return the instance of TextListItemElement
+	 */
+	public TextListItemElement getOdfElement() {
+		return listItemElement;
+	}
+
+	/**
+	 * Get item text content. If this item has a List, its content is not
+	 * included.
+	 * 
+	 * @return the text content of this item
+	 */
+	public String getTextContent() {
+		Node child = listItemElement.getFirstChild();
+		while (child != null) {
+			if (child instanceof TextPElement) {
+				return child.getTextContent();
+			}
+			child = child.getNextSibling();
+		}
+		return null;
+	}
+
+	/**
+	 * Set item text content.
+	 * 
+	 * @param content
+	 *            item text content.
+	 */
+	public void setTextContent(String content) {
+		if (content != null) {
+			Node child = listItemElement.getFirstChild();
+			Node positionNode = null;
+			TextPElement pElement = null;
+			while (child != null) {
+				if (child instanceof TextNumberElement) {
+					positionNode = child.getNextSibling();
+					child = child.getNextSibling();
+				} else if ((child instanceof TextPElement) && (pElement == null)) {
+					pElement = (TextPElement) child;
+					child = child.getNextSibling();
+				} else if ((child instanceof TextListElement) && (positionNode == null)) {
+					positionNode = child;
+					child = child.getNextSibling();
+				} else {
+					Node tmp = child;
+					child = child.getNextSibling();
+					listItemElement.removeChild(tmp);
+				}
+			}
+			if (pElement == null) {
+				if (positionNode == null) {
+					pElement = listItemElement.newTextPElement();
+				} else {
+					pElement = ((OdfFileDom) listItemElement.getOwnerDocument()).newOdfElement(TextPElement.class);
+					listItemElement.insertBefore(pElement, positionNode);
+				}
+			}
+			pElement.setTextContent(content);
+			if (paragraphDecorator != null) {
+				paragraphDecorator.decorateListItem(this);
+			} else {
+				// paragraphDecorator is null when the owner List is constructed
+				// by List(TextListElement).
+				Node previousSibling = listItemElement.getPreviousSibling();
+				String pElementStyleName = null;
+				while (previousSibling != null) {
+					if (previousSibling instanceof TextListItemElement) {
+						Node previousChild = previousSibling.getFirstChild();
+						while (previousChild != null) {
+							if (previousChild instanceof TextPElement) {
+								TextPElement previousPElement = (TextPElement) previousChild;
+								pElementStyleName = previousPElement.getTextStyleNameAttribute();
+								break;
+							}
+							previousChild = previousChild.getNextSibling();
+						}
+						break;
+					}
+					previousSibling = previousSibling.getPreviousSibling();
+				}
+				if (pElementStyleName != null) {
+					pElement.setTextStyleNameAttribute(pElementStyleName);
+				}
+
+			}
+		}
+	}
+
+	/**
+	 * Remove this item from its owner list.
+	 */
+	public void remove() {
+		Node parentElement = listItemElement.getParentNode();
+		OdfFileDom ownerDocument = (OdfFileDom) listItemElement.getOwnerDocument();
+		Document doc = (Document) ownerDocument.getDocument();
+		doc.removeElementLinkedResource(listItemElement);
+		parentElement.removeChild(listItemElement);
+	}
+
+	/**
+	 * Get the start number of this item.
+	 * <p>
+	 * A value can be specified that restarts numbering of a list at the current
+	 * item. This feature can only be applied to items in a list with a
+	 * numbering list style.
+	 * 
+	 * @return the start number of this item. If there is no start number
+	 *         setting on this item or the owner list is not a numbering list,
+	 *         <code>null</code> will be returned.
+	 */
+	public Integer getStartNumber() {
+		if (getOwnerList().getType() == ListType.NUMBER) {
+			return listItemElement.getTextStartValueAttribute();
+		}
+		return null;
+	}
+
+	/**
+	 * Set the start number of this item.
+	 * <p>
+	 * A value can be specified that restarts numbering of a list at the current
+	 * item. This feature can only be applied to items in a list with a
+	 * numbering list style.
+	 * 
+	 * @param number
+	 *            the start number to be set.
+	 * @throws IllegalArgumentException if <code>number < 0</code>.
+	 */
+	public void setStartNumber(Integer number) {
+		if (number < 0) {
+			throw new IllegalArgumentException("start number should be a non-negative integer.");
+		}
+		if (getOwnerList().getType() == ListType.NUMBER) {
+			listItemElement.setTextStartValueAttribute(number);
+		}
+	}
+
+	/**
+	 * Get the number format of this item.
+	 * <p>
+	 * List item can contain the text of a formatted number which is present
+	 * when a list style is applied to an element whose corresponding list level
+	 * style specifies that the list label is a number. This text may be used by
+	 * consumers that do not support the automatic generation of numbering but
+	 * should be ignored by consumers that do support it.
+	 */
+	public String getNumberFormat() {
+		String format = null;
+		if (getOwnerList().getType() == ListType.NUMBER) {
+			Node child = listItemElement.getFirstChild();
+			if ((child != null) && (child instanceof TextNumberElement)) {
+				format = ((TextNumberElement) child).getTextContent();
+			}
+		}
+		return format;
+	}
+
+	/**
+	 * Set the number format of this item.
+	 * <p>
+	 * List item can contain the text of a formatted number which is present
+	 * when a list style is applied to an element whose corresponding list level
+	 * style specifies that the list label is a number. This text may be used by
+	 * consumers that do not support the automatic generation of numbering but
+	 * should be ignored by consumers that do support it.
+	 * 
+	 * @param format
+	 *            the number format to be set.
+	 */
+	public void setNumberFormat(String format) {
+		if (getOwnerList().getType() == ListType.NUMBER) {
+			TextNumberElement textNumberElement = null;
+			Node child = listItemElement.getFirstChild();
+			if (child == null) {
+				textNumberElement = listItemElement.newTextNumberElement();
+			} else {
+				if (child instanceof TextNumberElement) {
+					textNumberElement = (TextNumberElement) child;
+				} else {
+					textNumberElement = ((OdfFileDom) listItemElement.getOwnerDocument())
+							.newOdfElement(TextNumberElement.class);
+					listItemElement.insertBefore(textNumberElement, child);
+				}
+			}
+			textNumberElement.setTextContent(format);
+		}
+	}
+
+	/**
+	 * Answers the index of the item in its owner list.
+	 * 
+	 * @return index of the item.
+	 */
+	public int getIndex() {
+		Node firstNode = listItemElement.getParentNode().getFirstChild();
+		int i = 0;
+		while (firstNode != null) {
+			if (firstNode instanceof TextListItemElement) {
+				if (firstNode == listItemElement) {
+					break;
+				} else {
+					i++;
+				}
+			}
+			firstNode = firstNode.getNextSibling();
+		}
+		return i;
+	}
+
+	/**
+	 * Get the List which contains this ListItem.
+	 */
+	public List getOwnerList() {
+		Node parent = listItemElement.getParentNode();
+		if (parent instanceof TextListElement) {
+			return new List((TextListElement) parent);
+		}
+		return null;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder strBuilder = new StringBuilder();
+		String numberFormat = getNumberFormat();
+		String splitStr = "";
+		if (numberFormat != null) {
+			strBuilder.append(numberFormat);
+			strBuilder.append(" ");
+			splitStr = "\n";
+		}
+		String textContent = getTextContent();
+		if (textContent != null) {
+			strBuilder.append(textContent);
+			splitStr = "\n";
+		}
+		Iterator<List> lists = getListIterator();
+		while (lists.hasNext()) {
+			strBuilder.append(splitStr);
+			strBuilder.append(lists.next().toString());
+		}
+		return strBuilder.toString();
+	}
+
+	public OdfElement getListContainerElement() {
+		return listContainerImpl.getListContainerElement();
+	}
+	
+	public List addList() {
+		return listContainerImpl.addList();
+	}
+
+	public List addList(ListDecorator decorator) {
+		return listContainerImpl.addList(decorator);
+	}
+	
+	public void clearList() {
+		listContainerImpl.clearList();
+	}
+	
+	public Iterator<List> getListIterator() {
+		return listContainerImpl.getListIterator();
+	}
+
+	public boolean removeList(List list) {
+		return listContainerImpl.removeList(list);
+	}
+
+	private class ListContainerImpl extends AbstractListContainer {
+		public OdfElement getListContainerElement() {
+			return listItemElement;
+		}
+	}
+
+	// set ListDecorator for decorating item, only used by List.
+	void setParagraphDecorator(ListDecorator decorator) {
+		paragraphDecorator = decorator;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java
new file mode 100644
index 0000000..cdced8b
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java
@@ -0,0 +1,155 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+
+/**
+ * NumberDecorator is an implementation of the ListDecorator interface,
+ * decorates a given List as number list. User can extend this class and realize
+ * their own list and list item style. For example, set a specifies list item
+ * with red color.
+ * <p>
+ * A NumberDecorator can be reused in the same Document.
+ * 
+ * @since 0.4
+ */
+public class NumberDecorator implements ListDecorator {
+
+	private static String[] DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES = { null, "0.501cm", "1cm", "1.501cm", "2cm",
+			"2.501cm", "3.001cm", "3.502cm", "4.001cm", "4.502cm" };
+	private static String DEFAULT_TEXT_MIN_LABEL_WIDTH = "0.499cm";
+	private static String DEFAULT_FONT_NAME = "Tahoma";
+	private static String DEFAULT_NUM_FORMAT = "1";
+	private static String DEFAULT_NUM_SUFFIX = ".";
+	private static String DEFAULT_NAME = "Simple_Default_Number_List";
+
+	private OdfTextListStyle listStyle;
+	private OdfStyle paragraphStyle;
+	private OdfOfficeAutomaticStyles styles;
+
+	/**
+	 * Constructor with Document.
+	 * 
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 */
+	public NumberDecorator(Document doc) {
+		OdfContentDom contentDocument;
+		try {
+			contentDocument = doc.getContentDom();
+			styles = contentDocument.getAutomaticStyles();
+			OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+			listStyle = styles.getListStyle(DEFAULT_NAME);
+			// create number style
+			if (listStyle == null) {
+				listStyle = styles.newListStyle();
+				// <style:style style:name="Numbering_20_Symbols"
+				// style:display-name="Numbering Symbols" style:family="text" />
+				getOrCreateStyleByName(documentStyles, styles, "Numbering_20_Symbols", OdfStyleFamily.Text);
+				for (int i = 0; i < 10; i++) {
+					TextListLevelStyleNumberElement listLevelElement = listStyle.newTextListLevelStyleNumberElement(
+							DEFAULT_NUM_FORMAT, i + 1);
+					// get from default style element
+					listLevelElement.setTextStyleNameAttribute("Numbering_20_Symbols");
+					listLevelElement.setStyleNumSuffixAttribute(DEFAULT_NUM_SUFFIX);
+					StyleListLevelPropertiesElement styleListLevelPropertiesElement = listLevelElement
+							.newStyleListLevelPropertiesElement();
+					if (DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES[i] != null) {
+						styleListLevelPropertiesElement
+								.setTextSpaceBeforeAttribute(DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES[i]);
+					}
+					styleListLevelPropertiesElement.setTextMinLabelWidthAttribute(DEFAULT_TEXT_MIN_LABEL_WIDTH);
+					StyleTextPropertiesElement styleTextPropertiesElement = listLevelElement
+							.newStyleTextPropertiesElement("true");
+					styleTextPropertiesElement.setStyleFontNameAttribute(DEFAULT_FONT_NAME);
+				}
+				// listStyle.setStyleNameAttribute(DEFAULT_NAME);
+			}
+			// create default paragraph style
+			// <style:style style:name="P3" style:family="paragraph"
+			// style:parent-style-name="Default_20_Text"
+			// style:list-style-name="L1"
+			// />
+			paragraphStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+			// <style:style style:name="Default_20_Text"
+			// style:display-name="Default Text" style:family="paragraph"
+			// style:class="text" />
+			// <style:style style:name="Standard" style:family="paragraph"
+			// style:class="text" />
+			getOrCreateStyleByName(documentStyles, styles, "Default_20_Text", OdfStyleFamily.Paragraph);
+			paragraphStyle.setStyleParentStyleNameAttribute("Default_20_Text");
+			paragraphStyle.setStyleListStyleNameAttribute(listStyle.getStyleNameAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(NumberDecorator.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	public void decorateList(List list) {
+		TextListElement listElement = list.getOdfElement();
+		listElement.setTextStyleNameAttribute(listStyle.getStyleNameAttribute());
+	}
+
+	public void decorateListItem(ListItem item) {
+		TextListItemElement listItemElement = item.getOdfElement();
+		Node child = listItemElement.getFirstChild();
+		while (child != null) {
+			if (child instanceof TextPElement) {
+				TextPElement pElement = (TextPElement) child;
+				pElement.setTextStyleNameAttribute(paragraphStyle.getStyleNameAttribute());
+			}
+			child = child.getNextSibling();
+		}
+	}
+
+	public ListType getListType() {
+		return ListType.NUMBER;
+	}
+
+	private OdfStyle getOrCreateStyleByName(OdfOfficeStyles documentStyles, OdfOfficeAutomaticStyles styles,
+			String styleName, OdfStyleFamily styleFamily) {
+		OdfStyle odfStyle = documentStyles.getStyle(styleName, styleFamily);
+		if (odfStyle == null) {
+			styles.getStyle(styleName, styleFamily);
+		}
+		if (odfStyle == null) {
+			odfStyle = styles.newStyle(styleFamily);
+			odfStyle.setStyleNameAttribute(styleName);
+			odfStyle.setStyleDisplayNameAttribute(styleName);
+		}
+		return odfStyle;
+	}
+}
diff --git a/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/OutLineDecorator.java b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/OutLineDecorator.java
new file mode 100644
index 0000000..660edc7
--- /dev/null
+++ b/trunk/simple/src/main/java/org/odftoolkit/simple/text/list/OutLineDecorator.java
@@ -0,0 +1,159 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleListLevelPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListItemElement;
+import org.odftoolkit.odfdom.dom.element.text.TextListLevelStyleNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.simple.Document;
+import org.w3c.dom.Node;
+
+/**
+ * OutLineDecorator is an implementation of the ListDecorator interface,
+ * decorates a given List as a special number list with outline. User can extend
+ * this class and realize their own list and list item style. For example, set a
+ * specifies list item with red color.
+ * <p>
+ * An OutLineDecorator can be reused in the same Document.
+ * 
+ * @since 0.4
+ */
+public class OutLineDecorator implements ListDecorator {
+
+	private static String[] DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES = { null, "0.501cm", "1cm", "1.501cm", "2cm",
+			"2.501cm", "3.001cm", "3.502cm", "4.001cm", "4.502cm" };
+	private static String DEFAULT_TEXT_MIN_LABEL_WIDTH = "0.499cm";
+	private static String DEFAULT_FONT_NAME = "Tahoma";
+	private static String DEFAULT_NUM_FORMAT = "1";
+	private static String DEFAULT_NUM_SUFFIX = ".";
+	private static String DEFAULT_NAME = "Simple_Default_Outline_List";
+
+	private OdfTextListStyle listStyle;
+	private OdfStyle paragraphStyle;
+	private OdfOfficeAutomaticStyles styles;
+
+	/**
+	 * Constructor with Document.
+	 * 
+	 * @param doc
+	 *            the Document which this OutLineDecorator will be used on.
+	 */
+	public OutLineDecorator(Document doc) {
+		OdfContentDom contentDocument;
+		try {
+			contentDocument = doc.getContentDom();
+			styles = contentDocument.getAutomaticStyles();
+			OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+			listStyle = styles.getListStyle(DEFAULT_NAME);
+			// create outline style
+			if (listStyle == null) {
+				listStyle = styles.newListStyle();
+				// <style:style style:name="Numbering_20_Symbols"
+				// style:display-name="Numbering Symbols" style:family="text" />
+				getOrCreateStyleByName(documentStyles, styles, "Numbering_20_Symbols", OdfStyleFamily.Text);
+				for (int i = 0; i < 10; i++) {
+					TextListLevelStyleNumberElement listLevelElement = listStyle.newTextListLevelStyleNumberElement(
+							DEFAULT_NUM_FORMAT, i + 1);
+					// get from default style element
+					listLevelElement.setTextStyleNameAttribute("Numbering_20_Symbols");
+					listLevelElement.setStyleNumSuffixAttribute(DEFAULT_NUM_SUFFIX);
+
+					// different from number decorator.
+					listLevelElement.setTextDisplayLevelsAttribute(i + 1);
+
+					StyleListLevelPropertiesElement styleListLevelPropertiesElement = listLevelElement
+							.newStyleListLevelPropertiesElement();
+					if (DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES[i] != null) {
+						styleListLevelPropertiesElement
+								.setTextSpaceBeforeAttribute(DEFAULT_TEXT_SPACE_BEFORE_ATTRIBUTES[i]);
+					}
+					styleListLevelPropertiesElement.setTextMinLabelWidthAttribute(DEFAULT_TEXT_MIN_LABEL_WIDTH);
+					StyleTextPropertiesElement styleTextPropertiesElement = listLevelElement
+							.newStyleTextPropertiesElement("true");
+					styleTextPropertiesElement.setStyleFontNameAttribute(DEFAULT_FONT_NAME);
+				}
+				// listStyle.setStyleNameAttribute(DEFAULT_NAME);
+			}
+			// create default paragraph style
+			// <style:style style:name="P3" style:family="paragraph"
+			// style:parent-style-name="Default_20_Text"
+			// style:list-style-name="L1"
+			// />
+			paragraphStyle = styles.newStyle(OdfStyleFamily.Paragraph);
+			// <style:style style:name="Default_20_Text"
+			// style:display-name="Default Text" style:family="paragraph"
+			// style:class="text" />
+			// <style:style style:name="Standard" style:family="paragraph"
+			// style:class="text" />
+			getOrCreateStyleByName(documentStyles, styles, "Default_20_Text", OdfStyleFamily.Paragraph);
+			paragraphStyle.setStyleParentStyleNameAttribute("Default_20_Text");
+			paragraphStyle.setStyleListStyleNameAttribute(listStyle.getStyleNameAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(OutLineDecorator.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	public void decorateList(List list) {
+		TextListElement listElement = list.getOdfElement();
+		listElement.setTextStyleNameAttribute(listStyle.getStyleNameAttribute());
+	}
+
+	public void decorateListItem(ListItem item) {
+		TextListItemElement listItemElement = item.getOdfElement();
+		Node child = listItemElement.getFirstChild();
+		while (child != null) {
+			if (child instanceof TextPElement) {
+				TextPElement pElement = (TextPElement) child;
+				pElement.setTextStyleNameAttribute(paragraphStyle.getStyleNameAttribute());
+			}
+			child = child.getNextSibling();
+		}
+	}
+
+	public ListType getListType() {
+		return ListType.NUMBER;
+	}
+
+	private OdfStyle getOrCreateStyleByName(OdfOfficeStyles documentStyles, OdfOfficeAutomaticStyles styles,
+			String styleName, OdfStyleFamily styleFamily) {
+		OdfStyle odfStyle = documentStyles.getStyle(styleName, styleFamily);
+		if (odfStyle == null) {
+			styles.getStyle(styleName, styleFamily);
+		}
+		if (odfStyle == null) {
+			odfStyle = styles.newStyle(styleFamily);
+			odfStyle.setStyleNameAttribute(styleName);
+			odfStyle.setStyleDisplayNameAttribute(styleName);
+		}
+		return odfStyle;
+	}
+}
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/chart/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/chart/package.html
new file mode 100644
index 0000000..4a3e004
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/chart/package.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to manipulate chart in ODF text, presentation and spreadsheet document.
+        <!-- Put @see and @since tags down here. -->
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/field/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/field/package.html
new file mode 100644
index 0000000..e44f670
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/field/package.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to manipulate Fields in ODF text document.
+     <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/navigation/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/navigation/package.html
new file mode 100644
index 0000000..331f568
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/navigation/package.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide classes to operate the content and style of the selected text content.
+        
+        <p>
+        Abstract class Navigation represent the navigate action on the specified document, 
+        and user can iterate all the results of this navigation operation. Abstract class
+        Selection describes one result of navigation.
+        
+        <p>
+        The instance of derived navigation class will give the match condition so that user
+        can get the corresponding derived Selection class instance. e.g. TextNavigation class
+        is used to search the specified text content in the document, and TextStyleNavigation
+        class can select the text which match the specified style.
+        <p>
+        TextSelection class which inherits Selection represents a snippet text of the 
+        paragraph/heading/header/footer, it can be represent by the belonged element and the 
+        text index of this element. User can get delete this result, or replace this text with 
+        other content, add href link for this selections, append the italic style for it and paste 
+        this selection at the front of or the end of other selction.
+        
+        <p>
+        CellSelection inherits TextSelection. It provides a new function to not only replace text 
+        but also reset the cell values.
+        <p>
+       
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/package.html
new file mode 100644
index 0000000..77043cf
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/common/package.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+</head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide text extraction and fields methods to all ODF documents and elements.
+        
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
\ No newline at end of file
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/draw/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/draw/package.html
new file mode 100644
index 0000000..8b7440f
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/draw/package.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+</head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide high level methods to manipulate draw frame and text box.
+        
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
\ No newline at end of file
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/meta/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/meta/package.html
new file mode 100644
index 0000000..f371405
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/meta/package.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide classes to access the metadata of ODF documents. (Incubator Status)
+        <p>
+	This package provides very simple fuctions to set and get the properties of metadata in ODF documents. 
+	The fuctions to access metadata about auto-reload, template and hyperlink behaviour are not completed.
+	       
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/package.html
new file mode 100644
index 0000000..11d3e44
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/package.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+</head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide high level methods to frequently used ODF documents.
+        
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
\ No newline at end of file
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/presentation/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/presentation/package.html
new file mode 100644
index 0000000..a7d2e4f
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/presentation/package.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+</head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide high level methods to ODF presentation documents.
+        
+        <p>Till now, methods to change slide properties and set notes are provided. </p>
+        
+        <p>As to the methods to get/add/delete slides, please refer to org.odftoolkit.simple.PresentationDocument. </p>
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
\ No newline at end of file
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/style/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/style/package.html
new file mode 100644
index 0000000..d84bc17
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/style/package.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to handle style definitions in ODF document.
+        
+	<p>
+	There are two kinds of classes related with style handling in this package: 
+	common used classes from user perspective, and common used style properties from ODF specification perspective.  
+	</p>  
+	<p>
+	Common used classes, such as Font and Border, are defined for users to easily set/get properties. 
+	</p>  
+	<p>
+	Common used style properties, such as TextProperties and TableCellProperties, directly manipulate the style properties defined in ODF document.
+	The users, who are familiar with ODF specification, can use these classes to achieve advanced functions.
+	</p>  
+	<p>
+	More classes and functions will be added in future.
+	</p>  
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/table/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/table/package.html
new file mode 100644
index 0000000..8b01739
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/table/package.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+Licensed to the Apache 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.
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to manipulate table in ODF text and spreadsheet document.
+        
+	<p>
+	Table is a common used feature in ODF. 
+	This package provides convenient methods to manipulate table feature and its child features, such as row, column, cell, cell range.
+	<p>
+	Table represents table in ODF. It provides methods to new a table, delete a table, get rows, 
+	columns, and cells of a table, new a cell range, insert and delete rows and columns, and so on.
+	<p>
+	TableRow and OdfTableColumn represents row and column in ODF. It provides methods to get cells, 
+	get next and previous row and column, set properties of rows and columns, and so on.
+	<p>
+	TableCell represents cell in ODF. It provides many methods to set the properties and values of a cell, 
+	such as horizontal alignment, vertical alignment, value, formula, value format, and so on.
+	<p>
+	TableRange represents a range of cells in ODF. It provides a method to merge a range of cells to a single cell, and some other methods too.
+	<p>
+	CellStyleHandler provides methods to handle styles, for example, defining font and border styles.
+	<p>
+	CellValueAdapter and DefaultCellValueAdapter provide functions to adapt string content to a more proper cell value type as need.
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/text/list/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/text/list/package.html
new file mode 100644
index 0000000..5a07f74
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/text/list/package.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ /************************************************************************
+ *
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+ ************************************************************************/
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to handle list in ODF document.
+        
+        <p>
+        Class List represents a list. It can contain list header, followed by any number of list item elements.
+        ListItem represents an item in a list. ListItem represents list item, which can have text content or sub List.
+        <p>
+        ListContainer is a container which maintains List(s) as element(s). List(s) can be added, removed and iterated in this container.
+        All of the components which need to hold a List, must implement this interface. TextDocument is a typical ListContainer.
+        <p>
+        ListDecorator is a decorator which decides how to decorate a List and its ListItems. BulletDecorator, NumberDecorator, ImageDecorator
+        and OutLineDecorator are default implementations.
+        <p>
+        <!-- Put @see and @since tags down here. -->
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/org/odftoolkit/simple/text/package.html b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/text/package.html
new file mode 100644
index 0000000..c379968
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/org/odftoolkit/simple/text/package.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+        <!--
+
+  @(#)package.html	1.60 98/01/27
+
+ 
+Licensed to the Apache 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.
+
+
+
+-->
+    </head>
+    <body bgcolor="white">
+        <!--
+        ##### THIS IS THE TEMPLATE FOR THE PACKAGE DOC COMMENTS. #####
+        ##### TYPE YOUR PACKAGE COMMENTS HERE.  BEGIN WITH A     #####
+        ##### ONE-SENTENCE SUMMARY STARTING WITH A VERB LIKE:    #####
+        -->
+        
+        
+        Provide convenient methods to manipulate frequently used structures in ODF text document, such as list and section.
+        
+    </body>
+</html>
diff --git a/trunk/simple/src/main/javadoc/overview.html b/trunk/simple/src/main/javadoc/overview.html
new file mode 100644
index 0000000..f33caed
--- /dev/null
+++ b/trunk/simple/src/main/javadoc/overview.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+    <head>
+<!--
+  
+Licensed to the Apache 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.
+
+-->
+    </head>
+    <body>
+
+		<div class="wikiMainBody"><p><br />
+				The Simple Java API for ODF builds upon the lower-level ODFDOM DOM and Package layer to provide an easy-to-use, high-level Java API for creating, modifying and extracting data from Open Document Format documents.
+			</p>
+			<p>
+			<div id='toc' style='border:solid #DEDEDF 1px;background:#EEE;padding:10px;'>
+
+				<div id='toctitle' style='padding-bottom:5px;font-weight:bold;'>
+
+					<span>Simple Java API for ODF</span>
+				</div>
+				<div id='toccontents' style='list-style-type:none;'><ul><li>1 <a href='#The_ODFDOM_Layers'>Pakages introduction</a></li>
+				<li>2 <a href="#Further_Information">Further information</a></li>
+						</ul></div>
+			</div><h1><a name='The_ODFDOM_Layers'>Packages introduction</a></h1>
+			<p>
+				The design principle is &quot;make users easily to locate the functions they want&quot;. </p>
+				<h3>Document methods</h3>
+				<p>For each frequently used document type, there is a class under package &quot;org.odftoolkit.simple&quot; to provide high level methods to manipulate this kind of documents.</p>
+				<h3>Specific methods for different mimetype</h3>
+				<p>For each frequently used mimetype, their is a package to contain the high level methods for this kind of mimetype, such as org.odftoolkit.simple.text and org.odftoolkit.simple.presentation. The packages for different mimetype contain:
+				<div>
+				<ul>
+				<li>The frequently used features functions, such as org.odftoolkit.simpleodf.chart will contain the function related with chart, org.odftoolkit.simpleodf.text will contain the function related with text content.</li> 
+<li>Specific functions for different mimetypes, for example, the navigation API is put in package &quot;org.odftoolkit.simpleodf.text.search&quot;.</li>
+</ul>
+</div></p> 
+<h3>Features methods</h3>
+<p>there are some packages defined for important common features available for all kinds of documents, such as table, meta and style. The packages for common features will contain the methods for specific features.</p>
+<h3>Common methods</h3>
+<p>There is another package named "org.odftoolkit.simpleodf.common", which contains functions that are not related with a specific document type nor a specific feature. For example, the text extractor functions are put in this package.</p>
+
+
+
+
+<h2><a name='Further_Information'>Further Information</a></h2>
+For further Information about Simple Java API for ODF and related topics please visit following pages:
+<ol>
+	<li><a href="http://incubator.apache.org/odftoolkit/simple/index.html">Simple Java API</a></li>
+	<li><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.html">OpenDocument v1.2 specification - part 1: OpenDocument Schema</a></li>
+	<li><a href="http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.html">OpenDocument v1.2 specification - part 3: Packages</a></li>
+	<li><a href="http://incubator.apache.org/odftoolkit/odfdom/index.html">ODFDOM</a></li>
+</ol>
+</p>
+</div>
+</body>
+</html>
diff --git a/trunk/simple/src/sample/org/apache/odftoolkit/simple/sample/ApacheLicenceMetaInfo.java b/trunk/simple/src/sample/org/apache/odftoolkit/simple/sample/ApacheLicenceMetaInfo.java
new file mode 100644
index 0000000..8562084
--- /dev/null
+++ b/trunk/simple/src/sample/org/apache/odftoolkit/simple/sample/ApacheLicenceMetaInfo.java
@@ -0,0 +1,93 @@
+/**********************************************************************
+ * 
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ **********************************************************************/
+package org.apache.odftoolkit.simple.sample;
+
+import java.io.File;
+import java.io.FilenameFilter;
+
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.meta.Meta;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaValueTypeAttribute.Value;
+
+/**
+ * This is a sample which demos how to add Apache Licence info as user defined
+ * mata to ODF documents automatically. This will be a useful function to have
+ * in the future. As we add new unit tests and new test files, we will need to
+ * add license info to those files. This could be done via code like this.
+ * 
+ * Maybe even a 2nd class that will test an ODF file to see if it has the
+ * license in it, or one that will return the license. In the future, after we
+ * release, we could share some code with the Apache RAT project, so they could
+ * automate the testing of ODF files in projects, rather than treat them like
+ * binaries, as they do today. This would help other projects that use ODF
+ * documents, like the OpenOffice project.
+ */
+public class ApacheLicenceMetaInfo {
+	public static void main(String[] args) {
+		String patch = "C:\\resources";
+		File directry = new File(patch);
+		File[] files = directry.listFiles(new FilenameFilter() {
+			@Override
+			public boolean accept(File path, String name) {
+				if (name.contains(".od") || name.contains(".ot")) {
+					return true;
+				} else {
+					return false;
+				}
+			}
+		});
+		String license = "Licensed to the Apache Software Foundation (ASF) under one \n"
+				+ "or more contributor license agreements.  See the NOTICE file \n"
+				+ "distributed with this work for additional information \n"
+				+ "regarding copyright ownership.  The ASF licenses this file \n"
+				+ "to you under the Apache License, Version 2.0 (the \n"
+				+ "\"License\"); you may not use this file except in compliance \n"
+				+ "with the License.  You may obtain a copy of the License at \n"
+				+ "\n"
+				+ " http://www.apache.org/licenses/LICENSE-2.0 \n"
+				+ "\n"
+				+ "Unless required by applicable law or agreed to in writing, \n"
+				+ "software distributed under the License is distributed on an \n"
+				+ "\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY \n"
+				+ "KIND, either express or implied.  See the License for the \n"
+				+ "specific language governing permissions and limitations \n"
+				+ "under the License.";
+		for (File file : files) {
+			try {
+				Document doc = Document.loadDocument(file);
+				OdfFileDom metadom = doc.getMetaDom();
+				Meta metadata = new Meta(metadom);
+				String key = "License";
+				metadata.removeUserDefinedDataByName(key);
+				// org.odftoolkit.odfdom.dom.attribute.meta.MetaValueTypeAttribute.Value
+				metadata.setUserDefinedData(key, Value.STRING.toString(),
+						license);
+				doc.save(file);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/ChartTemplateTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/ChartTemplateTest.java
new file mode 100644
index 0000000..a7c3c7b
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/ChartTemplateTest.java
@@ -0,0 +1,155 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of chart.
+ */
+public class ChartTemplateTest {
+	
+	private static final Logger LOG = Logger.getLogger(ChartTemplateTest.class.getName());
+	private static final String TEST_CHART_TEMPLATE = "/chartTestTemplate.otc";
+
+	@Test
+	public void testLoadingAChartTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_CHART_TEMPLATE));
+		Assert.assertEquals(Document.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingAChartTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_CHART_TEMPLATE));
+		File destination = File.createTempFile("simple-test", ".otc");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewChartTemplate() throws Exception {
+		Document document = ChartDocument.newChartTemplateDocument();
+		Assert.assertEquals(Document.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+
+		Assert.assertEquals(Document.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("simple-test", ".otc");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof ChartDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfChartDocument() throws Exception {
+		ChartDocument document = ChartDocument.newChartDocument();
+		document.changeMode(ChartDocument.OdfMediaType.CHART_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.CHART_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+
+		document = ChartDocument.newChartTemplateDocument();
+		document.changeMode(ChartDocument.OdfMediaType.CHART);
+		Assert.assertEquals(Document.OdfMediaType.CHART.getMediaTypeString(), document.getPackage().getMediaTypeString());
+	}
+	
+	@Test
+	public void testGetOdfMediaType() throws Exception {
+		
+		try {
+			Document.OdfMediaType chartType = ChartDocument.OdfMediaType.getOdfMediaType("CHART");
+			Assert.assertEquals("CHART", chartType.name());
+			Assert.assertEquals("application/vnd.oasis.opendocument.chart", chartType.getMediaTypeString());
+			Assert.assertEquals("odc", chartType.getSuffix());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+	
+	@Test
+	public void testGetMediaTypeString() throws Exception {
+		try {
+			ChartDocument.OdfMediaType odfMediaTypeChart = ChartDocument.OdfMediaType.valueOf(ChartDocument.OdfMediaType.class, ChartDocument.OdfMediaType.CHART.name());
+			String MediaType = odfMediaTypeChart.getMediaTypeString();
+			Assert.assertEquals("application/vnd.oasis.opendocument.chart", MediaType);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testLoadDocumentInputStream() throws Exception {
+		try {
+			InputStream inStream = this.getClass().getResourceAsStream(TEST_CHART_TEMPLATE);
+			ChartDocument chardoc = ChartDocument.loadDocument(inStream);
+			Assert.assertNotNull(chardoc);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+	
+	@Test
+	public void testLoadDocumentFilePath() throws Exception {
+		try {
+			String filePath = this.getClass().getResource(TEST_CHART_TEMPLATE).getPath();
+			ChartDocument chardoc = ChartDocument.loadDocument(filePath);
+			Assert.assertNotNull(chardoc);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testLoadDocumentFile() throws Exception {
+		try {
+			String filePath = this.getClass().getResource(TEST_CHART_TEMPLATE).getPath();
+			File filedoc = new File(filePath);
+			Assert.assertNotNull(filedoc);
+			ChartDocument chardoc = ChartDocument.loadDocument(filedoc);
+			Assert.assertNotNull(chardoc);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/DocumentCreationTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/DocumentCreationTest.java
new file mode 100644
index 0000000..4032f78
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/DocumentCreationTest.java
@@ -0,0 +1,479 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.text.TextAnchorTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextSpan;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfPackageDocument;
+import org.odftoolkit.odfdom.pkg.OdfXMLFactory;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class DocumentCreationTest {
+
+	private static final Logger LOG = Logger.getLogger(DocumentCreationTest.class.getName());
+	private static final String TEST_FILE_FOLDER = ResourceUtilities.getTestOutputFolder();
+	private static final String TEST_FILE_EMBEDDED = TEST_FILE_FOLDER + "testEmbeddedDoc.odt";
+	private static final String TEST_PIC = "testA.jpg";
+	private static final String TEST_SPAN_TEXT = " Find Truth!!!";
+	private static final String TEST_FILE_ACCESS_EMBEDDED = TEST_FILE_FOLDER + "TestAccess_EmbeddedDocument.odt";
+	private static final String TEST_FILE_EMBEDDED_EMBEDDED = TEST_FILE_FOLDER + "TestAccess_EmbeddedinEmbedded.odt";
+	private static final String TEST_FILE_SAVE_EMBEDDED = TEST_FILE_FOLDER + "testSaveEmbeddedDoc.odt";
+	private static final String TEST_FILE_SAVE_EMBEDDED_OUT = TEST_FILE_FOLDER + "TestSaveEmbeddedDoc_newName.odt";
+	private static final String TEST_FILE_SAVE_EMBEDDED_OUT2 = TEST_FILE_FOLDER + "TestSaveEmbeddedDoc2.odt";
+	private static final String TEST_FILE_SAVE_QUEER_PATH = TEST_FILE_FOLDER + "TestSaveQueerEmbeddedPathDoc1.odt";
+	private static final String CORRUPTED_MIMETYPE_DOC = TEST_FILE_FOLDER + "CorruptedMimetypeDoc.odt";
+	private static final String CORRUPTED_MIMETYPE_DOC_OUT = TEST_FILE_FOLDER + "TestSaveCorruptedMimetypeDoc.odt";
+	private static final String CORRUPTED_MIMETYPE_CHART = TEST_FILE_FOLDER + "CorruptedMimetypeChart.odc";
+	private static final String CORRUPTED_MIMETYPE_CHART_OUT = TEST_FILE_FOLDER + "TestSaveCorruptedMimetypeChart.odc";
+
+	@BeforeClass
+	public static void createEmptyDocs() throws Exception {
+		TextDocument odtDoc1 = TextDocument.newTextDocument();
+		TextDocument odtDoc2 = TextDocument.newTextDocument();
+		odtDoc2.getContentDom();
+		odtDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfTextDocument.odt"));
+
+		GraphicsDocument odgDoc1 = GraphicsDocument.newGraphicsDocument();
+		GraphicsDocument odgDoc2 = GraphicsDocument.newGraphicsDocument();
+		odgDoc2.getContentDom();
+		odgDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfGraphicsDocument.odg"));
+
+		SpreadsheetDocument odsDoc1 = SpreadsheetDocument.newSpreadsheetDocument();
+		SpreadsheetDocument odsDoc2 = SpreadsheetDocument.newSpreadsheetDocument();
+		odsDoc2.getContentDom();
+		odsDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfSpreadsheetDocument.ods"));
+
+		PresentationDocument odpDoc1 = PresentationDocument.newPresentationDocument();
+		PresentationDocument odpDoc2 = PresentationDocument.newPresentationDocument();
+		odpDoc2.getContentDom();
+		odpDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfPresentationDocument.odp"));
+
+		ChartDocument odcDoc1 = ChartDocument.newChartDocument();
+		ChartDocument odcDoc2 = ChartDocument.newChartDocument();
+		odcDoc2.getContentDom();
+		odcDoc1.save(ResourceUtilities.newTestOutputFile("TestEmpty_OdfChartDocument.odc"));
+
+		// loads the ODF document package from the path
+		OdfPackage pkg = OdfPackage.loadPackage(ResourceUtilities
+				.getTestResourceAsStream("TestEmpty_OdfTextDocument.odt"));
+
+		// loads the images from the URLs and inserts the image in the
+		// package, adapting the manifest
+		pkg.insert(ResourceUtilities.getURI(TEST_PIC), "Pictures/" + TEST_PIC, null);
+		// Deactivated as test fail, when test machine is not online
+		// (painful for offline work)
+		// pkg.insert(new
+		// URI("http://odftoolkit.org/attachments/wiki_images/odftoolkit/Table_fruits_diagramm.jpg"),
+		// "someweiredname/tableandfruits.jpg", null);
+		pkg.save(ResourceUtilities.newTestOutputFile("simple-wiki-package.odt"));
+
+		// loads the ODF document from the path
+		Document odfDoc = Document.loadDocument(ResourceUtilities
+				.getTestResourceAsStream("TestEmpty_OdfTextDocument.odt"));
+
+		// get the ODF content as DOM tree representation
+		OdfFileDom odfContent = odfDoc.getContentDom();
+
+		// // W3C XPath initialization ''(JDK5 functionality)'' - XPath is
+		// the path within the XML file
+		// // (Find XPath examples here:
+		// http://www.w3.org/TR/xpath#path-abbrev)
+		XPath xpath2 = odfContent.getXPath();
+
+		// receiving the first paragraph "//text:p[1]" ''(JDK5
+		// functionality)''
+		TextPElement para = (TextPElement) xpath2.evaluate("//text:p[1]", odfContent, XPathConstants.NODE);
+
+		// adding an image - expecting the user to know that
+		// an image consists always of a 'draw:image' and a 'draw:frame'
+		// parent
+
+		// FUTURE USAGE:
+		// para.createDrawFrame().createDrawImage("/myweb.org/images/myHoliday.png",
+		// "/Pictures/myHoliday.png");
+		// Child access methods are still not part of the v0.6.x releases
+		// CURRENT USAGE:
+		OdfDrawFrame odfFrame = (OdfDrawFrame) OdfXMLFactory.newOdfElement(odfContent,
+				DrawFrameElement.ELEMENT_NAME);
+		para.appendChild(odfFrame);
+		OdfDrawImage odfImage = (OdfDrawImage) OdfXMLFactory.newOdfElement(odfContent, OdfDrawImage.ELEMENT_NAME);
+		odfFrame.appendChild(odfImage);
+		odfImage.newImage(ResourceUtilities.getURI(TEST_PIC));
+
+		OdfDrawImage odfImage2 = (OdfDrawImage) OdfXMLFactory.newOdfElement(odfContent, OdfDrawImage.ELEMENT_NAME);
+		odfFrame.appendChild(odfImage2);
+		// Deactivated as test fail, when test machine is not online
+		// (painful for offline work)
+		// odfImage2.newImage(new
+		// URI("http://odftoolkit.org/attachments/wiki_images/odftoolkit/Table_fruits_diagramm.jpg"));
+		odfDoc.save(ResourceUtilities.newTestOutputFile("simple-wiki-dom.odt"));
+
+	}
+
+	@Test
+	public void createEmbeddedDocs() throws Exception {
+		TextDocument odtDoc1 = TextDocument.newTextDocument();
+
+		odtDoc1.insertDocument(TextDocument.newTextDocument(), "Object1/");
+		odtDoc1.insertDocument(TextDocument.newTextDocument(), "Object2/");
+		odtDoc1.insertDocument(Document.loadDocument(ResourceUtilities
+				.getTestResourceAsStream("TestEmpty_OdfGraphicsDocument.odg")), "Object3");
+		odtDoc1.insertDocument(ChartDocument.newChartDocument(), "Object4");
+		odtDoc1.insertDocument(GraphicsDocument.newGraphicsDocument(), "Object5");
+		odtDoc1.insertDocument(PresentationDocument.newPresentationDocument(), "Object6");
+
+		List<Document> embeddedDocs = odtDoc1.getEmbeddedDocuments();
+		LOG.log(Level.INFO, "Embedded Document count: {0}", embeddedDocs.size());
+		odtDoc1.save(ResourceUtilities.newTestOutputFile("TestCreate_EmbeddedDocuments.odt"));
+
+		Assert.assertTrue(embeddedDocs.size() == 6);
+
+		List<Document> embeddedTextDocs = odtDoc1.getEmbeddedDocuments(Document.OdfMediaType.TEXT);
+		LOG.log(Level.INFO, "Only Embedded Text Docs Size: {0}", embeddedTextDocs.size());
+		Assert.assertTrue(embeddedTextDocs.size() == 2);
+
+		List<Document> embeddedChartDocs = odtDoc1.getEmbeddedDocuments(Document.OdfMediaType.CHART);
+		LOG.log(Level.INFO, "Only Embedded Chart Docs Size: {0}", embeddedChartDocs.size());
+		Assert.assertTrue(embeddedChartDocs.size() == 1);
+
+		Document embeddedObject1 = odtDoc1.getEmbeddedDocument("Object1/");
+		LOG.log(Level.INFO, "Embedded Object1 path: {0}", embeddedObject1.getDocumentPath());
+		LOG.log(Level.INFO, "Embedded Object1 media-type: {0}", embeddedObject1.getMediaTypeString());
+		Assert.assertEquals(embeddedObject1.getMediaTypeString(), Document.OdfMediaType.TEXT.getMediaTypeString());
+
+		Document embeddedObject3 = odtDoc1.getEmbeddedDocument("Object3");
+		LOG.log(Level.INFO, "Embedded Object3 path: {0}", embeddedObject3.getDocumentPath());
+		LOG.log(Level.INFO, "Embedded Object3 media-type: {0}", embeddedObject3.getMediaTypeString());
+		Assert.assertEquals(embeddedObject3.getMediaTypeString(), Document.OdfMediaType.GRAPHICS
+				.getMediaTypeString());
+
+		Document embeddedObject6 = odtDoc1.getEmbeddedDocument("Object6/");
+		LOG.log(Level.INFO, "Embedded Object6 path: {0}", embeddedObject6.getDocumentPath());
+		LOG.log(Level.INFO, "Embedded Object6 media-type: {0}", embeddedObject6.getMediaTypeString());
+		Assert.assertEquals(embeddedObject6.getMediaTypeString(), Document.OdfMediaType.PRESENTATION
+				.getMediaTypeString());
+
+	}
+
+	@Test
+	public void accessEmbeddedDocs() {
+		try {
+			Document docWithEmbeddedObjects = Document.loadDocument(TEST_FILE_EMBEDDED);
+			List<Document> embDocs = docWithEmbeddedObjects.getEmbeddedDocuments();
+			String pathToEmbeddedObject = "";
+			for (OdfPackageDocument embDoc : embDocs) {
+				LOG.log(Level.INFO, "Embedded file of {0} internal package path: {1} mediaType: {2}", new Object[] {
+						TEST_FILE_EMBEDDED, embDoc.getDocumentPath(), embDoc.getMediaTypeString() });
+				pathToEmbeddedObject = embDoc.getDocumentPath();
+			}
+
+			Document embDoc = docWithEmbeddedObjects.getEmbeddedDocument(pathToEmbeddedObject);
+			OdfContentDom contentDom = embDoc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			// Make sure the embedded document is being loaded
+
+			// Add text element
+			TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+			LOG.log(Level.INFO, "First para: {0}", para.getTextContent());
+			OdfTextSpan spanElem = new OdfTextSpan(contentDom);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			para.appendChild(spanElem);
+
+			// Add frame and image element
+			TextPElement paraLast = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom, XPathConstants.NODE);
+			addImageToDocument(contentDom, paraLast);
+
+			// Access/Update automatic styles
+			OdfOfficeAutomaticStyles autoStyles = embDoc.getContentDom().getAutomaticStyles();
+			OdfStyle autoStyle = autoStyles.getStyle("P1", OdfStyleFamily.Paragraph);
+			Assert.assertEquals(autoStyle.getStyleNameAttribute(), "P1");
+			Assert.assertEquals(autoStyle.getFamilyName(), "paragraph");
+
+			// Access/Update styles.xml
+			OdfStyle documentStyle = embDoc.getDocumentStyles().getStyle("myStyle", OdfStyleFamily.Paragraph);
+			Assert.assertEquals(documentStyle.getStyleNameAttribute(), "myStyle");
+			Assert.assertEquals(documentStyle.getFamilyName(), "paragraph");
+
+			documentStyle.setProperty(StyleTextPropertiesElement.FontWeight, "bold");
+			documentStyle.setProperty(StyleParagraphPropertiesElement.BackgroundColor, "#14EA5D");
+
+			// SAVE / LOAD
+			docWithEmbeddedObjects.save(TEST_FILE_ACCESS_EMBEDDED);
+
+			Document doc2 = Document.loadDocument(TEST_FILE_ACCESS_EMBEDDED);
+			Document embDoc2 = doc2.getEmbeddedDocument("Object 1/");
+			embDoc2.getStylesDom();
+			OdfStyle documentStyle2 = embDoc2.getDocumentStyles().getStyle("myStyle", OdfStyleFamily.Paragraph);
+			String prop2 = documentStyle2.getProperty(StyleTextPropertiesElement.FontWeight);
+			Assert.assertEquals(prop2, "bold");
+
+			TextSpanElement spanTest = (TextSpanElement) xpath.evaluate("//text:p[1]/text:span[1]", contentDom,
+					XPathConstants.NODE);
+			Assert.assertEquals(spanTest.getTextContent(), TEST_SPAN_TEXT);
+
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void accessEmbeddedWithinEmbeddedDocs() {
+
+		try {
+			Document rootDocument = Document.loadDocument(TEST_FILE_EMBEDDED);
+			// Test DOM Access
+			Assert.assertNotNull(rootDocument.getDocumentStyles());
+			Assert.assertNotNull(rootDocument.getContentDom().getAutomaticStyles());
+			Assert.assertNotNull(rootDocument.getStylesDom());
+			Assert.assertNotNull(rootDocument.getContentDom());
+
+			List<Document> embDocs = rootDocument.getEmbeddedDocuments();
+			int embDocsNumber = embDocs.size();
+			// the document "Object 1/
+			Document embDoc = embDocs.get(0);
+			String pathOfSecondInnerDoc = "Object in Object1/";
+			embDoc.insertDocument(TextDocument.newTextDocument(), pathOfSecondInnerDoc);
+			OdfFileEntry fileEntry = embDoc.getPackage().getFileEntry(embDoc.getDocumentPath() + pathOfSecondInnerDoc);
+			Assert.assertNotNull(fileEntry);
+
+			// get "Object 1/content.xml"
+			OdfContentDom contentDom = embDoc.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			TextPElement lastPara = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom, XPathConstants.NODE);
+			addFrameForEmbeddedDoc(contentDom, lastPara, "Object in Object1");
+			List<Document> emb_embDocs = embDoc.getEmbeddedDocuments();
+			Assert.assertEquals(embDocsNumber + 1, emb_embDocs.size());
+
+			Document emb_embDoc = rootDocument.getEmbeddedDocument(embDoc.getDocumentPath() + pathOfSecondInnerDoc);
+			contentDom = emb_embDoc.getContentDom();
+			TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+			OdfTextSpan spanElem = new OdfTextSpan(contentDom);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			para.appendChild(spanElem);
+
+			// embDoc.save(ResourceUtilities.newTestOutputFile("222debug.odt"));
+			rootDocument.save(TEST_FILE_EMBEDDED_EMBEDDED);
+
+			Document docWithdoubleEmbeddedDoc = Document.loadDocument(TEST_FILE_EMBEDDED_EMBEDDED);
+			Document embeddedDoc = docWithdoubleEmbeddedDoc.getEmbeddedDocument("Object 1");
+			Document doubleEmbeddedDoc = embeddedDoc.getEmbeddedDocument("Object in Object1");
+
+			OdfContentDom dEDcontentDom = doubleEmbeddedDoc.getContentDom();
+			TextSpanElement spanTest = (TextSpanElement) xpath.evaluate("//text:span[last()]", dEDcontentDom,
+					XPathConstants.NODE);
+			Assert.assertEquals(spanTest.getTextContent(), TEST_SPAN_TEXT);
+
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testCacheDocuments() {
+		Document docWithEmbeddedObjects;
+		try {
+			docWithEmbeddedObjects = Document.loadDocument(TEST_FILE_EMBEDDED);
+			List<Document> embDocs = docWithEmbeddedObjects.getEmbeddedDocuments();
+			Document doc1 = embDocs.get(0);
+			OdfContentDom contentDom1 = doc1.getContentDom();
+			Document doc2 = doc1.getEmbeddedDocument(".");
+			OdfContentDom contentDom2 = doc2.getContentDom();
+			Assert.assertEquals(doc2, doc1);
+			Assert.assertEquals(contentDom1, contentDom2);
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testSaveEmbeddedDocuments() {
+		Document docWithEmbeddedObjects;
+		try {
+			docWithEmbeddedObjects = Document.loadDocument(TEST_FILE_SAVE_EMBEDDED);
+			List<Document> embDocs = docWithEmbeddedObjects.getEmbeddedDocuments(Document.OdfMediaType.GRAPHICS);
+			// Graphics Doc
+			Document doc1 = embDocs.get(0);
+			Assert.assertNotNull(doc1);
+
+			OdfContentDom contentDom = doc1.getContentDom();
+			XPath xpath = contentDom.getXPath();
+			TextPElement para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom, XPathConstants.NODE);
+			OdfTextSpan spanElem = new OdfTextSpan(contentDom);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			para.appendChild(spanElem);
+			// save the embed document to a stand alone document
+			doc1.save(TEST_FILE_SAVE_EMBEDDED_OUT);
+			// Load test
+			Document loadedDoc = Document.loadDocument(TEST_FILE_SAVE_EMBEDDED_OUT);
+			OdfContentDom contentDom2 = loadedDoc.getContentDom();
+			OdfTextSpan span = (OdfTextSpan) xpath.evaluate("//text:span[last()]", contentDom2, XPathConstants.NODE);
+			Assert.assertEquals(span.getTextContent(), TEST_SPAN_TEXT);
+			List<Document> embDocs3 = docWithEmbeddedObjects.getEmbeddedDocuments(Document.OdfMediaType.TEXT);
+
+			// Writer Doc
+			Document doc3 = embDocs3.get(0);
+			Assert.assertNotNull(doc3);
+			OdfContentDom contentDom3 = doc3.getContentDom();
+			TextPElement para2 = (TextPElement) xpath.evaluate("//text:p[1]", contentDom3, XPathConstants.NODE);
+			addImageToDocument(contentDom3, para2);
+			TextPElement para3 = (TextPElement) xpath.evaluate("//text:p[last()]", contentDom3, XPathConstants.NODE);
+			addFrameForEmbeddedDoc(contentDom3, para3, "NewEmbedded");
+			doc3.insertDocument(TextDocument.newTextDocument(), "/NewEmbedded/");
+			Document doc4 = doc3.getEmbeddedDocument("NewEmbedded");
+			Assert.assertNotNull(doc4);
+			OdfContentDom contentDom4 = doc4.getContentDom();
+			para = (TextPElement) xpath.evaluate("//text:p[1]", contentDom4, XPathConstants.NODE);
+			spanElem = new OdfTextSpan(contentDom4);
+			spanElem.setTextContent(TEST_SPAN_TEXT);
+			para.appendChild(spanElem);
+			doc3.save(TEST_FILE_SAVE_EMBEDDED_OUT2);
+
+			Document testLoad = Document.loadDocument(TEST_FILE_SAVE_EMBEDDED_OUT2);
+			NodeList linkNodes = (NodeList) xpath.evaluate("//*[@xlink:href]", testLoad.getContentDom(),
+					XPathConstants.NODE);
+			for (int i = 0; i < linkNodes.getLength(); i++) {
+				OdfElement object = (OdfElement) linkNodes.item(i);
+				String refObjPath = object.getAttributeNS(OdfDocumentNamespace.XLINK.getUri(), "href");
+				Assert.assertTrue(refObjPath.equals("Pictures/" + TEST_PIC) || refObjPath.equals("./NewEmbedded"));
+			}
+			Assert.assertNotNull(testLoad.getPackage().getFileEntry("Pictures/" + TEST_PIC));
+			Document embedDocOftestLoad = testLoad.getEmbeddedDocument("NewEmbedded/");
+			contentDom4 = embedDocOftestLoad.getContentDom();
+			OdfTextSpan span4 = (OdfTextSpan) xpath.evaluate("//text:span[last()]", contentDom4, XPathConstants.NODE);
+			Assert.assertNotNull(span4);
+			Assert.assertEquals(span4.getTextContent(), TEST_SPAN_TEXT);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	@Test
+	/**
+	 * Document docA and docB are embedded Odfdocuments, a containing b!
+	 * But the relative package path hierachiy is opposite, meaning
+	 * OdfPackage/docB/docA
+	 */
+	public void testDocumentWithQueerPath() {
+		try {
+			Document containerDoc = TextDocument.newTextDocument();
+			String pathToDocA = "dummy/docA/";
+			String pathToDocB = "docB/";
+			containerDoc.insertDocument(TextDocument.newTextDocument(), pathToDocA);
+			Document docA = containerDoc.getEmbeddedDocument(pathToDocA);
+			Assert.assertNotNull(docA);
+			docA.insertDocument(TextDocument.newTextDocument(), pathToDocB);
+			Document docB = containerDoc.getEmbeddedDocument(pathToDocA + pathToDocB);
+			Assert.assertNotNull(docB);
+			// only the document docB located at dummy/docA/docB will be saved
+			docB.save(TEST_FILE_SAVE_QUEER_PATH);
+
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test if saving Documents always results in a valid ODF file. This means
+	 * that the mimetype is written clearly at the first position in the zipped
+	 * ODF package.
+	 */
+	@Test
+	public void testWritingCorrectMimetype() {
+		try {
+			Document docWithCorruptedMimetype = Document.loadDocument(CORRUPTED_MIMETYPE_DOC);
+			docWithCorruptedMimetype.save(CORRUPTED_MIMETYPE_DOC_OUT);
+			Document chartWithCorruptedMimetype = Document.loadDocument(CORRUPTED_MIMETYPE_CHART);
+			chartWithCorruptedMimetype.save(CORRUPTED_MIMETYPE_CHART_OUT);
+		} catch (Exception ex) {
+			Logger.getLogger(DocumentCreationTest.class.getName()).log(Level.SEVERE, null, ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+	}
+
+	private void addImageToDocument(OdfContentDom dom, TextPElement para) throws Exception {
+		OdfDrawFrame drawFrame = new OdfDrawFrame(dom);
+		drawFrame.setDrawNameAttribute("graphics1");
+		drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+		drawFrame.setSvgWidthAttribute("4.233cm");
+		drawFrame.setSvgHeightAttribute("4.233cm");
+		drawFrame.setDrawZIndexAttribute(0);
+		para.appendChild(drawFrame);
+
+		OdfDrawImage image = new OdfDrawImage(dom);
+		drawFrame.appendChild(image);
+		image.newImage(ResourceUtilities.getURI(TEST_PIC));
+	}
+
+	private void addFrameForEmbeddedDoc(OdfContentDom dom, TextPElement para, String path) throws Exception {
+		OdfDrawFrame drawFrame = new OdfDrawFrame(dom);
+		drawFrame.setDrawNameAttribute(path);
+		drawFrame.setTextAnchorTypeAttribute(TextAnchorTypeAttribute.Value.PARAGRAPH.toString());
+		drawFrame.setSvgXAttribute("0.834cm");
+		drawFrame.setSvgYAttribute("2.919cm");
+		drawFrame.setSvgWidthAttribute("13.257cm");
+		drawFrame.setSvgHeightAttribute("11.375cm");
+		drawFrame.setDrawZIndexAttribute(0);
+
+		DrawObjectElement object = new DrawObjectElement(dom);
+		object.setXlinkHrefAttribute("./" + path);
+		object.setXlinkActuateAttribute("onLoad");
+		object.setXlinkShowAttribute("embed");
+		object.setXlinkTypeAttribute("simple");
+		drawFrame.appendChild(object);
+		para.appendChild(drawFrame);
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/DocumentTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/DocumentTest.java
new file mode 100644
index 0000000..33ff2b6
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/DocumentTest.java
@@ -0,0 +1,581 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.style.StyleGraphicPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.simple.utils.NodeAction;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class DocumentTest {
+
+	private static final Logger LOG = Logger.getLogger(DocumentTest.class.getName());
+	private static final String TEST_FILE = "test2.odt";
+	private static final String TEST_FILE_WITHOUT_OPT = "no_size_opt.odt";
+	private static final String ODF_FORMULAR_TEST_FILE = "SimpleFormula.odf";
+	private static final String IMAGE_TEST_FILE = "testA.jpg";
+	private static final String GENERATED_INVALID_SPREADSHEET = "invalid.ods";
+	private static final String ZERO_BYTE_SPREADSHEET = "empty_file.ods";
+
+	public DocumentTest() {
+	}
+
+	@Test
+	public void loadDocument() {
+		try {
+			System.setProperty("org.odftoolkit.odfdom.tmpfile.disable", "true");
+			// LOAD INVALID GENERATED SPREADSHEET DOCUMENT
+			LOG.info("Loading an supported ODF Spreadsheet document as an ODF Document!");
+			try {
+				// Should work!
+				Document ods = Document.loadDocument(ResourceUtilities.getAbsolutePath(GENERATED_INVALID_SPREADSHEET));
+				Assert.assertNotNull(ods);
+			} catch (Exception e) {
+				LOG.log(Level.SEVERE, e.getMessage(), e);
+				Assert.fail();
+			}
+
+
+			// LOAD EMPTY DOCUMENT
+			LOG.info("Loading an empty document as an ODF Document!");
+			try {
+				// Should throw error!
+				Document ods = Document.loadDocument(ResourceUtilities.getAbsolutePath(ZERO_BYTE_SPREADSHEET));
+				Assert.fail();
+			} catch (Exception e) {
+				if (!e.getMessage().contains("shall be a ZIP file")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			}
+
+			// LOAD FORMULA DOCUMENT
+			LOG.info("Loading an unsupported ODF Formula document as an ODF Document!");
+			try {
+				// Exception is expected!
+				Document.loadDocument(ResourceUtilities.getAbsolutePath(ODF_FORMULAR_TEST_FILE));
+				Assert.fail();
+			} catch (IllegalArgumentException e) {
+				if (!e.getMessage().contains("is not yet supported!")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			}
+
+			// LOAD DOCUMENT IMAGE
+			LOG.info("Loading an unsupported image file as an ODF Document!");
+			try {
+				// Exception is expected!
+				Document.loadDocument(ResourceUtilities.getAbsolutePath(IMAGE_TEST_FILE));
+				Assert.fail();
+			} catch (IllegalArgumentException e) {
+				if (!e.getMessage().contains("shall be a ZIP file")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			} catch (OdfValidationException e) {
+				if (!e.getMessage().contains("shall be a ZIP file")) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail();
+				}
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testParser() {
+		try {
+			Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetContentRoot() {
+		try {
+			TextDocument odt = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_WITHOUT_OPT));
+			Assert.assertNotNull(odt.getContentRoot());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	@Ignore
+	public void testDumpDom() {
+		try {
+			Assert.assertTrue(testXSLT("content") & testXSLT("styles"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private static boolean testXSLT(String odfFileNamePrefix) throws Exception {
+		Document odfdoc = Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+		Transformer trans = TransformerFactory.newInstance().newTransformer();
+		trans.setOutputProperty("indent", "yes");
+		// trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+
+		LOG.log(Level.INFO, "---------- {0}.xml transformed and compared ---------", odfFileNamePrefix);
+		// The XML file (e.g. content.xml) is transformed by XSLT into the similar/identical XML file
+		ByteArrayOutputStream xmlBytes = new ByteArrayOutputStream();
+		OdfFileDom fileDom = null;
+		if (odfFileNamePrefix.equals("content")) {
+			fileDom = odfdoc.getContentDom();
+		} else {
+			fileDom = odfdoc.getStylesDom();
+		}
+		// transforming the XML using identical transformation
+		trans.transform(new DOMSource(fileDom), new StreamResult(xmlBytes));
+		String xmlString = xmlBytes.toString("UTF-8");
+		// Saving test file to disc
+		saveString(xmlString, ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-test.xml");
+
+		// The template XML was once transformed and saved to the resource folder to gurantee the same indentation
+		String xmlStringOriginal = inputStreamToString(ResourceUtilities.getTestResourceAsStream("test2-" + odfFileNamePrefix + ".xml"));
+		// Saving original file to disc
+		saveString(xmlStringOriginal, ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-original.xml");
+
+
+		// Loading original file back to string representation
+		String testString = inputStreamToString(new FileInputStream(ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-test.xml"));
+		// Loading test file back to string representation
+		String originalString = inputStreamToString(new FileInputStream(ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-temporary-original.xml"));
+
+		boolean xmlEqual = originalString.equals(testString);
+		if (!xmlEqual) {
+			String testFilePath = ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-final-test.xml";
+			String originalFilePath = ResourceUtilities.getTestOutputFolder() + odfFileNamePrefix + "-final-original.xml";
+			saveString(testString, testFilePath);
+			saveString(originalString, originalFilePath);
+			LOG.log(Level.SEVERE, "Please compare the XML of two file:\n{0}\n and \n{1}", new Object[]{testFilePath, originalFilePath});
+		}
+		return xmlEqual;
+	}
+
+	@Test
+	public void testStylesDom() {
+		try {
+			Document odfdoc = Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+			OdfStylesDom stylesDom = odfdoc.getStylesDom();
+			Assert.assertNotNull(stylesDom);
+
+			// test styles.xml:styles
+			OdfOfficeStyles styles = odfdoc.getDocumentStyles();
+			Assert.assertNotNull(styles);
+
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.Graphic));
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.Paragraph));
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.Table));
+			Assert.assertNotNull(styles.getDefaultStyle(OdfStyleFamily.TableRow));
+
+			OdfStyle style = styles.getStyle("Standard", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getStyleClassAttribute(), "text");
+
+			style = styles.getStyle("List", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getProperty(StyleTextPropertiesElement.FontNameComplex), "Tahoma1");
+			Assert.assertTrue(style.hasProperty(StyleTextPropertiesElement.FontNameComplex));
+			Assert.assertFalse(style.hasProperty(StyleTextPropertiesElement.FontNameAsian));
+
+			Assert.assertNull(styles.getStyle("foobar", OdfStyleFamily.Chart));
+
+			// test styles.xml:automatic-styles
+			OdfOfficeAutomaticStyles autostyles = stylesDom.getAutomaticStyles();
+			Assert.assertNotNull(autostyles);
+
+			OdfStylePageLayout pageLayout = autostyles.getPageLayout("pm1");
+			Assert.assertNotNull(pageLayout);
+			Assert.assertEquals(pageLayout.getProperty(StylePageLayoutPropertiesElement.PageWidth), "8.5in");
+			Assert.assertEquals(pageLayout.getProperty(StylePageLayoutPropertiesElement.PageHeight), "11in");
+
+			Assert.assertNull(autostyles.getStyle("foobar", OdfStyleFamily.Chart));
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testContentNode() {
+		try {
+			Document odfdoc = Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+
+			OdfContentDom contentDom = odfdoc.getContentDom();
+
+			// test content.xml:automatic-styles
+			OdfOfficeAutomaticStyles autoStyles = contentDom.getAutomaticStyles();
+			Assert.assertNotNull(autoStyles);
+
+			OdfStyle style = autoStyles.getStyle("P1", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getStyleNameAttribute(), "P1");
+			Assert.assertEquals(style.getStyleParentStyleNameAttribute(), "Text_20_body");
+			Assert.assertEquals(style.getStyleListStyleNameAttribute(), "L1");
+
+			style = autoStyles.getStyle("T1", OdfStyleFamily.Text);
+			Assert.assertNotNull(style);
+			Assert.assertEquals(style.getStyleNameAttribute(), "T1");
+
+			for (OdfStyle testStyle : autoStyles.getStylesForFamily(OdfStyleFamily.Paragraph)) {
+				testStyle(testStyle);
+			}
+
+			for (OdfStyle testStyle : autoStyles.getStylesForFamily(OdfStyleFamily.Text)) {
+				testStyle(testStyle);
+			}
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSaveDocument() {
+		try {
+			Document odfdoc = Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+			new NodeAction<String>() {
+
+				@Override
+				protected void apply(Node cur, String replace, int depth) {
+					if (cur.getNodeType() == Node.TEXT_NODE) {
+						cur.setNodeValue(cur.getNodeValue().replaceAll("\\w", replace));
+					}
+				}
+			};
+//            replaceText.performAction(e, "X");            
+			odfdoc.save(ResourceUtilities.newTestOutputFile("list-out.odt"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void testStyle(OdfStyle testStyle) throws Exception {
+		OdfFileDom fileDom = (OdfFileDom) testStyle.getOwnerDocument();
+		OdfOfficeAutomaticStyles autoStyles = null;
+		if (testStyle.getStyleParentStyleNameAttribute() != null) {
+			if (fileDom instanceof OdfContentDom) {
+				autoStyles = ((OdfContentDom) fileDom).getAutomaticStyles();
+			} else if (fileDom instanceof OdfStylesDom) {
+				autoStyles = ((OdfStylesDom) fileDom).getAutomaticStyles();
+			}
+			OdfStyle parentStyle = autoStyles.getStyle(testStyle.getStyleParentStyleNameAttribute(), testStyle.getFamily());
+			if (parentStyle == null) {
+				parentStyle = ((Document) fileDom.getDocument()).getDocumentStyles().getStyle(testStyle.getStyleParentStyleNameAttribute(), testStyle.getFamily());
+			}
+
+			Assert.assertNotNull(parentStyle);
+		}
+		if (testStyle.hasOdfAttribute(OdfName.newName(OdfDocumentNamespace.STYLE, "list-style-name"))) {
+			if (testStyle.getStyleListStyleNameAttribute() != null) {
+				OdfTextListStyle listStyle = autoStyles.getListStyle(testStyle.getStyleListStyleNameAttribute());
+				if (listStyle == null) {
+					listStyle = ((Document) fileDom.getDocument()).getDocumentStyles().getListStyle(testStyle.getStyleListStyleNameAttribute());
+				}
+
+				Assert.assertNotNull(listStyle);
+			}
+		}
+	}
+
+	@Test
+	public void testParsingOfInvalidAttribute() {
+		try {
+			// file with invalid value for enum text-underline-style
+			File testfile = ResourceUtilities.newTestOutputFile("InvalidUnderlineAttribute.odt");
+
+			// Test1: Loading shouldn't fail just because of one invalid attribute
+			TextDocument odt = (TextDocument) Document.loadDocument(testfile);
+			Assert.assertNotNull(odt);
+
+			// Test2: invalid attribute node should have been be removed
+//			OdfStyle styleNode = odt.getContentDom().getAutomaticStyles().getStyle("T1", OdfStyleFamily.Text);
+//			StyleTextPropertiesElement props = OdfElement.findFirstChildNode(StyleTextPropertiesElement.class, styleNode);
+//			Assert.assertFalse(props.hasAttribute("style:text-underline-style"));
+//			odt.save(ResourceUtilities.newTestOutputFile("saving-is-possible2.odt"));
+
+			// Test3: New ODF 1.2 attribute node should exist
+			OdfStyle styleNode2 = odt.getStylesDom().getOfficeStyles().getStyle("bug77", OdfStyleFamily.Graphic);
+			StyleGraphicPropertiesElement propsGrapicElement = OdfElement.findFirstChildNode(StyleGraphicPropertiesElement.class, styleNode2);
+			Assert.assertTrue("Could not find the attribute svg:opac-capicity. Workaround bug77 did not succeeded!", propsGrapicElement.hasAttribute("svg:stroke-opacity"));
+			odt.save(ResourceUtilities.newTestOutputFile("saving-is-possible.odt"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testDocumentPassword() {
+		File passwordOutputFile = ResourceUtilities.newTestOutputFile("PasswordDocument.odt");
+		File noPassOutputFile = ResourceUtilities.newTestOutputFile("NoPasswordDocument.odt");
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("blablabla...");
+			doc.setPassword("password");
+			doc.save(passwordOutputFile);
+			
+			Document redoc = Document.loadDocument(passwordOutputFile, "password");
+			//test load content.xml
+			Assert.assertNotNull(redoc.getContentRoot().toString());
+			//test load styles.xml
+			((TextDocument) redoc).getHeader().addTable();
+			//test load meta.xml
+			Assert.assertNotNull(redoc.getOfficeMetadata().getCreator());
+			
+			//remove password
+			redoc.setPassword(null);
+			redoc.save(noPassOutputFile);
+			
+			//test inserted document
+			doc = TextDocument.newTextDocument();
+			doc.addParagraph("embed_document");
+			redoc.insertDocument(doc, "/embed");
+			redoc.setPassword("password");
+			
+			redoc.save(passwordOutputFile);
+		} catch (Exception ex) {
+			LOG.log(Level.SEVERE, "document password test failed.", ex);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testSetLocale() {
+		String filename = "testDefaultLanguage.odp";
+		try {
+			PresentationDocument  doc = PresentationDocument .newPresentationDocument();
+
+			Assert.assertNull(doc.getLocale(Document.ScriptType.WESTERN));
+			Assert.assertNull(doc.getLocale(Document.ScriptType.CJK));
+			Assert.assertNull(doc.getLocale(Document.ScriptType.CTL));
+
+			Locale eng_can = new Locale(Locale.ENGLISH.getLanguage(),
+					Locale.CANADA.getCountry());
+			Locale chinese_china = new Locale(Locale.CHINESE.getLanguage(),
+					Locale.CHINA.getCountry());
+			Locale ar_eg = new Locale("ar", "eg");
+
+			doc.setLocale(eng_can);
+			doc.setLocale(chinese_china);
+			doc.setLocale(ar_eg);
+
+			doc.save(ResourceUtilities.newTestOutputFile(filename));
+
+			PresentationDocument newDoc = PresentationDocument .loadDocument(ResourceUtilities.getTestResourceAsStream(filename));
+			Assert.assertEquals(eng_can, newDoc.getLocale(Document.ScriptType.WESTERN));
+			Assert.assertEquals(chinese_china, newDoc.getLocale(Document.ScriptType.CJK));
+			Assert.assertEquals(ar_eg, newDoc.getLocale(Document.ScriptType.CTL));
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testLoadDocumentWithIllegalArgument() throws Exception {
+		String filepath = ResourceUtilities.getAbsolutePath("presentation.odp");
+		OdfPackage odfpackage = OdfPackage.loadPackage(filepath);
+		// illegal internal patch
+		try {
+			Document.loadDocument(odfpackage, "odt");
+		} catch (Exception e) {
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("Given internalPath 'odt' is an illegal or inappropriate argument.", e.getMessage());
+		}
+		// illegal media type
+		try {
+			Document.loadDocument(odfpackage, "meta.xml");
+		} catch (Exception e) {
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("Given mediaType 'text/xml' is either not yet supported or not an ODF mediatype!", e.getMessage());
+		}
+	}
+	
+	private static String inputStreamToString(InputStream in) throws IOException {
+		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+		StringBuilder stringBuilder = new StringBuilder();
+		String line = null;
+
+		while ((line = bufferedReader.readLine()) != null) {
+			stringBuilder.append(line).append("\n");
+		}
+		bufferedReader.close();
+		return stringBuilder.toString();
+	}
+
+	/** Saves the datastring as UTF8 to the given filePath */
+	private static void saveString(String dataString, String filePath) throws UnsupportedEncodingException, IOException {
+		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), "UTF8"));
+		out.append(dataString);
+		out.close();
+	}
+	
+	@Test
+	public void testGetEmbeddedDocuments() throws Exception {
+		try {
+			Document doc = Document.loadDocument(OdfPackage.loadPackage(this.getClass().getResource("/").getPath() + "presentationWithEmbedDoc.odp"));
+			Document.OdfMediaType odfMediaType_Chart = Document.OdfMediaType.valueOf(Document.OdfMediaType.class, "CHART");
+			List<Document> doclist = doc.getEmbeddedDocuments(odfMediaType_Chart);
+			if(doclist.size() > 0){
+				for(Document docitem : doclist){
+					Assert.assertEquals("application/vnd.oasis.opendocument.chart", docitem.getMediaTypeString());
+				}
+			}else{
+				Assert.fail();
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testGetEmbeddedDocument() throws Exception {
+		try {
+			Document doc = Document.loadDocument(OdfPackage.loadPackage(this.getClass().getResource("/").getPath() + "Spreadsheet with Embeded Chart.ods"));
+			Document innerdoc = doc.getEmbeddedDocument("/");
+			Assert.assertNotNull(innerdoc);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetContentRootDoc() throws Exception {
+		try {
+			Document odt = Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE_WITHOUT_OPT));
+			OdfContentDom odfcon = odt.getContentDom();
+			Assert.assertNotNull(odfcon);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testToString() throws Exception {
+		try {
+			Document doc = Document.loadDocument(ResourceUtilities.getTestResourceAsStream("test2.odt"));
+			String docStr = doc.toString();
+			System.out.println(docStr);
+			Assert.assertTrue(docStr.indexOf("application/vnd.oasis.opendocument.text")>0);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testSave() throws Exception {
+		try {
+			Document doc = Document.loadDocument(ResourceUtilities.getAbsolutePath("test2.odt"));
+			Assert.assertNotNull(doc);
+			String docmedia = doc.getOdfMediaType().getMediaTypeString();
+			//create a document for test
+			Document doctest = Document.loadDocument(ResourceUtilities.getAbsolutePath("test2.odt"));
+			doctest.save(ResourceUtilities.newTestOutputFile("testSave.odt"));
+			String filePath = ResourceUtilities.getAbsolutePath("testSave.odt");
+			File outerFile = new File(filePath);
+			if(!outerFile.exists()){
+				System.out.println("outerFile is not exist. ");
+			}
+			Assert.assertNotNull(doc);
+			
+			OutputStream out = new FileOutputStream(outerFile);
+			doc.save(out);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSave.odt"));
+			out.close();
+			
+			//verify
+			Document docnew = Document.loadDocument(ResourceUtilities.getTestResourceAsStream("testSave.odt"));
+			Assert.assertNotNull(docnew);
+			String docnewMedia = docnew.getOdfMediaType().getMediaTypeString();
+			
+			Assert.assertEquals(docmedia, docnewMedia);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/GraphicsDocumentTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/GraphicsDocumentTest.java
new file mode 100644
index 0000000..21355e6
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/GraphicsDocumentTest.java
@@ -0,0 +1,129 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDrawingElement;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class GraphicsDocumentTest {
+	private static final Logger LOG = Logger.getLogger(GraphicsDocumentTest.class.getName());
+	private static final String TEST_FILE = "graphicTestTemplate.otg";
+	
+	@Test
+	public void testLoadingAChartTemplate() throws Exception {
+		try {
+			GraphicsDocument graphiDoc = GraphicsDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+			Assert.assertNotNull(graphiDoc);
+			Document.OdfMediaType graphiType = graphiDoc.getOdfMediaType();
+			Assert.assertTrue(graphiType.equals(Document.OdfMediaType.GRAPHICS_TEMPLATE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+	
+	@Test
+	public void testLoadDocumentPath() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			GraphicsDocument  gdoc = GraphicsDocument.loadDocument(filePath);
+			Assert.assertNotNull(gdoc);
+			Assert.assertEquals("application/vnd.oasis.opendocument.graphics-template", gdoc.getMediaTypeString());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testLoadDocumentFile() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			File otg = new File(filePath);
+			GraphicsDocument  gdoc = GraphicsDocument.loadDocument(otg);
+			Assert.assertNotNull(gdoc);
+			Assert.assertEquals("application/vnd.oasis.opendocument.graphics-template", gdoc.getMediaTypeString());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testLoadDocumentStream() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			File otg = new File(filePath);
+			FileInputStream fStream = new FileInputStream(otg);
+			GraphicsDocument  gdoc = GraphicsDocument.loadDocument(fStream);
+			Assert.assertNotNull(gdoc);
+			Assert.assertEquals("application/vnd.oasis.opendocument.graphics-template", gdoc.getMediaTypeString());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testGetContentRoot() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			FileInputStream fStream = new FileInputStream(new File(filePath));
+			GraphicsDocument  gdoc = GraphicsDocument.loadDocument(fStream);
+			Assert.assertNotNull(gdoc);
+			OfficeDrawingElement officeEle = gdoc.getContentRoot();
+			Assert.assertNotNull(officeEle);
+			Assert.assertEquals("office:drawing", officeEle.getNodeName());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testGetTableContainerElement() throws Exception {
+		String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+		File otg = new File(filePath);
+		FileInputStream fStream = new FileInputStream(otg);
+		GraphicsDocument  gdoc = GraphicsDocument.loadDocument(fStream);
+		Assert.assertNotNull(gdoc);
+		Assert.assertEquals("application/vnd.oasis.opendocument.graphics-template", gdoc.getMediaTypeString());
+		try {
+			gdoc.getTableContainerElement();
+		} catch (Exception e) {
+			Assert.assertTrue(e instanceof UnsupportedOperationException);
+			Assert.assertEquals("Graphics document is not supported to hold table now.", e.getMessage());
+		}
+		
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/GraphicsTemplateTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/GraphicsTemplateTest.java
new file mode 100644
index 0000000..9ebac14
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/GraphicsTemplateTest.java
@@ -0,0 +1,79 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.simple;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of graphics.
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class GraphicsTemplateTest {
+
+	private static final String TEST_GRAPHICS_TEMPLATE = "/graphicTestTemplate.otg";
+
+	@Test
+	public void testLoadingAGraphicsTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_GRAPHICS_TEMPLATE));
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingAGraphicsTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_GRAPHICS_TEMPLATE));
+		File destination = File.createTempFile("simple-test", ".otg");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewGraphicsTemplate() throws Exception {
+		Document document = GraphicsDocument.newGraphicsTemplateDocument();
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("simple-test", ".otg");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof GraphicsDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfGraphicsDocument() throws Exception {
+		GraphicsDocument document = GraphicsDocument.newGraphicsDocument();
+		document.changeMode(GraphicsDocument.OdfMediaType.GRAPHICS_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = GraphicsDocument.newGraphicsTemplateDocument();
+		document.changeMode(GraphicsDocument.OdfMediaType.GRAPHICS);
+		Assert.assertEquals(Document.OdfMediaType.GRAPHICS.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/LoadSaveTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/LoadSaveTest.java
new file mode 100644
index 0000000..6ae8ba9
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/LoadSaveTest.java
@@ -0,0 +1,99 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeVersionAttribute;
+import org.odftoolkit.odfdom.dom.element.office.OfficeDocumentContentElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class LoadSaveTest {
+
+	private static final String SOURCE = "not-only-odf.odt";
+	private static final String TARGET = "loadsavetest.odt";
+	private static final String FOREIGN_ATTRIBUTE_NAME = "foreignAttribute";
+	private static final String FOREIGN_ATTRIBUTE_VALUE = "foreignAttributeValue";
+	private static final String FOREIGN_ELEMENT_TEXT = "foreignText";
+
+	public LoadSaveTest() {
+	}
+
+	@Test
+	public void testLoadSave() {
+		try {
+			Document odfDocument = Document.loadDocument(ResourceUtilities.getAbsolutePath(SOURCE));
+			Assert.assertTrue(odfDocument.getPackage().contains("content.xml"));
+			String baseURI = odfDocument.getBaseURI();
+//			Assert.assertEquals(ResourceUtilities.getURI(SOURCE).toString(), baseURI);
+			System.out.println("SOURCE URI1:"+ResourceUtilities.getURI(SOURCE).toString());
+			System.out.println("SOURCE URI2:"+baseURI);
+			OdfFileDom odfContent = odfDocument.getContentDom();
+			String odf12 = OfficeVersionAttribute.Value._1_2.toString();
+			OfficeDocumentContentElement content = (OfficeDocumentContentElement) odfContent.getDocumentElement();
+			String version = content.getOfficeVersionAttribute();
+			Assert.assertFalse(version.equals(odf12));
+
+			NodeList lst = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+			Node node = lst.item(0);
+			String oldText = "Changed!!!";
+			node.setTextContent(oldText);
+
+			odfDocument.save(ResourceUtilities.newTestOutputFile(TARGET));
+			odfDocument = Document.loadDocument(ResourceUtilities.getAbsolutePath(TARGET));
+
+			odfContent = odfDocument.getContentDom();
+			// ToDo: Will be used for issue 60: Load & Save of previous ODF versions (ie. ODF 1.0, ODF 1.1)
+			//Assert.assertTrue(odfContent.getRootElement().getOfficeVersionAttribute().equals(odf12));
+			lst = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.TEXT.getUri(), "p");
+			node = lst.item(0);
+			String newText = node.getTextContent();
+			Assert.assertTrue(newText.equals(oldText));
+
+			node = lst.item(1);
+			//check foreign attribute without namespace
+			Element foreignElement = (Element) node.getChildNodes().item(0);
+			String foreignText = foreignElement.getTextContent();
+			Assert.assertTrue(foreignText.equals(FOREIGN_ELEMENT_TEXT));
+
+			//check foreign element without namespace
+			Attr foreignAttr = (Attr) node.getAttributes().getNamedItem(FOREIGN_ATTRIBUTE_NAME);
+			String foreignAttrValue = foreignAttr.getValue();
+			Assert.assertTrue(foreignAttrValue.equals(FOREIGN_ATTRIBUTE_VALUE));
+
+
+
+		} catch (Exception e) {
+			Logger.getLogger(LoadSaveTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/PresentationTemplateTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/PresentationTemplateTest.java
new file mode 100644
index 0000000..b32190d
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/PresentationTemplateTest.java
@@ -0,0 +1,80 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.simple;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of presentations.
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class PresentationTemplateTest {
+
+	private static final String TEST_PRESENTATION = "/presentationTestTemplate.otp";
+
+	@Test
+	public void testLoadingAPresentationTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_PRESENTATION));
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingAPresentationTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_PRESENTATION));
+		File destination = File.createTempFile("simple-test", ".otp");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewPresentationTemplate() throws Exception {
+		Document document = PresentationDocument.newPresentationTemplateDocument();
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		File destination = File.createTempFile("simple-test", ".otp");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof PresentationDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfPresentationDocument() throws Exception {
+		PresentationDocument document = PresentationDocument.newPresentationDocument();
+		document.changeMode(PresentationDocument.OdfMediaType.PRESENTATION_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = PresentationDocument.newPresentationTemplateDocument();
+		document.changeMode(PresentationDocument.OdfMediaType.PRESENTATION);
+		Assert.assertEquals(Document.OdfMediaType.PRESENTATION.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/PresentationTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/PresentationTest.java
new file mode 100644
index 0000000..7965674
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/PresentationTest.java
@@ -0,0 +1,204 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.simple;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.attribute.presentation.PresentationClassAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawGradientElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawHatchElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawMarkerElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawFrame;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeMasterStyles;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.presentation.Slide;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+/**
+ *
+ * @author cl93746
+ */
+public class PresentationTest {
+
+	Document odfdoc;
+
+	public PresentationTest() {
+		try {
+			odfdoc = Document.loadDocument(ResourceUtilities.getAbsolutePath("presentation.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testPresentation() {
+		try {
+			PresentationDocument odpdoc = (PresentationDocument) odfdoc;
+
+			Slide page = odpdoc.getSlideByName("slide-name-1");
+			Assert.assertTrue((page != null) && page.getSlideName().equals("slide-name-1"));
+			Assert.assertEquals(page, odpdoc.getSlideByIndex(0));
+
+			page = odpdoc.getSlideByName("slide-name-2");
+			Assert.assertTrue((page != null) && page.getSlideName().equals("slide-name-2"));
+			Assert.assertEquals(page, odpdoc.getSlideByIndex(1));
+
+			page = odpdoc.getSlideByName("slide-name-3");
+			Assert.assertTrue((page != null) && page.getSlideName().equals("slide-name-3"));
+			Assert.assertEquals(page, odpdoc.getSlideByIndex(2));
+
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testMasterStyles() {
+		try {
+			OdfOfficeMasterStyles officeMasterStyles = odfdoc.getOfficeMasterStyles();
+			Assert.assertNotNull(officeMasterStyles);
+
+			// check if iterator has all two master pages
+			testIterator(StyleMasterPageElement.class, officeMasterStyles.getMasterPages(), 2);
+
+			// test "master-name-1"
+			StyleMasterPageElement master = officeMasterStyles.getMasterPage("master-name-1");
+			Assert.assertNotNull(master);
+			Assert.assertEquals(master.getStyleNameAttribute(), "master-name-1");
+
+			// test "master-name-2"
+			master = officeMasterStyles.getMasterPage("master-name-2");
+			Assert.assertNotNull(master);
+			Assert.assertEquals(master.getStyleNameAttribute(), "master-name-2");
+
+			// test handout master
+			Assert.assertNotNull(officeMasterStyles.getHandoutMaster());
+
+			// test layerset
+			Assert.assertNotNull(officeMasterStyles.getLayerSet());
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testStyles() {
+		try {
+			OdfOfficeStyles officeStyles = odfdoc.getDocumentStyles();
+			Assert.assertNotNull(officeStyles);
+
+			Assert.assertNotNull(officeStyles.getGradient("Linear_20_blue_2f_white"));
+			testIterator(DrawGradientElement.class, officeStyles.getGradients().iterator(), 1);
+
+			Assert.assertNotNull(officeStyles.getMarker("Arrow"));
+			testIterator(DrawMarkerElement.class, officeStyles.getMarker().iterator(), 1);
+
+			Assert.assertNotNull(officeStyles.getHatch("Black_20_0_20_Degrees"));
+			testIterator(DrawHatchElement.class, officeStyles.getHatches().iterator(), 1);
+
+			Assert.assertNotNull(officeStyles.getFillImage("Aqua"));
+			testIterator(DrawFillImageElement.class, officeStyles.getFillImages().iterator(), 1);
+
+			// check for some styles
+			Assert.assertNotNull(officeStyles.getDefaultStyle(OdfStyleFamily.Graphic));
+			Assert.assertNotNull(officeStyles.getStyle("standard", OdfStyleFamily.Graphic));
+			Assert.assertNotNull(officeStyles.getStyle("master-name-1-outline1", OdfStyleFamily.Presentation));
+
+			Iterator<OdfStyle> style_iter = officeStyles.getStylesForFamily(OdfStyleFamily.Presentation).iterator();
+			Assert.assertNotNull(style_iter);
+			Assert.assertTrue(style_iter.hasNext());
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private <T extends OdfElement> void testIterator(Class<T> clazz, Iterator<T> iter, int elements) {
+		Assert.assertNotNull(iter);
+		while (elements > 0) {
+			Assert.assertTrue(iter.hasNext());
+			Assert.assertTrue(clazz.isInstance(iter.next()));
+			elements--;
+		}
+
+		Assert.assertFalse(iter.hasNext());
+	}
+
+	@Test
+	public void testPresentationClassAttribute() {
+		try {
+			GraphicsDocument doc = GraphicsDocument.newGraphicsDocument();
+			OdfFileDom dom = doc.getContentDom();
+			OdfDrawFrame f = new OdfDrawFrame(dom);
+
+			f.setPresentationClassAttribute(PresentationClassAttribute.Value.GRAPHIC.toString());
+			Logger.getLogger(DocumentCreationTest.class.getName()).info(f.getPresentationClassAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testStyleUsageCount() {
+		try {
+			OdfOfficeAutomaticStyles s = odfdoc.getStylesDom().getAutomaticStyles();
+			OdfStyle pr1 = s.getStyle("pr1", OdfStyleFamily.Presentation);
+			int styleUserCount = pr1.getStyleUserCount();
+			OdfStylesDom stylesDom = odfdoc.getStylesDom();
+			XPath xpath = stylesDom.getXPath();
+			NodeList elementsWithStyle = (NodeList) xpath.evaluate("//draw:frame[@presentation:style-name='pr1']",
+					stylesDom, XPathConstants.NODESET);
+			int elementsWithStyleCount = elementsWithStyle.getLength();
+			Assert.assertTrue(styleUserCount == elementsWithStyleCount);
+//			//#bug51,the bug will be induced by using set attribute method
+//			OdfDrawFrame frame = (OdfDrawFrame) elementsWithStyle.item(0);
+//			frame.setPresentationStyleNameAttribute("pr2");
+//			styleUserCount = pr1.getStyleUserCount();
+//			elementsWithStyle = (NodeList) xpath.evaluate("//draw:frame[@presentation:style-name='pr1']",
+//					odfdoc.getStylesDom(), XPathConstants.NODESET);
+//			elementsWithStyleCount = elementsWithStyle.getLength();
+//			Assert.assertTrue("Last part of bug51 still to be fixed..!!", styleUserCount == elementsWithStyleCount);
+		} catch (Exception e) {
+			Logger.getLogger(PresentationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetDocumentTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetDocumentTest.java
new file mode 100644
index 0000000..6f7a244
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetDocumentTest.java
@@ -0,0 +1,259 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple;
+
+import java.awt.Rectangle;
+import java.io.File;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.Document.OdfMediaType;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.chart.ChartType;
+import org.odftoolkit.simple.chart.DataSet;
+import org.odftoolkit.simple.table.Column;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class SpreadsheetDocumentTest {
+	private static final Logger LOG = Logger.getLogger(SpreadsheetDocumentTest.class.getName());
+	private static final String TEST_FILE = "spreadsheetTestTemplate.ots";
+	
+	@Test
+	public void testGetMediaTypeString() throws Exception{
+		
+		try {
+			String spreadDocPath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			SpreadsheetDocument spreadDoc = SpreadsheetDocument.loadDocument(spreadDocPath);
+			Assert.assertNotNull(spreadDoc);
+			OdfMediaType odfMediaType = spreadDoc.getOdfMediaType();
+			Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE, odfMediaType);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testGetSuffix() throws Exception{
+		try {
+			String spreadDocPath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			SpreadsheetDocument spreadDoc = SpreadsheetDocument.loadDocument(spreadDocPath);
+			Assert.assertNotNull(spreadDoc);
+			OdfMediaType odfMediaType = spreadDoc.getOdfMediaType();
+			String suffix = odfMediaType.getSuffix();
+			Assert.assertEquals("ots", suffix);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetOdfMediaType() throws Exception{
+		
+		try {
+			String spreadDocPath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			SpreadsheetDocument spreadDoc = SpreadsheetDocument.loadDocument(spreadDocPath);
+			Assert.assertNotNull(spreadDoc);
+			Document.OdfMediaType odfMediaType = SpreadsheetDocument.OdfMediaType.getOdfMediaType(spreadDoc.getMediaTypeString());
+			Assert.assertEquals("ots", odfMediaType.getSuffix());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testLoadDocument() throws Exception{
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			SpreadsheetDocument spreadDoc = SpreadsheetDocument.loadDocument(filePath);
+			Assert.assertNotNull(spreadDoc);
+			Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE, spreadDoc.getOdfMediaType());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testLoadDocumentFile() throws Exception{
+		
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath(TEST_FILE);
+			File fileDoc = new File(filePath);
+			SpreadsheetDocument spreadDoc = SpreadsheetDocument.loadDocument(fileDoc);;
+			Assert.assertNotNull(spreadDoc);
+			Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE, spreadDoc.getOdfMediaType());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testCreateChart() throws Exception{
+		try {
+			SpreadsheetDocument spDocument = SpreadsheetDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+			String title = "XXXTitle";
+			String[] lables = new String[]{"spring","summer","autumn","autumn"};
+			String[] legends = new String[]{"hello1","hello2","hello3"};
+			double[][] data = new double[][]{{1.2,2.22,3},{2,3,4},{3,4,5},{4,5,6}};
+			DataSet dataset = new DataSet(lables, legends, data);
+			Rectangle rect = new Rectangle();
+			rect.x = 367;
+			rect.y = 389;
+			rect.width = 379;
+			rect.height = 424;
+			Chart spChart = spDocument.createChart(title, dataset, rect);
+			Assert.assertNotNull(spChart);
+			spChart.setChartType(ChartType.AREA);
+			//save
+			spDocument.save(ResourceUtilities.getTestOutput("Chart_"+TEST_FILE));
+			
+			Assert.assertEquals(dataset, spChart.getChartData());
+			Assert.assertEquals("XXXTitle", spChart.getChartTitle());
+			Assert.assertEquals(ChartType.AREA, spChart.getChartType());
+			
+			LOG.log(Level.INFO,"spChart--> " + spChart);
+			
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetSheetByIndex() throws Exception{
+		File file = new File(ResourceUtilities.getAbsolutePath("TestSpreadsheetTable.ods"));
+		SpreadsheetDocument spDocument = SpreadsheetDocument.loadDocument(file);
+		//index < 0 , Not expected, table ==null
+		Table tablenull = spDocument.getSheetByIndex(-1);
+		Assert.assertTrue((tablenull == null));
+		//index > 0 
+		//index = 0
+		Table tableSheet0 = spDocument.getSheetByIndex(0);
+		Assert.assertTrue((tableSheet0 != null));
+		Assert.assertEquals("Sheet1", tableSheet0.getTableName());
+		Assert.assertEquals(29, tableSheet0.getColumnCount());
+		//index = 1
+		Table tableSheet1 = spDocument.getSheetByIndex(1);
+		Assert.assertTrue((tableSheet1 != null));
+		Assert.assertEquals("Sheet2", tableSheet1.getTableName());
+		Assert.assertEquals(1, tableSheet1.getColumnCount());
+	}
+	
+	@Test
+	public void testInsertSheet() throws Exception{
+		File file = new File(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		SpreadsheetDocument spDocument = SpreadsheetDocument.loadDocument(file);
+		//index <0 , Not expected
+		Table table = spDocument.insertSheet(-1);
+		Assert.assertNull(table);
+		//index >= sheet count
+		Table tableb = spDocument.insertSheet(11);
+		Assert.assertNull(tableb);
+		
+		//index is within the law
+		Table tab = spDocument.getSheetByName("tabellDemo2");
+		if(tab != null){
+			for(int i=0;i<spDocument.getSheetCount();i++){
+				if(tab.equals(spDocument.getSheetByIndex(i)))
+					spDocument.removeSheet(i);
+			}
+		}
+		Table tablea = spDocument.insertSheet(0);
+		Column col = tablea.appendColumn();
+		col.setWidth(12.99);
+		Column col2 = tablea.appendColumn();
+		col.setWidth(12.);
+		tablea.setTableName("tabellDemo2");
+		Assert.assertEquals("tabellDemo2", tablea.getTableName());
+		spDocument.save(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		
+	}
+	
+	@Test
+	public void testRemoveSheet() throws Exception{
+		File file = new File(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		SpreadsheetDocument spDocument = SpreadsheetDocument.loadDocument(file);
+		//index <0 , Not expected
+		Table table = spDocument.insertSheet(-1);
+		Assert.assertNull(table);
+		//index >= sheet count
+		Table tableb = spDocument.insertSheet(11);
+		Assert.assertNull(tableb);
+		
+		//index is within the law
+		Table tab = spDocument.getSheetByName("tabellDemo2");
+		if(tab != null){
+			for(int i=0;i<spDocument.getSheetCount();i++){
+				if(tab.equals(spDocument.getSheetByIndex(i)))
+					spDocument.removeSheet(i);
+			}
+		}
+		Table tablea = spDocument.insertSheet(0);
+		Column col = tablea.appendColumn();
+		col.setWidth(12.99);
+		Column col2 = tablea.appendColumn();
+		col.setWidth(12.);
+		tablea.setTableName("tabellDemo2");
+		Assert.assertEquals("tabellDemo2", tablea.getTableName());
+		spDocument.removeSheet(0);
+		Table tablem = spDocument.getSheetByIndex(0);
+		Assert.assertNotSame(tablea, tablem);
+		
+		spDocument.save(ResourceUtilities.getAbsolutePath(TEST_FILE));
+	}
+	
+	@Test
+	public void testGetSheetByIndex2() throws Exception{
+		File file = new File(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		SpreadsheetDocument spDocument = SpreadsheetDocument.loadDocument(file);
+		//index <0 , Not expected
+		Table table = spDocument.insertSheet(-1);
+		Assert.assertNull(table);
+		//index >= sheet count
+		Table tableb = spDocument.insertSheet(11);
+		Assert.assertNull(tableb);
+		
+		//index is within the law
+		Table tab = spDocument.getSheetByName("tabellDemo1");
+		if(tab != null)
+			tab.remove();
+		
+		Table taba = spDocument.getSheetByName("Tabelle1");
+		Table tablea = spDocument.insertSheet(taba,0);
+		tablea.setTableName("tabellDemo1");
+		Assert.assertEquals("tabellDemo1", tablea.getTableName());
+		Table tablem = spDocument.getSheetByIndex(0);
+		Assert.assertEquals(tablea, tablem);
+		
+		spDocument.save(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetTemplateTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetTemplateTest.java
new file mode 100644
index 0000000..b4c92df
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetTemplateTest.java
@@ -0,0 +1,79 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.simple;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of calc documents.
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class SpreadsheetTemplateTest {
+
+	private static final String TEST_SPREADSHEET_TEMPLATE = "/spreadsheetTestTemplate.ots";
+
+	@Test
+	public void testLoadingASpreadsheetTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_SPREADSHEET_TEMPLATE));
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingASpreadsheetTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_SPREADSHEET_TEMPLATE));
+		File destination = File.createTempFile("simple-test", ".ots");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewSpreadsheetTemplate() throws Exception {
+		Document document = SpreadsheetDocument.newSpreadsheetTemplateDocument();
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getMediaTypeString());
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("simple-test", ".ots");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof SpreadsheetDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfSpreadsheetDocument() throws Exception {
+		SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+		document.changeMode(SpreadsheetDocument.OdfMediaType.SPREADSHEET_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = SpreadsheetDocument.newSpreadsheetTemplateDocument();
+		document.changeMode(SpreadsheetDocument.OdfMediaType.SPREADSHEET);
+		Assert.assertEquals(Document.OdfMediaType.SPREADSHEET.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetTest.java
new file mode 100644
index 0000000..4bec0ba
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/SpreadsheetTest.java
@@ -0,0 +1,119 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class SpreadsheetTest {
+	
+	private final static String TEST_FILE_NAME = "TestSpreadsheetTable.ods";
+
+	@Test
+	public void testGetSheetCount() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_FILE_NAME));
+			Assert.assertEquals(3, document.getSheetCount());
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSheetByIndexOrName() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_FILE_NAME));
+			Table table1 = document.getSheetByName("Sheet2");
+			Table table2 = document.getSheetByIndex(1);
+			Assert.assertEquals("Sheet2", table1.getTableName());
+			Assert.assertEquals("Sheet2", table2.getTableName());
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testInsertSheet() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_FILE_NAME));
+			int oldCount = document.getSheetCount();
+			Table table = document.insertSheet(0);
+			Assert.assertFalse("Sheet1".equals(table.getTableName()));
+			int newCount = document.getSheetCount();
+			Assert.assertEquals(1, newCount - oldCount);
+			table = document.insertSheet(document.getSheetByName("Sheet1"), 2);
+			Assert.assertEquals(table.getTableName(), document.getSheetByIndex(2).getTableName());
+			document.save(ResourceUtilities.newTestOutputFile("Output_"+TEST_FILE_NAME)); 
+			
+			//data table from difference document.
+			document = SpreadsheetDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_FILE_NAME));
+			Table sheet1 = document.getSheetByName("Sheet1");
+			SpreadsheetDocument document1 = SpreadsheetDocument.newSpreadsheetDocument();
+			table = document1.insertSheet(sheet1, 0);
+			Assert.assertEquals(sheet1.getCellByPosition("E3").getDisplayText(), table.getCellByPosition("E3").getDisplayText());
+			document1.save(ResourceUtilities.newTestOutputFile("Output2_"+TEST_FILE_NAME));
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testAppendAndRemoveSheet() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_FILE_NAME));
+			Table table = document.appendSheet("Sheet4");
+			Assert.assertEquals("Sheet4", table.getTableName());
+			table = document.appendSheet(document.getSheetByName("Sheet1"), "Sheet5");
+			Assert.assertEquals("Sheet5", table.getTableName());
+			document.save(ResourceUtilities.newTestOutputFile("Output_"+TEST_FILE_NAME));
+			
+			//reload
+			document = SpreadsheetDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Output_"+TEST_FILE_NAME));
+			document.removeSheet(4);
+			Assert.assertNull(document.getSheetByName("Sheet5"));
+			document.removeSheet(3);
+			Assert.assertNull(document.getSheetByName("Sheet4"));
+			
+			//data table from difference document.
+			document = SpreadsheetDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_FILE_NAME));
+			Table sheet1 = document.getSheetByName("Sheet1");
+			SpreadsheetDocument document1 = SpreadsheetDocument.newSpreadsheetDocument();
+			table = document1.appendSheet(sheet1, "SheetA");
+			Assert.assertEquals(sheet1.getCellByPosition("E3").getDisplayText(), table.getCellByPosition("E3").getDisplayText());
+			document1.save(ResourceUtilities.newTestOutputFile("Output2_"+TEST_FILE_NAME));
+		} catch (Exception e) {
+			Logger.getLogger(SpreadsheetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/TextDocumentTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/TextDocumentTest.java
new file mode 100644
index 0000000..8ee1a87
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/TextDocumentTest.java
@@ -0,0 +1,586 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple;
+
+import java.awt.Rectangle;
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.element.office.OfficeAnnotationElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleFootnoteSepElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleMasterPageElement;
+import org.odftoolkit.odfdom.dom.element.style.StylePageLayoutPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.dom.style.props.OdfStylePropertiesSet;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStylePageLayout;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.odfdom.type.Length;
+import org.odftoolkit.odfdom.type.Percent;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.Document.OdfMediaType;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.chart.ChartType;
+import org.odftoolkit.simple.chart.DataSet;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.style.MasterPage;
+import org.odftoolkit.simple.style.NumberFormat;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AdjustmentStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.PrintOrientation;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class TextDocumentTest {
+	
+	private static final Logger LOG = Logger.getLogger(TextDocumentTest.class.getName());
+	private static final String EMPTY_TEXT_DOCUMENT_PATH = "TextFieldSampleDocument.odt";
+	
+	@Test
+	public void testAddPageBreak() {
+		try {
+			// test new creation document.
+			TextDocument newDoc = TextDocument.newTextDocument();
+			Paragraph paragraph = newDoc.addParagraph("before page break");
+			newDoc.addPageBreak();
+			validPageBreakExist(newDoc, paragraph);
+			Paragraph refParagraph = newDoc.addParagraph("after page break");
+			newDoc.addParagraph("end page");
+			newDoc.addPageBreak(refParagraph);
+			validPageBreakExist(newDoc, refParagraph);
+			newDoc.save(ResourceUtilities.newTestOutputFile("AddPageBreakOutput.odt"));
+
+			// test exist document.
+			TextDocument existDoc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("test2.odt"));
+			paragraph = existDoc.addParagraph("before page break");
+			existDoc.addPageBreak();
+			validPageBreakExist(existDoc, paragraph);
+			refParagraph = existDoc.getParagraphByIndex(0, true);
+			existDoc.addPageBreak(refParagraph);
+			validPageBreakExist(existDoc, refParagraph);
+			existDoc.save(ResourceUtilities.newTestOutputFile("test2Out.odt"));
+			
+		} catch (Exception e) {
+			Logger.getLogger(TextDocumentTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	@Test
+	public void testAddPagebreakWithMasterPage() {
+		try {
+
+			TextDocument newDoc = TextDocument.newTextDocument();
+
+			// create a new master page
+			Paragraph paragraph = newDoc
+					.addParagraph("before page break - original Landscape");
+			MasterPage master1 = MasterPage.getOrCreateMasterPage(newDoc,
+					"Landscape");
+			master1.setPageWidth(279.4);
+			master1.setPageHeight(215.9);
+			master1.setNumberFormat(NumberFormat.HINDU_ARABIC_NUMBER.toString());
+			master1.setPrintOrientation(PrintOrientation.LANDSCAPE);
+			master1.setFootnoteMaxHeight(0);
+			master1.setWritingMode(StyleTypeDefinitions.WritingMode.LRTB);
+			master1.setMargins(20, 20, 20, 20);
+			master1.setFootnoteSepProperties(AdjustmentStyle.LEFT, Color
+					.valueOf("#000000"), 1, 1, null, Percent.valueOf("25%"),
+					0.18);
+			newDoc.addPageBreak(paragraph, master1);
+			newDoc.addParagraph("after page break - original Landscape");
+			validMasterPageApplied(newDoc, paragraph, master1);
+			newDoc
+					.save(ResourceUtilities
+							.newTestOutputFile("AddPageBreakWithMasterPageOutput1.odt"));
+
+			// modify the master page
+			paragraph = newDoc
+					.addParagraph("before page break - modified Landscape");
+			MasterPage master2 = MasterPage.getOrCreateMasterPage(newDoc,
+					"Landscape");
+			master2.setPageWidth(100);
+			master2.setPageHeight(300);
+			master2.setNumberFormat(null);
+			master2.setPrintOrientation(null);
+			master2.setMargins(20, 20, 0, 0);
+			newDoc.addPageBreak(paragraph, master2);
+			newDoc.addParagraph("after page break - modified Landscape");
+			validMasterPageApplied(newDoc, paragraph, master2);
+
+			// apply existing master page
+			paragraph = newDoc.addParagraph("before page break - Standard");
+			MasterPage master3 = MasterPage.getOrCreateMasterPage(newDoc,
+					"Standard");
+			newDoc.addPageBreak(paragraph, master3);
+			newDoc.addParagraph("after page break - Standard");
+			newDoc.addParagraph("end page");
+			newDoc
+					.save(ResourceUtilities
+							.newTestOutputFile("AddPageBreakWithMasterPageOutput2.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextDocumentTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	private void validMasterPageApplied(TextDocument newDoc,
+			Paragraph paragraph, MasterPage masterPage) throws Exception {
+		Node paragraphNode = paragraph.getOdfElement().getNextSibling();
+		Assert.assertTrue(paragraphNode instanceof TextPElement);
+
+		// check paragraph style
+		OdfOfficeAutomaticStyles styles = newDoc.getContentDom()
+				.getAutomaticStyles();
+		OdfStyle style = styles.getStyle(((TextPElement) paragraphNode)
+				.getStyleName(), OdfStyleFamily.Paragraph);
+		Assert.assertNotNull(style);
+
+		// check master page style
+		String masterName = style.getStyleMasterPageNameAttribute();
+		StyleMasterPageElement master = newDoc.getOfficeMasterStyles()
+				.getMasterPage(masterName);
+		Assert.assertEquals(masterPage.getName(), masterName);
+		Assert.assertNotNull(master);
+
+		// check page layout style
+		String pageLayoutName = master.getStylePageLayoutNameAttribute();
+		OdfStylePageLayout pageLayout = master.getAutomaticStyles()
+				.getPageLayout(pageLayoutName);
+		Assert.assertNotNull(pageLayout);
+
+		// check page layout properties
+		StylePageLayoutPropertiesElement properties = (StylePageLayoutPropertiesElement) pageLayout
+				.getPropertiesElement(OdfStylePropertiesSet.PageLayoutProperties);
+		Assert.assertNotNull(properties);
+		// page width
+		checkDoubleValue(masterPage.getPageWidth(), properties
+				.getFoPageWidthAttribute());
+		// page height
+		checkDoubleValue(masterPage.getPageHeight(), properties
+				.getFoPageHeightAttribute());
+		// footnote max height
+		checkDoubleValue(masterPage.getFootnoteMaxHeight(), properties
+				.getStyleFootnoteMaxHeightAttribute());
+		// margins
+		checkDoubleValue(masterPage.getMarginTop(), properties
+				.getFoMarginTopAttribute());
+		checkDoubleValue(masterPage.getMarginBottom(), properties
+				.getFoMarginBottomAttribute());
+		checkDoubleValue(masterPage.getMarginLeft(), properties
+				.getFoMarginLeftAttribute());
+		checkDoubleValue(masterPage.getMarginRight(), properties
+				.getFoMarginRightAttribute());
+		// writing mode
+		checkStringValue(masterPage.getWritingMode(), properties
+				.getStyleWritingModeAttribute());
+		// number format
+		checkStringValue(masterPage.getNumberFormat(), properties
+				.getStyleNumFormatAttribute());
+		// print orientation
+		checkStringValue(masterPage.getPrintOrientation(), properties
+				.getStylePrintOrientationAttribute());
+
+		// check footnote separator line
+		StyleFootnoteSepElement footnoteSep = (StyleFootnoteSepElement) properties
+				.getElementsByTagName("style:footnote-sep").item(0);
+		Assert.assertNotNull(footnoteSep);
+		checkStringValue(masterPage.getFootnoteSepAdjustment(), footnoteSep
+				.getStyleAdjustmentAttribute());
+		checkStringValue(masterPage.getFootnoteSepColor(), footnoteSep
+				.getStyleColorAttribute());
+		checkStringValue(masterPage.getFootnoteSepLineStyle(), footnoteSep
+				.getStyleLineStyleAttribute());
+		checkDoubleValue(masterPage.getFootnoteSepDistanceAfterSep(),
+				footnoteSep.getStyleDistanceAfterSepAttribute());
+		checkDoubleValue(masterPage.getFootnoteSepDistanceBeforeSep(),
+				footnoteSep.getStyleDistanceBeforeSepAttribute());
+		checkDoubleValue(masterPage.getFootnoteSepThickness(), footnoteSep
+				.getStyleWidthAttribute());
+		checkDoubleValue(masterPage.getFootnoteSepWidth(), footnoteSep
+				.getStyleRelWidthAttribute());
+	}
+
+	private void checkStringValue(String expected, String actual) {
+		if (expected == null) {
+			Assert.assertNull(actual);
+		} else if (expected.equals("page")) {
+			Assert.assertTrue(actual == null || actual.equals(expected));
+		} else {
+			Assert.assertEquals(expected, actual);
+		}
+	}
+
+	private void checkDoubleValue(double expected, String actual) {
+		double value = 0;
+		if (actual != null) {
+			if (Percent.isValid(actual)) {
+				value = Percent.valueOf(actual).doubleValue();
+			} else {
+				value = Length.parseDouble(actual, Unit.MILLIMETER);
+			}
+		}
+		Assert.assertEquals(expected, value);
+	}
+
+	@Test
+	public void testAddComment() {
+		try {
+			// test new creation document.
+			TextDocument newDoc = TextDocument.newTextDocument();
+			
+			Paragraph paragraph = newDoc.addParagraph("Paragraph1");
+			paragraph.addComment("This is a comment for Paragraph1", "Simple ODF");
+			Node firstChildNode = paragraph.getOdfElement().getFirstChild();
+			Assert.assertTrue(firstChildNode instanceof OfficeAnnotationElement);
+			OfficeAnnotationElement comment = (OfficeAnnotationElement) firstChildNode;
+			Assert.assertEquals("Simple ODF", comment.getFirstChild().getTextContent());
+			Assert.assertEquals("This is a comment for Paragraph1", comment.getLastChild().getTextContent());
+			Assert.assertTrue(firstChildNode instanceof OfficeAnnotationElement);
+			
+			paragraph = newDoc.addParagraph("Paragraph2");
+			paragraph.addComment("This is a comment for Paragraph2", null);
+			firstChildNode = paragraph.getOdfElement().getFirstChild();
+			Assert.assertTrue(firstChildNode instanceof OfficeAnnotationElement);
+			comment = (OfficeAnnotationElement) firstChildNode;
+			Assert.assertEquals(System.getProperty("user.name"), comment.getFirstChild().getTextContent());
+			Assert.assertEquals("This is a comment for Paragraph2", comment.getLastChild().getTextContent());
+			
+			newDoc.save(ResourceUtilities.newTestOutputFile("AddCommentOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextDocumentTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	private void validPageBreakExist(TextDocument newDoc, Paragraph paragraph) throws Exception {
+		Node paragraphNode = paragraph.getOdfElement().getNextSibling();
+		Assert.assertTrue(paragraphNode instanceof TextPElement);
+		OdfContentDom contentDocument = newDoc.getContentDom();
+		OdfOfficeAutomaticStyles styles = contentDocument.getAutomaticStyles();
+		OdfStyle style = styles.getStyle(((TextPElement) paragraphNode).getStyleName(), OdfStyleFamily.Paragraph);
+		Assert.assertNotNull(style);
+		Node paragraphPropertiesNode = style.getFirstChild();
+		Assert.assertNotNull(paragraphPropertiesNode instanceof StyleParagraphPropertiesElement);
+		Assert.assertEquals(((StyleParagraphPropertiesElement) paragraphPropertiesNode).getFoBreakBeforeAttribute(),
+				"page");
+	}
+	
+
+	@Test
+	public void testGetMediaTypeString() throws Exception {
+		try {
+			TextDocument tdoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath(EMPTY_TEXT_DOCUMENT_PATH));
+			Assert.assertNotNull(tdoc);
+			
+			OdfMediaType odfMedia = tdoc.getOdfMediaType();
+			String mediaType = odfMedia.getMediaTypeString();
+			Assert.assertEquals("application/vnd.oasis.opendocument.text", mediaType);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testNewTextDocument() throws Exception {
+		try {
+			TextDocument tdoc = TextDocument.newTextDocument(TextDocument.OdfMediaType.TEXT_MASTER);
+			OdfMediaType odfMediaA = tdoc.getOdfMediaType();
+			String filePath = ResourceUtilities.getAbsolutePath("");
+			tdoc.save(filePath + "testNewTextDocument.odt");
+
+			//validate
+			TextDocument tdocument = TextDocument.loadDocument(filePath + "testNewTextDocument.odt");
+			OdfMediaType odfMediaB = tdocument.getOdfMediaType();
+			Assert.assertEquals(odfMediaA, odfMediaB);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testLoadDocumentResource() throws Exception {
+		try {
+			TextDocument tdocument = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+			Assert.assertNotNull(tdocument);
+			OdfMediaType odfMediaB = tdocument.getOdfMediaType();
+			Assert.assertEquals("application/vnd.oasis.opendocument.text", odfMediaB.getMediaTypeString());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testLoadDocumentFile() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath("headerFooterHidden.odt");
+			File file = new File(filePath);
+			TextDocument tdocument = TextDocument.loadDocument(file);
+			Assert.assertNotNull(tdocument);
+			OdfMediaType odfMediaB = tdocument.getOdfMediaType();
+			Assert.assertEquals("application/vnd.oasis.opendocument.text", odfMediaB.getMediaTypeString());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testGetTableContainerElement() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath("headerFooterHidden.odt");
+			File file = new File(filePath);
+			TextDocument tdocument = TextDocument.loadDocument(file);
+			Assert.assertNotNull(tdocument);
+			
+			TableContainer tablecon = tdocument.getTableContainerImpl();
+			OdfElement odfeleA = tablecon.getTableContainerElement();
+			OdfElement odfeleB = tdocument.getTableContainerElement();
+			Assert.assertEquals(odfeleA, odfeleB);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testAddText() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath("headerFooterHidden.odt");
+			File file = new File(filePath);
+			TextDocument tdocument = TextDocument.loadDocument(file);
+			Assert.assertNotNull(tdocument);
+			//Paragraph textParagraph1 = tdocument.addParagraph("Paragraph1");
+			OdfTextParagraph textParagraph = tdocument.addText("text1");
+			
+			Assert.assertEquals("text1", textParagraph.getTextContent());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testRemoveParagraph() throws Exception {
+		try {
+			String filePath = ResourceUtilities.getAbsolutePath("headerFooterHidden.odt");
+			File file = new File(filePath);
+			TextDocument tdoc = TextDocument.loadDocument(file);
+			Assert.assertNotNull(tdoc);
+			
+			Paragraph para = tdoc.addParagraph("paragraph1");
+			Assert.assertEquals("paragraph1", para.getTextContent());
+			boolean flag = tdoc.removeParagraph(para);
+			Document doc = para.getOwnerDocument();
+			Assert.assertNotSame(doc, tdoc);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testDeclareVariable() throws Exception {
+		try {
+			TextDocument tdoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+			Assert.assertNotNull(tdoc);
+			
+			VariableField vField = tdoc.declareVariable("variable1", VariableField.VariableType.SIMPLE);
+			Assert.assertEquals("variable1", vField.getVariableName());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testGetVariableFieldByName() throws Exception {
+		
+		try {
+			TextDocument tdoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+			Assert.assertNotNull(tdoc);
+			
+			VariableField vFieldA = tdoc.declareVariable("variable1", VariableField.VariableType.SIMPLE);
+			vFieldA.getVariableName();
+			System.out.println(vFieldA.getVariableName());
+			Assert.assertEquals("variable1", vFieldA.getVariableName());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testCreateChart() throws Exception {
+		TextDocument tdoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+		String title = "title_name";
+		String[] labels = {"hello", "hi","odf"};
+		String[] legends = {"hello1", "hi1","odf1"};
+		double[][] data = {{1.11, 43.23}, {3.22, 4.00, 5.43}, {121.99, 123.1, 423.00}};
+		DataSet dataset = new DataSet(labels, legends, data);
+		Rectangle rect = new Rectangle();
+		Chart chart = tdoc.createChart(title, dataset, rect);
+		chart.setChartType(ChartType.AREA);
+		Assert.assertEquals(ChartType.AREA, chart.getChartType());
+		Assert.assertEquals("title_name", chart.getChartTitle());
+		Assert.assertEquals(dataset, chart.getChartData());
+		
+		//save
+		tdoc.save(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+	}
+	
+	@Test
+	public void testGetChartCount() throws Exception {
+		TextDocument tdoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+		String title = "title_name";
+		String[] labels = {"hello", "hi","odf"};
+		String[] legends = {"hello1", "hi1","odf1"};
+		double[][] data = {{1.11, 43.23}, {3.22, 4.00, 5.43}, {121.99, 123.1, 423.00}};
+		DataSet dataset = new DataSet(labels, legends, data);
+		Rectangle rect = new Rectangle();
+		Chart chart = tdoc.createChart(title, dataset, rect);
+		List chartA = tdoc.getChartByTitle("title_name");
+		chart.setChartType(ChartType.AREA);
+		Assert.assertEquals(ChartType.AREA, chart.getChartType());
+		Assert.assertEquals("title_name", chart.getChartTitle());
+		Assert.assertEquals(dataset, chart.getChartData());
+		
+		int count = tdoc.getChartCount();
+		Assert.assertEquals(chartA.size(), count);
+		
+		//save
+		//tdoc.save(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+	}
+	
+	@Test
+	public void testinsertContentFromDocumentBefore() throws Exception {
+		TextDocument src1 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		TextDocument src2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		TextDocument target1 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		TextDocument target2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		Paragraph p1 = target1.getParagraphByIndex(2, true);
+		target1.insertContentFromDocumentBefore(src1, p1, true);
+		Iterable<OdfStyle> pstyles1 = target1.getStylesDom().getOfficeStyles().getStylesForFamily(OdfStyleFamily.Paragraph);
+		Iterator<OdfStyle> ite = pstyles1.iterator();
+		int i=0;
+		System.out.println("Custom Styles in TestInsertDocumentWithStyleBefore.odt");
+		while(ite.hasNext()){
+			OdfStyle odfStyle = ite.next();
+			String sname = odfStyle.getAttribute("style:name");
+			if(sname.startsWith("style"))
+			{
+				i++;
+				System.out.println(sname);
+			}
+		}	
+		Assert.assertEquals(6, i);
+		target1.save(ResourceUtilities.newTestOutputFile("TestInsertDocumentWithStyleBefore.odt"));
+		
+		target2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		Paragraph p2 = target2.getParagraphByIndex(2, true);
+		target2.insertContentFromDocumentBefore(src2, p2, false);
+		
+		Iterable<OdfStyle> pstyles2 = target2.getStylesDom().getOfficeStyles().getStylesForFamily(OdfStyleFamily.Paragraph);
+		Iterator<OdfStyle> ite2 = pstyles2.iterator();
+		i=0;
+		System.out.println("Custom Styles in TestInsertDocumentWithoutStyleBefore.odt");
+		while(ite2.hasNext()){
+			OdfStyle odfStyle = ite2.next();
+			String sname = odfStyle.getAttribute("style:name");
+			if(sname.startsWith("style"))
+			{
+				i++;
+				System.out.println(sname);
+			}
+		}	
+		Assert.assertEquals(3, i);
+		target2.save(ResourceUtilities.newTestOutputFile("TestInsertDocumentWithoutStyleBefore.odt"));
+	}
+	@Test
+	public void testinsertContentFromDocumentAfter() throws Exception {
+		TextDocument src1 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		TextDocument src2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		TextDocument target1 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		TextDocument target2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		Paragraph p1 = target1.getParagraphByIndex(2, true);
+		target1.insertContentFromDocumentAfter(src1, p1, true);
+		Iterable<OdfStyle> pstyles1 = target1.getStylesDom().getOfficeStyles().getStylesForFamily(OdfStyleFamily.Paragraph);
+		Iterator<OdfStyle> ite = pstyles1.iterator();
+		int i=0;
+		System.out.println("Custom Styles in TestInsertDocumentWithStyleAfter.odt:");
+		while(ite.hasNext()){
+			OdfStyle odfStyle = ite.next();
+			String sname = odfStyle.getAttribute("style:name");
+			if(sname.startsWith("style"))
+			{
+				i++;
+				System.out.println(sname);
+			}
+		}	
+		Assert.assertEquals(6, i);
+		target1.save(ResourceUtilities.newTestOutputFile("TestInsertDocumentWithStyleAfter.odt"));
+		
+		
+		
+		target2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("TestInsertDocument.odt"));
+		Paragraph p2 = target2.getParagraphByIndex(2, true);
+		target2.insertContentFromDocumentAfter(src2, p2, false);
+		
+		Iterable<OdfStyle> pstyles2 = target2.getStylesDom().getOfficeStyles().getStylesForFamily(OdfStyleFamily.Paragraph);
+		Iterator<OdfStyle> ite2 = pstyles2.iterator();
+		i=0;
+		System.out.println("Custom Styles in TestInsertDocumentWithoutStyleAfter.odt:");
+		while(ite2.hasNext()){
+			OdfStyle odfStyle = ite2.next();
+			String sname = odfStyle.getAttribute("style:name");
+			if(sname.startsWith("style"))
+			{
+				i++;
+				System.out.println(sname);
+			}
+		}	
+		Assert.assertEquals(3, i);
+		target2.save(ResourceUtilities.newTestOutputFile("TestInsertDocumentWithoutStyleAfter.odt"));
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/TextTemplateTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/TextTemplateTest.java
new file mode 100644
index 0000000..3755e46
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/TextTemplateTest.java
@@ -0,0 +1,141 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.simple;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test class for template aspects of calc documents.
+ * 
+ * @author <a href="mailto:fhopf@odftoolkit.org">Florian Hopf</a>
+ */
+public class TextTemplateTest {
+
+	private static final String TEST_TEXT_TEMPLATE = "/textTestTemplate.ott";
+
+	@Test
+	public void testLoadingATextTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_TEXT_TEMPLATE));
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+	}
+
+	@Test
+	public void testSavingATextTemplate() throws Exception {
+		Document document = Document.loadDocument(this.getClass().getResourceAsStream(TEST_TEXT_TEMPLATE));
+		File destination = File.createTempFile("simple-test", ".ott");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+	}
+
+	@Test
+	public void testNewTextTemplate() throws Exception {
+		Document document = TextDocument.newTextTemplateDocument();
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				document.getMediaTypeString());
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("simple-test", ".ott");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof TextDocument);
+	}
+
+	@Test
+	public void testNewTextMaster() throws Exception {
+		Document document = TextDocument.newTextMasterDocument();
+		Assert.assertEquals(Document.OdfMediaType.TEXT_MASTER.getMediaTypeString(),
+				document.getMediaTypeString());
+		Assert.assertEquals(Document.OdfMediaType.TEXT_MASTER.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("simple-test", ".ott");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_MASTER.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof TextDocument);
+	}
+
+	@Test
+	public void testNewTextWeb() throws Exception {
+		Document document = TextDocument.newTextWebDocument();
+		Assert.assertEquals(Document.OdfMediaType.TEXT_WEB.getMediaTypeString(),
+				document.getMediaTypeString());
+		Assert.assertEquals(Document.OdfMediaType.TEXT_WEB.getMediaTypeString(),
+				document.getPackage().getMediaTypeString());
+		File destination = File.createTempFile("simple-test", ".ott");
+		document.save(destination);
+
+		// load again
+		Document loadedDocument = Document.loadDocument(destination);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_WEB.getMediaTypeString(),
+				loadedDocument.getMediaTypeString());
+		Assert.assertTrue(document instanceof TextDocument);
+	}
+
+	@Test
+	public void testSwitchingOdfTextDocument() throws Exception {
+		TextDocument document = TextDocument.newTextDocument();
+		document.changeMode(TextDocument.OdfMediaType.TEXT_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_WEB);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_WEB.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_MASTER);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_MASTER.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = TextDocument.newTextTemplateDocument();
+		document.changeMode(TextDocument.OdfMediaType.TEXT);
+		Assert.assertEquals(Document.OdfMediaType.TEXT.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_MASTER);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_MASTER.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_WEB);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_WEB.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = TextDocument.newTextMasterDocument();
+		document.changeMode(TextDocument.OdfMediaType.TEXT);
+		Assert.assertEquals(Document.OdfMediaType.TEXT.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_WEB);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_WEB.getMediaTypeString(), document.getPackage().getMediaTypeString());
+
+		document = TextDocument.newTextWebDocument();
+		document.changeMode(TextDocument.OdfMediaType.TEXT);
+		Assert.assertEquals(Document.OdfMediaType.TEXT.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_TEMPLATE);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_TEMPLATE.getMediaTypeString(), document.getPackage().getMediaTypeString());
+		document.changeMode(TextDocument.OdfMediaType.TEXT_MASTER);
+		Assert.assertEquals(Document.OdfMediaType.TEXT_MASTER.getMediaTypeString(), document.getPackage().getMediaTypeString());
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/chart/ChartTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/chart/ChartTest.java
new file mode 100644
index 0000000..1e9dd06
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/chart/ChartTest.java
@@ -0,0 +1,223 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.chart;
+
+import java.awt.Rectangle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ChartTest {
+
+	private static final String TEST_FILE = "ChartTest.ods";
+	private static final String CHART_FILE1 = "TestCreateChartWithLocalData.ods";
+	private static final String CHART_FILE2 = "TestCreateChartWithCellRange.ods";
+	private static final String CHART_FILE3 = "TestRemoveChart.ods";
+	private static final String CHART_FILE_ODT = "TestODTChart.odt";
+	private static final String CHART_FILE_ODP = "TestODPChart.odp";
+
+	@Test
+	public void testEquals() {
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			String title = "Main";
+			String[] lables = new String[]{"Anna","Daisy","Tony","MingFei"};
+			String[] legends = new String[]{"Day1","Day2","Day3"};
+			double[][] data = new double[][]{{1,2,3},{2,3,4},{3,4,5},{4,5,6}};
+			DataSet dataset = new DataSet(lables,legends,data);
+			Rectangle rect = new Rectangle();
+			rect.x = 67;
+			rect.y = 89;
+			rect.width = 379;
+			rect.height = 424;
+			Chart chart = new Chart(doc.getContentDom().getRootElement().newOfficeBodyElement().newOfficeChartElement().newChartChartElement(null), null);
+			chart.setChartTitle(title);
+			chart.setChartType(ChartType.AREA);
+			chart.setUseLegend(true);
+			chart.setChartData(dataset);
+			Assert.assertEquals(dataset, chart.getChartData());
+			Assert.assertEquals("Main", chart.getChartTitle());
+			Assert.assertEquals(ChartType.AREA, chart.getChartType());
+			
+			System.out.println("chart " + chart);
+			
+		} catch (Exception e) {
+			Logger.getLogger(DataSetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testCreateChartWithLocalData() {
+		SpreadsheetDocument doc;
+		try {
+			doc = SpreadsheetDocument.newSpreadsheetDocument();
+			String title = "LocalData";
+			// double[][] data = new double[3][3];
+			String[] lables = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data = new double[][] { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 } };
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 2700;
+			rect.width = 10000;
+			rect.height = 12000;
+			Chart newChart = doc.createChart(title, lables, legends, data, rect);
+			Chart chart = doc.getChartById(newChart.getChartID());
+			DataSet ds = chart.getChartData();
+			Assert.assertEquals(title, chart.getChartTitle());
+			Assert.assertEquals(ChartType.BAR, chart.getChartType());
+			Assert.assertArrayEquals(lables, ds.getLabels());
+			Assert.assertArrayEquals(legends, ds.getLegends());
+			Assert.assertTrue(legends.length == ds.getDataSeriesCount());
+			Assert.assertNotNull(doc.getChartByTitle("LocalData"));
+			Assert.assertTrue(chart.isUseLegend() == false);
+			chart.setChartTitle("Chart with local-data");
+			chart.setUseLegend(false);
+			Assert.assertEquals(chart.getChartTitle(), "Chart with local-data");
+			Assert.assertFalse(chart.isUseLegend() == true);
+			doc.save(ResourceUtilities.newTestOutputFile(CHART_FILE1));
+
+			Document doc1 = Document.loadDocument(ResourceUtilities.getTestResourceAsStream(CHART_FILE1));
+			Assert.assertEquals(doc1.getMediaTypeString(), Document.OdfMediaType.SPREADSHEET.getMediaTypeString());
+			doc = (SpreadsheetDocument) doc1;
+
+			Assert.assertNotNull(doc.getChartByTitle("Chart with local-data"));
+			Assert.assertNotNull(doc.getChartByTitle("LocalData"));
+
+			newChart = doc.getChartByTitle("Chart with local-data").get(0);
+			Assert.assertArrayEquals(newChart.getChartData().getLabels(), ds.getLabels());
+			Assert.assertEquals(ChartType.BAR, newChart.getChartType());
+			Assert.assertEquals(newChart.getChartData().getLegendByIndex(1), legends[1]);
+			Assert.assertTrue(legends.length == newChart.getChartData().getDataSeriesCount());
+
+		} catch (Exception e) {
+			Logger.getLogger(DataSetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testCreateChartWithCellRange() {
+		try {
+			SpreadsheetDocument doc = (SpreadsheetDocument) Document.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_FILE));
+			String barTitle = "Bar Chart with CellRange ";
+			String areaTitle = "AREA Chart with CellRange";
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 2700;
+			rect.width = 10000;
+			rect.height = 12000;
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.A1:A.E21"), true, true, true, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.A1:A.E21"), true, true, false, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.B1:A.E21"), true, false, true, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.B1:A.E21"), true, false, false, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.A2:A.E21"), false, true, true, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.A2:A.E21"), false, true, false, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.B2:A.E21"), false, false, true, rect);
+			doc.createChart(barTitle, doc, CellRangeAddressList.valueOf("A.B2:A.E21"), false, false, false, rect);
+			Chart chartID8 = doc.createChart(areaTitle, doc, CellRangeAddressList.valueOf("A.B2:A.E21"), false, false,
+					false, rect);
+			Chart chart8 = doc.getChartById(chartID8.getChartID());
+			chart8.setChartType(ChartType.AREA);
+			Assert.assertEquals(ChartType.AREA, chart8.getChartType());
+			//Assert.assertEquals(8, doc.getChartByTitle(barTitle).size());
+			Assert.assertNotNull(doc.getChartByTitle(areaTitle));
+			doc.save(ResourceUtilities.newTestOutputFile(CHART_FILE2));
+			
+		} catch (Exception e) {
+			Logger.getLogger(DataSetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testRemoveChart() {
+
+		try {
+			SpreadsheetDocument doc = (SpreadsheetDocument) Document.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(CHART_FILE2));
+			doc.deleteChartById("Object 1");
+			//Assert.assertEquals(9, doc.getChartCount());
+			String barTitle = "Bar Chart with CellRange ";
+			String areaTitle = "AREA Chart with CellRange";
+			doc.deleteChartByTitle(barTitle);
+			Assert.assertNotNull(doc.getChartByTitle(areaTitle));
+			Assert.assertEquals(1, doc.getChartCount());
+			doc.save(ResourceUtilities.newTestOutputFile(CHART_FILE3));
+
+		} catch (Exception e) {
+			Logger.getLogger(DataSetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testCreateChartInDocument() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			String title = "LocalData";
+			// double[][] data = new double[3][3];
+			String[] lables = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data = new double[][] { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 } };
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 2700;
+			rect.width = 10000;
+			rect.height = 12000;
+			Chart chartID = doc.createChart(title, lables, legends, data, rect);
+			Chart chart = doc.getChartById(chartID.getChartID());
+			DataSet ds = chart.getChartData();
+			Assert.assertEquals(title, chart.getChartTitle());
+			Assert.assertEquals(ChartType.BAR, chart.getChartType());
+			Assert.assertArrayEquals(lables, ds.getLabels());
+			Assert.assertArrayEquals(legends, ds.getLegends());
+			Assert.assertTrue(legends.length == ds.getDataSeriesCount());
+			Assert.assertNotNull(doc.getChartByTitle("LocalData"));
+			Assert.assertFalse(chart.isUseLegend() == true);
+			chart.setChartTitle("Chart with local-data");
+			chart.setUseLegend(false);
+			chart.setChartType(ChartType.RADAR);
+			Assert.assertEquals(chart.getChartTitle(), "Chart with local-data");
+			Assert.assertTrue(chart.isUseLegend() == false);
+			Assert.assertEquals(chart.getChartType(), ChartType.RADAR);
+			doc.save(ResourceUtilities.newTestOutputFile(CHART_FILE_ODT));
+
+			PresentationDocument pDoc = PresentationDocument.newPresentationDocument();
+			pDoc.createChart(title, lables, legends, data, rect);
+			pDoc.save(ResourceUtilities.newTestOutputFile(CHART_FILE_ODP));
+
+		} catch (Exception e) {
+			Logger.getLogger(DataSetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/chart/ChartTypeTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/chart/ChartTypeTest.java
new file mode 100644
index 0000000..5766913
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/chart/ChartTypeTest.java
@@ -0,0 +1,59 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.chart;
+
+import java.awt.Rectangle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ChartTypeTest {
+
+	@Test
+	public void testEnumValueOf() throws Exception {
+		try {
+			TextDocument tdoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+			String title = "title_name";
+			String[] labels = {"hello", "hi","odf"};
+			String[] legends = {"hello1", "hi1","odf1"};
+			double[][] data = {{1.11, 43.23}, {3.22, 4.00, 5.43}, {121.99, 123.1, 423.00}};
+			DataSet dataset = new DataSet(labels, legends, data);
+			Rectangle rect = new Rectangle();
+			Chart chart = tdoc.createChart(title, dataset, rect);
+			chart.setChartType(ChartType.AREA);
+			
+			String ctype = chart.getChartType().toString();
+			ChartType chartType = ChartType.enumValueOf(ctype);
+			Assert.assertEquals(chartType, ChartType.AREA);
+
+			//save
+			//tdoc.save(ResourceUtilities.getAbsolutePath("headerFooterHidden.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ChartTypeTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/chart/DataSetTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/chart/DataSetTest.java
new file mode 100644
index 0000000..2689a94
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/chart/DataSetTest.java
@@ -0,0 +1,144 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.chart;
+
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.CellRangeAddressList;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class DataSetTest {
+
+	private static final String TEST_FILE = "ChartTest.ods";
+
+	@Test
+	public void testSetValuesFromSpreadsheet() {
+		try {
+			SpreadsheetDocument sheet = (SpreadsheetDocument) Document.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_FILE));
+			DataSet data = new DataSet();
+			data.setValues(CellRangeAddressList.valueOf("A.A1:A.C4"), sheet, true, true, true);
+			Assert.assertEquals("A.A1:A.C4", data.getCellRangeAddress().toString());
+			printDataset(data);
+
+			data.setValues(CellRangeAddressList.valueOf("A.A1:A.C4"), sheet, true, true, false);
+			printDataset(data);
+			System.out.println("Max Item count:" + data.getMaxLengthOfDataSeries());
+			data.setValues(CellRangeAddressList.valueOf("A.A1:A.C4"), sheet, false, true, false);
+			printDataset(data);
+			System.out.println("Max Item count:" + data.getMaxLengthOfDataSeries());
+			data.setValues(CellRangeAddressList.valueOf("A.A1:A.C4"), sheet, true, false, true);
+			printDataset(data);
+			System.out.println("Max Item count:" + data.getMaxLengthOfDataSeries());
+		} catch (Exception e) {
+			Logger.getLogger(DataSetTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testSetValuesFromArray() {
+		int row = 2, column = 3;
+		double[][] data = new double[column][row];
+		String[] labels = new String[row];
+		String[] legends = new String[column];
+		for (int i = 0; i < column; i++) {
+			legends[i] = "legend" + (i + 1);
+			for (int j = 0; j < row; j++) {
+				if (i == 0)
+					labels[j] = "label" + (j + 1);
+				data[i][j] = i * j + i + j;
+			}
+		}
+		DataSet dataset = new DataSet(labels, legends, data);
+		printDataset(dataset);
+	}
+
+	private void printDataset(DataSet data) {
+		String[] firstrow = data.getLocalTableFirstRow();
+		String[] firstcolumn = data.getLocalTableFirstColumn();
+		Double[][] tabledata = data.getLocalTableData();
+		System.out.println();
+		System.out.print("\t\t");
+		for (int j = 0; j < firstrow.length; j++) {
+			System.out.print(firstrow[j] + "\t");
+		}
+		System.out.println();
+
+		for (int i = 0; i < firstcolumn.length; i++) {
+			System.out.print(firstcolumn[i] + "\t\t");
+			for (int j = 0; j < firstrow.length; j++)
+				if (tabledata[i][j] == null)
+					System.out.printf("nul\t");
+				else
+					System.out.printf("%.2f\t", tabledata[i][j].doubleValue());
+			System.out.println();
+
+		}
+	}
+
+	@Test
+	public void testGetCellRanges() {
+		Vector<String> seriesCellRange = new Vector<String>();
+		Vector<String> legendCellAddr = new Vector<String>();
+		DataSet ds = new DataSet();
+		String labelCellRange = ds.getCellRanges("A.A2:A.E21", false, true, false, seriesCellRange, legendCellAddr);
+		Assert.assertEquals("A.A2:A.A21", labelCellRange);
+		Assert.assertEquals(4, seriesCellRange.size());
+		Assert.assertEquals("A.B2:A.B21", seriesCellRange.firstElement());
+		Assert.assertEquals("A.E2:A.E21", seriesCellRange.lastElement());
+		Assert.assertEquals(4, legendCellAddr.size());
+		Assert.assertNull(legendCellAddr.firstElement());
+		Assert.assertNull(legendCellAddr.lastElement());
+
+		labelCellRange = ds.getCellRanges("A.A1:A.E21", true, true, true, seriesCellRange, legendCellAddr);
+		Assert.assertEquals("A.B1:A.E1", labelCellRange);
+		Assert.assertEquals(20, seriesCellRange.size());
+		Assert.assertEquals("A.B2:A.E2", seriesCellRange.firstElement());
+		Assert.assertEquals("A.B21:A.E21", seriesCellRange.lastElement());
+		Assert.assertEquals(20, legendCellAddr.size());
+		Assert.assertEquals("A.A2", legendCellAddr.firstElement());
+		Assert.assertEquals("A.A21", legendCellAddr.lastElement());
+
+		labelCellRange = ds.getCellRanges("A.B1:A.E21", true, false, false, seriesCellRange, legendCellAddr);
+		Assert.assertNull(labelCellRange);
+		Assert.assertEquals(4, seriesCellRange.size());
+		Assert.assertEquals("A.B2:A.B21", seriesCellRange.firstElement());
+		Assert.assertEquals("A.E2:A.E21", seriesCellRange.lastElement());
+		Assert.assertEquals(4, legendCellAddr.size());
+		Assert.assertEquals("A.B1", legendCellAddr.firstElement());
+		Assert.assertEquals("A.E1", legendCellAddr.lastElement());
+
+		labelCellRange = ds.getLocalTableCellRanges(4, 20, seriesCellRange, legendCellAddr);
+		Assert.assertEquals("local-table.A2:local-table.A21", labelCellRange);
+		Assert.assertEquals(4, seriesCellRange.size());
+		Assert.assertEquals("local-table.B2:local-table.B21", seriesCellRange.firstElement());
+		Assert.assertEquals("local-table.E2:local-table.E21", seriesCellRange.lastElement());
+		Assert.assertEquals(4, legendCellAddr.size());
+		Assert.assertEquals("local-table.B1", legendCellAddr.firstElement());
+		Assert.assertEquals("local-table.E1", legendCellAddr.lastElement());
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/GetTextTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/GetTextTest.java
new file mode 100644
index 0000000..389fa77
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/GetTextTest.java
@@ -0,0 +1,107 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfAlienElement;
+import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class GetTextTest {
+
+	public static final Logger LOG = Logger.getLogger(GetTextTest.class.getName());
+
+	/**
+	 * This method will invoke EditableTextExtractor to test text extraction
+	 * function.
+	 */
+	@Test
+	public void testToString() {
+		try {
+			Document doc = Document.loadDocument(ResourceUtilities.getTestResourceAsStream("text-extract.odt"));
+			EditableTextExtractor extractor = EditableTextExtractor.newOdfEditableTextExtractor(doc);
+			String output = extractor.getText();
+			LOG.info(output);
+			int count = 0;
+			int index = output.indexOf("SIMPLE");
+			while (index != -1) {
+				count++;
+				index = output.indexOf("SIMPLE", index + 1);
+			}
+			if (count != 30) {
+				// there are
+				// 23 SIMPLE in the /content.xml
+				// 2 SIMPLE in the /styles.xml
+				// 5 SIMPLE in the /Object 1/content.xml
+				throw new RuntimeException("Something wrong! count=" + count);
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testReturnChar() {
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			textDoc.newParagraph();
+			OdfTextParagraph graph = textDoc.newParagraph("abc");
+
+			TextExtractor extractor = TextExtractor.newOdfTextExtractor(textDoc.getContentRoot());
+			String text = extractor.getText();
+			System.out.println(text);
+
+			int count = 0;
+			for (int i = 0; i < text.length(); i++)
+				if (text.charAt(i) == '\n')
+					count++;
+			Assert.assertEquals(2, count);
+
+			extractor = TextExtractor.newOdfTextExtractor(graph);
+			text = extractor.getText();
+			count = 0;
+			for (int i = 0; i < text.length(); i++)
+				if (text.charAt(i) == '\n')
+					count++;
+			Assert.assertEquals(0, count);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+        
+        @Test
+        public void testExtractFromDocumentWithAlienElement() throws Exception {
+            TextDocument document = TextDocument.newTextDocument();
+            document.getContentRoot().appendChild(new OdfAlienElement(document.getContentDom(), OdfName.newName("instance")));
+            document.addParagraph("Some text");
+            TextExtractor extractor = TextExtractor.newOdfTextExtractor(document.getContentRoot());
+            String text = extractor.getText();
+            Assert.assertEquals("\nSome text", text);
+        }
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/WhitespaceProcessorTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/WhitespaceProcessorTest.java
new file mode 100644
index 0000000..a85604a
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/WhitespaceProcessorTest.java
@@ -0,0 +1,187 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.simple.common;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextLineBreakElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTabElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.TextDocument;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * 
+ * @author J David Eisenberg
+ */
+public class WhitespaceProcessorTest {
+	private static final Logger LOG = Logger.getLogger(WhitespaceProcessorTest.class.getName());
+	TextDocument doc;
+	OdfFileDom dom;
+	String[] plainText = { "nospace", "one space", "two  spaces", "three   spaces", "   three leading spaces",
+			"three trailing spaces   ", "one\ttab", "two\t\ttabs", "\tleading tab", "trailing tab\t",
+			"mixed   \t   spaces and tabs", "line\nbreak" };
+
+	String[][] elementResult = { { "nospace" }, { "one space" }, { "two ", "*s1", "spaces" },
+			{ "three ", "*s2", "spaces" }, { " ", "*s2", "three leading spaces" }, { "three trailing spaces ", "*s2" },
+			{ "one", "*t", "tab" }, { "two", "*t", "*t", "tabs" }, { "*t", "leading tab" }, { "trailing tab", "*t" },
+			{ "mixed ", "*s2", "*t", " ", "*s2", "spaces and tabs" }, { "line", "*n", "break" } };
+
+	public WhitespaceProcessorTest() {
+	}
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = TextDocument.newTextDocument();
+			dom = doc.getContentDom();
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test of append method, of class WhitespaceProcessor.
+	 */
+	@Test
+	public void testAppend() {
+		LOG.info("append");
+		Element element = null;
+		WhitespaceProcessor instance = new WhitespaceProcessor();
+		int i;
+		for (i = 0; i < plainText.length; i++) {
+			element = new OdfTextParagraph(dom);
+			instance.append(element, plainText[i]);
+			compareResults(element, plainText[i], elementResult[i]);
+		}
+	}
+
+	private void compareResults(Element element, String input, String[] output) {
+		int i;
+		int nSpaces;
+		int nSpacesInAttribute;
+		Node node = element.getFirstChild();
+		for (i = 0; i < output.length; i++) {
+			if (output[i].startsWith("*")) {
+				Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+				if (output[i].equals("*t")) {
+					Assert.assertEquals("tab", node.getLocalName());
+				} else if (output[i].equals("*n")) {
+					Assert.assertEquals("line-break", node.getLocalName());
+				} else {
+					nSpaces = Integer.parseInt(output[i].substring(2));
+					Assert.assertEquals(node.getLocalName(), "s");
+					nSpacesInAttribute = Integer.parseInt(((Element) node).getAttribute("text:c"));
+					Assert.assertEquals(nSpaces, nSpacesInAttribute);
+				}
+			} else {
+				Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+				Assert.assertEquals(output[i], node.getTextContent());
+			}
+			node = node.getNextSibling();
+		}
+		Assert.assertEquals(node, null);
+	}
+
+	/**
+	 * Test of getText method, of class WhitespaceProcessor.
+	 */
+	@Test
+	public void testGetText() {
+		LOG.info("getText");
+		Node element = null;
+		WhitespaceProcessor instance = new WhitespaceProcessor();
+		int i;
+		String expResult = "";
+		String result;
+		for (i = 0; i < plainText.length; i++) {
+			element = new OdfTextParagraph(dom);
+			constructElement(element, elementResult[i]);
+			result = plainText[i];
+			expResult = instance.getText(element);
+			Assert.assertEquals(expResult, result);
+		}
+	}
+
+	private void constructElement(Node element, String[] expected) {
+		int i;
+		int nSpaces;
+		TextSElement spaceElement;
+
+		for (i = 0; i < expected.length; i++) {
+			if (expected[i].startsWith("*")) {
+				if (expected[i].equals("*t")) {
+					element.appendChild(new TextTabElement(dom));
+				} else if (expected[i].equals("*n")) {
+					element.appendChild(new TextLineBreakElement(dom));
+				} else {
+					nSpaces = Integer.parseInt(expected[i].substring(2));
+					spaceElement = new TextSElement(dom);
+					spaceElement.setTextCAttribute(nSpaces);
+					element.appendChild(spaceElement);
+				}
+			} else {
+				element.appendChild(dom.createTextNode(expected[i]));
+			}
+		}
+	}
+
+	/**
+	 * Test of appendText method, of class WhitespaceProcessor.
+	 */
+	@Test
+	public void testAppendText() {
+		LOG.info("appendText");
+		Element element = null;
+		int i;
+		for (i = 0; i < plainText.length; i++) {
+			element = new OdfTextParagraph(dom);
+			WhitespaceProcessor.appendText(element, plainText[i]);
+			compareResults(element, plainText[i], elementResult[i]);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/ChapterFieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/ChapterFieldTest.java
new file mode 100644
index 0000000..be3b27b
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/ChapterFieldTest.java
@@ -0,0 +1,90 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextChapterElement;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ChapterFieldTest {
+
+	private static String TEST_DOCUMENT = "headerFooterHidden.odt";
+	
+	@Test
+	public void testSetOutlineLevel() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			ChapterField chapterField = Fields.createChapterField(doc.addParagraph("Chapter:").getOdfElement());
+			chapterField.setOutlineLevel(1);
+			
+			TextChapterElement tchapterele = chapterField.getOdfElement();
+			Integer level = tchapterele.getTextOutlineLevelAttribute();
+			Assert.assertTrue(1 == level);
+			
+			//save
+			//doc.save(ResourceUtilities.getAbsolutePath(TEST_DOCUMENT));
+		} catch (Exception e) {
+			Logger.getLogger(ChapterFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetOdfElement() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			ChapterField chapterField = Fields.createChapterField(doc.addParagraph("Chapter:").getOdfElement());
+			chapterField.setOutlineLevel(1);
+			TextChapterElement tchapterEle = chapterField.getOdfElement();
+			
+			Assert.assertNotNull(tchapterEle);
+			Assert.assertEquals("chapter", tchapterEle.getLocalName());
+			Assert.assertEquals("text:chapter", tchapterEle.getNodeName());
+
+			//save
+			//doc.save(ResourceUtilities.getAbsolutePath("TextFieldSampleDocument.odt"));
+			
+		} catch (Exception e) {
+			Logger.getLogger(ChapterFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetFieldType() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			ChapterField chapterField = Fields.createChapterField(doc.newParagraph("Chapter:"));
+			FieldType fieldType = chapterField.getFieldType();
+			Assert.assertNotNull(fieldType);
+			Assert.assertEquals(FieldType.CHAPTER_FIELD, fieldType);
+		} catch (Exception e) {
+			Logger.getLogger(ChapterFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/ConditionFieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/ConditionFieldTest.java
new file mode 100644
index 0000000..5d1f5b6
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/ConditionFieldTest.java
@@ -0,0 +1,179 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextConditionalTextElement;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ConditionFieldTest {
+
+	private static String TEST_DOCUMENT = "TextFieldSampleDocument.odt";
+	
+	@Test
+	public void testUpdateCondition() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			Paragraph varParagraph = doc.addParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph.getOdfElement());
+
+			// test condition field
+			Paragraph newParagraph = doc.addParagraph("Condition Field Test:");
+			ConditionField conditionField = Fields.createConditionField(newParagraph.getOdfElement(), "test_con_variable == \"true\"",
+					"trueText", "falseText");
+			Assert.assertNotNull(conditionField);
+			conditionField.updateCondition("test_con_variable == \"false\"");
+			TextConditionalTextElement textCondEle = (TextConditionalTextElement) conditionField.getOdfElement();
+			Assert.assertEquals("ooow:test_con_variable == \"false\"", textCondEle.getTextConditionAttribute());
+			//save
+			//doc.save(ResourceUtilities.getAbsolutePath(TEST_DOCUMENT));
+		} catch (Exception e) {
+			Logger.getLogger(ConditionFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testUpdateTrueText() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			Paragraph varParagraph = doc.addParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph.getOdfElement());
+
+			// test condition field
+			Paragraph newParagraph = doc.addParagraph("Condition Field Test:");
+			ConditionField conditionField = Fields.createConditionField(newParagraph.getOdfElement(), "test_con_variable == \"true\"",
+					"trueText", "falseText");
+			Assert.assertNotNull(conditionField);
+			conditionField.updateTrueText("trueTextUpdate");
+			
+			//validate
+			TextConditionalTextElement conditionalTextElement = (TextConditionalTextElement) conditionField.getOdfElement();
+			conditionalTextElement.getTextStringValueIfTrueAttribute();
+			Assert.assertEquals("trueTextUpdate", conditionalTextElement.getTextStringValueIfTrueAttribute());
+			
+			//save
+			//doc.save(ResourceUtilities.getAbsolutePath(TEST_DOCUMENT));
+		} catch (Exception e) {
+			Logger.getLogger(ConditionFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testUpdateFalseText() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			Paragraph varParagraph = doc.addParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph.getOdfElement());
+
+			// test condition field
+			Paragraph newParagraph = doc.addParagraph("Condition Field Test:");
+			ConditionField conditionField = Fields.createConditionField(newParagraph.getOdfElement(), "test_con_variable == \"true\"",
+					"trueText", "falseText");
+			Assert.assertNotNull(conditionField);
+			
+			conditionField.updateCondition("test_con_variable == \"false\"");
+			conditionField.updateFalseText("falseTextUpdate");
+
+			//validate
+			TextConditionalTextElement conditionalTextElement = (TextConditionalTextElement) conditionField.getOdfElement();
+			conditionalTextElement.getTextStringValueIfFalseAttribute();
+			Assert.assertEquals("falseTextUpdate", conditionalTextElement.getTextStringValueIfFalseAttribute());
+		} catch (Exception e) {
+			Logger.getLogger(ConditionFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetOdfElement() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			Paragraph varParagraph = doc.addParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph.getOdfElement());
+
+			// test condition field
+			Paragraph newParagraph = doc.addParagraph("Condition Field Test:");
+			ConditionField conditionField = Fields.createConditionField(newParagraph.getOdfElement(), "test_con_variable == \"true\"",
+					"trueText", "falseText");
+			Assert.assertNotNull(conditionField);
+
+			// validate
+			TextConditionalTextElement conditionalTextElement = (TextConditionalTextElement) conditionField.getOdfElement();
+			conditionalTextElement.getTextStringValueIfFalseAttribute();
+			Assert.assertEquals("falseText", conditionalTextElement.getTextStringValueIfFalseAttribute());
+			
+		} catch (Exception e) {
+			Logger.getLogger(ConditionFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testFieldType() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			Paragraph varParagraph = doc.addParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph.getOdfElement());
+
+			// test condition field
+			Paragraph newParagraph = doc.addParagraph("Condition Field Test:");
+			ConditionField conditionField = Fields.createConditionField(newParagraph.getOdfElement(), "test_con_variable == \"true\"",
+					"trueText", "falseText");
+			Assert.assertNotNull(conditionField);
+			
+			FieldType fieldType = conditionField.getFieldType();
+			Assert.assertEquals(FieldType.CONDITION_FIELD, fieldType);
+
+			// test hide field
+			newParagraph = doc.addParagraph("Hide Text Field Test:");
+			conditionField = Fields.createHiddenTextField(newParagraph.getOdfElement(), "test_con_variable == \"true\"", "hiddenText");
+			FieldType fieldType1 = conditionField.getFieldType();
+			Assert.assertEquals(FieldType.HIDDEN_TEXT_FIELD, fieldType1);
+		} catch (Exception e) {
+			Logger.getLogger(ConditionFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/FieldsTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/FieldsTest.java
new file mode 100644
index 0000000..5f0ecc5
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/FieldsTest.java
@@ -0,0 +1,246 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorInitialsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTimeElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.PageNumberField.DisplayType;
+import org.odftoolkit.simple.style.NumberFormat;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class FieldsTest {
+
+	private static String TEST_DOCUMENT = "TextFieldSampleDocument.odt";
+
+	@Test
+	public void testCreateConditionField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			OdfTextParagraph varParagraph = doc.newParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph);
+
+			// test condition field
+			OdfTextParagraph newParagraph = doc.newParagraph("Condition Field Test:");
+			ConditionField conditionField = Fields.createConditionField(newParagraph, "test_con_variable == \"true\"",
+					"trueText", "falseText");
+			Assert.assertNotNull(conditionField);
+
+			// test hide field
+			newParagraph = doc.newParagraph("Hide Text Field Test:");
+			conditionField = Fields.createHiddenTextField(newParagraph, "test_con_variable == \"true\"", "hiddenText");
+			Assert.assertNotNull(conditionField);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreateVariableField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_simple_variable");
+			Assert.assertNotNull(simpleVariableField);
+			TextSpanElement newTextSpanElement = doc.newParagraph("Update Simple Variable Field:").newTextSpanElement();
+			simpleVariableField.updateField("simple variable content", newTextSpanElement);
+			newTextSpanElement = doc.newParagraph("Show Simple Variable Field:").newTextSpanElement();
+			simpleVariableField.displayField(newTextSpanElement);
+
+			// declare user variable
+			VariableField userVariableField = Fields.createUserVariableField(doc, "test_user_variable", "test");
+			Assert.assertNotNull(userVariableField);
+			OdfTextParagraph newParagraph = doc.newParagraph("Update User Variable Field:");
+			userVariableField.updateField("user variable content", null);
+			newParagraph = doc.newParagraph("Show User Variable Field:");
+			userVariableField.displayField(newParagraph);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCreateReferenceField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			TextSpanElement newTextSpanElement = doc.newParagraph("Reference Content:").newTextSpanElement();
+			newTextSpanElement.setTextContent("This is a test reference content.");
+			ReferenceField referenceField = Fields.createReferenceField(newTextSpanElement, "test-ref");
+			Assert.assertNotNull(referenceField);
+			referenceField
+					.appendReferenceTo(doc.newParagraph("User Reference Field:"), ReferenceField.DisplayType.TEXT);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddChapterField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			ChapterField chapterField = Fields.createChapterField(doc.newParagraph("Chapter:"));
+			Assert.assertNotNull(chapterField);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddTitleOrSubjectField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			TitleField titleField = Fields.createTitleField(doc.newParagraph("The Title:"));
+			Assert.assertNotNull(titleField);
+			Assert.assertEquals("document title", titleField.getOdfElement().getTextContent());
+
+			SubjectField subjectField = Fields.createSubjectField(doc.newParagraph("The Subject:"));
+			Assert.assertNotNull(subjectField);
+			Assert.assertEquals("document subject", subjectField.getOdfElement().getTextContent());
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddAuthorField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			AuthorField authorField = Fields
+					.createAuthorInitialsField(doc.newParagraph("The initials of the author :"));
+			Assert.assertNotNull(authorField);
+			Assert.assertTrue(authorField.getOdfElement() instanceof TextAuthorInitialsElement);
+
+			authorField = Fields.createAuthorNameField(doc.newParagraph("Author:"));
+			Assert.assertNotNull(authorField);
+			Assert.assertTrue(authorField.getOdfElement() instanceof TextAuthorNameElement);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddPageNumberField() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			PageNumberField numberField = Fields.createCurrentPageNumberField(doc.newParagraph("Current Page Number:"));
+			Assert.assertNotNull(numberField);
+			numberField.setNumberFormat(NumberFormat.UPPERCASE_LATIN_ALPHABET);
+			String format = numberField.getOdfElement().getStyleNumFormatAttribute();
+			Assert.assertEquals("A", format);
+			numberField.setDisplayPage(DisplayType.NEXT_PAGE);
+			String type = numberField.getOdfElement().getTextSelectPageAttribute();
+			Assert.assertEquals("next", type);
+
+			numberField = Fields.createPreviousPageNumberField(doc.newParagraph("Previous Page Number:"));
+			type = numberField.getOdfElement().getTextSelectPageAttribute();
+			Assert.assertEquals("previous", type);
+			numberField = Fields.createNextPageNumberField(doc.newParagraph("Next Page Number:"));
+			type = numberField.getOdfElement().getTextSelectPageAttribute();
+			Assert.assertEquals("next", type);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddPageCountField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			PageCountField countField = Fields.createPageCountField(doc.newParagraph("Page Count:"));
+			Assert.assertNotNull(countField);
+			countField.setNumberFormat(NumberFormat.UPPERCASE_LATIN_ALPHABET);
+			String format = countField.getOdfElement().getStyleNumFormatAttribute();
+			Assert.assertEquals("A", format);
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddDateField() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			DateField dateField = Fields.createDateField(doc.newParagraph("Date:"));
+			Assert.assertNotNull(dateField);
+
+			TextDateElement dateEle = dateField.getOdfElement();
+			String oldContent = dateEle.getTextContent();
+			SimpleDateFormat oldFormat = new SimpleDateFormat("yyyy-MM-dd");
+			Date oldDate = oldFormat.parse(oldContent);
+
+			String format = "yy-MM-dd";
+			dateField.formatDate(format);
+			String newContent = dateEle.getTextContent();
+			SimpleDateFormat newFormat = new SimpleDateFormat(format);
+			Date newDate = newFormat.parse(newContent);
+			Assert.assertEquals(oldDate.getTime(), newDate.getTime());
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddTimeField() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			TimeField timeField = Fields.createTimeField(doc.newParagraph("Time:"));
+			Assert.assertNotNull(timeField);
+
+			TextTimeElement timeEle = timeField.getOdfElement();
+			String oldContent = timeEle.getTextContent();
+			SimpleDateFormat oldFormat = new SimpleDateFormat("HH:mm:ss");
+			Date oldDate = oldFormat.parse(oldContent);
+
+			String format = "HH:mm:ss a";
+			timeField.formatTime(format);
+			String newContent = timeEle.getTextContent();
+			SimpleDateFormat newFormat = new SimpleDateFormat(format);
+			Date newDate = newFormat.parse(newContent);
+			Assert.assertEquals(oldDate.getTime(), newDate.getTime());
+		} catch (Exception e) {
+			Logger.getLogger(FieldsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/PageNumberFieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/PageNumberFieldTest.java
new file mode 100644
index 0000000..9d758c0
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/PageNumberFieldTest.java
@@ -0,0 +1,55 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+import org.odftoolkit.simple.common.field.PageNumberField.DisplayType;
+
+public class PageNumberFieldTest {
+
+	@Test
+	public void testGetFieldType() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			PageNumberField numberField = Fields.createCurrentPageNumberField(doc.newParagraph("Current Page Number:"));
+			Assert.assertNotNull(numberField);
+			FieldType fieldType = numberField.getFieldType();
+			Assert.assertNotNull(fieldType);
+			Assert.assertEquals(fieldType, FieldType.CURRENT_PAGE_NUMBER_FIELD);
+			numberField.setDisplayPage(DisplayType.PREVIOUS_PAGE);
+			FieldType fieldType1 = numberField.getFieldType();
+			Assert.assertEquals(fieldType1, FieldType.PREVIOUS_PAGE_NUMBER_FIELD);
+			numberField.setDisplayPage(DisplayType.NEXT_PAGE);
+			FieldType fieldType2 = numberField.getFieldType();
+			Assert.assertEquals(fieldType2, FieldType.NEXT_PAGE_NUMBER_FIELD);
+			
+		} catch (Exception e) {
+			Logger.getLogger(PageNumberFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/SubjectFieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/SubjectFieldTest.java
new file mode 100644
index 0000000..8f57d15
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/SubjectFieldTest.java
@@ -0,0 +1,47 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+
+public class SubjectFieldTest {
+
+	@Test
+	public void testGetFieldType() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			SubjectField subjectField = Fields.createSubjectField(doc.newParagraph("The Subject:"));
+			
+			FieldType fieldType = subjectField.getFieldType();
+			Assert.assertNotNull(subjectField);
+			Assert.assertEquals(fieldType, FieldType.SUBJECT_FIELD);
+		} catch (Exception e) {
+			Logger.getLogger(SubjectFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/TitleFieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/TitleFieldTest.java
new file mode 100644
index 0000000..e03eebb
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/TitleFieldTest.java
@@ -0,0 +1,46 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+
+public class TitleFieldTest {
+
+	@Test
+	public void testGetFieldType() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			TitleField titleField = Fields.createTitleField(doc.newParagraph("The Title:"));
+			Assert.assertNotNull(titleField);
+			FieldType fType = titleField.getFieldType();
+			Assert.assertEquals(fType, FieldType.TITLE_FIELD);
+		} catch (Exception e) {
+			Logger.getLogger(TitleFieldTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/VariableFieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/VariableFieldTest.java
new file mode 100644
index 0000000..ecf55a6
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/field/VariableFieldTest.java
@@ -0,0 +1,78 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.field;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field.FieldType;
+import org.odftoolkit.simple.common.navigation.FieldSelectionTest;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class VariableFieldTest {
+	private static final Logger LOG = Logger.getLogger(VariableFieldTest.class.getName());
+	private static String TEST_DOCUMENT = "TextFieldSampleDocument.odt";
+
+	@Test
+	public void testVariableTypeToString() {
+		try {
+			VariableField.VariableType variableType = VariableField.VariableType.valueOf(VariableField.VariableType.class, VariableField.VariableType.SIMPLE.name());
+			String variableTypeStr = variableType.toString();
+			Assert.assertNotNull(variableType);
+			Assert.assertEquals("simple", variableTypeStr);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testVariableTypesisplayField() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_DOCUMENT));
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_simple_variable");
+			Assert.assertNotNull(simpleVariableField);
+			TextSpanElement newTextSpanElement = doc.newParagraph("Update Simple Variable Field:").newTextSpanElement();
+			simpleVariableField.updateField("simple variable content", newTextSpanElement);
+			
+			FieldType fieldType = simpleVariableField.getFieldType();
+			Assert.assertNotNull(fieldType);
+			Assert.assertEquals(FieldType.SIMPLE_VARIABLE_FIELD, fieldType);
+			newTextSpanElement = doc.newParagraph("Show Simple Variable Field:").newTextSpanElement();
+			simpleVariableField.displayField(newTextSpanElement);
+			simpleVariableField.updateField("aaaa", newTextSpanElement);
+			try {
+				doc.save(ResourceUtilities.newTestOutputFile("TextFieldSampleDocumentVariableField.odt"));
+			} catch (Exception e) {
+				Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+				Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/CellSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/CellSelectionTest.java
new file mode 100644
index 0000000..cf50e67
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/CellSelectionTest.java
@@ -0,0 +1,122 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+/**
+ * Test the method of class org.odftoolkit.simple.common.navigation.CellSelection
+ */
+public class CellSelectionTest {
+
+	public static final String TEST_FILE         = "TestCellSelection.ods";
+	public static final String SAVE_FILE_REPLACE = "CellSelectionResultReplace.ods";
+	SpreadsheetDocument        doc;
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (SpreadsheetDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+		} catch (Exception e) {
+			Logger.getLogger(CellSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test replaceWith method of org.odftoolkit.simple.common.navigation.TextSelection replace all the 'SIMPLE' with 'Odf
+	 * Toolkit'
+	 */
+	@Test
+	public void testAdvancedReplacewith() {
+		Map<String, String> valueProperties = new HashMap<String, String>();
+		valueProperties.put("Amount", "3,000,000");
+		valueProperties.put("Task", "Develop");
+		valueProperties.put("Date", "11/09/2010");
+		valueProperties.put("Time", "14:30");
+		valueProperties.put("Status", "true");
+		Map<String, String> typeProperties = new HashMap<String, String>();
+		typeProperties.put("Amount", "float");
+		typeProperties.put("Task", "string");
+		typeProperties.put("Date", "date");
+		typeProperties.put("Time", "time");
+		typeProperties.put("Status", "boolean");
+		
+		// simple text replace
+		for (String key : valueProperties.keySet()) {
+			String value = valueProperties.get(key);
+			TextNavigation navigate = new TextNavigation(key, doc);
+			while (navigate.hasNext()) {
+				CellSelection selection = (CellSelection) navigate.nextSelection();
+				try {
+					selection.advancedReplaceWith(value);
+					String valueType = selection.getCell().getValueType();
+					Assert.assertEquals(typeProperties.get(key), valueType);
+				} catch (InvalidNavigationException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	/**
+	 * this method tests a simple replace with. Especially Line breaks
+	 */
+	@Test
+	public void testReplaceWith() {
+		Map<String, String> valueProperties = new HashMap<String, String>();
+		valueProperties.put("Amount", "3,000,000");
+		valueProperties.put("Task", "Develop\nWith a second line");
+		valueProperties.put("Date", "11/09/2010");
+		valueProperties.put("Time", "14:30");
+		valueProperties.put("Status", "true");
+
+		// simple text replace
+		for (String key : valueProperties.keySet()) {
+			String value = valueProperties.get(key);
+			TextNavigation navigate = new TextNavigation(key, doc);
+			while (navigate.hasNext()) {
+				CellSelection selection = (CellSelection) navigate.nextSelection();
+				try {
+					// use a simple replace to replace the values
+					selection.replaceWith(value);
+
+					// get the cell's string value (which is different from the textvalue)
+					String newValue = selection.getCell().getStringValue();
+
+					// make sure that the cell's value is the same as the intended value
+					Assert.assertEquals(valueProperties.get(key), newValue);
+				} catch (InvalidNavigationException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/FieldSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/FieldSelectionTest.java
new file mode 100644
index 0000000..59ec6a8
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/FieldSelectionTest.java
@@ -0,0 +1,1069 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.OdfStylesDom;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorInitialsElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAuthorNameElement;
+import org.odftoolkit.odfdom.dom.element.text.TextChapterElement;
+import org.odftoolkit.odfdom.dom.element.text.TextConditionalTextElement;
+import org.odftoolkit.odfdom.dom.element.text.TextDateElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageCountElement;
+import org.odftoolkit.odfdom.dom.element.text.TextPageNumberElement;
+import org.odftoolkit.odfdom.dom.element.text.TextReferenceRefElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.element.text.TextSubjectElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTimeElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTitleElement;
+import org.odftoolkit.odfdom.dom.element.text.TextUserFieldGetElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.Field;
+import org.odftoolkit.simple.common.field.Fields;
+import org.odftoolkit.simple.common.field.ReferenceField;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.field.ReferenceField.DisplayType;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Test the method of class
+ * org.odftoolkit.simple.common.navigation.FieldSelection
+ */
+public class FieldSelectionTest {
+
+	public static final String TEXT_FILE = "TextFieldSampleDocument.odt";
+	public static final String SAVE_FILE_STYLE = "TextFieldResultStyle.odt";
+	public static final String SAVE_FILE_REPLACE = "TextFieldResultReplace.odt";
+
+	TextDocument doc;
+	OdfFileDom contentDOM;
+	TextNavigation search;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			contentDOM = doc.getContentDom();
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test applyStyle method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection append "T4" style
+	 * for all the 'delete' word, 'T4' in the original document is the 'bold'
+	 * style
+	 */
+	@Test
+	public void testApplyStyle() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		OdfOfficeAutomaticStyles autoStyles = null;
+		try {
+			autoStyles = doc.getContentDom().getAutomaticStyles();
+		} catch (Exception e1) {
+			Assert.fail("Failed with " + e1.getClass().getName() + ": '" + e1.getMessage() + "'");
+		}
+		// T4 is the bold style for text
+		OdfStyleBase style = autoStyles.getStyle("T4", OdfStyleFamily.Text);
+		Assert.assertNotNull(style);
+
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			try {
+				item.applyStyle(style);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_STYLE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testReplaceWithSimpleField() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.FIXED_DATE_FIELD);
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testReplaceWithConditionField() {
+		try {
+			search = new TextNavigation("ReplaceConditionTarget", doc);
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			OdfTextParagraph varParagraph = doc.newParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph);
+			// count the initial date field count. 
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 2 "ReplaceConditionTarget" to ConditionField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithConditionField("test_con_variable == \"true\"", "trueText", "falseText");
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testReplaceWithHiddenTextField() {
+		try {
+			search = new TextNavigation("ReplaceHiddenTextTarget", doc);
+			// declare simple variable
+			VariableField simpleVariableField = Fields.createSimpleVariableField(doc, "test_con_variable");
+			OdfTextParagraph varParagraph = doc.newParagraph("test_con_variable:");
+			simpleVariableField.updateField("true", varParagraph);
+
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 2 "ReplaceHiddenTextTarget" to HiddenTextField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithHiddenTextField("test_con_variable == \"true\"", "hiddenText");
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextConditionalTextElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testReplaceWithReferenceField() {
+		try {
+			search = new TextNavigation("ReplaceReferenceTarget", doc);
+			TextSpanElement newTextSpanElement = doc.newParagraph("Selection Reference Content:").newTextSpanElement();
+			newTextSpanElement.setTextContent("This is a test selection reference content.");
+			ReferenceField referenceField = Fields.createReferenceField(newTextSpanElement, "selection-test-ref");
+			// count the initial reference field count.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextReferenceRefElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextReferenceRefElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 2 "ReplaceReferenceTarget" to ReferenceField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithReferenceField(referenceField, DisplayType.TEXT);
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextReferenceRefElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextReferenceRefElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testReplaceWithVariableField() {
+		try {
+			search = new TextNavigation("SelectionUserVariableTarget", doc);
+			// declare variable
+			VariableField userVariableField = Fields.createUserVariableField(doc, "selection_user_variable", "test");
+			// count the initial variable field count.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextUserFieldGetElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextUserFieldGetElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "SelectionUserVariableTarget" to VariableField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithVariableField(userVariableField);
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextUserFieldGetElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextUserFieldGetElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testReplaceWithSimpleField2() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				//fieldSelection.replaceWithSimpleField(Field.FieldType.FIXED_DATE_FIELD);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.DATE_FIELD);	// 1
+				//fieldSelection.replaceWithSimpleField(Field.FieldType.TIME_FIELD);	//3
+				i++;
+			}
+			
+			nodeList = contentDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextDateElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_time_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			
+			//change all <code>ext:fixed</code> value be false 
+			for(int k =0;k<nodeList.getLength();k++){
+				Node nv = nodeList.item(k);
+				if(nv.getFirstChild().getNodeValue().matches("^([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$")){
+					NamedNodeMap nameMap = nv.getAttributes();
+					Node nfix = nameMap.getNamedItem("text:fixed");
+					nfix.setNodeValue("false");
+				}
+			}
+			
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				//fieldSelection.replaceWithSimpleField(Field.FieldType.FIXED_DATE_FIELD);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.TIME_FIELD);
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+			//validate  
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			OdfContentDom contentDom1 = doc1.getContentDom();
+			
+			nodeList = contentDom1.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList.getLength();k++){
+				//
+				Node nv = nodeList.item(k);
+				if(nv.getFirstChild().getNodeValue().matches("^([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$")){
+					NamedNodeMap nameMap = nv.getAttributes();
+					Node nfix = nameMap.getNamedItem("text:fixed");
+					System.out.println("&&& " + nfix.getNodeValue());
+					Assert.assertEquals("false", nfix.getNodeValue());
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_fixed_time_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			NodeList nodeList = contentDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.FIXED_TIME_FIELD);
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextTimeElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+
+	@Test
+	public void testReplaceWithSimpleField_previous_page_number_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList1 = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList1.getLength();k++){
+				//
+				Node nv = nodeList1.item(k);
+				NamedNodeMap nameMap = nv.getAttributes();
+				Node nfix = nameMap.getNamedItem("text:select-page");
+				nfix.setNodeValue("previous");
+			}
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.PREVIOUS_PAGE_NUMBER_FIELD);
+				i++;
+			}
+			nodeList = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+			//validate
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			OdfContentDom contentDom1 = doc1.getContentDom();
+			
+			nodeList = contentDom1.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList.getLength();k++){
+				Node nv = nodeList.item(k);
+				NamedNodeMap nameMap = nv.getAttributes();
+				Node nfix = nameMap.getNamedItem("text:select-page");
+				Assert.assertEquals("previous", nfix.getNodeValue());
+				
+			}
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_current_page_number_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList1 = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList1.getLength();k++){
+				//
+				Node nv = nodeList1.item(k);
+				NamedNodeMap nameMap = nv.getAttributes();
+				Node nfix = nameMap.getNamedItem("text:select-page");
+				nfix.setNodeValue("current");
+			}
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.CURRENT_PAGE_NUMBER_FIELD);
+				i++;
+			}
+			
+			//value
+			nodeList = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+			//validate
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			OdfContentDom contentDom1 = doc1.getContentDom();
+			
+			nodeList = contentDom1.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList.getLength();k++){
+				Node nv = nodeList.item(k);
+				NamedNodeMap nameMap = nv.getAttributes();
+				Node nfix = nameMap.getNamedItem("text:select-page");
+				System.out.println(nfix.getNodeValue());
+				Assert.assertEquals("current", nfix.getNodeValue());
+			}
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testReplaceWithSimpleField_next_page_number_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList1 = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList1.getLength();k++){
+				//
+				Node nv = nodeList1.item(k);
+				NamedNodeMap nameMap = nv.getAttributes();
+				Node nfix = nameMap.getNamedItem("text:select-page");
+				nfix.setNodeValue("next");
+			}
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.NEXT_PAGE_NUMBER_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+			//validate
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			OdfContentDom contentDom1 = doc1.getContentDom();
+			
+			nodeList = contentDom1.getElementsByTagName(TextPageNumberElement.ELEMENT_NAME.getQName());
+			for(int k =0;k<nodeList.getLength();k++){
+				Node nv = nodeList.item(k);
+				NamedNodeMap nameMap = nv.getAttributes();
+				Node nfix = nameMap.getNamedItem("text:select-page");
+				System.out.println(nfix.getNodeValue());
+				Assert.assertEquals("next", nfix.getNodeValue());
+			}
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_page_count_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextPageCountElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextPageCountElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.PAGE_COUNT_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextPageCountElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextPageCountElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testReplaceWithSimpleField_title_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextTitleElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextTitleElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.TITLE_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextTitleElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextTitleElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_subject_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextSubjectElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextSubjectElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.SUBJECT_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextSubjectElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextSubjectElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testReplaceWithSimpleField_author_name_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextAuthorNameElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextAuthorNameElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.AUTHOR_NAME_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextAuthorNameElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextAuthorNameElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testReplaceWithSimpleField_author_initials_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextAuthorInitialsElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextAuthorInitialsElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.AUTHOR_INITIALS_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextAuthorInitialsElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextAuthorInitialsElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_chapter_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			// count the initial date field count. should be 1.
+			OdfContentDom contentDom = doc.getContentDom();
+			
+			NodeList nodeList = contentDom.getElementsByTagName(TextChapterElement.ELEMENT_NAME.getQName());
+			int i = nodeList.getLength();
+			OdfStylesDom styleDom = doc.getStylesDom();
+			nodeList = styleDom.getElementsByTagName(TextChapterElement.ELEMENT_NAME.getQName());
+			i += nodeList.getLength();
+			// replace all the 3 "ReplaceDateTarget" to FixedDateField.
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.CHAPTER_FIELD);
+				i++;
+			}
+			
+			//validate
+			nodeList = contentDom.getElementsByTagName(TextChapterElement.ELEMENT_NAME.getQName());
+			int j = nodeList.getLength();
+			nodeList = styleDom.getElementsByTagName(TextChapterElement.ELEMENT_NAME.getQName());
+			j += nodeList.getLength();
+			Assert.assertEquals(j, i);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_reference_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.REFERENCE_FIELD);
+			}
+		} catch (Exception e) {
+			//Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("this is not a vaild simple field type.", e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_simple_variable_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.SIMPLE_VARIABLE_FIELD);
+			}
+		} catch (Exception e) {
+			//Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("this is not a vaild simple field type.", e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_user_variable_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.USER_VARIABLE_FIELD);
+			}
+		} catch (Exception e) {
+			//Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("this is not a vaild simple field type.", e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_condition_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.CONDITION_FIELD);
+			}
+		} catch (Exception e) {
+			//Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("this is not a vaild simple field type.", e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testReplaceWithSimpleField_hidden_text_field() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWithSimpleField(Field.FieldType.HIDDEN_TEXT_FIELD);
+			}
+		} catch (Exception e) {
+			//Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.assertTrue(e instanceof IllegalArgumentException);
+			Assert.assertEquals("this is not a vaild simple field type.", e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testReplaceWith() {
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			int i =0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.replaceWith("hello world.");
+				i++;
+			}
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+
+			//validate  
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			
+			search = new TextNavigation("ReplaceDateTarget", doc1);
+			if (search.hasNext()) {
+				Assert.fail();
+			}
+			
+			search = new TextNavigation("hello world.", doc1);
+			int j =0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				item.replaceWith("hi world.");
+				j++;
+			}
+			Assert.assertEquals(i, j);
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	
+	@Test
+	public void testPasteAtEndOf() {
+		try {
+			
+			//count of TextSelection("ReplaceDateTargetchange")
+			TextNavigation search3 = new TextNavigation("ReplaceDateTargetchange", doc);
+			int j = 0;
+			while(search3.hasNext()){
+				TextSelection item = (TextSelection) search3.nextSelection();
+				item.getText();
+				j++;
+			}
+			
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			TextNavigation search2 = new TextNavigation("change", doc);
+			TextSelection pastesource = null;
+			if(search2.hasNext()){
+				pastesource = (TextSelection)search2.nextSelection();
+			}
+			if(pastesource == null)
+				Assert.fail("pastesource == null.");
+			
+			int i =0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				pastesource.pasteAtEndOf(item);
+				i++;
+			}
+			
+			int count = i+j;
+			System.out.println(count);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+
+			//validate  
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			TextNavigation search4 = new TextNavigation("ReplaceDateTargetchange", doc1);
+			int resultcount = 0;
+			while (search4.hasNext()) {
+				TextSelection item = (TextSelection) search4.nextSelection();
+				item.getText();
+				//System.out.println(item.getText());
+				
+				resultcount++;
+			}
+			
+			Assert.assertEquals(count, resultcount);
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testPasteAtFrontOf() {
+		try {
+			
+			//count of TextSelection("ReplaceDateTargetchange")
+			TextNavigation search3 = new TextNavigation("changeReplaceDateTarget", doc);
+			int j = 0;
+			while(search3.hasNext()){
+				TextSelection item = (TextSelection) search3.nextSelection();
+				item.getText();
+				j++;
+			}
+			
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			TextNavigation search2 = new TextNavigation("change", doc);
+			TextSelection pastesource = null;
+			if(search2.hasNext()){
+				pastesource = (TextSelection)search2.nextSelection();
+			}
+			if(pastesource == null)
+				Assert.fail("pastesource == null.");
+			
+			int i =0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				pastesource.pasteAtFrontOf(item);
+				i++;
+			}
+			
+			int count = i+j;
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+
+			//validate  
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			TextNavigation search4 = new TextNavigation("changeReplaceDateTarget", doc1);
+			int resultcount = 0;
+			while (search4.hasNext()) {
+				TextSelection item = (TextSelection) search4.nextSelection();
+				item.getText();
+				//System.out.println(item.getText());
+				
+				resultcount++;
+			}
+			System.out.println(count);
+			System.out.println(resultcount);
+			
+			Assert.assertEquals(count, resultcount);
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testCut() throws Exception{
+		try {
+			search = new TextNavigation("ReplaceDateTarget", doc);
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				FieldSelection fieldSelection = new FieldSelection(item);
+				fieldSelection.cut();
+			}
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+
+			//validate  
+			TextDocument doc1 = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(SAVE_FILE_REPLACE));
+			
+			TextNavigation searchafter = new TextNavigation("ReplaceDateTarget", doc1);
+			if (searchafter.hasNext()) {
+				Assert.fail();
+			}
+			
+		} catch (Exception e) {
+			Logger.getLogger(FieldSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/ImageSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/ImageSelectionTest.java
new file mode 100644
index 0000000..5842ea4
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/ImageSelectionTest.java
@@ -0,0 +1,164 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.net.URI;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.Image;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Test the method of class
+ * org.odftoolkit.simple.common.navigation.ImageSelection
+ */
+public class ImageSelectionTest {
+
+	private static final String TEXT_FILE = "TestTextSelection.odt";
+	TextDocument doc,sourcedoc;
+	TextNavigation search;
+	private Image image2;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			sourcedoc=TextDocument.newTextDocument();
+			Paragraph para = sourcedoc.addParagraph("helloImage");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setName("this image 1");
+			image.setHyperlink(new URI("http://odftoolkit.org"));
+			
+			Paragraph para2 = sourcedoc.addParagraph("helloImage2");
+			image2 = Image.newImage(para2, ResourceUtilities.getURI("testA.jpg"));
+			image2.setName("this image 2");
+			image2.setHyperlink(new URI("http://odftoolkit.org"));
+			
+			
+		} catch (Exception e) {
+			Logger.getLogger(ImageSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+	/**
+	 * Test ReplaceWithImage method of
+	 * org.odftoolkit.simple.common.navigation.ImageSelection replace "SIMPLE" to a Image from Document
+	 */
+	@Test
+	public void testReplaceWithImage() {
+		search = null;
+		//6 Simple, at the middle of original Paragraph, split original Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		int i=0;
+		try {
+			ImageSelection nextImageSelection=null;
+			while (search.hasNext()) {
+				TextSelection item= (TextSelection) search.nextSelection();
+				nextImageSelection=new ImageSelection(item);
+				Paragraph paragraph=sourcedoc.getParagraphByIndex(0, true);
+				TextParagraphElementBase textParaEleBase = paragraph.getOdfElement();
+				NodeList nodeImages = textParaEleBase.getElementsByTagName("draw:image");
+				Node nodeImage = nodeImages.item(0);
+				DrawImageElement im = (DrawImageElement)nodeImage;
+				Image ima = Image.getInstanceof(im);
+				Image image = nextImageSelection.replaceWithImage(ima);
+				Assert.assertNotNull(image);
+				if(image.getName().startsWith("replace")){
+					Assert.assertTrue(true);
+				}else{
+					Assert.fail();
+				}
+				String name="simple"+(i++);
+				image.setName(name);
+				Assert.assertEquals(name,image.getName());
+		}
+			Image image =nextImageSelection.replaceWithImage(image2);
+			image.setName("simpletwice");
+			Assert.assertEquals("simpletwice",image.getName());
+		doc.save(ResourceUtilities.newTestOutputFile("TestImageSelectionImageResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	/**
+	 * Test ReplaceWithImage method of
+	 * org.odftoolkit.simple.common.navigation.ImageSelection replace "SIMPLE" to a Image from Image URI
+	 */
+	@Test
+	public void testReplaceWithImageURI() {
+		search = null;
+		//6 Simple, at the middle of original Paragraph, split original Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		int i=0;
+		try {
+			ImageSelection nextImageSelection=null;
+			while (search.hasNext()) {
+				TextSelection item= (TextSelection) search.nextSelection();
+				nextImageSelection=new ImageSelection(item);
+				URI imageuri = ResourceUtilities.getURI("image_list_item.png");
+				Image image = nextImageSelection.replaceWithImage(imageuri);
+				Assert.assertNotNull(image);
+				if(image.getName().startsWith("replace")){
+					Assert.assertTrue(true);
+				}else{
+					Assert.fail();
+				}
+				String name="simple"+(i++);
+				image.setName(name);
+				Assert.assertEquals(name,image.getName());
+		}
+			URI imageuri =  ResourceUtilities.getURI("testA.jpg");
+			Image image =nextImageSelection.replaceWithImage(imageuri);
+			image.setName("simpletwice");
+			Assert.assertEquals("simpletwice",image.getName());
+		doc.save(ResourceUtilities.newTestOutputFile("TestImageSelectionURIResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/MONPTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/MONPTest.java
new file mode 100644
index 0000000..ad136ff
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/MONPTest.java
@@ -0,0 +1,68 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+/**
+ * Test ReplaceWith method for class org.odftoolkit.simple.common.navigation.TextSelection 
+ */
+public class MONPTest {
+
+	public static final String TEXT_FILE = "navigationtest.odt";
+	public static final String SAVE_FILE = "testsave1.odt";
+
+	/**
+	 * replace all the "mnop" occurance in navigationtest.odt with the word "success"
+	 */
+	@Test
+	public void testReplaceWith() {
+
+		try {
+			TextDocument doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+
+			TextNavigation search = new TextNavigation("mnop", doc);
+
+			int i = 0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				try {
+					item.replaceWith("success");
+					i++;
+					// item.addHref(new URL("http://www.oracle.com"));
+				} catch (InvalidNavigationException e) {
+					Assert.fail(e.getMessage());
+				}
+			}
+			Assert.assertTrue(18 == i);
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE));
+		} catch (Exception e) {
+			Logger.getLogger(MONPTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/ParagraphSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/ParagraphSelectionTest.java
new file mode 100644
index 0000000..ff3569c
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/ParagraphSelectionTest.java
@@ -0,0 +1,140 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+/**
+ * Test the method of class
+ * org.odftoolkit.simple.common.navigation.ParagraphSelection
+ */
+public class ParagraphSelectionTest {
+
+	private static final String TEXT_FILE = "TestTextSelection.odt";
+	TextDocument doc,sourcedoc;
+	TextNavigation search;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			sourcedoc=TextDocument.newTextDocument();
+			sourcedoc.addParagraph("Hello1 from SIMPLE source document!");
+			sourcedoc.addParagraph("Hello2 from source document!");
+			sourcedoc.addParagraph("Hello3 from source document!");
+		} catch (Exception e) {
+			Logger.getLogger(ParagraphSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+	/**
+	 * Test ReplaceWithParagraph method of
+	 * org.odftoolkit.simple.common.navigation.ParagraphSelection replace "SIMPLE","Task1","Container" to different Paragraph
+	 */
+	@Test
+	public void testReplaceWithParagraph() {
+		search = null;
+		//6 Simple, at the middle of original Paragraph, split original Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		int i = 0;
+		while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				ParagraphSelection nextParagraphSelection=new ParagraphSelection(item);
+				Paragraph paragraph=sourcedoc.getParagraphByIndex(0, true);
+				nextParagraphSelection.replaceWithParagraph(paragraph);
+			i++;
+		}
+		search = new TextNavigation("Hello1 from SIMPLE source document!", doc);
+		int j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		
+		//2 Task1, #1 at the start of original Paragraph, #2 replace original Paragraph  
+				search = new TextNavigation("Task1", doc);
+				 i = 0;
+				while (search.hasNext()) {
+						TextSelection item = (TextSelection) search.nextSelection();
+						ParagraphSelection nextParagraphSelection=new ParagraphSelection(item);
+						Paragraph paragraph=sourcedoc.getParagraphByIndex(1, true);
+						nextParagraphSelection.replaceWithParagraph(paragraph);
+					i++;
+				}
+				search = new TextNavigation("Hello2 from source document!", doc);
+				 j = 0;
+				while (search.hasNext()) {
+					search.nextSelection();
+					j++;
+				}
+				Assert.assertTrue(i == j);
+		
+				//1 Container, #1 at the end of original Paragraph, 
+				search = new TextNavigation("Container", doc);
+				 i = 0;
+				while (search.hasNext()) {
+						TextSelection item = (TextSelection) search.nextSelection();
+						ParagraphSelection nextParagraphSelection=new ParagraphSelection(item);
+						Paragraph paragraph=sourcedoc.getParagraphByIndex(2, true);
+						nextParagraphSelection.replaceWithParagraph(paragraph);
+					i++;
+				}
+				search = new TextNavigation("Hello3 from source document!", doc);
+				 j = 0;
+				while (search.hasNext()) {
+					search.nextSelection();
+					j++;
+				}
+				Assert.assertTrue(i == j);
+				
+				
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TestParagraphSelectionResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ParagraphSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TableSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TableSelectionTest.java
new file mode 100644
index 0000000..02eefff
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TableSelectionTest.java
@@ -0,0 +1,190 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+/**
+ * Test the method of class
+ * org.odftoolkit.simple.common.navigation.TableSelection
+ */
+public class TableSelectionTest {
+
+	private static final String TEXT_FILE = "TestTextSelection.odt";
+	TextDocument doc,sourcedoc;
+	TextNavigation search;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			sourcedoc=TextDocument.newTextDocument();
+			
+			String tablename = "Table1";
+			int rowcount = 7, columncount = 5;
+			String[][] data = new String[rowcount][columncount];
+			for (int i = 0; i < rowcount; i++) {
+				for (int j = 0; j < columncount; j++) {
+					data[i][j] = "string" + (i * columncount + j);
+				}
+			}
+
+			String[] rowlabels = new String[rowcount];
+			for (int i = 0; i < rowcount; i++) {
+				rowlabels[i] = "RowHeader" + i;
+			}
+
+			String[] columnlabels = new String[columncount];
+			for (int i = 0; i < columncount; i++) {
+				columnlabels[i] = "ColumnHeader" + i;
+			}
+			Table table = Table.newTable(sourcedoc, rowlabels, columnlabels, data);
+			table.setTableName(tablename);
+			
+			
+			String tablename2 = "Table2";
+			int rowcount2 = 10, columncount2 = 4;
+			double[][] data2 = new double[rowcount2][columncount2];
+			for (int i = 0; i < rowcount2; i++) {
+				for (int j = 0; j < columncount2; j++) {
+					data2[i][j] = Math.random();
+				}
+			}
+
+			String[] rowlabels2 = new String[rowcount2];
+			for (int i = 0; i < rowcount2; i++) {
+				rowlabels2[i] = "RowHeader" + i;
+			}
+
+			String[] columnlabels2 = new String[columncount2];
+			for (int i = 0; i < columncount2; i++) {
+				columnlabels2[i] = "ColumnHeader" + i;
+			}
+
+			Table table2 = Table.newTable(sourcedoc, rowlabels2, columnlabels2, data2);
+			table2.setTableName(tablename2);
+			
+			String tablename3 = "Table3";
+			int rownumber3 = 5;
+			int clmnumber3 = 3;
+
+			Table table1 = Table.newTable(sourcedoc, rownumber3, clmnumber3);
+			table1.setTableName(tablename3);
+			sourcedoc.save(ResourceUtilities.newTestOutputFile("TestTableSelectionSource.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+	/**
+	 * Test replaceWithTable method of
+	 * org.odftoolkit.simple.common.navigation.TableSelection replace replace SIMPLE,Task1,Container to different Table
+	 */
+	@Test
+	public void testReplaceWithTable() {
+		search = null;
+		//6 Simple, at the middle of original Paragraph, split original Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		
+		while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				TableSelection nextTableSelection=new TableSelection(item);
+				Table table=sourcedoc.getTableByName("Table1");
+				Cell cell = table.getCellByPosition(0, 0);
+				cell.setStringValue("SIMPLE");
+				Table newtable = nextTableSelection.replaceWithTable(table);
+				Assert.assertNotNull(newtable);
+				Assert.assertEquals(1, newtable.getHeaderColumnCount());
+				Assert.assertEquals(1, newtable.getHeaderRowCount());
+				Assert.assertEquals(7 + 1, newtable.getRowCount());
+				Assert.assertEquals(5 + 1, newtable.getColumnCount());
+				cell = newtable.getCellByPosition(1, 1);
+				Assert.assertEquals("string", cell.getValueType());
+		}
+	
+		
+		//2 Task1, #1 at the start of original Paragraph, #2 replace original Paragraph  
+				search = new TextNavigation("Task1", doc);
+				 
+				while (search.hasNext()) {
+						TextSelection item = (TextSelection) search.nextSelection();
+						TableSelection nextTableSelection=new TableSelection(item);
+						Table table=sourcedoc.getTableByName("Table2");
+						Table newtable = nextTableSelection.replaceWithTable(table);
+						Cell cell = newtable.getCellByPosition(0, 0);
+						cell.setStringValue("From Source Table2");
+						Assert.assertNotNull(newtable);
+						Assert.assertEquals(1, newtable.getHeaderColumnCount());
+						Assert.assertEquals(1, newtable.getHeaderRowCount());
+						Assert.assertEquals(10 + 1, newtable.getRowCount());
+						Assert.assertEquals(4 + 1, newtable.getColumnCount());
+						
+						cell = newtable.getCellByPosition(1, 1);
+						Assert.assertEquals("float", cell.getValueType());
+				}		
+				//1 RESS%>, #1 at the end of original Paragraph, 
+				search = new TextNavigation("RESS%>", doc);
+
+				while (search.hasNext()) {
+						TextSelection item = (TextSelection) search.nextSelection();
+						TableSelection nextTableSelection=new TableSelection(item);
+						Table table=sourcedoc.getTableByName("Table3");
+						Table newtable = nextTableSelection.replaceWithTable(table);
+						Cell cell = newtable.getCellByPosition(0, 0);
+						cell.setStringValue("From Source Table3");
+						Assert.assertNotNull(newtable);
+						Assert.assertEquals(5, newtable.getRowCount());
+						Assert.assertEquals(3, newtable.getColumnCount());
+
+				}				
+				
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TestTableSelectionResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextDocumentSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextDocumentSelectionTest.java
new file mode 100644
index 0000000..ea51dbb
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextDocumentSelectionTest.java
@@ -0,0 +1,131 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+/**
+ * Test the method of class
+ * org.odftoolkit.simple.common.navigation.TextDocumentSelection
+ */
+public class TextDocumentSelectionTest {
+	
+	private static final String TEXT_FILE = "TestTextSelection.odt";
+	TextDocument doc, sourcedoc;
+	TextNavigation search;
+	
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+	
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+	
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			sourcedoc = TextDocument.newTextDocument();
+			sourcedoc.addParagraph("Hello1 from SIMPLE source document!");
+			sourcedoc.addParagraph("Hello2 from source document!");
+			sourcedoc.addParagraph("Hello3 from source document!");
+		} catch (Exception e) {
+			Logger.getLogger(TextDocumentSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@After
+	public void tearDown() {
+	}
+	
+	/**
+	 * Test ReplaceWithTextDocument method of
+	 * org.odftoolkit.simple.common.navigation.TextDocumentSelection replace
+	 * "Featured Text" to TextDocument, all Styles be included.
+	 */
+	@Test
+	public void testReplaceWithTextDocument() {
+		search = null;
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		// Note: you need cache the nextSelection item because after you replace
+		// currtenItem with TextDocument, TextNavigation.nextSelection will
+		// search from the inserted Content,
+		// it will make you into a loop if the Search keyword also can be found
+		// in the inserted Content.
+		int i = 0;
+		search = new TextNavigation("SIMPLE", doc);
+		TextSelection currtenTextSelection, nextTextSelection = null;
+		while (search.hasNext()) {
+			if (nextTextSelection != null) {
+				currtenTextSelection = nextTextSelection;
+			} else {
+				currtenTextSelection = (TextSelection) search.nextSelection();
+			}
+			nextTextSelection = (TextSelection) search.nextSelection();
+			if (currtenTextSelection != null) {
+				TextDocumentSelection nextParagraphSelection = new TextDocumentSelection(currtenTextSelection);
+				try {
+					nextParagraphSelection.replaceWithTextDocument(sourcedoc);
+					i++;
+				} catch (Exception e) {
+					e.printStackTrace();
+					Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+				}
+			}
+		}
+		if (nextTextSelection != null) {
+			TextDocumentSelection nextParagraphSelection = new TextDocumentSelection(nextTextSelection);
+			try {
+				nextParagraphSelection.replaceWithTextDocument(sourcedoc);
+				i++;
+			} catch (Exception e) {
+				e.printStackTrace();
+				Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+			}
+		}
+		
+		search = new TextNavigation("Hello1 from SIMPLE source document!", doc);
+		int j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TestTextDocumentSelectionResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextDocumentSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextNavigationTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextNavigationTest.java
new file mode 100644
index 0000000..dc2134e
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextNavigationTest.java
@@ -0,0 +1,242 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextPElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.presentation.Slide;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+/**
+ * Test the method of class org.odftoolkit.simple.common.navigation.TextNavigation 
+ */
+public class TextNavigationTest {
+
+	private static final Logger LOG = Logger.getLogger(TextNavigationTest.class.getName());
+	private static final String TEXT_FILE = "TestTextSelection.odt";
+	private static final String NAVIGATION_ODFELEMENT_FILE = "NavigationInOdfElementTest.odp";
+	
+	TextDocument doc;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		} catch (Exception e) {
+			Logger.getLogger(TextNavigationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test getCurrentItem method of org.odftoolkit.simple.common.navigation.TextNavigation
+	 */
+	@Test
+	public void testGotoNext() {
+		TextNavigation search = new TextNavigation("delete", doc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			LOG.info(item.toString());
+		}
+
+		try {
+			search = new TextNavigation("delete", doc.getContentRoot());
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				LOG.info(item.toString());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextNavigationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test getNextMatchElement method of org.odftoolkit.simple.common.navigation.TextNavigation
+	 */
+	@Test
+	public void testGetNextMatchElement() {
+		try {
+			// match values by specifying a document to TextNavigation
+			TextNavigation search = new TextNavigation("delete", doc);
+			matchLines(search, doc.getContentRoot());
+			
+			// match value by specifying a Node to the TextNavigation
+			search = new TextNavigation("delete", doc.getContentRoot());
+			matchLines(search, doc.getContentRoot());
+		} catch (Exception e) {
+			Logger.getLogger(TextNavigationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	/**
+	 * Matches the lines on the given search and rootNode
+	 * @param search
+	 * @param rootNode
+	 */
+	private void matchLines(TextNavigation search, Node rootNode) {
+		//NodeList list = doc.getContentDom().getElementsByTagName("text:p");
+		OdfElement match = (OdfElement) search.getNextMatchElement(rootNode);
+		Assert.assertNotNull(match);
+		Assert.assertEquals("Task2.delete next paragraph", TextExtractor.getText(match));
+
+		match = (OdfElement) search.getNextMatchElement(match);
+		Assert.assertNotNull(match);
+		Assert.assertEquals("Hello [delete], I will be delete", TextExtractor.getText(match));
+
+		match = (OdfElement) search.getNextMatchElement(match);
+		Assert.assertNotNull(match);
+		Assert.assertEquals("indeed   delete", TextExtractor.getText(match));
+
+		match = (OdfElement) search.getNextMatchElement(match);
+		Assert.assertNotNull(match);
+		Assert.assertEquals("different span in one single word delete indeed", TextExtractor.getText(match));
+
+		match = (OdfElement) search.getNextMatchElement(match);
+		Assert.assertNotNull(match);
+		Assert.assertEquals("Hello delete this word delete true delete  indeed", TextExtractor.getText(match));
+		
+		match = (OdfElement) search.getNextMatchElement(match);
+		Assert.assertNotNull(match);
+		Assert.assertEquals("something to delete in a frame!", TextExtractor.getText(match));
+	}
+
+	@Test
+	public void testNavigationInOdfElement() {
+		try {
+			PresentationDocument document = PresentationDocument.loadDocument(ResourceUtilities
+					.getAbsolutePath(NAVIGATION_ODFELEMENT_FILE));
+			TextNavigation navigation = new TextNavigation("RANDOM COLORED TEXTBOX", document);
+			int count = 0;
+			while (navigation.hasNext()) {
+				navigation.nextSelection();
+				count++;
+			}
+			Assert.assertEquals(3, count);
+
+			Slide slide = document.getSlideByIndex(0);
+			navigation = new TextNavigation("RANDOM COLORED TEXTBOX", slide.getOdfElement());
+			count = 0;
+			while (navigation.hasNext()) {
+				navigation.nextSelection();
+				count++;
+			}
+			Assert.assertEquals(1, count);
+			document.close();
+		} catch (Exception e) {
+			Logger.getLogger(TextNavigationTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+
+	@Test
+	public void testCellReplacementWithParagraph() throws Exception {
+		replace(new ReplacementAction() {
+
+			public void replace(TextSelection selection, String value) throws Exception {
+				TextParagraphElementBase paragraphElement = new TextPElement(doc.getContentDom());
+				Paragraph para = Paragraph.getInstanceof(paragraphElement);
+				para.setTextContent(value);
+				selection.replaceWith(para);
+			}
+		});
+		
+	}
+	
+
+	@Test
+	public void testCellReplacementWithString() throws Exception {
+		replace(new ReplacementAction() {
+
+			public void replace(TextSelection selection, String value) throws Exception {
+				selection.replaceWith(value);
+			}
+		});
+		
+	}
+	
+
+	private void replace(ReplacementAction replacementAction) throws Exception {
+		TextDocument docToReplaceIn = TextDocument.newTextDocument();
+		Table newTable = docToReplaceIn.getTableBuilder().newTable(2, 2);
+		Cell cell = newTable.getCellByPosition(0, 0);
+		cell.addParagraph("<<ONE>>");
+		cell.addParagraph("<<TWO>>");
+
+		Map<String, String> replacements = new TreeMap<String, String>();
+		replacements.put("<<ONE>>", "1");
+		replacements.put("<<TWO>>", "2");
+
+		// sanity check
+		Assert.assertEquals("<<ONE>>\n<<TWO>>", cell.getDisplayText());
+		Assert.assertEquals("<<ONE>>\n<<TWO>>", cell.getStringValue());
+		
+		for (String toReplace : replacements.keySet()) {
+			TextNavigation navigation = new TextNavigation(toReplace, docToReplaceIn);
+			while (navigation.hasNext()) {
+				TextSelection selection = (TextSelection) navigation.nextSelection();
+				Assert.assertEquals(toReplace, selection.getElement().getTextContent());
+				replacementAction.replace(selection, replacements.get(toReplace));
+			}
+		}
+
+		Assert.assertEquals("1\n2", cell.getDisplayText());
+		Assert.assertEquals("1\n2", cell.getStringValue());
+	}
+	
+	private static interface ReplacementAction {
+		void replace(TextSelection selection, String value) throws Exception;
+	}	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextSelectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextSelectionTest.java
new file mode 100644
index 0000000..a641ab6
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextSelectionTest.java
@@ -0,0 +1,1118 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.text.TextAElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.dom.element.text.TextSpanElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.common.field.Field;
+import org.odftoolkit.simple.common.field.Fields;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.navigation.TextNavigation;
+import org.odftoolkit.simple.common.navigation.TextSelection;
+import org.odftoolkit.simple.common.navigation.TextSelectionTest;
+import org.odftoolkit.simple.draw.Image;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.Span;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Test the method of class
+ * org.odftoolkit.simple.common.navigation.TextSelection
+ */
+public class TextSelectionTest {
+
+	private static final String TEXT_FILE = "TestTextSelection.odt";
+	private static final String TEST_FILE = "TestReplaceWithBasicCases.odt";
+	private static final String TEXT_COMMENT_FILE = "TestTextSelectionComment.odt";
+	private static final String SAVE_FILE_DELETE = "TextSelectionResultDelete.odt";
+	private static final String SAVE_FILE_STYLE = "TextSelectionResultStyle.odt";
+	private static final String SAVE_FILE_HREF = "TextSelectionResultHref.odt";
+	private static final String SAVE_FILE_COMMENT = "TextSelectionResultComment.odt";
+	private static final String SAVE_FILE_REPLACE = "TextSelectionResultReplace.odt";
+	private static final String SAVE_FILE_COPYTO = "TextSelectionResultCopyTo.odt";
+	private static final String SAVE_FILE_COPYTO1 = "TextSelectionResultCopyTo1.odt";
+	private static final String SAVE_FILE_DELETE_PATTERN = "TextSelectionResultPatternDelete.odt";
+	TextDocument doc;
+	OdfFileDom contentDOM;
+	TextNavigation search;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			contentDOM = doc.getContentDom();
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	@Test
+	public void testHasNext() {
+		search = null;
+		search = new TextNavigation("range", doc);
+
+		Assert.assertTrue(search.hasNext());
+		Assert.assertTrue(search.hasNext());
+		Assert.assertTrue(search.hasNext());
+		Assert.assertTrue(search.hasNext());
+		Assert.assertTrue(search.hasNext());
+	}
+
+	
+	/**
+	 * Test pasteAtFrontOf method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection copy the first
+	 * 'change' word in the front of all the 'delete' word
+	 */
+	@Test
+	public void testPasteAtFrontOf() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		TextSelection sel = null;
+
+		TextNavigation search1 = new TextNavigation("change", doc);
+		sel = (TextSelection) search1.nextSelection();
+
+		int i = 0;
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			i++;
+			try {
+				sel.pasteAtFrontOf(item);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		int j = 0;
+		search = new TextNavigation("changedelete", doc);
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_COPYTO));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * Test pasteAtEndOf method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection copy the first
+	 * 'change' word at the end of all the 'delete' word
+	 */
+	@Test
+	public void testPasteAtEndOf() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		TextSelection sel = null;
+
+		TextNavigation search1 = new TextNavigation("change", doc);
+		sel = (TextSelection) search1.nextSelection();
+
+		int i = 0;
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			i++;
+			try {
+				sel.pasteAtEndOf(item);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+		int j = 0;
+		search = new TextNavigation("deletechange", doc);
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_COPYTO1));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * Test applyStyle method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection append "T4" style
+	 * for all the 'delete' word, 'T4' in the original document is the 'bold'
+	 * style
+	 */
+	@Test
+	public void testApplyStyle() {
+		search = null;
+		search = new TextNavigation("delete", doc);
+		OdfOfficeAutomaticStyles autoStyles = null;
+		try {
+			autoStyles = doc.getContentDom().getAutomaticStyles();
+		} catch (Exception e1) {
+			Assert.fail("Failed with " + e1.getClass().getName() + ": '" + e1.getMessage() + "'");
+		}
+		// T4 is the bold style for text
+		OdfStyleBase style = autoStyles.getStyle("T4", OdfStyleFamily.Text);
+		Assert.assertNotNull(style);
+
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			try {
+				item.applyStyle(style);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_STYLE));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test replaceWith method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection replace all the
+	 * 'SIMPLE' with 'Odf Toolkit'
+	 */
+	@Test
+	public void testReplacewith() {
+		search = null;
+		search = new TextNavigation("SIMPLE", doc);
+
+		TextSelection nextSelect = null;
+		TextNavigation nextsearch = new TextNavigation("next", doc);
+		nextSelect = (TextSelection) nextsearch.nextSelection();
+
+		// replace all the "SIMPLE" to "Odf Toolkit"
+		// except the sentence
+		// "Task5.Change the SIMPLE to Odf Toolkit, and bold them."
+		OdfStyle style = new OdfStyle(contentDOM);
+		style.setProperty(StyleTextPropertiesElement.FontWeight, "bold");
+		style.setStyleFamilyAttribute("text");
+		int i = 0;
+		while (search.hasNext()) {
+			if (i > 0) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				try {
+					item.replaceWith("Odf Toolkit");
+					item.applyStyle(style);
+				} catch (InvalidNavigationException e) {
+					Assert.fail(e.getMessage());
+				}
+			}
+			i++;
+		}
+
+		search = new TextNavigation("Odf Toolkit", doc);
+		int j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			nextSelect.replaceWith("bbb");
+		} catch (InvalidNavigationException e1) {
+			Assert.fail(e1.getMessage());
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_REPLACE));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	/**
+	 * Test addComment method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection add comment
+	 * "simpleODF should be Simple ODF" for all the 'simpleODF' word
+	 */
+	@Test
+	public void testAddComment() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_COMMENT_FILE));
+			search = new TextNavigation("simpleODF", textDoc);
+			int i=0;
+			while (search.hasNext()) {
+				TextSelection item = (TextSelection) search.nextSelection();
+				item.addComment("simpleODF should be replaced by Simple ODF.", "devin-"+i);
+				i++;
+			}
+			// there are 7 simpleODF in this test document.
+			Assert.assertEquals(7, i);
+			textDoc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_COMMENT));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	/**
+	 * Test addHref method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection add href
+	 * "http://www.ibm.com" for all the 'delete' word
+	 */
+	@Test
+	public void testAddHref() {
+		search = null;
+		search = new TextNavigation("^delete", doc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			try {
+				item.addHref(new URL("http://www.ibm.com"));
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			} catch (MalformedURLException e) {
+				Assert.fail(e.getMessage());
+				Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_HREF));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+
+	/**
+	 * Test search pattern of
+	 * org.odftoolkit.simple.common.navigation.TextSelection search a snippet of
+	 * text match the pattern "<%([^>]*)%>", and extract the content between
+	 * "<%" and "%>"
+	 */
+	@Test
+	public void testCutPattern() {
+		search = new TextNavigation("<%([^>]*)%>", doc);
+
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			try {
+				String text = item.getText();
+				text = text.substring(2, text.length() - 2);
+				item.replaceWith(text);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_DELETE_PATTERN));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test TextSelection container element, all of them must be minimum text:p
+	 * or text:h. It means container element can't has child element has the
+	 * same text content.
+	 */
+	@Test
+	public void testTextSelectionContainerElement() {
+		search = new TextNavigation("TextSelectionContainer", doc);
+		if (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			OdfElement container = item.getContainerElement();
+			Node childNode = container.getFirstChild();
+			while (childNode != null) {
+				String containerText = childNode.getTextContent();
+				Assert.assertFalse(container.getTextContent().equals(containerText));
+				childNode = childNode.getNextSibling();
+			}
+		} else {
+			Assert.fail("Navigation search nothing.");
+		}
+		// test selected table cell content in draw:frame.
+		search = new TextNavigation("Task", doc);
+		if (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			OdfElement container = item.getContainerElement();
+			Node childNode = container.getFirstChild();
+			while (childNode != null) {
+				String containerText = childNode.getTextContent();
+				Assert.assertFalse(container.getTextContent().equals(containerText));
+				childNode = childNode.getNextSibling();
+			}
+		} else {
+			Assert.fail("Navigation search nothing.");
+		}
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_DELETE_PATTERN));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	@Test
+	public void testGetContainerElement() throws Exception {
+		search = new TextNavigation("TextSelectionContainer", doc);
+		if (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			URL url = new URL("http://www.IBM.com");
+			item.addHref(url);
+			
+			//save
+			//doc.save(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+			
+			//validate
+			OdfElement parentElement = item.getContainerElement();
+			Node node = parentElement.getFirstChild().getFirstChild().getNextSibling();
+			TextAElement textAele = (TextAElement)node;
+			System.out.println(textAele.getXlinkTypeAttribute());
+			System.out.println(textAele.getXlinkHrefAttribute());
+			Assert.assertEquals("simple", textAele.getXlinkTypeAttribute());
+			Assert.assertEquals("http://www.IBM.com", textAele.getXlinkHrefAttribute());
+			
+		} else {
+			Assert.fail("Navigation search nothing.");
+		}
+		
+	}
+	
+	/**
+	 * Test replaceWith method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection
+	 */
+	@Test
+	public void testReplacewithTable() throws Exception {
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		TextDocument sourcedoc = TextDocument.newTextDocument();
+		String tablename = "Table1";
+		int rowcount = 7, columncount = 5;
+		String[][] data = new String[rowcount][columncount];
+		for (int i = 0; i < rowcount; i++) {
+			for (int j = 0; j < columncount; j++) {
+				data[i][j] = "string" + (i * columncount + j);
+			}
+		}
+		
+		String[] rowlabels = new String[rowcount];
+		for (int i = 0; i < rowcount; i++) {
+			rowlabels[i] = "RowHeader" + i;
+		}
+		
+		String[] columnlabels = new String[columncount];
+		for (int i = 0; i < columncount; i++) {
+			columnlabels[i] = "ColumnHeader" + i;
+		}
+		Table table = Table.newTable(sourcedoc, rowlabels, columnlabels, data);
+		table.setTableName(tablename);
+		
+		String tablename2 = "Table2";
+		int rowcount2 = 10, columncount2 = 4;
+		double[][] data2 = new double[rowcount2][columncount2];
+		for (int i = 0; i < rowcount2; i++) {
+			for (int j = 0; j < columncount2; j++) {
+				data2[i][j] = Math.random();
+			}
+		}
+		
+		String[] rowlabels2 = new String[rowcount2];
+		for (int i = 0; i < rowcount2; i++) {
+			rowlabels2[i] = "RowHeader" + i;
+		}
+		
+		String[] columnlabels2 = new String[columncount2];
+		for (int i = 0; i < columncount2; i++) {
+			columnlabels2[i] = "ColumnHeader" + i;
+		}
+		
+		Table table2 = Table.newTable(sourcedoc, rowlabels2, columnlabels2, data2);
+		table2.setTableName(tablename2);
+		String tablename3 = "Table3";
+		int rownumber3 = 5;
+		int clmnumber3 = 3;
+		Table table1 = Table.newTable(sourcedoc, rownumber3, clmnumber3);
+		table1.setTableName(tablename3);
+		search = null;
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			table = sourcedoc.getTableByName("Table1");
+			Cell cell = table.getCellByPosition(0, 0);
+			cell.setStringValue("SIMPLE");
+			Table newtable = item.replaceWith(table);
+			Assert.assertNotNull(newtable);
+			Assert.assertEquals(1, newtable.getHeaderColumnCount());
+			Assert.assertEquals(1, newtable.getHeaderRowCount());
+			Assert.assertEquals(7 + 1, newtable.getRowCount());
+			Assert.assertEquals(5 + 1, newtable.getColumnCount());
+			cell = newtable.getCellByPosition(1, 1);
+			Assert.assertEquals("string", cell.getValueType());
+		}
+		// 2 Task1, #1 at the start of original Paragraph, #2 replace original
+		// Paragraph
+		search = new TextNavigation("Task1", doc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			table = sourcedoc.getTableByName("Table2");
+			Table newtable = item.replaceWith(table);
+			Cell cell = newtable.getCellByPosition(0, 0);
+			cell.setStringValue("From Source Table2");
+			Assert.assertNotNull(newtable);
+			Assert.assertEquals(1, newtable.getHeaderColumnCount());
+			Assert.assertEquals(1, newtable.getHeaderRowCount());
+			Assert.assertEquals(10 + 1, newtable.getRowCount());
+			Assert.assertEquals(4 + 1, newtable.getColumnCount());
+			
+			cell = newtable.getCellByPosition(1, 1);
+			Assert.assertEquals("float", cell.getValueType());
+		}
+		// 1 RESS%>, #1 at the end of original Paragraph,
+		search = new TextNavigation("RESS%>", doc);
+		
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			table = sourcedoc.getTableByName("Table3");
+			Table newtable = item.replaceWith(table);
+			Cell cell = newtable.getCellByPosition(0, 0);
+			cell.setStringValue("From Source Table3");
+			Assert.assertNotNull(newtable);
+			Assert.assertEquals(5, newtable.getRowCount());
+			Assert.assertEquals(3, newtable.getColumnCount());
+		}
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TextSelectionReplacewithTableResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities
+				.getAbsolutePath(TEST_FILE));
+		search = new TextNavigation("<<target>>", doc);
+		int i = 0;
+		try {
+			while (search.hasNext()) {
+				i++;
+				TextSelection item = (TextSelection) search.nextSelection();
+				table = sourcedoc.getTableByName("Table1");
+				Table newtable = item.replaceWith(table);
+				Assert.assertNotNull(newtable);
+				Assert.assertEquals(1, newtable.getHeaderColumnCount());
+				Assert.assertEquals(1, newtable.getHeaderRowCount());
+				Assert.assertEquals(7 + 1, newtable.getRowCount());
+				Assert.assertEquals(5 + 1, newtable.getColumnCount());
+				Cell cell = newtable.getCellByPosition(1, 1);
+				Assert.assertEquals("string", cell.getValueType());
+			}
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TextSelectionReplacewithTableResult-BasicCases.odt"));
+			verifyReplaceWithTableByBasicCases("TextSelectionReplacewithTableResult-BasicCases.odt");
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+	
+	/**
+	 * Test replaceWith method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection
+	 */
+	@Test
+	public void testReplacewithImage() throws Exception {
+		// create source image
+		TextDocument sourcedoc = TextDocument.newTextDocument();
+		Paragraph para = sourcedoc.addParagraph("helloImage");
+		Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+		image.setName("this image 1");
+		image.setHyperlink(new URI("http://odftoolkit.org"));
+		Paragraph para2 = sourcedoc.addParagraph("helloImage2");
+		Image image2 = Image.newImage(para2, ResourceUtilities.getURI("testA.jpg"));
+		image2.setName("this image 2");
+		image2.setHyperlink(new URI("http://odftoolkit.org"));
+		search = null;
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		search = new TextNavigation("SIMPLE", doc);
+		int i = 0;
+		TextSelection item = null;
+		while (search.hasNext()) {
+			item = (TextSelection) search.nextSelection();
+			Paragraph paragraph = sourcedoc.getParagraphByIndex(0, true);
+			TextParagraphElementBase textParaEleBase = paragraph.getOdfElement();
+			NodeList nodeImages = textParaEleBase.getElementsByTagName("draw:image");
+			Node nodeImage = nodeImages.item(0);
+			DrawImageElement im = (DrawImageElement) nodeImage;
+			Image ima = Image.getInstanceof(im);
+			image = item.replaceWith(ima);
+			Assert.assertNotNull(image);
+			if (image.getName().startsWith("replace")) {
+				Assert.assertTrue(true);
+			} else {
+				Assert.fail();
+			}
+			String name = "simple" + (i++);
+			image.setName(name);
+			Assert.assertEquals(name, image.getName());
+		}
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TextSelectionReplacewithImageResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		i = 0;
+		try {
+			while (search.hasNext()) {
+				item = (TextSelection) search.nextSelection();
+				URI imageuri = ResourceUtilities.getURI("image_list_item.png");
+				image = item.replaceWith(imageuri);
+				Assert.assertNotNull(image);
+				if (image.getName().startsWith("replace")) {
+					Assert.assertTrue(true);
+				} else {
+					Assert.fail();
+				}
+				String name = "simple" + (i++);
+				image.setName(name);
+				Assert.assertEquals(name, image.getName());
+			}
+			doc.save(ResourceUtilities.newTestOutputFile("TextSelectionReplacewithImageURIResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities
+				.getAbsolutePath(TEST_FILE));
+		search = new TextNavigation("<<target>>", doc);
+		i = 0;
+		try {
+			while (search.hasNext()) {
+				i++;
+				item = (TextSelection) search.nextSelection();
+				URI imageuri = ResourceUtilities.getURI("image_list_item.png");
+				image = item.replaceWith(imageuri);
+				Assert.assertNotNull(image);
+				if (image.getName().startsWith("replace")) {
+					Assert.assertTrue(true);
+				} else {
+					Assert.fail();
+				}
+			}
+			Assert.assertEquals(11, i);
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TextSelectionReplacewithImageResult-URI-BasicCases.odt"));
+			verifyReplaceWithImageByBasicCases("TextSelectionReplacewithImageResult-URI-BasicCases.odt");
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities
+				.getAbsolutePath(TEST_FILE));
+		search = new TextNavigation("<<target>>", doc);
+		i = 0;
+		try {
+			while (search.hasNext()) {
+				i++;
+				item = (TextSelection) search.nextSelection();
+				image = item.replaceWith(image);
+				Assert.assertNotNull(image);
+				if (image.getName().startsWith("replace")) {
+					Assert.assertTrue(true);
+				} else {
+					Assert.fail();
+				}
+			}
+			Assert.assertEquals(11, i);
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TextSelectionReplacewithImageResult-BasicCases.odt"));
+			verifyReplaceWithImageByBasicCases("TextSelectionReplacewithImageResult-BasicCases.odt");
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+	
+	/**
+	 * Test replaceWith method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection
+	 */
+	@Test
+	public void testReplacewithParagraph() throws Exception {
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		TextDocument sourcedoc = TextDocument.newTextDocument();
+		sourcedoc.addParagraph("Hello1 from SIMPLE source document!");
+		sourcedoc.addParagraph("Hello2 from source document!");
+		sourcedoc.addParagraph("Hello3 from source document!");
+		
+		search = null;
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		int i = 0;
+		TextSelection item = null;
+		while (search.hasNext()) {
+			item = (TextSelection) search.nextSelection();
+			Paragraph paragraph = sourcedoc.getParagraphByIndex(0, true);
+			item.replaceWith(paragraph);
+			i++;
+		}
+		search = new TextNavigation("Hello1 from SIMPLE source document!", doc);
+		int j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		
+		// 2 Task1, #1 at the start of original Paragraph, #2 replace original
+		// Paragraph
+		search = new TextNavigation("Task1", doc);
+		i = 0;
+		while (search.hasNext()) {
+			item = (TextSelection) search.nextSelection();
+			
+			Paragraph paragraph = sourcedoc.getParagraphByIndex(1, true);
+			item.replaceWith(paragraph);
+			i++;
+		}
+		search = new TextNavigation("Hello2 from source document!", doc);
+		j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		
+		// 1 Container, #1 at the end of original Paragraph,
+		search = new TextNavigation("Container", doc);
+		i = 0;
+		while (search.hasNext()) {
+			item = (TextSelection) search.nextSelection();
+			Paragraph paragraph = sourcedoc.getParagraphByIndex(2, true);
+			item.replaceWith(paragraph);
+			i++;
+		}
+		search = new TextNavigation("Hello3 from source document!", doc);
+		j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TextSelectionReplacewithParagraphResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities
+				.getAbsolutePath(TEST_FILE));
+		search = new TextNavigation("<<target>>", doc);
+		i = 0;
+		try {
+			while (search.hasNext()) {
+				i++;
+				item = (TextSelection) search.nextSelection();
+				Paragraph paragraph = sourcedoc.getParagraphByIndex(1, true);
+				paragraph = item.replaceWith(paragraph);
+				Assert.assertNotNull(paragraph);
+				Assert.assertEquals(
+						TextExtractor.getText(paragraph.getOdfElement()),
+						"Hello2 from source document!");
+			}
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TextSelectionReplacewithPararaphResult-BasicCases.odt"));
+			verifyReplaceWithParagraphByBasicCases("TextSelectionReplacewithPararaphResult-BasicCases.odt");
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+	/**
+	 * Test replaceWith method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection
+	 */
+	@Test
+	public void testReplacewithField() throws Exception {
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		TextDocument sourcedoc = TextDocument.newTextDocument();
+		sourcedoc.addParagraph("Hello1 from SIMPLE source document!");
+		sourcedoc.addParagraph("Hello2 from source document!");
+		sourcedoc.addParagraph("Hello3 from source document!");
+		VariableField variableField = Fields.createUserVariableField(sourcedoc, "test_simple_variable","testReplacewithField");
+		Assert.assertNotNull(variableField);
+		TextSpanElement newTextSpanElement = sourcedoc.newParagraph("Update Variable Field:").newTextSpanElement();
+		variableField.updateField("simple variable content", newTextSpanElement);
+		newTextSpanElement = sourcedoc.newParagraph("Show Variable Field:").newTextSpanElement();
+		variableField.displayField(newTextSpanElement);
+		Field orgField = sourcedoc.getVariableFieldByName("test_simple_variable");
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		search = new TextNavigation("SIMPLE", doc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			try {
+				Field newField = item.replaceWith(orgField);
+			} catch (InvalidNavigationException e) {
+				e.printStackTrace();
+			}
+		}
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TextSelectionReplacewithFieldResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	/**
+	 * Test replaceWith method of
+	 * org.odftoolkit.simple.common.navigation.TextSelection
+	 */
+	@Test
+	public void testReplacewithTextDocument() throws Exception {
+		doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		TextDocument sourcedoc = TextDocument.newTextDocument();
+		sourcedoc.addParagraph("Hello1 from SIMPLE source document!");
+		sourcedoc.addParagraph("Hello2 from source document!");
+		sourcedoc.addParagraph("Hello3 from source document!");
+		search = null;
+		// 6 Simple, at the middle of original Paragraph, split original
+		// Paragraph, insert before the second Paragraph.
+		// Note: you need cache the nextSelection item because after you replace
+		// currtenItem with TextDocument, TextNavigation.nextSelection will
+		// search from the inserted Content,
+		// it will make you into a loop if the Search keyword also can be found
+		// in the inserted Content.
+		int i = 0;
+		search = new TextNavigation("SIMPLE", doc);
+		TextSelection currtenTextSelection, nextTextSelection = null;
+		while (search.hasNext()) {
+			if (nextTextSelection != null) {
+				currtenTextSelection = nextTextSelection;
+			} else {
+				currtenTextSelection = (TextSelection) search.nextSelection();
+			}
+			nextTextSelection = (TextSelection) search.nextSelection();
+			if (currtenTextSelection != null) {
+				
+				try {
+					currtenTextSelection.replaceWith(sourcedoc);
+					i++;
+				} catch (Exception e) {
+					e.printStackTrace();
+					Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+				}
+			}
+		}
+		if (nextTextSelection != null) {
+			try {
+				nextTextSelection.replaceWith(sourcedoc);
+				i++;
+			} catch (Exception e) {
+				e.printStackTrace();
+				Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+			}
+		}
+		search = new TextNavigation("Hello1 from SIMPLE source document!", doc);
+		int j = 0;
+		while (search.hasNext()) {
+			search.nextSelection();
+			j++;
+		}
+		Assert.assertTrue(i == j);
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile("TextSelectionReplacewithTextDocumentResult.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	private void verifyReplaceWithTableByBasicCases(String fileName) {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities
+					.getAbsolutePath(fileName));
+			search = new TextNavigation("#1", doc);
+			while (search.hasNext()) {
+				OdfElement description = search.nextSelection().getElement();
+				OdfElement replacement = (OdfElement) description
+						.getNextSibling();
+				Assert.assertNotNull(replacement);
+				Assert.assertTrue(replacement instanceof TableTableElement);
+			}
+			search = new TextNavigation("#2", doc);
+			while (search.hasNext()) {
+				OdfElement description = search.nextSelection().getElement();
+				String contents;
+				do {
+					OdfElement replacement = (OdfElement) description
+							.getNextSibling();
+					Assert.assertNotNull(replacement);
+					contents = TextExtractor.getText(replacement);
+					if (contents.contains("<<target>>")) {
+						Assert.fail();
+					}
+				} while (contents.startsWith("#"));
+			}
+			search = new TextNavigation("#3", doc);
+			OdfElement description = search.nextSelection().getElement();
+			Node replacement = description.getNextSibling();
+			Assert.assertTrue(replacement instanceof TableTableElement);
+			Table table = Table.getInstance((TableTableElement) replacement);
+			String breakBefore = table.getStyleHandler()
+					.getTablePropertiesForRead().getBreakBefore();
+			Assert.assertNotNull(breakBefore);
+			description = search.nextSelection().getElement();
+			replacement = description.getNextSibling();
+			Assert.assertEquals("prefix", TextExtractor
+					.getText((TextParagraphElementBase) replacement));
+			Paragraph para = Paragraph
+					.getInstanceof((TextParagraphElementBase) replacement);
+			breakBefore = para.getStyleHandler()
+					.getParagraphPropertiesForRead().getBreakBefore();
+			Assert.assertNotNull(breakBefore);
+			replacement = replacement.getNextSibling();
+			Assert.assertTrue(replacement instanceof TableTableElement);
+			table = Table.getInstance((TableTableElement) replacement);
+			breakBefore = table.getStyleHandler().getTablePropertiesForRead()
+					.getBreakBefore();
+			Assert.assertNull(breakBefore);
+			replacement = replacement.getNextSibling();
+			Assert.assertEquals("suffix", TextExtractor
+					.getText((TextParagraphElementBase) replacement));
+			para = Paragraph
+					.getInstanceof((TextParagraphElementBase) replacement);
+			breakBefore = para.getStyleHandler()
+					.getParagraphPropertiesForRead().getBreakBefore();
+			Assert.assertNull(breakBefore);
+			description = search.nextSelection().getElement();
+			replacement = description.getNextSibling();
+			Assert.assertTrue(replacement instanceof TableTableElement);
+			table = Table.getInstance((TableTableElement) replacement);
+			String masterStyle = table.getStyleHandler()
+					.getStyleElementForRead()
+					.getAttribute("style:master-page-name");
+			Assert.assertNotNull(masterStyle);
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+	private void verifyReplaceWithImageByBasicCases(String fileName) {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities
+					.getAbsolutePath(fileName));
+			search = new TextNavigation("#2", doc);
+			while (search.hasNext()) {
+				OdfElement description = search.nextSelection().getElement();
+				Node replacement = description.getNextSibling();
+				NodeList children = replacement.getChildNodes();
+				Assert.assertNotNull(children);
+				int count = 0;
+				for (int m = 0; m < children.getLength(); m++) {
+					if (children.item(m) instanceof DrawFrameElement) {
+						count++;
+					}
+				}
+				Assert.assertEquals(3, count);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+	private void verifyReplaceWithParagraphByBasicCases(String fileName) {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities
+					.getAbsolutePath(fileName));
+			search = new TextNavigation("#1", doc);
+			while (search.hasNext()) {
+				OdfElement description = search.nextSelection().getElement();
+				OdfElement replacement = (OdfElement) description
+						.getNextSibling();
+				Assert.assertNotNull(replacement);
+				Assert.assertEquals("Hello2 from source document!",
+						TextExtractor.getText(replacement));
+			}
+			search = new TextNavigation("#2", doc);
+			while (search.hasNext()) {
+				OdfElement description = search.nextSelection().getElement();
+				String contents;
+				do {
+					OdfElement replacement = (OdfElement) description
+							.getNextSibling();
+					Assert.assertNotNull(replacement);
+					contents = TextExtractor.getText(replacement);
+					if (contents.contains("<<target>>")) {
+						Assert.fail();
+					}
+				} while (contents.startsWith("#"));
+			}
+			search = new TextNavigation("#3", doc);
+			OdfElement description = search.nextSelection().getElement();
+			TextParagraphElementBase replacement = (TextParagraphElementBase) description
+					.getNextSibling();
+			Assert.assertEquals("Hello2 from source document!",
+					TextExtractor.getText(replacement));
+			Paragraph para = Paragraph.getInstanceof(replacement);
+			String breakBefore = para.getStyleHandler()
+					.getParagraphPropertiesForRead().getBreakBefore();
+			Assert.assertNotNull(breakBefore);
+			description = search.nextSelection().getElement();
+			replacement = (TextParagraphElementBase) description
+					.getNextSibling();
+			Assert.assertEquals("prefix", TextExtractor.getText(replacement));
+			para = Paragraph.getInstanceof(replacement);
+			breakBefore = para.getStyleHandler()
+					.getParagraphPropertiesForRead().getBreakBefore();
+			Assert.assertNotNull(breakBefore);
+			replacement = (TextParagraphElementBase) replacement
+					.getNextSibling();
+			Assert.assertEquals("Hello2 from source document!",
+					TextExtractor.getText(replacement));
+			para = Paragraph.getInstanceof(replacement);
+			breakBefore = para.getStyleHandler()
+					.getParagraphPropertiesForRead().getBreakBefore();
+			Assert.assertNull(breakBefore);
+			replacement = (TextParagraphElementBase) replacement
+					.getNextSibling();
+			Assert.assertEquals("suffix", TextExtractor.getText(replacement));
+			para = Paragraph.getInstanceof(replacement);
+			breakBefore = para.getStyleHandler()
+					.getParagraphPropertiesForRead().getBreakBefore();
+			Assert.assertNull(breakBefore);
+			description = search.nextSelection().getElement();
+			replacement = (TextParagraphElementBase) description
+					.getNextSibling();
+			Assert.assertEquals("Hello2 from source document!",
+					TextExtractor.getText(replacement));
+			para = Paragraph.getInstanceof(replacement);
+			String masterStyle = para.getStyleHandler()
+					.getStyleElementForRead()
+					.getAttribute("style:master-page-name");
+			Assert.assertNotNull(masterStyle);
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+	private void verifyReplaceWithTextDocumentByBasicCases(String fileName) {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities
+					.getAbsolutePath(fileName));
+			search = new TextNavigation("This is the first paragraph", doc);
+			Assert.assertNotNull(search.hasNext());
+			TextParagraphElementBase pElement = (TextParagraphElementBase) search
+					.nextSelection().getElement();
+			Node nextPElement = pElement.getNextSibling();
+			Assert.assertTrue(nextPElement instanceof TextParagraphElementBase);
+			String contents = TextExtractor
+					.getText((TextParagraphElementBase) nextPElement);
+			if (!contents
+					.startsWith("This is a picture from the source document:"))
+				Assert.fail();
+			TextSpanElement spanEle = (TextSpanElement) pElement
+					.getElementsByTagName("text:span").item(0);
+			Span span = Span.getInstanceof(spanEle);
+			FontStyle fontStyle = span.getStyleHandler()
+					.getTextPropertiesForRead().getFontStyle();
+			Assert.assertEquals(FontStyle.BOLD, fontStyle);
+			Assert.assertTrue(doc.getContentDom().getDocument().getPackage()
+					.contains("Pictures/20000007000010550000107047D3E406.svm"));
+		} catch (Exception e) {
+			Logger.getLogger(TextSelectionTest.class.getName()).log(
+					Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '"
+					+ e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextStyleNavigationTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextStyleNavigationTest.java
new file mode 100644
index 0000000..1f2486e
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/common/navigation/TextStyleNavigationTest.java
@@ -0,0 +1,265 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.common.navigation;
+
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleTextPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfStyleProperty;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+/**
+ * Test the method of class org.odftoolkit.simple.common.navigation.TextStyleNavigation 
+ */
+public class TextStyleNavigationTest {
+
+	private static final Logger LOG = Logger.getLogger(TextStyleNavigationTest.class.getName());
+	public static final String TEXT_FILE = "TestStyleSelection.odt";
+	public static final String SAVE_FILE_PAST_FRONT = "TextStyleSelectionResultInsertFront.odt";
+	public static final String SAVE_FILE_PAST_END = "TextStyleSelectionResultInsertEnd.odt";
+	public static final String SAVE_FILE_DELETE = "TextStyleSelectionResultDelete.odt";
+	public static final String SAVE_FILE_STYLE = "TextStyleSelectionResultStyle.odt";
+	public static final String SAVE_FILE_REPLACE = "TextStyleSelectionResultReplace.odt";
+	public static final String SAVE_FILE_COPYTO = "TextStyleSelectionResultCopyTo.odt";
+	public static final String SAVE_FILE_COPYTO1 = "TextStyleSelectionResultCopyTo1.odt";
+	public static final String SAVE_FILE_CUT_FOOTERHEADER = "TextStyleSelectionResultCutFooterHeader.odt";
+	public static final String SAVE_FILE_APPLY_FOOTERHEADER = "TextStyleSelectionResultApplyFooterHeader.odt";
+	TextDocument doc;
+	TextStyleNavigation search1;
+	TextNavigation search2;
+	TextNavigation search3;
+	TextStyleNavigation search4;
+
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() {
+		try {
+			doc = (TextDocument) Document.loadDocument(ResourceUtilities.getAbsolutePath(TEXT_FILE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@After
+	public void tearDown() {
+	}
+
+	/**
+	 * Test pasteAtFrontOf method of org.odftoolkit.simple.common.navigation.TextStyleNavigation
+	 */
+	@Test
+	public void testPasteAtFrontOf() {
+
+		//search the text of specified style, then insert it before specified text (delete)
+		search1 = null;
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Times New Roman1");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "16pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+		search2 = new TextNavigation("delete", doc);
+		search3 = new TextNavigation("Roman16 Romanl16delete", doc);
+
+		TextSelection itemstyle = null;
+		if (search1.hasNext()) {
+			itemstyle = (TextSelection) search1.nextSelection();
+			LOG.info(itemstyle.toString());
+		}
+		int i = 0;
+		if (itemstyle != null) {
+			while (search2.hasNext()) {
+				i++;
+				TextSelection itemtext = (TextSelection) search2.nextSelection();
+				try {
+					itemstyle.pasteAtFrontOf(itemtext);
+				} catch (InvalidNavigationException e) {
+					LOG.log(Level.SEVERE, e.getMessage(), e);
+					Assert.fail(e.getMessage());
+				}
+				LOG.info(itemtext.toString());
+			}
+		}
+
+		int j = 0;
+		while (search3.hasNext()) {
+			j++;
+			search3.nextSelection();
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_PAST_FRONT));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test pasteAtEndOf method of org.odftoolkit.simple.common.navigation.TextStyleNavigation
+	 */
+	@Test
+	public void testPasteAtEndOf() {
+
+		//search the text of specified style, then insert it after specified text (delete)
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Times New Roman1");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "16pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+		search2 = new TextNavigation("delete", doc);
+		search3 = new TextNavigation("deleteRoman16 Romanl16", doc);
+		TextSelection itemstyle = null;
+		if (search1.hasNext()) {
+			itemstyle = (TextSelection) search1.nextSelection();
+			LOG.info(itemstyle.toString());
+		}
+		int i = 0;
+		if (itemstyle != null) {
+			while (search2.hasNext()) {
+				i++;
+				TextSelection itemtext = (TextSelection) search2.nextSelection();
+				try {
+					itemstyle.pasteAtEndOf(itemtext);
+				} catch (InvalidNavigationException e) {
+					Assert.fail(e.getMessage());
+				}
+				LOG.info(itemtext.toString());
+			}
+		}
+
+		int j = 0;
+		while (search3.hasNext()) {
+			j++;
+			search3.nextSelection();
+		}
+
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_PAST_END));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test cut method of org.odftoolkit.simple.common.navigation.TextStyleNavigation
+	 */
+	@Test
+	public void testCut() {
+
+		//delete all text with specified style
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Century1");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "22pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+		search2 = new TextNavigation("Century22", doc);
+
+		while (search1.hasNext()) {
+			TextSelection item = (TextSelection) search1.nextSelection();
+			try {
+				item.cut();
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		Assert.assertFalse(search2.hasNext());
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_DELETE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test applyStyle method of org.odftoolkit.simple.common.navigation.TextStyleNavigation
+	 */
+	@Test
+	public void testApplyStyle() {
+		//select the text specified style and apply the text with new style.
+		TreeMap<OdfStyleProperty, String> searchProps = new TreeMap<OdfStyleProperty, String>();
+		searchProps.put(StyleTextPropertiesElement.FontName, "Arial");
+		searchProps.put(StyleTextPropertiesElement.FontSize, "12pt");
+		search1 = new TextStyleNavigation(searchProps, doc);
+
+		OdfStyle style = null;
+		try {
+			style = new OdfStyle(doc.getContentDom());
+			style.setProperty(StyleTextPropertiesElement.FontSize, "23pt");
+			style.setProperty(StyleTextPropertiesElement.FontWeight, "bold");
+			style.setStyleFamilyAttribute("text");
+		} catch (Exception e1) {
+			LOG.log(Level.SEVERE, e1.getMessage(), e1);
+			Assert.fail("Failed with " + e1.getClass().getName() + ": '" + e1.getMessage() + "'");
+		}
+
+		int i = 0;
+		while (search1.hasNext()) {
+			i++;
+			TextSelection item = (TextSelection) search1.nextSelection();
+			// LOG.info(item);
+			try {
+				item.applyStyle(style);
+			} catch (InvalidNavigationException e) {
+				Assert.fail(e.getMessage());
+			}
+		}
+
+		TreeMap<OdfStyleProperty, String> chgProps = new TreeMap<OdfStyleProperty, String>();
+		chgProps.put(StyleTextPropertiesElement.FontSize, "23pt");
+		chgProps.put(StyleTextPropertiesElement.FontWeight, "bold");
+		search4 = new TextStyleNavigation(chgProps, doc);
+		int j = 0;
+		while (search4.hasNext()) {
+			j++;
+			search4.nextSelection();
+		}
+		Assert.assertTrue(i == j);
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(SAVE_FILE_STYLE));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/draw/AbstractTextboxContainerTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/AbstractTextboxContainerTest.java
new file mode 100644
index 0000000..1d0d947
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/AbstractTextboxContainerTest.java
@@ -0,0 +1,86 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.PresentationDocument.PresentationClass;
+import org.odftoolkit.simple.presentation.Slide;
+import org.odftoolkit.simple.presentation.Slide.SlideLayout;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class AbstractTextboxContainerTest {
+
+	@Test
+	public void testRemoveTextbox() {
+		try {
+			// new image in presentation
+			PresentationDocument pDoc = PresentationDocument.newPresentationDocument();
+			Slide slide = pDoc.newSlide(0, "slide name ", SlideLayout.TITLE_OUTLINE);
+			java.util.List<Textbox> listTbox = slide.getTextboxByUsage(PresentationClass.TITLE);
+			Textbox titleBox = listTbox.get(0);
+			titleBox.setBackgroundColor(Color.BLUE);
+			//titleBox.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			titleBox.setName("title");
+			titleBox.setTextContent("this is title");
+			
+			//validate
+			Textbox tbox = slide.getTextboxByName("title");
+			Assert.assertEquals(titleBox, tbox);
+			
+			slide.removeTextbox(titleBox);
+			
+			Textbox tbox1 = slide.getTextboxByName("title");
+			Assert.assertNull(tbox1);
+
+			//save
+			pDoc.save(ResourceUtilities.newTestOutputFile("imagep.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(AbstractTextboxContainerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	@Test
+	public void testAddTextbox() {
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("abc");
+			Textbox box1 = p.addTextbox();
+			box1.setTextContent("content XXXX");
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+			
+		} catch (Exception e) {
+			Logger.getLogger(AbstractTextboxContainerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/draw/FrameRectangleTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/FrameRectangleTest.java
new file mode 100644
index 0000000..48aeffb
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/FrameRectangleTest.java
@@ -0,0 +1,87 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class FrameRectangleTest {
+
+	@Test
+	public void testGetDesc() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph demo");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.CM);
+			Assert.assertEquals("4.21cm", frameR.getXDesc());
+			Assert.assertEquals("1.32cm", frameR.getYDesc());
+			Assert.assertEquals("4.41cm", frameR.getWidthDesc());
+			Assert.assertEquals("3.92cm", frameR.getHeigthDesc());
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameRectangleTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testSet() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph demo");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.CM);
+			frameR.setHeight(3.22);
+			Assert.assertEquals(3.22, frameR.getHeight());
+			frameR.setWidth(4.44);
+			Assert.assertEquals(4.44, frameR.getWidth());
+			
+			Assert.assertEquals(SupportedLinearMeasure.CM, frameR.getLinearMeasure());
+			frameR.setLinearMeasure(SupportedLinearMeasure.IN);
+			Assert.assertEquals(SupportedLinearMeasure.IN, frameR.getLinearMeasure());
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameRectangleTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	
+}
+
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/draw/FrameStyleHandlerTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/FrameStyleHandlerTest.java
new file mode 100644
index 0000000..251b929
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/FrameStyleHandlerTest.java
@@ -0,0 +1,234 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.TextDocument.OdfMediaType;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class FrameStyleHandlerTest {
+
+	@Test
+	public void testSet() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.CM);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			
+			textDoc.changeMode(OdfMediaType.TEXT_TEMPLATE);
+			frameStyleHandler.setAchorType(StyleTypeDefinitions.AnchorType.TO_CHARACTER);
+			
+			//validate
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.PARAGRAPH, graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP, graphicPropertiesForWrite.getVerticalPosition());
+			Assert.assertEquals(HorizontalRelative.PARAGRAPH, graphicPropertiesForWrite.getHorizontalRelative());
+			Assert.assertEquals(FrameHorizontalPosition.CENTER, graphicPropertiesForWrite.getHorizontalPosition());
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetAchorTypeAs_character() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.CM);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			
+			textDoc.changeMode(OdfMediaType.TEXT_TEMPLATE);
+			frameStyleHandler.setAchorType(StyleTypeDefinitions.AnchorType.AS_CHARACTER);
+			
+			//validate
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE, graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP, graphicPropertiesForWrite.getVerticalPosition());
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetAchorTypeTo_page() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.IN);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			
+			textDoc.changeMode(OdfMediaType.TEXT_TEMPLATE);
+			frameStyleHandler.setAchorType(StyleTypeDefinitions.AnchorType.TO_PAGE);
+			
+			//validate
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.PAGE, graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP, graphicPropertiesForWrite.getVerticalPosition());
+			Assert.assertEquals(HorizontalRelative.PAGE, graphicPropertiesForWrite.getHorizontalRelative());
+			Assert.assertEquals(FrameHorizontalPosition.CENTER, graphicPropertiesForWrite.getHorizontalPosition());
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetHorizontalPosition() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.IN);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			frameStyleHandler.setHorizontalPosition(FrameHorizontalPosition.RIGHT);
+			
+			//validate
+			Assert.assertEquals(FrameHorizontalPosition.RIGHT, frameStyleHandler.getHorizontalPosition());
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	
+	@Test
+	public void testSetVerticalRelative() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.IN);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			frameStyleHandler.setVerticalRelative(VerticalRelative.PARAGRAPH);
+			
+			//validate
+			Assert.assertEquals(VerticalRelative.PARAGRAPH, frameStyleHandler.getVerticalRelative());
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetHorizontalRelative() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.IN);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			frameStyleHandler.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			
+			//validate
+			Assert.assertEquals(HorizontalRelative.PARAGRAPH, frameStyleHandler.getHorizontalRelative());
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FrameStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+}
+
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/draw/ImageTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/ImageTest.java
new file mode 100644
index 0000000..7a14da0
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/ImageTest.java
@@ -0,0 +1,414 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.text.TextParagraphElementBase;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.presentation.Slide;
+import org.odftoolkit.simple.presentation.Slide.SlideLayout;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class ImageTest {
+
+	@Test
+	public void testNewImage() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setName("this image");
+			image.setHyperlink(new URI("http://odftoolkit.org"));
+			doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+			Iterator<Image> iter = Image.imageIterator(para);
+			if (iter.hasNext()) {
+				Image aImage = iter.next();
+				Assert.assertEquals(image, aImage);
+			}
+
+			// new image in presentation
+			PresentationDocument pDoc = PresentationDocument.newPresentationDocument();
+			Slide slide = pDoc.newSlide(0, "test", SlideLayout.TITLE_OUTLINE);
+			Textbox box = slide.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			box.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			pDoc.save(ResourceUtilities.newTestOutputFile("imagep.odp"));
+
+			// new image in a table
+			TextDocument sDoc = TextDocument.newTextDocument();
+			Table table1 = sDoc.addTable(2, 2);
+			Cell cell1 = table1.getCellByPosition(0, 0);
+			Image image3 = cell1.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			image3.setHorizontalPosition(FrameHorizontalPosition.LEFT);
+			image3.setHyperlink(new URI("http://odftoolkit.org"));
+			Assert.assertEquals("http://odftoolkit.org", image3.getHyperlink().toString());
+			sDoc.save(ResourceUtilities.newTestOutputFile("imges.odt"));
+
+			SpreadsheetDocument sheet = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table2 = sheet.getTableList().get(0);
+			Cell cell2 = table2.getCellByPosition(1, 1);
+			Image image4 = cell2.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			sheet.save(ResourceUtilities.newTestOutputFile("imgesheet.ods"));
+			Image aImage4 = cell2.getImage();
+			Assert.assertEquals(image4, aImage4);
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testGetInstanceof() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setName("this image");
+			image.setHyperlink(new URI("http://odftoolkit.org"));
+			
+			DrawImageElement imageElement = image.getOdfElement();
+			
+			Image imageother = Image.getInstanceof(imageElement);
+			Assert.assertEquals(image, imageother);
+			
+			//when image is null
+			Image imagenull = Image.getInstanceof(null);
+			Assert.assertEquals(null, imagenull);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testGetFrame() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setName("this image");
+			image.setHyperlink(new URI("http://odftoolkit.org"));
+			
+			Frame imageFrame = image.getFrame();
+			Assert.assertEquals("this image", imageFrame.getName());
+			Assert.assertEquals(new URI("http://odftoolkit.org"), imageFrame.getHyperlink());
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testRemove() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("imagePara");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setName("this test image");
+			image.setHyperlink(new URI("http://odftoolkit.org"));
+			//image.remove();
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("imageFretest.odt"));
+			
+			TextDocument doc1 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("imageFretest.odt"));
+			Iterator parasIter = doc1.getParagraphIterator();
+			
+			while(parasIter.hasNext()){
+				Paragraph parac = (Paragraph)parasIter.next();
+				String text = parac.getTextContent();
+				if("imagePara".equals(text)){
+					TextParagraphElementBase textParaEleBase = parac.getOdfElement();
+					NodeList nodeImages = textParaEleBase.getElementsByTagName("draw:image");
+					Node nodeImage = nodeImages.item(0);
+					OdfDrawImage im = (OdfDrawImage)nodeImage;
+					Image ima = Image.getInstanceof(im);
+					ima.getName();
+					boolean flag = ima.remove();
+					if(!flag)
+						Assert.fail("remove() method was executed failed.");
+				}
+			}
+			
+			//save
+			doc1.save(ResourceUtilities.newTestOutputFile("imageEndtest.odt"));
+			
+			//validate
+			TextDocument doc2 = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("imageEndtest.odt"));
+			Iterator parasIter2 = doc2.getParagraphIterator();
+			
+			while(parasIter2.hasNext()){
+				Paragraph parac = (Paragraph)parasIter2.next();
+				String text = parac.getTextContent();
+				if("imagePara".equals(text)){
+					TextParagraphElementBase textParaEleBase = parac.getOdfElement();
+					NodeList nodeImages = textParaEleBase.getElementsByTagName("draw:image");
+					Node nodeImage = nodeImages.item(0);
+					if(nodeImage == null)
+						Assert.assertTrue(true);
+					else
+						Assert.fail();
+				}
+			}
+			
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testUpdateImage() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			Assert.assertEquals("image/png", image.getMediaTypeString());
+
+			//change the piceture of image.
+			image.updateImage(ResourceUtilities.getURI("testA.jpg"));
+			Assert.assertEquals("image/jpeg", image.getMediaTypeString());
+			
+			//Image imm = (Image)nodeEle;
+			DrawImageElement  drawImage = image.getOdfElement();
+			String imagePath = drawImage.getAttribute("xlink:href");
+			
+			Assert.assertEquals("Pictures/image_list_item.png", imagePath);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetImageInputStream() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			InputStream inImage = image.getImageInputStream();
+			int size = inImage.available();
+			Assert.assertTrue(size > 0);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	
+	@Test
+	public void testGetInternalPath() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			String internalPath = image.getInternalPath();
+			
+			Assert.assertEquals("Pictures/image_list_item.png", internalPath);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetMediaTypeString() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			String mediaType = image.getMediaTypeString();
+			
+			Assert.assertEquals("image/png", mediaType);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetTitle() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setTitle("ibm_title");
+			String title = image.getTitle();
+			
+			Assert.assertEquals("ibm_title", title);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetDescription() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			image.setDescription("description");
+			String description = image.getDesciption();
+			
+			Assert.assertEquals("description", description);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetRectangle() {
+		try {
+			// new image in text document
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("updateImage test");
+			Image image = Image.newImage(para, ResourceUtilities.getURI("image_list_item.png"));
+			
+			FrameRectangle rectangle = new FrameRectangle(5.13, 4.21, 3.76, 3.51, StyleTypeDefinitions.SupportedLinearMeasure.CM); 
+			image.setRectangle(rectangle);
+			
+			FrameRectangle rectangle2 = image.getRectangle();
+			
+			Assert.assertEquals(3.51, rectangle2.getHeight());
+			Assert.assertEquals(3.76, rectangle2.getWidth());
+			Assert.assertEquals(5.13, rectangle2.getX());
+			Assert.assertEquals(4.21, rectangle2.getY());
+			Assert.assertEquals(StyleTypeDefinitions.SupportedLinearMeasure.CM, rectangle2.getLinearMeasure());
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("imagetest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetHorizontalPosition() {
+		try {
+			// new image in a table
+			TextDocument sDoc = TextDocument.newTextDocument();
+			Table table1 = sDoc.addTable(2, 2);
+			Cell cell1 = table1.getCellByPosition(0, 0);
+			Image image3 = cell1.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			image3.setHorizontalPosition(FrameHorizontalPosition.LEFT);
+			Assert.assertEquals(FrameHorizontalPosition.LEFT, image3.getHorizontalPosition());
+			
+			//save
+			//sDoc.save(ResourceUtilities.newTestOutputFile("imges.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSetVerticalPosition() {
+		try {
+			// new image in a table
+			TextDocument sDoc = TextDocument.newTextDocument();
+			Table table1 = sDoc.addTable(2, 2);
+			Cell cell1 = table1.getCellByPosition(0, 0);
+			Image image3 = cell1.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			image3.setVerticalPosition(FrameVerticalPosition.BELOW);
+			
+			Assert.assertEquals(FrameVerticalPosition.BELOW, image3.getVerticalPosition());
+			
+			//save
+			//sDoc.save(ResourceUtilities.newTestOutputFile("imges.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/draw/TextBoxTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/TextBoxTest.java
new file mode 100644
index 0000000..d8ca872
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/draw/TextBoxTest.java
@@ -0,0 +1,356 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.draw;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.presentation.Slide;
+import org.odftoolkit.simple.presentation.Slide.SlideLayout;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.odftoolkit.simple.text.list.NumberDecorator;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class TextBoxTest {
+
+	@Test
+	public void testAddTextbox() {
+		String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("abc");
+			Textbox box = p.addTextbox(new FrameRectangle(1, 1, 2, 3, SupportedLinearMeasure.IN));
+			box.setName("box1");
+			box.setTextContent(content);
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+			textDoc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("textsample.odt"));
+			Paragraph p1 = textDoc.getParagraphByIndex(0, true);
+			Assert.assertNotNull(p1);
+			Textbox aBox = p1.getTextboxByName("box1");
+			Assert.assertNotNull(aBox);
+			String textContent = aBox.getTextContent();
+			Assert.assertEquals(content, textContent);
+
+			PresentationDocument presentDoc = PresentationDocument.newPresentationDocument();
+			Slide slide1 = presentDoc.newSlide(1, "slide1", SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			Textbox titleTextbox = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			Assert.assertNotNull(titleTextbox);
+			titleTextbox.setTextContent("My Title1");
+			java.util.List<Textbox> boxList = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.OUTLINE);
+			Assert.assertNotNull(boxList);
+			Assert.assertEquals(2, boxList.size());
+			Textbox leftTextbox = boxList.get(0);
+			List list1 = leftTextbox.addList();
+			list1.addItem("Test outline1");
+			list1.addItem("Test outline2");
+
+			presentDoc.save(ResourceUtilities.newTestOutputFile("abc.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetRemoveTextbox() {
+		int count = 0;
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("SampleBox.odt"));
+			count = countAllTextbox(doc);
+			Assert.assertEquals(8, count);
+
+			int c = 0;
+			Paragraph p = doc.getParagraphByIndex(1, true);
+			Iterator<Textbox> boxIter = p.getTextboxIterator();
+			while (boxIter.hasNext()) {
+				Textbox box = boxIter.next();
+				if (p.removeTextbox(box))
+					;
+				c++;
+			}
+
+			count = countAllTextbox(doc);
+			Assert.assertEquals(8 - c, count);
+			doc.save(ResourceUtilities.newTestOutputFile("SampleBoxOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	private int countAllTextbox(TextDocument doc) {
+		int count = 0;
+		Iterator<Paragraph> pIter = doc.getParagraphIterator();
+		while (pIter.hasNext()) {
+			Paragraph p = pIter.next();
+			Iterator<Textbox> boxIter = p.getTextboxIterator();
+			while (boxIter.hasNext()) {
+				Textbox box = boxIter.next();
+				System.out.println(box.getTextContent());
+				count++;
+			}
+		}
+		return count;
+	}
+	
+	
+	@Test
+	public void testClearContent() {
+		String content = "welcome to text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("abc");
+			Textbox box = p.addTextbox(new FrameRectangle(1, 1, 2, 3, SupportedLinearMeasure.IN));
+			box.setName("box1");
+			box.addParagraph("test paragraph");
+			box.clearContent();
+			box.setTextContent(content);
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testaddListListDecorator() {
+		try {
+			PresentationDocument presentDoc = PresentationDocument.newPresentationDocument();
+			Slide slide1 = presentDoc.newSlide(1, "slide1", SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			//title
+			Textbox titleTextbox = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			Assert.assertNotNull(titleTextbox);
+			titleTextbox.setTextContent("This is Title");
+			java.util.List<Textbox> boxList = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.OUTLINE);
+			Assert.assertNotNull(boxList);
+			Assert.assertEquals(2, boxList.size());
+			Textbox leftTextbox = boxList.get(0);
+			List list1 = leftTextbox.addList();
+			list1.addItem("Test outline1");
+			list1.addItem("Test outline2");
+			
+			//
+			Textbox rightTextbox = boxList.get(1);
+			Assert.assertNotNull(rightTextbox);
+			
+			ListDecorator decorator = new NumberDecorator(presentDoc);
+			rightTextbox.setBackgroundColor(Color.RED);
+			List list2 = rightTextbox.addList(decorator);
+			list2.addItem("test one");
+			list2.addItem("test two");
+			list2.addItem("test three");
+			
+			//save
+			presentDoc.save(ResourceUtilities.newTestOutputFile("abc.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testClearList() {
+		try {
+			PresentationDocument presentDoc = PresentationDocument.newPresentationDocument();
+			Slide slide1 = presentDoc.newSlide(1, "slide1", SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			//title
+			Textbox titleTextbox = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			Assert.assertNotNull(titleTextbox);
+			titleTextbox.setTextContent("This is Title");
+			java.util.List<Textbox> boxList = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.OUTLINE);
+			Assert.assertNotNull(boxList);
+			Assert.assertEquals(2, boxList.size());
+			Textbox leftTextbox = boxList.get(0);
+			List list1 = leftTextbox.addList();
+			list1.addItem("Test outline1");
+			list1.addItem("Test outline2");
+			leftTextbox.clearList();
+			List list3 = leftTextbox.addList();
+			list3.addItem("Test line3");
+			list3.addItem("Test line3");
+			//
+			Textbox rightTextbox = boxList.get(1);
+			Assert.assertNotNull(rightTextbox);
+			
+			ListDecorator decorator = new NumberDecorator(presentDoc);
+			rightTextbox.setBackgroundColor(Color.RED);
+			List list2 = rightTextbox.addList(decorator);
+			list2.addItem("test one");
+			list2.addItem("test two");
+			list2.addItem("test three");
+			rightTextbox.clearList();
+			Iterator iterator = rightTextbox.getListIterator();
+			Assert.assertEquals(false, iterator.hasNext());
+			
+			//save
+			presentDoc.save(ResourceUtilities.newTestOutputFile("abc.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetListContainerElement() {
+		try {
+			PresentationDocument presentDoc = PresentationDocument.newPresentationDocument();
+			Slide slide1 = presentDoc.newSlide(1, "slide1", SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			//title
+			Textbox titleTextbox = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			Assert.assertNotNull(titleTextbox);
+			titleTextbox.setTextContent("This is Title");
+			java.util.List<Textbox> boxList = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.OUTLINE);
+			Assert.assertNotNull(boxList);
+			Assert.assertEquals(2, boxList.size());
+			Textbox leftTextbox = boxList.get(0);
+			List list1 = leftTextbox.addList();
+			list1.addItem("Test outline1");
+			list1.addItem("Test outline2");
+			//
+			Textbox rightTextbox = boxList.get(1);
+			Assert.assertNotNull(rightTextbox);
+			
+			ListDecorator decorator = new NumberDecorator(presentDoc);
+			rightTextbox.setBackgroundColor(Color.RED);
+			List list2 = rightTextbox.addList(decorator);
+			list2.addItem("test AAA");
+			OdfElement odfEle = rightTextbox.getListContainerElement();
+			NodeList nodes = odfEle.getChildNodes();
+			for(int i=0;i<nodes.getLength();i++){
+				Node node = nodes.item(i);
+				Assert.assertEquals("test AAA", node.getTextContent());
+			}
+			
+			//save
+			presentDoc.save(ResourceUtilities.newTestOutputFile("abc.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+		
+	}
+	
+	
+	@Test
+	public void testGetListIterator() {
+		try {
+			PresentationDocument presentDoc = PresentationDocument.newPresentationDocument();
+			Slide slide1 = presentDoc.newSlide(1, "slide1", SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			//title
+			Textbox titleTextbox = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			Assert.assertNotNull(titleTextbox);
+			titleTextbox.setTextContent("This is Title");
+			java.util.List<Textbox> boxList = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.OUTLINE);
+			Assert.assertNotNull(boxList);
+			Assert.assertEquals(2, boxList.size());
+			Textbox leftTextbox = boxList.get(0);
+			List list1 = leftTextbox.addList();
+			list1.addItem("Test outline1");
+			list1.addItem("Test outline2");
+
+			//
+			Textbox rightTextbox = boxList.get(1);
+			Assert.assertNotNull(rightTextbox);
+			
+			ListDecorator decorator = new NumberDecorator(presentDoc);
+			rightTextbox.setBackgroundColor(Color.RED);
+			List list2 = rightTextbox.addList();
+			list2.addItem("test AAA");
+			list2.addItem("test BBB");
+			Iterator iterator = rightTextbox.getListIterator();
+			while(iterator.hasNext()){
+				List list = (List)iterator.next();
+				Assert.assertEquals(2, list.size());
+				Assert.assertEquals("test AAA", list.getItem(0).toString());
+				Assert.assertEquals("test BBB", list.getItem(1).toString());
+			}
+			
+			//save
+			presentDoc.save(ResourceUtilities.newTestOutputFile("abc.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+		
+	}
+	
+	
+	@Test
+	public void testRemoveList() {
+		try {
+			PresentationDocument presentDoc = PresentationDocument.newPresentationDocument();
+			Slide slide1 = presentDoc.newSlide(1, "slide1", SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			//title
+			Textbox titleTextbox = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.TITLE).get(0);
+			Assert.assertNotNull(titleTextbox);
+			titleTextbox.setTextContent("This is Title");
+			java.util.List<Textbox> boxList = slide1.getTextboxByUsage(PresentationDocument.PresentationClass.OUTLINE);
+			Assert.assertNotNull(boxList);
+			Assert.assertEquals(2, boxList.size());
+			Textbox leftTextbox = boxList.get(0);
+			List list1 = leftTextbox.addList();
+			list1.addItem("Test outline1");
+			list1.addItem("Test outline2");
+
+			//
+			Textbox rightTextbox = boxList.get(1);
+			Assert.assertNotNull(rightTextbox);
+			
+			ListDecorator decorator = new NumberDecorator(presentDoc);
+			rightTextbox.setBackgroundColor(Color.RED);
+			List list2 = rightTextbox.addList();
+			list2.addItem("test AAA");
+			list2.addItem("test BBB");
+			
+			rightTextbox.removeList(list2);
+			Iterator iterator = rightTextbox.getListIterator();
+			Assert.assertFalse(iterator.hasNext());
+			
+			//save
+			presentDoc.save(ResourceUtilities.newTestOutputFile("abc.odp"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+		
+	}
+	
+	
+}
+
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/AbstractFormContainerTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/AbstractFormContainerTest.java
new file mode 100644
index 0000000..f9a26f9
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/AbstractFormContainerTest.java
@@ -0,0 +1,105 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class AbstractFormContainerTest {
+	final static FrameRectangle btnRtg = new FrameRectangle(0.5, 2, 2.9433,
+			0.5567, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form1 = doc.createForm("Form1");
+			form1.createButton(doc, btnRtg, "Button", "Push Button");
+
+			Paragraph para = doc.addParagraph("Insert a Label here.");
+			Form form2 = doc.createForm("Form2");
+			form2.createLabel(para, btnRtg, "Label", "Label");
+
+			Form form3 = doc.createForm("Form3");
+			Table table1 = Table.newTable(doc, 2, 2);
+			Cell cell = table1.getCellByPosition("A1");
+			para = cell.addParagraph("Insert a text box here.");
+			form3.createTextBox(para, btnRtg, "Text Box", "TextBox", true);
+
+			Assert.assertNotNull(doc.getFormByName("Form1"));
+
+			doc.save(ResourceUtilities.newTestOutputFile("TestCreateForm.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(AbstractFormContainerTest.class.getName()).log(
+					Level.SEVERE, null, e);
+		}
+	}
+
+	@Test
+	public void testCreateForm() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateForm.odt"));
+			Assert.assertNotNull(textDoc.getFormByName("Form1"));
+			Assert.assertNotNull(textDoc.getFormByName("Form2"));
+			Assert.assertNotNull(textDoc.getFormByName("Form3"));
+		} catch (Exception e) {
+			Logger.getLogger(AbstractFormContainerTest.class.getName()).log(
+					Level.SEVERE, null, e);
+		}
+	}
+
+	@Test
+	public void testRemoveForm() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateForm.odt"));
+			Form deleteForm = null;
+			Iterator<Form> iterator = textDoc.getFormIterator();
+			while (iterator.hasNext()) {
+				deleteForm = iterator.next();
+				if (deleteForm.getFormName().equals("Form3"))
+					break;
+			}
+			textDoc.removeForm(deleteForm);
+			Assert.assertNotNull(textDoc.getFormByName("Form1"));
+			Assert.assertNotNull(textDoc.getFormByName("Form2"));
+			Assert.assertNull(textDoc.getFormByName("Form3"));
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveForm.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(AbstractFormContainerTest.class.getName()).log(
+					Level.SEVERE, null, e);
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/ButtonTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/ButtonTest.java
new file mode 100644
index 0000000..fea9e94
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/ButtonTest.java
@@ -0,0 +1,223 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ButtonTest {
+	private static final FrameRectangle btnRtg = new FrameRectangle(0.5, 2,
+			2.9433, 0.5567, SupportedLinearMeasure.IN);;
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+			form.createButton(doc, btnRtg, "Button1", "Push Button 1");
+			form.createButton(doc, btnRtg, "Button2", "Push Button 2");
+
+			Paragraph para = doc.addParagraph("Insert a button here.");
+			form.createButton(para, btnRtg, "Button3", "Push Button 3");
+
+			Table table1 = Table.newTable(doc, 2, 2);
+			Cell cell = table1.getCellByPosition("A1");
+			para = cell.addParagraph("Insert a button here:");
+			form.createButton(para, btnRtg, "Button4", "Push Button 4");
+
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestCreateButton.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCreateButton() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Button.getSimpleIterator(form);
+			int count = 0;
+			while (iterator.hasNext()) {
+				Button btn = (Button) iterator.next();
+				Assert.assertNotNull(btn);
+				Assert.assertEquals("Button" + (++count), btn.getName());
+				Assert.assertEquals("Push Button " + (count), btn.getLabel());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveButton() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Button.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				Button btn = (Button) iterator.next();
+				if (btn.getName().equals("Button2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			Button find = null;
+			while (iterator.hasNext()) {
+				Button btn = (Button) iterator.next();
+				if (btn.getName().equals("Button2")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveButton.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetButtonRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Button.getSimpleIterator(form);
+			Button find = null;
+			while (iterator.hasNext()) {
+				Button btn = (Button) iterator.next();
+				if (btn.getName().equals("Button2")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetButtonRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Button.getSimpleIterator(form);
+			Button find = null;
+			while (iterator.hasNext()) {
+				Button btn = (Button) iterator.next();
+				if (btn.getName().equals("Button3")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.AS_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetButtonAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetLabel() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Button.getSimpleIterator(form);
+			Button find = null;
+			while (iterator.hasNext()) {
+				Button btn = (Button) iterator.next();
+				if (btn.getName().equals("Button4")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// set new label
+			String newLabel = "Change the content of button 4.";
+			find.setLabel(newLabel);
+			Assert.assertEquals(newLabel, find.getLabel());
+			// set null value
+			find.setLabel(null);
+			Assert.assertEquals("", find.getLabel());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetButtonLabel.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/CheckBoxTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/CheckBoxTest.java
new file mode 100644
index 0000000..5401123
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/CheckBoxTest.java
@@ -0,0 +1,304 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormCheckboxState;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class CheckBoxTest {
+	private static final FrameRectangle checkBoxRtg = new FrameRectangle(
+			0.7972, 1.2862, 2.4441, 0.2669, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+
+			// checkbox 1
+			CheckBox checkbox = (CheckBox) form.createCheckBox(doc,
+					checkBoxRtg, "CheckBox 1", "CheckBox 1", "1");
+
+			// checkbox 2
+			Paragraph para = doc.addParagraph("CheckBox2 anchor to heading.");
+			para.applyHeading();
+			form.createCheckBox(para, checkBoxRtg, "CheckBox 2", "CheckBox 2",
+					"2");
+
+			// checkbox 3
+			para = doc.addParagraph("Insert checkbox3 here, as_char.");
+			checkbox = (CheckBox) form.createCheckBox(para, checkBoxRtg,
+					"CheckBox 3", "CheckBox 3", "3");
+			checkbox.setCurrentState(FormCheckboxState.CHECKED);
+			checkbox.setAnchorType(AnchorType.AS_CHARACTER);
+
+			Table table1 = Table.newTable(doc, 2, 2);
+			Cell cell = table1.getCellByPosition("B1");
+			para = cell.addParagraph("Insert a check box here.");
+			form.createCheckBox(para, checkBoxRtg, "CheckBox 4", "CheckBox 4",
+					"4");
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestCreateCheckbox.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCreateCheckBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckbox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			int count = 0;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				Assert.assertNotNull(btn);
+				Assert.assertEquals("CheckBox " + (++count), btn.getName());
+				Assert.assertEquals("CheckBox " + (count), btn.getLabel());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveCheckBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 2")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveCheckBox.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetCheckBoxRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 2")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetCheckBoxRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 3")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.TO_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.PARAGRAPH,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+			Assert.assertEquals(HorizontalRelative.PARAGRAPH,
+					graphicPropertiesForWrite.getHorizontalRelative());
+			Assert.assertEquals(FrameHorizontalPosition.CENTER,
+					graphicPropertiesForWrite.getHorizontalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetCheckBoxAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetLabel() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 4")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// set new label
+			String newLabel = "Change the content of CheckBox 4.";
+			find.setLabel(newLabel);
+			Assert.assertEquals(newLabel, find.getLabel());
+			// set null value
+			find.setLabel(null);
+			Assert.assertEquals("", find.getLabel());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetCheckBoxLabel.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCheckedState() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 3")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// validate
+			Assert.assertEquals(FormCheckboxState.CHECKED, find
+					.getCurrentState());
+
+			find.setCurrentState(FormCheckboxState.UNKNOWN);
+			Assert.assertEquals(FormCheckboxState.UNKNOWN, find
+					.getCurrentState());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetCheckBoxState.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetValue() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateCheckBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox btn = (CheckBox) iterator.next();
+				if (btn.getName().equals("CheckBox 1")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// validate
+			Assert.assertEquals("1", find.getValue());
+
+			find.setValue("15");
+			Assert.assertEquals("15", find.getValue());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetCheckBoxValue.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(CheckBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/ComboBoxTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/ComboBoxTest.java
new file mode 100644
index 0000000..96dc4df
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/ComboBoxTest.java
@@ -0,0 +1,273 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormCommandType;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormListSourceType;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ComboBoxTest {
+	private static final FrameRectangle comboRtg = new FrameRectangle(0.7972,
+			1.2862, 2.4441, 0.2669, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+
+			FormControl comboBox = form.createComboBox(doc, new FrameRectangle(
+					0.7972, 1.2862, 2.4441, 0.2669, SupportedLinearMeasure.IN),
+					"combo1", "dd", true);
+			String[] items = { "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh",
+					"ii", "jj" };
+			((ComboBox) comboBox).addItems(items);
+
+			Paragraph para = doc.addParagraph("Insert a combo box here.");
+			comboBox = form.createComboBox(para, comboRtg, "combo2",
+					"default text", true);
+			form.setDataSource("Bibliography");
+			form.setCommandType(FormCommandType.TABLE);
+			form.setCommand("biblio");
+			((ComboBox) comboBox).setListSourceType(FormListSourceType.SQL);
+			((ComboBox) comboBox)
+					.setListSource("SELECT \"Publisher\", \"Identifier\" FROM \"biblio\"");
+			((ComboBox) comboBox).setDataField("Author");
+			comboBox.setAnchorType(AnchorType.AS_CHARACTER);
+
+			Table table = Table.newTable(doc, 2, 2);
+			table.setTableName("Table");
+			Cell cell = table.getCellByPosition("B1");
+			para = cell.addParagraph("Insert a combo box here.");
+			form.createComboBox(para, comboRtg, "combo3", "default text", true);
+
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestCreateComboBox.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ComboBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCreateComboBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateComboBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ComboBox.getSimpleIterator(form);
+			int count = 0;
+			
+			// combo1
+			ComboBox comboBox = (ComboBox) iterator.next();
+			Assert.assertNotNull(comboBox);
+			Assert.assertEquals("combo" + (++count), comboBox.getName());
+			Assert.assertEquals("dd", comboBox.getValue());
+			ArrayList<String> entries = comboBox.getEntries();
+			Assert.assertEquals("aa", entries.get(0));
+			Assert.assertEquals("jj", entries.get(entries.size() - 1));
+			
+			// combo2
+			comboBox = (ComboBox) iterator.next();
+			Assert.assertNotNull(comboBox);
+			Assert.assertEquals("combo" + (++count), comboBox.getName());
+			Assert.assertEquals(
+					"SELECT \"Publisher\", \"Identifier\" FROM \"biblio\"",
+					comboBox.getListSource());
+			Assert.assertEquals(FormListSourceType.SQL, comboBox
+					.getListSourceType());
+			Assert.assertEquals("Author", comboBox.getDataField());
+		
+			// combo3
+			comboBox = (ComboBox) iterator.next();
+			Assert.assertNotNull(comboBox);
+			Assert.assertEquals("combo" + (++count), comboBox.getName());
+			Assert.assertEquals("default text", comboBox.getValue());
+			Assert.assertEquals(textDoc.getTableByName("Table")
+					.getCellByPosition("B1").getParagraphByIndex(0, true)
+					.getOdfElement(), comboBox.getDrawControl()
+					.getContainerElement());
+
+		} catch (Exception e) {
+			Logger.getLogger(ComboBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveComboBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateComboBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ComboBox.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				ComboBox combo = (ComboBox) iterator.next();
+				if (combo.getName().equals("ComboBox2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			ComboBox find = null;
+			while (iterator.hasNext()) {
+				ComboBox btn = (ComboBox) iterator.next();
+				if (btn.getName().equals("ComboBox2")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveComboBox.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ComboBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetComboBoxRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateComboBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ComboBox.getSimpleIterator(form);
+			ComboBox find = null;
+			while (iterator.hasNext()) {
+				ComboBox btn = (ComboBox) iterator.next();
+				if (btn.getName().equals("combo2")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetComboBoxRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ComboBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateComboBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ComboBox.getSimpleIterator(form);
+			ComboBox find = null;
+			while (iterator.hasNext()) {
+				ComboBox btn = (ComboBox) iterator.next();
+				if (btn.getName().equals("combo3")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.AS_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetComboBoxAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ComboBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetProperties() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateComboBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ComboBox.getSimpleIterator(form);
+			ComboBox find = null;
+			while (iterator.hasNext()) {
+				ComboBox btn = (ComboBox) iterator.next();
+				if (btn.getName().equals("combo3")) {
+					find = btn;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// set new name
+			String newName = "combo4";
+			find.setName(newName);
+			Assert.assertEquals(newName, find.getName());
+			// set new text value
+			find.setCurrentValue(newName);
+			Assert.assertEquals(newName, find.getCurrentValue());
+			// set drop-down visibility
+			find.setFormDropdown(false);
+			Assert.assertEquals(newName, find.getCurrentValue());
+			// set list source
+			String sql = "SELECT DISTINCT \"ISBN\" FROM \"biblio\" ";
+			find.setListSource(sql);
+			Assert.assertEquals(sql, find.getListSource());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetComboBoxProperties.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ComboBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/FieldTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/FieldTest.java
new file mode 100644
index 0000000..d4bf729
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/FieldTest.java
@@ -0,0 +1,299 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class FieldTest {
+	private static final FrameRectangle fieldRtg = new FrameRectangle(0.5, 2.0,
+			2.9433, 0.5567, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			Paragraph para = Paragraph.newParagraph(doc);
+			FormControl dateField = form.createDateField(para, fieldRtg,
+					"DateField", "20120715");
+			((DateField) dateField).setSpinButonVisible(true);
+			((DateField) dateField).setDropDownVisible(true);
+			((DateField) dateField).formatDate("yy/MM/dd", Locale.US);
+
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			para = Paragraph.newParagraph(doc);
+			FormControl timeField = form.createTimeField(para, fieldRtg,
+					"TimeField", "15234000");
+			((TimeField) timeField).setSpinButonVisible(true);
+			((TimeField) timeField).formatTime("HH:mm a", Locale.US);
+
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			para = Paragraph.newParagraph(doc);
+			FormControl numericField = form.createNumericField(para, fieldRtg,
+					"NumericField", "-154.3567");
+			((NumericField) numericField).setDecimalAccuracy(3);
+			((NumericField) numericField).setSpinButonVisible(true);
+
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			para = Paragraph.newParagraph(doc);
+			FormControl patternField = form.createPatternField(para, fieldRtg,
+					"PatternField", "12345");
+			((PatternField) patternField).setLiteralMask("###");
+			((PatternField) patternField).setEditMask("abc");
+			((PatternField) patternField).setSpinButonVisible(true);
+
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			Paragraph.newParagraph(doc);
+			para = Paragraph.newParagraph(doc);
+			para.appendTextContent("insert currency field here:");
+			FormControl currencyField = form.createCurrencyField(para,
+					fieldRtg, "CurrencyField", "135.467");
+			((CurrencyField) currencyField).setCurrencySymbol("CNY");
+			((CurrencyField) currencyField).setDecimalAccuracy(4);
+			((CurrencyField) currencyField).setSpinButonVisible(true);
+
+			doc
+					.save(ResourceUtilities
+							.newTestOutputFile("TestCreateField.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(FieldTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testCreateField() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateField.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Field.getSimpleIterator(form);
+			if (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				Assert.assertNotNull(field);
+				Assert.assertEquals("DateField", field.getName());
+				Assert.assertEquals("20120715", field.getCurrentValue());
+			}
+			if (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				Assert.assertNotNull(field);
+				Assert.assertEquals("TimeField", field.getName());
+				Assert.assertEquals("15234000", field.getCurrentValue());
+			}
+			if (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				Assert.assertNotNull(field);
+				Assert.assertEquals("NumericField", field.getName());
+				Assert.assertEquals("-154.3567", field.getCurrentValue());
+			}
+			if (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				Assert.assertNotNull(field);
+				Assert.assertEquals("PatternField", field.getName());
+				Assert.assertEquals("12345", field.getCurrentValue());
+			}
+			if (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				Assert.assertNotNull(field);
+				Assert.assertEquals("CurrencyField", field.getName());
+				Assert.assertEquals("135.467", field.getCurrentValue());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(FieldTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveField() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateField.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Field.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				if (field.getName().equals("PatternField")) {
+					iterator.remove();
+					break;
+				}
+			}
+			Field find = null;
+			while (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				if (field.getName().equals("PatternField")) {
+					find = field;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveField.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FieldTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testSetFieldRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateField.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Field.getSimpleIterator(form);
+			Field find = null;
+			while (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				if (field.getName().equals("TimeField")) {
+					find = field;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 0.2, 6, 2.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(6.0, find.getRectangle().getWidth());
+			Assert.assertEquals(2.5, find.getRectangle().getHeight());
+			Assert.assertEquals(0.2, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetFieldRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FieldTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateField.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Field.getSimpleIterator(form);
+			Field find = null;
+			while (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				if (field.getName().equals("CurrencyField")) {
+					find = field;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.AS_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetFieldAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FieldTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testSetFormat() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateField.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Field.getSimpleIterator(form);
+			Field find = null;
+			while (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				if (field.getName().equals("DateField")) {
+					find = field;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+
+			// set date format
+			String date = "19840605";
+			String format = "yy-MM-dd";
+			find.setCurrentValue(date);
+			((DateField) find).formatDate(format, Locale.GERMANY);
+			Assert.assertEquals(date, find.getCurrentValue());
+			Assert.assertEquals(format, ((DateField) find).getDateFormat());
+			find.setCurrentValue(null);
+			Assert.assertEquals("", find.getCurrentValue());
+			try {
+				((DateField) find).formatDate(null, Locale.US);
+			} catch (IllegalArgumentException e) {
+				Assert.assertTrue(true);
+			}
+			while (iterator.hasNext()) {
+				Field field = (Field) iterator.next();
+				if (field.getName().equals("TimeField")) {
+					find = field;
+					break;
+				}
+			}
+			
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetFormatValue.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FieldTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/LabelTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/LabelTest.java
new file mode 100644
index 0000000..841a1bb
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/LabelTest.java
@@ -0,0 +1,227 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class LabelTest {
+	private static final FrameRectangle labelRtg = new FrameRectangle(0.5, 1.2553,
+			1.2, 0.5, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+			// label1
+			form.createLabel(doc, labelRtg, "Label1", "Label1");
+			// label2
+			Label label = (Label) form.createLabel(doc, labelRtg, "Label2",
+					"Label2");
+			label.setAnchorType(AnchorType.TO_CHARACTER);
+			// label3
+			Paragraph para = doc.addParagraph("Insert a Label here.");
+			form.createLabel(para, labelRtg, "Label3", "Label3");
+			// label4
+			Table table1 = Table.newTable(doc, 2, 2);
+			Cell cell = table1.getCellByPosition("B1");
+			para = cell.addParagraph("Insert a Label here.");
+			form.createLabel(para, labelRtg, "Label4", "Label4");
+			doc
+					.save(ResourceUtilities
+							.newTestOutputFile("TestCreateLabel.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(LabelTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testCreateLabel() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateLabel.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Label.getSimpleIterator(form);
+			int count = 0;
+			while (iterator.hasNext()) {
+				Label label = (Label) iterator.next();
+				Assert.assertNotNull(label);
+				Assert.assertEquals("Label" + (++count), label.getName());
+				Assert.assertEquals("Label" + (count), label.getLabel());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(LabelTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveLabel() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateLabel.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Label.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				Label label = (Label) iterator.next();
+				if (label.getName().equals("Label2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			Label find = null;
+			while (iterator.hasNext()) {
+				Label label = (Label) iterator.next();
+				if (label.getName().equals("Label2")) {
+					find = label;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveLabel.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(LabelTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testSetLabelRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateLabel.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Label.getSimpleIterator(form);
+			Label find = null;
+			while (iterator.hasNext()) {
+				Label label = (Label) iterator.next();
+				if (label.getName().equals("Label2")) {
+					find = label;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetLabelRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(LabelTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateLabel.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Label.getSimpleIterator(form);
+			Label find = null;
+			while (iterator.hasNext()) {
+				Label label = (Label) iterator.next();
+				if (label.getName().equals("Label2")) {
+					find = label;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.AS_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetLabelAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(LabelTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+	@Test
+	public void testSetLabel() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateLabel.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = Label.getSimpleIterator(form);
+			Label find = null;
+			while (iterator.hasNext()) {
+				Label label = (Label) iterator.next();
+				if (label.getName().equals("Label3")) {
+					find = label;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// set new label
+			String newLabel = "Change the content of Label 4.";
+			find.setLabel(newLabel);
+			Assert.assertEquals(newLabel, find.getLabel());
+			// set null value
+			find.setLabel(null);
+			Assert.assertEquals("", find.getLabel());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetLabelLabel.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(LabelTest.class.getName()).log(Level.SEVERE, null,
+					e);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/ListBoxTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/ListBoxTest.java
new file mode 100644
index 0000000..1fcd7e1
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/ListBoxTest.java
@@ -0,0 +1,273 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormCommandType;
+import org.odftoolkit.simple.form.FormTypeDefinition.FormListSourceType;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ListBoxTest {
+	private static final FrameRectangle listBoxRtg = new FrameRectangle(0.5752,
+			0.1429, 2.3307, 0.8398, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+
+			// list box1
+			FormControl listBox = form.createListBox(doc, listBoxRtg, "list1",
+					true, false);
+			String[] items = { "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh",
+					"ii", "jj" };
+			((ListBox) listBox).addItems(items);
+
+			// list box2
+			Paragraph para = doc.addParagraph("Insert a list box here.");
+			listBox = form
+					.createListBox(para, listBoxRtg, "list2", false, true);
+			form.setDataSource("Bibliography");
+			form.setCommandType(FormCommandType.TABLE);
+			form.setCommand("biblio");
+			((ListBox) listBox).setListSourceType(FormListSourceType.SQL);
+			((ListBox) listBox)
+					.setListSource("SELECT \"Publisher\", \"Identifier\" FROM \"biblio\"");
+			((ListBox) listBox).setDataField("Author");
+			listBox.setAnchorType(AnchorType.AS_CHARACTER);
+
+			// list box3
+			Table table = Table.newTable(doc, 2, 2);
+			table.setTableName("Table");
+			Cell cell = table.getCellByPosition("B1");
+			para = cell.addParagraph("Insert a list box here.");
+			form.createListBox(para, listBoxRtg, "list3", false, true);
+
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestCreateListBox.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ListBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCreateListBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateListBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ListBox.getSimpleIterator(form);
+			int count = 0;
+
+			// list1
+			ListBox listBox = (ListBox) iterator.next();
+			Assert.assertNotNull(listBox);
+			Assert.assertEquals("list" + (++count), listBox.getName());
+			ArrayList<String> entries = listBox.getEntries();
+			Assert.assertEquals("aa", entries.get(0));
+			Assert.assertEquals("jj", entries.get(entries.size() - 1));
+
+			// list2
+			listBox = (ListBox) iterator.next();
+			Assert.assertNotNull(listBox);
+			Assert.assertEquals("list" + (++count), listBox.getName());
+			Assert.assertEquals(
+					"SELECT \"Publisher\", \"Identifier\" FROM \"biblio\"",
+					listBox.getListSource());
+			Assert.assertEquals(FormListSourceType.SQL, listBox
+					.getListSourceType());
+			Assert.assertEquals("Author", listBox.getDataField());
+
+			// list3
+			listBox = (ListBox) iterator.next();
+			Assert.assertNotNull(listBox);
+			Assert.assertEquals("list" + (++count), listBox.getName());
+			Assert.assertEquals(textDoc.getTableByName("Table")
+					.getCellByPosition("B1").getParagraphByIndex(0, true)
+					.getOdfElement(), listBox.getDrawControl()
+					.getContainerElement());
+
+		} catch (Exception e) {
+			Logger.getLogger(ListBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveListBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateListBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ListBox.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				ListBox list = (ListBox) iterator.next();
+				if (list.getName().equals("list2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			ListBox find = null;
+			while (iterator.hasNext()) {
+				ListBox listbox = (ListBox) iterator.next();
+				if (listbox.getName().equals("list2")) {
+					find = listbox;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveListBox.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetListBoxRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateListBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ListBox.getSimpleIterator(form);
+			ListBox find = null;
+			while (iterator.hasNext()) {
+				ListBox listbox = (ListBox) iterator.next();
+				if (listbox.getName().equals("list2")) {
+					find = listbox;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetListBoxRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateListBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ListBox.getSimpleIterator(form);
+			ListBox find = null;
+			while (iterator.hasNext()) {
+				ListBox listbox = (ListBox) iterator.next();
+				if (listbox.getName().equals("list3")) {
+					find = listbox;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.AS_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetListBoxAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetProperties() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateListBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = ListBox.getSimpleIterator(form);
+			ListBox find = null;
+			while (iterator.hasNext()) {
+				ListBox listbox = (ListBox) iterator.next();
+				if (listbox.getName().equals("list2")) {
+					find = listbox;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// set new name
+			String newName = "list4";
+			find.setName(newName);
+			Assert.assertEquals(newName, find.getName());
+			// set drop-down visibility
+			find.setFormDropdown(false);
+			Assert.assertEquals(false, find.getFormDropdown());
+			// set multi-selection
+			find.setFormMultiSelection(true);
+			Assert.assertEquals(true, find.getFormMultiSelection());
+			// set list source
+			String sql = "SELECT DISTINCT \"ISBN\" FROM \"biblio\" ";
+			find.setListSource(sql);
+			Assert.assertEquals(sql, find.getListSource());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetListBoxProperties.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/RadioButtonTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/RadioButtonTest.java
new file mode 100644
index 0000000..704cbf6
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/RadioButtonTest.java
@@ -0,0 +1,309 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class RadioButtonTest {
+	private final static FrameRectangle radioRtg = new FrameRectangle(0.7972,
+			1.2862, 2.4441, 0.2669, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+
+			// radiobox 1
+			RadioButton radiobutton = (RadioButton) form.createRadioButton(doc,
+					radioRtg, "RadioGroup1", "RadioButton 1", "1");
+
+			// radiobutton 2
+			Paragraph para = doc
+					.addParagraph("RadioButton2 anchor to heading.");
+			para.applyHeading();
+			form.createRadioButton(para, radioRtg, "RadioGroup1",
+					"RadioButton 2", "2");
+
+			// radiobutton 3
+			para = doc.addParagraph("Insert radiobutton3 here, as_char.");
+			radiobutton = (RadioButton) form.createRadioButton(para, radioRtg,
+					"RadioGroup1", "RadioButton 3", "3");
+			radiobutton.setCurrentSelected(true);
+			radiobutton.setAnchorType(AnchorType.AS_CHARACTER);
+
+			Table table1 = Table.newTable(doc, 2, 2);
+			Cell cell = table1.getCellByPosition("B1");
+			para = cell.addParagraph("Insert a check box here.");
+			form.createRadioButton(para, radioRtg, "RadioGroup1",
+					"RadioButton 4", "4");
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestCreateRadioButton.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCreateRadioButton() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			int count = 0;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				Assert.assertNotNull(radio);
+				Assert.assertEquals("RadioGroup1", radio.getName());
+				Assert.assertEquals("RadioButton " + (++count), radio
+						.getLabel());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveRadioButton() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			RadioButton find = null;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 2")) {
+					find = radio;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveRadioButton.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetRadioButtonRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			RadioButton find = null;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 2")) {
+					find = radio;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetRadioButtonRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			RadioButton find = null;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 3")) {
+					find = radio;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.TO_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.PARAGRAPH,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+			Assert.assertEquals(HorizontalRelative.PARAGRAPH,
+					graphicPropertiesForWrite.getHorizontalRelative());
+			Assert.assertEquals(FrameHorizontalPosition.CENTER,
+					graphicPropertiesForWrite.getHorizontalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetRadioButtonAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetLabel() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			RadioButton find = null;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 4")) {
+					find = radio;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// set new label
+			String newLabel = "Change the content of RadioButton 4.";
+			find.setLabel(newLabel);
+			Assert.assertEquals(newLabel, find.getLabel());
+			// set null value
+			find.setLabel(null);
+			Assert.assertEquals("", find.getLabel());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetRadioButtonLabel.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCheckedState() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			RadioButton find = null;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 3")) {
+					find = radio;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// validate
+			Assert.assertEquals(true, find.getCurrentSelected());
+
+			find.setCurrentSelected(false);
+			Assert.assertEquals(false, find.getCurrentSelected());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetRadioButtonState.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetValue() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateRadioButton.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = RadioButton
+					.getSimpleIterator(form);
+			RadioButton find = null;
+			while (iterator.hasNext()) {
+				RadioButton radio = (RadioButton) iterator.next();
+				if (radio.getLabel().equals("RadioButton 1")) {
+					find = radio;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// validate
+			Assert.assertEquals("1", find.getValue());
+
+			find.setValue("15");
+			Assert.assertEquals("15", find.getValue());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetRadioButtonValue.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(RadioButtonTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/form/TextBoxTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/form/TextBoxTest.java
new file mode 100644
index 0000000..a4286d5
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/form/TextBoxTest.java
@@ -0,0 +1,240 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.form;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.draw.ControlStyleHandler;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.style.GraphicProperties;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AnchorType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class TextBoxTest {
+	private static final FrameRectangle textBoxRtg = new FrameRectangle(0.5,
+			0.2846, 2.9432, 0.8567, SupportedLinearMeasure.IN);
+
+	@BeforeClass
+	public static void createForm() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Form form = doc.createForm("Test Form");
+			// textbox1
+			form.createTextBox(doc, textBoxRtg, "TextBox1", "TextBox1", true);
+
+			// textbox2
+			Paragraph para = doc.addParagraph("Insert a text box here.");
+			FormControl textBox = form.createTextBox(para, textBoxRtg,
+					"TextBox2", "TextBox2", false);
+			textBox.setAnchorType(AnchorType.TO_CHARACTER);
+
+			// textbox3
+			Table table = Table.newTable(doc, 2, 2);
+			Cell cell = table.getCellByPosition("B1");
+			para = cell.addParagraph("Insert a text box here.");
+			form.createTextBox(para, textBoxRtg, "TextBox3", "TextBox3", false);
+			
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestCreateTextBox.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testCreateCheckBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateTextBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = CheckBox.getSimpleIterator(form);
+			int count = 0;
+			while (iterator.hasNext()) {
+				TextBox textBox = (TextBox) iterator.next();
+				Assert.assertNotNull(textBox);
+				Assert.assertEquals("TextBox" + (++count), textBox.getName());
+				Assert.assertEquals("TextBox" + (count), textBox
+						.getCurrentValue());
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+
+	}
+
+	@Test
+	public void testRemoveCheckBox() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateTextBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = TextBox.getSimpleIterator(form);
+			while (iterator.hasNext()) {
+				TextBox textBox = (TextBox) iterator.next();
+				if (textBox.getName().equals("TextBox2")) {
+					iterator.remove();
+					break;
+				}
+			}
+			CheckBox find = null;
+			while (iterator.hasNext()) {
+				CheckBox textBox = (CheckBox) iterator.next();
+				if (textBox.getName().equals("TextBox2")) {
+					find = textBox;
+					break;
+				}
+			}
+			Assert.assertNull(find);
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestRemoveTextBox.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetTextBoxRectangle() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateTextBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = TextBox.getSimpleIterator(form);
+			TextBox find = null;
+			while (iterator.hasNext()) {
+				TextBox textBox = (TextBox) iterator.next();
+				if (textBox.getName().equals("TextBox2")) {
+					find = textBox;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setRectangle(new FrameRectangle(2.25455, 5, 3, 0.5,
+					SupportedLinearMeasure.IN));
+			Assert.assertEquals(3.0, find.getRectangle().getWidth());
+			Assert.assertEquals(0.5, find.getRectangle().getHeight());
+			Assert.assertEquals(5.0, find.getRectangle().getY());
+			Assert.assertEquals(2.2546, find.getRectangle().getX());
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetTextBoxRectangle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetAnchorType() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateTextBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = TextBox.getSimpleIterator(form);
+			TextBox find = null;
+			while (iterator.hasNext()) {
+				TextBox textBox = (TextBox) iterator.next();
+				if (textBox.getName().equals("TextBox3")) {
+					find = textBox;
+					break;
+				}
+			}
+			Assert.assertNotNull(find);
+			// change the bounding box
+			find.setAnchorType(AnchorType.AS_CHARACTER);
+			// validate
+			ControlStyleHandler frameStyleHandler = find.getDrawControl()
+					.getStyleHandler();
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler
+					.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.BASELINE,
+					graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP,
+					graphicPropertiesForWrite.getVerticalPosition());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetTextBoxAnchorType.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+
+	@Test
+	public void testSetTextContent() {
+		try {
+			TextDocument textDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestCreateTextBox.odt"));
+			Form form = textDoc.getFormByName("Test Form");
+			Iterator<FormControl> iterator = TextBox.getSimpleIterator(form);
+			TextBox textbox1 = null;
+			while (iterator.hasNext()) {
+				TextBox textBox = (TextBox) iterator.next();
+				if (textBox.getName().equals("TextBox1")) {
+					textbox1 = textBox;
+					break;
+				}
+			}
+			TextBox textbox3 = null;
+			while (iterator.hasNext()) {
+				TextBox textBox = (TextBox) iterator.next();
+				if (textBox.getName().equals("TextBox3")) {
+					textbox3 = textBox;
+					break;
+				}
+			}
+			Assert.assertNotNull(textbox3);
+			Assert.assertNotNull(textbox1);
+			// set one-line text
+			String textOneLine = "Input text content into this text box.";
+			textbox3.setCurrentValue(textOneLine);
+			Assert.assertEquals(textOneLine, textbox3.getCurrentValue());
+			// set multi-line textString
+			String textMultiLine = "This text box allow input multi-line content.\n This is the second line.";
+			textbox1.setCurrentValue(textMultiLine);
+			Assert.assertEquals(textMultiLine, textbox1.getCurrentValue());
+			// set null value
+			textbox3.setCurrentValue(null);
+			Assert.assertEquals("", textbox3.getCurrentValue());
+
+			textDoc.save(ResourceUtilities
+					.newTestOutputFile("TestSetTextBoxContent.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TextBoxTest.class.getName()).log(Level.SEVERE,
+					null, e);
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/integrationtest/JarManifestIT.java b/trunk/simple/src/test/java/org/odftoolkit/simple/integrationtest/JarManifestIT.java
new file mode 100644
index 0000000..caa9136
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/integrationtest/JarManifestIT.java
@@ -0,0 +1,84 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple.integrationtest;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.JarManifest;
+
+public class JarManifestIT {
+
+	private static final Logger LOG = Logger.getLogger(JarManifestIT.class.getName());
+
+	@Test
+	public void testJar() {
+		try {
+			String command = "java -jar target/simple.jar";
+			Process process = Runtime.getRuntime().exec(command);
+			process.waitFor();
+			BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+			BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+			String line;
+			while ((line = errorReader.readLine()) != null) {
+				LOG.info(line);
+				Assert.assertTrue(line.indexOf("Exception") == -1);
+			}
+			String firstOutputLine = outputReader.readLine();
+			String secondOutputLine = outputReader.readLine();
+			errorReader.close();
+			outputReader.close();
+			process.destroy();
+			LOG.log(Level.INFO, "The version info from commandline given by {0} is:\n", command);
+			LOG.log(Level.INFO, "\"{0}\"", firstOutputLine);
+			LOG.log(Level.INFO, "\"{0}\"", secondOutputLine);
+			Assert.assertEquals(firstOutputLine, JarManifest.getSimpleOdfTitle() + " (build " + JarManifest.getSimpleOdfBuildDate() + ')');
+			Assert.assertEquals(secondOutputLine, "from " + JarManifest.getSimpleOdfWebsite() + " supporting ODF " + JarManifest.getSimpleOdfSupportedOdfVersion());
+
+			LOG.log(Level.INFO, "\nJarManifest.getName(): {0}", JarManifest.getSimpleOdfName());
+			Assert.assertNotNull(JarManifest.getSimpleOdfName());
+
+			LOG.log(Level.INFO, "\nJarManifest.getTitle(): {0}", JarManifest.getSimpleOdfTitle());
+			Assert.assertNotNull(JarManifest.getSimpleOdfTitle());
+
+			LOG.log(Level.INFO, "\nJarManifest.getVersion(): {0}", JarManifest.getSimpleOdfVersion());
+			Assert.assertNotNull(JarManifest.getSimpleOdfVersion());
+
+			LOG.log(Level.INFO, "\nJarManifest.getBuildDate(): {0}", JarManifest.getSimpleOdfBuildDate());
+			Assert.assertNotNull(JarManifest.getSimpleOdfBuildDate());
+
+			LOG.log(Level.INFO, "\nJarManifest.getBuildResponsible(): {0}", JarManifest.getSimpleOdfBuildResponsible());
+			Assert.assertNotNull(JarManifest.getSimpleOdfBuildResponsible());
+
+			LOG.log(Level.INFO, "\nJarManifest.getSupportedOdfVersion(): {0}", JarManifest.getSimpleOdfSupportedOdfVersion());
+			Assert.assertNotNull(JarManifest.getSimpleOdfSupportedOdfVersion());
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/integrationtest/PerformanceIT.java b/trunk/simple/src/test/java/org/odftoolkit/simple/integrationtest/PerformanceIT.java
new file mode 100644
index 0000000..6374ecd
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/integrationtest/PerformanceIT.java
@@ -0,0 +1,371 @@
+/* 
+  Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.odftoolkit.simple.integrationtest;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.office.OfficeSpreadsheetElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.w3c.dom.NodeList;
+
+public class PerformanceIT {
+
+	private static final Logger LOG = Logger.getLogger(PerformanceIT.class.getName());
+	private static String TEST_FILE_FOLDER;
+	private static String[] TEST_FILE_NAME;
+	//private static final String timesheetTemplate = "timesheetTemplate.ods";
+	//private static final String memorysheetTemplate = "memorysheetTemplate.ods";
+	private double[] totalTime = new double[3];
+	private double[] totalLoadTimeForEach = null;
+	private double[] totalSaveTimeForEach = null;
+	private double[] totalParseTimeForEach = null;
+	private double[] memoryfootprint = null;
+	private String time_spreadsheet = null;
+	private String memory_spreadsheet = null;
+	private String REPORT_FILE_FOLDER = null;
+	private int count = 1;
+	private String testTag = "new test";
+
+	public PerformanceIT() {
+		TEST_FILE_FOLDER = PerformanceIT.class.getClassLoader().getResource("").getPath()
+				+ System.getProperty("testresourcefolder")
+				+ File.separatorChar;
+
+		testTag = System.getProperty("testflag");
+		String executeTimesTest = System.getProperty("executetimes");
+		if (executeTimesTest != null) {
+			count = Integer.parseInt(executeTimesTest);
+		}
+
+		REPORT_FILE_FOLDER = getOutputPath() + File.separatorChar;
+
+		memory_spreadsheet = REPORT_FILE_FOLDER + "memorylog.ods";
+		time_spreadsheet = REPORT_FILE_FOLDER + "timelog.ods";
+
+	}
+
+	private String getOutputPath() {
+		File rootpath = new File(PerformanceIT.class.getClassLoader().getResource("").getPath());
+		File parent = rootpath.getParentFile();
+		File outputpath = new File(parent, "performance-reports");
+		if (!outputpath.exists()) {
+			outputpath.mkdir();
+		}
+		return outputpath.getPath();
+	}
+
+	@Test
+	public void testPerformance() {
+		try {
+			init();
+			// 1. Collect Test result
+			test();
+			// 2. Save to spreadsheet
+			writeToLog();
+		} catch (Exception e) {
+			Logger.getLogger(PerformanceIT.class.getName()).log(Level.SEVERE, null, e);
+
+		}
+	}
+
+	private void init() {
+
+		readFileList(TEST_FILE_FOLDER);
+		if (TEST_FILE_NAME == null) {
+			return;
+		}
+
+		totalTime[0] = 0;
+		totalTime[1] = 0;
+		totalTime[2] = 0;
+
+		totalLoadTimeForEach = new double[TEST_FILE_NAME.length];
+		totalSaveTimeForEach = new double[TEST_FILE_NAME.length];
+		totalParseTimeForEach = new double[TEST_FILE_NAME.length];
+		memoryfootprint = new double[TEST_FILE_NAME.length * 3];
+
+		for (int i = 0; i < TEST_FILE_NAME.length; i++) {
+			totalLoadTimeForEach[i] = 0;
+			totalSaveTimeForEach[i] = 0;
+			totalParseTimeForEach[i] = 0;
+			memoryfootprint[3 * i] = 0;
+			memoryfootprint[3 * i + 1] = 0;
+			memoryfootprint[3 * i + 2] = 0;
+		}
+
+	}
+
+	private void readFileList(String folder) {
+		String filename;
+
+		LOG.log(Level.INFO, "[PerformaceTest] Reading test documents from {0}", folder);
+		File myFolder = new File(folder);
+		if (!myFolder.isDirectory()) {
+			return;
+		}
+		File[] files = myFolder.listFiles();
+		ArrayList myList = new ArrayList();
+
+		for (int i = 0; i < files.length; i++) {
+			filename = files[i].getName();
+			if (filename.endsWith("ods") || filename.endsWith("odp") || filename.endsWith("odt")) {
+				myList.add(filename);
+			}
+			//TEST_FILE_NAME[i]=files[i].getName();
+			//LOG.info("name="+TEST_FILE_NAME[i]);
+		}
+
+		LOG.log(Level.INFO, "[PerformaceTest] {0} test files are loaded", myList.size());
+		if (myList.size() > 0) {
+			TEST_FILE_NAME = (String[]) myList.toArray(new String[1]);
+		}
+	}
+
+	private void writeToLog() throws Exception {
+		FileInputStream timefile, memoryfile;
+		Document timedoc, memorydoc;
+
+		if (TEST_FILE_NAME == null) {
+			return;
+		}
+
+		try {
+			timefile = new FileInputStream(time_spreadsheet);
+			timedoc = Document.loadDocument(timefile);
+		} catch (FileNotFoundException e) {
+			//Create an empty spreadsheet
+			timedoc = SpreadsheetDocument.newSpreadsheetDocument();
+			OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) timedoc.getContentDom().getElementsByTagNameNS(
+					OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+			spreadsheet.removeChild(spreadsheet.getFirstChild());
+		}
+
+		try {
+			memoryfile = new FileInputStream(memory_spreadsheet);
+			memorydoc = Document.loadDocument(memoryfile);
+		} catch (FileNotFoundException e) {
+			//Create an empty spreadsheet
+			memorydoc = SpreadsheetDocument.newSpreadsheetDocument();
+			OfficeSpreadsheetElement spreadsheet = (OfficeSpreadsheetElement) memorydoc.getContentDom().getElementsByTagNameNS(
+					OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+			spreadsheet.removeChild(spreadsheet.getFirstChild());
+		}
+
+		String[] summaryName = new String[]{"Load All Documents", "Parse All Documents", "Save All Documents"};
+		updateTableCells(timedoc, "Summary", totalTime, summaryName);
+		updateTableCells(timedoc, "Load ODF", totalLoadTimeForEach, TEST_FILE_NAME);
+		updateTableCells(timedoc, "Parse ODF", totalParseTimeForEach, TEST_FILE_NAME);
+		updateTableCells(timedoc, "Save ODF", totalSaveTimeForEach, TEST_FILE_NAME);
+
+		String[] memorylabel = new String[TEST_FILE_NAME.length * 3];
+		for (int i = 0; i < TEST_FILE_NAME.length; i++) {
+			memorylabel[3 * i] = "load " + TEST_FILE_NAME[i];
+			memorylabel[3 * i + 1] = "parse " + TEST_FILE_NAME[i];
+			memorylabel[3 * i + 2] = "save " + TEST_FILE_NAME[i];
+		}
+		updateTableCells(memorydoc, "Memory footprint", memoryfootprint, memorylabel);
+
+		timedoc.save(time_spreadsheet);
+		LOG.log(Level.INFO, "[PerformaceTest] Test results are written to {0}", time_spreadsheet);
+		memorydoc.save(memory_spreadsheet);
+		LOG.log(Level.INFO, "[PerformaceTest] Test results are written to {0}", memory_spreadsheet);
+	}
+
+	private void updateTableCells(Document odfdoc, String tablename,
+			double[] values, String[] labels) {
+		int i = 0, j = 0;
+		TableTableRowElement td;
+		TableTableCellElement cell;
+		OdfFileDom dom;
+		NodeList tableList;
+		TableTableElement myTable;
+		NodeList lst;
+		OdfTextParagraph p;
+		OfficeSpreadsheetElement spreadsheet = null;
+
+		try {
+			dom = odfdoc.getContentDom();
+			tableList = dom.getElementsByTagNameNS(
+					OdfDocumentNamespace.TABLE.getUri(), "table");
+			spreadsheet = (OfficeSpreadsheetElement) dom.getElementsByTagNameNS(
+					OdfDocumentNamespace.OFFICE.getUri(), "spreadsheet").item(0);
+
+			i = 0;
+			if (tableList.getLength() > 0) {
+				for (; i < tableList.getLength(); i++) {
+					String currentname = ((TableTableElement) tableList.item(i)).getTableNameAttribute();
+					if (currentname == null) {
+						currentname = "";
+					}
+					if (currentname.equalsIgnoreCase(tablename)) {
+						break;
+					}
+				}
+			}
+			if (i < tableList.getLength()) //table with the specific table name is found
+			{
+				myTable = (TableTableElement) tableList.item(i);
+			} else { //table with the specific table name is not found. Create table
+				myTable = dom.newOdfElement(TableTableElement.class);
+				myTable.setTableNameAttribute(tablename);
+				spreadsheet.appendChild(myTable);
+			}
+
+			lst = myTable.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table-row");
+			if (lst.getLength() == 0) { //the first table row is not existed. Create table row
+				td = dom.newOdfElement(TableTableRowElement.class);
+				cell = dom.newOdfElement(TableTableCellElement.class);
+				p = dom.newOdfElement(OdfTextParagraph.class);
+				if (tablename.startsWith("Memory")) {
+					p.setTextContent("memory(b)");
+				} else {
+					p.setTextContent("time(ms)");
+				}
+				td.appendChild(cell);
+				cell.appendChild(p);
+				myTable.appendChild(td);
+			} else {
+				td = (TableTableRowElement) lst.item(0); //the first table row is existed.
+			}
+			cell = dom.newOdfElement(TableTableCellElement.class);
+			td.appendChild(cell);
+			p = dom.newOdfElement(OdfTextParagraph.class);
+			p.setTextContent(testTag);
+			cell.appendChild(p);
+
+
+			for (i = 1; i < values.length + 1; i++) {
+				if (i < lst.getLength()) { //table row is existed
+					td = (TableTableRowElement) lst.item(i);
+				} else { //table row is not existed.
+					td = dom.newOdfElement(TableTableRowElement.class);
+					myTable.appendChild(td);
+					//append first cell with labels
+					cell = dom.newOdfElement(TableTableCellElement.class);
+					td.appendChild(cell);
+					p = dom.newOdfElement(OdfTextParagraph.class);
+					p.setTextContent(labels[j]);
+					cell.appendChild(p);
+				}
+				cell = dom.newOdfElement(TableTableCellElement.class);
+				cell.setOfficeValueTypeAttribute("float");
+				cell.setOfficeValueAttribute(new Double(values[j]));
+				p = dom.newOdfElement(OdfTextParagraph.class);
+				p.setTextContent(values[j] + "");
+				cell.appendChild(p);
+				td.appendChild(cell);
+				j++;
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+		}
+	}
+
+	private void firsttry() throws Exception {
+		Document doc = null;
+		OdfFileDom dom = null;
+		String filename = null;
+
+		for (int j = 0; j < TEST_FILE_NAME.length; j++) {
+			filename = TEST_FILE_FOLDER + TEST_FILE_NAME[j];
+			LOG.log(Level.INFO, "filename:{0}", filename);
+			doc = Document.loadDocument(filename);
+			dom = doc.getContentDom();
+			doc.save(filename);
+		}
+	}
+
+	private void test() throws Exception {
+		long start, end;
+		Document doc = null;
+		OdfFileDom dom = null;
+		String filename = null;
+
+		if (TEST_FILE_NAME == null) {
+			return;
+		}
+
+		firsttry();
+
+		for (int i = 0; i < count; i++) {
+			for (int j = 0; j < TEST_FILE_NAME.length; j++) {
+				filename = TEST_FILE_FOLDER + TEST_FILE_NAME[j];
+				start = System.currentTimeMillis();
+				doc = Document.loadDocument(filename);
+				end = System.currentTimeMillis();
+				totalLoadTimeForEach[j] += end - start;
+				totalTime[0] += end - start;
+				if (i == 0) {
+					System.gc();
+					memoryfootprint[3 * j] = Runtime.getRuntime().totalMemory()
+							- Runtime.getRuntime().freeMemory();
+				}
+
+				start = System.currentTimeMillis();
+				dom = doc.getContentDom();
+				end = System.currentTimeMillis();
+				totalParseTimeForEach[j] += end - start;
+				totalTime[1] += end - start;
+				if (i == 0) {
+					System.gc();
+					memoryfootprint[3 * j + 1] = Runtime.getRuntime().totalMemory()
+							- Runtime.getRuntime().freeMemory();
+				}
+
+				start = System.currentTimeMillis();
+				doc.save(filename);
+				end = System.currentTimeMillis();
+				totalSaveTimeForEach[j] += end - start;
+				totalTime[2] += end - start;
+
+				doc = null;
+				dom = null;
+				if (i == 0) {
+					System.gc();
+					memoryfootprint[3 * j + 2] = Runtime.getRuntime().totalMemory()
+							- Runtime.getRuntime().freeMemory();
+				}
+			}
+		}
+
+		for (int i = 0; i < 3; i++) {
+			totalTime[i] = totalTime[i] / count;
+		}
+
+		for (int i = 0; i < TEST_FILE_NAME.length; i++) {
+			totalLoadTimeForEach[i] = totalLoadTimeForEach[i] / count;
+			totalParseTimeForEach[i] = totalParseTimeForEach[i] / count;
+			totalSaveTimeForEach[i] = totalSaveTimeForEach[i] / count;
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/meta/MetaDocumentStatisticTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/meta/MetaDocumentStatisticTest.java
new file mode 100644
index 0000000..0660081
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/meta/MetaDocumentStatisticTest.java
@@ -0,0 +1,202 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+
+package org.odftoolkit.simple.meta;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.meta.MetaDocumentStatisticElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class MetaDocumentStatisticTest {
+
+	private String filename = "metaTest.odt";
+	private TextDocument doc;
+	private OdfFileDom metadom;
+	private DocumentStatistic stat;
+	private Integer cellCount = 1;
+	private Integer characterCount = 2;
+	private Integer drawCount = 3;
+	private Integer frameCount = 4;
+	private Integer imageCount = 5;
+	private Integer nonWhitespaceCharacterCount = 6;
+	private Integer objectCount = 7;
+	private Integer oleObjectCount = 8;
+	private Integer pageCount = 9;
+	private Integer paragraphCount = 10;
+	private Integer rowCount = 11;
+	private Integer sentenceCount = 12;
+	private Integer syllableCount = 13;
+	private Integer tableCount = 14;
+	private Integer wordCount = 15;
+
+	@Before
+	public void setUp() throws Exception {
+		doc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+				.getTestResourceAsStream(filename));
+		metadom = doc.getMetaDom();
+		Meta meta = new Meta(metadom);
+		stat = meta.getDocumentStatistic();
+		if (stat == null) {
+			// the element does not exist in the metadata, add a new one
+			MetaDocumentStatisticElement statEle = meta
+					.getOfficeMetaElement().newMetaDocumentStatisticElement();
+			stat = new DocumentStatistic(statEle);
+		}
+
+	}
+
+	@Test
+	public void testGetCellCount() {
+		stat.setCellCount(cellCount);
+		Assert.assertEquals(cellCount, stat.getCellCount());
+	}
+
+	@Test
+	public void testGetCharacterCount() {
+		stat.setCharacterCount(characterCount);
+		Assert.assertEquals(characterCount, stat.getCharacterCount());
+	}
+
+	@Test
+	public void testGetDrawCount() {
+		stat.setDrawCount(drawCount);
+		Assert.assertEquals(drawCount, stat.getDrawCount());
+	}
+
+	@Test
+	public void testGetFrameCount() {
+		stat.setFrameCount(frameCount);
+		Assert.assertEquals(frameCount, stat.getFrameCount());
+	}
+
+	@Test
+	public void testGetImageCount() {
+		stat.setImageCount(imageCount);
+		Assert.assertEquals(imageCount, stat.getImageCount());
+	}
+
+	@Test
+	public void testGetNonWhitespaceCharacterCount() {
+		stat.setNonWhitespaceCharacterCount(nonWhitespaceCharacterCount);
+		Assert.assertEquals(nonWhitespaceCharacterCount, stat
+				.getNonWhitespaceCharacterCount());
+	}
+
+	@Test
+	public void testGetObjectCount() {
+		stat.setObjectCount(objectCount);
+		Assert.assertEquals(objectCount, stat.getObjectCount());
+	}
+
+	@Test
+	public void testGetOleObjectCount() {
+		stat.setOleObjectCount(oleObjectCount);
+		Assert.assertEquals(oleObjectCount, stat.getOleObjectCount());
+	}
+
+	@Test
+	public void testGetPageCount() {
+		stat.setPageCount(pageCount);
+		Assert.assertEquals(pageCount, stat.getPageCount());
+	}
+
+	@Test
+	public void testGetParagraphCount() {
+		stat.setParagraphCount(paragraphCount);
+		Assert.assertEquals(paragraphCount, stat.getParagraphCount());
+	}
+
+	@Test
+	public void testGetRowCount() {
+		stat.setRowCount(rowCount);
+		Assert.assertEquals(rowCount, stat.getRowCount());
+	}
+
+	@Test
+	public void testGetSentenceCount() {
+		stat.setSentenceCount(sentenceCount);
+		Assert.assertEquals(sentenceCount, stat.getSentenceCount());
+	}
+
+	@Test
+	public void testGetSyllableCount() {
+		stat.setSyllableCount(syllableCount);
+		Assert.assertEquals(syllableCount, stat.getSyllableCount());
+	}
+
+	@Test
+	public void testGetTableCount() {
+		stat.setTableCount(tableCount);
+		Assert.assertEquals(tableCount, stat.getTableCount());
+	}
+
+	@Test
+	public void testGetWordCount() {
+		stat.setWordCount(wordCount);
+		Assert.assertEquals(wordCount, stat.getWordCount());
+	}
+
+	@Test
+	public void testReadEmptyDocumentMeta() throws Exception {
+
+		// create a new empty document
+		doc = (TextDocument) TextDocument.newTextDocument();
+		doc
+				.save(ResourceUtilities
+						.newTestOutputFile("EmptyDocForMetaTest.odt"));
+
+		// read empty document meta
+		doc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+				.getTestResourceAsStream("EmptyDocForMetaTest.odt"));
+		metadom = doc.getMetaDom();
+		Meta meta = new Meta(metadom);
+		stat = meta.getDocumentStatistic();
+		Assert.assertNull(stat);
+
+		// create a new stat
+		MetaDocumentStatisticElement statEle = meta
+				.getOfficeMetaElement().newMetaDocumentStatisticElement();
+		stat = new DocumentStatistic(statEle);
+
+		Assert.assertNull(stat.getCellCount());
+		Assert.assertNull(stat.getCharacterCount());
+		Assert.assertNull(stat.getDrawCount());
+		Assert.assertNull(stat.getFrameCount());
+		Assert.assertNull(stat.getImageCount());
+		Assert.assertNull(stat.getNonWhitespaceCharacterCount());
+		Assert.assertNull(stat.getObjectCount());
+		Assert.assertNull(stat.getOleObjectCount());
+		Assert.assertNull(stat.getPageCount());
+		Assert.assertNull(stat.getParagraphCount());
+		Assert.assertNull(stat.getRowCount());
+		Assert.assertNull(stat.getSentenceCount());
+		Assert.assertNull(stat.getSyllableCount());
+		Assert.assertNull(stat.getTableCount());
+		Assert.assertNull(stat.getWordCount());
+
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/meta/OfficeMetaTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/meta/OfficeMetaTest.java
new file mode 100644
index 0000000..593c29c
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/meta/OfficeMetaTest.java
@@ -0,0 +1,302 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.meta;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.attribute.meta.MetaValueTypeAttribute.Value;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.odfdom.type.Duration;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class OfficeMetaTest {
+
+	private String filename = "metaTest.odt";
+	private TextDocument doc;
+	private OdfFileDom metadom;
+	private Meta fMetadata;
+	private String generator = "SIMPLE/" + System.getProperty("simple.version");
+	private String dctitle = "dctitle";
+	private String dcdescription = "dcdescription";
+	private String subject = "dcsubject";
+	private List<String> keywords = new ArrayList<String>();
+	private String initialCreator = "creator";
+	private String dccreator = System.getProperty("user.name");
+	private String printedBy = "persia p";
+	private String language = System.getProperty("user.language");
+	private Integer editingCycles = new Integer(4);
+	private Duration editingDuration = Duration.valueOf("P49DT11H8M9S");
+	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+
+	@Before
+	public void setUp() throws Exception {
+		doc = (TextDocument) TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(filename));
+		metadom = doc.getMetaDom();
+		fMetadata = new Meta(metadom);
+	}
+
+	@Test
+	public void testGetGenerator() throws Exception {
+		fMetadata.setGenerator(generator);
+                writeAndReload();
+		Assert.assertEquals(generator, fMetadata.getGenerator());
+	}
+
+	@Test
+	public void testGetDcTitle() throws Exception {
+		fMetadata.setTitle(dctitle);
+                writeAndReload();
+		Assert.assertEquals(dctitle, fMetadata.getTitle());
+	}
+
+	@Test
+	public void testGetDcDescription() throws Exception {
+		fMetadata.setDescription(dcdescription);
+                writeAndReload();
+		Assert.assertEquals(dcdescription, fMetadata.getDescription());
+	}
+
+	@Test
+	public void testGetSubject() throws Exception {
+		fMetadata.setSubject(subject);
+                writeAndReload();
+		Assert.assertEquals(subject, fMetadata.getSubject());
+	}
+
+	@Test
+	public void testSetAndGetKeywords() throws Exception {
+		keywords.add("lenovo2");
+		keywords.add("computer3");
+		keywords.add("think center");
+		fMetadata.setKeywords(keywords);
+		writeAndReload();
+		Assert.assertEquals(keywords, fMetadata.getKeywords());
+	}
+
+	@Test
+	public void testGetInitialCreator() throws Exception {
+		fMetadata.setInitialCreator(initialCreator);
+                writeAndReload();
+		Assert.assertEquals(initialCreator, fMetadata.getInitialCreator());
+	}
+
+	@Test
+	public void testGetDcCreator() throws Exception {
+		fMetadata.setCreator(dccreator);
+                writeAndReload();
+		Assert.assertEquals(dccreator, fMetadata.getCreator());
+	}
+
+	@Test
+	public void testGetPrintedBy() throws Exception {
+		fMetadata.setPrintedBy(printedBy);
+                writeAndReload();
+		Assert.assertEquals(printedBy, fMetadata.getPrintedBy());
+	}
+
+	@Test
+	public void testSetAndGetCreationDate() throws Exception {
+		Calendar creationDate = Calendar.getInstance();
+		fMetadata.setCreationDate(creationDate);
+		writeAndReload();
+		// //the millisecond lost while changing calendar to string
+		// creationDate.clear(Calendar.MILLISECOND);
+		// fMetadata.getCreationDate().clear(Calendar.MILLISECOND);
+		//Assert.assertEquals(0,creationDate.compareTo(fMetadata.getCreationDate
+		// ()));
+		String expected = sdf.format(creationDate.getTime());
+		String actual = sdf.format(fMetadata.getCreationDate().getTime());
+		Assert.assertEquals(expected, actual);
+	}
+
+	@Test
+	public void testSetDcDate() throws Exception {
+		Calendar dcDate = Calendar.getInstance();
+		fMetadata.setDcdate(dcDate);
+		writeAndReload();
+		// dcDate.clear(Calendar.MILLISECOND);
+		// fMetadata.getDcdate().clear(Calendar.MILLISECOND);
+		// Assert.assertEquals(0,dcDate.compareTo(fMetadata.getDcdate()));
+		String expected = sdf.format(dcDate.getTime());
+		String actual = sdf.format(fMetadata.getDcdate().getTime());
+		Assert.assertEquals(expected, actual);
+	}
+
+	@Test
+	public void testSetPrintDate() throws Exception {
+		Calendar printDate = Calendar.getInstance();
+		fMetadata.setPrintDate(printDate);
+		writeAndReload();
+		// printDate.clear(Calendar.MILLISECOND);
+		// fMetadata.getPrintDate().clear(Calendar.MILLISECOND);
+		// Assert.assertEquals(0,printDate.compareTo(fMetadata.getPrintDate()));
+		String expected = sdf.format(printDate.getTime());
+		String actual = sdf.format(fMetadata.getPrintDate().getTime());
+		Assert.assertEquals(expected, actual);
+	}
+
+	@Test
+	public void testGetLanguage() throws Exception {
+		fMetadata.setLanguage(language);
+                writeAndReload();
+		Assert.assertEquals(language, fMetadata.getLanguage());
+	}
+
+	@Test
+	public void testGetEditingCycles() throws Exception {
+		fMetadata.setEditingCycles(editingCycles);
+                writeAndReload();
+		Assert.assertNotNull(fMetadata.getEditingCycles());
+	}
+
+	@Test
+	public void testGetEditingDuration() throws Exception {
+		fMetadata.setEditingDuration(editingDuration);
+                writeAndReload();
+		Assert.assertNotNull(fMetadata.getEditingDuration());
+	}
+
+	@Test
+	public void testEmptyKeyword() throws Exception {
+		List<String> emptyKeyword = new ArrayList<String>();
+		fMetadata.setKeywords(emptyKeyword);
+		writeAndReload();
+		Assert.assertNull(fMetadata.getKeywords());
+	}
+
+	@Test
+	public void testAddKeyword() throws Exception {
+		String newKeyword = "hello";
+		fMetadata.addKeyword(newKeyword);
+		writeAndReload();
+		Assert.assertEquals(true, fMetadata.getKeywords().contains(newKeyword));
+	}
+
+	@Test
+	public void testSetAndGetUserdefinedData() throws Exception {
+		// remove if there is userdefined data
+		List<String> names;
+		names = fMetadata.getUserDefinedDataNames();
+		if (names == null) {
+			names = new ArrayList<String>();
+		} else {
+			for (String name : names) {
+				fMetadata.removeUserDefinedDataByName(name);
+			}
+			names.clear();
+		}
+		names.add("weather");
+		names.add("mood");
+		names.add("late");
+		// test set
+		fMetadata.setUserDefinedData(names.get(0), Value.STRING.toString(),
+				"windy");
+		fMetadata.setUserDefinedData(names.get(1), Value.STRING.toString(),
+				"happy");
+		fMetadata.setUserDefinedData(names.get(2), Value.BOOLEAN.toString(),
+				"false");
+		writeAndReload();
+                
+		// test get
+		Assert.assertEquals(names, fMetadata.getUserDefinedDataNames());
+		Assert.assertEquals(Value.STRING.toString(), fMetadata.getUserDefinedDataType(names.get(0)));
+		Assert.assertEquals("windy", fMetadata.getUserDefinedDataValue(names.get(0)));
+
+		fMetadata.setUserDefinedDataValue(names.get(1), "false");
+		fMetadata.setUserDefinedDataType(names.get(1), Value.BOOLEAN.toString());
+		fMetadata.setUserDefinedData(names.get(2), Value.STRING.toString(),
+				"no");
+		writeAndReload();
+		// update
+		Assert.assertEquals("false", fMetadata.getUserDefinedDataValue(names.get(1)));
+		Assert.assertEquals(Value.BOOLEAN.toString(), fMetadata.getUserDefinedDataType(names.get(1)));
+		Assert.assertEquals("no", fMetadata.getUserDefinedDataValue(names.get(2)));
+		Assert.assertEquals(Value.STRING.toString(), fMetadata.getUserDefinedDataType(names.get(2)));
+		writeAndReload();
+		// remove
+		fMetadata.removeUserDefinedDataByName(names.get(0));
+		writeAndReload();
+		Assert.assertEquals(2, fMetadata.getUserDefinedDataNames().size());
+	}
+
+	@Test
+	public void testReadEmptyDocumentMeta() throws Exception {
+
+		// create a new empty document
+		doc = TextDocument.newTextDocument();
+		doc.save(ResourceUtilities.newTestOutputFile("EmptyDocForMetaTest.odt"));
+
+		// read empty document meta
+		doc = (TextDocument) TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("EmptyDocForMetaTest.odt"));
+		metadom = doc.getMetaDom();
+		fMetadata = new Meta(metadom);
+		//Assert.assertTrue(fMetadata.getGenerator().startsWith(generator));
+		//ToDO: http://odftoolkit.org/bugzilla/show_bug.cgi?id=171
+		// Assert.assertEquals(fMetadata.getGenerator(), generator);
+		Assert.assertNull(fMetadata.getTitle());
+		Assert.assertNull(fMetadata.getDescription());
+		Assert.assertNull(fMetadata.getSubject());
+		Assert.assertNull(fMetadata.getKeywords());
+		Assert.assertNull(fMetadata.getPrintedBy());
+		Assert.assertNull(fMetadata.getPrintDate());
+		Assert.assertNotNull(fMetadata.getUserDefinedDataNames());
+	}
+	
+	@Test
+	public void testReadDocumentMeta() throws Exception {
+		// create a new empty document
+		TextDocument textDoc = TextDocument.newTextDocument();
+		textDoc.save(ResourceUtilities.newTestOutputFile("DocForMetaTest.odt"));
+		textDoc.close();
+		// read empty document meta
+		textDoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("DocForMetaTest.odt"));
+		Meta meta = textDoc.getOfficeMetadata();
+		Assert.assertNotNull(meta.getGenerator());
+		Assert.assertNotNull(meta.getCreationDate());
+		Assert.assertNotNull(meta.getCreator());
+		Assert.assertNotNull(meta.getDcdate());
+		Assert.assertTrue(meta.getEditingCycles()>0);
+		Assert.assertNotNull(meta.getEditingDuration());
+		Assert.assertNotNull(meta.getLanguage());
+		textDoc.close();
+	}
+        
+    private void writeAndReload() throws Exception {
+        File persistedDocument = File.createTempFile(getClass().getName(), ".odt");
+        persistedDocument.deleteOnExit();
+	doc.save(persistedDocument);
+	Thread.sleep(100);
+	doc = (TextDocument) TextDocument.loadDocument(persistedDocument);
+	metadom = doc.getMetaDom();
+	fMetadata = new Meta(metadom);
+    }
+        
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/NotesTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/NotesTest.java
new file mode 100644
index 0000000..ade4f64
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/NotesTest.java
@@ -0,0 +1,76 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.presentation;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.text.list.BulletDecorator;
+import org.odftoolkit.simple.text.list.ImageDecorator;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.odftoolkit.simple.text.list.NumberDecorator;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class NotesTest {
+	PresentationDocument doc;
+	final String TEST_PRESENTATION_FILE_MAIN = "Presentation1.odp";
+
+	@Test
+	public void testAddRemoveIterateSubList() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			ListDecorator bulletDecorator = new BulletDecorator(doc);
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+			ListDecorator imageDecorator = new ImageDecorator(doc, ResourceUtilities.getURI("image_list_item.png"));
+			String[] numberItemContents = { "number item 1", "number item 2", "number item 3" };
+
+			// add list.
+			Slide slide = doc.newSlide(0, "test0", Slide.SlideLayout.TITLE_OUTLINE);
+			ListContainer container = slide.getNotesPage();
+			org.odftoolkit.simple.text.list.List bulletList = container.addList(bulletDecorator);
+			bulletList.addItems(numberItemContents);
+			org.odftoolkit.simple.text.list.List numberList = container.addList(numberDecorator);
+			numberList.addItems(numberItemContents);
+			org.odftoolkit.simple.text.list.List imageList = container.addList(imageDecorator);
+			imageList.addItems(numberItemContents);
+			// iterate list
+			Iterator<org.odftoolkit.simple.text.list.List> lists = container.getListIterator();
+			int i = 0;
+			while (lists.hasNext()) {
+				lists.next();
+				i++;
+			}
+			Assert.assertEquals(3, i);
+			// remove list
+			container.clearList();
+			Assert.assertFalse(container.getListIterator().hasNext());
+		} catch (Exception e) {
+			Logger.getLogger(NotesTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/SlideTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/SlideTest.java
new file mode 100644
index 0000000..87b5fdb
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/SlideTest.java
@@ -0,0 +1,1048 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.presentation;
+
+import java.awt.Rectangle;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement;
+import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement;
+import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement;
+import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.PresentationDocument.PresentationClass;
+import org.odftoolkit.simple.chart.Chart;
+import org.odftoolkit.simple.draw.Textbox;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.TableContainer;
+import org.odftoolkit.simple.text.list.BulletDecorator;
+import org.odftoolkit.simple.text.list.ImageDecorator;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.odftoolkit.simple.text.list.NumberDecorator;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Test for Presentation Slide API, including get/move/insert/delete slide in
+ * one presentation and the slides operation of two presentations.
+ */
+public class SlideTest {
+
+	private static final Logger LOG = Logger.getLogger(SlideTest.class.getName());
+	PresentationDocument doc;
+	PresentationDocument doc2;
+	final String TEST_PRESENTATION_FILE_MAIN = "Presentation1.odp";
+	final String TEST_PRESENTATION_FILE_ANOTHER = "Presentation2.odp";
+	final String TEST_PRESENTATION_FILE_OUT_PREFIX = "SlideResult";
+	final String TEST_PRESENTATION_DOCUMENT1 = "SlideTest1.odp";
+	final String TEST_PRESENTATION_DOCUMENT2 = "SlideTest2.odp";
+	final String TEST_PRESENTATION_DOCUMENT3 = "SlideTest3.odp";
+
+	/**
+	 * Initialize the test case.
+	 */
+	public SlideTest() {
+	}
+
+	/**
+	 * Test case for get presentation slide, including get the slide count, get
+	 * the slide at the specified position or with the specified name, and get
+	 * the collection of slide.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp <b>Method</b> 1)By using
+	 * PresentationDocument.getSlideCount() to Get the number of the slides in
+	 * this presentation. 2)According to the slide count, get a slide at the
+	 * specific position of the loaded presentation document using
+	 * PresentationDocument.getSlideByIndex(int index), and the param "index"
+	 * should be limited with the slide count. Use OdfDrawPage.getSlideIndex()
+	 * method to verify the returned slide.
+	 * 3)PresentationDocument.getSlideByName(String name) 4)Using
+	 * dfPresentationDocument.getSlides() to get the slide iterator <b>Covered
+	 * Element</b> &lt;office:presentation&gt;,&lt;draw:page&gt; <b>Note</b>
+	 * PresentationDocument.getContentRoot override Document.getContentRoot
+	 * method will return OfficePresentationElement, rather than
+	 * OdfOfficePresentation because of the inheritance relationship broken up
+	 * between dom and doc element And because OdfOfficePresentation is useless,
+	 * so I delete this class <b>Code Coverage Result</b> 1)can not catch
+	 * Exception because it is only used to catch the exception thrown by
+	 * getContentRoot()
+	 */
+	@Test
+	public void testGetSlide() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			int slideCount = doc.getSlideCount();
+			Assert.assertTrue(10 == slideCount);
+			Slide page2 = doc.getSlideByIndex(2);
+			Assert.assertTrue(2 == page2.getSlideIndex());
+			Slide slide3 = doc.getSlideByName("Slide 3");
+			Assert.assertNull(slide3);
+			slide3 = doc.getSlideByName("page3");
+			Assert.assertEquals(page2, slide3);
+			Iterator<Slide> slideIter = doc.getSlides();
+			int i = 0;
+			while (slideIter.hasNext()) {
+				Slide slide = slideIter.next();
+				Assert.assertTrue(i == slide.getSlideIndex());
+				String name = "page" + (i + 1);
+				Assert.assertTrue(name.equals(slide.getSlideName()));
+				i++;
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		Slide slidesNoName = doc.getSlideByName(null);
+		Assert.assertNull(slidesNoName);
+		Slide nullSlide = doc.getSlideByIndex(20);
+		Assert.assertNull(nullSlide);
+		nullSlide = doc.getSlideByIndex(-1);
+		Assert.assertNull(nullSlide);
+
+	}
+
+	/**
+	 * Test case for get/set slide name to make sure the name is unique in the
+	 * whole presentation document. If the loaded presentation document is not
+	 * valid that contain the same slide name, we should modified the duplicate
+	 * slide name to make them unique.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp Using the dom method to make
+	 * slide index 4 and 8 have the same name, and delete the "draw:name"
+	 * attribute of slide 7. <b>Method</b> 1)By accessing any slide API to
+	 * trigger the duplicate slide name check method. After this operation,
+	 * slide 8 will change the slide name. 2)Trigger OdfDrawPage.getSlideName()
+	 * to make the slide 7 has the unique slide name. 3)Using
+	 * OdfDrawPage.setSlideName() to give the slide 1 with the new name.
+	 */
+	@Test
+	public void testSlideName() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			OfficePresentationElement contentRoot = doc.getContentRoot();
+			NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page");
+			DrawPageElement slideEle4 = (DrawPageElement) slideNodes.item(4);
+			Assert.assertEquals(slideEle4.getDrawNameAttribute(), "page5");
+			DrawPageElement slideEle8 = (DrawPageElement) slideNodes.item(8);
+			slideEle8.setDrawNameAttribute("page5");
+			Slide slide7 = doc.getSlideByIndex(7);
+			DrawPageElement slideEle7 = (DrawPageElement) slideNodes.item(7);
+			slideEle7.removeAttributeNS(OdfDocumentNamespace.DRAW.getUri(), "name");
+
+			Slide slide4 = doc.getSlideByIndex(4);
+			Assert.assertTrue(slide4.getSlideName().equals("page5"));
+			Slide slide8 = doc.getSlideByIndex(8);
+			Assert.assertFalse(slide8.getSlideName().equals("page5"));
+
+			Assert.assertTrue(slide7.getSlideName().startsWith("page8"));
+			Notes note7 = slide7.getNotesPage();
+			note7.addText("This is slide at index" + slide7.getSlideIndex() + " named " + slide7.getSlideName());
+
+			Slide slide1 = doc.getSlideByIndex(1);
+			slide1.setSlideName("haha");
+			slide1.setSlideName("page1");
+
+		} catch (IllegalArgumentException ile) {
+			Slide slide1 = doc.getSlideByIndex(1);
+			Assert.assertTrue("the given name page1 is duplicate with the previous slide", slide1.getSlideName()
+					.equals("haha"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "SlideName.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for delete presentation slide, including delete slide at the
+	 * specified position or with the specified name.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp <b>Method</b> 1)By using
+	 * PresentationDocument.deleteSlideByIndex(int index) to delete the slide at
+	 * the specified position which is present by param "index", then index of
+	 * the slide which after the delete slide will change. 2)Delete slide with
+	 * the specified name by using PresentationDocument.deleteSlideByName(String
+	 * name) <b>PostCondition</b> Save the modified document at
+	 * SlideResultDelete.odp <b>Covered Element</b> 1)
+	 * &lt;office:presentation&gt;,&lt;draw:page&gt; 2)All the element that
+	 * contains "xlink:href" attribute, such as &lt;draw:object&gt;,
+	 * &lt;draw:image&gt;, etc. 3)All the style name definition element, include
+	 * &lt;style:style&gt;, &lt;text:list-style&gt;, &lt;number:time-style&gt;,
+	 * &lt;number:date-style&gt;, &lt;number:boolean-style&gt;,
+	 * &lt;number:number-style&gt;, &lt;number:currency-style&gt;,
+	 * &lt;number:percentage-style&gt;, &lt;number:text-style&gt; 4)All the
+	 * <code>OdfStylableElement</code> which have the style name reference, such
+	 * as &lt;draw:frame&gt;, &lt;text:p&gt; etc. <b>Note</b> When the specific
+	 * slide is delete, if it referred images, ole or styles are not used by
+	 * other slide they will all be removed from the package.
+	 */
+	@Test
+	public void testDeleteSlide() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			Slide slide2 = doc.getSlideByIndex(2);
+			Slide slide3 = doc.getSlideByIndex(3);
+			// this slide contains an embed document, remove this slide will
+			// also remove the embed document
+			int nEmbedDoc = doc.getEmbeddedDocuments().size();
+			Assert.assertTrue(doc.deleteSlideByIndex(2));
+			// slide3 is no longer exist
+			Assert.assertTrue(-1 == slide2.getSlideIndex());
+			Assert.assertTrue(2 == slide3.getSlideIndex());
+			Assert.assertTrue(doc.getEmbeddedDocuments().size() == (nEmbedDoc - 1));
+			Assert.assertTrue(doc.deleteSlideByName("page5"));
+			int count = doc.getSlideCount();
+			Assert.assertTrue(8 == count);
+			// slide at index 9 contains two images and one embed document, the
+			// embed document aslo have the object replacement image
+			// remove this slide will also remove these three images
+			String IMAGE_NAME_1 = "Pictures/10000000000002580000018FB151A5C8.jpg";
+			String IMAGE_NAME_2 = "Pictures/1000000000000C80000004009305DCA3.jpg";
+			String IMAGE_NAME_3 = "ObjectReplacements/Object 13";
+			int nImageCnt = OdfDrawImage.getImageCount(doc);
+			InputStream imageStream1 = doc.getPackage().getInputStream(IMAGE_NAME_1);
+			Assert.assertNotNull(imageStream1);
+			Assert.assertTrue(doc.deleteSlideByIndex(doc.getSlideCount() - 2));
+			Assert.assertTrue(OdfDrawImage.getImageCount(doc) == (nImageCnt - 3));
+			imageStream1 = doc.getPackage().getInputStream(IMAGE_NAME_1);
+			Assert.assertNull(imageStream1);
+			InputStream imageStream2 = doc.getPackage().getInputStream(IMAGE_NAME_2);
+			Assert.assertNull(imageStream2);
+			InputStream imageStream3 = doc.getPackage().getInputStream(IMAGE_NAME_3);
+			Assert.assertNull(imageStream3);
+			// slide at index 2 at doc2 contains one image, but it also referred
+			// by other slides
+			// so the image of this slide will not be removed
+			doc2 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_ANOTHER));
+			nImageCnt = OdfDrawImage.getImageCount(doc2);
+			Assert.assertTrue(doc2.deleteSlideByIndex(2));
+			Assert.assertTrue(OdfDrawImage.getImageCount(doc2) == (nImageCnt - 1));
+			imageStream1 = doc2.getPackage().getInputStream(IMAGE_NAME_1);
+			Assert.assertNotNull(imageStream1);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			Assert.assertTrue(doc.deleteSlideByIndex(20));
+			Assert.assertTrue(false);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Delete.odp"));
+			doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Delete2.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for create new slide at the specified position, with the
+	 * specified name and slide template.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp <b>Method</b>
+	 * PresentationDocument.newSlide(int index, String name,
+	 * OdfDrawPage.SlideLayout slideLayout) is used to new a slide at the
+	 * specified position with the specified name, and use the specified slide
+	 * template. <b>Postcondition</b> Save the modified document at
+	 * SlideResultNew.odp <b>Covered Element</b> 1)
+	 * &lt;style:presentation-page-layout&gt; referred by
+	 * "presentation:presentation-page-layout-name" attribute of
+	 * &lt;draw:page&gt; 2) &lt;style:master-page&gt; referred by
+	 * "draw:master-page-name" attribute of &lt;draw:page&gt; 3) The placeholder
+	 * element of &lt;draw:page&gt;, such as title, outline placeholder
+	 * <b>Note</b> The new slide will use the same master page style of the
+	 * previous slide, and add the placeholder on the slide according to the
+	 * slide template parameter.
+	 */
+	@Test
+	public void testNewSlide() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			Slide slide5 = doc.getSlideByIndex(5);
+			Slide newSlide1 = doc.newSlide(2, "Slide 2 new", Slide.SlideLayout.BLANK);
+			Assert.assertTrue(2 == newSlide1.getSlideIndex());
+			Slide newSlide2 = doc.newSlide(0, "", Slide.SlideLayout.TITLE_ONLY);
+			Assert.assertTrue(newSlide2.getSlideName().equals(""));
+			Assert.assertTrue(7 == slide5.getSlideIndex());
+			doc.newSlide(3, Slide.SlideLayout.TITLE_PLUS_TEXT.toString(), Slide.SlideLayout.enumValueOf("title_text"));
+			Slide newSlide4 = doc.newSlide(4, null, Slide.SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			Assert.assertTrue(newSlide4.getOdfElement().getDrawNameAttribute() != null);
+			Slide.SlideLayout outlineType = Slide.SlideLayout.TITLE_OUTLINE;
+			doc.newSlide(14, Slide.SlideLayout.toString(outlineType), outlineType);
+			doc.newSlide(15, "Default", null);
+			int count = doc.getSlideCount();
+			Assert.assertTrue(16 == count);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc.newSlide(20, "Slide 20 new", Slide.SlideLayout.BLANK);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "New.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for move the slide from one position to another, or copy a
+	 * specified slide and insert it to another specified position.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp
+	 * test\resources\performance\Presentation1.odp <b>Method</b> 1)Using
+	 * PresentationDocument.moveSlide(int current, int destination) to move a
+	 * slide at the current position to the destination position.
+	 * 2)PresentationDocument.copySlide(int source, int dest, String newName) is
+	 * used to make a copy of the slide at a specified position to another
+	 * position in this presentation. <b>Postcondition</b> Save the modified
+	 * document at SlideResultMoveAndCopy.odp <b>Covered Element</b> 1)
+	 * &lt;office:presentation&gt;,&lt;draw:page&gt; 2)
+	 * &lt;presentation:notes&gt; of each slide. <b>Note</b> Each slide has its
+	 * own notes page to show its notes view, while the notes page has the
+	 * "draw:page-number" attribute to show the notes view of which slide so
+	 * when the slide is moved or copied, the index of this slide will be
+	 * change, the notes page have to change the "draw:page-number" value.
+	 */
+	@Test
+	public void testMoveAndCopySlide() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			Slide lastSlide = doc.getSlideByIndex(9);
+			Slide firstSlide = doc.getSlideByIndex(0);
+
+			Slide copyFirstToLastSlide = doc.copySlide(0, 10, firstSlide.getSlideName() + "(copy)");
+			Assert.assertTrue(10 == copyFirstToLastSlide.getSlideIndex());
+
+			Slide copyLastToFirstSlide = doc.copySlide(9, 0, lastSlide.getSlideName() + "(copy)");
+			Assert.assertTrue(0 == copyLastToFirstSlide.getSlideIndex());
+
+			doc.moveSlide(11, 0);
+			doc.moveSlide(1, 12);
+			Assert.assertTrue(1 == firstSlide.getSlideIndex());
+			Assert.assertTrue(10 == lastSlide.getSlideIndex());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc.moveSlide(20, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.moveSlide(-1, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.copySlide(20, 0, "outofbounds");
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.copySlide(-1, 0, "outofbounds");
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "MoveAndCopy.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for copy a slide which comes from the other presentation to the
+	 * specified position of the current presentation.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp &
+	 * test\resources\performance\Presentation2.odp <b>Method</b> Using
+	 * PresentationDocument.copyForeignSlide(int destIndex,PresentationDocument
+	 * srcDoc, int srcIndex) to copy a slide which locates at "srcIndex"
+	 * position of the "srcDoc" presentation document and insert it to the
+	 * current presentation document at "destIndex" position.
+	 * <b>Postcondition</b> Save the modified document at
+	 * SlideResultCopyForeignSlide.odp <b>Covered Element</b> 1)
+	 * &lt;office:presentation&gt;,&lt;draw:page&gt; 2) All the element that
+	 * contains "xlink:href" attribute, such as &lt;draw:object&gt;,
+	 * &lt;draw:image&gt;, etc. 3) Each style definition element of
+	 * &lt;draw:page&gt; and its all child elements such as layout style, master
+	 * page style, object style and text style the style definition element must
+	 * contain "style:name" or "draw:name" attribute, include
+	 * &lt;style:mater-page
+	 * &gt;,&lt;style:page-layout&gt;,&lt;style:presentation-page-layout&gt;,
+	 * &lt;style:style&gt;, &lt;text:list-style&gt;, &lt;number:time-style&gt;,
+	 * &lt;number:date-style&gt;, &lt;number:boolean-style&gt;,
+	 * &lt;number:number-style&gt;, &lt;number:currency-style&gt;,
+	 * &lt;number:percentage-style&gt;, &lt;number:text-style&gt;,
+	 * &lt;text:outline-style&gt;,&lt;style:font-face&gt;, 4) the element which
+	 * refer the style name, that is &lt;draw:page&gt; and all the child
+	 * elements. <b>Note</b> If the copied style/image/ole name is duplicated
+	 * with destination presentation document, the name definition element and
+	 * reference element must be renamed then insert to the dest document.
+	 */
+	@Test
+	public void testCopyForeignSlide() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			doc2 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_ANOTHER));
+
+			// copy slide at index 2 of doc to the index 2 of doc2
+			int nEmbedDoc = doc2.getEmbeddedDocuments().size();
+			String embedDocName = "Object 3/";
+			OdfFileEntry fileEntry = doc2.getPackage().getFileEntry(embedDocName);
+			Assert.assertNull(fileEntry);
+			Slide newPage1 = doc2.copyForeignSlide(2, doc, 2);
+			Assert.assertTrue(2 == newPage1.getSlideIndex());
+			// slide at index 2 of doc contains an embedded document called
+			// "Object 3"
+			Document embedDoc = doc2.getEmbeddedDocument(embedDocName);
+			Assert.assertNotNull(embedDoc);
+			int size = doc2.getEmbeddedDocuments().size();
+			Assert.assertTrue(size == (nEmbedDoc + 1));
+			// the copied slide also have an bitmap background, and the image
+			// bullet
+			// they should all be copied
+			String BACKGROUND_IMAGE_NAME = "Pictures/1000000000000C80000004009305DCA3.jpg";
+			String BULLET_IMAGE_NAME = "Pictures/10000000000002580000018FB151A5C8.jpg";
+			InputStream backgroundImage = doc2.getPackage().getInputStream(BACKGROUND_IMAGE_NAME);
+			Assert.assertNotNull(backgroundImage);
+			// copy the slide at index 2 of doc to the end of doc2
+			Slide newPage2 = doc2.copyForeignSlide(101, doc, 2);
+			Assert.assertNotNull(doc2.getPackage().getFileEntry(BULLET_IMAGE_NAME));
+			Assert.assertFalse(newPage1.getSlideName().equals(newPage2.getSlideName()));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+		try {
+			doc2.copyForeignSlide(200, doc, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc2.copyForeignSlide(-1, doc, 0);
+		} catch (IndexOutOfBoundsException iobe) {
+			Assert.assertTrue("slide index is out of bounds", true);
+		}
+
+		try {
+			doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "CopyForeignSlide2.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for appending all the slide of one presentation to the end of
+	 * another presentation.
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\Presentation1.odp &
+	 * test\resources\performance\Presentation2.odp <b>Method</b> Using
+	 * PresentationDocument.appendPresentation(PresentationDocument aDoc) to
+	 * append the specified presentation to the current presentation.
+	 * <b>Postcondition</b> Save the modified document at SlideResultMerge.odp
+	 * <b>Covered Element</b> Same with <code>CopyForeignSlide</code> method,
+	 * except that it covers all the slide element of the document,rather than
+	 * specific slide. <b>Note</b> 1)You'd better check the generated document
+	 * to look at if there are any object/style is lost. 2) The generated file
+	 * size will be larger than we append by using OpenOffice/Symphony, that is
+	 * because the styles and images from the different document might have the
+	 * same content, but I still append them rather than use one copy, because
+	 * compare the odf element content and the image stream might cost much
+	 * time.
+	 */
+	@Test
+	public void testAppendPresentation() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			doc2 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_ANOTHER));
+			int slideCount = doc.getSlideCount();
+			int slideCount2 = doc2.getSlideCount();
+			// doc, doc2 both have the embed document named "Object 2"
+			// with different content, so after appendPresentation,
+			// the embedded doc "Object 2" of doc will be renamed
+			String EMBEDDOC_NAME = "Object 2";
+			Assert.assertNotNull(doc.getEmbeddedDocument(EMBEDDOC_NAME));
+			Assert.assertNotNull(doc2.getEmbeddedDocument(EMBEDDOC_NAME));
+			doc2.appendPresentation(doc);
+			Assert.assertTrue((slideCount + slideCount2) == doc2.getSlideCount());
+			// slide at index 3 of doc contains "Object 2", "Object 6"
+			// after appendPresentation, let's check the slide at index 103 of
+			// merged document
+			// which is corresponding to the slide at index 3 of doc
+			Slide slide = doc2.getSlideByIndex(103);
+			DrawPageElement slideEle = slide.getOdfElement();
+			NodeList objectList = slideEle.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "object");
+			Assert.assertTrue(objectList.getLength() == 2);
+			DrawObjectElement object1 = (DrawObjectElement) objectList.item(0);
+			String linkPath = object1.getXlinkHrefAttribute();
+			Assert.assertTrue(linkPath.startsWith("./Object 2") && !linkPath.equals("./Object 2"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Merge2.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testAnotherMergeDoc() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			doc2 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_ANOTHER));
+			doc.appendPresentation(doc2);
+			Assert.assertTrue(doc.getSlideCount() == 110);
+			doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Merge1.odp"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	/**
+	 * Test case for merge the three presentation document
+	 * <p>
+	 * <b>Precondition</b> Load Presentation File at
+	 * test\resources\performance\SlideTest1.odp,
+	 * test\resources\performance\SlideTest2.odp and
+	 * test\resources\performance\SlideTest3.odp <b>Method</b> copy the slide
+	 * from SlideTest2.odp and SlideTest3.odp to SlideTest1.odp
+	 * <b>Postcondition</b> Save the modified document at
+	 * SlideResultCopyThreeDoc.odp <b>Notice</b> This test case is used to show
+	 * that the style name can be renamed if they define the different style.
+	 */
+	@Test
+	public void testCopyThreeDoc() {
+		try {
+			// testdoc1 contain "dp1" for draw page style
+			PresentationDocument testdoc1 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_DOCUMENT1));
+			// testdoc1 contain "dp1" for draw page style
+			PresentationDocument testdoc2 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_DOCUMENT2));
+			// testdoc1 contain "dp1" for draw page style
+			PresentationDocument testdoc3 = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_DOCUMENT3));
+			testdoc1.copyForeignSlide(1, testdoc2, 0);
+			testdoc1.copyForeignSlide(2, testdoc3, 0);
+			// after copy foreign slide, the each slide should has its own draw
+			// page style
+			DrawPageElement slide1 = testdoc1.getSlideByIndex(0).getOdfElement();
+			DrawPageElement slide2 = testdoc1.getSlideByIndex(1).getOdfElement();
+			DrawPageElement slide3 = testdoc1.getSlideByIndex(2).getOdfElement();
+			String slideStyle1 = slide1.getDrawNameAttribute();
+			String slideStyle2 = slide2.getDrawNameAttribute();
+			String slideStyle3 = slide3.getDrawNameAttribute();
+			LOG.info(slideStyle1);
+			LOG.info(slideStyle2);
+			LOG.info(slideStyle3);
+			testdoc1.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "CopyThreeDoc.odp"));
+			Assert.assertNotSame(slideStyle1, slideStyle2);
+			Assert.assertNotSame(slideStyle2, slideStyle3);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testAddRemoveIterateSubList() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			ListDecorator bulletDecorator = new BulletDecorator(doc);
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+			ListDecorator imageDecorator = new ImageDecorator(doc, ResourceUtilities.getURI("image_list_item.png"));
+			String[] numberItemContents = { "number item 1", "number item 2", "number item 3" };
+
+			// add list.
+			ListContainer container = doc.newSlide(0, "test0", Slide.SlideLayout.TITLE_OUTLINE);
+			org.odftoolkit.simple.text.list.List bulletList = container.addList(bulletDecorator);
+			bulletList.addItems(numberItemContents);
+			container = doc.newSlide(1, "test1", Slide.SlideLayout.TITLE_PLUS_2_TEXT_BLOCK);
+			org.odftoolkit.simple.text.list.List numberList = container.addList(numberDecorator);
+			numberList.addItems(numberItemContents);
+			container = doc.newSlide(2, "test2", Slide.SlideLayout.TITLE_PLUS_TEXT);
+			org.odftoolkit.simple.text.list.List imageList = container.addList(imageDecorator);
+			imageList.addItems(numberItemContents);
+			// iterate list
+			Assert.assertTrue(container.getListIterator().hasNext());
+			// remove list
+			container.clearList();
+			Assert.assertFalse(container.getListIterator().hasNext());
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testAddTable() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_PRESENTATION_FILE_MAIN));
+			// add table.
+			TableContainer container = doc.newSlide(2, "title_plus_text", Slide.SlideLayout.TITLE_PLUS_TEXT);
+			Table table = container.addTable();
+			table.setTableName("SlideTable");
+			String slideTableCellValue = "SlideTable Cell String";
+			table.getCellByPosition(0, 0).setStringValue(slideTableCellValue);
+			doc.save(ResourceUtilities.newTestOutputFile("SlideTableOutput.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("SlideTableOutput.odp"));
+			Assert.assertEquals(slideTableCellValue, table.getCellByPosition(0, 0).getStringValue());
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testNewSlideTitle_subtitle() {
+		try {
+			//Creates an empty presentation document.
+			doc = PresentationDocument.newPresentationDocument();
+			
+			TableContainer container = doc.newSlide(0, "testlayout", Slide.SlideLayout.TITLE_SUBTITLE);
+			Table table = container.addTable();
+			table.setTableName("SlideTable");
+			String slideTableCellValue = " Cell[0,0]";
+			table.getCellByPosition(0, 0).setStringValue(slideTableCellValue);
+			String slideTableCellValue1 = " Cell[0,1]";
+			table.getCellByPosition(0, 1).setStringValue(slideTableCellValue1);
+			doc.save(ResourceUtilities.newTestOutputFile("slidetitlelayout.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("slidetitlelayout.odp"));
+			Slide slide = doc.getSlideByIndex(0);
+			Slide slide1 = doc.getSlideByName("testlayout");
+
+			//validate
+			Node nodetitle = slide1.getOdfElement().getFirstChild();
+			Assert.assertEquals("frame", nodetitle.getLocalName());
+			NamedNodeMap map = nodetitle.getAttributes();
+			Assert.assertEquals("layout", map.item(0).getNodeValue());
+			Assert.assertEquals("title", map.item(1).getNodeValue());
+			
+			//
+			Node nodetitle1 = slide1.getOdfElement().getFirstChild().getNextSibling();
+			Assert.assertEquals("frame", nodetitle1.getLocalName());
+			NamedNodeMap map1 = nodetitle1.getAttributes();
+			Assert.assertEquals("layout", map1.item(0).getNodeValue());
+			Assert.assertEquals("subtitle", map1.item(1).getNodeValue());
+			
+			if(slide.equals(slide1))
+				Assert.assertEquals(slide, slide1);
+
+			Assert.assertEquals(slideTableCellValue, table.getCellByPosition(0, 0).getStringValue());
+			Assert.assertEquals(slideTableCellValue1, table.getCellByPosition(0, 1).getStringValue());
+
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+	}
+	
+	
+	@Test
+	public void testNewSlideTitle_left_chart_right_outline() {
+		try {
+			doc = PresentationDocument.newPresentationDocument();
+			
+			Slide slidepre = doc.newSlide(0, "testlayout", Slide.SlideLayout.TITLE_LEFT_CHART_RIGHT_OUTLINE);
+			Textbox titleBox = slidepre.getTextboxByUsage(PresentationClass.TITLE).get(0);
+		    titleBox.setTextContent("This is the title");
+
+			Textbox outline = slidepre.getTextboxByUsage(PresentationClass.OUTLINE).get(0);
+		    List txtList = outline.addList();
+		    txtList.addItem("List Item1");
+		    txtList.addItem("List Item2");
+
+			doc.save(ResourceUtilities.newTestOutputFile("slidetitlelayout.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("slidetitlelayout.odp"));
+			Slide slide1 = doc.getSlideByName("testlayout");
+
+			//validate
+			Node nodetitle2 = slide1.getOdfElement().getFirstChild();
+			Assert.assertEquals("frame", nodetitle2.getLocalName());
+			NamedNodeMap map2 = nodetitle2.getAttributes();
+			Assert.assertEquals("layout", map2.item(0).getNodeValue());
+			Assert.assertEquals("title", map2.item(1).getNodeValue());
+			
+			Node nodetitle = slide1.getOdfElement().getFirstChild().getNextSibling();
+			Assert.assertEquals("frame", nodetitle.getLocalName());
+			NamedNodeMap map = nodetitle.getAttributes();
+			Assert.assertEquals("layout", map.item(0).getNodeValue());
+			Assert.assertEquals("chart", map.item(2).getNodeValue());
+			
+			Node nodetitle1 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle1.getLocalName());
+			NamedNodeMap map1 = nodetitle1.getAttributes();
+			Assert.assertEquals("layout", map1.item(0).getNodeValue());
+			Assert.assertEquals("outline", map1.item(1).getNodeValue());
+			
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testNewSlideTitle_plus_chart() {
+		try {
+			doc = PresentationDocument.newPresentationDocument();
+			Slide slidepre = doc.newSlide(0, "testlayout", Slide.SlideLayout.TITLE_PLUS_CHART);
+			Textbox titleBox = slidepre.getTextboxByUsage(PresentationClass.TITLE).get(0);
+		    titleBox.setTextContent("This is the Presentation title");
+		    //chart
+		    String title = "new Chart";
+			String[] lables = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data = new double[][] { { 1, 6, 3, 8 }, { 9, 1, 0, 5 }, { 3, 7, 8, 1 } };
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 3300;
+			rect.width = 21000;
+			rect.height = 12000;
+			Chart newChart = slidepre.createChart(title, lables, legends, data, rect);
+
+			doc.save(ResourceUtilities.newTestOutputFile("slidetitlelayout.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("slidetitlelayout.odp"));
+			Slide slide1 = doc.getSlideByName("testlayout");
+
+			//validate
+			Node nodetitle2 = slide1.getOdfElement().getFirstChild();
+			Assert.assertEquals("frame", nodetitle2.getLocalName());
+			NamedNodeMap map2 = nodetitle2.getAttributes();
+			Assert.assertEquals("layout", map2.item(0).getNodeValue());
+			Assert.assertEquals("title", map2.item(1).getNodeValue());
+			
+			Node nodetitle = slide1.getOdfElement().getFirstChild().getNextSibling();
+			Assert.assertEquals("frame", nodetitle.getLocalName());
+			NamedNodeMap map = nodetitle.getAttributes();
+			Assert.assertEquals("layout", map.item(0).getNodeValue());
+			Assert.assertEquals("chart", map.item(2).getNodeValue());
+			
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testNewSlideTitle_plus_2_chart() {
+		try {
+			doc = PresentationDocument.newPresentationDocument();
+			Slide slidepre = doc.newSlide(0, "testlayout", Slide.SlideLayout.TITLE_PLUS_2_CHART);
+			Textbox titleBox = slidepre.getTextboxByUsage(PresentationClass.TITLE).get(0);
+		    titleBox.setTextContent("This is the Presentation title");
+		    //chart1
+		    String title = "Chart one";
+			String[] lables = new String[] { "AAA", "XXX", "KKK" };
+			String[] legends = new String[] { "condition1", "condition2", "condition3" };
+			double[][] data = new double[][] { { 3, 3, 2 }, { 2, 1, 5 }, { 1, 4, 0 } };
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 3300;
+			rect.width = 22000;
+			rect.height = 8000;
+			//char2
+			String title1 = "Chart two";
+			String[] lables1 = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends1 = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data1 = new double[][] { { 1, 5, 3, 2 }, { 2, 1, 0, 5 }, { 3, 3, 4, 1 } };
+			Rectangle rect1 = new Rectangle();
+			rect1.x = 2000;
+			rect1.y = 11300;
+			rect1.width = 22000;
+			rect1.height = 8000;
+			Chart newChart = slidepre.createChart(title, lables, legends, data, rect);
+			Chart newChart1 = slidepre.createChart(title1, lables1, legends1, data1, rect1);
+
+			doc.save(ResourceUtilities.newTestOutputFile("slidetitlelayout.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("slidetitlelayout.odp"));
+			Slide slide1 = doc.getSlideByName("testlayout");
+
+			//validate
+			Node nodetitle2 = slide1.getOdfElement().getFirstChild();
+			Assert.assertEquals("frame", nodetitle2.getLocalName());
+			NamedNodeMap map2 = nodetitle2.getAttributes();
+			Assert.assertEquals("layout", map2.item(0).getNodeValue());
+			Assert.assertEquals("title", map2.item(1).getNodeValue());
+			
+			Node nodetitle = slide1.getOdfElement().getFirstChild().getNextSibling();
+			Assert.assertEquals("frame", nodetitle.getLocalName());
+			NamedNodeMap map = nodetitle.getAttributes();
+			Assert.assertEquals("layout", map.item(0).getNodeValue());
+			Assert.assertEquals("chart", map.item(2).getNodeValue());
+			
+			Node nodetitle1 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle1.getLocalName());
+			NamedNodeMap map1 = nodetitle1.getAttributes();
+			Assert.assertEquals("layout", map1.item(0).getNodeValue());
+			Assert.assertEquals("chart", map1.item(2).getNodeValue());
+			
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testNewSlideTitle_plus_3_object() {
+		try {
+			doc = PresentationDocument.newPresentationDocument();
+			Slide slidepre = doc.newSlide(0, "testlayout", Slide.SlideLayout.TITLE_PLUS_3_OBJECT);
+			Textbox titleBox = slidepre.getTextboxByUsage(PresentationClass.TITLE).get(0);
+		    titleBox.setTextContent("This is the Presentation title");
+		    //chart1
+		    String title = "Chart one";
+			String[] lables = new String[] { "AAA", "XXX", "KKK" };
+			String[] legends = new String[] { "condition1", "condition2", "condition3" };
+			double[][] data = new double[][] { { 3, 3, 2 }, { 2, 1, 5 }, { 1, 4, 0 } };
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 3300;
+			rect.width = 10000;
+			rect.height = 8000;
+			//char2
+			String title1 = "Chart two";
+			String[] lables1 = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends1 = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data1 = new double[][] { { 1, 5, 3, 2 }, { 2, 1, 0, 5 }, { 3, 3, 4, 1 } };
+			Rectangle rect1 = new Rectangle();
+			rect1.x = 2000;
+			rect1.y = 11300;
+			rect1.width = 10000;
+			rect1.height = 8000;
+			Chart newChart = slidepre.createChart(title, lables, legends, data, rect);
+			
+			Textbox outline = slidepre.getTextboxByUsage(PresentationClass.OUTLINE).get(0);
+		    List txtList = outline.addList();
+		    txtList.addItem("List Item1");
+		    txtList.addItem("List Item2");
+			
+			Chart newChart1 = slidepre.createChart(title1, lables1, legends1, data1, rect1);
+
+			doc.save(ResourceUtilities.newTestOutputFile("slidetitlelayout.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("slidetitlelayout.odp"));
+			Slide slide1 = doc.getSlideByName("testlayout");
+
+			//validate
+			Node nodetitle2 = slide1.getOdfElement().getFirstChild();
+			Assert.assertEquals("frame", nodetitle2.getLocalName());
+			NamedNodeMap map2 = nodetitle2.getAttributes();
+			Assert.assertEquals("layout", map2.item(0).getNodeValue());
+			Assert.assertEquals("title", map2.item(1).getNodeValue());
+			
+			Node nodetitle = slide1.getOdfElement().getFirstChild().getNextSibling();
+			Assert.assertEquals("frame", nodetitle.getLocalName());
+			NamedNodeMap map = nodetitle.getAttributes();
+			Assert.assertEquals("layout", map.item(0).getNodeValue());
+			Assert.assertEquals("chart", map.item(2).getNodeValue());
+			
+			Node nodetitle1 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle1.getLocalName());
+			NamedNodeMap map1 = nodetitle1.getAttributes();
+			Assert.assertEquals("layout", map1.item(0).getNodeValue());
+			Assert.assertEquals("outline", map1.item(1).getNodeValue());
+			
+			Node nodetitle3 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle3.getLocalName());
+			NamedNodeMap map3 = nodetitle3.getAttributes();
+			Assert.assertEquals("layout", map3.item(0).getNodeValue());
+			Assert.assertEquals("chart", map3.item(2).getNodeValue());
+			
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+	
+	@Test
+	public void testNewSlideTitle_plus_4_object() {
+		try {
+			doc = PresentationDocument.newPresentationDocument();
+			Slide slidepre = doc.newSlide(0, "testlayout", Slide.SlideLayout.TITLE_PLUS_4_OBJECT);
+			Textbox titleBox = slidepre.getTextboxByUsage(PresentationClass.TITLE).get(0);
+		    titleBox.setTextContent("This is the Presentation title");
+		    //chart1
+		    String title = "Chart one";
+			String[] lables = new String[] { "AAA", "XXX", "KKK" };
+			String[] legends = new String[] { "condition1", "condition2", "condition3" };
+			double[][] data = new double[][] { { 3, 3, 2 }, { 2, 1, 5 }, { 1, 4, 0 } };
+			Rectangle rect = new Rectangle();
+			rect.x = 2000;
+			rect.y = 2300;
+			rect.width = 5000;
+			rect.height = 6000;
+			//char2
+			String title1 = "Chart two";
+			String[] lables1 = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends1 = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data1 = new double[][] { { 1, 5, 3, 2 }, { 2, 1, 0, 5 }, { 3, 3, 4, 1 } };
+			Rectangle rect1 = new Rectangle();
+			rect1.x = 2000;
+			rect1.y = 11300;
+			rect1.width = 5000;
+			rect1.height = 6000;
+			//char3
+			String title2 = "Chart three";
+			String[] lables2 = new String[] { "Anna", "Daisy", "Tony", "MingFei" };
+			String[] legends2 = new String[] { "Day1", "Day2", "Day3" };
+			double[][] data2 = new double[][] { { 1, 5, 3, 2 }, { 2, 1, 0, 5 }, { 3, 3, 4, 1 } };
+			Rectangle rect2 = new Rectangle();
+			rect2.x = 2000;
+			rect2.y = 16300;
+			rect2.width = 5000;
+			rect2.height = 6000;
+			
+			Chart newChart = slidepre.createChart(title, lables, legends, data, rect);
+			Chart newChart1 = slidepre.createChart(title1, lables1, legends1, data1, rect1);
+			Textbox outline = slidepre.getTextboxByUsage(PresentationClass.OUTLINE).get(0);
+		    List txtList = outline.addList();
+		    txtList.addItem("List Item1");
+		    txtList.addItem("List Item2");
+		    Chart newChart2 = slidepre.createChart(title2, lables2, legends2, data2, rect2);
+			
+			doc.save(ResourceUtilities.newTestOutputFile("slidetitlelayout.odp"));
+			
+			//load 
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("slidetitlelayout.odp"));
+			Slide slide1 = doc.getSlideByName("testlayout");
+
+			//validate
+			Node nodetitle2 = slide1.getOdfElement().getFirstChild();
+			Assert.assertEquals("frame", nodetitle2.getLocalName());
+			NamedNodeMap map2 = nodetitle2.getAttributes();
+			Assert.assertEquals("layout", map2.item(0).getNodeValue());
+			Assert.assertEquals("title", map2.item(1).getNodeValue());
+			
+			Node nodetitle = slide1.getOdfElement().getFirstChild().getNextSibling();
+			Assert.assertEquals("frame", nodetitle.getLocalName());
+			NamedNodeMap map = nodetitle.getAttributes();
+			Assert.assertEquals("layout", map.item(0).getNodeValue());
+			Assert.assertEquals("chart", map.item(2).getNodeValue());
+			
+			Node nodetitle1 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle1.getLocalName());
+			NamedNodeMap map1 = nodetitle1.getAttributes();
+			Assert.assertEquals("layout", map1.item(0).getNodeValue());
+			Assert.assertEquals("outline", map1.item(1).getNodeValue());
+			
+			Node nodetitle3 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle3.getLocalName());
+			NamedNodeMap map3 = nodetitle3.getAttributes();
+			Assert.assertEquals("layout", map3.item(0).getNodeValue());
+			Assert.assertEquals("chart", map3.item(2).getNodeValue());
+			
+			Node nodetitle4 = slide1.getOdfElement().getFirstChild().getNextSibling().getNextSibling().getNextSibling().getNextSibling();
+			Assert.assertEquals("frame", nodetitle4.getLocalName());
+			NamedNodeMap map4 = nodetitle4.getAttributes();
+			Assert.assertEquals("layout", map4.item(0).getNodeValue());
+			Assert.assertEquals("chart", map4.item(2).getNodeValue());
+			
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/TableTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/TableTest.java
new file mode 100644
index 0000000..0e7294f
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/presentation/TableTest.java
@@ -0,0 +1,67 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.presentation;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.PresentationDocument;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class TableTest {
+	private static final Logger LOG = Logger.getLogger(TableTest.class.getName());
+	PresentationDocument doc;
+	final String TEST_PRESENTATION_FILE = "PresentationTableTest.odp";
+
+	@Test
+	public void testGetTable() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_PRESENTATION_FILE));
+			Table table = doc.getTableByName("table1");
+			Assert.assertNotNull(table);
+			String cellText = table.getCellByPosition(4, 1).getDisplayText();
+			Assert.assertEquals("11", cellText);
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testGetTableList() {
+		try {
+			doc = PresentationDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_PRESENTATION_FILE));
+			List<Table> tables = doc.getTableList();
+			Assert.assertEquals(3, tables.size());
+			for (Table table : tables) {
+				String cellText = table.getCellByPosition(4, 1).getDisplayText();
+				Assert.assertEquals("11", cellText);
+			}
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/BorderTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/BorderTest.java
new file mode 100644
index 0000000..cf65438
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/BorderTest.java
@@ -0,0 +1,236 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class BorderTest {
+
+	static final String filename = "testGetCellAt.ods";
+
+	@Test
+	public void testGetSetBorder() {
+		Border borderbase1 = new Border(new Color("#ff3333"), 5, SupportedLinearMeasure.PT);
+		Border borderbase2 = new Border(new Color("#0000ff"), 0.0154, 0.0008, 0.0008, SupportedLinearMeasure.IN);
+		Border borderbase3 = new Border(new Color("#ff3333"), 0.0362, 0.0008, 0.0008, SupportedLinearMeasure.IN);
+		Border borderbase4 = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			Cell cell1 = table.getCellByPosition("A8");
+			Border border1 = cell1.getBorder(CellBordersType.BOTTOM);
+			Border border11 = cell1.getBorder(CellBordersType.LEFT);
+			Assert.assertEquals(borderbase1, border1);
+			Assert.assertEquals(borderbase1, border11);
+
+			Cell cell2 = table.getCellByPosition("A10");
+			Border border2 = cell2.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(borderbase2, border2);
+			Border border3 = cell2.getBorder(CellBordersType.DIAGONALBLTR);
+			Assert.assertEquals(borderbase3, border3);
+
+			Cell cell3 = table.getCellByPosition("A12");
+			Border border4 = cell3.getBorder(CellBordersType.LEFT);
+			Border border41 = cell3.getBorder(CellBordersType.RIGHT);
+			Assert.assertEquals(borderbase4, border4);
+			Assert.assertEquals(borderbase4, border41);
+
+			Cell cell4 = table.getCellByPosition("B8");
+			cell4.setBorders(CellBordersType.ALL_FOUR, borderbase1);
+			Border border5 = cell4.getBorder(CellBordersType.BOTTOM);
+			Border border51 = cell4.getBorder(CellBordersType.LEFT);
+			Assert.assertEquals(borderbase1, border5);
+			Assert.assertEquals(borderbase1, border51);
+
+			Cell cell5 = table.getCellByPosition("B10");
+			cell5.setBorders(CellBordersType.TOP, borderbase2);
+			cell5.setBorders(CellBordersType.DIAGONALBLTR, borderbase3);
+			Assert.assertEquals(borderbase2, cell5.getBorder(CellBordersType.TOP));
+			Assert.assertEquals(borderbase3, cell5.getBorder(CellBordersType.DIAGONALBLTR));
+
+			Cell cell6 = table.getCellByPosition("B12");
+			cell6.setBorders(CellBordersType.LEFT_RIGHT, borderbase4);
+			Assert.assertEquals(borderbase4, cell6.getBorder(CellBordersType.LEFT));
+			Assert.assertEquals(borderbase4, cell6.getBorder(CellBordersType.RIGHT));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testSetWidth() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			//setWidth
+			borderbase.setWidth(0.056);
+			
+			Cell cell = table.getCellByPosition("A14");
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+
+			//verification
+			Border thisBorder = cell.getBorder(CellBordersType.LEFT);
+			thisBorder = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(0.056, thisBorder.getWidth());
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testSGetInnerLineWidth() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			//setWidth
+			borderbase.setInnerLineWidth(0.0156);
+			
+			Cell cell = table.getCellByPosition("A14");
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+
+			//verification
+			Border thisBorder = cell.getBorder(CellBordersType.LEFT);
+			thisBorder = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(0.0156, thisBorder.getInnerLineWidth());
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testSGetDistance() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			//setWidth
+		//	borderbase.setInnerLineWidth(0.0156);
+			borderbase.setDistance(0.123);
+			
+			Cell cell = table.getCellByPosition("A14");
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+
+			//verification
+			Border thisBorder = cell.getBorder(CellBordersType.LEFT);
+			thisBorder = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(0.123, thisBorder.getDistance());
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testSGetOuterLineWidth() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			
+			System.out.println(borderbase.getOuterLineWidth());
+			borderbase.setOuterLineWidth(0.125);
+			System.out.println(borderbase.getOuterLineWidth());			
+			
+			Cell cell = table.getCellByPosition("A14");
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+
+			//verification
+			Border thisBorder = cell.getBorder(CellBordersType.LEFT);
+			thisBorder = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(0.125, thisBorder.getOuterLineWidth());
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testSGetLinearMeasure() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			
+			borderbase.setLinearMeasure(StyleTypeDefinitions.SupportedLinearMeasure.CM);
+			
+			Cell cell = table.getCellByPosition("A14");
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+
+			//verification
+			Border thisBorder = cell.getBorder(CellBordersType.LEFT);
+			thisBorder = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(StyleTypeDefinitions.SupportedLinearMeasure.CM, thisBorder.getLinearMeasure());
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/FontTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/FontTest.java
new file mode 100644
index 0000000..da99d8e
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/FontTest.java
@@ -0,0 +1,348 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.Locale;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.TextLinePosition;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.CellStyleHandler;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class FontTest {
+
+	static final String filename = "testGetCellAt.ods";
+
+	@Test
+	public void testGetSetFont() {
+		Font font1Base = new Font("Arial", FontStyle.ITALIC, 10, Color.BLACK, TextLinePosition.THROUGH);
+		Font font2Base = new Font("'Times New Roman'", FontStyle.REGULAR, (float) 13.95, new Color("#ff3333"),
+				TextLinePosition.THROUGHUNDER);
+		Font font3Base = new Font("SimSun", FontStyle.BOLD, 8, Color.BLACK, TextLinePosition.REGULAR);
+		Font font4Base = new Font("Arial", FontStyle.REGULAR, 10, Color.BLACK, TextLinePosition.UNDER);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			Cell cell1 = table.getCellByPosition("A2");
+			CellStyleHandler handler1 = cell1.getStyleHandler();
+			Font font1 = handler1.getFont(Document.ScriptType.WESTERN);
+			Assert.assertEquals(font1Base, font1);
+
+			Cell cell2 = table.getCellByPosition("A3");
+			CellStyleHandler handler2 = cell2.getStyleHandler();
+			Font font2 = handler2.getFont(Document.ScriptType.WESTERN);
+			Assert.assertEquals(font2Base, font2);
+
+			Cell cell3 = table.getCellByPosition("A4");
+			CellStyleHandler handler3 = cell3.getStyleHandler();
+			Font font3 = handler3.getFont(Document.ScriptType.CJK);
+			Assert.assertEquals(font3Base, font3);
+			Font font4 = handler3.getFont(Document.ScriptType.WESTERN);
+			Assert.assertEquals(font4Base, font4);
+
+			Cell cell5 = table.getCellByPosition("B2");
+			cell5.getStyleHandler().setFont(font1Base);
+			cell5.setStringValue("Arial Italic black 10");
+			Assert.assertEquals(font1Base, cell5.getStyleHandler().getFont(Document.ScriptType.WESTERN));
+
+			Cell cell6 = table.getCellByPosition("B3");
+			// font2Base.setLocale();
+			cell6.getStyleHandler()
+					.setFont(font2Base, new Locale(Locale.ENGLISH.getLanguage(), Locale.US.getCountry()));
+			cell6.setStringValue("Times New Roman, Regular, 13.9, Red");
+			Assert.assertEquals(font2Base, cell6.getStyleHandler().getFont(Document.ScriptType.WESTERN));
+
+			Cell cell7 = table.getCellByPosition("B4");
+			cell7.getStyleHandler().setFont(font3Base,
+					new Locale(Locale.CHINESE.getLanguage(), Locale.CHINA.getCountry()));
+			cell7.getStyleHandler()
+					.setFont(font4Base, new Locale(Locale.ENGLISH.getLanguage(), Locale.US.getCountry()));
+			cell7.setStringValue("SimSun BOLD 8 BLACK");
+			Assert.assertEquals(font3Base, cell7.getStyleHandler().getFont(Document.ScriptType.CJK));
+			Assert.assertEquals(font4Base, cell7.getStyleHandler().getFont(Document.ScriptType.WESTERN));
+
+			doc.save(ResourceUtilities.newTestOutputFile("testFontOutput.ods"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetFontInODT() throws Exception {
+		TextDocument doc = TextDocument.newTextDocument();
+		Table table = Table.newTable(doc);
+		Font font = table.getCellByPosition(0, 0).getFont();
+		Assert.assertNotNull(font);
+	}
+
+	// public StyleTypeDefinitions.SimpleFontStyle getFontStyle(
+	// Document.ScriptType type);
+	//
+	// public void setFontStyle(StyleTypeDefinitions.SimpleFontStyle style);
+	//
+	// public void setFontStyle(StyleTypeDefinitions.SimpleFontStyle style,
+	// Document.ScriptType type);
+	//
+	// public int getFontSizeInPoint();
+	//
+	// public int getFontSizeInPoint(Document.ScriptType type);
+	//
+	// public void setFontSizeInPoint(int size);
+	//
+	// public void setFontSizeInPoint(int size, Document.ScriptType type);
+	//
+	// public String getLanguage();
+	//
+	// public String getLanguage(Document.ScriptType type);
+	//
+	// public void setLanguage(String language);
+	//
+	// public void setLanguage(String language, Document.ScriptType type);
+	//
+	// public String getCountry();
+	//
+	// public String getCountry(Document.ScriptType type);
+	//
+	// public void setCountry(String country);
+	//
+	// public void setCountry(String country, Document.ScriptType type);
+	//
+	// public Color getFontColor();
+	//
+	// public void setFontColor(Color fontColor);
+	//
+	// public String getFontName();
+	//
+	// public String getFontName(Document.ScriptType type);
+	//
+	// public void setFontName(String fontName);
+	//
+	// public void setFontName(String fontName, Document.ScriptType type);
+	//
+	// public Font getFont();
+	//
+	// public Font getFont(Document.ScriptType type);
+	//
+	// public void setFont(Font font);
+	//
+	// public String getFontFamilyName(Document.ScriptType type);
+	
+	@Test
+	public void testNewFont1() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("Hello world .");
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+			
+			//validate
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testFontOutput1.ods"));
+			Table table1 = doc.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			Font font1 = cell1.getFont();
+			Assert.assertEquals(font.getFamilyName(), font1.getFamilyName());
+			Assert.assertEquals(font.getSize(), font1.getSize());
+			Assert.assertEquals(font.getFontStyle(), font1.getFontStyle());
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testNewFont2() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.BLUE);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("Hello world .");
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+			
+			//validate
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testFontOutput1.ods"));
+			Table table1 = doc.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			Font font1 = cell1.getFont();
+			Assert.assertEquals(font.getFamilyName(), font1.getFamilyName());
+			Assert.assertEquals(font.getSize(), font1.getSize());
+			Assert.assertEquals(font.getFontStyle(), font1.getFontStyle());
+			Assert.assertEquals(font.getColor().toString(), font1.getColor().toString());
+			Assert.assertEquals(font, font1);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testNewFont3() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("Hi World.");
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+			
+			//validate
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testFontOutput1.ods"));
+			Table table1 = doc.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			Font font1 = cell1.getFont();
+			Assert.assertEquals(font.getFamilyName(), font1.getFamilyName());
+			Assert.assertEquals(font.getSize(), font1.getSize());
+			Assert.assertEquals(font.getFontStyle(), font1.getFontStyle());
+			Assert.assertEquals(font.getTextLinePosition(), font1.getTextLinePosition());
+		//	Assert.assertEquals(font, font1);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testNewFont4() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("Hi World.");
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+			
+			//validate
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testFontOutput1.ods"));
+			Table table1 = doc.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			Font font1 = cell1.getFont();
+			Assert.assertEquals(font.getFamilyName(), font1.getFamilyName());
+			Assert.assertEquals(font.getSize(), font1.getSize());
+			Assert.assertEquals(font.getFontStyle(), font1.getFontStyle());
+			Assert.assertEquals(font.getTextLinePosition(), font1.getTextLinePosition());
+			Assert.assertEquals(font.getColor().toString(), font1.getColor().toString());
+			Assert.assertEquals(font, font1);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testNewFont5() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("Hi World.");
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+			
+			//validate
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testFontOutput1.ods"));
+			Table table1 = doc.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			Font font1 = cell1.getFont();
+			Assert.assertEquals(font.getFamilyName(), font1.getFamilyName());
+			Assert.assertEquals(font.getSize(), font1.getSize());
+			Assert.assertEquals(font.getFontStyle(), font1.getFontStyle());
+			Assert.assertEquals(font.getTextLinePosition(), font1.getTextLinePosition());
+			Assert.assertEquals(font.getColor().toString(), font1.getColor().toString());
+			Assert.assertEquals(font, font1);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testEquals() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("Hi World.");
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+			
+			//validate
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testFontOutput1.ods"));
+			Table table1 = doc.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			Font font1 = cell1.getFont();
+			
+			Assert.assertTrue(font.equals(font1));
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/PageLayoutPropertiesTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/PageLayoutPropertiesTest.java
new file mode 100644
index 0000000..a0129ad
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/PageLayoutPropertiesTest.java
@@ -0,0 +1,192 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.odfdom.type.Percent;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.AdjustmentStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.LineStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.PrintOrientation;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.WritingMode;
+
+public class PageLayoutPropertiesTest {
+
+	@Test
+	public void testGetSetMargins() {
+
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setMargins(10, 20, 0, -5);
+			Assert.assertEquals(9.9996, master.getMarginTop());
+			Assert.assertEquals(19.9992, master.getMarginBottom());
+			Assert.assertEquals(0.0, master.getMarginLeft());
+			Assert.assertEquals(-5.0011, master.getMarginRight());
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+
+	@Test
+	public void testGetSetPageSize() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setPageWidth(100);
+			master.setPageHeight(300);
+			Assert.assertEquals(100.0009, master.getPageWidth());
+			Assert.assertEquals(300.0003, master.getPageHeight());
+
+			master.setPageWidth(0);
+			master.setPageHeight(-100);
+			Assert.assertEquals(0.0, master.getPageWidth());
+			Assert.assertEquals(-100.0009, master.getPageHeight());
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetNumFormat() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setNumberFormat(NumberFormat.HINDU_ARABIC_NUMBER.toString());
+			Assert.assertEquals(NumberFormat.HINDU_ARABIC_NUMBER.toString(),
+					master.getNumberFormat());
+			master.setNumberFormat("");
+			Assert.assertEquals("", master.getNumberFormat());
+			master.setNumberFormat(null);
+			Assert.assertNull(master.getNumberFormat());
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetWritingMode() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setWritingMode(WritingMode.LRTB);
+			Assert.assertEquals(WritingMode.LRTB.toString(), master
+					.getWritingMode());
+			master.setNumberFormat(null);
+			Assert.assertNull(master.getNumberFormat());
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetPrintOrientation() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setPrintOrientation(PrintOrientation.LANDSCAPE);
+			Assert.assertEquals(PrintOrientation.LANDSCAPE.toString(), master
+					.getPrintOrientation());
+			master.setPrintOrientation(null);
+			Assert.assertNull(master.getPrintOrientation());
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+	@Test
+	public void testGetSetMax() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setFootnoteMaxHeight(10);
+			Assert.assertEquals(9.9996, master
+					.getFootnoteMaxHeight());
+			master.setFootnoteMaxHeight(0);
+			Assert.assertEquals(0.0,master.getFootnoteMaxHeight());
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetFootnoteSep() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+			MasterPage master = MasterPage.getOrCreateMasterPage(newDoc,
+					"TestMaster");
+			master.setFootnoteSepProperties(AdjustmentStyle.CENTER, Color.AQUA,
+					10, 10, LineStyle.DASH_BOLD, Percent.valueOf("15%"), 10);
+			Assert.assertEquals(AdjustmentStyle.CENTER.toString(),master.getFootnoteSepAdjustment());
+			Assert.assertEquals(Color.AQUA.toString(), master.getFootnoteSepColor());
+			Assert.assertEquals(9.9996, master.getFootnoteSepDistanceAfterSep());
+			Assert.assertEquals(9.9996, master.getFootnoteSepDistanceBeforeSep());
+			Assert.assertEquals(LineStyle.DASH_BOLD.toString(), master.getFootnoteSepLineStyle());
+			Assert.assertEquals(0.15, master.getFootnoteSepWidth());
+			Assert.assertEquals(9.9996, master.getFootnoteSepThickness());
+			
+			master.setFootnoteSepProperties(null, null, 0, 0, null, null, 0);
+			Assert.assertEquals(AdjustmentStyle.LEFT.toString(),master.getFootnoteSepAdjustment());
+			Assert.assertNull(master.getFootnoteSepColor());
+			Assert.assertEquals(0.0,master.getFootnoteSepDistanceAfterSep());
+			Assert.assertEquals(0.0,master.getFootnoteSepDistanceBeforeSep());
+			Assert.assertEquals(LineStyle.NONE.toString(),master.getFootnoteSepLineStyle());
+			Assert.assertEquals(0.0, master.getFootnoteSepWidth());
+			Assert.assertEquals(0.0,master.getFootnoteSepThickness());
+			
+
+		} catch (Exception e) {
+			Logger.getLogger(PageLayoutPropertiesTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/ParagraphPropertiesTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/ParagraphPropertiesTest.java
new file mode 100644
index 0000000..2008f4f
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/ParagraphPropertiesTest.java
@@ -0,0 +1,63 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ParagraphPropertiesTest {
+	
+	private static final Logger LOGGER =  Logger.getLogger(ParagraphPropertiesTest.class.getName());
+	static final String filename = "testGetCellAt.ods";
+
+	@Test
+	public void testGetSetBorder() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph1 = doc.addParagraph("paragraph1");
+			
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.JUSTIFY);
+			HorizontalAlignmentType align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.JUSTIFY, align);
+
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.LEFT);
+			align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.LEFT, align);
+
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.RIGHT);
+			align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.RIGHT, align);
+
+			doc.save(ResourceUtilities.newTestOutputFile("TestParagraphPropertiesSetGetHoriAlignment.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/StyleTypeDefinitionsTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/StyleTypeDefinitionsTest.java
new file mode 100644
index 0000000..dd13285
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/StyleTypeDefinitionsTest.java
@@ -0,0 +1,441 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.TextDocument.OdfMediaType;
+import org.odftoolkit.simple.draw.FrameRectangle;
+import org.odftoolkit.simple.draw.FrameStyleHandler;
+import org.odftoolkit.simple.draw.Image;
+import org.odftoolkit.simple.draw.ImageTest;
+import org.odftoolkit.simple.draw.Textbox;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameHorizontalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FrameVerticalPosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalRelative;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalAlignmentType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalRelative;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+
+public class StyleTypeDefinitionsTest {
+	
+	private static final Logger LOGGER =  Logger.getLogger(StyleTypeDefinitionsTest.class.getName());
+	
+	@Test
+	public void testHorizontalAlignmentType() {
+		try {
+			
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph1 = doc.addParagraph("paragraph text");
+
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.DEFAULT);
+			HorizontalAlignmentType align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.DEFAULT, align);
+			
+			HorizontalAlignmentType filled = HorizontalAlignmentType.enumValueOf("filled");
+			String start = filled.getAlignmentString();
+			Assert.assertEquals("start", start);
+			Assert.assertEquals("filled", filled.toString());
+			Assert.assertEquals(HorizontalAlignmentType.FILLED, filled);
+			
+			HorizontalAlignmentType testnull = HorizontalAlignmentType.enumValueOf("");
+			Assert.assertEquals(null, testnull);
+			
+			try {
+				HorizontalAlignmentType testa = HorizontalAlignmentType.enumValueOf("aaaa");
+				Assert.assertEquals("Unsupported Horizontal Alignment Type!", testa);
+			} catch (Exception e) {
+				Assert.assertTrue(e instanceof RuntimeException);
+				Assert.assertEquals("Unsupported Horizontal Alignment Type!", e.getMessage());
+			}
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testHorizontalAlignmentType.odt"));
+			
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+
+	@Test
+	public void testVerticalAlignmentType() throws Exception{
+		try {
+			SpreadsheetDocument odsdoc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestSpreadsheetTable.ods"));
+		
+			int columnindex = 0, rowindex = 3;
+			Table table = odsdoc.getTableByName("Sheet1");
+			Cell fcell = table.getCellByPosition(columnindex, rowindex);
+	
+			System.out.println(fcell.getStringValue());
+			
+			StyleTypeDefinitions.VerticalAlignmentType align = fcell.getVerticalAlignmentType();
+			Assert.assertEquals(StyleTypeDefinitions.VerticalAlignmentType.TOP, align);
+			
+			VerticalAlignmentType vertType = VerticalAlignmentType.enumValueOf("top");
+			Assert.assertEquals(VerticalAlignmentType.TOP, vertType);
+			Assert.assertEquals("top", vertType.toString());
+			
+			VerticalAlignmentType testnull = VerticalAlignmentType.enumValueOf("");
+			Assert.assertEquals(null, testnull);
+			
+			try {
+				VerticalAlignmentType testa = VerticalAlignmentType.enumValueOf("aaaa");
+				Assert.assertEquals("Unsupported Vertical Alignment Type!", testa);
+			} catch (Exception e) {
+				Assert.assertTrue(e instanceof RuntimeException);
+				Assert.assertEquals("Unsupported Vertical Alignment Type!", e.getMessage());
+			}
+			
+			//save
+			//odsdoc.save(ResourceUtilities.newTestOutputFile("TestSpreadsheetTableOutput.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	@Test
+	public void testSupportedLinearMeasure() throws Exception{
+		try {
+			Border borderbase = new Border(Color.LIME, 4.0701, 1.0008, 1.0346, SupportedLinearMeasure.CM);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+
+			//verification
+			Border base = cell.getBorder(CellBordersType.LEFT);
+			base = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(borderbase, base);
+			
+			//
+			double ins = SupportedLinearMeasure.PT.toINs(216.00);
+			Assert.assertTrue(3.0 == ins);
+			double cms = SupportedLinearMeasure.PT.toCMs(566.93);
+			Assert.assertTrue(20.0 == cms);
+			double incms = SupportedLinearMeasure.IN.toCMs(11.0);
+			Assert.assertTrue(27.94 == incms);
+			
+			double cmins = SupportedLinearMeasure.CM.toINs(25.4);
+			Assert.assertTrue(10 == cmins);
+			double cmcms = SupportedLinearMeasure.CM.toCMs(11.0);
+			Assert.assertTrue(11.0 == cmcms);
+			
+			SupportedLinearMeasure suppMeasure = SupportedLinearMeasure.enumValueOf("pt");
+			Assert.assertEquals("pt", suppMeasure.toString());
+			SupportedLinearMeasure suppMeasure1 = SupportedLinearMeasure.enumValueOf("");
+			Assert.assertEquals(null, suppMeasure1);
+			try {
+				SupportedLinearMeasure.enumValueOf("aaa");
+			} catch (Exception e) {
+				Assert.assertTrue(e instanceof RuntimeException);
+				Assert.assertEquals("Unsupported Linear Measure!", e.getMessage());
+			}
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testCellBordersType() throws Exception{
+		try {
+			Border borderbase = new Border(Color.LIME, 4.0701, 1.0008, 1.0346, SupportedLinearMeasure.CM);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+
+			//verification
+			Border base = cell.getBorder(CellBordersType.LEFT);
+			base = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(borderbase, base);
+			
+			//
+			CellBordersType cellType = CellBordersType.enumValueOf("bottom");
+			Assert.assertEquals("bottom", cellType.toString());
+			CellBordersType cellType1 = CellBordersType.enumValueOf("");
+			Assert.assertEquals(null, cellType1);
+			try {
+				CellBordersType.enumValueOf("aaa");
+			} catch (Exception e) {
+				Assert.assertTrue(e instanceof RuntimeException);
+				Assert.assertEquals("Unsupported Cell Borders Type!", e.getMessage());
+			}
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testLineType() throws Exception{
+		try {
+			Border borderbase = new Border(Color.LIME, 1.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.SINGLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+			cell.setBorders(CellBordersType.TOP, borderbase);
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+
+			//verification
+			Border base = cell.getBorder(CellBordersType.LEFT);
+			base = cell.getBorder(CellBordersType.TOP);
+			Assert.assertEquals(borderbase, base);
+			Assert.assertEquals(StyleTypeDefinitions.LineType.SINGLE, borderbase.getLineStyle());
+			//
+			StyleTypeDefinitions.LineType lType = StyleTypeDefinitions.LineType.enumValueOf("double");
+			Assert.assertEquals("double", lType.toString());
+			StyleTypeDefinitions.LineType lType1 = StyleTypeDefinitions.LineType.enumValueOf("");
+			Assert.assertEquals("none", lType1.toString());
+			StyleTypeDefinitions.LineType lType2 = StyleTypeDefinitions.LineType.enumValueOf("aaaa");
+			Assert.assertEquals("none", lType2.toString());
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testAnchorType() throws Exception{
+	    String content = "XXXXX This is a text box XXXXX";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.CM);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.BLUE);
+			
+			textDoc.changeMode(OdfMediaType.TEXT_TEMPLATE);
+			frameStyleHandler.setAchorType(StyleTypeDefinitions.AnchorType.TO_PAGE);
+			
+			//validate
+			GraphicProperties graphicPropertiesForWrite = frameStyleHandler.getGraphicPropertiesForWrite();
+			Assert.assertEquals(VerticalRelative.PAGE, graphicPropertiesForWrite.getVerticalRelative());
+			Assert.assertEquals(FrameVerticalPosition.TOP, graphicPropertiesForWrite.getVerticalPosition());
+			Assert.assertEquals(HorizontalRelative.PAGE, graphicPropertiesForWrite.getHorizontalRelative());
+			Assert.assertEquals(FrameHorizontalPosition.CENTER, graphicPropertiesForWrite.getHorizontalPosition());
+
+			//
+			StyleTypeDefinitions.AnchorType anchorType = StyleTypeDefinitions.AnchorType.enumValueOf("");
+			Assert.assertEquals("page", anchorType.toString());
+			StyleTypeDefinitions.AnchorType anchorType1 = StyleTypeDefinitions.AnchorType.enumValueOf("char");
+			Assert.assertEquals(StyleTypeDefinitions.AnchorType.TO_CHARACTER, anchorType1);
+			StyleTypeDefinitions.AnchorType anchorType2 = StyleTypeDefinitions.AnchorType.enumValueOf("aaaa");
+			Assert.assertEquals(StyleTypeDefinitions.AnchorType.TO_PAGE, anchorType2);
+			
+			//save
+			textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(StyleTypeDefinitionsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+		
+	}
+	
+	
+	@Test
+	public void testVerticalRelative() throws Exception{
+	    String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.IN);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			frameStyleHandler.setVerticalRelative(VerticalRelative.PARAGRAPH);
+			
+			//validate
+			Assert.assertEquals(VerticalRelative.PARAGRAPH, frameStyleHandler.getVerticalRelative());
+			
+			//
+			StyleTypeDefinitions.VerticalRelative vert = StyleTypeDefinitions.VerticalRelative.enumValueOf("");
+			Assert.assertEquals("page", vert.toString());
+			StyleTypeDefinitions.VerticalRelative vert1 = StyleTypeDefinitions.VerticalRelative.enumValueOf("aaaa");
+			Assert.assertEquals("page", vert1.toString());
+			StyleTypeDefinitions.VerticalRelative vert2 = StyleTypeDefinitions.VerticalRelative.enumValueOf("frame");
+			Assert.assertEquals("frame", vert2.toString());
+			
+			//save
+			//textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+		    Logger.getLogger(StyleTypeDefinitionsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+		
+	}
+	
+	
+	@Test
+	public void testHorizontalRelative() throws Exception{
+	    String content = "This is a text box";
+		try {
+			TextDocument textDoc = TextDocument.newTextDocument();
+			Paragraph p = textDoc.addParagraph("paragraph");
+			FrameRectangle frameR = new FrameRectangle(4.21, 1.32, 4.41, 3.92, SupportedLinearMeasure.IN);
+			
+			Textbox box = p.addTextbox(frameR);
+			box.setName("tbox name");
+			box.setTextContent(content);
+			
+			FrameStyleHandler frameStyleHandler = new FrameStyleHandler(box);
+			frameStyleHandler.setBackgroundColor(Color.YELLOW);
+			frameStyleHandler.setHorizontalRelative(HorizontalRelative.PARAGRAPH);
+			
+			//validate
+			Assert.assertEquals(HorizontalRelative.PARAGRAPH, frameStyleHandler.getHorizontalRelative());
+			
+			//
+			HorizontalRelative hor = HorizontalRelative.enumValueOf("");
+			Assert.assertEquals("page", hor.toString());
+			
+			HorizontalRelative hor1 = HorizontalRelative.enumValueOf("paragraph");
+			Assert.assertEquals("paragraph", hor1.toString());
+			
+			HorizontalRelative hor2 = HorizontalRelative.enumValueOf("aaa");
+			Assert.assertEquals("page", hor2.toString());
+			
+			//save
+			//textDoc.save(ResourceUtilities.newTestOutputFile("textsample.odt"));
+
+		} catch (Exception e) {
+		    Logger.getLogger(StyleTypeDefinitionsTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+		
+	}
+	
+	
+	@Test
+	public void testFrameVerticalPosition() throws Exception{
+	    try {
+		// new image in a table
+		TextDocument sDoc = TextDocument.newTextDocument();
+		Table table1 = sDoc.addTable(2, 2);
+		Cell cell1 = table1.getCellByPosition(0, 0);
+		Image image3 = cell1.setImage(ResourceUtilities.getURI("image_list_item.png"));
+		image3.setVerticalPosition(FrameVerticalPosition.BELOW);
+		
+		//validate
+		Assert.assertEquals(FrameVerticalPosition.BELOW, image3.getVerticalPosition());
+		
+		//
+		FrameVerticalPosition ver = FrameVerticalPosition.enumValueOf("");
+		Assert.assertEquals("middle", ver.toString());
+		
+		FrameVerticalPosition ver1 = FrameVerticalPosition.enumValueOf("below");
+		Assert.assertEquals("below", ver1.toString());
+		
+		FrameVerticalPosition ver2 = FrameVerticalPosition.enumValueOf("aaaa");
+		Assert.assertEquals("middle", ver2.toString());
+		
+		//save
+		//sDoc.save(ResourceUtilities.newTestOutputFile("imges.odt"));
+
+	    } catch (Exception e) {
+		Logger.getLogger(StyleTypeDefinitionsTest.class.getName()).log(Level.SEVERE, null, e);
+		Assert.fail();
+	    }
+		
+	}
+	
+	
+	@Test
+	public void testFrameHorizontalPosition() {
+		try {
+			// new image in a table
+			TextDocument sDoc = TextDocument.newTextDocument();
+			Table table1 = sDoc.addTable(2, 2);
+			Cell cell1 = table1.getCellByPosition(0, 0);
+			Image image3 = cell1.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			image3.setHorizontalPosition(FrameHorizontalPosition.LEFT);
+			Assert.assertEquals(FrameHorizontalPosition.LEFT, image3.getHorizontalPosition());
+			
+			//
+			FrameHorizontalPosition hor = FrameHorizontalPosition.enumValueOf("");
+			Assert.assertEquals("center", hor.toString());
+			FrameHorizontalPosition hor1 = FrameHorizontalPosition.enumValueOf("inside");
+			Assert.assertEquals("inside", hor1.toString());
+			FrameHorizontalPosition hor2 = FrameHorizontalPosition.enumValueOf("aaaa");
+			Assert.assertEquals("center", hor2.toString());
+			
+			//save
+			sDoc.save(ResourceUtilities.newTestOutputFile("imges.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(ImageTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/TableCellPropertiesTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/TableCellPropertiesTest.java
new file mode 100644
index 0000000..e9035dd
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/TableCellPropertiesTest.java
@@ -0,0 +1,225 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.attribute.fo.FoBorderRightAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthBottomAttribute;
+import org.odftoolkit.odfdom.dom.attribute.style.StyleBorderLineWidthLeftAttribute;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class TableCellPropertiesTest {
+	
+	private static final Logger LOGGER =  Logger.getLogger(TableCellPropertiesTest.class.getName());
+	
+	@Test
+	public void testSetBorders() {
+		try {
+			
+		    Border borderbase = new Border(Color.LIME, 1.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.SINGLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+			cell.setBorders(CellBordersType.BOTTOM, borderbase);
+			cell.setBorders(CellBordersType.RIGHT, borderbase);
+			cell.setBorders(CellBordersType.DIAGONALTLBR, borderbase);
+
+			//verification
+			Border base = cell.getBorder(CellBordersType.BOTTOM);
+			base = cell.getBorder(CellBordersType.RIGHT);
+			base = cell.getBorder(CellBordersType.DIAGONALTLBR);
+			Assert.assertEquals(borderbase, base);
+			Assert.assertEquals(StyleTypeDefinitions.LineType.SINGLE, borderbase.getLineStyle());
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testSetBorders_NONE() {
+		try {
+			
+		    Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.SINGLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(0, 0);
+			//cell.setBorders(CellBordersType.DIAGONAL_LINES, borderbase);
+			cell.setBorders(CellBordersType.RIGHT, borderbase);
+
+			//validate
+			TableCellProperties styleCell = cell.getStyleHandler().getTableCellPropertiesForWrite();
+			NamedNodeMap attr = styleCell.mElement.getAttributes();
+			Node nod = attr.getNamedItem(FoBorderRightAttribute.ATTRIBUTE_NAME.getQName());
+			Assert.assertEquals("3.0701cm solid #00ff00", nod.getNodeValue());
+			
+			cell.setBorders(CellBordersType.NONE, borderbase);
+			
+			TableCellProperties styleCell1 = cell.getStyleHandler().getTableCellPropertiesForWrite();
+			NamedNodeMap attr1 = styleCell1.mElement.getAttributes();
+			Node nod1 = attr1.getNamedItem(FoBorderRightAttribute.ATTRIBUTE_NAME.getQName());
+			Assert.assertNull(nod1);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testSetBorders_DIAGONAL_LINES() {
+		try {
+			
+		    Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.SINGLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(0, 0);
+			cell.setBorders(CellBordersType.DIAGONAL_LINES, borderbase);
+
+			//validate
+			TableCellProperties styleCell = cell.getStyleHandler().getTableCellPropertiesForWrite();
+			NamedNodeMap attr = styleCell.mElement.getAttributes();
+			
+			Node nod = attr.getNamedItem("style:diagonal-bl-tr");
+			Assert.assertEquals("3.0701cm solid #00ff00", nod.getNodeValue());
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetBorder() {
+		try {
+			Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.SINGLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+			cell.setBorders(CellBordersType.ALL_FOUR, borderbase);
+
+			//validate
+			TableCellProperties styleCell = cell.getStyleHandler().getTableCellPropertiesForWrite();
+			Border bor = styleCell.getBorder();
+			Assert.assertEquals(borderbase, bor);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetLeftBorder() {
+		try {
+			Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.DOUBLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+			cell.setBorders(CellBordersType.RIGHT, borderbase);
+
+			//validate
+			TableCellProperties styleCell = cell.getStyleHandler().getTableCellPropertiesForWrite();
+			Border bor = styleCell.getRightBorder();
+			Assert.assertEquals(borderbase, bor);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+        @Test
+	public void testSettingNullBackgroundOnProperties() throws Exception {
+            SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+            Table table = doc.getTableByName("Sheet1");
+            Cell cell = table.getCellByPosition(1, 1);
+            cell.setCellBackgroundColor(Color.BLACK);
+            // setting null resets the element, see ODFTOOLKIT-326
+            cell.getStyleHandler().getTableCellPropertiesForWrite().setBackgroundColor(null);
+            Assert.assertNull(cell.getStyleHandler().getTableCellPropertiesForRead().getBackgroundColor());
+            // defaulting to white when color is null
+            Assert.assertEquals(Color.WHITE, cell.getCellBackgroundColor());
+            Cell newCell = table.appendRow().getCellByIndex(1);
+            Assert.assertNull(newCell.getStyleHandler().getTableCellPropertiesForRead().getBackgroundColor());
+            Assert.assertEquals(Color.WHITE, newCell.getCellBackgroundColor());
+        }
+        
+        @Test
+        public void testSettingBlackBackgroundOnProperties() throws Exception {
+            SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+            Table table = doc.getTableByName("Sheet1");
+            Cell cell = table.getCellByPosition(1, 1);
+            cell.setCellBackgroundColor(Color.BLUE);
+            cell.getStyleHandler().getTableCellPropertiesForWrite().setBackgroundColor(Color.BLACK);
+            Assert.assertEquals(Color.BLACK, cell.getStyleHandler().getTableCellPropertiesForRead().getBackgroundColor());
+            Assert.assertEquals(Color.BLACK, cell.getCellBackgroundColor());
+            Cell newCell = table.appendRow().getCellByIndex(1);
+            Assert.assertEquals(Color.BLACK, newCell.getStyleHandler().getBackgroundColor());
+        }
+        
+        @Test
+        public void testSettingNullBackgroundOnCell() throws Exception {
+            SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+            Table table = doc.getTableByName("Sheet1");
+            Cell cell = table.getCellByPosition(1, 1);
+            cell.setCellBackgroundColor((Color) null);
+            Assert.assertNull(cell.getStyleHandler().getTableCellPropertiesForRead().getBackgroundColor());
+            Assert.assertEquals(Color.WHITE, cell.getCellBackgroundColor());
+        }
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/TablePropertiesTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/TablePropertiesTest.java
new file mode 100644
index 0000000..9aa504c
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/TablePropertiesTest.java
@@ -0,0 +1,99 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.style;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class TablePropertiesTest {
+
+	private static final Logger LOGGER = Logger
+			.getLogger(TablePropertiesTest.class.getName());
+
+	@Test
+	public void testGetSetPageBreak() {
+		try {
+
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("This is the first paragraph.");
+			Table table = doc.addTable();
+			TableProperties writeProperties = table.getStyleHandler()
+					.getTablePropertiesForWrite();
+			TableProperties readProperties = table.getStyleHandler()
+					.getTablePropertiesForRead();
+
+			writeProperties.setBreak("before", "page");
+			Assert.assertEquals("page", readProperties.getBreakBefore());
+
+			// save
+			doc.save(ResourceUtilities
+					.newTestOutputFile("AAAA1.ods"));
+
+			writeProperties.setBreak("before", null);
+			Assert.assertEquals(null, readProperties.getBreakBefore());
+
+			writeProperties.setBreak(null, "page");
+			Assert.assertEquals(null, readProperties.getBreakBefore());
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetPageNumber() {
+		try {
+
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("This is the first paragraph.");
+			Table table = doc.addTable();
+			TableProperties writeProperties = table.getStyleHandler()
+					.getTablePropertiesForWrite();
+			TableProperties readProperties = table.getStyleHandler()
+					.getTablePropertiesForRead();
+
+			writeProperties.setBreak("before", "page");
+			Assert.assertEquals("page", readProperties.getBreakBefore());
+			writeProperties.setPageNumber(3);
+			Assert.assertEquals(3, readProperties.getPageNumber());
+
+			// save
+			doc.save(ResourceUtilities
+					.newTestOutputFile("AAAA2.ods"));
+
+			writeProperties.setPageNumber(0);
+			Assert.assertEquals(0, readProperties.getPageNumber());
+			writeProperties.setPageNumber(-2);
+			Assert.assertEquals(0, readProperties.getPageNumber());
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/style/TextPropertiesTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/style/TextPropertiesTest.java
new file mode 100644
index 0000000..6511400
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/style/TextPropertiesTest.java
@@ -0,0 +1,417 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.style;
+
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class TextPropertiesTest {
+	private static final Logger LOGGER =  Logger.getLogger(TextPropertiesTest.class.getName());
+	
+	@Test
+	public void testGetFontSizeInPoint() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFontSizeInPoint(3.32);
+			
+			//validate
+			Double fontInPoint = textProperties.getFontSizeInPoint();
+			Assert.assertEquals(3.32, fontInPoint);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput89.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetFontStyle() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.BOLDITALIC);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle = textProperties.getFontStyle();
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.BOLDITALIC, fontStyle);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.BOLD);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle1 = textProperties.getFontStyle();
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.BOLD, fontStyle1);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.ITALIC);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle2 = textProperties.getFontStyle();
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.ITALIC, fontStyle2);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.REGULAR);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle3 = textProperties.getFontStyle();
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.REGULAR, fontStyle3);
+			
+			//save
+			//document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetFontStyleParam() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.BOLDITALIC, Document.ScriptType.WESTERN);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle = textProperties.getFontStyle(Document.ScriptType.WESTERN);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.BOLDITALIC, fontStyle);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.BOLDITALIC, Document.ScriptType.CJK);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle1 = textProperties.getFontStyle(Document.ScriptType.CJK);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.BOLDITALIC, fontStyle1);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.ITALIC, Document.ScriptType.CJK);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle2 = textProperties.getFontStyle(Document.ScriptType.CJK);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.ITALIC, fontStyle2);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.REGULAR, Document.ScriptType.CJK);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle3 = textProperties.getFontStyle(Document.ScriptType.CJK);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.REGULAR, fontStyle3);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.BOLD, Document.ScriptType.CTL);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle4 = textProperties.getFontStyle(Document.ScriptType.CTL);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.BOLD, fontStyle4);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.ITALIC, Document.ScriptType.CTL);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle5 = textProperties.getFontStyle(Document.ScriptType.CTL);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.ITALIC, fontStyle5);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.BOLDITALIC, Document.ScriptType.CTL);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle6 = textProperties.getFontStyle(Document.ScriptType.CTL);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.BOLDITALIC, fontStyle6);
+			
+			textProperties.setFontStyle(StyleTypeDefinitions.FontStyle.REGULAR, Document.ScriptType.CTL);
+			//validate
+			StyleTypeDefinitions.FontStyle fontStyle7 = textProperties.getFontStyle(Document.ScriptType.CTL);
+			Assert.assertEquals(StyleTypeDefinitions.FontStyle.REGULAR, fontStyle7);
+			
+			//save
+			//document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	
+	@Test
+	public void testGetSetLanguage() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setLanguage("Chinese");
+			
+			//validate
+			String lan = textProperties.getLanguage();
+			Assert.assertEquals("Chinese", lan);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetSetLanguageParam() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setLanguage("Chinese", Document.ScriptType.CJK);
+			//validate
+			String lan = textProperties.getLanguage(Document.ScriptType.CJK);
+			Assert.assertEquals("Chinese", lan);
+			
+			textProperties.setLanguage("Chinese", Document.ScriptType.CTL);
+			//validate
+			String lan1 = textProperties.getLanguage(Document.ScriptType.CTL);
+			Assert.assertEquals("Chinese", lan1);
+			
+			textProperties.setLanguage(null, Document.ScriptType.CTL);
+			//validate
+			String lan2 = textProperties.getLanguage(Document.ScriptType.CTL);
+			Assert.assertEquals(null, lan2);
+			
+			textProperties.setLanguage(null, Document.ScriptType.WESTERN);
+			//validate
+			String lan3 = textProperties.getLanguage(Document.ScriptType.WESTERN);
+			Assert.assertEquals(null, lan3);
+			
+			textProperties.setLanguage(null, Document.ScriptType.CJK);
+			//validate
+			String lan4 = textProperties.getLanguage(Document.ScriptType.CJK);
+			Assert.assertEquals(null, lan4);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetCountry() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setCountry("china");
+			
+			//validate
+			String country = textProperties.getCountry();
+			Assert.assertEquals("china", country);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetCountryParam() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setCountry("china", Document.ScriptType.WESTERN);
+			
+			//validate
+			String country = textProperties.getCountry(Document.ScriptType.WESTERN);
+			Assert.assertEquals("china", country);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetColor() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFontColor(Color.GREEN);
+			
+			//validate
+			Color green = textProperties.getFontColor();
+			Assert.assertEquals(Color.GREEN.toString(), green.toString());
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetSetName() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFontName("fontname");
+			
+			//validate
+			String fontName = textProperties.getFontName();
+			Assert.assertEquals("fontname", fontName);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetSetNameParam() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFontName("fontname", Document.ScriptType.WESTERN);
+			
+			//validate
+			String fontName = textProperties.getFontName(Document.ScriptType.WESTERN);
+			Assert.assertEquals("fontname", fontName);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testSetFont() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			//cell.setFont(font);
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFont(font);
+			
+			//validate
+			Font font1 = textProperties.getFont();
+			Assert.assertEquals(font, font1);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testSetFontName() {
+		try {
+			SpreadsheetDocument document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = document.getTableByName("Sheet1");
+			Font font = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 17.5, Color.GREEN, StyleTypeDefinitions.TextLinePosition.REGULAR, Locale.ENGLISH);
+			Cell cell = table.getCellByPosition("A1");
+			//cell.setFont(font);
+			font.setFamilyName("Chinese");
+			cell.setStringValue("testGetFontStyle.");
+			
+			TextProperties textProperties = cell.getStyleHandler().getTextPropertiesForWrite();
+			textProperties.setFont(font);
+			
+			//validate
+			String fontname = textProperties.getFontName();
+			Assert.assertEquals("Chinese", fontname);
+			
+			//save
+			document.save(ResourceUtilities.newTestOutputFile("testFontOutput1.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/CellStyleHandlerTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/CellStyleHandlerTest.java
new file mode 100644
index 0000000..a84f333
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/CellStyleHandlerTest.java
@@ -0,0 +1,68 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class CellStyleHandlerTest {
+	
+	private static final String TEST_FILE_NAME = "CellStyleHandlerTest.odp";
+
+	@Test
+	public void testGetFont() {
+		try {
+			Document doc = Document.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_FILE_NAME));
+			Table table = doc.getTableByName("slideTable");
+			CellStyleHandler styleHandler = table.getCellByPosition(1, 1).getStyleHandler();
+			// NullPointerException should not be thrown even if no default text
+			// properties style exists.
+			styleHandler.getFont(Document.ScriptType.WESTERN);
+		} catch (Exception e) {
+			Logger.getLogger(CellStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetCountry() {
+		try {
+			Document doc = Document.loadDocument(ResourceUtilities.getTestResourceAsStream(TEST_FILE_NAME));
+			Table table = doc.getTableByName("slideTable");
+			CellStyleHandler styleHandler = table.getCellByPosition(1, 1).getStyleHandler();
+			
+			styleHandler.setCountry("English", Document.ScriptType.WESTERN);
+			//validate
+			String country = styleHandler.getCountry(Document.ScriptType.WESTERN);
+			Assert.assertEquals("English", country);
+			
+		} catch (Exception e) {
+			Logger.getLogger(CellStyleHandlerTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableBuilderTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableBuilderTest.java
new file mode 100644
index 0000000..663a8dd
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableBuilderTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2013 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.odftoolkit.simple.table;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ *
+ * @author Florian Hopf, fhopf@apache.org
+ */
+public class TableBuilderTest {
+    
+    @Test
+    public void testCreateTable() throws Exception {
+        TextDocument textDoc = TextDocument.newTextDocument();
+        TableBuilder tableBuilder = textDoc.getTableBuilder();
+        Table table = tableBuilder.newTable(4, 3, 2, 1);
+        assertEquals(4, table.getRowCount());
+        assertEquals(3, table.getColumnCount());
+        assertEquals(2, table.getHeaderRowCount());
+        assertEquals(1, table.getHeaderColumnCount());
+        assertNotNull(table.getCellByPosition(1, 1));
+    }
+    
+    @Test
+    public void testAppendRow() throws Exception {
+        TextDocument textDoc = TextDocument.newTextDocument();
+        TableBuilder tableBuilder = textDoc.getTableBuilder();
+        Table table = tableBuilder.newTable(4, 3, 2, 1);
+        assertEquals(4, table.getRowCount());
+        Row row = table.appendRow();
+        assertNotNull(row);
+        assertEquals(5, table.getRowCount());
+        assertNotNull(table.getCellByPosition(1, 1));
+    }
+    
+    @Test
+    public void test363() throws Exception {
+        TextDocument document = TextDocument.newTextDocument();
+        TableBuilder tableBuilder = document.getTableBuilder();
+        Table docBuiltTable1 = tableBuilder.newTable(2, 5, 1, 5);
+        assertNotNull(docBuiltTable1.getCellByPosition(1,1));
+        Table docBuiltTable2 = tableBuilder.newTable(1, 5, 1, 5);
+        docBuiltTable2.appendRow();
+        assertNotNull(docBuiltTable2.getCellByPosition(1,1));
+    }
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableCellRangeTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableCellRangeTest.java
new file mode 100644
index 0000000..7585c61
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableCellRangeTest.java
@@ -0,0 +1,244 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.table.TableCoveredTableCellElement;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.TextExtractor;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NodeList;
+
+public class TableCellRangeTest {
+
+	final String filename = "TestSpreadsheetTable";
+	final String odtfilename = "TestTextTable";
+	SpreadsheetDocument odsdoc;
+	TextDocument odtdoc;
+	Table odsTable, odtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			odsdoc = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename + ".ods"));
+			odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(odtfilename
+					+ ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testTextCellMerge() {
+		// get cell range, then merge
+		Table table1 = odtdoc.getTableByName("Table1");
+		// get the first two cell
+		CellRange cellRange = table1.getCellRangeByPosition(0, 0, 1, 0);
+		cellRange.merge();
+		Cell cell = cellRange.getCellByPosition(0, 0);
+		saveodt("MergeTwoCell");
+		Assert.assertEquals(cell.getDisplayText(), "cell1\ncell2");
+		try {
+			TextDocument saveddoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(odtfilename + "MergeTwoCell.odt"));
+			Table savedTable1 = saveddoc.getTableByName("Table1");
+			// get the cell range which the first cell is the covered cell.
+			// so the cell range will be enlarged
+			CellRange savedCellRange = savedTable1.getCellRangeByPosition(1, 0, 2, 0);
+			savedCellRange.merge();
+			Assert.assertTrue(savedCellRange.getColumnNumber() == 3);
+			Cell savedCell = savedCellRange.getCellByPosition(0, 0);
+			NodeList paraList = savedCell.getOdfElement().getChildNodes();
+			Assert.assertTrue(paraList.item(2) instanceof OdfTextParagraph);
+			Assert.assertEquals(TextExtractor.getText((OdfTextParagraph) paraList.item(2)), "0.00");
+			saveddoc.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeCoveredCell.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+
+		try {
+			TextDocument saveddoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(odtfilename + "MergeTwoCell.odt"));
+			Table savedTable1 = saveddoc.getTableByName("Table1");
+			// get the cell range which the first cell is the covered cell.
+			// so the cell range will be enlarged
+			CellRange savedCellRange = savedTable1.getCellRangeByPosition(0, 0, 0, 1);
+			savedCellRange.merge();
+			Assert.assertTrue(savedCellRange.getColumnNumber() == 2);
+			Assert.assertTrue(savedCellRange.getRowNumber() == 2);
+			Cell savedCell = savedCellRange.getCellByPosition(0, 1);
+			Assert.assertTrue(savedCell.getOdfElement() instanceof TableCoveredTableCellElement);
+			saveddoc.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeCoveredCell2.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	// ///////////////////////////////////////
+	// issue: removeColumnByIndex removeRowByIndex removeCellByIndex
+	@Test
+	public void testTextTableMerge() {
+		Table table1 = odtdoc.getTableByName("Table1");
+		// merge whole table
+		CellRange cellRange = table1
+				.getCellRangeByPosition(0, 0, table1.getColumnCount() - 1, table1.getRowCount() - 1);
+		cellRange.merge();
+		Assert.assertEquals(table1.getColumnCount(), 1);
+		Assert.assertEquals(table1.getRowCount(), 1);
+		saveodt("MergeTable");
+	}
+
+	@Test
+	public void testTextColumnMerge() {
+		// merge first column
+		Table table1 = odtdoc.getTableByName("Table1");
+		CellRange firstColumn = table1.getCellRangeByPosition(0, 0, 0, table1.getRowCount() - 1);
+		firstColumn.merge();
+		Cell cell = firstColumn.getCellByPosition(0, 2);
+		Cell firstCell = firstColumn.getCellByPosition(0, 0);
+		Assert.assertTrue(cell.getOwnerTableCell().equals(firstCell));
+		saveodt("MergeFirstColumn");
+		try {
+			TextDocument saveddoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(odtfilename + "MergeFirstColumn.odt"));
+			Table savedTable = saveddoc.getTableByName("Table1");
+			CellRange firstTwoColumn = savedTable.getCellRangeByPosition(0, 0, 1, savedTable.getRowCount() - 1);
+			firstTwoColumn.merge();
+			Cell cell1 = firstTwoColumn.getCellByPosition(0, 2);
+			Cell firstCell1 = firstTwoColumn.getCellByPosition(0, 0);
+			Assert.assertTrue(cell1.getOwnerTableCell().equals(firstCell1));
+			saveddoc.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeFirstTwoColumn.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testTextRowMerge() {
+		// merge first two row
+		Table table1 = odtdoc.getTableByName("Table1");
+		int rowCount = table1.getRowCount();
+		CellRange firstTwoRow = table1.getCellRangeByPosition(0, 0, table1.getColumnCount() - 1, 1);
+		firstTwoRow.merge();
+		Assert.assertTrue(rowCount == (table1.getRowCount() + 1));
+		saveodt("MergeFirstTwoRow");
+	}
+
+	@Test
+	public void testSpreadSheetMerge() {
+		// get cell range, set name
+		Table sheet1 = odsdoc.getTableByName("Sheet1");
+		CellRange cellRange = sheet1.getCellRangeByPosition(28, 0, 28, 5);
+		cellRange.setCellRangeName("test");
+		cellRange.merge();
+		CellRange cellRange1 = sheet1.getCellRangeByPosition("$E1", "$E6");
+		cellRange1.setCellRangeName("TimeCellRange");
+		cellRange1.merge();
+
+		saveods("CellRangeName");
+		try {
+			SpreadsheetDocument saveddos = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename + "CellRangeName.ods"));
+			Table savedSheet = saveddos.getTableByName("Sheet1");
+			CellRange namedCellRange = savedSheet.getCellRangeByName("TimeCellRange");
+			Cell cell = namedCellRange.getCellByPosition("A1");
+			Assert.assertTrue(cell.getRowSpannedNumber() == 6);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	@Test
+	public void testMergeExpandCellRange() {
+		try {
+			SpreadsheetDocument ods = SpreadsheetDocument.newSpreadsheetDocument();
+			// the doc contain the table which only have one column and one row
+			// element
+			Table table = ods.getTableByName("Sheet1");
+			int nCols = table.getColumnCount();
+			int nRows = table.getRowCount();
+			Assert.assertTrue(nCols == 1);
+			Assert.assertTrue(nRows == 1);
+			CellRange cellRange = table.getCellRangeByPosition("A1", "E1");
+			Cell cell = table.getCellByPosition("A1");
+			cell.setStringValue("Merge A1:E1");
+			cellRange.merge();
+			Table table2 = Table.newTable(ods, 1, 1);
+			table2.setTableName("Sheet2");
+			CellRange cellRange2 = table2.getCellRangeByPosition("A1", "F3");
+			Cell cell2 = table2.getCellByPosition("A1");
+			cell2.setStringValue("Merge A1:F3");
+			cellRange2.merge();
+			ods.save(ResourceUtilities.newTestOutputFile(filename + "MergeExpandCell.ods"));
+			table = ods.getTableByName("Sheet1");
+			Assert.assertTrue(table.getColumnCount() == 5);
+			Assert.assertTrue(table.getRowCount() == 1);
+			table = ods.getTableByName("Sheet2");
+			Assert.assertTrue(table.getColumnCount() == 6);
+			Assert.assertTrue(table.getRowCount() == 3);
+			TextDocument odt = TextDocument.newTextDocument();
+			Table swTable = Table.newTable(odt, 1, 5);
+			CellRange swCellRange = swTable.getCellRangeByPosition("A1", "E2");
+			Cell swCell = swTable.getCellByPosition("E2");
+			swCell.setStringValue("Merge A1:E2");
+			swCellRange.merge();
+			odt.save(ResourceUtilities.newTestOutputFile(odtfilename + "MergeTextExpandCell.odt"));
+			swTable = odt.getTableList().get(0);
+			Assert.assertTrue(swTable.getColumnCount() == 1);
+			Assert.assertTrue(swTable.getRowCount() == 1);
+		} catch (Exception ex) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+			Assert.fail("Failed with " + ex.getClass().getName() + ": '" + ex.getMessage() + "'");
+		}
+
+	}
+
+	private void saveods(String name) {
+		try {
+			odsdoc.save(ResourceUtilities.newTestOutputFile(filename + name + ".ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+
+	private void saveodt(String name) {
+		try {
+			odtdoc.save(ResourceUtilities.newTestOutputFile(odtfilename + name + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellRangeTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'");
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableCellTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableCellTest.java
new file mode 100644
index 0000000..97c0251
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableCellTest.java
@@ -0,0 +1,1605 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.awt.GraphicsEnvironment;
+import java.text.DecimalFormatSymbols;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfContentDom;
+import org.odftoolkit.odfdom.dom.attribute.office.OfficeValueTypeAttribute;
+import org.odftoolkit.odfdom.dom.element.draw.DrawFrameElement;
+import org.odftoolkit.odfdom.dom.element.style.StyleParagraphPropertiesElement;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
+import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.Border;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.CellBordersType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.TextLinePosition;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.VerticalAlignmentType;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.text.list.BulletDecorator;
+import org.odftoolkit.simple.text.list.ImageDecorator;
+import org.odftoolkit.simple.text.list.ListContainer;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.odftoolkit.simple.text.list.NumberDecorator;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.SupportedLinearMeasure;
+
+
+public class TableCellTest {
+
+	private static final Logger LOGGER =  Logger.getLogger(TableCellTest.class.getName());
+	final static String SAMPLE_SPREADSHEET = "TestSpreadsheetTable";
+	final static String SAMPLE_STYLE_SPREADSHEET = "TestSpreadsheetStyleTable";
+	final static String SAMPLE_TEXT = "TestTextTable";
+	static final String filename = "testGetCellAt.ods";
+	
+	SpreadsheetDocument odsdoc, odsstyle;
+	TextDocument odtdoc;
+	Table odsTable, odtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			odsdoc = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_SPREADSHEET + ".ods"));
+			odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(SAMPLE_TEXT
+					+ ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	private void saveods() {
+		try {
+			odsdoc.save(ResourceUtilities.newTestOutputFile(SAMPLE_SPREADSHEET + "Output.ods"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@Test
+	public void testGetIndexInRowColumn() {
+		int rowindex = 2, columnindex = 1;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell cell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertEquals(rowindex, cell.getRowIndex());
+		Assert.assertEquals(columnindex, cell.getColumnIndex());
+
+		odtdoc.getTableByName("Table3");
+		Cell cell1 = table.getCellByPosition(0, 1);
+		Assert.assertEquals(1, cell1.getRowIndex());
+		Assert.assertEquals(0, cell1.getColumnIndex());
+	}
+
+	@Test
+	public void testGetSetHoriAlignment() {
+		int rowindex = 3, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		HorizontalAlignmentType align = fcell.getHorizontalAlignmentType();
+		Assert.assertEquals(HorizontalAlignmentType.CENTER, align);
+
+		fcell.setHorizontalAlignment(HorizontalAlignmentType.DEFAULT);
+		HorizontalAlignmentType newAlign = fcell.getHorizontalAlignmentType();
+		Assert.assertEquals(HorizontalAlignmentType.DEFAULT, newAlign);
+
+		fcell.setHorizontalAlignment(HorizontalAlignmentType.LEFT);
+		align = fcell.getHorizontalAlignmentType();
+		Assert.assertEquals(HorizontalAlignmentType.LEFT, align);
+
+		// "left" and "right" should be mapped as "start" and "end".
+		fcell.setHorizontalAlignment(HorizontalAlignmentType.LEFT);
+		// get string
+		String aligns = fcell.getHorizontalAlignment();
+		Assert.assertEquals("start", aligns);
+		// get type
+		align = fcell.getHorizontalAlignmentType();
+		Assert.assertEquals(HorizontalAlignmentType.LEFT, align);
+		fcell.setHorizontalAlignment(HorizontalAlignmentType.RIGHT);
+		// get string
+		aligns = fcell.getHorizontalAlignment();
+		Assert.assertEquals("end", aligns);
+		// get type
+		align = fcell.getHorizontalAlignmentType();
+		Assert.assertEquals(HorizontalAlignmentType.RIGHT, align);
+		saveods();
+
+		SpreadsheetDocument ods;
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell = tbl.getCellByPosition(0, 0);
+			HorizontalAlignmentType horizonAlignment = cell.getHorizontalAlignmentType();
+			Assert.assertEquals(HorizontalAlignmentType.DEFAULT, horizonAlignment);
+
+			table = ods.getTableByName("Sheet2");
+			if (table != null) {
+				table.remove();
+			}
+			table = Table.newTable(ods);
+			table.setTableName("Sheet2");
+			cell = table.getCellByPosition(1, 1);
+			cell.setHorizontalAlignment(HorizontalAlignmentType.CENTER);
+			horizonAlignment = cell.getHorizontalAlignmentType();
+			Assert.assertEquals(HorizontalAlignmentType.CENTER, horizonAlignment);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetVertAlignment() {
+		int rowindex = 3, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		StyleTypeDefinitions.VerticalAlignmentType align = fcell.getVerticalAlignmentType();
+		Assert.assertEquals(StyleTypeDefinitions.VerticalAlignmentType.TOP, align);
+
+		fcell.setVerticalAlignment(VerticalAlignmentType.DEFAULT);
+		StyleTypeDefinitions.VerticalAlignmentType newAlign = fcell.getVerticalAlignmentType();
+		Assert.assertEquals(StyleTypeDefinitions.VerticalAlignmentType.DEFAULT, newAlign);
+
+		fcell.setVerticalAlignment(StyleTypeDefinitions.VerticalAlignmentType.BOTTOM);
+		align = fcell.getVerticalAlignmentType();
+		Assert.assertEquals(StyleTypeDefinitions.VerticalAlignmentType.BOTTOM, align);
+		saveods();
+		SpreadsheetDocument ods;
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell = tbl.getCellByPosition(0, 0);
+			StyleTypeDefinitions.VerticalAlignmentType verticalAlignment = cell.getVerticalAlignmentType();
+			Assert.assertEquals(StyleTypeDefinitions.VerticalAlignmentType.DEFAULT, verticalAlignment);
+
+			table = ods.getTableByName("Sheet2");
+			if (table != null) {
+				table.remove();
+			}
+			table = Table.newTable(ods);
+			table.setTableName("Sheet2");
+			cell = table.getCellByPosition(1, 1);
+			cell.setVerticalAlignment(StyleTypeDefinitions.VerticalAlignmentType.TOP);
+			verticalAlignment = cell.getVerticalAlignmentType();
+			Assert.assertEquals(StyleTypeDefinitions.VerticalAlignmentType.TOP, verticalAlignment);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetValueType() {
+		int rowindex = 3, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setValueType(null);
+		} catch (IllegalArgumentException ie) {
+			if ("type shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		fcell.setValueType("date");
+		String valueType = fcell.getValueType();
+		Assert.assertEquals("date", valueType);
+		saveods();
+
+		SpreadsheetDocument ods;
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell = tbl.getCellByPosition(0, 0);
+			valueType = cell.getValueType();
+			Assert.assertEquals(null, valueType);
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetWrapOption() {
+		int rowindex = 5, columnindex = 8;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		boolean wrap = fcell.isTextWrapped();
+		Assert.assertEquals(true, wrap);
+
+		fcell.setTextWrapped(false);
+		wrap = fcell.isTextWrapped();
+		Assert.assertEquals(false, wrap);
+		saveods();
+	}
+
+	@Test
+	public void testGetSetTextValue() {
+		int rowindex = 5, columnindex = 8;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		String text = fcell.getDisplayText();
+		Assert.assertEquals("this is a big cell with a big table", text);
+
+		fcell.setDisplayText("changed");
+		text = fcell.getDisplayText();
+		Assert.assertEquals("changed", text);
+		// reproduce bug 150.
+		fcell.setDisplayText(null);
+		text = fcell.getDisplayText();
+		Assert.assertEquals("", text);
+		fcell.setDisplayText(null, "automatic7777");
+		text = fcell.getDisplayText();
+		Assert.assertEquals("", text);
+		saveods();
+
+		Table table1 = odtdoc.getTableByName("Table1");
+		Cell fcell2 = table1.getCellByPosition(0, 1);
+		text = fcell2.getDisplayText();
+		Assert.assertEquals("Aa\nbb\ncc\ndd\nee", text);
+	}
+
+	@Test
+	public void testSetGetFormat() {
+		int rowindex = 3, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		fcell.setFormatString("#0.0");
+		String displayvalue = fcell.getDisplayText();
+		Assert.assertEquals("300" + (new DecimalFormatSymbols()).getDecimalSeparator() + "0", displayvalue);
+		String format = fcell.getFormatString();
+		Assert.assertEquals("#0.0", format);
+
+		Cell dcell = table.getCellByPosition(3, 2);
+		format = dcell.getFormatString();
+		Assert.assertEquals("MMM d, yy", format);
+
+		dcell.setFormatString("yyyy-MM-dd");
+		displayvalue = dcell.getDisplayText();
+		Assert.assertEquals("2008-12-23", displayvalue);
+
+		Cell pcell = table.getCellByPosition("B2");
+		format = pcell.getFormatString();
+		Assert.assertEquals("#0%", format);
+
+		pcell.setFormatString("#0.00%");
+		displayvalue = pcell.getDisplayText();
+		Assert.assertEquals("200" + (new DecimalFormatSymbols()).getDecimalSeparator() + "00%", displayvalue);
+		try {
+			Row tablerow = table.getRowByIndex(6);
+			Cell cell = tablerow.getCellByIndex(3);
+			Calendar currenttime = Calendar.getInstance();
+			cell.setDateValue(currenttime);
+			cell.setFormatString("yyyy-MM-dd");
+			tablerow = table.getRowByIndex(7);
+			cell = tablerow.getCellByIndex(3);
+			cell.setTimeValue(currenttime);
+			cell.setFormatString("HH:mm:ss");
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		saveods();
+
+		// test value type adapt function.
+		SpreadsheetDocument ods;
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setDoubleValue(new Double(i));
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=sum(A1:A10)");
+			// contains '#' should be adapted as float.
+			cell.setFormatString("#,###");
+			Assert.assertEquals("float", cell.getValueType());
+			cell = tbl.getCellByPosition("A12");
+			cell.setFormula("=sum(A1:A10)");
+			// contains '0' should be adapted as float.
+			cell.setFormatString("0.00");
+			Assert.assertEquals("float", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setPercentageValue(0.1);
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=sum(A1:A10)");
+			// contains '%'should be adapted as percentage.
+			cell.setFormatString("###.0%");
+			Assert.assertEquals("percentage", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setDateValue(Calendar.getInstance());
+				cell.setFormatString("yyyy.MM.dd");
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=max(A1:A10)");
+			// contains 'y' 'M' 'd' should be adapted as date.
+			cell.setFormatString("yyyy.MM.dd");
+			Assert.assertEquals("date", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell;
+			for (int i = 1; i <= 10; i++) {
+				cell = tbl.getCellByPosition("A" + i);
+				cell.setTimeValue(Calendar.getInstance());
+				cell.setFormatString("yyyy.MM.dd HH:mm:ss");
+			}
+			cell = tbl.getCellByPosition("A11");
+			cell.setFormula("=max(A1:A10)");
+			// contains 'H' 'm' 's' should be adapted as time.
+			cell.setFormatString("yyyy.MM.dd HH:mm:ss");
+			Assert.assertEquals("time", cell.getValueType());
+			cell = tbl.getCellByPosition("A12");
+			cell.setFormula("=max(A1:A10)");
+			// contains 'H' 'm' 's' should be adapted as time.
+			cell.setFormatString("HH:mm:ss");
+			Assert.assertEquals("time", cell.getValueType());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void loadOutputSpreadsheet() {
+		try {
+			odsdoc = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_SPREADSHEET + "Output.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@Test
+	public void testGetSetCellBackgroundColor() throws Exception {
+		int rowindex = 2, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setCellBackgroundColor(new Color("#ffffff"));
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set color as DEFAULT_BACKGROUND_COLOR #FFFFFF
+		Assert.assertEquals("#ffffff", fcell.getCellBackgroundColor().toString());
+
+		Color expectedColor = Color.valueOf("#000000");
+		fcell.setCellBackgroundColor(expectedColor);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expectedColor.toString(), fcell.getCellBackgroundColor().toString());
+
+		SpreadsheetDocument ods;
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			Cell cell = tbl.getCellByPosition(0, 0);
+			Color actualBackColor = cell.getCellBackgroundColor();
+			Assert.assertEquals("#ffffff", actualBackColor.toString());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetColumnSpannedNumber() throws Exception {
+		int rowindex = 2, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setColumnSpannedNumber(-2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set column spanned number as DEFAULT_COLUMN_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnSpannedNumber());
+
+		fcell.setColumnSpannedNumber(0);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set column spanned number as DEFAULT_COLUMN_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnSpannedNumber());
+
+		fcell.setColumnSpannedNumber(2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(2, fcell.getColumnSpannedNumber());
+	}
+
+	@Test
+	public void testGetSetRowSpannedNumber() throws Exception {
+		int rowindex = 2, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setRowSpannedNumber(-2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set row spanned number as DEFAULT_ROW_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getRowSpannedNumber());
+
+		fcell.setRowSpannedNumber(0);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set row spanned number as DEFAULT_ROW_SPANNED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getRowSpannedNumber());
+
+		fcell.setRowSpannedNumber(2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(2, fcell.getRowSpannedNumber());
+
+	}
+
+	@Test
+	public void testGetSetColumnsRepeatedNumber() throws Exception {
+		int rowindex = 3, columnindex = 1;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setColumnsRepeatedNumber(-2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set columns repeated number as DEFAULT_COLUMNS_REPEATED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnsRepeatedNumber());
+
+		fcell.setColumnsRepeatedNumber(0);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		// set columns repeated number as DEFAULT_COLUMNS_REPEATED_NUMBER 1.
+		Assert.assertEquals(1, fcell.getColumnsRepeatedNumber());
+
+		fcell.setColumnsRepeatedNumber(2);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(2, fcell.getColumnsRepeatedNumber());
+	}
+
+	@Test
+	public void testGetSetDateValue() {
+		int rowindex = 7, columnindex = 7;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setDateValue(null);
+		} catch (IllegalArgumentException ie) {
+			if ("date shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		Calendar expectedCalendar = new GregorianCalendar(2010, 1, 30);
+		fcell.setDateValue(expectedCalendar);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(0, fcell.getDateValue().compareTo(expectedCalendar));
+	}
+	
+	@Test
+	public void testDateTimeValue() {
+		int rowindex = 7, columnindex = 7;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		try {
+			fcell.setDateTimeValue(null);
+			Assert.fail("Null date time value should throw IllegalArgumentException");
+		} catch (IllegalArgumentException ie) {
+			Assert.assertEquals("date shouldn't be null.", ie.getMessage());
+		}
+
+		Calendar expectedCalendar = new GregorianCalendar(2010, 1, 30, 23, 12, 56);
+		fcell.setDateTimeValue(expectedCalendar);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expectedCalendar, fcell.getDateTimeValue());
+	}
+	
+
+        @Test
+        public void testGetFromEmptyDateValue() throws Exception {
+            Table table = odsdoc.getTableByName("Sheet1");
+            Cell cell = table.appendRow().getCellByIndex(1);
+            cell.setValueType(OfficeValueTypeAttribute.Value.DATE.toString());
+            Assert.assertNull(cell.getDateValue());
+        }
+        
+        @Test
+        public void testGetFromEmptyTimeValue() throws Exception {
+            Table table = odsdoc.getTableByName("Sheet1");
+            Cell cell = table.appendRow().getCellByIndex(1);
+            cell.setValueType(OfficeValueTypeAttribute.Value.TIME.toString());
+            Assert.assertNull(cell.getTimeValue());
+        }
+
+	@Test
+	public void testGetSetStringValue() {
+		int rowindex = 6, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setStringValue(null);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals("", fcell.getStringValue());
+
+		String expectedString = "hello world";
+		fcell.setStringValue(expectedString);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expectedString, fcell.getStringValue());
+	}
+
+	@Test
+	public void testGetSetBooleanValue() {
+		int rowindex = 5, columnindex = 5;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean expected = false;
+		fcell.setBooleanValue(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertFalse(fcell.getBooleanValue());
+	}
+
+	@Test
+	public void testGetSetCurrencyValue() {
+		int rowindex = 5, columnindex = 5;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setValueType("currency");
+		fcell.setCurrencyFormat("$", "#,##0.00");
+		Double actualValue = fcell.getCurrencyValue();
+		Assert.assertNull(actualValue);
+
+		double expected = 100.00;
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setCurrencyValue(expected, null);
+		} catch (IllegalArgumentException ie) {
+			if ("currency shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		fcell.setCurrencyValue(expected, "USD");
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getCurrencyValue());
+	}
+
+	@Test
+	public void testGetSetCurrencyDesc() {
+		int rowindex = 1, columnindex = 2;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setCurrencyCode(null);
+		} catch (IllegalArgumentException ie) {
+			if ("Currency code of cell should not be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		String expected = "USD";
+		fcell.setCurrencyCode(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getCurrencyCode());
+	}
+
+	@Test
+	public void testGetSetPercentageValue() {
+		int rowindex = 5, columnindex = 5;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		double expected = 56.98;
+		fcell.setPercentageValue(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getPercentageValue());
+	}
+
+	@Test
+	public void testGetSetTimeValue() {
+		int rowindex = 0, columnindex = 4;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setTimeValue(null);
+		} catch (IllegalArgumentException ie) {
+			if ("time shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		Calendar expected = Calendar.getInstance();
+		fcell.setTimeValue(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+
+		SimpleDateFormat simpleFormat = new SimpleDateFormat("'PT'HH'H'mm'M'ss'S'");
+		String expectedString = simpleFormat.format(expected.getTime());
+		String targetString = simpleFormat.format(fcell.getTimeValue().getTime());
+		Assert.assertEquals(expectedString, targetString);
+	}
+
+	@Test
+	public void testGetSetFormula() {
+		int rowindex = 1, columnindex = 10;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setFormula(null);
+		} catch (IllegalArgumentException ie) {
+			if ("formula shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		String expected = "of:=[.I2]*4";
+		fcell.setFormula(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getFormula());
+	}
+
+	/**
+	 * This test case is used to check whether the new created cell uses correct
+	 * style settings.</br> SIMPLE allows users to set if cell styles are
+	 * inherited or not whenever a new cell is added to the table. The default
+	 * setting is using inheritance. In this condition, the style of new column
+	 * is same with the last column before the inserted position, while the
+	 * style of new row is same with the last row before the inserted position.<br/>
+	 * This feature setting will influence <code>appendRow()</code>,
+	 * <code>appendColumn()</code>, <code>appendRows()</code>,
+	 * <code>appendColumns()</code>, <code>insertRowsBefore()</code> and
+	 * <code>insertColumnsBefore()</code>. In default setting condition, the
+	 * style name of new created cells after these methods called should be
+	 * "ce1" which is inherited from preceding cell. <br/>
+	 * But after setting cell style inheritance false, these new created cells'
+	 * style name should be "Default", which is not inherited from preceding
+	 * one.<br/>
+	 * For <code>getCellByPosition()</code>,
+	 * <code>getCellRangeByPosition()</code>, <code>getCellRangeByName()</code>,
+	 * <code>getRowByIndex()</code> and <code>getColumnByIndex()</code>, if need
+	 * automatically expand cells, it will return empty cell(s) without any
+	 * style settings. Inheritance setting have no effect on them, so for cells
+	 * which created after these methods are called, should have "Default" style
+	 * name.
+	 */
+	@Test
+	public void testGetStyleName() {
+		try {
+			odsstyle = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_STYLE_SPREADSHEET + ".ods"));
+			int rowindex = 1, columnindex = 0;
+			Table table = odsstyle.getTableByName("Sheet1");
+			Cell fcell = table.getCellByPosition(columnindex, rowindex);
+			String expected = "ce1";
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// the default setting is inherited, so for new row,
+			// the cell style name should be "ce1".
+			// test appendColumn
+			table.appendColumn();
+			int columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test appendRow
+			table.appendRow();
+			int rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test insertRowsBefore
+			table.insertRowsBefore(rowindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex, rowindex + 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test insertColumnsBefore
+			table.insertColumnsBefore(columnindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex + 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test appendColumns
+			table.appendColumns(2);
+			columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test appendRows
+			table.appendRows(2);
+			rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// for getCellByPosition the return cell style should be "Default".
+			fcell = table.getCellByPosition(table.getColumnCount() + 1, table.getRowCount() + 1);
+			Assert.assertEquals("Default", fcell.getStyleName());
+			odsstyle.close();
+
+			// change setting is not inherited, so for new row,
+			// the cell style name should be "Default".
+			odsstyle = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_STYLE_SPREADSHEET + ".ods"));
+			rowindex = 1;
+			columnindex = 0;
+			table = odsstyle.getTableByName("Sheet1");
+			table.setCellStyleInheritance(false);
+			expected = "Default";
+			table.appendColumn();
+			columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test appendRow
+			table.appendRow();
+			rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test insertRowsBefore
+			table.insertRowsBefore(rowindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex, rowindex + 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test insertColumnsBefore
+			table.insertColumnsBefore(columnindex + 1, 1);
+			fcell = table.getCellByPosition(columnindex + 1, rowindex);
+			// Assert.assertEquals(expected, fcell.getStyleName());
+			// test appendColumns
+			table.appendColumns(2);
+			columnCount = table.getColumnCount();
+			fcell = table.getCellByPosition(columnCount - 1, rowindex);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// test appendRows
+			table.appendRows(2);
+			rowCount = table.getRowCount();
+			fcell = table.getCellByPosition(columnindex, rowCount - 1);
+			Assert.assertEquals(expected, fcell.getStyleName());
+			// for getCellByPosition the return cell style should be "Default".
+			fcell = table.getCellByPosition(table.getColumnCount(), table.getRowCount());
+			Assert.assertEquals("Default", fcell.getStyleName());
+			odsstyle.close();
+		} catch (Exception e) {
+			Assert.fail(e.toString());
+		}
+	}
+
+	@Test
+	public void testGetTableColumn() {
+		int rowindex = 2, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertNotNull(fcell.getTableColumn());
+		Assert.assertEquals(columnindex, fcell.getTableColumn().getColumnIndex());
+	}
+
+	@Test
+	public void testGetTableRow() {
+		int rowindex = 2, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertNotNull(fcell.getTableRow());
+		Assert.assertEquals(rowindex, fcell.getTableRow().getRowIndex());
+	}
+
+	@Test
+	public void testRemoveContent() {
+		int rowindex = 5, columnindex = 8;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		Assert.assertTrue(fcell.mCellElement.getChildNodes().getLength() > 0);
+		fcell.removeContent();
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(0, fcell.mCellElement.getChildNodes().getLength());
+	}
+
+	@Test
+	public void testRemoveTextContent() throws Exception {
+		int rowindex = 5, columnindex = 8;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+
+		// how to test?
+		fcell.removeContent();
+		Assert.assertEquals(0, fcell.mCellElement.getChildNodes().getLength());
+
+		fcell.setDisplayText("hello");
+		DrawFrameElement drawEle = new DrawFrameElement(odsdoc.getContentDom());
+		drawEle.newDrawImageElement();
+		fcell.mCellElement.appendChild(drawEle);
+
+		Assert.assertEquals(2, fcell.mCellElement.getChildNodes().getLength());
+
+		fcell.removeTextContent();
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(1, fcell.mCellElement.getChildNodes().getLength());
+	}
+
+	@Test
+	public void testGetSetDisplayText() {
+		int rowindex = 5, columnindex = 5;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		String expected = "display text";
+		fcell.setDisplayText(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getDisplayText());
+		// if the value type is "float", cell value need to be updated, too.
+		String cellAddress = "A4";
+		fcell = table.getCellByPosition(cellAddress);
+		expected = "400.0";
+		int expectedValue = 400;
+		fcell.setDisplayText(expected);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(cellAddress);
+		Assert.assertEquals(expected, fcell.getDisplayText());
+		Assert.assertEquals(expectedValue, fcell.getDoubleValue().intValue());
+	}
+
+	@Test
+	public void testGetSetFormatString() {
+		int rowindex = 3, columnindex = 0;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		boolean illegalArgumentFlag = false;
+		try {
+			fcell.setFormatString(null);
+		} catch (IllegalArgumentException ie) {
+			if ("formatStr shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		// float format string
+		String expected = "#0.0";
+		fcell.setFormatString(expected);
+		// date format string
+		// String expected="MMM d, yy";
+		// String expected="yyyy-MM-dd";
+
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expected, fcell.getFormatString());
+	}
+
+	@Test
+	public void testGetCurrencySymbol() {
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell cell1 = table.getCellByPosition("C2");
+		Assert.assertEquals("$", cell1.getCurrencySymbol());
+		Cell cell2 = table.getCellByPosition("C3");
+		Assert.assertEquals("CNY", cell2.getCurrencySymbol());
+	}
+
+	@Test
+	public void testGetSetCurrencyFormat() {
+		Table table = odsdoc.getTableByName("Sheet1");
+		String[] formats = { "$#,##0.00", "#,##0.00 CNY", "$#,##0.0" };
+
+		Cell cell = table.getCellByPosition("J1");
+		boolean illegalArgumentFlag = false;
+		try {
+			cell.setCurrencyFormat(null, formats[0]);
+		} catch (IllegalArgumentException ie) {
+			if ("currencySymbol shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		try {
+			cell.setCurrencyFormat("$", null);
+		} catch (IllegalArgumentException ie) {
+			if ("format shouldn't be null.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+
+		cell.setCurrencyValue(32.12, "USD");
+		cell.setCurrencyFormat("$", formats[0]);
+
+		cell = table.getCellByPosition("J2");
+		cell.setCurrencyValue(new Double(32), "CNY");
+		cell.setCurrencyFormat("CNY", formats[1]);
+
+		cell = table.getCellByPosition("J3");
+		cell.setCurrencyValue(-32.12, "USD");
+		cell.setCurrencyFormat("$", formats[2]);
+
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		for (int i = 1; i <= 3; i++) {
+			Cell newcell = table.getCellByPosition("J" + i);
+			Assert.assertEquals(formats[i - 1], newcell.getFormatString());
+		}
+	}
+
+	@Test
+	public void testSetDefaultCellStyle() {
+		SpreadsheetDocument outputDocument;
+		OdfContentDom contentDom; // the document object model for content.xml
+		// the office:automatic-styles element in content.xml
+		OdfOfficeAutomaticStyles contentAutoStyles;
+		OdfStyle style;
+		String noaaDateStyleName;
+		String noaaTempStyleName;
+
+		try {
+			outputDocument = SpreadsheetDocument.newSpreadsheetDocument();
+			contentDom = outputDocument.getContentDom();
+			contentAutoStyles = contentDom.getOrCreateAutomaticStyles();
+
+			OdfNumberDateStyle dateStyle = new OdfNumberDateStyle(contentDom, "yyyy-MM-dd", "numberDateStyle", null);
+			OdfNumberStyle numberStyle = new OdfNumberStyle(contentDom, "#0.00", "numberTemperatureStyle");
+
+			contentAutoStyles.appendChild(dateStyle);
+			contentAutoStyles.appendChild(numberStyle);
+
+			style = contentAutoStyles.newStyle(OdfStyleFamily.TableCell);
+			noaaDateStyleName = style.getStyleNameAttribute();
+			style.setStyleDataStyleNameAttribute("numberDateStyle");
+
+			// and for time cells
+			style = contentAutoStyles.newStyle(OdfStyleFamily.TableCell);
+			noaaTempStyleName = style.getStyleNameAttribute();
+			style.setStyleDataStyleNameAttribute("numberTemperatureStyle");
+			style.setProperty(StyleParagraphPropertiesElement.TextAlign, "end");
+
+			Table table = Table.newTable(outputDocument);
+			List<Column> columns = table.insertColumnsBefore(0, 3);
+			Column column = columns.get(0);
+			column.setDefaultCellStyle(contentAutoStyles.getStyle(noaaDateStyleName, OdfStyleFamily.TableCell));
+			Cell aCell = column.getCellByIndex(0);
+			aCell.setValueType("date");
+			String format = aCell.getFormatString();
+			Assert.assertEquals("yyyy-MM-dd", format);
+
+			List<Row> rows = table.insertRowsBefore(0, 1);
+			Row row = rows.get(0);
+			row.setDefaultCellStyle(contentAutoStyles.getStyle(noaaTempStyleName, OdfStyleFamily.TableCell));
+			Cell bCell = row.getCellByIndex(0);
+			bCell.setValueType("float");
+			String bformat = bCell.getFormatString();
+			Assert.assertEquals("#0.00", bformat);
+			Assert.assertEquals("end", bCell.getHorizontalAlignment());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testSetGetFont() {
+		try {
+			SpreadsheetDocument document;
+			document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table1 = document.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			cell1.setStringValue("abcdefg");
+			Font font1 = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 12, Color.BLACK,
+					StyleTypeDefinitions.TextLinePosition.THROUGH);
+			cell1.setFont(font1);
+			Font font11 = cell1.getFont();
+			System.out.println(font11);
+			if (!font11.equals(font1))
+				Assert.fail();
+
+			Cell cell2 = table1.getCellByPosition("A2");
+			cell2.setStringValue("redstring");
+			Font font2 = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 12, Color.RED,
+					StyleTypeDefinitions.TextLinePosition.UNDER);
+			cell2.setFont(font2);
+			Font font22 = cell2.getFont();
+			System.out.println(font22);
+			if (!font22.equals(font2))
+				Assert.fail();
+			document.save(ResourceUtilities.newTestOutputFile("TestSetGetFont.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testSetGetBorder() {
+		try {
+			SpreadsheetDocument document;
+			document = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table1 = document.getTableByName("Sheet1");
+			Cell cell1 = table1.getCellByPosition("A1");
+			cell1.setStringValue("four border");
+			Border border = new Border(Color.RED, 1, StyleTypeDefinitions.SupportedLinearMeasure.PT);
+			cell1.setBorders(CellBordersType.ALL_FOUR, border);
+			Border bottomBorder = cell1.getStyleHandler().getBorder(CellBordersType.BOTTOM);
+			Assert.assertEquals(border, bottomBorder);
+
+			Cell cell2 = table1.getCellByPosition("C2");
+			cell2.setStringValue("top bottom");
+			Border border2 = new Border(Color.BLUE, 5, 1, 2, StyleTypeDefinitions.SupportedLinearMeasure.PT);
+			cell2.setBorders(CellBordersType.TOP_BOTTOM, border2);
+			Border bottomBorder2 = cell2.getStyleHandler().getBorder(CellBordersType.BOTTOM);
+			Assert.assertEquals(border2, bottomBorder2);
+			Border bottomBorder22 = cell2.getStyleHandler().getBorder(CellBordersType.LEFT);
+			Assert.assertEquals(Border.NONE, bottomBorder22);
+			document.save(ResourceUtilities.newTestOutputFile("TestSetGetBorder.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testAddRemoveIterateList() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Table table = Table.newTable(doc, 3, 3);
+			ListDecorator bulletDecorator = new BulletDecorator(doc);
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+			ListDecorator imageDecorator = new ImageDecorator(doc, ResourceUtilities.getURI("image_list_item.png"));
+			String[] numberItemContents = { "number item 1", "number item 2", "number item 3" };
+
+			// add list.
+			ListContainer container = table.getCellByPosition(0, 0);
+			org.odftoolkit.simple.text.list.List bulletList = container.addList(bulletDecorator);
+			bulletList.addItems(numberItemContents);
+			container = table.getCellByPosition(1, 1);
+			org.odftoolkit.simple.text.list.List numberList = container.addList(numberDecorator);
+			numberList.addItems(numberItemContents);
+			container = table.getCellByPosition(2, 2);
+			org.odftoolkit.simple.text.list.List imageList = container.addList(imageDecorator);
+			imageList.addItems(numberItemContents);
+			// iterate list
+			Assert.assertTrue(container.getListIterator().hasNext());
+			// remove list
+			container.clearList();
+			Assert.assertFalse(container.getListIterator().hasNext());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	/**
+	 * This test case check whether getNoteText and setNoteText work as
+	 * expected. When test getNoteText, the cell note may be null, a text
+	 * paragraph with style or a text list. getNoteText extracts the text
+	 * content from them and return it as string. When test setNoteText, a text
+	 * paragraph will be created to show text content. text list and style is
+	 * not supported.
+	 */
+	@Test
+	public void testGetSetNoteText() throws Exception {
+		int rowindex = 10, columnindex = 12;
+		Table table = odsdoc.getTableByName("Sheet1");
+		Cell fcell = table.getCellByPosition(columnindex, rowindex);
+		String note = fcell.getNoteText();
+		Assert.assertNull(note);
+		// cell A16 contains a text paragraph without style.
+		fcell = table.getCellByPosition("A16");
+		Assert.assertEquals("note1 ", fcell.getNoteText());
+		// cell A16 contains a text paragraph with style.
+		fcell = table.getCellByPosition("A17");
+		Assert.assertEquals("note2 ", fcell.getNoteText());
+		// cell A16 contains a text list with style. all of the list items
+		// should be extracted.
+		fcell = table.getCellByPosition("A18");
+		Assert.assertEquals("note1note2note3", fcell.getNoteText());
+		String expectedNote = "note test";
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		fcell.setNoteText(expectedNote);
+		saveods();
+		// reload
+		loadOutputSpreadsheet();
+		table = odsdoc.getTableByName("Sheet1");
+		fcell = table.getCellByPosition(columnindex, rowindex);
+		Assert.assertEquals(expectedNote, fcell.getNoteText());
+	}
+
+	@Test
+	public void testGetSetImage() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Table table = Table.newTable(doc, 2, 2);
+			table.setTableName("ImageTable");
+			Cell cell = table.getCellByPosition(0, 0);
+			cell.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			doc.save(ResourceUtilities.newTestOutputFile("ImageCellTable.odt"));
+
+			// load the document again.
+			doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("ImageCellTable.odt"));
+			table = doc.getTableByName("ImageTable");
+			cell = table.getCellByPosition(0, 0);
+			// image height = 34 pixels.
+			Assert.assertEquals(34, cell.getBufferedImage().getHeight(null));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCellParagraph() {
+		String[] plainText = { "nospace", "one space", "two  spaces", "three   spaces", "   three leading spaces",
+				"three trailing spaces   ", "one\ttab", "two\t\ttabs", "\tleading tab", "trailing tab\t",
+				"mixed   \t   spaces and tabs", "line" + System.getProperty("line.separator") + "break" };
+
+		String[][] elementResult = { { "nospace" }, { "one space" }, { "two ", "*s1", "spaces" },
+				{ "three ", "*s2", "spaces" }, { " ", "*s2", "three leading spaces" },
+				{ "three trailing spaces ", "*s2" }, { "one", "*t", "tab" }, { "two", "*t", "*t", "tabs" },
+				{ "*t", "leading tab" }, { "trailing tab", "*t" },
+				{ "mixed ", "*s2", "*t", " ", "*s2", "spaces and tabs" }, { "line", "*n", "break" } };
+		try {
+			// test append paragraph
+			TextDocument doc = TextDocument.newTextDocument();
+			Table table = Table.newTable(doc, 2, 2);
+			Cell cell = table.getCellByPosition(0, 0);
+			for (int i = 0; i < plainText.length; i++) {
+				Paragraph para = cell.addParagraph(plainText[i]);
+				compareResults(para.getOdfElement(), plainText[i], elementResult[i]);
+			}
+
+			// test set paragraph content
+			cell = table.getCellByPosition(0, 1);
+			for (int i = 0; i < plainText.length; i++) {
+				Paragraph para = cell.addParagraph(plainText[i]);
+				compareResults(para.getOdfElement(), plainText[i], elementResult[i]);
+				String content = para.getTextContent();
+				Assert.assertEquals(plainText[i], content);
+			}
+
+			// test remove paragraph content
+			cell = table.getCellByPosition(1, 0);
+			for (int i = 0; i < plainText.length; i++) {
+				Paragraph para = cell.addParagraph(plainText[i]);
+				String content = para.getTextContent();
+				Assert.assertEquals(plainText[i], content);
+				para.removeTextContent();
+				content = para.getTextContent();
+				Assert.assertEquals("", content);
+			}
+
+			// test get paragraph by index
+			cell = table.getCellByPosition(1, 1);
+			Paragraph paragraph1 = cell.addParagraph("paragraph1");
+			Paragraph paragraphE = cell.addParagraph(null);
+			Paragraph paragraph2 = cell.addParagraph("p2");
+
+			Paragraph t1 = cell.getParagraphByIndex(0, false);
+			Assert.assertEquals(t1, paragraph1);
+			t1 = cell.getParagraphByIndex(2, false);
+			Assert.assertEquals(t1, paragraph2);
+			t1 = cell.getParagraphByIndex(1, true);
+			Assert.assertEquals(t1, paragraph2);
+			t1 = cell.getParagraphByReverseIndex(0, false);
+			Assert.assertEquals(t1, paragraph2);
+			t1 = cell.getParagraphByReverseIndex(2, false);
+			Assert.assertEquals(t1, paragraph1);
+			t1 = cell.getParagraphByReverseIndex(1, true);
+			Assert.assertEquals(t1, paragraph1);
+			doc.save(ResourceUtilities.newTestOutputFile("testCellParagraph.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testCellSizeOptimal() {
+		Font font1Base = new Font("Arial", FontStyle.REGULAR, 6, Color.GREEN, TextLinePosition.REGULAR);
+		Font font2Base = new Font("Times New Roman", FontStyle.REGULAR, 13, Color.RED, TextLinePosition.REGULAR);
+		Font font3Base = new Font("SimSun", FontStyle.REGULAR, 17, Color.BLUE, TextLinePosition.REGULAR);
+		try {
+			final SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			final Table table = doc.addTable();
+			final String contentStr = "This is a long text content.";
+			
+			// basically the default font is of Arial type, so assume the default family
+			final String nfFamilyName = "Arial";
+			
+			if (isFontAvailable(nfFamilyName)) {
+				checkCellWidth(table.getCellByPosition(0, 0), null, 44.0977, contentStr);
+			}
+			if (isFontAvailable(font1Base.getFamilyName())) {
+				checkCellWidth(table.getCellByPosition(1, 1), font1Base, 24.3424, contentStr);
+			}
+			if (isFontAvailable(font2Base.getFamilyName())) {
+				checkCellWidth(table.getCellByPosition(2, 2), font2Base, 49.7414, contentStr);
+			}
+			if (isFontAvailable(font3Base.getFamilyName())) {
+				checkCellWidth(table.getCellByPosition(3, 3), font3Base, 88.899, contentStr);
+			}
+			doc.save(ResourceUtilities.newTestOutputFile("testCellSizeOptimal.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private boolean isFontAvailable(String name) {
+		java.awt.Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
+		for (java.awt.Font font : fonts) {
+			if (font.getName().equalsIgnoreCase(name)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private void checkCellWidth(Cell cell, Font font, double expectedOptimalWidth, String contentStr) {
+		try {
+			if (font != null) {
+				cell.setFont(font);
+			}
+			cell.getTableColumn().setUseOptimalWidth(true);
+			cell.setStringValue(contentStr);
+			Assert.assertEquals(expectedOptimalWidth, cell.getTableColumn().getWidth());
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetValidityListAndInputHelpMessage() {
+		try {
+			int rowindex = 2, columnindex = 2;
+			Table table = odsdoc.getTableByName("Sheet2");
+			Cell fcell = table.getCellByPosition(columnindex, rowindex);
+			List<String> values = new ArrayList<String>(Arrays.asList("Mon", "Tue", "Wed", "Thu", "Fri"));
+			fcell.setValidityList(values);
+			fcell.setInputHelpMessage("Tip", "This cell only allows working days.");
+			fcell.setStringValue("Tue");
+			Assert.assertNotNull(fcell.getOdfElement().getTableContentValidationNameAttribute());
+			saveods();
+		} catch (Exception e) {
+			Logger.getLogger(TableCellTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void compareResults(Element element, String input, String[] output) {
+		int i;
+		int nSpaces;
+		int nSpacesInAttribute;
+		Node node = element.getFirstChild();
+		for (i = 0; i < output.length; i++) {
+			if (output[i].startsWith("*")) {
+				Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+				if (output[i].equals("*t")) {
+					Assert.assertEquals("tab", node.getLocalName());
+				} else if (output[i].equals("*n")) {
+					Assert.assertEquals("line-break", node.getLocalName());
+				} else {
+					nSpaces = Integer.parseInt(output[i].substring(2));
+					Assert.assertEquals(node.getLocalName(), "s");
+					nSpacesInAttribute = Integer.parseInt(((Element) node).getAttribute("text:c"));
+					Assert.assertEquals(nSpaces, nSpacesInAttribute);
+				}
+			} else {
+				Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+				Assert.assertEquals(output[i], node.getTextContent());
+			}
+			node = node.getNextSibling();
+		}
+		Assert.assertEquals(node, null);
+	}
+	
+	
+	@Test
+	public void testSetHorizontalAlignment() {
+		try {
+			Table table = odsdoc.getTableByName("Sheet1");
+			Cell cell1 = table.getCellByPosition("C2");
+			Assert.assertEquals("$", cell1.getCurrencySymbol());
+			String right = cell1.getHorizontalAlignment();
+			Assert.assertEquals(null, right);
+			/**
+			 *The parameter can be "center", "end", "justify", "left", "right", or 
+			 * "start". Actually, "left" will be interpreted as "start", while "right" 
+             * will be interpreted as "end". If argument is null, the explicit 
+             * horizontal alignment setting is removed. 
+			 */
+			cell1.setHorizontalAlignment("left");
+			
+			//validate
+			String left = cell1.getHorizontalAlignment();
+			Assert.assertEquals("start", left);
+			
+			//save
+			//odsdoc.save(ResourceUtilities.newTestOutputFile("testTableCell.ods"));
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testGetCountry() {
+		try {
+			Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.DOUBLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+
+			CellStyleHandler cellHandler = cell.getStyleHandler();
+			cellHandler.setCountry("English", Document.ScriptType.CJK);
+			//validate
+			String country = cellHandler.getCountry(Document.ScriptType.CJK);
+			Assert.assertEquals("English", country);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testGetLanguage() {
+		try {
+			Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.DOUBLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+
+			CellStyleHandler cellHandler = cell.getStyleHandler();
+			cellHandler.setLanguage("English", Document.ScriptType.WESTERN);
+			//validate
+			String language = cellHandler.getLanguage(Document.ScriptType.WESTERN);
+			System.out.println(language);
+			Assert.assertEquals("English", language);
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testSetColor() {
+		try {
+			Border borderbase = new Border(Color.LIME, 3.0701, 0.0208, 0.0346, SupportedLinearMeasure.CM);
+			borderbase.setLineStyle(StyleTypeDefinitions.LineType.DOUBLE);
+			SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = doc.getTableByName("Sheet1");
+			
+			Cell cell = table.getCellByPosition(2, 2);
+
+			CellStyleHandler cellHandler = cell.getStyleHandler();
+			cellHandler.setBackgroundColor(Color.RED);
+			//validate
+			Color red = cellHandler.getBackgroundColor();
+			Assert.assertEquals(Color.RED.toString(), red.toString());
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("testSupportedLinearMeasure.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+		
+	}
+	
+	
+	@Test
+	public void testSetBorder() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.IN);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			
+			borderbase.setLinearMeasure(StyleTypeDefinitions.SupportedLinearMeasure.CM);
+			
+			Cell cell = table.getCellByPosition("A14");
+			cell.setBorders(CellBordersType.LEFT, borderbase);
+			
+
+			CellStyleHandler cellHandler = cell.getStyleHandler();
+			Border border = cellHandler.getBorder(CellBordersType.LEFT);
+			Assert.assertEquals(borderbase, border);
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+		
+	}
+	
+	@Test
+	public void testIsTextWrapped() {
+		Border borderbase = new Border(new Color("#00ccff"), 0.0701, 0.0008, 0.0346, SupportedLinearMeasure.CM);
+		try {
+			SpreadsheetDocument doc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(filename));
+			Table table = doc.getTableByName("A");
+			Cell cell = table.getCellByPosition("A14");
+			cell.setStringValue("testIsTextWrapped.");
+			cell.setBorders(CellBordersType.ALL_FOUR, borderbase);
+
+			CellStyleHandler cellHandler = cell.getStyleHandler();
+			cellHandler.setTextWrapped(true);
+			Assert.assertTrue(cellHandler.isTextWrapped());
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testSetWidth.ods"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+		
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableRowColumnTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableRowColumnTest.java
new file mode 100644
index 0000000..1e31ccf
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableRowColumnTest.java
@@ -0,0 +1,383 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.element.table.TableTableRowElement;
+import org.odftoolkit.odfdom.dom.style.props.OdfTableColumnProperties;
+import org.odftoolkit.odfdom.incubator.doc.text.OdfTextParagraph;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.type.PositiveLength;
+import org.odftoolkit.odfdom.type.Length.Unit;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.navigation.TextNavigation;
+import org.odftoolkit.simple.common.navigation.TextSelection;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class TableRowColumnTest {
+
+	final String filename = "TestSpreadsheetTable";
+	final String odtfilename = "TestTextTable";
+	SpreadsheetDocument odsdoc;
+	TextDocument odtdoc;
+	Table odsTable, odtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			odsdoc = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(filename + ".ods"));
+			odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(odtfilename + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	@Test
+	public void testSetSize() {
+		Table table3 = odtdoc.getTableByName("Table3");
+		//change the table height to 1/2
+		for (int i = 0; i < table3.getRowCount(); i++) {
+			Row row = table3.getRowByIndex(i);
+			double oldHeight = row.getHeight() / 2;
+			row.setHeight(oldHeight, true);
+			double roundingFactor = 10000.0;
+			double inValue = Math.round(roundingFactor * oldHeight / Unit.INCH.unitInMillimiter()) / roundingFactor;
+			String sHeightIN = String.valueOf(inValue) + Unit.INCH.abbr();
+			double expectedHeight = PositiveLength.parseDouble(sHeightIN, Unit.MILLIMETER);
+			
+			row.setHeight(oldHeight, false);
+			Assert.assertEquals(expectedHeight, row.getHeight());
+		}
+
+		Table table1 = odtdoc.getTableByName("Table1");
+		//change the table width to 1/2
+		table1.setWidth(table1.getWidth() / 2);
+		for (int i = 0; i < table1.getColumnCount(); i++) {
+			Column column = table1.getColumnByIndex(i);
+			double oldWidth = column.getWidth() / 2;
+			column.setWidth(oldWidth);
+			double roundingFactor = 10000.0;
+			double inValue = Math.round(roundingFactor * oldWidth / Unit.INCH.unitInMillimiter()) / roundingFactor;
+			String sWidthIN = String.valueOf(inValue) + Unit.INCH.abbr();
+			double expectedWidth = PositiveLength.parseDouble(sWidthIN, Unit.MILLIMETER);
+			Assert.assertEquals(expectedWidth, column.getWidth());
+		}
+		saveodt("ChangeSize");
+	}
+
+	/**
+	 * The DecimalFormat will create the depicted "000,8571" with the comma as
+	 * separator if used in a German Locale.
+	 * 
+	 * Within org.odftoolkit.simple.table.Column.setWith(long) there is a
+	 * getWith() call which ultimately calls
+	 * org.odftoolkit.odfdom.type.Length.parseDouble(), where
+	 * Double.valueOf(String s) is used to transform the String into a Double.
+	 * This method uses "." as separator. Hence the Exception.
+	 */
+	@Test
+	public void testGetLocaleColumnWidth() {
+		Locale oldLocale = Locale.getDefault();
+		try {
+			Locale.setDefault(Locale.GERMAN);
+			Table table = Table.newTable(odtdoc, 30, 7);
+			table.setTableName("Table21");
+			table.getColumnByIndex(2).setWidth(50); // NumberFormatException
+			saveodt("LocalColumnWidth");
+		} catch (Exception e) {
+			Assert.fail(e.getMessage());
+		} finally {
+			Locale.setDefault(oldLocale);
+		}
+	}
+	
+	/**
+	 * When a repeated column without width is split up, no width attribute should be set.
+	 */
+	@Test
+	public void testSplitRepeatedColumns() {
+		// test original width is null or null value.
+		Table table5 = odtdoc.getTableByName("Table5");
+		//columns 0-2 original width are null.
+		table5.getColumnByIndex(0).splitRepeatedColumns();
+		String columnWidth = table5.getColumnByIndex(1).maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+		Assert.assertNull(columnWidth);
+		//columns 3-5 original width value are null.
+		table5.getColumnByIndex(3).splitRepeatedColumns();
+		columnWidth = table5.getColumnByIndex(4).maColumnElement.getProperty(OdfTableColumnProperties.ColumnWidth);
+		Assert.assertNull(columnWidth);
+		saveodt("SplitRepeatedColumns");
+	}
+
+	@Test
+	public void testGetPreviousNext() {
+		Table table2 = odtdoc.getTableByName("Table2");
+		Row row2 = table2.getRowByIndex(2);
+		Row row1 = table2.getRowByIndex(1);
+		Row row0 = table2.getRowByIndex(0);
+		Row lastRow = table2.getRowByIndex(table2.getRowCount() - 1);
+		Row preRow = row2.getPreviousRow();
+		Assert.assertTrue(preRow.equals(row1));
+		Assert.assertTrue(row0.getPreviousRow() == null);
+		Assert.assertEquals(row1.getNextRow(), row2);
+		Assert.assertTrue(lastRow.getNextRow() == null);
+
+		Table table1 = odtdoc.getTableByName("Table1");
+		Column column2 = table1.getColumnByIndex(2);
+		Column column1 = table1.getColumnByIndex(1);
+		Column column0 = table1.getColumnByIndex(0);
+		Column lastColumn = table1.getColumnByIndex(table1.getColumnCount() - 1);
+		Column preColumn = column2.getPreviousColumn();
+		Assert.assertTrue(column0.getPreviousColumn() == null);
+		Assert.assertTrue(preColumn.equals(column1));
+		Assert.assertEquals(column0.getNextColumn(), column1);
+		Assert.assertTrue(lastColumn.getNextColumn() == null);
+	}
+
+	@Test
+	public void testGetIndex() {
+		//this is used to test the method for setColumnRepeatedIndex
+		//merge the first two column, then the third column's index is 2
+		Table table3 = odtdoc.getTableByName("Table3");
+		Column column2OfT3 = table3.getColumnByIndex(2);
+		CellRange range = table3.getCellRangeByPosition(0, 0, 1, table3.getRowCount() - 1);
+		range.merge();
+		Assert.assertTrue(column2OfT3.getColumnIndex() == 1);
+		//insert two columns after the first column, then the next column's index add 2
+		table3.insertColumnsBefore(1, 2);
+		Assert.assertTrue(column2OfT3.getColumnIndex() == 3);
+		//append a row
+		Row newRow = table3.appendRow();
+		int index = newRow.getRowIndex();
+		Assert.assertTrue(index == (table3.getRowCount() - 1));
+		//remove two row
+//		table3.removeRowByIndex(0, 2);
+//		Assert.assertTrue(newRow.getRowIndex() == (index - 2));
+		//remove two colum
+		table3.removeColumnsByIndex(1, 2);
+		Assert.assertTrue(column2OfT3.getColumnIndex() == 1);
+
+		//insert two column in the repeated columns
+		Table table2 = odtdoc.getTableByName("Table2");
+		Column column1OfT2 = table2.getColumnByIndex(1);
+		List<Column> columns = table2.insertColumnsBefore(1, 2);
+		Assert.assertTrue(column1OfT2.getColumnIndex() == 3);
+		Assert.assertTrue(columns.get(0).getColumnIndex() == 1);
+		Assert.assertEquals(column1OfT2.getPreviousColumn(), columns.get(1));
+		Assert.assertEquals(column1OfT2.getNextColumn(), table2.getColumnByIndex(4));
+
+		//append two row in the repeated rows
+		Row row4OfT2 = table2.getRowByIndex(4);
+		Row row3OfT2 = table2.getRowByIndex(3);
+		List<Row> rows = table2.insertRowsBefore(4, 2);
+		Cell cell1 = rows.get(0).getCellByIndex(0);
+		cell1.setStringValue("cell1");
+		Cell cell2 = rows.get(1).getCellByIndex(0);
+		cell2.setStringValue("cell2");
+		Assert.assertTrue(row4OfT2.getRowIndex() == 6);
+		Assert.assertEquals(rows.get(0).getPreviousRow(), row3OfT2);
+		//remove a row, then the next row will decrease the index
+		table2.removeRowsByIndex(4, 1);
+		Assert.assertNull(rows.get(0).getOdfElement());
+		Assert.assertEquals(rows.get(1).getPreviousRow(), row3OfT2);
+		saveodt("ChangeIndex");
+	}
+
+	@Test
+	public void testCellGetRowIndex() {
+		Table table3 = odtdoc.getTableByName("Table3");
+		Cell cell = table3.getCellByPosition(0, 1);
+		Assert.assertTrue(cell.getRowIndex() == 1);
+		table3.removeRowsByIndex(0, 2);
+	}
+
+	@Test
+	public void testGetInstance() {
+		//get the text content contains "cell"
+		TextNavigation search = new TextNavigation("cell", odtdoc);
+		while (search.hasNext()) {
+			TextSelection item = (TextSelection) search.nextSelection();
+			OdfElement containerEle = item.getContainerElement();
+			if (containerEle instanceof OdfTextParagraph) {
+				Node ele = containerEle.getParentNode();
+				if (ele instanceof TableTableCellElement) {
+					Cell cell = Cell.getInstance((TableTableCellElementBase) ele);
+					Assert.assertTrue(cell.getStringValue().contains("cell"));
+					Assert.assertTrue(cell.getRowIndex() == 0);
+					ele = ele.getParentNode();
+					if (ele instanceof TableTableRowElement) {
+						Row row = Row.getInstance((TableTableRowElement) ele);
+						Assert.assertTrue(row == cell.getTableRow());
+					}
+				}
+			}
+		}
+	}
+
+	@Test
+	public void testTableColumnWidth() {
+		TextDocument textDocument = null;
+		try {
+			textDocument = TextDocument.newTextDocument();
+
+			textDocument.getParagraphByIndex(0, false).setTextContent(
+					"Above, table in header Standard (bug with getWidth, but the widths are good)");
+			Table table = textDocument.getHeader().addTable(1, 8);
+			long[] columnsWidth = new long[] { 5, 19, 11, 14, 27, 12, 75, 4 };
+			setColumnsWidth(table, columnsWidth);
+			textDocument.addParagraph(null);
+			textDocument.addParagraph(null);
+
+			textDocument.addParagraph("First table (columns width : demande / result)");
+			table = Table.newTable(textDocument, 1, 6);
+			columnsWidth = new long[] { 10, 15, 20, 25, 30, -1 };
+			setColumnsWidth(table, columnsWidth);
+
+			textDocument.addParagraph("Second table");
+			table = Table.newTable(textDocument, 1, 8);
+			columnsWidth = new long[] { 5, 19, 11, 14, 27, 12, 75, 4 };
+			setColumnsWidth(table, columnsWidth);
+
+			textDocument.addParagraph("Third table");
+			table = Table.newTable(textDocument, 1, 12);
+			columnsWidth = new long[] { 5, 8, 10, 11, 7, 7, 26, 12, 19, 19, 41, 3 };
+			setColumnsWidth(table, columnsWidth);
+
+			textDocument.addParagraph("fourth table (left space of 15mm and 10mm space right)");
+			table = Table.newTable(textDocument, 1, 12, 1.5, 1.0);
+			columnsWidth = new long[] { 5, 8, 10, 11, 7, 7, 11, 12, 9, 19, -1, 3 };
+			setColumnsWidth(table, columnsWidth);
+
+			textDocument.addParagraph("fifth table (space of -1 cm to the left and right space of -1.5cm)");
+			table = Table.newTable(textDocument, 1, 10, -1, -1.5);
+			columnsWidth = new long[] { 32, 8, 10, 11, 7, 7, 16, 12, -1, 18 };
+			setColumnsWidth(table, columnsWidth);
+
+			textDocument.addParagraph("sixth table (merging of columns 3-4, row 0, and other merging)");
+			table = Table.newTable(textDocument, 2, 8);
+			columnsWidth = new long[] { 5, 19, 11, 14, 27, 12, 75, 4 };
+			setColumnsWidth(table, columnsWidth);
+			CellRange vCellRange = table.getCellRangeByPosition(3, 0, 4, 0);
+			vCellRange.merge();
+			table.appendRows(2);
+			vCellRange = table.getCellRangeByPosition(4, 1, 5, 2);
+			vCellRange.merge();
+
+			textDocument.addParagraph("as above, but no merging");
+			table = Table.newTable(textDocument, 1, 8);
+			columnsWidth = new long[] { 5, 19, 11, 14, 27, 12, 75, 4 };
+			setColumnsWidth(table, columnsWidth);
+
+			textDocument.addParagraph("table with three columns width at 0");
+			table = Table.newTable(textDocument, 1, 12);
+			columnsWidth = new long[] { 0, 13, 10, 11, 0, 14, 26, 12, 19, 19, 47, 0 };
+			setColumnsWidth(table, columnsWidth);
+
+			table = Table.newTable(textDocument, 1, 3);
+			columnsWidth = new long[] { 100 };
+			setColumnsWidth(table, columnsWidth);
+			table.setVerticalMargin(0.25, 0.5);
+			textDocument.addParagraph("Above, other table with top space of 0.25cm and bottom spacin of 0.5cm");
+
+			textDocument.addParagraph(null);
+			textDocument.addParagraph(null);
+			textDocument.addParagraph("below, table in footer Standard (bug with getWidth, but the widths are good)");
+			table = textDocument.getFooter().addTable(1, 8);
+			columnsWidth = new long[] { 5, 19, 11, 14, 27, 12, 75, 4 };
+			setColumnsWidth(table, columnsWidth);
+			
+			textDocument.save(ResourceUtilities.newTestOutputFile("testColumsWidth.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	private void setColumnsWidth(Table table, long[] columnsWidth){
+		List<Column> vListColumns = table.getColumnList();
+		for (int i = 0; i < columnsWidth.length; i++) {
+			if(columnsWidth[i] >= 0){
+				table.getColumnByIndex(i).setWidth(columnsWidth[i]);
+			}
+			table.getCellByPosition(i, 0).setStringValue(columnsWidth[i] + "/" + vListColumns.get(i).getWidth());
+		}
+	}
+	
+	private void saveods(String name) {
+		try {
+			odsdoc.save(ResourceUtilities.newTestOutputFile(filename + name + ".ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+
+	private void saveodt(String name) {
+		try {
+			odtdoc.save(ResourceUtilities.newTestOutputFile(odtfilename + name + ".odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+		}
+	}
+	
+	@Test
+	public void testGetInstanceColumn() {
+		try {
+			Table table2 = odtdoc.getTableByName("Table1");
+			Column col = Column.getInstance(table2.getColumnByIndex(0).getOdfElement());
+			Column col1 = table2.getColumnByIndex(0);
+			
+			Assert.assertEquals(col, col1);
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	
+	@Test
+	public void testGetColumnElementByIndex() {
+		try {
+			Table table2 = odtdoc.getTableByName("Table1");
+			Row row = table2.getRowByIndex(1);
+			//Cell cell = row.getCellByIndex(0);
+			row.setHeight(4.3, true);
+			row.setUseOptimalHeight(true);
+			
+			boolean flag = row.isOptimalHeight();
+			Assert.assertTrue(flag);
+			
+		} catch (Exception e) {
+			Logger.getLogger(TableRowColumnTest.class.getName()).log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableTemplateTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableTemplateTest.java
new file mode 100644
index 0000000..4f804e8
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableTemplateTest.java
@@ -0,0 +1,514 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.table;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.table.TableTableCellElementBase;
+import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
+import org.odftoolkit.odfdom.incubator.doc.office.OdfOfficeAutomaticStyles;
+import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.text.Paragraph;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class TableTemplateTest {
+
+	private static final String TEST_TABLE_FILE_NAME = "TestTableTemplate.odt";
+	private static final String TEST_TEMPLATE_FILE_NAME = "TableTemplate.odt";
+
+	Document doc;
+
+	@Before
+	public void loadTestDocument() {
+		try {
+			doc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(TEST_TABLE_FILE_NAME));
+
+		} catch (Exception e) {
+			Logger.getLogger(CellStyleHandlerTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	 @Test
+	public void testLoadTableTemplates() {
+		try {
+
+			TableTemplate template = doc.LoadTableTemplateFromForeignTable(
+					ResourceUtilities
+							.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"ColumnStyledTable");
+			checkLoadTemplateResults(template, "ColumnStyledTable");
+
+			template = doc.LoadTableTemplateFromForeignTable(ResourceUtilities
+					.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"RowStyledTable");
+			checkLoadTemplateResults(template, "RowStyledTable");
+
+			try {
+				template = doc
+						.LoadTableTemplateFromForeignTable(
+								ResourceUtilities
+										.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+								"TableR4C3");
+				Assert.fail("Fail to load this template.");
+			} catch (IllegalStateException e) {
+				Assert.assertTrue(true);
+			}
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	 @Test
+	public void testApplyColumnStyledTableTemplate() {
+		try {
+			TableTemplate template = doc.LoadTableTemplateFromForeignTable(
+					ResourceUtilities
+							.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"ColumnStyledTable");
+
+			Table table = doc.getTableByName("DataTable1");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_4*4");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_4*3");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_4*2");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_4*1");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_1*3");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_1*2");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			table = doc.getTableByName("Table_1*1");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			// apply to empty table
+			table = doc.addTable(8, 8);
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, false);
+
+			doc
+					.save(ResourceUtilities
+							.newTestOutputFile("TestApplyColumnStyledTableTemplate.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	 @Test
+	public void testApplyRowStyledTableTemplate() {
+		try {
+			TableTemplate template = doc.LoadTableTemplateFromForeignTable(
+					ResourceUtilities
+							.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"RowStyledTable");
+
+			Table table = doc.getTableByName("DataTable1");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			table = doc.getTableByName("Table_3*4");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			table = doc.getTableByName("Table_2*4");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			table = doc.getTableByName("Table_1*4");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			table = doc.getTableByName("Table2_1*1");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			table = doc.getTableByName("Table2_1*2");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			table = doc.getTableByName("Table2_1*3");
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			// apply to empty table
+			table = doc.addTable(8, 8);
+			table.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table, true);
+
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestApplyRowStyledTableTemplate.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	 @Test
+	public void testReApplyTableTemplateAfterChanges() {
+		try {
+			TableTemplate template = doc.LoadTableTemplateFromForeignTable(
+					ResourceUtilities
+							.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"RowStyledTable");
+			Table table1 = doc.getTableByName("DataTable1");
+			Table table2 = doc.getTableByName("DataTable2");
+
+			table1.applyStyle(template);
+			table2.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table1, true);
+			checkApplyRowOrColumnStyledTableTemplate(table2, true);
+
+			template = doc.LoadTableTemplateFromForeignTable(ResourceUtilities
+					.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"ColumnStyledTable");
+			table1.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table1, false);
+
+			table2.removeRowsByIndex(7, 2);
+			table2.appendColumns(2);
+			table2.applyStyle(template);
+			checkApplyRowOrColumnStyledTableTemplate(table2, false);
+
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestReApplyTableTemplate.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	 @Test
+	public void testApplyTemplateWithEmptyCells() {
+		try {
+			TableTemplate template = doc.LoadTableTemplateFromForeignTable(
+					ResourceUtilities
+							.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"RowStyledEmptyTable");
+			Table table = doc.getTableByName("DataTable1");
+			table.applyStyle(template);
+			checkApplyTemplateWithEmptyCells(table, true);
+
+			template = doc.LoadTableTemplateFromForeignTable(ResourceUtilities
+					.getTestResourceAsStream(TEST_TEMPLATE_FILE_NAME),
+					"ColumnStyledEmptyTable");
+			table = doc.getTableByName("DataTable2");
+			table.applyStyle(template);
+			checkApplyTemplateWithEmptyCells(table, false);
+
+			doc
+					.save(ResourceUtilities
+							.newTestOutputFile("TestApplyTemplateWithNoParagraphStyle.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testApplyEmptyTemplate() {
+		try {
+			TableTemplate template = new TableTemplate(doc.getStylesDom()
+					.getOfficeStyles().newTableTableTemplateElement("", "", "",
+							"", ""));
+			doc.getTableByName("DataTable1").applyStyle(template);
+			doc.save(ResourceUtilities
+					.newTestOutputFile("TestApplyEmptyTemplate.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+
+	private void checkFormatResultsByRow(Table table, Row row,
+			String firstTableStyle, String oddTableStyle,
+			String evenTableStyle, String lastTableStyle,
+			String firstParaStyle, String oddParaStyle, String evenParaStyle,
+			String lastParaStyle) {
+		int cellIndex = 0;
+		int mnRepeatedIndex = row.getRowsRepeatedNumber();
+		Cell cell;
+		String paraStyle;
+		for (Node n : new DomNodeList(row.getOdfElement().getChildNodes())) {
+			if (n instanceof TableTableCellElementBase) {
+				cell = table.getCellInstance((TableTableCellElementBase) n, 0,
+						mnRepeatedIndex);
+				int lastIndex = row.getCellCount() - 1;
+				if (cell.getColumnsRepeatedNumber() > 1)
+					lastIndex -= cell.getColumnsRepeatedNumber();
+				if (cellIndex == 0) {
+					Assert.assertEquals(cell.getCellStyleName(),
+							firstTableStyle);
+					paraStyle = firstParaStyle;
+				} else if (cellIndex == lastIndex) {
+					Assert
+							.assertEquals(cell.getCellStyleName(),
+									lastTableStyle);
+					paraStyle = lastParaStyle;
+				} else if (cellIndex % 2 == 0) {
+					Assert
+							.assertEquals(cell.getCellStyleName(),
+									evenTableStyle);
+					paraStyle = evenParaStyle;
+				} else {
+					Assert.assertEquals(cell.getCellStyleName(), oddTableStyle);
+					paraStyle = oddParaStyle;
+				}
+				Iterator<Paragraph> paraIterator = cell.getParagraphIterator();
+				while (paraIterator.hasNext()) {
+					Paragraph t = paraIterator.next();
+					if (paraStyle != null && paraStyle != "") {
+						Assert.assertEquals(t.getOdfElement().getStyleName(),
+								paraStyle);
+					}
+				}
+				cellIndex++;
+			}
+		}
+	}
+
+	private void checkApplyRowOrColumnStyledTableTemplate(Table table,
+			boolean isRowStyle) {
+
+		Iterator<Row> rowIterator = table.getRowIterator();
+		if (rowIterator.hasNext()) { // first row
+			Row currentRow = rowIterator.next();
+			if (isRowStyle) {
+				checkFormatResultsByRow(table, currentRow, "RowStyledTable.A1",
+						"RowStyledTable.B1", "RowStyledTable.B1",
+						"RowStyledTable.E1", "P1", "P2", "P2", "P5");
+			} else {
+				checkFormatResultsByRow(table, currentRow,
+						"ColumnStyledTable.A1", "ColumnStyledTable.B1",
+						"ColumnStyledTable.B1", "ColumnStyledTable.E1", "P1",
+						"P2", "P2", "P5");
+			}
+
+			int line = 0;
+			while (rowIterator.hasNext()) {
+				currentRow = rowIterator.next();
+				line++;
+				if (!rowIterator.hasNext()) { // last row
+
+					if (isRowStyle) {
+						checkFormatResultsByRow(table, currentRow,
+								"RowStyledTable.A5", "RowStyledTable.B5",
+								"RowStyledTable.B5", "RowStyledTable.E5", "P3",
+								"P2", "P2", "P4");
+					} else {
+						checkFormatResultsByRow(table, currentRow,
+								"ColumnStyledTable.A5", "ColumnStyledTable.B5",
+								"ColumnStyledTable.B5", "ColumnStyledTable.E5",
+								"P3", "P2", "P2", "P4");
+					}
+
+				} else if (isRowStyle) {
+					if (line % 2 != 0) { // odd row
+						checkFormatResultsByRow(table, currentRow,
+								"RowStyledTable.A2", "RowStyledTable.B2",
+								"RowStyledTable.B2", "RowStyledTable.E2", "P2",
+								"P2", "P2", "P2");
+					} else { // even row
+						checkFormatResultsByRow(table, currentRow,
+								"RowStyledTable.A2", "RowStyledTable.B3",
+								"RowStyledTable.B3", "RowStyledTable.E2", "P2",
+								"P2", "P2", "P2");
+					}
+				} else { // even&odd column
+					checkFormatResultsByRow(table, currentRow,
+							"ColumnStyledTable.A2", "ColumnStyledTable.B2",
+							"ColumnStyledTable.C2", "ColumnStyledTable.E2",
+							"P2", "P2", "P2", "P2");
+				}
+			}
+		}
+
+	}
+
+	private void checkApplyTemplateWithEmptyCells(Table table,
+			boolean isRowStyle) {
+
+		Iterator<Row> rowIterator = table.getRowIterator();
+		if (rowIterator.hasNext()) { // first row
+			Row currentRow = rowIterator.next();
+			if (isRowStyle) {
+				checkFormatResultsByRow(table, currentRow,
+						"RowStyledEmptyTable.A1", "RowStyledEmptyTable.B1",
+						"RowStyledEmptyTable.B1", "RowStyledEmptyTable.E1",
+						"P1", "P2", "P2", "P5");
+			} else {
+				checkFormatResultsByRow(table, currentRow,
+						"ColumnStyledEmptyTable.A1",
+						"ColumnStyledEmptyTable.B1",
+						"ColumnStyledEmptyTable.B1",
+						"ColumnStyledEmptyTable.E1", "P1", "P2", "P2", "P5");
+			}
+
+			int line = 0;
+			while (rowIterator.hasNext()) {
+				currentRow = rowIterator.next();
+				line++;
+				if (!rowIterator.hasNext()) { // last row
+
+					if (isRowStyle) {
+						checkFormatResultsByRow(table, currentRow,
+								"RowStyledEmptyTable.A5",
+								"RowStyledEmptyTable.B5",
+								"RowStyledEmptyTable.B5",
+								"RowStyledEmptyTable.E5", "P3", "P2", "P2",
+								"P4");
+					} else {
+						checkFormatResultsByRow(table, currentRow,
+								"ColumnStyledEmptyTable.A5",
+								"ColumnStyledEmptyTable.B5",
+								"ColumnStyledEmptyTable.B5",
+								"ColumnStyledEmptyTable.E5", "P3", "P2", "P2",
+								"P4");
+					}
+
+				} else if (isRowStyle) {
+					if (line % 2 != 0) { // odd row
+						checkFormatResultsByRow(table, currentRow,
+								"RowStyledEmptyTable.A2",
+								"RowStyledEmptyTable.B2",
+								"RowStyledEmptyTable.B2",
+								"RowStyledEmptyTable.E2", "P2", "P2", "P2",
+								"P2");
+					} else { // even row
+						checkFormatResultsByRow(table, currentRow,
+								"RowStyledEmptyTable.A2",
+								"RowStyledEmptyTable.B3",
+								"RowStyledEmptyTable.B3",
+								"RowStyledEmptyTable.E2", "P2", "P2", "P2",
+								"P2");
+					}
+				} else { // even&odd column
+					checkFormatResultsByRow(table, currentRow,
+							"ColumnStyledEmptyTable.A2",
+							"ColumnStyledEmptyTable.B2",
+							"ColumnStyledEmptyTable.C2",
+							"ColumnStyledEmptyTable.E2", "P2", "P2", "P2", "P2");
+				}
+			}
+		}
+
+	}
+
+	private void checkLoadTemplateResults(TableTemplate template, String name) {
+		OdfStyle style = null;
+		try {
+			OdfOfficeAutomaticStyles styles = doc.getContentDom()
+					.getAutomaticStyles();
+			style = styles.getStyle(name + ".A1", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".B1", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".E1", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".A2", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".B2", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".E2", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			if (name.contains("Column")) {
+				style = styles.getStyle(name + ".C2", OdfStyleFamily.TableCell);
+				Assert.assertNotNull(style);
+			} else {
+				style = styles.getStyle(name + ".B3", OdfStyleFamily.TableCell);
+				Assert.assertNotNull(style);
+			}
+			style = styles.getStyle(name + ".A5", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".B5", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle(name + ".E5", OdfStyleFamily.TableCell);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle("P1", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle("P2", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle("P4", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle("P5", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+
+			style = styles.getStyle("P3", OdfStyleFamily.Paragraph);
+			Assert.assertNotNull(style);
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTemplateTest.class.getName()).log(
+					Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableTest.java
new file mode 100644
index 0000000..3ae0db8
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/table/TableTest.java
@@ -0,0 +1,1223 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.table;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.odftoolkit.odfdom.dom.element.table.TableTableColumnElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableHeaderColumnsElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfFileDom;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.SpreadsheetDocument;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.Document.OdfMediaType;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class TableTest {
+
+	final String mOdsTestFileName = "TestSpreadsheetTable";
+	final String mOdtTestFileName = "TestTextTable";
+	SpreadsheetDocument mOdsDoc;
+	TextDocument mOdtDoc;
+	TableTableElement mOdsTable, mOdtTable;
+
+	@Before
+	public void setUp() {
+		try {
+			mOdsDoc = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(mOdsTestFileName + ".ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private TextDocument loadODTDocument(String name) {
+		try {
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(name));
+			return odtdoc;
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+		return null;
+	}
+
+	@Test
+	public void testNewTable() {
+		try {
+			TextDocument document = TextDocument.newTextDocument();
+			document.newParagraph("Empty table:");
+			createEmptyTable(document);
+
+			document.newParagraph();
+			document.newParagraph("Table with float values:");
+			createTableWithData(document);
+			document.newParagraph();
+			document.newParagraph("Table with string values:");
+			createTableWithString(document);
+
+			document.save(ResourceUtilities.newTestOutputFile("CreateTableCase.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testColumnWidthCompareNewTableWithGetCellByPosition() {
+		try {
+			SpreadsheetDocument odsDoc = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table = Table.newTable(odsDoc, 20, 20);
+			table.setTableName("Table1");
+			double width1 = table.getColumnByIndex(0).getWidth();
+			table = Table.newTable(odsDoc);
+			table.setTableName("Table2");
+			// set the table size as 20*20.
+			table.getCellByPosition(19, 19);
+			double width2 = table.getColumnByIndex(0).getWidth();
+			Assert.assertEquals(width1, width2);
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testNewTableWithArrayData() {
+		try {
+			// reproduce bug 121
+			int rowCount = 10, columnCount = 4;
+			String[] rowLabels = new String[rowCount];
+			for (int i = 0; i < rowCount; i++) {
+				rowLabels[i] = "RowHeader" + i;
+			}
+			String[] columnLabels = new String[columnCount];
+			for (int i = 0; i < columnCount; i++) {
+				columnLabels[i] = "ColumnHeader" + i;
+			}
+			double[][] doubleArray = null;
+			String[][] stringArray = null;
+			SpreadsheetDocument spreadsheet = SpreadsheetDocument.newSpreadsheetDocument();
+			Table table1 = Table.newTable(spreadsheet, null, null, doubleArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT 2
+			Assert.assertEquals(2, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT 5
+			Assert.assertEquals(5, table1.getColumnCount());
+
+			table1 = Table.newTable(spreadsheet, rowLabels, columnLabels, doubleArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT+1 3
+			Assert.assertEquals(3, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT+1 6
+			Assert.assertEquals(6, table1.getColumnCount());
+
+			table1 = Table.newTable(spreadsheet, null, null, stringArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT 2
+			Assert.assertEquals(2, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT 5
+			Assert.assertEquals(5, table1.getColumnCount());
+
+			table1 = Table.newTable(spreadsheet, rowLabels, columnLabels, stringArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			// row count should be DEFAULT_ROW_COUNT+1 3
+			Assert.assertEquals(3, table1.getRowCount());
+			// column count should be DEFAULT_COLUMN_COUNT+1 6
+			Assert.assertEquals(6, table1.getColumnCount());
+
+			doubleArray = new double[rowCount][columnCount];
+			for (int i = 0; i < rowCount; i++) {
+				for (int j = 0; j < columnCount; j++) {
+					doubleArray[i][j] = Math.random();
+				}
+			}
+			table1 = Table.newTable(spreadsheet, null, null, doubleArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount, table1.getRowCount());
+			Assert.assertEquals(columnCount, table1.getColumnCount());
+
+			table1 = Table.newTable(spreadsheet, rowLabels, columnLabels, doubleArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount + 1, table1.getRowCount());
+			Assert.assertEquals(columnCount + 1, table1.getColumnCount());
+
+			stringArray = new String[rowCount][columnCount];
+			for (int i = 0; i < rowCount; i++) {
+				for (int j = 0; j < columnCount; j++) {
+					stringArray[i][j] = "string" + (i * columnCount + j);
+				}
+			}
+			table1 = Table.newTable(spreadsheet, null, null, stringArray);
+			Assert.assertEquals(0, table1.getHeaderColumnCount());
+			Assert.assertEquals(0, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount, table1.getRowCount());
+			Assert.assertEquals(columnCount, table1.getColumnCount());
+
+			table1 = Table.newTable(spreadsheet, rowLabels, columnLabels, stringArray);
+			Assert.assertEquals(1, table1.getHeaderColumnCount());
+			Assert.assertEquals(1, table1.getHeaderRowCount());
+			Assert.assertEquals(rowCount + 1, table1.getRowCount());
+			Assert.assertEquals(columnCount + 1, table1.getColumnCount());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testNewTableWithoutHeaderColumn() {
+		try {
+			// reproduce bug 145
+			SpreadsheetDocument spreadsheet = SpreadsheetDocument.newSpreadsheetDocument();
+			Table sheet = Table.newTable(spreadsheet, 3, 5);
+			TableTableHeaderColumnsElement headers = OdfElement.findFirstChildNode(
+					TableTableHeaderColumnsElement.class, sheet.getOdfElement());
+			if (headers != null) {
+				for (Node n : new DomNodeList(headers.getChildNodes())) {
+					if (n instanceof TableTableColumnElement) {
+						if (sheet.getColumnInstance(((TableTableColumnElement) n), 0).getColumnsRepeatedNumber() == 0) {
+							Assert
+									.fail("table:number-columns-repeated has the invalid value: '0'. It have to be a value matching the 'positiveInteger' type.");
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private Table createEmptyTable(TextDocument document) {
+		String tablename = "Table1";
+		int rownumber = 5;
+		int clmnumber = 3;
+
+		Table table1 = Table.newTable(document, 5, 3);
+		table1.setTableName(tablename);
+
+		Assert.assertEquals(tablename, table1.getTableName());
+		Assert.assertEquals(rownumber, table1.getRowCount());
+		Assert.assertEquals(clmnumber, table1.getColumnCount());
+
+		Table table = document.getTableByName(tablename);
+		Assert.assertNotNull(table);
+		Assert.assertEquals(table1, table);
+		return table1;
+	}
+
+	private Table createTableWithData(TextDocument document) {
+		String tablename = "Table2";
+		int rowcount = 10, columncount = 4;
+		double[][] data = new double[rowcount][columncount];
+		for (int i = 0; i < rowcount; i++) {
+			for (int j = 0; j < columncount; j++) {
+				data[i][j] = Math.random();
+			}
+		}
+
+		String[] rowlabels = new String[rowcount];
+		for (int i = 0; i < rowcount; i++) {
+			rowlabels[i] = "RowHeader" + i;
+		}
+
+		String[] columnlabels = new String[columncount];
+		for (int i = 0; i < columncount; i++) {
+			columnlabels[i] = "ColumnHeader" + i;
+		}
+
+		Table table2 = Table.newTable(document, rowlabels, columnlabels, data);
+		table2.setTableName(tablename);
+
+		Assert.assertEquals(1, table2.getHeaderColumnCount());
+		Assert.assertEquals(1, table2.getHeaderRowCount());
+		Assert.assertEquals(rowcount + 1, table2.getRowCount());
+		Assert.assertEquals(columncount + 1, table2.getColumnCount());
+		Table table = document.getTableByName(tablename);
+		Assert.assertNotNull(table);
+		Assert.assertEquals(table2, table);
+
+		Cell cell = table.getCellByPosition(1, 1);
+		Assert.assertEquals("float", cell.getValueType());
+
+		return table2;
+	}
+
+	private Table createTableWithString(TextDocument document) {
+		String tablename = "Table3";
+		int rowcount = 7, columncount = 5;
+		String[][] data = new String[rowcount][columncount];
+		for (int i = 0; i < rowcount; i++) {
+			for (int j = 0; j < columncount; j++) {
+				data[i][j] = "string" + (i * columncount + j);
+			}
+		}
+
+		String[] rowlabels = new String[rowcount];
+		for (int i = 0; i < rowcount; i++) {
+			rowlabels[i] = "RowHeader" + i;
+		}
+
+		String[] columnlabels = new String[columncount];
+		for (int i = 0; i < columncount; i++) {
+			columnlabels[i] = "ColumnHeader" + i;
+		}
+
+		Table table3 = Table.newTable(document, rowlabels, columnlabels, data);
+		table3.setTableName(tablename);
+
+		Assert.assertEquals(1, table3.getHeaderColumnCount());
+		Assert.assertEquals(1, table3.getHeaderRowCount());
+		Assert.assertEquals(rowcount + 1, table3.getRowCount());
+		Assert.assertEquals(columncount + 1, table3.getColumnCount());
+		Table table = document.getTableByName(tablename);
+		Assert.assertNotNull(table);
+		Assert.assertEquals(table3, table);
+
+		Cell cell = table.getCellByPosition(1, 1);
+		Assert.assertEquals("string", cell.getValueType());
+
+		return table3;
+
+	}
+
+	@Test
+	public void testDeleteTable() {
+		try {
+			mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+			List<Table> tableList = mOdtDoc.getTableList();
+			int count = tableList.size();
+
+			Table table = mOdtDoc.getTableByName("DeletedTable");
+			if (table != null) {
+				table.remove();
+			}
+
+			saveodt(mOdtTestFileName + "Out.odt");
+			mOdtDoc = loadODTDocument(mOdtTestFileName + "Out.odt");
+			tableList = mOdtDoc.getTableList();
+			Assert.assertEquals(count - 1, tableList.size());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetGetWidth() {
+		long width = 500;
+		try {
+			TextDocument document = TextDocument.newTextDocument();
+			document.newParagraph("Empty table:");
+			Table table = createEmptyTable(document);
+			table.setWidth(width);
+			Assert.assertTrue(Math.abs(width - table.getWidth()) < 3);
+
+			document.save(ResourceUtilities.newTestOutputFile("TestSetGetWidth.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAppendColumn() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		List<Table> tableList = mOdtDoc.getTableList();
+		for (int i = 0; i < tableList.size(); i++) {
+			Table table = tableList.get(i);
+			int clmnum = table.getColumnCount();
+			table.appendColumn();
+			Assert.assertEquals(clmnum + 1, table.getColumnCount());
+
+			Column column = table.getColumnByIndex(clmnum);
+			Column columnOld = table.getColumnByIndex(clmnum - 1);
+			Assert.assertEquals(column.getCellCount(), columnOld.getCellCount());
+		}
+		saveodt(mOdtTestFileName + "Output.odt");
+	}
+
+	@Test
+	public void testGetSetTablename() {
+		String tablename = "My Table";
+		TextDocument document = null;
+		try {
+			document = TextDocument.newTextDocument();
+			document.newParagraph("Empty table:");
+			Table table = createEmptyTable(document);
+			table.setTableName(tablename);
+			Assert.assertEquals(tablename, table.getTableName());
+
+			document.save(ResourceUtilities.newTestOutputFile("TestGetSetName.odt"));
+			document.close();
+			document = loadODTDocument("TestGetSetName.odt");
+			table = document.getTableByName(tablename);
+			Assert.assertNotNull(table);
+			String tablename2 = table.getTableName();
+			Assert.assertEquals(tablename, tablename2);
+		} catch (Exception e) {
+			Assert.fail(e.getMessage());
+		}
+
+		try {
+			// new another table with the same name
+			// an exception will be thrown
+			Table table2 = Table.newTable(document);
+			table2.setTableName(tablename);
+			document.save(ResourceUtilities.newTestOutputFile("TestGetSetName.odt"));
+			Assert.fail("should not save the tables with the same table name.");
+		} catch (Exception e) {
+			if (!e.getMessage().startsWith("The table name is duplicate")) {
+				Assert.fail(e.getMessage());
+			}
+		}
+	}
+
+	@Test
+	public void testInsertColumnBefore() throws Exception {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Table table1 = mOdtDoc.getTableByName("Table3");
+		table1.setUseRepeat(false);
+		CellRange range = table1.getCellRangeByPosition(0, 1, 1, 2);
+		range.merge();
+
+		int clmnum = table1.getColumnCount();
+		Column oldClm1 = table1.getColumnByIndex(1);
+
+		List<Column> columns = table1.insertColumnsBefore(1, 2);
+		Assert.assertEquals(clmnum + 2, table1.getColumnCount());
+		Column clm0 = table1.getColumnByIndex(0);
+		Column clm1 = table1.getColumnByIndex(1);
+		Column clm2 = table1.getColumnByIndex(2);
+		Column clm3 = table1.getColumnByIndex(3);
+		Assert.assertEquals(columns.get(0), clm1);
+		Assert.assertEquals(columns.get(1), clm2);
+		Assert.assertEquals(clm0.getCellCount(), clm1.getCellCount());
+		Assert.assertEquals(clm1.getCellCount(), clm2.getCellCount());
+		Assert.assertEquals(clm3, oldClm1);
+
+		Table table2 = mOdtDoc.getTableByName("Table2");
+		Column oldClm0 = table2.getColumnByIndex(0);
+		columns = table2.insertColumnsBefore(0, 2);
+
+		Column newClm0 = table2.getColumnByIndex(0);
+		Column newClm1 = table2.getColumnByIndex(1);
+		Column newClm2 = table2.getColumnByIndex(2);
+		Assert.assertEquals(newClm0.getCellCount(), newClm2.getCellCount());
+		Assert.assertEquals(newClm1.getCellCount(), newClm2.getCellCount());
+		Assert.assertEquals(newClm2, oldClm0);
+
+		saveodt(mOdtTestFileName + "Out.odt");
+	}
+
+	@Test
+	public void testRemoveColumnByIndex() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Table table1 = mOdtDoc.getTableByName("Table3");
+		CellRange range = table1.getCellRangeByPosition(0, 1, 1, 2);
+		range.merge();
+
+		int clmnum = table1.getColumnCount();
+		Column oldClm0 = table1.getColumnByIndex(0);
+		Column oldClm3 = table1.getColumnByIndex(3);
+		table1.removeColumnsByIndex(1, 2);
+		Column newClm0 = table1.getColumnByIndex(0);
+		Column newClm1 = table1.getColumnByIndex(1);
+		Assert.assertEquals(clmnum - 2, table1.getColumnCount());
+		Assert.assertEquals(oldClm0, newClm0);
+		Assert.assertEquals(oldClm3, newClm1);
+
+		Table table2 = mOdtDoc.getTableByName("Table4");
+		clmnum = table2.getColumnCount();
+		Column oldClm1 = table2.getColumnByIndex(2);
+		table2.removeColumnsByIndex(0, 2);
+		table2.removeColumnsByIndex(table2.getColumnCount() - 2, 2);
+		Column clm0 = table2.getColumnByIndex(0);
+		Assert.assertEquals(oldClm1, clm0);
+		Assert.assertEquals(clmnum - 4, table2.getColumnCount());
+		saveodt(mOdtTestFileName + "Out.odt");
+
+	}
+
+	@Test
+	public void testInsertRowBefore() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Table table2 = mOdtDoc.getTableByName("Table2");
+		Row row = table2.getRowByIndex(0);
+		int originalRowCount = table2.getRowCount();
+		List<Row> newRows = table2.insertRowsBefore(0, 2);
+
+		Row newRow1 = table2.getRowByIndex(0);
+		Row newRow2 = table2.getRowByIndex(0);
+		Assert.assertEquals(newRow1.getCellCount(), newRows.get(0).getCellCount());
+		Assert.assertEquals(newRow2.getCellCount(), newRows.get(1).getCellCount());
+		// original row index 0
+		Assert.assertEquals(row, table2.getRowByIndex(2));
+
+		saveodt(mOdtTestFileName + "Out.odt");
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + "Out.odt");
+		Table newTable = mOdtDoc.getTableByName("Table2");
+
+		Assert.assertEquals(originalRowCount + 2, newTable.getRowCount());
+
+	}
+
+	@Test
+	public void testGetColumnList() {
+		String tablename = "MyTable";
+		String testFileName = "TestGetColumnList.odt";
+		try {
+			TextDocument document = TextDocument.newTextDocument();
+
+			int rowcount = 3, columncount = 3;
+			String[][] data = new String[rowcount][columncount];
+			for (int i = 0; i < rowcount; i++) {
+				for (int j = 0; j < columncount; j++) {
+					data[i][j] = "string" + (i * columncount + j);
+				}
+			}
+
+			String[] rowlabels = new String[rowcount];
+			for (int i = 0; i < rowcount; i++) {
+				rowlabels[i] = "RowHeader" + i;
+			}
+
+			String[] columnlabels = new String[columncount];
+			for (int i = 0; i < columncount; i++) {
+				columnlabels[i] = "ColumnHeader" + i;
+			}
+
+			Table table3 = Table.newTable(document, rowlabels, columnlabels, data);
+			table3.setTableName(tablename);
+
+			document.save(ResourceUtilities.newTestOutputFile(testFileName));
+			document = loadODTDocument(testFileName);
+			Table table = document.getTableByName(tablename);
+			Column tmpColumn;
+			List<Column> columns = table.getColumnList();
+
+			// the code below prints the column value,it shows that the first
+			// columns value is the same with the last column
+			for (int i = 0; i < columns.size(); i++) {
+				tmpColumn = columns.get(i);
+				for (int j = 0; j < tmpColumn.getCellCount(); j++) {
+					String text = tmpColumn.getCellByIndex(j).getStringValue();
+					if (i == 0 && j == 0) {
+						Assert.assertEquals("", text);
+					} else if (i == 0 && j > 0) {
+						Assert.assertEquals("RowHeader" + (j - 1), text);
+					} else if (i > 0 && j == 0) {
+						Assert.assertEquals("ColumnHeader" + (i - 1), text);
+					} else {
+						Assert.assertEquals("string" + ((j - 1) * columncount + i - 1), text);
+					}
+				}
+			}
+			
+			for (int i = 1; i < columns.size(); i++) {
+				tmpColumn = columns.get(i);
+				// each column's first cell is the column header
+				Assert.assertEquals(columnlabels[i - 1], tmpColumn.getCellByIndex(0).getStringValue());
+			}
+			Assert.assertEquals(columncount, columns.size() - 1);
+			Assert.assertEquals("", columns.get(0).getCellByIndex(0).getStringValue());
+			
+			//test table column iterator
+			Iterator<Column> columnIterator = table.getColumnIterator();
+			int columnNumber =0;
+			if(columnIterator.hasNext()){
+				Column column = columnIterator.next();
+				Assert.assertEquals("", column.getCellByIndex(0).getStringValue());
+				columnNumber++;
+			}
+			while(columnIterator.hasNext()){
+				Column column = columnIterator.next();
+				Assert.assertEquals(columnlabels[columnNumber-1], column.getCellByIndex(0).getStringValue());
+				columnNumber++;
+			}
+			Assert.assertEquals(columnNumber, columns.size());
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+
+	@Test
+	public void testGetRowList() {
+		String tablename = "MyTable";
+		String testFileName = "TestGetRowList.odt";
+		try {
+			TextDocument document = TextDocument.newTextDocument();
+
+			int rowcount = 3, columncount = 3;
+			String[][] data = new String[rowcount][columncount];
+			for (int i = 0; i < rowcount; i++) {
+				for (int j = 0; j < columncount; j++) {
+					data[i][j] = "string" + (i * columncount + j);
+				}
+			}
+
+			String[] rowlabels = new String[rowcount];
+			for (int i = 0; i < rowcount; i++) {
+				rowlabels[i] = "RowHeader" + i;
+			}
+
+			String[] columnlabels = new String[columncount];
+			for (int i = 0; i < columncount; i++) {
+				columnlabels[i] = "ColumnHeader" + i;
+			}
+
+			Table table3 = Table.newTable(document, rowlabels, columnlabels, data);
+			table3.setTableName(tablename);
+
+			document.save(ResourceUtilities.newTestOutputFile(testFileName));
+			document = loadODTDocument(testFileName);
+			Table table = document.getTableByName(tablename);
+			Row tmpRow;
+			List<Row> rows = table.getRowList();
+			for (int i = 1; i < rows.size(); i++) {
+				tmpRow = rows.get(i);
+				// each row's first cell is the row header
+				Assert.assertEquals(rowlabels[i - 1], tmpRow.getCellByIndex(0).getStringValue());
+			}
+			Assert.assertEquals(rowcount, rows.size() - 1);
+			Assert.assertEquals("", rows.get(0).getCellByIndex(0).getStringValue());
+			
+			//test table row iterator
+			Iterator<Row> rowIterator = table.getRowIterator();
+			int rowNumber =0;
+			if(rowIterator.hasNext()){
+				Row row = rowIterator.next();
+				Assert.assertEquals("", row.getCellByIndex(0).getStringValue());
+				rowNumber++;
+			}
+			while(rowIterator.hasNext()){
+				Row row = rowIterator.next();
+				Assert.assertEquals(rowlabels[rowNumber-1], row.getCellByIndex(0).getStringValue());
+				rowNumber++;
+			}
+			Assert.assertEquals(rowNumber, rows.size());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetColumnByIndex() {
+
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		Table table = mOdtDoc.getTableByName("Table3");
+		Assert.assertNotNull(table);
+		// test if index is negative number, which is an illegal argument.
+		boolean illegalArgumentFlag = false;
+		try {
+			table.getColumnByIndex(-1);
+		} catch (IllegalArgumentException ie) {
+			if ("index should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		Column column = table.getColumnByIndex(2);
+		Assert.assertNotNull(column);
+		Assert.assertEquals("string6", column.getCellByIndex(2).getStringValue());
+		// test column automatically expands.
+		// Table3 original size is 7 rows and 5 columns. this test case will
+		// test row index 8 and columns index 6 are work well though they are
+		// both out bound of the original table.
+		column = table.getColumnByIndex(8);
+		Assert.assertNotNull(column);
+		Cell cell = column.getCellByIndex(6);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string86");
+		Assert.assertEquals("string86", cell.getStringValue());
+	}
+
+	@Test
+	public void testGetRowByIndex() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		Table table = mOdtDoc.getTableByName("Table3");
+		Assert.assertNotNull(table);
+		// test index is negative number. This is a illegal argument.
+		boolean illegalArgumentFlag = false;
+		try {
+			table.getRowByIndex(-1);
+		} catch (IllegalArgumentException ie) {
+			if ("index should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		Row row = table.getRowByIndex(3);
+		Assert.assertNotNull(row);
+		Assert.assertEquals("string12", row.getCellByIndex(3).getStringValue());
+		// test row automatically expands.
+		// Table3 original size is 7 rows and 5 columns. this test case will
+		// test row index 8 and columns index 6 are work well though they are
+		// both out bound of the original table.
+		row = table.getRowByIndex(6);
+		Assert.assertNotNull(row);
+		Cell cell = row.getCellByIndex(8);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string86");
+		Assert.assertEquals("string86", cell.getStringValue());
+	}
+
+	@Test
+	public void testRemoveRowByIndex() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Table table2 = mOdtDoc.getTableByName("Table2");
+		Row row0 = table2.getRowByIndex(0);
+		Row row3 = table2.getRowByIndex(3);
+		int originalRowCount = table2.getRowCount();
+		table2.removeRowsByIndex(1, 2);
+
+		// original row index 0
+		Assert.assertEquals(row0, table2.getRowByIndex(0));
+		Assert.assertEquals(row3, table2.getRowByIndex(1));
+
+		saveodt(mOdtTestFileName + "Out.odt");
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + "Out.odt");
+		Table newTable = mOdtDoc.getTableByName("Table2");
+
+		Assert.assertEquals(originalRowCount - 2, newTable.getRowCount());
+	}
+
+	@Test
+	public void testGetHeaderRowCount() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		Table table = mOdtDoc.getTableByName("Table3");
+		int headerRowCount = table.getHeaderRowCount();
+		Assert.assertEquals(1, headerRowCount);
+	}
+
+	@Test
+	public void testGetRowCount() {
+		try {
+			// without table rows
+			Document mOdpDoc = Document.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TableCountTestcase.odp"));
+			Table table = mOdpDoc.getTableByName("Table1");
+			int rowCount = table.getRowCount();
+			Assert.assertEquals(5, rowCount);
+			// with table rows
+			Document mOdcDoc = mOdpDoc.getEmbeddedDocument("Object 2/");
+			table = mOdcDoc.getTableByName("local-table");
+			rowCount = table.getRowCount();
+			Assert.assertEquals(5, rowCount);
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			e.printStackTrace();
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetHeaderColumnCount() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		Table table = mOdtDoc.getTableByName("Table3");
+		int headerColumnCount = table.getHeaderColumnCount();
+		Assert.assertEquals(1, headerColumnCount);
+
+	}
+
+	@Test
+	public void testGetColumnCountWithColumnsInDocument() {
+		try {
+			SpreadsheetDocument sDoc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("Spreadsheet with Embeded Chart.ods"));
+			List<Document> charts = sDoc.getEmbeddedDocuments(OdfMediaType.CHART);
+			for (Document chart : charts) {
+				// "local-table" is the inner table name of chart document with
+				// 2 columns
+				Table localTable = chart.getTableByName("local-table");
+				int columnCount = localTable.getColumnCount();
+				Assert.assertEquals(2, columnCount);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testIsProtected() throws Exception {
+		String tablename = "DeletedTable";
+		String outputFilename = "tableProtected.odt";
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Assert.assertNotNull(mOdtDoc);
+		Table table = mOdtDoc.getTableByName(tablename);
+		table.setProtected(false);
+		mOdtDoc.save(ResourceUtilities.newTestOutputFile(outputFilename));
+
+		mOdtDoc = loadODTDocument(outputFilename);
+		table = mOdtDoc.getTableByName(tablename);
+		Assert.assertFalse(table.isProtected());
+
+	}
+
+	@Test
+	public void testSetIsProtected() throws Exception {
+		String tablename = "DeletedTable";
+		String outputFilename = "tableProtected.odt";
+
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Assert.assertNotNull(mOdtDoc);
+		Table table = mOdtDoc.getTableByName(tablename);
+		table.setProtected(true);
+		mOdtDoc.save(ResourceUtilities.newTestOutputFile(outputFilename));
+
+		mOdtDoc = loadODTDocument(outputFilename);
+		table = mOdtDoc.getTableByName(tablename);
+		Assert.assertTrue(table.isProtected());
+	}
+
+	@Test
+	public void testGetCellByPosition() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		Table table = mOdtDoc.getTableByName("Table3");
+
+		Cell cell = table.getCellByPosition(3, 3);
+		Assert.assertNotNull(cell);
+		Assert.assertEquals("string12", cell.getStringValue());
+		cell = table.getCellByPosition("D4");
+		Assert.assertNotNull(cell);
+		Assert.assertEquals("string12", cell.getStringValue());
+		// test index are negative numbers. They are illegal arguments.
+		boolean illegalArgumentFlag = false;
+		try {
+			cell = table.getCellByPosition(-1, 0);
+		} catch (IllegalArgumentException ie) {
+			if ("colIndex and rowIndex should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		// test TextTable automatically expands.
+		// Table3 original size is 7 rows and 5 columns;
+		// test row index 8 and column index 6, row index and column index both
+		// out of bound, work well.
+		cell = table.getCellByPosition(8, 6);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string86");
+		Assert.assertEquals("string86", cell.getStringValue());
+		// test row index 9 and column index 4, row index out of bound, work
+		// well.
+		cell = table.getCellByPosition(4, 9);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string49");
+		Assert.assertEquals("string49", cell.getStringValue());
+		// test row index 9 and column index 4, column index out of bound, work
+		// well.
+		cell = table.getCellByPosition(9, 10);
+		Assert.assertNotNull(cell);
+		cell.setStringValue("string910");
+		Assert.assertEquals("string910", cell.getStringValue());
+		// test column index out of bound, work well.
+		cell = table.getCellByPosition("I4");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringI4");
+		Assert.assertEquals("stringI4", cell.getStringValue());
+		// test row index out of bound, work well.
+		cell = table.getCellByPosition("D11");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringD11");
+		Assert.assertEquals("stringD11", cell.getStringValue());
+		// test row index and column index both out of bound, work well.
+		cell = table.getCellByPosition("K12");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringK12");
+		Assert.assertEquals("stringK12", cell.getStringValue());
+		// test TestSpreadsheetTable automatically expands.
+		// Sheet1 original size is 6 rows and 9 columns;
+		table = mOdsDoc.getTableByName("Sheet1");
+		cell = table.getCellByPosition("C1");
+		Assert.assertNotNull(cell);
+		Assert.assertEquals("Currency", cell.getStringValue());
+		cell = table.getCellByPosition("K4");
+		Assert.assertNotNull(cell);
+		cell.setBooleanValue(true);
+		Assert.assertEquals(Boolean.TRUE, cell.getBooleanValue());
+		cell = table.getCellByPosition("D10");
+		Assert.assertNotNull(cell);
+		Calendar cal = Calendar.getInstance();
+		cell.setTimeValue(cal);
+		SimpleDateFormat simpleFormat = new SimpleDateFormat("'PT'HH'H'mm'M'ss'S'");
+		String expectedString = simpleFormat.format(cal.getTime());
+		String targetString = simpleFormat.format(cell.getTimeValue().getTime());
+		Assert.assertEquals(expectedString, targetString);
+		cell = table.getCellByPosition("M15");
+		Assert.assertNotNull(cell);
+		cell.setStringValue("stringM15");
+		Assert.assertEquals("stringM15", cell.getStringValue());
+	}
+
+	@Test
+	public void testGetCellWithAutoExtend() {
+		SpreadsheetDocument ods;
+		try {
+			ods = SpreadsheetDocument.newSpreadsheetDocument();
+			Table tbl = ods.getTableByName("Sheet1");
+			tbl.setTableName("Tests");
+			Cell cell = tbl.getCellByPosition(5, 5);
+			Assert.assertNotNull(cell);
+			Assert.assertEquals(6, tbl.getRowCount());
+			Assert.assertEquals(6, tbl.getColumnCount());
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetCellRangeByPosition() {
+		testNewTable();
+		mOdtDoc = loadODTDocument("CreateTableCase.odt");
+		Table table = mOdtDoc.getTableByName("Table3");
+
+		CellRange range = table.getCellRangeByPosition(0, 0, 3, 3);
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("A1", "D4");
+		Assert.assertNotNull(range);
+
+		// test TextTable automatically expands.
+		// Table3 original size is 7 rows and 5 columns;
+
+		// test index is negative number. They are illegal arguments.
+		boolean illegalArgumentFlag = false;
+		try {
+			range = table.getCellRangeByPosition(-1, 0, 2, -14);
+		} catch (IllegalArgumentException ie) {
+			if ("colIndex and rowIndex should be nonnegative integer.".equals(ie.getMessage())) {
+				illegalArgumentFlag = true;
+			}
+		}
+		Assert.assertTrue(illegalArgumentFlag);
+		range = table.getCellRangeByPosition(0, 0, 8, 6);
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition(0, 0, 4, 9);
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition(0, 0, 9, 10);
+		Assert.assertNotNull(range);
+		// get cell range by address.
+		range = table.getCellRangeByPosition("A1", "I4");
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("A1", "D11");
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("A1", "K12");
+		Assert.assertNotNull(range);
+		// test TestSpreadsheetTable automatically expands.
+		// Sheet1 original size is 6 rows and 9 columns;
+		// get cell range by index.
+		table = mOdsDoc.getTableByName("Sheet1");
+		range = table.getCellRangeByPosition("A1", "C1");
+		Assert.assertNotNull(range);
+		range = table.getCellRangeByPosition("B7", "K12");
+		Assert.assertNotNull(range);
+	}
+
+	@Test
+	public void testRemoveRowColumn() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Table table1 = mOdtDoc.getTableByName("Table1");
+		int rowCount = table1.getRowCount();
+		table1.removeRowsByIndex(1, 2);
+		Assert.assertEquals(rowCount - 2, table1.getRowCount());
+
+		Table table2 = mOdtDoc.getTableByName("Table2");
+		int columnCount = table2.getColumnCount();
+		table2.removeColumnsByIndex(2, 1);
+		Assert.assertEquals(columnCount - 1, table2.getColumnCount());
+
+		Table table3 = mOdtDoc.getTableByName("Table3");
+		rowCount = table3.getRowCount();
+		table3.removeRowsByIndex(0, 2);
+		Assert.assertEquals(rowCount - 2, table3.getRowCount());
+
+		saveodt(mOdtTestFileName + "Out.odt");
+
+	}
+
+	@Test
+	public void testAppendRow() {
+		OdfFileDom dom;
+		try {
+			SpreadsheetDocument odsDoc = SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestODSAppendRow.ods"));
+			dom = odsDoc.getContentDom();
+			NodeList tablelist = dom.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table");
+			for (int i = 0; i < tablelist.getLength(); i++) {
+				mOdsTable = (TableTableElement) tablelist.item(i);
+				testAppendRow(mOdsTable);
+			}
+			odsDoc.save(ResourceUtilities.newTestOutputFile("TestODSAppendRowOutput.ods"));
+
+			TextDocument odtDoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestODTAppendRow.odt"));
+			dom = odtDoc.getContentDom();
+			tablelist = dom.getElementsByTagNameNS(OdfDocumentNamespace.TABLE.getUri(), "table");
+			for (int i = 0; i < tablelist.getLength(); i++) {
+				mOdtTable = (TableTableElement) tablelist.item(i);
+				testAppendRow(mOdtTable);
+			}
+			odtDoc.save(ResourceUtilities.newTestOutputFile("TestODTAppendRowOutput.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAppendRowsWithCoveredCell() {
+		SpreadsheetDocument odsDoc = null;
+		Table table = null;
+		try {
+			odsDoc = SpreadsheetDocument.newSpreadsheetDocument();
+			table = Table.newTable(odsDoc);
+			mergeCells(table, 1, 1, 3, 2);
+			mergeCells(table, 2, 4, 3, 3);
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+
+	@Test
+	public void testAppendRowsWithRowsRepeated() {
+		SpreadsheetDocument odsDoc = null;
+		Table table = null;
+		try {
+			odsDoc = SpreadsheetDocument.newSpreadsheetDocument();
+			table = Table.newTable(odsDoc, 1, 1);
+			table.appendRows(12);
+			Row row10 = table.getRowByIndex(10);
+			Row row11 = table.getRowByIndex(11);
+			// default appended rows described by single element
+			Assert.assertSame(row10.getOdfElement(), row11.getOdfElement());
+
+			table.setUseRepeat(false);
+			table.appendRows(12);
+			Row row20 = table.getRowByIndex(20);
+			Row row21 = table.getRowByIndex(21);
+			Assert.assertNotSame(row20.getOdfElement(), row21.getOdfElement());
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAppendColumnsWithColumnsRepeated() {
+		SpreadsheetDocument odsDoc = null;
+		Table table = null;
+		try {
+			odsDoc = SpreadsheetDocument.newSpreadsheetDocument();
+			table = Table.newTable(odsDoc, 1, 1);
+			table.appendColumns(12);
+			Column column10 = table.getColumnByIndex(10);
+			Column column11 = table.getColumnByIndex(11);
+
+			Cell cell10 = table.getCellByPosition(10, 2);
+			Cell cell11 = table.getCellByPosition(11, 2);
+
+			// default appended rows described by single element
+			Assert.assertSame(column10.getOdfElement(), column11.getOdfElement());
+			Assert.assertSame(cell10.getOdfElement(), cell11.getOdfElement());
+
+			table.setUseRepeat(false);
+			table.appendColumns(12);
+			Column column20 = table.getColumnByIndex(20);
+			Column column21 = table.getColumnByIndex(21);
+
+			Cell cell20 = table.getCellByPosition(20, 2);
+			Cell cell21 = table.getCellByPosition(21, 2);
+
+			Assert.assertNotSame(column20.getOdfElement(), column21.getOdfElement());
+			Assert.assertNotSame(cell20.getOdfElement(), cell21.getOdfElement());
+
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSplitCellAddress() {
+		mOdtDoc = loadODTDocument(mOdtTestFileName + ".odt");
+		Table table1 = mOdtDoc.getTableByName("Table1");
+		// reproduce bug 138, test case to proof the fix problem.
+		// test address without table name.
+		String[] address = table1.splitCellAddress("A1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("A", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("AC1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("B34");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("B", address[1]);
+		Assert.assertEquals("34", address[2]);
+		address = table1.splitCellAddress("AC29");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("29", address[2]);
+
+		// test relative address
+		address = table1.splitCellAddress("Table1.A1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("A", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("Table1.AC1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("Table1.B34");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("B", address[1]);
+		Assert.assertEquals("34", address[2]);
+		address = table1.splitCellAddress("Table1.AC29");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("29", address[2]);
+
+		// test absolute address.
+		address = table1.splitCellAddress("$Table1.$A$1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("A", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("$Table1.$AC$1");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("1", address[2]);
+		address = table1.splitCellAddress("$Table1.$B$34");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("B", address[1]);
+		Assert.assertEquals("34", address[2]);
+		address = table1.splitCellAddress("$Table1.$AC$29");
+		Assert.assertEquals("Table1", address[0]);
+		Assert.assertEquals("AC", address[1]);
+		Assert.assertEquals("29", address[2]);
+	}
+
+	// Bug 97 - Row.getCellAt(int) returns null when the cell is a repeat cell
+	@Test
+	public void testGetCellAt() {
+		try {
+			SpreadsheetDocument doc = (SpreadsheetDocument) SpreadsheetDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("testGetCellAt.ods"));
+			Table odfTable = doc.getTableList().get(0);
+			Row valueRows = odfTable.getRowByIndex(0);
+			for (int i = 0; i < 4; i++) {
+				Cell cell = valueRows.getCellByIndex(i);
+				Assert.assertNotNull(cell);
+				int value = cell.getDoubleValue().intValue();
+				Assert.assertEquals(1, value);
+			}
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+		}
+	}
+
+	@Test
+	public void testDeleteRowsOnEmptyTable() throws Exception {
+		SpreadsheetDocument doc = SpreadsheetDocument.newSpreadsheetDocument();
+		Table odfTable = doc.addTable();
+		// two rows are created by default
+		Assert.assertEquals(2, odfTable.getRowCount());
+		while(odfTable.getRowCount() != 0) {
+			odfTable.removeRowsByIndex(0, 1);
+		}
+		Assert.assertEquals(0, odfTable.getRowCount());
+	}
+
+	private void testAppendRow(TableTableElement table) {
+		Table fTable = Table.getInstance(table);
+		int count = fTable.getRowCount();
+		fTable.appendRow();
+		int newcount = fTable.getRowCount();
+		Assert.assertEquals(count + 1, newcount);
+	}
+
+	private void saveods() {
+		try {
+			mOdsDoc.save(ResourceUtilities.newTestOutputFile(mOdsTestFileName + "Output.ods"));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void saveodt(String filename) {
+		try {
+			mOdtDoc.save(ResourceUtilities.newTestOutputFile(filename));
+		} catch (Exception e) {
+			Logger.getLogger(TableTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void mergeCells(Table table, int cellCol, int cellRow, int colSpan, int rowSpan) {
+		if (table != null) {
+			CellRange range = table.getCellRangeByPosition(cellCol, cellRow, cellCol + colSpan - 1, cellRow + rowSpan
+					- 1);
+			range.merge();
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/FooterTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/FooterTest.java
new file mode 100644
index 0000000..3b2bda9
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/FooterTest.java
@@ -0,0 +1,285 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleFooterElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class FooterTest {
+
+	String footerDocumentPath = "FooterTableDocument.odt";
+
+	@Test
+	public void testAddTable() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			Assert.assertNotNull(footer);
+
+			Table table = footer.addTable(1, 1);
+			table.setTableName("footerTable");
+			int rowCount = table.getRowCount();
+			int columnCount = table.getColumnCount();
+			String expectedCellValue = "footer table cell";
+			Cell cellByPosition = table.getCellByPosition(0, 0);
+			cellByPosition.setStringValue(expectedCellValue);
+			cellByPosition.setHorizontalAlignment(HorizontalAlignmentType.CENTER);
+			cellByPosition.setCellBackgroundColor(Color.GREEN);
+			
+			//first page
+			footer = doc.getFooter(true);
+			Assert.assertNotNull(footer);
+			table = footer.addTable(1, 2);
+			table.setTableName("footerFTable");
+			doc.save(ResourceUtilities.newTestOutputFile(footerDocumentPath));
+
+			// load the document again.
+			doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(footerDocumentPath));
+			footer = doc.getFooter();
+			table = footer.getTableByName("footerTable");
+			Assert.assertEquals(rowCount, table.getRowCount());
+			Assert.assertEquals(columnCount, table.getColumnCount());
+			Assert.assertEquals(expectedCellValue, cellByPosition.getStringValue());
+
+			footer = doc.getFooter(true);
+			table = footer.getTableByName("footerFTable");
+			Assert.assertNotNull(table);
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testFooterHidden() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			Footer footer = doc.getFooter();
+			Assert.assertEquals(true, footer.isVisible());
+			footer.setVisible(false);
+			Assert.assertEquals(false, footer.isVisible());
+			doc.save(ResourceUtilities.newTestOutputFile("footerHiddenOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetOdfElement() {
+		try {
+			//TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			StyleFooterElement footerEle = footer.getOdfElement();
+			footerEle.setTextContent("hello world");
+			Assert.assertEquals("hello world", footerEle.getTextContent());
+
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testAddtable() {
+		try {
+			//TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			Table tab = footer.addTable();
+			Assert.assertNotNull(tab);
+			Assert.assertTrue(2 == tab.getRowCount());
+			Assert.assertTrue(5 == tab.getColumnCount());
+			
+			TableTableElement tabEle = tab.getOdfElement();
+			System.out.println(tabEle);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetTableList() {
+		try {
+			//TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			Table tab = footer.addTable();
+			
+			List<Table> tabList = footer.getTableList();
+			Assert.assertEquals(tab, tabList.get(0));
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetTableBuilder() {
+		try {
+			//TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			//Table tab = footer.addTable();
+			
+			TableBuilder tb = footer.getTableBuilder();
+			Table tab = tb.newTable();
+			
+			Assert.assertNotNull(tab);
+			Assert.assertTrue(2 == tab.getRowCount());
+			Assert.assertTrue(5 == tab.getColumnCount());
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetVariableContainerElement() {
+		try {
+			//TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			OdfElement odfEle = footer.getVariableContainerElement();
+			
+			TableBuilder tb = footer.getTableBuilder();
+			Table tab = tb.newTable();
+			
+			Assert.assertNotNull(tab);
+			Assert.assertTrue(2 == tab.getRowCount());
+			Assert.assertTrue(5 == tab.getColumnCount());
+			
+			Node nod = odfEle.getFirstChild();
+			Assert.assertEquals("table:table", nod.getNodeName());
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testDeclareVariable() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			footer.declareVariable("footername", VariableType.USER);
+			
+			//validate
+			StyleFooterElement styleFoot = footer.getOdfElement();
+			Node nod = styleFoot.getFirstChild().getFirstChild();
+			NamedNodeMap nameMap = nod.getAttributes();
+			Node nodtext = nameMap.getNamedItem("text:name");
+			Assert.assertEquals("footername", nodtext.getNodeValue());
+			
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetVariableFieldByName() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			footer.declareVariable("footername", VariableType.USER);
+			VariableField vField = footer.getVariableFieldByName("footername");
+			String vName = vField.getVariableName();
+			
+			//validate
+			StyleFooterElement styleFoot = footer.getOdfElement();
+			Node nod = styleFoot.getFirstChild().getFirstChild();
+			NamedNodeMap nameMap = nod.getAttributes();
+			Node nodtext = nameMap.getNamedItem("text:name");
+			Assert.assertEquals(vName, nodtext.getNodeValue());
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("footerOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(FooterTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAppendNewSection() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Footer footer = doc.getFooter();
+			Section sect = footer.appendSection("Section1");
+			Assert.assertNotNull(sect);
+
+			StyleFooterElement styleFoot = footer.getOdfElement();
+			Node nod = styleFoot.getFirstChild();
+			NamedNodeMap nameMap = nod.getAttributes();
+			Node nodtext = nameMap.getNamedItem("text:name");
+			Assert.assertEquals("Section1", nodtext.getNodeValue());
+
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE,
+					null, e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/HeaderTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/HeaderTest.java
new file mode 100644
index 0000000..a6a9a82
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/HeaderTest.java
@@ -0,0 +1,267 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.style.StyleHeaderElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.field.VariableField;
+import org.odftoolkit.simple.common.field.VariableField.VariableType;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.table.Table.TableBuilder;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class HeaderTest {
+
+	String headerDocumentPath = "HeaderTableDocument.odt";
+
+	@Test
+	public void testAddTable() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			Assert.assertNotNull(header);
+
+			Table table = header.addTable();
+			table.setTableName("headerTable");
+			int rowCount = table.getRowCount();
+			int columnCount = table.getColumnCount();
+			String expectedCellValue = "header table cell";
+			table.getCellByPosition(1, 1).setStringValue(expectedCellValue);
+			Cell cell = table.getCellByPosition(4, 0);
+			cell.setImage(ResourceUtilities.getURI("image_list_item.png"));
+			// first page
+			header = doc.getHeader(true);
+			Assert.assertNotNull(header);
+
+			table = header.addTable();
+			table.setTableName("headerHTable");
+			doc.save(ResourceUtilities.newTestOutputFile(headerDocumentPath));
+			
+			// load the document again.
+			doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream(headerDocumentPath));
+			header = doc.getHeader();
+			table = header.getTableByName("headerTable");
+			Assert.assertEquals(rowCount, table.getRowCount());
+			Assert.assertEquals(columnCount, table.getColumnCount());
+			Assert.assertEquals(expectedCellValue, table.getCellByPosition(1, 1).getStringValue());
+			cell = table.getCellByPosition(4, 0);
+			Assert.assertEquals(34, cell.getBufferedImage().getHeight(null));
+			table.getColumnByIndex(4).setWidth(15);
+			
+			header = doc.getHeader(true);
+			table = header.getTableByName("headerHTable");
+			Assert.assertNotNull(table);
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testHeaderHidden() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			Header header = doc.getHeader();
+			Assert.assertEquals(true, header.isVisible());
+			header.setVisible(false);
+			Assert.assertEquals(false, header.isVisible());
+			doc.save(ResourceUtilities.newTestOutputFile("headerHiddenOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	@Test
+	public void testGetOdfElement() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("headerFooterHidden.odt"));
+			Header header = doc.getHeader();
+			StyleHeaderElement styleheader = header.getOdfElement();
+			Assert.assertNotNull(styleheader);
+			Assert.assertEquals("header", styleheader.getLocalName());
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("headerHiddenOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetTableList() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			Table tab = header.addTable();
+			
+			//validate
+			List<Table> listTab = header.getTableList();
+			Table tab1 = listTab.get(0);
+			Assert.assertNotNull(tab1);
+			Assert.assertEquals(tab, tab1);
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("headerTableOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetTableBuilder() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			
+			TableBuilder tabBuilder = header.getTableBuilder();
+			Table tab = tabBuilder.newTable();
+			Assert.assertNotNull(tab);
+			Assert.assertTrue(2 == tab.getRowCount());
+			Assert.assertTrue(5 == tab.getColumnCount());
+			
+			//validate
+			List<Table> listTab = header.getTableList();
+			Table tab1 = listTab.get(0);
+			Assert.assertNotNull(tab1);
+			Assert.assertEquals(tab, tab1);
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("headerTableOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetVariableContainerElement() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			
+			OdfElement odfEle = header.getVariableContainerElement();
+			
+			TableBuilder tb = header.getTableBuilder();
+			Table tab = tb.newTable();
+			
+			Assert.assertNotNull(tab);
+			Assert.assertTrue(2 == tab.getRowCount());
+			Assert.assertTrue(5 == tab.getColumnCount());
+			
+			Node nod = odfEle.getFirstChild();
+			Assert.assertEquals("table:table", nod.getNodeName());
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("headerTableOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testDeclareVariable() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			
+			header.declareVariable("headername", VariableType.USER);
+			
+			//validate
+			StyleHeaderElement styleHeader = header.getOdfElement();
+			Node nod = styleHeader.getFirstChild().getFirstChild();
+			NamedNodeMap nameMap = nod.getAttributes();
+			Node nodtext = nameMap.getNamedItem("text:name");
+			Assert.assertEquals("headername", nodtext.getNodeValue());
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("headerTableOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetVariableFieldByName() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			
+			header.declareVariable("headername", VariableType.USER);
+			VariableField vField = header.getVariableFieldByName("headername");
+			String vName = vField.getVariableName();
+			
+			//validate
+			StyleHeaderElement styleHead = header.getOdfElement();
+			Node nod = styleHead.getFirstChild().getFirstChild();
+			NamedNodeMap nameMap = nod.getAttributes();
+			Node nodtext = nameMap.getNamedItem("text:name");
+			Assert.assertEquals(vName, nodtext.getNodeValue());
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("headerTableOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAppendNewSection() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Header header = doc.getHeader();
+			Section sect = header.appendSection("Section1");
+			Assert.assertNotNull(sect);
+
+			StyleHeaderElement styleHead = header.getOdfElement();
+			Node nod = styleHead.getFirstChild();
+			NamedNodeMap nameMap = nod.getAttributes();
+			Node nodtext = nameMap.getNamedItem("text:name");
+			Assert.assertEquals("Section1", nodtext.getNodeValue());
+
+		} catch (Exception e) {
+			Logger.getLogger(HeaderTest.class.getName()).log(Level.SEVERE,
+					null, e);
+			Assert.fail(e.getMessage());
+		}
+
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/ParagraphStyleHandlerTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/ParagraphStyleHandlerTest.java
new file mode 100644
index 0000000..9240038
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/ParagraphStyleHandlerTest.java
@@ -0,0 +1,116 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.Document;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.TextLinePosition;
+
+public class ParagraphStyleHandlerTest {
+
+	private static final Logger LOGGER =  Logger.getLogger(ParagraphStyleHandlerTest.class.getName());
+
+	@Test
+	public void testGetParagraphByIndex() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph = doc.addParagraph("paragraphTest");
+			ParagraphStyleHandler paragraphHandler = paragraph.getStyleHandler();
+			
+			paragraphHandler.setCountry("English", Document.ScriptType.WESTERN);
+			
+			//validate
+			String country = paragraphHandler.getCountry(Document.ScriptType.WESTERN);
+			Assert.assertEquals("English", country);
+			
+			paragraphHandler.setCountry(null, Document.ScriptType.WESTERN);
+			
+			//validate
+			String country1 = paragraphHandler.getCountry(Document.ScriptType.WESTERN);
+			
+			Assert.assertNull(country1);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testParagraphStyleHandler.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetFont() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph = doc.addParagraph("paragraphTest");
+			ParagraphStyleHandler paragraphHandler = paragraph.getStyleHandler();
+			
+			Font fontBase = new Font("Arial", FontStyle.ITALIC, 10, Color.BLACK, TextLinePosition.THROUGH);
+			paragraphHandler.setFont(fontBase);
+			//validate
+			Font font = paragraphHandler.getFont(Document.ScriptType.WESTERN);
+			Assert.assertEquals(fontBase, font);
+			
+			paragraphHandler.setFont(fontBase, Locale.CHINESE);
+			//validate
+			Font font1 = paragraphHandler.getFont(Document.ScriptType.WESTERN);
+			Assert.assertEquals(fontBase, font1);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testParagraphStyleHandler.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+	
+	
+	@Test
+	public void testGetLanguage() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph = doc.addParagraph("paragraphTest");
+			ParagraphStyleHandler paragraphHandler = paragraph.getStyleHandler();
+			
+			paragraphHandler.setLanguage("English", Document.ScriptType.WESTERN);
+			
+			//validate
+			String language = paragraphHandler.getLanguage(Document.ScriptType.WESTERN);
+			
+			Assert.assertEquals("English", language);
+			
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("testParagraphStyleHandler.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/ParagraphTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/ParagraphTest.java
new file mode 100644
index 0000000..e59c3cc
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/ParagraphTest.java
@@ -0,0 +1,334 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.io.FileNotFoundException;
+import java.net.URI;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.StyleTypeDefinitions;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.HorizontalAlignmentType;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class ParagraphTest {
+
+	private static final String[] PLAIN_TEXT = { "nospace", "one space", "two  spaces", "three   spaces",
+			"   three leading spaces", "three trailing spaces   ", "one\ttab", "two\t\ttabs", "\tleading tab",
+			"trailing tab\t", "mixed   \t   spaces and tabs", "line" + System.getProperty("line.separator") + "break" };
+
+	private static final String[][] ELEMENT_RESULT = { { "nospace" }, { "one space" }, { "two ", "*s1", "spaces" },
+			{ "three ", "*s2", "spaces" }, { " ", "*s2", "three leading spaces" }, { "three trailing spaces ", "*s2" },
+			{ "one", "*t", "tab" }, { "two", "*t", "*t", "tabs" }, { "*t", "leading tab" }, { "trailing tab", "*t" },
+			{ "mixed ", "*s2", "*t", " ", "*s2", "spaces and tabs" }, { "line", "*n", "break" } };
+
+	private static final Logger LOGGER = Logger.getLogger(ParagraphTest.class.getName());
+
+	private static final String TEST_FILE = "CommentBreakHeadingDocument.odt";
+
+	@Test
+	public void testAppend() {
+		TextDocument doc;
+		try {
+			doc = TextDocument.newTextDocument();
+			int i;
+			for (i = 0; i < PLAIN_TEXT.length; i++) {
+				Paragraph para = Paragraph.newParagraph(doc);
+				para.appendTextContent(PLAIN_TEXT[i]);
+				compareResults(para.getOdfElement(), PLAIN_TEXT[i], ELEMENT_RESULT[i]);
+			}
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetTextContent() {
+		TextDocument doc;
+		try {
+			doc = TextDocument.newTextDocument();
+			int i;
+			for (i = 0; i < PLAIN_TEXT.length; i++) {
+				Paragraph para = Paragraph.newParagraph(doc);
+				para.setTextContent(PLAIN_TEXT[i]);
+				compareResults(para.getOdfElement(), PLAIN_TEXT[i], ELEMENT_RESULT[i]);
+
+				String content = para.getTextContent();
+				Assert.assertEquals(PLAIN_TEXT[i], content);
+			}
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testRemoveContent() {
+		TextDocument doc;
+		try {
+			doc = TextDocument.newTextDocument();
+			int i;
+			for (i = 0; i < PLAIN_TEXT.length; i++) {
+				Paragraph para = Paragraph.newParagraph(doc);
+				para.setTextContentNotCollapsed(PLAIN_TEXT[i]);
+				String content = para.getTextContent();
+				Assert.assertEquals(PLAIN_TEXT[i], content);
+				para.removeTextContent();
+				content = para.getTextContent();
+				Assert.assertEquals("", content);
+			}
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void compareResults(Element element, String input, String[] output) {
+		int i;
+		int nSpaces;
+		int nSpacesInAttribute;
+		Node node = element.getFirstChild();
+		for (i = 0; i < output.length; i++) {
+			if (output[i].startsWith("*")) {
+				Assert.assertEquals(Node.ELEMENT_NODE, node.getNodeType());
+				if (output[i].equals("*t")) {
+					Assert.assertEquals("tab", node.getLocalName());
+				} else if (output[i].equals("*n")) {
+					Assert.assertEquals("line-break", node.getLocalName());
+				} else {
+					nSpaces = Integer.parseInt(output[i].substring(2));
+					Assert.assertEquals(node.getLocalName(), "s");
+					nSpacesInAttribute = Integer.parseInt(((Element) node).getAttribute("text:c"));
+					Assert.assertEquals(nSpaces, nSpacesInAttribute);
+				}
+			} else {
+				Assert.assertEquals(Node.TEXT_NODE, node.getNodeType());
+				Assert.assertEquals(output[i], node.getTextContent());
+			}
+			node = node.getNextSibling();
+		}
+		Assert.assertEquals(node, null);
+	}
+
+	@Test
+	public void testGetParagraphByIndex() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph1 = doc.addParagraph("paragraph1");
+			Paragraph paragraphE = doc.addParagraph(null);
+			Paragraph paragraph2 = doc.addParagraph("p2");
+
+			Paragraph t1 = doc.getParagraphByIndex(1, false);
+			Assert.assertEquals(t1, paragraph1);
+			t1 = doc.getParagraphByIndex(3, false);
+			Assert.assertEquals(t1, paragraph2);
+			t1 = doc.getParagraphByIndex(1, true);
+			Assert.assertEquals(t1, paragraph2);
+			t1 = doc.getParagraphByReverseIndex(0, false);
+			Assert.assertEquals(t1, paragraph2);
+			t1 = doc.getParagraphByReverseIndex(2, false);
+			Assert.assertEquals(t1, paragraph1);
+			t1 = doc.getParagraphByReverseIndex(1, true);
+			Assert.assertEquals(t1, paragraph1);
+			doc.save(ResourceUtilities.newTestOutputFile("testGetParagraphByIndex.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetGetFont() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph1 = doc.addParagraph("paragraph1");
+			Font font1 = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 12, Color.BLACK,
+					StyleTypeDefinitions.TextLinePosition.THROUGH);
+			paragraph1.setFont(font1);
+			Font font11 = paragraph1.getFont();
+			LOGGER.info(font11.toString());
+			if (!font11.equals(font1)) {
+				Assert.fail();
+			}
+
+			Paragraph paragraph2 = doc.addParagraph("paragraph2");
+			Font font2 = new Font("Arial", StyleTypeDefinitions.FontStyle.ITALIC, 12, Color.RED,
+					StyleTypeDefinitions.TextLinePosition.UNDER);
+			paragraph2.setFont(font2);
+			Font font22 = paragraph2.getFont();
+			LOGGER.info(font22.toString());
+			if (!font22.equals(font2)) {
+				Assert.fail();
+			}
+
+			Paragraph paragraph3 = doc.addParagraph("paragraph3");
+			Font font3 = paragraph3.getFont();
+			LOGGER.info(font3.toString());
+			font3.setColor(Color.GREEN);
+			font3.setFontStyle(StyleTypeDefinitions.FontStyle.BOLD);
+			paragraph3.setFont(font3);
+			LOGGER.info(font3.toString());
+			Font font33 = paragraph3.getFont();
+			if (!font33.equals(font3)) {
+				Assert.fail();
+			}
+			doc.save(ResourceUtilities.newTestOutputFile("TestParagraphSetGetFont.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetHoriAlignment() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph paragraph1 = doc.addParagraph("paragraph1");
+
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.DEFAULT);
+			HorizontalAlignmentType align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.DEFAULT, align);
+
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.LEFT);
+			align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.LEFT, align);
+
+			paragraph1.setHorizontalAlignment(HorizontalAlignmentType.RIGHT);
+			align = paragraph1.getHorizontalAlignment();
+			Assert.assertEquals(HorizontalAlignmentType.RIGHT, align);
+
+			doc.save(ResourceUtilities.newTestOutputFile("TestParagraphSetGetHoriAlignment.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetSetHeading() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_FILE));
+			// test isHeading() and getHeadingLevel();
+			Paragraph headingParagraph = doc.getParagraphByIndex(0, true);
+			Assert.assertEquals(true, headingParagraph.isHeading());
+			Assert.assertEquals(1, headingParagraph.getHeadingLevel());
+			Paragraph textParagraph = doc.getParagraphByIndex(1, true);
+			Assert.assertEquals(false, textParagraph.isHeading());
+			Assert.assertEquals(0, textParagraph.getHeadingLevel());
+
+			// test applyHeading()
+			textParagraph.applyHeading();
+			Assert.assertEquals(true, textParagraph.isHeading());
+			Assert.assertEquals(1, textParagraph.getHeadingLevel());
+			textParagraph.applyHeading(true, 3);
+			Assert.assertEquals(true, textParagraph.isHeading());
+			Assert.assertEquals(3, textParagraph.getHeadingLevel());
+
+			doc.save(ResourceUtilities.newTestOutputFile("TestParagraphSetGetHeading.odt"));
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testHyperlink() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Paragraph para = doc.addParagraph("abc");
+			TextHyperlink link1 = para.applyHyperlink(new URI("http://odftoolkit.org"));
+			Assert.assertEquals("http://odftoolkit.org", link1.getURI().toString());
+			Assert.assertEquals("abc", link1.getTextContent());
+
+			String text = para.getTextContent();
+			Assert.assertEquals("abc", text);
+
+			para.removeTextContent();
+			text = para.getTextContent();
+			Assert.assertEquals("", text);
+			para.setTextContent("no hyperlink there ");
+			para.appendHyperlink("link to ibm", new URI("http://www.ibm.com"));
+
+			Paragraph heading = doc.addParagraph("Heading1");
+			TextHyperlink link2 = heading.applyHyperlink(new URI("mailto:daisy@odftoolkit.org"));
+			heading.applyHeading(true, 1);
+
+			link2.setTextContent("New Heading1");
+			link2.setURI(new URI("mailto:devin@odftoolkit.org"));
+			Assert.assertEquals("mailto:devin@odftoolkit.org", link2.getURI().toString());
+
+			Paragraph para3 = doc.addParagraph("world");
+			TextHyperlink link3 = para3.applyHyperlink(new URI("http://odftoolkit.org"));
+			link3.setTextContent("new world");
+			para3.appendTextContent("_prefix");
+			para3.appendTextContent("_nolink", false);
+
+			doc.save(ResourceUtilities.newTestOutputFile("TestParagraphHyperlink.odt"));
+
+			TextDocument textdoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream("TestParagraphHyperlink.odt"));
+			Iterator<TextHyperlink> linkList = textdoc.getParagraphByReverseIndex(1, true).getHyperlinkIterator();
+			if (linkList.hasNext()) {
+				TextHyperlink aLink = linkList.next();
+				Assert.assertEquals("New Heading1", aLink.getTextContent());
+				Assert.assertEquals("mailto:devin@odftoolkit.org", aLink.getURI().toString());
+			}
+
+			linkList = textdoc.getParagraphByReverseIndex(0, true).getHyperlinkIterator();
+			if (linkList.hasNext()) {
+				TextHyperlink aLink = linkList.next();
+				Assert.assertEquals("new world_prefix", aLink.getTextContent());
+				Assert.assertEquals("http://odftoolkit.org", aLink.getURI().toString());
+			}
+		} catch (Exception e) {
+			LOGGER.log(Level.SEVERE, e.getMessage(), e);
+			Assert.fail();
+		}
+	}
+        
+	@Test
+	public void testGetTextContentWithLibreOfficeFile() throws FileNotFoundException, Exception {
+		TextDocument document = TextDocument.loadDocument(ResourceUtilities.getAbsolutePath("Bell.odt"));
+		Paragraph paragraph = document.getParagraphByIndex(0, true);
+
+		Assert.assertEquals(
+			"Bell, based in Los Angeles, makes and distributes electronic articles, "
+			+ "computer and building products.", 
+			paragraph.getTextContent());
+	}
+        
+	@Test
+	public void shouldReturnMultipleLines() throws Exception {
+		final String expected = "Hello\tWorld!\twho \t ever read this, is stupid.\n\n\nReally!";
+		TextDocument document = TextDocument.newTextDocument();
+		Paragraph p = document.addParagraph(expected);
+		String textContent = p.getTextContent();
+		Assert.assertEquals(expected, textContent.replace("\r", ""));
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/SectionTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/SectionTest.java
new file mode 100644
index 0000000..2159455
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/SectionTest.java
@@ -0,0 +1,653 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.draw.DrawImageElement;
+import org.odftoolkit.odfdom.dom.element.table.TableTableElement;
+import org.odftoolkit.odfdom.pkg.OdfElement;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.list.List;
+import org.odftoolkit.simple.text.list.ListDecorator;
+import org.odftoolkit.simple.text.list.ListTest;
+import org.odftoolkit.simple.text.list.NumberDecorator;
+import org.odftoolkit.simple.text.list.OutLineDecorator;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+import sun.misc.BASE64Encoder;
+
+public class SectionTest {
+
+	@Test
+	public void testCopyPasteResource() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("ImageSection");
+			String newName = doc.appendSection(theSec, false).getName();
+			doc.save(ResourceUtilities.newTestOutputFile("NewSection.odt"));
+
+			TextDocument newDoc = TextDocument
+					.loadDocument(ResourceUtilities.getTestResourceAsStream("NewSection.odt"));
+			theSec = newDoc.getSectionByName("ImageSection");
+			Section newSec = newDoc.getSectionByName(newName);
+
+			XPath xpath = newDoc.getContentDom().getXPath();
+			DrawImageElement oldImage = (DrawImageElement) xpath.evaluate(".//draw:image", theSec.getOdfElement(),
+					XPathConstants.NODE);
+			DrawImageElement newImage = (DrawImageElement) xpath.evaluate(".//draw:image", newSec.getOdfElement(),
+					XPathConstants.NODE);
+			Assert.assertEquals(oldImage.getXlinkHrefAttribute(), newImage.getXlinkHrefAttribute());
+
+			OdfPackage packageDocument = newDoc.getPackage();
+			String imagePathPrefix = "Pictures/";
+			int count = 0;
+			Iterator<String> filePaths = packageDocument.getFilePaths().iterator();
+			while (filePaths.hasNext()) {
+				String path = filePaths.next();
+				if (path.startsWith(imagePathPrefix) && path.length() > imagePathPrefix.length())
+					count++;
+				if (count > 2)
+					break;
+			}
+			Assert.assertEquals(1, count);
+			// ---------resource copied------
+			doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			theSec = doc.getSectionByName("ImageSection");
+			newName = doc.appendSection(theSec, true).getName();
+			doc.save(ResourceUtilities.newTestOutputFile("NewSection1.odt"));
+
+			newDoc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("NewSection1.odt"));
+			theSec = newDoc.getSectionByName("ImageSection");
+			newSec = newDoc.getSectionByName(newName);
+
+			xpath = newDoc.getContentDom().getXPath();
+			oldImage = (DrawImageElement) xpath.evaluate(".//draw:image", theSec.getOdfElement(), XPathConstants.NODE);
+			newImage = (DrawImageElement) xpath.evaluate(".//draw:image", newSec.getOdfElement(), XPathConstants.NODE);
+			if (oldImage.getXlinkHrefAttribute().equals(newImage.getXlinkHrefAttribute()))
+				Assert.fail();
+
+			packageDocument = newDoc.getPackage();
+			count = 0;
+			filePaths = packageDocument.getFilePaths().iterator();
+			while (filePaths.hasNext()) {
+				String path = filePaths.next();
+				if (path.startsWith(imagePathPrefix) && path.length() > imagePathPrefix.length())
+					count++;
+				if (count > 2)
+					break;
+			}
+			Assert.assertEquals(2, count);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testForeignCopyPaste() {
+		try {
+			TextDocument newDoc = TextDocument.newTextDocument();
+
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Iterator<Section> sections = doc.getSectionIterator();
+
+			int count = 0;
+			while (sections.hasNext()) {
+				Section aSection = sections.next();
+				count++;
+				newDoc.newParagraph("----Start of " + aSection.getName() + "---------");
+				newDoc.appendSection(aSection, false);
+				newDoc.newParagraph("----End of " + aSection.getName() + "---------");
+				newDoc.newParagraph();
+				newDoc.newParagraph();
+				newDoc.newParagraph();
+			}
+			newDoc.save(ResourceUtilities.newTestOutputFile("NewNewSections.odt"));
+
+			newDoc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("NewNewSections.odt"));
+			sections = newDoc.getSectionIterator();
+			int i = 0;
+			while (sections.hasNext()) {
+				sections.next();
+				i++;
+			}
+			// an embed section is counted two times
+			Assert.assertEquals(count + 1, i);
+
+			OdfPackage packageDocument = newDoc.getPackage();
+			String imagePathPrefix = "Pictures/";
+			count = 0;
+			Iterator<String> filePaths = packageDocument.getFilePaths().iterator();
+			while (filePaths.hasNext()) {
+				String path = filePaths.next();
+				if (path.startsWith(imagePathPrefix) && path.length() > imagePathPrefix.length())
+					count++;
+				if (count > 2)
+					break;
+			}
+			Assert.assertEquals(1, count);
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testCopyPasteAll() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Iterator<Section> sections = doc.getSectionIterator();
+
+			int count = 0;
+			while (sections.hasNext()) {
+				Section aSection = sections.next();
+				count++;
+				doc.newParagraph("----Start of " + aSection.getName() + "---------");
+				doc.appendSection(aSection, false);
+				doc.newParagraph("----End of " + aSection.getName() + "---------");
+				doc.newParagraph();
+				doc.newParagraph();
+				doc.newParagraph();
+			}
+			doc.save(ResourceUtilities.newTestOutputFile("NewSections.odt"));
+
+			doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("NewSections.odt"));
+			sections = doc.getSectionIterator();
+			int i = 0;
+			while (sections.hasNext()) {
+				sections.next();
+				i++;
+			}
+			// an embed section is counted two times
+			Assert.assertEquals(count * 2 + 1, i);
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testAppendNewSection() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("Paragraph1");
+			Section section = doc.appendSection("Section1");
+			section.addParagraph("Here's a section.");
+			Assert.assertNotNull(section);
+			Assert.assertEquals(section.getName(), "Section1");
+			Assert.assertEquals(section.getParagraphByIndex(0, true)
+					.getTextContent(), "Here's a section.");
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	private class MyDigestGenerator implements ProtectionKeyDigestProvider {
+
+//		@Override
+		public String generateHashKey(String passwd) {
+
+			String hashKey = null;
+			if (passwd != null && passwd.length() > 0) {
+				MessageDigest md;
+				try {
+					byte[] pwd = passwd.getBytes();
+					md = MessageDigest.getInstance("MD5");
+					byte[] byteCode = md.digest(pwd);
+					BASE64Encoder encoder = new BASE64Encoder();
+					hashKey = encoder.encode(byteCode);
+				} catch (NoSuchAlgorithmException e) {
+					Logger.getLogger(Section.class.getName(),
+							"Fail to initiate the digest method.");
+				}
+			}
+			return hashKey;
+
+		}
+
+//		@Override
+		public String getProtectionKeyDigestAlgorithm() {
+			return "http://www.w3.org/2000/09/#md5";
+		}
+
+	}
+
+	@Test
+	public void testSetProtectionKeyDigestProvider() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Section section = doc.appendSection("Section1");
+			section.addParagraph("Section 1");
+			Assert.assertNotNull(section);
+
+			section.setProtectionKeyDigestProvider(new MyDigestGenerator());
+			section.setProtectedWithPassword("12345");
+			Assert.assertEquals(true, section.isProtected());
+			Assert.assertEquals("gnzLDuqKcGxMNKFokfhOew==", section
+					.getProtectedPassword());
+			Assert.assertEquals("http://www.w3.org/2000/09/#md5", section
+					.getProtectionKeyDigestAlgorithm());
+
+			section.setProtectionKeyDigestProvider(null);
+			section.setProtectedWithPassword("12345");
+			Assert.assertEquals(true, section.isProtected());
+			Assert.assertEquals("LyQWujvPXbGDYsrSDKkAiVFavg8=", section
+					.getProtectedPassword());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testSetProtectSection() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("Paragraph1");
+			String secName = "Section1";
+			Section section = doc.appendSection(secName);
+			Assert.assertNotNull(section);
+
+			section.setProtectedWithPassword("12345");
+			Assert.assertEquals(true, section.isProtected());
+			Assert.assertEquals("LyQWujvPXbGDYsrSDKkAiVFavg8=", section
+					.getProtectedPassword());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+
+			section.setProtectedWithPassword("");
+			Assert.assertEquals(true, section.isProtected());
+			Assert.assertNull(section.getProtectedPassword());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+
+			section.setProtected(false);
+			Assert.assertEquals(false, section.isProtected());
+			Assert.assertNull(section.getProtectedPassword());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+
+			section.setProtectedWithPassword(null);
+			Assert.assertEquals(false, section.isProtected());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+			Assert.assertNull(section.getProtectedPassword());
+
+			section.setProtected(true);
+			Assert.assertEquals(true, section.isProtected());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+			Assert.assertNull(section.getProtectedPassword());
+
+			section.setProtectedWithPassword("12345");
+			Assert.assertEquals(true, section.isProtected());
+			Assert.assertEquals("LyQWujvPXbGDYsrSDKkAiVFavg8=", section
+					.getProtectedPassword());
+			Assert.assertEquals("http://www.w3.org/2000/09/xmldsig#sha1",
+					section.getProtectionKeyDigestAlgorithm());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testRemoveSection() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("Section11");
+			Assert.assertNull(theSec);
+			Iterator<Section> sections = doc.getSectionIterator();
+			int count = 0;
+			while (sections.hasNext()) {
+				sections.next();
+				count++;
+			}
+
+			theSec = doc.getSectionByName("Section1");
+			theSec.remove();
+			sections = doc.getSectionIterator();
+			int i = 0;
+			while (sections.hasNext()) {
+				sections.next();
+				i++;
+			}
+			Assert.assertEquals(count - 1, i);
+
+			theSec = doc.getSectionByName("ImageSection");
+			theSec.remove();
+			OdfPackage packageDocument = doc.getPackage();
+			String imagePathPrefix = "Pictures/";
+			count = 0;
+			Iterator<String> filePaths = packageDocument.getFilePaths().iterator();
+			while (filePaths.hasNext()) {
+				String path = filePaths.next();
+				if (path.startsWith(imagePathPrefix) && path.length() > imagePathPrefix.length())
+					count++;
+				if (count > 1)
+					break;
+			}
+			Assert.assertEquals(0, count);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testSetGetName() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("ImageSection");
+			theSec.setName("ImageSection_NewName");
+			doc.save(ResourceUtilities.newTestOutputFile("NewSection.odt"));
+
+			TextDocument newDoc = TextDocument
+					.loadDocument(ResourceUtilities.getTestResourceAsStream("NewSection.odt"));
+			theSec = newDoc.getSectionByName("ImageSection");
+			Assert.assertNull(theSec);
+			theSec = newDoc.getSectionByName("ImageSection_NewName");
+			Assert.assertNotNull(theSec);
+			Assert.assertEquals("ImageSection_NewName", theSec.getName());
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	@Test
+	public void testAddParagraph() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("ImageSection");
+			
+			Paragraph para = theSec.addParagraph("paragraph");
+			String paracontent = para.getTextContent();
+			Assert.assertEquals("paragraph", paracontent);
+			
+			OdfElement odfEle = theSec.getParagraphContainerElement();
+			Assert.assertEquals("paragraph", odfEle.getLastChild().getTextContent());
+			
+			boolean flag = theSec.removeParagraph(para);
+			if(flag){
+				OdfElement odfEle1 = theSec.getParagraphContainerElement();
+				Assert.assertTrue(odfEle1.getLastChild().getTextContent() != "paragraph");
+			}
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetParagraphIterator() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("ImageSection");
+			
+			Paragraph para = theSec.addParagraph("paragraph");
+			String paracontent = para.getTextContent();
+			Assert.assertEquals("paragraph", paracontent);
+			
+			boolean flag = false;
+			Iterator<Paragraph> iter = theSec.getParagraphIterator();
+			while(iter.hasNext()){
+				Paragraph parai = iter.next();
+				if("paragraph".equals(parai.getTextContent()))
+						flag = true;
+			}
+			
+			Assert.assertTrue(flag);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetParagraphByIndex() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("ImageSection");
+			
+			Paragraph para = theSec.addParagraph("paragraph");
+			String paracontent = para.getTextContent();
+			Assert.assertEquals("paragraph", paracontent);
+			
+			Paragraph para1 = theSec.getParagraphByIndex(2, true);
+			Assert.assertEquals("paragraph", para1.getTextContent());
+			
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+	
+	
+	@Test
+	public void testGetParagraphByReverseIndex() {
+		try {
+			TextDocument doc = TextDocument.loadDocument(ResourceUtilities.getTestResourceAsStream("Sections.odt"));
+			Section theSec = doc.getSectionByName("ImageSection");
+			Section theSec2 = doc.getSectionByName("ImageSection");
+			
+			Paragraph para = theSec.addParagraph("paragraph");
+			String paracontent = para.getTextContent();
+			Assert.assertEquals("paragraph", paracontent);
+			
+			Paragraph para1 = theSec.getParagraphByReverseIndex(0, true);
+			Assert.assertEquals("paragraph", para1.getTextContent());
+			
+			Paragraph para2 = theSec.getParagraphByIndex(2, true);
+			Assert.assertEquals("paragraph", para2.getTextContent());
+			
+			boolean flag = theSec.equals(para);
+			Assert.assertTrue(!flag);
+			flag = theSec.equals(theSec2);
+			Assert.assertTrue(flag);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testAddTable() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Section theSec = doc.appendSection("TableSection");
+
+			Table table1 = theSec.addTable();
+			table1.getCellByPosition("A1").addParagraph("A1");
+			OdfElement odfEle = theSec.getTableContainerElement();
+			Assert.assertEquals("A1", Table.getInstance(
+					(TableTableElement) odfEle.getLastChild())
+					.getCellByPosition("A1").getDisplayText());
+
+			Table table2 = theSec.addTable(3, 3);
+			table2.getCellByPosition("C3").addParagraph("C3");
+			odfEle = theSec.getTableContainerElement();
+			Assert.assertEquals("C3", Table.getInstance(
+					(TableTableElement) odfEle.getLastChild())
+					.getCellByPosition("C3").getDisplayText());
+
+			table1.remove();
+			table2.remove();
+			OdfElement odfEle1 = theSec.getTableContainerElement();
+			Assert.assertNull(odfEle1.getLastChild());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testGetTableByName() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Section sect = doc.appendSection("TableSeciton");
+			sect.addTable(2, 2);
+			sect.addTable(2, 2);
+			sect.addTable(5, 5).getCellByPosition("E5").setBooleanValue(true);
+			Cell cell = sect.getTableByName("Table3").getCellByPosition(4, 4);
+			Assert.assertNotNull(cell);
+			Assert.assertTrue(cell.getBooleanValue());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testAddRemoveList() {
+
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			Section sect = doc.appendSection("List Section");
+
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+			ListDecorator outLineDecorator = new OutLineDecorator(doc);
+			String[] subItemContents = { "sub list item 1", "sub list item 2",
+					"sub list item 3" };
+
+			List list1 = new List(sect);
+			boolean removeResult = sect.removeList(list1);
+			Assert.assertTrue(removeResult);
+
+			List list2 = new List(sect, numberDecorator);
+			list2.addItems(subItemContents);
+			Assert.assertEquals(ListDecorator.ListType.NUMBER, list2.getType());
+			removeResult = sect.removeList(list2);
+			Assert.assertTrue(removeResult);
+
+			List list3 = new List(sect, "Bullet List", null);
+			list3.addItems(subItemContents);
+			Assert.assertEquals(ListDecorator.ListType.BULLET, list3.getType());
+			removeResult = sect.removeList(list3);
+			Assert.assertTrue(removeResult);
+
+			List list4 = sect.addList();
+			removeResult = sect.removeList(list4);
+			Assert.assertTrue(removeResult);
+
+			List list5 = sect.addList(outLineDecorator);
+			list5.addItems(subItemContents);
+			Assert.assertEquals(ListDecorator.ListType.NUMBER, list5.getType());
+			removeResult = sect.removeList(list5);
+			Assert.assertTrue(removeResult);
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null,
+					e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testIterateList() {
+		try {
+
+			TextDocument doc = TextDocument.newTextDocument();
+			Section sect = doc.appendSection("List Section");
+
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+			ListDecorator outLineDecorator = new OutLineDecorator(doc);
+			String[] subItemContents = { "sub list item 1", "sub list item 2",
+					"sub list item 3" };
+
+			// create 2 lists
+			new List(sect, numberDecorator);
+			sect.addList().addItems(subItemContents);
+
+			Iterator<List> listIterator = sect.getListIterator();
+			int i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(2, i);
+
+			// add 2 new lists.
+			sect.addList(outLineDecorator);
+			List list = sect.addList();
+			listIterator = sect.getListIterator();
+			i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(4, i);
+
+			// remove 1 list.
+			sect.removeList(list);
+			listIterator = sect.getListIterator();
+			i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(3, i);
+
+			// remove all of the lists.
+			sect.clearList();
+			listIterator = sect.getListIterator();
+			i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(0, i);
+
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null,
+					e);
+			Assert.fail(e.getMessage());
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/SpanTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/SpanTest.java
new file mode 100644
index 0000000..5e7c3fa
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/SpanTest.java
@@ -0,0 +1,154 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text;
+
+import java.net.URI;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.type.Color;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.common.navigation.TextNavigation;
+import org.odftoolkit.simple.common.navigation.TextSelection;
+import org.odftoolkit.simple.style.DefaultStyleHandler;
+import org.odftoolkit.simple.style.Font;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.FontStyle;
+import org.odftoolkit.simple.style.StyleTypeDefinitions.TextLinePosition;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class SpanTest {
+
+	@Test
+	public void testSpan() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("This is a test paragraph!");
+			TextNavigation navigation = new TextNavigation("test", doc);
+			TextSelection sel = (TextSelection) navigation.nextSelection();
+			Span span = Span.newSpan(sel);
+			TextHyperlink link = span.applyHyperlink(new URI("http://www.ibm.com"));
+			DefaultStyleHandler handler = span.getStyleHandler();
+			Font font1Base = new Font("Arial", FontStyle.ITALIC, 10, Color.BLACK, TextLinePosition.THROUGH);
+			handler.getTextPropertiesForWrite().setFont(font1Base);
+			doc.save(ResourceUtilities.newTestOutputFile("spantest.odt"));
+
+			String content = span.getTextContent();
+			Assert.assertEquals("test", content);
+			span.setTextContent("new test");
+			Assert.assertEquals("new test", span.getTextContent());
+			doc.save(ResourceUtilities.newTestOutputFile("spantest.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(SpanTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	@Test
+	public void testRemoveTextContent() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			
+			Iterator<Paragraph> paraA = doc.getParagraphIterator();
+			while(paraA.hasNext()){
+				Paragraph pp = paraA.next();
+				doc.removeParagraph(pp);
+			}
+			
+			doc.addParagraph("This is a test paragraph!");
+			
+			TextNavigation navigation = new TextNavigation("test", doc);
+			TextSelection sel = (TextSelection) navigation.nextSelection();
+			Span span = Span.newSpan(sel);
+			
+			span.removeTextContent();
+			boolean flag = false;
+			Iterator<Paragraph> parai = doc.getParagraphIterator();
+			while(parai.hasNext()){
+				Paragraph pp = parai.next();
+				if("This is a  paragraph!".equals(pp.getTextContent()))
+					flag = true;
+			}
+			Assert.assertTrue(flag);
+
+			//save
+			doc.save(ResourceUtilities.newTestOutputFile("spantest.odt"));
+
+		} catch (Exception e) {
+			Logger.getLogger(SpanTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	@Test
+	public void testAppendTextContent() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("This is a test paragraph!");
+			
+			TextNavigation navigation = new TextNavigation("test", doc);
+			TextSelection sel = (TextSelection) navigation.nextSelection();
+			Span span = Span.newSpan(sel);
+			
+			span.appendTextContent("hello world.");
+			Assert.assertEquals("testhello world.", span.getTextContent());
+
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("spantest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(SpanTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+	
+	@Test
+	public void testAppendTextContentPara() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			doc.addParagraph("This is a test paragraph!");
+			
+			TextNavigation navigation = new TextNavigation("test", doc);
+			TextSelection sel = (TextSelection) navigation.nextSelection();
+			Span span = Span.newSpan(sel);
+			
+			span.appendTextContent("hello world.", true);
+			Assert.assertEquals("testhello world.", span.getTextContent());
+			
+			span.appendTextContent("hello world.", false);
+			Assert.assertEquals("testhello world.hello world.", span.getTextContent());
+
+			//save
+			//doc.save(ResourceUtilities.newTestOutputFile("spantest.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(SpanTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+	
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/TableOfContentTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/TableOfContentTest.java
new file mode 100644
index 0000000..60b85c2
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/TableOfContentTest.java
@@ -0,0 +1,210 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+ */
+
+package org.odftoolkit.simple.text;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.odfdom.dom.element.text.TextHElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTableOfContentElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkElement;
+import org.odftoolkit.odfdom.dom.element.text.TextTocMarkStartElement;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.style.TOCStyle;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+import org.w3c.dom.Node;
+
+public class TableOfContentTest {
+	private static final Logger LOG = Logger.getLogger(TableOfContentTest.class
+			.getName());
+
+	@Test
+	public void testCreateDefaultTOC() {
+		try {
+			TextDocument doc = buildSample();
+			Assert.assertNotNull(doc);
+			
+			Paragraph paragraph1 = doc.getParagraphByIndex(0, true);
+			TextTableOfContentElement textTableOfContentElement = doc.createDefaultTOC(paragraph1,false);
+			Assert.assertNotNull(textTableOfContentElement);	
+			
+			Node pnode = paragraph1.getOdfElement().getNextSibling();
+			
+			if (pnode.equals(textTableOfContentElement)) {
+				Assert.assertTrue(true);
+			} else {
+				Assert.fail();
+			}
+			
+			
+			try {
+				// Should throw error!
+				doc.createDefaultTOC(null, true);
+				Assert.fail();
+			} catch (Exception e) {
+//				LOG.log(Level.SEVERE, null, e);
+				Assert.assertTrue(true);
+			}
+			doc.save(ResourceUtilities.newTestOutputFile("DefaultTOC.odt"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+	}
+
+	@Test
+	public void testCreateStyleTOC() {
+		try {
+			TextDocument doc = buildSample();
+			Assert.assertNotNull(doc);
+
+			TOCStyle tocstyle = new TOCStyle();
+			tocstyle.addStyle("User_20_Index_20_1", 1);
+			tocstyle.addStyle("User_20_Index_20_2", 2);
+			tocstyle.addStyle("User_20_Index_20_3", 3);
+			tocstyle.addStyle("User_20_Index_20_4", 4);
+			tocstyle.addStyle("User_20_Index_20_5", 5);
+			tocstyle.addStyle("User_20_Index_20_6", 6);
+			tocstyle.addStyle("User_20_Index_20_7", 7);
+			tocstyle.addStyle("User_20_Index_20_8", 8);
+			tocstyle.addStyle("User_20_Index_20_9", 9);
+			tocstyle.addStyle("User_20_Index_20_10", 10);
+			LOG.info(tocstyle.toString());
+
+			Paragraph paragraph1 = doc.getParagraphByIndex(0, true);
+			TextTableOfContentElement textTableOfContentElement = doc
+					.createTOCwithStyle(paragraph1, tocstyle, true);
+			Assert.assertNotNull(textTableOfContentElement);
+			Node pnode = textTableOfContentElement.getNextSibling();
+			if (pnode.equals(paragraph1.getOdfElement())) {
+				Assert.assertTrue(true);
+			} else {
+				Assert.fail();
+			}
+			try {
+				// Should throw error!
+				doc.createTOCwithStyle(null, tocstyle, true);
+				Assert.fail();
+			} catch (Exception e) {
+//				LOG.log(Level.SEVERE, null, e);
+				Assert.assertTrue(true);
+			}
+			doc.save(ResourceUtilities.newTestOutputFile("TOC_Styles.odt"));
+		} catch (Exception e) {
+			LOG.log(Level.SEVERE, null, e);
+			Assert.fail();
+		}
+
+	}
+
+	private TextDocument buildSample() throws Exception {
+		TextDocument doc = TextDocument.newTextDocument();
+		Paragraph p1 = doc
+				.addParagraph("1.This is a test paragraph apply with Heading 1 style!");
+		p1.applyHeading();
+		Paragraph p11 = doc
+				.addParagraph("1.1This is a test paragraph apply with heading 2 style!");
+		p11.applyHeading(true, 2);
+		Paragraph p2 = doc
+				.addParagraph("2.This is a test paragraph apply with Heading 1 style!");
+		p2.applyHeading();
+		Paragraph p21 = doc
+				.addParagraph("2.1This is a test paragraph apply with Heading 2 style!");
+		p21.applyHeading(true, 2);
+		Paragraph p22 = doc
+				.addParagraph("2.2This is a test paragraph apply with Heading 2 style!");
+		p22.applyHeading(true, 2);
+		Paragraph p221 = doc
+				.addParagraph("2.2.1This is a test paragraph apply with Heading 3 style!");
+		p221.applyHeading(true, 3);
+		Paragraph p222 = doc
+				.addParagraph("2.2.2This is a test paragraph apply with Heading 3 style!");
+		p222.applyHeading(true, 3);
+		Paragraph p23 = doc
+				.addParagraph("2.3This is a test paragraph apply with Heading 2 style!");
+		p23.applyHeading(true, 2);
+		Paragraph p3 = doc
+				.addParagraph("3.This is a test paragraph apply with ");
+		p3.applyHeading();
+		TextHElement h3 = (TextHElement) p3.getOdfElement();
+		TextTocMarkElement TextTocMark = h3
+				.newTextTocMarkElement("TextTocMarkElement");
+		TextTocMark.setTextOutlineLevelAttribute(2);
+		h3.newTextNode("Heading ");
+		TextTocMarkStartElement TextTocMarkStart = h3
+				.newTextTocMarkStartElement("IMark159230668");
+		TextTocMarkStart.setTextOutlineLevelAttribute(3);
+		h3.newTextNode("1 style!");
+		h3.newTextTocMarkEndElement("IMark159230668");
+
+		Paragraph p4 = doc
+				.addParagraph("4.This is a test paragraph apply with User Index 1 style!");
+		p4.getOdfElement().setStyleName("User_20_Index_20_1");
+
+		Paragraph p5 = doc
+				.addParagraph("5.This is a test paragraph apply with User Index 1 style!");
+		p5.getOdfElement().setStyleName("User_20_Index_20_1");
+
+		Paragraph p51 = doc
+				.addParagraph("5.1 This is a test paragraph apply with User Index 2 style!");
+		p51.getOdfElement().setStyleName("User_20_Index_20_2");
+
+		Paragraph p52 = doc
+				.addParagraph("5.2 This is a test paragraph apply with User Index 2 style!");
+		p52.getOdfElement().setStyleName("User_20_Index_20_2");
+
+		Paragraph p6 = doc
+				.addParagraph("6.This is a test paragraph apply with User Index 1 style!");
+		p6.getOdfElement().setStyleName("User_20_Index_20_1");
+
+		Paragraph p62 = doc
+				.addParagraph("6.1This is a test paragraph apply with User Index 2 style!");
+		p62.getOdfElement().setStyleName("User_20_Index_20_2");
+		Paragraph p63 = doc
+				.addParagraph("6.1.1This is a test paragraph apply with User Index 3 style!");
+		p63.getOdfElement().setStyleName("User_20_Index_20_3");
+		Paragraph p64 = doc
+				.addParagraph("6.1.1.1This is a test paragraph apply with User Index 4 style!");
+		p64.getOdfElement().setStyleName("User_20_Index_20_4");
+		Paragraph p65 = doc
+				.addParagraph("6.1.1.1.1This is a test paragraph apply with User Index 5 style!");
+		p65.getOdfElement().setStyleName("User_20_Index_20_5");
+		Paragraph p66 = doc
+				.addParagraph("6.1.1.1.1.1This is a test paragraph apply with User Index 6 style!");
+		p66.getOdfElement().setStyleName("User_20_Index_20_6");
+		Paragraph p67 = doc
+				.addParagraph("6.1.1.1.1.1.1.1This is a test paragraph apply with User Index 7 style!");
+		p67.getOdfElement().setStyleName("User_20_Index_20_7");
+		Paragraph p68 = doc
+				.addParagraph("6.1.1.1.1.1.1.1.1This is a test paragraph apply with User Index 8 style!");
+		p68.getOdfElement().setStyleName("User_20_Index_20_8");
+		Paragraph p69 = doc
+				.addParagraph("6.1.1.1.1.1.1.1.1.1This is a test paragraph apply with User Index 9 style!");
+		p69.getOdfElement().setStyleName("User_20_Index_20_9");
+		Paragraph p60 = doc
+				.addParagraph("6.1.1.1.1.1.1.1.1.1.1This is a test paragraph apply with User Index 10 style!");
+		p60.getOdfElement().setStyleName("User_20_Index_20_10");
+		return doc;
+	}
+
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/list/ListItemTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/list/ListItemTest.java
new file mode 100644
index 0000000..4094ed4
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/list/ListItemTest.java
@@ -0,0 +1,220 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ListItemTest {
+
+	private final static String SAMPLE_LIST_DOCUMENT = "testList.odt";
+    private static final String SAMPLE_LIST_DOCUMENT_2 = "testList2.odt";
+	private String[] subItemContents = { "sub list item 1", "sub list item 2", "sub list item 3" };
+
+	@Test
+	public void testGetSetTextContent() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			if (listIterator.hasNext()) {
+				List list = listIterator.next();
+				ListItem item = list.getItem(0);
+				String itemText = item.getTextContent();
+				Assert.assertEquals("bullet item1", itemText);
+				String content = "new content";
+				item.setTextContent(content);
+				Assert.assertEquals(content, item.getTextContent());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetStartNumber() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			if (listIterator.hasNext()) {
+				List list = listIterator.next();
+				list = listIterator.next();
+				ListItem item = list.getItem(0);
+				Integer startNumber = item.getStartNumber();
+				Assert.assertNull(startNumber);
+				item.setStartNumber(4);
+				startNumber = item.getStartNumber();
+				Assert.assertEquals(4, startNumber.intValue());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetNumberFormat() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			if (listIterator.hasNext()) {
+				List list = listIterator.next();
+				list = listIterator.next();
+				ListItem item = list.getItem(0);
+				String numberFormat = item.getNumberFormat();
+				Assert.assertNull(numberFormat);
+				item.setNumberFormat("Mon");
+				numberFormat = item.getNumberFormat();
+				Assert.assertEquals("Mon", numberFormat);
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetOwnerList() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			if (listIterator.hasNext()) {
+				List list = listIterator.next();
+				ListItem item = list.getItem(0);
+				List ownerList = item.getOwnerList();
+				Assert.assertEquals(list.getOdfElement(), ownerList.getOdfElement());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetIndex() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			if (listIterator.hasNext()) {
+				List list = listIterator.next();
+				java.util.List<ListItem> items = list.getItems();
+				int i = 0;
+				for (ListItem item : items) {
+					Assert.assertEquals(i, item.getIndex());
+					i++;
+				}
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testAddRemoveIterateSubList() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			ListDecorator bulletDecorator = new BulletDecorator(odtdoc);
+			ListDecorator numberDecorator = new NumberDecorator(odtdoc);
+			ListDecorator imageDecorator = new ImageDecorator(odtdoc, ResourceUtilities.getURI("image_list_item.png"));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+
+			if (listIterator.hasNext()) {
+				List list = listIterator.next();
+				// add list.
+				ListContainer container = list.getItem(0);
+				org.odftoolkit.simple.text.list.List bulletList = container.addList(bulletDecorator);
+				bulletList.addItems(subItemContents);
+				org.odftoolkit.simple.text.list.List numberList = container.addList(numberDecorator);
+				numberList.addItems(subItemContents);
+				org.odftoolkit.simple.text.list.List imageList = container.addList(imageDecorator);
+				imageList.addItems(subItemContents);
+				// iterate list
+				Iterator<org.odftoolkit.simple.text.list.List> lists = container.getListIterator();
+				int i = 0;
+				while (lists.hasNext()) {
+					lists.next();
+					i++;
+				}
+				Assert.assertEquals(3, i);
+				// remove list
+				container.clearList();
+				Assert.assertFalse(container.getListIterator().hasNext());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+    
+    @Test
+    public void testListIterator()  {
+        try {
+            // load test list container, which contains 2 lists.
+			TextDocument odtdoc = TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT_2));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+            
+            final List bodyList = listIterator.next();
+            Assert.assertEquals("body list should have 2 items", 2, bodyList.size());
+            
+            Assert.assertTrue("iterator should have 1 more list (in the Section)", listIterator.hasNext());
+                        
+            final List sectionList = listIterator.next();
+            Assert.assertEquals("section list should have 3 items", 3, sectionList.size());
+            
+            Assert.assertFalse("iterator should have no more lists", listIterator.hasNext());
+        } catch (Exception e) {
+            Logger.getLogger(ListItemTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+}
+    }
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java b/trunk/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java
new file mode 100644
index 0000000..d842b14
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java
@@ -0,0 +1,405 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.odftoolkit.simple.TextDocument;
+import org.odftoolkit.simple.table.Cell;
+import org.odftoolkit.simple.table.Table;
+import org.odftoolkit.simple.text.list.ListDecorator.ListType;
+import org.odftoolkit.simple.utils.ResourceUtilities;
+
+public class ListTest {
+
+	private final static String SAMPLE_LIST_DOCUMENT = "testList.odt";
+	private String[] numberItemContents = { "number item 1", "number item 2", "number item 3" };
+
+	@Test
+	public void testCreateRemoveList() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+
+			List list1 = new List(doc);
+			boolean removeResult = doc.removeList(list1);
+			Assert.assertTrue(removeResult);
+
+			List list2 = new List(doc, numberDecorator);
+			Assert.assertEquals(ListDecorator.ListType.NUMBER, list2.getType());
+			removeResult = doc.removeList(list2);
+			Assert.assertTrue(removeResult);
+
+			List list3 = new List(doc, "List Header1", numberDecorator);
+			Assert.assertEquals(ListDecorator.ListType.NUMBER, list3.getType());
+			removeResult = doc.removeList(list3);
+			Assert.assertTrue(removeResult);
+
+			List list4 = doc.addList();
+			removeResult = doc.removeList(list4);
+			Assert.assertTrue(removeResult);
+
+			List list5 = doc.addList(numberDecorator);
+			Assert.assertEquals(ListDecorator.ListType.NUMBER, list5.getType());
+			removeResult = doc.removeList(list5);
+			Assert.assertTrue(removeResult);
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testIterateList() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			int i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(2, i);
+
+			// add 2 new lists.
+			odtdoc.addList();
+			List list = odtdoc.addList();
+			listIterator = odtdoc.getListIterator();
+			i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(4, i);
+
+			// remove 1 list.
+			odtdoc.removeList(list);
+			listIterator = odtdoc.getListIterator();
+			i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(3, i);
+
+			// remove all of the lists.
+			odtdoc.clearList();
+			listIterator = odtdoc.getListIterator();
+			i = 0;
+			while (listIterator.hasNext()) {
+				listIterator.next();
+				i++;
+			}
+			Assert.assertEquals(0, i);
+
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetHeader() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			List list;
+			if (listIterator.hasNext()) {
+				list = listIterator.next();
+				Assert.assertEquals("Bullet List Header1\nBullet List Header2", list.getHeader());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+
+			if (listIterator.hasNext()) {
+				list = listIterator.next();
+				Assert.assertEquals("Number List Header", list.getHeader());
+				String newHeader = "New Header.";
+				list.setHeader(newHeader);
+				Assert.assertEquals(newHeader, list.getHeader());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetAddReplaceItems() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			List list;
+			if (listIterator.hasNext()) {
+				list = listIterator.next();
+				// get item
+				ListItem item = list.getItem(0);
+				Assert.assertEquals("bullet item1", item.getTextContent());
+				item = list.getItem(2);
+				Assert.assertEquals("item3 with a bullet list", item.getTextContent());
+
+				// test size
+				java.util.List<ListItem> items = list.getItems();
+				int size = list.size();
+				Assert.assertEquals(4, size);
+				Assert.assertEquals(items.size(), size);
+
+				// add item
+				ListItem newItem1 = list.addItem(item);
+				Assert.assertEquals("item3 with a bullet list", newItem1.getTextContent());
+				String itemContent = "new string item";
+				newItem1 = list.addItem(itemContent);
+				Assert.assertEquals(itemContent, newItem1.getTextContent());
+				ListItem newItem2 = list.addItem(4, newItem1);
+				Assert.assertEquals(newItem2.getTextContent(), newItem1.getTextContent());
+				ListItem newItem3 = list.addItem(4, "itemContent");
+				Assert.assertEquals(newItem3.getTextContent(), list.getItem(4).getTextContent());
+
+				// add items
+				ListItem[] itemArray = list.getItems().toArray(new ListItem[] {});
+				list.addItems(itemArray);
+				Assert.assertEquals(itemArray.length * 2, list.size());
+				list.addItems(2, itemArray);
+				Assert.assertEquals(itemArray[0].getTextContent(), list.getItem(2).getTextContent());
+				list.addItems(numberItemContents);
+				Assert.assertEquals(itemArray.length * 3 + numberItemContents.length, list.size());
+				list.addItems(5, numberItemContents);
+				Assert.assertEquals(numberItemContents[1], list.getItem(6).getTextContent());
+
+				// replace item
+				ListItem item0 = list.getItem(0);
+				ListItem item1 = list.getItem(1);
+				Assert.assertTrue(!item0.getTextContent().equals(item1.getTextContent()));
+				list.set(1, item0);
+				item1 = list.getItem(1);
+				Assert.assertEquals(item0.getTextContent(), item1.getTextContent());
+				ListItem item2 = list.getItem(2);
+				Assert.assertTrue(!"replace content".equals(item2.getTextContent()));
+				list.set(2, "replace content");
+				item2 = list.getItem(2);
+				Assert.assertEquals("replace content", item2.getTextContent());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testRemoveItems() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			List list;
+			if (listIterator.hasNext()) {
+				list = listIterator.next();
+				// remove item
+				ListItem item0 = list.getItem(0);
+				ListItem item1 = list.getItem(1);
+				Assert.assertFalse(item0.getOdfElement() == item1.getOdfElement());
+				Assert.assertTrue(list.removeItem(0));
+				item0 = list.getItem(0);
+				Assert.assertTrue(item0.getOdfElement() == item1.getOdfElement());
+
+				item1 = list.getItem(1);
+				Assert.assertFalse(item0.getOdfElement() == item1.getOdfElement());
+				list.removeItem(item0);
+				item0 = list.getItem(0);
+				Assert.assertTrue(item0.getOdfElement() == item1.getOdfElement());
+
+				// remove items
+				java.util.List<ListItem> newItems = new java.util.ArrayList<ListItem>();
+				newItems.add(list.addItem("new item1"));
+				newItems.add(list.addItem("new item2"));
+				list.removeItems(newItems);
+				Assert.assertTrue(item0.getOdfElement() == list.getItem(0).getOdfElement());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+			if (listIterator.hasNext()) {
+				list = listIterator.next();
+				Assert.assertTrue(list.size() > 0);
+				// clear items
+				list.clear();
+				Assert.assertTrue(list.size() == 0);
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetListLevel() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			List list;
+			if (listIterator.hasNext()) {
+				list = listIterator.next();
+				Assert.assertTrue(list.getLevel() == 1);
+
+				// sub list
+				ListItem item2 = list.getItem(2);
+				List subList = item2.getListIterator().next();
+				Assert.assertTrue(subList.getLevel() == 2);
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+			// list in cell
+			Table table = Table.newTable(odtdoc);
+			Cell cell = table.getCellByPosition(0, 0);
+			List cellList = cell.addList();
+			Assert.assertTrue(cellList.getLevel() == 1);
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testGetSetContinueList() {
+		try {
+			// load test list container, which contains 2 lists.
+			TextDocument odtdoc = (TextDocument) TextDocument.loadDocument(ResourceUtilities
+					.getTestResourceAsStream(SAMPLE_LIST_DOCUMENT));
+			Iterator<List> listIterator = odtdoc.getListIterator();
+			List list1 = null, list2 = null, list3 = null;
+			if (listIterator.hasNext()) {
+				list1 = listIterator.next();
+				list1.setContinueNumbering(true);
+				// bullet list can't be continue numbering. should return false.
+				Assert.assertFalse(list1.isContinueNumbering());
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+			if (listIterator.hasNext()) {
+				list2 = listIterator.next();
+			} else {
+				Assert.fail("list iterate fail.");
+			}
+			list2.setContinueNumbering(true);
+			Assert.assertTrue(list2.isContinueNumbering());
+			list3 = odtdoc.addList(new NumberDecorator(odtdoc));
+			list3.setContinueList(list1);
+			Assert.assertTrue(list3.isContinueNumbering());
+			Assert.assertTrue(list3.getContinueList().getOdfElement() == list1.getOdfElement());
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	@Test
+	public void testSetListDecorator() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+
+			ListDecorator bulletDecorator = new BulletDecorator(doc);
+			ListDecorator numberDecorator = new NumberDecorator(doc);
+			ListDecorator imageDecorator = new ImageDecorator(doc, ResourceUtilities.getURI("image_list_item.png"));
+			ListDecorator outLineDecorator = new OutLineDecorator(doc);
+			String[] subItemContents = { "sub list item 1", "sub list item 2", "sub list item 3" };
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Bullet List:");
+			List bulletList = doc.addList(bulletDecorator);
+			bulletList.setHeader("Bullet List Header1\nBullet List Header2");
+			bulletList.addItem("bullet item1");
+			bulletList.addItem("bullet item2");
+			ListItem item = bulletList.addItem("item3 with a bullet list");
+			List subList = item.addList();
+			subList.addItems(subItemContents);
+			bulletList.addItem("bullet item4");
+			Assert.assertEquals(ListType.BULLET, bulletList.getType());
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Number List:");
+			List numberList = doc.addList(numberDecorator);
+			numberList.setHeader("Number List Header");
+			numberList.addItem("number item1");
+			item = numberList.addItem("number item2");
+			subList = item.addList(numberDecorator);
+			subList.addItems(subItemContents);
+			numberList.addItem("number item3");
+			Assert.assertEquals(ListType.NUMBER, numberList.getType());
+			numberList.setDecorator(bulletDecorator);
+			Assert.assertEquals(ListType.BULLET, numberList.getType());
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Image List:");
+			List imageList = doc.addList(imageDecorator);
+			item = imageList.addItem("image item1");
+			subList = item.addList(imageDecorator);
+			subList.addItems(subItemContents);
+			imageList.addItem("image item2");
+			imageList.addItem("image item3");
+			Assert.assertEquals(ListType.IMAGE, imageList.getType());
+			imageList.setDecorator(numberDecorator);
+			Assert.assertEquals(ListType.NUMBER, imageList.getType());
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Outline List:");
+			List outLineList = doc.addList(outLineDecorator);
+			addOutLineItem(outLineList, "", 10, outLineDecorator);
+			Assert.assertEquals(ListType.NUMBER, outLineList.getType());
+			outLineList.setDecorator(imageDecorator);
+			Assert.assertEquals(ListType.IMAGE, outLineList.getType());
+			doc.save(ResourceUtilities.getTestOutput("ListOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+	private void addOutLineItem(List list, String itemPrefix, int listlevel, ListDecorator decorator) {
+		if (listlevel == 0) {
+			return;
+		} else {
+			for (int i = 0; i < listlevel; i++) {
+				String itemPrefix2 = itemPrefix + (i + 1) + ".";
+				ListItem item = list.addItem("list item " + itemPrefix2);
+				List newList = item.addList(decorator);
+				addOutLineItem(newList, itemPrefix2, i, decorator);
+			}
+		}
+	}
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/utils/NodeAction.java b/trunk/simple/src/test/java/org/odftoolkit/simple/utils/NodeAction.java
new file mode 100644
index 0000000..f54bbaf
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/utils/NodeAction.java
@@ -0,0 +1,38 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple.utils;
+
+import org.w3c.dom.Node;
+
+public abstract class NodeAction<T> {
+    protected abstract void apply(Node node, T arg, int depth) throws Exception;
+    private int depth = 0;
+    public void performAction(Node node, T arg) throws Exception {
+        while (node != null) {
+            apply(node, arg, depth);
+            depth++;
+            performAction(node.getFirstChild(), arg);
+            depth--;
+            node = node.getNextSibling();
+        }
+    }
+}
diff --git a/trunk/simple/src/test/java/org/odftoolkit/simple/utils/ResourceUtilities.java b/trunk/simple/src/test/java/org/odftoolkit/simple/utils/ResourceUtilities.java
new file mode 100644
index 0000000..56a8ea1
--- /dev/null
+++ b/trunk/simple/src/test/java/org/odftoolkit/simple/utils/ResourceUtilities.java
@@ -0,0 +1,141 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.simple.utils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.odftoolkit.odfdom.pkg.rdfa.Util;
+
+/** Test utility class providing resources for the test in- and output */
+public final class ResourceUtilities {
+	private ResourceUtilities() {
+	}
+
+	/**
+	 * The relative path of the test file will be resolved and the absolute will
+	 * be returned
+	 * 
+	 * @param relativeFilePath
+	 *            Path of the test resource relative to
+	 *            <code>src/test/resource/</code>.
+	 * @return the absolute path of the test file
+	 * @throws FileNotFoundException
+	 *             If the file could not be found
+	 */
+	public static String getAbsolutePath(String relativeFilePath) throws FileNotFoundException {
+		URI uri = null;
+		try {
+			uri = ResourceUtilities.class.getClassLoader().getResource(relativeFilePath).toURI();
+			uri = new URI(Util.toExternalForm(uri));
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ResourceUtilities.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		if (uri == null) {
+			throw new FileNotFoundException("Could not find the file '" + relativeFilePath + "'!");
+		}
+		return uri.getPath();
+	}
+
+	/**
+	 * The relative path of the test file will be resolved and the absolute will
+	 * be returned
+	 * 
+	 * @param relativeFilePath
+	 *            Path of the test resource relative to
+	 *            <code>src/test/resource/</code>.
+	 * @return the URI created based on the relativeFilePath
+	 * @throws URISyntaxException
+	 *             if no URI could be created from the given relative path
+	 */
+	public static URI getURI(String relativeFilePath) throws URISyntaxException {
+		String filePath = "file:" + ResourceUtilities.class.getClassLoader().getResource(relativeFilePath).getPath();
+		filePath = Util.toExternalForm(new URI(filePath));
+		return new URI(filePath);
+	}
+
+	/**
+	 * The relative path of the test file will be used to determine an absolute
+	 * path to a temporary directory in the output directory.
+	 * 
+	 * @param relativeFilePath
+	 *            Path of the test resource relative to
+	 *            <code>src/test/resource/</code>.
+	 * @return absolute path to a test output
+	 * @throws IOException
+	 *             if no absolute Path could be created.
+	 */
+	public static String getTestOutput(String relativeFilePath) throws IOException {
+		return File.createTempFile(relativeFilePath, null).getAbsolutePath();
+	}
+
+	/**
+	 * The Input of the test file will be resolved and the absolute will be
+	 * returned
+	 * 
+	 * @param relativeFilePath
+	 *            Path of the test resource relative to
+	 *            <code>src/test/resource/</code>.
+	 * @return the absolute path of the test file
+	 */
+	public static InputStream getTestResourceAsStream(String relativeFilePath) {
+		return ResourceUtilities.class.getClassLoader().getResourceAsStream(relativeFilePath);
+	}
+
+	/**
+	 * Relative to the test output directory a test file will be returned
+	 * dependent on the relativeFilePath provided.
+	 * 
+	 * @param relativeFilePath
+	 *            Path of the test output resource relative to
+	 *            <code>target/test-classes/</code>.
+	 * @return the empty <code>File</code> of the test output (to be filled)
+	 */
+	public static File newTestOutputFile(String relativeFilePath) {
+		String filepath = null;
+		try {
+			filepath = ResourceUtilities.class.getClassLoader().getResource("").toURI().getPath() + relativeFilePath;
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ResourceUtilities.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return new File(filepath);
+	}
+
+	/**
+	 * @return the absolute path of the test output folder, which is usually
+	 *         <code>target/test-classes/</code>.
+	 */
+	public static String getTestOutputFolder() {
+		String testFolder = null;
+		try {
+			testFolder = ResourceUtilities.class.getClassLoader().getResource("").toURI().getPath();
+		} catch (URISyntaxException ex) {
+			Logger.getLogger(ResourceUtilities.class.getName()).log(Level.SEVERE, null, ex);
+		}
+		return testFolder;
+	}
+}
diff --git a/trunk/simple/src/test/resources/Bell.odt b/trunk/simple/src/test/resources/Bell.odt
new file mode 100644
index 0000000..d97561c
--- /dev/null
+++ b/trunk/simple/src/test/resources/Bell.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/CellStyleHandlerTest.odp b/trunk/simple/src/test/resources/CellStyleHandlerTest.odp
new file mode 100644
index 0000000..7dd9d9c
--- /dev/null
+++ b/trunk/simple/src/test/resources/CellStyleHandlerTest.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/ChartTest.ods b/trunk/simple/src/test/resources/ChartTest.ods
new file mode 100644
index 0000000..86642b8
--- /dev/null
+++ b/trunk/simple/src/test/resources/ChartTest.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/CommentBreakHeadingDocument.odt b/trunk/simple/src/test/resources/CommentBreakHeadingDocument.odt
new file mode 100644
index 0000000..f01ec06
--- /dev/null
+++ b/trunk/simple/src/test/resources/CommentBreakHeadingDocument.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/CorruptedMimetypeChart.odc b/trunk/simple/src/test/resources/CorruptedMimetypeChart.odc
new file mode 100644
index 0000000..f243b88
--- /dev/null
+++ b/trunk/simple/src/test/resources/CorruptedMimetypeChart.odc
Binary files differ
diff --git a/trunk/simple/src/test/resources/CorruptedMimetypeDoc.odt b/trunk/simple/src/test/resources/CorruptedMimetypeDoc.odt
new file mode 100644
index 0000000..8b9a946
--- /dev/null
+++ b/trunk/simple/src/test/resources/CorruptedMimetypeDoc.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/InvalidUnderlineAttribute.odt b/trunk/simple/src/test/resources/InvalidUnderlineAttribute.odt
new file mode 100644
index 0000000..78840ae
--- /dev/null
+++ b/trunk/simple/src/test/resources/InvalidUnderlineAttribute.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/NavigationInOdfElementTest.odp b/trunk/simple/src/test/resources/NavigationInOdfElementTest.odp
new file mode 100644
index 0000000..481f190
--- /dev/null
+++ b/trunk/simple/src/test/resources/NavigationInOdfElementTest.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/Presentation1.odp b/trunk/simple/src/test/resources/Presentation1.odp
new file mode 100644
index 0000000..6448f37
--- /dev/null
+++ b/trunk/simple/src/test/resources/Presentation1.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/Presentation2.odp b/trunk/simple/src/test/resources/Presentation2.odp
new file mode 100644
index 0000000..57a435c
--- /dev/null
+++ b/trunk/simple/src/test/resources/Presentation2.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/PresentationTableTest.odp b/trunk/simple/src/test/resources/PresentationTableTest.odp
new file mode 100644
index 0000000..fb3a9a3
--- /dev/null
+++ b/trunk/simple/src/test/resources/PresentationTableTest.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/SampleBox.odt b/trunk/simple/src/test/resources/SampleBox.odt
new file mode 100644
index 0000000..b013fcb
--- /dev/null
+++ b/trunk/simple/src/test/resources/SampleBox.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/SectionHelp.odt b/trunk/simple/src/test/resources/SectionHelp.odt
new file mode 100644
index 0000000..d1e56df
--- /dev/null
+++ b/trunk/simple/src/test/resources/SectionHelp.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/Sections.odt b/trunk/simple/src/test/resources/Sections.odt
new file mode 100644
index 0000000..d2daeb1
--- /dev/null
+++ b/trunk/simple/src/test/resources/Sections.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/SimpleFormula.odf b/trunk/simple/src/test/resources/SimpleFormula.odf
new file mode 100644
index 0000000..0e10240
--- /dev/null
+++ b/trunk/simple/src/test/resources/SimpleFormula.odf
Binary files differ
diff --git a/trunk/simple/src/test/resources/SlideTest1.odp b/trunk/simple/src/test/resources/SlideTest1.odp
new file mode 100644
index 0000000..e6401a2
--- /dev/null
+++ b/trunk/simple/src/test/resources/SlideTest1.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/SlideTest2.odp b/trunk/simple/src/test/resources/SlideTest2.odp
new file mode 100644
index 0000000..22f9a49
--- /dev/null
+++ b/trunk/simple/src/test/resources/SlideTest2.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/SlideTest3.odp b/trunk/simple/src/test/resources/SlideTest3.odp
new file mode 100644
index 0000000..81b7874
--- /dev/null
+++ b/trunk/simple/src/test/resources/SlideTest3.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/Spreadsheet with Embeded Chart.ods b/trunk/simple/src/test/resources/Spreadsheet with Embeded Chart.ods
new file mode 100644
index 0000000..c5c4053
--- /dev/null
+++ b/trunk/simple/src/test/resources/Spreadsheet with Embeded Chart.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/TableCountTestcase.odp b/trunk/simple/src/test/resources/TableCountTestcase.odp
new file mode 100644
index 0000000..107559c
--- /dev/null
+++ b/trunk/simple/src/test/resources/TableCountTestcase.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/TableTemplate.odt b/trunk/simple/src/test/resources/TableTemplate.odt
new file mode 100644
index 0000000..3292a42
--- /dev/null
+++ b/trunk/simple/src/test/resources/TableTemplate.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestCellSelection.ods b/trunk/simple/src/test/resources/TestCellSelection.ods
new file mode 100644
index 0000000..fcb2107
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestCellSelection.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestCreateChartWithCellRange.ods b/trunk/simple/src/test/resources/TestCreateChartWithCellRange.ods
new file mode 100644
index 0000000..8607ef0
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestCreateChartWithCellRange.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestInsertDocument.odt b/trunk/simple/src/test/resources/TestInsertDocument.odt
new file mode 100644
index 0000000..3c6dd25
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestInsertDocument.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestODSAppendRow.ods b/trunk/simple/src/test/resources/TestODSAppendRow.ods
new file mode 100644
index 0000000..0df875c
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestODSAppendRow.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestODTAppendRow.odt b/trunk/simple/src/test/resources/TestODTAppendRow.odt
new file mode 100644
index 0000000..a787a42
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestODTAppendRow.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestReplaceWithBasicCases.odt b/trunk/simple/src/test/resources/TestReplaceWithBasicCases.odt
new file mode 100644
index 0000000..a4b089c
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestReplaceWithBasicCases.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestSpreadsheetStyleTable.ods b/trunk/simple/src/test/resources/TestSpreadsheetStyleTable.ods
new file mode 100644
index 0000000..86174b7
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestSpreadsheetStyleTable.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestSpreadsheetTable.ods b/trunk/simple/src/test/resources/TestSpreadsheetTable.ods
new file mode 100644
index 0000000..fe1a184
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestSpreadsheetTable.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestStyleSelection.odt b/trunk/simple/src/test/resources/TestStyleSelection.odt
new file mode 100644
index 0000000..6deb1a5
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestStyleSelection.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestTableTemplate.odt b/trunk/simple/src/test/resources/TestTableTemplate.odt
new file mode 100644
index 0000000..4e48f65
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestTableTemplate.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestTextSelection.odt b/trunk/simple/src/test/resources/TestTextSelection.odt
new file mode 100644
index 0000000..955285b
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestTextSelection.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestTextSelectionComment.odt b/trunk/simple/src/test/resources/TestTextSelectionComment.odt
new file mode 100644
index 0000000..38643a0
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestTextSelectionComment.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestTextSelectionCopySource.odt b/trunk/simple/src/test/resources/TestTextSelectionCopySource.odt
new file mode 100644
index 0000000..8647471
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestTextSelectionCopySource.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TestTextTable.odt b/trunk/simple/src/test/resources/TestTextTable.odt
new file mode 100644
index 0000000..0b740b4
--- /dev/null
+++ b/trunk/simple/src/test/resources/TestTextTable.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/TextFieldSampleDocument.odt b/trunk/simple/src/test/resources/TextFieldSampleDocument.odt
new file mode 100644
index 0000000..2fae400
--- /dev/null
+++ b/trunk/simple/src/test/resources/TextFieldSampleDocument.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/chartTestTemplate.otc b/trunk/simple/src/test/resources/chartTestTemplate.otc
new file mode 100644
index 0000000..2d538c7
--- /dev/null
+++ b/trunk/simple/src/test/resources/chartTestTemplate.otc
Binary files differ
diff --git a/trunk/simple/src/test/resources/empty.odt b/trunk/simple/src/test/resources/empty.odt
new file mode 100644
index 0000000..03da852
--- /dev/null
+++ b/trunk/simple/src/test/resources/empty.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/empty_file.ods b/trunk/simple/src/test/resources/empty_file.ods
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trunk/simple/src/test/resources/empty_file.ods
@@ -0,0 +1 @@
+
diff --git a/trunk/simple/src/test/resources/graphicTestTemplate.otg b/trunk/simple/src/test/resources/graphicTestTemplate.otg
new file mode 100644
index 0000000..c9dfc64
--- /dev/null
+++ b/trunk/simple/src/test/resources/graphicTestTemplate.otg
Binary files differ
diff --git a/trunk/simple/src/test/resources/headerFooterHidden.odt b/trunk/simple/src/test/resources/headerFooterHidden.odt
new file mode 100644
index 0000000..ec41f22
--- /dev/null
+++ b/trunk/simple/src/test/resources/headerFooterHidden.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/image_list_item.png b/trunk/simple/src/test/resources/image_list_item.png
new file mode 100644
index 0000000..824f4d9
--- /dev/null
+++ b/trunk/simple/src/test/resources/image_list_item.png
Binary files differ
diff --git a/trunk/simple/src/test/resources/invalid.ods b/trunk/simple/src/test/resources/invalid.ods
new file mode 100644
index 0000000..de1e613
--- /dev/null
+++ b/trunk/simple/src/test/resources/invalid.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/metaTest.odt b/trunk/simple/src/test/resources/metaTest.odt
new file mode 100644
index 0000000..ea250f6
--- /dev/null
+++ b/trunk/simple/src/test/resources/metaTest.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/navigationtest.odt b/trunk/simple/src/test/resources/navigationtest.odt
new file mode 100644
index 0000000..23f2af1
--- /dev/null
+++ b/trunk/simple/src/test/resources/navigationtest.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/no_size_opt.odt b/trunk/simple/src/test/resources/no_size_opt.odt
new file mode 100644
index 0000000..32ddcf8
--- /dev/null
+++ b/trunk/simple/src/test/resources/no_size_opt.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/not-only-odf.odt b/trunk/simple/src/test/resources/not-only-odf.odt
new file mode 100644
index 0000000..629d3b5
--- /dev/null
+++ b/trunk/simple/src/test/resources/not-only-odf.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Presentation1.odp b/trunk/simple/src/test/resources/performance/Presentation1.odp
new file mode 100644
index 0000000..c25cc9d
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Presentation1.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Presentation2.odp b/trunk/simple/src/test/resources/performance/Presentation2.odp
new file mode 100644
index 0000000..2c2a7df
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Presentation2.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Presentation3.odp b/trunk/simple/src/test/resources/performance/Presentation3.odp
new file mode 100644
index 0000000..f3e3adc
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Presentation3.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Presentation4.odp b/trunk/simple/src/test/resources/performance/Presentation4.odp
new file mode 100644
index 0000000..f32c7af
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Presentation4.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Presentation5.odp b/trunk/simple/src/test/resources/performance/Presentation5.odp
new file mode 100644
index 0000000..e5b7588
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Presentation5.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Presentation7.odp b/trunk/simple/src/test/resources/performance/Presentation7.odp
new file mode 100644
index 0000000..9002ac8
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Presentation7.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Text1.odt b/trunk/simple/src/test/resources/performance/Text1.odt
new file mode 100644
index 0000000..4761107
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Text1.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Text3.odt b/trunk/simple/src/test/resources/performance/Text3.odt
new file mode 100644
index 0000000..d72df2d
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Text3.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Text4.odt b/trunk/simple/src/test/resources/performance/Text4.odt
new file mode 100644
index 0000000..15f208e
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Text4.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Text6.odt b/trunk/simple/src/test/resources/performance/Text6.odt
new file mode 100644
index 0000000..61bd0d6
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Text6.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/Text7.odt b/trunk/simple/src/test/resources/performance/Text7.odt
new file mode 100644
index 0000000..c691f63
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/Text7.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/spreadsheet1.ods b/trunk/simple/src/test/resources/performance/spreadsheet1.ods
new file mode 100644
index 0000000..363bb89
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/spreadsheet1.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/spreadsheet2.ods b/trunk/simple/src/test/resources/performance/spreadsheet2.ods
new file mode 100644
index 0000000..4876065
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/spreadsheet2.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/spreadsheet3.ods b/trunk/simple/src/test/resources/performance/spreadsheet3.ods
new file mode 100644
index 0000000..60e984a
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/spreadsheet3.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/spreadsheet4.ods b/trunk/simple/src/test/resources/performance/spreadsheet4.ods
new file mode 100644
index 0000000..a34f9ca
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/spreadsheet4.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/performance/spreadsheet5.ods b/trunk/simple/src/test/resources/performance/spreadsheet5.ods
new file mode 100644
index 0000000..fd4d56f
--- /dev/null
+++ b/trunk/simple/src/test/resources/performance/spreadsheet5.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/presentation.odp b/trunk/simple/src/test/resources/presentation.odp
new file mode 100644
index 0000000..e46fb7b
--- /dev/null
+++ b/trunk/simple/src/test/resources/presentation.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/presentationTestTemplate.otp b/trunk/simple/src/test/resources/presentationTestTemplate.otp
new file mode 100644
index 0000000..cd56ba2
--- /dev/null
+++ b/trunk/simple/src/test/resources/presentationTestTemplate.otp
Binary files differ
diff --git a/trunk/simple/src/test/resources/presentationWithEmbedDoc.odp b/trunk/simple/src/test/resources/presentationWithEmbedDoc.odp
new file mode 100644
index 0000000..f30dfdc
--- /dev/null
+++ b/trunk/simple/src/test/resources/presentationWithEmbedDoc.odp
Binary files differ
diff --git a/trunk/simple/src/test/resources/spreadsheetTestTemplate.ots b/trunk/simple/src/test/resources/spreadsheetTestTemplate.ots
new file mode 100644
index 0000000..3e8c2b8
--- /dev/null
+++ b/trunk/simple/src/test/resources/spreadsheetTestTemplate.ots
Binary files differ
diff --git a/trunk/simple/src/test/resources/table.odt b/trunk/simple/src/test/resources/table.odt
new file mode 100644
index 0000000..3591fb5
--- /dev/null
+++ b/trunk/simple/src/test/resources/table.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/test2-content.xml b/trunk/simple/src/test/resources/test2-content.xml
new file mode 100644
index 0000000..64bd8f0
--- /dev/null
+++ b/trunk/simple/src/test/resources/test2-content.xml
@@ -0,0 +1,165 @@
+<!-- 
+       Licensed to the Apache 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" standalone="no"?>
+<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:ooo="http://openoffice.org/2004/office" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.2">
+<office:scripts/>
+<office:font-face-decls>
+<style:font-face style:name="StarSymbol" svg:font-family="StarSymbol"/>
+<style:font-face style:name="Tahoma1" svg:font-family="Tahoma"/>
+<style:font-face style:font-family-generic="modern" style:font-pitch="fixed" style:name="Cumberland" svg:font-family="Cumberland"/>
+<style:font-face style:font-family-generic="roman" style:font-pitch="variable" style:name="Thorndale" svg:font-family="Thorndale"/>
+<style:font-face style:font-family-generic="swiss" style:font-pitch="variable" style:name="Albany" svg:font-family="Albany"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Andale Sans UI" svg:font-family="'Andale Sans UI'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="MS Mincho" svg:font-family="'MS Mincho'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Tahoma" svg:font-family="Tahoma"/>
+</office:font-face-decls>
+<office:automatic-styles>
+<style:style style:family="paragraph" style:list-style-name="L1" style:name="P1" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:list-style-name="L2" style:name="P2" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:list-style-name="L2" style:name="P3" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:list-style-name="L1" style:name="P4" style:parent-style-name="Text_20_body"/>
+<style:style style:family="paragraph" style:name="P5" style:parent-style-name="Text_20_body">
+<style:paragraph-properties fo:margin-left="0.2in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false"/>
+</style:style>
+<style:style style:family="paragraph" style:name="P6" style:parent-style-name="Text_20_body">
+<style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false"/>
+</style:style>
+<style:style style:family="text" style:name="T1">
+<style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+</style:style>
+<style:style style:family="text" style:name="T2">
+<style:text-properties fo:color="#ff3366"/>
+</style:style>
+<text:list-style style:name="L1">
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="1" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.25in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="2" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.5in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="3" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.75in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="4" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="5" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.25in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="6" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.5in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="7" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.75in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="8" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="9" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.25in"/>
+</text:list-level-style-number>
+<text:list-level-style-number style:num-format="1" style:num-suffix="." text:level="10" text:style-name="Numbering_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.5in"/>
+</text:list-level-style-number>
+</text:list-style>
+<text:list-style style:name="L2">
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="1" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.25in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="○" text:level="2" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.5in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="■" text:level="3" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="0.75in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="4" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="○" text:level="5" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.25in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="■" text:level="6" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.5in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="7" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="1.75in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="○" text:level="8" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="■" text:level="9" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.25in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+<text:list-level-style-bullet style:num-suffix="." text:bullet-char="●" text:level="10" text:style-name="Bullet_20_Symbols">
+<style:list-level-properties text:min-label-width="0.25in" text:space-before="2.5in"/>
+<style:text-properties style:font-name="StarSymbol"/>
+</text:list-level-style-bullet>
+</text:list-style>
+</office:automatic-styles>
+<office:body>
+<office:text>
+<office:forms form:apply-design-mode="false" form:automatic-focus="false"/>
+<text:sequence-decls>
+<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+</text:sequence-decls>
+<text:p text:style-name="Standard">Hello <text:span text:style-name="T1">world</text:span>
+</text:p>
+<text:p text:style-name="Text_20_body">absatz <text:span text:style-name="Example">z</text:span>
+<text:span text:style-name="Example">
+<text:span text:style-name="T1">we</text:span>
+</text:span>
+<text:span text:style-name="Example">i</text:span>
+</text:p>
+<text:p text:style-name="P5">Absatz <text:span text:style-name="T2">drei</text:span>
+</text:p>
+<text:p text:style-name="P6">
+<text:span text:style-name="T2"/>
+</text:p>
+<text:list text:style-name="L1">
+<text:list-item>
+<text:p text:style-name="P1">num 1</text:p>
+</text:list-item>
+<text:list-item>
+<text:p text:style-name="P1">num 2</text:p>
+</text:list-item>
+</text:list>
+<text:p text:style-name="Text_20_body"/>
+<text:list text:style-name="L2">
+<text:list-item>
+<text:p text:style-name="P2">bullet1</text:p>
+</text:list-item>
+<text:list-item>
+<text:p text:style-name="P2">bullet2</text:p>
+</text:list-item>
+</text:list>
+</office:text>
+</office:body>
+</office:document-content>
diff --git a/trunk/simple/src/test/resources/test2-styles.xml b/trunk/simple/src/test/resources/test2-styles.xml
new file mode 100644
index 0000000..751445e
--- /dev/null
+++ b/trunk/simple/src/test/resources/test2-styles.xml
@@ -0,0 +1,123 @@
+<!-- 
+       Licensed to the Apache 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" standalone="no"?>
+<office:document-styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:ooo="http://openoffice.org/2004/office" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2">
+<office:font-face-decls>
+<style:font-face style:name="StarSymbol" svg:font-family="StarSymbol"/>
+<style:font-face style:name="Tahoma1" svg:font-family="Tahoma"/>
+<style:font-face style:font-family-generic="modern" style:font-pitch="fixed" style:name="Cumberland" svg:font-family="Cumberland"/>
+<style:font-face style:font-family-generic="roman" style:font-pitch="variable" style:name="Thorndale" svg:font-family="Thorndale"/>
+<style:font-face style:font-family-generic="swiss" style:font-pitch="variable" style:name="Albany" svg:font-family="Albany"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Andale Sans UI" svg:font-family="'Andale Sans UI'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="MS Mincho" svg:font-family="'MS Mincho'"/>
+<style:font-face style:font-family-generic="system" style:font-pitch="variable" style:name="Tahoma" svg:font-family="Tahoma"/>
+</office:font-face-decls>
+<office:styles>
+<style:default-style style:family="graphic">
+<style:graphic-properties draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" style:flow-with-text="false"/>
+<style:paragraph-properties style:font-independent-line-spacing="false" style:line-break="strict" style:text-autospace="ideograph-alpha" style:writing-mode="lr-tb">
+<style:tab-stops/>
+</style:paragraph-properties>
+<style:text-properties fo:country="US" fo:font-size="12pt" fo:language="en" style:country-asian="none" style:country-complex="none" style:font-size-asian="12pt" style:font-size-complex="12pt" style:language-asian="zxx" style:language-complex="zxx" style:letter-kerning="true" style:use-window-font-color="true"/>
+</style:default-style>
+<style:default-style style:family="paragraph">
+<style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:line-break="strict" style:punctuation-wrap="hanging" style:tab-stop-distance="0.4925in" style:text-autospace="ideograph-alpha" style:writing-mode="page"/>
+<style:text-properties fo:country="US" fo:font-size="12pt" fo:hyphenate="false" fo:hyphenation-push-char-count="2" fo:hyphenation-remain-char-count="2" fo:language="en" style:country-asian="none" style:country-complex="none" style:font-name="Thorndale" style:font-name-asian="Andale Sans UI" style:font-name-complex="Tahoma" style:font-size-asian="12pt" style:font-size-complex="12pt" style:language-asian="zxx" style:language-complex="zxx" style:letter-kerning="true" style:use-window-font-color="true"/>
+</style:default-style>
+<style:default-style style:family="table">
+<style:table-properties table:border-model="collapsing"/>
+</style:default-style>
+<style:default-style style:family="table-row">
+<style:table-row-properties fo:keep-together="auto"/>
+</style:default-style>
+<style:style style:class="text" style:family="paragraph" style:name="Standard"/>
+<style:style style:class="text" style:display-name="Text body" style:family="paragraph" style:name="Text_20_body" style:parent-style-name="Standard">
+<style:paragraph-properties fo:margin-bottom="0.0835in" fo:margin-top="0in"/>
+</style:style>
+<style:style style:class="text" style:family="paragraph" style:name="Heading" style:next-style-name="Text_20_body" style:parent-style-name="Standard">
+<style:paragraph-properties fo:keep-with-next="always" fo:margin-bottom="0.0835in" fo:margin-top="0.1665in"/>
+<style:text-properties fo:font-size="14pt" style:font-name="Albany" style:font-name-asian="MS Mincho" style:font-name-complex="Tahoma" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+</style:style>
+<style:style style:class="list" style:family="paragraph" style:name="List" style:parent-style-name="Text_20_body">
+<style:text-properties style:font-name-complex="Tahoma1"/>
+</style:style>
+<style:style style:class="extra" style:family="paragraph" style:name="Caption" style:parent-style-name="Standard">
+<style:paragraph-properties fo:margin-bottom="0.0835in" fo:margin-top="0.0835in" text:line-number="0" text:number-lines="false"/>
+<style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-name-complex="Tahoma1" style:font-size-asian="12pt" style:font-size-complex="12pt" style:font-style-asian="italic" style:font-style-complex="italic"/>
+</style:style>
+<style:style style:class="index" style:family="paragraph" style:name="Index" style:parent-style-name="Standard">
+<style:paragraph-properties text:line-number="0" text:number-lines="false"/>
+<style:text-properties style:font-name-complex="Tahoma1"/>
+</style:style>
+<style:style style:display-name="Numbering Symbols" style:family="text" style:name="Numbering_20_Symbols"/>
+<style:style style:display-name="Bullet Symbols" style:family="text" style:name="Bullet_20_Symbols">
+<style:text-properties fo:font-size="9pt" style:font-name="StarSymbol" style:font-name-asian="StarSymbol" style:font-name-complex="StarSymbol" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
+</style:style>
+<style:style style:family="text" style:name="Example">
+<style:text-properties style:font-name="Cumberland" style:font-name-asian="Cumberland" style:font-name-complex="Cumberland"/>
+</style:style>
+<text:outline-style>
+<text:outline-level-style style:num-format="" text:level="1">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="2">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="3">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="4">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="5">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="6">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="7">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="8">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="9">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+<text:outline-level-style style:num-format="" text:level="10">
+<style:list-level-properties text:min-label-distance="0.15in"/>
+</text:outline-level-style>
+</text:outline-style>
+<text:notes-configuration style:num-format="1" text:footnotes-position="page" text:note-class="footnote" text:start-numbering-at="document" text:start-value="0"/>
+<text:notes-configuration style:num-format="i" text:note-class="endnote" text:start-value="0"/>
+<text:linenumbering-configuration style:num-format="1" text:increment="5" text:number-lines="false" text:number-position="left" text:offset="0.1965in"/>
+</office:styles>
+<office:automatic-styles>
+<style:page-layout style:name="pm1">
+<style:page-layout-properties fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" fo:margin-top="0.7874in" fo:page-height="11in" fo:page-width="8.5in" style:footnote-max-height="0in" style:num-format="1" style:print-orientation="portrait" style:writing-mode="lr-tb">
+<style:footnote-sep style:adjustment="left" style:color="#000000" style:distance-after-sep="0.0398in" style:distance-before-sep="0.0398in" style:rel-width="25%" style:width="0.0071in"/>
+</style:page-layout-properties>
+<style:header-style/>
+<style:footer-style/>
+</style:page-layout>
+</office:automatic-styles>
+<office:master-styles>
+<style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+</office:master-styles>
+</office:document-styles>
diff --git a/trunk/simple/src/test/resources/test2.odt b/trunk/simple/src/test/resources/test2.odt
new file mode 100644
index 0000000..aa4d557
--- /dev/null
+++ b/trunk/simple/src/test/resources/test2.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/testA.jpg b/trunk/simple/src/test/resources/testA.jpg
new file mode 100644
index 0000000..494c46d
--- /dev/null
+++ b/trunk/simple/src/test/resources/testA.jpg
Binary files differ
diff --git a/trunk/simple/src/test/resources/testEmbeddedDoc.odt b/trunk/simple/src/test/resources/testEmbeddedDoc.odt
new file mode 100644
index 0000000..b6ffa11
--- /dev/null
+++ b/trunk/simple/src/test/resources/testEmbeddedDoc.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/testGetCellAt.ods b/trunk/simple/src/test/resources/testGetCellAt.ods
new file mode 100644
index 0000000..fbc6985
--- /dev/null
+++ b/trunk/simple/src/test/resources/testGetCellAt.ods
Binary files differ
diff --git a/trunk/simple/src/test/resources/testList.odt b/trunk/simple/src/test/resources/testList.odt
new file mode 100644
index 0000000..ad7d592
--- /dev/null
+++ b/trunk/simple/src/test/resources/testList.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/testList2.odt b/trunk/simple/src/test/resources/testList2.odt
new file mode 100644
index 0000000..97eacfb
--- /dev/null
+++ b/trunk/simple/src/test/resources/testList2.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/testSaveEmbeddedDoc.odt b/trunk/simple/src/test/resources/testSaveEmbeddedDoc.odt
new file mode 100644
index 0000000..3dedada
--- /dev/null
+++ b/trunk/simple/src/test/resources/testSaveEmbeddedDoc.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/text-extract.odt b/trunk/simple/src/test/resources/text-extract.odt
new file mode 100644
index 0000000..07593d2
--- /dev/null
+++ b/trunk/simple/src/test/resources/text-extract.odt
Binary files differ
diff --git a/trunk/simple/src/test/resources/textTestTemplate.ott b/trunk/simple/src/test/resources/textTestTemplate.ott
new file mode 100644
index 0000000..4e28075
--- /dev/null
+++ b/trunk/simple/src/test/resources/textTestTemplate.ott
Binary files differ
diff --git a/trunk/simple/src/test/resources/xslt/concatfiles.xsl b/trunk/simple/src/test/resources/xslt/concatfiles.xsl
new file mode 100644
index 0000000..73db4e9
--- /dev/null
+++ b/trunk/simple/src/test/resources/xslt/concatfiles.xsl
@@ -0,0 +1,40 @@
+<!-- 
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+ -->
+<?xml version='1.0' encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output method="xml" encoding="UTF-8"/>
+	
+    <!-- 
+        To access contents of a office file content (e.g. meta.xml, styles.xml) 
+        this URL has to be added before the inner path.
+        
+        For instance sourceBaseURL might be:
+            file:/E:/cws/multiPkgFileTest-ODFDOM/target/test-classes/test2.odt/
+    -->
+	<xsl:param name="sourceBaseURL" select="'./'" />    
+
+    <xsl:template match="/">
+        <xsl:message>The sourceBaseURL is '<xsl:value-of select="$sourceBaseURL"/>'</xsl:message>
+        <concatedFiles>            
+            <xsl:copy-of select="document(concat($sourceBaseURL, 'styles.xml'))" />
+            <xsl:copy-of select="document(concat($sourceBaseURL, 'meta.xml'))" />        
+        </concatedFiles>
+    </xsl:template>
+</xsl:stylesheet>
+
diff --git a/trunk/taglets/README.txt b/trunk/taglets/README.txt
new file mode 100644
index 0000000..4a52119
--- /dev/null
+++ b/trunk/taglets/README.txt
@@ -0,0 +1,17 @@
+*************************************************************
+* Taglets Java Library                                       *
+*                                                           *
+*************************************************************
+
+
+About Taglets
+-------------
+
+This sub project defines some javadoc tags for ODFDOM. Most of users no need to care it.
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
diff --git a/trunk/taglets/pom.xml b/trunk/taglets/pom.xml
new file mode 100644
index 0000000..0f3091f
--- /dev/null
+++ b/trunk/taglets/pom.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.odftoolkit</groupId>
+        <artifactId>odftoolkit</artifactId>
+        <version>0.6.1-incubating</version>
+    </parent>
+
+    <artifactId>taglets</artifactId>
+    <version>0.8.10-incubating</version>
+    <packaging>jar</packaging>
+
+    <!-- Build Settings -->
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.2</version>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <attach>true</attach>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>attach-javadocs</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.1.2</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>single</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+     <!-- More Project Information -->
+    <name>ODF Custom Javadoc Taglets</name>
+    <description>Javadoc taglets for ODFDOM</description>
+    <url>http://incubator.apache.org/odftoolkit/odfdom/index.html</url>
+    <inceptionYear>2008</inceptionYear>
+    <licenses>
+        <license>
+            <name>Apache 2</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+    </licenses>
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/taglets</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/taglets</developerConnection>
+        <url>http://svn.apache.org/viewvc/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/taglets</url>
+    </scm>
+    <profiles>
+		<profile>
+			<id>tools.jar</id><!-- For JDK 7 and later - with Oracle Brand --> 
+			<activation>
+				<property>
+					<name>java.vendor</name>
+					<value>Oracle Corporation</value>
+				</property>
+			</activation>
+			<dependencies>
+				<dependency>
+					<groupId>com.sun</groupId>
+					<artifactId>tools</artifactId>
+					<version>1.7.0</version>
+					<scope>system</scope>
+					<systemPath>${java.home}/../lib/tools.jar</systemPath>
+				</dependency>
+			</dependencies>
+		</profile>
+		<profile>
+			<id>tools-sun.jar</id><!-- For JDK 6 and OpenJDK - with Sun Brand --> 
+			<activation>
+				<property>
+					<name>java.vendor</name>
+					<value>Sun Microsystems Inc.</value>
+				</property>
+			</activation>
+			<dependencies>
+				<dependency>
+					<groupId>com.sun</groupId>
+					<artifactId>tools</artifactId>
+					<version>1.5.0</version>
+					<scope>system</scope>
+					<systemPath>${java.home}/../lib/tools.jar</systemPath>
+				</dependency>
+			</dependencies>
+		</profile>
+        <profile>
+            <id>release-sign-artifacts</id>
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.1</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+            <!-- <distributionManagement>
+                <site>
+                    <id>odfdom</id>
+                    <name>ODFDOM Java Toolkit Project</name>
+                    <url>dav:https://odftoolkit.org/website/odfdom/${project.version}/javadoc-taglets</url>
+                </site>
+            </distributionManagement>-->
+        </profile>
+    </profiles>
+</project>
diff --git a/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfAttributeTaglet.java b/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfAttributeTaglet.java
new file mode 100644
index 0000000..a7728c5
--- /dev/null
+++ b/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfAttributeTaglet.java
@@ -0,0 +1,206 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2009 IBM. All rights reserved.
+ * Copyright 2010 Oracle and/or its affiliates. All rights reserved. 
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.taglet;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import com.sun.javadoc.Tag;
+import com.sun.tools.doclets.Taglet;
+
+/**
+ * This class implements a custom taglet to the map the ODF attribute to the
+ * declaration of the ODF attribute in the OpenDocument specification.
+ * 
+ * The position of the OpenDocument specification in HTML can be provided using
+ * an environment variable or java system property, while the system property
+ * overrides the environment variable. In case nothing is been a default path
+ * within the JavaDoc doc-files directory is being used.
+ * 
+ * For example the taglet <code>{&#64;odf.attribute xml:id}</code> would be
+ * resolved without variable settings to
+ * <code>JAVA_DOC_BASE/doc-files/OpenDocument-v1.2-part1.html#attribute-xml_id</code>
+ * .
+ */
+public class OdfAttributeTaglet implements Taglet {
+
+	private static final Logger LOG = Logger.getLogger(OdfAttributeTaglet.class.getName());
+	private static final String NAME = "odf.attribute";
+	private static final String ODF_SPEC_PART1_PATH = "../../../../../../doc-files/OpenDocument-v1.2-part1.html";
+	private static final String ODF_SPEC_PART3_PATH = "../../../../../doc-files/OpenDocument-v1.2-part3.html";
+	private static String mOdfSpecPart1Path = null;
+	private static String mOdfSpecPart3Path = null;
+	private static Set<String> mNS_IN_PART3 = new HashSet<String>();
+
+	// initial attribute set which should be search in part3.
+	static {
+		mNS_IN_PART3.add("manifest");
+		mNS_IN_PART3.add("dsig");
+		mNS_IN_PART3.add("ds");
+	}
+
+	/*
+	 * FINDING THE ABSOLUTE PATH TO THE ODF SPEC PART1 and PART3 IN HTML: 
+	 * 1) Try to get the odfSpecPath from the Java System variable (ODF_SPEC_PATH) 
+	 * 2) Try to get the odfSpecPath from the environment variable (ODF_SPEC_PATH) 
+	 * 3) If both not worked, use the default path
+	 */
+	static {
+		mOdfSpecPart1Path = System.getProperty("ODF_SPEC_PART1_PATH");
+		if (mOdfSpecPart1Path == null) {
+			mOdfSpecPart1Path = System.getenv("ODF_SPEC_PATH");
+			if (mOdfSpecPart1Path == null) {
+				mOdfSpecPart1Path = ODF_SPEC_PART1_PATH;
+				LOG.info("OdfSpecPart1Path was set to " + mOdfSpecPart1Path + " by class declaration.");
+			} else {
+				LOG.info("OdfSpecPart1Path was set to " + mOdfSpecPart1Path + " by environment property 'ODF_SPEC_PATH'.");
+			}
+		} else {
+			LOG.info("OdfSpecPart1Path was set to " + mOdfSpecPart1Path + " by Java System property 'ODF_SPEC_PATH'.");
+		}
+		
+		mOdfSpecPart3Path = System.getProperty("ODF_SPEC_PART3_PATH");
+		if (mOdfSpecPart3Path == null) {
+			mOdfSpecPart3Path = System.getenv("ODF_SPEC_PATH");
+			if (mOdfSpecPart3Path == null) {
+				mOdfSpecPart3Path = ODF_SPEC_PART3_PATH;
+				LOG.info("OdfSpecPart3Path was set to " + mOdfSpecPart3Path + " by class declaration.");
+			} else {
+				LOG.info("OdfSpecPart3Path was set to " + mOdfSpecPart3Path + " by environment property 'ODF_SPEC_PATH'.");
+			}
+		} else {
+			LOG.info("OdfSpecPart3Path was set to " + mOdfSpecPart3Path + " by Java System property 'ODF_SPEC_PATH'.");
+		}
+
+	}
+
+	/**
+	 * @return the name of this custom tag.
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/**
+	 * @return true since this tag can be used in a field doc comment
+	 */
+	public boolean inField() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a constructor doc comment
+	 */
+	public boolean inConstructor() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a method doc comment
+	 */
+	public boolean inMethod() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in an overview doc comment
+	 */
+	public boolean inOverview() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a package doc comment
+	 */
+	public boolean inPackage() {
+		return true;
+	}
+
+	/**
+	 * @return true since this
+	 */
+	public boolean inType() {
+		return true;
+	}
+
+	/**
+	 * Will return true since this is an inline tag.
+	 * 
+	 * @return true since this is an inline tag.
+	 */
+
+	public boolean isInlineTag() {
+		return true;
+	}
+
+	/**
+	 * Register this Taglet.
+	 * 
+	 * @param tagletMap
+	 *            the map to register this tag to.
+	 */
+	public static void register(Map<String, Taglet> tagletMap) {
+		OdfAttributeTaglet tag = new OdfAttributeTaglet();
+		Taglet t = tagletMap.get(tag.getName());
+		if (t != null) {
+			tagletMap.remove(tag.getName());
+		}
+		tagletMap.put(tag.getName(), tag);
+	}
+
+	/**
+	 * Given the <code>Tag</code> representation of this custom tag, return its
+	 * string representation.
+	 * 
+	 * @param tag
+	 *            he <code>Tag</code> representation of this custom tag.
+	 * @return the string representation of the custom tag
+	 */
+	public String toString(Tag tag) {
+		int pos = tag.text().lastIndexOf(":");
+		String namespace = tag.text().substring(0, pos);
+		String name = tag.text().substring(pos + 1);
+		String mOdfSpecPath = mOdfSpecPart1Path;
+		if (mNS_IN_PART3.contains(namespace)) {
+			mOdfSpecPath = mOdfSpecPart3Path;
+		}
+		String fragmentIdentifier = "attribute-" + namespace + "_" + name;
+		return "<a href=\"" + mOdfSpecPath + "#" + fragmentIdentifier + "\">" + tag.text() + "</a>";
+	}
+
+	/**
+	 * This method should not be called since arrays of inline tags do not
+	 * exist. Method should be used to convert this inline tag to a string.
+	 * 
+	 * @param tags
+	 *            the array of <code>Tag</code>s representing of this custom
+	 *            tag.
+	 * @return Nothing is returned, instead an
+	 *         <code>UnsupportedOperationException</code> is being thrown.
+	 */
+	public String toString(Tag[] tags) {
+		throw new java.lang.UnsupportedOperationException("Arrays of inline tags do not exist!");
+	}
+
+}
diff --git a/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfDatatypeTaglet.java b/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfDatatypeTaglet.java
new file mode 100644
index 0000000..92acf26
--- /dev/null
+++ b/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfDatatypeTaglet.java
@@ -0,0 +1,170 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2009 IBM. All rights reserved.
+ * Copyright 2010 Oracle and/or its affiliates. All rights reserved. 
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.taglet;
+
+import java.util.Map;
+
+import com.sun.javadoc.Tag;
+import com.sun.tools.doclets.Taglet;
+import java.util.logging.Logger;
+
+/**
+ *	This class implements a custom taglet to the map the ODF datatype to the
+ *  declaration of the ODF datatype in the OpenDocument specification.
+ *
+ *  The position of the OpenDocument specification in HTML can be provided using
+ *  an environment variable or java system property, while the system property overrides
+ *  the environment variable.
+ *  In case nothing is been a default path within the JavaDoc doc-files directory is being used.
+ *
+ *  For example the taglet <code>{&#64;odf.datatype countryCode}</code> would be resolved without variable settings to
+ *  <code>JAVA_DOC_BASE/doc-files/OpenDocument-v1.2-cd05-part1.html#datatype-countryCode</code>.
+ */
+public class OdfDatatypeTaglet implements Taglet {
+
+	private static final Logger LOG = Logger.getLogger(OdfDatatypeTaglet.class.getName());
+	private static final String NAME = "odf.datatype";
+	private static final String ODF_SPEC_PATH = "../../../../doc-files/OpenDocument-v1.2-part1.html";
+	private static String mOdfSpecPath = null;
+
+	/* FINDING THE ABSOLUTE PATH TO THE ODF SPEC IN HTML:
+	 * 1) Try to get the odfSpecPath from the Java System variable (ODF_SPEC_PATH)
+	 * 2) Try to get the odfSpecPath from the environemnt variable (ODF_SPEC_PATH)
+	 * 3) If both not worked, use the default path
+	 **/
+	static {
+		mOdfSpecPath = System.getProperty("ODF_SPEC_PATH");
+		if (mOdfSpecPath == null) {
+			mOdfSpecPath = System.getenv("ODF_SPEC_PATH");
+			if (mOdfSpecPath == null) {
+				mOdfSpecPath = ODF_SPEC_PATH;
+				LOG.info("OdfSpecPath was set to " + mOdfSpecPath + " by class declaration.");
+			} else {
+				LOG.info("OdfSpecPath was set to " + mOdfSpecPath + " by environment property 'ODF_SPEC_PATH'.");
+			}
+		} else {
+			LOG.info("OdfSpecPath was set to " + mOdfSpecPath + " by Java System property 'ODF_SPEC_PATH'.");
+		}
+	}
+
+	/**
+	 * @return the name of this custom tag.
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/**
+	 * @return true since this tag can be used in a field
+	 *         doc comment
+	 */
+	public boolean inField() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a constructor
+	 *         doc comment
+	 */
+	public boolean inConstructor() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a method
+	 *         doc comment
+	 */
+	public boolean inMethod() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in an overview
+	 *         doc comment
+	 */
+	public boolean inOverview() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a package
+	 *         doc comment
+	 */
+	public boolean inPackage() {
+		return true;
+	}
+
+	/**
+	 * @return true since this
+	 */
+	public boolean inDatatype() {
+		return true;
+	}
+
+	/**
+	 * Will return true since this is an inline tag.
+	 * @return true since this is an inline tag.
+	 */
+	public boolean isInlineTag() {
+		return true;
+	}
+
+	/**
+	 * Register this Taglet.
+	 * @param tagletMap  the map to register this tag to.
+	 */
+	public static void register(Map<String, Taglet> tagletMap) {
+		OdfDatatypeTaglet tag = new OdfDatatypeTaglet();
+		Taglet t = tagletMap.get(tag.getName());
+		if (t != null) {
+			tagletMap.remove(tag.getName());
+		}
+		tagletMap.put(tag.getName(), tag);
+	}
+
+	/**
+	 * Given the <code>Tag</code> representation of this custom
+	 * tag, return its string representation.
+	 * @param tag he <code>Tag</code> representation of this custom tag.
+	 * @return the string representation of the custom tag
+	 */
+	public String toString(Tag tag) {
+		String fragmentIdentifier = "datatype-" + tag.text();
+		return "<a href=\"" + mOdfSpecPath + "#" + fragmentIdentifier + "\">" + tag.text() + "</a>";
+	}
+
+	/**
+	 * This method should not be called since arrays of inline tags do not
+	 * exist.  Method should be used to convert this
+	 * inline tag to a string.
+	 * @param tags the array of <code>Tag</code>s representing of this custom tag.
+	 * @return Nothing is returned, instead an <code>UnsupportedOperationException</code> is being thrown.
+
+	 */
+	public String toString(Tag[] tags) {
+		throw new java.lang.UnsupportedOperationException("Arrays of inline tags do not exist!");
+	}
+
+	public boolean inType() {
+		throw new UnsupportedOperationException("Not supported yet.");
+	}
+}
diff --git a/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfElementTaglet.java b/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfElementTaglet.java
new file mode 100644
index 0000000..ca421ed
--- /dev/null
+++ b/trunk/taglets/src/main/java/org/odftoolkit/odfdom/taglet/OdfElementTaglet.java
@@ -0,0 +1,206 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2009 IBM. All rights reserved.
+ * Copyright 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.odftoolkit.odfdom.taglet;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import com.sun.javadoc.Tag;
+import com.sun.tools.doclets.Taglet;
+
+/**
+ * This class implements a custom taglet to the map the ODF element to the
+ * declaration of the ODF element in the OpenDocument specification.
+ * 
+ * The position of the OpenDocument specification in HTML can be provided using
+ * an environment variable or java system property, while the system property
+ * overrides the environment variable. In case nothing is been a default path
+ * within the JavaDoc doc-files directory is being used.
+ * 
+ * For example the taglet <code>{&#64;odf.element text:span}</code> would be
+ * resolved without variable settings to
+ * <code>JAVA_DOC_BASE/doc-files/OpenDocument-v1.2-part1.html#element-text_span</code>
+ * .
+ */
+public class OdfElementTaglet implements Taglet {
+
+	private static final Logger LOG = Logger.getLogger(OdfElementTaglet.class.getName());
+	private static final String NAME = "odf.element";
+	private static final String ODF_SPEC_PART1_PATH = "../../../../../../doc-files/OpenDocument-v1.2-part1.html";
+	private static final String ODF_SPEC_PART3_PATH = "../../../../../doc-files/OpenDocument-v1.2-part3.html";
+	private static String mOdfSpecPart1Path = null;
+	private static String mOdfSpecPart3Path = null;
+	private static Set<String> mNS_IN_PART3 = new HashSet<String>();
+
+	// initial attribute set which should be search in part3.
+	static {
+		mNS_IN_PART3.add("manifest");
+		mNS_IN_PART3.add("dsig");
+		mNS_IN_PART3.add("ds");
+	}
+
+	/*
+	 * FINDING THE ABSOLUTE PATH TO THE ODF SPEC PART1 and PART3 IN HTML: 
+	 * 1) Try to get the odfSpecPath from the Java System variable (ODF_SPEC_PATH) 
+	 * 2) Try to get the odfSpecPath from the environment variable (ODF_SPEC_PATH)
+	 * 3) If both not worked, use the default path
+	 */
+	static {
+		mOdfSpecPart1Path = System.getProperty("ODF_SPEC_PART1_PATH");
+		if (mOdfSpecPart1Path == null) {
+			mOdfSpecPart1Path = System.getenv("ODF_SPEC_PATH");
+			if (mOdfSpecPart1Path == null) {
+				mOdfSpecPart1Path = ODF_SPEC_PART1_PATH;
+				LOG.info("OdfSpecPart1Path was set to " + mOdfSpecPart1Path + " by class declaration.");
+			} else {
+				LOG.info("OdfSpecPart1Path was set to " + mOdfSpecPart1Path + " by environment property 'ODF_SPEC_PATH'.");
+			}
+		} else {
+			LOG.info("OdfSpecPart1Path was set to " + mOdfSpecPart1Path + " by Java System property 'ODF_SPEC_PATH'.");
+		}
+
+		mOdfSpecPart3Path = System.getProperty("ODF_SPEC_PART3_PATH");
+		if (mOdfSpecPart3Path == null) {
+			mOdfSpecPart3Path = System.getenv("ODF_SPEC_PATH");
+			if (mOdfSpecPart3Path == null) {
+				mOdfSpecPart3Path = ODF_SPEC_PART3_PATH;
+				LOG.info("OdfSpecPart3Path was set to " + mOdfSpecPart3Path + " by class declaration.");
+			} else {
+				LOG.info("OdfSpecPart3Path was set to " + mOdfSpecPart3Path + " by environment property 'ODF_SPEC_PATH'.");
+			}
+		} else {
+			LOG.info("OdfSpecPart3Path was set to " + mOdfSpecPart3Path + " by Java System property 'ODF_SPEC_PATH'.");
+		}
+
+	}
+
+	/**
+	 * Return the name of this custom tag.
+	 */
+	public String getName() {
+		return NAME;
+	}
+
+	/**
+	 * @return true since this tag can be used in a field doc comment
+	 */
+	public boolean inField() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a constructor doc comment
+	 */
+	public boolean inConstructor() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a method doc comment
+	 */
+	public boolean inMethod() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in an overview doc comment
+	 */
+	public boolean inOverview() {
+		return true;
+	}
+
+	/**
+	 * @return true since this tag can be used in a package doc comment
+	 */
+	public boolean inPackage() {
+		return true;
+	}
+
+	/**
+	 * @return true since this
+	 */
+	public boolean inType() {
+		return true;
+	}
+
+	/**
+	 * Will return true since this is an inline tag.
+	 * 
+	 * @return true since this is an inline tag.
+	 */
+
+	public boolean isInlineTag() {
+		return true;
+	}
+
+	/**
+	 * Register this Taglet.
+	 * 
+	 * @param tagletMap
+	 *            the map to register this tag to.
+	 */
+	public static void register(Map<String, Taglet> tagletMap) {
+		OdfElementTaglet tag = new OdfElementTaglet();
+		Taglet t = tagletMap.get(tag.getName());
+		if (t != null) {
+			tagletMap.remove(tag.getName());
+		}
+		tagletMap.put(tag.getName(), tag);
+	}
+
+	/**
+	 * Given the <code>Tag</code> representation of this custom tag, return its
+	 * string representation.
+	 * 
+	 * @param tag
+	 *            he <code>Tag</code> representation of this custom tag.
+	 */
+	public String toString(Tag tag) {
+		int pos = tag.text().lastIndexOf(":");
+		String namespace = tag.text().substring(0, pos);
+		String name = tag.text().substring(pos + 1);
+		String mOdfSpecPath = mOdfSpecPart1Path;
+		if (mNS_IN_PART3.contains(namespace)) {
+			mOdfSpecPath = mOdfSpecPart3Path;
+		}
+		String fragmentIdentifier = "element-" + namespace + "_" + name;
+		if("ds:Signature".equals(tag.text())){
+			fragmentIdentifier = "element2-xmldsig_Signature";
+		}
+		return "<a href=\"" + mOdfSpecPath + "#" + fragmentIdentifier + "\">" + tag.text() + "</a>";
+	}
+
+	/**
+	 * This method should not be called since arrays of inline tags do not
+	 * exist. Method should be used to convert this inline tag to a string.
+	 * 
+	 * @param tags
+	 *            the array of <code>Tag</code>s representing of this custom
+	 *            tag.
+	 */
+	public String toString(Tag[] tags) {
+		return null;
+	}
+
+}
diff --git a/trunk/validator/LICENSE.txt b/trunk/validator/LICENSE.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/trunk/validator/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/trunk/validator/README.txt b/trunk/validator/README.txt
new file mode 100644
index 0000000..eb74ee0
--- /dev/null
+++ b/trunk/validator/README.txt
@@ -0,0 +1,49 @@
+*************************************************************
+* ODFDOM Java Library                                       *
+*                                                           *
+*************************************************************
+
+
+About ODFDOM
+-------------
+
+ODFDOM is an OpenDocument Format (ODF) framework. Its purpose 
+is to provide an easy common way to create, access and 
+manipulate ODF files, without requiring detailed knowledge of
+the ODF specification. It is designed to provide the ODF
+developer community with an easy lightwork programming API
+portable to any object-oriented language.
+
+The current reference implementation is written in Java.
+
+
+Documentation
+--------------
+
+The latest release notes and a summary of API changes (if any) are available
+online at the project's Wiki page:
+    http://odftoolkit.org/projects/odfdom/pages/ReleaseNotes
+
+In general, the Wiki page is a great place to start when looking for online
+documentation and other information about the odfdom project.
+    http://odftoolkit.org/projects/odfdom/pages/Home
+
+API documentation (Javadoc) can be downloaded from the project's download area:
+    http://odftoolkit.org/projects/odfdom/downloads
+
+The Javadoc can also be viewed online and is available for each version, e.g.
+    http://odfdom.odftoolkit.org/0.8.6/docs/api/
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
+
+Installation
+-------------
+
+Just put the file odfdom.jar in your classpath. You will
+need Apache Xerces-J as well. Get it from
+    http://xml.apache.org/dist/xerces-j/
diff --git a/trunk/validator/pom.xml b/trunk/validator/pom.xml
new file mode 100644
index 0000000..420f92d
--- /dev/null
+++ b/trunk/validator/pom.xml
@@ -0,0 +1,533 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.odftoolkit</groupId>
+		<artifactId>odftoolkit</artifactId>
+		<version>0.6.1-incubating</version>
+	</parent>
+	<artifactId>odfvalidator</artifactId>
+	<version>1.1.7-incubating</version>
+	<packaging>war</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>odfdom-java</artifactId>
+			<version>0.8.10-incubating</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>net.java.dev.msv</groupId>
+			<artifactId>msv-core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.iso_relax.verifier.jaxp.validation</groupId>
+			<artifactId>isorelax-jaxp-bridge</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>xerces</groupId>
+			<artifactId>xercesImpl</artifactId>
+		</dependency>
+        <dependency>
+            <groupId>xml-apis</groupId>
+            <artifactId>xml-apis</artifactId>
+        </dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss</maven.build.timestamp.format>
+	</properties>
+
+	<!--
+   The POM of org.iso_relax.verifier.jaxp.validation:isorelax-jaxp-bridge:jar:1.0
+   on the central repo is not 4.0.0 complaint so that we should pick the one SMX
+   Repo already provides, as otherwise building under Maven 3.0.4 would fail!
+   So delete any old .m2 cache entries of yours for this artifact beforehand if
+   you make use of Maven 3.0.4+
+ -->
+	<repositories>
+		<repository>
+			<id>apache.smx.repo</id>
+			<url>http://svn.apache.org/repos/asf/servicemix/m2-repo/</url>
+			<name>Apache ServiceMix Repo</name>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+		</repository>
+	</repositories>
+
+	<!-- Build Settings -->
+	<build>
+		<extensions>
+			<extension>
+				<groupId>org.apache.maven.wagon</groupId>
+				<artifactId>wagon-webdav-jackrabbit</artifactId>
+				<version>1.0-beta-7</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>wagon-maven-plugin</artifactId>
+				<version>1.0-beta-3</version>
+				<executions>
+					<execution>
+						<id>download-odf-schema-v1.2</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://docs.oasis-open.org/office/v1.2</url>
+							<fromFile>os/OpenDocument-v1.2-os-schemas.zip</fromFile>
+							<toDir>${project.build.directory}/schemas</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-odf-manifest-schema-v1.1</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://docs.oasis-open.org/office/v1.1</url>
+							<fromFile>OS/OpenDocument-manifest-schema-v1.1.rng</fromFile>
+							<toDir>${project.build.directory}/classes/schema/odf1.1</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-odf-schema-v1.1</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://docs.oasis-open.org/office/v1.1</url>
+							<fromFile>OS/OpenDocument-schema-v1.1.rng</fromFile>
+							<toDir>${project.build.directory}/classes/schema/odf1.1</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-odf-strict-schema-v1.1</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://docs.oasis-open.org/office/v1.1</url>
+							<fromFile>OS/OpenDocument-strict-schema-v1.1.rng</fromFile>
+							<toDir>${project.build.directory}/classes/schema/odf1.1</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-odf-manifest-schema-v1.0</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://oasis-open.org/committees/download.php/12570</url>
+							<fromFile>OpenDocument-manifest-schema-v1.0-os.rng</fromFile>
+							<toDir>${project.build.directory}/classes/schema/odf1.0</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-odf-schema-v1.0</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://www.oasis-open.org/committees/download.php/12571</url>
+							<fromFile>OpenDocument-schema-v1.0-os.rng</fromFile>
+							<toDir>${project.build.directory}/classes/schema/odf1.0</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-odf-strict-schema-v1.0</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://www.oasis-open.org/committees/download.php/12569</url>
+							<fromFile>OpenDocument-strict-schema-v1.0-os.rng</fromFile>
+							<toDir>${project.build.directory}/classes/schema/odf1.0</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-mathml-schema-v3.0</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://www.w3.org/Math/RelaxNG</url>
+							<fromFile>mathml3-relaxng.zip</fromFile>
+							<toDir>${project.build.directory}/schemas</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-mathml-schema-v2.0</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://www.w3.org/Math/XMLSchema</url>
+							<fromFile>mathml2.tgz</fromFile>
+							<toDir>${project.build.directory}/schemas</toDir>
+						</configuration>
+					</execution>
+					<execution>
+						<id>download-mathml-schema-v1.01</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>download-single</goal>
+						</goals>
+						<configuration>
+							<url>dav:http://www.w3.org/pub/WWW/TR/REC-MathML</url>
+							<fromFile>mmlents.zip</fromFile>
+							<toDir>${project.build.directory}/schemas</toDir>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.2</version>
+				<executions>
+					<execution>
+						<id>unzip schema packages</id>
+						<phase>validate</phase>
+						<configuration>
+							<tasks>
+								<echo message="unzip odf 1.2 schemas" />
+								<unzip src="${project.build.directory}/schemas/OpenDocument-v1.2-os-schemas.zip" dest="${project.build.directory}/classes/schema/odf1.2/" />
+								<echo message="unzip mathml 3.0 schemas" />
+								<unzip src="${project.build.directory}/schemas/mathml3-relaxng.zip" dest="${project.build.directory}/schemas/" />
+								<move file="${project.build.directory}/schemas/mathml3" tofile="${project.build.directory}/classes/schema/mathml3.0" />
+								<echo message="untar mathml 2.0 schemas" />
+								<untar src="${project.build.directory}/schemas/mathml2.tgz" dest="${project.build.directory}/schemas/" />
+								<move file="${project.build.directory}/schemas/mathml2" tofile="${project.build.directory}/classes/schema/mathml2.0" />
+								<echo message="unzip mathml 1.01 schemas" />
+								<unzip src="${project.build.directory}/schemas/mmlents.zip" dest="${project.build.directory}/schemas/" />
+								<move file="${project.build.directory}/schemas/mmlents" tofile="${project.build.directory}/classes/schema/mathml1.01" />
+							</tasks>
+						</configuration>
+						<goals>
+							<goal>run</goal>
+						</goals>
+					</execution>
+
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+					<meminitial>512m</meminitial>
+					<maxmem>1024m</maxmem>
+					<showDeprecation>true</showDeprecation>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.3.1</version>
+				<configuration>
+					<archive>
+						<index>true</index>
+						<!--  No custom manifest worked, neither the below..
+							<index>true</index>
+							<manifest>
+								<addClasspath>true</addClasspath>
+								<odfdomName>ODFDOM Validator</odfdomName>
+								<odfdomVersion>${project.version}</odfdomVersion>
+								<odfdomWebsite>http://incubator.apache.org/odftoolkit/conformance/ODFValidator.html</odfdomWebsite>
+								<odfdomBuiltDate>${build.timestamp}</odfdomBuiltDate>
+								<odfdomSupportedOdfVersion>1.2</odfdomSupportedOdfVersion>
+								<mainClass>org.odftoolkit.odfvalidator.Main</mainClass>
+							</manifest>
+						</archive>-->
+						<manifestEntries>
+							<version>${project.version}</version>
+						</manifestEntries>
+						<manifestSections>
+							<manifestSection>
+								<name>odfvalidator</name>
+								<manifestEntries>
+									<ODFDOM-Name>ODFDOM Validator</ODFDOM-Name>
+									<ODFDOM-Version>${project.version}</ODFDOM-Version>
+									<ODFDOM-Website>http://incubator.apache.org/odftoolkit/conformance/ODFValidator.html</ODFDOM-Website>
+									<ODFDOM-Built-Date>${build.timestamp}</ODFDOM-Built-Date>
+									<ODFDOM-Supported-Odf-Version>1.2</ODFDOM-Supported-Odf-Version>
+								</manifestEntries>
+							</manifestSection>
+						</manifestSections>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-release-plugin</artifactId>
+				<version>2.1</version>
+				<configuration>
+					<!-- Workaround for http://jira.codehaus.org/browse/MGPG-9 -->
+					<mavenExecutorId>forked-path</mavenExecutorId>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<!-- Explizit version required for fix on systemPropertyVariables -->
+				<version>2.6</version>
+				<configuration>
+					<systemPropertyVariables>
+						<odfdom.version>${project.version}</odfdom.version>
+						<odfdom.timestamp>${build.timestamp}</odfdom.timestamp>
+						<org.odftoolkit.odfdom.validation>org.odftoolkit.odfdom.pkg.DefaultErrorHandler</org.odftoolkit.odfdom.validation>
+					</systemPropertyVariables>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-source-plugin</artifactId>
+				<version>2.1.2</version>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<configuration>
+					<archive>
+						<manifestEntries>							
+							<version>${project.version}</version>
+							<Main-Class>org.odftoolkit.odfvalidator.Main</Main-Class>
+						</manifestEntries>
+					</archive>
+					<descriptors>					
+						<descriptor>src/main/assembly/src.xml</descriptor>
+					</descriptors>
+				</configuration>
+				<executions>
+					<execution>
+						<id>single</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.rat</groupId>
+				<artifactId>apache-rat-plugin</artifactId>
+				<configuration>
+					<excludes>
+						<exclude>src/main/resources/**</exclude>
+						<exclude>src/test/resources/**</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<reporting>
+		<plugins>
+			<!-- Code Coverage Testing generated by Cobertura -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>cobertura-maven-plugin</artifactId>
+				<version>2.4</version>
+				<configuration>
+					<instrumentation>
+						<excludes>
+							<exclude>org/odftoolkit/**/*Test.class</exclude>
+						</excludes>
+					</instrumentation>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<doctitle>ODFDOM</doctitle>
+					<minmemory>512m</minmemory>
+					<maxmemory>1024m</maxmemory>
+					<links>
+						<link>http://download.oracle.com/javase/6/docs/api/</link>
+						<link>http://xerces.apache.org/xerces-j/apiDocs/</link>
+					</links>
+					<splitindex>true</splitindex>
+					<windowtitle>ODFDOM Validator API v${project.version} - http://incubator.apache.org/odftoolkit/</windowtitle>
+				</configuration>
+			</plugin>
+			<!-- Reporting integration test results -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+				<version>2.5</version>
+				<reportSets>
+					<reportSet>
+						<id>integration-tests</id>
+						<reports>
+							<report>report-only</report>
+						</reports>
+						<configuration>
+							<outputName>failsafe-report</outputName>
+						</configuration>
+					</reportSet>
+				</reportSets>
+			</plugin>
+		</plugins>
+	</reporting>
+
+	<!-- More Project Information -->
+	<name>ODF Validator</name>
+	<description>
+		ODF Validator is a tool that validates OpenDocument files and checks them for certain conformance criteria.
+	</description>
+	<url>http://incubator.apache.org/odftoolkit/conformance/ODFValidator.html</url>
+	<inceptionYear>2008</inceptionYear>
+	<licenses>
+		<license>
+			<name>Apache 2</name>
+			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+		</license>
+	</licenses>
+	<organization>
+		<name>The Apache Software Foundation</name>
+		<url>http://www.apache.org/</url>
+	</organization>
+	<scm>
+		<connection>scm:svn:http://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/validator</connection>
+		<developerConnection>scm:svn:https://svn.apache.org/repos/asf/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/validator</developerConnection>
+		<url>http://svn.apache.org/viewvc/incubator/odf/tags/odftoolkit-0.6.1-incubating-RC1/validator</url>
+	</scm>
+	<profiles>
+		<profile>
+			<id>integration-test</id>
+			<activation>
+				<property>
+					<name>integration-test</name>
+				</property>
+			</activation>
+			<build>
+				<defaultGoal>verify</defaultGoal>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-failsafe-plugin</artifactId>
+						<version>2.5</version>
+						<executions>
+							<execution>
+								<id>failsafe-it</id>
+								<phase>integration-test</phase>
+								<goals>
+									<goal>integration-test</goal>
+									<goal>verify</goal>
+								</goals>
+								<configuration>
+									<classesDirectory>${basedir}/target/odfdom.jar</classesDirectory>
+									<systemPropertyVariables>
+										<testresourcefolder>performance</testresourcefolder>
+										<executetimes>1</executetimes>
+										<testflag>test</testflag>
+									</systemPropertyVariables>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-surefire-plugin</artifactId>
+						<!-- Explizit version required for fix on systemPropertyVariables -->
+						<version>2.6</version>
+						<configuration>
+							<systemPropertyVariables>
+								<odfdom.version>${project.version}</odfdom.version>
+								<odfdom.timestamp>${build.timestamp}</odfdom.timestamp>
+								<org.odftoolkit.odfdom.validation>true</org.odftoolkit.odfdom.validation>
+							</systemPropertyVariables>
+							<skip>true</skip>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<!-- Profile for deploying to the Sonatype repository, which
+  requires GPG signatures 
+  see
+  https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
+  https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven
+  https://issues.sonatype.org/browse/OSSRH-960
+  -->
+		<profile>
+			<id>release-sign-artifacts</id>
+			<activation>
+				<property>
+					<name>performRelease</name>
+					<value>true</value>
+				</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-gpg-plugin</artifactId>
+						<version>1.1</version>
+						<executions>
+							<execution>
+								<id>sign-artifacts</id>
+								<phase>verify</phase>
+								<goals>
+									<goal>sign</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+</project>
diff --git a/trunk/validator/src/main/assembly/src.xml b/trunk/validator/src/main/assembly/src.xml
new file mode 100644
index 0000000..afa435c
--- /dev/null
+++ b/trunk/validator/src/main/assembly/src.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+	<!-- TODO: a jarjar format would be better -->
+	<id>jar-with-dependencies</id>
+	<formats>
+		<format>jar</format>
+	</formats>
+	<includeBaseDirectory>false</includeBaseDirectory>
+	<dependencySets>
+		<dependencySet>
+			<outputDirectory>/</outputDirectory>
+			<useProjectArtifact>true</useProjectArtifact>
+			<unpack>true</unpack>
+			<scope>runtime</scope>
+		</dependencySet>
+	</dependencySets>
+	<!-- customization: add classes (wtf isn't this included by default?) -->
+	<fileSets>
+		<fileSet>
+			<outputDirectory>/</outputDirectory>
+			<directory>${basedir}/target/classes</directory>
+			<useDefaultExcludes>true</useDefaultExcludes>
+		</fileSet>
+	</fileSets>
+</assembly>
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Configuration.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Configuration.java
new file mode 100644
index 0000000..0f96352
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Configuration.java
@@ -0,0 +1,93 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.TreeSet;
+import java.util.Vector;
+
+public class Configuration extends Properties {
+
+    
+    public static final String SCHEMA = "schema";
+    public static final String STRICT_SCHEMA = "strict-schema";
+    public static final String MANIFEST_SCHEMA = "manifest-schema";
+    public static final String MATHML_SCHEMA = "mathml-schema";
+    public static final String MATHML2_SCHEMA = "mathml2-schema";
+    public static final String DSIG_SCHEMA = "dsig-schema";
+    public static final String PATH = "path";
+    public static final String EXCLUDE = "exclude";
+    public static final String RECURSIVE = "recursive";
+    public static final String FILTER = "filter";
+
+    public static final String VALIDATOR_URL = "validator-url";
+    public static final String PROXY_HOST="proxy-host";
+    public static final String PROXY_PORT="proxy-port";
+
+    /** Creates a new instance of AppProperties */
+    public Configuration()
+    {
+    }
+    
+    public Configuration( File aConfigFile ) throws FileNotFoundException, IOException
+    {
+        FileInputStream aInStream = new FileInputStream( aConfigFile );
+        loadFromXML( aInStream );
+        aInStream.close();
+    }
+    
+
+    public void store( File aConfigFile ) throws FileNotFoundException, IOException 
+    {
+        FileOutputStream aOutStream = new FileOutputStream( aConfigFile );
+        storeToXML( aOutStream, null );
+        aOutStream.close();
+    }
+    
+    public List<String> getListPropety( String aPropNamePrefix )
+    {
+        TreeSet<String> aSortedPropNames = new TreeSet<String>();
+        Enumeration aPropNames = propertyNames();
+        while( aPropNames.hasMoreElements() )
+        {
+            String aPropName = (String)aPropNames.nextElement();
+            if( aPropName.startsWith(aPropNamePrefix))
+                aSortedPropNames.add(aPropName);
+        }
+        
+        List<String> aValues = new Vector<String>(aSortedPropNames.size());
+        Iterator<String> aIter = aSortedPropNames.iterator();
+        while( aIter.hasNext() )
+            aValues.add(getProperty( aIter.next() ) );
+        
+        return aValues;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ContentFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ContentFilter.java
new file mode 100644
index 0000000..dcbaffd
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ContentFilter.java
@@ -0,0 +1,112 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+class ContentFilter extends NamespaceFilter {
+
+    private static final String CD2_SVG_NAMESPACE_URI = "http://www.w3.org/2000/svg";
+    private static final String CD2_XSL_NAMESPACE_URI = "http://www.w3.org/1999/XSL/Format";
+    private static final String CD2_SMIL_NAMESPACE_URI = "http://www.w3.org/2001/SMIL20/";
+    private static final String BASE_OFFICE_NAMESPACE_URI = "http://openoffice.org/2004/office";
+    private static final String BASE_DB_NAMESPACE_URI = "http://openoffice.org/2004/database";
+    private static final String SVG_NAMESPACE_URI = OdfDocumentNamespace.SVG.getUri();
+    private static final String XSL_NAMESPACE_URI = OdfDocumentNamespace.FO.getUri();
+    private static final String SMIL_NAMESPACE_URI = OdfDocumentNamespace.SMIL.getUri();
+    private static final String DRAW_NAMESPACE_URI = OdfDocumentNamespace.DRAW.getUri();
+    private static final String OFFICE_NAMESPACE_URI = OdfDocumentNamespace.OFFICE.getUri();
+    private static final String DB_NAMESPACE_URI = OdfDocumentNamespace.DB.getUri();
+    private static final String BASE_OFFICE_NAMESPACE_PREFIX = "office";
+    private static final String POLYGON = "polygon";
+    private static final String CONTOUR_POLYGON = "contour-polygon";
+    private static final String POLYLINE = "polyline";
+    private static final String POINTS = "points";
+    private static final int MAX_POINTS_LEN = 2048;
+        
+    private Logger m_aLogger;
+    private String m_aLocalElementName;
+    private boolean m_bRoot = true;
+    
+    /** Creates a new instance of KnownIssueFilter */
+    ContentFilter( Logger aLogger, String aLocalElementName ) {
+        m_aLogger = aLogger;
+        m_aLocalElementName = aLocalElementName;
+    }
+
+    String adaptNamespaceUri( String aUri, String aPrefix)
+    {
+        String aNewUri = null;
+        if( aUri.equals(CD2_SVG_NAMESPACE_URI) )
+            aNewUri = SVG_NAMESPACE_URI;
+        else if( aUri.equals(CD2_XSL_NAMESPACE_URI) )
+             aNewUri = XSL_NAMESPACE_URI;
+        else if( aUri.equals(CD2_SMIL_NAMESPACE_URI) ) 
+            aNewUri = SMIL_NAMESPACE_URI;
+        else if( aUri.equals(BASE_OFFICE_NAMESPACE_URI) &&
+                 (aPrefix == null || aPrefix.startsWith(BASE_OFFICE_NAMESPACE_PREFIX)) )
+            aNewUri = OFFICE_NAMESPACE_URI;
+        else if( aUri.equals(BASE_DB_NAMESPACE_URI) )
+            aNewUri = DB_NAMESPACE_URI;
+        
+        return aNewUri;
+    }
+
+    void namespaceUriAdapted( String aUri, String aNewUri )
+    {
+        String aMsg = (aUri.equals(BASE_OFFICE_NAMESPACE_URI) || aUri.equals(BASE_DB_NAMESPACE_URI))
+                ? "Adapting Base namspace'" + aUri + "'"
+                : "Adapting OpenDocument CD2 namspace'" + aUri + "' (has been stored by old OOo versions)";
+        m_aLogger.logInfo( aMsg , false);
+    }
+
+    @Override
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAtts) throws SAXException {
+        if( aUri.equals(DRAW_NAMESPACE_URI) && 
+            (aLocalName.equals(POLYGON) || aLocalName.equals(POLYLINE) || aLocalName.equals(CONTOUR_POLYGON)) )
+        {
+            String aPointsValue = aAtts.getValue(DRAW_NAMESPACE_URI,POINTS);
+            if( aPointsValue != null && aPointsValue.length() > MAX_POINTS_LEN )
+            {
+                m_aLogger.logInfo( String.format("'draw:points' of <%s> has been stripped (value starts with '%s')",aQName,aPointsValue.substring(0,40)), false);
+                AttributesImpl aNewAtts = new AttributesImpl( aAtts );
+                int nAttr = aNewAtts.getIndex(DRAW_NAMESPACE_URI,POINTS);
+                int nPos = aPointsValue.lastIndexOf(' ',MAX_POINTS_LEN);
+                String aNewValue = nPos != -1 ? aPointsValue.substring(0,nPos) : "";
+                aNewAtts.setValue(nAttr, aNewValue );
+                aAtts = aNewAtts;
+            }
+        }
+        super.startElement(aUri, aLocalName, aQName, aAtts);
+        if( m_bRoot )
+        {
+            if( !(aUri.equals(OFFICE_NAMESPACE_URI) && aLocalName.equals(m_aLocalElementName)) )
+                m_aLogger.logError("Invalid root element: " + aQName );
+            m_bRoot = false;
+        }
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/DSigFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/DSigFilter.java
new file mode 100644
index 0000000..d072429
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/DSigFilter.java
@@ -0,0 +1,53 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+class DSigFilter extends NamespaceFilter {
+
+    private static final String OOO_DSIG_NAMESPACE_URI = "http://openoffice.org/2004/documentsignatures";
+    private static final String DSIG_NAMESPACE_URI = "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0";
+        
+    private Logger m_aLogger;
+    
+    /** Creates a new instance of KnownIssueFilter */
+    DSigFilter( Logger aLogger ) {
+        m_aLogger = aLogger;
+    }
+
+    String adaptNamespaceUri( String aUri, String aPrefix)
+    {
+        String aNewUri = null;
+        if( aUri.equals(OOO_DSIG_NAMESPACE_URI) )
+            aNewUri = DSIG_NAMESPACE_URI;
+        
+        return aNewUri;
+    }
+
+    void namespaceUriAdapted( String aUri, String aNewUri )
+    {
+        String aMsg = "Adapting dsig namspace'" + aUri + "'";
+        m_aLogger.logInfo( aMsg , false);
+    }
+
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java
new file mode 100644
index 0000000..fd7a6b0
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentFilter.java
@@ -0,0 +1,191 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.util.HashSet;
+import java.util.Vector;
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+class ForeignContentFilter extends XMLFilterImpl {
+
+    private static final String OFFICE_NAMESPACE_URI = OdfDocumentNamespace.OFFICE.getUri();
+    private static final String TEXT_NAMESPACE_URI = OdfDocumentNamespace.TEXT.getUri();
+
+    private static final String H = "h";
+    private static final String P = "p";
+
+    private static final String PROCESS_CONTENT = "process-content";
+    private static final String TRUE = "true";
+
+    // Set of ODF namespace URIs
+    private static HashSet<String> m_aODFNamespaceSet = null;
+
+    // This list contains a boolean for all ancestor foreign elements.
+    // That boolean values specifies whether the element content is processed or not.
+    private Vector<Boolean> m_aAlienElementProcessContents = null;
+
+    // This list contains a boolean for all ancestor elements.
+    // That boolean values specifies whether the element is a text:h ot text:p
+    // element itself or has a text:h or text:p ancestor element.
+    private Vector<Boolean> m_aParagraphAncestorElements = null;
+
+    private ForeignContentListener m_aForeignContentListener = null;
+
+    private OdfVersion m_aVersion = null;
+    private Logger m_aLogger;
+
+    /** Creates a new instance of NamespaceFilter */
+    ForeignContentFilter( Logger aLogger, OdfVersion aVersion, ForeignContentListener aForeignContentListener ) {
+        m_aLogger = aLogger;
+        m_aVersion = aVersion;
+        m_aForeignContentListener = aForeignContentListener;
+
+        m_aAlienElementProcessContents = new Vector<Boolean>();
+        m_aParagraphAncestorElements = new Vector<Boolean>();
+        
+        m_aODFNamespaceSet = new HashSet<String>();
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.OFFICE.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.STYLE.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.TEXT.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.TABLE.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.DRAW.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.FO.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.DC.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.META.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.NUMBER.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.SVG.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.CHART.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.DR3D.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.FORM.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.PRESENTATION.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.SMIL.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.CONFIG.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.SCRIPT.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.XLINK.getUri() );
+        m_aODFNamespaceSet.add( OdfDocumentNamespace.XFORMS.getUri() );
+        if( m_aVersion.compareTo( OdfVersion.V1_2 ) >= 0 )
+        {
+            m_aODFNamespaceSet.add( OdfDocumentNamespace.XHTML.getUri() );
+            m_aODFNamespaceSet.add( OdfDocumentNamespace.GRDDL.getUri() );
+            m_aODFNamespaceSet.add( OdfDocumentNamespace.DB.getUri() );
+            m_aODFNamespaceSet.add( javax.xml.XMLConstants.XML_NS_URI );
+        }
+    }
+
+
+    @Override
+    public void endElement(String aUri, String aLocalName, String aQName) throws SAXException {
+        if( isAlienNamespace(aUri) )
+        {
+            m_aAlienElementProcessContents.removeElementAt( m_aAlienElementProcessContents.size()-1 );
+        }
+        else
+        {
+            if( isProcessContent() )
+                super.endElement(aUri,aLocalName,aQName);
+        }
+    }
+
+
+    @Override
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAtts) throws SAXException
+    {
+        boolean bProcessContent = isProcessContent();
+        
+        if( isAlienNamespace(aUri) )
+        {
+            if( bProcessContent )
+            {
+                String aProcessContentValue = aAtts.getValue( OFFICE_NAMESPACE_URI, PROCESS_CONTENT );
+                if( m_aVersion.compareTo( OdfVersion.V1_2 ) >= 0 )
+                {
+                    bProcessContent = aProcessContentValue != null ? aProcessContentValue.equals(TRUE) : true;
+                }
+                else
+                {
+                    bProcessContent = aProcessContentValue == null || aProcessContentValue.equals(TRUE);
+                }
+
+                if( m_aForeignContentListener!= null )
+                    m_aForeignContentListener.foreignElementDetected(aUri, aLocalName, aQName, aAtts);
+                m_aLogger.logInfo( String.format("extension element <%s> found, element is ignored, element content is %s.",aQName,bProcessContent?"processed":"is ignored"), false);
+            }
+            m_aAlienElementProcessContents.addElement( bProcessContent );
+        }
+        else if( bProcessContent )
+        {
+            Attributes aOldAtts = aAtts;
+
+            AttributesImpl aNewAtts = null;
+            int i = aOldAtts.getLength();
+            while( i>0 ) {
+                --i;
+                String aAttrUri = aOldAtts.getURI(i);
+                if ( isAlienNamespace( aAttrUri ) ) {
+                    if (aNewAtts == null) {
+                        aNewAtts = new AttributesImpl(aOldAtts);
+                        aAtts = aNewAtts;
+                    }
+                    if( m_aForeignContentListener!= null )
+                        m_aForeignContentListener.foreignAttributeDetected(aAttrUri, aOldAtts.getLocalName(i), aOldAtts.getQName(i), aOldAtts.getValue(i));
+                    m_aLogger.logInfo( String.format("extension attribute '%s' of element <%s> found and ignored.",aAtts.getQName(i),aQName), false);
+                    aNewAtts.removeAttribute(i);
+                }
+            }
+
+            boolean bParagraphAncestor = hasParagraphAncestorElement();
+            bParagraphAncestor |= ((aLocalName.equals(P) || aLocalName.equals(H)) && aUri.equals(TEXT_NAMESPACE_URI));
+            m_aParagraphAncestorElements.add(bParagraphAncestor);
+
+            super.startElement(aUri, aLocalName, aQName, aAtts);
+        }
+    }
+    
+    
+
+    private boolean isAlienNamespace( String aUri )
+    {
+        return !m_aODFNamespaceSet.contains(aUri);
+    }
+
+    private boolean isProcessContent()
+    {
+        return m_aAlienElementProcessContents.isEmpty() ? true : m_aAlienElementProcessContents.lastElement();
+    }
+
+    private boolean hasParagraphAncestorElement()
+    {
+        return m_aParagraphAncestorElements.isEmpty() ? false : m_aParagraphAncestorElements.lastElement();
+    }
+
+    @Override
+    public void characters(char[] aChars, int nStart, int nLength) throws SAXException {
+        if( isProcessContent() )
+            super.characters(aChars, nStart, nLength);
+    }
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentListener.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentListener.java
new file mode 100644
index 0000000..0b18948
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ForeignContentListener.java
@@ -0,0 +1,39 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.xml.sax.Attributes;
+
+/**
+ * Listener interface for foreign elements and attributes that are detected while
+ * validating a stream.
+ *
+ * @author Michael Brauer
+ */
+interface ForeignContentListener {
+    
+    void foreignElementDetected( String aUri, String aLocalName, String aQName, Attributes aAtts );
+
+    void foreignAttributeDetected( String aUri, String aLocalName, String aQName, String aValue );
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/InternalResources.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/InternalResources.java
new file mode 100644
index 0000000..28ca646
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/InternalResources.java
@@ -0,0 +1,50 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+public class InternalResources {
+
+    static final private String INTERNAL_RESOURCE_PREFIX = "internal:";
+
+    static boolean isInternalResourceIdentifer( String aPath )
+    {
+        return aPath.startsWith(INTERNAL_RESOURCE_PREFIX);
+    }
+    
+    static String getResourcePath( String aPath )
+    {
+		String newPath = null;
+        if(aPath.startsWith("internal:")){			
+			newPath = aPath.substring(INTERNAL_RESOURCE_PREFIX.length());
+		}
+		if(!newPath.startsWith("/")){		
+			newPath = "/".concat(aPath.substring(INTERNAL_RESOURCE_PREFIX.length()));
+		}			
+		return newPath;
+    }
+    
+    static String createInternalResourceIdentifier( String aPath )
+    {
+        return INTERNAL_RESOURCE_PREFIX.concat(aPath);
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java
new file mode 100644
index 0000000..673864d
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Logger.java
@@ -0,0 +1,246 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfvalidator;
+
+import java.io.PrintStream;
+
+import org.xml.sax.SAXParseException;
+
+public class Logger {
+
+	public enum LogLevel {
+
+		ERROR,
+		WARNING,
+		INFO
+	};
+	private String m_aFileName;
+	private String m_aEntryName;
+	private PrintStream m_aOut;
+	private int m_nErrors;
+	private int m_nWarnings;
+	private LogLevel m_nLevel;
+	private Logger m_aParentLogger;
+	private static final String INFO_PREFIX = "Info:";
+	private static final String WARNING_PREFIX = "Warning:";
+	private static final String ERROR_PREFIX = "Error:";
+	private static final String FATAL_PREFIX = "Fatal:";
+	private static boolean m_isHTMLEnabled;
+
+	/** Creates a new instance of Logger */
+	Logger(String aFileName, String aEntryName, PrintStream aOut, LogLevel nLevel) {
+		m_aFileName = aFileName;
+		m_aEntryName = aEntryName;
+		m_aOut = aOut;
+		m_nLevel = nLevel;
+		m_nErrors = 0;
+		m_nWarnings = 0;
+		m_aParentLogger = null;
+	}
+
+	/** Creates a new instance of Logger */
+	Logger(String aEntryName, Logger aParentLogger) {
+		m_aFileName = aParentLogger.m_aFileName;
+		m_aEntryName = aEntryName;
+		m_aOut = aParentLogger.m_aOut;
+		m_nLevel = aParentLogger.m_nLevel;
+		m_nErrors = 0;
+		m_nWarnings = 0;
+		m_aParentLogger = aParentLogger;
+	}
+
+	static void enableHTML(boolean isHTMLEnabled) {
+		m_isHTMLEnabled = isHTMLEnabled;
+	}
+
+	public PrintStream getOutputStream() {
+		return m_aOut;
+	}
+
+	public void setOutputStream(PrintStream aOut) {
+		m_aOut = aOut;
+	}
+
+	boolean hasError() {
+		return m_nErrors > 0;
+	}
+
+	boolean hasWarning() {
+		return m_nWarnings > 0;
+	}
+
+	int getErrorCount() {
+		return m_nErrors;
+	}
+
+	int getWarningCount() {
+		return m_nWarnings;
+	}
+
+	void logWarning(String aMsg) {
+		if (m_nLevel.compareTo(LogLevel.WARNING) >= 0) {
+			if (m_isHTMLEnabled) {
+				m_aOut.print("<span class='warning'>");
+			}
+			logMessage(WARNING_PREFIX, aMsg);
+		}
+		incWarnings();
+	}
+
+	void logFatalError(String aMsg) {
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='fatalError'>");
+		}
+		logMessage(FATAL_PREFIX, aMsg);
+		incErrors();
+	}
+
+	void logError(String aMsg) {
+		if (m_nLevel.compareTo(LogLevel.ERROR) >= 0) {
+			if (m_isHTMLEnabled) {
+				m_aOut.print("<span class='error'>");
+			}
+			logMessage(ERROR_PREFIX, aMsg);
+		}
+		incErrors();
+	}
+
+	void logInfo(String aMsg, boolean bForceOutput) {
+		if (m_nLevel.compareTo(LogLevel.INFO) >= 0 || bForceOutput) {
+			if (m_isHTMLEnabled) {
+				m_aOut.print("<span class='info'>");
+			}
+			logMessage(INFO_PREFIX, aMsg);
+		}
+	}
+
+	void logWarning(SAXParseException e) {
+		if (m_nLevel.compareTo(LogLevel.WARNING) >= 0) {
+			if (m_isHTMLEnabled) {
+				m_aOut.print("<span class='warning'>");
+			}
+			logMessage(WARNING_PREFIX, e);
+		}
+		incWarnings();
+	}
+
+	void logFatalError(SAXParseException e) {
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='fatalError'>");
+		}
+		logMessage(FATAL_PREFIX, e);
+		incErrors();
+	}
+
+	void logError(SAXParseException e) {
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='error'>");
+		}
+		if (m_nLevel.compareTo(LogLevel.ERROR) >= 0) {
+			logMessage(ERROR_PREFIX, e);
+		}
+		incErrors();
+	}
+
+	void logSummaryInfo() {
+		logInfo((hasError() ? getErrorCount() : "no") + " errors, " + (hasWarning() ? getWarningCount() : "no") + " warnings", false);
+	}
+
+	private void printFileEntryPrefix() {
+		m_aOut.print(m_aFileName);
+		if (m_aEntryName != null && m_aEntryName.length() > 0) {
+			m_aOut.print("/");
+			m_aOut.print(m_aEntryName);
+		}
+	}
+
+	private void logMessage(String aPrefix, SAXParseException e) {
+		// filepath
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='filePath'>");
+		}
+		printFileEntryPrefix();
+		m_aOut.print("[");
+		m_aOut.print(e.getLineNumber());
+		m_aOut.print(",");
+		m_aOut.print(e.getColumnNumber());
+		m_aOut.print("]:  ");
+		if (m_isHTMLEnabled) {
+			m_aOut.print("</span>");
+		}
+
+		// prefix, e.g. warning
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='messageType'>");
+		}
+		m_aOut.print(aPrefix);
+		if (m_isHTMLEnabled) {
+			m_aOut.print("</span>");
+		}
+
+		m_aOut.print(" " + e.getMessage());
+		if (m_isHTMLEnabled) {
+			m_aOut.print("</span></br>");
+		}
+		m_aOut.println();
+	}
+
+	private void logMessage(String aPrefix, String aMsg) {
+		// filepath
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='filePath'>");
+		}
+		printFileEntryPrefix();
+		m_aOut.print(":  ");
+		if (m_isHTMLEnabled) {
+			m_aOut.print("</span>");
+		}
+
+		// prefix, e.g. warning
+		if (m_isHTMLEnabled) {
+			m_aOut.print("<span class='messageType'>");
+		}
+		m_aOut.print(aPrefix);
+		if (m_isHTMLEnabled) {
+			m_aOut.print("</span>");
+		}
+		m_aOut.print(" " + aMsg);
+		if (m_isHTMLEnabled) {
+			m_aOut.print("</span></br>");
+		}
+		m_aOut.println();
+	}
+
+	private void incErrors() {
+		++m_nErrors;
+		if (m_aParentLogger != null) {
+			m_aParentLogger.incErrors();
+		}
+	}
+
+	private void incWarnings() {
+		++m_nWarnings;
+		if (m_aParentLogger != null) {
+			m_aParentLogger.incWarnings();
+		}
+	}
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Main.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Main.java
new file mode 100644
index 0000000..73fad5c
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/Main.java
@@ -0,0 +1,289 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+/**
+ * This application validates an OpenDocument file. To run this application from the command line without Ant, try:
+ * java -jar "[path/]ODFValidator.jar".
+ * @author michael
+ */
+public class Main {
+
+    private static final String VERSION="1.1.4";
+    
+    /** Creates a new instance of Main */
+    public Main() {
+    }
+    
+    /**
+     * @param aArgs the command line arguments
+     */
+    public static void main(String[] aArgs) {
+        
+        String aConfigFileName = null;
+        String aFilterFileName = null;
+        String aSchemaFileName = null;
+        String aOutputFileName = null;
+        String aExcludeRegExp = null;
+        boolean bPrintGenerator = false;
+        boolean bUseMathDTD = false;
+        boolean bPrintHelp = false;
+        boolean bPrintVersion = false;
+        boolean bRecursive = false;
+        Logger.LogLevel nLogLevel = Logger.LogLevel.ERROR;
+        OdfValidatorMode eMode = OdfValidatorMode.VALIDATE;
+        List<String> aFileNames = new Vector<String>();
+        OdfVersion aVersion = null;
+
+        boolean bCommandLineValid = true;
+        List<String> aArgList = Arrays.asList(aArgs);
+        Iterator<String> aArgIter = aArgList.iterator();
+        while( aArgIter.hasNext() && bCommandLineValid )
+        {
+            String aArg = aArgIter.next();
+            if( aArg.equals("-c") )
+            {
+                eMode = OdfValidatorMode.CONFORMANCE;
+            }
+            else if( aArg.equals("-d") )
+            {
+                bUseMathDTD = true;
+            }
+            else if( aArg.equals("-e") )
+            {
+                eMode = OdfValidatorMode.EXTENDED_CONFORMANCE;
+            }
+            else if( aArg.equals("-f") )
+            {
+                if( aArgIter.hasNext() )
+                    aFilterFileName = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-g") )
+            {
+                bPrintGenerator = true;
+            }
+            else if( aArg.equals("-h") )
+            {
+                bPrintHelp = true;
+            }
+            else if( aArg.equals("-o") )
+            {
+                if( aArgIter.hasNext() )
+                    aOutputFileName = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-r") )
+            {
+                bRecursive = true;
+            }
+            else if( aArg.equals("-s") )
+            {
+                eMode = OdfValidatorMode.VALIDATE_STRICT;
+            }
+            else if( aArg.equals("-v") )
+            {
+                nLogLevel = Logger.LogLevel.INFO;
+            }
+            else if( aArg.equals("-w") )
+            {
+                nLogLevel = Logger.LogLevel.WARNING;
+            }
+            else if( aArg.equals("-x") )
+            {
+                if( aArgIter.hasNext() )
+                    aExcludeRegExp = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-C") )
+            {
+                if( aArgIter.hasNext() )
+                    aConfigFileName = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-S") )
+            {
+                if( aArgIter.hasNext() )
+                    aSchemaFileName = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-V") )
+            {
+                bPrintVersion = true;
+            }
+            else if( aArg.equals("-1.0") || aArg.equals("-1.1") || aArg.equals("-1.2") )
+            {
+                aVersion = OdfVersion.valueOf( aArg.substring(1), false );
+            }
+            else if( aArg.startsWith("-") )
+            {
+                System.out.print(aArg);
+                System.out.println(": unknown option, use '-h' for help");
+                return;
+            }
+            else if( aArg.length()>0 )
+            {
+                aFileNames.add( aArg );
+            }
+        }
+
+        // check usage
+        if( bPrintHelp || bPrintVersion )
+        {
+            bCommandLineValid = true;
+        }
+        else if( bPrintGenerator )
+        {
+            bCommandLineValid = aFileNames.size() > 0;
+        }
+        else if( aConfigFileName != null )
+        {
+            bCommandLineValid = aConfigFileName.length() > 0;
+        }
+        else
+        {
+            bCommandLineValid = aFileNames.size() > 0;
+        }
+
+        // print help
+        if( !bCommandLineValid || bPrintHelp )
+        {
+            printUsage();
+            return;
+        }
+        if( bPrintVersion )
+        {
+            System.out.print("odfvalidator v");
+            System.out.println( VERSION );
+            return;
+        }
+        
+        try
+        {
+            // Print generator (does not require config file)
+            if( bPrintGenerator ) 
+            {
+                MetaInformation aMetaInformation = new MetaInformation( System.out );
+                Iterator<String> aIter = aFileNames.iterator();
+                while( aIter.hasNext() )
+                    aMetaInformation.getInformation(aIter.next());
+                return;
+            }
+            
+            // Read configuration
+            Configuration aConfig = null;
+            if( aConfigFileName != null )
+            {
+                File aConfigFile = new File( aConfigFileName );
+                try
+                {
+                    aConfig = new Configuration( aConfigFile );
+                }
+                catch( FileNotFoundException e )
+                {
+                    if( aConfigFileName != null )
+                    {
+                        System.out.println( aConfigFile.getAbsolutePath() + ": file not found.");
+                        return;
+                    }
+                }
+                catch( IOException e )
+                {
+                    System.out.println("error reading " + aConfigFile.getAbsolutePath() + ": " + e.getLocalizedMessage() );
+                    return;
+                }
+            }
+            
+            if( aSchemaFileName != null )
+            {
+                aConfig = new Configuration();
+                aConfig.setProperty( Configuration.STRICT_SCHEMA, aSchemaFileName );
+            }
+
+            PrintStream aOut = aOutputFileName != null ? new PrintStream( aOutputFileName ) : System.out;
+            ODFValidator aValidator = new ODFValidator( aConfig, nLogLevel, aVersion, bUseMathDTD );
+
+            if( aConfigFileName != null )
+            {
+                aValidator.validate(aOut, aConfig, eMode );
+            }
+            else
+            {
+                aValidator.validate(aOut, aFileNames, aExcludeRegExp, eMode, bRecursive, aFilterFileName );
+            }
+        }
+        catch( ODFValidatorException e )
+        {
+            System.out.println( e.getMessage() );
+            System.out.println( "Validation aborted." );
+        }
+        catch( FileNotFoundException e )
+        {
+            System.out.println( e.getMessage() );
+            System.out.println( "Validation aborted." );
+        }
+    }
+    
+    private static void printUsage()
+    {
+        System.out.println( "usage: odfvalidator -g <odffiles>");
+        System.out.println( "       odfvalidator [-r] [-c|-e|-s] [-d] [-v|-w] [-f <filterfile>] [-x <regexp>] [-o outputfile] [-1.0|-1.1|-1.2] <odffiles>");
+        System.out.println( "       odfvalidator [-r] [-c|-e|-s] [-d] [-v|-w] [-f <filterfile>] [-x <regexp>] [-o outputfile] -S <schemafile> <odffiles>");
+        System.out.println( "       odfvalidator [-c|-s] [-v|-w] [-d] [-o outputfile] -C <configfile>");
+        System.out.println( "       odfvalidator -h");
+        System.out.println( "       odfvalidator -V");
+        System.out.println();
+        System.out.println( "-C: Validate using configuration file <configfile>" );
+        System.out.println( "-S: Use schema <schemafile> for validation" );
+        System.out.println( "-V: Print version" );
+        System.out.println( "-c: Check conformance (default for ODF 1.2 documents)" );
+        System.out.println( "-e: Check extended conformance (ODF 1.2 documents only)" );
+        System.out.println( "-d: Use MathML DTD rather than MathML2 schema for validation" );
+        System.out.println( "-f: Use filterfile <filterfile>" );
+        System.out.println( "-g: Show <odffiles> generators and exit" );
+        System.out.println( "-h: Print this help and exit" );
+        System.out.println( "-o: Store validation errors in <outputfile>" );
+        System.out.println( "-r: Process directory recursively" );
+        System.out.println( "-s: Validate against strict schema (ODF 1.0/1.1 documents only)" );
+        System.out.println( "-v: Verbose output, including generator and warnings" );
+        System.out.println( "-w: Print warnings" );
+        System.out.println( "-x: Exclude paths that match <regexp>" );
+        System.out.println();
+        System.out.println( "If no option is provided, <odffiles> are validated using the schemas matching the detected ODF version of the files" );
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestEntry.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestEntry.java
new file mode 100644
index 0000000..efe128c
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestEntry.java
@@ -0,0 +1,68 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+public class ManifestEntry
+{
+    private String m_aFullPath;
+    private String m_aMediaType;
+    
+    ManifestEntry(String aFullPath, String aMediaType)
+    {
+        m_aFullPath = aFullPath;
+        m_aMediaType = aMediaType;
+    }
+
+    String getFullPath()
+    {
+        return m_aFullPath;
+    }
+
+    String getMediaType()
+    {
+        return m_aMediaType;
+    }
+
+    boolean isOpenDocumentMediaType()
+    {
+        return m_aMediaType!=null && isOpenDocumentMediaType(m_aMediaType);
+    }
+
+    static boolean isOpenDocumentMediaType( String aMediaType )
+    {
+        if( aMediaType.length() >14 && aMediaType.substring(12,14).equals("x-") )
+        {
+            String aNewMediaType = aMediaType.substring(0,12) + aMediaType.substring(14);
+            aMediaType = aNewMediaType;
+        }
+
+        return aMediaType.equals(ODFMediaTypes.TEXT_MEDIA_TYPE) ||
+                aMediaType.equals(ODFMediaTypes.GRAPHICS_MEDIA_TYPE) ||
+                aMediaType.equals(ODFMediaTypes.SPREADSHEET_MEDIA_TYPE) ||
+                aMediaType.equals(ODFMediaTypes.PRESENTATION_MEDIA_TYPE) ||
+                aMediaType.equals(ODFMediaTypes.FORMULA_MEDIA_TYPE) ||
+                aMediaType.equals(ODFMediaTypes.CHART_MEDIA_TYPE);
+    }
+
+
+}
\ No newline at end of file
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestEntryListener.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestEntryListener.java
new file mode 100644
index 0000000..5e0cd24
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestEntryListener.java
@@ -0,0 +1,29 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+interface ManifestEntryListener {
+    
+    void foundManifestEntry( ManifestEntry aManifestEntry );
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestFilter.java
new file mode 100644
index 0000000..250fd28
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestFilter.java
@@ -0,0 +1,108 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.IOException;
+import java.io.StringReader;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+
+class ManifestFilter extends NamespaceFilter {
+    
+    private static final String OOO_MANIFEST_PUBLIC_ID = "-//OpenOffice.org//DTD Manifest 1.0//EN";
+    private static final String OOO_MANIFEST_NAMESPACE_URI = "http://openoffice.org/2001/manifest";
+    private static final String MANIFEST_NAMESPACE_URI = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0";
+    
+    private static final String FILE_ENTRY = "file-entry";
+    private static final String FULL_PATH = "full-path";
+    private static final String MEDIA_TYPE = "media-type";
+    
+    private Logger m_aLogger;
+
+    private ManifestListener m_aManifestListener = null;
+    private ManifestEntryListener m_aManifestEntryListener = null;
+    
+    /** Creates a new instance of KnownIssueFilter */
+    ManifestFilter(Logger aLogger, ManifestListener aManifestListener,
+            ManifestEntryListener aManifestEntryListener)
+    {
+        m_aLogger = aLogger;
+        m_aManifestListener = aManifestListener;
+        m_aManifestEntryListener = aManifestEntryListener;
+    }
+
+    @Override
+    public InputSource resolveEntity(String aPublicId, String aSystemId) throws SAXException, IOException {
+        // Ignore the external OOo Manifest DTD which was errornously included
+        // in early OpenDocument files.
+        
+        if( aPublicId.equals(OOO_MANIFEST_PUBLIC_ID) )
+        {
+            String aMsg = "Ignoring doctype definition '" + OOO_MANIFEST_PUBLIC_ID + "' (has been stored by old OOo versions)";
+            m_aLogger.logInfo( aMsg , false);
+            return new InputSource(new StringReader(""));
+        }
+        else
+            return super.resolveEntity( aPublicId, aSystemId );
+    }
+
+    String adaptNamespaceUri( String aUri, String aPrefix)
+    {
+        String aNewUri = null;
+        if( aUri.equals(OOO_MANIFEST_NAMESPACE_URI) )
+            aNewUri = MANIFEST_NAMESPACE_URI;
+        
+        return aNewUri;
+    }
+
+    void namespaceUriAdapted( String aUri, String aNewUri )
+    {
+        String aMsg = "Adapting OpenOffice.org namspace'" + aUri + "' (has been stored by old OOo versions)";
+        m_aLogger.logInfo( aMsg , false);
+    }
+
+    @Override
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAtts) throws SAXException {
+        super.startElement(aUri, aLocalName, aQName, aAtts);
+        if( (aUri.equals(MANIFEST_NAMESPACE_URI) || aUri.equals(OOO_MANIFEST_NAMESPACE_URI)) && aLocalName.equals(FILE_ENTRY))
+        {
+            String aFullPath = aAtts.getValue(aUri,FULL_PATH);
+            String aMediaType = aAtts.getValue(aUri,MEDIA_TYPE);
+            if( aFullPath != null )
+            {
+                if( aFullPath.equals("/") )
+                {
+                    if( m_aManifestListener != null )
+                        m_aManifestListener.setMediaType( aMediaType );
+                }
+                else
+                {
+                    if( m_aManifestEntryListener != null )
+                        m_aManifestEntryListener.foundManifestEntry( new ManifestEntry(aFullPath,aMediaType) );
+                }
+            }
+        }
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestListener.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestListener.java
new file mode 100644
index 0000000..890a54c
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ManifestListener.java
@@ -0,0 +1,29 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+interface ManifestListener {
+    
+    void setMediaType( String aMediaType );
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MathML101Filter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MathML101Filter.java
new file mode 100644
index 0000000..83c7537
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MathML101Filter.java
@@ -0,0 +1,98 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.IOException;
+import java.io.InputStream;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ *
+ */
+class MathML101Filter extends XMLFilterImpl {
+//class MathML101Filter implements EntityResolver {
+    
+    private String m_aMathMLDTD;
+    private static final String MATHML_NAMESPACE_URI = "http://www.w3.org/1998/Math/MathML";
+    private static final String MATHML_PUBLIC_ID = "-//W3C//DTD MathML 1.01//EN";
+    private static final String OOO_MATHML_PUBLIC_ID = "-//OpenOffice.org//DTD Modified W3C MathML 1.01//EN";
+
+    private Logger m_aLogger;
+    
+    /** Creates a new instance of MathML101Filter */
+    MathML101Filter( String aMathMLDTD,  Logger aLogger )  {
+        m_aMathMLDTD = aMathMLDTD;
+        m_aLogger = aLogger;
+    }
+
+
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAtts) throws SAXException {
+        super.startElement(aUri, aLocalName, aQName, aAtts);
+    }
+
+    public void endElement(String aUri, String aLocalName, String aQName) throws SAXException {
+        super.endElement(aUri, aLocalName, aQName);
+    }
+
+    public InputSource resolveEntity(String aPublicId, String aSystemId) throws SAXException, IOException {
+        InputSource aRet = null;
+        String aEntity = null;
+        
+        if( aPublicId != null &&
+            (aPublicId.equals(MATHML_PUBLIC_ID) ||
+            aPublicId.equals(OOO_MATHML_PUBLIC_ID)) )
+        {
+            aEntity = m_aMathMLDTD;
+            if( InternalResources.isInternalResourceIdentifer(aEntity) )
+            {
+                String aPath = InternalResources.getResourcePath(aEntity);
+                InputStream aInStream = getClass().getResourceAsStream(aPath);
+                if( aInStream == null )
+                {
+                    m_aLogger.logFatalError("Missing internal schema file: ".concat(aPath));
+                }
+                else
+                {
+                    aRet = new InputSource( aInStream );
+                    aRet.setPublicId(aPublicId);
+                    aRet.setSystemId(aEntity);
+                }
+            }
+        }
+        else
+        {
+            aEntity = aSystemId;
+        }
+
+        String aMsg = "Reading doctype definition '" + aEntity + "'";
+        m_aLogger.logInfo( aMsg , false);
+
+        if( aRet == null )
+            aRet = new InputSource( aEntity  );
+        return aRet;
+    }
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MathML20Filter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MathML20Filter.java
new file mode 100644
index 0000000..4b4cf97
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MathML20Filter.java
@@ -0,0 +1,52 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.IOException;
+import java.io.StringReader;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ *
+ */
+class MathML20Filter extends XMLFilterImpl {
+    
+    private Logger m_aLogger;
+    
+    /** Creates a new instance of MathMLFilter */
+    MathML20Filter( Logger aLogger) {
+        m_aLogger = aLogger;
+    }
+
+    @Override
+    public InputSource resolveEntity(String aPublicId, String aSystemId) throws SAXException, IOException {
+        // Ignore the external OOo MathML DTD
+        
+        String aMsg = "Ignoring doctype definition '" + aPublicId + "'";
+            m_aLogger.logInfo( aMsg , false);
+        return new InputSource(new StringReader(""));
+    }
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaFilter.java
new file mode 100644
index 0000000..fbbc460
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaFilter.java
@@ -0,0 +1,90 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+class MetaFilter extends XMLFilterImpl {
+
+    private boolean m_bInGenerator = false;
+    private String m_aGenerator = "";
+    private boolean m_bRoot = true;
+    
+    private static final String META_NAMESPACE_URI = OdfDocumentNamespace.META.getUri();
+    private static final String OFFICE_NAMESPACE_URI = OdfDocumentNamespace.OFFICE.getUri();
+    private static final String GENERATOR = "generator";
+    private static final String DOCUMENT_META = "document-meta";
+
+    private Logger m_aLogger;
+    private MetaInformationListener m_aMetaListener;
+    
+    
+    /** Creates a new instance of MetaFilter */
+    MetaFilter( Logger aLogger, MetaInformationListener aMetaListener ) {
+        m_aLogger = aLogger;
+        m_aMetaListener = aMetaListener;
+    }
+    
+    @Override
+    public void characters(char[] aChars, int nStart, int nLength) throws SAXException {
+        super.characters(aChars, nStart, nLength);
+        
+        if( m_bInGenerator )
+        {
+            m_aGenerator += new String( aChars, nStart, nLength );
+        }
+    }
+
+    @Override
+    public void endElement(String aUri, String aLocalName, String aQName) throws SAXException {
+        super.endElement(aUri, aLocalName, aQName);
+        
+        if( aUri.equals(META_NAMESPACE_URI) && aLocalName.equals(GENERATOR) )
+        {
+            m_aGenerator = m_aGenerator.trim();
+            m_aLogger.logInfo( "Generator: " + m_aGenerator , false);
+            m_bInGenerator = false;
+            if( m_aMetaListener!=null ) {
+                m_aMetaListener.setGenerator( m_aGenerator );
+            }
+        }
+    }
+
+    @Override
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAttributes) throws SAXException {
+        super.startElement(aUri, aLocalName, aQName, aAttributes);
+
+        if( m_bRoot )
+        {
+            if( !(aUri.equals(OFFICE_NAMESPACE_URI) && aLocalName.equals(DOCUMENT_META)) )
+                m_aLogger.logError("Invalid root element: " + aQName );
+            m_bRoot = false;
+        }
+                
+        if( aUri.equals(META_NAMESPACE_URI) && aLocalName.equals(GENERATOR) )
+            m_bInGenerator = true;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaInformation.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaInformation.java
new file mode 100644
index 0000000..e6bc844
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaInformation.java
@@ -0,0 +1,100 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLFilter;
+
+
+public class MetaInformation {
+
+    private PrintStream m_aOut;
+    
+    /** Creates a new instance of Validator */
+    public MetaInformation( PrintStream aOut ) {
+        
+        m_aOut = aOut;
+    }
+
+    public void getInformation( String aDocFileName ) throws ODFValidatorException
+    {
+        try
+        {
+            OdfPackage aDocFile = OdfPackage.loadPackage( aDocFileName );
+            
+            getGenerator( aDocFile );
+        }
+        catch( Exception e )
+        {
+            throw new ODFValidatorException( aDocFileName, "", e );
+        }  
+    }
+    
+    public void getGenerator( OdfPackage aDocFile ) throws ODFValidatorException
+    {
+        try
+        {
+            InputStream aInStream = aDocFile.getInputStream(OdfPackage.OdfFile.MANIFEST.getPath(), true);
+            Logger aLogger = new Logger(aDocFile.getBaseURI(),OdfPackage.OdfFile.MANIFEST.getPath(),m_aOut, Logger.LogLevel.INFO);
+        
+            getInformation( aInStream, aLogger );
+        }
+        catch( Exception e )
+        {
+            throw new ODFValidatorException( aDocFile.getBaseURI(), "", e );
+        }  
+    }
+
+
+    
+    private void getInformation( InputStream aInStream, Logger aLogger ) throws IOException, ODFValidatorException
+    {
+        SAXParser aParser = null;
+        try
+        {
+            SAXParserFactory aParserFactory = SAXParserFactory.newInstance();
+            aParserFactory.setNamespaceAware(true);
+            aParser = aParserFactory.newSAXParser();
+
+            XMLFilter aFilter =  new MetaFilter(aLogger,null);
+            aFilter.setParent( aParser.getXMLReader() ) ;
+
+            aFilter.parse(new InputSource(aInStream));
+        }
+        catch( javax.xml.parsers.ParserConfigurationException e )
+        {
+            throw new ODFValidatorException( e );
+        }
+        catch( org.xml.sax.SAXException e )
+        {
+            throw new ODFValidatorException( e );
+        }
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaInformationListener.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaInformationListener.java
new file mode 100644
index 0000000..4f4f866
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/MetaInformationListener.java
@@ -0,0 +1,29 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+interface MetaInformationListener {
+    
+    void setGenerator( String aGenerator );
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/NamespaceFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/NamespaceFilter.java
new file mode 100644
index 0000000..87df54a
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/NamespaceFilter.java
@@ -0,0 +1,94 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+abstract class NamespaceFilter extends XMLFilterImpl {
+    
+    private boolean m_bFilterNamespaceUri = false;
+
+    /** Creates a new instance of NamespaceFilter */
+    NamespaceFilter() {
+    }
+
+    abstract String adaptNamespaceUri(String aUri, String aPrefix);
+    abstract void namespaceUriAdapted(String aUri, String aNewUri);
+
+
+    public void endElement(String aUri, String aLocalName, String aQName) throws SAXException {
+        if (m_bFilterNamespaceUri)
+        {    
+            String aNewUri = adaptNamespaceUri( aUri , aQName );
+            
+            if( aNewUri != null )
+                aUri = aNewUri;
+        }
+        
+        super.endElement(aUri, aLocalName, aQName);
+    }
+
+
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAtts) throws SAXException {
+        if (m_bFilterNamespaceUri)
+        {    
+            String aNewUri = adaptNamespaceUri( aUri , aQName);
+            
+            if( aNewUri != null )
+                aUri = aNewUri;
+
+            Attributes aOldAtts = aAtts;
+            AttributesImpl aNewAtts = null;
+            for (int i = 0; i < aOldAtts.getLength(); ++i)
+            {
+                aNewUri = adaptNamespaceUri( aOldAtts.getURI(i) , aQName);
+                if (aNewUri != null)
+                {
+                    if (aNewAtts == null)
+                    {
+                        aNewAtts = new AttributesImpl(aOldAtts);
+                        aAtts = aNewAtts;
+                    }
+                    aNewAtts.setURI(i,aNewUri);
+                }
+            }
+        }
+        super.startElement(aUri, aLocalName, aQName, aAtts);
+    }
+
+
+
+    public void startPrefixMapping(String aPrefix, String aUri) throws SAXException {
+        String aNewUri = adaptNamespaceUri( aUri, aPrefix);
+        if (aNewUri != null)
+        {
+            m_bFilterNamespaceUri = true;
+            namespaceUriAdapted( aUri, aNewUri );
+        }
+        super.startPrefixMapping(aPrefix, aUri);
+    }
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFFileFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFFileFilter.java
new file mode 100644
index 0000000..f14e657
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFFileFilter.java
@@ -0,0 +1,87 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.regex.Pattern;
+
+        
+public class ODFFileFilter implements FileFilter
+{
+    private boolean m_bRecursive;
+    private Pattern m_aExcludePattern = null;
+    
+    public ODFFileFilter( boolean bRecursive )
+    {
+        m_bRecursive = bRecursive;
+    }
+
+    public ODFFileFilter( String aExcludeRegExp, boolean bRecursive )
+    {
+        m_bRecursive = bRecursive;
+        if( aExcludeRegExp != null )
+            m_aExcludePattern = Pattern.compile(aExcludeRegExp);
+    }
+    
+    
+    public boolean accept(File aFile) {
+        return !exclude( aFile ) && (aFile.isDirectory() ? m_bRecursive : hasODFExtension( aFile ));
+    }
+    
+    private boolean exclude(File aFile)
+    {
+        boolean bExclude = false;
+        if( m_aExcludePattern != null )
+            bExclude = m_aExcludePattern.matcher(aFile.getAbsolutePath()).matches();
+        return bExclude;
+    }
+    
+    private boolean hasODFExtension(File aFile)
+    {
+        String aName = aFile.getName();
+        int nIndex = aName.lastIndexOf('.');
+        if (nIndex != -1 && aName.length() > nIndex+1)
+        {
+            String aExt = aName.substring(nIndex+1);
+            if( aExt.length() == 3 )
+            {
+                return aExt.equalsIgnoreCase("odt") ||
+                       aExt.equalsIgnoreCase("ods") ||
+                       aExt.equalsIgnoreCase("odg") ||
+                       aExt.equalsIgnoreCase("odp") ||
+                       aExt.equalsIgnoreCase("odf") ||
+                       aExt.equalsIgnoreCase("odc") ||
+                       aExt.equalsIgnoreCase("odb") ||
+                       aExt.equalsIgnoreCase("ott") ||
+                       aExt.equalsIgnoreCase("ots") ||
+                       aExt.equalsIgnoreCase("otg") ||
+                       aExt.equalsIgnoreCase("otp") ||
+                       aExt.equalsIgnoreCase("otf") ||
+                       aExt.equalsIgnoreCase("otc");
+            }
+        }
+        
+        return false;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFFileValidator.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFFileValidator.java
new file mode 100644
index 0000000..a45d4fc
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFFileValidator.java
@@ -0,0 +1,63 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.File;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.ErrorHandler;
+
+
+/**
+ * Validator for Files
+ */
+public class ODFFileValidator extends ODFRootPackageValidator {
+    
+    private File m_aFile = null;
+
+        /** Creates a new instance of ODFFileValidator */
+    public ODFFileValidator( File aFile, Logger.LogLevel nLogLevel,
+                             OdfValidatorMode eMode, OdfVersion aVersion,
+                             SAXParseExceptionFilter aFilter,
+                             ODFValidatorProvider aValidatorProvider ) throws ODFValidatorException
+    {
+        super( nLogLevel, eMode, aVersion, aFilter, aValidatorProvider );
+        m_aFile = aFile;
+    }
+
+    protected String getLoggerName()
+    {
+        return m_aFile.getAbsolutePath();
+    }
+
+    @Override
+    protected String getDocumentPath()
+    {
+        return ""; // this is the root document
+    }
+
+    protected OdfPackage getPackage(ErrorHandler handler) throws Exception
+    {
+        return OdfPackage.loadPackage(m_aFile, handler);
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFMediaTypes.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFMediaTypes.java
new file mode 100644
index 0000000..cdc09b6
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFMediaTypes.java
@@ -0,0 +1,50 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+/**
+ * abstract Base class for OpenDocument filetype classes
+ */
+public abstract class ODFMediaTypes {
+
+    public static final String TEXT_MEDIA_TYPE = "application/vnd.oasis.opendocument.text";
+    public static final String TEXT_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.text-template";
+    public static final String GRAPHICS_MEDIA_TYPE = "application/vnd.oasis.opendocument.graphics";
+    public static final String GRAPHICS_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.graphics-template";
+    public static final String PRESENTATION_MEDIA_TYPE = "application/vnd.oasis.opendocument.presentation";
+    public static final String PRESENTATION_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.presentation-template";
+    public static final String SPREADSHEET_MEDIA_TYPE = "application/vnd.oasis.opendocument.spreadsheet";
+    public static final String SPREADSHEET_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.spreadsheet-template";
+    public static final String CHART_MEDIA_TYPE = "application/vnd.oasis.opendocument.chart";
+    public static final String CHART_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.chart-template";
+    public static final String IMAGE_MEDIA_TYPE = "application/vnd.oasis.opendocument.image";
+    public static final String IMAGE_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.image-template";
+    public static final String FORMULA_MEDIA_TYPE = "application/vnd.oasis.opendocument.formula";
+    public static final String FORMULA_TEMPLATE_MEDIA_TYPE = "application/vnd.oasis.opendocument.formula-template";
+    public static final String TEXT_MASTER_MEDIA_TYPE = "application/vnd.oasis.opendocument.text-master";
+    public static final String TEXT_WEB_MEDIA_TYPE = "application/vnd.oasis.opendocument.text-web";
+
+   
+}
+
+
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageErrorHandler.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageErrorHandler.java
new file mode 100644
index 0000000..56f48d7
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageErrorHandler.java
@@ -0,0 +1,146 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.odftoolkit.odfdom.pkg.OdfValidationException;
+import org.odftoolkit.odfdom.pkg.ValidationConstraint;
+import org.odftoolkit.odfdom.pkg.OdfPackageConstraint;
+import org.odftoolkit.odfdom.dom.OdfSchemaConstraint;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+class ODFPackageErrorHandler implements ErrorHandler {
+
+    List<SAXParseException> m_aExceptionList = new ArrayList<SAXParseException>();
+
+    ODFPackageErrorHandler()
+    {
+    }
+
+    public void warning(SAXParseException exception) throws SAXException {
+        m_aExceptionList.add(exception);
+    }
+
+    public void error(SAXParseException exception) throws SAXException {
+        m_aExceptionList.add(exception);
+    }
+
+    public void fatalError(SAXParseException exception) throws SAXException {
+        m_aExceptionList.add(exception);
+        throw exception;
+    }
+
+    /// deferred because aVersion is not available when odfdom checks mimetype
+    /// @returns true iff there was an error and package is not valid
+    boolean processErrors( Logger aPkgLogger, Logger aManifestLogger,
+                           Logger aMimetypeLogger,OdfVersion aVersion)
+    {
+        boolean bRet = false;
+        for (SAXParseException e : m_aExceptionList)
+        {
+            if (e instanceof OdfValidationException)
+            {
+                ValidationConstraint aConstraint =
+                    ((OdfValidationException) e).getConstraint();
+                if (aConstraint instanceof OdfPackageConstraint)
+                {
+                    switch (((OdfPackageConstraint) aConstraint))
+                    {
+                        case MANIFEST_DOES_NOT_LIST_FILE:
+                            switch (aVersion)
+                            {
+                                case V1_0:
+                                case V1_1:
+                                    aManifestLogger.logWarning(e.getMessage());
+                                    break;
+                                default:
+                                    aManifestLogger.logError(e.getMessage());
+                                    bRet = true;
+                                    break;
+                            }
+                            break;
+                        case MIMETYPE_NOT_FIRST_IN_PACKAGE:
+                        case MIMETYPE_NOT_IN_PACKAGE:
+                            switch (aVersion)
+                            {
+                                case V1_0:
+                                case V1_1:
+                                    aMimetypeLogger.logWarning(e.getMessage());
+                                    break;
+                                default:
+                                    aMimetypeLogger.logError(e.getMessage());
+                                    bRet = true;
+                                    break;
+                            }
+                            break;
+                        case MANIFEST_NOT_IN_PACKAGE:
+                        case MANIFEST_LISTS_NONEXISTENT_FILE:
+                            aManifestLogger.logError(e.getMessage());
+                            bRet = true;
+                            break;
+                        case MIMETYPE_IS_COMPRESSED:
+                        case MIMETYPE_HAS_EXTRA_FIELD:
+                        case MIMETYPE_DIFFERS_FROM_PACKAGE:
+                            aMimetypeLogger.logError(e.getMessage());
+                            bRet = true;
+                            break;
+                        case MANIFEST_LISTS_DIRECTORY:
+                        case MANIFEST_DOES_NOT_LIST_DIRECTORY:
+                            aManifestLogger.logWarning(e.getMessage());
+                            break;
+                        default:
+                            aPkgLogger.logError(e); // unknown aConstraint: assume error
+                            bRet = true;
+                            break;
+                    }
+                } 
+                else if (aConstraint instanceof OdfSchemaConstraint)
+                {
+                    switch (((OdfSchemaConstraint) aConstraint))
+                    {
+                        case DOCUMENT_WITHOUT_ODF_MIMETYPE:
+                        case DOCUMENT_WITHOUT_CONTENT_NOR_STYLES_XML:
+                            aPkgLogger.logError(e.getMessage());
+                            bRet = true;
+                            break;
+                        default:
+                            aPkgLogger.logError(e); // unknown aConstraint: assume error
+                            bRet = true;
+                            break;
+                    }
+                }
+            }
+            else
+            {
+                aPkgLogger.logError(e); // unknown aConstraint: assume error
+                bRet = true;
+            }
+        }
+
+        m_aExceptionList.clear();
+        return bRet;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java
new file mode 100644
index 0000000..86d10c4
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFPackageValidator.java
@@ -0,0 +1,435 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfvalidator;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.zip.ZipException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.validation.Validator;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.manifest.EncryptionDataElement;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
+
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Validator for Files
+ */
+abstract class ODFPackageValidator {
+
+	static final String DOCUMENT_SETTINGS = "document-settings";
+	static final String DOCUMENT_STYLES = "document-styles";
+	static final String DOCUMENT_CONTENT = "document-content";
+	protected Logger.LogLevel m_nLogLevel;
+	protected OdfValidatorMode m_eMode = OdfValidatorMode.CONFORMANCE;
+	protected SAXParseExceptionFilter m_aFilter = null;
+	protected ODFValidatorProvider m_aValidatorProvider = null;
+	protected ODFValidationResult m_aResult = null;
+	protected OdfVersion m_aConfigVersion = null;
+	private SAXParserFactory m_aSAXParserFactory = null;
+	protected OdfVersion mOdfPackageVersion = null;
+
+	protected ODFPackageValidator(Logger.LogLevel nLogLevel, OdfValidatorMode eMode, OdfVersion aVersion,
+			SAXParseExceptionFilter aFilter, ODFValidatorProvider aValidatorProvider) {
+		m_nLogLevel = nLogLevel;
+		m_eMode = eMode;
+		m_aFilter = aFilter;
+		m_aValidatorProvider = aValidatorProvider;
+		m_aConfigVersion = aVersion;
+		m_aResult = new ODFValidationResult(aVersion, eMode);
+	}
+
+	protected abstract String getLoggerName();
+
+	protected abstract String getDocumentPath();
+
+	protected abstract OdfPackage getPackage(Logger aLogger);
+
+	protected abstract String getStreamName(String aEntry);
+
+	protected boolean validate(PrintStream aOut) throws ODFValidatorException {
+		Logger aLogger =
+				new Logger(getLoggerName(), getDocumentPath(), aOut, m_nLogLevel);
+		return _validate(aLogger);
+	}
+
+	protected boolean validate(Logger aParentLogger) throws ODFValidatorException {
+		Logger aLogger =
+				new Logger(getDocumentPath(), aParentLogger);
+		return _validate(aLogger);
+	}
+
+	
+	OdfVersion getOdfPackageVersion(){
+		return mOdfPackageVersion;
+	}
+	
+	private boolean _validate(Logger aLogger) throws ODFValidatorException {
+		boolean bHasErrors = false;
+
+		OdfPackage aPkg = getPackage(aLogger);
+		if (aPkg == null) {
+			return true;
+		}
+
+		try {
+			String aDocVersion = getVersion(aLogger);
+			if (aDocVersion != null) {
+				aLogger.logInfo("ODF version of root document: " + aDocVersion, false);
+				mOdfPackageVersion = OdfVersion.valueOf(aDocVersion, true);
+			}
+			OdfVersion aVersion = m_aConfigVersion == null ? OdfVersion.valueOf(aDocVersion, true) : m_aConfigVersion;
+
+			bHasErrors |= validatePre(aLogger, aVersion);
+			aLogger.logInfo("Media Type: " + m_aResult.getMediaType(), false);
+
+			bHasErrors |= validateMeta(aLogger, getStreamName(OdfDocument.OdfXMLFile.META.getFileName()), aVersion, true);
+			bHasErrors |= validateEntry(aLogger, getStreamName(OdfDocument.OdfXMLFile.SETTINGS.getFileName()), DOCUMENT_SETTINGS, aVersion);
+			bHasErrors |= validateEntry(aLogger, getStreamName(OdfDocument.OdfXMLFile.STYLES.getFileName()), DOCUMENT_STYLES, aVersion);
+			if (m_aResult.getMediaType().equals(ODFMediaTypes.FORMULA_MEDIA_TYPE)) {
+				bHasErrors |= validateMathML(aLogger, getStreamName(OdfDocument.OdfXMLFile.CONTENT.getFileName()), aVersion);
+			} else {
+				bHasErrors |= validateEntry(aLogger, getStreamName(OdfDocument.OdfXMLFile.CONTENT.getFileName()), DOCUMENT_CONTENT, aVersion);
+			}
+			bHasErrors |= validatePost(aLogger, aVersion);
+		} catch (ZipException e) {
+			aLogger.logFatalError(e.getMessage());
+		} catch (IOException e) {
+			aLogger.logFatalError(e.getMessage());
+		}
+
+		logSummary(bHasErrors, aLogger);
+
+		return bHasErrors || aLogger.hasError();
+	}
+
+	protected boolean validatePre(Logger aLogger, OdfVersion aVersion) throws ODFValidatorException, IOException {
+		return false;
+	}
+
+	protected boolean validatePost(Logger aLogger, OdfVersion aVersion) throws ODFValidatorException, IOException {
+		return false;
+	}
+
+	protected void logSummary(boolean bHasErrors, Logger aLogger) {
+	}
+
+	protected boolean validateEntry(Logger aParentLogger, String aEntryName, String aLocalElementName, OdfVersion aVersion) throws IOException, ZipException, IllegalStateException, ODFValidatorException {
+		Logger aLogger = new Logger(aEntryName, aParentLogger);
+		XMLFilter aFilter = new ContentFilter(aLogger, aLocalElementName);
+		if ((m_eMode == OdfValidatorMode.CONFORMANCE && aVersion.compareTo(OdfVersion.V1_1) <= 0)
+				|| m_eMode == OdfValidatorMode.EXTENDED_CONFORMANCE) {
+			XMLFilter aAlienFilter = new ForeignContentFilter(aLogger, aVersion, m_aResult);
+			aAlienFilter.setParent(aFilter);
+			aFilter = aAlienFilter;
+		}
+		Validator aValidator = null;
+		if (m_eMode == OdfValidatorMode.VALIDATE_STRICT) {
+			aValidator = m_aValidatorProvider.getStrictValidator(aParentLogger.getOutputStream(), aVersion);
+		} else {
+			aValidator = m_aValidatorProvider.getValidator(aParentLogger.getOutputStream(), aVersion);
+		}
+//		Validator aValidator = m_eMode == OdfValidatorMode.VALIDATE_STRICT ? m_aValidatorProvider.getStrictValidator(aParentLogger.getOutputStream(), aVersion)
+//				: m_aValidatorProvider.getValidator(aParentLogger.getOutputStream(), aVersion);
+		return validateEntry(aFilter, aValidator, aLogger, aEntryName);
+	}
+
+	private boolean validateMeta(Logger aParentLogger, String aEntryName, OdfVersion aVersion, boolean bIsRoot) throws IOException, ZipException, IllegalStateException, ODFValidatorException {
+		Logger aLogger = new Logger(aEntryName, aParentLogger);
+		XMLFilter aFilter = new MetaFilter(aLogger, m_aResult);
+		if ((m_eMode == OdfValidatorMode.CONFORMANCE && aVersion.compareTo(OdfVersion.V1_1) <= 0)
+				|| m_eMode == OdfValidatorMode.EXTENDED_CONFORMANCE) {
+			XMLFilter aAlienFilter = new ForeignContentFilter(aLogger, aVersion, m_aResult);
+			aAlienFilter.setParent(aFilter);
+			aFilter = aAlienFilter;
+		}
+
+		Validator aValidator = null;
+		if (m_eMode == OdfValidatorMode.VALIDATE_STRICT) {
+			aValidator = m_aValidatorProvider.getStrictValidator(aParentLogger.getOutputStream(), aVersion);
+		} else {
+			aValidator = m_aValidatorProvider.getValidator(aParentLogger.getOutputStream(), aVersion);
+		}
+		return validateEntry(aFilter, aValidator, aLogger, aEntryName);
+	}
+
+	private boolean validateMathML(Logger aParentLogger, String aEntryName, OdfVersion aVersion) throws IOException, ZipException, IllegalStateException, ODFValidatorException {
+		Logger aLogger = new Logger(aEntryName, aParentLogger);
+		String aMathMLDTDSystemId = m_aValidatorProvider.getMathMLDTDSystemId(aVersion);
+		if (aMathMLDTDSystemId != null) {
+			// validate using DTD
+			return parseEntry(new MathML101Filter(aMathMLDTDSystemId, aLogger), aLogger, aEntryName, true);
+		} else {
+			Validator aMathMLValidator = m_aValidatorProvider.getMathMLValidator(aParentLogger.getOutputStream(), null);
+			if (aMathMLValidator == null) {
+				aLogger.logInfo("MathML schema is not available. Validation has been skipped.", false);
+				return false;
+			}
+			return validateEntry(new MathML20Filter(aLogger), aMathMLValidator, aLogger, aEntryName);
+		}
+	}
+
+	protected boolean validateDSig(Logger aParentLogger, String aEntryName, OdfVersion aVersion) throws IOException, ZipException, IllegalStateException, ODFValidatorException {
+		Validator aValidator = m_aValidatorProvider.getDSigValidator(aParentLogger.getOutputStream(), aVersion);
+		Logger aLogger = new Logger(aEntryName, aParentLogger);
+		if (aValidator == null) {
+			aLogger.logWarning("Signature not validated because there is no Signature Validator configured for the selected Configuration");
+			return false;
+		}
+
+		return validateEntry(new DSigFilter(aLogger), aValidator, aLogger, aEntryName);
+	}
+
+	protected boolean validateEntry(XMLFilter aFilter,
+			Validator aValidator, Logger aLogger,
+			String aEntryName) throws IOException, ZipException, IllegalStateException, ODFValidatorException {
+		OdfPackage aPkg = getPackage(aLogger);
+
+		if (!aEntryName.equals(OdfPackage.OdfFile.MANIFEST.getPath()) && isEncrypted(aEntryName, aLogger)) {
+			return false;
+		}
+
+		InputStream aInStream = null;
+		try {
+			aInStream = aPkg.getInputStream(aEntryName, true);
+		} catch (Exception e) {
+			throw new ODFValidatorException(e);
+		}
+
+
+		if (aValidator == null) {
+
+			aLogger.logWarning("no Validator configured in selected Configuration for this file type");
+			return false;
+		}
+
+
+
+		return aInStream != null ? validate(aInStream, aFilter, aValidator, aLogger) : false;
+	}
+
+	private boolean validate(InputStream aInStream,
+			XMLFilter aFilter,
+			javax.xml.validation.Validator aValidator,
+			Logger aLogger) throws ODFValidatorException {
+		SAXParser aParser = getSAXParser(false);
+		SchemaErrorHandler aErrorHandler = new SchemaErrorHandler(aLogger, m_aFilter);
+
+		try {
+			XMLReader aReader;
+			if (aFilter != null) {
+				XMLReader aParent = aFilter.getParent();
+				if (aParent != null) {
+					((XMLFilter) aParent).setParent(aParser.getXMLReader());
+				} else {
+					aFilter.setParent(aParser.getXMLReader());
+				}
+				aReader = aFilter;
+			} else {
+				aReader = aParser.getXMLReader();
+			}
+
+			if (m_aFilter != null) {
+				m_aFilter.startSubFile();
+			}
+			aValidator.setErrorHandler(aErrorHandler);
+			try {
+				aValidator.validate(new SAXSource(aReader,
+						new InputSource(aInStream)));
+			} catch (RuntimeException e) {
+				aLogger.logFatalError(e.getMessage());
+				m_aValidatorProvider.resetValidatorProvider();
+			}
+		} catch (org.xml.sax.SAXParseException e) {
+			aErrorHandler.fatalErrorNoException(e);
+		} catch (org.xml.sax.SAXException e) {
+			aLogger.logFatalError(e.getMessage());
+		} catch (IOException e) {
+			aLogger.logFatalError(e.getMessage());
+		}
+
+		aLogger.logSummaryInfo();
+		if (m_aResult.hasForeignElements()) {
+			Set<String> aForeignElementURISet = m_aResult.getForeignElements().keySet();
+			StringBuilder aBuffer = new StringBuilder();
+			Iterator<String> aIter = aForeignElementURISet.iterator();
+			boolean bFirst = true;
+			while (aIter.hasNext()) {
+				String aURI = aIter.next();
+				aBuffer.setLength(0);
+				aBuffer.append(m_aResult.getForeignElements().get(aURI));
+				aBuffer.append(" extension elements from the following namespace were found: ");
+				aBuffer.append(aURI);
+				aLogger.logInfo(aBuffer.toString(), false);
+			}
+		}
+		if (m_aResult.hasForeignAttributes()) {
+			Set<String> aForeignAttributeURISet = m_aResult.getForeignAttributes().keySet();
+			Iterator<String> aIter = aForeignAttributeURISet.iterator();
+			StringBuilder aBuffer = new StringBuilder();
+			while (aIter.hasNext()) {
+				String aURI = aIter.next();
+				aBuffer.setLength(0);
+				aBuffer.append(m_aResult.getForeignAttributes().get(aURI));
+				aBuffer.append(" extension attributes from the following namespace were found: ");
+				aBuffer.append(aURI);
+				aLogger.logInfo(aBuffer.toString(), false);
+			}
+		}
+		return aLogger.hasError();
+	}
+
+	protected boolean parseEntry(XMLFilter aFilter,
+			Logger aLogger,
+			String aEntryName, boolean bValidating) throws IOException, ZipException, IllegalStateException, ODFValidatorException {
+		OdfPackage aPkg = getPackage(aLogger);
+
+		if (isEncrypted(aEntryName, aLogger)) {
+			return false;
+		}
+
+		InputStream aInStream = null;
+		try {
+			aInStream = getPackage(aLogger).getInputStream(aEntryName, true);
+		} catch (Exception e) {
+			throw new ODFValidatorException(e);
+		}
+
+		return aInStream != null ? parse(aInStream, aFilter, bValidating, aLogger) : false;
+	}
+
+	private boolean parse(InputStream aInStream, XMLFilter aFilter, boolean bValidating, Logger aLogger) throws ODFValidatorException {
+		SAXParser aParser = getSAXParser(bValidating);
+		SchemaErrorHandler aErrorHandler = new SchemaErrorHandler(aLogger, m_aFilter);
+
+		try {
+			XMLReader aReader;
+			if (aFilter != null) {
+				aFilter.setParent(aParser.getXMLReader());
+				aReader = aFilter;
+			} else {
+				aReader = aParser.getXMLReader();
+			}
+			if (m_aFilter != null) {
+				m_aFilter.startSubFile();
+			}
+			aReader.setErrorHandler(aErrorHandler);
+			aReader.parse(new InputSource(aInStream));
+		} catch (org.xml.sax.SAXParseException e) {
+			aErrorHandler.fatalErrorNoException(e);
+		} catch (org.xml.sax.SAXException e) {
+			aLogger.logFatalError(e.getMessage());
+		} catch (IOException e) {
+			aLogger.logFatalError(e.getMessage());
+		}
+
+		if (bValidating) {
+			aLogger.logSummaryInfo();
+		}
+		return aLogger.hasError();
+	}
+
+	private boolean isEncrypted(String aEntryName, Logger aLogger) {
+		OdfFileEntry aFileEntry = getPackage(aLogger).getFileEntry(aEntryName);
+		if (aFileEntry != null) {
+			EncryptionDataElement aEncData = aFileEntry.getEncryptionData();
+			if (aEncData != null) {
+				aLogger.logFatalError("stream content is encrypted. Validataion of encrypted content is not supported.");
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private SAXParser getSAXParser(boolean bValidating) throws ODFValidatorException {
+		SAXParser aParser = null;
+		if (m_aSAXParserFactory == null) {
+			m_aSAXParserFactory = SAXParserFactory.newInstance();
+			m_aSAXParserFactory.setNamespaceAware(true);
+		}
+
+		try {
+			m_aSAXParserFactory.setValidating(bValidating);
+			aParser = m_aSAXParserFactory.newSAXParser();
+		} catch (javax.xml.parsers.ParserConfigurationException e) {
+			throw new ODFValidatorException(e);
+		} catch (org.xml.sax.SAXException e) {
+			throw new ODFValidatorException(e);
+		}
+
+		return aParser;
+	}
+
+	/**
+	 * get the generator
+	 */
+	public String getGenerator() {
+		return m_aResult.getGenerator();
+	}
+
+	private String getVersion(Logger aLogger) throws ODFValidatorException {
+		String aVersion = null;
+
+		InputStream aInStream = null;
+		try {
+			OdfPackage aPkg = getPackage(aLogger);
+			aInStream = aPkg.getInputStream(getStreamName(OdfDocument.OdfXMLFile.META.getFileName()), true);
+			if (aInStream == null) {
+				aInStream = aPkg.getInputStream(getStreamName(OdfDocument.OdfXMLFile.SETTINGS.getFileName()), true);
+			}
+			if (aInStream == null) {
+				aInStream = aPkg.getInputStream(getStreamName(OdfDocument.OdfXMLFile.CONTENT.getFileName()), true);
+			}
+			if (aInStream == null) {
+				return null;
+			}
+		} catch (Exception e) {
+			aLogger.logFatalError(e.getMessage());
+		}
+
+		SAXParser aParser = getSAXParser(false);
+
+		DefaultHandler aHandler = new VersionHandler();
+
+		try {
+			aParser.parse(aInStream, aHandler);
+		} catch (SAXVersionException e) {
+			aVersion = e.getVersion();
+		} catch (org.xml.sax.SAXException e) {
+			aLogger.logFatalError(e.getMessage());
+		} catch (IOException e) {
+			aLogger.logFatalError(e.getMessage());
+		}
+
+		return aVersion;
+	}
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFRootPackageValidator.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFRootPackageValidator.java
new file mode 100644
index 0000000..34ba5bd
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFRootPackageValidator.java
@@ -0,0 +1,192 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.zip.ZipException;
+import javax.xml.validation.Validator;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.doc.OdfDocument;
+import org.xml.sax.ErrorHandler;
+
+abstract class ODFRootPackageValidator extends ODFPackageValidator implements ManifestEntryListener {
+
+    private OdfPackage m_aPkg = null;
+    private ArrayList<ManifestEntry> m_aSubDocs = null;
+    private ODFPackageErrorHandler m_ErrorHandler = null;
+
+    protected ODFRootPackageValidator(Logger.LogLevel nLogLevel, OdfValidatorMode eMode, OdfVersion aVersion, SAXParseExceptionFilter aFilter, ODFValidatorProvider aValidatorProvider) {
+        super(nLogLevel, eMode, aVersion, aFilter, aValidatorProvider);
+    }
+
+    protected abstract OdfPackage getPackage(ErrorHandler handler) throws Exception;
+
+    protected OdfPackage getPackage(Logger aLogger) {
+        if (m_aPkg == null) {
+            try {
+                m_ErrorHandler = new ODFPackageErrorHandler();
+                m_aPkg = getPackage(m_ErrorHandler);
+                // for additional mimetype checking, load root document
+                try {
+                    OdfDocument.loadDocument(m_aPkg, "");
+                } catch (Exception e) {
+                    // ignore -- the interesting stuff is passed to handler
+                }
+            } catch (IOException e) {
+                if (e.getMessage().startsWith("only DEFLATED entries can have EXT descriptor")) {
+                    aLogger.logFatalError("The document is encrypted. Validation of encrypted documents is not supported.");
+                } else {
+                    aLogger.logFatalError(e.getMessage());
+                }
+            } catch (Exception e) {
+                aLogger.logFatalError(e.getMessage());
+            }
+        }
+
+        return m_aPkg;
+    }
+
+    protected String getStreamName( String aEntry )
+    {
+        return aEntry;
+    }
+
+    @Override
+    protected boolean validatePre(Logger aLogger, OdfVersion aVersion ) throws ODFValidatorException, IOException
+    {
+        Logger aManifestLogger = new Logger(OdfPackage.OdfFile.MANIFEST.getPath(),aLogger);
+        Logger aMimetypeLogger = new Logger("mimetype",aLogger);
+
+        // UGLY: do something that causes ODFDOM to parse the manifest, which
+        // may cause m_ErrorHandler to be called
+        m_aPkg.getFilePaths();
+        // hack: just create logger again, too lazy to create a Pair class
+        // and return it from validateMimetype...
+        boolean bErrorsFound = m_ErrorHandler.processErrors( aLogger, aManifestLogger,
+                                              aMimetypeLogger, aVersion);
+
+        bErrorsFound |= validateMimetype(aMimetypeLogger, aVersion);
+        bErrorsFound |= validateManifest(aManifestLogger, aVersion  );
+        aMimetypeLogger.logSummaryInfo();
+
+        return bErrorsFound;
+    }
+
+    @Override
+    protected boolean validatePost(Logger aLogger,OdfVersion aVersion ) throws ODFValidatorException, IOException
+    {
+        boolean bHasErrors = false;
+        if(m_aSubDocs != null )
+        {
+            Iterator<ManifestEntry> aIter = m_aSubDocs.iterator();
+            while( aIter.hasNext() )
+            {
+                ManifestEntry aEntry = aIter.next();
+                ODFPackageValidator aPackageValidator =
+                    new ODFSubPackageValidator( getPackage(aLogger), getLoggerName(), aEntry.getFullPath(), aEntry.getMediaType(),
+                                                  m_nLogLevel, m_eMode, m_aConfigVersion, m_aFilter, m_aResult.getGenerator(), m_aValidatorProvider );
+                bHasErrors |= aPackageValidator.validate(aLogger);
+            }
+        }
+
+        if( aVersion.compareTo(OdfVersion.V1_2) >= 0 )
+        {
+            bHasErrors |= validateDSig( aLogger, OdfPackageExt.STREAMNAME_DOCUMENT_SIGNATURES, aVersion );
+            bHasErrors |= validateDSig( aLogger, OdfPackageExt.STREAMNAME_MACRO_SIGNATURES, aVersion );
+        }
+
+        return bHasErrors;
+    }
+
+    @Override
+    protected void logSummary( boolean bHasErrors, Logger aLogger )
+    {
+        aLogger.logSummaryInfo();
+        if( (bHasErrors || aLogger.hasError()) && m_nLogLevel.compareTo(Logger.LogLevel.INFO) < 0  )
+            aLogger.logInfo( "Generator: " + m_aResult.getGenerator() , true );
+    }
+
+
+    public void foundManifestEntry( ManifestEntry aManifestEntry )
+    {
+        if( aManifestEntry.isOpenDocumentMediaType() )
+        {
+            if( m_aSubDocs == null )
+                m_aSubDocs = new ArrayList<ManifestEntry>();
+            m_aSubDocs.add( aManifestEntry );
+        }
+    }
+
+    private boolean validateMimetype(Logger aLogger, OdfVersion aVersion)
+    {
+        boolean bHasErrors = false;
+
+        String aMimetype=getPackage(aLogger).getMediaTypeString();
+        if( (aMimetype == null) || aMimetype.length() == 0 ) {
+            aLogger.logFatalError("file is not a zip file, or has no mimetype.");
+            bHasErrors = true;
+        } else if(
+            ! (aMimetype.equals(ODFMediaTypes.TEXT_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.TEXT_TEMPLATE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.GRAPHICS_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.GRAPHICS_TEMPLATE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.PRESENTATION_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.SPREADSHEET_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.SPREADSHEET_TEMPLATE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.CHART_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.CHART_TEMPLATE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.IMAGE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.IMAGE_TEMPLATE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.FORMULA_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.FORMULA_TEMPLATE_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.TEXT_MASTER_MEDIA_TYPE)
+            || aMimetype.equals(ODFMediaTypes.TEXT_WEB_MEDIA_TYPE) ) )
+        {
+                aLogger.logInfo("mimetype is not an ODFMediaTypes mimetype.",false);
+                bHasErrors = true;
+        }
+
+        return bHasErrors;
+    }
+
+    private boolean validateManifest(Logger aLogger, OdfVersion aVersion ) throws IOException, ZipException, IllegalStateException, ODFValidatorException
+    {
+        boolean bRet;
+        ManifestFilter aFilter = new ManifestFilter(aLogger, m_aResult, this);
+        Validator aManifestValidator = m_aValidatorProvider.getManifestValidator(aLogger.getOutputStream(),aVersion);
+        if( aManifestValidator != null )
+        {
+            bRet = validateEntry(aFilter,
+                         aManifestValidator, aLogger, OdfPackage.OdfFile.MANIFEST.getPath() );
+        }
+        else
+        {
+            aLogger.logInfo( "Validation of " + OdfPackage.OdfFile.MANIFEST.getPath() + " skipped.", false);
+            bRet = parseEntry(aFilter, aLogger, OdfPackage.OdfFile.MANIFEST.getPath() , false);
+        }
+        return bRet;
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFStreamValidator.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFStreamValidator.java
new file mode 100644
index 0000000..1264c0f
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFStreamValidator.java
@@ -0,0 +1,68 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.InputStream;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.xml.sax.ErrorHandler;
+
+
+/**
+ * Validator for Streams
+ */
+public class ODFStreamValidator extends ODFRootPackageValidator {
+
+    private InputStream m_aInputStream = null;
+    private String m_aBaseURI = null;
+
+    ODFStreamValidator(InputStream aInputStream,
+                              String aBaseURI,
+                              Logger.LogLevel nLogLevel,
+                              OdfValidatorMode eMode,
+                              OdfVersion aVersion,
+                              SAXParseExceptionFilter aFilter,
+                              ODFValidatorProvider aValidatorProvider ) 
+        
+        throws ODFValidatorException {
+        super(nLogLevel, eMode, aVersion, aFilter, aValidatorProvider );
+        
+        m_aInputStream=aInputStream;
+        m_aBaseURI=aBaseURI;
+    }
+
+    protected OdfPackage getPackage(ErrorHandler handler) throws Exception
+    {
+        return OdfPackage.loadPackage(m_aInputStream, m_aBaseURI, handler);
+    }
+    
+    protected String getLoggerName() {
+        return m_aBaseURI;
+    }
+
+    protected @Override
+    String getDocumentPath()
+    {
+        return ""; // this is the root document
+    }
+
+};
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFSubPackageValidator.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFSubPackageValidator.java
new file mode 100644
index 0000000..0627618
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFSubPackageValidator.java
@@ -0,0 +1,69 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+
+
+class ODFSubPackageValidator extends ODFPackageValidator {
+
+    private OdfPackage m_aPkg = null;
+    // this is the URI of the root package, not this subpackage!
+    private String m_aBaseURI = null;
+    private String m_aSubEntryName = null;
+
+    ODFSubPackageValidator( OdfPackage aPkg, String aBaseURI, String aSubEntryName, String aMediaType,
+                             Logger.LogLevel nLogLevel, OdfValidatorMode eMode, OdfVersion aVersion,
+                             SAXParseExceptionFilter aFilter, String aParentGenerator,
+                             ODFValidatorProvider aValidatorProvider ) throws ODFValidatorException
+    {
+        super( nLogLevel, eMode, aVersion, aFilter, aValidatorProvider);
+        m_aPkg = aPkg;
+        m_aBaseURI = aBaseURI;
+        m_aSubEntryName = aSubEntryName;
+        m_aResult.setMediaType(aMediaType);
+        if( aFilter != null )
+            aFilter.startPackage(aParentGenerator);  // take build id from main document as default (embedded objects can nevern be newer)
+    }
+
+    @Override
+    protected String getLoggerName() {
+        return m_aBaseURI;
+    }
+
+    @Override
+    protected String getDocumentPath() {
+        return m_aSubEntryName;
+    }
+
+    protected OdfPackage getPackage( Logger aLogger ) 
+    {
+        return m_aPkg;
+    }
+
+    protected String getStreamName( String aEntry )
+    {
+        return m_aSubEntryName + aEntry;
+    }
+    
+};
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidationResult.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidationResult.java
new file mode 100644
index 0000000..ca2a2b6
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidationResult.java
@@ -0,0 +1,135 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.xml.sax.Attributes;
+
+public class ODFValidationResult implements ManifestListener, MetaInformationListener, ForeignContentListener
+{
+    public enum Status
+    {
+        /**
+         * The document is non conforming to a particular conformance level.
+         */
+        NON_CONFORMING,
+        /**
+         * The document is conforming to a particular conformance level.
+         */
+        CONFORMING,
+        /**
+         * It is unknown whether the document conforms to a particular level.
+         */
+        UNKNOWN,
+        /**
+         * The conformance level is not applicable to the specified file.
+         */
+        NOT_APPLICABLE
+    }
+
+    private String m_aGenerator = null;
+    private String m_aMediaType = "";
+
+    private HashMap<String,Long> m_aForeignElementMap = null;
+    private HashMap<String,Long> m_aForeignAttributeMap = null;
+
+    private Status m_aStrictValid = Status.UNKNOWN;
+    private Status m_aValid = Status.UNKNOWN;
+    private Status m_aConforming = Status.UNKNOWN;
+    private Status m_aExtendedConforming = Status.UNKNOWN;
+
+    private OdfVersion m_aVersion = null;
+    private OdfValidatorMode m_eMode = null;
+
+    ODFValidationResult( OdfVersion aVersion, OdfValidatorMode eMode )
+    {
+        m_aVersion = aVersion;
+        m_eMode = eMode;
+    }
+
+
+    public void setGenerator(String aGenerator)
+    {
+        m_aGenerator = aGenerator;
+    }
+
+    public void setMediaType(String aMediaType)
+    {
+        m_aMediaType = aMediaType;
+    }
+
+    public void foreignElementDetected(String aUri, String aLocalName, String aQName, Attributes aAtts)
+    {
+        if( m_aForeignElementMap == null )
+            m_aForeignElementMap = new HashMap<String,Long>();
+
+        Long aCount = m_aForeignElementMap.get(aUri);
+        if( aCount == null )
+            aCount = Long.valueOf(0);
+        m_aForeignElementMap.put(aUri, aCount+1);
+    }
+
+    public void foreignAttributeDetected(String aUri, String aLocalName, String aQName, String aValue)
+    {
+        if( m_aForeignAttributeMap == null )
+            m_aForeignAttributeMap = new HashMap<String,Long>();
+
+        Long aCount = m_aForeignAttributeMap.get(aUri);
+        if( aCount == null )
+            aCount = Long.valueOf(0);
+        m_aForeignAttributeMap.put(aUri, aCount+1);
+    }
+
+
+    public String getGenerator()
+    {
+        return m_aGenerator;
+    }
+
+    public String getMediaType()
+    {
+        return m_aMediaType;
+    }
+
+    public boolean hasForeignElements()
+    {
+        return m_aForeignElementMap != null;
+    }
+
+    public Map<String,Long> getForeignElements()
+    {
+        return m_aForeignElementMap;
+    }
+
+    public boolean hasForeignAttributes()
+    {
+        return m_aForeignAttributeMap != null;
+    }
+
+    public Map<String,Long> getForeignAttributes()
+    {
+        return m_aForeignAttributeMap;
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidator.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidator.java
new file mode 100644
index 0000000..0d7ddcd
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidator.java
@@ -0,0 +1,372 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfvalidator;
+
+import javax.xml.XMLConstants;
+
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Validator;
+
+public class ODFValidator implements ODFValidatorProvider {
+
+	// Prefix used to distinguish internal resources from external ones
+	// Loglevel
+	private Logger.LogLevel m_nLogLevel;
+	// Validator provider
+	private SchemaFactory m_aRNGSchemaFactory = null;
+	private SchemaFactory m_aXSDSchemaFactory = null;
+	// User provided Configuration
+	protected Configuration m_aConfig = null;
+	// User provided ODF version
+	protected OdfVersion m_aVersion = null;
+	protected OdfVersion mOdfPackageVersion = null;
+	// User provided preference for using Math DTD
+	protected boolean m_bUseMathDTD = false;
+	// Validatore and configuration cache
+	private HashMap<String, Schema> m_aSchemaMap = null;
+	private HashMap<OdfVersion, Configuration> m_aConfigurationMap = null;
+	// Generator from last validateFile or validateStream call
+	private String m_aGenerator = "";
+
+	/** Creates a new instance of Validator */
+	public ODFValidator(Configuration aConfig,
+			Logger.LogLevel nLogLevel,
+			OdfVersion aVersion,
+			boolean bUseMathDTD) throws ODFValidatorException {
+
+		m_nLogLevel = nLogLevel;
+		m_aConfig = aConfig;
+		m_aVersion = aVersion;
+		m_bUseMathDTD = bUseMathDTD;
+		Logger.enableHTML(false);
+	}
+
+	/** Creates a new instance of Validator */
+	public ODFValidator(Configuration aConfig,
+			Logger.LogLevel nLogLevel,
+			boolean logAsHTML,
+			OdfVersion aVersion,
+			boolean bUseMathDTD) throws ODFValidatorException {
+
+		m_nLogLevel = nLogLevel;
+		m_aConfig = aConfig;
+		m_aVersion = aVersion;
+		m_bUseMathDTD = bUseMathDTD;
+		Logger.enableHTML(logAsHTML);
+
+	}
+
+	/** Returns either the ODF version request to validate or the ODF version of the root document as fall-back */
+	public String getOdfVersion() {
+		String version = null;
+		if (m_aVersion != null) {
+			version = m_aVersion.toString();
+		} else {
+			version = mOdfPackageVersion.toString();
+		}
+		return version;
+	}
+
+	public boolean validate(PrintStream aOut, Configuration aConfig, OdfValidatorMode eMode) throws ODFValidatorException {
+		List<String> aFileNames = aConfig.getListPropety(Configuration.PATH);
+		String aExcludeRegExp = aConfig.getProperty(Configuration.EXCLUDE);
+		String aRecursive = aConfig.getProperty(Configuration.RECURSIVE);
+		boolean bRecursive = aRecursive != null ? Boolean.valueOf(aRecursive) : false;
+		String aFilterFileName = aConfig.getProperty(Configuration.FILTER);
+
+		return validate(aOut, aFileNames, aExcludeRegExp, eMode, bRecursive, aFilterFileName);
+	}
+
+	public boolean validate(PrintStream aOut, List<String> aFileNames, String aExcludeRegExp,
+			OdfValidatorMode eMode, boolean bRecursive,
+			String aFilterFileName) throws ODFValidatorException {
+		boolean bRet = false;
+
+		SAXParseExceptionFilter aFilter = null;
+		if (aFilterFileName != null && aFilterFileName.length() != 0) {
+			aFilter = new ValidationOOoTaskIdErrorFilter(new File(aFilterFileName), aOut);
+		}
+
+		FileFilter aFileFilter = new ODFFileFilter(aExcludeRegExp, bRecursive);
+
+		Iterator<String> aIter = aFileNames.iterator();
+		while (aIter.hasNext()) {
+			File aFile = new File(aIter.next());
+			bRet |= aFile.isDirectory() ? validateDir(aOut, aFile, aFileFilter, eMode, aFilter)
+					: validateFile(aOut, aFile, eMode, aFilter);
+		}
+
+		return bRet;
+	}
+
+	public boolean validate(PrintStream aOut, InputStream aInputStream, String aBaseURI,
+			OdfValidatorMode eMode,
+			SAXParseExceptionFilter aFilter) throws ODFValidatorException {
+		return validateStream(aOut, aInputStream, aBaseURI, eMode, aFilter);
+	}
+
+	private boolean validateDir(PrintStream aOut, final File aDir, FileFilter aFileFilter, OdfValidatorMode eMode, SAXParseExceptionFilter aFilter) throws ODFValidatorException {
+		boolean bRet = true;
+		File[] aFiles = aDir.listFiles(aFileFilter);
+
+		if (aFiles != null) {
+			for (int i = 0; i < aFiles.length; ++i) {
+				File aFile = aFiles[i];
+				if (aFile.isDirectory()) {
+					bRet |= validateDir(aOut, aFile, aFileFilter, eMode, aFilter);
+				} else {
+					bRet |= validateFile(aOut, aFile, eMode, aFilter);
+				}
+			}
+		}
+		return bRet;
+	}
+
+	/**
+	 * validate the input File
+	 *
+	 * <p>After validation the getGenerator method can be called to get the generator of the validated file</p>
+	 */
+	public boolean validateFile(PrintStream aOut, File aDocFile, OdfValidatorMode eMode, SAXParseExceptionFilter aFilter) throws ODFValidatorException {
+		ODFFileValidator aFileValidator =
+				new ODFFileValidator(aDocFile, m_nLogLevel, eMode, m_aVersion, aFilter, this);
+
+		boolean result = aFileValidator.validate(aOut);
+		mOdfPackageVersion = aFileValidator.mOdfPackageVersion;
+		m_aGenerator = aFileValidator.getGenerator();
+		return result;
+	}
+
+	/**
+	 * validate the input Stream
+	 *
+	 * <p>After validation the getGenerator method can be called to get the generator of the validated file</p>
+	 */
+	public boolean validateStream(PrintStream aOut, InputStream aInputStream, String aBaseURI,
+			OdfValidatorMode eMode,
+			SAXParseExceptionFilter aFilter) throws ODFValidatorException {
+		ODFStreamValidator aStreamValidator =
+				new ODFStreamValidator(aInputStream, aBaseURI, m_nLogLevel, eMode, m_aVersion, aFilter, this);
+		boolean result = aStreamValidator.validate(aOut);
+		m_aGenerator = aStreamValidator.getGenerator();
+		mOdfPackageVersion = aStreamValidator.mOdfPackageVersion;
+		return result;
+	}
+
+	public Validator getManifestValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException {
+		return getValidatorForSchema(aOut, getSchemaFileName(Configuration.MANIFEST_SCHEMA, aVersion));
+	}
+
+	public Validator getValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException {
+		return getValidatorForSchema(aOut, getSchemaFileName(Configuration.SCHEMA, aVersion));
+	}
+
+	public Validator getStrictValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException {
+		return getValidatorForSchema(aOut, getSchemaFileName(Configuration.STRICT_SCHEMA, aVersion));
+	}
+
+	public Validator getMathMLValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException {
+		return getValidatorForSchema(aOut, getSchemaFileName(Configuration.MATHML2_SCHEMA, aVersion));
+	}
+
+	public String getMathMLDTDSystemId(OdfVersion aVersion) throws ODFValidatorException {
+		String aDTD = null;
+		if (m_bUseMathDTD) {
+			Configuration aConfig =
+					m_aConfig != null ? m_aConfig : getConfiguration(aVersion);
+
+			aDTD = aConfig.getProperty(Configuration.MATHML_SCHEMA);
+			if (m_aConfig == null && aDTD != null && aDTD.length() > 0) {
+				aDTD = InternalResources.createInternalResourceIdentifier(aDTD);
+			}
+		}
+
+		return aDTD;
+	}
+
+	public Validator getDSigValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException {
+		return getValidatorForSchema(aOut, getSchemaFileName(Configuration.DSIG_SCHEMA, aVersion));
+	}
+
+	public void resetValidatorProvider() {
+		m_aRNGSchemaFactory = null;
+		m_aXSDSchemaFactory = null;
+		m_aSchemaMap = null;
+	}
+
+	private String getSchemaFileName(String aConfigName, OdfVersion aVersion) throws ODFValidatorException {
+		Configuration aConfig =
+				m_aConfig != null ? m_aConfig : getConfiguration(aVersion);
+
+		String aFileName = aConfig.getProperty(aConfigName);
+		if (m_aConfig == null && aFileName != null && aFileName.length() > 0) {
+			aFileName = InternalResources.createInternalResourceIdentifier(aFileName);
+		}
+
+		return aFileName;
+	}
+
+	private Configuration getConfiguration(OdfVersion aVersion) throws ODFValidatorException {
+		if (m_aConfigurationMap == null) {
+			m_aConfigurationMap = new HashMap<OdfVersion, Configuration>();
+		}
+
+		Configuration aConfig = m_aConfigurationMap.get(aVersion);
+		if (aConfig == null) {
+			String aConfigName = null;
+			if (aVersion == null || aVersion == OdfVersion.V1_2) {
+				aConfigName = "/schema/odf1_2.properties";
+			} else if (aVersion == OdfVersion.V1_1) {
+				aConfigName = "/schema/odf1_1.properties";
+			} else if (aVersion == OdfVersion.V1_0) {
+				aConfigName = "/schema/odf1_0.properties";
+			} else {
+				throw new ODFValidatorException("unsupported ODF version: ".concat(aVersion.toString()));
+			}
+
+			InputStream aInStream = getClass().getResourceAsStream(aConfigName);
+			if (aInStream == null) {
+				throw new ODFValidatorException("Internal configuration file is missing: ".concat(aConfigName));
+			}
+
+			aConfig = new Configuration();
+			try {
+				aConfig.loadFromXML(aInStream);
+				aInStream.close();
+			} catch (IOException e) {
+				throw new ODFValidatorException(e);
+			}
+
+			m_aConfigurationMap.put(aVersion, aConfig);
+		}
+
+		return aConfig;
+	}
+
+	private Validator getValidatorForSchema(PrintStream aOut, String aSchemaFileName) throws ODFValidatorException {
+		if (m_aSchemaMap == null) {
+			m_aSchemaMap = new HashMap<String, Schema>();
+		}
+
+		Schema aSchema = m_aSchemaMap.get(aSchemaFileName);
+		if (aSchema == null) {
+			aSchema = createSchema(aOut, aSchemaFileName);
+			m_aSchemaMap.put(aSchemaFileName, aSchema);
+		}
+
+		return aSchema.newValidator();
+	}
+
+	private Schema createSchema(PrintStream aOut, String aSchemaFileName) throws ODFValidatorException {
+		Logger aLogger = new Logger(aSchemaFileName, "", aOut, m_nLogLevel);
+
+		if (aSchemaFileName == null || aSchemaFileName.length() == 0) {
+			return null;
+		}
+
+		String aSchemaLanguage =
+				aSchemaFileName.endsWith("xsd") ? XMLConstants.W3C_XML_SCHEMA_NS_URI
+				: XMLConstants.RELAXNG_NS_URI;
+
+
+		SchemaFactory aSchemaFactory = getSchemaFactory(aSchemaLanguage);
+		SchemaErrorHandler aErrorHandler = new SchemaErrorHandler(aLogger, null);
+		aSchemaFactory.setErrorHandler(aErrorHandler);
+		aSchemaFactory.setResourceResolver(new SchemaResourceResolver(aLogger, aSchemaFileName));
+		Schema aSchema = null;
+
+		StreamSource aSource = null;
+		if (InternalResources.isInternalResourceIdentifer(aSchemaFileName)) {
+			String aPath = InternalResources.getResourcePath(aSchemaFileName);
+			InputStream aInStream = getClass().getResourceAsStream(aPath);
+			if (aInStream == null) {
+				throw new ODFValidatorException("Internal schema file is missing: ".concat(aPath));
+			}
+
+			aSource = new StreamSource(aInStream, aSchemaFileName);
+		} else {
+			File aFile = new File(aSchemaFileName);
+			if (!aFile.exists()) {
+				aLogger.logFatalError(aSchemaFileName + ": file does not exist");
+				return null;
+			}
+			aSource = new StreamSource(aFile);
+		}
+
+		// Workaround: MSV seems not to call error handler
+		try {
+			aSchema = aSchemaFactory.newSchema(aSource);
+		} catch (org.xml.sax.SAXParseException e) {
+			aLogger.logFatalError(e);
+		} catch (org.xml.sax.SAXException e) {
+			aLogger.logFatalError(e.getMessage());
+		}
+
+		if (aLogger.hasError()) {
+			throw new ODFValidatorException(aSchemaFileName, "", "Schema has validation errors.");
+		}
+
+		aLogger.logInfo("parsed.", false);
+		return aSchema;
+	}
+
+	private SchemaFactory getSchemaFactory(String aSchemaLanguage) throws ODFValidatorException {
+		boolean isRNG = aSchemaLanguage.equals(XMLConstants.RELAXNG_NS_URI);
+		SchemaFactory aSchemaFactory = isRNG ? m_aRNGSchemaFactory
+				: m_aXSDSchemaFactory;
+		if (aSchemaFactory == null) {
+			try {
+				if (isRNG) {
+					System.setProperty("javax.xml.validation.SchemaFactory:" + aSchemaLanguage, "org.iso_relax.verifier.jaxp.validation.RELAXNGSchemaFactoryImpl");
+					SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
+					m_aRNGSchemaFactory = SchemaFactory.newInstance(aSchemaLanguage);
+					aSchemaFactory = m_aRNGSchemaFactory;
+				} else {
+					System.setProperty("javax.xml.validation.SchemaFactory:" + aSchemaLanguage, "org.apache.xerces.jaxp.validation.XMLSchemaFactory");
+					m_aXSDSchemaFactory = SchemaFactory.newInstance(aSchemaLanguage);
+					aSchemaFactory = m_aXSDSchemaFactory;
+				}
+			} catch (IllegalArgumentException e) {
+				throw new ODFValidatorException(aSchemaLanguage + " support is not installed: " + e.getMessage());
+			}
+		}
+		return aSchemaFactory;
+	}
+
+	/**
+	 * get Generator from last validateFile or validateStream call
+	 */
+	public String getGenerator() {
+		return m_aGenerator;
+	}
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidatorException.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidatorException.java
new file mode 100644
index 0000000..c311b29
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidatorException.java
@@ -0,0 +1,70 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+public class ODFValidatorException extends Exception {
+    
+    private String m_aFile;
+    private String m_aEntry;
+    
+    /** Creates a new instance of ODFValidatorException */
+    ODFValidatorException( Exception e) {
+        super( e );
+    }
+    
+    ODFValidatorException( String aMsg ) {
+        super( aMsg );
+    }
+
+    ODFValidatorException( String aFile, String aEntry, String aMsg ) {
+        super( aMsg );
+        m_aFile = aFile;
+        m_aEntry = aEntry;
+    }
+ 
+    ODFValidatorException( String aFile, String aEntry, Exception e ) {
+        super( e );
+        m_aFile = aFile;
+        m_aEntry = aEntry;
+    }
+
+    @Override
+    public String getMessage() {
+        String retValue = "";
+        
+        if( m_aFile != null && m_aFile.length() > 0 )
+        {
+            retValue += m_aFile;
+            retValue += ":";
+        }
+        if( m_aEntry != null && m_aEntry.length() > 0 )
+        {
+            retValue += m_aEntry;
+            retValue += ":";
+        }
+        retValue += super.getMessage();
+        return retValue;
+    }
+    
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidatorProvider.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidatorProvider.java
new file mode 100644
index 0000000..e029365
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ODFValidatorProvider.java
@@ -0,0 +1,42 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import javax.xml.validation.Validator;
+import java.io.PrintStream;
+
+public interface ODFValidatorProvider {
+    Validator getValidator(PrintStream aOut, OdfVersion aVersion ) throws ODFValidatorException;
+
+    Validator getStrictValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException;
+    
+    Validator getManifestValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException;
+
+    Validator getDSigValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException;
+
+    Validator getMathMLValidator(PrintStream aOut, OdfVersion aVersion) throws ODFValidatorException;
+
+    String getMathMLDTDSystemId( OdfVersion aVersion ) throws ODFValidatorException;
+        
+    void resetValidatorProvider();
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfPackageExt.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfPackageExt.java
new file mode 100644
index 0000000..fee957a
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfPackageExt.java
@@ -0,0 +1,30 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+public class OdfPackageExt {
+
+    public static final String STREAMNAME_DOCUMENT_SIGNATURES = "META-INF/documentsignatures.xml";    
+    public static final String STREAMNAME_MACRO_SIGNATURES = "META-INF/macrosignatures.xml";    
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfValidatorMode.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfValidatorMode.java
new file mode 100644
index 0000000..0b59e33
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfValidatorMode.java
@@ -0,0 +1,58 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+public enum OdfValidatorMode {
+    /***
+     * all versions
+     */
+    CONFORMANCE ("conformant"), //
+
+    /***
+     * ODF 1.0 and 1.1 only, equals CONFORMANCE for ODF 1.2
+     */
+    VALIDATE ("valid"),
+
+    /***
+     * ODF 1.0 and 1.1 only, equals CONFORMANCE for ODF 1.2
+     */
+    VALIDATE_STRICT ("strict valid"),
+
+    /***
+     * ODF 1.2 only, equals CONFORMANCE for ODF 1.0/1.1
+     */
+    EXTENDED_CONFORMANCE ("extended conformant");
+	
+    private String mValue;
+
+    OdfValidatorMode( String value )
+    {
+        mValue = value;
+    }
+
+    @Override
+    public String toString()
+    {
+        return mValue;
+    }	
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfVersion.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfVersion.java
new file mode 100644
index 0000000..73bdb71
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/OdfVersion.java
@@ -0,0 +1,57 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+public enum OdfVersion {
+
+    V1_0( "1.0" ), V1_1( "1.1" ), V1_2( "1.2" );
+
+    private String m_aValue;
+
+    OdfVersion( String _aValue )
+    {
+        m_aValue = _aValue;
+    }
+
+    @Override
+    public String toString()
+    {
+        return m_aValue;
+    }
+
+    public static OdfVersion valueOf( String _aString, boolean _bAttrValue )
+    {
+        if( _aString == null )
+            return _bAttrValue ? V1_1 : null;
+
+        for( OdfVersion aIter : values() )
+        {
+            if( _aString.equals( aIter.toString() ) )
+            {
+                return aIter;
+            }
+        }
+        return _bAttrValue ? V1_1 : null;
+    }
+
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SAXParseExceptionFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SAXParseExceptionFilter.java
new file mode 100644
index 0000000..12a2e79
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SAXParseExceptionFilter.java
@@ -0,0 +1,36 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.xml.sax.SAXParseException;
+
+public interface SAXParseExceptionFilter {
+    
+    SAXParseException filterException( SAXParseException e );
+    
+    void startPackage( String aParentGenerator );
+    
+    void setGenerator( String aGenerator );
+    
+    void startSubFile();
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SAXVersionException.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SAXVersionException.java
new file mode 100644
index 0000000..7167d59
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SAXVersionException.java
@@ -0,0 +1,41 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.xml.sax.SAXException;
+
+class SAXVersionException extends SAXException{
+
+    private String m_aVersion = null;
+    
+    SAXVersionException( String aVersion )
+    {
+        super();
+        m_aVersion = aVersion;
+    }
+    
+    String getVersion()
+    {
+        return m_aVersion;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java
new file mode 100644
index 0000000..5ca8f37
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaErrorHandler.java
@@ -0,0 +1,78 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+class SchemaErrorHandler implements org.xml.sax.ErrorHandler {
+    
+    private Logger m_aLogger;
+    private SAXParseExceptionFilter m_aFilter;
+
+    /** Creates a new instance of SchemaErrorHandler */
+    SchemaErrorHandler(Logger aLogger, SAXParseExceptionFilter aFilter ) {
+        m_aLogger = aLogger;
+        m_aFilter = aFilter;
+    }
+    
+    public void warning(SAXParseException e) throws SAXException {
+        if( !filter(e) )
+            m_aLogger.logWarning(  e );
+    }
+
+    public void fatalError(SAXParseException e) throws SAXException {
+        fatalErrorNoException( e );
+    }
+
+    public void error(SAXParseException e) throws SAXException {
+        if( !filter(e) )
+            m_aLogger.logError( e );
+    }
+
+    public void fatalErrorNoException(SAXParseException e) {
+        if( !filter(e) )
+            m_aLogger.logFatalError(  e );
+    }
+    
+    private boolean filter( SAXParseException e )
+    {
+        boolean bFiltered = false;
+        if( m_aFilter != null )
+        {
+            SAXParseException aNewExc = m_aFilter.filterException( e );
+            if( aNewExc == null  )
+            {
+                bFiltered = true;
+            }
+            else if( aNewExc != e )
+            {
+                m_aLogger.logWarning( aNewExc );
+                bFiltered = true;
+            }
+        }
+        
+        return bFiltered;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaFilter.java
new file mode 100644
index 0000000..5a00676
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaFilter.java
@@ -0,0 +1,45 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+class SchemaFilter extends XMLFilterImpl {
+    
+    /** Creates a new instance of SchemaFilter */
+    SchemaFilter() {
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+
+        if( qName.equals("param"))
+        {
+            System.out.println( atts.getValue(uri,"pattern"));
+        }
+        super.startElement(uri, localName, qName, atts);
+    }
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaResourceResolver.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaResourceResolver.java
new file mode 100644
index 0000000..c85ebcd
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/SchemaResourceResolver.java
@@ -0,0 +1,194 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.InputStream;
+import java.io.Reader;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+
+    class SchemaResourceResolver implements LSResourceResolver 
+    {
+        private String m_aBaseURI = null;
+        private Logger m_aLogger = null;
+        private DOMImplementationLS m_aDOMImplLS = null;
+        private boolean m_bGetDOMImplLSFailed = false;
+        
+        class LSInputImpl implements LSInput
+        {
+            private InputStream m_aInputStream = null;
+            private String m_aSystemId = null;
+
+            public Reader getCharacterStream() {
+                return null;
+            }
+
+            public void setCharacterStream(Reader aCharacterStream) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public InputStream getByteStream() {
+                return m_aInputStream;
+            }
+
+            public void setByteStream(InputStream aByteStream) {
+                m_aInputStream = aByteStream;
+            }
+
+            public String getStringData() {
+                return null;
+            }
+
+            public void setStringData(String stringData) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public String getSystemId() {
+                return m_aSystemId;
+            }
+
+            public void setSystemId(String aSystemId) {
+                m_aSystemId = aSystemId;
+            }
+
+            public String getPublicId() {
+                return null;
+            }
+
+            public void setPublicId(String publicId) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public String getBaseURI() {
+                return null;
+            }
+
+            public void setBaseURI(String baseURI) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public String getEncoding() {
+                return null;
+            }
+
+            public void setEncoding(String encoding) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            public boolean getCertifiedText() {
+                return false;
+            }
+
+            public void setCertifiedText(boolean certifiedText) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+        }
+        
+        public SchemaResourceResolver( Logger aLogger, String aBaseURI )
+        {
+            m_aBaseURI = aBaseURI;
+            m_aLogger = aLogger;
+        }
+    
+        public LSInput resolveResource(String aType, String aNamespaceURI, String aPublicId, String aSystemId, String aBaseURI) 
+        {
+            LSInput aInput = null;
+            
+            if( aBaseURI == null )
+                aBaseURI = m_aBaseURI; 
+
+            if( aSystemId != null && aBaseURI != null && 
+                InternalResources.isInternalResourceIdentifer(aBaseURI) )
+            {
+                String aURI = aBaseURI.substring(0, aBaseURI.lastIndexOf('/')+1).concat(aSystemId);
+                String aPath = InternalResources.getResourcePath(aURI);
+                InputStream aInStream = getClass().getResourceAsStream(aPath);
+                if( aInStream != null )
+                {
+                    aInput = createLSInput();
+                    aInput.setSystemId(aURI);
+                    aInput.setByteStream(aInStream);
+ 
+                    String aMsg = "resolving '" + aURI + "'";
+                    m_aLogger.logInfo( aMsg , false);
+                }
+                else
+                {
+                    m_aLogger.logFatalError("Missing internal schema file: ".concat(aPath));
+                }
+            }
+        
+           return aInput;
+        }
+        
+        private LSInput createLSInput()
+        {
+            LSInput aLSInput = null;
+            
+            if( m_aDOMImplLS == null && !m_bGetDOMImplLSFailed )
+            {
+                DOMImplementationRegistry aDOMReg = null;
+
+                try
+                {        
+                    aDOMReg = DOMImplementationRegistry.newInstance();
+                }
+                catch( ClassNotFoundException e )
+                {
+                    m_aLogger.logFatalError(e.getMessage());
+                }
+                catch( InstantiationException e )
+                {
+                    m_aLogger.logFatalError(e.getMessage());
+                }
+                catch( IllegalAccessException e )
+                {
+                    m_aLogger.logFatalError(e.getMessage());
+                }
+                DOMImplementation aDOMImpl = aDOMReg.getDOMImplementation( "LS 3.0");
+                if( aDOMImpl != null )
+                {
+                    m_aDOMImplLS = (DOMImplementationLS)aDOMImpl;
+                }
+                else
+                {
+                    m_bGetDOMImplLSFailed = true;
+                    m_aLogger.logInfo("Could not find DOM LS 3.0 Implementation, using own implementation", false);
+                }
+            }
+            if( m_aDOMImplLS != null )
+            {
+                aLSInput = m_aDOMImplLS.createLSInput();
+            }
+            else
+            {
+                aLSInput = new LSInputImpl();
+            }
+            
+            return aLSInput;
+        }
+    }
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ValidationMessageCollectorErrorFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ValidationMessageCollectorErrorFilter.java
new file mode 100644
index 0000000..afed2d0
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ValidationMessageCollectorErrorFilter.java
@@ -0,0 +1,74 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.util.HashSet;
+import org.xml.sax.SAXParseException;
+
+/**
+ *
+ */
+public class ValidationMessageCollectorErrorFilter implements SAXParseExceptionFilter {
+
+    private String m_aGenerator;
+    private HashSet<String> m_aMsgsReported;
+
+    
+    /** Creates a new instance of ValidationErrorFilter */
+    public ValidationMessageCollectorErrorFilter() throws ODFValidatorException {
+        m_aMsgsReported = new HashSet<String>();
+    }
+    
+    public SAXParseException filterException( SAXParseException aExc )
+    {
+        String aMsg = aExc.getMessage();
+        if( !m_aMsgsReported.contains(aMsg))
+        {
+             m_aMsgsReported.add( aMsg );
+        }
+        
+        return aExc;
+    }
+
+    public void startPackage( String aGenerator )
+    {
+    }
+
+    public void setGenerator( String aGenerator )
+    {
+        m_aGenerator = aGenerator;
+    }
+    
+    public void startSubFile() {
+    }    
+    
+    public String getGenerator()
+    {
+        return m_aGenerator;
+    }
+
+    public HashSet<String> getMessages()
+    {
+        return m_aMsgsReported;
+    }
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ValidationOOoTaskIdErrorFilter.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ValidationOOoTaskIdErrorFilter.java
new file mode 100644
index 0000000..dee1519
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/ValidationOOoTaskIdErrorFilter.java
@@ -0,0 +1,213 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.File;
+import java.io.PrintStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ *
+ */
+public class ValidationOOoTaskIdErrorFilter implements SAXParseExceptionFilter {
+
+    
+    private static final String FILTER_ENTRY = "filter-entry";
+    private static final String TASK_ID = "task-id";
+    private static final String RESOLVED_IN = "resolved-in";
+    
+    int m_nBuildId = 0;
+    
+    class FilterEntry
+    {
+        String m_aTaskId;
+        int m_nBuildId;
+        
+        FilterEntry( String aTaskId, int nBuildId )
+        {
+            m_aTaskId = aTaskId;
+            m_nBuildId = nBuildId;
+        }
+    }
+            
+
+    private HashMap<String,FilterEntry> m_aFilterEntries;
+    private HashSet<String> m_aTaskIdsReported;
+
+    class Handler extends DefaultHandler
+    {
+        class Entry
+        {
+            String m_aMessage = "";
+            String m_aTask = "";
+            int m_nBuildId = 0;
+
+            Entry( String aTask )
+            {
+                m_aTask = aTask;
+            }
+        }
+
+        HashMap<String,FilterEntry> m_aFilterEntries;
+        Entry m_aEntry = null;
+
+        Handler( HashMap<String,FilterEntry> aFilterEntries )
+        {
+            m_aFilterEntries = aFilterEntries;
+        }
+
+        @Override
+        public void characters(char[] aCh, int nStart, int nLength) throws SAXException {
+            if( m_aEntry != null )
+                m_aEntry.m_aMessage += new String(aCh, nStart, nLength);
+        }
+
+        @Override
+        public void startElement(String aUri, String aLocalName, String aQName, Attributes aAttributes) throws SAXException {
+            if( aQName.equals(FILTER_ENTRY) )
+            {
+               String aTaskId = aAttributes.getValue(TASK_ID);
+                if( aTaskId != null )
+                {
+                    m_aEntry = new Entry( aTaskId );
+                    String aBuildId = aAttributes.getValue(RESOLVED_IN);
+                    if( aBuildId != null && aBuildId.length() > 0)
+                        m_aEntry.m_nBuildId = Integer.valueOf(aBuildId);
+                }
+               
+            }
+        }
+
+        @Override
+        public void endElement(String aUri, String aLocalName, String aQName) throws SAXException {
+            if( aQName.equals(FILTER_ENTRY) )
+            {
+                if( m_aEntry != null )
+                {
+                    m_aFilterEntries.put( m_aEntry.m_aMessage, new FilterEntry(m_aEntry.m_aTask,m_aEntry.m_nBuildId) );
+                }
+            }
+        }
+
+    }
+    
+    /** Creates a new instance of ValidationErrorFilter */
+    public ValidationOOoTaskIdErrorFilter( File aFilterFile, PrintStream aOut ) throws ODFValidatorException {
+        m_aFilterEntries = new HashMap<String,FilterEntry>();
+        m_aTaskIdsReported = new HashSet<String>();
+        SAXParser aParser = null;
+        Logger aLogger = new Logger( aFilterFile.getAbsolutePath(), "", aOut, Logger.LogLevel.ERROR );
+        try
+        {
+            SAXParserFactory aParserFactory = SAXParserFactory.newInstance();
+            aParserFactory.setNamespaceAware(false);
+            aParser = aParserFactory.newSAXParser();
+
+            aParser.parse(aFilterFile, new Handler( m_aFilterEntries));
+        }
+        catch( javax.xml.parsers.ParserConfigurationException e )
+        {
+            throw new ODFValidatorException( e );
+        }
+        catch( org.xml.sax.SAXParseException e )
+        {
+            aLogger.logError( e );
+            throw new ODFValidatorException( e );
+        }
+        catch( org.xml.sax.SAXException e )
+        {
+            aLogger.logError( e.getMessage() );
+            throw new ODFValidatorException( e );
+        }
+        catch( java.io.IOException e )
+        {
+            throw new ODFValidatorException( e );
+        }
+
+
+    }
+    
+    public SAXParseException filterException( SAXParseException aExc )
+    {
+        if( m_nBuildId > 0 )
+        {
+            FilterEntry aEntry = m_aFilterEntries.get(aExc.getMessage());
+            if( aEntry != null && 
+                (aEntry.m_nBuildId == 0 || m_nBuildId <= aEntry.m_nBuildId) )
+            {
+                String aTaskId = aEntry.m_aTaskId;
+                if( !m_aTaskIdsReported.contains(aTaskId ))
+                {
+                    m_aTaskIdsReported.add( aTaskId );
+                    return new SAXParseException( "Issue " + aTaskId + " found.", aExc.getPublicId(), aExc.getSystemId(), aExc.getLineNumber(), aExc.getColumnNumber(), aExc );
+                }
+                else
+                    return null;
+            }
+        }
+        
+        return aExc;
+    }
+
+    public void startPackage( String aGenerator )
+    {
+        m_nBuildId = aGenerator.length() > 0 ? getBuildId( aGenerator) : 0;
+    }
+    
+    
+    public void startSubFile() {
+        m_aTaskIdsReported = new HashSet<String>();
+        // the build id is kept
+    }
+    
+    public void setGenerator( String aGenerator )
+    {
+        m_nBuildId = aGenerator.length() > 0 ? getBuildId( aGenerator) : 0;
+    }
+
+    public static int getBuildId( String aGenerator )
+    {
+        int nBuildId = 0;
+        int nPos = aGenerator.indexOf("OpenOffice.org_project/");
+        if( nPos>0 )
+        {
+            nPos = aGenerator.indexOf("Build-",nPos);
+            if( nPos > 0 )
+            {
+                int nStart = nPos+6;
+                nPos = aGenerator.indexOf("$",nStart);
+                nBuildId = Integer.valueOf(nPos > 0 ? aGenerator.substring(nStart,nPos) : aGenerator.substring(nStart));
+            }
+        }
+        
+        return nBuildId;
+    }
+    
+}
diff --git a/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/VersionHandler.java b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/VersionHandler.java
new file mode 100644
index 0000000..3f3576c
--- /dev/null
+++ b/trunk/validator/src/main/java/org/odftoolkit/odfvalidator/VersionHandler.java
@@ -0,0 +1,53 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ * 
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ * 
+ * Use is subject to license terms.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class VersionHandler extends DefaultHandler {
+
+    private static final String OFFICE_NAMESPACE_URI = "urn:oasis:names:tc:opendocument:xmlns:office:1.0";
+    private static final String DOCUMENT_META = "document-meta";
+    private static final String DOCUMENT_CONTENT = "document-content";
+    private static final String DOCUMENT_SETTINGS = "document-settings";
+    private static final String DOCUMENT_STYLES = "document-styles";
+    private static final String VERSION = "version";
+
+    @Override
+    public void startElement(String aUri, String aLocalName, String aQName, Attributes aAttributes) throws SAXException {
+        super.startElement(aUri, aLocalName, aQName, aAttributes);
+        
+        if( aUri.equals(OFFICE_NAMESPACE_URI) &&
+            (aLocalName.equalsIgnoreCase(DOCUMENT_META) ||
+             aLocalName.equalsIgnoreCase(DOCUMENT_CONTENT) || 
+             aLocalName.equalsIgnoreCase(DOCUMENT_SETTINGS) ||
+             aLocalName.equalsIgnoreCase(DOCUMENT_STYLES)) )
+        {
+            String aVersion = aAttributes.getValue(OFFICE_NAMESPACE_URI,VERSION);
+            throw new SAXVersionException(aVersion);
+        }
+    }
+
+}
diff --git a/trunk/validator/src/main/resources/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader b/trunk/validator/src/main/resources/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader
new file mode 100644
index 0000000..b0d3dc5
--- /dev/null
+++ b/trunk/validator/src/main/resources/META-INF/services/org.iso_relax.verifier.VerifierFactoryLoader
@@ -0,0 +1 @@
+com.sun.msv.verifier.jarv.FactoryLoaderImpl
\ No newline at end of file
diff --git a/trunk/validator/src/main/resources/schema/odf1_0.properties b/trunk/validator/src/main/resources/schema/odf1_0.properties
new file mode 100644
index 0000000..1349525
--- /dev/null
+++ b/trunk/validator/src/main/resources/schema/odf1_0.properties
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<properties>
+<entry key="manifest-schema">/schema/odf1.0/OpenDocument-manifest-schema-v1.0-os.rng</entry>
+<entry key="schema">/schema/odf1.0/OpenDocument-schema-v1.0-os.rng</entry>
+<entry key="strict-schema">/schema/odf1.0/OpenDocument-strict-schema-v1.0-os.rng</entry>
+<entry key="mathml-schema">/schema/mathml1.01/math.dtd</entry>
+<entry key="filter"/>
+</properties>
+
diff --git a/trunk/validator/src/main/resources/schema/odf1_1.properties b/trunk/validator/src/main/resources/schema/odf1_1.properties
new file mode 100644
index 0000000..ed0e7c2
--- /dev/null
+++ b/trunk/validator/src/main/resources/schema/odf1_1.properties
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<properties>
+<entry key="manifest-schema">/schema/odf1.1/OpenDocument-manifest-schema-v1.1.rng</entry>
+<entry key="strict-schema">/schema/odf1.1/OpenDocument-strict-schema-v1.1.rng</entry>
+<entry key="schema">/schema/odf1.1/OpenDocument-schema-v1.1.rng</entry>
+<entry key="mathml-schema">/schema/mathml1.01/math.dtd</entry>
+<entry key="mathml2-schema"/>
+<entry key="dsig-schema"/>
+<entry key="path1"/>
+<entry key="filter"/>
+</properties>
+
diff --git a/trunk/validator/src/main/resources/schema/odf1_2.properties b/trunk/validator/src/main/resources/schema/odf1_2.properties
new file mode 100644
index 0000000..b633f6d
--- /dev/null
+++ b/trunk/validator/src/main/resources/schema/odf1_2.properties
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<properties>
+<entry key="manifest-schema">/schema/odf1.2/OpenDocument-v1.2-os-manifest-schema.rng</entry>
+<entry key="strict-schema"></entry>
+<entry key="schema">/schema/odf1.2/OpenDocument-v1.2-os-schema.rng</entry>
+<entry key="mathml-schema"></entry>
+<entry key="mathml2-schema">/schema/mathml2.0/mathml2.xsd</entry>
+<entry key="dsig-schema">/schema/odf1.2/OpenDocument-v1.2-os-dsig-schema.rng</entry>
+<entry key="path1"/>
+<entry key="filter"/>
+</properties>
+
diff --git a/trunk/validator/src/main/webapp/META-INF/context.xml b/trunk/validator/src/main/webapp/META-INF/context.xml
new file mode 100644
index 0000000..b98d3a1
--- /dev/null
+++ b/trunk/validator/src/main/webapp/META-INF/context.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<Context antiJARLocking="true" path="/odfvalidator"/>
diff --git a/trunk/validator/src/main/webapp/WEB-INF/web.xml b/trunk/validator/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..ba5db32
--- /dev/null
+++ b/trunk/validator/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+	<!-- display name -->
+	<display-name>ODF Validator Application</display-name>	
+	<!-- some needed application values, change if needed -->
+    <context-param>
+		<!-- application title, shown in the header of the application -->
+        <param-name>APPLICATION_TITLE</param-name>
+        <param-value>ODF Validator 1.2</param-value>
+    </context-param>
+    <context-param>
+		<!-- name for setting-storing, used in the settings database -->
+        <param-name>PROPERTY_APPLICATION_NAME</param-name>
+        <param-value>odfvalidator</param-value>
+    </context-param>
+    <context-param>
+		<!-- email of the developer, used when exceptions are thrown. Get them by email, like a stacktrace -->
+        <param-name>DEVELOPER_EMAIL</param-name>
+        <param-value>odf-dev AT incubator.apache.org</param-value>
+    </context-param>
+    <context-param>
+		<!-- email of the application owner, shown in the top right corner for the user -->
+        <param-name>CONTACT_EMAIL</param-name>
+        <param-value>odf-dev AT incubator.apache.org</param-value>
+    </context-param>
+    <context-param>
+		<!-- the icon of the donator of this service, used in the footer  -->
+        <param-name>SUPPORTER_ICON_URL</param-name>
+        <param-value>http://opendocsociety.org/organisation/logo/png/opendocsociety_logo_normal_color-on-trans-200x42/;download</param-value>
+    </context-param>    
+    <context-param>
+		<!-- the site of the donator of this service, used in the footer on the their icon -->
+        <param-name>SUPPORTER_URL</param-name>
+        <param-value>http://www.opendocsociety.org/</param-value>
+    </context-param>        
+    <context-param>
+		<!-- the name of the donator of this service, used as tool tip on their icon -->
+        <param-name>SUPPORTER_TITLE</param-name>
+        <param-value>OpenDoc Society</param-value>
+    </context-param>    
+    <context-param>
+		<!-- the favicon of the donator of this service, used as icon on browser tab and left of URL -->
+        <param-name>SUPPORTER_FAVICON_URL</param-name>
+        <param-value>http://www.opendocsociety.org/favicon/;download</param-value>
+    </context-param>            
+	<servlet>
+	  <servlet-name>InfoPage</servlet-name>
+	  <jsp-file>/jsp/info/index.jsp</jsp-file>
+	</servlet>
+	<servlet-mapping>
+	  <servlet-name>InfoPage</servlet-name>
+	  <url-pattern>/info.html</url-pattern>
+	</servlet-mapping>	
+	<!-- welcome file list -->
+    <welcome-file-list>        
+        <welcome-file>/jsp/index.jsp</welcome-file>
+    </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/trunk/validator/src/main/webapp/jsp/common/footer.jsp b/trunk/validator/src/main/webapp/jsp/common/footer.jsp
new file mode 100644
index 0000000..5ed5965
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/common/footer.jsp
@@ -0,0 +1,42 @@
+<%--
+  Licensed to the Apache 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.
+--%>
+<jsp:directive.page contentType="text/html" />
+<%
+	String _supporterTitle = getServletContext().getInitParameter( "SUPPORTER_TITLE" );
+	if ( null == _supporterTitle ) {
+		_supporterTitle = "OpenDoc Society";
+	}
+	String _supporterURL = getServletContext().getInitParameter( "SUPPORTER_URL" );
+	if ( null == _supporterURL) {
+		_supporterURL = "http://opendocsociety.org/";
+	}
+	String _supporterIconURL = getServletContext().getInitParameter( "SUPPORTER_ICON_URL" );
+	if ( null == _supporterIconURL ) {
+		_supporterIconURL = "http://opendocsociety.org/organisation/logo/png/opendocsociety_logo_normal_color-on-trans-200x42/;download";
+	}
+%>
+<div id="footer">
+	<div id="supporter-logo" style="float:left">
+		<p><a href="<% out.println( _supporterURL ); %>">
+				<img title="Sponsored by <% out.println( _supporterTitle ); %>" alt="<% out.println( _supporterTitle ); %>" src="<% out.println( _supporterIconURL ); %> " />
+			</a></p>
+	</div>
+	<div id="smallprint">
+		<p style="text-align:left">This service does not cover all conformance criteria of the OpenDocument Format specification. It is not applicable for formal validation proof. Problems reported by this service only indicate that a document may not conform to the specification. It must not be concluded from errors that are reported that the document does not conform to the specification without further investigation of the error report, and it must not be concluded from the absence of error reports that the OpenDocument Format document conforms to the OpenDocument Format specification.
+			By any use of this Website, you agree to be bound by these <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Policies and Terms of Use</a>.</p>
+	</div>
+</div>
diff --git a/trunk/validator/src/main/webapp/jsp/common/header.jsp b/trunk/validator/src/main/webapp/jsp/common/header.jsp
new file mode 100644
index 0000000..151d49e
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/common/header.jsp
@@ -0,0 +1,164 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+	  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<jsp:directive.page contentType="text/html" />
+<%
+	String appName = getServletContext().getInitParameter( "APPLICATION_TITLE" );
+	if ( null == appName ) {
+		appName = "ODFToolkit";
+	}
+	String favIconURL = getServletContext().getInitParameter( "SUPPORTER_FAVICON_URL" );
+	if ( null == favIconURL ) {
+		favIconURL = "http://www.opendocsociety.org/favicon/;download";
+	}
+%>
+<head>
+	<title><% out.println( appName ); %></title>
+	<meta http-equiv="content-type" content="text/html; charset=windows-1252" />
+	<meta name="keywords" content="OpenDocument ODF Validator ODFToolkit ODFValidator"/>
+	<meta name="description" content="ODFToolkit"/>
+	<!-- Icon -->
+	<link type="image/x-icon" href="<% out.println( favIconURL ); %>" rel="shortcut icon"/>
+	<style type="text/css" media="screen, projection"><!--
+		div#footer {
+			font-family: Verdana, Arial, Helvetica, sans-serif;
+			font-size: x-small;
+		}
+		#footer {
+			margin: 1em 12px 1.5em 10px;
+			padding-top: 1em;
+		}
+		#footer a:link, #footer a:visited {
+			color: #0033CC;
+			text-decoration: underline;
+		}
+		#footer a:hover, #footer a:active {
+			color: #698ed1;
+			text-decoration: none;
+		}
+		img {
+			border: none;
+		}
+
+		#footer {
+			float: left;
+			display: block;
+			margin: 0px;
+			padding: 0px;
+			width: 100%;
+			margin-top: -1px;
+			color: #777;
+			border-top: solid 1px #ddd;
+			background-image: none;
+		}
+		#footer .horizontalmenu {
+			padding-top: 10px;
+			font-size: 1.2em;
+		}
+		#footer li {
+			display: inline;
+			/* spacing between the links */
+			padding: 0em 1em;
+		}
+		#sponsor {
+			float: left;
+			margin:.5em;
+			margin-bottom: 20px;
+		}
+		#logo div img { float: left; padding: 0px 0 40px 15px; }
+
+		p.selection {
+			font-weight: bold;
+		}
+
+		div.validationResult {
+			line-height: 150%; font-size: 1.2em; font-family: Arial, helvetica, sans-serif;
+		}
+
+		p.valid {
+			background-color: lime;font-size: 2em; padding: 0.5cm;font-weight: bold;
+		}
+
+		p.invalid {
+			background-color: red;font-size: 2em; padding: 0.5cm;font-weight: bold;
+		}
+
+		span.info {
+			font-size: 1.1em;
+		}
+
+		span.info > span.messageType, span.info > span.filePath {
+
+		}	
+
+		span.warning > span.messageType, span.warning > span.filePath {
+			background-color: #ffA500;
+		}
+
+		span.error > span.messageType, span.fatalError > span.messageType, span.error > span.filePath, span.fatalError > span.filePath {
+			background-color: red;
+		}		
+
+		span.messageType {
+			font-weight: bold;
+		}	
+
+		p.selection {
+			font-weight: bold;
+		}
+
+
+		#footer p {
+			margin-top: 1px;
+			color: #555;
+		}
+
+		select {
+			width: 8.3cm;
+		}
+
+		h1 {
+			font-size: 2em;
+		}
+
+		h3 {
+			font-size: 1.6em;
+		}
+
+		h1, h2 {
+			border-bottom-width: 1px;
+			border-bottom-style: solid;
+			border-bottom-color: rgb(170,170,170);
+			font-weight: normal;
+		}
+
+		h1, h2, h3, h4, h5, h6 {
+			margin-bottom: 0.6em;
+			padding-bottom: 0.2em;
+			padding-top: 0.6em;
+			font-family: Arial, helvetica, sans-serif;
+		}
+		.contentpart {
+			font-family: Arial, helvetica, sans-serif;
+			line-height: 1.2em;
+			margin-top: 0.4em;
+			margin-bottom: 0.6em;
+			font-size: 0.8em;
+		}
+
+		-->
+	</style>
+</head>
diff --git a/trunk/validator/src/main/webapp/jsp/common/supporter.jsp b/trunk/validator/src/main/webapp/jsp/common/supporter.jsp
new file mode 100644
index 0000000..66e6816
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/common/supporter.jsp
@@ -0,0 +1,29 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+	  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<%
+	String supporterTitle = getServletContext().getInitParameter( "SUPPORTER_TITLE" );
+	if ( null == supporterTitle ) {
+		supporterTitle = "OpenDoc Society";
+	}
+	String supporterURL = getServletContext().getInitParameter( "SUPPORTER_URL" );
+	if ( null == supporterURL) {
+		supporterURL = "http://opendocsociety.org/";
+	}
+%>
+<p style="float:left; font-weight:bold;">This service is provided to you by <a href="<% out.println( supporterURL ); %>"><% out.println( supporterTitle ); %></a></p>
+
+
diff --git a/trunk/validator/src/main/webapp/jsp/index.jsp b/trunk/validator/src/main/webapp/jsp/index.jsp
new file mode 100644
index 0000000..6ff4c88
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/index.jsp
@@ -0,0 +1,31 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+	  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<%@page language="Java" %>
+<%@page contentType="text/html" %>
+<!DOCTYPE html SYSTEM 'about:legacy-compat'>
+<html>
+	<jsp:include page="common/header.jsp"/>
+	<body>	
+		<div class="contentpart" id="spotlight">
+			<div style="margin: 15px">
+				<jsp:include page="validate.jsp"/>
+				<jsp:include page="common/supporter.jsp"/>
+			</div>
+		</div>
+		<jsp:include page="common/footer.jsp"/>
+	</body>
+</html>
diff --git a/trunk/validator/src/main/webapp/jsp/info/index.jsp b/trunk/validator/src/main/webapp/jsp/info/index.jsp
new file mode 100644
index 0000000..b0db5fd
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/info/index.jsp
@@ -0,0 +1,31 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+	  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<%@page language="Java" %>
+<%@page contentType="text/html" %>
+<!DOCTYPE html SYSTEM 'about:legacy-compat'>
+<html>
+	<jsp:directive.include file="../common/header.jsp" />
+	<body>
+		<div class="contentpart" id="spotlight">
+			<div style="margin: 15px">
+				<jsp:directive.include file="info.jsp"/>
+				<jsp:directive.include file="../common/supporter.jsp"/>
+			</div>
+		</div>
+		<jsp:directive.include file="../common/footer.jsp"/>
+	</body>
+</html>
diff --git a/trunk/validator/src/main/webapp/jsp/info/info.jsp b/trunk/validator/src/main/webapp/jsp/info/info.jsp
new file mode 100644
index 0000000..3a7cb6f
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/info/info.jsp
@@ -0,0 +1,94 @@
+<%--
+  Licensed to the Apache 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.
+--%>
+<h1>The ODF Validator</h1>
+<p><br /></p>
+<h2>Options</h2>
+<h3 id="mode">ODF Version</h3>
+<ul>
+	<li><p><span style="font-weight:bold;">autodetect  </span>: Detects the ODF version of the root document from the given ODF package. ODF documents with version 1.2 will be validated against conformance, version 1.0/1.1 against none strict. 
+			In all other choices the document is validated with respect to the selected OpenDocument version regardless of the version information that is included in the file</p></li>
+	<li><p><span style="font-weight:bold;">conformant  </span>: Checks the basic requirements conforming OpenDocument documents must meet.
+			This modes considers the version of the checked documents. This means that for OpenDocument v1.2 documents (or if OpenDocument v1.2 has been selected) the
+			conformance definitions of the OpenDocument v1.2 specification are taken as basis, while those of the OpenDocument v1.1/v1.0 specification are taken as basis
+			for OpenDocument v1.1/v1.0 documents. Please note that not all provisions for conforming documents are checked.</p></li>
+	<li><p><span style="font-weight:bold;">extended conformance test</span>: For OpenDocument v1.2 documents (or if OpenDocument v1.2 has been selected), the basic requirements of extended conforming ODF documents are checked.
+			For OpenDocument v1.0/v1.1 documents (or if OpenDocument v1.0/v1.1 has been selected) this mode equals the <span style="font-weight:bold;">conformance test</span> mode.</p></li>
+	<li><p><span style="font-weight:bold;">validation</span>: For OpenDocument v1.1/v1.0 documents (or if OpenDocument v1.1/v1.0 has been selected) the selected document is validated in regard of the OpenDocument v1.1/v1.0 schema.
+			For OpenDocument v1.2 documents (or if OpenDocument v1.2 has been selected) this mode equals the <span style="font-weight:bold;">conformance test</span> mode.</p></li>
+	<li><p><span style="font-weight:bold;">strict validation</span>: For OpenDocument v1.1/v1.0 documents (or if OpenDocument v1.1/v1.0 has been selected) the selected document is validated in regard of the strict OpenDocument v1.1/v1.0 schema.
+			For OpenDocument v1.2 documents (or if OpenDocument v1.2 has been selected) this mode equals the <span style="font-weight:bold;">conformance test</span> mode.</p></li>
+</ul>
+<p>For OpenDocument v1.1/v1.0 documents, the <span style="font-weight:bold;">validation</span> and <span style="font-weight:bold;">strict validation</span> tests are more restrictive than a conformance test. Please note that this means that errors may be reported for documents that are actually conforming to the ODF specification.</p>
+<p>The <span style="font-weight:bold;">strict validation test</span> is recommended for developers that want to make sure that an OpenDocument v1.0/v1.1 document does not only validate in regards to the ODF schema, but also does not use any extensions. The recommended mode
+	for OpenDocument v1.2 documents is <span style="font-weight:bold;">conformance test</span>.</p>
+<p>The following items are checked by the validation service:</p>
+<ul>
+	<li><p>OpenDocument v1.2 documents</p>
+		<ul>
+			<li><p>If the test type is <span style="font-weight:bold;">conformance test</span>, and if the file is not a formula file, then the sub files <i>content.xml</i>, <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are  validated with respect to the OpenDocument v1.2 schema.</p></li>
+			<li><p>If the test type is <span style="font-weight:bold;">extended conformance test</span>, and if the file is not a formula file, then the sub files <i>content.xml</i>, <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are pre-processed as described in section 1.4.2.1 of the OpenDocument v1.2 specification (that is <i>foreign elements and attributes</i> are removed), and are then validated with respect to the OpenDocument v1.2 schema.</p></li>
+		</ul>
+	</li>
+	<li><p>OpenDocument v1.1/1.0 documents</p>
+		<ul>
+			<li><p>If the test type is <span style="font-weight:bold;">conformance test</span>, and if the file is not a formula file, then the sub files <i>content.xml</i>, <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are pre-processed as described in section 1.5 of the <a href="http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.odt">OpenDocument specification</a> (that is <i>foreign elements and attributes</i> are removed), and are then validated with respect to the schema of the selected OpenDocument version.</p></li>
+			<li><p>If the test type is <span style="font-weight:bold;">validation</span>, and if the file is not a formula file, then the sub files <i>content.xml</i>, <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are validated with respect to the schema of the selected OpenDocument version. Pre-processing of <i>foreign elements and attributes</i> is not applied.</p></li>
+			<li><p>If the test type is <span style="font-weight:bold;">strict validation</span>, and if the file is not a formula file, then the sub files <i>content.xml</i>, <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are validated with respect to the strict schema of the selected OpenDocument version. Pre-processing of <i>foreign elements and attributes</i> is not applied.</p></li>
+		</ul>
+	</li>
+	<li><p>All versions</p>
+		<ul>
+			<li><p>If the file is a formula file, then the sub file <i>content.xml</i> is validated with respect to the MathML 2.0 W3C XSD schema.  The sub files <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are checked as described for other document types.</p></li>
+			<li><p>The file <i>META-INF/manifest.xml</i> is validated with respect to the manifest schema of the selected ODF specification.</p></li>
+			<li><p>If the file is an ODF 1.2 file, then the <i>META-INF/documentsignatures.xml</i> and <i>META-INF/macrosignatures.xml</i> sub files are validated with respect to the digital signatures schema of the ODF 1.2 specification.</p></li>
+			<li><p>For all embedded objects in ODF format, the <i>content.xml</i>, <i>styles.xml</i>, <i>meta.xml</i> and <i>settings.xml</i> are validated as described for the main document above</p></li>
+			<li><p>It is checked whether the file itself ans all embedded objects in ODF format contain at least a <i>content.xml</i> or <i>styles.xml</i> sub file.</p></li>
+		</ul>
+	</li>
+</ul>
+<h3 id="logging">Logging</h3>
+<ul>
+	<li><span style="font-weight:bold;">verbose  </span>: Gives out all kind of messages.</li>
+	<li><span style="font-weight:bold;">only warnings and errors</span>: Logs all error and warning without info messages.</li>
+	<li><span style="font-weight:bold;">only errors</span>: Logs only error messages.</li>
+</ul>
+<h2 id="details">Implementation Details</h2>
+<p>This services is based on the <a href="http://incubator.apache.org/odftoolkit/conformance/ODFValidator.html">Apache ODF Validator</a> and Sun's <a href="https://msv.dev.java.net/">Multi-Schema XML Validator (MSV)</a> is used for all validation tasks.
+<p>The following actions take place before or during the validation:</p>
+<ul>
+	<li><p>A DTD document declaration within a <i>manifest.xml</i> file is ignored. For the logging level <span style="font-weight:bold;">verbose</span>, an information is displayed if this happens<br/><br/>
+			<span style="font-weight:bold;">Note:</span> Very early ODF implementations in OpenOffice.org wrongly included a document type declaration. Ignoring the document type enables the validation of the manifest despite of this error.
+		</p></li>
+	<li><p>A namespace &quot;http://openoffice.org/2001/manifest&quot; within a <i>manifest.xml</i> file is changed to &quot;urn:oasis:names:tc:opendocument:xmlns:manifest:1.0&quot;. For the logging level <span style="font-weight:bold;">verbose</span>, an information is displayed if this happens.<br/><br/>
+			<span style="font-weight:bold;">Note:</span> Early ODF implementations in OpenOffice.org used the wrong namespace. Changing it to the correct one enables the validation of the manifest despite the wrong namespace.</p></li>
+	<li><p>Namespaces defined in the <a href="http://www.oasis-open.org/committees/download.php/10765/office-spec-1.0-cd-2.pdf">ODF v1.0 Committee Draft 2</a> are replaced with those of the <a href="http://www.oasis-open.org/specs/index.php#opendocumentv1.0">ODF v1.0 OASIS Standard</a>. For the logging level <span style="font-weight:bold;">verbose</span>, an information is displayed if this happens.<br/><br/>
+			<span style="font-weight:bold;">Note:</span> Changing the namespaces enables the validation of documents that conform to the ODF v1.0 CD2. Such documents have been saved by OpenOffice.org 1.0 beta versions.</p></li>
+	<li><p>The value of <i>draw:points</i> attributes is truncated to 2048 characters. For the logging level <span style="font-weight:bold;">verbose</span>, an information is displayed if this happens.<br/><br/>
+			<span style="font-weight:bold;">Note:</span> The truncation of this attribute value avoids a stack overflow in MSV while validating the attribute value against a regular expression.</p></li>
+	<li><p>A namespace &quot;http://openoffice.org/2004/database&quot; within a <i>content.xml</i> file is changed to &quot;urn:oasis:names:tc:opendocument:xmlns:database:1.0&quot;, and a namespace &quot;http://openoffice.org/2004/office&quot; within a <i>content.xml</i> file is changed to &quot;urn:oasis:names:tc:opendocument:xmlns:office:1.0&quot;. For the logging level <span style="font-weight:bold;">verbose</span>, an information is displayed if this happens.<br><br>
+			<span style="font-weight:bold;">Note:</span> These namespaces were used in OpenOffice.org 2.x database documents, because database documents are included in OpenDocument since version 1.2 only. Changing them enables the validation of  OpenOffice.org 2.x database documents.</p></li>
+</ul>
+
+<p>The following schemas are being used:</p>
+<ul>
+	<li><p>MathML: The MathML2.0 Schema from <a href="http://www.w3.org/Math/XMLSchema/mathml2/mathml2.xsd">http://www.w3.org/Math/XMLSchema/mathml2/mathml2.xsd</a> is used for validation.<br/><br/>
+			<span style="font-weight:bold;">Note:</span> OpenOffice.org currently wrongly exports namespace prefixes for attributes. The validator reports this as an error.</p></li>
+	<li><p>OpenDocument <a href="http://relaxng.org/">RELAX NG</a> Schemas: The schemas used are those available on the <a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=office#technical">OASIS OpenDocument Technical Committee web page</a><!--, except that <q>&lt;ref name=&quot;string&quot;&gt;</q> is replaced with <q>&lt;text/&gt;</q> when it defines the content model of an element. Reason is that the former leads to (wrong) validation errors within <a href="https://msv.dev.java.net/">MSV</a>-->.</p></li>
+</ul>
+
+<p><br /><input type="button" value="Back" onClick="history.go(-1)" /><br /><br /></p>
+
diff --git a/trunk/validator/src/main/webapp/jsp/validate.jsp b/trunk/validator/src/main/webapp/jsp/validate.jsp
new file mode 100644
index 0000000..f9ce124
--- /dev/null
+++ b/trunk/validator/src/main/webapp/jsp/validate.jsp
@@ -0,0 +1,183 @@
+<%--
+  Licensed to the Apache 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.
+--%>
+<%@ page import="
+		 java.io.UnsupportedEncodingException,
+		 java.io.PrintStream,
+		 java.io.InputStream,
+		 java.io.ByteArrayOutputStream,
+		 java.io.File,
+		 org.apache.commons.fileupload.servlet.ServletFileUpload,
+		 org.apache.commons.fileupload.FileItemIterator,
+		 org.apache.commons.fileupload.FileItemStream,
+		 org.apache.commons.fileupload.util.Streams,
+		 org.odftoolkit.odfvalidator.ODFValidator,
+		 org.odftoolkit.odfvalidator.Logger,
+		 org.odftoolkit.odfvalidator.Configuration,
+		 org.odftoolkit.odfvalidator.OdfValidatorMode,
+		 org.odftoolkit.odfvalidator.ValidationMessageCollectorErrorFilter,
+		 org.odftoolkit.odfvalidator.OdfVersion" %>
+
+<%
+int loggingSelection = 0;
+int modeSelection = 0;
+if(ServletFileUpload.isMultipartContent(request)) {
+%><h1>ODF Validator Result Page</h1><%
+	ServletFileUpload upload = new ServletFileUpload();
+	FileItemIterator iter = upload.getItemIterator(request);
+	ODFValidator validator = null;
+	boolean result = false;
+	while (iter.hasNext()) {
+		FileItemStream item = iter.next();
+		InputStream stream = item.openStream();
+		/* The file item contains a simple name-value pair of a form field */
+		if(item.isFormField()) {
+			if("loggingSelection".equals(item.getFieldName())) {
+				loggingSelection = Integer.parseInt(Streams.asString(stream));
+			} else if("modeSelection".equals(item.getFieldName())) {
+				modeSelection = Integer.parseInt(Streams.asString(stream));
+			}
+		} else {
+			/* The file item contains an uploaded file */
+			if((stream != null) && (item.getName() != null) && (!item.getName().equals(""))) {
+				Logger.LogLevel aLogLevel = null;
+				switch (loggingSelection) {
+					case 2:
+						aLogLevel = Logger.LogLevel.ERROR;
+						break;
+					case 1:
+						aLogLevel = Logger.LogLevel.WARNING;
+						break;
+					default:
+						aLogLevel = Logger.LogLevel.INFO;
+						break;
+				}
+				OdfVersion aOdfVersion = null;
+				OdfValidatorMode odfValidatorMode = null;
+				switch (modeSelection) {
+					case 6:
+						aOdfVersion = OdfVersion.V1_0;
+						odfValidatorMode = OdfValidatorMode.VALIDATE;
+						break;
+					case 4:
+						aOdfVersion = OdfVersion.V1_1;
+						odfValidatorMode = OdfValidatorMode.VALIDATE;
+						break;
+					case 5:
+						aOdfVersion = OdfVersion.V1_0;
+						odfValidatorMode = OdfValidatorMode.VALIDATE_STRICT;
+						break;
+					case 3:
+						aOdfVersion = OdfVersion.V1_1;
+						odfValidatorMode = OdfValidatorMode.VALIDATE_STRICT;
+						break;
+					case 2:
+						odfValidatorMode = OdfValidatorMode.EXTENDED_CONFORMANCE;
+						aOdfVersion = OdfVersion.V1_2;
+						break;
+					case 1:
+						aOdfVersion = OdfVersion.V1_2;
+					default:
+						odfValidatorMode = OdfValidatorMode.CONFORMANCE;
+						break;
+				}				
+				validator = new ODFValidator(null, aLogLevel, true, aOdfVersion, true);				
+				ByteArrayOutputStream bout = null;
+				if(validator != null) {
+					out.println("<h2>Result for " + item.getName() + "</h2>");
+					bout = new ByteArrayOutputStream();
+					PrintStream pout = new PrintStream(bout, true, "UTF-8");
+					ValidationMessageCollectorErrorFilter filter = new ValidationMessageCollectorErrorFilter();
+					try {
+						result = !validator.validateStream(pout, stream, item.getName() , odfValidatorMode, filter);
+					} catch (Exception e) {
+						e.printStackTrace(pout);
+						result = false;
+					}
+				}				
+				if(result) {
+					out.println("<p class='valid'>The document is " + odfValidatorMode.toString()+ " ODF" + validator.getOdfVersion() + "!");
+				} else {
+					out.println("<p class='invalid'>The document is NOT " + odfValidatorMode.toString()+ " ODF" + validator.getOdfVersion() + "!");
+				}
+				String s = null;
+				try {
+					s = new String(bout.toByteArray(), "UTF-8");
+					s = s.replaceAll("&", "&amp;");
+					s = s.replaceAll("<", "&lt;");
+					s = s.replaceAll(">", "&gt;");
+					s = s.replaceAll("&lt;span class='info'&gt;", "<span class='info'>");
+					s = s.replaceAll("&lt;span class='warning'&gt;", "<span class='warning'>");
+					s = s.replaceAll("&lt;span class='error'&gt;", "<span class='error'>");
+					s = s.replaceAll("&lt;span class='fatalError'&gt;", "<span class='fatalError'>");
+					s = s.replaceAll("&lt;span class='filePath'&gt;", "<span class='filePath'>");
+					s = s.replaceAll("&lt;span class='messageType'&gt;", "<span class='messageType'>");					
+					s = s.replaceAll("&lt;/span&gt;&lt;/br&gt;", "</span></br>");				
+					s = s.replaceAll("&lt;/span&gt;", "</span>");
+				} catch (UnsupportedEncodingException use) {
+					out.println(use);
+				}
+				if(s != null && (s.length() > 0)) {					
+					out.println("</p><h3>Details:<br/></h3><div class='validationResult'>" + s + "</div>");
+				} else {
+					out.println("</p>");
+				}
+			}
+		}
+	}
+%><p><br/><input type="button" value="Back" onClick="history.go(-1)" /></p><%
+} else {
+	%><h1>ODF Validator</h1><p>This service checks conformance of ODF documents based on their OpenDocument Format specification. It does not cover all conformance criteria, yet (see <a href="info.html#details">implementation details</a>).</p>
+<form id="validationForm" action="<% out.println(request.getRequestURI()); %>" enctype="multipart/form-data" method="post">
+	<p class="selection"><a href="info.html">ODF Version</a>:<br/>
+		<select name="modeSelection" size="1" onChange="javascript: return setconfig();">
+			<option value="0" selected="">auto-detect</option>
+			<option value="1">OASIS ODF 1.2 (conforming)</option>
+			<option value="2">OASIS ODF 1.2 (extended conforming)</option>
+			<option value="3">OASIS ODF 1.1 (strict)</option>
+			<option value="4">OASIS ODF 1.1</option>
+			<option value="5">OASIS ODF 1.0 - ISO/IEC 26300 (strict)</option>
+			<option value="6">OASIS ODF 1.0 - ISO/IEC 26300</option>
+		</select>
+		<br/>
+	</p>
+	<p class="selection"><a href="info.html#logging">Logging</a>:
+		<br/><select name="loggingSelection" size="1">
+			<option value="0" selected="">verbose</option>
+			<option value="1">only warnings and errors</option>
+			<option value="2">only errors</option>
+		</select>
+		<br/>
+		<br/>
+		Choose ODF documents for validation:		
+		<br/>
+		<!-- HTML 5 Draft 20110914 does not allow maxlength attribute at input element:
+			maxlength="100000" -->
+		<input name="File" multiple="multiple" type="file" />
+		<br/>
+		<br/>
+		<br/>
+		<!-- HTML 5 Draft 20110914 does not allow alt attribute at input element:
+			alt="Press button to upload your documents and get them validated." -->
+		<input type="submit" value="Validate"  />
+		<!-- HTML 5 Draft 20110914 does not allow alt attribute at input element:
+			alt="To reset this formular press this button." -->		
+		<input type="reset"  value="Reset"  />
+	</p>
+</form>
+<%
+}
+%>
diff --git a/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/InvalidPackageTest.java b/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/InvalidPackageTest.java
new file mode 100644
index 0000000..a27a669
--- /dev/null
+++ b/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/InvalidPackageTest.java
@@ -0,0 +1,110 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+package org.odftoolkit.odfvalidator;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+/** Test some invalid packages.
+ */
+public class InvalidPackageTest extends OdfValidatorTestBase {
+
+	@Test
+	public void validatePackage1() {
+		String output = "";
+		try {
+			String name = "testInvalidPkg1.odt";
+			output = doValidation(name, null);
+		} catch (Throwable t) {
+			t.printStackTrace();
+			Assert.fail(t.toString());
+		}
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/mimetype:  Error: The file 'mimetype' is not the first file in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/mimetype:  Error: The file 'mimetype' shall not be compressed"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/mimetype:  Error: There shall be no extra field for the 'mimetype' file"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/META-INF/manifest.xml:  Error: The file 'Configurations2/accelerator/current.xml' shall not be listed in the 'META-INF/manifest.xml' file as it does not exist in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt:  Info: 7 errors, 10 warnings"));
+	}
+
+	@Test
+	public void validatePackage1_V1_1() {
+		String output = "";
+		try {
+			String name = "testInvalidPkg1.odt";
+			output = doValidation(name, OdfVersion.V1_1);
+		} catch (Throwable t) {
+			t.printStackTrace();
+			Assert.fail(t.toString());
+		}
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/mimetype:  Warning: The file 'mimetype' is not the first file in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/mimetype:  Error: The file 'mimetype' shall not be compressed"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/mimetype:  Error: There shall be no extra field for the 'mimetype' file"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt/META-INF/manifest.xml:  Error: The file 'Configurations2/accelerator/current.xml' shall not be listed in the 'META-INF/manifest.xml' file as it does not exist in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg1.odt:  Info: 10 errors, 11 warnings"));
+	}
+
+	@Test
+	public void validatePackage2() {
+		String output = "";
+		try {
+			String name = "testInvalidPkg2.odt";
+			output = doValidation(name, null);
+		} catch (Throwable t) {
+			t.printStackTrace();
+			Assert.fail(t.toString());
+		}
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt/mimetype:  Error: The ODF package 'testInvalidPkg2.odt' contains no 'mimetype' file"));
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt/META-INF/manifest.xml:  Error: The file 'Configurations2/accelerator/current.xml' shall not be listed in the 'META-INF/manifest.xml' file as it does not exist in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt/META-INF/manifest.xml:  Error: The file 'not_in_manifest' shall be listed in the 'META-INF/manifest.xml' file as it exists in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt:  Info: 5 errors, 10 warnings"));
+	}
+
+	@Test
+	public void validatePackage2_V1_1() {
+		String output = "";
+		try {
+			String name = "testInvalidPkg2.odt";
+			output = doValidation(name, OdfVersion.V1_1);
+		} catch (Throwable t) {
+			t.printStackTrace();
+			Assert.fail(t.toString());
+		}
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt/mimetype:  Warning: The ODF package 'testInvalidPkg2.odt' contains no 'mimetype' file"));
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt/META-INF/manifest.xml:  Error: The file 'Configurations2/accelerator/current.xml' shall not be listed in the 'META-INF/manifest.xml' file as it does not exist in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt/META-INF/manifest.xml:  Warning: The file 'not_in_manifest' shall be listed in the 'META-INF/manifest.xml' file as it exists in the ODF package"));
+		Assert.assertTrue(output.contains("testInvalidPkg2.odt:  Info: 7 errors, 12 warnings"));
+	}
+
+	@Test
+	public void validatePackage3() {
+		String output = "";
+		try {
+			String name = "testInvalidPkg3.odt";
+			output = doValidation(name, null);
+		} catch (Throwable t) {
+			t.printStackTrace();
+			Assert.fail(t.toString());
+		}
+		Assert.assertTrue(output.contains("Error: The ODF package 'testInvalidPkg3.odt' shall contain the 'META-INF/manifest.xml' file"));
+		Assert.assertTrue(output.contains("testInvalidPkg3.odt:  Info: 2 errors, no warnings"));
+	}
+}
diff --git a/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/OdfValidatorTestBase.java b/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/OdfValidatorTestBase.java
new file mode 100644
index 0000000..d16d4c1
--- /dev/null
+++ b/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/OdfValidatorTestBase.java
@@ -0,0 +1,62 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintStream;
+import org.junit.Ignore;
+
+@Ignore
+public class OdfValidatorTestBase {
+
+    public OdfValidatorTestBase() {
+    }
+
+    String doValidation(String aFileName, OdfVersion aVersion) throws Exception {
+        ODFValidator aValidator = new ODFValidator(null, Logger.LogLevel.INFO, aVersion, true);
+        ByteArrayOutputStream aOut = new ByteArrayOutputStream();
+        PrintStream aPOut = new PrintStream(aOut);
+        InputStream aIn = getClass().getClassLoader().getResourceAsStream(aFileName);
+        aValidator.validateStream(aPOut, aIn, aFileName, OdfValidatorMode.VALIDATE, null);
+        return aOut.toString();
+    }
+
+    String doValidation(String aFileName, OdfVersion aVersion, OdfValidatorMode odfValidatorMode) throws Exception {
+        return doValidation(aFileName, aVersion, odfValidatorMode, false);				
+	}		
+	
+    String doValidation(String aFileName, OdfVersion aVersion, OdfValidatorMode odfValidatorMode, boolean htmlOutput) throws Exception {
+        ODFValidator aValidator = new ODFValidator(null, Logger.LogLevel.INFO, htmlOutput, aVersion, true);
+        ByteArrayOutputStream aOut = new ByteArrayOutputStream();
+        PrintStream aPOut = new PrintStream(aOut);
+        InputStream aIn = getClass().getClassLoader().getResourceAsStream(aFileName);
+		ValidationMessageCollectorErrorFilter filter = new ValidationMessageCollectorErrorFilter();
+		try {
+			aValidator.validateStream(aPOut, aIn, aFileName, odfValidatorMode, filter);
+		} catch (Exception e) {
+			e.printStackTrace(aPOut);			
+		}
+        return aOut.toString();							
+	}				
+}
diff --git a/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java b/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java
new file mode 100644
index 0000000..dc89ee4
--- /dev/null
+++ b/trunk/validator/src/test/java/org/odftoolkit/odfvalidator/ValidTest.java
@@ -0,0 +1,88 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfvalidator;
+
+import junit.framework.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/** Test some invalid packages.
+ */
+public class ValidTest extends OdfValidatorTestBase {
+
+    @Test
+    public void validate1() {
+        String output = "";
+        try {
+            String name = "empty.odt";
+            output = doValidation(name, OdfVersion.V1_0, OdfValidatorMode.VALIDATE_STRICT, true);						
+        } catch (Throwable t) {
+            t.printStackTrace();
+            Assert.fail(t.toString());
+        }
+		if(output.contains("Exception")){
+			System.out.println("OUTPUT:" + output);
+			Assert.fail("An exception occured during validation!");
+		}
+        Assert.assertTrue(output.contains("<span "));
+    }
+	
+    @Test
+	@Ignore
+    public void validate2() {
+        String output = "";
+        try {
+            String name = "testValid1.odt";
+            output = doValidation(name, null);
+        } catch (Throwable t) {
+            t.printStackTrace();
+            Assert.fail(t.toString());
+        }
+		if(output.contains("Exception")){
+			System.out.println("OUTPUT:" + output);
+			Assert.fail("An exception occured during validation!");
+		}		
+        Assert.assertTrue(output.contains("testValid1.odt:Info:no errors, no warnings"));
+    }	
+
+   @Test
+   @Ignore
+    public void validate3() {
+        String output = "";
+        try {
+            String name = "empty.odt";
+            output = doValidation(name, OdfVersion.V1_0, OdfValidatorMode.VALIDATE_STRICT);				
+			output = doValidation(name, OdfVersion.V1_1, OdfValidatorMode.VALIDATE);
+			output = doValidation(name, OdfVersion.V1_2, null);			
+        } catch (Throwable t) {
+            t.printStackTrace();
+            Assert.fail(t.toString());
+        }
+		if(output.contains("Exception")){
+			System.out.println("OUTPUT:" + output);
+			Assert.fail("An exception occured during validation!");
+		}
+        //Assert.assertTrue(output.contains("dummy.odt:Info:no errors, no warnings"));
+    }	
+	
+}
diff --git a/trunk/validator/src/test/resources/config_template.properties b/trunk/validator/src/test/resources/config_template.properties
new file mode 100644
index 0000000..1766496
--- /dev/null
+++ b/trunk/validator/src/test/resources/config_template.properties
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<properties>
+<entry key="manifest-schema"/>
+<entry key="strict-schema"/>
+<entry key="schema"/>
+<entry key="mathml-schema"/>
+<entry key="mathml2-schema"/>
+<entry key="dsig-schema"/>
+<entry key="path1"/>
+<entry key="filter"/>
+</properties>
+
diff --git a/trunk/validator/src/test/resources/empty.odt b/trunk/validator/src/test/resources/empty.odt
new file mode 100644
index 0000000..c1b45ef
--- /dev/null
+++ b/trunk/validator/src/test/resources/empty.odt
Binary files differ
diff --git a/trunk/validator/src/test/resources/extract-schema.xsl b/trunk/validator/src/test/resources/extract-schema.xsl
new file mode 100644
index 0000000..4d02605
--- /dev/null
+++ b/trunk/validator/src/test/resources/extract-schema.xsl
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2011 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<!-- This stylesheet extracts the ODF schemas from the ODF v1.0 and v1.1 -->
+<!-- specification.                                                      -->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
+                xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+                xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0">
+    
+    <xsl:output method="text"/>
+    
+    <!-- Supported mode parameter values are: -->
+    <!-- 'schema': Extracts the schema -->
+    <!-- 'strict-schema': Extracts the strict schema defined in appendix A -->
+    <!-- 'manifest-schema': Extracts the manifest schema -->
+    <xsl:param name="mode" select="'schema'"/>
+       
+    <!-- map mode parameter to style names -->
+    <!-- which paragraph styles do we wish to extract? -->
+    <xsl:variable name="extract-style-name">
+        <xsl:choose>
+            <xsl:when test="$mode='strict-schema'">
+                <xsl:value-of select="'RelaxNG_20_Strict'"/>
+            </xsl:when>
+            <xsl:when test="$mode='manifest-schema'">
+                <xsl:value-of select="'RelaxNG_20_Manifest'"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="'RelaxNG'"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:variable>
+
+    <!-- define 'styles' key. It selects all style:style element with a certain name -->
+    <xsl:key name="styles"
+             match="style:style"
+             use="@style:name" />
+
+    <!-- Look only at paragraphs -->
+    <xsl:template match="office:document-content">
+        <xsl:apply-templates select="office:body/office:text//text:p"/>
+    </xsl:template>
+
+    <!-- Analyze paragraphs -->
+    <xsl:template match="text:p">
+        <!-- determine all parent styles of this paragraph; use key 'parents' -->
+        <xsl:variable name="content-style-names" select="@text:style-name|key('styles',@text:style-name)/@style:parent-style-name"/>
+        <xsl:variable name="styles-style-names">
+            <xsl:for-each select="document('styles.xml',.)">
+                <xsl:value-of select="key('styles',$content-style-names)/@style:parent-style-name"/>
+            </xsl:for-each>
+        </xsl:variable>
+
+        <!-- if schema parent style is found, generate output -->
+        <xsl:if test="$content-style-names = $extract-style-name or $styles-style-names = $extract-style-name">
+            <xsl:apply-templates mode="output"/>
+            <xsl:text>
+</xsl:text>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- default: don't output anything -->
+    <xsl:template match="node()|@*"/>
+
+    <!-- generate output: just copy all text -->
+    <xsl:template mode="output" match="*">
+        <xsl:apply-templates mode="output"/>
+    </xsl:template>
+        
+    <xsl:template mode="output" match="text()">
+        <xsl:copy/>
+    </xsl:template>
+    
+    <!-- white space handling: <text:s>, <text:tab> elements  -->
+    <xsl:template mode="output" match="text:tab">
+        <xsl:text>    </xsl:text>
+    </xsl:template>
+    
+    <xsl:template mode="output" match="text:s">
+        <xsl:call-template name="repeat">
+            <xsl:with-param name="count" select="@text:c"/>
+            <xsl:with-param name="string" select="' '"/>
+        </xsl:call-template>
+    </xsl:template>
+    
+    <xsl:template name="repeat">
+        <xsl:param name="count"/>
+        <xsl:param name="string"/>
+        <xsl:if test="$count > 0">
+            <xsl:value-of select="$string"/>
+            <xsl:call-template name="repeat">
+                <xsl:with-param name="count" select="$count - 1"/>
+                <xsl:with-param name="string" select="$string"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+    
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/trunk/validator/src/test/resources/filter.rng b/trunk/validator/src/test/resources/filter.rng
new file mode 100644
index 0000000..82ee930
--- /dev/null
+++ b/trunk/validator/src/test/resources/filter.rng
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<grammar
+    xmlns="http://relaxng.org/ns/structure/1.0"
+    xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
+
+    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+    
+    <start>
+        <ref name="filter"/>
+    </start>
+
+    <define name="filter">
+        <element name="filter">
+            <ref name="filter-attlist"/>
+            <oneOrMore>
+                <ref name="filter-entry"/>
+            </oneOrMore>
+        </element>
+    </define>
+    
+    <define name="filter-attlist" combine="interleave">
+        <empty/>
+    </define>
+    
+    <define name="filter-entry">
+        <element name="filter-entry">
+            <ref name="filter-entry-attlist"/>
+            <text/>
+        </element>
+    </define>
+
+    <define name="filter-entry-attlist" combine="interleave">
+        <attribute name="task-id">
+            <data type="string">
+                 <param name="pattern">[a-z]?[0-9]+"</param>
+            </data>
+        </attribute>
+    </define>
+
+    <define name="filter-entry-attlist" combine="interleave">
+        <optional>
+            <attribute name="resolved-in">
+                <data type="integer"/>
+            </attribute>
+        </optional>
+    </define>
+    
+</grammar>
\ No newline at end of file
diff --git a/trunk/validator/src/test/resources/testInvalidPkg1.odt b/trunk/validator/src/test/resources/testInvalidPkg1.odt
new file mode 100644
index 0000000..6b38c41
--- /dev/null
+++ b/trunk/validator/src/test/resources/testInvalidPkg1.odt
Binary files differ
diff --git a/trunk/validator/src/test/resources/testInvalidPkg2.odt b/trunk/validator/src/test/resources/testInvalidPkg2.odt
new file mode 100644
index 0000000..cc5ed33
--- /dev/null
+++ b/trunk/validator/src/test/resources/testInvalidPkg2.odt
Binary files differ
diff --git a/trunk/validator/src/test/resources/testInvalidPkg3.odt b/trunk/validator/src/test/resources/testInvalidPkg3.odt
new file mode 100644
index 0000000..f43e49b
--- /dev/null
+++ b/trunk/validator/src/test/resources/testInvalidPkg3.odt
Binary files differ
diff --git a/trunk/validator/src/test/resources/testValid1.odt b/trunk/validator/src/test/resources/testValid1.odt
new file mode 100644
index 0000000..ea84819
--- /dev/null
+++ b/trunk/validator/src/test/resources/testValid1.odt
Binary files differ
diff --git a/trunk/xslt-runner-task/LICENSE.txt b/trunk/xslt-runner-task/LICENSE.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/trunk/xslt-runner-task/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/trunk/xslt-runner-task/README.txt b/trunk/xslt-runner-task/README.txt
new file mode 100644
index 0000000..6332fbe
--- /dev/null
+++ b/trunk/xslt-runner-task/README.txt
@@ -0,0 +1,43 @@
+*************************************************************
+* ODFXSLTRunner                                             *
+*                                                           *
+*************************************************************
+*                                                           *
+* Version: 1.1.0                                     *
+* Release Date: xx/xx/2010                                  *
+*                                                           *
+*************************************************************
+
+
+About ODF XSLT Runner Task
+--------------------------
+
+ODF XSLT Runner Task is a task definition for Ant which allows to apply
+XSLT stylesheets to ODF documents similar to Ant's build-in <xslt> task.
+It is based on ODFXSLTRunner.
+
+Documentation
+--------------
+
+In general, the Wiki page is a great place to start when looking for online
+documentation and other information about ODFXSLTRunnerTask.
+    http://odftoolkit.org/projects/odftoolkit/pages/ODFXSLTRunnerTask.
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
+
+Installation
+-------------
+
+Just put the file odfxsltrunner.jar in your classpath.
+
+You will need ODFXSLTRunner and ODFDOM. Get them from
+    http://odftoolkit.org/projects/odftoolkit
+    http://odftoolkit.org/projects/odfdom
+
+You will further need Apache Xerces-J. Get it from
+    http://xml.apache.org/dist/xerces-j/
diff --git a/trunk/xslt-runner-task/ant.properties b/trunk/xslt-runner-task/ant.properties
new file mode 100644
index 0000000..3449cb0
--- /dev/null
+++ b/trunk/xslt-runner-task/ant.properties
@@ -0,0 +1,39 @@
+########################################################################
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+#
+# Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Use is subject to license terms.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy
+# of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+# obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+########################################################################/
+
+# The following properties have to be set either in this file, or in the
+# nbproject/private/private.properties file of the project.
+
+# location of the odfxsltrunner project (This property cannot be set in private properties.
+project.odfxsltrunner=../conformancetools~odf-xslt-runner-src
+
+# ODF2XHTML style sheet
+reference.odf2xhtml.xsl=
+
+# saxon.jar
+reference.saxon.jar=
+
+# xmllint executable
+exec.xmllint=
+
+# xmllint path extensions
+exec.xmllint.path=
diff --git a/trunk/xslt-runner-task/build-xref.xml b/trunk/xslt-runner-task/build-xref.xml
new file mode 100644
index 0000000..4aa9419
--- /dev/null
+++ b/trunk/xslt-runner-task/build-xref.xml
@@ -0,0 +1,513 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project name="odfxsltrunnertask-samples" default="default" basedir=".">
+    <description>Builds, tests, and runs the project odfxsltrunnertask.</description>
+    <import file="nbproject/build-impl.xml"/>
+
+    <property file="ant.properties" prefix="user"/>
+    <import file="${user.project.odfxsltrunner}/build-schemas.xml"/>
+
+    <target name="-post-init" depends="-init-schema-props"
+            description="Initialize schema properties">
+        <condition property="reference.odf2xhtml.xsl" value="${user.reference.odf2xhtml.xsl}">
+            <not>
+                <isset property="reference.odf2xhtml.xsl"/>
+            </not>
+        </condition>
+        <condition property="reference.saxon.jar" value="${user.reference.saxon.jar}">
+            <not>
+                <isset property="reference.saxon.jar"/>
+            </not>
+        </condition>
+        <condition property="exec.xmllint" value="${user.exec.xmllint}">
+            <not>
+                <isset property="exec.xmllint"/>
+            </not>
+        </condition>
+        <condition property="exec.xmllint.path" value="${user.exec.xmllint.path}">
+            <not>
+                <isset property="exec.xmllint.path"/>
+            </not>
+        </condition>
+    </target>
+
+    <target name="add-v12-all-parts-xref-product" depends="add-v12-part1-xref-product,add-v12-part2-xref-product,add-v12-part3-xref-product"
+            description="Add cross references to ODF 1.2 specification (all parts)."/>
+
+    <target name="add-v12-part0-xref-product" depends="init,jar"
+            description="Add cross references to ODF 1.2 part 0 specification.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part0.state.target}.odt"/>
+        <property name="part1.spec-target.noext" value="OpenDocument-v1.2${opendocument.v12.part1.target}"/>
+        <property name="part2.spec-target.noext" value="OpenDocument-v1.2${opendocument.v12.part2.target}"/>
+        <property name="part3.spec-target.noext" value="OpenDocument-v1.2${opendocument.v12.part3.target}"/>
+        <unzip src="${opendocument.v12.product.dir}/${part1.spec-target.noext}.odt" dest="${build.dir}/${part1.spec-target.noext}-odt">
+            <patternset>
+                <include name="content.xml"/>
+            </patternset>
+        </unzip>
+        <unzip src="${opendocument.v12.product.dir}/${part2.spec-target.noext}.odt" dest="${build.dir}/${part2.spec-target.noext}-odt">
+            <patternset>
+                <include name="content.xml"/>
+            </patternset>
+        </unzip>
+        <unzip src="${opendocument.v12.product.dir}/${part3.spec-target.noext}.odt" dest="${build.dir}/${part3.spec-target.noext}-odt">
+            <patternset>
+                <include name="content.xml"/>
+            </patternset>
+        </unzip>
+        <property name="part1-dir" location="${build.dir}/${part1.spec-target.noext}-odt"/>
+        <property name="part2-dir" location="${build.dir}/${part2.spec-target.noext}-odt"/>
+        <property name="part3-dir" location="${build.dir}/${part3.spec-target.noext}-odt"/>
+        <condition property="force">
+            <not>
+                <and>
+                    <uptodate srcfile="${part1-dir}/content.xml" targetfile="${target-file}"/>
+                    <uptodate srcfile="${part2-dir}/content.xml" targetfile="${target-file}"/>
+                    <uptodate srcfile="${part3-dir}/content.xml" targetfile="${target-file}"/>
+                </and>
+            </not>
+        </condition>
+
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/create-embedded-xref.xsl"
+                 in="${opendocument.v12.part0.spec-source}"
+                 out="${target-file}"
+                 force="${force}">
+            <param name="add-xrefs" expression="false"/>
+            <param name="keep-anchors" expression="false"/>
+            <param name="toc-hyperlink-mode" expression="adapt"/>
+            <param name="part1-content-path" expression="jar:file:${opendocument.v12.product.dir}/${part1.spec-target.noext}.odt!/content.xml"/>
+            <param name="part2-content-path" expression="jar:file:${opendocument.v12.product.dir}/${part2.spec-target.noext}.odt!/content.xml"/>
+            <param name="part3-content-path" expression="jar:file:${opendocument.v12.product.dir}/${part3.spec-target.noext}.odt!/content.xml"/>
+            <param name="part1-toc-rel-path" expression="${part1.spec-target.noext}.odt"/>
+            <param name="part2-toc-rel-path" expression="${part2.spec-target.noext}.odt"/>
+            <param name="part3-toc-rel-path" expression="${part3.spec-target.noext}.odt"/>
+        </odfxslt>
+    </target>
+
+    <target name="update-rel-paths v12-part0-xref-product" depends="init,jar"
+            description="Add cross references to ODF 1.2 part 0 specification.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part0.state.target}.odt"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/update-toc-rel-paths.xsl"
+                 in="${opendocument.v12.product.dir}/OpenDocument-v1.2${opendocument.v12.part0.state.target}-orig.odt"
+                 out="${target-file}">
+            <param name="state-new" expression="${opendocument.v12.part0.state.target}"/>
+        </odfxslt>
+    </target>
+
+    <target name="add-v12-part1-xref-editor-revision" depends="init,jar,-create-v12-xref-schema"
+            description="Add cross references to ODF 1.2 specification without removing anchors.">
+        <antcall target="-add-v12-part1-xref">
+            <param name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part1.target}-editor-revision.odt"/>
+            <param name="keep-anchors" value="true"/>
+        </antcall>
+    </target>
+
+    <target name="add-v12-part1-xref-product" depends="init,jar,-create-v12-xref-schema"
+            description="Add cross references to ODF 1.2 specification.">
+        <antcall target="-add-v12-part1-xref">
+            <param name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part1.target}.odt"/>
+            <param name="keep-anchors" value="false"/>
+        </antcall>
+    </target>
+
+    <target name="-add-v12-part1-xref" depends="init,jar,-create-v12-xref-schema"
+            description="Add cross references to ODF 1.2 specification.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="xref-schema-file" location="${build.dir}/schema/flat/${opendocument.v12.schema.xref}"/>
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${xref-schema-file}" targetfile="${target-file}"/>
+            </not>
+        </condition>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/create-embedded-xref.xsl"
+                 in="${opendocument.v12.part1.spec-source}"
+                 out="${target-file}"
+                 force="${force}">
+            <param name="xref-schema-file" expression="${xref-schema-file}"/>
+            <param name="add-xrefs" expression="true"/>
+            <param name="keep-anchors" expression="${keep-anchors}"/>
+        </odfxslt>
+    </target>
+
+    <target name="add-v12-part2-xref-product" depends="init,jar"
+            description="Add cross references to ODF 1.2 specification.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part2.target}.odt"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/create-embedded-xref.xsl"
+                 in="${opendocument.v12.part2.spec-source}"
+                 out="${target-file}"
+                 force="false">
+            <param name="add-xrefs" expression="true"/>
+            <param name="keep-anchors" expression="false"/>
+        </odfxslt>
+    </target>
+
+    <target name="add-v12-part3-xref-editor-revision" depends="init,jar,-create-v12-manifest-xref-schema"
+            description="Add cross references to ODF 1.2 specification without removing anchors.">
+        <antcall target="-add-v12-part3-xref">
+            <param name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part3.target}-editor-revision.odt"/>
+            <param name="keep-anchors" value="true"/>
+        </antcall>
+    </target>
+
+    <target name="add-v12-part3-xref-product" depends="init,jar,-create-v12-manifest-xref-schema"
+            description="Add cross references to ODF 1.2 specification.">
+        <antcall target="-add-v12-part3-xref">
+            <param name="target-file" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part3.target}.odt"/>
+            <param name="keep-anchors" value="false"/>
+        </antcall>
+    </target>
+
+    <target name="-add-v12-part3-xref" depends="init,jar,-create-v12-manifest-xref-schema"
+            description="Add cross references to ODF 1.2 specification.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="xref-schema-file" location="${build.dir}/schema/flat/${opendocument.v12.manifest-schema.xref}"/>
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${xref-schema-file}" targetfile="${target-file}"/>
+            </not>
+        </condition>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/create-embedded-xref.xsl"
+                 in="${opendocument.v12.part3.spec-source}"
+                 out="${target-file}"
+                 force="${force}">
+            <param name="xref-schema-file" expression="${xref-schema-file}"/>
+            <param name="add-xrefs" expression="true"/>
+            <param name="keep-anchors" expression="${keep-anchors}"/>
+        </odfxslt>
+    </target>
+
+    <target name="check-v12-part1-xref" depends="init,jar"
+            description="Check cross references in ODF 1.2 part 1.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="target-file-name" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part1.target}"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/check-xrefs.xsl"
+                 in="${target-file-name}.odt"
+                 outfile="${target-file-name}.log"
+                 force="false"/>
+    </target>
+
+    <target name="check-v12-part2-xref" depends="init,jar"
+            description="Check cross references to ODF 1.2 part 2.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="target-file-name" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part2.target}"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/check-xrefs.xsl"
+                 in="${target-file-name}.odt"
+                 outfile="${target-file-name}.log"
+                 force="false"/>
+    </target>
+
+    <target name="check-v12-part3-xref" depends="init,jar"
+            description="Chack cross references to ODF 1.2 part 3.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="target-file-name" value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part3.target}"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/check-xrefs.xsl"
+                 in="${target-file-name}.odt"
+                 outfile="${target-file-name}.log"
+                 force="false"/>
+    </target>
+
+    <target name="check-v12-part1-completeness" depends="init,-create-v12-xref-schema"
+            description="Check whether all elements and attributes of the ODF 1.2 schema appear in the ODF 1.2 part 1 specification document.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="xref-schema-file" location="${build.dir}/schema/flat/${opendocument.v12.schema.xref}"/>
+        <property name="check-log-file" location="${dist.dir}/OpenDocument-v1.2${opendocument.v12.part1.target}-check.log"/>
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${xref-schema-file}" targetfile="${check-log-file}"/>
+            </not>
+        </condition>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/check-completeness.xsl"
+            in="${opendocument.v12.part1.spec-source}"
+            outfile="${check-log-file}"
+            force="${force}">
+            <param name="xref-schema-file" expression="${xref-schema-file}"/>
+            <param name="attributes-heading-level" expression="1"/>
+        </odfxslt>
+    </target>
+
+    <target name="check-v12-part3-completeness" depends="init,-create-v12-manifest-xref-schema"
+            description="Check whether all elements and attributes of the ODF 1.2 schema appear in the ODF 1.2 part 1 specification document.">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="xref-schema-file" location="${build.dir}/schema/flat/${opendocument.v12.manifest-schema.xref}"/>
+        <property name="check-log-file" location="${dist.dir}/OpenDocument-v1.2${opendocument.v12.part3.target}-check.log"/>
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${xref-schema-file}" targetfile="${check-log-file}"/>
+            </not>
+        </condition>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/check-completeness.xsl"
+            in="${opendocument.v12.part3.spec-source}"
+            outfile="${check-log-file}"
+            force="${force}">
+            <param name="xref-schema-file" expression="${xref-schema-file}"/>
+            <param name="attributes-heading" expression="Manifest Attributes"/>
+            <param name="attributes-heading-level" expression="2"/>
+        </odfxslt>
+    </target>
+
+    <target name="create-v12-html-zip" depends="init"
+            description="Create XHTML versions of all ODF 1.2 parts and zip them.">
+		<antcall target="create-v12-part0-html"/>
+		<antcall target="create-v12-part1-html"/>
+		<antcall target="create-v12-part2-html"/>
+		<antcall target="create-v12-part3-html"/>
+        <zip destfile="${dist.dir}/OpenDocument-v1.2${opendocument.v12.part0.state.target}.html.zip">
+            <zipfileset dir="${dist.dir}/html${opendocument.v12.part0.state.target}"/>
+        </zip>
+    </target>
+
+
+    <target name="create-v12-part0-html" depends="-create-v12-part0-html-properties,-create-v12-html"
+            description="Create XHTML version of ODF 1.2 part 0 specification."/>
+
+    <target name="create-v12-part1-html" depends="-create-v12-part1-html-properties,-create-v12-html"
+            description="Create XHTML version of ODF 1.2 part 1 specification."/>
+
+    <target name="create-v12-part2-html" depends="-create-v12-part2-html-properties,-create-v12-html"
+            description="Create XHTML version of ODF 1.2 part 2 specification."/>
+
+    <target name="create-v12-part3-html" depends="-create-v12-part3-html-properties,-create-v12-html"
+            description="Create XHTML version of ODF 1.2 part 3 specification."/>
+
+    <target name="-create-v12-part0-html-properties" depends="init">
+        <property name="part" value=""/>
+        <property name="state.target" value="${opendocument.v12.part0.state.target}"/>
+        <property name="postprocess-style" value="${project.odfxsltrunner}/sample_xslt/adapt-html-hrefs.xsl"/>
+    </target>
+
+    <target name="-create-v12-part1-html-properties" depends="init">
+        <property name="part" value="-part1"/>
+        <property name="state.target" value="${opendocument.v12.part1.state.target}"/>
+        <property name="contains-math-objects" value="true"/>
+    </target>
+
+    <target name="-create-v12-part2-html-properties" depends="init">
+        <property name="part" value="-part2"/>
+        <property name="state.target" value="${opendocument.v12.part2.state.target}"/>
+        <property name="contains-math-objects" value="true"/>
+    </target>
+
+    <target name="-create-v12-part3-html-properties" depends="init">
+        <property name="part" value="-part3"/>
+        <property name="state.target" value="${opendocument.v12.part3.state.target}"/>
+    </target>
+
+    <target name="-create-v12-html" depends="-create-v12-nomath,-create-v12-html-transform,-create-v12-html-postprocess,-create-v12-html-copy-images"/>
+
+    <target name="-create-v12-html-transform" depends="init">
+        <condition property="html-source" value="${dist.dir}/nomath/OpenDocument-v1.2${state.target}${part}-nomath.odt" else="${opendocument.v12.product.dir}/OpenDocument-v1.2${state.target}${part}.odt">
+            <isset property="contains-math-objects"/>
+        </condition>
+        <condition property="html-target" value="${build.dir}/html${state.target}/OpenDocument-v1.2${state.target}${part}.html" else="${dist.dir}/html${state.target}/OpenDocument-v1.2${state.target}${part}.html">
+            <isset property="postprocess-style"/>
+        </condition>
+        <dirname property="reference.odf2xhtml.xsl.dir2" file="${reference.odf2xhtml.xsl}"/>
+        <dirname property="reference.odf2xhtml.xsl.dir" file="${reference.odf2xhtml.xsl.dir2}"/>
+        <condition property="force">
+            <not>
+                <uptodate targetfile="${html-target}">
+                    <srcfiles dir="${reference.odf2xhtml.xsl.dir}">
+                        <include name="**/*.xsl"/>
+                    </srcfiles>
+                </uptodate>
+            </not>
+        </condition>
+        <taskdef name="odfxslt-saxon" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}:${reference.saxon.jar}"/>
+        <odfxslt-saxon style="${reference.odf2xhtml.xsl}"
+                 in="${html-source}"
+                 outfile="${html-target}"
+                 force="${force}">
+                 <factory name="net.sf.saxon.TransformerFactoryImpl"/>
+        </odfxslt-saxon>
+    </target>
+
+    <target name="-create-v12-html-postprocess" depends="init" if="postprocess-style">
+        <xslt style="${postprocess-style}"
+                 in="${build.dir}/html${state.target}/OpenDocument-v1.2${state.target}${part}.html"
+                 out="${dist.dir}/html${state.target}/OpenDocument-v1.2${state.target}${part}.html"
+                 force="false">
+          <xmlcatalog>
+                <dtd
+                    publicId="-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
+                    location="${project.odfxsltrunner}/sample_xslt/dummy.dtd"/>
+           </xmlcatalog>
+        </xslt>
+    </target>
+
+    <target name="-create-v12-html-copy-images" depends="init">
+        <property name="html-image-list" value="${build.dir}/OpenDocument-v1.2${state.target}${part}-image-list.txt"/>
+        <xslt in="${dist.dir}/html${state.target}/OpenDocument-v1.2${state.target}${part}.html"
+             out="${html-image-list}"
+             style="${project.odfxsltrunner}/sample_xslt/create-html-img-list.xsl">
+            <xmlcatalog>
+                <dtd
+                    publicId="-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
+                    location="${project.odfxsltrunner}/sample_xslt/dummy.dtd"/>
+           </xmlcatalog>
+        </xslt>
+
+        <unzip src="${html-source}" dest="${dist.dir}/html${state.target}">
+            <patternset includesfile="${html-image-list}"/>
+        </unzip>
+    </target>
+
+
+    <target name="create-v12-part1-nomath" depends="-create-v12-part1-html-properties,-create-v12-nomath"
+            description="Create a version of ODF 1.2 part 1 specification that does not contain MathML."/>
+
+    <target name="create-v12-part2-nomath" depends="-create-v12-part2-html-properties,-create-v12-nomath"
+            description="Create a version of ODF 1.2 part 2 specification that does not contain MathML."/>
+
+
+    <target name="-create-v12-nomath" depends="jar,-create-v12-ooo-xhtml" if="contains-math-objects">
+        <property name="target-file" value="${dist.dir}/nomath/OpenDocument-v1.2${state.target}${part}-nomath.odt"/>
+        <property name="image-list" value="${build.dir}/OpenDocument-v1.2${state.target}${part}-replace-mathml-image-list.txt"/>
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${ooo-xhtml}" targetfile="${target-file}"/>
+            </not>
+        </condition>
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/replace-objects.xsl"
+                 in="${opendocument.v12.product.dir}/OpenDocument-v1.2${state.target}${part}.odt"
+                 out="${target-file}"
+                 force="${force}">
+            <param name="ref-html" expression="${ooo-xhtml}"/>
+        </odfxslt>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/replace-objects-list.xsl"
+                 in="${opendocument.v12.product.dir}/OpenDocument-v1.2${state.target}${part}.odt"
+                 outfile="${image-list}"
+                 force="${force}">
+            <param name="ref-html" expression="${ooo-xhtml}"/>
+        </odfxslt>
+        <zip destfile="${target-file}" compress="false" update="true">
+            <zipfileset dir="${ooo-html.dir}" includesfile="${image-list}" prefix="Pictures"/>
+        </zip>
+    </target>
+
+    <target name="-create-v12-ooo-xhtml" depends="-create-v12-ooo-xhtml-check" if="ooo-xhtml.notuptodate">
+        <!-- Create xhtml file from OOo HTML output file -->
+        <exec executable="${exec.xmllint}">
+            <env key="PATH" path="${exec.xmllint.path}"/>
+            <arg value="--html"/>
+            <arg value="--xmlout"/>
+            <arg value="--dropdtd"/>
+            <arg value="-o"/>
+            <arg value="${ooo-xhtml}"/>
+            <arg value="${ooo-html}"/>
+        </exec>
+    </target>
+
+    <target name="-create-v12-ooo-xhtml-check" depends="init" if="contains-math-objects">
+        <property name="ooo-html.dir" location="${opendocument.v12.product.dir}/ooo-html${state.target}"/>
+        <property name="ooo-html" value="${ooo-html.dir}/OpenDocument-v1.2${state.target}${part}.html"/>
+        <property name="ooo-xhtml" location="${build.dir}/OpenDocument-v1.2${state.target}${part}-ooo.html"/>
+        <condition property="ooo-html.exists">
+            <available file="${ooo-html}"/>
+        </condition>
+        <fail message="OOo HTML version ${ooo-html} does not exist" unless="ooo-html.exists"/>
+        <condition property="ooo-xhtml.notuptodate">
+            <and>
+                <isset property="ooo-html.exists"/>
+                <not>
+                    <uptodate srcfile="${ooo-html}" targetfile="${ooo-xhtml}"/>
+                </not>
+            </and>
+        </condition>
+    </target>
+
+
+
+    <target name="add-v12-part-default-values" depends="init,-create-v12-xref-schema"
+            description="Add default value definoitions to ODF 1.2 part 1">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <property name="xref-schema-file" location="${build.dir}/schema/flat/${opendocument.v12.schema.xref}"/>
+        <property name="target-file" value="${dist.dir}/default-values/OpenDocument-v1.2${opendocument.v12.part1.state.target}.odt"/>
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${xref-schema-file}" targetfile="${target-file}"/>
+            </not>
+        </condition>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/add-default-values.xsl"
+            in="${opendocument.v12.part1.spec-source}"
+            out="${target-file}"
+            force="${force}">
+            <param name="xref-schema-file" expression="${xref-schema-file}"/>
+        </odfxslt>
+    </target>
+
+    <target name="create-v12-attribute-xref-ods" depends="init,jar,-create-v12-dtype-schema"
+            description="Create a spreadsheet listing ODF 1.2 part 1 attributes">
+        <taskdef name="odfxslt" classname="org.odftoolkit.odfxsltrunnertask.ODFXSLTRunnerTask" classpath="${dist.jar}:${reference.odfxsltrunner.jar}"/>
+        <copy file="${project.odfxsltrunner}/misc/odf-attribute-xref.ods" todir="${dist.dir}/attr-xref"/>
+        <odfxslt style="${project.odfxsltrunner}/sample_xslt/create-attribute-xref.xsl"
+            infile="${build.dir}/schema/flat/${opendocument.v12.schema.dtype}"
+            out="${dist.dir}/attr-xref/odf-attribute-xref.ods"
+            template="true"/>
+    </target>
+
+    <target name="-create-v12-xref-schema" depends="init">
+        <xslt style="${project.odfxsltrunner}/sample_xslt/create-flat-schema.xsl" 
+                    in="${opendocument.v12.part1.schema.dir}/${opendocument.v12.schema}"
+                    out="${build.dir}/schema/flat/${opendocument.v12.schema.xref}"
+                    force="false">
+            <param name="incl-conditions" expression="true"/>
+            <param name="incl-default-values" expression="true"/>
+            <param name="incl-types" expression="true"/>
+            <param name="incl-elements" expression="true"/>
+        </xslt>
+    </target>
+
+    <target name="-create-v12-manifest-xref-schema" depends="init">
+        <xslt style="${project.odfxsltrunner}/sample_xslt/create-flat-schema.xsl"
+                    in="${opendocument.v12.part3.schema.dir}/${opendocument.v12.schema.manifest}"
+                    out="${build.dir}/schema/flat/${opendocument.v12.manifest-schema.xref}"
+                    force="false">
+            <param name="incl-conditions" expression="true"/>
+            <param name="incl-default-values" expression="true"/>
+            <param name="incl-types" expression="true"/>
+            <param name="incl-elements" expression="true"/>
+        </xslt>
+    </target>
+
+    <target name="-create-v12-dtype-schema" depends="init">
+        <condition property="force">
+            <not>
+                <uptodate srcfile="${opendocument.v12.part1.schema.dir}/${opendocument.v12.schema}" targetfile="${build.dir}/schema/flat/${opendocument.v12.schema.dtype}"/>
+            </not>
+        </condition>
+        <xslt style="${project.odfxsltrunner}/sample_xslt/create-flat-schema.xsl" 
+                    in="${opendocument.v12.part1.schema.dir}/${opendocument.v12.schema}"
+                    out="${build.dir}/schema/flat/${opendocument.v12.schema.dtype}"
+                    force="${force}">  
+            <param name="incl-conditions" expression="false"/>
+            <param name="incl-default-values" expression="true"/>
+            <param name="incl-types" expression="true"/>
+            <param name="incl-elements" expression="false"/>
+        </xslt>
+    </target>
+
+</project>
diff --git a/trunk/xslt-runner-task/build.xml b/trunk/xslt-runner-task/build.xml
new file mode 100644
index 0000000..b82ab09
--- /dev/null
+++ b/trunk/xslt-runner-task/build.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project name="odfxsltrunnertask" default="default" basedir=".">
+    <description>Builds, tests, and runs the project odfxsltrunnertask.</description>
+    <import file="nbproject/build-impl.xml"/>
+
+    <target name="-post-jar" depends="init">
+        <copy todir="${dist.dir}">
+            <filelist dir="." files="LICENSE.txt README.txt" />
+        </copy>
+        <delete file="${dist.dir}/README.TXT"/>
+        <zip destfile="${dist.dir}/odfxsltrunnertask.zip" update="true">
+            <zipfileset dir="${dist.dir}" includes="*.jar,*.txt"/>
+        </zip>
+    </target>
+    
+</project>
diff --git a/trunk/xslt-runner-task/nbproject/build-impl.xml b/trunk/xslt-runner-task/nbproject/build-impl.xml
new file mode 100644
index 0000000..fe85e98
--- /dev/null
+++ b/trunk/xslt-runner-task/nbproject/build-impl.xml
@@ -0,0 +1,908 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - junit compilation
+  - junit execution
+  - junit debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="odfxsltrunnertask-impl">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <available file="${manifest.file}" property="manifest.available"/>
+        <available file="${application.splash}" property="splashscreen.available"/>
+        <condition property="main.class.available">
+            <and>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class.available"/>
+            </and>
+        </condition>
+        <condition property="do.mkdist">
+            <and>
+                <isset property="libs.CopyLibs.classpath"/>
+                <not>
+                    <istrue value="${mkdist.disabled}"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available+splashscreen.available">
+            <and>
+                <istrue value="${manifest.available+main.class+mkdist.available}"/>
+                <istrue value="${splashscreen.available}"/>
+            </and>
+        </condition>
+        <condition property="do.archive">
+            <not>
+                <istrue value="${jar.archive.disabled}"/>
+            </not>
+        </condition>
+        <condition property="do.archive+manifest.available">
+            <and>
+                <isset property="manifest.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class+mkdist.available}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available">
+            <and>
+                <istrue value="${manifest.available+main.class+mkdist.available+splashscreen.available}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <property name="runtime.encoding" value="${source.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <length length="0" string="${endorsed.classpath}" when="greater"/>
+        </condition>
+        <property name="javac.fork" value="false"/>
+        <property name="jar.index" value="false"/>
+        <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg line="${annotation.processing.processor.options}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+                <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+                <delete>
+                    <files includesfile="${javac.includesfile.binary}"/>
+                </delete>
+                <delete file="${javac.includesfile.binary}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-junit">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <sequential>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-copylibs">
+        <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+                <pathconvert property="run.classpath.without.build.classes.dir">
+                    <path path="${run.classpath}"/>
+                    <map from="${build.classes.dir.resolved}" to=""/>
+                </pathconvert>
+                <pathconvert pathsep=" " property="jar.classpath">
+                    <path path="${run.classpath.without.build.classes.dir}"/>
+                    <chainedmapper>
+                        <flattenmapper/>
+                        <globmapper from="*" to="lib/*"/>
+                    </chainedmapper>
+                </pathconvert>
+                <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+                <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+                    <fileset dir="${build.classes.dir}"/>
+                    <manifest>
+                        <attribute name="Class-Path" value="${jar.classpath}"/>
+                        <customize/>
+                    </manifest>
+                </copylibs>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target name="-init-ap-cmdline-properties">
+        <property name="annotation.processing.enabled" value="true"/>
+        <property name="annotation.processing.processors.list" value=""/>
+        <property name="annotation.processing.processor.options" value=""/>
+        <property name="annotation.processing.run.all.processors" value="true"/>
+        <property name="javac.processorpath" value="${javac.classpath}"/>
+        <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+        <condition property="ap.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+        <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+            <isfalse value="${annotation.processing.run.all.processors}"/>
+        </condition>
+        <condition else="" property="ap.proc.none.internal" value="-proc:none">
+            <isfalse value="${annotation.processing.enabled}"/>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+        <property name="ap.cmd.line.internal" value=""/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target name="-deps-jar-init" unless="built-jar.properties">
+        <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+        <delete file="${built-jar.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+        <echo level="warn" message="Cycle detected: odfxsltrunnertask was already built"/>
+    </target>
+    <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-jar.properties}" verbose="false"/>
+        <property file="${built-jar.properties}" prefix="already.built.jar."/>
+        <antcall target="-warn-already-built-jar"/>
+        <propertyfile file="${built-jar.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+        <antcall target="-maybe-call-dep">
+            <param name="call.built.properties" value="${built-jar.properties}"/>
+            <param location="${project.odfxsltrunner}" name="call.subproject"/>
+            <param location="${project.odfxsltrunner}/build.xml" name="call.script"/>
+            <param name="call.target" value="jar"/>
+            <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+        </antcall>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target if="has.persistence.xml" name="-copy-persistence-xml">
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy todir="${build.classes.dir}/META-INF">
+            <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available" name="-do-jar-with-libraries-and-splashscreen">
+        <basename file="${application.splash}" property="splashscreen.basename"/>
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+        <j2seproject3:copylibs>
+            <customize>
+                <attribute name="Main-Class" value="${main.class}"/>
+                <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+            </customize>
+        </j2seproject3:copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries" unless="splashscreen.available">
+        <j2seproject3:copylibs>
+            <customize>
+                <attribute name="Main-Class" value="${main.class}"/>
+            </customize>
+        </j2seproject3:copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries-and-splashscreen,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" if="have.sources" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+            </fileset>
+        </javadoc>
+        <copy todir="${dist.javadoc.dir}">
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/doc-files/**"/>
+            </fileset>
+        </copy>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                JUNIT COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                JUNIT EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:junit testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:junit excludes="" includes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <!--
+                =======================
+                JUNIT DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+        <delete file="${test.report.file}"/>
+        <mkdir dir="${build.test.results.dir}"/>
+        <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+            <customize>
+                <syspropertyset>
+                    <propertyref prefix="test-sys-prop."/>
+                    <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                </syspropertyset>
+                <arg value="${test.class}"/>
+                <arg value="showoutput=true"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target name="-deps-clean-init" unless="built-clean.properties">
+        <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+        <delete file="${built-clean.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+        <echo level="warn" message="Cycle detected: odfxsltrunnertask was already built"/>
+    </target>
+    <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-clean.properties}" verbose="false"/>
+        <property file="${built-clean.properties}" prefix="already.built.clean."/>
+        <antcall target="-warn-already-built-clean"/>
+        <propertyfile file="${built-clean.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+        <antcall target="-maybe-call-dep">
+            <param name="call.built.properties" value="${built-clean.properties}"/>
+            <param location="${project.odfxsltrunner}" name="call.subproject"/>
+            <param location="${project.odfxsltrunner}/build.xml" name="call.script"/>
+            <param name="call.target" value="clean"/>
+            <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+        </antcall>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target name="-check-call-dep">
+        <property file="${call.built.properties}" prefix="already.built."/>
+        <condition property="should.call.dep">
+            <not>
+                <isset property="already.built.${call.subproject}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+        <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+            <propertyset>
+                <propertyref prefix="transfer."/>
+                <mapper from="transfer.*" to="*" type="glob"/>
+            </propertyset>
+        </ant>
+    </target>
+</project>
diff --git a/trunk/xslt-runner-task/nbproject/genfiles.properties b/trunk/xslt-runner-task/nbproject/genfiles.properties
new file mode 100644
index 0000000..eb867c3
--- /dev/null
+++ b/trunk/xslt-runner-task/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1dc1c738
+build.xml.script.CRC32=1494076f
+build.xml.stylesheet.CRC32=be360661
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1dc1c738
+nbproject/build-impl.xml.script.CRC32=03fdfbcb
+nbproject/build-impl.xml.stylesheet.CRC32=229523de@1.38.3.45
diff --git a/trunk/xslt-runner-task/nbproject/project.properties b/trunk/xslt-runner-task/nbproject/project.properties
new file mode 100644
index 0000000..417297e
--- /dev/null
+++ b/trunk/xslt-runner-task/nbproject/project.properties
@@ -0,0 +1,66 @@
+application.desc=Ant Taks for applying XSLT styles sheets to OpenDocument packages.
+application.homepage=http://odftoolkit.org/projects/conformancetools/pages/ODFXSLTRunnerTask
+application.title=ODF XSLT Runner Task
+application.vendor=Oracle
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/odfxsltrunnertask.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${reference.odfxsltrunner.jar}:\
+    ${ant.core.lib}
+# Space-separated list of extra javac options
+javac.compilerargs=-Xlint:deprecation
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}:\
+    ${libs.junit.classpath}:\
+    ${libs.junit_4.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+project.odfxsltrunner=../conformancetools~odf-xslt-runner-src
+reference.odfxsltrunner.jar=${project.odfxsltrunner}/dist/odfxsltrunner.jar
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/trunk/xslt-runner-task/nbproject/project.xml b/trunk/xslt-runner-task/nbproject/project.xml
new file mode 100644
index 0000000..b306438
--- /dev/null
+++ b/trunk/xslt-runner-task/nbproject/project.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>odfxsltrunnertask</name>
+            <minimum-ant-version>1.6.5</minimum-ant-version>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+        <references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
+            <reference>
+                <foreign-project>odfxsltrunner</foreign-project>
+                <artifact-type>jar</artifact-type>
+                <script>build.xml</script>
+                <target>jar</target>
+                <clean-target>clean</clean-target>
+                <id>jar</id>
+            </reference>
+        </references>
+    </configuration>
+</project>
diff --git a/trunk/xslt-runner-task/pom.xml b/trunk/xslt-runner-task/pom.xml
new file mode 100644
index 0000000..207c3a8
--- /dev/null
+++ b/trunk/xslt-runner-task/pom.xml
@@ -0,0 +1,75 @@
+ <!-- 
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>odftoolkit</artifactId>
+    <version>0.6.1-incubating</version>
+  </parent>
+
+  <artifactId>xslt-runner-task</artifactId>
+  <name>ODF XSLT-Runner Ant Task</name>
+  <version>1.2.3-incubating</version>
+  
+  <organization>
+    <name>The Apache Software Foundation</name>
+    <url>http://www.apache.org/</url>
+  </organization>
+  <dependencies>
+	<dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>xslt-runner</artifactId>
+      <version>1.2.3-incubating</version>
+	</dependency>	
+    <dependency>
+      <groupId>org.apache.ant</groupId>
+      <artifactId>ant</artifactId>
+    </dependency>
+  </dependencies>
+
+
+
+  <!-- Build Settings -->
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+          <meminitial>512m</meminitial>
+          <maxmem>1024m</maxmem>
+          <showDeprecation>true</showDeprecation>
+        </configuration>
+    </plugin>
+        <plugin>
+            <groupId>org.apache.rat</groupId>
+            <artifactId>apache-rat-plugin</artifactId>
+            <configuration>
+                <excludes>
+                    <exclude>nbproject/**</exclude>
+                </excludes>
+            </configuration>
+        </plugin>
+ </plugins>
+</build>
+</project>
diff --git a/trunk/xslt-runner-task/src/main/java/org/odftoolkit/odfxsltrunnertask/AntLogger.java b/trunk/xslt-runner-task/src/main/java/org/odftoolkit/odfxsltrunnertask/AntLogger.java
new file mode 100644
index 0000000..7156bec
--- /dev/null
+++ b/trunk/xslt-runner-task/src/main/java/org/odftoolkit/odfxsltrunnertask/AntLogger.java
@@ -0,0 +1,95 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunnertask;
+
+import org.odftoolkit.odfxsltrunner.Logger;
+import org.apache.tools.ant.Project;
+
+class AntLogger extends Logger 
+{
+    static final String LINE_PREFIX = ": line ";
+    
+    private Project m_aProject = null;
+    
+    /** Creates a new instance of AntLogger */
+    AntLogger( Project aProject )     
+    {
+        m_aProject = aProject;
+    }
+    
+    /**
+     * Log a message.
+     * 
+     * @param aPrefix Message prefix
+     * @param aMsg Message text
+     * @param aLocation file, row and column number as text (optional)
+     * @param nLevel the warning level (one of INFO, WARNING or ERROR)
+     */
+    protected void logMessage( String aPrefix, String aMsg, String aLocation, int nLevel  )
+    {
+        int nAntLevel = nLevel == ERROR ? Project.MSG_ERR : (nLevel == WARNING ? Project.MSG_WARN : Project.MSG_INFO);
+        
+        StringBuffer aOut = new StringBuffer( aLocation != null ? aLocation : getName() );
+        aOut.append( ": " );
+        aOut.append( aPrefix );
+        aOut.append( ':' );
+        aOut.append( aMsg );
+
+        m_aProject.log( aOut.toString(), nAntLevel );
+    }
+
+    /**
+     * Log a message.
+     * 
+     * @param aPrefix Message prefix
+     * @param aMsgWithLocation Message text including location information
+     * @param nLevel the warning level (one of INFO, WARNING or ERROR)
+     */
+    protected void logMessageWithLocation( String aPrefix, String aMsgWithLocation, int nLevel )
+    {
+        int nAntLevel = nLevel == ERROR ? Project.MSG_ERR : (nLevel == WARNING ? Project.MSG_WARN : Project.MSG_INFO);
+
+        StringBuffer aOut = new StringBuffer( aMsgWithLocation );
+        
+        // remove a " line" from the line number information
+        int nPos = aOut.indexOf( LINE_PREFIX );
+        if( nPos != -1 )
+        {
+            aOut.delete(nPos+1, nPos+LINE_PREFIX.length() );
+            nPos = aOut.indexOf( ": ", nPos);
+        }
+        if( nPos != -1 )
+        {
+            aOut.insert(nPos+2, ':' );
+            aOut.insert(nPos+2, aPrefix );
+        }
+        else
+        {
+            aOut.append( " (" );
+            aOut.append( aPrefix );
+            aOut.append( ')' );
+        }
+
+        m_aProject.log( aOut.toString(), nAntLevel );
+    }
+}
diff --git a/trunk/xslt-runner-task/src/main/java/org/odftoolkit/odfxsltrunnertask/ODFXSLTRunnerTask.java b/trunk/xslt-runner-task/src/main/java/org/odftoolkit/odfxsltrunnertask/ODFXSLTRunnerTask.java
new file mode 100644
index 0000000..832e3f6
--- /dev/null
+++ b/trunk/xslt-runner-task/src/main/java/org/odftoolkit/odfxsltrunnertask/ODFXSLTRunnerTask.java
@@ -0,0 +1,341 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunnertask;
+
+// IMPORTANT! You need to compile this class against ant.jar.
+// The easiest way to do this is to add ${ant.core.lib} to your project's classpath.
+// For example, for a plain Java project with no other dependencies, set in project.properties:
+// javac.classpath=${ant.core.lib}
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Vector;
+import org.odftoolkit.odfxsltrunner.Logger;
+import org.odftoolkit.odfxsltrunner.ODFXSLTRunner;
+import org.odftoolkit.odfxsltrunner.XSLTParameter;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+import org.apache.tools.ant.taskdefs.Mkdir;
+
+/**
+ * Ant Taks for applying XSLT style sheets to ODF packages.
+ */
+public class ODFXSLTRunnerTask extends Task {
+
+    private File m_aStyleSheet = null;
+    private File m_aInput = null;
+    private File m_aInputFile = null;
+    private File m_aOutput = null;
+    private File m_aOutputFile = null;
+    private String m_aPath = "content.xml";
+    private Vector<XSLTParameter> m_aParams = null;
+    private Factory m_aFactory = null;
+    boolean m_bForce = false;
+    boolean m_bTemplate = false;
+    
+    /**
+     * Set input package. The specified path within the package is the source of 
+     * the transformation.
+     * 
+     * @param aIn Input package
+     */
+    public void setIn( File aIn )
+    {
+        m_aInput = aIn;
+    }
+
+    /**
+     * Set input file. This (XML) file is used directly as source of the 
+     * transformation.
+     * 
+     * @param aInFile Input File
+     */
+    public void setInFile( File aInFile )
+    {
+        m_aInputFile = aInFile;
+    }
+
+    /**
+     * Set output package. The source of the transformation is stored in a 
+     * package with this name.
+     * 
+     * @param aOut
+     */
+    public void setOut( File aOut )
+    {
+        m_aOutput = aOut;
+    }
+
+    /**
+     * Set output file. The source of the transformation is stored under this
+     * name as plain (XML) file.
+     * 
+     * @param aOutFile
+     */
+    public void setOutFile( File aOutFile )
+    {
+        m_aOutputFile = aOutFile;
+    }
+
+    /**
+     * Set the style sheet to apply.
+     * 
+     * @param aStyle
+     */
+    public void setStyle( File aStyle )
+    {
+        m_aStyleSheet = aStyle;
+    }
+
+    /**
+     * Sets template mode. In template mode, the output package must exist,
+     * and the specified path within the output file is replaced with the result
+     * of the transformation
+     * 
+     * @param bTemplate Template mode
+     */
+    public void setTemplate( boolean bTemplate )
+    {
+        m_bTemplate = bTemplate;
+    }
+    
+    /**
+     * Set force mode. In this mode, the style sheet is applied even if the
+     * output file or package is newer than the source and the style sheet.
+     * 
+     * @param bForce
+     */
+    public void setForce( boolean bForce )
+    {
+        m_bForce = bForce;
+    }
+
+
+    /**
+     * Paramter class for nested <param> elements.
+     */
+    public static class Param implements XSLTParameter
+    {
+        private String m_aName = null;
+        private String m_aValue = null;
+
+        Param()
+        {
+        }
+
+        /**
+         * Set parameter name.
+         * @param aName
+         */
+        public void setName( String aName )
+        {
+            m_aName = aName;
+        }
+
+        /**
+         * Set parameter expression.
+         * 
+         * @param aValue
+         */
+        public void setExpression( String aValue )
+        {
+            m_aValue = aValue;
+        }
+
+        /**
+         * Get paramter name.
+         * 
+         * @return paramter name
+         */
+        public String getName()
+        {
+            return m_aName;
+        }
+
+        /** 
+         * Get paramter value.
+         * 
+         * @return paramter value.
+         */
+        public String getValue()
+        {
+            return m_aValue;
+        }
+    }
+
+    /**
+     * Paramter class for nested <factory> elements.
+     */
+    public static class Factory
+    {
+        private String m_aName = null;
+
+        Factory()
+        {
+        }
+
+        /**
+         * Set factory name.
+         * @param aName
+         */
+        public void setName( String aName )
+        {
+            m_aName = aName;
+        }
+
+        /**
+         * Get factory name.
+         *
+         * @return paramter name
+         */
+        public String getName()
+        {
+            return m_aName;
+        }
+
+    }
+
+
+    /**
+     * Create a new paramter for a nested <param> element.
+     * 
+     * @return new paramter.
+     */
+    public Param createParam()
+    {
+        Param aParam = new Param();
+        if( m_aParams == null )
+            m_aParams = new Vector<XSLTParameter>();
+        m_aParams.add( aParam );
+        return aParam;
+    }
+
+    /**
+     * Create a new factory for a nested <factory> element.
+     *
+     * @return new paramter.
+     */
+    public Factory createFactory()
+    {
+        m_aFactory = new Factory();
+        return m_aFactory;
+    }
+    
+
+    public @Override void execute() throws BuildException {
+    
+        if( m_aStyleSheet == null )
+            throw new BuildException( "style attribute must be set", getLocation() );
+        if( !m_aStyleSheet.exists() )
+            throw new BuildException( "style sheet " + m_aStyleSheet.getAbsolutePath() + " does not exist", getLocation() );
+
+        int m_aInputMode = ODFXSLTRunner.INPUT_MODE_PACKAGE;
+        if( m_aInput == null && m_aInputFile == null )
+            throw new BuildException( "in or infile attribute must be set", getLocation() );
+        else if( m_aInput != null && m_aInputFile != null )
+            throw new BuildException( "in and infile attributes must not be set simultaneously", getLocation() );
+        if( m_aInputFile != null )
+        {
+            m_aInput = m_aInputFile;
+            m_aInputMode = ODFXSLTRunner.INPUT_MODE_FILE;
+        }
+        if( !m_aInput.exists() )
+            throw new BuildException( "input file " + m_aInput.getAbsolutePath() + " does not exist", getLocation() );
+        
+        int m_aOutputMode = ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE;
+        if( m_aOutput == null && m_aOutputFile == null )
+            throw new BuildException( "out or outfile attribute must be set", getLocation() );
+        if( m_aOutput != null && m_aOutputFile != null )
+            throw new BuildException( "out and outfile attribute must not be set simultaneously", getLocation() );
+        if( m_bTemplate && m_aOutput == null )
+            throw new BuildException( "out attribute must be set if template attribute is set", getLocation() );
+
+        if( m_aOutputFile != null )
+        {
+            m_aOutput = m_aOutputFile;
+            m_aOutputMode = ODFXSLTRunner.OUTPUT_MODE_FILE;
+        }
+        else if( m_bTemplate )
+        {
+            m_aOutputMode = ODFXSLTRunner.OUTPUT_MODE_TEMPLATE_PACKAGE;
+            if( !m_aOutput.exists() )
+                throw new BuildException( "output file " + m_aStyleSheet.getAbsolutePath() + " does not exist", getLocation() );
+        }
+        
+        if( m_aParams != null )
+        {
+            Iterator<XSLTParameter> aIter = m_aParams.iterator();
+            while( aIter.hasNext() )
+            {
+                XSLTParameter aParam = aIter.next();
+                if( aParam.getName() == null )
+                    throw new BuildException( "parameter name attribute must be set", getLocation() );
+
+                if( aParam.getValue() == null )
+                    throw new BuildException( "parameter expression attribute must be set", getLocation() );
+            }
+        }
+
+        String aFactory = null;
+        if( m_aFactory != null )
+        {
+            aFactory = m_aFactory.getName();
+            if( aFactory == null )
+                throw new BuildException( "factory name attribute must be set", getLocation() );
+        }
+        
+        if( !m_bForce && m_aOutput.exists() && 
+            m_aOutput.lastModified() > m_aInput.lastModified() &&
+            m_aOutput.lastModified() > m_aStyleSheet.lastModified())
+            return;
+
+        if( !m_aOutput.exists() )
+        {
+            File aParentFile = m_aOutput.getParentFile();
+            if( aParentFile != null )
+            {
+                Mkdir aMKDir = (Mkdir)getProject().createTask("mkdir");
+                aMKDir.setDir(aParentFile);
+                aMKDir.init();
+                aMKDir.setLocation(getLocation());
+                aMKDir.execute();
+            }
+        }
+        
+        boolean bError = false;
+        try
+        {
+            ODFXSLTRunner aRunner = new ODFXSLTRunner();
+            Logger aLogger = new AntLogger( getProject() );
+            bError = aRunner.runXSLT( m_aStyleSheet, m_aParams, m_aInput, m_aInputMode, m_aOutput, m_aOutputMode, m_aPath, aFactory, null, aLogger  );
+        }
+        catch( Exception e )
+        {
+            throw new BuildException( e, getLocation() );
+        }
+        if( bError )
+            throw new BuildException( "transformation failed", getLocation() );
+    }
+
+}
\ No newline at end of file
diff --git a/trunk/xslt-runner/LICENSE.txt b/trunk/xslt-runner/LICENSE.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/trunk/xslt-runner/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/trunk/xslt-runner/README.txt b/trunk/xslt-runner/README.txt
new file mode 100644
index 0000000..dd9bcc8
--- /dev/null
+++ b/trunk/xslt-runner/README.txt
@@ -0,0 +1,43 @@
+*************************************************************
+* ODFXSLTRunner                                             *
+*                                                           *
+*************************************************************
+*                                                           *
+* Version: 1.1.0                                     *
+* Release Date: xx/xx/2010                                  *
+*                                                           *
+*************************************************************
+
+
+About ODF XSLT Runner
+---------------------
+
+ODF XSLT Runner is a Java command line application that allows you to apply
+XSLT stylesheets to XML streams included in ODF packages without extracting
+them from the package.
+
+
+Documentation
+--------------
+
+In general, the Wiki page is a great place to start when looking for online
+documentation and other information about ODFXSLTRunner.
+    http://odftoolkit.org/projects/odftoolkit/pages/ODFXSLTRunner
+
+
+License
+--------
+
+Apache License, Version 2.0. Please see file LICENSE.txt.
+
+
+Installation
+-------------
+
+Just put the file odfxsltrunner.jar in your classpath.
+
+You will need ODFDOM. Get it from
+    http://odftoolkit.org/projects/odfdom
+
+You will further need Apache Xerces-J. Get it from
+    http://xml.apache.org/dist/xerces-j/
diff --git a/trunk/xslt-runner/build-schemas.xml b/trunk/xslt-runner/build-schemas.xml
new file mode 100644
index 0000000..6580267
--- /dev/null
+++ b/trunk/xslt-runner/build-schemas.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<project name="build-schemas" default="default" basedir=".">
+    <description>Prepares ODF schema and specification location properties for use within this project.</description>
+
+    <dirname property="build-schemas.basedir" file="${ant.file.build-schemas}"/>
+    <property file="${build-schemas.basedir}/schema.user.properties" prefix="user"/>
+    <property file="${build-schemas.basedir}/schema.properties"/>
+
+    <target name="-init-schema-props">
+        <!-- Set schema properties from schema.user.properties file if they are not set in private.properties already -->
+        <condition property="opendocument.v12.part1.schema.dir" value="${user.opendocument.v12.part1.schema.dir}">
+            <not>
+                <isset property="opendocument.v12.part1.schema.dir"/>
+            </not>
+        </condition>
+        <condition property="opendocument.v12.part3.schema.dir" value="${user.opendocument.v12.part3.schema.dir}">
+            <not>
+                <isset property="opendocument.v12.part3.schema.dir"/>
+            </not>
+        </condition>
+        <condition property="opendocument.v12.part0.spec-source" value="${user.opendocument.v12.part0.spec-source}">
+            <not>
+                <isset property="opendocument.v12.part0.spec-source"/>
+            </not>
+        </condition>
+        <condition property="opendocument.v12.part1.spec-source" value="${user.opendocument.v12.part1.spec-source}">
+            <not>
+                <isset property="opendocument.v12.part1.spec-source"/>
+            </not>
+        </condition>
+        <condition property="opendocument.v12.part2.spec-source" value="${user.opendocument.v12.part2.spec-source}">
+            <not>
+                <isset property="opendocument.v12.part2.spec-source"/>
+            </not>
+        </condition>
+        <condition property="opendocument.v12.part3.spec-source" value="${user.opendocument.v12.part3.spec-source}">
+            <not>
+                <isset property="opendocument.v12.part3.spec-source"/>
+            </not>
+        </condition>
+        <condition property="opendocument.v12.product.dir" value="${user.opendocument.v12.product.dir}">
+            <not>
+                <isset property="opendocument.v12.product.dir"/>
+            </not>
+        </condition>
+
+        <!-- Some basic document names -->
+        <property name="opendocument.v12.schema" value="OpenDocument-v1.2${opendocument.v12.part1.schema.state}-schema.rng"/>
+        <property name="opendocument.v12.schema.manifest" value="OpenDocument-v1.2${opendocument.v12.part3.schema.state}-manifest-schema.rng"/>
+        <property name="opendocument.v12.schema.dsig" value="OpenDocument-v1.2${opendocument.v12.part3.schema.state}-dsig-schema.rng"/>
+        <property name="opendocument.v12.ontology.part1" value="OpenDocument-v1.2${opendocument.v12.part1.schema.state}-metadata.owl"/>
+        <property name="opendocument.v12.ontology.part3" value="OpenDocument-v1.2${opendocument.v12.part3.schema.state}-package-metadata.owl"/>
+
+        <property name="opendocument.v12.schema.xref" value="OpenDocument-v1.2${opendocument.v12.part1.schema.state}-xref-schema.rng"/>
+        <property name="opendocument.v12.schema.dtype" value="OpenDocument-v1.2${opendocument.v12.part1.schema.state}-dtype-schema.rng"/>
+        <property name="opendocument.v12.manifest-schema.xref" value="OpenDocument-v1.2${opendocument.v12.part3.schema.state}-xref-manifest-schema.rng"/>
+    </target>
+
+</project>
+
+
+
diff --git a/trunk/xslt-runner/build-xref.xml b/trunk/xslt-runner/build-xref.xml
new file mode 100644
index 0000000..548b772
--- /dev/null
+++ b/trunk/xslt-runner/build-xref.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project name="ODF Cross References" default="default" basedir=".">
+    <description>Creates cross references from ODF schema.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <import file="build-schemas.xml"/>
+ 
+    <target name="-post-init" depends="-init-schema-props"
+            description="Initialize schema properties"/>
+
+    <target name="add-v12-xref" depends="init,jar,-create-v12-xref-schema" 
+            description="add cross references to ODF 1.2 specification.">
+        <property name="xref-schema-file" location="${build.dir}/schema/flat/${opendocument.v12.schema.xref}"/>
+        <property name="log-file" location="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part1.state.target}.log"/>
+        <mkdir dir="${dist.dir}/xref"/>
+        <java jar="${dist.jar}" fork="true">
+            <arg value="-v"/>
+            <arg value="-l"/>
+            <arg value="${log-file}"/>
+            <arg value="sample_xslt/create-embedded-xref.xsl"/>
+            <arg value="${opendocument.v12.part1.spec-source}"/>
+            <arg value="${dist.dir}/xref/OpenDocument-v1.2${opendocument.v12.part1.state.target}.odt"/>
+            <arg value="xref-schema-file=${xref-schema-file}"/>
+        </java>
+    </target>
+
+    <target name="create-v12-attribute-xref-ods" depends="init,jar,-create-v12-dtype-schema" 
+            description="Creates cross reference document from ODF 1.2 schema.">
+        <copy file="misc/odf-attribute-xref.ods" todir="${dist.dir}/attr-xref"/>
+        <java jar="${dist.jar}" fork="true">
+            <arg value="-v"/>
+            <arg value="sample_xslt/create-attribute-xref.xsl"/>
+            <arg value="-i"/>
+            <arg value="${build.dir}/schema/flat/${opendocument.v12.schema.dtype}"/>
+            <arg value="-t"/>
+            <arg value="${dist.dir}/attr-xref/odf-attribute-xref.ods"/>
+        </java>
+    </target>
+    
+    <target name="-create-v12-xref-schema" depends="init">
+        <xslt style="sample_xslt/create-flat-schema.xsl" 
+                    in="${opendocument.v12.part1.schema.dir}/${opendocument.v12.schema}"
+                    out="${build.dir}/schema/flat/${opendocument.v12.schema.xref}">  
+            <param name="incl-conditions" expression="false"/>
+            <param name="incl-default-values" expression="false"/>
+            <param name="incl-types" expression="false"/>
+            <param name="incl-elements" expression="true"/>
+        </xslt>
+    </target>
+    
+    <target name="-create-v12-dtype-schema" depends="init">
+        <xslt style="sample_xslt/create-flat-schema.xsl" 
+                    in="${opendocument.v12.part1.schema.dir}/${opendocument.v12.schema}"
+                    out="${build.dir}/schema/flat/${opendocument.v12.schema.dtype}">  
+            <param name="incl-conditions" expression="false"/>
+            <param name="incl-default-values" expression="true"/>
+            <param name="incl-types" expression="true"/>
+            <param name="incl-elements" expression="false"/>
+        </xslt>
+    </target>
+    
+</project>
\ No newline at end of file
diff --git a/trunk/xslt-runner/build.xml b/trunk/xslt-runner/build.xml
new file mode 100644
index 0000000..a7a75e6
--- /dev/null
+++ b/trunk/xslt-runner/build.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project name="odfxsltrunner" default="default" basedir=".">
+    <description>Builds, tests, and runs the project odfxsltrunner.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties
+      -post-init:                called after initialization of project properties
+      -pre-compile:              called before javac compilation
+      -post-compile:             called after javac compilation
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-jar:                  called before JAR building
+      -post-jar:                 called after JAR building
+      -post-clean:               called after cleaning build products
+
+    (Targets beginning with '-' are not intended to be called on their own.)
+
+    Example of inserting an obfuscator after compilation could look like this:
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Another way to customize the build is by overriding existing main targets.
+    The targets of interest are: 
+
+      -init-macrodef-javac:     defines macro for javac compilation
+      -init-macrodef-junit:     defines macro for junit execution
+      -init-macrodef-debug:     defines macro for class debugging
+      -init-macrodef-java:      defines macro for class execution
+      -do-jar-with-manifest:    JAR building (if you are using a manifest)
+      -do-jar-without-manifest: JAR building (if you are not using a manifest)
+      run:                      execution of project 
+      -javadoc-build:           Javadoc generation
+      test-report:              JUnit report generation
+
+    An example of overriding the target for project execution could look like this:
+
+        <target name="run" depends="odfxsltrunner-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that the overridden target depends on the jar target and not only on 
+    the compile target as the regular run target does. Again, for a list of available 
+    properties which you can use, check the target you are overriding in the
+    nbproject/build-impl.xml file.
+    
+    -->
+
+    <target name="-post-jar" depends="init">
+        <copy todir="${dist.dir}">
+            <filelist dir="." files="LICENSE.txt README.txt" />
+        </copy>
+        <delete file="${dist.dir}/README.TXT"/>
+
+        <zip destfile="${dist.dir}/odfxsltrunner.zip" update="true">
+            <zipfileset dir="${dist.dir}" includes="*.jar,*.txt"/>
+        </zip>
+    </target>
+
+</project>
diff --git a/trunk/xslt-runner/manifest.mf b/trunk/xslt-runner/manifest.mf
new file mode 100644
index 0000000..328e8e5
--- /dev/null
+++ b/trunk/xslt-runner/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/trunk/xslt-runner/misc/odf-attribute-xref.ods b/trunk/xslt-runner/misc/odf-attribute-xref.ods
new file mode 100644
index 0000000..d409847
--- /dev/null
+++ b/trunk/xslt-runner/misc/odf-attribute-xref.ods
Binary files differ
diff --git a/trunk/xslt-runner/nbproject/build-impl.xml b/trunk/xslt-runner/nbproject/build-impl.xml
new file mode 100644
index 0000000..5d5ec6c
--- /dev/null
+++ b/trunk/xslt-runner/nbproject/build-impl.xml
@@ -0,0 +1,883 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - junit compilation
+  - junit execution
+  - junit debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="odfxsltrunner-impl">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <available file="${manifest.file}" property="manifest.available"/>
+        <available file="${application.splash}" property="splashscreen.available"/>
+        <condition property="main.class.available">
+            <and>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class.available"/>
+            </and>
+        </condition>
+        <condition property="do.mkdist">
+            <and>
+                <isset property="libs.CopyLibs.classpath"/>
+                <not>
+                    <istrue value="${mkdist.disabled}"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available+splashscreen.available">
+            <and>
+                <istrue value="${manifest.available+main.class+mkdist.available}"/>
+                <istrue value="${splashscreen.available}"/>
+            </and>
+        </condition>
+        <condition property="do.archive">
+            <not>
+                <istrue value="${jar.archive.disabled}"/>
+            </not>
+        </condition>
+        <condition property="do.archive+manifest.available">
+            <and>
+                <isset property="manifest.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class+mkdist.available}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available">
+            <and>
+                <istrue value="${manifest.available+main.class+mkdist.available+splashscreen.available}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="have.tests">
+            <or/>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <property name="runtime.encoding" value="${source.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <length length="0" string="${endorsed.classpath}" when="greater"/>
+        </condition>
+        <property name="javac.fork" value="false"/>
+        <property name="jar.index" value="false"/>
+        <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg line="${annotation.processing.processor.options}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+                <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+                <delete>
+                    <files includesfile="${javac.includesfile.binary}"/>
+                </delete>
+                <delete file="${javac.includesfile.binary}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-junit">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <sequential>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}"/>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-copylibs">
+        <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+                <pathconvert property="run.classpath.without.build.classes.dir">
+                    <path path="${run.classpath}"/>
+                    <map from="${build.classes.dir.resolved}" to=""/>
+                </pathconvert>
+                <pathconvert pathsep=" " property="jar.classpath">
+                    <path path="${run.classpath.without.build.classes.dir}"/>
+                    <chainedmapper>
+                        <flattenmapper/>
+                        <globmapper from="*" to="lib/*"/>
+                    </chainedmapper>
+                </pathconvert>
+                <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+                <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+                    <fileset dir="${build.classes.dir}"/>
+                    <manifest>
+                        <attribute name="Class-Path" value="${jar.classpath}"/>
+                        <customize/>
+                    </manifest>
+                </copylibs>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target name="-init-ap-cmdline-properties">
+        <property name="annotation.processing.enabled" value="true"/>
+        <property name="annotation.processing.processors.list" value=""/>
+        <property name="annotation.processing.processor.options" value=""/>
+        <property name="annotation.processing.run.all.processors" value="true"/>
+        <property name="javac.processorpath" value="${javac.classpath}"/>
+        <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+        <condition property="ap.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+        <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+            <isfalse value="${annotation.processing.run.all.processors}"/>
+        </condition>
+        <condition else="" property="ap.proc.none.internal" value="-proc:none">
+            <isfalse value="${annotation.processing.enabled}"/>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+        <property name="ap.cmd.line.internal" value=""/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target name="-deps-jar-init" unless="built-jar.properties">
+        <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+        <delete file="${built-jar.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+        <echo level="warn" message="Cycle detected: odfxsltrunner was already built"/>
+    </target>
+    <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-jar.properties}" verbose="false"/>
+        <property file="${built-jar.properties}" prefix="already.built.jar."/>
+        <antcall target="-warn-already-built-jar"/>
+        <propertyfile file="${built-jar.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target if="has.persistence.xml" name="-copy-persistence-xml">
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy todir="${build.classes.dir}/META-INF">
+            <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available" name="-do-jar-with-libraries-and-splashscreen">
+        <basename file="${application.splash}" property="splashscreen.basename"/>
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+        <j2seproject3:copylibs>
+            <customize>
+                <attribute name="Main-Class" value="${main.class}"/>
+                <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+            </customize>
+        </j2seproject3:copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries" unless="splashscreen.available">
+        <j2seproject3:copylibs>
+            <customize>
+                <attribute name="Main-Class" value="${main.class}"/>
+            </customize>
+        </j2seproject3:copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries-and-splashscreen,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" if="have.sources" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+            </fileset>
+        </javadoc>
+        <copy todir="${dist.javadoc.dir}">
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/doc-files/**"/>
+            </fileset>
+        </copy>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                JUNIT COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir=""/>
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir=""/>
+        <copy todir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="" srcdir=""/>
+        <copy todir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                JUNIT EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:junit testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:junit excludes="" includes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <!--
+                =======================
+                JUNIT DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+        <delete file="${test.report.file}"/>
+        <mkdir dir="${build.test.results.dir}"/>
+        <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+            <customize>
+                <syspropertyset>
+                    <propertyref prefix="test-sys-prop."/>
+                    <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                </syspropertyset>
+                <arg value="${test.class}"/>
+                <arg value="showoutput=true"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target name="-deps-clean-init" unless="built-clean.properties">
+        <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+        <delete file="${built-clean.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+        <echo level="warn" message="Cycle detected: odfxsltrunner was already built"/>
+    </target>
+    <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-clean.properties}" verbose="false"/>
+        <property file="${built-clean.properties}" prefix="already.built.clean."/>
+        <antcall target="-warn-already-built-clean"/>
+        <propertyfile file="${built-clean.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target name="-check-call-dep">
+        <property file="${call.built.properties}" prefix="already.built."/>
+        <condition property="should.call.dep">
+            <not>
+                <isset property="already.built.${call.subproject}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+        <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+            <propertyset>
+                <propertyref prefix="transfer."/>
+                <mapper from="transfer.*" to="*" type="glob"/>
+            </propertyset>
+        </ant>
+    </target>
+</project>
diff --git a/trunk/xslt-runner/nbproject/genfiles.properties b/trunk/xslt-runner/nbproject/genfiles.properties
new file mode 100644
index 0000000..1c9f4f5
--- /dev/null
+++ b/trunk/xslt-runner/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=21dfc495
+build.xml.script.CRC32=d2952f00
+build.xml.stylesheet.CRC32=be360661
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=c189be0b
+nbproject/build-impl.xml.script.CRC32=19b80129
+nbproject/build-impl.xml.stylesheet.CRC32=229523de@1.38.3.45
diff --git a/trunk/xslt-runner/nbproject/project.properties b/trunk/xslt-runner/nbproject/project.properties
new file mode 100644
index 0000000..c90855e
--- /dev/null
+++ b/trunk/xslt-runner/nbproject/project.properties
@@ -0,0 +1,67 @@
+application.desc=ODF XSLT Runner is a small Java application that allows you to apply XSLT stylesheets to XML streams included in ODF packages without extracting them from the package.
+application.homepage=http://odftoolkit.org/projects/conformancetools/pages/ODFXSLTRunner
+application.title=ODF XSLT Runner
+application.vendor=Oracle
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/odfxsltrunner.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+file.reference.odfdom.jar=../odfdom~developer/target/odfdom.jar
+file.reference.xercesImpl.jar=lib/xercesImpl.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${file.reference.odfdom.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}:\
+    ${libs.junit.classpath}:\
+    ${libs.junit_4.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=org.odftoolkit.odfxsltrunner.Main
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}:\
+    ${file.reference.xercesImpl.jar}
+source.encoding=UTF-8
+src.dir=src
diff --git a/trunk/xslt-runner/nbproject/project.xml b/trunk/xslt-runner/nbproject/project.xml
new file mode 100644
index 0000000..9c61cdb
--- /dev/null
+++ b/trunk/xslt-runner/nbproject/project.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>odfxsltrunner</name>
+            <minimum-ant-version>1.6.5</minimum-ant-version>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots/>
+        </data>
+        <references xmlns="http://www.netbeans.org/ns/ant-project-references/1"/>
+    </configuration>
+</project>
diff --git a/trunk/xslt-runner/pom.xml b/trunk/xslt-runner/pom.xml
new file mode 100644
index 0000000..556dcd0
--- /dev/null
+++ b/trunk/xslt-runner/pom.xml
@@ -0,0 +1,76 @@
+ <!-- 
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-->
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.odftoolkit</groupId>
+    <artifactId>odftoolkit</artifactId>
+    <version>0.6.1-incubating</version>
+  </parent>
+
+  <artifactId>xslt-runner</artifactId>
+  <name>ODF XSLT-Runner</name>
+  <version>1.2.3-incubating</version>
+  
+  <organization>
+    <name>The Apache Software Foundation</name>
+    <url>http://www.apache.org/</url>
+  </organization>
+  
+  <dependencies>
+	<dependency>
+      <groupId>${project.groupId}</groupId>
+	  <artifactId>odfdom-java</artifactId>
+      <version>0.8.10-incubating</version>
+	</dependency>
+    <dependency>
+        <groupId>xml-apis</groupId>
+        <artifactId>xml-apis</artifactId>
+    </dependency>	
+  </dependencies>
+
+  <!-- Build Settings -->
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+          <meminitial>512m</meminitial>
+          <maxmem>1024m</maxmem>
+          <showDeprecation>true</showDeprecation>
+        </configuration>
+    </plugin>
+        <plugin>
+            <groupId>org.apache.rat</groupId>
+            <artifactId>apache-rat-plugin</artifactId>
+            <configuration>
+                <excludes>
+                    <exclude>manifest.mf</exclude>
+                    <exclude>misc/odf-attribute-xref.ods</exclude>
+                    <exclude>nbproject/**</exclude>
+                </excludes>
+            </configuration>
+        </plugin>
+ </plugins>
+</build>
+</project>
diff --git a/trunk/xslt-runner/sample_xslt/adapt-html-hrefs.xsl b/trunk/xslt-runner/sample_xslt/adapt-html-hrefs.xsl
new file mode 100644
index 0000000..ae94edb
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/adapt-html-hrefs.xsl
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<xsl:stylesheet version="1.0" 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xhtml="http://www.w3.org/1999/xhtml"
+    exclude-result-prefixes="xsl">
+  <xsl:output method="xml" encoding="UTF-8" media-type="application/xhtml+xml" indent="no" omit-xml-declaration="no" doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" doctype-system="http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"/>
+
+  <xsl:param name="baseURI" select="'.'"/>
+  <xsl:variable name="adapt-fragments" select="false()"/>
+  
+  <xsl:variable name="baseURIDir" select="concat($baseURI,'/')"/>
+
+  <xsl:template match="xhtml:base">
+      <xsl:message>removing &lt;xhtml:base&gt;</xsl:message>
+  </xsl:template>
+
+  <xsl:template match="xhtml:a[starts-with(@href,$baseURIDir)]">
+      <xsl:variable name="rel-href" select="substring-after(@href,$baseURIDir)"/>
+      <xsl:variable name="fragment" select="substring-after($rel-href,'#')"/>
+      <xsl:variable name="raw-path">
+          <xsl:choose>
+              <xsl:when test="$fragment=''">
+                  <xsl:value-of select="$rel-href"/>
+              </xsl:when>
+              <xsl:otherwise>
+                  <xsl:value-of select="substring-before($rel-href,'#')"/>
+              </xsl:otherwise>
+          </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="path">
+          <xsl:choose>
+              <xsl:when test="starts-with($raw-path,'../')">
+                  <xsl:value-of select="substring($raw-path,4)"/>
+              </xsl:when>
+              <xsl:otherwise>
+                  <xsl:value-of select="$raw-path"/>
+              </xsl:otherwise>
+          </xsl:choose>
+      </xsl:variable>
+      <xsl:variable name="new-href">
+          <xsl:choose>
+              <xsl:when test="contains($path,'.odt')">
+                  <xsl:value-of select="concat(substring-before($path,'.odt'),'.html',substring-after($path,'.odt'))"/>
+              </xsl:when>
+              <xsl:otherwise>
+                  <xsl:value-of select="$path"/>
+              </xsl:otherwise>
+          </xsl:choose>
+          <xsl:choose>
+              <xsl:when test="$adapt-fragments and starts-with($fragment,'__RefHeading__')">
+                  <xsl:variable name="t">
+                      <xsl:call-template name="strip-trailing-space">
+                          <xsl:with-param name="text" select="translate(text(),'0123456789&#160;','           ')"/>
+                      </xsl:call-template>
+                  </xsl:variable>
+                  <xsl:variable name="text" select="substring(text(),1,string-length($t))"/>
+                  <xsl:value-of select="concat('#a_',translate($text, '&#xA;&amp;&lt;&gt;.,;: %()[]/\+', '_______________________________'))"/>
+              </xsl:when>
+              <xsl:when test="$fragment!=''">
+                  <xsl:value-of select="concat('#',$fragment)"/>
+              </xsl:when>
+          </xsl:choose>
+      </xsl:variable>
+      <xsl:copy>
+          <xsl:apply-templates select="@*[local-name(.)!='href']"/>
+          <xsl:attribute name="href">
+              <xsl:value-of select="$new-href"/>
+              <xsl:message>a &quot;<xsl:value-of select="text()"/>&quot;<xsl:if test="normalize-space(text())=''"> in &quot;<xsl:value-of select="parent::xhtml:p/text()"/>&quot;</xsl:if>: href=&quot;<xsl:value-of select="@href"/>&quot; -&gt; href=&quot;<xsl:value-of select="$new-href"/>&quot;</xsl:message>
+          </xsl:attribute>
+          <xsl:choose>
+              <xsl:when test="starts-with($fragment,'__RefHeading__')">
+                  <xsl:variable name="t">
+                      <xsl:call-template name="strip-trailing-space">
+                          <xsl:with-param name="text" select="translate(text(),'0123456789&#160;','           ')"/>
+                      </xsl:call-template>
+                  </xsl:variable>
+                  <xsl:variable name="text" select="substring(text(),1,string-length($t))"/>
+                  <xsl:value-of select="$text"/>
+              <xsl:message>a: &quot;<xsl:value-of select="text()"/>&quot; -&gt; &quot;<xsl:value-of select="$text"/>&quot;</xsl:message>
+              </xsl:when>
+              <xsl:otherwise>
+                  <xsl:apply-templates select="node()"/>
+              </xsl:otherwise>
+          </xsl:choose>
+      </xsl:copy>
+  </xsl:template>
+
+  <xsl:template name="strip-trailing-space">
+      <xsl:param name="text"/>
+      <xsl:choose>
+          <xsl:when test="substring($text,string-length($text))=' '">
+              <xsl:call-template name="strip-trailing-space">
+                  <xsl:with-param name="text" select="substring($text,1,string-length($text)-1)"/>
+              </xsl:call-template>
+          </xsl:when>
+          <xsl:otherwise>
+              <xsl:value-of select="$text"/>
+          </xsl:otherwise>
+      </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/add-default-values.xsl b/trunk/xslt-runner/sample_xslt/add-default-values.xsl
new file mode 100644
index 0000000..0831fd7
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/add-default-values.xsl
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<!-- This stylesheet inserts default values into the ODF v1.2 -->
+<!-- specification. The default values are taken from a flat -->
+<!-- ODF schema file whose location must be provided by the -->
+<!-- "xref-schema-file" parameter -->
+
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 
+                xmlns:rng="http://relaxng.org/ns/structure/1.0"                
+                xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"                
+                xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+                exclude-result-prefixes="rng xsl a"
+                version="1.0">    
+    <xsl:output method="xml" indent="no"/>    
+    
+        <!-- The flat schema file -->
+    <xsl:param name="xref-schema-file"/>
+    
+    <xsl:variable name="add-default-values" select="true()"/>
+    <xsl:variable name="keep-xref-anchors" select="true()"/>
+    
+    <xsl:variable name="attribute-prefix" select="'attribute-'"/>
+    <xsl:variable name="element-prefix" select="'element-'"/>
+ 
+    <!-- ********** -->
+    <!-- ** root ** -->
+    <!-- ********** -->
+    <xsl:template match="text:p[starts-with(.,$attribute-prefix)]">        
+        <xsl:variable name="attr-name" select="normalize-space(substring(., string-length($attribute-prefix)+1))"/>
+        <xsl:if test="not(document($xref-schema-file)/rng:grammar/rng:element/rng:attribute[@name=$attr-name])">
+            <xsl:message>No attribute definition found in schema for xref &quot;<xsl:value-of select="."/>&quot;</xsl:message>
+        </xsl:if>
+        <xsl:if test="$add-default-values">
+            <xsl:apply-templates select="document($xref-schema-file)/rng:grammar//rng:attribute[@name=$attr-name and @a:defaultValue]"/>
+        </xsl:if>
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>    
+        
+    <!-- default: copy everything. -->
+    <xsl:template match="@*|node()">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+    
+    <xsl:template match="rng:attribute">
+        <xsl:variable name="name" select="@name"/>
+        <xsl:variable name="defaultValue" select="@a:defaultValue"/>
+        <xsl:if test="not(preceding::rng:attribute[@name=$name and @a:defaultValue=$defaultValue])">
+            <xsl:variable name="hasAlsoNoDefault" select="count(ancestor::rng:grammar/rng:element[rng:attribute[@name=$name] and not(rng:attribute[@name=$name and @a:defaultValue])]) > 0"/>
+            <xsl:variable name="hasAlsoOtherDefault" select="count(ancestor::rng:grammar//rng:attribute[@name=$name and @a:defaultValue!=$defaultValue]) > 0"/>
+            <xsl:if test="$hasAlsoNoDefault">
+                <xsl:message>Some <xsl:value-of select="$name"/> attributes do not have a default value.</xsl:message>
+            </xsl:if>
+            <xsl:if test="$hasAlsoOtherDefault">
+                <xsl:message>Some <xsl:value-of select="$name"/> attributes do have a different default value than &quot;<xsl:value-of select="$defaultValue"/>&quot;.</xsl:message>
+            </xsl:if>
+            <xsl:call-template name="add-default-values">
+                <xsl:with-param name="listElements" select="$hasAlsoNoDefault or $hasAlsoOtherDefault"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>   
+
+    
+    <!-- select all <element> nodes in the file or in included files -->
+    <xsl:template name="add-default-values">
+        <xsl:param name="listElements" select="false()"/>
+        <text:p text:style-name="Default_20_Value">
+            <xsl:choose>
+                <xsl:when test="$listElements">
+                    <xsl:text>For </xsl:text>
+                    <xsl:call-template name="create-element-list"/>
+                    <xsl:text> the</xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>The</xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:text> default value for this attribute is </xsl:text>
+            <text:span text:style-name="Attribute_20_Value"><xsl:value-of select="@a:defaultValue"/></text:span>
+            <xsl:text>.</xsl:text>
+        </text:p>
+        <xsl:text>
+   </xsl:text>
+    </xsl:template>   
+
+    <xsl:template name="create-element-list">
+        <xsl:param name="attr-name" select="@name"/>
+        <xsl:param name="defaultValue" select="@a:defaultValue"/>
+        <!-- collect elements -->
+        <xsl:variable name="elements" select="ancestor::rng:grammar/rng:element[rng:attribute[@name=$attr-name and @a:defaultValue=$defaultValue]]"/>
+        <xsl:variable name="count" select="count($elements)"/>
+        <xsl:if test="$count = 1">
+            <xsl:text>a </xsl:text>
+        </xsl:if>
+        <xsl:for-each select="$elements">
+            <xsl:sort select="@name"/>
+            <xsl:variable name="name" select="@name"/>
+            <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:when test="position() = last()">
+                     <xsl:text> and </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                     <xsl:text>, </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+        </xsl:for-each>
+        <xsl:choose>
+            <xsl:when test="$count = 1">
+                <xsl:text> element</xsl:text>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:text> elements</xsl:text>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/check-completeness.xsl b/trunk/xslt-runner/sample_xslt/check-completeness.xsl
new file mode 100644
index 0000000..120cdff
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/check-completeness.xsl
Binary files differ
diff --git a/trunk/xslt-runner/sample_xslt/check-xrefs.xsl b/trunk/xslt-runner/sample_xslt/check-xrefs.xsl
new file mode 100644
index 0000000..9d0a8b3
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/check-xrefs.xsl
Binary files differ
diff --git a/trunk/xslt-runner/sample_xslt/create-attribute-xref.xsl b/trunk/xslt-runner/sample_xslt/create-attribute-xref.xsl
new file mode 100644
index 0000000..9a478a9
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/create-attribute-xref.xsl
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<!-- This stylesheet creates an content.xml for a spreadsheet document that -->
+<!-- lists all ODF elements and attributes                                  -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 
+                xmlns:rng="http://relaxng.org/ns/structure/1.0"                
+                xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"                
+            xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+            xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+            xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
+            xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+            xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+            xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+            xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
+            xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
+            xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+            xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+            xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+            xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+            xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+            xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xlink="http://www.w3.org/1999/xlink"
+            xmlns:math="http://www.w3.org/1998/Math/MathML"
+            xmlns:xforms="http://www.w3.org/2002/xforms"
+            xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+            xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+            xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"
+                xmlns="http://relaxng.org/ns/structure/1.0" version="1.0">    
+    <xsl:output method="xml" indent="yes"/>    
+        
+        
+    <!-- ********** -->
+    <!-- ** root ** -->
+    <!-- ********** -->
+    <xsl:template match="/rng:grammar">        
+        <xsl:variable name="root" select="."/>
+        <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0">
+            <office:scripts/>
+            <office:font-face-decls>
+                <style:font-face style:name="Albany" svg:font-family="Albany" style:font-family-generic="swiss" style:font-pitch="variable"/>
+                <style:font-face style:name="Andale Sans UI" svg:font-family="&apos;Andale Sans UI&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+                <style:font-face style:name="Lucidasans" svg:font-family="Lucidasans" style:font-family-generic="system" style:font-pitch="variable"/>
+            </office:font-face-decls>
+            <office:automatic-styles>
+                <style:style style:name="co1" style:family="table-column">
+                    <style:table-column-properties fo:break-before="auto" style:column-width="6.4cm"/>
+                </style:style>
+                <style:style style:name="co2" style:family="table-column">
+                    <style:table-column-properties fo:break-before="auto" style:column-width="7.4cm"/>
+                </style:style>
+                <style:style style:name="co3" style:family="table-column">
+                    <style:table-column-properties fo:break-before="auto" style:column-width="7.6cm"/>
+                </style:style>
+                <style:style style:name="co4" style:family="table-column">
+                    <style:table-column-properties fo:break-before="auto" style:column-width="7.1cm"/>
+                </style:style>
+                <style:style style:name="co5" style:family="table-column">
+                    <style:table-column-properties fo:break-before="auto" style:column-width="2.267cm"/>
+                </style:style>
+                <style:style style:name="ro1" style:family="table-row">
+                    <style:table-row-properties style:row-height="0.681cm" fo:break-before="auto" style:use-optimal-row-height="true"/>
+                </style:style>
+                <style:style style:name="ro2" style:family="table-row">
+                    <style:table-row-properties style:row-height="0.427cm" fo:break-before="auto" style:use-optimal-row-height="true"/>
+                </style:style>
+                <style:style style:name="ta1" style:family="table" style:master-page-name="Default">
+                    <style:table-properties table:display="true" style:writing-mode="lr-tb"/>
+                </style:style>
+            </office:automatic-styles>
+            <office:body>
+                <office:spreadsheet>
+                    <table:calculation-settings>
+                        <table:null-date table:date-value="1900-01-01"/>
+                    </table:calculation-settings>
+                    <table:table table:name="Sheet1" table:style-name="ta1" table:print="false">
+                        <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
+                        <table:table-column table:style-name="co1" table:default-cell-style-name="Heading"/>
+                        <table:table-column table:style-name="co2" table:default-cell-style-name="Heading"/>
+                        <table:table-column table:style-name="co3" table:default-cell-style-name="Heading"/>
+                        <table:table-column table:style-name="co4" table:default-cell-style-name="Heading"/>
+                        <table:table-row table:style-name="ro1">
+                            <table:table-cell office:value-type="string">
+                                <text:p>Element</text:p>
+                            </table:table-cell>
+                            <table:table-cell office:value-type="string">
+                                <text:p>Attribute</text:p>
+                            </table:table-cell>
+                            <table:table-cell office:value-type="string">
+                                <text:p>Datatype</text:p>
+                            </table:table-cell>
+                            <table:table-cell office:value-type="string">
+                                <text:p>Default Value</text:p>
+                            </table:table-cell>
+                        </table:table-row>
+                        
+                        <!-- select all <element> nodes in the file or in included files -->
+                        <xsl:for-each select="//rng:element">                
+                            <xsl:sort select="@name"/>
+                            <xsl:call-template name="create-attr-list"/>
+                        </xsl:for-each> 
+                        
+                    </table:table>
+                </office:spreadsheet>        
+            </office:body>
+        </office:document-content>
+   </xsl:template>    
+        
+    <xsl:template name="create-attr-list">
+        <xsl:variable name="element-name" select="@name"/>
+        <xsl:for-each select="rng:attribute">
+            <xsl:sort select="@name"/>
+            <table:table-row table:style-name="ro2">
+                <table:table-cell table:style-name="Default" office:value-type="string">
+                    <text:p>
+                        <xsl:value-of select="$element-name"/>
+                    </text:p>
+                </table:table-cell>
+                <table:table-cell table:style-name="Default" office:value-type="string">
+                    <text:p>
+                        <xsl:value-of select="@name"/>
+                    </text:p>
+                </table:table-cell>
+                <table:table-cell table:style-name="Default" office:value-type="string">
+                    <text:p>
+                        <xsl:apply-templates select="*" mode="print-elem"/>
+                    </text:p>
+                </table:table-cell>
+                <table:table-cell table:style-name="Default" office:value-type="string">
+                    <text:p>
+                        <xsl:if test="@a:defaultValue">
+                            <xsl:text>&quot;</xsl:text>
+                            <xsl:value-of select="@a:defaultValue"/>
+                            <xsl:text>&quot;</xsl:text>
+                        </xsl:if>
+                    </text:p>
+                </table:table-cell>
+            </table:table-row>
+        </xsl:for-each>   
+    </xsl:template>
+
+    <xsl:template match="*" mode="print-elem">
+        <xsl:text>&lt;</xsl:text><xsl:value-of select="name(.)"/>
+        <xsl:for-each select="@*">
+            <xsl:text> </xsl:text><xsl:value-of select="name(.)"/><xsl:text>=&quot;</xsl:text><xsl:value-of select="."/><xsl:text>&quot;</xsl:text>
+        </xsl:for-each>
+        <xsl:variable name="has-nodes" select="count(node()) > 0"/>
+        <xsl:if test="not($has-nodes)">
+            <xsl:text>/</xsl:text>
+        </xsl:if>
+        <xsl:text>&gt;</xsl:text>
+        <xsl:if test="$has-nodes">
+            <xsl:apply-templates mode="print-elem"/>
+            <xsl:text>&lt;/</xsl:text><xsl:value-of select="name(.)"/><xsl:text>&gt;</xsl:text>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="text()" mode="print-elem">
+        <xsl:value-of select="."/>
+    </xsl:template>
+    
+    
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/create-embedded-model.xsl b/trunk/xslt-runner/sample_xslt/create-embedded-model.xsl
new file mode 100644
index 0000000..1f16115
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/create-embedded-model.xsl
@@ -0,0 +1,1279 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<!-- This stylesheet inserts cross references into the ODF v1.-2 -->
+<!-- specification. The cross reference information is calculated -->
+<!-- from a flat ODF schema file whose location must be provided -->
+<!-- by the "xref-schema-file" parameter -->
+
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 
+                xmlns:rng="http://relaxng.org/ns/structure/1.0"                
+                xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"                
+                xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+                xmlns="http://relaxng.org/ns/structure/1.0" 
+                exclude-result-prefixes="rng xsl a"
+                version="1.0">    
+    <xsl:output method="xml" indent="no"/>    
+    
+    <!-- The flat schema file -->
+    <xsl:param name="xref-schema-file"/>
+    
+    <!-- Whether or not to keep "element-" and "attribute-" paragraphs. -->
+    <xsl:param name="keep-anchors" select="'false'"/>
+    
+    <!-- Whether or not to add element and attribute lists. -->
+    <xsl:param name="add-xrefs" select="'true'"/>
+    
+    <xsl:variable name="add-attr-elem-xrefs" select="$add-xrefs='true'"/>
+    <xsl:variable name="add-text-info" select="$add-xrefs='true'"/>
+    <xsl:variable name="keep-attr-elem-xrefs" select="false()"/>
+    
+    <xsl:variable name="add-xref-anchors" select="false()"/>
+    <xsl:variable name="keep-xref-anchors" select="$keep-anchors='true'"/>
+    <xsl:variable name="check-xref-anchors" select="true()"/>
+
+    <xsl:variable name="create-odf-references" select="true()"/>
+    <xsl:variable name="create-cardinality-info" select="false()"/>
+
+    <xsl:variable name="element-prefix" select="'element-'"/>
+    <xsl:variable name="attribute-prefix" select="'attribute-'"/>
+    <xsl:variable name="property-prefix" select="'property-'"/>
+    <xsl:variable name="datatype-prefix" select="'datatype-'"/>
+        
+    <!-- ********************************* -->
+    <!-- ** element anchors (element-*) ** -->
+    <!-- ********************************* -->
+    <xsl:template match="text:p[starts-with(.,$element-prefix)]">        
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+        <!-- Check element name -->
+        <xsl:variable name="element-name" select="normalize-space(substring(., string-length($element-prefix)+1))"/>
+        <xsl:variable name="element-defs" select="document($xref-schema-file)/rng:grammar/rng:element[@name=$element-name]"/>
+        <xsl:if test="$check-xref-anchors and not($element-defs)">
+            <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: No element definition found in schema for &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+        </xsl:if>
+        <!-- Add xrefs -->
+        <xsl:if test="$add-attr-elem-xrefs">
+            <xsl:apply-templates select="$element-defs"/>
+        </xsl:if>
+    </xsl:template>    
+
+    <!-- ************************************* -->
+    <!-- ** attribute anchors (attribute-*) ** -->
+    <!-- ************************************* -->
+    <xsl:template match="text:p[starts-with(.,$attribute-prefix) or starts-with(.,$property-prefix)]">        
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+        <!-- Check attribute name -->
+        <xsl:variable name="attr-name-raw" select="substring-after(normalize-space(.),'-')"/>
+        <xsl:variable name="has-elements" select="contains($attr-name-raw,'_')"/>
+        <xsl:variable name="attr-name">
+            <xsl:choose>
+                <xsl:when test="$has-elements">
+                    <xsl:value-of select="substring-before($attr-name-raw,'_')"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="$attr-name-raw"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="element-list">
+            <xsl:if test="$has-elements">
+                <xsl:value-of select="concat(substring($attr-name-raw,string-length($attr-name)+1),'_')"/>
+            </xsl:if>
+        </xsl:variable>
+        <xsl:if test="$check-xref-anchors and $has-elements">
+            <xsl:call-template name="check-element-list">
+                <xsl:with-param name="element-list" select="$element-list"/>
+            </xsl:call-template>
+        </xsl:if>
+        <xsl:variable name="fp" select="starts-with(.,$property-prefix)"/>
+        <xsl:variable name="attr-defs" select="document($xref-schema-file)/rng:grammar/rng:element//rng:attribute[@name=$attr-name]"/>
+        <xsl:if test="$check-xref-anchors and not($attr-defs)">
+            <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: No attribute definition found in schema for &quot;<xsl:value-of select="$attr-name"/>&quot;.</xsl:message>
+        </xsl:if>
+        <!-- Add xrefs -->
+        <xsl:if test="$add-attr-elem-xrefs">
+            <xsl:apply-templates select="$attr-defs">
+                <xsl:with-param name="element-list" select="$element-list"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:apply-templates>
+        </xsl:if>
+    </xsl:template>    
+    
+    <xsl:template name="check-element-list">
+        <xsl:param name="element-list"/>
+        <xsl:param name="list" select="substring($element-list,string-length($element-prefix)+2)"/>
+        <xsl:variable name="element-name" select="substring-before($list,'_')"/>
+        <xsl:if test="not(document($xref-schema-file)/rng:grammar/rng:element[@name=$element-name])">
+            <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: No element definition found in schema for &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+        </xsl:if>
+        <xsl:variable name="remainder" select="substring-after($list,'_')"/>
+        <xsl:if test="$remainder">
+            <xsl:call-template name="check-element-list">
+                <xsl:with-param name="element-list" select="concat('_',$remainder)"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ************************* -->
+    <!-- ** existing references ** -->
+    <!-- ************************* -->
+    <xsl:template match="text:p[@text:style-name='Attribute_20_List' or @text:style-name='Child_20_Element_20_List' or @text:style-name='Parent_20_Element_20_List' or @text:style-name='Attribute_20_Value_20_List']">
+        <!-- Remove them if $keep-attr-elem-xrefs is false -->
+        <xsl:if test="$keep-attr-elem-xrefs">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ****************************************** -->
+    <!-- ** Headings for elements and attributes ** -->
+    <!-- ****************************************** -->
+    <xsl:template match="text:h[contains(.,':')]">
+        <!-- get element or attribute name -->
+        <xsl:variable name="tag">
+            <xsl:choose>
+                <xsl:when test="contains(.,'(')">
+                    <xsl:value-of select="normalize-space(substring-before(.,'('))"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="normalize-space(.)"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <!-- create ODF ref-mark elements if it is a avlid element or attribute name -->
+        <xsl:choose>
+            <xsl:when test="starts-with($tag, '&lt;') and contains($tag,'&gt;')">
+                <xsl:copy>
+                    <xsl:apply-templates select="@*"/>
+                    <xsl:variable name="is-in-attributes" select="preceding::text:h[@text:outline-level='1']='General Attributes'"/>
+                    <xsl:call-template name="create-element-ref-mark-start">
+                         <xsl:with-param name="tag" select="$tag"/>
+                         <xsl:with-param name="is-in-attributes" select="$is-in-attributes"/>
+                    </xsl:call-template>
+                    <xsl:apply-templates select="node()"/>
+                    <xsl:call-template name="create-element-ref-mark-end">
+                         <xsl:with-param name="tag" select="$tag"/>
+                         <xsl:with-param name="is-in-attributes" select="$is-in-attributes"/>
+                    </xsl:call-template>
+                </xsl:copy>
+            </xsl:when>
+            <xsl:when test="starts-with($tag, 'odf:') or starts-with($tag, 'pkg:')">
+                <!-- OWL -->
+                <xsl:copy>
+                    <xsl:apply-templates select="@*|node()"/>
+                </xsl:copy>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:variable name="attr-name" select="$tag"/>
+                <xsl:variable name="fp" select="preceding::text:h[@text:outline-level='1'][last()]='Formatting Attributes'"/>
+                <xsl:if test="$check-xref-anchors">
+                    <xsl:choose>
+                        <xsl:when test="not(document($xref-schema-file)/rng:grammar/rng:element[(starts-with(@name,'style:') and contains(@name,'-properties'))=$fp]//rng:attribute[@name=$attr-name])">
+                            <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No attribute definition found in schema for &quot;<xsl:value-of select="$attr-name"/>&quot;<xsl:if test="$fp"> (property)</xsl:if>.</xsl:message>
+                        </xsl:when>
+                        <xsl:when test="$fp and not(//text:p[starts-with(.,$property-prefix) and (normalize-space(.)=concat($property-prefix,$attr-name) or starts-with(.,concat($property-prefix,$attr-name,'_')))])">
+                            <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No attribute xref found for &quot;<xsl:value-of select="$attr-name"/>&quot; (property).</xsl:message>
+                        </xsl:when>
+                        <xsl:when test="not($fp) and not(//text:p[starts-with(.,$attribute-prefix) and (normalize-space(.)=concat($attribute-prefix,$attr-name) or starts-with(.,concat($attribute-prefix,$attr-name,'_')))])">
+                            <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No attribute xref found for &quot;<xsl:value-of select="$attr-name"/>&quot;.</xsl:message>
+                        </xsl:when>
+                    </xsl:choose>
+                </xsl:if>
+                <xsl:copy>
+                    <xsl:apply-templates select="@*"/>
+                    <xsl:variable name="ref-name">
+                        <xsl:choose>
+                            <xsl:when test="$fp"><xsl:value-of select="concat($property-prefix,$attr-name)"/></xsl:when>
+                            <xsl:otherwise><xsl:value-of select="concat($attribute-prefix,$attr-name)"/></xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:variable>
+                    <xsl:if test="$create-odf-references">
+                        <text:reference-mark-start text:name="{$ref-name}"/>
+                    </xsl:if>
+                    <xsl:apply-templates select="node()"/>
+                    <xsl:if test="$create-odf-references">
+                        <text:reference-mark-end text:name="{$ref-name}"/>
+                    </xsl:if>
+                </xsl:copy>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    <xsl:template match="text:reference-mark-start|text:reference-mark-end">
+        <xsl:if test="not($create-odf-references) or not(starts-with(@text:name,$attribute-prefix) or starts-with(@text:name,$property-prefix) or starts-with(@text:name,$element-prefix))">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+    
+    <xsl:template name="create-element-ref-mark-start">
+        <xsl:param name="tag"/>
+        <xsl:param name="is-in-attributes"/>
+        <xsl:variable name="element-name" select="substring-after(substring-before($tag,'&gt;'),'&lt;')"/>
+        <xsl:variable name="remainder" select="substring-after($tag,'&gt;')"/>
+        
+        <xsl:if test="$check-xref-anchors">
+            <xsl:choose>
+                <xsl:when test="not(document($xref-schema-file)/rng:grammar/rng:element[@name=$element-name])">
+                    <xsl:message>Heading: &quot;<xsl:value-of select="."/>&quot;: No element definition found in schema for element &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+                </xsl:when>
+                <xsl:when test="not(//text:p[starts-with(.,$element-prefix) and normalize-space(.)=concat($element-prefix,$element-name)])">
+                    <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No element xref found for element &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+                </xsl:when>
+            </xsl:choose>
+        </xsl:if>
+
+        <xsl:if test="$create-odf-references and not($is-in-attributes)">
+            <xsl:variable name="ref-name" select="concat($element-prefix,$element-name)"/>
+            <text:reference-mark-start text:name="{$ref-name}"/>
+        </xsl:if>
+        
+        <xsl:if test="contains($remainder,'&lt;') and contains(substring-after($remainder,'&lt;'),'&gt;')">
+            <xsl:call-template name="create-element-ref-mark-start">
+                <xsl:with-param name="tag" select="$remainder"/>
+                <xsl:with-param name="is-in-attributes" select="$is-in-attributes"/>
+            </xsl:call-template>
+        </xsl:if>        
+    </xsl:template>
+    
+    <xsl:template name="create-element-ref-mark-end">
+        <xsl:param name="tag"/>
+        <xsl:param name="is-in-attributes"/>
+        <xsl:if test="not($is-in-attributes)">
+            <xsl:variable name="element-name" select="substring-after(substring-before($tag,'&gt;'),'&lt;')"/>
+            <xsl:variable name="remainder" select="substring-after($tag,'&gt;')"/>
+
+            <xsl:if test="contains($remainder,'&lt;') and contains(substring-after($remainder,'&lt;'),'&gt;')">
+                <xsl:call-template name="create-element-ref-mark-end">
+                    <xsl:with-param name="tag" select="$remainder"/>
+                    <xsl:with-param name="is-in-attributes" select="$is-in-attributes"/>
+                </xsl:call-template>
+            </xsl:if>
+
+            <xsl:if test="$create-odf-references">
+                <xsl:variable name="ref-name" select="concat($element-prefix,$element-name)"/>
+                <text:reference-mark-end text:name="{$ref-name}"/>
+            </xsl:if>        
+        </xsl:if>
+    </xsl:template>
+    
+    <!-- default: copy everything. -->
+    <xsl:template match="@*|node()">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+    
+    <!-- select all <element> nodes in the file or in included files -->
+    <xsl:template match="rng:element">                
+        <xsl:call-template name="create-elem-root-elem-list"/>
+        <xsl:call-template name="create-elem-parent-elem-list"/>
+        <xsl:call-template name="create-content-model"/>
+        <!--
+        <xsl:call-template name="create-attr-list"/>
+        <xsl:call-template name="create-child-elem-list"/>
+        <xsl:call-template name="create-text-info"/>
+        -->
+    </xsl:template>   
+
+    <!-- select all <element> nodes in the file or in included files -->
+    <xsl:template match="rng:attribute">
+        <xsl:param name="element-list"/>
+        <xsl:param name="fp"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:if test="not(preceding::rng:attribute[@name=$name])">
+            <xsl:call-template name="create-attr-parent-elem-list">
+                <xsl:with-param name="element-list" select="$element-list"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:call-template>
+            <xsl:call-template name="create-attr-value-list">
+                <xsl:with-param name="element-list" select="$element-list"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>   
+    
+    <xsl:template name="create-attr-list">
+        <xsl:variable name="count" select="count(rng:attribute)"/>
+        <xsl:variable name="fp" select="starts-with(@name,'style:') and contains(@name,'-properties')"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Element">
+                <xsl:text>&lt;</xsl:text>
+                <xsl:value-of select="@name"/>
+                <xsl:text>&gt;</xsl:text>
+            </text:span>
+            <xsl:text> element </xsl:text>
+            <xsl:choose>
+                <xsl:when test="$count > 0">
+                    <xsl:choose>
+                        <xsl:when test="$count = 1">
+                            <xsl:text> has the following attribute: </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text> has the following attributes: </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <!-- collect attributes -->
+                    <xsl:for-each select="rng:attribute">
+                        <xsl:sort select="@name"/>
+                        <xsl:variable name="name" select="@name"/>
+                        <xsl:if test="not(preceding-sibling::rng:attribute[@name=$name])">
+                            <xsl:choose>
+                                <xsl:when test="position() = 1"/>
+                                <xsl:when test="position() = last()">
+                                    <xsl:text> and </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>, </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                            <text:span text:style-name="Attribute"><xsl:value-of select="@name"/></text:span>
+                            <xsl:if test="$create-cardinality-info">
+                                <xsl:choose>
+                                    <xsl:when test="not(@condition) or @condition='' or @condition='interleave' or @condition='interleave/interleave'">
+                                        <!-- mandatory: no hint -->
+                                    </xsl:when>
+                                    <xsl:when test="contains(@condition,'optional') and not(contains(@condition,'group') or contains(@condition,'choice'))">
+                                        <xsl:text>(?)</xsl:text>
+                                    </xsl:when>
+                                    <xsl:when test="@condition='zeroOrMore'">
+                                        <xsl:text>(?)</xsl:text>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:message>Attribute <xsl:value-of select="@name"/>: Complex cardinality: <xsl:value-of select="@condition"/></xsl:message>
+                                        <xsl:text>(!)</xsl:text>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:if>
+                            <xsl:variable name="ref-name">
+                                <xsl:choose>
+                                    <xsl:when test="$fp"><xsl:value-of select="concat($property-prefix,@name)"/></xsl:when>
+                                    <xsl:otherwise><xsl:value-of select="concat($attribute-prefix,@name)"/></xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:variable>
+                            <xsl:text> </xsl:text><text:reference-ref text:ref-name="{$ref-name}" text:reference-format="chapter">?</text:reference-ref>
+                        </xsl:if>
+                    </xsl:for-each>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text> has no attributes</xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template name="create-child-elem-list">
+        <xsl:variable name="count" select="count(rng:element)"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Child_20_Element_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Element">
+                <xsl:text>&lt;</xsl:text>
+                <xsl:value-of select="@name"/>
+                <xsl:text>&gt;</xsl:text>
+            </text:span>
+            <xsl:text> element </xsl:text>
+            <xsl:choose>
+                <xsl:when test="$count > 0">
+                    <xsl:choose>
+                        <xsl:when test="$count = 1">
+                            <xsl:text> has the following child element: </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text> has the following child elements: </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <!-- collect elements -->
+                    <xsl:for-each select="rng:element">
+                        <xsl:sort select="@name"/>
+                        <xsl:variable name="name" select="@name"/>
+                        <xsl:if test="not(preceding-sibling::rng:element[@name=$name])">
+                            <xsl:choose>
+                                <xsl:when test="position() = 1"/>
+                                <xsl:when test="position() = last()">
+                                    <xsl:text> and </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>, </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                            <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+                        </xsl:if>
+                    </xsl:for-each>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text> has no child elements</xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template name="create-text-info">
+        <xsl:if test="rng:text and $add-text-info">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Child_20_Element_20_List">
+                <xsl:text>The </xsl:text>
+                <text:span text:style-name="Element">
+                    <xsl:text>&lt;</xsl:text>
+                    <xsl:value-of select="@name"/>
+                    <xsl:text>&gt;</xsl:text>
+                </text:span>
+                <xsl:text> element has text content.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template name="create-content-model">
+        <xsl:variable name="count" select="count(*)"/>
+        <xsl:variable name="fp" select="starts-with(@name,'style:') and contains(@name,'-properties')"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_List">
+            <xsl:text>element </xsl:text>
+            <xsl:value-of select="@name"/>
+            <xsl:text> </xsl:text>
+            <xsl:call-template name="expand-content-model">
+                <xsl:with-param name="fp" select="$fp"/>
+                <xsl:with-param name="bracket" select="'{'"/>
+            </xsl:call-template>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:interleave" mode="content-model">
+        <xsl:param name="fp"/>
+        <!--
+        <xsl:variable name="count" select="count(*[not(self::rng:interleave)]|rng:interleave/*)"/>
+        <xsl:if test="$count>1">
+            <xsl:text>( </xsl:text>
+        </xsl:if>
+        <xsl:for-each select="*[not(self::rng:interleave)]|rng:interleave/*">
+             <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:otherwise>
+                    <xsl:value-of select="'&amp;'"/>
+                    <xsl:text> </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="content-model">
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+        <xsl:if test="$count>1">
+            <xsl:text>)</xsl:text>
+        </xsl:if>
+        <xsl:text> </xsl:text>
+        -->
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="delimiter" select="'&amp;'"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:oneOrMore" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="operator" select="'+'"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:zeroOrMore" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="operator" select="'*'"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:optional[count(*)=1 and (rng:attribute or rng:element)]" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:apply-templates mode="content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="operator" select="'?'"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="rng:optional" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="operator" select="'?'"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="delimiter" select="'|'"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:group" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:mixed" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:text>mixed </xsl:text>
+        <xsl:call-template name="expand-content-model">
+            <xsl:with-param name="fp" select="$fp"/>
+            <xsl:with-param name="bracket" select="'{'"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <xsl:template match="rng:element" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:param name="operator" select=""/>
+        <xsl:text>element </xsl:text>
+        <xsl:value-of select="@name"/>
+        <xsl:text> { .. }</xsl:text>
+        <xsl:if test="$operator!=''">
+             <xsl:value-of select="$operator"/>
+        </xsl:if>
+        <xsl:text> # </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,@name)}" text:reference-format="chapter">?</text:reference-ref>
+        <text:line-break/>
+    </xsl:template>
+
+    <xsl:template match="rng:empty" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:text>empty</xsl:text>
+        <text:line-break/>
+    </xsl:template>
+
+    <xsl:template match="rng:text" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:text>text</xsl:text>
+        <text:line-break/>
+    </xsl:template>
+
+    <xsl:template match="*" mode="content-model">
+        <xsl:message>*** Unkown content model element <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+
+    <xsl:template match="rng:attribute" mode="content-model">
+        <xsl:param name="fp"/>
+        <xsl:param name="operator" select=""/>
+        <xsl:text>attribute </xsl:text>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:value-of select="$name"/>
+        <xsl:text> { </xsl:text>
+        <xsl:choose>
+            <xsl:when test="count(ancestor::rng:element//rng:attribute[@name=$name])>1">
+                <xsl:apply-templates mode="content-model-attr-value"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:text>..</xsl:text>
+            </xsl:otherwise>
+        </xsl:choose>
+        <xsl:text> }</xsl:text>
+        <xsl:if test="$operator!=''">
+             <xsl:value-of select="$operator"/>
+        </xsl:if>
+        <xsl:variable name="ref-name">
+            <xsl:choose>
+                <xsl:when test="$fp"><xsl:value-of select="concat($property-prefix,@name)"/></xsl:when>
+                <xsl:otherwise><xsl:value-of select="concat($attribute-prefix,@name)"/></xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:text> # </xsl:text><text:reference-ref text:ref-name="{$ref-name}" text:reference-format="chapter">?</text:reference-ref>
+        <text:line-break/>
+    </xsl:template>
+
+    <xsl:template match="rng:value" mode="content-model-attr-value">
+        <xsl:text>&quot;</xsl:text>
+        <xsl:value-of select="."/>
+        <xsl:text>&quot;</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="rng:empty" mode="content-model-attr-value">
+        <xsl:text>empty</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="content-model-attr-value">
+        <xsl:message>attribute value choice</xsl:message>
+        <xsl:text>( </xsl:text>
+        <xsl:for-each select="*">
+             <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:otherwise>
+                    <xsl:text>| </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="content-model-attr-value"/>
+        </xsl:for-each>
+        <xsl:text> )</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="content-model-attr-value">
+        <xsl:value-of select="@name"/>
+        <xsl:message>attribute value type: <xsl:value-of select="@name"/></xsl:message>
+    </xsl:template>
+
+
+    <xsl:template match="*" mode="content-model-attr-value">
+        <xsl:message>*** Unkown content model attr value element <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template name="expand-content-model">
+        <xsl:param name="fp"/>
+        <xsl:param name="bracket" select="'('"/>
+        <xsl:param name="delimiter" select="','"/>
+        <xsl:param name="operator" select=""/>
+        <xsl:variable name="count" select="count(*)"/>
+        <xsl:choose>
+            <xsl:when test="$bracket='{'">
+                <xsl:text>{</xsl:text>
+                <text:line-break/>
+            </xsl:when>
+            <xsl:when test="$count>1">
+                <xsl:value-of select="$bracket"/>
+                <xsl:text> </xsl:text>
+            </xsl:when>
+        </xsl:choose>
+        <xsl:for-each select="*">
+             <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:otherwise>
+                    <xsl:value-of select="$delimiter"/>
+                    <xsl:text> </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="content-model">
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+        <xsl:choose>
+            <xsl:when test="$bracket='{'">
+                <xsl:text>}</xsl:text>
+            </xsl:when>
+            <xsl:when test="$count>1">
+                <xsl:text>)</xsl:text>
+            </xsl:when>
+        </xsl:choose>
+        <xsl:if test="$operator!=''">
+            <xsl:value-of select="$operator"/>
+        </xsl:if>
+        <xsl:if test="$bracket='{' or $count>1">
+            <text:line-break/>
+        </xsl:if>
+    </xsl:template>
+
+
+    <xsl:template name="create-attr-parent-elem-list">
+        <xsl:param name="attr-name" select="@name"/>
+        <xsl:param name="element-list"/>
+        <xsl:param name="fp"/>
+        <xsl:variable name="parents" select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_'))) and .//rng:attribute[@name=$attr-name]]"/>
+        <xsl:variable name="count" select="count($parents)"/>
+        <xsl:if test="$check-xref-anchors and $count=0">
+            <xsl:message>&quot;<xsl:value-of select="$attr-name"/>&quot; <xsl:if test="$fp"> (property)</xsl:if><xsl:if test="$element-list"> (<xsl:value-of select="$element-list"/>)</xsl:if>: No parent elements found in schema.</xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Parent_20_Element_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Attribute">
+                <xsl:value-of select="$attr-name"/>
+            </text:span>
+            <xsl:text> attribute </xsl:text>
+            <xsl:choose>
+                <xsl:when test="$count = 1">
+                    <xsl:text> is usable with the following element: </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text> is usable with the following elements: </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <!-- collect elements -->
+            <xsl:for-each select="$parents">
+                <xsl:sort select="@name"/>
+                <xsl:variable name="name" select="@name"/>
+                <xsl:choose>
+                    <xsl:when test="position() = 1"/>
+                    <xsl:when test="position() = last()">
+                        <xsl:text> and </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>, </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template name="create-attr-value-list">
+        <xsl:param name="attr-name" select="@name"/>
+        <xsl:param name="element-list"/>
+        <xsl:param name="fp"/>
+        <xsl:choose>
+            <xsl:when test="$attr-name='text:id' or $attr-name='form:id' or $attr-name='office:value'">
+                <xsl:choose>
+                    <xsl:when test="not($element-list)">
+                        <xsl:apply-templates select="*" mode="attr-value">
+                            <xsl:with-param name="attr-name" select="$attr-name"/>
+                        </xsl:apply-templates>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:apply-templates select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_')))]//rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                            <xsl:with-param name="attr-name" select="$attr-name"/>
+                        </xsl:apply-templates>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:when test="$attr-name='chart:legend-position' or 
+                            $attr-name='draw:concave' or
+                            $attr-name='form:image-position' or
+                            $attr-name='meta:value-type' or
+                            $attr-name='style:legend-expansion' or
+                            $attr-name='style:family' or
+                            $attr-name='style:type' or
+                            $attr-name='table:member-type' or 
+                            ($attr-name='table:orientation' and contains($element-list,'table:data-pilot-field'))or 
+                            $attr-name='table:sort-mode' or
+                            ($attr-name='text:display' and (contains($element-list,'text:section') or contains($element-list,'style:text-properties'))) or
+                            $attr-name='chart:symbol-type'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_'))) and .//rng:attribute[@name=$attr-name]][1]" mode="merge-attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$attr-name='office:value-type'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[@name='text:variable-decl']//rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$attr-name='style:num-format'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[@name='text:page-number']" mode="merge-attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_'))) and count(.//rng:attribute[@name=$attr-name])>1]">
+                <xsl:message>Attribute <xsl:value-of select="$attr-name"/>: Multiple attribute definitions do exist for at least one element.</xsl:message>
+            </xsl:when>
+            <xsl:when test="$attr-name='xlink:show' or
+                            $attr-name='xlink:actuate' or
+                            $attr-name='text:reference-format'">
+                <xsl:message>Attribute <xsl:value-of select="$attr-name"/>: No type info added (type too complex).</xsl:message>
+            </xsl:when>
+            <xsl:when test="not($element-list)">
+                <xsl:apply-templates select="*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_')))]//rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:call-template name="new-line"/>
+        <xsl:choose>
+            <xsl:when test="//text:p[.=concat($datatype-prefix,$name)]">
+                <text:p text:style-name="Attribute_20_Value_20_List">
+                    <xsl:text>The </xsl:text>
+                    <text:span text:style-name="Attribute">
+                        <xsl:value-of select="$attr-name"/>
+                    </text:span>
+                    <xsl:text> attribute has the data type </xsl:text>
+                    <text:span text:style-name="Datatype">
+                        <xsl:value-of select="$name"/>
+                    </text:span>
+                    <xsl:text>.</xsl:text>
+                </text:p>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="*">
+                <xsl:choose>
+                    <xsl:when test="position() = 1"/>
+                    <xsl:when test="position() = last()">
+                        <xsl:text> or </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>, </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:value" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:if test="not(starts-with($attr-name,'xlink:'))">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Attribute_20_Value_20_List">
+                <xsl:text>The only value of the </xsl:text>
+                <text:span text:style-name="Attribute">
+                    <xsl:value-of select="$attr-name"/>
+                </text:span>
+                <xsl:text> attribute is </xsl:text>
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+                <xsl:text>.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="rng:list[rng:zeroOrMore]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>space separated possibly empty lists of </xsl:text>
+            <xsl:apply-templates select="*/*" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[rng:oneOrMore]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>space separated non-empty lists of </xsl:text>
+            <xsl:apply-templates select="*/*" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=2 and count(rng:ref)=2]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:apply-templates select="rng:ref[1]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text> followed by </xsl:text>
+            <xsl:apply-templates select="rng:ref[2]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=2 and count(rng:choice)=1 and count(rng:optional/rng:ref)=1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:apply-templates select="*[1]" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text> optionally followed by </xsl:text>
+            <xsl:apply-templates select="rng:optional/*" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=4 and count(rng:ref[@name='integer'])=4]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>four space separated values of type </xsl:text>
+            <text:span text:style-name="Datatype">
+                <xsl:value-of select="@name"/>
+            </text:span>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=3 and count(rng:ref[@name='positiveLength'])=3]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>three space separated values of type </xsl:text>
+            <text:span text:style-name="Datatype">
+                <xsl:value-of select="@name"/>
+            </text:span>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:attribute[@name='style:mirror']/rng:choice" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>+++ special processing <xsl:value-of select="$attr-name"/></xsl:message>
+        <xsl:if test="not(count(*)=5 and count(rng:value)=2 and count(rng:ref[@name='horizontal-mirror'])=1 and count(rng:list)=2)">
+            <xsl:message> Unexpected content <xsl:value-of select="$attr-name"/></xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="rng:value|ancestor::rng:grammar/rng:element/rng:define[@name='horizontal-mirror']/rng:choice/rng:value">
+                <xsl:choose>
+                    <xsl:when test="position() = 1"/>
+                    <xsl:otherwise>
+                        <xsl:text>, </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:for-each>
+            <xsl:apply-templates select="rng:list[1]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text> or </xsl:text>
+            <xsl:apply-templates select="rng:list[2]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:attribute[@name='draw:line-skew']/rng:list" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>+++ special processing <xsl:value-of select="$attr-name"/></xsl:message>
+        <xsl:if test="not(count(*)=2 and count(rng:ref[@name='length'])=1 and count(rng:optional)=1 and count(rng:optional/*)=2)">
+            <xsl:message> Unexpected content <xsl:value-of select="$attr-name"/></xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>one, two or three space separated </xsl:text>
+            <xsl:apply-templates select="rng:ref" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+
+    <xsl:template match="*" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unrecognized value element: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template match="rng:element" mode="merge-attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select=".//rng:attribute[@name=$attr-name]">
+                <xsl:variable name="first" select="position() = 1"/>
+                <xsl:variable name="last" select="position() = last()"/>
+                <xsl:for-each select=".//rng:value|.//rng:ref|.//rng:empty">
+                    <xsl:choose>
+                        <xsl:when test="$first and position() = 1"/>
+                        <xsl:when test="$last and position() = last()">
+                            <xsl:text> or </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>, </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <xsl:apply-templates select="." mode="individual-value">
+                        <xsl:with-param name="attr-name" select="$attr-name"/>
+                    </xsl:apply-templates>
+                </xsl:for-each>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:choose>
+            <xsl:when test="//text:p[.=concat($datatype-prefix,$name)]">
+                <xsl:text>values of type </xsl:text>
+                <text:span text:style-name="Datatype">
+                    <xsl:value-of select="$name"/>
+                </text:span>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*" mode="attr-list-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+         </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>one of these values: </xsl:text>
+        <xsl:for-each select="*">
+            <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:when test="position() = last()">
+                    <xsl:text>, or </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>, </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template match="*" mode="attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unrecognized value element in list: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+
+    <xsl:template match="rng:value" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <text:span text:style-name="Attribute_20_Value">
+           <xsl:value-of select="."/>
+        </text:span>
+    </xsl:template>
+
+    <xsl:template match="rng:empty" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>an empty string</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:choose>
+            <xsl:when test="//text:p[.=concat($datatype-prefix,$name)]">
+                <xsl:text>a value of type </xsl:text>
+                <text:span text:style-name="Datatype">
+                    <xsl:value-of select="@name"/>
+                </text:span>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*" mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+         </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>one of these values: </xsl:text>
+        <xsl:for-each select="*">
+            <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:when test="position() = last()">
+                    <xsl:text> or </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>, </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template match="rng:list[rng:oneOrMore and count(*)=1]" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>a non-empty space separated list of </xsl:text>
+        <xsl:apply-templates select="*/*" mode="attr-list-value">
+             <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=2 and (count(rng:ref) + count(rng:choice))=2]" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:apply-templates select="*[1]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        <xsl:text> followed by </xsl:text>
+        <xsl:apply-templates select="*[2]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=2 and (count(rng:ref) + count(rng:value))=2]" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:apply-templates select="*[1]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        <xsl:text> followed by </xsl:text>
+        <xsl:apply-templates select="*[2]" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+    </xsl:template>
+
+
+    <xsl:template match="rng:data[@type='double' and count(rng:param)=2]" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>a value of type </xsl:text>
+        <text:span text:style-name="Datatype">
+            <xsl:value-of select="@type"/>
+        </text:span>
+        <xsl:text> in the range [</xsl:text>
+        <text:span text:style-name="Attribute_20_Value">
+            <xsl:value-of select="rng:param[@name='minInclusive']"/>
+        </text:span>
+        <xsl:text>,</xsl:text>
+        <text:span text:style-name="Attribute_20_Value">
+            <xsl:value-of select="rng:param[@name='maxInclusive']"/>
+        </text:span>
+        <xsl:text>]</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="*" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unsupported individual value: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template name="print-the-values">
+        <xsl:param name="attr-name"/>
+        <xsl:text>The values of the </xsl:text>
+        <text:span text:style-name="Attribute">
+             <xsl:value-of select="$attr-name"/>
+        </text:span>
+        <xsl:text> attribute are </xsl:text>
+    </xsl:template>
+
+
+    <xsl:template name="create-elem-parent-elem-list">
+        <xsl:param name="elem-name" select="@name"/>
+        <xsl:variable name="parents" select="ancestor::rng:grammar/rng:element[.//rng:element[@name=$elem-name]]"/>
+        <xsl:variable name="count" select="count($parents)"/>
+        <xsl:if test="$count > 0">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Parent_20_Element_20_List">
+                <xsl:text>The </xsl:text>
+                <text:span text:style-name="Element">
+                    <xsl:text>&lt;</xsl:text><xsl:value-of select="$elem-name"/><xsl:text>&gt;</xsl:text>
+                </text:span>
+                <xsl:text> element </xsl:text>
+                <xsl:choose>
+                    <xsl:when test="$count = 1">
+                        <xsl:text> is usable with the following element: </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text> is usable used with the following elements: </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <!-- collect elements -->
+                <xsl:for-each select="$parents">
+                    <xsl:sort select="@name"/>
+                    <xsl:variable name="name" select="@name"/>
+                    <xsl:choose>
+                        <xsl:when test="position() = 1"/>
+                        <xsl:when test="position() = last()">
+                            <xsl:text> and </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>, </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+                </xsl:for-each>
+                <xsl:text>.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template name="create-elem-root-elem-list">
+        <xsl:param name="elem-name" select="@name"/>
+        <xsl:if test="ancestor::rng:grammar/rng:start/rng:element[@name=$elem-name]">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Parent_20_Element_20_List">
+                <xsl:text>The </xsl:text>
+                <text:span text:style-name="Element">
+                    <xsl:text>&lt;</xsl:text><xsl:value-of select="$elem-name"/><xsl:text>&gt;</xsl:text>
+                </text:span>
+                <xsl:text> element is a root element.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+    
+    <xsl:template name="new-line">
+        <xsl:text>
+</xsl:text>
+    </xsl:template>
+    
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/create-embedded-xref.xsl b/trunk/xslt-runner/sample_xslt/create-embedded-xref.xsl
new file mode 100644
index 0000000..af252b4
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/create-embedded-xref.xsl
@@ -0,0 +1,1991 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<!-- This stylesheet inserts cross references into the ODF v1.-2 -->
+<!-- specification. The cross reference information is calculated -->
+<!-- from a flat ODF schema file whose location must be provided -->
+<!-- by the "xref-schema-file" parameter -->
+
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 
+                xmlns:rng="http://relaxng.org/ns/structure/1.0"                
+                xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"                
+                xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+                xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+                xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns="http://relaxng.org/ns/structure/1.0" 
+                exclude-result-prefixes="rng xsl a"
+                version="1.0">    
+    <xsl:output method="xml" indent="no"/>    
+    
+    <!-- The flat schema file -->
+    <xsl:param name="xref-schema-file"/>
+    
+    <!-- Whether or not to keep "element-" and "attribute-" paragraphs. -->
+    <xsl:param name="keep-anchors" select="'false'"/>
+    
+    <!-- Whether or not to add element and attribute lists. -->
+    <xsl:param name="add-xrefs" select="'true'"/>
+
+    <!-- The paths to the three parts (only required for part 0) -->
+    <xsl:param name="part1-content-path" select="''"/>
+    <xsl:param name="part2-content-path" select="''"/>
+    <xsl:param name="part3-content-path" select="''"/>
+
+    <!-- The paths to the three parts (only required for part 0) -->
+    <xsl:param name="part1-toc-rel-path" select="''"/>
+    <xsl:param name="part2-toc-rel-path" select="''"/>
+    <xsl:param name="part3-toc-rel-path" select="''"/>
+
+    <!-- The hypelink mode for copying TOC's to part 0 -->
+    <!-- 'none': remove hyperlinks -->
+    <!-- 'adapt': add relative URI to the documents -->
+    <!-- '': do not adapt hyperlinks -->
+    <xsl:param name="toc-hyperlink-mode" select="'adapt'"/>
+    
+    <xsl:variable name="add-attr-elem-xrefs" select="$add-xrefs='true'"/>
+    <xsl:variable name="add-text-info" select="$add-xrefs='true'"/>
+    <xsl:variable name="keep-attr-elem-xrefs" select="false()"/>
+    
+    <xsl:variable name="add-xref-anchors" select="false()"/>
+    <xsl:variable name="keep-xref-anchors" select="$keep-anchors='true'"/>
+    <xsl:variable name="check-xref-anchors" select="true()"/>
+
+    <xsl:variable name="create-odf-references" select="$xref-schema-file!=''"/>
+    <xsl:variable name="create-cardinality-info" select="false()"/>
+
+    <xsl:variable name="keep-annotations" select="false()"/>
+
+    <xsl:variable name="keep-todos" select="false()"/>
+
+    <xsl:variable name="convert-bookmarks-and-hyperlinks" select="true()"/>
+
+    <xsl:variable name="bib-messages" select="false()"/>
+
+    <xsl:variable name="element-prefix" select="'element-'"/>
+    <xsl:variable name="attribute-prefix" select="'attribute-'"/>
+    <xsl:variable name="property-prefix" select="'property-'"/>
+    <xsl:variable name="datatype-prefix" select="'datatype-'"/>
+    <xsl:variable name="value-prefix" select="'value:'"/>
+    <xsl:variable name="function-prefix" select="'anchor:'"/>
+    <xsl:variable name="toc-prefix" select="'toc-'"/>
+
+    <xsl:variable name="attributes-heading" select="'General Attributes'"/>
+    <xsl:variable name="attributes-heading-level" select="'1'"/>
+    <xsl:variable name="properties-heading" select="'Formatting Attributes'"/>
+    <xsl:variable name="datatypes-heading" select="'Other Datatypes'"/>
+
+        
+    <!-- ********************************* -->
+    <!-- ** element anchors (element-*) ** -->
+    <!-- ********************************* -->
+    <xsl:template match="text:p[starts-with(.,$element-prefix)]">        
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+        <!-- Check element name -->
+        <xsl:variable name="element-name" select="normalize-space(substring(., string-length($element-prefix)+1))"/>
+        <xsl:variable name="element-defs" select="document($xref-schema-file)/rng:grammar/rng:element[@name=$element-name]"/>
+        <xsl:if test="$check-xref-anchors and not($element-defs)">
+            <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: No element definition found in schema for &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+        </xsl:if>
+        <!-- Add xrefs -->
+        <xsl:if test="$add-attr-elem-xrefs">
+            <xsl:apply-templates select="$element-defs"/>
+        </xsl:if>
+    </xsl:template>    
+
+    <!-- ************************************* -->
+    <!-- ** attribute anchors (attribute-*) ** -->
+    <!-- ************************************* -->
+    <xsl:template match="text:p[starts-with(.,$attribute-prefix) or starts-with(.,$property-prefix)]">        
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+        <!-- Check attribute name -->
+        <xsl:variable name="attr-name-raw" select="substring-after(normalize-space(.),'-')"/>
+        <xsl:variable name="has-elements" select="contains($attr-name-raw,'_')"/>
+        <xsl:variable name="attr-name">
+            <xsl:choose>
+                <xsl:when test="$has-elements">
+                    <xsl:value-of select="substring-before($attr-name-raw,'_')"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="$attr-name-raw"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="element-list">
+            <xsl:if test="$has-elements">
+                <xsl:value-of select="concat(substring($attr-name-raw,string-length($attr-name)+1),'_')"/>
+            </xsl:if>
+        </xsl:variable>
+        <xsl:if test="$check-xref-anchors and $has-elements">
+            <xsl:if test="not(preceding::text:h[1]/@text:outline-level='3')">
+                <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Element list <xsl:value-of select="$element-list"/> for attribute on outline level 3</xsl:message>
+            </xsl:if>
+            <xsl:call-template name="check-element-list">
+                <xsl:with-param name="element-list" select="$element-list"/>
+            </xsl:call-template>
+        </xsl:if>
+        <xsl:variable name="fp" select="starts-with(.,$property-prefix)"/>
+        <xsl:variable name="attr-defs" select="document($xref-schema-file)/rng:grammar/rng:element[(starts-with(@name,'style:') and contains(@name,'-properties'))=$fp]/rng:attribute[@name=$attr-name]"/>
+        <xsl:if test="$check-xref-anchors and not($attr-defs)">
+            <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: No attribute definition found in schema for &quot;<xsl:value-of select="$attr-name"/>&quot;.</xsl:message>
+        </xsl:if>
+        <!-- Add xrefs -->
+        <xsl:if test="$add-attr-elem-xrefs">
+            <xsl:apply-templates select="$attr-defs">
+                <xsl:with-param name="element-list" select="$element-list"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:apply-templates>
+        </xsl:if>
+    </xsl:template>    
+    
+    <xsl:template name="check-element-list">
+        <xsl:param name="element-list"/>
+        <xsl:param name="list" select="substring($element-list,string-length($element-prefix)+2)"/>
+        <xsl:variable name="element-name" select="substring-before($list,'_')"/>
+        <xsl:if test="not(document($xref-schema-file)/rng:grammar/rng:element[@name=$element-name])">
+            <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: No element definition found in schema for &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+        </xsl:if>
+        <xsl:variable name="remainder" select="substring-after($list,'_')"/>
+        <xsl:if test="$remainder">
+            <xsl:choose>
+                <xsl:when test="starts-with($remainder,$element-prefix)">
+                    <xsl:call-template name="check-element-list">
+                        <xsl:with-param name="element-list" select="concat('_',$remainder)"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="starts-with($remainder,$value-prefix)"/>
+                <xsl:otherwise>
+                    <xsl:message>XRef &quot;<xsl:value-of select="."/>&quot;: Illegal token &quot;<xsl:value-of select="$remainder"/>&quot;.</xsl:message>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- *********************************** -->
+    <!-- ** datatype anchors (datatype-*) ** -->
+    <!-- *********************************** -->
+    <xsl:template match="text:p[starts-with(.,$datatype-prefix)]">
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- *********************************** -->
+    <!-- ** formula anchors (anchor:*) ** -->
+    <!-- *********************************** -->
+    <xsl:template match="text:p[starts-with(.,$function-prefix)]">
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+        <xsl:variable name="function-name" 
+                      select="translate(substring-after(normalize-space(.),':'),'abcdefghijklmnopqrstuvwxyz“”','ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;&quot;')"/>
+        <xsl:if test="not(/office:document-content/office:body/office:text/text:h[translate(normalize-space(.),'abcdefghijklmnopqrstuvwxyz “”','ABCDEFGHIJKLMNOPQRSTUVWXYZ-&quot;&quot;')=$function-name])">
+            <xsl:message>*** XRef &quot;<xsl:value-of select="."/>&quot;: No heading found for anchor.</xsl:message>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ************************ -->
+    <!-- ** toc anchors (toc-) ** -->
+    <!-- ************************ -->
+    <xsl:template match="text:p[starts-with(.,$toc-prefix)]">
+        <!-- Remove anchor paragraph if $keep-xref-anchors is false -->
+        <xsl:if test="$keep-xref-anchors">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+        <xsl:variable name="part" select="substring-after(normalize-space(.), '-')"/>
+        <xsl:variable name="content-path">
+            <xsl:choose>
+                <xsl:when test="$part='part1'">
+                    <xsl:value-of select="$part1-content-path"/>
+                </xsl:when>
+                <xsl:when test="$part='part2'">
+                    <xsl:value-of select="$part2-content-path"/>
+                </xsl:when>
+                <xsl:when test="$part='part3'">
+                    <xsl:value-of select="$part3-content-path"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:message terminate="yes">*** Invalid part sepcified for toc: <xsl:value-of select="$part"/></xsl:message>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:if test="$content-path=''">
+            <xsl:message terminate="yes" >*** No content path set for <xsl:value-of select="$part"/></xsl:message>
+        </xsl:if>
+        <text:section text:name="{normalize-space(.)}" text:protected="true">
+            <xsl:apply-templates select="document($content-path)/office:document-content/office:body/office:text/text:table-of-content/text:index-body/*" mode="insert-toc">
+                <xsl:with-param name="part" select="$part"/>
+            </xsl:apply-templates>
+        </text:section>
+    </xsl:template>
+
+    <xsl:template match="text:p" mode="insert-toc">
+        <xsl:param name="part"/>
+        <text:p>
+            <xsl:apply-templates select="@*" mode="insert-toc">
+                <xsl:with-param name="part" select="$part"/>
+            </xsl:apply-templates>
+            <xsl:attribute name="text:style-name"><xsl:value-of select="concat($part,'-',@text:style-name)"/></xsl:attribute>
+            <xsl:choose>
+                <xsl:when test="text:a or $toc-hyperlink-mode='none'">
+                    <xsl:apply-templates select="node()" mode="insert-toc">
+                        <xsl:with-param name="part" select="$part"/>
+                    </xsl:apply-templates>
+                </xsl:when>
+                <xsl:otherwise>
+                    <text:a xlink:type="simple">
+                        <xsl:attribute name="xlink:href">
+                            <xsl:variable name="appendix">
+                                <xsl:choose>
+                                    <xsl:when test="starts-with(.,'Appendix')">
+                                        <xsl:value-of select="substring-before(substring(.,10),'. ')"/>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:value-of select="substring-before(.,'. ')"/>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:variable>
+                            <xsl:variable name="target" select="concat('#Appendix_',translate($appendix,'.','_'))"/>
+                            <xsl:variable name="doc">
+                                <xsl:choose>
+                                    <xsl:when test="$toc-hyperlink-mode='adapt'">
+                                        <xsl:call-template name="get-doc">
+                                            <xsl:with-param name="part" select="$part"/>
+                                        </xsl:call-template>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:value-of select="''"/>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:variable>
+                            <xsl:choose>
+                                <xsl:when test="$doc!=''">
+                                    <xsl:value-of select="concat('../',$doc,$target)"/>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:value-of select="$target"/>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:attribute>
+                        <xsl:apply-templates select="node()" mode="insert-toc">
+                            <xsl:with-param name="part" select="$part"/>
+                        </xsl:apply-templates>
+                    </text:a>
+                </xsl:otherwise>
+            </xsl:choose>
+        </text:p>
+    </xsl:template>
+
+
+    <xsl:template match="text:a" mode="insert-toc">
+        <xsl:param name="part"/>
+        <xsl:choose>
+            <xsl:when test="$toc-hyperlink-mode='none'">
+                <xsl:apply-templates select="node()" mode="insert-toc">
+                    <xsl:with-param name="part" select="$part"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$toc-hyperlink-mode='adapt'">
+                <xsl:variable name="doc">
+                    <xsl:call-template name="get-doc">
+                        <xsl:with-param name="part" select="$part"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <text:a xlink:type="simple">
+                    <xsl:attribute name="xlink:href">
+                        <xsl:choose>
+                            <xsl:when test="$doc!=''">
+                                <xsl:value-of select="concat('../',$doc,@xlink:href)"/>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:value-of select="@xlink:href"/>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:attribute>
+                    <xsl:apply-templates select="node()" mode="insert-toc">
+                        <xsl:with-param name="part" select="$part"/>
+                    </xsl:apply-templates>
+                </text:a>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:copy>
+                    <xsl:apply-templates select="@*|node()" mode="insert-toc">
+                        <xsl:with-param name="part" select="$part"/>
+                    </xsl:apply-templates>
+                </xsl:copy>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template name="get-doc">
+        <xsl:param name="part"/>
+        <xsl:choose>
+            <xsl:when test="$part='part1'">
+                <xsl:value-of select="$part1-toc-rel-path"/>
+            </xsl:when>
+            <xsl:when test="$part='part2'">
+                <xsl:value-of select="$part2-toc-rel-path"/>
+            </xsl:when>
+            <xsl:when test="$part='part3'">
+                <xsl:value-of select="$part3-toc-rel-path"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:message terminate="yes">*** Invalid part sepcified for toc: <xsl:value-of select="$part"/></xsl:message>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="@*|node()" mode="insert-toc">
+        <xsl:param name="part"/>
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()" mode="insert-toc">
+                <xsl:with-param name="part" select="$part"/>
+            </xsl:apply-templates>
+        </xsl:copy>
+    </xsl:template>
+
+    <xsl:template match="office:automatic-styles">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+            <xsl:if test="$part1-content-path!=''">
+                <xsl:call-template name="copy-toc-auto-styles">
+                    <xsl:with-param name="part" select="'part1'"/>
+                    <xsl:with-param name="content-path" select="$part1-content-path"/>
+                </xsl:call-template>
+            </xsl:if>
+            <xsl:if test="$part2-content-path!=''">
+                <xsl:call-template name="copy-toc-auto-styles">
+                    <xsl:with-param name="part" select="'part2'"/>
+                    <xsl:with-param name="content-path" select="$part2-content-path"/>
+                </xsl:call-template>
+            </xsl:if>
+            <xsl:if test="$part3-content-path!=''">
+                <xsl:call-template name="copy-toc-auto-styles">
+                    <xsl:with-param name="part" select="'part3'"/>
+                    <xsl:with-param name="content-path" select="$part3-content-path"/>
+                </xsl:call-template>
+            </xsl:if>
+        </xsl:copy>
+    </xsl:template>
+
+    <xsl:template name="copy-toc-auto-styles">
+        <xsl:param name="part"/>
+        <xsl:param name="content-path"/>
+        <xsl:for-each select="document($content-path)/office:document-content/office:automatic-styles/style:style[@style:family='paragraph']">
+            <xsl:if test="ancestor::office:document-content/office:body/office:text/text:table-of-content/text:index-body/text:p[@text:style-name=current()/@style:name]">
+                <style:style>
+                    <xsl:apply-templates select="@*"/>
+                    <xsl:attribute name="style:name"><xsl:value-of select="concat($part,'-',@style:name)"/></xsl:attribute>
+                    <xsl:apply-templates select="node()"/>
+                </style:style>
+            </xsl:if>
+        </xsl:for-each>
+    </xsl:template>
+
+    <!-- ************************* -->
+    <!-- ** existing references ** -->
+    <!-- ************************* -->
+    <xsl:template match="text:h/text:reference-mark-start|text:h/text:reference-mark-end">
+        <xsl:if test="not($create-odf-references) or not(starts-with(@text:name,$attribute-prefix) or starts-with(@text:name,$property-prefix) or starts-with(@text:name,$element-prefix) or starts-with(@text:name,$datatype-prefix))">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ******************************* -->
+    <!-- ** existing cross references ** -->
+    <!-- ******************************* -->
+    <xsl:template match="text:p[@text:style-name='Attribute_20_List' or @text:style-name='Child_20_Element_20_List' or @text:style-name='Parent_20_Element_20_List' or @text:style-name='Attribute_20_Value_20_List']">
+        <!-- Remove them if $keep-attr-elem-xrefs is false -->
+        <xsl:if test="$keep-attr-elem-xrefs">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:key name="style" match="style:style[@style:family='paragraph']" use="@style:name"/>
+
+    <xsl:template match="text:p[@text:style-name='TODO' or key('style',@text:style-name)/@style:parent-style-name='TODO']">
+        <!-- Remove them if $keep-attr-elem-xrefs is false -->
+        <xsl:if test="$keep-todos">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ******************************* -->
+    <!-- ** Default values ** -->
+    <!-- ******************************* -->
+    <xsl:template match="text:p[@text:style-name='Default_20_Value']">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+		<xsl:if test="not(text:span[@text:style-name='Attribute_20_Value' or @text:style-name='Attribute_20_Value_20_Instance'])">
+			<xsl:variable name="attr-name">
+				<xsl:choose>
+					<xsl:when test="text:span[@text:style-name='Attribute']">
+						<xsl:value-of select="text:span[@text:style-name='Attribute']"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="normalize-space(preceding::text:h[@text:outline-level='2'][last()])"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:variable>
+			<xsl:message>*** <xsl:value-of select="$attr-name"/>: Missing default value in default value definition.</xsl:message>
+		</xsl:if>
+	</xsl:template>
+
+
+    <!-- *************************** -->
+    <!-- ** Bookmarks in headings ** -->
+    <!-- *************************** -->
+    <xsl:template match="text:h[text:bookmark[not(starts-with(@text:name,'__'))] or text:bookmark-start[not(starts-with(@text:name,'__'))]]" priority="1">
+        <xsl:copy>
+            <xsl:choose>
+                <xsl:when test="$convert-bookmarks-and-hyperlinks">
+                    <xsl:apply-templates select="@*"/>
+                    <xsl:for-each select="text:bookmark[not(starts-with(@text:name,'__'))]|text:bookmark-start[not(starts-with(@text:name,'__'))]">
+                        <xsl:sort select="@text:name"/>
+                        <xsl:variable name="ref-name" select="@text:name"/>
+                        <!-- xsl:message>Turning bookmark into reference mark: <xsl:value-of select="$ref-name"/>.</xsl:message -->
+                        <text:reference-mark-start text:name="{$ref-name}"/>
+                    </xsl:for-each>
+                    <xsl:apply-templates select="node()" mode="convert_bookmarks"/>
+                    <xsl:for-each select="text:bookmark[not(starts-with(@text:name,'__'))]|text:bookmark-start[not(starts-with(@text:name,'__'))]">
+                        <xsl:sort select="@text:name" order="reverse"/>
+                        <xsl:variable name="ref-name" select="@text:name"/>
+                        <text:reference-mark-end text:name="{$ref-name}"/>
+                    </xsl:for-each>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:apply-templates select="@*|node()"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:copy>
+    </xsl:template>
+
+    <xsl:template match="text:bookmark[not(starts-with(@text:name,'__'))]" mode="convert_bookmarks">
+        <xsl:apply-templates select="node()"/>
+    </xsl:template>
+
+    <xsl:template match="text:bookmark-start[not(starts-with(@text:name,'__'))]|text:bookmark-end[not(starts-with(@text:name,'__'))]" mode="convert_bookmarks"/>
+
+    <xsl:template match="@*|node()" mode="convert_bookmarks">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+
+    <xsl:template match="text:a[starts-with(@xlink:href,'#') and not(starts-with(@xlink:href,'#__') or contains(@xlink:href,'|outline'))]">
+        <xsl:choose>
+            <xsl:when test="$convert-bookmarks-and-hyperlinks">
+                <xsl:variable name="ref-name" select="substring(@xlink:href,2)"/>
+                <xsl:variable name="non-empty" select="string-length(normalize-space(.)) &gt; 0"/>
+                <xsl:apply-templates select="node()"/>
+                <xsl:choose>
+                    <xsl:when test="$non-empty">
+                        <!-- xsl:message>Turning hyperlink into reference: <xsl:value-of select="$ref-name"/>.</xsl:message -->
+                        <xsl:text> </xsl:text><text:reference-ref text:ref-name="{$ref-name}" text:reference-format="chapter">?</text:reference-ref>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <!-- xsl:message>Ignoring empty hyperlink: <xsl:value-of select="$ref-name"/>.</xsl:message -->
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:copy>
+                    <xsl:apply-templates select="@*|node()"/>
+                </xsl:copy>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ****************************************** -->
+    <!-- ** Headings for elements and attributes ** -->
+    <!-- ****************************************** -->
+    <xsl:template match="text:h[contains(.,':')]">
+        <!-- get element or attribute name -->
+        <xsl:variable name="tag">
+            <xsl:choose>
+                <xsl:when test="contains(.,'(')">
+                    <xsl:value-of select="normalize-space(substring-before(.,'('))"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="normalize-space(.)"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <!-- create ODF ref-mark elements if it is a valid element or attribute name -->
+        <xsl:choose>
+            <xsl:when test="not($create-odf-references) or starts-with($tag, 'odf:') or starts-with($tag, 'pkg:')">
+                <!-- OWL -->
+                <xsl:copy>
+                    <xsl:apply-templates select="@*|node()"/>
+                </xsl:copy>
+            </xsl:when>
+            <xsl:when test="starts-with($tag, '&lt;') and contains($tag,'&gt;')">
+                <xsl:copy>
+                    <xsl:apply-templates select="@*"/>
+                    <xsl:choose>
+                        <xsl:when test="preceding::text:h[@text:outline-level=$attributes-heading-level]=$attributes-heading">
+                            <xsl:variable name="fp" select="preceding::text:h[@text:outline-level='1'][last()]=$properties-heading"/>
+                            <xsl:variable name="attr-name" select="normalize-space(preceding::text:h[@text:outline-level='2'][last()])"/>
+                            <xsl:call-template name="create-element-ref-mark-start">
+                                 <xsl:with-param name="tag" select="$tag"/>
+                                 <xsl:with-param name="attr-name" select="$attr-name"/>
+                                 <xsl:with-param name="fp" select="$fp"/>
+                            </xsl:call-template>
+                            <xsl:apply-templates select="node()"/>
+                            <xsl:call-template name="create-element-ref-mark-end">
+                                 <xsl:with-param name="tag" select="$tag"/>
+                                 <xsl:with-param name="attr-name" select="$attr-name"/>
+                                 <xsl:with-param name="fp" select="$fp"/>
+                            </xsl:call-template>
+                        </xsl:when>
+                        <xsl:when test="preceding::text:h[@text:outline-level='3'][last()]='manifest:version'">
+                            <xsl:variable name="attr-name" select="'manifest:version'"/>
+                            <xsl:call-template name="create-element-ref-mark-start">
+                                 <xsl:with-param name="tag" select="$tag"/>
+                                 <xsl:with-param name="attr-name" select="$attr-name"/>
+                                 <xsl:with-param name="fp" select="false()"/>
+                            </xsl:call-template>
+                            <xsl:apply-templates select="node()"/>
+                            <xsl:call-template name="create-element-ref-mark-end">
+                                 <xsl:with-param name="tag" select="$tag"/>
+                                 <xsl:with-param name="attr-name" select="$attr-name"/>
+                                 <xsl:with-param name="fp" select="false()"/>
+                            </xsl:call-template>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:call-template name="create-element-ref-mark-start">
+                                 <xsl:with-param name="tag" select="$tag"/>
+                            </xsl:call-template>
+                            <xsl:apply-templates select="node()"/>
+                            <xsl:call-template name="create-element-ref-mark-end">
+                                 <xsl:with-param name="tag" select="$tag"/>
+                            </xsl:call-template>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:copy>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:variable name="attr-name" select="$tag"/>
+                <xsl:variable name="fp" select="preceding::text:h[@text:outline-level='1'][last()]=$properties-heading"/>
+                <xsl:if test="$check-xref-anchors">
+                    <xsl:choose>
+                        <xsl:when test="not(document($xref-schema-file)/rng:grammar/rng:element[(starts-with(@name,'style:') and contains(@name,'-properties'))=$fp]/rng:attribute[@name=$attr-name])">
+                            <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No attribute definition found in schema for &quot;<xsl:value-of select="$attr-name"/>&quot;<xsl:if test="$fp"> (property)</xsl:if>.</xsl:message>
+                        </xsl:when>
+                        <xsl:when test="$fp and not(/office:document-content/office:body/office:text/text:p[starts-with(.,$property-prefix) and (normalize-space(.)=concat($property-prefix,$attr-name) or starts-with(.,concat($property-prefix,$attr-name,'_')))])">
+                            <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No attribute xref found for &quot;<xsl:value-of select="$attr-name"/>&quot; (property).</xsl:message>
+                        </xsl:when>
+                        <xsl:when test="not($fp) and not(/office:document-content/office:body/office:text/text:p[starts-with(.,$attribute-prefix) and (normalize-space(.)=concat($attribute-prefix,$attr-name) or starts-with(.,concat($attribute-prefix,$attr-name,'_')))])">
+                            <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No attribute xref found for &quot;<xsl:value-of select="$attr-name"/>&quot;.</xsl:message>
+                        </xsl:when>
+                    </xsl:choose>
+                </xsl:if>
+                <xsl:copy>
+                    <xsl:apply-templates select="@*"/>
+                    <xsl:variable name="ref-name">
+                        <xsl:choose>
+                            <xsl:when test="$fp"><xsl:value-of select="concat($property-prefix,$attr-name)"/></xsl:when>
+                            <xsl:otherwise><xsl:value-of select="concat($attribute-prefix,$attr-name)"/></xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:variable>
+                    <xsl:if test="$create-odf-references">
+                        <text:reference-mark-start text:name="{$ref-name}"/>
+                    </xsl:if>
+                    <xsl:apply-templates select="node()"/>
+                    <xsl:if test="$create-odf-references">
+                        <text:reference-mark-end text:name="{$ref-name}"/>
+                    </xsl:if>
+                </xsl:copy>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <!-- **************************** -->
+    <!-- ** Headings for datatypes ** -->
+    <!-- **************************** -->
+    <xsl:template match="text:h[@text:outline-level='3' and preceding::text:h[@text:outline-level='2'][last()]=$datatypes-heading]">
+        <xsl:copy>
+            <xsl:apply-templates select="@*"/>
+            <xsl:variable name="ref-name" select="concat($datatype-prefix,normalize-space(.))"/>
+            <xsl:if test="$create-odf-references">
+                <text:reference-mark-start text:name="{$ref-name}"/>
+            </xsl:if>
+            <xsl:apply-templates select="node()"/>
+            <xsl:if test="$create-odf-references">
+                <text:reference-mark-end text:name="{$ref-name}"/>
+            </xsl:if>
+        </xsl:copy>
+    </xsl:template>
+
+    <!-- ***************************************** -->
+    <!-- ** Bibliograophy: Normative References ** -->
+    <!-- ***************************************** -->
+    <xsl:key name="bib-entry" match="text:bibliography-mark" use="@text:identifier"/>
+
+    <xsl:template match="text:bibliography[@text:name='NormativeReferences']/text:index-body/text:p">
+        <xsl:variable name="id" select="substring(substring-before(.,']'),2)"/>
+        <xsl:if test="not(key('bib-entry',$id)/@text:custom5) or key('bib-entry',$id)/@text:custom5 != 'informative'">
+<!--            <xsl:copy>
+                <xsl:apply-templates select="@*|node()" mode="bib"/>
+            </xsl:copy>
+            -->
+            <xsl:call-template name="bib-entry"/>
+            <xsl:if test="$bib-messages">
+                <xsl:message>Bibliographic entry [<xsl:value-of select="$id"/>] is normative.</xsl:message>
+            </xsl:if>
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ********************************************* -->
+    <!-- ** Bibliograophy: Non Normative References ** -->
+    <!-- ********************************************* -->
+    <xsl:template match="text:bibliography[@text:name='NonNormativeReferences']/text:index-body/text:p">
+        <xsl:variable name="id" select="substring(substring-before(.,']'),2)"/>
+        <xsl:if test="key('bib-entry',$id)/@text:custom5 = 'informative'">
+<!--            <xsl:copy>
+                <xsl:apply-templates select="@*|node()" mode="bib"/>
+            </xsl:copy>-->
+            <xsl:call-template name="bib-entry"/>
+            <xsl:if test="$bib-messages">
+                <xsl:message>Bibliographic entry [<xsl:value-of select="$id"/>] is non normative.</xsl:message>
+            </xsl:if>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template name="bib-entry">
+        <xsl:copy>
+            <xsl:apply-templates select="@*" mode="bib"/>
+            <xsl:for-each select="node()">
+                <xsl:choose>
+                    <xsl:when test="self::text() and contains(.,'http://')">
+                        <xsl:variable name="before" select="substring-before(.,'http://')"/>
+                        <xsl:variable name="tmp" select="substring(.,string-length($before)+1)"/>
+                        <xsl:variable name="url">
+                            <xsl:choose>
+                                <xsl:when test="contains($tmp,',')">
+                                    <xsl:value-of select="substring-before($tmp,',')"/>
+                                </xsl:when>
+                                <xsl:when test="substring($tmp,string-length($tmp))='.'">
+                                    <xsl:value-of select="substring($tmp,1,string-length($tmp)-1)"/>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:value-of select="$tmp"/>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:variable>
+                        <xsl:variable name="after" select ="substring($tmp,string-length($url)+1)"/>
+                        <xsl:value-of select="$before"/>
+                        <text:a xlink:type="simple" xlink:href="{$url}"><xsl:value-of select="$url"/></text:a>
+                        <xsl:value-of select="$after"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:copy>
+                            <xsl:apply-templates select="@*|node()"/>
+                        </xsl:copy>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:for-each>
+        </xsl:copy>
+    </xsl:template>
+
+
+    <xsl:template match="@*|node()" mode="bib">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()" mode="bib"/>
+        </xsl:copy>
+    </xsl:template>
+
+    <!-- ********************************** -->
+    <!-- ** Formula: Annotation sections ** -->
+    <!-- ********************************** -->
+    <xsl:template match="text:section[(@text:display='condition' and @text:condition='ooow:Note==0') or @text:display='none']">
+        <!-- Ignore sections that are hidable by the "Note" condition -->
+        <xsl:choose>
+            <xsl:when test="$keep-annotations">
+                <xsl:copy>
+                    <xsl:apply-templates select="@*|node()"/>
+                </xsl:copy>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="*" mode="check-annotations"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="text:p" mode="check-annotations">
+        <xsl:variable name="style-name" select="@text:style-name"/>
+        <xsl:choose>
+            <xsl:when test="starts-with(.,'Test Case') or normalize-space(.)=''"/>
+            <xsl:when test="$style-name='Rationale' or $style-name='Offset_20_Note' or $style-name='TODO'"/>
+            <xsl:when test="/office:document-content/office:automatic-styles/style:style[@style:name=$style-name and @style:family='paragraph' and @style:parent-style-name='Rationale']"/>
+            <xsl:when test="/office:document-content/office:automatic-styles/style:style[@style:name=$style-name and @style:family='paragraph' and @style:parent-style-name='Offset_20_Note']"/>
+            <xsl:when test="/office:document-content/office:automatic-styles/style:style[@style:name=$style-name and @style:family='paragraph' and @style:parent-style-name='TODO']"/>
+            <xsl:when test="ancestor::text:section[@text:name='SectionTestCases']"/>
+            <xsl:when test="ancestor::text:tracked-changes"/>
+            <xsl:otherwise>
+                <xsl:message>Normative Content found in section &quot;<xsl:value-of select="ancestor::text:section/@text:name"/>&quot;: <xsl:value-of select="substring(.,1,40)"/></xsl:message>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="*" mode="check-annotations"/>
+
+    <xsl:template match="text:section">
+        <xsl:message>Text sextions are not supported: <xsl_value-of select="@text:namd"/></xsl:message>
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+
+
+    <xsl:template match="text:hidden-text[@text:condition='ooow:Note==0']">
+        <!-- Ignore hidden text fields that are hidable by the "Note" condition -->
+        <xsl:if test="$keep-annotations">
+            <xsl:copy>
+                <xsl:apply-templates select="@*|node()"/>
+            </xsl:copy>
+        </xsl:if>
+    </xsl:template>
+
+
+
+    <xsl:template name="create-element-ref-mark-start">
+        <xsl:param name="tag"/>
+        <xsl:param name="attr-name" select="''"/>
+        <xsl:param name="fp" select="false()"/>
+        <xsl:variable name="element-name" select="substring-after(substring-before($tag,'&gt;'),'&lt;')"/>
+        <xsl:variable name="remainder" select="substring-after($tag,'&gt;')"/>
+        
+        <xsl:if test="$check-xref-anchors">
+            <xsl:choose>
+                <xsl:when test="$element-name='dsig:document-signatures' or $element-name='ds:Signature'"/>
+                <xsl:when test="not(document($xref-schema-file)/rng:grammar/rng:element[@name=$element-name])">
+                    <xsl:message>Heading: &quot;<xsl:value-of select="."/>&quot;: No element definition found in schema for element &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+                </xsl:when>
+                <xsl:when test="not(/office:document-content/office:body/office:text/text:p[starts-with(.,$element-prefix) and normalize-space(.)=concat($element-prefix,$element-name)])">
+                    <xsl:message>Heading &quot;<xsl:value-of select="."/>&quot;: No element xref found for element &quot;<xsl:value-of select="$element-name"/>&quot;.</xsl:message>
+                </xsl:when>
+            </xsl:choose>
+        </xsl:if>
+
+        <xsl:if test="$create-odf-references">
+            <xsl:variable name="ref-name">
+                <xsl:choose>
+                    <xsl:when test="string-length($attr-name)>0 and $fp">
+                        <xsl:value-of select="concat($property-prefix,$attr-name,'_',$element-prefix,$element-name)"/>
+                    </xsl:when>
+                    <xsl:when test="string-length($attr-name)>0">
+                        <xsl:value-of select="concat($attribute-prefix,$attr-name,'_',$element-prefix,$element-name)"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="concat($element-prefix,$element-name)"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:variable>
+            <text:reference-mark-start text:name="{$ref-name}"/>
+        </xsl:if>
+        
+        <xsl:if test="contains($remainder,'&lt;') and contains(substring-after($remainder,'&lt;'),'&gt;')">
+            <xsl:call-template name="create-element-ref-mark-start">
+                <xsl:with-param name="tag" select="$remainder"/>
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:call-template>
+        </xsl:if>        
+    </xsl:template>
+    
+    <xsl:template name="create-element-ref-mark-end">
+        <xsl:param name="tag"/>
+        <xsl:param name="attr-name" select="''"/>
+        <xsl:param name="fp" select="false()"/>
+        <xsl:variable name="element-name" select="substring-after(substring-before($tag,'&gt;'),'&lt;')"/>
+        <xsl:variable name="remainder" select="substring-after($tag,'&gt;')"/>
+
+        <xsl:if test="contains($remainder,'&lt;') and contains(substring-after($remainder,'&lt;'),'&gt;')">
+            <xsl:call-template name="create-element-ref-mark-end">
+                <xsl:with-param name="tag" select="$remainder"/>
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:call-template>
+        </xsl:if>
+
+        <xsl:if test="$create-odf-references">
+            <xsl:variable name="ref-name">
+                <xsl:choose>
+                    <xsl:when test="string-length($attr-name)>0 and $fp">
+                        <xsl:value-of select="concat($property-prefix,$attr-name,'_',$element-prefix,$element-name)"/>
+                    </xsl:when>
+                    <xsl:when test="string-length($attr-name)>0">
+                        <xsl:value-of select="concat($attribute-prefix,$attr-name,'_',$element-prefix,$element-name)"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="concat($element-prefix,$element-name)"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:variable>
+            <text:reference-mark-end text:name="{$ref-name}"/>
+        </xsl:if>
+    </xsl:template>
+
+
+    <!-- default: copy everything. -->
+    <xsl:template match="@*|node()">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+    
+    <!-- select all <element> nodes in the file or in included files -->
+    <xsl:template match="rng:element">                
+        <xsl:call-template name="create-elem-root-elem-list"/>
+        <xsl:call-template name="create-elem-parent-elem-list"/>
+        <xsl:choose>
+            <xsl:when test="rng:element/rng:anyName">
+				<xsl:if test="rng:attribute[@name]">
+					<xsl:call-template name="create-attr-list"/>
+				</xsl:if>
+				<xsl:if test="rng:element[contains(@condition,'mixed')]">
+					<text:p text:style-name="Child_20_Element_20_List">
+						<xsl:text>The </xsl:text>
+						<text:span text:style-name="Element">
+							<xsl:text>&lt;</xsl:text>
+							<xsl:value-of select="@name"/>
+							<xsl:text>&gt;</xsl:text>
+						</text:span>
+						<xsl:text> element has mixed content where arbitrary child elements are permitted.</xsl:text>
+					</text:p>
+				</xsl:if>
+			</xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="create-attr-list"/>
+                <xsl:call-template name="create-child-elem-list"/>
+                <xsl:call-template name="create-text-info"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>   
+
+
+    <!-- select all <element> nodes in the file or in included files -->
+    <xsl:template match="rng:attribute">
+        <xsl:param name="element-list"/>
+        <xsl:param name="fp"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:if test="not(preceding::rng:attribute[@name=$name and (starts-with(ancestor::rng:element/@name,'style:') and contains(ancestor::rng:element/@name,'-properties'))=$fp])">
+            <xsl:call-template name="create-attr-parent-elem-list">
+                <xsl:with-param name="element-list" select="$element-list"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:call-template>
+            <xsl:call-template name="create-attr-value-list">
+                <xsl:with-param name="element-list" select="$element-list"/>
+                <xsl:with-param name="fp" select="$fp"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>   
+    
+    <xsl:template name="create-attr-list">
+        <xsl:variable name="count" select="count(rng:attribute)"/>
+        <xsl:variable name="fp" select="starts-with(@name,'style:') and contains(@name,'-properties')"/>
+        <xsl:call-template name="new-line"/>
+        <xsl:variable name="elem-name" select="@name"/>
+        <text:p text:style-name="Attribute_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Element">
+                <xsl:text>&lt;</xsl:text>
+                <xsl:value-of select="$elem-name"/>
+                <xsl:text>&gt;</xsl:text>
+            </text:span>
+            <xsl:text> element </xsl:text>
+            <xsl:choose>
+                <xsl:when test="$count > 0">
+                    <xsl:choose>
+                        <xsl:when test="$count = 1">
+                            <xsl:text> has the following attribute: </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text> has the following attributes: </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <!-- collect attributes -->
+                    <xsl:for-each select="rng:attribute">
+                        <xsl:sort select="@name"/>
+                        <xsl:variable name="name" select="@name"/>
+                        <xsl:if test="not(preceding-sibling::rng:attribute[@name=$name])">
+                            <xsl:choose>
+                                <xsl:when test="position() = 1"/>
+                                <xsl:when test="position() = last()">
+                                    <xsl:text> and </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>, </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                            <text:span text:style-name="Attribute"><xsl:value-of select="@name"/></text:span>
+                            <xsl:if test="$create-cardinality-info">
+                                <xsl:choose>
+                                    <xsl:when test="not(@condition) or @condition='' or @condition='interleave' or @condition='interleave/interleave'">
+                                        <!-- mandatory: no hint -->
+                                    </xsl:when>
+                                    <xsl:when test="contains(@condition,'optional') and not(contains(@condition,'group') or contains(@condition,'choice'))">
+                                        <xsl:text>(?)</xsl:text>
+                                    </xsl:when>
+                                    <xsl:when test="@condition='zeroOrMore'">
+                                        <xsl:text>(?)</xsl:text>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:message>Attribute <xsl:value-of select="@name"/>: Complex cardinality: <xsl:value-of select="@condition"/></xsl:message>
+                                        <xsl:text>(!)</xsl:text>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:if>
+                            <xsl:variable name="aname" select="@name"/>
+                            <xsl:variable name="ref-name">
+                                <xsl:choose>
+                                    <xsl:when test="$fp and /office:document-content/office:body/office:text/text:p[starts-with(.,concat($property-prefix,$aname,'_')) and contains(concat(normalize-space(.),'_'),concat($element-prefix,$elem-name,'_'))]"><xsl:value-of select="concat($property-prefix,$aname,'_',$element-prefix,$elem-name)"/></xsl:when>
+                                    <xsl:when test="not($fp) and /office:document-content/office:body/office:text/text:p[starts-with(.,concat($attribute-prefix,$aname,'_')) and contains(concat(normalize-space(.),'_'),concat($element-prefix,$elem-name,'_'))]"><xsl:value-of select="concat($attribute-prefix,$aname,'_',$element-prefix,$elem-name)"/></xsl:when>
+                                    <xsl:when test="$fp"><xsl:value-of select="concat($property-prefix,@name)"/></xsl:when>
+                                    <xsl:otherwise><xsl:value-of select="concat($attribute-prefix,@name)"/></xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:variable>
+                            <xsl:text> </xsl:text><text:reference-ref text:ref-name="{$ref-name}" text:reference-format="chapter">?</text:reference-ref>
+                        </xsl:if>
+                    </xsl:for-each>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text> has no attributes</xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template name="create-child-elem-list">
+        <xsl:variable name="count" select="count(rng:element[@name])"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Child_20_Element_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Element">
+                <xsl:text>&lt;</xsl:text>
+                <xsl:value-of select="@name"/>
+                <xsl:text>&gt;</xsl:text>
+            </text:span>
+            <xsl:text> element </xsl:text>
+            <xsl:choose>
+                <xsl:when test="$count > 0">
+                    <xsl:choose>
+                        <xsl:when test="$count = 1">
+                            <xsl:text> has the following child element: </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text> has the following child elements: </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <!-- collect elements -->
+                    <xsl:for-each select="rng:element">
+                        <xsl:sort select="@name"/>
+                        <xsl:variable name="name" select="@name"/>
+                        <xsl:if test="not(preceding-sibling::rng:element[@name=$name])">
+                            <xsl:choose>
+                                <xsl:when test="position() = 1"/>
+                                <xsl:when test="position() = last()">
+                                    <xsl:text> and </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>, </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                            <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+                        </xsl:if>
+                    </xsl:for-each>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text> has no child elements</xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template name="create-text-info">
+        <xsl:if test="$add-text-info">
+            <xsl:choose>
+                <xsl:when test="@name='text:script'">
+                    <text:p text:style-name="Child_20_Element_20_List">
+                        <xsl:text>The </xsl:text>
+                        <text:span text:style-name="Element">
+                            <xsl:text>&lt;</xsl:text>
+                            <xsl:value-of select="@name"/>
+                            <xsl:text>&gt;</xsl:text>
+                        </text:span>
+                        <xsl:text> element has character data content. Character data content is only permitted if a </xsl:text>
+                        <text:span text:style-name="Attribute"><xsl:text>xlink:href</xsl:text></text:span>
+                        <xsl:text> attribute is not present.</xsl:text>
+                    </text:p>
+                </xsl:when>
+                <xsl:when test="@name='meta:user-defined'">
+                    <text:p text:style-name="Child_20_Element_20_List">
+                        <xsl:text>The </xsl:text>
+                        <text:span text:style-name="Element">
+                            <xsl:text>&lt;</xsl:text>
+                            <xsl:value-of select="@name"/>
+                            <xsl:text>&gt;</xsl:text>
+                        </text:span>
+                        <xsl:text> element has character data content, or depending on the value of the </xsl:text>
+                        <text:span text:style-name="Attribute"><xsl:text>meta:value-type</xsl:text></text:span>
+                        <xsl:text> attribute content of type </xsl:text>
+                        <xsl:for-each select="rng:ref|rng:data">
+                            <xsl:choose>
+                                <xsl:when test="position() = 1"/>
+                                <xsl:when test="position() = last()">
+                                    <xsl:text> or </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>, </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                            <xsl:call-template name="print-datatype">
+                                <xsl:with-param name="name" select="@type|@name"/>
+                            </xsl:call-template>
+                        </xsl:for-each>
+                        <xsl:text>.</xsl:text>
+                    </text:p>
+                </xsl:when>
+                <xsl:when test="rng:text[not(@condition) or (@condition='interleave/interleave' and not(.//*))]">
+                    <xsl:call-template name="new-line"/>
+                    <text:p text:style-name="Child_20_Element_20_List">
+                        <xsl:text>The </xsl:text>
+                        <text:span text:style-name="Element">
+                            <xsl:text>&lt;</xsl:text>
+                            <xsl:value-of select="@name"/>
+                            <xsl:text>&gt;</xsl:text>
+                        </text:span>
+                        <xsl:text> element has character data content.</xsl:text>
+                    </text:p>
+                </xsl:when>
+                <xsl:when test="rng:text[@condition='zeroOrMore/choice'or @condition='zeroOrMore/choice/choice']">
+                    <xsl:call-template name="new-line"/>
+                    <text:p text:style-name="Child_20_Element_20_List">
+                        <xsl:text>The </xsl:text>
+                        <text:span text:style-name="Element">
+                            <xsl:text>&lt;</xsl:text>
+                            <xsl:value-of select="@name"/>
+                            <xsl:text>&gt;</xsl:text>
+                        </text:span>
+                        <xsl:text> element has mixed content.</xsl:text>
+                    </text:p>
+                </xsl:when>
+                <xsl:when test="rng:ref[not(@condition)]|rng:data[not(@condition)]">
+                    <xsl:call-template name="new-line"/>
+                    <text:p text:style-name="Child_20_Element_20_List">
+                        <xsl:text>The </xsl:text>
+                        <text:span text:style-name="Element">
+                            <xsl:text>&lt;</xsl:text>
+                            <xsl:value-of select="@name"/>
+                            <xsl:text>&gt;</xsl:text>
+                        </text:span>
+                        <xsl:text> element has content of data type </xsl:text>
+                        <xsl:call-template name="print-datatype">
+                            <xsl:with-param name="name" select="rng:data/@type|rng:ref/@name"/>
+                            <xsl:with-param name="elem-name" select="@name"/>
+                        </xsl:call-template>
+                        <xsl:text>.</xsl:text>
+                    </text:p>
+                </xsl:when>
+                <xsl:when test="rng:text|rng:ref|rng:data">
+                     <xsl:message>Element <xsl:value-of select="@name"/>: complex condition for text: <xsl:value-of select="rng:text/@condition"/></xsl:message>
+                </xsl:when>
+            </xsl:choose>
+        </xsl:if>
+    </xsl:template>
+    
+    <xsl:template name="create-attr-parent-elem-list">
+        <xsl:param name="attr-name" select="@name"/>
+        <xsl:param name="element-list"/>
+        <xsl:param name="fp"/>
+        <xsl:variable name="parents" select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_'))) and rng:attribute[@name=$attr-name]]"/>
+        <xsl:variable name="count" select="count($parents)"/>
+        <xsl:if test="$check-xref-anchors and $count=0">
+            <xsl:message>&quot;<xsl:value-of select="$attr-name"/>&quot; <xsl:if test="$fp"> (property)</xsl:if><xsl:if test="$element-list"> (<xsl:value-of select="$element-list"/>)</xsl:if>: No parent elements found in schema.</xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Parent_20_Element_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Attribute">
+                <xsl:value-of select="$attr-name"/>
+            </text:span>
+            <xsl:text> attribute </xsl:text>
+            <xsl:choose>
+                <xsl:when test="$count = 1">
+                    <xsl:text> is usable with the following element: </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text> is usable with the following elements: </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <!-- collect elements -->
+            <xsl:for-each select="$parents">
+                <xsl:sort select="@name"/>
+                <xsl:variable name="name" select="@name"/>
+                <xsl:choose>
+                    <xsl:when test="position() = 1"/>
+                    <xsl:when test="position() = last()">
+                        <xsl:text> and </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>, </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template name="create-attr-value-list">
+        <xsl:param name="attr-name" select="@name"/>
+        <xsl:param name="element-list"/>
+        <xsl:param name="fp"/>
+        <xsl:choose>
+            <xsl:when test="$attr-name='text:id' or $attr-name='form:id' or $attr-name='office:value'">
+                <xsl:choose>
+                    <xsl:when test="not($element-list)">
+                        <xsl:apply-templates select="*" mode="attr-value">
+                            <xsl:with-param name="attr-name" select="$attr-name"/>
+                        </xsl:apply-templates>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:apply-templates select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_')))]/rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                            <xsl:with-param name="attr-name" select="$attr-name"/>
+                        </xsl:apply-templates>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:when test="$attr-name='chart:legend-position' or 
+                            $attr-name='draw:concave' or
+                            $attr-name='form:image-position' or
+                            $attr-name='meta:value-type' or
+                            $attr-name='style:legend-expansion' or
+                            $attr-name='style:family' or
+                            $attr-name='style:type' or
+                            $attr-name='table:member-type' or 
+                            ($attr-name='table:orientation' and contains($element-list,'table:data-pilot-field'))or 
+                            $attr-name='table:sort-mode' or
+                            ($attr-name='text:display' and ($fp or contains($element-list,'text:section'))) or
+                            $attr-name='chart:symbol-type'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_'))) and rng:attribute[@name=$attr-name]][1]" mode="merge-attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$attr-name='office:value-type'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[@name='text:variable-decl']/rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$attr-name='style:num-format'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[@name='text:page-number']" mode="merge-attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$attr-name='text:reference-format'">
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element/rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and (not($element-list) or contains($element-list,concat('_',$element-prefix,@name,'_'))) and count(rng:attribute[@name=$attr-name])>1]">
+                <xsl:message>Attribute <xsl:value-of select="$attr-name"/>: Multiple attribute definitions do exist for at least one element.</xsl:message>
+            </xsl:when>
+            <xsl:when test="$attr-name='xlink:show' or
+                            $attr-name='xlink:actuate'">
+                <xsl:message>Attribute <xsl:value-of select="$attr-name"/>: No type info added (type too complex).</xsl:message>
+            </xsl:when>
+            <xsl:when test="not($element-list)">
+                <xsl:variable name="count" select="count(*)"/>
+                <xsl:variable name="ename" select="name(*)"/>
+                <xsl:if test="ancestor::rng:grammar/rng:element[(starts-with(@name,'style:') and contains(@name,'-properties'))=$fp]/rng:attribute[@name=$attr-name and (count(*)!=$count or name(*[1]) != $ename)]">
+                    <xsl:message>Attribute <xsl:value-of select="$attr-name"/>: Multiple attribute definitions do exist but no element constrained anchors. this: <xsl:value-of select="$count"/>/<xsl:value-of select="$ename"/> </xsl:message>
+                </xsl:if>
+                <xsl:apply-templates select="*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="ancestor::rng:grammar/rng:element[((starts-with(@name,'style:') and contains(@name,'-properties'))=$fp) and starts-with($element-list,concat('_',$element-prefix,@name,'_'))]/rng:attribute[@name=$attr-name]/*" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:call-template name="new-line"/>
+        <xsl:choose>
+            <xsl:when test="/office:document-content/office:body/office:text/text:p[.=concat($datatype-prefix,$name)]">
+                <text:p text:style-name="Attribute_20_Value_20_List">
+                    <xsl:text>The </xsl:text>
+                    <text:span text:style-name="Attribute">
+                        <xsl:value-of select="$attr-name"/>
+                    </text:span>
+                    <xsl:text> attribute has the data type </xsl:text>
+                    <xsl:call-template name="print-datatype">
+                        <xsl:with-param name="name" select="$name"/>
+                        <xsl:with-param name="attr-name" select="$attr-name"/>
+                    </xsl:call-template>
+                    <xsl:text>.</xsl:text>
+                </text:p>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]" mode="attr-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:define" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:if test="count(*)>1">
+            <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Referenced define <xsl:value-of select="@name"/> has multiple child elements.</xsl:message>
+        </xsl:if>
+        <xsl:apply-templates select="*" mode="attr-value">
+            <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="rng:data" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="type" select="@type"/>
+        <xsl:call-template name="new-line"/>
+        <xsl:choose>
+            <!-- A plain data type is only valid if there is a datatype-* in the
+                 specification text and if there isn't a same named define -->
+            <xsl:when test="/office:document-content/office:body/office:text/text:p[.=concat($datatype-prefix,$type)] and not(document($xref-schema-file)/rng:grammar/rng:define[@name=$type])">
+                <text:p text:style-name="Attribute_20_Value_20_List">
+                    <xsl:text>The </xsl:text>
+                    <text:span text:style-name="Attribute">
+                        <xsl:value-of select="$attr-name"/>
+                    </text:span>
+                    <xsl:text> attribute has the data type </xsl:text>
+                    <xsl:call-template name="print-datatype">
+                        <xsl:with-param name="name" select="$type"/>
+                        <xsl:with-param name="attr-name" select="$attr-name"/>
+                    </xsl:call-template>
+                    <xsl:text>.</xsl:text>
+                </text:p>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unrecognized value element: <xsl:value-of select="name(.)"/></xsl:message>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:choice[count(*)=1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: &lt;choice&gt; with only one child element.</xsl:message>
+        <xsl:apply-templates select="*" mode="attr-value">
+            <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="*">
+                <xsl:choose>
+                    <xsl:when test="position() = 1"/>
+                    <xsl:when test="position() = last()">
+                        <xsl:text> or </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>, </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:attribute[@name='text:reference-format']/rng:choice" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:variable name="elem-name" select="ancestor::rng:element/@name"/>
+        <xsl:text>For </xsl:text>
+        <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="$elem-name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$elem-name)}" text:reference-format="chapter">?</text:reference-ref>
+        <xsl:text> elements, the values of the </xsl:text>
+        <text:span text:style-name="Attribute">
+             <xsl:value-of select="$attr-name"/>
+        </text:span>
+        <xsl:if test="*[not(self::rng:value or self::rng:ref)]"><xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: unexpected child elements</xsl:message></xsl:if>
+        <xsl:text> attribute are </xsl:text>
+            <xsl:variable name="has-values" select="count(rng:value)>0"/>
+            <xsl:for-each select="rng:ref">
+                <xsl:variable name="name" select="@name"/>
+                <xsl:if test="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*[not(self::rng:choice)]"><xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: unexpected child elements in referenced define</xsl:message></xsl:if>
+                <xsl:for-each select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/rng:choice/*">
+                    <xsl:choose>
+                        <xsl:when test="position() = 1"/>
+                        <xsl:when test="not($has-values) and position() = last()">
+                            <xsl:text> or </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>, </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <xsl:apply-templates select="." mode="individual-value">
+                        <xsl:with-param name="attr-name" select="$attr-name"/>
+                    </xsl:apply-templates>
+                </xsl:for-each>
+            </xsl:for-each>
+            <xsl:for-each select="rng:value">
+                <xsl:choose>
+                    <xsl:when test="position() = last()">
+                        <xsl:text> or </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>, </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:choice[rng:list[rng:oneOrMore and count(*)=1] and count(*)=count(rng:value)+1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="rng:value">
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+                <xsl:text>, </xsl:text>
+            </xsl:for-each>
+            <xsl:text> or white space separated non-empty lists of </xsl:text>
+            <xsl:apply-templates select="rng:list/rng:oneOrMore/*" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:choice[rng:list[count(*)=2 and count(rng:choice)=2] and count(*)=count(rng:value)+1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="rng:value">
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+                <xsl:text>, </xsl:text>
+            </xsl:for-each>
+            <xsl:text>or two white space separated values. The first of these values </xsl:text>
+            <xsl:apply-templates select="rng:list/*[1]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>. The second of these values </xsl:text>
+            <xsl:apply-templates select="rng:list/*[2]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:value" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:if test="not(starts-with($attr-name,'xlink:'))">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Attribute_20_Value_20_List">
+                <xsl:text>The only value of the </xsl:text>
+                <text:span text:style-name="Attribute">
+                    <xsl:value-of select="$attr-name"/>
+                </text:span>
+                <xsl:text> attribute is </xsl:text>
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+                <xsl:text>.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="rng:list[rng:zeroOrMore and count(*)=1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-value-is">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>a white space separated lists of </xsl:text>
+            <xsl:apply-templates select="*/*" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>, including the empty list.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[rng:oneOrMore and count(*)=1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-value-is">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>a white space separated non-empty lists of </xsl:text>
+            <xsl:apply-templates select="*/*" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=2 and count(rng:ref|rng:choice)=2]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-attribute-has">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>two white space separated values. The first value </xsl:text>
+            <xsl:apply-templates select="*[1]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>. The second value </xsl:text>
+            <xsl:apply-templates select="*[2]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=2 and count(rng:choice)=1 and count(rng:optional/rng:ref)=1]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-attribute-has">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>one or two white space separated values. The first values </xsl:text>
+            <xsl:apply-templates select="*[1]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>. The second value </xsl:text>
+            <xsl:apply-templates select="rng:optional/*" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=4 and count(rng:ref[@name='integer'])=4]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>four white space separated values of type </xsl:text>
+            <xsl:call-template name="print-datatype">
+                <xsl:with-param name="name" select="'integer'"/>
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:list[count(*)=3 and count(rng:ref[@name='positiveLength'])=3]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>three white space separated values of type </xsl:text>
+            <xsl:call-template name="print-datatype">
+                <xsl:with-param name="name" select="'positiveLength'"/>
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:element[@name='style:background-image']/rng:attribute[@name='style:position']/rng:choice" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:if test="not(count(rng:list)=2)">
+            <xsl:message>Unexpected content <xsl:value-of select="$attr-name"/></xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="rng:value">
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+                <xsl:text>, </xsl:text>
+            </xsl:for-each>
+            <xsl:text>or two white space separated values, that may appear in any order. One of these values </xsl:text>
+            <xsl:apply-templates select="rng:list[1]/rng:ref[1]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>. The other value </xsl:text>
+            <xsl:apply-templates select="rng:list[1]/rng:ref[2]" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+
+    <xsl:template match="rng:attribute[@name='style:mirror']/rng:choice" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:if test="not(count(*)=5 and count(rng:value)=2 and count(rng:ref[@name='horizontal-mirror'])=1 and count(rng:list)=2)">
+            <xsl:message>Unexpected content <xsl:value-of select="$attr-name"/></xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="rng:value|ancestor::rng:grammar/rng:element/rng:define[@name='horizontal-mirror']/rng:choice/rng:value">
+                <xsl:apply-templates select="." mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+                <xsl:text>, </xsl:text>
+            </xsl:for-each>
+            <xsl:text>or two white space separated values, that may appear in any order. One of these values is always </xsl:text>
+            <xsl:apply-templates select="rng:list[1]/rng:value" mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>. The other value </xsl:text>
+            <xsl:apply-templates select="rng:list[1]/rng:ref" mode="single-attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:attribute[@name='draw:line-skew']/rng:list" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:if test="not(count(*)=2 and count(rng:ref[@name='length'])=1 and count(rng:optional)=1 and count(rng:optional/*)=2)">
+            <xsl:message> Unexpected content <xsl:value-of select="$attr-name"/></xsl:message>
+        </xsl:if>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text>one, two or three white space separated </xsl:text>
+            <xsl:apply-templates select="rng:ref" mode="attr-list-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:data[(@type='double' or @type='decimal') and count(rng:param)=2]" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:text>The </xsl:text>
+            <text:span text:style-name="Attribute">
+                 <xsl:value-of select="$attr-name"/>
+            </text:span>
+            <xsl:text> attribute has values of type </xsl:text>
+            <xsl:call-template name="print-datatype">
+                <xsl:with-param name="name" select="@type"/>
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:text> in the range [</xsl:text>
+            <text:span text:style-name="Attribute_20_Value">
+                <xsl:value-of select="rng:param[@name='minInclusive']"/>
+            </text:span>
+            <xsl:text>,</xsl:text>
+            <text:span text:style-name="Attribute_20_Value">
+                <xsl:value-of select="rng:param[@name='maxInclusive']"/>
+            </text:span>
+            <xsl:text>].</xsl:text>
+        </text:p>
+    </xsl:template>
+    
+    <xsl:template match="*" mode="attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unrecognized value element: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template match="rng:element" mode="merge-attr-value">
+        <xsl:param name="attr-name"/>
+        <xsl:call-template name="new-line"/>
+        <text:p text:style-name="Attribute_20_Value_20_List">
+            <xsl:call-template name="print-the-values">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:call-template>
+            <xsl:for-each select="rng:attribute[@name=$attr-name]">
+                <xsl:variable name="first" select="position() = 1"/>
+                <xsl:variable name="last" select="position() = last()"/>
+                <xsl:for-each select=".//rng:value|.//rng:ref|.//rng:empty">
+                    <xsl:choose>
+                        <xsl:when test="$first and position() = 1"/>
+                        <xsl:when test="$last and position() = last()">
+                            <xsl:text> or </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>, </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <xsl:apply-templates select="." mode="individual-value">
+                        <xsl:with-param name="attr-name" select="$attr-name"/>
+                    </xsl:apply-templates>
+                </xsl:for-each>
+            </xsl:for-each>
+            <xsl:text>.</xsl:text>
+        </text:p>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:choose>
+            <xsl:when test="/office:document-content/office:body/office:text/text:p[.=concat($datatype-prefix,$name)]">
+                <xsl:text>values of type </xsl:text>
+                <xsl:call-template name="print-datatype">
+                    <xsl:with-param name="name" select="$name"/>
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*" mode="attr-list-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+         </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:choice" mode="attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>one of these values: </xsl:text>
+        <xsl:for-each select="*">
+            <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:when test="position() = last()">
+                    <xsl:text>, or </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>, </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template match="*" mode="attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unrecognized value element in list: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="single-attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:choose>
+            <xsl:when test="/office:document-content/office:body/office:text/text:p[.=concat($datatype-prefix,$name)]">
+                <xsl:text>is of type </xsl:text>
+                <xsl:call-template name="print-datatype">
+                    <xsl:with-param name="name" select="@name"/>
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*" mode="single-attr-list-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+         </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:data[(@type='double' or @type='decimal') and count(rng:param)=2 and rng:param[@name='minInclusive'] and rng:param[@name='maxInclusive']]" mode="single-attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>is </xsl:text>
+        <xsl:apply-templates select="self::*" mode="individual-value">
+            <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="rng:choice[count(*)=count(rng:value)]" mode="single-attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>is one of: </xsl:text>
+        <xsl:for-each select="*">
+            <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:when test="position() = last()">
+                    <xsl:text> or </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>, </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template match="rng:choice[rng:ref[@name='percent'] and count(*)=(count(rng:value)+1)]" mode="single-attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>is of type </xsl:text>
+        <xsl:call-template name="print-datatype">
+            <xsl:with-param name="name" select="'percent'"/>
+            <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:call-template>
+        <xsl:text>, or is one of: </xsl:text>
+        <xsl:for-each select="rng:value">
+            <xsl:choose>
+                <xsl:when test="position() = 1"/>
+                <xsl:when test="position() = last()">
+                    <xsl:text> or </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:text>, </xsl:text>
+                </xsl:otherwise>
+            </xsl:choose>
+            <xsl:apply-templates select="." mode="individual-value">
+                <xsl:with-param name="attr-name" select="$attr-name"/>
+            </xsl:apply-templates>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template match="*" mode="single-attr-list-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unrecognized value element in fixed-length list: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template match="rng:value" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <text:span text:style-name="Attribute_20_Value">
+           <xsl:value-of select="."/>
+        </text:span>
+    </xsl:template>
+
+    <xsl:template match="rng:empty" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>an empty string</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="rng:ref" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:variable name="name" select="@name"/>
+        <xsl:choose>
+            <xsl:when test="/office:document-content/office:body/office:text/text:p[.=concat($datatype-prefix,$name)]">
+                <xsl:text>a value of type </xsl:text>
+                <xsl:call-template name="print-datatype">
+                    <xsl:with-param name="name" select="@name"/>
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates select="document($xref-schema-file)/rng:grammar/rng:define[@name=$name]/*" mode="individual-value">
+                    <xsl:with-param name="attr-name" select="$attr-name"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+         </xsl:choose>
+    </xsl:template>
+
+    <xsl:template match="rng:data[(@type='double' or @type='decimal') and count(rng:param)=2 and rng:param[@name='minInclusive'] and rng:param[@name='maxInclusive']]" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>a value of type </xsl:text>
+        <xsl:call-template name="print-datatype">
+            <xsl:with-param name="name" select="@type"/>
+            <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:call-template>
+        <xsl:text> in the range [</xsl:text>
+        <text:span text:style-name="Attribute_20_Value">
+            <xsl:value-of select="rng:param[@name='minInclusive']"/>
+        </text:span>
+        <xsl:text>,</xsl:text>
+        <text:span text:style-name="Attribute_20_Value">
+            <xsl:value-of select="rng:param[@name='maxInclusive']"/>
+        </text:span>
+        <xsl:text>]</xsl:text>
+    </xsl:template>
+
+    <xsl:template match="rng:data[@type='decimal' and count(rng:param)=1 and rng:param[@name='minInclusive']='0.0']" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:text>a non negative value of type </xsl:text>
+        <xsl:call-template name="print-datatype">
+            <xsl:with-param name="name" select="@type"/>
+            <xsl:with-param name="attr-name" select="$attr-name"/>
+        </xsl:call-template>
+    </xsl:template>
+
+
+    <xsl:template match="*" mode="individual-value">
+        <xsl:param name="attr-name"/>
+        <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Unsupported individual value: <xsl:value-of select="name(.)"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template name="print-the-values">
+        <xsl:param name="attr-name"/>
+        <xsl:text>The values of the </xsl:text>
+        <text:span text:style-name="Attribute">
+             <xsl:value-of select="$attr-name"/>
+        </text:span>
+        <xsl:text> attribute are </xsl:text>
+    </xsl:template>
+
+    <xsl:template name="print-the-value-is">
+        <xsl:param name="attr-name"/>
+        <xsl:text>The value of the </xsl:text>
+        <text:span text:style-name="Attribute">
+             <xsl:value-of select="$attr-name"/>
+        </text:span>
+        <xsl:text> attribute is </xsl:text>
+    </xsl:template>
+
+    <xsl:template name="print-the-attribute-has">
+        <xsl:param name="attr-name"/>
+        <xsl:text>The </xsl:text>
+        <text:span text:style-name="Attribute">
+             <xsl:value-of select="$attr-name"/>
+        </text:span>
+        <xsl:text> attribute has </xsl:text>
+    </xsl:template>
+
+    <xsl:template name="print-datatype">
+        <xsl:param name="name"/>
+        <xsl:param name="attr-name" select="'[unknown]'"/>
+        <xsl:if test="string-length($name)=0">
+            <xsl:message>*** Attribute <xsl:value-of select="$attr-name"/>: Empty datatype name.</xsl:message>
+        </xsl:if>
+        <text:span text:style-name="Datatype">
+            <xsl:value-of select="$name"/>
+        </text:span>
+        <xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($datatype-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+    </xsl:template>
+
+
+    <xsl:template name="create-elem-parent-elem-list">
+        <xsl:param name="elem-name" select="@name"/>
+        <xsl:variable name="parents" select="ancestor::rng:grammar/rng:element[rng:element[@name=$elem-name]]"/>
+        <xsl:variable name="count" select="count($parents)"/>
+        <xsl:if test="$count > 0">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Parent_20_Element_20_List">
+                <xsl:text>The </xsl:text>
+                <text:span text:style-name="Element">
+                    <xsl:text>&lt;</xsl:text><xsl:value-of select="$elem-name"/><xsl:text>&gt;</xsl:text>
+                </text:span>
+                <xsl:text> element </xsl:text>
+                <xsl:choose>
+                    <xsl:when test="$count = 1">
+                        <xsl:text> is usable within the following element: </xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text> is usable within the following elements: </xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <!-- collect elements -->
+                <xsl:for-each select="$parents">
+                    <xsl:sort select="@name"/>
+                    <xsl:variable name="name" select="@name"/>
+                    <xsl:choose>
+                        <xsl:when test="position() = 1"/>
+                        <xsl:when test="position() = last()">
+                            <xsl:text> and </xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>, </xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                    <text:span text:style-name="Element"><xsl:text>&lt;</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></text:span><xsl:text> </xsl:text><text:reference-ref text:ref-name="{concat($element-prefix,$name)}" text:reference-format="chapter">?</text:reference-ref>
+                </xsl:for-each>
+                <xsl:text>.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template name="create-elem-root-elem-list">
+        <xsl:param name="elem-name" select="@name"/>
+        <xsl:if test="ancestor::rng:grammar/rng:start/rng:element[@name=$elem-name]">
+            <xsl:call-template name="new-line"/>
+            <text:p text:style-name="Parent_20_Element_20_List">
+                <xsl:text>The </xsl:text>
+                <text:span text:style-name="Element">
+                    <xsl:text>&lt;</xsl:text><xsl:value-of select="$elem-name"/><xsl:text>&gt;</xsl:text>
+                </text:span>
+                <xsl:text> element is a root element.</xsl:text>
+            </text:p>
+        </xsl:if>
+    </xsl:template>
+    
+    <xsl:template name="new-line">
+        <xsl:text>
+</xsl:text>
+    </xsl:template>
+    
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/create-flat-schema.xsl b/trunk/xslt-runner/sample_xslt/create-flat-schema.xsl
new file mode 100644
index 0000000..f1471e7
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/create-flat-schema.xsl
@@ -0,0 +1,471 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<!-- This stylesheet creates a "flat" schema from an ODF schema. -->
+<!-- In the resulting schema, all defines have been resolved and -->
+<!-- other simplifications have been made.                       -->
+<!-- The rsulting schema IS NOT equivalent to the original ODF   -->
+<!-- schema, and it IS NOT a valid RNG schema. It can be used    -->
+<!-- only for documentation purposes.                            -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+                xmlns:rng="http://relaxng.org/ns/structure/1.0"
+                xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
+				xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns="http://relaxng.org/ns/structure/1.0" version="1.0">
+    <xsl:output method="xml" indent="yes"/>
+
+    <!-- The paramter 'incl-default-values' specifies whether default -->
+    <!-- value definition should be included into the schema -->
+    <xsl:param name="incl-default-values" select="'true'"/>
+    
+    <!-- The parameter 'incl-types' specifies whether attribute type -->
+    <!-- information shall be included -->
+    <xsl:param name="incl-types" select="'true'"/>
+    
+    <!-- The parameter 'incl-conditions' specifies whether elements -->
+    <!-- like <optional> shall be included as attributes -->
+    <xsl:param name="incl-conditions" select="'true'"/>
+
+    <!-- The parameter 'incl-content-model' specifies whether the -->
+    <!-- full content of elements shall be included in a normalizes fashion -->
+    <xsl:param name="incl-content-model" select="'false'"/>
+
+    <!-- The parameter 'incl-elements' specifies whether child elements -->
+    <!-- information shall be included -->
+    <xsl:param name="incl-elements" select="'true'"/>
+    
+    
+    <xsl:variable name="include-default-values" select="$incl-default-values = 'true'"/>
+    <xsl:variable name="include-types" select="$incl-types = 'true'"/>
+    <xsl:variable name="include-condition-attr" select="$incl-conditions = 'true'"/>
+    <xsl:variable name="include-content-model" select="$incl-content-model = 'true'"/>
+    <xsl:variable name="include-elements" select="$incl-elements = 'true'"/>
+    <xsl:variable name="include-ref-comments" select="false()"/>
+    
+    <!-- ********** -->
+    <!-- ** root ** -->
+    <!-- ********** -->
+    <xsl:template match="/rng:grammar">
+        <rng:grammar
+            xmlns:rng="http://relaxng.org/ns/structure/1.0"
+            xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
+            xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+            xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+            xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
+            xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+            xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+            xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+            xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
+            xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
+            xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+            xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+            xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+            xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+            xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+            xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xlink="http://www.w3.org/1999/xlink"
+            xmlns:math="http://www.w3.org/1998/Math/MathML"
+            xmlns:xforms="http://www.w3.org/2002/xforms"
+            xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+            xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+            xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"
+            xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0"
+            xmlns:grddl="http://www.w3.org/2003/g/data-view#"
+            xmlns:xhtml="http://www.w3.org/1999/xhtml">
+            <xsl:for-each select="rng:start|document(rng:include/@href)/rng:grammar/rng:start">
+                <start>
+                    <xsl:apply-templates mode="collect-content"/>
+                </start>
+            </xsl:for-each>
+            <!-- select all <element> nodes in the file or in included files -->
+            <xsl:for-each select="//rng:element|document(//rng:include/@href)//rng:element">
+                <xsl:choose>
+                    <xsl:when test="@name">
+                        <xsl:variable name="name" select="@name"/>
+                        <xsl:if test="not(preceding::rng:element[@name=$name])">
+                            <xsl:comment>*** &lt;<xsl:value-of select="@name"/>&gt; ***</xsl:comment>
+                            <element name="{@name}">
+                                <!-- collect content -->
+                                <xsl:for-each select="//rng:element[@name=$name]|document(//rng:include/@href)//rng:element[@name=$name]">
+                                    <xsl:apply-templates mode="collect-content"/>
+                                </xsl:for-each>
+                            </element>
+                        </xsl:if>
+                    </xsl:when>
+                    <xsl:when test="rng:choice/rng:name">
+                        <xsl:variable name="element" select="."/>
+                        <xsl:for-each select="rng:choice/rng:name">
+                            <xsl:comment>*** &lt;<xsl:value-of select="."/>&gt; ***</xsl:comment>
+                            <element name="{.}">
+                                <!-- collect content -->
+                                <xsl:apply-templates select="$element/*" 
+                                                     mode="collect-content"/>
+                            </element>
+                        </xsl:for-each>    
+                    </xsl:when>
+                </xsl:choose>
+            </xsl:for-each>
+
+            <xsl:if test="$include-types">
+                <xsl:for-each select="/rng:grammar/rng:define|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define">
+                    <xsl:variable name="name" select="@name"/>
+                    <xsl:if test="//rng:attribute//rng:ref[@name=$name]|document(/rng:grammar/rng:include/@href)//rng:attribute//rng:ref[@name=$name]">
+                        <xsl:if test="not(preceding-sibling::rng:define[@name = $name])">
+                            <xsl:variable name="count" select="count(/rng:grammar/rng:define[@name = $name]|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define[@name = $name])"/>
+                            <define name="{@name}">
+                                <xsl:choose>
+                                    <xsl:when test="$count>1">
+                                        <choice>
+                                            <xsl:apply-templates select="/rng:grammar/rng:define[@name = $name]/*|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define[@name = $name]/*" mode="collect-type"/>
+                                        </choice>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:apply-templates mode="collect-type"/>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </define>
+                        </xsl:if>
+                    </xsl:if>
+                </xsl:for-each>
+            </xsl:if>
+
+        </rng:grammar>
+    </xsl:template>
+    
+    
+    <!-- **************** -->
+    <!-- ** attributes ** -->
+    <!-- **************** -->
+
+    <!-- match <attribute> elements that have a name attribute -->
+    <xsl:template match="rng:attribute[@name]" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <attribute name="{@name}">
+            <xsl:if test="$include-default-values">
+                <xsl:apply-templates select="@a:defaultValue"/>
+            </xsl:if>
+            <xsl:if test="$condition-attr">
+                <xsl:attribute name="condition">
+                    <xsl:value-of select="$condition-attr"/>
+                </xsl:attribute>
+            </xsl:if>
+            <!-- collect attribute type -->
+            <xsl:if test="$include-types">
+                <xsl:apply-templates mode="collect-type"/>
+            </xsl:if>
+        </attribute>
+    </xsl:template>
+    
+    <!-- match <attribute> elements that have a <name> descendent -->
+    <xsl:template match="rng:attribute[rng:choice/rng:name]" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:variable name="attribute" select="."/>
+        <xsl:for-each select="rng:choice/rng:name">
+            <attribute name="{.}">
+                <!-- collect attribute type -->
+                <xsl:if test="$include-default-values">
+                    <xsl:apply-templates select="$attribute/@a:defaultValue"/>
+                </xsl:if>
+                <xsl:if test="$condition-attr">
+                    <xsl:attribute name="condition">
+                        <xsl:value-of select="$condition-attr"/>
+                    </xsl:attribute>
+                </xsl:if>
+                <xsl:if test="$include-types">
+                    <xsl:apply-templates select="$attribute/*" 
+                                         mode="collect-type"/>
+                </xsl:if>
+            </attribute>
+        </xsl:for-each>    
+    </xsl:template>
+
+    <!-- ignore attribute definitions with any name -->
+    <xsl:template match="rng:attribute[rng:anyName]" mode="collect-content"/>
+
+    <!-- match @a:default-value" -->
+    <xsl:template match="@a:defaultValue">
+        <xsl:attribute name="a:defaultValue">
+            <xsl:value-of select="."/>
+        </xsl:attribute>
+    </xsl:template>
+
+    <!-- ************** -->
+    <!-- ** elements ** -->
+    <!-- ************** -->
+
+    <!-- match <element> elements that have a name attribute -->
+    <xsl:template match="rng:element[@name]" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:if test="$include-elements">
+            <element name="{@name}">
+                <xsl:if test="$condition-attr">
+                    <xsl:attribute name="condition">
+                        <xsl:value-of select="$condition-attr"/>
+                    </xsl:attribute>
+                </xsl:if>
+            </element>
+        </xsl:if>
+    </xsl:template>
+    
+    <!-- match <element> elements that have a <name> descendent -->
+    <xsl:template match="rng:element[rng:choice/rng:name]" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:if test="$include-elements">
+            <xsl:for-each select="rng:choice/rng:name">
+                <element name="{.}">
+                    <xsl:if test="$condition-attr">
+                        <xsl:attribute name="condition">
+                            <xsl:value-of select="$condition-attr"/>
+                        </xsl:attribute>
+                    </xsl:if>
+                </element>
+            </xsl:for-each>    
+        </xsl:if>
+    </xsl:template>
+
+    <!-- ignore attribute definitions with any name -->
+    <xsl:template match="rng:element[rng:anyName]" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <element>
+            <xsl:if test="$condition-attr">
+                <xsl:attribute name="condition">
+                    <xsl:value-of select="$condition-attr"/>
+                </xsl:attribute>
+            </xsl:if>
+            <anyName/>
+        </element>
+    </xsl:template>
+
+    <!-- ignore name elements (they are covered by the fore-each loop already) -->
+    <xsl:template match="rng:name" mode="collect-content"/>
+
+    <!-- ignore data elements (they may only occure in elements here) -->
+    <xsl:template match="rng:data" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <data type="{@type}">
+            <xsl:if test="$condition-attr">
+                <xsl:attribute name="condition">
+                    <xsl:value-of select="$condition-attr"/>
+                </xsl:attribute>
+            </xsl:if>
+        </data>
+    </xsl:template>
+    
+    <xsl:template match="rng:text" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <text>
+            <xsl:if test="$condition-attr">
+                <xsl:attribute name="condition">
+                    <xsl:value-of select="$condition-attr"/>
+                </xsl:attribute>
+            </xsl:if>
+        </text>
+    </xsl:template>
+
+    <xsl:template match="rng:empty" mode="collect-content">
+        <xsl:if test="$include-content-model">
+            <empty/>
+        </xsl:if>
+    </xsl:template>
+    
+    <!-- ************* -->
+    <!-- ** control ** -->
+    <!-- ************* -->
+        
+    <!--match <ref> elements -->
+    <xsl:template match="rng:ref" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:if test="$include-ref-comments">
+            <xsl:comment><xsl:value-of select="@name"/></xsl:comment>
+        </xsl:if>
+        <!-- match <define> with same name in the current file and within
+             included files. -->
+        <xsl:variable name="name" select="@name"/>
+        <xsl:choose>
+            <xsl:when test="$include-content-model">
+                <xsl:variable name="combine" select="/rng:grammar/rng:define[@name=$name]/@combine|/rng:grammar/rng:include/rng:define[@name=$name]/@combine|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define[@name=$name]/@combine"></xsl:variable>
+                <xsl:choose>
+                    <xsl:when test="$combine">
+                        <xsl:element name="{$combine}">
+                            <xsl:apply-templates
+                                select="/rng:grammar/rng:define[@name=$name]|/rng:grammar/rng:include/rng:define[@name=$name]|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define[@name=$name]"
+                                mode="collect-content">
+                                <xsl:with-param name="condition-attr" select="$condition-attr"/>
+                            </xsl:apply-templates>
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:apply-templates
+                            select="/rng:grammar/rng:define[@name=$name]|/rng:grammar/rng:include/rng:define[@name=$name]|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define[@name=$name]"
+                            mode="collect-content">
+                            <xsl:with-param name="condition-attr" select="$condition-attr"/>
+                        </xsl:apply-templates>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:when test="@name='boolean'">
+                <!-- Booleans are no XSD datatype, but should not be expanded -->
+                <ref name="boolean">
+                    <xsl:if test="$condition-attr">
+                        <xsl:attribute name="condition">
+                            <xsl:value-of select="$condition-attr"/>
+                        </xsl:attribute>
+                    </xsl:if>
+                </ref>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates
+                    select="/rng:grammar/rng:define[@name=$name]|/rng:grammar/rng:include/rng:define[@name=$name]|document(/rng:grammar/rng:include/@href)/rng:grammar/rng:define[@name=$name]"
+                    mode="collect-content">
+                    <xsl:with-param name="condition-attr" select="$condition-attr"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+        <xsl:if test="$include-ref-comments">
+            <xsl:comment>/<xsl:value-of select="@name"/></xsl:comment>
+        </xsl:if>
+    </xsl:template>
+    
+    <xsl:template match="rng:define" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:variable name="new-condition">
+            <xsl:choose>
+                <xsl:when test="$include-condition-attr and @combine and string-length($condition-attr) > 0">
+                    <xsl:value-of select="concat($condition-attr, '/', @combine)"/>
+                </xsl:when>
+                <xsl:when test="$include-condition-attr and @combine">
+                    <xsl:value-of select="@combine"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="$condition-attr"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:apply-templates  select="*" mode="collect-content">
+            <xsl:with-param name="condition-attr" select="$new-condition"/>
+        </xsl:apply-templates>
+    </xsl:template>
+    
+    <!-- match conditions and lists -->
+    <xsl:template match="rng:interleave|rng:mixed|rng:optional|rng:choice|rng:group|rng:zeroOrMore|rng:oneOrMore" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:variable name="new-condition">
+            <xsl:choose>
+                <xsl:when test="$include-condition-attr and string-length($condition-attr) > 0">
+                    <xsl:value-of select="concat($condition-attr, '/', name(.))"/>
+                </xsl:when>
+                <xsl:when test="$include-condition-attr">
+                    <xsl:value-of select="name(.)"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="$condition-attr"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:choose>
+            <xsl:when test="$include-content-model">
+                <xsl:copy>
+                    <xsl:apply-templates mode="collect-content">
+                        <xsl:with-param name="condition-attr" select="$new-condition"/>
+                    </xsl:apply-templates>
+                </xsl:copy>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates mode="collect-content">
+                    <xsl:with-param name="condition-attr" select="$new-condition"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+	<!-- Turn dc:description into a comment -->
+    <xsl:template match="dc:description" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:comment><xsl:value-of select="."/></xsl:comment>
+    </xsl:template>
+
+    <!-- match all other elements and ignore them -->
+    <xsl:template match="*" mode="collect-content">
+        <xsl:param name="condition-attr"/>
+        <xsl:message>Ignored element &lt;<xsl:value-of select="name(.)"/>&gt;, content: <xsl:value-of select="."/>, parent: <xsl:value-of select="name(..)"/>, grandparent: <xsl:value-of select="name(../..)"/>, define name: <xsl:value-of select="ancestor::rng:define[1]/@name"/>, condition: <xsl:value-of select="$condition-attr"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template match="text()" mode="collect-content">
+        <xsl:if test="string-length(normalize-space(.))>0">
+            <xsl:message>Ignored <xsl:value-of select="."/></xsl:message>
+        </xsl:if>
+    </xsl:template>
+        
+    <!-- ********************* -->
+    <!-- ** attribute types ** -->
+    <!-- ********************* -->
+
+    <!-- match <ref> elements -->
+    <xsl:template match="rng:ref" mode="collect-type">
+        <!-- references are assumed to be type names -->
+        <ref name="{@name}"/>
+    </xsl:template>
+
+    <!-- match <data> elements -->
+    <xsl:template match="rng:data" mode="collect-type">
+        <!-- data types are data types -->
+        <data type="{@type}">
+            <xsl:apply-templates mode="collect-type"/>
+        </data>
+    </xsl:template>
+
+    <!-- ignore name choices -->
+
+    <xsl:template match="rng:choice[rng:name]" mode="collect-type"/>
+
+    <!-- match elements that get copied -->
+    <xsl:template match="rng:choice|rng:list|rng:group|rng:oneOrMore|rng:zeroOrMore|rng:empty|rng:text|rng:optional" mode="collect-type">
+        <xsl:copy><xsl:apply-templates mode="collect-type"/></xsl:copy>
+    </xsl:template>
+
+    <!-- match <value> elements -->
+    <xsl:template match="rng:param" mode="collect-type">
+        <param name="{@name}"><xsl:value-of select="."/></param>
+    </xsl:template>
+
+    <!-- match <value> elements -->
+    <xsl:template match="rng:value" mode="collect-type">
+        <value><xsl:value-of select="."/></value>
+    </xsl:template>
+
+	<!-- Turn dc:description into a comment -->
+    <xsl:template match="dc:description" mode="collect-type">
+        <xsl:param name="condition-attr"/>
+        <xsl:comment><xsl:value-of select="."/></xsl:comment>
+    </xsl:template>
+
+    <!-- match everything else and ignore it -->
+    <xsl:template match="*" mode="collect-type">
+        <xsl:message>Ignored element &lt;<xsl:value-of select="name(.)"/>&gt; while collecting type information, content: <xsl:value-of select="."/>, parent: <xsl:value-of select="name(..)"/>, grandparent: <xsl:value-of select="name(../..)"/>, define name: <xsl:value-of select="ancestor::rng:define[1]/@name"/></xsl:message>
+    </xsl:template>
+
+    <xsl:template match="text()" mode="collect-type"/>
+
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/create-html-img-list.xsl b/trunk/xslt-runner/sample_xslt/create-html-img-list.xsl
new file mode 100644
index 0000000..f0a33ce
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/create-html-img-list.xsl
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<xsl:stylesheet version="1.0" 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xhtml"
+    exclude-result-prefixes="xsl">
+  <xsl:output method="text" encoding="UTF-8"/>
+
+  <xsl:template match="xhtml:html">
+      <xsl:apply-templates select="//xhtml:img"/>
+  </xsl:template>
+
+<!--  <xsl:template match="img[starts-with(@name,'Object')]">-->
+  <xsl:template match="xhtml:img">
+      <xsl:choose>
+          <xsl:when test="starts-with(@src,'./')">
+              <xsl:value-of select="substring(@src,3)"/>
+          </xsl:when>
+          <xsl:otherwise>
+              <xsl:value-of select="@src"/>
+          </xsl:otherwise>
+      </xsl:choose>
+      <xsl:text>
+</xsl:text>
+  </xsl:template>
+
+  <xsl:template match="node()">
+      <xsl:apply-templates select="node()"/>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/dummy.dtd b/trunk/xslt-runner/sample_xslt/dummy.dtd
new file mode 100644
index 0000000..a60d869
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/dummy.dtd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+  Copyright 2009 IBM. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
diff --git a/trunk/xslt-runner/sample_xslt/replace-objects-list.xsl b/trunk/xslt-runner/sample_xslt/replace-objects-list.xsl
new file mode 100644
index 0000000..2c2f20e
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/replace-objects-list.xsl
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+                xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+                exclude-result-prefixes="xsl"
+                version="1.0">
+    <xsl:output method="text"/>
+
+    <xsl:param name="ref-html"/>
+
+    <xsl:template match="office:document-content">
+        <xsl:apply-templates select="//draw:frame[draw:object]"/>
+    </xsl:template>
+
+    <xsl:template match="draw:frame[draw:object]">
+        <xsl:value-of select="document($ref-html)//img[@name=current()/@draw:name]/@src"/>
+        <xsl:text>
+</xsl:text>
+    </xsl:template>
+
+    <!-- default: ignore everything. -->
+    <xsl:template match="@*|node()"/>
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/replace-objects.xsl b/trunk/xslt-runner/sample_xslt/replace-objects.xsl
new file mode 100644
index 0000000..1304af1
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/replace-objects.xsl
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+                xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+                xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+                xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:xhtml="http://www.w3.org/1999/xhtml"
+                exclude-result-prefixes="xhtml xsl"
+                version="1.0">
+    <xsl:output method="xml" indent="no"/>
+
+    <xsl:param name="ref-html"/>
+
+    <xsl:template match="draw:frame[draw:object]">
+        <xsl:copy>
+            <xsl:apply-templates select="@*"/>
+            <xsl:variable name="new-src" select="concat('Pictures/',document($ref-html)//img[@name=current()/@draw:name]/@src)"/>
+            <draw:image xlink:href="{$new-src}" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/>
+            <xsl:apply-templates select="svg:desc"/>
+            <xsl:message>New image for <xsl:value-of select="@draw:name"/>: <xsl:value-of select="$new-src"/></xsl:message>
+        </xsl:copy>
+    </xsl:template>
+
+    <xsl:template match="text:tab[not(ancestor::text:index-body)]">
+        <text:s text:c="4"/>
+    </xsl:template>
+
+    <!-- default: copy everything. -->
+    <xsl:template match="@*|node()">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/sample_xslt/update-toc-rel-paths.xsl b/trunk/xslt-runner/sample_xslt/update-toc-rel-paths.xsl
new file mode 100644
index 0000000..1f0a5fd
--- /dev/null
+++ b/trunk/xslt-runner/sample_xslt/update-toc-rel-paths.xsl
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+
+  Copyright 2011 Oracle and/or its affiliates. All rights reserved.
+
+  Use is subject to license terms.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy
+  of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+  obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+                xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                exclude-result-prefixes="xsl"
+                version="1.0">
+    <xsl:output method="xml" indent="no"/>
+
+<!--    <xsl:param name="state-old" select="'(none)'"/>-->
+    <xsl:param name="state-new" select="'(none)'"/>
+
+    <xsl:variable name="toc-prefix" select="'toc-'"/>
+
+
+
+    <!-- ************************ -->
+    <!-- ** toc anchors (toc-) ** -->
+    <!-- ************************ -->
+    <xsl:template match="text:section[starts-with(@text:name,$toc-prefix)]">
+		<xsl:variable name="part" select="concat('-',substring(@text:name,string-length($toc-prefix)+1))"/>
+		<xsl:variable name="state-old">
+            <xsl:call-template name="get-state">
+                <xsl:with-param name="path" select="substring-before(.//text:a[starts-with(@xlink:href,'../')][1]/@xlink:href,$part)"/>
+            </xsl:call-template>
+		</xsl:variable>
+		<xsl:message>Old state for <xsl:value-of select="$part"/> is <xsl:value-of select="$state-old"/>.</xsl:message>
+		<xsl:copy>
+			<xsl:apply-templates select="@*|node()" mode="in-toc">
+				<xsl:with-param name="state-old" select="$state-old"/>
+			</xsl:apply-templates>
+		</xsl:copy>
+	</xsl:template>
+
+    <xsl:template name="get-state">
+        <xsl:param name="path"/>
+        <xsl:choose>
+            <xsl:when test="contains($path,'-')">
+                <xsl:call-template name="get-state">
+                    <xsl:with-param name="path" select="substring-after($path,'-')"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="concat('-',$path)"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+	<xsl:template match="text:a[starts-with(@xlink:href,'../')]" mode="in-toc">
+		<xsl:param name="state-old"/>
+        <xsl:variable name="new-href">
+	        <xsl:call-template name="remove-rel-path">
+		        <xsl:with-param name="path" select="@xlink:href"/>
+				<xsl:with-param name="state-old" select="$state-old"/>
+            </xsl:call-template>
+        </xsl:variable>
+        <xsl:message>href: <xsl:value-of select="@xlink:href"/> = <xsl:value-of select="$new-href"/></xsl:message>
+        <text:a>
+            <xsl:attribute name="xlink:href"><xsl:value-of select="$new-href"/></xsl:attribute>
+            <xsl:apply-templates select="@*[not(name(.)='xlink:href')]"/>
+            <xsl:apply-templates select="node()"/>
+        </text:a>
+    </xsl:template>
+
+    <!-- default: copy everything. -->
+    <xsl:template match="@*|node()" mode="in-toc">
+		<xsl:param name="state-old"/>
+	    <xsl:copy>
+            <xsl:apply-templates select="@*|node()" mode="in-toc">
+				<xsl:with-param name="state-old" select="$state-old"/>
+			</xsl:apply-templates>
+        </xsl:copy>
+    </xsl:template>
+
+
+    <xsl:template name="remove-rel-path">
+        <xsl:param name="path"/>
+		<xsl:param name="state-old"/>
+        <xsl:choose>
+            <xsl:when test="contains($path,'/')">
+                <xsl:call-template name="remove-rel-path">
+                    <xsl:with-param name="path" select="substring-after($path,'/')"/>
+					<xsl:with-param name="state-old" select="$state-old"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:choose>
+                    <xsl:when test="contains($path,$state-old)">
+                        <xsl:value-of select="concat('../',substring-before($path,$state-old),$state-new,substring-after($path,$state-old))"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="concat('../',$path)"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <!-- default: copy everything. -->
+    <xsl:template match="@*|node()">
+        <xsl:copy>
+            <xsl:apply-templates select="@*|node()"/>
+        </xsl:copy>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/trunk/xslt-runner/schema.properties b/trunk/xslt-runner/schema.properties
new file mode 100644
index 0000000..94e6819
--- /dev/null
+++ b/trunk/xslt-runner/schema.properties
@@ -0,0 +1,38 @@
+########################################################################
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+#
+# Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Use is subject to license terms.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy
+# of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+# obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+########################################################################/
+
+# State of the OpenDocument v1.2 (source) specification
+opendocument.v12.part1.schema.state=-cd05-rev02
+opendocument.v12.part3.schema.state=-cd05-rev02
+opendocument.v12.part1.schema.state.ref=-csd07
+opendocument.v12.part3.schema.state.ref=-csd07
+
+# State if the OpenDocument v1.2 target specification
+opendocument.v12.part0.state.target=-cs01
+opendocument.v12.part1.state.target=-cs01
+opendocument.v12.part2.state.target=-cs01
+opendocument.v12.part3.state.target=-cs01
+
+opendocument.v12.part0.target=$(opendocument.v12.part0.state.target)
+opendocument.v12.part1.target=${opendocument.v12.part1.state.target}-part1
+opendocument.v12.part2.target=${opendocument.v12.part2.state.target}-part2
+opendocument.v12.part3.target=${opendocument.v12.part3.state.target}-part3
\ No newline at end of file
diff --git a/trunk/xslt-runner/schema.user.properties b/trunk/xslt-runner/schema.user.properties
new file mode 100644
index 0000000..a957850
--- /dev/null
+++ b/trunk/xslt-runner/schema.user.properties
@@ -0,0 +1,42 @@
+########################################################################
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+#
+# Copyright 2009, 2010 Oracle and/or its affiliates. All rights reserved.
+#
+# Use is subject to license terms.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy
+# of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+# obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+########################################################################/
+
+# The following properties have to be set either in this file, or in the
+# nbproject/private/private.properties file of the project.
+
+# Directory where the OpenDocument v1.2 schemas are located
+# These properties are used by targets which add or check information
+# in specification documents based on the schema.
+opendocument.v12.part1.schema.dir=
+opendocument.v12.part3.schema.dir=
+
+# OpenDocument v1.2 specification editorial version source document
+# These properties are used by targets which convert editorial versions into
+# product versions.
+opendocument.v12.part0.spec-source=
+opendocument.v12.part1.spec-source=
+opendocument.v12.part2.spec-source=
+opendocument.v12.part3.spec-source=
+
+# Directory where the OpenDocument v1.2 product specification documents are located
+# This property is used by the XHTML creation target.
+opendocument.v12.product.dir=
\ No newline at end of file
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/CommandLineLogger.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/CommandLineLogger.java
new file mode 100644
index 0000000..70071f8
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/CommandLineLogger.java
@@ -0,0 +1,82 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import java.io.PrintStream;
+
+/**
+ * Logger for command line interface
+ */
+public class CommandLineLogger extends Logger
+{
+    private PrintStream m_aOut;
+    private int m_nLevel;
+    
+    /** Creates a new instance of CommandLineLogger
+     *
+     * @param aOut PrintStream for messages
+     */
+    public CommandLineLogger( PrintStream aOut, int nLevel )
+    {
+        m_nLevel = nLevel;
+        m_aOut = aOut;
+    }
+
+    /**
+     * Log a message.
+     * 
+     * @param aPrefix Message prefix
+     * @param aMsg Message text
+     * @param aLocation file, row and column number as text (optional)
+     * @param nLevel the warning level (one of INFO, WARNING or ERROR)
+     */
+    protected void logMessage( String aPrefix, String aMsg, String aLocation, int nLevel )
+    {
+        if( nLevel <= m_nLevel )
+        {
+            StringBuffer aOut = new StringBuffer( aLocation != null ? aLocation : getName() );
+            aOut.append( ": " );
+            aOut.append( aPrefix );
+            aOut.append( ':' );
+            aOut.append( aMsg );
+            m_aOut.println( aOut.toString() );
+        }
+    }
+    
+    /**
+     * Log a message.
+     * 
+     * @param aPrefix Message prefix
+     * @param aMsgWithLocation Message text including location information
+     * @param nLevel the warning level (one of INFO, WARNING or ERROR)
+     */
+    protected void logMessageWithLocation( String aPrefix, String aMsgWithLocation, int nLevel )
+    {
+        StringBuffer aOut = new StringBuffer( aMsgWithLocation );
+        aOut.append( " (" );
+        aOut.append( aPrefix );
+        aOut.append( ')' );
+        m_aOut.println( aOut.toString() );
+    }
+    
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/Logger.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/Logger.java
new file mode 100644
index 0000000..d62e1d5
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/Logger.java
@@ -0,0 +1,185 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import javax.xml.transform.TransformerException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * Base class for logging messages.
+ */
+public abstract class Logger {
+    private static final String ERROR_PREFIX = "Error";
+    private static final String FATAL_PREFIX = "Fatal";
+    private static final String INFO_PREFIX = "Info";
+    private static final String WARNING_PREFIX = "Warning";
+    private String m_aEntryName;
+    private String m_aFileName = "(none)";
+    private boolean m_bError = false;
+
+    /** 
+     * Error log level. 
+     */
+    public static final int ERROR = 0;
+
+    /** 
+     * Warning log level. 
+     */
+    public static final int WARNING = 1;
+    
+    /** 
+     * Information log level. 
+     */
+    public static final int INFO = 2;
+
+    /**
+     * Create a new Logger instance.
+     */
+    protected Logger() 
+    {
+    }
+
+    void setName( String aFileName )
+    {
+        setName( aFileName, null );
+    }
+    
+    void setName( String aFileName, String aEntryName )
+    {
+        m_aFileName = aFileName;
+        m_aEntryName = aEntryName;
+    }
+
+    /**
+     * Get name of the file for which messagea are logged.
+     * 
+     * @return file name
+     */
+    protected String getName() {
+        StringBuffer aName = new StringBuffer(m_aFileName);
+        if (m_aEntryName != null && m_aEntryName.length() > 0) {
+            aName.append('/');
+            aName.append(m_aEntryName);
+        }
+
+        return aName.toString();
+    }
+
+    /** 
+     * Was an error or fatal error logged.
+     * 
+     * @return true if an error was logged.
+     */
+    public boolean hasError() {
+        return m_bError;
+    }
+
+    void logError(String aMsg) {
+        logMessage(ERROR_PREFIX, aMsg, ERROR );
+        m_bError = true;
+    }
+
+    void logError(TransformerException e) {
+        logMessage(ERROR_PREFIX, e, ERROR );
+        m_bError = true;
+    }
+
+    void logError(SAXParseException e) {
+        logMessage(ERROR_PREFIX, e, ERROR );
+        m_bError = true;
+    }
+
+
+    void logFatalError(String aMsg) {
+        logMessage(FATAL_PREFIX, aMsg, ERROR );
+        m_bError = true;
+    }
+
+    void logFatalError(TransformerException e) {
+        logMessage(FATAL_PREFIX, e, ERROR);
+        m_bError = true;
+    }
+
+    void logFatalError(SAXParseException e) {
+        logMessage(FATAL_PREFIX, e, ERROR);
+        m_bError = true;
+    }
+
+    void logInfo(String aMsg) {
+        logMessage(INFO_PREFIX, aMsg, INFO );
+    }
+
+    void logWarning(String aMsg) {
+        logMessage(WARNING_PREFIX, aMsg, WARNING );
+    }
+
+    void logWarning(TransformerException e) {
+        logMessage(WARNING_PREFIX, e, WARNING );
+    }
+
+    void logWarning(SAXParseException e) {
+        logMessage(WARNING_PREFIX, e, WARNING );
+    }
+
+
+    private void logMessage( String aPrefix, TransformerException e, int nLevel )
+    {
+        logMessageWithLocation( aPrefix, e.getMessageAndLocation(), nLevel );
+    }
+
+    private void logMessage( String aPrefix, SAXParseException e, int nLevel )
+    {
+        StringBuffer aLocation = new StringBuffer( e.getSystemId() );
+        aLocation.append(':');
+        aLocation.append(e.getLineNumber());
+        aLocation.append(": ");
+        aLocation.append(e.getColumnNumber());
+        
+        logMessage( aPrefix, e.getMessage(), aLocation.toString(), nLevel );
+    }
+
+    private void logMessage( String aPrefix, String aMsg, int nLevel )
+    {
+        logMessage( aPrefix, aMsg, null, nLevel );
+    }
+    
+    /**
+     * Log a message.
+     * 
+     * @param aPrefix Message prefix
+     * @param aMsg Message text
+     * @param aLocation file, row and column number as text (optional)
+     * @param nLevel the warning level (one of INFO, WARNING or ERROR)
+     */
+    protected abstract void logMessage( String aPrefix, String aMsg, String aLocation, int nLevel );
+    
+    /**
+     * Log a message.
+     * 
+     * @param aPrefix Message prefix
+     * @param aMsgWithLocation Message text including location information
+     * @param nLevel the warning level (one of INFO, WARNING or ERROR)
+     */
+    protected abstract void logMessageWithLocation( String aPrefix, String aMsgWithLocation, int nLevel );
+
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/Main.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/Main.java
new file mode 100644
index 0000000..a6334f8
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/Main.java
@@ -0,0 +1,234 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+/**
+ * This application applies an XSLT style sheet to an ODF file. To run this application from the command line without Ant, try:
+ * java -jar "[path/]odfxsltrunner.jar".
+ */
+public class Main {
+
+    private static final String VERSION="1.1.0";
+
+    /** Creates a new instance of Main */
+    public Main() {
+    }
+    
+    /**
+     * @param aArgs the command line arguments
+     */
+    public static void main(String[] aArgs) {
+        
+        String aStyleSheetName = null;
+        String aInputName = null;
+        String aOutputName = null;
+        String aPath = "content.xml";
+        String aLogFileName = null;
+        String aTransformerFactoryClass = null;
+        int aInputMode = ODFXSLTRunner.INPUT_MODE_PACKAGE;
+        int aOutputMode = ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE;
+        Vector<XSLTParameter> aParams = null;
+        Vector<String> aExtractFileNames = null;
+        int nLogLevel = CommandLineLogger.ERROR;
+        
+        boolean bCommandLineValid = true;
+        List<String> aArgList = Arrays.asList(aArgs);
+        Iterator<String> aArgIter = aArgList.iterator();
+        while( aArgIter.hasNext() && bCommandLineValid )
+        {
+            String aArg = aArgIter.next();
+            if( aArg.equals("-f") )
+            {
+                if( aArgIter.hasNext() )
+                    aTransformerFactoryClass = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-i") )
+            {
+                aInputMode = ODFXSLTRunner.INPUT_MODE_FILE;
+            }
+            else if( aArg.equals("-l") )
+            {
+                if( aArgIter.hasNext() )
+                    aLogFileName = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-o") )
+            {
+                if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE )
+                    aOutputMode = ODFXSLTRunner.OUTPUT_MODE_FILE;
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-p") )
+            {
+                if( aArgIter.hasNext() )
+                    aPath = aArgIter.next();
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-r") )
+            {
+                if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE )
+                    aOutputMode = ODFXSLTRunner.OUTPUT_MODE_REPLACE_INPUT_PACKAGE;
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-t") )
+            {
+                if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE )
+                    aOutputMode = ODFXSLTRunner.OUTPUT_MODE_TEMPLATE_PACKAGE;
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.equals("-v") )
+            {
+                nLogLevel = CommandLineLogger.INFO;
+            }
+            else if( aArg.equals("-x") )
+            {
+                if( aArgIter.hasNext() )
+                {
+                    if( aExtractFileNames == null )
+                        aExtractFileNames = new Vector<String>();
+                    aExtractFileNames.add( aArgIter.next() );
+                }
+                else
+                    bCommandLineValid = false;
+            }
+            else if( aArg.startsWith("-") )
+            {
+                System.out.print(aArg);
+                System.out.println(": unknown option, use '-' for help");
+                bCommandLineValid = false;
+                break;
+            }
+            else if( aStyleSheetName == null )
+            {
+                aStyleSheetName = aArg;
+            }
+            else if( aInputName == null )
+            {
+                aInputName = aArg;
+            }
+            else if( aOutputMode != ODFXSLTRunner.OUTPUT_MODE_REPLACE_INPUT_PACKAGE && aOutputName == null )
+            {
+                aOutputName = aArg;
+            }
+            else if( aArg.indexOf('=') != -1 )
+            {
+                if( aParams == null )
+                    aParams = new Vector<XSLTParameter>();
+                aParams.add(new XSLTCommandLineParameter(aArg) );
+            }
+            else
+            {
+                bCommandLineValid = false;
+                break;
+            }
+        }
+        
+        if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE &&
+            aOutputName == null )
+            aOutputMode = ODFXSLTRunner.OUTPUT_MODE_STDOUT;
+
+        // check usage
+        bCommandLineValid = aInputName != null && aStyleSheetName != null;
+        bCommandLineValid = bCommandLineValid &&
+                            !(aOutputMode == ODFXSLTRunner.OUTPUT_MODE_REPLACE_INPUT_PACKAGE || aOutputMode == ODFXSLTRunner.OUTPUT_MODE_STDOUT) == (aOutputName != null);
+        
+        // print help
+        if( !bCommandLineValid )
+        {
+            printUsage();
+            return;
+        }
+        
+        PrintStream aLogStream = null;
+        if( aLogFileName != null )
+        {
+            try
+            {
+                aLogStream = new PrintStream( aLogFileName );
+            }
+            catch( FileNotFoundException e )
+            {
+                System.err.println(e.getMessage());
+            }
+        }
+
+        boolean bError = false;
+        try
+        {
+            ODFXSLTRunner aRunner = new ODFXSLTRunner();
+            Logger aLogger = new CommandLineLogger( aLogStream!=null ? aLogStream : System.err, nLogLevel );
+            bError = aRunner.runXSLT( aStyleSheetName, aParams, aInputName, aInputMode, aOutputName, aOutputMode, aPath, aTransformerFactoryClass, aExtractFileNames, aLogger  );
+        }
+        catch( Exception e )
+        {
+            System.err.println(e.getMessage());
+        }
+//        if( bError )
+//            System.err.println("transformation failed");
+
+        if( aLogStream != null )
+            aLogStream.close();
+    }
+    
+    private static void printUsage()
+    {
+        System.out.print("odfxsltrunner v");
+        System.out.println( VERSION );
+        System.out.println();
+        System.out.println( "usage: odfxsltrunner <style sheet> [-v] [-f <factory>] [-p <path in package>] [-l log file] [-t] <input package> <output package> {<param>=<value>}");
+        System.out.println( "       odfxsltrunner <style sheet> [-v] [-f <factory>] [-p <path in package>] [-l log file] -r <package> {<param>=<value>}");
+        System.out.println( "       odfxsltrunner <style sheet> [-v] [-f <factory>] {-x <export path>} [-p <path in package>] [-l log file] -o <input package> <output file> {<param>=<value>}");
+        System.out.println( "       odfxsltrunner <style sheet> [-v] [-f <factory>] [-p <path in package>] [-l log file] -i <input file> <output package> {<param>=<value>}");
+        System.out.println();
+        System.out.println( "If no option except -p is specified, the transformation <style sheet> is applied to the file <path in package> contained in the ODF  package <input package>, <path in package> is replaced with the result of the transformation, and the full package is stored as <output package>." );
+        System.out.println();
+        System.out.println( "-t: Store result of transformation in the file <path in package> of existing an existing ODF package <output package>" );
+        System.out.println( "-r: Don't store result as a new ODF package but replace input ODF package <package>" );
+        System.out.println( "-i: Input file <input file> is a plain XML file" );
+        System.out.println( "-o: Store result of tranformation as plain XML file in <output file>" );
+        System.out.println();
+        System.out.println( "-l: Write messages into file <log file> instead of stderr" );
+        System.out.println( "-p: Apply style sheet to <path in package>; default is content.xml" );
+        System.out.println( "-f: Use XSLT Transformer factory <factory>" );
+        System.out.println();
+        System.out.println( "-x: Extract specified file or directory <export path> from ODF package <input package> to the directory of the <output file>; this option may be specified multiple times" );
+        System.out.println( "-v: Verbose output" );
+        System.out.println();
+        System.out.println( "<param>=<value>: Specifies an parameter/value pair that is passed to the XSL transformation; multiple paramater/vlaue pairs may be specified" );
+    }
+
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFEntityResolver.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFEntityResolver.java
new file mode 100644
index 0000000..4f85970
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFEntityResolver.java
@@ -0,0 +1,48 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import java.io.IOException;
+import java.io.StringReader;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public class ODFEntityResolver implements EntityResolver {
+
+    private Logger m_aLogger;
+
+    public ODFEntityResolver(Logger aLogger) {
+        this.m_aLogger = aLogger;
+    }
+
+
+
+    public InputSource resolveEntity(String aPublicId, String aSystemId) throws SAXException, IOException
+    {
+        // ignore all external entities
+        m_aLogger.logInfo("Ignoring external entity: " + aSystemId );
+        return new InputSource(new StringReader(""));
+    }
+
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFURIResolver.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFURIResolver.java
new file mode 100644
index 0000000..09bd4d7
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFURIResolver.java
@@ -0,0 +1,142 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.stream.StreamSource;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+
+class ODFURIResolver implements URIResolver
+{
+    private Logger m_aLogger;
+    private String m_aPackageBase;
+    private String m_aFileEntryPath;
+    private OdfPackage m_aPackage;
+
+
+    /** Creates a new instance of ODFURIResolver
+     *
+     * @param aPackage the package in which the to be resolved URIs are included
+     * @param aPackageBase the package base URI
+     * @param aFileEntryPath the path of the file within the package in which the to be resolved URIs are included
+     * @param aLogger the logger for error messages
+     */
+    public ODFURIResolver( OdfPackage aPackage, String aPackageBase, String aFileEntryPath, Logger aLogger )
+    {
+        m_aPackage = aPackage;
+        m_aPackageBase = aPackageBase;
+        m_aFileEntryPath = aFileEntryPath;
+        m_aLogger = aLogger;
+    }
+
+    /** resolve an URI
+     *
+     * @param aHRef the URI to be resolved
+     * @param aBase the base URI that is provied by the XSLT transformation
+     */
+    public Source resolve(String aHRef, String aBase) throws TransformerException
+    {
+        if( aBase.startsWith(m_aPackageBase) &&
+            !aHRef.contains(":") && !aHRef.startsWith("/") )
+        {
+            if( aHRef.length()==0)
+            {
+                try
+                {
+                    return new StreamSource(m_aPackage.getInputStream(m_aFileEntryPath), m_aPackageBase + '/' + m_aFileEntryPath );
+                }
+                catch (Exception ex)
+                {
+                    m_aLogger.logError(ex.getMessage());
+                    return null;
+                }
+            }
+
+            StringBuffer aHRefBuffer = new StringBuffer( aHRef );
+            StringBuffer aFileEntryBuffer = new StringBuffer();
+            if( m_aFileEntryPath.contains("/") )
+                aFileEntryBuffer.append(m_aFileEntryPath.substring(0, m_aFileEntryPath.lastIndexOf('/')+1));
+
+            do
+            {
+                if( aHRefBuffer.substring(0, 2).equals("./") )
+                {
+                    aHRefBuffer.delete(0, 2);
+                }
+                else if( aHRefBuffer.toString().equals(".") || aHRefBuffer.toString().equals("..")  )
+                {
+                    m_aLogger.logError("URIs resolving to directories cannot be resolved: " + aHRef );
+                    return null;
+                }
+                else if( aHRefBuffer.substring(0, 3).equals("../") )
+                {
+                    aFileEntryBuffer.delete(0, 3);
+                    if( aFileEntryBuffer.length()==0 )
+                    {
+                        aHRefBuffer.insert(0, "./");
+                        try
+                        {
+                            URI aURI;
+                            aURI = new URI(aBase);
+                            aURI.resolve(aHRefBuffer.toString());
+                            m_aLogger.logInfo( "Resolving " +  aHRef + " to " + aURI.toString() );
+                            return new StreamSource( aURI.toString() );
+                        }
+                        catch (URISyntaxException ex)
+                        {
+                            m_aLogger.logError(ex.getMessage());
+                            return null;
+                        }
+                    }
+                    else
+                    {
+                        aFileEntryBuffer.delete(0, aFileEntryBuffer.indexOf("/"+1));
+                    }
+                }
+                else
+                {
+                    aHRefBuffer.insert(0, aFileEntryBuffer.toString());
+                    try
+                    {
+                        String aFileEntryPath = aHRefBuffer.toString();
+                        m_aLogger.logInfo( "Resolving " +  aHRef + " to package file entry " + aFileEntryPath );
+                        return new StreamSource(m_aPackage.getInputStream(aFileEntryPath), m_aPackageBase + '/' + aFileEntryPath);
+                    }
+                    catch (Exception ex)
+                    {
+                        m_aLogger.logError(ex.getMessage());
+                        return null;
+                    }
+                }
+            }
+            while( true );
+        }
+
+        return null;
+    }
+
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFXSLTRunner.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFXSLTRunner.java
new file mode 100644
index 0000000..45d48d0
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/ODFXSLTRunner.java
@@ -0,0 +1,431 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import org.odftoolkit.odfdom.pkg.OdfPackage;
+import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * Class for applying style sheets to ODF documents.
+ */
+public class ODFXSLTRunner {
+
+    /**
+     * Input file is a plain XML file.
+     */
+    public static final int INPUT_MODE_FILE = 0;
+    
+    /**
+     * Input file is an ODF package. The style sheet is applied to the
+     * specified sub file.
+     */
+    public static final int INPUT_MODE_PACKAGE = 1;
+    
+    /**
+     * Output file is a plain XML or text file.
+     */
+    public static final int OUTPUT_MODE_FILE = 0;
+    
+    /**
+     * Output is stdout.
+     */
+    public static final int OUTPUT_MODE_STDOUT = 1;
+    
+    /**
+     * The transformation replaces the specified path within
+     * the input file.
+     */
+    public static final int OUTPUT_MODE_REPLACE_INPUT_PACKAGE = 2;
+    
+    /**
+     * The input package is copied and the result of the transformation
+     * is stored in the specified path within the copied package.
+     */
+    public static final int OUTPUT_MODE_COPY_INPUT_PACKAGE = 3;
+    
+    /** 
+     * The result of the transformation is stored in the specified path within
+     * the output package.
+     */
+    public static final int OUTPUT_MODE_TEMPLATE_PACKAGE = 4;
+
+    private static final int FILE_COPY_BUFFER_SIZE = 4096;
+
+    /**
+     * Create new instance of ODFXSLTRunner.
+     */
+    public ODFXSLTRunner()
+    {
+    }
+    
+    /**
+     * Apply a style sheeet.
+     * 
+     * @param aStyleSheet Path of the style sheet
+     * @param aParams Parameters that are passed to the XSLT processor
+     * @param aInputFile Path of the input file
+     * @param aInputMode Input mode
+     * @param aOutputFile Path of the output file
+     * @param aOutputMode Output mode
+     * @param aTransformerFactoryClassName XSLT transformer factory to use
+     * @param aExtractFileNames A list of files or directory that shell be extracted from the package
+     * @param aPathInPackage Path within the package. Default is "content.xml"
+     * @param aLogger Logger object
+     * 
+     * @return true if an error occured.
+     */
+    public boolean runXSLT( String aStyleSheet, List<XSLTParameter> aParams,
+                     String aInputFile, int aInputMode,
+                     String aOutputFile, int aOutputMode,
+                     String aPathInPackage,
+                     String aTransformerFactoryClassName, 
+                     List<String> aExtractFileNames,
+                     Logger aLogger )
+    {
+        return runXSLT( new File( aStyleSheet ), aParams,
+                        new File( aInputFile), aInputMode,
+                        aOutputFile != null ? new File(aOutputFile) : null, aOutputMode,
+                        aPathInPackage, aTransformerFactoryClassName,
+                        aExtractFileNames, aLogger );
+    }
+    
+    
+    /**
+     * Apply a style sheeet.
+     * 
+     * @param aStyleSheetFile Style sheet
+     * @param aParams Parameters that are passed to the XSLT processor
+     * @param aInputFile Input file
+     * @param aInputMode Input mode
+     * @param aOutputFile Output file
+     * @param aOutputMode Output mode
+     * @param aPathInPackage Path within the package. Default is "content.xml"
+     * @param aTransformerFactoryClassName XSLT transformer factory to use
+     * @param aExtractFileNames A list of files or directory that shell be extracted from the package
+     * @param aLogger Logger object
+     *
+     * @return true if an error occured.
+     */
+    public boolean runXSLT( File aStyleSheetFile, List<XSLTParameter> aParams,
+                     File aInputFile, int aInputMode,
+                     File aOutputFile, int aOutputMode,
+                     String aPathInPackage,
+                     String aTransformerFactoryClassName, 
+                     List<String> aExtractFileNames,
+                     Logger aLogger )
+    {
+        boolean bError = false;
+        URIResolver aURIResolver = null;
+
+        InputSource aInputSource = null;
+        OdfPackage aInputPkg = null;
+        String aMediaType ="text/xml";
+        aLogger.setName( aInputFile.getAbsolutePath() );
+        try
+        {
+            if( INPUT_MODE_FILE == aInputMode )
+            {
+                aInputSource = new InputSource( new FileInputStream(aInputFile) );
+            }
+            else
+            {
+                aInputPkg = OdfPackage.loadPackage( aInputFile );
+                aLogger.setName( aInputFile.getAbsolutePath(), aPathInPackage );
+                aInputSource = new InputSource( aInputPkg.getInputStream(aPathInPackage) );
+                aInputSource.setSystemId( aInputFile.toURI().toString() + '/' + aPathInPackage );
+                OdfFileEntry aFileEntry =  aInputPkg.getFileEntry(aPathInPackage);
+                if( aFileEntry != null )
+                    aMediaType = aFileEntry.getMediaTypeString();
+                aURIResolver =
+                    new ODFURIResolver( aInputPkg, aInputFile.toURI().toString(), aPathInPackage, aLogger );
+            }
+        }
+        catch( Exception e )
+        {
+            aLogger.logFatalError(e.getMessage());
+            return true;
+        }
+        String aInputName = aLogger.getName();
+
+        Result aOutputResult = null;
+        OdfPackage aOutputPkg = null;
+        OutputStream aOutputStream = null;
+        aLogger.setName( aOutputFile != null ? aOutputFile.getAbsolutePath() : "(none)" );
+        boolean bMkOutputDirs = false;
+        try
+        {
+            switch( aOutputMode )
+            {
+                case OUTPUT_MODE_FILE:
+                    bMkOutputDirs = true;
+                    aOutputResult = new StreamResult( aOutputFile );
+                    break;
+                case OUTPUT_MODE_STDOUT:
+                    aOutputResult = new StreamResult( System.out );
+                    break;
+                case OUTPUT_MODE_REPLACE_INPUT_PACKAGE:
+                    aOutputPkg = aInputPkg;
+                    aOutputFile = aInputFile;
+                    break;
+                case OUTPUT_MODE_COPY_INPUT_PACKAGE:
+                    bMkOutputDirs = true;
+                    aOutputPkg = aInputPkg;
+                    break;
+                case OUTPUT_MODE_TEMPLATE_PACKAGE:
+                    aOutputPkg = OdfPackage.loadPackage( aOutputFile );
+                    break;
+            }
+            if( aOutputResult == null )
+            {
+                aLogger.setName( aOutputFile.getAbsolutePath(), aPathInPackage );                
+                aOutputStream = 
+                    aOutputPkg.insertOutputStream(aPathInPackage, aMediaType );
+                aOutputResult = new StreamResult( aOutputStream );
+            }
+        }
+        catch( Exception e )
+        {
+            aLogger.logFatalError(e.getMessage());
+            return true;
+        }
+
+        if( bMkOutputDirs )
+        {
+            File aOutputDir = aOutputFile.getParentFile();
+            if( aOutputDir != null )
+                aOutputDir.mkdirs();
+        }
+
+        String aOutputName = aLogger.getName();
+
+        aLogger.setName( aStyleSheetFile.getAbsolutePath() );
+        aLogger.logInfo( "Applying stylesheet to '" + aInputName + "'");
+        bError = runXSLT( aStyleSheetFile, aParams, aInputSource, aOutputResult, 
+                          aTransformerFactoryClassName, aURIResolver, aLogger );
+        if( bError )
+            return true;
+        
+        aLogger.setName( aOutputFile != null ? aOutputFile.getAbsolutePath() : "(none)" );
+        try
+        {
+            aLogger.logInfo( "Storing transformation result to '" + aOutputName + "'");
+            if( !bError && aOutputStream != null )
+                aOutputStream.close();
+            if( !bError && aOutputPkg != null )
+                aOutputPkg.save(aOutputFile);
+            if( aOutputMode == OUTPUT_MODE_FILE && aExtractFileNames != null && aInputPkg != null )
+            {
+                File aTargetDir = aOutputFile.getParentFile();
+                extractFiles( aInputPkg, aTargetDir, aExtractFileNames, aLogger );
+            }
+        }
+        catch( Exception e )
+        {
+            aLogger.logFatalError(e.getMessage());
+            return true;
+        }
+        
+        return false;
+    }
+    
+    
+    private boolean runXSLT( File aStyleSheetFile, 
+                     List<XSLTParameter> aParams,
+                     InputSource aInputInputSource, Result aOutputTarget,
+                     String aTransformerFactoryClassName,
+                     URIResolver aURIResolver,
+                     Logger aLogger )
+    {
+        InputStream aStyleSheetInputStream = null;
+        try
+        {
+            aStyleSheetInputStream = new FileInputStream(aStyleSheetFile);
+        }
+        catch( FileNotFoundException e )
+        {
+            aLogger.logFatalError(e.getMessage());
+            return true;
+        }
+
+        InputSource aStyleSheetInputSource = new InputSource(aStyleSheetInputStream);
+        aStyleSheetInputSource.setSystemId(aStyleSheetFile.getAbsolutePath());
+        
+        XMLReader aStyleSheetXMLReader = null;
+        XMLReader aInputXMLReader = null;
+        try
+        {
+            aStyleSheetXMLReader = XMLReaderFactory.createXMLReader();
+            aInputXMLReader = XMLReaderFactory.createXMLReader();
+        }
+        catch( SAXException e )
+        {
+            aLogger.logFatalError(e.getMessage());
+            return true;            
+        }
+        
+        aStyleSheetXMLReader.setErrorHandler(new SAXErrorHandler(aLogger));
+        aInputXMLReader.setErrorHandler(new SAXErrorHandler(aLogger));
+        aInputXMLReader.setEntityResolver(new ODFEntityResolver(aLogger));
+        
+        Source aStyleSheetSource = new SAXSource( aStyleSheetXMLReader, aStyleSheetInputSource );
+        Source aInputSource = new SAXSource( aInputXMLReader, aInputInputSource );
+
+        if( aTransformerFactoryClassName!=null )
+            aLogger.logInfo( "Requesting transformer factory class: " + aTransformerFactoryClassName );
+		TransformerFactory aFactory = null;
+		if(aTransformerFactoryClassName==null)
+		{
+			aFactory = TransformerFactory.newInstance();
+		}
+		else
+		{
+		  try
+		  {
+			ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            if (cl == null)
+                cl = ClassLoader.getSystemClassLoader();
+            Class classInstance = cl.loadClass(aTransformerFactoryClassName);
+			aFactory = (TransformerFactory)classInstance.newInstance();
+		  }
+		  catch( ClassNotFoundException ce )
+          {
+            aLogger.logFatalError(ce.getMessage());
+            return true;            
+          }
+		  catch( InstantiationException ie )
+          {
+            aLogger.logFatalError(ie.getMessage());
+            return true;            
+          }
+		  catch( IllegalAccessException ile )
+          {
+            aLogger.logFatalError(ile.getMessage());
+            return true;            
+          }
+		}
+        ErrorListener aErrorListener = new TransformerErrorListener( aLogger );
+        aLogger.logInfo( "Using transformer factory class: " + aFactory.getClass().getName() );
+        aFactory.setErrorListener(aErrorListener);
+        
+        try
+        {
+            Transformer aTransformer = aFactory.newTransformer(aStyleSheetSource);
+            
+            if( aParams != null )
+            {
+                Iterator<XSLTParameter> aIter = aParams.iterator();
+                while( aIter.hasNext() )
+                {
+                    XSLTParameter aParam = aIter.next();
+                    aTransformer.setParameter(aParam.getName(), aParam.getValue());
+                    aLogger.logInfo("Using parameter: "+aParam.getName()+"="+aParam.getValue());
+                }
+            }
+            aTransformer.setErrorListener(aErrorListener);
+            if( aURIResolver != null )
+                aTransformer.setURIResolver(aURIResolver);
+            aTransformer.transform(aInputSource, aOutputTarget);
+        }
+        catch( TransformerException e )
+        {
+            aLogger.logFatalError(e);
+            return true;
+        }
+
+        return false;
+    }
+
+    private boolean extractFiles( OdfPackage aInputPkg,
+                                     File aTargetDir,
+                                     List<String> aExtractFileNames,
+                                     Logger aLogger )
+    {
+        Set<String> aInputPkgEntries = aInputPkg.getFilePaths();
+
+        Iterator<String> aInputPkgEntryIter = aInputPkgEntries.iterator();
+        while( aInputPkgEntryIter.hasNext() )
+        {
+            String aInputFileName = aInputPkgEntryIter.next();
+
+            Iterator<String> aExtractFileNameIter = aExtractFileNames.iterator();
+            while( aExtractFileNameIter.hasNext() )
+            {
+                String aExtractFileName = aExtractFileNameIter.next();
+                if( !aInputFileName.endsWith("/") &&
+                    (aInputFileName.equals(aExtractFileName) ||
+                    (aExtractFileName.endsWith("/") ? aInputFileName.startsWith(aExtractFileName)
+                                                   : aInputFileName.startsWith(aExtractFileName+"/")) ) )
+                {
+                    try
+                    {
+                        File aTargetFile = new File( aTargetDir, aInputFileName );
+                        File aTargetFileDir = aTargetFile.getParentFile();
+                        if( aTargetFileDir != null )
+                            aTargetFileDir.mkdirs();
+
+                        aLogger.logInfo( "Extracting file " +  aInputFileName + " to " + aTargetFile.getAbsolutePath() );
+                        InputStream aInputStream = aInputPkg.getInputStream(aInputFileName);
+                        OutputStream aTargetStream = new FileOutputStream( aTargetFile );
+                        byte[] aBuffer = new byte[FILE_COPY_BUFFER_SIZE];
+                        int n = 0;
+                        while ((n = aInputStream.read(aBuffer, 0, FILE_COPY_BUFFER_SIZE)) > -1)
+                        {
+                            aTargetStream.write(aBuffer, 0, n);
+                        }
+                        aTargetStream.close();
+                        aInputStream.close();
+                    }
+                    catch(java.lang.Exception e)
+                    {
+                        aLogger.logError(e.getMessage());
+                    }
+                    break;
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/SAXErrorHandler.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/SAXErrorHandler.java
new file mode 100644
index 0000000..0bc7bf6
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/SAXErrorHandler.java
@@ -0,0 +1,54 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+/**
+ * This class forwards error reports from the XSLT processor to the
+ * logger.
+ */
+class SAXErrorHandler implements ErrorHandler {
+    
+    private Logger m_aLogger;
+
+    /** Creates a new instance of TransforemerErrorListener */
+    SAXErrorHandler(Logger aLogger ) {
+        m_aLogger = aLogger;
+    }
+    
+    public void warning(SAXParseException e) throws SAXException {
+        m_aLogger.logWarning( e );
+    }
+
+    public void error(SAXParseException e) throws SAXException {
+        m_aLogger.logError( e );
+    }
+
+    public void fatalError(SAXParseException e) throws SAXException {
+        m_aLogger.logFatalError(  e );
+    }
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/TransformerErrorListener.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/TransformerErrorListener.java
new file mode 100644
index 0000000..ea9e360
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/TransformerErrorListener.java
@@ -0,0 +1,55 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+import javax.xml.transform.TransformerException;
+
+/**
+ * This class forwards error reports from the XSLT processor to the
+ * logger.
+ */
+class TransformerErrorListener implements javax.xml.transform.ErrorListener {
+    
+    private Logger m_aLogger;
+
+    /** Creates a new instance of TransforemerErrorListener */
+    TransformerErrorListener(Logger aLogger ) {
+        m_aLogger = aLogger;
+    }
+    
+    public void warning(TransformerException e) throws TransformerException {
+        m_aLogger.logWarning(  e );
+    }
+
+    public void fatalError(TransformerException e) throws TransformerException {
+        fatalErrorNoException( e );
+    }
+
+    public void error(TransformerException e) throws TransformerException {
+        m_aLogger.logError( e );
+    }
+
+    public void fatalErrorNoException(TransformerException e) {
+        m_aLogger.logFatalError(  e );
+    }    
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/XSLTCommandLineParameter.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/XSLTCommandLineParameter.java
new file mode 100644
index 0000000..f39e60b
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/XSLTCommandLineParameter.java
@@ -0,0 +1,57 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+class XSLTCommandLineParameter implements XSLTParameter
+{
+    private String m_aName;
+    private String m_aValue;
+
+    XSLTCommandLineParameter( String aCmdLineParam )
+    {
+        String aParam = aCmdLineParam;
+        if( aParam.startsWith("\"") && aParam.endsWith("\""))
+            aParam = aCmdLineParam.substring(1, aCmdLineParam.length()-1);
+        int nIndex = aParam.indexOf( '=' );
+        if( nIndex != -1 )
+        {
+            m_aName = aParam.substring(0, nIndex );
+            m_aValue = aParam.substring(nIndex+1);
+        }
+        else
+        {
+            m_aName = aParam;
+            m_aValue = new String();
+        }
+    }
+
+    public String getName()
+    {
+        return m_aName;
+    }
+
+    public String getValue()
+    {
+        return m_aValue;
+    }
+}
diff --git a/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/XSLTParameter.java b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/XSLTParameter.java
new file mode 100644
index 0000000..0d6400c
--- /dev/null
+++ b/trunk/xslt-runner/src/main/java/org/odftoolkit/odfxsltrunner/XSLTParameter.java
@@ -0,0 +1,44 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfxsltrunner;
+
+/**
+ * Interface for XSLT parameters
+ */
+public interface XSLTParameter {
+
+    /** 
+     * Get parameter name.
+     * 
+     * @return parameter name.
+     */
+    String getName();
+
+    /**
+     * Get parameter value.
+     * 
+     * @return parameter value.
+     */
+    String getValue();
+
+}
